From d6bf641205dfb3b1b24eb66aeefded52c105d717 Mon Sep 17 00:00:00 2001 From: VerySoft Date: Sun, 28 Nov 2021 21:30:27 -0500 Subject: [PATCH] Updoot --- code/_macros_vr.dm | 1 + .../objects/items/weapons/capture_crystal.dm | 702 ++++++++++++++++-- .../client/preference_setup/vore/09_misc.dm | 10 + code/modules/client/preferences_vr.dm | 22 +- code/modules/vore/eating/living_vr.dm | 21 +- icons/obj/capture_crystal_vr.dmi | Bin 4654 -> 5818 bytes sound/effects/capture-crystal-in.ogg | Bin 0 -> 11371 bytes sound/effects/capture-crystal-negative.ogg | Bin 0 -> 8476 bytes sound/effects/capture-crystal-out.ogg | Bin 0 -> 11216 bytes sound/effects/capture-crystal-problem.ogg | Bin 0 -> 9715 bytes 10 files changed, 697 insertions(+), 59 deletions(-) create mode 100644 sound/effects/capture-crystal-in.ogg create mode 100644 sound/effects/capture-crystal-negative.ogg create mode 100644 sound/effects/capture-crystal-out.ogg create mode 100644 sound/effects/capture-crystal-problem.ogg diff --git a/code/_macros_vr.dm b/code/_macros_vr.dm index 2eecbe69ed..314689541e 100644 --- a/code/_macros_vr.dm +++ b/code/_macros_vr.dm @@ -1 +1,2 @@ #define isbelly(A) istype(A, /obj/belly) +#define iscapturecrystal(A) istype(A, /obj/item/capture_crystal) diff --git a/code/game/objects/items/weapons/capture_crystal.dm b/code/game/objects/items/weapons/capture_crystal.dm index 51bd40f362..c027c9712f 100644 --- a/code/game/objects/items/weapons/capture_crystal.dm +++ b/code/game/objects/items/weapons/capture_crystal.dm @@ -1,110 +1,351 @@ /obj/item/capture_crystal - name = "curious crystal" + name = "Curious Crystal" desc = "A silent, unassuming crystal in what appears to be some kind of steel housing." icon = 'icons/obj/capture_crystal_vr.dmi' icon_state = "inactive" drop_sound = 'sound/items/drop/ring.ogg' pickup_sound = 'sound/items/pickup/ring.ogg' - var/active = FALSE - var/owner - var/mob/living/bound_mob - var/stored_mob = FALSE - var/spawn_mob_type - var/activate_cooldown = 30 SECONDS - var/last_activate + throwforce = 0 + force = 0 + action_button_name = "Command" + + var/active = FALSE //Is it set up? + var/mob/living/owner //Reference to the owner + var/mob/living/bound_mob //Reference to our bound mob + var/spawn_mob_type //The kind of mob an inactive crystal will try to spawn when activated + var/activate_cooldown = 30 SECONDS //How long do we wait between unleashing and recalling + var/last_activate //Automatically set by things that try to move the bound mob or capture things + var/empty_icon = "empty" + var/full_icon = "full" /obj/item/capture_crystal/Initialize() + . = ..() + update_icon() + +//Let's make sure we clean up our references and things if the crystal goes away (such as when it's digested) +/obj/item/capture_crystal/Destroy() + . = ..() + if(bound_mob) + if(bound_mob in contents) + unleash() + to_chat(bound_mob, "You feel like yourself again. You are no longer under the influince of \the [src]'s command.") + UnregisterSignal(bound_mob, COMSIG_PARENT_QDELETING) + bound_mob = null + if(owner) + UnregisterSignal(owner, COMSIG_PARENT_QDELETING) + owner = null + +/obj/item/capture_crystal/examine(user) + . = ..() + if(user == owner) + if(bound_mob) + . += "[bound_mob]'s crystal" + if(isanimal(bound_mob)) + . += "[bound_mob.health / bound_mob.maxHealth * 100]%" + if(bound_mob.ooc_notes) + . += "OOC Notes: \[View\]" + . += "\[Mechanical Vore Preferences\]" + +//Command! This lets the owner toggle hostile on AI controlled mobs, or send a silent command message to your bound mob, wherever they may be. +/obj/item/capture_crystal/ui_action_click() + if(ismob(loc)) + var/mob/living/M = src.loc + if(M != owner) + to_chat(M, "\The [src] emits an unpleasant tone... It does not respond to your command.") + playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1) + return + if(!bound_mob) + to_chat(M, "\The [src] emits an unpleasant tone... There is nothing to command.") + playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1) + return + if(isanimal(bound_mob) && !bound_mob.client) + if(!isnull(bound_mob.get_AI_stance())) + var/datum/ai_holder/AI = bound_mob.ai_holder + AI.hostile = !AI.hostile + if(!AI.hostile) + AI.set_stance(STANCE_IDLE) + to_chat(M, span("notice", "\The [bound_mob] is now [AI.hostile ? "hostile" : "passive"].")) + return + if(bound_mob.client) + var/transmit_msg + transmit_msg = sanitizeSafe(input(usr, "What is your command?", "Command", null) as text, MAX_NAME_LEN) + if(isnull(transmit_msg)) + to_chat(M, "You decided against it.") + return + to_chat(bound_mob, "\The [owner] commands, '[transmit_msg]'") + to_chat(M, "Your command has been transmitted, '[transmit_msg]'") + else + to_chat(M, "\The [src] emits an unpleasant tone... \The [bound_mob] is unresponsive.") + playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1) + else + return + +//Lets the owner get AI controlled bound mobs to follow them, or tells player controlled mobs to follow them. +/obj/item/capture_crystal/verb/follow_owner() + set name = "Toggle Follow" + set category = "Object" + set src in usr + if(ismob(loc)) + var/mob/living/M = src.loc + if(M != owner) + to_chat(M, "\The [src] emits an unpleasant tone... It does not respond to your command.") + playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1) + return + if(bound_mob.stat != CONSCIOUS) + to_chat(M, "\The [src] emits an unpleasant tone... \The [bound_mob] is not able to hear your command.") + playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1) + return + if(bound_mob.client) + to_chat(bound_mob, "\The [owner] wishes for you to follow them.") + return + if(bound_mob in contents) + var/datum/ai_holder/AI = bound_mob.ai_holder + if(AI.leader) + to_chat(M, "\The [src] chimes~ \The [bound_mob] stopped following [AI.leader].") + AI.lose_follow(AI.leader) + else + AI.set_follow(M) + to_chat(M, "\The [src] chimes~ \The [bound_mob] started following following [AI.leader].") + if(!(bound_mob in view(M))) + to_chat(M, "\The [src] emits an unpleasant tone... \The [bound_mob] is not able to hear your command.") + playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1) + return + var/datum/ai_holder/AI = bound_mob.ai_holder + if(AI.leader) + to_chat(M, "\The [src] chimes~ \The [bound_mob] stopped following [AI.leader].") + AI.lose_follow(AI.leader) + else + AI.set_follow(M) + to_chat(M, "\The [src] chimes~ \The [bound_mob] started following following [AI.leader].") + + +/obj/item/capture_crystal/update_icon() . = ..() if(spawn_mob_type) icon_state = "full" - -/obj/item/capture_crystal/attack_self(mob/living/user) - if(world.time < last_activate + activate_cooldown) - to_chat(user, "\The [src] emits an unpleasant tone... It is not ready yet.") return - last_activate = world.time - if(user == bound_mob) + if(!bound_mob) + icon_state = "inactive" + else if(bound_mob in contents) + icon_state = full_icon + else + icon_state = empty_icon + if(!cooldown_check()) + icon_state = "[icon_state]-busy" + +/obj/item/capture_crystal/proc/cooldown_check() + if(world.time < last_activate + activate_cooldown) + return FALSE + else return TRUE + +/obj/item/capture_crystal/attack(mob/living/M, mob/living/user) + if(bound_mob) + if(!bound_mob.devourable) //Don't eat if prefs are bad + return + if(user.zone_sel.selecting == "mouth") //Click while targetting the mouth and you eat/feed the stored mob to whoever you clicked on + if(bound_mob in contents) + user.visible_message("\The [user] moves \the [src] to [M]'s [M.vore_selected]...") + M.perform_the_nom(M, bound_mob, M, M.vore_selected) + return + else if(M == user) //You don't have a mob, you ponder the orb instead of trying to capture yourself + user.visible_message("\The [user] ponders \the [src]...", "You ponder \the [src]...") + return + else //Try to capture someone without throwing + user.visible_message("\The [user] taps \the [M] with \the [src].") + activate(user, M) + +//Tries to unleash or recall your stored mob +/obj/item/capture_crystal/attack_self(mob/living/user) + if(!cooldown_check()) + to_chat(user, "\The [src] emits an unpleasant tone... It is not ready yet.") + playsound(src, 'sound/effects/capture-crystal-problem.ogg', 75, 1, -1) + return + if(user == bound_mob) //You can't recall yourself to_chat(user, "\The [src] emits an unpleasant tone... It does not activate for you.") + playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1) return if(!active) activate(user) return - if(bound_mob && stored_mob) - unleash(user) - else if(bound_mob) - recall(user) - else - to_chat(user, "\The [src] clicks unsatisfyingly.") - active = FALSE - icon_state = "inactive" - owner = null + determine_action(user) +//Make it so the crystal knows if its mob references get deleted to make sure things get cleaned up /obj/item/capture_crystal/proc/knowyoursignals(mob/living/M, mob/living/U) - RegisterSignal(M, COMSIG_PARENT_QDELETING, .proc/mob_was_deleted) - RegisterSignal(U, COMSIG_PARENT_QDELETING, .proc/owner_was_deleted) + RegisterSignal(M, COMSIG_PARENT_QDELETING, .proc/mob_was_deleted, TRUE) + RegisterSignal(U, COMSIG_PARENT_QDELETING, .proc/owner_was_deleted, TRUE) +//The basic capture command does most of the registration work. /obj/item/capture_crystal/proc/capture(mob/living/M, mob/living/U) + if(!M.capture_crystal) + to_chat(U, "This creature is not suitable for capture.") + playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1) + return knowyoursignals(M, U) owner = U if(!bound_mob) bound_mob = M + +//Determines the capture chance! So you can't capture AI mobs if they're perfectly healthy and all that +/obj/item/capture_crystal/proc/capture_chance(mob/living/M) + var/capture_chance = ((1 - (M.health / M.maxHealth)) * 100) + if(M.stat == UNCONSCIOUS) + capture_chance += 10 + else if(M.stat == CONSCIOUS) + capture_chance -= 25 + else + capture_chance = 0 + if(capture_chance <= 0) + capture_chance = 0 + last_activate = world.time + return capture_chance +//Handles checking relevent bans, preferences, and asking the player if they want to be caught +/obj/item/capture_crystal/proc/capture_player(mob/living/M, mob/living/U) + if(jobban_isbanned(M, "GhostRoles")) + to_chat(U, "This creature is not suitable for capture.") + playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1) + return + if(!M.capture_crystal) + to_chat(U, "This creature is not suitable for capture.") + playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1) + return + if(tgui_alert(M, "Would you like to be caught by in [src] by [U]? You will be bound to their will.", "Become Caught",list("No","Yes")) == "Yes") + if(tgui_alert(M, "Are you really sure? The only way to undo this is to OOC escape while you're in the crystal.", "Become Caught", list("No","Yes")) == "Yes") + log_admin("[key_name(M)] has agreed to become caught by [key_name(U)].") + capture(M, U) + recall(U) + +//The clean up procs! /obj/item/capture_crystal/proc/mob_was_deleted() UnregisterSignal(bound_mob, COMSIG_PARENT_QDELETING) bound_mob = null owner = null active = FALSE - icon_state = "inactive" + update_icon() /obj/item/capture_crystal/proc/owner_was_deleted() UnregisterSignal(owner, COMSIG_PARENT_QDELETING) owner = null active = FALSE - icon_state = "inactive" + update_icon() -/obj/item/capture_crystal/proc/activate(mob/living/user) - if(spawn_mob_type && !bound_mob) - bound_mob = new spawn_mob_type(src) +//If the crystal hasn't been set up, it does this +/obj/item/capture_crystal/proc/activate(mob/living/user, target) + if(!cooldown_check()) //Are we ready to do things yet? + to_chat(thrower, "\The [src] clicks unsatisfyingly... It is not ready yet.") + playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1) + return + if(spawn_mob_type && !bound_mob) //We don't already have a mob, but we know what kind of mob we want + bound_mob = new spawn_mob_type(src) //Well let's spawn it then! bound_mob.faction = user.faction - stored_mob = TRUE spawn_mob_type = null capture(bound_mob, user) - if(bound_mob) + if(bound_mob) //We have a mob! Let's finish setting up. user.visible_message("\The [src] clicks, and then emits a small chime.", "\The [src] grows warm in your hand, something inside is awake.") active = TRUE - unleash(user) - else - to_chat(user, "\The [src] clicks unsatisfyingly.") + if(!owner) //Do we have an owner? It's pretty unlikely that this would ever happen! But it happens, let's claim the crystal. + owner = user + unleash(user, target) + return + if(isliving(target)) //So we don't have a mob, let's try to claim one! Is the target a mob? + var/mob/living/M = target + if(M.stat == DEAD) //Is it dead? We can't influence dead things. + playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1) + to_chat(user, "\The [src] clicks unsatisfyingly... \The [M] is not in a state to be captured.") + return + if(M.client) //Is it player controlled? + capture_player(M, user) //We have to do things a little differently if so. + return + if(!isanimal(M)) //So it's not player controlled, but it's also not a simplemob? + to_chat(user, "This creature is not suitable for capture.") + playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1) + return + var/mob/living/simple_mob/S = M + if(!S.ai_holder) //We don't really want to capture simplemobs that don't have an AI + to_chat(user, "This creature is not suitable for capture.") + playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1) + return + if(prob(capture_chance(S))) //OKAY! So we have an NPC simplemob with an AI, let's calculate its capture chance! It varies based on the mob's condition. + capture(S, user) //We did it! Woo! We capture it! + user.visible_message("\The [src] clicks, and then emits a small chime.", "Alright! \The [S] was caught!") + recall(user) + active = TRUE + update_icon() + spawn(activate_cooldown) + update_icon() + else //Shoot, it didn't work and now it's mad!!! + S.ai_holder.go_wake() + S.ai_holder.target = user + S.ai_holder.track_target_position() + S.ai_holder.set_stance(STANCE_FIGHT) + visible_message("\The [src] bonks into \the [S], angering it!") + update_icon() + spawn(activate_cooldown) + update_icon() + return + //The target is not a mob, so let's not do anything. + playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1) + to_chat(user, "\The [src] clicks unsatisfyingly.") -/obj/item/capture_crystal/proc/recall(mob/living/user) - if(bound_mob in view(user)) - //flick_overlay_view(coolanimation, bound_mob.loc, 11, FALSE) +//We're using the crystal, but what will it do? +/obj/item/capture_crystal/proc/determine_action(mob/living/U) + if(!cooldown_check()) //Are we ready yet? + to_chat(thrower, "\The [src] clicks unsatisfyingly... It is not ready yet.") + playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1) + return //No + if(bound_mob in contents) //Do we have our mob? + unleash(U) //Yes, let's let it out! + else if (bound_mob) //Do we HAVE a mob? + recall(U) //Yes, let's try to put it back in the crystal + else //No we don't have a mob, let's reset the crystal. + to_chat(U, "\The [src] clicks unsatisfyingly.") + active = FALSE + update_icon() + owner = null + playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1) + +//Let's try to call our mob back! +/obj/item/capture_crystal/proc/recall(mob/living/user, atom/target) + if(bound_mob in view(user)) //We can only recall it if we can see it var/turf/turfmemory = get_turf(bound_mob) if(isanimal(bound_mob)) var/mob/living/simple_mob/M = bound_mob - M.ai_holder.go_sleep() + M.ai_holder.go_sleep() //AI doesn't need to think when it's in the crystal bound_mob.forceMove(src) - icon_state = "full" - stored_mob = TRUE + last_activate = world.time bound_mob.visible_message("\The [user]'s [src] flashes, disappearing [bound_mob] in an instant!!!", "\The [src] pulls you back into confinement in a flash of light!!!") animate_action(turfmemory) + playsound(src, 'sound/effects/capture-crystal-in.ogg', 75, 1, -1) + update_icon() + spawn(activate_cooldown) //We wait for the cooldown to go by + update_icon() else to_chat(user, "\The [src] clicks and emits a small, unpleasant tone. \The [bound_mob] cannot be recalled.") +//Let's let our mob out! /obj/item/capture_crystal/proc/unleash(mob/living/user, atom/target) - if(!target) + if(!user && !target) //We got thrown but we're not sure who did it, let's go to where the crystal is + bound_mob.forceMove(src.drop_location()) + return + if(!target) //We know who wants to let us out, but they didn't say where, so let's drop us on them bound_mob.forceMove(user.drop_location()) - else - bound_mob.forceMove(target) - icon_state = "empty" - stored_mob = FALSE - //flick_overlay_view(coolanimation, bound_mob, 11, FALSE) + else //We got thrown! Let's go where we got thrown + bound_mob.forceMove(target.drop_location()) + last_activate = world.time if(isanimal(bound_mob)) var/mob/living/simple_mob/M = bound_mob - M.ai_holder.go_wake() - bound_mob.visible_message("\The [user]'s [src] flashes, \the [bound_mob] appears in an instant!!!", "The world around you rematerialize as you are unleashed from the [src] next to \the [user].") + M.ai_holder.go_wake() //Okay it's time to do work, let's wake up! + if(!M.client && !M.ghostjoin) + M.ghostjoin = 1 //Players playing mobs is fun! + bound_mob.faction = owner.faction //Let's make sure we aren't hostile to our owner or their friends + bound_mob.visible_message("\The [user]'s [src] flashes, \the [bound_mob] appears in an instant!!!", "The world around you rematerialize as you are unleashed from the [src] next to \the [user]. You feel a strong compulsion to enact \the [owner]'s will.") animate_action(get_turf(bound_mob)) + playsound(src, 'sound/effects/capture-crystal-out.ogg', 75, 1, -1) + update_icon() + spawn(activate_cooldown) + update_icon() +//Let's make a flashy sparkle when someone appears or disappears! /obj/item/capture_crystal/proc/animate_action(atom/thing) var/image/coolanimation = image('icons/obj/capture_crystal_vr.dmi', null, "animation") coolanimation.plane = PLANE_LIGHTING_ABOVE @@ -112,20 +353,367 @@ sleep(11) thing.overlays -= coolanimation +//IF the crystal somehow ends up in a tummy and digesting with a bound mob who doesn't want to be eaten, let's move them to the ground /obj/item/capture_crystal/digest_act(var/atom/movable/item_storage = null) - if(bound_mob && bound_mob.digestable) - return TRUE - else - return FALSE + if(bound_mob in contents && !bound_mob.devourable) + bound_mob.forceMove(src.drop_location()) + return ..() +//We got thrown! Let's figure out what to do /obj/item/capture_crystal/throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, datum/callback/callback) . = ..() - if(!stored_mob || !bound_mob) + if(target == bound_mob && thrower != bound_mob) //We got thrown at our bound mob (and weren't thrown by the bound mob) let's ignore the cooldown and just put them back in + recall(thrower) return - sleep(10) - unleash(thrower, target) + if(!cooldown_check()) //OTHERWISE let's obey the cooldown + to_chat(thrower, "\The [src] emits an soft tone... It is not ready yet.") + playsound(src, 'sound/effects/capture-crystal-problem.ogg', 75, 1, -1) + return + if(!active) //The ball isn't set up, let's try to set it up. + if(isliving(target)) //We're hitting a mob, let's try to capture it. + sleep(10) + activate(thrower, target) + return + sleep(10) + activate(thrower, src) + return + if(!bound_mob) //We hit something else, and we don't have a mob, so we can't really do anything! + to_chat(thrower, "\The [src] clicks unpleasantly...") + playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1) + return + if(bound_mob in contents) //We have our mob! Let's try to let it out. + sleep(10) + unleash(thrower, src) + update_icon() + else //Our mob isn't here, we can't do anything. + to_chat(thrower, "\The [src] clicks unpleasantly...") + playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1) -/obj/item/capture_crystal/woof + +/obj/item/capture_crystal/cass spawn_mob_type = /mob/living/simple_mob/vore/woof/cass /obj/item/capture_crystal/adg spawn_mob_type = /mob/living/simple_mob/mechanical/mecha/combat/gygax/dark/advanced +/obj/item/capture_crystal/bigdragon + spawn_mob_type = /mob/living/simple_mob/vore/bigdragon +/obj/item/capture_crystal/bigdragon/friendly + spawn_mob_type = /mob/living/simple_mob/vore/bigdragon/friendly + +/obj/item/capture_crystal/teppi + spawn_mob_type = /mob/living/simple_mob/vore/alienanimals/teppi +/obj/item/capture_crystal/broodmother + spawn_mob_type = /mob/living/simple_mob/animal/giant_spider/broodmother + +/obj/item/capture_crystal/random + var/static/list/possible_mob_types = list( + list(/mob/living/simple_mob/animal/goat), + list( + /mob/living/simple_mob/animal/passive/bird, + /mob/living/simple_mob/animal/passive/bird/azure_tit, + /mob/living/simple_mob/animal/passive/bird/black_bird, + /mob/living/simple_mob/animal/passive/bird/european_robin, + /mob/living/simple_mob/animal/passive/bird/goldcrest, + /mob/living/simple_mob/animal/passive/bird/ringneck_dove, + /mob/living/simple_mob/animal/passive/bird/parrot, + /mob/living/simple_mob/animal/passive/bird/parrot/black_headed_caique, + /mob/living/simple_mob/animal/passive/bird/parrot/budgerigar, + /mob/living/simple_mob/animal/passive/bird/parrot/budgerigar/blue, + /mob/living/simple_mob/animal/passive/bird/parrot/budgerigar/bluegreen, + /mob/living/simple_mob/animal/passive/bird/parrot/cockatiel, + /mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/grey, + /mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/white, + /mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/yellowish, + /mob/living/simple_mob/animal/passive/bird/parrot/eclectus, + /mob/living/simple_mob/animal/passive/bird/parrot/grey_parrot, + /mob/living/simple_mob/animal/passive/bird/parrot/kea, + /mob/living/simple_mob/animal/passive/bird/parrot/pink_cockatoo, + /mob/living/simple_mob/animal/passive/bird/parrot/sulphur_cockatoo, + /mob/living/simple_mob/animal/passive/bird/parrot/white_caique, + /mob/living/simple_mob/animal/passive/bird/parrot/white_cockatoo + ), + list( + /mob/living/simple_mob/animal/passive/cat, + /mob/living/simple_mob/animal/passive/cat/black + ), + list(/mob/living/simple_mob/animal/passive/chick), + list(/mob/living/simple_mob/animal/passive/cow), + list(/mob/living/simple_mob/animal/passive/dog/brittany), + list(/mob/living/simple_mob/animal/passive/dog/corgi), + list(/mob/living/simple_mob/animal/passive/dog/tamaskan), + list(/mob/living/simple_mob/animal/passive/fox), + list(/mob/living/simple_mob/animal/passive/hare), + list(/mob/living/simple_mob/animal/passive/lizard), + list(/mob/living/simple_mob/animal/passive/mouse), + list(/mob/living/simple_mob/animal/passive/mouse/jerboa), + list(/mob/living/simple_mob/animal/passive/opossum), + list(/mob/living/simple_mob/animal/passive/pillbug), + list(/mob/living/simple_mob/animal/passive/snake), + list(/mob/living/simple_mob/animal/passive/tindalos), + list(/mob/living/simple_mob/animal/passive/yithian), + list( + /mob/living/simple_mob/animal/wolf, + /mob/living/simple_mob/animal/wolf/direwolf + ), + list(/mob/living/simple_mob/vore/rabbit), + list(/mob/living/simple_mob/vore/redpanda), + list(/mob/living/simple_mob/vore/woof), + list(/mob/living/simple_mob/vore/fennec), + list(/mob/living/simple_mob/vore/fennix), + list(/mob/living/simple_mob/vore/hippo), + list(/mob/living/simple_mob/vore/horse), + list(/mob/living/simple_mob/vore/bee), + list( + /mob/living/simple_mob/animal/space/bear, + /mob/living/simple_mob/animal/space/bear/brown + ), + list( + /mob/living/simple_mob/otie/feral, + /mob/living/simple_mob/otie/feral/chubby, + /mob/living/simple_mob/otie/red, + /mob/living/simple_mob/otie/red/chubby + ), + list(/mob/living/simple_mob/animal/sif/diyaab), + list(/mob/living/simple_mob/animal/sif/duck), + list(/mob/living/simple_mob/animal/sif/frostfly), + list( + /mob/living/simple_mob/animal/sif/glitterfly =50, + /mob/living/simple_mob/animal/sif/glitterfly/rare = 1 + ), + list( + /mob/living/simple_mob/animal/sif/kururak = 10, + /mob/living/simple_mob/animal/sif/kururak/leader = 1, + /mob/living/simple_mob/animal/sif/kururak/hibernate = 2, + ), + list( + /mob/living/simple_mob/animal/sif/sakimm = 10, + /mob/living/simple_mob/animal/sif/sakimm/intelligent = 1 + ), + list(/mob/living/simple_mob/animal/sif/savik) = 5, + list( + /mob/living/simple_mob/animal/sif/shantak = 10, + /mob/living/simple_mob/animal/sif/shantak/leader = 1 + ), + list(/mob/living/simple_mob/animal/sif/siffet), + list(/mob/living/simple_mob/animal/sif/tymisian), + list( + /mob/living/simple_mob/animal/giant_spider/nurse = 10, + /mob/living/simple_mob/animal/giant_spider/electric = 5, + /mob/living/simple_mob/animal/giant_spider/frost = 5, + /mob/living/simple_mob/animal/giant_spider/hunter = 10, + /mob/living/simple_mob/animal/giant_spider/ion = 5, + /mob/living/simple_mob/animal/giant_spider/lurker = 10, + /mob/living/simple_mob/animal/giant_spider/pepper = 10, + /mob/living/simple_mob/animal/giant_spider/phorogenic = 10, + /mob/living/simple_mob/animal/giant_spider/thermic = 5, + /mob/living/simple_mob/animal/giant_spider/tunneler = 10, + /mob/living/simple_mob/animal/giant_spider/webslinger = 5 + ), + list( + /mob/living/simple_mob/animal/wolf = 10, + /mob/living/simple_mob/animal/wolf/direwolf = 1 + ), + list(/mob/living/simple_mob/creature/strong), + list(/mob/living/simple_mob/faithless/strong), + list(/mob/living/simple_mob/animal/goat), + list( + /mob/living/simple_mob/animal/sif/shantak/leader = 1, + /mob/living/simple_mob/animal/sif/shantak = 10), + list(/mob/living/simple_mob/animal/sif/savik,), + list(/mob/living/simple_mob/animal/sif/hooligan_crab), + list( + /mob/living/simple_mob/animal/space/alien = 50, + /mob/living/simple_mob/animal/space/alien/drone = 40, + /mob/living/simple_mob/animal/space/alien/sentinel = 25, + /mob/living/simple_mob/animal/space/alien/sentinel/praetorian = 15, + /mob/living/simple_mob/animal/space/alien/queen = 10, + /mob/living/simple_mob/animal/space/alien/queen/empress = 5, + /mob/living/simple_mob/animal/space/alien/queen/empress/mother = 1 + ), + list(/mob/living/simple_mob/animal/space/bats/cult/strong), + list( + /mob/living/simple_mob/animal/space/bear, + /mob/living/simple_mob/animal/space/bear/brown + ), + list( + /mob/living/simple_mob/animal/space/carp = 50, + /mob/living/simple_mob/animal/space/carp/large = 10, + /mob/living/simple_mob/animal/space/carp/large/huge = 5 + ), + list(/mob/living/simple_mob/animal/space/goose), + list(/mob/living/simple_mob/animal/space/jelly), + list(/mob/living/simple_mob/animal/space/tree), + list( + /mob/living/simple_mob/vore/aggressive/corrupthound = 10, + /mob/living/simple_mob/vore/aggressive/corrupthound/prettyboi = 1, + ), + list(/mob/living/simple_mob/vore/aggressive/deathclaw), + list(/mob/living/simple_mob/vore/aggressive/dino), + list(/mob/living/simple_mob/vore/aggressive/dragon), + list(/mob/living/simple_mob/vore/aggressive/dragon/virgo3b), + list(/mob/living/simple_mob/vore/aggressive/frog), + list(/mob/living/simple_mob/vore/aggressive/giant_snake), + list(/mob/living/simple_mob/vore/aggressive/mimic), + list(/mob/living/simple_mob/vore/aggressive/panther), + list(/mob/living/simple_mob/vore/aggressive/rat), + list(/mob/living/simple_mob/vore/bee), + list( + /mob/living/simple_mob/vore/sect_drone = 10, + /mob/living/simple_mob/vore/sect_queen = 1 + ), + list(/mob/living/simple_mob/vore/solargrub), + list( + /mob/living/simple_mob/vore/oregrub = 5, + /mob/living/simple_mob/vore/oregrub/lava = 1 + ), + list(/mob/living/simple_mob/vore/catgirl), + list(/mob/living/simple_mob/vore/wolfgirl), + list( + /mob/living/simple_mob/vore/lamia, + /mob/living/simple_mob/vore/lamia/albino, + /mob/living/simple_mob/vore/lamia/albino/bra, + /mob/living/simple_mob/vore/lamia/albino/shirt, + /mob/living/simple_mob/vore/lamia/bra, + /mob/living/simple_mob/vore/lamia/cobra, + /mob/living/simple_mob/vore/lamia/cobra/bra, + /mob/living/simple_mob/vore/lamia/cobra/shirt, + /mob/living/simple_mob/vore/lamia/copper, + /mob/living/simple_mob/vore/lamia/copper/bra, + /mob/living/simple_mob/vore/lamia/copper/shirt, + /mob/living/simple_mob/vore/lamia/green, + /mob/living/simple_mob/vore/lamia/green/bra, + /mob/living/simple_mob/vore/lamia/green/shirt, + /mob/living/simple_mob/vore/lamia/zebra, + /mob/living/simple_mob/vore/lamia/zebra/bra, + /mob/living/simple_mob/vore/lamia/zebra/shirt + ), + list( + /mob/living/simple_mob/humanoid/merc = 100, + /mob/living/simple_mob/humanoid/merc/melee/sword = 50, + /mob/living/simple_mob/humanoid/merc/ranged = 25, + /mob/living/simple_mob/humanoid/merc/ranged/grenadier = 1, + /mob/living/simple_mob/humanoid/merc/ranged/ionrifle = 10, + /mob/living/simple_mob/humanoid/merc/ranged/laser = 5, + /mob/living/simple_mob/humanoid/merc/ranged/rifle = 5, + /mob/living/simple_mob/humanoid/merc/ranged/smg = 5, + /mob/living/simple_mob/humanoid/merc/ranged/sniper = 1, + /mob/living/simple_mob/humanoid/merc/ranged/space = 10, + /mob/living/simple_mob/humanoid/merc/ranged/technician = 5 + ), + list( + /mob/living/simple_mob/humanoid/pirate = 3, + /mob/living/simple_mob/humanoid/pirate/ranged = 1 + ), + list(/mob/living/simple_mob/mechanical/combat_drone), + list(/mob/living/simple_mob/mechanical/corrupt_maint_drone), + list( + /mob/living/simple_mob/mechanical/hivebot = 100, + /mob/living/simple_mob/mechanical/hivebot/ranged_damage = 20, + /mob/living/simple_mob/mechanical/hivebot/ranged_damage/backline = 10, + /mob/living/simple_mob/mechanical/hivebot/ranged_damage/basic = 20, + /mob/living/simple_mob/mechanical/hivebot/ranged_damage/dot = 5, + /mob/living/simple_mob/mechanical/hivebot/ranged_damage/ion = 20, + /mob/living/simple_mob/mechanical/hivebot/ranged_damage/laser = 10, + /mob/living/simple_mob/mechanical/hivebot/ranged_damage/rapid = 2, + /mob/living/simple_mob/mechanical/hivebot/ranged_damage/siege = 1, + /mob/living/simple_mob/mechanical/hivebot/ranged_damage/siege/emp = 5, + /mob/living/simple_mob/mechanical/hivebot/ranged_damage/siege/fragmentation = 1, + /mob/living/simple_mob/mechanical/hivebot/ranged_damage/siege/radiation = 1, + /mob/living/simple_mob/mechanical/hivebot/ranged_damage/strong = 3, + /mob/living/simple_mob/mechanical/hivebot/ranged_damage/strong/guard = 3, + /mob/living/simple_mob/mechanical/hivebot/support = 8, + /mob/living/simple_mob/mechanical/hivebot/support/commander = 5, + /mob/living/simple_mob/mechanical/hivebot/support/commander/autofollow = 10, + /mob/living/simple_mob/mechanical/hivebot/swarm = 20, + /mob/living/simple_mob/mechanical/hivebot/tank = 20, + /mob/living/simple_mob/mechanical/hivebot/tank/armored = 20, + /mob/living/simple_mob/mechanical/hivebot/tank/armored/anti_bullet = 20, + /mob/living/simple_mob/mechanical/hivebot/tank/armored/anti_laser = 20, + /mob/living/simple_mob/mechanical/hivebot/tank/armored/anti_melee = 20, + /mob/living/simple_mob/mechanical/hivebot/tank/meatshield = 20 + ), + list(/mob/living/simple_mob/mechanical/infectionbot), + list(/mob/living/simple_mob/mechanical/mining_drone), + list(/mob/living/simple_mob/mechanical/technomancer_golem), + list( + /mob/living/simple_mob/mechanical/viscerator, + /mob/living/simple_mob/mechanical/viscerator/piercing + ), + list(/mob/living/simple_mob/mechanical/wahlem), + list(/mob/living/simple_mob/animal/passive/fox/syndicate), + list(/mob/living/simple_mob/animal/passive/fox), + list(/mob/living/simple_mob/animal/wolf/direwolf), + list(/mob/living/simple_mob/animal/space/jelly), + list( + /mob/living/simple_mob/otie/feral, + /mob/living/simple_mob/otie/feral/chubby, + /mob/living/simple_mob/otie/red, + /mob/living/simple_mob/otie/red/chubby + ), + list( + /mob/living/simple_mob/shadekin/blue/ai = 100, + /mob/living/simple_mob/shadekin/green/ai = 50, + /mob/living/simple_mob/shadekin/orange/ai = 20, + /mob/living/simple_mob/shadekin/purple/ai = 60, + /mob/living/simple_mob/shadekin/red/ai = 40, + /mob/living/simple_mob/shadekin/yellow/ai = 1 + ), + list( + /mob/living/simple_mob/vore/aggressive/corrupthound, + /mob/living/simple_mob/vore/aggressive/corrupthound/prettyboi + ), + list(/mob/living/simple_mob/vore/aggressive/deathclaw), + list(/mob/living/simple_mob/vore/aggressive/dino), + list(/mob/living/simple_mob/vore/aggressive/dragon), + list(/mob/living/simple_mob/vore/aggressive/dragon/virgo3b), + list(/mob/living/simple_mob/vore/aggressive/frog), + list(/mob/living/simple_mob/vore/aggressive/giant_snake), + list(/mob/living/simple_mob/vore/aggressive/mimic), + list(/mob/living/simple_mob/vore/aggressive/panther), + list(/mob/living/simple_mob/vore/aggressive/rat), + list(/mob/living/simple_mob/vore/bee), + list(/mob/living/simple_mob/vore/catgirl), + list(/mob/living/simple_mob/vore/cookiegirl), + list(/mob/living/simple_mob/vore/fennec), + list(/mob/living/simple_mob/vore/fennix), + list(/mob/living/simple_mob/vore/hippo), + list(/mob/living/simple_mob/vore/horse), + list(/mob/living/simple_mob/vore/oregrub), + list(/mob/living/simple_mob/vore/rabbit), + list( + /mob/living/simple_mob/vore/redpanda = 50, + /mob/living/simple_mob/vore/redpanda/fae = 1 + ), + list( + /mob/living/simple_mob/vore/sect_drone = 10, + /mob/living/simple_mob/vore/sect_queen = 1 + ), + list(/mob/living/simple_mob/vore/solargrub), + list(/mob/living/simple_mob/vore/woof), + list(/mob/living/simple_mob/vore/alienanimals/teppi), + list(/mob/living/simple_mob/vore/alienanimals/space_ghost), + list(/mob/living/simple_mob/vore/alienanimals/catslug), + list(/mob/living/simple_mob/vore/alienanimals/space_jellyfish), + list(/mob/living/simple_mob/vore/alienanimals/startreader), + list(/mob/living/simple_mob/vore/bigdragon), + list( + /mob/living/simple_mob/vore/leopardmander = 50, + /mob/living/simple_mob/vore/leopardmander/blue = 10, + /mob/living/simple_mob/vore/leopardmander/exotic = 1 + ), + list(/mob/living/simple_mob/vore/sheep), + list( + /mob/living/simple_mob/vore/greatwolf, + /mob/living/simple_mob/vore/greatwolf/black, + /mob/living/simple_mob/vore/greatwolf/grey + ), + list(/mob/living/simple_mob/vore/weretiger) + ) + +/obj/item/capture_crystal/random/Initialize() + var/subchoice = pickweight(possible_mob_types) //Some of the lists have nested lists, so let's pick one of them + var/choice = pickweight(subchoice) //And then we'll pick something from whatever's left + spawn_mob_type = choice //Now when someone uses this, we'll spawn whatever we picked! + return ..() + +/mob/living + var/capture_crystal = TRUE //If TRUE, the mob is capturable. Otherwise it isn't. \ No newline at end of file diff --git a/code/modules/client/preference_setup/vore/09_misc.dm b/code/modules/client/preference_setup/vore/09_misc.dm index 60a207bcc8..fff3bb6af4 100644 --- a/code/modules/client/preference_setup/vore/09_misc.dm +++ b/code/modules/client/preference_setup/vore/09_misc.dm @@ -8,6 +8,7 @@ S["directory_erptag"] >> pref.directory_erptag S["directory_ad"] >> pref.directory_ad S["sensorpref"] >> pref.sensorpref + S["capture_crystal"] >> pref.capture_crystal /datum/category_item/player_setup_item/vore/misc/save_character(var/savefile/S) S["show_in_directory"] << pref.show_in_directory @@ -15,17 +16,21 @@ S["directory_erptag"] << pref.directory_erptag S["directory_ad"] << pref.directory_ad S["sensorpref"] << pref.sensorpref + S["capture_crystal"] << pref.capture_crystal + /datum/category_item/player_setup_item/vore/misc/copy_to_mob(var/mob/living/carbon/human/character) if(pref.sensorpref > 5 || pref.sensorpref < 1) pref.sensorpref = 5 character.sensorpref = pref.sensorpref + character.capture_crystal = pref.capture_crystal /datum/category_item/player_setup_item/vore/misc/sanitize_character() pref.show_in_directory = sanitize_integer(pref.show_in_directory, 0, 1, initial(pref.show_in_directory)) pref.directory_tag = sanitize_inlist(pref.directory_tag, GLOB.char_directory_tags, initial(pref.directory_tag)) pref.directory_erptag = sanitize_inlist(pref.directory_erptag, GLOB.char_directory_erptags, initial(pref.directory_erptag)) pref.sensorpref = sanitize_integer(pref.sensorpref, 1, sensorpreflist.len, initial(pref.sensorpref)) + pref.capture_crystal = sanitize_integer(pref.capture_crystal, 0, 1, initial(pref.capture_crystal)) /datum/category_item/player_setup_item/vore/misc/content(var/mob/user) . += "
" @@ -34,6 +39,7 @@ . += "Character Directory ERP Tag: [pref.directory_erptag]
" . += "Character Directory Advertisement: Set Directory Ad
" . += "Suit Sensors Preference: [sensorpreflist[pref.sensorpref]]
" + . += "Capture Crystal Preference [pref.capture_crystal ? "Yes" : "No"]
" /datum/category_item/player_setup_item/vore/misc/OnTopic(var/href, var/list/href_list, var/mob/user) if(href_list["toggle_show_in_directory"]) @@ -60,4 +66,8 @@ if (!isnull(new_sensorpref) && CanUseTopic(user)) pref.sensorpref = sensorpreflist.Find(new_sensorpref) return TOPIC_REFRESH + else if(href_list["toggle_capture_crystal"]) + pref.capture_crystal = pref.capture_crystal ? 0 : 1; + return TOPIC_REFRESH + return ..(); diff --git a/code/modules/client/preferences_vr.dm b/code/modules/client/preferences_vr.dm index 6bba9fe31e..9aebb70bfc 100644 --- a/code/modules/client/preferences_vr.dm +++ b/code/modules/client/preferences_vr.dm @@ -4,6 +4,7 @@ var/directory_erptag = "Unset" //ditto, but for non-vore scenes var/directory_ad = "" //Advertisement stuff to show in character directory. var/sensorpref = 5 //Set character's suit sensor level + var/capture_crystal = 1 //Whether or not someone is able to be caught with capture crystals var/job_talon_high = 0 var/job_talon_med = 0 @@ -72,7 +73,7 @@ feedback_add_details("admin_verb","TEmoteNoise") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/verb/toggle_ghost_quiets() - set name = "Toggle Whisper/Subtle Vis" + set name = "Toggle Ghost Privacy" set category = "Preferences" set desc = "Toggle ghosts viewing your subtles/whispers." @@ -85,3 +86,22 @@ SScharacter_setup.queue_preferences_save(prefs) feedback_add_details("admin_verb","TWhisubtleVis") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/verb/toggle_capture_crystal() + set name = "Toggle Catchable" + set category = "Preferences" + set desc = "Toggle being catchable with capture crystals." + + var/mob/living/L = mob + + if(prefs.capture_crystal) + to_chat(src, "You are no longer catchable.") + prefs.capture_crystal = 0 + else + to_chat(src, "You are now catchable.") + prefs.capture_crystal = 1 + if(L) + L.capture_crystal = prefs.capture_crystal + SScharacter_setup.queue_preferences_save(prefs) + + feedback_add_details("admin_verb","TCaptureCrystal") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! \ No newline at end of file diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm index 593b344da7..d6fdb91eb2 100644 --- a/code/modules/vore/eating/living_vr.dm +++ b/code/modules/vore/eating/living_vr.dm @@ -432,6 +432,14 @@ var/obj/effect/overlay/aiholo/holo = loc holo.drop_prey() //Easiest way log_and_message_admins("[key_name(src)] used the OOC escape button to get out of [key_name(holo.master)] (AI HOLO) ([holo ? "JMP" : "null"])") + + //You're in a capture crystal! ((It's not vore but close enough!)) + else if(iscapturecrystal(loc)) + var/obj/item/capture_crystal/crystal = loc + crystal.unleash() + crystal.bound_mob = null + crystal.bound_mob = capture_crystal = 0 + log_and_message_admins("[key_name(src)] used the OOC escape button to get out of [crystal] owned by [crystal.owner]. [ADMIN_FLW(src)]") //Don't appear to be in a vore situation else @@ -638,7 +646,11 @@ if(S.holding) to_chat(src, "There's something inside!") return - + if(iscapturecrystal(I)) + var/obj/item/capture_crystal/C = I + if(!C.bound_mob.devourable) + to_chat(src, "That doesn't seem like a good idea. (\The [C.bound_mob]'s prefs don't allow it.)") + return drop_item() I.forceMove(vore_selected) updateVRPanel() @@ -692,6 +704,13 @@ else if (istype(I,/obj/item/clothing/accessory/collar)) visible_message("[src] demonstrates their voracious capabilities by swallowing [I] whole!") to_chat(src, "You can taste the submissiveness in the wearer of [I]!") + else if(iscapturecrystal(I)) + var/obj/item/capture_crystal/C = I + if(C.bound_mob && C.bound_mob in C.contents) + if(isbelly(C.loc)) + var/obj/belly/B = C.loc + to_chat(C.bound_mob, "Outside of your crystal, you can see; [B.desc]") + to_chat(src, "You can taste the the power of command.") else to_chat(src, "You can taste the flavor of garbage. Delicious.") return diff --git a/icons/obj/capture_crystal_vr.dmi b/icons/obj/capture_crystal_vr.dmi index 511a6c94d8625e2a3cd3689ee7ae5ce5759b46d5..7cd9208b2b9355066a078621a6955bdccc17925e 100644 GIT binary patch literal 5818 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 DnIcXS literal 4654 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 diff --git a/sound/effects/capture-crystal-in.ogg b/sound/effects/capture-crystal-in.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b00d7be9c9fac5289a935cc6dcdec10999cc5a5a GIT binary patch literal 11371 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 bHgc2o3EdIU{qaKY#Luy+UYny~dhovhfvRLT literal 0 HcmV?d00001 diff --git a/sound/effects/capture-crystal-problem.ogg b/sound/effects/capture-crystal-problem.ogg new file mode 100644 index 0000000000000000000000000000000000000000..3c0a7b343b0c8763a663c232071749388ac3f256 GIT binary patch literal 9715 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