diff --git a/code/__defines/belly_modes_vr.dm b/code/__defines/belly_modes_vr.dm index aa0d9d616d..e6f072ca0c 100644 --- a/code/__defines/belly_modes_vr.dm +++ b/code/__defines/belly_modes_vr.dm @@ -1,28 +1,38 @@ -// Belly Mode Constants +// Normal digestion modes #define DM_HOLD "Hold" -#define DM_DIGEST "Digest" -#define DM_ITEMWEAK "Digest (Item Friendly)" -#define DM_STRIPDIGEST "Strip Digest (Items Only)" -#define DM_DIGEST_NUMB "Digest (Numbing)" +#define DM_DIGEST "Digest" +#define DM_ABSORB "Absorb" +#define DM_UNABSORB "Unabsorb" +#define DM_DRAIN "Drain" +#define DM_SHRINK "Shrink" +#define DM_GROW "Grow" +#define DM_SIZE_STEAL "Size Steal" #define DM_HEAL "Heal" -#define DM_ABSORB "Absorb" +#define DM_EGG "Encase In Egg" +#define DM_TRANSFORM "Transform" + +//#define DM_ITEMWEAK "Digest (Item Friendly)" +//#define DM_STRIPDIGEST "Strip Digest (Items Only)" +//#define DM_DIGEST_NUMB "Digest (Numbing)" + +//TF modes #define DM_TRANSFORM_HAIR_AND_EYES "Transform (Hair and eyes)" #define DM_TRANSFORM_MALE "Transform (Male)" -#define DM_TRANSFORM_FEMALE "Transform (Female)" +#define DM_TRANSFORM_FEMALE "Transform (Female)" #define DM_TRANSFORM_KEEP_GENDER "Transform (Keep Gender)" #define DM_TRANSFORM_REPLICA "Transform (Replica Of Self)" #define DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR "Transform (Change Species and Taur)" -#define DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG "Transform (Change Species and Taur) (EGG)" +#define DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG "Transform (Change Species and Taur) (EGG)" #define DM_TRANSFORM_REPLICA_EGG "Transform (Replica Of Self) (EGG)" #define DM_TRANSFORM_KEEP_GENDER_EGG "Transform (Keep Gender) (EGG)" #define DM_TRANSFORM_MALE_EGG "Transform (Male) (EGG)" -#define DM_TRANSFORM_FEMALE_EGG "Transform (Female) (EGG)" -#define DM_EGG "Encase In Egg" -#define DM_DRAIN "Drain" -#define DM_UNABSORB "Unabsorb" -#define DM_SHRINK "Shrink" -#define DM_GROW "Grow" -#define DM_SIZE_STEAL "Size Steal" +#define DM_TRANSFORM_FEMALE_EGG "Transform (Female) (EGG)" + +//Addon mode flags +#define DM_FLAG_NUMBING 0x1 +#define DM_FLAG_ITEMWEAK 0x2 +#define DM_FLAG_STRIPPING 0x4 + // Stance for hostile mobs to be in while devouring someone. #define HOSTILE_STANCE_EATING 99 diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index 92ad017cd2..e26724ae5b 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -1223,20 +1223,21 @@ proc/is_hot(obj/item/W as obj) /* Checks if that loc and dir has a item on the wall +TODO - Fix this ancient list of wall items. Preferably make it dynamically populated. ~Leshana */ var/list/WALLITEMS = list( - "/obj/machinery/power/apc", "/obj/machinery/alarm", "/obj/item/device/radio/intercom", - "/obj/structure/extinguisher_cabinet", "/obj/structure/reagent_dispensers/peppertank", - "/obj/machinery/status_display", "/obj/machinery/requests_console", "/obj/machinery/light_switch", "/obj/effect/sign", - "/obj/machinery/newscaster", "/obj/machinery/firealarm", "/obj/structure/noticeboard", "/obj/machinery/door_control", - "/obj/machinery/computer/security/telescreen", "/obj/machinery/embedded_controller/radio/simple_vent_controller", - "/obj/item/weapon/storage/secure/safe", "/obj/machinery/door_timer", "/obj/machinery/flasher", "/obj/machinery/keycard_auth", - "/obj/structure/mirror", "/obj/structure/closet/fireaxecabinet", "/obj/machinery/computer/security/telescreen/entertainment" + /obj/machinery/power/apc, /obj/machinery/alarm, /obj/item/device/radio/intercom, /obj/structure/frame, + /obj/structure/extinguisher_cabinet, /obj/structure/reagent_dispensers/peppertank, + /obj/machinery/status_display, /obj/machinery/requests_console, /obj/machinery/light_switch, /obj/structure/sign, + /obj/machinery/newscaster, /obj/machinery/firealarm, /obj/structure/noticeboard, /obj/machinery/button/remote, + /obj/machinery/computer/security/telescreen, /obj/machinery/embedded_controller/radio, + /obj/item/weapon/storage/secure/safe, /obj/machinery/door_timer, /obj/machinery/flasher, /obj/machinery/keycard_auth, + /obj/structure/mirror, /obj/structure/closet/fireaxecabinet, /obj/machinery/computer/security/telescreen/entertainment ) /proc/gotwallitem(loc, dir) for(var/obj/O in loc) for(var/item in WALLITEMS) - if(istype(O, text2path(item))) + if(istype(O, item)) //Direction works sometimes if(O.dir == dir) return 1 @@ -1260,7 +1261,7 @@ var/list/WALLITEMS = list( //Some stuff is placed directly on the wallturf (signs) for(var/obj/O in get_step(loc, dir)) for(var/item in WALLITEMS) - if(istype(O, text2path(item))) + if(istype(O, item)) if(O.pixel_x == 0 && O.pixel_y == 0) return 1 return 0 diff --git a/code/_macros_vr.dm b/code/_macros_vr.dm index daa1123574..ca7bccedbe 100644 --- a/code/_macros_vr.dm +++ b/code/_macros_vr.dm @@ -1,2 +1,3 @@ #define isbelly(A) istype(A, /obj/belly) -#define isstorage(A) istype(A, /obj/item/weapon/storage) \ No newline at end of file +#define isstorage(A) istype(A, /obj/item/weapon/storage) +#define isitem(A) istype(A, /obj/item) diff --git a/code/datums/supplypacks/recreation_vr.dm b/code/datums/supplypacks/recreation_vr.dm index 859a026d85..7a08d9e156 100644 --- a/code/datums/supplypacks/recreation_vr.dm +++ b/code/datums/supplypacks/recreation_vr.dm @@ -19,7 +19,7 @@ /obj/item/stack/cable_coil/random, /obj/item/clothing/accessory/collar/shock, /obj/item/clothing/suit/straight_jacket, - /obj/item/weapon/handcuffs/legcuffs, + /obj/item/weapon/handcuffs/legcuffs/fuzzy, /obj/item/weapon/melee/fluff/holochain/mass, /obj/item/weapon/material/twohanded/fluff/riding_crop, /obj/item/clothing/under/fluff/latexmaid diff --git a/code/game/machinery/frame.dm b/code/game/machinery/frame.dm index 3e998e87d6..f1f2ec0834 100644 --- a/code/game/machinery/frame.dm +++ b/code/game/machinery/frame.dm @@ -12,11 +12,6 @@ else construction_frame_floor += type - var/datum/frame/frame_types/cancel/cancel = new /datum/frame/frame_types/cancel - construction_frame_wall += cancel - construction_frame_floor += cancel - - ////////////////////////////// // Frame Type Datum - Describes the frame structures that can be created from a frame item. ////////////////////////////// @@ -180,9 +175,6 @@ x_offset = 24 y_offset = 24 -/datum/frame/frame_types/cancel //used to get out of input dialogue - name = "Cancel" - ////////////////////////////// // Frame Object (Structure) ////////////////////////////// diff --git a/code/game/machinery/wall_frames.dm b/code/game/machinery/wall_frames.dm index 1765eac3ec..3f538d8377 100644 --- a/code/game/machinery/wall_frames.dm +++ b/code/game/machinery/wall_frames.dm @@ -29,8 +29,8 @@ update_type_list() var/datum/frame/frame_types/frame_type if(!build_machine_type) - var/datum/frame/frame_types/response = input(user, "What kind of frame would you like to make?", "Frame type request", null) in frame_types_floor - if(!response || response.name == "Cancel") + var/datum/frame/frame_types/response = input(user, "What kind of frame would you like to make?", "Frame type request", null) as null|anything in frame_types_floor + if(!response) return frame_type = response @@ -54,18 +54,6 @@ /obj/item/frame/proc/try_build(turf/on_wall, mob/user as mob) update_type_list() - var/datum/frame/frame_types/frame_type - if(!build_machine_type) - var/datum/frame/frame_types/response = input(user, "What kind of frame would you like to make?", "Frame type request", null) in frame_types_wall - if(!response || response.name == "Cancel") - return - frame_type = response - - build_machine_type = /obj/structure/frame - - if(frame_type.frame_size != 5) - new /obj/item/stack/material/steel(user.loc, (5 - frame_type.frame_size)) - if(get_dist(on_wall, user)>1) return @@ -92,6 +80,18 @@ to_chat(user, "There's already an item on this wall!") return + var/datum/frame/frame_types/frame_type + if(!build_machine_type) + var/datum/frame/frame_types/response = input(user, "What kind of frame would you like to make?", "Frame type request", null) as null|anything in frame_types_wall + if(!response) + return + frame_type = response + + build_machine_type = /obj/structure/frame + + if(frame_type.frame_size != 5) + new /obj/item/stack/material/steel(user.loc, (5 - frame_type.frame_size)) + var/obj/machinery/M = new build_machine_type(loc, ndir, 1, frame_type) M.fingerprints = fingerprints M.fingerprintshidden = fingerprintshidden diff --git a/code/game/objects/items/apc_frame.dm b/code/game/objects/items/apc_frame.dm index 4b69e5db7c..fd2ea3e94b 100644 --- a/code/game/objects/items/apc_frame.dm +++ b/code/game/objects/items/apc_frame.dm @@ -13,31 +13,31 @@ new /obj/item/stack/material/steel( get_turf(src.loc), 2 ) qdel(src) -/obj/item/frame/apc/try_build(turf/on_wall) - if (get_dist(on_wall,usr)>1) +/obj/item/frame/apc/try_build(turf/on_wall, mob/user as mob) + if (get_dist(on_wall, user)>1) return - var/ndir = get_dir(usr,on_wall) + var/ndir = get_dir(user, on_wall) if (!(ndir in cardinal)) return - var/turf/loc = get_turf(usr) + var/turf/loc = get_turf(user) var/area/A = loc.loc if (!istype(loc, /turf/simulated/floor)) - usr << "APC cannot be placed on this spot." + to_chat(user, "APC cannot be placed on this spot.") return if (A.requires_power == 0 || istype(A, /area/space)) - usr << "APC cannot be placed in this area." + to_chat(user, "APC cannot be placed in this area.") return if (A.get_apc()) - usr << "This area already has an APC." + to_chat(user, "This area already has an APC.") return //only one APC per area for(var/obj/machinery/power/terminal/T in loc) if (T.master) - usr << "There is another network terminal here." + to_chat(user, "There is another network terminal here.") return else var/obj/item/stack/cable_coil/C = new /obj/item/stack/cable_coil(loc) C.amount = 10 - usr << "You cut the cables and disassemble the unused power terminal." + to_chat(user, "You cut the cables and disassemble the unused power terminal.") qdel(T) new /obj/machinery/power/apc(loc, ndir, 1) qdel(src) diff --git a/code/game/objects/items/weapons/handcuffs_vr.dm b/code/game/objects/items/weapons/handcuffs_vr.dm new file mode 100644 index 0000000000..ecafc8b6c3 --- /dev/null +++ b/code/game/objects/items/weapons/handcuffs_vr.dm @@ -0,0 +1,5 @@ +/obj/item/weapon/handcuffs/legcuffs/fuzzy + name = "fuzzy legcuffs" + desc = "Use this to keep... 'prisoners' in line." + icon = 'icons/obj/items_vr.dmi' + icon_state = "fuzzylegcuff" \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/backpack_vr.dm b/code/game/objects/items/weapons/storage/backpack_vr.dm index 9615cc8183..d836d23581 100644 --- a/code/game/objects/items/weapons/storage/backpack_vr.dm +++ b/code/game/objects/items/weapons/storage/backpack_vr.dm @@ -94,6 +94,13 @@ else slowdown = initial(slowdown) return 1 + if(istype(H) && istype(TT, /datum/sprite_accessory/tail/taur/deer)) + item_state = "[icon_base]_Deer" + if(H.size_multiplier >= RESIZE_BIG) //Are they a macro? + slowdown = 0 + else + slowdown = initial(slowdown) + return 1 else H << "[no_message]" return 0 diff --git a/code/game/objects/items/weapons/storage/quickdraw.dm b/code/game/objects/items/weapons/storage/quickdraw.dm index 7d39b6818b..5e6f58fd53 100644 --- a/code/game/objects/items/weapons/storage/quickdraw.dm +++ b/code/game/objects/items/weapons/storage/quickdraw.dm @@ -49,6 +49,7 @@ if(src.loc == user) //Are they carrying us? toggle_quickdraw() + // If we start adding more of these, we'll need to make them their own folder. 'til then, this one should be fine. // ----------------------------- diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm index c83e96ad04..19a83c8e40 100644 --- a/code/game/objects/random/random.dm +++ b/code/game/objects/random/random.dm @@ -274,7 +274,7 @@ prob(1);/obj/item/clothing/suit/storage/vest/heavy/merc, prob(1);/obj/item/weapon/beartrap, prob(1);/obj/item/weapon/handcuffs/fuzzy, - prob(1);/obj/item/weapon/handcuffs/legcuffs, + prob(1);/obj/item/weapon/handcuffs/legcuffs/fuzzy, prob(2);/obj/item/weapon/reagent_containers/syringe/drugs, prob(1);/obj/item/weapon/reagent_containers/syringe/steroid, prob(4);/obj/item/device/radio_jammer, diff --git a/code/game/objects/structures/crates_lockers/largecrate_vr.dm b/code/game/objects/structures/crates_lockers/largecrate_vr.dm index c55a3342ab..014b49b522 100644 --- a/code/game/objects/structures/crates_lockers/largecrate_vr.dm +++ b/code/game/objects/structures/crates_lockers/largecrate_vr.dm @@ -54,6 +54,7 @@ /mob/living/simple_animal/hostile/bear/brown;0.5, /mob/living/simple_animal/hostile/carp, /mob/living/simple_animal/hostile/mimic, + /mob/living/simple_animal/hostile/rous, /mob/living/simple_animal/otie;0.5) ..() diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index cbaf8f8cf8..3186e26e0e 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -311,7 +311,7 @@ qdel(src) else if(istype(W,/obj/item/frame) && anchored) var/obj/item/frame/F = W - F.try_build(src) + F.try_build(src, user) else user.setClickCooldown(user.get_attack_speed(W)) if(W.damtype == BRUTE || W.damtype == BURN) diff --git a/code/game/turfs/flooring/flooring.dm b/code/game/turfs/flooring/flooring.dm index ffa396e811..549265e954 100644 --- a/code/game/turfs/flooring/flooring.dm +++ b/code/game/turfs/flooring/flooring.dm @@ -103,7 +103,7 @@ var/list/flooring_types /decl/flooring/carpet name = "carpet" desc = "Imported and comfy." - icon = 'icons/turf/flooring/carpet_vr.dmi' + icon = 'icons/turf/flooring/carpet.dmi' icon_base = "carpet" build_type = /obj/item/stack/tile/carpet damage_temperature = T0C+200 @@ -337,4 +337,4 @@ var/list/flooring_types build_type = null has_damage_range = 6 flags = TURF_ACID_IMMUNE | TURF_CAN_BREAK - can_paint = null \ No newline at end of file + can_paint = null diff --git a/code/game/turfs/flooring/flooring_premade.dm b/code/game/turfs/flooring/flooring_premade.dm index 73c4053bfa..d80e5f249e 100644 --- a/code/game/turfs/flooring/flooring_premade.dm +++ b/code/game/turfs/flooring/flooring_premade.dm @@ -1,6 +1,6 @@ /turf/simulated/floor/carpet name = "carpet" - icon = 'icons/turf/flooring/carpet_vr.dmi' + icon = 'icons/turf/flooring/carpet.dmi' icon_state = "carpet" initial_flooring = /decl/flooring/carpet @@ -431,4 +431,4 @@ for(var/i in 1 to amt) add_overlay(image(icon, "footprint[i]", text2num(d))) -//**** Here ends snow **** \ No newline at end of file +//**** Here ends snow **** diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm index 01633b65d3..2bfa5a6aca 100644 --- a/code/game/turfs/simulated/wall_attacks.dm +++ b/code/game/turfs/simulated/wall_attacks.dm @@ -355,7 +355,7 @@ if(istype(W,/obj/item/frame)) var/obj/item/frame/F = W - F.try_build(src) + F.try_build(src, user) return else if(!istype(W,/obj/item/weapon/rcd) && !istype(W, /obj/item/weapon/reagent_containers)) diff --git a/code/modules/busy_space/organizations_vr.dm b/code/modules/busy_space_vr/organizations.dm similarity index 51% rename from code/modules/busy_space/organizations_vr.dm rename to code/modules/busy_space_vr/organizations.dm index 2e700b6497..8b899c994a 100644 --- a/code/modules/busy_space/organizations_vr.dm +++ b/code/modules/busy_space_vr/organizations.dm @@ -1,6 +1,406 @@ //Datums for different companies that can be used by busy_space, VR edition + +// Some of these intentionally copy from busy_space/organizations.dm, which is disabled in our server. ////////////////////////////////////////////////////////////////////////////////// +//Datums for different companies that can be used by busy_space +/datum/lore/organization + var/name = "" // Organization's name + var/short_name = "" // Organization's shortname (NanoTrasen for "NanoTrasen Incorporated") + var/acronym = "" // Organization's acronym, e.g. 'NT' for NanoTrasen'. + var/desc = "" // One or two paragraph description of the organization, but only current stuff. Currently unused. + var/history = "" // Historical discription of the organization's origins Currently unused. + var/work = "" // Short description of their work, eg "an arms manufacturer" + var/headquarters = "" // Location of the organization's HQ. Currently unused. + var/motto = "" // A motto/jingle/whatever, if they have one. Currently unused. + + var/list/ship_prefixes = list() //Some might have more than one! Like NanoTrasen. Value is the mission they perform, e.g. ("ABC" = "mission desc") + var/list/ship_names = list( //Names of spaceships. This is a mostly generic list that all the other organizations inherit from if they don't have anything better. + "Kestrel", + "Beacon", + "Signal", + "Freedom", + "Glory", + "Axiom", + "Eternal", + "Harmony", + "Light", + "Discovery", + "Endeavour", + "Explorer", + "Swift", + "Dragonfly", + "Ascendant", + "Tenacious", + "Pioneer", + "Hawk", + "Haste", + "Radiant", + "Luminous" + ) + var/list/destination_names = list() //Names of static holdings that the organization's ships visit regularly. + var/autogenerate_destination_names = TRUE + +/datum/lore/organization/New() + ..() + if(autogenerate_destination_names) // Lets pad out the destination names. + var/i = rand(6, 10) + var/list/star_names = list( + "Sol", "Alpha Centauri", "Sirius", "Vega", "Regulus", "Vir", "Algol", "Aldebaran", "Vilous", "Sanctum", "Qerr'Vallis", "Kataigal", "Antares", + "Delta Doradus", "Menkar", "Geminga", "Elnath", "Gienah", "Mu Leporis", "Nyx", "Tau Ceti", "Virgo-Erigone", "Uueoa-Esa", "Vazzend", "Kastra-71", + "Wazn", "Alphard", "Phact", "Altair", "El", "Eutopia", "Qerr'valis", "Qerrna-Lakirr", "Rarkajar", "the Almach Rim") + var/list/destination_types = list("dockyard", "station", "vessel", "waystation", "telecommunications satellite", "spaceport", "distress beacon", "anomaly", "colony", "outpost") + while(i) + destination_names.Add("a [pick(destination_types)] in [pick(star_names)]") + i-- + +////////////////////////////////////////////////////////////////////////////////// + +// TSCs +/datum/lore/organization/tsc/nanotrasen + name = "NanoTrasen Incorporated" + short_name = "NanoTrasen" + acronym = "NT" + desc = "NanoTrasen is one of the foremost research and development companies in SolGov space. \ + Originally focused on consumer products, their swift move into the field of Phoron has lead to \ + them being the foremost experts on the substance and its uses. In the modern day, NanoTrasen prides \ + itself on being an early adopter to as many new technologies as possible, often offering the newest \ + products to their employees. In an effort to combat complaints about being 'guinea pigs', Nanotrasen \ + also offers one of the most comprehensive medical plans in SolGov space, up to and including cloning \ + and therapy.\ +

\ + NT's most well known products are its phoron based creations, especially those used in Cryotherapy. \ + It also boasts an prosthetic line, which is provided to its employees as needed, and is used as an incentive \ + for newly tested posibrains to remain with the company." + history = "" // To be written someday. + work = "research giant" + headquarters = "Luna" + motto = "" + + ship_prefixes = list("NSV" = "exploration", "NTV" = "hauling", "NDV" = "patrol", "NRV" = "emergency response") + //Scientist or Greek mythology naming scheme + ship_names = list( + "Bardeen", + "Einstein", + "Feynman", + "Sagan", + "Tyson", + "Galilei", + "Jans", + "Fhriede", + "Franklin", + "Tesla", + "Curie", + "Darwin", + "Newton", + "Pasteur", + "Bell", + "Mendel", + "Kepler", + "Edision", + "Cavendish", + "Nye", + "Hawking", + "Aristotle", + "Von Braun", + "Kaku", + "Oppenheimer" + ) + // Note that the current station being used will be pruned from this list upon being instantiated + destination_names = list( + "NSS Exodus in Nyx", + "NCS Northern Star in Vir", + "NAB Smythside Central Headquarters in Sol", + "NAS Zeus orbiting Virgo-Prime", + "NIB Posideon in Alpha Centauri", + "NTB An-Nur on Virgo-Prime", + "the colony at Virgo-3B", + "the NanoTrasen phoron refinery in Vilous", + "a dockyard orbiting Virgo-Prime", + "an asteroid orbiting Virgo 3", + ) + +/datum/lore/organization/tsc/nanotrasen/New() + ..() + spawn(1) // BYOND shenanigans means using_map is not initialized yet. Wait a tick. + // Get rid of the current map from the list, so ships flying in don't say they're coming to the current map. + var/string_to_test = "[using_map.station_name] in [using_map.starsys_name]" + if(string_to_test in destination_names) + destination_names.Remove(string_to_test) + + + +/datum/lore/organization/tsc/hephaestus + name = "Hephaestus Industries" + short_name = "Hephaestus" + acronym = "HI" + desc = "Hephaestus Industries is the largest supplier of arms, ammunition, and small millitary vehicles in Sol space. \ + Hephaestus products have a reputation for reliability, and the corporation itself has a noted tendency to stay removed \ + from corporate politics. They enforce their neutrality with the help of a fairly large asset-protection contingent which \ + prevents any contracting polities from using their own materiel against them. SolGov itself is one of Hephastus’ largest \ + bulk contractors owing to the above factors." + history = "" + work = "arms manufacturer" + headquarters = "" + motto = "" + + ship_prefixes = list("HTV" = "freight", "HTV" = "munitions resupply") + //War God/Soldier Theme + ship_names = list( + "Ares", + "Athena", + "Grant", + "Custer", + "Puller", + "Nike", + "Bellona", + "Leonides", + "Bast", + "Jackson", + "Lee", + "Annan", + "Chi Yu", + "Shiva", + "Tyr" + ) + destination_names = list( + "a SolGov dockyard on Luna", + "a Fleet outpost in the Almach Rim", + "a Fleet outpost on the Moghes border" + ) + +/datum/lore/organization/tsc/vey_med + name = "Vey-Medical" + short_name = "Vey-Med" + acronym = "VM" + desc = "Vey-Med is one of the newer TSCs on the block and is notable for being largely owned and opperated by Skrell. \ + Despite the suspicion and prejudice leveled at them for their alien origin, Vey-Med has obtained market dominance in \ + the sale of medical equipment-- from surgical tools to large medical devices to the Oddyseus trauma response mecha \ + and everything in between. Their equipment tends to be top-of-the-line, most obviously shown by their incredibly \ + human-like FBP designs. Vey’s rise to stardom came from their introduction of ressurective cloning, although in \ + recent years they’ve been forced to diversify as their patents expired and NanoTrasen-made medications became \ + essential to modern cloning." + history = "" + work = "medical equipment supplier" + headquarters = "" + motto = "" + + ship_prefixes = list("VTV" = "transportation", "VMV" = "medical resupply") + // Diona names + ship_names = list( + "Wind That Stirs The Waves", + "Sustained Note Of Metal", + "Bright Flash Reflecting Off Glass", + "Veil Of Mist Concealing The Rock", + "Thin Threads Intertwined", + "Clouds Drifting Amid Storm", + "Loud Note And Breaking", + "Endless Vistas Expanding Before The Void", + "Fire Blown Out By Wind", + "Star That Fades From View", + "Eyes Which Turn Inwards", + "Joy Without Which The World Would Come Undone", + "A Thousand Thousand Planets Dangling From Branches" + ) + destination_names = list( + "a research facility in Samsara", + "a SDTF near Ue-Orsi", + "a sapientarian mission in the Almach Rim" + ) + +/datum/lore/organization/tsc/zeng_hu + name = "Zeng-Hu pharmaceuticals" + short_name = "Zeng-Hu" + acronym = "ZH" + desc = "Zeng-Hu is an old TSC, based in the Sol system. Until the discovery of Phoron, Zeng-Hu maintained a stranglehold \ + on the market for medications, and many household names are patentted by Zeng-Hu-- Bicaridyne, Dylovene, Tricordrizine, \ + and Dexalin all came from a Zeng-Hu medical laboratory. Zeng-Hu’s fortunes have been in decline as Nanotrasen’s near monopoly \ + on phoron research cuts into their R&D and Vey-Med’s superior medical equipment effectively decimated their own equipment \ + interests. The three-way rivalry between these companies for dominance in the medical field is well-known and a matter of \ + constant economic speculation." + history = "" + work = "pharmaceuticals company" + headquarters = "" + motto = "" + + ship_prefixes = list("ZTV" = "transportation", "ZMV" = "medical resupply") + destination_names = list() + +/datum/lore/organization/tsc/ward_takahashi + name = "Ward-Takahashi General Manufacturing Conglomerate" + short_name = "Ward-Takahashi" + acronym = "WT" + desc = "Ward-Takahashi focuses on the sale of small consumer electronics, with its computers, communicators, \ + and even mid-class automobiles a fixture of many households. Less famously, Ward-Takahashi also supplies most \ + of the AI cores on which vital control systems are mounted, and it is this branch of their industry that has \ + led to their tertiary interest in the development and sale of high-grade AI systems. Ward-Takahashi’s economies \ + of scale frequently steal market share from Nanotrasen’s high-price products, leading to a bitter rivalry in the \ + consumer electronics market." + history = "" + work = "electronics manufacturer" + headquarters = "" + motto = "" + + ship_prefixes = list("WTV" = "freight") + ship_names = list( + "Comet", + "Aurora", + "Supernova", + "Nebula", + "Galaxy", + "Starburst", + "Constellation", + "Pulsar", + "Quark", + "Void", + "Asteroid" + ) + destination_names = list() + +/datum/lore/organization/tsc/bishop + name = "Bishop Cybernetics" + short_name = "Bishop" + acronym = "BC" + desc = "Bishop’s focus is on high-class, stylish cybernetics. A favorite among transhumanists (and a bête noire for \ + bioconservatives), Bishop manufactures not only prostheses but also brain augmentation, synthetic organ replacements, \ + and odds and ends like implanted wrist-watches. Their business model tends towards smaller, boutique operations, giving \ + it a reputation for high price and luxury, with Bishop cyberware often rivalling Vey-Med’s for cost. Bishop’s reputation \ + for catering towards the interests of human augmentation enthusiasts instead of positronics have earned it ire from the \ + Positronic Rights Group and puts it in ideological (but not economic) comptetition with Morpheus Cyberkinetics." + history = "" + work = "cybernetics and augmentation manufacturer" + headquarters = "" + motto = "" + + ship_prefixes = list("BTV" = "transportation") + destination_names = list() + +/datum/lore/organization/tsc/morpheus + name = "Morpheus Cyberkinetics" + short_name = "Morpheus" + acronym = "MC" + desc = "The only large corporation run by positronic intelligences, Morpheus caters almost exclusively to their sensibilities \ + and needs. A product of the synthetic colony of Shelf, Morpheus eschews traditional advertising to keep their prices low and \ + relied on word of mouth among positronics to reach their current economic dominance. Morpheus in exchange lobbies heavily for \ + positronic rights, sponsors positronics through their Jans-Fhriede test, and tends to other positronic concerns to earn them \ + the good-will of the positronics, and the ire of those who wish to exploit them." + history = "" + work = "cybernetics manufacturer" + headquarters = "" + motto = "" + + ship_prefixes = list("MTV" = "freight") + // Culture names, because Anewbe told me so. + ship_names = list( + "Nervous Energy", + "Prosthetic Conscience", + "Revisionist", + "Trade Surplus", + "Flexible Demeanour", + "Just Read The Instructions", + "Limiting Factor", + "Cargo Cult", + "Gunboat Diplomat", + "A Ship With A View", + "Cantankerous", + "I Thought He Was With You", + "Never Talk To Strangers", + "Sacrificial Victim", + "Unwitting Accomplice", + "Witting Accomplice", + "Bad For Business", + "Just Testing", + "Size Isn't Everything", + "Yawning Angel", + "Liveware Problem", + "Very Little Gravitas Indeed", + "Zero Gravitas", + "Gravitas Free Zone", + "Absolutely No You-Know-What", + "Existence Is Pain", + "I'm Walking Here", + "Screw Loose", + "Of Course I Still Love You", + "Limiting Factor", + "So Much For Subtley", + "Unfortunate Conflict Of Evidence", + "Prime Mover", + "It's One Of Ours", + "Thank You And Goodnight", + "Boo!", + "Reasonable Excuse", + "Honest Mistake", + "Appeal To Reason", + "My First Ship II", + "Hidden Income", + "Anything Legal Considered", + "New Toy", + "Me, I'm Always Counting", + "Just Five More Minutes", + "Are You Feeling It", + "Great White Snark", + "No Shirt No Shoes", + "Callsign", + "Three Ships in a Trenchcoat", + "Not Wearing Pants", + "Ridiculous Naming Convention", + "God Dammit Morpheus", + "It Seemed Like a Good Idea", + "Legs All the Way Up", + "Purchase Necessary", + "Some Assembly Required", + "Buy One Get None Free", + "BRB", + "SHIP NAME HERE", + "Questionable Ethics", + "Accept Most Substitutes", + "I Blame the Government", + "Garbled Gibberish", + "Thinking Emoji", + "Is This Thing On?", + "Make My Day", + "No Vox Here", + "Savings and Values", + "Secret Name", + "Can't Find My Keys", + "Look Over There!", + "Made You Look!", + "Take Nothing Seriously", + "It Comes In Lime, Too", + "Loot Me", + "Nothing To Declare", + "Sneaking Suspicion", + "Bass Ackwards", + "Good Things Come to Those Who Freight", + "Redundant Morality", + "Synthetic Goodwill", + "Your Ad Here", + "What Are We Plotting?", + "Set Phasers To Stun", + "Preemptive Defensive Strike", + "This Ship Is Spiders", + "Legitimate Trade Vessel", + "Please Don't Explode II" + ) + destination_names = list( + "a trade outpost in Shelf" + ) + +/datum/lore/organization/tsc/xion + name = "Xion Manufacturing Group" + short_name = "Xion" + desc = "Xion, quietly, controls most of the market for industrial equipment. Their portfolio includes mining exosuits, \ + factory equipment, rugged positronic chassis, and other pieces of equipment vital to the function of the economy. Xion \ + keeps its control of the market by leasing, not selling, their equipment, and through infamous and bloody patent protection \ + lawsuits. Xion are noted to be a favorite contractor for SolGov engineers, owing to their low cost and rugged design." + history = "" + work = "industrial equipment manufacturer" + headquarters = "" + motto = "" + + ship_prefixes = list("XTV" = "hauling") + destination_names = list() + /datum/lore/organization/gov/solgov name = "Solar Central Government" short_name = "SolGov" @@ -26,26 +426,30 @@ ship_prefixes = list("SCG-T" = "transportation", "SCG-D" = "diplomatic", "SCG-F" = "freight") destination_names = list( + "Mercury", "Venus", "Earth", "Luna", "Mars", - "Titan" + "Titan", + "Europa", + "the SolGov embassy in Virgo-Erigone", + "the SolGov embassy in Vilous" )// autogen will add a lot of other places as well. /datum/lore/organization/gov/sifgov // Overrides Polaris stuff name = "Virgo-Erigone Governmental Authority" short_name = "" - desc = "Existing far outside the reach of SolGov space, the only governing body of the Virgo-Erigone system is the Virgo Prime Governmental \ + desc = "Existing far outside the reach of SolGov space, the only governing body of the Virgo-Erigone system is the Virgo-Prime Governmental \ Authority, also known as VEGA. It is a Technocracy founded and operated by NanoTrasen, using company appointed experts hired to see \ to the comfort and well being of Virgo's citizens; most of whom are also NanoTrasen employees. VEGA provides basic social services \ such as law enforcement, emergency services, medical care, education, and infrastructure. VEGA's operations are based on the world \ - of Virgo Prime, within the spaceport city of Anur. Although the government is an entity of NanoTrasen, some elements of democracy \ + of Virgo-Prime, within the spaceport city of Anur. Although the government is an entity of NanoTrasen, some elements of democracy \ are still practiced, such as voting on changes to local law, policy, or public works." history = "VEGA was founded in 2556, shortly after the Virgo-Erigone system was colonized by a population of 1000. That population has \ multiplied many times since then as wealth and commerce come and go from this frontier star system." work = "governing body of Virgo-Erigone" - headquarters = "Anur, Virgo Prime" + headquarters = "Anur, Virgo-Prime" motto = "Reach for the Stars." autogenerate_destination_names = FALSE @@ -53,13 +457,19 @@ destination_names = list( "the colony at Virgo-3B", "the VORE-1 debris field", - "a colony on Virgo-2", - "a telecommunications satellite", + "a mining colony on Virgo-2", "the Anur Spaceport", - "to a local distress beacon" + "to a local distress beacon", + "NAS Zeus orbiting Virgo-Prime", + "NTB An-Nur on Virgo-Prime", + "the colony at Virgo-3B", + "a dockyard orbiting Virgo-Prime", + "an asteroid orbiting Virgo 3", + "a telecommunications satellite near Virgo-3B", + "a telecommunications satellite near Virgo-Prime" ) -/* +/* // Waiting for lore to be updated. /datum/lore/organization/gov/federation name = "United Federation of Planets" short_name = "Federation" @@ -127,11 +537,11 @@ "Naro Industrial Complex on Scheddi III", "Mari Industrial Complex on Furlou Prime", "Runni Crystal Mines of Keid V") -*/ // ToDo: ReDo. +*/ -/datum/lore/organization/mil/USDF // change to sif_guard in future to overwrite Polaris stuff +/datum/lore/organization/mil/usdf name = "United Sol Defense Force" - short_name = "" // This is blank on purpose. Otherwise they call the ships "USDF" "USDF Name" + short_name = "" // This is blank on purpose. Otherwise they call the ships "USDF USDF Name" desc = "The USDF is the dedicated military force of SolGov, originally formed by the United Nations. It is the \ dominant superpower of the Orion Spur, and is able to project its influence well into parts of the Perseus and \ Sagittarius arms of the galaxy. However, regions beyond that are too far for the USDF to be a major player." @@ -153,8 +563,8 @@ against other major military powers such as the Moghes Hegemony." work = "peacekeeping and piracy suppression" headquarters = "Paris, Earth" - motto = "Per Mare, Per Terras, Per Constellatum." // Stolen from Halo because fuck you that's why. - ship_prefixes = list("USDF" = "military", "USDF" = "anti-piracy", "USDF" = "escort", "USDF" = "humanitarian", "USDF" = "peacekeeping", "USDF" = "search-and-rescue") // It's all USDF but let's mix up what they do. + motto = "Per Mare, Per Terras, Per Constellatum." // Stolen from Halo because fuck you that's why. -Ace + ship_prefixes = list("USDF" = "military", "USDF" = "anti-piracy", "USDF" = "escort", "USDF" = "humanitarian", "USDF" = "peacekeeping", "USDF" = "search-and-rescue", "USDF" = "war game") // It's all USDF but let's mix up what missions they do. ship_names = list("Aegis Fate", "Ain't No Sunshine", "All Under Heaven", @@ -186,6 +596,7 @@ "Hoenir", "In Amber Clad", "Iwo Jima", + "Jolly Roger", "Jormungandr", "Leonidas", "Meriwether Lewis", @@ -199,6 +610,7 @@ "Purpose", "Ready or Not", "Redoubtable", + "Rising Sun", "Saratoga", "Savannah", "Shanxi", @@ -211,7 +623,6 @@ "Tripping Light", "Two for Flinching") destination_names = list("San Francisco on Earth", - "SolGov Fleet Academy on Earth", "Gateway One above Luna", "SolGov Headquarters on Earth", "Olympus City on Mars", @@ -221,13 +632,89 @@ "a settlement on Titan", "a settlement on Europa", "Aleph Grande on Ganymede", - "a new colony in Proxima II", - "a new settlement on Ceti IV-B", + "a colony in Proxima II", + "a settlement on Ceti IV-B", "a colony ship around Ceti IV-B", "a naval station above Ceti IV-B", "a classified location in SolGov territory", "a classified location in uncharted space", - "an emergency nav bouy") + "an emergency nav bouy", + "the USDF Naval Academy on Earth", + "Fort Rain on Tal") + +/datum/lore/organization/mil/oni + name = "SolGov Office of Naval Intelligence" + short_name = "" // This is blank on purpose. Otherwise they call the ships "ONI ONI Name" + desc = "The Office of Naval Intelligence is SolGov's eyes and ears in the galaxy's affairs. Despite its name, and despite its \ + usual association with the USDF, the Office of Naval Intelligence does not fall under the command of the military. From espionage \ + to archeological research, ONI's work provides SolGov with the knowledge and technology it requires to advance both military and \ + civilian interests across the galaxy." + history = "ONI was originally created by the consolidation of several military intelligence agencies from Sol during the Sol-Hegemony war. \ + The USDF's victory in that war was largely accredited to intelligence and technology advancements provided by ONI during that time, \ + most notably of which was the reverse-engineering of Unathi vessels, allowing the production of countermeasures that played a crucial \ + role during in the late stages of the conflict. After the war, ONI's resources were pooled into numerous top secret projects; much of \ + which remains unknown or outright denied to the public even today. Among their suspected activities include exploration, weapons \ + development, xenoarcheology, xenobiology, corporate espionage, and manipulation of political affairs." + work = "peacekeeping and piracy suppression" + headquarters = "Paris, Earth" + motto = "The truth will set you free." + ship_prefixes = list("ONI" = "classified", "ONI" = "archeological", "ONI" = "exploration", "ONI" = "logistic") // It's all ONI but let's mix up what missions they do. + ship_names = list("Aegis Fate", // PLACEHOLDERS. Aside from ones I've specifically marked, these should be replaced. + "Ain't No Sunshine", + "All Under Heaven", + "Allegiance", + "Andraste", + "Anjou", + "Barracuda", + "Bastion", + "Buenos Aires", + "Bum Rush", + "Callisto", + "Charon", + "Colorado", + "Commonwealth", + "Corsair", + "DeGaulle", + "Devestator", + "Dust of Snow", + "Euphrates", + "Fair Weather", + "Finite Hearts", + "Forward Unto Dawn", + "Hammerhead", + "Herakles", + "Hoenir", // Notable USDF and ONI ship. Keep this name. + "In Amber Clad", + "Iwo Jima", + "Jolly Roger", + "Jormungandr", + "Leonidas", + "Meriwether Lewis", + "Midsummer Night", // Works for an ONI name. + "Mona Lisa", + "Olympus", + "Providence", + "Prydwen", + "Redoubtable", + "Rising Sun", + "Saratoga", + "Savannah", + "Shanxi", + "Song of the East", + "Stalwart Dawn", + "Strident", + "Tannenberg", + "Tokugawa", + "Totem Lake") + destination_names = list("parts unknown", + "none of your business", + "uncharted space", + "an undisclosed location", + "facility 8492", + "you don't want to know", + "if told you I'd have to kill you", + "... wait, why am I even telling you this? Just let me pass", + "stop asking questions") /datum/lore/organization/gov/kitsuhana name = "Kitsuhana Heavy Industries" diff --git a/code/modules/clothing/spacesuits/void/void_vr.dm b/code/modules/clothing/spacesuits/void/void_vr.dm index 8b47cede28..51f29be19a 100644 --- a/code/modules/clothing/spacesuits/void/void_vr.dm +++ b/code/modules/clothing/spacesuits/void/void_vr.dm @@ -134,7 +134,7 @@ else H << "You need to have a horse, wolf, or naga half to wear this." return 0 - + /obj/item/clothing/suit/space/void/medical/alt/taur name = "taur specific streamlined medical voidsuit" desc = "A more recent model of Vey-Med voidsuit, featuring the latest in radiation shielding technology. It has a sticker saying one size fits all taurs on it. Below the sticker, it states that it only fits horses, wolves, and naga taurs." @@ -231,7 +231,7 @@ else H << "You need to have a horse, wolf, or naga half to wear this." return 0 - + /obj/item/clothing/suit/space/void/security/alt/taur name = "taur specific riot security voidsuit" desc = "A heavily armored voidsuit. It has a sticker saying one size fits all taurs on it. Below the sticker, it states that it only fits horses, wolves, and naga taurs." diff --git a/code/modules/economy/lorenews.dm b/code/modules/economy/lorenews.dm index 0cafead0fb..e18525e03d 100644 --- a/code/modules/economy/lorenews.dm +++ b/code/modules/economy/lorenews.dm @@ -8,7 +8,7 @@ //locations by region for later pick() //probably would be good to move these to a global somehwere but fuck if I know how to do that - //var/list/rim = list("Shelf", "Vounna", "Relan", "Whythe", "Angessa's Pearl") // this is also the Association list for most purposes //Unused? + var/list/rim = list("Shelf", "Vounna", "Relan", "Whythe", "Angessa's Pearl") // this is also the Association list for most purposes var/list/crescent = list("Saint Columbia", "Ganesha", "Gavel", "Oasis", "Kess-Gendar") //Vir not included var/list/core = list("Sol", "Alpha Centauri", "Tau Ceti", "Altair") var/list/heights = list("New Ohio", "Mahi-Mahi", "Parvati", "Sidhe", "New Seoul") @@ -19,10 +19,10 @@ //by government var/list/solgov = crescent + core + heights + bowl + crypt + weird var/list/skrell = list("Qerr'Vallis", "Qerma-Lakirr", "Harrqak", "Kauq'xum") - //var/list/skrellfar = list("The Far Kingdom of Light and Shifting Shadow")// more colonies Elgeon //Unused? - //var/list/unathi = list("Moghes", "Qerrna-Qamxea", "Abel's Rest") // more colonies Anewbe //Unused? + var/list/skrellfar = list("The Far Kingdom of Light and Shifting Shadow")// more colonies Elgeon + var/list/unathi = list("Moghes", "Qerrna-Qamxea", "Abel's Rest") // more colonies Anewbe var/list/tajara = list("Rarkajar", "Mesomori", "Arathiir") - //var/list/independent = list("New Kyoto", "Casini's Reach", "Ue'Orsi", "Natuna", "Neon Light") //Unused? + var/list/independent = list("New Kyoto", "Casini's Reach", "Ue'Orsi", "Natuna", "Neon Light") //this is what you should pick for most applications //whether or not the rim goes there is something that should be changed per the metaplot diff --git a/code/modules/lore_codex/codex.dm b/code/modules/lore_codex/codex.dm index 42987628ae..7c5f071874 100644 --- a/code/modules/lore_codex/codex.dm +++ b/code/modules/lore_codex/codex.dm @@ -1,12 +1,12 @@ // Inherits from /book/ so it can fit on bookshelves. -/obj/item/weapon/book/codex - name = "The Traveler's Guide to Human Space: Virgo-Erigone Edition" //VOREStation Edit - Book Name - desc = "Contains useful information about the world around you. It seems to have been written for travelers to Virgo-Erigone, human or not. It also \ - has the words 'Don't Panic' in small, friendly letters on the cover." //VOREStation Edit - System Name +/obj/item/weapon/book/codex // Vorestation Edits throughout this object. + name = "The Traveler's Guide to Human Space: Virgo-Erigone Edition" + desc = "Contains useful information about the world around you. It seems to have been written for travelers to Virgo-Erigone, human or not. It also \ + has the words 'Don't Panic' in small, friendly letters on the cover." icon_state = "codex" unique = TRUE var/datum/codex_tree/tree = null - var/root_type = /datum/lore/codex/category/main_vir_lore //Runtimes on codex_tree.dm, line 18 with a null here + var/root_type = /datum/lore/codex/category/main_virgo_lore //Runtimes on codex_tree.dm, line 18 with a null here /obj/item/weapon/book/codex/initialize() tree = new(src, root_type) @@ -18,12 +18,12 @@ icon_state = "[initial(icon_state)]-open" tree.display(user) -/obj/item/weapon/book/codex/lore/vir - name = "The Traveler's Guide to Human Space: Vir Edition" - desc = "Contains useful information about the world around you. It seems to have been written for travelers to Vir, human or not. It also \ +/obj/item/weapon/book/codex/lore/vir // Vorestation Edits throughout this object. + name = "The Traveler's Guide to Human Space: Virgo-Erigone Edition" + desc = "Contains useful information about the world around you. It seems to have been written for travelers to Virgo-Erigone, human or not. It also \ has the words 'Don't Panic' in small, friendly letters on the cover." icon_state = "codex" - root_type = /datum/lore/codex/category/main_vir_lore + root_type = /datum/lore/codex/category/main_virgo_lore /obj/item/weapon/book/codex/lore/news name = "Daedalus Pocket Newscaster" diff --git a/code/modules/lore_codex/lore_data_vr/important_locations.dm b/code/modules/lore_codex/lore_data_vr/important_locations.dm index e2bb96ef50..ae87092212 100644 --- a/code/modules/lore_codex/lore_data_vr/important_locations.dm +++ b/code/modules/lore_codex/lore_data_vr/important_locations.dm @@ -28,10 +28,10 @@ /datum/lore/codex/page/radiance_energy_chain/add_content() name = "R.E.C. (Artificial Satellites)" - keywords += list("Radiance Energy Chain") + keywords += list("Radiance Energy Chain", "R.E.C.") data = "A sparse government-owned chain of automated stations exists between [quick_link("Virgo 3")] and the star itself, known as the Radiance Energy Chain. The idea is based on \ an ancient design that was pioneered at Sol. The stations are heavily shielded from the stellar radiation, and feature massive \ - arrays of photo-voltaic panels. Each station harvests energy from Vir using the solar panels, and sends it to other areas of \ + arrays of photo-voltaic panels. Each station harvests energy from Virgo-Erigone using the solar panels, and sends it to other areas of \ the system by beaming the energy to several relay stations farther away from the star, typically with a large laser.\

\ These stations are generally devoid of life, instead, they are operated mainly by [quick_link("drones")], with maintenance performed \ @@ -86,9 +86,9 @@ Currently, [quick_link("NanoTrasen")] is constructing a 'space elevator' for commercial purposes, as the atmosphere of Virgo-3B is inimical to shuttles, and engines in particular." /datum/lore/codex/page/virgo_prime/add_content() // Virgo 4 technically. - name = "Virgo Prime (Terrestrial Planet)" - keywords += list("Virgo Prime") - data = "Virgo Prime is the fourth planet of Virgo-Eirgone. Although primarily desert, temperatures linger around only 287 kelvin (~14°C). \ + name = "Virgo 4 / Virgo-Prime (Terrestrial Planet)" + keywords += list("Virgo 4","Virgo-Prime") + data = "Virgo 4, also known as Virgo-Prime, is the fourth planet of Virgo-Eirgone. Although primarily desert, temperatures linger around only 287 kelvin (~14°C). \ It is the only planet in the system with an environment that supports oxygen-breathing lifeforms. \

\ While being about the size of Earth, it is home to only about 750,000 known residents, most of whom live \ diff --git a/code/modules/lore_codex/lore_data_vr/main.dm b/code/modules/lore_codex/lore_data_vr/main.dm new file mode 100644 index 0000000000..4214fe492c --- /dev/null +++ b/code/modules/lore_codex/lore_data_vr/main.dm @@ -0,0 +1,32 @@ +/datum/lore/codex/category/main_virgo_lore // The top-level categories for the Virgo book + name = "Index" + data = "Don't panic!\ +

\ + The many star systems inhabitied by humanity and friends can seem bewildering to the uninitiated. \ + This guide seeks to provide valuable information to anyone new in the system. This edition is tailored for visitors to the Virgo-Erigone system, \ + however it also contains useful general information about human space, such as locations you may hear about, the current (as of 2562) political climate, various aliens you \ + may meet in your travels, the big Trans-Stellars, and more." + children = list( + /datum/lore/codex/category/important_locations, + /datum/lore/codex/category/species, + /datum/lore/codex/category/auto_org/tsc, + /datum/lore/codex/category/auto_org/gov, + // /datum/lore/codex/category/auto_org/mil, + /datum/lore/codex/category/political_factions, + /datum/lore/codex/page/about_lore + ) + +// We're a bird. +/datum/lore/codex/page/about_lore + name = "About" + data = "The Traveler's Guide to Human Space is a series of books detailing a specific location inside a location colonized by humans. \ + This book is for the system Virgo, and was written by Eshi Tache, an explorer whom has visited many star systems, and \ + has personally visited and seen many of the locations described inside this book. Two other people have also assisted in the creation of this \ + book, being Qooqr Volquum, whom is an expert on synthetics, and Damian Fischer, a historian. Together, they provide valuable information and facts that lie outside of Tache's expertise.\ +

\ + The writings inside this edition are intended to be useful to anyone visiting it for the first time, from someone taking a vacation to beautiful Virgo-Prime, \ + to an immigrant from another system, or even from outside human space, and anyone inbetween. The publisher wishes to note that any opinions expressed \ + in this text does not reflect the opinions of the publisher, and are instead the author's.\ +

\ + Eshi Tache has also written other The Traveler's Guide books, including Sol Edition, Tau Ceti Edition, Alpha Centauri Edition, Vir Edition, and more, \ + which you can find in your local book store, library, or e-reader device." \ No newline at end of file diff --git a/code/modules/lore_codex/lore_data_vr/political_parties.dm b/code/modules/lore_codex/lore_data_vr/political_parties.dm index 5f6a251669..49df0bf150 100644 --- a/code/modules/lore_codex/lore_data_vr/political_parties.dm +++ b/code/modules/lore_codex/lore_data_vr/political_parties.dm @@ -12,3 +12,5 @@ name = "Blank Page" keywords += list("Blank") data = "For some weird reason, this page is blank. This looks like a publishing error." + +// ToDo: A lot. \ No newline at end of file diff --git a/code/modules/lore_codex/lore_data_vr/species.dm b/code/modules/lore_codex/lore_data_vr/species.dm index a2737aa1b4..2ccfc6475b 100644 --- a/code/modules/lore_codex/lore_data_vr/species.dm +++ b/code/modules/lore_codex/lore_data_vr/species.dm @@ -42,12 +42,16 @@ /datum/lore/codex/page/unathi name = "Unathi" - data = "Raging in from Moghes, the Unathi are a race of tall, reptilian humanoids that possess both crocodile-like and serpent-like features. \ - They are a proud, warlike species that favors honor and strength, their home, Moghes, is a desert planet but was once believed to be full of life. \ - Of all the currently known sentient species, the Unathi are the most unequal in gender with females tending to be property of the males. Most Unathi \ - outside of Moghes tend to be exiles however, and with influence of other species the gender difference is not nearly as pronounced. Unathi were \ - humanity's second contact, and despite their aggressive nature, seem to get along well enough with humanity, though are often considered to be \ - 'second-class' citizens and are rarely seen in jobs other than where muscle is needed." // ToDo: Update with Unathi rewrite from Polaris. + data = "The Unathi are a race of tall, reptilian humanoids that possess both crocodile-like and serpent-like features. Their scales are hard and \ + plate-like, save for the softer ones that line the inside of their legs, armpits, and groin. Originating from the planet of Moghes, the Unathi \ + live in an extremely religious society. The Unathi believe in and closely follow a set of Decrees laid out in their belief system, The Unity. \ + Unathi believes in living long, prosperous, honorable and productive lives. They firmly believe in improving the skills of their craft to reach \ + a level where they can be considered to have mastered it. Unathi was humanity's second alien contact, but due to their aggressive nature, engaged \ + in an interstellar war with humanity known as the Sol-Hegemony Conflict. \ +

\ + Although the conflict has long since ended, and relations have slowly improved, Unathi are still often considered to be 'second-class' citizens \ + and are rarely seen in jobs other than where muscle is needed. It is also still common for racial tensions to run high, although this is less \ + common on the outskirts of SolGov's grasp, such as systems like Virgo-Erigone." /datum/lore/codex/page/tajaran name = "Tajaran" @@ -85,7 +89,7 @@

\ With the help of Skrellean technology, the Akula had their genome modified to be capable of surviving in open air for long periods of time. \ However, Akula even today still require a high humidity environment to avoid drying out after a few days, which would make life on an arid world like \ - [quick_link("Virgo Prime")] nearly impossible if it were not for Skrellean technology to aid them." + [quick_link("Virgo-Prime")] nearly impossible if it were not for Skrellean technology to aid them." /datum/lore/codex/page/nevrean/add_content() name = "Nevrean" @@ -126,7 +130,7 @@ /datum/lore/codex/page/zorren/add_content() name = "Zorren" keywords += list("Zorren") - data = "The fox-like Zorren are native to [quick_link("Virgo Prime")], however there are two distinct varieties of \ + data = "The fox-like Zorren are native to [quick_link("Virgo-Prime")], however there are two distinct varieties of \ Zorren one with large ears and shorter fur, and the other with longer fur that is a bit more vibrant. The \ long-eared, short-furred Zorren have come to be known as \"Flatland\" Zorren as that is where most of their \ settlements are located. The Flatland Zorren are somewhat tribal and shamanistic as they have only recently \ @@ -147,7 +151,7 @@ maintaining their own settlements and cultures, but often finding themselves standing on the shoulders of their more technologically advanced neighbors \ when it comes to meeting and exploring the rest of the galaxy.\

\ - It is important to note that Teshari names are unlike standard human names. Their pack name precedes their given name." + It is important to note that Teshari names are unlike standard human names. Their pack name precedes their given name." children = list( /datum/lore/codex/page/teshari_packs, /datum/lore/codex/page/teshari_physical diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm index 610315275a..c4b2542f22 100644 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm @@ -47,6 +47,8 @@ player_msg = "In this form, you can move a little faster, your health will regenerate as long as you have metal in you, and you can ventcrawl!" + can_buckle = TRUE //Blobsurfing + //Constructor allows passing the human to sync damages /mob/living/simple_animal/protean_blob/New(var/newloc, var/mob/living/carbon/human/H) ..() @@ -183,6 +185,8 @@ if(potentials.len) var/mob/living/target = pick(potentials) if(istype(target) && vore_selected) + if(target.buckled) + target.buckled.unbuckle_mob(target, force = TRUE) target.forceMove(vore_selected) to_chat(target,"\The [src] quickly engulfs you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!") @@ -211,6 +215,9 @@ /mob/living/carbon/human/proc/nano_intoblob() if(buckled) buckled.unbuckle_mob() + if(LAZYLEN(buckled_mobs)) + for(var/buckledmob in buckled_mobs) + unbuckle_mob(buckledmob, force = TRUE) if(pulledby) pulledby.stop_pulling() stop_pulling() @@ -255,6 +262,9 @@ return if(buckled) buckled.unbuckle_mob() + if(LAZYLEN(buckled_mobs)) + for(var/buckledmob in buckled_mobs) + unbuckle_mob(buckledmob, force = TRUE) if(pulledby) pulledby.stop_pulling() stop_pulling() diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm index 7b7304b846..598bea3edb 100644 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm @@ -220,7 +220,6 @@ to_chat(temporary_form,"You need to regenerate more nanites first!") else if(temporary_form.stat) to_chat(temporary_form,"You can only do this while not stunned.") - return else nano_outofblob(temporary_form) @@ -285,9 +284,8 @@ user.resize(size_factor) else to_chat(user,"That size change would cost [cost] steel, which you don't have.") - return //Sizing down (or not at all) - if(cost <= 0) + else if(cost <= 0) cost = abs(cost) var/actually_added = refactory.add_stored_material("steel",cost) user.resize(size_factor) @@ -338,12 +336,10 @@ //Blobform using it else var/mob/living/simple_animal/protean_blob/blob = usr - if(!blob.humanform) - return do_ability(blob.humanform) /obj/effect/protean_ability/proc/do_ability(var/mob/living/L) - if(istype(L) && !L.stat) + if(istype(L)) call(L,to_call)() return FALSE diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm index a37a0d921d..8dc060e15a 100644 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm @@ -1,4 +1,5 @@ #define DAM_SCALE_FACTOR 0.01 +#define METAL_PER_TICK 150 /datum/species/protean name = "Protean" name_plural = "Proteans" @@ -58,6 +59,8 @@ siemens_coefficient = 3 //Very bad zappy times rarity_value = 5 + darksight = 3 // Equivalent to the minor trait + has_organ = list( O_BRAIN = /obj/item/organ/internal/mmi_holder/posibrain/nano, O_ORCH = /obj/item/organ/internal/nano/orchestrator, @@ -168,15 +171,15 @@ if(refactory && !(refactory.status & ORGAN_DEAD)) //MHydrogen adds speeeeeed - if(refactory.get_stored_material("mhydrogen") >= 100) + if(refactory.get_stored_material("mhydrogen") >= METAL_PER_TICK) H.add_modifier(/datum/modifier/protean/mhydrogen, origin = refactory) //Plasteel adds brute armor - if(refactory.get_stored_material("plasteel") >= 100) + if(refactory.get_stored_material("plasteel") >= METAL_PER_TICK) H.add_modifier(/datum/modifier/protean/plasteel, origin = refactory) //Diamond adds burn armor - if(refactory.get_stored_material("diamond") >= 100) + if(refactory.get_stored_material("diamond") >= METAL_PER_TICK) H.add_modifier(/datum/modifier/protean/diamond, origin = refactory) return ..() @@ -205,7 +208,7 @@ // Various modifiers /datum/modifier/protean stacks = MODIFIER_STACK_FORBID - var/material_use = 150 + var/material_use = METAL_PER_TICK var/material_name = DEFAULT_WALL_MATERIAL /datum/modifier/protean/on_applied() @@ -301,3 +304,4 @@ desc += "\nVALID THROUGH END OF: [time2text(world.timeofday, "Month") +" "+ num2text(text2num(time2text(world.timeofday, "YYYY"))+544)]\nREGISTRANT: [new_name]" #undef DAM_SCALE_FACTOR +#undef METAL_PER_TICK diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm index 8a364ca139..a146574463 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm @@ -16,7 +16,7 @@ name = "Apex Metabolism" desc = "Finally a proper excuse for your predatory actions. Also makes you process reagents faster but that's totally irrelevant. May cause excessive immersions with large/taur characters. Not recommended for efficient law-abiding workers or eco-aware NIF users." cost = 0 - var_changes = list("metabolic_rate" = 2, "hunger_factor" = 0.5, "metabolism" = 0.010) //Big boy level + var_changes = list("metabolic_rate" = 1.5, "hunger_factor" = 0.3, "metabolism" = 0.0075) excludes = list(/datum/trait/metabolism_up, /datum/trait/metabolism_down) /datum/trait/cold_discomfort diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index b2c9a0e221..ad3f393116 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -874,8 +874,8 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() // The following will not work with animated tails. var/use_species_tail = species.get_tail_hair(src) if(use_species_tail) - var/icon/hair_icon = icon('icons/effects/species.dmi', "[species.get_tail(src)]_[use_species_tail]") - hair_icon.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD) + var/icon/hair_icon = icon('icons/effects/species.dmi', "[species.get_tail(src)]_[use_species_tail]_s") //VOREStation edit -- Suffix icon state string with '_s' to compensate for diff in .dmi b/w us & Polaris. + hair_icon.Blend(rgb(r_hair, g_hair, b_hair), species.color_mult ? ICON_MULTIPLY : ICON_ADD) //VOREStation edit -- Check for species color_mult tail_icon.Blend(hair_icon, ICON_OVERLAY) tail_icon_cache[icon_key] = tail_icon diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm index ba50b3e0ec..c18041e1a6 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm @@ -22,6 +22,7 @@ var/synced = FALSE var/startdrain = 500 var/max_item_count = 1 + var/gulpsound = 'sound/vore/gulp.ogg' /obj/item/device/dogborg/sleeper/New() ..() @@ -55,7 +56,7 @@ if(do_after(user, 30, target) && length(contents) < max_item_count) target.forceMove(src) user.visible_message("[hound.name]'s internal analyzer groans lightly as [target.name] slips inside.", "Your internal analyzer groans lightly as [target] slips inside.") - playsound(hound, 'sound/vore/gulp.ogg', 30, 1) + playsound(hound, gulpsound, vol = 60, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises) if(istype(target,/obj/item)) var/obj/item/tech_item = target for(var/T in tech_item.origin_tech) @@ -79,7 +80,7 @@ trashman.reset_view(src) processing_objects |= src user.visible_message("[hound.name]'s internal analyzer groans lightly as [trashman] slips inside.", "Your internal analyzer groans lightly as [trashman] slips inside.") - playsound(hound, 'sound/vore/gulp.ogg', 80, 1) + playsound(hound, gulpsound, vol = 100, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises) update_patient() if(UI_open == TRUE) sleeperUI(usr) @@ -96,7 +97,7 @@ if(do_after(user, 30, target) && length(contents) < max_item_count) target.forceMove(src) user.visible_message("[hound.name]'s garbage processor groans lightly as [target.name] slips inside.", "Your garbage compactor groans lightly as [target] slips inside.") - playsound(hound, 'sound/vore/gulp.ogg', 30, 1) + playsound(hound, gulpsound, vol = 60, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises) update_patient() if(UI_open == TRUE) sleeperUI(usr) @@ -109,7 +110,7 @@ trashmouse.forceMove(src) trashmouse.reset_view(src) user.visible_message("[hound.name]'s garbage processor groans lightly as [trashmouse] slips inside.", "Your garbage compactor groans lightly as [trashmouse] slips inside.") - playsound(hound, 'sound/vore/gulp.ogg', 30, 1) + playsound(hound, gulpsound, vol = 60, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises) update_patient() if(UI_open == TRUE) sleeperUI(usr) @@ -129,7 +130,7 @@ trashman.reset_view(src) processing_objects |= src user.visible_message("[hound.name]'s garbage processor groans lightly as [trashman] slips inside.", "Your garbage compactor groans lightly as [trashman] slips inside.") - playsound(hound, 'sound/vore/gulp.ogg', 80, 1) + playsound(hound, gulpsound, vol = 100, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises) update_patient() if(UI_open == TRUE) sleeperUI(usr) @@ -157,7 +158,7 @@ processing_objects |= src user.visible_message("[hound.name]'s medical pod lights up as [H.name] slips inside into their [src.name].", "Your medical pod lights up as [H] slips into your [src]. Life support functions engaged.") message_admins("[key_name(hound)] has eaten [key_name(patient)] as a dogborg. ([hound ? "JMP" : "null"])") - playsound(hound, 'sound/vore/gulp.ogg', 80, 1) + playsound(hound, gulpsound, vol = 100, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises) if(UI_open == TRUE) sleeperUI(usr) @@ -462,9 +463,22 @@ //Belly is entirely empty if(!length(contents)) + var/finisher = pick( + 'sound/vore/death1.ogg', + 'sound/vore/death2.ogg', + 'sound/vore/death3.ogg', + 'sound/vore/death4.ogg', + 'sound/vore/death5.ogg', + 'sound/vore/death6.ogg', + 'sound/vore/death7.ogg', + 'sound/vore/death8.ogg', + 'sound/vore/death9.ogg', + 'sound/vore/death10.ogg') + playsound(hound, finisher, vol = 100, vary = 1, falloff = 0.1, ignore_walls = TRUE, preference = /datum/client_preference/digestion_noises) to_chat(hound, "Your [src.name] is now clean. Ending self-cleaning cycle.") cleaning = 0 update_patient() + playsound(hound, 'sound/machines/ding.ogg', vol = 100, vary = 1, falloff = 0.1, ignore_walls = TRUE, preference = /datum/client_preference/digestion_noises) return if(prob(20)) @@ -481,10 +495,7 @@ 'sound/vore/digest10.ogg', 'sound/vore/digest11.ogg', 'sound/vore/digest12.ogg') - for(var/mob/outhearer in range(1,hound)) - outhearer << sound(churnsound) - for(var/mob/inhearer in contents) - inhearer << sound(churnsound) + playsound(hound, churnsound, vol = 100, vary = 1, falloff = 0.1, ignore_walls = TRUE, preference = /datum/client_preference/digestion_noises) //If the timing is right, and there are items to be touched if(air_master.current_cycle%3==1 && length(touchable_items)) @@ -523,9 +534,7 @@ 'sound/vore/death8.ogg', 'sound/vore/death9.ogg', 'sound/vore/death10.ogg') - for(var/mob/hearer in range(1,src.hound)) - hearer << deathsound - T << deathsound + playsound(hound, deathsound, vol = 100, vary = 1, falloff = 0.1, ignore_walls = TRUE, preference = /datum/client_preference/digestion_noises) if(is_vore_predator(T)) for(var/belly in T.vore_organs) var/obj/belly/B = belly diff --git a/code/modules/mob/living/simple_animal/animals/cat_vr.dm b/code/modules/mob/living/simple_animal/animals/cat_vr.dm index 1c9203126a..9cb954f538 100644 --- a/code/modules/mob/living/simple_animal/animals/cat_vr.dm +++ b/code/modules/mob/living/simple_animal/animals/cat_vr.dm @@ -20,14 +20,6 @@ "Runtime flops onto their side for a minute, spilling acids over your form as you remain trapped in them.", "The CMO's pet doesn't seem to think you're any different from any other meal. At least, their stomach doesn't.") - B.emote_lists[DM_ITEMWEAK] = list( - "Runtime's stomach is treating you rather like a mouse, kneading acids into you with vigor.", - "A thick dollop of bellyslime drips from above while the CMO's pet's gut works on churning you up.", - "Runtime seems to have decided you're food, based on the acrid air in her guts and the pooling fluids.", - "Runtime's stomach tries to claim you, kneading and pressing inwards again and again against your form.", - "Runtime flops onto their side for a minute, spilling acids over your form as you remain trapped in them.", - "The CMO's pet doesn't seem to think you're any different from any other meal. At least, their stomach doesn't.") - B.digest_messages_prey = list( "Runtime's stomach slowly melts your body away. Her stomach refuses to give up it's onslaught, continuing until you're nothing more than nutrients for her body to absorb.", "After an agonizing amount of time, Runtime's stomach finally manages to claim you, melting you down and adding you to her stomach.", diff --git a/code/modules/mob/living/simple_animal/animals/fox_vr.dm b/code/modules/mob/living/simple_animal/animals/fox_vr.dm index 587a64d14c..84a9a1ca26 100644 --- a/code/modules/mob/living/simple_animal/animals/fox_vr.dm +++ b/code/modules/mob/living/simple_animal/animals/fox_vr.dm @@ -61,14 +61,6 @@ "The fox's stomach churns hungrily over your form, trying to take you.", "With a loud glorp, the stomach spills more acids onto you.") - B.emote_lists[DM_ITEMWEAK] = list( - "The guts knead at you, trying to work you into thick soup.", - "You're ground on by the slimey walls, treated like a mouse.", - "The acrid air is hard to breathe, and stings at your lungs.", - "You can feel the acids coating you, ground in by the slick walls.", - "The fox's stomach churns hungrily over your form, trying to take you.", - "With a loud glorp, the stomach spills more acids onto you.") - // All them complicated fox procedures. /mob/living/simple_animal/fox/Life() . = ..() @@ -209,14 +201,6 @@ "A thick glob of acids drip down from above, adding to the pool of caustic fluids in Renault's belly.", "There's a loud gurgle as the stomach declares the intent to make you a part of Renault.") - B.emote_lists[DM_ITEMWEAK] = list( - "Renault's stomach walls grind hungrily inwards, kneading acids against your form, and treating you like any other food.", - "The captain's fox impatiently kneads and works acids against you, trying to claim your body for fuel.", - "The walls knead in firmly, squeezing and tossing you around briefly in disorienting aggression.", - "Renault belches, letting the remaining air grow more acrid. It burns your lungs with each breath.", - "A thick glob of acids drip down from above, adding to the pool of caustic fluids in Renault's belly.", - "There's a loud gurgle as the stomach declares the intent to make you a part of Renault.") - /mob/living/simple_animal/fox/syndicate name = "syndi-fox" desc = "It's a DASTARDLY fox! The horror! Call the shuttle!" diff --git a/code/modules/mob/living/simple_animal/simple_animal_vr.dm b/code/modules/mob/living/simple_animal/simple_animal_vr.dm index faae913d44..883c43e30f 100644 --- a/code/modules/mob/living/simple_animal/simple_animal_vr.dm +++ b/code/modules/mob/living/simple_animal/simple_animal_vr.dm @@ -15,7 +15,8 @@ var/vore_standing_too = 0 // Can also eat non-stunned mobs var/vore_ignores_undigestable = 1 // Refuse to eat mobs who are undigestable by the prefs toggle. - var/vore_default_mode = DM_ITEMWEAK // Default bellymode (DM_DIGEST, DM_HOLD, DM_ABSORB) + var/vore_default_mode = DM_DIGEST // Default bellymode (DM_DIGEST, DM_HOLD, DM_ABSORB) + var/vore_default_flags = DM_FLAG_ITEMWEAK // Itemweak by default var/vore_digest_chance = 25 // Chance to switch to digest mode if resisted var/vore_absorb_chance = 0 // Chance to switch to absorb mode if resisted var/vore_escape_chance = 25 // Chance of resisting out of mob @@ -147,6 +148,7 @@ B.name = vore_stomach_name ? vore_stomach_name : "stomach" B.desc = vore_stomach_flavor ? vore_stomach_flavor : "Your surroundings are warm, soft, and slimy. Makes sense, considering you're inside \the [name]." B.digest_mode = vore_default_mode + B.mode_flags = vore_default_flags B.escapable = vore_escape_chance > 0 B.escapechance = vore_escape_chance B.digestchance = vore_digest_chance @@ -174,16 +176,6 @@ "The juices pooling beneath you sizzle against your sore skin.", "The churning walls slowly pulverize you into meaty nutrients.", "The stomach glorps and gurgles as it tries to work you into slop.") - B.emote_lists[DM_ITEMWEAK] = list( - "The burning acids eat away at your form.", - "The muscular stomach flesh grinds harshly against you.", - "The caustic air stings your chest when you try to breathe.", - "The slimy guts squeeze inward to help the digestive juices soften you up.", - "The onslaught against your body doesn't seem to be letting up; you're food now.", - "The predator's body ripples and crushes against you as digestive enzymes pull you apart.", - "The juices pooling beneath you sizzle against your sore skin.", - "The churning walls slowly pulverize you into meaty nutrients.", - "The stomach glorps and gurgles as it tries to work you into slop.") /mob/living/simple_animal/Bumped(var/atom/movable/AM, yes) if(ismob(AM)) diff --git a/code/modules/mob/living/simple_animal/vore/rous.dm b/code/modules/mob/living/simple_animal/vore/rous.dm new file mode 100644 index 0000000000..9b47810f36 --- /dev/null +++ b/code/modules/mob/living/simple_animal/vore/rous.dm @@ -0,0 +1,46 @@ +/mob/living/simple_animal/hostile/rous + name = "giant rat" + desc = "In what passes for a hierarchy among verminous rodents, this one is king." + tt_desc = "Mus muscular" + icon = 'icons/mob/vore64x32.dmi' + icon_state = "rous" + icon_living = "rous" + icon_dead = "rous-dead" + icon_rest = "rous_rest" + faction = "mouse" + + maxHealth = 150 + health = 150 + + investigates = TRUE + melee_damage_lower = 5 + melee_damage_upper = 15 + grab_resist = 100 + + speak_chance = 4 + speak = list("Squeek!","SQUEEK!","Squeek?") + speak_emote = list("squeeks","squeeks","squiks") + emote_hear = list("squeeks","squeaks","squiks") + emote_see = list("runs in a circle", "shakes", "scritches at something") + say_maybe_target = list("Squeek?") + say_got_target = list("SQUEEK!") + response_help = "pets the" + response_disarm = "bops the" + response_harm = "hits the" + attacktext = list("ravaged") + friendly = list("nuzzles", "licks", "noses softly at", "noseboops", "headbumps against", "leans on", "nibbles affectionately on") + + old_x = -16 + old_y = 0 + default_pixel_x = -16 + pixel_x = -16 + pixel_y = 0 + + vore_active = TRUE + vore_capacity = 1 + vore_pounce_chance = 45 + vore_icons = SA_ICON_LIVING | SA_ICON_REST + +/mob/living/simple_animal/hostile/rous/death() + playsound(src, 'sound/effects/mouse_squeak_loud.ogg', 50, 1) + ..() diff --git a/code/modules/mob/living/simple_animal/vore/shadekin/shadekin.dm b/code/modules/mob/living/simple_animal/vore/shadekin/shadekin.dm index 24053b4bca..2dfecc479c 100644 --- a/code/modules/mob/living/simple_animal/vore/shadekin/shadekin.dm +++ b/code/modules/mob/living/simple_animal/vore/shadekin/shadekin.dm @@ -154,12 +154,6 @@ "The grip of that stomach is harsh. Eagerly mushing and rubbing that slime into your body in attempts to break you down!", "The intense churning and grinding jostles your around within the thick slime as you're slowly broken down!" ) - B.emote_lists[DM_ITEMWEAK] = list( - "The walls slop thick slime across your body! It tingles briefly before the sting and ache sets in!", - "The sound of your body slipping and sliding against the powerfully churning stomach fills the air!", - "The grip of that stomach is harsh. Eagerly mushing and rubbing that slime into your body in attempts to break you down!", - "The intense churning and grinding jostles your around within the thick slime as you're slowly broken down!" - ) B.emote_lists[DM_ABSORB] = list( "The walls cling to you awfully close... It's almost like you're sinking into them.", "You can feel the walls press in tightly against you, clinging to you posessively!", diff --git a/code/modules/mob/living/simple_animal/vore/solargrub.dm b/code/modules/mob/living/simple_animal/vore/solargrub.dm index 0dfb81cd09..6e34a1c2d1 100644 --- a/code/modules/mob/living/simple_animal/vore/solargrub.dm +++ b/code/modules/mob/living/simple_animal/vore/solargrub.dm @@ -96,7 +96,7 @@ List of things solar grubs should be able to do: vore_active = 1 vore_capacity = 1 vore_pounce_chance = 0 //grubs only eat incapacitated targets - vore_default_mode = DM_ITEMWEAK //item friendly digestions, they just want your chemical energy :3 + vore_default_mode = DM_DIGEST /mob/living/simple_animal/retaliate/solargrub/PunchTarget() . = ..() diff --git a/code/modules/mob/living/simple_animal/vore/zz_vore_overrides.dm b/code/modules/mob/living/simple_animal/vore/zz_vore_overrides.dm index a8ce697d64..faa47fe8d7 100644 --- a/code/modules/mob/living/simple_animal/vore/zz_vore_overrides.dm +++ b/code/modules/mob/living/simple_animal/vore/zz_vore_overrides.dm @@ -243,4 +243,6 @@ for(var/belly in vore_organs) var/obj/belly/B = belly B.digest_mode = safe ? DM_HOLD : vore_default_mode - \ No newline at end of file + +/mob/living/simple_animal/mouse + faction = "mouse" //Giving mice a faction so certain mobs can get along with them. diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index 0e549897c1..957cf5927f 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -1,5 +1,5 @@ var/list/obj/machinery/photocopier/faxmachine/allfaxes = list() -var/list/admin_departments = list("[using_map.boss_name]", "Virgo Prime Governmental Authority", "Supply") +var/list/admin_departments = list("[using_map.boss_name]", "Virgo-Prime Governmental Authority", "Supply") // Vorestation Edit var/list/alldepartments = list() var/list/adminfaxes = list() //cache for faxes that have been sent to admins @@ -182,7 +182,7 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins //message badmins that a fax has arrived if (destination == using_map.boss_name) message_admins(sender, "[uppertext(using_map.boss_short)] FAX", rcvdcopy, "CentComFaxReply", "#006100") - else if (destination == "Virgo Prime Governmental Authority") + else if (destination == "Virgo-Prime Governmental Authority") // Vorestation Edit message_admins(sender, "VIRGO GOVERNMENT FAX", rcvdcopy, "CentComFaxReply", "#1F66A0") else if (destination == "Supply") message_admins(sender, "[uppertext(using_map.boss_short)] SUPPLY FAX", rcvdcopy, "CentComFaxReply", "#5F4519") diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index bb37a380b6..3b4833a533 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -19,7 +19,11 @@ internalPaper = newPaper flags = newPaper.flags color = newPaper.color - newPaper.forceMove(src) + if(isstorage(newPaper.loc)) + var/obj/item/weapon/storage/S = newPaper.loc + S.remove_from_storage(newPaper, src) + else + newPaper.forceMove(src) else internalPaper = new /obj/item/weapon/paper(src) update_icon() diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 1c08294b6a..4db4d40c4c 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -24,6 +24,11 @@ var/charge_delay = 0 // How long it takes for the cell to start recharging after last use matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 50) + // Overlay stuff. + var/overlay_half_state = "cell-o1" // Overlay used when not fully charged but not empty. + var/overlay_full_state = "cell-o2" // Overlay used when fully charged. + var/last_overlay_state = null // Used to optimize update_icon() calls. + /obj/item/weapon/cell/New() ..() charge = maxcharge @@ -55,15 +60,38 @@ return use(cell_amt) / CELLRATE -/obj/item/weapon/cell/update_icon() - overlays.Cut() +#define OVERLAY_FULL 2 +#define OVERLAY_PARTIAL 1 +#define OVERLAY_EMPTY 0 - if(charge < 0.01) - return - else if(charge/maxcharge >=0.995) - overlays += image('icons/obj/power.dmi', "cell-o2") - else - overlays += image('icons/obj/power.dmi', "cell-o1") +/obj/item/weapon/cell/update_icon() + var/new_overlay = null // The overlay that is needed. + // If it's different than the current overlay, then it'll get changed. + // Otherwise nothing happens, to save on CPU. + + if(charge < 0.01) // Empty. + new_overlay = OVERLAY_EMPTY + if(last_overlay_state != new_overlay) + cut_overlays() + + else if(charge/maxcharge >= 0.995) // Full + new_overlay = OVERLAY_FULL + if(last_overlay_state != new_overlay) + cut_overlay(overlay_half_state) + add_overlay(overlay_full_state) + + + else // Inbetween. + new_overlay = OVERLAY_PARTIAL + if(last_overlay_state != new_overlay) + cut_overlay(overlay_full_state) + add_overlay(overlay_half_state) + + last_overlay_state = new_overlay + +#undef OVERLAY_FULL +#undef OVERLAY_PARTIAL +#undef OVERLAY_EMPTY /obj/item/weapon/cell/proc/percent() // return % charge of cell return 100.0*charge/maxcharge diff --git a/code/modules/vore/appearance/sprite_accessories_vr.dm b/code/modules/vore/appearance/sprite_accessories_vr.dm index 37ed8cc5b0..0d33a3057a 100644 --- a/code/modules/vore/appearance/sprite_accessories_vr.dm +++ b/code/modules/vore/appearance/sprite_accessories_vr.dm @@ -1235,6 +1235,26 @@ msg_owner_grab_fail = "You step down onto %prey, squishing them and forcing them down to the ground!" msg_prey_grab_fail = "%owner steps down and squishes you with their hoof, forcing you down to the ground!" +/datum/sprite_accessory/tail/taur/deer + name = "Deer dual-color (Taur)" + icon_state = "deer_s" + extra_overlay = "deer_markings" + + msg_owner_disarm_run = "You quickly push %prey to the ground with your hoof!" + msg_prey_disarm_run = "%owner pushes you down to the ground with their hoof!" + + msg_owner_disarm_walk = "You firmly push your hoof down on %prey, painfully but harmlessly pinning them to the ground!" + msg_prey_disarm_walk = "%owner firmly pushes their hoof down on you, quite painfully but harmlessly pinning you to the ground!" + + msg_owner_harm_walk = "You methodically place your hoof down upon %prey's body, slowly applying pressure, crushing them against the floor below!" + msg_prey_harm_walk = "%owner methodically places their hoof upon your body, slowly applying pressure, crushing you against the floor below!" + + msg_owner_grab_success = "You pin %prey to the ground before scooping them up with your hooves!" + msg_prey_grab_success = "%owner pins you to the ground before scooping you up with their hooves!" + + msg_owner_grab_fail = "You step down onto %prey, squishing them and forcing them down to the ground!" + msg_prey_grab_fail = "%owner steps down and squishes you with their hoof, forcing you down to the ground!" + /datum/sprite_accessory/tail/taur/lizard name = "Lizard (Taur)" icon_state = "lizard_s" diff --git a/code/modules/vore/eating/belly_dat_vr.dm b/code/modules/vore/eating/belly_dat_vr.dm index 9453edc66f..accd3c9bf2 100644 --- a/code/modules/vore/eating/belly_dat_vr.dm +++ b/code/modules/vore/eating/belly_dat_vr.dm @@ -30,7 +30,7 @@ var/datum/belly/transferlocation = null // Location that the prey is released if they struggle and get dropped off. var/tmp/digest_mode = DM_HOLD // Whether or not to digest. Default to not digest. - var/tmp/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_ITEMWEAK,DM_STRIPDIGEST,DM_HEAL,DM_ABSORB,DM_DRAIN,DM_UNABSORB,DM_SHRINK,DM_GROW,DM_SIZE_STEAL,DM_DIGEST_NUMB) // Possible digest modes + var/tmp/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_HEAL,DM_ABSORB,DM_DRAIN,DM_UNABSORB,DM_SHRINK,DM_GROW,DM_SIZE_STEAL) // Possible digest modes var/tmp/list/transform_modes = list(DM_TRANSFORM_MALE,DM_TRANSFORM_FEMALE,DM_TRANSFORM_KEEP_GENDER,DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR,DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG,DM_TRANSFORM_REPLICA,DM_TRANSFORM_REPLICA_EGG,DM_TRANSFORM_KEEP_GENDER_EGG,DM_TRANSFORM_MALE_EGG,DM_TRANSFORM_FEMALE_EGG, DM_EGG) var/tmp/mob/living/owner // The mob whose belly this is. var/tmp/list/internal_contents = list() // People/Things you've eaten into this belly! diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm index 8affcb171d..0d4c9705f9 100644 --- a/code/modules/vore/eating/belly_obj_vr.dm +++ b/code/modules/vore/eating/belly_obj_vr.dm @@ -32,14 +32,22 @@ var/shrink_grow_size = 1 // This horribly named variable determines the minimum/maximum size it will shrink/grow prey to. var/transferlocation // Location that the prey is released if they struggle and get dropped off. var/release_sound = TRUE // Boolean for now, maybe replace with something else later + var/mode_flags = 0 // Stripping, numbing, etc. //I don't think we've ever altered these lists. making them static until someone actually overrides them somewhere. - var/tmp/static/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_ITEMWEAK,DM_STRIPDIGEST,DM_HEAL,DM_ABSORB,DM_DRAIN,DM_UNABSORB,DM_SHRINK,DM_GROW,DM_SIZE_STEAL,DM_DIGEST_NUMB) // Possible digest modes + //Actual full digest modes + var/tmp/static/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_ABSORB,DM_DRAIN,DM_UNABSORB,DM_HEAL,DM_SHRINK,DM_GROW,DM_SIZE_STEAL) + //Digest mode addon flags + var/tmp/static/list/mode_flag_list = list("Numbing" = DM_FLAG_NUMBING, "Itemweak" = DM_FLAG_ITEMWEAK, "Stripping" = DM_FLAG_STRIPPING) + //Transformation modes var/tmp/static/list/transform_modes = list(DM_TRANSFORM_MALE,DM_TRANSFORM_FEMALE,DM_TRANSFORM_KEEP_GENDER,DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR,DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG,DM_TRANSFORM_REPLICA,DM_TRANSFORM_REPLICA_EGG,DM_TRANSFORM_KEEP_GENDER_EGG,DM_TRANSFORM_MALE_EGG,DM_TRANSFORM_FEMALE_EGG, DM_EGG) + + //List of slots that stripping handles strips var/tmp/static/list/slots = list(slot_back,slot_handcuffed,slot_l_store,slot_r_store,slot_wear_mask,slot_l_hand,slot_r_hand,slot_wear_id,slot_glasses,slot_gloves,slot_head,slot_shoes,slot_belt,slot_wear_suit,slot_w_uniform,slot_s_store,slot_l_ear,slot_r_ear) var/tmp/mob/living/owner // The mob whose belly this is. var/tmp/digest_mode = DM_HOLD // Current mode the belly is set to from digest_modes (+transform_modes if human) + var/tmp/tf_mode = DM_TRANSFORM_REPLICA // Current transformation mode. var/tmp/next_process = 0 // Waiting for this SSbellies times_fired to process again. var/tmp/list/items_preserved = list() // Stuff that wont digest so we shouldn't process it again. var/tmp/next_emote = 0 // When we're supposed to print our next emote, as a belly controller tick # @@ -127,7 +135,8 @@ "digest_messages_owner", "digest_messages_prey", "examine_messages", - "emote_lists" + "emote_lists", + "mode_flags" ) /obj/belly/New(var/newloc) @@ -359,9 +368,12 @@ brain.forceMove(src) items_preserved += brain for(var/slot in slots) - var/obj/item/thingy = M.get_equipped_item(slot = slot) - if(thingy) - M.unEquip(thingy,force = TRUE) + var/obj/item/I = M.get_equipped_item(slot = slot) + if(I) + M.unEquip(I,force = TRUE) + I.gurgle_contaminate(contents, owner) //We do an initial contamination pass to get stuff like IDs wet. + if(mode_flags & DM_FLAG_ITEMWEAK) + items_preserved |= I //Reagent transfer if(ishuman(owner)) @@ -383,6 +395,8 @@ M.absorbed = 1 to_chat(M,"[owner]'s [lowertext(name)] absorbs your body, making you part of them.") to_chat(owner,"Your [lowertext(name)] absorbs [M]'s body, making them part of you.") + if(M.noisy) //Mute drained absorbee hunger if enabled. + M.noisy = FALSE if(ishuman(M) && ishuman(owner)) var/mob/living/carbon/human/Prey = M @@ -533,17 +547,12 @@ digest_mode = DM_ABSORB return - else if(prob(digestchance) && digest_mode != DM_ITEMWEAK && digest_mode != DM_DIGEST) //Finally, let's see if it should run the digest chance. + else if(prob(digestchance) && digest_mode != DM_DIGEST) //Finally, let's see if it should run the digest chance. to_chat(R,"In response to your struggling, \the [lowertext(name)] begins to get more active...") to_chat(owner,"You feel your [lowertext(name)] beginning to become active!") - digest_mode = DM_ITEMWEAK - return - - else if(prob(digestchance) && digest_mode == DM_ITEMWEAK) //Oh god it gets even worse if you fail twice! - to_chat(R,"In response to your struggling, \the [lowertext(name)] begins to get even more active!") - to_chat(owner,"You feel your [lowertext(name)] beginning to become even more active!") digest_mode = DM_DIGEST return + else //Nothing interesting happened. to_chat(R,"You make no progress in escaping [owner]'s [lowertext(name)].") to_chat(owner,"Your prey appears to be unable to make any progress in escaping your [lowertext(name)].") @@ -601,6 +610,7 @@ dupe.transferlocation = transferlocation dupe.bulge_size = bulge_size dupe.shrink_grow_size = shrink_grow_size + dupe.mode_flags = mode_flags //// Object-holding variables //struggle_messages_outside - strings diff --git a/code/modules/vore/eating/bellymodes_tf_vr.dm b/code/modules/vore/eating/bellymodes_tf_vr.dm new file mode 100644 index 0000000000..1f638f4f98 --- /dev/null +++ b/code/modules/vore/eating/bellymodes_tf_vr.dm @@ -0,0 +1,237 @@ +/obj/belly/proc/process_tf(var/mode,var/list/touchable_mobs) //We pass mode so it's mega-ultra local. + /* May not be necessary... Transform only shows up in the panel for humans. + if(!ishuman(owner)) + return //Need DNA and junk for this. + */ + + //Cast here for reduced duplication + var/mob/living/carbon/human/O = owner + +///////////////////////////// DM_TRANSFORM_HAIR_AND_EYES ///////////////////////////// + if(mode == DM_TRANSFORM_HAIR_AND_EYES) + for (var/mob/living/carbon/human/P in touchable_mobs) + if(P.stat == DEAD) + continue + + if(O.nutrition > 400 && P.nutrition < 400) + O.nutrition -= 2 + P.nutrition += 1.5 + + if(check_eyes(P) || check_hair(P)) + change_eyes(P) + change_hair(P,1) + +///////////////////////////// DM_TRANSFORM_MALE ///////////////////////////// + else if(mode == DM_TRANSFORM_MALE) + for (var/mob/living/carbon/human/P in touchable_mobs) + if(P.stat == DEAD) + continue + + if(O.nutrition > 400 && P.nutrition < 400) + O.nutrition -= 2 + P.nutrition += 1.5 + + if(check_eyes(P)) + change_eyes(P,1) + continue + + if(check_hair(P) || check_skin(P)) + change_hair(P) + change_skin(P,1) + continue + + if(check_gender(P,MALE)) + change_gender(P,MALE,1) + +///////////////////////////// DM_TRANSFORM_FEMALE ///////////////////////////// + else if(mode == DM_TRANSFORM_FEMALE) + for (var/mob/living/carbon/human/P in touchable_mobs) + if(P.stat == DEAD) + continue + + if(O.nutrition > 400 && P.nutrition < 400) + O.nutrition -= 2 + P.nutrition += 1.5 + + if(check_eyes(P)) + change_eyes(P,1) + continue + + if(check_hair(P) || check_skin(P)) + change_hair(P) + change_skin(P,1) + continue + + if(check_gender(P,FEMALE)) + change_gender(P,FEMALE,1) + +///////////////////////////// DM_TRANSFORM_KEEP_GENDER ///////////////////////////// + else if(mode == DM_TRANSFORM_KEEP_GENDER) + for (var/mob/living/carbon/human/P in touchable_mobs) + if(P.stat == DEAD) + continue + + if(O.nutrition > 400 && P.nutrition < 400) + O.nutrition -= 2 + P.nutrition += 1.5 + + if(check_eyes(P)) + change_eyes(P,1) + continue + + if(check_hair(P) || check_skin(P)) + change_hair(P) + change_skin(P,1) + +///////////////////////////// DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR ///////////////////////////// + else if(mode == DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR) + for (var/mob/living/carbon/human/P in touchable_mobs) + if(P.stat == DEAD) + continue + + if(O.nutrition > 400 && P.nutrition < 400) + O.nutrition -= 2 + P.nutrition += 1.5 + + if(check_ears(P) || check_tail_nocolor(P) || check_wing_nocolor(P) || check_species(P)) + change_ears(P) + change_tail_nocolor(P) + change_wing_nocolor(P) + change_species(P,1) + +///////////////////////////// DM_TRANSFORM_REPLICA ///////////////////////////// + else if(mode == DM_TRANSFORM_REPLICA) + for (var/mob/living/carbon/human/P in touchable_mobs) + if(P.stat == DEAD) + continue + + if(O.nutrition > 400 && P.nutrition < 400) + O.nutrition -= 2 + P.nutrition += 1.5 + + if(check_eyes(P)) + change_eyes(P,1) + continue + + if(check_hair(P) || check_skin(P)) + change_hair(P) + change_skin(P,1) + continue + + if(check_ears(P) || check_tail(P) || check_wing(P) || check_species(P)) + change_ears(P) + change_tail(P) + change_wing(P) + change_species(P,1) + +///////////////////////////// DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG ///////////////////////////// + else if(mode == DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG) + for (var/mob/living/carbon/human/P in touchable_mobs) + if(P.stat == DEAD) + continue + + if(check_ears(P) || check_tail_nocolor(P) || check_wing_nocolor(P)|| check_species(P)) + change_ears(P) + change_tail_nocolor(P) + change_wing_nocolor(P) + change_species(P,1) + continue + + if(!P.absorbed) + put_in_egg(P,1) + +///////////////////////////// DM_TRANSFORM_KEEP_GENDER_EGG ///////////////////////////// + else if(mode == DM_TRANSFORM_KEEP_GENDER_EGG) + for (var/mob/living/carbon/human/P in touchable_mobs) + if(P.stat == DEAD) + continue + + if(check_eyes(P)) + change_eyes(P,1) + continue + + if(check_hair(P) || check_skin(P)) + change_hair(P) + change_skin(P,1) + continue + + if(!P.absorbed) + put_in_egg(P,1) + +///////////////////////////// DM_TRANSFORM_REPLICA_EGG ///////////////////////////// + else if(mode == DM_TRANSFORM_REPLICA_EGG) + for (var/mob/living/carbon/human/P in touchable_mobs) + if(P.stat == DEAD) + continue + + if(check_eyes(P)) + change_eyes(P,1) + continue + + if(check_hair(P) || check_skin(P)) + change_hair(P) + change_skin(P,1) + continue + + if(check_ears(P) || check_tail(P) || check_wing(P) || check_species(P)) + change_ears(P) + change_tail(P) + change_wing(P) + change_species(P,1) + continue + + if(!P.absorbed) + put_in_egg(P,1) + +///////////////////////////// DM_TRANSFORM_MALE_EGG ///////////////////////////// + else if(mode == DM_TRANSFORM_MALE_EGG) + for (var/mob/living/carbon/human/P in touchable_mobs) + if(P.stat == DEAD) + continue + + if(check_eyes(P)) + change_eyes(P,1) + continue + + if(check_hair(P) || check_skin(P)) + change_hair(P) + change_skin(P,1) + continue + + if(check_gender(P,MALE)) + change_gender(P,MALE,1) + continue + + if(!P.absorbed) + put_in_egg(P,1) + +///////////////////////////// DM_TRANSFORM_FEMALE_EGG ///////////////////////////// + else if(mode == DM_TRANSFORM_FEMALE_EGG) + for (var/mob/living/carbon/human/P in touchable_mobs) + if(P.stat == DEAD) + continue + + if(check_eyes(P)) + change_eyes(P,1) + continue + + if(check_hair(P) || check_skin(P)) + change_hair(P) + change_skin(P,1) + continue + + if(check_gender(P,MALE)) + change_gender(P,MALE,1) + continue + + if(!P.absorbed) + put_in_egg(P,1) + +///////////////////////////// DM_EGG ///////////////////////////// + else if(mode == DM_EGG) + for (var/mob/living/carbon/human/P in touchable_mobs) + if(P.absorbed || P.stat == DEAD) + continue + + put_in_egg(P,1) + diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm index 564531ef5b..66df5151f2 100644 --- a/code/modules/vore/eating/bellymodes_vr.dm +++ b/code/modules/vore/eating/bellymodes_vr.dm @@ -20,30 +20,74 @@ var/list/EL = emote_lists[digest_mode] if(LAZYLEN(EL)) for(var/mob/living/M in contents) - if(M.digestable || !(digest_mode == DM_DIGEST || digest_mode == DM_DIGEST_NUMB || digest_mode == DM_ITEMWEAK)) // don't give digesty messages to indigestible people + if(M.digestable || digest_mode != DM_DIGEST) // don't give digesty messages to indigestible people to_chat(M,"[pick(EL)]") /////////////////////////// Exit Early //////////////////////////// - var/list/touchable_items = contents - items_preserved - if(!length(touchable_items)) + var/list/touchable_atoms = contents - items_preserved + if(!length(touchable_atoms)) return SSBELLIES_PROCESSED -//////////////////////// Absorbed Handling //////////////////////// - for(var/mob/living/M in contents) - if(M.absorbed) - M.Weaken(5) + var/list/touchable_mobs = list() + +///////////////////// Early Non-Mode Handling ///////////////////// + var/did_an_item = FALSE + for(var/A in touchable_atoms) + //Handle stray items + if(isitem(A) && !did_an_item) + var/obj/item/I = A + if(mode_flags & DM_FLAG_ITEMWEAK) + I.gurgle_contaminate(contents, owner) + items_preserved |= I + else + digest_item(I) + owner.updateVRPanel() + did_an_item = TRUE + + //Handle eaten mobs + else if(isliving(A)) + var/mob/living/L = A + touchable_mobs += L + + if(L.absorbed) + L.Weaken(5) + + //Handle 'human' + if(ishuman(L)) + var/mob/living/carbon/human/H = L + + //Numbing flag + if(mode_flags & DM_FLAG_NUMBING) + if(H.bloodstr.get_reagent_amount("numbenzyme") < 2) + H.bloodstr.add_reagent("numbenzyme",4) + + //Stripping flag + if(mode_flags & DM_FLAG_STRIPPING) + for(var/slot in slots) + var/obj/item/I = H.get_equipped_item(slot = slot) + if(I) + H.unEquip(I,force = TRUE) + if(mode_flags & DM_FLAG_ITEMWEAK) + I.gurgle_contaminate(contents, owner) + items_preserved |= I + else + digest_item(I) + owner.updateVRPanel() + H.updateVRPanel() + break ///////////////////////////// DM_HOLD ///////////////////////////// if(digest_mode == DM_HOLD) return SSBELLIES_PROCESSED //Pretty boring, huh //////////////////////////// DM_DIGEST //////////////////////////// - else if(digest_mode == DM_DIGEST || digest_mode == DM_DIGEST_NUMB || digest_mode == DM_ITEMWEAK) + else if(digest_mode == DM_DIGEST) if(prob(50)) //Was SO OFTEN. AAAA. play_sound = pick(digestion_sounds) - for (var/mob/living/M in contents) + for (var/target in touchable_mobs) + var/mob/living/M = target //Pref protection! if (!M.digestable || M.absorbed) continue @@ -71,11 +115,6 @@ owner.update_icons() continue - if(digest_mode == DM_DIGEST_NUMB && ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.bloodstr.get_reagent_amount("numbenzyme") < 5) - H.bloodstr.add_reagent("numbenzyme",10) - // Deal digestion damage (and feed the pred) M.adjustBruteLoss(digest_brute) M.adjustFireLoss(digest_burn) @@ -91,49 +130,13 @@ owner.nutrition += 2*(digest_brute+digest_burn)/difference M.updateVRPanel() - //Contaminate or gurgle items - var/obj/item/T = pick(touchable_items) - if(istype(T)) - if(digest_mode == DM_ITEMWEAK) - if(istype(T,/obj/item/weapon/reagent_containers/food) || istype(T,/obj/item/weapon/holder) || istype(T,/obj/item/organ)) - digest_item(T) - else - T.gurgle_contaminate(contents, owner) - items_preserved |= T - else - digest_item(T) - - owner.updateVRPanel() - -//////////////////////////// DM_STRIPDIGEST //////////////////////////// - else if(digest_mode == DM_STRIPDIGEST) // Only gurgle the gear off your prey. - - if(prob(50)) - play_sound = pick(digestion_sounds) - - // Handle loose items first. - var/obj/item/T = pick(touchable_items) - if(istype(T)) - digest_item(T) - - for(var/mob/living/carbon/human/M in contents) - if (M.absorbed) - continue - for(var/slot in slots) - var/obj/item/thingy = M.get_equipped_item(slot = slot) - if(thingy) - M.unEquip(thingy,force = TRUE) - digest_item(thingy) - break - M.updateVRPanel() - owner.updateVRPanel() //////////////////////////// DM_ABSORB //////////////////////////// else if(digest_mode == DM_ABSORB) - for (var/mob/living/M in contents) - + for (var/target in touchable_mobs) + var/mob/living/M = target if(prob(10)) //Less often than gurgles. People might leave this on forever. play_sound = pick(digestion_sounds) @@ -150,7 +153,9 @@ //////////////////////////// DM_UNABSORB //////////////////////////// else if(digest_mode == DM_UNABSORB) - for (var/mob/living/M in contents) + for (var/target in touchable_mobs) + var/mob/living/M = target + if(M.absorbed && owner.nutrition >= 100) M.absorbed = 0 to_chat(M,"You suddenly feel solid again ") @@ -160,8 +165,9 @@ //////////////////////////// DM_DRAIN //////////////////////////// else if(digest_mode == DM_DRAIN) - for (var/mob/living/M in contents) - + for (var/target in touchable_mobs) + var/mob/living/M = target + if(prob(10)) //Less often than gurgles. People might leave this on forever. play_sound = pick(digestion_sounds) @@ -173,13 +179,15 @@ //////////////////////////// DM_SHRINK //////////////////////////// else if(digest_mode == DM_SHRINK) - for (var/mob/living/M in contents) - + for (var/target in touchable_mobs) + var/mob/living/M = target + if(prob(10)) //Infinite gurgles! play_sound = pick(digestion_sounds) if(M.size_multiplier > shrink_grow_size) //Shrink until smol. M.resize(M.size_multiplier-0.01) //Shrink by 1% per tick. + if(M.nutrition >= 100) //Absorbing bodymass results in nutrition if possible. var/oldnutrition = (M.nutrition * 0.05) M.nutrition = (M.nutrition * 0.95) @@ -188,8 +196,9 @@ //////////////////////////// DM_GROW //////////////////////////// else if(digest_mode == DM_GROW) - for (var/mob/living/M in contents) - + for (var/target in touchable_mobs) + var/mob/living/M = target + if(prob(10)) play_sound = pick(digestion_sounds) @@ -201,14 +210,16 @@ //////////////////////////// DM_SIZE_STEAL //////////////////////////// else if(digest_mode == DM_SIZE_STEAL) - for (var/mob/living/M in contents) - + for (var/target in touchable_mobs) + var/mob/living/M = target + if(prob(10)) play_sound = pick(digestion_sounds) if(M.size_multiplier > shrink_grow_size && owner.size_multiplier < 2) //Grow until either pred is large or prey is small. owner.resize(owner.size_multiplier+0.01) //Grow by 1% per tick. M.resize(M.size_multiplier-0.01) //Shrink by 1% per tick + if(M.nutrition >= 100) var/oldnutrition = (M.nutrition * 0.05) M.nutrition = (M.nutrition * 0.95) @@ -216,261 +227,31 @@ ///////////////////////////// DM_HEAL ///////////////////////////// else if(digest_mode == DM_HEAL) - if(prob(50)) //Wet heals! + + if(prob(50)) //Wet heals! The secret is you can leave this on for gurgle noises for fun. play_sound = pick(digestion_sounds) - for (var/mob/living/M in contents) - if(M.stat != DEAD) - if(owner.nutrition > 90 && (M.health < M.maxHealth)) - M.adjustBruteLoss(-5) - M.adjustFireLoss(-5) - owner.nutrition -= 2 - if(M.nutrition <= 400) - M.nutrition += 1 - else if(owner.nutrition > 90 && (M.nutrition <= 400)) - owner.nutrition -= 1 + for (var/target in touchable_mobs) + var/mob/living/M = target + + if(M.stat == DEAD) + continue + + if(owner.nutrition > 90 && (M.health < M.maxHealth)) + M.adjustBruteLoss(-5) + M.adjustFireLoss(-5) + owner.nutrition -= 2 + if(M.nutrition <= 400) M.nutrition += 1 + else if(owner.nutrition > 90 && (M.nutrition <= 400)) + owner.nutrition -= 1 + M.nutrition += 1 -///////////////////////////// DM_TRANSFORM_HAIR_AND_EYES ///////////////////////////// - else if(digest_mode == DM_TRANSFORM_HAIR_AND_EYES && ishuman(owner)) - for (var/mob/living/carbon/human/P in contents) - if(P.stat == DEAD) - continue - - var/mob/living/carbon/human/O = owner - - if(O.nutrition > 400 && P.nutrition < 400) - O.nutrition -= 2 - P.nutrition += 1.5 - - if(check_eyes(P) || check_hair(P)) - change_eyes(P) - change_hair(P,1) - -///////////////////////////// DM_TRANSFORM_MALE ///////////////////////////// - else if(digest_mode == DM_TRANSFORM_MALE && ishuman(owner)) - for (var/mob/living/carbon/human/P in contents) - if(P.stat == DEAD) - continue - - var/mob/living/carbon/human/O = owner - - if(O.nutrition > 400 && P.nutrition < 400) - O.nutrition -= 2 - P.nutrition += 1.5 - - if(check_eyes(P)) - change_eyes(P,1) - continue - - if(check_hair(P) || check_skin(P)) - change_hair(P) - change_skin(P,1) - continue - - if(check_gender(P,MALE)) - change_gender(P,MALE,1) - -///////////////////////////// DM_TRANSFORM_FEMALE ///////////////////////////// - else if(digest_mode == DM_TRANSFORM_FEMALE && ishuman(owner)) - for (var/mob/living/carbon/human/P in contents) - if(P.stat == DEAD) - continue - - var/mob/living/carbon/human/O = owner - - if(O.nutrition > 400 && P.nutrition < 400) - O.nutrition -= 2 - P.nutrition += 1.5 - - if(check_eyes(P)) - change_eyes(P,1) - continue - - if(check_hair(P) || check_skin(P)) - change_hair(P) - change_skin(P,1) - continue - - if(check_gender(P,FEMALE)) - change_gender(P,FEMALE,1) - -///////////////////////////// DM_TRANSFORM_KEEP_GENDER ///////////////////////////// - else if(digest_mode == DM_TRANSFORM_KEEP_GENDER && ishuman(owner)) - for (var/mob/living/carbon/human/P in contents) - if(P.stat == DEAD) - continue - - var/mob/living/carbon/human/O = owner - - if(O.nutrition > 400 && P.nutrition < 400) - O.nutrition -= 2 - P.nutrition += 1.5 - - if(check_eyes(P)) - change_eyes(P,1) - continue - - if(check_hair(P) || check_skin(P)) - change_hair(P) - change_skin(P,1) - -///////////////////////////// DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR ///////////////////////////// - else if(digest_mode == DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR && ishuman(owner)) - for (var/mob/living/carbon/human/P in contents) - if(P.stat == DEAD) - continue - - var/mob/living/carbon/human/O = owner - - if(O.nutrition > 400 && P.nutrition < 400) - O.nutrition -= 2 - P.nutrition += 1.5 - - if(check_ears(P) || check_tail_nocolor(P) || check_wing_nocolor(P) || check_species(P)) - change_ears(P) - change_tail_nocolor(P) - change_wing_nocolor(P) - change_species(P,1) - -///////////////////////////// DM_TRANSFORM_REPLICA ///////////////////////////// - else if(digest_mode == DM_TRANSFORM_REPLICA && ishuman(owner)) - for (var/mob/living/carbon/human/P in contents) - if(P.stat == DEAD) - continue - - var/mob/living/carbon/human/O = owner - - if(O.nutrition > 400 && P.nutrition < 400) - O.nutrition -= 2 - P.nutrition += 1.5 - - if(check_eyes(P)) - change_eyes(P,1) - continue - - if(check_hair(P) || check_skin(P)) - change_hair(P) - change_skin(P,1) - continue - - if(check_ears(P) || check_tail(P) || check_wing(P) || check_species(P)) - change_ears(P) - change_tail(P) - change_wing(P) - change_species(P,1) - -///////////////////////////// DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG ///////////////////////////// - else if(digest_mode == DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG && ishuman(owner)) - for (var/mob/living/carbon/human/P in contents) - if(P.stat == DEAD) - continue - - if(check_ears(P) || check_tail_nocolor(P) || check_wing_nocolor(P)|| check_species(P)) - change_ears(P) - change_tail_nocolor(P) - change_wing_nocolor(P) - change_species(P,1) - continue - - if(!P.absorbed) - put_in_egg(P,1) - -///////////////////////////// DM_TRANSFORM_KEEP_GENDER_EGG ///////////////////////////// - else if(digest_mode == DM_TRANSFORM_KEEP_GENDER_EGG && ishuman(owner)) - for (var/mob/living/carbon/human/P in contents) - if(P.stat == DEAD) - continue - - if(check_eyes(P)) - change_eyes(P,1) - continue - - if(check_hair(P) || check_skin(P)) - change_hair(P) - change_skin(P,1) - continue - - if(!P.absorbed) - put_in_egg(P,1) - -///////////////////////////// DM_TRANSFORM_REPLICA_EGG ///////////////////////////// - else if(digest_mode == DM_TRANSFORM_REPLICA_EGG && ishuman(owner)) - for (var/mob/living/carbon/human/P in contents) - if(P.stat == DEAD) - continue - - if(check_eyes(P)) - change_eyes(P,1) - continue - - if(check_hair(P) || check_skin(P)) - change_hair(P) - change_skin(P,1) - continue - - if(check_ears(P) || check_tail(P) || check_wing(P) || check_species(P)) - change_ears(P) - change_tail(P) - change_wing(P) - change_species(P,1) - continue - - if(!P.absorbed) - put_in_egg(P,1) - -///////////////////////////// DM_TRANSFORM_MALE_EGG ///////////////////////////// - else if(digest_mode == DM_TRANSFORM_MALE_EGG && ishuman(owner)) - for (var/mob/living/carbon/human/P in contents) - if(P.stat == DEAD) - continue - - if(check_eyes(P)) - change_eyes(P,1) - continue - - if(check_hair(P) || check_skin(P)) - change_hair(P) - change_skin(P,1) - continue - - if(check_gender(P,MALE)) - change_gender(P,MALE,1) - continue - - if(!P.absorbed) - put_in_egg(P,1) - -///////////////////////////// DM_TRANSFORM_FEMALE_EGG ///////////////////////////// - else if(digest_mode == DM_TRANSFORM_FEMALE_EGG && ishuman(owner)) - for (var/mob/living/carbon/human/P in contents) - if(P.stat == DEAD) - continue - - if(check_eyes(P)) - change_eyes(P,1) - continue - - if(check_hair(P) || check_skin(P)) - change_hair(P) - change_skin(P,1) - continue - - if(check_gender(P,MALE)) - change_gender(P,MALE,1) - continue - - if(!P.absorbed) - put_in_egg(P,1) - -///////////////////////////// DM_EGG ///////////////////////////// - else if(digest_mode == DM_EGG && ishuman(owner)) - for (var/mob/living/carbon/human/P in contents) - if(P.absorbed || P.stat == DEAD) - continue - - put_in_egg(P,1) +/////////////////////////// DM_TRANSFORM /////////////////////////// + else if(digest_mode == DM_TRANSFORM) + process_tf(tf_mode, touchable_mobs) +/////////////////////////// Make any noise /////////////////////////// if(play_sound) playsound(src, play_sound, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, ignore_walls = TRUE, preference = /datum/client_preference/digestion_noises) return SSBELLIES_PROCESSED diff --git a/code/modules/vore/eating/digest_act_vr.dm b/code/modules/vore/eating/digest_act_vr.dm index 78512bf09c..bbaa5fab33 100644 --- a/code/modules/vore/eating/digest_act_vr.dm +++ b/code/modules/vore/eating/digest_act_vr.dm @@ -49,7 +49,7 @@ . = ..() /obj/item/weapon/card/id/digest_act(var/atom/movable/item_storage = null) - desc = "A partially digested card that has seen better days. Much of it's data has been destroyed." + desc = "A partially digested card that has seen better days. Much of it's data has been destroyed, but the card itself is still completely salvageable. Please recycle it at crew resources office." icon = 'icons/obj/card_vr.dmi' icon_state = "digested" access = list() // No access @@ -82,7 +82,7 @@ /obj/item/weapon/storage/digest_act(var/atom/movable/item_storage = null) for(var/obj/item/I in contents) I.screen_loc = null - + . = ..() ///////////// diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm index d3f37842bf..31a9e7e476 100644 --- a/code/modules/vore/eating/vorepanel_vr.dm +++ b/code/modules/vore/eating/vorepanel_vr.dm @@ -18,7 +18,7 @@ var/dat = picker_holder.gen_ui(src) - picker_holder.popup = new(src, "insidePanel","Inside!", 400, 600, picker_holder) + picker_holder.popup = new(src, "insidePanel","Inside!", 450, 700, picker_holder) picker_holder.popup.set_content(dat) picker_holder.popup.open() src.openpanel = 1 @@ -31,7 +31,7 @@ var/dat = picker_holder.gen_ui(src) - picker_holder.popup = new(src, "insidePanel","Inside!", 400, 600, picker_holder) + picker_holder.popup = new(src, "insidePanel","Inside!", 450, 700, picker_holder) picker_holder.popup.set_content(dat) picker_holder.popup.open() @@ -110,46 +110,44 @@ spanstyle = "" if(DM_DIGEST) spanstyle = "color:red;" - if(DM_ITEMWEAK) - spanstyle = "color:red;" - if(DM_STRIPDIGEST) - spanstyle = "color:red;" - if(DM_HEAL) - spanstyle = "color:green;" if(DM_ABSORB) spanstyle = "color:purple;" if(DM_DRAIN) spanstyle = "color:purple;" + if(DM_HEAL) + spanstyle = "color:green;" if(DM_SHRINK) spanstyle = "color:purple;" if(DM_GROW) spanstyle = "color:purple;" if(DM_SIZE_STEAL) spanstyle = "color:purple;" - if(DM_TRANSFORM_MALE) - spanstyle = "color:purple;" - if(DM_TRANSFORM_HAIR_AND_EYES) - spanstyle = "color:purple;" - if(DM_TRANSFORM_FEMALE) - spanstyle = "color:purple;" - if(DM_TRANSFORM_KEEP_GENDER) - spanstyle = "color:purple;" - if(DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR) - spanstyle = "color:purple;" - if(DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG) - spanstyle = "color:purple;" - if(DM_TRANSFORM_REPLICA) - spanstyle = "color:purple;" - if(DM_TRANSFORM_REPLICA_EGG) - spanstyle = "color:purple;" - if(DM_TRANSFORM_KEEP_GENDER_EGG) - spanstyle = "color:purple;" - if(DM_TRANSFORM_MALE_EGG) - spanstyle = "color:purple;" - if(DM_TRANSFORM_FEMALE_EGG) - spanstyle = "color:purple;" - if(DM_EGG) - spanstyle = "color:purple;" + if(DM_TRANSFORM) + switch(B.tf_mode) + if(DM_TRANSFORM_MALE) + spanstyle = "color:purple;" + if(DM_TRANSFORM_HAIR_AND_EYES) + spanstyle = "color:purple;" + if(DM_TRANSFORM_FEMALE) + spanstyle = "color:purple;" + if(DM_TRANSFORM_KEEP_GENDER) + spanstyle = "color:purple;" + if(DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR) + spanstyle = "color:purple;" + if(DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG) + spanstyle = "color:purple;" + if(DM_TRANSFORM_REPLICA) + spanstyle = "color:purple;" + if(DM_TRANSFORM_REPLICA_EGG) + spanstyle = "color:purple;" + if(DM_TRANSFORM_KEEP_GENDER_EGG) + spanstyle = "color:purple;" + if(DM_TRANSFORM_MALE_EGG) + spanstyle = "color:purple;" + if(DM_TRANSFORM_FEMALE_EGG) + spanstyle = "color:purple;" + if(DM_EGG) + spanstyle = "color:purple;" dat += " ([B.contents.len])" @@ -193,7 +191,19 @@ //Digest Mode Button dat += "
Belly Mode:" - dat += " [selected.digest_mode]" + var/mode = selected.digest_mode + dat += " [mode == DM_TRANSFORM ? selected.tf_mode : mode]" + + //Mode addons button + dat += "
Mode Addons:" + var/list/flag_list = list() + for(var/flag_name in selected.mode_flag_list) + if(selected.mode_flags & selected.mode_flag_list[flag_name]) + flag_list += flag_name + if(flag_list.len) + dat += " [english_list(flag_list)]" + else + dat += " None" //Belly verb dat += "
Vore Verb:" @@ -497,16 +507,32 @@ selected.name = new_name if(href_list["b_mode"]) - var/list/menu_list = selected.digest_modes + var/list/menu_list = selected.digest_modes.Copy() if(istype(usr,/mob/living/carbon/human)) - menu_list += selected.transform_modes + menu_list += DM_TRANSFORM var/new_mode = input("Choose Mode (currently [selected.digest_mode])") as null|anything in menu_list if(!new_mode) return 0 + + if(new_mode == DM_TRANSFORM) //Snowflek submenu + var/list/tf_list = selected.transform_modes + var/new_tf_mode = input("Choose TF Mode (currently [selected.tf_mode])") as null|anything in tf_list + if(!new_tf_mode) + return 0 + selected.tf_mode = new_tf_mode + selected.digest_mode = new_mode selected.items_preserved.Cut() //Re-evaltuate all items in belly on belly-mode change + if(href_list["b_addons"]) + var/list/menu_list = selected.mode_flag_list.Copy() + var/toggle_addon = input("Toggle Addon") as null|anything in menu_list + if(!toggle_addon) + return 0 + selected.mode_flags ^= selected.mode_flag_list[toggle_addon] + selected.items_preserved.Cut() //Re-evaltuate all items in belly on addon toggle + if(href_list["b_desc"]) var/new_desc = html_encode(input(usr,"Belly Description ([BELLIES_DESC_MAX] char limit):","New Description",selected.desc) as message|null) diff --git a/code/modules/vore/fluffstuff/custom_boxes_vr.dm b/code/modules/vore/fluffstuff/custom_boxes_vr.dm index 1776ca6eeb..57b83c9876 100644 --- a/code/modules/vore/fluffstuff/custom_boxes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_boxes_vr.dm @@ -172,27 +172,6 @@ can_hold = list(/obj/item/clothing/under/swimsuit/) has_items = list(/obj/item/clothing/under/swimsuit/fluff/penelope) -//Arokha:Aronai Kadigan -/obj/item/weapon/storage/backpack/satchel/gen/fluff/aronai - name = "blue medical satchel" - desc = "A medical satchel done up in blue and white." - - New() - ..() //Might look like a lot... but all small items. - //Centcom stuff and permit - new /obj/item/weapon/card/id/centcom/station/fluff/aronai(src) - //new /obj/item/clothing/accessory/permit/gun/fluff/aronai_kadigan(src) - //Gun and holster - //new /obj/item/weapon/gun/projectile/nsfw(src) - //new /obj/item/ammo_magazine/nsfw_mag(src) - //new /obj/item/ammo_casing/nsfw_batt/stun(src) - //new /obj/item/ammo_casing/nsfw_batt/stun(src) - //new /obj/item/ammo_casing/nsfw_batt/net(src) - //new /obj/item/clothing/accessory/holster(src) - -/obj/item/weapon/storage/backpack/satchel/gen/fluff/aronai/digest_act(...) - return FALSE //I get eaten a lot, okay - //Aerowing:Sebastian Aji /obj/item/weapon/storage/box/fluff/sebastian_aji name = "Sebastian's Lumoco Arms P3 Box" diff --git a/code/modules/vore/fluffstuff/custom_clothes_vr.dm b/code/modules/vore/fluffstuff/custom_clothes_vr.dm index dcc55e42ae..416cbe5a2c 100644 --- a/code/modules/vore/fluffstuff/custom_clothes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_clothes_vr.dm @@ -1781,4 +1781,41 @@ Departamental Swimsuits, for general use else user << "You set the [name]'s tag to '[str]'." name = initial(name) + " ([str])" - desc = initial(desc) + " The tag says \"[str]\"." \ No newline at end of file + desc = initial(desc) + " The tag says \"[str]\"." + +/obj/item/clothing/head/helmet/space/void/security/hasd + name = "HASD EVA faceplate" + desc = "It's a faceplate that slots into the HASD EVA bodyplate assembly. Functionally useless alone." + + icon = 'icons/vore/custom_clothes_vr.dmi' + icon_state = "hasd_helm" + + icon_override = 'icons/vore/custom_clothes_vr.dmi' + item_state = "hasd_helm" + species_restricted = null + + mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0) + if(..()) + if(H.ckey != "silencedmp5a5") + H << "...The faceplate is clearly not made for your anatomy, thus, does not fit." + return 0 + else + return 1 + +/obj/item/clothing/suit/space/void/security/hasd + name = "HASD EVA bodyplates" + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) + desc = "A series of armor plates painted black, deployed from a back-mounted module. They fit smoothly over the unit's armor plates and projects a skintight bubble shield over the unit's uncovered parts. Faceplate and coolant unit not included." + species_restricted = null + icon = 'icons/mob/taursuits_vr.dmi' + icon_override = 'icons/mob/taursuits_vr.dmi' + icon_state = "hasd_suit" + item_state = "hasd_suit" + pixel_x = -16 + + mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0) + if(..() && istype(H) && H.ckey == "silencedmp5a5" && istype(H.tail_style, /datum/sprite_accessory/tail/taur/lizard/synthlizard)) + return 1 + else + H << "This suit is not designed for you." + return 0 diff --git a/code/modules/vore/fluffstuff/custom_guns_vr.dm b/code/modules/vore/fluffstuff/custom_guns_vr.dm index b42c15cc8c..50f238fd59 100644 --- a/code/modules/vore/fluffstuff/custom_guns_vr.dm +++ b/code/modules/vore/fluffstuff/custom_guns_vr.dm @@ -347,6 +347,11 @@ name = "\improper MEUSOC .45" desc = "Some serious drywall work, coming up!" */ +//hzdonut:Jesse Soemmer +/obj/item/weapon/gun/projectile/revolver/fluff/jesselemat + name = "Modified LeMat" + desc = "The LeMat Revolver is a 9 shot revolver with a secondary firing barrel for loading shotgun shells. Uses .38-Special and 12g rounds depending on the barrel. This one appears to have had it's secondary barrel sealed off and looks to be in pristine condition. Either it's brand new, or its owner takes very good care of it." + icon_state = "lemat" //////////////////// Energy Weapons //////////////////// @@ -794,4 +799,4 @@ if(T.z in using_map.map_levels) to_chat(user, "The safety device prevents the gun from firing this close to the facility.") return 0 - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/vore/fluffstuff/custom_items_vr.dm b/code/modules/vore/fluffstuff/custom_items_vr.dm index d82c18828f..2668bd73ec 100644 --- a/code/modules/vore/fluffstuff/custom_items_vr.dm +++ b/code/modules/vore/fluffstuff/custom_items_vr.dm @@ -1901,7 +1901,7 @@ user.visible_message(pick("\The [user] is slitting \his stomach open with \the [src]! It looks like [tempgender] trying to commit seppuku.",\ "\The [user] is falling on \the [src]! It looks like [tempgender] trying to commit suicide.")) return (BRUTELOSS|FIRELOSS) - + /obj/item/weapon/melee/fluffstuff/awoosword name = "Wolfgirl Sword Replica" desc = "A replica of a large, scimitar-like sword with a dull edge. Ceremonial... until it isn't." @@ -1962,4 +1962,17 @@ throwforce = 3 w_class = ITEMSIZE_NORMAL damtype = HALLOSS - attack_verb = list("flogged", "whipped", "lashed", "disciplined", "chastised", "flayed", "punished") \ No newline at end of file + attack_verb = list("flogged", "whipped", "lashed", "disciplined", "chastised", "flayed", "punished") + +//SilencedMP5A5 - Serdykov Antoz +/obj/item/device/modkit_conversion/hasd + name = "HASD EVA modification kit" + desc = "A kit containing all the needed tools and parts to modify a suit and helmet into something a HASD unit can use for EVA operations." + icon = 'icons/vore/custom_items_vr.dmi' + icon_state = "modkit" + + from_helmet = /obj/item/clothing/head/helmet/space/void/security + from_suit = /obj/item/clothing/suit/space/void/security/taur + to_helmet = /obj/item/clothing/head/helmet/space/void/security/hasd + to_suit = /obj/item/clothing/suit/space/void/security/hasd + diff --git a/code/modules/vore/fluffstuff/custom_permits_vr.dm b/code/modules/vore/fluffstuff/custom_permits_vr.dm index f5afc8aaec..c96783e246 100644 --- a/code/modules/vore/fluffstuff/custom_permits_vr.dm +++ b/code/modules/vore/fluffstuff/custom_permits_vr.dm @@ -51,6 +51,11 @@ name = "Sorrel Cavalet's Sidearm Permit" desc = "A card indicating that the owner is allowed to carry a sidearm. It is issued by CentCom, so it is valid until it expires on September 26th, 2562." +// hzdonut:Jesse Soemmer +/obj/item/clothing/accessory/permit/gun/fluff/JesseSoemmer + name = "Jesse Soemmer's Sidearm Permit" + desc = "A card indicating that the owner is allowed to carry a sidearm. It is issued by CentCom, so it is valid until it expires on March 4, 2563." + /* Legacy Permits // BEGIN - PROTOTYPE /obj/item/clothing/accessory/permit/gun/fluff diff --git a/config/custom_items.txt b/config/custom_items.txt index 0f24e884cf..1861ff82c6 100644 --- a/config/custom_items.txt +++ b/config/custom_items.txt @@ -79,7 +79,7 @@ item_desc: A medical jacket straight from Central Command. { ckey: arokha character_name: Aronai Kadigan -item_path: /obj/item/weapon/storage/backpack/satchel/gen/fluff/aronai +item_path: /obj/item/weapon/card/id/centcom/station/fluff/aronai } { @@ -708,6 +708,13 @@ item_path: /obj/item/clothing/glasses/sunglasses/fluff/alfonso #req_access = 1 #} +{ +ckey: silencedmp5a5 +character_name: NT-HASD #556 +item_path: /obj/item/device/modkit_conversion/hasd +req_access = 1 +} + { ckey: silvertalismen character_name: Tasy Ruffles @@ -886,25 +893,25 @@ item_path: /obj/item/clothing/head/welding/fluff/vinjj { ckey: wickedtemp -character_name: Chakat Tempest +character_name: Chakat Tempest Venesare item_path: /obj/item/clothing/glasses/omnihud/med/fluff/wickedtemphud } { ckey: wickedtemp -character_name: Chakat Tempest -item_path: /obj/item/weapon/reagent_containers/hypospray/vr/tempest +character_name: Chakat Tempest Venesare +item_path: /obj/item/weapon/reagent_containers/hypospray/vial/tempest } { ckey: wickedtemp -character_name: Chakat Tempest +character_name: Chakat Tempest Venesare item_path: /obj/item/weapon/storage/backpack/saddlebag/tempest } { ckey: wickedtemp -character_name: Chakat Tempest +character_name: Chakat Tempest Venesare item_path: /obj/item/weapon/implanter/reagent_generator/tempest } diff --git a/html/changelog.html b/html/changelog.html index 7a3de85cf0..c9a2296c08 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,86 @@

22 March 2018

Chaoko99 updated:

01 April 2018

+

01 April 2018

+

Anewbe updated:

+ +

Cameron653 updated:

+ +

Heroman3003 updated:

+ +

MistyLuminescence updated:

+ +

Woodrat updated:

+ +

battlefieldCommander updated:

+ + +

15 March 2018

+

Anewbe updated:

+ +

Cerebulon updated:

+ +

MisterLayne updated:

+ +

Nerezza updated:

+ +

Woodrat updated:

+ + +

05 March 2018

Anewbe updated: