diff --git a/code/modules/newscaster/_news.dm b/code/modules/newscaster/_news.dm
new file mode 100644
index 0000000000..6c6f10fdcc
--- /dev/null
+++ b/code/modules/newscaster/_news.dm
@@ -0,0 +1,2 @@
+/datum/news
+ var/author = ""
diff --git a/code/modules/newscaster/feed_channel.dm b/code/modules/newscaster/feed_channel.dm
index 8bd639b3dc..278c9c7ad1 100644
--- a/code/modules/newscaster/feed_channel.dm
+++ b/code/modules/newscaster/feed_channel.dm
@@ -2,7 +2,6 @@
var/channel_name = ""
var/list/datum/news/feed_message/messages = list()
var/locked = FALSE
- var/author = ""
var/censored = 0
var/list/authorCensorTime = list()
var/list/DclassCensorTime = list()
diff --git a/code/modules/newscaster/feed_comment.dm b/code/modules/newscaster/feed_comment.dm
index 9eba2d73dc..ff5ebac028 100644
--- a/code/modules/newscaster/feed_comment.dm
+++ b/code/modules/newscaster/feed_comment.dm
@@ -1,4 +1,3 @@
/datum/news/feed_comment
- var/author = ""
var/body = ""
var/time_stamp = ""
diff --git a/code/modules/newscaster/feed_message.dm b/code/modules/newscaster/feed_message.dm
index f9c3da554e..573b3f772d 100644
--- a/code/modules/newscaster/feed_message.dm
+++ b/code/modules/newscaster/feed_message.dm
@@ -1,5 +1,4 @@
/datum/news/feed_message
- var/author =""
var/body =""
var/list/authorCensorTime = list()
var/list/bodyCensorTime = list()
diff --git a/code/modules/newscaster/ghostread.dm b/code/modules/newscaster/ghostread.dm
new file mode 100644
index 0000000000..5cf36e1164
--- /dev/null
+++ b/code/modules/newscaster/ghostread.dm
@@ -0,0 +1,49 @@
+/mob/dead/observer/verb/read_news()
+ var/datum/browser/popup = new(user, "ghost_news_list", 450, 600)
+ popup.set_content(render_news_channel_list())
+ popup.open()
+
+/mob/dead/observer/Topic(href, href_list)
+ . = ..()
+ if(href_list["show_news_channel"])
+ var/datum/D = locate(href_list["show_news_channel"])
+ if(istype(D, /datum/news/feed_channel)) //safety
+ render_news_channel(D)
+
+/mob/dead/observer/proc/render_news_channel_list()
+ var/datum/news_network = GLOB.news_network()
+ var/list/content = list()
+ for(var/i in news_network.network_channels)
+ var/datum/news/feed_channel/FC = i
+ content += "[FC.name] ([length(FC.messages)] messages)[FC.locked? " (LOCKED)":""][FC.censored? " (CENSORED)":""][FC.is_admin_channel? " (ADMIN)":""]"
+ return content.Join("
")
+
+/mob/dead/observer/proc/render_news_channel(datum/news/feed_channel/FC)
+ var/list/content = list()
+ content += "[viewing_channel.channel_name]: \[created by: [viewing_channel.returnAuthor(-1)]\]
"
+ if(FC.censored)
+ content += "ATTENTION: This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice.
"
+ content += "No further feed story additions are allowed while the D-Notice is in effect.
"
+ if(!length(FC.messages))
+ content += "This channel is empty.
"
+ for(var/i in FC.messages)
+ var/datum/feed_message/FM = i
+ content += "
+ content += "-[FM.returnBody(-1)]
"
+ if(FM.img)
+ src << browse_rsc(FM.img, "tmp_photo[i].png")
+ content += "
"
+ if(FC.caption)
+ content += "[FM.caption]
"
+ content += "
"
+ content += "\[Story by [FM.returnAuthor(-1)] \] - ([FM.time_stamp])
"
+ content += "[FM.comments.len] comment[FM.comments.len > 1 ? "s" : ""]
"
+ for(var/i in FM.comments)
+ var/datum/news/feed_comment/FC = i
+ content += "[FC.body]
[FC.author] [FC.time_stamp]
"
+ if(FM.locked)
+ content += "Comments locked
"
+ var/datum/browser/popup = new(src, "ghost_news_channel", 450, 900)
+ popup.set_content(content.Join(""))
+ popup.open()
+
diff --git a/code/modules/newscaster/news_datum.dm b/code/modules/newscaster/news_datum.dm
deleted file mode 100644
index 5fcf3b4551..0000000000
--- a/code/modules/newscaster/news_datum.dm
+++ /dev/null
@@ -1 +0,0 @@
-/datum/news
diff --git a/code/modules/newscaster/feed_network.dm b/code/modules/newscaster/news_network.dm
similarity index 100%
rename from code/modules/newscaster/feed_network.dm
rename to code/modules/newscaster/news_network.dm
diff --git a/code/modules/newscaster/newscaster.dm b/code/modules/newscaster/newscaster_machine.dm
similarity index 81%
rename from code/modules/newscaster/newscaster.dm
rename to code/modules/newscaster/newscaster_machine.dm
index 88379efcf8..6328087491 100644
--- a/code/modules/newscaster/newscaster.dm
+++ b/code/modules/newscaster/newscaster_machine.dm
@@ -672,7 +672,6 @@ GLOBAL_LIST_EMPTY(allCasters)
NEWSPAPER.creationTime = GLOB.news_network.lastAction
paper_remaining--
-
/obj/machinery/newscaster/proc/remove_alert()
alert = FALSE
update_icon()
@@ -687,178 +686,3 @@ GLOBAL_LIST_EMPTY(allCasters)
else
say("Attention! Wanted issue distributed!")
playsound(loc, 'sound/machines/warning-buzzer.ogg', 75, 1)
-
-
-/obj/item/newspaper
- name = "newspaper"
- desc = "An issue of The Griffon, the newspaper circulating aboard Nanotrasen Space Stations."
- icon = 'icons/obj/bureaucracy.dmi'
- icon_state = "newspaper"
- lefthand_file = 'icons/mob/inhands/misc/books_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/misc/books_righthand.dmi'
- w_class = WEIGHT_CLASS_SMALL
- attack_verb = list("bapped")
- var/screen = 0
- var/pages = 0
- var/curr_page = 0
- var/list/datum/news/feed_channel/news_content = list()
- var/scribble=""
- var/scribble_page = null
- var/wantedAuthor
- var/wantedCriminal
- var/wantedBody
- var/wantedPhoto
- var/creationTime
-
-/obj/item/newspaper/suicide_act(mob/user)
- user.visible_message("[user] is focusing intently on [src]! It looks like [user.p_theyre()] trying to commit sudoku... until [user.p_their()] eyes light up with realization!")
- user.say(";JOURNALISM IS MY CALLING! EVERYBODY APPRECIATES UNBIASED REPORTI-GLORF", forced="newspaper suicide")
- var/mob/living/carbon/human/H = user
- var/obj/W = new /obj/item/reagent_containers/food/drinks/bottle/whiskey(H.loc)
- playsound(H.loc, 'sound/items/drink.ogg', rand(10,50), 1)
- W.reagents.trans_to(H, W.reagents.total_volume)
- user.visible_message("[user] downs the contents of [W.name] in one gulp! Shoulda stuck to sudoku!")
-
- return(TOXLOSS)
-
-/obj/item/newspaper/attack_self(mob/user)
- if(ishuman(user))
- var/mob/living/carbon/human/human_user = user
- var/dat
- pages = 0
- switch(screen)
- if(0) //Cover
- dat+="The Griffon
"
- dat+="Nanotrasen-standard newspaper, for use on Nanotrasen? Space Facilities
"
- 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/news/feed_channel/NP in news_content)
- pages++
- if(wantedAuthor)
- dat+="**Important Security Announcement** \[page [pages+2]\]
"
- var/temp_page=0
- for(var/datum/news/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: \"[scribble]\""
- dat+= "
"
- if(1) // X channel pages inbetween.
- for(var/datum/news/feed_channel/NP in news_content)
- pages++
- var/datum/news/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
- var/i = 0
- for(var/datum/news/feed_message/MESSAGE in C.messages)
- if(MESSAGE.creationTime > creationTime)
- if(i == 0)
- dat+="No Feed stories stem from this channel..."
- break
- if(i == 0)
- dat+=""
- i++
- dat+="-[MESSAGE.returnBody(notContent(MESSAGE.bodyCensorTime))]
"
- if(MESSAGE.img)
- user << browse_rsc(MESSAGE.img, "tmp_photo[i].png")
- dat+="
"
- dat+="\[Story by [MESSAGE.returnAuthor(notContent(MESSAGE.authorCensorTime))]\]
"
- dat+="
"
- if(scribble_page==curr_page)
- dat+="
There is a small scribble near the end of this page... It reads: \"[scribble]\""
- dat+= "
"
- if(2) //Last page
- for(var/datum/news/feed_channel/NP in news_content)
- pages++
- if(wantedAuthor!=null)
- dat+="Wanted Issue:
"
- dat+="Criminal name: [wantedCriminal]
"
- dat+="Description: [wantedBody]
"
- dat+="Photo:: "
- if(wantedPhoto)
- user << browse_rsc(wantedPhoto, "tmp_photow.png")
- dat+="
"
- else
- dat+="None"
- else
- dat+="Apart from some uninteresting classified ads, there's nothing on this page..."
- if(scribble_page==curr_page)
- dat+="
There is a small scribble near the end of this page... It reads: \"[scribble]\""
- dat+= "
"
- dat+="
[curr_page+1]
"
- human_user << browse(dat, "window=newspaper_main;size=300x400")
- onclose(human_user, "newspaper_main")
- else
- to_chat(user, "The paper is full of unintelligible symbols!")
-
-/obj/item/newspaper/proc/notContent(list/L)
- if(!L.len)
- return 0
- for(var/i=L.len;i>0;i--)
- var/num = abs(L[i])
- if(creationTime <= num)
- continue
- else
- if(L[i] > 0)
- return 1
- else
- return 0
- return 0
-
-/obj/item/newspaper/Topic(href, href_list)
- var/mob/living/U = usr
- ..()
- if((src in U.contents) || (isturf(loc) && in_range(src, U)))
- U.set_machine(src)
- if(href_list["next_page"])
- if(curr_page == pages+1)
- return //Don't need that at all, but anyway.
- if(curr_page == pages) //We're at the middle, get to the end
- screen = 2
- else
- if(curr_page == 0) //We're at the start, get to the middle
- screen=1
- curr_page++
- playsound(loc, "pageturn", 50, 1)
- else if(href_list["prev_page"])
- if(curr_page == 0)
- return
- if(curr_page == 1)
- screen = 0
- else
- if(curr_page == pages+1) //we're at the end, let's go back to the middle.
- screen = 1
- curr_page--
- playsound(loc, "pageturn", 50, 1)
- if(ismob(loc))
- attack_self(loc)
-
-/obj/item/newspaper/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/pen))
- if(!user.is_literate())
- to_chat(user, "You scribble illegibly on [src]!")
- return
- if(scribble_page == curr_page)
- to_chat(user, "There's already a scribble in this page... You wouldn't want to make things too cluttered, would you?")
- else
- var/s = stripped_input(user, "Write something", "Newspaper")
- if (!s)
- return
- if(!user.canUseTopic(src, BE_CLOSE))
- return
- scribble_page = curr_page
- scribble = s
- attack_self(user)
- else
- return ..()
diff --git a/code/modules/newscaster/newspaper.dm b/code/modules/newscaster/newspaper.dm
new file mode 100644
index 0000000000..0afb36a7e7
--- /dev/null
+++ b/code/modules/newscaster/newspaper.dm
@@ -0,0 +1,173 @@
+/obj/item/newspaper
+ name = "newspaper"
+ desc = "An issue of The Griffon, the newspaper circulating aboard Nanotrasen Space Stations."
+ icon = 'icons/obj/bureaucracy.dmi'
+ icon_state = "newspaper"
+ lefthand_file = 'icons/mob/inhands/misc/books_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/books_righthand.dmi'
+ w_class = WEIGHT_CLASS_SMALL
+ attack_verb = list("bapped")
+ var/screen = 0
+ var/pages = 0
+ var/curr_page = 0
+ var/list/datum/news/feed_channel/news_content = list()
+ var/scribble=""
+ var/scribble_page = null
+ var/wantedAuthor
+ var/wantedCriminal
+ var/wantedBody
+ var/wantedPhoto
+ var/creationTime
+
+/obj/item/newspaper/suicide_act(mob/user)
+ user.visible_message("[user] is focusing intently on [src]! It looks like [user.p_theyre()] trying to commit sudoku... until [user.p_their()] eyes light up with realization!")
+ user.say(";JOURNALISM IS MY CALLING! EVERYBODY APPRECIATES UNBIASED REPORTI-GLORF", forced="newspaper suicide")
+ var/mob/living/carbon/human/H = user
+ var/obj/W = new /obj/item/reagent_containers/food/drinks/bottle/whiskey(H.loc)
+ playsound(H.loc, 'sound/items/drink.ogg', rand(10,50), 1)
+ W.reagents.trans_to(H, W.reagents.total_volume)
+ user.visible_message("[user] downs the contents of [W.name] in one gulp! Shoulda stuck to sudoku!")
+
+ return(TOXLOSS)
+
+/obj/item/newspaper/attack_self(mob/user)
+ if(ishuman(user))
+ var/mob/living/carbon/human/human_user = user
+ var/dat
+ pages = 0
+ switch(screen)
+ if(0) //Cover
+ dat+="The Griffon
"
+ dat+="Nanotrasen-standard newspaper, for use on Nanotrasen? Space Facilities
"
+ 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/news/feed_channel/NP in news_content)
+ pages++
+ if(wantedAuthor)
+ dat+="**Important Security Announcement** \[page [pages+2]\]
"
+ var/temp_page=0
+ for(var/datum/news/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: \"[scribble]\""
+ dat+= "
"
+ if(1) // X channel pages inbetween.
+ for(var/datum/news/feed_channel/NP in news_content)
+ pages++
+ var/datum/news/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
+ var/i = 0
+ for(var/datum/news/feed_message/MESSAGE in C.messages)
+ if(MESSAGE.creationTime > creationTime)
+ if(i == 0)
+ dat+="No Feed stories stem from this channel..."
+ break
+ if(i == 0)
+ dat+=""
+ i++
+ dat+="-[MESSAGE.returnBody(notContent(MESSAGE.bodyCensorTime))]
"
+ if(MESSAGE.img)
+ user << browse_rsc(MESSAGE.img, "tmp_photo[i].png")
+ dat+="
"
+ dat+="\[Story by [MESSAGE.returnAuthor(notContent(MESSAGE.authorCensorTime))]\]
"
+ dat+="
"
+ if(scribble_page==curr_page)
+ dat+="
There is a small scribble near the end of this page... It reads: \"[scribble]\""
+ dat+= "
"
+ if(2) //Last page
+ for(var/datum/news/feed_channel/NP in news_content)
+ pages++
+ if(wantedAuthor!=null)
+ dat+="Wanted Issue:
"
+ dat+="Criminal name: [wantedCriminal]
"
+ dat+="Description: [wantedBody]
"
+ dat+="Photo:: "
+ if(wantedPhoto)
+ user << browse_rsc(wantedPhoto, "tmp_photow.png")
+ dat+="
"
+ else
+ dat+="None"
+ else
+ dat+="Apart from some uninteresting classified ads, there's nothing on this page..."
+ if(scribble_page==curr_page)
+ dat+="
There is a small scribble near the end of this page... It reads: \"[scribble]\""
+ dat+= "
"
+ dat+="
[curr_page+1]
"
+ human_user << browse(dat, "window=newspaper_main;size=300x400")
+ onclose(human_user, "newspaper_main")
+ else
+ to_chat(user, "The paper is full of unintelligible symbols!")
+
+/obj/item/newspaper/proc/notContent(list/L)
+ if(!L.len)
+ return 0
+ for(var/i=L.len;i>0;i--)
+ var/num = abs(L[i])
+ if(creationTime <= num)
+ continue
+ else
+ if(L[i] > 0)
+ return 1
+ else
+ return 0
+ return 0
+
+/obj/item/newspaper/Topic(href, href_list)
+ var/mob/living/U = usr
+ ..()
+ if((src in U.contents) || (isturf(loc) && in_range(src, U)))
+ U.set_machine(src)
+ if(href_list["next_page"])
+ if(curr_page == pages+1)
+ return //Don't need that at all, but anyway.
+ if(curr_page == pages) //We're at the middle, get to the end
+ screen = 2
+ else
+ if(curr_page == 0) //We're at the start, get to the middle
+ screen=1
+ curr_page++
+ playsound(loc, "pageturn", 50, 1)
+ else if(href_list["prev_page"])
+ if(curr_page == 0)
+ return
+ if(curr_page == 1)
+ screen = 0
+ else
+ if(curr_page == pages+1) //we're at the end, let's go back to the middle.
+ screen = 1
+ curr_page--
+ playsound(loc, "pageturn", 50, 1)
+ if(ismob(loc))
+ attack_self(loc)
+
+/obj/item/newspaper/attackby(obj/item/W, mob/user, params)
+ if(istype(W, /obj/item/pen))
+ if(!user.is_literate())
+ to_chat(user, "You scribble illegibly on [src]!")
+ return
+ if(scribble_page == curr_page)
+ to_chat(user, "There's already a scribble in this page... You wouldn't want to make things too cluttered, would you?")
+ else
+ var/s = stripped_input(user, "Write something", "Newspaper")
+ if (!s)
+ return
+ if(!user.canUseTopic(src, BE_CLOSE))
+ return
+ scribble_page = curr_page
+ scribble = s
+ attack_self(user)
+ else
+ return ..()
diff --git a/tgstation.dme b/tgstation.dme
index 8c578e70f0..caf364d42f 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -663,7 +663,6 @@
#include "code\game\machinery\magnet.dm"
#include "code\game\machinery\mass_driver.dm"
#include "code\game\machinery\navbeacon.dm"
-#include "code\game\machinery\newscaster.dm"
#include "code\game\machinery\PDApainter.dm"
#include "code\game\machinery\quantum_pad.dm"
#include "code\game\machinery\recharger.dm"
@@ -2461,6 +2460,15 @@
#include "code\modules\modular_computers\hardware\printer.dm"
#include "code\modules\modular_computers\hardware\recharger.dm"
#include "code\modules\modular_computers\NTNet\NTNRC\conversation.dm"
+#include "code\modules\newscaster\_news.dm"
+#include "code\modules\newscaster\feed_channel.dm"
+#include "code\modules\newscaster\feed_comment.dm"
+#include "code\modules\newscaster\feed_message.dm"
+#include "code\modules\newscaster\ghostread.dm"
+#include "code\modules\newscaster\news_network.dm"
+#include "code\modules\newscaster\newscaster_machine.dm"
+#include "code\modules\newscaster\newspaper.dm"
+#include "code\modules\newscaster\wanted_message.dm"
#include "code\modules\ninja\__ninjaDefines.dm"
#include "code\modules\ninja\energy_katana.dm"
#include "code\modules\ninja\ninja_event.dm"