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 79d49dc6cf..f7be60c4b3 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 @@ -994,14 +994,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" = ( @@ -2498,13 +2498,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/code/__DEFINES/achievements.dm b/code/__DEFINES/achievements.dm index 0cbba32b96..20c68c015b 100644 --- a/code/__DEFINES/achievements.dm +++ b/code/__DEFINES/achievements.dm @@ -35,7 +35,6 @@ #define MEDAL_HOT_DAMN "Hot Damn!" #define MEDAL_CAYENNE_DISK "Very Important Piscis" #define MEDAL_TRAM_SURFER "Tram Surfer" -#define MEDAL_SPRINGLOCK "The Man Inside the Modsuit" //Skill medal hub IDs #define MEDAL_LEGENDARY_MINER "Legendary Miner" diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index cd2c735e09..2b9fa902e9 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -474,8 +474,6 @@ #define COMSIG_ITEM_AFTERATTACK "item_afterattack" //from base of obj/item/afterattack(): (atom/target, mob/user, params) #define COMSIG_ITEM_ALT_AFTERATTACK "item_alt_afterattack" //from base of obj/item/altafterattack(): (atom/target, mob/user, proximity, params) #define COMSIG_ITEM_EQUIPPED "item_equip" //from base of obj/item/equipped(): (/mob/equipper, slot) -/// A mob has just unequipped an item. -#define COMSIG_MOB_UNEQUIPPED_ITEM "mob_unequipped_item" // Do not grant actions on equip. #define COMPONENT_NO_GRANT_ACTIONS 1 #define COMSIG_ITEM_DROPPED "item_drop" //from base of obj/item/dropped(): (mob/user) diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm deleted file mode 100644 index be1e9b31c8..0000000000 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm +++ /dev/null @@ -1,3 +0,0 @@ -/// from base of atom/movable/Process_Spacemove(): (movement_dir) -#define COMSIG_MOVABLE_SPACEMOVE "spacemove" - #define COMSIG_MOVABLE_STOP_SPACEMOVE (1<<0) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 6607b91695..603d01b011 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -272,9 +272,13 @@ GLOBAL_LIST_INIT(pda_styles, list(MONO, VT, ORBITRON, SHARE)) #define PDA_SKIN_MODERN "Modern" #define PDA_SKIN_MINIMAL "Minimal" -GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_SKIN_ALT = 'icons/obj/pda_alt.dmi', - PDA_SKIN_RUGGED = 'icons/obj/pda_rugged.dmi', PDA_SKIN_MODERN = 'icons/obj/pda_modern.dmi', - PDA_SKIN_MINIMAL = 'icons/obj/pda_minimal.dmi')) +GLOBAL_LIST_INIT(pda_reskins, list( + PDA_SKIN_CLASSIC = list("icon" = 'icons/obj/pda.dmi'), + PDA_SKIN_ALT = list("icon" = 'icons/obj/pda_alt.dmi'), + PDA_SKIN_RUGGED = list("icon" = 'icons/obj/pda_rugged.dmi'), + PDA_SKIN_MODERN = list("icon" = 'icons/obj/pda_modern.dmi'), + PDA_SKIN_MINIMAL = list("icon" = 'icons/obj/pda_minimal.dmi') + )) ///////////////////////////////////// // atom.appearence_flags shortcuts // diff --git a/code/__DEFINES/mod.dm b/code/__DEFINES/mod.dm deleted file mode 100644 index 0e380f9e95..0000000000 --- a/code/__DEFINES/mod.dm +++ /dev/null @@ -1,40 +0,0 @@ -/// Default value for the max_complexity var on MODsuits -#define DEFAULT_MAX_COMPLEXITY 15 - -/// Default cell drain per process on MODsuits -#define DEFAULT_CHARGE_DRAIN 5 - -/// Default time for a part to seal -#define MOD_ACTIVATION_STEP_TIME (2 SECONDS) - -/// Passive module, just acts when put in naturally. -#define MODULE_PASSIVE 0 -/// Usable module, does something when you press a button. -#define MODULE_USABLE 1 -/// Toggle module, you turn it on/off and it does stuff. -#define MODULE_TOGGLE 2 -/// Actively usable module, you may only have one selected at a time. -#define MODULE_ACTIVE 3 - -//Defines used by the theme for clothing flags and similar -#define CONTROL_LAYER "control_layer" -#define HELMET_FLAGS "helmet_flags" -#define CHESTPLATE_FLAGS "chestplate_flags" -#define GAUNTLETS_FLAGS "gauntlets_flags" -#define BOOTS_FLAGS "boots_flags" - -#define UNSEALED_LAYER "unsealed_layer" -#define UNSEALED_CLOTHING "unsealed_clothing" -#define SEALED_CLOTHING "sealed_clothing" -#define UNSEALED_INVISIBILITY "unsealed_invisibility" -#define SEALED_INVISIBILITY "sealed_invisibility" -#define UNSEALED_COVER "unsealed_cover" -#define SEALED_COVER "sealed_cover" -#define CAN_OVERSLOT "can_overslot" - -//Defines used to override MOD clothing's icon and worn icon files in the skin. -#define MOD_ICON_OVERRIDE "mod_icon_override" -#define MOD_WORN_ICON_OVERRIDE "mod_worn_icon_override" - -/// Global list of all /datum/mod_theme -GLOBAL_LIST_INIT(mod_themes, setup_mod_themes()) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index eda8089a5b..4e97723676 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -158,18 +158,6 @@ #define TRAIT_CALCIUM_HEALER "calcium_healer" #define TRAIT_MAGIC_CHOKE "magic_choke" #define TRAIT_CAPTAIN_METABOLISM "captain-metabolism" -/// Like antimagic, but doesn't block the user from casting -#define TRAIT_ANTIMAGIC_NO_SELFBLOCK "anti_magic_no_selfblock" -/// Gives us turf, mob and object vision through walls -#define TRAIT_XRAY_VISION "xray_vision" -/// Gives us mob vision through walls and slight night vision -#define TRAIT_THERMAL_VISION "thermal_vision" -/// Gives us turf vision through walls and slight night vision -#define TRAIT_MESON_VISION "meson_vision" -/// Gives us Night vision -#define TRAIT_TRUE_NIGHT_VISION "true_night_vision" -/// Lets us scan reagents -#define TRAIT_REAGENT_SCANNER "reagent_scanner" #define TRAIT_ABDUCTOR_TRAINING "abductor-training" #define TRAIT_ABDUCTOR_SCIENTIST_TRAINING "abductor-scientist-training" #define TRAIT_SURGEON "surgeon" @@ -225,6 +213,8 @@ #define TRAIT_AUTO_CATCH_ITEM "auto_catch_item" #define TRAIT_CLOWN_MENTALITY "clown_mentality" // The future is now, clownman. #define TRAIT_FREESPRINT "free_sprinting" +#define TRAIT_XRAY_VISION "xray_vision" +#define TRAIT_THERMAL_VISION "thermal_vision" #define TRAIT_NO_TELEPORT "no-teleport" //you just can't #define TRAIT_NO_INTERNALS "no-internals" #define TRAIT_TOXIC_ALCOHOL "alcohol_intolerance" @@ -389,5 +379,3 @@ #define STATION_TRAIT_FILLED_MAINT "station_trait_filled_maint" #define STATION_TRAIT_EMPTY_MAINT "station_trait_empty_maint" #define STATION_TRAIT_PDA_GLITCHED "station_trait_pda_glitched" -/// Trait applied by MODsuits. -#define MOD_TRAIT "mod" diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 8d06d9ecf3..f412f31e9c 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 @@ -204,6 +252,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, @@ -281,7 +335,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, )) @@ -343,6 +411,29 @@ DEFINE_BITFIELD(sight, list( "SEE_TURFS" = SEE_TURFS, )) +DEFINE_BITFIELD(slot_flags, list( + "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, @@ -351,6 +442,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, @@ -369,6 +469,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 162eeffe78..fa239e0ea4 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -350,41 +350,6 @@ GLOBAL_LIST_INIT(greyscale_limb_types, list("human","moth","lizard","pod","plant //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) - )) - //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/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index d02ebb659e..cec25c0047 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -53,8 +53,6 @@ GLOBAL_LIST_INIT(maintenance_loot, list( /obj/item/airlock_painter/decal/tile = 1, /obj/item/stack/cable_coil/random = 4, /obj/item/stack/cable_coil/random/five = 6, - /obj/item/mod/construction/broken_core = 5, - /obj/item/mod/module/springlock = 1, /obj/item/stack/medical/suture = 1, /obj/item/stack/rods/ten = 9, /obj/item/stack/rods/twentyfive = 1, diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index c9e20bc01a..6e8d1de955 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -405,7 +405,7 @@ return /atom/proc/CtrlShiftClick(mob/user) - SEND_SIGNAL(src, COMSIG_CLICK_CTRL_SHIFT) + SEND_SIGNAL(src, COMSIG_CLICK_CTRL_SHIFT, user) return /* diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm index b438afaec8..935379b721 100644 --- a/code/_onclick/hud/radial.dm +++ b/code/_onclick/hud/radial.dm @@ -91,8 +91,6 @@ GLOBAL_LIST_EMPTY(radial_menus) else py_shift = 32 restrict_to_dir(NORTH) //I was going to parse screen loc here but that's more effort than it's worth. - else if(hudfix_method && AM.loc) - anchor = get_atom_on_turf(anchor) //Sets defaults //These assume 45 deg min_angle diff --git a/code/datums/achievements/misc_achievements.dm b/code/datums/achievements/misc_achievements.dm index ace74c13a8..5ad337445b 100644 --- a/code/datums/achievements/misc_achievements.dm +++ b/code/datums/achievements/misc_achievements.dm @@ -171,9 +171,3 @@ desc = "Lights out, guerilla radio!" database_id = MEDAL_TRAM_SURFER icon = "tram_surfer" - -/datum/award/achievement/misc/springlock - name = "The Man Inside the MODsuit" - desc = "Ignore the warning label on a springlock MODsuit." - database_id = MEDAL_SPRINGLOCK - icon = "springlock" diff --git a/code/datums/chatmessage.dm b/code/datums/chatmessage.dm index e4648233de..766ae1833b 100644 --- a/code/datums/chatmessage.dm +++ b/code/datums/chatmessage.dm @@ -164,7 +164,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/components/crafting/recipes/recipes_misc.dm b/code/datums/components/crafting/recipes/recipes_misc.dm index fd72964505..ad37f770ed 100644 --- a/code/datums/components/crafting/recipes/recipes_misc.dm +++ b/code/datums/components/crafting/recipes/recipes_misc.dm @@ -554,19 +554,6 @@ subcategory = CAT_MISCELLANEOUS category = CAT_MISCELLANEOUS -/datum/crafting_recipe/mod_core - name = "MOD core" - result = /obj/item/mod/construction/core - tools = list(TOOL_SCREWDRIVER) - time = 10 SECONDS - reqs = list(/obj/item/stack/cable_coil = 5, - /obj/item/stack/rods = 2, - /obj/item/stack/sheet/glass = 1, - /obj/item/organ/heart = 1 - ) - subcategory = CAT_MISCELLANEOUS - category = CAT_MISCELLANEOUS - ////////////// //Banners///// ////////////// diff --git a/code/datums/elements/object_reskinning.dm b/code/datums/elements/object_reskinning.dm new file mode 100644 index 0000000000..8b5d905e72 --- /dev/null +++ b/code/datums/elements/object_reskinning.dm @@ -0,0 +1,104 @@ +/* + * # Element: Object Reskinning + * + * Allows players to modify the appearance of their object (and other attributes if possible) + * PLEASE DO NOT HAVE INVALID VALUES IN unique_reskin I DON'T EVEN WANT TO KNOW WHAT HAPPENS. + * USAGE: + * unique_reskins = list( + * "skin 1" = list( + * "desc" = "very cool description", + * "icon" = 'very_cool_icon.dmi' + * ), + * "skin 2" = list( + * "desc" = "not as cool description", + * "icon" = 'the_boring_skin.dmi' + * ) + * ) +*/ +/datum/element/object_reskinning + element_flags = ELEMENT_DETACH + +/datum/element/object_reskinning/Attach(datum/target) + . = ..() + var/obj/the_obj = target + if(!istype(the_obj)) + return ELEMENT_INCOMPATIBLE + if(!islist(the_obj.unique_reskin) || !length(the_obj.unique_reskin)) + message_admins("[src] was given to an object without any unique reskins, if you really need to, give it a couple skins first.") + return ELEMENT_INCOMPATIBLE + + RegisterSignal(the_obj, COMSIG_PARENT_EXAMINE, .proc/on_examine) + RegisterSignal(the_obj, the_obj.reskin_binding, .proc/reskin) + +/datum/element/object_reskinning/Detach(datum/source, force) + var/obj/being_deleted = source + UnregisterSignal(source, list(COMSIG_PARENT_EXAMINE, being_deleted.reskin_binding)) + return ..() + +/datum/element/object_reskinning/proc/on_examine(obj/obj, mob/user, list/examine_list) + examine_list += span_notice("[capitalize(replacetext(obj.reskin_binding, "_", "-"))] to reskin it ([length(obj.unique_reskin)] possible styles).") + if(obj.always_reskinnable) + examine_list += span_notice("It has no limit to reskinning.") + +/* + * Reskins an object according to user's choice. + * Will detach itself if there's no skins or if done successfully but not always reskinnable. + * + * Arguments: + * * to_reskin The object we will be reskinning + * * user The user who wants to choose a skin for the object +*/ +/datum/element/object_reskinning/proc/reskin(obj/to_reskin, mob/user) + // Just stop early + if(!LAZYLEN(to_reskin.unique_reskin)) + message_admins("[ADMIN_LOOKUPFLW(user)] attempted to reskin an object that has no skins!") + Detach(to_reskin) + return FALSE + + // Can't use + if(!user.canUseTopic(to_reskin, BE_CLOSE, NO_DEXTERY, NO_TK)) + return FALSE + + // Get our choices + var/list/items = list() + for(var/reskin_option in to_reskin.unique_reskin) + var/image/item_image = image( + icon = to_reskin.unique_reskin[reskin_option]["icon"] ? to_reskin.unique_reskin[reskin_option]["icon"] : to_reskin.icon, + icon_state = to_reskin.unique_reskin[reskin_option]["icon_state"] ? to_reskin.unique_reskin[reskin_option]["icon_state"] : to_reskin.icon_state) + items += list("[reskin_option]" = item_image) + sortList(items) + + // Display to the user + var/pick = show_radial_menu(user, to_reskin, items, custom_check = CALLBACK(src, .proc/check_reskin_menu, user, to_reskin), radius = 38, require_near = TRUE) + if(!pick) + return FALSE + + // Finish the work + to_reskin.current_skin = pick + for(var/reskin_var in to_reskin.unique_reskin[pick]) + to_reskin.vars[reskin_var] = to_reskin.unique_reskin[pick][reskin_var] + to_chat(user, "[to_reskin] is now skinned as '[pick].'") + to_reskin.reskin_obj(user) + + // Only once or always? + if(!to_reskin.always_reskinnable) + Detach(to_reskin) + return TRUE + +/** + * Checks if we are allowed to interact with a radial menu for reskins + * + * Arguments: + * * user The mob interacting with the menu + * * obj The obj to be checking against + */ +/datum/element/object_reskinning/proc/check_reskin_menu(mob/user, obj/obj) + if(QDELETED(obj)) + return FALSE + if(!obj.always_reskinnable && obj.current_skin) + return FALSE + if(!istype(user)) + return FALSE + if(user.incapacitated()) + return FALSE + return TRUE diff --git a/code/datums/traits/good.dm b/code/datums/traits/good.dm index e2de71d006..5b00d2e71e 100644 --- a/code/datums/traits/good.dm +++ b/code/datums/traits/good.dm @@ -181,10 +181,10 @@ /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 @@ -195,6 +195,34 @@ 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) + /datum/quirk/bloodpressure name = "Polycythemia vera" desc = "You've a treated form of Polycythemia vera that increases the total blood volume inside of you as well as the rate of replenishment!" 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 8f7043c715..eb5293c07d 100644 --- a/code/datums/traits/neutral.dm +++ b/code/datums/traits/neutral.dm @@ -163,22 +163,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/datums/wires/mod.dm b/code/datums/wires/mod.dm deleted file mode 100644 index b5805557ea..0000000000 --- a/code/datums/wires/mod.dm +++ /dev/null @@ -1,57 +0,0 @@ -/datum/wires/mod - holder_type = /obj/item/mod/control - proper_name = "MOD control unit" - -/datum/wires/mod/New(atom/holder) - wires = list(WIRE_HACK, WIRE_DISABLE, WIRE_SHOCK, WIRE_INTERFACE) - add_duds(2) - ..() - -/datum/wires/mod/interactable(mob/user) - if(!..()) - return FALSE - var/obj/item/mod/control/mod = holder - return mod.open - -/datum/wires/mod/get_status() - var/obj/item/mod/control/mod = holder - var/list/status = list() - status += "The orange light is [mod.seconds_electrified ? "on" : "off"]." - status += "The red light is [mod.malfunctioning ? "off" : "blinking"]." - status += "The green light is [mod.locked ? "on" : "off"]." - status += "The yellow light is [mod.interface_break ? "off" : "on"]." - return status - -/datum/wires/mod/on_pulse(wire) - var/obj/item/mod/control/mod = holder - switch(wire) - if(WIRE_HACK) - mod.locked = !mod.locked - if(WIRE_DISABLE) - mod.malfunctioning = TRUE - if(WIRE_SHOCK) - mod.seconds_electrified = MACHINE_DEFAULT_ELECTRIFY_TIME - if(WIRE_INTERFACE) - mod.interface_break = !mod.interface_break - -/datum/wires/mod/on_cut(wire, mend) - var/obj/item/mod/control/mod = holder - switch(wire) - if(WIRE_HACK) - if(!mend) - mod.req_access = list() - if(WIRE_DISABLE) - mod.malfunctioning = !mend - if(WIRE_SHOCK) - if(mend) - mod.seconds_electrified = MACHINE_NOT_ELECTRIFIED - else - mod.seconds_electrified = MACHINE_ELECTRIFIED_PERMANENT - if(WIRE_INTERFACE) - mod.interface_break = !mend - -/datum/wires/mod/ui_act(action, params) - var/obj/item/mod/control/mod = holder - if(!issilicon(usr) && mod.seconds_electrified && mod.shock(usr)) - return FALSE - return ..() 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/rechargestation.dm b/code/game/machinery/rechargestation.dm index 1bd795e4f1..11ae19f7fa 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -1,6 +1,6 @@ /obj/machinery/recharge_station - name = "recharging station" - desc = "This device recharges energy dependent lifeforms, like cyborgs, ethereals and MODsuit users." + name = "cyborg recharging station" + desc = "This device recharges cyborgs and resupplies them with materials." icon = 'icons/obj/objects.dmi' icon_state = "borgcharger0" density = FALSE @@ -10,7 +10,7 @@ req_access = list(ACCESS_ROBOTICS) state_open = TRUE circuit = /obj/item/circuitboard/machine/cyborgrecharger - occupant_typecache = list(/mob/living/silicon/robot, /mob/living/carbon/human) + occupant_typecache = list(/mob/living/silicon/robot) var/recharge_speed var/repairs diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index ca57e8457a..74a05a1e7b 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -10,15 +10,11 @@ var/obj/item/clothing/suit/space/suit = null var/obj/item/clothing/head/helmet/space/helmet = null var/obj/item/clothing/mask/mask = null - var/obj/item/mod/control/mod = null var/obj/item/storage = null var/suit_type = null var/helmet_type = null var/mask_type = null - /// What type of MOD the unit starts with when spawned. - var/mod_type = null - /// What type of additional item the unit starts with when spawned. var/storage_type = null state_open = FALSE @@ -31,8 +27,6 @@ var/uv_cycles = 6 var/message_cooldown var/breakout_time = 300 - /// How fast it charges cells in a suit - var/charge_rate = 250 /obj/machinery/suit_storage_unit/standard_unit suit_type = /obj/item/clothing/suit/space/eva @@ -44,50 +38,21 @@ mask_type = /obj/item/clothing/mask/gas/sechailer storage_type = /obj/item/tank/jetpack/oxygen/captain -/obj/machinery/suit_storage_unit/captainmod - mask_type = /obj/item/clothing/mask/gas/sechailer - storage_type = /obj/item/tank/jetpack/oxygen/captain - mod_type = /obj/item/mod/control/pre_equipped/magnate - /obj/machinery/suit_storage_unit/engine suit_type = /obj/item/clothing/suit/space/hardsuit/engine mask_type = /obj/item/clothing/mask/breath storage_type= /obj/item/clothing/shoes/magboots -/obj/machinery/suit_storage_unit/enginemod - mask_type = /obj/item/clothing/mask/breath - mod_type = /obj/item/mod/control/pre_equipped/engineering - -/obj/machinery/suit_storage_unit/atmos - suit_type = /obj/item/clothing/suit/space/hardsuit/engine/atmos - mask_type = /obj/item/clothing/mask/breath - storage_type = /obj/item/watertank/atmos - -/obj/machinery/suit_storage_unit/atmosmod - mask_type = /obj/item/clothing/mask/breath - storage_type = /obj/item/watertank/atmos - mod_type = /obj/item/mod/control/pre_equipped/atmospheric - /obj/machinery/suit_storage_unit/ce suit_type = /obj/item/clothing/suit/space/hardsuit/engine/elite mask_type = /obj/item/clothing/mask/breath storage_type= /obj/item/clothing/shoes/magboots/advance -/obj/machinery/suit_storage_unit/cemod - mask_type = /obj/item/clothing/mask/breath - storage_type = /obj/item/clothing/shoes/magboots/advance - mod_type = /obj/item/mod/control/pre_equipped/advanced - /obj/machinery/suit_storage_unit/security suit_type = /obj/item/clothing/suit/space/hardsuit/security mask_type = /obj/item/clothing/mask/gas/sechailer storage_type = /obj/item/tank/jetpack/oxygen/security -/obj/machinery/suit_storage_unit/securitymod - mask_type = /obj/item/clothing/mask/gas/sechailer - mod_type = /obj/item/mod/control/pre_equipped/security - - /obj/machinery/suit_storage_unit/hos suit_type = /obj/item/clothing/suit/space/hardsuit/security/hos mask_type = /obj/item/clothing/mask/gas/sechailer @@ -98,11 +63,6 @@ mask_type = /obj/item/clothing/mask/gas storage_type = /obj/item/watertank/atmos -/obj/machinery/suit_storage_unit/hosmod - mask_type = /obj/item/clothing/mask/gas/sechailer - storage_type = /obj/item/tank/internals/oxygen - mod_type = /obj/item/mod/control/pre_equipped/safeguard - /obj/machinery/suit_storage_unit/mining suit_type = /obj/item/clothing/suit/hooded/explorer/standard mask_type = /obj/item/clothing/mask/gas/explorer @@ -111,16 +71,6 @@ suit_type = /obj/item/clothing/suit/space/hardsuit/mining mask_type = /obj/item/clothing/mask/breath -/obj/machinery/suit_storage_unit/mining/evahos - suit_type = null - mask_type = /obj/item/clothing/mask/breath - mod_type = /obj/item/mod/control/pre_equipped/mining - -/obj/machinery/suit_storage_unit/medicalmod - mask_type = /obj/item/clothing/mask/breath/medical - storage_type = /obj/item/tank/internals/oxygen - mod_type = /obj/item/mod/control/pre_equipped/medical - /obj/machinery/suit_storage_unit/cmo suit_type = /obj/item/clothing/suit/space/hardsuit/medical mask_type = /obj/item/clothing/mask/breath @@ -131,29 +81,15 @@ helmet_type = /obj/item/clothing/head/helmet/space/eva/paramedic mask_type = /obj/item/clothing/mask/breath -/obj/machinery/suit_storage_unit/cmomod - mask_type = /obj/item/clothing/mask/breath/medical - storage_type = /obj/item/tank/internals/oxygen - mod_type = /obj/item/mod/control/pre_equipped/rescue - /obj/machinery/suit_storage_unit/rd suit_type = /obj/item/clothing/suit/space/hardsuit/rd mask_type = /obj/item/clothing/mask/breath -/obj/machinery/suit_storage_unit/rdmod - mask_type = /obj/item/clothing/mask/breath - mod_type = /obj/item/mod/control/pre_equipped/research - /obj/machinery/suit_storage_unit/syndicate suit_type = /obj/item/clothing/suit/space/hardsuit/syndi mask_type = /obj/item/clothing/mask/gas/syndicate storage_type = /obj/item/tank/jetpack/oxygen/harness -/obj/machinery/suit_storage_unit/syndicatemod - mask_type = /obj/item/clothing/mask/gas/syndicate - storage_type = /obj/item/tank/jetpack/oxygen/harness - mod_type = /obj/item/mod/control/pre_equipped/nuclear - /obj/machinery/suit_storage_unit/ert/command suit_type = /obj/item/clothing/suit/space/hardsuit/ert mask_type = /obj/item/clothing/mask/breath @@ -193,8 +129,6 @@ helmet = new helmet_type(src) if(mask_type) mask = new mask_type(src) - if(mod_type) - mod = new mod_type(src) if(storage_type) storage = new storage_type(src) update_icon() @@ -203,7 +137,6 @@ QDEL_NULL(suit) QDEL_NULL(helmet) QDEL_NULL(mask) - QDEL_NULL(mod) QDEL_NULL(storage) return ..() @@ -221,7 +154,7 @@ . += "broken" else . += "open" - if(suit || mod) + if(suit) . += "suit" if(helmet) . += "helm" @@ -242,7 +175,6 @@ helmet = null suit = null mask = null - mod = null storage = null occupant = null @@ -309,8 +241,6 @@ qdel(suit) // Delete everything but the occupant. mask = null qdel(mask) - mod = null - qdel(mod) storage = null qdel(storage) // The wires get damaged too. @@ -332,9 +262,6 @@ if(mask) things_to_clear += mask things_to_clear += mask.GetAllContents() - if(mod) - things_to_clear += mod - things_to_clear += mod.GetAllContents() if(storage) things_to_clear += storage things_to_clear += storage.GetAllContents() @@ -352,20 +279,6 @@ if(occupant) dump_contents() -/obj/machinery/suit_storage_unit/process(delta_time) - var/obj/item/stock_parts/cell/cell - if(mod) - if(!istype(mod)) - return - if(!mod.cell) - return - cell = mod.cell - else - return - - use_power(charge_rate * delta_time) - cell.give(charge_rate * delta_time) - /obj/machinery/suit_storage_unit/proc/shock(mob/user, prb) if(!prob(prb)) var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread @@ -440,13 +353,6 @@ if(!user.transferItemToLoc(I, src)) return mask = I - else if(istype(I, /obj/item/mod/control)) - if(mod) - to_chat(user, span_warning("The unit already contains a MOD!")) - return - if(!user.transferItemToLoc(I, src)) - return - mod = I else if(storage) to_chat(user, "The auxiliary storage compartment is full!") @@ -499,10 +405,6 @@ data["mask"] = mask.name else data["mask"] = null - if(mod) - data["mod"] = mod.name - else - data["mod"] = null if(storage) data["storage"] = storage.name else @@ -533,7 +435,7 @@ if("uv") if(occupant && safeties) return - else if(!helmet && !mask && !mod && !suit && !storage && !occupant) + else if(!helmet && !mask && !suit && !storage && !occupant) return else if(occupant) @@ -545,7 +447,7 @@ if(!state_open) return - var/static/list/valid_items = list("helmet", "suit", "mask", "mod", "storage") + var/static/list/valid_items = list("helmet", "suit", "mask", "storage") var/item_name = params["item"] if(item_name in valid_items) var/obj/item/I = vars[item_name] diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 7a953089a5..0dcc23f3aa 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -399,7 +399,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb if(throwing) throwing.finalize(FALSE) if(loc == user) - if(!allow_attack_hand_drop(user) || !user.temporarilyRemoveItemFromInventory(I = src)) + if(!allow_attack_hand_drop(user) || !user.temporarilyRemoveItemFromInventory(src)) return . = FALSE @@ -428,7 +428,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb if(throwing) throwing.finalize(FALSE) if(loc == user) - if(!allow_attack_hand_drop(user) || !user.temporarilyRemoveItemFromInventory(src)) + if(!user.temporarilyRemoveItemFromInventory(src)) return pickup(user) @@ -1271,7 +1271,3 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb /obj/item/proc/update_action_buttons(status_only = FALSE, force = FALSE) for(var/datum/action/current_action as anything in actions) current_action.UpdateButtonIcon(status_only, force) - -/// Special stuff you want to do when an outfit equips this item. -/obj/item/proc/on_outfit_equip(mob/living/carbon/human/outfit_wearer, visuals_only, item_slot) - return diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 61bc715a64..0b733d6192 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -42,7 +42,7 @@ var/static/list/runes = list("rune1","rune2","rune3","rune4","rune5","rune6") var/static/list/randoms = list(RANDOM_ANY, RANDOM_RUNE, RANDOM_ORIENTED, RANDOM_NUMBER, RANDOM_GRAFFITI, RANDOM_LETTER, RANDOM_SYMBOL, RANDOM_PUNCTUATION, RANDOM_DRAWING) - var/static/list/graffiti_large_h = list("yiffhell", "secborg", "paint") + var/static/list/graffiti_large_h = list("yiffhell", "furrypride", "secborg", "paint") var/static/list/all_drawables = graffiti + symbols + drawings + oriented + runes + graffiti_large_h diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index aea961860d..f680d0034b 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -461,8 +461,6 @@ cooldown = TRUE busy = FALSE update_icon() - if(SEND_SIGNAL(src, COMSIG_DEFIBRILLATOR_SUCCESS) & COMPONENT_DEFIB_STOP) - return if(req_defib) defib.cooldowncheck(user) else @@ -516,8 +514,6 @@ cooldown = TRUE busy = FALSE update_icon() - if(SEND_SIGNAL(src, COMSIG_DEFIBRILLATOR_SUCCESS) & COMPONENT_DEFIB_STOP) - return if(!req_defib) recharge(60) if(req_defib && (defib.cooldowncheck(user))) @@ -636,8 +632,6 @@ defib.deductcharge(revivecost) cooldown = 1 update_icon() - if(SEND_SIGNAL(src, COMSIG_DEFIBRILLATOR_SUCCESS) & COMPONENT_DEFIB_STOP) - return if(req_defib) defib.cooldowncheck(user) else diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 5ff7bbc714..b3eb8ab439 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -32,6 +32,9 @@ GLOBAL_LIST_EMPTY(PDAs) armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100) resistance_flags = FIRE_PROOF | ACID_PROOF + always_reskinnable = TRUE + reskin_binding = COMSIG_CLICK_CTRL_SHIFT + //Main variables var/owner = null // String name of owner var/default_cartridge = 0 // Access level defined by cartridge @@ -112,10 +115,10 @@ GLOBAL_LIST_EMPTY(PDAs) . += id ? "Alt-click to remove the id." : "" if(inserted_item && (!isturf(loc))) . += "Ctrl-click to remove [inserted_item]." - if(LAZYLEN(GLOB.pda_reskins)) - . += "Ctrl-shift-click it to reskin it." /obj/item/pda/Initialize(mapload) + if(GLOB.pda_reskins) + unique_reskin = GLOB.pda_reskins . = ..() if(fon) set_light(f_lum, f_pow, f_col) @@ -130,28 +133,10 @@ GLOBAL_LIST_EMPTY(PDAs) new_overlays = TRUE update_icon() -/obj/item/pda/CtrlShiftClick(mob/living/user) - . = ..() - if(GLOB.pda_reskins && user.canUseTopic(src, BE_CLOSE, NO_DEXTERY)) - reskin_obj(user) - /obj/item/pda/reskin_obj(mob/M) - if(!LAZYLEN(GLOB.pda_reskins)) - return - var/dat = "Reskin options for [name]:" - for(var/V in GLOB.pda_reskins) - var/output = icon2html(GLOB.pda_reskins[V], M, icon_state) - dat += "\n[V]: [output]" - to_chat(M, dat) - - var/choice = input(M, "Choose the a reskin for [src]","Reskin Object") as null|anything in GLOB.pda_reskins - var/new_icon = GLOB.pda_reskins[choice] - if(QDELETED(src) || isnull(new_icon) || new_icon == icon || !M.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) - return - icon = new_icon + . = ..() new_overlays = TRUE update_icon() - to_chat(M, "[src] is now skinned as '[choice]'.") /obj/item/pda/proc/set_new_overlays() if(!overlays_offsets || !(icon in overlays_offsets)) @@ -191,7 +176,7 @@ GLOBAL_LIST_EMPTY(PDAs) else font_index = MODE_MONO font_mode = FONT_MONO - var/pref_skin = GLOB.pda_reskins[C.prefs.pda_skin] + var/pref_skin = GLOB.pda_reskins[C.prefs.pda_skin]["icon"] if(icon != pref_skin) icon = pref_skin new_overlays = TRUE diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index 4930f39b31..b389efe542 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -193,34 +193,29 @@ /obj/item/melee/transforming/energy/sword/saber possible_colors = list("red" = LIGHT_COLOR_RED, "blue" = LIGHT_COLOR_LIGHT_CYAN, "green" = LIGHT_COLOR_GREEN, "purple" = LIGHT_COLOR_LAVENDER) - unique_reskin = list("Sword" = "sword0", "Saber" = "esaber0") + unique_reskin = list( + "Sword" = list("icon_state" = "sword0"), + "Saber" = list("icon_state" = "esaber0") + ) var/hacked = FALSE - var/saber = FALSE /obj/item/melee/transforming/energy/sword/saber/transform_weapon(mob/living/user, supress_message_text) . = ..() if(.) - if(active) - if(sword_color) - if(saber) - icon_state = "esaber[sword_color]" - else - icon_state = "sword[sword_color]" - else - if(saber) - icon_state = "esaber0" + switch(current_skin) + if("Saber") + icon_state = "esaber[active ? sword_color : "0"]" + // No skin else - icon_state = "sword0" + icon_state = "sword[active ? sword_color : "0"]" /obj/item/melee/transforming/energy/sword/saber/reskin_obj(mob/M) . = ..() - if(icon_state == "esaber0") - saber = TRUE - if(active) - if(saber) - icon_state = "esaber[sword_color]" - else - icon_state = "sword[sword_color]" + switch(current_skin) + if("Sword") + icon_state = "sword[active ? sword_color : "0"]" + if("Saber") + icon_state = "esaber[active ? sword_color : "0"]" /obj/item/melee/transforming/energy/sword/saber/set_sword_color(var/color_forced) if(color_forced) // wow i really do not like this at fucking all holy SHIT 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/items/tanks/jetpack.dm b/code/game/objects/items/tanks/jetpack.dm index 642dc79076..dfd53b3a0d 100644 --- a/code/game/objects/items/tanks/jetpack.dm +++ b/code/game/objects/items/tanks/jetpack.dm @@ -23,21 +23,6 @@ QDEL_NULL(ion_trail) return ..() -/obj/item/tank/jetpack/item_action_slot_check(slot) - if(slot == ITEM_SLOT_BACK) - return TRUE - -/obj/item/tank/jetpack/equipped(mob/user, slot, initial) - . = ..() - if(on && slot != ITEM_SLOT_BACK) - turn_off(user) - -/obj/item/tank/jetpack/dropped(mob/user, silent) - . = ..() - if(on) - turn_off(user) - - /obj/item/tank/jetpack/populate_gas() if(gas_type) air_contents.set_moles(gas_type, ((6 * ONE_ATMOSPHERE) * volume / (R_IDEAL_GAS_EQUATION * T20C))) @@ -72,7 +57,6 @@ icon_state = "[initial(icon_state)]-on" ion_trail.start() RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/move_react) - RegisterSignal(user, COMSIG_MOVABLE_SPACEMOVE, .proc/spacemove_react) if(full_speed) user.add_movespeed_modifier(/datum/movespeed_modifier/jetpack/fullspeed) else @@ -110,13 +94,6 @@ else ..() -/obj/item/tank/jetpack/proc/spacemove_react(mob/user, movement_dir) - SIGNAL_HANDLER - - if(on && (movement_dir || stabilizers)) - return COMSIG_MOVABLE_STOP_SPACEMOVE - - /obj/item/tank/jetpack/improvised name = "improvised jetpack" desc = "A jetpack made from two air tanks, a fire extinguisher and some atmospherics equipment. It doesn't look like it can hold much." @@ -262,13 +239,9 @@ return /mob/living/carbon/get_jetpack() - var/obj/item/I = back - if(istype(I, /obj/item/tank/jetpack)) - return I - else if(istype(I, /obj/item/mod/control)) - var/obj/item/mod/control/C = I - for(var/obj/item/mod/module/jetpack/J in C.modules) - return J + var/obj/item/tank/jetpack/J = back + if(istype(J)) + return J /mob/living/carbon/human/get_jetpack() var/obj/item/tank/jetpack/J = ..() diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 4ea25bec96..cfe1afad5a 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -28,9 +28,17 @@ var/resistance_flags = NONE // INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ON_FIRE | UNACIDABLE | ACID_PROOF var/persistence_replacement //have something WAY too amazing to live to the next round? Set a new path here. Overuse of this var will make me upset. - var/current_skin //the item reskin - var/list/unique_reskin //List of options to reskin. + + //Reskin variables + /// The item reskin + var/current_skin + /// List of options to reskin. + var/list/unique_reskin + /// Can always be modified var/always_reskinnable = FALSE + /// How to bring up the reskinning menu + var/reskin_binding = COMSIG_CLICK_ALT + // // Access levels, used in modules\jobs\access.dm var/list/req_access @@ -76,6 +84,10 @@ var/turf/T = loc T.add_blueprints_preround(src) +/obj/ComponentInitialize() + . = ..() + if(islist(unique_reskin) && length(unique_reskin)) + AddElement(/datum/element/object_reskinning) /obj/Destroy(force=FALSE) if(!ismachinery(src)) @@ -340,50 +352,10 @@ . = ..() if(obj_flags & UNIQUE_RENAME) . += "Use a pen on it to rename it or change its description." - if(unique_reskin && (!current_skin || always_reskinnable)) - . += "Alt-click it to reskin it." -/obj/AltClick(mob/user) - . = ..() - if(unique_reskin && (!current_skin || always_reskinnable) && user.canUseTopic(src, BE_CLOSE, NO_DEXTERY)) - reskin_obj(user) - return TRUE - -/obj/proc/reskin_obj(mob/M) - if(!LAZYLEN(unique_reskin)) - return - - var/list/items = list() - for(var/reskin_option in unique_reskin) - var/image/item_image = image(icon = src.icon, icon_state = unique_reskin[reskin_option]) - items += list("[reskin_option]" = item_image) - sortList(items) - - var/pick = show_radial_menu(M, src, items, custom_check = CALLBACK(src, .proc/check_reskin_menu, M), radius = 38, require_near = TRUE) - if(!pick) - return - if(!unique_reskin[pick]) - return - current_skin = pick - icon_state = unique_reskin[pick] - to_chat(M, "[src] is now skinned as '[pick].'") - -/** - * Checks if we are allowed to interact with a radial menu for reskins - * - * Arguments: - * * user The mob interacting with the menu - */ -/obj/proc/check_reskin_menu(mob/user) - if(QDELETED(src)) - return FALSE - if(current_skin) - return FALSE - if(!istype(user)) - return FALSE - if(user.incapacitated()) - return FALSE - return TRUE +/// Do you want to make overrides, of course you do! Will be called if an object was reskinned successfully +/obj/proc/reskin_obj(mob/user) + return /obj/update_overlays() . = ..() diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index 289599efb9..4b405ae64a 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -32,8 +32,6 @@ new /obj/item/clothing/head/beret/ce/white(src) new /obj/item/storage/bag/construction(src) new /obj/item/storage/bag/material(src) - new /obj/item/mod/construction/armor/advanced(src) - new /obj/item/mod/module/rad_protection(src) /obj/structure/closet/secure_closet/engineering_electrical name = "electrical supplies locker" diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index 234750ea43..babb047c8d 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -64,8 +64,6 @@ new /obj/item/clothing/glasses/hud/health(src) new /obj/item/pinpointer/crew(src) new /obj/item/sensor_device(src) - new /obj/item/mod/construction/armor/rescue(src) - new /obj/item/mod/module/health_analyzer(src) return /obj/structure/closet/secure_closet/CMO diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm index a7b0153ef0..135e0685c1 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm @@ -31,4 +31,4 @@ new /obj/item/circuitboard/machine/techfab/department/science(src) new /obj/item/storage/photo_album/RD(src) new /obj/item/clothing/suit/hooded/wintercoat/rd(src) - new /obj/item/mod/construction/armor/research(src) + diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 4a19dcdb8f..d96ad3b0d6 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -17,8 +17,6 @@ new /obj/item/gun/energy/e_gun(src) new /obj/item/door_remote/captain(src) new /obj/item/storage/photo_album/Captain(src) - new /obj/item/mod/construction/armor/magnate(src) - new /obj/item/mod/module/holster(src) /obj/structure/closet/secure_closet/hop name = "\proper head of personnel's locker" 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/cargo/packs/science.dm b/code/modules/cargo/packs/science.dm index 96d9a97b5f..125bfe2034 100644 --- a/code/modules/cargo/packs/science.dm +++ b/code/modules/cargo/packs/science.dm @@ -238,14 +238,3 @@ contains = list(/obj/item/raw_anomaly_core/pyro) crate_name = "raw pyro anomaly" crate_type = /obj/structure/closet/crate/secure/science - -/datum/supply_pack/science/mod_core - name = "MOD core Crate" - desc = "Three cores, perfect for any MODsuit construction! Naturally harvested™, of course." - cost = CARGO_CRATE_VALUE * 3 - access = ACCESS_ROBOTICS - contains = list(/obj/item/mod/construction/core, - /obj/item/mod/construction/core, - /obj/item/mod/construction/core) - crate_name = "MOD core crate" - crate_type = /obj/structure/closet/crate/secure/science 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/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index d3ad2ca4c7..efa00ef888 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -79,16 +79,18 @@ to_chat(user, "With [src] off of your arms, you feel less ready to punch things.") /obj/item/clothing/gloves/fingerless/pugilist/crafted - unique_reskin = list("Short" = "armwraps", - "Extended" = "armwraps_extended" - ) + unique_reskin = list( + "Short" = list("icon_state" = "armwraps"), + "Extended" = list("icon_state" = "armwraps_extended") + ) /obj/item/clothing/gloves/fingerless/pugilist/crafted/reskin_obj(mob/M) . = ..() - if(icon_state == "armwraps_extended") - item_state = "armwraps_extended" - else - return + switch(current_skin) + if("Short") + item_state = "armwraps" + if("Extended") + item_state = "armwraps_extended" /obj/item/clothing/gloves/fingerless/pugilist/chaplain name = "armwraps of unyielding resolve" 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 cdf5512fc6..7c1fc6fe3d 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -275,8 +275,10 @@ pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes actions_types = list(/datum/action/item_action/bhop) permeability_coefficient = 0.05 - unique_reskin = list("Explorer" = "miningjet", - "Jackboot" = "jetboots") + unique_reskin = list( + "Explorer" = list("icon_state" = "miningjet"), + "Jackboot" = list("icon_state" = "jetboots") + ) var/jumpdistance = 5 //-1 from to see the actual distance, e.g 4 goes over 3 tiles var/jumpspeed = 3 var/recharging_rate = 60 //default 6 seconds between each dash diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index c13a8bfa66..36795d53b8 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -80,9 +80,10 @@ item_state = "hostrench" flags_inv = 0 strip_delay = 80 - unique_reskin = list("Coat" = "hostrench", - "Cloak" = "trenchcloak" - ) + unique_reskin = list( + "Coat" = list("icon_state" = "hostrench"), + "Cloak" = list("icon_state" = "trenchcloak") + ) /obj/item/clothing/suit/armor/hos/platecarrier name = "plate carrier" diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm index 6d477a0590..f481d83009 100644 --- a/code/modules/clothing/under/accessories.dm +++ b/code/modules/clothing/under/accessories.dm @@ -565,10 +565,15 @@ icon_state = "pride" above_suit = TRUE obj_flags = UNIQUE_RENAME - unique_reskin = list("Rainbow Pride" = "pride", - "Bisexual Pride" = "pride_bi", - "Pansexual Pride" = "pride_pan", - "Asexual Pride" = "pride_ace", - "Non-binary Pride" = "pride_enby", - "Transgender Pride" = "pride_trans", - ) + unique_reskin = list( + "Rainbow Pride" = list("icon_state" = "pride"), + "Bisexual Pride" = list("icon_state" = "pride_bi"), + "Pansexual Pride" = list("icon_state" = "pride_pan"), + "Asexual Pride" = list("icon_state" = "pride_ace"), + "Non-binary Pride" = list("icon_state" = "pride_enby"), + "Transgender Pride" = list("icon_state" = "pride_trans") + ) + +/obj/item/clothing/accessory/pride/reskin_obj(mob/M) + . = ..() + name = "[current_skin] pin" diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index e297df8238..9a05f97cc7 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 4c38fc4cf2..6371aaaa9f 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 5339b5927c..cfe1057f8d 100644 --- a/code/modules/jobs/job_types/head_of_security.dm +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -38,6 +38,10 @@ display_order = JOB_DISPLAY_ORDER_HEAD_OF_SECURITY 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" 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 2b374921be..73f6c5da5e 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 8ea7579127..dd79768282 100644 --- a/code/modules/jobs/job_types/quartermaster.dm +++ b/code/modules/jobs/job_types/quartermaster.dm @@ -32,6 +32,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 1b06d050b7..b1f7475da5 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -28,6 +28,11 @@ display_order = JOB_DISPLAY_ORDER_SECURITY_OFFICER 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() 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..714c599024 100644 --- a/code/modules/jobs/job_types/warden.dm +++ b/code/modules/jobs/job_types/warden.dm @@ -29,6 +29,10 @@ display_order = JOB_DISPLAY_ORDER_WARDEN 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() diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index 3c2a4541b2..68ca1c979d 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -253,8 +253,10 @@ sharpness = SHARP_NONE // use your survival dagger or smth icon_state = "crusher-hands" item_state = "crusher0-fist" - unique_reskin = list("Gauntlets" = "crusher-hands", - "Fingerless" = "crusher-hands-bare") + unique_reskin = list( + "Gauntlets" = list("icon_state" = "crusher-hands"), + "Fingerless" = list("icon_state" = "crusher-hands-bare") + ) detonation_damage = 45 // 60 on wield, compared to normal crusher's 70 backstab_bonus = 70 // 130 on backstab though var/combo_on_anything = FALSE // @admins if you're varediting this you don't get to whine at me diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 51659a2904..203c578c2c 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -337,7 +337,6 @@ on_item_dropped(I) if(I.dropped(src) == ITEM_RELOCATED_BY_DROPPED) return FALSE - SEND_SIGNAL(src, COMSIG_MOB_UNEQUIPPED_ITEM, I, force, newloc, no_move, invdrop, silent) return TRUE //This is a SAFE proc. Use this instead of equip_to_slot()! diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index daedb7a2b3..e12a28d01a 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -27,8 +27,8 @@ if(prob(40)) if(prob(25)) audible_message("You hear something rumbling inside [src]'s stomach...", \ - "You hear something rumbling.", 4,\ - "Something is rumbling inside your stomach!") + "You hear something rumbling.", 4,\ + "Something is rumbling inside your stomach!") var/obj/item/I = user.get_active_held_item() if(I && I.force) var/d = rand(round(I.force / 4), I.force) @@ -624,21 +624,12 @@ if(M.name == XRAY) sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS) see_in_dark = max(see_in_dark, 8) - - if(HAS_TRAIT(src, TRAIT_TRUE_NIGHT_VISION)) - lighting_alpha = min(lighting_alpha, LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE) - see_in_dark = max(see_in_dark, 8) - - if(HAS_TRAIT(src, TRAIT_MESON_VISION)) - sight |= SEE_TURFS - lighting_alpha = min(lighting_alpha, LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE) - if(HAS_TRAIT(src, TRAIT_THERMAL_VISION)) - sight |= SEE_MOBS + sight |= (SEE_MOBS) lighting_alpha = min(lighting_alpha, LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE) if(HAS_TRAIT(src, TRAIT_XRAY_VISION)) - sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS + sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS) see_in_dark = max(see_in_dark, 8) if(see_override) diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm index e70b1bcc92..ffb8523a9e 100644 --- a/code/modules/mob/living/carbon/carbon_movement.dm +++ b/code/modules/mob/living/carbon/carbon_movement.dm @@ -16,15 +16,9 @@ if(istype(T) && movement_dir && T.allow_thrust(0.01)) return 1 - var/obj/item/I = get_jetpack() - if(istype(I, /obj/item/tank/jetpack)) - var/obj/item/tank/jetpack/J = I - if((movement_dir || J.stabilizers) && J.allow_thrust(0.01, src)) - return 1 - else if(istype(I, /obj/item/mod/module/jetpack)) - var/obj/item/mod/module/jetpack/J = I - if((movement_dir || J.stabilizers) && J.allow_thrust()) - return 1 + var/obj/item/tank/jetpack/J = get_jetpack() + if(istype(J) && (movement_dir || J.stabilizers) && J.allow_thrust(0.01, src)) + return 1 /mob/living/carbon/Moved() . = ..() diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 85bef76d98..4c30a1d742 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -304,14 +304,7 @@ if(equip_to_slot_if_possible(thing, ITEM_SLOT_BACK)) update_inv_hands() return - var/datum/component/storage/storage = equipped_back.GetComponent(/datum/component/storage) - if(istype(equipped_back, /obj/item/mod/control)) - var/obj/item/mod/control/C = equipped_back - for(var/obj/item/mod/module/storage/S in C.modules) - if(S.stored) - equipped_back = S.stored - storage = S.stored.GetComponent(/datum/component/storage) - if(!storage) + if(!SEND_SIGNAL(equipped_back, COMSIG_CONTAINS_STORAGE)) // not a storage item if(!thing) equipped_back.attack_hand(src) else @@ -321,11 +314,10 @@ if(!SEND_SIGNAL(equipped_back, COMSIG_TRY_STORAGE_INSERT, thing, src)) to_chat(src, "You can't fit anything in!") return - var/atom/real_location = storage.real_location() - if(!real_location.contents.len) // nothing to take out - to_chat(src, "There's nothing in your [equipped_back.name] to take out!") + if(!equipped_back.contents.len) // nothing to take out + to_chat(src, "There's nothing in your backpack to take out!") return - var/obj/item/stored = real_location.contents[real_location.contents.len] + var/obj/item/stored = equipped_back.contents[equipped_back.contents.len] if(!stored || stored.on_found(src)) return stored.attack_hand(src) // take out thing from backpack diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 94e0685e62..10f064423c 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -231,6 +231,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 // /////////// 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 bddb0cdc56..1e58e995c2 100644 --- a/code/modules/mob/living/carbon/human/species_types/bugmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/bugmen.dm @@ -24,3 +24,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 8c9e6bcd4f..f6749dde06 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 /datum/species/ipc/on_species_gain(mob/living/carbon/human/C) 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 9ecf25a3a6..6f48d9022d 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -34,6 +34,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 c334e6ef3e..ffdc23a5a7 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -33,6 +33,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) 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 aa853ee551..a209da270f 100644 --- a/code/modules/mob/living/carbon/human/species_types/synthliz.dm +++ b/code/modules/mob/living/carbon/human/species_types/synthliz.dm @@ -36,3 +36,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/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 08098b818f..2e9030765a 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -38,8 +38,8 @@ var/can_be_carded = TRUE var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list(), "Camera"=list(), "Burglar"=list()) var/viewalerts = 0 - var/icon/holo_icon //Female is assigned when AI is created. - var/obj/controlled_equipment //A piece of equipment, to determine whether to relaymove or use the AI eye. + var/icon/holo_icon//Female is assigned when AI is created. + var/obj/vehicle/sealed/mecha/controlled_mech //For controlled_mech a mech, to determine whether to relaymove or use the AI eye. var/radio_enabled = TRUE //Determins if a carded AI can speak with its built in radio or not. radiomod = ";" //AIs will, by default, state their laws on the internal radio. var/obj/item/pda/ai/aiPDA @@ -99,13 +99,6 @@ var/display_icon_override var/emote_display = "Neutral" //text string of the current emote we set for the status displays, to prevent logins resetting it. - var/datum/robot_control/robot_control - /// Station alert datum for showing alerts UI - var/datum/station_alert/alert_control - ///remember AI's last location - var/atom/lastloc - interaction_range = INFINITY - /mob/living/silicon/ai/Initialize(mapload, datum/ai_laws/L, mob/target_ai) . = ..() if(!target_ai) //If there is no player/brain inside. @@ -180,21 +173,10 @@ GLOB.ai_list -= src GLOB.shuttle_caller_list -= src SSshuttle.autoEvac() - QDEL_NULL(eyeobj) // No AI, no Eye - QDEL_NULL(spark_system) - QDEL_NULL(malf_picker) - QDEL_NULL(doomsday_device) - // TODO: Why these no work? - // QDEL_NULL(robot_control) - QDEL_NULL(aiMulti) - // QDEL_NULL(alert_control) + qdel(eyeobj) // No AI, no Eye malfhack = null - current = null - Bot = null - controlled_equipment = null - linked_core = null - apc_override = null - return ..() + + . = ..() /mob/living/silicon/ai/IgniteMob() fire_stacks = 0 @@ -428,7 +410,7 @@ if (href_list["ai_take_control"]) //Mech domination var/obj/vehicle/sealed/mecha/M = locate(href_list["ai_take_control"]) - if(controlled_equipment) + if(controlled_mech) to_chat(src, "You are already loaded into an onboard computer!") return if(!GLOB.cameranet.checkCameraVis(M)) 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.dm b/code/modules/mob/living/silicon/pai/pai.dm index 1a7747ce89..d18014f4d6 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -200,13 +200,6 @@ /mob/living/silicon/pai/restrained(ignore_grab) . = FALSE -/mob/living/silicon/pai/can_interact_with(atom/target) - if(istype(target, /obj/item/mod/control)) // A poor workaround for enabling MODsuit control - var/obj/item/mod/control/C = target - if(C.ai == src) - return TRUE - return ..() - // See software.dm for Topic() /mob/living/silicon/pai/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=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/mob.dm b/code/modules/mob/mob.dm index baa4d87075..507a94b613 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -722,7 +722,7 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0) return pick(protection_sources) else return src - if((magic && HAS_TRAIT(src, TRAIT_ANTIMAGIC)) || (!self && magic && HAS_TRAIT(src, TRAIT_ANTIMAGIC_NO_SELFBLOCK)) || (holy && HAS_TRAIT(src, TRAIT_HOLY))) + if((magic && HAS_TRAIT(src, TRAIT_ANTIMAGIC)) || (holy && HAS_TRAIT(src, TRAIT_HOLY))) return src //You can buckle on mobs if you're next to them since most are dense diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index cdad94cf3f..90a7aae95e 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -585,7 +585,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp //Can the mob see reagents inside of containers? /mob/proc/can_see_reagents() - return stat == DEAD || silicon_privileges || HAS_TRAIT(src, TRAIT_REAGENT_SCANNER) //Dead guys and silicons can always see reagents + return stat == DEAD || silicon_privileges //Dead guys and silicons can always see reagents /mob/proc/is_blind() SHOULD_BE_PURE(TRUE) diff --git a/code/modules/mod/mod_actions.dm b/code/modules/mod/mod_actions.dm deleted file mode 100644 index ee28771ef1..0000000000 --- a/code/modules/mod/mod_actions.dm +++ /dev/null @@ -1,94 +0,0 @@ -/datum/action/item_action/mod - background_icon_state = "bg_tech_blue" - icon_icon = 'icons/mob/actions/actions_mod.dmi' - check_flags = AB_CHECK_CONSCIOUS - var/obj/item/mod/control/mod - /// Whether this action is intended for the AI. Stuff breaks a lot if this is done differently. - var/ai_action = FALSE - -/datum/action/item_action/mod/New(Target) - ..() - if(!istype(Target, /obj/item/mod/control)) - qdel(src) - return - if(ai_action) - background_icon_state = "bg_tech" - -/datum/action/item_action/mod/Grant(mob/user) - mod = target - if(ai_action && user != mod.ai) - return - else if(!ai_action && user == mod.ai) - return - return ..() - -/datum/action/item_action/mod/Remove(mob/user) - if(ai_action && mod && user != mod.ai) - return - else if(!ai_action && mod && user == mod.ai) - return - return ..() - -/datum/action/item_action/mod/Trigger(trigger_flags) - if(!IsAvailable()) - return FALSE - if(mod.malfunctioning && prob(75)) - mod.balloon_alert(usr, "button malfunctions!") - return FALSE - return TRUE - -/datum/action/item_action/mod/deploy - name = "Deploy MODsuit" - desc = "Deploy/Conceal a part of the MODsuit." - button_icon_state = "deploy" - -/datum/action/item_action/mod/deploy/Trigger() - if(!IsAvailable()) - return FALSE - mod.choose_deploy(usr) - return TRUE - -/datum/action/item_action/mod/deploy/ai - ai_action = TRUE - -/datum/action/item_action/mod/activate - name = "Activate MODsuit" - desc = "Activate/Deactivate the MODsuit." - button_icon_state = "activate" - -/datum/action/item_action/mod/activate/Trigger() - if(!IsAvailable()) - return FALSE - mod.toggle_activate(usr) - return TRUE - -/datum/action/item_action/mod/activate/ai - ai_action = TRUE - -/datum/action/item_action/mod/module - name = "Toggle Module" - desc = "Toggle a MODsuit module." - button_icon_state = "module" - -/datum/action/item_action/mod/module/Trigger() - if(!IsAvailable()) - return FALSE - mod.quick_module(usr) - return TRUE - -/datum/action/item_action/mod/module/ai - ai_action = TRUE - -/datum/action/item_action/mod/panel - name = "MODsuit Panel" - desc = "Open the MODsuit's panel." - button_icon_state = "panel" - -/datum/action/item_action/mod/panel/Trigger() - if(!IsAvailable()) - return FALSE - mod.ui_interact(usr) - return TRUE - -/datum/action/item_action/mod/panel/ai - ai_action = TRUE diff --git a/code/modules/mod/mod_activation.dm b/code/modules/mod/mod_activation.dm deleted file mode 100644 index 660f0311d1..0000000000 --- a/code/modules/mod/mod_activation.dm +++ /dev/null @@ -1,246 +0,0 @@ -/// Creates a radial menu from which the user chooses parts of the suit to deploy/retract. Repeats until all parts are extended or retracted. -/obj/item/mod/control/proc/choose_deploy(mob/user) - if(!length(mod_parts)) - return - var/list/display_names = list() - var/list/items = list() - for(var/obj/item/piece as anything in mod_parts) - display_names[piece.name] = REF(piece) - var/image/piece_image = image(icon = piece.icon, icon_state = piece.icon_state) - items += list(piece.name = piece_image) - var/pick = show_radial_menu(user, src, items, custom_check = FALSE, require_near = TRUE, tooltips = TRUE) - if(!pick) - return - var/part_reference = display_names[pick] - var/obj/item/part = locate(part_reference) in mod_parts - if(!istype(part) || user.incapacitated()) - return - if(active || activating) - balloon_alert(user, "deactivate the suit first!") - playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) - return - var/parts_to_check = mod_parts - part - if(part.loc == src) - deploy(user, part) - for(var/obj/item/piece as anything in parts_to_check) - if(piece.loc != src) - continue - choose_deploy(user) - break - else - conceal(user, part) - for(var/obj/item/piece as anything in parts_to_check) - if(piece.loc == src) - continue - choose_deploy(user) - break - -/// Deploys a part of the suit onto the user. -/obj/item/mod/control/proc/deploy(mob/user, part) - var/obj/item/piece = part - if(piece == gauntlets && wearer.gloves) - gauntlets.overslot = wearer.gloves - wearer.transferItemToLoc(gauntlets.overslot, gauntlets, force = TRUE) - if(piece == boots && wearer.shoes) - boots.overslot = wearer.shoes - wearer.transferItemToLoc(boots.overslot, boots, force = TRUE) - if(wearer.equip_to_slot_if_possible(piece, piece.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE)) - ADD_TRAIT(piece, TRAIT_NODROP, MOD_TRAIT) - if(!user) - return TRUE - wearer.visible_message(span_notice("[wearer]'s [piece] deploy[piece.p_s()] with a mechanical hiss."), - span_notice("[piece] deploy[piece.p_s()] with a mechanical hiss."), - span_hear("You hear a mechanical hiss.")) - playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - return TRUE - else if(piece.loc != src) - if(!user) - return FALSE - balloon_alert(user, "[piece] already deployed!") - playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) - else - if(!user) - return FALSE - balloon_alert(user, "bodypart clothed!") - playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) - return FALSE - -/// Retract a part of the suit from the user -/obj/item/mod/control/proc/conceal(mob/user, part) - var/obj/item/piece = part - REMOVE_TRAIT(piece, TRAIT_NODROP, MOD_TRAIT) - if(wearer) - wearer.transferItemToLoc(piece, src, force = TRUE) - if(piece == gauntlets) - gauntlets.show_overslot() - if(piece == boots) - boots.show_overslot() - if(!user) - return - wearer.visible_message(span_notice("[wearer]'s [piece] retract[piece.p_s()] back into [src] with a mechanical hiss."), - span_notice("[piece] retract[piece.p_s()] back into [src] with a mechanical hiss."), - span_hear("You hear a mechanical hiss.")) - playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - -/// Starts the activation sequence, where parts of the suit activate one by one until the whole suit is on -/obj/item/mod/control/proc/toggle_activate(mob/user, force_deactivate = FALSE) - if(!wearer) - if(!force_deactivate) - balloon_alert(user, "put suit on back!") - playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) - return FALSE - if(!force_deactivate && (SEND_SIGNAL(src, COMSIG_MOD_ACTIVATE, user) & MOD_CANCEL_ACTIVATE)) - playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) - return FALSE - for(var/obj/item/part as anything in mod_parts) - if(!force_deactivate && part.loc == src) - balloon_alert(user, "deploy all parts first!") - playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) - return FALSE - if(locked && !active && !allowed(user) && !force_deactivate) - balloon_alert(user, "access insufficient!") - playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) - return FALSE - if(!cell?.charge && !force_deactivate) - balloon_alert(user, "suit not powered!") - playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) - return FALSE - if(open && !force_deactivate) - balloon_alert(user, "close the suit panel!") - playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) - return FALSE - if(activating) - if(!force_deactivate) - balloon_alert(user, "suit already [active ? "shutting down" : "starting up"]!") - playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) - return FALSE - for(var/obj/item/mod/module/module as anything in modules) - if(!module.active || module.allowed_inactive) - continue - module.on_deactivation() - activating = TRUE - to_chat(wearer, span_notice("MODsuit [active ? "shutting down" : "starting up"].")) - if(ai) - to_chat(ai, span_notice("MODsuit [active ? "shutting down" : "starting up"].")) - - if(force_deactivate) - seal_part(boots, seal = FALSE) - seal_part(gauntlets, seal = FALSE) - seal_part(chestplate,seal = FALSE) - seal_part(helmet, seal = FALSE) - finish_activation(on = FALSE) - activating = FALSE - to_chat(wearer, span_notice("Systems shut down. Parts unsealed. Goodbye, [wearer].")) - if(ai) - to_chat(ai, span_notice("SYSTEMS DEACTIVATED. GOODBYE: \"[ai]\"")) - playsound(src, 'sound/machines/synth_no.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 6000) - return TRUE - - if(do_after(wearer, activation_step_time, target = wearer, required_mobility_flags = NONE)) - to_chat(wearer, span_notice("[boots] [active ? "relax their grip on your legs" : "seal around your feet"].")) - playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - seal_part(boots, seal = !active) - else - return toggle_activate_fail() - if(do_after(wearer, activation_step_time, target = wearer, required_mobility_flags = NONE)) - to_chat(wearer, span_notice("[gauntlets] [active ? "become loose around your fingers" : "tighten around your fingers and wrists"].")) - playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - seal_part(gauntlets, seal = !active) - else - return toggle_activate_fail() - if(do_after(wearer, activation_step_time, target = wearer, required_mobility_flags = NONE)) - to_chat(wearer, span_notice("[chestplate] [active ? "releases your chest" : "cinches tightly against your chest"].")) - playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - seal_part(chestplate,seal = !active) - else - return toggle_activate_fail() - if(do_after(wearer, activation_step_time, target = wearer, required_mobility_flags = NONE)) - to_chat(wearer, span_notice("[helmet] hisses [active ? "open" : "closed"].")) - playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - seal_part(helmet, seal = !active) - else - return toggle_activate_fail() - if(do_after(wearer, activation_step_time, target = wearer, required_mobility_flags = NONE)) - to_chat(wearer, span_notice("Systems [active ? "shut down. Parts unsealed. Goodbye" : "started up. Parts sealed. Welcome"], [wearer].")) - if(ai) - to_chat(ai, span_notice("SYSTEMS [active ? "DEACTIVATED. GOODBYE" : "ACTIVATED. WELCOME"]: \"[ai]\"")) - finish_activation(on = !active) - if(active) - playsound(src, 'sound/machines/synth_yes.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 6000) - SEND_SOUND(wearer, sound('sound/mecha/nominal.ogg',volume=50)) - else - playsound(src, 'sound/machines/synth_no.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 6000) - else - return toggle_activate_fail() - activating = FALSE - return TRUE - -/obj/item/mod/control/proc/toggle_activate_fail() - seal_part(boots, seal = active) - seal_part(gauntlets, seal = active) - seal_part(chestplate,seal = active) - seal_part(helmet, seal = active) - to_chat(wearer, span_warning("[active ? "Shut down" : "Start up"] cancelled.")) - finish_activation(on = active) - activating = FALSE - return FALSE - -///Seals or unseals the given part -/obj/item/mod/control/proc/seal_part(obj/item/clothing/part, seal) - if(seal) - part.clothing_flags |= part.visor_flags - part.flags_inv |= part.visor_flags_inv - part.flags_cover |= part.visor_flags_cover - part.heat_protection = initial(part.heat_protection) - part.cold_protection = initial(part.cold_protection) - else - part.flags_cover &= ~part.visor_flags_cover - part.flags_inv &= ~part.visor_flags_inv - part.clothing_flags &= ~part.visor_flags - part.heat_protection = NONE - part.cold_protection = NONE - part.icon_state = "[skin]-[initial(part.icon_state)][seal ? "-sealed" : ""]" - part.item_state = "[skin]-[initial(part.item_state)][seal ? "-sealed" : ""]" - if(part == boots) - wearer.update_inv_shoes() - if(part == gauntlets) - wearer.update_inv_gloves() - if(part == chestplate) - wearer.update_inv_wear_suit() - wearer.update_inv_w_uniform() - if(part == helmet) - if(seal) - helmet.alternate_worn_layer = null - else - helmet.alternate_worn_layer = helmet.alternate_layer - wearer.update_inv_head() - wearer.update_inv_wear_mask() - wearer.update_hair() - -/// Finishes the suit's activation, starts processing -/obj/item/mod/control/proc/finish_activation(on) - icon_state = "[skin]-control[on ? "-sealed" : ""]" - slowdown = on ? slowdown_active : slowdown_inactive - if(on) - for(var/obj/item/mod/module/module as anything in modules) - module.on_suit_activation() - START_PROCESSING(SSobj, src) - else - for(var/obj/item/mod/module/module as anything in modules) - module.on_suit_deactivation() - STOP_PROCESSING(SSobj, src) - wearer.update_equipment_speed_mods() - active = on - wearer.update_inv_back() - -/// Quickly deploys all the suit parts and if successful, seals them and turns on the suit. Intended mostly for outfits. -/obj/item/mod/control/proc/quick_activation() - var/seal = TRUE - for(var/obj/item/part in mod_parts) - if(!deploy(null, part)) - seal = FALSE - if(!seal) - return - for(var/obj/item/part in mod_parts) - seal_part(part, seal = TRUE) - finish_activation(on = TRUE) diff --git a/code/modules/mod/mod_ai.dm b/code/modules/mod/mod_ai.dm deleted file mode 100644 index 8bc431146b..0000000000 --- a/code/modules/mod/mod_ai.dm +++ /dev/null @@ -1,198 +0,0 @@ -/obj/item/mod/control/transfer_ai(interaction, mob/user, mob/living/silicon/ai/intAI, obj/item/aicard/card) - . = ..() - if(!.) - return - if(!open) //mod must be open - balloon_alert(user, "suit must be open to transfer!") - return - switch(interaction) - if(AI_TRANS_TO_CARD) - if(!ai) - balloon_alert(user, "no AI in suit!") - return - if(!isAI(ai)) - balloon_alert(user, "onboard AI cannot fit in this card!") - return - balloon_alert(user, "transferring to card...") - if(!do_after(user, 5 SECONDS, target = src)) - balloon_alert(user, "interrupted!") - return - if(!ai) - return - intAI = ai - intAI.ai_restore_power()//So the AI initially has power. - intAI.control_disabled = TRUE - intAI.radio_enabled = FALSE - intAI.disconnect_shell() - intAI.forceMove(card) - card.AI = intAI - for(var/datum/action/action as anything in actions) - action.Remove(intAI) - intAI.controlled_equipment = null - intAI.remote_control = null - balloon_alert(intAI, "transferred to a card") - balloon_alert(user, "AI transferred to card") - ai = null - - if(AI_TRANS_FROM_CARD) //Using an AI card to upload to the suit. - intAI = card.AI - if(!intAI) - balloon_alert(user, "no AI in card!") - return - if(ai) - balloon_alert(user, "already has AI!") - return - if(intAI.deployed_shell) //Recall AI if shelled so it can be checked for a client - intAI.disconnect_shell() - if(intAI.stat || !intAI.client) - balloon_alert(user, "AI unresponsive!") - return - balloon_alert(user, "transferring to suit...") - if(!do_after(user, 5 SECONDS, target = src)) - balloon_alert(user, "interrupted!") - return - if(ai) - return - balloon_alert(user, "AI transferred to suit") - ai_enter_mod(intAI) - card.AI = null - -/obj/item/mod/control/proc/ai_enter_mod(mob/living/silicon/ai/new_ai) - new_ai.control_disabled = FALSE - new_ai.radio_enabled = TRUE - new_ai.ai_restore_power() - new_ai.cancel_camera() - new_ai.controlled_equipment = src - new_ai.remote_control = src - new_ai.forceMove(src) - ai = new_ai - balloon_alert(new_ai, "transferred to a suit") - for(var/datum/action/action as anything in actions) - action.Grant(ai) - -/** - * Simple proc to insert the pAI into the MODsuit. - * - * user - The person trying to put the pAI into the MODsuit. - * card - The pAI card we're slotting in the MODsuit. - */ - -/obj/item/mod/control/proc/insert_pai(mob/user, obj/item/paicard/card) - if(ai) - balloon_alert(user, "AI already installed!") - return - if(!card.pai || !card.pai.mind) - balloon_alert(user, "pAI unresponsive!") - return - balloon_alert(user, "transferring to suit...") - if(!do_after(user, 5 SECONDS, target = src)) - balloon_alert(user, "interrupted!") - return FALSE - if(!user.transferItemToLoc(card, src)) - return - - card.pai.canholo = FALSE - ai = card.pai - balloon_alert(user, "pAI transferred to suit") - balloon_alert(ai, "transferred to a suit") - ai.remote_control = src - for(var/datum/action/action as anything in actions) - action.Grant(ai) - return TRUE - -/** - * Simple proc to extract the pAI from the MODsuit. It's the proc to call if you want to take it out, - * remove_pai() is there so atom_destruction() doesn't have any risk of sleeping. - * - * user - The person trying to take out the pAI from the MODsuit. - * forced - Whether or not we skip the checks and just eject the pAI. Defaults to FALSE. - * feedback - Whether to give feedback via balloon alerts or not. Defaults to TRUE. - */ -/obj/item/mod/control/proc/extract_pai(mob/user, forced = FALSE, feedback = TRUE) - if(!ai) - if(user && feedback) - balloon_alert(user, "no pAI to remove!") - return - if(!ispAI(ai)) - if(user && feedback) - balloon_alert(user, "onboard AI cannot fit in this card!") - return - if(!forced) - if(!open) - if(user && feedback) - balloon_alert(user, "open the suit panel!") - return FALSE - if(!do_after(user, 5 SECONDS, target = src)) - if(user && feedback) - balloon_alert(user, "interrupted!") - return FALSE - - remove_pai(feedback) - - if(feedback && user) - balloon_alert(user, "pAI removed from the suit") - -/** - * Simple proc that handles the safe removal of the pAI from a MOD control unit. - * - * Arguments: - * * feedback - Whether or not we want to give balloon alert feedback to the ai. Defaults to FALSE. - */ -/obj/item/mod/control/proc/remove_pai(feedback = FALSE) - if(!ispAI(ai)) - return - var/mob/living/silicon/pai/pai = ai - var/turf/drop_off = get_turf(src) - if(drop_off) // In case there's no drop_off, the pAI will simply get deleted. - pai.card.forceMove(drop_off) - - for(var/datum/action/action as anything in actions) - if(action.owner == pai) - action.Remove(pai) - - if(feedback) - balloon_alert(pai, "removed from a suit") - pai.remote_control = null - pai.canholo = TRUE - pai = null - -#define MOVE_DELAY 2 -#define WEARER_DELAY 1 -#define LONE_DELAY 5 -#define CELL_PER_STEP (DEFAULT_CHARGE_DRAIN * 2.5) -#define AI_FALL_TIME (1 SECONDS) - -/obj/item/mod/control/relaymove(mob/user, direction) - if((!active && wearer) || !cell || cell.charge < CELL_PER_STEP || user != ai || !COOLDOWN_FINISHED(src, cooldown_mod_move) || (wearer?.pulledby?.grab_state > GRAB_PASSIVE)) - return FALSE - var/timemodifier = MOVE_DELAY * (ISDIAGONALDIR(direction) ? SQRT_2 : 1) * (wearer ? WEARER_DELAY : LONE_DELAY) - if(wearer && !wearer.Process_Spacemove(direction)) - return FALSE - else if(!wearer && (!has_gravity() || !isturf(loc))) - return FALSE - COOLDOWN_START(src, cooldown_mod_move, movedelay * timemodifier + slowdown) - cell.charge = max(0, cell.charge - CELL_PER_STEP) - playsound(src, 'sound/mecha/mechmove01.ogg', 25, TRUE) - if(ismovable(wearer?.loc)) - return wearer.loc.relaymove(wearer, direction) - else if(wearer) - ADD_TRAIT(wearer, TRAIT_MOBILITY_NOREST, MOD_TRAIT) - addtimer(CALLBACK(src, .proc/ai_fall), AI_FALL_TIME, TIMER_UNIQUE | TIMER_OVERRIDE) - var/atom/movable/mover = wearer || src - return step(mover, direction) - -#undef MOVE_DELAY -#undef WEARER_DELAY -#undef LONE_DELAY -#undef CELL_PER_STEP -#undef AI_FALL_TIME - -/obj/item/mod/control/proc/ai_fall() - if(!wearer) - return - REMOVE_TRAIT(wearer, TRAIT_MOBILITY_NOREST, MOD_TRAIT) - -/obj/item/mod/control/ui_state(mob/user) - if(user == ai) - return GLOB.contained_state - return ..() diff --git a/code/modules/mod/mod_clothes.dm b/code/modules/mod/mod_clothes.dm deleted file mode 100644 index 1c50b1926a..0000000000 --- a/code/modules/mod/mod_clothes.dm +++ /dev/null @@ -1,138 +0,0 @@ -/obj/item/clothing/head/helmet/space/mod - name = "MOD helmet" - desc = "A helmet for a MODsuit." - icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi' - mob_overlay_icon = 'icons/mob/clothing/modsuit/mod_clothing.dmi' - anthro_mob_worn_overlay = 'icons/mob/clothing/modsuit/mod_clothing_anthro.dmi' - icon_state = "helmet" - item_state = "helmet" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10) - body_parts_covered = HEAD - heat_protection = HEAD - cold_protection = HEAD - max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT - min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT - clothing_flags = THICKMATERIAL - resistance_flags = NONE - flash_protect = 0 - clothing_flags = NONE - flags_inv = HIDEFACIALHAIR - flags_cover = NONE - visor_flags = THICKMATERIAL|STOPSPRESSUREDAMAGE - visor_flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT - visor_flags_cover = HEADCOVERSMOUTH|HEADCOVERSEYES - var/alternate_layer = NECK_LAYER - var/obj/item/mod/control/mod - mutantrace_variation = STYLE_MUZZLE - -/obj/item/clothing/head/helmet/space/mod/Destroy() - if(!QDELETED(mod)) - mod.helmet = null - mod.mod_parts -= src - QDEL_NULL(mod) - return ..() - -/obj/item/clothing/suit/armor/mod - name = "MOD chestplate" - desc = "A chestplate for a MODsuit." - icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi' - mob_overlay_icon = 'icons/mob/clothing/modsuit/mod_clothing.dmi' - anthro_mob_worn_overlay = 'icons/mob/clothing/modsuit/mod_clothing_anthro.dmi' - icon_state = "chestplate" - item_state = "chestplate" - blood_overlay_type = "armor" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10) - body_parts_covered = CHEST|GROIN - heat_protection = CHEST|GROIN - cold_protection = CHEST|GROIN - max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT - min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT - clothing_flags = THICKMATERIAL - flags_inv = HIDETAUR - visor_flags = STOPSPRESSUREDAMAGE - visor_flags_inv = HIDEJUMPSUIT - allowed = list(/obj/item/flashlight, /obj/item/tank/internals) - resistance_flags = NONE - var/obj/item/mod/control/mod - mutantrace_variation = STYLE_DIGITIGRADE - -/obj/item/clothing/suit/armor/mod/Destroy() - if(!QDELETED(mod)) - mod.chestplate = null - mod.mod_parts -= src - QDEL_NULL(mod) - return ..() - -/obj/item/clothing/gloves/mod - name = "MOD gauntlets" - desc = "A pair of gauntlets for a MODsuit." - icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi' - mob_overlay_icon = 'icons/mob/clothing/modsuit/mod_clothing.dmi' - icon_state = "gauntlets" - item_state = "gauntlets" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10) - body_parts_covered = HANDS|ARMS - heat_protection = HANDS|ARMS - cold_protection = HANDS|ARMS - max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT - min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT - clothing_flags = THICKMATERIAL - resistance_flags = NONE - var/obj/item/mod/control/mod - var/obj/item/clothing/overslot - mutantrace_variation = STYLE_NO_ANTHRO_ICON - -/obj/item/clothing/gloves/mod/Destroy() - if(!QDELETED(mod)) - mod.gauntlets = null - mod.mod_parts -= src - QDEL_NULL(mod) - return ..() - -/// Replaces these gloves on the wearer with the overslot ones - -/obj/item/clothing/gloves/mod/proc/show_overslot() - if(!overslot) - return - if(!mod.wearer.equip_to_slot_if_possible(overslot, overslot.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE)) - mod.wearer.dropItemToGround(overslot, force = TRUE) - overslot = null - -/obj/item/clothing/shoes/mod - name = "MOD boots" - desc = "A pair of boots for a MODsuit." - icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi' - mob_overlay_icon = 'icons/mob/clothing/modsuit/mod_clothing.dmi' - anthro_mob_worn_overlay = 'icons/mob/clothing/modsuit/mod_clothing_anthro.dmi' - icon_state = "boots" - item_state = "boots" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10) - body_parts_covered = FEET|LEGS - heat_protection = FEET|LEGS - cold_protection = FEET|LEGS - max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT - min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT - clothing_flags = THICKMATERIAL - resistance_flags = NONE - item_flags = NONE - var/obj/item/mod/control/mod - var/obj/item/clothing/overslot - mutantrace_variation = STYLE_DIGITIGRADE - -/obj/item/clothing/shoes/mod/Destroy() - if(!QDELETED(mod)) - mod.boots = null - mod.mod_parts -= src - QDEL_NULL(mod) - return ..() - -/// Replaces these shoes on the wearer with the overslot ones -/obj/item/clothing/shoes/mod/proc/show_overslot() - if(!overslot) - return - if(!mod.wearer.equip_to_slot_if_possible(overslot, overslot.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE)) - mod.wearer.dropItemToGround(overslot, force = TRUE) - overslot = null - -/obj/item/clothing/shoes/mod/negates_gravity() - return clothing_flags & NOSLIP diff --git a/code/modules/mod/mod_construction.dm b/code/modules/mod/mod_construction.dm deleted file mode 100644 index 3fc8464b6b..0000000000 --- a/code/modules/mod/mod_construction.dm +++ /dev/null @@ -1,291 +0,0 @@ -/obj/item/mod/construction - desc = "A part used in MOD construction." - icon = 'icons/obj/clothing/modsuit/mod_construction.dmi' - item_state = "rack_parts" - -/obj/item/mod/construction/helmet - name = "MOD helmet" - icon_state = "helmet" - -/obj/item/mod/construction/chestplate - name = "MOD chestplate" - icon_state = "chestplate" - -/obj/item/mod/construction/gauntlets - name = "MOD gauntlets" - icon_state = "gauntlets" - -/obj/item/mod/construction/boots - name = "MOD boots" - icon_state = "boots" - -/obj/item/mod/construction/core - name = "MOD core" - icon_state = "mod-core-standard" - desc = "Growing in the most lush, fertile areas of the planet Sprout, there is a crystal known as the Heartbloom. \ - These rare, organic piezoelectric crystals are of incredible cultural significance to the artist castes of the Ethereals, \ - owing to their appearance; which is exactly similar to that of an Ethereal's heart. \n\ - Which one you have in your suit is unclear, but either way, \ - it's been repurposed to be an internal power source for a Modular Outerwear Device." - -/obj/item/mod/construction/broken_core - name = "broken MOD core" - icon_state = "mod-core" - desc = "An internal power source for a Modular Outerwear Device. You don't seem to be able to source any power from this one, though." - -/obj/item/mod/construction/broken_core/examine(mob/user) - . = ..() - . += span_notice("You could repair it with a screwdriver...") - -/obj/item/mod/construction/broken_core/screwdriver_act(mob/living/user, obj/item/tool) - . = ..() - if(!tool.use_tool(src, user, 5 SECONDS, volume = 30)) - return - new /obj/item/mod/construction/core(drop_location()) - qdel(src) - -/obj/item/mod/construction/armor - name = "MOD armor plates" - desc = "Armor plates used to finish a MOD." - icon_state = "standard-plating" - var/datum/mod_theme/theme = /datum/mod_theme - -/obj/item/mod/construction/armor/Initialize(mapload) - . = ..() - var/datum/mod_theme/used_theme = GLOB.mod_themes[theme] - name = "MOD [used_theme.name] armor plates" - desc = "[desc] [used_theme.desc]" - icon_state = "[used_theme.default_skin]-plating" - -/obj/item/mod/construction/armor/engineering - theme = /datum/mod_theme/engineering - -/obj/item/mod/construction/armor/atmospheric - theme = /datum/mod_theme/atmospheric - -/obj/item/mod/construction/armor/advanced - theme = /datum/mod_theme/advanced - -/obj/item/mod/construction/armor/mining - theme = /datum/mod_theme/mining - -/obj/item/mod/construction/armor/medical - theme = /datum/mod_theme/medical - -/obj/item/mod/construction/armor/rescue - theme = /datum/mod_theme/rescue - -/obj/item/mod/construction/armor/security - theme = /datum/mod_theme/security - -/obj/item/mod/construction/armor/research - theme = /datum/mod_theme/research - -/obj/item/mod/construction/armor/cosmohonk - theme = /datum/mod_theme/cosmohonk - -/obj/item/mod/construction/armor/magnate - theme = /datum/mod_theme/magnate - -/obj/item/mod/paint - name = "MOD paint kit" - desc = "This kit will repaint your MODsuit to something unique." - icon = 'icons/obj/clothing/modsuit/mod_construction.dmi' - icon_state = "paintkit" - -#define START_STEP "start" -#define CORE_STEP "core" -#define SCREWED_CORE_STEP "screwed_core" -#define HELMET_STEP "helmet" -#define CHESTPLATE_STEP "chestplate" -#define GAUNTLETS_STEP "gauntlets" -#define BOOTS_STEP "boots" -#define WRENCHED_ASSEMBLY_STEP "wrenched_assembly" -#define SCREWED_ASSEMBLY_STEP "screwed_assembly" - -/obj/item/mod/construction/shell - name = "MOD shell" - icon_state = "mod-construction_start" - desc = "A MOD shell." - var/obj/item/core - var/obj/item/helmet - var/obj/item/chestplate - var/obj/item/gauntlets - var/obj/item/boots - var/step = START_STEP - -/obj/item/mod/construction/shell/examine(mob/user) - . = ..() - var/display_text - switch(step) - if(START_STEP) - display_text = "It looks like it's missing a MOD core..." - if(CORE_STEP) - display_text = "The core seems loose..." - if(SCREWED_CORE_STEP) - display_text = "It looks like it's missing a helmet..." - if(HELMET_STEP) - display_text = "It looks like it's missing a chestplate..." - if(CHESTPLATE_STEP) - display_text = "It looks like it's missing gauntlets..." - if(GAUNTLETS_STEP) - display_text = "It looks like it's missing boots..." - if(BOOTS_STEP) - display_text = "The assembly seems unsecured..." - if(WRENCHED_ASSEMBLY_STEP) - display_text = "The assembly seems loose..." - if(SCREWED_ASSEMBLY_STEP) - display_text = "All it's missing is external armor..." - . += span_notice(display_text) - -/obj/item/mod/construction/shell/attackby(obj/item/part, mob/user, params) - . = ..() - switch(step) - if(START_STEP) - if(!istype(part, /obj/item/mod/construction/core)) - return - if(!user.transferItemToLoc(part, src)) - balloon_alert(user, "core stuck to your hand!") - return - playsound(src, 'sound/machines/click.ogg', 30, TRUE) - balloon_alert(user, "core inserted") - core = part - step = CORE_STEP - if(CORE_STEP) - if(part.tool_behaviour == TOOL_SCREWDRIVER) //Construct - if(part.use_tool(src, user, 0, volume=30)) - balloon_alert(user, "core screwed") - step = SCREWED_CORE_STEP - else if(part.tool_behaviour == TOOL_CROWBAR) //Deconstruct - if(part.use_tool(src, user, 0, volume=30)) - core.forceMove(drop_location()) - balloon_alert(user, "core taken out") - step = START_STEP - if(SCREWED_CORE_STEP) - if(istype(part, /obj/item/mod/construction/helmet)) //Construct - if(!user.transferItemToLoc(part, src)) - balloon_alert(user, "helmet stuck to your hand!") - return - playsound(src, 'sound/machines/click.ogg', 30, TRUE) - balloon_alert(user, "helmet added") - helmet = part - step = HELMET_STEP - else if(part.tool_behaviour == TOOL_SCREWDRIVER) //Deconstruct - if(part.use_tool(src, user, 0, volume=30)) - balloon_alert(user, "core unscrewed") - step = CORE_STEP - if(HELMET_STEP) - if(istype(part, /obj/item/mod/construction/chestplate)) //Construct - if(!user.transferItemToLoc(part, src)) - balloon_alert(user, "chestplate stuck to your hand!") - return - playsound(src, 'sound/machines/click.ogg', 30, TRUE) - balloon_alert(user, "chestplate added") - chestplate = part - step = CHESTPLATE_STEP - else if(part.tool_behaviour == TOOL_CROWBAR) //Deconstruct - if(part.use_tool(src, user, 0, volume=30)) - helmet.forceMove(drop_location()) - balloon_alert(user, "helmet removed") - helmet = null - step = SCREWED_CORE_STEP - if(CHESTPLATE_STEP) - if(istype(part, /obj/item/mod/construction/gauntlets)) //Construct - if(!user.transferItemToLoc(part, src)) - balloon_alert(user, "gauntlets stuck to your hand!") - return - playsound(src, 'sound/machines/click.ogg', 30, TRUE) - balloon_alert(user, "gauntlets added") - gauntlets = part - step = GAUNTLETS_STEP - else if(part.tool_behaviour == TOOL_CROWBAR) //Deconstruct - if(part.use_tool(src, user, 0, volume=30)) - chestplate.forceMove(drop_location()) - balloon_alert(user, "chestplate removed") - chestplate = null - step = HELMET_STEP - if(GAUNTLETS_STEP) - if(istype(part, /obj/item/mod/construction/boots)) //Construct - if(!user.transferItemToLoc(part, src)) - balloon_alert(user, "boots added") - return - playsound(src, 'sound/machines/click.ogg', 30, TRUE) - balloon_alert(user, "You fit [part] onto [src].") - boots = part - step = BOOTS_STEP - else if(part.tool_behaviour == TOOL_CROWBAR) //Deconstruct - if(part.use_tool(src, user, 0, volume=30)) - gauntlets.forceMove(drop_location()) - balloon_alert(user, "gauntlets removed") - gauntlets = null - step = CHESTPLATE_STEP - if(BOOTS_STEP) - if(part.tool_behaviour == TOOL_WRENCH) //Construct - if(part.use_tool(src, user, 0, volume=30)) - balloon_alert(user, "assembly secured") - step = WRENCHED_ASSEMBLY_STEP - else if(part.tool_behaviour == TOOL_CROWBAR) //Deconstruct - if(part.use_tool(src, user, 0, volume=30)) - boots.forceMove(drop_location()) - balloon_alert(user, "boots removed") - boots = null - step = GAUNTLETS_STEP - if(WRENCHED_ASSEMBLY_STEP) - if(part.tool_behaviour == TOOL_SCREWDRIVER) //Construct - if(part.use_tool(src, user, 0, volume=30)) - balloon_alert(user, "assembly screwed") - step = SCREWED_ASSEMBLY_STEP - else if(part.tool_behaviour == TOOL_WRENCH) //Deconstruct - if(part.use_tool(src, user, 0, volume=30)) - balloon_alert(user, "assembly unsecured") - step = BOOTS_STEP - if(SCREWED_ASSEMBLY_STEP) - if(istype(part, /obj/item/mod/construction/armor)) //Construct - var/obj/item/mod/construction/armor/external_armor = part - if(!user.transferItemToLoc(part, src)) - return - playsound(src, 'sound/machines/click.ogg', 30, TRUE) - balloon_alert(user, "suit finished") - var/obj/item/modsuit = new /obj/item/mod/control(drop_location(), external_armor.theme) - qdel(src) - user.put_in_hands(modsuit) - else if(part.tool_behaviour == TOOL_SCREWDRIVER) //Construct - if(part.use_tool(src, user, 0, volume=30)) - balloon_alert(user, "assembly unscrewed") - step = SCREWED_ASSEMBLY_STEP - update_icon_state() - -/obj/item/mod/construction/shell/update_icon_state() - . = ..() - icon_state = "mod-construction_[step]" - -/obj/item/mod/construction/shell/Destroy() - QDEL_NULL(core) - QDEL_NULL(helmet) - QDEL_NULL(chestplate) - QDEL_NULL(gauntlets) - QDEL_NULL(boots) - return ..() - -/obj/item/mod/construction/shell/handle_atom_del(atom/deleted_atom) - if(deleted_atom == core) - core = null - if(deleted_atom == helmet) - helmet = null - if(deleted_atom == chestplate) - chestplate = null - if(deleted_atom == gauntlets) - gauntlets = null - if(deleted_atom == boots) - boots = null - return ..() - -#undef START_STEP -#undef CORE_STEP -#undef SCREWED_CORE_STEP -#undef HELMET_STEP -#undef CHESTPLATE_STEP -#undef GAUNTLETS_STEP -#undef BOOTS_STEP -#undef WRENCHED_ASSEMBLY_STEP -#undef SCREWED_ASSEMBLY_STEP diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm deleted file mode 100644 index d30b8a235e..0000000000 --- a/code/modules/mod/mod_control.dm +++ /dev/null @@ -1,588 +0,0 @@ -/// MODsuits, trade-off between armor and utility -/obj/item/mod - name = "Base MOD" - desc = "You should not see this, yell at a coder!" - icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi' - mob_overlay_icon = 'icons/mob/clothing/modsuit/mod_clothing.dmi' - icon_state = "standard-control" - item_state = "standard-control" - mutantrace_variation = STYLE_NO_ANTHRO_ICON - -/obj/item/mod/control - name = "MOD control unit" - desc = "The control unit of a Modular Outerwear Device, a powered, back-mounted suit that protects against various environments." - icon_state = "control" - item_state = "control" - w_class = WEIGHT_CLASS_BULKY - slot_flags = ITEM_SLOT_BACK - strip_delay = 10 SECONDS - slowdown = 2 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10, RAD = 0) - actions_types = list( - /datum/action/item_action/mod/deploy, - /datum/action/item_action/mod/activate, - /datum/action/item_action/mod/module, - /datum/action/item_action/mod/panel, - /datum/action/item_action/mod/deploy/ai, - /datum/action/item_action/mod/activate/ai, - /datum/action/item_action/mod/module/ai, - /datum/action/item_action/mod/panel/ai, - ) - resistance_flags = NONE - max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT - min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT - permeability_coefficient = 0.01 - siemens_coefficient = 0.5 - alternate_worn_layer = BODY_FRONT_LAYER - /// The MOD's theme, decides on some stuff like armor and statistics. - var/datum/mod_theme/theme = /datum/mod_theme - /// Looks of the MOD. - var/skin = "standard" - /// Theme of the MOD TGUI - var/ui_theme = "ntos" - /// If the suit is deployed and turned on. - var/active = FALSE - /// If the suit wire/module hatch is open. - var/open = FALSE - /// If the suit is ID locked. - var/locked = FALSE - /// If the suit is malfunctioning. - var/malfunctioning = FALSE - /// If the suit is currently activating/deactivating. - var/activating = FALSE - /// How long the MOD is electrified for. - var/seconds_electrified = MACHINE_NOT_ELECTRIFIED - /// If the suit interface is broken. - var/interface_break = FALSE - /// How much module complexity can this MOD carry. - var/complexity_max = DEFAULT_MAX_COMPLEXITY - /// How much module complexity this MOD is carrying. - var/complexity = 0 - /// Power usage of the MOD. - var/cell_drain = DEFAULT_CHARGE_DRAIN - /// Slowdown of the MOD when not active. - var/slowdown_inactive = 2 - /// Slowdown of the MOD when active. - var/slowdown_active = 1 - /// How long this MOD takes each part to seal. - var/activation_step_time = MOD_ACTIVATION_STEP_TIME - /// MOD cell. - var/obj/item/stock_parts/cell/cell - /// MOD helmet. - var/obj/item/clothing/head/helmet/space/mod/helmet - /// MOD chestplate. - var/obj/item/clothing/suit/armor/mod/chestplate - /// MOD gauntlets. - var/obj/item/clothing/gloves/mod/gauntlets - /// MOD boots. - var/obj/item/clothing/shoes/mod/boots - /// List of parts (helmet, chestplate, gauntlets, boots). - var/list/mod_parts = list() - /// Modules the MOD should spawn with. - var/list/initial_modules = list() - /// Modules the MOD currently possesses. - var/list/modules = list() - /// Currently used module. - var/obj/item/mod/module/selected_module - /// AI/pAI mob inhabiting the MOD. - var/mob/living/silicon/ai - /// Delay between moves as AI. - var/movedelay = 0 - /// Cooldown for AI moves. - COOLDOWN_DECLARE(cooldown_mod_move) - /// Person wearing the MODsuit. - var/mob/living/carbon/human/wearer - -/obj/item/mod/control/Initialize(mapload, new_theme, new_skin) - . = ..() - if(new_theme) - theme = new_theme - theme = GLOB.mod_themes[theme] - slowdown_inactive = theme.slowdown_inactive - slowdown_active = theme.slowdown_active - slowdown = slowdown_inactive - complexity_max = theme.complexity_max - skin = new_skin || theme.default_skin - ui_theme = theme.ui_theme - cell_drain = theme.cell_drain - initial_modules += theme.inbuilt_modules - wires = new /datum/wires/mod(src) - if(length(req_access)) - locked = TRUE - if(ispath(cell)) - cell = new cell(src) - helmet = new /obj/item/clothing/head/helmet/space/mod(src) - helmet.mod = src - mod_parts += helmet - chestplate = new /obj/item/clothing/suit/armor/mod(src) - chestplate.mod = src - mod_parts += chestplate - gauntlets = new /obj/item/clothing/gloves/mod(src) - gauntlets.mod = src - mod_parts += gauntlets - boots = new /obj/item/clothing/shoes/mod(src) - boots.mod = src - mod_parts += boots - var/list/all_parts = mod_parts.Copy() + src - for(var/obj/item/piece as anything in all_parts) - piece.name = "[theme.name] [piece.name]" - piece.desc = "[piece.desc] [theme.desc]" - piece.armor = getArmor(arglist(theme.armor)) - piece.resistance_flags = theme.resistance_flags - piece.heat_protection = NONE - piece.cold_protection = NONE - piece.max_heat_protection_temperature = theme.max_heat_protection_temperature - piece.min_cold_protection_temperature = theme.min_cold_protection_temperature - piece.permeability_coefficient = theme.permeability_coefficient - piece.siemens_coefficient = theme.siemens_coefficient - piece.icon_state = "[skin]-[initial(piece.icon_state)]" - piece.item_state = "[skin]-[initial(piece.item_state)]" - update_flags() - for(var/obj/item/mod/module/module as anything in initial_modules) - module = new module(src) - install(module) - RegisterSignal(src, COMSIG_ATOM_EXITED, .proc/on_exit) - movedelay = CONFIG_GET(number/movedelay/run_delay) - -/obj/item/mod/control/Destroy() - if(active) - STOP_PROCESSING(SSobj, src) - var/atom/deleting_atom - if(!QDELETED(helmet)) - deleting_atom = helmet - helmet.mod = null - helmet = null - mod_parts -= deleting_atom - qdel(deleting_atom) - if(!QDELETED(chestplate)) - deleting_atom = chestplate - chestplate.mod = null - chestplate = null - mod_parts -= deleting_atom - qdel(deleting_atom) - if(!QDELETED(gauntlets)) - deleting_atom = gauntlets - gauntlets.mod = null - gauntlets = null - mod_parts -= deleting_atom - qdel(deleting_atom) - if(!QDELETED(boots)) - deleting_atom = boots - boots.mod = null - boots = null - mod_parts -= deleting_atom - qdel(deleting_atom) - for(var/obj/item/mod/module/module as anything in modules) - module.mod = null - modules -= module - QDEL_NULL(ai) - QDEL_NULL(wires) - QDEL_NULL(cell) - return ..() - -/obj/item/mod/control/process(delta_time) - if(seconds_electrified > MACHINE_NOT_ELECTRIFIED) - seconds_electrified-- - if((!cell || !cell.charge) && active && !activating) - power_off() - return PROCESS_KILL - var/malfunctioning_charge_drain = 0 - if(malfunctioning) - malfunctioning_charge_drain = rand(1,20) - cell.charge = max(0, cell.charge - (cell_drain + malfunctioning_charge_drain)*delta_time) - update_cell_alert() - for(var/obj/item/mod/module/module as anything in modules) - if(malfunctioning && module.active && DT_PROB(5, delta_time)) - module.on_deactivation() - module.on_process(delta_time) - -/obj/item/mod/control/equipped(mob/user, slot) - ..() - if(slot == ITEM_SLOT_BACK) - set_wearer(user) - else if(wearer) - unset_wearer() - -/obj/item/mod/control/dropped(mob/user) - . = ..() - if(wearer) - unset_wearer() - -/obj/item/mod/control/item_action_slot_check(slot) - if(slot == ITEM_SLOT_BACK) - return TRUE - -/obj/item/mod/control/allow_attack_hand_drop(mob/user) - var/mob/living/carbon/carbon_user = user - if(!istype(carbon_user) || src != carbon_user.back) - return ..() - for(var/obj/item/part in mod_parts) - if(part.loc != src) - balloon_alert(carbon_user, "retract parts first!") - playsound(src, 'sound/machines/scanbuzz.ogg', 25, FALSE, SILENCED_SOUND_EXTRARANGE) - return FALSE - return ..() - -/obj/item/mod/control/MouseDrop(atom/over_object) - if(src != wearer?.back || !istype(over_object, /atom/movable/screen/inventory/hand)) - return ..() - for(var/obj/item/part in mod_parts) - if(part.loc != src) - balloon_alert(wearer, "retract parts first!") - playsound(src, 'sound/machines/scanbuzz.ogg', 25, FALSE, SILENCED_SOUND_EXTRARANGE) - return - if(!wearer.incapacitated()) - var/atom/movable/screen/inventory/hand/ui_hand = over_object - if(wearer.putItemFromInventoryInHandIfPossible(src, ui_hand.held_index)) - add_fingerprint(usr) - return ..() - -/obj/item/mod/control/attack_hand(mob/user) - if(seconds_electrified && cell?.charge) - if(shock(user)) - return - if(open && loc == user) - if(!cell) - balloon_alert(user, "no cell!") - return - balloon_alert(user, "removing cell...") - if(!do_after(user, 1.5 SECONDS, target = src)) - balloon_alert(user, "interrupted!") - return - balloon_alert(user, "cell removed") - playsound(src, 'sound/machines/click.ogg', 50, TRUE, SILENCED_SOUND_EXTRARANGE) - if(!user.put_in_hands(cell)) - cell.forceMove(drop_location()) - update_cell_alert() - return - return ..() - -/obj/item/mod/control/AltClick(mob/user) - if(seconds_electrified && cell?.charge) - if(shock(user)) - return - if(!open) - for(var/obj/item/mod/module/storage/S in modules) - if(S.stored) - playsound(user, "rustle", 50, 1, -5) - SEND_SIGNAL(S.stored, COMSIG_TRY_STORAGE_SHOW, wearer, TRUE) - return - . = ..() - -/obj/item/mod/control/screwdriver_act(mob/living/user, obj/item/screwdriver) - . = ..() - if(.) - return TRUE - if(active || activating) - balloon_alert(user, "deactivate suit first!") - playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) - return FALSE - balloon_alert(user, "[open ? "closing" : "opening"] panel...") - screwdriver.play_tool_sound(src, 100) - if(screwdriver.use_tool(src, user, 1 SECONDS)) - if(active || activating) - balloon_alert(user, "deactivate suit first!") - screwdriver.play_tool_sound(src, 100) - balloon_alert(user, "panel [open ? "closed" : "opened"]") - open = !open - else - balloon_alert(user, "interrupted!") - return TRUE - -/obj/item/mod/control/crowbar_act(mob/living/user, obj/item/crowbar) - . = ..() - if(!open) - balloon_alert(user, "open the panel first!") - playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) - return FALSE - if(!allowed(user)) - balloon_alert(user, "insufficient access!") - playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) - return - if(length(modules)) - var/list/removable_modules = list() - for(var/obj/item/mod/module/module as anything in modules) - if(!module.removable) - continue - removable_modules += module - var/obj/item/mod/module/module_to_remove = tgui_input_list(user, "Which module to remove?", "Module Removal", removable_modules) - if(!module_to_remove?.mod) - return FALSE - uninstall(module_to_remove) - module_to_remove.forceMove(drop_location()) - crowbar.play_tool_sound(src, 100) - return TRUE - balloon_alert(user, "no modules!") - playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) - return FALSE - -/obj/item/mod/control/attackby(obj/item/attacking_item, mob/living/user, params) - if(istype(attacking_item, /obj/item/paicard)) - if(!open) //mod must be open - balloon_alert(user, "suit must be open to transfer!") - return FALSE - insert_pai(user, attacking_item) - return TRUE - if(istype(attacking_item, /obj/item/mod/module)) - if(!open) - balloon_alert(user, "open the panel first!") - playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) - return FALSE - install(attacking_item, user) - return TRUE - else if(istype(attacking_item, /obj/item/stock_parts/cell)) - if(!open) - balloon_alert(user, "open the panel first!") - playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) - return FALSE - if(cell) - balloon_alert(user, "cell already installed!") - playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) - return FALSE - attacking_item.forceMove(src) - cell = attacking_item - balloon_alert(user, "cell installed") - playsound(src, 'sound/machines/click.ogg', 50, TRUE, SILENCED_SOUND_EXTRARANGE) - update_cell_alert() - return TRUE - else if(is_wire_tool(attacking_item) && open) - wires.interact(user) - return TRUE - else if(istype(attacking_item, /obj/item/mod/paint)) - if(active || activating) - balloon_alert(user, "suit is active!") - else if(paint(user, attacking_item)) - balloon_alert(user, "suit painted") - else - balloon_alert(user, "not painted!") - return TRUE - else if(open && attacking_item.GetID()) - update_access(user, attacking_item) - return TRUE - return ..() - -/obj/item/mod/control/get_cell() - if(open) - return cell - -/obj/item/mod/control/emag_act(mob/user) - locked = !locked - balloon_alert(user, "[locked ? "locked" : "unlocked"]") - -/obj/item/mod/control/emp_act(severity) - . = ..() - to_chat(wearer, span_notice("[severity > 1 ? "Light" : "Strong"] electromagnetic pulse detected!")) - if(!active || !wearer || . & EMP_PROTECT_CONTENTS) - return - selected_module = null - wearer.apply_damage(10 / severity, BURN, spread_damage=TRUE) - to_chat(wearer, span_danger("You feel [src] heat up from the EMP, burning you slightly.")) - if (wearer.stat < UNCONSCIOUS && prob(10)) - wearer.emote("scream") - -/obj/item/mod/control/on_outfit_equip(mob/living/carbon/human/outfit_wearer, visuals_only, item_slot) - if(visuals_only) - set_wearer(outfit_wearer) //we need to set wearer manually since it doesnt call equipped - quick_activation() - -/obj/item/mod/control/doStrip(mob/stripper, mob/owner) - if(active && !toggle_activate(stripper, force_deactivate = TRUE)) - return - for(var/obj/item/part in mod_parts) - conceal(null, part) - return ..() - -/obj/item/mod/control/worn_overlays(isinhands = FALSE, icon_file) - . = ..() - if(!active) - return - for(var/obj/item/mod/module/module as anything in modules) - var/list/module_icons = module.generate_worn_overlay() - if(!length(module_icons)) - continue - . += module_icons - -/obj/item/mod/control/proc/set_wearer(mob/user) - wearer = user - RegisterSignal(wearer, COMSIG_ATOM_EXITED, .proc/on_exit) - RegisterSignal(wearer, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, .proc/on_borg_charge) - update_cell_alert() - for(var/obj/item/mod/module/module as anything in modules) - module.on_equip() - -/obj/item/mod/control/proc/unset_wearer() - for(var/obj/item/mod/module/module as anything in modules) - module.on_unequip() - UnregisterSignal(wearer, list(COMSIG_ATOM_EXITED, COMSIG_PROCESS_BORGCHARGER_OCCUPANT)) - wearer.clear_alert("mod_charge") - wearer = null - -/obj/item/mod/control/proc/update_flags() - var/list/used_skin = theme.skins[skin] - for(var/obj/item/clothing/part as anything in mod_parts) - var/used_category - if(part == helmet) - used_category = HELMET_FLAGS - helmet.alternate_worn_layer = used_skin["HELMET_LAYER"] - helmet.alternate_layer = used_skin["HELMET_LAYER"] - if(part == chestplate) - used_category = CHESTPLATE_FLAGS - if(part == gauntlets) - used_category = GAUNTLETS_FLAGS - if(part == boots) - used_category = BOOTS_FLAGS - var/list/category = used_skin[used_category] - part.clothing_flags = category[UNSEALED_CLOTHING] || NONE - part.visor_flags = category[SEALED_CLOTHING] || NONE - part.flags_inv = category[UNSEALED_INVISIBILITY] || NONE - part.visor_flags_inv = category[SEALED_INVISIBILITY] || NONE - part.flags_cover = category[UNSEALED_COVER] || NONE - part.visor_flags_cover = category[SEALED_COVER] || NONE - -/obj/item/mod/control/proc/quick_module(mob/user) - if(!length(modules)) - return - var/list/display_names = list() - var/list/items = list() - for(var/obj/item/mod/module/module as anything in modules) - if(module.module_type == MODULE_PASSIVE) - continue - display_names[module.name] = REF(module) - var/image/module_image = image(icon = module.icon, icon_state = module.icon_state) - items += list(module.name = module_image) - if(!length(items)) - return - var/pick = show_radial_menu(user, src, items, custom_check = FALSE, require_near = TRUE) - if(!pick) - return - var/module_reference = display_names[pick] - var/obj/item/mod/module/selected_module = locate(module_reference) in modules - if(!istype(selected_module) || user.incapacitated()) - return - selected_module.on_select() - -/obj/item/mod/control/proc/paint(mob/user, obj/item/paint) - if(length(theme.skins) <= 1) - return FALSE - var/list/skins = list() - for(var/mod_skin in theme.skins) - skins[mod_skin] = image(icon = icon, icon_state = "[mod_skin]-control") - var/pick = show_radial_menu(user, src, skins, custom_check = FALSE, require_near = TRUE) - if(!pick || !user.is_holding(paint)) - return FALSE - skin = pick - var/list/skin_updating = mod_parts.Copy() + src - for(var/obj/item/piece as anything in skin_updating) - piece.icon_state = "[skin]-[initial(piece.icon_state)]" - update_flags() - wearer?.regenerate_icons() - return TRUE - -/obj/item/mod/control/proc/shock(mob/living/user) - if(!istype(user) || cell?.charge < 1) - return FALSE - do_sparks(5, TRUE, src) - var/check_range = TRUE - return electrocute_mob(user, cell, src, 0.7, check_range) - -/obj/item/mod/control/proc/install(module, mob/user) - var/obj/item/mod/module/new_module = module - for(var/obj/item/mod/module/old_module as anything in modules) - if(is_type_in_list(new_module, old_module.incompatible_modules) || is_type_in_list(old_module, new_module.incompatible_modules)) - if(user) - balloon_alert(user, "[new_module] incompatible with [old_module]!") - playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) - return - if(is_type_in_list(module, theme.module_blacklist)) - if(user) - balloon_alert(user, "[src] doesn't accept [new_module]!") - playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) - return - var/complexity_with_module = complexity - complexity_with_module += new_module.complexity - if(complexity_with_module > complexity_max) - if(user) - balloon_alert(user, "[new_module] would make [src] too complex!") - playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) - return - new_module.forceMove(src) - modules += new_module - complexity += new_module.complexity - new_module.mod = src - new_module.on_install() - if(wearer) - new_module.on_equip() - if(user) - balloon_alert(user, "[new_module] added") - playsound(src, 'sound/machines/click.ogg', 50, TRUE, SILENCED_SOUND_EXTRARANGE) - -/obj/item/mod/control/proc/uninstall(module) - var/obj/item/mod/module/old_module = module - modules -= old_module - complexity -= old_module.complexity - if(active) - old_module.on_suit_deactivation() - if(old_module.active) - old_module.on_deactivation() - if(wearer) - old_module.on_unequip() - old_module.on_uninstall() - old_module.mod = null - -/obj/item/mod/control/proc/update_access(mob/user, obj/item/card/id/card) - if(!allowed(user)) - balloon_alert(user, "insufficient access!") - playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) - return - req_access = card.access.Copy() - balloon_alert(user, "access updated") - -/obj/item/mod/control/proc/update_cell_alert() - if(!wearer) - return - if(!cell) - wearer.throw_alert("mod_charge", /atom/movable/screen/alert/nocell) - return - var/remaining_cell = cell.charge/cell.maxcharge - switch(remaining_cell) - if(0.75 to INFINITY) - wearer.clear_alert("mod_charge") - if(0.5 to 0.75) - wearer.throw_alert("mod_charge", /atom/movable/screen/alert/lowcell, 1) - if(0.25 to 0.5) - wearer.throw_alert("mod_charge", /atom/movable/screen/alert/lowcell, 2) - if(0.01 to 0.25) - wearer.throw_alert("mod_charge", /atom/movable/screen/alert/lowcell, 3) - else - wearer.throw_alert("mod_charge", /atom/movable/screen/alert/emptycell) - -/obj/item/mod/control/proc/power_off() - balloon_alert(wearer, "no power!") - toggle_activate(wearer, force_deactivate = TRUE) - -/obj/item/mod/control/proc/on_exit(datum/source, atom/movable/part, direction) - SIGNAL_HANDLER - - if(part.loc == src) - return - if(part == cell) - cell = null - update_cell_alert() - return - if(part.loc == wearer) - return - if(modules.Find(part)) - uninstall(part) - return - if(mod_parts.Find(part)) - conceal(wearer, part) - if(active) - INVOKE_ASYNC(src, .proc/toggle_activate, wearer, TRUE) - return - -/obj/item/mod/control/proc/on_borg_charge(datum/source, amount) - SIGNAL_HANDLER - - if(!cell) - return - cell.give(amount) diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm deleted file mode 100644 index 135cef31b7..0000000000 --- a/code/modules/mod/mod_theme.dm +++ /dev/null @@ -1,854 +0,0 @@ -/// Global proc that sets up all MOD themes as singletons in a list and returns it. -/proc/setup_mod_themes() - . = list() - for(var/path in typesof(/datum/mod_theme)) - var/datum/mod_theme/new_theme = new path() - .[path] = new_theme - -/// MODsuit theme, instanced once and then used by MODsuits to grab various statistics. -/datum/mod_theme - /// Theme name for the MOD. - var/name = "standard" - /// Description added to the MOD. - var/desc = "A civilian class suit by Nakamura Engineering, doesn't offer much other than slightly quicker movement." - /// Default skin of the MOD. - var/default_skin = "standard" - /// Armor shared across the MOD pieces. - var/armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10, RAD = 0) - /// Resistance flags shared across the MOD pieces. - var/resistance_flags = NONE - /// Max heat protection shared across the MOD pieces. - var/max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT - /// Max cold protection shared across the MOD pieces. - var/min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT - /// Permeability shared across the MOD pieces. - var/permeability_coefficient = 0.01 - /// Siemens shared across the MOD pieces. - var/siemens_coefficient = 0.5 - /// How much modules can the MOD carry without malfunctioning. - var/complexity_max = DEFAULT_MAX_COMPLEXITY - /// How much battery power the MOD uses by just being on - var/cell_drain = DEFAULT_CHARGE_DRAIN - /// Slowdown of the MOD when not active. - var/slowdown_inactive = 1.25 - /// Slowdown of the MOD when active. - var/slowdown_active = 0.75 - /// Theme used by the MOD TGUI. - var/ui_theme = "ntos" - /// List of inbuilt modules. These are different from the pre-equipped suits, you should mainly use these for unremovable modules with 0 complexity. - var/list/inbuilt_modules = list() - /// Modules blacklisted from the MOD. - var/list/module_blacklist = list() - /// List of skins with their appropriate clothing flags. - var/list/skins = list( - "standard" = list( - HELMET_LAYER = NECK_LAYER, - HELMET_FLAGS = list( - UNSEALED_CLOTHING = NONE, - SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, - UNSEALED_INVISIBILITY = HIDEFACIALHAIR, - SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, - SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, - ), - CHESTPLATE_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - SEALED_INVISIBILITY = HIDEJUMPSUIT, - ), - GAUNTLETS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - BOOTS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - ), - "civilian" = list( - HELMET_LAYER = null, - HELMET_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, - UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, - ), - CHESTPLATE_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - SEALED_INVISIBILITY = HIDEJUMPSUIT, - ), - GAUNTLETS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - BOOTS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - ), - ) - -/datum/mod_theme/engineering - name = "engineering" - desc = "An engineer-fit suit with heat and shock resistance. Nakamura Engineering's classic." - default_skin = "engineering" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 100, ACID = 25, WOUND = 10, RAD = 20) - resistance_flags = FIRE_PROOF - max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT - siemens_coefficient = 0 - slowdown_inactive = 1.5 - slowdown_active = 1 - skins = list( - "engineering" = list( - HELMET_LAYER = NECK_LAYER, - HELMET_FLAGS = list( - UNSEALED_CLOTHING = NONE, - SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, - UNSEALED_INVISIBILITY = HIDEFACIALHAIR, - SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, - SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, - ), - CHESTPLATE_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - SEALED_INVISIBILITY = HIDEJUMPSUIT, - ), - GAUNTLETS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - BOOTS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - ), - ) - -/datum/mod_theme/atmospheric - name = "atmospheric" - desc = "An atmospheric-resistant suit by Nakamura Engineering, offering extreme heat resistance compared to the engineer suit." - default_skin = "atmospheric" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 100, ACID = 75, WOUND = 10, RAD = 0) - resistance_flags = FIRE_PROOF - max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT - slowdown_inactive = 1.5 - slowdown_active = 1 - skins = list( - "atmospheric" = list( - HELMET_LAYER = NECK_LAYER, - HELMET_FLAGS = list( - UNSEALED_CLOTHING = NONE, - SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, - UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDESNOUT, - SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR, - UNSEALED_COVER = HEADCOVERSMOUTH, - SEALED_COVER = HEADCOVERSEYES, - ), - CHESTPLATE_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - SEALED_INVISIBILITY = HIDEJUMPSUIT, - ), - GAUNTLETS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - BOOTS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - ), - ) - -/datum/mod_theme/advanced - name = "advanced" - desc = "An advanced version of Nakamura Engineering's classic suit, shining with a white, acid and fire resistant polish." - default_skin = "advanced" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 90, WOUND = 10, RAD = 35) - resistance_flags = FIRE_PROOF - max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT - siemens_coefficient = 0 - slowdown_inactive = 1 - slowdown_active = 0.5 - inbuilt_modules = list(/obj/item/mod/module/magboot/advanced) - skins = list( - "advanced" = list( - HELMET_LAYER = NECK_LAYER, - HELMET_FLAGS = list( - UNSEALED_CLOTHING = NONE, - SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, - UNSEALED_INVISIBILITY = HIDEFACIALHAIR, - SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, - SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, - ), - CHESTPLATE_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - SEALED_INVISIBILITY = HIDEJUMPSUIT, - ), - GAUNTLETS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - BOOTS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - ), - ) - -/datum/mod_theme/mining - name = "mining" - desc = "A high-power Nanotrasen mining suit, supporting more complexity at a bigger drain." - default_skin = "mining" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 75, WOUND = 15, RAD = 0) - resistance_flags = FIRE_PROOF - max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT - cell_drain = DEFAULT_CHARGE_DRAIN * 2 - complexity_max = DEFAULT_MAX_COMPLEXITY + 5 - skins = list( - "mining" = list( - HELMET_LAYER = null, - HELMET_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT, - SEALED_INVISIBILITY = HIDEMASK|HIDEEYES|HIDEFACE, - SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, - ), - CHESTPLATE_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - SEALED_INVISIBILITY = HIDEJUMPSUIT, - ), - GAUNTLETS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - BOOTS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - ), - ) - -/datum/mod_theme/medical - name = "medical" - desc = "A lightweight suit by DeForest Medical Corporation, allows for easier movement." - default_skin = "medical" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 60, ACID = 75, WOUND = 10, RAD = 0) - cell_drain = DEFAULT_CHARGE_DRAIN * 1.5 - slowdown_inactive = 1 - slowdown_active = 0.5 - skins = list( - "medical" = list( - HELMET_LAYER = NECK_LAYER, - HELMET_FLAGS = list( - UNSEALED_CLOTHING = NONE, - SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, - UNSEALED_INVISIBILITY = HIDEFACIALHAIR, - SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, - SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, - ), - CHESTPLATE_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - SEALED_INVISIBILITY = HIDEJUMPSUIT, - ), - GAUNTLETS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - BOOTS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - ), - "corpsman" = list( - HELMET_LAYER = NECK_LAYER, - HELMET_FLAGS = list( - UNSEALED_CLOTHING = NONE, - SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, - UNSEALED_INVISIBILITY = HIDEFACIALHAIR, - SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, - SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, - ), - CHESTPLATE_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - SEALED_INVISIBILITY = HIDEJUMPSUIT, - ), - GAUNTLETS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - BOOTS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - ), - ) - -/datum/mod_theme/rescue - name = "rescue" - desc = "An advanced version of DeForest Medical Corporation's medical suit, designed for quick rescue of bodies from the most dangerous environments." - default_skin = "rescue" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 100, ACID = 100, WOUND = 10, RAD = 0) - resistance_flags = FIRE_PROOF|ACID_PROOF - max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT - cell_drain = DEFAULT_CHARGE_DRAIN * 1.5 - slowdown_inactive = 0.75 - slowdown_active = 0.25 - inbuilt_modules = list(/obj/item/mod/module/quick_carry/advanced) - skins = list( - "rescue" = list( - HELMET_LAYER = NECK_LAYER, - HELMET_FLAGS = list( - UNSEALED_CLOTHING = NONE, - SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, - UNSEALED_INVISIBILITY = HIDEFACIALHAIR, - SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, - SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, - ), - CHESTPLATE_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - SEALED_INVISIBILITY = HIDEJUMPSUIT, - ), - GAUNTLETS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - BOOTS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - ), - ) - -/datum/mod_theme/research - name = "research" - desc = "A private military EOD suit by Aussec Armory, intended for explosive research. Bulky, but expansive." - default_skin = "research" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 15, RAD = 0) - resistance_flags = FIRE_PROOF|ACID_PROOF - max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT - complexity_max = DEFAULT_MAX_COMPLEXITY + 5 - slowdown_inactive = 2 - slowdown_active = 1.5 - inbuilt_modules = list(/obj/item/mod/module/reagent_scanner/advanced) - skins = list( - "research" = list( - HELMET_LAYER = null, - HELMET_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, - UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, - ), - CHESTPLATE_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - SEALED_INVISIBILITY = HIDEJUMPSUIT, - ), - GAUNTLETS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - BOOTS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - ), - ) - -/datum/mod_theme/security - name = "security" - desc = "An Apadyne Technologies security suit, offering shock protection and quicker speed, at the cost of carrying capacity." - default_skin = "security" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 75, ACID = 75, WOUND = 20, RAD = 0) - siemens_coefficient = 0 - complexity_max = DEFAULT_MAX_COMPLEXITY - 5 - slowdown_inactive = 1 - slowdown_active = 0.5 - skins = list( - "security" = list( - HELMET_LAYER = null, - HELMET_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT, - SEALED_INVISIBILITY = HIDEMASK|HIDEEYES|HIDEFACE, - UNSEALED_COVER = HEADCOVERSMOUTH, - SEALED_COVER = HEADCOVERSEYES, - ), - CHESTPLATE_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - SEALED_INVISIBILITY = HIDEJUMPSUIT, - ), - GAUNTLETS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - BOOTS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - ), - ) - -/datum/mod_theme/safeguard - name = "safeguard" - desc = "An Apadyne Technologies advanced security suit, offering greater speed and fire protection than the standard security model." - default_skin = "safeguard" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 25, BIO = 100, FIRE = 100, ACID = 95, WOUND = 25, RAD = 0) - resistance_flags = FIRE_PROOF - max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT - siemens_coefficient = 0 - complexity_max = DEFAULT_MAX_COMPLEXITY - 5 - slowdown_inactive = 0.75 - slowdown_active = 0.25 - skins = list( - "safeguard" = list( - HELMET_LAYER = null, - HELMET_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, - UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, - ), - CHESTPLATE_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - SEALED_INVISIBILITY = HIDEJUMPSUIT, - ), - GAUNTLETS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - BOOTS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - ), - ) - -/datum/mod_theme/magnate - name = "magnate" - desc = "A fancy, very protective suit for Nanotrasen's captains. Shock, fire and acid-proof while also having a large capacity and high speed." - default_skin = "magnate" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100, WOUND = 20, RAD = 0) - resistance_flags = FIRE_PROOF|ACID_PROOF - max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT - siemens_coefficient = 0 - complexity_max = DEFAULT_MAX_COMPLEXITY + 5 - slowdown_inactive = 0.75 - slowdown_active = 0.25 - skins = list( - "magnate" = list( - HELMET_LAYER = NECK_LAYER, - HELMET_FLAGS = list( - UNSEALED_CLOTHING = NONE, - SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, - UNSEALED_INVISIBILITY = HIDEFACIALHAIR, - SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, - SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, - ), - CHESTPLATE_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - SEALED_INVISIBILITY = HIDEJUMPSUIT, - ), - GAUNTLETS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - BOOTS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - ), - ) - -/datum/mod_theme/cosmohonk - name = "cosmohonk" - desc = "A suit by Honk Ltd. Protects against low humor environments. Most of the tech went to lower the power cost." - default_skin = "cosmohonk" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 60, ACID = 30, WOUND = 5, RAD = 0) - cell_drain = DEFAULT_CHARGE_DRAIN * 0.25 - slowdown_inactive = 1.75 - slowdown_active = 1.25 - skins = list( - "cosmohonk" = list( - HELMET_LAYER = NECK_LAYER, - HELMET_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - UNSEALED_INVISIBILITY = HIDEEARS|HIDEHAIR, - SEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEYES|HIDEFACE|HIDESNOUT, - SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, - ), - CHESTPLATE_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - SEALED_INVISIBILITY = HIDEJUMPSUIT, - ), - GAUNTLETS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - BOOTS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - ), - ) - -/datum/mod_theme/syndicate - name = "syndicate" - desc = "A suit designed by Gorlex Marauders, offering armor ruled illegal in most of Spinward Stellar." - default_skin = "syndicate" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 35, BIO = 100, FIRE = 50, ACID = 90, WOUND = 25, RAD = 0) - max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT - siemens_coefficient = 0 - slowdown_inactive = 1 - slowdown_active = 0.5 - ui_theme = "syndicate" - inbuilt_modules = list() - skins = list( - "syndicate" = list( - HELMET_LAYER = NECK_LAYER, - HELMET_FLAGS = list( - UNSEALED_CLOTHING = NONE, - SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, - UNSEALED_INVISIBILITY = HIDEFACIALHAIR, - SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, - SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, - ), - CHESTPLATE_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - SEALED_INVISIBILITY = HIDEJUMPSUIT, - ), - GAUNTLETS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - BOOTS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - ), - ) - -/datum/mod_theme/elite - name = "elite" - desc = "An elite suit upgraded by Cybersun Industries, offering upgraded armor values." - default_skin = "elite" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 55, BIO = 100, FIRE = 100, ACID = 100, WOUND = 25, RAD = 0) - resistance_flags = FIRE_PROOF|ACID_PROOF - max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT - siemens_coefficient = 0 - slowdown_inactive = 0.75 - slowdown_active = 0.25 - ui_theme = "syndicate" - inbuilt_modules = list() - skins = list( - "elite" = list( - HELMET_LAYER = null, - HELMET_FLAGS = list( - UNSEALED_CLOTHING = NONE, - SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, - UNSEALED_INVISIBILITY = HIDEFACIALHAIR, - SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, - SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, - ), - CHESTPLATE_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - SEALED_INVISIBILITY = HIDEJUMPSUIT, - ), - GAUNTLETS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - BOOTS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - ), - ) - -/datum/mod_theme/enchanted - name = "enchanted" - desc = "The Wizard Federation's relatively low-tech MODsuit. Is very protective, though." - default_skin = "enchanted" - armor = list(MELEE = 40, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 35, BIO = 100, FIRE = 100, ACID = 100, WOUND = 30, RAD = 0) - resistance_flags = FIRE_PROOF|ACID_PROOF - max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT - siemens_coefficient = 0 - complexity_max = DEFAULT_MAX_COMPLEXITY - 5 - slowdown_inactive = 0.75 - slowdown_active = 0.25 - ui_theme = "wizard" - inbuilt_modules = list(/obj/item/mod/module/anti_magic/wizard) - skins = list( - "enchanted" = list( - HELMET_LAYER = null, - HELMET_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, - UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, - ), - CHESTPLATE_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - SEALED_INVISIBILITY = HIDEJUMPSUIT, - ), - GAUNTLETS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - BOOTS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - ), - ) - -/datum/mod_theme/prototype - name = "prototype" - desc = "A prototype modular suit powered by locomotives. While it is comfortable and has a big capacity, it remains very bulky and power-inefficient." - default_skin = "prototype" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 75, WOUND = 5, RAD = 0) - resistance_flags = FIRE_PROOF - complexity_max = DEFAULT_MAX_COMPLEXITY + 10 - slowdown_inactive = 2.5 - slowdown_active = 2 - ui_theme = "hackerman" - inbuilt_modules = list(/obj/item/mod/module/kinesis) - skins = list( - "prototype" = list( - HELMET_LAYER = null, - HELMET_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, - UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, - ), - CHESTPLATE_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - SEALED_INVISIBILITY = HIDEJUMPSUIT, - ), - GAUNTLETS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - BOOTS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - ), - ) - -/datum/mod_theme/responsory - name = "responsory" - desc = "A high-speed rescue suit by Nanotrasen, intended for its' emergency response teams." - default_skin = "responsory" - armor = list(MELEE = 35, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 50, BIO = 100, FIRE = 100, ACID = 90, WOUND = 15, RAD = 0) - resistance_flags = FIRE_PROOF - max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT - siemens_coefficient = 0 - slowdown_inactive = 0.5 - slowdown_active = 0 - skins = list( - "responsory" = list( - HELMET_LAYER = NECK_LAYER, - HELMET_FLAGS = list( - UNSEALED_CLOTHING = NONE, - SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, - UNSEALED_INVISIBILITY = HIDEFACIALHAIR, - SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, - SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, - ), - CHESTPLATE_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - SEALED_INVISIBILITY = HIDEJUMPSUIT, - ), - GAUNTLETS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - BOOTS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - ), - "inquisitory" = list( - HELMET_LAYER = null, - HELMET_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, - UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, - ), - CHESTPLATE_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - SEALED_INVISIBILITY = HIDEJUMPSUIT, - ), - GAUNTLETS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - BOOTS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - ), - ) - -/datum/mod_theme/apocryphal - name = "apocryphal" - desc = "A high-tech, only technically legal, armored suit created by a collaboration effort between Nanotrasen and Apadyne Technologies." - default_skin = "apocryphal" - armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 60, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 25, RAD = 0) - resistance_flags = FIRE_PROOF|ACID_PROOF - max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT - siemens_coefficient = 0 - complexity_max = DEFAULT_MAX_COMPLEXITY + 10 - skins = list( - "apocryphal" = list( - HELMET_LAYER = null, - HELMET_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - UNSEALED_INVISIBILITY = HIDEEARS|HIDEHAIR, - SEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEYES|HIDEFACE|HIDESNOUT, - SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, - ), - CHESTPLATE_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - SEALED_INVISIBILITY = HIDEJUMPSUIT, - ), - GAUNTLETS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - BOOTS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - ), - ) - -/datum/mod_theme/corporate - name = "corporate" - desc = "A fancy, high-tech suit for Nanotrasen's high ranking officers." - default_skin = "corporate" - armor = list(MELEE = 35, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100, WOUND = 15, RAD = 0) - resistance_flags = FIRE_PROOF|ACID_PROOF - max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT - siemens_coefficient = 0 - slowdown_inactive = 0.5 - slowdown_active = 0 - skins = list( - "corporate" = list( - HELMET_LAYER = null, - HELMET_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT, - SEALED_INVISIBILITY = HIDEMASK|HIDEEYES|HIDEFACE, - SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, - ), - CHESTPLATE_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - SEALED_INVISIBILITY = HIDEJUMPSUIT, - ), - GAUNTLETS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - BOOTS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - ), - ) - -/datum/mod_theme/debug - name = "debug" - desc = "Strangely nostalgic." - default_skin = "debug" - armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 0, RAD = 25) - resistance_flags = FIRE_PROOF|ACID_PROOF - max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT - complexity_max = 50 - slowdown_inactive = 0.5 - slowdown_active = 0 - skins = list( - "debug" = list( - HELMET_LAYER = null, - HELMET_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT, - SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE, - UNSEALED_COVER = HEADCOVERSMOUTH, - SEALED_COVER = HEADCOVERSEYES, - ), - CHESTPLATE_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - SEALED_INVISIBILITY = HIDEJUMPSUIT, - ), - GAUNTLETS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - BOOTS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - ), - ) - -/datum/mod_theme/administrative - name = "administrative" - desc = "A suit made of adminium. Who comes up with these stupid mineral names?" - default_skin = "debug" - armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 100, RAD = 35) - resistance_flags = INDESTRUCTIBLE|LAVA_PROOF|FIRE_PROOF|UNACIDABLE|ACID_PROOF - max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT - complexity_max = 1000 - cell_drain = DEFAULT_CHARGE_DRAIN * 0 - slowdown_inactive = 0 - slowdown_active = 0 - skins = list( - "debug" = list( - HELMET_LAYER = null, - HELMET_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, - UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT, - SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE, - UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, - ), - CHESTPLATE_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, - SEALED_INVISIBILITY = HIDEJUMPSUIT, - ), - GAUNTLETS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, - ), - BOOTS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, - ), - ), - ) diff --git a/code/modules/mod/mod_types.dm b/code/modules/mod/mod_types.dm deleted file mode 100644 index 565dcdc2f8..0000000000 --- a/code/modules/mod/mod_types.dm +++ /dev/null @@ -1,273 +0,0 @@ -/obj/item/mod/control/pre_equipped - cell = /obj/item/stock_parts/cell/high - var/applied_skin - -/obj/item/mod/control/pre_equipped/Initialize(mapload, new_theme, new_skin) - new_skin = applied_skin - return ..() - -/obj/item/mod/control/pre_equipped/standard - initial_modules = list( - /obj/item/mod/module/storage, - /obj/item/mod/module/welding, - /obj/item/mod/module/flashlight, - ) - -/obj/item/mod/control/pre_equipped/engineering - theme = /datum/mod_theme/engineering - initial_modules = list( - /obj/item/mod/module/storage, - /obj/item/mod/module/welding, - /obj/item/mod/module/rad_protection, - /obj/item/mod/module/flashlight, - /obj/item/mod/module/magboot, - ) - -/obj/item/mod/control/pre_equipped/atmospheric - theme = /datum/mod_theme/atmospheric - initial_modules = list( - /obj/item/mod/module/storage, - /obj/item/mod/module/welding, - /obj/item/mod/module/rad_protection, - /obj/item/mod/module/flashlight, - /obj/item/mod/module/t_ray, - ) - -/obj/item/mod/control/pre_equipped/advanced - theme = /datum/mod_theme/advanced - cell = /obj/item/stock_parts/cell/super - initial_modules = list( - /obj/item/mod/module/storage, - /obj/item/mod/module/welding, - /obj/item/mod/module/rad_protection, - /obj/item/mod/module/flashlight, - /obj/item/mod/module/jetpack, - ) - -/obj/item/mod/control/pre_equipped/mining - theme = /datum/mod_theme/mining - cell = /obj/item/stock_parts/cell/high/plus - initial_modules = list( - /obj/item/mod/module/storage, - /obj/item/mod/module/welding, - /obj/item/mod/module/orebag, - /obj/item/mod/module/flashlight, - /obj/item/mod/module/magboot, - /obj/item/mod/module/drill, - ) - -/obj/item/mod/control/pre_equipped/medical - theme = /datum/mod_theme/medical - initial_modules = list( - /obj/item/mod/module/storage, - /obj/item/mod/module/flashlight, - /obj/item/mod/module/health_analyzer, - /obj/item/mod/module/quick_carry, - ) - -/obj/item/mod/control/pre_equipped/rescue - theme = /datum/mod_theme/rescue - cell = /obj/item/stock_parts/cell/super - initial_modules = list( - /obj/item/mod/module/storage, - /obj/item/mod/module/flashlight, - /obj/item/mod/module/health_analyzer, - ) - -/obj/item/mod/control/pre_equipped/research - theme = /datum/mod_theme/research - cell = /obj/item/stock_parts/cell/super - initial_modules = list( - /obj/item/mod/module/storage, - /obj/item/mod/module/welding, - /obj/item/mod/module/flashlight, - /obj/item/mod/module/t_ray, - ) - -/obj/item/mod/control/pre_equipped/security - theme = /datum/mod_theme/security - initial_modules = list( - /obj/item/mod/module/storage, - /obj/item/mod/module/welding, - /obj/item/mod/module/flashlight, - /obj/item/mod/module/holster, - ) - -/obj/item/mod/control/pre_equipped/safeguard - theme = /datum/mod_theme/safeguard - cell = /obj/item/stock_parts/cell/super - initial_modules = list( - /obj/item/mod/module/storage, - /obj/item/mod/module/welding, - /obj/item/mod/module/flashlight, - /obj/item/mod/module/jetpack, - /obj/item/mod/module/holster, - ) - -/obj/item/mod/control/pre_equipped/magnate - theme = /datum/mod_theme/magnate - cell = /obj/item/stock_parts/cell/hyper - initial_modules = list( - /obj/item/mod/module/storage, - /obj/item/mod/module/welding, - /obj/item/mod/module/holster, - /obj/item/mod/module/jetpack/advanced, - ) - -/obj/item/mod/control/pre_equipped/traitor - theme = /datum/mod_theme/syndicate - cell = /obj/item/stock_parts/cell/super - initial_modules = list( - /obj/item/mod/module/storage, - /obj/item/mod/module/welding, - /obj/item/mod/module/flashlight, - /obj/item/mod/module/dna_lock, - /obj/item/mod/module/jetpack, - ) - -/obj/item/mod/control/pre_equipped/nuclear - theme = /datum/mod_theme/syndicate - cell = /obj/item/stock_parts/cell/hyper - initial_modules = list( - /obj/item/mod/module/storage, - /obj/item/mod/module/welding, - /obj/item/mod/module/visor/thermal, - /obj/item/mod/module/flashlight, - /obj/item/mod/module/jetpack/advanced, - /obj/item/mod/module/holster, - ) - -/obj/item/mod/control/pre_equipped/elite - theme = /datum/mod_theme/elite - cell = /obj/item/stock_parts/cell/bluespace - initial_modules = list( - /obj/item/mod/module/storage, - /obj/item/mod/module/welding, - /obj/item/mod/module/emp_shield, - /obj/item/mod/module/visor/thermal, - /obj/item/mod/module/jetpack/advanced, - /obj/item/mod/module/flashlight, - /obj/item/mod/module/holster, - ) - -/obj/item/mod/control/pre_equipped/prototype - theme = /datum/mod_theme/prototype - cell = /obj/item/stock_parts/cell/high/plus - initial_modules = list( - /obj/item/mod/module/storage, - /obj/item/mod/module/welding, - /obj/item/mod/module/rad_protection, - /obj/item/mod/module/flashlight, - /obj/item/mod/module/tether, - ) - -/obj/item/mod/control/pre_equipped/responsory - theme = /datum/mod_theme/responsory - cell = /obj/item/stock_parts/cell/hyper - initial_modules = list( - /obj/item/mod/module/storage, - /obj/item/mod/module/welding, - /obj/item/mod/module/emp_shield, - /obj/item/mod/module/flashlight, - /obj/item/mod/module/holster, - ) - var/insignia_type = /obj/item/mod/module/insignia - -/obj/item/mod/control/pre_equipped/responsory/Initialize(mapload, new_theme, new_skin) - initial_modules.Insert(1, insignia_type) - return ..() - -/obj/item/mod/control/pre_equipped/responsory/commander - insignia_type = /obj/item/mod/module/insignia/commander - -/obj/item/mod/control/pre_equipped/responsory/security - insignia_type = /obj/item/mod/module/insignia/security - -/obj/item/mod/control/pre_equipped/responsory/engineer - insignia_type = /obj/item/mod/module/insignia/engineer - -/obj/item/mod/control/pre_equipped/responsory/medic - insignia_type = /obj/item/mod/module/insignia/medic - -/obj/item/mod/control/pre_equipped/responsory/janitor - insignia_type = /obj/item/mod/module/insignia/janitor - -/obj/item/mod/control/pre_equipped/responsory/clown - insignia_type = /obj/item/mod/module/insignia/clown - -/obj/item/mod/control/pre_equipped/responsory/chaplain - insignia_type = /obj/item/mod/module/insignia/chaplain - -/obj/item/mod/control/pre_equipped/responsory/inquisitory - initial_modules = list( - /obj/item/mod/module/storage, - /obj/item/mod/module/anti_magic, - /obj/item/mod/module/welding, - /obj/item/mod/module/emp_shield, - /obj/item/mod/module/flashlight, - /obj/item/mod/module/holster, - ) - applied_skin = "inquisitory" - -/obj/item/mod/control/pre_equipped/responsory/inquisitory/commander - insignia_type = /obj/item/mod/module/insignia/commander - -/obj/item/mod/control/pre_equipped/responsory/inquisitory/security - insignia_type = /obj/item/mod/module/insignia/security - -/obj/item/mod/control/pre_equipped/responsory/inquisitory/medic - insignia_type = /obj/item/mod/module/insignia/medic - -/obj/item/mod/control/pre_equipped/responsory/inquisitory/chaplain - insignia_type = /obj/item/mod/module/insignia/chaplain - -/obj/item/mod/control/pre_equipped/apocryphal - theme = /datum/mod_theme/apocryphal - cell = /obj/item/stock_parts/cell/bluespace - initial_modules = list( - /obj/item/mod/module/storage, - /obj/item/mod/module/welding, - /obj/item/mod/module/emp_shield, - /obj/item/mod/module/holster, - /obj/item/mod/module/jetpack, - ) - -/obj/item/mod/control/pre_equipped/corporate - theme = /datum/mod_theme/corporate - cell = /obj/item/stock_parts/cell/bluespace - initial_modules = list( - /obj/item/mod/module/storage, - /obj/item/mod/module/holster, - ) - -/obj/item/mod/control/pre_equipped/debug - theme = /datum/mod_theme/debug - cell = /obj/item/stock_parts/cell/bluespace - initial_modules = list( - /obj/item/mod/module/storage, - /obj/item/mod/module/welding, - /obj/item/mod/module/flashlight, - /obj/item/mod/module/bikehorn, - /obj/item/mod/module/rad_protection, - /obj/item/mod/module/tether, - ) //one of every type of module, for testing if they all work correctly - -/obj/item/mod/control/pre_equipped/administrative - theme = /datum/mod_theme/administrative - cell = /obj/item/stock_parts/cell/infinite/abductor - initial_modules = list( - /obj/item/mod/module/storage, - /obj/item/mod/module/welding, - /obj/item/mod/module/quick_carry/advanced, - /obj/item/mod/module/magboot/advanced, - /obj/item/mod/module/jetpack/advanced, - ) - -//these exist for the prefs menu -/obj/item/mod/control/pre_equipped/syndicate_empty - theme = /datum/mod_theme/syndicate - -/obj/item/mod/control/pre_equipped/syndicate_empty/elite - theme = /datum/mod_theme/elite - -INITIALIZE_IMMEDIATE(/obj/item/mod/control/pre_equipped/syndicate_empty) diff --git a/code/modules/mod/mod_ui.dm b/code/modules/mod/mod_ui.dm deleted file mode 100644 index f119a895b3..0000000000 --- a/code/modules/mod/mod_ui.dm +++ /dev/null @@ -1,86 +0,0 @@ -/obj/item/mod/control/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "MODsuit", name) - ui.open() - -/obj/item/mod/control/ui_data(mob/user) - var/data = list() - data["interface_break"] = interface_break - data["malfunctioning"] = malfunctioning - data["open"] = open - data["active"] = active - data["locked"] = locked - data["complexity"] = complexity - data["selected_module"] = selected_module?.name - data["wearer_name"] = wearer ? (wearer.get_authentification_name("Unknown") || "Unknown") : "No Occupant" - data["wearer_job"] = wearer ? wearer.get_assignment("Unknown", "Unknown", FALSE) : "No Job" - data["AI"] = ai?.name - data["is_pAI"] = ai ? ispAI(ai) : FALSE - data["is_user_AI"] = ai ? user == ai : FALSE - data["cell"] = cell?.name - data["charge"] = cell ? round(cell.percent(), 1) : 0 - data["modules"] = list() - for(var/obj/item/mod/module/module as anything in modules) - var/list/module_data = list( - name = module.name, - description = module.desc, - module_type = module.module_type, - active = module.active, - idle_power = module.idle_power_cost, - active_power = module.active_power_cost, - use_power = module.use_power_cost, - complexity = module.complexity, - cooldown_time = module.cooldown_time, - cooldown = round(COOLDOWN_TIMELEFT(module, cooldown_timer), 1 SECONDS), - id = module.tgui_id, - ref = REF(module), - configuration_data = module.get_configuration() - ) - module_data += module.add_ui_data() - data["modules"] += list(module_data) - return data - -/obj/item/mod/control/ui_static_data(mob/user) - var/data = list() - data["ui_theme"] = ui_theme - data["control"] = name - data["complexity_max"] = complexity_max - data["helmet"] = helmet?.name - data["chestplate"] = chestplate?.name - data["gauntlets"] = gauntlets?.name - data["boots"] = boots?.name - return data - -/obj/item/mod/control/ui_act(action, params) - . = ..() - if(.) - return - if((!allowed(usr) || !ispAI(usr)) && locked) - balloon_alert(usr, "insufficient access!") - playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) - return - if(malfunctioning && prob(75)) - balloon_alert(usr, "button malfunctions!") - return - switch(action) - if("lock") - locked = !locked - balloon_alert(usr, "[locked ? "locked" : "unlocked"]!") - if("activate") - toggle_activate(usr) - if("select") - var/obj/item/mod/module/module = locate(params["ref"]) in modules - if(!module) - return - module.on_select() - if("configure") - var/obj/item/mod/module/module = locate(params["ref"]) in modules - if(!module) - return - module.configure_edit(params["key"], params["value"]) - if("remove_pai") - if(ishuman(usr)) // Only the MODsuit's wearer should be removing the pAI. - var/mob/user = usr - extract_pai(user) - return TRUE diff --git a/code/modules/mod/modules/_module.dm b/code/modules/mod/modules/_module.dm deleted file mode 100644 index 2d008cad1c..0000000000 --- a/code/modules/mod/modules/_module.dm +++ /dev/null @@ -1,357 +0,0 @@ -/obj/item/mod/module - name = "MOD module" - icon = 'icons/obj/clothing/modsuit/mod_modules.dmi' - icon_state = "module" - /// If it can be removed - var/removable = TRUE - /// If it's passive, togglable, usable or active - var/module_type = MODULE_PASSIVE - /// Is the module active - var/active = FALSE - /// How much space it takes up in the MOD - var/complexity = 0 - /// Power use when idle - var/idle_power_cost = DEFAULT_CHARGE_DRAIN * 0 - /// Power use when active - var/active_power_cost = DEFAULT_CHARGE_DRAIN * 0 - /// Power use when used, we call it manually - var/use_power_cost = DEFAULT_CHARGE_DRAIN * 0 - /// ID used by their TGUI - var/tgui_id - /// Linked MODsuit - var/obj/item/mod/control/mod - /// If we're an active module, what item are we? - var/obj/item/device - /// Overlay given to the user when the module is inactive - var/overlay_state_inactive - /// Overlay given to the user when the module is active - var/overlay_state_active - /// Overlay given to the user when the module is used, lasts until cooldown finishes - var/overlay_state_use - /// Icon file for the overlay. - var/overlay_icon_file = 'icons/mob/clothing/modsuit/mod_modules.dmi' - /// Does the overlay use the control unit's colors? - var/use_mod_colors = FALSE - /// What modules are we incompatible with? - var/list/incompatible_modules = list() - /// Cooldown after use - var/cooldown_time = 0 - /// The mouse button needed to use this module - var/used_signal - /// If we're allowed to use this module while phased out. - var/allowed_in_phaseout = FALSE - /// If we're allowed to use this module while the suit is disabled. - var/allowed_inactive = FALSE - /// Timer for the cooldown - COOLDOWN_DECLARE(cooldown_timer) - -/obj/item/mod/module/Initialize(mapload) - . = ..() - if(module_type != MODULE_ACTIVE) - return - if(ispath(device)) - device = new device(src) - ADD_TRAIT(device, TRAIT_NODROP, MOD_TRAIT) - RegisterSignal(device, COMSIG_PARENT_PREQDELETED, .proc/on_device_deletion) - RegisterSignal(src, COMSIG_ATOM_EXITED, .proc/on_exit) - -/obj/item/mod/module/Destroy() - mod?.uninstall(src) - if(device) - UnregisterSignal(device, COMSIG_PARENT_PREQDELETED) - QDEL_NULL(device) - return ..() - -/obj/item/mod/module/examine(mob/user) - . = ..() - if(user.hud_list[DIAG_HUD] && user.client.images & user.hud_list[DIAG_HUD]) - . += span_notice("Complexity level: [complexity]") - -/// Called from MODsuit's install() proc, so when the module is installed. -/obj/item/mod/module/proc/on_install() - return - -/// Called from MODsuit's uninstall() proc, so when the module is uninstalled. -/obj/item/mod/module/proc/on_uninstall() - return - -/// Called when the MODsuit is activated -/obj/item/mod/module/proc/on_suit_activation() - return - -/// Called when the MODsuit is deactivated -/obj/item/mod/module/proc/on_suit_deactivation() - return - -/// Called when the MODsuit is equipped -/obj/item/mod/module/proc/on_equip() - return - -/// Called when the MODsuit is unequipped -/obj/item/mod/module/proc/on_unequip() - return - -/// Called when the module is selected from the TGUI -/obj/item/mod/module/proc/on_select() - if(((!mod.active || mod.activating) && !allowed_inactive) || module_type == MODULE_PASSIVE) - if(mod.wearer) - balloon_alert(mod.wearer, "not active!") - return - if(module_type != MODULE_USABLE) - if(active) - on_deactivation() - else - on_activation() - else - on_use() - SEND_SIGNAL(mod, COMSIG_MOD_MODULE_SELECTED, src) - -/// Called when the module is activated -/obj/item/mod/module/proc/on_activation() - if(!COOLDOWN_FINISHED(src, cooldown_timer)) - balloon_alert(mod.wearer, "on cooldown!") - return FALSE - if(!mod.active || mod.activating || !mod.cell?.charge) - balloon_alert(mod.wearer, "unpowered!") - return FALSE - if(!allowed_in_phaseout && istype(mod.wearer.loc, /obj/effect/dummy/phased_mob)) - //specifically a to_chat because the user is phased out. - to_chat(mod.wearer, span_warning("You cannot activate this right now.")) - return FALSE - if(module_type == MODULE_ACTIVE) - if(mod.selected_module && !mod.selected_module.on_deactivation()) - return - mod.selected_module = src - if(device) - if(mod.wearer.put_in_hands(device)) - balloon_alert(mod.wearer, "[device] extended") - RegisterSignal(mod.wearer, COMSIG_ATOM_EXITED, .proc/on_exit) - else - balloon_alert(mod.wearer, "can't extend [device]!") - return - else - update_signal() - balloon_alert(mod.wearer, "[src] activated, alt-click to use") - active = TRUE - mod.wearer.update_inv_back() - return TRUE - -/// Called when the module is deactivated -/obj/item/mod/module/proc/on_deactivation() - active = FALSE - if(module_type == MODULE_ACTIVE) - mod.selected_module = null - if(device) - mod.wearer.transferItemToLoc(device, src, TRUE) - balloon_alert(mod.wearer, "[device] retracted") - UnregisterSignal(mod.wearer, COMSIG_ATOM_EXITED) - else - balloon_alert(mod.wearer, "[src] deactivated") - UnregisterSignal(mod.wearer, used_signal) - used_signal = null - mod.wearer.update_inv_back() - return TRUE - -/// Called when the module is used -/obj/item/mod/module/proc/on_use() - if(!COOLDOWN_FINISHED(src, cooldown_timer)) - return FALSE - if(!check_power(use_power_cost)) - return FALSE - if(!allowed_in_phaseout && istype(mod.wearer.loc, /obj/effect/dummy/phased_mob)) - //specifically a to_chat because the user is phased out. - to_chat(mod.wearer, span_warning("You cannot activate this right now.")) - return FALSE - COOLDOWN_START(src, cooldown_timer, cooldown_time) - addtimer(CALLBACK(mod.wearer, /mob.proc/update_inv_back), cooldown_time) - mod.wearer.update_inv_back() - return TRUE - -/// Called when an activated module without a device is used -/obj/item/mod/module/proc/on_select_use(atom/target) - if(mod.wearer.incapacitated(ignore_grab = TRUE)) - return FALSE - mod.wearer.face_atom(target) - if(!on_use()) - return FALSE - return TRUE - -/// Called when an activated module without a device is active and the user alt/middle-clicks -/obj/item/mod/module/proc/on_special_click(mob/source, atom/target) - SIGNAL_HANDLER - on_select_use(target) - return COMSIG_MOB_CANCEL_CLICKON - -/// Called on the MODsuit's process -/obj/item/mod/module/proc/on_process(delta_time) - if(active) - if(!drain_power(active_power_cost * delta_time)) - on_deactivation() - return FALSE - on_active_process(delta_time) - else - drain_power(idle_power_cost * delta_time) - return TRUE - -/// Called on the MODsuit's process if it is an active module -/obj/item/mod/module/proc/on_active_process(delta_time) - return - -/// Drains power from the suit cell -/obj/item/mod/module/proc/drain_power(amount) - if(!check_power(amount)) - return FALSE - mod.cell.charge = max(0, mod.cell.charge - amount) - return TRUE - -/obj/item/mod/module/proc/check_power(amount) - if(!mod.cell || (mod.cell.charge < amount)) - return FALSE - return TRUE - -/// Adds additional things to the MODsuit ui_data() -/obj/item/mod/module/proc/add_ui_data() - return list() - -/// Creates a list of configuring options for this module -/obj/item/mod/module/proc/get_configuration() - return list() - -/// Generates an element of the get_configuration list with a display name, type and value -/obj/item/mod/module/proc/add_ui_configuration(display_name, type, value, list/values) - return list("display_name" = display_name, "type" = type, "value" = value, "values" = values) - -/// Receives configure edits from the TGUI and edits the vars -/obj/item/mod/module/proc/configure_edit(key, value) - return - -/// Called when the device moves to a different place on active modules -/obj/item/mod/module/proc/on_exit(datum/source, atom/movable/part, direction) - SIGNAL_HANDLER - - if(!active) - return - if(part.loc == src) - return - if(part.loc == mod.wearer) - return - if(part == device) - on_deactivation() - -/// Called when the device gets deleted on active modules -/obj/item/mod/module/proc/on_device_deletion(datum/source) - SIGNAL_HANDLER - - if(source == device) - device = null - qdel(src) - -/// Generates an icon to be used for the suit's worn overlays -/obj/item/mod/module/proc/generate_worn_overlay() - . = list() - if(!mod.active) - return - var/used_overlay - if(overlay_state_use && !COOLDOWN_FINISHED(src, cooldown_timer)) - used_overlay = overlay_state_use - else if(overlay_state_active && active) - used_overlay = overlay_state_active - else if(overlay_state_inactive) - used_overlay = overlay_state_inactive - else - return - var/mutable_appearance/module_icon = mutable_appearance(overlay_icon_file, used_overlay) - if(!use_mod_colors) - module_icon.appearance_flags |= RESET_COLOR - . += module_icon - -/// Updates the signal used by active modules to be activated -/obj/item/mod/module/proc/update_signal() - mod.selected_module.used_signal = COMSIG_MOB_ALTCLICKON - RegisterSignal(mod.wearer, mod.selected_module.used_signal, /obj/item/mod/module.proc/on_special_click) - -/obj/item/mod/module/anomaly_locked - name = "MOD anomaly locked module" - desc = "A form of a module, locked behind an anomalous core to function." - incompatible_modules = list(/obj/item/mod/module/anomaly_locked) - /// The core item the module runs off. - var/obj/item/assembly/signaler/anomaly/core - /// Accepted types of anomaly cores. - var/list/accepted_anomalies = list(/obj/item/assembly/signaler/anomaly) - /// If this one starts with a core in. - var/prebuilt = FALSE - -/obj/item/mod/module/anomaly_locked/Initialize(mapload) - . = ..() - if(!prebuilt || !length(accepted_anomalies)) - return - var/core_path = pick(accepted_anomalies) - core = new core_path(src) - update_icon_state() - -/obj/item/mod/module/anomaly_locked/Destroy() - QDEL_NULL(core) - return ..() - -/obj/item/mod/module/anomaly_locked/examine(mob/user) - . = ..() - if(!length(accepted_anomalies)) - return - if(core) - . += span_notice("There is a [core.name] installed in it. You could remove it with a screwdriver...") - else - var/list/core_list = list() - for(var/path in accepted_anomalies) - var/atom/core_path = path - core_list += initial(core_path.name) - . += span_notice("You need to insert \a [english_list(core_list, and_text = " or ")] for this module to function.") - -/obj/item/mod/module/anomaly_locked/on_select() - if(!core) - balloon_alert(mod.wearer, "no core!") - return - return ..() - -/obj/item/mod/module/anomaly_locked/on_process(delta_time) - . = ..() - if(!core) - return FALSE - -/obj/item/mod/module/anomaly_locked/on_active_process(delta_time) - if(!core) - return FALSE - return TRUE - -/obj/item/mod/module/anomaly_locked/attackby(obj/item/item, mob/living/user, params) - if(item.type in accepted_anomalies) - if(core) - balloon_alert(user, "core already in!") - return - if(!user.transferItemToLoc(item, src)) - return - core = item - balloon_alert(user, "core installed") - playsound(src, 'sound/machines/click.ogg', 30, TRUE) - update_icon_state() - else - return ..() - -/obj/item/mod/module/anomaly_locked/screwdriver_act(mob/living/user, obj/item/tool) - . = ..() - if(!core) - balloon_alert(user, "no core!") - return - balloon_alert(user, "removing core...") - if(!do_after(user, 3 SECONDS, target = src)) - balloon_alert(user, "interrupted!") - return - balloon_alert(user, "core removed") - core.forceMove(drop_location()) - if(Adjacent(user) && !issilicon(user)) - user.put_in_hands(core) - core = null - update_icon_state() - -/obj/item/mod/module/anomaly_locked/update_icon_state() - icon_state = initial(icon_state) + (core ? "-core" : "") - return ..() diff --git a/code/modules/mod/modules/modules.dm b/code/modules/mod/modules/modules.dm deleted file mode 100644 index 0e0da3572b..0000000000 --- a/code/modules/mod/modules/modules.dm +++ /dev/null @@ -1,96 +0,0 @@ -/obj/item/mod/module/anti_magic/on_suit_activation() - ADD_TRAIT(mod.wearer, TRAIT_ANTIMAGIC, MOD_TRAIT) - ADD_TRAIT(mod.wearer, TRAIT_HOLY, MOD_TRAIT) - -/obj/item/mod/module/anti_magic/on_suit_deactivation() - REMOVE_TRAIT(mod.wearer, TRAIT_ANTIMAGIC, MOD_TRAIT) - REMOVE_TRAIT(mod.wearer, TRAIT_HOLY, MOD_TRAIT) - -/obj/item/mod/module/anti_magic/wizard - name = "MOD magic neutralizer module" - desc = "The caster wielding this spell gains an invisible barrier around them, channeling arcane power through \ - specialized runes engraved onto the surface of the suit to generate anti-magic field. \ - The field will neutralize all magic that comes into contact with the user. \ - It will not protect the caster from social ridicule." - icon_state = "magic_neutralizer" - -/obj/item/mod/module/anti_magic/wizard/on_suit_activation() - ADD_TRAIT(mod.wearer, TRAIT_ANTIMAGIC_NO_SELFBLOCK, MOD_TRAIT) - -/obj/item/mod/module/anti_magic/wizard/on_suit_deactivation() - REMOVE_TRAIT(mod.wearer, TRAIT_ANTIMAGIC_NO_SELFBLOCK, MOD_TRAIT) - -/obj/item/mod/module/kinesis //TODO POST-MERGE MAKE NOT SUCK ASS, MAKE BALLER AS FUCK - name = "MOD kinesis module" - desc = "A modular plug-in to the forearm, this module was presumed lost for many years, \ - despite the suits it used to be mounted on still seeing some circulation. \ - This piece of technology allows the user to generate precise anti-gravity fields, \ - letting them move objects as small as a titanium rod to as large as industrial machinery. \ - Oddly enough, it doesn't seem to work on living creatures." - icon_state = "kinesis" -// module_type = MODULE_ACTIVE - module_type = MODULE_TOGGLE -// complexity = 3 - complexity = 0 - active_power_cost = DEFAULT_CHARGE_DRAIN*0.75 -// use_power_cost = DEFAULT_CHARGE_DRAIN*3 - removable = FALSE - incompatible_modules = list(/obj/item/mod/module/kinesis) - cooldown_time = 0.5 SECONDS - var/has_tk = FALSE - -/obj/item/mod/module/kinesis/on_activation() - . = ..() - if(!.) - return - if(mod.wearer.dna.check_mutation(TK)) - has_tk = TRUE - else - mod.wearer.dna.add_mutation(TK) - -/obj/item/mod/module/kinesis/on_deactivation() - . = ..() - if(!.) - return - if(has_tk) - has_tk = FALSE - return - mod.wearer.dna.remove_mutation(TK) - -/obj/item/mod/module/insignia - name = "MOD insignia module" - desc = "Despite the existence of IFF systems, radio communique, and modern methods of deductive reasoning involving \ - the wearer's own eyes, colorful paint jobs remain a popular way for different factions in the galaxy to display who \ - they are. This system utilizes a series of tiny moving paint sprayers to both apply and remove different \ - color patterns to and from the suit." - icon_state = "insignia" - removable = FALSE - incompatible_modules = list(/obj/item/mod/module/insignia) - overlay_state_inactive = "insignia" - -/obj/item/mod/module/insignia/generate_worn_overlay() - overlay_state_inactive = "[initial(overlay_state_inactive)]-[mod.skin]" - . = ..() - for(var/mutable_appearance/appearance as anything in .) - appearance.color = color - -/obj/item/mod/module/insignia/commander - color = "#4980a5" - -/obj/item/mod/module/insignia/security - color = "#b30d1e" - -/obj/item/mod/module/insignia/engineer - color = "#e9c80e" - -/obj/item/mod/module/insignia/medic - color = "#ebebf5" - -/obj/item/mod/module/insignia/janitor - color = "#7925c7" - -/obj/item/mod/module/insignia/clown - color = "#ff1fc7" - -/obj/item/mod/module/insignia/chaplain - color = "#f0a00c" diff --git a/code/modules/mod/modules/modules_engineering.dm b/code/modules/mod/modules/modules_engineering.dm deleted file mode 100644 index cc0a6812f1..0000000000 --- a/code/modules/mod/modules/modules_engineering.dm +++ /dev/null @@ -1,215 +0,0 @@ -//Engineering modules for MODsuits - -///Welding Protection - Makes the helmet protect from flashes and welding. -/obj/item/mod/module/welding - name = "MOD welding protection module" - desc = "A module installed into the visor of the suit, this projects a \ - polarized, holographic overlay in front of the user's eyes. It's rated high enough for \ - immunity against extremities such as spot and arc welding, solar eclipses, and handheld flashlights." - icon_state = "welding" - complexity = 1 - incompatible_modules = list(/obj/item/mod/module/welding) - overlay_state_inactive = "module_welding" - -/obj/item/mod/module/welding/on_suit_activation() - mod.helmet.flash_protect = 2 - -/obj/item/mod/module/welding/on_suit_deactivation(deleting = FALSE) - if(deleting) - return - mod.helmet.flash_protect = initial(mod.helmet.flash_protect) - -///T-Ray Scan - Scans the terrain for undertile objects. -/obj/item/mod/module/t_ray - name = "MOD t-ray scan module" - desc = "A module installed into the visor of the suit, allowing the user to use a pulse of terahertz radiation \ - to essentially echolocate things beneath the floor, mostly cables and pipes. \ - A staple of atmospherics work, and counter-smuggling work." - icon_state = "tray" - module_type = MODULE_TOGGLE - complexity = 1 - active_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 - incompatible_modules = list(/obj/item/mod/module/t_ray) - cooldown_time = 0.5 SECONDS - /// T-ray scan range. - var/range = 4 - -/obj/item/mod/module/t_ray/on_active_process(delta_time) - t_ray_scan(mod.wearer, 0.8 SECONDS, range) - -///Magnetic Stability - Gives the user a slowdown but makes them negate gravity and be immune to slips. -/obj/item/mod/module/magboot - name = "MOD magnetic stability module" - desc = "These are powerful electromagnets fitted into the suit's boots, allowing users both \ - excellent traction no matter the condition indoors, and to essentially hitch a ride on the exterior of a hull. \ - However, these basic models do not feature computerized systems to automatically toggle them on and off, \ - so numerous users report a certain stickiness to their steps." - icon_state = "magnet" - module_type = MODULE_TOGGLE - complexity = 2 - active_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 - incompatible_modules = list(/obj/item/mod/module/magboot) - cooldown_time = 0.5 SECONDS - /// Slowdown added onto the suit. - var/slowdown_active = 2 - -/obj/item/mod/module/magboot/on_activation() - . = ..() - if(!.) - return - mod.boots.clothing_flags |= NOSLIP - ADD_TRAIT(mod.wearer, TRAIT_NOSLIPWATER, MOD_TRAIT) - mod.slowdown += slowdown_active - mod.wearer.update_gravity(mod.wearer.has_gravity()) - mod.wearer.update_equipment_speed_mods() - -/obj/item/mod/module/magboot/on_deactivation(display_message = TRUE, deleting = FALSE) - . = ..() - if(!.) - return - mod.boots.clothing_flags &= ~NOSLIP - REMOVE_TRAIT(mod.wearer, TRAIT_NOSLIPWATER, MOD_TRAIT) - mod.slowdown -= slowdown_active - mod.wearer.update_gravity(mod.wearer.has_gravity()) - mod.wearer.update_equipment_speed_mods() - -/obj/item/mod/module/magboot/advanced - name = "MOD advanced magnetic stability module" - removable = FALSE - complexity = 0 - slowdown_active = 0 - -///Emergency Tether - Shoots a grappling hook projectile in 0g that throws the user towards it. -/obj/item/mod/module/tether - name = "MOD emergency tether module" - desc = "A custom-built grappling-hook powered by a winch capable of hauling the user. \ - While some older models of cargo-oriented grapples have capacities of a few tons, \ - these are only capable of working in zero-gravity environments, a blessing to some Engineers." - icon_state = "tether" - module_type = MODULE_ACTIVE - complexity = 3 - use_power_cost = DEFAULT_CHARGE_DRAIN - incompatible_modules = list(/obj/item/mod/module/tether) - cooldown_time = 1.5 SECONDS - -/obj/item/mod/module/tether/on_use() - if(mod.wearer.has_gravity(get_turf(src))) - balloon_alert(mod.wearer, "too much gravity!") - playsound(src, "gun_dry_fire", 25, TRUE) - return FALSE - return ..() - -/obj/item/mod/module/tether/on_select_use(atom/target) - . = ..() - if(!.) - return - var/obj/item/projectile/tether = new /obj/item/projectile/tether(mod.wearer.loc) - tether.preparePixelProjectile(target, mod.wearer) - tether.firer = mod.wearer - playsound(src, 'sound/weapons/batonextend.ogg', 25, TRUE) - INVOKE_ASYNC(tether, /obj/item/projectile.proc/fire) - drain_power(use_power_cost) - -/obj/item/projectile/tether - name = "tether" - icon_state = "tether_projectile" - icon = 'icons/obj/clothing/modsuit/mod_modules.dmi' - damage = 0 - nodamage = TRUE - range = 10 - hitsound = 'sound/weapons/batonextend.ogg' - hitsound_wall = 'sound/weapons/batonextend.ogg' - suppressed = SUPPRESSED_VERY - hit_threshhold = LATTICE_LAYER - /// Reference to the beam following the projectile. - var/line - -/obj/item/projectile/tether/fire(setAngle) - if(firer) - line = firer.Beam(src, "line", 'icons/obj/clothing/modsuit/mod_modules.dmi') - ..() - -/obj/item/projectile/tether/on_hit(atom/target) - . = ..() - if(firer) - firer.throw_at(target, 10, 1, firer, FALSE, FALSE, null, MOVE_FORCE_NORMAL, TRUE) - -/obj/item/projectile/tether/Destroy() - QDEL_NULL(line) - return ..() - -///Radiation Protection - Protects the user from radiation, gives them a geiger counter and rad info in the panel. -/obj/item/mod/module/rad_protection - name = "MOD radiation protection module" - desc = "A module utilizing polymers and reflective shielding to protect the user against ionizing radiation." - icon_state = "radshield" - complexity = 2 - idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 - incompatible_modules = list(/obj/item/mod/module/rad_protection) - -/obj/item/mod/module/rad_protection/on_suit_activation() - mod.armor = mod.armor.modifyRating(rad = 65) - mod.rad_flags = RAD_PROTECT_CONTENTS|RAD_NO_CONTAMINATE - for(var/obj/item/part in mod.mod_parts) - part.armor = mod.armor - part.rad_flags = mod.rad_flags - -/obj/item/mod/module/rad_protection/on_suit_deactivation(deleting = FALSE) - mod.armor = mod.armor.modifyRating(rad = -65) - mod.rad_flags = NONE - for(var/obj/item/part in mod.mod_parts) - part.armor = mod.armor - part.rad_flags = mod.rad_flags - -///Constructor - Lets you build quicker and create RCD holograms. -/obj/item/mod/module/constructor - name = "MOD constructor module" - desc = "This module entirely occupies the wearer's forearm, notably causing conflict with \ - advanced arm servos meant to carry crewmembers. However, it contains the \ - latest engineering schematics combined with inbuilt memory to help the user build walls." - icon_state = "constructor" - module_type = MODULE_USABLE - complexity = 2 - idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.2 - use_power_cost = DEFAULT_CHARGE_DRAIN * 2 - incompatible_modules = list(/obj/item/mod/module/constructor, /obj/item/mod/module/quick_carry) - cooldown_time = 11 SECONDS - -/obj/item/mod/module/constructor/on_suit_activation() - ADD_TRAIT(mod.wearer, TRAIT_QUICK_BUILD, MOD_TRAIT) - -/obj/item/mod/module/constructor/on_suit_deactivation(deleting = FALSE) - REMOVE_TRAIT(mod.wearer, TRAIT_QUICK_BUILD, MOD_TRAIT) - -///Mister - Sprays water over an area. -/obj/item/mod/module/mister - name = "MOD water mister module" - desc = "A module containing a mister, able to spray it over areas." - icon_state = "mister" - module_type = MODULE_ACTIVE - complexity = 2 - active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 - device = /obj/item/reagent_containers/spray/mister - incompatible_modules = list(/obj/item/mod/module/mister) - cooldown_time = 0.5 SECONDS - /// Volume of our reagent holder. - var/volume = 500 - -/obj/item/mod/module/mister/Initialize(mapload) - create_reagents(volume, OPENCONTAINER) - return ..() - -///Resin Mister - Sprays resin over an area. -/obj/item/mod/module/mister/atmos - name = "MOD resin mister module" - desc = "An atmospheric resin mister, able to fix up areas quickly." - device = /obj/item/extinguisher/mini/nozzle/mod - volume = 250 - -/obj/item/mod/module/mister/atmos/Initialize(mapload) - . = ..() - reagents.add_reagent(/datum/reagent/water, volume) - -/obj/item/extinguisher/mini/nozzle/mod - name = "MOD atmospheric mister" - desc = "An atmospheric resin mister with three modes, mounted as a module." diff --git a/code/modules/mod/modules/modules_general.dm b/code/modules/mod/modules/modules_general.dm deleted file mode 100644 index f2713d4c9c..0000000000 --- a/code/modules/mod/modules/modules_general.dm +++ /dev/null @@ -1,402 +0,0 @@ -//General modules for MODsuits - -///Storage - Adds a storage component to the suit. -/obj/item/mod/module/storage - name = "MOD storage containment module" - desc = "What amounts to a series of integrated storage compartments and specialized pockets installed across \ - the surface of the suit, useful for storing various bits, and or bobs." - icon_state = "storage" - complexity = 3 - incompatible_modules = list(/obj/item/mod/module/storage) - module_type = MODULE_USABLE - cooldown_time = 0.5 SECONDS - allowed_inactive = TRUE - /// Bag we have stored. - var/obj/item/storage/backpack/stored - -/obj/item/mod/module/storage/attackby(obj/item/I, mob/user, params) - if(!istype(I, /obj/item/storage/backpack)) - return ..() - var/obj/item/storage/backpack/B = I - if(stored) - balloon_alert(user, "backpack already installed!") - return - if(!user.transferItemToLoc(B, src)) - return - stored = B - balloon_alert(user, "backpack installed") - playsound(src, 'sound/machines/click.ogg', 30, TRUE) - -/obj/item/mod/module/storage/screwdriver_act(mob/living/user, obj/item/tool) - . = ..() - if(!stored) - balloon_alert(user, "no backpack!") - return - balloon_alert(user, "removing backpack...") - if(!do_after(user, 3 SECONDS, target = src)) - balloon_alert(user, "interrupted!") - return - balloon_alert(user, "backpack removed") - stored.forceMove(drop_location()) - if(Adjacent(user) && !issilicon(user)) - user.put_in_hands(stored) - stored = null - -/obj/item/mod/module/storage/on_use() - . = ..() - if(!.) - return - if(!stored) - var/obj/item/storage/backpack/holding = mod.wearer.get_active_held_item() - if(!holding) - balloon_alert(mod.wearer, "no backpack installed!") - return - if(!istype(holding)) - balloon_alert(mod.wearer, "it doesn't fit!") - return - if(mod.wearer.transferItemToLoc(holding, src, force = FALSE, silent = TRUE)) - stored = holding - balloon_alert(mod.wearer, "backpack stored") - playsound(src, 'sound/weapons/revolverempty.ogg', 100, TRUE) - else if(mod.wearer.put_in_active_hand(stored, forced = FALSE, ignore_animation = TRUE)) - balloon_alert(mod.wearer, "backpack retrieved") - playsound(src, 'sound/weapons/revolverempty.ogg', 100, TRUE) - else - balloon_alert(mod.wearer, "backpack storage full!") - -/obj/item/mod/module/storage/Exited(atom/movable/gone, direction) - . = ..() - if(gone == stored) - stored = null - -/obj/item/mod/module/storage/Destroy() - QDEL_NULL(stored) - return ..() - -///Ion Jetpack - Lets the user fly freely through space using battery charge. -/obj/item/mod/module/jetpack - name = "MOD ion jetpack module" - desc = "A series of electric thrusters installed across the suit, this is a module highly anticipated by trainee Engineers. \ - Rather than using gasses for combustion thrust, these jets are capable of accelerating ions using \ - charge from the suit's charge. Some say this isn't Nakamura Engineering's first foray into jet-enabled suits." - icon_state = "jetpack" - module_type = MODULE_TOGGLE - complexity = 3 - active_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 - use_power_cost = DEFAULT_CHARGE_DRAIN - incompatible_modules = list(/obj/item/mod/module/jetpack) - cooldown_time = 0.5 SECONDS - overlay_state_inactive = "module_jetpack" - overlay_state_active = "module_jetpack_on" - /// Do we stop the wearer from gliding in space. - var/stabilizers = FALSE - /// Do we give the wearer a speed buff. - var/full_speed = FALSE - var/datum/effect_system/trail_follow/ion/ion_trail - -/obj/item/mod/module/jetpack/Initialize(mapload) - . = ..() - ion_trail = new - ion_trail.set_up(src) - -/obj/item/mod/module/jetpack/Destroy() - QDEL_NULL(ion_trail) - return ..() - -/obj/item/mod/module/jetpack/on_activation() - . = ..() - if(!.) - return - ion_trail.start() - RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, .proc/move_react) - RegisterSignal(mod.wearer, COMSIG_MOVABLE_SPACEMOVE, .proc/spacemove_react, override = TRUE) - if(full_speed) - mod.wearer.add_movespeed_modifier(/datum/movespeed_modifier/jetpack/fullspeed) - else - mod.wearer.add_movespeed_modifier(/datum/movespeed_modifier/jetpack) - -/obj/item/mod/module/jetpack/on_deactivation(display_message = TRUE, deleting = FALSE) - . = ..() - stabilizers = FALSE - ion_trail.stop() - UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) - mod.wearer.remove_movespeed_modifier(/datum/movespeed_modifier/jetpack/fullspeed) - mod.wearer.remove_movespeed_modifier(/datum/movespeed_modifier/jetpack) - -/obj/item/mod/module/jetpack/get_configuration() - . = ..() - .["stabilizers"] = add_ui_configuration("Stabilizers", "bool", stabilizers) - -/obj/item/mod/module/jetpack/configure_edit(key, value) - switch(key) - if("stabilizers") - stabilizers = text2num(value) - -/obj/item/mod/module/jetpack/proc/move_react(mob/user) - allow_thrust() - -/obj/item/mod/module/jetpack/proc/allow_thrust(use_fuel = TRUE) - if(!active) - return FALSE - if(!use_fuel) - return check_power(use_power_cost) - if(!drain_power(use_power_cost)) - return FALSE - return TRUE - -/obj/item/mod/module/jetpack/proc/spacemove_react(mob/user, movement_dir) - SIGNAL_HANDLER - - if(active && (movement_dir || stabilizers)) - return COMSIG_MOVABLE_STOP_SPACEMOVE - -/obj/item/mod/module/jetpack/advanced - name = "MOD advanced ion jetpack module" - desc = "An improvement on the previous model of electric thrusters. This one achieves higher speeds through \ - mounting of more jets and a red paint applied on it." - icon_state = "jetpack_advanced" - overlay_state_inactive = "module_jetpackadv" - overlay_state_active = "module_jetpackadv_on" - full_speed = TRUE - -///Eating Apparatus - Lets the user eat/drink with the suit on. -/obj/item/mod/module/mouthhole - name = "MOD eating apparatus module" - desc = "A favorite by Miners, this modification to the helmet utilizes a nanotechnology barrier infront of the mouth \ - to allow eating and drinking while retaining protection and atmosphere. However, it won't free you from masks, \ - lets pepper spray pass through and it will do nothing to improve the taste of a goliath steak." - icon_state = "apparatus" - complexity = 1 - incompatible_modules = list(/obj/item/mod/module/mouthhole) - overlay_state_inactive = "module_apparatus" - /// Former flags of the helmet. - var/former_flags = NONE - /// Former visor flags of the helmet. - var/former_visor_flags = NONE - -/obj/item/mod/module/mouthhole/on_install() - former_flags = mod.helmet.flags_cover - former_visor_flags = mod.helmet.visor_flags_cover - mod.helmet.flags_cover &= ~HEADCOVERSMOUTH - mod.helmet.visor_flags_cover &= ~HEADCOVERSMOUTH - -/obj/item/mod/module/mouthhole/on_uninstall(deleting = FALSE) - if(deleting) - return - mod.helmet.flags_cover |= former_flags - mod.helmet.visor_flags_cover |= former_visor_flags - -///EMP Shield - Protects the suit from EMPs. -/obj/item/mod/module/emp_shield - name = "MOD EMP shield module" - desc = "A field inhibitor installed into the suit, protecting it against feedback such as \ - electromagnetic pulses that would otherwise damage the electronic systems of the suit or it's modules. \ - However, it will take from the suit's power to do so." - icon_state = "empshield" - complexity = 1 - idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 - incompatible_modules = list(/obj/item/mod/module/emp_shield) - -/obj/item/mod/module/emp_shield/on_install() - mod.AddElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_WIRES|EMP_PROTECT_CONTENTS) - -/obj/item/mod/module/emp_shield/on_uninstall(deleting = FALSE) - mod.RemoveElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_WIRES|EMP_PROTECT_CONTENTS) - -/obj/item/mod/module/emp_shield/advanced - name = "MOD advanced EMP shield module" - desc = "An advanced field inhibitor installed into the suit, protecting it against feedback such as \ - electromagnetic pulses that would otherwise damage the electronic systems of the suit or electronic devices on the wearer, \ - including augmentations. However, it will take from the suit's power to do so." - complexity = 2 - -/obj/item/mod/module/emp_shield/advanced/on_suit_activation() - mod.wearer.AddElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_CONTENTS) - -/obj/item/mod/module/emp_shield/advanced/on_suit_deactivation(deleting) - mod.wearer.RemoveElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_CONTENTS) - -///Flashlight - Gives the suit a customizable flashlight. -/obj/item/mod/module/flashlight - name = "MOD flashlight module" - desc = "A simple pair of configurable flashlights installed on the left and right sides of the helmet, \ - useful for providing light in a variety of ranges and colors. \ - Some survivalists prefer the color green for their illumination, for reasons unknown." - icon_state = "flashlight" - module_type = MODULE_TOGGLE - complexity = 1 - active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 - incompatible_modules = list(/obj/item/mod/module/flashlight) - cooldown_time = 0.5 SECONDS - overlay_state_inactive = "module_light" - light_color = COLOR_WHITE - light_range = 4 - light_power = 1 - /// Charge drain per range amount. - var/base_power = DEFAULT_CHARGE_DRAIN * 0.1 - /// Minimum range we can set. - var/min_range = 2 - /// Maximum range we can set. - var/max_range = 5 - -/obj/item/mod/module/flashlight/on_activation() - . = ..() - if(!.) - return - mod.set_light(light_range, light_power, light_color) - active_power_cost = base_power * light_range - -/obj/item/mod/module/flashlight/on_deactivation(display_message = TRUE, deleting = FALSE) - . = ..() - if(!.) - return - mod.set_light(0, 0) - -/obj/item/mod/module/flashlight/on_process(delta_time) - active_power_cost = base_power * light_range - return ..() - -/obj/item/mod/module/flashlight/generate_worn_overlay() - . = ..() - if(!active) - return - var/mutable_appearance/light_icon = mutable_appearance(overlay_icon_file, "module_light_on") - light_icon.appearance_flags = RESET_COLOR - light_icon.color = light_color - . += light_icon - -/obj/item/mod/module/flashlight/get_configuration() - . = ..() - .["light_color"] = add_ui_configuration("Light Color", "color", light_color) - .["light_range"] = add_ui_configuration("Light Range", "number", light_range) - -/obj/item/mod/module/flashlight/configure_edit(key, value) - switch(key) - if("light_color") - value = input(usr, "Pick new light color", "Flashlight Color") as color|null - if(!value) - return - var/list/hsl = rgb2hsl(hex2num(copytext(value,2,4)),hex2num(copytext(value,4,6)),hex2num(copytext(value,6,8))) - if(hsl[3] < 0.5) - balloon_alert(mod.wearer, "too dark!") - return - mod.set_light_color(value) - mod.wearer.regenerate_icons() - light_color = value - if("light_range") - mod.set_light_range(clamp(value, min_range, max_range)) - light_range = clamp(value, min_range, max_range) - -///Dispenser - Dispenses an item after a time passes. -/obj/item/mod/module/dispenser - name = "MOD burger dispenser module" - desc = "A rare piece of technology reverse-engineered from a prototype found in a Donk Corporation vessel. \ - This can draw incredible amounts of power from the suit's charge to create edible organic matter in the \ - palm of the wearer's glove; however, research seemed to have entirely stopped at burgers. \ - Notably, all attempts to get it to dispense Earl Grey tea have failed." - icon_state = "dispenser" - module_type = MODULE_USABLE - complexity = 3 - use_power_cost = DEFAULT_CHARGE_DRAIN * 2 - incompatible_modules = list(/obj/item/mod/module/dispenser) - cooldown_time = 5 SECONDS - /// Path we dispense. - var/dispense_type = /obj/item/reagent_containers/food/snacks/burger/plain - /// Time it takes for us to dispense. - var/dispense_time = 0 SECONDS - -/obj/item/mod/module/dispenser/on_use() - . = ..() - if(!.) - return - if(dispense_time && !do_after(mod.wearer, dispense_time, target = mod)) - balloon_alert(mod.wearer, "interrupted!") - return FALSE - var/obj/item/dispensed = new dispense_type(mod.wearer.loc) - mod.wearer.put_in_hands(dispensed) - balloon_alert(mod.wearer, "[dispensed] dispensed") - playsound(src, 'sound/machines/click.ogg', 100, TRUE) - drain_power(use_power_cost) - return dispensed - -///Longfall - -///Thermal Regulator - Naw. - -///DNA Lock - Prevents people without the set DNA from activating the suit. -/obj/item/mod/module/dna_lock - name = "MOD DNA lock module" - desc = "A module which engages with the various locks and seals tied to the suit's systems, \ - enabling it to only be worn by someone corresponding with the user's exact DNA profile; \ - however, this incredibly sensitive module is shorted out by EMPs. Luckily, cloning has been outlawed." - icon_state = "dnalock" - module_type = MODULE_USABLE - complexity = 2 - use_power_cost = DEFAULT_CHARGE_DRAIN * 3 - incompatible_modules = list(/obj/item/mod/module/dna_lock) - cooldown_time = 0.5 SECONDS - /// The DNA we lock with. - var/dna = null - -/obj/item/mod/module/dna_lock/on_install() - RegisterSignal(mod, COMSIG_MOD_ACTIVATE, .proc/on_mod_activation) - RegisterSignal(mod, COMSIG_MOD_MODULE_REMOVAL, .proc/on_mod_removal) - RegisterSignal(mod, COMSIG_ATOM_EMP_ACT, .proc/on_emp) - RegisterSignal(mod, COMSIG_ATOM_EMAG_ACT, .proc/on_emag) - -/obj/item/mod/module/dna_lock/on_uninstall(deleting = FALSE) - UnregisterSignal(mod, COMSIG_MOD_ACTIVATE) - UnregisterSignal(mod, COMSIG_MOD_MODULE_REMOVAL) - UnregisterSignal(mod, COMSIG_ATOM_EMP_ACT) - UnregisterSignal(mod, COMSIG_ATOM_EMAG_ACT) - -/obj/item/mod/module/dna_lock/on_use() - . = ..() - if(!.) - return - dna = mod.wearer.dna.unique_enzymes - balloon_alert(mod.wearer, "dna updated") - drain_power(use_power_cost) - -/obj/item/mod/module/dna_lock/emp_act(severity) - . = ..() - if(. & EMP_PROTECT_SELF) - return - on_emp(src, severity) - -/obj/item/mod/module/dna_lock/emag_act(mob/user, obj/item/card/emag/emag_card) - . = ..() - on_emag(src, user, emag_card) - -/obj/item/mod/module/dna_lock/proc/dna_check(mob/user) - if(!iscarbon(user)) - return FALSE - var/mob/living/carbon/carbon_user = user - if(!dna || (carbon_user.has_dna() && carbon_user.dna.unique_enzymes == dna)) - return TRUE - balloon_alert(user, "dna locked!") - return FALSE - -/obj/item/mod/module/dna_lock/proc/on_emp(datum/source, severity) - SIGNAL_HANDLER - - dna = null - -/obj/item/mod/module/dna_lock/proc/on_emag(datum/source, mob/user, obj/item/card/emag/emag_card) - SIGNAL_HANDLER - - dna = null - -/obj/item/mod/module/dna_lock/proc/on_mod_activation(datum/source, mob/user) - SIGNAL_HANDLER - - if(!dna_check(user)) - return MOD_CANCEL_ACTIVATE - -/obj/item/mod/module/dna_lock/proc/on_mod_removal(datum/source, mob/user) - SIGNAL_HANDLER - - if(!dna_check(user)) - return MOD_CANCEL_REMOVAL - -///Sign Language Translator - I want, but no diff --git a/code/modules/mod/modules/modules_maint.dm b/code/modules/mod/modules/modules_maint.dm deleted file mode 100644 index f73969d625..0000000000 --- a/code/modules/mod/modules/modules_maint.dm +++ /dev/null @@ -1,157 +0,0 @@ -//Maint modules for MODsuits - -///Springlock Mechanism - allows your modsuit to activate faster, but reagents are very dangerous. -/obj/item/mod/module/springlock - name = "MOD springlock module" - desc = "A module that spans the entire size of the MOD unit, sitting under the outer shell. \ - This mechanical exoskeleton pushes out of the way when the user enters and it helps in booting \ - up, but was taken out of modern suits because of the springlock's tendency to \"snap\" back \ - into place when exposed to humidity. You know what it's like to have an entire exoskeleton enter you?" - icon_state = "springlock" - complexity = 3 // it is inside every part of your suit, so - incompatible_modules = list(/obj/item/mod/module/springlock) - -/obj/item/mod/module/springlock/on_install() - mod.activation_step_time *= 0.5 - -/obj/item/mod/module/springlock/on_uninstall(deleting = FALSE) - mod.activation_step_time *= 2 - -/obj/item/mod/module/springlock/on_suit_activation() - RegisterSignal(mod.wearer, COMSIG_ATOM_EXPOSE_REAGENTS, .proc/on_wearer_exposed) - -/obj/item/mod/module/springlock/on_suit_deactivation(deleting = FALSE) - UnregisterSignal(mod.wearer, COMSIG_ATOM_EXPOSE_REAGENTS) - -///Signal fired when wearer is exposed to reagents -/obj/item/mod/module/springlock/proc/on_wearer_exposed(atom/source, list/reagents, datum/reagents/source_reagents, methods, volume_modifier, show_message, from_gas) - SIGNAL_HANDLER - - if(!reagents.len) - return - if(!(methods & (VAPOR|PATCH|TOUCH))) - return //remove non-touch reagent exposure - to_chat(mod.wearer, span_danger("[src] makes an ominous click sound...")) - playsound(src, 'sound/items/modsuit/springlock.ogg', 75, TRUE) - addtimer(CALLBACK(src, .proc/snap_shut), rand(3 SECONDS, 5 SECONDS)) - RegisterSignal(mod, COMSIG_MOD_ACTIVATE, .proc/on_activate_spring_block) - -///Signal fired when wearer attempts to activate/deactivate suits -/obj/item/mod/module/springlock/proc/on_activate_spring_block(datum/source, user) - SIGNAL_HANDLER - - balloon_alert(user, "springlocks aren't responding...?") - return MOD_CANCEL_ACTIVATE - -///Delayed death proc of the suit after the wearer is exposed to reagents -/obj/item/mod/module/springlock/proc/snap_shut() - UnregisterSignal(mod, COMSIG_MOD_ACTIVATE) - if(!mod.wearer) //while there is a guaranteed user when on_wearer_exposed() fires, that isn't the same case for this proc - return - mod.wearer.visible_message("[src] inside [mod.wearer]'s [mod.name] snaps shut, mutilating the user inside!", span_userdanger("*SNAP*")) - mod.wearer.emote("scream") - playsound(mod.wearer, 'sound/effects/snap.ogg', 75, TRUE, frequency = 0.5) - playsound(mod.wearer, 'sound/effects/splat.ogg', 50, TRUE, frequency = 0.5) - mod.wearer.client?.give_award(/datum/award/achievement/misc/springlock, mod.wearer) - mod.wearer.apply_damage(500, BRUTE, forced = TRUE, spread_damage = TRUE, sharpness = SHARP_POINTY) //boggers, bogchamp, etc - if(!HAS_TRAIT(mod.wearer, TRAIT_NODEATH)) - mod.wearer.death() //just in case, for some reason, they're still alive - flash_color(mod.wearer, flash_color = "#FF0000", flash_time = 10 SECONDS) - -///Rave Visor - Pointless - -///Tanner - Maybe another time - -///Balloon Blower - Blows a balloon. -/obj/item/mod/module/balloon - name = "MOD balloon blower module" - desc = "A strange module invented years ago by some ingenious mimes. It blows balloons." - icon_state = "bloon" - module_type = MODULE_USABLE - complexity = 1 - use_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 - incompatible_modules = list(/obj/item/mod/module/balloon) - cooldown_time = 15 SECONDS - -/obj/item/mod/module/balloon/on_use() - . = ..() - if(!.) - return - if(!do_after(mod.wearer, 10 SECONDS, target = mod)) - return FALSE - mod.wearer.adjustOxyLoss(20) - playsound(src, 'sound/items/modsuit/inflate_bloon.ogg', 50, TRUE) - var/obj/item/toy/balloon/balloon = new(get_turf(src)) - mod.wearer.put_in_hands(balloon) - drain_power(use_power_cost) - -///Paper Dispenser - Dispenses (sometimes burning) paper sheets. -/obj/item/mod/module/paper_dispenser - name = "MOD paper dispenser module" - desc = "A simple module designed by the bureaucrats of Torch Bay. \ - It dispenses 'warm, clean, and crisp sheets of paper' onto a nearby table. Usually." - icon_state = "paper_maker" - module_type = MODULE_USABLE - complexity = 1 - use_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 - incompatible_modules = list(/obj/item/mod/module/paper_dispenser) - cooldown_time = 5 SECONDS - /// The total number of sheets created by this MOD. The more sheets, them more likely they set on fire. - var/num_sheets_dispensed = 0 - -/obj/item/mod/module/paper_dispenser/on_use() - . = ..() - if(!.) - return - if(!do_after(mod.wearer, 1 SECONDS, target = mod)) - return FALSE - - var/obj/item/paper/crisp_paper = new(get_turf(src)) - crisp_paper.desc = "It's crisp and warm to the touch. Must be fresh." - - var/obj/structure/table/nearby_table = locate() in range(1, mod.wearer) - playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE) - balloon_alert(mod.wearer, "dispensed paper[nearby_table ? " onto table":""]") - - mod.wearer.put_in_hands(crisp_paper) - if(nearby_table) - mod.wearer.transferItemToLoc(crisp_paper, nearby_table.drop_location(), silent = FALSE) - - // Up to a 30% chance to set the sheet on fire, +2% per sheet made - if(prob(min(num_sheets_dispensed * 2, 30))) - if(crisp_paper in mod.wearer.held_items) - mod.wearer.dropItemToGround(crisp_paper, force = TRUE) - crisp_paper.balloon_alert(mod.wearer, "PC LOAD LETTER!") - crisp_paper.visible_message(span_warning("[crisp_paper] bursts into flames, it's too crisp!")) - crisp_paper.fire_act(1000, 100) - - drain_power(use_power_cost) - num_sheets_dispensed++ - - -///Stamper - Extends a stamp that can switch between accept/deny modes. -/obj/item/mod/module/stamp - name = "MOD stamper module" - desc = "A module installed into the wrist of the suit, this functions as a high-power stamp, \ - able to switch between accept and deny modes." - icon_state = "stamp" - module_type = MODULE_ACTIVE - complexity = 1 - active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 - device = /obj/item/stamp/mod - incompatible_modules = list(/obj/item/mod/module/stamp) - cooldown_time = 0.5 SECONDS - -/obj/item/stamp/mod - name = "MOD electronic stamp" - desc = "A high-power stamp, able to switch between accept and deny mode when used." - -/obj/item/stamp/mod/attack_self(mob/user, modifiers) - . = ..() - if(icon_state == "stamp-ok") - icon_state = "stamp-deny" - else - icon_state = "stamp-ok" - balloon_alert(user, "switched mode") - -///Atrocinator - Perhaps another time diff --git a/code/modules/mod/modules/modules_medical.dm b/code/modules/mod/modules/modules_medical.dm deleted file mode 100644 index c7e1510152..0000000000 --- a/code/modules/mod/modules/modules_medical.dm +++ /dev/null @@ -1,189 +0,0 @@ -//Medical modules for MODsuits - -#define HEALTH_SCAN "Health" -#define WOUND_SCAN "Wound" -#define CHEM_SCAN "Chemical" - -///Health Analyzer - Gives the user a ranged health analyzer and their health status in the panel. -/obj/item/mod/module/health_analyzer - name = "MOD health analyzer module" - desc = "A module installed into the glove of the suit. This is a high-tech biological scanning suite, \ - allowing the user indepth information on the vitals and injuries of others even at a distance, \ - all with the flick of the wrist. Data is displayed in a convenient package on HUD in the helmet, \ - but it's up to you to do something with it." - icon_state = "health" - module_type = MODULE_ACTIVE - complexity = 2 - use_power_cost = DEFAULT_CHARGE_DRAIN - incompatible_modules = list(/obj/item/mod/module/health_analyzer) - cooldown_time = 0.5 SECONDS - tgui_id = "health_analyzer" - /// Scanning mode, changes how we scan something. - var/mode = HEALTH_SCAN - /// List of all scanning modes. - var/static/list/modes = list(HEALTH_SCAN, WOUND_SCAN, CHEM_SCAN) - -/obj/item/mod/module/health_analyzer/add_ui_data() - . = ..() - .["userhealth"] = mod.wearer?.health || 0 - .["usermaxhealth"] = mod.wearer?.getMaxHealth() || 0 - .["userbrute"] = mod.wearer?.getBruteLoss() || 0 - .["userburn"] = mod.wearer?.getFireLoss() || 0 - .["usertoxin"] = mod.wearer?.getToxLoss() || 0 - .["useroxy"] = mod.wearer?.getOxyLoss() || 0 - -/obj/item/mod/module/health_analyzer/on_select_use(atom/target) - . = ..() - if(!.) - return - if(!isliving(target) || !mod.wearer.can_read(src)) - return - switch(mode) - if(HEALTH_SCAN) - healthscan(mod.wearer, target) - if(WOUND_SCAN) - woundscan(mod.wearer, target) - if(CHEM_SCAN) - chemscan(mod.wearer, target) - drain_power(use_power_cost) - -/obj/item/mod/module/health_analyzer/get_configuration() - . = ..() - .["mode"] = add_ui_configuration("Scan Mode", "list", mode, modes) - -/obj/item/mod/module/health_analyzer/configure_edit(key, value) - switch(key) - if("mode") - mode = value - -#undef HEALTH_SCAN -#undef WOUND_SCAN -#undef CHEM_SCAN - -///Quick Carry - Lets the user carry bodies quicker. -/obj/item/mod/module/quick_carry - name = "MOD quick carry module" - desc = "A suite of advanced servos, redirecting power from the suit's arms to help carry the wounded; \ - or simply for fun. However, Nanotrasen has locked the module's ability to assist in hand-to-hand combat." - icon_state = "carry" - complexity = 1 - idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 - incompatible_modules = list(/obj/item/mod/module/quick_carry, /obj/item/mod/module/constructor) - -/obj/item/mod/module/quick_carry/on_suit_activation() - ADD_TRAIT(mod.wearer, TRAIT_QUICKER_CARRY, MOD_TRAIT) - -/obj/item/mod/module/quick_carry/on_suit_deactivation(deleting = FALSE) - REMOVE_TRAIT(mod.wearer, TRAIT_QUICKER_CARRY, MOD_TRAIT) - -/obj/item/mod/module/quick_carry/advanced - name = "MOD advanced quick carry module" - removable = FALSE - complexity = 0 - -///Injector - No piercing syringes, replace another time - -///Organ Thrower - -///Patrient Transport - -///Defibrillator - Gives the suit an extendable pair of shock paddles. -/obj/item/mod/module/defibrillator - name = "MOD defibrillator module" - desc = "A module built into the gauntlets of the suit; commonly known as the 'Healing Hands' by medical professionals. \ - The user places their palms above the patient. Onboard computers in the suit calculate the necessary voltage, \ - and a modded targeting computer determines the best position for the user to push. \ - Twenty five pounds of force are applied to the patient's skin. Shocks travel from the suit's gloves \ - and counter-shock the heart, and the wearer returns to Medical a hero. Don't you even think about using it as a weapon; \ - regulations on manufacture and software locks expressly forbid it." - icon_state = "defibrillator" - module_type = MODULE_ACTIVE - complexity = 2 - use_power_cost = DEFAULT_CHARGE_DRAIN * 25 - device = /obj/item/shockpaddles/mod - overlay_state_inactive = "module_defibrillator" - overlay_state_active = "module_defibrillator_active" - incompatible_modules = list(/obj/item/mod/module/defibrillator) - cooldown_time = 0.5 SECONDS - var/defib_cooldown = 5 SECONDS - -/obj/item/mod/module/defibrillator/Initialize(mapload) - . = ..() - RegisterSignal(device, COMSIG_DEFIBRILLATOR_SUCCESS, .proc/on_defib_success) - -/obj/item/mod/module/defibrillator/Destroy() - UnregisterSignal(device, COMSIG_DEFIBRILLATOR_SUCCESS) - . = ..() - -/obj/item/mod/module/defibrillator/proc/on_defib_success(obj/item/shockpaddles/source) - drain_power(use_power_cost) - source.recharge(defib_cooldown) - return COMPONENT_DEFIB_STOP - -/obj/item/shockpaddles/mod - name = "MOD defibrillator gauntlets" - req_defib = FALSE - icon_state = "defibgauntlets0" - item_state = "defibgauntlets0" - base_icon_state = "defibgauntlets" - -/obj/item/mod/module/defibrillator/combat - name = "MOD combat defibrillator module" - desc = "A module built into the gauntlets of the suit; commonly known as the 'Healing Hands' by medical professionals. \ - The user places their palms above the patient. Onboard computers in the suit calculate the necessary voltage, \ - and a modded targeting computer determines the best position for the user to push. \ - Twenty five pounds of force are applied to the patient's skin. Shocks travel from the suit's gloves \ - and counter-shock the heart, and the wearer returns to Medical a hero. \ - Interdyne Pharmaceutics marketed the domestic version of the Healing Hands as foolproof and unusable as a weapon. \ - But when it came time to provide their operatives with usable medical equipment, they didn't hesitate to remove \ - those in-built safeties. Operatives in the field can benefit from what they dub as 'Stun Gloves', able to apply shocks \ - straight to a victims heart to disable them, or maybe even outright stop their heart with enough power." - complexity = 1 - module_type = MODULE_ACTIVE - overlay_state_inactive = "module_defibrillator_combat" - overlay_state_active = "module_defibrillator_combat_active" - device = /obj/item/shockpaddles/syndicate/mod - defib_cooldown = 2.5 SECONDS - -/obj/item/shockpaddles/syndicate/mod - name = "MOD combat defibrillator gauntlets" - req_defib = FALSE - icon_state = "syndiegauntlets0" - item_state = "syndiegauntlets0" - base_icon_state = "syndiegauntlets" - -///Thread Ripper - -///Surgical Processor - Lets you do advanced surgeries portably. -/obj/item/mod/module/surgical_processor - name = "MOD surgical processor module" - desc = "A module using an onboard surgical computer which can be connected to other computers to download and \ - perform advanced surgeries on the go." - icon_state = "surgical_processor" - module_type = MODULE_ACTIVE - complexity = 2 - active_power_cost = DEFAULT_CHARGE_DRAIN - device = /obj/item/surgical_processor/mod - incompatible_modules = list(/obj/item/mod/module/surgical_processor) - cooldown_time = 0.5 SECONDS - -/obj/item/surgical_processor/mod - name = "MOD surgical processor" - -/obj/item/mod/module/surgical_processor/preloaded - desc = "A module using an onboard surgical computer which can be connected to other computers to download and \ - perform advanced surgeries on the go. This one came pre-loaded with some advanced surgeries." - device = /obj/item/surgical_processor/mod/preloaded - -/obj/item/surgical_processor/mod/preloaded - advanced_surgeries = list( - /datum/surgery/advanced/pacify, - /datum/surgery/healing/combo/upgraded/femto, - /datum/surgery/advanced/brainwashing, - /datum/surgery/advanced/bioware/nerve_splicing, - /datum/surgery/advanced/bioware/nerve_grounding, - /datum/surgery/advanced/bioware/vein_threading, - /datum/surgery/advanced/bioware/muscled_veins, - /datum/surgery/advanced/bioware/ligament_hook, - /datum/surgery/advanced/bioware/ligament_reinforcement - ) diff --git a/code/modules/mod/modules/modules_science.dm b/code/modules/mod/modules/modules_science.dm deleted file mode 100644 index 7208210b76..0000000000 --- a/code/modules/mod/modules/modules_science.dm +++ /dev/null @@ -1,135 +0,0 @@ -//Science modules for MODsuits - -///Reagent Scanner - Lets the user scan reagents. -/obj/item/mod/module/reagent_scanner - name = "MOD reagent scanner module" - desc = "A module based off research-oriented Nanotrasen HUDs, this is capable of scanning the contents of \ - containers and projecting the information in an easy-to-read format on the wearer's display. \ - It cannot detect flavors, so that's up to you." - icon_state = "scanner" - module_type = MODULE_TOGGLE - complexity = 1 - active_power_cost = DEFAULT_CHARGE_DRAIN * 0.2 - incompatible_modules = list(/obj/item/mod/module/reagent_scanner) - cooldown_time = 0.5 SECONDS - -/obj/item/mod/module/reagent_scanner/on_activation() - . = ..() - if(!.) - return - ADD_TRAIT(mod.wearer, TRAIT_REAGENT_SCANNER, MOD_TRAIT) - -/obj/item/mod/module/reagent_scanner/on_deactivation(display_message = TRUE, deleting = FALSE) - . = ..() - if(!.) - return - REMOVE_TRAIT(mod.wearer, TRAIT_REAGENT_SCANNER, MOD_TRAIT) - -/obj/item/mod/module/reagent_scanner/advanced - name = "MOD advanced reagent scanner module" - complexity = 0 - removable = FALSE - var/explosion_detection_dist = 21 - var/had_research_scanner = FALSE - -/obj/item/mod/module/reagent_scanner/advanced/on_activation() - . = ..() - if(!.) - return - had_research_scanner = mod.wearer.research_scanner - mod.wearer.research_scanner = TRUE - RegisterSignal(SSdcs, COMSIG_GLOB_EXPLOSION, .proc/sense_explosion) - -/obj/item/mod/module/reagent_scanner/advanced/on_deactivation(display_message = TRUE, deleting = FALSE) - . = ..() - if(!.) - return - mod.wearer.research_scanner = had_research_scanner - had_research_scanner = FALSE - UnregisterSignal(SSdcs, COMSIG_GLOB_EXPLOSION) - -/obj/item/mod/module/reagent_scanner/advanced/proc/sense_explosion(datum/source, turf/epicenter, - devastation_range, heavy_impact_range, light_impact_range, took, orig_dev_range, orig_heavy_range, orig_light_range) - SIGNAL_HANDLER - var/turf/wearer_turf = get_turf(mod.wearer) - if(wearer_turf.z == epicenter.z) - return - if(get_dist(epicenter, wearer_turf) > explosion_detection_dist) - return - to_chat(mod.wearer, span_notice("Explosion detected! Epicenter: [devastation_range], Outer: [heavy_impact_range], Shock: [light_impact_range]")) - -///Anti-Gravity - Makes the user weightless. -/obj/item/mod/module/anomaly_locked/antigrav - name = "MOD anti-gravity module" - desc = "A module that uses a gravitational core to make the user completely weightless." - icon_state = "antigrav" - module_type = MODULE_TOGGLE - complexity = 3 - active_power_cost = DEFAULT_CHARGE_DRAIN * 0.7 - incompatible_modules = list(/obj/item/mod/module/anomaly_locked) - cooldown_time = 0.5 SECONDS - accepted_anomalies = list(/obj/item/assembly/signaler/anomaly/grav) - -/obj/item/mod/module/anomaly_locked/antigrav/on_activation() - . = ..() - if(!.) - return - if(mod.wearer.has_gravity()) - new /obj/effect/temp_visual/mook_dust(get_turf(src)) - mod.wearer.AddElement(/datum/element/forced_gravity, 0) - mod.wearer.update_gravity(mod.wearer.has_gravity()) - playsound(src, 'sound/effects/gravhit.ogg', 50) - -/obj/item/mod/module/anomaly_locked/antigrav/on_deactivation(display_message = TRUE, deleting = FALSE) - . = ..() - if(!.) - return - mod.wearer.RemoveElement(/datum/element/forced_gravity, 0) - mod.wearer.update_gravity(mod.wearer.has_gravity()) - if(deleting) - return - if(mod.wearer.has_gravity()) - new /obj/effect/temp_visual/mook_dust(get_turf(src)) - playsound(src, 'sound/effects/gravhit.ogg', 50) - -/obj/item/mod/module/anomaly_locked/antigrav/prebuilt - prebuilt = TRUE - -///Teleporter - Lets the user teleport to a nearby location. -/obj/item/mod/module/anomaly_locked/teleporter - name = "MOD teleporter module" - desc = "A module that uses a bluespace core to let the user transport their particles elsewhere." - icon_state = "teleporter" - module_type = MODULE_ACTIVE - complexity = 3 - use_power_cost = DEFAULT_CHARGE_DRAIN * 5 - cooldown_time = 5 SECONDS - accepted_anomalies = list(/obj/item/assembly/signaler/anomaly/bluespace) - /// Time it takes to teleport - var/teleport_time = 3 SECONDS - -/obj/item/mod/module/anomaly_locked/teleporter/on_select_use(atom/target) - . = ..() - if(!.) - return - var/turf/open/target_turf = get_turf(target) - if(!istype(target_turf) || is_blocked_turf(target_turf) || !(target_turf in view(mod.wearer))) - balloon_alert(mod.wearer, "invalid target!") - return - balloon_alert(mod.wearer, "teleporting...") - var/matrix/pre_matrix = matrix() - pre_matrix.Scale(4, 0.25) - var/matrix/post_matrix = matrix() - post_matrix.Scale(0.25, 4) - animate(mod.wearer, teleport_time, color = COLOR_CYAN, transform = pre_matrix.Multiply(mod.wearer.transform), easing = SINE_EASING|EASE_OUT) - if(!do_after(mod.wearer, teleport_time, target = mod)) - balloon_alert(mod.wearer, "interrupted!") - animate(mod.wearer, teleport_time*0.1, color = null, transform = post_matrix.Multiply(mod.wearer.transform), easing = SINE_EASING|EASE_IN) - return - animate(mod.wearer, teleport_time*0.1, color = null, transform = post_matrix.Multiply(mod.wearer.transform), easing = SINE_EASING|EASE_IN) - if(!do_teleport(mod.wearer, target_turf, asoundin = 'sound/effects/phasein.ogg')) - return - drain_power(use_power_cost) - -/obj/item/mod/module/anomaly_locked/teleporter/prebuilt - prebuilt = TRUE diff --git a/code/modules/mod/modules/modules_security.dm b/code/modules/mod/modules/modules_security.dm deleted file mode 100644 index 098abf8015..0000000000 --- a/code/modules/mod/modules/modules_security.dm +++ /dev/null @@ -1,207 +0,0 @@ -//Security modules for MODsuits - -///Cloaking - Lowers the user's visibility, can be interrupted by being touched or attacked. -/obj/item/mod/module/stealth - name = "MOD prototype cloaking module" - desc = "A complete retrofitting of the suit, this is a form of visual concealment tech employing esoteric technology \ - to bend light around the user, as well as mimetic materials to make the surface of the suit match the \ - surroundings based off sensor data. For some reason, this tech is rarely seen." - icon_state = "cloak" - module_type = MODULE_TOGGLE - complexity = 4 - active_power_cost = DEFAULT_CHARGE_DRAIN * 2 - use_power_cost = DEFAULT_CHARGE_DRAIN * 10 - incompatible_modules = list(/obj/item/mod/module/stealth) - cooldown_time = 5 SECONDS - /// Whether or not the cloak turns off on bumping. - var/bumpoff = TRUE - /// The alpha applied when the cloak is on. - var/stealth_alpha = 50 - -/obj/item/mod/module/stealth/on_activation() - . = ..() - if(!.) - return - if(bumpoff) - RegisterSignal(mod.wearer, COMSIG_LIVING_MOB_BUMP, .proc/unstealth) - RegisterSignal(mod.wearer, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, .proc/on_unarmed_attack) - RegisterSignal(mod.wearer, COMSIG_ATOM_BULLET_ACT, .proc/on_bullet_act) - RegisterSignal(mod.wearer, list(COMSIG_MOB_ITEM_ATTACK, COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_PAW), .proc/unstealth) - animate(mod.wearer, alpha = stealth_alpha, time = 1.5 SECONDS) - drain_power(use_power_cost) - -/obj/item/mod/module/stealth/on_deactivation(display_message = TRUE, deleting = FALSE) - . = ..() - if(!.) - return - if(bumpoff) - UnregisterSignal(mod.wearer, COMSIG_LIVING_MOB_BUMP) - UnregisterSignal(mod.wearer, list(COMSIG_HUMAN_MELEE_UNARMED_ATTACK, COMSIG_MOB_ITEM_ATTACK, COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_BULLET_ACT, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_PAW)) - animate(mod.wearer, alpha = 255, time = 1.5 SECONDS) - -/obj/item/mod/module/stealth/proc/unstealth(datum/source) - SIGNAL_HANDLER - - to_chat(mod.wearer, span_warning("[src] gets discharged from contact!")) - do_sparks(2, TRUE, src) - drain_power(use_power_cost) - on_deactivation(display_message = TRUE, deleting = FALSE) - -/obj/item/mod/module/stealth/proc/on_unarmed_attack(datum/source, atom/target) - SIGNAL_HANDLER - - if(!isliving(target)) - return - unstealth(source) - -/obj/item/mod/module/stealth/proc/on_bullet_act(datum/source, obj/item/projectile/projectile) - SIGNAL_HANDLER - - if(projectile.nodamage) - return - unstealth(source) - -///Magnetic Harness - Automatically puts guns in your suit storage when you drop them. -/obj/item/mod/module/magnetic_harness - name = "MOD magnetic harness module" - desc = "Based off old TerraGov harness kits, this magnetic harness automatically attaches dropped guns back to the wearer." - icon_state = "mag_harness" - complexity = 2 - use_power_cost = DEFAULT_CHARGE_DRAIN - incompatible_modules = list(/obj/item/mod/module/magnetic_harness) - /// Time before we activate the magnet. - var/magnet_delay = 0.8 SECONDS - /// The typecache of all guns we allow. - var/static/list/guns_typecache - /// The guns already allowed by the modsuit chestplate. - var/list/already_allowed_guns = list() - -/obj/item/mod/module/magnetic_harness/Initialize(mapload) - . = ..() - if(!guns_typecache) - guns_typecache = typecacheof(list(/obj/item/gun/ballistic, /obj/item/gun/energy, /obj/item/gun/grenadelauncher, /obj/item/gun/chem, /obj/item/gun/syringe)) - -/obj/item/mod/module/magnetic_harness/on_install() - already_allowed_guns = guns_typecache & mod.chestplate.allowed - mod.chestplate.allowed |= guns_typecache - -/obj/item/mod/module/magnetic_harness/on_uninstall(deleting = FALSE) - if(deleting) - return - mod.chestplate.allowed -= (guns_typecache - already_allowed_guns) - -/obj/item/mod/module/magnetic_harness/on_suit_activation() - RegisterSignal(mod.wearer, COMSIG_MOB_UNEQUIPPED_ITEM, .proc/check_dropped_item) - -/obj/item/mod/module/magnetic_harness/on_suit_deactivation(deleting = FALSE) - UnregisterSignal(mod.wearer, COMSIG_MOB_UNEQUIPPED_ITEM) - -/obj/item/mod/module/magnetic_harness/proc/check_dropped_item(datum/source, obj/item/dropped_item, force, new_location) - SIGNAL_HANDLER - - if(!is_type_in_typecache(dropped_item, guns_typecache)) - return - if(new_location != get_turf(src)) - return - addtimer(CALLBACK(src, .proc/pick_up_item, dropped_item), magnet_delay) - -/obj/item/mod/module/magnetic_harness/proc/pick_up_item(obj/item/item) - if(!isturf(item.loc) || !item.Adjacent(mod.wearer)) - return - if(!mod.wearer.equip_to_slot_if_possible(item, ITEM_SLOT_SUITSTORE, qdel_on_fail = FALSE, disable_warning = TRUE)) - return - playsound(src, 'sound/items/modsuit/magnetic_harness.ogg', 50, TRUE) - balloon_alert(mod.wearer, "[item] reattached") - drain_power(use_power_cost) - -///Pepper Shoulders - -///Holster - Instantly holsters any not huge gun. -/obj/item/mod/module/holster - name = "MOD holster module" - desc = "Based off typical storage compartments, this system allows the suit to holster a \ - standard firearm across its surface and allow for extremely quick retrieval. \ - While some users prefer the chest, others the forearm for quick deployment, \ - some law enforcement prefer the holster to extend from the thigh." - icon_state = "holster" - module_type = MODULE_USABLE - complexity = 2 - incompatible_modules = list(/obj/item/mod/module/holster) - cooldown_time = 0.5 SECONDS - allowed_inactive = TRUE - /// Gun we have holstered. - var/obj/item/gun/holstered - -/obj/item/mod/module/holster/on_use() - . = ..() - if(!.) - return - if(!holstered) - var/obj/item/gun/holding = mod.wearer.get_active_held_item() - if(!holding) - balloon_alert(mod.wearer, "nothing to holster!") - return - if(!istype(holding) || holding.w_class > WEIGHT_CLASS_BULKY) - balloon_alert(mod.wearer, "it doesn't fit!") - return - if(mod.wearer.transferItemToLoc(holding, src, force = FALSE, silent = TRUE)) - holstered = holding - balloon_alert(mod.wearer, "weapon holstered") - playsound(src, 'sound/weapons/revolverempty.ogg', 100, TRUE) - else if(mod.wearer.put_in_active_hand(holstered, forced = FALSE, ignore_animation = TRUE)) - balloon_alert(mod.wearer, "weapon drawn") - playsound(src, 'sound/weapons/revolverempty.ogg', 100, TRUE) - else - balloon_alert(mod.wearer, "holster full!") - -/obj/item/mod/module/holster/on_uninstall(deleting = FALSE) - if(holstered) - holstered.forceMove(drop_location()) - -/obj/item/mod/module/holster/Exited(atom/movable/gone, direction) - . = ..() - if(gone == holstered) - holstered = null - -/obj/item/mod/module/holster/Destroy() - QDEL_NULL(holstered) - return ..() - -///Megaphone - Lets you speak loud. -/obj/item/mod/module/megaphone - name = "MOD megaphone module" - desc = "A microchip megaphone linked to a MODsuit, for very important purposes, like: loudness." - icon_state = "megaphone" - module_type = MODULE_TOGGLE - complexity = 1 - use_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 - incompatible_modules = list(/obj/item/mod/module/megaphone) - cooldown_time = 0.5 SECONDS - /// List of spans we add to the speaker. - var/list/voicespan = list(SPAN_COMMAND) - -/obj/item/mod/module/megaphone/on_activation() - . = ..() - if(!.) - return - RegisterSignal(mod.wearer, COMSIG_MOB_SAY, .proc/handle_speech) - -/obj/item/mod/module/megaphone/on_deactivation(display_message = TRUE, deleting = FALSE) - . = ..() - if(!.) - return - UnregisterSignal(mod.wearer, COMSIG_MOB_SAY) - -/obj/item/mod/module/megaphone/proc/handle_speech(datum/source, list/speech_args) - SIGNAL_HANDLER - - speech_args[SPEECH_SPANS] |= voicespan - drain_power(use_power_cost) - -///Criminal Capture - -///Mirage grenade dispenser - -///Projectile Dampener - -///Active Sonar diff --git a/code/modules/mod/modules/modules_service.dm b/code/modules/mod/modules/modules_service.dm deleted file mode 100644 index 85ebfea132..0000000000 --- a/code/modules/mod/modules/modules_service.dm +++ /dev/null @@ -1,66 +0,0 @@ -//Service modules for MODsuits - -///Bike Horn - Plays a bike horn sound. -/obj/item/mod/module/bikehorn - name = "MOD bike horn module" - desc = "A shoulder-mounted piece of heavy sonic artillery, this module uses the finest femto-manipulator technology to \ - precisely deliver an almost lethal squeeze to... a bike horn, producing a significantly memorable sound." - icon_state = "bikehorn" - module_type = MODULE_USABLE - complexity = 1 - use_power_cost = DEFAULT_CHARGE_DRAIN - incompatible_modules = list(/obj/item/mod/module/bikehorn) - cooldown_time = 1 SECONDS - -/obj/item/mod/module/bikehorn/on_use() - . = ..() - if(!.) - return - playsound(src, 'sound/items/bikehorn.ogg', 100, FALSE) - drain_power(use_power_cost) - -///Microwave Beam - Microwaves items instantly. -/obj/item/mod/module/microwave_beam - name = "MOD microwave beam module" - desc = "An oddly domestic device, this module is installed into the user's palm, \ - hooking up with culinary scanners located in the helmet to blast food with precise microwave radiation, \ - allowing them to cook food from a distance, with the greatest of ease. Not recommended for use against grapes." - icon_state = "microwave_beam" - module_type = MODULE_ACTIVE - complexity = 2 - use_power_cost = DEFAULT_CHARGE_DRAIN * 5 - incompatible_modules = list(/obj/item/mod/module/microwave_beam) - cooldown_time = 10 SECONDS - var/obj/machinery/microwave/microwave - -/obj/item/mod/module/microwave_beam/Initialize(mapload) - microwave = new() - . = ..() - -/obj/item/mod/module/microwave_beam/Destroy() - QDEL_NULL(microwave) - . = ..() - -/obj/item/mod/module/microwave_beam/on_select_use(atom/target) - . = ..() - if(!.) - return - if(!isitem(target)) - return - if(!isturf(target.loc)) - balloon_alert(mod.wearer, "must be on the floor!") - return - var/obj/item/microwave_target = target - var/turf/microwave_target_loc = target.loc - var/datum/effect_system/spark_spread/spark_effect = new() - spark_effect.set_up(2, 1, mod.wearer) - spark_effect.start() - mod.wearer.Beam(target,icon_state="lightning[rand(1,12)]", time = 5) - if(microwave_target.microwave_act(microwave)) - playsound(src, 'sound/machines/microwave/microwave-end.ogg', 50, FALSE) - else - balloon_alert(mod.wearer, "can't be microwaved!") - var/datum/effect_system/spark_spread/spark_effect_two = new() - spark_effect_two.set_up(2, 1, microwave_target_loc) - spark_effect_two.start() - drain_power(use_power_cost) diff --git a/code/modules/mod/modules/modules_supply.dm b/code/modules/mod/modules/modules_supply.dm deleted file mode 100644 index e3c70fa570..0000000000 --- a/code/modules/mod/modules/modules_supply.dm +++ /dev/null @@ -1,229 +0,0 @@ -//Supply modules for MODsuits - -///Internal GPS - Extends a GPS you can use. -/obj/item/mod/module/gps - name = "MOD internal GPS module" - desc = "This module uses common Nanotrasen technology to calculate the user's position anywhere in space, \ - down to the exact coordinates. This information is fed to a central database viewable from the device itself, \ - though using it to help people is up to you." - icon_state = "gps" - module_type = MODULE_USABLE - complexity = 1 - use_power_cost = DEFAULT_CHARGE_DRAIN * 0.2 - incompatible_modules = list(/obj/item/mod/module/gps) - cooldown_time = 0.5 SECONDS - allowed_inactive = TRUE - -/obj/item/mod/module/gps/Initialize(mapload) - . = ..() - AddComponent(/datum/component/gps/item, "MOD0", state = GLOB.deep_inventory_state, overlay_state = FALSE) - -/obj/item/mod/module/gps/on_use() - . = ..() - if(!.) - return - attack_self(mod.wearer) - -///Hydraulic Clamp - Lets you pick up and drop crates. -/obj/item/mod/module/clamp - name = "MOD hydraulic clamp module" - desc = "A series of actuators installed into both arms of the suit, boasting a lifting capacity of almost a ton. \ - However, this design has been locked by Nanotrasen to be primarily utilized for lifting various crates. \ - A lot of people would say that loading cargo is a dull job, but you could not disagree more." - icon_state = "clamp" - module_type = MODULE_ACTIVE - complexity = 3 - use_power_cost = DEFAULT_CHARGE_DRAIN - incompatible_modules = list(/obj/item/mod/module/clamp) - cooldown_time = 0.5 SECONDS - overlay_state_inactive = "module_clamp" - overlay_state_active = "module_clamp_on" - /// Time it takes to load a crate. - var/load_time = 3 SECONDS - /// The max amount of crates you can carry. - var/max_crates = 3 - /// The crates stored in the module. - var/list/stored_crates = list() - -/obj/item/mod/module/clamp/on_select_use(atom/target) - . = ..() - if(!.) - return - if(!mod.wearer.Adjacent(target)) - return - if(istype(target, /obj/structure/closet) || istype(target, /obj/structure/bigDelivery)) - var/atom/movable/picked_crate = target - if(!check_crate_pickup(picked_crate)) - return - playsound(src, 'sound/mecha/hydraulic.ogg', 25, TRUE) - if(!do_after(mod.wearer, load_time, target = target)) - balloon_alert(mod.wearer, "interrupted!") - return - if(!check_crate_pickup(picked_crate)) - return - stored_crates += picked_crate - picked_crate.forceMove(src) - balloon_alert(mod.wearer, "picked up [picked_crate]") - drain_power(use_power_cost) - else if(length(stored_crates)) - var/turf/target_turf = get_turf(target) - if(is_blocked_turf(target_turf)) - return - playsound(src, 'sound/mecha/hydraulic.ogg', 25, TRUE) - if(!do_after(mod.wearer, load_time, target = target)) - balloon_alert(mod.wearer, "interrupted!") - return - if(is_blocked_turf(target_turf)) - return - var/atom/movable/dropped_crate = pop(stored_crates) - dropped_crate.forceMove(target_turf) - balloon_alert(mod.wearer, "dropped [dropped_crate]") - drain_power(use_power_cost) - else - balloon_alert(mod.wearer, "invalid target!") - -/obj/item/mod/module/clamp/on_suit_deactivation(deleting = FALSE) - if(deleting) - return - for(var/atom/movable/crate as anything in stored_crates) - crate.forceMove(drop_location()) - stored_crates -= crate - -/obj/item/mod/module/clamp/proc/check_crate_pickup(atom/movable/target) - if(length(stored_crates) >= max_crates) - balloon_alert(mod.wearer, "too many crates!") - return FALSE - for(var/mob/living/mob in target.GetAllContents()) - if(mob.mob_size < MOB_SIZE_HUMAN) - continue - balloon_alert(mod.wearer, "crate too heavy!") - return FALSE - return TRUE - -/obj/item/mod/module/clamp/loader - name = "MOD loader hydraulic clamp module" - icon_state = "clamp_loader" - complexity = 0 - removable = FALSE - overlay_state_inactive = null - overlay_state_active = "module_clamp_loader" - load_time = 1 SECONDS - max_crates = 5 - use_mod_colors = TRUE - -///Drill - Lets you dig through rock and basalt. -/obj/item/mod/module/drill // TODO: Would be cooler with a built-in drill, but meh - name = "MOD pickaxe/drill storage module" - desc = "Provides a convenient storage compartment for pickaxes and drills." - icon_state = "drill" - complexity = 2 - incompatible_modules = list(/obj/item/mod/module/drill) - cooldown_time = 0.5 SECONDS - allowed_inactive = TRUE - module_type = MODULE_USABLE - /// Pickaxe we have stored. - var/obj/item/pickaxe/stored - -/obj/item/mod/module/drill/on_use() - . = ..() - if(!.) - return - if(!stored) - var/obj/item/pickaxe/holding = mod.wearer.get_active_held_item() - if(!holding) - balloon_alert(mod.wearer, "nothing to store!") - return - if(!istype(holding)) - balloon_alert(mod.wearer, "it doesn't fit!") - return - if(mod.wearer.transferItemToLoc(holding, src, force = FALSE, silent = TRUE)) - stored = holding - balloon_alert(mod.wearer, "mining instrument stored") - playsound(src, 'sound/weapons/revolverempty.ogg', 100, TRUE) - else if(mod.wearer.put_in_active_hand(stored, forced = FALSE, ignore_animation = TRUE)) - balloon_alert(mod.wearer, "mining instrument retrieved") - playsound(src, 'sound/weapons/revolverempty.ogg', 100, TRUE) - else - balloon_alert(mod.wearer, "mining instrument storage full!") - -/obj/item/mod/module/drill/on_uninstall(deleting = FALSE) - if(stored) - stored.forceMove(drop_location()) - -/obj/item/mod/module/drill/Exited(atom/movable/gone, direction) - . = ..() - if(gone == stored) - stored = null - -/obj/item/mod/module/drill/Destroy() - QDEL_NULL(stored) - return ..() - -/obj/item/mod/module/orebag // TODO - name = "MOD mining satchel storage module" - desc = "Provides a convenient storage department for a mining satchel." - icon_state = "ore" - module_type = MODULE_USABLE - complexity = 1 - use_power_cost = DEFAULT_CHARGE_DRAIN * 0.2 - incompatible_modules = list(/obj/item/mod/module/orebag) - cooldown_time = 0.5 SECONDS - allowed_inactive = TRUE - /// Pickaxe we have stored. - var/obj/item/storage/bag/ore/stored - -/obj/item/mod/module/orebag/on_use() - . = ..() - if(!.) - return - if(!stored) - var/obj/item/storage/bag/ore/holding = mod.wearer.get_active_held_item() - if(!holding) - balloon_alert(mod.wearer, "nothing to store!") - return - if(!istype(holding)) - balloon_alert(mod.wearer, "it doesn't fit!") - return - if(mod.wearer.transferItemToLoc(holding, src, force = FALSE, silent = TRUE)) - stored = holding - balloon_alert(mod.wearer, "mining satchel stored") - playsound(src, 'sound/weapons/revolverempty.ogg', 100, TRUE) - RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, .proc/Pickup_ores) - else if(mod.wearer.put_in_active_hand(stored, forced = FALSE, ignore_animation = TRUE)) - UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) - balloon_alert(mod.wearer, "mining satchel retrieved") - playsound(src, 'sound/weapons/revolverempty.ogg', 100, TRUE) - else - balloon_alert(mod.wearer, "mining satchel storage full!") - -/obj/item/mod/module/orebag/on_uninstall(deleting = FALSE) - if(stored) - UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) - stored.forceMove(drop_location()) - -/obj/item/mod/module/orebag/on_equip() - if(stored) - RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, .proc/Pickup_ores) - -/obj/item/mod/module/orebag/on_unequip() - if(stored) - UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) - -/obj/item/mod/module/orebag/Exited(atom/movable/gone, direction) - . = ..() - if(gone == stored) - UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) - stored = null - -/obj/item/mod/module/orebag/Destroy() - if(stored) - UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) - QDEL_NULL(stored) - return ..() - -/obj/item/mod/module/orebag/proc/Pickup_ores() - if(stored) - stored.Pickup_ores(mod.wearer) - -// Ash accretion looks cool, but can't be arsed to implement -// Same with sphere transformation diff --git a/code/modules/mod/modules/modules_visor.dm b/code/modules/mod/modules/modules_visor.dm deleted file mode 100644 index 0e44900a46..0000000000 --- a/code/modules/mod/modules/modules_visor.dm +++ /dev/null @@ -1,91 +0,0 @@ -//Visor modules for MODsuits - -///Base Visor - Adds a specific HUD and traits to you. -/obj/item/mod/module/visor - name = "MOD visor module" - desc = "A heads-up display installed into the visor of the suit. They say these also let you see behind you." - module_type = MODULE_TOGGLE - complexity = 2 - active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 - incompatible_modules = list(/obj/item/mod/module/visor) - cooldown_time = 0.5 SECONDS - /// The HUD type given by the visor. - var/hud_type - /// The traits given by the visor. - var/list/visor_traits = list() - -/obj/item/mod/module/visor/on_activation() - . = ..() - if(!.) - return - if(hud_type) - var/datum/atom_hud/hud = GLOB.huds[hud_type] - hud.add_hud_to(mod.wearer) - for(var/trait in visor_traits) - ADD_TRAIT(mod.wearer, trait, MOD_TRAIT) - mod.wearer.update_sight() - -/obj/item/mod/module/visor/on_deactivation(display_message = TRUE, deleting = FALSE) - . = ..() - if(!.) - return - if(hud_type) - var/datum/atom_hud/hud = GLOB.huds[hud_type] - hud.remove_hud_from(mod.wearer) - for(var/trait in visor_traits) - REMOVE_TRAIT(mod.wearer, trait, MOD_TRAIT) - mod.wearer.update_sight() - -//Medical Visor - Gives you a medical HUD. -/obj/item/mod/module/visor/medhud - name = "MOD medical visor module" - desc = "A heads-up display installed into the visor of the suit. This cross-references suit sensor data with a modern \ - biological scanning suite, allowing the user to visualize the current health of organic lifeforms, as well as \ - access data such as patient files in a convenient readout. They say these also let you see behind you." - icon_state = "medhud_visor" - hud_type = DATA_HUD_MEDICAL_ADVANCED - -//Diagnostic Visor - Gives you a diagnostic HUD. -/obj/item/mod/module/visor/diaghud - name = "MOD diagnostic visor module" - desc = "A heads-up display installed into the visor of the suit. This uses a series of advanced sensors to access data \ - from advanced machinery, exosuits, and other devices, allowing the user to visualize current power levels \ - and integrity of such. They say these also let you see behind you." - icon_state = "diaghud_visor" - hud_type = DATA_HUD_DIAGNOSTIC_ADVANCED - -//Security Visor - Gives you a security HUD. -/obj/item/mod/module/visor/sechud - name = "MOD security visor module" - desc = "A heads-up display installed into the visor of the suit. This module is a heavily-retrofitted targeting system, \ - plugged into various criminal databases to be able to view arrest records, command simple security-oriented robots, \ - and generally know who to shoot. They say these also let you see behind you." - icon_state = "sechud_visor" - hud_type = DATA_HUD_SECURITY_ADVANCED - -//Meson Visor - Gives you meson vision. -/obj/item/mod/module/visor/meson - name = "MOD meson visor module" - desc = "A heads-up display installed into the visor of the suit. This module is based off well-loved meson scanner \ - technology, used by construction workers and miners across the galaxy to see basic structural and terrain layouts \ - through walls, regardless of lighting conditions. They say these also let you see behind you." - icon_state = "meson_visor" - visor_traits = list(TRAIT_MESON_VISION) - -//Thermal Visor - Gives you thermal vision. -/obj/item/mod/module/visor/thermal - name = "MOD thermal visor module" - desc = "A heads-up display installed into the visor of the suit. This uses a small IR scanner to detect and identify \ - the thermal radiation output of objects near the user. While it can detect the heat output of even something as \ - small as a rodent, it still produces irritating red overlay. They say these also let you see behind you." - icon_state = "thermal_visor" - visor_traits = list(TRAIT_THERMAL_VISION) - -//Night Visor - Gives you night vision. -/obj/item/mod/module/visor/night - name = "MOD night visor module" - desc = "A heads-up display installed into the visor of the suit. Typical for both civilian and military applications, \ - this allows the user to perceive their surroundings while in complete darkness, enhancing the view by tenfold; \ - yet brightening everything into a spooky green glow. They say these also let you see behind you." - icon_state = "night_visor" - visor_traits = list(TRAIT_TRUE_NIGHT_VISION) 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/paperwork/pen.dm b/code/modules/paperwork/pen.dm index cb9570e02f..b65c14fa26 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -105,12 +105,13 @@ custom_materials = list(/datum/material/gold = 750) sharpness = SHARP_EDGED resistance_flags = FIRE_PROOF - unique_reskin = list("Oak" = "pen-fountain-o", - "Gold" = "pen-fountain-g", - "Rosewood" = "pen-fountain-r", - "Black and Silver" = "pen-fountain-b", - "Command Blue" = "pen-fountain-cb" - ) + unique_reskin = list( + "Oak" = list("icon_state" = "pen-fountain-o"), + "Gold" = list("icon_state" = "pen-fountain-g"), + "Rosewood" = list("icon_state" = "pen-fountain-r"), + "Black and Silver" = list("icon_state" = "pen-fountain-b"), + "Command Blue" = list("icon_state" = "pen-fountain-cb") + ) embedding = list("embed_chance" = 75) /obj/item/pen/fountain/captain/Initialize(mapload) @@ -118,9 +119,8 @@ AddComponent(/datum/component/butchering, 200, 115) //the pen is mightier than the sword /obj/item/pen/fountain/captain/reskin_obj(mob/M) - ..() - if(current_skin) - desc = "It's an expensive [current_skin] fountain pen. The nib is quite sharp." + . = ..() + desc = "It's an expensive [current_skin] fountain pen. The nib is quite sharp." /obj/item/pen/attack_self(mob/living/carbon/user) var/deg = input(user, "What angle would you like to rotate the pen head to? (1-360)", "Rotate Pen Head") as null|num diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 3f2f4d3e65..5c6aff5564 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -23,7 +23,7 @@ /obj/item/gun/ballistic/update_icon_state() if(current_skin) - icon_state = "[unique_reskin[current_skin]][suppressed ? "-suppressed" : ""][sawn_off ? "-sawn" : ""]" + icon_state = "[unique_reskin[current_skin]["icon_state"]][suppressed ? "-suppressed" : ""][sawn_off ? "-sawn" : ""]" else icon_state = "[initial(icon_state)][suppressed ? "-suppressed" : ""][sawn_off ? "-sawn" : ""]" diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index bd6f203882..53ba6d6a92 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -30,27 +30,28 @@ can_unsuppress = TRUE automatic_burst_overlay = FALSE obj_flags = UNIQUE_RENAME - unique_reskin = list("Default" = "cde", - "N-99" = "n99", - "Stealth" = "stealthpistol", - "HKVP-78" = "vp78", - "Luger" = "p08b", - "Mk.58" = "secguncomp", - "PX4 Storm" = "px4" - ) + unique_reskin = list( + "Default" = list("icon_state" = "cde"), + "N-99" = list("icon_state" = "n99"), + "Stealth" = list("icon_state" = "stealthpistol"), + "HKVP-78" = list("icon_state" = "vp78"), + "Luger" = list("icon_state" = "p08b"), + "Mk.58" = list("icon_state" = "secguncomp"), + "PX4 Storm" = list("icon_state" = "px4") + ) /obj/item/gun/ballistic/automatic/pistol/modular/update_icon_state() if(current_skin) - icon_state = "[unique_reskin[current_skin]][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]" + icon_state = "[unique_reskin[current_skin]["icon_state"]][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]" else icon_state = "[initial(icon_state)][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]" /obj/item/gun/ballistic/automatic/pistol/modular/update_overlays() . = ..() if(magazine && suppressed) - . += "[unique_reskin[current_skin]]-magazine-sup" //Yes, this means the default iconstate can't have a magazine overlay + . += "[unique_reskin[current_skin]["icon_state"]]-magazine-sup" //Yes, this means the default iconstate can't have a magazine overlay else if (magazine) - . += "[unique_reskin[current_skin]]-magazine" + . += "[unique_reskin[current_skin]["icon_state"]]-magazine" /obj/item/gun/ballistic/automatic/pistol/m1911 name = "\improper M1911" diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index f3b07aa7a4..28f81e13ae 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -88,13 +88,15 @@ /obj/item/gun/ballistic/revolver/syndicate obj_flags = UNIQUE_RENAME - unique_reskin = list("Default" = "revolver", - "Silver" = "russianrevolver", - "Robust" = "revolvercit", - "Bulky" = "revolverhakita", - "Polished" = "revolvertoriate", - "Soulless" = "revolveroldflip", - "Soul" = "revolverold") + unique_reskin = list( + "Default" = list("icon_state" = "revolver"), + "Silver" = list("icon_state" = "russianrevolver"), + "Robust" = list("icon_state" = "revolvercit"), + "Bulky" = list("icon_state" = "revolverhakita"), + "Polished" = list("icon_state" = "revolvertoriate"), + "Soulless" = list("icon_state" = "revolveroldflip"), + "Soul" = list("icon_state" = "revolverold") + ) /obj/item/gun/ballistic/revolver/detective name = "\improper .38 Mars Special" @@ -102,12 +104,13 @@ icon_state = "detective" mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev38 obj_flags = UNIQUE_RENAME - unique_reskin = list("Default" = "detective", - "Leopard Spots" = "detective_leopard", - "Black Panther" = "detective_panther", - "Gold Trim" = "detective_gold", - "The Peacemaker" = "detective_peacemaker" - ) + unique_reskin = list( + "Default" = list("icon_state" = "detective"), + "Leopard Spots" = list("icon_state" = "detective_leopard"), + "Black Panther" = list("icon_state" = "detective_panther"), + "Gold Trim" = list("icon_state" = "detective_gold"), + "The Peacemaker" = list("icon_state" = "detective_peacemaker") + ) var/list/safe_calibers /obj/item/gun/ballistic/revolver/detective/Initialize(mapload) @@ -294,13 +297,14 @@ mag_type = /obj/item/ammo_box/magazine/internal/shot/dual sawn_desc = "Omar's coming!" obj_flags = UNIQUE_RENAME - unique_reskin = list("Default" = "dshotgun", - "Dark Red Finish" = "dshotgun-d", - "Ash" = "dshotgun-f", - "Faded Grey" = "dshotgun-g", - "Maple" = "dshotgun-l", - "Rosewood" = "dshotgun-p" - ) + unique_reskin = list( + "Default" = list("icon_state" = "dshotgun"), + "Dark Red Finish" = list("icon_state" = "dshotgun-d"), + "Ash" = list("icon_state" = "dshotgun-f"), + "Faded Grey" = list("icon_state" = "dshotgun-g"), + "Maple" = list("icon_state" = "dshotgun-l"), + "Rosewood" = list("icon_state" = "dshotgun-p") + ) /obj/item/gun/ballistic/revolver/doublebarrel/attackby(obj/item/A, mob/user, params) ..() @@ -342,9 +346,10 @@ slot_flags = null mag_type = /obj/item/ammo_box/magazine/internal/shot/improvised sawn_desc = "I'm just here for the gasoline." - unique_reskin = list("Default" = "ishotgun", - "Cobbled" = "old_ishotgun" - ) + unique_reskin = list( + "Default" = list("icon_state" = "ishotgun"), + "Cobbled" = list("icon_state" = "old_ishotgun") + ) var/slung = FALSE /obj/item/gun/ballistic/revolver/doublebarrel/improvised/attackby(obj/item/A, mob/user, params) diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index b52620e7e0..0b92e63ca6 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -98,9 +98,10 @@ fire_delay = 7 mag_type = /obj/item/ammo_box/magazine/internal/shot/riot sawn_desc = "Come with me if you want to live." - unique_reskin = list("Tactical" = "riotshotgun", - "Wood Stock" = "wood_riotshotgun" - ) + unique_reskin = list( + "Tactical" = list("icon_state" = "riotshotgun"), + "Wood Stock" = list("icon_state" = "wood_riotshotgun") + ) /obj/item/gun/ballistic/shotgun/riot/attackby(obj/item/A, mob/user, params) ..() @@ -238,9 +239,10 @@ fire_delay = 5 mag_type = /obj/item/ammo_box/magazine/internal/shot/com w_class = WEIGHT_CLASS_HUGE - unique_reskin = list("Tactical" = "cshotgun", - "Slick" = "cshotgun_slick" - ) + unique_reskin = list( + "Tactical" = list("icon_state" = "cshotgun"), + "Slick" = list("icon_state" = "cshotgun_slick") + ) /obj/item/gun/ballistic/shotgun/automatic/combat/compact name = "warden's combat shotgun" @@ -279,7 +281,7 @@ update_icon() /obj/item/gun/ballistic/shotgun/automatic/combat/compact/update_icon_state() - icon_state = "[current_skin ? unique_reskin[current_skin] : "cshotgun"][stock ? "" : "c"]" + icon_state = "[current_skin ? unique_reskin[current_skin]["icon_state"] : "cshotgun"][stock ? "" : "c"]" /obj/item/gun/ballistic/shotgun/automatic/combat/compact/afterattack(atom/target, mob/living/user, flag, params) if(!stock) @@ -381,7 +383,7 @@ /obj/item/gun/ballistic/shotgun/leveraction/update_icon_state() if(current_skin) - icon_state = "[unique_reskin[current_skin]][sawn_off ? "-sawn" : ""][chambered ? "" : "-e"]" + icon_state = "[unique_reskin[current_skin]["icon_state"]][sawn_off ? "-sawn" : ""][chambered ? "" : "-e"]" else icon_state = "[initial(icon_state)][sawn_off ? "-sawn" : ""][chambered ? "" : "-e"]" diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 0aee51bb84..6c6733627f 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -69,8 +69,6 @@ var/projectile_piercing = NONE /// number of times we've pierced something. Incremented BEFORE bullet_act and on_hit proc! var/pierces = 0 - /// If objects are below this layer, we pass through them - var/hit_threshhold = PROJECTILE_HIT_THRESHHOLD_LAYER /// "leftover" pixels for Range() calculation as pixel_move() was moved to simulated semi-pixel movement and Range() is in tiles. var/pixels_range_leftover = 0 /// "leftover" tick pixels and stuff yeah, so we don't round off things and introducing tracing inaccuracy. @@ -521,7 +519,7 @@ if(!isliving(target)) if(isturf(target)) // non dense turfs return FALSE - if(target.layer < hit_threshhold) + if(target.layer < PROJECTILE_HIT_THRESHHOLD_LAYER) return FALSE else if(!direct_target) // non dense objects do not get hit unless specifically clicked return FALSE diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 77d713047a..d233866f80 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -890,7 +890,6 @@ R.reaction_turf(A, R.volume * volume_modifier, show_message, from_gas) if("OBJ") R.reaction_obj(A, R.volume * volume_modifier, show_message) - SEND_SIGNAL(A, COMSIG_ATOM_EXPOSE_REAGENTS, cached_reagents, src, method, volume_modifier, show_message, from_gas) /datum/reagents/proc/holder_full() if(total_volume >= maximum_volume) diff --git a/code/modules/reagents/reagent_containers/hypovial.dm b/code/modules/reagents/reagent_containers/hypovial.dm index 43f9f88976..0f9ffd6514 100644 --- a/code/modules/reagents/reagent_containers/hypovial.dm +++ b/code/modules/reagents/reagent_containers/hypovial.dm @@ -9,15 +9,16 @@ possible_transfer_amounts = list(1,2,5,10) container_flags = APTFT_VERB obj_flags = UNIQUE_RENAME - unique_reskin = list("hypovial" = "hypovial", - "red hypovial" = "hypovial-b", - "blue hypovial" = "hypovial-d", - "green hypovial" = "hypovial-a", - "orange hypovial" = "hypovial-k", - "purple hypovial" = "hypovial-p", - "black hypovial" = "hypovial-t", - "pink hypovial" = "hypovial-pink" - ) + unique_reskin = list( + "hypovial" = list("icon_state" = "hypovial"), + "red hypovial" = list("icon_state" = "hypovial-b"), + "blue hypovial" = list("icon_state" = "hypovial-d"), + "green hypovial" = list("icon_state" = "hypovial-a"), + "orange hypovial" = list("icon_state" = "hypovial-k"), + "purple hypovial" = list("icon_state" = "hypovial-p"), + "black hypovial" = list("icon_state" = "hypovial-t"), + "pink hypovial" = list("icon_state" = "hypovial-pink") + ) always_reskinnable = TRUE cached_icon = "hypovial" @@ -50,14 +51,15 @@ icon_state = "hypoviallarge" volume = 120 possible_transfer_amounts = list(1,2,5,10,20) - unique_reskin = list("large hypovial" = "hypoviallarge", - "large red hypovial" = "hypoviallarge-b", - "large blue hypovial" = "hypoviallarge-d", - "large green hypovial" = "hypoviallarge-a", - "large orange hypovial" = "hypoviallarge-k", - "large purple hypovial" = "hypoviallarge-p", - "large black hypovial" = "hypoviallarge-t" - ) + unique_reskin = list( + "large hypovial" = list("icon_state" = "hypoviallarge"), + "large red hypovial" = list("icon_state" = "hypoviallarge-b"), + "large blue hypovial" = list("icon_state" = "hypoviallarge-d"), + "large green hypovial" = list("icon_state" = "hypoviallarge-a"), + "large orange hypovial" = list("icon_state" = "hypoviallarge-k"), + "large purple hypovial" = list("icon_state" = "hypoviallarge-p"), + "large black hypovial" = list("icon_state" = "hypoviallarge-t") + ) cached_icon = "hypoviallarge" /obj/item/reagent_containers/glass/bottle/vial/large/bluespace diff --git a/code/modules/research/designs/mod_designs.dm b/code/modules/research/designs/mod_designs.dm deleted file mode 100644 index 8ceadeb8fb..0000000000 --- a/code/modules/research/designs/mod_designs.dm +++ /dev/null @@ -1,372 +0,0 @@ -//MODsuit construction - -/datum/design/mod_shell - name = "MOD Shell" - desc = "A 'Nakamura Engineering' designed shell for a Modular Suit." - id = "mod_shell" - build_type = MECHFAB - materials = list(/datum/material/iron = 10000, /datum/material/plasma = 5000) - construction_time = 25 SECONDS - build_path = /obj/item/mod/construction/shell - category = list("MODsuit Chassis") - -/datum/design/mod_helmet - name = "MOD Helmet" - desc = "A 'Nakamura Engineering' designed helmet for a Modular Suit." - id = "mod_helmet" - build_type = MECHFAB - materials = list(/datum/material/iron = 5000) - construction_time = 10 SECONDS - build_path = /obj/item/mod/construction/helmet - category = list("MODsuit Chassis") - -/datum/design/mod_chestplate - name = "MOD Chestplate" - desc = "A 'Nakamura Engineering' designed chestplate for a Modular Suit." - id = "mod_chestplate" - build_type = MECHFAB - materials = list(/datum/material/iron = 5000) - construction_time = 10 SECONDS - build_path = /obj/item/mod/construction/chestplate - category = list("MODsuit Chassis") - -/datum/design/mod_gauntlets - name = "MOD Gauntlets" - desc = "'Nakamura Engineering' designed gauntlets for a Modular Suit." - id = "mod_gauntlets" - build_type = MECHFAB - materials = list(/datum/material/iron = 5000) - construction_time = 10 SECONDS - build_path = /obj/item/mod/construction/gauntlets - category = list("MODsuit Chassis") - -/datum/design/mod_boots - name = "MOD Boots" - desc = "'Nakamura Engineering' designed boots for a Modular Suit." - id = "mod_boots" - build_type = MECHFAB - materials = list(/datum/material/iron = 5000) - construction_time = 10 SECONDS - build_path = /obj/item/mod/construction/boots - category = list("MODsuit Chassis") - -/datum/design/mod_plating - name = "MOD External Plating" - desc = "External plating for a MODsuit." - id = "mod_plating_standard" - build_type = PROTOLATHE | MECHFAB - materials = list(/datum/material/iron = 6000, /datum/material/glass = 3000, /datum/material/plasma = 1000) - construction_time = 15 SECONDS - build_path = /obj/item/mod/construction/armor - category = list("MODsuit Chassis", "MODsuit Designs") - departmental_flags = DEPARTMENTAL_FLAG_ALL - research_icon = 'icons/obj/clothing/modsuit/mod_construction.dmi' - research_icon_state = "standard-plating" - -/datum/design/mod_plating/New() - . = ..() - var/obj/item/mod/construction/armor/armor_type = build_path - var/datum/mod_theme/theme = GLOB.mod_themes[initial(armor_type.theme)] - desc = "External plating for a MODsuit. [theme.desc]" - -/datum/design/mod_plating/engineering - name = "MOD Engineering Plating" - id = "mod_plating_engineering" - build_path = /obj/item/mod/construction/armor/engineering - materials = list(/datum/material/iron = 6000, /datum/material/gold = 2000, /datum/material/glass = 1000, /datum/material/plasma = 1000) - departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING - research_icon_state = "engineering-plating" - -/datum/design/mod_plating/atmospheric - name = "MOD Atmospheric Plating" - id = "mod_plating_atmospheric" - build_path = /obj/item/mod/construction/armor/atmospheric - materials = list(/datum/material/iron = 6000, /datum/material/titanium = 2000, /datum/material/glass = 1000, /datum/material/plasma = 1000) - departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING - research_icon_state = "atmospheric-plating" - -/datum/design/mod_plating/mining - name = "MOD Mining Plating" - id = "mod_plating_mining" - build_path = /obj/item/mod/construction/armor/mining - materials = list(/datum/material/iron = 6000, /datum/material/titanium = 2000, /datum/material/glass = 1000, /datum/material/plasma = 1000) - departmental_flags = DEPARTMENTAL_FLAG_CARGO - research_icon_state = "atmospheric-mining" - -/datum/design/mod_plating/medical - name = "MOD Medical Plating" - id = "mod_plating_medical" - build_path = /obj/item/mod/construction/armor/medical - materials = list(/datum/material/iron = 6000, /datum/material/silver = 2000, /datum/material/glass = 1000, /datum/material/plasma = 1000) - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - research_icon_state = "medical-plating" - -/datum/design/mod_plating/security - name = "MOD Security Plating" - id = "mod_plating_security" - build_path = /obj/item/mod/construction/armor/security - materials = list(/datum/material/iron = 6000, /datum/material/uranium = 2000, /datum/material/glass = 1000, /datum/material/plasma = 1000) - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - research_icon_state = "security-plating" - -/datum/design/mod_plating/cosmohonk - name = "MOD Cosmohonk Plating" - id = "mod_plating_cosmohonk" - build_path = /obj/item/mod/construction/armor/cosmohonk - materials = list(/datum/material/iron = 6000, /datum/material/bananium = 2000, /datum/material/glass = 1000, /datum/material/plasma = 1000) - departmental_flags = DEPARTMENTAL_FLAG_SERVICE - research_icon_state = "cosmohonk-plating" - -/datum/design/mod_paint_kit - name = "MOD Paint Kit" - desc = "A paint kit for Modular Suits." - id = "mod_paint_kit" - build_type = MECHFAB - materials = list(/datum/material/iron = 1000, /datum/material/plastic = 500) - construction_time = 5 SECONDS - build_path = /obj/item/mod/paint - category = list("MODsuit Modules", "MODsuit Designs") - -//MODsuit modules - -/datum/design/module - name = "MOD Module" - build_type = PROTOLATHE | MECHFAB - construction_time = 1 SECONDS - materials = list(/datum/material/iron = 1000, /datum/material/glass = 1000) - build_path = /obj/item/mod/module - category = list("MODsuit Modules", "MODsuit Designs") - departmental_flags = DEPARTMENTAL_FLAG_ALL - -/datum/design/module/New() - . = ..() - var/obj/item/mod/module/module = build_path - desc = "[initial(module.desc)] It uses [initial(module.complexity)] complexity." - -/datum/design/module/mod_storage - name = "Storage Module" - id = "mod_storage" - materials = list(/datum/material/iron = 2500, /datum/material/glass = 500) - build_path = /obj/item/mod/module/storage - -/datum/design/module/mod_visor_medhud - name = "Medical Visor Module" - id = "mod_visor_medhud" - materials = list(/datum/material/silver = 500, /datum/material/glass = 1000) - build_path = /obj/item/mod/module/visor/medhud - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - -/datum/design/module/mod_visor_diaghud - name = "Diagnostic Visor Module" - id = "mod_visor_diaghud" - materials = list(/datum/material/gold = 500, /datum/material/glass = 1000) - build_path = /obj/item/mod/module/visor/diaghud - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE - -/datum/design/module/mod_visor_sechud - name = "Security Visor Module" - id = "mod_visor_sechud" - materials = list(/datum/material/titanium = 500, /datum/material/glass = 1000) - build_path = /obj/item/mod/module/visor/sechud - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/module/mod_visor_meson - name = "Meson Visor Module" - id = "mod_visor_meson" - materials = list(/datum/material/uranium = 500, /datum/material/glass = 1000) - build_path = /obj/item/mod/module/visor/meson - departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/module/mod_visor_welding - name = "Welding Protection Module" - id = "mod_welding" - materials = list(/datum/material/iron = 500, /datum/material/glass = 1000) - build_path = /obj/item/mod/module/welding - departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/module/mod_t_ray - name = "T-Ray Scanner Module" - id = "mod_t_ray" - materials = list(/datum/material/iron = 500, /datum/material/glass = 1000) - build_path = /obj/item/mod/module/t_ray - departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/module/mod_health_analyzer - name = "Health Analyzer Module" - id = "mod_health_analyzer" - materials = list(/datum/material/iron = 500, /datum/material/glass = 1000) - build_path = /obj/item/mod/module/health_analyzer - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - -/datum/design/module/mod_stealth - name = "Cloak Module" - id = "mod_stealth" - materials = list(/datum/material/iron = 1000, /datum/material/bluespace = 500) - build_path = /obj/item/mod/module/stealth - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/module/mod_jetpack - name = "Ion Jetpack Module" - id = "mod_jetpack" - materials = list(/datum/material/iron = 1500, /datum/material/plasma = 1000) - build_path = /obj/item/mod/module/jetpack - departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/module/mod_magboot - name = "Magnetic Stabilizator Module" - id = "mod_magboot" - materials = list(/datum/material/iron = 1000, /datum/material/gold = 500) - build_path = /obj/item/mod/module/magboot - departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/module/mod_mag_harness - name = "Magnetic Harness Module" - id = "mod_mag_harness" - materials = list(/datum/material/iron = 1500, /datum/material/silver = 500) - build_path = /obj/item/mod/module/magnetic_harness - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/module/mod_tether - name = "Emergency Tether Module" - id = "mod_tether" - materials = list(/datum/material/iron = 1000, /datum/material/silver = 500) - build_path = /obj/item/mod/module/tether - departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/module/mod_mouthhole - name = "Eating Apparatus Module" - id = "mod_mouthhole" - materials = list(/datum/material/iron = 1500) - build_path = /obj/item/mod/module/mouthhole - -/datum/design/module/mod_rad_protection - name = "Radiation Protection Module" - id = "mod_rad_protection" - materials = list(/datum/material/iron = 1000, /datum/material/uranium = 1000) - build_path = /obj/item/mod/module/rad_protection - departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/module/mod_emp_shield - name = "EMP Shield Module" - id = "mod_emp_shield" - materials = list(/datum/material/iron = 1000, /datum/material/plasma = 1000) - build_path = /obj/item/mod/module/emp_shield - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE - -/datum/design/module/mod_flashlight - name = "Flashlight Module" - id = "mod_flashlight" - materials = list(/datum/material/iron = 500, /datum/material/glass = 1000) - build_path = /obj/item/mod/module/flashlight - -/datum/design/module/mod_reagent_scanner - name = "Reagent Scanner Module" - id = "mod_reagent_scanner" - materials = list(/datum/material/glass = 1000) - build_path = /obj/item/mod/module/reagent_scanner - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE - -/datum/design/module/mod_gps - name = "Internal GPS Module" - id = "mod_gps" - materials = list(/datum/material/iron = 500, /datum/material/glass = 500) - build_path = /obj/item/mod/module/gps - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_CARGO - -/datum/design/module/mod_constructor - name = "Constructor Module" - id = "mod_constructor" - materials = list(/datum/material/iron = 1000, /datum/material/titanium = 500) - build_path = /obj/item/mod/module/constructor - departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/module/mod_quick_carry - name = "Quick Carry Module" - id = "mod_quick_carry" - materials = list(/datum/material/iron = 1000, /datum/material/titanium = 500) - build_path = /obj/item/mod/module/quick_carry - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - -/datum/design/module/mod_bikehorn - name = "Bike Horn Module" - id = "mod_bikehorn" - materials = list(/datum/material/plastic = 500, /datum/material/iron = 500) - build_path = /obj/item/mod/module/bikehorn - departmental_flags = DEPARTMENTAL_FLAG_SERVICE - -/datum/design/module/mod_microwave_beam - name = "Microwave Beam Module" - id = "mod_microwave_beam" - materials = list(/datum/material/iron = 1000, /datum/material/uranium = 500) - build_path = /obj/item/mod/module/microwave_beam - departmental_flags = DEPARTMENTAL_FLAG_SERVICE - -/datum/design/module/mod_clamp - name = "Crate Clamp Module" - id = "mod_clamp" - materials = list(/datum/material/iron = 2000) - build_path = /obj/item/mod/module/clamp - departmental_flags = DEPARTMENTAL_FLAG_CARGO - -/datum/design/module/mod_drill - name = "Drill Module" - id = "mod_drill" - materials = list(/datum/material/silver = 1000, /datum/material/iron = 2000) - build_path = /obj/item/mod/module/drill - departmental_flags = DEPARTMENTAL_FLAG_CARGO - -/datum/design/module/mod_orebag - name = "Ore Bag Module" - id = "mod_orebag" - materials = list(/datum/material/iron = 1500) - build_path = /obj/item/mod/module/orebag - departmental_flags = DEPARTMENTAL_FLAG_CARGO - -/datum/design/module/mod_dna_lock - name = "DNA Lock Module" - id = "mod_dna_lock" - materials = list(/datum/material/diamond = 500, /datum/material/glass = 1000) - build_path = /obj/item/mod/module/dna_lock - -/datum/design/module/mister_atmos - name = "Resin Mister Module" - id = "mod_mister_atmos" - materials = list(/datum/material/glass = 1000, /datum/material/titanium = 1500) - build_path = /obj/item/mod/module/mister/atmos - departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/module/mod_holster - name = "Holster Module" - id = "mod_holster" - materials = list(/datum/material/iron = 1500, /datum/material/glass = 500) - build_path = /obj/item/mod/module/holster - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/module/surgicalprocessor - name = "Surgical Processor Module" - id = "mod_surgicalprocessor" - materials = list(/datum/material/titanium = 250, /datum/material/glass = 1000, /datum/material/silver = 1500) - build_path = /obj/item/mod/module/surgical_processor - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - -/datum/design/module/defibrillator - name = "Defibrillator Module" - id = "mod_defib" - materials = list(/datum/material/titanium = 250, /datum/material/diamond = 1000, /datum/material/silver = 1500) - build_path = /obj/item/mod/module/defibrillator - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - -//MODsuit anomalock modules -/datum/design/module/mod_antigrav - name = "Anti-Gravity Module" - id = "mod_antigrav" - materials = list(/datum/material/iron = 2500, /datum/material/glass = 2000, /datum/material/uranium = 2000) - build_path = /obj/item/mod/module/anomaly_locked/antigrav - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE - -/datum/design/module/mod_teleporter - name = "Teleporter Module" - id = "mod_teleporter" - materials = list(/datum/material/iron = 2500, /datum/material/glass = 2000, /datum/material/bluespace = 2000) - build_path = /obj/item/mod/module/anomaly_locked/teleporter - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE diff --git a/code/modules/research/machinery/protolathe.dm b/code/modules/research/machinery/protolathe.dm index 4057503e09..684f27ccad 100644 --- a/code/modules/research/machinery/protolathe.dm +++ b/code/modules/research/machinery/protolathe.dm @@ -15,8 +15,7 @@ "Weapons", "Ammo", "Firing Pins", - "Computer Parts", - "MODsuit Designs" + "Computer Parts" ) production_animation = "protolathe_n" allowed_buildtypes = PROTOLATHE diff --git a/code/modules/research/machinery/techfab.dm b/code/modules/research/machinery/techfab.dm index 110b6c037c..f93560ed10 100644 --- a/code/modules/research/machinery/techfab.dm +++ b/code/modules/research/machinery/techfab.dm @@ -26,8 +26,7 @@ "Subspace Telecomms", "Research Machinery", "Misc. Machinery", - "Computer Parts", - "MODsuit Designs" + "Computer Parts" ) console_link = FALSE production_animation = "protolathe_n" diff --git a/code/modules/research/techweb/nodes/mod_nodes.dm b/code/modules/research/techweb/nodes/mod_nodes.dm deleted file mode 100644 index 9cad736db0..0000000000 --- a/code/modules/research/techweb/nodes/mod_nodes.dm +++ /dev/null @@ -1,124 +0,0 @@ -/datum/techweb_node/mod_basic - id = "mod" - starting_node = TRUE - display_name = "Basic Modular Suits" - description = "Specialized back mounted power suits with various different modules." - design_ids = list( - "mod_shell", - "mod_helmet", - "mod_chestplate", - "mod_gauntlets", - "mod_boots", - "mod_plating_standard", - "mod_storage", - "mod_welding", - "mod_mouthhole", - "mod_flashlight", - ) - -/datum/techweb_node/mod_advanced - id = "mod_advanced" - display_name = "Advanced Modular Suits" - description = "More advanced modules, to improve modular suits." - prereq_ids = list("mod", "robotics") - design_ids = list( - "mod_plating_mining", - "mod_visor_diaghud", - "mod_gps", - "mod_reagent_scanner", - "mod_clamp", - "mod_drill", - "mod_orebag", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/mod_engineering - id = "mod_engineering" - display_name = "Engineering Modular Suits" - description = "Engineering suits, for powered engineers." - prereq_ids = list("mod_advanced", "engineering") - design_ids = list( - "mod_plating_engineering", - "mod_visor_meson", - "mod_t_ray", - "mod_magboot", - "mod_tether", - "mod_constructor", - "mod_mister_atmos", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/mod_advanced_engineering - id = "mod_advanced_engineering" - display_name = "Advanced Engineering Modular Suits" - description = "Advanced Engineering suits, for advanced powered engineers." - prereq_ids = list("mod_engineering", "adv_engi") - design_ids = list( - "mod_plating_atmospheric", - "mod_jetpack", - "mod_rad_protection", - "mod_emp_shield", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500) - -/datum/techweb_node/mod_medical - id = "mod_medical" - display_name = "Medical Modular Suits" - description = "Medical suits for quick rescue purposes." - prereq_ids = list("mod_advanced", "biotech") - design_ids = list( - "mod_plating_medical", - "mod_visor_medhud", - "mod_health_analyzer", - "mod_quick_carry", - "mod_dna_lock", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/mod_advanced_medical - id = "mod_advanced_medical" - display_name = "Advanced Medical Modular Suits" - description = "Advanced medical suits for quicker rescue purposes." - prereq_ids = list("mod_medical", "adv_biotech") - design_ids = list( - "mod_defib", - "mod_surgicalprocessor", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500) - -/datum/techweb_node/mod_security - id = "mod_security" - display_name = "Security Modular Suits" - description = "Security suits for space crime handling." - prereq_ids = list("mod_advanced", "sec_basic") - design_ids = list( - "mod_plating_security", - "mod_visor_sechud", - "mod_stealth", - "mod_mag_harness", - "mod_holster", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/mod_entertainment - id = "mod_entertainment" - display_name = "Entertainment Modular Suits" - description = "Powered suits for protection against low-humor environments." - prereq_ids = list("mod_advanced", "clown") - design_ids = list( - "mod_plating_cosmohonk", - "mod_bikehorn", - "mod_microwave_beam", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - -/datum/techweb_node/mod_anomaly - id = "mod_anomaly" - display_name = "Anomalock Modular Suits" - description = "Modules for modular suits that require anomaly cores to function." - prereq_ids = list("mod_advanced", "anomaly_research") - design_ids = list( - "mod_antigrav", - "mod_teleporter", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) 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/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 9e39ec58e8..a4eafc4b01 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -68,15 +68,6 @@ var/obj/item/surgical_processor/SP = locate() in R.module.modules if(SP) advanced_surgeries |= SP.advanced_surgeries - else - var/obj/item/surgical_processor/SP - for(var/obj/item/surgical_processor/processor in user.held_items) - SP = processor - break - if(!SP) - SP = locate(/obj/item/surgical_processor) in get_turf(user) - if(SP) - advanced_surgeries |= SP.advanced_surgeries var/turf/T = get_turf(patient) var/obj/structure/table/optable/table = locate(/obj/structure/table/optable, T) diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm index f4ffda302e..de5628dc05 100644 --- a/code/modules/vehicles/mecha/_mecha.dm +++ b/code/modules/vehicles/mecha/_mecha.dm @@ -817,7 +817,7 @@ mecha_flags &= ~SILICON_PILOT AI.forceMove(card) card.AI = AI - AI.controlled_equipment = null + AI.controlled_mech = null AI.remote_control = null to_chat(AI, "You have been downloaded to a mobile storage device. Wireless connection offline.") to_chat(user, "Transfer successful: [AI.name] ([rand(1000,9999)].exe) removed from [name] and stored within local memory.") @@ -856,7 +856,7 @@ mecha_flags |= SILICON_PILOT moved_inside(AI) AI.cancel_camera() - AI.controlled_equipment = src + AI.controlled_mech = src AI.remote_control = src AI.mobility_flags = ALL //Much easier than adding AI checks! Be sure to set this back to 0 if you decide to allow an AI to leave a mech somehow. if(interaction == AI_MECH_HACK) @@ -1083,7 +1083,7 @@ AI.linked_core = null return to_chat(AI, "Returning to core...") - AI.controlled_equipment = null + AI.controlled_mech = null AI.remote_control = null mob_container = AI newloc = get_turf(AI.linked_core) diff --git a/code/modules/vehicles/mecha/mech_fabricator.dm b/code/modules/vehicles/mecha/mech_fabricator.dm index 29cc88a563..bbbfa7f1bd 100644 --- a/code/modules/vehicles/mecha/mech_fabricator.dm +++ b/code/modules/vehicles/mecha/mech_fabricator.dm @@ -57,8 +57,6 @@ "Exosuit Equipment", "Exosuit Ammunition", "Cyborg Upgrade Modules", - "MODsuit Chassis", - "MODsuit Modules", "Cybernetics", "Implants", "Control Interfaces", diff --git a/code/modules/vehicles/mecha/mecha_wreckage.dm b/code/modules/vehicles/mecha/mecha_wreckage.dm index 70c543fbde..b9f299731a 100644 --- a/code/modules/vehicles/mecha/mecha_wreckage.dm +++ b/code/modules/vehicles/mecha/mecha_wreckage.dm @@ -35,7 +35,7 @@ AI.death() //The damage is not enough to kill the AI, but to be 'corrupted files' in need of repair. AI.forceMove(src) //Put the dead AI inside the wreckage for recovery add_overlay(mutable_appearance('icons/obj/projectiles.dmi', "green_laser")) //Overlay for the recovery beacon - AI.controlled_equipment = null + AI.controlled_mech = null AI.remote_control = null /obj/structure/mecha_wreckage/Destroy() 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/icons/effects/96x32.dmi b/icons/effects/96x32.dmi index 937b2e8d42..a78d11530b 100644 Binary files a/icons/effects/96x32.dmi and b/icons/effects/96x32.dmi differ diff --git a/icons/mob/actions/actions_mod.dmi b/icons/mob/actions/actions_mod.dmi deleted file mode 100644 index 84fcbc00db..0000000000 Binary files a/icons/mob/actions/actions_mod.dmi and /dev/null 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/clothing/modsuit/mod_clothing.dmi b/icons/mob/clothing/modsuit/mod_clothing.dmi deleted file mode 100644 index f8dba0a006..0000000000 Binary files a/icons/mob/clothing/modsuit/mod_clothing.dmi and /dev/null differ diff --git a/icons/mob/clothing/modsuit/mod_clothing_anthro.dmi b/icons/mob/clothing/modsuit/mod_clothing_anthro.dmi deleted file mode 100644 index a18800875c..0000000000 Binary files a/icons/mob/clothing/modsuit/mod_clothing_anthro.dmi and /dev/null differ diff --git a/icons/mob/clothing/modsuit/mod_modules.dmi b/icons/mob/clothing/modsuit/mod_modules.dmi deleted file mode 100644 index 1001ae77d2..0000000000 Binary files a/icons/mob/clothing/modsuit/mod_modules.dmi and /dev/null 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/modsuit/mod_clothing.dmi b/icons/obj/clothing/modsuit/mod_clothing.dmi deleted file mode 100644 index 41ebc1a2ba..0000000000 Binary files a/icons/obj/clothing/modsuit/mod_clothing.dmi and /dev/null differ diff --git a/icons/obj/clothing/modsuit/mod_construction.dmi b/icons/obj/clothing/modsuit/mod_construction.dmi deleted file mode 100644 index 5e46b5f85c..0000000000 Binary files a/icons/obj/clothing/modsuit/mod_construction.dmi and /dev/null differ diff --git a/icons/obj/clothing/modsuit/mod_modules.dmi b/icons/obj/clothing/modsuit/mod_modules.dmi deleted file mode 100644 index 037e7fe696..0000000000 Binary files a/icons/obj/clothing/modsuit/mod_modules.dmi and /dev/null differ diff --git a/icons/obj/defibrillators.dmi b/icons/obj/defibrillators.dmi index 8871d5b049..a4dc9e65e3 100644 Binary files a/icons/obj/defibrillators.dmi and b/icons/obj/defibrillators.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index 0f49bc6d5f..09a9213f2a 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index 27ad84b1a4..3204b36cc5 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/modular_citadel/code/modules/client/loadout/backpack.dm b/modular_citadel/code/modules/client/loadout/backpack.dm index 5879426041..a0be000b31 100644 --- a/modular_citadel/code/modules/client/loadout/backpack.dm +++ b/modular_citadel/code/modules/client/loadout/backpack.dm @@ -190,3 +190,8 @@ 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/custom_loadout/custom_items.dm b/modular_citadel/code/modules/custom_loadout/custom_items.dm index 500db4453f..ec97d0659f 100644 --- a/modular_citadel/code/modules/custom_loadout/custom_items.dm +++ b/modular_citadel/code/modules/custom_loadout/custom_items.dm @@ -550,7 +550,10 @@ item_state = "fritz" attack_verb = list("barked", "boofed", "shotgun'd") obj_flags = UNIQUE_RENAME - unique_reskin = list("Goodboye" = "fritz", "Badboye" = "fritz_bad") + unique_reskin = list( + "Goodboye" = list("icon_state" = "fritz"), + "Badboye" = list("icon_state" = "fritz_bad") + ) mutantrace_variation = NONE /obj/item/clothing/neck/cloak/polychromic/polyce diff --git a/sound/items/modsuit/atrocinator_step.ogg b/sound/items/modsuit/atrocinator_step.ogg deleted file mode 100644 index deda85ac35..0000000000 Binary files a/sound/items/modsuit/atrocinator_step.ogg and /dev/null differ diff --git a/sound/items/modsuit/ballin.ogg b/sound/items/modsuit/ballin.ogg deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/sound/items/modsuit/ballout.ogg b/sound/items/modsuit/ballout.ogg deleted file mode 100644 index f911f1a6a6..0000000000 Binary files a/sound/items/modsuit/ballout.ogg and /dev/null differ diff --git a/sound/items/modsuit/flamethrower.ogg b/sound/items/modsuit/flamethrower.ogg deleted file mode 100644 index 447245d50b..0000000000 Binary files a/sound/items/modsuit/flamethrower.ogg and /dev/null differ diff --git a/sound/items/modsuit/inflate_bloon.ogg b/sound/items/modsuit/inflate_bloon.ogg deleted file mode 100644 index 9b030d66ce..0000000000 Binary files a/sound/items/modsuit/inflate_bloon.ogg and /dev/null differ diff --git a/sound/items/modsuit/loader_charge.ogg b/sound/items/modsuit/loader_charge.ogg deleted file mode 100644 index 61d5531f72..0000000000 Binary files a/sound/items/modsuit/loader_charge.ogg and /dev/null differ diff --git a/sound/items/modsuit/loader_launch.ogg b/sound/items/modsuit/loader_launch.ogg deleted file mode 100644 index 513118f3c6..0000000000 Binary files a/sound/items/modsuit/loader_launch.ogg and /dev/null differ diff --git a/sound/items/modsuit/magnetic_harness.ogg b/sound/items/modsuit/magnetic_harness.ogg deleted file mode 100644 index 3d19fccc56..0000000000 Binary files a/sound/items/modsuit/magnetic_harness.ogg and /dev/null differ diff --git a/sound/items/modsuit/rewinder.ogg b/sound/items/modsuit/rewinder.ogg deleted file mode 100644 index 2587562dc1..0000000000 Binary files a/sound/items/modsuit/rewinder.ogg and /dev/null differ diff --git a/sound/items/modsuit/springlock.ogg b/sound/items/modsuit/springlock.ogg deleted file mode 100644 index 8d0013d263..0000000000 Binary files a/sound/items/modsuit/springlock.ogg and /dev/null differ diff --git a/sound/items/modsuit/tem_shot.ogg b/sound/items/modsuit/tem_shot.ogg deleted file mode 100644 index 50905b95f1..0000000000 Binary files a/sound/items/modsuit/tem_shot.ogg and /dev/null differ diff --git a/sound/items/modsuit/time_anchor_set.ogg b/sound/items/modsuit/time_anchor_set.ogg deleted file mode 100644 index 457f8e6dba..0000000000 Binary files a/sound/items/modsuit/time_anchor_set.ogg and /dev/null differ diff --git a/sound/mecha/hydraulic.ogg b/sound/mecha/hydraulic.ogg deleted file mode 100644 index 3281ed2dc0..0000000000 Binary files a/sound/mecha/hydraulic.ogg and /dev/null differ diff --git a/sound/weapons/revolverempty.ogg b/sound/weapons/revolverempty.ogg deleted file mode 100644 index 81ddb1e2e0..0000000000 Binary files a/sound/weapons/revolverempty.ogg and /dev/null differ diff --git a/tgstation.dme b/tgstation.dme index cea70ef085..a4220fa4ae 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -80,7 +80,6 @@ #include "code\__DEFINES\menu.dm" #include "code\__DEFINES\misc.dm" #include "code\__DEFINES\mobs.dm" -#include "code\__DEFINES\mod.dm" #include "code\__DEFINES\monkeys.dm" #include "code\__DEFINES\move_force.dm" #include "code\__DEFINES\movement.dm" @@ -159,7 +158,6 @@ #include "code\__DEFINES\dcs\signals.dm" #include "code\__DEFINES\dcs\signals\signals_painting.dm" #include "code\__DEFINES\dcs\signals\signals_subsystem.dm" -#include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_movable.dm" #include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_movement.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_living.dm" #include "code\__DEFINES\mapping\maploader.dm" @@ -700,6 +698,7 @@ #include "code\datums\elements\forced_gravity.dm" #include "code\datums\elements\ghost_role_eligibility.dm" #include "code\datums\elements\mob_holder.dm" +#include "code\datums\elements\object_reskinning.dm" #include "code\datums\elements\photosynthesis.dm" #include "code\datums\elements\polychromic.dm" #include "code\datums\elements\scavenging.dm" @@ -813,7 +812,6 @@ #include "code\datums\wires\emitter.dm" #include "code\datums\wires\explosive.dm" #include "code\datums\wires\microwave.dm" -#include "code\datums\wires\mod.dm" #include "code\datums\wires\mulebot.dm" #include "code\datums\wires\particle_accelerator.dm" #include "code\datums\wires\r_n_d.dm" @@ -2957,26 +2955,6 @@ #include "code\modules\mob\living\simple_animal\slime\slime.dm" #include "code\modules\mob\living\simple_animal\slime\slime_mobility.dm" #include "code\modules\mob\living\simple_animal\slime\subtypes.dm" -#include "code\modules\mod\mod_actions.dm" -#include "code\modules\mod\mod_activation.dm" -#include "code\modules\mod\mod_ai.dm" -#include "code\modules\mod\mod_clothes.dm" -#include "code\modules\mod\mod_construction.dm" -#include "code\modules\mod\mod_control.dm" -#include "code\modules\mod\mod_theme.dm" -#include "code\modules\mod\mod_types.dm" -#include "code\modules\mod\mod_ui.dm" -#include "code\modules\mod\modules\_module.dm" -#include "code\modules\mod\modules\modules.dm" -#include "code\modules\mod\modules\modules_engineering.dm" -#include "code\modules\mod\modules\modules_general.dm" -#include "code\modules\mod\modules\modules_maint.dm" -#include "code\modules\mod\modules\modules_medical.dm" -#include "code\modules\mod\modules\modules_science.dm" -#include "code\modules\mod\modules\modules_security.dm" -#include "code\modules\mod\modules\modules_service.dm" -#include "code\modules\mod\modules\modules_supply.dm" -#include "code\modules\mod\modules\modules_visor.dm" #include "code\modules\modular_computers\laptop_vendor.dm" #include "code\modules\modular_computers\computers\_modular_computer_shared.dm" #include "code\modules\modular_computers\computers\item\computer.dm" @@ -3390,7 +3368,6 @@ #include "code\modules\research\designs\medical_designs.dm" #include "code\modules\research\designs\mining_designs.dm" #include "code\modules\research\designs\misc_designs.dm" -#include "code\modules\research\designs\mod_designs.dm" #include "code\modules\research\designs\nanite_designs.dm" #include "code\modules\research\designs\power_designs.dm" #include "code\modules\research\designs\smelting_designs.dm" @@ -3460,7 +3437,6 @@ #include "code\modules\research\techweb\nodes\mecha_nodes.dm" #include "code\modules\research\techweb\nodes\medical_nodes.dm" #include "code\modules\research\techweb\nodes\misc_nodes.dm" -#include "code\modules\research\techweb\nodes\mod_nodes.dm" #include "code\modules\research\techweb\nodes\nanites_nodes.dm" #include "code\modules\research\techweb\nodes\robotics_nodes.dm" #include "code\modules\research\techweb\nodes\syndicate_nodes.dm" diff --git a/tgui/packages/tgui/interfaces/MODpaint.js b/tgui/packages/tgui/interfaces/MODpaint.js deleted file mode 100644 index 9a329688eb..0000000000 --- a/tgui/packages/tgui/interfaces/MODpaint.js +++ /dev/null @@ -1,151 +0,0 @@ -import { useBackend } from '../backend'; -import { Box, Stack, Section, ByondUi, Slider, Flex, Button } from '../components'; -import { Window } from '../layouts'; -import { capitalize } from 'common/string'; - -const colorToMatrix = (param) => { - switch (param) { - case 'red': - return [ - 1, 0, 0, 0, 0.25, 0.5, 0, 0, 0.25, 0, 0.5, 0, 0, 0, 0, 1, 0, 0, 0, 0, - ]; - case 'yellow': - return [ - 0.5, 0.5, 0, 0, 0.5, 0.5, 0, 0, 0.25, 0.25, 0.5, 0, 0, 0, 0, 1, 0, 0, 0, - 0, - ]; - case 'green': - return [ - 0.5, 0.25, 0, 0, 0, 1, 0, 0, 0, 0.25, 0.5, 0, 0, 0, 0, 1, 0, 0, 0, 0, - ]; - case 'teal': - return [ - 0.25, 0.25, 0.25, 0, 0, 0.5, 0.5, 0, 0, 0.5, 0.5, 0, 0, 0, 0, 1, 0, 0, - 0, 0, - ]; - case 'blue': - return [ - 0.25, 0, 0.25, 0, 0, 0.5, 0.25, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, - ]; - case 'purple': - return [ - 0.5, 0, 0.5, 0, 0.25, 0.5, 0.25, 0, 0.5, 0, 0.5, 0, 0, 0, 0, 1, 0, 0, 0, - 0, - ]; - } -}; - -const displayText = (param) => { - switch (param) { - case 'r': - return 'Red'; - case 'g': - return 'Green'; - case 'b': - return 'Blue'; - } -}; - -export const MODpaint = (props, context) => { - const { act, data } = useBackend(context); - const { mapRef, currentColor } = data; - const [ - [rr, rg, rb, ra], - [gr, gg, gb, ga], - [br, bg, bb, ba], - [ar, ag, ab, aa], - [cr, cg, cb, ca], - ] = currentColor; - const presets = ['red', 'yellow', 'green', 'teal', 'blue', 'purple']; - const prefixes = ['r', 'g', 'b']; - return ( - - - - - {[0, 1, 2].map((row) => ( -
- {[0, 1, 2].map((col) => ( - - - - {`${displayText(prefixes[col])}:`} - - - - `${value}%`} - onDrag={(e, value) => { - let retColor = currentColor; - retColor[row * 4 + col] = value / 100; - act('transition_color', { color: retColor }); - }} - /> - - - ))} -
- ))} -
- -
- - {presets.map((preset) => ( -
-
-
-
- -
- -
-
-
-
-
- ); -}; diff --git a/tgui/packages/tgui/interfaces/MODsuit.js b/tgui/packages/tgui/interfaces/MODsuit.js deleted file mode 100644 index 81e604c579..0000000000 --- a/tgui/packages/tgui/interfaces/MODsuit.js +++ /dev/null @@ -1,766 +0,0 @@ -import { useBackend, useLocalState } from '../backend'; -import { Button, ColorBox, LabeledList, ProgressBar, Section, Collapsible, Box, Icon, Stack, Table, Dimmer, NumberInput, Flex, AnimatedNumber, Dropdown } from '../components'; -import { Window } from '../layouts'; - -const ConfigureNumberEntry = (props, context) => { - const { name, value, module_ref } = props; - const { act } = useBackend(context); - return ( - - act('configure', { - 'key': name, - 'value': value, - 'ref': module_ref, - })} - /> - ); -}; - -const ConfigureBoolEntry = (props, context) => { - const { name, value, module_ref } = props; - const { act } = useBackend(context); - return ( - - act('configure', { - 'key': name, - 'value': !value, - 'ref': module_ref, - })} - /> - ); -}; - -const ConfigureColorEntry = (props, context) => { - const { name, value, module_ref } = props; - const { act } = useBackend(context); - return ( - <> - - - - - - ); -}; - -const displayText = (param) => { - switch (param) { - case 1: - return 'Use'; - case 2: - return 'Toggle'; - case 3: - return 'Select'; - } -}; - -const ParametersSection = (props, context) => { - const { act, data } = useBackend(context); - const { - active, - malfunctioning, - locked, - open, - selected_module, - complexity, - complexity_max, - wearer_name, - wearer_job, - AI, - is_pAI, - is_user_AI, - } = data; - const status = malfunctioning - ? 'Malfunctioning' - : active - ? 'Active' - : 'Inactive'; - return ( -
- - act('activate')} - /> - }> - {status} - - act('lock')} - /> - }> - {locked ? 'Locked' : 'Unlocked'} - - - {open ? 'Open' : 'Closed'} - - - {selected_module || 'None'} - - - {complexity} ({complexity_max}) - - - {wearer_name}, {wearer_job} - - act('remove_pai')} - /> - ) : (<> ) - }> - {AI || 'None'} - - -
- ); -}; - -const HardwareSection = (props, context) => { - const { act, data } = useBackend(context); - const { - active, - control, - helmet, - chestplate, - gauntlets, - boots, - cell, - charge, - } = data; - return ( -
- - - {control} - {helmet || 'None'} - - {chestplate || 'None'} - - - {gauntlets || 'None'} - - {boots || 'None'} - - - - {(cell && ( - - {cell} - - - - - )) || ( - - No Cell Detected - - )} - -
- ); -}; - -const InfoSection = (props, context) => { - const { act, data } = useBackend(context); - const { active, modules } = data; - const info_modules = modules.filter((module) => !!module.id); - - return ( -
- - {(info_modules.length !== 0 - && info_modules.map((module) => { - const Module = ID2MODULE[module.id]; - return ( - - {!active && } - - - ); - })) || No Info Modules Detected} - -
- ); -}; - -const ModuleSection = (props, context) => { - const { act, data } = useBackend(context); - const { complexity_max, modules } = data; - const [configureState, setConfigureState] = useLocalState( - context, - 'module_configuration', - null - ); - return ( -
- - {(modules.length !== 0 - && modules.map((module) => { - return ( - - -
- {configureState === module.ref && ( - setConfigureState(null)} - /> - )} - - - -
- {module.description} -
-
-
- ); - })) || ( - - No Modules Detected - - )} -
-
- ); -}; - -export const MODsuit = (props, context) => { - const { act, data } = useBackend(context); - const { ui_theme, interface_break } = data; - return ( - - - {(!!interface_break && ) || ( - - - - - - - - - - - - - - - )} - - - ); -}; diff --git a/tgui/packages/tgui/interfaces/SuitStorageUnit.js b/tgui/packages/tgui/interfaces/SuitStorageUnit.js index c7ac915153..c6f66a79d2 100644 --- a/tgui/packages/tgui/interfaces/SuitStorageUnit.js +++ b/tgui/packages/tgui/interfaces/SuitStorageUnit.js @@ -14,7 +14,6 @@ export const SuitStorageUnit = (props, context) => { suit, helmet, mask, - mod, storage, } = data; return ( @@ -90,15 +89,6 @@ export const SuitStorageUnit = (props, context) => { item: 'mask', })} /> - -