//##############################################
//################### NEWSCASTERS BE HERE! ####
//###-Agouri###################################
/datum/feed_message
var/author =""
var/body =""
var/message_type ="Story"
//var/parent_channel
var/backup_body =""
var/backup_author =""
var/is_admin_message = 0
var/icon/img = null
var/icon/backup_img
/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/feed_message/proc/clear()
src.author = ""
src.body = ""
src.backup_body = ""
src.backup_author = ""
src.img = null
src.backup_img = null
/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/feed_network
var/list/datum/feed_channel/network_channels = list()
var/datum/feed_message/wanted_issue
var/datum/feed_network/news_network = new /datum/feed_network //The global news-network, which is coincidentally a global list.
var/list/obj/machinery/newscaster/allCasters = list() //Global list that will contain reference to all newscasters in existence.
/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!"
icon = 'icons/obj/terminals.dmi'
icon_state = "newscaster_normal"
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/screen = 0 //Or maybe I'll make it into a list within a list afterwards... whichever I prefer, go fuck yourselves :3
// 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/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/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
luminosity = 0
anchored = 1
/obj/machinery/newscaster/security_unit //Security unit
name = "Security Newscaster"
securityCaster = 1
/obj/machinery/newscaster/New() //Constructor, ho~
allCasters += src
src.paper_remaining = 15 // Will probably change this to something better
for(var/obj/machinery/newscaster/NEWSCASTER in allCasters) // Let's give it an appropriate unit number
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
/obj/machinery/newscaster/Del()
allCasters -= src
..()
/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")
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
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]")
icon_state = "newscaster_normal"
return
/obj/machinery/newscaster/power_change()
if(isbroken) //Broken shit can't be powered.
return
..()
if( !(stat & NOPOWER) )
src.ispowered = 1
src.update_icon()
else
spawn(rand(0, 15))
src.ispowered = 0
src.update_icon()
/obj/machinery/newscaster/ex_act(severity)
switch(severity)
if(1.0)
del(src)
return
if(2.0)
src.isbroken=1
if(prob(50))
del(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
else
if(prob(50))
src.isbroken=1
src.update_icon()
return
return
/obj/machinery/newscaster/attack_ai(mob/user as mob)
return src.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)
return
if(istype(user, /mob/living/carbon/human) || istype(user,/mob/living/silicon) )
var/mob/living/human_or_robot_user = user
var/dat
dat = text("
NewscasterNewscaster Unit #[src.unit_no]
")
src.scan_user(human_or_robot_user) //Newscaster scans you
switch(screen)
if(0)
dat += "Welcome to Newscasting Unit #[src.unit_no].
Interface & News networks Operational."
dat += "
Property of Nanotransen Inc"
if(news_network.wanted_issue)
dat+= "
Read Wanted Issue"
dat+= "
Create Feed Channel"
dat+= "
View Feed Channels"
dat+= "
Submit new Feed story"
dat+= "
Print newspaper"
dat+= "
Re-scan User"
dat+= "
Exit"
if(src.securityCaster)
var/wanted_already = 0
if(news_network.wanted_issue)
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]"
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)
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]
\[[MESSAGE.message_type] 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+="
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: [src.msg]
"
dat+="Attach Photo: [(src.photo ? "Photo Attached" : "No Photo")]"
dat+="
Submit
Cancel
"
if(4)
dat+="Feed story successfully submitted to [src.channel_name].
"
dat+="
Return
"
if(5)
dat+="Feed Channel [src.channel_name] created successfully.
"
dat+="
Return
"
if(6)
dat+="ERROR: Could not submit Feed story to Network.
"
if(src.channel_name=="")
dat+="•Invalid receiving channel name.
"
if(src.scanned_user=="Unknown")
dat+="•Channel author unverified.
"
if(src.msg == "" || src.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
else
existing_authors += FC.author
if(src.scanned_user in existing_authors)
dat+="•There already exists a Feed channel under your name.
"
if(src.channel_name=="" || src.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)
check = 1
break
if(check)
dat+="•Channel name already in use.
"
if(src.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)
if(!FC.censored)
message_num += length(FC.messages) //Dont forget, datum/feed_channel's var messages is a list of datum/feed_message
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+="
Print Paper"
dat+="
Cancel"
if(9)
dat+="[src.viewing_channel.channel_name]: \[created by: [src.viewing_channel.author]\]
"
if(src.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) )
dat+="No feed messages found in channel...
"
else
var/i = 0
for(var/datum/feed_message/MESSAGE in src.viewing_channel.messages)
i++
dat+="-[MESSAGE.body]
"
if(MESSAGE.img)
usr << browse_rsc(MESSAGE.img, "tmp_photo[i].png")
dat+="
"
dat+="\[[MESSAGE.message_type] by [MESSAGE.author]\]
"
dat+="
Refresh"
dat+="
Back"
if(10)
dat+="Nanotrasen Feed Censorship Tool
"
dat+="NOTE: Due to the nature of news Feeds, total deletion of a Feed Story is not possible.
"
dat+="Keep in mind that users attempting to view a censored feed will instead see the \[REDACTED\] tag above it."
dat+="
Select Feed channel to get Stories from:
"
if(isemptylist(news_network.network_channels))
dat+="No feed channels found active...
"
else
for(var/datum/feed_channel/CHANNEL in news_network.network_channels)
dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : ()]
"
dat+="
Cancel"
if(11)
dat+="Nanotrasen D-Notice Handler
"
dat+="A D-Notice is to be bestowed upon the channel if the handling Authority deems it as harmful for the station's"
dat+="morale, integrity or disciplinary behaviour. A D-Notice will render a channel unable to be updated by anyone, without deleting any feed"
dat+="stories it might contain at the time. You can lift a D-Notice if you have the required access at any time.
"
if(isemptylist(news_network.network_channels))
dat+="No feed channels found active...
"
else
for(var/datum/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+="No feed messages found in channel...
"
else
for(var/datum/feed_message/MESSAGE in src.viewing_channel.messages)
dat+="-[MESSAGE.body]
\[[MESSAGE.message_type] by [MESSAGE.author]\]
"
dat+="[(MESSAGE.body == "\[REDACTED\]") ? ("Undo story censorship") : ("Censor story")] - [(MESSAGE.author == "\[REDACTED\]") ? ("Undo Author Censorship") : ("Censor message Author")]
"
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+="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) )
dat+="No feed messages found in channel...
"
else
for(var/datum/feed_message/MESSAGE in src.viewing_channel.messages)
dat+="-[MESSAGE.body]
\[[MESSAGE.message_type] by [MESSAGE.author]\]
"
dat+="
Back"
if(14)
dat+="Wanted Issue Handler:"
var/wanted_already = 0
var/end_param = 1
if(news_network.wanted_issue)
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")]"
if(wanted_already)
dat+="Wanted Issue created by: [news_network.wanted_issue.backup_author]
"
else
dat+="Wanted Issue will be created under prosecutor: [src.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+="
Return
"
if(16)
dat+="ERROR: Wanted Issue rejected by Network.
"
if(src.channel_name=="" || src.channel_name == "\[REDACTED\]")
dat+="•Invalid name for person wanted.
"
if(src.scanned_user=="Unknown")
dat+="•Issue author unverified.
"
if(src.msg == "" || src.msg == "\[REDACTED\]")
dat+="•Invalid description.
"
dat+="
Return
"
if(17)
dat+="Wanted Issue successfully deleted from Circulation
"
dat+="
Return
"
if(18)
dat+="-- STATIONWIDE WANTED ISSUE --
\[Submitted by: [news_network.wanted_issue.backup_author]\]
"
dat+="Criminal: [news_network.wanted_issue.author]
"
dat+="Description: [news_network.wanted_issue.body]
"
dat+="Photo:: "
if(news_network.wanted_issue.img)
usr << browse_rsc(news_network.wanted_issue.img, "tmp_photow.png")
dat+="
"
else
dat+="None"
dat+="
Back
"
if(19)
dat+="Wanted issue for [src.channel_name] successfully edited.
"
dat+="
Return
"
if(20)
dat+="Printing successful. Please receive your newspaper from the bottom of the machine.
"
dat+="Return"
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")
/*if(src.isbroken) //debugging shit
return
src.hitstaken++
if(src.hitstaken==3)
src.isbroken = 1
src.update_icon()*/
/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)))
usr.set_machine(src)
if(href_list["set_channel_name"])
src.channel_name = strip_html(input(usr, "Provide a Feed Channel Name", "Network Channel Handler", ""))
while (findtext(src.channel_name," ") == 1)
src.channel_name = copytext(src.channel_name,2,lentext(src.channel_name)+1)
src.updateUsrDialog()
//src.update_icon()
else if(href_list["set_channel_lock"])
src.c_locked = !src.c_locked
src.updateUsrDialog()
//src.update_icon()
else if(href_list["submit_new_channel"])
//var/list/existing_channels = list() //OBSOLETE
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
else
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)
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
else
var/choice = alert("Please confirm Feed channel creation","Network Channel Handler","Confirm","Cancel")
if(choice=="Confirm")
var/datum/feed_channel/newChannel = new /datum/feed_channel
newChannel.channel_name = src.channel_name
newChannel.author = src.scanned_user
newChannel.locked = c_locked
feedback_inc("newscaster_channels",1)
/*for(var/obj/machinery/newscaster/NEWSCASTER in allCasters) //Let's add the new channel in all casters.
NEWSCASTER.channel_list += newChannel*/ //Now that it is sane, get it into the list. -OBSOLETE
news_network.network_channels += newChannel //Adding channel to the global network
src.screen=5
src.updateUsrDialog()
//src.update_icon()
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)
if( (!F.locked || F.author == scanned_user) && !F.censored)
available_channels += F.channel_name
src.channel_name = strip_html(input(usr, "Choose receiving Feed Channel", "Network Channel Handler") in available_channels )
src.updateUsrDialog()
else if(href_list["set_new_message"])
src.msg = strip_html(input(usr, "Write your Feed story", "Network Channel Handler", ""))
while (findtext(src.msg," ") == 1)
src.msg = copytext(src.msg,2,lentext(src.msg)+1)
src.updateUsrDialog()
else if(href_list["set_attachment"])
AttachPhoto(usr)
src.updateUsrDialog()
else if(href_list["submit_new_message"])
if(src.msg =="" || src.msg=="\[REDACTED\]" || src.scanned_user == "Unknown" || src.channel_name == "" )
src.screen=6
else
var/datum/feed_message/newMsg = new /datum/feed_message
newMsg.author = src.scanned_user
newMsg.body = src.msg
if(photo)
newMsg.img = photo.img
feedback_inc("newscaster_stories",1)
for(var/datum/feed_channel/FC in news_network.network_channels)
if(FC.channel_name == src.channel_name)
FC.messages += newMsg //Adding message to the network's appropriate feed_channel
break
src.screen=4
for(var/obj/machinery/newscaster/NEWSCASTER in allCasters)
NEWSCASTER.newsAlert(src.channel_name)
src.updateUsrDialog()
else if(href_list["create_channel"])
src.screen=2
src.updateUsrDialog()
else if(href_list["create_feed_story"])
src.screen=3
src.updateUsrDialog()
else if(href_list["menu_paper"])
src.screen=8
src.updateUsrDialog()
else if(href_list["print_paper"])
if(!src.paper_remaining)
src.screen=21
else
src.print_paper()
src.screen = 20
src.updateUsrDialog()
else if(href_list["menu_censor_story"])
src.screen=10
src.updateUsrDialog()
else if(href_list["menu_censor_channel"])
src.screen=11
src.updateUsrDialog()
else if(href_list["menu_wanted"])
var/already_wanted = 0
if(news_network.wanted_issue)
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()
else if(href_list["set_wanted_name"])
src.channel_name = strip_html(input(usr, "Provide the name of the Wanted person", "Network Security Handler", ""))
while (findtext(src.channel_name," ") == 1)
src.channel_name = copytext(src.channel_name,2,lentext(src.channel_name)+1)
src.updateUsrDialog()
else if(href_list["set_wanted_desc"])
src.msg = strip_html(input(usr, "Provide the a description of the Wanted person and any other details you deem important", "Network Security Handler", ""))
while (findtext(src.msg," ") == 1)
src.msg = copytext(src.msg,2,lentext(src.msg)+1)
src.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
else
var/choice = alert("Please confirm Wanted Issue [(input_param==1) ? ("creation.") : ("edit.")]","Network Security Handler","Confirm","Cancel")
if(choice=="Confirm")
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
else
if(news_network.wanted_issue.is_admin_message)
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()
else if(href_list["cancel_wanted"])
if(news_network.wanted_issue.is_admin_message)
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()
else if(href_list["view_wanted"])
src.screen=18
src.updateUsrDialog()
else if(href_list["censor_channel_author"])
var/datum/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()
else if(href_list["censor_channel_story_author"])
var/datum/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()
else if(href_list["censor_channel_story_body"])
var/datum/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.img != null)
MSG.backup_img = MSG.img
MSG.img = null
else
MSG.img = MSG.backup_img
if(MSG.body != "\[REDACTED\]")
MSG.backup_body = MSG.body
MSG.body = "\[REDACTED\]"
else
MSG.body = MSG.backup_body
src.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()
else if(href_list["toggle_d_notice"])
var/datum/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()
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";
msg = "";
src.c_locked=0;
channel_name="";
src.viewing_channel = null
src.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()
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()
else if(href_list["refresh"])
src.updateUsrDialog()
/obj/machinery/newscaster/attackby(obj/item/I as obj, mob/user as mob)
/* if (istype(I, /obj/item/weapon/card/id) || istype(I, /obj/item/device/pda) ) //Name verification for channels or messages
if(src.screen == 4 || src.screen == 5)
if( istype(I, /obj/item/device/pda) )
var/obj/item/device/pda/P = I
if(P.id)
src.scanned_user = "[P.id.registered_name] ([P.id.assignment])"
src.screen=2
else
var/obj/item/weapon/card/id/T = I
src.scanned_user = text("[T.registered_name] ([T.assignment])")
src.screen=2*/ //Obsolete after autorecognition
if (src.isbroken)
playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 100, 1)
for (var/mob/O in hearers(5, src.loc))
O.show_message("[user.name] further abuses the shattered [src.name].")
else
if(istype(I, /obj/item/weapon) )
var/obj/item/weapon/W = I
if(W.force <15)
for (var/mob/O in hearers(5, src.loc))
O.show_message("[user.name] hits the [src.name] with the [W.name] with no visible effect." )
playsound(src.loc, 'sound/effects/Glasshit.ogg', 100, 1)
else
src.hitstaken++
if(src.hitstaken==3)
for (var/mob/O in hearers(5, src.loc))
O.show_message("[user.name] smashes the [src.name]!" )
src.isbroken=1
playsound(src.loc, 'sound/effects/Glassbr3.ogg', 100, 1)
else
for (var/mob/O in hearers(5, src.loc))
O.show_message("[user.name] forcefully slams the [src.name] with the [I.name]!" )
playsound(src.loc, 'sound/effects/Glasshit.ogg', 100, 1)
else
user << "This does nothing."
src.update_icon()
/obj/machinery/newscaster/attack_ai(mob/user as mob)
return src.attack_hand(user) //or maybe it'll have some special functions? No idea.
/obj/machinery/newscaster/attack_paw(mob/user as mob)
user << "The newscaster controls are far too complicated for your tiny brain!"
return
/obj/machinery/newscaster/proc/AttachPhoto(mob/user as mob)
if(photo)
if(!issilicon(user))
photo.loc = src.loc
user.put_in_inactive_hand(photo)
photo = null
if(istype(user.get_active_hand(), /obj/item/weapon/photo))
photo = user.get_active_hand()
user.drop_item()
photo.loc = src
else if(istype(user,/mob/living/silicon))
var/mob/living/silicon/tempAI = user
var/datum/picture/selection = tempAI.GetPicture()
if (!selection)
return
var/obj/item/weapon/photo/P = new/obj/item/weapon/photo()
P.construct(selection)
photo = P
//########################################################################################################################
//###################################### 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!
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/scribble=""
var/scribble_page = null
/*obj/item/weapon/newspaper/attack_hand(mob/user as mob)
..()
world << "derp"*/
obj/item/weapon/newspaper/attack_self(mob/user as mob)
if(ishuman(user))
var/mob/living/carbon/human/human_user = user
var/dat
src.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]\]
"
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]\]
"
var/temp_page=0
for(var/datum/feed_channel/NP in src.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+= "
"
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)
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+=""
var/i = 0
for(var/datum/feed_message/MESSAGE in C.messages)
i++
dat+="-[MESSAGE.body]
"
if(MESSAGE.img)
user << browse_rsc(MESSAGE.img, "tmp_photo[i].png")
dat+="
"
dat+="\[[MESSAGE.message_type] by [MESSAGE.author]\]
"
dat+="
"
if(scribble_page==curr_page)
dat+="
There is a small scribble near the end of this page... It reads: \"[src.scribble]\""
dat+= "
"
if(2) //Last page
for(var/datum/feed_channel/NP in src.news_content)
src.pages++
if(src.important_message!=null)
dat+="Wanted Issue:
"
dat+="Criminal name: [important_message.author]
"
dat+="Description: [important_message.body]
"
dat+="Photo:: "
if(important_message.img)
user << browse_rsc(important_message.img, "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: \"[src.scribble]\""
dat+= "
"
else
dat+="I'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com"
dat+="
[src.curr_page+1]
"
human_user << browse(dat, "window=newspaper_main;size=300x400")
onclose(human_user, "newspaper_main")
else
user << "The paper is full of intelligible symbols!"
obj/item/weapon/newspaper/Topic(href, href_list)
var/mob/living/U = usr
..()
if ((src in U.contents) || ( istype(loc, /turf) && in_range(src, U) ))
U.set_machine(src)
if(href_list["next_page"])
if(curr_page==src.pages+1)
return //Don't need that at all, but anyway.
if(src.curr_page == src.pages) //We're at the middle, get to the end
src.screen = 2
else
if(curr_page == 0) //We're at the start, get to the middle
src.screen=1
src.curr_page++
playsound(src.loc, "pageturn", 50, 1)
else if(href_list["prev_page"])
if(curr_page == 0)
return
if(curr_page == 1)
src.screen = 0
else
if(curr_page == src.pages+1) //we're at the end, let's go back to the middle.
src.screen = 1
src.curr_page--
playsound(src.loc, "pageturn", 50, 1)
if (istype(src.loc, /mob))
src.attack_self(src.loc)
obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/pen))
if(src.scribble_page == src.curr_page)
user << "There's already a scribble in this page... You wouldn't want to make things too cluttered, would you?"
else
var/s = strip_html( input(user, "Write something", "Newspaper", "") )
s = copytext(sanitize(s), 1, MAX_MESSAGE_LEN)
if (!s)
return
if (!in_range(src, usr) && src.loc != usr)
return
src.scribble_page = src.curr_page
src.scribble = s
src.attack_self(user)
return
////////////////////////////////////helper procs
/obj/machinery/newscaster/proc/scan_user(mob/living/user as mob)
if(istype(user,/mob/living/carbon/human)) //User is a human
var/mob/living/carbon/human/human_user = user
if(human_user.wear_id) //Newscaster scans you
if(istype(human_user.wear_id, /obj/item/device/pda) ) //autorecognition, woo!
var/obj/item/device/pda/P = human_user.wear_id
if(P.id)
src.scanned_user = "[P.id.registered_name] ([P.id.assignment])"
else
src.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
src.scanned_user ="[ID.registered_name] ([ID.assignment])"
else
src.scanned_user ="Unknown"
else
src.scanned_user ="Unknown"
else
var/mob/living/silicon/ai_user = user
src.scanned_user = "[ai_user.name] ([ai_user.job])"
/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/feed_channel/FC in news_network.network_channels)
NEWSPAPER.news_content += FC
if(news_network.wanted_issue)
NEWSPAPER.important_message = news_network.wanted_issue
NEWSPAPER.loc = get_turf(src)
src.paper_remaining--
return
//Removed for now so these aren't even checked every tick. Left this here in-case Agouri needs it later.
///obj/machinery/newscaster/process() //Was thinking of doing the icon update through process, but multiple iterations per second does not
// return //bode well with a newscaster network of 10+ machines. Let's just return it, as it's added in the machines list.
/obj/machinery/newscaster/proc/newsAlert(channel) //This isn't Agouri's work, for it is ugly and vile.
var/turf/T = get_turf(src) //Who the fuck uses spawn(600) anyway, jesus christ
if(channel)
for(var/mob/O in hearers(world.view-1, T))
O.show_message("[src.name] beeps, \"Breaking news from [channel]!\"",2)
src.alert = 1
src.update_icon()
spawn(300)
src.alert = 0
src.update_icon()
playsound(src.loc, 'sound/machines/twobeep.ogg', 75, 1)
else
for(var/mob/O in hearers(world.view-1, T))
O.show_message("[src.name] beeps, \"Attention! Wanted issue distributed!\"",2)
playsound(src.loc, 'sound/machines/warning-buzzer.ogg', 75, 1)
return