From 22befe7327f20b98b151e8f420e84ca51868d06b Mon Sep 17 00:00:00 2001 From: ariaworld <143797359+ariaworld@users.noreply.github.com> Date: Sat, 23 Dec 2023 14:59:11 +0100 Subject: [PATCH] Winter QOL --- _maps/map_files/Mining/Lavaland_old.dmm | 31 +- code/_globalvars/lists/maintenance_loot.dm | 4 + .../components/storage/concrete/pockets.dm | 3 +- code/datums/elements/flavor_text.dm | 34 +- code/game/machinery/dance_machine.dm | 2 +- code/game/objects/items/RCD.dm | 1 + code/game/objects/items/crayons.dm | 21 ++ .../items/stacks/sheets/sheet_types.dm | 17 +- code/modules/food_and_drinks/drinks/drinks.dm | 22 +- code/modules/hydroponics/hydroponics.dm | 3 + .../chemistry/reagents/drug_reagents.dm | 2 +- code/modules/research/bepis.dm | 9 + code/modules/research/experimentor.dm | 4 + code/modules/vehicles/cars/clowncar.dm | 16 +- code/modules/vehicles/sealed.dm | 4 +- code/modules/vending/medical.dm | 2 +- .../code/game/objects/items/computermath.dm | 2 +- .../subsystem/processing/quirks.dm | 4 + .../crafting/recipes/recipes_clothing.dm | 14 + .../crafting/recipes/recipes_furniture.dm | 30 ++ .../crafting/recipes/recipes_misc.dm | 12 + .../crafting/recipes/recipes_robot.dm | 1 + modular_splurt/code/datums/traits/negative.dm | 27 +- .../code/datums/traits/trait_actions.dm | 306 +++++++++--------- .../game/objects/effects/spawners/lootdrop.dm | 20 ++ .../code/game/objects/items/crayons.dm | 5 + .../game/objects/items/storage/firstaid.dm | 8 + .../game/objects/items/storage/tailbag.dm | 14 - .../code/game/objects/items/toys.dm | 3 + .../objects/structures/bed_chairs/beds.dm | 7 + .../modules/mob/living/carbon/human/human.dm | 2 +- modular_splurt/code/modules/paperwork/pen.dm | 2 +- .../chemistry/reagents/drug_reagents.dm | 5 + .../reagents/reagent_containers/hypospray.dm | 20 ++ .../reagents/reagent_containers/pill.dm | 6 + .../autolathe_desings/autolathe_designs.dm | 7 + .../research/designs/bluespace_designs.dm | 5 + .../research/designs/medical_designs.dm | 46 +++ .../research/designs/mining_designs.dm | 17 + .../modules/research/designs/misc_designs.dm | 29 ++ .../modules/research/designs/tool_designs.dm | 18 ++ .../research/designs/weapon_designs.dm | 9 + .../research/techweb/nodes/bepis_nodes.dm | 10 + .../research/techweb/nodes/weaponry_nodes.dm | 7 + .../modules/research/xenoarch/artifact.dm | 16 +- .../research/xenoarch/artifact_list.dm | 3 +- .../code/modules/research/xenoarch/tools.dm | 4 +- .../code/modules/surgery/organs/eyes.dm | 60 ++++ .../code/modules/vending/cigarette.dm | 7 + .../code/modules/vending/clothesmate.dm | 3 +- modular_splurt/code/modules/vending/cola.dm | 6 + .../code/modules/vending/kinkmate.dm | 1 + .../code/modules/vending/medical.dm | 9 + modular_splurt/icons/effects/effects.dmi | Bin 14068 -> 14659 bytes tgstation.dme | 9 + tgui/packages/tgui/interfaces/Crayon.js | 12 + 56 files changed, 731 insertions(+), 210 deletions(-) create mode 100644 modular_splurt/code/datums/components/crafting/recipes/recipes_clothing.dm create mode 100644 modular_splurt/code/datums/components/crafting/recipes/recipes_furniture.dm create mode 100644 modular_splurt/code/game/objects/items/crayons.dm create mode 100644 modular_splurt/code/modules/research/designs/autolathe_desings/autolathe_designs.dm create mode 100644 modular_splurt/code/modules/research/designs/mining_designs.dm create mode 100644 modular_splurt/code/modules/research/designs/weapon_designs.dm create mode 100644 modular_splurt/code/modules/research/techweb/nodes/bepis_nodes.dm create mode 100644 modular_splurt/code/modules/research/techweb/nodes/weaponry_nodes.dm create mode 100644 modular_splurt/code/modules/vending/cigarette.dm create mode 100644 modular_splurt/code/modules/vending/cola.dm create mode 100644 modular_splurt/code/modules/vending/medical.dm diff --git a/_maps/map_files/Mining/Lavaland_old.dmm b/_maps/map_files/Mining/Lavaland_old.dmm index 80b887d089..44be911fbb 100644 --- a/_maps/map_files/Mining/Lavaland_old.dmm +++ b/_maps/map_files/Mining/Lavaland_old.dmm @@ -547,9 +547,13 @@ /turf/open/floor/mineral/titanium/purple, /area/space) "bP" = ( -/obj/machinery/mineral/ore_redemption, -/turf/open/floor/mineral/titanium/purple, -/area/space) +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/vending/hydroseeds, +/turf/open/floor/plasteel, +/area/mine/xenoarch) "bQ" = ( /obj/machinery/light/small{ dir = 1 @@ -3672,11 +3676,11 @@ /turf/open/floor/plasteel, /area/mine/xenoarch) "ii" = ( -/obj/machinery/seed_extractor, /obj/effect/turf_decal/tile/green, /obj/effect/turf_decal/tile/purple{ dir = 4 }, +/obj/machinery/vending/hydronutrients, /turf/open/floor/plasteel, /area/mine/xenoarch) "ij" = ( @@ -3849,7 +3853,6 @@ /turf/open/floor/plasteel, /area/mine/xenoarch) "iG" = ( -/obj/machinery/vending/hydronutrients, /obj/effect/turf_decal/tile/green, /obj/effect/turf_decal/tile/purple{ dir = 4 @@ -3858,6 +3861,7 @@ layer = 4; pixel_x = 32 }, +/obj/machinery/seed_extractor, /turf/open/floor/plasteel, /area/mine/xenoarch) "iH" = ( @@ -5842,7 +5846,6 @@ /obj/structure/disposalpipe/segment{ dir = 1 }, -/obj/effect/turf_decal/plaque, /turf/open/floor/plasteel, /area/mine/xenoarch_area_c) "ne" = ( @@ -6657,6 +6660,10 @@ }, /turf/open/floor/plasteel/dark, /area/mine/xenoarch_area_c) +"po" = ( +/obj/machinery/mineral/ore_redemption, +/turf/closed/wall, +/area/mine/xenoarch) "pp" = ( /obj/machinery/vending/cola/random, /turf/open/floor/plasteel/dark, @@ -9383,6 +9390,10 @@ }, /turf/open/floor/plasteel, /area/mine/xenoarch_area_c) +"IT" = ( +/obj/machinery/mineral/equipment_vendor, +/turf/closed/wall, +/area/mine/xenoarch) "JB" = ( /obj/structure/grille, /turf/open/floor/plating, @@ -27238,7 +27249,7 @@ cp cw cp Bi -Bi +po Bi Bi Bi @@ -28266,7 +28277,7 @@ cp cy cp Bi -Bi +IT dQ cY eA @@ -28534,7 +28545,7 @@ gr cX Bi hS -ii +bP iG ii jt @@ -68951,7 +68962,7 @@ bB bv bI bI -bP +bI bI bI bW diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index d02ebb659e..76c832a544 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -116,6 +116,10 @@ GLOBAL_LIST_INIT(maintenance_loot, list( /obj/item/storage/box/marshmallow = 2, /obj/item/clothing/gloves/tackler/offbrand = 1, /obj/item/stack/sticky_tape = 1, + //SPLURT EDIT START + /obj/effect/spawner/lootdrop/alien_glands = 1, + /obj/item/reagent_containers/food/snacks/egg/loaded = 1, + //SPLURT EDIT END "" = 3 )) diff --git a/code/datums/components/storage/concrete/pockets.dm b/code/datums/components/storage/concrete/pockets.dm index 1e3fff8a17..dd0881f2d1 100644 --- a/code/datums/components/storage/concrete/pockets.dm +++ b/code/datums/components/storage/concrete/pockets.dm @@ -26,7 +26,8 @@ . = ..() can_hold = typecacheof(list( /obj/item/reagent_containers/food/snacks/cookie, - /obj/item/reagent_containers/food/snacks/sugarcookie)) + /obj/item/reagent_containers/food/snacks/sugarcookie, + /obj/item/key/collar)) // SPLURT EDIT /datum/component/storage/concrete/pockets/small/collar/locked/Initialize() . = ..() diff --git a/code/datums/elements/flavor_text.dm b/code/datums/elements/flavor_text.dm index dee5d76d2a..fd8cb45e97 100644 --- a/code/datums/elements/flavor_text.dm +++ b/code/datums/elements/flavor_text.dm @@ -155,7 +155,39 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code if(!chosen) return var/datum/element/flavor_text/F = choices[chosen] - F.set_flavor(src) + if(F.flavor_name == "Headshot") + handle_headshot_flavor(F) // Directly handle headshot flavor + else + F.set_flavor(src) // Handle all other flavor texts + +// New proc to handle headshot flavor text specifically (In manage-flavour-texts while in-game) +/mob/proc/handle_headshot_flavor(datum/element/flavor_text/F) + var/old_headshot = F.texts_by_atom[src] + var/new_headshot = input(src, "Input the image link:", "Headshot Image", old_headshot) as text|null + if(isnull(new_headshot)) + return + if(!new_headshot) + F.texts_by_atom[src] = null + to_chat(src, "Your headshot has been cleared.") + return + + // Validate the headshot URL + var/static/link_regex = regex("https://i\\.gyazo\\.com|https://media\\.discordapp\\.net|https://cdn\\.discordapp\\.com|https://media\\.discordapp\\.net$") + var/static/end_regex = regex("\\.jpg|\\.png|\\.jpeg$") + + if(!findtext(new_headshot, link_regex)) + to_chat(src, span_warning("The link needs to be an unshortened Gyazo or Discordapp link!")) + return + if(!findtext(new_headshot, end_regex)) + to_chat(src, span_warning("You need either \".png\", \".jpg\", or \".jpeg\" in the link!")) + return + + // Update the headshot URL if it's different + if(old_headshot != new_headshot) + F.texts_by_atom[src] = new_headshot + to_chat(src, span_notice("Your headshot has been updated.")) + to_chat(src, span_notice("If the photo doesn't show up properly in-game, ensure that it's a direct image link that opens properly in a browser.")) + to_chat(src, span_notice("Keep in mind that the photo will be downsized to 250x250 pixels, so the more square the photo, the better it will look.")) /mob/proc/set_pose() set name = "Set Pose" diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index 956b3e9c79..989f7eaeee 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -21,7 +21,7 @@ name = "radiant dance machine mark IV" desc = "The first three prototypes were discontinued after mass casualty incidents." icon_state = "disco" - req_one_access = list(ACCESS_ENGINE) + // req_one_access = list(ACCESS_ENGINE) SPLURT EDIT anchored = FALSE var/list/spotlights = list() var/list/sparkles = list() diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index 8896170bd3..b182c9f227 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -840,6 +840,7 @@ RLD desc = "A device used to rapidly provide lighting sources to an area. Reload with metal, plasteel, glass or compressed matter cartridges." matter = 100 max_matter = 100 + w_class = WEIGHT_CLASS_SMALL /obj/item/rcd_upgrade name = "RCD advanced design disk" diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 08770eeadb..211b555ac1 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -62,6 +62,13 @@ // If the user can toggle the colour, a la vanilla spraycan var/can_change_colour = FALSE + //SPLURT EDIT START + + var/can_change_light_color = FALSE // If item can change light color of target item + var/toggle_change_light_color = FALSE // Toggled by user on item that CAN change light color + + //SPLURT EDIT END + var/has_cap = FALSE var/is_capped = FALSE @@ -237,6 +244,9 @@ .["min_offset"] = -world.icon_size/2 .["max_offset"] = world.icon_size/2 + .["can_change_light_color"] = can_change_light_color //SPLURT EDIT + .["toggle_change_light_color"] = toggle_change_light_color //SPLURT EDIT + /obj/item/toy/crayon/ui_act(action, list/params) if(..()) return @@ -258,6 +268,11 @@ paint_mode = PAINT_NORMAL if("select_colour") . = can_change_colour && select_colour(usr) + //SPLURT EDIT START + if("toggle_change_light_color") + toggle_change_light_color = !toggle_change_light_color + . = TRUE + //SPLURT EDIT END if("enter_text") var/txt = stripped_input(usr,"Choose what to write.", "Scribbles",default = text_buffer) @@ -293,6 +308,12 @@ . = ..() if(!proximity || !check_allowed_items(target)) return + //SPLURT EDIT START + if(toggle_change_light_color && !istype(target, /turf)) //Avoid changing turf light colors + target.set_light_color(paint_color) + target.update_light() + to_chat(user,"You have successfully changed the innate light color of [target].") + //SPLURT EDIT END draw_on(target, user, proximity, params) /obj/item/toy/crayon/proc/draw_on(atom/target, mob/user, proximity, params) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 81c40ec910..f7fe70c5cd 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -23,8 +23,14 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ new/datum/stack_recipe("stool", /obj/structure/chair/stool, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("bar stool", /obj/structure/chair/stool/bar, one_per_turf = TRUE, on_floor = TRUE), \ - new/datum/stack_recipe("bed", /obj/structure/bed, 2, one_per_turf = TRUE, on_floor = TRUE), \ - new/datum/stack_recipe("double bed", /obj/structure/bed/double, 4, one_per_turf = TRUE, on_floor = TRUE), \ + //SPLURT CHANGE: Add beds list and pod beds + new/datum/stack_recipe_list("beds", list( \ + new/datum/stack_recipe("bed", /obj/structure/bed, 2, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("double bed", /obj/structure/bed/double, 4, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("pod bed", /obj/structure/bed/pod, 2, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("double pod bed", /obj/structure/bed/double/pod, 4, one_per_turf = TRUE, on_floor = TRUE), \ + )), \ + //SPLURT CHANGE END //CIT CHANGE - adds sofas to metal recipe list new/datum/stack_recipe_list("sofas", list( \ new /datum/stack_recipe("sofa (middle)", /obj/structure/chair/sofa, one_per_turf = TRUE, on_floor = TRUE), \ @@ -387,6 +393,13 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ new/datum/stack_recipe("loincloth", /obj/item/clothing/under/costume/loincloth/cloth/sensor, 2), \ new/datum/stack_recipe("sensorless loincloth", /obj/item/clothing/under/costume/loincloth/cloth, 2), \ new/datum/stack_recipe("tunic", /obj/item/clothing/under/tunic, 3), \ + //SPLURT CHANGE: ADD MATTRESSES + new/datum/stack_recipe_list("matresses", list( \ + new/datum/stack_recipe("mattress (random)", /obj/structure/bed/matress, 2, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("mattress (clean)", /obj/structure/bed/matress/clean, 2, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("mattress (clean, pillowed)", /obj/structure/bed/matress/clean_pillowed, 2, one_per_turf = TRUE, on_floor = TRUE), \ + )), \ + //SPLURT CHANGE END null, \ new/datum/stack_recipe("backpack", /obj/item/storage/backpack, 4), \ new/datum/stack_recipe("duffel bag", /obj/item/storage/backpack/duffelbag, 6), \ diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index f4185ccf77..d925fe319f 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -15,6 +15,7 @@ volume = 50 resistance_flags = NONE var/isGlass = TRUE //Whether the 'bottle' is made of glass or not so that milk cartons dont shatter when someone gets hit by it + var/beingChugged = FALSE //We don't want people downing 100u super fast with drinking glasses /obj/item/reagent_containers/food/drinks/on_reagent_change(changetype) gulp_size = max(round(reagents.total_volume / 5), 5) @@ -31,8 +32,23 @@ to_chat(user, "[src]'s lid hasn't been opened!") return 0 + var/gulp_amount = gulp_size if(M == user) - user.visible_message("[user] swallows a gulp of [src].", "You swallow a gulp of [src].") + if(user.zone_selected == BODY_ZONE_PRECISE_MOUTH && !beingChugged) + beingChugged = TRUE + user.visible_message("[user] starts chugging [src].", \ + "You start chugging [src].") + if(!do_mob(user, M)) + return + if(!reagents || !reagents.total_volume) + return + gulp_amount = 50 + user.visible_message("[user] chugs [src].", \ + "You chug [src].") + beingChugged = FALSE + else + user.visible_message("[user] swallows a gulp of [src].", \ + "You swallow a gulp of [src].") else M.visible_message("[user] attempts to feed the contents of [src] to [M].", "[user] attempts to feed the contents of [src] to [M].") if(!do_mob(user, M)) @@ -42,10 +58,10 @@ M.visible_message("[user] feeds the contents of [src] to [M].", "[user] feeds the contents of [src] to [M].") log_combat(user, M, "fed", reagents.log_list()) - var/fraction = min(gulp_size/reagents.total_volume, 1) + var/fraction = min(gulp_amount/reagents.total_volume, 1) checkLiked(fraction, M) reagents.reaction(M, INGEST, fraction) - reagents.trans_to(M, gulp_size, log = TRUE) + reagents.trans_to(M, gulp_amount, log = TRUE) playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) return 1 diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 3933ab83a3..44847c17eb 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -502,6 +502,9 @@ // Beakers, bottles, buckets, etc. if(reagent_source.is_drainable()) playsound(loc, 'sound/effects/slosh.ogg', 25, TRUE) + var/image/splash_animation = image('modular_splurt/icons/effects/effects.dmi', src, "splash_hydroponics") + splash_animation.color = mix_color_from_reagents(reagent_source.reagents.reagent_list) + flick_overlay(splash_animation, GLOB.clients, 1.1 SECONDS) if(visi_msg) visible_message("[visi_msg].") diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index d2b200ab73..2af2948479 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -629,7 +629,7 @@ if(M && M.client?.prefs.arousable && !(M.client?.prefs.cit_toggles & NO_APHRO) && prob(33)) if(prob(5) && ishuman(M) && M.has_dna() && (M.client?.prefs.cit_toggles & BIMBOFICATION)) if(!HAS_TRAIT(M,TRAIT_PERMABONER)) - to_chat(M, span_userlove("Your libido is going haywire!")) + to_chat(M, span_userlove("Your libido is going haywire! You have either been turned into a bimbo or made perma-horny by hexacrocin!")) M.log_message("Made perma-horny by hexacrocin.",LOG_EMOTE) ADD_TRAIT(M,TRAIT_PERMABONER,APHRO_TRAIT) ..() diff --git a/code/modules/research/bepis.dm b/code/modules/research/bepis.dm index 93df1e2351..971ff7fc30 100644 --- a/code/modules/research/bepis.dm +++ b/code/modules/research/bepis.dm @@ -39,6 +39,15 @@ /obj/item/pen/survival, /obj/item/circuitboard/machine/sleeper/party, /obj/item/toy/sprayoncan, + //SPLURT EDIT START + /obj/item/multitool/advanced, + /obj/item/crowbar/advanced, + /obj/item/wirecutters/advanced, + /obj/item/wrench/advanced, + /obj/item/weldingtool/advanced, + /obj/effect/spawner/lootdrop/alien_glands/single, + /obj/effect/spawner/lootdrop/maintenance + //SPLURT EDIT END ) var/static/list/item_list = list() diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index ba0b17c113..f23841a02f 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -143,6 +143,7 @@ output += str output += boosted + res dat += output + dat += "Recalibrate Algorithm" else dat += "Nothing loaded." dat += "Refresh" @@ -169,6 +170,9 @@ linked_console = D else if(scantype == "eject") ejectItem() + else if(scantype == "recalibrate") //SPLURT EDIT - RECALIBRATE SCAN TYPES + SetTypeReactions() + to_chat(usr, "[src] has been recalibrated and new possible scan type algorithms have been selected.") else if(scantype == "refresh") updateUsrDialog() else diff --git a/code/modules/vehicles/cars/clowncar.dm b/code/modules/vehicles/cars/clowncar.dm index 9660a16f90..e3af269a23 100644 --- a/code/modules/vehicles/cars/clowncar.dm +++ b/code/modules/vehicles/cars/clowncar.dm @@ -46,6 +46,20 @@ /obj/vehicle/sealed/car/clowncar/mob_forced_enter(mob/M, silent = FALSE) . = ..() playsound(src, pick('sound/vehicles/clowncar_load1.ogg', 'sound/vehicles/clowncar_load2.ogg'), 75) + if(iscarbon(M)) + var/mob/living/carbon/forced_mob = M + if(forced_mob.reagents.has_reagent(/datum/reagent/consumable/ethanol/irishcarbomb)) + var/reagent_amount = forced_mob.reagents.get_reagent_amount(/datum/reagent/consumable/ethanol/irishcarbomb) + forced_mob.reagents.del_reagent(/datum/reagent/consumable/ethanol/irishcarbomb) + if(reagent_amount >= 30) + message_admins("[ADMIN_LOOKUPFLW(forced_mob)] was taken into a clown car with [reagent_amount] unit(s) of Irish Car Bomb, causing an ejection.") + forced_mob.log_message("was taken into a clown car with [reagent_amount] unit(s) of Irish Car Bomb, causing an ejection.", LOG_GAME) + audible_message(span_userdanger("You hear a rattling sound coming from the engine. That can't be good..."), null, 1) + addtimer(CALLBACK(src, .proc/irish_car_bomb), 5 SECONDS) + +/obj/vehicle/sealed/car/clowncar/proc/irish_car_bomb() + dump_mobs() + explosion(src, light_impact_range = 1) //Harmless explosion, only screen shake /obj/vehicle/sealed/car/clowncar/after_add_occupant(mob/M, control_flags) . = ..() @@ -95,7 +109,7 @@ visible_message(span_warning("[src] rams into [bumped] and crashes!")) playsound(src, pick('sound/vehicles/clowncar_crash1.ogg', 'sound/vehicles/clowncar_crash2.ogg'), 75) playsound(src, 'sound/vehicles/clowncar_crashpins.ogg', 75) - DumpMobs(TRUE) + dump_mobs(TRUE) log_combat(src, bumped, "crashed into", null, "dumping all passengers") /obj/vehicle/sealed/car/clowncar/emag_act(mob/user) diff --git a/code/modules/vehicles/sealed.dm b/code/modules/vehicles/sealed.dm index 7c1fa8f61a..b5023f9729 100644 --- a/code/modules/vehicles/sealed.dm +++ b/code/modules/vehicles/sealed.dm @@ -88,10 +88,10 @@ inserted_key = null /obj/vehicle/sealed/Destroy() - DumpMobs() + dump_mobs() return ..() -/obj/vehicle/sealed/proc/DumpMobs(randomstep = TRUE) +/obj/vehicle/sealed/proc/dump_mobs(randomstep = TRUE) for(var/i in occupants) mob_exit(i, null, randomstep) if(iscarbon(i)) diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm index 0158547515..7986b72abb 100644 --- a/code/modules/vending/medical.dm +++ b/code/modules/vending/medical.dm @@ -42,7 +42,7 @@ /obj/item/reagent_containers/pill/charcoal = 6) premium = list(/obj/item/reagent_containers/medspray/synthflesh = 2, /obj/item/storage/box/hug/medical = 1, - /obj/item/storage/pill_bottle/psicodine = 2, + /obj/item/storage/pill_bottle/psicodine = 3, // SPLURT EDIT 2 -> 3 /obj/item/reagent_containers/hypospray/medipen = 3, /obj/item/storage/belt/medical = 3, /obj/item/wrench/medical = 1, diff --git a/modular_sand/code/game/objects/items/computermath.dm b/modular_sand/code/game/objects/items/computermath.dm index 2188f05ff9..c51ca06147 100644 --- a/modular_sand/code/game/objects/items/computermath.dm +++ b/modular_sand/code/game/objects/items/computermath.dm @@ -300,7 +300,7 @@ ..() /obj/item/computermath/cargo/consume_charges() - if(SSresearch.problem_computer_charges > 0) + if(SSshuttle.problem_computer_charges > 0) //SPLURT EDIT SSresearch > SSshuttle SSshuttle.problem_computer_charges -= 1 return TRUE ..() diff --git a/modular_splurt/code/controllers/subsystem/processing/quirks.dm b/modular_splurt/code/controllers/subsystem/processing/quirks.dm index 2de7d7ff75..457bffea73 100644 --- a/modular_splurt/code/controllers/subsystem/processing/quirks.dm +++ b/modular_splurt/code/controllers/subsystem/processing/quirks.dm @@ -13,4 +13,8 @@ // BLOCKED: Thematic, mechanic, game lore. // Bloodsuckers cannot interact with Hallowed users. list("Hallowed","Bloodsucker Fledgling"), + + // BLOCKED: Mechanic + // Bloodsuckers have NO_THIRST trait. + list("Thirsty","Bloodsucker Fledgling"), )) diff --git a/modular_splurt/code/datums/components/crafting/recipes/recipes_clothing.dm b/modular_splurt/code/datums/components/crafting/recipes/recipes_clothing.dm new file mode 100644 index 0000000000..612975c5f4 --- /dev/null +++ b/modular_splurt/code/datums/components/crafting/recipes/recipes_clothing.dm @@ -0,0 +1,14 @@ +/datum/crafting_recipe/tailbag + name = "Tailbag" + result = /obj/item/storage/tailbag + reqs = list(/obj/item/stack/sheet/leather = 2) + time = 30 + category = CAT_CLOTHING + +/datum/crafting_recipe/tailbag_xl + name = "XL Tailbag" + result = /obj/item/storage/tailbag/xtralg + reqs = list(/obj/item/storage/tailbag = 1, + /obj/item/stack/sheet/leather = 2) + time = 30 + category = CAT_CLOTHING diff --git a/modular_splurt/code/datums/components/crafting/recipes/recipes_furniture.dm b/modular_splurt/code/datums/components/crafting/recipes/recipes_furniture.dm new file mode 100644 index 0000000000..e7c0b1987c --- /dev/null +++ b/modular_splurt/code/datums/components/crafting/recipes/recipes_furniture.dm @@ -0,0 +1,30 @@ +// GYM FURNITURE +/datum/crafting_recipe/stacklifter + name = "Chest Press Machine" + result = /obj/structure/weightmachine/stacklifter + time = 200 + reqs = list(/obj/item/stack/sheet/metal = 20, + /obj/item/stack/sheet/cloth = 5) + tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER) + subcategory = CAT_FURNITURE + category = CAT_MISCELLANEOUS + +/datum/crafting_recipe/weightlifter + name = "Inline Bench Press" + result = /obj/structure/weightmachine/weightlifter + time = 200 + reqs = list(/obj/item/stack/sheet/metal = 20, + /obj/item/stack/sheet/cloth = 5) + tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER) + subcategory = CAT_FURNITURE + category = CAT_MISCELLANEOUS + +/datum/crafting_recipe/punching_bag + name = "Punching Bag" + result = /obj/structure/punching_bag + time = 200 + reqs = list(/obj/item/stack/sheet/metal = 10, + /obj/item/stack/sheet/cloth = 15) + tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER) + subcategory = CAT_FURNITURE + category = CAT_MISCELLANEOUS diff --git a/modular_splurt/code/datums/components/crafting/recipes/recipes_misc.dm b/modular_splurt/code/datums/components/crafting/recipes/recipes_misc.dm index 4df2734ff3..8bbe5541fb 100644 --- a/modular_splurt/code/datums/components/crafting/recipes/recipes_misc.dm +++ b/modular_splurt/code/datums/components/crafting/recipes/recipes_misc.dm @@ -269,3 +269,15 @@ subcategory = CAT_MISCELLANEOUS category = CAT_MISCELLANEOUS result = /obj/item/cushion/silk + +// TOOLS +/datum/crafting_recipe/igniter + name = "Igniter" + result = /obj/item/assembly/igniter + reqs = list(/obj/item/stack/sheet/metal = 1, + /obj/item/stack/rods = 1 + ) + tools = list(TOOL_SCREWDRIVER) + time = 30 + subcategory = CAT_TOOL + category = CAT_MISCELLANEOUS diff --git a/modular_splurt/code/datums/components/crafting/recipes/recipes_robot.dm b/modular_splurt/code/datums/components/crafting/recipes/recipes_robot.dm index b84cbd31e3..6a22929ce3 100644 --- a/modular_splurt/code/datums/components/crafting/recipes/recipes_robot.dm +++ b/modular_splurt/code/datums/components/crafting/recipes/recipes_robot.dm @@ -8,3 +8,4 @@ /obj/item/bodypart/r_arm/robot = 1, /obj/item/clothing/head/kitty = 1 ) + category = CAT_ROBOT \ No newline at end of file diff --git a/modular_splurt/code/datums/traits/negative.dm b/modular_splurt/code/datums/traits/negative.dm index fa17eafa1a..e9b6f63e3a 100644 --- a/modular_splurt/code/datums/traits/negative.dm +++ b/modular_splurt/code/datums/traits/negative.dm @@ -203,22 +203,39 @@ // Small issue with this. If the quirk holder has NO_HUNGER or NO_THIRST, this trait can still be taken and they will still get the benefits of it. // It's unlikely that someone will be both, especially at round start, but vampirism makes me wary of having these separate. /datum/quirk/hungry - name = "Hungry And Thirsty" - desc = "You find yourself unusually hungry and thirsty. Gotta eat and drink twice as much as normal." + name = "Hungry" + desc = "You find yourself unusually hungry. Gotta eat twice as much as normal." value = -1 - gain_text = span_danger("You're starting to feel hungrier and thirstier a lot faster.") - lose_text = span_notice("Your craving for food and water begins dying down.") + gain_text = span_danger("You're starting to feel hungrier a lot faster.") + lose_text = span_notice("Your elevated craving for food begins dying down.") medical_record_text = "Patient reports eating twice as many meals per day than usual for their species." /datum/quirk/hungry/add() var/mob/living/carbon/human/H = quirk_holder var/datum/physiology/P = H.physiology P.hunger_mod *= 2 - P.thirst_mod *= 2 /datum/quirk/hungry/remove() var/mob/living/carbon/human/H = quirk_holder if(H) var/datum/physiology/P = H.physiology P.hunger_mod /= 2 + +/datum/quirk/thirsty + name = "Thirsty" + desc = "You find yourself unusually thirsty. Gotta drink twice as much as normal." + value = -1 + gain_text = span_danger("You're starting to feel thirstier a lot faster.") + lose_text = span_notice("Your elevated craving for water begins dying down.") + medical_record_text = "Patient reports drinking twice as many liquids per day than usual for their species." + +/datum/quirk/thirsty/add() + var/mob/living/carbon/human/H = quirk_holder + var/datum/physiology/P = H.physiology + P.thirst_mod *= 2 + +/datum/quirk/thirsty/remove() + var/mob/living/carbon/human/H = quirk_holder + if(H) + var/datum/physiology/P = H.physiology P.thirst_mod /= 2 diff --git a/modular_splurt/code/datums/traits/trait_actions.dm b/modular_splurt/code/datums/traits/trait_actions.dm index 63ea04fbd2..9d63c21793 100644 --- a/modular_splurt/code/datums/traits/trait_actions.dm +++ b/modular_splurt/code/datums/traits/trait_actions.dm @@ -828,207 +828,207 @@ // Return return + else + // Variable for species with non-blood blood volumes + var/blood_valid = TRUE - // Variable for species with non-blood blood volumes - var/blood_valid = TRUE + // Variable for gaining blood volume + var/blood_transfer = FALSE - // Variable for gaining blood volume - var/blood_transfer = FALSE + // Name of blood volume to be taken + // Action owner assumes blood until after drinking + var/blood_name = "blood" - // Name of blood volume to be taken - // Action owner assumes blood until after drinking - var/blood_name = "blood" + // Check if target has exotic blood + if(bite_target.dna?.species?.exotic_bloodtype) + // Define blood types for owner and target + var/blood_type_owner = action_owner.dna?.species?.exotic_bloodtype + var/blood_type_target = bite_target.dna?.species?.exotic_bloodtype - // Check if target has exotic blood - if(bite_target.dna?.species?.exotic_bloodtype) - // Define blood types for owner and target - var/blood_type_owner = action_owner.dna?.species?.exotic_bloodtype - var/blood_type_target = bite_target.dna?.species?.exotic_bloodtype + // Define if blood types match + var/blood_type_match = (blood_type_owner == blood_type_target ? TRUE : FALSE) - // Define if blood types match - var/blood_type_match = (blood_type_owner == blood_type_target ? TRUE : FALSE) + // Check if types matched + if(blood_type_match) + // Add positive mood + SEND_SIGNAL(action_owner, COMSIG_ADD_MOOD_EVENT, "bloodfledge_drank_exotic_match", /datum/mood_event/drank_exotic_matched) - // Check if types matched - if(blood_type_match) - // Add positive mood - SEND_SIGNAL(action_owner, COMSIG_ADD_MOOD_EVENT, "bloodfledge_drank_exotic_match", /datum/mood_event/drank_exotic_matched) + // Switch for target's blood type + switch(blood_type_target) + // Synth blood + if("S") + // Mark blood as invalid + blood_valid = FALSE - // Switch for target's blood type - switch(blood_type_target) - // Synth blood - if("S") - // Mark blood as invalid - blood_valid = FALSE + // Set blood type name + blood_name = "coolant" - // Set blood type name - blood_name = "coolant" + // Check if blood types match + if(blood_type_match) + // Allow transferring blood from this + blood_transfer = TRUE + + // Blood types do not match + else + // Warn the user + to_chat(action_owner, span_warning("That didn't taste like blood at all...")) + + // Add disgust + action_owner.adjust_disgust(2) + + // Cause negative mood + SEND_SIGNAL(action_owner, COMSIG_ADD_MOOD_EVENT, "bloodfledge_drank_synth", /datum/mood_event/drankblood_synth) + + // Slime blood + if("GEL") + // Mark blood as invalid + blood_valid = FALSE - // Check if blood types match - if(blood_type_match) // Allow transferring blood from this blood_transfer = TRUE - // Blood types do not match - else - // Warn the user - to_chat(action_owner, span_warning("That didn't taste like blood at all...")) + // Set blood type name + blood_name = "slime" - // Add disgust - action_owner.adjust_disgust(2) + // Check if blood types match + if(!blood_type_match) + // Cause negative mood + SEND_SIGNAL(action_owner, COMSIG_ADD_MOOD_EVENT, "bloodfledge_drank_slime", /datum/mood_event/drankblood_slime) - // Cause negative mood - SEND_SIGNAL(action_owner, COMSIG_ADD_MOOD_EVENT, "bloodfledge_drank_synth", /datum/mood_event/drankblood_synth) + // Bug blood + if("BUG") + // Set blood type name + blood_name = "hemolymph" - // Slime blood - if("GEL") - // Mark blood as invalid - blood_valid = FALSE + // Check if blood types match + if(!blood_type_match) + // Mark blood as invalid + blood_valid = FALSE - // Allow transferring blood from this - blood_transfer = TRUE + // Cause negative mood + SEND_SIGNAL(action_owner, COMSIG_ADD_MOOD_EVENT, "bloodfledge_drank_insect", /datum/mood_event/drankblood_insect) - // Set blood type name - blood_name = "slime" + // Xenomorph blood + if("X*") + // Set blood type name + blood_name = "xeno blood" - // Check if blood types match - if(!blood_type_match) - // Cause negative mood - SEND_SIGNAL(action_owner, COMSIG_ADD_MOOD_EVENT, "bloodfledge_drank_slime", /datum/mood_event/drankblood_slime) + // Check if blood types match + if(!blood_type_match) + // Mark blood as invalid + blood_valid = FALSE - // Bug blood - if("BUG") - // Set blood type name - blood_name = "hemolymph" + // Cause negative mood + SEND_SIGNAL(action_owner, COMSIG_ADD_MOOD_EVENT, "bloodfledge_drank_xeno", /datum/mood_event/drankblood_xeno) - // Check if blood types match - if(!blood_type_match) - // Mark blood as invalid - blood_valid = FALSE + // Lizard blood + if("L") + // Set blood type name + blood_name = "reptilian blood" - // Cause negative mood - SEND_SIGNAL(action_owner, COMSIG_ADD_MOOD_EVENT, "bloodfledge_drank_insect", /datum/mood_event/drankblood_insect) + // End of exotic blood checks - // Xenomorph blood - if("X*") - // Set blood type name - blood_name = "xeno blood" + // Define user's remaining capacity to absorb blood + var/blood_volume_difference = BLOOD_VOLUME_MAXIMUM - action_owner.blood_volume + var/drained_blood = min(target_blood_volume, BLOODFLEDGE_DRAIN_NUM, blood_volume_difference) - // Check if blood types match - if(!blood_type_match) - // Mark blood as invalid - blood_valid = FALSE + // Transfer reagents from target to action owner + // Limited to a maximum 10% of bite amount (default 10u) + bite_target.reagents.trans_to(action_owner, (drained_blood*0.1)) - // Cause negative mood - SEND_SIGNAL(action_owner, COMSIG_ADD_MOOD_EVENT, "bloodfledge_drank_xeno", /datum/mood_event/drankblood_xeno) + // Alert the bite target and local user of success + // Yes, this is AFTER the message for non-valid blood + to_chat(bite_target, span_danger("[action_owner] has taken some of your [blood_name]!")) + to_chat(action_owner, span_notice("You've drained some of [bite_target]'s [blood_name]!")) - // Lizard blood - if("L") - // Set blood type name - blood_name = "reptilian blood" + // Check if action owner received valid (nourishing) blood + if(blood_valid) + // Add blood reagent to reagent holder + blood_bank.add_reagent(/datum/reagent/blood/, drained_blood, bite_target.get_blood_data()) - // End of exotic blood checks + // Set reaction type to INGEST + blood_bank.reaction(action_owner, INGEST) - // Define user's remaining capacity to absorb blood - var/blood_volume_difference = BLOOD_VOLUME_MAXIMUM - action_owner.blood_volume - var/drained_blood = min(target_blood_volume, BLOODFLEDGE_DRAIN_NUM, blood_volume_difference) + // Transfer reagent to action owner + blood_bank.trans_to(action_owner, drained_blood) - // Transfer reagents from target to action owner - // Limited to a maximum 10% of bite amount (default 10u) - bite_target.reagents.trans_to(action_owner, (drained_blood*0.1)) + // Remove all reagents + blood_bank.remove_all() - // Alert the bite target and local user of success - // Yes, this is AFTER the message for non-valid blood - to_chat(bite_target, span_danger("[action_owner] has taken some of your [blood_name]!")) - to_chat(action_owner, span_notice("You've drained some of [bite_target]'s [blood_name]!")) + // Check if blood transfer should occur + else if(blood_transfer) + // Check if action holder's blood volume limit was exceeded + if(action_owner.blood_volume >= BLOOD_VOLUME_MAXIMUM) + // Warn user + to_chat(action_owner, span_warning("You body cannot integrate any more [blood_name]. The remainder will be lost.")) - // Check if action owner received valid (nourishing) blood - if(blood_valid) - // Add blood reagent to reagent holder - blood_bank.add_reagent(/datum/reagent/blood/, drained_blood, bite_target.get_blood_data()) + // Blood volume limit was not exceeded + else + // Alert user + to_chat(action_owner, span_notice("You body integrates the [blood_name] directly, instead of processing it into nutrition.")) - // Set reaction type to INGEST - blood_bank.reaction(action_owner, INGEST) + // Transfer blood directly + bite_target.transfer_blood_to(action_owner, drained_blood, TRUE) - // Transfer reagent to action owner - blood_bank.trans_to(action_owner, drained_blood) + // Set drain amount to none + // This prevents double removal + drained_blood = 0 - // Remove all reagents - blood_bank.remove_all() - - // Check if blood transfer should occur - else if(blood_transfer) - // Check if action holder's blood volume limit was exceeded - if(action_owner.blood_volume >= BLOOD_VOLUME_MAXIMUM) - // Warn user - to_chat(action_owner, span_warning("You body cannot integrate any more [blood_name]. The remainder will be lost.")) - - // Blood volume limit was not exceeded + // Valid blood was not received + // No direct blood transfer occurred else - // Alert user - to_chat(action_owner, span_notice("You body integrates the [blood_name] directly, instead of processing it into nutrition.")) + // Warn user of failure + to_chat(action_owner, span_warning("Your body cannot process the [blood_name] into nourishment!")) - // Transfer blood directly - bite_target.transfer_blood_to(action_owner, drained_blood, TRUE) + // Remove blood from bite target + bite_target.blood_volume = clamp(target_blood_volume - drained_blood, 0, BLOOD_VOLUME_MAXIMUM) - // Set drain amount to none - // This prevents double removal - drained_blood = 0 + // Play a heartbeat sound effect + // This was changed to match bloodsucker + playsound(action_owner, 'sound/effects/singlebeat.ogg', 30, 1, -2) - // Valid blood was not received - // No direct blood transfer occurred - else - // Warn user of failure - to_chat(action_owner, span_warning("Your body cannot process the [blood_name] into nourishment!")) + // Log the biting action success + log_combat(action_owner,bite_target,"bloodfledge bitten (successfully), transferring [blood_name]") - // Remove blood from bite target - bite_target.blood_volume = clamp(target_blood_volume - drained_blood, 0, BLOOD_VOLUME_MAXIMUM) + // Mood events + // Check if bite target is dead or undead + if((bite_target.stat >= DEAD) || (bite_target.mob_biotypes & MOB_UNDEAD)) + // Warn the user + to_chat(action_owner, span_warning("The rotten [blood_name] tasted foul.")) - // Play a heartbeat sound effect - // This was changed to match bloodsucker - playsound(action_owner, 'sound/effects/singlebeat.ogg', 30, 1, -2) + // Add disgust + action_owner.adjust_disgust(2) - // Log the biting action success - log_combat(action_owner,bite_target,"bloodfledge bitten (successfully), transferring [blood_name]") + // Cause negative mood + SEND_SIGNAL(action_owner, COMSIG_ADD_MOOD_EVENT, "bloodfledge_drank_dead", /datum/mood_event/drankblood_dead) - // Mood events - // Check if bite target is dead or undead - if((bite_target.stat >= DEAD) || (bite_target.mob_biotypes & MOB_UNDEAD)) - // Warn the user - to_chat(action_owner, span_warning("The rotten [blood_name] tasted foul.")) + // Check if bite target's blood has been depleted + if(!bite_target.blood_volume) + // Warn the user + to_chat(action_owner, span_warning("You've depleted [bite_target]'s [blood_name] supply!")) - // Add disgust - action_owner.adjust_disgust(2) + // Cause negative mood + SEND_SIGNAL(action_owner, COMSIG_ADD_MOOD_EVENT, "bloodfledge_drank_killed", /datum/mood_event/drankkilled) - // Cause negative mood - SEND_SIGNAL(action_owner, COMSIG_ADD_MOOD_EVENT, "bloodfledge_drank_dead", /datum/mood_event/drankblood_dead) + // Check if bite target has cursed blood + if(HAS_TRAIT(bite_target, TRAIT_CURSED_BLOOD)) + // Check action owner for cursed blood + var/owner_cursed = HAS_TRAIT(action_owner, TRAIT_CURSED_BLOOD) - // Check if bite target's blood has been depleted - if(!bite_target.blood_volume) - // Warn the user - to_chat(action_owner, span_warning("You've depleted [bite_target]'s [blood_name] supply!")) + // Set chat message based on action owner's trait status + var/warn_message = (owner_cursed ? "You taste the unholy touch of a familiar curse in [bite_target]\'s blood." : "You experience a sensation of intense dread just after drinking from [bite_target]. Something about their blood feels... wrong.") - // Cause negative mood - SEND_SIGNAL(action_owner, COMSIG_ADD_MOOD_EVENT, "bloodfledge_drank_killed", /datum/mood_event/drankkilled) + // Alert user in chat + to_chat(action_owner, span_notice(warn_message)) - // Check if bite target has cursed blood - if(HAS_TRAIT(bite_target, TRAIT_CURSED_BLOOD)) - // Check action owner for cursed blood - var/owner_cursed = HAS_TRAIT(action_owner, TRAIT_CURSED_BLOOD) + // Set mood type based on curse status + var/mood_type = (owner_cursed ? /datum/mood_event/drank_cursed_good : /datum/mood_event/drank_cursed_bad) - // Set chat message based on action owner's trait status - var/warn_message = (owner_cursed ? "You taste the unholy touch of a familiar curse in [bite_target]\'s blood." : "You experience a sensation of intense dread just after drinking from [bite_target]. Something about their blood feels... wrong.") + // Cause mood event + SEND_SIGNAL(action_owner, COMSIG_ADD_MOOD_EVENT, "bloodfledge_drank_cursed_blood", mood_type) - // Alert user in chat - to_chat(action_owner, span_notice(warn_message)) - - // Set mood type based on curse status - var/mood_type = (owner_cursed ? /datum/mood_event/drank_cursed_good : /datum/mood_event/drank_cursed_bad) - - // Cause mood event - SEND_SIGNAL(action_owner, COMSIG_ADD_MOOD_EVENT, "bloodfledge_drank_cursed_blood", mood_type) - - // Start cooldown - StartCooldown() + // Start cooldown + StartCooldown() // Action: Revive /datum/action/cooldown/bloodfledge/revive diff --git a/modular_splurt/code/game/objects/effects/spawners/lootdrop.dm b/modular_splurt/code/game/objects/effects/spawners/lootdrop.dm index 6faaf2c936..ddc33607bc 100644 --- a/modular_splurt/code/game/objects/effects/spawners/lootdrop.dm +++ b/modular_splurt/code/game/objects/effects/spawners/lootdrop.dm @@ -6,3 +6,23 @@ /obj/item/aiModule/core/full/milker, /obj/item/aiModule/core/full/vore_pred ) + +/obj/effect/spawner/lootdrop/alien_glands + name = "alien gland spawner" + icon_state = "gland" + lootcount = 5 + loot = list( + /obj/item/organ/heart/gland/electric = 10, + /obj/item/organ/heart/gland/trauma = 10, + /obj/item/organ/heart/gland/egg = 10, + /obj/item/organ/heart/gland/chem = 10, + /obj/item/organ/heart/gland/mindshock = 10, + /obj/item/organ/heart/gland/plasma = 10, + /obj/item/organ/heart/gland/transform = 10, + /obj/item/organ/heart/gland/slime = 10, + /obj/item/organ/heart/gland/spiderman = 10, + /obj/item/organ/heart/gland/ventcrawling = 10, + ) + +/obj/effect/spawner/lootdrop/alien_glands/single + lootcount = 1 \ No newline at end of file diff --git a/modular_splurt/code/game/objects/items/crayons.dm b/modular_splurt/code/game/objects/items/crayons.dm new file mode 100644 index 0000000000..f5f239dc69 --- /dev/null +++ b/modular_splurt/code/game/objects/items/crayons.dm @@ -0,0 +1,5 @@ +/obj/item/toy/crayon/spraycan/bluespace + name = "bluespace spray can" + desc = "A spray can infused with bluespace technology that can change the color of the sprayed object's innate light." + can_change_light_color = TRUE // Enable the ability to change light color + charges = 100 diff --git a/modular_splurt/code/game/objects/items/storage/firstaid.dm b/modular_splurt/code/game/objects/items/storage/firstaid.dm index 0f36694a66..a430b57ba6 100644 --- a/modular_splurt/code/game/objects/items/storage/firstaid.dm +++ b/modular_splurt/code/game/objects/items/storage/firstaid.dm @@ -71,6 +71,14 @@ for(var/i in 1 to 10) new /obj/item/reagent_containers/pill/breast_buzzer(src) +/obj/item/storage/pill_bottle/vaginal_vigour + name = "vaginal vigour pill bottle" + desc = "Increase the pleasure!" + +/obj/item/storage/pill_bottle/vaginal_pop/PopulateContents() + for(var/i in 1 to 10) + new /obj/item/reagent_containers/pill/vaginal_vigour(src) + /obj/item/storage/pill_bottle/peen_pop name = "peen pop pill bottle" desc = "Increase the pleasure!" diff --git a/modular_splurt/code/game/objects/items/storage/tailbag.dm b/modular_splurt/code/game/objects/items/storage/tailbag.dm index 0b9b4764f3..0098544d8b 100644 --- a/modular_splurt/code/game/objects/items/storage/tailbag.dm +++ b/modular_splurt/code/game/objects/items/storage/tailbag.dm @@ -120,17 +120,3 @@ var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 8 -/datum/crafting_recipe/tailbag - name = "Tailbag" - result = /obj/item/storage/tailbag - reqs = list(/obj/item/stack/sheet/leather = 2) - time = 30 - category = CAT_CLOTHING - -/datum/crafting_recipe/tailbag_xl - name = "XL Tailbag" - result = /obj/item/storage/tailbag/xtralg - reqs = list(/obj/item/storage/tailbag = 1, - /obj/item/stack/sheet/leather = 2) - time = 30 - category = CAT_CLOTHING diff --git a/modular_splurt/code/game/objects/items/toys.dm b/modular_splurt/code/game/objects/items/toys.dm index b131fd5c74..71b7218fd1 100644 --- a/modular_splurt/code/game/objects/items/toys.dm +++ b/modular_splurt/code/game/objects/items/toys.dm @@ -1,3 +1,6 @@ +/obj/item/toy/figure // SPLURT EDIT: MAKES TOY FIGURES TINY + w_class = WEIGHT_CLASS_TINY + /obj/item/toy/prize/savannahivanov name = "toy Savannah-Ivanov" icon = 'modular_splurt/icons/obj/toy.dmi' diff --git a/modular_splurt/code/game/objects/structures/bed_chairs/beds.dm b/modular_splurt/code/game/objects/structures/bed_chairs/beds.dm index 142b414148..33da9b06b9 100644 --- a/modular_splurt/code/game/objects/structures/bed_chairs/beds.dm +++ b/modular_splurt/code/game/objects/structures/bed_chairs/beds.dm @@ -34,11 +34,18 @@ name = "matress" desc = "This is used to lie in, sleep in or strap on." icon_state = "mattress0" + buildstacktype = /obj/item/stack/sheet/cloth /obj/structure/bed/matress/New() ..() icon_state = "mattress[rand(0,6)]" +/obj/structure/bed/matress/clean + icon_state = "mattress2" + +/obj/structure/bed/matress/clean_pillowed + icon_state = "mattress0" + /obj/structure/bed/secbed name = "security pet bed" desc = "A comfy-looking pet bed, now in the classic security colors." diff --git a/modular_splurt/code/modules/mob/living/carbon/human/human.dm b/modular_splurt/code/modules/mob/living/carbon/human/human.dm index 07d15c0bf2..03b1f60d1a 100644 --- a/modular_splurt/code/modules/mob/living/carbon/human/human.dm +++ b/modular_splurt/code/modules/mob/living/carbon/human/human.dm @@ -16,7 +16,7 @@ /mob/living/carbon/human/ComponentInitialize() . = ..() - AddElement(/datum/element/flavor_text/carbon, _name = "Headshot", _save_key = "headshot_link", _examine_no_preview = TRUE, _edit = FALSE) + AddElement(/datum/element/flavor_text/carbon, _name = "Headshot", _save_key = "headshot_link", _examine_no_preview = TRUE, _edit = TRUE) /mob/living/carbon/human/species/mammal/shadekin race = /datum/species/mammal/shadekin diff --git a/modular_splurt/code/modules/paperwork/pen.dm b/modular_splurt/code/modules/paperwork/pen.dm index 9176c4503c..48768dba99 100644 --- a/modular_splurt/code/modules/paperwork/pen.dm +++ b/modular_splurt/code/modules/paperwork/pen.dm @@ -32,7 +32,7 @@ to_chat(user, span_notice("You begin to write on your [BP:name].")) if(do_mob(user, T, 4 SECONDS)) - if((length(BP:writtentext))+(length(writting)) < 100) //100 character limmit to stop spamming. + if((length(BP:writtentext))+(length(writting)) < 130) //130 character limit to stop spamming. BP:writtentext += html_encode(writting) //you can add to text, not remove it. else to_chat(user, span_notice("There isnt enough space to write that on [T]'s [BP:name].")) diff --git a/modular_splurt/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/modular_splurt/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 2f81de39b8..fa2f111024 100644 --- a/modular_splurt/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/modular_splurt/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -213,6 +213,11 @@ color = COLOR_PINK genital = ORGAN_SLOT_BREASTS +/datum/reagent/drug/genital_stimulator/vaginal_vigour + name = "Vaginal Vigour" + color = COLOR_PURPLE + genital = ORGAN_SLOT_VAGINA + /datum/reagent/drug/genital_stimulator/peen_pop name = "Peen Pop" color = COLOR_MOSTLY_PURE_ORANGE diff --git a/modular_splurt/code/modules/reagents/reagent_containers/hypospray.dm b/modular_splurt/code/modules/reagents/reagent_containers/hypospray.dm index 5daab2912e..b0007cf1aa 100644 --- a/modular_splurt/code/modules/reagents/reagent_containers/hypospray.dm +++ b/modular_splurt/code/modules/reagents/reagent_containers/hypospray.dm @@ -103,3 +103,23 @@ /datum/reagent/fermi/belly_inflator = 10, /datum/reagent/growthchem = 10 ) + +/obj/item/reagent_containers/hypospray/medipen/bimbo + name = "Bimbofication Injector" + desc = "A medipen that enhances femininity and lust, transforming the user into a bimbo. It contains a blend of overpowering aphrodisiacs and body-enlargening reagents." + icon = 'modular_splurt/icons/obj/syringe.dmi' + lefthand_file = 'modular_splurt/icons/mob/inhands/equipment/medical_lefthand.dmi' + righthand_file = 'modular_splurt/icons/mob/inhands/equipment/medical_righthand.dmi' + icon_state = "hcrocinpen" + item_state = "hcrocinpen" + reagent_flags = NO_REACT + volume = 190 + amount_per_transfer_from_this = 190 + list_reagents = list( + /datum/reagent/drug/aphrodisiacplus = 100, + /datum/reagent/fermi/breast_enlarger = 30, + /datum/reagent/fermi/butt_enlarger = 30, + /datum/reagent/drug/genital_stimulator/anal_allure = 10, + /datum/reagent/drug/genital_stimulator/breast_buzzer = 10, + /datum/reagent/drug/genital_stimulator/vaginal_vigour = 10 + ) diff --git a/modular_splurt/code/modules/reagents/reagent_containers/pill.dm b/modular_splurt/code/modules/reagents/reagent_containers/pill.dm index 2aebffcc0e..88766e81a0 100644 --- a/modular_splurt/code/modules/reagents/reagent_containers/pill.dm +++ b/modular_splurt/code/modules/reagents/reagent_containers/pill.dm @@ -38,6 +38,12 @@ list_reagents = list(/datum/reagent/drug/genital_stimulator/breast_buzzer = 5) icon_state = "pill15" +/obj/item/reagent_containers/pill/vaginal_vigour + name = "vaginal vigour pill" + desc = "Significantly increases arousal gain from stimulation to the user's vagina." + list_reagents = list(/datum/reagent/drug/genital_stimulator/vaginal_vigour = 5) + icon_state = "pill15" + /obj/item/reagent_containers/pill/peen_pop name = "peen pop pill" desc = "Significantly increases arousal gain from stimulation to the user's penis." diff --git a/modular_splurt/code/modules/research/designs/autolathe_desings/autolathe_designs.dm b/modular_splurt/code/modules/research/designs/autolathe_desings/autolathe_designs.dm new file mode 100644 index 0000000000..2f9a0b2d68 --- /dev/null +++ b/modular_splurt/code/modules/research/designs/autolathe_desings/autolathe_designs.dm @@ -0,0 +1,7 @@ +/datum/design/welding_goggles + name = "Welding Goggles" + id = "welding_goggles" + build_type = AUTOLATHE + materials = list(/datum/material/iron = 2500) + build_path = /obj/item/clothing/glasses/welding + category = list("initial","Tools") diff --git a/modular_splurt/code/modules/research/designs/bluespace_designs.dm b/modular_splurt/code/modules/research/designs/bluespace_designs.dm index e44e566a18..f9356cb823 100644 --- a/modular_splurt/code/modules/research/designs/bluespace_designs.dm +++ b/modular_splurt/code/modules/research/designs/bluespace_designs.dm @@ -7,3 +7,8 @@ build_path = /obj/item/storage/wallet/bluespace category = list("Bluespace Designs") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + +//EXTRA DEPARTMENTAL FLAGS +/datum/design/miningsatchel_holding/New() + departmental_flags |= DEPARTMENTAL_FLAG_SCIENCE + . = ..() diff --git a/modular_splurt/code/modules/research/designs/medical_designs.dm b/modular_splurt/code/modules/research/designs/medical_designs.dm index 99343587b5..f32448e51e 100644 --- a/modular_splurt/code/modules/research/designs/medical_designs.dm +++ b/modular_splurt/code/modules/research/designs/medical_designs.dm @@ -174,3 +174,49 @@ /datum/design/adv_r_arm category = list("Prosthetics", "Medical Designs") + +//EXTRA DEPARTMENTAL FLAGS - MEDICAL TOOLS +/datum/design/genescanner/New() + departmental_flags |= DEPARTMENTAL_FLAG_SCIENCE + . = ..() + +/datum/design/healthanalyzer/New() + departmental_flags |= DEPARTMENTAL_FLAG_SCIENCE + . = ..() + +/datum/design/healthanalyzer_advanced/New() + departmental_flags |= DEPARTMENTAL_FLAG_SCIENCE + . = ..() + +/datum/design/syringe/New() + departmental_flags |= DEPARTMENTAL_FLAG_SCIENCE + . = ..() + +/datum/design/noreactsyringe/New() + departmental_flags |= DEPARTMENTAL_FLAG_SCIENCE + . = ..() + +// EXTRA DEPARTMENTAL FLAGS - MEDICAL TOOLS -> STOCK PARTS +/datum/design/beaker/New() + departmental_flags |= DEPARTMENTAL_FLAG_ENGINEERING + . = ..() + +/datum/design/large_beaker/New() + departmental_flags |= DEPARTMENTAL_FLAG_ENGINEERING + . = ..() + +/datum/design/xlarge_beaker/New() + departmental_flags |= DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING + . = ..() + +/datum/design/noreactbeaker/New() + departmental_flags |= DEPARTMENTAL_FLAG_SCIENCE + . = ..() + +/datum/design/meta_beaker/New() + departmental_flags |= DEPARTMENTAL_FLAG_SCIENCE + . = ..() + +/datum/design/bluespacebeaker/New() + departmental_flags |= DEPARTMENTAL_FLAG_ENGINEERING + . = ..() diff --git a/modular_splurt/code/modules/research/designs/mining_designs.dm b/modular_splurt/code/modules/research/designs/mining_designs.dm new file mode 100644 index 0000000000..b15fa55149 --- /dev/null +++ b/modular_splurt/code/modules/research/designs/mining_designs.dm @@ -0,0 +1,17 @@ +// MODULAR SPLURT NEW DESIGNS + + + +// NEW DEPARTMENTAL FLAGS + +/datum/design/drill/New() + departmental_flags |= DEPARTMENTAL_FLAG_SCIENCE + . = ..() + +/datum/design/plasmacutter/New() + departmental_flags |= DEPARTMENTAL_FLAG_SCIENCE + . = ..() + +/datum/design/plasmacutter_adv/New() + departmental_flags |= DEPARTMENTAL_FLAG_SCIENCE + . = ..() diff --git a/modular_splurt/code/modules/research/designs/misc_designs.dm b/modular_splurt/code/modules/research/designs/misc_designs.dm index 3572f55c45..947423eafd 100644 --- a/modular_splurt/code/modules/research/designs/misc_designs.dm +++ b/modular_splurt/code/modules/research/designs/misc_designs.dm @@ -6,7 +6,15 @@ departmental_flags |= DEPARTMENTAL_FLAG_SERVICE . = ..() +/datum/design/diskplantgene/New() + departmental_flags |= DEPARTMENTAL_FLAG_SCIENCE + . = ..() +/datum/design/plant_analyzer/New() + departmental_flags |= DEPARTMENTAL_FLAG_SCIENCE + . = ..() + +// MODULAR SPLURT NEW DESIGNS /datum/design/ultimatespray name = "Ultimate Spray" desc = "The ultimate sprayer, no mess shall go unclean today." @@ -17,3 +25,24 @@ reagents_list = list(/datum/reagent/liquid_dark_matter = 10) category = list("Misc", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_SERVICE + +/datum/design/flashdark + name = "Flashdark" + desc= "A strange device manufactured with mysterious elements that somehow emits darkness." + id = "flashdark" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 2250, /datum/material/glass = 2250, /datum/material/plasma = 2250) + build_path = /obj/item/flashlight/flashdark + reagents_list = list(/datum/reagent/liquid_dark_matter = 10) + category = list("Misc", "Equipment") + departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/spraycan_bluespace + name = "Bluespace Spraycan" + desc= "A spray can infused with bluespace technology that can change the color of the sprayed object's innate light." + id = "spraycan_bluespace" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 2250, /datum/material/glass = 2250, /datum/material/bluespace = 500) + build_path = /obj/item/toy/crayon/spraycan/bluespace + category = list("Misc", "Equipment") + departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SERVICE diff --git a/modular_splurt/code/modules/research/designs/tool_designs.dm b/modular_splurt/code/modules/research/designs/tool_designs.dm index 162ae1b749..6c9622ff69 100644 --- a/modular_splurt/code/modules/research/designs/tool_designs.dm +++ b/modular_splurt/code/modules/research/designs/tool_designs.dm @@ -1,2 +1,20 @@ +// MODULAR SPLURT CHANGES OF ALREADY EXISTING DESIGNS /datum/design/rcd_loaded name = "Rapid Construction Device (RCD)" + +/datum/design/rld_mini/New() + materials = list(/datum/material/iron = 10000, /datum/material/glass = 5000, /datum/material/plastic = 1000, /datum/material/gold = 1000) + departmental_flags |= DEPARTMENTAL_FLAG_SCIENCE + + +// NEW DESIGNS: + +/datum/design/rld + name = "Rapid Light Device (RLD)" + desc = "A device used to rapidly provide lighting sources to an area. Reload with metal, plasteel, glass or compressed matter cartridges." + id = "rld" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 20000, /datum/material/glass = 10000, /datum/material/plastic = 2000, /datum/material/gold = 2000) + build_path = /obj/item/construction/rld + category = list("Tool Designs") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SCIENCE diff --git a/modular_splurt/code/modules/research/designs/weapon_designs.dm b/modular_splurt/code/modules/research/designs/weapon_designs.dm new file mode 100644 index 0000000000..751e673083 --- /dev/null +++ b/modular_splurt/code/modules/research/designs/weapon_designs.dm @@ -0,0 +1,9 @@ +/datum/design/pin_electronic + name = "Electronic Firing Pin" + desc = "A small authentication device, to be inserted into a firearm receiver to allow operation. NT safety regulations require all new designs to incorporate one." + id = "pin_electronic" + build_type = PROTOLATHE + materials = list(/datum/material/silver = 600, /datum/material/diamond = 600, /datum/material/uranium = 200) + build_path = /obj/item/firing_pin + category = list("Firing Pins") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY diff --git a/modular_splurt/code/modules/research/techweb/nodes/bepis_nodes.dm b/modular_splurt/code/modules/research/techweb/nodes/bepis_nodes.dm new file mode 100644 index 0000000000..11e73225a4 --- /dev/null +++ b/modular_splurt/code/modules/research/techweb/nodes/bepis_nodes.dm @@ -0,0 +1,10 @@ +//MODULAR SPLURT CHANGES OF ALREADY EXISTING NODES +/datum/techweb_node/light_apps/New() + var/list/extra_designs = list( + "rld", + "flashdark", + "glowstick", + "spraycan_bluespace" + ) + LAZYADD(design_ids, extra_designs) + . = ..() diff --git a/modular_splurt/code/modules/research/techweb/nodes/weaponry_nodes.dm b/modular_splurt/code/modules/research/techweb/nodes/weaponry_nodes.dm new file mode 100644 index 0000000000..3bd701a884 --- /dev/null +++ b/modular_splurt/code/modules/research/techweb/nodes/weaponry_nodes.dm @@ -0,0 +1,7 @@ +//MODULAR SPLURT CHANGES OF ALREADY EXISTING NODES +/datum/techweb_node/adv_weaponry/New() + var/list/extra_designs = list( + "pin_electronic", + ) + LAZYADD(design_ids, extra_designs) + . = ..() diff --git a/modular_splurt/code/modules/research/xenoarch/artifact.dm b/modular_splurt/code/modules/research/xenoarch/artifact.dm index bde1d1cdd8..beab0e9073 100644 --- a/modular_splurt/code/modules/research/xenoarch/artifact.dm +++ b/modular_splurt/code/modules/research/xenoarch/artifact.dm @@ -8,12 +8,12 @@ // /datum/export/artifacts - cost = 2000 //Big cash + cost = 2500 //Big cash unit_name = "useless artifact" export_types = list(/obj/item/ancientartifact/useless) /datum/export/artifacts - cost = 4000 //Big cash + cost = 4500 //Big cash unit_name = "fossil artifact" export_types = list(/obj/item/ancientartifact/faunafossil,/obj/item/ancientartifact/florafossil) @@ -32,8 +32,8 @@ if(!do_after(user, 100, target=src)) to_chat(user,"You must stand still to analyze.") return - SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = 2000)) - to_chat(user,"You successfully researched the artifact. You have gained 2000 research points.") + SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = 2500)) + to_chat(user,"You successfully researched the artifact. You have gained 2500 research points.") qdel(src) /obj/item/ancientartifact/faunafossil @@ -49,8 +49,8 @@ if(!do_after(user, 100, target=src)) to_chat(user,"You must stand still to analyze.") return - SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = 4000)) - to_chat(user,"You successfully researched the artifact. You have gained 4000 research points.") + SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = 4500)) + to_chat(user,"You successfully researched the artifact. You have gained 4500 research points.") qdel(src) /obj/item/ancientartifact/florafossil @@ -66,8 +66,8 @@ if(!do_after(user, 100, target=src)) to_chat(user,"You must stand still to analyze.") return - SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = 4000)) - to_chat(user,"You successfully researched the artifact. You have gained 4000 research points.") + SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = 4500)) + to_chat(user,"You successfully researched the artifact. You have gained 4500 research points.") qdel(src) if(istype(W,/obj/item/xenoarch/help/plant)) if(!do_after(user, 50, target=src)) diff --git a/modular_splurt/code/modules/research/xenoarch/artifact_list.dm b/modular_splurt/code/modules/research/xenoarch/artifact_list.dm index a1a747fca8..142a723797 100644 --- a/modular_splurt/code/modules/research/xenoarch/artifact_list.dm +++ b/modular_splurt/code/modules/research/xenoarch/artifact_list.dm @@ -66,6 +66,7 @@ GLOBAL_LIST_INIT(ult_artifact,list( /obj/item/nuke_core/supermatter_sliver=1, /obj/item/compressionkit=1, /obj/item/circuitboard/machine/plantgenes/vault=1, /obj/item/disk/design_disk/golem_shell=1, - /obj/item/disk/tech_disk/illegal=1 + /obj/item/disk/tech_disk/illegal=1, + /obj/item/card/emag=1, )) diff --git a/modular_splurt/code/modules/research/xenoarch/tools.dm b/modular_splurt/code/modules/research/xenoarch/tools.dm index 44591fdae7..a3ff76b863 100644 --- a/modular_splurt/code/modules/research/xenoarch/tools.dm +++ b/modular_splurt/code/modules/research/xenoarch/tools.dm @@ -556,7 +556,7 @@ materials = list(/datum/material/plastic = 2000) build_path = /obj/item/storage/bag/strangerock category = list("Tool Designs") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_CARGO /datum/design/xenorockbackadv name = "Xenoarchaeology Bluespace Strange Rock Bag" @@ -566,5 +566,5 @@ materials = list(/datum/material/plastic = 2000, /datum/material/bluespace = 1000) build_path = /obj/item/storage/bag/strangerockadv category = list("Tool Designs") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_CARGO diff --git a/modular_splurt/code/modules/surgery/organs/eyes.dm b/modular_splurt/code/modules/surgery/organs/eyes.dm index cab6b30fba..99dbc50d99 100644 --- a/modular_splurt/code/modules/surgery/organs/eyes.dm +++ b/modular_splurt/code/modules/surgery/organs/eyes.dm @@ -75,3 +75,63 @@ /obj/item/organ/eyes/robotic/hypno/proc/examine_user(atom/examine_target, mob/living/carbon/human/examiner, list/examine_list) // Add examine text examine_list += "[usr.p_their(TRUE)] eyes glimmer with an entrancing power." + +//X-Ray Eyes - Extra Functionality + +/obj/item/organ/eyes/robotic/xray + actions_types = list(/datum/action/item_action/organ_action/use) // Use the generic "use" action + var/xray_active = TRUE + +/obj/item/organ/eyes/robotic/xray/ui_action_click() + toggle_xray() + +/obj/item/organ/eyes/robotic/xray/proc/toggle_xray() + xray_active = !xray_active + if(xray_active) + sight_flags |= (SEE_MOBS | SEE_OBJS | SEE_TURFS) + to_chat(owner, "You activate your X-ray vision.") + else + sight_flags &= ~(SEE_MOBS | SEE_OBJS | SEE_TURFS) + + to_chat(owner, "You deactivate your X-ray vision.") + owner.update_sight() + +//Thermal Eyes - Extra Functionality + +/obj/item/organ/eyes/robotic/thermals + actions_types = list(/datum/action/item_action/organ_action/use) + var/thermal_active = TRUE + +/obj/item/organ/eyes/robotic/thermals/ui_action_click() + toggle_thermal() + +/obj/item/organ/eyes/robotic/thermals/proc/toggle_thermal() + thermal_active = !thermal_active + if(thermal_active) + sight_flags |= SEE_MOBS + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + to_chat(owner, "You activate your thermal vision.") + else + sight_flags &= ~SEE_MOBS + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + to_chat(owner, "You deactivate your thermal vision.") + owner.update_sight() + +//Welding shield eyes + +/obj/item/organ/eyes/robotic/shield + actions_types = list(/datum/action/item_action/organ_action/use) + var/shield_active = TRUE + +/obj/item/organ/eyes/robotic/shield/ui_action_click() + toggle_shield() + +/obj/item/organ/eyes/robotic/shield/proc/toggle_shield() + shield_active = !shield_active + if(shield_active) + flash_protect = 2 + to_chat(owner, "You activate your welding shield.") + else + flash_protect = 0 + to_chat(owner, "You deactivate your welding shield.") + owner.update_sight() diff --git a/modular_splurt/code/modules/vending/cigarette.dm b/modular_splurt/code/modules/vending/cigarette.dm new file mode 100644 index 0000000000..c1597345a7 --- /dev/null +++ b/modular_splurt/code/modules/vending/cigarette.dm @@ -0,0 +1,7 @@ +/obj/machinery/vending/cigarette/Initialize() + var/list/extra_contraband = list( + /obj/item/storage/fancy/cigarettes/cigpack_mindbreaker = 3, + /obj/item/storage/fancy/cigarettes/cigpack_cannabis = 3 + ) + LAZYADD(contraband, extra_contraband) + . = ..() diff --git a/modular_splurt/code/modules/vending/clothesmate.dm b/modular_splurt/code/modules/vending/clothesmate.dm index 7b1c0eb1ad..46d5269da0 100644 --- a/modular_splurt/code/modules/vending/clothesmate.dm +++ b/modular_splurt/code/modules/vending/clothesmate.dm @@ -38,7 +38,8 @@ /obj/item/clothing/wrists/armwarmer = 3, /obj/item/clothing/wrists/armwarmer/long = 3, /obj/item/clothing/wrists/armwarmer_striped = 3, - /obj/item/clothing/wrists/armwarmer_striped/long = 3 + /obj/item/clothing/wrists/armwarmer_striped/long = 3, + /obj/item/clothing/under/pants/yoga = 3 ) var/list/extra_contraband = list( /obj/item/clothing/under/rank/civilian/lawyer/galaxy_red = 3, diff --git a/modular_splurt/code/modules/vending/cola.dm b/modular_splurt/code/modules/vending/cola.dm new file mode 100644 index 0000000000..8e987a5196 --- /dev/null +++ b/modular_splurt/code/modules/vending/cola.dm @@ -0,0 +1,6 @@ +/obj/machinery/vending/cola/Initialize() + var/list/extra_products = list( + /obj/item/reagent_containers/glass/beaker/waterbottle/large = 5 + ) + LAZYADD(products, extra_products) + . = ..() diff --git a/modular_splurt/code/modules/vending/kinkmate.dm b/modular_splurt/code/modules/vending/kinkmate.dm index e0c5afde44..12a43c5b7b 100644 --- a/modular_splurt/code/modules/vending/kinkmate.dm +++ b/modular_splurt/code/modules/vending/kinkmate.dm @@ -59,6 +59,7 @@ /obj/item/storage/pill_bottle/BEsmaller = 3, /obj/item/storage/pill_bottle/anal_allure = 3, /obj/item/storage/pill_bottle/breast_buzzer = 3, + /obj/item/storage/pill_bottle/vaginal_vigour = 3, /obj/item/storage/pill_bottle/peen_pop = 3, /obj/item/chastity_hypno/magazine = 6, /obj/item/chastity_hypno/watch = 2 diff --git a/modular_splurt/code/modules/vending/medical.dm b/modular_splurt/code/modules/vending/medical.dm new file mode 100644 index 0000000000..d7fe69bbeb --- /dev/null +++ b/modular_splurt/code/modules/vending/medical.dm @@ -0,0 +1,9 @@ +/obj/machinery/vending/medical/Initialize() + var/list/extra_contraband = list( + /obj/item/storage/pill_bottle/lsdpsych = 3, + /obj/item/storage/pill_bottle/happinesspsych = 3, + /obj/item/storage/pill_bottle/paxpsych = 3, + /obj/item/reagent_containers/hypospray/medipen/bimbo = 3 + ) + LAZYADD(contraband, extra_contraband) + . = ..() diff --git a/modular_splurt/icons/effects/effects.dmi b/modular_splurt/icons/effects/effects.dmi index f0288a5d63456c4261df340e82dfaed73ee9fcc1..cd51b7b41649bc533ae2f0b5e66722877c15d671 100644 GIT binary patch literal 14659 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 B3j_cF literal 14068 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 PJ)ownrBtI}5&pjbkTKU6 diff --git a/tgstation.dme b/tgstation.dme index c88425a57d..fd5375efad 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4440,6 +4440,8 @@ #include "modular_splurt\code\datums\components\pregnancy.dm" #include "modular_splurt\code\datums\components\pregnancy_inert.dm" #include "modular_splurt\code\datums\components\size_normalized.dm" +#include "modular_splurt\code\datums\components\crafting\recipes\recipes_clothing.dm" +#include "modular_splurt\code\datums\components\crafting\recipes\recipes_furniture.dm" #include "modular_splurt\code\datums\components\crafting\recipes\recipes_misc.dm" #include "modular_splurt\code\datums\components\crafting\recipes\recipes_primal.dm" #include "modular_splurt\code\datums\components\crafting\recipes\recipes_robot.dm" @@ -4508,6 +4510,7 @@ #include "modular_splurt\code\game\objects\items\armor_kits.dm" #include "modular_splurt\code\game\objects\items\cards_ids.dm" #include "modular_splurt\code\game\objects\items\cosmetics.dm" +#include "modular_splurt\code\game\objects\items\crayons.dm" #include "modular_splurt\code\game\objects\items\granters.dm" #include "modular_splurt\code\game\objects\items\holy_weapons.dm" #include "modular_splurt\code\game\objects\items\manuals.dm" @@ -4983,13 +4986,16 @@ #include "modular_splurt\code\modules\research\designs\mecha_designs.dm" #include "modular_splurt\code\modules\research\designs\mechfabricator_designs.dm" #include "modular_splurt\code\modules\research\designs\medical_designs.dm" +#include "modular_splurt\code\modules\research\designs\mining_designs.dm" #include "modular_splurt\code\modules\research\designs\misc_designs.dm" #include "modular_splurt\code\modules\research\designs\power_designs.dm" #include "modular_splurt\code\modules\research\designs\stock_parts_designs.dm" #include "modular_splurt\code\modules\research\designs\tool_designs.dm" +#include "modular_splurt\code\modules\research\designs\autolathe_desings\autolathe_designs.dm" #include "modular_splurt\code\modules\research\designs\autolathe_desings\autolathe_designs_sec_and_hacked.dm" #include "modular_splurt\code\modules\research\designs\machine_designs\machine_designs_all_misc.dm" #include "modular_splurt\code\modules\research\techweb\nodes\ballistics.dm" +#include "modular_splurt\code\modules\research\techweb\nodes\bepis_nodes.dm" #include "modular_splurt\code\modules\research\techweb\nodes\biotech_nodes.dm" #include "modular_splurt\code\modules\research\techweb\nodes\bluespace_nodes.dm" #include "modular_splurt\code\modules\research\techweb\nodes\janitor_nodes.dm" @@ -4997,6 +5003,7 @@ #include "modular_splurt\code\modules\research\techweb\nodes\medical_nodes.dm" #include "modular_splurt\code\modules\research\techweb\nodes\nanites_nodes.dm" #include "modular_splurt\code\modules\research\techweb\nodes\robotic_nodes.dm" +#include "modular_splurt\code\modules\research\techweb\nodes\weaponry_nodes.dm" #include "modular_splurt\code\modules\research\xenoarch\artifact.dm" #include "modular_splurt\code\modules\research\xenoarch\artifact_list.dm" #include "modular_splurt\code\modules\research\xenoarch\strange_rock.dm" @@ -5043,10 +5050,12 @@ #include "modular_splurt\code\modules\vending\autodrobe.dm" #include "modular_splurt\code\modules\vending\barkbox.dm" #include "modular_splurt\code\modules\vending\boozeomat.dm" +#include "modular_splurt\code\modules\vending\cigarette.dm" #include "modular_splurt\code\modules\vending\clothesmate.dm" #include "modular_splurt\code\modules\vending\engineering.dm" #include "modular_splurt\code\modules\vending\games.dm" #include "modular_splurt\code\modules\vending\kinkmate.dm" +#include "modular_splurt\code\modules\vending\medical.dm" #include "modular_splurt\code\modules\vending\modularpc.dm" #include "modular_splurt\code\modules\vending\security.dm" #include "modular_splurt\code\modules\vending\snack.dm" diff --git a/tgui/packages/tgui/interfaces/Crayon.js b/tgui/packages/tgui/interfaces/Crayon.js index 3c66ac5c9f..211f729f25 100644 --- a/tgui/packages/tgui/interfaces/Crayon.js +++ b/tgui/packages/tgui/interfaces/Crayon.js @@ -12,6 +12,7 @@ export const Crayon = (props, context) => { y, min_offset, max_offset, + can_change_light_color, } = data; return ( { selected={data.is_capped} onClick={() => act('toggle_cap')} /> + {/* SPLURT EDIT START */} + {can_change_light_color ? ( + +