GLOBAL_DATUM_INIT(news_network, /datum/newscaster/feed_network, new)
GLOBAL_LIST_EMPTY(allCasters)
/datum/newscaster
/datum/newscaster/feed_comment
var/author = ""
var/body = ""
var/time_stamp = ""
/datum/newscaster/feed_message
var/author =""
var/body =""
var/list/authorCensorTime = list()
var/list/bodyCensorTime = list()
var/is_admin_message = 0
var/icon/img = null
var/time_stamp = ""
var/list/datum/newscaster/feed_comment/comments = list()
var/locked = 0
var/caption = ""
var/creationTime
var/authorCensor
var/bodyCensor
/datum/newscaster/feed_message/proc/returnAuthor(censor)
if(censor == -1)
censor = authorCensor
var/txt = "[GLOB.news_network.redactedText]"
if(!censor)
txt = author
return txt
/datum/newscaster/feed_message/proc/returnBody(censor)
if(censor == -1)
censor = bodyCensor
var/txt = "[GLOB.news_network.redactedText]"
if(!censor)
txt = body
return txt
/datum/newscaster/feed_message/proc/toggleCensorAuthor()
if(authorCensor)
authorCensorTime.Add(GLOB.news_network.lastAction*-1)
else
authorCensorTime.Add(GLOB.news_network.lastAction)
authorCensor = !authorCensor
GLOB.news_network.lastAction ++
/datum/newscaster/feed_message/proc/toggleCensorBody()
if(bodyCensor)
bodyCensorTime.Add(GLOB.news_network.lastAction*-1)
else
bodyCensorTime.Add(GLOB.news_network.lastAction)
bodyCensor = !bodyCensor
GLOB.news_network.lastAction ++
/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 = "[GLOB.news_network.redactedText]"
if(!censor)
txt = author
return txt
/datum/newscaster/feed_channel/proc/toggleCensorDclass()
if(censored)
DclassCensorTime.Add(GLOB.news_network.lastAction*-1)
else
DclassCensorTime.Add(GLOB.news_network.lastAction)
censored = !censored
GLOB.news_network.lastAction ++
/datum/newscaster/feed_channel/proc/toggleCensorAuthor()
if(authorCensor)
authorCensorTime.Add(GLOB.news_network.lastAction*-1)
else
authorCensorTime.Add(GLOB.news_network.lastAction)
authorCensor = !authorCensor
GLOB.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/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/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()]"
newMsg.is_admin_message = adminMessage
newMsg.locked = !allow_comments
if(photo)
newMsg.img = photo.img
newMsg.caption = photo.scribble
for(var/datum/newscaster/feed_channel/FC in network_channels)
if(FC.channel_name == channel_name)
FC.messages += newMsg
break
for(var/obj/machinery/newscaster/NEWSCASTER in GLOB.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 GLOB.allCasters)
N.newsAlert()
N.update_icon()
/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 GLOB.allCasters)
NEWSCASTER.update_icon()
/obj/item/wallframe/newscaster
name = "newscaster frame"
desc = "Used to build newscasters, just secure to the wall."
icon_state = "newscaster"
materials = list(MAT_METAL=14000, MAT_GLASS=8000)
result_path = /obj/machinery/newscaster
/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"
verb_say = "beeps"
verb_ask = "beeps"
verb_exclaim = "beeps"
armor = list(melee = 50, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 30)
obj_integrity = 200
max_integrity = 200
integrity_failure = 50
var/screen = 0
var/paper_remaining = 15
var/securityCaster = 0
var/unit_no = 0
var/alert_delay = 500
var/alert = 0
var/scanned_user = "Unknown"
var/msg = ""
var/obj/item/weapon/photo/photo = null
var/channel_name = ""
var/c_locked=0
var/datum/newscaster/feed_channel/viewing_channel = null
var/allow_comments = 1
anchored = 1
/obj/machinery/newscaster/security_unit
name = "security newscaster"
securityCaster = 1
/obj/machinery/newscaster/New(loc, ndir, building)
..()
if(building)
setDir(ndir)
pixel_x = (dir & 3)? 0 : (dir == 4 ? -32 : 32)
pixel_y = (dir & 3)? (dir ==1 ? -32 : 32) : 0
GLOB.allCasters += src
for(var/obj/machinery/newscaster/NEWSCASTER in GLOB.allCasters)
unit_no++
update_icon()
/obj/machinery/newscaster/Destroy()
GLOB.allCasters -= src
viewing_channel = null
photo = null
return ..()
/obj/machinery/newscaster/update_icon()
cut_overlays()
if(stat & (NOPOWER|BROKEN))
icon_state = "newscaster_off"
else
if(GLOB.news_network.wanted_issue.active)
icon_state = "newscaster_wanted"
else
icon_state = "newscaster_normal"
if(alert)
add_overlay("newscaster_alert")
var/hp_percent = obj_integrity * 100 /max_integrity
switch(hp_percent)
if(75 to 100)
return
if(50 to 75)
add_overlay("crack1")
if(25 to 50)
add_overlay("crack2")
else
add_overlay("crack3")
/obj/machinery/newscaster/power_change()
if(stat & BROKEN)
return
if(powered())
stat &= ~NOPOWER
update_icon()
else
spawn(rand(0, 15))
stat |= NOPOWER
update_icon()
/obj/machinery/newscaster/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
. = ..()
update_icon()
/obj/machinery/newscaster/attack_ai(mob/user)
return attack_hand(user)
/obj/machinery/newscaster/attack_hand(mob/user)
if(stat & (NOPOWER|BROKEN))
return
if(ishuman(user) || issilicon(user))
var/mob/living/human_or_robot_user = user
var/dat
scan_user(human_or_robot_user)
switch(screen)
if(0)
dat += "Welcome to Newscasting Unit #[unit_no].
Interface & News networks Operational."
dat += "
Property of Nanotrasen Inc"
if(GLOB.news_network.wanted_issue.active)
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(securityCaster)
var/wanted_already = 0
if(GLOB.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: [scanned_user]"
if(1)
dat+= "Station Feed Channels
"
if( isemptylist(GLOB.news_network.network_channels) )
dat+="No active channels found..."
else
for(var/datum/newscaster/feed_channel/CHANNEL in GLOB.news_network.network_channels)
if(CHANNEL.is_admin_channel)
dat+="[CHANNEL.channel_name]
"
else
dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : ()]
"
dat+="
Refresh"
dat+="
Back"
if(2)
dat+="Creating new Feed Channel..."
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: [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 [channel_name].
"
dat+="
Return
"
if(5)
dat+="Feed Channel [channel_name] created successfully.
"
dat+="
Return
"
if(6)
dat+="ERROR: Could not submit Feed story to Network.
"
if(channel_name=="")
dat+="Invalid receiving channel name.
"
if(scanned_user=="Unknown")
dat+="Channel author unverified.
"
if(msg == "" || msg == "\[REDACTED\]")
dat+="Invalid message body.
"
dat+="
Return
"
if(7)
dat+="ERROR: Could not submit Feed Channel to Network.
"
var/list/existing_authors = list()
for(var/datum/newscaster/feed_channel/FC in GLOB.news_network.network_channels)
if(FC.authorCensor)
existing_authors += GLOB.news_network.redactedText
else
existing_authors += FC.author
if(scanned_user in existing_authors)
dat+="There is already a Feed channel under your name.
"
if(channel_name=="" || channel_name == "\[REDACTED\]")
dat+="Invalid channel name.
"
var/check = 0
for(var/datum/newscaster/feed_channel/FC in GLOB.news_network.network_channels)
if(FC.channel_name == channel_name)
check = 1
break
if(check)
dat+="Channel name already in use.
"
if(scanned_user=="Unknown")
dat+="Channel author unverified.
"
dat+="
Return
"
if(8)
var/total_num=length(GLOB.news_network.network_channels)
var/active_num=total_num
var/message_num=0
for(var/datum/newscaster/feed_channel/FC in GLOB.news_network.network_channels)
if(!FC.censored)
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."
dat+="
Liquid Paper remaining: [(paper_remaining) *100 ] cm^3"
dat+="
Print Paper"
dat+="
Cancel"
if(9)
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(viewing_channel.messages) )
dat+="No feed messages found in channel...
"
else
var/i = 0
for(var/datum/newscaster/feed_message/MESSAGE in viewing_channel.messages)
i++
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.returnAuthor(-1)] \] - ([MESSAGE.time_stamp])
"
dat+="[MESSAGE.comments.len] comment[MESSAGE.comments.len > 1 ? "s" : ""]
"
for(var/datum/newscaster/feed_comment/comment in MESSAGE.comments)
dat+="[comment.body]
[comment.author] [comment.time_stamp]
"
if(MESSAGE.locked)
dat+="Comments locked
"
else
dat+="Comment
"
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(GLOB.news_network.network_channels))
dat+="No feed channels found active...
"
else
for(var/datum/newscaster/feed_channel/CHANNEL in GLOB.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(GLOB.news_network.network_channels))
dat+="No feed channels found active...
"
else
for(var/datum/newscaster/feed_channel/CHANNEL in GLOB.news_network.network_channels)
dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : ()]
"
dat+="
Back"
if(12)
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/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/newscaster/feed_comment/comment in MESSAGE.comments)
dat+="[comment.body] X
[comment.author] [comment.time_stamp]
"
dat+="
Back"
if(13)
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(viewing_channel.messages))
dat+="No feed messages found in channel...
"
else
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(GLOB.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: [channel_name]
"
dat+="Description: [msg]
"
dat+="Attach Photo: [(photo ? "Photo Attached" : "No Photo")]"
if(wanted_already)
dat+="Wanted Issue created by:[GLOB.news_network.wanted_issue.scannedUser]
"
else
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 [channel_name] is now in Network Circulation.
"
dat+="
Return
"
if(16)
dat+="ERROR: Wanted Issue rejected by Network.
"
if(channel_name=="" || channel_name == "\[REDACTED\]")
dat+="Invalid name for person wanted.
"
if(scanned_user=="Unknown")
dat+="Issue author unverified.
"
if(msg == "" || msg == "\[REDACTED\]")
dat+="Invalid description.
"
dat+="
Return
"
if(17)
dat+="Wanted Issue successfully deleted from Circulation
"
dat+="
Return
"
if(18)
if(GLOB.news_network.wanted_issue.active)
dat+="-- STATIONWIDE WANTED ISSUE --
\[Submitted by: [GLOB.news_network.wanted_issue.scannedUser]\]
"
dat+="Criminal: [GLOB.news_network.wanted_issue.criminal]
"
dat+="Description: [GLOB.news_network.wanted_issue.body]
"
dat+="Photo:: "
if(GLOB.news_network.wanted_issue.img)
usr << browse_rsc(GLOB.news_network.wanted_issue.img, "tmp_photow.png")
dat+="
"
else
dat+="None"
else
dat+="No current wanted issue found.
"
dat+="
Back
"
if(19)
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.
"
dat+="Return"
if(21)
dat+="Unable to print newspaper. Insufficient paper. Please notify maintenance personnel to refill machine storage.
"
dat+="Return"
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(icon, icon_state))
popup.open()
/obj/machinery/newscaster/Topic(href, href_list)
if(..())
return
if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && isturf(loc))) || issilicon(usr))
usr.set_machine(src)
scan_user(usr)
if(href_list["set_channel_name"])
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"])
c_locked = !c_locked
updateUsrDialog()
else if(href_list["submit_new_channel"])
var/list/existing_authors = list()
for(var/datum/newscaster/feed_channel/FC in GLOB.news_network.network_channels)
if(FC.authorCensor)
existing_authors += GLOB.news_network.redactedText
else
existing_authors += FC.author
var/check = 0
for(var/datum/newscaster/feed_channel/FC in GLOB.news_network.network_channels)
if(FC.channel_name == channel_name)
check = 1
break
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)
GLOB.news_network.CreateFeedChannel(channel_name, scanned_user, c_locked)
feedback_inc("newscaster_channels",1)
screen=5
updateUsrDialog()
else if(href_list["set_channel_receiving"])
var/list/available_channels = list()
for(var/datum/newscaster/feed_channel/F in GLOB.news_network.network_channels)
if( (!F.locked || F.author == scanned_user) && !F.censored)
available_channels += F.channel_name
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", msg))
if(temp_message)
msg = temp_message
updateUsrDialog()
else if(href_list["set_attachment"])
AttachPhoto(usr)
updateUsrDialog()
else if(href_list["submit_new_message"])
if(msg =="" || msg=="\[REDACTED\]" || scanned_user == "Unknown" || channel_name == "" )
screen=6
else
GLOB.news_network.SubmitArticle("[parsepencode(msg, usr, SIGNFONT)]", scanned_user, channel_name, photo, 0, allow_comments)
feedback_inc("newscaster_stories",1)
screen=4
msg = ""
updateUsrDialog()
else if(href_list["create_channel"])
screen=2
updateUsrDialog()
else if(href_list["create_feed_story"])
screen=3
updateUsrDialog()
else if(href_list["menu_paper"])
screen=8
updateUsrDialog()
else if(href_list["print_paper"])
if(!paper_remaining)
screen=21
else
print_paper()
screen = 20
updateUsrDialog()
else if(href_list["menu_censor_story"])
screen=10
updateUsrDialog()
else if(href_list["menu_censor_channel"])
screen=11
updateUsrDialog()
else if(href_list["menu_wanted"])
var/already_wanted = 0
if(GLOB.news_network.wanted_issue.active)
already_wanted = 1
if(already_wanted)
channel_name = GLOB.news_network.wanted_issue.criminal
msg = GLOB.news_network.wanted_issue.body
screen = 14
updateUsrDialog()
else if(href_list["set_wanted_name"])
channel_name = trim(stripped_input(usr, "Provide the name of the Wanted person", "Network Security Handler"))
updateUsrDialog()
else if(href_list["set_wanted_desc"])
msg = trim(stripped_input(usr, "Provide 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(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.
GLOB.news_network.submitWanted(channel_name, msg, scanned_user, photo, 0 , 1)
screen = 15
else
if(GLOB.news_network.wanted_issue.isAdminMsg)
alert("The wanted issue has been distributed by a Nanotrasen higherup. You cannot edit it.","Ok")
return
GLOB.news_network.submitWanted(channel_name, msg, scanned_user, photo)
screen = 19
updateUsrDialog()
else if(href_list["cancel_wanted"])
if(GLOB.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")
GLOB.news_network.deleteWanted()
screen=17
updateUsrDialog()
else if(href_list["view_wanted"])
screen=18
updateUsrDialog()
else if(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
FC.toggleCensorAuthor()
updateUsrDialog()
else if(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
MSG.toggleCensorAuthor()
updateUsrDialog()
else if(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
MSG.toggleCensorBody()
updateUsrDialog()
else if(href_list["pick_d_notice"])
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/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.toggleCensorDclass()
updateUsrDialog()
else if(href_list["view"])
screen=1
updateUsrDialog()
else if(href_list["setScreen"])
screen = text2num(href_list["setScreen"])
if (screen == 0)
scanned_user = "Unknown";
msg = "";
c_locked=0;
channel_name="";
viewing_channel = null
updateUsrDialog()
else if(href_list["show_channel"])
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/newscaster/feed_channel/FC = locate(href_list["pick_censor_channel"])
viewing_channel = FC
screen = 12
updateUsrDialog()
else if(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/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.returnBody(-1)] -- [FC.body]")
updateUsrDialog()
else if(href_list["del_comment"])
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/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"])
updateUsrDialog()
/obj/machinery/newscaster/attackby(obj/item/I, mob/living/user, params)
if(istype(I, /obj/item/weapon/wrench))
to_chat(user, "You start [anchored ? "un" : ""]securing [name]...")
playsound(loc, I.usesound, 50, 1)
if(do_after(user, 60*I.toolspeed, target = src))
playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
if(stat & BROKEN)
to_chat(user, "The broken remains of [src] fall on the ground.")
new /obj/item/stack/sheet/metal(loc, 5)
new /obj/item/weapon/shard(loc)
new /obj/item/weapon/shard(loc)
else
to_chat(user, "You [anchored ? "un" : ""]secure [name].")
new /obj/item/wallframe/newscaster(loc)
qdel(src)
else if(istype(I, /obj/item/weapon/weldingtool) && user.a_intent != INTENT_HARM)
var/obj/item/weapon/weldingtool/WT = I
if(stat & BROKEN)
if(WT.remove_fuel(0,user))
user.visible_message("[user] is repairing [src].", \
"You begin repairing [src]...", \
"You hear welding.")
playsound(loc, WT.usesound, 40, 1)
if(do_after(user,40*WT.toolspeed, 1, target = src))
if(!WT.isOn() || !(stat & BROKEN))
return
to_chat(user, "You repair [src].")
playsound(loc, 'sound/items/Welder2.ogg', 50, 1)
obj_integrity = max_integrity
stat &= ~BROKEN
update_icon()
else
to_chat(user, "[src] does not need repairs.")
else
return ..()
/obj/machinery/newscaster/play_attack_sound(damage, damage_type = BRUTE, damage_flag = 0)
switch(damage_type)
if(BRUTE)
if(stat & BROKEN)
playsound(loc, 'sound/effects/hit_on_shattered_glass.ogg', 100, 1)
else
playsound(loc, 'sound/effects/Glasshit.ogg', 90, 1)
if(BURN)
playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
/obj/machinery/newscaster/deconstruct(disassembled = TRUE)
if(!(flags & NODECONSTRUCT))
new /obj/item/stack/sheet/metal(loc, 2)
new /obj/item/weapon/shard(loc)
new /obj/item/weapon/shard(loc)
qdel(src)
/obj/machinery/newscaster/obj_break()
if(!(stat & BROKEN) && !(flags & NODECONSTRUCT))
stat |= BROKEN
playsound(loc, 'sound/effects/Glassbr3.ogg', 100, 1)
update_icon()
/obj/machinery/newscaster/attack_paw(mob/user)
if(user.a_intent != INTENT_HARM)
to_chat(user, "The newscaster controls are far too complicated for your tiny brain!")
else
take_damage(5, BRUTE, "melee")
/obj/machinery/newscaster/proc/AttachPhoto(mob/user)
if(photo)
if(!photo.sillynewscastervar)
photo.loc = loc
if(!issilicon(user))
user.put_in_inactive_hand(photo)
else
qdel(photo)
photo = null
if(istype(user.get_active_held_item(), /obj/item/weapon/photo))
photo = user.get_active_held_item()
if(!user.drop_item())
return
photo.loc = src
if(issilicon(user))
var/list/nametemp = list()
var/find
var/datum/picture/selection
var/obj/item/device/camera/siliconcam/targetcam = null
if(isAI(user))
var/mob/living/silicon/ai/R = user
targetcam = R.aicamera
else if(iscyborg(user))
var/mob/living/silicon/robot/R = user
if(R.connected_ai)
targetcam = R.connected_ai.aicamera
else
targetcam = R.aicamera
else
to_chat(user, "You cannot interface with silicon photo uploading!")
if(targetcam.aipictures.len == 0)
to_chat(usr, "No images saved")
return
for(var/datum/picture/t in targetcam.aipictures)
nametemp += t.fields["name"]
find = input("Select image (numbered in order taken)") in nametemp
var/obj/item/weapon/photo/P = new/obj/item/weapon/photo()
for(var/datum/picture/q in targetcam.aipictures)
if(q.fields["name"] == find)
selection = q
break
P.photocreate(selection.fields["icon"], selection.fields["img"], selection.fields["desc"])
P.sillynewscastervar = 1
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(issilicon(user))
var/mob/living/silicon/ai_user = user
scanned_user = "[ai_user.name] ([ai_user.job])"
else
throw EXCEPTION("Invalid user for this proc")
return
/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 GLOB.news_network.network_channels)
NEWSPAPER.news_content += FC
if(GLOB.news_network.wanted_issue.active)
NEWSPAPER.wantedAuthor = GLOB.news_network.wanted_issue.scannedUser
NEWSPAPER.wantedCriminal = GLOB.news_network.wanted_issue.criminal
NEWSPAPER.wantedBody = GLOB.news_network.wanted_issue.body
if(GLOB.news_network.wanted_issue.img)
NEWSPAPER.wantedPhoto = GLOB.news_network.wanted_issue.img
NEWSPAPER.loc = get_turf(src)
NEWSPAPER.creationTime = GLOB.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)
/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 = WEIGHT_CLASS_SMALL
attack_verb = list("bapped")
var/screen = 0
var/pages = 0
var/curr_page = 0
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/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")
var/mob/living/carbon/human/H = user
var/obj/W = new /obj/item/weapon/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/weapon/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/newscaster/feed_channel/NP in news_content)
pages++
if(wantedAuthor)
dat+="**Important Security Announcement** \[page [pages+2]\]
"
var/temp_page=0
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: \"[scribble]\""
dat+= "
"
if(1) // X channel pages inbetween.
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
var/i = 0
for(var/datum/newscaster/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/newscaster/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/weapon/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/weapon/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/weapon/newspaper/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/pen))
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 (!in_range(src, usr) && loc != usr)
return
scribble_page = curr_page
scribble = s
attack_self(user)
else
return ..()