From 3d0cb39e91157900499f53c5c7625e9e42739ac1 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Sun, 22 Sep 2019 18:42:47 +0200
Subject: [PATCH 01/44] Removes revenant blight's shabby tox damage in favor of
negative mood effects, and necropolis curse if not cured.
---
code/__DEFINES/components.dm | 2 ++
code/datums/components/mood.dm | 26 +++++++++-------
.../mood_events/generic_negative_events.dm | 7 +++++
code/datums/status_effects/debuffs.dm | 6 ++--
.../antagonists/revenant/revenant_blight.dm | 31 ++++++++++++-------
5 files changed, 46 insertions(+), 26 deletions(-)
diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm
index 40aea24105..86ac003da2 100644
--- a/code/__DEFINES/components.dm
+++ b/code/__DEFINES/components.dm
@@ -222,6 +222,8 @@
//Mood
#define COMSIG_ADD_MOOD_EVENT "add_mood" //Called when you send a mood event from anywhere in the code.
#define COMSIG_CLEAR_MOOD_EVENT "clear_mood" //Called when you clear a mood event from anywhere in the code.
+#define COMSIG_INCREASE_SANITY "decrease_sanity" //Called when you want to increase sanity from anywhere in the code.
+#define COMSIG_DECREASE_SANITY "increase_sanity" //Same as above but to decrease sanity instead.
//NTnet
#define COMSIG_COMPONENT_NTNET_RECEIVE "ntnet_receive" //called on an object by its NTNET connection component on receive. (sending_id(number), sending_netname(text), data(datum/netdata))
diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm
index 730ffa9ff0..70c66b9e70 100644
--- a/code/datums/components/mood.dm
+++ b/code/datums/components/mood.dm
@@ -21,6 +21,8 @@
RegisterSignal(parent, COMSIG_ADD_MOOD_EVENT, .proc/add_event)
RegisterSignal(parent, COMSIG_CLEAR_MOOD_EVENT, .proc/clear_event)
+ RegisterSignal(parent, COMSIG_INCREASE_SANITY, .proc/IncreaseSanity)
+ RegisterSignal(parent, COMSIG_DECREASE_SANITY, .proc/DecreaseSanity)
RegisterSignal(parent, COMSIG_MOB_HUD_CREATED, .proc/modify_hud)
var/mob/living/owner = parent
@@ -129,23 +131,23 @@
switch(mood_level)
if(1)
- DecreaseSanity(0.2)
+ DecreaseSanity(src, 0.2)
if(2)
- DecreaseSanity(0.125, SANITY_CRAZY)
+ DecreaseSanity(src, 0.125, SANITY_CRAZY)
if(3)
- DecreaseSanity(0.075, SANITY_UNSTABLE)
+ DecreaseSanity(src, 0.075, SANITY_UNSTABLE)
if(4)
- DecreaseSanity(0.025, SANITY_DISTURBED)
+ DecreaseSanity(src, 0.025, SANITY_DISTURBED)
if(5)
- IncreaseSanity(0.1)
+ IncreaseSanity(src, 0.1)
if(6)
- IncreaseSanity(0.15)
+ IncreaseSanity(src, 0.15)
if(7)
- IncreaseSanity(0.20)
+ IncreaseSanity(src, 0.20)
if(8)
- IncreaseSanity(0.25, SANITY_GREAT)
+ IncreaseSanity(src, 0.25, SANITY_GREAT)
if(9)
- IncreaseSanity(0.4, SANITY_GREAT)
+ IncreaseSanity(src, 0.4, SANITY_GREAT)
if(insanity_effect != holdmyinsanityeffect)
if(insanity_effect > holdmyinsanityeffect)
@@ -218,7 +220,7 @@
master.crit_threshold = (master.crit_threshold - insanity_effect) + newval
insanity_effect = newval
-/datum/component/mood/proc/DecreaseSanity(amount, minimum = SANITY_INSANE)
+/datum/component/mood/proc/DecreaseSanity(datum/source, amount, minimum = SANITY_INSANE)
if(sanity < minimum) //This might make KevinZ stop fucking pinging me.
IncreaseSanity(0.5)
else
@@ -229,7 +231,7 @@
else
insanity_effect = (MINOR_INSANITY_PEN)
-/datum/component/mood/proc/IncreaseSanity(amount, maximum = SANITY_NEUTRAL)
+/datum/component/mood/proc/IncreaseSanity(datum/source, amount, maximum = SANITY_NEUTRAL)
// Disturbed stops you from getting any more sane - I'm just gonna bung this in here
var/mob/living/owner = parent
if(HAS_TRAIT(owner, TRAIT_UNSTABLE))
@@ -262,6 +264,8 @@
if(the_event.timeout)
addtimer(CALLBACK(src, .proc/clear_event, null, category), the_event.timeout, TIMER_UNIQUE|TIMER_OVERRIDE)
+ return the_event
+
/datum/component/mood/proc/clear_event(datum/source, category)
var/datum/mood_event/event = mood_events[category]
if(!event)
diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm
index 69f1a66814..f747c563ad 100644
--- a/code/datums/mood_events/generic_negative_events.dm
+++ b/code/datums/mood_events/generic_negative_events.dm
@@ -169,3 +169,10 @@
/datum/mood_event/sad_empath/add_effects(mob/sadtarget)
description = "[sadtarget.name] seems upset...\n"
+
+/datum/mood_event/revenant_blight
+ description = "Just give up, honk...\n"
+ mood_change = -5
+
+/datum/mood_event/revenant_blight/add_effects()
+ description = "Just give up, [pick("no one will miss you", "there is nothing you can do to help", "even a clown would be more useful than you", "does it even matter in the end?")]...\n"
diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm
index e930c77c36..158dfe0dae 100644
--- a/code/datums/status_effects/debuffs.dm
+++ b/code/datums/status_effects/debuffs.dm
@@ -358,7 +358,7 @@
else
new /obj/effect/temp_visual/bleed(get_turf(owner))
-/mob/living/proc/apply_necropolis_curse(set_curse)
+/mob/living/proc/apply_necropolis_curse(set_curse, duration = 10 MINUTES)
var/datum/status_effect/necropolis_curse/C = has_status_effect(STATUS_EFFECT_NECROPOLIS_CURSE)
if(!set_curse)
set_curse = pick(CURSE_BLINDING, CURSE_SPAWNING, CURSE_WASTING, CURSE_GRASPING)
@@ -366,11 +366,11 @@
apply_status_effect(STATUS_EFFECT_NECROPOLIS_CURSE, set_curse)
else
C.apply_curse(set_curse)
- C.duration += 3000 //additional curses add 5 minutes
+ C.duration += duration * 0.5 //additional curses add half their duration
/datum/status_effect/necropolis_curse
id = "necrocurse"
- duration = 6000 //you're cursed for 10 minutes have fun
+ duration = 10 MINUTES //you're cursed for 10 minutes have fun
tick_interval = 50
alert_type = null
var/curse_flags = NONE
diff --git a/code/modules/antagonists/revenant/revenant_blight.dm b/code/modules/antagonists/revenant/revenant_blight.dm
index 7037ecae86..645a664f66 100644
--- a/code/modules/antagonists/revenant/revenant_blight.dm
+++ b/code/modules/antagonists/revenant/revenant_blight.dm
@@ -12,8 +12,8 @@
disease_flags = CURABLE
permeability_mod = 1
severity = DISEASE_SEVERITY_HARMFUL
- var/stagedamage = 0 //Highest stage reached.
var/finalstage = 0 //Because we're spawning off the cure in the final stage, we need to check if we've done the final stage's effects.
+ var/datum/mood_event/revenant_blight/depression
/datum/disease/revblight/cure()
if(affected_mob)
@@ -21,12 +21,13 @@
if(affected_mob.dna && affected_mob.dna.species)
affected_mob.dna.species.handle_mutant_bodyparts(affected_mob)
affected_mob.dna.species.handle_hair(affected_mob)
- to_chat(affected_mob, "You feel better.")
+ SEND_SIGNAL(affected_mob, COMSIG_CLEAR_MOOD_EVENT, "rev_blight")
..()
/datum/disease/revblight/stage_act()
if(!finalstage)
- if(affected_mob.lying && prob(stage*6))
+ if(affected_mob.lying && prob(stage*4))
+ to_chat(affected_mob, "You feel better.")
cure()
return
if(prob(stage*3))
@@ -34,10 +35,6 @@
affected_mob.confused += 8
affected_mob.adjustStaminaLoss(8)
new /obj/effect/temp_visual/revenant(affected_mob.loc)
- if(stagedamage < stage)
- stagedamage++
- affected_mob.adjustToxLoss(stage*2) //should, normally, do about 30 toxin damage.
- new /obj/effect/temp_visual/revenant(affected_mob.loc)
if(prob(45))
affected_mob.adjustStaminaLoss(stage)
..() //So we don't increase a stage before applying the stage damage.
@@ -46,9 +43,13 @@
if(prob(5))
affected_mob.emote("pale")
if(3)
+ if(!depression)
+ depression = SEND_SIGNAL(affected_mob, COMSIG_ADD_MOOD_EVENT, "rev_blight", /datum/mood_event/revenant_blight)
+ SEND_SIGNAL(affected_mob, COMSIG_DECREASE_SANITY, 0.12, SANITY_CRAZY)
if(prob(10))
affected_mob.emote(pick("pale","shiver"))
if(4)
+ SEND_SIGNAL(affected_mob, COMSIG_DECREASE_SANITY, 0.18, SANITY_CRAZY)
if(prob(15))
affected_mob.emote(pick("pale","shiver","cries"))
if(5)
@@ -56,12 +57,18 @@
finalstage = TRUE
to_chat(affected_mob, "You feel like [pick("nothing's worth it anymore", "nobody ever needed your help", "nothing you did mattered", "everything you tried to do was worthless")].")
affected_mob.adjustStaminaLoss(45)
- new /obj/effect/temp_visual/revenant(affected_mob.loc)
- if(affected_mob.dna && affected_mob.dna.species)
+ if(affected_mob.dna?.species)
affected_mob.dna.species.handle_mutant_bodyparts(affected_mob,"#1d2953")
affected_mob.dna.species.handle_hair(affected_mob,"#1d2953")
affected_mob.visible_message("[affected_mob] looks terrifyingly gaunt...", "You suddenly feel like your skin is wrong...")
affected_mob.add_atom_colour("#1d2953", TEMPORARY_COLOUR_PRIORITY)
- addtimer(CALLBACK(src, .proc/cure), 100)
- else
- return
+ new /obj/effect/temp_visual/revenant(affected_mob.loc)
+ addtimer(CALLBACK(src, .proc/curses), 150)
+
+/datum/disease/revblight/proc/curses()
+ if(QDELETED(affected_mob))
+ return
+ affected_mob.playsound_local(affected_mob, 'sound/effects/curse5.ogg', 40, 1, -1)
+ to_chat(affected_mob, "You sense the terrific curse of a vengeful ghost befall upon you...")
+ target_mob.apply_necropolis_curse(null, 7 MINUTES) //Once the blight has done its course without being cured beforehand, it will cast a necrocurse to compensate how underpowered it's.
+ cure()
From 75ae73dc1b83bc795e6bcb49eae57a4d6fdc1597 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Sun, 22 Sep 2019 18:43:44 +0200
Subject: [PATCH 02/44] u n d e f i n e d v a r
---
code/modules/antagonists/revenant/revenant_blight.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/antagonists/revenant/revenant_blight.dm b/code/modules/antagonists/revenant/revenant_blight.dm
index 645a664f66..10ba843975 100644
--- a/code/modules/antagonists/revenant/revenant_blight.dm
+++ b/code/modules/antagonists/revenant/revenant_blight.dm
@@ -70,5 +70,5 @@
return
affected_mob.playsound_local(affected_mob, 'sound/effects/curse5.ogg', 40, 1, -1)
to_chat(affected_mob, "You sense the terrific curse of a vengeful ghost befall upon you...")
- target_mob.apply_necropolis_curse(null, 7 MINUTES) //Once the blight has done its course without being cured beforehand, it will cast a necrocurse to compensate how underpowered it's.
+ affected_mob.apply_necropolis_curse(null, 7 MINUTES) //Once the blight has done its course without being cured beforehand, it will cast a necrocurse to compensate how underpowered it's.
cure()
From bb4e279b72e992eb65f1076c01775cb6aa951570 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Sun, 22 Sep 2019 18:54:33 +0200
Subject: [PATCH 03/44] Bumping harmfulness.
---
code/modules/antagonists/revenant/revenant_blight.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/antagonists/revenant/revenant_blight.dm b/code/modules/antagonists/revenant/revenant_blight.dm
index 10ba843975..89d8de283a 100644
--- a/code/modules/antagonists/revenant/revenant_blight.dm
+++ b/code/modules/antagonists/revenant/revenant_blight.dm
@@ -11,7 +11,7 @@
viable_mobtypes = list(/mob/living/carbon/human)
disease_flags = CURABLE
permeability_mod = 1
- severity = DISEASE_SEVERITY_HARMFUL
+ severity = DISEASE_SEVERITY_DANGEROUS
var/finalstage = 0 //Because we're spawning off the cure in the final stage, we need to check if we've done the final stage's effects.
var/datum/mood_event/revenant_blight/depression
From 9cc480a5eb07ebea9e3ca8f81c2555e80b418162 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Sun, 22 Sep 2019 19:02:49 +0200
Subject: [PATCH 04/44] datum source.
---
code/datums/components/mood.dm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm
index 70c66b9e70..eb381af577 100644
--- a/code/datums/components/mood.dm
+++ b/code/datums/components/mood.dm
@@ -222,7 +222,7 @@
/datum/component/mood/proc/DecreaseSanity(datum/source, amount, minimum = SANITY_INSANE)
if(sanity < minimum) //This might make KevinZ stop fucking pinging me.
- IncreaseSanity(0.5)
+ IncreaseSanity(src, 0.5)
else
sanity = max(minimum, sanity - amount)
if(sanity < SANITY_UNSTABLE)
@@ -237,7 +237,7 @@
if(HAS_TRAIT(owner, TRAIT_UNSTABLE))
return
if(sanity > maximum)
- DecreaseSanity(0.5) //Removes some sanity to go back to our current limit.
+ DecreaseSanity(src, 0.5) //Removes some sanity to go back to our current limit.
else
sanity = min(maximum, sanity + amount)
if(sanity > SANITY_CRAZY)
From fc933ab7bbb6f1ba3f05073895b55b9f3700f9c7 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Sun, 22 Sep 2019 19:05:55 +0200
Subject: [PATCH 05/44] setting durations.
---
code/datums/status_effects/debuffs.dm | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm
index 158dfe0dae..269b880ecc 100644
--- a/code/datums/status_effects/debuffs.dm
+++ b/code/datums/status_effects/debuffs.dm
@@ -363,7 +363,8 @@
if(!set_curse)
set_curse = pick(CURSE_BLINDING, CURSE_SPAWNING, CURSE_WASTING, CURSE_GRASPING)
if(QDELETED(C))
- apply_status_effect(STATUS_EFFECT_NECROPOLIS_CURSE, set_curse)
+ apply_status_effect(STATUS_EFFECT_NECROPOLIS_CURSE, set_curse, duration)
+
else
C.apply_curse(set_curse)
C.duration += duration * 0.5 //additional curses add half their duration
@@ -378,7 +379,8 @@
var/effect_cooldown = 100
var/obj/effect/temp_visual/curse/wasting_effect = new
-/datum/status_effect/necropolis_curse/on_creation(mob/living/new_owner, set_curse)
+/datum/status_effect/necropolis_curse/on_creation(mob/living/new_owner, set_curse, _duration)
+ duration = _duration
. = ..()
if(.)
apply_curse(set_curse)
From f449849bca92fabcf8e33e21d9d3f939204b59c3 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Sun, 22 Sep 2019 19:06:34 +0200
Subject: [PATCH 06/44] if
---
code/datums/status_effects/debuffs.dm | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm
index 269b880ecc..8191ea985c 100644
--- a/code/datums/status_effects/debuffs.dm
+++ b/code/datums/status_effects/debuffs.dm
@@ -380,7 +380,8 @@
var/obj/effect/temp_visual/curse/wasting_effect = new
/datum/status_effect/necropolis_curse/on_creation(mob/living/new_owner, set_curse, _duration)
- duration = _duration
+ if(_duration)
+ duration = _duration
. = ..()
if(.)
apply_curse(set_curse)
From d706944e20a9027f818a2cd0d0c496ab4d73e9ea Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Sat, 5 Oct 2019 04:37:01 +0200
Subject: [PATCH 07/44] The niche singularity beacon now also moderately buffs
meteor waves.
---
code/game/machinery/syndicatebeacon.dm | 14 ++++++++++++++
code/modules/events/meteor_wave.dm | 8 ++++++++
code/modules/uplink/uplink_items.dm | 7 ++++---
3 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm
index a1ed7fb848..cacc109793 100644
--- a/code/game/machinery/syndicatebeacon.dm
+++ b/code/game/machinery/syndicatebeacon.dm
@@ -1,3 +1,7 @@
+GLOBAL_INIT_LIST(singularity_beacons)
+
+#define METEOR_DISASTER_MODIFIER 0.5
+
////////////////////////////////////////
//Singularity beacon
////////////////////////////////////////
@@ -18,11 +22,16 @@
var/icontype = "beacon"
+
+
/obj/machinery/power/singularity_beacon/proc/Activate(mob/user = null)
if(surplus() < 1500)
if(user)
to_chat(user, "The connected wire doesn't have enough current.")
return
+ GLOB.singularity_beacons += src
+ for(var/datum/round_event_control/meteor_wave/W in SSevents.control)
+ W.weight += round(initial(W.weight) * METEOR_DISASTER_MODIFIER))
for(var/obj/singularity/singulo in GLOB.singularities)
if(singulo.z == z)
singulo.target = src
@@ -40,6 +49,9 @@
active = 0
if(user)
to_chat(user, "You deactivate the beacon.")
+ GLOB.singularity_beacons -= src
+ for(var/datum/round_event_control/meteor_wave/W in SSevents.control)
+ W.weight -= round(initial(W.weight) * METEOR_DISASTER_MODIFIER))
/obj/machinery/power/singularity_beacon/attack_ai(mob/user)
@@ -133,3 +145,5 @@
/obj/item/sbeacondrop/clownbomb
desc = "A label on it reads: Warning: Activating this device will send a silly explosive to your location."
droptype = /obj/machinery/syndicatebomb/badmin/clown
+
+#undef METEOR_DISASTER_MODIFIER
diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm
index af22ae3b96..fc10b5ac90 100644
--- a/code/modules/events/meteor_wave.dm
+++ b/code/modules/events/meteor_wave.dm
@@ -1,5 +1,8 @@
// Normal strength
+#define SINGULO_BEACON_DISTURBANCE 0.2 //singularity beacon also improve the odds of meteor waves and speed them up a little.
+#define SINGULO_BEACON_MAX_DISTURBANCE 0.6 //maximum cap due to how meteor waves can be potentially round ending.
+
/datum/round_event_control/meteor_wave
name = "Meteor Wave: Normal"
typepath = /datum/round_event/meteor_wave
@@ -18,6 +21,8 @@
/datum/round_event/meteor_wave/setup()
announceWhen = 1
startWhen = rand(300, 600) //Yeah for SOME REASON this is measured in seconds and not deciseconds???
+ if(GLOB.singularity_beacons.len)
+ startWhen *= 1 - min(GLOB.singularity_beacons.len * SINGULO_BEACON_DISTURBANCE, SINGULO_BEACON_MAX_DISTURBANCE)
endWhen = startWhen + 60
@@ -79,3 +84,6 @@
/datum/round_event/meteor_wave/catastrophic
wave_name = "catastrophic"
+
+#undef SINGULO_BEACON_DISTURBANCE
+#undef SINGULO_BEACON_MAX_DISTURBANCE
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index 09e955d2f9..c7cc7d59e8 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -1487,9 +1487,10 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
/datum/uplink_item/device_tools/singularity_beacon
name = "Power Beacon"
desc = "When screwed to wiring attached to an electric grid and activated, this large device pulls any \
- active gravitational singularities or tesla balls towards it. This will not work when the engine is still \
- in containment. Because of its size, it cannot be carried. Ordering this \
- sends you a small beacon that will teleport the larger beacon to your location upon activation."
+ active gravitational singularities or tesla balls towards it (provided they are not safely \
+ contained), as well as increasing the odds of incoming meteor waves. \
+ Because of its size, it cannot be carried. Ordering this sends you a small beacon \
+ that will teleport the larger beacon to your location upon activation."
item = /obj/item/sbeacondrop
cost = 14
From 35a69913008073ecfe2c9919159deb46b817b4b6 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Sat, 5 Oct 2019 05:14:38 +0200
Subject: [PATCH 08/44] lone rogue parenthesis
---
code/game/machinery/syndicatebeacon.dm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm
index cacc109793..175a3f72ec 100644
--- a/code/game/machinery/syndicatebeacon.dm
+++ b/code/game/machinery/syndicatebeacon.dm
@@ -31,7 +31,7 @@ GLOBAL_INIT_LIST(singularity_beacons)
return
GLOB.singularity_beacons += src
for(var/datum/round_event_control/meteor_wave/W in SSevents.control)
- W.weight += round(initial(W.weight) * METEOR_DISASTER_MODIFIER))
+ W.weight += round(initial(W.weight) * METEOR_DISASTER_MODIFIER)
for(var/obj/singularity/singulo in GLOB.singularities)
if(singulo.z == z)
singulo.target = src
@@ -51,7 +51,7 @@ GLOBAL_INIT_LIST(singularity_beacons)
to_chat(user, "You deactivate the beacon.")
GLOB.singularity_beacons -= src
for(var/datum/round_event_control/meteor_wave/W in SSevents.control)
- W.weight -= round(initial(W.weight) * METEOR_DISASTER_MODIFIER))
+ W.weight -= round(initial(W.weight) * METEOR_DISASTER_MODIFIER)
/obj/machinery/power/singularity_beacon/attack_ai(mob/user)
From 52fb4b03ac30d80035c89c3788d0b93905ec9ef4 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Sat, 5 Oct 2019 05:29:57 +0200
Subject: [PATCH 09/44] we are only keeping track of the number of singu
beacons, var more efficient.
---
code/game/machinery/syndicatebeacon.dm | 6 +++---
code/modules/events/meteor_wave.dm | 4 ++--
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm
index 175a3f72ec..3fb78ad37f 100644
--- a/code/game/machinery/syndicatebeacon.dm
+++ b/code/game/machinery/syndicatebeacon.dm
@@ -1,4 +1,4 @@
-GLOBAL_INIT_LIST(singularity_beacons)
+GLOBAL_VAR_INIT(singularity_counter, 0)
#define METEOR_DISASTER_MODIFIER 0.5
@@ -29,7 +29,7 @@ GLOBAL_INIT_LIST(singularity_beacons)
if(user)
to_chat(user, "The connected wire doesn't have enough current.")
return
- GLOB.singularity_beacons += src
+ GLOB.singularity_counter++
for(var/datum/round_event_control/meteor_wave/W in SSevents.control)
W.weight += round(initial(W.weight) * METEOR_DISASTER_MODIFIER)
for(var/obj/singularity/singulo in GLOB.singularities)
@@ -49,7 +49,7 @@ GLOBAL_INIT_LIST(singularity_beacons)
active = 0
if(user)
to_chat(user, "You deactivate the beacon.")
- GLOB.singularity_beacons -= src
+ GLOB.singularity_counter--
for(var/datum/round_event_control/meteor_wave/W in SSevents.control)
W.weight -= round(initial(W.weight) * METEOR_DISASTER_MODIFIER)
diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm
index fc10b5ac90..6f01caa275 100644
--- a/code/modules/events/meteor_wave.dm
+++ b/code/modules/events/meteor_wave.dm
@@ -21,8 +21,8 @@
/datum/round_event/meteor_wave/setup()
announceWhen = 1
startWhen = rand(300, 600) //Yeah for SOME REASON this is measured in seconds and not deciseconds???
- if(GLOB.singularity_beacons.len)
- startWhen *= 1 - min(GLOB.singularity_beacons.len * SINGULO_BEACON_DISTURBANCE, SINGULO_BEACON_MAX_DISTURBANCE)
+ if(GLOB.singularity_counter)
+ startWhen *= 1 - min(GLOB.singularity_counter * SINGULO_BEACON_DISTURBANCE, SINGULO_BEACON_MAX_DISTURBANCE)
endWhen = startWhen + 60
From fce6f134719ee788ea646f33ab8d64950e566f76 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Mon, 7 Oct 2019 23:58:15 +0200
Subject: [PATCH 10/44] Ports "Chat Subsystem ported from
TerraGov-Marine-Corps"
---
code/__DEFINES/misc.dm | 3 ++
code/__DEFINES/subsystems.dm | 5 +-
code/__HELPERS/roundend.dm | 30 +++++------
code/_globalvars/misc.dm | 2 -
code/controllers/subsystem/chat.dm | 67 +++++++++++++++++++++++++
code/modules/admin/verbs/adminhelp.dm | 6 +--
code/modules/antagonists/devil/devil.dm | 8 +--
code/modules/goonchat/browserOutput.dm | 11 ++--
tgstation.dme | 1 +
9 files changed, 105 insertions(+), 28 deletions(-)
create mode 100644 code/controllers/subsystem/chat.dm
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index b6115e93e9..97c904d4c8 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -499,3 +499,6 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S
#define VOMIT_TOXIC 1
#define VOMIT_PURPLE 2
+
+//Misc text define. Does 4 spaces. Used as a makeshift tabulator.
+#define FOURSPACES " "
diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm
index 3394fba90c..d4086bc4d9 100644
--- a/code/__DEFINES/subsystems.dm
+++ b/code/__DEFINES/subsystems.dm
@@ -83,7 +83,9 @@
#define INIT_ORDER_SHUTTLE -21
#define INIT_ORDER_MINOR_MAPPING -40
#define INIT_ORDER_PATH -50
-#define INIT_ORDER_PERSISTENCE -100
+#define INIT_ORDER_PERSISTENCE -95
+#define INIT_ORDER_CHAT -100 //Should be last to ensure chat remains smooth during init.
+
// Subsystem fire priority, from lowest to highest priority
// If the subsystem isn't listed here it's either DEFAULT or PROCESS (if it's a processing subsystem child)
@@ -114,6 +116,7 @@
#define FIRE_PRIORITY_MOBS 100
#define FIRE_PRIORITY_TGUI 110
#define FIRE_PRIORITY_TICKER 200
+#define FIRE_PRIORITY_CHAT 400
#define FIRE_PRIORITY_OVERLAYS 500
#define FIRE_PRIORITY_INPUT 1000 // This must always always be the max highest priority. Player input must never be lost.
diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm
index 0e9413520b..8e59106d98 100644
--- a/code/__HELPERS/roundend.dm
+++ b/code/__HELPERS/roundend.dm
@@ -280,41 +280,41 @@
if(GLOB.round_id)
var/statspage = CONFIG_GET(string/roundstatsurl)
var/info = statspage ? "[GLOB.round_id]" : GLOB.round_id
- parts += "[GLOB.TAB]Round ID: [info]"
+ parts += "[FOURSPACES]Round ID: [info]"
var/list/voting_results = SSvote.stored_gamemode_votes
if(length(voting_results))
- parts += "[GLOB.TAB]Voting: "
+ parts += "[FOURSPACES]Voting: "
var/total_score = 0
for(var/choice in voting_results)
var/score = voting_results[choice]
total_score += score
- parts += "[GLOB.TAB][GLOB.TAB][choice]: [score]"
+ parts += "[FOURSPACES][FOURSPACES][choice]: [score]"
- parts += "[GLOB.TAB]Shift Duration: [DisplayTimeText(world.time - SSticker.round_start_time)]"
- parts += "[GLOB.TAB]Station Integrity: [mode.station_was_nuked ? "Destroyed" : "[popcount["station_integrity"]]%"]"
+ parts += "[FOURSPACES]Shift Duration: [DisplayTimeText(world.time - SSticker.round_start_time)]"
+ parts += "[FOURSPACES]Station Integrity: [mode.station_was_nuked ? "Destroyed" : "[popcount["station_integrity"]]%"]"
var/total_players = GLOB.joined_player_list.len
if(total_players)
- parts+= "[GLOB.TAB]Total Population: [total_players]"
+ parts+= "[FOURSPACES]Total Population: [total_players]"
if(station_evacuated)
- parts += "
[GLOB.TAB]Evacuation Rate: [popcount[POPCOUNT_ESCAPEES]] ([PERCENT(popcount[POPCOUNT_ESCAPEES]/total_players)]%)"
- parts += "[GLOB.TAB](on emergency shuttle): [popcount[POPCOUNT_SHUTTLE_ESCAPEES]] ([PERCENT(popcount[POPCOUNT_SHUTTLE_ESCAPEES]/total_players)]%)"
- parts += "[GLOB.TAB]Survival Rate: [popcount[POPCOUNT_SURVIVORS]] ([PERCENT(popcount[POPCOUNT_SURVIVORS]/total_players)]%)"
+ parts += "
[FOURSPACES]Evacuation Rate: [popcount[POPCOUNT_ESCAPEES]] ([PERCENT(popcount[POPCOUNT_ESCAPEES]/total_players)]%)"
+ parts += "[FOURSPACES](on emergency shuttle): [popcount[POPCOUNT_SHUTTLE_ESCAPEES]] ([PERCENT(popcount[POPCOUNT_SHUTTLE_ESCAPEES]/total_players)]%)"
+ parts += "[FOURSPACES]Survival Rate: [popcount[POPCOUNT_SURVIVORS]] ([PERCENT(popcount[POPCOUNT_SURVIVORS]/total_players)]%)"
if(SSblackbox.first_death)
var/list/ded = SSblackbox.first_death
if(ded.len)
- parts += "[GLOB.TAB]First Death: [ded["name"]], [ded["role"]], at [ded["area"]]. Damage taken: [ded["damage"]].[ded["last_words"] ? " Their last words were: \"[ded["last_words"]]\"" : ""]"
+ parts += "[FOURSPACES]First Death: [ded["name"]], [ded["role"]], at [ded["area"]]. Damage taken: [ded["damage"]].[ded["last_words"] ? " Their last words were: \"[ded["last_words"]]\"" : ""]"
//ignore this comment, it fixes the broken sytax parsing caused by the " above
else
- parts += "[GLOB.TAB]Nobody died this shift!"
+ parts += "[FOURSPACES]Nobody died this shift!"
if(istype(SSticker.mode, /datum/game_mode/dynamic))
var/datum/game_mode/dynamic/mode = SSticker.mode
- parts += "[GLOB.TAB]Threat level: [mode.threat_level]"
- parts += "[GLOB.TAB]Threat left: [mode.threat]"
- parts += "[GLOB.TAB]Executed rules:"
+ parts += "[FOURSPACES]Threat level: [mode.threat_level]"
+ parts += "[FOURSPACES]Threat left: [mode.threat]"
+ parts += "[FOURSPACES]Executed rules:"
for(var/datum/dynamic_ruleset/rule in mode.executed_rules)
- parts += "[GLOB.TAB][GLOB.TAB][rule.ruletype] - [rule.name]: -[rule.cost] threat"
+ parts += "[FOURSPACES][FOURSPACES][rule.ruletype] - [rule.name]: -[rule.cost] threat"
return parts.Join("
")
/client/proc/roundend_report_file()
diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm
index e7b2ae6cbe..037e5067d8 100644
--- a/code/_globalvars/misc.dm
+++ b/code/_globalvars/misc.dm
@@ -6,8 +6,6 @@ GLOBAL_VAR_INIT(timezoneOffset, 0) // The difference betwen midnight (of the hos
// However it'd be ok to use for accessing attack logs and such too, which are even laggier.
GLOBAL_VAR_INIT(fileaccess_timer, 0)
-GLOBAL_VAR_INIT(TAB, " ")
-
GLOBAL_DATUM_INIT(data_core, /datum/datacore, new)
GLOBAL_VAR_INIT(CELLRATE, 0.002) // conversion ratio between a watt-tick and kilojoule
diff --git a/code/controllers/subsystem/chat.dm b/code/controllers/subsystem/chat.dm
new file mode 100644
index 0000000000..37e53e8990
--- /dev/null
+++ b/code/controllers/subsystem/chat.dm
@@ -0,0 +1,67 @@
+SUBSYSTEM_DEF(chat)
+ name = "Chat"
+ flags = SS_TICKER|SS_NO_INIT
+ wait = 1
+ priority = FIRE_PRIORITY_CHAT
+ init_order = INIT_ORDER_CHAT
+ var/list/payload = list()
+
+
+/datum/controller/subsystem/chat/fire()
+ for(var/i in payload)
+ var/client/C = i
+ C << output(payload[C], "browseroutput:output")
+ payload -= C
+
+ if(MC_TICK_CHECK)
+ return
+
+
+/datum/controller/subsystem/chat/proc/queue(target, message, handle_whitespace = TRUE)
+ if(!target || !message)
+ return
+
+ if(!istext(message))
+ stack_trace("to_chat called with invalid input type")
+ return
+
+ if(target == world)
+ target = GLOB.clients
+
+ //Some macros remain in the string even after parsing and fuck up the eventual output
+ message = replacetext(message, "\improper", "")
+ message = replacetext(message, "\proper", "")
+ if(handle_whitespace)
+ message = replacetext(message, "\n", "
")
+ message = replacetext(message, "\t", "[FOURSPACES][FOURSPACES]")
+ message += "
"
+
+
+ //url_encode it TWICE, this way any UTF-8 characters are able to be decoded by the Javascript.
+ //Do the double-encoding here to save nanoseconds
+ var/twiceEncoded = url_encode(url_encode(message))
+
+ if(islist(target))
+ for(var/I in target)
+ var/client/C = CLIENT_FROM_VAR(I) //Grab us a client if possible
+
+ if(!C?.chatOutput || C.chatOutput.broken) //A player who hasn't updated his skin file.
+ continue
+
+ if(!C.chatOutput.loaded) //Client still loading, put their messages in a queue
+ C.chatOutput.messageQueue += message
+ continue
+
+ payload[C] += twiceEncoded
+
+ else
+ var/client/C = CLIENT_FROM_VAR(target) //Grab us a client if possible
+
+ if(!C?.chatOutput || C.chatOutput.broken) //A player who hasn't updated his skin file.
+ return
+
+ if(!C.chatOutput.loaded) //Client still loading, put their messages in a queue
+ C.chatOutput.messageQueue += message
+ return
+
+ payload[C] += twiceEncoded
diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm
index 91fdc78d20..4e58a9cba5 100644
--- a/code/modules/admin/verbs/adminhelp.dm
+++ b/code/modules/admin/verbs/adminhelp.dm
@@ -413,9 +413,9 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
dat += "CLOSED"
else
dat += "UNKNOWN"
- dat += "[GLOB.TAB][TicketHref("Refresh", ref_src)][GLOB.TAB][TicketHref("Re-Title", ref_src, "retitle")]"
+ dat += "[FOURSPACES][TicketHref("Refresh", ref_src)][FOURSPACES][TicketHref("Re-Title", ref_src, "retitle")]"
if(state != AHELP_ACTIVE)
- dat += "[GLOB.TAB][TicketHref("Reopen", ref_src, "reopen")]"
+ dat += "[FOURSPACES][TicketHref("Reopen", ref_src, "reopen")]"
dat += "
Opened at: [GAMETIMESTAMP("hh:mm:ss", closed_at)] (Approx [DisplayTimeText(world.time - opened_at)] ago)"
if(closed_at)
dat += "
Closed at: [GAMETIMESTAMP("hh:mm:ss", closed_at)] (Approx [DisplayTimeText(world.time - closed_at)] ago)"
@@ -423,7 +423,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
if(initiator)
dat += "Actions: [FullMonty(ref_src)]
"
else
- dat += "DISCONNECTED[GLOB.TAB][ClosureLinks(ref_src)]
"
+ dat += "DISCONNECTED[FOURSPACES][ClosureLinks(ref_src)]
"
dat += "
Log:
"
for(var/I in _interactions)
dat += "[I]
"
diff --git a/code/modules/antagonists/devil/devil.dm b/code/modules/antagonists/devil/devil.dm
index 3f2bd003a3..dc649025d2 100644
--- a/code/modules/antagonists/devil/devil.dm
+++ b/code/modules/antagonists/devil/devil.dm
@@ -539,10 +539,10 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master",
var/list/parts = list()
parts += "The devil's true name is: [truename]"
parts += "The devil's bans were:"
- parts += "[GLOB.TAB][GLOB.lawlorify[LORE][ban]]"
- parts += "[GLOB.TAB][GLOB.lawlorify[LORE][bane]]"
- parts += "[GLOB.TAB][GLOB.lawlorify[LORE][obligation]]"
- parts += "[GLOB.TAB][GLOB.lawlorify[LORE][banish]]"
+ parts += "[FOURSPACES][GLOB.lawlorify[LORE][ban]]"
+ parts += "[FOURSPACES][GLOB.lawlorify[LORE][bane]]"
+ parts += "[FOURSPACES][GLOB.lawlorify[LORE][obligation]]"
+ parts += "[FOURSPACES][GLOB.lawlorify[LORE][banish]]"
return parts.Join("
")
/datum/antagonist/devil/roundend_report()
diff --git a/code/modules/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm
index 082f20f524..72e0576f4c 100644
--- a/code/modules/goonchat/browserOutput.dm
+++ b/code/modules/goonchat/browserOutput.dm
@@ -181,8 +181,8 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico
log_world("\[[time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")]\] Client: [(src.owner.key ? src.owner.key : src.owner)] triggered JS error: [error]")
//Global chat procs
-/proc/to_chat(target, message, handle_whitespace=TRUE)
- if(!target)
+/proc/to_chat_immediate(target, message, handle_whitespace=TRUE)
+ if(!target || !message)
return
//Ok so I did my best but I accept that some calls to this will be for shit like sound and images
@@ -204,7 +204,7 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico
message = replacetext(message, "\proper", "")
if(handle_whitespace)
message = replacetext(message, "\n", "
")
- message = replacetext(message, "\t", "[GLOB.TAB][GLOB.TAB]")
+ message = replacetext(message, "\t", "[FOURSPACES][FOURSPACES]")
if(islist(target))
// Do the double-encoding outside the loop to save nanoseconds
@@ -247,6 +247,11 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico
// url_encode it TWICE, this way any UTF-8 characters are able to be decoded by the Javascript.
C << output(url_encode(url_encode(message)), "browseroutput:output")
+/proc/to_chat(target, message, handle_whitespace = TRUE)
+ if(Master.current_runlevel == RUNLEVEL_INIT || !SSchat?.initialized)
+ to_chat_immediate(target, message, handle_whitespace)
+ return
+ SSchat.queue(target, message, handle_whitespace)
/datum/chatOutput/proc/swaptolightmode() //Dark mode light mode stuff. Yell at KMC if this breaks! (See darkmode.dm for documentation)
owner.force_white_theme()
diff --git a/tgstation.dme b/tgstation.dme
index cceeb1f915..8b5ea81313 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -231,6 +231,7 @@
#include "code\controllers\subsystem\atoms.dm"
#include "code\controllers\subsystem\augury.dm"
#include "code\controllers\subsystem\blackbox.dm"
+#include "code\controllers\subsystem\chat.dm"
#include "code\controllers\subsystem\communications.dm"
#include "code\controllers\subsystem\dbcore.dm"
#include "code\controllers\subsystem\dcs.dm"
From 9ee1987dec41ef91ff44a4216a376e69fd4d990e Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Tue, 8 Oct 2019 20:04:08 +0200
Subject: [PATCH 11/44] Applying kevinz' ominous warning suggestion
---
code/game/machinery/syndicatebeacon.dm | 14 ++++++++++----
code/modules/events/meteor_wave.dm | 2 +-
2 files changed, 11 insertions(+), 5 deletions(-)
diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm
index 3fb78ad37f..67c9627423 100644
--- a/code/game/machinery/syndicatebeacon.dm
+++ b/code/game/machinery/syndicatebeacon.dm
@@ -25,10 +25,12 @@ GLOBAL_VAR_INIT(singularity_counter, 0)
/obj/machinery/power/singularity_beacon/proc/Activate(mob/user = null)
+ if(active)
+ return FALSE
if(surplus() < 1500)
if(user)
to_chat(user, "The connected wire doesn't have enough current.")
- return
+ return FALSE
GLOB.singularity_counter++
for(var/datum/round_event_control/meteor_wave/W in SSevents.control)
W.weight += round(initial(W.weight) * METEOR_DISASTER_MODIFIER)
@@ -36,22 +38,26 @@ GLOBAL_VAR_INIT(singularity_counter, 0)
if(singulo.z == z)
singulo.target = src
icon_state = "[icontype]1"
- active = 1
+ active = TRUE
if(user)
to_chat(user, "You activate the beacon.")
+ return TRUE
-/obj/machinery/power/singularity_beacon/proc/Deactivate(mob/user = null)
+/obj/machinery/power/singularity_beacon/proc/Deactivate(mob/user)
+ if(!active)
+ return FALSE
for(var/obj/singularity/singulo in GLOB.singularities)
if(singulo.target == src)
singulo.target = null
icon_state = "[icontype]0"
- active = 0
+ active = FALSE
if(user)
to_chat(user, "You deactivate the beacon.")
GLOB.singularity_counter--
for(var/datum/round_event_control/meteor_wave/W in SSevents.control)
W.weight -= round(initial(W.weight) * METEOR_DISASTER_MODIFIER)
+ return TRUE
/obj/machinery/power/singularity_beacon/attack_ai(mob/user)
diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm
index 6f01caa275..4584d1c2e9 100644
--- a/code/modules/events/meteor_wave.dm
+++ b/code/modules/events/meteor_wave.dm
@@ -57,7 +57,7 @@
kill()
/datum/round_event/meteor_wave/announce(fake)
- priority_announce("Meteors have been detected on collision course with the station. Estimated time until impact: [round(startWhen/60)] minutes.", "Meteor Alert", 'sound/ai/meteors.ogg')
+ priority_announce("Meteors have been detected on collision course with the station. Estimated time until impact: [round(startWhen/60)] minutes.[GLOB.singularity_counter ? " Warning: Anomalous gravity pulse detected, Syndicate technology interference likely.", ""]", "Meteor Alert", 'sound/ai/meteors.ogg')
/datum/round_event/meteor_wave/tick()
if(ISMULTIPLE(activeFor, 3))
From 2bce423ec316b6ac34411d2d3e5a860433aa1c50 Mon Sep 17 00:00:00 2001
From: Winter Flare <7543955+Owai-Seek@users.noreply.github.com>
Date: Thu, 10 Oct 2019 14:08:14 -0400
Subject: [PATCH 12/44] Added a -ton- of stuff to the Kinkmate
---
code/modules/clothing/under/accessories.dm | 8 +++++
.../reagents/reagent_containers/bottle.dm | 22 +++++++++++++
.../code/game/machinery/vending.dm | 31 +++++++++++++------
3 files changed, 52 insertions(+), 9 deletions(-)
diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm
index 878030bc5d..6dd6164d79 100644
--- a/code/modules/clothing/under/accessories.dm
+++ b/code/modules/clothing/under/accessories.dm
@@ -355,6 +355,14 @@
above_suit = TRUE
armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 20, "bio" = 20, "rad" = 5, "fire" = 0, "acid" = 25)
+/obj/item/clothing/accessory/skullcodpiece/fake
+ name = "false codpiece"
+ desc = "A plastic ornament, intended to protect the important things in life. It's not very good at it."
+ icon_state = "skull"
+ item_color = "skull"
+ above_suit = TRUE
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
+
/////////////////////
//Synda Accessories//
/////////////////////
diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm
index 249ed56d20..afe48ab3fb 100644
--- a/code/modules/reagents/reagent_containers/bottle.dm
+++ b/code/modules/reagents/reagent_containers/bottle.dm
@@ -404,3 +404,25 @@
/obj/item/reagent_containers/glass/bottle/bromine
name = "bromine bottle"
list_reagents = list("bromine" = 30)
+
+//Lewd Stuff
+
+/obj/item/reagent_containers/glass/bottle/crocin
+ name = "Crocin bottle"
+ desc = "A bottle of mild aphrodisiac. Increases libido."
+ list_reagents = list("aphro" = 30)
+
+/obj/item/reagent_containers/glass/bottle/hexacrocin
+ name = "Hexacrocin bottle"
+ desc = "A bottle of strong aphrodisiac. Increases libido."
+ list_reagents = list("aphro+" = 30)
+
+/obj/item/reagent_containers/glass/bottle/camphor
+ name = "Camphor bottle"
+ desc = "A bottle of mild anaphrodisiac. Reduces libido."
+ list_reagents = list("anaphro" = 30)
+
+/obj/item/reagent_containers/glass/bottle/hexacamphor
+ name = "Hexacamphor bottle"
+ desc = "A bottle of strong anaphrodisiac. Reduces libido."
+ list_reagents = list("anaphro+" = 30)
\ No newline at end of file
diff --git a/modular_citadel/code/game/machinery/vending.dm b/modular_citadel/code/game/machinery/vending.dm
index 2de98a3171..be4b71ce1d 100755
--- a/modular_citadel/code/game/machinery/vending.dm
+++ b/modular_citadel/code/game/machinery/vending.dm
@@ -43,18 +43,31 @@
vend_reply = "Have fun, you shameless pervert!"
products = list(
/obj/item/clothing/under/maid = 5,
- /obj/item/clothing/under/stripper_pink = 5,
- /obj/item/clothing/under/stripper_green = 5,
- /obj/item/dildo/custom = 5
- )
- contraband = list(/obj/item/restraints/handcuffs/fake/kinky = 5,
/obj/item/clothing/neck/petcollar = 5,
- /obj/item/clothing/under/mankini = 1,
- /obj/item/dildo/flared/huge = 1
+ /obj/item/clothing/neck/petcollar/choker = 5,
+ /obj/item/clothing/neck/petcollar/leather = 5,
+ /obj/item/restraints/handcuffs/fake/kinky = 5,
+ /obj/item/clothing/glasses/sunglasses/blindfold = 4,
+ /obj/item/clothing/mask/muzzle = 4,
+ /obj/item/clothing/under/stripper_pink = 3,
+ /obj/item/clothing/under/stripper_green = 3,
+ /obj/item/dildo/custom = 5,
+ /obj/item/electropack/shockcollar = 3,
+ /obj/item/assembly/signaler = 3
+ )
+ contraband = list(
+ /obj/item/clothing/neck/petcollar/locked = 2,
+ /obj/item/key/collar = 2,
+ /obj/item/clothing/head/kitty = 3,
+ /obj/item/clothing/under/mankini = 2,
+ /obj/item/clothing/under/jabroni = 2,
+ /obj/item/dildo/flared/huge = 1,
+ /obj/item/reagent_containers/glass/bottle/crocin = 5,
+ /obj/item/reagent_containers/glass/bottle/camphor = 5
)
premium = list(
- /obj/item/electropack/shockcollar = 3,
- /obj/item/clothing/neck/petcollar/locked = 1
+ /obj/item/clothing/accessory/skullcodpiece/fake = 1,
+ /obj/item/reagent_containers/glass/bottle/hexacrocin = 5
)
refill_canister = /obj/item/vending_refill/kink
/*
From e83460853ce806f319ff757372377a955a8c4af8 Mon Sep 17 00:00:00 2001
From: r4d6 <50276533+r4d6@users.noreply.github.com>
Date: Thu, 10 Oct 2019 20:32:09 -0400
Subject: [PATCH 13/44] Update furrypeople.dm
---
.../mob/living/carbon/human/species_types/furrypeople.dm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
index e726d45347..ccdd0f4afe 100644
--- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
@@ -5,8 +5,8 @@
should_draw_citadel = TRUE
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR,HORNCOLOR)
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
- mutant_bodyparts = list("mam_tail", "mam_ears", "mam_body_markings", "mam_snouts", "taur", "horns", "legs")
- default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky",
+ mutant_bodyparts = list("mam_tail", "mam_ears", "mam_body_markings", "mam_snouts", "deco_wings", "taur", "horns", "legs")
+ default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "deco_wings" = "Angel",
"mam_body_markings" = "Husky", "taur" = "None", "horns" = "None", "legs" = "Plantigrade", "meat_type" = "Mammalian")
attack_verb = "claw"
attack_sound = 'sound/weapons/slash.ogg'
From 0d5770f986d4de1a8258ef150ca70d896089123c Mon Sep 17 00:00:00 2001
From: r4d6 <50276533+r4d6@users.noreply.github.com>
Date: Thu, 10 Oct 2019 20:32:12 -0400
Subject: [PATCH 14/44] Update species.dm
---
code/modules/mob/living/carbon/human/species.dm | 2 ++
1 file changed, 2 insertions(+)
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index b6346bead8..e248fe22fb 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -731,6 +731,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
S = GLOB.wings_list[H.dna.features["wings"]]
if("wingsopen")
S = GLOB.wings_open_list[H.dna.features["wings"]]
+ if("deco_wings")
+ S = GLOB.deco_wings_list[H.dna.features["deco_wings"]]
if("legs")
S = GLOB.legs_list[H.dna.features["legs"]]
if("insect_wings")
From 2d84b541cf6d4a52e0dcc389f68136f0b7ce25ed Mon Sep 17 00:00:00 2001
From: r4d6 <50276533+r4d6@users.noreply.github.com>
Date: Thu, 10 Oct 2019 20:32:15 -0400
Subject: [PATCH 15/44] Update wings.dm
---
.../mob/dead/new_player/sprite_accessories/wings.dm | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/wings.dm b/code/modules/mob/dead/new_player/sprite_accessories/wings.dm
index dc0e0222bf..00e03efa6b 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/wings.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/wings.dm
@@ -27,6 +27,16 @@
dimension_y = 34
locked = TRUE
+// Decorative wings
+/datum/sprite_accessory/deco_wings
+ icon = 'icons/mob/wings.dmi'
+ color_src = null
+
+/datum/sprite_accessory/deco_wings/none
+ name = "None"
+ icon_state = "none"
+
+
//INSECT WINGS
/datum/sprite_accessory/insect_wings
From ce81e657b56945b7d556f19d52920d382599c799 Mon Sep 17 00:00:00 2001
From: r4d6 <50276533+r4d6@users.noreply.github.com>
Date: Thu, 10 Oct 2019 20:32:17 -0400
Subject: [PATCH 16/44] Update preferences_savefile.dm
---
code/modules/client/preferences_savefile.dm | 3 +++
1 file changed, 3 insertions(+)
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index ebd135916c..94c1158885 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -352,6 +352,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["feature_human_tail"] >> features["tail_human"]
S["feature_human_ears"] >> features["ears"]
S["feature_insect_wings"] >> features["insect_wings"]
+ S["feature_deco_wings"] >> features["deco_wings"]
S["feature_insect_fluff"] >> features["insect_fluff"]
//Custom names
@@ -484,6 +485,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
features["body_markings"] = sanitize_inlist(features["body_markings"], GLOB.body_markings_list)
features["feature_lizard_legs"] = sanitize_inlist(features["legs"], GLOB.legs_list)
features["insect_wings"] = sanitize_inlist(features["insect_wings"], GLOB.insect_wings_list)
+ features["deco_wings"] = sanitize_inlist(features["deco_wings"], GLOB.deco_wings_list)
features["insect_fluff"] = sanitize_inlist(features["insect_fluff"], GLOB.insect_fluffs_list)
joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole))
@@ -553,6 +555,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["feature_lizard_body_markings"] , features["body_markings"])
WRITE_FILE(S["feature_lizard_legs"] , features["legs"])
WRITE_FILE(S["feature_insect_wings"] , features["insect_wings"])
+ WRITE_FILE(S["feature_deco_wings"] , features["deco_wings"])
WRITE_FILE(S["feature_insect_fluff"] , features["insect_fluff"])
WRITE_FILE(S["feature_meat"] , features["meat_type"])
From a61fed2a73d28154c3ba9ef106676dd4b3985134 Mon Sep 17 00:00:00 2001
From: r4d6 <50276533+r4d6@users.noreply.github.com>
Date: Thu, 10 Oct 2019 20:32:19 -0400
Subject: [PATCH 17/44] Update preferences.dm
---
code/modules/client/preferences.dm | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index ae6de5ba05..c6166ca970 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -95,6 +95,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
"ears" = "None",
"wings" = "None",
"frills" = "None",
+ "deco_wings" = "None",
"spines" = "None",
"body_markings" = "None",
"legs" = "Plantigrade",
@@ -583,6 +584,13 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(mutant_category >= MAX_MUTANT_ROWS)
dat += ""
mutant_category = 0
+ if("deco_wings" in pref_species.default_features)
+ if(!mutant_category)
+ dat += APPEARANCE_CATEGORY_COLUMN
+
+ dat += "