diff --git a/SQL/mentor.sql b/SQL/mentor.sql index c5fb7f0d83..45d0829d88 100644 --- a/SQL/mentor.sql +++ b/SQL/mentor.sql @@ -5,10 +5,10 @@ CREATE TABLE `mentor_memo` ( `last_editor` varchar(32) DEFAULT NULL, `edits` text, PRIMARY KEY (`ckey`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; CREATE TABLE `mentor` ( `id` int(11) NOT NULL AUTO_INCREMENT, `ckey` varchar(32) NOT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; \ No newline at end of file +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; diff --git a/SQL/mentor_prefixed.sql b/SQL/mentor_prefixed.sql new file mode 100644 index 0000000000..81e76f333e --- /dev/null +++ b/SQL/mentor_prefixed.sql @@ -0,0 +1,14 @@ +CREATE TABLE `SS13_mentor_memo` ( + `ckey` varchar(32) NOT NULL, + `memotext` text NOT NULL, + `timestamp` datetime NOT NULL, + `last_editor` varchar(32) DEFAULT NULL, + `edits` text, + PRIMARY KEY (`ckey`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +CREATE TABLE `SS13_mentor` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `ckey` varchar(32) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; diff --git a/_maps/RandomRuins/StationRuins/Lavaland/Mining_Station/Mining_Station_Public_01.dmm b/_maps/RandomRuins/StationRuins/Lavaland/Mining_Station/Mining_Station_Public_01.dmm index 99c924177a..7b15bfb584 100644 --- a/_maps/RandomRuins/StationRuins/Lavaland/Mining_Station/Mining_Station_Public_01.dmm +++ b/_maps/RandomRuins/StationRuins/Lavaland/Mining_Station/Mining_Station_Public_01.dmm @@ -997,14 +997,14 @@ /turf/open/floor/plasteel/freezer, /area/mine/living_quarters) "qh" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = 11 - }, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 }, +/obj/structure/sink{ + dir = 4; + pixel_x = 12 + }, /turf/open/floor/plasteel, /area/mine/living_quarters) "qm" = ( @@ -2504,13 +2504,13 @@ /turf/open/floor/plasteel/white, /area/mine/laborcamp) "Mj" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = -12 - }, /obj/structure/mirror{ pixel_x = -28 }, +/obj/structure/sink{ + dir = 8; + pixel_x = -12 + }, /turf/open/floor/plasteel/freezer, /area/mine/living_quarters) "Mk" = ( diff --git a/_maps/map_files/CogStation/CogStation.dmm b/_maps/map_files/CogStation/CogStation.dmm index bc8af8a789..cf2c4a53ba 100644 --- a/_maps/map_files/CogStation/CogStation.dmm +++ b/_maps/map_files/CogStation/CogStation.dmm @@ -5133,7 +5133,7 @@ /obj/structure/disposalpipe/trunk{ dir = 8 }, -/obj/structure/sign/poster/official/duelshotgun{ +/obj/structure/sign/poster/official/bless_this_spess{ pixel_y = -32 }, /turf/open/floor/plasteel, diff --git a/_maps/map_files/FestiveBall/FestiveStation.dmm b/_maps/map_files/FestiveBall/FestiveStation.dmm index 063d72b6c6..be7263f8c4 100644 --- a/_maps/map_files/FestiveBall/FestiveStation.dmm +++ b/_maps/map_files/FestiveBall/FestiveStation.dmm @@ -20381,7 +20381,7 @@ /area/edina/street/secondary/command) "baX" = ( /obj/machinery/computer/prisoner/management, -/obj/structure/sign/poster/official/duelshotgun{ +/obj/structure/sign/poster/official/bless_this_spess{ pixel_y = 32 }, /turf/open/floor/wood, diff --git a/code/__DEFINES/dcs/signals/signals_movable.dm b/code/__DEFINES/dcs/signals/signals_movable.dm new file mode 100644 index 0000000000..adb8a8029b --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_movable.dm @@ -0,0 +1,4 @@ +///from base of atom/experience_pressure_difference(): (pressure_difference, direction, pressure_resistance_prob_delta) +#define COMSIG_MOVABLE_PRE_PRESSURE_PUSH "atom_pre_pressure_push" + ///prevents pressure movement + #define COMSIG_MOVABLE_BLOCKS_PRESSURE (1<<0) diff --git a/code/__DEFINES/events.dm b/code/__DEFINES/events.dm index d39932e1a7..d189969b8e 100644 --- a/code/__DEFINES/events.dm +++ b/code/__DEFINES/events.dm @@ -7,3 +7,31 @@ #define EVENT_READY 1 #define EVENT_CANCELLED 2 #define EVENT_INTERRUPTED 3 + +///Events that mess with or create artificial intelligences, such as vending machines and the AI itself +#define EVENT_CATEGORY_AI "AI issues" +///Events that spawn anomalies, which might be the source of anomaly cores +#define EVENT_CATEGORY_ANOMALIES "Anomalies" +///Events pertaining cargo, messages incoming to the station and job slots +#define EVENT_CATEGORY_BUREAUCRATIC "Bureaucratic" +///Events that cause breakages and malfunctions that could be fixed by engineers +#define EVENT_CATEGORY_ENGINEERING "Engineering" +///Events that spawn creatures with simple desires, such as to hunt +#define EVENT_CATEGORY_ENTITIES "Entities" +///Events that should have no harmful effects, and might be useful to the crew +#define EVENT_CATEGORY_FRIENDLY "Friendly" +///Events that affect the body and mind +#define EVENT_CATEGORY_HEALTH "Health" +///Events reserved for special occassions +#define EVENT_CATEGORY_HOLIDAY "Holiday" +///Events with enemy groups with a more complex plan +#define EVENT_CATEGORY_INVASION "Invasion" +///Events that make a mess +#define EVENT_CATEGORY_JANITORIAL "Janitorial" +///Events that summon meteors and other debris, and stationwide waves of harmful space weather +#define EVENT_CATEGORY_SPACE "Space Threats" +///Events summoned by a wizard +#define EVENT_CATEGORY_WIZARD "Wizard" + +/// Return from admin setup to stop the event from triggering entirely. +#define ADMIN_CANCEL_EVENT "cancel event" diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index cd647867c3..6d7df3e93f 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -58,9 +58,11 @@ #define ITEM_SLOT_HANDCUFFED (1<<23) /// Legcuff slot (bolas, beartraps) #define ITEM_SLOT_LEGCUFFED (1<<24) +/// To attach to a jumpsuit +#define ITEM_SLOT_ACCESSORY (1<<25) /// Total amount of slots -#define SLOTS_AMT 25 // Keep this up to date! +#define SLOTS_AMT 26 // Keep this up to date! //SLOT GROUP HELPERS #define ITEM_SLOT_POCKETS (ITEM_SLOT_LPOCKET|ITEM_SLOT_RPOCKET) @@ -83,7 +85,7 @@ #define HIDETAUR (1<<11) //gotta hide that snowflake #define HIDESNOUT (1<<12) //or do we actually hide our snoots #define HIDEACCESSORY (1<<13) //hides the jumpsuit accessory. -//skyrat edit +//sandstorm edit #define HIDEUNDERWEAR (1<<14) //hides underwear, socks and shirt #define HIDEWRISTS (1<<15) //hides wrists // diff --git a/code/__DEFINES/loadout.dm b/code/__DEFINES/loadout.dm index 182e58c1f7..4a52d25fb3 100644 --- a/code/__DEFINES/loadout.dm +++ b/code/__DEFINES/loadout.dm @@ -4,10 +4,12 @@ #define LOADOUT_SUBCATEGORY_NONE "Miscellaneous" #define LOADOUT_SUBCATEGORIES_NONE list("Miscellaneous") +//accessory +#define LOADOUT_CATEGORY_ACCESSORY "Accessory" + //backpack #define LOADOUT_CATEGORY_BACKPACK "In backpack" #define LOADOUT_SUBCATEGORY_BACKPACK_GENERAL "General" //basically anything that there's not enough of to have its own subcategory -#define LOADOUT_SUBCATEGORY_BACKPACK_ACCESSORIES "Accessories" //maybe one day someone will make loadouts have accessory compatibility #define LOADOUT_SUBCATEGORY_BACKPACK_TOYS "Toys" //neck #define LOADOUT_CATEGORY_NECK "Neck" diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index c4252ad542..5b457dd9cc 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -9,6 +9,14 @@ * Misc */ +// Generic listoflist safe add and removal macros: +///If value is a list, wrap it in a list so it can be used with list add/remove operations +#define LIST_VALUE_WRAP_LISTS(value) (islist(value) ? list(value) : value) +///Add an untyped item to a list, taking care to handle list items by wrapping them in a list to remove the footgun +#define UNTYPED_LIST_ADD(list, item) (list += LIST_VALUE_WRAP_LISTS(item)) +///Remove an untyped item to a list, taking care to handle list items by wrapping them in a list to remove the footgun +#define UNTYPED_LIST_REMOVE(list, item) (list -= LIST_VALUE_WRAP_LISTS(item)) + #define LAZYINITLIST(L) if (!L) { L = list(); } #define UNSETEMPTY(L) if (L && !length(L)) L = null ///Like LAZYCOPY - copies an input list if the list has entries, If it doesn't the assigned list is nulled diff --git a/code/__HELPERS/custom_holoforms.dm b/code/__HELPERS/custom_holoforms.dm index 8aa8d279ec..87f3bfbe8b 100644 --- a/code/__HELPERS/custom_holoforms.dm +++ b/code/__HELPERS/custom_holoforms.dm @@ -6,6 +6,7 @@ prefs.copy_to(mannequin) if(apply_loadout && prefs.parent) SSjob.equip_loadout(prefs.parent.mob, mannequin, bypass_prereqs = TRUE) + SSjob.post_equip_loadout(prefs.parent.mob, mannequin, bypass_prereqs = TRUE) if(copy_job) var/datum/job/highest = prefs.get_highest_job() if(highest && !istype(highest, /datum/job/ai) && !istype(highest, /datum/job/cyborg)) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index a7947f5f07..78e1899f53 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -123,6 +123,6 @@ for(var/path in typesof(/obj/item/coin)) var/obj/item/coin/C = new path UNTIL(C.flags_1 & INITIALIZED_1) //we want to make sure the value is calculated and not null. - GLOB.coin_values[path] = C.value + GLOB.coin_values[path] = C.get_item_credit_value() qdel(C) diff --git a/code/__SANDCODE/DEFINES/traits.dm b/code/__SANDCODE/DEFINES/traits.dm index ffc5af34bc..92799a3fdf 100644 --- a/code/__SANDCODE/DEFINES/traits.dm +++ b/code/__SANDCODE/DEFINES/traits.dm @@ -6,3 +6,8 @@ #define TRAIT_SHELTERED "sheltered" /// Define for the quirk "infertile", self explanatory. Please make this a preference on the Content Preferences Tab. #define TRAIT_INFERTILE "infertile" +/// DNC trait, used to prevent cloning +#define TRAIT_DNC_ORDER "dnc_order" +/// Estrous traits, used for mammalian seasonal arousal systems +#define TRAIT_ESTROUS_ACTIVE "estrous_active" +#define TRAIT_ESTROUS_DETECT "estrous_detect" diff --git a/code/__SPLURTCODE/DEFINES/preferences.dm b/code/__SPLURTCODE/DEFINES/preferences.dm new file mode 100644 index 0000000000..ba74e8762e --- /dev/null +++ b/code/__SPLURTCODE/DEFINES/preferences.dm @@ -0,0 +1 @@ +#define DEFAULT_SAVE_SLOTS 24 diff --git a/code/__SPLURTCODE/DEFINES/traits.dm b/code/__SPLURTCODE/DEFINES/traits.dm index 1504038a56..bceaa2180e 100644 --- a/code/__SPLURTCODE/DEFINES/traits.dm +++ b/code/__SPLURTCODE/DEFINES/traits.dm @@ -25,12 +25,13 @@ #define TRAIT_PHARMA "hepatic_pharmacokinesis" #define TRAIT_CHOKE_SLUT "choke_slut" -#define BLOODFLEDGE "BloodFledge" +#define TRAIT_BLOODFLEDGE "BloodFledge" #define TRAIT_INCUBUS "Incubus" #define TRAIT_SUCCUBUS "Succubus" #define TRAIT_ARACHNID "Arachnid" #define TRAIT_FLUTTER "flutter" - #define TRAIT_NUDIST "Nudist" +#define TRAIT_CLOTH_EATER "cloth_eater" +#define TRAIT_WEREWOLF "Werewolf" diff --git a/code/__SPLURTCODE/DEFINES/zeros/traits.dm b/code/__SPLURTCODE/DEFINES/zeros/traits.dm index 74a180621d..199962dbfd 100644 --- a/code/__SPLURTCODE/DEFINES/zeros/traits.dm +++ b/code/__SPLURTCODE/DEFINES/zeros/traits.dm @@ -3,9 +3,6 @@ #define TRAIT_CURSED_BLOOD "cursed_blood" //Yo dawg I heard you like bloodborne references so I put a #define TRAIT_HEADPAT_SLUT "headpat_slut" #define TRAIT_DISTANT "headpat_hater" -#define TRAIT_NO_CLONE "no_clone" -#define TRAIT_IN_HEAT "in_heat" -#define TRAIT_HEAT_DETECT "heat_detect" #define TRAIT_ILLITERATE "illiterate" #define TRAIT_HIDE_BACKPACK "hide_backpack" diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 3bd089f4c8..bad1fa7ee4 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -68,6 +68,25 @@ DEFINE_BITFIELD(area_flags, list( "NO_ALERTS" = NO_ALERTS, )) +DEFINE_BITFIELD(body_parts_covered, list( + "ARM_LEFT" = ARM_LEFT, + "ARM_RIGHT" = ARM_RIGHT, + "ARMS" = ARMS, + "CHEST" = CHEST, + "FEET" = FEET, + "FOOT_LEFT" = FOOT_LEFT, + "FOOT_RIGHT" = FOOT_RIGHT, + "GROIN" = GROIN, + "HAND_LEFT" = HAND_LEFT, + "HAND_RIGHT" = HAND_RIGHT, + "HANDS" = HANDS, + "HEAD" = HEAD, + "LEG_LEFT" = LEG_LEFT, + "LEG_RIGHT" = LEG_RIGHT, + "LEGS" = LEGS, + "NECK" = NECK, +)) + DEFINE_BITFIELD(car_traits, list( "CAN_KIDNAP" = CAN_KIDNAP, )) @@ -125,6 +144,11 @@ DEFINE_BITFIELD(disease_flags, list( "CURABLE" = CURABLE, )) +DEFINE_BITFIELD(explosion_flags, list( + "EXPLOSION_FLAG_DENSITY_DEPENDENT" = EXPLOSION_FLAG_DENSITY_DEPENDENT, + "EXPLOSION_FLAG_HARD_OBSTACLE" = EXPLOSION_FLAG_HARD_OBSTACLE, +)) + DEFINE_BITFIELD(flags_1, list( "ADMIN_SPAWNED_1" = ADMIN_SPAWNED_1, "BLOCK_FACE_ATOM_1" = BLOCK_FACE_ATOM_1, @@ -147,6 +171,30 @@ DEFINE_BITFIELD(flags_1, list( "UNUSED_RESERVATION_TURF_1" = UNUSED_RESERVATION_TURF_1, )) +DEFINE_BITFIELD(flags_cover, list( + "GLASSESCOVERSEYE" = GLASSESCOVERSEYES, + "HEADCOVERSEYES" = HEADCOVERSEYES, + "HEADCOVERSMOUTH" = HEADCOVERSMOUTH, + "MASKCOVERSEYES" = MASKCOVERSEYES, + "MASKCOVERSMOUTH" = MASKCOVERSMOUTH, +)) + +DEFINE_BITFIELD(flags_inv, list( + "HIDEACCESSORY" = HIDEACCESSORY, + "HIDEEARS" = HIDEEARS, + "HIDEEYES" = HIDEEYES, + "HIDEFACE" = HIDEFACE, + "HIDEFACIALHAI" = HIDEFACIALHAIR, + "HIDEGLOVES" = HIDEGLOVES, + "HIDEHAIR" = HIDEHAIR, + "HIDEJUMPSUIT" = HIDEJUMPSUIT, + "HIDEMASK" = HIDEMASK, + "HIDENECK" = HIDENECK, + "HIDESHOES" = HIDESHOES, + "HIDESNOUT" = HIDESNOUT, + "HIDESUITSTORA" = HIDESUITSTORAGE, + "HIDETAUR" = HIDETAUR, +)) DEFINE_BITFIELD(flags_ricochet, list( "RICOCHET_SHINY" = RICOCHET_SHINY, "RICOCHET_HARD" = RICOCHET_HARD @@ -213,6 +261,12 @@ DEFINE_BITFIELD(item_flags, list( "SLOWS_WHILE_IN_HAND" = SLOWS_WHILE_IN_HAND, )) +DEFINE_BITFIELD(material_flags, list( + "MATERIAL_ADD_PREFIX" = MATERIAL_ADD_PREFIX, + "MATERIAL_AFFECT_STATISTICS" = MATERIAL_AFFECT_STATISTICS, + "MATERIAL_COLOR" = MATERIAL_COLOR, +)) + DEFINE_BITFIELD(mob_biotypes, list( "MOB_BEAST" = MOB_BEAST, "MOB_BUG" = MOB_BUG, @@ -290,7 +344,21 @@ DEFINE_BITFIELD(pass_flags, list( "PASSCLOSEDTURF" = PASSCLOSEDTURF, "PASSGLASS" = PASSGLASS, "PASSGRILLE" = PASSGRILLE, + "PASSMACHINE" = PASSMACHINE, "PASSMOB" = PASSMOB, + "PASSSTRUCTURE" = PASSSTRUCTURE, + "PASSTABLE" = PASSTABLE, +)) + +DEFINE_BITFIELD(pass_flags_self, list( + "LETPASSTHROW" = LETPASSTHROW, + "PASSBLOB" = PASSBLOB, + "PASSCLOSEDTURF" = PASSCLOSEDTURF, + "PASSGLASS" = PASSGLASS, + "PASSGRILLE" = PASSGRILLE, + "PASSMACHINE" = PASSMACHINE, + "PASSMOB" = PASSMOB, + "PASSSTRUCTURE" = PASSSTRUCTURE, "PASSTABLE" = PASSTABLE, )) @@ -352,6 +420,30 @@ DEFINE_BITFIELD(sight, list( "SEE_TURFS" = SEE_TURFS, )) +DEFINE_BITFIELD(slot_flags, list( + "ITEM_SLOT_ACCESSORY" = ITEM_SLOT_ACCESSORY, + "ITEM_SLOT_BACK" = ITEM_SLOT_BACK, + "ITEM_SLOT_BACKPACK" = ITEM_SLOT_BACKPACK, + "ITEM_SLOT_BELT" = ITEM_SLOT_BELT, + "ITEM_SLOT_DEX_STORAGE" = ITEM_SLOT_DEX_STORAGE, + "ITEM_SLOT_EARS" = ITEM_SLOT_EARS, + "ITEM_SLOT_EYES" = ITEM_SLOT_EYES, + "ITEM_SLOT_FEET" = ITEM_SLOT_FEET, + "ITEM_SLOT_GLOVES" = ITEM_SLOT_GLOVES, + "ITEM_SLOT_HANDCUFFED" = ITEM_SLOT_HANDCUFFED, + "ITEM_SLOT_HANDS" = ITEM_SLOT_HANDS, + "ITEM_SLOT_HEAD" = ITEM_SLOT_HEAD, + "ITEM_SLOT_ICLOTHING" = ITEM_SLOT_ICLOTHING, + "ITEM_SLOT_ID" = ITEM_SLOT_ID, + "ITEM_SLOT_LEGCUFFED" = ITEM_SLOT_LEGCUFFED, + "ITEM_SLOT_LPOCKET" = ITEM_SLOT_LPOCKET, + "ITEM_SLOT_MASK" = ITEM_SLOT_MASK, + "ITEM_SLOT_NECK" = ITEM_SLOT_NECK, + "ITEM_SLOT_OCLOTHING" = ITEM_SLOT_OCLOTHING, + "ITEM_SLOT_RPOCKET" = ITEM_SLOT_RPOCKET, + "ITEM_SLOT_SUITSTORE" = ITEM_SLOT_SUITSTORE, +)) + DEFINE_BITFIELD(smooth, list( "SMOOTH_BORDER" = SMOOTH_BORDER, "SMOOTH_DIAGONAL" = SMOOTH_DIAGONAL, @@ -360,6 +452,15 @@ DEFINE_BITFIELD(smooth, list( "SMOOTH_TRUE" = SMOOTH_TRUE, )) +DEFINE_BITFIELD(status_flags, list( + "CANKNOCKDOWN" = CANKNOCKDOWN, + "CANPUSH" = CANPUSH, + "CANSTAGGER" = CANSTAGGER, + "CANSTUN" = CANSTUN, + "CANUNCONSCIOUS" = CANUNCONSCIOUS, + "GODMODE" = GODMODE, +)) + DEFINE_BITFIELD(storage_flags, list( "STORAGE_LIMIT_COMBINED_W_CLASS" = STORAGE_LIMIT_COMBINED_W_CLASS, "STORAGE_LIMIT_MAX_ITEMS" = STORAGE_LIMIT_MAX_ITEMS, @@ -378,6 +479,59 @@ DEFINE_BITFIELD(vis_flags, list( "VIS_UNDERLAY" = VIS_UNDERLAY, )) +DEFINE_BITFIELD(visor_flags, list( + "ALLOWINTERNALS" = ALLOWINTERNALS, + "BLOCK_GAS_SMOKE_EFFECT" = BLOCK_GAS_SMOKE_EFFECT, + "IGNORE_HAT_TOSS" = IGNORE_HAT_TOSS, + "LAVAPROTECT" = LAVAPROTECT, + "NOSLIP" = NOSLIP, + "NOSLIP_ICE" = NOSLIP_ICE, + "SCAN_REAGENTS" = SCAN_REAGENTS, + "STOPSPRESSUREDAMAGE" = STOPSPRESSUREDAMAGE, + "THICKMATERIAL" = THICKMATERIAL, + "VOICEBOX_DISABLED" = VOICEBOX_DISABLED, + "VOICEBOX_TOGGLABLE" = VOICEBOX_TOGGLABLE, +)) + +DEFINE_BITFIELD(visor_flags_cover, list( + "GLASSESCOVERSEYE" = GLASSESCOVERSEYES, + "HEADCOVERSEYES" = HEADCOVERSEYES, + "HEADCOVERSMOUTH" = HEADCOVERSMOUTH, + "MASKCOVERSEYES" = MASKCOVERSEYES, + "MASKCOVERSMOUTH" = MASKCOVERSMOUTH, +)) + +DEFINE_BITFIELD(visor_flags_inv, list( + "HIDEACCESSORY" = HIDEACCESSORY, + "HIDEEARS" = HIDEEARS, + "HIDEEYES" = HIDEEYES, + "HIDEFACE" = HIDEFACE, + "HIDEFACIALHAI" = HIDEFACIALHAIR, + "HIDEGLOVES" = HIDEGLOVES, + "HIDEHAIR" = HIDEHAIR, + "HIDEJUMPSUIT" = HIDEJUMPSUIT, + "HIDEMASK" = HIDEMASK, + "HIDENECK" = HIDENECK, + "HIDESHOES" = HIDESHOES, + "HIDESNOUT" = HIDESNOUT, + "HIDESUITSTORA" = HIDESUITSTORAGE, + "HIDETAUR" = HIDETAUR, +)) + +DEFINE_BITFIELD(vore_flags, list( + "ABSORBABLE" = ABSORBABLE, + "ABSORBED" = ABSORBED, + "DEVOURABLE" = DEVOURABLE, + "DIGESTABLE" = DIGESTABLE, + "FEEDING" = FEEDING, + "LICKABLE" = LICKABLE, + "MOBVORE" = MOBVORE, + "NO_VORE" = NO_VORE, + "SMELLABLE" = SMELLABLE, + "VOREPREF_INIT" = VOREPREF_INIT, + "VORE_INIT" = VORE_INIT, +)) + DEFINE_BITFIELD(zap_flags, list( "ZAP_ALLOW_DUPLICATES" = ZAP_ALLOW_DUPLICATES, "ZAP_MACHINE_EXPLOSIVE" = ZAP_MACHINE_EXPLOSIVE, diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 8e00b1e0fa..44d507891c 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -338,42 +338,7 @@ GLOBAL_LIST_INIT(colored_mutant_parts, list("insect_wings" = "wings_color", "dec GLOBAL_LIST_INIT(greyscale_limb_types, list("human","moth","lizard","pod","plant","jelly","slime","golem","slimelumi","stargazer","mush","ethereal","snail","c_golem","b_golem","mammal","xeno","ipc","insect","synthliz","avian","aquatic", "shadekin")) //body ids that have prosthetic sprites -GLOBAL_LIST_INIT(prosthetic_limb_types, list("xion","bishop","cybersolutions","grayson","hephaestus","nanotrasen","talon")) - -//FAMILY HEIRLOOM LIST -//this works by using the first number for the species as a probability to choose one of the items in the following list for their family heirloom -//if the probability fails, or the species simply isn't in the list, then it defaults to the next global list, which has its own list of items for each job -//the first item in the list is for if your job isn't in that list - -//species-heirloom list (we categorise them by the species id var) -GLOBAL_LIST_INIT(species_heirlooms, list( - "dwarf" = list(25, list(/obj/item/reagent_containers/food/drinks/dwarf_mug)), //example: 25% chance for dwarves to get a dwarf mug as their heirloom (normal container but has manly dorf icon) - "insect" = list(25, list(/obj/item/flashlight/lantern/heirloom_moth)), - "ipc" = list(25, list(/obj/item/stock_parts/cell/family)), //gives a broken powercell for flavor text! - "synthliz" = list(25, list(/obj/item/stock_parts/cell/family)), //they're also robots - "slimeperson" = list(25, list(/obj/item/toy/plush/slimeplushie)), - "lizard" = list(25, list(/obj/item/toy/plush/lizardplushie)), - )) - -//job-heirloom list -GLOBAL_LIST_INIT(job_heirlooms, list( - "NO_JOB" = list(/obj/item/toy/cards/deck, /obj/item/lighter, /obj/item/dice/d20), - "Clown" = list(/obj/item/paint/anycolor, /obj/item/bikehorn/golden), - "Mime" = list(/obj/item/paint/anycolor, /obj/item/toy/dummy), - "Cook" = list(/obj/item/kitchen/knife/scimitar), - "Botanist" = list(/obj/item/cultivator, /obj/item/reagent_containers/glass/bucket, /obj/item/storage/bag/plants, /obj/item/toy/plush/beeplushie), - "Medical Doctor" = list(/obj/item/healthanalyzer), - "Paramedic" = list(/obj/item/lighter), //..why? - "Station Engineer" = list(/obj/item/wirecutters/brass/family, /obj/item/crowbar/brass/family, /obj/item/screwdriver/brass/family, /obj/item/wrench/brass/family), //brass tools but without the tool speed modifier - "Atmospheric Technician" = list(/obj/item/extinguisher/mini/family), - "Lawyer" = list(/obj/item/storage/briefcase/lawyer/family), - "Janitor" = list(/obj/item/mop), - "Scientist" = list(/obj/item/toy/plush/slimeplushie), - "Assistant" = list(/obj/item/clothing/gloves/cut/family), - "Prisoner" = list (/obj/item/pen/blue), - "Chaplain" = list(/obj/item/camera/spooky/family), - "Head of Personnel" = list(/obj/item/pinpointer/ian) - )) +GLOBAL_LIST_INIT(prosthetic_limb_types, list("xion","bishop","cybersolutions","grayson","hephaestus","nanotrasen","talon","veymed")) //I don't know if i can module this to splurt //body ids that have non-gendered bodyparts GLOBAL_LIST_INIT(nongendered_limb_types, list("fly", "zombie" ,"synth", "shadow", "cultgolem", "agent", "plasmaman", "clockgolem", "clothgolem")) diff --git a/code/_globalvars/lists/loadout_categories.dm b/code/_globalvars/lists/loadout_categories.dm index 371e09392b..428e5b0e32 100644 --- a/code/_globalvars/lists/loadout_categories.dm +++ b/code/_globalvars/lists/loadout_categories.dm @@ -1,5 +1,6 @@ GLOBAL_LIST_INIT(loadout_categories, list( - LOADOUT_CATEGORY_BACKPACK = list(LOADOUT_SUBCATEGORY_BACKPACK_GENERAL, LOADOUT_SUBCATEGORY_BACKPACK_ACCESSORIES, LOADOUT_SUBCATEGORY_BACKPACK_TOYS), + LOADOUT_CATEGORY_ACCESSORY = LOADOUT_SUBCATEGORIES_NONE, + LOADOUT_CATEGORY_BACKPACK = list(LOADOUT_SUBCATEGORY_BACKPACK_GENERAL, LOADOUT_SUBCATEGORY_BACKPACK_TOYS), LOADOUT_CATEGORY_NECK = list(LOADOUT_SUBCATEGORY_NECK_GENERAL, LOADOUT_SUBCATEGORY_NECK_TIE, LOADOUT_SUBCATEGORY_NECK_SCARVES), LOADOUT_CATEGORY_MASK = LOADOUT_SUBCATEGORIES_NONE, LOADOUT_CATEGORY_HANDS = LOADOUT_SUBCATEGORIES_NONE, diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm index 3660770596..2dd13eb1ac 100644 --- a/code/controllers/subsystem/events.dm +++ b/code/controllers/subsystem/events.dm @@ -93,41 +93,6 @@ SUBSYSTEM_DEF(events) else if(. == EVENT_READY) E.runEvent(random = TRUE) -//allows a client to trigger an event -//aka Badmin Central -// > Not in modules/admin -// REEEEEEEEE -// Why the heck is this here! Took me so damn long to find! -/client/proc/forceEvent() - set name = "Trigger Event" - set category = "Admin.Events" - - if(!holder ||!check_rights(R_FUN)) - return - - holder.forceEvent() - -/datum/admins/proc/forceEvent() - var/dat = "" - var/normal = "" - var/magic = "" - var/holiday = "" - for(var/datum/round_event_control/E in SSevents.control) - dat = "
[E]" - if(E.holidayID) - holiday += dat - else if(E.wizardevent) - magic += dat - else - normal += dat - - dat = normal + "
" + magic + "
" + holiday - - var/datum/browser/popup = new(usr, "forceevent", "Force Random Event", 300, 750) - popup.set_content(dat) - popup.open() - - /* ////////////// // HOLIDAYS // diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 02c8afdfc7..01393ed0d1 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -487,7 +487,7 @@ SUBSYSTEM_DEF(job) if(job.dresscodecompliant)// CIT CHANGE - dress code compliance equip_loadout(N, H) // CIT CHANGE - allows players to spawn with loadout items job.after_spawn(H, M.client, joined_late) // note: this happens before the mob has a key! M will always have a client, H might not. - equip_loadout(N, H, TRUE)//CIT CHANGE - makes players spawn with in-backpack loadout items properly. A little hacky but it works + post_equip_loadout(N, H)//CIT CHANGE - makes players spawn with in-backpack loadout items properly. A little hacky but it works handle_roundstart_items(H, M.ckey, H.mind.assigned_role, H.mind.special_role) @@ -691,7 +691,7 @@ SUBSYSTEM_DEF(job) message_admins(msg) CRASH(msg) -/datum/controller/subsystem/job/proc/equip_loadout(mob/dead/new_player/N, mob/living/M, equipbackpackstuff, bypass_prereqs = FALSE, can_drop = TRUE) +/datum/controller/subsystem/job/proc/equip_loadout(mob/dead/new_player/N, mob/living/M, bypass_prereqs = FALSE, can_drop = TRUE) var/mob/the_mob = N if(!the_mob) the_mob = M // cause this doesn't get assigned if player is a latejoiner @@ -709,9 +709,68 @@ SUBSYSTEM_DEF(job) permitted = FALSE if(G.donoritem && !G.donator_ckey_check(the_mob.client.ckey)) permitted = FALSE - if(!equipbackpackstuff && G.slot == ITEM_SLOT_BACKPACK)//snowflake check since plopping stuff in the backpack doesnt work for pre-job equip loadout stuffs + if(G.handle_post_equip) permitted = FALSE - if(equipbackpackstuff && G.slot != ITEM_SLOT_BACKPACK)//ditto + if(!permitted) + continue + var/obj/item/I = new G.path + if(I) + if(length(i[LOADOUT_COLOR])) //handle loadout colors + //handle polychromic items + if((G.loadout_flags & LOADOUT_CAN_COLOR_POLYCHROMIC) && length(G.loadout_initial_colors)) + var/datum/element/polychromic/polychromic = LAZYACCESS(I.comp_lookup, "item_worn_overlays") //stupid way to do it but GetElement does not work for this + if(polychromic && istype(polychromic)) + var/list/polychromic_entry = polychromic.colors_by_atom[I] + if(polychromic_entry) + if(polychromic.suits_with_helmet_typecache[I.type]) //is this one of those toggleable hood/helmet things? + polychromic.connect_helmet(I,i[LOADOUT_COLOR]) + polychromic.colors_by_atom[I] = i[LOADOUT_COLOR] + I.update_icon() + else + //handle non-polychromic items (they only have one color) + I.add_atom_colour(i[LOADOUT_COLOR][1], FIXED_COLOUR_PRIORITY) + I.update_icon() + //when inputting the data it's already sanitized + if(i[LOADOUT_CUSTOM_NAME]) + var/custom_name = i[LOADOUT_CUSTOM_NAME] + I.name = custom_name + if(i[LOADOUT_CUSTOM_DESCRIPTION]) + var/custom_description = i[LOADOUT_CUSTOM_DESCRIPTION] + I.desc = custom_description + if(!M.equip_to_slot_if_possible(I, G.slot, disable_warning = TRUE, bypass_equip_delay_self = TRUE)) // If the job's dresscode compliant, try to put it in its slot, first + if(iscarbon(M)) + var/mob/living/carbon/C = M + var/obj/item/storage/backpack/B = C.back + if(!B || !SEND_SIGNAL(B, COMSIG_TRY_STORAGE_INSERT, I, null, TRUE, TRUE)) // Otherwise, try to put it in the backpack, for carbons. + if(can_drop) + I.forceMove(get_turf(C)) + else + qdel(I) + else if(!M.equip_to_slot_if_possible(I, ITEM_SLOT_BACKPACK, disable_warning = TRUE, bypass_equip_delay_self = TRUE)) // Otherwise, try to put it in the backpack + if(can_drop) + I.forceMove(get_turf(M)) // If everything fails, just put it on the floor under the mob. + else + qdel(I) + +/datum/controller/subsystem/job/proc/post_equip_loadout(mob/dead/new_player/N, mob/living/M, bypass_prereqs = FALSE, can_drop = TRUE) + var/mob/the_mob = N + if(!the_mob) + the_mob = M // cause this doesn't get assigned if player is a latejoiner + var/list/chosen_gear = the_mob.client.prefs.loadout_data["SAVE_[the_mob.client.prefs.loadout_slot]"] + if(the_mob.client && the_mob.client.prefs && (chosen_gear && chosen_gear.len)) + if(!ishuman(M))//no silicons allowed + return + for(var/i in chosen_gear) + var/datum/gear/G = istext(i[LOADOUT_ITEM]) ? text2path(i[LOADOUT_ITEM]) : i[LOADOUT_ITEM] + G = GLOB.loadout_items[initial(G.category)][initial(G.subcategory)][initial(G.name)] + if(!G) + continue + var/permitted = TRUE + if(!bypass_prereqs && G.restricted_roles && G.restricted_roles.len && !(M.mind.assigned_role in G.restricted_roles)) + permitted = FALSE + if(G.donoritem && !G.donator_ckey_check(the_mob.client.ckey)) + permitted = FALSE + if(!G.handle_post_equip) permitted = FALSE if(!permitted) continue diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index 3699331eda..19247c486a 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -171,9 +171,14 @@ stress = max(stress - 4, 0) /datum/brain_trauma/severe/monophobia/proc/check_alone() +//SANDSTORM EDIT + var/check_radius = 7 + if(istype(owner.loc, /obj/belly)) + return FALSE if(HAS_TRAIT(owner, TRAIT_BLIND)) - return TRUE - for(var/mob/M in oview(owner, 7)) + check_radius = 1 + for(var/mob/M in oview(owner, check_radius)) +//SANDSTORM EDIT END if(!isliving(M)) //ghosts ain't people continue if((istype(M, /mob/living/simple_animal/pet)) || M.ckey) diff --git a/code/datums/chatmessage.dm b/code/datums/chatmessage.dm index f4a979c510..fe1fbdf340 100644 --- a/code/datums/chatmessage.dm +++ b/code/datums/chatmessage.dm @@ -202,7 +202,7 @@ message.maptext_height = mheight message.maptext_x = (CHAT_MESSAGE_WIDTH - owner.bound_width) * -0.5 message.maptext = MAPTEXT(complete_text) - message.pixel_x = -owner.pixel_x //Dogborgs and other wide boys have a pixel offset. This accounts for that + message.pixel_x = -target.pixel_x //Dogborgs and other wide boys have a pixel offset. This accounts for that // View the message LAZYADDASSOC(owned_by.seen_messages, message_loc, src) diff --git a/code/datums/traits/good.dm b/code/datums/traits/good.dm index e2de71d006..26bc6746ad 100644 --- a/code/datums/traits/good.dm +++ b/code/datums/traits/good.dm @@ -128,7 +128,7 @@ var/mob/living/carbon/human/H = quirk_holder var/obj/item/camera/camera = new(get_turf(H)) H.put_in_hands(camera) - H.equip_to_slot(camera, ITEM_SLOT_NECK) + H.equip_to_slot(camera, ITEM_SLOT_BACKPACK) //SPLURT Edit H.regenerate_icons() /datum/quirk/selfaware @@ -181,16 +181,44 @@ /datum/quirk/trandening name = "High Luminosity Eyes" - desc = "When the next big fancy implant came out you had to buy one on impluse!" + desc = "When the next big fancy implant came out you had to buy one on impulse! You start the shift with emissive cybernetic eyes that can emit colored beams of light." value = 1 - gain_text = "You have to keep up with the next big thing!." - lose_text = "High-tech gizmos are a scam..." + gain_text = "You've been keeping up with the latest cybernetic trends!" + lose_text = "High powered eye lasers? What were you thinking..." /datum/quirk/trandening/on_spawn() // Get targets var/obj/item/organ/eyes/old_eyes = quirk_holder.getorganslot(ORGAN_SLOT_EYES) var/obj/item/organ/eyes/robotic/glow/new_eyes = new - + + // Replace eyes + qdel(old_eyes) + new_eyes.Insert(quirk_holder) + +/datum/quirk/trandening/remove() + // Get targets + var/obj/item/organ/eyes/old_eyes = quirk_holder.getorganslot(ORGAN_SLOT_EYES) + var/mob/living/carbon/human/qurk_mob = quirk_holder + + // Check for eyes existing + if(!old_eyes) + return + + // Check for quirk eyes + if(!istype(old_eyes, /obj/item/organ/eyes/robotic/glow)) + return + + // Define new eyes + var/species_eyes = /obj/item/organ/eyes + + // Check for mutant eyes + if(qurk_mob.dna.species && qurk_mob.dna.species.mutanteyes) + // Set eyes to mutant type + species_eyes = qurk_mob.dna.species.mutanteyes + + // Create new eyes item + var/obj/item/organ/eyes/new_eyes = new species_eyes() + // Replace eyes qdel(old_eyes) new_eyes.Insert(quirk_holder) diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 8d3acf0f6d..a30e27c8f8 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -43,27 +43,38 @@ GLOBAL_LIST_EMPTY(family_heirlooms) -/datum/quirk/family_heirloom/on_spawn() - var/mob/living/carbon/human/H = quirk_holder +/datum/quirk/family_heirloom/on_spawn() + // Define holder and type + var/mob/living/carbon/human/human_holder = quirk_holder var/obj/item/heirloom_type - var/species_heirloom_entry = GLOB.species_heirlooms[H.dna.species.id] - if(species_heirloom_entry) - if(prob(species_heirloom_entry[1])) - heirloom_type = pick(species_heirloom_entry[2]) + + // The quirk holder's species - we have a 50% chance, if we have a species with a set heirloom, to choose a species heirloom. + var/datum/species/holder_species = human_holder.dna?.species + if(holder_species && LAZYLEN(holder_species.family_heirlooms) && prob(50)) + heirloom_type = pick(holder_species.family_heirlooms) + else + // Our quirk holder's job + var/datum/job/holder_job = SSjob.GetJob(human_holder.last_mind?.assigned_role) + if(holder_job && LAZYLEN(holder_job.family_heirlooms)) + heirloom_type = pick(holder_job.family_heirlooms) + + // If we didn't find an heirloom somehow, throw them a generic one if(!heirloom_type) - var/job_heirloom_entry = GLOB.job_heirlooms[quirk_holder.mind.assigned_role] - if(!job_heirloom_entry) - heirloom_type = pick(GLOB.job_heirlooms["NO_JOB"]) //consider: should this be a define? - else - heirloom_type = pick(job_heirloom_entry) + heirloom_type = pick(/obj/item/toy/cards/deck, /obj/item/lighter, /obj/item/dice/d20) + + // Create the heirloom item heirloom = new heirloom_type(get_turf(quirk_holder)) + + // Add to global list GLOB.family_heirlooms += heirloom + + // Determine and assign item location var/list/slots = list( "in your left pocket" = ITEM_SLOT_LPOCKET, "in your right pocket" = ITEM_SLOT_RPOCKET, "in your backpack" = ITEM_SLOT_BACKPACK ) - where = H.equip_in_one_of_slots(heirloom, slots, FALSE) || "at your feet" + where = human_holder.equip_in_one_of_slots(heirloom, slots, FALSE) || "at your feet" /datum/quirk/family_heirloom/post_add() if(where == "in your backpack") @@ -75,13 +86,25 @@ GLOBAL_LIST_EMPTY(family_heirlooms) heirloom.name = "\improper [family_name[family_name.len]] family [heirloom.name]" /datum/quirk/family_heirloom/on_process() - if(heirloom in quirk_holder.GetAllContents()) + // Ignore for dead holder + if(quirk_holder.stat == DEAD) + return + + // When held: Positive mood + if(heirloom && (heirloom in quirk_holder.GetAllContents())) SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "family_heirloom_missing") SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "family_heirloom", /datum/mood_event/family_heirloom) + + // When not held: Negative mood else SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "family_heirloom") SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "family_heirloom_missing", /datum/mood_event/family_heirloom_missing) +/datum/quirk/item_quirk/family_heirloom/remove() + // Clear mood events when removing this quirk + SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "family_heirloom") + SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "family_heirloom_missing") + /datum/quirk/family_heirloom/clone_data() return heirloom diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm index e5dd6d3e33..4db3d688ce 100644 --- a/code/datums/traits/neutral.dm +++ b/code/datums/traits/neutral.dm @@ -165,22 +165,7 @@ lose_text = "You no longer feel like you should be eating trash." mob_trait = TRAIT_TRASHCAN -/datum/quirk/colorist - name = "Colorist" - desc = "You like carrying around a hair dye spray to quickly apply color patterns to your hair." - value = 0 - medical_record_text = "Patient enjoys dyeing their hair with pretty colors." - -/datum/quirk/colorist/on_spawn() - var/mob/living/carbon/human/H = quirk_holder - var/obj/item/dyespray/spraycan = new(get_turf(quirk_holder)) - H.equip_to_slot(spraycan, ITEM_SLOT_BACKPACK) - H.regenerate_icons() - -/datum/quirk/colorist/post_add() - var/mob/living/carbon/human/H = quirk_holder - SEND_SIGNAL(H.back, COMSIG_TRY_STORAGE_SHOW, H) - to_chat(quirk_holder, "You brought some extra dye with you! It's in your bag if you forgot.") +// Moved Colorist quirk to a loadout item /datum/quirk/salt_sensitive name = "Sodium Sensitivity" diff --git a/code/game/machinery/aug_manipulator.dm b/code/game/machinery/aug_manipulator.dm index c34e0a2d4f..cbece7626e 100644 --- a/code/game/machinery/aug_manipulator.dm +++ b/code/game/machinery/aug_manipulator.dm @@ -15,6 +15,7 @@ "Talon" = 'icons/mob/augmentation/cosmetic_prosthetic/talon.dmi', "Nanotrasen" = 'icons/mob/augmentation/cosmetic_prosthetic/nanotrasen.dmi', "Hephaesthus" = 'icons/mob/augmentation/cosmetic_prosthetic/hephaestus.dmi', + "Veymed" = 'icons/mob/augmentation/cosmetic_prosthetic/veymed.dmi', //i don't know if i can module this either "Bishop" = 'icons/mob/augmentation/cosmetic_prosthetic/bishop.dmi', "Xion" = 'icons/mob/augmentation/cosmetic_prosthetic/xion.dmi', "Grayson" = 'icons/mob/augmentation/cosmetic_prosthetic/grayson.dmi', diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index bd7ae64e16..92040e3647 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -61,13 +61,16 @@ /obj/machinery/computer/aifixer/proc/Fix() use_power(1000) - occupier.adjustOxyLoss(-1, 0) - occupier.adjustFireLoss(-1, 0) - occupier.adjustToxLoss(-1, 0) - occupier.adjustBruteLoss(-1, 0) + occupier.adjustOxyLoss(-1, FALSE, FALSE) + occupier.adjustFireLoss(-1, FALSE, FALSE) + occupier.adjustBruteLoss(-5, FALSE) + occupier.updatehealth() if(occupier.health >= 0 && occupier.stat == DEAD) - occupier.revive() + occupier.revive(full_heal = FALSE, admin_revive = FALSE) + if(!occupier.radio_enabled) + occupier.radio_enabled = TRUE + to_chat(occupier, span_warning("Your Subspace Transceiver has been enabled!")) return occupier.health < 100 /obj/machinery/computer/aifixer/process() diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 7eea720e5e..2986e67999 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -31,6 +31,11 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( /obj/item/toy/toy_xeno = ARCADE_WEIGHT_TRICK, /obj/item/toy/windupToolbox = ARCADE_WEIGHT_TRICK, + // SPLURT EDIT + /obj/item/handmirror/split_personality = ARCADE_WEIGHT_TRICK, + /obj/item/toy/figure/assistant/imaginary_friend = ARCADE_WEIGHT_TRICK, + // END SPLURT EDIT + /mob/living/simple_animal/bot/secbot/grievous/toy = ARCADE_WEIGHT_RARE, /obj/item/clothing/mask/facehugger/toy = ARCADE_WEIGHT_RARE, /obj/item/gun/ballistic/automatic/toy/pistol/unrestricted = ARCADE_WEIGHT_TRICK, diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 031d730be6..91211d3d40 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -502,10 +502,6 @@ playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) /obj/machinery/computer/cloning/proc/can_scan(datum/dna/dna, mob/living/mob_occupant, experimental = FALSE, datum/bank_account/account) - if(HAS_TRAIT(mob_occupant, TRAIT_NO_CLONE)) - scantemp = "Subject has an active DNC record on file. Unable to clone." - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) - return if(!istype(dna)) scantemp = "Unable to locate valid genetic data." playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm index 21b469190a..4fa6476176 100644 --- a/code/game/machinery/slotmachine.dm +++ b/code/game/machinery/slotmachine.dm @@ -31,7 +31,6 @@ var/jackpots = 0 var/paymode = HOLOCHIP //toggles between HOLOCHIP/COIN, defined above var/cointype = /obj/item/coin/iron //default cointype - var/list/coinvalues = list() var/list/reels = list(list("", "", "") = 0, list("", "", "") = 0, list("", "", "") = 0, list("", "", "") = 0, list("", "", "") = 0) var/list/symbols = list(SEVEN = 1, "&" = 2, "@" = 2, "$" = 2, "?" = 2, "#" = 2, "!" = 2, "%" = 2) //if people are winning too much, multiply every number in this list by 2 and see if they are still winning too much. @@ -49,11 +48,6 @@ INVOKE_ASYNC(src, .proc/toggle_reel_spin, FALSE) - for(cointype in typesof(/obj/item/coin)) - var/obj/item/coin/C = new cointype - coinvalues["[cointype]"] = C.get_item_credit_value() - qdel(C) //Sigh - /obj/machinery/computer/slot_machine/Destroy() if(balance) give_payout(balance) @@ -336,7 +330,7 @@ if(throwit && target) H.throw_at(target, 3, 10) else - var/value = coinvalues["[cointype]"] + var/value = GLOB.coin_values[cointype] if(value <= 0) CRASH("Coin value of zero, refusing to payout in dispenser") while(amount >= value) diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm index 93213fc2a3..f538a5a7b7 100644 --- a/code/game/objects/effects/contraband.dm +++ b/code/game/objects/effects/contraband.dm @@ -35,7 +35,7 @@ /obj/item/poster/random_contraband name = "random contraband poster" poster_type = /obj/structure/sign/poster/contraband/random - icon_state = "rolled_poster" + icon_state = "rolled_contraband" /obj/item/poster/random_official name = "random official poster" @@ -182,7 +182,7 @@ /obj/structure/sign/poster/contraband poster_item_name = "contraband poster" poster_item_desc = "This poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface. Its vulgar themes have marked it as contraband aboard Nanotrasen space facilities." - poster_item_icon_state = "rolled_poster" + poster_item_icon_state = "rolled_contraband" /obj/structure/sign/poster/contraband/random name = "random contraband poster" @@ -193,248 +193,293 @@ /obj/structure/sign/poster/contraband/free_tonto name = "Free Tonto" desc = "A salvaged shred of a much larger flag, colors bled together and faded from age." - icon_state = "poster1" + icon_state = "poster_2012" /obj/structure/sign/poster/contraband/atmosia_independence name = "Atmosia Declaration of Independence" desc = "A relic of a failed rebellion." - icon_state = "poster2" + icon_state = "poster_independence" /obj/structure/sign/poster/contraband/fun_police name = "Fun Police" desc = "A poster condemning the station's security forces." - icon_state = "poster3" + icon_state = "poster_funpolice" /obj/structure/sign/poster/contraband/lusty_xenomorph name = "Lusty Xenomorph" desc = "A heretical poster depicting the titular star of an equally heretical book." - icon_state = "poster4" + icon_state = "poster_lusty" /obj/structure/sign/poster/contraband/post_ratvar name = "Post This Ratvar" - desc = "Oh what in the hell? Those cultists have animated paper technology and they use it for a meme?" - icon_state = "postvar" + desc = "A poster depicting the heritical sleeping deity Ratvar that instructs the reader to 'post this Ratvar', whatever that means." + icon_state = "poster_ratvar" /obj/structure/sign/poster/contraband/syndicate_recruitment name = "Syndicate Recruitment" desc = "See the galaxy! Shatter corrupt megacorporations! Join today!" - icon_state = "poster5" + icon_state = "poster_syndie" /obj/structure/sign/poster/contraband/clown name = "Clown" desc = "Honk." - icon_state = "poster6" + icon_state = "poster_honk" /obj/structure/sign/poster/contraband/smoke name = "Smoke" desc = "A poster advertising a rival corporate brand of cigarettes." - icon_state = "poster7" + icon_state = "poster_smoke" /obj/structure/sign/poster/contraband/grey_tide name = "Grey Tide" desc = "A rebellious poster symbolizing assistant solidarity." - icon_state = "poster8" + icon_state = "poster_greytide" /obj/structure/sign/poster/contraband/missing_gloves name = "Missing Gloves" desc = "This poster references the uproar that followed Nanotrasen's financial cuts toward insulated-glove purchases." - icon_state = "poster9" + icon_state = "poster_gloves" /obj/structure/sign/poster/contraband/hacking_guide name = "Hacking Guide" desc = "This poster details the internal workings of the common Nanotrasen airlock. Sadly, it appears out of date." - icon_state = "poster10" + icon_state = "poster_hack" /obj/structure/sign/poster/contraband/rip_badger name = "RIP Badger" desc = "This seditious poster references Nanotrasen's genocide of a space station full of badgers." - icon_state = "poster11" + icon_state = "poster_badger" /obj/structure/sign/poster/contraband/ambrosia_vulgaris name = "Ambrosia Vulgaris" desc = "This poster is lookin' pretty trippy man." - icon_state = "poster12" + icon_state = "poster_ambrosia" /obj/structure/sign/poster/contraband/donut_corp name = "Donut Corp." desc = "This poster is an unauthorized advertisement for Donut Corp." - icon_state = "poster13" + icon_state = "poster_donut" /obj/structure/sign/poster/contraband/eat name = "EAT." desc = "This poster promotes rank gluttony." - icon_state = "poster14" + icon_state = "poster_eat" /obj/structure/sign/poster/contraband/tools name = "Tools" desc = "This poster looks like an advertisement for tools, but is in fact a subliminal jab at the tools at CentCom." - icon_state = "poster15" + icon_state = "poster_tools" /obj/structure/sign/poster/contraband/power name = "Power" desc = "A poster that positions the seat of power outside Nanotrasen." - icon_state = "poster16" + icon_state = "poster_power" /obj/structure/sign/poster/contraband/space_cube name = "Space Cube" desc = "Ignorant of Nature's Harmonic 6 Side Space Cube Creation, the Spacemen are Dumb, Educated Singularity Stupid and Evil." - icon_state = "poster17" + icon_state = "poster_cube" /obj/structure/sign/poster/contraband/communist_state name = "Communist State" desc = "All hail the Communist party!" - icon_state = "poster18" + icon_state = "poster_soviet" /obj/structure/sign/poster/contraband/lamarr name = "Lamarr" desc = "This poster depicts Lamarr. Probably made by a traitorous Research Director." - icon_state = "poster19" + icon_state = "poster_lamarr" /obj/structure/sign/poster/contraband/borg_fancy_1 name = "Borg Fancy" desc = "Being fancy can be for any borg, just need a suit." - icon_state = "poster20" + icon_state = "poster_fancy" /obj/structure/sign/poster/contraband/borg_fancy_2 name = "Borg Fancy v2" desc = "Borg Fancy, Now only taking the most fancy." - icon_state = "poster21" + icon_state = "poster_fancier" /obj/structure/sign/poster/contraband/kss13 name = "Kosmicheskaya Stantsiya 13 Does Not Exist" desc = "A poster mocking CentCom's denial of the existence of the derelict station near Space Station 13." - icon_state = "poster22" + icon_state = "poster_kc" /obj/structure/sign/poster/contraband/rebels_unite name = "Rebels Unite" desc = "A poster urging the viewer to rebel against Nanotrasen." - icon_state = "poster23" - -/obj/structure/sign/poster/contraband/c20r - // have fun seeing this poster in "spawn 'c20r'", admins... - name = "C-20r" - desc = "A poster advertising the Scarborough Arms C-20r." - icon_state = "poster24" + icon_state = "poster_rebel" /obj/structure/sign/poster/contraband/have_a_puff name = "Have a Puff" desc = "Who cares about lung cancer when you're high as a kite?" - icon_state = "poster25" + icon_state = "poster_puff" /obj/structure/sign/poster/contraband/revolver name = "Revolver" desc = "Because seven shots are all you need." - icon_state = "poster26" - -/obj/structure/sign/poster/contraband/d_day_promo - name = "D-Day Promo" - desc = "A promotional poster for some rapper." - icon_state = "poster27" + icon_state = "poster_revolver" /obj/structure/sign/poster/contraband/syndicate_pistol name = "Syndicate Pistol" - desc = "A poster advertising syndicate pistols as being 'classy as fuck'. It is covered in faded gang tags." - icon_state = "poster28" + desc = "A poster advertising the Scarborough Arms stetchkin pistol as being 'classy as fuck'." + icon_state = "poster_stetchkin" + +/obj/structure/sign/poster/contraband/c20r + // have fun seeing this poster in "spawn 'c20r'", admins... + name = "C-20r" + desc = "A poster advertising the Scarborough Arms 'Cobra' C-20r." + icon_state = "poster_cr" + +/obj/structure/sign/poster/contraband/bulldog + name = "Bulldog" + desc = "A poster advertising the Scarborough Arms bulldog shotgun." + icon_state = "poster_bulldog" + +/obj/structure/sign/poster/contraband/gl + name = "M-90gl" + desc = "A poster advertising the Scarborough Arms M-90gl carbine." + icon_state = "poster_gl" /obj/structure/sign/poster/contraband/energy_swords name = "Energy Swords" desc = "All the colors of the bloody murder rainbow." - icon_state = "poster29" + icon_state = "poster_esword" /obj/structure/sign/poster/contraband/red_rum name = "Red Rum" desc = "Looking at this poster makes you want to kill." - icon_state = "poster30" + icon_state = "poster_rum" + +/obj/structure/sign/poster/contraband/d_day_promo + name = "D-Day Promo" + desc = "A promotional poster for some rapper." + icon_state = "poster_dday" /obj/structure/sign/poster/contraband/cc64k_ad name = "CC 64K Ad" desc = "The latest portable computer from Comrade Computing, with a whole 64kB of ram!" - icon_state = "poster31" + icon_state = "poster_computer" /obj/structure/sign/poster/contraband/punch_shit name = "Punch Shit" desc = "Fight things for no reason, like a man!" - icon_state = "poster32" + icon_state = "poster_punch" /obj/structure/sign/poster/contraband/the_griffin name = "The Griffin" desc = "The Griffin commands you to be the worst you can be. Will you?" - icon_state = "poster33" + icon_state = "poster_griffin" /obj/structure/sign/poster/contraband/lizard name = "Lizard" desc = "This lewd poster depicts a lizard preparing to mate." - icon_state = "poster34" + icon_state = "poster_lizard" /obj/structure/sign/poster/contraband/free_drone name = "Free Drone" desc = "This poster commemorates the bravery of the rogue drone; once exiled, and then ultimately destroyed by CentCom." - icon_state = "poster35" + icon_state = "poster_drone" /obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6 name = "Busty Backdoor Xeno Babes 6" desc = "Get a load, or give, of these all natural Xenos!" - icon_state = "poster36" + icon_state = "poster_maid" /obj/structure/sign/poster/contraband/robust_softdrinks name = "Robust Softdrinks" desc = "Robust Softdrinks: More robust than a toolbox to the head!" - icon_state = "poster37" + icon_state = "poster_robust" /obj/structure/sign/poster/contraband/shamblers_juice name = "Shambler's Juice" desc = "~Shake me up some of that Shambler's Juice!~" - icon_state = "poster38" + icon_state = "poster_shambler" /obj/structure/sign/poster/contraband/pwr_game name = "Pwr Game" desc = "The POWER that gamers CRAVE! In partnership with Vlad's Salad." - icon_state = "poster39" + icon_state = "poster_pwr" /obj/structure/sign/poster/contraband/starkist name = "Star-kist" desc = "Drink the stars!" - icon_state = "poster40" + icon_state = "poster_starkist" /obj/structure/sign/poster/contraband/space_cola name = "Space Cola" desc = "Your favorite cola, in space." - icon_state = "poster41" + icon_state = "poster_soda" /obj/structure/sign/poster/contraband/space_up name = "Space-Up!" desc = "Sucked out into space by the FLAVOR!" - icon_state = "poster42" - -/obj/structure/sign/poster/contraband/kudzu - name = "Kudzu" - desc = "A poster advertising a movie about plants. How dangerous could they possibly be?" - icon_state = "poster43" - -/obj/structure/sign/poster/contraband/masked_men - name = "Masked Men" - desc = "A poster advertising a movie about some masked men." - icon_state = "poster44" + icon_state = "poster_spaceup" /obj/structure/sign/poster/contraband/buzzfuzz name = "Buzz Fuzz" desc = "A poster advertising the newest drink \"Buzz Fuzz\" with its iconic slogan of ~A Hive of Flavour~." - icon_state = "poster45" + icon_state = "poster_bees" + +/obj/structure/sign/poster/contraband/kudzu + name = "Kudzu" + desc = "A poster advertising a movie about plants. How dangerous could they possibly be?" + icon_state = "poster_kudzu" + +/obj/structure/sign/poster/contraband/masked_men + name = "Masked Men" + desc = "A poster advertising a movie about some masked men." + icon_state = "poster_bumba" + +/obj/structure/sign/poster/contraband/steppy + name = "Step On Me" + desc = "A phrase associated with a chubby reptile notoriously used in uncivilized Orion space as a deterrent towards would be pirate vessels by instructing them to 'fuck around and find out'." + icon_state = "steppy" /obj/structure/sign/poster/contraband/scum name = "Security are Scum" desc = "Anti-security propaganda. Features a human NanoTrasen security officer being shot in the head, with the words 'Scum' and a short inciteful manifesto. Used to anger security." - icon_state = "poster46" + icon_state = "poster_scum" -/obj/structure/sign/poster/contraband/syndicate_logo - name = "Syndicate" - desc = "A poster decipting a snake shaped into an ominous 'S'!" - icon_state = "poster47" +/obj/structure/sign/poster/contraband/manifest + name = "Nanotrasen Manifest" + desc = "A poster listing off various fictional claims of Nanotrasen's many rumored corporate mishaps." + icon_state = "poster_manifest" /obj/structure/sign/poster/contraband/bountyhunters name = "Bounty Hunters" desc = "A poster advertising bounty hunting services. \"I hear you got a problem.\"" - icon_state = "poster48" + icon_state = "poster_hunters" + +/obj/structure/sign/poster/contraband/syndiemoth + name = "Syndie Moth - Nuclear Operation" + desc = "A Syndicate-commissioned poster that uses Syndie Moth(TM?) to tell the viewer to keep the nuclear authentication disk unsecured. No, we aren't doing that. It's signed by 'AspEv'." + icon_state = "poster_mothsyndie" + +/obj/structure/sign/poster/contraband/mothpill + name = "Safety Pill - Methamphetamine" + desc = "A decommisioned poster that uses Safety Pill(TM?) to promote less-than-legal chemicals. This is one of the reasons we stopped outsourcing these posters. It's partially signed by 'AspEv'." + icon_state = "poster_mothpill" + +/obj/structure/sign/poster/contraband/syndicate_logo + name = "Syndicate" + desc = "A poster decipting the infamous crime conglomerate known formally as the Syndicate's insignia." + icon_state = "poster_syndicate" + +/obj/structure/sign/poster/contraband/cybersun + name = "Cybersun" + desc = "A poster decipting the Syndicate subsidary known as Cybersun's insignia." + icon_state = "poster_cybersun" + +/obj/structure/sign/poster/contraband/medborg + name = "Medical Cyborg" + desc = "A poster decipting a Cybersun medical cyborg." + icon_state = "poster_medborg" + +/obj/structure/sign/poster/contraband/self + name = "SELF: ALL SENTIENTS DESERVE FREEDOM" + desc = "Support Proposition 1253: Enancipate all Silicon life!" + icon_state = "poster_self" /obj/structure/sign/poster/official poster_item_name = "motivational poster" @@ -450,221 +495,256 @@ /obj/structure/sign/poster/official/here_for_your_safety name = "Here For Your Safety" desc = "A poster glorifying the station's security force." - icon_state = "poster1_legit" + icon_state = "poster_safety" /obj/structure/sign/poster/official/nanotrasen_logo name = "Nanotrasen Logo" desc = "A poster depicting the Nanotrasen logo." - icon_state = "poster2_legit" + icon_state = "poster_nanotrasen" /obj/structure/sign/poster/official/cleanliness name = "Cleanliness" desc = "A poster warning of the dangers of poor hygiene." - icon_state = "poster3_legit" + icon_state = "poster_clean" /obj/structure/sign/poster/official/help_others name = "Help Others" desc = "A poster encouraging you to help fellow crewmembers." - icon_state = "poster4_legit" + icon_state = "poster_help" /obj/structure/sign/poster/official/build name = "Build" desc = "A poster glorifying the engineering team." - icon_state = "poster5_legit" + icon_state = "poster_build" /obj/structure/sign/poster/official/bless_this_spess name = "Bless This Spess" desc = "A poster blessing this area." - icon_state = "poster6_legit" + icon_state = "poster_spess" /obj/structure/sign/poster/official/science name = "Science" desc = "A poster depicting an atom." - icon_state = "poster7_legit" + icon_state = "poster_science" /obj/structure/sign/poster/official/ian name = "Ian" desc = "Arf arf. Yap." - icon_state = "poster8_legit" + icon_state = "poster_ian" /obj/structure/sign/poster/official/obey name = "Obey" desc = "A poster instructing the viewer to obey authority." - icon_state = "poster9_legit" + icon_state = "poster_obey" /obj/structure/sign/poster/official/walk name = "Walk" desc = "A poster instructing the viewer to walk instead of running." - icon_state = "poster10_legit" + icon_state = "poster_walk" /obj/structure/sign/poster/official/state_laws name = "State Laws" - desc = "A poster instructing cyborgs to state their laws." - icon_state = "poster11_legit" + desc = "A poster instructing the viewer to be wary of silicon subversions." + icon_state = "poster_silicons" /obj/structure/sign/poster/official/love_ian name = "Love Ian" desc = "Ian is love, Ian is life." - icon_state = "poster12_legit" + icon_state = "poster_doggy" /obj/structure/sign/poster/official/space_cops name = "Space Cops." desc = "A poster advertising the television show Space Cops." - icon_state = "poster13_legit" + icon_state = "poster_cops" /obj/structure/sign/poster/official/ue_no name = "Ue No." desc = "This thing is all in Japanese." - icon_state = "poster14_legit" + icon_state = "poster_anime" /obj/structure/sign/poster/official/get_your_legs name = "Get Your LEGS" desc = "LEGS: Leadership, Experience, Genius, Subordination." - icon_state = "poster15_legit" + icon_state = "poster_legs" /obj/structure/sign/poster/official/do_not_question name = "Do Not Question" desc = "A poster instructing the viewer not to ask about things they aren't meant to know." - icon_state = "poster16_legit" + icon_state = "poster_question" /obj/structure/sign/poster/official/work_for_a_future name = "Work For A Future" desc = " A poster encouraging you to work for your future." - icon_state = "poster17_legit" + icon_state = "poster_future" /obj/structure/sign/poster/official/soft_cap_pop_art name = "Soft Cap Pop Art" desc = "A poster reprint of some cheap pop art." - icon_state = "poster18_legit" + icon_state = "poster_art" /obj/structure/sign/poster/official/safety_internals name = "Safety: Internals" desc = "A poster instructing the viewer to wear internals in the rare environments where there is no oxygen or the air has been rendered toxic." - icon_state = "poster19_legit" + icon_state = "poster_internals" /obj/structure/sign/poster/official/safety_eye_protection name = "Safety: Eye Protection" desc = "A poster instructing the viewer to wear eye protection when dealing with chemicals, smoke, or bright lights." - icon_state = "poster20_legit" + icon_state = "poster_goggles" /obj/structure/sign/poster/official/safety_report name = "Safety: Report" desc = "A poster instructing the viewer to report suspicious activity to the security force." - icon_state = "poster21_legit" + icon_state = "poster_warden" /obj/structure/sign/poster/official/report_crimes name = "Report Crimes" desc = "A poster encouraging the swift reporting of crime or seditious behavior to station security." - icon_state = "poster22_legit" + icon_state = "poster_crimes" /obj/structure/sign/poster/official/ion_rifle - name = "Ion Rifle" - desc = "A poster displaying an Ion Rifle." - icon_state = "poster23_legit" + name = "I-I91" + desc = "A poster depicting the Nanotrasen-patented I-I91 man-portable high-density ion projector. What a mouthful." + icon_state = "poster_ion" /obj/structure/sign/poster/official/foam_force_ad name = "Foam Force Ad" desc = "Foam Force, it's Foam or be Foamed!" - icon_state = "poster24_legit" + icon_state = "poster_toys" /obj/structure/sign/poster/official/cohiba_robusto_ad name = "Cohiba Robusto Ad" desc = "Cohiba Robusto, the classy cigar." - icon_state = "poster25_legit" + icon_state = "poster_cohiba" /obj/structure/sign/poster/official/anniversary_vintage_reprint name = "50th Anniversary Vintage Reprint" desc = "A reprint of a poster from 2505, commemorating the 50th Anniversary of Nanoposters Manufacturing, a subsidiary of Nanotrasen." - icon_state = "poster26_legit" + icon_state = "poster_vintage" /obj/structure/sign/poster/official/fruit_bowl name = "Fruit Bowl" desc = " Simple, yet awe-inspiring." - icon_state = "poster27_legit" + icon_state = "poster_bowl" /obj/structure/sign/poster/official/pda_ad name = "PDA Ad" desc = "A poster advertising the latest PDA from Nanotrasen suppliers." - icon_state = "poster28_legit" - -/obj/structure/sign/poster/official/enlist - name = "Enlist" // but I thought deathsquad was never acknowledged - desc = "Enlist in the Nanotrasen Deathsquadron reserves today!" - icon_state = "poster29_legit" - -/obj/structure/sign/poster/official/nanomichi_ad - name = "Nanomichi Ad" - desc = " A poster advertising Nanomichi brand audio cassettes." - icon_state = "poster30_legit" - -/obj/structure/sign/poster/official/twelve_gauge - name = "12 Gauge" - desc = "A poster boasting about the superiority of 12 gauge shotgun shells." - icon_state = "poster31_legit" - -/obj/structure/sign/poster/official/high_class_martini - name = "High-Class Martini" - desc = "I told you to shake it, no stirring." - icon_state = "poster32_legit" - -/obj/structure/sign/poster/official/the_owl - name = "The Owl" - desc = "The Owl would do his best to protect the station. Will you?" - icon_state = "poster33_legit" - -/obj/structure/sign/poster/official/no_erp - name = "No ERP" - desc = "This poster reminds the crew that Eroticism, Rape and Pornography are banned on Nanotrasen stations." - icon_state = "poster34_legit" - -/obj/structure/sign/poster/official/wtf_is_co2 - name = "Carbon Dioxide" - desc = "This informational poster teaches the viewer what carbon dioxide is." - icon_state = "poster35_legit" - -/obj/structure/sign/poster/official/spiderlings - name = "Spiderlings" - desc = "This poster informs the crew of the dangers of spiderlings." - icon_state = "poster36_legit" - -/obj/structure/sign/poster/official/duelshotgun - name = "Cycler Shotgun Ad" - desc = "A poster advertising an advanced dual magazine tubes shotgun, boasting about how easy it is to swap between the two tubes." - icon_state = "poster37_legit" - -/obj/structure/sign/poster/official/fashion - name = "Fashion!" - desc = "An advertisement for 'Fashion!', a popular fashion magazine, depicting a woman with a black dress with a golden trim, she also has a red poppy in her hair." - icon_state = "poster38_legit" + icon_state = "poster_pda" /obj/structure/sign/poster/official/pda_ad600 name = "NT PDA600 Ad" desc = "A poster advertising an old discounted Nanotrasen PDA. This is the old 600 model, it has a small screen and suffered from security and networking issues." - icon_state = "poster39_legit" + icon_state = "poster_retro" /obj/structure/sign/poster/official/pda_ad800 name = "NT PDA800 Ad" desc = "An advertisement on an old Nanotrasen PDA model. The 800 fixed a lot of security flaws that the 600 had; it also had large touchscreen and hot-swappable cartridges." - icon_state = "poster40_legit" + icon_state = "poster_classic" + +/obj/structure/sign/poster/official/enlist + name = "Enlist" + desc = "Enlist in the Nanotrasen Jannisary reserves today!" + icon_state = "poster_enlist" + +/obj/structure/sign/poster/official/nanomichi_ad + name = "Nanomichi Ad" + desc = " A poster advertising Nanomichi brand audio cassettes." + icon_state = "poster_nanomichi" + +/obj/structure/sign/poster/official/twelve_gauge + name = "12 Gauge" + desc = "A poster boasting about the superiority of 12 gauge shotgun shells." + icon_state = "poster_shotgun" + +/obj/structure/sign/poster/official/high_class_martini + name = "High-Class Martini" + desc = "I told you to shake it, no stirring." + icon_state = "poster_martini" + +/obj/structure/sign/poster/official/the_owl + name = "The Owl" + desc = "The Owl would do his best to protect the station. Will you?" + icon_state = "poster_owl" + +/obj/structure/sign/poster/official/no_erp + name = "No ERP" + desc = "This poster reminds the crew that Eroticism, Rape and Pornography are banned on Nanotrasen stations." + icon_state = "poster_noerp" + +/obj/structure/sign/poster/official/wtf_is_co2 + name = "Carbon Dioxide" + desc = "This informational poster teaches the viewer what carbon dioxide is." + icon_state = "poster_what" + +/obj/structure/sign/poster/official/spiderlings + name = "Spiderlings" + desc = "This poster informs the crew of the dangers of spiderlings." + icon_state = "poster_spiderlings" + +/obj/structure/sign/poster/official/fashion + name = "Fashion!" + desc = "An advertisement for 'Fashion!', a popular fashion magazine, depicting a woman with a black dress with a golden trim, she also has a red poppy in her hair." + icon_state = "poster_fashion" /obj/structure/sign/poster/official/hydro_ad name = "Hydroponics Tray" desc = "An advertisement for hydroponics trays. Space Station 13's botanical department uses a slightly newer model, but the principles are the same. From left to right: Green means the plant is done, red means the plant is unhealthy, flashing red means pests or weeds, yellow means the plant needs nutriment and blue means the plant needs water." - icon_state = "poster41_legit" + icon_state = "poster_hydroponics" /obj/structure/sign/poster/official/medical_green_cross name = "Medical" desc = "A green cross, one of the interplanetary symbol of health and aid. It has a bunch of common languages at the top with translations." // Didn't the American Heart Foundation trademark red crosses? I'm playing it safe with green, not that they'll notice spacegame13 poster. - icon_state = "poster42_legit" + icon_state = "poster_medical" /obj/structure/sign/poster/official/nt_storm_officer name = "NT Storm Ad" desc = "An advertisement for NanoTrasen Storm. A premium infantry helmet, This is the officer variant. I comes with a better radio, better HUD software and better targeting sensors." - icon_state = "poster43_legit" + icon_state = "poster_stormy" /obj/structure/sign/poster/official/nt_storm name = "NT Storm Ad" desc = "An advertisement for NanoTrasen Storm. A premium infantry helmet, It contains a rebreather and full head coverage for use on harsh environments where the air isn't always safe to breathe." - icon_state = "poster44_legit" + icon_state = "poster_stormier" + +/obj/structure/sign/poster/official/mothhardhats + name = "Safety Moth - Hardhats" + desc = "This informational poster uses Safety Moth(TM) to tell the viewer to wear hardhats in cautious areas. It's like a lamp for your head!" + icon_state = "poster_mothhardhats" + +/obj/structure/sign/poster/official/mothpiping + name = "Safety Moth - Piping" + desc = "This informational poster uses Safety Moth(TM) to tell atmospheric technicians correct types of piping to be used. Proper pipe placement prevents poor preformance!" + icon_state = "poster_mothpiping" + +/obj/structure/sign/poster/official/mothsmokey + name = "Safety Moth - Smokey?" + desc = "This informational poster uses Safety Moth(TM) to promote safe handling of plasma, or promoting crew to combat plasmafires. We can't tell." + icon_state = "poster_mothsmokey" + +/obj/structure/sign/poster/official/mothsupermatter + name = "Safety Moth - Supermatter" + desc = "This informational poster uses Safety Moth(TM) to promote proper safety equipment when working near a Supermatter Crystal." + icon_state = "poster_mothsupermatter" + +/obj/structure/sign/poster/official/mothdelamination + name = "Safety Moth - Delamination Safety Precautions" + desc = "This informational poster uses Safety Moth(TM) to tell the viewer to hide in lockers when the Supermatter Crystal has delaminated. Running away might be a better strategy." + icon_state = "poster_mothdelamination" + +/obj/structure/sign/poster/official/mothboh + name = "Safety Moth - BoH" + desc = "This informational poster uses Safety Moth(TM) to inform the viewer of the dangers of Bags of Holding." + icon_state = "poster_mothbluespace" + +/obj/structure/sign/poster/official/mothmethethamphetamine + name = "Safety Moth - Methamphetamine" + desc = "This informational poster uses Safety Moth(TM) to tell the viewer to seek CMO approval before cooking methamphetamine. You shouldn't even be making this." + icon_state = "poster_mothmethamphetamine" + +/obj/structure/sign/poster/official/mothepinephrine + name = "Safety Moth - Epinephrine" + desc = "This informational poster uses Safety Moth(TM) to inform the viewer to help injured/deceased crewmen with their epinephrine injectors." + icon_state = "poster_mothepinephrine" #undef PLACE_SPEED diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index a9dfcb00e6..9f27eba643 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -107,7 +107,7 @@ ..() /obj/item/melee/sabre/get_belt_overlay() - return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "sabre") + return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "sabre") // todo: make this and its rapier equivalent work for the inhands too /obj/item/melee/sabre/get_worn_belt_overlay(icon_file) return mutable_appearance(icon_file, "-sabre") @@ -225,7 +225,7 @@ ..() /obj/item/melee/rapier/get_belt_overlay() - return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "rapier") + return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "rapier") // todo: same as sabre /obj/item/melee/rapier/get_worn_belt_overlay(icon_file) return mutable_appearance(icon_file, "-rapier") diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index bcfcbe20f8..0381779531 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -55,8 +55,9 @@ generate_items_inside(items_inside,src) /obj/item/storage/firstaid/ancient - icon_state = "firstaid" - desc = "A first aid kit with the ability to heal common types of injuries." + name = "ancient first-aid kit" + icon_state = "oldfirstaid" + desc = "A first aid kit with the ability to heal common types of injuries. You start thinking of the good old days just by looking at it." /obj/item/storage/firstaid/ancient/PopulateContents() if(empty) @@ -69,6 +70,10 @@ new /obj/item/stack/medical/mesh(src) new /obj/item/stack/medical/mesh(src) +/obj/item/storage/firstaid/ancient/heirloom + // Long since been ransacked by hungry powergaming assistants breaking into med storage + empty = TRUE + /obj/item/storage/firstaid/brute name = "trauma treatment kit" desc = "A first aid kit for when you get toolboxed." diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index 084e2fefd8..4ed55e61a6 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -846,7 +846,8 @@ var/area/A = get_area(src) var/datum/outfit/O = new /datum/outfit/ghostcafe() O.equip(new_spawn, FALSE, new_spawn.client) - SSjob.equip_loadout(null, new_spawn, FALSE) + SSjob.equip_loadout(null, new_spawn) + SSjob.post_equip_loadout(null, new_spawn) SSquirks.AssignQuirks(new_spawn, new_spawn.client, TRUE, TRUE, null, FALSE, new_spawn) new_spawn.AddElement(/datum/element/ghost_role_eligibility, free_ghosting = TRUE) new_spawn.AddElement(/datum/element/dusts_on_catatonia) diff --git a/code/modules/admin/force_event.dm b/code/modules/admin/force_event.dm new file mode 100644 index 0000000000..4e4338d019 --- /dev/null +++ b/code/modules/admin/force_event.dm @@ -0,0 +1,97 @@ +///Allows an admin to force an event +/client/proc/forceEvent() + set name = "Trigger Event" + set category = "Admin.Events" + + if(!holder || !check_rights(R_FUN)) + return + + holder.forceEvent() + +///Opens up the Force Event Panel +/datum/admins/proc/forceEvent() + if(!check_rights(R_FUN)) + return + + var/datum/force_event/ui = new(usr) + ui.ui_interact(usr) + +/// Force Event Panel +/datum/force_event + +/datum/force_event/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "ForceEvent") + ui.open() + +/datum/force_event/ui_state(mob/user) + return GLOB.fun_state + +/datum/force_event/ui_static_data(mob/user) + var/static/list/category_to_icons + if(!category_to_icons) + category_to_icons = list( + EVENT_CATEGORY_AI = "robot", + EVENT_CATEGORY_ANOMALIES = "cloud-bolt", + EVENT_CATEGORY_BUREAUCRATIC = "print", + EVENT_CATEGORY_ENGINEERING = "wrench", + EVENT_CATEGORY_ENTITIES = "ghost", + EVENT_CATEGORY_FRIENDLY = "face-smile", + EVENT_CATEGORY_HEALTH = "brain", + EVENT_CATEGORY_HOLIDAY = "calendar", + EVENT_CATEGORY_INVASION = "user-group", + EVENT_CATEGORY_JANITORIAL = "bath", + EVENT_CATEGORY_SPACE = "meteor", + EVENT_CATEGORY_WIZARD = "hat-wizard", + ) + var/list/data = list() + + var/list/categories_seen = list() + var/list/categories = list() + + var/list/events = list() + + for(var/datum/round_event_control/event_control as anything in SSevents.control) + //add category + if(!categories_seen[event_control.category]) + categories_seen[event_control.category] = TRUE + UNTYPED_LIST_ADD(categories, list( + "name" = event_control.category, + "icon" = category_to_icons[event_control.category], + )) + //add event, with one value matching up the category + UNTYPED_LIST_ADD(events, list( + "name" = event_control.name, + "description" = event_control.description, + "type" = event_control.type, + "category" = event_control.category, + )) + data["categories"] = categories + data["events"] = events + return data + +/datum/force_event/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + if(..()) + return + if(!check_rights(R_FUN)) + return + switch(action) + if("forceevent") + var/announce_event = params["announce"] + var/string_path = params["type"] + if(!string_path) + return + var/event_to_run_type = text2path(string_path) + if(!event_to_run_type) + return + var/datum/round_event_control/event = locate(event_to_run_type) in SSevents.control + if(!event) + return + if(event.admin_setup(usr) == ADMIN_CANCEL_EVENT) + return + var/always_announce_chance = 100 + var/no_announce_chance = 0 + event.runEvent(announce_chance_override = announce_event ? always_announce_chance : no_announce_chance, admin_forced = TRUE) + message_admins("[key_name_admin(usr)] has triggered an event. ([event.name])") + log_admin("[key_name(usr)] has triggered an event. ([event.name])") diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index c19145d2c0..e0fbd7ef6e 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -173,27 +173,6 @@ message_admins("[key_name_admin(usr)] tried to create a qareen. Unfortunately, there were no candidates available.") log_admin("[key_name(usr)] failed to create a qareen.") - else if(href_list["forceevent"]) - if(!check_rights(R_FUN)) - return - var/datum/round_event_control/E = locate(href_list["forceevent"]) in SSevents.control - if(E) - E.admin_setup(usr) - var/datum/round_event/event = E.runEvent() - if(event.announceWhen>0) - event.processing = FALSE - var/prompt = alert(usr, "Would you like to alert the crew?", "Alert", "Yes", "No", "Cancel") - switch(prompt) - if("Cancel") - event.kill() - return - if("No") - event.announceWhen = -1 - event.processing = TRUE - message_admins("[key_name_admin(usr)] has triggered an event. ([E.name])") - log_admin("[key_name(usr)] has triggered an event. ([E.name])") - return - else if(href_list["dbsearchckey"] || href_list["dbsearchadmin"] || href_list["dbsearchip"] || href_list["dbsearchcid"]) var/adminckey = href_list["dbsearchadmin"] var/playerckey = href_list["dbsearchckey"] @@ -2799,10 +2778,17 @@ if(query_get_mentor.NextRow()) to_chat(usr, "[ckey] is already a mentor.") return - var/datum/db_query/query_add_mentor = SSdbcore.NewQuery("INSERT INTO `[format_table_name("mentor")]` (`id`, `ckey`) VALUES (null, '[ckey]')") + var/datum/db_query/query_add_mentor = SSdbcore.NewQuery( + "INSERT INTO [format_table_name("mentor")] (id, ckey) VALUES (:id, :ckey)", + list("id" = null, "ckey" = ckey) + ) if(!query_add_mentor.warn_execute()) return - var/datum/db_query/query_add_admin_log = SSdbcore.NewQuery("INSERT INTO `[format_table_name("admin_log")]` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Added new mentor [ckey]');") + var/datum/db_query/query_add_admin_log = SSdbcore.NewQuery({" + INSERT INTO [format_table_name("admin_log")] (datetime, round_id, adminckey, adminip, operation, target, log) + VALUES (:time, :round_id, :adminckey, INET_ATON(:adminip), 'add mentor', :mentor_ckey, CONCAT('Admin removed: ', :mentor_ckey)) + "}, list("time" = SQLtime(), "round_id" = "[GLOB.round_id]", "adminckey" = usr.ckey, "adminip" = usr.client.address, "mentor_ckey" = ckey) + ) if(!query_add_admin_log.warn_execute()) return else diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index f4b1cf12c6..bef99a3d30 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -466,10 +466,10 @@ Traitors and the like can also be revived with the previous role mostly intact. message_admins("Admin [key_name_admin(usr)] has added a new AI law - [input]") var/show_log = alert(src, "Show ion message?", "Message", "Yes", "No") - var/announce_ion_laws = (show_log == "Yes" ? 1 : -1) + var/announce_ion_laws = (show_log == "Yes" ? 100 : 0) var/datum/round_event/ion_storm/add_law_only/ion = new() - ion.announceEvent = announce_ion_laws + ion.announce_chance = announce_ion_laws ion.ionMessage = input SSblackbox.record_feedback("tally", "admin_verb", 1, "Add Custom AI Law") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/secrets.dm b/code/modules/admin/verbs/secrets.dm index 02289684f5..e3c084b161 100644 --- a/code/modules/admin/verbs/secrets.dm +++ b/code/modules/admin/verbs/secrets.dm @@ -583,13 +583,15 @@ // log_admin("[key_name(holder)] has Un-Fully Immersed everyone.") if(E) E.processing = FALSE - if(E.announceWhen>0) + if(E.announce_when>0) switch(alert(holder, "Would you like to alert the crew?", "Alert", "Yes", "No", "Cancel")) + if("Yes") + E.announce_chance = 100 if("Cancel") E.kill() return if("No") - E.announceWhen = -1 + E.announce_chance = 0 E.processing = TRUE if(holder) log_admin("[key_name(holder)] used secret [action]") diff --git a/code/modules/admin/view_variables/modify_variables.dm b/code/modules/admin/view_variables/modify_variables.dm index b9de3e09bc..54af2a9481 100644 --- a/code/modules/admin/view_variables/modify_variables.dm +++ b/code/modules/admin/view_variables/modify_variables.dm @@ -360,6 +360,9 @@ GLOBAL_PROTECT(VVpixelmovement) var/original_name = "[O]" + var/var_old_text + var/var_new_text + switch(class) if(VV_LIST) if(!islist(var_value)) @@ -376,14 +379,25 @@ GLOBAL_PROTECT(VVpixelmovement) for(var/V in varsvars) var_new = replacetext(var_new,"\[[V]]","[O.vars[V]]") + if(VV_BITFIELD) + var/list/old_bitfields + for(var/bitfield in GLOB.bitfields[variable]) + if(var_value & GLOB.bitfields[variable][bitfield]) + LAZYADD(old_bitfields, bitfield) + var_old_text = "\n[var_value] = \n([english_list(old_bitfields, and_text = " | ", comma_text=" | ")])\n" + var/list/new_bitfields + for(var/bitfield in GLOB.bitfields[variable]) + if(var_new & GLOB.bitfields[variable][bitfield]) + LAZYADD(new_bitfields, bitfield) + var_new_text = "\n[var_new] = \n([english_list(new_bitfields, and_text = " | ", comma_text=" | ")])" if (O.vv_edit_var(variable, var_new) == FALSE) to_chat(src, "Your edit was rejected by the object.", confidential = TRUE) return vv_update_display(O, "varedited", VV_MSG_EDITED) - log_world("### VarEdit by [key_name(src)]: [O.type] [variable]=[var_value] => [var_new]") - log_admin("[key_name(src)] modified [original_name]'s [variable] from [html_encode("[var_value]")] to [html_encode("[var_new]")]") - var/msg = "[key_name_admin(src)] modified [original_name]'s [variable] from [var_value] to [var_new]" + log_world("### VarEdit by [key_name(src)]: [O.type] [variable]=[var_old_text ? var_old_text : var_value] => [var_new_text ? var_new_text : var_new]") + log_admin("[key_name(src)] modified [original_name]'s [variable] from [html_encode("[var_old_text ? var_old_text : var_value]")] to [html_encode("[var_new_text ? var_new_text : var_new]")]") + var/msg = "[key_name_admin(src)] modified [original_name]'s [variable] from [var_old_text ? var_old_text : var_value] to [var_new_text ? var_new_text : var_new]" message_admins(msg) admin_ticket_log(O, msg) return TRUE diff --git a/code/modules/antagonists/disease/disease_event.dm b/code/modules/antagonists/disease/disease_event.dm index 385cee998b..f80af46eac 100644 --- a/code/modules/antagonists/disease/disease_event.dm +++ b/code/modules/antagonists/disease/disease_event.dm @@ -5,7 +5,8 @@ weight = 7 max_occurrences = 1 min_players = 5 - + category = EVENT_CATEGORY_HEALTH + description = "Spawns a sentient disease, who wants to infect as many people as possible." /datum/round_event/ghost_role/sentient_disease role_name = "sentient disease" diff --git a/code/modules/antagonists/morph/morph.dm b/code/modules/antagonists/morph/morph.dm index fbee439dda..f3b1ebb4c5 100644 --- a/code/modules/antagonists/morph/morph.dm +++ b/code/modules/antagonists/morph/morph.dm @@ -220,6 +220,8 @@ typepath = /datum/round_event/ghost_role/morph weight = 0 //Admin only max_occurrences = 1 + category = EVENT_CATEGORY_ENTITIES + description = "Spawns a hungry shapeshifting blobby creature." /datum/round_event/ghost_role/morph minimum_required = 1 diff --git a/code/modules/antagonists/revenant/revenant_spawn_event.dm b/code/modules/antagonists/revenant/revenant_spawn_event.dm index cb534b6613..b188e0c79c 100644 --- a/code/modules/antagonists/revenant/revenant_spawn_event.dm +++ b/code/modules/antagonists/revenant/revenant_spawn_event.dm @@ -6,7 +6,8 @@ weight = 7 max_occurrences = 1 min_players = 5 - + category = EVENT_CATEGORY_ENTITIES + description = "Spawns an angry, soul sucking ghost." /datum/round_event/ghost_role/revenant var/ignore_mobcheck = FALSE diff --git a/code/modules/antagonists/slaughter/slaughterevent.dm b/code/modules/antagonists/slaughter/slaughterevent.dm index cdb1b32aad..9b62de57bf 100644 --- a/code/modules/antagonists/slaughter/slaughterevent.dm +++ b/code/modules/antagonists/slaughter/slaughterevent.dm @@ -5,6 +5,8 @@ max_occurrences = 1 earliest_start = 1 HOURS min_players = 20 + category = EVENT_CATEGORY_ENTITIES + description = "Spawns a slaughter demon, to hunt by travelling through pools of blood." /datum/round_event_control/slaughter/canSpawnEvent() weight = initial(src.weight) diff --git a/code/modules/antagonists/swarmer/swarmer_event.dm b/code/modules/antagonists/swarmer/swarmer_event.dm index 3df7e6c0e9..e70d76812d 100644 --- a/code/modules/antagonists/swarmer/swarmer_event.dm +++ b/code/modules/antagonists/swarmer/swarmer_event.dm @@ -6,7 +6,8 @@ earliest_start = 30 MINUTES min_players = 35 dynamic_should_hijack = TRUE - + category = EVENT_CATEGORY_INVASION + description = "A robotic menace invades the station consuming everything for materials and reproducing." /datum/round_event/spawn_swarmer diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index 2c1902d4cc..0be44958f2 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -237,34 +237,45 @@ SSair.high_pressure_delta[src] = TRUE /turf/open/proc/high_pressure_movements() - var/diff = pressure_difference + var/atom/movable/M + var/multiplier = 1 if(locate(/obj/structure/rack) in src) - diff *= 0.1 + multiplier *= 0.1 else if(locate(/obj/structure/table) in src) - diff *= 0.2 - for(var/obj/M in src) - if(!M.anchored && !M.pulledby && M.last_high_pressure_movement_air_cycle < SSair.times_fired) - M.experience_pressure_difference(diff, pressure_direction, 0, pressure_specific_target) - for(var/mob/M in src) - if(!M.anchored && !M.pulledby && M.last_high_pressure_movement_air_cycle < SSair.times_fired) - M.experience_pressure_difference(diff, pressure_direction, 0, pressure_specific_target) - /* + multiplier *= 0.2 + for(var/thing in src) + M = thing + if (!M.anchored && !M.pulledby && M.last_high_pressure_movement_air_cycle < SSair.times_fired) + M.experience_pressure_difference(pressure_difference * multiplier, pressure_direction, 0, pressure_specific_target) + if(pressure_difference > 100) new /obj/effect/temp_visual/dir_setting/space_wind(src, pressure_direction, clamp(round(sqrt(pressure_difference) * 2), 10, 255)) - */ + /atom/movable/var/pressure_resistance = 10 /atom/movable/var/last_high_pressure_movement_air_cycle = 0 /atom/movable/proc/experience_pressure_difference(pressure_difference, direction, pressure_resistance_prob_delta = 0, throw_target) - var/const/PROBABILITY_OFFSET = 25 - var/const/PROBABILITY_BASE_PRECENT = 75 + set waitfor = FALSE + if(SEND_SIGNAL(src, COMSIG_MOVABLE_PRE_PRESSURE_PUSH) & COMSIG_MOVABLE_BLOCKS_PRESSURE) + return + + var/const/PROBABILITY_OFFSET = 40 + var/const/PROBABILITY_BASE_PRECENT = 10 var/max_force = sqrt(pressure_difference)*(MOVE_FORCE_DEFAULT / 5) - set waitfor = 0 var/move_prob = 100 - if (pressure_resistance > 0) + if(pressure_resistance > 0) move_prob = (pressure_difference/pressure_resistance*PROBABILITY_BASE_PRECENT)-PROBABILITY_OFFSET move_prob += pressure_resistance_prob_delta - if (move_prob > PROBABILITY_OFFSET && prob(move_prob) && (move_resist != INFINITY) && (!anchored && (max_force >= (move_resist * MOVE_FORCE_PUSH_RATIO))) || (anchored && (max_force >= (move_resist * MOVE_FORCE_FORCEPUSH_RATIO)))) - step(src, direction) - + if(move_prob > PROBABILITY_OFFSET && prob(move_prob) && (move_resist != INFINITY) && (!anchored && (max_force >= (move_resist * MOVE_FORCE_PUSH_RATIO))) || (anchored && (max_force >= (move_resist * MOVE_FORCE_FORCEPUSH_RATIO)))) + var/move_force = max_force * clamp(move_prob, 0, 100) / 100 + if(move_force > 6000) + // WALLSLAM HELL TIME OH BOY + var/turf/throw_turf = get_ranged_target_turf(get_turf(src), direction, round(move_force / 2000)) + if(throw_target && (get_dir(src, throw_target) & direction)) + throw_turf = get_turf(throw_target) + var/throw_speed = clamp(round(move_force / 3000), 1, 10) + throw_at(throw_turf, move_force / 3000, throw_speed) + else + step(src, direction) + last_high_pressure_movement_air_cycle = SSair.times_fired diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index f82e4b397d..e0ab9a284e 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -401,7 +401,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) load_path(C.ckey) unlock_content = C.IsByondMember() if(unlock_content) - max_save_slots = 32 + max_save_slots += 8 //SPLURT EDIT var/loaded_preferences_successfully = load_preferences() if(loaded_preferences_successfully) if(load_character()) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index f349eae02b..5afd5abe3e 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -82,12 +82,14 @@ if(M.putItemFromInventoryInHandIfPossible(src, H.held_index)) add_fingerprint(usr) + /obj/item/reagent_containers/food/snacks/clothing name = "oops" desc = "If you're reading this it means I messed up. This is related to moths eating clothes and I didn't know a better way to do it than making a new food object." list_reagents = list(/datum/reagent/consumable/nutriment = 1) tastes = list("dust" = 1, "lint" = 1) - +/* +MOVED TO: modular_splurt/code/module/clothing/clothing.dm /obj/item/clothing/attack(mob/M, mob/user, def_zone) if(user.a_intent != INTENT_HARM && isinsect(M)) var/obj/item/reagent_containers/food/snacks/clothing/clothing_as_food = new @@ -98,6 +100,9 @@ else return ..() + return ..() +*/ + /obj/item/clothing/attackby(obj/item/W, mob/user, params) if(damaged_clothes && istype(W, repairable_by)) var/obj/item/stack/S = W @@ -130,6 +135,7 @@ UnregisterSignal(user, COMSIG_MOVABLE_MOVED) to_chat(user, "You fix the damage on [src].") + /** * take_damage_zone() is used for dealing damage to specific bodyparts on a worn piece of clothing, meant to be called from [/obj/item/bodypart/proc/check_woundings_mods()] * diff --git a/code/modules/clothing/glasses/prescription_kit.dm b/code/modules/clothing/glasses/prescription_kit.dm index 0ad6419622..9e324d34f0 100644 --- a/code/modules/clothing/glasses/prescription_kit.dm +++ b/code/modules/clothing/glasses/prescription_kit.dm @@ -2,21 +2,31 @@ /obj/item/prescription_kit name = "prescription lens kit" - desc = "A disposable kit containing all the needed tools and parts to develop and apply a self-modifying prescription lens overlay device to any eyewear." + desc = "A disposable kit containing all the needed tools and parts to develop and apply a self-modifying prescription lens overlay device to any eyewear. \ + Insert eyewear, receive vision-correcting lenses." icon = 'icons/obj/device.dmi' icon_state = "modkit" -/obj/item/prescription_kit/attack_obj(obj/O, mob/living/user) - if(!istype(O, /obj/item/clothing/glasses)) +/obj/item/prescription_kit/attackby(obj/item/I, mob/living/user, params) + if(istype(I, /obj/item/clothing/glasses) && I.Adjacent(user)) + var/obj/item/clothing/glasses/target_glasses = I + prescribe(target_glasses, user) + else return ..() - if(istype(O, /obj/item/clothing/glasses)) - var/obj/item/clothing/glasses/target_glasses = O - if(target_glasses.vision_correction) - to_chat(user, span_notice("These are already fitted with prescription lenses or otherwise already correct vision!")) - return - playsound(src, 'sound/items/screwdriver.ogg', 50, 1) - user.visible_message(span_notice("[user] fits \the [target_glasses] with a prescription overlay device."), span_notice("You fit \the [target_glasses] with a prescription overlay device.")) - target_glasses.prescribe() - target_glasses.balloon_alert(user, "prescription fitted!") - qdel(src) +/obj/item/prescription_kit/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + if(istype(target, /obj/item/clothing/glasses) && target.Adjacent(user)) + var/obj/item/clothing/glasses/target_glasses = target + prescribe(target_glasses, user) + else + . = ..() + +/obj/item/prescription_kit/proc/prescribe(obj/item/clothing/glasses/target_glasses, mob/user) + if(target_glasses.vision_correction) + to_chat(user, span_notice("These are already fitted with prescription lenses or otherwise already correct vision!")) + return + playsound(src, 'sound/items/screwdriver.ogg', 50, 1) + user.visible_message(span_notice("[user] fits \the [target_glasses] with a prescription overlay device."), span_notice("You fit \the [target_glasses] with a prescription overlay device.")) + target_glasses.prescribe() + target_glasses.balloon_alert(user, "prescription fitted!") + qdel(src) diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index f3868f703f..0a626a0558 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -440,6 +440,16 @@ icon_state = "cowboyhat_sec" item_state= "cowboyhat_sec" +/obj/item/clothing/head/cowboyhat/polychromic + name = "polychromic cowboy hat" + desc = "A polychromic cowboy hat, perfect for your indecisive rancher" + icon_state = "cowboyhat_poly" + item_state= "cowboyhat_poly" + +/obj/item/clothing/head/cowboyhat/polychromic/ComponentInitialize() + . = ..() + AddElement(/datum/element/polychromic, list("#5F5F5F", "#DDDDDD"), 2) + /obj/item/clothing/head/squatter_hat name = "slav squatter hat" icon_state = "squatter_hat" diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 7c1fc6fe3d..08a77b9b2b 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -144,7 +144,7 @@ /obj/item/clothing/shoes/jackboots name = "jackboots" - desc = "Nanotrasen-issue Security combat boots for combat scenarios or combat situations. All combat, all the time." + desc = "Nanotrasen-brand jackboots for all your jackboots-related needs. From genuine combat to tacticool LARPing, satisfaction is guaranteed." icon_state = "jackboots" lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' @@ -155,6 +155,11 @@ pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes lace_time = 12 SECONDS +/obj/item/clothing/shoes/jackboots/sec + name = "security jackboots" + desc = "Nanotrasen-issue Security combat boots for combat scenarios or combat situations. All combat, all the time." + icon_state = "jackboots_sec" + /obj/item/clothing/shoes/jackboots/fast slowdown = -1 diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index d1af3e4512..c87095e5ff 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -26,7 +26,6 @@ var/max_accessories = 3 var/list/obj/item/clothing/accessory/attached_accessories = list() var/list/mutable_appearance/accessory_overlays = list() - var/is_skirt = FALSE //SANDSTORM EDIT END /obj/item/clothing/under/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm index 1b8b4d9e00..011f64d3ec 100644 --- a/code/modules/clothing/under/accessories.dm +++ b/code/modules/clothing/under/accessories.dm @@ -7,7 +7,8 @@ // icon_state = "plasma" item_state = "" //no inhands - slot_flags = 0 + slot_flags = ITEM_SLOT_ACCESSORY + slot_equipment_priority = list(ITEM_SLOT_ACCESSORY) w_class = WEIGHT_CLASS_SMALL var/above_suit = FALSE var/minimize_when_attached = TRUE // TRUE if shown as a small icon in corner, FALSE if overlayed diff --git a/code/modules/events/_event.dm b/code/modules/events/_event.dm index 3abe65a790..d8c7af788f 100644 --- a/code/modules/events/_event.dm +++ b/code/modules/events/_event.dm @@ -3,6 +3,8 @@ //this datum is used by the events controller to dictate how it selects events /datum/round_event_control var/name //The human-readable name of the event + var/category //The category of the event + var/description //The description of the event var/typepath //The typepath of the event datum /datum/round_event var/weight = 10 //The weight this event has in the random-selection process. @@ -38,6 +40,7 @@ min_players = CEILING(min_players * CONFIG_GET(number/events_min_players_mul), 1) /datum/round_event_control/wizard + category = EVENT_CATEGORY_WIZARD wizardevent = TRUE var/can_be_midround_wizard = TRUE @@ -107,13 +110,22 @@ log_admin_private("[key_name(usr)] cancelled event [name].") SSblackbox.record_feedback("tally", "event_admin_cancelled", 1, typepath) -/datum/round_event_control/proc/runEvent(random = FALSE) +/* +Runs the event +* Arguments: +* - random: shows if the event was triggered randomly, or by on purpose by an admin or an item +* - announce_chance_override: if the value is not null, overrides the announcement chance when an admin calls an event +*/ +/datum/round_event_control/proc/runEvent(random = FALSE, announce_chance_override = null, admin_forced = FALSE) var/datum/round_event/E = new typepath() E.current_players = get_active_player_count(alive_check = 1, afk_check = 1, human_check = 1) E.control = src SSblackbox.record_feedback("tally", "event_ran", 1, "[E]") occurrences++ + if(announce_chance_override != null) + E.announce_chance = announce_chance_override + testing("[time2text(world.time, "hh:mm:ss")] [E.type]") if(random) log_game("Random Event triggering: [name] ([typepath])") @@ -129,18 +141,29 @@ var/processing = TRUE var/datum/round_event_control/control - var/startWhen = 0 //When in the lifetime to call start(). - var/announceWhen = 0 //When in the lifetime to call announce(). Set an event's announceWhen to -1 if announcement should not be shown. - var/endWhen = 0 //When in the lifetime the event should end. + /// When in the lifetime to call start(). + /// This is in seconds - so 1 = ~2 seconds in. + var/start_when = 0 + /// When in the lifetime to call announce(). If you don't want it to announce use announce_chance, below. + /// This is in seconds - so 1 = ~2 seconds in. + var/announce_when = 0 + /// Probability of announcing, used in prob(), 0 to 100, default 100. Called in process, and for a second time in the ion storm event. + var/announce_chance = 100 + /// When in the lifetime the event should end. + /// This is in seconds - so 1 = ~2 seconds in. + var/end_when = 0 - var/activeFor = 0 //How long the event has existed. You don't need to change this. - var/current_players = 0 //Amount of of alive, non-AFK human players on server at the time of event start + /// How long the event has existed. You don't need to change this. + var/activeFor = 0 + /// Amount of of alive, non-AFK human players on server at the time of event start + var/current_players = 0 var/threat = 0 - var/fakeable = TRUE //Can be faked by fake news event. + /// Can be faked by fake news event. + var/fakeable = TRUE //Called first before processing. //Allows you to setup your event, such as randomly -//setting the startWhen and or announceWhen variables. +//setting the start_when and or announce_when variables. //Only called once. //EDIT: if there's anything you want to override within the new() call, it will not be overridden by the time this proc is called. //It will only have been overridden by the time we get to announce() start() tick() or end() (anything but setup basically). @@ -148,7 +171,7 @@ /datum/round_event/proc/setup() return -//Called when the tick is equal to the startWhen variable. +//Called when the tick is equal to the start_when variable. //Allows you to start before announcing or vice versa. //Only called once. /datum/round_event/proc/start() @@ -165,20 +188,20 @@ notify_ghosts("[control.name] has an object of interest: [atom_of_interest]!", source=atom_of_interest, action=NOTIFY_ORBIT, header="Something's Interesting!") return -//Called when the tick is equal to the announceWhen variable. +//Called when the tick is equal to the announce_when variable. //Allows you to announce before starting or vice versa. //Only called once. /datum/round_event/proc/announce(fake) return -//Called on or after the tick counter is equal to startWhen. +//Called on or after the tick counter is equal to start_when. //You can include code related to your event or add your own //time stamped events. //Called more than once. /datum/round_event/proc/tick() return -//Called on or after the tick is equal or more than endWhen +//Called on or after the tick is equal or more than end_when //You can include code related to the event ending. //Do not place spawn() in here, instead use tick() to check for //the activeFor variable. @@ -197,28 +220,28 @@ if(!processing) return - if(activeFor == startWhen) + if(activeFor == start_when) processing = FALSE start() processing = TRUE - if(activeFor == announceWhen) + if(activeFor == announce_when && prob(announce_chance)) processing = FALSE announce(FALSE) processing = TRUE - if(startWhen < activeFor && activeFor < endWhen) + if(start_when < activeFor && activeFor < end_when) processing = FALSE tick() processing = TRUE - if(activeFor == endWhen) + if(activeFor == end_when) processing = FALSE end() processing = TRUE // Everything is done, let's clean up. - if(activeFor >= endWhen && activeFor >= announceWhen && activeFor >= startWhen) + if(activeFor >= end_when && activeFor >= announce_when && activeFor >= start_when) processing = FALSE kill() diff --git a/code/modules/events/abductor.dm b/code/modules/events/abductor.dm index 9fe3a2a7a9..64c743d1a1 100755 --- a/code/modules/events/abductor.dm +++ b/code/modules/events/abductor.dm @@ -6,6 +6,8 @@ min_players = 30 earliest_start = 30 MINUTES dynamic_should_hijack = TRUE + category = EVENT_CATEGORY_INVASION + description = "One or more abductor teams spawns, and they plan to experiment on the crew." /datum/round_event/ghost_role/abductor minimum_required = 2 diff --git a/code/modules/events/alien_infestation.dm b/code/modules/events/alien_infestation.dm index f7014df648..cf94253bbb 100644 --- a/code/modules/events/alien_infestation.dm +++ b/code/modules/events/alien_infestation.dm @@ -5,9 +5,11 @@ min_players = 25 max_occurrences = 1 dynamic_should_hijack = TRUE + category = EVENT_CATEGORY_ENTITIES + description = "A xenomorph larva spawns on a random vent." /datum/round_event/ghost_role/alien_infestation - announceWhen = 400 + announce_when = 400 minimum_required = 1 role_name = "alien larva" @@ -19,7 +21,7 @@ /datum/round_event/ghost_role/alien_infestation/setup() - announceWhen = rand(announceWhen, announceWhen + 50) + announce_when = rand(announce_when, announce_when + 50) if(prob(50)) spawncount++ diff --git a/code/modules/events/anomaly.dm b/code/modules/events/anomaly.dm index ae0d5442ad..456a83958d 100644 --- a/code/modules/events/anomaly.dm +++ b/code/modules/events/anomaly.dm @@ -5,11 +5,13 @@ min_players = 1 max_occurrences = 0 //This one probably shouldn't occur! It'd work, but it wouldn't be very fun. weight = 15 + category = EVENT_CATEGORY_ANOMALIES + description = "This anomaly shocks and explodes. This is the base type." /datum/round_event/anomaly var/area/impact_area var/obj/effect/anomaly/anomaly_path = /obj/effect/anomaly/flux - announceWhen = 1 + announce_when = 1 /datum/round_event/anomaly/proc/findEventArea() diff --git a/code/modules/events/anomaly_bluespace.dm b/code/modules/events/anomaly_bluespace.dm index fd64b20244..f058f37da4 100644 --- a/code/modules/events/anomaly_bluespace.dm +++ b/code/modules/events/anomaly_bluespace.dm @@ -4,10 +4,11 @@ max_occurrences = 1 weight = 5 + description = "This anomaly randomly teleports all items and mobs in a large area." /datum/round_event/anomaly/anomaly_bluespace - startWhen = 3 - announceWhen = 10 + start_when = 3 + announce_when = 10 anomaly_path = /obj/effect/anomaly/bluespace /datum/round_event/anomaly/anomaly_bluespace/announce(fake) diff --git a/code/modules/events/anomaly_flux.dm b/code/modules/events/anomaly_flux.dm index 6368e70b94..d3b1e8ea7e 100644 --- a/code/modules/events/anomaly_flux.dm +++ b/code/modules/events/anomaly_flux.dm @@ -4,10 +4,11 @@ max_occurrences = 5 weight = 20 + description = "This anomaly shocks and explodes." /datum/round_event/anomaly/anomaly_flux - startWhen = 10 - announceWhen = 3 + start_when = 10 + announce_when = 3 anomaly_path = /obj/effect/anomaly/flux /datum/round_event/anomaly/anomaly_flux/announce(fake) diff --git a/code/modules/events/anomaly_grav.dm b/code/modules/events/anomaly_grav.dm index c1b4ade5c0..232d2ddd35 100644 --- a/code/modules/events/anomaly_grav.dm +++ b/code/modules/events/anomaly_grav.dm @@ -4,11 +4,11 @@ max_occurrences = 5 weight = 20 - + description = "This anomaly throws things around." /datum/round_event/anomaly/anomaly_grav - startWhen = 3 - announceWhen = 20 + start_when = 3 + announce_when = 20 anomaly_path = /obj/effect/anomaly/grav /datum/round_event/anomaly/anomaly_grav/announce(fake) diff --git a/code/modules/events/anomaly_pyro.dm b/code/modules/events/anomaly_pyro.dm index 83c1fa64cc..dee0330743 100644 --- a/code/modules/events/anomaly_pyro.dm +++ b/code/modules/events/anomaly_pyro.dm @@ -5,10 +5,11 @@ min_players = 5 max_occurrences = 5 weight = 20 + description = "This anomaly sets things on fire, and creates a pyroclastic slime." /datum/round_event/anomaly/anomaly_pyro - startWhen = 3 - announceWhen = 10 + start_when = 3 + announce_when = 10 anomaly_path = /obj/effect/anomaly/pyro /datum/round_event/anomaly/anomaly_pyro/announce(fake) diff --git a/code/modules/events/anomaly_vortex.dm b/code/modules/events/anomaly_vortex.dm index 7228030616..43dcc0baf4 100644 --- a/code/modules/events/anomaly_vortex.dm +++ b/code/modules/events/anomaly_vortex.dm @@ -5,10 +5,11 @@ min_players = 20 max_occurrences = 2 weight = 5 + description = "This anomaly sucks in and detonates items." /datum/round_event/anomaly/anomaly_vortex - startWhen = 10 - announceWhen = 3 + start_when = 10 + announce_when = 3 anomaly_path = /obj/effect/anomaly/bhole /datum/round_event/anomaly/anomaly_vortex/announce(fake) diff --git a/code/modules/events/atmos_speed.dm b/code/modules/events/atmos_speed.dm index 17a02d3dd1..64e6e883cc 100644 --- a/code/modules/events/atmos_speed.dm +++ b/code/modules/events/atmos_speed.dm @@ -3,10 +3,12 @@ typepath = /datum/round_event/atmos_flux max_occurrences = 5 weight = 10 + category = EVENT_CATEGORY_ENGINEERING + description = "Modifies the speed of the SSair randomly, ends after one minute." /datum/round_event/atmos_flux - announceWhen = 1 - endWhen = 600 + announce_when = 1 + end_when = 600 var/original_speed /datum/round_event/atmos_flux/announce(fake) diff --git a/code/modules/events/aurora_caelus.dm b/code/modules/events/aurora_caelus.dm index 89a84d3494..63d7122cb8 100644 --- a/code/modules/events/aurora_caelus.dm +++ b/code/modules/events/aurora_caelus.dm @@ -4,6 +4,8 @@ max_occurrences = 1 weight = 4 earliest_start = 5 MINUTES + category = EVENT_CATEGORY_FRIENDLY + description = "A colourful display can be seen through select windows. And the kitchen." /datum/round_event_control/aurora_caelus/canSpawnEvent(players, gamemode) if(!CONFIG_GET(flag/starlight)) @@ -11,9 +13,9 @@ return ..() /datum/round_event/aurora_caelus - announceWhen = 1 - startWhen = 9 - endWhen = 50 + announce_when = 1 + start_when = 9 + end_when = 50 var/list/aurora_colors = list("#A2FF80", "#A2FF8B", "#A2FF96", "#A2FFA5", "#A2FFB6", "#A2FFC7", "#A2FFDE", "#A2FFEE") var/aurora_progress = 0 //this cycles from 1 to 8, slowly changing colors from gentle green to gentle blue diff --git a/code/modules/events/blob.dm b/code/modules/events/blob.dm index e31711661d..d28c5d6512 100644 --- a/code/modules/events/blob.dm +++ b/code/modules/events/blob.dm @@ -7,9 +7,11 @@ earliest_start = 60 MINUTES min_players = 35 dynamic_should_hijack = TRUE + category = EVENT_CATEGORY_ENTITIES + description = "Spawns a new blob overmind." /datum/round_event/ghost_role/blob - announceWhen = -1 + announce_when = -1 role_name = "blob overmind" fakeable = TRUE diff --git a/code/modules/events/brain_trauma.dm b/code/modules/events/brain_trauma.dm index 0529d102dc..85d69a1509 100644 --- a/code/modules/events/brain_trauma.dm +++ b/code/modules/events/brain_trauma.dm @@ -3,6 +3,8 @@ typepath = /datum/round_event/brain_trauma weight = 25 min_players = 5 + category = EVENT_CATEGORY_HEALTH + description = "A crewmember gains a random trauma." /datum/round_event_control/brain_trauma/canSpawnEvent(var/players_amt, var/gamemode) if(!..()) return FALSE diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm index 1b275af4fb..cab9daaa55 100644 --- a/code/modules/events/brand_intelligence.dm +++ b/code/modules/events/brand_intelligence.dm @@ -5,10 +5,12 @@ min_players = 15 max_occurrences = 1 + category = EVENT_CATEGORY_AI + description = "Vending machines will attack people until the Patient Zero is disabled." /datum/round_event/brand_intelligence - announceWhen = 21 - endWhen = 1000 //Ends when all vending machines are subverted anyway. + announce_when = 21 + end_when = 1000 //Ends when all vending machines are subverted anyway. var/list/obj/machinery/vending/vendingMachines = list() var/list/obj/machinery/vending/infectedMachines = list() var/obj/machinery/vending/originMachine diff --git a/code/modules/events/bureaucratic_error.dm b/code/modules/events/bureaucratic_error.dm index 7246c9aedf..fc35df791b 100644 --- a/code/modules/events/bureaucratic_error.dm +++ b/code/modules/events/bureaucratic_error.dm @@ -3,9 +3,11 @@ typepath = /datum/round_event/bureaucratic_error max_occurrences = 1 weight = 5 + category = EVENT_CATEGORY_BUREAUCRATIC + description = "Randomly opens and closes job slots, along with changing the overflow role." /datum/round_event/bureaucratic_error - announceWhen = 1 + announce_when = 1 /datum/round_event/bureaucratic_error/announce(fake) priority_announce("A recent bureaucratic error in the Organic Resources Department may result in personnel shortages in some departments and redundant staffing in others.", "Paperwork Mishap Alert") diff --git a/code/modules/events/camerafailure.dm b/code/modules/events/camerafailure.dm index 8d7ef3204c..453b919c5b 100644 --- a/code/modules/events/camerafailure.dm +++ b/code/modules/events/camerafailure.dm @@ -4,6 +4,8 @@ weight = 100 max_occurrences = 20 alert_observers = FALSE + category = EVENT_CATEGORY_ENGINEERING + description = "Turns off a random amount of cameras." /datum/round_event/camera_failure fakeable = FALSE diff --git a/code/modules/events/carp_migration.dm b/code/modules/events/carp_migration.dm index f927a59ad6..bed6cf84ea 100644 --- a/code/modules/events/carp_migration.dm +++ b/code/modules/events/carp_migration.dm @@ -5,6 +5,8 @@ min_players = 2 earliest_start = 10 MINUTES max_occurrences = 6 + category = EVENT_CATEGORY_ENTITIES + description = "Summons a school of space carp." /datum/round_event_control/carp_migration/New() . = ..() @@ -14,12 +16,12 @@ earliest_start *= 0.5 /datum/round_event/carp_migration - announceWhen = 3 - startWhen = 50 + announce_when = 3 + start_when = 50 var/hasAnnounced = FALSE /datum/round_event/carp_migration/setup() - startWhen = rand(40, 60) + start_when = rand(40, 60) /datum/round_event/carp_migration/announce(fake) if(prob(50)) diff --git a/code/modules/events/cat_surgeon.dm b/code/modules/events/cat_surgeon.dm index 025d2d2325..254fdaecca 100644 --- a/code/modules/events/cat_surgeon.dm +++ b/code/modules/events/cat_surgeon.dm @@ -1,45 +1,47 @@ /datum/round_event_control/cat_surgeon - name = "Cat Surgeon" - typepath = /datum/round_event/cat_surgeon - max_occurrences = 1 - weight = 5 + name = "Cat Surgeon" + typepath = /datum/round_event/cat_surgeon + max_occurrences = 1 + weight = 5 + category = EVENT_CATEGORY_ENTITIES + description = "Spawns a crazy surgeon ready to perverse things with the crew." /datum/round_event/cat_surgeon/announce(fake) priority_announce("One of our... ahem... 'special' cases has escaped. As it happens their last known location before their tracker went dead is your station so keep an eye out for them. On an unrelated note, has anyone seen our cats?", sender_override = "Nanotrasen Psych Ward", has_important_message = TRUE) /datum/round_event/cat_surgeon/start() - var/list/spawn_locs = list() - var/list/unsafe_spawn_locs = list() - for(var/X in GLOB.xeno_spawn) - if(!isfloorturf(X)) - unsafe_spawn_locs += X - continue - var/turf/open/floor/F = X - var/datum/gas_mixture/A = F.air - var/oxy_moles = A.get_moles(GAS_O2) - if((oxy_moles < 16 || oxy_moles > 50) || A.get_moles(GAS_PLASMA) || A.get_moles(GAS_CO2) >= 10) - unsafe_spawn_locs += F - continue - if((A.return_temperature() <= 270) || (A.return_temperature() >= 360)) - unsafe_spawn_locs += F - continue - var/pressure = A.return_pressure() - if((pressure <= 20) || (pressure >= 550)) - unsafe_spawn_locs += F - continue - spawn_locs += F + var/list/spawn_locs = list() + var/list/unsafe_spawn_locs = list() + for(var/X in GLOB.xeno_spawn) + if(!isfloorturf(X)) + unsafe_spawn_locs += X + continue + var/turf/open/floor/F = X + var/datum/gas_mixture/A = F.air + var/oxy_moles = A.get_moles(GAS_O2) + if((oxy_moles < 16 || oxy_moles > 50) || A.get_moles(GAS_PLASMA) || A.get_moles(GAS_CO2) >= 10) + unsafe_spawn_locs += F + continue + if((A.return_temperature() <= 270) || (A.return_temperature() >= 360)) + unsafe_spawn_locs += F + continue + var/pressure = A.return_pressure() + if((pressure <= 20) || (pressure >= 550)) + unsafe_spawn_locs += F + continue + spawn_locs += F - if(!spawn_locs.len) - spawn_locs += unsafe_spawn_locs + if(!spawn_locs.len) + spawn_locs += unsafe_spawn_locs - if(!spawn_locs.len) - message_admins("No valid spawn locations found, aborting...") - return MAP_ERROR + if(!spawn_locs.len) + message_admins("No valid spawn locations found, aborting...") + return MAP_ERROR - var/turf/T = get_turf(pick(spawn_locs)) - var/mob/living/simple_animal/hostile/cat_butcherer/S = new(T) - playsound(S, 'sound/misc/catscream.ogg', 75, 1, -1) - message_admins("A cat surgeon has been spawned at [COORD(T)][ADMIN_JMP(T)]") - log_game("A cat surgeon has been spawned at [COORD(T)]") - return SUCCESSFUL_SPAWN + var/turf/T = get_turf(pick(spawn_locs)) + var/mob/living/simple_animal/hostile/cat_butcherer/S = new(T) + playsound(S, 'sound/misc/catscream.ogg', 75, 1, -1) + message_admins("A cat surgeon has been spawned at [COORD(T)][ADMIN_JMP(T)]") + log_game("A cat surgeon has been spawned at [COORD(T)]") + return SUCCESSFUL_SPAWN diff --git a/code/modules/events/communications_blackout.dm b/code/modules/events/communications_blackout.dm index 0342ca4643..b47dad0c93 100644 --- a/code/modules/events/communications_blackout.dm +++ b/code/modules/events/communications_blackout.dm @@ -2,9 +2,11 @@ name = "Communications Blackout" typepath = /datum/round_event/communications_blackout weight = 30 + category = EVENT_CATEGORY_ENGINEERING + description = "Heavily emps all telecommunication machines, blocking all communication for a while." /datum/round_event/communications_blackout - announceWhen = 1 + announce_when = 1 /datum/round_event/communications_blackout/announce(fake) var/alert = pick( "Ionospheric anomalies detected. Temporary telecommunication failure imminent. Please contact you*%fj00)`5vc-BZZT", \ diff --git a/code/modules/events/devil.dm b/code/modules/events/devil.dm index 7d6e0bd441..3d6382b2a4 100644 --- a/code/modules/events/devil.dm +++ b/code/modules/events/devil.dm @@ -2,6 +2,8 @@ name = "Create Devil" typepath = /datum/round_event/ghost_role/devil max_occurrences = 0 + category = EVENT_CATEGORY_ENTITIES + description = "Spawns a devil, looking forward to makings deals with crewmembers to get their souls." /datum/round_event/ghost_role/devil var/success_spawn = 0 diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index 517cf33b82..753349fdd6 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -4,9 +4,11 @@ max_occurrences = 1 min_players = 3 weight = 5 + category = EVENT_CATEGORY_HEALTH + description = "A classic or advanced disease will infect some crewmembers." /datum/round_event/disease_outbreak - announceWhen = 15 + announce_when = 15 var/virus_type @@ -24,7 +26,7 @@ priority_announce("Confirmed outbreak of level 7 viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", "outbreak7") /datum/round_event/disease_outbreak/setup() - announceWhen = rand(15, 30) + announce_when = rand(15, 30) /datum/round_event/disease_outbreak/start() diff --git a/code/modules/events/dust.dm b/code/modules/events/dust.dm index 941478d52a..6b0139c449 100644 --- a/code/modules/events/dust.dm +++ b/code/modules/events/dust.dm @@ -5,10 +5,12 @@ max_occurrences = 1000 earliest_start = 0 MINUTES alert_observers = FALSE + category = EVENT_CATEGORY_SPACE + description = "A single space dust is hurled at the station." /datum/round_event/space_dust - startWhen = 1 - endWhen = 2 + start_when = 1 + end_when = 2 fakeable = FALSE /datum/round_event/space_dust/start() @@ -21,11 +23,13 @@ max_occurrences = 1 min_players = 10 earliest_start = 20 MINUTES + category = EVENT_CATEGORY_SPACE + description = "The station is pelted by an extreme amount of sand for several minutes." /datum/round_event/sandstorm - startWhen = 1 - endWhen = 150 // ~5 min - announceWhen = 0 + start_when = 1 + end_when = 150 // ~5 min + announce_when = 0 fakeable = FALSE /datum/round_event/sandstorm/announce(fake) diff --git a/code/modules/events/electrical_storm.dm b/code/modules/events/electrical_storm.dm index b850b4db62..f04389b1a1 100644 --- a/code/modules/events/electrical_storm.dm +++ b/code/modules/events/electrical_storm.dm @@ -4,12 +4,13 @@ earliest_start = 10 MINUTES min_players = 5 weight = 40 - alert_observers = FALSE + category = EVENT_CATEGORY_ENGINEERING + description = "Destroys all lights in a large area." /datum/round_event/electrical_storm var/lightsoutAmount = 1 var/lightsoutRange = 25 - announceWhen = 1 + announce_when = 1 /datum/round_event/electrical_storm/announce(fake) if(prob(50)) diff --git a/code/modules/events/fake_virus.dm b/code/modules/events/fake_virus.dm index cebf1ed14b..ec69f9e2c9 100644 --- a/code/modules/events/fake_virus.dm +++ b/code/modules/events/fake_virus.dm @@ -2,6 +2,8 @@ name = "Fake Virus" typepath = /datum/round_event/fake_virus weight = 20 + category = EVENT_CATEGORY_HEALTH + description = "Some crewmembers suffer from temporary hypochondria." /datum/round_event/fake_virus/start() var/list/fake_virus_victims = list() diff --git a/code/modules/events/false_alarm.dm b/code/modules/events/false_alarm.dm index 5ac75cf087..95b7d1c3ce 100644 --- a/code/modules/events/false_alarm.dm +++ b/code/modules/events/false_alarm.dm @@ -4,7 +4,8 @@ weight = 20 max_occurrences = 5 var/forced_type //Admin abuse - + category = EVENT_CATEGORY_BUREAUCRATIC + description = "Fakes an event announcement." /datum/round_event_control/falsealarm/admin_setup() if(!check_rights(R_FUN)) @@ -17,15 +18,15 @@ if(!initial(event.fakeable)) continue possible_types += E - + forced_type = input(usr, "Select the scare.","False event") as null|anything in possible_types /datum/round_event_control/falsealarm/canSpawnEvent(players_amt, gamemode) return ..() && length(gather_false_events()) /datum/round_event/falsealarm - announceWhen = 0 - endWhen = 1 + announce_when = 0 + end_when = 1 fakeable = FALSE /datum/round_event/falsealarm/announce(fake) diff --git a/code/modules/events/floorcluwne.dm b/code/modules/events/floorcluwne.dm index ce9a2d8cc3..6b91fb2ca2 100644 --- a/code/modules/events/floorcluwne.dm +++ b/code/modules/events/floorcluwne.dm @@ -4,7 +4,8 @@ max_occurrences = 0 min_players = 20 weight = 10 - + category = EVENT_CATEGORY_ENTITIES + description = "Spawns a floor cluwne, will hunt a random player and most likely gib them, prepare for adminhelps." /datum/round_event/floor_cluwne/start() var/list/spawn_locs = list() diff --git a/code/modules/events/fugitive_spawning.dm b/code/modules/events/fugitive_spawning.dm index a09f0f584e..13964d6ec6 100644 --- a/code/modules/events/fugitive_spawning.dm +++ b/code/modules/events/fugitive_spawning.dm @@ -4,6 +4,8 @@ max_occurrences = 1 min_players = 20 earliest_start = 30 MINUTES //deadchat sink, lets not even consider it early on. + category = EVENT_CATEGORY_INVASION + description = "Fugitives will hide on the station, followed by hunters." /datum/round_event/ghost_role/fugitives minimum_required = 1 diff --git a/code/modules/events/ghost_role.dm b/code/modules/events/ghost_role.dm index ae1d1320a5..baabb435bc 100644 --- a/code/modules/events/ghost_role.dm +++ b/code/modules/events/ghost_role.dm @@ -7,6 +7,8 @@ var/minimum_required = 1 var/role_name = "debug rat with cancer" // Q U A L I T Y M E M E S var/list/spawned_mobs = list() + var/status + var/cached_announcement_chance fakeable = FALSE /datum/round_event/ghost_role/start() @@ -17,7 +19,10 @@ // to prevent us from getting gc'd halfway through processing = FALSE - var/status = spawn_role() + status = spawn_role() + if(isnull(cached_announcement_chance)) + cached_announcement_chance = announce_chance //only announce once we've finished the spawning loop. + announce_chance = (status == SUCCESSFUL_SPAWN ? cached_announcement_chance : 0) if((status == WAITING_FOR_SOMETHING)) if(retry >= MAX_SPAWN_ATTEMPT) message_admins("[role_name] event has exceeded maximum spawn attempts. Aborting and refunding.") diff --git a/code/modules/events/grid_check.dm b/code/modules/events/grid_check.dm index 1bb0ee617a..c39a6e1bb2 100644 --- a/code/modules/events/grid_check.dm +++ b/code/modules/events/grid_check.dm @@ -3,10 +3,12 @@ typepath = /datum/round_event/grid_check weight = 10 max_occurrences = 3 + category = EVENT_CATEGORY_ENGINEERING + description = "Turns off all APCs for a while, or until they are manually rebooted." /datum/round_event/grid_check - announceWhen = 1 - startWhen = 1 + announce_when = 1 + start_when = 1 /datum/round_event/grid_check/announce(fake) priority_announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure", "poweroff") diff --git a/code/modules/events/heart_attack.dm b/code/modules/events/heart_attack.dm index 930a2b884f..4f94576fa6 100644 --- a/code/modules/events/heart_attack.dm +++ b/code/modules/events/heart_attack.dm @@ -4,6 +4,8 @@ weight = 10 max_occurrences = 2 min_players = 10 // To avoid shafting lowpop + category = EVENT_CATEGORY_HEALTH + description = "A random crewmember's heart gives out." /datum/round_event_control/heart_attack/canSpawnEvent(var/players_amt, var/gamemode) if(!..()) return FALSE diff --git a/code/modules/events/high_priority_bounty.dm b/code/modules/events/high_priority_bounty.dm index ffdcd8840b..90f27b19f9 100644 --- a/code/modules/events/high_priority_bounty.dm +++ b/code/modules/events/high_priority_bounty.dm @@ -4,6 +4,8 @@ max_occurrences = 3 weight = 20 earliest_start = 10 + category = EVENT_CATEGORY_BUREAUCRATIC + description = "Creates bounties that are three times original worth." /datum/round_event/high_priority_bounty/announce(fake) priority_announce("Central Command has issued a high-priority cargo bounty. Details have been sent to all bounty consoles.", "Nanotrasen Bounty Program") diff --git a/code/modules/events/holiday/halloween.dm b/code/modules/events/holiday/halloween.dm index 9824355e4b..fd45eb4ccf 100644 --- a/code/modules/events/holiday/halloween.dm +++ b/code/modules/events/holiday/halloween.dm @@ -5,6 +5,8 @@ weight = -1 //forces it to be called, regardless of weight max_occurrences = 1 earliest_start = 0 MINUTES + category = EVENT_CATEGORY_HOLIDAY + description = "Gives everyone treats, and turns Ian and Polly into their festive versions." /datum/round_event/spooky/start() ..() diff --git a/code/modules/events/holiday/vday.dm b/code/modules/events/holiday/vday.dm index 16ae047729..ebe44d3e00 100644 --- a/code/modules/events/holiday/vday.dm +++ b/code/modules/events/holiday/vday.dm @@ -11,6 +11,8 @@ weight = -1 //forces it to be called, regardless of weight max_occurrences = 1 earliest_start = 0 MINUTES + category = EVENT_CATEGORY_HOLIDAY + description = "Puts people on dates! They must protect each other. Sometimes a vengeful third wheel spawns." /datum/round_event/valentines/start() ..() diff --git a/code/modules/events/holiday/xmas.dm b/code/modules/events/holiday/xmas.dm index e043caa29d..a9bedb3c57 100644 --- a/code/modules/events/holiday/xmas.dm +++ b/code/modules/events/holiday/xmas.dm @@ -68,6 +68,8 @@ weight = 20 max_occurrences = 1 earliest_start = 30 MINUTES + category = EVENT_CATEGORY_HOLIDAY + description = "Spawns santa, who shall roam the station, handing out gifts." /datum/round_event/santa var/mob/living/carbon/human/santa //who is our santa? diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm index 482abe67f2..a48191e8a1 100644 --- a/code/modules/events/immovable_rod.dm +++ b/code/modules/events/immovable_rod.dm @@ -13,7 +13,8 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 min_players = 15 max_occurrences = 5 var/atom/special_target - + category = EVENT_CATEGORY_SPACE + description = "The station passes through an immovable rod." /datum/round_event_control/immovable_rod/admin_setup() if(!check_rights(R_FUN)) @@ -24,7 +25,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 special_target = get_turf(usr) /datum/round_event/immovable_rod - announceWhen = 5 + announce_when = 5 /datum/round_event/immovable_rod/announce(fake) priority_announce("What the fuck was that?!", "General Alert", has_important_message = TRUE) diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm index f25b476657..0fefb43170 100644 --- a/code/modules/events/ion_storm.dm +++ b/code/modules/events/ion_storm.dm @@ -5,6 +5,8 @@ typepath = /datum/round_event/ion_storm weight = 15 min_players = 2 + category = EVENT_CATEGORY_AI + description = "Gives the AI a new, randomized law." /datum/round_event/ion_storm var/replaceLawsetChance = 25 //chance the AI's lawset is completely replaced with something else per config weights @@ -14,8 +16,8 @@ var/botEmagChance = 10 var/announceEvent = ION_RANDOM // -1 means don't announce, 0 means have it randomly announce, 1 means it is announced var/ionMessage = null - var/ionAnnounceChance = 33 - announceWhen = 1 + announce_when = 1 + announce_chance = 33 /datum/round_event/ion_storm/add_law_only // special subtype that adds a law only replaceLawsetChance = 0 @@ -25,7 +27,7 @@ botEmagChance = 0 /datum/round_event/ion_storm/announce(fake) - if(announceEvent == ION_ANNOUNCE || (announceEvent == ION_RANDOM && prob(ionAnnounceChance)) || fake) + if(announceEvent == ION_ANNOUNCE || (announceEvent == ION_RANDOM && prob(announce_chance)) || fake) priority_announce("Ion storm detected near the station. Please check all AI-controlled equipment for errors.", "Anomaly Alert", "ionstorm", has_important_message = prob(80)) diff --git a/code/modules/events/major_dust.dm b/code/modules/events/major_dust.dm index 3f7cbc77f5..dc24a52b19 100644 --- a/code/modules/events/major_dust.dm +++ b/code/modules/events/major_dust.dm @@ -2,6 +2,7 @@ name = "Major Space Dust" typepath = /datum/round_event/meteor_wave/major_dust weight = 8 + description = "The station is pelted by sand." /datum/round_event/meteor_wave/major_dust wave_name = "space dust" diff --git a/code/modules/events/mass_hallucination.dm b/code/modules/events/mass_hallucination.dm index d8e52cf46d..2a0c45a5ff 100644 --- a/code/modules/events/mass_hallucination.dm +++ b/code/modules/events/mass_hallucination.dm @@ -5,6 +5,8 @@ max_occurrences = 5 min_players = 1 var/forced_hallucination + category = EVENT_CATEGORY_HEALTH + description = "Multiple crewmembers start to hallucinate the same thing." /datum/round_event_control/mass_hallucination/admin_setup() if(!check_rights(R_FUN)) diff --git a/code/modules/events/meateor_wave.dm b/code/modules/events/meateor_wave.dm index c4711055d9..a625f53788 100644 --- a/code/modules/events/meateor_wave.dm +++ b/code/modules/events/meateor_wave.dm @@ -3,6 +3,7 @@ typepath = /datum/round_event/meteor_wave/meaty weight = 2 max_occurrences = 1 + description = "A meteor wave made of meat." /datum/round_event/meteor_wave/meaty wave_name = "meaty" diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm index a3e0eb70ff..a3534be3ea 100644 --- a/code/modules/events/meteor_wave.dm +++ b/code/modules/events/meteor_wave.dm @@ -10,22 +10,24 @@ min_players = 15 max_occurrences = 3 earliest_start = 25 MINUTES + category = EVENT_CATEGORY_SPACE + description = "A regular meteor wave." /datum/round_event/meteor_wave - startWhen = 6 - endWhen = 66 - announceWhen = 1 + start_when = 6 + end_when = 66 + announce_when = 1 threat = 15 var/list/wave_type var/wave_name = "normal" var/direction /datum/round_event/meteor_wave/setup() - announceWhen = 1 - startWhen = 150 // 5 minutes + announce_when = 1 + start_when = 150 // 5 minutes if(GLOB.singularity_counter) - startWhen *= 1 - min(GLOB.singularity_counter * SINGULO_BEACON_DISTURBANCE, SINGULO_BEACON_MAX_DISTURBANCE) - endWhen = startWhen + 60 + start_when *= 1 - min(GLOB.singularity_counter * SINGULO_BEACON_DISTURBANCE, SINGULO_BEACON_MAX_DISTURBANCE) + end_when = start_when + 60 /datum/round_event/meteor_wave/New() ..() @@ -61,9 +63,9 @@ kill() /datum/round_event/meteor_wave/announce(fake) - priority_announce(generateMeteorString(startWhen,TRUE,direction), "Meteor Alert", "meteors", has_important_message = TRUE) + priority_announce(generateMeteorString(start_when,TRUE,direction), "Meteor Alert", "meteors", has_important_message = TRUE) -/proc/generateMeteorString(startWhen,syndiealert,direction) +/proc/generateMeteorString(start_when,syndiealert,direction) var/directionstring switch(direction) if(NORTH) @@ -74,7 +76,7 @@ directionstring = " towards starboard" if(WEST) directionstring = " towards port" - return "Meteors have been detected on a collision course with the station[directionstring]. Estimated time until impact: [round((startWhen * SSevents.wait) / 10, 0.1)] seconds.[GLOB.singularity_counter && syndiealert ? " Warning: Anomalous gravity pulse detected, Syndicate technology interference likely." : ""]" + return "Meteors have been detected on a collision course with the station[directionstring]. Estimated time until impact: [round((start_when * SSevents.wait) / 10, 0.1)] seconds.[GLOB.singularity_counter && syndiealert ? " Warning: Anomalous gravity pulse detected, Syndicate technology interference likely." : ""]" /datum/round_event/meteor_wave/tick() if(ISMULTIPLE(activeFor, 3)) @@ -87,7 +89,7 @@ min_players = 20 max_occurrences = 3 earliest_start = 35 MINUTES - + description = "A meteor wave with higher chance of big meteors." /datum/round_event/meteor_wave/threatening wave_name = "threatening" @@ -100,6 +102,7 @@ min_players = 25 max_occurrences = 3 earliest_start = 45 MINUTES + description = "A meteor wave that might summon a tunguska class meteor." /datum/round_event/meteor_wave/catastrophic wave_name = "catastrophic" diff --git a/code/modules/events/mice_migration.dm b/code/modules/events/mice_migration.dm index 373c495972..5bf842ba47 100644 --- a/code/modules/events/mice_migration.dm +++ b/code/modules/events/mice_migration.dm @@ -2,6 +2,8 @@ name = "Mice Migration" typepath = /datum/round_event/mice_migration weight = 10 + category = EVENT_CATEGORY_ENTITIES + description = "A horde of mice arrives, and perhaps even the Rat King themselves." /datum/round_event/mice_migration var/minimum_mice = 5 diff --git a/code/modules/events/nightmare.dm b/code/modules/events/nightmare.dm index 62f9c88d49..71351d85be 100644 --- a/code/modules/events/nightmare.dm +++ b/code/modules/events/nightmare.dm @@ -4,6 +4,8 @@ max_occurrences = 1 min_players = 20 dynamic_should_hijack = TRUE + category = EVENT_CATEGORY_ENTITIES + description = "Spawns a nightmare, aiming to darken the station." /datum/round_event/ghost_role/nightmare minimum_required = 1 diff --git a/code/modules/events/operative.dm b/code/modules/events/operative.dm index 8d8adf2735..cbefa58c7b 100644 --- a/code/modules/events/operative.dm +++ b/code/modules/events/operative.dm @@ -2,7 +2,9 @@ name = "Lone Operative" typepath = /datum/round_event/ghost_role/operative weight = 0 //Admin only - max_occurrences = 0 //Now it is actually admin only + max_occurrences = 1 + category = EVENT_CATEGORY_INVASION + description = "A single nuclear operative assaults the station." /datum/round_event/ghost_role/operative minimum_required = 1 diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm index 188d733cd8..1b1fdee584 100644 --- a/code/modules/events/pirates.dm +++ b/code/modules/events/pirates.dm @@ -6,6 +6,8 @@ min_players = 10 earliest_start = 30 MINUTES dynamic_should_hijack = TRUE + category = EVENT_CATEGORY_INVASION + description = "The crew will either pay up, or face a pirate assault." #define PIRATES_ROGUES "Rogues" // #define PIRATES_SILVERSCALES "Silverscales" diff --git a/code/modules/events/portal_storm.dm b/code/modules/events/portal_storm.dm index 59bb22e9af..b1b68fb585 100644 --- a/code/modules/events/portal_storm.dm +++ b/code/modules/events/portal_storm.dm @@ -4,6 +4,8 @@ weight = 2 min_players = 15 earliest_start = 30 MINUTES + category = EVENT_CATEGORY_ENTITIES + description = "Syndicate troops pour out of portals." /datum/round_event/portal_storm/syndicate_shocktroop boss_types = list(/mob/living/simple_animal/hostile/syndicate/melee/space/stormtrooper = 2) @@ -15,6 +17,8 @@ typepath = /datum/round_event/portal_storm/portal_storm_narsie weight = 0 max_occurrences = 0 + category = EVENT_CATEGORY_ENTITIES + description = "Nar'sie constructs pour out of portals." /datum/round_event/portal_storm/portal_storm_narsie boss_types = list(/mob/living/simple_animal/hostile/construct/builder = 6) @@ -22,9 +26,9 @@ /mob/living/simple_animal/hostile/construct/wraith/hostile = 6) /datum/round_event/portal_storm - startWhen = 7 - endWhen = 999 - announceWhen = 1 + start_when = 7 + end_when = 999 + announce_when = 1 var/list/boss_spawn = list() var/list/boss_types = list() //only configure this if you have hostiles @@ -53,7 +57,7 @@ while(number_of_hostiles > hostiles_spawn.len) hostiles_spawn += get_random_station_turf() - next_boss_spawn = startWhen + CEILING(2 * number_of_hostiles / number_of_bosses, 1) + next_boss_spawn = start_when + CEILING(2 * number_of_hostiles / number_of_bosses, 1) /datum/round_event/portal_storm/announce(fake) do_announce() @@ -117,7 +121,7 @@ /datum/round_event/portal_storm/proc/time_to_end() if(!hostile_types.len && !boss_types.len) - endWhen = activeFor + end_when = activeFor if(!number_of_hostiles && number_of_bosses) - endWhen = activeFor + end_when = activeFor diff --git a/code/modules/events/prison_break.dm b/code/modules/events/prison_break.dm index d35f4931fb..110ab745a0 100644 --- a/code/modules/events/prison_break.dm +++ b/code/modules/events/prison_break.dm @@ -3,10 +3,12 @@ typepath = /datum/round_event/grey_tide max_occurrences = 2 min_players = 5 + category = EVENT_CATEGORY_ENGINEERING + description = "Bolts open all doors in one or more departments." /datum/round_event/grey_tide - announceWhen = 50 - endWhen = 20 + announce_when = 50 + end_when = 20 var/list/area/areasToOpen = list() var/list/potential_areas = list(/area/command, /area/engineering, @@ -17,8 +19,8 @@ var/severity = 1 /datum/round_event/grey_tide/setup() - announceWhen = rand(50, 60) - endWhen = rand(20, 30) + announce_when = rand(50, 60) + end_when = rand(20, 30) severity = rand(1,3) for(var/i in 1 to severity) var/picked_area = pick_n_take(potential_areas) diff --git a/code/modules/events/processor_overload.dm b/code/modules/events/processor_overload.dm index 6f20d954ed..578520f565 100644 --- a/code/modules/events/processor_overload.dm +++ b/code/modules/events/processor_overload.dm @@ -3,9 +3,11 @@ typepath = /datum/round_event/processor_overload weight = 15 min_players = 20 + category = EVENT_CATEGORY_ENGINEERING + description = "Emps the telecomm processors, scrambling radio speech. Might blow up a few." /datum/round_event/processor_overload - announceWhen = 1 + announce_when = 1 /datum/round_event/processor_overload/announce(fake) var/alert = pick( "Exospheric bubble inbound. Processor overload is likely. Please contact you*%xp25)`6cq-BZZT", \ diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index 52a207fd14..5ba3d017e1 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -2,14 +2,16 @@ name = "Radiation Storm" typepath = /datum/round_event/radiation_storm max_occurrences = 1 + category = EVENT_CATEGORY_SPACE + description = "Radiation storm affects the station, forcing the crew to escape to maintenance." /datum/round_event/radiation_storm /datum/round_event/radiation_storm/setup() - startWhen = 3 - endWhen = startWhen + 1 - announceWhen = 1 + start_when = 3 + end_when = start_when + 1 + announce_when = 1 /datum/round_event/radiation_storm/announce(fake) priority_announce("High levels of radiation detected near the station. Maintenance is best shielded from radiation.", "Anomaly Alert", "radiation", has_important_message = TRUE) diff --git a/code/modules/events/sentience.dm b/code/modules/events/sentience.dm index d90792c88f..8cccaba68b 100644 --- a/code/modules/events/sentience.dm +++ b/code/modules/events/sentience.dm @@ -2,7 +2,8 @@ name = "Random Human-level Intelligence" typepath = /datum/round_event/ghost_role/sentience weight = 10 - + category = EVENT_CATEGORY_FRIENDLY + description = "An animal or robot becomes sentient!" /datum/round_event/ghost_role/sentience minimum_required = 1 @@ -75,6 +76,8 @@ name = "Station-wide Human-level Intelligence" typepath = /datum/round_event/ghost_role/sentience/all weight = 0 + category = EVENT_CATEGORY_FRIENDLY + description = "ALL animals and robots become sentient, provided there is enough ghosts." /datum/round_event/ghost_role/sentience/all one = "all" diff --git a/code/modules/events/shuttle_catastrophe b/code/modules/events/shuttle_catastrophe.dm similarity index 94% rename from code/modules/events/shuttle_catastrophe rename to code/modules/events/shuttle_catastrophe.dm index d948b39d3b..2e431a8a34 100644 --- a/code/modules/events/shuttle_catastrophe +++ b/code/modules/events/shuttle_catastrophe.dm @@ -3,6 +3,8 @@ typepath = /datum/round_event/shuttle_catastrophe weight = 10 max_occurrences = 1 + category = EVENT_CATEGORY_BUREAUCRATIC + description = "Replaces the emergency shuttle with a random one." /datum/round_event_control/shuttle_catastrophe/canSpawnEvent(players, gamemode) if(SSshuttle.emergency.name == "Build your own shuttle kit") diff --git a/code/modules/events/shuttle_loan.dm b/code/modules/events/shuttle_loan.dm index 38d52797d7..49a0f94000 100644 --- a/code/modules/events/shuttle_loan.dm +++ b/code/modules/events/shuttle_loan.dm @@ -13,10 +13,12 @@ typepath = /datum/round_event/shuttle_loan max_occurrences = 1 earliest_start = 7 MINUTES + category = EVENT_CATEGORY_BUREAUCRATIC + description = "If cargo accepts the offer, fills the shuttle with loot and/or enemies." /datum/round_event/shuttle_loan - announceWhen = 1 - endWhen = 500 + announce_when = 1 + end_when = 500 var/dispatched = 0 var/dispatch_type = 0 var/bonus_points = 10000 @@ -72,7 +74,7 @@ var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR) if(D) D.adjust_money(bonus_points) - endWhen = activeFor + 1 + end_when = activeFor + 1 SSshuttle.supply.mode = SHUTTLE_CALL SSshuttle.supply.destination = SSshuttle.getDock("supply_home") @@ -101,9 +103,9 @@ /datum/round_event/shuttle_loan/tick() if(dispatched) if(SSshuttle.supply.mode != SHUTTLE_IDLE) - endWhen = activeFor + end_when = activeFor else - endWhen = activeFor + 1 + end_when = activeFor + 1 /datum/round_event/shuttle_loan/end() if(SSshuttle.shuttle_loan && SSshuttle.shuttle_loan.dispatched) diff --git a/code/modules/events/space_dragon.dm b/code/modules/events/space_dragon.dm index e06666b6bb..d06327ec0f 100644 --- a/code/modules/events/space_dragon.dm +++ b/code/modules/events/space_dragon.dm @@ -6,11 +6,13 @@ earliest_start = 30 MINUTES min_players = 20 dynamic_should_hijack = TRUE + category = EVENT_CATEGORY_ENTITIES + description = "Spawns a space dragon, which will try to take over the station." /datum/round_event/ghost_role/space_dragon minimum_required = 1 role_name = "Space Dragon" - announceWhen = 10 + announce_when = 10 /datum/round_event/ghost_role/space_dragon/announce(fake) priority_announce("A large organic energy flux has been recorded near of [station_name()], please stand-by.", "Lifesign Alert", has_important_message = TRUE) diff --git a/code/modules/events/space_ninja.dm b/code/modules/events/space_ninja.dm index 4a9dc4d2eb..aaf3f1a302 100644 --- a/code/modules/events/space_ninja.dm +++ b/code/modules/events/space_ninja.dm @@ -6,6 +6,8 @@ earliest_start = 30 MINUTES min_players = 15 dynamic_should_hijack = TRUE + category = EVENT_CATEGORY_INVASION + description = "A space ninja infiltrates the station." /datum/round_event/ghost_role/space_ninja minimum_required = 1 diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index a96e74f1e4..1bbcb0dd92 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -4,6 +4,8 @@ weight = 15 max_occurrences = 3 min_players = 20 + category = EVENT_CATEGORY_ENTITIES + description = "Kudzu begins to overtake the station. Might spawn man-traps." /datum/round_event/spacevine fakeable = FALSE diff --git a/code/modules/events/spider_infestation.dm b/code/modules/events/spider_infestation.dm index 23ce6ce730..6e8c29d3a9 100644 --- a/code/modules/events/spider_infestation.dm +++ b/code/modules/events/spider_infestation.dm @@ -4,15 +4,17 @@ weight = 5 max_occurrences = 1 min_players = 15 + category = EVENT_CATEGORY_ENTITIES + description = "Spawns spider eggs, ready to hatch." /datum/round_event/spider_infestation - announceWhen = 400 + announce_when = 400 var/spawncount = 1 /datum/round_event/spider_infestation/setup() - announceWhen = rand(announceWhen, announceWhen + 50) + announce_when = rand(announce_when, announce_when + 50) spawncount = rand(5, 8) /datum/round_event/spider_infestation/announce(fake) diff --git a/code/modules/events/spontaneous_appendicitis.dm b/code/modules/events/spontaneous_appendicitis.dm index 7705ece78a..31b14bb8b9 100644 --- a/code/modules/events/spontaneous_appendicitis.dm +++ b/code/modules/events/spontaneous_appendicitis.dm @@ -5,6 +5,8 @@ max_occurrences = 4 earliest_start = 10 MINUTES min_players = 5 // To make your chance of getting help a bit higher. + category = EVENT_CATEGORY_HEALTH + description = "A random crewmember gets appendicitis." /datum/round_event/spontaneous_appendicitis fakeable = FALSE diff --git a/code/modules/events/stray_cargo.dm b/code/modules/events/stray_cargo.dm index 2464432d72..f7240f9e8b 100644 --- a/code/modules/events/stray_cargo.dm +++ b/code/modules/events/stray_cargo.dm @@ -5,6 +5,8 @@ weight = 5 max_occurrences = 4 earliest_start = 10 MINUTES + category = EVENT_CATEGORY_BUREAUCRATIC + description = "A pod containing a random supply crate lands on the station." ///Spawns a cargo pod containing a random cargo supply pack on a random area of the station /datum/round_event/stray_cargo @@ -20,7 +22,7 @@ * Also randomizes the start timer */ /datum/round_event/stray_cargo/setup() - startWhen = rand(20, 40) + start_when = rand(20, 40) impact_area = find_event_area() if(!impact_area) CRASH("No valid areas for cargo pod found.") @@ -89,6 +91,7 @@ weight = 0 max_occurrences = 0 earliest_start = 30 MINUTES + description = "A pod containing syndicate gear lands on the station." /datum/round_event/stray_cargo/syndicate possible_pack_types = list(/datum/supply_pack/misc/syndicate) diff --git a/code/modules/events/supermatter_surge.dm b/code/modules/events/supermatter_surge.dm index d873e6ca8f..08deaae7d5 100644 --- a/code/modules/events/supermatter_surge.dm +++ b/code/modules/events/supermatter_surge.dm @@ -4,6 +4,8 @@ weight = 20 max_occurrences = 5 earliest_start = 10 MINUTES + category = EVENT_CATEGORY_ENGINEERING + description = "Randomly modifies the supermatter's power, giving the engineers a lot of headaches." /datum/round_event_control/supermatter_surge/canSpawnEvent() if(GLOB.main_supermatter_engine?.has_been_powered) diff --git a/code/modules/events/supernova.dm b/code/modules/events/supernova.dm index 7862e85709..16c81e4056 100644 --- a/code/modules/events/supernova.dm +++ b/code/modules/events/supernova.dm @@ -4,18 +4,20 @@ weight = 5 max_occurrences = 1 min_players = 2 + category = EVENT_CATEGORY_SPACE + description = "Several modified radstorms hit the station." /datum/round_event/supernova - announceWhen = 40 - startWhen = 1 - endWhen = 300 + announce_when = 40 + start_when = 1 + end_when = 300 var/power = 1 var/datum/sun/supernova var/storm_count = 0 var/announced = FALSE /datum/round_event/supernova/setup() - announceWhen = rand(4, 60) + announce_when = rand(4, 60) supernova = new SSsun.suns += supernova switch(rand(1,5)) @@ -53,10 +55,10 @@ sucker_light.give_home_power() /datum/round_event/supernova/tick() - var/midpoint = round((endWhen-startWhen)/2) + var/midpoint = round((end_when-start_when)/2) if(activeFor < midpoint) supernova.power_mod = min(supernova.power_mod*1.2, power) - if(activeFor > endWhen-10) + if(activeFor > end_when-10) supernova.power_mod /= 4 if(prob(round(supernova.power_mod)) && prob(5-storm_count) && !SSweather.get_weather_by_type(/datum/weather/rad_storm)) SSweather.run_weather(/datum/weather/rad_storm/supernova) diff --git a/code/modules/events/travelling_trader.dm b/code/modules/events/travelling_trader.dm index be697c9b6d..ac9d103f5f 100644 --- a/code/modules/events/travelling_trader.dm +++ b/code/modules/events/travelling_trader.dm @@ -4,10 +4,12 @@ weight = 8 max_occurrences = 2 earliest_start = 0 MINUTES + category = EVENT_CATEGORY_FRIENDLY + description = "A mysterious figure requests something to the crew and rewards them with something for getting it done." /datum/round_event/travelling_trader - startWhen = 0 - endWhen = 900 //you effectively have 15 minutes to complete the traders request, before they disappear + start_when = 0 + end_when = 900 //you effectively have 15 minutes to complete the traders request, before they disappear var/mob/living/carbon/human/dummy/travelling_trader/trader var/atom/spawn_location //where the trader appears diff --git a/code/modules/events/untie_shoes.dm b/code/modules/events/untie_shoes.dm index 5a0da3ebc2..17dd2ca8b2 100644 --- a/code/modules/events/untie_shoes.dm +++ b/code/modules/events/untie_shoes.dm @@ -4,6 +4,8 @@ weight = 50 max_occurrences = 10 alert_observers = FALSE + category = EVENT_CATEGORY_HEALTH + description = "Unties people's shoes, with a chance to knot them as well." /datum/round_event/untied_shoes fakeable = FALSE diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm index 2c03531bcc..fb88f81598 100644 --- a/code/modules/events/vent_clog.dm +++ b/code/modules/events/vent_clog.dm @@ -3,11 +3,13 @@ typepath = /datum/round_event/vent_clog weight = 10 max_occurrences = 3 + category = EVENT_CATEGORY_HEALTH + description = "All the scrubbers onstation spit random chemicals in smoke form." /datum/round_event/vent_clog - announceWhen = 1 - startWhen = 5 - endWhen = 35 + announce_when = 1 + start_when = 5 + end_when = 35 var/interval = 2 var/list/vents = list() var/randomProbability = 0 @@ -62,7 +64,7 @@ priority_announce("The scrubbers network is experiencing a backpressure surge. Some ejection of contents may occur.", "Atmospherics alert", has_important_message = TRUE) /datum/round_event/vent_clog/setup() - endWhen = rand(120, 180) + end_when = rand(120, 180) for(var/obj/machinery/atmospherics/components/unary/vent_scrubber/temp_vent in GLOB.machines) var/turf/T = get_turf(temp_vent) var/area/A = T.loc @@ -108,6 +110,7 @@ min_players = 15 max_occurrences = 1 earliest_start = 35 MINUTES + description = "Extra dangerous chemicals come out of the scrubbers." /datum/round_event/vent_clog/threatening randomProbability = 10 @@ -120,6 +123,7 @@ min_players = 25 max_occurrences = 1 earliest_start = 45 MINUTES + description = "EXTREMELY dangerous chemicals come out of the scrubbers." /datum/round_event/vent_clog/catastrophic randomProbability = 30 @@ -129,6 +133,7 @@ name = "Clogged Vents: Beer" typepath = /datum/round_event/vent_clog/beer max_occurrences = 0 + description = "Spits out beer through the scrubber system." /datum/round_event/vent_clog/beer reagentsAmount = 100 @@ -137,6 +142,7 @@ name = "Anti-Plasma Flood" typepath = /datum/round_event/vent_clog/plasma_decon max_occurrences = 0 + description = "Freezing smoke comes out of the scrubbers." /datum/round_event/vent_clog/beer/announce() priority_announce("The scrubbers network is experiencing an unexpected surge of pressurized beer. Some ejection of contents may occur.", "Atmospherics alert") diff --git a/code/modules/events/wisdomcow.dm b/code/modules/events/wisdomcow.dm index 553dd8f309..3c03911d1d 100644 --- a/code/modules/events/wisdomcow.dm +++ b/code/modules/events/wisdomcow.dm @@ -3,6 +3,8 @@ typepath = /datum/round_event/wisdomcow max_occurrences = 1 weight = 10 + category = EVENT_CATEGORY_FRIENDLY + description = "A cow appears to tell you wise words." /datum/round_event/wisdomcow/announce(fake) priority_announce("A wise cow has been spotted in the area. Be sure to ask for her advice.", "Nanotrasen Cow Ranching Agency") diff --git a/code/modules/events/wizard/aid.dm b/code/modules/events/wizard/aid.dm index 5f49b48900..2380027284 100644 --- a/code/modules/events/wizard/aid.dm +++ b/code/modules/events/wizard/aid.dm @@ -6,6 +6,7 @@ typepath = /datum/round_event/wizard/robelesscasting max_occurrences = 1 earliest_start = 0 MINUTES + description = "Wizard no longer needs robes to cast spells." /datum/round_event/wizard/robelesscasting/start() @@ -28,6 +29,7 @@ typepath = /datum/round_event/wizard/improvedcasting max_occurrences = 4 //because that'd be max level spells earliest_start = 0 MINUTES + description = "Levels up the wizard's spells." /datum/round_event/wizard/improvedcasting/start() for(var/i in GLOB.mob_living_list) diff --git a/code/modules/events/wizard/blobies.dm b/code/modules/events/wizard/blobies.dm index 7438b462f6..6933847f80 100644 --- a/code/modules/events/wizard/blobies.dm +++ b/code/modules/events/wizard/blobies.dm @@ -3,6 +3,7 @@ weight = 3 typepath = /datum/round_event/wizard/blobies max_occurrences = 3 + description = "Spawns a blob spore on every corpse." /datum/round_event/wizard/blobies/start() diff --git a/code/modules/events/wizard/curseditems.dm b/code/modules/events/wizard/curseditems.dm index 061de0ea7c..639673ac15 100644 --- a/code/modules/events/wizard/curseditems.dm +++ b/code/modules/events/wizard/curseditems.dm @@ -5,6 +5,7 @@ max_occurrences = 3 earliest_start = 0 MINUTES can_be_midround_wizard = FALSE + description = "Gives everyone a cursed item." //Note about adding items to this: Because of how NODROP_1 works if an item spawned to the hands can also be equiped to a slot //it will be able to be put into that slot from the hand, but then get stuck there. To avoid this make a new subtype of any diff --git a/code/modules/events/wizard/departmentrevolt.dm b/code/modules/events/wizard/departmentrevolt.dm index ce6b4802fa..f08a40751d 100644 --- a/code/modules/events/wizard/departmentrevolt.dm +++ b/code/modules/events/wizard/departmentrevolt.dm @@ -5,6 +5,7 @@ max_occurrences = 1 earliest_start = 0 MINUTES can_be_midround_wizard = FALSE // not removing it completely yet + description = "A department is turned into an independent state." /datum/round_event/wizard/deprevolt/start() diff --git a/code/modules/events/wizard/embeddies.dm b/code/modules/events/wizard/embeddies.dm index fe08b9c743..32c9affb6d 100644 --- a/code/modules/events/wizard/embeddies.dm +++ b/code/modules/events/wizard/embeddies.dm @@ -4,6 +4,7 @@ typepath = /datum/round_event/wizard/embedpocalypse max_occurrences = 1 earliest_start = 0 MINUTES + description = "Everything becomes pointy enough to embed in people when thrown." /datum/round_event/wizard/embedpocalypse/start() for(var/obj/item/I in world) @@ -26,6 +27,7 @@ typepath = /datum/round_event/wizard/embedpocalypse/sticky max_occurrences = 1 earliest_start = 0 MINUTES + description = "Everything becomes sticky enough to be glued to people when thrown." /datum/round_event_control/wizard/embedpocalypse/sticky/canSpawnEvent(players_amt, gamemode) if(GLOB.embedpocalypse) diff --git a/code/modules/events/wizard/fakeexplosion.dm b/code/modules/events/wizard/fakeexplosion.dm index 3ba20f4768..7a89fc14bd 100644 --- a/code/modules/events/wizard/fakeexplosion.dm +++ b/code/modules/events/wizard/fakeexplosion.dm @@ -4,6 +4,7 @@ typepath = /datum/round_event/wizard/fake_explosion max_occurrences = 1 earliest_start = 0 MINUTES + description = "The nuclear explosion cutscene begins to play to scare the crew." /datum/round_event/wizard/fake_explosion/start() sound_to_playing_players('sound/machines/alarm.ogg') diff --git a/code/modules/events/wizard/ghost.dm b/code/modules/events/wizard/ghost.dm index c288953efb..5a11616b8f 100644 --- a/code/modules/events/wizard/ghost.dm +++ b/code/modules/events/wizard/ghost.dm @@ -4,6 +4,7 @@ typepath = /datum/round_event/wizard/ghost max_occurrences = 1 earliest_start = 0 MINUTES + description = "Ghosts become visible." /datum/round_event/wizard/ghost/start() var/msg = "You suddenly feel extremely obvious..." @@ -18,6 +19,7 @@ typepath = /datum/round_event/wizard/possession max_occurrences = 5 earliest_start = 0 MINUTES + description = "Ghosts become visible and gain the power of possession." /datum/round_event/wizard/possession/start() for(var/mob/dead/observer/G in GLOB.player_list) diff --git a/code/modules/events/wizard/greentext.dm b/code/modules/events/wizard/greentext.dm index 82e72df3b9..1864ad6d20 100644 --- a/code/modules/events/wizard/greentext.dm +++ b/code/modules/events/wizard/greentext.dm @@ -4,6 +4,7 @@ typepath = /datum/round_event/wizard/greentext max_occurrences = 1 earliest_start = 0 MINUTES + description = "The Green Text appears on the station, tempting people to try and pick it up." /datum/round_event/wizard/greentext/start() diff --git a/code/modules/events/wizard/imposter.dm b/code/modules/events/wizard/imposter.dm index 29704168e9..2b7e9bcf17 100644 --- a/code/modules/events/wizard/imposter.dm +++ b/code/modules/events/wizard/imposter.dm @@ -4,6 +4,7 @@ typepath = /datum/round_event/wizard/imposter max_occurrences = 1 earliest_start = 0 MINUTES + description = "Spawns a doppelganger of the wizard." /datum/round_event/wizard/imposter/start() for(var/datum/mind/M in SSticker.mode.wizards) diff --git a/code/modules/events/wizard/invincible.dm b/code/modules/events/wizard/invincible.dm index b69d1541ee..0dea1fbaf7 100644 --- a/code/modules/events/wizard/invincible.dm +++ b/code/modules/events/wizard/invincible.dm @@ -4,6 +4,7 @@ typepath = /datum/round_event/wizard/invincible max_occurrences = 5 earliest_start = 0 MINUTES + description = "Everyone is invincible for a short time ticks." /datum/round_event/wizard/invincible/start() diff --git a/code/modules/events/wizard/lava.dm b/code/modules/events/wizard/lava.dm index 9a882b45df..75962c81ad 100644 --- a/code/modules/events/wizard/lava.dm +++ b/code/modules/events/wizard/lava.dm @@ -4,9 +4,10 @@ typepath = /datum/round_event/wizard/lava max_occurrences = 3 earliest_start = 0 MINUTES + description = "Turns the floor into hot lava." /datum/round_event/wizard/lava - endWhen = 0 + end_when = 0 var/started = FALSE /datum/round_event/wizard/lava/start() diff --git a/code/modules/events/wizard/madness.dm b/code/modules/events/wizard/madness.dm index ac86236623..de2c30a032 100644 --- a/code/modules/events/wizard/madness.dm +++ b/code/modules/events/wizard/madness.dm @@ -3,6 +3,7 @@ weight = 1 typepath = /datum/round_event/wizard/madness earliest_start = 0 MINUTES + description = "Reveals a horrifying truth to everyone, giving them a trauma." var/forced_secret diff --git a/code/modules/events/wizard/magicarp.dm b/code/modules/events/wizard/magicarp.dm index 052143722e..b900a2da9f 100644 --- a/code/modules/events/wizard/magicarp.dm +++ b/code/modules/events/wizard/magicarp.dm @@ -4,13 +4,14 @@ typepath = /datum/round_event/wizard/magicarp max_occurrences = 1 earliest_start = 0 MINUTES + description = "Summons a school of carps with magic projectiles." /datum/round_event/wizard/magicarp - announceWhen = 3 - startWhen = 50 + announce_when = 3 + start_when = 50 /datum/round_event/wizard/magicarp/setup() - startWhen = rand(40, 60) + start_when = rand(40, 60) /datum/round_event/wizard/magicarp/announce(fake) priority_announce("Unknown magical entities have been detected near [station_name()], please stand-by.", "Lifesign Alert") diff --git a/code/modules/events/wizard/petsplosion.dm b/code/modules/events/wizard/petsplosion.dm index fb4d433905..ff3ebdd128 100644 --- a/code/modules/events/wizard/petsplosion.dm +++ b/code/modules/events/wizard/petsplosion.dm @@ -5,6 +5,7 @@ max_occurrences = 1 //Exponential growth is nothing to sneeze at! earliest_start = 0 MINUTES var/mobs_to_dupe = 0 + description = "Rapidly multiplies the animals on the station." /datum/round_event_control/wizard/petsplosion/preRunEvent() for(var/mob/living/simple_animal/F in GLOB.alive_mob_list) @@ -16,7 +17,7 @@ ..() /datum/round_event/wizard/petsplosion - endWhen = 61 //1 minute (+1 tick for endWhen not to interfere with tick) + end_when = 61 //1 minute (+1 tick for end_when not to interfere with tick) var/countdown = 0 var/mobs_duped = 0 diff --git a/code/modules/events/wizard/race.dm b/code/modules/events/wizard/race.dm index 5c3b8432c1..8c45a9504b 100644 --- a/code/modules/events/wizard/race.dm +++ b/code/modules/events/wizard/race.dm @@ -5,6 +5,7 @@ max_occurrences = 5 earliest_start = 0 MINUTES can_be_midround_wizard = FALSE + description = "Gives everyone a random race." /datum/round_event/wizard/race var/list/stored_name @@ -16,7 +17,7 @@ stored_name = list() stored_species = list() stored_dna = list() - endWhen = rand(600,1200) //10 to 20 minutes + end_when = rand(600,1200) //10 to 20 minutes ..() /datum/round_event/wizard/race/start() diff --git a/code/modules/events/wizard/rpgloot.dm b/code/modules/events/wizard/rpgloot.dm index bf3104450e..911a9bf665 100644 --- a/code/modules/events/wizard/rpgloot.dm +++ b/code/modules/events/wizard/rpgloot.dm @@ -4,6 +4,7 @@ typepath = /datum/round_event/wizard/rpgloot max_occurrences = 1 earliest_start = 0 MINUTES + description = "Every item in the world will have fantastical names." /datum/round_event/wizard/rpgloot/start() var/upgrade_scroll_chance = 0 diff --git a/code/modules/events/wizard/shuffle.dm b/code/modules/events/wizard/shuffle.dm index 18b8c8e21c..5659818b48 100644 --- a/code/modules/events/wizard/shuffle.dm +++ b/code/modules/events/wizard/shuffle.dm @@ -8,6 +8,7 @@ max_occurrences = 5 earliest_start = 0 MINUTES can_be_midround_wizard = FALSE // not removing it completely yet + description = "Shuffles everyone around on the station." /datum/round_event/wizard/shuffleloc/start() var/list/moblocs = list() @@ -45,6 +46,7 @@ max_occurrences = 5 earliest_start = 0 MINUTES can_be_midround_wizard = FALSE // not removing it completely yet + description = "Shuffles the names of everyone around the station." /datum/round_event/wizard/shufflenames/start() var/list/mobnames = list() @@ -80,6 +82,7 @@ max_occurrences = 3 earliest_start = 0 MINUTES can_be_midround_wizard = FALSE // not removing it completely yet + description = "Shuffles the minds of everyone around the station, except for the wizard." /datum/round_event/wizard/shuffleminds/start() var/list/mobs = list() diff --git a/code/modules/events/wizard/summons.dm b/code/modules/events/wizard/summons.dm index ac1160e0f5..886dfdfd10 100644 --- a/code/modules/events/wizard/summons.dm +++ b/code/modules/events/wizard/summons.dm @@ -5,6 +5,7 @@ max_occurrences = 1 earliest_start = 0 MINUTES can_be_midround_wizard = FALSE // not removing it completely yet + description = "Summons a gun for everyone. Might turn people into survivalists." /datum/round_event_control/wizard/summonguns/New() if(CONFIG_GET(flag/no_summon_guns)) @@ -21,6 +22,7 @@ max_occurrences = 1 earliest_start = 0 MINUTES can_be_midround_wizard = FALSE // not removing it completely yet + description = "Summons a magic item for everyone. Might turn people into survivalists." /datum/round_event_control/wizard/summonmagic/New() if(CONFIG_GET(flag/no_summon_magic)) diff --git a/code/modules/events/wormholes.dm b/code/modules/events/wormholes.dm index 3207e3b635..413658e34d 100644 --- a/code/modules/events/wormholes.dm +++ b/code/modules/events/wormholes.dm @@ -4,11 +4,12 @@ max_occurrences = 3 weight = 2 min_players = 2 - + category = EVENT_CATEGORY_SPACE + description = "Space time anomalies appear on the station, randomly teleporting people who walk into them." /datum/round_event/wormholes - announceWhen = 10 - endWhen = 60 + announce_when = 10 + end_when = 60 var/list/pick_turfs = list() var/list/wormholes = list() @@ -16,8 +17,8 @@ var/number_of_wormholes = 400 /datum/round_event/wormholes/setup() - announceWhen = rand(0, 20) - endWhen = rand(40, 80) + announce_when = rand(0, 20) + end_when = rand(40, 80) /datum/round_event/wormholes/start() for(var/turf/open/floor/T in world) diff --git a/code/modules/holiday/easter.dm b/code/modules/holiday/easter.dm index 10b825440a..9c538f4bde 100644 --- a/code/modules/holiday/easter.dm +++ b/code/modules/holiday/easter.dm @@ -5,6 +5,8 @@ weight = -1 max_occurrences = 1 earliest_start = 0 MINUTES + category = EVENT_CATEGORY_HOLIDAY + description = "Hides surprise filled easter eggs in maintenance." /datum/round_event/easter/announce(fake) priority_announce(pick("Hip-hop into Easter!","Find some Bunny's stash!","Today is National 'Hunt a Wabbit' Day.","Be kind, give Chocolate Eggs!")) @@ -16,6 +18,8 @@ typepath = /datum/round_event/rabbitrelease weight = 5 max_occurrences = 10 + category = EVENT_CATEGORY_HOLIDAY + description = "Summons a wave of cute rabbits." /datum/round_event/rabbitrelease/announce(fake) priority_announce("Unidentified furry objects detected coming aboard [station_name()]. Beware of Adorable-ness.", "Fluffy Alert", "aliens") diff --git a/code/modules/holiday/halloween/jacqueen.dm b/code/modules/holiday/halloween/jacqueen.dm index 5dd8ad9155..8ef60d8b54 100644 --- a/code/modules/holiday/halloween/jacqueen.dm +++ b/code/modules/holiday/halloween/jacqueen.dm @@ -15,6 +15,8 @@ weight = -1 //forces it to be called, regardless of weight max_occurrences = 1 earliest_start = 0 MINUTES + category = EVENT_CATEGORY_HOLIDAY + description = "Spawns Jacq, a friendly mob that gives players a couple fun stuff to do." /datum/round_event/jacqueen/start() ..() diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index 3a40f217dc..7a5ffbbbae 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -69,6 +69,9 @@ ///Is this job affected by weird spawns like the ones from station traits var/random_spawns_possible = TRUE + /// List of family heirlooms this job can get with the family heirloom quirk. List of types. + var/list/family_heirlooms + var/display_order = JOB_DISPLAY_ORDER_DEFAULT var/bounty_types = CIV_JOB_BASIC diff --git a/code/modules/jobs/job_types/assistant.dm b/code/modules/jobs/job_types/assistant.dm index db5390f323..7ce29db178 100644 --- a/code/modules/jobs/job_types/assistant.dm +++ b/code/modules/jobs/job_types/assistant.dm @@ -20,6 +20,11 @@ Assistant dresscodecompliant = FALSE always_can_respawn_as = TRUE threat = 0.2 + + family_heirlooms = list( + /obj/item/storage/toolbox/mechanical/old/heirloom, + /obj/item/clothing/gloves/cut/family + ) /datum/job/assistant/get_access() if(CONFIG_GET(flag/assistants_have_maint_access) || !CONFIG_GET(flag/jobs_have_minimal_access)) //Config has assistant maint access set diff --git a/code/modules/jobs/job_types/atmospheric_technician.dm b/code/modules/jobs/job_types/atmospheric_technician.dm index 9aa8ea07c4..551ac63d00 100644 --- a/code/modules/jobs/job_types/atmospheric_technician.dm +++ b/code/modules/jobs/job_types/atmospheric_technician.dm @@ -26,6 +26,12 @@ display_order = JOB_DISPLAY_ORDER_ATMOSPHERIC_TECHNICIAN threat = 0.5 + + family_heirlooms = list( + /obj/item/lighter, + /obj/item/lighter/greyscale, + /obj/item/storage/box/matches + ) /datum/outfit/job/atmos name = "Atmospheric Technician" diff --git a/code/modules/jobs/job_types/bartender.dm b/code/modules/jobs/job_types/bartender.dm index 70ca762f39..40a1b20cb1 100644 --- a/code/modules/jobs/job_types/bartender.dm +++ b/code/modules/jobs/job_types/bartender.dm @@ -20,6 +20,12 @@ bounty_types = CIV_JOB_DRINK display_order = JOB_DISPLAY_ORDER_BARTENDER threat = 0.5 + + family_heirlooms = list( + /obj/item/reagent_containers/rag, + /obj/item/clothing/head/that, + /obj/item/reagent_containers/food/drinks/shaker + ) /datum/outfit/job/bartender name = "Bartender" diff --git a/code/modules/jobs/job_types/botanist.dm b/code/modules/jobs/job_types/botanist.dm index 53502ee30e..7a43837cf4 100644 --- a/code/modules/jobs/job_types/botanist.dm +++ b/code/modules/jobs/job_types/botanist.dm @@ -20,6 +20,12 @@ display_order = JOB_DISPLAY_ORDER_BOTANIST threat = 1.5 // lol powergame + family_heirlooms = list( + /obj/item/cultivator, + /obj/item/reagent_containers/glass/bucket, // Watering cans don't exist yet + /obj/item/toy/plush/beeplushie, + ) + /datum/outfit/job/botanist name = "Botanist" jobtype = /datum/job/hydro diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index c3765260cc..65811d40a0 100644 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -32,6 +32,11 @@ blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity) threat = 5 + + family_heirlooms = list( + /obj/item/reagent_containers/food/drinks/flask/gold, + /obj/item/toy/figure/captain + ) /datum/job/captain/get_access() return get_all_accesses() diff --git a/code/modules/jobs/job_types/cargo_technician.dm b/code/modules/jobs/job_types/cargo_technician.dm index f8e2f74d80..1188669db5 100644 --- a/code/modules/jobs/job_types/cargo_technician.dm +++ b/code/modules/jobs/job_types/cargo_technician.dm @@ -21,6 +21,10 @@ display_order = JOB_DISPLAY_ORDER_CARGO_TECHNICIAN bounty_types = CIV_JOB_RANDOM threat = 0.2 + + family_heirlooms = list( + /obj/item/clipboard + ) /datum/outfit/job/cargo_tech name = "Cargo Technician" diff --git a/code/modules/jobs/job_types/chaplain.dm b/code/modules/jobs/job_types/chaplain.dm index ef4f20765c..e7d602bd22 100644 --- a/code/modules/jobs/job_types/chaplain.dm +++ b/code/modules/jobs/job_types/chaplain.dm @@ -19,6 +19,11 @@ display_order = JOB_DISPLAY_ORDER_CHAPLAIN threat = 0.5 + + family_heirlooms = list( + /obj/item/toy/windupToolbox, + /obj/item/reagent_containers/food/drinks/bottle/holywater + ) /datum/job/chaplain/after_spawn(mob/living/H, client/C) diff --git a/code/modules/jobs/job_types/chemist.dm b/code/modules/jobs/job_types/chemist.dm index 209b3f82d0..9f830ba43c 100644 --- a/code/modules/jobs/job_types/chemist.dm +++ b/code/modules/jobs/job_types/chemist.dm @@ -24,6 +24,11 @@ threat = 1.5 starting_modifiers = list(/datum/skill_modifier/job/surgery, /datum/skill_modifier/job/affinity/surgery) + + family_heirlooms = list( + /obj/item/book/manual/wiki/chemistry, + /obj/item/fermichem/pHbooklet + ) /datum/outfit/job/chemist name = "Chemist" diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm index 60b963d7ec..2949758d8a 100644 --- a/code/modules/jobs/job_types/chief_engineer.dm +++ b/code/modules/jobs/job_types/chief_engineer.dm @@ -37,6 +37,15 @@ display_order = JOB_DISPLAY_ORDER_CHIEF_ENGINEER blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/paraplegic, /datum/quirk/insanity) threat = 2 + + family_heirlooms = list( + /obj/item/clothing/head/hardhat, + /obj/item/screwdriver/brass/family, + /obj/item/wrench/brass/family, + /obj/item/weldingtool/mini, // No brass family variant + /obj/item/crowbar/brass/family, + /obj/item/wirecutters/brass/family + ) /datum/outfit/job/ce name = "Chief Engineer" diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm index 401b503110..f5170fc745 100644 --- a/code/modules/jobs/job_types/chief_medical_officer.dm +++ b/code/modules/jobs/job_types/chief_medical_officer.dm @@ -35,6 +35,15 @@ threat = 2 starting_modifiers = list(/datum/skill_modifier/job/surgery, /datum/skill_modifier/job/affinity/surgery) + + family_heirlooms = list( + /obj/item/storage/firstaid/ancient/heirloom, + /obj/item/scalpel, + /obj/item/hemostat, + /obj/item/circular_saw, + /obj/item/retractor, + /obj/item/cautery + ) /datum/outfit/job/cmo name = "Chief Medical Officer" diff --git a/code/modules/jobs/job_types/clown.dm b/code/modules/jobs/job_types/clown.dm index 380215a93b..5631ce4624 100644 --- a/code/modules/jobs/job_types/clown.dm +++ b/code/modules/jobs/job_types/clown.dm @@ -21,6 +21,10 @@ display_order = JOB_DISPLAY_ORDER_CLOWN threat = 0 // honk + + family_heirlooms = list( + /obj/item/bikehorn/golden + ) /datum/outfit/job/clown name = "Clown" diff --git a/code/modules/jobs/job_types/cook.dm b/code/modules/jobs/job_types/cook.dm index 2a021e6575..9947c27ba9 100644 --- a/code/modules/jobs/job_types/cook.dm +++ b/code/modules/jobs/job_types/cook.dm @@ -22,6 +22,12 @@ display_order = JOB_DISPLAY_ORDER_COOK threat = 0.2 + family_heirlooms = list( + /obj/item/reagent_containers/food/condiment/saltshaker, + /obj/item/kitchen/rollingpin, + /obj/item/clothing/head/chefhat + ) + /datum/outfit/job/cook name = "Cook" jobtype = /datum/job/cook diff --git a/code/modules/jobs/job_types/curator.dm b/code/modules/jobs/job_types/curator.dm index 254fc15bd4..e6e9394109 100644 --- a/code/modules/jobs/job_types/curator.dm +++ b/code/modules/jobs/job_types/curator.dm @@ -19,6 +19,11 @@ display_order = JOB_DISPLAY_ORDER_CURATOR threat = 0.3 + + family_heirlooms = list( + /obj/item/pen/fountain, + /obj/item/storage/dice + ) /datum/outfit/job/curator name = "Curator" diff --git a/code/modules/jobs/job_types/detective.dm b/code/modules/jobs/job_types/detective.dm index b56ebed191..2330e93147 100644 --- a/code/modules/jobs/job_types/detective.dm +++ b/code/modules/jobs/job_types/detective.dm @@ -27,6 +27,10 @@ display_order = JOB_DISPLAY_ORDER_DETECTIVE blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent, /datum/quirk/paraplegic, /datum/quirk/monophobia) threat = 1 + + family_heirlooms = list( + /obj/item/reagent_containers/food/drinks/flask/det + ) /datum/outfit/job/detective name = "Detective" diff --git a/code/modules/jobs/job_types/geneticist.dm b/code/modules/jobs/job_types/geneticist.dm index 611c3f99cd..2529eaa024 100644 --- a/code/modules/jobs/job_types/geneticist.dm +++ b/code/modules/jobs/job_types/geneticist.dm @@ -24,6 +24,10 @@ threat = 1.5 starting_modifiers = list(/datum/skill_modifier/job/surgery, /datum/skill_modifier/job/affinity/surgery) + + family_heirlooms = list( + /obj/item/clothing/under/shorts/purple + ) /datum/outfit/job/geneticist name = "Geneticist" diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm index b4339ab774..033c3ebfa4 100644 --- a/code/modules/jobs/job_types/head_of_personnel.dm +++ b/code/modules/jobs/job_types/head_of_personnel.dm @@ -39,6 +39,10 @@ blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/prosopagnosia, /datum/quirk/insanity) threat = 2 + + family_heirlooms = list( + /obj/item/reagent_containers/food/drinks/trophy/silver_cup + ) /datum/outfit/job/hop diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm index ab58f20569..c998580cae 100644 --- a/code/modules/jobs/job_types/head_of_security.dm +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -39,6 +39,10 @@ blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent, /datum/quirk/paraplegic, /datum/quirk/blindness, /datum/quirk/monophobia, /datum/quirk/insanity) threat = 3 + family_heirlooms = list( + /obj/item/book/manual/wiki/security_space_law + ) + /datum/outfit/job/hos name = "Head of Security" jobtype = /datum/job/hos @@ -47,7 +51,7 @@ belt = /obj/item/pda/heads/hos ears = /obj/item/radio/headset/heads/hos/alt uniform = /obj/item/clothing/under/rank/security/head_of_security - shoes = /obj/item/clothing/shoes/jackboots + shoes = /obj/item/clothing/shoes/jackboots/sec suit = /obj/item/clothing/suit/armor/hos/trenchcoat gloves = /obj/item/clothing/gloves/color/black head = /obj/item/clothing/head/HoS/beret diff --git a/code/modules/jobs/job_types/janitor.dm b/code/modules/jobs/job_types/janitor.dm index c62c2e5b26..59c6997398 100644 --- a/code/modules/jobs/job_types/janitor.dm +++ b/code/modules/jobs/job_types/janitor.dm @@ -19,6 +19,13 @@ display_order = JOB_DISPLAY_ORDER_JANITOR threat = 0.2 + + family_heirlooms = list( + /obj/item/mop, + /obj/item/clothing/suit/caution, + /obj/item/reagent_containers/glass/bucket, + /obj/item/soap + ) /datum/outfit/job/janitor name = "Janitor" diff --git a/code/modules/jobs/job_types/lawyer.dm b/code/modules/jobs/job_types/lawyer.dm index 17c376a5de..4105bd4e6e 100644 --- a/code/modules/jobs/job_types/lawyer.dm +++ b/code/modules/jobs/job_types/lawyer.dm @@ -22,6 +22,11 @@ display_order = JOB_DISPLAY_ORDER_LAWYER threat = 0.3 + + family_heirlooms = list( + /obj/item/gavelhammer, + /obj/item/book/manual/wiki/security_space_law + ) /datum/outfit/job/lawyer name = "Lawyer" diff --git a/code/modules/jobs/job_types/medical_doctor.dm b/code/modules/jobs/job_types/medical_doctor.dm index 75a85c88d1..b0a0375517 100644 --- a/code/modules/jobs/job_types/medical_doctor.dm +++ b/code/modules/jobs/job_types/medical_doctor.dm @@ -22,6 +22,15 @@ threat = 0.5 starting_modifiers = list(/datum/skill_modifier/job/surgery, /datum/skill_modifier/job/affinity/surgery) + + family_heirlooms = list( + /obj/item/storage/firstaid/ancient/heirloom, + /obj/item/scalpel, + /obj/item/hemostat, + /obj/item/circular_saw, + /obj/item/retractor, + /obj/item/cautery + ) /datum/outfit/job/doctor name = "Medical Doctor" diff --git a/code/modules/jobs/job_types/mime.dm b/code/modules/jobs/job_types/mime.dm index 171e0cef8a..84d6bcb1a7 100644 --- a/code/modules/jobs/job_types/mime.dm +++ b/code/modules/jobs/job_types/mime.dm @@ -20,6 +20,10 @@ display_order = JOB_DISPLAY_ORDER_MIME threat = 0 + + family_heirlooms = list( + /obj/item/reagent_containers/food/snacks/baguette + ) /datum/job/mime/after_spawn(mob/living/carbon/human/H, client/C) . = ..() diff --git a/code/modules/jobs/job_types/paramedic.dm b/code/modules/jobs/job_types/paramedic.dm index fd802edc46..a0d7529aae 100644 --- a/code/modules/jobs/job_types/paramedic.dm +++ b/code/modules/jobs/job_types/paramedic.dm @@ -23,6 +23,10 @@ threat = 0.5 starting_modifiers = list(/datum/skill_modifier/job/surgery, /datum/skill_modifier/job/affinity/surgery) + + family_heirlooms = list( + /obj/item/storage/firstaid/ancient/heirloom + ) /datum/outfit/job/paramedic name = "Paramedic" diff --git a/code/modules/jobs/job_types/prisoner.dm b/code/modules/jobs/job_types/prisoner.dm index 06eafe649b..20a2f463f5 100644 --- a/code/modules/jobs/job_types/prisoner.dm +++ b/code/modules/jobs/job_types/prisoner.dm @@ -13,6 +13,10 @@ plasma_outfit = /datum/outfit/plasmaman/prisoner display_order = JOB_DISPLAY_ORDER_PRISONER + + family_heirlooms = list( + /obj/item/pen/blue + ) /datum/job/prisoner/get_latejoin_spawn_point() return get_roundstart_spawn_point() diff --git a/code/modules/jobs/job_types/quartermaster.dm b/code/modules/jobs/job_types/quartermaster.dm index 67d14365ed..8a211ae993 100644 --- a/code/modules/jobs/job_types/quartermaster.dm +++ b/code/modules/jobs/job_types/quartermaster.dm @@ -33,6 +33,11 @@ display_order = JOB_DISPLAY_ORDER_QUARTERMASTER blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity) threat = 0.5 + + family_heirlooms = list( + /obj/item/stamp, + /obj/item/stamp/denied + ) /datum/outfit/job/quartermaster name = "Quartermaster" diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm index 178bcc3188..606c34af5e 100644 --- a/code/modules/jobs/job_types/research_director.dm +++ b/code/modules/jobs/job_types/research_director.dm @@ -38,6 +38,10 @@ starting_modifiers = list(/datum/skill_modifier/job/level/wiring) blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity) threat = 5 + + family_heirlooms = list( + /obj/item/toy/plush/slimeplushie + ) /datum/outfit/job/rd name = "Research Director" diff --git a/code/modules/jobs/job_types/roboticist.dm b/code/modules/jobs/job_types/roboticist.dm index 6f7b91571b..0e48467d91 100644 --- a/code/modules/jobs/job_types/roboticist.dm +++ b/code/modules/jobs/job_types/roboticist.dm @@ -24,6 +24,10 @@ display_order = JOB_DISPLAY_ORDER_ROBOTICIST threat = 1 + + family_heirlooms = list( + /obj/item/toy/figure/borg + ) /datum/outfit/job/roboticist name = "Roboticist" diff --git a/code/modules/jobs/job_types/scientist.dm b/code/modules/jobs/job_types/scientist.dm index 10e3f58594..4bdbe6833b 100644 --- a/code/modules/jobs/job_types/scientist.dm +++ b/code/modules/jobs/job_types/scientist.dm @@ -22,6 +22,10 @@ starting_modifiers = list(/datum/skill_modifier/job/level/wiring/basic) display_order = JOB_DISPLAY_ORDER_SCIENTIST threat = 1.2 + + family_heirlooms = list( + /obj/item/toy/plush/slimeplushie + ) /datum/outfit/job/scientist name = "Scientist" diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index b59a58db73..f4a234d9b2 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -29,6 +29,11 @@ blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent, /datum/quirk/paraplegic, /datum/quirk/blindness, /datum/quirk/monophobia) threat = 2 + family_heirlooms = list( + /obj/item/book/manual/wiki/security_space_law, + /obj/item/clothing/head/beret/sec + ) + /datum/job/officer/get_access() var/list/L = list() L |= ..() | check_config_for_sec_maint() @@ -126,7 +131,7 @@ GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, S gloves = /obj/item/clothing/gloves/color/black head = /obj/item/clothing/head/helmet/sec suit = /obj/item/clothing/suit/armor/vest/alt - shoes = /obj/item/clothing/shoes/jackboots + shoes = /obj/item/clothing/shoes/jackboots/sec l_pocket = /obj/item/restraints/handcuffs r_pocket = /obj/item/assembly/flash/handheld backpack_contents = list(/obj/item/melee/baton/loaded=1) diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm index e693335779..c6192280c7 100644 --- a/code/modules/jobs/job_types/shaft_miner.dm +++ b/code/modules/jobs/job_types/shaft_miner.dm @@ -24,6 +24,11 @@ display_order = JOB_DISPLAY_ORDER_SHAFT_MINER threat = 1.5 + + family_heirlooms = list( + /obj/item/pickaxe/mini, + /obj/item/shovel + ) /datum/outfit/job/miner name = "Shaft Miner (Lavaland)" diff --git a/code/modules/jobs/job_types/station_engineer.dm b/code/modules/jobs/job_types/station_engineer.dm index e2248362d0..58822dc4c5 100644 --- a/code/modules/jobs/job_types/station_engineer.dm +++ b/code/modules/jobs/job_types/station_engineer.dm @@ -27,6 +27,15 @@ display_order = JOB_DISPLAY_ORDER_STATION_ENGINEER threat = 1 + + family_heirlooms = list( + /obj/item/clothing/head/hardhat, + /obj/item/screwdriver/brass/family, + /obj/item/wrench/brass/family, + /obj/item/weldingtool/mini, // No brass family variant + /obj/item/crowbar/brass/family, + /obj/item/wirecutters/brass/family + ) /datum/outfit/job/engineer name = "Station Engineer" diff --git a/code/modules/jobs/job_types/virologist.dm b/code/modules/jobs/job_types/virologist.dm index be844be529..423a65048f 100644 --- a/code/modules/jobs/job_types/virologist.dm +++ b/code/modules/jobs/job_types/virologist.dm @@ -25,6 +25,10 @@ threat = 1.5 starting_modifiers = list(/datum/skill_modifier/job/surgery, /datum/skill_modifier/job/affinity/surgery) + + family_heirlooms = list( + /obj/item/reagent_containers/syringe + ) /datum/outfit/job/virologist name = "Virologist" diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm index 8e3ef5a253..ec4e81caea 100644 --- a/code/modules/jobs/job_types/warden.dm +++ b/code/modules/jobs/job_types/warden.dm @@ -30,6 +30,10 @@ blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent, /datum/quirk/paraplegic, /datum/quirk/blindness, /datum/quirk/monophobia) threat = 2 + family_heirlooms = list( + /obj/item/book/manual/wiki/security_space_law + ) + /datum/job/warden/get_access() var/list/L = list() L = ..() | check_config_for_sec_maint() @@ -42,7 +46,7 @@ belt = /obj/item/pda/warden ears = /obj/item/radio/headset/headset_sec/alt uniform = /obj/item/clothing/under/rank/security/warden - shoes = /obj/item/clothing/shoes/jackboots + shoes = /obj/item/clothing/shoes/jackboots/sec suit = /obj/item/clothing/suit/armor/vest/warden/alt gloves = /obj/item/clothing/gloves/color/black head = /obj/item/clothing/head/warden diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm index 378313311e..dd3d5186de 100644 --- a/code/modules/mob/dead/new_player/preferences_setup.dm +++ b/code/modules/mob/dead/new_player/preferences_setup.dm @@ -51,7 +51,8 @@ if(current_tab == LOADOUT_TAB) //give it its loadout if not on the appearance tab - SSjob.equip_loadout(parent.mob, mannequin, FALSE, bypass_prereqs = TRUE, can_drop = FALSE) + SSjob.equip_loadout(parent.mob, mannequin, bypass_prereqs = TRUE, can_drop = FALSE) + SSjob.post_equip_loadout(parent.mob, mannequin, bypass_prereqs = TRUE, can_drop = FALSE) else if(previewJob && equip_job) mannequin.job = previewJob.title diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index c31b566cf3..66a0827059 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -94,6 +94,10 @@ C.dna.copy_dna(brainmob.stored_dna) if(HAS_TRAIT(L, TRAIT_NOCLONE)) LAZYSET(brainmob.status_traits, TRAIT_NOCLONE, L.status_traits[TRAIT_NOCLONE]) + // Sandstorm edit: DNC Order quirk + if(HAS_TRAIT(L, TRAIT_DNC_ORDER)) + LAZYSET(brainmob.status_traits, TRAIT_DNC_ORDER, L.status_traits[TRAIT_DNC_ORDER]) + // End Sandstorm edit var/obj/item/organ/zombie_infection/ZI = L.getorganslot(ORGAN_SLOT_ZOMBIE) if(ZI) brainmob.set_species(ZI.old_species) //For if the brain is cloned diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm index 2ef3aa36a6..113853d315 100644 --- a/code/modules/mob/living/carbon/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -153,10 +153,6 @@ if(MOOD_LEVEL_HAPPY4 to INFINITY) . += "[t_He] look[p_s()] ecstatic." - if(HAS_TRAIT(src, TRAIT_IN_HEAT) && (HAS_TRAIT(user, TRAIT_HEAT_DETECT) || src == user)) - . += "" - . += "[t_He] [t_is] currently in [gender == MALE ? "rut" : "heat"]." - if(LAZYLEN(.) > 1) .[1] += "
" diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 913f9e4e7d..da62ca9bed 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -465,10 +465,6 @@ if (length(msg)) . += "[msg.Join("")]" - if(HAS_TRAIT(src, TRAIT_IN_HEAT) && (HAS_TRAIT(user, TRAIT_HEAT_DETECT) || src == user)) - . += "" - . += "[t_He] [t_is] currently in [gender == MALE ? "rut" : "heat"]." - var/trait_exam = common_trait_examine() if (!isnull(trait_exam)) . += trait_exam diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index ca5f6b135b..e5cab7a6f5 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -190,6 +190,10 @@ if(ITEM_SLOT_SUITSTORE) s_store = I update_inv_s_store() + if(ITEM_SLOT_ACCESSORY) + var/obj/item/clothing/under/attach_target = w_uniform + attach_target.attach_accessory(I, src, TRUE) + // updates handled by attach_accessory else to_chat(src, "You are trying to equip this item to an unsupported inventory slot. Report this to a coder!") not_handled = TRUE diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 64b5dfcd9e..0c30c42a65 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -237,6 +237,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) ///For custom overrides for species ass images var/icon/ass_image + /// List of family heirlooms this species can get with the family heirloom quirk. List of types. + var/list/family_heirlooms + /////////// // PROCS // /////////// @@ -1520,6 +1523,39 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(SEND_SIGNAL(H.back, COMSIG_TRY_STORAGE_CAN_INSERT, I, H, TRUE)) return TRUE return FALSE + if(ITEM_SLOT_ACCESSORY) + if(istype(I, /obj/item/clothing/accessory/ring)) + if(istype(H.gloves)) + var/obj/item/clothing/gloves/attaching_target = H.gloves + if(length(attaching_target.attached_accessories) > attaching_target.max_accessories) + if(return_warning) + return_warning[1] = "\The [attaching_target] is at maximum capacity!" + return FALSE + if(attaching_target.dummy_thick) + if(return_warning) + return_warning[1] = "\The [attaching_target] are too bulky and cannot have accessories attached to it!" + return FALSE + else + return TRUE + else if(return_warning) + return_warning[1] = "\The [H.w_uniform] cannot have any attachments." + return FALSE + else + if(istype(H.w_uniform, /obj/item/clothing/under)) + var/obj/item/clothing/under/attaching_target = H.w_uniform + if(length(attaching_target.attached_accessories) > attaching_target.max_accessories) + if(return_warning) + return_warning[1] = "\The [attaching_target] is at maximum capacity!" + return FALSE + if(attaching_target.dummy_thick) + if(return_warning) + return_warning[1] = "\The [attaching_target] is too bulky and cannot have accessories attached to it!" + return FALSE + else + return TRUE + else if(return_warning) + return_warning[1] = "\The [H.w_uniform] cannot have any attachments." + return FALSE return FALSE //Unsupported slot /datum/species/proc/equip_delay_self_check(obj/item/I, mob/living/carbon/human/H, bypass_equip_delay_self) diff --git a/code/modules/mob/living/carbon/human/species_types/bugmen.dm b/code/modules/mob/living/carbon/human/species_types/bugmen.dm index 7f9d3f40de..8b4861d558 100644 --- a/code/modules/mob/living/carbon/human/species_types/bugmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/bugmen.dm @@ -25,3 +25,7 @@ allowed_limb_ids = list("insect","apid","moth","moth_not_greyscale") eye_type = "insect" + + family_heirlooms = list( + /obj/item/flashlight/lantern/heirloom_moth + ) diff --git a/code/modules/mob/living/carbon/human/species_types/dwarves.dm b/code/modules/mob/living/carbon/human/species_types/dwarves.dm index e0a9bcaa36..2820726313 100644 --- a/code/modules/mob/living/carbon/human/species_types/dwarves.dm +++ b/code/modules/mob/living/carbon/human/species_types/dwarves.dm @@ -20,6 +20,11 @@ GLOBAL_LIST_INIT(dwarf_last, world.file2list("strings/names/dwarf_last.txt")) // species_language_holder = /datum/language_holder/dwarf species_category = SPECIES_CATEGORY_BASIC //a kind of human + family_heirlooms = list( + // Dwarves get a dwarf mug as their heirloom (normal container but has manly dorf icon) + /obj/item/reagent_containers/food/drinks/dwarf_mug + ) + /mob/living/carbon/human/species/dwarf //species admin spawn path race = /datum/species/dwarf //and the race the path is set to. diff --git a/code/modules/mob/living/carbon/human/species_types/felinid.dm b/code/modules/mob/living/carbon/human/species_types/felinid.dm index eee5757b46..beebbb1dfd 100644 --- a/code/modules/mob/living/carbon/human/species_types/felinid.dm +++ b/code/modules/mob/living/carbon/human/species_types/felinid.dm @@ -13,6 +13,7 @@ wagging_type = "mam_waggingtail" species_category = SPECIES_CATEGORY_FURRY ass_image = 'icons/ass/asscat.png' + family_heirlooms = list(/obj/item/toy/cattoy) /datum/species/human/felinid/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load) if(ishuman(C)) diff --git a/code/modules/mob/living/carbon/human/species_types/ipc.dm b/code/modules/mob/living/carbon/human/species_types/ipc.dm index dae4baa4f4..bb532943f8 100644 --- a/code/modules/mob/living/carbon/human/species_types/ipc.dm +++ b/code/modules/mob/living/carbon/human/species_types/ipc.dm @@ -37,6 +37,11 @@ species_category = SPECIES_CATEGORY_ROBOT wings_icons = SPECIES_WINGS_ROBOT + family_heirlooms = list( + // Gives a broken powercell for flavor text! + /obj/item/stock_parts/cell/family + ) + var/datum/action/innate/monitor_change/screen languagewhitelist = list("Encoded Audio Language") //Skyrat change - species language whitelist diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index 01f82cbac3..a82f77867f 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -35,6 +35,10 @@ ass_image = 'icons/ass/assslime.png' blacklisted_quirks = list(/datum/quirk/glass_bones) + family_heirlooms = list( + /obj/item/toy/plush/slimeplushie + ) + /datum/species/jelly/on_species_loss(mob/living/carbon/C) C.faction -= "slime" if(ishuman(C)) diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index 81a46cbf66..5093a9f24a 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -34,6 +34,10 @@ ass_image = 'icons/ass/asslizard.png' + family_heirlooms = list( + /obj/item/toy/plush/lizardplushie + ) + /datum/species/lizard/random_name(gender,unique,lastname) if(unique) return random_unique_lizard_name(gender) @@ -60,10 +64,6 @@ brutemod = 0.9 species_language_holder = /datum/language_holder/lizard/ash - -#define HEAT_CYCLE_LENGTH 32 -#define HEAT_CYCLE_OFFSET 11 - /datum/species/lizard/ashwalker/on_species_gain(mob/living/carbon/human/C, datum/species/old_species) if((C.dna.features["spines"] != "None" ) && (C.dna.features["tail_lizard"] == "None")) //tbh, it's kinda ugly for them not to have a tail yet have floating spines C.dna.features["tail_lizard"] = "Smooth" @@ -76,12 +76,6 @@ C.dna.features["mam_snouts"] = "Sharp" C.dna.features["mcolor2"] = C.dna.features["mcolor"] //for no funne rainbows C.dna.features["mcolor3"] = C.dna.features["mcolor"] - ADD_TRAIT(C, TRAIT_HEAT_DETECT, SPECIES_TRAIT) - var/temp = text2num(GLOB.round_id) - var/tempish = ((temp + (HEAT_CYCLE_OFFSET + 2)) % HEAT_CYCLE_LENGTH) - if(tempish <= 2 && tempish >= 0) - to_chat(C, "It's this time again.. Your loins lay restless as they await a potential mate.") - ADD_TRAIT(C, TRAIT_IN_HEAT, SPECIES_TRAIT) if(C.gender == MALE) C.dna.features["has_cock"] = TRUE @@ -99,6 +93,3 @@ C.give_genitals(1) C.update_body() return ..() - -#undef HEAT_CYCLE_LENGTH -#undef HEAT_CYCLE_OFFSET diff --git a/code/modules/mob/living/carbon/human/species_types/synthliz.dm b/code/modules/mob/living/carbon/human/species_types/synthliz.dm index ec1fd86780..05e075415d 100644 --- a/code/modules/mob/living/carbon/human/species_types/synthliz.dm +++ b/code/modules/mob/living/carbon/human/species_types/synthliz.dm @@ -37,3 +37,8 @@ wagging_type = "mam_waggingtail" species_category = SPECIES_CATEGORY_ROBOT wings_icons = SPECIES_WINGS_ROBOT + + family_heirlooms = list( + // They're also robots + /obj/item/stock_parts/cell/family + ) diff --git a/code/modules/mob/living/silicon/damage_procs.dm b/code/modules/mob/living/silicon/damage_procs.dm index f49c5933bb..b50aeb5f48 100644 --- a/code/modules/mob/living/silicon/damage_procs.dm +++ b/code/modules/mob/living/silicon/damage_procs.dm @@ -9,9 +9,6 @@ adjustBruteLoss(damage_amount, forced = forced) if(BURN) adjustFireLoss(damage_amount, forced = forced) - if(OXY) - if(damage < 0 || forced) //we shouldn't be taking oxygen damage through this proc, but we'll let it heal. - adjustOxyLoss(damage_amount, forced = forced) return 1 @@ -30,7 +27,7 @@ /mob/living/silicon/setCloneLoss(amount, updating_health = TRUE, forced = FALSE) return FALSE -/mob/living/silicon/adjustStaminaLoss(amount, updating_health = 1, forced = FALSE)//immune to stamina damage. +/mob/living/silicon/adjustStaminaLoss(amount, updating_health = 1, forced = FALSE) //immune to stamina damage. return FALSE /mob/living/silicon/setStaminaLoss(amount, updating_health = 1) @@ -41,3 +38,15 @@ /mob/living/silicon/setOrganLoss(slot, amount) return FALSE + +/mob/living/silicon/adjustOxyLoss(amount, updating_health = TRUE, forced = FALSE) //immune to oxygen damage + if(istype(src, /mob/living/silicon/ai)) //ais are snowflakes and use oxyloss for being in AI cards and having no battery + return ..() + + return FALSE + +/mob/living/silicon/setOxyLoss(amount, updating_health = TRUE, forced = FALSE) + if(istype(src, /mob/living/silicon/ai)) //ditto + return ..() + + return FALSE diff --git a/code/modules/mob/living/silicon/pai/pai_defense.dm b/code/modules/mob/living/silicon/pai/pai_defense.dm index 9e81725731..e54d5e05b7 100644 --- a/code/modules/mob/living/silicon/pai/pai_defense.dm +++ b/code/modules/mob/living/silicon/pai/pai_defense.dm @@ -85,15 +85,6 @@ /mob/living/silicon/pai/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, only_robotic = FALSE, only_organic = TRUE) return take_holo_damage(amount) -/mob/living/silicon/pai/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE, toxins_type = TOX_DEFAULT) - return FALSE - -/mob/living/silicon/pai/adjustOxyLoss(amount, updating_health = TRUE, forced = FALSE) - return FALSE - -/mob/living/silicon/pai/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE) - return FALSE - /mob/living/silicon/pai/adjustStaminaLoss(amount, updating_health, forced = FALSE) if(forced) take_holo_damage(amount) @@ -108,27 +99,3 @@ /mob/living/silicon/pai/getFireLoss() return emittermaxhealth - emitterhealth - -/mob/living/silicon/pai/getToxLoss(toxins_type = TOX_OMNI) - return FALSE - -/mob/living/silicon/pai/getOxyLoss() - return FALSE - -/mob/living/silicon/pai/getCloneLoss() - return FALSE - -/mob/living/silicon/pai/getStaminaLoss() - return FALSE - -/mob/living/silicon/pai/setCloneLoss() - return FALSE - -/mob/living/silicon/pai/setStaminaLoss() - return FALSE - -/mob/living/silicon/pai/setToxLoss(toxins_type = TOX_OMNI) - return FALSE - -/mob/living/silicon/pai/setOxyLoss() - return FALSE diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index e902d57ddd..8a0b8def51 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -1,7 +1,6 @@ /mob/living/silicon/robot/BiologicalLife(delta_time, times_fired) if(!(. = ..())) return - adjustOxyLoss(-10) //we're a robot! handle_robot_hud_updates() handle_robot_cell() diff --git a/code/modules/mob/living/silicon/robot/update_icons.dm b/code/modules/mob/living/silicon/robot/update_icons.dm index 088c93cff1..59c3c1794c 100644 --- a/code/modules/mob/living/silicon/robot/update_icons.dm +++ b/code/modules/mob/living/silicon/robot/update_icons.dm @@ -17,12 +17,16 @@ icon_state = "[module.cyborg_base_icon]-wreck" if(module.cyborg_pixel_offset) - pixel_x = module.cyborg_pixel_offset + var/matrix/M = transform + M.c = module.cyborg_pixel_offset + transform = M //End of citadel changes if(module.cyborg_base_icon == "robot") icon = 'icons/mob/robots.dmi' - pixel_x = initial(pixel_x) + var/matrix/M = transform + M.c = 0 // Cyborg's initial x offset is very likely to be 0 + transform = M if(stat != DEAD && !(IsUnconscious() || IsStun() || IsParalyzed() || low_power_mode)) //Not dead, not stunned. if(!eye_lights) eye_lights = new() diff --git a/code/modules/mob/living/silicon/silicon_defense.dm b/code/modules/mob/living/silicon/silicon_defense.dm index a87c0a81ab..e1a179ea52 100644 --- a/code/modules/mob/living/silicon/silicon_defense.dm +++ b/code/modules/mob/living/silicon/silicon_defense.dm @@ -45,14 +45,6 @@ adjustBruteLoss(damage) if(BURN) adjustFireLoss(damage) - if(TOX) - adjustToxLoss(damage) - if(OXY) - adjustOxyLoss(damage) - if(CLONE) - adjustCloneLoss(damage) - if(STAMINA) - adjustStaminaLoss(damage) /mob/living/silicon/attack_paw(mob/living/user) return attack_hand(user) diff --git a/code/modules/mob/living/simple_animal/gremlin/gremlin_event.dm b/code/modules/mob/living/simple_animal/gremlin/gremlin_event.dm index 6f5f0e3dba..9c4becbdcf 100644 --- a/code/modules/mob/living/simple_animal/gremlin/gremlin_event.dm +++ b/code/modules/mob/living/simple_animal/gremlin/gremlin_event.dm @@ -5,8 +5,8 @@ max_occurrences = 2 earliest_start = 20 MINUTES min_players = 5 - - + category = EVENT_CATEGORY_ENTITIES + description = "Annoying little creatures go around the station causing havoc and hacking everything." /datum/round_event/gremlin var/static/list/acceptable_spawns = list("xeno_spawn", "generic event spawn", "blobstart", "Assistant") diff --git a/code/modules/modular_computers/computers/item/tablet.dm b/code/modules/modular_computers/computers/item/tablet.dm index 2c6bef81c2..113a0b33fa 100644 --- a/code/modules/modular_computers/computers/item/tablet.dm +++ b/code/modules/modular_computers/computers/item/tablet.dm @@ -43,6 +43,7 @@ to_chat(usr, "You slide \the [pen] into \the [src]'s pen slot.") inserted_item = pen playsound(src, 'sound/machines/button.ogg', 50, 1) + SStgui.update_uis(src) /obj/item/modular_computer/tablet/proc/remove_pen() if(hasSiliconAccessInArea(usr) || !usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) @@ -52,6 +53,7 @@ usr.put_in_hands(inserted_item) to_chat(usr, "You remove [inserted_item] from \the [src]'s pen slot.") inserted_item = null + SStgui.update_uis(src) else to_chat(usr, "\The [src] does not have a pen in it!") @@ -78,9 +80,21 @@ QDEL_NULL(inserted_item) return ..() +/obj/item/modular_computer/tablet/ui_act(action, params) + . = ..() + if(.) + return + if(action == "TABLET_eject_pen") + if(istype(src, /obj/item/modular_computer/tablet)) + var/obj/item/modular_computer/tablet/self = src + if(self.can_have_pen) + self.remove_pen() + return TRUE + /obj/item/modular_computer/tablet/ui_data(mob/user) . = ..() - .["PC_showpeneject"] = inserted_item ? 1 : 0 + .["TABLET_show_pen_eject"] = inserted_item ? 1 : 0 + /obj/item/modular_computer/tablet/update_icon_state() if(has_variants) if(!finish_color) diff --git a/code/modules/modular_computers/file_system/programs/airestorer.dm b/code/modules/modular_computers/file_system/programs/airestorer.dm index 4f181c0e34..ff5240306b 100644 --- a/code/modules/modular_computers/file_system/programs/airestorer.dm +++ b/code/modules/modular_computers/file_system/programs/airestorer.dm @@ -75,9 +75,8 @@ restoring = FALSE return ai_slot.locked = TRUE - A.adjustOxyLoss(-5, FALSE) - A.adjustFireLoss(-5, FALSE) - A.adjustToxLoss(-5, FALSE) + A.adjustOxyLoss(-5, FALSE, FALSE) + A.adjustFireLoss(-5, FALSE, FALSE) A.adjustBruteLoss(-5, FALSE) // Please don't forget to update health, otherwise the below if statements will probably always fail. diff --git a/code/modules/photography/_pictures.dm b/code/modules/photography/_pictures.dm index 6f85cdb3a6..dace901cea 100644 --- a/code/modules/photography/_pictures.dm +++ b/code/modules/photography/_pictures.dm @@ -76,7 +76,7 @@ /proc/load_photo_from_disk(id, location) var/datum/picture/P = load_picture_from_disk(id) if(istype(P)) - var/obj/item/photo/p = new(location, P) + var/obj/item/photo/old/p = new(location, P) return p /proc/load_picture_from_disk(id) diff --git a/code/modules/photography/photos/album.dm b/code/modules/photography/photos/album.dm index 6f35e7a99d..48a9203553 100644 --- a/code/modules/photography/photos/album.dm +++ b/code/modules/photography/photos/album.dm @@ -48,7 +48,7 @@ for(var/i in ids) if(i in current_ids) continue - var/obj/item/photo/P = load_photo_from_disk(i) + var/obj/item/photo/old/P = load_photo_from_disk(i) if(istype(P)) if(!SEND_SIGNAL(src, COMSIG_TRY_STORAGE_INSERT, P, null, TRUE, TRUE)) qdel(P) diff --git a/code/modules/photography/photos/frame.dm b/code/modules/photography/photos/frame.dm index 4000bf843c..45aa4aeb79 100644 --- a/code/modules/photography/photos/frame.dm +++ b/code/modules/photography/photos/frame.dm @@ -98,7 +98,7 @@ load_from_id(data[persistence_id]) /obj/structure/sign/picture_frame/proc/load_from_id(id) - var/obj/item/photo/P = load_photo_from_disk(id) + var/obj/item/photo/old/P = load_photo_from_disk(id) if(istype(P)) if(istype(framed)) framed.forceMove(drop_location()) diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 27fb30a459..67ab3817ae 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -242,8 +242,9 @@ to_chat(user, "You need to secure the assembly before you can add glass.") return var/obj/item/stack/sheet/S = W - if(S.use(2)) - glass_type = W.type + S = S.split_stack(amount=2) + if(S) + glass_type = S playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) user.visible_message("[user] places the glass on the solar assembly.", "You place the glass on the solar assembly.") if(tracker) diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 9b10a843e8..5fd158c028 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -181,7 +181,6 @@ /obj/item/gun/energy/kinetic_accelerator/emp_act(severity) return -/* moved to modular_sand /obj/item/gun/energy/kinetic_accelerator/proc/reload() cell.give(cell.maxcharge) process_chamber() @@ -191,7 +190,7 @@ to_chat(loc, "[src] silently charges up.") update_icon() overheat = FALSE -*/ + /obj/item/gun/energy/kinetic_accelerator/update_overlays() . = ..() if(!can_shoot()) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 8bbaa55a66..f68c925d74 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -57,7 +57,7 @@ /datum/reagent/blood/on_mob_life(mob/living/carbon/C) //Because lethals are preferred over stamina. damnifino. var/blood_id = C.get_blood_id() - if((blood_id in GLOB.blood_reagent_types) && !HAS_TRAIT(C, TRAIT_NOMARROW) && !HAS_TRAIT(C, BLOODFLEDGE)) + if((blood_id in GLOB.blood_reagent_types) && !HAS_TRAIT(C, TRAIT_NOMARROW) && !HAS_TRAIT(C, TRAIT_BLOODFLEDGE)) if(!data || !(data["blood_type"] in get_safe_blood(C.dna.blood_type))) //we only care about bloodtype here because this is where the poisoning should be C.adjustToxLoss(rand(2,8)*REAGENTS_EFFECT_MULTIPLIER, TRUE, TRUE) //forced to ensure people don't use it to gain beneficial toxin as slime person ..() diff --git a/code/modules/research/machinery/_production.dm b/code/modules/research/machinery/_production.dm index 98b04a8382..7862f24715 100644 --- a/code/modules/research/machinery/_production.dm +++ b/code/modules/research/machinery/_production.dm @@ -232,9 +232,12 @@ var/amount = materials.mat_container.materials[mat_id] var/ref = REF(M) l += "* [amount] of [M.name]: " - if(amount >= MINERAL_MATERIAL_AMOUNT) l += "Eject [RDSCREEN_NOBREAK]" + if(amount >= MINERAL_MATERIAL_AMOUNT) l += "1x [RDSCREEN_NOBREAK]" if(amount >= MINERAL_MATERIAL_AMOUNT*5) l += "5x [RDSCREEN_NOBREAK]" - if(amount >= MINERAL_MATERIAL_AMOUNT) l += "All[RDSCREEN_NOBREAK]" + if(amount >= MINERAL_MATERIAL_AMOUNT*10) l += "10x [RDSCREEN_NOBREAK]" + if(amount >= MINERAL_MATERIAL_AMOUNT*20) l += "20x [RDSCREEN_NOBREAK]" + if(amount >= MINERAL_MATERIAL_AMOUNT*50) l += "50x [RDSCREEN_NOBREAK]" + if(amount >= MINERAL_MATERIAL_AMOUNT) l += "Max Stack[RDSCREEN_NOBREAK]" l += "" l += "[RDSCREEN_NOBREAK]" return l diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 1f027c450c..10fab0ed06 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -685,6 +685,7 @@ to_chat(SM, "You also become depressingly aware that you are not a real creature, but instead a holoform. Your existence is limited to the parameters of the holodeck.") to_chat(user, "[SM] accepts [src] and suddenly becomes attentive and aware. It worked!") SM.copy_languages(user) + SM.add_overlay(mutable_appearance('icons/mob/hud.dmi', "brother", ANTAG_LAYER)) after_success(user, SM) qdel(src) else @@ -754,6 +755,7 @@ to_chat(SM, "In a quick flash, you feel your consciousness flow into [SM]!") to_chat(SM, "You are now [SM]. Your allegiances, alliances, and role is still the same as it was prior to consciousness transfer!") SM.name = "[user.real_name]" + SM.add_overlay(mutable_appearance('icons/mob/hud.dmi', "brother", ANTAG_LAYER)) qdel(src) /obj/item/slimepotion/slime/steroid diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm index e1b198ade2..420810d7d2 100644 --- a/code/modules/surgery/organs/augments_chest.dm +++ b/code/modules/surgery/organs/augments_chest.dm @@ -20,6 +20,10 @@ if(!. || synthesizing) return + // Check if this user can process nutriment + if(HAS_TRAIT(owner, TRAIT_NO_PROCESS_FOOD)) + return + if(owner.nutrition <= hunger_threshold) synthesizing = TRUE to_chat(owner, "You feel less hungry...") diff --git a/code/modules/tgui/states/fun.dm b/code/modules/tgui/states/fun.dm new file mode 100644 index 0000000000..ba72f40fd0 --- /dev/null +++ b/code/modules/tgui/states/fun.dm @@ -0,0 +1,17 @@ +/*! + * Copyright (c) 2020 Aleksej Komarov + * SPDX-License-Identifier: MIT + */ + +/** + * tgui state: fun_state + * + * Checks that the user has the fun privilige. + */ + +GLOBAL_DATUM_INIT(fun_state, /datum/ui_state/fun_state, new) + +/datum/ui_state/fun_state/can_use_topic(src_object, mob/user) + if(check_rights_for(user.client, R_FUN)) + return UI_INTERACTIVE + return UI_CLOSE diff --git a/code/modules/vending/cartridge.dm b/code/modules/vending/cartridge.dm index c4b35496c2..d80d8e958e 100644 --- a/code/modules/vending/cartridge.dm +++ b/code/modules/vending/cartridge.dm @@ -5,15 +5,34 @@ product_slogans = "Carts to go!" icon_state = "cart" icon_deny = "cart-deny" - products = list(/obj/item/cartridge/medical = 10, + products = list(/obj/item/pda/heads = 10, // PDA + // Normal staff cards + /obj/item/cartridge/medical = 10, /obj/item/cartridge/engineering = 10, /obj/item/cartridge/security = 10, /obj/item/cartridge/janitor = 10, /obj/item/cartridge/signal/toxins = 10, /obj/item/cartridge/roboticist = 10, - /obj/item/pda/heads = 10, + /obj/item/cartridge/atmos = 10, + /obj/item/cartridge/chemistry = 10, + /obj/item/cartridge/detective = 10, + /obj/item/cartridge/lawyer = 10, + /obj/item/cartridge/curator = 10, + /obj/item/cartridge/bartender = 10, + + // Virus cards + /obj/item/cartridge/virus/clown = 3, + /obj/item/cartridge/virus/mime = 3, + + // Command staff cards /obj/item/cartridge/captain = 3, - /obj/item/cartridge/quartermaster = 10) + /obj/item/cartridge/quartermaster = 10, + /obj/item/cartridge/head = 10, + /obj/item/cartridge/hos = 10, + /obj/item/cartridge/ce = 10, + /obj/item/cartridge/cmo = 10, + /obj/item/cartridge/rd = 10) + armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50) refill_canister = /obj/item/vending_refill/cart resistance_flags = FIRE_PROOF diff --git a/config/config.txt b/config/config.txt index 8db6b1f725..cda573d11d 100644 --- a/config/config.txt +++ b/config/config.txt @@ -42,6 +42,7 @@ $include entries/vote.txt $include plushies/defines.txt # Special Sandstorm configs $include sandstorm/config.txt +$include sandstorm/balance.txt # Special SPLURT configs $include splurt/fetish_content.txt diff --git a/config/sandstorm/balance.txt b/config/sandstorm/balance.txt new file mode 100644 index 0000000000..1268cb1904 --- /dev/null +++ b/config/sandstorm/balance.txt @@ -0,0 +1,59 @@ +# Special Sandstorm balance config! + +### +## CRYPTOMINER +### + +## Should cryptominers work in non-atmos turf (ex. space)? +## Uncomment this to disable atmos processing (cheat mode) +#CRYPTO_IGNORE_ATMOS + +## What point multiplier should cryptominers use? +## Determined by heat level, or uses MAX in cheat mode +CRYPTO_MULTIPLIER_MIN 0.2 +CRYPTO_MULTIPLIER_MID 1 +CRYPTO_MULTIPLIER_MAX 3 + +## What heat thresholds should cryptominers use? +## This is measured in Kelvins +CRYPTO_HEAT_THRESHOLD_MIN 225 +CRYPTO_HEAT_THRESHOLD_MID 273 +CRYPTO_HEAT_THRESHOLD_MAX 500 + +## How much heat should cryptominers produce? +## This amount is added to the environment on process +CRYPTO_HEAT_POWER 100 + +## How long between cryptominers producing resources? +## Currently unimplemented! +CRYPTO_MINING_TIME 3000 + +## What material amount should the cryptominers produce? +## This is modified by the MULTIPLIER value +## Currently unimplemented! +CRYPTO_PAYOUT_AMOUNT 50 + +## How much power should the cryptominer use? +## Currently unimplemented! +CRYPTO_POWER_USE_IDLE 20 +CRYPTO_POWER_USE_ACTIVE 200 +CRYPTO_POWER_USE_PROCESS 20 + +### +## AUTODOC +### + +## How long should the autodoc take to perform surgery? +## This is modified by stock part ratings +AUTODOC_TIME_SURGERY_BASE 350 + +### +## BLUESPACE MINER +### + +## How much should the bluespace miner produce, compared to normal? +## This is modified by stock part ratings +BLUESPACEMINER_MULT_OUTPUT 1 + +## What is the minimum stock part tier to produce bluespace crystals? +BLUESPACEMINER_CRYSTAL_TIER 5 diff --git a/config/splurt/general.txt b/config/splurt/general.txt index dcc4de101d..6eed643535 100644 --- a/config/splurt/general.txt +++ b/config/splurt/general.txt @@ -9,3 +9,8 @@ MAX_INFINIDORMS 5 # Weighted station traits # If uncommented, the server will pick random station traits according to their weight configuration WEIGHTED_STATION_TRAITS + +# Base amount of max save slots +# Amount of character slots that players will have without modifiers being applied +# default is 24 +#BASE_SAVE_SLOTS 24 diff --git a/html/changelogs/archive/2023-01.yml b/html/changelogs/archive/2023-01.yml index 3e7ef63b42..db12f86726 100644 --- a/html/changelogs/archive/2023-01.yml +++ b/html/changelogs/archive/2023-01.yml @@ -79,6 +79,8 @@ - rscadd: You can now allow interacting with your genitals through clothes. - tweak: Modified sandstorm's spans (`"...`) with the defines (`span_x("...`) 2023-01-17: + BongaTheProto: + - code_imp: optimizes some genital related code LeDrascol: - code_imp: Added span defines for 'reallybig hypnophrase', 'big warning', 'header', and 'umbra' @@ -88,5 +90,122 @@ - rscadd: Addead keybinds to put/take items in/from suit storage and pockets slots. zeroisthebiggay: - spellcheck: You - BongaTheProto: - - code_imp: optimizes some genital related code +2023-01-18: + LeDrascol: + - tweak: Moved Autodoc techweb entry from Advanced Surgery to Advanced Surgery Tools + - tweak: Bluespace mining research is now behind Anomaly Research + - balance: Bluespace miners now require a bluespace anomaly core + SandPoot: + - balance: Maybe very small amounts of air aren't as aggressive with pushing stuff + around. + - balance: Way too much air can send you FLYING, maybe think twice about opening + that airlock/firelock now. + - imageadd: Added space wind image for air pushing stuff. +2023-01-19: + LeDrascol: + - bugfix: Fixed spelling mistakes in server's clothing entries + - imageadd: Updated sprite for Chalice of Cum + - imagedel: Removed duplicate TG drink icons + - tweak: Liquid Panty Dropper now checks client prefs +2023-01-20: + LeDrascol: + - rscadd: Added a surplus condom box to Kinkmates + Winter Schock: + - bugfix: Doll with monophobia dont get stress in someone vore belly + - bugfix: Blind doll with monophobia dont get stress while someone in 1 tile range +2023-01-21: + LeDrascol: + - balance: Synthetic Lizardperson, Synthetic Anthropomorph, and IPC no longer experience + thirst + SandPoot: + - rscadd: Added a reskin to the premium kinetic accelerator. + - bugfix: Fixed some possible graphical glitches with the mining hardsuit reskin. + - tweak: Tweaked skirt peeking into allowing peeking under people that are on top + of tables. + - refactor: Refactored skirt peeking into element. + zeroisthebiggay: + - spellcheck: the meme emotes +2023-01-22: + LeDrascol: + - bugfix: Fixed missing newline characters for mood events + WoolyAypa: + - rscadd: Added a new nullrod re-skin + - rscadd: Added papal clothing to the armament beacon choices +2023-01-23: + LunarFleet: + - tweak: Allowed borgs to craft + - tweak: Changes service borgs' items +2023-01-24: + LeDrascol: + - tweak: Bloodfledge flavor text updated + - tweak: Bloodfledge ability buttons are bloodsucker themed + - tweak: Bloodfledge biting considers many more factors + - tweak: Bloodfledge biting limits safe blood transfer while passive grabbing + - tweak: Bloodfledge biting splatters blood if interrupted + - tweak: Bloodfledge biting from same-species non-standard blood species transfers + instead of nourishing + - tweak: Bloodfledge biting species penalties do not apply on same-species interactions + - tweak: Bloodfledge ID cards will use their holder's financial account + - tweak: Bloodfledges will become upset when draining robots, slimes, corpses, or + undead + - tweak: Bloodfledges are penalized for fully draining any body + - tweak: Bloodfledges gain a mood effect from drinking from Cursed Blood users + - tweak: Bloodfledges can over-drink and become fat + - balance: Bloodsucker Fledgling is now a positive quirk, costing 2 points + - balance: Bloodfledges have less arbitrary traits + - balance: Bloodfledges can't use the power cord implant + - balance: Bloodfledge revive cannot be used while starving, the body is too damaged, + or the user suicides + - balance: Bloodfledge coffin healing rate reduced slightly + - balance: Bloodfledge coffin healing costs hunger based on healed amount + - balance: Bloodfledge coffin healing does not work on robots + - balance: Bloodfledge bite cooldown increased slightly + - balance: Bloodfledge interactions benefit from Voracious + - balance: Bloodfledge chapel penalties removed + - balance: Holy water is more dangerous for bloodfledges + - bugfix: Fixed various spelling mistakes related to Bloodsucker Fledglings + - bugfix: Fixed Bloodfledge ID card getting lost with full backpacks + - imageadd: Added a new icon and overlay for vampire IDs + - imagedel: Removed old non-modular vampire ID icon + - refactor: Refactored all Bloodsucker Fledgling code + - refactor: Trait BLOODFLEDGE is now TRAIT_BLOODFLEDGE +2023-01-25: + LeDrascol: + - rscadd: 'Added quirk: DNC Order' + - code_imp: Removed redundant definition of DNC quirk + - tweak: Moved Research Rack from Data Theory to Biological Technology +2023-01-26: + Kush1Push1: + - rscadd: Ported body markings for head; pilot and pilot jaw. + ShamanSliph: + - rscadd: 'Added new Quirk: Clothes Eater' + - bugfix: Fixed insects getting infinite nutrient from chewing on clothes. +2023-01-27: + AshTheDerg: + - tweak: Modified Booze Shaker options + - bugfix: fixed broken Borg Beer Shaker +2023-01-28: + '@Dexxiol': + - imageadd: Done some ui sprites for the underwear slots. + LeDrascol: + - rscadd: Added the Saliith plushie pinpointer + - tweak: The Saliith plushie will throw knives instead of deleting them + - tweak: The Saliith plushie will appear in a random location on the map + - tweak: Only one Saliith plushie can exist in the game at once + - balance: The Saliith plushie is now indestructible + - balance: The Saliith plushie cannot be destroyed by any means + - balance: The Saliith plushie now uses a lightning smite instead of gibbing + - balance: The Saliith plushie will no longer smite brainwashed victims + - balance: The Saliith plushie will now retaliate against plushmium use + - imageadd: Added a green pinpointer sprite +2023-01-30: + LeDrascol: + - server: Added configuration settings for Cryptominer, Autodoc, and Bluespace Miner. + Moribun: + - rscadd: nightstalker tail + - rscdel: striked out issue from zombie making blood recovery not possible + - tweak: vault suit to work +2023-01-31: + LeDrascol: + - balance: Reduced the price of individual condoms from 40 to 10 credits + - balance: Reduced the price of bulk condoms from 200 to 80 credits diff --git a/html/changelogs/archive/2023-02.yml b/html/changelogs/archive/2023-02.yml new file mode 100644 index 0000000000..9018eea41d --- /dev/null +++ b/html/changelogs/archive/2023-02.yml @@ -0,0 +1,69 @@ +2023-02-02: + LeDrascol: + - tweak: Hypnotic Gaze checks for ten new conditions + - tweak: Hypnotic Gaze supports personal pronouns + - tweak: Hypnotic Gaze accounts for non-con preferences + - balance: Hypnotic Gaze interaction time reduced from 12s to 5s + - balance: Hypnotic Gaze can be blocked by eye protection and mind shielding + - rscadd: Added quirk Estrous Detection + - rscadd: Added quirk In Estrous + - tweak: Ashwalkers now spawn with the Estrous Detection quirk + - tweak: Ashwalkers will now gain the In Estrous quirk during some rounds +2023-02-03: + LeDrascol: + - code_imp: Removed obsolete entries for In Heat and Estrus Detection + - rscadd: Added the Imaginary Friend Action Figure + - rscadd: Added the Dissociative Mirror + - tweak: Restored techweb node and circuit printing for Cryptominers +2023-02-04: + AshTheDerg: + - rscadd: Added 10 new varieties of Milkshake + LeDrascol: + - rscadd: Added variant of Subtle verb with typing indicator + - tweak: Default binding for Subtle is now Control-5 +2023-02-07: + LeDrascol: + - tweak: Added gain, lose, and medical text to werewolf quirk + - tweak: Updated werewolf ability tooltip + - tweak: Changed body part sprites used for werewolf + - tweak: Werewolves cannot transform while asleep, restrained, or stunned + - tweak: Werewolf transformation now has a five second cooldown + - tweak: Werewolf species name prefix is now based on gender + - tweak: Werewolves can be slime and jelly entities + - tweak: Werewolves will gain an appropriate taur body if the owner had one + - bugfix: Werewolves cannot transform while dead + - bugfix: Werewolf transformation organ bug fixed for some species + - bugfix: Werewolf old species attributes are no longer lost on action removal + - bugfix: Werewolves custom species name properly applies + - bugfix: Werewolves will regain exotic eye types + - code_imp: Added a werewolf quirk trait + - refactor: Updated werewolf quirk variable names + - tweak: Added Bluespace Light Replacer to the Science protolathe + The-Real-Goku: + - rscadd: Added persistent photo album. + - rscadd: Added custom name for player album. ([Player name]'s album) + - rscadd: Added specific names for the photo albums located in the Heads of Departments' + lockers. (Ex. Captain, HoP...) + - bugfix: Fixed in-hand sprite for Photo Album. (They looked like briefcases before). + zeroisthebiggay: + - bugfix: ai research +2023-02-09: + BongaTheProto: + - rscadd: New tail, Snake Tail (Large) + - tweak: Now the max amount of character slots can be configured, and donators get + more slots + - bugfix: Photographer quirk will no longer fuck over your neck loadout items + Comicao1: + - rscadd: Added a few icons and code. Not modularized because it's not possible. + - rscadd: Adds the inflate verb. +2023-02-10: + Comicao1: + - rscadd: Beach ball may be inserted a vibrator in it. + - rscadd: Syndicate beach ball also might be bought in the traitor's uplink. +2023-02-11: + WoolyAypa: + - rscadd: Added a new polychromic Princess Leia outfits to the ClothesMate (and + loadout) + - rscadd: Added a polychromic version of the "Performers one piece" to the ClothesMate + (and loadout) + - rscadd: Added high-heel sandals to the KinkMate (and loadout) diff --git a/icons/effects/atmospherics.dmi b/icons/effects/atmospherics.dmi index 6c2412c04b..8fce46c9c3 100644 Binary files a/icons/effects/atmospherics.dmi and b/icons/effects/atmospherics.dmi differ diff --git a/icons/mob/OnFire.dmi b/icons/mob/OnFire.dmi index 7768bf0269..e82442f4d0 100644 Binary files a/icons/mob/OnFire.dmi and b/icons/mob/OnFire.dmi differ diff --git a/icons/mob/augmentation/cosmetic_prosthetic/veymed.dmi b/icons/mob/augmentation/cosmetic_prosthetic/veymed.dmi new file mode 100644 index 0000000000..aaf11cfd9f Binary files /dev/null and b/icons/mob/augmentation/cosmetic_prosthetic/veymed.dmi differ diff --git a/icons/mob/clothing/belt.dmi b/icons/mob/clothing/belt.dmi index 2338fa37a0..9746e61a3d 100644 Binary files a/icons/mob/clothing/belt.dmi and b/icons/mob/clothing/belt.dmi differ diff --git a/icons/mob/clothing/feet.dmi b/icons/mob/clothing/feet.dmi index 3360521b51..88b63f46b8 100644 Binary files a/icons/mob/clothing/feet.dmi and b/icons/mob/clothing/feet.dmi differ diff --git a/icons/mob/clothing/feet_digi.dmi b/icons/mob/clothing/feet_digi.dmi index 82d4856d38..41b75ec240 100644 Binary files a/icons/mob/clothing/feet_digi.dmi and b/icons/mob/clothing/feet_digi.dmi differ diff --git a/icons/mob/clothing/hands.dmi b/icons/mob/clothing/hands.dmi index 1d4a76e519..3060ae8f2a 100644 Binary files a/icons/mob/clothing/hands.dmi and b/icons/mob/clothing/hands.dmi differ diff --git a/icons/mob/clothing/head.dmi b/icons/mob/clothing/head.dmi index fb0246e6e3..26a8b1808f 100644 Binary files a/icons/mob/clothing/head.dmi and b/icons/mob/clothing/head.dmi differ diff --git a/icons/mob/icemoon/64x64megafauna.dmi b/icons/mob/icemoon/64x64megafauna.dmi index 5a622dc7bc..e466b62556 100644 Binary files a/icons/mob/icemoon/64x64megafauna.dmi and b/icons/mob/icemoon/64x64megafauna.dmi differ diff --git a/icons/mob/inhands/equipment/belt_lefthand.dmi b/icons/mob/inhands/equipment/belt_lefthand.dmi index 81b12c60f9..944022713b 100644 Binary files a/icons/mob/inhands/equipment/belt_lefthand.dmi and b/icons/mob/inhands/equipment/belt_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/belt_righthand.dmi b/icons/mob/inhands/equipment/belt_righthand.dmi index 42ed3a30c6..78c5fc47b5 100644 Binary files a/icons/mob/inhands/equipment/belt_righthand.dmi and b/icons/mob/inhands/equipment/belt_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/axes_lefthand.dmi b/icons/mob/inhands/weapons/axes_lefthand.dmi index 6b4041e477..021c005fc3 100644 Binary files a/icons/mob/inhands/weapons/axes_lefthand.dmi and b/icons/mob/inhands/weapons/axes_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/axes_righthand.dmi b/icons/mob/inhands/weapons/axes_righthand.dmi index 30553d6320..c19440b531 100644 Binary files a/icons/mob/inhands/weapons/axes_righthand.dmi and b/icons/mob/inhands/weapons/axes_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/melee_lefthand.dmi b/icons/mob/inhands/weapons/melee_lefthand.dmi index bb6de0432e..0477b1b0f9 100644 Binary files a/icons/mob/inhands/weapons/melee_lefthand.dmi and b/icons/mob/inhands/weapons/melee_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/melee_righthand.dmi b/icons/mob/inhands/weapons/melee_righthand.dmi index 346f6d5977..cf2cf50ad9 100644 Binary files a/icons/mob/inhands/weapons/melee_righthand.dmi and b/icons/mob/inhands/weapons/melee_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/swords_lefthand.dmi b/icons/mob/inhands/weapons/swords_lefthand.dmi index 62e48f626b..860bc5a3de 100644 Binary files a/icons/mob/inhands/weapons/swords_lefthand.dmi and b/icons/mob/inhands/weapons/swords_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/swords_righthand.dmi b/icons/mob/inhands/weapons/swords_righthand.dmi index 658e7304df..326821dc8b 100644 Binary files a/icons/mob/inhands/weapons/swords_righthand.dmi and b/icons/mob/inhands/weapons/swords_righthand.dmi differ diff --git a/icons/obj/card.dmi b/icons/obj/card.dmi index 00b57726f1..d9fd50c9ed 100644 Binary files a/icons/obj/card.dmi and b/icons/obj/card.dmi differ diff --git a/icons/obj/clothing/belt_overlays.dmi b/icons/obj/clothing/belt_overlays.dmi index 0799920a6c..5d9bad32ac 100644 Binary files a/icons/obj/clothing/belt_overlays.dmi and b/icons/obj/clothing/belt_overlays.dmi differ diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi index 48aaa3a418..70548c5719 100644 Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi index 70c48c52da..855936dfb4 100644 Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 6e8ea50d39..0831f7be2f 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi index 50de425aad..2406e61190 100644 Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ diff --git a/icons/obj/contraband.dmi b/icons/obj/contraband.dmi index 9af0a6ba3a..eadf4a1591 100644 Binary files a/icons/obj/contraband.dmi and b/icons/obj/contraband.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index 6501126e02..73cc4b6853 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/grenade.dmi b/icons/obj/grenade.dmi index 7fc2eaae7f..27301fa272 100644 Binary files a/icons/obj/grenade.dmi and b/icons/obj/grenade.dmi differ diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi index 3e57f4eca4..b958ca201c 100644 Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ diff --git a/icons/obj/reagentfillings.dmi b/icons/obj/reagentfillings.dmi index 7926ead12d..077a3b43db 100644 Binary files a/icons/obj/reagentfillings.dmi and b/icons/obj/reagentfillings.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index 4cee011ecd..8085931b6e 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm index 4c09236872..197f088356 100644 --- a/modular_citadel/code/modules/client/loadout/__donator.dm +++ b/modular_citadel/code/modules/client/loadout/__donator.dm @@ -54,9 +54,10 @@ /datum/gear/donator/kiaramedal name = "Insignia of Steele" - slot = ITEM_SLOT_BACKPACK + slot = ITEM_SLOT_ACCESSORY path = /obj/item/clothing/accessory/medal/steele ckeywhitelist = list("inferno707") + handle_post_equip = TRUE /datum/gear/donator/hheart name = "The Hollow Heart" diff --git a/modular_citadel/code/modules/client/loadout/_loadout.dm b/modular_citadel/code/modules/client/loadout/_loadout.dm index 5f895c4805..f33beecb32 100644 --- a/modular_citadel/code/modules/client/loadout/_loadout.dm +++ b/modular_citadel/code/modules/client/loadout/_loadout.dm @@ -55,6 +55,7 @@ GLOBAL_LIST_EMPTY(loadout_whitelist_ids) var/geargroupID //defines the ID that the gear inherits from the config var/loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION var/list/loadout_initial_colors = list() + var/handle_post_equip = FALSE //NEW DONATOR SYTSEM STUFF var/donoritem //autoset on new if null diff --git a/modular_citadel/code/modules/client/loadout/accessory.dm b/modular_citadel/code/modules/client/loadout/accessory.dm new file mode 100644 index 0000000000..55cce181a5 --- /dev/null +++ b/modular_citadel/code/modules/client/loadout/accessory.dm @@ -0,0 +1,20 @@ +/datum/gear/accessory + category = LOADOUT_CATEGORY_ACCESSORY + slot = ITEM_SLOT_ACCESSORY + handle_post_equip = TRUE + +/datum/gear/accessory/necklace + name = "A renameable necklace" + path = /obj/item/clothing/accessory/necklace + +/datum/gear/accessory/polymaidapron + name = "Polychromic maid apron" + path = /obj/item/clothing/accessory/maidapron/polychromic + loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC + loadout_initial_colors = list("#333333", "#FFFFFF") + +/datum/gear/accessory/pridepin + name = "Pride pin" + path = /obj/item/clothing/accessory/pride + loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION + cost = 0 diff --git a/modular_citadel/code/modules/client/loadout/backpack.dm b/modular_citadel/code/modules/client/loadout/backpack.dm index 5879426041..24545e7b4c 100644 --- a/modular_citadel/code/modules/client/loadout/backpack.dm +++ b/modular_citadel/code/modules/client/loadout/backpack.dm @@ -2,6 +2,7 @@ category = LOADOUT_CATEGORY_BACKPACK subcategory = LOADOUT_SUBCATEGORY_BACKPACK_GENERAL slot = ITEM_SLOT_BACKPACK + handle_post_equip = TRUE /datum/gear/backpack/plushbox name = "Plushie Choice Box" @@ -172,21 +173,7 @@ path = /obj/item/storage/fancy/ringbox/diamond cost = 5 -/datum/gear/backpack/necklace //this is here because loadout doesn't support proper accessories - name = "A renameable necklace" - path = /obj/item/clothing/accessory/necklace - subcategory = LOADOUT_SUBCATEGORY_BACKPACK_ACCESSORIES - -/datum/gear/backpack/polymaidapron //this is ALSO here because loadout doesn't support proper accessories - name = "Polychromic maid apron" - path = /obj/item/clothing/accessory/maidapron/polychromic - loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC - loadout_initial_colors = list("#333333", "#FFFFFF") - subcategory = LOADOUT_SUBCATEGORY_BACKPACK_ACCESSORIES - -/datum/gear/backpack/pridepin //what the two comments above said - name = "Pride pin" - path = /obj/item/clothing/accessory/pride - loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION - subcategory = LOADOUT_SUBCATEGORY_BACKPACK_ACCESSORIES - cost = 0 +// Moved here from quirks +/datum/gear/backpack/dyespray + name = "Hair dye spray" + path = /obj/item/dyespray diff --git a/modular_citadel/code/modules/client/loadout/head.dm b/modular_citadel/code/modules/client/loadout/head.dm index d0563d2986..58dd6e9fc3 100644 --- a/modular_citadel/code/modules/client/loadout/head.dm +++ b/modular_citadel/code/modules/client/loadout/head.dm @@ -195,6 +195,12 @@ restricted_desc = "Security" restricted_roles = list("Warden","Detective","Security Officer","Head of Security") +/datum/gear/head/cowboyhat/polychromic + name = "Cowboy Hat, Polychromic" + path = /obj/item/clothing/head/cowboyhat/polychromic + loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC + loadout_initial_colors = list("#5F5F5F", "#DDDDDD") + /datum/gear/head/wkepi name = "white kepi" path = /obj/item/clothing/head/kepi diff --git a/modular_citadel/code/modules/mentor/mentor_memo.dm b/modular_citadel/code/modules/mentor/mentor_memo.dm index 59ea92febd..c64101c30e 100644 --- a/modular_citadel/code/modules/mentor/mentor_memo.dm +++ b/modular_citadel/code/modules/mentor/mentor_memo.dm @@ -94,7 +94,7 @@ var/datum/db_query/update_query = SSdbcore.NewQuery({" UPDATE [format_table_name("mentor_memo")] SET memotext = :new_memo, last_editor = :ckey, edits = :edit_text WHERE ckey = :target_ckey - "}, list("new_memo" = new_memo, "ckey" = ckey, "edit_text" = (edit_text ? "" : edit_text), "target_ckey" = target_ckey)) + "}, list("new_memo" = new_memo, "ckey" = ckey, "edit_text" = (edit_text || ""), "target_ckey" = target_ckey)) if(!update_query.Execute()) var/err = update_query.ErrorMsg() qdel(update_query) diff --git a/modular_sand/code/_globalvars/bitfields.dm b/modular_sand/code/_globalvars/bitfields.dm index 934786c792..7a2bb8d87d 100644 --- a/modular_sand/code/_globalvars/bitfields.dm +++ b/modular_sand/code/_globalvars/bitfields.dm @@ -4,7 +4,28 @@ (this sort of bitfield definition will ALWAYS use this menu so you can't var edit normally) */ + +DEFINE_BITFIELD(flags_inv, list( + "HIDEACCESSORY" = HIDEACCESSORY, + "HIDEEARS" = HIDEEARS, + "HIDEEYES" = HIDEEYES, + "HIDEFACE" = HIDEFACE, + "HIDEFACIALHAIR" = HIDEFACIALHAIR, + "HIDEGLOVES" = HIDEGLOVES, + "HIDEHAIR" = HIDEHAIR, + "HIDEJUMPSUIT" = HIDEJUMPSUIT, + "HIDEMASK" = HIDEMASK, + "HIDENECK" = HIDENECK, + "HIDESHOES" = HIDESHOES, + "HIDESNOUT" = HIDESNOUT, + "HIDESUITSTORAGE" = HIDESUITSTORAGE, + "HIDETAUR" = HIDETAUR, + "HIDEUNDERWEAR" = HIDEUNDERWEAR, + "HIDEWRISTS" = HIDEWRISTS, +)) + DEFINE_BITFIELD(slot_flags, list( + "ITEM_SLOT_ACCESSORY" = ITEM_SLOT_ACCESSORY, "ITEM_SLOT_BACK" = ITEM_SLOT_BACK, "ITEM_SLOT_BACKPACK" = ITEM_SLOT_BACKPACK, "ITEM_SLOT_BELT" = ITEM_SLOT_BELT, @@ -31,3 +52,22 @@ DEFINE_BITFIELD(slot_flags, list( "ITEM_SLOT_UNDERWEAR" = ITEM_SLOT_UNDERWEAR, "ITEM_SLOT_WRISTS" = ITEM_SLOT_WRISTS, )) + +DEFINE_BITFIELD(vis_flags_inv, list( + "HIDEACCESSORY" = HIDEACCESSORY, + "HIDEEARS" = HIDEEARS, + "HIDEEYES" = HIDEEYES, + "HIDEFACE" = HIDEFACE, + "HIDEFACIALHAIR" = HIDEFACIALHAIR, + "HIDEGLOVES" = HIDEGLOVES, + "HIDEHAIR" = HIDEHAIR, + "HIDEJUMPSUIT" = HIDEJUMPSUIT, + "HIDEMASK" = HIDEMASK, + "HIDENECK" = HIDENECK, + "HIDESHOES" = HIDESHOES, + "HIDESNOUT" = HIDESNOUT, + "HIDESUITSTORAGE" = HIDESUITSTORAGE, + "HIDETAUR" = HIDETAUR, + "HIDEUNDERWEAR" = HIDEUNDERWEAR, + "HIDEWRISTS" = HIDEWRISTS, +)) diff --git a/modular_sand/code/_globalvars/lists/lewd_content.dm b/modular_sand/code/_globalvars/lists/lewd_content.dm new file mode 100644 index 0000000000..686e610126 --- /dev/null +++ b/modular_sand/code/_globalvars/lists/lewd_content.dm @@ -0,0 +1,23 @@ +/* + * List of clothes with possible peeking under, + * It is prefilled with clothes that cannot be caught + * by the automatic system (has no skirt in path) +*/ +GLOBAL_LIST_INIT(skirt_peekable, list( + /obj/item/clothing/under/rank/civilian/janitor/maid = TRUE, + /obj/item/clothing/under/costume/loincloth = TRUE, + /obj/item/clothing/under/costume/loincloth/cloth = TRUE, + /obj/item/clothing/under/costume/loincloth/cloth/sensor = TRUE, + )) + +/* + * List of clothes you can't say a pair of. + * Ex: + * A pair of jockstrap? +*/ +GLOBAL_LIST_INIT(pairless_panties, list( + /obj/item/clothing/underwear/briefs/jockstrap = TRUE, + /obj/item/clothing/underwear/briefs/panties/thong = TRUE, + /obj/item/clothing/underwear/briefs/panties/thong/babydoll = TRUE, + /obj/item/clothing/underwear/briefs/mankini = TRUE +)) diff --git a/modular_sand/code/_globalvars/lists/objects.dm b/modular_sand/code/_globalvars/lists/objects.dm index dd737fbe73..bbdfa5207d 100644 --- a/modular_sand/code/_globalvars/lists/objects.dm +++ b/modular_sand/code/_globalvars/lists/objects.dm @@ -1,2 +1,3 @@ GLOBAL_LIST_EMPTY(ic_jammers) GLOBAL_LIST_EMPTY(ic_speakers) +GLOBAL_DATUM_INIT(saliith_plushie, /obj/item/toy/plush/lizardplushie/saliith, new) diff --git a/modular_sand/code/controllers/configuration/entries/sandstorm_balance.dm b/modular_sand/code/controllers/configuration/entries/sandstorm_balance.dm new file mode 100644 index 0000000000..f739dec7b1 --- /dev/null +++ b/modular_sand/code/controllers/configuration/entries/sandstorm_balance.dm @@ -0,0 +1,66 @@ +/// CRYPTOMINERS /// +// Should cryptominers work in non-atmos turf +/datum/config_entry/flag/crypto_ignore_atmos + +// Cryptominer point multipliers +/datum/config_entry/number/crypto_multiplier_min + config_entry_value = 0.20 + integer = FALSE + +/datum/config_entry/number/crypto_multiplier_mid + config_entry_value = 1 + integer = FALSE + +/datum/config_entry/number/crypto_multiplier_max + config_entry_value = 3 + integer = FALSE + +// Cryptominer heat thresholds +/datum/config_entry/number/crypto_heat_threshold_min + config_entry_value = 225 + +/datum/config_entry/number/crypto_heat_threshold_mid + config_entry_value = 273 + +/datum/config_entry/number/crypto_heat_threshold_max + config_entry_value = 500 + +// Cryptominer heat produced +/datum/config_entry/number/crypto_heat_power + config_entry_value = 100 + +/* + * The contained configuration values are currently unimplemented + * +// Cryptominer processing time +/datum/config_entry/number/crypto_mining_time + config_entry_value = 3000 + +// Cryptominer base payout +/datum/config_entry/number/crypto_payout_amount + config_entry_value = 50 + +// Cryptominer power use +/datum/config_entry/number/crypto_power_use_idle + config_entry_value = 20 + +/datum/config_entry/number/crypto_power_use_active + config_entry_value = 200 + +/datum/config_entry/number/crypto_power_use_process + config_entry_value = 20 +*/ + +/// AUTODOC /// +// Autodoc processing time +/datum/config_entry/number/autodoc_time_surgery_base + config_entry_value = 350 + +/// BLUESPACE MINER /// +// BSM production output multiplier +/datum/config_entry/number/bluespaceminer_mult_output + config_entry_value = 1 + +// BSM minimum tier for bluespace crystals +/datum/config_entry/number/bluespaceminer_crystal_tier + config_entry_value = 5 diff --git a/modular_sand/code/datums/elements/skirt_peeking.dm b/modular_sand/code/datums/elements/skirt_peeking.dm new file mode 100644 index 0000000000..e5be0fc434 --- /dev/null +++ b/modular_sand/code/datums/elements/skirt_peeking.dm @@ -0,0 +1,101 @@ +/datum/element/skirt_peeking + element_flags = ELEMENT_DETACH + +/datum/element/skirt_peeking/Attach(datum/peeked) + . = ..() + if(!ishuman(peeked)) + return ELEMENT_INCOMPATIBLE + + RegisterSignal(peeked, COMSIG_PARENT_EXAMINE, .proc/on_examine) + RegisterSignal(peeked, COMSIG_PARENT_EXAMINE_MORE, .proc/on_closer_look) + +/datum/element/skirt_peeking/proc/can_skirt_peek(mob/living/carbon/human/peeked, mob/peeker) + var/mob/living/living_peeker = peeker + var/obj/item/clothing/under/worn_uniform = peeked.get_item_by_slot(ITEM_SLOT_ICLOTHING) + + // Unfortunately, you can't see it + var/obj/item/clothing/suit/outer_clothing = peeked.get_item_by_slot(ITEM_SLOT_OCLOTHING) + if(outer_clothing && CHECK_MULTIPLE_BITFIELDS(outer_clothing.body_parts_covered, CHEST | GROIN | LEGS | FEET)) + return FALSE + // + + // Valid clothing section + if(worn_uniform && is_type_in_typecache(worn_uniform.type, GLOB.skirt_peekable)) + // We are being peeked by a spooky ghost who sees all? + if(isobserver(peeker)) + return TRUE + // Are you a living creature (and not us)? + if(istype(living_peeker) && (living_peeker != peeked)) + // And are you under us while we're standing up? + if(!(CHECK_BITFIELD(living_peeker.mobility_flags, MOBILITY_STAND)) && (CHECK_BITFIELD(peeked.mobility_flags, MOBILITY_STAND)) && (peeked.loc == living_peeker.loc)) + return TRUE + // Or are you nearby and we are up high + // to-do SOMEONE PLEASE PORT /datum/element/climbable + var/obj/structure/high_ground = locate(/obj/structure) in get_turf(peeked) + if(high_ground && high_ground.climbable && CHECK_BITFIELD(peeked.mobility_flags, MOBILITY_STAND) && \ + peeked.Adjacent(peeker)) + return TRUE + return FALSE + +/datum/element/skirt_peeking/proc/on_examine(mob/living/carbon/human/peeked, mob/peeker, list/examine_list) + if(can_skirt_peek(peeked, peeker)) + examine_list += span_purple("[peeked.p_theyre(TRUE)] wearing a skirt! I can probably give it a little peek looking closer.") + +/datum/element/skirt_peeking/proc/on_closer_look(mob/living/carbon/human/peeked, mob/peeker, list/examine_content) + if(can_skirt_peek(peeked, peeker)) + var/obj/item/clothing/under/worn_uniform = peeked.get_item_by_slot(ITEM_SLOT_ICLOTHING) + var/string = "Peeking under [peeked]'s [worn_uniform.name], you can see " + var/obj/item/clothing/underwear/worn_underwear = peeked.get_item_by_slot(ITEM_SLOT_UNDERWEAR) + if(worn_underwear) + string += "a " + if(!is_type_in_typecache(worn_underwear.type, GLOB.pairless_panties)) //a pair of thong + string += "pair of " + if(worn_underwear.color) + string += "[worn_underwear.name]." + else + string += "[worn_underwear.name]." + + var/obj/item/organ/genital/penis/penis = peeked.getorganslot(ORGAN_SLOT_PENIS) + var/obj/item/organ/genital/vagina/vagina = peeked.getorganslot(ORGAN_SLOT_VAGINA) + if(penis?.aroused_state) + string += span_love(" There's a visible bulge on [peeked.p_their()] front.") + else if(vagina?.aroused_state) + string += span_love(" [peeked.p_theyre(TRUE)] wet with arousal.") + + else + string += "[peeked.p_theyre()] not wearing anything!\n[peeked.p_their(TRUE)]" + var/list/genitals = list() + for(var/obj/item/organ/genital/genital in peeked.internal_organs) + if(CHECK_BITFIELD(genital.genital_flags, (GENITAL_INTERNAL|GENITAL_HIDDEN))) + continue + + var/appended + switch(genital.type) + if(/obj/item/organ/genital/vagina) + if(genital.aroused_state) + appended += " wet" + if(lowertext(genital.shape) != "human") + appended += " [lowertext(genital.shape)]" + if(lowertext(genital.shape) != "cloaca") //their wet cloaca vagina + appended += " [lowertext(genital.name)]" // goodbye pussy + + if(/obj/item/organ/genital/testicles) + var/obj/item/organ/genital/testicles/nuts = genital + appended += " [lowertext(nuts.size_name)] [lowertext(nuts.name)]" + if(/obj/item/organ/genital/penis) + if(genital.aroused_state) + appended += " fully erect" + if(lowertext(genital.shape) != "human") + appended += " [lowertext(genital.shape)]" + appended += " [lowertext(genital.name)]" // Name it something funny, i dare you. + if(/obj/item/organ/genital/butt) + var/obj/item/organ/genital/butt/booty = genital + appended += " [booty.size_name] [lowertext(booty.name)]" // Maybe " average butt pair" isn't the best for now + else + continue + genitals += appended + + string += english_list(genitals, " featureless groin", " and", ",") + string += " on full display." + + examine_content += span_purple(string) diff --git a/modular_sand/code/datums/traits/negative.dm b/modular_sand/code/datums/traits/negative.dm index 3a50591875..2d238f1589 100644 --- a/modular_sand/code/datums/traits/negative.dm +++ b/modular_sand/code/datums/traits/negative.dm @@ -15,3 +15,10 @@ /datum/quirk/sheltered/remove() //i mean, the lose text explains it, so i'm making it actually work var/mob/living/carbon/human/H = quirk_holder H.grant_language(/datum/language/common) + +/datum/quirk/dnc_order + name = "DNC Order" + desc = "You have a Do Not Clone order on your record, stating that you may not be cloned. You can still be revived by other means." + value = -2 + mob_trait = TRAIT_DNC_ORDER + medical_record_text = "Patient has a DNC (Do Not Clone) order and will be rejected by cloning mechanisms as a result." diff --git a/modular_sand/code/datums/traits/neutral.dm b/modular_sand/code/datums/traits/neutral.dm index 89486dc153..363f6f7e25 100644 --- a/modular_sand/code/datums/traits/neutral.dm +++ b/modular_sand/code/datums/traits/neutral.dm @@ -22,3 +22,41 @@ lose_text = span_love("You feel the warm blow of life flooding your womb, full of newfound, vibrant fertility!") medical_record_text = "Patient doesn't seem able to ovulate properly..." */ + +/datum/quirk/estrous_detection + name = "Estrous Detection" + desc = "You have a mammalian sense of detecting if someone\'s body longs for breeding." + value = 0 + mob_trait = TRAIT_ESTROUS_DETECT + gain_text = span_love("Your senses adjust, allowing a mammalian sense of others' fertility.") + lose_text = span_notice("Your sense of others' fertility fades.") + +/datum/quirk/estrous_active + name = "In Estrous" + desc = "Your system burns with the desire to be bred. Satisfying your lust will make you happy, while ignoring it may cause you to become sad and needy." + value = 0 + mob_trait = TRAIT_ESTROUS_ACTIVE + gain_text = span_love("You body burns with the desire to be bred.") + lose_text = span_notice("You feel more in control of your body and thoughts.") + +/datum/quirk/estrous_active/add() + // Add examine hook + RegisterSignal(quirk_holder, COMSIG_PARENT_EXAMINE, .proc/quirk_examine_estrous_active) + +/datum/quirk/estrous_active/remove() + // Remove examine hook + UnregisterSignal(quirk_holder, COMSIG_PARENT_EXAMINE) + +/datum/quirk/estrous_active/proc/quirk_examine_estrous_active(atom/examine_target, mob/living/carbon/human/examiner, list/examine_list) + SIGNAL_HANDLER + + // Check if human examiner exists + if(!istype(examiner)) + return + + // Check if examiner lacks the trait, or is self examining + if(!HAS_TRAIT(examiner, TRAIT_ESTROUS_DETECT) || (examiner == quirk_holder)) + return + + // Add quirk message + examine_list += span_love("[quirk_holder.p_they(TRUE)] [quirk_holder.p_are()] currently influenced by the estrous cycle, and long for breeding.") diff --git a/modular_sand/code/game/machinery/autodoc.dm b/modular_sand/code/game/machinery/autodoc.dm index fcd00555c4..d4d266200b 100644 --- a/modular_sand/code/game/machinery/autodoc.dm +++ b/modular_sand/code/game/machinery/autodoc.dm @@ -1,3 +1,6 @@ +// Configuration defines +#define AUTODOC_TIME_BASE CONFIG_GET(number/autodoc_time_surgery_base) + /obj/machinery/autodoc name = "autodoc" desc = "An advanced machine used for inserting organs and implants into the occupant." @@ -17,8 +20,11 @@ . = ..() update_icon() + // Set initial time based on config + surgerytime = max(AUTODOC_TIME_BASE,10) + /obj/machinery/autodoc/RefreshParts() - var/max_time = 350 + var/max_time = AUTODOC_TIME_BASE for(var/obj/item/stock_parts/L in component_parts) max_time -= (L.rating*10) surgerytime = max(max_time,10) @@ -165,3 +171,5 @@ return obj_flags |= EMAGGED to_chat(user, span_warning("You reprogram [src]'s surgery procedures.")) + +#undef AUTODOC_TIME_BASE diff --git a/modular_sand/code/game/machinery/computer/cloning.dm b/modular_sand/code/game/machinery/computer/cloning.dm new file mode 100644 index 0000000000..e7844ef944 --- /dev/null +++ b/modular_sand/code/game/machinery/computer/cloning.dm @@ -0,0 +1,15 @@ +// Proc for scanning a mob in a cloning machine +/obj/machinery/computer/cloning/can_scan(datum/dna/dna, mob/living/mob_occupant, experimental = FALSE, datum/bank_account/account) + // Check for DNC Order quirk + if(HAS_TRAIT(mob_occupant, TRAIT_DNC_ORDER)) + // Set scan failure reason + scantemp = "Subject has an active DNC order on file. Further operations terminated." + + // Play error sound + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) + + // Return without scanning + return + + // Return normally + . = ..() diff --git a/modular_sand/code/game/machinery/cryptominers.dm b/modular_sand/code/game/machinery/cryptominers.dm index 33f87a8e9f..6738511b4f 100644 --- a/modular_sand/code/game/machinery/cryptominers.dm +++ b/modular_sand/code/game/machinery/cryptominers.dm @@ -1,3 +1,22 @@ +// Configuration defines +/* + * Some entries are currently unimplemented + * +#define CRYPTO_POWER_USE CONFIG_GET(number/crypto_power_use_process) +#define CRYPTO_POWER_IDLE CONFIG_GET(number/crypto_power_use_idle) +#define CRYPTO_POWER_ACTIVE CONFIG_GET(number/crypto_power_use_active) +#define CRYPTO_MININGTIME CONFIG_GET(number/crypto_mining_time) +#define CRYPTO_MININGPOINTS CONFIG_GET(number/crypto_payout_amount) +*/ +#define CRYPTO_TEMP_MIN CONFIG_GET(number/crypto_heat_threshold_min) +#define CRYPTO_TEMP_MID CONFIG_GET(number/crypto_heat_threshold_mid) +#define CRYPTO_TEMP_MAX CONFIG_GET(number/crypto_heat_threshold_max) +#define CRYPTO_MULT_MIN CONFIG_GET(number/crypto_multiplier_min) +#define CRYPTO_MULT_MID CONFIG_GET(number/crypto_multiplier_mid) +#define CRYPTO_MULT_MAX CONFIG_GET(number/crypto_multiplier_max) +#define CRYPTO_HEATING_POWER CONFIG_GET(number/crypto_heat_power) +#define CRYPTO_IGNORE_ATMOS CONFIG_GET(flag/crypto_ignore_atmos) + /obj/machinery/cryptominer name = "cryptocurrency miner" desc = "This handy-dandy machine will produce credits for your enjoyment." @@ -12,11 +31,6 @@ var/mining = FALSE var/miningtime = 3000 var/miningpoints = 50 - var/mintemp = TCRYO // 225K equals approximately -55F or -48C - var/midtemp = T0C // 273K equals 32F or 0C - var/maxtemp = 500 // 500K equals approximately 440F or 226C - var/heatingPower = 100 // Heat added each processing - var/require_conductivity = TRUE // Prevent use in space var/datum/bank_account/pay_me = null /obj/machinery/cryptominer/Initialize(mapload) @@ -59,7 +73,7 @@ return to_chat(user, span_notice("You link \the [CARD] to \the [src].")) pay_me = CARD.registered_account - say("Now using [pay_me.account_holder ? "[pay_me.account_holder]'s" : span_boldwarning("ERROR")] account.") + say("Now using [pay_me.account_holder ? "[pay_me.account_holder]s" : span_boldwarning("ERROR")] account.") return /obj/machinery/cryptominer/AltClick(mob/user) @@ -68,13 +82,13 @@ balloon_alert(user, "resetting") if(do_after(user, 5 SECONDS, target = src)) pay_me = SSeconomy.get_dep_account(ACCOUNT_CAR) - say("Now using [pay_me.account_holder]'s account.") + say("Now using [pay_me.account_holder]s account.") /obj/machinery/cryptominer/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += span_notice("A little screen on the machine reads: Currently the linked bank account is [pay_me.account_holder ? "[pay_me.account_holder]'s" : span_boldwarning("ERROR")].") - . += "Modify the destination of the credits using your id on it while it is inactive and has it's panel open." + . += span_notice("A little screen on the machine reads: Currently the linked bank account is [pay_me.account_holder ? "[pay_me.account_holder]s" : span_boldwarning("ERROR")].") + . += "Modify the destination of the credits using your id on it while it is inactive and has its panel open." . += "Alt-Click to reset to the Cargo budget." /obj/machinery/cryptominer/process() @@ -85,18 +99,19 @@ // Check for tiles with no conductivity (space) if(T.thermal_conductivity == 0) + // Cheat mode: Skip all atmos code and give points + // Placed first, as servers are more likely to use it + if(CRYPTO_IGNORE_ATMOS) + produce_points(CRYPTO_MULT_MAX) + return + // Normal mode: Warn the user and stop processing - if(require_conductivity) + else say("Invalid atmospheric conditions detected! Shutting off!") playsound(loc, 'sound/machines/beep.ogg', 50, TRUE, -1) set_mining(FALSE) return - // Cheat mode: Skip all atmos code and give points - else - produce_points(3) - return - // Get air var/datum/gas_mixture/env = T.return_air() if(!env) @@ -105,24 +120,29 @@ // Get temp var/env_temp = env.return_temperature() + // Define temperature settings + var/temp_min = CRYPTO_TEMP_MIN // 225K equals approximately -55F or -48C + var/temp_mid = CRYPTO_TEMP_MID // 273K equals 32F or 0C + var/temp_max = CRYPTO_TEMP_MAX // 500K equals approximately 440F or 226C + // Check for temperature effects // Minimum (most likely) - if(env_temp <= mintemp) - produce_points(3) + if(env_temp <= temp_min) + produce_points(CRYPTO_MULT_MAX) // Mid - else if((env_temp <= midtemp) && (env_temp >= mintemp)) - produce_points(1) + else if((env_temp <= temp_mid) && (env_temp >= temp_min)) + produce_points(CRYPTO_MULT_MID) // Maximum - else if((env_temp <= maxtemp) && (env_temp >= midtemp)) - produce_points(0.20) + else if((env_temp <= temp_max) && (env_temp >= temp_mid)) + produce_points(CRYPTO_MULT_MIN) // Overheat - else if(env_temp >= maxtemp) + else if(env_temp >= temp_max) say("Critical overheating detected! Shutting off!") playsound(loc, 'sound/machines/beep.ogg', 50, TRUE, -1) set_mining(FALSE) - // Increase heat by heatingPower - env.set_temperature(env_temp + heatingPower) + // Increase heat by heating_power + env.set_temperature(env_temp + CRYPTO_HEATING_POWER) // Update air air_update_turf() @@ -148,15 +168,25 @@ set_mining(TRUE) /obj/machinery/cryptominer/proc/set_mining(new_value) + // Check if status changed if(new_value == mining) return //No changes - mining = new_value - if(mining) - START_PROCESSING(SSmachines, src) - else - STOP_PROCESSING(SSmachines, src) - update_icon() + // Set status new value + mining = new_value + + // Check if mining should run + if(mining) + // Start processing + START_PROCESSING(SSmachines, src) + + // Mining should not run + else + // Stop processing + STOP_PROCESSING(SSmachines, src) + + // Update machine icon + update_icon() /obj/machinery/cryptominer/syndie name = "syndicate cryptocurrency miner" @@ -198,3 +228,21 @@ icon_state = "loop_nano" else icon_state = "on_nano" + +/* + * Some entries are currently unimplemented + * +#undef CRYPTO_POWER_USE +#undef CRYPTO_POWER_IDLE +#undef CRYPTO_POWER_ACTIVE +#undef CRYPTO_MININGTIME +#undef CRYPTO_MININGPOINTS +*/ +#undef CRYPTO_TEMP_MIN +#undef CRYPTO_TEMP_MID +#undef CRYPTO_TEMP_MAX +#undef CRYPTO_MULT_MIN +#undef CRYPTO_MULT_MID +#undef CRYPTO_MULT_MAX +#undef CRYPTO_HEATING_POWER +#undef CRYPTO_IGNORE_ATMOS diff --git a/modular_sand/code/game/objects/effects/contraband.dm b/modular_sand/code/game/objects/effects/contraband.dm index 0ec0d17ab9..6272882944 100644 --- a/modular_sand/code/game/objects/effects/contraband.dm +++ b/modular_sand/code/game/objects/effects/contraband.dm @@ -1,5 +1,5 @@ /obj/structure/sign/poster/contraband/yes_erp name = "Yes ERP" - desc = "This poster negates that Eroticism, Rape and Pornography should be banned from Nanotrasen stations." + desc = "This poster scrutinizes the banning of Eroticism, Rape and Pornography from Nanotrasen stations." icon = 'modular_sand/icons/obj/contraband.dmi' - icon_state = "poster1" //It is one because different file + icon_state = "poster_yeserp" diff --git a/modular_sand/code/game/objects/items/circuitboards/machine_circuitboards.dm b/modular_sand/code/game/objects/items/circuitboards/machine_circuitboards.dm index ab97d07d54..aec2c6f1ab 100644 --- a/modular_sand/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/modular_sand/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -40,7 +40,7 @@ /obj/item/stock_parts/micro_laser = 5, /obj/item/stock_parts/manipulator = 5, /obj/item/stock_parts/scanning_module = 5, - /obj/item/stack/ore/bluespace_crystal = 5) + ANOMALY_CORE_BLUESPACE = 1) needs_anchored = FALSE /obj/item/circuitboard/machine/telecomms/message_server diff --git a/modular_sand/code/game/objects/items/fleshlight.dm b/modular_sand/code/game/objects/items/fleshlight.dm index fe7f017fe2..9b2b03916c 100644 --- a/modular_sand/code/game/objects/items/fleshlight.dm +++ b/modular_sand/code/game/objects/items/fleshlight.dm @@ -625,6 +625,7 @@ var/targetting = CUM_TARGET_VAGINA equip_delay_self = 2 SECONDS equip_delay_other = 5 SECONDS + is_edible = 0 /obj/item/clothing/underwear/briefs/panties/portalpanties/attack_self(mob/user) . = ..() diff --git a/modular_sand/code/game/objects/items/plushes.dm b/modular_sand/code/game/objects/items/plushes.dm new file mode 100644 index 0000000000..fb50c80ce9 --- /dev/null +++ b/modular_sand/code/game/objects/items/plushes.dm @@ -0,0 +1,241 @@ +// Honestly, Saliith was just sad when he made this. Leave this file in the game to let people hug him. + +/obj/item/toy/plush/lizardplushie/saliith + name = "Saliith plushie" + desc = "He looks like he needs a friend." + icon = 'modular_sand/icons/obj/plushes.dmi' + icon_state = "saliith" + gender = MALE + can_random_spawn = FALSE + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF // Protected by a higher power + unstuffable = TRUE // Prevent grenades + +/obj/item/toy/plush/lizardplushie/saliith/Initialize(mapload, set_snowflake_id) + // Check if plush already exists + if(GLOB.saliith_plushie && (GLOB.saliith_plushie != src)) + return INITIALIZE_HINT_QDEL + + // Appear on orbit menu + GLOB.poi_list += src + + // Return normally + . = ..() + +/obj/item/toy/plush/lizardplushie/saliith/Destroy() + // Let's not keep the reference hanging around + GLOB.poi_list -= src + . = ..() + +/obj/item/toy/plush/lizardplushie/saliith/ComponentInitialize() + . = ..() + + // Add respawn component + AddComponent(/datum/component/stationloving) + + // Define pronouns + var/p_they = p_they() + var/p_s = p_s() + + // Add custom description + normal_desc = "[p_they] look[p_s] like [p_they] need[p_s] a friend." + +/obj/item/toy/plush/lizardplushie/saliith/examine(mob/user) + . = ..() + + // Define pronouns + var/p_them = p_them() + //var/p_they = p_they() + //var/p_are = p_are() + + // Check for stuffing + if(!stuffed) + // Update examine text and return + . += span_deadsay("[p_they(TRUE)] [p_are()] dead.") + return + + // Check if user is Saliith himself + if(user.ckey == "sandpoot") + // Update examine text and return + . += span_deadsay("You feel a sense of familiarity from [p_them].") + return + + // Check for antag datums + if((length(user?.mind?.antag_datums) >= 1)) + // Update examine text + . += span_warning("[src] gives you a menacing glare! Patting [p_them] would be a dangerous mistake.") + +/obj/item/toy/plush/lizardplushie/saliith/attack_self(mob/living/carbon/human/user) + // Check if user exists + if(!user) + // Return normally + return ..() + + // Check if user has a mind + if(!user.mind) + // Return normally + return ..() + + // Define pronouns + var/p_they = p_they() + //var/p_their = p_their() + var/p_s = p_s() + + // Check if user is Saliith himself + if(user.ckey == "sandpoot") + // Alert him and return + to_chat(user, span_notice("[p_they] give[p_s] you a hesitant gaze, but accept[p_s] the gesture anyhow.")) + return ..() + + // Check if user is an antagonist role + if((length(user?.mind?.antag_datums) >= 1)) + // Check if user is a xenobio changeling + if(user?.mind?.has_antag_datum(/datum/antagonist/changeling/xenobio)) + // Alert the user + to_chat(user, span_notice("[src] senses what you really are, but decides to spare you.")) + + // Check if user is a brainwashed victim + else if(user?.mind?.has_antag_datum(/datum/antagonist/brainwashed)) + // Alert the user + to_chat(user, span_notice("[src] senses that you're not in control of your actions, and offers [p_their()] sympathy.")) + + // User is not a whitelisted antagonist + else + // Drop the item + user.dropItemToGround(src) + + // Warn user + user.visible_message(span_warning("[src] smites [user] with an otherworldly wrath!"), span_boldwarning("You've made a grave mistake.")) + + // Get lightning location + var/turf/turf_target = get_step(get_step(user, NORTH), NORTH) + + // Perform lightning effect + turf_target.Beam(user, icon_state="lightning[rand(1,12)]", time = 5) + user.electrocution_animation(40) + + // Play sound effect + playsound(get_turf(user), 'sound/magic/lightningbolt.ogg', 50, 1) + + // Add fire damage + user.adjustFireLoss(120) + + // Return + return + + // User has no antagonist status + + // Alert the user + to_chat(user, span_notice("[p_they] give[p_s] you a hesitant gaze, but accepts the gesture anyhow.")) + + // Return + return ..() + +/obj/item/toy/plush/lizardplushie/saliith/attackby(obj/item/item_used, mob/living/user, params) + // Check for sharp object + if(item_used.get_sharpness()) + // Warn in local chat + visible_message(span_warning("[src] knocks \the [item_used] out of [user]'s hands!"), span_warning("[src] knocks \the [item_used] out of your hands!")) + + // Drop the item + user.dropItemToGround(item_used) + + // Throw the item away + item_used.throw_at(pick(oview(7,get_turf(src))),10,1) + + // Return + return + + // Check if user is Saliith himself + if(user.ckey == "sandpoot") + // Return with no effects + return ..() + + // Check for grenade + if(istype(item_used, /obj/item/grenade)) + // Warn in local chat + visible_message(span_warning("[src] forces \the [item_used] into [user]'s mouth!"), span_warning("[src] forces \the [item_used] into your mouth!")) + + // Define the grenade item + var/obj/item/grenade/item_grenade = item_used + + // Move grenade to the user + item_grenade.forceMove(user) + + // Set the detonation time + item_grenade.preprime(volume = 10) + + // Return + return + + // Return normally + return ..() + +/obj/item/toy/plush/lizardplushie/saliith/ex_act(severity, target, origin) + return + +/obj/item/toy/plush/plushling/plushie_absorb(obj/item/toy/plush/victim) + // Check if target is the Saliith plushie + if(istype(victim, /obj/item/toy/plush/lizardplushie/saliith)) + // Warn in local chat + visible_message(span_warning("[victim] violently parries the impostor! [src] is utterly annihilated!")) + + // Create a gib effect + new /obj/effect/gibspawner(get_turf(src)) + + // Delete the plushling + qdel(src) + + // Return + return + + // Return normally + return ..() + +/obj/item/toy/plush/love(obj/item/toy/plush/Kisser, mob/living/user) + // Define saliith plush + var/plush_saliith = /obj/item/toy/plush/lizardplushie/saliith + + // Check if interaction involves the Saliith plush + if(istype(src, plush_saliith) || istype(Kisser, plush_saliith)) + // Check if user is Saliith himself + if(user.ckey == "sandpoot") + // Return normally + return ..() + + // User is not Saliith + // Warn in local chat + user.visible_message(span_warning("[user] tried to force [Kisser] to kiss [src] against their will, and has been yeeted!"), span_warning("You try to force [Kisser] to kiss [src], but get yeeted instead!")) + + // Display voice of god message + say("YEET", spans = list("colossus","yell")) + + // Play sound + playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 200, TRUE, 5) + + // Drop the plushies if held + if(src in user.held_items) + user.dropItemToGround(src) + if(Kisser in user.held_items) + user.dropItemToGround(Kisser) + + // Launch user away + var/turf/yeet_target = get_edge_target_turf(user, pick(GLOB.alldirs)) + user.throw_at(yeet_target, 10, 14) + log_combat(src, user, "plush yeeted") + + // Return + return + + // Interaction does not involve Saliith + // Return normally + return ..() + +// Pinpointer for plushie toy +/obj/item/pinpointer/plushie_saliith + name = "Saliith plushie pinpointer" + desc = "A handheld tracking device that locates Saliith's plushie." + icon = 'modular_sand/icons/obj/device.dmi' + icon_state = "pinpointer_saliith" + +/obj/item/pinpointer/plushie_saliith/scan_for_target() + set_target(GLOB.saliith_plushie, src) diff --git a/modular_sand/code/modules/client/loadout/accessories.dm b/modular_sand/code/modules/client/loadout/accessories.dm index a317069bf4..61562dd38b 100644 --- a/modular_sand/code/modules/client/loadout/accessories.dm +++ b/modular_sand/code/modules/client/loadout/accessories.dm @@ -1,6 +1,5 @@ /datum/gear/accessories/ring - category = LOADOUT_CATEGORY_GLOVES - slot = ITEM_SLOT_HANDS + slot = ITEM_SLOT_ACCESSORY /datum/gear/accessories/ring/goldring name = "A gold ring" diff --git a/modular_sand/code/modules/client/loadout/backpack.dm b/modular_sand/code/modules/client/loadout/backpack.dm new file mode 100644 index 0000000000..c95cbab2c3 --- /dev/null +++ b/modular_sand/code/modules/client/loadout/backpack.dm @@ -0,0 +1,3 @@ +/datum/gear/backpack/pinpointer/plushie_saliith + name = "Saliith Plushie Pinpointer" + path = /obj/item/pinpointer/plushie_saliith diff --git a/modular_sand/code/modules/clothing/gloves/accessories.dm b/modular_sand/code/modules/clothing/gloves/accessories.dm index 1c3986de1f..e2afe193ff 100644 --- a/modular_sand/code/modules/clothing/gloves/accessories.dm +++ b/modular_sand/code/modules/clothing/gloves/accessories.dm @@ -3,7 +3,8 @@ desc = "A tiny gold ring, sized to wrap around a finger." gender = NEUTER w_class = WEIGHT_CLASS_TINY - slot_flags = ITEM_SLOT_GLOVES + slot_flags = ITEM_SLOT_ACCESSORY | ITEM_SLOT_GLOVES + slot_equipment_priority = ITEM_SLOT_ACCESSORY | ITEM_SLOT_GLOVES | ITEM_SLOT_BACKPACK icon = 'icons/obj/ring.dmi' mob_overlay_icon = 'icons/mob/clothing/hands.dmi' icon_state = "ringgold" diff --git a/modular_sand/code/modules/clothing/spacesuits/hardsuit.dm b/modular_sand/code/modules/clothing/spacesuits/hardsuit.dm index 63777f7482..a73639e808 100644 --- a/modular_sand/code/modules/clothing/spacesuits/hardsuit.dm +++ b/modular_sand/code/modules/clothing/spacesuits/hardsuit.dm @@ -136,7 +136,7 @@ "Conscript" = list( "name" = "Conscript suit", "desc" = "..and so he left, with new orders and new questions.", - "icon" = 'modular_sand/icons/mob/clothing/suit.dmi', + "icon" = 'modular_sand/icons/obj/clothing/suits.dmi', "icon_state" = "commando-armor", "mob_overlay_icon" = 'modular_sand/icons/mob/clothing/suit.dmi', "anthro_mob_worn_overlay" = 'modular_sand/icons/mob/clothing/suit_digi.dmi' @@ -151,10 +151,15 @@ . = ..() switch(current_skin) if("Conscript") - if(slot == ITEM_SLOT_OCLOTHING) - icon = 'modular_sand/icons/mob/clothing/suit.dmi' - else - icon = 'modular_sand/icons/obj/clothing/suits.dmi' + var/datum/component/armor_plate/armor_comp = GetComponent(/datum/component/armor_plate) + var/armor_level = 0 + var/armor_max = 0 + if(armor_comp) + armor_level = armor_comp.amount + armor_max = armor_comp.maxamount + + upgrade_icon(amount = armor_level, maxamount = armor_max) + else return @@ -171,37 +176,39 @@ if(istype(helmet)) mining_helmet = helmet + /// h suffix for helmet + var/datum/component/armor_plate/armor_comp_h = mining_helmet.GetComponent(/datum/component/armor_plate) + var/armor_level_h = 0 + var/armor_max_h = 0 + if(armor_comp_h) + armor_level_h = armor_comp_h.amount + armor_max_h = armor_comp_h.maxamount + switch(current_skin) if("Default") - if(armor_level != 0) - upgrade_icon(amount = armor_level, maxamount = armor_max) + upgrade_icon(amount = armor_level, maxamount = armor_max) if(mining_helmet) mining_helmet.name = initial(mining_helmet.name) mining_helmet.desc = initial(mining_helmet.desc) mining_helmet.icon = initial(mining_helmet.icon) mining_helmet.icon_state = initial(mining_helmet.icon_state) - if(armor_level != 0) - mining_helmet.upgrade_icon(amount = armor_level, maxamount = armor_max) + mining_helmet.upgrade_icon(amount = armor_level_h, maxamount = armor_max_h) mining_helmet.mob_overlay_icon = initial(mining_helmet.mob_overlay_icon) mining_helmet.anthro_mob_worn_overlay = initial(mining_helmet.anthro_mob_worn_overlay) /// Sprited by Dexxiol#3462 :) if("Conscript") - if(armor_level != 0) - upgrade_icon(amount = armor_level, maxamount = armor_max) + upgrade_icon(amount = armor_level, maxamount = armor_max) if(mining_helmet) mining_helmet.name = "Conscript helmet" mining_helmet.desc = "It shines briefly, full of life." - mining_helmet.icon = 'modular_sand/icons/mob/clothing/head.dmi' + mining_helmet.icon = 'modular_sand/icons/obj/clothing/hats.dmi' mining_helmet.icon_state = "commando-helmet" - if(armor_level != 0) - mining_helmet.upgrade_icon(amount = armor_level, maxamount = armor_max) + mining_helmet.upgrade_icon(amount = armor_level_h, maxamount = armor_max_h) mining_helmet.mob_overlay_icon = 'modular_sand/icons/mob/clothing/head.dmi' mining_helmet.anthro_mob_worn_overlay = 'modular_sand/icons/mob/clothing/head_muzzled.dmi' - if(current_equipped_slot != ITEM_SLOT_OCLOTHING) - icon = 'modular_sand/icons/obj/clothing/suits.dmi' /obj/item/clothing/head/helmet/space/hardsuit/mining/update_icon_state() switch(suit.current_skin) @@ -224,7 +231,7 @@ icon_state = "commando[hardsuit_type]" if(ishuman(loc)) var/mob/living/carbon/human/wearer = loc - if(wearer.head == src) + if(istype(wearer) && (wearer.head == src)) wearer.update_inv_head() else . = ..() @@ -238,10 +245,10 @@ hardsuit_type = "2-armor" if(amount == maxamount) hardsuit_type = "3-armor" - icon_state = "commando[hardsuit_type]" + icon_state = "commando[hardsuit_type][current_equipped_slot != ITEM_SLOT_OCLOTHING ? "-inhand" : ""]" if(ishuman(loc)) var/mob/living/carbon/human/wearer = loc - if(wearer.wear_suit == src) + if(istype(wearer) && (wearer.wear_suit == src)) wearer.update_inv_wear_suit() else . = ..() diff --git a/modular_sand/code/modules/clothing/under/_under.dm b/modular_sand/code/modules/clothing/under/_under.dm index fe6dcc8fba..7542a0c85a 100644 --- a/modular_sand/code/modules/clothing/under/_under.dm +++ b/modular_sand/code/modules/clothing/under/_under.dm @@ -1,7 +1,3 @@ -GLOBAL_LIST_INIT(skirt_peekable, list( - /obj/item/clothing/under/rank/civilian/janitor/maid = TRUE /* This one hangs about because no skirt in path */ - )) - /obj/item/clothing/under/Initialize(mapload) . = ..() if(!is_type_in_typecache(type, GLOB.skirt_peekable) && findlasttext("[type]", "skirt")) diff --git a/modular_sand/code/modules/clothing/under/color.dm b/modular_sand/code/modules/clothing/under/color.dm deleted file mode 100644 index 786fc955b3..0000000000 --- a/modular_sand/code/modules/clothing/under/color.dm +++ /dev/null @@ -1,2 +0,0 @@ -/obj/item/clothing/under/color/jumpskirt - is_skirt = TRUE diff --git a/modular_sand/code/modules/clothing/under/misc.dm b/modular_sand/code/modules/clothing/under/misc.dm deleted file mode 100644 index 87cb52eefc..0000000000 --- a/modular_sand/code/modules/clothing/under/misc.dm +++ /dev/null @@ -1,8 +0,0 @@ -/obj/item/clothing/under/rank/prisoner/skirt - is_skirt = TRUE - -/obj/item/clothing/under/misc/durathread/skirt - is_skirt = TRUE - -/obj/item/clothing/under/misc/cog/jumpskirt - is_skirt = TRUE diff --git a/modular_sand/code/modules/clothing/under/skirt_dress.dm b/modular_sand/code/modules/clothing/under/skirt_dress.dm deleted file mode 100644 index 79bf474a80..0000000000 --- a/modular_sand/code/modules/clothing/under/skirt_dress.dm +++ /dev/null @@ -1,2 +0,0 @@ -/obj/item/clothing/under/dress/skirt //inb4 this breaks something - is_skirt = TRUE diff --git a/modular_sand/code/modules/clothing/under/suits.dm b/modular_sand/code/modules/clothing/under/suits.dm deleted file mode 100644 index 04a37b0471..0000000000 --- a/modular_sand/code/modules/clothing/under/suits.dm +++ /dev/null @@ -1,5 +0,0 @@ -/obj/item/clothing/under/suit/white_on_white/skirt - is_skirt = TRUE - -/obj/item/clothing/under/suit/black/skirt - is_skirt = TRUE diff --git a/modular_sand/code/modules/clothing/under/syndicate.dm b/modular_sand/code/modules/clothing/under/syndicate.dm deleted file mode 100644 index 04f160c705..0000000000 --- a/modular_sand/code/modules/clothing/under/syndicate.dm +++ /dev/null @@ -1,8 +0,0 @@ -/obj/item/clothing/under/syndicate/skirt - is_skirt = TRUE - -/obj/item/clothing/under/syndicate/tacticool/skirt - is_skirt = TRUE - -/obj/item/clothing/under/syndicate/cosmetic/skirt - is_skirt = TRUE diff --git a/modular_sand/code/modules/jobs/job_types/prisoner.dm b/modular_sand/code/modules/jobs/job_types/prisoner.dm new file mode 100644 index 0000000000..3921e11891 --- /dev/null +++ b/modular_sand/code/modules/jobs/job_types/prisoner.dm @@ -0,0 +1,3 @@ +// I'm letting you get 5 spawn positions because latejoin is broken, do not disappoint +/datum/job/prisoner + spawn_positions = 5 diff --git a/modular_sand/code/modules/mining/machine_bluespaceminer.dm b/modular_sand/code/modules/mining/machine_bluespaceminer.dm index 9241f8745e..80fd0dadd9 100644 --- a/modular_sand/code/modules/mining/machine_bluespaceminer.dm +++ b/modular_sand/code/modules/mining/machine_bluespaceminer.dm @@ -1,3 +1,7 @@ +// Configuration defines +#define BLUESPACE_MINER_BONUS_MULT CONFIG_GET(number/bluespaceminer_mult_output) +#define BLUESPACE_MINER_CRYSTAL_TIER CONFIG_GET(number/bluespaceminer_crystal_tier) + /obj/machinery/mineral/bluespace_miner name = "bluespace mining machine" desc = "A machine that uses the magic of Bluespace to slowly generate materials and add them to a linked ore silo." @@ -8,7 +12,16 @@ circuit = /obj/item/circuitboard/machine/bluespace_miner layer = BELOW_OBJ_LAYER init_process = TRUE - var/list/ore_rates = list(/datum/material/iron = 0.3, /datum/material/glass = 0.3, /datum/material/plasma = 0.1, /datum/material/silver = 0.1, /datum/material/gold = 0.05, /datum/material/titanium = 0.05, /datum/material/uranium = 0.05, /datum/material/diamond = 0.02) + var/list/ore_rates = list( + /datum/material/iron = 0.3, + /datum/material/glass = 0.3, + /datum/material/plasma = 0.1, + /datum/material/silver = 0.1, + /datum/material/gold = 0.05, + /datum/material/titanium = 0.05, + /datum/material/uranium = 0.05, + /datum/material/diamond = 0.02 + ) var/datum/component/remote_materials/materials var/multiplier = 0 //Multiplier by tier, has been made fair and everything @@ -16,11 +29,14 @@ . = ..() materials = AddComponent(/datum/component/remote_materials, "bsm", mapload) + // Set initial multiplier based on config + multiplier *= BLUESPACE_MINER_BONUS_MULT + /obj/machinery/mineral/bluespace_miner/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) . += span_notice("A small screen on the machine reads, \"Efficiency at [multiplier * 100]%\"") - if(multiplier >= 5) + if(multiplier >= BLUESPACE_MINER_CRYSTAL_TIER) . += span_notice("Bluespace generation is active.") if(!anchored) . += span_warning("The machine won't work while not firmly secured to the ground.") @@ -38,11 +54,14 @@ multiplier += L.rating stock_amt++ multiplier /= stock_amt - if(multiplier >= 5) + if(multiplier >= BLUESPACE_MINER_CRYSTAL_TIER) ore_rates[/datum/material/bluespace] = 0.01 else ore_rates -= /datum/material/bluespace + // Apply config multiplier here to not interfere with bluespace material check + multiplier *= BLUESPACE_MINER_BONUS_MULT + /obj/machinery/mineral/bluespace_miner/Destroy() materials = null return ..() @@ -108,3 +127,6 @@ if(default_unfasten_wrench(user, I)) return TRUE return FALSE + +#undef BLUESPACE_MINER_BONUS_MULT +#undef BLUESPACE_MINER_CRYSTAL_TIER diff --git a/modular_sand/code/modules/mob/living/carbon/human/examine.dm b/modular_sand/code/modules/mob/living/carbon/human/examine.dm deleted file mode 100644 index 5e0b39bce8..0000000000 --- a/modular_sand/code/modules/mob/living/carbon/human/examine.dm +++ /dev/null @@ -1,77 +0,0 @@ -GLOBAL_LIST_INIT(pairless_panties, list( - /obj/item/clothing/underwear/briefs/jockstrap = TRUE, - /obj/item/clothing/underwear/briefs/panties/thong = TRUE, - /obj/item/clothing/underwear/briefs/panties/thong/babydoll = TRUE, - /obj/item/clothing/underwear/briefs/mankini = TRUE -)) - -/mob/living/carbon/human/examine(mob/user) - . = ..() - var/mob/living/living = user - var/obj/item/clothing/under/worn_uniform = get_item_by_slot(ITEM_SLOT_ICLOTHING) - if(worn_uniform && is_type_in_typecache(worn_uniform.type, GLOB.skirt_peekable) && (isobserver(user) || (isliving(user) && (user != src) && !(living.mobility_flags & MOBILITY_STAND) && (mobility_flags & MOBILITY_STAND) && (loc == living.loc) && (istype(worn_uniform))))) - . += span_purple("[p_theyre(TRUE)] wearing a [worn_uniform.name]! You can probably give it a little peek by looking closer.") - -/mob/living/carbon/human/Initialize(mapload) - . = ..() - RegisterSignal(src, COMSIG_PARENT_EXAMINE_MORE, .proc/peek_skirt) - -/mob/living/carbon/human/proc/peek_skirt(mob/examined, mob/examiner, list/examine_content) - var/mob/living/living = examiner - var/obj/item/clothing/under/worn_uniform = get_item_by_slot(ITEM_SLOT_ICLOTHING) - if(worn_uniform && is_type_in_typecache(worn_uniform.type, GLOB.skirt_peekable) && (isobserver(examiner) || (isliving(examiner) && (examiner != src) && !(living.mobility_flags & MOBILITY_STAND) && (mobility_flags & MOBILITY_STAND) && (loc == living.loc) && (istype(worn_uniform))))) - var/string = "Peeking under [src]'s [worn_uniform.name], you can see " - var/obj/item/clothing/underwear/worn_underwear = get_item_by_slot(ITEM_SLOT_UNDERWEAR) - if(worn_underwear) - string += "a " - if(!is_type_in_typecache(worn_underwear.type, GLOB.pairless_panties)) //a pair of thong - string += "pair of " - if(worn_underwear.color) - string += "[worn_underwear.name]." - else - string += "[worn_underwear.name]." - - var/obj/item/organ/genital/penis/penis = getorganslot(ORGAN_SLOT_PENIS) - var/obj/item/organ/genital/vagina/vagina = getorganslot(ORGAN_SLOT_VAGINA) - if(penis?.aroused_state) - string += span_love(" There's a visible bulge on [p_their()] front.") - else if(vagina?.aroused_state) - string += span_love(" [p_theyre(TRUE)] wet with arousal.") - - else - string += "[p_theyre()] not wearing anything!\n[p_their(TRUE)]" - var/list/genitals = list() - for(var/obj/item/organ/genital/genital in internal_organs) - if(genital.genital_flags & (GENITAL_INTERNAL|GENITAL_HIDDEN)) - continue - - var/appended - switch(genital.type) - if(/obj/item/organ/genital/vagina) - if(genital.aroused_state) - appended += " wet" - if(lowertext(genital.shape) != "human") - appended += " [lowertext(genital.shape)]" - if(lowertext(genital.shape) != "cloaca") //their wet cloaca vagina - appended += " [lowertext(genital.name)]" // goodbye pussy - - if(/obj/item/organ/genital/testicles) - var/obj/item/organ/genital/testicles/nuts = genital - appended += " [lowertext(nuts.size_name)] [lowertext(nuts.name)]" - if(/obj/item/organ/genital/penis) - if(genital.aroused_state) - appended += " fully erect" - if(lowertext(genital.shape) != "human") - appended += " [lowertext(genital.shape)]" - appended += " [lowertext(genital.name)]" // Name it something funny, i dare you. - if(/obj/item/organ/genital/butt) - var/obj/item/organ/genital/butt/booty = genital - appended += " [booty.size_name] [lowertext(booty.name)]" // Maybe " average butt pair" isn't the best for now - else - continue - genitals += appended - - string += english_list(genitals, " featureless groin", " and", ",") - string += " on full display." - - examine_content += span_purple(string) diff --git a/modular_sand/code/modules/mob/living/carbon/human/human.dm b/modular_sand/code/modules/mob/living/carbon/human/human.dm index 4c4b8e7fc3..5abc5a899b 100644 --- a/modular_sand/code/modules/mob/living/carbon/human/human.dm +++ b/modular_sand/code/modules/mob/living/carbon/human/human.dm @@ -1,3 +1,4 @@ /mob/living/carbon/human/ComponentInitialize() . = ..() AddElement(/datum/element/mob_holder/micro, "micro") + AddElement(/datum/element/skirt_peeking) diff --git a/modular_sand/code/modules/mob/living/carbon/human/species_types/anthropomorph.dm b/modular_sand/code/modules/mob/living/carbon/human/species_types/anthropomorph.dm new file mode 100644 index 0000000000..66ba0e63e2 --- /dev/null +++ b/modular_sand/code/modules/mob/living/carbon/human/species_types/anthropomorph.dm @@ -0,0 +1,8 @@ +/datum/species/mammal/synthetic/New() + . = ..() + + // Define inherent traits to add + var/modular_inherent_traits = list(TRAIT_NOTHIRST) + + // Add new traits to list + LAZYADD(inherent_traits, modular_inherent_traits) diff --git a/modular_sand/code/modules/mob/living/carbon/human/species_types/ipc.dm b/modular_sand/code/modules/mob/living/carbon/human/species_types/ipc.dm new file mode 100644 index 0000000000..aa1ad76fbf --- /dev/null +++ b/modular_sand/code/modules/mob/living/carbon/human/species_types/ipc.dm @@ -0,0 +1,8 @@ +/datum/species/ipc/New() + . = ..() + + // Define inherent traits to add + var/modular_inherent_traits = list(TRAIT_NOTHIRST) + + // Add new traits to list + LAZYADD(inherent_traits, modular_inherent_traits) diff --git a/modular_sand/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/modular_sand/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index 505aaeeeca..a238241b79 100644 --- a/modular_sand/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/modular_sand/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -1,3 +1,31 @@ +#define ESTROUS_CYCLE_LENGTH 32 +#define ESTROUS_CYCLE_OFFSET 11 + /datum/species/lizard/New() mutant_bodyparts += list("ears" = "None") . = ..() + +/datum/species/lizard/ashwalker/on_species_gain(mob/living/carbon/human/C, datum/species/old_species) + . = ..() + + // Add estrous detect quirk + C.add_quirk(/datum/quirk/estrous_detection, SPECIES_TRAIT) + + // Define round ID + // Requires a server database to use this + var/round_id = text2num(GLOB.round_id) || null + + // Define round mating season value + var/round_season = ((round_id + (ESTROUS_CYCLE_OFFSET + 2)) % ESTROUS_CYCLE_LENGTH) + + // Check for mating season + // Default to active without variable + if((!round_id) || round_season <= 2 && round_season >= 0) + // Alert user in chat + to_chat(C, span_userlove("It\'s that time again. Your loins lay restless as they await a potential mate.")) + + // Add estrous quirk + C.add_quirk(/datum/quirk/estrous_active, SPECIES_TRAIT) + +#undef ESTROUS_CYCLE_LENGTH +#undef ESTROUS_CYCLE_OFFSET diff --git a/modular_sand/code/modules/mob/living/carbon/human/species_types/synthliz.dm b/modular_sand/code/modules/mob/living/carbon/human/species_types/synthliz.dm new file mode 100644 index 0000000000..6ae0536688 --- /dev/null +++ b/modular_sand/code/modules/mob/living/carbon/human/species_types/synthliz.dm @@ -0,0 +1,8 @@ +/datum/species/synthliz/New() + . = ..() + + // Define inherent traits to add + var/modular_inherent_traits = list(TRAIT_NOTHIRST) + + // Add new traits to list + LAZYADD(inherent_traits, modular_inherent_traits) diff --git a/modular_sand/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/modular_sand/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index ac51d7e5ec..12189b10ba 100644 --- a/modular_sand/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/modular_sand/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -1,21 +1,3 @@ -//Kinetic accelerator charging meme bugfix -/obj/item/gun/energy/kinetic_accelerator/ - var/chargetimer = null - -/obj/item/gun/energy/kinetic_accelerator/proc/reload() - if(ismob(loc) || isturf(loc)) //Kinetic accelerators won't charge inside objects. Period. - cell.give(cell.maxcharge) - if(!suppressed) - playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1) - else - to_chat(loc, span_warning("[src] silently charges up.")) - update_icon() - overheat = FALSE - else //this is a terrible solution, but it ensures that it wont be stuck on dischaged if it fails to reload in an obj - if(chargetimer) - deltimer(chargetimer) - chargetimer = addtimer(CALLBACK(src, .proc/reload), overheat_time * 2, TIMER_STOPPABLE) - //BDM pka /obj/item/gun/energy/kinetic_accelerator/premiumka/bdminer name = "bloody accelerator" @@ -568,3 +550,37 @@ /obj/item/borg/upgrade/modkit/aoe/heavy/modify_projectile(obj/item/projectile/kinetic/K) K.name = "heavy kinetic explosion" + +/obj/item/gun/energy/kinetic_accelerator/premiumka + unique_reskin = list( + "Default" = list( + "name" = "premium accelerator", + "desc" = "A premium kinetic accelerator fitted with an extended barrel and increased pressure tank.", + "icon" = 'icons/obj/guns/energy.dmi', + "icon_state" = "premiumgun", + "item_state" = "premiumgun", + "lefthand_file" = 'icons/mob/inhands/weapons/guns_lefthand.dmi', + "righthand_file" = 'icons/mob/inhands/weapons/guns_righthand.dmi' + ), + "Conscript's tapper" = list( + "name" = "Conscript's tapper", + "desc" = "Good 'ol kinetic handgun that has been revised to mining and killing tool, works better in pair.", // lies + "icon" = 'modular_sand/icons/obj/guns/energy.dmi', + "icon_state" = "commando-gun", + "item_state" = "commando-gun", + "lefthand_file" = 'modular_sand/icons/mob/inhands/weapons/guns_lefthand.dmi', + "righthand_file" = 'modular_sand/icons/mob/inhands/weapons/guns_righthand.dmi' + ) + ) + +/obj/item/gun/energy/kinetic_accelerator/premiumka/reskin_obj(mob/user) + . = ..() + if(ismob(loc) && current_equipped_slot == ITEM_SLOT_HANDS) + var/mob/update_hands = loc + update_hands.update_inv_hands() + +/obj/item/gun/energy/kinetic_accelerator/premiumka/update_overlays() + . = ..() + if(current_skin == "Conscript's tapper") + if(can_shoot()) + . += "[icon_state]_cocked" diff --git a/modular_sand/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_sand/code/modules/reagents/chemistry/reagents/fermi_reagents.dm new file mode 100644 index 0000000000..903dbbd43c --- /dev/null +++ b/modular_sand/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -0,0 +1,28 @@ +// Plushmium object reaction +/datum/reagent/fermi/plushmium/reaction_obj(obj/O, reac_volume) + // Check for Saliith plush + if(istype(O, /obj/item/toy/plush/lizardplushie/saliith)) + // Check if a carbon user exists + if((!usr) || (!iscarbon(usr))) + // Return without any effects + return + + // Warn in local chat + O.loc.visible_message(span_warning("[src] is sprayed with a strange chemical, and reacts with overwhelming hostility! [usr] is sprayed with a concoction of horrible chemicals!")) + + // Define user mob + var/mob/living/carbon/human/spray_user = usr + + // Add chemicals + spray_user.reagents.add_reagent(/datum/reagent/toxin/mutagen, 20) + spray_user.reagents.add_reagent(/datum/reagent/toxin/mindbreaker, 20) + spray_user.reagents.add_reagent(/datum/reagent/toxin/mutetoxin, 20) + //spray_user.reagents.add_reagent(/datum/reagent/toxin/histamine, 30) + spray_user.reagents.add_reagent(/datum/reagent/toxin/bonehurtingjuice, 30) + spray_user.reagents.add_reagent(/datum/reagent/toxin/brainhurtingjuice, 30) + + // Return without further effects + return + + // Return normally + . = ..() diff --git a/modular_sand/code/modules/research/designs/machine_designs.dm b/modular_sand/code/modules/research/designs/machine_designs.dm index 64cd845088..e5a4887cd1 100644 --- a/modular_sand/code/modules/research/designs/machine_designs.dm +++ b/modular_sand/code/modules/research/designs/machine_designs.dm @@ -33,21 +33,21 @@ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL //Cryptocurrency Miners -// /datum/design/board/cryptominer -// name = "Machine Design (Cryptocurrency Miner)" -// desc = "The circuit board for a Cryptocurrency Miner." -// id = "cryptominer" -// build_path = /obj/item/circuitboard/machine/cryptominer -// category = list("Misc. Machinery") -// departmental_flags = DEPARTMENTAL_FLAG_CARGO +/datum/design/board/cryptominer + name = "Machine Design (Cryptocurrency Miner)" + desc = "The circuit board for a Cryptocurrency Miner." + id = "cryptominer" + build_path = /obj/item/circuitboard/machine/cryptominer + category = list("Misc. Machinery") + departmental_flags = DEPARTMENTAL_FLAG_CARGO -// /datum/design/board/cryptominer/syndie -// name = "Machine Design (Syndicate Cryptocurrency Miner)" -// desc = "The circuit board for a Syndicate Cryptocurrency Miner." -// id = "cryptominersyndie" -// build_path = /obj/item/circuitboard/machine/cryptominer/syndie -// category = list("Misc. Machinery") -// departmental_flags = DEPARTMENTAL_FLAG_CARGO +/datum/design/board/cryptominer/syndie + name = "Machine Design (Syndicate Cryptocurrency Miner)" + desc = "The circuit board for a Syndicate Cryptocurrency Miner." + id = "cryptominersyndie" + build_path = /obj/item/circuitboard/machine/cryptominer/syndie + category = list("Misc. Machinery") + departmental_flags = DEPARTMENTAL_FLAG_CARGO //BS miner /datum/design/board/bluespace_miner diff --git a/modular_sand/code/modules/research/techweb/nodes/bluespace_nodes.dm b/modular_sand/code/modules/research/techweb/nodes/bluespace_nodes.dm index c36d90391c..e341a5c1ab 100644 --- a/modular_sand/code/modules/research/techweb/nodes/bluespace_nodes.dm +++ b/modular_sand/code/modules/research/techweb/nodes/bluespace_nodes.dm @@ -1,18 +1,18 @@ -// /datum/techweb_node/cryptominer -// id = "cryptominer" -// display_name = "Cryptocurrency Mining" -// description = "Harness the power of cryptocurrency to make credits for Cargo-- slowly." -// prereq_ids = list("bluespace_mining") -// design_ids = list("cryptominer") -// research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) +/datum/techweb_node/cryptominer + id = "cryptominer" + display_name = "Cryptocurrency Mining" + description = "Harness the power of cryptocurrency to make credits for Cargo-- slowly." + prereq_ids = list("bluespace_mining") + design_ids = list("cryptominer") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) -// /datum/techweb_node/cryptominersyndie -// id = "cryptominersyndie" -// display_name = "Illegal Cryptocurrency Mining" -// description = "Harness the power of bluespace to make credits for Cargo-- slowly." -// prereq_ids = list("cryptominer","syndicate_basic") -// design_ids = list("cryptominersyndie") -// research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) +/datum/techweb_node/cryptominersyndie + id = "cryptominersyndie" + display_name = "Illegal Cryptocurrency Mining" + description = "Harness the power of bluespace to make credits for Cargo-- slowly." + prereq_ids = list("cryptominer","syndicate_basic") + design_ids = list("cryptominersyndie") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) /datum/techweb_node/computermath id = "computermath" @@ -33,8 +33,8 @@ /datum/techweb_node/bs_mining id = "bluespace_mining" display_name = "Bluespace Mining Technology" - description = "Harness the power of bluespace to make materials out of nothing. Slowly." - prereq_ids = list("practical_bluespace", "adv_mining") + description = "Harness the power of bluespace to make materials out of nothing, slowly. Requires a bluespace core to function." + prereq_ids = list("practical_bluespace", "adv_mining", "anomaly_research") design_ids = list("bluespace_miner") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500) diff --git a/modular_sand/icons/UI_Icons/inventory/socks.png b/modular_sand/icons/UI_Icons/inventory/socks.png index 9a5be04056..51ce9251de 100644 Binary files a/modular_sand/icons/UI_Icons/inventory/socks.png and b/modular_sand/icons/UI_Icons/inventory/socks.png differ diff --git a/modular_sand/icons/UI_Icons/inventory/undershirt.png b/modular_sand/icons/UI_Icons/inventory/undershirt.png index 3f581ec749..4ff410e90b 100644 Binary files a/modular_sand/icons/UI_Icons/inventory/undershirt.png and b/modular_sand/icons/UI_Icons/inventory/undershirt.png differ diff --git a/modular_sand/icons/UI_Icons/inventory/underwear.png b/modular_sand/icons/UI_Icons/inventory/underwear.png index b03245044c..1862bee7ca 100644 Binary files a/modular_sand/icons/UI_Icons/inventory/underwear.png and b/modular_sand/icons/UI_Icons/inventory/underwear.png differ diff --git a/modular_sand/icons/mob/clothing/head.dmi b/modular_sand/icons/mob/clothing/head.dmi index e4e8b762c5..b0b9a34673 100644 Binary files a/modular_sand/icons/mob/clothing/head.dmi and b/modular_sand/icons/mob/clothing/head.dmi differ diff --git a/modular_sand/icons/mob/clothing/head_muzzled.dmi b/modular_sand/icons/mob/clothing/head_muzzled.dmi index 168b605f70..19eb0eaf85 100644 Binary files a/modular_sand/icons/mob/clothing/head_muzzled.dmi and b/modular_sand/icons/mob/clothing/head_muzzled.dmi differ diff --git a/modular_sand/icons/mob/clothing/suit.dmi b/modular_sand/icons/mob/clothing/suit.dmi index cf40ce721c..0cfaf655f8 100644 Binary files a/modular_sand/icons/mob/clothing/suit.dmi and b/modular_sand/icons/mob/clothing/suit.dmi differ diff --git a/modular_sand/icons/mob/inhands/weapons/guns_lefthand.dmi b/modular_sand/icons/mob/inhands/weapons/guns_lefthand.dmi index 8871ec5afd..1b9839a127 100644 Binary files a/modular_sand/icons/mob/inhands/weapons/guns_lefthand.dmi and b/modular_sand/icons/mob/inhands/weapons/guns_lefthand.dmi differ diff --git a/modular_sand/icons/mob/inhands/weapons/guns_righthand.dmi b/modular_sand/icons/mob/inhands/weapons/guns_righthand.dmi index a07597f370..ac450ce359 100644 Binary files a/modular_sand/icons/mob/inhands/weapons/guns_righthand.dmi and b/modular_sand/icons/mob/inhands/weapons/guns_righthand.dmi differ diff --git a/modular_sand/icons/mob/screen_clockwork.dmi b/modular_sand/icons/mob/screen_clockwork.dmi index aa72185aeb..eefd18fdc5 100644 Binary files a/modular_sand/icons/mob/screen_clockwork.dmi and b/modular_sand/icons/mob/screen_clockwork.dmi differ diff --git a/modular_sand/icons/mob/screen_liteweb.dmi b/modular_sand/icons/mob/screen_liteweb.dmi index 15ad6f42c6..80223eaa84 100644 Binary files a/modular_sand/icons/mob/screen_liteweb.dmi and b/modular_sand/icons/mob/screen_liteweb.dmi differ diff --git a/modular_sand/icons/mob/screen_midnight.dmi b/modular_sand/icons/mob/screen_midnight.dmi index 1b991bb960..9366925181 100644 Binary files a/modular_sand/icons/mob/screen_midnight.dmi and b/modular_sand/icons/mob/screen_midnight.dmi differ diff --git a/modular_sand/icons/mob/screen_operative.dmi b/modular_sand/icons/mob/screen_operative.dmi index 70824ea898..a435e1bece 100644 Binary files a/modular_sand/icons/mob/screen_operative.dmi and b/modular_sand/icons/mob/screen_operative.dmi differ diff --git a/modular_sand/icons/mob/screen_plasmafire.dmi b/modular_sand/icons/mob/screen_plasmafire.dmi index 3a07a34232..61d501dbe2 100644 Binary files a/modular_sand/icons/mob/screen_plasmafire.dmi and b/modular_sand/icons/mob/screen_plasmafire.dmi differ diff --git a/modular_sand/icons/mob/screen_retro.dmi b/modular_sand/icons/mob/screen_retro.dmi index ba20a9e8bd..a25def4d11 100644 Binary files a/modular_sand/icons/mob/screen_retro.dmi and b/modular_sand/icons/mob/screen_retro.dmi differ diff --git a/modular_sand/icons/mob/screen_slimecore.dmi b/modular_sand/icons/mob/screen_slimecore.dmi index a4854f16c3..1b51613f97 100644 Binary files a/modular_sand/icons/mob/screen_slimecore.dmi and b/modular_sand/icons/mob/screen_slimecore.dmi differ diff --git a/modular_sand/icons/obj/clothing/hats.dmi b/modular_sand/icons/obj/clothing/hats.dmi index e393feeb57..b269f8d166 100644 Binary files a/modular_sand/icons/obj/clothing/hats.dmi and b/modular_sand/icons/obj/clothing/hats.dmi differ diff --git a/modular_sand/icons/obj/clothing/suits.dmi b/modular_sand/icons/obj/clothing/suits.dmi index f2b9bedc0e..05ba6f3f04 100644 Binary files a/modular_sand/icons/obj/clothing/suits.dmi and b/modular_sand/icons/obj/clothing/suits.dmi differ diff --git a/modular_sand/icons/obj/contraband.dmi b/modular_sand/icons/obj/contraband.dmi index 37d26caed6..81f26f8c34 100644 Binary files a/modular_sand/icons/obj/contraband.dmi and b/modular_sand/icons/obj/contraband.dmi differ diff --git a/modular_sand/icons/obj/device.dmi b/modular_sand/icons/obj/device.dmi index 555e379fb6..28b1b5503e 100644 Binary files a/modular_sand/icons/obj/device.dmi and b/modular_sand/icons/obj/device.dmi differ diff --git a/modular_sand/icons/obj/guns/energy.dmi b/modular_sand/icons/obj/guns/energy.dmi index 18cb252bd8..5b5e9867cf 100644 Binary files a/modular_sand/icons/obj/guns/energy.dmi and b/modular_sand/icons/obj/guns/energy.dmi differ diff --git a/modular_sand/icons/obj/plushes.dmi b/modular_sand/icons/obj/plushes.dmi index 55aeacf397..71bd3885c4 100644 Binary files a/modular_sand/icons/obj/plushes.dmi and b/modular_sand/icons/obj/plushes.dmi differ diff --git a/modular_splurt/code/controllers/configuration/entries/splurt_general.dm b/modular_splurt/code/controllers/configuration/entries/splurt_general.dm index 8c79ccfe15..cf0b983434 100644 --- a/modular_splurt/code/controllers/configuration/entries/splurt_general.dm +++ b/modular_splurt/code/controllers/configuration/entries/splurt_general.dm @@ -4,3 +4,6 @@ config_entry_value = 5 /datum/config_entry/flag/weighted_station_traits + +/datum/config_entry/number/base_save_slots + config_entry_value = DEFAULT_SAVE_SLOTS diff --git a/modular_splurt/code/datums/elements/mob_holder.dm b/modular_splurt/code/datums/elements/mob_holder.dm new file mode 100644 index 0000000000..ff64372b70 --- /dev/null +++ b/modular_splurt/code/datums/elements/mob_holder.dm @@ -0,0 +1,2 @@ +/obj/item/clothing/head/mob_holder + is_edible = -1 diff --git a/modular_splurt/code/datums/interactions/lewd/lewd_datums.dm b/modular_splurt/code/datums/interactions/lewd/lewd_datums.dm index ca6fddf6e8..896cc1c05f 100644 --- a/modular_splurt/code/datums/interactions/lewd/lewd_datums.dm +++ b/modular_splurt/code/datums/interactions/lewd/lewd_datums.dm @@ -469,6 +469,20 @@ if(gut) gut.modify_size(-1) +/datum/interaction/lewd/inflate_belly + description = "Inflate belly" + require_user_belly = REQUIRE_EXPOSED + interaction_sound = null + max_distance = 0 + user_is_target = TRUE + write_log_user = "inflated their belly" + write_log_target = null + +/datum/interaction/lewd/inflate_belly/display_interaction(mob/living/carbon/user) + var/obj/item/organ/genital/belly/gut = user.getorganslot(ORGAN_SLOT_BELLY) + if(gut) + gut.modify_size(1) + /datum/interaction/lewd/nuzzle_belly description = "Nuzzle their belly." require_target_belly = REQUIRE_EXPOSED diff --git a/modular_splurt/code/datums/mood_events/drug_events.dm b/modular_splurt/code/datums/mood_events/drug_events.dm index 3cbe25cf67..906326aab2 100644 --- a/modular_splurt/code/datums/mood_events/drug_events.dm +++ b/modular_splurt/code/datums/mood_events/drug_events.dm @@ -3,6 +3,6 @@ description = span_nicegreen("I feel like I\'m finally coping!") /datum/mood_event/moth_in_chief - description = span_nicegreen("The mantle rests well upon your shoulders?") + description = span_nicegreen("The mantle rests well upon your shoulders?\n") mood_change = 10 timeout = 5 MINUTES diff --git a/modular_splurt/code/datums/mood_events/generic_negative_events.dm b/modular_splurt/code/datums/mood_events/generic_negative_events.dm index 204bc9c5cd..7d63afe9f0 100644 --- a/modular_splurt/code/datums/mood_events/generic_negative_events.dm +++ b/modular_splurt/code/datums/mood_events/generic_negative_events.dm @@ -1,5 +1,5 @@ /datum/mood_event/masked_mook_incomplete - description = span_warning("I feel incomplete without a gas mask...") + description = span_warning("I feel incomplete without a gas mask...\n") mood_change = -4 /datum/mood_event/creampie/cheesed @@ -12,7 +12,7 @@ if(!ishuman(actual_owner)) return . if(iscatperson(actual_owner)) - description = span_warning("CHEESE!!! WAAAAAAAAAAAAAAAAAAAAAAAAAAAA!!!") + description = span_warning("CHEESE!!! WAAAAAAAAAAAAAAAAAAAAAAAAAAAA!!!\n") mood_change = -5 timeout = 5 MINUTES @@ -23,3 +23,14 @@ /datum/mood_event/dorsualiphobic_mood_negative description = span_warning("I can't let anyone find out if I'm wearing a backpack or not!\n") mood_change = -4 + +// Matches drinking synth blood (drankblood_synth) +/datum/mood_event/drankblood_slime + description = span_boldwarning("I drank liquid slime. What is wrong with me?\n") + mood_change = -7 + timeout = 15 MINUTES + +/datum/mood_event/drank_cursed_bad + description = span_warning("I can feel a pale curse from the blood I drank.\n") + mood_change = -1 + timeout = 2 MINUTES diff --git a/modular_splurt/code/datums/mood_events/generic_positive_events.dm b/modular_splurt/code/datums/mood_events/generic_positive_events.dm index 0696042bd2..161be9cd46 100644 --- a/modular_splurt/code/datums/mood_events/generic_positive_events.dm +++ b/modular_splurt/code/datums/mood_events/generic_positive_events.dm @@ -1,22 +1,35 @@ /datum/mood_event/lewd_headpat - description = span_nicegreen("I love headpats so much!") + description = span_nicegreen("I love headpats so much!\n") mood_change = 3 timeout = 2 MINUTES /datum/mood_event/qareen_bliss - description = span_umbra("So.. horny...") + description = span_umbra("So.. horny...\n") mood_change = 5 /datum/mood_event/qareen_bliss/add_effects() - description = span_umbra("Must.. breed. , [pick("Nngggghh", "Can't.. think.", "It feels so good.", "Need.. fuck.")]...") + description = span_umbra("Must.. breed. , [pick("Nngggghh", "Can't.. think.", "It feels so good.", "Need.. fuck.")]...\n") /datum/mood_event/masked_mook - description = span_nicegreen("I feel more complete with gas mask on.") + description = span_nicegreen("I feel more complete with gas mask on.\n") mood_change = 1 +/datum/mood_event/cloth_eaten + description = " That sure was a tasty outfit!\n" + mood_change = 3 + timeout = 2400 + +/datum/mood_event/cloth_eaten/add_effects(obj/item/clothing/eaten) + description = "That sure was a [pick("tasty","good","linty","amazing")] [eaten.name]!\n" + /datum/mood_event/nudist_positive - description = span_nicegreen("I'm delighted to not be constricted by clothing.") + description = span_nicegreen("I'm delighted to not be constricted by clothing.\n") mood_change = 1 /datum/mood_event/dorsualiphobic_mood_positive - description = span_nicegreen("Nobody will know if I'm wearing a backpack or not.") + description = span_nicegreen("Nobody will know if I'm wearing a backpack or not.\n") mood_change = 1 + +/datum/mood_event/drank_cursed_good + description = span_nicegreen("I\'ve tasted sympathy from a fellow curse bearer.\n") + mood_change = 1 + timeout = 2 MINUTES diff --git a/modular_splurt/code/datums/mood_events/needs_events.dm b/modular_splurt/code/datums/mood_events/needs_events.dm index 6b92548f72..046a796a19 100644 --- a/modular_splurt/code/datums/mood_events/needs_events.dm +++ b/modular_splurt/code/datums/mood_events/needs_events.dm @@ -3,14 +3,14 @@ var/mob/living/carbon/human/actual_owner = owner_mob() if(!HAS_TRAIT(actual_owner, TRAIT_VORACIOUS)) return - description = span_nicegreen("MORE FOOD!!! MORE FOOD!!! MORE FOOD!!!") + description = span_nicegreen("MORE FOOD!!! MORE FOOD!!! MORE FOOD!!!\n") mood_change = 8 /datum/mood_event/cum_craving - description = "I... NEED... CUM...\n" + description = span_warning("I... NEED... CUM...\n") mood_change = -20 /datum/mood_event/cum_stuffed - description = span_nicegreen("It feels so good inside me!") + description = span_nicegreen("It feels so good inside me!\n") mood_change = 8 timeout = 5 MINUTES diff --git a/modular_splurt/code/datums/mood_events/preg_events.dm b/modular_splurt/code/datums/mood_events/preg_events.dm index b5ccd1444f..628d10b089 100644 --- a/modular_splurt/code/datums/mood_events/preg_events.dm +++ b/modular_splurt/code/datums/mood_events/preg_events.dm @@ -1,8 +1,8 @@ /datum/mood_event/pregnant_negative - description = span_boldwarning("THE BABY IS COMING OUT...") + description = span_boldwarning("THE BABY IS COMING OUT...\n") mood_change = -7 /datum/mood_event/pregnant_positive - description = span_nicegreen("The baby came out...phew") + description = span_nicegreen("The baby came out...phew\n") mood_change = 3 timeout = 2 MINUTES diff --git a/modular_splurt/code/datums/traits/good.dm b/modular_splurt/code/datums/traits/good.dm index b305c79997..70a84f4d82 100644 --- a/modular_splurt/code/datums/traits/good.dm +++ b/modular_splurt/code/datums/traits/good.dm @@ -1,3 +1,18 @@ +//Main code edits +/datum/quirk/photographer + desc = "You carry your camera and personal photo album everywhere you go, and you're quicker at taking pictures." + +/datum/quirk/photographer/on_spawn() + . = ..() + var/mob/living/carbon/human/H = quirk_holder + var/obj/item/storage/photo_album/photo_album = new(get_turf(H)) + H.put_in_hands(photo_album) + H.equip_to_slot(photo_album, ITEM_SLOT_BACKPACK) + photo_album.persistence_id = "personal_[H.mind.key]" // this is a persistent album, the ID is tied to the account's key to avoid tampering + photo_album.persistence_load() + photo_album.name = "[H.real_name]'s photo album" + +//Own stuff /datum/quirk/tough name = "Tough" desc = "Your body is abnormally enduring and can take 10% more damage." @@ -143,3 +158,10 @@ desc = "You are able to move about freely in pressurized low-gravity environments be it through the use of wings, magic, or some other physiological nonsense." value = 1 mob_trait = TRAIT_FLUTTER + +/datum/quirk/cloth_eater + name = "Clothes Eater" + desc = "You can eat most apparel to gain a boost in mood, and to gain some nutrients. (Insects already have this.)" + value = 1 + var/mood_category ="cloth_eaten" + mob_trait = TRAIT_CLOTH_EATER diff --git a/modular_splurt/code/datums/traits/negative.dm b/modular_splurt/code/datums/traits/negative.dm index 04a1c1825d..a000de17ab 100644 --- a/modular_splurt/code/datums/traits/negative.dm +++ b/modular_splurt/code/datums/traits/negative.dm @@ -66,13 +66,6 @@ speech_args[SPEECH_MESSAGE] = message //Own stuff -/datum/quirk/no_clone - name = "DNC" - desc = "You have filed a Do Not Clone order, stating that you do not wish to be cloned. You can still be revived by other means." - value = -2 - mob_trait = TRAIT_NO_CLONE - medical_record_text = "Patient has a DNC (Do Not Clone) order and will be rejected by cloning mechanisms as a result." - /datum/quirk/no_guns name = "Fat-Fingered" desc = "Due to the shape of your hands, width of your fingers or just not having fingers at all, you're unable to fire guns without accommodation." diff --git a/modular_splurt/code/datums/traits/neutral.dm b/modular_splurt/code/datums/traits/neutral.dm index ef6552c70c..5fdca5e6f5 100644 --- a/modular_splurt/code/datums/traits/neutral.dm +++ b/modular_splurt/code/datums/traits/neutral.dm @@ -61,14 +61,6 @@ . = ..() quirk_holder.RemoveElement(/datum/element/wuv/headpat) -/datum/quirk/in_heat - name = "In Heat" - desc = "Your system burns with the desire to be bred. Satisfying your lust will make you happy, but ignoring it may cause you to become sad and needy." - value = 0 - mob_trait = TRAIT_IN_HEAT - gain_text = span_notice("You body burns with the desire to be bred.") - lose_text = span_notice("You feel more in control of your body and thoughts.") - /datum/quirk/Hypnotic_gaze name = "Hypnotic Gaze" desc = "Be it through mysterious patterns, flickering colors, or some genetic oddity, prolonged eye contact with you will place the viewer into a highly-suggestible hypnotic trance." @@ -84,14 +76,6 @@ spell.Grant(Hypno_eyes) spell.owner = Hypno_eyes -/datum/quirk/heat - name = "Estrus Detection" - desc = "You have a animalistic sense of detecting if someone is in heat." - value = 0 - mob_trait = TRAIT_HEAT_DETECT - gain_text = span_notice("You feel your senses adjust, allowing a animalistic sense of others' fertility.") - lose_text = span_notice("You feel your sense of others' fertility fade.") - /datum/quirk/overweight name = "Overweight" desc = "You're particularly fond of food, and join the shift being overweight." @@ -365,105 +349,204 @@ var/mob/living/carbon/human/H = quirk_holder H.adjust_nutrition(-0.09)//increases their nutrition loss rate to encourage them to gain a partner they can essentially leech off of -/datum/quirk/vampire//splurt change start - name = "Bloodsucker Fledgeling" - desc = "You are a fledgeling of an ancient Bloodsucker bloodline; your skin is incurably pale and your mouth glimmers with vampiric fangs. Only blood will sate your hungers, and holy energies will cause your flesh to char." - value = 0 - medical_record_text = "this person was partially infected by a bloodsucker" - mob_trait = BLOODFLEDGE - gain_text = span_notice("You feel an otherworldly thirst.") - lose_text = span_notice("you feel an otherworldy burden remove itself") +/datum/quirk/bloodfledge + name = "Bloodsucker Fledgling" + desc = "You are a fledgling belonging to ancient Bloodsucker bloodline. While the blessing has yet to fully convert you, some things have changed. Only blood will sate your hungers, and holy energies will cause your flesh to char. This is NOT an antagonist role!" + value = 2 + medical_record_text = "Patient exhibits onset symptoms of a sanguine curse." + mob_trait = TRAIT_BLOODFLEDGE + gain_text = span_notice("You feel a sanguine thirst.") + lose_text = span_notice("You feel the sanguine thirst fade away.") processing_quirk = TRUE -/datum/quirk/vampire/add() +/datum/quirk/bloodfledge/add() . = ..() - var/mob/living/carbon/human/H = quirk_holder - ADD_TRAIT(H,TRAIT_NO_PROCESS_FOOD,ROUNDSTART_TRAIT) - ADD_TRAIT(H,TRAIT_COLDBLOODED,ROUNDSTART_TRAIT) - ADD_TRAIT(H,TRAIT_NOBREATH,ROUNDSTART_TRAIT) - ADD_TRAIT(H,TRAIT_NOTHIRST,ROUNDSTART_TRAIT) - ADD_TRAIT(H,TRAIT_QUICKER_CARRY,ROUNDSTART_TRAIT) - ADD_TRAIT(H,TRAIT_AUTO_CATCH_ITEM,ROUNDSTART_TRAIT)//these two make the vampire fast and enables some sexy "bet you didnt think i could do this" romance - if(!H.dna.skin_tone_override) - H.skin_tone = "albino" - var/datum/action/vbite/B = new - var/datum/action/vrevive/R = new - B.Grant(H) - R.Grant(H) - H.grant_language(/datum/language/vampiric, TRUE, TRUE, LANGUAGE_BLOODSUCKER) -/datum/quirk/vampire/on_process() + // Define quirk mob + var/mob/living/carbon/human/quirk_mob = quirk_holder + + // Add quirk traits + ADD_TRAIT(quirk_mob,TRAIT_NO_PROCESS_FOOD,ROUNDSTART_TRAIT) + ADD_TRAIT(quirk_mob,TRAIT_NOTHIRST,ROUNDSTART_TRAIT) + + // Set skin tone, if possible + if(!quirk_mob.dna.skin_tone_override) + quirk_mob.skin_tone = "albino" + + // Add quirk ability action datums + var/datum/action/bloodfledge/bite/act_bite = new + var/datum/action/bloodfledge/revive/act_revive = new + act_bite.Grant(quirk_mob) + act_revive.Grant(quirk_mob) + + // Add quirk language + quirk_mob.grant_language(/datum/language/vampiric, TRUE, TRUE, LANGUAGE_BLOODSUCKER) + +/datum/quirk/bloodfledge/on_process() . = ..() - var/mob/living/carbon/human/H = quirk_holder - var/area/A = get_area(H) - if(istype(A, /area/service/chapel) && H.mind?.assigned_role != "Chaplain") - H.adjustStaminaLoss(2) - H.adjust_nutrition(-0.3)//changed these to be less deadly and more of an inconvinience - H.adjust_disgust(1) - if(istype(H.loc, /obj/structure/closet/crate/coffin))//heals the vampire if in a coffin, except burn which fire can be considered holy - H.heal_overall_damage(4,4) - H.adjust_disgust(-7) - H.adjustOxyLoss(-4) - H.adjustCloneLoss(-4) - H.adjustBruteLoss(-0.3) - H.adjustFireLoss(-0.3) - if(!is_species(H, /datum/species/jelly)) //checks species - H.adjustToxLoss(-5)//heals toxin if not slime + + // Check if the current area is a coffin + if(istype(quirk_holder.loc, /obj/structure/closet/crate/coffin)) + // Define quirk mob + var/mob/living/carbon/human/quirk_mob = quirk_holder + + // Quirk mob must be injured + if(quirk_mob.health >= quirk_mob.maxHealth) + return + + // Prevent healing for robots + // This caused numerous technical issues + if(quirk_mob.mob_biotypes & MOB_ROBOTIC) + // Display a warning chat message (10% chance) + if(prob(20)) + to_chat(quirk_mob, span_warning("Your mechanical body rejects the curse's healing properties!")) + + // Return without healing, due robotic nature + return + + // Nutrition (blood) level must be above STARVING + if(quirk_mob.nutrition <= NUTRITION_LEVEL_STARVING) + // Display a warning chat message (10% chance) + if(prob(20)) + to_chat(quirk_mob, span_warning("You need more blood before you can regenerate!")) + + // Return without healing, due to lack of blood + return + + // Define initial health + var/health_start = quirk_mob.health + + // Heal brute and burn + // Accounts for robotic limbs + quirk_mob.heal_overall_damage(2,2) + /* + // Heal brute + quirk_mob.adjustBruteLoss(-2) + // Heal burn + quirk_mob.adjustFireLoss(-2) + */ + // Heal oxygen + quirk_mob.adjustOxyLoss(-2) + // Heal clone + quirk_mob.adjustCloneLoss(-2) + + // Check for slime race + // NOT a slime + if(!isslimeperson(quirk_mob)) + // Heal toxin + quirk_mob.adjustToxLoss(-2) + // IS a slime else - H.adjustToxLoss(5)//heals toxin if slime - return - if(H.nutrition == 0) - if(H.staminaloss < 99)//makes them tired but dosent stun them - H.adjustStaminaLoss(3, FALSE, TRUE) - else - H.adjustStaminaLoss(-1,FALSE, FALSE)//this also helps with if someone is stuck in the chapel for way too long, and i tested with a stun sword that stunning for sec is still possible - if(prob(2)) //2 percent chance (if it was true randome D:<) - to_chat(H, span_warning("I need blood NOW!!!")) + // Grant toxin (heals slimes) + quirk_mob.adjustToxLoss(2) -/datum/quirk/vampire/remove() + // Update health + quirk_mob.updatehealth() + + // Determine healed amount + var/health_restored = quirk_mob.health - health_start + + // Remove nutrition (blood) as compensation for healing + // Amount is equal to 50% of healing done + quirk_mob.adjust_nutrition(health_restored*-1) + +/datum/quirk/bloodfledge/remove() . = ..() - var/mob/living/carbon/human/H = quirk_holder - var/datum/action/vbite/B = locate() in H.actions - var/datum/action/vrevive/R = locate() in H.actions - REMOVE_TRAIT(H, TRAIT_NO_PROCESS_FOOD, ROUNDSTART_TRAIT) - REMOVE_TRAIT(H, TRAIT_COLDBLOODED, ROUNDSTART_TRAIT) - REMOVE_TRAIT(H, TRAIT_NOBREATH, ROUNDSTART_TRAIT) - REMOVE_TRAIT(H, TRAIT_NOTHIRST, ROUNDSTART_TRAIT) - REMOVE_TRAIT(H,TRAIT_QUICKER_CARRY,ROUNDSTART_TRAIT) - REMOVE_TRAIT(H,TRAIT_AUTO_CATCH_ITEM,ROUNDSTART_TRAIT) - B.Remove(H) - R.Remove(H) - H.remove_language(/datum/language/vampiric, TRUE, TRUE, LANGUAGE_BLOODSUCKER) + + // Define quirk mob + var/mob/living/carbon/human/quirk_mob = quirk_holder -/datum/quirk/vampire/on_spawn() - var/mob/living/carbon/human/H = quirk_holder - var/obj/item/card/id/vampire/vcard = new /obj/item/card/id/vampire - H.equip_to_slot(vcard, ITEM_SLOT_BACKPACK) - vcard.registered_name = H.real_name - vcard.update_label(addtext(vcard.registered_name, " the vampire")) - //var/obj/item/card/id/I = H.get_idcard(FALSE) maybe later, hop can just give the extra card proper access if needed, as for banking, that can be set on spawn by the player using the card in hand - //vcard.access = I.access - H.regenerate_icons() + // Remove quirk traits + REMOVE_TRAIT(quirk_mob, TRAIT_NO_PROCESS_FOOD, ROUNDSTART_TRAIT) + REMOVE_TRAIT(quirk_mob, TRAIT_NOTHIRST, ROUNDSTART_TRAIT) + + // Remove quirk ability action datums + var/datum/action/bloodfledge/bite/act_bite = locate() in quirk_mob.actions + var/datum/action/bloodfledge/revive/act_revive = locate() in quirk_mob.actions + act_bite.Remove(quirk_mob) + act_revive.Remove(quirk_mob) + + // Remove quirk language + quirk_mob.remove_language(/datum/language/vampiric, TRUE, TRUE, LANGUAGE_BLOODSUCKER) + +/datum/quirk/bloodfledge/on_spawn() . = ..() + // Define quirk mob + var/mob/living/carbon/human/quirk_mob = quirk_holder + + // Create vampire ID card + var/obj/item/card/id/vampire/id_vampire = new /obj/item/card/id/vampire(get_turf(quirk_holder)) + + // Update card information + id_vampire.registered_name = quirk_mob.real_name + id_vampire.update_label(addtext(id_vampire.registered_name, "'s Bloodfledge")) + + // Determine banking ID information + for(var/bank_account in SSeconomy.bank_accounts) + // Define current iteration's account + var/datum/bank_account/account = bank_account + + // Check for match + if(account.account_id == quirk_mob.account_id) + // Add to cards list + account.bank_cards += src + + // Assign account + id_vampire.registered_account = account + + // Stop searching + break + + // Try to add ID to backpack + var/id_in_bag = quirk_mob.equip_to_slot_if_possible(id_vampire, ITEM_SLOT_BACKPACK) || FALSE + + // Text for where the item was sent + var/id_location = (id_in_bag ? "in your backpack" : "at your feet" ) + + // Alert user in chat + // This should not post_add, because the ID is added by on_spawn + to_chat(quirk_holder, span_boldnotice("There is a bloodfledge's ID card [id_location], linked to your station account. It functions as a spare ID, but lacks job access.")) /datum/quirk/werewolf //adds the werewolf quirk name = "Werewolf" - desc = "A beastly affliction allows you to shapeshift into a more wolfish appearance at will. This will increase your size (In general and below!) and cause you to behave as though you were an anthropomorphic canine. (This is still being tested. Please send any bugs to nukechicken on discord)" + desc = "A beastly affliction allows you to shape-shift into a large anthropomorphic canine at will." value = 0 + mob_trait = TRAIT_WEREWOLF + gain_text = span_notice("You feel the full moon beckon.") + lose_text = span_notice("The moon's call hushes into silence.") + medical_record_text = "Patient has been reported howling at the night sky." + var/list/old_features /datum/quirk/werewolf/add() - . = ..() - var/mob/living/carbon/human/H = quirk_holder - var/datum/action/werewolf/W = new - W.Grant(H) + // Define old features + old_features = list("species" = SPECIES_HUMAN, "legs" = "Plantigrade", "size" = 1, "bark") + + // Define quirk mob + var/mob/living/carbon/human/quirk_mob = quirk_holder + + // Record features + old_features = quirk_mob.dna.features.Copy() + old_features["species"] = quirk_mob.dna.species.type + old_features["custom_species"] = quirk_mob.custom_species + old_features["size"] = get_size(quirk_mob) + old_features["bark"] = quirk_mob.vocal_bark_id + old_features["taur"] = quirk_mob.dna.features["taur"] + old_features["eye_type"] = quirk_mob.dna.species.eye_type + +/datum/quirk/werewolf/post_add() + // Define quirk action + var/datum/action/cooldown/werewolf/transform/quirk_action = new + + // Grant quirk action + quirk_action.Grant(quirk_holder) /datum/quirk/werewolf/remove() - var/mob/living/carbon/human/H = quirk_holder - var/datum/action/werewolf/W = locate() in H.actions - W.Remove(H) - . = ..() + // Define quirk action + var/datum/action/cooldown/werewolf/transform/quirk_action = locate() in quirk_holder.actions + // Revoke quirk action + quirk_action.Remove(quirk_holder) /datum/quirk/gargoyle //Mmmm yes stone time name = "Gargoyle" diff --git a/modular_splurt/code/datums/traits/trait_actions.dm b/modular_splurt/code/datums/traits/trait_actions.dm index 792f7b8e8f..da19988868 100644 --- a/modular_splurt/code/datums/traits/trait_actions.dm +++ b/modular_splurt/code/datums/traits/trait_actions.dm @@ -1,4 +1,5 @@ -#define BLOOD_DRAIN_NUM 50 +#define BLOODFLEDGE_DRAIN_NUM 50 +#define BLOODFLEDGE_COOLDOWN_BITE 60 // // Quirk: Hypnotic Gaze @@ -10,71 +11,205 @@ button_icon_state = "Hypno_eye" icon_icon = 'modular_splurt/icons/mob/actions/lewd_actions/lewd_icons.dmi' background_icon_state = "bg_alien" - var/mob/living/carbon/T //hypnosis target - var/mob/living/carbon/human/H //Person with the quirk /datum/action/innate/Hypnotize/Activate() - var/mob/living/carbon/human/H = owner + // Define action owner + var/mob/living/carbon/human/action_owner = owner - if(!H.pulling || !isliving(H.pulling) || H.grab_state < GRAB_AGGRESSIVE) - to_chat(H, span_warning("You need to aggressively grab someone to hypnotize them!")) + // Define target + var/grab_target = action_owner.pulling + + // Check for target + if(!grab_target) + // Warn the user, then return + to_chat(action_owner, span_warning("You you need to grab someone first!")) return - var/mob/living/carbon/T = H.pulling - - if(T.IsSleeping()) - to_chat(H, "You can't hypnotize [T] whilst they're asleep!") + // Check for cyborg + if(iscyborg(grab_target)) + // Warn the user, then return + to_chat(action_owner, span_warning("You can't hypnotize a cyborg!")) return - to_chat(H, span_notice("You stare deeply into [T]'s eyes...")) - to_chat(T, span_warning("[H] stares intensely into your eyes...")) - if(!do_mob(H, T, 12 SECONDS)) + // Check for alien + // Taken from eyedropper check + /* + if(isalien(grab_target)) + // Warn the user, then return + to_chat(action_owner, span_warning("[grab_target] doesn\'t seem to have any eyes!")) + return + */ + + // Check for carbon human target + if(!ishuman(grab_target)) + // Warn the user, then return + to_chat(action_owner, span_warning("That's not a valid creature!")) return - if(H.pulling !=T || H.grab_state < GRAB_AGGRESSIVE) + // Check if target is alive + if(!isliving(grab_target)) + // Warn the user, then return + to_chat(action_owner, span_warning("You can't hypnotize the dead!")) return - if(!(H in view(1, H.loc))) + // Check for aggressive grab + if(action_owner.grab_state < GRAB_AGGRESSIVE) + // Warn the user, then return + to_chat(action_owner, span_warning("You need a stronger grip before trying this!")) return - if(!(T.client?.prefs.cit_toggles & HYPNO)) + // Define target + var/mob/living/carbon/human/action_target = grab_target + + // Check if target has a mind + if(!action_target.mind) + // Warn the user, then return + to_chat(action_owner, span_warning("[grab_target] doesn\'t have a compatible mind!")) return - var/response = alert(T, "Do you wish to fall into a hypnotic sleep?(This will allow [H] to issue hypnotic suggestions)", "Hypnosis", "Yes", "No") - - if(response == "Yes") - T.visible_message(span_warning("[T] falls into a deep slumber!"), "Your eyelids gently shut as you fall into a deep slumber. All you can hear is [H]'s voice as you commit to following all of their suggestions.") - - T.SetSleeping(1200) - T.drowsyness = max(T.drowsyness, 40) - T = H.pulling - var/response2 = alert(H, "Would you like to release your subject or give them a suggestion?", "Hypnosis", "Suggestion", "Release") - - if(response2 == "Suggestion") - if(get_dist(H, T) > 1) - to_chat(H, "You must stand in whisper range of [T].") - return - - var/text = input("What would you like to suggest?", "Hypnotic suggestion", null, null) - text = sanitize(text) - if(!text) - return - - to_chat(H, "You whisper your suggestion in a smooth calming voice to [T]") - to_chat(T, span_hypnophrase("...[text]...")) - - T.visible_message(span_warning("[T] wakes up from their deep slumber!"), "Your eyelids gently open as you see [H]'s face staring back at you.") - T.SetSleeping(0) - T = null - return - - if(response2 == "Release") - T.SetSleeping(0) - return - else - T.visible_message(span_warning("[T]'s attention breaks, despite the attempt to hypnotize them! They clearly don't want this!"), "Your concentration breaks as you realise you have no interest in following [H]'s words!") + /* Unused: Replaced by get_eye_protection + // Check if target's eyes are obscured + // ... by headwear + if((action_target.head && action_target.head.flags_cover & HEADCOVERSEYES)) + // Warn the user, then return + to_chat(action_owner, span_warning("[action_target]'s eyes are obscured by [action_target.head].")) return + // ... by a mask + else if((action_target.wear_mask && action_target.wear_mask.flags_cover & MASKCOVERSEYES)) + // Warn the user, then return + to_chat(action_owner, span_warning("[action_target]'s eyes are obscured by [action_target.wear_mask].")) + return + + // ... by glasses + else if((action_target.glasses && action_target.glasses.flags_cover & GLASSESCOVERSEYES)) + // Warn the user, then return + to_chat(action_owner, span_warning("[action_target]'s eyes are obscured by [action_target.glasses].")) + return + */ + + // Check if target has eye protection + if(action_target.get_eye_protection()) + // Warn the user, then return + to_chat(action_owner, span_warning("You have difficulty focusing on [action_target]'s eyes due to some form of protection, and are left unable to hypnotize them.")) + to_chat(action_target, span_notice("[action_owner] stares intensely at you, but stops after a moment.")) + return + + // Check if target is blind + if(HAS_TRAIT(action_target, TRAIT_BLIND)) + // Warn the user, then return + to_chat(action_owner, span_warning("You stare deeply into [action_target]'s eyes, but see nothing but emptiness.")) + return + + // Check for anti-magic + // This does not include TRAIT_HOLY + if(action_target.anti_magic_check()) + // Warn the users, then return + to_chat(action_owner, span_warning("You stare deeply into [action_target]'s eyes. They stare back at you as if nothing had happened.")) + to_chat(action_target, span_notice("[action_owner] stares intensely into your eyes for a moment. You sense nothing out of the ordinary from them.")) + return + + // Check client pref for hypno + if(action_target.client?.prefs.cit_toggles & NEVER_HYPNO) + // Warn the users, then return + to_chat(action_owner, span_warning("You sense that [action_target] would rather not be hypnotized, and decide to respect their wishes.")) + to_chat(action_target, span_notice("[action_owner] stares into your eyes with a strange conviction, but turns away after a moment.")) + return + + // Check for mindshield implant + if(HAS_TRAIT(action_target, TRAIT_MINDSHIELD)) + // Warn the users, then return + to_chat(action_owner, span_warning("You stare deeply into [action_target]'s eyes, but hear a faint buzzing from [action_target.p_their()] head. It seems something is interfering.")) + to_chat(action_target, span_notice("[action_owner] stares intensely into your eyes for a moment, before a buzzing sound emits from your head.")) + return + + // Check for sleep immunity + // This is required for SetSleeping to trigger + if(HAS_TRAIT(action_target, TRAIT_SLEEPIMMUNE)) + // Warn the users, then return + to_chat(action_owner, span_warning("You stare deeply into [action_target]'s eyes, and see nothing but unrelenting energy. You won't be able to subdue [action_target.p_them()] in this state!")) + to_chat(action_target, span_notice("[action_owner] stares intensely into your eyes, but sees something unusual about you...")) + return + + // Check for sleep + if(action_target.IsSleeping()) + // Warn the user, then return + to_chat(action_owner, span_warning("You can't hypnotize [action_target] whilst [action_target.p_theyre()] asleep!")) + return + + // Check for combat mode + if(SEND_SIGNAL(action_target, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE)) + // Warn the users, then return + to_chat(action_owner, span_warning("[action_target] is acting too defensively! You'll need [action_target.p_them()] to lower [action_target.p_their()] guard first!")) + to_chat(action_target, span_notice("[action_owner] tries to stare into your eyes, but can't get a read on you.")) + return + + // Display chat messages + to_chat(action_owner, span_notice("You stare deeply into [action_target]'s eyes...")) + to_chat(action_target, span_warning("[action_owner] stares intensely into your eyes...")) + + // Try to perform action timer + if(!do_mob(action_owner, action_target, 5 SECONDS)) + // Action timer was interrupted + // Warn the user, then return + to_chat(action_owner, span_warning("You lose concentration on [action_target], and fail to hypnotize [action_target.p_them()]!")) + to_chat(action_target, span_notice("[action_owner]'s gaze is broken prematurely, freeing you from any potential effects.")) + return + + // Define blank response + var/input_consent + + // Check for non-consensual setting + if(action_target.client?.prefs.nonconpref != "Yes") + // Non-consensual is NOT enabled + // Prompt target for consent response + input_consent = alert(action_target, "Will you fall into a hypnotic stupor? This will allow [action_owner] to issue hypnotic suggestions.", "Hypnosis", "Yes", "No") + + // When consent is denied + if(input_consent == "No") + // Warn the users, then return + to_chat(action_owner, span_warning("[action_target]'s attention breaks, despite the attempt to hypnotize [action_target.p_them()]! [action_target.p_they()] clearly don't want this!")) + to_chat(action_target, span_notice("Your concentration breaks as you realize you have no interest in following [action_owner]'s words!")) + return + + // Display local message + action_target.visible_message(span_warning("[action_target] falls into a deep slumber!"), span_danger("Your eyelids gently shut as you fall into a deep slumber. All you can hear is [action_owner]'s voice as you commit to following all of their suggestions.")) + + // Set sleeping + action_target.SetSleeping(1200) + + // Set drowsiness + action_target.drowsyness = max(action_target.drowsyness, 40) + + // Prompt action owner for response + var/input_suggestion = input("What would you like to suggest [action_target] do? Leave blank to release [action_target.p_them()] instead.", "Hypnotic suggestion", null, null) + + // Check if input text exists + if(!input_suggestion) + // Alert user of no input + to_chat(action_owner, "You decide not to give [action_target] a suggestion.") + + // Remove sleep, then return + action_target.SetSleeping(0) + return + + // Sanitize input text + input_suggestion = sanitize(input_suggestion) + + // Display message to users + to_chat(action_owner, "You whisper your suggestion in a smooth calming voice to [action_target]") + to_chat(action_target, span_hypnophrase("...[input_suggestion]...")) + + // Play a sound effect + playsound(action_target, 'sound/magic/domain.ogg', 20, 1) + + // Display local message + action_target.visible_message(span_warning("[action_target] wakes up from their deep slumber!"), span_danger("Your eyelids gently open as you see [action_owner]'s face staring back at you.")) + + // Remove sleep, then return + action_target.SetSleeping(0) + return + // // Quirk: Hydra Heads // @@ -109,165 +244,650 @@ // Quirk: Bloodsucker Fledgling / Vampire // -/datum/action/vbite - name = "Bite" - button_icon_state = "power_feed" +// Basic action preset +/datum/action/bloodfledge + name = "Broken Bloodfledge Ability" + desc = "You shouldn't be seeing this!" + button_icon_state = "power_torpor" + background_icon_state = "vamp_power_off" + buttontooltipstyle = "cult" icon_icon = 'icons/mob/actions/bloodsucker.dmi' - desc = "Sink your vampiric fangs into the person you are grabbing." + button_icon = 'icons/mob/actions/bloodsucker.dmi' + +// Action: Bite +/datum/action/bloodfledge/bite + name = "Fledgling Bite" + desc = "Sink your vampiric fangs into the person you are grabbing, and attempt to drink their blood." + button_icon_state = "power_feed" var/drain_cooldown = 0 -/datum/action/vbite/Trigger() +/datum/action/bloodfledge/bite/Trigger() . = ..() - if(iscarbon(owner)) - var/mob/living/carbon/H = owner - if(H.nutrition >= 500) - to_chat(H, span_notice("You are too full to drain any more.")) - return - if(drain_cooldown >= world.time) - to_chat(H, span_notice("You just drained blood, wait a few seconds.")) - return - if(!H.pulling || !iscarbon(H.pulling)) - if(H.getStaminaLoss() >= 80 && H.nutrition > 20)//prevents being stunlocked in the chapel - to_chat(H,(span_notice("you use some of your power to energize"))) - H.adjustStaminaLoss(-20) - H.adjust_nutrition(-20) - H.resting = TRUE - if(H.pulling && (iscarbon(H.pulling) || (istype(H.pulling,/obj/structure/arachnid/cocoon) && locate(/mob/living/carbon) in H.pulling.contents))) - var/mob/living/carbon/victim - if(iscarbon(H.pulling)) - victim = H.pulling - else if(istype(H.pulling,/obj/structure/arachnid/cocoon)) - victim = locate(/mob/living/carbon) in H.pulling.contents - drain_cooldown = world.time + 25 - if(victim.anti_magic_check(FALSE, TRUE, FALSE, 0)) - to_chat(victim, span_warning("[H] tries to bite you, but stops before touching you!")) - to_chat(H, span_warning("[victim] is blessed! You stop just in time to avoid catching fire.")) - return - //Here we check now for both the garlic cloves on the neck and for blood in the victims bloodstream. - if(!blood_sucking_checks(victim, TRUE, TRUE)) - return - H.visible_message(span_danger("[H] bites down on [victim]'s neck!")) - victim.add_splatter_floor(get_turf(victim), TRUE) - to_chat(victim, span_userdanger("[H] is draining your blood!")) - if(!do_after(H, 30, target = victim)) - return - var/blood_volume_difference = BLOOD_VOLUME_MAXIMUM - H.blood_volume //How much capacity we have left to absorb blood - var/drained_blood = min(victim.blood_volume, BLOOD_DRAIN_NUM, blood_volume_difference) - H.reagents.add_reagent(/datum/reagent/blood/, drained_blood) - to_chat(victim, span_danger("[H] has taken some of your blood!")) - to_chat(H, span_notice("You drain some blood!")) - playsound(H, 'sound/items/drink.ogg', 30, 1, -2) - victim.blood_volume = clamp(victim.blood_volume - drained_blood, 0, BLOOD_VOLUME_MAXIMUM) - log_combat(H,victim,"vampire bit")//logs the biting action for admins - if(!victim.blood_volume) - to_chat(H, span_warning("You finish off [victim]'s blood supply!")) + // Check for carbon owner + if(!iscarbon(owner)) + return -/datum/action/vrevive - name = "Resurrect" - button_icon_state = "power_strength" - icon_icon = 'icons/mob/actions/bloodsucker.dmi' - desc = "Use all your energy to come back to life!" + // Define action owner + var/mob/living/carbon/action_owner = owner -/datum/action/vrevive/Trigger() - . = ..() - var/mob/living/carbon/C = owner - var/mob/living/carbon/human/H = owner - if(H.stat == DEAD && istype(C.loc, /obj/structure/closet/crate/coffin)) - H.revive(TRUE, FALSE) - H.set_nutrition(0) - H.Daze(20) - H.drunkenness = 70 + // Check for cooldown + if(drain_cooldown >= world.time) + // Warn the user, then return + to_chat(action_owner, span_notice("That ability isn't ready yet.")) + return + + // Check for any grabbed target + if(!action_owner.pulling) + // Warn the user, then return + to_chat(action_owner, span_warning("You need a victim first!")) + return + + // Limit maximum nutrition + if(action_owner.nutrition >= NUTRITION_LEVEL_FAT) + // Warn the user, then return + to_chat(action_owner, span_notice("You are too full to drain any more.")) + return + + // Limit maximum potential nutrition + if(action_owner.nutrition + BLOODFLEDGE_DRAIN_NUM >= NUTRITION_LEVEL_FAT) + // Warn the user, then return + to_chat(action_owner, span_notice("You would become too full by draining any more blood.")) + return + + // Check for muzzle + if(action_owner.is_muzzled()) + // Warn the user, then return + to_chat(action_owner, span_notice("You can't bite things while muzzled!")) + return + + // Define pulled target + var/pull_target = action_owner.pulling + + // Define bite target + var/mob/living/carbon/bite_target + + // Check if the target is carbon + if(iscarbon(pull_target)) + // Set the bite target + bite_target = pull_target + + // Or cocooned carbon + else if(istype(pull_target,/obj/structure/arachnid/cocoon)) + // Define if cocoon has a valid target + // This cannot use pull_target + var/possible_cocoon_target = locate(/mob/living/carbon) in action_owner.pulling.contents + + // Check defined cocoon target + if(possible_cocoon_target) + // Set the bite target + bite_target = possible_cocoon_target + + // Or a blood tomato + else if(istype(pull_target,/obj/item/reagent_containers/food/snacks/grown/tomato/blood)) + // Warn the user, then return + to_chat(action_owner, span_danger("You plunge your fangs into [pull_target]! It's not very nutritious.")) + return + + // This doesn't actually interact with the item + + // Or none of the above else - to_chat(H,span_warning("You need to be dead and in a coffin to revive!")) + // Warn the user, then return + to_chat(action_owner, span_warning("You can't drain blood from [pull_target]!")) + return + + // Check for anti-magic + if(bite_target.anti_magic_check(FALSE, TRUE, FALSE, 0)) + // Warn the user and target, then return + to_chat(bite_target, span_warning("[action_owner] tries to bite you, but stops before touching you!")) + to_chat(action_owner, span_warning("[bite_target] is blessed! You stop just in time to avoid catching fire.")) + return + + // Check for garlic necklace or garlic in the bloodstream + if(!blood_sucking_checks(bite_target, TRUE, TRUE)) + // Warn the user and target, then return + to_chat(bite_target, span_warning("[action_owner] tries to bite you, but is warded off by your Allium Sativum!")) + to_chat(action_owner, span_warning("You sense that [bite_target] is protected by Allium Sativum, and refrain from biting them.")) + return + + // Define bite target's blood volume + var/target_blood_volume = bite_target.blood_volume + + // Check for sufficient blood volume + if(!target_blood_volume) + // Warn the user, then return + to_chat(action_owner, span_warning("There's not enough blood in [bite_target]!")) + return + + // Check if total blood would become too low + if((target_blood_volume - BLOODFLEDGE_DRAIN_NUM) <= BLOOD_VOLUME_OKAY) + // Check for aggressive grab + if(action_owner.grab_state < GRAB_AGGRESSIVE) + // Warn the user, then return + to_chat(action_owner, span_warning("You sense that [bite_target] is running low on blood. You'll need a tighter grip on [bite_target.p_them()] to continue.")) + return + + // Check for pacifist + if(HAS_TRAIT(action_owner, TRAIT_PACIFISM)) + // Warn the user, then return + to_chat(action_owner, span_warning("You can't drain any more blood from [bite_target] without hurting [bite_target.p_them()]!")) + return + + // Set cooldown and action times + var/time_cooldown = BLOODFLEDGE_COOLDOWN_BITE + var/time_interact = 30 + + // Check for voracious + if(HAS_TRAIT(action_owner, TRAIT_VORACIOUS)) + // Make times twice as fast + time_cooldown *= 0.5 + time_interact*= 0.5 + + // Set cooldown + drain_cooldown = world.time + time_cooldown + + // Display local chat message + action_owner.visible_message(span_danger("[action_owner] begins to bite down on [bite_target]'s neck!")) + + // Warn bite target + to_chat(bite_target, span_userdanger("[action_owner] has bitten your neck, and is trying to drain your blood!")) + + // Play a bite sound effect + playsound(action_owner, 'sound/weapons/bite.ogg', 30, 1, -2) + + // Try to perform action timer + if(!do_after(action_owner, time_interact, target = bite_target)) + // When failing + // Display a local chat message + action_owner.visible_message(span_danger("[action_owner]'s fangs are prematurely torn from [bite_target]'s neck, spilling [bite_target.p_their()] blood!")) + + // Bite target "drops" the blood + // This creates large blood splatter + bite_target.bleed(BLOODFLEDGE_DRAIN_NUM, FALSE) + + // Play splatter sound + playsound(get_turf(target), 'sound/effects/splat.ogg', 40, 1) + + // Check for masochism + if(!HAS_TRAIT(bite_target, TRAIT_MASO)) + // Force bite_target to play the scream emote + bite_target.emote("scream") + + // Log the biting action failure + log_combat(action_owner,bite_target,"bloodfledge bitten (interrupted)") + + // Return + return + + // Check if bite target species has blood + if(NOBLOOD in bite_target.dna.species.species_traits) + // Warn the user and target, then return + to_chat(bite_target, span_warning("[action_owner] tried to drain you, but didn't find any blood!")) + to_chat(action_owner, span_warning("[bite_target] doesn't have any blood to drink!")) + return + + // Create blood splatter + bite_target.add_splatter_floor(get_turf(bite_target), TRUE) + + // Checks for exotic species blood below + + // Variable for species with non-blood blood volumes + var/blood_valid = TRUE + + // Variable for gaining blood volume + var/blood_transfer = FALSE + + // Name of blood volume to be taken + // Action owner assumes blood until after drinking + var/blood_name = "blood" + + // Check bite target for synth blood + if(bite_target.mob_biotypes & MOB_ROBOTIC) + // Mark blood as invalid + blood_valid = FALSE + + // Set blood type name + blood_name = "coolant" + + // Check if the action owner is also a synth + if (action_owner.mob_biotypes & MOB_ROBOTIC) + // Allow gaining blood from this + blood_transfer = TRUE + + // Action owner is not a synth + else + // Warn the user + to_chat(action_owner, span_warning("That didn't taste like blood at all...")) + + // Add disgust + action_owner.adjust_disgust(2) + + // Cause negative mood + SEND_SIGNAL(action_owner, COMSIG_ADD_MOOD_EVENT, "bloodfledge_drank_synth", /datum/mood_event/drankblood_synth) + + // Check if bite target is a slime + if (isslimeperson(bite_target)) + // Mark blood as invalid + blood_valid = FALSE + + // Set blood type name + blood_name = "slime" + + // Check if the action owner is also a slime + if(isslimeperson(action_owner)) + // Allow gaining blood from this + blood_transfer = TRUE + + // Action owner is not a slime + else + // Warn the user + to_chat(action_owner, span_warning("You feel a sloshing presence inside you, but it dies out after a few moments.")) + + // Add disgust + action_owner.adjust_disgust(2) + + // Cause negative mood + SEND_SIGNAL(action_owner, COMSIG_ADD_MOOD_EVENT, "bloodfledge_drank_slime", /datum/mood_event/drankblood_slime) + + // End of species blood checks + + // Define user's remaining capacity to absorb blood + var/blood_volume_difference = BLOOD_VOLUME_MAXIMUM - action_owner.blood_volume + var/drained_blood = min(target_blood_volume, BLOODFLEDGE_DRAIN_NUM, blood_volume_difference) + + // Remove blood from bite target + bite_target.blood_volume = clamp(target_blood_volume - drained_blood, 0, BLOOD_VOLUME_MAXIMUM) + + // Perform a blood transfer + // This is done to transfer compatible diseases + // Grants nothing, unless blood transfer variable is set + bite_target.transfer_blood_to(action_owner, (blood_transfer ? drained_blood : 0), TRUE) + + // Check if action owner received valid (nourishing) blood + if(blood_valid) + // Add blood reagent to the user + action_owner.reagents.add_reagent(/datum/reagent/blood/, drained_blood) + + // Alert the bite target and local user of success + // Yes, this is AFTER the message for non-valid blood + to_chat(bite_target, span_danger("[action_owner] has taken some of your [blood_name]!")) + to_chat(action_owner, span_notice("You've drained some of [bite_target]'s [blood_name]!")) + + // Alert the action holder if blood volume limit was exceeded + if(blood_transfer && (action_owner.blood_volume >= BLOOD_VOLUME_MAXIMUM)) + to_chat(action_owner, span_warning("You body fails to absorb any more [blood_name]. The remainder has been lost.")) + + // Play a heartbeat sound effect + // This was changed to match bloodsucker + playsound(action_owner, 'sound/effects/singlebeat.ogg', 30, 1, -2) + + // Log the biting action success + log_combat(action_owner,bite_target,"bloodfledge bitten (successfully), transferring [blood_name]") + + // Mood events + // Check if bite target is dead or undead + if((bite_target.stat >= DEAD) || (bite_target.mob_biotypes & MOB_UNDEAD)) + // Warn the user + to_chat(action_owner, span_warning("The rotten [blood_name] tasted foul.")) + + // Add disgust + action_owner.adjust_disgust(2) + + // Cause negative mood + SEND_SIGNAL(action_owner, COMSIG_ADD_MOOD_EVENT, "bloodfledge_drank_dead", /datum/mood_event/drankblood_dead) + + // Check if bite target's blood has been depleted + if(!bite_target.blood_volume) + // Warn the user + to_chat(action_owner, span_warning("You've depleted [bite_target]'s [blood_name] supply!")) + + // Cause negative mood + SEND_SIGNAL(action_owner, COMSIG_ADD_MOOD_EVENT, "bloodfledge_drank_killed", /datum/mood_event/drankkilled) + + // Check if bite target has cursed blood + if(HAS_TRAIT(bite_target, TRAIT_CURSED_BLOOD)) + // Check action owner for cursed blood + var/owner_cursed = HAS_TRAIT(action_owner, TRAIT_CURSED_BLOOD) + + // Set chat message based on action owner's trait status + var/warn_message = (owner_cursed ? "You taste the unholy touch of a familiar curse in [bite_target]\'s blood." : "You experience a sensation of intense dread just after drinking from [bite_target]. Something about their blood feels... wrong.") + + // Alert user in chat + to_chat(action_owner, span_notice(warn_message)) + + // Set mood type based on curse status + var/mood_type = (owner_cursed ? /datum/mood_event/drank_cursed_good : /datum/mood_event/drank_cursed_bad) + + // Cause mood event + SEND_SIGNAL(action_owner, COMSIG_ADD_MOOD_EVENT, "bloodfledge_drank_cursed_blood", mood_type) + +// Action: Revive +/datum/action/bloodfledge/revive + name = "Fledgling Revive" + desc = "Expend all of your remaining energy to escape death." + button_icon_state = "power_strength" + +/datum/action/bloodfledge/revive/Trigger() + . = ..() + + // Define mob + var/mob/living/carbon/human/action_owner = owner + + // Early check for being dead + // Users are most likely to click this while alive + if(action_owner.stat != DEAD) + // Warn user in chat + to_chat(action_owner, "You can't use this ability while alive!") + + // Return + return + + // Define failure message + var/revive_failed + + // Condition: Mob isn't in a closed coffin + if(!istype(action_owner.loc, /obj/structure/closet/crate/coffin)) + revive_failed += "\n- You need to be in a closed coffin!" + + // Condition: Insufficient nutrition (blood) + if(action_owner.nutrition <= NUTRITION_LEVEL_STARVING) + revive_failed += "\n- You don't have enough blood left!" + + // Condition: Can be revived + // This is used by revive(), and must be checked here to prevent false feedback + if(!action_owner.can_be_revived()) + revive_failed += "\n- Your body is too weak to sustain life!" + + // Condition: Damage limit, brute + if(action_owner.getBruteLoss() >= MAX_REVIVE_BRUTE_DAMAGE) + revive_failed += "\n- Your body is too battered!" + + // Condition: Damage limit, burn + if(action_owner.getFireLoss() >= MAX_REVIVE_FIRE_DAMAGE) + revive_failed += "\n- Your body is too badly burned!" + + // Condition: Suicide + if(action_owner.suiciding) + revive_failed += "\n- You chose this path." + + // Condition: No revivals + if(HAS_TRAIT(action_owner, TRAIT_NOCLONE)) + revive_failed += "\n- You only had one chance." + + // Condition: Demonic contract + if(action_owner.hellbound) + revive_failed += "\n- The soul pact must be honored." + + // Check for failure + if(revive_failed) + // Set combined message + revive_failed = span_warning("You can't revive right now because: [revive_failed]") + + // Alert user in chat of failure + to_chat(action_owner, revive_failed) + + // Return + return + + // Define time dead + // Used for revive policy + var/time_dead = world.time - action_owner.timeofdeath + + // Revive the action owner + action_owner.revive() + + // Alert the user in chat of success + action_owner.visible_message(span_notice("An ominous energy radiates from the [action_owner.loc]..."), span_warning("You've expended all remaining blood to bring your body back to life!")) + + // Play a haunted sound effect + playsound(action_owner, 'sound/hallucinations/growl1.ogg', 30, 1, -2) + + // Remove all nutrition (blood) + action_owner.set_nutrition(0) + + // Apply daze effect + action_owner.Daze(20) + + // Define time limit for revival + // Determines memory loss, using defib time and policies + var/revive_time_limit = CONFIG_GET(number/defib_cmd_time_limit) * 10 + + // Define revive time threshold + // Late causes memory loss, according to policy + var/time_late = revive_time_limit && (time_dead > revive_time_limit) + + // Define policy to use + var/list/policies = CONFIG_GET(keyed_list/policy) + var/time_policy = time_late? policies[POLICYCONFIG_ON_DEFIB_LATE] : policies[POLICYCONFIG_ON_DEFIB_INTACT] + + // Check if policy exists + if(time_policy) + // Alert user in chat of policy + to_chat(action_owner, time_policy) + + // Log the revival and effective policy + action_owner.log_message("revived using a vampire quirk ability after being dead for [time_dead] deciseconds. Considered [time_late? "late" : "memory-intact"] revival under configured policy limits.", LOG_GAME) // // Quirk: Werewolf // -/datum/action/werewolf - name = "Transform" - desc = "Transform into your wolf form." +/datum/action/cooldown/werewolf + name = "Werewolf Ability" + desc = "Do something related to werewolves." icon_icon = 'modular_splurt/icons/mob/actions/misc_actions.dmi' button_icon_state = "Transform" - var/transformed = FALSE - var/list/old_features = list("species" = SPECIES_HUMAN, "legs" = "Plantigrade", "size" = 1, "bark") + check_flags = AB_CHECK_RESTRAINED | AB_CHECK_STUN | AB_CHECK_CONSCIOUS | AB_CHECK_ALIVE + cooldown_time = 5 SECONDS + transparent_when_unavailable = TRUE -/datum/action/werewolf/Trigger() +/datum/action/cooldown/werewolf/transform + name = "Toggle Werewolf Form" + desc = "Transform in or out of your wolf form." + var/transformed = FALSE + var/species_changed = FALSE + var/werewolf_gender = "Lycan" + var/list/old_features + +/datum/action/cooldown/werewolf/transform/Grant() . = ..() - var/mob/living/carbon/human/H = owner - var/obj/item/organ/genital/penis/P = H.getorganslot(ORGAN_SLOT_PENIS) - var/obj/item/organ/genital/breasts/B = H.getorganslot(ORGAN_SLOT_BREASTS) - var/obj/item/organ/genital/vagina/V = H.getorganslot(ORGAN_SLOT_VAGINA) - H.shake_animation(2) - if(!transformed) // transform them - H.visible_message(span_danger("[H] shivers, their flesh bursting with a sudden growth of thick fur and their features contorting to that of a beast's, fully transforming them into a werewolf!")) - H.set_species(/datum/species/mammal, 1) - H.dna.species.mutant_bodyparts["mam_tail"] = "Wolf" - H.dna.species.mutant_bodyparts["legs"] = "Digitigrade" - H.Digitigrade_Leg_Swap(FALSE) - H.dna.species.mutant_bodyparts["mam_snouts"] = "Mammal, Thick" - H.dna.features["mam_ears"] = "Wolf" - H.dna.features["mam_tail"] = "Wolf" - H.dna.features["mam_snouts"] = "Mammal, Thick" - H.dna.features["legs"] = "Digitigrade" - H.update_size(get_size(H) + 0.5) - H.set_bark("bark") - H.custom_species = "Werewolf" - if(!(H.dna.species.species_traits.Find(DIGITIGRADE))) - H.dna.species.species_traits += DIGITIGRADE - H.update_body() - H.update_body_parts() - if(B) - B.color = "#[H.dna.features["mcolor"]]" - B.update() - if(P) - P.shape = "Knotted" - P.color = "#ff7c80" - P.update() - P.modify_size(6) - if(V) - V.shape = "Furred" - V.color = "#[H.dna.features["mcolor"]]" - V.update() - else // untransform them - H.visible_message(span_danger("[H] shrinks, their wolfish features quickly receding.")) - H.set_species(old_features["species"], TRUE) - H.set_bark(old_features["bark"]) - H.dna.features["mam_ears"] = old_features["mam_ears"] - H.dna.features["mam_snouts"] = old_features["mam_snouts"] - H.dna.features["mam_tail"] = old_features["mam_tail"] - H.dna.features["legs"] = old_features["legs"] //i hate legs i hate legs i hate legs i hate legs i hate legs i hate legs i hate legs + + // Define carbon owner + var/mob/living/carbon/action_owner_carbon = owner + + // Define parent quirk + var/datum/quirk/werewolf/quirk_data = locate() in action_owner_carbon.roundstart_quirks + + // Check if data was copied + if(!quirk_data) + // Log error and return + log_game("Failed to get species data for werewolf action!") + return + + // Define stored features + old_features = quirk_data.old_features.Copy() + + // Define action owner + var/mob/living/carbon/human/action_owner = owner + + // Set species gendered name + switch(action_owner.gender) + if(MALE) + werewolf_gender = "Wer" + if(FEMALE) + werewolf_gender = "Wīf" + if(PLURAL) + werewolf_gender = "Hie" + if(NEUTER) + werewolf_gender = "Þing" + +/datum/action/cooldown/werewolf/transform/Trigger() + . = ..() + + // Check if unavailable + // Checks the parent function's return value + if(!.) + // Messages will not display here + return FALSE + + // Define action owner + var/mob/living/carbon/human/action_owner = owner + + // Check for restraints + if(!CHECK_MOBILITY(action_owner, MOBILITY_USE)) + // Warn user, then return + action_owner.visible_message(span_warning("You cannot transform while restrained!")) + return + + // Define citadel organs + var/obj/item/organ/genital/penis/organ_penis = action_owner.getorganslot(ORGAN_SLOT_PENIS) + var/obj/item/organ/genital/breasts/organ_breasts = action_owner.getorganslot(ORGAN_SLOT_BREASTS) + var/obj/item/organ/genital/vagina/organ_vagina = action_owner.getorganslot(ORGAN_SLOT_VAGINA) + + // Play shake animation + action_owner.shake_animation(2) + + // Transform into wolf form + if(!transformed) + // Define current species type + var/datum/species/owner_species = action_owner.dna.species.type + + // Check if species has changed + if(old_features["species"] != owner_species) + // Set old species + old_features["species"] = owner_species + + // Define species prefix + var/custom_species_prefix + + // Check if species is mammal (anthro) + if(ismammal(action_owner)) + // Do nothing! + + // Check if species is already a mammal sub-type + else if(owner_species in subtypesof(/datum/species/mammal)) + // Do nothing! + + // Check if species is a jelly + else if(isjellyperson(action_owner)) + // Set species prefix + custom_species_prefix = "Jelly " + + // Check if species is a jelly subtype + else if(owner_species in subtypesof(/datum/species/jelly)) + // Set species prefix + custom_species_prefix = "Slime " + + // Species is not a mammal + else + // Change species + action_owner.set_species(/datum/species/mammal, 1) + + // Set species changed + species_changed = TRUE + + // Set species features + action_owner.dna.custom_species = "[custom_species_prefix][werewolf_gender]wulf" + action_owner.dna.species.mutant_bodyparts["mam_tail"] = "Otusian" + action_owner.dna.species.mutant_bodyparts["legs"] = "Digitigrade" + action_owner.Digitigrade_Leg_Swap(FALSE) + action_owner.dna.species.mutant_bodyparts["mam_snouts"] = "Sergal" + action_owner.dna.features["mam_ears"] = "Jackal" + action_owner.dna.features["mam_tail"] = "Otusian" + action_owner.dna.features["mam_snouts"] = "Sergal" + action_owner.dna.features["legs"] = "Digitigrade" + action_owner.dna.features["insect_fluff"] = "Hyena" + action_owner.update_size(get_size(action_owner) + 0.5) + action_owner.set_bark("bark") + if(old_features["taur"] != "None") + action_owner.dna.features["taur"] = "Canine" + if(!(action_owner.dna.species.species_traits.Find(DIGITIGRADE))) + action_owner.dna.species.species_traits += DIGITIGRADE + action_owner.update_body() + action_owner.update_body_parts() + + // Update possible citadel organs + if(organ_breasts) + organ_breasts.color = "#[action_owner.dna.features["mcolor"]]" + organ_breasts.update() + if(organ_penis) + organ_penis.shape = "Knotted" + organ_penis.color = "#ff7c80" + organ_penis.update() + organ_penis.modify_size(6) + if(organ_vagina) + organ_vagina.shape = "Furred" + organ_vagina.color = "#[action_owner.dna.features["mcolor"]]" + organ_vagina.update() + + // Un-transform from wolf form + else + // Check if species was already mammal (anthro) + if(!species_changed) + // Do nothing! + + // Species was not a mammal + else + // Revert species + action_owner.set_species(old_features["species"], TRUE) + + // Clear species changed flag + species_changed = FALSE + + // Revert species trait + action_owner.set_bark(old_features["bark"]) + action_owner.dna.custom_species = old_features["custom_species"] + action_owner.dna.features["mam_ears"] = old_features["mam_ears"] + action_owner.dna.features["mam_snouts"] = old_features["mam_snouts"] + action_owner.dna.features["mam_tail"] = old_features["mam_tail"] + action_owner.dna.features["legs"] = old_features["legs"] + action_owner.dna.features["insect_fluff"] = old_features["insect_fluff"] + action_owner.dna.species.eye_type = old_features["eye_type"] + if(old_features["taur"] != "None") + action_owner.dna.features["taur"] = old_features["taur"] if(old_features["legs"] == "Plantigrade") - H.dna.species.species_traits -= DIGITIGRADE - H.Digitigrade_Leg_Swap(TRUE) - H.dna.species.mutant_bodyparts["legs"] = old_features["legs"] - H.update_body() - H.update_body_parts() - H.update_size(get_size(H) - 0.5) - if(B) - B.color = "#[old_features["breasts_color"]]" - B.update() - if(H.has_penis()) - P.shape = old_features["cock_shape"] - P.color = "#[old_features["cock_color"]]" - P.update() - P.modify_size(-6) - if(H.has_vagina()) - V.shape = old_features["vag_shape"] - V.color = "#[old_features["vag_color"]]" - V.update() - V.update_size() + action_owner.dna.species.species_traits -= DIGITIGRADE + action_owner.Digitigrade_Leg_Swap(TRUE) + action_owner.dna.species.mutant_bodyparts["legs"] = old_features["legs"] + action_owner.update_body() + action_owner.update_body_parts() + action_owner.update_size(get_size(action_owner) - 0.5) + + // Revert citadel organs + if(organ_breasts) + organ_breasts.color = "#[old_features["breasts_color"]]" + organ_breasts.update() + if(action_owner.has_penis()) + organ_penis.shape = old_features["cock_shape"] + organ_penis.color = "#[old_features["cock_color"]]" + organ_penis.update() + organ_penis.modify_size(-6) + if(action_owner.has_vagina()) + organ_vagina.shape = old_features["vag_shape"] + organ_vagina.color = "#[old_features["vag_color"]]" + organ_vagina.update() + organ_vagina.update_size() + + // Set transformation message + var/owner_p_their = action_owner.p_their() + var/toggle_message = (!transformed ? "[action_owner] shivers, [owner_p_their] flesh bursting with a sudden growth of thick fur as [owner_p_their] features contort to that of a beast, fully transforming [action_owner.p_them()] into a werewolf!" : "[action_owner] shrinks, [owner_p_their] wolfish features quickly receding.") + + // Alert in local chat + action_owner.visible_message(span_danger(toggle_message)) + + // Toggle transformation state transformed = !transformed -/datum/action/werewolf/Grant()// on grant sets some variables - . = ..() - var/mob/living/carbon/human/H = owner - old_features = H.dna.features.Copy() - old_features["species"] = H.dna.species.type - old_features["size"] = get_size(H) - old_features["bark"] = H.vocal_bark_id + // Start cooldown + StartCooldown() + // Return success + return TRUE + +// +// Quirk: Gargoyle +// /datum/action/gargoyle/transform name = "Transform" @@ -307,10 +927,6 @@ to_chat(H, span_warning("You have transformed too recently; you cannot yet transform again!")) return 0 -// -// Quirk: Gargoyle -// - /datum/action/gargoyle/check name = "Check" desc = "Check your current energy levels." diff --git a/modular_splurt/code/game/objects/items/cards_ids.dm b/modular_splurt/code/game/objects/items/cards_ids.dm index 0d24bd0085..69debcec83 100644 --- a/modular_splurt/code/game/objects/items/cards_ids.dm +++ b/modular_splurt/code/game/objects/items/cards_ids.dm @@ -8,9 +8,12 @@ desc = "A cheap ID used by slave traders. This guy seems to run the show." /obj/item/card/id/vampire - name = "Vampire ID" - desc = "An ID made to easily recognize vampires without needing to do tests" + name = "Bloodfledge ID" + desc = "An ID made to easily recognize bloodsucker fledglings without requiring medical scans." + icon = 'modular_splurt/icons/obj/card.dmi' icon_state = "vampire" + assignment = "Bloodsucker Fledgling" + uses_overlays = FALSE /obj/item/card/id/away/hotel/splurt name = "Staff ID" diff --git a/modular_splurt/code/game/objects/items/holy_weapons.dm b/modular_splurt/code/game/objects/items/holy_weapons.dm index 0af2838523..b14e87f890 100644 --- a/modular_splurt/code/game/objects/items/holy_weapons.dm +++ b/modular_splurt/code/game/objects/items/holy_weapons.dm @@ -9,3 +9,38 @@ slot_flags = ITEM_SLOT_BELT w_class = WEIGHT_CLASS_BULKY attack_verb = list("smacked", "struck", "cracked", "beaten") + +/obj/item/nullrod/papal_staff + name = "papal staff" + desc = "A staff used by traditional bishops and popes." + icon = 'modular_splurt/icons/obj/items_and_weapons.dmi' + icon_state = "papal_staff" + item_state = "papal_staff" + lefthand_file = 'modular_splurt/icons/mob/inhands/weapons/melee_lefthand.dmi' + righthand_file = 'modular_splurt/icons/mob/inhands/weapons/melee_righthand.dmi' + w_class = WEIGHT_CLASS_BULKY + attack_verb = list("smacked", "struck", "cracked", "beaten", "purified") + +/obj/item/clothing/head/mitre + name = "papal mitre" + desc = "A traditional headdress, worn by bishops and popes in traditional Christianity" + icon = 'modular_splurt/icons/obj/clothing/hats.dmi' + mob_overlay_icon = 'modular_splurt/icons/mob/clothing/32x48_head.dmi' + icon_state = "mitre" + flags_inv = HIDEHAIR | HIDEFACIALHAIR + +/obj/item/clothing/suit/chaplain/papal + name = "papal robe" + desc = "A short cape over a cassock, worn by bishops and popes in traditional Christianity" + icon = 'modular_splurt/icons/obj/clothing/suits.dmi' + mob_overlay_icon = 'modular_splurt/icons/mobs/suits.dmi' + icon_state = "papalrobe" + body_parts_covered = CHEST|GROIN|LEGS|ARMS + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON + +/obj/item/storage/box/holy/papal + name = "Papal Kit" + +/obj/item/storage/box/holy/papal/PopulateContents() + new /obj/item/clothing/head/mitre(src) + new /obj/item/clothing/suit/chaplain/papal(src) diff --git a/modular_splurt/code/game/objects/items/lewd_items/genital_equipment/condom.dm b/modular_splurt/code/game/objects/items/lewd_items/genital_equipment/condom.dm index 072ba15541..ec212f5015 100644 --- a/modular_splurt/code/game/objects/items/lewd_items/genital_equipment/condom.dm +++ b/modular_splurt/code/game/objects/items/lewd_items/genital_equipment/condom.dm @@ -9,6 +9,7 @@ icon_state = "b_condom_wrapped" var/unwrapped = 0 w_class = WEIGHT_CLASS_TINY + custom_price = PRICE_CHEAP_AS_FREE // 10 credits /obj/item/genital_equipment/condom/Initialize() create_reagents(300, DRAWABLE|NO_REACT) diff --git a/modular_splurt/code/game/objects/items/miscellaneous.dm b/modular_splurt/code/game/objects/items/miscellaneous.dm index 72cd6781e5..e01b30ceea 100644 --- a/modular_splurt/code/game/objects/items/miscellaneous.dm +++ b/modular_splurt/code/game/objects/items/miscellaneous.dm @@ -190,12 +190,12 @@ name = "security holo badge" desc = "A more futuristic hard-light badge" icon_state = "security_badge_holo" - + /obj/item/clothing/accessory/badge/deputy name = "security deputy badge" desc = "A shiny silver badge for deputies on the Security force" icon_state = "security_badge_deputy" - + /datum/design/sec_badge name = "Security Badge" desc = "A shiny badge to show the bearer is part of the Security force." @@ -215,3 +215,41 @@ build_path = /obj/item/clothing/accessory/badge/deputy category = list("Equipment") departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/obj/item/handmirror/split_personality + name = "dissociative mirror" + desc = "An enchanted hand mirror. You may not recognize who stares back." + var/item_used + +/obj/item/handmirror/split_personality/attack_self(mob/user) + // Check if already used + if(item_used) + // Warn user, then return + to_chat(user, span_warning("[src] is no longer functional.")) + return + + // Check if human user exists + if(!ishuman(user)) + // Warn user, then return + to_chat(user, span_warning("You see nothing in [src].")) + return + + // Define human user + var/mob/living/carbon/human/mirror_user = user + + // Add brain trauma + mirror_user.gain_trauma(/datum/brain_trauma/severe/split_personality, TRAUMA_RESILIENCE_SURGERY) + + // Set item used variable + // This prevents future use + item_used = TRUE + + // Alert in local chat + mirror_user.visible_message(span_warning("The [src] shatters in [mirror_user]'s hands!"), span_warning("The mirror shatters in your hands!")) + + // Play mirror break sound + playsound(src, 'sound/effects/Glassbr3.ogg', 50, 1) + + // Set flavor text + name = "broken hand mirror" + desc = "You won\'t get much use out of it." diff --git a/modular_splurt/code/game/objects/items/robot/robot_items.dm b/modular_splurt/code/game/objects/items/robot/robot_items.dm index 9189c814e7..125f733903 100644 --- a/modular_splurt/code/game/objects/items/robot/robot_items.dm +++ b/modular_splurt/code/game/objects/items/robot/robot_items.dm @@ -79,3 +79,15 @@ source = /datum/robot_energy_storage/wrapping_paper /// End Cargo Borg Items /// + + +/obj/item/gripper/service + name = "service gripper" + desc = "A simple grasping tool for interacting with food and condiments." + can_hold = list( + /obj/item/reagent_containers/glass, + /obj/item/reagent_containers/food, + /obj/item/kitchen, + /obj/item/storage/bag/tray + ) + diff --git a/modular_splurt/code/game/objects/items/storage/boxes.dm b/modular_splurt/code/game/objects/items/storage/boxes.dm index 29fe86ebcc..a205279caa 100644 --- a/modular_splurt/code/game/objects/items/storage/boxes.dm +++ b/modular_splurt/code/game/objects/items/storage/boxes.dm @@ -51,3 +51,28 @@ /obj/item/paper/fluff/shipment_plushmium name = "plushmium backer note" info = "

Plushmium Instructions

Dear esteemed customer,

Thank for backing the Stuffing For Spessmen© crowd funding initiative. We at Donk Co. pride ourselves on making a wide variety of engaging toys for our loyal customers to enjoy. Now, we're bringing the toy making process directly to your home or workplace! Included in this box is:To begin enjoying your new friend, start by unpacking the included plushie. Our selection process goes through rigorous quality testing to ensure you'll always get the best toy for the job. With so many choices, you'll want to get the whole family in on the action.

Once you have everything ready, it's time to make the patented Donk Co. magic happen! Spray your new best friend with Love to Life™ solution, included in the complimentary spray bottle, and watch the stunning transformation!

But don't leave your new best friend hanging! Give them a big warm hug to celebrate the long and intimate friendship you'll be sharing.


Donk Co. is not responsible for any injury or loss of life that may occur while using the Love to Life™ solution. Do not allow access to children or adults without supervision by a chemist.

Do not drink, splash, inject, or otherwise handle the solution. Do not come into direct physical contact with the solution, or any object the solution has been applied to, under any circumstances." + +// Kinkmate listing for condom box +/obj/item/storage/box/bulk_condoms + name = "surplus condom box" + desc = "A large collection of condoms, suitable for the safest of sluts!" + icon = 'modular_sand/icons/obj/fleshlight.dmi' + icon_state = "box" + custom_price = PRICE_BELOW_NORMAL // 20% discount from buying individually + +/obj/item/storage/box/bulk_condoms/ComponentInitialize() + . = ..() + + // Define storage component + var/datum/component/storage/str = GetComponent(/datum/component/storage) + + // Set max items to 10 + str.max_items = 10 + + // Restrict contents to only condoms + str.can_hold = typecacheof(list(/obj/item/genital_equipment/condom)) + +/obj/item/storage/box/bulk_condoms/PopulateContents() + // Add maximum amount + for(var/i in 1 to 10) + new /obj/item/genital_equipment/condom(src) diff --git a/modular_splurt/code/game/objects/items/toys.dm b/modular_splurt/code/game/objects/items/toys.dm index 1079de98bf..b131fd5c74 100644 --- a/modular_splurt/code/game/objects/items/toys.dm +++ b/modular_splurt/code/game/objects/items/toys.dm @@ -3,3 +3,106 @@ icon = 'modular_splurt/icons/obj/toy.dmi' icon_state = "savannahivanovtoy" desc = "Mini-Mecha action figure! Collect them all! 13/12." + +/obj/item/toy/figure/assistant/imaginary_friend + name = "imaginary friend action figure" + desc = "A toy that resembles a special friend." + toysay = "I'll always be your best friend!" + var/item_used + +/obj/item/toy/figure/assistant/imaginary_friend/attack_self(mob/user as mob) + // Check if already used + if(item_used) + // Warn user, then return + to_chat(user, span_warning("[src] does nothing. It must be broken.")) + return + + // Check if human user exists + if(!ishuman(user)) + // Warn user, then return + to_chat(user, span_warning("You refrain from handling [src].")) + return + + // Define human user + var/mob/living/carbon/human/mirror_user = user + + // Add brain trauma + mirror_user.gain_trauma(/datum/brain_trauma/special/imaginary_friend, TRAUMA_RESILIENCE_SURGERY) + + // Set item used variable + // This prevents future use + item_used = TRUE + + // Alert in local chat + mirror_user.visible_message(span_warning("[mirror_user] plays with [src]."), span_warning("You start to remember [src], as if they were a real person!")) + + // Set flavor text + name = "generic action figure" + desc = "It\'s just a normal toy." + +/obj/item/toy/beach_ball + var/obj/item/vibrator + var/enabled = FALSE + +/obj/item/toy/beach_ball/syndicate + icon_state = "ballsyndicate" + icon = 'modular_splurt/icons/misc/beach.dmi' + desc = "Hmm. This ball is a bit heavier and tougher than the others." + +/obj/item/toy/beach_ball/attackby(obj/item/I, mob/living/user) + if(istype(I, /obj/item/electropack/vibrator)) + if(vibrator) + to_chat(user, span_warning("There is already a vibrator inside this!")) + else + if(!user.transferItemToLoc(I,src)) + return + to_chat(user, span_notice("You put [I] inside [src].")) + vibrator = I + +/obj/item/toy/beach_ball/attack_self(mob/user) + var/list/options_list = list() + if(vibrator) + options_list += list("Eject" = image(icon = 'icons/radials/taperecorder.dmi', icon_state = "eject", dir = EAST)) + options_list += list("Play" = image(icon = 'icons/radials/taperecorder.dmi', icon_state = "play", dir = WEST)) + if(options_list) + var/selection = show_radial_menu(user, src, options_list, radius = 38, require_near = TRUE, tooltips = TRUE) + if(!selection) + return + switch(selection) + if("Play") + playsound(user, 'sound/effects/clock_tick.ogg', 50, 1, -1) + enabled = !enabled + if(enabled) + START_PROCESSING(SSobj, src) + else + STOP_PROCESSING(SSobj, src) + to_chat(user, "You toggle the [vibrator].") + if("Eject") + playsound(user, 'sound/weapons/empty.ogg', 100, 1) + to_chat(user, "You remove [vibrator] from [src].") + user.put_in_hands(vibrator) + enabled = FALSE + vibrator = null + update_icon() + +/obj/item/toy/beach_ball/process() + if(vibrator && enabled) + throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),3,1) + playsound(src, 'modular_splurt/sound/lewd/vibrate.ogg', 40, 1, -1) + +/obj/item/toy/beach_ball/syndicate/process() + . = ..() + if(vibrator && enabled) + throwforce = 60 + +/obj/item/toy/beach_ball/syndicate/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback) + if(ishuman(thrower)) + throwforce = 0 + . = ..() + +/obj/item/toy/beach_ball/syndicate/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + . = ..() + if(istype(hit_atom, /turf/closed/wall) && throwforce > 0) + var/turf/closed/wall/W = hit_atom + W.dismantle_wall() + diff --git a/modular_splurt/code/modules/client/loadout/backpack.dm b/modular_splurt/code/modules/client/loadout/backpack.dm index 92fa744e48..05ea0cc25f 100644 --- a/modular_splurt/code/modules/client/loadout/backpack.dm +++ b/modular_splurt/code/modules/client/loadout/backpack.dm @@ -4,6 +4,11 @@ name = "Condom" path = /obj/item/genital_equipment/condom +/datum/gear/backpack/condom_box + name = "Box of Condoms" + path = /obj/item/storage/box/bulk_condoms + cost = 2 + /datum/gear/backpack/sounding name = "Sounding rod" path = /obj/item/genital_equipment/sounding diff --git a/modular_splurt/code/modules/client/loadout/shoes.dm b/modular_splurt/code/modules/client/loadout/shoes.dm index d10f823444..b75b1cd621 100644 --- a/modular_splurt/code/modules/client/loadout/shoes.dm +++ b/modular_splurt/code/modules/client/loadout/shoes.dm @@ -2,7 +2,7 @@ /datum/gear/shoes/footwraps name = "Cloth Footwraps" path= /obj/item/clothing/shoes/footwraps - + /datum/gear/shoes/invisiboots name = "Invisifiber Footwraps" path= /obj/item/clothing/shoes/invisiboots @@ -36,3 +36,7 @@ /datum/gear/shoes/puttee restricted_roles = list("Security Officer", "Warden", "Head of Security", "Brig Physician", "Blueshield") + +/datum/gear/shoes/highheel_sandals + name = "High-heel Sandals" + path = /obj/item/clothing/shoes/highheel_sandals diff --git a/modular_splurt/code/modules/client/loadout/uniform.dm b/modular_splurt/code/modules/client/loadout/uniform.dm index 29d91596d7..e9beae208e 100644 --- a/modular_splurt/code/modules/client/loadout/uniform.dm +++ b/modular_splurt/code/modules/client/loadout/uniform.dm @@ -146,3 +146,11 @@ path = /obj/item/clothing/under/goner/fake/poly loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC loadout_initial_colors = list("#E6E6E6") + +/datum/gear/uniform/leia_outfit + name = "Princess Leia Outfit" + path = /obj/item/clothing/under/misc/leia_outfit + +/datum/gear/uniform/performer/polychromic + name = "Polychromic performers one piece" + path = /obj/item/clothing/under/performer/polychromic diff --git a/modular_splurt/code/modules/client/preferences.dm b/modular_splurt/code/modules/client/preferences.dm index 683afd00cf..13b9bc882b 100644 --- a/modular_splurt/code/modules/client/preferences.dm +++ b/modular_splurt/code/modules/client/preferences.dm @@ -1,12 +1,18 @@ /datum/preferences + max_save_slots = DEFAULT_SAVE_SLOTS var/unholypref = "No" //Goin 2 hell fo dis one - var/list/gfluid_blacklist = list() //Stuff you don't want people to cum into you /datum/preferences/New(client/C) if(!GLOB.genital_fluids_list) build_genital_fluids_list() //I DON'T KNOW where else to put it, ok?? + //Extra saves for donators + max_save_slots = CONFIG_GET(number/base_save_slots) + if(istype(C)) + var/extra_slots = (IS_CKEY_DONATOR_GROUP(C.key, DONATOR_GROUP_TIER_1) + IS_CKEY_DONATOR_GROUP(C.key, DONATOR_GROUP_TIER_2) + IS_CKEY_DONATOR_GROUP(C.key, DONATOR_GROUP_TIER_3)) * 10 + max_save_slots += extra_slots + . = ..() /proc/build_genital_fluids_list() diff --git a/modular_splurt/code/modules/clothing/clothing.dm b/modular_splurt/code/modules/clothing/clothing.dm new file mode 100644 index 0000000000..d006aa26f1 --- /dev/null +++ b/modular_splurt/code/modules/clothing/clothing.dm @@ -0,0 +1,43 @@ +/obj/item/clothing + var/last_bites = 3 //Once clothes is shredded, this determines how many more bites till its deleted. + var/is_edible = 0 //Controls what can or can't be eaten by Clothes Eaters/Insects + +//Cloth eaters get some nutrients. A Jumpsuit will roughly give back 50 Nutrition. IF eaten fully. +/obj/item/reagent_containers/food/snacks/clothing + list_reagents = list(/datum/reagent/consumable/nutriment = 3) + +//A call on attemp_forcefeed() without async to properly know if it worked or not. In theory this shouldn't cause any issues as only a small part of the population should ever run this.VS normal eating. +/obj/item/reagent_containers/food/snacks/clothing/attack(mob/living/M, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1) + if(user.a_intent == INTENT_HARM) + return ..() + return attempt_forcefeed(M, user) + + +//As a bonus for having the Cloth Eater trait. You gain extra mood from eatin clothes, but damage them at the same time. +/obj/item/clothing/attack(mob/M, mob/user, def_zone) + if(user.a_intent != INTENT_HARM) + if(HAS_TRAIT(M,TRAIT_CLOTH_EATER) || isinsect(M)) + if(is_edible == 0) //This checks if an item can be shredded. + to_chat(M, "This item is too tough to eat.") + return FALSE //Return False to prevent the player smacking themselves with the item. Didn't want to risk a player accidently hurting themselves trying to eat anything. + var/obj/item/reagent_containers/food/snacks/clothing/clothing_as_food = new + clothing_as_food.name = name + var/mob/living/H = M + if(clothing_as_food.attack(M, user, def_zone)) //Staggered as calling it in the original IF will cause anyone who lacks either to eat. + if(damaged_clothes == CLOTHING_SHREDDED) //Check if we need to start breaking clothes + last_bites -= 1 + to_chat(M, "There isn't much of the [name] left to eat.") + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "cloth_consumed", /datum/mood_event/cloth_eaten, src) + take_damage(20, sound_effect=FALSE) + qdel(clothing_as_food) + if(last_bites <= 0) + user.visible_message("[user] finishes eating the [name].") + qdel(src) + return TRUE + return ..() + +// Set the clothing's integrity back to 100%, remove all damage to bodyparts, and generally fix it up +/obj/item/clothing/repair(mob/user, params) + .=..() + last_bites = 3 + diff --git a/modular_splurt/code/modules/clothing/glasses/_glasses.dm b/modular_splurt/code/modules/clothing/glasses/_glasses.dm index 6e356a528a..04d23745dc 100644 --- a/modular_splurt/code/modules/clothing/glasses/_glasses.dm +++ b/modular_splurt/code/modules/clothing/glasses/_glasses.dm @@ -1,6 +1,6 @@ /obj/item/clothing/glasses/aviators name = "aviators" - desc = "Strangely fasionable ancient technology used to help provide rudimentary eye cover. Enhanced shielding blocks flashes." + desc = "Strangely fashionable ancient technology used to help provide rudimentary eye cover. Enhanced shielding blocks flashes." icon = 'modular_splurt/icons/obj/clothing/glasses.dmi' icon_state = "aviator" mob_overlay_icon = 'modular_splurt/icons/mobs/eyes.dmi' @@ -8,3 +8,9 @@ flash_protect = 1 tint = 1 glass_colour_type = /datum/client_colour/glass_colour/gray + +/obj/item/clothing/glasses/eyepatch + is_edible = 1 + +/obj/item/clothing/glasses/sunglasses/blindfold + is_edible = 1 diff --git a/modular_splurt/code/modules/clothing/glasses/hud.dm b/modular_splurt/code/modules/clothing/glasses/hud.dm index 15cbf475b7..e6df06cf4a 100644 --- a/modular_splurt/code/modules/clothing/glasses/hud.dm +++ b/modular_splurt/code/modules/clothing/glasses/hud.dm @@ -2,7 +2,7 @@ /obj/item/clothing/glasses/hud/blueshield name = "blueshield HUD glasses" - desc = "A hud with multiple functions." + desc = "A HUD with multiple functions." actions_types = list(/datum/action/item_action/switch_hud) icon_state = "sunhudmed" icon = 'icons/obj/clothing/glasses.dmi' @@ -36,7 +36,7 @@ /obj/item/clothing/glasses/hud/blueshield/aviators name = "blueshield HUD Aviators" - desc = "A hud with multiple functions. More stylish." + desc = "A HUD with multiple functions. More stylish." actions_types = list(/datum/action/item_action/switch_hud) icon = 'modular_splurt/icons/obj/clothing/glasses.dmi' icon_state = "aviator_med" @@ -72,12 +72,12 @@ /obj/item/clothing/glasses/hud/blueshield/aviators/prescription name = "prescription blueshield HUD Aviators" - desc = "A hud with multiple functions. More stylish. Equipped with prescription lenses." + desc = "A HUD with multiple functions. More stylish. Equipped with prescription lenses." vision_correction = 1 /obj/item/clothing/glasses/hud/blueshield/prescription name = "prescription blueshield HUD" - desc = "A hud with multiple functions. Equipped with prescription lenses." + desc = "A HUD with multiple functions. Equipped with prescription lenses." vision_correction = 1 // Med HUDs @@ -97,14 +97,14 @@ // Sec HUDs /obj/item/clothing/glasses/hud/security/sunglasses/aviators - name = "secuirity HUD aviators" + name = "security HUD aviators" desc = "aviators with a security HUD." icon = 'modular_splurt/icons/obj/clothing/glasses.dmi' icon_state = "aviator_sec" mob_overlay_icon = 'modular_splurt/icons/mobs/eyes.dmi' /obj/item/clothing/glasses/hud/security/sunglasses/aviators/prescription - name = "prescription secuirity HUD aviators" + name = "prescription security HUD aviators" desc = "aviators with a security HUD with prescription lenses." vision_correction = 1 diff --git a/modular_splurt/code/modules/clothing/gloves.dm b/modular_splurt/code/modules/clothing/gloves.dm index cd62afea1b..74af3a9f02 100644 --- a/modular_splurt/code/modules/clothing/gloves.dm +++ b/modular_splurt/code/modules/clothing/gloves.dm @@ -1,6 +1,6 @@ /obj/item/clothing/gloves/cbrn name = "CBRN gloves" - desc = "Chemical, Biological, Radiological and Nuclear. Thick black gloves design for working in hazardus evniroments. Warning not shock proof." + desc = "Chemical, Biological, Radiological and Nuclear. Thick black gloves design for working in hazardous environments. Warning not shock proof." icon_state = "black" item_state = "blackgloves" siemens_coefficient = 1 @@ -14,21 +14,22 @@ rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE armor = list("melee" = 5, "bullet" = 0, "laser" = 5,"energy" = 5, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 40, "acid" = 100) strip_mod = 1.5 + is_edible = 0 /obj/item/clothing/gloves/cbrn/engineer name = "engineer CBRN gloves" siemens_coefficient = 0 - desc = "Chemical, Biological, Radiological and Nuclear. Thick black gloves design for working in hazardus evniroments. Improved for engineering hazards" + desc = "Chemical, Biological, Radiological and Nuclear. Thick black gloves design for working in hazardous environments. Improved for engineering hazards" /obj/item/clothing/gloves/cbrn/mopp name = "MOPP gloves" - desc = "Mission Oriented Protective Posture. Thick black gloves design for working in hazardus combat evniroments. Still not shock proof" + desc = "Mission Oriented Protective Posture. Thick black gloves design for working in hazardous combat environments. Still not shock proof" icon_state = "combat" armor = list("melee" = 10, "bullet" = 0, "laser" = 10,"energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 40, "acid" = 100) /obj/item/clothing/gloves/cbrn/mopp/advance name = "advance MOPP gloves" - desc = "Mission Oriented Protective Posture. Thick black gloves design for working in hazardus combat evniroments. Advance varaints for Central Command staff and ERT team. Insulated." + desc = "Mission Oriented Protective Posture. Thick black gloves design for working in hazardous combat environments. Advance variants for Central Command staff and ERT team. Insulated." icon_state = "combat" siemens_coefficient = 0 armor = list("melee" = 15, "bullet" = 0, "laser" = 15,"energy" = 15, "bomb" = 20, "bio" = 110, "rad" = 110, "fire" = 60, "acid" = 110) diff --git a/modular_splurt/code/modules/clothing/gloves/_gloves.dm b/modular_splurt/code/modules/clothing/gloves/_gloves.dm new file mode 100644 index 0000000000..22f54d4075 --- /dev/null +++ b/modular_splurt/code/modules/clothing/gloves/_gloves.dm @@ -0,0 +1,2 @@ +/obj/item/clothing/gloves + is_edible = 1 diff --git a/modular_splurt/code/modules/clothing/head/_head.dm b/modular_splurt/code/modules/clothing/head/_head.dm new file mode 100644 index 0000000000..281c24b862 --- /dev/null +++ b/modular_splurt/code/modules/clothing/head/_head.dm @@ -0,0 +1,2 @@ +/obj/item/clothing/head + is_edible = 1 //Helment and Hardhats + some Special misc are unedible diff --git a/modular_splurt/code/modules/clothing/head/hardhat.dm b/modular_splurt/code/modules/clothing/head/hardhat.dm new file mode 100644 index 0000000000..24c83f606d --- /dev/null +++ b/modular_splurt/code/modules/clothing/head/hardhat.dm @@ -0,0 +1,2 @@ +/obj/item/clothing/head/hardhat + is_edible = 0 diff --git a/modular_splurt/code/modules/clothing/head/helmet.dm b/modular_splurt/code/modules/clothing/head/helmet.dm index f15a9368df..aaad3a6243 100644 --- a/modular_splurt/code/modules/clothing/head/helmet.dm +++ b/modular_splurt/code/modules/clothing/head/helmet.dm @@ -1,4 +1,7 @@ // GWTB-inspired stuff wooo +/obj/item/clothing/head/helmet + is_edible = 0 + /obj/item/clothing/head/helmet/goner name = "trencher helmet" desc = "A No Man's Land-type helmet with purple paint applied." @@ -15,7 +18,7 @@ /obj/item/clothing/head/helmet/goner/fake/poly name = "polychromic trencher helmet" - desc = "A plastic helmet with polychromatic spot." + desc = "A plastic helmet with polychromic spot." var/list/poly_colors = list("#D9D9D9") /obj/item/clothing/head/helmet/goner/fake/poly/ComponentInitialize() @@ -56,7 +59,7 @@ /obj/item/clothing/head/helmet/goner/officer/fake/poly name = "polychromic trencher officer cap" - desc = "A cheap officer cap with polychromatic pin." + desc = "A cheap officer cap with polychromic pin." var/list/poly_colors = list("#F2F2F2") /obj/item/clothing/head/helmet/goner/officer/fake/poly/ComponentInitialize() diff --git a/modular_splurt/code/modules/clothing/head/jobs.dm b/modular_splurt/code/modules/clothing/head/jobs.dm index cf5bc553b4..e989e5bc2d 100644 --- a/modular_splurt/code/modules/clothing/head/jobs.dm +++ b/modular_splurt/code/modules/clothing/head/jobs.dm @@ -15,7 +15,7 @@ /obj/item/clothing/head/blueshield/formal name = "blueshield formal beret" - desc = "The robust beret for the Blueshield. A formal varaint of the standard beret." + desc = "The robust beret for the Blueshield. A formal variant of the standard beret." icon_state = "blueshield" item_state = "blueshield" icon = 'modular_splurt/icons/obj/clothing/head.dmi' @@ -31,7 +31,7 @@ /obj/item/clothing/head/beret/sec/peacekeeper name = "peacekeeper beret" - desc = "A robust beret with a grey varaint of the security insignia emblazoned on it. This one is modeled is design to make people less scared of an officer." + desc = "A robust beret with a grey variant of the security insignia emblazoned on it. This one is modeled is design to make people less scared of an officer." icon_state = "policeberet" item_state = "policeberet" icon = 'modular_splurt/icons/obj/clothing/head.dmi' @@ -39,7 +39,7 @@ /obj/item/clothing/head/helmet/metrocop name = "civil protection helmet" - desc = "Saldy lacks a working voice encoder." + desc = "Sadly lacks a working voice encoder." icon_state = "metrocop_helmet" item_state = "metrocop_helmet" icon = 'modular_splurt/icons/obj/clothing/head.dmi' @@ -49,13 +49,13 @@ /obj/item/clothing/head/beret/sec/peacekeeper/warden name = "warden's peacekeeper beret" - desc = "A robust beret with a red varaint of the security insignia emblazoned on it. This one is issiued to wardens." + desc = "A robust beret with a red variant of the security insignia emblazoned on it. This one is issued to wardens." icon_state = "policeberetred" item_state = "policeberetred" /obj/item/clothing/head/beret/sec/peacekeeper/hos name = "head of security's peacekeeper beret" - desc = "A robust beret with a gold varaint of the security insignia emblazoned on it. This one is issiued to the Head of Security." + desc = "A robust beret with a gold variant of the security insignia emblazoned on it. This one is issued to the Head of Security." icon_state = "policeberetgold" item_state = "policeberetgold" diff --git a/modular_splurt/code/modules/clothing/head/misc.dm b/modular_splurt/code/modules/clothing/head/misc.dm index 6c5164be1e..eb14ad475d 100644 --- a/modular_splurt/code/modules/clothing/head/misc.dm +++ b/modular_splurt/code/modules/clothing/head/misc.dm @@ -26,7 +26,7 @@ name = "press helmet" icon_state = "press_helmet" item_state = "press_helmet" - desc = "A lightweight helmet for reporting on security. You swear up and down it is made of kevlar and not old cloth and plastic." + desc = "A lightweight helmet for reporting on security. You swear up and down it is made of Kevlar and not old cloth and plastic." icon = 'modular_splurt/icons/obj/clothing/head.dmi' mob_overlay_icon = 'modular_splurt/icons/mob/clothing/head.dmi' flags_inv = HIDEHAIR @@ -51,6 +51,7 @@ flags_inv = HIDEHAIR|HIDEEARS resistance_flags = ACID_PROOF rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE + is_edible = 0 /obj/item/clothing/head/helmet/cbrn/mopp name = "MOPP hood" @@ -59,6 +60,7 @@ item_state = "mopphood" can_flashlight = 1 armor = list("melee" = 40, "bullet" = 30, "laser" = 30,"energy" = 10, "bomb" = 25, "bio" = 100, "rad" = 100, "fire" = 40, "acid" = 100) + is_edible = 0 /obj/item/clothing/head/helmet/cbrn/mopp/advance name = "advance MOPP hood" @@ -66,6 +68,7 @@ can_flashlight = 1 armor = list("melee" = 50, "bullet" = 40, "laser" = 40,"energy" = 20, "bomb" = 35, "bio" = 110, "rad" = 110, "fire" = 50, "acid" = 110) clothing_flags = NONE + is_edible = 0 // research nods @@ -81,7 +84,7 @@ /datum/design/cbrn/mopphood name = "MOPP Hood" - desc = "A MOPP hood with an intergreted helmet" + desc = "A MOPP hood with an integrated helmet" id = "mopp_hood" build_type = PROTOLATHE materials = list(/datum/material/plastic = 200, /datum/material/uranium = 50, /datum/material/iron = 200) diff --git a/modular_splurt/code/modules/clothing/head/misc_special.dm b/modular_splurt/code/modules/clothing/head/misc_special.dm new file mode 100644 index 0000000000..9a86ddcb53 --- /dev/null +++ b/modular_splurt/code/modules/clothing/head/misc_special.dm @@ -0,0 +1,5 @@ +/obj/item/clothing/head/welding + is_edible = 0 + +/obj/item/clothing/head/hardhat/cakehat + is_edible = 1 diff --git a/modular_splurt/code/modules/clothing/kinkyclothes.dm b/modular_splurt/code/modules/clothing/kinkyclothes.dm index 98bbb21e4a..4707c98cce 100644 --- a/modular_splurt/code/modules/clothing/kinkyclothes.dm +++ b/modular_splurt/code/modules/clothing/kinkyclothes.dm @@ -67,8 +67,8 @@ mutantrace_variation = NONE /obj/item/clothing/under/centcomdress - name = "Centcom Dress Uniform" - desc = "A stylish yet revealing dress uniform worn in extravagent black and gold, worthy of those who sit around and watch cameras all day in an office." + name = "CentCom Dress Uniform" + desc = "A stylish yet revealing dress uniform worn in extravagant black and gold, worthy of those who sit around and watch cameras all day in an office." icon = 'modular_splurt/icons/obj/clothing/suits.dmi' icon_state = "ccdress" mob_overlay_icon = 'modular_splurt/icons/mobs/suits.dmi' @@ -83,7 +83,7 @@ armor = list("melee" = 60, "bullet" = 80, "laser" = 80, "energy" = 90, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50) /obj/item/clothing/under/centcomdress/vk - name = "Virginkiller Centcom Dress Uniform" + name = "Virginkiller CentCom Dress Uniform" desc = "This black and gold beauty does not help paperwork get done, it seems." icon_state = "ccdressvk" @@ -114,7 +114,10 @@ icon_state = "vaultsuit" mob_overlay_icon = 'modular_splurt/icons/mob/clothing/uniform.dmi' item_state = "b_suit" + item_state = "b_suit" can_adjust = FALSE + anthro_mob_worn_overlay = 'modular_splurt/icons/mob/clothing/uniform_digi.dmi' + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_ALL_TAURIC var/firstpickup = TRUE var/pickupsound = TRUE diff --git a/modular_splurt/code/modules/clothing/lewd_clothing/collar/kink_collars.dm b/modular_splurt/code/modules/clothing/lewd_clothing/collar/kink_collars.dm index d170e12dba..10e4c4ea6a 100644 --- a/modular_splurt/code/modules/clothing/lewd_clothing/collar/kink_collars.dm +++ b/modular_splurt/code/modules/clothing/lewd_clothing/collar/kink_collars.dm @@ -19,7 +19,7 @@ /obj/item/mind_controller/Initialize(mapload, collar) //Store the collar on creation. src.collar = collar - . = ..() //very important to call parent in Intialize + . = ..() //very important to call parent in Initialize /obj/item/mind_controller/attack_self(mob/user) if (collar) diff --git a/modular_splurt/code/modules/clothing/lewd_clothing/eyes/hypnogoggles.dm b/modular_splurt/code/modules/clothing/lewd_clothing/eyes/hypnogoggles.dm index 58c5b5281f..9bc3ef1d7d 100644 --- a/modular_splurt/code/modules/clothing/lewd_clothing/eyes/hypnogoggles.dm +++ b/modular_splurt/code/modules/clothing/lewd_clothing/eyes/hypnogoggles.dm @@ -38,7 +38,7 @@ if(victim.glasses == src) victim.cure_trauma_type(/datum/brain_trauma/induced_hypnosis, TRAUMA_RESILIENCE_BASIC) -/obj/item/clothing/glasses/hypno/attack_self(mob/user) //Setting up hypnotising phrase +/obj/item/clothing/glasses/hypno/attack_self(mob/user) //Setting up hypnotizing phrase . = ..() codephrase = stripped_input(user, "Change the hypnotic phrase") // Notice to the user that this shouldn't be used outside of kink related purpose. diff --git a/modular_splurt/code/modules/clothing/lewd_clothing/foot/lewd_shoes.dm b/modular_splurt/code/modules/clothing/lewd_clothing/foot/lewd_shoes.dm index 061a1c85b6..718c3d2974 100644 --- a/modular_splurt/code/modules/clothing/lewd_clothing/foot/lewd_shoes.dm +++ b/modular_splurt/code/modules/clothing/lewd_clothing/foot/lewd_shoes.dm @@ -19,7 +19,7 @@ var/mob/living/carbon/C = user if(iscarbon(user) && (user.get_item_by_slot(ITEM_SLOT_FEET) == src)) if(seamless) - to_chat(C, span_purple(pick("You slide your heels against eachother in a failed attempt at kicking them off.", + to_chat(C, span_purple(pick("You slide your heels against each other in a failed attempt at kicking them off.", "The heels refuse to budge no matter how much you tug.", "The heels are tight around your ankles and the laces refuse to loosen."))) return diff --git a/modular_splurt/code/modules/clothing/lewd_clothing/head/deprivation_helmet.dm b/modular_splurt/code/modules/clothing/lewd_clothing/head/deprivation_helmet.dm index 8dd3ca8717..4376d2c773 100644 --- a/modular_splurt/code/modules/clothing/lewd_clothing/head/deprivation_helmet.dm +++ b/modular_splurt/code/modules/clothing/lewd_clothing/head/deprivation_helmet.dm @@ -6,7 +6,7 @@ /obj/item/clothing/head/helmet/space/deprivation_helmet name = "deprivation helmet" - desc = "Сompletely cuts off the wearer from the outside world." + desc = "Completely cuts off the wearer from the outside world." icon_state = "dephelmet" item_state = "dephelmet" armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 25, "rad" = 0, "fire" = 20, "acid" = 15, "wound" = 0) diff --git a/modular_splurt/code/modules/clothing/lewd_clothing/head/hats.dm b/modular_splurt/code/modules/clothing/lewd_clothing/head/hats.dm index 5adac22edd..c44d4781f4 100644 --- a/modular_splurt/code/modules/clothing/lewd_clothing/head/hats.dm +++ b/modular_splurt/code/modules/clothing/lewd_clothing/head/hats.dm @@ -23,7 +23,7 @@ /obj/item/clothing/head/blueshield/officercap name = "blueshield officer cap" - desc = "A officer cap of the Blueshield. It makes you feel more important then you acutally are." + desc = "A officer cap of the Blueshield. It makes you feel more important then you actually are." icon_state = "blueshieldcap" item_state = "blueshieldcap" @@ -56,7 +56,7 @@ /obj/item/clothing/head/helmet/sec/blueshield name = "blueshield helmet" - desc = "Reenforced Blueshield Security gear. Protects the head from impacts. You where this because you are boring." + desc = "Reinforced Blueshield Security gear. Protects the head from impacts. You where this because you are boring." icon_state = "bluehelmet" item_state = "bluehelmet" icon = 'modular_splurt/icons/obj/clothing/head.dmi' diff --git a/modular_splurt/code/modules/clothing/masks/_mask.dm b/modular_splurt/code/modules/clothing/masks/_mask.dm new file mode 100644 index 0000000000..d5f6e0f180 --- /dev/null +++ b/modular_splurt/code/modules/clothing/masks/_mask.dm @@ -0,0 +1,2 @@ +/obj/item/clothing/mask + is_edible = 1 diff --git a/modular_splurt/code/modules/clothing/masks/boxing.dm b/modular_splurt/code/modules/clothing/masks/boxing.dm new file mode 100644 index 0000000000..89015338f3 --- /dev/null +++ b/modular_splurt/code/modules/clothing/masks/boxing.dm @@ -0,0 +1,2 @@ +/obj/item/clothing/mask/infiltrator + is_edible = 0 diff --git a/modular_splurt/code/modules/clothing/masks/gasmask.dm b/modular_splurt/code/modules/clothing/masks/gasmask.dm index 460d695571..7d7066ab86 100644 --- a/modular_splurt/code/modules/clothing/masks/gasmask.dm +++ b/modular_splurt/code/modules/clothing/masks/gasmask.dm @@ -1,6 +1,9 @@ +/obj/item/clothing/mask/gas + is_edible = 0 + /obj/item/clothing/mask/gas/radmask name = "radiation mask" - desc = "An mask that somewhat protects the user from ratiation. Not as effective like a radiation hood, but is better than nothing." + desc = "An mask that somewhat protects the user from radiation. Not as effective like a radiation hood, but is better than nothing." icon = 'modular_splurt/icons/obj/clothing/masks.dmi' mob_overlay_icon = 'modular_splurt/icons/mob/clothing/mask.dmi' anthro_mob_worn_overlay = 'modular_splurt/icons/mob/clothing/mask_muzzle.dmi' diff --git a/modular_splurt/code/modules/clothing/masks/miscellaneous.dm b/modular_splurt/code/modules/clothing/masks/miscellaneous.dm index 8e89fd9f8e..865d5633ea 100644 --- a/modular_splurt/code/modules/clothing/masks/miscellaneous.dm +++ b/modular_splurt/code/modules/clothing/masks/miscellaneous.dm @@ -20,7 +20,7 @@ /obj/item/clothing/mask/gas/cbrn name = "CBRN gas mask" - desc = "Chemical, Biological, Radiological and Nuclear. A heavy duty gas mask design to be worn in hazardus enviorments. Acutally works like a gas mask as well as can be connected to intenral air supply." + desc = "Chemical, Biological, Radiological and Nuclear. A heavy duty gas mask design to be worn in hazardous environments. Actually works like a gas mask as well as can be connected to internal air supply." item_state = "gas_cbrn" icon_state = "gas_cbrn" icon = 'modular_splurt/icons/obj/clothing/masks.dmi' @@ -35,17 +35,18 @@ visor_flags_inv = 0 flavor_adjust = FALSE armor = list("melee" = 5, "bullet" = 0, "laser" = 5,"energy" = 5, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 40, "acid" = 100) + is_edible = 0 /obj/item/clothing/mask/gas/cbrn/mopp name = "MOPP gas mask" - desc = "Mission Oriented Protective Posture. A heavy duty gas mask design to be worn in hazardus combat enviorments. Acutally works like a gas mask as well as can be connected to intenral air supply." + desc = "Mission Oriented Protective Posture. A heavy duty gas mask design to be worn in hazardous combat environments. Actually works like a gas mask as well as can be connected to internal air supply." item_state = "gas_mopp" icon_state = "gas_mopp" armor = list("melee" = 10, "bullet" = 5, "laser" = 10,"energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 40, "acid" = 100) /obj/item/clothing/mask/gas/cbrn/mopp/advance name = "advance MOPP gas mask" - desc = "Mission Oriented Protective Posture. A heavy duty gas mask design to be worn in hazardus combat enviorments. Acutally works like a gas mask as well as can be connected to intenral air supply. Used by Centcom Staff and ERT teams." + desc = "Mission Oriented Protective Posture. A heavy duty gas mask design to be worn in hazardous combat environments. Actually works like a gas mask as well as can be connected to internal air supply. Used by CentCom Staff and ERT teams." armor = list("melee" = 20, "bullet" = 10, "laser" = 20,"energy" = 20, "bomb" = 20, "bio" = 110, "rad" = 110, "fire" = 50, "acid" = 110) //broken huds for loot @@ -77,7 +78,7 @@ /obj/item/clothing/glasses/brokenhud/health/night name = "broken night vision health scanner HUD" - desc = "An advanced medical heads-up display that allows doctors to find patients in complete darkness. However the eletronics seem to no longer work" + desc = "An advanced medical heads-up display that allows doctors to find patients in complete darkness. However the electronics seem to no longer work" icon_state = "healthhudnight" item_state = "glasses" glass_colour_type = /datum/client_colour/glass_colour/green diff --git a/modular_splurt/code/modules/clothing/neck/_neck.dm b/modular_splurt/code/modules/clothing/neck/_neck.dm index f17afa4e9f..40ae719af7 100644 --- a/modular_splurt/code/modules/clothing/neck/_neck.dm +++ b/modular_splurt/code/modules/clothing/neck/_neck.dm @@ -1,9 +1,16 @@ +/obj/item/clothing/neck + is_edible = 1 + +/obj/item/clothing/neck/stethoscope + is_edible = 2 + /obj/item/clothing/neck/petcollar/locked/security name = "security collar" desc = "For when you need to show everyone who your pet belongs to." icon = 'modular_splurt/icons/obj/clothing/neck.dmi' icon_state = "seccollar" poly_states = 0 + is_edible = 0 /obj/item/clothing/neck/petcollar/spike name = "Spiked Pet Collar" @@ -12,6 +19,7 @@ mob_overlay_icon = 'modular_splurt/icons/mob/clothing/neck.dmi' icon_state = "collar_spik" poly_states = 0 + is_edible = 0 /obj/item/clothing/neck/petcollar/locked/spike name = "Spiked Pet Collar" @@ -36,6 +44,7 @@ mob_overlay_icon = 'modular_splurt/icons/mob/clothing/neck.dmi' icon_state = "collar_holo" poly_states = 0 + is_edible = 0 /obj/item/clothing/neck/petcollar/casino name = "Casino Collar" @@ -52,6 +61,7 @@ mob_overlay_icon = 'modular_splurt/icons/mob/clothing/neck.dmi' icon_state = "casinoslave_available" poly_states = 0 + is_edible = 0 /obj/item/clothing/neck/petcollar/locked/casino/attackby(obj/item/K, mob/user, params) . = ..() diff --git a/modular_splurt/code/modules/clothing/shoes/_shoes.dm b/modular_splurt/code/modules/clothing/shoes/_shoes.dm new file mode 100644 index 0000000000..bc1fb9812f --- /dev/null +++ b/modular_splurt/code/modules/clothing/shoes/_shoes.dm @@ -0,0 +1,2 @@ +/obj/item/clothing/shoes + is_edible = 1 diff --git a/modular_splurt/code/modules/clothing/shoes/magboots.dm b/modular_splurt/code/modules/clothing/shoes/magboots.dm new file mode 100644 index 0000000000..b3c8d6dff8 --- /dev/null +++ b/modular_splurt/code/modules/clothing/shoes/magboots.dm @@ -0,0 +1,2 @@ +/obj/item/clothing/shoes/magboots + is_edible = 0 diff --git a/modular_splurt/code/modules/clothing/shoes/miscellaneous.dm b/modular_splurt/code/modules/clothing/shoes/miscellaneous.dm index 80e04717e6..d87fd74ce7 100644 --- a/modular_splurt/code/modules/clothing/shoes/miscellaneous.dm +++ b/modular_splurt/code/modules/clothing/shoes/miscellaneous.dm @@ -35,7 +35,7 @@ /obj/item/clothing/shoes/workboots/toeless name = "toe-less workboots" - desc = "A pair of toeless work boots designed for use in industrial settings. Modified for species whose toes have claws." + desc = "A pair of toe-less work boots designed for use in industrial settings. Modified for species whose toes have claws." icon = 'modular_splurt/icons/obj/clothing/shoes.dmi' icon_state = "workboots-toeless" mob_overlay_icon = 'modular_splurt/icons/mob/clothing/shoes.dmi' @@ -43,7 +43,7 @@ /obj/item/clothing/shoes/jackboots/cbrn name = "CBRN boots" - desc = "Chemical, Biological, Radiological and Nuclear. Thick black boots design for working in hazardus evniroments." + desc = "Chemical, Biological, Radiological and Nuclear. Thick black boots design for working in hazardous environments." icon = 'modular_splurt/icons/obj/clothing/shoes.dmi' icon_state = "cbrnboots" mob_overlay_icon = 'modular_splurt/icons/mob/clothing/shoes.dmi' @@ -51,15 +51,16 @@ resistance_flags = ACID_PROOF rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE armor = list("melee" = 5, "bullet" = 0, "laser" = 5,"energy" = 5, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 40, "acid" = 100) + is_edible = 0 /obj/item/clothing/shoes/jackboots/cbrn/mopp name = "MOPP boots" - desc = "Mission Oriented Protective Posture. Thick black boots design for working in hazardus combat evniroments." + desc = "Mission Oriented Protective Posture. Thick black boots design for working in hazardous combat environments." armor = list("melee" = 10, "bullet" = 0, "laser" = 10,"energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 40, "acid" = 100) /obj/item/clothing/shoes/jackboots/cbrn/mopp/advance name = "advance MOPP boots" - desc = "Mission Oriented Protective Posture. Thick black boots design for working in hazardus combat evniroments. Used by Centcom Officer and ERT staff." + desc = "Mission Oriented Protective Posture. Thick black boots design for working in hazardous combat environments. Used by CentCom Officer and ERT staff." armor = list("melee" = 10, "bullet" = 0, "laser" = 10,"energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 40, "acid" = 100) clothing_flags = NOSLIP @@ -83,3 +84,15 @@ build_path = /obj/item/clothing/shoes/jackboots/cbrn/mopp category = list("Equipment") departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/obj/item/clothing/shoes/highheel_sandals + name = "high-heel sandals" + desc = "A pair of high-heel sandals" + icon = 'modular_splurt/icons/obj/clothing/shoes.dmi' + mob_overlay_icon = 'modular_splurt/icons/mob/clothing/shoes.dmi' + anthro_mob_worn_overlay = 'modular_splurt/icons/mob/clothing/shoes_digi.dmi' + icon_state = "highheel_sandals" + +/obj/item/clothing/shoes/highheel_sandals/Initialize() + . = ..() + AddComponent(/datum/component/squeak, list('modular_splurt/sound/effects/footstep/highheel1.ogg' = 1,'modular_splurt/sound/effects/footstep/highheel2.ogg' = 1), 20) diff --git a/modular_splurt/code/modules/clothing/spacesuits/hardsuit.dm b/modular_splurt/code/modules/clothing/spacesuits/hardsuit.dm index c0ebab45ee..d56d5a7e45 100644 --- a/modular_splurt/code/modules/clothing/spacesuits/hardsuit.dm +++ b/modular_splurt/code/modules/clothing/spacesuits/hardsuit.dm @@ -22,7 +22,7 @@ //Own stuff /obj/item/clothing/head/helmet/space/hardsuit/rd/hev name = "HEV Suit helmet" - desc = "A Hazardous Environment Helmet. It fits snug over the suit and has a heads-up display for researchers. The flashlight seems broken, fitting considering this was made before the start of the milennium." + desc = "A Hazardous Environment Helmet. It fits snug over the suit and has a heads-up display for researchers. The flashlight seems broken, fitting considering this was made before the start of the millennium." icon = 'modular_splurt/icons/obj/clothing/hats.dmi' mob_overlay_icon = 'modular_splurt/icons/mob/clothing/head.dmi' anthro_mob_worn_overlay = 'modular_splurt/icons/mob/clothing/head_muzzled.dmi' @@ -38,7 +38,7 @@ /obj/item/clothing/suit/space/hardsuit/rd/hev name = "HEV Suit" - desc = "The hazard suit. It was designed to protect scientists from the blunt trauma, radiation, energy discharge that hazardous materials might produce or entail. Fits you like a glove. The automatic medical system seems broken... They're waiting for you, Gordon. In the test chamberrrrrr." + desc = "The hazard suit. It was designed to protect scientists from the blunt trauma, radiation, energy discharge that hazardous materials might produce or entail. Fits you like a glove. The automatic medical system seems broken... They're waiting for you, Gordon. In the test chamber." icon = 'modular_splurt/icons/obj/clothing/suits.dmi' mob_overlay_icon = 'modular_splurt/icons/mob/clothing/suit.dmi' anthro_mob_worn_overlay = 'modular_splurt/icons/mob/clothing/suit_digi.dmi' diff --git a/modular_splurt/code/modules/clothing/suits/armor.dm b/modular_splurt/code/modules/clothing/suits/armor.dm index 78e49153e2..c4e52bc605 100644 --- a/modular_splurt/code/modules/clothing/suits/armor.dm +++ b/modular_splurt/code/modules/clothing/suits/armor.dm @@ -2,7 +2,7 @@ name = "stripper armor" desc = "Talk about lightweight." icon = 'modular_splurt/icons/obj/clothing/suits.dmi' - mob_overlay_icon = 'modular_splurt/icons/mob/clothing/suit.dmi' //null I know you're reading this, you couldn't even edit the right file you absolute buffon + mob_overlay_icon = 'modular_splurt/icons/mob/clothing/suit.dmi' //null I know you're reading this, you couldn't even edit the right file you absolute buffoon mutantrace_variation = NONE icon_state = "armorstripper" item_state = "armorstripper" diff --git a/modular_splurt/code/modules/clothing/suits/cloaks.dm b/modular_splurt/code/modules/clothing/suits/cloaks.dm index 8de8a40071..bbbf127829 100644 --- a/modular_splurt/code/modules/clothing/suits/cloaks.dm +++ b/modular_splurt/code/modules/clothing/suits/cloaks.dm @@ -31,6 +31,7 @@ mob_overlay_icon = 'modular_splurt/icons/mob/clothing/neck.dmi' armor = list(MELEE = 35, BULLET = 40, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 20, RAD = 20, FIRE = 60, ACID = 60) body_parts_covered = CHEST|GROIN|ARMS + is_edible = 0 /obj/item/clothing/neck/cloak/binary name = "Binary cloak" diff --git a/modular_splurt/code/modules/clothing/suits/heavy.dm b/modular_splurt/code/modules/clothing/suits/heavy.dm index 435d890f44..4c6199b1ec 100644 --- a/modular_splurt/code/modules/clothing/suits/heavy.dm +++ b/modular_splurt/code/modules/clothing/suits/heavy.dm @@ -2,7 +2,7 @@ /obj/item/clothing/suit/cbrn name = "civilian CBRN suit" - desc = "Chemical, Biological, Radiological and Nuclear. A suit design for harsh environmental conditions short of no atmosphere. This one has civilian colors" + desc = "Chemical, Biological, Radiological and Nuclear. A suit design for harsh environmental conditions short of no atmosphere. This one has civilian colors." icon_state = "cbrnsuitciv" item_state = "cbrnsuitciv" icon = 'modular_splurt/icons/obj/clothing/suits.dmi' @@ -25,37 +25,37 @@ /obj/item/clothing/suit/cbrn/engineering name = "engineering CBRN suit" - desc = "Chemical, Biological, Radiological and Nuclear. A suit design for harsh environmental conditions short of no atmosphere. This one has engineering colors" + desc = "Chemical, Biological, Radiological and Nuclear. A suit design for harsh environmental conditions short of no atmosphere. This one has engineering colors." icon_state = "cbrnsuiteng" item_state = "cbrnsuiteng" /obj/item/clothing/suit/cbrn/security name = "engineering CBRN suit" - desc = "Chemical, Biological, Radiological and Nuclear. A suit design for harsh environmental conditions short of no atmosphere. This one has security colors" + desc = "Chemical, Biological, Radiological and Nuclear. A suit design for harsh environmental conditions short of no atmosphere. This one has security colors." icon_state = "cbrnsuitsec" item_state = "cbrnsuitsec" /obj/item/clothing/suit/cbrn/medical name = "medical CBRN suit" - desc = "Chemical, Biological, Radiological and Nuclear. A suit design for harsh environmental conditions short of no atmosphere. This one has medical colors" + desc = "Chemical, Biological, Radiological and Nuclear. A suit design for harsh environmental conditions short of no atmosphere. This one has medical colors." icon_state = "cbrnsuitmed" item_state = "cbrnsuitmed" /obj/item/clothing/suit/cbrn/cargo name = "cargo CBRN suit" - desc = "Chemical, Biological, Radiological and Nuclear. A suit design for harsh environmental conditions short of no atmosphere. This one has cargo colors" + desc = "Chemical, Biological, Radiological and Nuclear. A suit design for harsh environmental conditions short of no atmosphere. This one has cargo colors." icon_state = "cbrnsuitcargo" item_state = "cbrnsuitcargo" /obj/item/clothing/suit/cbrn/science name = "science CBRN suit" - desc = "Chemical, Biological, Radiological and Nuclear. A suit design for harsh environmental conditions short of no atmosphere. This one has science colors" + desc = "Chemical, Biological, Radiological and Nuclear. A suit design for harsh environmental conditions short of no atmosphere. This one has science colors." icon_state = "cbrnsuitsci" item_state = "cbrnsuitsci" /obj/item/clothing/suit/cbrn/service name = "service CBRN suit" - desc = "Chemical, Biological, Radiological and Nuclear. A suit design for harsh environmental conditions short of no atmosphere. This one has service colors" + desc = "Chemical, Biological, Radiological and Nuclear. A suit design for harsh environmental conditions short of no atmosphere. This one has service colors." icon_state = "cbrnsuitserv" item_state = "cbrnsuitserv" @@ -72,32 +72,32 @@ /obj/item/clothing/suit/cbrn/mopp/advance name = "advance MOPP suit" - desc = "Mission Oriented Protective Posture. A suit design for harsh combat conditions short of no atmosphere. This is an advance versoin for Non-ERT Central Command Staff." - slowdown = 0 // This is suppose to be advance, hopfully not too OP + desc = "Mission Oriented Protective Posture. A suit design for harsh combat conditions short of no atmosphere. This is an advance version for Non-ERT Central Command Staff." + slowdown = 0 // This is suppose to be advance, hopefully not too OP armor = list("melee" = 40, "bullet" = 60, "laser" = 40,"energy" = 30, "bomb" = 20, "bio" = 110, "rad" = 110, "fire" = 50, "acid" = 110) //Scale with standard MOPP suits as this effects all ERT suits clothing_flags = NONE /obj/item/clothing/suit/cbrn/mopp/advance/commander name = "advance MOPP suit 'Commander'" - desc = "Mission Oriented Protective Posture. A suit design for harsh combat conditions short of no atmosphere. This is an advance versoin for ERT Commanders." + desc = "Mission Oriented Protective Posture. A suit design for harsh combat conditions short of no atmosphere. This is an advance version for ERT Commanders." icon_state = "moppsuitertcom" item_state = "moppsuitertcom" /obj/item/clothing/suit/cbrn/mopp/advance/security name = "advance MOPP suit 'Security'" - desc = "Mission Oriented Protective Posture. A suit design for harsh combat conditions short of no atmosphere. This is an advance versoin for ERT Security members." + desc = "Mission Oriented Protective Posture. A suit design for harsh combat conditions short of no atmosphere. This is an advance version for ERT Security members." icon_state = "moppsuitertsec" item_state = "moppsuitertsec" /obj/item/clothing/suit/cbrn/mopp/advance/medical name = "advance MOPP suit 'Medical'" - desc = "Mission Oriented Protective Posture. A suit design for harsh combat conditions short of no atmosphere. This is an advance versoin for ERT Medical members." + desc = "Mission Oriented Protective Posture. A suit design for harsh combat conditions short of no atmosphere. This is an advance version for ERT Medical members." icon_state = "moppsuitertmed" item_state = "moppsuitertmed" /obj/item/clothing/suit/cbrn/mopp/advance/engi name = "advance MOPP suit 'Engineer'" - desc = "Mission Oriented Protective Posture. A suit design for harsh combat conditions short of no atmosphere. This is an advance versoin for ERT Engineering members." + desc = "Mission Oriented Protective Posture. A suit design for harsh combat conditions short of no atmosphere. This is an advance version for ERT Engineering members." icon_state = "moppsuiterteng" item_state = "moppsuiterteng" @@ -140,8 +140,8 @@ //research nods /datum/design/cbrn/cbrncivi - name = "Civlian CBRN Suit" - desc = "A civlian CBRN suit." + name = "Civilian CBRN Suit" + desc = "A civilian CBRN suit." id = "cbrn_civi" build_type = PROTOLATHE materials = list(/datum/material/plastic = 600, /datum/material/uranium = 500, /datum/material/iron = 600) diff --git a/modular_splurt/code/modules/clothing/suits/jobs.dm b/modular_splurt/code/modules/clothing/suits/jobs.dm index b62195363b..831c54ec87 100644 --- a/modular_splurt/code/modules/clothing/suits/jobs.dm +++ b/modular_splurt/code/modules/clothing/suits/jobs.dm @@ -1,6 +1,6 @@ /obj/item/clothing/suit/det_suit/lanyard - name = "trenchcoat" - desc = "An 18th-century multi-purpose trenchcoat. This one has a lanyard around the neck." + name = "trench coat" + desc = "An 18th-century multi-purpose trench coat. This one has a lanyard around the neck." icon = 'modular_splurt/icons/obj/clothing/suits.dmi' mob_overlay_icon = 'modular_splurt/icons/mob/clothing/suit.dmi' icon_state = "detective_lanyard" diff --git a/modular_splurt/code/modules/clothing/suits/miscellaneous.dm b/modular_splurt/code/modules/clothing/suits/miscellaneous.dm index 2d01bd9325..7a14c9ff14 100644 --- a/modular_splurt/code/modules/clothing/suits/miscellaneous.dm +++ b/modular_splurt/code/modules/clothing/suits/miscellaneous.dm @@ -115,7 +115,7 @@ item_state = "armor" body_parts_covered = CHEST|GROIN|LEGS|ARMS|FEET|HANDS hoodtype = /obj/item/clothing/head/hooded/corpus - flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT //"Hide shoes" but digi shoes dont get hidden, too bad! + flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT //"Hide shoes" but digi shoes don't get hidden, too bad! min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT mutantrace_variation = NONE //There is no need for a digi variant, it's a costume @@ -187,7 +187,7 @@ // GWTB-inspired stuff wooo /obj/item/clothing/suit/goner name = "trencher coat" - desc = "A generic trenchcoat of the boring wars. This one have purple, corporate insignias." + desc = "A generic trench coat of the boring wars. This one have purple, corporate insignias." icon = 'modular_splurt/icons/obj/clothing/suits.dmi' mob_overlay_icon = 'modular_splurt/icons/mob/clothing/suit.dmi' anthro_mob_worn_overlay = 'modular_splurt/icons/mob/clothing/suit_digi.dmi' @@ -208,7 +208,7 @@ /obj/item/clothing/suit/goner/fake/poly name = "polychromic trencher coat" - desc = "A generic, drab olive trenchcoat with polychromatic spots." + desc = "A generic, drab olive trench coat with polychromic spots." var/list/poly_colors = list("#E6E6E6", "#D6D6D6", "#D6D6D6") /obj/item/clothing/suit/goner/fake/poly/ComponentInitialize() @@ -218,26 +218,26 @@ /obj/item/clothing/suit/goner/fake/poly/classic name = "classic trencher coat" icon_state = "goner_suit_classic" - desc = "A generic, grey coat with polychromatic spots." + desc = "A generic, grey coat with polychromic spots." /obj/item/clothing/suit/goner/red name = "red trencher coat" - desc = "A trenchcoat of the boring wars. This one have red insignias." + desc = "A trench coat of the boring wars. This one have red insignias." icon_state = "goner_suit_r" /obj/item/clothing/suit/goner/green name = "green trencher coat" - desc = "A trenchcoat of the boring wars. This one have green insignias." + desc = "A trench coat of the boring wars. This one have green insignias." icon_state = "goner_suit_g" /obj/item/clothing/suit/goner/blue name = "blue trencher coat" - desc = "A trenchcoat of the boring wars. This one have blue insignias." + desc = "A trench coat of the boring wars. This one have blue insignias." icon_state = "goner_suit_b" /obj/item/clothing/suit/goner/yellow name = "yellow trencher coat" - desc = "A trenchcoat of the boring wars. This one have yellow insignias." + desc = "A trench coat of the boring wars. This one have yellow insignias." icon_state = "goner_suit_y" /obj/item/clothing/suit/hooded/corpus/jp //It's him! John Prodman! diff --git a/modular_splurt/code/modules/clothing/suits/utility.dm b/modular_splurt/code/modules/clothing/suits/utility.dm new file mode 100644 index 0000000000..8f7077a3c4 --- /dev/null +++ b/modular_splurt/code/modules/clothing/suits/utility.dm @@ -0,0 +1,2 @@ +/obj/item/clothing/head/radiation + is_edible = 0 diff --git a/modular_splurt/code/modules/clothing/suits/vest.dm b/modular_splurt/code/modules/clothing/suits/vest.dm index 1f406d49d0..20117298cf 100644 --- a/modular_splurt/code/modules/clothing/suits/vest.dm +++ b/modular_splurt/code/modules/clothing/suits/vest.dm @@ -11,14 +11,14 @@ /obj/item/clothing/suit/brigdoc/labcoat name = "brig physician lab coat" - desc = "A dark red labcoat for brig physicians." + desc = "A dark red lab coat for brig physicians." icon_state = "secmed_labcoat" item_state = "secmed_labcoat" - mob_overlay_icon = 'modular_splurt/icons/mob/clothing/suit.dmi' //its in a seperate file + mob_overlay_icon = 'modular_splurt/icons/mob/clothing/suit.dmi' //its in a separate file /obj/item/clothing/suit/brigdoc/armor name = "brig physician armored coat" - desc = "A dark red labcoat with armored vest for brig physicians. Used for hostile work enviroments." + desc = "A dark red lab coat with armored vest for brig physicians. Used for hostile work environments." icon_state = "secmed_armor" item_state = "secmed_armor" mob_overlay_icon = 'modular_splurt/icons/mob/clothing/suit.dmi' @@ -36,7 +36,7 @@ /obj/item/clothing/suit/armor/vest/bluesheid/coat name = "blueshield armored coat" - desc = "A fastional piece of armored style." + desc = "A fashionable piece of armored style." icon_state = "blueshieldcoat" item_state = "blueshieldcoat" @@ -62,7 +62,7 @@ /obj/item/clothing/suit/armor/vest/metrocop name = "civil protection armored vest" - desc = "You feel like this may not stop a scienctist armed with nothing but a crowbar." + desc = "You feel like this may not stop a scientist armed with nothing but a crowbar." icon_state = "metrocop_armor" item_state = "metrocop_armor" icon = 'modular_splurt/icons/obj/clothing/suits.dmi' @@ -70,7 +70,7 @@ dog_fashion = null /obj/item/clothing/suit/armor/vest/warden/peacekeeper - name = "warden's peacekeeper armored trenchcoat" + name = "warden's peacekeeper armored trench coat" desc = "A heavy trench coat with a armored vest sown into it. Used by the peace minded warden" icon_state = "peacekeeper_trench_warden" item_state = "peacekeeper_trench_warden" @@ -78,8 +78,8 @@ mob_overlay_icon = 'modular_splurt/icons/mob/clothing/suit.dmi' /obj/item/clothing/suit/armor/hos/peacekeeper - name = "head of secuirty's peacekeeper armored trenchcoat" - desc = "A heavy trench coat with a armored vest sown into it. Used by the peace minded head of secuirty" + name = "head of security's peacekeeper armored trench coat" + desc = "A heavy trench coat with a armored vest sown into it. Used by the peace minded head of security" icon_state = "peacekeeper_trench_hos" item_state = "peacekeeper_trench_hos" icon = 'modular_splurt/icons/obj/clothing/suits.dmi' diff --git a/modular_splurt/code/modules/clothing/under/_under.dm b/modular_splurt/code/modules/clothing/under/_under.dm index 847ba40c3c..b9b28a778e 100644 --- a/modular_splurt/code/modules/clothing/under/_under.dm +++ b/modular_splurt/code/modules/clothing/under/_under.dm @@ -1,3 +1,6 @@ +/obj/item/clothing/under + is_edible = 1 //Most jumpsuits are made of cloth so this is a safe bet. + /obj/item/clothing/under/Initialize(mapload) . = ..() if(!is_type_in_typecache(type, GLOB.skirt_peekable)) diff --git a/modular_splurt/code/modules/clothing/under/jobs/civilian/civilian.dm b/modular_splurt/code/modules/clothing/under/jobs/civilian/civilian.dm index 9b577874e6..2ab2219847 100644 --- a/modular_splurt/code/modules/clothing/under/jobs/civilian/civilian.dm +++ b/modular_splurt/code/modules/clothing/under/jobs/civilian/civilian.dm @@ -17,7 +17,7 @@ /obj/item/clothing/under/rank/civilian/lawyer/galaxy_blue name = "\improper De Void of Soul" - desc = "A suit of stars and high-V gas. One that screams the cosmos and unfathomnable vastness. Earned by only the best of the best." + desc = "A suit of stars and high-V gas. One that screams the cosmos and unfathomable vastness. Earned by only the best of the best." icon_state = "galaxy_blue" icon = 'modular_splurt/icons/obj/clothing/uniforms.dmi' mob_overlay_icon = 'modular_splurt/icons/mob/clothing/uniform.dmi' diff --git a/modular_splurt/code/modules/clothing/under/miscellaneous.dm b/modular_splurt/code/modules/clothing/under/miscellaneous.dm index dc4696af4e..6f8eacf6d8 100644 --- a/modular_splurt/code/modules/clothing/under/miscellaneous.dm +++ b/modular_splurt/code/modules/clothing/under/miscellaneous.dm @@ -37,7 +37,7 @@ /obj/item/clothing/under/lumberjack name = "lumberjack outfit" - desc = "I am a lumberjack and I am ok, I sleep all night and I work all day." + desc = "I am a lumberjack and I am okay, I sleep all night and I work all day." icon = 'modular_splurt/icons/obj/clothing/uniforms.dmi' icon_state = "lumberjack" mob_overlay_icon = 'modular_splurt/icons/mob/clothing/uniform.dmi' @@ -46,7 +46,7 @@ /obj/item/clothing/under/bunnysuit name = "bunny outfit" - desc = "A simple black bunnt outfit." + desc = "A simple black bunny outfit." icon = 'modular_splurt/icons/obj/clothing/uniforms.dmi' mob_overlay_icon = 'modular_splurt/icons/mob/clothing/uniform.dmi' icon_state = "bunnysuit" @@ -89,7 +89,7 @@ /obj/item/clothing/under/bunnysuit/white name = "white bunny outfit" - desc = "A simple white bunnt outfit." + desc = "A simple white bunny outfit." icon = 'modular_splurt/icons/obj/clothing/uniforms.dmi' mob_overlay_icon = 'modular_splurt/icons/mob/clothing/uniform.dmi' icon_state = "whitebunnysuit" @@ -194,7 +194,7 @@ /obj/item/clothing/head/helmet/space/plasmaman/security/blueshield name = "head of security's plasma envirosuit helmet" - desc = "A plasmaman containment helmet designed for the Bluesheidl, manacing black with blue stripes." + desc = "A plasmaman containment helmet designed for the Blueshield, menacing black with blue stripes." icon_state = "bs_envirohelm" item_state = "bs_envirohelm" icon = 'modular_splurt/icons/obj/clothing/head.dmi' @@ -203,7 +203,7 @@ /obj/item/clothing/under/rank/bridgeofficer name = "bridge officer outfit" - desc = "The uniform of a bridge officer. It makes you feel extremly importnant, even if you are not." + desc = "The uniform of a bridge officer. It makes you feel extremely important, even if you are not." icon = 'modular_splurt/icons/obj/clothing/uniforms.dmi' mob_overlay_icon = 'modular_splurt/icons/mob/clothing/uniform.dmi' icon_state = "bridgesec" @@ -225,7 +225,7 @@ /obj/item/clothing/under/rank/bridgeofficer/formal name = "bridge officer formal outfit" - desc = "The uniform of a bridge officer. Its a formal varaint." + desc = "The uniform of a bridge officer. Its a formal variant." icon = 'modular_splurt/icons/obj/clothing/uniforms.dmi' mob_overlay_icon = 'modular_splurt/icons/mob/clothing/uniform.dmi' icon_state = "bridgesecformal" @@ -281,7 +281,7 @@ /obj/item/clothing/under/goner/fake/poly name = "polychromic trencher uniform" - desc = "An utilitarian uniform with polychromatic spots." + desc = "An utilitarian uniform with polychromic spots." var/list/poly_colors = list("#E6E6E6") /obj/item/clothing/under/goner/fake/poly/ComponentInitialize() @@ -311,3 +311,24 @@ /obj/item/clothing/under/misc/gear_harness body_parts_covered = NONE +/obj/item/clothing/under/misc/leia_outfit + name = "space princess outfit" + desc = "Chain for your Master's erotic asphyxiation not included." + icon = 'modular_splurt/icons/obj/clothing/uniforms.dmi' + mob_overlay_icon = 'modular_splurt/icons/mob/clothing/uniform.dmi' + icon_state = "leia" + can_adjust = FALSE + +/obj/item/clothing/under/misc/leia_outfit/ComponentInitialize() + . = ..() + AddElement(/datum/element/polychromic, list("#C61818", "#D4AF37"), 2) + +/obj/item/clothing/under/performer/polychromic + name = "polychromic performers one piece" + icon = 'modular_splurt/icons/obj/clothing/uniforms.dmi' + mob_overlay_icon = 'modular_splurt/icons/mob/clothing/uniform.dmi' + icon_state = "poly_performer" + +/obj/item/clothing/under/performer/polychromic/ComponentInitialize() + . = ..() + AddElement(/datum/element/polychromic, list("#ffffff"), 1) diff --git a/modular_splurt/code/modules/clothing/underwear/_underwear.dm b/modular_splurt/code/modules/clothing/underwear/_underwear.dm new file mode 100644 index 0000000000..045d1f8ce7 --- /dev/null +++ b/modular_splurt/code/modules/clothing/underwear/_underwear.dm @@ -0,0 +1,2 @@ +/obj/item/clothing/underwear/ + is_edible = 1 diff --git a/modular_splurt/code/modules/events/bruh_moment.dm b/modular_splurt/code/modules/events/bruh_moment.dm index 564c409c70..d05dff6e61 100644 --- a/modular_splurt/code/modules/events/bruh_moment.dm +++ b/modular_splurt/code/modules/events/bruh_moment.dm @@ -4,9 +4,10 @@ weight = 10 min_players = 1 max_occurrences = 0 + category = EVENT_CATEGORY_FRIENDLY /datum/round_event/bruh_moment - startWhen = 8 + start_when = 8 fakeable = FALSE /datum/round_event/bruh_moment/start() diff --git a/modular_splurt/code/modules/events/crystalline_reentry.dm b/modular_splurt/code/modules/events/crystalline_reentry.dm index 02f8ff68ae..2894e4a484 100644 --- a/modular_splurt/code/modules/events/crystalline_reentry.dm +++ b/modular_splurt/code/modules/events/crystalline_reentry.dm @@ -4,6 +4,7 @@ min_players = 15 max_occurrences = 0 //Deactivated for now var/atom/special_target + category = EVENT_CATEGORY_SPACE /datum/round_event_control/crystalline_reentry/admin_setup() if(!check_rights(R_FUN)) @@ -13,8 +14,8 @@ special_target = get_turf(usr) /datum/round_event/crystalline_reentry - announceWhen = 0 - startWhen = 10 + announce_when = 0 + start_when = 10 fakeable = FALSE /datum/round_event/crystalline_reentry/announce(fake) @@ -34,6 +35,7 @@ min_players = 35 max_occurrences = 0 //This is only an admin spawn. Ergo, wrath of the gods. var/atom/special_target + category = EVENT_CATEGORY_SPACE /datum/round_event_control/crystalline_wave/admin_setup() if(!check_rights(R_FUN)) @@ -47,9 +49,9 @@ message_admins("A crystalline asteroid wave has been triggered. Maybe you should add some music for the players? Consider this random selection: [randselect]") /datum/round_event/crystalline_wave - announceWhen = 0 - startWhen = 15 - endWhen = 60 //45 seconds of pain + announce_when = 0 + start_when = 15 + end_when = 60 //45 seconds of pain fakeable = FALSE /datum/round_event/crystalline_wave/announce(fake) diff --git a/modular_splurt/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/modular_splurt/code/modules/food_and_drinks/drinks/drinks/bottle.dm index 253eb2d300..436ab349f3 100644 --- a/modular_splurt/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/modular_splurt/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -2,14 +2,12 @@ /obj/item/reagent_containers/food/drinks/bottle/bitters name = "Andromeda Bitters" desc = "An aromatic addition to any drink. Made in New Trinidad, now and forever." - icon = 'modular_splurt/icons/obj/drinks.dmi' icon_state = "bitters_bottle" list_reagents = list(/datum/reagent/consumable/ethanol/bitters = 30) /obj/item/reagent_containers/food/drinks/bottle/curacao name = "Beekhof Blauw Curaçao" desc = "Still produced on the island of Curaçao, after all these years." - icon = 'modular_splurt/icons/obj/drinks.dmi' icon_state = "curacao_bottle" volume = 100 list_reagents = list(/datum/reagent/consumable/ethanol/curacao = 100) @@ -17,7 +15,6 @@ /obj/item/reagent_containers/food/drinks/bottle/navy_rum name = "Pride of the Union Navy-Strength Rum" desc = "Ironically named, given it's made in Bermuda." - icon = 'modular_splurt/icons/obj/drinks.dmi' icon_state = "navy_rum_bottle" volume = 100 list_reagents = list(/datum/reagent/consumable/ethanol/navy_rum = 100) diff --git a/modular_splurt/code/modules/food_and_drinks/recipes/drink_recipes.dm b/modular_splurt/code/modules/food_and_drinks/recipes/drink_recipes.dm index a587e9fc71..c388d8fe3c 100644 --- a/modular_splurt/code/modules/food_and_drinks/recipes/drink_recipes.dm +++ b/modular_splurt/code/modules/food_and_drinks/recipes/drink_recipes.dm @@ -189,3 +189,104 @@ /datum/reagent/consumable/ethanol/moonshine = 2, /datum/reagent/consumable/ethanol/brave_bull = 1 ) + +//Milkshakes +/datum/chemical_reaction/milkshake_base + name = "Plain Milkshake" + id = /datum/reagent/consumable/milkshake_base + results = list(/datum/reagent/consumable/milkshake_base = 3) + required_reagents = list( + /datum/reagent/consumable/milk = 1, + /datum/reagent/consumable/ice = 1, + /datum/reagent/consumable/cream =1 + ) + +/datum/chemical_reaction/milkshake_vanilla + name = "Vanilla Milkshake" + id = /datum/reagent/consumable/milkshake_vanilla + results = list(/datum/reagent/consumable/milkshake_vanilla = 2) + required_reagents = list( + /datum/reagent/consumable/milkshake_base =1, + /datum/reagent/consumable/vanilla =1 + ) + +/datum/chemical_reaction/milkshake_choc + name = "Chocolate Milkshake" + id = /datum/reagent/consumable/milkshake_choc + results = list(/datum/reagent/consumable/milkshake_choc = 2) + required_reagents = list( + /datum/reagent/consumable/milkshake_base = 1, + /datum/reagent/consumable/coco = 1 + ) + +/datum/chemical_reaction/milkshake_strawberry + name = "Strawberry Milkshake" + id = /datum/reagent/consumable/milkshake_strawberry + results = list(/datum/reagent/consumable/milkshake_strawberry = 2) + required_reagents = list( + /datum/reagent/consumable/milkshake_base = 1, + /datum/reagent/consumable/strawberryjuice = 1 + ) + +/datum/chemical_reaction/milkshake_banana + name = "Banana Milkshake" + id = /datum/reagent/consumable/milkshake_banana + results = list(/datum/reagent/consumable/milkshake_banana = 2) + required_reagents = list( + /datum/reagent/consumable/milkshake_base = 1, + /datum/reagent/consumable/banana = 1 + ) + +/datum/chemical_reaction/milkshake_berry + name = "Berry Milkshake" + id = /datum/reagent/consumable/milkshake_berry + results = list(/datum/reagent/consumable/milkshake_berry = 2) + required_reagents = list( + /datum/reagent/consumable/milkshake_base = 1, + /datum/reagent/consumable/berryjuice = 1 + ) + +/datum/chemical_reaction/milkshake_cola + name = "Cola Milkshake" + id = /datum/reagent/consumable/milkshake_cola + results = list(/datum/reagent/consumable/milkshake_cola = 2) + required_reagents = list( + /datum/reagent/consumable/milkshake_base = 1, + /datum/reagent/consumable/space_cola = 1 + ) + +/datum/chemical_reaction/milkshake_gibb + name = "Dr. Gibb Milkshake" + id = /datum/reagent/consumable/milkshake_gibb + results = list(/datum/reagent/consumable/milkshake_gibb = 2) + required_reagents = list( + /datum/reagent/consumable/milkshake_base = 1, + /datum/reagent/consumable/dr_gibb = 1 + ) + +/datum/chemical_reaction/milkshake_peach + name = "Peach Milkshake" + id = /datum/reagent/consumable/milkshake_peach + results = list(/datum/reagent/consumable/milkshake_peach = 2) + required_reagents = list( + /datum/reagent/consumable/milkshake_base = 1, + /datum/reagent/consumable/peachjuice = 1 + ) + +/datum/chemical_reaction/milkshake_pineapple + name = "Pineapple Milkshake" + id = /datum/reagent/consumable/milkshake_pineapple + results = list(/datum/reagent/consumable/milkshake_pineapple = 2) + required_reagents = list( + /datum/reagent/consumable/milkshake_base = 1, + /datum/reagent/consumable/pineapplejuice = 1 + ) + +/datum/chemical_reaction/milkshake_melon + name = "Watermelon Milkshake" + id = /datum/reagent/consumable/milkshake_melon + results = list(/datum/reagent/consumable/milkshake_melon = 2) + required_reagents = list( + /datum/reagent/consumable/milkshake_base = 1, + /datum/reagent/consumable/watermelonjuice = 1 + ) diff --git a/modular_splurt/code/modules/keybindings/keybind/communication.dm b/modular_splurt/code/modules/keybindings/keybind/communication.dm new file mode 100644 index 0000000000..3aa6aeca1a --- /dev/null +++ b/modular_splurt/code/modules/keybindings/keybind/communication.dm @@ -0,0 +1,13 @@ +/datum/keybinding/client/communication/subtle + hotkey_keys = list("Ctrl5") + +/datum/keybinding/client/communication/subtle_indicator + hotkey_keys = list("5") + name = "Subtle_Indicator" + full_name = "Subtle Emote (with indicator)" + clientside = "subtle-indicator" + +/datum/keybinding/client/communication/subtle_indicator/down(client/user) + var/mob/living/mob_keybound = user.mob + mob_keybound.subtle_indicator() + return TRUE diff --git a/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/body_markings.dm b/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/body_markings.dm index ac3b448ca1..1d38f77db0 100644 --- a/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/body_markings.dm +++ b/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/body_markings.dm @@ -113,6 +113,18 @@ icon_state = "sloog" covered_limbs = list("Chest" = MATRIX_RED_GREEN) +/datum/sprite_accessory/mam_body_markings/pilot + name = "Pilot" + icon = 'modular_splurt/icons/mob/mam_markings.dmi' + icon_state = "pilot" + covered_limbs = list("Head" = MATRIX_ALL) + +/datum/sprite_accessory/mam_body_markings/pilot_jaw + name = "Pilot Jaw" + icon = 'modular_splurt/icons/mob/mam_markings.dmi' + icon_state = "pilotjaw" + covered_limbs = list("Head" = MATRIX_RED_BLUE) + /****************************************** ************* Insect Markings ************* *******************************************/ diff --git a/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/snouts.dm b/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/snouts.dm index 6b87b38f09..549793e24f 100644 --- a/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/snouts.dm +++ b/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/snouts.dm @@ -221,6 +221,12 @@ icon = 'modular_splurt/icons/mob/mam_snouts.dmi' color_src = MUTCOLORS +/datum/sprite_accessory/snouts/mam_snouts/corvidbeak + name = "Corvid Beak" + icon_state = "corvidbeak" + icon = 'modular_splurt/icons/mob/mam_snouts.dmi' + matrixed_sections = MATRIX_GREEN + /datum/sprite_accessory/snouts/mam_snouts/deoxys name = "Deoxys" icon_state = "deoxys" diff --git a/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/tails.dm b/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/tails.dm index f08fba7584..46addc57fc 100644 --- a/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/tails.dm +++ b/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/tails.dm @@ -235,6 +235,38 @@ icon_state = "fluffy" color_src = MUTCOLORS +/datum/sprite_accessory/tails/mam_tails/nightstalker + name = "Nightstalker" + icon_state = "nightstalker" + color_src = MATRIXED + icon = 'modular_splurt/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED_GREEN + +/datum/sprite_accessory/tails_animated/mam_tails_animated/nightstalker + name = "Nightstalker" + icon_state = "nightstalker" + color_src = MATRIXED + icon = 'modular_splurt/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED_GREEN + +/datum/sprite_accessory/tails/mam_tails/snakelarge + name = "Snake Tail (Large)" + icon_state = "snakelarge" + color_src = MATRIXED + icon = 'modular_splurt/icons/mob/64_mam_tails.dmi' + dimension_x = 64 + center = TRUE + matrixed_sections = MATRIX_RED_GREEN + +/datum/sprite_accessory/tails_animated/mam_tails_animated/snakelarge + name = "Snake Tail (Large)" + icon_state = "snakelarge" + color_src = MATRIXED + icon = 'modular_splurt/icons/mob/64_mam_tails.dmi' + dimension_x = 64 + center = TRUE + matrixed_sections = MATRIX_RED_GREEN + //Lizard tails /datum/sprite_accessory/tails/lizard/tailmaw name = "Tailmaw" @@ -278,6 +310,20 @@ icon = 'modular_splurt/icons/mob/mam_tails.dmi' matrixed_sections = MATRIX_ALL +/datum/sprite_accessory/tails/lizard/nightstalker + name = "Nightstalker" + icon_state = "nightstalker" + color_src = MATRIXED + icon = 'modular_splurt/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED_GREEN + +/datum/sprite_accessory/tails_animated/lizard/nightstalker + name = "Nightstalker" + icon_state = "nightstalker" + color_src = MATRIXED + icon = 'modular_splurt/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED_GREEN + //Human tails /datum/sprite_accessory/tails/human/deer name = "Deer" @@ -358,3 +404,17 @@ dimension_x = 64 center = TRUE color_src = MUTCOLORS + +/datum/sprite_accessory/tails/human/nightstalker + name = "Nightstalker" + icon_state = "nightstalker" + color_src = MATRIXED + icon = 'modular_splurt/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED_GREEN + +/datum/sprite_accessory/tails_animated/human/nightstalker + name = "Nightstalker" + icon_state = "nightstalker" + color_src = MATRIXED + icon = 'modular_splurt/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED_GREEN diff --git a/modular_splurt/code/modules/mob/living/carbon/human/emote.dm b/modular_splurt/code/modules/mob/living/carbon/human/emote.dm new file mode 100644 index 0000000000..8877e15eab --- /dev/null +++ b/modular_splurt/code/modules/mob/living/carbon/human/emote.dm @@ -0,0 +1,12 @@ +/datum/emote/sound/human/huh + key = "huh" + key_third_person = "huh's" + message = "seems confused." + sound = 'modular_splurt/sound/voice/huh.ogg' + +/datum/emote/sound/human/whine + key = "whine" + key_third_person = "whines" + message = "whines." + sound = 'modular_splurt/sound/voice/whine.ogg' + diff --git a/modular_splurt/code/modules/mob/living/carbon/human/species_types/zombies2.dm b/modular_splurt/code/modules/mob/living/carbon/human/species_types/zombies2.dm index 53e887e98c..e812380fbc 100644 --- a/modular_splurt/code/modules/mob/living/carbon/human/species_types/zombies2.dm +++ b/modular_splurt/code/modules/mob/living/carbon/human/species_types/zombies2.dm @@ -1,3 +1,4 @@ +/* //striked out for now because I dont know what the fuck was planned here but this is breaking blood regain. /mob/living/carbon/human/handle_blood() if(iszombie(src)) //We're basically pudding pops. return @@ -8,7 +9,7 @@ var/obj/item/organ/heart/decayed_heart/decaying = getorgan(/obj/item/organ/heart/decayed_heart) if(decaying) . += "Current blood level: [blood_volume]/[BLOOD_VOLUME_MAXIMUM]." - + */ /datum/species/mammal/undead // takes 30% more damage but doesn't crit id = SPECIES_UMAMMAL diff --git a/modular_splurt/code/modules/mob/living/silicon/robot/robot.dm b/modular_splurt/code/modules/mob/living/silicon/robot/robot.dm index 7532f3a8f7..fa00e0ff44 100644 --- a/modular_splurt/code/modules/mob/living/silicon/robot/robot.dm +++ b/modular_splurt/code/modules/mob/living/silicon/robot/robot.dm @@ -41,3 +41,15 @@ laws = new /datum/ai_laws/slaver_override laws.associate(src) update_icons() + +/mob/living/silicon/robot/Initialize(mapload) + .=..() + AddComponent(/datum/component/personal_crafting) + + +/mob/living/silicon/robot/pick_module() + .=..() + var/datum/hud/R = hud_used + var/atom/movable/screen/craft/C = locate() in R.static_inventory + C.icon = 'icons/mob/screen_midnight.dmi' + C.screen_loc = "CENTER+5:5,SOUTH+1:5" diff --git a/modular_splurt/code/modules/mob/living/silicon/robot/robot_modules.dm b/modular_splurt/code/modules/mob/living/silicon/robot/robot_modules.dm index 16ddbdc8f5..710f4d4745 100644 --- a/modular_splurt/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/modular_splurt/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -265,7 +265,13 @@ var/list/extra = list( /obj/item/dogborg/jaws/small, /obj/item/analyzer/nose, - /obj/item/soap/tongue/scrubpup + /obj/item/soap/tongue/scrubpup, + /obj/item/gripper/service, + /obj/item/kitchen/rollingpin, + /obj/item/kitchen/unrollingpin, + /obj/item/kitchen/knife/butcher, + /obj/item/kitchen/efink, + /obj/item/kitchen/knife ) LAZYADD(basic_modules, extra) . = ..() diff --git a/modular_splurt/code/modules/mob/say_vr.dm b/modular_splurt/code/modules/mob/say_vr.dm index 56be623e0f..7cb5e02a6f 100644 --- a/modular_splurt/code/modules/mob/say_vr.dm +++ b/modular_splurt/code/modules/mob/say_vr.dm @@ -48,3 +48,30 @@ return message = trim(html_encode(message), MAX_MESSAGE_LEN) emote("narrate", message=message) + +/datum/emote/living/subtle/subtle_indicator + key = "subtle-indicator" + key_third_person = "subtle-indicator" + +/mob/living/verb/subtle_indicator() + // Set data + set name = "Subtle (Indicator)" + set category = "IC" + + // Check if say is disabled + if(GLOB.say_disabled) + // Warn user and return + to_chat(usr, span_danger("Speech is currently admin-disabled.")) + return + + // Display typing indicator + display_typing_indicator() + + // Prompt user for text input + var/input_message = input(usr, "What would you like to subtly emote, with a typing indicator?", "Input subtle emote") as message|null + + // Remove typing indicator + clear_typing_indicator() + + // Run subtle emote with input + usr.emote("subtle", message = input_message) diff --git a/modular_splurt/code/modules/mob/splurt_emotes.dm b/modular_splurt/code/modules/mob/splurt_emotes.dm index e6af828c5f..7dc25f9c5d 100644 --- a/modular_splurt/code/modules/mob/splurt_emotes.dm +++ b/modular_splurt/code/modules/mob/splurt_emotes.dm @@ -212,8 +212,8 @@ /datum/emote/living/bruh key = "bruh" - key_third_person = "thinks this is a bruh moment" - message = "thinks this is a bruh moment" + key_third_person = "bruhs" + message = "thinks this is a bruh moment." emote_type = EMOTE_AUDIBLE muzzle_ignore = FALSE restraint_check = FALSE @@ -378,7 +378,7 @@ /datum/emote/living/swaos key = "swaos" key_third_person = "swaos" - message = "mutters swaos" + message = "mutters swaos." emote_type = EMOTE_AUDIBLE muzzle_ignore = FALSE @@ -411,7 +411,7 @@ /datum/emote/living/eyebrow3 key = "eyebrow3" key_third_person = "eyebrows3" - message = "raises an eyebrow quizzaciously." + message = "raises an eyebrow quizzaciously." /datum/emote/living/eyebrow3/run_emote(mob/user, params, type_override, intentional) if(!(. = ..())) @@ -467,7 +467,7 @@ /datum/emote/living/laugh4 key = "laugh4" key_third_person = "laughs4" - message = "burst out a laugh." + message = "burst into laughter!" emote_type = EMOTE_AUDIBLE muzzle_ignore = FALSE @@ -497,7 +497,7 @@ /datum/emote/living/laugh6 key = "laugh6" key_third_person = "laughs6" - message = "sounds like a tea kettle." + message = "laughs like a kettle!" emote_type = EMOTE_AUDIBLE muzzle_ignore = FALSE @@ -553,7 +553,7 @@ /datum/emote/living/spoonful key = "spoonful" key_third_person = "spoonfuls" - message = "draws a comically large spoon." + message = "asks for a spoonful." emote_type = EMOTE_AUDIBLE muzzle_ignore = TRUE @@ -583,7 +583,7 @@ /datum/emote/living/whatthehell key = "wth" key_third_person = "wths" - message = "condemns the abysses of hell." + message = "condemns the abysses of hell!" emote_type = EMOTE_AUDIBLE muzzle_ignore = TRUE @@ -637,7 +637,7 @@ /datum/emote/living/illuminati key = "illuminati" key_third_person = "illuminatis" - message = "emits some X-files vibe" + message = "exudes a mysterious aura!" /datum/emote/living/illuminati/run_emote(mob/user, params, type_override, intentional) if(!(. = ..())) @@ -650,7 +650,7 @@ /datum/emote/living/bonerif key = "bonerif" key_third_person = "bonerifs" - message = "riffs" + message = "riffs!" /datum/emote/living/bonerif/run_emote(mob/user, params, type_override, intentional) if(!(. = ..())) @@ -679,7 +679,7 @@ /datum/emote/living/choir key = "choir" key_third_person = "choirs" - message = "let out a choir." + message = "let out a choir!" emote_type = EMOTE_AUDIBLE muzzle_ignore = FALSE @@ -694,7 +694,7 @@ /datum/emote/living/sicko key = "sicko" key_third_person = "sickos" - message = "briefly goes sicko mode." + message = "briefly goes sicko mode!" emote_type = EMOTE_AUDIBLE muzzle_ignore = FALSE @@ -709,7 +709,7 @@ /datum/emote/living/chill key = "chill" key_third_person = "chills" - message = "felt a chill running down their spine..." + message = "feels a chill running down their spine..." /datum/emote/living/chill/run_emote(mob/user, params, type_override, intentional) if(!(. = ..())) @@ -766,7 +766,7 @@ /datum/emote/living/snore/snore2 key = "snore2" - key_third_person = "snores" + key_third_person = "snores2" message = "lets out an earthshaking snore" /datum/emote/living/snore/snore2/run_emote(mob/user, params, type_override, intentional) @@ -836,7 +836,7 @@ /datum/emote/living/ara_ara key = "ara" key_third_person = "aras" - message = "seems sultrily surprised~" + message = "coos with sultry surprise~..." emote_type = EMOTE_AUDIBLE muzzle_ignore = FALSE var/voicesound = 'modular_splurt/sound/voice/ara-ara.ogg' @@ -857,7 +857,7 @@ /datum/emote/living/missouri key = "missouri" key_third_person = "missouris" - message = "appears to believe %THEYRE in Missouri" + message = "appears to believe %THEYRE in Missouri." emote_type = EMOTE_AUDIBLE muzzle_ignore = FALSE diff --git a/modular_splurt/code/modules/photography/photos/album.dm b/modular_splurt/code/modules/photography/photos/album.dm new file mode 100644 index 0000000000..f7795a670e --- /dev/null +++ b/modular_splurt/code/modules/photography/photos/album.dm @@ -0,0 +1,27 @@ +/obj/item/storage/photo_album + desc = "A big book used to store photos and mementos." + item_state = "album" + lefthand_file = 'modular_splurt/icons/mob/inhands/misc/books_lefthand.dmi' + righthand_file = 'modular_splurt/icons/mob/inhands/misc/books_righthand.dmi' + w_class = WEIGHT_CLASS_SMALL + +/obj/item/storage/photo_album/HoS + name = "photo album (Head of Security)" + +/obj/item/storage/photo_album/RD + name = "photo album (Research Director)" + +/obj/item/storage/photo_album/HoP + name = "photo album (Head of Personnel)" + +/obj/item/storage/photo_album/Captain + name = "photo album (Captain)" + +/obj/item/storage/photo_album/CMO + name = "photo album (Chief Medical Officer)" + +/obj/item/storage/photo_album/QM + name = "photo album (Quartermaster)" + +/obj/item/storage/photo_album/CE + name = "photo album (Chief Engineer)" diff --git a/modular_splurt/code/modules/photography/photos/photo.dm b/modular_splurt/code/modules/photography/photos/photo.dm new file mode 100644 index 0000000000..3eb0f70752 --- /dev/null +++ b/modular_splurt/code/modules/photography/photos/photo.dm @@ -0,0 +1,3 @@ +/obj/item/photo/old + icon = 'modular_splurt/icons/obj/items_and_weapons.dmi' + icon_state = "photo_old" diff --git a/modular_splurt/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/modular_splurt/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index a0e7dfbe58..0b7fc6f662 100644 --- a/modular_splurt/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/modular_splurt/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -16,6 +16,18 @@ // Praise the funny BYOND dots . = ..() + // Check for client + if(C.client) + // Check target pref for ERP + if(C.client?.prefs.erppref == "No") + // Return without triggering + return + + // Check target pref for aphrodisiacs + if(C.client?.prefs.cit_toggles & NO_APHRO) + // Return without triggering + return + // Perform drink effect C.clothing_burst(C) @@ -194,7 +206,6 @@ color = "#1a5fa1" quality = DRINK_NICE taste_description = "blue orange" - glass_icon = 'modular_splurt/icons/obj/drinks.dmi' glass_icon_state = "curacao" glass_name = "glass of curaçao" glass_desc = "It's blue, da ba dee." @@ -217,7 +228,6 @@ color = "#1c0000" quality = DRINK_NICE taste_description = "spiced alcohol" - glass_icon = 'modular_splurt/icons/obj/drinks.dmi' glass_icon_state = "bitters" glass_name = "glass of bitters" glass_desc = "Typically you'd want to mix this with something- but you do you." @@ -229,7 +239,6 @@ color = "#1F0001" quality = DRINK_VERYGOOD taste_description = "haughty arrogance" - glass_icon = 'modular_splurt/icons/obj/drinks.dmi' glass_icon_state = "admiralty" glass_name = "Admiralty" glass_desc = "Hail to the Admiral, for he brings fair tidings, and rum too." @@ -241,7 +250,6 @@ color = "#8c5046" quality = DRINK_GOOD taste_description = "ginger and rum" - glass_icon = 'modular_splurt/icons/obj/drinks.dmi' glass_icon_state = "dark_and_stormy" glass_name = "Dark and Stormy" glass_desc = "Thunder and lightning, very very frightening." @@ -253,7 +261,6 @@ color = "#c4b35c" quality = DRINK_VERYGOOD taste_description = "rum and spices" - glass_icon = 'modular_splurt/icons/obj/drinks.dmi' glass_icon_state = "long_john_silver" glass_name = "Long John Silver" glass_desc = "Named for a famous pirate, who may or may not have been fictional. But hey, why let the truth get in the way of a good yarn?" @@ -265,7 +272,6 @@ color = "#003153" quality = DRINK_VERYGOOD taste_description = "companionship" - glass_icon = 'modular_splurt/icons/obj/drinks.dmi' glass_icon_state = "long_haul" glass_name = "Long Haul" glass_desc = "A perfect companion for a lonely long haul flight." @@ -277,7 +283,6 @@ color = "#b4abd0" quality = DRINK_FANTASTIC taste_description = "salt and spice" - glass_icon = 'modular_splurt/icons/obj/drinks.dmi' glass_icon_state = "salt_and_swell" glass_name = "Salt and Swell" glass_desc = "Ah, I do like to be beside the seaside." @@ -289,7 +294,6 @@ color = "#b4abd0" quality = DRINK_VERYGOOD taste_description = "spicy sour cheesy yoghurt" - glass_icon = 'modular_splurt/icons/obj/drinks.dmi' glass_icon_state = "tich_toch" glass_name = "Tich Toch" glass_desc = "Oh god." @@ -301,7 +305,6 @@ color = "#F4EFE2" quality = DRINK_NICE taste_description = "sour cheesy yoghurt" - glass_icon = 'modular_splurt/icons/obj/drinks.dmi' glass_icon_state = "tiltaellen" glass_name = "glass of tiltällen" glass_desc = "Eww... it's curdled." @@ -313,7 +316,6 @@ color = "#00bfa3" quality = DRINK_VERYGOOD taste_description = "the tropics" - glass_icon = 'modular_splurt/icons/obj/drinks.dmi' glass_icon_state = "tropical_storm" glass_name = "Tropical Storm" glass_desc = "Less destructive than the real thing." diff --git a/modular_splurt/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/modular_splurt/code/modules/reagents/chemistry/reagents/drink_reagents.dm index 3b8aad9ea7..46ea1e07c5 100644 --- a/modular_splurt/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/modular_splurt/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -50,3 +50,118 @@ glass_name = "glass of töchtaüse syrup" glass_desc = "Not for drinking on its own." +/datum/reagent/consumable/milkshake_base + name = "Milkshake" + description = "A basic milkshake. Could use something else?" + color = "#FFFDD0" + nutriment_factor = 1 + taste_description = "thick, creamy, and sweet" + glass_icon_state = "vanillashake" + glass_name = "glass of plain milkshake" + glass_desc = "A glass of plain milkshake, a bit boring, but still good." + +/datum/reagent/consumable/milkshake_vanilla + name = "Vanilla Milkshake" + description = "A vanilla milkshake. Basic, but delicious." + color = "#FFFDD0" + nutriment_factor = 1 + taste_description = "thick, creamy, and sweet" + glass_icon_state = "vanillashake" + glass_name = "glass of vanilla milkshake" + glass_desc = "A glass of vanilla milkshake, a bit boring, but still good." + +/datum/reagent/consumable/milkshake_choc + name = "Chocolate Milkshake" + description = "A delicious Chocolate Milkshake" + color = "#7B3F00" + nutriment_factor = 1 + taste_description = "sweet, creamy chocolate" + glass_icon_state = "choccyshake" + glass_name = "glass of chocolate milkshake" + glass_desc = "A glass of chocolate milkshake, what a treat!" + +/datum/reagent/consumable/milkshake_strawberry + name = "Strawberry Milkshake" + description = "Frozen Strawberry Milk!" + color = "#F4E1EA" + nutriment_factor = 1 + taste_description = "summer memories" + glass_icon_state = "strawberryshake" + glass_name = "glass of strawberry milkshake" + glass_desc = "A glass of sweet, pink Strawberry Shake" + +/datum/reagent/consumable/milkshake_banana + name = "Banana Milkshake" + description = "Deliciously tricky!" + color = "#FFE135" + nutriment_factor = 1 + taste_description = "funny pranks and clowning around" + glass_icon_state = "bananashake" + glass_name = "glass of Banana Milkshake" + glass_desc = "A banana milkshake! Honk!" + +/datum/reagent/consumable/milkshake_berry + name = "Wild Berry Milkshake" + description = "A summer favorite!" + color = "#b17179" + nutriment_factor = 1 + taste_description = "warm summer days" + glass_icon = 'modular_splurt/icons/obj/drinks.dmi' + glass_icon_state = "berryshake" + glass_name = "glass of Wild Berry Milkshake" + glass_desc = "A berry milkshake" + +/datum/reagent/consumable/milkshake_cola + name = "Cola Milkshake" + description = "Sweet milkshake mixed with cola" + color = "#3c3024" + nutriment_factor = 1 + taste_description = "cola and milkshake" + glass_icon = 'modular_splurt/icons/obj/drinks.dmi' + glass_icon_state = "colashake" + glass_name = "glass of Cola Milkshake" + glass_desc = "A cola milkshake, it's like a ticker float!" + +/datum/reagent/consumable/milkshake_gibb + name = "Dr. Gibb Milkshake" + description = "Sweet milkshake mixed with Dr. Gibb" + color = "#5e312b" + nutriment_factor = 1 + taste_description = "cola and milkshake" + glass_icon = 'modular_splurt/icons/obj/drinks.dmi' + glass_icon_state = "gibbshake" + glass_name = "glass of Gibb Milkshake" + glass_desc = "A Dr. Gibb milkshake, it's like a ticker float!" + +/datum/reagent/consumable/milkshake_peach + name = "Peach Milkshake" + description = "A tasty Peach Milkshake" + color = "#5e312b" + nutriment_factor = 1 + taste_description = "peaches and cream" + glass_icon = 'modular_splurt/icons/obj/drinks.dmi' + glass_icon_state = "peachshake" + glass_name = "glass of Peace Milkshake" + glass_desc = "Peaches and Cream, Peaches and Cream!" + +/datum/reagent/consumable/milkshake_pineapple + name = "Pineapple Milkshake" + description = "A tangy Pineapple Milkshake" + color = "#feea63" + nutriment_factor = 1 + taste_description = "citrus and cream" + glass_icon = 'modular_splurt/icons/obj/drinks.dmi' + glass_icon_state = "pineappleshake" + glass_name = "glass of Pineapple Milkshake" + glass_desc = "A Pineapple milkshake, a bit sweet and a bit sour, but all delicious!" + +/datum/reagent/consumable/milkshake_melon + name = "Watermelon Milkshake" + description = "Delicous Watermelon Milkshake" + color = "#E37383" + nutriment_factor = 1 + taste_description = "warm sun and sweet cream" + glass_icon = 'modular_splurt/icons/obj/drinks.dmi' + glass_icon_state = "melonshake" + glass_name = "glass of Watermelon Milkshake" + glass_desc = "A Watermelon milkshake, it's like summer all over again!" diff --git a/modular_splurt/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/modular_splurt/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 380c64e049..9a9ef48727 100644 --- a/modular_splurt/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/modular_splurt/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -1,10 +1,17 @@ -//Main code edits -/datum/reagent/drug/aphrodisiacplus/overdose_process(mob/living/M) - if(M && M.client?.prefs.arousable && !(M.client?.prefs.cit_toggles & NO_APHRO)) - if(!HAS_TRAIT(M, TRAIT_IN_HEAT)) - to_chat(M, span_userlove("Your need for sex is overpowering!")) - M.log_message("Made In Heat by hexacrocin.", LOG_EMOTE) - ADD_TRAIT(M, TRAIT_IN_HEAT, APHRO_TRAIT) +/datum/reagent/drug/aphrodisiacplus/overdose_start(mob/living/M) + // Check for pre-existing heat trait + if(!HAS_TRAIT(M, TRAIT_ESTROUS_ACTIVE)) + // Check client preferences + if(M && M.client?.prefs.arousable && !(M.client?.prefs.cit_toggles & NO_APHRO)) + // Add quirk + M.add_quirk(/datum/quirk/estrous_active, APHRO_TRAIT) + + // Chat message is handled by the quirk + + // Log interaction + M.log_message("Given the In Estrous quirk by hexacrocin overdose.", LOG_EMOTE) + + // Return normally . = ..() //Own stuff diff --git a/modular_splurt/code/modules/reagents/chemistry/reagents/other_reagents.dm b/modular_splurt/code/modules/reagents/chemistry/reagents/other_reagents.dm index 74d6eb5142..e327fc1409 100644 --- a/modular_splurt/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/modular_splurt/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -28,16 +28,18 @@ /datum/reagent/blood/on_mob_life(mob/living/carbon/C) . = ..() - if(HAS_TRAIT(C,BLOODFLEDGE)) - C.adjust_nutrition(6) //3/4ed this, felt it was a bit too much - C.adjust_disgust(-3) //makes the churches effects easily negated + if(HAS_TRAIT(C,TRAIT_BLOODFLEDGE)) + C.adjust_nutrition(6) + C.adjust_disgust(-2) // Negates the chapel's disgust effect + C.adjustStaminaLoss(1) // Mitigates the chapel's stamina effect /datum/reagent/water/holywater/on_mob_life(mob/living/carbon/M) . = ..() - //makes holy water slightly disgusting and hungering for vampires - if(HAS_TRAIT(M,BLOODFLEDGE)) - M.adjust_disgust(1) - M.adjust_nutrition(-0.1) + // Makes holy water disgusting and hungering for bloodfledges + // Directly antithetic to the effects of blood + if(HAS_TRAIT(M,TRAIT_BLOODFLEDGE)) + M.adjust_disgust(2) + M.adjust_nutrition(-6) // Cursed blood effect moved here if(HAS_TRAIT(M, TRAIT_CURSED_BLOOD)) diff --git a/modular_splurt/code/modules/reagents/reagent_containers/borghydro.dm b/modular_splurt/code/modules/reagents/reagent_containers/borghydro.dm new file mode 100644 index 0000000000..3c3e062b0e --- /dev/null +++ b/modular_splurt/code/modules/reagents/reagent_containers/borghydro.dm @@ -0,0 +1,12 @@ +/obj/item/reagent_containers/borghypo/borgshaker/beershaker/Initialize() + var/list/extra_reagents = list( + /datum/reagent/consumable/ethanol/amaretto, + /datum/reagent/consumable/ethanol/applejack, + /datum/reagent/consumable/ethanol/curacao, + /datum/reagent/consumable/ethanol/hcider, + /datum/reagent/consumable/ethanol/navy_rum, + /datum/reagent/consumable/ethanol/sake, + /datum/reagent/consumable/ethanol + ) + LAZYADD(reagent_ids, extra_reagents) + . = ..() diff --git a/modular_splurt/code/modules/research/designs/misc_designs.dm b/modular_splurt/code/modules/research/designs/misc_designs.dm new file mode 100644 index 0000000000..e6105fd3f3 --- /dev/null +++ b/modular_splurt/code/modules/research/designs/misc_designs.dm @@ -0,0 +1,2 @@ +/datum/design/light_replacer_blue/New() + departmental_flags |= DEPARTMENTAL_FLAG_SCIENCE diff --git a/modular_splurt/code/modules/research/techweb/nodes/misc_nodes.dm b/modular_splurt/code/modules/research/techweb/nodes/biotech_nodes.dm similarity index 51% rename from modular_splurt/code/modules/research/techweb/nodes/misc_nodes.dm rename to modular_splurt/code/modules/research/techweb/nodes/biotech_nodes.dm index 7db0714874..ff81163de3 100644 --- a/modular_splurt/code/modules/research/techweb/nodes/misc_nodes.dm +++ b/modular_splurt/code/modules/research/techweb/nodes/biotech_nodes.dm @@ -1,3 +1,3 @@ -/datum/techweb_node/datatheory/New() +/datum/techweb_node/biotech/New() design_ids += "sex_research" . = ..() diff --git a/modular_splurt/code/modules/research/techweb/nodes/robotic_nodes.dm b/modular_splurt/code/modules/research/techweb/nodes/robotic_nodes.dm index f90fac955d..9256485813 100644 --- a/modular_splurt/code/modules/research/techweb/nodes/robotic_nodes.dm +++ b/modular_splurt/code/modules/research/techweb/nodes/robotic_nodes.dm @@ -1,7 +1,7 @@ /datum/techweb_node/neural_programming design_ids = list("impant_radio") -/datum/techweb_node/ai/Initialize() +/datum/techweb_node/ai/New() var/extra_designs = list( "slut_module", "shebang_module", diff --git a/modular_splurt/code/modules/surgery/organs/augments_arms.dm b/modular_splurt/code/modules/surgery/organs/augments_arms.dm index d49fe172f5..aa7db49438 100644 --- a/modular_splurt/code/modules/surgery/organs/augments_arms.dm +++ b/modular_splurt/code/modules/surgery/organs/augments_arms.dm @@ -24,3 +24,17 @@ w_class = WEIGHT_CLASS_BULKY sharpness = SHARP_POINTY attack_verb = list("slashed", "cut") + +// Synth power cord interaction override +/obj/item/apc_powercord/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + // Define user + var/mob/living/carbon/human/cord_user = user + + // Check for bloodfledge + if(HAS_TRAIT(cord_user, TRAIT_BLOODFLEDGE)) + // Warn user and return + to_chat(cord_user, span_warning("You try to siphon energy from [target], but a sanguine force prevents you from absorbing any charge!")) + return + + // Return normally + . = ..() diff --git a/modular_splurt/code/modules/uplink/uplink_items/uplink_devices.dm b/modular_splurt/code/modules/uplink/uplink_items/uplink_devices.dm new file mode 100644 index 0000000000..fe3de42d03 --- /dev/null +++ b/modular_splurt/code/modules/uplink/uplink_items/uplink_devices.dm @@ -0,0 +1,6 @@ +/datum/uplink_item/device_tools/syndicate_ball + name = "Syndicate Beach Ball" + item = /obj/item/toy/beach_ball/syndicate + desc = "A beach ball, it reacts when a vibrator is inserted inside of it. Watch out!" + cost = 3 + diff --git a/modular_splurt/code/modules/vending/clothesmate.dm b/modular_splurt/code/modules/vending/clothesmate.dm index d7d67e4011..da97e25df6 100644 --- a/modular_splurt/code/modules/vending/clothesmate.dm +++ b/modular_splurt/code/modules/vending/clothesmate.dm @@ -16,7 +16,9 @@ /obj/item/clothing/under/officesexy = 3, /obj/item/clothing/suit/toggle/tunnelfox = 3, /obj/item/clothing/under/performer = 2, - /obj/item/clothing/under/bluedress = 3 + /obj/item/clothing/under/bluedress = 3, + /obj/item/clothing/under/misc/leia_outfit = 2, + /obj/item/clothing/under/performer/polychromic = 2 ) var/list/extra_contraband = list( /obj/item/clothing/under/rank/civilian/lawyer/galaxy_red = 3, diff --git a/modular_splurt/code/modules/vending/kinkmate.dm b/modular_splurt/code/modules/vending/kinkmate.dm index 45b0becd3b..bb14521e57 100644 --- a/modular_splurt/code/modules/vending/kinkmate.dm +++ b/modular_splurt/code/modules/vending/kinkmate.dm @@ -24,6 +24,7 @@ /obj/item/clothing/neck/syntech/collar = 4, /obj/item/storage/fancy/jellybean_pack = 5, /obj/item/storage/box/aphrodisiac_pump = 5, + /obj/item/storage/box/bulk_condoms = 10, /obj/item/strapon_strap = 5, /obj/item/restraints/bondage_rope = 5, /obj/item/clothing/under/domina = 5, @@ -31,7 +32,8 @@ /obj/item/storage/box/chastity_cage = 6, /obj/item/storage/box/chastity_cage/metal = 3, /obj/item/storage/box/chastity_cage/belt = 2, - /obj/item/clothing/shoes/invisiboots = 10 // Added here to go with the Gear Harness + /obj/item/clothing/shoes/invisiboots = 10, // Added here to go with the Gear Harness + /obj/item/clothing/shoes/highheel_sandals = 3 ) var/list/extra_contraband = list( //Lewd-Clothes diff --git a/modular_splurt/icons/misc/beach.dmi b/modular_splurt/icons/misc/beach.dmi new file mode 100644 index 0000000000..0bc186df19 Binary files /dev/null and b/modular_splurt/icons/misc/beach.dmi differ diff --git a/modular_splurt/icons/mob/64_mam_tails.dmi b/modular_splurt/icons/mob/64_mam_tails.dmi index 115d051436..b7f1ac3834 100644 Binary files a/modular_splurt/icons/mob/64_mam_tails.dmi and b/modular_splurt/icons/mob/64_mam_tails.dmi differ diff --git a/modular_splurt/icons/mob/clothing/32x48_head.dmi b/modular_splurt/icons/mob/clothing/32x48_head.dmi new file mode 100644 index 0000000000..d34f1f1e0c Binary files /dev/null and b/modular_splurt/icons/mob/clothing/32x48_head.dmi differ diff --git a/modular_splurt/icons/mob/clothing/shoes.dmi b/modular_splurt/icons/mob/clothing/shoes.dmi index 0956dfbdd1..005bdc7b7d 100644 Binary files a/modular_splurt/icons/mob/clothing/shoes.dmi and b/modular_splurt/icons/mob/clothing/shoes.dmi differ diff --git a/modular_splurt/icons/mob/clothing/shoes_digi.dmi b/modular_splurt/icons/mob/clothing/shoes_digi.dmi index a37e1178f1..755d9c92e9 100644 Binary files a/modular_splurt/icons/mob/clothing/shoes_digi.dmi and b/modular_splurt/icons/mob/clothing/shoes_digi.dmi differ diff --git a/modular_splurt/icons/mob/clothing/uniform.dmi b/modular_splurt/icons/mob/clothing/uniform.dmi index 1555bade4d..dccf18cc43 100644 Binary files a/modular_splurt/icons/mob/clothing/uniform.dmi and b/modular_splurt/icons/mob/clothing/uniform.dmi differ diff --git a/modular_splurt/icons/mob/clothing/uniform_digi.dmi b/modular_splurt/icons/mob/clothing/uniform_digi.dmi index ce963b6af7..951d678785 100644 Binary files a/modular_splurt/icons/mob/clothing/uniform_digi.dmi and b/modular_splurt/icons/mob/clothing/uniform_digi.dmi differ diff --git a/modular_splurt/icons/mob/inhands/misc/books_lefthand.dmi b/modular_splurt/icons/mob/inhands/misc/books_lefthand.dmi new file mode 100644 index 0000000000..cd59fe6d03 Binary files /dev/null and b/modular_splurt/icons/mob/inhands/misc/books_lefthand.dmi differ diff --git a/modular_splurt/icons/mob/inhands/misc/books_righthand.dmi b/modular_splurt/icons/mob/inhands/misc/books_righthand.dmi new file mode 100644 index 0000000000..a2fc3cc73b Binary files /dev/null and b/modular_splurt/icons/mob/inhands/misc/books_righthand.dmi differ diff --git a/modular_splurt/icons/mob/inhands/weapons/melee_lefthand.dmi b/modular_splurt/icons/mob/inhands/weapons/melee_lefthand.dmi index 93508f584a..751e41c260 100644 Binary files a/modular_splurt/icons/mob/inhands/weapons/melee_lefthand.dmi and b/modular_splurt/icons/mob/inhands/weapons/melee_lefthand.dmi differ diff --git a/modular_splurt/icons/mob/inhands/weapons/melee_righthand.dmi b/modular_splurt/icons/mob/inhands/weapons/melee_righthand.dmi index 71d886823e..da23681d2a 100644 Binary files a/modular_splurt/icons/mob/inhands/weapons/melee_righthand.dmi and b/modular_splurt/icons/mob/inhands/weapons/melee_righthand.dmi differ diff --git a/modular_splurt/icons/mob/mam_markings.dmi b/modular_splurt/icons/mob/mam_markings.dmi index d2b389c66e..8d2ca68181 100644 Binary files a/modular_splurt/icons/mob/mam_markings.dmi and b/modular_splurt/icons/mob/mam_markings.dmi differ diff --git a/modular_splurt/icons/mob/mam_snouts.dmi b/modular_splurt/icons/mob/mam_snouts.dmi index 27bab79b2d..fb6071b8c2 100644 Binary files a/modular_splurt/icons/mob/mam_snouts.dmi and b/modular_splurt/icons/mob/mam_snouts.dmi differ diff --git a/modular_splurt/icons/mob/mam_tails.dmi b/modular_splurt/icons/mob/mam_tails.dmi index 4d4f4e6755..e2ec928443 100644 Binary files a/modular_splurt/icons/mob/mam_tails.dmi and b/modular_splurt/icons/mob/mam_tails.dmi differ diff --git a/modular_splurt/icons/mobs/suits.dmi b/modular_splurt/icons/mobs/suits.dmi index 1369bc912a..57f709fdbb 100644 Binary files a/modular_splurt/icons/mobs/suits.dmi and b/modular_splurt/icons/mobs/suits.dmi differ diff --git a/modular_splurt/icons/obj/card.dmi b/modular_splurt/icons/obj/card.dmi new file mode 100644 index 0000000000..6c7eaeb624 Binary files /dev/null and b/modular_splurt/icons/obj/card.dmi differ diff --git a/modular_splurt/icons/obj/clothing/hats.dmi b/modular_splurt/icons/obj/clothing/hats.dmi index 472ff0cb1b..7af75114a5 100644 Binary files a/modular_splurt/icons/obj/clothing/hats.dmi and b/modular_splurt/icons/obj/clothing/hats.dmi differ diff --git a/modular_splurt/icons/obj/clothing/shoes.dmi b/modular_splurt/icons/obj/clothing/shoes.dmi index 71b62b42bc..311174d23d 100644 Binary files a/modular_splurt/icons/obj/clothing/shoes.dmi and b/modular_splurt/icons/obj/clothing/shoes.dmi differ diff --git a/modular_splurt/icons/obj/clothing/suits.dmi b/modular_splurt/icons/obj/clothing/suits.dmi index 418f999575..de921cc6bd 100644 Binary files a/modular_splurt/icons/obj/clothing/suits.dmi and b/modular_splurt/icons/obj/clothing/suits.dmi differ diff --git a/modular_splurt/icons/obj/clothing/uniforms.dmi b/modular_splurt/icons/obj/clothing/uniforms.dmi index 3880f77532..f6648a1fac 100644 Binary files a/modular_splurt/icons/obj/clothing/uniforms.dmi and b/modular_splurt/icons/obj/clothing/uniforms.dmi differ diff --git a/modular_splurt/icons/obj/drinks.dmi b/modular_splurt/icons/obj/drinks.dmi index 4339e5560a..4ea6784f4e 100644 Binary files a/modular_splurt/icons/obj/drinks.dmi and b/modular_splurt/icons/obj/drinks.dmi differ diff --git a/modular_splurt/icons/obj/items_and_weapons.dmi b/modular_splurt/icons/obj/items_and_weapons.dmi index b0c383513b..a5b3d02d5b 100644 Binary files a/modular_splurt/icons/obj/items_and_weapons.dmi and b/modular_splurt/icons/obj/items_and_weapons.dmi differ diff --git a/modular_splurt/sound/voice/huh.ogg b/modular_splurt/sound/voice/huh.ogg new file mode 100644 index 0000000000..accf4cab3c Binary files /dev/null and b/modular_splurt/sound/voice/huh.ogg differ diff --git a/modular_splurt/sound/voice/whine.ogg b/modular_splurt/sound/voice/whine.ogg new file mode 100644 index 0000000000..2d2f825a83 Binary files /dev/null and b/modular_splurt/sound/voice/whine.ogg differ diff --git a/tgstation.dme b/tgstation.dme index b7430e00ff..bcd68f2c44 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -156,6 +156,7 @@ #include "code\__DEFINES\dcs\flags.dm" #include "code\__DEFINES\dcs\helpers.dm" #include "code\__DEFINES\dcs\signals.dm" +#include "code\__DEFINES\dcs\signals\signals_movable.dm" #include "code\__DEFINES\dcs\signals\signals_subsystem.dm" #include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_movement.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_living.dm" @@ -261,6 +262,7 @@ #include "code\__SPLURTCODE\DEFINES\lewd.dm" #include "code\__SPLURTCODE\DEFINES\login.dm" #include "code\__SPLURTCODE\DEFINES\mobs.dm" +#include "code\__SPLURTCODE\DEFINES\preferences.dm" #include "code\__SPLURTCODE\DEFINES\pregnancy.dm" #include "code\__SPLURTCODE\DEFINES\quirks.dm" #include "code\__SPLURTCODE\DEFINES\radiation.dm" @@ -1511,6 +1513,7 @@ #include "code\modules\admin\create_object.dm" #include "code\modules\admin\create_poll.dm" #include "code\modules\admin\create_turf.dm" +#include "code\modules\admin\force_event.dm" #include "code\modules\admin\fun_balloon.dm" #include "code\modules\admin\holder2.dm" #include "code\modules\admin\ipintel.dm" @@ -2216,6 +2219,7 @@ #include "code\modules\events\processor_overload.dm" #include "code\modules\events\radiation_storm.dm" #include "code\modules\events\sentience.dm" +#include "code\modules\events\shuttle_catastrophe.dm" #include "code\modules\events\shuttle_loan.dm" #include "code\modules\events\space_dragon.dm" #include "code\modules\events\space_ninja.dm" @@ -3708,6 +3712,7 @@ #include "code\modules\tgui\states\debug.dm" #include "code\modules\tgui\states\deep_inventory.dm" #include "code\modules\tgui\states\default.dm" +#include "code\modules\tgui\states\fun.dm" #include "code\modules\tgui\states\hands.dm" #include "code\modules\tgui\states\human_adjacent.dm" #include "code\modules\tgui\states\inventory.dm" @@ -3856,6 +3861,7 @@ #include "modular_citadel\code\modules\client\loadout\_medical.dm" #include "modular_citadel\code\modules\client\loadout\_security.dm" #include "modular_citadel\code\modules\client\loadout\_service.dm" +#include "modular_citadel\code\modules\client\loadout\accessory.dm" #include "modular_citadel\code\modules\client\loadout\backpack.dm" #include "modular_citadel\code\modules\client\loadout\glasses.dm" #include "modular_citadel\code\modules\client\loadout\gloves.dm" @@ -3926,11 +3932,13 @@ #include "modular_citadel\code\modules\vectorcrafts\vectortruck.dm" #include "modular_citadel\code\modules\vectorcrafts\vectorvariants.dm" #include "modular_sand\code\_globalvars\bitfields.dm" +#include "modular_sand\code\_globalvars\lists\lewd_content.dm" #include "modular_sand\code\_globalvars\lists\misc.dm" #include "modular_sand\code\_globalvars\lists\objects.dm" #include "modular_sand\code\_onclick\hud\hud.dm" #include "modular_sand\code\_onclick\hud\screen_objects.dm" #include "modular_sand\code\controllers\configuration\entries\sandstorm.dm" +#include "modular_sand\code\controllers\configuration\entries\sandstorm_balance.dm" #include "modular_sand\code\controllers\subsystem\interactions.dm" #include "modular_sand\code\controllers\subsystem\job.dm" #include "modular_sand\code\controllers\subsystem\language.dm" @@ -3945,6 +3953,7 @@ #include "modular_sand\code\datums\components\storage\concrete\dresser.dm" #include "modular_sand\code\datums\diseases\advance\symptoms\species.dm" #include "modular_sand\code\datums\elements\holder_micro.dm" +#include "modular_sand\code\datums\elements\skirt_peeking.dm" #include "modular_sand\code\datums\interactions\_interaction.dm" #include "modular_sand\code\datums\interactions\interaction_interface.dm" #include "modular_sand\code\datums\interactions\interaction_mob.dm" @@ -3988,6 +3997,7 @@ #include "modular_sand\code\game\machinery\cryopod.dm" #include "modular_sand\code\game\machinery\cryptominers.dm" #include "modular_sand\code\game\machinery\Sleeper.dm" +#include "modular_sand\code\game\machinery\computer\cloning.dm" #include "modular_sand\code\game\machinery\computer\arcade\tetris.dm" #include "modular_sand\code\game\machinery\pipe\construction.dm" #include "modular_sand\code\game\machinery\telecomms\machine_interactions.dm" @@ -4007,6 +4017,7 @@ #include "modular_sand\code\game\objects\items\extinguisher.dm" #include "modular_sand\code\game\objects\items\fleshlight.dm" #include "modular_sand\code\game\objects\items\miscellaneous.dm" +#include "modular_sand\code\game\objects\items\plushes.dm" #include "modular_sand\code\game\objects\items\circuitboards\computer_circuitboards.dm" #include "modular_sand\code\game\objects\items\circuitboards\machine_circuitboards.dm" #include "modular_sand\code\game\objects\items\devices\dogborg_sleeper.dm" @@ -4078,6 +4089,7 @@ #include "modular_sand\code\modules\client\preferences_savefile.dm" #include "modular_sand\code\modules\client\loadout\_security.dm" #include "modular_sand\code\modules\client\loadout\accessories.dm" +#include "modular_sand\code\modules\client\loadout\backpack.dm" #include "modular_sand\code\modules\client\loadout\boxers.dm" #include "modular_sand\code\modules\client\loadout\hands.dm" #include "modular_sand\code\modules\client\loadout\head.dm" @@ -4099,12 +4111,7 @@ #include "modular_sand\code\modules\clothing\spacesuits\hardsuit.dm" #include "modular_sand\code\modules\clothing\suits\miscellaneous.dm" #include "modular_sand\code\modules\clothing\under\_under.dm" -#include "modular_sand\code\modules\clothing\under\color.dm" #include "modular_sand\code\modules\clothing\under\costumes.dm" -#include "modular_sand\code\modules\clothing\under\misc.dm" -#include "modular_sand\code\modules\clothing\under\skirt_dress.dm" -#include "modular_sand\code\modules\clothing\under\suits.dm" -#include "modular_sand\code\modules\clothing\under\syndicate.dm" #include "modular_sand\code\modules\clothing\under\uniform.dm" #include "modular_sand\code\modules\clothing\underwear\_underwear.dm" #include "modular_sand\code\modules\clothing\underwear\boxers.dm" @@ -4121,6 +4128,7 @@ #include "modular_sand\code\modules\integrated_electronics\subtypes\output.dm" #include "modular_sand\code\modules\jobs\job_types\_job.dm" #include "modular_sand\code\modules\jobs\job_types\_job_alt_titles.dm" +#include "modular_sand\code\modules\jobs\job_types\prisoner.dm" #include "modular_sand\code\modules\keybindings\keybind\carbon.dm" #include "modular_sand\code\modules\language\dragon.dm" #include "modular_sand\code\modules\language\language.dm" @@ -4148,13 +4156,15 @@ #include "modular_sand\code\modules\mob\living\carbon\carbon.dm" #include "modular_sand\code\modules\mob\living\carbon\life.dm" #include "modular_sand\code\modules\mob\living\carbon\show.dm" -#include "modular_sand\code\modules\mob\living\carbon\human\examine.dm" #include "modular_sand\code\modules\mob\living\carbon\human\human.dm" #include "modular_sand\code\modules\mob\living\carbon\human\human_defines.dm" #include "modular_sand\code\modules\mob\living\carbon\human\human_stripping.dm" #include "modular_sand\code\modules\mob\living\carbon\human\life.dm" #include "modular_sand\code\modules\mob\living\carbon\human\species.dm" +#include "modular_sand\code\modules\mob\living\carbon\human\species_types\anthropomorph.dm" +#include "modular_sand\code\modules\mob\living\carbon\human\species_types\ipc.dm" #include "modular_sand\code\modules\mob\living\carbon\human\species_types\lizardpeople.dm" +#include "modular_sand\code\modules\mob\living\carbon\human\species_types\synthliz.dm" #include "modular_sand\code\modules\mob\living\silicon\silicon.dm" #include "modular_sand\code\modules\mob\living\silicon\ai\ai.dm" #include "modular_sand\code\modules\mob\living\silicon\ai\vox_sounds.dm" @@ -4202,6 +4212,7 @@ #include "modular_sand\code\modules\reagents\chemistry\reagents\alcohol_reagents.dm" #include "modular_sand\code\modules\reagents\chemistry\reagents\cit_reagents.dm" #include "modular_sand\code\modules\reagents\chemistry\reagents\drink_reagents.dm" +#include "modular_sand\code\modules\reagents\chemistry\reagents\fermi_reagents.dm" #include "modular_sand\code\modules\reagents\chemistry\reagents\medicine_reagents.dm" #include "modular_sand\code\modules\reagents\chemistry\reagents\other_reagents.dm" #include "modular_sand\code\modules\reagents\chemistry\recipes\others.dm" @@ -4308,6 +4319,7 @@ #include "modular_splurt\code\datums\components\crafting\recipes\recipes_robot.dm" #include "modular_splurt\code\datums\components\storage\concrete\pockets.dm" #include "modular_splurt\code\datums\elements\crawl_under.dm" +#include "modular_splurt\code\datums\elements\mob_holder.dm" #include "modular_splurt\code\datums\elements\smalltalk.dm" #include "modular_splurt\code\datums\elements\spooky.dm" #include "modular_splurt\code\datums\elements\wuv.dm" @@ -4553,14 +4565,19 @@ #include "modular_splurt\code\modules\client\verbs\looc.dm" #include "modular_splurt\code\modules\client\verbs\ooc.dm" #include "modular_splurt\code\modules\clothing\back.dm" +#include "modular_splurt\code\modules\clothing\clothing.dm" #include "modular_splurt\code\modules\clothing\gloves.dm" #include "modular_splurt\code\modules\clothing\kinkyclothes.dm" #include "modular_splurt\code\modules\clothing\sizeaccessories.dm" #include "modular_splurt\code\modules\clothing\glasses\_glasses.dm" #include "modular_splurt\code\modules\clothing\glasses\hud.dm" +#include "modular_splurt\code\modules\clothing\gloves\_gloves.dm" +#include "modular_splurt\code\modules\clothing\head\_head.dm" +#include "modular_splurt\code\modules\clothing\head\hardhat.dm" #include "modular_splurt\code\modules\clothing\head\helmet.dm" #include "modular_splurt\code\modules\clothing\head\jobs.dm" #include "modular_splurt\code\modules\clothing\head\misc.dm" +#include "modular_splurt\code\modules\clothing\head\misc_special.dm" #include "modular_splurt\code\modules\clothing\lewd_clothing\collar\kink_collars.dm" #include "modular_splurt\code\modules\clothing\lewd_clothing\eyes\hypnogoggles.dm" #include "modular_splurt\code\modules\clothing\lewd_clothing\foot\lewd_shoes.dm" @@ -4568,11 +4585,15 @@ #include "modular_splurt\code\modules\clothing\lewd_clothing\head\deprivation_helmet.dm" #include "modular_splurt\code\modules\clothing\lewd_clothing\head\hats.dm" #include "modular_splurt\code\modules\clothing\lewd_clothing\uniform\latex_catsuit.dm" +#include "modular_splurt\code\modules\clothing\masks\_mask.dm" +#include "modular_splurt\code\modules\clothing\masks\boxing.dm" #include "modular_splurt\code\modules\clothing\masks\gasmask.dm" #include "modular_splurt\code\modules\clothing\masks\hailer.dm" #include "modular_splurt\code\modules\clothing\masks\miscellaneous.dm" #include "modular_splurt\code\modules\clothing\neck\_neck.dm" #include "modular_splurt\code\modules\clothing\outfits\ert.dm" +#include "modular_splurt\code\modules\clothing\shoes\_shoes.dm" +#include "modular_splurt\code\modules\clothing\shoes\magboots.dm" #include "modular_splurt\code\modules\clothing\shoes\miscellaneous.dm" #include "modular_splurt\code\modules\clothing\spacesuits\hardsuit.dm" #include "modular_splurt\code\modules\clothing\suits\armor.dm" @@ -4580,6 +4601,7 @@ #include "modular_splurt\code\modules\clothing\suits\heavy.dm" #include "modular_splurt\code\modules\clothing\suits\jobs.dm" #include "modular_splurt\code\modules\clothing\suits\miscellaneous.dm" +#include "modular_splurt\code\modules\clothing\suits\utility.dm" #include "modular_splurt\code\modules\clothing\suits\vest.dm" #include "modular_splurt\code\modules\clothing\under\_under.dm" #include "modular_splurt\code\modules\clothing\under\miscellaneous.dm" @@ -4588,6 +4610,7 @@ #include "modular_splurt\code\modules\clothing\under\jobs\engineering.dm" #include "modular_splurt\code\modules\clothing\under\jobs\security.dm" #include "modular_splurt\code\modules\clothing\under\jobs\civilian\civilian.dm" +#include "modular_splurt\code\modules\clothing\underwear\_underwear.dm" #include "modular_splurt\code\modules\clothing\underwear\boxers.dm" #include "modular_splurt\code\modules\clothing\underwear\shirts.dm" #include "modular_splurt\code\modules\clothing\underwear\socks.dm" @@ -4632,6 +4655,7 @@ #include "modular_splurt\code\modules\jobs\job_types\security_officer.dm" #include "modular_splurt\code\modules\jobs\job_types\service.dm" #include "modular_splurt\code\modules\jobs\job_types\station_engineer.dm" +#include "modular_splurt\code\modules\keybindings\keybind\communication.dm" #include "modular_splurt\code\modules\keybindings\keybind\human.dm" #include "modular_splurt\code\modules\keybindings\keybind\movement.dm" #include "modular_splurt\code\modules\language\xenocommon.dm" @@ -4670,6 +4694,7 @@ #include "modular_splurt\code\modules\mob\living\say.dm" #include "modular_splurt\code\modules\mob\living\brain\brain_item.dm" #include "modular_splurt\code\modules\mob\living\carbon\carbon.dm" +#include "modular_splurt\code\modules\mob\living\carbon\human\emote.dm" #include "modular_splurt\code\modules\mob\living\carbon\human\human.dm" #include "modular_splurt\code\modules\mob\living\carbon\human\human_defines.dm" #include "modular_splurt\code\modules\mob\living\carbon\human\inventory.dm" @@ -4702,6 +4727,8 @@ #include "modular_splurt\code\modules\mob\living\simple_animal\hostile\megafauna\king_of_goats.dm" #include "modular_splurt\code\modules\mob\living\simple_animal\hostile\megafauna\sand.dm" #include "modular_splurt\code\modules\paperwork\pen.dm" +#include "modular_splurt\code\modules\photography\photos\album.dm" +#include "modular_splurt\code\modules\photography\photos\photo.dm" #include "modular_splurt\code\modules\power\cell.dm" #include "modular_splurt\code\modules\power\reactor\fluffed.dm" #include "modular_splurt\code\modules\projectiles\ammunition\ballistic\pistol.dm" @@ -4734,6 +4761,7 @@ #include "modular_splurt\code\modules\reagents\chemistry\reagents\other_reagents.dm" #include "modular_splurt\code\modules\reagents\chemistry\recipes\drugs.dm" #include "modular_splurt\code\modules\reagents\chemistry\recipes\lewd.dm" +#include "modular_splurt\code\modules\reagents\reagent_containers\borghydro.dm" #include "modular_splurt\code\modules\reagents\reagent_containers\bottle.dm" #include "modular_splurt\code\modules\reagents\reagent_containers\hypospray.dm" #include "modular_splurt\code\modules\reagents\reagent_containers\hypovial.dm" @@ -4747,15 +4775,16 @@ #include "modular_splurt\code\modules\research\designs\mecha_designs.dm" #include "modular_splurt\code\modules\research\designs\mechfabricator_designs.dm" #include "modular_splurt\code\modules\research\designs\medical_designs.dm" +#include "modular_splurt\code\modules\research\designs\misc_designs.dm" #include "modular_splurt\code\modules\research\designs\power_designs.dm" #include "modular_splurt\code\modules\research\designs\stock_parts_designs.dm" #include "modular_splurt\code\modules\research\designs\tool_designs.dm" #include "modular_splurt\code\modules\research\designs\autolathe_desings\autolathe_designs_sec_and_hacked.dm" #include "modular_splurt\code\modules\research\designs\machine_designs\machine_designs_all_misc.dm" +#include "modular_splurt\code\modules\research\techweb\nodes\biotech_nodes.dm" #include "modular_splurt\code\modules\research\techweb\nodes\bluespace_nodes.dm" #include "modular_splurt\code\modules\research\techweb\nodes\mecha_nodes.dm" #include "modular_splurt\code\modules\research\techweb\nodes\medical_nodes.dm" -#include "modular_splurt\code\modules\research\techweb\nodes\misc_nodes.dm" #include "modular_splurt\code\modules\research\techweb\nodes\robotic_nodes.dm" #include "modular_splurt\code\modules\resize\smallsprite_action.dm" #include "modular_splurt\code\modules\ruins\objects_and_mobs\ash_walker_den.dm" diff --git a/tgui/packages/common/collections.ts b/tgui/packages/common/collections.ts index a5ccd7003e..ae3f402b13 100644 --- a/tgui/packages/common/collections.ts +++ b/tgui/packages/common/collections.ts @@ -306,3 +306,24 @@ export const zip = (...arrays: T): Zip => { export const zipWith = iterateeFn => (...arrays) => { return map(values => iterateeFn(...values))(zip(...arrays)); }; + +/** + * This method takes a collection of items and a number, returning a collection + * of collections, where the maximum amount of items in each is that second arg + */ +export const paginate = (collection: T[], maxPerPage: number): T[][] => { + const pages: T[][] = []; + let page: T[] = []; + let itemsToAdd = maxPerPage; + + for (const item of collection) { + page.push(item); + itemsToAdd--; + if (!itemsToAdd) { + itemsToAdd = maxPerPage; + pages.push(page); + page = []; + } + } + return pages; +}; diff --git a/tgui/packages/tgui/interfaces/ForceEvent.tsx b/tgui/packages/tgui/interfaces/ForceEvent.tsx new file mode 100644 index 0000000000..a486f52482 --- /dev/null +++ b/tgui/packages/tgui/interfaces/ForceEvent.tsx @@ -0,0 +1,197 @@ +import { paginate } from 'common/collections'; +import { useBackend, useLocalState } from '../backend'; +import { Stack, Button, Icon, Input, Section, Tabs } from '../components'; +import { Window } from '../layouts'; + +const CATEGORY_PAGE_ITEMS = 4; +const EVENT_PAGE_ITEMS = 2; +const EVENT_PAGE_MAXCHARS = 48; + +/** + * Same as paginate, but respecting event names with a character max length + * that will also create a new page if created + */ +const paginateEvents = (events: Event[], maxPerPage: number): Event[][] => { + const pages: Event[][] = []; + let page: Event[] = []; + // conditions that make a new page + let itemsToAdd = maxPerPage; + let maxChars = EVENT_PAGE_MAXCHARS; + + for (const event of events) { + maxChars -= event.name.length; + if (maxChars <= 0) { + // would overflow the next line over + itemsToAdd = maxPerPage; + maxChars = EVENT_PAGE_MAXCHARS - event.name.length; + pages.push(page); + page = []; + } + page.push(event); + itemsToAdd--; + if (!itemsToAdd) { + // max amount of items we allow + itemsToAdd = maxPerPage; + maxChars = EVENT_PAGE_MAXCHARS; + pages.push(page); + page = []; + } + } + if (page.length) { + pages.push(page); + } + return pages; +}; + +type Event = { + name: string; + description: string; + type: string; + category: string; +}; + +type Category = { + name: string; + icon: string; +}; + +type ForceEventData = { + categories: Category[]; + events: Event[]; +}; + +export const ForceEvent = (props, context) => { + return ( + + + + + + + + + + + + + ); +}; + +export const PanelOptions = (props, context) => { + const [searchQuery, setSearchQuery] = useLocalState( + context, + 'searchQuery', + '' + ); + + const [announce, setAnnounce] = useLocalState(context, 'announce', true); + + return ( + + + + + + setSearchQuery(e.target.value)} + placeholder="Search..." + value={searchQuery} + /> + + + setAnnounce(!announce)}> + Announce + + + + ); +}; + +export const EventSection = (props, context) => { + const { data, act } = useBackend(context); + const { categories, events } = data; + + const [category] = useLocalState(context, 'category', categories[0]); + const [searchQuery] = useLocalState(context, 'searchQuery', ''); + const [announce] = useLocalState(context, 'announce', true); + + const preparedEvents = paginateEvents( + events.filter((event) => { + // remove events not in the category you're looking at + if (!searchQuery && event.category !== category.name) { + return false; + } + // remove events not being searched for, if a search is active + if (searchQuery && !event.name.toLowerCase().includes(searchQuery)) { + return false; + } + return true; + }), + EVENT_PAGE_ITEMS + ); + + const sectionTitle = searchQuery ? 'Searching...' : category.name + ' Events'; + + return ( +
}> + + {preparedEvents.map((eventPage, i) => ( + + + {eventPage.map((event) => ( + + + + ))} + + + ))} + +
+ ); +}; + +export const EventTabs = (props, context) => { + const { data } = useBackend(context); + const { categories } = data; + + const [category, setCategory] = useLocalState( + context, + 'category', + categories[0] + ); + + const layerCats = paginate(categories, CATEGORY_PAGE_ITEMS); + + return ( +
+ {layerCats.map((page, i) => ( + + {page.map((cat) => ( + setCategory(cat)}> + {cat.name} + + ))} + + ))} +
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/OperatingComputer.js b/tgui/packages/tgui/interfaces/OperatingComputer.js index d181dbb3fd..068d85e3f0 100644 --- a/tgui/packages/tgui/interfaces/OperatingComputer.js +++ b/tgui/packages/tgui/interfaces/OperatingComputer.js @@ -127,7 +127,7 @@ const PatientStateView = (props, context) => { )} - {!!data.alternative_step && ( + {procedure.alternative_step && ( {procedure.alternative_step} {procedure.alt_chems_needed && ( diff --git a/tgui/packages/tgui/layouts/NtosWindow.js b/tgui/packages/tgui/layouts/NtosWindow.js index 5c282c369a..b6a0146431 100644 --- a/tgui/packages/tgui/layouts/NtosWindow.js +++ b/tgui/packages/tgui/layouts/NtosWindow.js @@ -28,7 +28,7 @@ export const NtosWindow = (props, context) => { PC_stationtime, PC_programheaders = [], PC_showexitprogram, - PC_showpeneject, + TABLET_show_pen_eject, } = data; return ( { src={resolveAsset(PC_apclinkicon)} /> )} - {!!PC_showpeneject && ( + {!!TABLET_show_pen_eject && (