From abbf0c7fc02cff66324c9f8122e46edda3e3ff2d Mon Sep 17 00:00:00 2001 From: Leshana Date: Sun, 8 May 2016 22:43:37 -0400 Subject: [PATCH] Issue #4 - Porting resize (micro/macro) systems. * Instead of "playerscale" we are using pre-existing variable "size_multiplier" but we move it to /mob/living * Added basic mechanics of size changing. * Mousetraps snap small people even if they have shoes. * Big people can walk over small people, or stomp them, or capture them in foot slot. * Ported holder for micros, making small people scoopable. * Tied held micros in with the vore code so they are edible. * Ported size-altering reagents and recipies. * Ported size gun along with associated sprites and sounds. --- code/_helpers/global_lists_vr.dm | 14 +- code/modules/assembly/mousetrap.dm | 4 +- code/modules/hydroponics/seed_datums_vr.dm | 34 ++++ .../living/carbon/human/human_attackhand.dm | 5 + .../mob/living/carbon/human/human_defines.dm | 4 +- code/modules/mob/living/living.dm | 13 ++ .../Chemistry-Reagents-Vore_vr.dm | 140 +++++++++++++ code/modules/reagents/Chemistry-Recipes_vr.dm | 65 ++++++ .../reagent_containers/glass/bottle_vr.dm | 22 ++ code/modules/vore/eating/living_vr.dm | 16 +- code/modules/vore/resizing/grav_pull_vr.dm | 63 ++++++ code/modules/vore/resizing/holder_micro_vr.dm | 33 +++ code/modules/vore/resizing/resize_vr.dm | 191 ++++++++++++++++++ code/modules/vore/resizing/sizegun_vr.dm | 76 +++++++ icons/obj/gun_vr.dmi | Bin 0 -> 632 bytes sound/weapons/gauss_shoot.ogg | Bin 0 -> 22879 bytes vorestation.dme | 8 + 17 files changed, 680 insertions(+), 8 deletions(-) create mode 100644 code/modules/hydroponics/seed_datums_vr.dm create mode 100644 code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Vore_vr.dm create mode 100644 code/modules/reagents/Chemistry-Recipes_vr.dm create mode 100644 code/modules/reagents/reagent_containers/glass/bottle_vr.dm create mode 100644 code/modules/vore/resizing/grav_pull_vr.dm create mode 100644 code/modules/vore/resizing/holder_micro_vr.dm create mode 100644 code/modules/vore/resizing/resize_vr.dm create mode 100644 code/modules/vore/resizing/sizegun_vr.dm create mode 100644 icons/obj/gun_vr.dmi create mode 100644 sound/weapons/gauss_shoot.ogg diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm index b344368341..eb18d09eb3 100644 --- a/code/_helpers/global_lists_vr.dm +++ b/code/_helpers/global_lists_vr.dm @@ -1,3 +1,15 @@ +/** + * VOREStation global lists +*/ + +//stores numeric player size options indexed by name +var/global/list/player_sizes_list = list( + "Macro" = RESIZE_HUGE, + "Big" = RESIZE_BIG, + "Normal" = RESIZE_NORMAL, + "Small" = RESIZE_SMALL, + "Tiny" = RESIZE_TINY) + //Important items that are preserved when people are digested, cryo'd, etc. var/global/list/important_items = list( /obj/item/weapon/hand_tele, @@ -60,4 +72,4 @@ var/global/list/struggle_sounds = list( "Squish1" = 'sound/vore/squish1.ogg', "Squish2" = 'sound/vore/squish2.ogg', "Squish3" = 'sound/vore/squish3.ogg', - "Squish4" = 'sound/vore/squish4.ogg') \ No newline at end of file + "Squish4" = 'sound/vore/squish4.ogg') diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index b731905e5f..e0150e2ab1 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -28,11 +28,11 @@ var/mob/living/carbon/human/H = target switch(type) if("feet") - if(!H.shoes) + if(!H.shoes || H.get_effective_size() < RESIZE_SMALL) affecting = H.get_organ(pick("l_leg", "r_leg")) H.Weaken(3) if("l_hand", "r_hand") - if(!H.gloves) + if(!H.gloves || H.get_effective_size() < RESIZE_SMALL) affecting = H.get_organ(type) H.Stun(3) if(affecting) diff --git a/code/modules/hydroponics/seed_datums_vr.dm b/code/modules/hydroponics/seed_datums_vr.dm new file mode 100644 index 0000000000..ff66b960d6 --- /dev/null +++ b/code/modules/hydroponics/seed_datums_vr.dm @@ -0,0 +1,34 @@ + +//Vore Originals + +/datum/seed/size + name = "microm" + seed_name = "Shrinking Mushroom" + display_name = "Shrinking mushroom trees" + mutants = list("megam") + kitchen_tag = "microm" + chems = list("microcillin" = list(1,20)) + +/datum/seed/size/New() + ..() + set_trait(TRAIT_HARVEST_REPEAT,1) + set_trait(TRAIT_MATURATION,6) + set_trait(TRAIT_PRODUCTION,6) + set_trait(TRAIT_YIELD,3) + set_trait(TRAIT_POTENCY,15) + set_trait(TRAIT_PRODUCT_ICON,"sizeshroom") + set_trait(TRAIT_PRODUCT_COLOUR,"#DA00DA") + set_trait(TRAIT_PLANT_ICON,"tree") + + +/datum/seed/size/megam + name = "megam" + seed_name = "Mega Mushroom" + display_name = "Mega mushroom trees" + mutants = list("microm") + kitchen_tag = "megam" + chems = list("macrocillin" = list(1,20)) + +/datum/seed/size/megam/New() + ..() + set_trait(TRAIT_PRODUCT_COLOUR,"#DADA00") diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 56a47f918b..370a63c8e4 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -56,6 +56,11 @@ switch(M.a_intent) if(I_HELP) + + // VOREStation Edit - Begin + if (istype(H) && attempt_to_scoop(H)) + return 0; + // VOREStation Edit - End if(istype(H) && health < config.health_threshold_crit && health > config.health_threshold_dead) if(!H.check_has_mouth()) H << "You don't have a mouth, you cannot perform CPR!" diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 0a21d4d5bc..026bd9681e 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -23,7 +23,9 @@ var/g_skin = 0 var/b_skin = 0 - var/size_multiplier = 1 //multiplier for the mob's icon size + // VoreStation (Moved to /mob/living) + // var/size_multiplier = 1 //multiplier for the mob's icon size + var/damage_multiplier = 1 //multiplies melee combat damage var/icon_update = 1 //whether icon updating shall take place diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index b3fa6e43ea..d4a79bc3ee 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -88,6 +88,13 @@ default behaviour is: if((tmob.mob_always_swap || (tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || src.restrained())) && tmob.canmove && canmove && !tmob.buckled && !buckled && !dense && can_move_mob(tmob, 1, 0)) // mutual brohugs all around! var/turf/oldloc = loc forceMove(tmob.loc) + + // VOREStation Edit - Begin + // In case of micros, we don't swap positions; instead occupying the same square! + if (handle_micro_bump_helping(tmob)) return + // TODO - Check if we need to do something about the slime.UpdateFeed() we are skipping below. + // VOREStation Edit - End + tmob.forceMove(oldloc) now_pushing = 0 for(var/mob/living/carbon/slime/slime in view(1,tmob)) @@ -101,6 +108,12 @@ default behaviour is: if(a_intent == I_HELP || src.restrained()) now_pushing = 0 return + + // VOREStation Edit - Begin + // Handle grabbing, stomping, and such of micros! + if(handle_micro_bump_other(tmob)) return + // VOREStation Edit - End + if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations)) if(prob(40) && !(FAT in src.mutations)) src << "You fail to push [tmob]'s fat ass out of the way." diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Vore_vr.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Vore_vr.dm new file mode 100644 index 0000000000..c45e18121e --- /dev/null +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Vore_vr.dm @@ -0,0 +1,140 @@ + +//////////////////////////// +/// NW's shrinking serum /// +//////////////////////////// + +/datum/reagent/macrocillin + name = "Macrocillin" + id = "macrocillin" + description = "Glowing yellow liquid." + reagent_state = LIQUID + color = "#FFFF00" // rgb: 255, 255, 0 + metabolism = 2.5 + +/datum/reagent/macrocillin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + ..() + for(var/size in list(RESIZE_SMALL, RESIZE_NORMAL, RESIZE_BIG, RESIZE_HUGE)) + if(M.size_multiplier < size) + M.resize(size) + M << "You grow!" + break + return + +/datum/reagent/microcillin + name = "Microcillin" + id = "microcillin" + description = "Murky purple liquid." + reagent_state = LIQUID + color = "#800080" + metabolism = 2.5 + +/datum/reagent/microcillin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + ..() + for(var/size in list(RESIZE_BIG, RESIZE_NORMAL, RESIZE_SMALL, RESIZE_TINY)) + if(M.size_multiplier > size) + M.resize(size) + M << "You shrink!" + break; + return + + +/datum/reagent/normalcillin + name = "Normalcillin" + id = "normalcillin" + description = "Translucent cyan liquid." + reagent_state = LIQUID + color = "#00FFFF" + metabolism = 2.5 + +/datum/reagent/normalcillin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + ..() + if(M.size_multiplier > RESIZE_BIG) + M.resize(RESIZE_BIG) + M << "You shrink!" + else if(M.size_multiplier > RESIZE_NORMAL) + M.resize(RESIZE_NORMAL) + M << "You shrink!" + else if(M.size_multiplier < RESIZE_NORMAL) + M.resize(RESIZE_NORMAL) + M << "You grow!" + else if(M.size_multiplier < RESIZE_SMALL) + M.resize(RESIZE_SMALL) + M << "You grow!" + return + + +/datum/reagent/sizeoxadone + name = "Sizeoxadone" + id = "sizeoxadone" + description = "A volatile liquid used as a precursor to size-altering chemicals. Causes dizziness if taken unprocessed." + reagent_state = LIQUID + color = "#1E90FF" + overdose = REAGENTS_OVERDOSE + +/datum/reagent/sizeoxadone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + ..() + M.make_dizzy(1) + if(!M.confused) M.confused = 1 + M.confused = max(M.confused, 20) + return + + +////////////////////////// Anti-Noms Drugs ////////////////////////// + +/datum/reagent/ickypak + name = "Ickypak" + id = "ickypak" + description = "A foul-smelling green liquid, for inducing muscle contractions to expel accidentally ingested things." + reagent_state = LIQUID + color = "#0E900E" + overdose = REAGENTS_OVERDOSE + +/datum/reagent/ickypak/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + ..() + M.make_dizzy(1) + M.adjustHalLoss(2) + + for(var/I in M.vore_organs) + var/datum/belly/B = M.vore_organs[I] + for(var/atom/movable/A in B.internal_contents) + if(isliving(A)) + var/mob/living/P = A + if(P.absorbed) + continue + if(prob(5)) + playsound(M, 'sound/effects/splat.ogg', 50, 1) + B.release_specific_contents(A) + return + + +/datum/reagent/unsorbitol + name = "Unsorbitol" + id = "unsorbitol" + description = "A frothy pink liquid, for causing cellular-level hetrogenous structure separation." + reagent_state = LIQUID + color = "#EF77E5" + overdose = REAGENTS_OVERDOSE + +/datum/reagent/unsorbitol/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + ..() + M.make_dizzy(1) + M.adjustHalLoss(1) + if(!M.confused) M.confused = 1 + M.confused = max(M.confused, 20) + M.hallucination += 15 + + for(var/I in M.vore_organs) + var/datum/belly/B = M.vore_organs[I] + + if(B.digest_mode == DM_ABSORB) //Turn off absorbing on bellies + B.digest_mode = DM_HOLD + + for(var/mob/living/P in B.internal_contents) + if(!P.absorbed) + continue + + else if(prob(1)) + playsound(M, 'sound/vore/schlorp.ogg', 50, 1) + P.absorbed = 0 + M.visible_message("Something spills into [M]'s [lowertext(B.name)]!") + return diff --git a/code/modules/reagents/Chemistry-Recipes_vr.dm b/code/modules/reagents/Chemistry-Recipes_vr.dm new file mode 100644 index 0000000000..ec8d8ceb87 --- /dev/null +++ b/code/modules/reagents/Chemistry-Recipes_vr.dm @@ -0,0 +1,65 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// Micro/Macro chemicals + +/datum/chemical_reaction/sizeoxadone + name = "sizeoxadone" + id = "sizeoxadone" + result = "sizeoxadone" + required_reagents = list("clonexadone" = 1, "tramadol" = 3, "phoron" = 1) + catalysts = list("phoron" = 5) + result_amount = 5 + +/datum/chemical_reaction/macrocillin + name = "Macrocillin" + id = "macrocillin" + result = "macrocillin" + // POLARISTODO requires_heating = 1 + required_reagents = list("sizeoxadone" = 20, "diethylamine" = 20) + result_amount = 1 + +/datum/chemical_reaction/microcillin + name = "Microcillin" + id = "microcillin" + result = "microcillin" + // POLARISTODO requires_heating = 1 + required_reagents = list("sizeoxadone" = 20, "sodiumchloride" = 20) + result_amount = 1 + +/datum/chemical_reaction/normalcillin + name = "Normalcillin" + id = "normalcillin" + result = "normalcillin" + // POLARISTODO requires_heating = 1 + required_reagents = list("sizeoxadone" = 20, "leporazine" = 20) + result_amount = 1 + +/datum/chemical_reaction/dontcrossthebeams + name = "Don't Cross The Beams" + id = "dontcrossthebeams" + result = null + required_reagents = list("microcillin" = 1, "macrocillin" = 1) + +/datum/chemical_reaction/dontcrossthebeams/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + playsound(location, 'sound/weapons/gauss_shoot.ogg', 50, 1) + var/datum/effect/effect/system/grav_pull/s = new /datum/effect/effect/system/grav_pull + s.set_up(3, 3, location) + s.start() + holder.clear_reagents() + +/////////////////////////////////////////////////////////////////////////////////// +/// Vore Drugs + +/datum/chemical_reaction/ickypak + name = "Ickypak" + id = "ickypak" + result = "ickypak" + required_reagents = list("hyperzine" = 4, "fluorosurfactant" = 1) + result_amount = 5 + +/datum/chemical_reaction/unsorbitol + name = "Unsorbitol" + id = "unsorbitol" + result = "unsorbitol" + required_reagents = list("mutagen" = 3, "lipozine" = 2) + result_amount = 5 diff --git a/code/modules/reagents/reagent_containers/glass/bottle_vr.dm b/code/modules/reagents/reagent_containers/glass/bottle_vr.dm new file mode 100644 index 0000000000..ee4e60058f --- /dev/null +++ b/code/modules/reagents/reagent_containers/glass/bottle_vr.dm @@ -0,0 +1,22 @@ +/obj/item/weapon/reagent_containers/glass/bottle/ickypak + name = "ickypak bottle" + desc = "A small bottle of ickypak. The smell alone makes you gag." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle-3" + +/obj/item/weapon/reagent_containers/glass/bottle/ickypak/New() + ..() + reagents.add_reagent("ickypak", 60) + update_icon() + + +/obj/item/weapon/reagent_containers/glass/bottle/unsorbitol + name = "unsorbitol bottle" + desc = "A small bottle of unsorbitol. Sickeningly sweet." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle-3" + +/obj/item/weapon/reagent_containers/glass/bottle/unsorbitol/New() + ..() + reagents.add_reagent("unsorbitol", 60) + update_icon() diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm index cf156ee7b7..4c7324570d 100644 --- a/code/modules/vore/eating/living_vr.dm +++ b/code/modules/vore/eating/living_vr.dm @@ -65,7 +65,7 @@ //Things we can eat with vore code var/list/vore_items = list( /obj/item/weapon/grab, - /obj/item/weapon/holder) + /obj/item/weapon/holder/micro) if(!(I.type in vore_items)) return 0 @@ -106,11 +106,19 @@ else log_debug("[attacker] attempted to feed [G.affecting] to [src] ([src.type]) but it failed.") - //Handle case: /obj/item/weapon/holder - if(/obj/item/weapon/holder) - return 1 + if(/obj/item/weapon/holder/micro) + var/obj/item/weapon/holder/H = I + if(!isliving(user)) return 0 // Return 0 to continue upper procs + var/mob/living/attacker = user // Typecast to living + + if (is_vore_predator(src)) + for (var/mob/living/M in H.contents) + attacker.eat_held_mob(attacker, M, src) + return 1 //Return 1 to exit upper procs + else + log_debug("[attacker] attempted to feed [H.contents] to [src] ([src.type]) but it is not predator-capable") return 0 diff --git a/code/modules/vore/resizing/grav_pull_vr.dm b/code/modules/vore/resizing/grav_pull_vr.dm new file mode 100644 index 0000000000..921d1ab2b9 --- /dev/null +++ b/code/modules/vore/resizing/grav_pull_vr.dm @@ -0,0 +1,63 @@ +// +// Gravity Pull effect which draws in movable objects to its center. +// In this case, "number" refers to the range. directions is ignored. +// +/datum/effect/effect/system/grav_pull + var/pull_radius = 3 + var/pull_anchored = 0 + var/break_windows = 0 + +/datum/effect/effect/system/grav_pull/set_up(range, num, loca) + pull_radius = range + number = num + if(istype(loca, /turf/)) + location = loca + else + location = get_turf(loca) + +/datum/effect/effect/system/grav_pull/start() + spawn(0) + if(holder) + src.location = get_turf(holder) + for(var/i=0, i < number, i++) + do_pull() + sleep(25) + +/datum/effect/effect/system/grav_pull/proc/do_pull() + //following is adapted from supermatter and singulo code + if(defer_powernet_rebuild != 2) + defer_powernet_rebuild = 1 + + // Let's just make this one loop. + for(var/atom/X in orange(pull_radius, location)) + // Movable atoms only + if(istype(X, /atom/movable)) + if(istype(X, /obj/effect/overlay)) continue + if(X && !istype(X, /mob/living/carbon/human)) + if(break_windows && istype(X, /obj/structure/window)) //shatter windows + var/obj/structure/window/W = X + W.ex_act(2.0) + + if(istype(X, /obj)) + var/obj/O = X + if(O.anchored) + if (!pull_anchored) continue // Don't pull anchored stuff unless configured + step_towards(X, location) // step just once if anchored + continue + + step_towards(X, location) // Step twice + step_towards(X, location) + + else if(istype(X,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = X + if(istype(H.shoes,/obj/item/clothing/shoes/magboots)) + var/obj/item/clothing/shoes/magboots/M = H.shoes + if(M.magpulse) + step_towards(H, location) //step just once with magboots + continue + step_towards(H, location) //step twice + step_towards(H, location) + + if(defer_powernet_rebuild != 2) + defer_powernet_rebuild = 0 + return diff --git a/code/modules/vore/resizing/holder_micro_vr.dm b/code/modules/vore/resizing/holder_micro_vr.dm new file mode 100644 index 0000000000..5cdecd9039 --- /dev/null +++ b/code/modules/vore/resizing/holder_micro_vr.dm @@ -0,0 +1,33 @@ +// Micro Holders - Extends /obj/item/weapon/holder + +/obj/item/weapon/holder/micro + name = "micro" + desc = "Another crewmember, small enough to fit in your hand." + icon_state = "micro" + slot_flags = SLOT_FEET | SLOT_HEAD | SLOT_ID + w_class = 2 + item_icons = null // Override value from parent. We don't have magic sprites. + pixel_y = 0 // Override value from parent. + +/obj/item/weapon/holder/micro/examine(var/mob/user) + for(var/mob/living/M in contents) + M.examine(user) + +/obj/item/weapon/holder/MouseDrop(mob/M as mob) + ..() + if(M != usr) return + if(usr == src) return + if(!Adjacent(usr)) return + if(istype(M,/mob/living/silicon/ai)) return + for(var/mob/living/carbon/human/O in contents) + O.show_inv(usr) + +/obj/item/weapon/holder/micro/attack_self(var/mob/living/user) + for(var/mob/living/carbon/human/M in contents) + M.help_shake_act(user) + +/obj/item/weapon/holder/micro/update_state() + // If any items have been dropped by contained mob, drop them to floor. + for(var/obj/O in contents) + O.forceMove(get_turf(src)) + ..() diff --git a/code/modules/vore/resizing/resize_vr.dm b/code/modules/vore/resizing/resize_vr.dm new file mode 100644 index 0000000000..c81051a3f8 --- /dev/null +++ b/code/modules/vore/resizing/resize_vr.dm @@ -0,0 +1,191 @@ + +//these aren't defines so they can stay in this file +var/const/RESIZE_HUGE = 2 +var/const/RESIZE_BIG = 1.5 +var/const/RESIZE_NORMAL = 1 +var/const/RESIZE_SMALL = 0.5 +var/const/RESIZE_TINY = 0.25 + +//average +var/const/RESIZE_A_HUGEBIG = (RESIZE_HUGE + RESIZE_BIG) / 2 +var/const/RESIZE_A_BIGNORMAL = (RESIZE_BIG + RESIZE_NORMAL) / 2 +var/const/RESIZE_A_NORMALSMALL = (RESIZE_NORMAL + RESIZE_SMALL) / 2 +var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2 + +// Adding needed defines to /mob/living +// Note: Polaris had this on /mob/living/carbon/human We need it higher up for animals and stuff. +/mob/living + var/size_multiplier = 1 //multiplier for the mob's icon size + +// Define holder_type on types we want to be scoop-able +/mob/living/carbon/human + holder_type = /obj/item/weapon/holder/micro + +/** + * Scale up the size of a mob's icon by the size_multiplier. + * NOTE: mob/living/carbon/human/update_icons() has a more complicated system and + * is already applying this transform. BUT, it does not call ..() + * as long as that is true, we should be fine. If that changes we need to + * re-evaluate. + */ +/mob/living/update_icons() + ASSERT(!ishuman(src)) + var/matrix/M = matrix() + M.Scale(size_multiplier) + M.Translate(0, 16*(size_multiplier-1)) + src.transform = M + +/** + * Get the effective size of a mob. + * Currently this is based only on size_multiplier for micro/macro stuff, + * but in the future we may also incorporate the "mob_size", so that + * a macro mouse is still only effectively "normal" or a micro dragon is still large etc. + */ +/mob/living/proc/get_effective_size() + return src.size_multiplier + +/** + * Resizes the mob immediately to the desired mod, animating it growing/shrinking. + * It can be used by anything that calls it. + */ +/mob/living/proc/resize(var/new_size) + var/matrix/resize = matrix() // Defines the matrix to change the player's size + resize.Scale(new_size) //Change the size of the matrix + + if(new_size >= RESIZE_NORMAL) + resize.Translate(0, -1 * (1 - new_size) * 16) //Move the player up in the tile so their feet align with the bottom + + animate(src, transform = resize, time = 5) //Animate the player resizing + size_multiplier = new_size //Change size_multiplier so that other items can interact with them + +/** + * Verb proc for a command that lets players change their size OOCly. + * Ace was here! Redid this a little so we'd use math for shrinking characters. This is the old code. + */ +/mob/living/proc/set_size() + set name = "Set Character Size" + set category = "Vore" + var/nagmessage = "DO NOT ABUSE THESE COMMANDS. They are not here for you to play with. \ + We were originally going to remove them but kept them for popular demand. \ + Do not abuse their existence outside of ERP scenes where they apply, \ + or reverting OOCly unwanted changes like someone lolshooting the crew with a shrink ray. -Ace" + + var/size_name = input(nagmessage, "Pick a Size") in player_sizes_list + if (size_name && player_sizes_list[size_name]) + src.resize(player_sizes_list[size_name]) + message_admins("[key_name(src)] used the resize command in-game to be [size_name]. \ + ([src ? "JMP" : "null"])") + +/** Add the set_size() proc to usable verbs. */ +/hook/living_new/proc/resize_setup(mob/living/M) + M.verbs += /mob/living/proc/set_size + return 1 + +/** + * Attempt to scoop up this mob up into M's hands, if the size difference is large enough. + * @return false if normal code should continue, 1 to prevent normal code. + */ +/mob/living/proc/attempt_to_scoop(var/mob/living/carbon/human/M) + if(!istype(M)) + return 0; + if(M.get_effective_size() - src.get_effective_size() >= 0.75) + var/obj/item/weapon/holder/m_holder = get_scooped(M) + if (m_holder) + return 1 + else + return 0; // Unable to scoop, let other code run + +/** + * Handle bumping into someone with helping intent. + * Called from /mob/living/Bump() in the 'brohugs all around' section. + * @return false if normal code should continue, 1 to prevent normal code. + * // TODO - can the now_pushing = 0 be moved up? What does it do anyway? + */ +/mob/living/proc/handle_micro_bump_helping(var/mob/living/tmob) + if(src.get_effective_size() <= RESIZE_A_SMALLTINY && tmob.get_effective_size() <= RESIZE_A_SMALLTINY) + // Both small! Go ahead and + now_pushing = 0 + return 1 + if(abs(src.get_effective_size() - tmob.get_effective_size()) >= 0.75) + now_pushing = 0 + if(src.get_effective_size() > tmob.get_effective_size()) + var/mob/living/carbon/human/M = src + if(0) // POLARISTODO istaur(src) && M.taur_style == 2) + src << "You carefully slither around [tmob]." + tmob << "[src]'s huge tail slithers past beside you!" + else + src << "You carefully step over [tmob]." + tmob << "[src] steps over you carefully!" + if(tmob.get_effective_size() > src.get_effective_size()) + var/mob/living/carbon/human/M = tmob + if(0) // POLARISTODO istaur(src) && M.taur == 2) + src << "You jump over [tmob]'s thick tail." + tmob << "[src] bounds over your tail." + else + src << "You run between [tmob]'s legs." + tmob << "[src] runs between your legs." + return 1 + +/** + * Handle bumping into someone without mutual help intent. + * Called from /mob/living/Bump() + * NW was here, adding even more options for stomping! + * + * @return false if normal code should continue, 1 to prevent normal code. + */ +/mob/living/proc/handle_micro_bump_other(var/mob/living/tmob) + ASSERT(istype(tmob)) // Baby don't hurt me + + if(src.a_intent == I_DISARM && src.canmove && !src.buckled) + // If bigger than them by at least 0.75, move onto them and print message. + if((src.get_effective_size() - tmob.get_effective_size()) >= 0.75) + now_pushing = 0 + src.forceMove(tmob.loc) + tmob.Stun(4) + + var/mob/living/carbon/human/M = src + if(0) // POLARISTODO istaur(src) && M.taur_style == 2) + src << "You carefully squish [tmob] under your tail!" + tmob << "[src] pins you under their tail!" + else + src << "You pin [tmob] beneath your foot!" + tmob << "[src] pins you beneath their foot!" + return 1 + + if(src.a_intent == I_HURT && src.canmove && !src.buckled) + if((src.get_effective_size() - tmob.get_effective_size()) >= 0.75) + now_pushing = 0 + src.forceMove(tmob.loc) + tmob.apply_damage(10, HALLOSS) + + var/mob/living/carbon/human/M = src + if(0) // POLARISTODO istaur(src) && M.taur_style == 2) + src << "You steamroller over [tmob] with your heavy tail!" + tmob << "[src] ploughs you down mercilessly with their heavy tail!" + else + src << "You bring your foot down heavily upon [tmob]!" + tmob << "[src] steps carelessly on your body!" + return 1 + + if(src.a_intent == I_GRAB && src.canmove && !src.buckled) + if((src.get_effective_size() - tmob.get_effective_size()) >= 0.75) + now_pushing = 0 + src.forceMove(tmob.loc) + + var/mob/living/carbon/human/M = src + if(istype(M) && !M.shoes) + // User is a human (capable of scooping) and not wearing shoes! Scoop into foot slot! + equip_to_slot_if_possible(tmob.get_scooped(M), slot_shoes, 0, 1) + if(0) // POLARISTODO M.taur == 2) + src << "You wrap up [tmob] with your powerful tail!" + tmob << "[src] binds you with their powerful tail!" + else + src << "You clench your toes around [tmob]'s body!" + tmob << "[src] grabs your body with their toes!" + else if(0) // POLARISTODO istaur(src) && M.taur_style == 2) + src << "You carefully squish [tmob] under your tail!" + tmob << "[src] pins you under their tail!" + else + src << "You pin [tmob] beneath your foot!" + tmob << "[src] pins you beneath their foot!" + return 1 diff --git a/code/modules/vore/resizing/sizegun_vr.dm b/code/modules/vore/resizing/sizegun_vr.dm new file mode 100644 index 0000000000..6e2510b28f --- /dev/null +++ b/code/modules/vore/resizing/sizegun_vr.dm @@ -0,0 +1,76 @@ +// +// Size Gun +// + +/obj/item/weapon/gun/energy/sizegun + name = "shrink ray" + desc = "A highly advanced ray gun with two settings: Shrink and Grow. Warning: Do not insert into mouth." + icon = 'icons/obj/gun_vr.dmi' + icon_state = "sizegun-shrink100" // Someone can probably do better. -Ace + item_state = null //so the human update icon uses the icon_state instead + fire_sound = 'sound/weapons/wave.ogg' + charge_cost = 100 + projectile_type = /obj/item/projectile/beam/shrinklaser + origin_tech = "redspace=1;bluespace=4" + modifystate = "sizegun-shrink" + self_recharge = 1 + firemodes = list( + list(mode_name = "grow", + projectile_type = /obj/item/projectile/beam/growlaser, + modifystate = "sizegun-grow", + fire_sound = 'sound/weapons/pulse3.ogg' + ), + list(mode_name = "shrink", + projectile_type = /obj/item/projectile/beam/shrinklaser, + modifystate = "sizegun-shrink", + fire_sound = 'sound/weapons/wave.ogg' + )) + +// +// Beams for size gun +// + +/obj/item/projectile/beam/shrinklaser + name = "shrink beam" + icon_state = "laser" + nodamage = 1 + damage = 0 + check_armour = "laser" + +/obj/item/projectile/beam/shrinklaser/on_hit(var/atom/target, var/blocked = 0) + if(istype(target, /mob/living)) + var/mob/living/M = target + switch(M.size_multiplier) + if(RESIZE_HUGE to INFINITY) + M.resize(RESIZE_BIG) + if(RESIZE_BIG to RESIZE_HUGE) + M.resize(RESIZE_NORMAL) + if(RESIZE_NORMAL to RESIZE_BIG) + M.resize(RESIZE_SMALL) + if((0 - INFINITY) to RESIZE_NORMAL) + M.resize(RESIZE_TINY) + M.update_icons() + return 1 + + +/obj/item/projectile/beam/growlaser + name = "growth beam" + icon_state = "bluelaser" + nodamage = 1 + damage = 0 + check_armour = "laser" + +/obj/item/projectile/beam/growlaser/on_hit(var/atom/target, var/blocked = 0) + if(istype(target, /mob/living)) + var/mob/living/M = target + switch(M.size_multiplier) + if(RESIZE_BIG to RESIZE_HUGE) + M.resize(RESIZE_HUGE) + if(RESIZE_NORMAL to RESIZE_BIG) + M.resize(RESIZE_BIG) + if(RESIZE_SMALL to RESIZE_NORMAL) + M.resize(RESIZE_NORMAL) + if((0 - INFINITY) to RESIZE_TINY) + M.resize(RESIZE_SMALL) + M.update_icons() + return 1 diff --git a/icons/obj/gun_vr.dmi b/icons/obj/gun_vr.dmi new file mode 100644 index 0000000000000000000000000000000000000000..f90f7b2a915d13db6cf246e202ecb9fd98ced9d1 GIT binary patch literal 632 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%0Dd^k6#^6Yp#$W35_EFAh71Y!6InD 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

w4r0P}G< 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 literal 0 HcmV?d00001 diff --git a/vorestation.dme b/vorestation.dme index 8fe9400a3f..e446ba7d88 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -1200,6 +1200,7 @@ #include "code\modules\hydroponics\seed.dm" #include "code\modules\hydroponics\seed_controller.dm" #include "code\modules\hydroponics\seed_datums.dm" +#include "code\modules\hydroponics\seed_datums_vr.dm" #include "code\modules\hydroponics\seed_machines.dm" #include "code\modules\hydroponics\seed_mobs.dm" #include "code\modules\hydroponics\seed_packets.dm" @@ -1668,6 +1669,7 @@ #include "code\modules\reagents\Chemistry-Readme.dm" #include "code\modules\reagents\Chemistry-Reagents.dm" #include "code\modules\reagents\Chemistry-Recipes.dm" +#include "code\modules\reagents\Chemistry-Recipes_vr.dm" #include "code\modules\reagents\reagent_containers.dm" #include "code\modules\reagents\reagent_dispenser.dm" #include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Core.dm" @@ -1676,6 +1678,7 @@ #include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Medicine.dm" #include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Other.dm" #include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Toxins.dm" +#include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Vore_vr.dm" #include "code\modules\reagents\dispenser\_defines.dm" #include "code\modules\reagents\dispenser\cartridge.dm" #include "code\modules\reagents\dispenser\cartridge_presets.dm" @@ -1705,6 +1708,7 @@ #include "code\modules\reagents\reagent_containers\food\drinks\bottle\robot.dm" #include "code\modules\reagents\reagent_containers\food\snacks\meat.dm" #include "code\modules\reagents\reagent_containers\glass\bottle.dm" +#include "code\modules\reagents\reagent_containers\glass\bottle_vr.dm" #include "code\modules\reagents\reagent_containers\glass\bottle\robot.dm" #include "code\modules\recycling\conveyor2.dm" #include "code\modules\recycling\disposal-construction.dm" @@ -1892,6 +1896,10 @@ #include "code\modules\vore\eating\vorehooks_vr.dm" #include "code\modules\vore\eating\vorepanel_vr.dm" #include "code\modules\vore\weight\fitness_machines_vr.dm" +#include "code\modules\vore\resizing\grav_pull_vr.dm" +#include "code\modules\vore\resizing\holder_micro_vr.dm" +#include "code\modules\vore\resizing\resize_vr.dm" +#include "code\modules\vore\resizing\sizegun_vr.dm" #include "code\modules\xgm\xgm_gas_data.dm" #include "code\modules\xgm\xgm_gas_mixture.dm" #include "code\unit_tests\loadout_tests.dm"