diff --git a/code/__defines/dcs/flags.dm b/code/__defines/dcs/flags.dm index 84d332bd56..8d3aab2aa7 100644 --- a/code/__defines/dcs/flags.dm +++ b/code/__defines/dcs/flags.dm @@ -42,3 +42,7 @@ //Ouch my toes! #define CALTROP_BYPASS_SHOES 1 #define CALTROP_IGNORE_WALKERS 2 + +// Conflict element IDs +#define CONFLICT_ELEMENT_CRUSHER "crusher" +#define CONFLICT_ELEMENT_KA "kinetic_accelerator" \ No newline at end of file diff --git a/code/__defines/dcs/signals.dm b/code/__defines/dcs/signals.dm index 4947337598..df83ba66ec 100644 --- a/code/__defines/dcs/signals.dm +++ b/code/__defines/dcs/signals.dm @@ -772,3 +772,9 @@ #define COMPONENT_BLOCK_LIGHT_EATER (1<<0) ///from base of [/datum/element/light_eater/proc/devour]: (atom/eaten_light) #define COMSIG_LIGHT_EATER_DEVOUR "light_eater_devour" + +// conflict checking elements +/// (id) - returns flags - Registered on something by conflict checking elements. +#define COMSIG_CONFLICT_ELEMENT_CHECK "conflict_element_check" + /// A conflict was found + #define ELEMENT_CONFLICT_FOUND (1<<0) diff --git a/code/__defines/is_helpers.dm b/code/__defines/is_helpers.dm index c1405b370b..3f56ebda7f 100644 --- a/code/__defines/is_helpers.dm +++ b/code/__defines/is_helpers.dm @@ -57,5 +57,6 @@ //#define isturf(D) istype(D, /turf) //Built in #define isopenspace(A) istype(A, /turf/simulated/open) #define isspace(A) istype(A, /turf/space) +#define ismineralturf(A) istype(A, /turf/simulated/mineral) #define istaurtail(A) istype(A, /datum/sprite_accessory/tail/taur) diff --git a/code/datums/elements/conflict_checking.dm b/code/datums/elements/conflict_checking.dm new file mode 100644 index 0000000000..cd56d28856 --- /dev/null +++ b/code/datums/elements/conflict_checking.dm @@ -0,0 +1,35 @@ +/** + * Simple conflict checking for getting number of conflicting things on someone with the same ID. + */ +/datum/element/conflict_checking + element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH + id_arg_index = 1 + /// we don't need to KNOW who has us, only our ID. + var/id + +/datum/element/conflict_checking/Attach(datum/target, id) + . = ..() + if(. & ELEMENT_INCOMPATIBLE) + return + if(!isatom(target)) + return ELEMENT_INCOMPATIBLE + if(!length(id)) + . = ELEMENT_INCOMPATIBLE + CRASH("Invalid ID in conflict checking element.") + if(isnull(src.id)) + src.id = id + RegisterSignal(target, COMSIG_CONFLICT_ELEMENT_CHECK, .proc/check) + +/datum/element/conflict_checking/proc/check(datum/source, id_to_check) + if(id == id_to_check) + return ELEMENT_CONFLICT_FOUND + +/** + * Counts number of conflicts on something that have a conflict checking element. + */ +/atom/proc/ConflictElementCount(id) + . = 0 + for(var/i in GetAllContents()) + var/atom/movable/AM = i + if(SEND_SIGNAL(AM, COMSIG_CONFLICT_ELEMENT_CHECK, id) & ELEMENT_CONFLICT_FOUND) + ++. \ No newline at end of file diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index e6b5479e31..652a413707 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -221,6 +221,8 @@ size = "bulky" if(ITEMSIZE_HUGE) size = "huge" + if(ITEMSIZE_NO_CONTAINER) + size = "massive" return ..(user, "", "It is a [size] item.") /obj/item/attack_hand(mob/living/user as mob) diff --git a/code/game/objects/items/weapons/material/whetstone.dm b/code/game/objects/items/weapons/material/whetstone.dm index 65faf1fa7c..12da5d23fd 100644 --- a/code/game/objects/items/weapons/material/whetstone.dm +++ b/code/game/objects/items/weapons/material/whetstone.dm @@ -63,7 +63,7 @@ if(istype(W, /obj/item/weapon/material)) if(istype(W, /obj/item/weapon/material/sharpeningkit)) - to_chat(user, "Really? Sharpening a [W] with [src]? You goofball.") + to_chat(user, "As much as you'd like to sharpen [W] with [src], the logistics just don't work out.") return var/obj/item/weapon/material/M = W if(uses >= M.w_class*2) @@ -71,7 +71,7 @@ uses -= M.w_class*2 return else - to_chat(user, "Not enough material to sharpen [M]. You need [M.w_class*2] [M.material.sheet_plural_name].") + to_chat(user, "There's not enough spare sheets to sharpen [M]. You need [M.w_class*2] [M.material.sheet_plural_name].") return else to_chat(user, "You can't sharpen [W] with [src]!") diff --git a/code/game/objects/items/weapons/storage/belt_vr.dm b/code/game/objects/items/weapons/storage/belt_vr.dm index ba86f3f2f9..5710e0f4d5 100644 --- a/code/game/objects/items/weapons/storage/belt_vr.dm +++ b/code/game/objects/items/weapons/storage/belt_vr.dm @@ -48,7 +48,8 @@ /obj/item/device/ano_scanner, /obj/item/device/cataloguer, /obj/item/device/radio, - /obj/item/device/mapping_unit + /obj/item/device/mapping_unit, + /obj/item/weapon/kinetic_crusher ) /obj/item/weapon/storage/belt/explorer/pathfinder diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm index 6ee9c88ba7..5e0944ed41 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm @@ -47,6 +47,7 @@ /obj/item/clothing/glasses/meson, /obj/item/clothing/head/soft, /obj/item/clothing/suit/storage/hooded/wintercoat/cargo, + /obj/item/clothing/suit/storage/hooded/wintercoat/cargo/qm, /obj/item/clothing/shoes/boots/winter/supply) /obj/structure/closet/secure_closet/quartermaster/Initialize() diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index feef58e05a..674a2e04b8 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -26,6 +26,7 @@ /obj/item/device/t_scanner/upgraded, /obj/item/taperoll/engineering, /obj/item/clothing/suit/storage/hooded/wintercoat/engineering, + /obj/item/clothing/suit/storage/hooded/wintercoat/engineering/ce, /obj/item/clothing/shoes/boots/winter/engineering, /obj/item/weapon/tank/emergency/oxygen/engi, /obj/item/weapon/reagent_containers/spray/windowsealant, //VOREStation Add, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index b6021a86c9..fd0c1c474f 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -103,6 +103,7 @@ /obj/item/clothing/mask/gas, /obj/item/clothing/suit/storage/toggle/fr_jacket, /obj/item/clothing/suit/storage/toggle/labcoat/emt, + /obj/item/clothing/suit/storage/hooded/wintercoat/medical/para, /obj/item/device/radio/headset/headset_med/alt, /obj/item/weapon/cartridge/medical, /obj/item/weapon/storage/briefcase/inflatable, @@ -137,6 +138,7 @@ /obj/item/device/flash, /obj/item/weapon/reagent_containers/hypospray/vial, /obj/item/clothing/suit/storage/hooded/wintercoat/medical, + /obj/item/clothing/suit/storage/hooded/wintercoat/medical/cmo, /obj/item/clothing/shoes/boots/winter/medical, /obj/item/weapon/storage/box/freezer, /obj/item/clothing/mask/gas, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm index 8f4c8ef1fc..c9cea196b3 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm @@ -45,6 +45,7 @@ /obj/item/clothing/mask/gas, /obj/item/device/flash, /obj/item/clothing/suit/storage/hooded/wintercoat/science, + /obj/item/clothing/suit/storage/hooded/wintercoat/science/rd, /obj/item/clothing/shoes/boots/winter/science, /obj/item/weapon/bluespace_harpoon) //VOREStation Add diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 1da95eea0e..424fb792ff 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -60,7 +60,8 @@ /obj/item/clothing/head/caphat/hop, /obj/item/clothing/under/gimmick/rank/head_of_personnel/suit, /obj/item/clothing/under/gimmick/rank/head_of_personnel/suit/skirt, - /obj/item/clothing/glasses/sunglasses) + /obj/item/clothing/glasses/sunglasses, + /obj/item/clothing/suit/storage/hooded/wintercoat/hop) /obj/structure/closet/secure_closet/hos @@ -100,6 +101,7 @@ /obj/item/weapon/melee/telebaton, /obj/item/clothing/head/beret/sec/corporate/hos, /obj/item/clothing/suit/storage/hooded/wintercoat/security, + /obj/item/clothing/suit/storage/hooded/wintercoat/security/hos, /obj/item/clothing/shoes/boots/winter/security, /obj/item/device/flashlight/maglight, /obj/item/clothing/mask/gas/half, @@ -235,7 +237,7 @@ /obj/item/clothing/accessory/badge/holo/detective, /obj/item/clothing/gloves/black, ///obj/item/gunbox, // VOREStation Removal - ///obj/item/weapon/gun/energy/stunrevolver/vintage, // VOREStation Removal + /obj/item/weapon/gun/energy/stunrevolver/vintage, /obj/item/weapon/storage/belt/detective, /obj/item/weapon/storage/box/evidence, /obj/item/device/radio/headset/headset_sec, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security_vr.dm b/code/game/objects/structures/crates_lockers/closets/secure/security_vr.dm index 59573c9346..cc57459919 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security_vr.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security_vr.dm @@ -21,6 +21,7 @@ /obj/item/clothing/accessory/holster/waist, /obj/item/clothing/head/beret/sec/corporate/hos, /obj/item/clothing/suit/storage/hooded/wintercoat/security, + /obj/item/clothing/suit/storage/hooded/wintercoat/security/hos, /obj/item/clothing/mask/gas/half) /obj/structure/closet/secure_closet/hos2 diff --git a/code/modules/ai/ai_holder_targeting.dm b/code/modules/ai/ai_holder_targeting.dm index bf546bc283..560ad61a06 100644 --- a/code/modules/ai/ai_holder_targeting.dm +++ b/code/modules/ai/ai_holder_targeting.dm @@ -252,6 +252,10 @@ on_attacked(attacker) return FALSE + if(holder.resting) // I can't kill someone while I'm laying down! + ai_log("react_to_attack() : AI is resting. Getting up.", AI_LOG_TRACE) + holder.lay_down() + if(stance == STANCE_SLEEP) // If we're asleep, try waking up if someone's wailing on us. ai_log("react_to_attack() : AI is asleep. Waking up.", AI_LOG_TRACE) go_wake() diff --git a/code/modules/client/preference_setup/loadout/loadout_accessories_vr.dm b/code/modules/client/preference_setup/loadout/loadout_accessories_vr.dm index 7749385059..25bc717fed 100644 --- a/code/modules/client/preference_setup/loadout/loadout_accessories_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_accessories_vr.dm @@ -40,6 +40,10 @@ display_name = "collar, pink" path = /obj/item/clothing/accessory/collar/pink +/datum/gear/collar/cowbell + display_name = "collar, cowbell" + path = /obj/item/clothing/accessory/collar/cowbell + /datum/gear/collar/holo display_name = "collar, holo" path = /obj/item/clothing/accessory/collar/holo diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm index 359bd7ca7c..50e9102370 100644 --- a/code/modules/client/preference_setup/loadout/loadout_suit.dm +++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm @@ -620,4 +620,9 @@ /datum/gear/suit/miscellaneous/cardigan/New() ..() - gear_tweaks += gear_tweak_free_color_choice \ No newline at end of file + gear_tweaks += gear_tweak_free_color_choice + +/datum/gear/suit/cmddressjacket + display_name = "command dress jacket" + path = /obj/item/clothing/suit/storage/cmddressjacket + allowed_roles = list("Facility Director", "Head of Personnel", "Command Secretary") diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform.dm b/code/modules/client/preference_setup/loadout/loadout_uniform.dm index 5b7bc83757..6905a3f0d4 100644 --- a/code/modules/client/preference_setup/loadout/loadout_uniform.dm +++ b/code/modules/client/preference_setup/loadout/loadout_uniform.dm @@ -648,4 +648,36 @@ /datum/gear/uniform/countess display_name = "countess dress" - path = /obj/item/clothing/under/dress/countess \ No newline at end of file + path = /obj/item/clothing/under/dress/countess + +/datum/gear/uniform/verglasdress + display_name = "verglas dress" + path = /obj/item/clothing/under/verglasdress + +/datum/gear/uniform/fashionminiskirt + display_name = "fashionable miniskirt" + path = /obj/item/clothing/under/fashionminiskirt + +/datum/gear/uniform/fashionminiskirt/New() + ..() + gear_tweaks += gear_tweak_free_color_choice + +/datum/gear/uniform/paramedunidark + display_name = "paramedic uniform - dark" + path = /obj/item/clothing/under/rank/paramedunidark + allowed_roles = list("Medical Doctor","Chief Medical Officer","Paramedic") + +/datum/gear/uniform/parameduniskirtdark + display_name = "paramedic skirt - dark" + path = /obj/item/clothing/under/rank/parameduniskirtdark + allowed_roles = list("Medical Doctor","Chief Medical Officer","Paramedic") + +/datum/gear/uniform/paramedunilight + display_name = "paramedic uniform - light" + path = /obj/item/clothing/under/rank/paramedunilight + allowed_roles = list("Medical Doctor","Chief Medical Officer","Paramedic") + +/datum/gear/uniform/parameduniskirtlight + display_name = "paramedic skirt - light" + path = /obj/item/clothing/under/rank/parameduniskirtlight + allowed_roles = list("Medical Doctor","Chief Medical Officer","Paramedic") \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/rig/modules/specific/crusher_gauntlets.dm b/code/modules/clothing/spacesuits/rig/modules/specific/crusher_gauntlets.dm new file mode 100644 index 0000000000..3dff20284f --- /dev/null +++ b/code/modules/clothing/spacesuits/rig/modules/specific/crusher_gauntlets.dm @@ -0,0 +1,55 @@ +/obj/item/rig_module/gauntlets + + name = "proto-kinetic gear unit" + desc = "A set of paired proto-kinetic gauntlets and greaves. There's no way this is actually usable. Right?" + icon_state = "module" + + interface_name = "proto-kinetic gear unit" + interface_desc = "A set of paired proto-kinetic gauntlets and greaves. For disrupting rocks and creatures' innards." + + activate_string = "Deploy Gauntlets" + deactivate_string = "Undeploy Gauntlets" + + usable = 0 + toggleable = 1 + use_power_cost = 0 + active_power_cost = 2.5 + passive_power_cost = 0 + var/obj/item/weapon/kinetic_crusher/machete/gauntlets/rig/stored_gauntlets + +/obj/item/rig_module/gauntlets/Initialize() + . = ..() + stored_gauntlets = new /obj/item/weapon/kinetic_crusher/machete/gauntlets/rig(src) + stored_gauntlets.storing_module = src + +/obj/item/rig_module/gauntlets/activate() + ..() + var/mob/living/M = holder.wearer + var/datum/gender/TU = gender_datums[M.get_visible_gender()] + + if(M.l_hand && M.r_hand) + to_chat(M, "Your hands are full.") + deactivate() + return + if(M.a_intent == I_HURT) + M.visible_message( + "[M] throws [TU.his] arms out, extending [stored_gauntlets] from \the [holder] with a click!", + "You throw your arms out, extending [stored_gauntlets] from \the [holder] with a click!", + "You hear a threatening hiss and a click." + ) + else + M.visible_message( + "[M] extends [stored_gauntlets] from \the [holder] with a click!", + "You extend [stored_gauntlets] from \the [holder] with a click!", + "You hear a hiss and a click.") + + playsound(src, 'sound/items/helmetdeploy.ogg', 40, 1) + M.put_in_hands(stored_gauntlets) + +/obj/item/rig_module/gauntlets/deactivate() + ..() + var/mob/living/M = holder.wearer + if(!M) + return + for(var/obj/item/weapon/kinetic_crusher/machete/gauntlets/gaming in M.contents) + M.drop_from_inventory(gaming, src) \ No newline at end of file diff --git a/code/modules/clothing/suits/hooded.dm b/code/modules/clothing/suits/hooded.dm index 6ee01a78f1..1a250bc683 100644 --- a/code/modules/clothing/suits/hooded.dm +++ b/code/modules/clothing/suits/hooded.dm @@ -254,7 +254,7 @@ hoodtype = /obj/item/clothing/head/hood/winter/engineering/atmos /obj/item/clothing/suit/storage/hooded/wintercoat/engineering/ce - name = "atmospherics winter coat" + name = "chief engineer's winter coat" desc = "A heavy jacket made from 'synthetic' animal furs. It seems to have burn marks on the inside from a phoron fire." icon_state = "coatce" armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 20) diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index 1119079e2a..73d253415d 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -34,6 +34,12 @@ body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS flags_inv = HIDEHOLSTER +//Command +/obj/item/clothing/suit/storage/cmddressjacket + name = "command dress jacket" + desc = "A fancy dress jacket made for command staff. Makes you feel in charge." + icon_state = "cmddressjacket" + //Chaplain /obj/item/clothing/suit/storage/hooded/chaplain_hoodie name = "chaplain hoodie" diff --git a/code/modules/clothing/under/accessories/accessory_vr.dm b/code/modules/clothing/under/accessories/accessory_vr.dm index 1a4c93eb67..6032c96879 100644 --- a/code/modules/clothing/under/accessories/accessory_vr.dm +++ b/code/modules/clothing/under/accessories/accessory_vr.dm @@ -262,6 +262,14 @@ item_state = "collar_pnk" overlay_state = "collar_pnk" +/obj/item/clothing/accessory/collar/cowbell + name = "cowbell collar" + desc = "A collar for your little pets... or the big ones." + icon_state = "collar_cowbell" + item_state = "collar_cowbell_overlay" + overlay_state = "collar_cowbell_overlay" + + /obj/item/clothing/accessory/collar/holo name = "Holo-collar" desc = "An expensive holo-collar for the modern day pet." @@ -349,7 +357,7 @@ icon_state = "holster_machete" slot = ACCESSORY_SLOT_WEAPON concealed_holster = 0 - can_hold = list(/obj/item/weapon/material/knife/machete) + can_hold = list(/obj/item/weapon/material/knife/machete, /obj/item/weapon/kinetic_crusher/machete) //sound_in = 'sound/effects/holster/sheathin.ogg' //sound_out = 'sound/effects/holster/sheathout.ogg' diff --git a/code/modules/clothing/under/jobs/medsci.dm b/code/modules/clothing/under/jobs/medsci.dm index 87346c6741..013e3d917f 100644 --- a/code/modules/clothing/under/jobs/medsci.dm +++ b/code/modules/clothing/under/jobs/medsci.dm @@ -174,6 +174,34 @@ icon_state = "scrubs" item_state_slots = list(slot_r_hand_str = "white", slot_l_hand_str = "white") +/obj/item/clothing/under/rank/paramedunidark + name = "dark paramedic uniform" + desc = "A dark jumpsuit for those brave souls who have to deal with a CMO who thinks they're the do everything person." + icon_state = "paramedicdark" + rolled_down = -1 + rolled_sleeves = -1 + +/obj/item/clothing/under/rank/parameduniskirtdark + name = "dark paramedic uniskirt" + desc = "A dark jumpskirt for those brave souls who have to deal with a CMO who thinks they're the do everything person." + icon_state = "paramedicdark_skirt" + rolled_down = -1 + rolled_sleeves = -1 + +/obj/item/clothing/under/rank/paramedunilight + name = "light paramedic uniform" + desc = "A light jumpsuit for those brave souls who have to deal with a CMO who thinks they're the do everything person." + icon_state = "paramediclight" + rolled_down = -1 + rolled_sleeves = -1 + +/obj/item/clothing/under/rank/parameduniskirtlight + name = "light paramedic uniskirt" + desc = "A light jumpskirt for those brave souls who have to deal with a CMO who thinks they're the do everything person." + icon_state = "paramediclight_skirt" + rolled_down = -1 + rolled_sleeves = -1 + /obj/item/clothing/under/rank/psych desc = "A basic white jumpsuit. It has turqouise markings that denote the wearer as a psychiatrist." name = "psychiatrist's jumpsuit" @@ -186,7 +214,6 @@ icon_state = "psychturtle" item_state_slots = list(slot_r_hand_str = "psyche", slot_l_hand_str = "psyche") rolled_sleeves = 0 - /* * Medsci, unused (i think) stuff */ diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 0f2b43c380..562950f89a 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -565,6 +565,11 @@ desc = "A red and black dress fit for a countess." icon_state = "countess" +/obj/item/clothing/under/verglasdress + name = "verglas dress" + desc = "The modern twist on a forgotten pattern, the Verglas style utilizes comfortable velvet and silver white satin to create an otherworldly effect evocative of winter, or the void." + icon_state = "verglas_dress" + /* * wedding stuff */ @@ -884,6 +889,10 @@ Uniforms and such desc = "A flowery skirt that comes in a variety of colors." icon_state = "flowerskirt" +/obj/item/clothing/under/fashionminiskirt + name = "fashionable miniskirt" + desc = "An impractically short miniskirt allegedly making waves through the local fashion scene." + icon_state = "miniskirt_fashion" /* * swimsuit */ @@ -946,6 +955,12 @@ Uniforms and such desc = "No honest man would wear this abomination" icon_state = "mankini" +/obj/item/clothing/under/swimsuit/cowbikini + name = "cow print bikini" + desc = "A rather skimpy cow patterned swimsuit." + icon_state = "swim_cow" + + /* * pyjamas */ diff --git a/code/modules/economy/vending_machines.dm b/code/modules/economy/vending_machines.dm index 17ca55d67f..c51951b338 100644 --- a/code/modules/economy/vending_machines.dm +++ b/code/modules/economy/vending_machines.dm @@ -1153,6 +1153,7 @@ /obj/item/clothing/head/that = 5, /obj/item/clothing/head/flatcap = 5, /obj/item/clothing/shoes/brown = 5, + /obj/item/clothing/suit/storage/hooded/wintercoat/bar = 5, /obj/item/clothing/accessory/permit/gun/bar = 1 ) req_log_access = access_hop @@ -1225,6 +1226,7 @@ /obj/item/clothing/suit/storage/toggle/labcoat/modern = 5, /obj/item/clothing/mask/surgical = 5, /obj/item/clothing/suit/storage/hooded/wintercoat/medical = 5, + /obj/item/clothing/suit/storage/hooded/wintercoat/medical/alt = 5, /obj/item/clothing/shoes/boots/winter/medical = 5 ) req_log_access = access_hop @@ -1241,6 +1243,7 @@ /obj/item/clothing/under/rank/chemist/skirt = 5, /obj/item/clothing/shoes/white = 5, /obj/item/clothing/suit/storage/toggle/labcoat/chemist = 5, + /obj/item/clothing/suit/storage/hooded/wintercoat/medical/chemist = 5, /obj/item/weapon/storage/backpack/chemistry = 5, /obj/item/weapon/storage/backpack/satchel/chem = 5, /obj/item/weapon/storage/bag/chemistry = 5 @@ -1276,6 +1279,7 @@ /obj/item/clothing/under/rank/virologist/skirt = 5, /obj/item/clothing/shoes/white = 5, /obj/item/clothing/suit/storage/toggle/labcoat/virologist = 5, + /obj/item/clothing/suit/storage/hooded/wintercoat/medical/viro = 5, /obj/item/clothing/mask/surgical = 5, /obj/item/weapon/storage/backpack/virology = 5, /obj/item/weapon/storage/backpack/satchel/vir = 5 @@ -1314,6 +1318,7 @@ products = list( /obj/item/clothing/under/rank/roboticist = 5, /obj/item/clothing/suit/storage/toggle/labcoat/roboticist = 5, + /obj/item/clothing/suit/storage/hooded/wintercoat/science/robotics = 5, /obj/item/clothing/shoes/black = 5, /obj/item/clothing/gloves/black = 5, /obj/item/weapon/storage/backpack/toxins = 5, @@ -1345,7 +1350,9 @@ /obj/item/weapon/storage/fancy/whitecandle_box = 5, /obj/item/weapon/storage/fancy/blackcandle_box = 5, /obj/item/godfig = 5, - /obj/item/weapon/deck/tarot = 5 + /obj/item/weapon/deck/tarot = 5, + /obj/item/clothing/suit/storage/hooded/wintercoat/ratvar = 1, + /obj/item/clothing/suit/storage/hooded/wintercoat/narsie = 1 ) req_log_access = access_hop has_logs = 1 @@ -1455,6 +1462,7 @@ /obj/item/device/radio/headset/headset_service = 5, /obj/item/clothing/under/rank/janitor = 5, /obj/item/clothing/under/dress/maid/janitor = 5, + /obj/item/clothing/suit/storage/hooded/wintercoat/janitor = 5, /obj/item/clothing/gloves/black = 5, /obj/item/weapon/storage/belt/janitor = 5, /obj/item/clothing/shoes/galoshes = 5, diff --git a/code/modules/economy/vending_machines_vr.dm b/code/modules/economy/vending_machines_vr.dm index a40cd01e6d..16f7f1940d 100644 --- a/code/modules/economy/vending_machines_vr.dm +++ b/code/modules/economy/vending_machines_vr.dm @@ -822,6 +822,7 @@ /obj/item/weapon/storage/box/fluff/swimsuit/science = 5, /obj/item/weapon/storage/box/fluff/swimsuit/security = 5, /obj/item/weapon/storage/box/fluff/swimsuit/medical = 5, + /obj/item/weapon/storage/box/fluff/swimsuit/cowbikini = 5, /obj/item/clothing/under/utility = 5, /obj/item/clothing/under/utility/grey = 5, /obj/item/clothing/under/utility/blue = 5, @@ -992,6 +993,7 @@ /obj/item/weapon/storage/box/fluff/swimsuit/science = 50, /obj/item/weapon/storage/box/fluff/swimsuit/security = 50, /obj/item/weapon/storage/box/fluff/swimsuit/medical = 50, + /obj/item/weapon/storage/box/fluff/swimsuit/cowbikini = 50, /obj/item/clothing/under/utility = 50, /obj/item/clothing/under/utility/grey = 50, /obj/item/clothing/under/utility/blue = 50, @@ -1217,6 +1219,7 @@ /obj/item/clothing/suit/varsity/blue = 5, /obj/item/clothing/suit/varsity/brown = 5, /obj/item/clothing/suit/storage/hooded/wintercoat = 5, + /obj/item/clothing/suit/storage/hooded/wintercoat/aformal = 5, /obj/item/clothing/suit/storage/teshari/cloak/standard/white_grey = 5) prices = list(/obj/item/clothing/suit/storage/apron = 100, /obj/item/clothing/suit/storage/flannel/aqua = 100, @@ -1304,8 +1307,10 @@ /obj/item/clothing/suit/varsity/blue = 100, /obj/item/clothing/suit/varsity/brown = 100, /obj/item/clothing/suit/storage/hooded/wintercoat = 100, + /obj/item/clothing/suit/storage/hooded/wintercoat/aformal = 100, /obj/item/clothing/suit/storage/teshari/cloak/standard/white_grey = 100) - premium = list(/obj/item/clothing/suit/imperium_monk = 3) + premium = list(/obj/item/clothing/suit/imperium_monk = 3, + /obj/item/clothing/suit/storage/hooded/wintercoat/cosmic = 1) contraband = list(/obj/item/toy/katana = 1) /obj/machinery/vending/loadout/costume @@ -2082,6 +2087,7 @@ /obj/item/weapon/storage/box/fluff/swimsuit/science = 5, /obj/item/weapon/storage/box/fluff/swimsuit/security = 5, /obj/item/weapon/storage/box/fluff/swimsuit/medical = 5, + /obj/item/weapon/storage/box/fluff/swimsuit/cowbikini = 5, /obj/item/clothing/under/utility = 5, /obj/item/clothing/under/utility/grey = 5, /obj/item/clothing/under/utility/blue = 5, @@ -2252,6 +2258,7 @@ /obj/item/weapon/storage/box/fluff/swimsuit/science = 50, /obj/item/weapon/storage/box/fluff/swimsuit/security = 50, /obj/item/weapon/storage/box/fluff/swimsuit/medical = 50, + /obj/item/weapon/storage/box/fluff/swimsuit/cowbikini = 50, /obj/item/clothing/under/utility = 50, /obj/item/clothing/under/utility/grey = 50, /obj/item/clothing/under/utility/blue = 50, @@ -2386,6 +2393,7 @@ /obj/item/clothing/suit/varsity/blue = 5, /obj/item/clothing/suit/varsity/brown = 5, /obj/item/clothing/suit/storage/hooded/wintercoat = 5, + /obj/item/clothing/suit/storage/hooded/wintercoat/aformal = 5, /obj/item/clothing/suit/storage/teshari/cloak/standard/white_grey = 5) prices = list(/obj/item/clothing/suit/storage/apron = 100, /obj/item/clothing/suit/storage/flannel/aqua = 100, @@ -2473,8 +2481,10 @@ /obj/item/clothing/suit/varsity/blue = 100, /obj/item/clothing/suit/varsity/brown = 100, /obj/item/clothing/suit/storage/hooded/wintercoat = 100, + /obj/item/clothing/suit/storage/hooded/wintercoat/aformal = 100, /obj/item/clothing/suit/storage/teshari/cloak/standard/white_grey = 100) - premium = list(/obj/item/clothing/suit/imperium_monk = 3) + premium = list(/obj/item/clothing/suit/imperium_monk = 3, + /obj/item/clothing/suit/storage/hooded/wintercoat/cosmic = 1) contraband = list(/obj/item/toy/katana = 1) /obj/machinery/vending/loadout/costume @@ -3097,6 +3107,7 @@ /obj/item/weapon/storage/box/fluff/swimsuit/science = 5, /obj/item/weapon/storage/box/fluff/swimsuit/security = 5, /obj/item/weapon/storage/box/fluff/swimsuit/medical = 5, + /obj/item/weapon/storage/box/fluff/swimsuit/cowbikini = 5, /obj/item/clothing/under/utility = 5, /obj/item/clothing/under/utility/grey = 5, /obj/item/clothing/under/utility/blue = 5, diff --git a/code/modules/mining/kinetic_crusher.dm b/code/modules/mining/kinetic_crusher.dm new file mode 100644 index 0000000000..498f0b16bb --- /dev/null +++ b/code/modules/mining/kinetic_crusher.dm @@ -0,0 +1,408 @@ +// ported from Citadel-Station-13/Citadel-Station-13-RP#3015, basically all the work done by silicons +// thanks silicons + +/*********************Mining Hammer****************/ +/obj/item/weapon/kinetic_crusher + icon = 'icons/obj/mining_vr.dmi' + icon_state = "crusher" + item_state = "crusher0" + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_melee_vr.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_melee_vr.dmi' + ) + name = "proto-kinetic crusher" + desc = "An early design of the proto-kinetic accelerator, it is little more than an combination of various mining tools cobbled together, forming a high-tech club. \ + While it is an effective mining tool, it did little to aid any but the most skilled and/or suicidal miners against local fauna." + force = 0 //You can't hit stuff unless wielded + w_class = ITEMSIZE_LARGE + slot_flags = SLOT_BACK + throwforce = 5 + throw_speed = 4 +/* + armour_penetration = 10 + custom_materials = list(/datum/material/iron=1150, /datum/material/glass=2075) +*/ + hitsound = 'sound/weapons/bladeslice.ogg' + attack_verb = list("smashed", "crushed", "cleaved", "chopped", "pulped") + sharp = TRUE + edge = TRUE + // sharpness = SHARP_EDGED + action_button_name = "Toggle Light" + // actions_types = list(/datum/action/item_action/toggle_light) + // var/list/trophies = list() + var/charged = TRUE + var/charge_time = 15 + var/detonation_damage = 50 + var/backstab_bonus = 30 + /// does it have a light icon + var/integ_light_icon = TRUE + /// is the light on? + var/integ_light_on = FALSE + var/brightness_on = 7 + var/wielded = FALSE // track wielded status on item + /// is this emagged? (unlocks !!!FUN!!!) + var/emagged = 0 + /// Damage penalty factor to detonation damage to non simple mobs + var/human_damage_nerf = 0.25 + /// Damage penalty factor to backstab bonus damage to non simple mobs + var/human_backstab_nerf = 0.25 + /// damage buff for throw impacts + var/thrown_bonus = 35 + /// do we need to be wielded? + var/requires_wield = TRUE + /// do we have a charge overlay? + var/charge_overlay = TRUE + /// do we update item state? + var/update_item_state = FALSE + +/obj/item/weapon/kinetic_crusher/cyborg //probably give this a unique sprite later + desc = "An integrated version of the standard kinetic crusher with a grinded down axe head to dissuade mis-use against crewmen. Deals damage equal to the standard crusher against creatures, however." + force = 10 //wouldn't want to give a borg a 20 brute melee weapon unemagged now would we + detonation_damage = 60 + wielded = 1 + +/obj/item/weapon/kinetic_crusher/Initialize(mapload) + . = ..() + AddElement(/datum/element/conflict_checking, CONFLICT_ELEMENT_CRUSHER) + +/* +/obj/item/weapon/kinetic_crusher/Initialize() + . = ..() + if(requires_Wield) + RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield) + RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield) + +/obj/item/weapon/kinetic_crusher/ComponentInitialize() + . = ..() + if(requires_wield) + AddComponent(/datum/component/butchering, 60, 110) //technically it's huge and bulky, but this provides an incentive to use it + AddComponent(/datum/component/two_handed, force_unwielded=0, force_wielded=20) +*/ + +/obj/item/weapon/kinetic_crusher/Destroy() + // QDEL_LIST(trophies) + return ..() + +/obj/item/weapon/kinetic_crusher/emag_act() + . = ..() + if(emagged) + return + emagged = TRUE + desc = desc + " The destabilizer module occasionally sparks and glows a menacing red." + +/obj/item/weapon/kinetic_crusher/proc/can_mark(mob/living/victim) + if(emagged) + return TRUE + return !ishuman(victim) && !issilicon(victim) + +/// triggered on wield of two handed item +/obj/item/weapon/kinetic_crusher/proc/on_wield(obj/item/source, mob/user) + wielded = TRUE + +/// triggered on unwield of two handed item +/obj/item/weapon/kinetic_crusher/proc/on_unwield(obj/item/source, mob/user) + wielded = FALSE + +/obj/item/weapon/kinetic_crusher/examine(mob/living/user) + . = ..() + . += "Mark a[emagged ? "nything": " creature"] with the destabilizing force, then hit them in melee to do [force + detonation_damage] damage." + . += "Does [force + detonation_damage + backstab_bonus] damage if the target is backstabbed, instead of [force + detonation_damage]." +/* + for(var/t in trophies) + var/obj/item/crusher_trophy/T = t + . += "It has \a [T] attached, which causes [T.effect_desc()]." +*/ + +/* +/obj/item/weapon/kinetic_crusher/attackby(obj/item/I, mob/living/user) + if(I.tool_behaviour == TOOL_CROWBAR) + if(LAZYLEN(trophies)) + to_chat(user, "You remove [src]'s trophies.") + I.play_tool_sound(src) + for(var/t in trophies) + var/obj/item/crusher_trophy/T = t + T.remove_from(src, user) + else + to_chat(user, "There are no trophies on [src].") + else if(istype(I, /obj/item/crusher_trophy)) + var/obj/item/crusher_trophy/T = I + T.add_to(src, user) + else + return ..() +*/ + +/obj/item/weapon/kinetic_crusher/attack(mob/living/target, mob/living/carbon/user) + if(!wielded && requires_wield) + to_chat(user, "[src] is too heavy to use with one hand.") + return + ..() + +/obj/item/weapon/kinetic_crusher/afterattack(atom/target, mob/living/user, proximity_flag, clickparams) + . = ..() +/* + if(istype(target, /obj/item/crusher_trophy)) + var/obj/item/crusher_trophy/T = target + T.add_to(src, user) +*/ + if(requires_wield && !wielded) + return + if(!proximity_flag && charged)//Mark a target, or mine a tile. + var/turf/proj_turf = user.loc + if(!isturf(proj_turf)) + return + var/obj/item/projectile/destabilizer/D = new /obj/item/projectile/destabilizer(proj_turf) +/* + for(var/t in trophies) + var/obj/item/crusher_trophy/T = t + T.on_projectile_fire(D, user) +*/ + D.preparePixelProjectile(target, user, clickparams) + D.firer = user + D.hammer_synced = src + playsound(user, 'sound/weapons/plasma_cutter.ogg', 100, 1) + D.fire() + charged = FALSE + update_icon() + addtimer(CALLBACK(src, .proc/Recharge), charge_time) + // * (user?.ConflictElementCount(CONFLICT_ELEMENT_CRUSHER) || 1 - tentatively commented out + return + if(proximity_flag && isliving(target)) + detonate(target, user) + +/obj/item/weapon/kinetic_crusher/proc/detonate(mob/living/L, mob/living/user, thrown = FALSE) + var/datum/modifier/crusher_mark/CM = L.get_modifier_of_type(/datum/modifier/crusher_mark) + if(!CM || CM.hammer_synced != src) + return + if(!QDELETED(L)) + L.remove_modifiers_of_type(/datum/modifier/crusher_mark) + new /obj/effect/temp_visual/kinetic_blast(get_turf(L)) + var/backstab_dir = get_dir(user, L) + var/def_check = L.getarmor(null, "bomb") + var/detonation_damage = src.detonation_damage * (!ishuman(L)? 1 : human_damage_nerf) + var/backstab_bonus = src.backstab_bonus * (!ishuman(L)? 1 : human_backstab_nerf) + var/thrown_bonus = thrown? (src.thrown_bonus * (!ishuman(L)? 1 : human_damage_nerf)) : 0 + if(thrown? (get_dir(src, L) & L.dir) : ((user.dir & backstab_dir) && (L.dir & backstab_dir))) + L.apply_damage(detonation_damage + backstab_bonus + thrown_bonus, BRUTE, blocked = def_check) + playsound(src, 'sound/weapons/Kenetic_accel.ogg', 100, 1) //Seriously who spelled it wrong + else + L.apply_damage(detonation_damage + thrown_bonus, BRUTE, blocked = def_check) + +/obj/item/weapon/kinetic_crusher/throw_impact(atom/hit_atom, speed) + . = ..() + if(!isliving(hit_atom)) + return + var/mob/living/L = hit_atom + if(L.has_modifier_of_type(/datum/modifier/crusher_mark)) + detonate(L, thrower, TRUE) + +/obj/item/weapon/kinetic_crusher/proc/Recharge() + if(!charged) + charged = TRUE + update_icon() + playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1) + +/obj/item/weapon/kinetic_crusher/ui_action_click(mob/user, actiontype) + integ_light_on = !integ_light_on + playsound(src, 'sound/weapons/empty.ogg', 100, TRUE) + update_brightness(user) + update_icon() + +/obj/item/weapon/kinetic_crusher/proc/update_brightness(mob/user = null) + if(integ_light_on) + set_light(brightness_on) + else + set_light(0) + +/obj/item/weapon/kinetic_crusher/update_icon() + . = ..() + cut_overlay("[icon_state]_uncharged") + cut_overlay("[icon_state]_lit") + if(charge_overlay) + if(!charged) + add_overlay("[icon_state]_uncharged") + if(integ_light_icon) + if(integ_light_on) + add_overlay("[icon_state]_lit") + +/* +/obj/item/weapon/kinetic_crusher/glaive + name = "proto-kinetic glaive" + desc = "A modified design of a proto-kinetic crusher, it is still little more of a combination of various mining tools cobbled together \ + and kit-bashed into a high-tech cleaver on a stick - with a handguard and a goliath hide grip. While it is still of little use to any \ + but the most skilled and/or suicidal miners against local fauna, it's an elegant weapon for a more civilized hunter." + + look gary there i am + - hatterhat +*/ + + +/obj/item/weapon/kinetic_crusher/machete + name = "proto-kinetic machete" + desc = "A scaled down version of a proto-kinetic crusher, used by people who don't want to lug around an axe-hammer." + icon_state = "glaive-machete" + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_melee_vr.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_melee_vr.dmi', + ) + item_state = "c-machete" + w_class = ITEMSIZE_SMALL + attack_verb = list("cleaved", "chopped", "pulped", "stabbed", "skewered") + force = 24 + can_cleave = TRUE + requires_wield = FALSE + // yeah yeah buff but polaris mobs are meatwalls. + backstab_bonus = 40 + detonation_damage = 26 + // meme option + thrown_bonus = 20 + update_item_state = FALSE + + +/obj/item/weapon/kinetic_crusher/machete/gauntlets + // did someone say single target damage + name = "\improper proto-kinetic gear" + desc = "A pair of scaled-down proto-kinetic crusher destabilizer modules shoved into gauntlets and greaves, used by those who wish to spit in the eyes of God." + hitsound = 'sound/weapons/resonator_blast.ogg' + embed_chance = 0 + icon_state = "crusher-hands" + item_state = "c-gauntlets" + attack_verb = list("bashed", "kicked", "punched", "struck", "axe kicked", "uppercut", "cross-punched", "jabbed", "hammerfisted", "roundhouse kicked") + integ_light_icon = FALSE + w_class = ITEMSIZE_HUGE + force = 30 + can_cleave = FALSE + requires_wield = TRUE + backstab_bonus = 55 + detonation_damage = 35 + var/obj/item/offhand/crushergauntlets/offhand + +/obj/item/weapon/kinetic_crusher/machete/gauntlets/equipped() + . = ..() + START_PROCESSING(SSprocessing, src) + +/obj/item/weapon/kinetic_crusher/machete/gauntlets/dropped(mob/user) + ready_toggle(TRUE) + STOP_PROCESSING(SSprocessing, src) + . = ..() + +/obj/item/weapon/kinetic_crusher/machete/gauntlets/Destroy() + . = ..() + STOP_PROCESSING(SSprocessing, src) + +/obj/item/weapon/kinetic_crusher/machete/gauntlets/attack_self(mob/user) + ready_toggle() + +/obj/item/weapon/kinetic_crusher/machete/gauntlets/process() + if(wielded) // are we supposed to be wielded + if(!offhand) // does our offhand exist + ready_toggle(TRUE) // no? well, shit + +/// toggles twohand. if forced is true, forces an unready state +/obj/item/weapon/kinetic_crusher/machete/gauntlets/proc/ready_toggle(var/forced = 0) + var/mob/living/M = loc + if(istype(M) && forced == 0) + if(M.can_wield_item(src) && src.is_held_twohanded(M)) + name = initial(name) + wielded = TRUE + to_chat(M, "You ready [src].") + var/obj/item/offhand/crushergauntlets/O = new(M) + O.name = "[name] - readied" + O.desc = "As much as you'd like to punch things with one hand, [src] is far too unwieldy for that." + O.linked = src + M.put_in_inactive_hand(O) + offhand = O + else + name = "[initial(name)] (unreadied)" + wielded = FALSE + to_chat(M, "You unready [src].") + if(offhand) + QDEL_NULL(offhand) + +/obj/item/offhand + icon = 'icons/obj/weapons.dmi' + icon_state = "offhand" + name = "offhand that shouldn't exist doo dee doo" + w_class = ITEMSIZE_NO_CONTAINER + // var/linked - redefine this wherever + +/obj/item/offhand/crushergauntlets + var/obj/item/weapon/kinetic_crusher/machete/gauntlets/linked + +/obj/item/offhand/crushergauntlets/dropped(mob/user as mob) + if(linked.wielded) + linked.ready_toggle(TRUE) + +/obj/item/weapon/kinetic_crusher/machete/gauntlets/rig + name = "mounted proto-kinetic gear" + var/obj/item/rig_module/gauntlets/storing_module + +/obj/item/weapon/kinetic_crusher/machete/gauntlets/rig/dropped(mob/user) + . = ..() + if(storing_module) + src.forceMove(storing_module) + storing_module.stored_gauntlets = src + user.visible_message( + "[user] retracts [src] with a click and a hiss.", + "You retract [src] with a click and a hiss.", + "You hear a click and a hiss." + ) + playsound(src, 'sound/items/helmetdeploy.ogg', 40, 1) + storing_module.active = FALSE + else + QDEL_NULL(src) + +/obj/item/weapon/kinetic_crusher/machete/dagger + name = "proto-kinetic dagger" + desc = "A scaled down version of a proto-kinetic machete, usually used in a last ditch scenario." + icon_state = "glaive-dagger" + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_melee_vr.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_melee_vr.dmi', + ) + item_state = "c-knife" + w_class = ITEMSIZE_SMALL + force = 15 + requires_wield = FALSE + charge_overlay = FALSE + backstab_bonus = 35 + detonation_damage = 25 + // woohoo + thrown_bonus = 35 + + +//destablizing force +/obj/item/projectile/destabilizer + name = "destabilizing force" + icon_state = "pulse1" + nodamage = TRUE + damage = 0 //We're just here to mark people. This is still a melee weapon. + damage_type = BRUTE + check_armour = "bomb" + range = 6 + accuracy = INFINITY // NO. + // log_override = TRUE + var/obj/item/weapon/kinetic_crusher/hammer_synced + +/obj/item/projectile/destabilizer/Destroy() + hammer_synced = null + return ..() + +/obj/item/projectile/destabilizer/on_hit(atom/target, blocked = FALSE) + if(isliving(target)) + var/mob/living/L = target + L.add_modifier(/datum/modifier/crusher_mark, 30 SECONDS, firer, TRUE) + var/target_turf = get_turf(target) + if(ismineralturf(target_turf)) + var/turf/simulated/mineral/M = target_turf + new /obj/effect/temp_visual/kinetic_blast(M) + M.GetDrilled(firer) + ..() + +/* +//trophies + +there would be any if we had some +but alas +- hatterhat +*/ + diff --git a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm index 7692b0d6ee..ede586fba7 100644 --- a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm +++ b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm @@ -46,7 +46,8 @@ new /datum/data/mining_equipment("Hardsuit - Intelligence Storage", /obj/item/rig_module/ai_container, 2500), new /datum/data/mining_equipment("Hardsuit - Smoke Bomb Deployer", /obj/item/rig_module/grenade_launcher/smoke, 2000), new /datum/data/mining_equipment("Industrial Equipment - Phoron Bore", /obj/item/weapon/gun/magnetic/matfed/phoronbore/loaded, 3000), - new /datum/data/mining_equipment("Industrial Equipment - Sheet-Snatcher",/obj/item/weapon/storage/bag/sheetsnatcher, 500), new /datum/data/mining_equipment("Digital Tablet - Standard", /obj/item/modular_computer/tablet/preset/custom_loadout/standard, 500), + new /datum/data/mining_equipment("Industrial Equipment - Sheet-Snatcher",/obj/item/weapon/storage/bag/sheetsnatcher, 500), + new /datum/data/mining_equipment("Digital Tablet - Standard", /obj/item/modular_computer/tablet/preset/custom_loadout/standard, 500), new /datum/data/mining_equipment("Digital Tablet - Advanced", /obj/item/modular_computer/tablet/preset/custom_loadout/advanced, 1000), new /datum/data/mining_equipment("Fine Excavation Kit - Chisels",/obj/item/weapon/storage/excavation, 500), new /datum/data/mining_equipment("Fine Excavation Kit - Measuring Tape",/obj/item/device/measuring_tape, 125), @@ -85,6 +86,8 @@ EQUIPMENT("Defense Equipment - Razor Drone Deployer", /obj/item/weapon/grenade/spawnergrenade/manhacks/station/locked, 1000), EQUIPMENT("Defense Equipment - Sentry Drone Deployer", /obj/item/weapon/grenade/spawnergrenade/ward, 1500), EQUIPMENT("Defense Equipment - Smoke Bomb", /obj/item/weapon/grenade/smokebomb, 100), + EQUIPMENT("Hybrid Equipment - Proto-Kinetic Dagger", /obj/item/weapon/kinetic_crusher/machete/dagger, 500), + EQUIPMENT("Hybrid Equipment - Proto-Kinetic Machete", /obj/item/weapon/kinetic_crusher/machete, 1000), EQUIPMENT("Durasteel Fishing Rod", /obj/item/weapon/material/fishing_rod/modern/strong, 7500), EQUIPMENT("Titanium Fishing Rod", /obj/item/weapon/material/fishing_rod/modern, 1000), EQUIPMENT("Fishing Net", /obj/item/weapon/material/fishing_net, 500), @@ -140,14 +143,15 @@ EQUIPMENT("Industrial Equipment - Sheet-Snatcher", /obj/item/weapon/storage/bag/sheetsnatcher, 500), ) prize_list["Hardsuit"] = list( - EQUIPMENT("Hardsuit - Control Module", /obj/item/weapon/rig/industrial/vendor, 2000), - EQUIPMENT("Hardsuit - Drill", /obj/item/rig_module/device/drill, 5000), - EQUIPMENT("Hardsuit - Intelligence Storage",/obj/item/rig_module/ai_container, 2500), - EQUIPMENT("Hardsuit - Maneuvering Jets", /obj/item/rig_module/maneuvering_jets, 1250), - EQUIPMENT("Hardsuit - Material Scanner", /obj/item/rig_module/vision/material, 500), - EQUIPMENT("Hardsuit - Ore Scanner", /obj/item/rig_module/device/orescanner, 1000), - EQUIPMENT("Hardsuit - Plasma Cutter", /obj/item/rig_module/device/plasmacutter, 800), - EQUIPMENT("Hardsuit - Smoke Bomb Deployer", /obj/item/rig_module/grenade_launcher/smoke,2000), + EQUIPMENT("Hardsuit - Control Module", /obj/item/weapon/rig/industrial/vendor, 2000), + EQUIPMENT("Hardsuit - Drill", /obj/item/rig_module/device/drill, 5000), + EQUIPMENT("Hardsuit - Intelligence Storage", /obj/item/rig_module/ai_container, 2500), + EQUIPMENT("Hardsuit - Maneuvering Jets", /obj/item/rig_module/maneuvering_jets, 1250), + EQUIPMENT("Hardsuit - Material Scanner", /obj/item/rig_module/vision/material, 500), + EQUIPMENT("Hardsuit - Ore Scanner", /obj/item/rig_module/device/orescanner, 1000), + EQUIPMENT("Hardsuit - Plasma Cutter", /obj/item/rig_module/device/plasmacutter, 800), + EQUIPMENT("Hardsuit - Smoke Bomb Deployer", /obj/item/rig_module/grenade_launcher/smoke, 2000), + EQUIPMENT("Hardsuit - Proto-Kinetic Gauntlets", /obj/item/rig_module/gauntlets, 2000), ) prize_list["Miscellaneous"] = list( EQUIPMENT("Absinthe", /obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe, 125), diff --git a/code/modules/mining/ore_redemption_machine/survey_vendor.dm b/code/modules/mining/ore_redemption_machine/survey_vendor.dm index d5d572a467..1fc2a3f9b5 100644 --- a/code/modules/mining/ore_redemption_machine/survey_vendor.dm +++ b/code/modules/mining/ore_redemption_machine/survey_vendor.dm @@ -55,6 +55,8 @@ EQUIPMENT("Defense Equipment - Razor Drone Deployer", /obj/item/weapon/grenade/spawnergrenade/manhacks/station/locked, 100), EQUIPMENT("Defense Equipment - Sentry Drone Deployer", /obj/item/weapon/grenade/spawnergrenade/ward, 150), EQUIPMENT("Defense Equipment - Frontier Carbine", /obj/item/weapon/gun/energy/locked/frontier/carbine, 750), + EQUIPMENT("Hybrid Equipment - Proto-Kinetic Dagger", /obj/item/weapon/kinetic_crusher/machete/dagger, 75), + EQUIPMENT("Hybrid Equipment - Proto-Kinetic Machete", /obj/item/weapon/kinetic_crusher/machete, 250), EQUIPMENT("Fishing Net", /obj/item/weapon/material/fishing_net, 50), EQUIPMENT("Titanium Fishing Rod", /obj/item/weapon/material/fishing_rod/modern, 100), EQUIPMENT("Durasteel Fishing Rod", /obj/item/weapon/material/fishing_rod/modern/strong, 750), diff --git a/code/modules/mob/_modifiers/crusher_mark.dm b/code/modules/mob/_modifiers/crusher_mark.dm new file mode 100644 index 0000000000..9af2980624 --- /dev/null +++ b/code/modules/mob/_modifiers/crusher_mark.dm @@ -0,0 +1,43 @@ +/datum/modifier/crusher_mark + name = "destabilized" + desc = "You've been struck by a destabilizing bolt. By all accounts, this is probably a bad thing." + stacks = MODIFIER_STACK_EXTEND + on_created_text = "You feel destabilized." + on_expired_text = "You feel stable again." + var/mutable_appearance/marked_underlay + var/obj/item/weapon/kinetic_crusher/hammer_synced + +/* +/datum/modifier/New(var/new_holder, var/new_origin) + holder = new_holder + if(new_origin) + origin = weakref(new_origin) + else // We assume the holder caused the modifier if not told otherwise. + origin = weakref(holder) + ..() +/mob/living/proc/add_modifier(var/modifier_type, var/expire_at = null, var/mob/living/origin = null, var/suppress_failure = FALSE) +*/ + +/datum/modifier/crusher_mark/New(var/new_holder, var/new_origin) + . = ..() + if(isliving(new_origin)) + var/mob/living/origin = new_origin + var/obj/item/weapon/kinetic_crusher/to_sync = locate(/obj/item/weapon/kinetic_crusher) in origin + if(to_sync) + hammer_synced = to_sync + if(hammer_synced? hammer_synced.can_mark(holder) : TRUE) + marked_underlay = mutable_appearance('icons/effects/effects.dmi', "shield2") + marked_underlay.pixel_x = -holder.pixel_x + marked_underlay.pixel_y = -holder.pixel_y + holder.underlays += marked_underlay + +/datum/modifier/crusher_mark/Destroy() + hammer_synced = null + if(holder) + holder.underlays -= marked_underlay + QDEL_NULL(marked_underlay) + return ..() + +/datum/modifier/crusher_mark/on_expire() + holder.underlays -= marked_underlay //if this is being called, we should have a holder at this point. + ..() \ No newline at end of file diff --git a/code/modules/mob/living/silicon/pai/death.dm b/code/modules/mob/living/silicon/pai/death.dm index 01650cc4b2..4989cecace 100644 --- a/code/modules/mob/living/silicon/pai/death.dm +++ b/code/modules/mob/living/silicon/pai/death.dm @@ -1,4 +1,5 @@ /mob/living/silicon/pai/death(gibbed) + release_vore_contents() if(card) card.removePersonality() //if(gibbed) //VOREStation Edit Start. This prevents pAIs from joining back into their card after the card's killed diff --git a/code/modules/mob/living/silicon/pai/pai_vr.dm b/code/modules/mob/living/silicon/pai/pai_vr.dm index c8ab1d7e07..d5f989b67e 100644 --- a/code/modules/mob/living/silicon/pai/pai_vr.dm +++ b/code/modules/mob/living/silicon/pai/pai_vr.dm @@ -25,12 +25,12 @@ /mob/living/silicon/pai/update_icon() //Some functions cause this to occur, such as resting ..() update_fullness_pai() - + if(!people_eaten && !resting) icon_state = "[chassis]" //Using icon_state here resulted in quite a few bugs. Chassis is much less buggy. else if(!people_eaten && resting) icon_state = "[chassis]_rest" - + // Unfortunately not all these states exist, ugh. else if(people_eaten && !resting) if("[chassis]_full" in cached_icon_states(icon)) @@ -81,3 +81,7 @@ chassis = possible_chassis[choice] verbs |= /mob/living/proc/hide update_icon() +// Release belly contents before being gc'd! +/mob/living/silicon/pai/Destroy() + release_vore_contents() + return ..() \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm index a9181e8329..911d60842d 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm @@ -29,6 +29,7 @@ movement_cooldown = 2 meat_amount = 2 meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat + holder_type = /obj/item/weapon/holder/catslug response_help = "hugs" response_disarm = "rudely paps" @@ -39,11 +40,13 @@ melee_damage_upper = 5 has_hands = TRUE - mob_size = MOB_MEDIUM + mob_size = MOB_SMALL friendly = list("hugs") + see_in_dark = 8 catalogue_data = list(/datum/category_item/catalogue/fauna/catslug) ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive/catslug + say_list_type = /datum/say_list/catslug player_msg = "You have escaped the foul weather, into this much more pleasant place. You are an intelligent creature capable of more than most think. You can pick up and use many things, and even carry some of them with you into the vents, which you can use to move around quickly. You're quiet and capable, you speak with your hands and your deeds!
- - - - -
Keep in mind, your goal should generally be to survive. You're expected to follow the same rules as everyone else, so don't go self antagging without permission from the staff team, but you are able and capable of defending yourself from those who would attack you for no reason." has_langs = list("Sign Language") @@ -61,12 +64,28 @@ /atom/movable/emissive_blocker, /obj/item/weapon/material, /obj/item/weapon/melee, - /obj/item/stack/material, + /obj/item/stack/, /obj/item/weapon/tool, /obj/item/weapon/reagent_containers/food, /obj/item/weapon/coin, /obj/item/weapon/aliencoin, - /obj/item/weapon/ore + /obj/item/weapon/ore, + /obj/item/weapon/disk/nuclear, + /obj/item/toy, + /obj/item/weapon/card, + /obj/item/device/radio, + /obj/item/device/perfect_tele_beacon, + /obj/item/weapon/clipboard, + /obj/item/weapon/paper, + /obj/item/weapon/pen, + /obj/item/canvas, + /obj/item/paint_palette, + /obj/item/paint_brush, + /obj/item/device/camera, + /obj/item/weapon/photo, + /obj/item/device/camera_film, + /obj/item/device/taperecorder, + /obj/item/device/tape ) vore_active = 1 @@ -80,6 +99,12 @@ vore_default_contamination_color = "grey" vore_default_item_mode = IM_DIGEST +/datum/say_list/catslug //Quiet quiet, no noise! We speak in sign so only people with sign will understand our questions. + speak = list("Have any porl?", "What is that?", "Where is this?", "What are you doing?", "How did you get here?", "Don't go into the rain.") + emote_hear = list() + emote_see = list("turns their head.", "looks at you.", "watches something unseen.", "sways its tail.", "flicks its ears.", "stares at you.", "gestures an unintelligible message.", "points into the distance!") + say_maybe_target = list() + say_got_target = list() /mob/living/simple_mob/vore/alienanimals/catslug/init_vore() ..() @@ -98,7 +123,7 @@ hostile = FALSE cooperative = FALSE retaliate = TRUE - speak_chance = 0 + speak_chance = 0.5 wander = TRUE /mob/living/simple_mob/vore/alienanimals/catslug/Initialize() @@ -137,6 +162,16 @@ to_chat(user, "\The [user] feeds \the [O] to you.") playsound(src, 'sound/items/eatfood.ogg', 75, 1) +/mob/living/simple_mob/vore/alienanimals/catslug/attack_hand(mob/living/carbon/human/M as mob) + if(stat != DEAD && M.a_intent == I_HELP && resting) + M.visible_message("\The [M.name] shakes \the [src] awake from their nap.","You shake \the [src] awake!") + playsound(src, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + lay_down() + ai_holder.go_wake() + return + else + return ..() + /mob/living/simple_mob/vore/alienanimals/catslug/Life() . = ..() if(nutrition < 150) @@ -178,22 +213,53 @@ color = newcolor picked_color = TRUE -/datum/ai_holder/simple_mob/melee/evasive/catslug/handle_wander_movement() - if(holder.client) - return +/datum/ai_holder/simple_mob/melee/evasive/catslug/proc/consider_awakening() if(holder.resting) - if(prob(5)) - holder.lay_down() - return - if(prob(0.5)) holder.lay_down() + go_wake() + +/datum/ai_holder/simple_mob/melee/evasive/catslug/handle_wander_movement() + if(holder.client || holder.resting) return - return ..() + else if(prob(0.5)) + holder.lay_down() + go_sleep() + addtimer(CALLBACK(src, .proc/consider_awakening), rand(1 MINUTE, 5 MINUTES), TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE) + else + return ..() + /datum/ai_holder/simple_mob/melee/evasive/catslug/on_hear_say(mob/living/speaker, message) - if(holder.client) + if(holder.client || !speaker.client) return - if(!speaker.client) + if(findtext(message, "psps") && stance == STANCE_IDLE) + set_follow(speaker, follow_for = 5 SECONDS) + + if(holder.stat || !holder.say_list || !message || speaker == holder) //Copied from parrots + return + var/datum/say_list/S = holder.say_list + S.speak |= message + + +/mob/living/simple_mob/vore/alienanimals/catslug/horrible + ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive/catslug/horrible + +/datum/ai_holder/simple_mob/melee/evasive/catslug/horrible/on_hear_say(mob/living/speaker, message) //this was an accident originally but it was very funny so here you go + if(holder.client || !speaker.client) return if(findtext(message, "psps") || stance == STANCE_IDLE) set_follow(speaker, follow_for = 5 SECONDS) + + if(holder.stat || !holder.say_list || !message || speaker == holder) //Copied from parrots + return + var/datum/say_list/S = holder.say_list + S.speak |= message + +/obj/item/weapon/holder/catslug + origin_tech = list(TECH_BIO = 2) + icon = 'icons/mob/alienanimals_x32.dmi' + item_state = "catslug" + +/obj/item/weapon/holder/catslug/Initialize(mapload, mob/held) + . = ..() + color = held.color diff --git a/code/modules/projectiles/guns/energy/stun_vr.dm b/code/modules/projectiles/guns/energy/stun_vr.dm index db038e58fd..b0bfd53e46 100644 --- a/code/modules/projectiles/guns/energy/stun_vr.dm +++ b/code/modules/projectiles/guns/energy/stun_vr.dm @@ -3,5 +3,4 @@ fire_delay = 4 /obj/item/weapon/gun/energy/stunrevolver - icon = 'icons/obj/gun_vr.dmi' charge_cost = 400 \ No newline at end of file diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 82753f3f0a..6c5bbd9ef0 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -650,7 +650,7 @@ return //roll to-hit - miss_modifier = max(15*(distance-2) - accuracy + miss_modifier + target_mob.get_evasion(), 0) + miss_modifier = max(15*(distance-2) - accuracy + miss_modifier + target_mob.get_evasion(), -100) var/hit_zone = get_zone_with_miss_chance(def_zone, target_mob, miss_modifier, ranged_attack=(distance > 1 || original != target_mob)) //if the projectile hits a target we weren't originally aiming at then retain the chance to miss var/result = PROJECTILE_FORCE_MISS diff --git a/code/modules/tgui/modules/appearance_changer.dm b/code/modules/tgui/modules/appearance_changer.dm index fe7bb95440..b125338b30 100644 --- a/code/modules/tgui/modules/appearance_changer.dm +++ b/code/modules/tgui/modules/appearance_changer.dm @@ -91,6 +91,9 @@ if("race") if(can_change(APPEARANCE_RACE) && (params["race"] in valid_species)) if(target.change_species(params["race"])) + if(params["race"] == "Custom Species") + target.custom_species = sanitize(input(usr, "Input custom species name:", + "Custom Species Name") as null|text, MAX_NAME_LEN) cut_data() generate_data(usr) changed_hook(APPEARANCECHANGER_CHANGED_RACE) diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm index 35584b9d7b..09df3a64e2 100644 --- a/code/modules/vore/eating/belly_obj_vr.dm +++ b/code/modules/vore/eating/belly_obj_vr.dm @@ -46,7 +46,7 @@ var/emote_time = 60 // How long between stomach emotes at prey (in seconds) var/emote_active = TRUE // Are we even giving emotes out at all or not? var/next_emote = 0 // When we're supposed to print our next emote, as a world.time - + // Generally just used by AI var/autotransferchance = 0 // % Chance of prey being autotransferred to transfer location var/autotransferwait = 10 // Time between trying to transfer. @@ -426,7 +426,7 @@ // This is useful in customization boxes and such. The delimiter right now is \n\n so // in message boxes, this looks nice and is easily delimited. /obj/belly/proc/get_messages(type, delim = "\n\n") - ASSERT(type == "smo" || type == "smi" || type == "dmo" || type == "dmp" || type == "em" || type == "ema" || type == "im_digest" || type == "im_hold" || type == "im_absorb" || type == "im_heal" || type == "im_drain") + ASSERT(type == "smo" || type == "smi" || type == "dmo" || type == "dmp" || type == "em" || type == "ema" || type == "im_digest" || type == "im_hold" || type == "im_absorb" || type == "im_heal" || type == "im_drain" || type == "im_steal" || type == "im_egg" || type == "im_shrink" || type == "im_grow" || type == "im_unabsorb") var/list/raw_messages switch(type) @@ -452,7 +452,16 @@ raw_messages = emote_lists[DM_HEAL] if("im_drain") raw_messages = emote_lists[DM_DRAIN] - + if("im_steal") + raw_messages = emote_lists[DM_SIZE_STEAL] + if("im_egg") + raw_messages = emote_lists[DM_EGG] + if("im_shrink") + raw_messages = emote_lists[DM_SHRINK] + if("im_grow") + raw_messages = emote_lists[DM_GROW] + if("im_unabsorb") + raw_messages = emote_lists[DM_UNABSORB] var/messages = null if(raw_messages) messages = raw_messages.Join(delim) @@ -462,7 +471,7 @@ // replacement strings and linebreaks as delimiters (two \n\n by default). // They also sanitize the messages. /obj/belly/proc/set_messages(raw_text, type, delim = "\n\n") - ASSERT(type == "smo" || type == "smi" || type == "dmo" || type == "dmp" || type == "em" || type == "ema" || type == "im_digest" || type == "im_hold" || type == "im_absorb" || type == "im_heal" || type == "im_drain") + ASSERT(type == "smo" || type == "smi" || type == "dmo" || type == "dmp" || type == "em" || type == "ema" || type == "im_digest" || type == "im_hold" || type == "im_absorb" || type == "im_heal" || type == "im_drain" || type == "im_steal" || type == "im_egg" || type == "im_shrink" || type == "im_grow" || type == "im_unabsorb") var/list/raw_list = splittext(html_encode(raw_text),delim) if(raw_list.len > 10) @@ -470,10 +479,10 @@ log_debug("[owner] tried to set [lowertext(name)] with 11+ messages") for(var/i = 1, i <= raw_list.len, i++) - if((length(raw_list[i]) > 160 || length(raw_list[i]) < 10) && !(type == "im_digest" || type == "im_hold" || type == "im_absorb" || type == "im_heal" || type == "im_drain")) //160 is fudged value due to htmlencoding increasing the size + if((length(raw_list[i]) > 160 || length(raw_list[i]) < 10) && !(type == "im_digest" || type == "im_hold" || type == "im_absorb" || type == "im_heal" || type == "im_drain" || type == "im_steal" || type == "im_egg" || type == "im_shrink" || type == "im_grow" || type == "im_unabsorb")) //160 is fudged value due to htmlencoding increasing the size raw_list.Cut(i,i) log_debug("[owner] tried to set [lowertext(name)] with >121 or <10 char message") - else if((type == "im_digest" || type == "im_hold" || type == "im_absorb" || type == "im_heal" || type == "im_drain") && (length(raw_list[i]) > 510 || length(raw_list[i]) < 10)) + else if((type == "im_digest" || type == "im_hold" || type == "im_absorb" || type == "im_heal" || type == "im_drain" || type == "im_steal" || type == "im_egg" || type == "im_shrink" || type == "im_grow" || type == "im_unabsorb") && (length(raw_list[i]) > 510 || length(raw_list[i]) < 10)) raw_list.Cut(i,i) log_debug("[owner] tried to set [lowertext(name)] idle message with >501 or <10 char message") else @@ -506,6 +515,16 @@ emote_lists[DM_HEAL] = raw_list if("im_drain") emote_lists[DM_DRAIN] = raw_list + if("im_steal") + emote_lists[DM_SIZE_STEAL] = raw_list + if("im_egg") + emote_lists[DM_EGG] = raw_list + if("im_shrink") + emote_lists[DM_SHRINK] = raw_list + if("im_grow") + emote_lists[DM_GROW] = raw_list + if("im_unabsorb") + emote_lists[DM_UNABSORB] = raw_list return diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm index 1bb5ad62cf..d823ad8bae 100644 --- a/code/modules/vore/eating/vorepanel_vr.dm +++ b/code/modules/vore/eating/vorepanel_vr.dm @@ -750,6 +750,31 @@ if(new_message) host.vore_selected.set_messages(new_message,"im_drain") + if("im_steal") + var/new_message = input(user,"These are sent to prey every minute when you are on Size Steal mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Size Steal)",host.vore_selected.get_messages("im_steal")) as message + if(new_message) + host.vore_selected.set_messages(new_message,"im_steal") + + if("im_egg") + var/new_message = input(user,"These are sent to prey every minute when you are on Encase In Egg mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Encase In Egg)",host.vore_selected.get_messages("im_egg")) as message + if(new_message) + host.vore_selected.set_messages(new_message,"im_egg") + + if("im_shrink") + var/new_message = input(user,"These are sent to prey every minute when you are on Shrink mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Shrink)",host.vore_selected.get_messages("im_shrink")) as message + if(new_message) + host.vore_selected.set_messages(new_message,"im_shrink") + + if("im_grow") + var/new_message = input(user,"These are sent to prey every minute when you are on Grow mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Grow)",host.vore_selected.get_messages("im_grow")) as message + if(new_message) + host.vore_selected.set_messages(new_message,"im_grow") + + if("im_unabsorb") + var/new_message = input(user,"These are sent to prey every minute when you are on Unabsorb mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Unabsorb)",host.vore_selected.get_messages("im_unabsorb")) as message + if(new_message) + host.vore_selected.set_messages(new_message,"im_unabsorb") + if("reset") var/confirm = tgui_alert(user,"This will delete any custom messages. Are you sure?","Confirmation",list("Cancel","DELETE")) if(confirm == "DELETE") diff --git a/code/modules/vore/fluffstuff/custom_boxes_vr.dm b/code/modules/vore/fluffstuff/custom_boxes_vr.dm index 3c20b5dd6a..70a1e99b45 100644 --- a/code/modules/vore/fluffstuff/custom_boxes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_boxes_vr.dm @@ -286,6 +286,10 @@ Swimsuits, for general use, to avoid arriving to work with your swimsuit. name = "Medical Swimsuit capsule" has_items = list(/obj/item/clothing/under/swimsuit/fluff/medical) +/obj/item/weapon/storage/box/fluff/swimsuit/cowbikini + name = "Cow Bikini Swimsuit capsule" + has_items = list(/obj/item/clothing/under/swimsuit/cowbikini) + //Monkey boxes for the new primals we have /obj/item/weapon/storage/box/monkeycubes/sobakacubes name = "sobaka cube box" diff --git a/icons/inventory/accessory/item_vr.dmi b/icons/inventory/accessory/item_vr.dmi index a1d16cd84d..c39fad3292 100644 Binary files a/icons/inventory/accessory/item_vr.dmi and b/icons/inventory/accessory/item_vr.dmi differ diff --git a/icons/inventory/accessory/mob_vr.dmi b/icons/inventory/accessory/mob_vr.dmi index 27fe89fe84..7327c9b136 100644 Binary files a/icons/inventory/accessory/mob_vr.dmi and b/icons/inventory/accessory/mob_vr.dmi differ diff --git a/icons/inventory/eyes/item.dmi b/icons/inventory/eyes/item.dmi index 768235110b..b4ba37ad39 100644 Binary files a/icons/inventory/eyes/item.dmi and b/icons/inventory/eyes/item.dmi differ diff --git a/icons/inventory/head/mob.dmi b/icons/inventory/head/mob.dmi index 3667c8597b..4fe11e11f9 100644 Binary files a/icons/inventory/head/mob.dmi and b/icons/inventory/head/mob.dmi differ diff --git a/icons/inventory/head/mob_skrell.dmi b/icons/inventory/head/mob_skrell.dmi index f518f8fb70..e862a0730e 100644 Binary files a/icons/inventory/head/mob_skrell.dmi and b/icons/inventory/head/mob_skrell.dmi differ diff --git a/icons/inventory/head/mob_tajaran.dmi b/icons/inventory/head/mob_tajaran.dmi index 24901a33b3..84f3982c2d 100644 Binary files a/icons/inventory/head/mob_tajaran.dmi and b/icons/inventory/head/mob_tajaran.dmi differ diff --git a/icons/inventory/head/mob_teshari.dmi b/icons/inventory/head/mob_teshari.dmi index 038fb9cc3d..fea6c2503f 100644 Binary files a/icons/inventory/head/mob_teshari.dmi and b/icons/inventory/head/mob_teshari.dmi differ diff --git a/icons/inventory/head/mob_unathi.dmi b/icons/inventory/head/mob_unathi.dmi index 2a113796d7..c48827c6bf 100644 Binary files a/icons/inventory/head/mob_unathi.dmi and b/icons/inventory/head/mob_unathi.dmi differ diff --git a/icons/inventory/head/mob_vr.dmi b/icons/inventory/head/mob_vr.dmi index 14c51c2748..dff6cb7eab 100644 Binary files a/icons/inventory/head/mob_vr.dmi and b/icons/inventory/head/mob_vr.dmi differ diff --git a/icons/inventory/head/mob_vr_akula.dmi b/icons/inventory/head/mob_vr_akula.dmi index d030932919..a952c48923 100644 Binary files a/icons/inventory/head/mob_vr_akula.dmi and b/icons/inventory/head/mob_vr_akula.dmi differ diff --git a/icons/inventory/head/mob_vr_sergal.dmi b/icons/inventory/head/mob_vr_sergal.dmi index 4d5a35c047..d1c60634b2 100644 Binary files a/icons/inventory/head/mob_vr_sergal.dmi and b/icons/inventory/head/mob_vr_sergal.dmi differ diff --git a/icons/inventory/head/mob_vr_skrell.dmi b/icons/inventory/head/mob_vr_skrell.dmi index d3de0f973d..70d45b72af 100644 Binary files a/icons/inventory/head/mob_vr_skrell.dmi and b/icons/inventory/head/mob_vr_skrell.dmi differ diff --git a/icons/inventory/head/mob_vr_tajaran.dmi b/icons/inventory/head/mob_vr_tajaran.dmi index 8f478fe37a..8b430eb274 100644 Binary files a/icons/inventory/head/mob_vr_tajaran.dmi and b/icons/inventory/head/mob_vr_tajaran.dmi differ diff --git a/icons/inventory/head/mob_vr_teshari.dmi b/icons/inventory/head/mob_vr_teshari.dmi index ec34ef23f1..bed3f6532f 100644 Binary files a/icons/inventory/head/mob_vr_teshari.dmi and b/icons/inventory/head/mob_vr_teshari.dmi differ diff --git a/icons/inventory/head/mob_vr_unathi.dmi b/icons/inventory/head/mob_vr_unathi.dmi index 9e05584157..730be5905f 100644 Binary files a/icons/inventory/head/mob_vr_unathi.dmi and b/icons/inventory/head/mob_vr_unathi.dmi differ diff --git a/icons/inventory/head/mob_vr_vulpkanin.dmi b/icons/inventory/head/mob_vr_vulpkanin.dmi index 50001ce846..bff1c5f81b 100644 Binary files a/icons/inventory/head/mob_vr_vulpkanin.dmi and b/icons/inventory/head/mob_vr_vulpkanin.dmi differ diff --git a/icons/inventory/suit/item.dmi b/icons/inventory/suit/item.dmi index 77ab891a58..7bef5fc417 100644 Binary files a/icons/inventory/suit/item.dmi and b/icons/inventory/suit/item.dmi differ diff --git a/icons/inventory/suit/mob.dmi b/icons/inventory/suit/mob.dmi index fcb1ee85f3..29a4aa79c9 100644 Binary files a/icons/inventory/suit/mob.dmi and b/icons/inventory/suit/mob.dmi differ diff --git a/icons/inventory/uniform/item.dmi b/icons/inventory/uniform/item.dmi index 08cc0cb815..f0e5d69092 100644 Binary files a/icons/inventory/uniform/item.dmi and b/icons/inventory/uniform/item.dmi differ diff --git a/icons/inventory/uniform/mob.dmi b/icons/inventory/uniform/mob.dmi index 87cee8aca9..e5f028c969 100644 Binary files a/icons/inventory/uniform/mob.dmi and b/icons/inventory/uniform/mob.dmi differ diff --git a/icons/mob/alienanimals_x32.dmi b/icons/mob/alienanimals_x32.dmi index c6fc251dc3..0f46897c7b 100644 Binary files a/icons/mob/alienanimals_x32.dmi and b/icons/mob/alienanimals_x32.dmi differ diff --git a/icons/mob/items/lefthand_holder.dmi b/icons/mob/items/lefthand_holder.dmi index e7c1da2fd3..aad27da53a 100644 Binary files a/icons/mob/items/lefthand_holder.dmi and b/icons/mob/items/lefthand_holder.dmi differ diff --git a/icons/mob/items/lefthand_melee_vr.dmi b/icons/mob/items/lefthand_melee_vr.dmi index ad144c53b4..edf9142d1f 100644 Binary files a/icons/mob/items/lefthand_melee_vr.dmi and b/icons/mob/items/lefthand_melee_vr.dmi differ diff --git a/icons/mob/items/righthand_holder.dmi b/icons/mob/items/righthand_holder.dmi index cb874e6181..0015ff061b 100644 Binary files a/icons/mob/items/righthand_holder.dmi and b/icons/mob/items/righthand_holder.dmi differ diff --git a/icons/mob/items/righthand_melee_vr.dmi b/icons/mob/items/righthand_melee_vr.dmi index 3d5ca587db..6558ff4593 100644 Binary files a/icons/mob/items/righthand_melee_vr.dmi and b/icons/mob/items/righthand_melee_vr.dmi differ diff --git a/icons/obj/mining_vr.dmi b/icons/obj/mining_vr.dmi index a140666d84..0ff360ec70 100644 Binary files a/icons/obj/mining_vr.dmi and b/icons/obj/mining_vr.dmi differ diff --git a/sound/items/helmetdeploy.ogg b/sound/items/helmetdeploy.ogg new file mode 100644 index 0000000000..5eca39d8e9 Binary files /dev/null and b/sound/items/helmetdeploy.ogg differ diff --git a/sound/weapons/plasma_cutter.ogg b/sound/weapons/plasma_cutter.ogg new file mode 100644 index 0000000000..d555110afa Binary files /dev/null and b/sound/weapons/plasma_cutter.ogg differ diff --git a/tgui/packages/tgui/interfaces/VorePanel.js b/tgui/packages/tgui/interfaces/VorePanel.js index 5816c81398..a59eb27941 100644 --- a/tgui/packages/tgui/interfaces/VorePanel.js +++ b/tgui/packages/tgui/interfaces/VorePanel.js @@ -275,21 +275,36 @@ const VoreSelectedBelly = (props, context) => {