Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
9fc48d3
Create readme.md
XeonMations May 25, 2026
6379f97
reality anchors
XeonMations May 26, 2026
fff3008
Update reality_anchor.dm
XeonMations May 26, 2026
0eb628b
Update reality_anchor.dm
XeonMations May 26, 2026
3851122
Update reality_anchor.dm
XeonMations May 26, 2026
8fdc375
amnestics
XeonMations May 26, 2026
dd45e44
wew
XeonMations May 27, 2026
481ce32
awaw
XeonMations May 27, 2026
d1fbf52
awawwa
XeonMations May 27, 2026
6803344
Update modular_oculis/modules/antimemetics/code/reality_anchor.dm
XeonMations May 29, 2026
e404fcc
Update modular_oculis/modules/antimemetics/code/reality_anchor.dm
XeonMations May 29, 2026
a530659
Update modular_oculis/modules/antimemetics/code/reality_anchor.dm
XeonMations May 29, 2026
7b27425
Update modular_oculis/modules/antimemetics/code/reality_anchor.dm
XeonMations May 29, 2026
f3fbe92
Merge branch 'master' into there-is-no-antimemetics-division
XeonMations May 30, 2026
914114a
Update _traits.dm
XeonMations May 30, 2026
23f4f87
Merge branch 'there-is-no-antimemetics-division' of https://github.co…
XeonMations May 30, 2026
b6dc57e
more chemicals
XeonMations May 30, 2026
35ee150
awawwa
XeonMations May 30, 2026
73914f5
Update amnestics.dm
XeonMations May 30, 2026
ffb9b93
CHANGES
XeonMations May 30, 2026
42691b8
Update redaction_subsystem.dm
XeonMations May 30, 2026
dfcb822
awwawa
XeonMations May 30, 2026
8d0b04f
Update redaction_subsystem.dm
XeonMations May 30, 2026
f988492
Update redaction_subsystem.dm
XeonMations May 30, 2026
698df9b
Update speech.dm
XeonMations May 30, 2026
b3ec350
bugfixes with shion
XeonMations May 30, 2026
fdabc31
MORE REDACTIONS
XeonMations May 31, 2026
a0d4008
Update ntnrc_client.dm
XeonMations May 31, 2026
80afc9f
Update amnestics.dm
XeonMations May 31, 2026
fbb26b8
these people cant be trusted with remembering
XeonMations May 31, 2026
c38bb88
Merge branch 'master' into there-is-no-antimemetics-division
XeonMations Jun 4, 2026
cdbd23b
tab_indent
XeonMations Jun 10, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
GLOBAL_LIST_EMPTY(reality_anchors)
1 change: 1 addition & 0 deletions code/__DEFINES/~~oculis_defines/redaction.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#define REDACTION_FILTER_CHECK(T) (SSredaction.redacted_words_regex && findtext(T, SSredaction.redacted_words_regex))
4 changes: 4 additions & 0 deletions code/__DEFINES/~~oculis_defines/traits/declarations.dm
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,8 @@
/// When checking who receives mail, people with this trait receive none.
#define TRAIT_NO_MAIL "trait_no_mail"

/// Used in the ANTIMEMETICS module.
#define TRAIT_AMNESTICS "trait_amnestics"
#define TRAIT_MNESTICS "trait_mnestics"

// END TRAIT DEFINES
5 changes: 5 additions & 0 deletions code/__HELPERS/priority_announce.dm
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,11 @@
if(target.client?.prefs.read_preference(/datum/preference/toggle/sound_announcements))
SEND_SOUND(target, sound(sound_to_play))
*/

// OCULIS EDIT ADDITION START
if(REDACTION_FILTER_CHECK(announcement))
announcement = SSredaction.redact_sentence(announcement, usr)
// OCULIS EDIT ADDITION END
if(!sound_override)
sound_override = SSstation.announcer.get_rand_alert_sound()
else if(SSstation.announcer.event_sounds[sound_override])
Expand Down
2 changes: 2 additions & 0 deletions code/_globalvars/traits/_traits.dm
Original file line number Diff line number Diff line change
Expand Up @@ -941,6 +941,8 @@ GLOBAL_LIST_INIT(traits_by_type, list(
// OCULIS EDIT ADDITION START - OCULIS TRAITS
"TRAIT_TRADITIONAL_THINKER" = TRAIT_TRADITIONAL_THINKER,
"TRAIT_NO_MAIL" = TRAIT_NO_MAIL,
"TRAIT_AMNESTICS" = TRAIT_AMNESTICS,
"TRAIT_MNESTICS" = TRAIT_MNESTICS,
// OCULIS EDIT ADDITION END
),
// IRIS EDIT ADDITION END
Expand Down
2 changes: 2 additions & 0 deletions code/_globalvars/traits/admin_tooling.dm
Original file line number Diff line number Diff line change
Expand Up @@ -524,6 +524,8 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
// OCULIS EDIT ADDITION START - OCULIS TRAITS
"TRAIT_TRADITIONAL_THINKER" = TRAIT_TRADITIONAL_THINKER,
"TRAIT_NO_MAIL" = TRAIT_NO_MAIL,
"TRAIT_AMNESTICS" = TRAIT_AMNESTICS,
"TRAIT_MNESTICS" = TRAIT_MNESTICS,
// OCULIS EDIT ADDITION END
),
// IRIS EDIT ADDITION END
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,10 @@
channel.add_client(src)
return TRUE

// OCULIS EDIT START
if(REDACTION_FILTER_CHECK(message))
message = SSredaction.redact_sentence(message, usr)
// OCULIS EDIT END
channel.add_message(message, username)
var/mob/living/user = usr
user.log_talk(message, LOG_CHAT, tag = "as [username] to channel [channel.title]")
Expand Down
84 changes: 84 additions & 0 deletions modular_oculis/modules/antimemetics/code/amnestics.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
/datum/chemical_reaction/amnestic
results = list(/datum/reagent/medicine/amnestic = 5)
required_reagents = list(
/datum/reagent/medicine/ondansetron = 1,
/datum/reagent/medicine/polypyr = 1,
/datum/reagent/medicine/rezadone = 1,
/datum/reagent/medicine/neurine = 1,
/datum/reagent/toxin/amanitin = 1,
)
reaction_tags = NONE

/datum/reagent/medicine/amnestic
name = "Class A Amnestics"
description = "A standard for keeping secrets."
color = "#a5a5a5"
overdose_threshold = 25
ph = 7
taste_description = "almonds"
chemical_flags = REAGENT_NO_RANDOM_RECIPE
metabolized_traits = list(TRAIT_AMNESTICS)

/datum/reagent/medicine/amnestic/on_mob_metabolize(mob/living/carbon/affected_mob)
. = ..()
if(!HAS_TRAIT(affected_mob, TRAIT_MNESTICS))
to_chat(affected_mob, span_big(span_hypnophrase("You feel specific memories slipping away.")))

/datum/reagent/medicine/amnestic/on_mob_end_metabolize(mob/living/carbon/affected_mob)
. = ..()
if(!HAS_TRAIT(affected_mob, TRAIT_MNESTICS))
to_chat(affected_mob, span_big(span_hypnophrase("You can't seem to remember what you forgot...")))

/datum/reagent/medicine/amnestic/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, metabolization_ratio)
. = ..()
if(SPT_PROB(25, seconds_per_tick))
affected_mob.adjust_drowsiness_up_to(0.5 SECONDS * normalise_creation_purity() * seconds_per_tick * metabolization_ratio, 30 SECONDS)
affected_mob.adjust_staggered_up_to(0.5 SECONDS * normalise_creation_purity() * seconds_per_tick * metabolization_ratio, 30 SECONDS)

/datum/reagent/medicine/amnestic/overdose_process(mob/living/affected_mob, seconds_per_tick, metabolization_ratio)
if(SPT_PROB(25, seconds_per_tick))
affected_mob.adjust_organ_loss(ORGAN_SLOT_BRAIN, 0.25 * seconds_per_tick * metabolization_ratio, required_organ_flag = affected_organ_flags)
affected_mob.adjust_confusion_up_to(0.5 SECONDS * normalise_creation_purity() * seconds_per_tick * metabolization_ratio, 30 SECONDS)
affected_mob.adjust_staggered_up_to(0.5 SECONDS * normalise_creation_purity() * seconds_per_tick * metabolization_ratio, 30 SECONDS)
return TRUE

/obj/item/reagent_containers/cup/bottle/amnestic
name = "class a amnestic bottle"
desc = "A small bottle of amnestics."
list_reagents = list(/datum/reagent/medicine/amnestic = 50)

/datum/reagent/medicine/amnestic_b
name = "Class B Amnestics"
description = "Retrograde amnesiac medicine."
color = "#a5a5a5"
overdose_threshold = 25
ph = 7
taste_description = "almonds"
chemical_flags = REAGENT_NO_RANDOM_RECIPE
metabolized_traits = list(TRAIT_AMNESTICS)

/datum/reagent/medicine/amnestic_b/on_mob_metabolize(mob/living/carbon/affected_mob)
. = ..()
to_chat(affected_mob, span_big(span_hypnophrase("You feel your memories slipping away, starting with your most recent ones.")))

/datum/reagent/medicine/amnestic_b/on_mob_end_metabolize(mob/living/carbon/affected_mob)
. = ..()
to_chat(affected_mob, span_big(span_hypnophrase("You can't seem to remember what you forgot...")))

/datum/reagent/medicine/amnestic_b/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, metabolization_ratio)
. = ..()
if(SPT_PROB(25, seconds_per_tick))
affected_mob.adjust_drowsiness_up_to(0.5 SECONDS * normalise_creation_purity() * seconds_per_tick * metabolization_ratio, 30 SECONDS)
affected_mob.adjust_staggered_up_to(0.5 SECONDS * normalise_creation_purity() * seconds_per_tick * metabolization_ratio, 30 SECONDS)

/datum/reagent/medicine/amnestic_b/overdose_process(mob/living/affected_mob, seconds_per_tick, metabolization_ratio)
if(SPT_PROB(25, seconds_per_tick))
affected_mob.adjust_organ_loss(ORGAN_SLOT_BRAIN, 0.25 * seconds_per_tick * metabolization_ratio, required_organ_flag = affected_organ_flags)
affected_mob.adjust_confusion_up_to(0.5 SECONDS * normalise_creation_purity() * seconds_per_tick * metabolization_ratio, 30 SECONDS)
affected_mob.adjust_staggered_up_to(0.5 SECONDS * normalise_creation_purity() * seconds_per_tick * metabolization_ratio, 30 SECONDS)
return TRUE

/obj/item/reagent_containers/cup/bottle/amnestic_b
name = "class b amnestic bottle"
desc = "A small bottle of strong amnestics."
list_reagents = list(/datum/reagent/medicine/amnestic = 50)
62 changes: 62 additions & 0 deletions modular_oculis/modules/antimemetics/code/mnestics.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
/datum/reagent/medicine/mnestic
name = "Class W Mnestics"
description = "You can never forget a dose of mnestics."
color = "#a5a5a5"
overdose_threshold = 25
ph = 7
taste_description = "almonds"
chemical_flags = REAGENT_NO_RANDOM_RECIPE
purge_multiplier = 0.15
metabolized_traits = list(TRAIT_MNESTICS)

/datum/reagent/medicine/mnestic/on_mob_metabolize(mob/living/carbon/affected_mob)
. = ..()
to_chat(affected_mob, span_big(span_boldnicegreen("You feel more in control of what you remember.")))

/datum/reagent/medicine/mnestic/on_mob_end_metabolize(mob/living/carbon/affected_mob)
. = ..()
to_chat(affected_mob, span_big(span_bolddanger("You lose the force you had on your memories.")))

/datum/reagent/medicine/mnestic/overdose_process(mob/living/affected_mob, seconds_per_tick, metabolization_ratio)
affected_mob.adjust_organ_loss(ORGAN_SLOT_BRAIN, 0.5 * seconds_per_tick * metabolization_ratio, required_organ_flag = affected_organ_flags)
affected_mob.adjust_confusion_up_to(0.5 SECONDS * normalise_creation_purity() * seconds_per_tick * metabolization_ratio, 30 SECONDS)
affected_mob.adjust_staggered_up_to(0.5 SECONDS * normalise_creation_purity() * seconds_per_tick * metabolization_ratio, 30 SECONDS)
affected_mob.adjust_eye_blur_up_to(0.5 SECONDS * normalise_creation_purity() * seconds_per_tick * metabolization_ratio, 30 SECONDS)
affected_mob.adjust_drowsiness_up_to(0.5 SECONDS * normalise_creation_purity() * seconds_per_tick * metabolization_ratio, 30 SECONDS)
return TRUE

/obj/item/reagent_containers/cup/bottle/mnestic
name = "class w mnestic bottle"
desc = "A small bottle of mnestics."
list_reagents = list(/datum/reagent/medicine/mnestic = 50)

/datum/reagent/medicine/mnestic_x
name = "Class X Mnestics"
description = "Retroactive memory repair."
color = "#a5a5a5"
overdose_threshold = 25
ph = 7
taste_description = "almonds"
chemical_flags = REAGENT_NO_RANDOM_RECIPE
purge_multiplier = 0.15

/datum/reagent/medicine/mnestic_x/on_mob_metabolize(mob/living/carbon/affected_mob)
. = ..()
to_chat(affected_mob, span_big(span_boldnicegreen("You start to remember that which you had forgotten.")))

/datum/reagent/medicine/mnestic_x/on_mob_end_metabolize(mob/living/carbon/affected_mob)
. = ..()
to_chat(affected_mob, span_big(span_bolddanger("You remember what shouldn't be remembered. It was real after all...")))

/datum/reagent/medicine/mnestic_x/overdose_process(mob/living/affected_mob, seconds_per_tick, metabolization_ratio)
affected_mob.adjust_organ_loss(ORGAN_SLOT_BRAIN, 0.5 * seconds_per_tick * metabolization_ratio, required_organ_flag = affected_organ_flags)
affected_mob.adjust_confusion_up_to(0.5 SECONDS * normalise_creation_purity() * seconds_per_tick * metabolization_ratio, 30 SECONDS)
affected_mob.adjust_staggered_up_to(0.5 SECONDS * normalise_creation_purity() * seconds_per_tick * metabolization_ratio, 30 SECONDS)
affected_mob.adjust_eye_blur_up_to(0.5 SECONDS * normalise_creation_purity() * seconds_per_tick * metabolization_ratio, 30 SECONDS)
affected_mob.adjust_drowsiness_up_to(0.5 SECONDS * normalise_creation_purity() * seconds_per_tick * metabolization_ratio, 30 SECONDS)
return TRUE

/obj/item/reagent_containers/cup/bottle/mnestic_x
name = "class x mnestic bottle"
desc = "A small bottle of strong mnestics."
list_reagents = list(/datum/reagent/medicine/mnestic_x = 50)
151 changes: 151 additions & 0 deletions modular_oculis/modules/antimemetics/code/reality_anchor.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
/obj/item/circuitboard/machine/reality_anchor
name = "Reality Anchor"
greyscale_colors = COLOR_DARK_PURPLE
build_path = /obj/machinery/power/reality_anchor
req_components = list(
/obj/item/stack/cable_coil = 5,
/datum/stock_part/servo/tier4 = 2,
/datum/stock_part/micro_laser/tier4 = 4,
/datum/stock_part/matter_bin/tier4 = 2,
/obj/item/stack/sheet/bluespace_crystal = 1,
)

/obj/machinery/power/reality_anchor
name = "dunmore reality anchor"
desc = "A machine made to make reality more stable. A direct power connection is heavily recommended."
icon = 'modular_oculis/modules/antimemetics/icons/reality_anchor.dmi'
icon_state = "reality_anchor"
base_icon_state = "reality_anchor"
density = TRUE
use_power = IDLE_POWER_USE
circuit = /obj/item/circuitboard/machine/reality_anchor
critical_machine = TRUE
active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 10 // 1 MW
idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION

/// Is it about to explode?
VAR_PRIVATE/going_kaboom = FALSE

var/on = FALSE

/obj/machinery/power/reality_anchor/Initialize(mapload)
. = ..()
connect_to_network()
GLOB.reality_anchors += src

/obj/machinery/power/reality_anchor/Destroy()
GLOB.reality_anchors -= src
return ..()

/obj/machinery/power/reality_anchor/examine(mob/user)
. = ..()
if(on)
. += span_purple("You feel stable.")

/obj/machinery/power/reality_anchor/update_icon_state()
. = ..()
if(panel_open)
icon_state = "[base_icon_state]_open"
return
if(on)
icon_state = "[base_icon_state]_on"
else
icon_state = "[base_icon_state]"

/obj/machinery/power/reality_anchor/screwdriver_act(mob/living/user, obj/item/tool)
if(on)
balloon_alert(user, "turn off first!")
return ITEM_INTERACT_BLOCKING
return default_deconstruction_screwdriver(user, tool)

/obj/machinery/power/reality_anchor/crowbar_act(mob/living/user, obj/item/tool)
if(on)
balloon_alert(user, "turn off first!")
return ITEM_INTERACT_BLOCKING
return default_deconstruction_crowbar(user, tool)

/obj/machinery/power/reality_anchor/wrench_act(mob/living/user, obj/item/tool)
. = ..()
if(on)
balloon_alert(user, "turn off first!")
return ITEM_INTERACT_BLOCKING
default_unfasten_wrench(user, tool)
if(anchored)
connect_to_network()
else
disconnect_from_network()
return ITEM_INTERACT_SUCCESS

/obj/machinery/power/reality_anchor/interact(mob/user)
. = ..()
if(!anchored)
balloon_alert(user, "anchor first!")
return FALSE
toggle_power(user)

/obj/machinery/power/reality_anchor/proc/toggle_power(mob/user)
if(!powered())
balloon_alert(user, "no power!")
return
on = !on
update_use_power(on ? ACTIVE_POWER_USE : IDLE_POWER_USE)
update_current_power_usage()
playsound(src, 'modular_nova/master_files/sound/effects/gmalfunction.ogg', 100, TRUE)
balloon_alert_to_viewers("[on ? null : "de"]activated!")
update_icon()

/obj/machinery/power/reality_anchor/power_change()
. = ..()
if((machine_stat & NOPOWER) && on)
on = FALSE
update_use_power(IDLE_POWER_USE)
update_current_power_usage()
playsound(src, 'modular_nova/master_files/sound/effects/gmalfunction.ogg', 100, TRUE)
balloon_alert_to_viewers("deactivated!")
update_appearance(UPDATE_ICON_STATE)

/obj/machinery/power/reality_anchor/proc/overload()
if(!on)
return
if(going_kaboom)
return
going_kaboom = TRUE
visible_message(
message = span_danger("[src] lets out a shower of sparks as it starts to lose stability!"),
blind_message = span_hear("You hear a loud electrical crack!"),
)
playsound(src, 'sound/effects/magic/lightningshock.ogg', 100, TRUE, extrarange = 5)
tesla_zap(source = src, zap_range = 5, power = 20 KILO WATTS)
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(explosion), src, 2, 3, 4, null, 8), 10 SECONDS) // Not a normal explosion.

/obj/machinery/power/reality_anchor/bullet_act(obj/projectile/proj)
. = ..()
if(!going_kaboom && istype(proj) && proj.damage > 0 && ((proj.damage_type == BURN) || (proj.damage_type == BRUTE)))
log_bomber(proj.firer, "triggered a", src, "explosion via projectile")
overload()

/obj/machinery/power/reality_anchor/blob_act(obj/structure/blob/B)
if(on)
overload()
return TRUE
return ..()

/obj/machinery/power/reality_anchor/ex_act()
if(on)
if(going_kaboom)
qdel(src)
else
overload()
return TRUE
return ..()

/obj/machinery/power/reality_anchor/fire_act(exposed_temperature, exposed_volume)
if(on)
overload()
return TRUE
return ..()

/obj/machinery/power/reality_anchor/zap_act(power, zap_flags)
. = ..() //extend the zap
if(zap_flags & ZAP_MACHINE_EXPLOSIVE)
overload()
Binary file not shown.
31 changes: 31 additions & 0 deletions modular_oculis/modules/antimemetics/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
https://github.com/Monkestation/OculisStation/pull/255

## \<Antimemetics>

Module ID: ANTIMEMETICS

### Description:

This entire module contains everything relating to mechanical memetics, antimemetics, memes and antimemes, and related phenomena that are mainly used for admin / event shenanigens for Oculis Station.

### TG Proc/File Changes:

- `code/__HELPERS/priority_announce.dm`

### Modular Overrides:

- N/A

### Defines:

- `code/__DEFINES/~~oculis_defines/traits/declarations.dm`
- `code/__DEFINES/~~oculis_defines/_globalvars/lists/objects.dm`
- `code/__DEFINES/~~oculis_defines/redaction.dm`

### Included files that are not contained in this module:

- N/A

### Credits:

XeonMations
Loading
Loading