"
+ 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 019/227] 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 020/227] 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 021/227] 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 022/227] 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 023/227] 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 024/227] 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 025/227] 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 026/227] 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 027/227] 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 028/227] 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 029/227] 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 030/227] 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 031/227] 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 032/227] 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 033/227] 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 034/227] 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 035/227] 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 036/227] 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 037/227] 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 038/227] /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 039/227] 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 040/227] 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 041/227] 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 042/227] 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 f6adce72fbcdabec184f4b6eb85c131d82f957f0 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Sun, 9 Feb 2020 06:51:57 +0100
Subject: [PATCH 043/227] Something about missing private sprites and their bad
code.
---
code/__DEFINES/citadel_defines.dm | 1 +
code/__HELPERS/_cit_helpers.dm | 5 +---
code/__HELPERS/global_lists.dm | 13 +----------
.../sprite_accessories/_sprite_accessories.dm | 4 ++--
.../code/modules/arousal/arousal.dm | 20 +++++-----------
.../code/modules/arousal/genitals.dm | 22 +++++-------------
.../arousal/genitals_sprite_accessories.dm | 9 ++++---
.../code/modules/arousal/organs/breasts.dm | 18 +++++++++-----
.../code/modules/arousal/organs/penis.dm | 11 ++++-----
.../code/modules/arousal/organs/testicles.dm | 8 +++----
.../code/modules/arousal/organs/vagina.dm | 8 +++----
.../icons/obj/genitals/breasts.dmi | Bin 1407 -> 1295 bytes
.../icons/obj/genitals/breasts_onmob.dmi | Bin 8830 -> 6159 bytes
modular_citadel/icons/obj/genitals/penis.dmi | Bin 4707 -> 4303 bytes
.../icons/obj/genitals/penis_onmob.dmi | Bin 10002 -> 9279 bytes
.../icons/obj/genitals/taur_penis_onmob.dmi | Bin 1673 -> 1672 bytes
.../icons/obj/genitals/testicles.dmi | Bin 1116 -> 1039 bytes
modular_citadel/icons/obj/genitals/vagina.dmi | Bin 626 -> 546 bytes
.../icons/obj/genitals/vagina_onmob.dmi | Bin 1330 -> 1112 bytes
19 files changed, 45 insertions(+), 74 deletions(-)
diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm
index 2b19610040..56d5c63833 100644
--- a/code/__DEFINES/citadel_defines.dm
+++ b/code/__DEFINES/citadel_defines.dm
@@ -34,6 +34,7 @@
#define CAN_MASTURBATE_WITH (1<<5)
#define MASTURBATE_LINKED_ORGAN (1<<6) //used to pass our mission to the linked organ
#define CAN_CLIMAX_WITH (1<<7)
+#define GENITAL_CAN_AROUSE (1<<8)
#define COCK_SIZE_MIN 1
#define COCK_SIZE_MAX 20
diff --git a/code/__HELPERS/_cit_helpers.dm b/code/__HELPERS/_cit_helpers.dm
index c0acf4c5a5..1bde770045 100644
--- a/code/__HELPERS/_cit_helpers.dm
+++ b/code/__HELPERS/_cit_helpers.dm
@@ -57,14 +57,11 @@ GLOBAL_LIST_EMPTY(ipc_antennas_list)
//Genitals and Arousal Lists
GLOBAL_LIST_EMPTY(genitals_list)
-GLOBAL_LIST_EMPTY(cock_shapes_list)//global_lists.dm for the list initializations //Now also _DATASTRUCTURES globals.dm
-GLOBAL_LIST_EMPTY(cock_shapes_icons) //Associated list for names->icon_states for cockshapes.
+GLOBAL_LIST_EMPTY(cock_shapes_list)
GLOBAL_LIST_EMPTY(gentlemans_organ_names)
GLOBAL_LIST_EMPTY(balls_shapes_list)
-GLOBAL_LIST_EMPTY(balls_shapes_icons)
GLOBAL_LIST_EMPTY(breasts_size_list)
GLOBAL_LIST_EMPTY(breasts_shapes_list)
-GLOBAL_LIST_EMPTY(breasts_shapes_icons)
GLOBAL_LIST_EMPTY(vagina_shapes_list)
GLOBAL_LIST_INIT(cum_into_containers_list, list(/obj/item/reagent_containers/food/snacks/pie)) //Yer fuggin snowflake name list jfc
GLOBAL_LIST_INIT(dick_nouns, list("dick","cock","member","shaft"))
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index ff9d1bec4c..7045767f98 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -51,26 +51,15 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/antenna, GLOB.ipc_antennas_list, roundstart = TRUE)
//genitals
init_sprite_accessory_subtypes(/datum/sprite_accessory/penis, GLOB.cock_shapes_list)
- for(var/K in GLOB.cock_shapes_list)
- var/datum/sprite_accessory/penis/value = GLOB.cock_shapes_list[K]
- GLOB.cock_shapes_icons[K] = value.icon_state
-
init_sprite_accessory_subtypes(/datum/sprite_accessory/vagina, GLOB.vagina_shapes_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/breasts, GLOB.breasts_shapes_list)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/testicles, GLOB.balls_shapes_list)
GLOB.breasts_size_list = list ("a", "b", "c", "d", "e") //We need the list to choose from initialized, but it's no longer a sprite_accessory thing.
GLOB.gentlemans_organ_names = list("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ",
"cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret",
"baloney pony", "schlanger", "Mutton dagger", "old blind bob","Hanging Johnny", "fishing rod", "Tally whacker", "polly rocket",
"One eyed trouser trout", "Ding dong", "ankle spanker", "Pork sword", "engine cranker", "Harry hot dog", "Davy Crockett",
"Kidney cracker", "Heat seeking moisture missile", "Giggle stick", "love whistle", "Tube steak", "Uncle Dick", "Purple helmet warrior")
- for(var/K in GLOB.breasts_shapes_list)
- var/datum/sprite_accessory/breasts/value = GLOB.breasts_shapes_list[K]
- GLOB.breasts_shapes_icons[K] = value.icon_state
-
- init_sprite_accessory_subtypes(/datum/sprite_accessory/testicles, GLOB.balls_shapes_list)
- for(var/K in GLOB.balls_shapes_list)
- var/datum/sprite_accessory/testicles/value = GLOB.balls_shapes_list[K]
- GLOB.balls_shapes_icons[K] = value.icon_state
for(var/gpath in subtypesof(/obj/item/organ/genital))
var/obj/item/organ/genital/G = gpath
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm
index 241ec8118e..92bc8e407b 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm
@@ -16,7 +16,7 @@
from doing this unless you absolutely know what you are doing, and have defined a
conversion in savefile.dm
*/
-/proc/init_sprite_accessory_subtypes(prototype, list/L, list/male, list/female,var/roundstart = FALSE)//Roundstart argument builds a specific list for roundstart parts where some parts may be locked
+/proc/init_sprite_accessory_subtypes(prototype, list/L, list/male, list/female, roundstart = FALSE, skip_prototype = TRUE)//Roundstart argument builds a specific list for roundstart parts where some parts may be locked
if(!istype(L))
L = list()
if(!istype(male))
@@ -25,7 +25,7 @@
female = list()
for(var/path in typesof(prototype))
- if(path == prototype)
+ if(path == prototype && skip_prototype)
continue
if(roundstart)
var/datum/sprite_accessory/P = path
diff --git a/modular_citadel/code/modules/arousal/arousal.dm b/modular_citadel/code/modules/arousal/arousal.dm
index 3a586d061d..aa0021bd8f 100644
--- a/modular_citadel/code/modules/arousal/arousal.dm
+++ b/modular_citadel/code/modules/arousal/arousal.dm
@@ -46,20 +46,12 @@
var/list/obj/item/organ/genital/genit_list = list()
if(!client?.prefs.arousable || (aphro && (client?.prefs.cit_toggles & NO_APHRO)) || (maso && !HAS_TRAIT(src, TRAIT_MASO)))
return // no adjusting made here
- if(strength>0)
- for(var/obj/item/organ/genital/G in internal_organs)
- if(!G.aroused_state && prob(strength*G.sensitivity))
- G.set_aroused_state(TRUE)
- G.update_appearance()
- if(G.aroused_state)
- genit_list += G
- else
- for(var/obj/item/organ/genital/G in internal_organs)
- if(G.aroused_state && prob(strength*G.sensitivity))
- G.set_aroused_state(FALSE)
- G.update_appearance()
- if(G.aroused_state)
- genit_list += G
+ for(var/obj/item/organ/genital/G in internal_organs)
+ if(genital_flags & GENITAL_CAN_AROUSE && !G.aroused_state && prob(strength*G.sensitivity))
+ G.set_aroused_state(strength > 0)
+ G.update_appearance()
+ if(G.aroused_state)
+ genit_list += G
return genit_list
/obj/item/organ/genital/proc/climaxable(mob/living/carbon/human/H, silent = FALSE) //returns the fluid source (ergo reagents holder) if found.
diff --git a/modular_citadel/code/modules/arousal/genitals.dm b/modular_citadel/code/modules/arousal/genitals.dm
index ca01ef46cb..dc299e4d4c 100644
--- a/modular_citadel/code/modules/arousal/genitals.dm
+++ b/modular_citadel/code/modules/arousal/genitals.dm
@@ -38,6 +38,8 @@
return ..()
/obj/item/organ/genital/proc/set_aroused_state(new_state)
+ if(!(genital_flags & GENITAL_CAN_AROUSE))
+ return FALSE
if(!((HAS_TRAIT(owner,TRAIT_PERMABONER) && !new_state) || HAS_TRAIT(owner,TRAIT_NEVERBONER) && new_state))
aroused_state = new_state
return aroused_state
@@ -113,17 +115,7 @@
set desc = "Allows you to toggle which genitals are showing signs of arousal."
var/list/genital_list = list()
for(var/obj/item/organ/genital/G in internal_organs)
- var/datum/sprite_accessory/S
- switch(G.type)
- if(/obj/item/organ/genital/penis)
- S = GLOB.cock_shapes_list[G.shape]
- if(/obj/item/organ/genital/testicles)
- S = GLOB.balls_shapes_list[G.shape]
- if(/obj/item/organ/genital/vagina)
- S = GLOB.vagina_shapes_list[G.shape]
- if(/obj/item/organ/genital/breasts)
- S = GLOB.breasts_shapes_list[G.shape]
- if(S?.alt_aroused)
+ if(G.genital_flags & GENITAL_CAN_AROUSE)
genital_list += G
if(!genital_list.len) //There's nothing that can show arousal
return
@@ -325,7 +317,6 @@
var/obj/item/organ/genital/G = A
var/datum/sprite_accessory/S
var/size = G.size
- var/aroused_state = G.aroused_state
switch(G.type)
if(/obj/item/organ/genital/penis)
S = GLOB.cock_shapes_list[G.shape]
@@ -338,10 +329,9 @@
if(!S || S.icon_state == "none")
continue
+ var/aroused_state = G.aroused_state && S.alt_aroused
var/mutable_appearance/genital_overlay = mutable_appearance(S.icon, layer = -layer)
- genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size]_[aroused_state]_[layertext]"
-
if(S.center)
genital_overlay = center_image(genital_overlay, S.dimension_x, S.dimension_y)
@@ -357,8 +347,8 @@
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]"
+
+ genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size][use_skintones ? "_s" : ""]_[aroused_state]_[layertext]"
if(layer == GENITALS_FRONT_LAYER && CHECK_BITFIELD(G.genital_flags, GENITAL_THROUGH_CLOTHES))
genital_overlay.layer = -GENITALS_EXPOSED_LAYER
diff --git a/modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm b/modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm
index 0c1763b8e2..594fc83e46 100644
--- a/modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm
+++ b/modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm
@@ -85,36 +85,36 @@
//Vaginas
/datum/sprite_accessory/vagina
icon = 'modular_citadel/icons/obj/genitals/vagina_onmob.dmi'
- icon_state = null
name = "vagina"
color_src = "vag_color"
+ alt_aroused = TRUE
/datum/sprite_accessory/vagina/human
icon_state = "human"
name = "Human"
- alt_aroused = TRUE
/datum/sprite_accessory/vagina/tentacles
icon_state = "tentacle"
name = "Tentacle"
- alt_aroused = TRUE
/datum/sprite_accessory/vagina/dentata
icon_state = "dentata"
name = "Dentata"
- alt_aroused = TRUE
/datum/sprite_accessory/vagina/hairy
icon_state = "hairy"
name = "Hairy"
+ alt_aroused = FALSE
/datum/sprite_accessory/vagina/spade
icon_state = "spade"
name = "Spade"
+ alt_aroused = FALSE
/datum/sprite_accessory/vagina/furred
icon_state = "furred"
name = "Furred"
+ alt_aroused = FALSE
/datum/sprite_accessory/vagina/gaping
icon_state = "gaping"
@@ -125,7 +125,6 @@
icon = 'modular_citadel/icons/obj/genitals/breasts_onmob.dmi'
name = "breasts"
color_src = "breasts_color"
- alt_aroused = TRUE
/datum/sprite_accessory/breasts/pair
icon_state = "pair"
diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm
index 1537d5cebe..dc7923e448 100644
--- a/modular_citadel/code/modules/arousal/organs/breasts.dm
+++ b/modular_citadel/code/modules/arousal/organs/breasts.dm
@@ -1,3 +1,6 @@
+#define BREASTS_ICON_MIN_SIZE 1
+#define BREASTS_ICON_MAX_SIZE 6
+
/obj/item/organ/genital/breasts
name = "breasts"
desc = "Female milk producing organs."
@@ -9,7 +12,7 @@
fluid_id = /datum/reagent/consumable/milk
fluid_rate = MILK_RATE
shape = "pair"
- genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_FUID_PRODUCTION
+ genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_FUID_PRODUCTION|GENITAL_CAN_AROUSE
masturbation_verb = "massage"
arousal_verb = "Your breasts start feeling sensitive"
unarousal_verb = "Your breasts no longer feel sensitive"
@@ -49,21 +52,21 @@
var/datum/reagent/R = GLOB.chemical_reagents_list[fluid_id]
if(R)
desc += " They're leaking [lowertext(R.name)]."
- var/string
+ var/datum/sprite_accessory/S = GLOB.breasts_shapes_list[shape]
+ var/icon_shape = S ? S.icon_state : "pair"
+ var/icon_size = CLAMP(breast_values[size], BREASTS_ICON_MIN_SIZE, BREASTS_ICON_MAX_SIZE)
+ icon_state = "breasts_[icon_shape]_[breast_values[icon_size]]"
if(owner)
if(owner.dna.species.use_skintones && owner.dna.features["genitals_use_skintone"])
if(ishuman(owner)) // Check before recasting type, although someone fucked up if you're not human AND have use_skintones somehow...
var/mob/living/carbon/human/H = owner // only human mobs have skin_tone, which we need.
color = "#[skintone2hex(H.skin_tone)]"
- string = "breasts_[GLOB.breasts_shapes_icons[shape]]_[size]-s"
+ icon_state += "_s"
else
color = "#[owner.dna.features["breasts_color"]]"
- string = "breasts_[GLOB.breasts_shapes_icons[shape]]_[size]"
if(ishuman(owner))
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
@@ -130,3 +133,6 @@
cached_size = size
size = breast_values[size]
prev_size = cached_size
+
+#undef BREASTS_ICON_MIN_SIZE
+#undef BREASTS_ICON_MAX_SIZE
\ No newline at end of file
diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm
index c6d3c764ac..791a186732 100644
--- a/modular_citadel/code/modules/arousal/organs/penis.dm
+++ b/modular_citadel/code/modules/arousal/organs/penis.dm
@@ -8,7 +8,7 @@
masturbation_verb = "stroke"
arousal_verb = "You pop a boner"
unarousal_verb = "Your boner goes down"
- genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH
+ genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_CAN_AROUSE
linked_organ_slot = ORGAN_SLOT_TESTICLES
fluid_transfer_factor = 0.5
size = 2 //arbitrary value derived from length and girth for sprites.
@@ -73,22 +73,21 @@
/obj/item/organ/genital/penis/update_appearance()
. = ..()
- var/string
+ var/datum/sprite_accessory/S = GLOB.cock_shapes_list[shape]
+ var/icon_shape = S ? S.icon_state : "human"
+ icon_state = "penis_[icon_shape]_[size]"
var/lowershape = lowertext(shape)
desc = "You see [aroused_state ? "an erect" : "a flaccid"] [lowershape] [name]. You estimate it's about [round(length, 0.25)] inch[round(length, 0.25) != 1 ? "es" : ""] long and [round(girth, 0.25)] inch[round(girth, 0.25) != 1 ? "es" : ""] in girth."
-
if(owner)
if(owner.dna.species.use_skintones && owner.dna.features["genitals_use_skintone"])
if(ishuman(owner)) // Check before recasting type, although someone fucked up if you're not human AND have use_skintones somehow...
var/mob/living/carbon/human/H = owner // only human mobs have skin_tone, which we need.
color = "#[skintone2hex(H.skin_tone)]"
- string = "penis_[GLOB.cock_shapes_icons[shape]]_[size]-s"
+ icon_state += "_s"
else
color = "#[owner.dna.features["cock_color"]]"
- string = "penis_[GLOB.cock_shapes_icons[shape]]_[size]"
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
- icon_state = sanitize_text(string)
H.update_genitals()
/obj/item/organ/genital/penis/get_features(mob/living/carbon/human/H)
diff --git a/modular_citadel/code/modules/arousal/organs/testicles.dm b/modular_citadel/code/modules/arousal/organs/testicles.dm
index 9573020417..eb6c1536cb 100644
--- a/modular_citadel/code/modules/arousal/organs/testicles.dm
+++ b/modular_citadel/code/modules/arousal/organs/testicles.dm
@@ -43,19 +43,19 @@
/obj/item/organ/genital/testicles/update_appearance()
. = ..()
desc = "You see an [size_name] pair of testicles."
+ var/datum/sprite_accessory/S = GLOB.balls_shapes_list[shape]
+ var/icon_shape = S ? S.icon_state : "single"
+ icon_state = "testicles_[icon_shape]_[size]"
if(owner)
- var/string
if(owner.dna.species.use_skintones && owner.dna.features["genitals_use_skintone"])
if(ishuman(owner)) // Check before recasting type, although someone fucked up if you're not human AND have use_skintones somehow...
var/mob/living/carbon/human/H = owner // only human mobs have skin_tone, which we need.
color = "#[skintone2hex(H.skin_tone)]"
- string = "testicles_[GLOB.balls_shapes_icons[shape]]_[size]-s"
+ icon_state += "_s"
else
color = "#[owner.dna.features["balls_color"]]"
- string = "testicles_[GLOB.balls_shapes_icons[shape]]_[size]"
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
- icon_state = sanitize_text(string)
H.update_genitals()
/obj/item/organ/genital/testicles/get_features(mob/living/carbon/human/H)
diff --git a/modular_citadel/code/modules/arousal/organs/vagina.dm b/modular_citadel/code/modules/arousal/organs/vagina.dm
index 3f1bcc5f9b..311afe75b0 100644
--- a/modular_citadel/code/modules/arousal/organs/vagina.dm
+++ b/modular_citadel/code/modules/arousal/organs/vagina.dm
@@ -6,7 +6,7 @@
zone = BODY_ZONE_PRECISE_GROIN
slot = "vagina"
size = 1 //There is only 1 size right now
- genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH
+ genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_CAN_AROUSE
masturbation_verb = "finger"
arousal_verb = "You feel wetness on your crotch"
unarousal_verb = "You no longer feel wet"
@@ -22,7 +22,7 @@
/obj/item/organ/genital/vagina/update_appearance()
. = ..()
- var/string //Keeping this code here, so making multiple sprites for the different kinds is easier.
+ icon_state = "vagina"
var/lowershape = lowertext(shape)
var/details
@@ -55,13 +55,11 @@
if(ishuman(owner)) // Check before recasting type, although someone fucked up if you're not human AND have use_skintones somehow...
var/mob/living/carbon/human/H = owner // only human mobs have skin_tone, which we need.
color = "#[skintone2hex(H.skin_tone)]"
- string = "vagina-s"
+ icon_state += "_s"
else
color = "#[owner.dna.features["vag_color"]]"
- string = "vagina"
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
- icon_state = sanitize_text(string)
H.update_genitals()
/obj/item/organ/genital/vagina/get_features(mob/living/carbon/human/H)
diff --git a/modular_citadel/icons/obj/genitals/breasts.dmi b/modular_citadel/icons/obj/genitals/breasts.dmi
index d70207ee69ace42c2e782db691617821177f0389..24656062d26e3edf15d6a753650aaef61ed9abb4 100644
GIT binary patch
delta 1265
zcmey*)z78c8Q|y6%O%Cdz`(%k>ERLtqz`~F3p0>h@Tt%QNXbo9m6!P6@V`>Bs2|8>
zED7=pW^j0RBMr!TGBIAX{xny!fq?7vli@6Pr|;W#S7hmq75fz~`eZNQpM7N8{CH1=
zbzD2&r9GH;bgr<6UfaxDc
z(+Zbu*?4)!!#7D!<{pw^UaOcnHmJ)j=~s&w9+`)*F?h$D^O-ZrxU1YPcDWP_q{>|`
z%{~8h`W>D^`}ql+EqfY&^88;IGo|!leVcrG-_xGIPj5RjFfgz8ba4!+nDcg4px@>I
zf!5Qh%u74DA0+kmvpr(^^`uxjrcwGuy_}EK^uO^LN$KYlg6G_RA^&`j>=NUc1toU;
ztEZkWH5R@4Ya6fAn$Kk~tllN}n0^gST`iwf!*pIs<-GWoFCxpTcz;yvPuthVU(m1Z
zVlSfN%^}QtL#XLXj;ruIQ;k*3*#a95wxnx2#h2;kPIz^9Bb)2iMAp?^<{DaY0<~E;
zF4VI*|95_KJ;m9Vdl~bMBjIIi=C}X8%C-;5k++lXQGb%RJGuV;9r?`WUt8mg{mb0#
z!*cG;=q-)k$orN1b@=yy4fb_!&-31p^s0XI!*t!lWo!Gc4Zm#t;+rl%
z72^5&!q!UUiD>uI{(Y1564q?Ldy&oc&b|lf(^kHIvDrj-;q&&0)PFx$uJNy*e){RJ
z)mk^1Z|fP#uv>+tOnAU8vwouZG_Ll`47?M>r_FPE(p_j!S&=kPH=|W9oI~#Te}jt+
zx{4nCE-kw^v!<CjgbX9OhJ7RM(_GFOvB|YY9_D^QOnF2f6o2{E~n1hIP*by9>wo
z%h+xoKfOlN=F`y%r+F{m9IZ^evGAuwqx$Y<@fyRt3_sc17e3UT<>Z=F_kuOP=W@yC
zW8X6#EPFenzGnG$)ru$GpLg)FKAg4DcwSp-RnrCTeHQr-uJ`;jslWHRNp-Jc3&@ZK
z()s)}SrLXg|;gtBX8i%Lc*>(#)
zwwlTZ{5&*^e??8=S@w{9^#;$Fwc;Z{n%4YmI0sVq9H_2A_5{~WD{SN&4XKEqzJ53GyD^1S{jc9VT4Ch(v63^exw)b=JrAoI{1{tSo}95A~-
zfz*KPo^juv>F$HS%6j$x>rXr_+F7@@&Q5*?aeaYK^k|
zjK|!?5O)I&1-V{v}2G>s6loY&Z=xJZAo`uldtv
zJTLYZ@J{QjwA)@V@4T+z`TL6)`&LJ)sz3XAN9c1+-btWD&9{=BG4`wKZ|w`IN_$|w
R6j($tc)I$ztaD0e0sv0PT3Y}B
delta 1395
zcmXw(e>~H99LK+Y^kb7IA~)w(Wx7hYZXx5$gteHKcGn(p*wGSWWJQ9{EQ&KPAov-_^={`frKKR)mG`|*0bAD_o33$B6NrIY;$
zhHxYt002YcVXpwljzXtFUk~DZ<=Jt_*xs*2&Yp>7ongiRKqCKk-pkD?Xmg*_s;!11B(wZVvibT8>jEP3P{CCWGRYOY
z+`m?>19|*rd0aMX^}3}ZrL>e^n=4SoNiWp}R#2DvdmPoLUeb=;UAiCF+=?9oDPU%p
z88Mmx20fl)w2%y?0L2G3vo~)~;2qLKbkNU}EYqL{X(i6-q7k=3F$IC$j!PEFm-B)Dtl;yf#-UpDU
zzK6`4GEu&HWYiGjTIvBOaL$RK>OI-?c>6MQVq2Y;WBt^g{iXn*Z$$LMQxf@eh4>g5
z+9)kOUMJ;^UQ2GqvqS0cb*Kr3CI8qj>((B+|LbMvx#*FDd*!PrD>ACgQ!y|6YPD@M
zab*d^EAT_yEh!usc%?i!Ac$79)qY9{I?;C!Csn5zHke`2_b&bh&TR8mIM9mIBx@JC
zWY~eCS)iZRl$cKQjt?%e4J`4EdUq$hE#KCUO1VUzdL{R~>e?c!j?Sn3Ab>@z+0&^M
z13I8)@hw70_EnjN9id|*ldowZ^J-hGvawVu&NAfpbC1WcB5@76SvBVd)+Zk=cbExr
z12-)f$;vEeK#p+2l~?J`7^ES~#2#v_c*Nps_q3TD8VlB}-$w}QX}AfVmMKGVedRx~
zEkcL8&4<(W9gz1DH+`4~mb&RI{IlmTibfSdX78I#ZRUzWXR-Bq@p@DOu_%Oa>w4G5
z3c$g(P>_UFonDMji)q?dH)qgqG?_J@9@=1;5eQmO*oD|cZZX?xVa8d;iZAC4oy&1K
z;_D{2qnOlRD;F?vIUV8OegB|y)*wpPO(c}q(z}3-o0XU(WQi+qiwfVyZ*TV+us0By>SG~sv
z&0=@If#HlR)N)_Zg)Pb(D)2eJW6WSC)p|O!PLoVq%_FV|bo8cOa^zth$fi}c&v@IS
zknp@Ei$pcTv@0YLuZ>;nQr&RZPL!{G#1#0UdJjd&*yv>IWwueS{K2OeN*g$>Ir)wS
z4*{=n@pjLjAf0cFWx3}|NXu;UBx#sU{y?haBaYMzGK=Z%yTAoHuDC!O_GUw&d=l2Z
zRe?`;KB||YEN{wHVS4gYen=g3lM=|4EUyPz2RzyLpHq%`p-x
zr(?-CTtgt;<0Cq29`X?xH88d_);c#aK820${%>ge`7j0khI8_~kCbc7e56IBl)L?l
zoH?x~2$K+E_cD)EYwl`gcZ91PvKR5uwgPXIe!0WW{?yPsy9ut$coCoAVr$KBLEl0=
t^6lKvXE)AO880@%So6|M?K8|>(_?aPhGc-HP0$Ys5WW4qDm+6|{sr=IyNUn+
diff --git a/modular_citadel/icons/obj/genitals/breasts_onmob.dmi b/modular_citadel/icons/obj/genitals/breasts_onmob.dmi
index 371041b6f43e5bcfb878cc3f3162725d82fafe8e..578086c4c30308b403f1930738b9141dd13da6f3 100644
GIT binary patch
literal 6159
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