From bd87d46ce61b8f5b37198814172fd3974baf7f77 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Sat, 29 Feb 2020 15:07:44 +0100
Subject: [PATCH 001/124] Deletes the preferences_vore datum and migrates its
contents to preferences.
---
code/__DEFINES/say.dm | 3 +-
code/__HELPERS/_cit_helpers.dm | 4 +-
code/game/machinery/cloning.dm | 10 +-
code/modules/client/client_procs.dm | 8 -
code/modules/client/preferences.dm | 14 +-
code/modules/client/preferences_savefile.dm | 68 ++++++--
code/modules/mob/living/login.dm | 2 +-
code/modules/vore/eating/belly_obj.dm | 8 +
code/modules/vore/eating/living.dm | 80 ++++-----
code/modules/vore/eating/vore.dm | 174 --------------------
code/modules/vore/eating/vorepanel.dm | 54 +++---
tgstation.dme | 3 +-
12 files changed, 136 insertions(+), 292 deletions(-)
delete mode 100644 code/modules/vore/eating/vore.dm
diff --git a/code/__DEFINES/say.dm b/code/__DEFINES/say.dm
index 49cfba8cd2..5775e128f8 100644
--- a/code/__DEFINES/say.dm
+++ b/code/__DEFINES/say.dm
@@ -81,7 +81,8 @@
//Don't set this very much higher then 1024 unless you like inviting people in to dos your server with message spam
#define MAX_MESSAGE_LEN 2048 //Citadel edit: What's the WORST that could happen?
-#define MAX_FAVOR_LEN 4096 //double the maximum message length.
+#define MAX_FLAVOR_LEN 4096 //double the maximum message length.
+#define MAX_TASTE_LEN 40 //lick... vore... ew...
#define MAX_NAME_LEN 42
#define MAX_BROADCAST_LEN 512
#define MAX_CHARTER_LEN 80
diff --git a/code/__HELPERS/_cit_helpers.dm b/code/__HELPERS/_cit_helpers.dm
index a26b9285d4..7dfd8ffa77 100644
--- a/code/__HELPERS/_cit_helpers.dm
+++ b/code/__HELPERS/_cit_helpers.dm
@@ -113,7 +113,7 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE)
set desc = "Sets an extended description of your character's features."
set category = "IC"
- var/new_flavor = stripped_multiline_input(usr, "Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!", "Flavor Text", flavor_text, MAX_FAVOR_LEN, TRUE)
+ var/new_flavor = stripped_multiline_input(usr, "Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!", "Flavor Text", flavor_text, MAX_FLAVOR_LEN, TRUE)
if(!isnull(new_flavor))
flavor_text = new_flavor
to_chat(src, "Your flavor text has been updated.")
@@ -124,7 +124,7 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE)
set desc = "Sets a description of your character's current appearance. Use this for emotions, poses etc."
set category = "IC"
- var/new_flavor = stripped_multiline_input(usr, "Set the temporary flavor text in your 'examine' verb. This should be used only for things pertaining to the current round!", "Short-Term Flavor Text", flavor_text_2, MAX_FAVOR_LEN, TRUE)
+ var/new_flavor = stripped_multiline_input(usr, "Set the temporary flavor text in your 'examine' verb. This should be used only for things pertaining to the current round!", "Short-Term Flavor Text", flavor_text_2, MAX_FLAVOR_LEN, TRUE)
if(!isnull(new_flavor))
flavor_text_2 = new_flavor
to_chat(src, "Your temporary flavor text has been updated.")
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 62304112b2..5ea17d0498 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -216,7 +216,7 @@
if(!is_operational()) //Autoeject if power is lost
if(mob_occupant)
go_out()
- mob_occupant.apply_vore_prefs()
+ mob_occupant.copy_from_prefs_vr()
connected_message("Clone Ejected: Loss of power.")
else if(mob_occupant && (mob_occupant.loc == src))
@@ -226,7 +226,7 @@
SPEAK("The cloning has been \
aborted due to unrecoverable tissue failure.")
go_out()
- mob_occupant.apply_vore_prefs()
+ mob_occupant.copy_from_prefs_vr()
else if(mob_occupant.cloneloss > (100 - heal_level))
mob_occupant.Unconscious(80)
@@ -272,7 +272,7 @@
BP.attach_limb(mob_occupant)
go_out()
- mob_occupant.apply_vore_prefs()
+ mob_occupant.copy_from_prefs_vr()
else if (!mob_occupant || mob_occupant.loc != src)
occupant = null
@@ -320,7 +320,7 @@
SPEAK("An emergency ejection of the current clone has occurred. Survival not guaranteed.")
to_chat(user, "You force an emergency ejection. ")
go_out()
- mob_occupant.apply_vore_prefs()
+ mob_occupant.copy_from_prefs_vr()
else
return ..()
@@ -418,7 +418,7 @@
if(mob_occupant && prob(100/(severity*efficiency)))
connected_message(Gibberish("EMP-caused Accidental Ejection", 0))
SPEAK(Gibberish("Exposure to electromagnetic fields has caused the ejection of, ERROR: John Doe, prematurely." ,0))
- mob_occupant.apply_vore_prefs()
+ mob_occupant.copy_from_prefs_vr()
go_out()
/obj/machinery/clonepod/ex_act(severity, target)
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index dc550179f8..84096b1367 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -223,7 +223,6 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
new /datum/admins(localhost_rank, ckey, 1, 1)
//preferences datum - also holds some persistent data for the client (because we may as well keep these datums to a minimum)
prefs = GLOB.preferences_datums[ckey]
- prefs_vr = GLOB.vore_preferences_datums[ckey] //CITADEL EDIT bypassing a failing hook
if(prefs)
prefs.parent = src
@@ -231,13 +230,6 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
prefs = new /datum/preferences(src)
GLOB.preferences_datums[ckey] = prefs
- if(prefs_vr) //CITADEL EDIT bypassing a failing hook START
- prefs_vr.client = src
- else
- prefs_vr = new/datum/vore_preferences(src)
- GLOB.vore_preferences_datums[ckey] = prefs_vr
- //CITADEL EDIT bypassing a failing hook END
-
prefs.last_ip = address //these are gonna be used for banning
prefs.last_id = computer_id //these are gonna be used for banning
fps = prefs.clientfps
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 793a72c1f7..ca7e982214 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -205,6 +205,14 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/action_buttons_screen_locs = list()
+ //bad stuff
+ var/digestable = FALSE
+ var/devourable = FALSE
+ var/feeding = FALSE
+ var/lickable = FALSE
+ var/list/belly_prefs = list()
+ var/vore_taste = "nothing in particular"
+
//backgrounds
var/mutable_appearance/character_background
var/icon/bgstate = "steel"
@@ -1473,7 +1481,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
age = max(min( round(text2num(new_age)), AGE_MAX),AGE_MIN)
if("flavor_text")
- var/msg = stripped_multiline_input(usr, "Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!", "Flavor Text", features["flavor_text"], MAX_FAVOR_LEN, TRUE)
+ var/msg = stripped_multiline_input(usr, "Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!", "Flavor Text", features["flavor_text"], MAX_FLAVOR_LEN, TRUE)
if(msg)
features["flavor_text"] = msg
@@ -2262,16 +2270,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("load")
load_preferences()
load_character()
- if(parent && parent.prefs_vr)
- attempt_vr(parent.prefs_vr,"load_vore","")
if("changeslot")
if(!load_character(text2num(href_list["num"])))
random_character()
real_name = random_unique_name(gender)
save_character()
- if(parent && parent.prefs_vr)
- attempt_vr(parent.prefs_vr,"load_vore","")
if("tab")
if (href_list["tab"])
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 03c6051c5d..4ee8f37d63 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -5,7 +5,7 @@
// You do not need to raise this if you are adding new values that have sane defaults.
// Only raise this value when changing the meaning/format/name/layout of an existing value
// where you would want the updater procs below to run
-#define SAVEFILE_VERSION_MAX 25
+#define SAVEFILE_VERSION_MAX 26
/*
SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn
@@ -115,6 +115,36 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
if(digi == "Digitigrade Legs")
WRITE_FILE(S["feature_lizard_legs"], "Digitigrade")
+ if(current_version < 26)
+ var/vr_path = "data/player_saves/[parent.ckey[1]]/[parent.ckey]/vore/character[default_slot].json"
+ if(fexists(vr_path))
+ var/list/json_from_file = json_decode(file2text(vr_path))
+ if(json_from_file)
+ digestable = json_from_file["digestable"]
+ devourable = json_from_file["devourable"]
+ feeding = json_from_file["feeding"]
+ lickable = json_from_file["lickable"]
+ belly_prefs = json_from_file["belly_prefs"]
+ vore_taste = json_from_file["vore_taste"]
+
+ for(var/V in all_quirks) // quirk migration
+ switch(V)
+ if("Acute hepatic pharmacokinesis")
+ DISABLE_BITFIELD(cit_toggles, PENIS_ENLARGEMENT)
+ DISABLE_BITFIELD(cit_toggles, BREAST_ENLARGEMENT)
+ ENABLE_BITFIELD(cit_toggles,FORCED_FEM)
+ ENABLE_BITFIELD(cit_toggles,FORCED_MASC)
+ all_quirks -= V
+ if("Crocin Immunity")
+ ENABLE_BITFIELD(cit_toggles,NO_APHRO)
+ all_quirks -= V
+ if("Buns of Steel")
+ ENABLE_BITFIELD(cit_toggles,NO_ASS_SLAP)
+ all_quirks -= V
+
+ if(features["meat_type"] == "Inesct")
+ features["meat_type"] = "Insect"
+
/datum/preferences/proc/load_path(ckey,filename="preferences.sav")
if(!ckey)
return
@@ -226,6 +256,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
cit_toggles = sanitize_integer(cit_toggles, 0, 65535, initial(cit_toggles))
auto_ooc = sanitize_integer(auto_ooc, 0, 1, initial(auto_ooc))
+ belly_prefs = SANITIZE_LIST(belly_prefs)
+
return 1
/datum/preferences/proc/save_preferences()
@@ -446,6 +478,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
else //We have no old flavortext, default to new
S["feature_flavor_text"] >> features["flavor_text"]
+ S["digestable"] >> digestable
+ S["devourable"] >> devourable
+ S["feeding"] >> feeding
+ S["vore_taste"] >> vore_taste
+ S["lickable"] >> lickable
+ S["belly_prefs"] >> belly_prefs
//try to fix any outdated data if necessary
if(needs_update >= 0)
@@ -509,6 +547,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
features["insect_fluff"] = sanitize_inlist(features["insect_fluff"], GLOB.insect_fluffs_list)
features["insect_markings"] = sanitize_inlist(features["insect_markings"], GLOB.insect_markings_list, "None")
features["insect_wings"] = sanitize_inlist(features["insect_wings"], GLOB.insect_wings_list)
+ features["flavor_text"] = copytext(features["flavor_text"], 1, MAX_FLAVOR_LEN)
joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole))
//Validate job prefs
@@ -518,23 +557,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
all_quirks = SANITIZE_LIST(all_quirks)
- for(var/V in all_quirks) // quirk migration
- switch(V)
- if("Acute hepatic pharmacokinesis")
- DISABLE_BITFIELD(cit_toggles, PENIS_ENLARGEMENT)
- DISABLE_BITFIELD(cit_toggles, BREAST_ENLARGEMENT)
- ENABLE_BITFIELD(cit_toggles,FORCED_FEM)
- ENABLE_BITFIELD(cit_toggles,FORCED_MASC)
- all_quirks -= V
- if("Crocin Immunity")
- ENABLE_BITFIELD(cit_toggles,NO_APHRO)
- all_quirks -= V
- if("Buns of Steel")
- ENABLE_BITFIELD(cit_toggles,NO_ASS_SLAP)
- all_quirks -= V
+ lickable = sanitize_integer(lickable, FALSE, TRUE, initial(lickable))
+ devourable = sanitize_integer(devourable, FALSE, TRUE, initial(devourable))
+ digestable = sanitize_integer(digestable, FALSE, TRUE, initial(digestable))
+ vore_taste = copytext(vore_taste, 1, MAX_TASTE_LEN)
- if(features["meat_type"] == "Inesct")
- features["meat_type"] = "Insect"
cit_character_pref_load(S)
return 1
@@ -613,6 +640,13 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
//Quirks
WRITE_FILE(S["all_quirks"] , all_quirks)
+ WRITE_FILE(S["digestable"] , digestable)
+ WRITE_FILE(S["devourable"] , devourable)
+ WRITE_FILE(S["feeding"] , feeding)
+ WRITE_FILE(S["vore_taste"] , vore_taste)
+ WRITE_FILE(S["lickable"] , lickable)
+ WRITE_FILE(S["belly_prefs"] , belly_prefs)
+
cit_character_pref_save(S)
return 1
diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm
index f2e6fdce03..e0bd8a16b3 100644
--- a/code/modules/mob/living/login.dm
+++ b/code/modules/mob/living/login.dm
@@ -24,4 +24,4 @@
if(ranged_ability)
ranged_ability.add_ranged_ability(src, "You currently have [ranged_ability] active!")
if(vore_init && !vorepref_init) //Vore's been initialized, voreprefs haven't. If this triggers then that means that voreprefs failed to load due to the client being missing.
- apply_vore_prefs()
+ copy_from_prefs_vr()
diff --git a/code/modules/vore/eating/belly_obj.dm b/code/modules/vore/eating/belly_obj.dm
index e33f748292..7d034e97d8 100644
--- a/code/modules/vore/eating/belly_obj.dm
+++ b/code/modules/vore/eating/belly_obj.dm
@@ -732,3 +732,11 @@
for(var/I in emote_lists[K])
dupe.emote_lists[K] += I
return dupe
+
+//
+// Belly searching for simplifying other procs
+// Mostly redundant now with belly-objects and isbelly(loc)
+//
+/proc/check_belly(atom/movable/A)
+ return isbelly(A.loc)
+
diff --git a/code/modules/vore/eating/living.dm b/code/modules/vore/eating/living.dm
index 5f280fb04d..62ba420b15 100644
--- a/code/modules/vore/eating/living.dm
+++ b/code/modules/vore/eating/living.dm
@@ -41,7 +41,7 @@
return TRUE
//We'll load our client's organs if we have one
- if(client && client.prefs_vr)
+ if(client?.prefs)
if(!copy_from_prefs_vr())
to_chat(src,"ERROR: You seem to have saved vore prefs, but they couldn't be loaded.")
return FALSE
@@ -262,47 +262,22 @@
else
to_chat(src,"You aren't inside anyone, though, is the thing.")
-//
-// Verb for saving vore preferences to save file
-//
-/mob/living/proc/save_vore_prefs()
- if(!client || !client.prefs_vr)
- return FALSE
- if(!copy_to_prefs_vr())
- return FALSE
- if(!client.prefs_vr.save_vore())
- return FALSE
-
- return TRUE
-
-/mob/living/proc/apply_vore_prefs()
- if(!client || !client.prefs_vr)
- return FALSE
- if(!client.prefs_vr.load_vore())
- return FALSE
- if(!copy_from_prefs_vr())
- return FALSE
-
- return TRUE
-
/mob/living/proc/copy_to_prefs_vr()
- if(!client || !client.prefs_vr)
- to_chat(src,"You attempted to save your vore prefs but somehow you're in this character without a client.prefs_vr variable. Tell a dev.")
+ if(!client || !client.prefs)
+ to_chat(src,"You attempted to save your vore prefs but somehow you're in this character without a client.prefs variable. Tell a dev.")
return FALSE
- var/datum/vore_preferences/P = client.prefs_vr
-
- P.digestable = src.digestable
- P.devourable = src.devourable
- P.feeding = src.feeding
- P.vore_taste = src.vore_taste
+ client.prefs.digestable = digestable
+ client.prefs.devourable = devourable
+ client.prefs.feeding = feeding
+ client.prefs.vore_taste = vore_taste
var/list/serialized = list()
- for(var/belly in src.vore_organs)
+ for(var/belly in vore_organs)
var/obj/belly/B = belly
serialized += list(B.serialize()) //Can't add a list as an object to another list in Byond. Thanks.
- P.belly_prefs = serialized
+ client.prefs.belly_prefs = serialized
return TRUE
@@ -310,21 +285,20 @@
// Proc for applying vore preferences, given bellies
//
/mob/living/proc/copy_from_prefs_vr()
- if(!client || !client.prefs_vr)
- to_chat(src,"You attempted to apply your vore prefs but somehow you're in this character without a client.prefs_vr variable. Tell a dev.")
+ if(!client || !client.prefs)
+ to_chat(src,"You attempted to apply your vore prefs but somehow you're in this character without a client.prefs variable. Tell a dev.")
return FALSE
vorepref_init = TRUE
- var/datum/vore_preferences/P = client.prefs_vr
- digestable = P.digestable
- devourable = P.devourable
- feeding = P.feeding
- vore_taste = P.vore_taste
+ digestable = client.prefs.digestable
+ devourable = client.prefs.devourable
+ feeding = client.prefs.feeding
+ vore_taste = client.prefs.vore_taste
release_vore_contents(silent = TRUE)
- vore_organs.Cut()
- for(var/entry in P.belly_prefs)
+ QDEL_LIST(vore_organs)
+ for(var/entry in client.prefs.belly_prefs)
list_to_object(entry,src)
return TRUE
@@ -381,18 +355,12 @@
set category = "Vore"
set desc = "Lick someone nearby!"
- if(!istype(tasted))
+ if(!istype(tasted) || !(tasted.client?.prefs.lickable))
return
- if(!tasted.client?.prefs_vr.lickable)
- return
+ setClickCooldown(100)
- if(src == stat)
- return
-
- src.setClickCooldown(100)
-
- src.visible_message("[src] licks [tasted]!","You lick [tasted]. They taste rather like [tasted.get_taste_message()].","Slurp!")
+ visible_message("[src] licks [tasted]!","You lick [tasted]. They taste rather like [tasted.get_taste_message()].","Slurp!")
/mob/living/proc/get_taste_message(allow_generic = TRUE, datum/species/mrace)
@@ -408,3 +376,11 @@
else
taste_message += "a plain old normal [src]"
return taste_message
+// Check if an object is capable of eating things, based on vore_organs
+//
+/proc/is_vore_predator(var/mob/living/O)
+ if(istype(O))
+ if(O.vore_organs.len > 0)
+ return TRUE
+
+ return FALSE
diff --git a/code/modules/vore/eating/vore.dm b/code/modules/vore/eating/vore.dm
deleted file mode 100644
index abb5bbb988..0000000000
--- a/code/modules/vore/eating/vore.dm
+++ /dev/null
@@ -1,174 +0,0 @@
-
-/*
-VVVVVVVV VVVVVVVV OOOOOOOOO RRRRRRRRRRRRRRRRR EEEEEEEEEEEEEEEEEEEEEE
-V::::::V V::::::V OO:::::::::OO R::::::::::::::::R E::::::::::::::::::::E
-V::::::V V::::::V OO:::::::::::::OO R::::::RRRRRR:::::R E::::::::::::::::::::E
-V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEEEEE::::E
- V:::::V V:::::V O::::::O O::::::O R::::R R:::::R E:::::E EEEEEE
- V:::::V V:::::V O:::::O O:::::O R::::R R:::::R E:::::E
- V:::::V V:::::V O:::::O O:::::O R::::RRRRRR:::::R E::::::EEEEEEEEEE
- V:::::V V:::::V O:::::O O:::::O R:::::::::::::RR E:::::::::::::::E
- V:::::V V:::::V O:::::O O:::::O R::::RRRRRR:::::R E:::::::::::::::E
- V:::::V V:::::V O:::::O O:::::O R::::R R:::::R E::::::EEEEEEEEEE
- V:::::V:::::V O:::::O O:::::O R::::R R:::::R E:::::E
- V:::::::::V O::::::O O::::::O R::::R R:::::R E:::::E EEEEEE
- V:::::::V O:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEEEE:::::E
- V:::::V OO:::::::::::::OO R::::::R R:::::RE::::::::::::::::::::E
- V:::V OO:::::::::OO R::::::R R:::::RE::::::::::::::::::::E
- VVV OOOOOOOOO RRRRRRRR RRRRRRREEEEEEEEEEEEEEEEEEEEEE
-
--Aro <3 */
-
-//
-// Overrides/additions to stock defines go here, as well as hooks. Sort them by
-// the object they are overriding. So all /mob/living together, etc.
-//
-
-//
-// The datum type bolted onto normal preferences datums for storing Vore stuff
-//
-
-#define VORE_VERSION 4
-
-GLOBAL_LIST_EMPTY(vore_preferences_datums)
-
-/client
- var/datum/vore_preferences/prefs_vr
-
-/datum/vore_preferences
- //Actual preferences
- var/digestable = FALSE
- var/devourable = FALSE
- var/feeding = FALSE
- var/lickable = FALSE
-// var/allowmobvore = TRUE
- var/list/belly_prefs = list()
- var/vore_taste = "nothing in particular"
-// var/can_be_drop_prey = FALSE
-// var/can_be_drop_pred = FALSE
-
- //Mechanically required
- var/path
- var/slot
- var/client/client
- var/client_ckey
-
-/datum/vore_preferences/New(client/C)
- if(istype(C))
- client = C
- client_ckey = C.ckey
- load_vore()
-
-//
-// Check if an object is capable of eating things, based on vore_organs
-//
-/proc/is_vore_predator(var/mob/living/O)
- if(istype(O,/mob/living))
- if(O.vore_organs.len > 0)
- return TRUE
-
- return FALSE
-
-//
-// Belly searching for simplifying other procs
-// Mostly redundant now with belly-objects and isbelly(loc)
-//
-/proc/check_belly(atom/movable/A)
- return isbelly(A.loc)
-
-//
-// Save/Load Vore Preferences
-//
-/datum/vore_preferences/proc/load_path(ckey,slot,filename="character",ext="json")
- if(!ckey || !slot) return
- path = "data/player_saves/[ckey[1]]/[ckey]/vore/[filename][slot].[ext]"
-
-/datum/vore_preferences/proc/load_vore()
- if(!client || !client_ckey)
- return FALSE //No client, how can we save?
- if(!client.prefs || !client.prefs.default_slot)
- return FALSE //Need to know what character to load!
-
- slot = client.prefs.default_slot
-
- load_path(client_ckey,slot)
-
- if(!path) return FALSE //Path couldn't be set?
- if(!fexists(path)) //Never saved before
- save_vore() //Make the file first
- return TRUE
-
- var/list/json_from_file = json_decode(file2text(path))
- if(!json_from_file)
- return FALSE //My concern grows
-
- var/version = json_from_file["version"]
- json_from_file = patch_version(json_from_file,version)
-
- digestable = json_from_file["digestable"]
- devourable = json_from_file["devourable"]
- feeding = json_from_file["feeding"]
- lickable = json_from_file["lickable"]
- vore_taste = json_from_file["vore_taste"]
- belly_prefs = json_from_file["belly_prefs"]
-
- //Quick sanitize
- if(isnull(digestable))
- digestable = FALSE
- if(isnull(devourable))
- devourable = FALSE
- if(isnull(feeding))
- feeding = FALSE
- if(isnull(lickable))
- lickable = FALSE
- if(isnull(belly_prefs))
- belly_prefs = list()
-
- return TRUE
-
-/datum/vore_preferences/proc/save_vore()
- if(!path)
- return FALSE
-
- var/version = VORE_VERSION //For "good times" use in the future
- var/list/settings_list = list(
- "version" = version,
- "digestable" = digestable,
- "devourable" = devourable,
- "feeding" = feeding,
- "lickable" = lickable,
- "vore_taste" = vore_taste,
- "belly_prefs" = belly_prefs,
- )
-
- //List to JSON
- var/json_to_file = json_encode(settings_list)
- if(!json_to_file)
- testing("Saving: [path] failed jsonencode")
- return FALSE
-
- //Write it out
-//#ifdef RUST_G
-// call(RUST_G, "file_write")(json_to_file, path)
-//#else
- // Fall back to using old format if we are not using rust-g
- if(fexists(path))
- fdel(path) //Byond only supports APPENDING to files, not replacing.
- text2file(json_to_file, path)
-//#endif
- if(!fexists(path))
- testing("Saving: [path] failed file write")
- return FALSE
-
- return TRUE
-
-/* commented out list things
- "allowmobvore" = allowmobvore,
- "can_be_drop_prey" = can_be_drop_prey,
- "can_be_drop_pred" = can_be_drop_pred, */
-
-//Can do conversions here
-datum/vore_preferences/proc/patch_version(var/list/json_from_file,var/version)
- return json_from_file
-
-#undef VORE_VERSION
diff --git a/code/modules/vore/eating/vorepanel.dm b/code/modules/vore/eating/vorepanel.dm
index a2746f35e8..59ef8661c6 100644
--- a/code/modules/vore/eating/vorepanel.dm
+++ b/code/modules/vore/eating/vorepanel.dm
@@ -6,7 +6,6 @@
#define BELLIES_NAME_MIN 2
#define BELLIES_NAME_MAX 12
#define BELLIES_DESC_MAX 1024
-#define FLAVOR_MAX 40
/mob/living/proc/insidePanel()
set name = "Vore Panel"
@@ -247,8 +246,8 @@
dat += "
Toggle Digestable (Currently: [user.digestable ? "ON" : "OFF"])"
dat += "
Toggle Devourable (Currently: [user.devourable ? "ON" : "OFF"])"
dat += "
Toggle Feeding (Currently: [user.feeding ? "ON" : "OFF"])"
- if(user.client.prefs_vr)
- dat += "
Toggle Licking (Currently: [user.client.prefs_vr.lickable ? "ON" : "OFF"])"
+ if(user.client.prefs)
+ dat += "
Toggle Licking (Currently: [user.client.prefs.lickable ? "ON" : "OFF"])"
//Returns the dat html to the vore_look
return dat
@@ -659,18 +658,19 @@
user.vore_selected = user.vore_organs[1]
if(href_list["saveprefs"])
- if(!user.save_vore_prefs())
+ if(!(user.client?.prefs))
+ return FALSE
+ if(!user.client.prefs.save_character())
to_chat(user, "Belly Preferences not saved!")
-
+ log_admin("Could not save vore prefs on USER: [user].")
else
to_chat(user, "Belly Preferences were saved!")
- log_admin("Could not save vore prefs on USER: [user].")
if(href_list["applyprefs"])
- var/alert = alert("Are you sure you want to reload character slot preferences? This will remove your current vore organs and eject their contents.","Confirmation","Reload","Cancel")
+ var/alert = alert("Are you sure you want to reload the current slot preferences? This will remove your current vore organs and eject their contents.","Confirmation","Reload","Cancel")
if(!alert == "Reload")
return FALSE
- if(!user.apply_vore_prefs())
+ if(!user.copy_from_prefs_vr())
alert("ERROR: Vore preferences failed to apply!","Error")
else
to_chat(user,"Vore preferences applied from active slot!")
@@ -681,13 +681,15 @@
return FALSE
new_flavor = readd_quotes(new_flavor)
- if(length(new_flavor) > FLAVOR_MAX)
- alert("Entered flavor/taste text too long. [FLAVOR_MAX] character limit.","Error!")
+ if(length(new_flavor) > MAX_TASTE_LEN)
+ alert("Entered flavor/taste text too long. [MAX_TASTE_LEN] character limit.","Error!")
return FALSE
user.vore_taste = new_flavor
if(href_list["toggledg"])
var/choice = alert(user, "This button is for those who don't like being digested. It can make you undigestable to all mobs. Digesting you is currently: [user.digestable ? "Allowed" : "Prevented"]", "", "Allow Digestion", "Cancel", "Prevent Digestion")
+ if(!user || !user.client)
+ return
switch(choice)
if("Cancel")
return FALSE
@@ -696,11 +698,12 @@
if("Prevent Digestion")
user.digestable = FALSE
- if(user.client.prefs_vr)
- user.client.prefs_vr.digestable = user.digestable
+ user.client.prefs.digestable = user.digestable
if(href_list["toggledvor"])
var/choice = alert(user, "This button is for those who don't like vore at all. Devouring you is currently: [user.devourable ? "Allowed" : "Prevented"]", "", "Allow Devourment", "Cancel", "Prevent Devourment")
+ if(!user || !user.client)
+ return
switch(choice)
if("Cancel")
return FALSE
@@ -709,11 +712,12 @@
if("Prevent Devourment")
user.devourable = FALSE
- if(user.client.prefs_vr)
- user.client.prefs_vr.devourable = user.devourable
+ user.client.prefs.devourable = user.devourable
if(href_list["toggledfeed"])
var/choice = alert(user, "This button is to toggle your ability to be fed to others. Feeding predators is currently: [user.feeding ? "Allowed" : "Prevented"]", "", "Allow Feeding", "Cancel", "Prevent Feeding")
+ if(!user || !user.client)
+ return
switch(choice)
if("Cancel")
return FALSE
@@ -722,19 +726,19 @@
if("Prevent Feeding")
user.feeding = FALSE
- if(user.client.prefs_vr)
- user.client.prefs_vr.feeding = user.feeding
+ user.client.prefs.feeding = user.feeding
if(href_list["toggledlickable"])
- if(user.client.prefs_vr)
- var/choice = alert(user, "This button is to toggle your ability to be licked. Being licked is currently: [user.client.prefs_vr.lickable ? "Allowed" : "Prevented"]", "", "Allow Licking", "Cancel", "Prevent Licking")
- switch(choice)
- if("Cancel")
- return FALSE
- if("Allow Licking")
- user.client.prefs_vr.lickable = TRUE
- if("Prevent Licking")
- user.client.prefs_vr.lickable = FALSE
+ var/choice = alert(user, "This button is to toggle your ability to be licked. Being licked is currently: [user.client.prefs.lickable ? "Allowed" : "Prevented"]", "", "Allow Licking", "Cancel", "Prevent Licking")
+ if(!user || !user.client)
+ return
+ switch(choice)
+ if("Cancel")
+ return FALSE
+ if("Allow Licking")
+ user.client.prefs.lickable = TRUE
+ if("Prevent Licking")
+ user.client.prefs.lickable = FALSE
//Refresh when interacted with, returning 1 makes vore_look.Topic update
return TRUE
diff --git a/tgstation.dme b/tgstation.dme
index 9ecf1ddd5e..a8110526f8 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -79,8 +79,8 @@
#include "code\__DEFINES\obj_flags.dm"
#include "code\__DEFINES\pinpointers.dm"
#include "code\__DEFINES\pipe_construction.dm"
-#include "code\__DEFINES\power.dm"
#include "code\__DEFINES\pool.dm"
+#include "code\__DEFINES\power.dm"
#include "code\__DEFINES\preferences.dm"
#include "code\__DEFINES\procpath.dm"
#include "code\__DEFINES\profile.dm"
@@ -3132,7 +3132,6 @@
#include "code\modules\vore\eating\bellymodes.dm"
#include "code\modules\vore\eating\digest_act.dm"
#include "code\modules\vore\eating\living.dm"
-#include "code\modules\vore\eating\vore.dm"
#include "code\modules\vore\eating\voreitems.dm"
#include "code\modules\vore\eating\vorepanel.dm"
#include "code\modules\VR\vr_mob.dm"
From 31bde973e073e3381c73c601b97ac902b9e497d8 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Sat, 29 Feb 2020 15:44:05 +0100
Subject: [PATCH 002/124] Bad.
---
code/modules/client/preferences_savefile.dm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 4ee8f37d63..5985ddd74f 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -256,8 +256,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
cit_toggles = sanitize_integer(cit_toggles, 0, 65535, initial(cit_toggles))
auto_ooc = sanitize_integer(auto_ooc, 0, 1, initial(auto_ooc))
- belly_prefs = SANITIZE_LIST(belly_prefs)
-
return 1
/datum/preferences/proc/save_preferences()
@@ -560,7 +558,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
lickable = sanitize_integer(lickable, FALSE, TRUE, initial(lickable))
devourable = sanitize_integer(devourable, FALSE, TRUE, initial(devourable))
digestable = sanitize_integer(digestable, FALSE, TRUE, initial(digestable))
+ feeding = sanitize_integer(feeding, FALSE, TRUE, initial(feeding))
vore_taste = copytext(vore_taste, 1, MAX_TASTE_LEN)
+ belly_prefs = SANITIZE_LIST(belly_prefs)
cit_character_pref_load(S)
From 185a0b092e7cc7e2dc3e4431b8183e282dd5dae8 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Sun, 1 Mar 2020 15:33:46 +0100
Subject: [PATCH 003/124] I hate this.
---
code/modules/vore/eating/living.dm | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/code/modules/vore/eating/living.dm b/code/modules/vore/eating/living.dm
index 62ba420b15..113605d49e 100644
--- a/code/modules/vore/eating/living.dm
+++ b/code/modules/vore/eating/living.dm
@@ -350,12 +350,22 @@
//
// Clearly super important. Obviously.
//
-/mob/living/proc/lick(var/mob/living/tasted in oview(1))
+/mob/living/proc/lick()
set name = "Lick Someone"
set category = "Vore"
set desc = "Lick someone nearby!"
- if(!istype(tasted) || !(tasted.client?.prefs.lickable))
+ var/list/choices
+ for(var/mob/living/L in view(1))
+ if(L != src && (!L.ckey || L.client?.prefs.lickable))
+ LAZYADD(choices, L)
+
+ if(!choices)
+ return
+
+ var/mob/living/tasted = input(src, "Who would you like to lick? (Excluding yourself and those with the preference disabled)", "Licking") as null|anything in choices
+
+ if(QDELETED(tasted) || (L.ckey && !(L.client?.prefs.lickable)))
return
setClickCooldown(100)
From aa79b9853b4c2be17502626ce62f539a34b5cadd Mon Sep 17 00:00:00 2001
From: Ghom <42542238+Ghommie@users.noreply.github.com>
Date: Sun, 1 Mar 2020 15:42:41 +0100
Subject: [PATCH 004/124] Update living.dm
---
code/modules/vore/eating/living.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/vore/eating/living.dm b/code/modules/vore/eating/living.dm
index 113605d49e..bdd4b67f07 100644
--- a/code/modules/vore/eating/living.dm
+++ b/code/modules/vore/eating/living.dm
@@ -365,7 +365,7 @@
var/mob/living/tasted = input(src, "Who would you like to lick? (Excluding yourself and those with the preference disabled)", "Licking") as null|anything in choices
- if(QDELETED(tasted) || (L.ckey && !(L.client?.prefs.lickable)))
+ if(QDELETED(tasted) || (tasted.ckey && !(tasted.client?.prefs.lickable)))
return
setClickCooldown(100)
From a1618a4550636c6bd9a381280776f56256ccf329 Mon Sep 17 00:00:00 2001
From: Ghom <42542238+Ghommie@users.noreply.github.com>
Date: Mon, 16 Mar 2020 00:35:19 +0100
Subject: [PATCH 005/124] Webedit fixing a runtime.
---
code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm | 3 +++
1 file changed, 3 insertions(+)
diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm
index e0ad2b8bbc..039fc102e8 100644
--- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm
+++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm
@@ -677,6 +677,9 @@
message_admins("[ADMIN_LOOKUPFLW(Ninja)] has been made into a ninja by dynamic.")
log_game("[key_name(Ninja)] was spawned as a ninja by dynamic.")
return Ninja
+
+/datum/dynamic_ruleset/midround/from_ghosts/ninja/finish_setup(mob/new_character, index)
+ return
#undef ABDUCTOR_MAX_TEAMS
#undef REVENANT_SPAWN_THRESHOLD
From 2553384c6e2332b106fa3bb5d64241ec9fa7860e Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Mon, 16 Mar 2020 01:23:12 +0100
Subject: [PATCH 006/124] Shortcut fix for a sticky situation.
---
code/modules/ninja/suit/gloves.dm | 3 +++
code/modules/ninja/suit/head.dm | 6 +++++-
code/modules/ninja/suit/mask.dm | 4 ++++
3 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/code/modules/ninja/suit/gloves.dm b/code/modules/ninja/suit/gloves.dm
index 4e7f1dc9ea..dbe4c80579 100644
--- a/code/modules/ninja/suit/gloves.dm
+++ b/code/modules/ninja/suit/gloves.dm
@@ -70,6 +70,9 @@
else
. = FALSE //as to not cancel attack_hand()
+/obj/item/clothing/gloves/space_ninja/dropped(mob/user)
+ . = ..()
+ REMOVE_TRAIT(src, TRAIT_NODROP, NINJA_SUIT_TRAIT)
/obj/item/clothing/gloves/space_ninja/proc/toggledrain()
var/mob/living/carbon/human/U = loc
diff --git a/code/modules/ninja/suit/head.dm b/code/modules/ninja/suit/head.dm
index a62f871f56..9a65dabc1e 100644
--- a/code/modules/ninja/suit/head.dm
+++ b/code/modules/ninja/suit/head.dm
@@ -9,4 +9,8 @@
strip_delay = 12
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
blockTracking = 1//Roughly the only unique thing about this helmet.
- flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
\ No newline at end of file
+ flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
+
+/obj/item/clothing/head/helmet/space/space_ninja/dropped(mob/user)
+ . = ..()
+ REMOVE_TRAIT(src, TRAIT_NODROP, NINJA_SUIT_TRAIT)
diff --git a/code/modules/ninja/suit/mask.dm b/code/modules/ninja/suit/mask.dm
index 52657f913c..421c13f9eb 100644
--- a/code/modules/ninja/suit/mask.dm
+++ b/code/modules/ninja/suit/mask.dm
@@ -19,6 +19,10 @@ Contents:
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
modifies_speech = TRUE
+/obj/item/clothing/mask/gas/space_ninja/dropped(mob/user)
+ . = ..()
+ REMOVE_TRAIT(src, TRAIT_NODROP, NINJA_SUIT_TRAIT)
+
/obj/item/clothing/mask/gas/space_ninja/handle_speech(datum/source, list/speech_args)
var/message = speech_args[SPEECH_MESSAGE]
if(message[1] != "*")
From ff035f27752c0a0e328f896eee4a8b890cbcdca5 Mon Sep 17 00:00:00 2001
From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com>
Date: Mon, 16 Mar 2020 02:38:25 -0400
Subject: [PATCH 007/124] Update unsorted.dm
---
code/__HELPERS/unsorted.dm | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index af2fb281e6..ac97966eef 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -1426,7 +1426,9 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
/proc/get_random_drink()
var/list/blocked = list(/obj/item/reagent_containers/food/drinks/soda_cans,
- /obj/item/reagent_containers/food/drinks/bottle
+ /obj/item/reagent_containers/food/drinks/bottle,
+ /obj/item/reagent_containers/food/drinks/flask/russian,
+ /obj/item/reagent_containers/food/drinks/flask/steel
)
return pick(subtypesof(/obj/item/reagent_containers/food/drinks) - blocked)
@@ -1562,4 +1564,4 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
channels_to_use += channel
if(channels_to_use.len)
- world.TgsChatBroadcast()
\ No newline at end of file
+ world.TgsChatBroadcast()
From 94f694e56893f9daec1642f23a1fc946b2a2b454 Mon Sep 17 00:00:00 2001
From: Detective Google <48196179+Detective-Google@users.noreply.github.com>
Date: Mon, 16 Mar 2020 01:44:26 -0500
Subject: [PATCH 008/124] adds some hudpatches
seemed like fun flavor, inspired by bay and a request.
---
.../crafting/recipes/recipes_clothing.dm | 81 +++++++++++++++++-
code/modules/clothing/glasses/_glasses.dm | 5 ++
code/modules/clothing/glasses/hud.dm | 10 +++
icons/mob/eyes.dmi | Bin 13175 -> 13850 bytes
icons/obj/clothing/glasses.dmi | Bin 14195 -> 14554 bytes
5 files changed, 95 insertions(+), 1 deletion(-)
diff --git a/code/datums/components/crafting/recipes/recipes_clothing.dm b/code/datums/components/crafting/recipes/recipes_clothing.dm
index f21991c754..69153a8530 100644
--- a/code/datums/components/crafting/recipes/recipes_clothing.dm
+++ b/code/datums/components/crafting/recipes/recipes_clothing.dm
@@ -107,7 +107,7 @@
/obj/item/stack/cable_coil = 5)
category = CAT_CLOTHING
-/datum/crafting_recipe/diagnostic_singlasses_removal
+/datum/crafting_recipe/diagnostic_sunglasses_removal
name = "Diagnostic HUDsunglasses removal"
result = /obj/item/clothing/glasses/sunglasses
time = 20
@@ -126,6 +126,85 @@
/obj/item/stack/cable_coil = 5)
category = CAT_CLOTHING
*/
+
+// Eyepatch Glasses
+
+/datum/crafting_recipe/secpatch
+ name = "Security Eyepatch HUD"
+ result = /obj/item/clothing/glasses/hud/security/sunglasses/eyepatch
+ time = 20
+ tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
+ parts = list(/obj/item/clothing/glasses/hud/security = 1,
+ /obj/item/clothing/glasses/eyepatch = 1)
+ reqs = list(/obj/item/clothing/glasses/hud/security = 1,
+ /obj/item/clothing/glasses/eyepatch = 1)
+ category = CAT_CLOTHING
+
+/datum/crafting_recipe/secpatch_removal
+ name = "Security HUDpatch Removal"
+ result = /obj/item/clothing/glasses/eyepatch
+ time = 20
+ tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
+ reqs = list(/obj/item/clothing/glasses/hud/security/sunglasses/eyepatch = 1)
+ category = CAT_CLOTHING
+
+/datum/crafting_recipe/medpatch
+ name = "Medical Eyepatch HUD"
+ result = /obj/item/clothing/glasses/hud/health/eyepatch
+ time = 20
+ tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
+ parts = list(/obj/item/clothing/glasses/hud/health = 1,
+ /obj/item/clothing/glasses/eyepatch = 1)
+ reqs = list(/obj/item/clothing/glasses/hud/health = 1,
+ /obj/item/clothing/glasses/eyepatch = 1)
+ category = CAT_CLOTHING
+
+/datum/crafting_recipe/medpatch_removal
+ name = "Medical HUDpatch Removal"
+ result = /obj/item/clothing/glasses/eyepatch
+ time = 20
+ tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
+ reqs = list(/obj/item/clothing/glasses/hud/health/eyepatch = 1)
+ category = CAT_CLOTHING
+
+/datum/crafting_recipe/diagpatch
+ name = "Diagnostic Eyepatch HUD"
+ result = /obj/item/clothing/glasses/hud/diagnostic/eyepatch
+ time = 20
+ tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
+ parts = list(/obj/item/clothing/glasses/hud/diagnostic = 1,
+ /obj/item/clothing/glasses/eyepatch = 1)
+ reqs = list(/obj/item/clothing/glasses/hud/diagnostic = 1,
+ /obj/item/clothing/glasses/eyepatch = 1)
+ category = CAT_CLOTHING
+
+/datum/crafting_recipe/diagpatch_removal
+ name = "Diagnostic HUDpatch Removal"
+ result = /obj/item/clothing/glasses/eyepatch
+ time = 20
+ tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
+ reqs = list(/obj/item/clothing/glasses/hud/diagnostic/eyepatch = 1)
+ category = CAT_CLOTHING
+
+/datum/crafting_recipe/mesonpatch
+ name = "Meson Scanner Eyepatch"
+ result = /obj/item/clothing/glasses/meson/eyepatch
+ time = 20
+ tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
+ parts = list(/obj/item/clothing/glasses/meson = 1,
+ /obj/item/clothing/glasses/eyepatch = 1)
+ reqs = list(/obj/item/clothing/glasses/meson = 1,
+ /obj/item/clothing/glasses/eyepatch = 1)
+ category = CAT_CLOTHING
+
+/datum/crafting_recipe/mesonpatch_removal
+ name = "Meson Scanner patch Removal"
+ result = /obj/item/clothing/glasses/eyepatch
+ time = 20
+ tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
+ reqs = list(/obj/item/clothing/glasses/meson/eyepatch = 1)
+ category = CAT_CLOTHING
+
/datum/crafting_recipe/ghostsheet
name = "Ghost Sheet"
result = /obj/item/clothing/suit/ghost_sheet
diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm
index 5ae86636d6..d3ecccfcf8 100644
--- a/code/modules/clothing/glasses/_glasses.dm
+++ b/code/modules/clothing/glasses/_glasses.dm
@@ -97,6 +97,11 @@
hitsound = 'sound/weapons/bladeslice.ogg'
sharpness = IS_SHARP
+/obj/item/clothing/glasses/meson/eyepatch
+ name = "eyepatch mesons"
+ desc = "A meson system that connects directly to the optical nerve of the user, replacing the need for that useless eyeball."
+ icon_state = "mesonpatch"
+
/obj/item/clothing/glasses/science
name = "science goggles"
desc = "A pair of snazzy goggles used to protect against chemical spills. Fitted with an analyzer for scanning items and reagents."
diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm
index c84aec5c15..dd1bd166d7 100644
--- a/code/modules/clothing/glasses/hud.dm
+++ b/code/modules/clothing/glasses/hud.dm
@@ -83,6 +83,11 @@
name = "prescription medical HUDSunglasses"
vision_correction = 1
+/obj/item/clothing/glasses/hud/health/eyepatch
+ name = "eyepatch medHUD"
+ desc = "A heads-up display that connects directly to the optical nerve of the user, replacing the need for that useless eyeball."
+ icon_state = "medpatch"
+
///////////////////
//Diagnostic Huds//
///////////////////
@@ -123,6 +128,11 @@
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
glass_colour_type = /datum/client_colour/glass_colour/green
+/obj/item/clothing/glasses/hud/diagnostic/eyepatch
+ name = "eyepatch diagnostic HUD"
+ desc = "A heads-up display that connects directly to the optical nerve of the user, replacing the need for that useless eyeball."
+ icon_state = "diagpatch"
+
////////////
//Sec Huds//
////////////
diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi
index b981a18f0649b843399b407db33457f20a7f5cc5..78525750e7d9c827ddc922e3a4c7db3b44764606 100644
GIT binary patch
literal 13850
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
Vo7`M`;GIQ4R#HKtT+ATg{{XuuCe8o=
literal 14195
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