"
+ 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 030/342] 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 031/342] 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 032/342] 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 033/342] 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 034/342] 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 0703c6eea62559c983c1d3c963b593f472440760 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Thu, 6 Feb 2020 22:34:54 +0100
Subject: [PATCH 035/342] First tweak to cargo reagents selling.
---
code/__DEFINES/reagents.dm | 5 +++++
code/game/objects/effects/decals/cleanable.dm | 2 +-
code/game/objects/effects/effect_system/effects_foam.dm | 2 +-
code/game/objects/effects/effect_system/effects_smoke.dm | 2 +-
code/game/objects/items/airlock_painter.dm | 2 +-
code/game/objects/items/cigs_lighters.dm | 4 ++--
code/game/objects/items/crayons.dm | 4 ++--
code/game/objects/items/mop.dm | 2 +-
code/modules/cargo/exports.dm | 4 ++--
code/modules/food_and_drinks/drinks/drinks.dm | 1 +
code/modules/food_and_drinks/food.dm | 1 +
code/modules/food_and_drinks/food/snacks.dm | 4 ++--
code/modules/hydroponics/grown.dm | 1 +
code/modules/hydroponics/growninedible.dm | 2 +-
code/modules/mob/living/carbon/carbon.dm | 2 +-
.../mob/living/simple_animal/friendly/farm_animals.dm | 2 +-
code/modules/mob/living/simple_animal/slime/slime.dm | 2 +-
.../projectiles/projectile/bullets/dart_syringe.dm | 2 +-
code/modules/reagents/chemistry/holder.dm | 8 +++++---
code/modules/reagents/reagent_containers.dm | 5 +++--
code/modules/reagents/reagent_containers/borghydro.dm | 1 +
code/modules/reagents/reagent_containers/dropper.dm | 2 +-
code/modules/reagents/reagent_containers/rags.dm | 1 +
code/modules/reagents/reagent_containers/spray.dm | 2 +-
code/modules/shuttle/supply.dm | 2 +-
modular_citadel/code/modules/arousal/genitals.dm | 4 ++--
26 files changed, 41 insertions(+), 28 deletions(-)
diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm
index d08344cc96..97ae7b8e95 100644
--- a/code/__DEFINES/reagents.dm
+++ b/code/__DEFINES/reagents.dm
@@ -22,6 +22,11 @@
// Is an open container for all intents and purposes.
#define OPENCONTAINER (REFILLABLE | DRAINABLE | TRANSPARENT)
+//reagents_value defines, for cargo stuff.
+#define DEFAULT_REAGENTS_VALUE 1
+#define NO_REAGENTS_VALUE 0
+#define HARVEST_REAGENTS_VALUE 0.3
+
#define TOUCH 1 // splashing
#define INGEST 2 // ingestion
diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm
index 30e7c8be05..5720d5ce34 100644
--- a/code/game/objects/effects/decals/cleanable.dm
+++ b/code/game/objects/effects/decals/cleanable.dm
@@ -11,7 +11,7 @@
LAZYINITLIST(blood_DNA) //Kinda needed
if (random_icon_states && (icon_state == initial(icon_state)) && length(random_icon_states) > 0)
icon_state = pick(random_icon_states)
- create_reagents(300)
+ create_reagents(300, NONE, NO_REAGENTS_VALUE)
if(loc && isturf(loc))
for(var/obj/effect/decal/cleanable/C in loc)
if(C != src && C.type == type && !QDELETED(C))
diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm
index 38a1a6089e..f98b4937ef 100644
--- a/code/game/objects/effects/effect_system/effects_foam.dm
+++ b/code/game/objects/effects/effect_system/effects_foam.dm
@@ -94,7 +94,7 @@
/obj/effect/particle_effect/foam/Initialize()
. = ..()
MakeSlippery()
- create_reagents(1000) //limited by the size of the reagent holder anyway.
+ create_reagents(1000, NONE, NO_REAGENTS_VALUE) //limited by the size of the reagent holder anyway.
START_PROCESSING(SSfastprocess, src)
playsound(src, 'sound/effects/bubbles2.ogg', 80, 1, -3)
diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm
index 40452f68e2..80c0db2b7d 100644
--- a/code/game/objects/effects/effect_system/effects_smoke.dm
+++ b/code/game/objects/effects/effect_system/effects_smoke.dm
@@ -32,7 +32,7 @@
/obj/effect/particle_effect/smoke/Initialize()
. = ..()
- create_reagents(500)
+ create_reagents(500, NONE, NO_REAGENTS_VALUE)
START_PROCESSING(SSobj, src)
diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm
index e63474dd6f..b7c76cad2d 100644
--- a/code/game/objects/items/airlock_painter.dm
+++ b/code/game/objects/items/airlock_painter.dm
@@ -67,7 +67,7 @@
L.Remove()
// make some colorful reagent, and apply it to the lungs
- L.create_reagents(10)
+ L.create_reagents(10, NONE, NO_REAGENTS_VALUE)
L.reagents.add_reagent(/datum/reagent/colorful_reagent, 10)
L.reagents.reaction(L, TOUCH, 1)
diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm
index 1186ea8001..cd163e90a4 100644
--- a/code/game/objects/items/cigs_lighters.dm
+++ b/code/game/objects/items/cigs_lighters.dm
@@ -122,7 +122,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/clothing/mask/cigarette/Initialize()
. = ..()
- create_reagents(chem_volume, INJECTABLE | NO_REACT) // so it doesn't react until you light it
+ create_reagents(chem_volume, INJECTABLE | NO_REACT, NO_REAGENTS_VALUE) // so it doesn't react until you light it
if(list_reagents)
reagents.add_reagent_list(list_reagents)
if(starts_lit)
@@ -717,7 +717,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/clothing/mask/vape/Initialize(mapload, param_color)
. = ..()
- create_reagents(chem_volume, NO_REACT) // so it doesn't react until you light it
+ create_reagents(chem_volume, NO_REACT, NO_REAGENTS_VALUE) // so it doesn't react until you light it
reagents.add_reagent(/datum/reagent/drug/nicotine, 50)
if(!icon_state)
if(!param_color)
diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm
index 81c5083ef7..2e80325d9f 100644
--- a/code/game/objects/items/crayons.dm
+++ b/code/game/objects/items/crayons.dm
@@ -96,7 +96,7 @@
charges_left = charges
if(!reagents)
- create_reagents(charges_left * volume_multiplier)
+ create_reagents(charges_left * volume_multiplier, NONE, NO_REAGENTS_VALUE)
reagents.clear_reagents()
var/total_weight = 0
@@ -619,7 +619,7 @@
is_capped = TRUE
self_contained = FALSE // Don't disappear when they're empty
can_change_colour = TRUE
-
+
reagent_contents = list(/datum/reagent/fuel = 1, /datum/reagent/consumable/ethanol = 1)
pre_noise = TRUE
diff --git a/code/game/objects/items/mop.dm b/code/game/objects/items/mop.dm
index a8b28f2544..233eabd4ca 100644
--- a/code/game/objects/items/mop.dm
+++ b/code/game/objects/items/mop.dm
@@ -21,7 +21,7 @@
/obj/item/mop/New()
..()
- create_reagents(mopcap)
+ create_reagents(mopcap, NONE, NO_REAGENTS_VALUE)
/obj/item/mop/proc/clean(turf/A)
diff --git a/code/modules/cargo/exports.dm b/code/modules/cargo/exports.dm
index fca10ac01c..bb90fa717a 100644
--- a/code/modules/cargo/exports.dm
+++ b/code/modules/cargo/exports.dm
@@ -49,13 +49,13 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they
sold = E.sell_object(thing, report, dry_run, allowed_categories , apply_elastic)
report.exported_atoms += " [thing.name]"
break
- if(thing.reagents)
+ if(thing.reagents?.value_multiplier)
for(var/A in thing.reagents.reagent_list)
var/datum/reagent/R = A
if(!R.value)
continue
report.reagents_volume[R.name] += R.volume
- report.reagents_value[R.name] += R.volume * R.value
+ report.reagents_value[R.name] += round(R.volume * R.value * thing.reagents.value_multiplier)
if(!dry_run && (sold || delete_unsold))
if(ismob(thing))
thing.investigate_log("deleted through cargo export",INVESTIGATE_CARGO)
diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm
index cd5c9d850b..7ac815dbab 100644
--- a/code/modules/food_and_drinks/drinks/drinks.dm
+++ b/code/modules/food_and_drinks/drinks/drinks.dm
@@ -9,6 +9,7 @@
lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi'
reagent_flags = OPENCONTAINER
+ reagent_value = DEFAULT_REAGENTS_VALUE
var/gulp_size = 5 //This is now officially broken ... need to think of a nice way to fix it.
possible_transfer_amounts = list(5,10,15,20,25,30,50)
volume = 50
diff --git a/code/modules/food_and_drinks/food.dm b/code/modules/food_and_drinks/food.dm
index 6d3f007fd9..2af24080cb 100644
--- a/code/modules/food_and_drinks/food.dm
+++ b/code/modules/food_and_drinks/food.dm
@@ -12,6 +12,7 @@
possible_transfer_amounts = list()
volume = 50 //Sets the default container amount for all food items.
reagent_flags = INJECTABLE
+ reagent_value = NO_REAGENTS_VALUE
resistance_flags = FLAMMABLE
var/foodtype = NONE
var/last_check_time
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index c068c1aa40..796648bf73 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -245,7 +245,7 @@ All foods are distributed among various categories. Use common sense.
return TRUE
/obj/item/reagent_containers/food/snacks/proc/initialize_slice(obj/item/reagent_containers/food/snacks/slice, reagents_per_slice)
- slice.create_reagents(slice.volume)
+ slice.create_reagents(slice.volume, reagent_flags, reagent_value)
reagents.trans_to(slice,reagents_per_slice)
if(name != initial(name))
slice.name = "slice of [name]"
@@ -279,7 +279,7 @@ All foods are distributed among various categories. Use common sense.
// initialize_cooked_food() is called when microwaving the food
/obj/item/reagent_containers/food/snacks/proc/initialize_cooked_food(obj/item/reagent_containers/food/snacks/S, cooking_efficiency = 1)
- S.create_reagents(S.volume)
+ S.create_reagents(S.volume, reagent_flags, reagent_value)
if(reagents)
reagents.trans_to(S, reagents.total_volume)
if(S.bonus_reagents && S.bonus_reagents.len)
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index f99cfde92d..65d942ca2b 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -15,6 +15,7 @@
// Saves us from having to define each stupid grown's dried_type as itself.
// If you don't want a plant to be driable (watermelons) set this to null in the time definition.
resistance_flags = FLAMMABLE
+ reagent_value = HARVEST_REAGENTS_VALUE
var/dry_grind = FALSE //If TRUE, this object needs to be dry to be ground up
var/can_distill = TRUE //If FALSE, this object cannot be distilled into an alcohol.
var/distill_reagent //If NULL and this object can be distilled, it uses a generic fruit_wine reagent and adjusts its variables.
diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm
index ef925e3965..f4859ffb1e 100644
--- a/code/modules/hydroponics/growninedible.dm
+++ b/code/modules/hydroponics/growninedible.dm
@@ -11,7 +11,7 @@
/obj/item/grown/Initialize(newloc, obj/item/seeds/new_seed)
. = ..()
- create_reagents(50)
+ create_reagents(50, NONE, HARVEST_REAGENTS_VALUE)
if(new_seed)
seed = new_seed.Copy()
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index ef33afec25..6460d8331d 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -3,7 +3,7 @@
/mob/living/carbon/Initialize()
. = ..()
- create_reagents(1000)
+ create_reagents(1000, NONE, NO_REAGENTS_VALUE)
update_body_parts() //to update the carbon's new bodyparts appearance
GLOB.carbon_list += src
blood_volume = (BLOOD_VOLUME_NORMAL * blood_ratio)
diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
index 38bcfbde79..b66bedb887 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -454,7 +454,7 @@
name = "udder"
/obj/item/udder/Initialize()
- create_reagents(50)
+ create_reagents(50, NONE, NO_REAGENTS_VALUE)
reagents.add_reagent(/datum/reagent/consumable/milk, 20)
. = ..()
diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm
index 5a1a794d4e..2ea2a412f8 100644
--- a/code/modules/mob/living/simple_animal/slime/slime.dm
+++ b/code/modules/mob/living/simple_animal/slime/slime.dm
@@ -97,7 +97,7 @@
else
var/datum/action/innate/slime/evolve/E = new
E.Grant(src)
- create_reagents(100)
+ create_reagents(100, NONE, NO_REAGENTS_VALUE)
set_colour(new_colour)
. = ..()
nutrition = 700
diff --git a/code/modules/projectiles/projectile/bullets/dart_syringe.dm b/code/modules/projectiles/projectile/bullets/dart_syringe.dm
index 3f418df75b..b5a9eb8d69 100644
--- a/code/modules/projectiles/projectile/bullets/dart_syringe.dm
+++ b/code/modules/projectiles/projectile/bullets/dart_syringe.dm
@@ -6,7 +6,7 @@
/obj/item/projectile/bullet/dart/Initialize()
. = ..()
- create_reagents(50, NO_REACT)
+ create_reagents(50, NO_REACT, NO_REAGENTS_VALUE)
/obj/item/projectile/bullet/dart/on_hit(atom/target, blocked = FALSE, skip = FALSE)
if(iscarbon(target))
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index 95e104ba68..4c240660a9 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -61,8 +61,9 @@
var/reactedVol = 0 //how much of the reagent is reacted during a fermireaction
var/fermiIsReacting = FALSE //that prevents multiple reactions from occurring (i.e. add_reagent calls to process_reactions(), this stops any extra reactions.)
var/fermiReactID //instance of the chem reaction used during a fermireaction, kept here so it's cache isn't lost between loops/procs.
+ var/value_multiplier = DEFAULT_REAGENTS_VALUE //used for cargo reagents selling.
-/datum/reagents/New(maximum=100, new_flags)
+/datum/reagents/New(maximum=100, new_flags = NONE, new_value = DEFAULT_REAGENTS_VALUE)
maximum_volume = maximum
//I dislike having these here but map-objects are initialised before world/New() is called. >_>
@@ -72,6 +73,7 @@
build_chemical_reactions_list()
reagents_holder_flags = new_flags
+ value_multiplier = new_value
/datum/reagents/Destroy()
. = ..()
@@ -1147,10 +1149,10 @@
// Convenience proc to create a reagents holder for an atom
// Max vol is maximum volume of holder
-/atom/proc/create_reagents(max_vol, flags)
+/atom/proc/create_reagents(max_vol, flags, new_value)
if(reagents)
qdel(reagents)
- reagents = new/datum/reagents(max_vol, flags)
+ reagents = new/datum/reagents(max_vol, flags, new_value)
reagents.my_atom = src
/proc/get_random_reagent_id() // Returns a random reagent type minus blacklisted reagents
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index 23176f8a05..e0000c5748 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -7,7 +7,8 @@
var/amount_per_transfer_from_this = 5
var/list/possible_transfer_amounts = list(5,10,15,20,25,30)
var/volume = 30
- var/reagent_flags //used to determine the reagent holder flags on add_initial_reagents()
+ var/reagent_flags = NONE //used to determine the reagent holder flags on add_initial_reagents()
+ var/reagent_value = DEFAULT_REAGENTS_VALUE //same as above but for the holder value multiplier.
var/list/list_reagents = null
var/spawned_disease = null
var/disease_amount = 20
@@ -22,7 +23,7 @@
volume = vol
if(container_flags & APTFT_VERB && length(possible_transfer_amounts))
verbs += /obj/item/reagent_containers/proc/set_APTFT
- create_reagents(volume, reagent_flags)
+ create_reagents(volume, reagent_flags, reagent_value)
if(spawned_disease)
var/datum/disease/F = new spawned_disease()
var/list/data = list("blood_DNA" = "UNKNOWN DNA", "blood_type" = "SY","viruses"= list(F))
diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm
index 34dd97b0aa..73d0c5eafa 100644
--- a/code/modules/reagents/reagent_containers/borghydro.dm
+++ b/code/modules/reagents/reagent_containers/borghydro.dm
@@ -19,6 +19,7 @@ Borg Hypospray
amount_per_transfer_from_this = 5
volume = 30
possible_transfer_amounts = list()
+ reagent_value = NO_REAGENTS_VALUE
var/mode = 1
var/charge_cost = 50
var/charge_tick = 0
diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm
index 9feec362a4..4e1de85fce 100644
--- a/code/modules/reagents/reagent_containers/dropper.dm
+++ b/code/modules/reagents/reagent_containers/dropper.dm
@@ -44,7 +44,7 @@
if(safe_thing)
if(!safe_thing.reagents)
- safe_thing.create_reagents(100)
+ safe_thing.create_reagents(100, NONE, NO_REAGENTS_VALUE)
reagents.reaction(safe_thing, TOUCH, fraction)
trans = reagents.trans_to(safe_thing, amount_per_transfer_from_this)
diff --git a/code/modules/reagents/reagent_containers/rags.dm b/code/modules/reagents/reagent_containers/rags.dm
index 59c956acd6..8e6f5b9581 100644
--- a/code/modules/reagents/reagent_containers/rags.dm
+++ b/code/modules/reagents/reagent_containers/rags.dm
@@ -11,6 +11,7 @@
container_flags = APTFT_VERB
volume = 5
spillable = FALSE
+ reagent_value = NO_REAGENTS_VALUE
var/wipe_sound
var/soak_efficiency = 1
var/extinguish_efficiency = 0
diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index e8c8d14141..b2f7392704 100644
--- a/code/modules/reagents/reagent_containers/spray.dm
+++ b/code/modules/reagents/reagent_containers/spray.dm
@@ -68,7 +68,7 @@
/obj/item/reagent_containers/spray/proc/spray(atom/A)
var/range = CLAMP(get_dist(src, A), 1, current_range)
var/obj/effect/decal/chempuff/D = new /obj/effect/decal/chempuff(get_turf(src))
- D.create_reagents(amount_per_transfer_from_this)
+ D.create_reagents(amount_per_transfer_from_this, NONE, NO_REAGENTS_VALUE)
var/puff_reagent_left = range //how many turf, mob or dense objet we can react with before we consider the chem puff consumed
if(stream_mode)
reagents.trans_to(D, amount_per_transfer_from_this)
diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm
index 0e7cba9776..bdf6e8cc87 100644
--- a/code/modules/shuttle/supply.dm
+++ b/code/modules/shuttle/supply.dm
@@ -168,7 +168,7 @@ GLOBAL_LIST_INIT(cargo_shuttle_leave_behind_typecache, typecacheof(list(
for(var/chem in ex.reagents_value)
var/value = ex.reagents_value[chem]
- msg += "[value] credits: received [ex.reagents_volume[chem]]u of [chem].\n"
+ msg += "[value > 0 ? "+" : ""][value] credits: received [ex.reagents_volume[chem]]u of [chem].\n"
SSshuttle.points += value
msg = copytext_char(msg, 1, MAX_MESSAGE_LEN)
diff --git a/modular_citadel/code/modules/arousal/genitals.dm b/modular_citadel/code/modules/arousal/genitals.dm
index ca01ef46cb..6195f84259 100644
--- a/modular_citadel/code/modules/arousal/genitals.dm
+++ b/modular_citadel/code/modules/arousal/genitals.dm
@@ -23,7 +23,7 @@
/obj/item/organ/genital/Initialize(mapload, mob/living/carbon/human/H)
. = ..()
if(fluid_id)
- create_reagents(fluid_max_volume)
+ create_reagents(fluid_max_volume, NONE, NO_REAGENTS_VALUE)
if(CHECK_BITFIELD(genital_flags, GENITAL_FUID_PRODUCTION))
reagents.add_reagent(fluid_id, fluid_max_volume)
if(H)
@@ -357,7 +357,7 @@
genital_overlay.color = "#[H.dna.features["breasts_color"]]"
if("vag_color")
genital_overlay.color = "#[H.dna.features["vag_color"]]"
-
+
genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size]-s_[aroused_state]_[layertext]"
if(layer == GENITALS_FRONT_LAYER && CHECK_BITFIELD(G.genital_flags, GENITAL_THROUGH_CLOTHES))
From 04261345dd629fb8ef74f82f28be247604ba047c Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Thu, 6 Feb 2020 23:08:32 +0100
Subject: [PATCH 036/342] export scanners.
---
code/modules/cargo/export_scanner.dm | 2 ++
1 file changed, 2 insertions(+)
diff --git a/code/modules/cargo/export_scanner.dm b/code/modules/cargo/export_scanner.dm
index 9c523c194f..80fd05cf8c 100644
--- a/code/modules/cargo/export_scanner.dm
+++ b/code/modules/cargo/export_scanner.dm
@@ -36,6 +36,8 @@
var/price = 0
for(var/x in ex.total_amount)
price += ex.total_value[x]
+ for(var/x in ex.reagents_value)
+ price += ex.reagents_value[x]
if(price)
to_chat(user, "Scanned [O], value: [price] credits[O.contents.len ? " (contents included)" : ""].")
From 28df05bbb03dc2a19ec7a6601019d5b5185dfc80 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Fri, 7 Feb 2020 00:19:17 +0100
Subject: [PATCH 037/342] step 1
---
.../code/modules/arousal/genitals.dm | 97 +++++++++----------
1 file changed, 47 insertions(+), 50 deletions(-)
diff --git a/modular_citadel/code/modules/arousal/genitals.dm b/modular_citadel/code/modules/arousal/genitals.dm
index ca01ef46cb..0820a564ad 100644
--- a/modular_citadel/code/modules/arousal/genitals.dm
+++ b/modular_citadel/code/modules/arousal/genitals.dm
@@ -262,53 +262,21 @@
update_genitals()
/mob/living/carbon/human/proc/update_genitals()
- if(!QDELETED(src))
- dna.species.handle_genitals(src)
-
-//Checks to see if organs are new on the mob, and changes their colours so that they don't get crazy colours.
-/mob/living/carbon/human/proc/emergent_genital_call()
- if(!client.prefs.arousable)
- return FALSE
-
- var/organCheck = locate(/obj/item/organ/genital) in internal_organs
- var/breastCheck = getorganslot(ORGAN_SLOT_BREASTS)
- var/willyCheck = getorganslot(ORGAN_SLOT_PENIS)
-
- if(organCheck == FALSE)
- if(ishuman(src) && dna.species.id == "human")
- dna.features["genitals_use_skintone"] = TRUE
- dna.species.use_skintones = TRUE
- if(MUTCOLORS)
- if(src.dna.species.fixed_mut_color)
- dna.features["cock_color"] = "[dna.species.fixed_mut_color]"
- dna.features["breasts_color"] = "[dna.species.fixed_mut_color]"
- return
- //So people who haven't set stuff up don't get rainbow surprises.
- dna.features["cock_color"] = "[dna.features["mcolor"]]"
- dna.features["breasts_color"] = "[dna.features["mcolor"]]"
- else //If there's a new organ, make it the same colour.
- if(breastCheck == FALSE)
- dna.features["breasts_color"] = dna.features["cock_color"]
- else if (willyCheck == FALSE)
- dna.features["cock_color"] = dna.features["breasts_color"]
- return TRUE
-
-/datum/species/proc/handle_genitals(mob/living/carbon/human/H)//more like handle sadness
- if(!H)//no args
- CRASH("H = null")
- if(!LAZYLEN(H.internal_organs) || ((NOGENITALS in species_traits) && !H.genital_override) || HAS_TRAIT(H, TRAIT_HUSK))
+ if(QDELETED(src))
return
var/list/relevant_layers = list(GENITALS_BEHIND_LAYER, GENITALS_FRONT_LAYER)
-
for(var/L in relevant_layers) //Less hardcode
- H.remove_overlay(L)
- H.remove_overlay(GENITALS_EXPOSED_LAYER)
+ remove_overlay(L)
+ remove_overlay(GENITALS_EXPOSED_LAYER)
+ if(!LAZYLEN(internal_organs) || ((NOGENITALS in dna.species.species_traits) && !genital_override) || HAS_TRAIT(src, TRAIT_HUSK))
+ return
+
//start scanning for genitals
var/list/gen_index[GENITAL_LAYER_INDEX_LENGTH]
var/list/genitals_to_add
var/list/fully_exposed
- for(var/obj/item/organ/genital/G in H.internal_organs)
+ for(var/obj/item/organ/genital/G in internal_organs)
if(G.is_exposed()) //Checks appropriate clothing slot and if it's through_clothes
LAZYADD(gen_index[G.layer_index], G)
for(var/L in gen_index)
@@ -345,19 +313,19 @@
if(S.center)
genital_overlay = center_image(genital_overlay, S.dimension_x, S.dimension_y)
- if(use_skintones && H.dna.features["genitals_use_skintone"])
- genital_overlay.color = "#[skintone2hex(H.skin_tone)]"
+ if(use_skintones && dna.features["genitals_use_skintone"])
+ genital_overlay.color = "#[skintone2hex(skin_tone)]"
else
switch(S.color_src)
if("cock_color")
- genital_overlay.color = "#[H.dna.features["cock_color"]]"
+ genital_overlay.color = "#[dna.features["cock_color"]]"
if("balls_color")
- genital_overlay.color = "#[H.dna.features["balls_color"]]"
+ genital_overlay.color = "#[dna.features["balls_color"]]"
if("breasts_color")
- genital_overlay.color = "#[H.dna.features["breasts_color"]]"
+ genital_overlay.color = "#[dna.features["breasts_color"]]"
if("vag_color")
- genital_overlay.color = "#[H.dna.features["vag_color"]]"
-
+ genital_overlay.color = "#[dna.features["vag_color"]]"
+
genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size]-s_[aroused_state]_[layertext]"
if(layer == GENITALS_FRONT_LAYER && CHECK_BITFIELD(G.genital_flags, GENITAL_THROUGH_CLOTHES))
@@ -367,11 +335,40 @@
standing += genital_overlay
if(LAZYLEN(standing))
- H.overlays_standing[layer] = standing
+ overlays_standing[layer] = standing
if(LAZYLEN(fully_exposed))
- H.overlays_standing[GENITALS_EXPOSED_LAYER] = fully_exposed
- H.apply_overlay(GENITALS_EXPOSED_LAYER)
+ overlays_standing[GENITALS_EXPOSED_LAYER] = fully_exposed
+ apply_overlay(GENITALS_EXPOSED_LAYER)
for(var/L in relevant_layers)
- H.apply_overlay(L)
+ apply_overlay(L)
+
+
+//Checks to see if organs are new on the mob, and changes their colours so that they don't get crazy colours.
+/mob/living/carbon/human/proc/emergent_genital_call()
+ if(!client.prefs.arousable)
+ return FALSE
+
+ var/organCheck = locate(/obj/item/organ/genital) in internal_organs
+ var/breastCheck = getorganslot(ORGAN_SLOT_BREASTS)
+ var/willyCheck = getorganslot(ORGAN_SLOT_PENIS)
+
+ if(organCheck == FALSE)
+ if(ishuman(src) && dna.species.id == "human")
+ dna.features["genitals_use_skintone"] = TRUE
+ dna.species.use_skintones = TRUE
+ if(MUTCOLORS)
+ if(src.dna.species.fixed_mut_color)
+ dna.features["cock_color"] = "[dna.species.fixed_mut_color]"
+ dna.features["breasts_color"] = "[dna.species.fixed_mut_color]"
+ return
+ //So people who haven't set stuff up don't get rainbow surprises.
+ dna.features["cock_color"] = "[dna.features["mcolor"]]"
+ dna.features["breasts_color"] = "[dna.features["mcolor"]]"
+ else //If there's a new organ, make it the same colour.
+ if(breastCheck == FALSE)
+ dna.features["breasts_color"] = dna.features["cock_color"]
+ else if (willyCheck == FALSE)
+ dna.features["cock_color"] = dna.features["breasts_color"]
+ return TRUE
From 39d6980bab35c231c7cd4f144f5988cb0dad6dd0 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Fri, 7 Feb 2020 01:03:59 +0100
Subject: [PATCH 038/342] genitals code is so bad.
---
.../code/modules/arousal/arousal.dm | 6 ----
.../code/modules/arousal/genitals.dm | 32 ++++++++-----------
.../code/modules/arousal/organs/breasts.dm | 1 -
.../code/modules/arousal/organs/penis.dm | 2 +-
4 files changed, 15 insertions(+), 26 deletions(-)
diff --git a/modular_citadel/code/modules/arousal/arousal.dm b/modular_citadel/code/modules/arousal/arousal.dm
index 3a586d061d..c23bef9a7d 100644
--- a/modular_citadel/code/modules/arousal/arousal.dm
+++ b/modular_citadel/code/modules/arousal/arousal.dm
@@ -10,12 +10,6 @@
var/hidden_undershirt = FALSE
var/hidden_socks = FALSE
-//Species vars
-/datum/species
- var/list/cum_fluids = list("semen")
- var/list/milk_fluids = list("milk")
- var/list/femcum_fluids = list("femcum")
-
//Mob procs
/mob/living/carbon/human/proc/underwear_toggle()
set name = "Toggle undergarments"
diff --git a/modular_citadel/code/modules/arousal/genitals.dm b/modular_citadel/code/modules/arousal/genitals.dm
index 0820a564ad..7231b536ea 100644
--- a/modular_citadel/code/modules/arousal/genitals.dm
+++ b/modular_citadel/code/modules/arousal/genitals.dm
@@ -32,23 +32,18 @@
else
update()
-/obj/item/organ/genital/Destroy()
- if(linked_organ)
- update_link(TRUE)//this should remove any other links it has
- return ..()
-
/obj/item/organ/genital/proc/set_aroused_state(new_state)
if(!((HAS_TRAIT(owner,TRAIT_PERMABONER) && !new_state) || HAS_TRAIT(owner,TRAIT_NEVERBONER) && new_state))
aroused_state = new_state
return aroused_state
-/obj/item/organ/genital/proc/update(removing = FALSE)
+/obj/item/organ/genital/proc/update()
if(QDELETED(src))
return
update_size()
update_appearance()
- if(linked_organ_slot || (linked_organ && removing))
- update_link(removing)
+ if(linked_organ_slot || (linked_organ && !owner))
+ update_link()
//exposure and through-clothing code
/mob/living/carbon
@@ -174,19 +169,18 @@
return TRUE
return FALSE
-/obj/item/organ/genital/proc/update_link(removing = FALSE)
- if(!removing && owner)
+/obj/item/organ/genital/proc/update_link()
+ if(owner)
if(linked_organ)
- return
+ return FALSE
linked_organ = owner.getorganslot(linked_organ_slot)
if(linked_organ)
linked_organ.linked_organ = src
linked_organ.upon_link()
upon_link()
return TRUE
- else
- if(linked_organ)
- linked_organ.linked_organ = null
+ if(linked_organ)
+ linked_organ.linked_organ = null
linked_organ = null
return FALSE
@@ -200,10 +194,12 @@
update()
RegisterSignal(owner, COMSIG_MOB_DEATH, .proc/update_appearance)
-/obj/item/organ/genital/Remove(mob/living/carbon/M, special = FALSE, drop_if_replaced = TRUE)
- update(TRUE)
- if(!QDELETED(owner))
- UnregisterSignal(owner, COMSIG_MOB_DEATH)
+/obj/item/organ/genital/Remove(special = FALSE)
+ var/mob/living/carbon/human/H = . = ..()
+ update()
+ if(!QDELETED(H))
+ UnregisterSignal(H, COMSIG_MOB_DEATH)
+ H.update_genitals()
//proc to give a player their genitals and stuff when they log in
/mob/living/carbon/human/proc/give_genitals(clean = FALSE)//clean will remove all pre-existing genitals. proc will then give them any genitals that are enabled in their DNA
diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm
index 1537d5cebe..fa1a48b17d 100644
--- a/modular_citadel/code/modules/arousal/organs/breasts.dm
+++ b/modular_citadel/code/modules/arousal/organs/breasts.dm
@@ -63,7 +63,6 @@
var/mob/living/carbon/human/H = owner
icon_state = sanitize_text(string)
H.update_genitals()
- icon_state = sanitize_text(string)
//Allows breasts to grow and change size, with sprite changes too.
//maximum wah
diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm
index c6d3c764ac..a8d1a67b19 100644
--- a/modular_citadel/code/modules/arousal/organs/penis.dm
+++ b/modular_citadel/code/modules/arousal/organs/penis.dm
@@ -14,7 +14,7 @@
size = 2 //arbitrary value derived from length and girth for sprites.
layer_index = PENIS_LAYER_INDEX
var/length = 6 //inches
- var/prev_length = 6 //really should be renamed to prev_length
+ var/prev_length = 6
var/girth = 4.38
var/girth_ratio = COCK_GIRTH_RATIO_DEF //0.73; check citadel_defines.dm
From 00042292cf3ac17fdfdec9f35f864eb7301b1d6c Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Fri, 7 Feb 2020 01:14:19 +0100
Subject: [PATCH 039/342] Byond is pretty special.
---
modular_citadel/code/modules/arousal/genitals.dm | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/modular_citadel/code/modules/arousal/genitals.dm b/modular_citadel/code/modules/arousal/genitals.dm
index 7231b536ea..001a4932d8 100644
--- a/modular_citadel/code/modules/arousal/genitals.dm
+++ b/modular_citadel/code/modules/arousal/genitals.dm
@@ -195,7 +195,8 @@
RegisterSignal(owner, COMSIG_MOB_DEATH, .proc/update_appearance)
/obj/item/organ/genital/Remove(special = FALSE)
- var/mob/living/carbon/human/H = . = ..()
+ . = ..()
+ var/mob/living/carbon/human/H = .
update()
if(!QDELETED(H))
UnregisterSignal(H, COMSIG_MOB_DEATH)
From 7f431af99d07df228c5c82955341b79e7223d109 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Fri, 7 Feb 2020 01:33:47 +0100
Subject: [PATCH 040/342] Ok
---
.../code/modules/arousal/genitals.dm | 17 ++++++++---------
1 file changed, 8 insertions(+), 9 deletions(-)
diff --git a/modular_citadel/code/modules/arousal/genitals.dm b/modular_citadel/code/modules/arousal/genitals.dm
index 001a4932d8..087b45cbb5 100644
--- a/modular_citadel/code/modules/arousal/genitals.dm
+++ b/modular_citadel/code/modules/arousal/genitals.dm
@@ -235,12 +235,6 @@
/obj/item/organ/genital/proc/get_features(mob/living/carbon/human/H)
return
-/datum/species/proc/genitals_layertext(layer)
- switch(layer)
- if(GENITALS_BEHIND_LAYER)
- return "BEHIND"
- if(GENITALS_FRONT_LAYER)
- return "FRONT"
//procs to handle sprite overlays being applied to humans
@@ -261,7 +255,12 @@
/mob/living/carbon/human/proc/update_genitals()
if(QDELETED(src))
return
- var/list/relevant_layers = list(GENITALS_BEHIND_LAYER, GENITALS_FRONT_LAYER)
+ var/static/list/relevant_layers
+ if(!relevant_layers)
+ relevant_layers = list()
+ relevant_layers[GENITALS_BEHIND_LAYER] = "BEHIND"
+ relevant_layers[GENITALS_FRONT_LAYER] = "FRONT"
+ var/static/list/layer_strings = list
for(var/L in relevant_layers) //Less hardcode
remove_overlay(L)
remove_overlay(GENITALS_EXPOSED_LAYER)
@@ -285,7 +284,7 @@
//start applying overlays
for(var/layer in relevant_layers)
var/list/standing = list()
- var/layertext = genitals_layertext(layer)
+ var/layertext = relevant_layers[layer]
for(var/A in genitals_to_add)
var/obj/item/organ/genital/G = A
var/datum/sprite_accessory/S
@@ -310,7 +309,7 @@
if(S.center)
genital_overlay = center_image(genital_overlay, S.dimension_x, S.dimension_y)
- if(use_skintones && dna.features["genitals_use_skintone"])
+ if(dna.species.use_skintones && dna.features["genitals_use_skintone"])
genital_overlay.color = "#[skintone2hex(skin_tone)]"
else
switch(S.color_src)
From 2370de52f9d80201821819753a70efcceeaa7a68 Mon Sep 17 00:00:00 2001
From: Ghom <42542238+Ghommie@users.noreply.github.com>
Date: Fri, 7 Feb 2020 02:46:15 +0100
Subject: [PATCH 041/342] Update genitals.dm
---
modular_citadel/code/modules/arousal/genitals.dm | 1 -
1 file changed, 1 deletion(-)
diff --git a/modular_citadel/code/modules/arousal/genitals.dm b/modular_citadel/code/modules/arousal/genitals.dm
index 087b45cbb5..d457bcd128 100644
--- a/modular_citadel/code/modules/arousal/genitals.dm
+++ b/modular_citadel/code/modules/arousal/genitals.dm
@@ -260,7 +260,6 @@
relevant_layers = list()
relevant_layers[GENITALS_BEHIND_LAYER] = "BEHIND"
relevant_layers[GENITALS_FRONT_LAYER] = "FRONT"
- var/static/list/layer_strings = list
for(var/L in relevant_layers) //Less hardcode
remove_overlay(L)
remove_overlay(GENITALS_EXPOSED_LAYER)
From 2d8f85d810dc77928ceb25442c0389cc351b4de9 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Fri, 7 Feb 2020 02:59:59 +0100
Subject: [PATCH 042/342] A few nuisances solved.
---
code/modules/mob/dead/observer/observer.dm | 3 ++-
modular_citadel/code/modules/mob/cit_emotes.dm | 10 ++++------
2 files changed, 6 insertions(+), 7 deletions(-)
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 3559edc0fb..00d6d3cc70 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -310,8 +310,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
var/obj/machinery/cryopod/C = loc
C.despawn_occupant()
else
- ghostize(0, penalize = TRUE, voluntary = TRUE) //0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3
suicide_log(TRUE)
+ ghostize(FALSE, penalize = TRUE, voluntary = TRUE) //FALSE parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3
+
/mob/camera/verb/ghost()
set category = "OOC"
diff --git a/modular_citadel/code/modules/mob/cit_emotes.dm b/modular_citadel/code/modules/mob/cit_emotes.dm
index d0ad0d3232..62570e7bf3 100644
--- a/modular_citadel/code/modules/mob/cit_emotes.dm
+++ b/modular_citadel/code/modules/mob/cit_emotes.dm
@@ -15,12 +15,10 @@
/datum/emote/living/insult/run_emote(mob/living/user, params)
var/insult_message = ""
- var/miming = user.mind ? user.mind.miming : 0
- if(!user.is_muzzled())
- insult_message += pick_list_replacements(INSULTS_FILE, "insult_gen")
- message = insult_message
- else if(miming)
+ if(user.mind?.miming)
message = "creatively gesticulates."
+ else if(!user.is_muzzled())
+ message = pick_list_replacements(INSULTS_FILE, "insult_gen")
else
message = "muffles something."
. = ..()
@@ -36,7 +34,7 @@
sound = 'modular_citadel/sound/voice/scream_silicon.ogg'
if(iscyborg(user))
var/mob/living/silicon/robot/S = user
- if(S.cell.charge < 20)
+ if(S.cell?.charge < 20)
to_chat(S, "Scream module deactivated. Please recharge.")
return
S.cell.use(200)
From 86c472eaf60f6d7283bf4edc74f356f7b81d8d98 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Fri, 7 Feb 2020 03:17:00 +0100
Subject: [PATCH 043/342] the holopad fix.
---
code/datums/holocall.dm | 12 ++++++------
code/game/machinery/computer/camera_advanced.dm | 9 ++++++---
2 files changed, 12 insertions(+), 9 deletions(-)
diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm
index 72fe6f5a1c..e0b0072808 100644
--- a/code/datums/holocall.dm
+++ b/code/datums/holocall.dm
@@ -12,7 +12,12 @@
/mob/camera/aiEye/remote/holo/setLoc()
. = ..()
var/obj/machinery/holopad/H = origin
- H.move_hologram(eye_user, loc)
+ H?.move_hologram(eye_user, loc)
+
+/obj/machinery/holopad/remove_eye_control(mob/living/user)
+ if(user.client)
+ user.reset_perspective(null)
+ user.remote_control = null
//this datum manages it's own references
@@ -54,11 +59,6 @@
/datum/holocall/Destroy()
QDEL_NULL(hangup)
- var/user_good = !QDELETED(user)
- if(user_good)
- user.reset_perspective()
- user.remote_control = null
-
if(!QDELETED(eye))
QDEL_NULL(eye)
diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm
index 8de470fdb8..e5ac9a0f78 100644
--- a/code/game/machinery/computer/camera_advanced.dm
+++ b/code/game/machinery/computer/camera_advanced.dm
@@ -47,7 +47,10 @@
jump_action.Grant(user)
actions += jump_action
-/obj/machinery/computer/camera_advanced/proc/remove_eye_control(mob/living/user)
+/obj/machinery/proc/remove_eye_control(mob/living/user)
+ CRASH("[type] does not implement ai eye handling")
+
+/obj/machinery/computer/camera_advanced/remove_eye_control(mob/living/user)
if(!user)
return
for(var/V in actions)
@@ -157,7 +160,7 @@
var/cooldown = 0
var/acceleration = 1
var/mob/living/eye_user = null
- var/obj/machinery/computer/camera_advanced/origin
+ var/obj/machinery/origin
var/eye_initialized = 0
var/visible_icon = 0
var/image/user_image = null
@@ -170,7 +173,7 @@
/mob/camera/aiEye/remote/Destroy()
if(origin && eye_user)
- origin.remove_eye_control(eye_user)
+ origin.remove_eye_control(eye_user,src)
origin = null
. = ..()
eye_user = null
From f38e69467326e99bc654d4a41291c1d007e1c004 Mon Sep 17 00:00:00 2001
From: Ghom <42542238+Ghommie@users.noreply.github.com>
Date: Fri, 7 Feb 2020 03:42:08 +0100
Subject: [PATCH 044/342] Does it work? Yes. Does it compile? No.
---
modular_citadel/code/modules/mob/cit_emotes.dm | 1 -
1 file changed, 1 deletion(-)
diff --git a/modular_citadel/code/modules/mob/cit_emotes.dm b/modular_citadel/code/modules/mob/cit_emotes.dm
index 62570e7bf3..2be83733e5 100644
--- a/modular_citadel/code/modules/mob/cit_emotes.dm
+++ b/modular_citadel/code/modules/mob/cit_emotes.dm
@@ -14,7 +14,6 @@
emote_type = EMOTE_AUDIBLE
/datum/emote/living/insult/run_emote(mob/living/user, params)
- var/insult_message = ""
if(user.mind?.miming)
message = "creatively gesticulates."
else if(!user.is_muzzled())
From 83a08ee9f54d2cf7d0e15df08f19dab5d7b76def Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Fri, 7 Feb 2020 05:21:08 +0100
Subject: [PATCH 045/342] Extras and tg#45018
---
code/modules/food_and_drinks/food/snacks.dm | 7 ++++---
code/modules/projectiles/guns/energy/dueling.dm | 4 ++--
2 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index c068c1aa40..aa76a81c7e 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -71,10 +71,11 @@ All foods are distributed among various categories. Use common sense.
if(!eater)
return
if(!reagents.total_volume)
- var/obj/item/trash_item = generate_trash(eater)
+ var/mob/living/location = loc
+ var/obj/item/trash_item = generate_trash(location)
qdel(src)
- eater.put_in_hands(trash_item)
-
+ if(istype(location))
+ location.put_in_hands(trash_item)
/obj/item/reagent_containers/food/snacks/attack_self(mob/user)
return
diff --git a/code/modules/projectiles/guns/energy/dueling.dm b/code/modules/projectiles/guns/energy/dueling.dm
index 6fe10eb3b6..615bb5d939 100644
--- a/code/modules/projectiles/guns/energy/dueling.dm
+++ b/code/modules/projectiles/guns/energy/dueling.dm
@@ -320,10 +320,10 @@
if(C.setting == counter_setting)
return BULLET_ACT_BLOCK
- var/mob/living/L = target
- if(!istype(target))
+ if(!isliving(target))
return BULLET_ACT_BLOCK
+ var/mob/living/L = target
switch(hugbox)
if(DUEL_HUGBOX_NONE)
var/obj/item/bodypart/B = L.get_bodypart(BODY_ZONE_HEAD)
From b5d6afac9a060fbddcd6d956d9dd454a6baeefa3 Mon Sep 17 00:00:00 2001
From: kevinz000 <2003111+kevinz000@users.noreply.github.com>
Date: Fri, 7 Feb 2020 03:20:45 -0700
Subject: [PATCH 046/342] Update gravity.dm
---
code/modules/projectiles/ammunition/energy/gravity.dm | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/code/modules/projectiles/ammunition/energy/gravity.dm b/code/modules/projectiles/ammunition/energy/gravity.dm
index eabb4f66d7..be7b618803 100644
--- a/code/modules/projectiles/ammunition/energy/gravity.dm
+++ b/code/modules/projectiles/ammunition/energy/gravity.dm
@@ -15,15 +15,15 @@
. = ..()
/obj/item/ammo_casing/energy/gravity/repulse
- projectile_type = /obj/item/projectile/gravityrepulse
+ projectile_type = /obj/item/projectile/gravity/repulse
select_name = "repulse"
/obj/item/ammo_casing/energy/gravity/attract
- projectile_type = /obj/item/projectile/gravityattract
+ projectile_type = /obj/item/projectile/gravity/attract
select_name = "attract"
/obj/item/ammo_casing/energy/gravity/chaos
- projectile_type = /obj/item/projectile/gravitychaos
+ projectile_type = /obj/item/projectile/gravity/chaos
select_name = "chaos"
From 673079f99568238e31e8b958d8a06b3bd3e613aa Mon Sep 17 00:00:00 2001
From: kevinz000 <2003111+kevinz000@users.noreply.github.com>
Date: Fri, 7 Feb 2020 03:31:15 -0700
Subject: [PATCH 047/342] Update gravity.dm
---
.../projectiles/projectile/special/gravity.dm | 141 ++++++++----------
1 file changed, 62 insertions(+), 79 deletions(-)
diff --git a/code/modules/projectiles/projectile/special/gravity.dm b/code/modules/projectiles/projectile/special/gravity.dm
index 0ef9bc6653..6c298d0d51 100644
--- a/code/modules/projectiles/projectile/special/gravity.dm
+++ b/code/modules/projectiles/projectile/special/gravity.dm
@@ -1,90 +1,73 @@
-/obj/item/projectile/gravityrepulse
+/obj/item/projectile/gravity
+ name = "gravity bolt"
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "chronofield"
+ hitsound = 'sound/weapons/wave.ogg'
+ damage = 0
+ damage_type = BRUTE
+ nodamage = TRUE
+ var/power = 4
+ var/list/thrown = list() //normally we wouldn't need this but incase on_hit is called multiple times, yeah.. this is a good idea.
+
+/obj/item/projectile/gravity/Initialize(mapload)
+ . = ..()
+ var/obj/item/ammo_casing/energy/gravity/G = loc
+ if(istype(G))
+ power = min(G.gun.power, 15)
+
+/obj/item/projectile/gravity/on_hit()
+ . = ..()
+ var/turf/T = get_turf(src)
+ var/list/tothrow
+ var/list/mobs = list()
+ var/list/objs = list()
+ var/list/cachedrange = range(T, power)
+ for(var/mob/M in cachedrange)
+ mobs += M
+ for(var/obj/O in cachedrange)
+ objs += O
+ tothrow = mobs + objs //mobs priority
+ var/safety = 50
+ for(var/i in tothrow)
+ if(!safety)
+ break
+ var/atom/movable/AM = i
+ if(can_throw(AM, thrown) && do_the_throw(T, AM, thrown))
+ safety--
+ for(var/turf/F in range(T,power))
+ new /obj/effect/temp_visual/gravpush(F)
+
+/obj/item/projectile/gravity/proc/can_throw(atom/movable/AM, list/thrown)
+ return (AM != src) && (AM != firer) && !AM.anchored && !thrown[AM]
+
+/obj/item/projectile/garvity/proc/do_the_throw(turf/origin, atom/movable/AM, list/thrown)
+ thrown[AM] = TRUE
+ var/target = get_target(origin, AM)
+ if(!target)
+ return FALSE
+ AM.throw_at(target, power + 1, 1)
+ return TRUE
+
+/obj/item/projectile/gravity/proc/get_target(turf/origin, atom/movable/AM)
+ return origin
+
+/obj/item/projectile/gravity/repulse
name = "repulsion bolt"
- icon = 'icons/effects/effects.dmi'
- icon_state = "chronofield"
- hitsound = 'sound/weapons/wave.ogg'
- damage = 0
- damage_type = BRUTE
- nodamage = 1
color = "#33CCFF"
- var/turf/T
- var/power = 4
- var/list/thrown_items = list()
-/obj/item/projectile/gravityrepulse/Initialize()
- . = ..()
- var/obj/item/ammo_casing/energy/gravity/repulse/C = loc
- if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items
- power = min(C.gun.power, 15)
+/obj/item/projectile/gravity/repulse/get_target(turf/origin, atom/movable/AM)
+ return get_turf_in_angle(Get_Angle(origin, AM), origin, power)
-/obj/item/projectile/gravityrepulse/on_hit()
- . = ..()
- T = get_turf(src)
- for(var/atom/movable/A in range(T, power))
- if(A == src || (firer && A == src.firer) || A.anchored || thrown_items[A])
- continue
- var/throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(A, src)))
- A.throw_at(throwtarget,power+1,1)
- thrown_items[A] = A
- for(var/turf/F in range(T,power))
- new /obj/effect/temp_visual/gravpush(F)
-
-/obj/item/projectile/gravityattract
+/obj/item/projectile/gravity/attract
name = "attraction bolt"
- icon = 'icons/effects/effects.dmi'
- icon_state = "chronofield"
- hitsound = 'sound/weapons/wave.ogg'
- damage = 0
- damage_type = BRUTE
- nodamage = 1
color = "#FF6600"
- var/turf/T
- var/power = 4
- var/list/thrown_items = list()
-/obj/item/projectile/gravityattract/Initialize()
- . = ..()
- var/obj/item/ammo_casing/energy/gravity/attract/C = loc
- if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items
- power = min(C.gun.power, 15)
+/obj/item/projectile/gravity/attract/get_target(turf/origin, atom/movable/AM)
+ return origin
-/obj/item/projectile/gravityattract/on_hit()
- . = ..()
- T = get_turf(src)
- for(var/atom/movable/A in range(T, power))
- if(A == src || (firer && A == src.firer) || A.anchored || thrown_items[A])
- continue
- A.throw_at(T, power+1, 1)
- thrown_items[A] = A
- for(var/turf/F in range(T,power))
- new /obj/effect/temp_visual/gravpush(F)
-
-/obj/item/projectile/gravitychaos
+/obj/item/projectile/gravity/chaos
name = "gravitational blast"
- icon = 'icons/effects/effects.dmi'
- icon_state = "chronofield"
- hitsound = 'sound/weapons/wave.ogg'
- damage = 0
- damage_type = BRUTE
- nodamage = 1
color = "#101010"
- var/turf/T
- var/power = 4
- var/list/thrown_items = list()
-/obj/item/projectile/gravitychaos/Initialize()
- . = ..()
- var/obj/item/ammo_casing/energy/gravity/chaos/C = loc
- if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items
- power = min(C.gun.power, 15)
-
-/obj/item/projectile/gravitychaos/on_hit()
- . = ..()
- T = get_turf(src)
- for(var/atom/movable/A in range(T, power))
- if(A == src|| (firer && A == src.firer) || A.anchored || thrown_items[A])
- continue
- A.throw_at(get_edge_target_turf(A, pick(GLOB.cardinals)), power+1, 1)
- thrown_items[A] = A
- for(var/turf/Z in range(T,power))
- new /obj/effect/temp_visual/gravpush(Z)
+/obj/item/projectile/gravity/chaos/get_target(turf/origin, atom/movable/AM)
+ return get_turf_in_angle(rand(0, 359), origin, power)
From f8d5eae0c3b54b40bde153c4fa4eb07e7acd3d0a Mon Sep 17 00:00:00 2001
From: kevinz000 <2003111+kevinz000@users.noreply.github.com>
Date: Fri, 7 Feb 2020 16:24:12 -0700
Subject: [PATCH 048/342] Update gravity.dm
---
code/modules/projectiles/projectile/special/gravity.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/projectiles/projectile/special/gravity.dm b/code/modules/projectiles/projectile/special/gravity.dm
index 6c298d0d51..0efdc77806 100644
--- a/code/modules/projectiles/projectile/special/gravity.dm
+++ b/code/modules/projectiles/projectile/special/gravity.dm
@@ -40,7 +40,7 @@
/obj/item/projectile/gravity/proc/can_throw(atom/movable/AM, list/thrown)
return (AM != src) && (AM != firer) && !AM.anchored && !thrown[AM]
-/obj/item/projectile/garvity/proc/do_the_throw(turf/origin, atom/movable/AM, list/thrown)
+/obj/item/projectile/gravity/proc/do_the_throw(turf/origin, atom/movable/AM, list/thrown)
thrown[AM] = TRUE
var/target = get_target(origin, AM)
if(!target)
From 82e36846bc895f96b2d0bc66db3a647df2875fcf Mon Sep 17 00:00:00 2001
From: Ghom <42542238+Ghommie@users.noreply.github.com>
Date: Sat, 8 Feb 2020 06:18:00 +0100
Subject: [PATCH 049/342] /datum/element/cleaning cleans your face!
---
code/datums/elements/cleaning.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/datums/elements/cleaning.dm b/code/datums/elements/cleaning.dm
index e4fb3edd48..3f80204089 100644
--- a/code/datums/elements/cleaning.dm
+++ b/code/datums/elements/cleaning.dm
@@ -45,4 +45,4 @@
cleaned_human.clean_blood()
cleaned_human.wash_cream()
cleaned_human.regenerate_icons()
- to_chat(cleaned_human, "[src] cleans your face!")
+ to_chat(cleaned_human, "[AM] cleans your face!")
From 6af421994abb0185573cb45fea2de4eea565fcb5 Mon Sep 17 00:00:00 2001
From: Seris02
Date: Sat, 8 Feb 2020 13:53:43 +0800
Subject: [PATCH 050/342] yay
---
.../game/objects/structures/crates_lockers/crates.dm | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index 3858cb6a8c..7eb0860ac0 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -31,11 +31,6 @@
return 1
return !density
-/obj/structure/closet/crate/crowbar_act(mob/user,obj/item/tool)
- if (manifest)
- tear_manifest(user)
- return ..()
-
/obj/structure/closet/crate/update_icon()
icon_state = "[initial(icon_state)][opened ? "open" : ""]"
@@ -50,6 +45,13 @@
if(manifest)
tear_manifest(user)
+/obj/structure/closet/crate/tool_interact(obj/item/W, mob/user)
+ if(istype(W, /obj/item/crowbar))
+ if (manifest)
+ tear_manifest(user)
+ return TRUE
+ return ..()
+
/obj/structure/closet/crate/open(mob/living/user)
. = ..()
if(. && manifest)
From 6d8bfd2a380aa8bfc3535098b52549bd4e4c986d Mon Sep 17 00:00:00 2001
From: Seris02 <49109742+Seris02@users.noreply.github.com>
Date: Sat, 8 Feb 2020 14:01:51 +0800
Subject: [PATCH 051/342] tru
---
code/game/objects/structures/crates_lockers/crates.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index 7eb0860ac0..708cee2aa4 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -46,7 +46,7 @@
tear_manifest(user)
/obj/structure/closet/crate/tool_interact(obj/item/W, mob/user)
- if(istype(W, /obj/item/crowbar))
+ if(istype(W, /obj/item/wirecutters))
if (manifest)
tear_manifest(user)
return TRUE
From 5dbfc9a5146873185ff64991978d85c99341bbdd Mon Sep 17 00:00:00 2001
From: TrilbySpaceClone
Date: Sat, 8 Feb 2020 03:25:09 -0500
Subject: [PATCH 052/342] Yay
---
code/modules/projectiles/pins.dm | 16 +++++++++++++---
code/modules/research/designs/weapon_designs.dm | 10 ++++++++++
code/modules/research/techweb/all_nodes.dm | 2 +-
3 files changed, 24 insertions(+), 4 deletions(-)
diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm
index 0465a611cd..a99a3bf45d 100644
--- a/code/modules/projectiles/pins.dm
+++ b/code/modules/projectiles/pins.dm
@@ -69,13 +69,10 @@
if(gun)
qdel(gun)
-
-
/obj/item/firing_pin/magic
name = "magic crystal shard"
desc = "A small enchanted shard which allows magical weapons to fire."
-
// Test pin, works only near firing range.
/obj/item/firing_pin/test_range
name = "test-range firing pin"
@@ -229,3 +226,16 @@
if(gun)
gun.pin = null
return ..()
+
+//Station Locked
+
+/obj/item/firing_pin/away
+ name = "station locked pin"
+ desc = "A firing pin that only will fire when off the station."
+
+/obj/item/firing_pin/away/pin_auth(mob/living/user)
+ var/station_zlevel = get_area(src)
+ if(station_zlevel in GLOB.the_station_areas)
+ to_chat(user, "The pin beeps, refusing to fire.")
+ return FALSE
+ return TRUE
diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm
index 1d65edbe9a..467679fea6 100644
--- a/code/modules/research/designs/weapon_designs.dm
+++ b/code/modules/research/designs/weapon_designs.dm
@@ -225,6 +225,16 @@
category = list("Firing Pins")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+/datum/design/pin_away
+ name = "Station Locked Pin"
+ desc = "This is a security firing pin which only authorizes users who are off station."
+ id = "pin_away"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 1500, MAT_GLASS = 2000)
+ build_path = /obj/item/firing_pin/away
+ category = list("Firing Pins")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
//////////////
//Guns////////
//////////////
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index e1abfedde6..acc278d3e6 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -666,7 +666,7 @@
display_name = "Weapon Development Technology"
description = "Our researchers have found new to weaponize just about everything now."
prereq_ids = list("engineering")
- design_ids = list("pin_testing", "tele_shield", "lasercarbine")
+ design_ids = list("pin_testing", "tele_shield", "lasercarbine", "pin_away")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500)
export_price = 5000
From 612b5c5da353646261e7cb84e59a99762b97c150 Mon Sep 17 00:00:00 2001
From: TrilbySpaceClone
Date: Sat, 8 Feb 2020 03:27:43 -0500
Subject: [PATCH 053/342] better name
---
code/modules/projectiles/pins.dm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm
index a99a3bf45d..0a27eb31ed 100644
--- a/code/modules/projectiles/pins.dm
+++ b/code/modules/projectiles/pins.dm
@@ -234,8 +234,8 @@
desc = "A firing pin that only will fire when off the station."
/obj/item/firing_pin/away/pin_auth(mob/living/user)
- var/station_zlevel = get_area(src)
- if(station_zlevel in GLOB.the_station_areas)
+ var/station_area = get_area(src)
+ if(station_area in GLOB.the_station_areas)
to_chat(user, "The pin beeps, refusing to fire.")
return FALSE
return TRUE
From e5236eebb187db0dba4e82694c9d8f0c528bd9b0 Mon Sep 17 00:00:00 2001
From: TrilbySpaceClone
Date: Sat, 8 Feb 2020 17:39:00 -0500
Subject: [PATCH 054/342] hey lets do corrections
---
.../game/objects/items/stacks/sheets/glass.dm | 3 +++
.../objects/items/stacks/sheets/mineral.dm | 3 +++
.../crates_lockers/crates/secure.dm | 5 +++++
code/modules/cargo/exports/materials.dm | 5 -----
code/modules/cargo/exports/sheets.dm | 10 ++++++++++
code/modules/cargo/packs/armory.dm | 8 ++++----
code/modules/cargo/packs/emergency.dm | 2 +-
code/modules/cargo/packs/materials.dm | 16 ++++++++++++++++
code/modules/cargo/packs/medical.dm | 3 ++-
code/modules/cargo/packs/organic.dm | 11 ++++++-----
code/modules/cargo/packs/security.dm | 2 +-
icons/obj/crates.dmi | Bin 22382 -> 22621 bytes
12 files changed, 51 insertions(+), 17 deletions(-)
diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm
index 21de34faa1..72904a80ed 100644
--- a/code/game/objects/items/stacks/sheets/glass.dm
+++ b/code/game/objects/items/stacks/sheets/glass.dm
@@ -254,6 +254,9 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
merge_type = /obj/item/stack/sheet/plastitaniumglass
shard_type = /obj/item/shard
+/obj/item/stack/sheet/plastitaniumglass/fifty
+ amount = 50
+
/obj/item/stack/sheet/plastitaniumglass/Initialize(mapload, new_amount, merge = TRUE)
recipes = GLOB.plastitaniumglass_recipes
return ..()
diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm
index 53b78b2ecf..8541b539c9 100644
--- a/code/game/objects/items/stacks/sheets/mineral.dm
+++ b/code/game/objects/items/stacks/sheets/mineral.dm
@@ -323,6 +323,9 @@ GLOBAL_LIST_INIT(titanium_recipes, list ( \
point_value = 45
merge_type = /obj/item/stack/sheet/mineral/plastitanium
+/obj/item/stack/sheet/mineral/plastitanium/fifty
+ amount = 50
+
GLOBAL_LIST_INIT(plastitanium_recipes, list ( \
new/datum/stack_recipe("plastitanium tile", /obj/item/stack/tile/mineral/plastitanium, 1, 4, 20), \
))
diff --git a/code/game/objects/structures/crates_lockers/crates/secure.dm b/code/game/objects/structures/crates_lockers/crates/secure.dm
index 290e69370b..602adfb367 100644
--- a/code/game/objects/structures/crates_lockers/crates/secure.dm
+++ b/code/game/objects/structures/crates_lockers/crates/secure.dm
@@ -70,3 +70,8 @@
name = "secure science crate"
desc = "A crate with a lock on it, painted in the scheme of the station's scientists."
icon_state = "scisecurecrate"
+
+/obj/structure/closet/crate/secure/medical
+ desc = "A secure medical crate."
+ name = "medical crate"
+ icon_state = "medical_secure_crate"
\ No newline at end of file
diff --git a/code/modules/cargo/exports/materials.dm b/code/modules/cargo/exports/materials.dm
index d8fc5f22ab..1b38a809cf 100644
--- a/code/modules/cargo/exports/materials.dm
+++ b/code/modules/cargo/exports/materials.dm
@@ -65,11 +65,6 @@
material_id = MAT_TITANIUM
message = "cm3 of titanium"
-/datum/export/material/plastitanium
- cost = 165 // plasma + titanium costs
- material_id = MAT_TITANIUM // code can only check for one material_id; plastitanium is half plasma, half titanium
- message = "cm3 of plastitanium"
-
/datum/export/material/plastic
cost = 5
material_id = MAT_PLASTIC
diff --git a/code/modules/cargo/exports/sheets.dm b/code/modules/cargo/exports/sheets.dm
index f784083097..df1704d660 100644
--- a/code/modules/cargo/exports/sheets.dm
+++ b/code/modules/cargo/exports/sheets.dm
@@ -67,6 +67,16 @@
message = "of plasteel"
export_types = list(/obj/item/stack/sheet/plasteel)
+/datum/export/material/plastitanium
+ cost = 165 // plasma + titanium costs
+ export_types = list(/obj/item/stack/sheet/mineral/plastitanium)
+ message = "of plastitanium"
+
+/datum/export/material/plastitanium_glass
+ cost = 168 // plasma + titanium + glass costs
+ export_types = list(/obj/item/stack/sheet/plastitaniumglass)
+ message = "of plastitanium glass"
+
// 1 glass + 0.5 metal, cost is rounded up.
/datum/export/stack/rglass
cost = 6
diff --git a/code/modules/cargo/packs/armory.dm b/code/modules/cargo/packs/armory.dm
index ea8ef8ba0f..4c500a0162 100644
--- a/code/modules/cargo/packs/armory.dm
+++ b/code/modules/cargo/packs/armory.dm
@@ -178,7 +178,7 @@
/datum/supply_pack/security/armory/russian
name = "Russian Surplus Crate"
desc = "Hello Comrade, we have the most modern russian military equipment the black market can offer, for the right price of course. Sadly we couldnt remove the lock so it requires Armory access to open."
- cost = 5000
+ cost = 7500
contraband = TRUE
contains = list(/obj/item/reagent_containers/food/snacks/rationpack,
/obj/item/ammo_box/a762,
@@ -193,11 +193,11 @@
/obj/item/clothing/head/helmet/rus_ushanka,
/obj/item/clothing/suit/armor/vest/russian_coat,
/obj/item/gun/ballistic/shotgun/boltaction,
- /obj/item/gun/ballistic/shotgun/boltaction)
+ /obj/item/staff/broom) //Its... A real thing that was done in the Russian army
crate_name = "surplus military crate"
/datum/supply_pack/security/armory/russian/fill(obj/structure/closet/crate/C)
- for(var/i in 1 to 10)
+ for(var/i in 1 to 5)
var/item = pick(contains)
new item(C)
@@ -218,7 +218,7 @@
crate_name = "swat crate"
/datum/supply_pack/security/armory/swattasers //Lesser AEG tbh
- name = "SWAT tatical tasers Crate"
+ name = "SWAT tactical tasers Crate"
desc = "Contains two tactical energy gun, these guns are able to tase, disable and lethal as well as hold a seclight. Requires Armory access to open."
cost = 7000
contains = list(/obj/item/gun/energy/e_gun/stun,
diff --git a/code/modules/cargo/packs/emergency.dm b/code/modules/cargo/packs/emergency.dm
index e32811f2d0..e5036c34a5 100644
--- a/code/modules/cargo/packs/emergency.dm
+++ b/code/modules/cargo/packs/emergency.dm
@@ -130,7 +130,7 @@
/datum/supply_pack/emergency/bomb
name = "Explosive Emergency Crate"
- desc = "Science gone bonkers? Beeping behind the airlock? Buy now and be the hero the station des... I mean needs! (Time not included.)"
+ desc = "Science gone bonkers? Beeping behind the airlock? Buy now and be the hero the station kills-... I mean needs! Time not included, but what is a full bomb suit and hood, gas mask with the tools you need to defuse a none-nuclear bomb."
cost = 1500
contains = list(/obj/item/clothing/head/bomb_hood,
/obj/item/clothing/suit/bomb_suit,
diff --git a/code/modules/cargo/packs/materials.dm b/code/modules/cargo/packs/materials.dm
index 6c1742896f..ea7df06bda 100644
--- a/code/modules/cargo/packs/materials.dm
+++ b/code/modules/cargo/packs/materials.dm
@@ -48,6 +48,22 @@
contains = list(/obj/item/stack/sheet/plasteel/fifty)
crate_name = "plasteel sheets crate"
+/datum/supply_pack/materials/plastitanium50
+ name = "50 Plastitanium Sheets"
+ desc = "Build an evil empire with fifty plastitanium sheets."
+ cost = 9250
+ contraband = TRUE
+ contains = list(/obj/item/stack/sheet/mineral/plastitanium/fifty)
+ crate_name = "plastitanium sheets crate"
+
+/datum/supply_pack/materials/plastitanium_glass50
+ name = "50 Plastitanium Glass Sheets"
+ desc = "Look out from your evil empire with fifty plastitanium glass sheets."
+ cost = 9500
+ contraband = TRUE
+ contains = list(/obj/item/stack/sheet/plastitaniumglass/fifty)
+ crate_name = "plastitanium glass sheets crate"
+
/datum/supply_pack/materials/plastic50
name = "50 Plastic Sheets"
desc = "Build a limitless amount of toys with fifty plastic sheets!"
diff --git a/code/modules/cargo/packs/medical.dm b/code/modules/cargo/packs/medical.dm
index ea327ae820..5d02bbe60f 100644
--- a/code/modules/cargo/packs/medical.dm
+++ b/code/modules/cargo/packs/medical.dm
@@ -88,6 +88,7 @@
/obj/item/clothing/mask/gas,
/obj/item/clothing/suit/space/hardsuit/medical)
crate_name = "medical hardsuit"
+ crate_type = /obj/structure/closet/crate/secure/medical
/datum/supply_pack/medical/supplies
name = "Medical Supplies Crate"
@@ -125,7 +126,7 @@
/obj/item/reagent_containers/medspray/synthflesh,
/obj/item/reagent_containers/medspray/sterilizine)
crate_name = "medco surgery tools"
- crate_type = /obj/structure/closet/crate/medical
+ crate_type = /obj/structure/closet/crate/secure/medical
/datum/supply_pack/medical/surgery
name = "Surgical Supplies Crate"
diff --git a/code/modules/cargo/packs/organic.dm b/code/modules/cargo/packs/organic.dm
index 4aa991fc3f..7d28ceefef 100644
--- a/code/modules/cargo/packs/organic.dm
+++ b/code/modules/cargo/packs/organic.dm
@@ -193,6 +193,7 @@
/obj/item/reagent_containers/food/snacks/meat/slab/bear,
/obj/item/reagent_containers/food/snacks/meat/slab/xeno,
/obj/item/reagent_containers/food/snacks/meat/slab/spider,
+ /obj/item/reagent_containers/food/snacks/meat/rawcrab,
/obj/item/reagent_containers/food/snacks/meat/rawbacon,
/obj/item/reagent_containers/food/snacks/spiderleg,
/obj/item/reagent_containers/food/snacks/carpmeat,
@@ -213,7 +214,7 @@
/datum/supply_pack/organic/fakemeat
name = "Meat Crate 'Synthetic'"
- desc = "Run outta meat already? Keep the lizards content with this freezer filled with cruelty-free chemically compounded meat! Contains 12 slabs of meat product, and 4 slabs of *carp*."
+ desc = "Run outta meat already? Keep the lizards content with this freezer filled with cruelty-free chemically compounded meat! Contains 9 slabs of meat product, 3 carb meat and 4 slabs of *carp*."
cost = 1200 // Buying 3 food crates nets you 9 meat for 900 points, plus like, 6 bags of rice, flour, and egg boxes. This is 12 for 500, but you -only- get meat and carp.
contains = list(/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
@@ -224,9 +225,9 @@
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
- /obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
- /obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
- /obj/item/reagent_containers/food/snacks/meat/slab/meatproduct,
+ /obj/item/reagent_containers/food/snacks/meat/rawcrab,
+ /obj/item/reagent_containers/food/snacks/meat/rawcrab,
+ /obj/item/reagent_containers/food/snacks/meat/rawcrab,
/obj/item/reagent_containers/food/snacks/carpmeat/imitation,
/obj/item/reagent_containers/food/snacks/carpmeat/imitation,
/obj/item/reagent_containers/food/snacks/carpmeat/imitation,
@@ -327,7 +328,7 @@
/datum/supply_pack/organic/seeds
name = "Seeds Crate"
- desc = "Big things have small beginnings. Contains thirteen different seeds."
+ desc = "Big things have small beginnings. Contains fourteen different seeds."
cost = 1250
contains = list(/obj/item/seeds/chili,
/obj/item/seeds/berry,
diff --git a/code/modules/cargo/packs/security.dm b/code/modules/cargo/packs/security.dm
index fd7e07a66c..90bc837767 100644
--- a/code/modules/cargo/packs/security.dm
+++ b/code/modules/cargo/packs/security.dm
@@ -103,7 +103,7 @@
desc = "An old russian Minutemen crate, comes with a full russian outfit, a mosin and a stripper clip."
contraband = TRUE
access = FALSE
- cost = 5500 //
+ cost = 6500 //
contains = list(/obj/item/clothing/suit/armor/navyblue/russian,
/obj/item/clothing/shoes/combat,
/obj/item/clothing/head/ushanka,
diff --git a/icons/obj/crates.dmi b/icons/obj/crates.dmi
index ca81686e942e0c2973dacff3450a0d3214d4df33..ecb66d0119b504f18f5309f07896199483565a1d 100644
GIT binary patch
literal 22621
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 E(K`M0jll@Sq32#J
zuCplltVE5lv;G!ehDq+5p@UWw{}LwyOF(~re|T&x{(7BNq$DFxLQ-a~`p1EKk16Dp
zS@;*(J=Y4q1Vy)Jxbm*0=lFeZjCZlfh;W&BuMCX?T)V=2V0A(148J5~)by-WfY7Yt
zo10M5|E{ea9!z2LME%|2FUu_Uemb4Zl^LGI@>1aXA
zakneMh(&*Za_#BTz|-z*!-&{v53encjd2aOMGk|m*#|;fh|7TsbcF*x$pwz<8XzWf
zUWz0K$zXMT$Fil(52U0%*|DA14wqw7)+>{rV+-0q2>V=&dhbkMQyoUZeLgZXX(h!{3k8lp0{tIk=_H@5eCJmWB3*{oz_Wkqc-ogf
zAKO^gVjXS88DBlB+7*A+9G;M2JFRn|*2C10J&3XQ>XOcu>i%J+qH^$u4X=u`Q{&xAlO^Pfsx>8t08xOjCl;RlV0F8=D159x!8JjejH
zBtH-!Fm8erk#yx0L>eTG~nbdShb=`4+L}DKB
zN3+x|?=J8FCzex7*Zt`#6q4uHa5<4rZ9Z3~yOZCl&oHXN$qGU)QRmNhxAu9{9NZDV
zVM!e2{|T**gvw%uUAoYDY{*%^Q5c{^0=BDX
z7jAQs&ENgu)ViL(!2q_nnH(d&AGQ@06+K@T3m)_DmyAEOzYvy6o&=G2D9B8;x;)gU
z^M*(cl-aA#zUycSHi+-FR&iLHv-fjRS-)+5CFfgxKRnC}1Pob7tC%K6Eu0P_HFOoA
zA$Tl@zcPHnaB%qig~w8z5?LvY3kh*M1$|crn=*nFG7iuj-h&&Qo`G&wrCs^8GQLd*
zBtXGwozpmU->#ZgOh^YhIv~E()5>1fUMuKaT9MpqIEeX89smklcO#iXiLw;Z%+YP%*Q~AQ7;H0rIGxd#~Fb>cTr#_G+#}Hh;;64=AuB3(-nS
zOQmgWzL#X>m6zkce*OBhd&m7+vF07Yu+rI5*O!IU>N3N&SyhVVFC*e*9rIl~t+k0c
z^(*rktvR3FPAB+rvq?E;{TqmK9}pkE{rSh*2@;#g0CB;LStGSp11)_=cDF_Csc*#5
z*ZccQE?&6iwBi~X8YVR}`UATDLLHaTi@!NZ(eR)HI-s1=#$Jd_|
z&G`PZI2BkseOynJ=J7PbO*{M4(ftHv+C81qs&frFupk?Zc8
zkeZ&J#suti_4KI06V%n!NB{ms2TIDz |