diff --git a/code/game/objects/items/devices/translocator_vr.dm b/code/game/objects/items/devices/translocator_vr.dm index 7400b14ddb..348046cd64 100644 --- a/code/game/objects/items/devices/translocator_vr.dm +++ b/code/game/objects/items/devices/translocator_vr.dm @@ -92,11 +92,11 @@ else return ..() -/obj/item/device/perfect_tele/proc/unload_ammo(mob/user) +/obj/item/device/perfect_tele/proc/unload_ammo(mob/user, var/ignore_inactive_hand_check = 0) if(battery_lock) to_chat(user,"[src] does not have a battery port.") return - if(user.get_inactive_hand() == src && power_source) + if((user.get_inactive_hand() == src || ignore_inactive_hand_check) && power_source) to_chat(user,"You eject \the [power_source] from \the [src].") user.put_in_hands(power_source) power_source = null @@ -111,7 +111,7 @@ return FALSE return TRUE -/obj/item/device/perfect_tele/attack_self(mob/user) +/obj/item/device/perfect_tele/attack_self(mob/user, var/radial_menu_anchor = src) if(loc_network) for(var/obj/item/device/perfect_tele_beacon/stationary/nb in GLOB.premade_tele_beacons) if(nb.tele_network == loc_network) @@ -124,8 +124,7 @@ and tele-vore. Make sure you carefully examine someone's OOC prefs before teleporting them if you are \ going to use this device for ERP purposes. This device records all warnings given and teleport events for \ admin review in case of pref-breaking, so just don't do it.","OOC WARNING") - - var/choice = show_radial_menu(user, src, radial_images, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE) + var/choice = show_radial_menu(user, radial_menu_anchor, radial_images, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE) if(!choice) return @@ -281,7 +280,7 @@ //Seems okay to me! return TRUE -/obj/item/device/perfect_tele/afterattack(mob/living/target, mob/living/user, proximity) +/obj/item/device/perfect_tele/afterattack(mob/living/target, mob/living/user, proximity, var/ignore_fail_chance = 0) //No, you can't teleport people from over there. if(!proximity) return @@ -312,11 +311,12 @@ R.force_dismount(rider) //Failure chance - if(prob(failure_chance) && beacons.len >= 2) - var/list/wrong_choices = beacons - destination.tele_name - var/wrong_name = pick(wrong_choices) - destination = beacons[wrong_name] - to_chat(user,"\The [src] malfunctions and sends you to the wrong beacon!") + if (!ignore_fail_chance) + if(prob(failure_chance) && beacons.len >= 2) + var/list/wrong_choices = beacons - destination.tele_name + var/wrong_name = pick(wrong_choices) + destination = beacons[wrong_name] + to_chat(user,"\The [src] malfunctions and sends you to the wrong beacon!") //Destination beacon vore checking var/turf/dT = get_turf(destination) diff --git a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm index bf0148f510..63f5749c2b 100644 --- a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm @@ -739,6 +739,12 @@ character_name = list("Clara Mali") cost = 1 +/datum/gear/fluff/nikki_dorky_outfit + path = /obj/item/weapon/storage/box/fluff + display_name = "Nikki's Witchy Outfit" + ckeywhitelist = list("ryumi") + character_name = list("Nikki Yumeno") + // S CKEYS /datum/gear/fluff/brynhild_medal path = /obj/item/clothing/accessory/medal/silver/valor diff --git a/code/modules/clothing/spacesuits/rig/modules/specific/mounted_gun_vr.dm b/code/modules/clothing/spacesuits/rig/modules/specific/mounted_gun_vr.dm new file mode 100644 index 0000000000..96f609a1da --- /dev/null +++ b/code/modules/clothing/spacesuits/rig/modules/specific/mounted_gun_vr.dm @@ -0,0 +1,12 @@ +/obj/item/rig_module/mounted/sizegun + icon = 'icons/obj/rig_modules.dmi' + icon_state = "sizegun" + name = "mounted size gun" + desc = "A size gun to be mounted on a rig suit. Features interface-based target size adjustment for hands-free size-altering shenanigans." + + engage_string = "Select Size" + + interface_name = "mounted sizegun" + interface_desc = "A wrist-mounted, hardsuit cell-powered, size gun. Features interface-based target size adjustment for hands-free size-altering shenanigans." + + gun_type = /obj/item/weapon/gun/energy/sizegun/mounted diff --git a/code/modules/research/mechfab_designs_vr.dm b/code/modules/research/mechfab_designs_vr.dm index 1de0cc2dda..099d2a2374 100644 --- a/code/modules/research/mechfab_designs_vr.dm +++ b/code/modules/research/mechfab_designs_vr.dm @@ -5,3 +5,11 @@ req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 5, TECH_MAGNET = 5, TECH_BIO = 4) materials = list(MAT_PLASTEEL = 3000, MAT_GRAPHITE = 2000, MAT_PLASTIC = 3500, MAT_SILVER = 1750, MAT_GOLD = 1250) build_path = /obj/item/rig_module/rescue_pharm + +/datum/design/item/mechfab/rigsuit/mounted_sizegun + name = "hardsuit mounted size gun" + desc = "A suit mounted size gun. Features interface-based target size adjustment for hands-free size-altering shenanigans." + id = "rig_gun_sizegun" + req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_POWER = 2) + materials = list(DEFAULT_WALL_MATERIAL = 3000, MAT_GLASS = 2000, MAT_URANIUM = 2000) + build_path = /obj/item/rig_module/mounted/sizegun \ No newline at end of file diff --git a/code/modules/vore/fluffstuff/custom_boxes_vr.dm b/code/modules/vore/fluffstuff/custom_boxes_vr.dm index 4b16e1d66f..b718453f2e 100644 --- a/code/modules/vore/fluffstuff/custom_boxes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_boxes_vr.dm @@ -217,6 +217,16 @@ /obj/item/weapon/melee/fluffstuff/wolfgirlsword, /obj/item/weapon/shield/fluff/wolfgirlshield) +// Ryumi: Nikki Yumeno +/obj/item/weapon/storage/box/fluff + name = "Nikki's Outfit Box" + desc = "Warning: Contains dangerous amounts of dork." + has_items = list( + /obj/item/weapon/rig/nikki, + /obj/item/clothing/head/fluff/nikki, + /obj/item/clothing/under/skirt/outfit/fluff/nikki, + /obj/item/clothing/shoes/fluff/nikki) + /* Swimsuits, for general use, to avoid arriving to work with your swimsuit. */ diff --git a/code/modules/vore/fluffstuff/custom_clothes_vr.dm b/code/modules/vore/fluffstuff/custom_clothes_vr.dm index ffff210dbc..b127475a85 100644 --- a/code/modules/vore/fluffstuff/custom_clothes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_clothes_vr.dm @@ -2007,4 +2007,222 @@ Departamental Swimsuits, for general use //BobOfBoblandia: Charles Gettler /obj/item/clothing/head/that/fluff/gettler name = "Charles' Top-Hat" - desc = "A special hat, removed from its owner." \ No newline at end of file + desc = "A special hat, removed from its owner." + +//Ryumi: Nikki Yumeno +/obj/item/clothing/under/skirt/outfit/fluff/nikki + name = "dorky outfit" + desc = "A little witch costume that looks like it's been worn as ordinary clothes. Who in their right mind would...??" + icon = 'icons/vore/custom_clothes_vr.dmi' + icon_override = 'icons/vore/custom_onmob_vr.dmi' + icon_state = "nikki_outfit" + item_state = "nikki_outfit" + item_icons = list() + sensor_mode = 3 // I'm a dumbass and forget these all the time please understand :( + +/obj/item/clothing/under/skirt/outfit/fluff/nikki/mob_can_equip(var/mob/living/carbon/human/M, slot, disable_warning = 0) + if(..()) + if (M.ckey == "ryumi") + return 1 + else if (M.get_active_hand() == src) + to_chat(M, "What the heck? \The [src] doesn't fit!") + return 0 + +/obj/item/clothing/shoes/fluff/nikki + name = "non-magical boots" + desc = "Boots optimally built for a dork. They don't sparkle or anything, but you can imagine them doing that when you click the heels together." + icon = 'icons/vore/custom_clothes_vr.dmi' + icon_override = 'icons/vore/custom_onmob_vr.dmi' + icon_state = "nikki_boots" + item_state = "nikki_boots" + +/obj/item/clothing/shoes/fluff/nikki/mob_can_equip(var/mob/living/carbon/human/M, slot, disable_warning = 0) + if(..()) + if (M.ckey == "ryumi") + return 1 + else if (M.get_active_hand() == src) + to_chat(M, "What the heck? \The [src] doesn't fit!") + return 0 + +/obj/item/clothing/suit/fluff/nikki //see /obj/item/weapon/rig/nikki + name = "cape" + desc = "Snazzy!" + flags = null + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) // It's not armor, it's a dorky frickin cape + body_parts_covered = null // Cape ain't gonna cover a THING + cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS // It will keep you toasty tho, it's more than big enough to help with that! Just wrap the thing around you when on the surface, idk + icon = 'icons/vore/custom_clothes_vr.dmi' + icon_override = 'icons/vore/custom_onmob_vr.dmi' + icon_state = "nikki" + +/obj/item/clothing/head/fluff/nikki + // I have never tryharded so much just to accomplish something so stupid as "Vore By Hat" in my entire life, and I apologize to each and every one of you. + name = "oversized witch hat" + desc = "A dork-shaped hat. Its long, pointed tip reaches far more than most hats had ought to, its wide brim complementing \ + this with its tendency to droop at the ends under its own weight." + description_fluff = "Despite what Nikki Yumeno may believe, her hat is not in fact a magical artifact of teleportation magicks. \ + It is however the result of clever utilization of bluespace technology combined with style. Like a classic magician's trick, \ + the power of this hat lies in the hidden compartment hidden on the inside, into which a personal translocation device can be \ + snapped inside. Once installed, bluespace electronics inside the hat sync with the translocator and utilize its teleportation \ + technology to create a localized bluespace portal within the hole of the hat. This tiny portal will warp anything or anyone \ + who makes physical contact with it to whatever beacon the translocator within is locked onto." + icon = 'icons/vore/custom_clothes_vr.dmi' + icon_state = "nikki-hat" + item_state = "nikki-hat" + item_icons = list( + slot_l_hand_str = 'icons/vore/custom_clothes_left_hand_vr.dmi', + slot_r_hand_str = 'icons/vore/custom_clothes_right_hand_vr.dmi', + slot_head_str = 'icons/vore/custom_onmob_32x48_vr.dmi' + ) + flags_inv = HIDEEARS + w_class = ITEMSIZE_LARGE // THIS HAT IS FUCKIN HUGE YO + var/owner = "ryumi" + var/obj/item/device/perfect_tele/translocator = null // The translocator installed inside, if there is one. Gotta go out and get it first! + +/obj/item/clothing/head/fluff/nikki/verb/verb_translocator_unequip() + set category = "Object" + set name = "Nikki's Hat - Unequip Translocator" + set src in usr + translocator_unequip(translocator, usr) + +/obj/item/clothing/head/fluff/nikki/proc/translocator_equip(var/obj/item/device/perfect_tele/T, var/mob/living/carbon/human/user) + if (do_after(user, 2 SECONDS, T)) + user.unEquip(T) + translocator_unequip(translocator, user) + T.forceMove(src) + translocator = T + user.show_message("[bicon(src)]*click!*") + playsound(src, 'sound/machines/click.ogg', 30, 1) + +/obj/item/clothing/head/fluff/nikki/proc/translocator_unequip(var/obj/item/device/perfect_tele/T, var/mob/living/carbon/human/user) + if (translocator) + if (user) + user.put_in_hands(T) + user.show_message("[bicon(src)]*click!*") + else + translocator.forceMove(get_turf(src)) + translocator = null + playsound(src, 'sound/machines/click.ogg', 30, 1) + +/obj/item/clothing/head/fluff/nikki/proc/teleport_fail(mob/user, mob/target) + if (target != user) + user.visible_message("[user] harmlessly bops [target] with \the [src].", \ + "\The [src] harmlessly bops [target]. The hat seems... unwilling?") + else + user.visible_message("\The [src] flops over [user]'s' head for a moment, but they seem alright.", \ + "\The [src] flops over your head for a moment, but you correct it without issue. There we go!") + +/obj/item/clothing/head/fluff/nikki/proc/hat_warp_checks(var/mob/living/target, mob/user, proximity_flag) + if (!proximity_flag) + return 0 + + if (!translocator) + to_chat(user, "\The [src] doesn't have a translocator inside it yet, you goof!") + return 0 + + if (target.ckey == owner && target != user) // ur not getting me that easy sonny jim...... + to_chat(user, "You think to turn \the [src] on its creator?! FOOOOOOOOL.") + to_chat(user, "From seemingly nowhere you hear echoing, derisive laughter, accompanied by a stock laugh track and... Are those bike horns?") + return 0 + + if (!istype(target)) + to_chat(user, "\The [src] isn't a valid target!") + return 0 + + // Because other mobs (i.e. monkeys) apparently have dropnom prey set to 0, we check SPECIFICALLY for humans' dropnom setting. + if (target.type == /mob/living/carbon/human && !target.can_be_drop_prey) + teleport_fail(user, target) + return 0 + + if (!translocator.teleport_checks(target, user)) + return 0 + + else return 1 + +/obj/item/clothing/head/fluff/nikki/attackby(obj/item/weapon/I as obj, mob/user as mob) + if (istype(I, /obj/item/device/perfect_tele) && user.get_inactive_hand() == src) + if (translocator) + visible_message("[user] starts to pull \a [translocator] out of \the [src] to swap it out with \the [I]...", \ + "You start pulling \the [translocator] pops out of its compartment with a soft 'click' as you replace it with \the [I]....") + else + visible_message("[user] begins slipping \the [I] into \the [src]...", \ + "You begin to snap \the [I] into a small, hidden compartment inside \the [src]...") + // This works for both adding and replacing a translocator + translocator_equip(I, user) + return + else if (translocator) + translocator.attackby(I, user) + return + ..() + +/obj/item/clothing/head/fluff/nikki/get_description_interaction() + . = ..() + if (translocator) + . += "It has \a [translocator] inside of it. Alt-click while holding it on your inactive hand to remove it." + . += "Otherwise, this hat functions exactly as the translocator it has inside while still being a sweet head accessory." + else + . += "A translocator can be placed inside of it! While holding the hat in your inactive hand, use a translocator on it to slip it inside." + . += "After doing this, it will function as both a head accessory and teleportation device." + + +/obj/item/clothing/head/fluff/nikki/attack_hand(mob/user) + if (translocator && (user.get_inactive_hand() == src)) + translocator.unload_ammo(user, ignore_inactive_hand_check = 1) + return + ..() + +/obj/item/clothing/head/fluff/nikki/AltClick(mob/user) + if (translocator && (user.get_inactive_hand() == src)) + translocator_unequip(translocator, user) + +/obj/item/clothing/head/fluff/nikki/attack_self(mob/user) + ..() + if (translocator) + translocator.attack_self(user, user) + return + else + to_chat(user, "\The [src] doesn't have a translocator inside it right now.") + return + +/obj/item/clothing/head/fluff/nikki/examine(mob/user) // If it has a translocator installed, make it very obvious to viewers that something WEIRD is going on with this hat. + . = ..() + if (translocator) + . += "Weird... You can't see the bottom of the hole inside the hat..." + +/obj/item/clothing/head/fluff/nikki/equipped(mob/living/carbon/human/user, slot) + . = ..() + if (slot == slot_head && translocator && user.ckey != owner) // This way we don't unnecessarily spam the chat with hat/translocator errors + // hey, are we actually able to teleport this poor person? + if (hat_warp_checks(user, user, proximity_flag = 1)) + // YOU FOOL! YOU HAVE ACTIVATED MY STAND, 「VORE BY HAT」! + src.visible_message("\The [src] falls over [user]'s head... and somehow falls over the rest of their body, causing them to vanish inside. Where did they go?!", \ + "The hat falls over your head as you put it on, enveloping you in a bright green light! Uh oh.") + var/uh_oh = pick(translocator.beacons) + user.remove_from_mob(src, get_turf(user)) + translocator.destination = translocator.beacons[uh_oh] + translocator.afterattack(user, user, proximity = 1, ignore_fail_chance = 1) + add_attack_logs(user, user, "Tried to put on \the [src] and was involuntarily teleported by it (via \the [translocator] within)!") + return + +/obj/item/clothing/head/fluff/nikki/afterattack(var/mob/living/target, mob/user, proximity_flag, click_parameters) + // If the hat is willing to cooperate with the holder... + if (hat_warp_checks(target, user, proximity_flag)) + // Silly fluffed up styles of teleporting people based on user intent. + switch (user.a_intent) + if (I_HELP) + user.visible_message("[user] guides \the [target] to the bottomless hole within \the [src]. They begin to climb inside...") + if (do_after(user, 5 SECONDS, target)) + translocator.afterattack(target, user, proximity_flag) + if (I_DISARM) + user.visible_message("[user] plops \the [src] onto \the [target]'s head!") + translocator.afterattack(target, user, proximity_flag) + if (I_GRAB) + user.visible_message("[user] begins stuffing [target] into \the [src]!") + if (do_after(user, 5 SECONDS, target)) + translocator.afterattack(target, user, proximity_flag) + if (I_HURT) + user.visible_message("[user] swipes \the [src] over \the [target]!") + translocator.afterattack(target, user, proximity_flag) + + add_attack_logs(user, target, "Teleported [target] with via \the [src]'s [translocator]!") + else ..() diff --git a/code/modules/vore/fluffstuff/custom_items_vr.dm b/code/modules/vore/fluffstuff/custom_items_vr.dm index b2d82a7066..8fee419597 100644 --- a/code/modules/vore/fluffstuff/custom_items_vr.dm +++ b/code/modules/vore/fluffstuff/custom_items_vr.dm @@ -1250,6 +1250,52 @@ else return 1 +//Ryumi - Nikki Yumeno +/obj/item/weapon/rig/nikki + name = "weird necklace" + desc = "A necklace with a brilliantly blue crystal encased in protective glass." + icon = 'icons/vore/custom_clothes_vr.dmi' + icon_override = 'icons/vore/custom_onmob_vr.dmi' + suit_type = "probably not magical" + icon_state = "nikki" + w_class = ITEMSIZE_SMALL // It is after all only a necklace + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0) // this isn't armor, it's a dorky frickin cape + siemens_coefficient = 0.9 + slowdown = 0 + offline_slowdown = 0 + offline_vision_restriction = 0 + siemens_coefficient = 0.9 + chest_type = /obj/item/clothing/suit/fluff/nikki + + req_access = list() + req_one_access = list() + + helm_type = null + glove_type = null + boot_type = null + + allowed = list( + /obj/item/device/flashlight, + /obj/item/weapon/tank, + /obj/item/device/suit_cooling_unit, + /obj/item/weapon/storage, + ) + +/obj/item/weapon/rig/nikki/attackby(obj/item/W, mob/living/user) + //This thing accepts ONLY mounted sizeguns. That's IT. Nothing else! + if(open && istype(W,/obj/item/rig_module) && !istype(W,/obj/item/rig_module/mounted/sizegun)) + to_chat(user, "\The [src] only accepts mounted size gun modules.") + return + ..() + +/obj/item/weapon/rig/nikki/mob_can_equip(var/mob/living/carbon/human/M, slot, disable_warning = 0) // Feel free to (try to) put Nikki's hat on! The necklace though is a flat-out no-go. + if(..()) + if (M.ckey == "ryumi") + return 1 + else if (M.get_active_hand() == src) + to_chat(M, "For some reason, the necklace seems to never quite get past your head when you try to put it on... Weird, it looked like it would fit.") + return 0 + //Nickcrazy - Damon Bones Xrim /obj/item/clothing/suit/storage/toggle/bomber/bombersec name = "Security Bomber Jacket" diff --git a/code/modules/vore/resizing/sizegun_vr.dm b/code/modules/vore/resizing/sizegun_vr.dm index 7fdd357d7f..863fad54fc 100644 --- a/code/modules/vore/resizing/sizegun_vr.dm +++ b/code/modules/vore/resizing/sizegun_vr.dm @@ -82,3 +82,8 @@ /obj/item/projectile/beam/sizelaser/grow set_size = 2.0 //200% of current size + +/obj/item/weapon/gun/energy/sizegun/mounted + name = "mounted size gun" + self_recharge = 1 + use_external_power = 1 \ No newline at end of file diff --git a/icons/obj/rig_modules_vr.dmi b/icons/obj/rig_modules_vr.dmi new file mode 100644 index 0000000000..1ee2c008aa Binary files /dev/null and b/icons/obj/rig_modules_vr.dmi differ diff --git a/icons/vore/custom_clothes_left_hand_vr.dmi b/icons/vore/custom_clothes_left_hand_vr.dmi new file mode 100644 index 0000000000..ec5dd4b55a Binary files /dev/null and b/icons/vore/custom_clothes_left_hand_vr.dmi differ diff --git a/icons/vore/custom_clothes_right_hand_vr.dmi b/icons/vore/custom_clothes_right_hand_vr.dmi new file mode 100644 index 0000000000..2fc3bdb14f Binary files /dev/null and b/icons/vore/custom_clothes_right_hand_vr.dmi differ diff --git a/icons/vore/custom_clothes_vr.dmi b/icons/vore/custom_clothes_vr.dmi index 52ef983f10..80b46f62af 100644 Binary files a/icons/vore/custom_clothes_vr.dmi and b/icons/vore/custom_clothes_vr.dmi differ diff --git a/icons/vore/custom_onmob_32x48_vr.dmi b/icons/vore/custom_onmob_32x48_vr.dmi new file mode 100644 index 0000000000..2889db5cc0 Binary files /dev/null and b/icons/vore/custom_onmob_32x48_vr.dmi differ diff --git a/icons/vore/custom_onmob_vr.dmi b/icons/vore/custom_onmob_vr.dmi index 1dbfb6d011..0c723da5e8 100644 Binary files a/icons/vore/custom_onmob_vr.dmi and b/icons/vore/custom_onmob_vr.dmi differ diff --git a/vorestation.dme b/vorestation.dme index a047dab4b2..0dee74e1e4 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -2024,6 +2024,7 @@ #include "code\modules\clothing\spacesuits\rig\modules\specific\jetpack.dm" #include "code\modules\clothing\spacesuits\rig\modules\specific\metalfoam_launcher.dm" #include "code\modules\clothing\spacesuits\rig\modules\specific\mounted_gun.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\mounted_gun_vr.dm" #include "code\modules\clothing\spacesuits\rig\modules\specific\pat_module_vr.dm" #include "code\modules\clothing\spacesuits\rig\modules\specific\powersink.dm" #include "code\modules\clothing\spacesuits\rig\modules\specific\rescue_pharm_vr.dm"