"
+ 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"
From 6eae30cb660efd18341ea659878f9c20a23c87bf Mon Sep 17 00:00:00 2001
From: kevinz000 <2003111+kevinz000@users.noreply.github.com>
Date: Thu, 6 Feb 2020 00:25:27 -0700
Subject: [PATCH 014/123] whoops
---
code/modules/newscaster/ghostread.dm | 1 -
1 file changed, 1 deletion(-)
diff --git a/code/modules/newscaster/ghostread.dm b/code/modules/newscaster/ghostread.dm
index 5cf36e1164..d62bf1bb4e 100644
--- a/code/modules/newscaster/ghostread.dm
+++ b/code/modules/newscaster/ghostread.dm
@@ -28,7 +28,6 @@
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")
From 3019f0d0fcde50863ccce8a6446ee58ad5a83574 Mon Sep 17 00:00:00 2001
From: kevinz000 <2003111+kevinz000@users.noreply.github.com>
Date: Thu, 6 Feb 2020 00:29:36 -0700
Subject: [PATCH 015/123] path
---
code/modules/newscaster/ghostread.dm | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/code/modules/newscaster/ghostread.dm b/code/modules/newscaster/ghostread.dm
index d62bf1bb4e..4a7dbf9f22 100644
--- a/code/modules/newscaster/ghostread.dm
+++ b/code/modules/newscaster/ghostread.dm
@@ -1,4 +1,8 @@
/mob/dead/observer/verb/read_news()
+ set name = "Read Newscaster"
+ set desc = "Open a list of available news channels"
+ set category = "Ghost"
+
var/datum/browser/popup = new(user, "ghost_news_list", 450, 600)
popup.set_content(render_news_channel_list())
popup.open()
@@ -11,7 +15,7 @@
render_news_channel(D)
/mob/dead/observer/proc/render_news_channel_list()
- var/datum/news_network = GLOB.news_network()
+ 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
@@ -27,7 +31,7 @@
if(!length(FC.messages))
content += "This channel is empty.
"
for(var/i in FC.messages)
- var/datum/feed_message/FM = i
+ var/datum/news/feed_message/FM = i
content += "-[FM.returnBody(-1)]
"
if(FM.img)
src << browse_rsc(FM.img, "tmp_photo[i].png")
From db4a0ebb3f819a6fe029a540304b594a76dbae27 Mon Sep 17 00:00:00 2001
From: kevinz000 <2003111+kevinz000@users.noreply.github.com>
Date: Thu, 6 Feb 2020 00:32:19 -0700
Subject: [PATCH 016/123] pathing
---
code/modules/newscaster/ghostread.dm | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/code/modules/newscaster/ghostread.dm b/code/modules/newscaster/ghostread.dm
index 4a7dbf9f22..42b2033080 100644
--- a/code/modules/newscaster/ghostread.dm
+++ b/code/modules/newscaster/ghostread.dm
@@ -3,7 +3,7 @@
set desc = "Open a list of available news channels"
set category = "Ghost"
- var/datum/browser/popup = new(user, "ghost_news_list", 450, 600)
+ var/datum/browser/popup = new(user, "ghost_news_list", "Chanenl List", 450, 600)
popup.set_content(render_news_channel_list())
popup.open()
@@ -19,12 +19,12 @@
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)":""]"
+ content += "[FC.channel_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)]\]
"
+ content += "[FC.channel_name]: \[created by: [FC.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.
"
@@ -42,11 +42,10 @@
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]
"
+ var/datum/news/feed_comment/comment = i
+ content += "[comment.body]
[comment.author] [comment.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()
-
From 842a5cccf38fb742e2ddc96e5f945d53ba4a0a73 Mon Sep 17 00:00:00 2001
From: kevinz000 <2003111+kevinz000@users.noreply.github.com>
Date: Thu, 6 Feb 2020 00:34:24 -0700
Subject: [PATCH 017/123] varnames
---
code/modules/newscaster/ghostread.dm | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)
diff --git a/code/modules/newscaster/ghostread.dm b/code/modules/newscaster/ghostread.dm
index 42b2033080..c9a44b8f58 100644
--- a/code/modules/newscaster/ghostread.dm
+++ b/code/modules/newscaster/ghostread.dm
@@ -3,9 +3,9 @@
set desc = "Open a list of available news channels"
set category = "Ghost"
- var/datum/browser/popup = new(user, "ghost_news_list", "Chanenl List", 450, 600)
- popup.set_content(render_news_channel_list())
- popup.open()
+ var/datum/browser/B = new(src, "ghost_news_list", "Chanenl List", 450, 600)
+ B.set_content(render_news_channel_list())
+ B.open()
/mob/dead/observer/Topic(href, href_list)
. = ..()
@@ -15,7 +15,7 @@
render_news_channel(D)
/mob/dead/observer/proc/render_news_channel_list()
- var/datum/news_network = GLOB.news_network
+ var/datum/news_network/news_network = GLOB.news_network
var/list/content = list()
for(var/i in news_network.network_channels)
var/datum/news/feed_channel/FC = i
@@ -29,7 +29,8 @@
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.
"
+ content += "This channel is empty.
"
+ else
for(var/i in FC.messages)
var/datum/news/feed_message/FM = i
content += "-[FM.returnBody(-1)]
"
@@ -41,8 +42,8 @@
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/comment = i
+ for(var/c in FM.comments)
+ var/datum/news/feed_comment/comment = c
content += "[comment.body]
[comment.author] [comment.time_stamp]
"
if(FM.locked)
content += "Comments locked
"
From 3cd35787617485f86e2944bdf0ecee563896badb Mon Sep 17 00:00:00 2001
From: kevinz000 <2003111+kevinz000@users.noreply.github.com>
Date: Thu, 6 Feb 2020 00:44:28 -0700
Subject: [PATCH 018/123] wrong var
---
code/modules/newscaster/ghostread.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/newscaster/ghostread.dm b/code/modules/newscaster/ghostread.dm
index c9a44b8f58..77cb1a03c8 100644
--- a/code/modules/newscaster/ghostread.dm
+++ b/code/modules/newscaster/ghostread.dm
@@ -37,7 +37,7 @@
if(FM.img)
src << browse_rsc(FM.img, "tmp_photo[i].png")
content += "
"
- if(FC.caption)
+ if(FM.caption)
content += "[FM.caption]
"
content += "
"
content += "\[Story by [FM.returnAuthor(-1)] \] - ([FM.time_stamp])
"
From 3a2eb8c1ad4ef84128c5eeec3a1a79c398faf883 Mon Sep 17 00:00:00 2001
From: Ghom <42542238+Ghommie@users.noreply.github.com>
Date: Sun, 9 Feb 2020 22:50:43 +0100
Subject: [PATCH 019/123] Update experimental_dissection.dm
---
code/modules/surgery/experimental_dissection.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/surgery/experimental_dissection.dm b/code/modules/surgery/experimental_dissection.dm
index 2e9c1c8766..a94abafe4c 100644
--- a/code/modules/surgery/experimental_dissection.dm
+++ b/code/modules/surgery/experimental_dissection.dm
@@ -24,7 +24,7 @@
/datum/surgery_step/dissection
name = "dissection"
- implements = list(/obj/item/scalpel/augment = 100, /obj/item/scalpel/advanced = 99, /obj/item/scalpel = 90, /obj/item/kitchen/knife = 45, /obj/item/shard = 25)// special tools not only cut down time but also improve probability, doesn't use TOOL_SCALPEL because different scalpels have different probs
+ implements = list(/obj/item/scalpel/alien = 100, /obj/item/scalpel/advanced = 99, /obj/item/scalpel = 90, /obj/item/kitchen/knife = 45, /obj/item/shard = 25)// special tools not only cut down time but also improve probability, doesn't use TOOL_SCALPEL because different scalpels have different probs
time = 100
silicons_obey_prob = TRUE
repeatable = TRUE
From c5bbce09287955c200320b4d634f863f74e5adc7 Mon Sep 17 00:00:00 2001
From: Linzolle
Date: Sun, 9 Feb 2020 18:36:36 -0600
Subject: [PATCH 020/123] add the BOW
---
code/game/objects/items/storage/belt.dm | 15 +++++++++++++++
icons/mob/back.dmi | Bin 99516 -> 100372 bytes
icons/mob/belt.dmi | Bin 19659 -> 19900 bytes
icons/obj/clothing/belts.dmi | Bin 12732 -> 13099 bytes
icons/obj/storage.dmi | Bin 72459 -> 71397 bytes
tgstation.dme | 4 ++++
6 files changed, 19 insertions(+)
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index 082cbe245d..1be9df5c30 100755
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -612,6 +612,21 @@
/obj/item/ammo_casing
))
+/obj/item/storage/belt/quiver
+ name = "leather quiver"
+ desc = "A quiver made from the hide of some animal. Used to hold arrows."
+ icon_state = "quiver"
+ item_state = "quiver"
+
+/obj/item/storage/belt/quiver/ComponentInitialize()
+ . = ..()
+ var/datum/component/storage/STR = GetComponent(/datum/component/storage)
+ STR.max_items = 15
+ STR.display_numerical_stacking = TRUE
+ STR.can_hold = typecacheof(list(
+ /obj/item/ammo_casing/caseless/arrow
+ ))
+
/obj/item/storage/belt/medolier
name = "medolier"
desc = "A medical bandolier for holding smartdarts."
diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi
index 26f81b70df8aea4933205e22b563896cc7a5df41..7a2882790336d8b3a09057cf678e82aad792afbf 100644
GIT binary patch
delta 37154
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