MULTITOOL BUFFER: [P.buffer] [id ? "([id])" : ""]" - - dat += linkMenu(P.buffer) - - if(P.buffer) - dat += "\[Flush\]" - dat += "
" - else - dat += "MULTITOOL BUFFER: \[Add Machine\]
" - else - dat += "ACCESS DENIED" - dat += "" - user << browse(dat, "window=mtcomputer") - user.set_machine(src) - onclose(user, "mtcomputer") +/obj + layer = OBJ_LAYER + plane = OBJ_PLANE + vis_flags = VIS_INHERIT_PLANE //when this be added to vis_contents of something it inherit something.plane, important for visualisation of obj in openspace. + //Used to store information about the contents of the object. + var/list/matter + var/w_class // Size of the object. + var/unacidable = FALSE //universal "unacidabliness" var, here so you can use it in any obj. + animate_movement = 2 + var/throwforce = 1 + var/catchable = 1 // can it be caught on throws/flying? + var/sharp = FALSE // whether this object cuts + var/edge = FALSE // whether this object is more likely to dismember + var/pry = 0 //Used in attackby() to open doors + var/in_use = 0 // If we have a user using us, this will be set on. We will check if the user has stopped using us, and thus stop updating and LAGGING EVERYTHING! + var/damtype = "brute" + var/armor_penetration = 0 + var/show_messages + var/preserve_item = 0 //whether this object is preserved when its owner goes into cryo-storage, gateway, etc + var/can_speak = 0 //For MMIs and admin trickery. If an object has a brainmob in its contents, set this to 1 to allow it to speak. + + var/Mtoollink = 0 //YW EDIT: aac + var/show_examine = TRUE // Does this pop up on a mob when the mob is examined? + +/obj/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/Topic(href, href_list, var/datum/tgui_state/state = GLOB.tgui_default_state) + if(usr && ..()) + return 1 + + // In the far future no checks are made in an overriding Topic() beyond if(..()) return + // Instead any such checks are made in CanUseTopic() + if(CanUseTopic(usr, state, href_list) == STATUS_INTERACTIVE) + CouldUseTopic(usr) + return 0 + + CouldNotUseTopic(usr) + return 1 + +/obj/CanUseTopic(var/mob/user, var/datum/tgui_state/state = GLOB.tgui_default_state) + if(user.CanUseObjTopic(src)) + return ..() + to_chat(user, "\icon[src][bicon(src)]Access Denied!") + return STATUS_CLOSE + +/mob/living/silicon/CanUseObjTopic(var/obj/O) + var/id = src.GetIdCard() + return O.check_access(id) + +/mob/proc/CanUseObjTopic() + return 1 + +/obj/proc/CouldUseTopic(var/mob/user) + var/atom/host = tgui_host() + host.add_hiddenprint(user) + +/obj/proc/CouldNotUseTopic(var/mob/user) + // Nada + +/obj/item/proc/is_used_on(obj/O, mob/user) + +/obj/assume_air(datum/gas_mixture/giver) + if(loc) + return loc.assume_air(giver) + else + return null + +/obj/remove_air(amount) + if(loc) + return loc.remove_air(amount) + else + return null + +/obj/return_air() + if(loc) + return loc.return_air() + else + return null + +/obj/proc/updateUsrDialog() + if(in_use) + var/is_in_use = 0 + var/list/nearby = viewers(1, src) + for(var/mob/M in nearby) + if ((M.client && M.machine == src)) + is_in_use = 1 + src.attack_hand(M) + if (istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot)) + if (!(usr in nearby)) + if (usr.client && usr.machine==src) // && M.machine == src is omitted because if we triggered this by using the dialog, it doesn't matter if our machine changed in between triggering it and this - the dialog is probably still supposed to refresh. + is_in_use = 1 + src.attack_ai(usr) + + // check for TK users + + if (istype(usr, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = usr + if(H.get_type_in_hands(/obj/item/tk_grab)) + if(!(H in nearby)) + if(H.client && H.machine==src) + is_in_use = 1 + src.attack_hand(H) + in_use = is_in_use + +/obj/proc/updateDialog() + // Check that people are actually using the machine. If not, don't update anymore. + if(in_use) + var/list/nearby = viewers(1, src) + var/is_in_use = 0 + for(var/mob/M in nearby) + if ((M.client && M.machine == src)) + is_in_use = 1 + src.interact(M) + var/ai_in_use = AutoUpdateAI(src) + + if(!ai_in_use && !is_in_use) + in_use = 0 + +/obj/attack_ghost(mob/user) + tgui_interact(user) + ..() + +/mob/proc/unset_machine() + machine?.remove_visual(src) + src.machine = null + +/mob/proc/set_machine(var/obj/O) + if(src.machine) + unset_machine() + src.machine = O + if(istype(O)) + O.in_use = 1 + +/obj/item/proc/updateSelfDialog() + var/mob/M = src.loc + if(istype(M) && M.client && M.machine == src) + src.attack_self(M) + +/obj/proc/hide(h) + return + +/obj/proc/hides_under_flooring() + return 0 + +/obj/proc/hear_talk(mob/M, list/message_pieces, verb) + if(talking_atom) + talking_atom.catchMessage(multilingual_to_message(message_pieces), M) +/* + var/mob/mo = locate(/mob) in src + if(mo) + var/rendered = "[M.name]: " + mo.show_message(rendered, 2) + */ + return + +/obj/proc/hear_signlang(mob/M as mob, text, verb, datum/language/speaking) // Saycode gets worse every day. + return FALSE + +/obj/proc/see_emote(mob/M as mob, text, var/emote_type) + return + +/obj/proc/show_message(msg, type, alt, alt_type)//Message, type of message (1 or 2), alternative message, alt message type (1 or 2) + return + +// Used to mark a turf as containing objects that are dangerous to step onto. +/obj/proc/register_dangerous_to_step() + var/turf/T = get_turf(src) + if(T) + T.register_dangerous_object(src) + +/obj/proc/unregister_dangerous_to_step() + var/turf/T = get_turf(src) + if(T) + T.unregister_dangerous_object(src) + +// Test for if stepping on a tile containing this obj is safe to do, used for things like landmines and cliffs. +/obj/proc/is_safe_to_step(mob/living/L) + return TRUE + +/obj/proc/container_resist(var/mob/living) + return + +//To be called from things that spill objects on the floor. +//Makes an object move around randomly for a couple of tiles +/obj/proc/tumble(var/dist = 2) + set waitfor = FALSE + if (dist >= 1) + dist += rand(0,1) + for(var/i = 1, i <= dist, i++) + if(src) + step(src, pick(NORTH,SOUTH,EAST,WEST)) + sleep(rand(2,4)) + +//YW EDIT: aac start +/obj/machinery/proc/multitool_menu(var/mob/user,var/obj/item/multitool/P) + return "NO MULTITOOL_MENU!" + +/obj/machinery/proc/linkWith(var/mob/user, var/obj/buffer, var/link/context) + return 0 + +/obj/machinery/proc/unlinkFrom(var/mob/user, var/obj/buffer) + return 0 + +/obj/machinery/proc/canLink(var/obj/O, var/link/context) + return 0 + +/obj/machinery/proc/isLinkedWith(var/obj/O) + return 0 + +/obj/machinery/proc/getLink(var/idx) + return null + +/obj/machinery/proc/linkMenu(var/obj/O) + var/dat="" + if(canLink(O, list())) + dat += " \[Link\] " + return dat + +/obj/machinery/proc/format_tag(var/label,var/varname, var/act="set_tag") + var/value = vars[varname] + if(!value || value=="") + value="-----" + return "[label]: [value]" + + +/obj/machinery/proc/update_multitool_menu(mob/user as mob) + var/obj/item/device/multitool/P = get_multitool(user) + + if(!istype(P)) + return 0 + var/dat = {" + +MULTITOOL BUFFER: [P.buffer] [id ? "([id])" : ""]" + + dat += linkMenu(P.buffer) + + if(P.buffer) + dat += "\[Flush\]" + dat += "
" + else + dat += "MULTITOOL BUFFER: \[Add Machine\]
" + else + dat += "ACCESS DENIED" + dat += "" + user << browse(dat, "window=mtcomputer") + user.set_machine(src) + onclose(user, "mtcomputer") //YW EDIT: aac end \ No newline at end of file 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 e918af24f3..fbcda79122 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -1,132 +1,145 @@ -/obj/structure/closet/secure_closet/engineering_chief - name = "chief engineer's locker" - req_access = list(access_ce) - closet_appearance = /decl/closet_appearance/secure_closet/engineering/ce - - starts_with = list( - /obj/item/clothing/accessory/storage/brown_vest, - /obj/item/blueprints, - ///obj/item/clamp, //VOREStation Removal: without leaks those are pointless, - ///obj/item/clamp, //VOREStation Removal: without leaks those are pointless, - /obj/item/clothing/under/rank/chief_engineer, - /obj/item/clothing/under/rank/chief_engineer/skirt, - /obj/item/clothing/head/hardhat/white, - ///obj/item/clothing/head/welding, //VOREStation Removal: Locker bloat, grr. They get fancy goggles or can raid the welding supplies locker for one of these. - /obj/item/clothing/gloves/heavy_engineer, //VOREStation Edit: chief gets the good shit - /obj/item/clothing/shoes/brown, - /obj/item/weapon/cartridge/ce, - /obj/item/device/radio/headset/heads/ce, - /obj/item/device/radio/headset/heads/ce/alt, - /obj/item/weapon/storage/toolbox/mechanical, - /obj/item/clothing/suit/storage/hazardvest, - ///obj/item/clothing/mask/gas, //VOREStation Removal: Locker bloat, grr. The fancy one below functions as a mask & helmet combined. - /obj/item/clothing/head/hardhat/firefighter/chief, //VOREStation Add: replaces the bog-standard gas mask - ///obj/item/device/multitool, //VOREStation Removal: The belt they get, both standard and the fancy one, both come with one already, why stick another in here too? - /obj/item/weapon/storage/belt/utility/chief/full, - /obj/item/device/flash, - /obj/item/device/t_scanner/upgraded, - /obj/item/taperoll/engineering, - ///obj/item/clothing/suit/storage/hooded/wintercoat/engineering, //VOREStation Removal: Locker bloat, grr. They can grab from the engi-clothes vendor if they want the standard one. - /obj/item/clothing/suit/storage/hooded/wintercoat/engineering/ce, - ///obj/item/clothing/shoes/boots/winter/engineering, //VOREStation Removal: Locker bloat, grr. As above. - /obj/item/clothing/head/beret/engineering/ce, - /obj/item/clothing/head/beret/engineering/ce/white, - /obj/item/weapon/tank/emergency/oxygen/double, //VOREStation Edit: chief gets the good shit - /obj/item/weapon/reagent_containers/spray/windowsealant, //VOREStation Add, - /obj/item/weapon/pipe_dispenser) // YW Add - -/obj/structure/closet/secure_closet/engineering_chief/Initialize() - if(prob(50)) - starts_with += /obj/item/weapon/storage/backpack/industrial - else - starts_with += /obj/item/weapon/storage/backpack/satchel/eng - if(prob(50)) - starts_with += /obj/item/weapon/storage/backpack/dufflebag/eng - return ..() - -/obj/structure/closet/secure_closet/engineering_electrical - name = "electrical supplies" - req_access = list(access_engine_equip) - closet_appearance = /decl/closet_appearance/secure_closet/engineering/electrical - - starts_with = list( - /obj/item/clothing/gloves/yellow = 2, - /obj/item/weapon/storage/toolbox/electrical = 3, - /obj/item/weapon/module/power_control = 3, - /obj/item/device/multitool = 3) - - -/obj/structure/closet/secure_closet/engineering_welding - name = "welding supplies" - req_access = list(access_construction) - closet_appearance = /decl/closet_appearance/secure_closet/engineering/welding - - starts_with = list( - /obj/item/clothing/head/welding = 3, - /obj/item/weapon/weldingtool/largetank = 3, - /obj/item/weapon/weldpack = 3, - /obj/item/clothing/glasses/welding = 3) - -/obj/structure/closet/secure_closet/engineering_personal - name = "engineer's locker" - req_access = list(access_engine_equip) - closet_appearance = /decl/closet_appearance/secure_closet/engineering - - starts_with = list( - /obj/item/clothing/accessory/storage/brown_vest, - /obj/item/weapon/storage/toolbox/mechanical, - /obj/item/device/radio/headset/headset_eng, - /obj/item/device/radio/headset/headset_eng/alt, - /obj/item/clothing/suit/storage/hazardvest, - /obj/item/clothing/mask/gas, - /obj/item/clothing/glasses/meson, - /obj/item/weapon/cartridge/engineering, - /obj/item/taperoll/engineering, - /obj/item/clothing/head/hardhat, - /obj/item/clothing/suit/storage/hooded/wintercoat/engineering, - /obj/item/clothing/shoes/boots/winter/engineering, - /obj/item/weapon/tank/emergency/oxygen/engi, - /obj/item/weapon/storage/belt/utility, //VOREStation Add - /obj/item/weapon/reagent_containers/spray/windowsealant) //VOREStation Add - -/obj/structure/closet/secure_closet/engineering_personal/Initialize() - if(prob(50)) - starts_with += /obj/item/weapon/storage/backpack/industrial - else - starts_with += /obj/item/weapon/storage/backpack/satchel/eng - if(prob(50)) - starts_with += /obj/item/weapon/storage/backpack/dufflebag/eng - return ..() - - -/obj/structure/closet/secure_closet/atmos_personal - name = "technician's locker" - req_access = list(access_atmospherics) - closet_appearance = /decl/closet_appearance/secure_closet/engineering/atmos - - starts_with = list( - /obj/item/clothing/accessory/storage/brown_vest, - /obj/item/clothing/suit/fire/heavy, - /obj/item/clothing/head/hardhat/firefighter/atmos, - /obj/item/device/flashlight, - /obj/item/weapon/extinguisher/atmo, - ///obj/item/clamp, //VOREStation Removal: without leaks those are pointless, - /obj/item/device/radio/headset/headset_eng, - /obj/item/device/radio/headset/headset_eng/alt, - /obj/item/clothing/suit/storage/hazardvest/atmos, //VOREStation edit. Eng locker gets regular haz-vest, atmos gets the themed one of their own - /obj/item/clothing/mask/gas, - /obj/item/weapon/cartridge/atmos, - /obj/item/taperoll/atmos, - /obj/item/clothing/suit/storage/hooded/wintercoat/engineering/atmos, - /obj/item/clothing/shoes/boots/winter/atmos, - /obj/item/weapon/tank/emergency/oxygen/engi, - /obj/item/weapon/storage/belt/utility/atmostech) //VOREStation edit. They don't get a toolbox to fill it from, so why not give a spare one that's full already? - -/obj/structure/closet/secure_closet/atmos_personal/Initialize() - if(prob(50)) - starts_with += /obj/item/weapon/storage/backpack/industrial - else - starts_with += /obj/item/weapon/storage/backpack/satchel/eng - if(prob(50)) - starts_with += /obj/item/weapon/storage/backpack/dufflebag/eng - return ..() +/obj/structure/closet/secure_closet/engineering_chief + name = "chief engineer's locker" + req_access = list(access_ce) + closet_appearance = /decl/closet_appearance/secure_closet/engineering/ce + + starts_with = list( + /obj/item/clothing/accessory/storage/brown_vest, + /obj/item/blueprints, + ///obj/item/clamp, //VOREStation Removal: without leaks those are pointless, + ///obj/item/clamp, //VOREStation Removal: without leaks those are pointless, + /obj/item/clothing/under/rank/chief_engineer, + /obj/item/clothing/under/rank/chief_engineer/skirt, + /obj/item/clothing/head/hardhat/white, + ///obj/item/clothing/head/welding, //VOREStation Removal: Locker bloat, grr. They get fancy goggles or can raid the welding supplies locker for one of these. + /obj/item/clothing/gloves/heavy_engineer, //VOREStation Edit: chief gets the good shit + /obj/item/clothing/shoes/brown, + /obj/item/weapon/cartridge/ce, + /obj/item/device/radio/headset/heads/ce, + /obj/item/device/radio/headset/heads/ce/alt, + /obj/item/weapon/storage/toolbox/mechanical, + /obj/item/clothing/suit/storage/hazardvest, + ///obj/item/clothing/mask/gas, //VOREStation Removal: Locker bloat, grr. The fancy one below functions as a mask & helmet combined. + /obj/item/clothing/head/hardhat/firefighter/chief, //VOREStation Add: replaces the bog-standard gas mask + ///obj/item/device/multitool, //VOREStation Removal: The belt they get, both standard and the fancy one, both come with one already, why stick another in here too? + /obj/item/weapon/storage/belt/utility/chief/full, + /obj/item/device/flash, + /obj/item/device/t_scanner/upgraded, + /obj/item/taperoll/engineering, + ///obj/item/clothing/suit/storage/hooded/wintercoat/engineering, //VOREStation Removal: Locker bloat, grr. They can grab from the engi-clothes vendor if they want the standard one. + /obj/item/clothing/suit/storage/hooded/wintercoat/engineering/ce, + ///obj/item/clothing/shoes/boots/winter/engineering, //VOREStation Removal: Locker bloat, grr. As above. + /obj/item/clothing/head/beret/engineering/ce, + /obj/item/clothing/head/beret/engineering/ce/white, + /obj/item/weapon/tank/emergency/oxygen/double, //VOREStation Edit: chief gets the good shit + /obj/item/weapon/reagent_containers/spray/windowsealant, //VOREStation Add, + /obj/item/weapon/pipe_dispenser) // YW Add + +/obj/structure/closet/secure_closet/engineering_chief/Initialize() + if(prob(50)) + starts_with += /obj/item/weapon/storage/backpack/industrial + else + starts_with += /obj/item/weapon/storage/backpack/satchel/eng + if(prob(50)) + starts_with += /obj/item/weapon/storage/backpack/dufflebag/eng + return ..() + +/obj/structure/closet/secure_closet/engineering_electrical + name = "electrical supplies" + req_access = list(access_engine_equip) + closet_appearance = /decl/closet_appearance/secure_closet/engineering/electrical + + starts_with = list( + /obj/item/clothing/gloves/yellow = 2, + /obj/item/weapon/storage/toolbox/electrical = 3, + /obj/item/weapon/module/power_control = 3, + /obj/item/device/multitool = 3) + +/obj/structure/closet/secure_closet/engineering_electrical/double + starts_with = list( + /obj/item/clothing/gloves/yellow = 4, + /obj/item/weapon/storage/toolbox/electrical = 6, + /obj/item/weapon/module/power_control = 6, + /obj/item/device/multitool = 6) + +/obj/structure/closet/secure_closet/engineering_welding + name = "welding supplies" + req_access = list(access_construction) + closet_appearance = /decl/closet_appearance/secure_closet/engineering/welding + + starts_with = list( + /obj/item/clothing/head/welding = 3, + /obj/item/weapon/weldingtool/largetank = 3, + /obj/item/weapon/weldpack = 3, + /obj/item/clothing/glasses/welding = 3) + +/obj/structure/closet/secure_closet/engineering_welding/double + starts_with = list( + /obj/item/clothing/head/welding = 6, + /obj/item/weapon/weldingtool/largetank = 6, + /obj/item/weapon/weldpack = 6, + /obj/item/clothing/glasses/welding = 6) + +/obj/structure/closet/secure_closet/engineering_personal + name = "engineer's locker" + req_access = list(access_engine_equip) + closet_appearance = /decl/closet_appearance/secure_closet/engineering + + starts_with = list( + /obj/item/clothing/accessory/storage/brown_vest, + /obj/item/weapon/storage/toolbox/mechanical, + /obj/item/device/radio/headset/headset_eng, + /obj/item/device/radio/headset/headset_eng/alt, + /obj/item/clothing/suit/storage/hazardvest, + /obj/item/clothing/mask/gas, + /obj/item/clothing/glasses/meson, + /obj/item/weapon/cartridge/engineering, + /obj/item/taperoll/engineering, + /obj/item/clothing/head/hardhat, + /obj/item/clothing/suit/storage/hooded/wintercoat/engineering, + /obj/item/clothing/shoes/boots/winter/engineering, + /obj/item/weapon/tank/emergency/oxygen/engi, + /obj/item/weapon/storage/belt/utility, //VOREStation Add + /obj/item/weapon/reagent_containers/spray/windowsealant) //VOREStation Add + +/obj/structure/closet/secure_closet/engineering_personal/Initialize() + if(prob(50)) + starts_with += /obj/item/weapon/storage/backpack/industrial + else + starts_with += /obj/item/weapon/storage/backpack/satchel/eng + if(prob(50)) + starts_with += /obj/item/weapon/storage/backpack/dufflebag/eng + return ..() + + +/obj/structure/closet/secure_closet/atmos_personal + name = "technician's locker" + req_access = list(access_atmospherics) + closet_appearance = /decl/closet_appearance/secure_closet/engineering/atmos + + starts_with = list( + /obj/item/clothing/accessory/storage/brown_vest, + /obj/item/clothing/suit/fire/heavy, + /obj/item/clothing/head/hardhat/firefighter/atmos, + /obj/item/device/flashlight, + /obj/item/weapon/extinguisher/atmo, + ///obj/item/clamp, //VOREStation Removal: without leaks those are pointless, + /obj/item/device/radio/headset/headset_eng, + /obj/item/device/radio/headset/headset_eng/alt, + /obj/item/clothing/suit/storage/hazardvest/atmos, //VOREStation edit. Eng locker gets regular haz-vest, atmos gets the themed one of their own + /obj/item/clothing/mask/gas, + /obj/item/weapon/cartridge/atmos, + /obj/item/taperoll/atmos, + /obj/item/clothing/suit/storage/hooded/wintercoat/engineering/atmos, + /obj/item/clothing/shoes/boots/winter/atmos, + /obj/item/weapon/tank/emergency/oxygen/engi, + /obj/item/weapon/storage/belt/utility/atmostech) //VOREStation edit. They don't get a toolbox to fill it from, so why not give a spare one that's full already? + +/obj/structure/closet/secure_closet/atmos_personal/Initialize() + if(prob(50)) + starts_with += /obj/item/weapon/storage/backpack/industrial + else + starts_with += /obj/item/weapon/storage/backpack/satchel/eng + if(prob(50)) + starts_with += /obj/item/weapon/storage/backpack/dufflebag/eng + return ..() diff --git a/code/game/objects/structures/flora/flora.dm b/code/game/objects/structures/flora/flora.dm index 1f7e2d0ba9..2b03156385 100644 --- a/code/game/objects/structures/flora/flora.dm +++ b/code/game/objects/structures/flora/flora.dm @@ -81,7 +81,7 @@ /obj/structure/flora/proc/spawn_harvest(var/path = null, var/mob/user = null) if(!ispath(path)) return 0 - + var/atom/movable/AM = new path() if(user) user.put_in_hands(AM) @@ -96,7 +96,7 @@ name = "bush" icon = 'icons/obj/flora/snowflora.dmi' icon_state = "snowbush1" - + destroy_on_harvest = TRUE harvest_tool = /obj/item/weapon/material/knife randomize_harvest_count = FALSE @@ -121,13 +121,13 @@ name = "bush" icon = 'icons/obj/flora/ausflora.dmi' icon_state = "firstbush_1" - + destroy_on_harvest = TRUE harvest_tool = /obj/item/weapon/material/knife randomize_harvest_count = TRUE harvest_loot = list(/obj/item/stack/material/fiber = 1) min_harvests = 1 - max_harvests = 3 + max_harvests = 3 /obj/structure/flora/ausbushes/spawn_harvest(var/path = null, var/mob/user = null) . = ..() @@ -300,7 +300,7 @@ user.drop_from_inventory(I, src) I.forceMove(src) stored_item = I - src.visible_message("[bicon(src)] [bicon(I)] [user] places [I] into [src].") + src.visible_message("\icon[src][bicon(src)] \icon[I][bicon(I)] [user] places [I] into [src].") return else to_chat(user, "You refrain from putting things into the plant pot.") @@ -311,7 +311,7 @@ to_chat(user, "You see nothing of interest in [src]...") else if(do_after(user, 10)) - to_chat(user, "You find [bicon(stored_item)] [stored_item] in [src]!") + to_chat(user, "You find \icon[stored_item][bicon(stored_item)] [stored_item] in [src]!") stored_item.forceMove(get_turf(src)) stored_item = null ..() diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 46a888e55f..1aeb9cdf4c 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -118,9 +118,9 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart) . = ..(user) if(istype(mybucket)) var/contains = mybucket.reagents.total_volume - . += "[bicon(src)] The bucket contains [contains] unit\s of liquid!" + . += "\icon[src][bicon(src)] The bucket contains [contains] unit\s of liquid!" else - . += "[bicon(src)] There is no bucket mounted on it!" + . += "\icon[src][bicon(src)] There is no bucket mounted on it!" /obj/structure/janitorialcart/MouseDrop_T(atom/movable/O as mob|obj, mob/living/user as mob) if (istype(O, /obj/structure/mopbucket) && !mybucket) diff --git a/code/game/objects/structures/map_blocker_vr.dm b/code/game/objects/structures/map_blocker_vr.dm index bd56b08d6e..2b41679979 100644 --- a/code/game/objects/structures/map_blocker_vr.dm +++ b/code/game/objects/structures/map_blocker_vr.dm @@ -8,8 +8,11 @@ opacity = 0 density = TRUE unacidable = TRUE + plane = PLANE_BUILDMODE +/* //VOREStation Edit /obj/effect/blocker/Initialize() // For non-gateway maps. . = ..() icon = null icon_state = null +*/ diff --git a/code/game/objects/structures/signs_vr.dm b/code/game/objects/structures/signs_vr.dm index 321ba27fc7..d786560142 100644 --- a/code/game/objects/structures/signs_vr.dm +++ b/code/game/objects/structures/signs_vr.dm @@ -2,4 +2,10 @@ icon = 'icons/obj/decals_vr.dmi' name = "\improper ITG" desc = "A polished metal sign which reads 'Ironcrest Transport Group'." - icon_state = "itg" \ No newline at end of file + icon_state = "itg" + +/obj/structure/sign/scenery/fakefireaxe + name = "decorative fire axe cabinet" + desc = "A fancy decorative indent in the wall, with an axe inside. The axe is actually a part of the indent and cannot be removed. A nostalgic reminder of older times of firefighting." + icon_state = "fireaxe1000" + icon = 'icons/obj/closet.dmi' \ No newline at end of file diff --git a/code/game/objects/structures/trash_pile_vr.dm b/code/game/objects/structures/trash_pile_vr.dm index bb3346bb4e..2e22537287 100644 --- a/code/game/objects/structures/trash_pile_vr.dm +++ b/code/game/objects/structures/trash_pile_vr.dm @@ -84,6 +84,49 @@ else return ..() +/obj/structure/trash_pile/attack_ghost(mob/observer/user as mob) + if(config.disable_player_mice) + to_chat(user, "Spawning as a mouse is currently disabled.") + return + + //VOREStation Add Start + if(jobban_isbanned(user, "GhostRoles")) + to_chat(user, "You cannot become a mouse because you are banned from playing ghost roles.") + return + //VOREStation Add End + + if(!user.MayRespawn(1)) + return + + var/turf/T = get_turf(src) + if(!T || (T.z in using_map.admin_levels)) + to_chat(user, "You may not spawn as a mouse on this Z-level.") + return + + var/timedifference = world.time - user.client.time_died_as_mouse + if(user.client.time_died_as_mouse && timedifference <= mouse_respawn_time * 600) + var/timedifference_text + timedifference_text = time2text(mouse_respawn_time * 600 - timedifference,"mm:ss") + to_chat(user, "You may only spawn again as a mouse more than [mouse_respawn_time] minutes after your death. You have [timedifference_text] left.") + return + + var/response = tgui_alert(user, "Are you -sure- you want to become a mouse?","Are you sure you want to squeek?",list("Squeek!","Nope!")) + if(response != "Squeek!") return //Hit the wrong key...again. + + var/mob/living/simple_mob/animal/passive/mouse/host + host = new /mob/living/simple_mob/animal/passive/mouse(get_turf(src)) + + if(host) + if(config.uneducated_mice) + host.universal_understand = 0 + announce_ghost_joinleave(src, 0, "They are now a mouse.") + host.ckey = user.ckey + to_chat(host, "You are now a mouse. Try to avoid interaction with players, and do not give hints away that you are more than a simple rodent.") + + var/atom/A = get_holder_at_turf_level(src) + A.visible_message("[host] crawls out of \the [src].") + return + /obj/structure/trash_pile/attack_hand(mob/user) //Human mob if(ishuman(user)) @@ -202,6 +245,8 @@ prob(2);/obj/item/toy/tennis/cyan, prob(2);/obj/item/toy/tennis/blue, prob(2);/obj/item/toy/tennis/purple, + prob(1);/obj/item/weapon/storage/box/brainzsnax, + prob(1);/obj/item/weapon/storage/box/brainzsnax/red, prob(1);/obj/item/clothing/glasses/sunglasses, prob(1);/obj/item/clothing/glasses/sunglasses/bigshot, prob(1);/obj/item/clothing/glasses/welding, diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index def2811188..b6c5885ac4 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -255,13 +255,7 @@ M.clean_blood() - if(isturf(loc)) - var/turf/tile = loc - for(var/obj/effect/E in tile) - if(istype(E,/obj/effect/rune) || istype(E,/obj/effect/decal/cleanable) || istype(E,/obj/effect/overlay)) - qdel(E) - - reagents.splash(O, 10) + reagents.splash(O, 10, min_spill = 0, max_spill = 0) /obj/machinery/shower/process() if(!on) return @@ -275,11 +269,10 @@ reagents.add_reagent("water", reagents.get_free_space()) /obj/machinery/shower/proc/wash_floor() - if(!ismist && is_washing) + if(is_washing) return is_washing = 1 var/turf/T = get_turf(src) - reagents.splash(T, reagents.total_volume) T.clean(src) spawn(100) is_washing = 0 diff --git a/code/game/sound.dm b/code/game/sound.dm index 18dd9e718a..4fef9f41ed 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -290,4 +290,21 @@ //Are these even used? //Yes var/list/keyboard_sound = list ('sound/effects/keyboard/keyboard1.ogg','sound/effects/keyboard/keyboard2.ogg','sound/effects/keyboard/keyboard3.ogg', 'sound/effects/keyboard/keyboard4.ogg') var/list/bodyfall_sound = list('sound/effects/bodyfall1.ogg','sound/effects/bodyfall2.ogg','sound/effects/bodyfall3.ogg','sound/effects/bodyfall4.ogg') -var/list/teppi_sound = list('sound/voice/teppi/gyooh1.ogg', 'sound/voice/teppi/gyooh2.ogg', 'sound/voice/teppi/gyooh3.ogg', 'sound/voice/teppi/gyooh4.ogg', 'sound/voice/teppi/gyooh5.ogg', 'sound/voice/teppi/gyooh6.ogg', 'sound/voice/teppi/snoot1.ogg', 'sound/voice/teppi/snoot2.ogg') \ No newline at end of file +var/list/teppi_sound = list('sound/voice/teppi/gyooh1.ogg', 'sound/voice/teppi/gyooh2.ogg', 'sound/voice/teppi/gyooh3.ogg', 'sound/voice/teppi/gyooh4.ogg', 'sound/voice/teppi/gyooh5.ogg', 'sound/voice/teppi/gyooh6.ogg', 'sound/voice/teppi/snoot1.ogg', 'sound/voice/teppi/snoot2.ogg') +var/list/talk_sound = list('sound/talksounds/a.ogg','sound/talksounds/b.ogg','sound/talksounds/c.ogg','sound/talksounds/d.ogg','sound/talksounds/e.ogg','sound/talksounds/f.ogg','sound/talksounds/g.ogg','sound/talksounds/h.ogg') +var/list/emote_sound = list('sound/talksounds/me_a.ogg','sound/talksounds/me_b.ogg','sound/talksounds/me_c.ogg','sound/talksounds/me_d.ogg','sound/talksounds/me_e.ogg','sound/talksounds/me_f.ogg') + +//Goon sounds +var/list/goon_speak_one_sound = list('sound/talksounds/goon/speak_1.ogg', 'sound/talksounds/goon/speak_1_ask.ogg', 'sound/talksounds/goon/speak_1_exclaim.ogg') +var/list/goon_speak_two_sound = list('sound/talksounds/goon/speak_2.ogg', 'sound/talksounds/goon/speak_2_ask.ogg', 'sound/talksounds/goon/speak_2_exclaim.ogg') +var/list/goon_speak_three_sound = list('sound/talksounds/goon/speak_3.ogg', 'sound/talksounds/goon/speak_3_ask.ogg', 'sound/talksounds/goon/speak_3_exclaim.ogg') +var/list/goon_speak_four_sound = list('sound/talksounds/goon/speak_4.ogg', 'sound/talksounds/goon/speak_4_ask.ogg', 'sound/talksounds/goon/speak_4_exclaim.ogg') +var/list/goon_speak_blub_sound = list('sound/talksounds/goon/blub.ogg', 'sound/talksounds/goon/blub_ask.ogg', 'sound/talksounds/goon/blub_exclaim.ogg') +var/list/goon_speak_bottalk_sound = list('sound/talksounds/goon/bottalk_1.ogg', 'sound/talksounds/goon/bottalk_2.ogg', 'sound/talksounds/goon/bottalk_3.ogg', 'sound/talksounds/goon/bottalk_4.wav') +var/list/goon_speak_buwoo_sound = list('sound/talksounds/goon/buwoo.ogg', 'sound/talksounds/goon/buwoo_ask.ogg', 'sound/talksounds/goon/buwoo_exclaim.ogg') +var/list/goon_speak_cow_sound = list('sound/talksounds/goon/cow.ogg', 'sound/talksounds/goon/cow_ask.ogg', 'sound/talksounds/goon/cow_exclaim.ogg') +var/list/goon_speak_lizard_sound = list('sound/talksounds/goon/lizard.ogg', 'sound/talksounds/goon/lizard_ask.ogg', 'sound/talksounds/goon/lizard_exclaim.ogg') +var/list/goon_speak_pug_sound = list('sound/talksounds/goon/pug.ogg', 'sound/talksounds/goon/pug_ask.ogg', 'sound/talksounds/goon/pug_exclaim.ogg') +var/list/goon_speak_pugg_sound = list('sound/talksounds/goon/pugg.ogg', 'sound/talksounds/goon/pugg_ask.ogg', 'sound/talksounds/goon/pugg_exclaim.ogg') +var/list/goon_speak_roach_sound = list('sound/talksounds/goon/roach.ogg', 'sound/talksounds/goon/roach_ask.ogg', 'sound/talksounds/goon/roach_exclaim.ogg') +var/list/goon_speak_skelly_sound = list('sound/talksounds/goon/skelly.ogg', 'sound/talksounds/goon/skelly_ask.ogg', 'sound/talksounds/goon/skelly_exclaim.ogg') diff --git a/code/game/turfs/flooring/flooring.dm b/code/game/turfs/flooring/flooring.dm index fb41f13682..48ee1a884c 100644 --- a/code/game/turfs/flooring/flooring.dm +++ b/code/game/turfs/flooring/flooring.dm @@ -320,6 +320,26 @@ var/list/flooring_types icon_base = "tealcarpet" build_type = /obj/item/stack/tile/carpet/teal +/decl/flooring/carpet/browncarpet + name = "brown carpet" + icon_base = "brncarpet" + build_type = /obj/item/stack/tile/carpet/brncarpet + +/decl/flooring/carpet/blucarpet2 + name = "blue carpet" + icon_base = "blue1" + build_type = /obj/item/stack/tile/carpet/blucarpet2 + +/decl/flooring/carpet/greencarpet + name = "green carpet" + icon_base = "green" + build_type = /obj/item/stack/tile/carpet/greencarpet + +/decl/flooring/carpet/purplecarpet + name = "purple carpet" + icon_base = "purple" + build_type = /obj/item/stack/tile/carpet/purplecarpet + /decl/flooring/carpet/geo name = "geometric carpet" icon_base = "geocarpet" diff --git a/code/game/turfs/flooring/flooring_premade.dm b/code/game/turfs/flooring/flooring_premade.dm index c81c771263..b33ccccb90 100644 --- a/code/game/turfs/flooring/flooring_premade.dm +++ b/code/game/turfs/flooring/flooring_premade.dm @@ -60,6 +60,26 @@ icon_state = "oracarpet" initial_flooring = /decl/flooring/carpet/oracarpet +/turf/simulated/floor/carpet/brown + name = "brown carpet" + icon_state = "brncarpet" + initial_flooring = /decl/flooring/carpet/browncarpet + +/turf/simulated/floor/carpet/blue2 + name = "blue carpet" + icon_state = "blue1" + initial_flooring = /decl/flooring/carpet/blucarpet2 + +/turf/simulated/floor/carpet/green + name = "green carpet" + icon_state = "green" + initial_flooring = /decl/flooring/carpet/greencarpet + +/turf/simulated/floor/carpet/purple + name = "purple carpet" + icon_state = "purple" + initial_flooring = /decl/flooring/carpet/purplecarpet + /turf/simulated/floor/carpet/geo name = "geometric carpet" icon_state = "geocarpet" diff --git a/code/game/world.dm b/code/game/world.dm index b962eb028f..01416b57ba 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -113,7 +113,7 @@ var/world_topic_spam_protect_time = world.timeofday s["players"] = 0 s["stationtime"] = stationtime2text() s["roundduration"] = roundduration2text() - s["map"] = strip_improper(using_map.full_name) //Done to remove the non-UTF-8 text macros + s["map"] = strip_improper(using_map.full_name) //Done to remove the non-UTF-8 text macros if(input["status"] == "2") // Shiny new hip status. var/active = 0 @@ -494,12 +494,9 @@ var/world_topic_spam_protect_time = world.timeofday if (copytext(line, 1, 2) == ";") continue - var/title = "Mentor" - var/rights = admin_ranks[title] - var/ckey = copytext(line, 1, length(line)+1) - var/datum/admins/D = new /datum/admins(title, rights, ckey) - D.associate(GLOB.directory[ckey]) + var/datum/mentor/M = new /datum/mentor(ckey) + M.associate(GLOB.directory[ckey]) /world/proc/update_status() var/s = "" @@ -529,7 +526,7 @@ var/world_topic_spam_protect_time = world.timeofday features += config.abandon_allowed ? "respawn" : "no respawn" features += config.persistence_disabled ? "persistence disabled" : "persistence enabled" - + features += config.persistence_ignore_mapload ? "persistence mapload disabled" : "persistence mapload enabled" if (config && config.allow_vote_mode) @@ -663,7 +660,7 @@ var/failed_old_db_connections = 0 if(dbcon_old?.IsConnected()) results += "WARNING: dbcon_old is connected, not touching it, but is this intentional?" - + if(!config.sql_enabled) results += "stopping because config.sql_enabled = false" else @@ -672,7 +669,7 @@ var/failed_old_db_connections = 0 results += "SUCCESS: set up a connection successfully with setup_database_connection()" else results += "FAIL: failed to connect to the database with setup_database_connection()" - + results += "-- DB Reset End --" to_world_log(results.Join("\n")) @@ -681,11 +678,11 @@ var/failed_old_db_connections = 0 if(!istype(GLOB.players_by_zlevel, /list)) GLOB.players_by_zlevel = new /list(world.maxz, 0) GLOB.living_players_by_zlevel = new /list(world.maxz, 0) - + while(GLOB.players_by_zlevel.len < world.maxz) GLOB.players_by_zlevel.len++ GLOB.players_by_zlevel[GLOB.players_by_zlevel.len] = list() - + GLOB.living_players_by_zlevel.len++ GLOB.living_players_by_zlevel[GLOB.living_players_by_zlevel.len] = list() @@ -727,10 +724,10 @@ var/global/game_id = null game_id = "" var/list/c = list( - "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", - "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", - "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", - "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", + "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", + "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", + "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", + "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0" ) var/l = c.len diff --git a/code/global.dm b/code/global.dm index d21a5ead82..cd4cd35864 100644 --- a/code/global.dm +++ b/code/global.dm @@ -139,7 +139,7 @@ var/list/robot_module_types = list( "Standard", "Engineering", "Surgeon", "Crisis", "Miner", "Janitor", "Service", "Clerical", "Security", "Research", "Medihound", "K9", "Janihound", "Sci-borg", "Pupdozer", - "Service-Hound", "BoozeHound", "KMine" + "Service-Hound", "BoozeHound", "KMine", "TraumaHound" ) // List of modules added during code red var/list/emergency_module_types = list( diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index e8bfad6c0c..31773e10b4 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -1,5 +1,3 @@ - -var/global/BSACooldown = 0 var/global/floorIsLava = 0 @@ -1565,8 +1563,8 @@ var/datum/announcement/minor/admin_min_announcer = new for(var/client/C in GLOB.admins) if((R_ADMIN | R_MOD | R_EVENT) & C.holder.rights) to_chat(C, "") - - var/plaintext_title = P.sender ? "replied to [key_name(P.sender)]'s fax" : "sent a fax message to [destination.department]" + + var/plaintext_title = P.sender ? "replied to [key_name(P.sender)]'s fax" : "sent a fax message to [destination.department]" var/fax_text = paper_html_to_plaintext(P.info) log_game(plaintext_title) log_game(fax_text) diff --git a/code/modules/admin/admin_verb_lists_vr.dm b/code/modules/admin/admin_verb_lists_vr.dm index 8f9bdb4eb3..2705a12411 100644 --- a/code/modules/admin/admin_verb_lists_vr.dm +++ b/code/modules/admin/admin_verb_lists_vr.dm @@ -7,6 +7,8 @@ var/list/admin_verbs_default = list( /client/proc/cmd_admin_say, //VOREStation Add, /client/proc/cmd_mod_say, //VOREStation Add, /client/proc/cmd_event_say, //VOREStation Add, + /client/proc/cmd_mentor_ticket_panel, + /client/proc/cmd_mentor_say // /client/proc/hide_verbs, //hides all our adminverbs, //VOREStation Remove, // /client/proc/hide_most_verbs, //hides all our hideable adminverbs, //VOREStation Remove, // /client/proc/debug_variables, //allows us to -see- the variables of any instance in the game. +VAREDIT needed to modify, //VOREStation Remove, @@ -122,6 +124,8 @@ var/list/admin_verbs_admin = list( /datum/admins/proc/sendFax, /client/proc/despawn_player, /datum/admins/proc/view_feedback, + /client/proc/make_mentor, + /client/proc/unmake_mentor, /client/proc/setckey, //YW add - readds SetCkey proc /client/proc/dbcon_fix //YW add - adds Fix Database Connection proc ) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index d77d72bfa1..4f6ae77ead 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -24,6 +24,8 @@ else if(href_list["ahelp_tickets"]) GLOB.ahelp_tickets.BrowseTickets(text2num(href_list["ahelp_tickets"])) + mentor_commands(href, href_list, src) + if(href_list["dbsearchckey"] || href_list["dbsearchadmin"]) var/adminckey = href_list["dbsearchadmin"] diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index f2f484ed7c..2427b2441d 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -17,7 +17,7 @@ return var/image/cross = image('icons/obj/storage.dmi',"bible") - msg = "[bicon(cross)] PRAY: [key_name(src, 1)] (?) (PP) (VV) (SM) ([admin_jump_link(src, src)]) (CA) (SC) (SMITE): [msg]" + msg = "\icon[cross][bicon(cross)] PRAY: [key_name(src, 1)] (?) (PP) (VV) (SM) ([admin_jump_link(src, src)]) (CA) (SC) (SMITE): [msg]" for(var/client/C in GLOB.admins) if(R_ADMIN|R_EVENT & C.holder.rights) diff --git a/code/modules/admin/verbs/smite.dm b/code/modules/admin/verbs/smite.dm index 78fd832f11..a407454d2b 100644 --- a/code/modules/admin/verbs/smite.dm +++ b/code/modules/admin/verbs/smite.dm @@ -25,21 +25,21 @@ broken_legs++ if(!broken_legs) to_chat(src,"[target] didn't have any breakable legs, sorry.") - + if(SMITE_BLUESPACEARTILLERY) bluespace_artillery(target,src) - + if(SMITE_SPONTANEOUSCOMBUSTION) target.adjust_fire_stacks(10) target.IgniteMob() target.visible_message("[target] bursts into flames!") - + if(SMITE_LIGHTNINGBOLT) var/turf/T = get_step(get_step(target, NORTH), NORTH) T.Beam(target, icon_state="lightning[rand(1,12)]", time = 5) target.electrocute_act(75,def_zone = BP_HEAD) target.visible_message("[target] is struck by lightning!") - + else return //Injection? Don't print any messages. @@ -50,14 +50,6 @@ if(!istype(target)) return - if(BSACooldown) - if(user) - to_chat(user,"BSA is still cooling down, please wait!") - return - - BSACooldown = 1 - VARSET_IN(global, BSACooldown, FALSE, 5 SECONDS) - to_chat(target,"You've been hit by bluespace artillery!") log_and_message_admins("[key_name(target)] has been hit by Bluespace Artillery fired by [key_name(user ? user : usr)]") @@ -68,10 +60,12 @@ if(prob(80)) T.break_tile_to_plating() else T.break_tile() - if(target.health == 1) + playsound(T, get_sfx("explosion"), 100, 1, get_rand_frequency(), falloff = 5) // get_sfx() is so that everyone gets the same sound + + if(target.health < 10) target.gib() else - target.adjustBruteLoss( min( 99 , (target.health - 1) ) ) + target.adjustBruteLoss( max( 99 , (target.health - 1) ) ) target.Stun(20) target.Weaken(20) target.stuttering = 20 diff --git a/code/modules/ai/ai_holder_fleeing.dm b/code/modules/ai/ai_holder_fleeing.dm index 83a7be94b8..7e9b78b1f4 100644 --- a/code/modules/ai/ai_holder_fleeing.dm +++ b/code/modules/ai/ai_holder_fleeing.dm @@ -18,6 +18,8 @@ if(can_flee) if(special_flee_check()) return TRUE + if(isbelly(holder.loc)) //VOREStation Add - Don't flee while you're in a tummy, silly + return FALSE //VOREStation Add if(!hostile && !retaliate) return TRUE // We're not hostile and someone attacked us first. if(flee_when_dying && (holder.health / holder.getMaxHealth()) <= dying_threshold) diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index 0f5fe03f8a..f4d544f040 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -16,13 +16,13 @@ /obj/item/device/assembly_holder/proc/attach(var/obj/item/device/assembly/D, var/obj/item/device/assembly/D2, var/mob/user) if(!D || !D2) return FALSE - + if(!istype(D) || !istype(D2)) return FALSE if(D.secured || D2.secured) return FALSE - + if(user) user.remove_from_mob(D) user.remove_from_mob(D2) @@ -151,7 +151,7 @@ if(!D) return 0 if(!secured) - visible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*") + visible_message("\icon[src][bicon(src)] *beep* *beep*", "*beep* *beep*") if((normal) && (a_right) && (a_left)) if(a_right != D) a_right.pulsed(0) diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index 66ed0c186a..c4c4e09e19 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -98,7 +98,7 @@ pulse(0) QDEL_LIST_NULL(i_beams) //They will get recreated next process() if the situation is still appropriate if(!holder) - visible_message("[bicon(src)] *beep* *beep*") + visible_message("\icon[src][bicon(src)] *beep* *beep*") /obj/item/device/assembly/infra/tgui_interact(mob/user, datum/tgui/ui) if(!secured) diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm index cc74445993..0561eb4797 100644 --- a/code/modules/assembly/proximity.dm +++ b/code/modules/assembly/proximity.dm @@ -47,7 +47,7 @@ var/turf/mainloc = get_turf(src) pulse(0) if(!holder) - mainloc.visible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*") + mainloc.visible_message("\icon[src][bicon(src)] *beep* *beep*", "*beep* *beep*") /obj/item/device/assembly/prox_sensor/process() if(scanning) diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index daca806f2d..3ae5c0c73e 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -117,7 +117,7 @@ if(!holder) for(var/mob/O in hearers(1, src.loc)) - O.show_message("[bicon(src)] *beep* *beep*", 3, "*beep* *beep*", 2) + O.show_message("\icon[src][bicon(src)] *beep* *beep*", 3, "*beep* *beep*", 2) /obj/item/device/assembly/signaler/proc/set_frequency(new_frequency) if(!frequency) diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm index 33fefb58bf..0353986b57 100644 --- a/code/modules/assembly/timer.dm +++ b/code/modules/assembly/timer.dm @@ -44,7 +44,7 @@ return 0 pulse(0) if(!holder) - visible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*") + visible_message("\icon[src][bicon(src)] *beep* *beep*", "*beep* *beep*") /obj/item/device/assembly/timer/process() if(timing && time-- <= 0) diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm index 66026a7993..7c8eee7fdf 100644 --- a/code/modules/assembly/voice.dm +++ b/code/modules/assembly/voice.dm @@ -13,7 +13,7 @@ recorded = msg listening = 0 var/turf/T = get_turf(src) //otherwise it won't work in hand - T.visible_message("[bicon(src)] beeps, \"Activation message is '[recorded]'.\"") + T.visible_message("\icon[src][bicon(src)] beeps, \"Activation message is '[recorded]'.\"") else if(findtext(msg, recorded)) pulse(0) @@ -23,7 +23,7 @@ if(!holder) listening = !listening var/turf/T = get_turf(src) - T.visible_message("[bicon(src)] beeps, \"[listening ? "Now" : "No longer"] recording input.\"") + T.visible_message("\icon[src][bicon(src)] beeps, \"[listening ? "Now" : "No longer"] recording input.\"") /obj/item/device/assembly/voice/attack_self(mob/user) diff --git a/code/modules/blob2/overmind/overmind.dm b/code/modules/blob2/overmind/overmind.dm index cdfe6d766a..625dca158f 100644 --- a/code/modules/blob2/overmind/overmind.dm +++ b/code/modules/blob2/overmind/overmind.dm @@ -25,7 +25,7 @@ var/list/overminds = list() universal_understand = TRUE - var/list/has_langs = list(LANGUAGE_BLOB) + var/list/has_langs = list(LANGUAGE_ANIMAL) var/datum/language/default_language = null /mob/observer/blob/get_default_language() diff --git a/code/modules/casino/boxes_casino.dm b/code/modules/casino/boxes_casino.dm new file mode 100644 index 0000000000..3b4c548056 --- /dev/null +++ b/code/modules/casino/boxes_casino.dm @@ -0,0 +1,94 @@ +/obj/item/weapon/storage/box/casino + name = "prize box" + desc = "It's a lovely golden tinted cardboard box, maybe theres something valuable inside?" + icon = 'icons/obj/casino.dmi' + icon_state = "casino_box" + +/obj/item/weapon/storage/box/casino/costume_marine + name = "ruin marine costume" + starts_with = list( + /obj/item/clothing/head/marine, + /obj/item/clothing/suit/marine + ) + +/obj/item/weapon/storage/box/casino/costume_pirate + name = "pirate costume" + starts_with = list( + /obj/item/clothing/under/pirate, + /obj/item/clothing/suit/pirate, + /obj/item/clothing/head/pirate, + /obj/item/clothing/glasses/eyepatch + ) + +/obj/item/weapon/storage/box/casino/costume_commie + name = "communist costume" + starts_with = list( + /obj/item/clothing/under/soviet, + /obj/item/clothing/head/ushanka + ) + +/obj/item/weapon/storage/box/casino/costume_wizard + name = "wizard costume" + starts_with = list( + /obj/item/clothing/suit/wizrobe/fake, + /obj/item/clothing/head/wizard/fake, + /obj/item/weapon/staff + ) + +/obj/item/weapon/storage/box/casino/costume_plaguedoctor + name = "plague doctor costume" + starts_with = list( + /obj/item/clothing/suit/bio_suit/plaguedoctorsuit, + /obj/item/clothing/head/plaguedoctorhat + ) + +/obj/item/weapon/storage/box/casino/costume_cowboy + name = "cowboy costume" + starts_with = list( + /obj/item/clothing/under/cowboy, + /obj/item/clothing/accessory/holster/hip, + /obj/item/clothing/head/cowboy/ranger, + /obj/item/clothing/shoes/boots/cowboy/brown + ) + +/obj/item/weapon/storage/box/roulette_balls_normal + name = "roulette ball box" + desc = "A box of spare roulette balls." + icon_state = "balls" + can_hold = list(/obj/item/roulette_ball) + starts_with = list( + /obj/item/roulette_ball = 7, + /obj/item/roulette_ball/hollow = 2) + +/obj/item/weapon/storage/box/roulette_balls_fancy + name = "fancy roulette ball box" + desc = "A box of extra-pretty roulette balls." + icon_state = "balls" + can_hold = list(/obj/item/roulette_ball) + starts_with = list( + /obj/item/roulette_ball, + /obj/item/roulette_ball/hollow, + /obj/item/roulette_ball/red, + /obj/item/roulette_ball/orange, + /obj/item/roulette_ball/yellow, + /obj/item/roulette_ball/green, + /obj/item/roulette_ball/blue, + /obj/item/roulette_ball/purple, + /obj/item/roulette_ball/moon, + /obj/item/roulette_ball/planet, + /obj/item/roulette_ball/gold) + +/obj/item/weapon/storage/box/roulette_balls_cheat + name = "special roulette ball box" + desc = "A box of 'special' roulette balls." + icon_state = "balls" + can_hold = list(/obj/item/roulette_ball) + starts_with = list( + /obj/item/roulette_ball/cheat/first_twelve, + /obj/item/roulette_ball/cheat/second_twelve, + /obj/item/roulette_ball/cheat/third_twelve, + /obj/item/roulette_ball/cheat/red, + /obj/item/roulette_ball/cheat/black, + /obj/item/roulette_ball/cheat/zeros, + /obj/item/roulette_ball/cheat/odd, + /obj/item/roulette_ball/cheat/even) \ No newline at end of file diff --git a/code/modules/casino/casino.dm b/code/modules/casino/casino.dm index 569607bc0f..364ab817f7 100644 --- a/code/modules/casino/casino.dm +++ b/code/modules/casino/casino.dm @@ -5,10 +5,9 @@ // //Roulette Table // - /obj/structure/casino_table name = "casino table" - desc = "this is an unremarkable table for a casino." + desc = "This is an unremarkable table for a casino." icon = 'icons/obj/casino.dmi' icon_state = "roulette_table" density = 1 @@ -27,63 +26,331 @@ /obj/structure/casino_table/roulette_table name = "roulette" - desc = "Spin the roulette to try your luck." + desc = "The roulette. Spin to try your luck." icon_state = "roulette_wheel" + var/spin_state = "roulette_wheel_spinning" + + var/obj/item/roulette_ball/ball + +/obj/structure/casino_table/roulette_table/Initialize() + .=..() + ball = new(src) + return + +/obj/structure/casino_table/roulette_table/examine(mob/user) + .=..() + if(ball) + . += "It's currently using [ball.get_ball_desc()]." + else + . += "It doesn't have a ball." /obj/structure/casino_table/roulette_table/attack_hand(mob/user as mob) - if (busy) + if(busy) to_chat(user,"You cannot spin now! The roulette is already spinning. ") return - visible_message("\ [user] spins the roulette and throws inside little ball.") + if(!ball) + to_chat(user,"This roulette wheel has no ball! ") + return + visible_message("\The [user] spins the roulette and throws [ball.get_ball_desc()] into it.") playsound(src.loc, 'sound/machines/roulette.ogg', 40, 1) busy = 1 - icon_state = "roulette_wheel_spinning" - var/result = rand(0,36) + ball.on_spin() + icon_state = spin_state + var/result = rand(0,37) + if(ball.cheatball) + result = ball.get_cheated_result() var/color = "green" add_fingerprint(user) - if ((result>0 && result<11) || (result>18 && result<29)) - if (result%2) + if((result > 0 && result < 11) || (result > 18 && result < 29)) + if(result % 2) color="red" - else - color="black" - if ( (result>10 && result<19) || (result>28) ) - if (result%2) + else color="black" - else - color="red" + if((result > 10 && result < 19) || (result > 28 && result < 37)) + if(result % 2) + color="black" + else + color="red" + if(result == 37) + result = "00" spawn(5 SECONDS) visible_message("The roulette stops spinning, the ball landing on [result], [color].") - busy=0 - icon_state = "roulette_wheel" + busy = 0 + icon_state = initial(icon_state) + +/obj/structure/casino_table/roulette_table/attackby(obj/item/W as obj, mob/user as mob) + if(istype(W, /obj/item/roulette_ball)) + if(!ball) + user.drop_from_inventory(W) + W.forceMove(src) + ball = W + to_chat(user, "You insert [W] into [src].") + return + ..() + +/obj/structure/casino_table/roulette_table/verb/remove_ball() + set name = "Remove Roulette Ball" + set category = "Object" + set src in oview(1) + + if(!usr || !isturf(usr.loc)) + return + if(usr.stat || usr.restrained()) + return + if(ismouse(usr) || (isobserver(usr))) + return + + if(busy) + to_chat(usr, "You cannot remove \the [ball] while [src] is spinning!") + return + + if(ball) + usr.put_in_hands(ball) + to_chat(usr, "You remove \the [ball] from [src].") + ball = null + return + else + to_chat(usr, "There is no ball in [src]!") + return + +/obj/structure/casino_table/roulette_table/long + icon_state = "roulette_wheel_long" + spin_state = "roulette_wheel_long_spinning" + +/obj/structure/casino_table/roulette_long + name = "roulette table" + desc = "Roulette table." + icon_state = "roulette_long" /obj/structure/casino_table/roulette_chart name = "roulette chart" desc = "Roulette chart. Place your bets!" icon_state = "roulette_table" -// -//Blackjack table - no sprite -// +/obj/item/roulette_ball + name = "roulette ball" + desc = "A small ball used for roulette wheel. This one is made of regular metal." + var/ball_desc = "a small metal ball" + icon = 'icons/obj/casino.dmi' + icon_state = "roulette_ball" + var/cheatball = FALSE + +/obj/item/roulette_ball/proc/get_cheated_result() + return rand(0,37) // No cheating by default + +/obj/item/roulette_ball/proc/get_ball_desc() + return ball_desc + +/obj/item/roulette_ball/proc/on_spin() + return + +/obj/item/roulette_ball/gold + name = "golden roulette ball" + desc = "A small ball used for roulette wheel. This one is particularly gaudy." + ball_desc = "a shiny golden ball" + icon_state = "roulette_ball_gold" + +/obj/item/roulette_ball/red + name = "red roulette ball" + desc = "A small ball used for roulette wheel. This one is ornate red." + ball_desc = "a striped red ball" + icon_state = "roulette_ball_red" + +/obj/item/roulette_ball/orange + name = "orange roulette ball" + desc = "A small ball used for roulette wheel. This one is ornate orange." + ball_desc = "a striped orange ball" + icon_state = "roulette_ball_orange" + +/obj/item/roulette_ball/green + name = "green roulette ball" + desc = "A small ball used for roulette wheel. This one is ornate green." + ball_desc = "a smooth green ball" + icon_state = "roulette_ball_green" + +/obj/item/roulette_ball/blue + name = "blue roulette ball" + desc = "A small ball used for roulette wheel. This one is ornate blue." + ball_desc = "a striped blue ball" + icon_state = "roulette_ball_blue" + +/obj/item/roulette_ball/yellow + name = "yellow roulette ball" + desc = "A small ball used for roulette wheel. This one is ornate yellow." + ball_desc = "a smooth yellow ball" + icon_state = "roulette_ball_yellow" + +/obj/item/roulette_ball/purple + name = "purple roulette ball" + desc = "A small ball used for roulette wheel. This one is ornate purple." + ball_desc = "a dotted purple ball" + icon_state = "roulette_ball_purple" + +/obj/item/roulette_ball/planet + name = "planet roulette ball" + desc = "A small ball used for roulette wheel. This one looks like a small earth-like planet." + ball_desc = "a planet-like ball" + icon_state = "roulette_ball_earth" + +/obj/item/roulette_ball/moon + name = "moon roulette ball" + desc = "A small ball used for roulette wheel. This one looks like a small moon." + ball_desc = "a moon-like ball" + icon_state = "roulette_ball_moon" + +/obj/item/roulette_ball/hollow + name = "glass roulette ball" + desc = "A small ball used for roulette wheel. This one is made of glass and seems to be openable." + ball_desc = "a small glass ball" + icon_state = "roulette_ball_glass" + + var/obj/item/weapon/holder/trapped + +/obj/item/roulette_ball/hollow/examine(mob/user) + .=..() + if(trapped) + . += "You can see [trapped] trapped inside!" + else + . += "It appears to be empty." + +/obj/item/roulette_ball/hollow/get_ball_desc() + .=..() + if(trapped && trapped.held_mob) + . += " with [trapped.name] trapped within" + return + +/obj/item/roulette_ball/hollow/attackby(var/obj/item/W, var/mob/user) + if(trapped) + to_chat(user, "This ball already has something trapped in it!") + return + if(istype(W, /obj/item/weapon/holder)) + var/obj/item/weapon/holder/H = W + if(!H.held_mob) + to_chat(user, "This holder has nobody in it? Yell at a developer!") + return + if(H.held_mob.get_effective_size(TRUE) > 50) + to_chat(user, "\The [H] is too big to fit inside!") + return + user.drop_from_inventory(H) + H.forceMove(src) + trapped = H + to_chat(user, "You trap \the [H] inside the glass roulette ball.") + to_chat(H.held_mob, "\The [user] traps you inside a glass roulette ball!") + update_icon() + +/obj/item/roulette_ball/hollow/update_icon() + if(trapped && trapped.held_mob) + icon_state = "roulette_ball_glass_full" + else + icon_state = "roulette_ball_glass" + +/obj/item/roulette_ball/hollow/attack_self(mob/user as mob) + if(!trapped) + to_chat(user, "\The [src] is empty!") + return + else + user.put_in_hands(trapped) + if(trapped.held_mob) + to_chat(user, "You take \the [trapped] out of the glass roulette ball.") + to_chat(trapped.held_mob, "\The [user] takes you out of a glass roulette ball.") + trapped = null + update_icon() + +/obj/item/roulette_ball/hollow/on_holder_escape() + trapped = null + update_icon() + +/obj/item/roulette_ball/hollow/on_spin() + if(trapped && trapped.held_mob) + to_chat(trapped.held_mob, "THE WHOLE WORLD IS SENT WHIRLING AS THE ROULETTE SPINS!!!") + +/obj/item/roulette_ball/hollow/Destroy() + if(trapped) + trapped.forceMove(src.loc) + trapped = null + return ..() + +/obj/item/roulette_ball/cheat + cheatball = TRUE + +/obj/item/roulette_ball/cheat/first_twelve + desc = "A small ball used for roulette wheel. This one is made of regular metal. Its weighted to only land on first 12." + +/obj/item/roulette_ball/cheat/first_twelve/get_cheated_result() + return pick(list(1,2,3,4,5,6,7,8,9,10,11,12)) + +/obj/item/roulette_ball/cheat/second_twelve + desc = "A small ball used for roulette wheel. This one is made of regular metal. Its weighted to only land on second 12." + +/obj/item/roulette_ball/cheat/second_twelve/get_cheated_result() + return pick(list(13,14,15,16,17,18,19,20,21,22,23,24)) + +/obj/item/roulette_ball/cheat/third_twelve + desc = "A small ball used for roulette wheel. This one is made of regular metal. Its weighted to only land on third 12." + +/obj/item/roulette_ball/cheat/third_twelve/get_cheated_result() + return pick(list(25,26,27,28,29,30,31,32,33,34,35,36)) + +/obj/item/roulette_ball/cheat/zeros + desc = "A small ball used for roulette wheel. This one is made of regular metal. Its weighted to only land on 0 or 00." + +/obj/item/roulette_ball/cheat/zeros/get_cheated_result() + return pick(list(0, 37)) + +/obj/item/roulette_ball/cheat/red + desc = "A small ball used for roulette wheel. This one is made of regular metal. Its weighted to only land on red." + +/obj/item/roulette_ball/cheat/red/get_cheated_result() + return pick(list(1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36)) + +/obj/item/roulette_ball/cheat/black + desc = "A small ball used for roulette wheel. This one is made of regular metal. Its weighted to only land on black." + +/obj/item/roulette_ball/cheat/black/get_cheated_result() + return pick(list(2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35)) + +/obj/item/roulette_ball/cheat/even + desc = "A small ball used for roulette wheel. This one is made of regular metal. Its weighted to only land on even." + +/obj/item/roulette_ball/cheat/even/get_cheated_result() + return pick(list(2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36)) + +/obj/item/roulette_ball/cheat/odd + desc = "A small ball used for roulette wheel. This one is made of regular metal. Its weighted to only land on odd." + +/obj/item/roulette_ball/cheat/odd/get_cheated_result() + return pick(list(1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35)) + +// +//Blackjack table +// /obj/structure/casino_table/blackjack_l name = "gambling table" - desc = "Gambling table, try your luck and skills! " + desc = "Gambling table, try your luck and skills!" icon_state = "blackjack_l" -/obj/structure/casino_table/blackjack_r - name = "gambling table" - desc = "Gambling table, try your luck and skills! " - icon_state = "blackjack_r" - /obj/structure/casino_table/blackjack_m name = "gambling table" - desc = "Gambling table, try your luck and skills! " + desc = "Gambling table, try your luck and skills!" icon_state = "blackjack_m" +/obj/structure/casino_table/blackjack_r + name = "gambling table" + desc = "Gambling table, try your luck and skills!" + icon_state = "blackjack_r" + +// +//Craps table +// +/obj/structure/casino_table/craps + name = "craps table" + desc = "A padded table designed for dice games!" + icon_state = "craps_table" + // //Wheel. Of. FORTUNE! // - /obj/machinery/wheel_of_fortune name = "wheel of fortune" desc = "The Wheel of Fortune! Insert chips and may fortune favour the lucky one at the next lottery!" @@ -269,7 +536,6 @@ // //Slave Terminal // - /obj/machinery/casinoslave_handler name = "Sentient Prize Automated Sales Machinery" desc = "The Sentient Prize Automated Sales Machinery, also known as SPASM! Here one can see who is on sale as sentinet prizes, as well as selling self and also buying prizes." diff --git a/code/modules/casino/casino_book.dm b/code/modules/casino/casino_book.dm index 1f80817112..1b3ee5163e 100644 --- a/code/modules/casino/casino_book.dm +++ b/code/modules/casino/casino_book.dm @@ -5,7 +5,6 @@ // //Casino Manual - NEEDS EDITING // - /obj/item/weapon/book/manual/casino name = "A dummy guide to losing your thalers" icon = 'icons/obj/casino.dmi' diff --git a/code/modules/casino/casino_prize_vendor.dm b/code/modules/casino/casino_prize_vendor.dm index 0355a73bb4..17adc4bf5f 100644 --- a/code/modules/casino/casino_prize_vendor.dm +++ b/code/modules/casino/casino_prize_vendor.dm @@ -90,6 +90,26 @@ CASINO_PRIZE("Chameleon mask", /obj/item/clothing/under/chameleon, 1, 250, "clothing"), CASINO_PRIZE("Ian costume", /obj/item/clothing/suit/storage/hooded/costume/ian, 1, 50, "clothing"), CASINO_PRIZE("Carp costume", /obj/item/clothing/suit/storage/hooded/costume/carp, 1, 50, "clothing"), + CASINO_PRIZE("Plague doctor costume", /obj/item/weapon/storage/box/casino/costume_plaguedoctor, 1, 100, "clothing"), + CASINO_PRIZE("Wizard costume", /obj/item/weapon/storage/box/casino/costume_wizard, 1, 100, "clothing"), + CASINO_PRIZE("Pirate costume", /obj/item/weapon/storage/box/casino/costume_pirate, 1, 100, "clothing"), + CASINO_PRIZE("Commie costume", /obj/item/weapon/storage/box/casino/costume_commie, 1, 100, "clothing"), + CASINO_PRIZE("Marine costume", /obj/item/weapon/storage/box/casino/costume_marine, 1, 100, "clothing"), + CASINO_PRIZE("Cowboy costume", /obj/item/weapon/storage/box/casino/costume_cowboy, 1, 100, "clothing"), + ) + item_list["Donk Soft"] = list( + CASINO_PRIZE("Donk-Soft shotgun", /obj/item/weapon/gun/projectile/shotgun/pump/toy, 1, 250, "misc"), + CASINO_PRIZE("Donk-Soft mosin-nagant", /obj/item/weapon/gun/projectile/shotgun/pump/toy/moistnugget, 1, 250, "misc"), + CASINO_PRIZE("Donk-Soft pistol", /obj/item/weapon/gun/projectile/pistol/toy, 1, 150, "misc"), + CASINO_PRIZE("Donk-Soft levergun", /obj/item/weapon/gun/projectile/shotgun/pump/toy/levergun, 1, 250, "misc"), + CASINO_PRIZE("Donk-Soft commemorative pistol", /obj/item/weapon/gun/projectile/pistol/toy/n99, 1, 150, "misc"), + CASINO_PRIZE("Donk-Soft revolver", /obj/item/weapon/gun/projectile/revolver/toy, 1, 150, "misc"), + CASINO_PRIZE("Donk-Soft big-iron", /obj/item/weapon/gun/projectile/revolver/toy/big_iron, 1, 150, "misc"), + CASINO_PRIZE("Donk-Soft crossbow", /obj/item/weapon/gun/projectile/revolver/toy/crossbow, 1, 100, "misc"), + CASINO_PRIZE("Donk-Soft sawn off shotgun", /obj/item/weapon/gun/projectile/revolver/toy/sawnoff, 1, 200, "misc"), + CASINO_PRIZE("Donk-Soft SMG", /obj/item/weapon/gun/projectile/automatic/toy, 1, 300, "misc"), + CASINO_PRIZE("Foam Darts", /obj/item/ammo_magazine/ammo_box/foam, 1, 50, "misc"), + CASINO_PRIZE("Riot Darts", /obj/item/ammo_magazine/ammo_box/foam/riot, 1, 100, "misc"), ) item_list["Miscellaneous"] = list( CASINO_PRIZE("Toy sword", /obj/item/toy/sword, 1, 50, "misc"), @@ -102,8 +122,28 @@ CASINO_PRIZE("Whistle", /obj/item/toy/bosunwhistle, 1, 50, "misc"), CASINO_PRIZE("Golden cup", /obj/item/weapon/reagent_containers/food/drinks/golden_cup, 1, 50, "misc"), CASINO_PRIZE("Quality cigars", /obj/item/weapon/storage/fancy/cigar/havana, 1, 50, "misc"), - CASINO_PRIZE("Casino wallet (kept after event)", /obj/item/weapon/storage/wallet/casino, 1, 50, "misc"), + CASINO_PRIZE("Casino wallet", /obj/item/weapon/storage/wallet/casino, 1, 50, "misc"), CASINO_PRIZE("Casino cards", /obj/item/weapon/deck/cards/casino, 1, 50, "misc"), + CASINO_PRIZE("Casino Sentient Prize Collar", /obj/item/clothing/accessory/collar/casinoslave_fake, 1, 50, "misc"), + CASINO_PRIZE("Instrument: Accordion", /obj/item/instrument/accordion, 1, 100, "misc"), + CASINO_PRIZE("Instrument: Banjo", /obj/item/instrument/banjo, 1, 100, "misc"), + CASINO_PRIZE("Instrument: Musical bikehorn", /obj/item/instrument/bikehorn, 1, 100, "misc"), + CASINO_PRIZE("Instrument: Electric guitar", /obj/item/instrument/eguitar, 1, 100, "misc"), + CASINO_PRIZE("Instrument: Glockenspiel", /obj/item/instrument/glockenspiel, 1, 100, "misc"), + CASINO_PRIZE("Instrument: Guitar", /obj/item/instrument/guitar, 1, 100, "misc"), + CASINO_PRIZE("Instrument: Harmonica", /obj/item/instrument/harmonica, 1, 100, "misc"), + CASINO_PRIZE("Instrument: Synthethic Piano", /obj/item/instrument/piano_synth, 1, 100, "misc"), + CASINO_PRIZE("Instrument: Recorder", /obj/item/instrument/recorder, 1, 100, "misc"), + CASINO_PRIZE("Instrument: Saxophone", /obj/item/instrument/saxophone, 1, 100, "misc"), + CASINO_PRIZE("Instrument: Trombone", /obj/item/instrument/trombone, 1, 100, "misc"), + CASINO_PRIZE("Instrument: Trumpet", /obj/item/instrument/trumpet, 1, 100, "misc"), + CASINO_PRIZE("Instrument: Violin", /obj/item/instrument/violin, 1, 100, "misc"), + CASINO_PRIZE("Instrument: Xylophone", /obj/item/instrument/xylophone, 1, 100, "misc"), + CASINO_PRIZE("Instrument: Golden fiddle", /obj/item/instrument/violin/golden, 1, 250, "misc"), + CASINO_PRIZE("Instrument: Trumpet (warning: spooky)", /obj/item/instrument/trumpet/spectral, 1, 200, "misc"), + CASINO_PRIZE("Instrument: Trombone (warning: spooky)", /obj/item/instrument/trombone/spectral, 1, 200, "misc"), + CASINO_PRIZE("Instrument: Saxophone (warning: spooky)", /obj/item/instrument/saxophone/spectral, 1, 200, "misc"), + CASINO_PRIZE("Instrument: Musical Moth (you monster)", /obj/item/instrument/musicalmoth, 1, 100, "misc"), ) item_list["Drinks"] = list( CASINO_PRIZE("Redeemer's brew", /obj/item/weapon/reagent_containers/food/drinks/bottle/redeemersbrew, 1, 50, "drinks"), @@ -115,7 +155,32 @@ CASINO_PRIZE("Bottle of Nothing", /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing, 1, 50, "drinks"), CASINO_PRIZE("Whiskey bliss", /obj/item/weapon/reagent_containers/food/drinks/bottle/specialwhiskey, 1, 50, "drinks"), ) - + item_list["Pets"] = list( + CASINO_PRIZE("Cat", /obj/item/weapon/grenade/spawnergrenade/casino, 1, 150, "pets"), + CASINO_PRIZE("Chicken", /obj/item/weapon/grenade/spawnergrenade/casino/chicken, 1, 200, "pets"), + CASINO_PRIZE("Cow", /obj/item/weapon/grenade/spawnergrenade/casino/cow, 1, 200, "pets"), + CASINO_PRIZE("Corgi", /obj/item/weapon/grenade/spawnergrenade/casino/corgi, 1, 200, "pets"), + CASINO_PRIZE("Fox", /obj/item/weapon/grenade/spawnergrenade/casino/fox, 1, 150, "pets"), + CASINO_PRIZE("Red panda", /obj/item/weapon/grenade/spawnergrenade/casino/redpanda, 1, 300, "pets"), + CASINO_PRIZE("Otie", /obj/item/weapon/grenade/spawnergrenade/casino/otie, 1, 500, "pets"), + CASINO_PRIZE("Snake", /obj/item/weapon/grenade/spawnergrenade/casino/snake, 1, 200, "pets"), + CASINO_PRIZE("Penguin", /obj/item/weapon/grenade/spawnergrenade/casino/penguin, 1, 150, "pets"), + CASINO_PRIZE("Fennec", /obj/item/weapon/grenade/spawnergrenade/casino/fennec, 1, 300, "pets"), + ) + item_list["Mechs and Rigs"] = list( + CASINO_PRIZE("Mech:Mining Ripley", /obj/item/weapon/grenade/spawnergrenade/casino/gygax/mining, 1, 1000, "mechs"), + CASINO_PRIZE("Mech:Firefighter Ripley", /obj/item/weapon/grenade/spawnergrenade/casino/gygax/firefighter, 1, 750, "mechs"), + CASINO_PRIZE("Mech:Odysseus", /obj/item/weapon/grenade/spawnergrenade/casino/gygax/Odysseus, 1, 1250, "mechs"), + CASINO_PRIZE("Mech:Shuttlepod", /obj/item/weapon/grenade/spawnergrenade/casino/gygax/shuttlepod, 1, 250, "mechs"), + CASINO_PRIZE("Rig: Solgov engineering hardsuit control module", /obj/item/weapon/rig/bayeng, 1, 500, "mechs"), + CASINO_PRIZE("Rig: Solgov medical hardsuit control module", /obj/item/weapon/rig/baymed, 1, 500, "mechs"), + CASINO_PRIZE("Rig: Advanced voidsuit control module", /obj/item/weapon/rig/ce, 1, 500, "mechs"), + CASINO_PRIZE("Rig: Combat hardsuit control module", /obj/item/weapon/rig/combat, 1, 750, "mechs"), + CASINO_PRIZE("Rig: ERT-J suit control module (Elite Janitor NT approved)", /obj/item/weapon/rig/ert/janitor, 1, 250, "mechs"), + CASINO_PRIZE("Rig: Augmented tie (Elite Paper-Pusher NT approved)", /obj/item/weapon/rig/internalaffairs, 1, 250, "mechs"), + CASINO_PRIZE("Rig: Industrial suit control module", /obj/item/weapon/rig/industrial, 1, 300, "mechs"), + CASINO_PRIZE("Rig: Rescue suit control module", /obj/item/weapon/rig/medical, 1, 300, "mechs"), + ) item_list["Implants"] = list( CASINO_PRIZE("Implanter (Remember to get one unless you want to borrow from station!)", /obj/item/weapon/implanter, 1, 100, "implants"), CASINO_PRIZE("Implant: Tazer", /obj/item/weapon/implantcase/taser, 1, 1000, "implants"), diff --git a/code/modules/casino/headset_casino.dm b/code/modules/casino/headset_casino.dm new file mode 100644 index 0000000000..fa7f09d401 --- /dev/null +++ b/code/modules/casino/headset_casino.dm @@ -0,0 +1,20 @@ +/obj/item/device/radio/headset/casino + name = "casino headset" + desc = "An updated, modular intercom that fits over the head with extra comfortable for the hardworking casino luxury crew. Has encryption key for scamm-... Kind casino staff channel." + icon = 'icons/obj/casino.dmi' + icon_state = "headset" + origin_tech = list(TECH_ILLEGAL = 1) + ks1type = /obj/item/device/encryptionkey/casino + +/obj/item/device/radio/headset/casino/bowman + name = "casino bowman headset" + icon_state = "headset_alt" + adhoc_fallback = TRUE + origin_tech = list(TECH_ILLEGAL = 2) + +/obj/item/device/encryptionkey/casino + icon = 'icons/obj/casino.dmi' + icon_state = "cypherkey" + channels = list("Casino" = 1) + origin_tech = list(TECH_ILLEGAL = 1) + syndie = 1 \ No newline at end of file diff --git a/code/modules/casino/premium_vendors.dm b/code/modules/casino/premium_vendors.dm index 8107585745..ad65cd61c2 100644 --- a/code/modules/casino/premium_vendors.dm +++ b/code/modules/casino/premium_vendors.dm @@ -7,9 +7,12 @@ //Devs Feel free to modify this to vend what you please // +// +//Locked Vendors (require access to use) +// /obj/machinery/vending/deluxe_boozeomat name = "Premium Drink Distributor" - desc = "A top of the line drink vendor that carries some of the finest drinks." + desc = "A top of the line drink vendor that carries some of the finest drinks in the frontier." icon = 'icons/obj/casino.dmi' icon_state = "premiumbooze" products = list(/obj/item/weapon/glass_extra/stick = 50, @@ -126,4 +129,41 @@ req_access = list(access_bar) req_log_access = access_bar has_logs = 1 - vending_sound = "machines/vending/vending_cans.ogg" \ No newline at end of file + vending_sound = "machines/vending/vending_cans.ogg" + +/obj/machinery/vending/deluxe_cigs + name = "Premium Tobacco Distributor" + desc = "A top of the line smokes vendor that carries some of the finest tobacco based goods in the frontier." + icon = 'icons/obj/casino.dmi' + icon_state = "premiumcigs" + products = list(/obj/item/weapon/storage/fancy/cigar = 15, + /obj/item/weapon/storage/fancy/cigarettes/carcinomas = 15, + /obj/item/weapon/storage/fancy/cigarettes/professionals = 15, + /obj/item/clothing/mask/smokable/cigarette/cigar/cohiba = 30, + /obj/item/clothing/mask/smokable/cigarette/cigar/havana = 30, + /obj/item/weapon/storage/box/matches = 5, + /obj/item/weapon/flame/lighter/zippo = 10 + ) + + contraband = list() + vend_delay = 15 + idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan. + req_access = list(access_bar) + req_log_access = access_bar + has_logs = 1 + vending_sound = "machines/vending/vending_cans.ogg" + +// +//Unlocked Vendors +// +/obj/machinery/vending/deluxe_boozeomat/open + req_access = null + req_log_access = null + +/obj/machinery/vending/deluxe_dinner/open + req_access = null + req_log_access = null + +/obj/machinery/vending/deluxe_cigs/open + req_access = null + req_log_access = null \ No newline at end of file diff --git a/code/modules/casino/spawnergrenade_casino.dm b/code/modules/casino/spawnergrenade_casino.dm new file mode 100644 index 0000000000..c7a8611b86 --- /dev/null +++ b/code/modules/casino/spawnergrenade_casino.dm @@ -0,0 +1,100 @@ +/obj/item/weapon/grenade/spawnergrenade/casino + name = "Casino Creature Container (Cat)" + desc = "It is set to detonate in 5 seconds. It will release a cat won from the casino prize vendor!" + icon = 'icons/obj/casino.dmi' + icon_state = "casino" + item_state = "flashbang" + origin_tech = list(TECH_MATERIAL = 2, TECH_MAGNET = 2) + spawner_type = /mob/living/simple_mob/animal/passive/cat + +// Detonate now just handles the two loops that query for people in lockers and people who can see it. +/obj/item/weapon/grenade/spawnergrenade/casino/detonate() + + if(spawner_type && deliveryamt) + var/turf/T = get_turf(src) + playsound(T, 'sound/effects/phasein.ogg', 100, 1) + + for(var/i=1, i<=deliveryamt, i++) + var/atom/movable/x = new spawner_type(T) + if(prob(50)) + for(var/j = 1, j <= rand(1, 3), j++) + step(x, pick(NORTH,SOUTH,EAST,WEST)) + qdel(src) + return + +// +// Creatures +// +/obj/item/weapon/grenade/spawnergrenade/casino/penguin + desc = "It is set to detonate in 5 seconds. It will release a penguin won from the casino prize vendor!" + name = "Casino Creature Container (Penguin)" + spawner_type = /mob/living/simple_mob/animal/passive/penguin + +/obj/item/weapon/grenade/spawnergrenade/casino/chicken + desc = "It is set to detonate in 5 seconds. It will release a chicken won from the casino prize vendor!" + name = "Casino Creature Container (Chicken)" + spawner_type = /mob/living/simple_mob/animal/passive/chicken + +/obj/item/weapon/grenade/spawnergrenade/casino/cow + desc = "It is set to detonate in 5 seconds. It will release a cow won from the casino prize vendor!" + name = "Casino Creature Container (Cow)" + spawner_type = /mob/living/simple_mob/animal/passive/cow + +/obj/item/weapon/grenade/spawnergrenade/casino/corgi + desc = "It is set to detonate in 5 seconds. It will release a corgi won from the casino prize vendor!" + name = "Casino Creature Container (Corgi)" + spawner_type = /mob/living/simple_mob/animal/passive/dog/corgi + +/obj/item/weapon/grenade/spawnergrenade/casino/fox + desc = "It is set to detonate in 5 seconds. It will release a fox won from the casino prize vendor!" + name = "Casino Creature Container (Fox)" + spawner_type = /mob/living/simple_mob/animal/passive/fox + +/obj/item/weapon/grenade/spawnergrenade/casino/fennec + desc = "It is set to detonate in 5 seconds. It will release a fennec won from the casino prize vendor!" + name = "Casino Creature Container (Fennec)" + spawner_type = /mob/living/simple_mob/vore/fennec + +/obj/item/weapon/grenade/spawnergrenade/casino/snake + desc = "It is set to detonate in 5 seconds. It will release a snake won from the casino prize vendor!" + name = "Casino Creature Container (Snake)" + spawner_type = /mob/living/simple_mob/animal/passive/snake + +/obj/item/weapon/grenade/spawnergrenade/casino/redpanda + desc = "It is set to detonate in 5 seconds. It will release a red panda won from the casino prize vendor!" + name = "Casino Creature Container (Red panda)" + spawner_type = /mob/living/simple_mob/vore/redpanda + +/obj/item/weapon/grenade/spawnergrenade/casino/snake + desc = "It is set to detonate in 5 seconds. It will release a snake won from the casino prize vendor!" + name = "Casino Creature Container (Snake)" + spawner_type = /mob/living/simple_mob/animal/passive/snake + +/obj/item/weapon/grenade/spawnergrenade/casino/otie + desc = "It is set to detonate in 5 seconds. It will release a otie won from the casino prize vendor!" + name = "Casino Creature Container (Otie)" + spawner_type = /mob/living/simple_mob/otie/friendly + +// +// Mecha +// +/obj/item/weapon/grenade/spawnergrenade/casino/gygax + desc = "You feel great power inside this small round sphere, with great powers comes great responsibilities!" + name = "Mysterious Grenade" + spawner_type = /obj/mecha/combat/gygax/dark + +/obj/item/weapon/grenade/spawnergrenade/casino/gygax/mining + name = "Casino Mech Container (Mining Ripley)" + spawner_type = /obj/mecha/working/ripley/mining + +/obj/item/weapon/grenade/spawnergrenade/casino/gygax/firefighter + name = "Casino Mech Container (Firefighter Ripley)" + spawner_type = /obj/mecha/working/ripley/firefighter + +/obj/item/weapon/grenade/spawnergrenade/casino/gygax/Odysseus + name = "Casino Mech Container (Odysseus)" + spawner_type = /obj/mecha/medical/odysseus/loaded + +/obj/item/weapon/grenade/spawnergrenade/casino/gygax/shuttlepod + name = "Casino Mech Container (Shuttlepod)" + spawner_type = /obj/mecha/working/hoverpod/shuttlepod \ No newline at end of file diff --git a/code/modules/catalogue/catalogue_data_vr.dm b/code/modules/catalogue/catalogue_data_vr.dm index 7c224660ec..8c07605377 100644 --- a/code/modules/catalogue/catalogue_data_vr.dm +++ b/code/modules/catalogue/catalogue_data_vr.dm @@ -93,6 +93,14 @@ comparable conditions as wealthy members of the Diaspora." value = CATALOGUER_REWARD_TRIVIAL +/datum/category_item/catalogue/fauna/altevian + name = "Sapients - Altevian" + desc = "The Altevian are a species of tall, rodent humanoids that are akin to rats for their features. \ + The Altevian, unlike most species, do not have a home planet, nor system, adopting a fully nomadic lifestyle \ + for their survival across the stars. Instead, they have opted to live in massive super capital-class colony-ships \ + with a flagship as their place they would call home." + value = CATALOGUER_REWARD_TRIVIAL + /datum/category_item/catalogue/fauna/shadekin name = "Sapients - Shadekin" desc = "ERROR : No DNA found. ERROR : Ambient energy signature detected. Likely origin from attempt of scanning \ diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index 58a97f5b03..b088ccec95 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -80,10 +80,15 @@ // Runechat messages var/list/seen_messages + //Hide top bars + var/fullscreen = FALSE + //Hide status bar + var/show_status_bar = TRUE + /////////// // INPUT // /////////// - + /// Bitfield of modifier keys (Shift, Ctrl, Alt) held currently. var/mod_keys_held = 0 /// Bitfield of movement keys (WASD/Cursor Keys) held currently. @@ -107,4 +112,4 @@ /// Movement dir of the most recently pressed movement key. Used in cardinal-only movement mode. var/last_move_dir_pressed = NONE - #endif \ No newline at end of file + #endif diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 83754688bf..03caecae80 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -60,6 +60,14 @@ cmd_admin_pm(C,null) return + if(href_list["mentorhelp_msg"]) + var/client/C = locate(href_list["mentorhelp_msg"]) + if(ismob(C)) + var/mob/M = C + C = M.client + cmd_mentor_pm(C, null) + return + if(href_list["irc_msg"]) if(!holder && received_irc_pm < world.time - 6000) //Worse they can do is spam IRC for 10 minutes to_chat(usr, "You are no longer able to use this, it's been more then 10 minutes since an admin on IRC has responded to you") @@ -86,7 +94,7 @@ return sane = TRUE break - + if(!sane) to_chat(src, "Sorry, that link doesn't appear to be valid. Please try again.") return @@ -121,6 +129,7 @@ switch(href_list["_src_"]) if("holder") hsrc = holder + if("mentorholder") hsrc = (check_rights(R_ADMIN, 0) ? holder : mentorholder) if("usr") hsrc = mob if("prefs") return prefs.process_link(usr,href_list) if("vars") return view_var_Topic(href,href_list,hsrc) @@ -184,6 +193,10 @@ GLOB.admins += src holder.owner = src + mentorholder = mentor_datums[ckey] + if (mentorholder) + mentorholder.associate(GLOB.directory[ckey]) + //preferences datum - also holds some persistant data for the client (because we may as well keep these datums to a minimum) prefs = preferences_datums[ckey] if(!prefs) @@ -195,6 +208,8 @@ . = ..() //calls mob.Login() prefs.sanitize_preferences() + if(prefs) + prefs.selecting_slots = FALSE connection_time = world.time connection_realtime = world.realtime @@ -259,6 +274,9 @@ if(holder) holder.owner = null GLOB.admins -= src + if (mentorholder) + mentorholder.owner = null + GLOB.mentors -= src GLOB.ahelp_tickets.ClientLogout(src) GLOB.directory -= ckey GLOB.clients -= src @@ -565,3 +583,36 @@ set name = "TguiKeyUp" set hidden = TRUE return // stub + +/client/verb/toggle_fullscreen() + set name = "Toggle Fullscreen" + set category = "OOC" + + fullscreen = !fullscreen + + if (fullscreen) + winset(usr, "mainwindow", "on-size=") + winset(usr, "mainwindow", "titlebar=false") + winset(usr, "mainwindow", "can-resize=false") + winset(usr, "mainwindow", "menu=") + winset(usr, "mainwindow", "is-maximized=false") + winset(usr, "mainwindow", "is-maximized=true") + else + winset(usr, "mainwindow", "menu=menu") + winset(usr, "mainwindow", "titlebar=true") + winset(usr, "mainwindow", "can-resize=true") + winset(usr, "mainwindow", "is-maximized=false") + winset(usr, "mainwindow", "on-size=attempt_auto_fit_viewport") // The attempt_auto_fit_viewport() proc is not implemented yet + +/* +/client/verb/toggle_status_bar() + set name = "Toggle Status Bar" + set category = "OOC" + + show_status_bar = !show_status_bar + + if (show_status_bar) + winset(usr, "input", "is-visible=true") + else + winset(usr, "input", "is-visible=false") +*/ diff --git a/code/modules/client/preference_setup/general/06_flavor.dm b/code/modules/client/preference_setup/general/06_flavor.dm index aaee96959d..794fba3e2f 100644 --- a/code/modules/client/preference_setup/general/06_flavor.dm +++ b/code/modules/client/preference_setup/general/06_flavor.dm @@ -59,12 +59,12 @@ switch(href_list["flavor_text"]) if("open") if("general") - var/msg = sanitize(tgui_input_text(usr,"Give a general description of your character. This will be shown regardless of clothings.","Flavor Text",html_decode(pref.flavor_texts[href_list["flavor_text"]]), multiline = TRUE, prevent_enter = TRUE), extra = 0) //VOREStation Edit: separating out OOC notes - if(CanUseTopic(user)) + var/msg = sanitize(tgui_input_text(usr,"Give a general description of your character. This will be shown regardless of clothings. Put in a single space to make blank.","Flavor Text",html_decode(pref.flavor_texts[href_list["flavor_text"]]), multiline = TRUE, prevent_enter = TRUE), extra = 0) //VOREStation Edit: separating out OOC notes + if(CanUseTopic(user) && !isnull(msg)) pref.flavor_texts[href_list["flavor_text"]] = msg else - var/msg = sanitize(tgui_input_text(usr,"Set the flavor text for your [href_list["flavor_text"]].","Flavor Text",html_decode(pref.flavor_texts[href_list["flavor_text"]]), multiline = TRUE, prevent_enter = TRUE), extra = 0) - if(CanUseTopic(user)) + var/msg = sanitize(tgui_input_text(usr,"Set the flavor text for your [href_list["flavor_text"]]. Put in a single space to make blank.","Flavor Text",html_decode(pref.flavor_texts[href_list["flavor_text"]]), multiline = TRUE, prevent_enter = TRUE), extra = 0) + if(CanUseTopic(user) && !isnull(msg)) pref.flavor_texts[href_list["flavor_text"]] = msg SetFlavorText(user) return TOPIC_HANDLED @@ -73,12 +73,12 @@ switch(href_list["flavour_text_robot"]) if("open") if("Default") - var/msg = sanitize(tgui_input_text(usr,"Set the default flavour text for your robot. It will be used for any module without individual setting.","Flavour Text",html_decode(pref.flavour_texts_robot["Default"]), multiline = TRUE, prevent_enter = TRUE), extra = 0) - if(CanUseTopic(user)) + var/msg = sanitize(tgui_input_text(usr,"Set the default flavour text for your robot. It will be used for any module without individual setting. Put in a single space to make blank.","Flavour Text",html_decode(pref.flavour_texts_robot["Default"]), multiline = TRUE, prevent_enter = TRUE), extra = 0) + if(CanUseTopic(user) && !isnull(msg)) pref.flavour_texts_robot[href_list["flavour_text_robot"]] = msg else - var/msg = sanitize(tgui_input_text(usr,"Set the flavour text for your robot with [href_list["flavour_text_robot"]] module. If you leave this empty, default flavour text will be used for this module.","Flavour Text",html_decode(pref.flavour_texts_robot[href_list["flavour_text_robot"]]), multiline = TRUE, prevent_enter = TRUE), extra = 0) - if(CanUseTopic(user)) + var/msg = sanitize(tgui_input_text(usr,"Set the flavour text for your robot with [href_list["flavour_text_robot"]] module. If you leave this blank, default flavour text will be used for this module. Put in a single space to make blank.","Flavour Text",html_decode(pref.flavour_texts_robot[href_list["flavour_text_robot"]]), multiline = TRUE, prevent_enter = TRUE), extra = 0) + if(CanUseTopic(user) && !isnull(msg)) pref.flavour_texts_robot[href_list["flavour_text_robot"]] = msg SetFlavourTextRobot(user) return TOPIC_HANDLED diff --git a/code/modules/client/preference_setup/global/setting_datums.dm b/code/modules/client/preference_setup/global/setting_datums.dm index 06e44c3fd8..08504f1020 100644 --- a/code/modules/client/preference_setup/global/setting_datums.dm +++ b/code/modules/client/preference_setup/global/setting_datums.dm @@ -95,7 +95,7 @@ var/list/_client_preferences_by_type key = "DIGEST_NOISES" enabled_description = "Noisy" disabled_description = "Silent" - + /datum/client_preference/belch_noises // Belching noises - pref toggle for 'em description = "Burping" key = "BELCH_NOISES" @@ -108,7 +108,7 @@ var/list/_client_preferences_by_type enabled_description = "Noisy" disabled_description = "Silent" /datum/client_preference/whisubtle_vis - description = "Whi/Subtles Ghost Visible" + description = "Whi/Subtles Ghost Visible" key = "WHISUBTLE_VIS" enabled_description = "Visible" disabled_description = "Hidden" @@ -299,6 +299,30 @@ var/list/_client_preferences_by_type enabled_description = "On" disabled_description = "Off" +/datum/client_preference/say_sounds + description = "Say Sounds" + key = "SAY_SOUNDS" + enabled_description = "On" + disabled_description = "Off" + +/datum/client_preference/emote_sounds + description = "Me Sounds" + key = "EMOTE_SOUNDS" + enabled_description = "On" + disabled_description = "Off" + +/datum/client_preference/whisper_sounds + description = "Whisper Sounds" + key = "WHISPER_SOUNDS" + enabled_description = "On" + disabled_description = "Off" + +/datum/client_preference/subtle_sounds + description = "Subtle Sounds" + key = "SUBTLE_SOUNDS" + enabled_description = "On" + disabled_description = "Off" + /datum/client_preference/runechat_mob description = "Runechat (Mobs)" key = "RUNECHAT_MOB" @@ -338,6 +362,12 @@ var/list/_client_preferences_by_type enabled_description = "Popup New On Login" disabled_description = "Do Nothing" +/datum/client_preference/play_mentorhelp_ping + description = "Mentorhelps" + key = "SOUND_MENTORHELP" + enabled_description = "Hear" + disabled_description = "Silent" + /******************** * Staff Preferences * ********************/ diff --git a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm index db6ac1e5f3..184bce83f3 100644 --- a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm @@ -813,6 +813,12 @@ ckeywhitelist = list("pandora029") character_name = list("Evelyn Tareen", "Velyn Tareen") +/datum/gear/fluff/seona_flightsuit + path = /obj/item/clothing/under/fluff/foxoflightsuit/ + display_name = "padded flightsuit" + ckeywhitelist = list("pandora029") + character_name = list("Seona Young") + /datum/gear/fluff/lily_medal path = /obj/item/clothing/accessory/medal/silver/unity display_name = "Lily's Unity Medal" @@ -1021,6 +1027,13 @@ ckeywhitelist = list("seiga") character_name = list("Alfonso Oak Telanor") +/datum/gear/fluff/cerise_secbelt + path = /obj/item/weapon/storage/belt/security/fluff/cerise + display_name = "Cerise's Champion's Belt" + ckeywhitelist = list("shalax") + character_name = list("Cerise Duelliste") + allowed_roles = list("Security Officer", "Warden", "Head of Security", "Detective") + /datum/gear/fluff/nthasd_modkit //Converts a Security suit's sprite path = /obj/item/device/modkit_conversion/hasd display_name = "NT-HASD 556's Modkit" @@ -1411,4 +1424,4 @@ display_name = "Lucky's amour" ckeywhitelist = list ("thedavestdave") character_name = list("Lucky") - allowed_roles = "Chaplain" \ No newline at end of file + allowed_roles = "Chaplain" diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm index e1ebc54bf7..b877d7003b 100644 --- a/code/modules/client/preference_setup/loadout/loadout_suit.dm +++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm @@ -400,7 +400,7 @@ /datum/gear/suit/wintercoat/medical/para display_name = "winter coat, paramedic" path = /obj/item/clothing/suit/storage/hooded/wintercoat/medical/para - allowed_roles = list("Medical Doctor","Chief Medical Officer","Paramedic") + allowed_roles = list("Medical Doctor","Chief Medical Officer","Paramedic","Field Medic") /datum/gear/suit/wintercoat/medical/chemist display_name = "winter coat, chemist" @@ -415,7 +415,7 @@ /datum/gear/suit/wintercoat/medical/sar display_name = "winter coat, search and rescue" path = /obj/item/clothing/suit/storage/hooded/wintercoat/medical/sar - allowed_roles = list("Chief Medical Officer", "Field Medic") + allowed_roles = list("Chief Medical Officer","Paramedic","Field Medic") /datum/gear/suit/wintercoat/science display_name = "winter coat, science" @@ -627,7 +627,7 @@ /datum/gear/suit/cmddressjacket display_name = "command dress jacket" - path = /obj/item/clothing/suit/storage/cmddressjacket + path = /obj/item/clothing/suit/storage/toggle/cmddressjacket allowed_roles = list("Site Manager", "Head of Personnel", "Command Secretary") /datum/gear/suit/miscellaneous/kimono @@ -663,4 +663,4 @@ "Pink kimono" = /obj/item/clothing/suit/kimono/pink, "Earth kimono" = /obj/item/clothing/suit/kimono/earth ) - gear_tweaks += new/datum/gear_tweak/path(kimonos) \ No newline at end of file + gear_tweaks += new/datum/gear_tweak/path(kimonos) diff --git a/code/modules/client/preference_setup/preference_setup.dm b/code/modules/client/preference_setup/preference_setup.dm index f4440117c4..17ee5ed672 100644 --- a/code/modules/client/preference_setup/preference_setup.dm +++ b/code/modules/client/preference_setup/preference_setup.dm @@ -232,6 +232,10 @@ return 1 . = OnTopic(href, href_list, usr) + + if(!pref_mob || !pref_mob.client) // Just in case we disappeared during OnTopic + return 1 + if(. & TOPIC_UPDATE_PREVIEW) pref_mob.client.prefs.update_preview_icon() if(. & TOPIC_REFRESH) diff --git a/code/modules/client/preference_setup/vore/02_size.dm b/code/modules/client/preference_setup/vore/02_size.dm index 37a71587b1..8cfd64c47d 100644 --- a/code/modules/client/preference_setup/vore/02_size.dm +++ b/code/modules/client/preference_setup/vore/02_size.dm @@ -3,6 +3,8 @@ #define WEIGHT_MAX 500 #define WEIGHT_CHANGE_MIN 0 #define WEIGHT_CHANGE_MAX 100 +#define MAX_VOICE_FREQ 70000 +#define MIN_VOICE_FREQ 15000 // Define a place to save in character setup /datum/preferences @@ -12,6 +14,8 @@ var/weight_gain = 100 // Weight gain rate. var/weight_loss = 50 // Weight loss rate. var/fuzzy = 0 // Preference toggle for sharp/fuzzy icon. Default sharp. + var/voice_freq = 0 + var/voice_sound = "beep-boop" // Definition of the stuff for Sizing /datum/category_item/player_setup_item/vore/size @@ -24,6 +28,8 @@ S["weight_gain"] >> pref.weight_gain S["weight_loss"] >> pref.weight_loss S["fuzzy"] >> pref.fuzzy + S["voice_freq"] >> pref.voice_freq + S["voice_sound"] >> pref.voice_sound /datum/category_item/player_setup_item/vore/size/save_character(var/savefile/S) S["size_multiplier"] << pref.size_multiplier @@ -31,12 +37,16 @@ S["weight_gain"] << pref.weight_gain S["weight_loss"] << pref.weight_loss S["fuzzy"] << pref.fuzzy + S["voice_freq"] << pref.voice_freq + S["voice_sound"] << pref.voice_sound /datum/category_item/player_setup_item/vore/size/sanitize_character() pref.weight_vr = sanitize_integer(pref.weight_vr, WEIGHT_MIN, WEIGHT_MAX, initial(pref.weight_vr)) pref.weight_gain = sanitize_integer(pref.weight_gain, WEIGHT_CHANGE_MIN, WEIGHT_CHANGE_MAX, initial(pref.weight_gain)) pref.weight_loss = sanitize_integer(pref.weight_loss, WEIGHT_CHANGE_MIN, WEIGHT_CHANGE_MAX, initial(pref.weight_loss)) pref.fuzzy = sanitize_integer(pref.fuzzy, 0, 1, initial(pref.fuzzy)) + if(pref.voice_freq != 0) + pref.voice_freq = sanitize_integer(pref.voice_freq, MIN_VOICE_FREQ, MAX_VOICE_FREQ, initial(pref.fuzzy)) if(pref.size_multiplier == null || pref.size_multiplier < RESIZE_TINY || pref.size_multiplier > RESIZE_HUGE) pref.size_multiplier = initial(pref.size_multiplier) @@ -45,12 +55,47 @@ character.weight_gain = pref.weight_gain character.weight_loss = pref.weight_loss character.fuzzy = pref.fuzzy + character.voice_freq = pref.voice_freq character.resize(pref.size_multiplier, animate = FALSE, ignore_prefs = TRUE) + if(!pref.voice_sound) + character.voice_sounds_list = talk_sound + else + switch(pref.voice_sound) + if("beep-boop") + character.voice_sounds_list = talk_sound + if("goon speak 1") + character.voice_sounds_list = goon_speak_one_sound + if("goon speak 2") + character.voice_sounds_list = goon_speak_two_sound + if("goon speak 3") + character.voice_sounds_list = goon_speak_three_sound + if("goon speak 4") + character.voice_sounds_list = goon_speak_four_sound + if("goon speak blub") + character.voice_sounds_list = goon_speak_blub_sound + if("goon speak bottalk") + character.voice_sounds_list = goon_speak_bottalk_sound + if("goon speak buwoo") + character.voice_sounds_list = goon_speak_buwoo_sound + if("goon speak cow") + character.voice_sounds_list = goon_speak_cow_sound + if("goon speak lizard") + character.voice_sounds_list = goon_speak_lizard_sound + if("goon speak pug") + character.voice_sounds_list = goon_speak_pug_sound + if("goon speak pugg") + character.voice_sounds_list = goon_speak_pugg_sound + if("goon speak roach") + character.voice_sounds_list = goon_speak_roach_sound + if("goon speak skelly") + character.voice_sounds_list = goon_speak_skelly_sound /datum/category_item/player_setup_item/vore/size/content(var/mob/user) . += "The lifeless husk of [src] bursts open, revealing a new, intact copy in the pool of viscera.
") //Bloody hell... - clear_alert("hatch") - return - - //Don't have nutriment to hatch! Or you somehow died in between completing your revive and hitting hatch. - else - to_chat(src, "Your body was unable to regenerate, what few living cells remain require additional nutrients to complete the process.") - verbs -= /mob/living/carbon/human/proc/hatch - revive_ready = REVIVING_READY //reset their cooldown they can try again when they're given a kickstart - clear_alert("hatch") + //Reviving from ded takes extra nutrition - if it isn't provided from outside sources, it comes from you + if(!hasnutriment()) + nutrition=nutrition * 0.75 + chimera_hatch() + adjustBrainLoss(5) // if they're reviving from dead, they come back with 5 brainloss on top of whatever's unhealed. + visible_message("The former corpse staggers to its feet, all its former wounds having vanished...
") //Bloody hell... + clear_alert("hatch") + return //Alive when hatching else chimera_hatch() - visible_message("The dormant husk of [src] bursts open, revealing a new, intact copy in the pool of viscera.
") //Bloody hell... + + visible_message("[src] rises to \his feet.
") //Bloody hell... clear_alert("hatch") /mob/living/carbon/human/proc/chimera_hatch() verbs -= /mob/living/carbon/human/proc/hatch to_chat(src, "Your new body awakens, bursting free from your old skin.") - //Modify and record values (half nutrition and braindamage) - var/old_nutrition = nutrition * 0.5 - var/braindamage = (brainloss * 0.5) //Can only heal half brain damage. - + var/old_nutrition = nutrition + var/braindamage = min(5, max(0, (brainloss-1) * 0.5)) //brainloss is tricky to heal and might take a couple of goes to get rid of completely. + var/uninjured=quickcheckuninjured() //I did have special snowflake code, but this is easier. revive() mutations.Remove(HUSK) - nutrition = old_nutrition setBrainLoss(braindamage) - //Drop everything - for(var/obj/item/W in src) - drop_from_inventory(W) + if(!uninjured) + nutrition = old_nutrition * 0.5 + //Drop everything + for(var/obj/item/W in src) + drop_from_inventory(W) + //Visual effects + var/T = get_turf(src) + var/blood_color = species.blood_color + var/flesh_color = species.flesh_color + new /obj/effect/gibspawner/human/xenochimera(T, null, flesh_color, blood_color) + visible_message("The lifeless husk of [src] bursts open, revealing a new, intact copy in the pool of viscera.
") //Bloody hell... + playsound(T, 'sound/effects/mob_effects/xenochimera/hatch.ogg', 50) + else //lower cost for doing a quick cosmetic revive + nutrition = old_nutrition * 0.9 //Unfreeze some things does_not_breathe = FALSE update_canmove() weakened = 2 - //Visual effects - var/T = get_turf(src) - var/blood_color = species.blood_color - var/flesh_color = species.flesh_color - new /obj/effect/gibspawner/human/xenochimera(T, null, flesh_color, blood_color) - - playsound(T, 'sound/effects/mob_effects/xenochimera/hatch.ogg', 50) - revive_ready = world.time + 10 MINUTES //set the cooldown CHOMPEdit: Reduced this to 10 minutes, you're playing with fire if you're reviving that often. /mob/living/carbon/human/proc/revivingreset() // keep this as a debug proc or potential future use diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm index 7c30b9df50..26ced96f0a 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm @@ -9,7 +9,7 @@ name_plural = "Xenochimeras" icobase = 'icons/mob/human_races/r_xenochimera.dmi' deform = 'icons/mob/human_races/r_def_xenochimera.dmi' - unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) + unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/chimera, /datum/unarmed_attack/bite/sharp) darksight = 8 //critters with instincts to hide in the dark need to see in the dark - about as good as tajara. slowdown = -0.2 //scuttly, but not as scuttly as a tajara or a teshari. brute_mod = 0.8 //About as tanky to brute as a Unathi. They'll probably snap and go feral when hurt though. @@ -55,13 +55,13 @@ genders = list(MALE, FEMALE, PLURAL, NEUTER) - has_organ = list( //Same organ list as tajarans. + has_organ = list( //Same organ list as tajarans, except for their SPECIAL BRAIN. O_HEART = /obj/item/organ/internal/heart, O_LUNGS = /obj/item/organ/internal/lungs, O_VOICE = /obj/item/organ/internal/voicebox, O_LIVER = /obj/item/organ/internal/liver, O_KIDNEYS = /obj/item/organ/internal/kidneys, - O_BRAIN = /obj/item/organ/internal/brain, + O_BRAIN = /obj/item/organ/internal/brain/xenochimera, O_EYES = /obj/item/organ/internal/eyes, O_STOMACH = /obj/item/organ/internal/stomach, O_INTESTINE = /obj/item/organ/internal/intestine @@ -97,6 +97,9 @@ //Very low pressure damage if(adjusted_pressure2 <= 20) H.take_overall_damage(brute=LOW_PRESSURE_DAMAGE, used_weapon = "Low Pressure") + //they handle areas where they can't breathe better than most, but it still lowers their effective health as well as all the other bad stuff that comes with unbreathable environments + if(H.getOxyLoss() >= 50) + H.does_not_breathe = TRUE //Cold hurts and gives them pain messages, eventually weakening and paralysing, but doesn't damage or trigger feral. //NB: 'body_temperature' used here is the 'setpoint' species var @@ -105,17 +108,24 @@ H.shock_stage = min(H.shock_stage + (temp_diff/20), 160) // Divided by 20 is the same as previous numbers, but a full scale H.eye_blurry = max(5,H.eye_blurry) +/obj/item/organ/internal/brain/xenochimera + var/laststress = 0 /datum/species/xenochimera/proc/handle_feralness(var/mob/living/carbon/human/H) + //first, calculate how stressed the chimera is + var/laststress = 0 + var/obj/item/organ/internal/brain/xenochimera/B = H.internal_organs_by_name[O_BRAIN] + if(B) //if you don't have a chimera brain in a chimera body somehow, you don't get the feraless protection + laststress = B.laststress - //Low-ish nutrition has messages and eventually feral - var/hungry = H.nutrition <= 200 + //Low-ish nutrition has messages and can eventually cause feralness + var/hunger = max(0, 150 - H.nutrition) - //At 360 nutrition, this is 30 brute/burn, or 18 halloss. Capped at 50 brute/30 halloss - if they take THAT much, no amount of satiation will help them. Also they're fat. - var/shock = H.traumatic_shock > min(60, H.nutrition/10) + //pain makes feralness a thing + var/shock = 0.75*H.traumatic_shock - //Caffeinated xenochimera can become feral and have special messages - var/jittery = H.jitteriness >= 100 + //Caffeinated or otherwise overexcited xenochimera can become feral and have special messages + var/jittery = max(0, H.jitteriness - 100) //To reduce distant object references var/feral = H.feral @@ -124,11 +134,25 @@ var/danger = FALSE var/feral_state = FALSE - //Handle feral triggers and pre-feral messages - if(!feral && (hungry || shock || jittery)) + //finally, calculate the current stress total the chimera is operating under, and the cause + var/currentstress = (hunger + shock + jittery) + var/cause = "stress" + if(hunger > shock && hunger > jittery) + cause = "hunger" + else if (shock > hunger && shock > jittery) + cause = "shock" + else if (jittery > shock && jittery > hunger) + cause = "jittery" - // If they're hungry, give nag messages (when not bellied) - if(H.nutrition >= 100 && prob(0.5) && !isbelly(H.loc)) + //check to see if they go feral if they weren't before + if(!feral) + // if stress is below 15, no chance of snapping. Also if they weren't feral before, they won't suddenly become feral unless they get MORE stressed + if((currentstress > laststress) && prob(clamp(currentstress-15, 0, 100)) ) + go_feral(H, currentstress, cause) + feral = currentstress //update the local var + + //they didn't go feral, give 'em a chance of hunger messages + else if(H.nutrition <= 200 && prob(0.5) && !isbelly(H.loc)) switch(H.nutrition) if(150 to 200) to_chat(H,"You feel rather hungry. It might be a good idea to find some some food...") @@ -136,81 +160,26 @@ to_chat(H,"You feel like you're going to snap and give in to your hunger soon... It would be for the best to find some [pick("food","prey")] to eat...") danger = TRUE - // Going feral due to hunger - else if(H.nutrition < 100 && !isbelly(H.loc)) - to_chat(H,"Something in your mind flips, your instincts taking over, no longer able to fully comprehend your surroundings as survival becomes your primary concern - you must feed, survive, there is nothing else. Hunt. Eat. Hide. Repeat.") - log_and_message_admins("has gone feral due to hunger.", H) - feral = 5 - danger = TRUE - feral_state = TRUE - if(!H.stat) - H.emote("twitch") - - // If they're hurt, chance of snapping. - else if(shock) - - //If the majority of their shock is due to halloss, greater chance of snapping. - if(2.5*H.halloss >= H.traumatic_shock) - if(prob(min(10,(0.2 * H.traumatic_shock)))) - to_chat(H,"The pain! It stings! Got to get away! Your instincts take over, urging you to flee, to hide, to go to ground, get away from here...") - log_and_message_admins("has gone feral due to halloss.", H) - feral = 5 - danger = TRUE - feral_state = TRUE - if(!H.stat) - H.emote("twitch") - - //Majority due to other damage sources - else if(prob(min(10,(0.1 * H.traumatic_shock)))) - to_chat(H,"Your fight-or-flight response kicks in, your injuries too much to simply ignore - you need to flee, to hide, survive at all costs - or destroy whatever is threatening you.") - feral = 5 - danger = TRUE - feral_state = TRUE - log_and_message_admins("has gone feral due to injury.", H) - if(!H.stat) - H.emote("twitch") - - //No hungry or shock, but jittery - else if(jittery) - to_chat(H,"Suddenly, something flips - everything that moves is... potential prey. A plaything. This is great! Time to hunt!") - feral = 5 - danger = TRUE - feral_state = TRUE - log_and_message_admins("has gone feral due to jitteriness.", H) - if(!H.stat) - H.emote("twitch") + //now the check's done, update their brain so it remembers how stressed they were + B.laststress = currentstress // Handle being feral if(feral) //We're feral feral_state = TRUE - //Shock due to mostly halloss. More feral. - if(shock && 2.5*H.halloss >= H.traumatic_shock) + //If they're still stressed, they stay feral + if(currentstress >= 15) danger = TRUE - feral = max(feral, H.halloss) + feral = max(feral, currentstress) - //Shock due to mostly injury. More feral. - else if(shock) - danger = TRUE - feral = max(feral, H.traumatic_shock * 2) - - //Still jittery? More feral. - if(jittery) - danger = TRUE - feral = max(feral, H.jitteriness-100) - - //Still hungry? More feral. - if(H.feral + H.nutrition < 150) - danger = TRUE - feral++ else feral = max(0,--feral) - // Being in a belly or in the darkness decreases stress further. Helps mechanically reward players for staying in darkness + RP'ing appropriately. :9 - var/turf/T = get_turf(H) - if(feral && (isbelly(H.loc) || T.get_lumcount() <= 0.1)) - feral = max(0,--feral) + // Being in a belly or in the darkness decreases stress further. Helps mechanically reward players for staying in darkness + RP'ing appropriately. :9 + var/turf/T = get_turf(H) + if(feral && (isbelly(H.loc) || T.get_lumcount() <= 0.1)) + feral = max(0,--feral) //Set our real mob's var to our temp var H.feral = feral @@ -227,7 +196,7 @@ H.shock_stage = max(H.shock_stage-(feral/20), 0) //Handle light/dark areas - // var/turf/T = get_turf(H) // Moved up to before the in-belly/dark combined check, should still safely reach here just fine. + var/turf/T = get_turf(H) if(!T) update_xenochimera_hud(H, danger, feral_state) return //Nullspace @@ -257,15 +226,15 @@ // In the darkness, or "hidden", or in a belly. No need for custom scene-protection checks as it's just an occational infomessage. if(darkish || !isturf(H.loc) || isbelly(H.loc)) // Specific check for if in belly. !isturf should do this, but JUST in case. // If hurt, tell 'em to heal up - if (shock) + if (cause == "shock") to_chat(H,"This place seems safe, secure, hidden, a place to lick your wounds and recover...") //If hungry, nag them to go and find someone or something to eat. - else if(hungry) + else if(cause == "hunger") to_chat(H,"Secure in your hiding place, your hunger still gnaws at you. You need to catch some food...") //If jittery, etc - else if(jittery) + else if(cause == "jittery") to_chat(H,"sneakysneakyyesyesyescleverhidingfindthingsyessssss") //Otherwise, just tell them to keep hiding. @@ -284,16 +253,16 @@ // Someone/something nearby if(nearby.len) var/M = pick(nearby) - if(shock) + if(cause == "shock") to_chat(H,"You're hurt, in danger, exposed, and [M] looks to be a little too close for comfort...") - else if(hungry || jittery) + else to_chat(H,"Every movement, every flick, every sight and sound has your full attention, your hunting instincts on high alert... In fact, [M] looks extremely appetizing...") // Nobody around else - if(hungry) + if(cause == "hunger") to_chat(H,"Confusing sights and sounds and smells surround you - scary and disorienting it may be, but the drive to hunt, to feed, to survive, compels you.") - else if(jittery) + else if(cause == "jittery") to_chat(H,"yesyesyesyesyesyesgetthethingGETTHETHINGfindfoodsfindpreypounceyesyesyes") else to_chat(H,"Confusing sights and sounds and smells surround you, this place is wrong, confusing, frightening. You need to hide, go to ground...") @@ -301,6 +270,37 @@ // HUD update time update_xenochimera_hud(H, danger, feral_state) +/datum/species/xenochimera/proc/go_feral(var/mob/living/carbon/human/H, var/stress, var/cause) + // Going feral due to hunger + if(cause == "hunger") + to_chat(H,"Something in your mind flips, your instincts taking over, no longer able to fully comprehend your surroundings as survival becomes your primary concern - you must feed, survive, there is nothing else. Hunt. Eat. Hide. Repeat.") + log_and_message_admins("has gone feral due to hunger.", H) + + // If they're hurt, chance of snapping. + else if(cause == "shock") + //If the majority of their shock is due to halloss, give them a different message (3x multiplier on check as halloss is 2x - meaning t_s must be at least 3x for other damage sources to be the greater part) + if(3*H.halloss >= H.traumatic_shock) + to_chat(H,"The pain! It stings! Got to get away! Your instincts take over, urging you to flee, to hide, to go to ground, get away from here...") + log_and_message_admins("has gone feral due to halloss.", H) + + //Majority due to other damage sources + else + to_chat(H,"Your fight-or-flight response kicks in, your injuries too much to simply ignore - you need to flee, to hide, survive at all costs - or destroy whatever is threatening you.") + log_and_message_admins("has gone feral due to injury.", H) + + //No hungry or shock, but jittery + else if(cause == "jittery") + to_chat(H,"Suddenly, something flips - everything that moves is... potential prey. A plaything. This is great! Time to hunt!") + log_and_message_admins("has gone feral due to jitteriness.", H) + + else // catch-all just in case something weird happens + to_chat(H,"The stress of your situation is too much for you, and your survival instincts kick in!") + log_and_message_admins("has gone feral for unknown reasons.", H) + //finally, set their feral var + H.feral = stress + if(!H.stat) + H.emote("twitch") + /datum/species/xenochimera/get_race_key() var/datum/species/real = GLOB.all_species[base_species] return real.race_key diff --git a/code/modules/mob/living/carbon/human/species/station/station_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_vr.dm index 116fd369de..345216ef10 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_vr.dm @@ -562,3 +562,60 @@ "You feel uncomfortably warm.", "Your chitin feels hot." ) + +/datum/species/altevian + name = SPECIES_ALTEVIAN + name_plural = "Altevians" + icobase = 'icons/mob/human_races/r_altevian.dmi' + deform = 'icons/mob/human_races/r_def_altevian.dmi' + unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) + language = LANGUAGE_TAVAN + num_alternate_languages = 3 + secondary_langs = list(LANGUAGE_TAVAN) + name_language = null + color_mult = 1 + inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) + + min_age = 18 + max_age = 80 + + blurb = "The Altevian are a species of tall, rodent humanoids that are akin to rats for their features. \ + The Altevian, unlike most species, do not have a home planet, nor system, adopting a fully nomadic lifestyle \ + for their survival across the stars. Instead, they have opted to live in massive super capital-class colony-ships \ + with a flagship as their place they would call home." + + wikilink="https://wiki.vore-station.net/Altevian" + + catalogue_data = list(/datum/category_item/catalogue/fauna/altevian) + + spawn_flags = SPECIES_CAN_JOIN + appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR + + flesh_color = "#AFA59E" + base_color = "#777777" + + genders = list(MALE, FEMALE, PLURAL, NEUTER) + + burn_mod = 1.15 + hunger_factor = 0.04 + can_zero_g_move = TRUE + + heat_discomfort_strings = list( + "Your fur prickles in the heat.", + "You feel uncomfortably warm.", + "Your overheated skin itches." + ) + + has_limbs = list( + BP_TORSO = list("path" = /obj/item/organ/external/chest), + BP_GROIN = list("path" = /obj/item/organ/external/groin), + BP_HEAD = list("path" = /obj/item/organ/external/head), + BP_L_ARM = list("path" = /obj/item/organ/external/arm), + BP_R_ARM = list("path" = /obj/item/organ/external/arm/right), + BP_L_LEG = list("path" = /obj/item/organ/external/leg), + BP_R_LEG = list("path" = /obj/item/organ/external/leg/right), + BP_L_HAND = list("path" = /obj/item/organ/external/hand), + BP_R_HAND = list("path" = /obj/item/organ/external/hand/right), + BP_L_FOOT = list("path" = /obj/item/organ/external/foot), + BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right) + ) 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 fd10b3140a..35e9d46d0c 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 @@ -150,8 +150,8 @@ YW change end */ desc = "Makes you unable to gain nutrition from anything but blood. To compenstate, you get fangs that can be used to drain blood from prey." cost = 0 custom_only = FALSE - var_changes = list("organic_food_coeff" = 0) - excludes = list(/datum/trait/neutral/bloodsucker_freeform,/datum/trait/neutral/bloodsucker_freeform) //YW EDIT: /datum/trait/neutral/bloodsucker_freeform + var_changes = list("organic_food_coeff" = 0, "bloodsucker" = TRUE) + excludes = list(/datum/trait/positive/bloodsucker_plus) //YW EDIT: /datum/trait/positive/bloodsucker_plus /datum/trait/neutral/bloodsucker/apply(var/datum/species/S,var/mob/living/carbon/human/H) ..(S,H) @@ -162,6 +162,7 @@ YW change end */ desc = "You get fangs that can be used to drain blood from prey." cost = 0 custom_only = FALSE + var_changes = list("bloodsucker" = TRUE) excludes = list(/datum/trait/neutral/bloodsucker) */ /datum/trait/neutral/bloodsucker_freeform/apply(var/datum/species/S,var/mob/living/carbon/human/H) @@ -387,7 +388,7 @@ YW change end */ custom_only = FALSE var_changes = list("spice_mod" = 0.25) // 25% as effective if spice_mod is set to 1. If it's not 1 in species.dm, update this! -/*YW CHANGE START: Commented out because we got our own variants +/*YW CHANGE START: Commented out because we got our own variants // Alcohol Traits Start Here, from negative to positive. /datum/trait/neutral/alcohol_intolerance_advanced name = "Liver of Air" @@ -607,3 +608,45 @@ YW CHANGE STOP*/ /datum/trait/neutral/vertical_nom/apply(var/datum/species/S,var/mob/living/carbon/human/H) ..(S,H) H.verbs |= /mob/living/proc/vertical_nom + +/datum/trait/neutral/micro_size_down + name = "Light Frame" + desc = "You are considered smaller than you are for micro interactions." + cost = 0 + custom_only = FALSE + var_changes = list("micro_size_mod" = -0.15) + +/datum/trait/neutral/micro_size_up + name = "Heavy Frame" + desc = "You are considered bigger than you are for micro interactions." + cost = 0 + custom_only = FALSE + var_changes = list("micro_size_mod" = 0.15) + +/datum/trait/neutral/digestion_value_up + name = "Highly Filling" + desc = "You provide notably more nutrition to anyone who makes a meal of you." + cost = 0 + custom_only = FALSE + var_changes = list("digestion_nutrition_modifier" = 2) + +/datum/trait/neutral/digestion_value_up_plus + name = "Extremely Filling" + desc = "You provide a lot more nutrition to anyone who makes a meal of you." + cost = 0 + custom_only = FALSE + var_changes = list("digestion_nutrition_modifier" = 3) + +/datum/trait/neutral/digestion_value_down + name = "Slightly Filling" + desc = "You provide notably less nutrition to anyone who makes a meal of you." + cost = 0 + custom_only = FALSE + var_changes = list("digestion_nutrition_modifier" = 0.5) + +/datum/trait/neutral/digestion_value_down_plus + name = "Barely Filling" + desc = "You provide a lot less nutrition to anyone who makes a meal of you." + cost = 0 + custom_only = FALSE + var_changes = list("digestion_nutrition_modifier" = 0.25) diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm index 30622e3184..fff6638ff1 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm @@ -164,13 +164,13 @@ desc = "You've drunk so much that most booze doesn't even faze you. It takes something like a Pan-Galactic or a pint of Deathbell for you to even get slightly buzzed. You may wish to note this down in your medical records." cost = 2 var_changes = list("alcohol_mod" = 0.25) - + /datum/trait/positive/pain_tolerance_basic name = "Pain Tolerant" desc = "You're a little more resistant to pain than most, and experience 10% less pain from from all sources." cost = 1 var_changes = list("pain_mod" = 0.9) - + /datum/trait/positive/pain_tolerance_advanced name = "Pain Tolerance, High " desc = "You are noticeably more resistant to pain than most, and experience 20% less pain from all sources." @@ -238,7 +238,7 @@ name = "Evolved Bloodsucker" desc = "Makes you able to gain nutrition by draining blood as well as eating food. To compensate, you get fangs that can be used to drain blood from prey." cost = 1 - var_changes = list("organic_food_coeff" = 0.5) // Hopefully this works??? + var_changes = list("organic_food_coeff" = 0.5, "bloodsucker" = TRUE) excludes = list(/datum/trait/neutral/bloodsucker) /datum/trait/positive/bloodsucker_plus/apply(var/datum/species/S,var/mob/living/carbon/human/H) @@ -261,7 +261,7 @@ var_changes = list("cold_level_1" = 200, "cold_level_2" = 150, "cold_level_3" = 90, "breath_cold_level_1" = 180, "breath_cold_level_2" = 100, "breath_cold_level_3" = 60, "cold_discomfort_level" = 210, "heat_level_1" = 305, "heat_level_2" = 360, "heat_level_3" = 700, "breath_heat_level_1" = 345, "breath_heat_level_2" = 380, "breath_heat_level_3" = 780, "heat_discomfort_level" = 295) excludes = list(/datum/trait/positive/hotadapt) can_take = ORGANICS - + /datum/trait/positive/hotadapt name = "Heat-Adapted" desc = "You are able to withstand much hotter temperatures than other species, and can even be comfortable in extremely hot environments. You are also more vulnerable to cold environments as a consequence of these adaptations." @@ -321,4 +321,4 @@ cost = 2 var_changes = list("gun_accuracy_mod" = 25) custom_only = FALSE - varchange_type = TRAIT_VARCHANGE_MORE_BETTER \ No newline at end of file + varchange_type = TRAIT_VARCHANGE_MORE_BETTER diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 3c513052cf..a85af45962 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -66,7 +66,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() #define MOB_DAM_LAYER 4 //Injury overlay sprites like open wounds #define SURGERY_LAYER 5 //Overlays for open surgical sites #define UNDERWEAR_LAYER 6 //Underwear/bras/etc -#define TAIL_SOUTH_LAYER 7 //Tail as viewed from the south +#define TAIL_LOWER_LAYER 7 //Tail as viewed from the south #define SHOES_LAYER_ALT 8 //Shoe-slot item (when set to be under uniform via verb) #define UNIFORM_LAYER 9 //Uniform-slot item #define ID_LAYER 10 //ID-slot item @@ -74,7 +74,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() #define GLOVES_LAYER 12 //Glove-slot item #define BELT_LAYER 13 //Belt-slot item #define SUIT_LAYER 14 //Suit-slot item -#define TAIL_NORTH_LAYER 15 //Some species have tails to render (As viewed from the N, E, or W) +#define TAIL_UPPER_LAYER 15 //Some species have tails to render (As viewed from the N, E, or W) #define GLASSES_LAYER 16 //Eye-slot item #define BELT_LAYER_ALT 17 //Belt-slot item (when set to be above suit via verb) #define SUIT_STORE_LAYER 18 //Suit storage-slot item @@ -90,7 +90,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() #define L_HAND_LAYER 28 //Left-hand item #define R_HAND_LAYER 29 //Right-hand item #define WING_LAYER 30 //Wings or protrusions over the suit. -#define TAIL_NORTH_LAYER_ALT 31 //Modified tail-sprite layer. Tend to be larger. +#define TAIL_UPPER_LAYER_ALT 31 //Modified tail-sprite layer. Tend to be larger. #define MODIFIER_EFFECTS_LAYER 32 //Effects drawn by modifiers #define FIRE_LAYER 33 //'Mob on fire' overlay layer #define MOB_WATER_LAYER 34 //'Mob submerged' overlay layer @@ -98,8 +98,6 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() #define TOTAL_LAYERS 35 //VOREStation edit. <---- KEEP THIS UPDATED, should always equal the highest number here, used to initialize a list. ////////////////////////////////// -#define GET_TAIL_LAYER (dir == SOUTH ? TAIL_SOUTH_LAYER : TAIL_NORTH_LAYER) - /mob/living/carbon/human var/list/overlays_standing[TOTAL_LAYERS] var/previous_damage_appearance // store what the body last looked like, so we only have to update it if something changed @@ -146,6 +144,17 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() var/matrix/M = matrix() var/anim_time = 3 + // VOREStation Edit Start: Porting Taur Loafing + if(tail_style?.can_loaf && resting) // Only call these if we're resting? + update_tail_showing() + return // No need to do the rest, we return early + /* // Commenting this out as sleeping is fucky + if(tail_style?.can_loaf && lying && sleeping) // If we're put under by anesthetic or fainting + update_tail_showing() + // return // No need to do the rest, we return early + */ + // VOREStation Edit End + //Due to some involuntary means, you're laying now if(lying && !resting && !sleeping) anim_time = 1 //Thud @@ -165,6 +174,8 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() else M.Scale(desired_scale_x, desired_scale_y)//VOREStation Edit M.Translate(0, (vis_height/2)*(desired_scale_y-1)) //VOREStation edit + if(tail_style?.can_loaf) // VOREStation Edit: Taur Loafing + update_tail_showing() // VOREStation Edit: Taur Loafing layer = MOB_LAYER // Fix for a byond bug where turf entry order no longer matters animate(src, transform = M, time = anim_time) @@ -839,7 +850,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() suit_sprite = INV_SUIT_DEF_ICON var/icon/c_mask = null - var/tail_is_rendered = (overlays_standing[TAIL_NORTH_LAYER] || overlays_standing[TAIL_NORTH_LAYER_ALT] || overlays_standing[TAIL_SOUTH_LAYER]) + var/tail_is_rendered = (overlays_standing[TAIL_UPPER_LAYER] || overlays_standing[TAIL_UPPER_LAYER_ALT] || overlays_standing[TAIL_LOWER_LAYER]) var/valid_clip_mask = tail_style?.clip_mask if(tail_is_rendered && valid_clip_mask && !(istype(suit) && suit.taurized)) //Clip the lower half of the suit off using the tail's clip mask for taurs since taur bodies aren't hidden. @@ -952,19 +963,29 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() apply_layer(L_HAND_LAYER) +/mob/living/carbon/human/proc/get_tail_layer() + var/list/lower_layer_dirs = list(SOUTH) + if(tail_style) + lower_layer_dirs = tail_style.lower_layer_dirs.Copy() + + if(dir in lower_layer_dirs) + return TAIL_LOWER_LAYER + else + return TAIL_UPPER_LAYER + /mob/living/carbon/human/proc/update_tail_showing() if(QDESTROYING(src)) return - remove_layer(TAIL_NORTH_LAYER) - remove_layer(TAIL_NORTH_LAYER_ALT) - remove_layer(TAIL_SOUTH_LAYER) + remove_layer(TAIL_UPPER_LAYER) + remove_layer(TAIL_UPPER_LAYER_ALT) + remove_layer(TAIL_LOWER_LAYER) - var/tail_layer = GET_TAIL_LAYER + var/tail_layer = get_tail_layer() if(src.tail_style && src.tail_style.clip_mask_state) - tail_layer = TAIL_NORTH_LAYER // Use default, let clip mask handle everything - if(tail_alt && tail_layer == TAIL_NORTH_LAYER) - tail_layer = TAIL_NORTH_LAYER_ALT + tail_layer = TAIL_UPPER_LAYER // Use default, let clip mask handle everything + if(tail_alt && tail_layer == TAIL_UPPER_LAYER) + tail_layer = TAIL_UPPER_LAYER_ALT var/image/tail_image = get_tail_image() if(tail_image) @@ -1003,16 +1024,16 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() return tail_icon /mob/living/carbon/human/proc/set_tail_state(var/t_state) - var/tail_layer = GET_TAIL_LAYER + var/tail_layer = get_tail_layer() if(src.tail_style && src.tail_style.clip_mask_state) - tail_layer = TAIL_NORTH_LAYER // Use default, let clip mask handle everything - if(tail_alt && tail_layer == TAIL_NORTH_LAYER) - tail_layer = TAIL_NORTH_LAYER_ALT + tail_layer = TAIL_UPPER_LAYER // Use default, let clip mask handle everything + if(tail_alt && tail_layer == TAIL_UPPER_LAYER) + tail_layer = TAIL_UPPER_LAYER_ALT var/image/tail_overlay = overlays_standing[tail_layer] - remove_layer(TAIL_NORTH_LAYER) - remove_layer(TAIL_NORTH_LAYER_ALT) - remove_layer(TAIL_SOUTH_LAYER) + remove_layer(TAIL_UPPER_LAYER) + remove_layer(TAIL_UPPER_LAYER_ALT) + remove_layer(TAIL_LOWER_LAYER) if(tail_overlay) overlays_standing[tail_layer] = tail_overlay @@ -1030,9 +1051,9 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() return var/t_state = "[species.get_tail(src)]_once" - var/tail_layer = GET_TAIL_LAYER + var/tail_layer = get_tail_layer() if(src.tail_style && src.tail_style.clip_mask_state) - tail_layer = TAIL_NORTH_LAYER // Use default, let clip mask handle everything + tail_layer = TAIL_UPPER_LAYER // Use default, let clip mask handle everything var/image/tail_overlay = overlays_standing[tail_layer] if(tail_overlay && tail_overlay.icon_state == t_state) @@ -1225,11 +1246,12 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() //If you have a custom tail selected if(tail_style && !(wear_suit && wear_suit.flags_inv & HIDETAIL && !istaurtail(tail_style))) - var/icon/tail_s = new/icon("icon" = tail_style.icon, "icon_state" = wagging && tail_style.ani_state ? tail_style.ani_state : tail_style.icon_state) + var/icon/tail_s = new/icon("icon" = tail_style.icon, "icon_state" = (tail_style.can_loaf && resting) ? "[tail_style.icon_state]_loaf" : (wagging && tail_style.ani_state ? tail_style.ani_state : tail_style.icon_state)) // VOREStation Edit: Taur Loafing + pixel_y = (tail_style.can_loaf && resting) ? -tail_style.loaf_offset : 0 //move player down, then taur up, to fit the overlays correctly // VOREStation Edit: Taur Loafing if(tail_style.do_colouration) tail_s.Blend(rgb(src.r_tail, src.g_tail, src.b_tail), tail_style.color_blend_mode) if(tail_style.extra_overlay) - var/icon/overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay) + var/icon/overlay = new/icon("icon" = tail_style.icon, "icon_state" = (tail_style?.can_loaf && resting) ? "[tail_style.extra_overlay]_loaf" : tail_style.extra_overlay) // VOREStation Edit: Taur Loafing if(wagging && tail_style.ani_state) overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay_w) overlay.Blend(rgb(src.r_tail2, src.g_tail2, src.b_tail2), tail_style.color_blend_mode) @@ -1259,6 +1281,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() if(istaurtail(tail_style)) var/datum/sprite_accessory/tail/taur/taurtype = tail_style working.pixel_x = -16 + working.pixel_y = (tail_style.can_loaf && resting) ? tail_style.loaf_offset : 0 // VOREStation Edit: Taur Loafing if(taurtype.can_ride && !riding_datum) riding_datum = new /datum/riding/taur(src) verbs |= /mob/living/carbon/human/proc/taur_mount @@ -1292,9 +1315,8 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() #undef GLOVES_LAYER #undef BELT_LAYER #undef SUIT_LAYER -#undef TAIL_NORTH_LAYER -#undef TAIL_SOUTH_LAYER -#undef GET_TAIL_LAYER +#undef TAIL_UPPER_LAYER +#undef TAIL_LOWER_LAYER #undef GLASSES_LAYER #undef BELT_LAYER_ALT #undef SUIT_STORE_LAYER diff --git a/code/modules/mob/living/living_vr.dm b/code/modules/mob/living/living_vr.dm index 9689953ebb..ad35515ef1 100644 --- a/code/modules/mob/living/living_vr.dm +++ b/code/modules/mob/living/living_vr.dm @@ -33,4 +33,76 @@ to_chat(usr, "OOC notes updated.") log_admin("[key_name(usr)] updated their OOC notes mid-round.") +/mob/living/verb/set_voice_freq() + set name = "Set Voice Frequency" + set desc = "Sets your voice frequency to be higher or lower pitched!" + set category = "OOC" + var/list/preset_voice_freqs = list("high" = MAX_VOICE_FREQ, "middle-high" = 56250, "middle" = 425000, "middle-low"= 28750, "low" = MIN_VOICE_FREQ, "custom" = 1, "random" = 0) + var/choice = tgui_input_list(src, "What would you like to set your voice frequency to?", "Voice Frequency", preset_voice_freqs) + if(!choice) + return + choice = preset_voice_freqs[choice] + if(choice == 0) + voice_freq = choice + return + else if(choice == 1) + choice = tgui_input_number(src, "Choose your character's voice frequency, ranging from [MIN_VOICE_FREQ] to [MAX_VOICE_FREQ]", "Custom Voice Frequency", null, MAX_VOICE_FREQ, MIN_VOICE_FREQ, round_value = TRUE) + else if(choice > MAX_VOICE_FREQ) + choice = MAX_VOICE_FREQ + else if(choice < MIN_VOICE_FREQ) + choice = MIN_VOICE_FREQ + voice_freq = choice + +/mob/living/verb/set_voice_type() + set name = "Set Voice Type" + set desc = "Sets your voice style!" + set category = "OOC" + + var/list/possible_voice_types = list( + "beep-boop", + "goon speak 1", + "goon speak 2", + "goon speak 3", + "goon speak 4", + "goon speak blub", + "goon speak bottalk", + "goon speak buwoo", + "goon speak cow", + "goon speak lizard", + "goon speak pug", + "goon speak pugg", + "goon speak roach", + "goon speak skelly") + var/choice = tgui_input_list(usr, "Which set of sounds would you like to use for your character's speech sounds?", "Voice Sounds", possible_voice_types) + if(!choice) + voice_sounds_list = talk_sound + switch(choice) + if("beep-boop") + voice_sounds_list = talk_sound + if("goon speak 1") + voice_sounds_list = goon_speak_one_sound + if("goon speak 2") + voice_sounds_list = goon_speak_two_sound + if("goon speak 3") + voice_sounds_list = goon_speak_three_sound + if("goon speak 4") + voice_sounds_list = goon_speak_four_sound + if("goon speak blub") + voice_sounds_list = goon_speak_blub_sound + if("goon speak bottalk") + voice_sounds_list = goon_speak_bottalk_sound + if("goon speak buwoo") + voice_sounds_list = goon_speak_buwoo_sound + if("goon speak cow") + voice_sounds_list = goon_speak_cow_sound + if("goon speak lizard") + voice_sounds_list = goon_speak_lizard_sound + if("goon speak pug") + voice_sounds_list = goon_speak_pug_sound + if("goon speak pugg") + voice_sounds_list = goon_speak_pugg_sound + if("goon speak roach") + voice_sounds_list = goon_speak_roach_sound + if("goon speak skelly") + voice_sounds_list = goon_speak_skelly_sound diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm index 5d2836779b..d6aec7d322 100644 --- a/code/modules/mob/living/login.dm +++ b/code/modules/mob/living/login.dm @@ -13,16 +13,52 @@ to_chat(src,"Mob AI disabled while you are controlling the mob.") AddComponent(/datum/component/character_setup) - + // Vore stuff verbs |= /mob/living/proc/escapeOOC verbs |= /mob/living/proc/lick verbs |= /mob/living/proc/smell verbs |= /mob/living/proc/switch_scaling - + if(!no_vore) verbs |= /mob/living/proc/vorebelly_printout if(!vorePanel) AddComponent(/datum/component/vore_panel) + //VOREStation Add Start + if(!voice_sounds_list.len || !voice_sounds_list) + if(client.prefs.voice_sound) + var/prefsound = client.prefs.voice_sound + switch(prefsound) + if("beep-boop") + voice_sounds_list = talk_sound + if("goon speak 1") + voice_sounds_list = goon_speak_one_sound + if("goon speak 2") + voice_sounds_list = goon_speak_two_sound + if("goon speak 3") + voice_sounds_list = goon_speak_three_sound + if("goon speak 4") + voice_sounds_list = goon_speak_four_sound + if("goon speak blub") + voice_sounds_list = goon_speak_blub_sound + if("goon speak bottalk") + voice_sounds_list = goon_speak_bottalk_sound + if("goon speak buwoo") + voice_sounds_list = goon_speak_buwoo_sound + if("goon speak cow") + voice_sounds_list = goon_speak_cow_sound + if("goon speak lizard") + voice_sounds_list = goon_speak_lizard_sound + if("goon speak pug") + voice_sounds_list = goon_speak_pug_sound + if("goon speak pugg") + voice_sounds_list = goon_speak_pugg_sound + if("goon speak roach") + voice_sounds_list = goon_speak_roach_sound + if("goon speak skelly") + voice_sounds_list = goon_speak_skelly_sound + else + voice_sounds_list = talk_sound + //VOREStation Add End return . diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 7c5af248ff..8ec168f39d 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -18,6 +18,7 @@ var/list/department_radio_keys = list( ":p" = "AI Private", ".p" = "AI Private", ":y" = "Explorer", ".y" = "Explorer", ":a" = "Talon", ".a" = "Talon", //VOREStation Add, + ":g" = "Casino", ".g" = "Casino", ":R" = "right ear", ".R" = "right ear", ":L" = "left ear", ".L" = "left ear", @@ -37,6 +38,7 @@ var/list/department_radio_keys = list( ":P" = "AI Private", ".P" = "AI Private", ":Y" = "Explorer", ".Y" = "Explorer", ":A" = "Talon", ".A" = "Talon", //VOREStation Add, + ":G" = "Casino", ".G" = "Casino", // Cyrillic characters on the same keys on the Russian QWERTY (phonetic) layout ":к" = "right ear", ".к" = "right ear", @@ -57,7 +59,8 @@ var/list/department_radio_keys = list( ":м" = "Service", ".м" = "Service", ":з" = "AI Private", ".з" = "AI Private", ":н" = "Explorer", ".н" = "Explorer", - ":ф" = "Talon", ".ф" = "Talon" //VOREStation Add + ":ф" = "Talon", ".ф" = "Talon", //VOREStation Add + ":п" = "Casino", ".п" = "Casino", ) @@ -259,6 +262,9 @@ var/list/channel_to_radio_key = new //Default range and italics, may be overridden past here var/message_range = world.view var/italics = 0 + var/do_sound = TRUE + if(!voice_sounds_list || !voice_sounds_list.len) + do_sound = FALSE //Speaking into radios if(used_radios.len) @@ -302,6 +308,7 @@ var/list/channel_to_radio_key = new for(var/datum/multilingual_say_piece/S in message_pieces) if((S.speaking.flags & NONVERBAL) || (S.speaking.flags & INAUDIBLE)) custom_emote(1, "[pick(S.speaking.signlang_verb)].") + do_sound = FALSE //These will contain the main receivers of the message var/list/listening = list() @@ -398,12 +405,20 @@ var/list/channel_to_radio_key = new C.images -= I qdel(I) + var/ourfreq = null + if(voice_freq > 0 ) + ourfreq = voice_freq //Log the message to file if(message_mode) message = "([message_mode == "headset" ? "Common" : capitalize(message_mode)]) [message]" //Adds radio keys used if available if(whispering) + if(do_sound && message) + playsound(T, pick(voice_sounds_list), 25, TRUE, extrarange = -6, falloff = 1 , is_global = TRUE, frequency = ourfreq, ignore_walls = FALSE, preference = /datum/client_preference/whisper_sounds) + log_whisper(message, src) else + if(do_sound && message) + playsound(T, pick(voice_sounds_list), 75, TRUE, falloff = 1 , is_global = TRUE, frequency = ourfreq, ignore_walls = FALSE, preference = /datum/client_preference/say_sounds) log_say(message, src) return 1 diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index ca5319313f..a2ce47c2be 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -161,7 +161,6 @@ var/list/ai_verbs_default = list( add_language(LANGUAGE_SIIK, 1) add_language(LANGUAGE_AKHANI, 1) add_language(LANGUAGE_SKRELLIAN, 1) - add_language(LANGUAGE_SKRELLIANFAR, 0) add_language(LANGUAGE_TRADEBAND, 1) add_language(LANGUAGE_GUTTER, 1) add_language(LANGUAGE_EAL, 1) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 039c64e663..94595c9516 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -145,6 +145,7 @@ // Vorestation Edit: Meta Info for pAI if (client.prefs) ooc_notes = client.prefs.metadata + src << sound('sound/effects/pai_login.ogg', volume = 75) //VOREStation Add // this function shows the information about being silenced as a pAI in the Status panel /mob/living/silicon/pai/proc/show_silenced() diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm index d8594fd5fc..139fc3831c 100644 --- a/code/modules/mob/living/silicon/pai/software_modules.dm +++ b/code/modules/mob/living/silicon/pai/software_modules.dm @@ -140,7 +140,7 @@ /datum/pai_software/med_records/tgui_data(mob/living/silicon/pai/user, datum/tgui/ui, datum/tgui_state/state) var/list/data = ..() - + var/list/records = list() for(var/datum/data/record/general in sortRecord(data_core.general)) var/list/record = list() @@ -196,7 +196,7 @@ /datum/pai_software/sec_records/tgui_data(mob/living/silicon/pai/user, datum/tgui/ui, datum/tgui_state/state) var/list/data = ..() - + var/list/records = list() for(var/datum/data/record/general in sortRecord(data_core.general)) var/list/record = list() @@ -404,7 +404,6 @@ user.add_language(LANGUAGE_ZADDAT) user.add_language(LANGUAGE_SCHECHI) user.add_language(LANGUAGE_DRUDAKAR) - user.add_language(LANGUAGE_SLAVIC) user.add_language(LANGUAGE_BIRDSONG) user.add_language(LANGUAGE_SAGARU) user.add_language(LANGUAGE_CANILUNZT) @@ -413,24 +412,15 @@ user.add_language(LANGUAGE_ENOCHIAN) user.add_language(LANGUAGE_VESPINAE) user.add_language(LANGUAGE_SPACER) - user.add_language(LANGUAGE_CLOWNISH) user.add_language(LANGUAGE_TAVAN) user.add_language(LANGUAGE_ECHOSONG) - user.add_language(LANGUAGE_CHIMPANZEE) - user.add_language(LANGUAGE_NEAERA) - user.add_language(LANGUAGE_STOK) - user.add_language(LANGUAGE_FARWA) user.add_language(LANGUAGE_ROOTLOCAL) user.add_language(LANGUAGE_VOX) - user.add_language(LANGUAGE_SKRELLIANFAR) user.add_language(LANGUAGE_MINBUS) user.add_language(LANGUAGE_ALAI) user.add_language(LANGUAGE_PROMETHEAN) user.add_language(LANGUAGE_GIBBERISH) - user.add_language("Mouse") - user.add_language("Cat") - user.add_language("Bird") - user.add_language("Dog") + user.add_language("Animal") user.add_language("Teppi") else user.remove_language(LANGUAGE_UNATHI) @@ -440,7 +430,6 @@ user.remove_language(LANGUAGE_ZADDAT) user.remove_language(LANGUAGE_SCHECHI) user.remove_language(LANGUAGE_DRUDAKAR) - user.remove_language(LANGUAGE_SLAVIC) user.remove_language(LANGUAGE_BIRDSONG) user.remove_language(LANGUAGE_SAGARU) user.remove_language(LANGUAGE_CANILUNZT) @@ -449,24 +438,15 @@ user.remove_language(LANGUAGE_ENOCHIAN) user.remove_language(LANGUAGE_VESPINAE) user.remove_language(LANGUAGE_SPACER) - user.remove_language(LANGUAGE_CLOWNISH) user.remove_language(LANGUAGE_TAVAN) user.remove_language(LANGUAGE_ECHOSONG) - user.remove_language(LANGUAGE_CHIMPANZEE) - user.remove_language(LANGUAGE_NEAERA) - user.remove_language(LANGUAGE_STOK) - user.remove_language(LANGUAGE_FARWA) user.remove_language(LANGUAGE_ROOTLOCAL) user.remove_language(LANGUAGE_VOX) - user.remove_language(LANGUAGE_SKRELLIANFAR) user.remove_language(LANGUAGE_MINBUS) user.remove_language(LANGUAGE_ALAI) user.remove_language(LANGUAGE_PROMETHEAN) user.remove_language(LANGUAGE_GIBBERISH) - user.remove_language("Mouse") - user.remove_language("Cat") - user.remove_language("Bird") - user.remove_language("Dog") + user.remove_language("Animal") user.remove_language("Teppi") /datum/pai_software/translator/is_active(mob/living/silicon/pai/user) @@ -486,7 +466,7 @@ /datum/pai_software/signaller/tgui_data(mob/living/silicon/pai/user, datum/tgui/ui, datum/tgui_state/state) var/list/data = ..() - + var/obj/item/radio/integrated/signal/R = user.sradio data["frequency"] = R.frequency @@ -509,7 +489,7 @@ spawn(0) R.send_signal("ACTIVATE") for(var/mob/O in hearers(1, R.loc)) - O.show_message("[bicon(R)] *beep* *beep*", 3, "*beep* *beep*", 2) + O.show_message("\icon[R][bicon(R)] *beep* *beep*", 3, "*beep* *beep*", 2) if("freq") var/frequency = unformat_frequency(params["freq"]) frequency = sanitize_frequency(frequency, RADIO_LOW_FREQ, RADIO_HIGH_FREQ) diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm index 24426b2710..e832207bb9 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm @@ -66,12 +66,12 @@ var/agony = 60 // Copied from stun batons var/stun = 0 // ... same - + var/obj/item/organ/external/affecting = null if(ishuman(target)) var/mob/living/carbon/human/H = target affecting = H.get_organ(hit_zone) - + if(user.a_intent == I_HURT) // Parent handles messages . = ..() @@ -91,7 +91,7 @@ var/mob/living/silicon/robot/R = loc if(R.cell?.use(charge_cost) == charge_cost) stunning = TRUE - + if(stunning) target.stun_effect_act(stun, agony, hit_zone, src) msg_admin_attack("[key_name(user)] stunned [key_name(target)] with the [src].") @@ -216,6 +216,11 @@ desc = "An advanced chemical synthesizer and injection system utilizing carrier's reserves." reagent_ids = list("tricordrazine", "inaprovaline", "bicaridine", "dexalin", "anti_toxin", "tramadol", "spaceacillin") +/obj/item/weapon/reagent_containers/borghypo/hound/trauma + name = "Hound hypospray" + desc = "An advanced chemical synthesizer and injection system utilizing carrier's reserves." + reagent_ids = list("inaprovaline", "dexalin", "bicaridine", "anti_toxin", "spaceacillin", "paracetamol") + //Tongue stuff /obj/item/device/dogborg/tongue 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 97af632c94..8af6fddc8f 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 @@ -42,11 +42,13 @@ var/digest_multiplier = 1 var/recycles = FALSE var/medsensor = TRUE //Does belly sprite come with patient ok/dead light? + var/obj/item/device/healthanalyzer/med_analyzer = null /obj/item/device/dogborg/sleeper/New() ..() flags |= NOBLUDGEON //No more attack messages files = new /datum/research/techonly(src) + med_analyzer = new /obj/item/device/healthanalyzer /obj/item/device/dogborg/sleeper/Destroy() go_out() @@ -216,6 +218,8 @@ dat += "Eject port: [eject_port]" if(!cleaning) dat += "Self-Clean" + if(medsensor) + dat += "Analyze Patient" else dat += "Self-Clean" if(delivery) @@ -336,6 +340,8 @@ if(cleaning) sleeperUI(usr) return + if(href_list["analyze"]) //DO HEALTH ANALYZER STUFF HERE. + med_analyzer.scan_mob(patient,hound) if(href_list["port"]) switch(eject_port) if("ingestion") @@ -548,7 +554,8 @@ var/actual_burn = T.getFireLoss() - old_burn var/damage_gain = actual_brute + actual_burn drain(-25 * damage_gain) //25*total loss as with voreorgan stats. - water.add_charge(damage_gain) + if(water) + water.add_charge(damage_gain) if(T.stat == DEAD) if(ishuman(T)) message_admins("[key_name(hound)] has digested [key_name(T)] as a dogborg. ([hound ? "JMP" : "null"])") @@ -585,10 +592,12 @@ if(ishuman(T)) var/mob/living/carbon/human/Prey = T volume = (Prey.bloodstr.total_volume + Prey.ingested.total_volume + Prey.touching.total_volume + Prey.weight) * Prey.size_multiplier - water.add_charge(volume) + if(water) + water.add_charge(volume) if(T.reagents) volume = T.reagents.total_volume - water.add_charge(volume) + if(water) + water.add_charge(volume) if(patient == T) patient_laststat = null patient = null @@ -612,7 +621,7 @@ for(var/tech in tech_item.origin_tech) files.UpdateTech(tech, tech_item.origin_tech[tech]) synced = FALSE - if(volume) + if(volume && water) water.add_charge(volume) if(recycles && T.matter) for(var/material in T.matter) @@ -620,14 +629,14 @@ if(istype(T,/obj/item/stack)) var/obj/item/stack/stack = T total_material *= stack.get_amount() - if(material == MAT_STEEL) + if(material == MAT_STEEL && metal) metal.add_charge(total_material) - if(material == "glass") + if(material == "glass" && glass) glass.add_charge(total_material) if(decompiler) - if(material == "plastic") + if(material == "plastic" && plastic) plastic.add_charge(total_material) - if(material == "wood") + if(material == "wood" && wood) wood.add_charge(total_material) drain(-50 * digested) else if(istype(target,/obj/effect/decal/remains)) @@ -724,4 +733,11 @@ icon_state = "sleeperert" injection_chems = list("inaprovaline", "paracetamol") // short list +/obj/item/device/dogborg/sleeper/compactor/trauma //Trauma borg belly + name = "Recovery Belly" + desc = "A downgraded model of the medihound sleeper." + icon_state = "sleeper" + injection_chems = list("inaprovaline", "dexalin", "bicaridine", "anti_toxin", "spaceacillin", "paracetamol") + max_item_count = 1 + #undef SLEEPER_INJECT_COST diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index 9972a80b92..57309dd427 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -125,7 +125,6 @@ /obj/item/slimepotion, /obj/item/slime_extract, /obj/item/weapon/reagent_containers/food/snacks/monkeycube - ) /obj/item/weapon/gripper/circuit @@ -180,7 +179,8 @@ desc = "A specialized grasping tool used to preserve and manipulate organic material." can_hold = list( - /obj/item/organ + /obj/item/organ, + /obj/item/device/nif //NIFs can be slapped in during surgery ) /obj/item/weapon/gripper/no_use/organ/Entered(var/atom/movable/AM) @@ -208,7 +208,8 @@ /obj/item/organ/external, /obj/item/organ/internal/brain, //to insert into MMIs, /obj/item/organ/internal/cell, - /obj/item/organ/internal/eyes/robot + /obj/item/organ/internal/eyes/robot, + /obj/item/device/nif //NIFs can be slapped in during surgery ) /obj/item/weapon/gripper/no_use/mech diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station.dm b/code/modules/mob/living/silicon/robot/robot_modules/station.dm index d6a7ee6caa..ad800ed257 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/station.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/station.dm @@ -261,6 +261,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/weapon/surgical/bonesetter/cyborg(src) src.modules += new /obj/item/weapon/surgical/circular_saw/cyborg(src) src.modules += new /obj/item/weapon/surgical/surgicaldrill/cyborg(src) + src.modules += new /obj/item/weapon/surgical/bioregen/cyborg(src) //VoreStation Edit: LET ME SUCC src.modules += new /obj/item/weapon/gripper/no_use/organ(src) src.modules += new /obj/item/weapon/gripper/medical(src) src.modules += new /obj/item/weapon/shockpaddles/robot(src) @@ -607,7 +608,6 @@ var/global/list/robot_modules = list( LANGUAGE_SIIK = 1, LANGUAGE_AKHANI = 1, LANGUAGE_SKRELLIAN = 1, - LANGUAGE_SKRELLIANFAR = 0, LANGUAGE_ROOTLOCAL = 0, LANGUAGE_TRADEBAND = 1, LANGUAGE_GUTTER = 1, diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm b/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm index 45935c90be..666e78edc7 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm @@ -52,6 +52,7 @@ robot_modules["BoozeHound"] = /obj/item/weapon/robot_module/robot/booze robot_modules["KMine"] = /obj/item/weapon/robot_module/robot/kmine robot_modules["Stray"] = /obj/item/weapon/robot_module/robot/stray + robot_modules["TraumaHound"] = /obj/item/weapon/robot_module/robot/medical/trauma return 1 //Just add a new proc with the robot_module type if you wish to run some other vore code @@ -274,20 +275,27 @@ src.modules += new /obj/item/device/healthanalyzer(src) // See who's hurt specificially. src.modules += new /obj/item/borg/sight/hud/med(src) //See who's hurt generally. src.modules += new /obj/item/weapon/reagent_containers/syringe(src) //In case the chemist is nice! - src.modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src)//For holding the chemicals when the chemist is nice + src.modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src)//For holding the chemicals when the chemist is nice, made it the large variant in 2022 src.modules += new /obj/item/device/sleevemate(src) //Lets them scan people. src.modules += new /obj/item/weapon/shockpaddles/robot/hound(src) //Paws of life src.modules += new /obj/item/weapon/inflatable_dispenser/robot(src) //This is kinda important for rescuing people without making it worse for everyone + src.modules += new /obj/item/weapon/gripper/medical(src) //Let them do literally anything in medbay other than patch external damage and lick people + src.modules += new /obj/item/weapon/reagent_containers/dropper/industrial(src) //dropper is nice to have for so much actually src.emag = new /obj/item/weapon/dogborg/pounce(src) //Pounce - var/datum/matter_synth/medicine = new /datum/matter_synth/medicine(2000) + var/datum/matter_synth/medicine = new /datum/matter_synth/medicine(10000) synths += medicine var/obj/item/stack/medical/advanced/clotting/C = new (src) + var/obj/item/stack/medical/splint/S = new /obj/item/stack/medical/splint(src) C.uses_charge = 1 - C.charge_costs = list(1000) + C.charge_costs = list(5000) C.synths = list(medicine) + S.uses_charge = 1 + S.charge_costs = list(1000) + S.synths = list(medicine) src.modules += C + src.modules += S var/datum/matter_synth/water = new /datum/matter_synth(500) water.name = "Water reserves" @@ -323,6 +331,72 @@ R.verbs |= /mob/living/silicon/robot/proc/rest_style ..() +/obj/item/weapon/robot_module/robot/medical/trauma + name = "traumahound robot module" + channels = list("Medical" = 1) + networks = list(NETWORK_MEDICAL) + subsystems = list(/mob/living/silicon/proc/subsystem_crew_monitor) + pto_type = PTO_MEDICAL + can_be_pushed = 0 + sprites = list( + "Traumahound" = "traumavale", + ) + +/obj/item/weapon/robot_module/robot/medical/trauma/New(var/mob/living/silicon/robot/R) + src.modules += new /obj/item/device/healthanalyzer(src) + src.modules += new /obj/item/weapon/dogborg/jaws/small(src) + src.modules += new /obj/item/device/dogborg/boop_module(src) + src.modules += new /obj/item/weapon/surgical/scalpel/cyborg(src) + src.modules += new /obj/item/weapon/surgical/hemostat/cyborg(src) + src.modules += new /obj/item/weapon/surgical/retractor/cyborg(src) + src.modules += new /obj/item/weapon/surgical/cautery/cyborg(src) + src.modules += new /obj/item/weapon/surgical/bonegel/cyborg(src) + src.modules += new /obj/item/weapon/surgical/FixOVein/cyborg(src) + src.modules += new /obj/item/weapon/surgical/bonesetter/cyborg(src) + src.modules += new /obj/item/weapon/surgical/circular_saw/cyborg(src) + src.modules += new /obj/item/weapon/gripper/no_use/organ(src) + src.modules += new /obj/item/weapon/gripper/medical(src) + src.modules += new /obj/item/weapon/shockpaddles/robot(src) + src.modules += new /obj/item/weapon/reagent_containers/dropper(src) // Allows surgeon borg to fix necrosis + src.modules += new /obj/item/weapon/reagent_containers/syringe(src) + src.emag = new /obj/item/weapon/reagent_containers/spray(src) + src.emag.reagents.add_reagent("pacid", 250) + src.emag.name = "Polyacid spray" + + var/datum/matter_synth/water = new /datum/matter_synth(500) + water.name = "Water reserves" + water.recharge_rate = 0 + R.water_res = water + synths += water + + var/obj/item/device/dogborg/tongue/T = new /obj/item/device/dogborg/tongue(src) + T.water = water + src.modules += T + + var/obj/item/weapon/reagent_containers/borghypo/hound/H = new /obj/item/weapon/reagent_containers/borghypo/hound/trauma(src) + H.water = water + src.modules += H + + var/obj/item/device/dogborg/sleeper/compactor/trauma/B = new /obj/item/device/dogborg/sleeper/compactor/trauma(src) //So they can nom people and heal them + B.water = water + src.modules += B + + R.icon = 'icons/mob/widerobot_trauma_vr.dmi' + R.wideborg_dept = 'icons/mob/widerobot_trauma_vr.dmi' + R.hands.icon = 'icons/mob/screen1_robot_vr.dmi' + R.ui_style_vr = TRUE + R.pixel_x = -16 + R.old_x = -16 + R.default_pixel_x = -16 + R.dogborg = TRUE + R.wideborg = TRUE + R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill + R.verbs |= /mob/living/silicon/robot/proc/robot_mount + R.verbs |= /mob/living/proc/toggle_rider_reins + R.verbs |= /mob/living/proc/shred_limb + R.verbs |= /mob/living/silicon/robot/proc/rest_style + ..() + /obj/item/weapon/robot_module/robot/ert name = "Emergency Responce module" channels = list("Security" = 1) @@ -493,7 +567,15 @@ //Added a circuit gripper src.modules += new /obj/item/weapon/gripper/circuit(src) src.modules += new /obj/item/weapon/gripper/no_use/organ/robotics(src) + //src.modules += new /obj/item/weapon/surgical/scalpel/cyborg(src) //these are on the normal one, but do not appear to have a purpose other than borging + //src.modules += new /obj/item/weapon/surgical/circular_saw/cyborg(src) //so I am leaving them here but commented out because robotics no do the borging w/o medical + src.modules += new /obj/item/weapon/portable_destructive_analyzer(src) //destructive analyzer option for pref respect while also being able to do job src.modules += new /obj/item/weapon/gripper/no_use/mech(src) + src.modules += new /obj/item/weapon/shockpaddles/robot/jumper(src) //unkilling synths may be important actually + src.modules += new /obj/item/weapon/melee/baton/slime/robot(src) //save the xenobio from themselves + src.modules += new /obj/item/weapon/gun/energy/taser/xeno/robot(src) //save the xenobio from themselves from a distance + src.modules += new /obj/item/device/xenoarch_multi_tool(src) //go find fancy rock + src.modules += new /obj/item/weapon/pickaxe/excavationdrill(src) //go get fancy rock src.emag = new /obj/item/weapon/hand_tele(src) var/datum/matter_synth/water = new /datum/matter_synth(500) @@ -586,27 +668,27 @@ //Painfully slow charger regen but high capacity. Also starts with low amount. var/datum/matter_synth/metal = new /datum/matter_synth/metal() metal.name = "Steel reserves" - metal.recharge_rate = 100 + metal.recharge_rate = 500 metal.max_energy = 50000 metal.energy = 10000 var/datum/matter_synth/glass = new /datum/matter_synth/glass() glass.name = "Glass reserves" - glass.recharge_rate = 100 + glass.recharge_rate = 500 glass.max_energy = 50000 glass.energy = 10000 var/datum/matter_synth/wood = new /datum/matter_synth/wood() wood.name = "Wood reserves" - wood.recharge_rate = 100 + wood.recharge_rate = 500 wood.max_energy = 50000 wood.energy = 10000 var/datum/matter_synth/plastic = new /datum/matter_synth/plastic() plastic.name = "Plastic reserves" - plastic.recharge_rate = 100 + plastic.recharge_rate = 500 plastic.max_energy = 50000 plastic.energy = 10000 var/datum/matter_synth/plasteel = new /datum/matter_synth/plasteel() plasteel.name = "Plasteel reserves"// Adding plasteel synthesizer to move in-line with Engiborg. - plasteel.recharge_rate = 100 + plasteel.recharge_rate = 250 plasteel.max_energy = 20000 plasteel.energy = 10000 var/datum/matter_synth/water = new /datum/matter_synth(500) @@ -975,7 +1057,7 @@ N.add_reagent("beer2", 50) src.emag.name = "Mickey Finn's Special Brew" R.icon = 'icons/mob/widerobot_colors_yw.dmi' //YW edit - R.wideborg_dept = 'icons/mob/widerobot_colors_yw.dmi' + R.wideborg_dept = 'icons/mob/widerobot_colors_yw.dmi' //YW edit R.hands.icon = 'icons/mob/screen1_robot_vr.dmi' R.ui_style_vr = TRUE R.pixel_x = -16 diff --git a/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm b/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm index d8f7aa8a3a..324e4afabc 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm @@ -10,7 +10,6 @@ LANGUAGE_SIIK = 0, LANGUAGE_AKHANI = 0, LANGUAGE_SKRELLIAN = 0, - LANGUAGE_SKRELLIANFAR = 0, LANGUAGE_ROOTLOCAL = 0, LANGUAGE_GUTTER = 1, LANGUAGE_SCHECHI = 0, diff --git a/code/modules/mob/living/simple_mob/defense.dm b/code/modules/mob/living/simple_mob/defense.dm index 1340beb8d5..7c31c3c83d 100644 --- a/code/modules/mob/living/simple_mob/defense.dm +++ b/code/modules/mob/living/simple_mob/defense.dm @@ -45,7 +45,22 @@ if(I_HURT) var/armor = run_armor_check(def_zone = null, attack_flag = "melee") - apply_damage(damage = harm_intent_damage, damagetype = BURN, def_zone = null, blocked = armor, blocked = resistance, used_weapon = null, sharp = FALSE, edge = FALSE) + if(istype(L,/mob/living/carbon/human)) //VOREStation EDIT START Is it a human? + var/mob/living/carbon/human/attacker = L //We are a human! + var/datum/unarmed_attack/attack = attacker.get_unarmed_attack(src, BP_TORSO) //What attack are we using? Also, just default to attacking the chest. + var/rand_damage = rand(1, 5) //Like normal human attacks, let's randomize the damage... + var/real_damage = rand_damage //Let's go ahead and start calculating our damage. + var/hit_dam_type = attack.damage_type //Let's get the type of damage. Brute? Burn? Defined by the unarmed_attack. + real_damage += attack.get_unarmed_damage(attacker) //Add the damage that their special attack has. Some have 0. Some have 15. + if(real_damage <= damage_threshold) + L.visible_message("\The [L] uselessly hits \the [src]!") + L.do_attack_animation(src) + return + apply_damage(damage = real_damage, damagetype = hit_dam_type, def_zone = null, blocked = armor, blocked = resistance, used_weapon = null, sharp = FALSE, edge = FALSE) + L.visible_message("\The [L] [pick(attack.attack_verb)] \the [src]!") + L.do_attack_animation(src) + return //VOREStation EDIT END + apply_damage(damage = harm_intent_damage, damagetype = BRUTE, def_zone = null, blocked = armor, blocked = resistance, used_weapon = null, sharp = FALSE, edge = FALSE) //VOREStation EDIT Somebody set this to burn instead of brute. L.visible_message("\The [L] [response_harm] \the [src]!") L.do_attack_animation(src) diff --git a/code/modules/mob/living/simple_mob/simple_mob_vr.dm b/code/modules/mob/living/simple_mob/simple_mob_vr.dm index ebbb7bd73e..72cf906d67 100644 --- a/code/modules/mob/living/simple_mob/simple_mob_vr.dm +++ b/code/modules/mob/living/simple_mob/simple_mob_vr.dm @@ -51,6 +51,7 @@ var/obj/item/device/radio/headset/mob_headset/mob_radio //Adminbus headset for simplemob shenanigans. does_spin = FALSE can_be_drop_pred = TRUE // Mobs are pred by default. + var/damage_threshold = 0 //For some mobs, they have a damage threshold required to deal damage to them. // Release belly contents before being gc'd! 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 16253f4b7f..7a6a3458d9 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 @@ -160,7 +160,7 @@ else to_chat(user, "\The [src] takes a bite of \the [O].") if(user != src) - to_chat(user, "\The [user] feeds \the [O] to you.") + to_chat(src, "\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) @@ -714,7 +714,7 @@ //Admin-spawn only catslugs below - Expect overpowered things & silliness below //============================================================================= -//Deathsquad catslug +//Deathsquad catslug /mob/living/simple_mob/vore/alienanimals/catslug/custom/spaceslug/deathslug name = "Asset Purrtection" desc = "What are you doing staring at this angry little fella? Run." @@ -739,7 +739,7 @@ "bomb" = 40, "bio" = 100, "rad" = 100 - ) + ) minbodytemp = 0 maxbodytemp = 5000 @@ -751,8 +751,8 @@ mob_radio = new /obj/item/device/radio/headset/mob_headset(src) mob_radio.frequency = DTH_FREQ //Can't tell if bugged, deathsquad freq in general seems broken mobcard.access |= get_all_station_access() - -//Syndicate catslug + +//Syndicate catslug /mob/living/simple_mob/vore/alienanimals/catslug/custom/spaceslug/syndislug name = "Mercenyary" desc = "What are you doing staring at this crimson-hardsuit wearing angry little fella? Run." @@ -769,7 +769,7 @@ health = 100 taser_kill = 0 melee_damage_lower = 15 - melee_damage_upper = 20 + melee_damage_upper = 20 mob_size = MOB_MEDIUM //Something something hardsuits are heavy. siemens_coefficient = 0 armor = list( @@ -780,7 +780,7 @@ "bomb" = 80, "bio" = 100, "rad" = 60 - ) + ) minbodytemp = 0 maxbodytemp = 5000 @@ -797,7 +797,7 @@ mob_radio.recalculateChannels(1) mobcard.access |= get_all_station_access() -//ERT catslug +//ERT catslug /mob/living/simple_mob/vore/alienanimals/catslug/custom/spaceslug/responseslug name = "Emeowgency Responder" desc = "The cavalry has arrived." @@ -822,7 +822,7 @@ "bomb" = 30, "bio" = 100, "rad" = 100 - ) + ) minbodytemp = 0 maxbodytemp = 5000 @@ -834,7 +834,7 @@ /mob/living/simple_mob/vore/alienanimals/catslug/custom/spaceslug/responseslug/Initialize() . = ..() mob_radio = new /obj/item/device/radio/headset/mob_headset(src) - mob_radio.frequency = ERT_FREQ + mob_radio.frequency = ERT_FREQ mob_radio.centComm = 1 mob_radio.ks2type = /obj/item/device/encryptionkey/ert mob_radio.keyslot2 = new /obj/item/device/encryptionkey/ert(mob_radio) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/spookyghost.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/spookyghost.dm index 0520bd5351..3d7c0d4059 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/spookyghost.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/spookyghost.dm @@ -192,7 +192,7 @@ . = ..() icon_living = "spookyghost-[rand(1,2)]" icon_state = icon_living - addtimer(CALLBACK(src, .proc/death), 2 MINUTES) + addtimer(CALLBACK(src, .proc/death), 35 SECONDS) update_icon() /datum/ai_holder/simple_mob/melee/space_ghost diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm index 7b8b777972..266174b7c3 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm @@ -79,7 +79,7 @@ if( ishuman(AM) ) if(!stat) var/mob/M = AM - M.visible_message("[bicon(src)] Squeek!") + M.visible_message("\icon[src][bicon(src)] Squeek!") playsound(src, 'sound/effects/mouse_squeak.ogg', 35, 1) ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/goose.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/goose.dm index c4f41bd3ba..840b424994 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/goose.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/goose.dm @@ -47,4 +47,12 @@ add_modifier(/datum/modifier/berserk, 30 SECONDS) /decl/mob_organ_names/goose - hit_zones = list("head", "chest", "left leg", "right leg", "left wing", "right wing", "neck") \ No newline at end of file + hit_zones = list("head", "chest", "left leg", "right leg", "left wing", "right wing", "neck") + +/mob/living/simple_mob/animal/space/goose/white + icon = 'icons/mob/animal_vr.dmi' + icon_state = "whitegoose" + icon_living = "whitegoose" + icon_dead = "whitegoose_dead" + name = "white goose" + desc = "And just when you thought it was a lovely day..." \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/mecha.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/mecha.dm index e43caff8c3..eaa796f45c 100644 --- a/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/mecha.dm +++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/mecha.dm @@ -13,6 +13,7 @@ turn_sound = 'sound/mecha/mechturn.ogg' maxHealth = 300 mob_size = MOB_LARGE + damage_threshold = 5 //Anything that's 5 or less damage will not do damage. organ_names = /decl/mob_organ_names/mecha diff --git a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm index 33d2494884..83910850e3 100644 --- a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm +++ b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm @@ -25,7 +25,7 @@ softfall = TRUE //Beings made of Hellmarble and powered by the tears of the damned are not concerned with mortal things such as 'gravity'. parachuting = TRUE - has_langs = list(LANGUAGE_GALCOM, LANGUAGE_CULT, LANGUAGE_OCCULT) + has_langs = list(LANGUAGE_GALCOM, LANGUAGE_CULT) has_eye_glow = TRUE diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/c_pet.dm b/code/modules/mob/living/simple_mob/subtypes/vore/c_pet.dm index e4e58f75dc..4b36fb7b1e 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/c_pet.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/c_pet.dm @@ -39,7 +39,7 @@ "rad" = 0 ) - has_langs = list("Coulrian") + has_langs = list("Animal") /mob/living/simple_mob/animal/passive/honkpet/attack_hand(mob/living/user as mob) if(user.a_intent == I_DISARM) diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm b/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm index 706031ce78..48953e15a8 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm @@ -11,6 +11,31 @@ verbs |= /mob/living/simple_mob/proc/set_name verbs |= /mob/living/simple_mob/proc/set_desc + ooc_notes = client.prefs.metadata + digestable = client.prefs_vr.digestable + devourable = client.prefs_vr.devourable + absorbable = client.prefs_vr.absorbable + feeding = client.prefs_vr.feeding + can_be_drop_prey = client.prefs_vr.can_be_drop_prey + can_be_drop_pred = client.prefs_vr.can_be_drop_pred + allow_inbelly_spawning = client.prefs_vr.allow_inbelly_spawning + allow_spontaneous_tf = client.prefs_vr.allow_spontaneous_tf + digest_leave_remains = client.prefs_vr.digest_leave_remains + allowmobvore = client.prefs_vr.allowmobvore + permit_healbelly = client.prefs_vr.permit_healbelly + noisy = client.prefs_vr.noisy + selective_preference = client.prefs_vr.selective_preference + + drop_vore = client.prefs_vr.drop_vore + stumble_vore = client.prefs_vr.stumble_vore + slip_vore = client.prefs_vr.slip_vore + + resizable = client.prefs_vr.resizable + show_vore_fx = client.prefs_vr.show_vore_fx + step_mechanics_pref = client.prefs_vr.step_mechanics_pref + pickup_pref = client.prefs_vr.pickup_pref + + /mob/living/simple_mob/proc/set_name() set name = "Set Name" set desc = "Sets your mobs name. You only get to do this once." diff --git a/code/modules/mob/living/voice/voice.dm b/code/modules/mob/living/voice/voice.dm index 0e9e805dc9..2752292ee2 100644 --- a/code/modules/mob/living/voice/voice.dm +++ b/code/modules/mob/living/voice/voice.dm @@ -83,7 +83,7 @@ var/new_name = sanitizeSafe(tgui_input_text(src, "Who would you like to be now?", "Communicator", src.client.prefs.real_name, MAX_NAME_LEN), MAX_NAME_LEN) if(new_name) if(comm) - comm.visible_message("[bicon(comm)] [src.name] has left, and now you see [new_name].") + comm.visible_message("\icon[comm][bicon(comm)] [src.name] has left, and now you see [new_name].") //Do a bit of logging in-case anyone tries to impersonate other characters for whatever reason. var/msg = "[src.client.key] ([src]) has changed their communicator identity's name to [new_name]." message_admins(msg) diff --git a/code/modules/mob/new_player/sprite_accessories_ear_vr.dm b/code/modules/mob/new_player/sprite_accessories_ear_vr.dm index 77e1a8348e..f11edd8192 100644 --- a/code/modules/mob/new_player/sprite_accessories_ear_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_ear_vr.dm @@ -850,4 +850,13 @@ icon_state = "bunny-tall" extra_overlay = "bunny-tall-inner" do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/altevian + name = "Altevian Ears" + desc = "" + icon = 'icons/mob/vore/ears_vr.dmi' + icon_state = "altevian" + extra_overlay = "altevian-inner" + do_colouration = 1 color_blend_mode = ICON_MULTIPLY \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories_extra_vr.dm b/code/modules/mob/new_player/sprite_accessories_extra_vr.dm index 742480858c..aa01f6c465 100644 --- a/code/modules/mob/new_player/sprite_accessories_extra_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_extra_vr.dm @@ -3,7 +3,7 @@ /datum/sprite_accessory/marking //Override for base markings color_blend_mode = ICON_ADD - species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //This lets all races use + species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) //This lets all races use /datum/sprite_accessory/marking/vr_vulp_belly name = "belly fur (Vulp)" @@ -850,4 +850,39 @@ icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "thunderthighs" color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_LEG,BP_R_LEG) \ No newline at end of file + body_parts = list(BP_L_LEG,BP_R_LEG) + +/datum/sprite_accessory/marking/vr_altevian_snout + name = "Altevian Snout" + icon = 'icons/mob/human_races/markings_vr.dmi' + icon_state = "altevian-snout" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr_altevian_chin + name = "Altevian Chin" + icon = 'icons/mob/human_races/markings_vr.dmi' + icon_state = "altevian-chin" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr_altevian_nose + name = "Altevian Nose" + icon = 'icons/mob/human_races/markings_vr.dmi' + icon_state = "altevian-nose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr_altevian_fangs + name = "Altevian Fangs" + icon = 'icons/mob/human_races/markings_vr.dmi' + icon_state = "altevian-fangs" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr_altevian_incisors + name = "Altevian Incisors" + icon = 'icons/mob/human_races/markings_vr.dmi' + icon_state = "altevian-incisors" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories_tail.dm b/code/modules/mob/new_player/sprite_accessories_tail.dm index 06dcdb9ebb..f5b6aefe4a 100644 --- a/code/modules/mob/new_player/sprite_accessories_tail.dm +++ b/code/modules/mob/new_player/sprite_accessories_tail.dm @@ -25,6 +25,10 @@ var/clip_mask_state = null //Icon state to generate clip mask. Clip mask is used to 'clip' off the lower part of clothing such as jumpsuits & full suits. var/icon/clip_mask = null //Instantiated clip mask of given icon and state + // VOREStation Edit: Taur Loafing + var/can_loaf = FALSE + var/loaf_offset = 0 + //species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) //Removing Polaris whitelits, ones we need are defined in our files /datum/sprite_accessory/tail/New() diff --git a/code/modules/mob/new_player/sprite_accessories_tail_vr.dm b/code/modules/mob/new_player/sprite_accessories_tail_vr.dm index a1c1034be5..cf9632ccda 100644 --- a/code/modules/mob/new_player/sprite_accessories_tail_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_tail_vr.dm @@ -11,6 +11,8 @@ do_colouration = 0 //Set to 1 to enable coloration using the tail color. species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //This lets all races use + var/list/lower_layer_dirs = list(SOUTH) + /datum/sprite_accessory/tail/New() . = ..() if(clip_mask_icon && clip_mask_state) @@ -1175,6 +1177,14 @@ color_blend_mode = ICON_MULTIPLY ckeys_allowed = list("prettiebyrd") +/datum/sprite_accessory/tail/altevian + name = "Altevian Tail" + icon = 'icons/mob/vore/tails_vr.dmi' + icon_state = "altevian" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + lower_layer_dirs = list(SOUTH, WEST) + /datum/sprite_accessory/tail/tentacle name = "Tentacle, colorable (vwag)" desc = "" @@ -1201,4 +1211,4 @@ /datum/sprite_accessory/tail/longtail/shadekin_tail/shadekin_tail_long name = "Shadekin Long Tail" - icon_state = "shadekin_long_s" + icon_state = "shadekin_long_s" \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories_taur_vr.dm b/code/modules/mob/new_player/sprite_accessories_taur_vr.dm index 2a574510b0..4eee002177 100644 --- a/code/modules/mob/new_player/sprite_accessories_taur_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_taur_vr.dm @@ -419,6 +419,8 @@ extra_overlay = "drake_markings" suit_sprites = 'icons/mob/taursuits_drake_vr.dmi' icon_sprite_tag = "drake" + can_loaf = TRUE // VOREStation Edit: Taur Loafing + loaf_offset = 6 // VOREStation Edit: Taur Loafing /datum/sprite_accessory/tail/taur/ch/fatdrake name = "Drake (Fat Taur dual-color)" @@ -614,4 +616,4 @@ extra_overlay2 = "noodle_markings_2" suit_sprites = 'icons/mob/taursuits_noodle_vr.dmi' clip_mask_state = "taur_clip_mask_noodle" - icon_sprite_tag = "noodle" \ No newline at end of file + icon_sprite_tag = "noodle" diff --git a/code/modules/mob/new_player/sprite_accessories_vr.dm b/code/modules/mob/new_player/sprite_accessories_vr.dm index 66a2cc952b..bf9ee1b263 100644 --- a/code/modules/mob/new_player/sprite_accessories_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_vr.dm @@ -6,7 +6,7 @@ /datum/sprite_accessory/hair - species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_SHADEKIN_YW) //This lets all races use the default hairstyles. + species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_SHADEKIN_YW) //This lets all races use the default hairstyles. // yw edit shadekin /datum/sprite_accessory/hair/astolfo name = "Astolfo" @@ -91,7 +91,7 @@ name = "Bald" icon_state = "bald" gender = MALE - species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //Lets all the races be bald if they want. + species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) //Lets all the races be bald if they want. /datum/sprite_accessory/hair/ponytail6_fixed name = "Ponytail 6 but fixed" @@ -472,20 +472,20 @@ /datum/sprite_accessory/facial_hair icon = 'icons/mob/human_face_or_vr.dmi' color_blend_mode = ICON_MULTIPLY - species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //This lets all races use the facial hair styles. + species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) //This lets all races use the facial hair styles. /datum/sprite_accessory/facial_hair/shaved name = "Shaved" icon_state = "bald" gender = NEUTER - species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //This needed to be manually defined, apparantly. + species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) //This needed to be manually defined, apparantly. /datum/sprite_accessory/facial_hair/neck_fluff name = "Neck Fluff" icon = 'icons/mob/human_face_or_vr.dmi' icon_state = "facial_neckfluff" gender = NEUTER - species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) + species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) /datum/sprite_accessory/facial_hair/vulp_none name = "None" diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm index f10ce85b86..d8ed1c311e 100644 --- a/code/modules/mob/say_vr.dm +++ b/code/modules/mob/say_vr.dm @@ -67,6 +67,8 @@ else spawn(0) M.show_message(message, 2) + if(M.is_preference_enabled(/datum/client_preference/subtle_sounds)) + M << sound('sound/talksounds/subtle_sound.ogg', volume = 50) for(var/obj/O as anything in vis_objs) spawn(0) @@ -145,10 +147,14 @@ else pb = db.pred_body to_chat(pb, "The captive mind of \the [M] thinks, \"[message]\"") //To our pred if dominated brain + if(pb.is_preference_enabled(/datum/client_preference/subtle_sounds)) + pb << sound('sound/talksounds/subtle_sound.ogg', volume = 50) f = TRUE else if(M.absorbed && isbelly(M.loc)) pb = M.loc.loc to_chat(pb, "\The [M] thinks, \"[message]\"") //To our pred if absorbed + if(pb.is_preference_enabled(/datum/client_preference/subtle_sounds)) + pb << sound('sound/talksounds/subtle_sound.ogg', volume = 50) f = TRUE if(pb) //We are prey, let's do the prey thing. @@ -157,11 +163,15 @@ if(istype(I, /mob/living/dominated_brain) && I != M) var/mob/living/dominated_brain/db = I to_chat(db, "The captive mind of \the [M] thinks, \"[message]\"") //To any dominated brains in the pred + if(db.is_preference_enabled(/datum/client_preference/subtle_sounds)) + db << sound('sound/talksounds/subtle_sound.ogg', volume = 50) f = TRUE for(var/B in pb.vore_organs) for(var/mob/living/L in B) if(L.absorbed && L != M && L.ckey) to_chat(L, "\The [M] thinks, \"[message]\"") //To any absorbed people in the pred + if(L.is_preference_enabled(/datum/client_preference/subtle_sounds)) + L << sound('sound/talksounds/subtle_sound.ogg', volume = 50) f = TRUE //Let's also check and see if there's anyone inside of us to send the message to. @@ -169,18 +179,26 @@ if(istype(I, /mob/living/dominated_brain)) var/mob/living/dominated_brain/db = I to_chat(db, "\The [M] thinks, \"[message]\"") //To any dominated brains inside us + if(db.is_preference_enabled(/datum/client_preference/subtle_sounds)) + db << sound('sound/talksounds/subtle_sound.ogg', volume = 50) f = TRUE for(var/B in M.vore_organs) for(var/mob/living/L in B) if(L.absorbed) to_chat(L, "\The [M] thinks, \"[message]\"") //To any absorbed people inside us + if(L.is_preference_enabled(/datum/client_preference/subtle_sounds)) + L << sound('sound/talksounds/subtle_sound.ogg', volume = 50) f = TRUE if(f) //We found someone to send the message to if(pb) to_chat(M, "You think \"[message]\"") //To us if we are the prey + if(M.is_preference_enabled(/datum/client_preference/subtle_sounds)) + M << sound('sound/talksounds/subtle_sound.ogg', volume = 50) else to_chat(M, "You think \"[message]\"") //To us if we are the pred + if(M.is_preference_enabled(/datum/client_preference/subtle_sounds)) + M << sound('sound/talksounds/subtle_sound.ogg', volume = 50) for (var/mob/G in player_list) if (istype(G, /mob/new_player)) continue @@ -225,11 +243,15 @@ else pb = db.pred_body to_chat(pb, "\The [M] [message]") //To our pred if dominated brain + if(pb.is_preference_enabled(/datum/client_preference/subtle_sounds)) + pb << sound('sound/talksounds/subtle_sound.ogg', volume = 50) f = TRUE else if(M.absorbed && isbelly(M.loc)) pb = M.loc.loc to_chat(pb, "\The [M] [message]") //To our pred if absorbed + if(pb.is_preference_enabled(/datum/client_preference/subtle_sounds)) + pb << sound('sound/talksounds/subtle_sound.ogg', volume = 50) f = TRUE if(pb) //We are prey, let's do the prey thing. @@ -238,11 +260,15 @@ if(istype(I, /mob/living/dominated_brain) && I != M) var/mob/living/dominated_brain/db = I to_chat(db, "\The [M] [message]") //To any dominated brains in the pred + if(db.is_preference_enabled(/datum/client_preference/subtle_sounds)) + db << sound('sound/talksounds/subtle_sound.ogg', volume = 50) f = TRUE for(var/B in pb.vore_organs) for(var/mob/living/L in B) if(L.absorbed && L != M && L.ckey) to_chat(L, "\The [M] [message]") //To any absorbed people in the pred + if(L.is_preference_enabled(/datum/client_preference/subtle_sounds)) + L << sound('sound/talksounds/subtle_sound.ogg', volume = 50) f = TRUE //Let's also check and see if there's anyone inside of us to send the message to. @@ -250,18 +276,26 @@ if(istype(I, /mob/living/dominated_brain)) var/mob/living/dominated_brain/db = I to_chat(db, "\The [M] [message]") //To any dominated brains inside us + if(db.is_preference_enabled(/datum/client_preference/subtle_sounds)) + db << sound('sound/talksounds/subtle_sound.ogg', volume = 50) f = TRUE for(var/B in M.vore_organs) for(var/mob/living/L in B) if(L.absorbed) to_chat(L, "\The [M] [message]") //To any absorbed people inside us + if(L.is_preference_enabled(/datum/client_preference/subtle_sounds)) + L << sound('sound/talksounds/subtle_sound.ogg', volume = 50) f = TRUE if(f) //We found someone to send the message to if(pb) to_chat(M, "\The [M] [message]") //To us if we are the prey + if(M.is_preference_enabled(/datum/client_preference/subtle_sounds)) + M << sound('sound/talksounds/subtle_sound.ogg', volume = 50) else to_chat(M, "\The [M] [message]") //To us if we are the pred + if(M.is_preference_enabled(/datum/client_preference/subtle_sounds)) + M << sound('sound/talksounds/subtle_sound.ogg', volume = 50) for (var/mob/G in player_list) if (istype(G, /mob/new_player)) continue diff --git a/code/modules/nifsoft/nif.dm b/code/modules/nifsoft/nif.dm index d334b91c21..1ba7bb739f 100644 --- a/code/modules/nifsoft/nif.dm +++ b/code/modules/nifsoft/nif.dm @@ -383,7 +383,7 @@ You can also set the stat of a NIF to NIF_TEMPFAIL without any issues to disable last_notification = message // TGUI Hook - to_chat(human,"\[[bicon(src.big_icon)]NIF\] displays, \"[message]\"") + to_chat(human,"\[\icon[src.big_icon][bicon(src.big_icon)]NIF\] displays, \"[message]\"") if(prob(1)) human.visible_message("\The [human] [pick(look_messages)].") if(alert) human << bad_sound diff --git a/code/modules/nifsoft/nifsoft.dm b/code/modules/nifsoft/nifsoft.dm index f4f3135b8e..a684c696d7 100644 --- a/code/modules/nifsoft/nifsoft.dm +++ b/code/modules/nifsoft/nifsoft.dm @@ -377,3 +377,32 @@ ..() for(var/i = 0 to 7) new /obj/item/weapon/disk/nifsoft/mining(src) + +// Pilot Disk // +/obj/item/weapon/disk/nifsoft/pilot + name = "NIFSoft Uploader - Pilot" + desc = "Contains free NIFSofts useful for pilot members.\n\ + It has a small label: \n\ + \"Portable NIFSoft Installation Media. \n\ + Align ocular port with eye socket and depress red plunger.\"" + + icon_state = "pilot" + stored_organic = /datum/nifsoft/package/pilot + stored_synthetic = /datum/nifsoft/package/pilot_synth + +/datum/nifsoft/package/pilot + software = list(/datum/nifsoft/spare_breath) + +/datum/nifsoft/package/pilot_synth + software = list(/datum/nifsoft/pressure,/datum/nifsoft/heatsinks) + +/obj/item/weapon/storage/box/nifsofts_pilot + name = "pilot nifsoft uploaders" + desc = "A box of free nifsofts for pilot employees." + icon = 'icons/obj/boxes.dmi' + icon_state = "nifsoft_kit_pilot" + +/obj/item/weapon/storage/box/nifsofts_pilot/New() + ..() + for(var/i = 0 to 7) + new /obj/item/weapon/disk/nifsoft/pilot(src) \ No newline at end of file diff --git a/code/modules/nifsoft/software/13_soulcatcher.dm b/code/modules/nifsoft/software/13_soulcatcher.dm index a8f66619a6..04766a51e4 100644 --- a/code/modules/nifsoft/software/13_soulcatcher.dm +++ b/code/modules/nifsoft/software/13_soulcatcher.dm @@ -72,11 +72,11 @@ /datum/nifsoft/soulcatcher/proc/notify_into(var/message) var/sound = nif.good_sound - to_chat(nif.human,"\[[bicon(nif.big_icon)]NIF\] Soulcatcher displays, \"[message]\"") + to_chat(nif.human,"\[\icon[nif.big_icon][bicon(nif.big_icon)]NIF\] Soulcatcher displays, \"[message]\"") nif.human << sound for(var/mob/living/carbon/brain/caught_soul/CS as anything in brainmobs) - to_chat(CS,"\[[bicon(nif.big_icon)]NIF\] Soulcatcher displays, \"[message]\"") + to_chat(CS,"\[\icon[nif.big_icon][bicon(nif.big_icon)]NIF\] Soulcatcher displays, \"[message]\"") CS << sound /datum/nifsoft/soulcatcher/proc/say_into(var/message, var/mob/living/sender, var/mob/eyeobj) @@ -88,9 +88,9 @@ //Not AR Projecting else - to_chat(nif.human,"\[[bicon(nif.big_icon)]NIF\] [sender_name] speaks, \"[message]\"") + to_chat(nif.human,"\[\icon[nif.big_icon][bicon(nif.big_icon)]NIF\] [sender_name] speaks, \"[message]\"") for(var/mob/living/carbon/brain/caught_soul/CS as anything in brainmobs) - to_chat(CS,"\[[bicon(nif.big_icon)]NIF\] [sender_name] speaks, \"[message]\"") + to_chat(CS,"\[\icon[nif.big_icon][bicon(nif.big_icon)]NIF\] [sender_name] speaks, \"[message]\"") log_nsay(message,nif.human.real_name,sender) @@ -103,9 +103,9 @@ //Not AR Projecting else - to_chat(nif.human,"\[[bicon(nif.big_icon)]NIF\] [sender_name] [message]") + to_chat(nif.human,"\[\icon[nif.big_icon][bicon(nif.big_icon)]NIF\] [sender_name] [message]") for(var/mob/living/carbon/brain/caught_soul/CS as anything in brainmobs) - to_chat(CS,"\[[bicon(nif.big_icon)]NIF\] [sender_name] [message]") + to_chat(CS,"\[\icon[nif.big_icon][bicon(nif.big_icon)]NIF\] [sender_name] [message]") log_nme(message,nif.human.real_name,sender) diff --git a/code/modules/nifsoft/software/14_commlink.dm b/code/modules/nifsoft/software/14_commlink.dm index 75a04fc589..47b602e184 100644 --- a/code/modules/nifsoft/software/14_commlink.dm +++ b/code/modules/nifsoft/software/14_commlink.dm @@ -81,7 +81,7 @@ var/message = combined["formatted"] var/name_used = M.GetVoice() var/rendered = null - rendered = "[bicon(icon_object)] [name_used] [message]" + rendered = "\icon[icon_object][bicon(icon_object)] [name_used] [message]" mob.show_message(rendered, 2) //Not supported by the internal one diff --git a/code/modules/organs/internal/lungs.dm b/code/modules/organs/internal/lungs.dm index 8ec76a36d0..6e93222b2d 100644 --- a/code/modules/organs/internal/lungs.dm +++ b/code/modules/organs/internal/lungs.dm @@ -11,14 +11,26 @@ if(!owner) return - if(is_bruised()) + //VOREStation Edit Start Lungs were a surprisingly lethal cause of bloodloss. + if(is_broken()) if(prob(4)) - spawn owner?.custom_emote(VISIBLE_MESSAGE, "coughs up blood!") - owner.drip(10) - if(prob(8)) + spawn owner?.custom_emote(VISIBLE_MESSAGE, "coughs up a large amount of blood!") + var/bleeding_rng = rand(3,5) + owner.drip(bleeding_rng) + if(prob(8)) //This is a medical emergency. Will kill within minutes unless exceedingly lucky. spawn owner?.custom_emote(VISIBLE_MESSAGE, "gasps for air!") owner.AdjustLosebreath(15) + else if(is_bruised()) //Only bruised? That's an annoyance and can cause some more damage (via brainloss due to oxyloss) + if(prob(2)) //But let's not kill people too quickly. + spawn owner?.custom_emote(VISIBLE_MESSAGE, "coughs up a small amount of blood!") + var/bleeding_rng = rand(1,2) + owner.drip(bleeding_rng) + if(prob(4)) //Get to medical quickly. but shouldn't kill without exceedingly bad RNG. + spawn owner?.custom_emote(VISIBLE_MESSAGE, "gasps for air!") + owner.AdjustLosebreath(10) //Losebreath is a DoT that does 1:1 damage and prevents oxyloss healing via breathing. + //VOREStation Edit End + if(owner.internal_organs_by_name[O_BRAIN]) // As the brain starts having Trouble, the lungs start malfunctioning. var/obj/item/organ/internal/brain/Brain = owner.internal_organs_by_name[O_BRAIN] if(Brain.get_control_efficiency() <= 0.8) diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 8f5d5bc9a0..9ef9460c60 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -594,6 +594,8 @@ This function completely restores a damaged organ to perfect condition. return 1 else last_dam = brute_dam + burn_dam + if (number_wounds != 0) + return 1 if(germ_level) return 1 return 0 @@ -730,8 +732,8 @@ Note that amputating the affected organ does in fact remove the infection from t return for(var/datum/wound/W in wounds) - // wounds can disappear after 10 minutes at the earliest - if(W.damage <= 0 && W.created + 10 * 10 * 60 <= world.time) + // wounds used to be able to disappear after 10 minutes at the earliest, for now just remove them as soon as there is no damage + if(W.damage <= 0) wounds -= W continue // let the GC handle the deletion of the wound diff --git a/code/modules/organs/robolimbs_custom.dm b/code/modules/organs/robolimbs_custom.dm index 2cd26b7f4b..96d80669c1 100644 --- a/code/modules/organs/robolimbs_custom.dm +++ b/code/modules/organs/robolimbs_custom.dm @@ -175,3 +175,31 @@ VS Edit - anyone can select these. */ /obj/item/weapon/disk/limb/dsi_teshari company = "DSI - Teshari" + +/datum/robolimb/dsi_zorren + company = "DSI - Zorren" + desc = "This limb feels soft and fluffy, realistic design and squish. Seems a little mischievous. By Darkside Incorperated." + icon = 'icons/mob/human_races/cyberlimbs/DSIZorren/dsi_zorren.dmi' + blood_color = "#ffe2ff" + lifelike = 1 + unavailable_to_build = 1 + includes_tail = 1 + skin_tone = 1 + suggested_species = "Zorren" + +/obj/item/weapon/disk/limb/dsi_zorren + company = "DSI - Zorren" + +/datum/robolimb/dsi_fennec + company = "DSI - Fennec" + desc = "This limb feels soft and fluffy, realistic design and squish. Seems a little mischievous. By Darkside Incorperated." + icon = 'icons/mob/human_races/cyberlimbs/DSIFennec/dsi_fennec.dmi' + blood_color = "#ffe2ff" + lifelike = 1 + unavailable_to_build = 1 + includes_tail = 1 + skin_tone = 1 + suggested_species = "Fennec" + +/obj/item/weapon/disk/limb/dsi_fennec + company = "DSI - Fennec" diff --git a/code/modules/organs/subtypes/skrell.dm b/code/modules/organs/subtypes/skrell.dm index 3ac237c2b5..5f2d494105 100644 --- a/code/modules/organs/subtypes/skrell.dm +++ b/code/modules/organs/subtypes/skrell.dm @@ -25,7 +25,7 @@ /obj/item/organ/internal/voicebox/skrell icon_state = "skrell_larynx" - will_assist_languages = list(LANGUAGE_SKRELLIAN, LANGUAGE_SKRELLIANFAR) + will_assist_languages = list(LANGUAGE_SKRELLIAN) /obj/item/organ/internal/appendix/skrell icon_state = "skrell_appendix" diff --git a/code/modules/pda/app.dm b/code/modules/pda/app.dm index 93245c2a85..c86f9e507d 100644 --- a/code/modules/pda/app.dm +++ b/code/modules/pda/app.dm @@ -34,7 +34,7 @@ L = get(pda, /mob/living/silicon) if(L) - to_chat(L, "[bicon(pda)] [message]") + to_chat(L, "\icon[pda][bicon(pda)] [message]") SStgui.update_user_uis(L, pda) // Update the receiving user's PDA UI so that they can see the new message if(!notify_silent) diff --git a/code/modules/pda/messenger.dm b/code/modules/pda/messenger.dm index 6aa833fd83..73e0944a65 100644 --- a/code/modules/pda/messenger.dm +++ b/code/modules/pda/messenger.dm @@ -117,7 +117,7 @@ create_message(usr, P) if(href_list["target"] in conversations) // Need to make sure the message went through, if not welp. active_conversation = href_list["target"] - + /datum/data/pda/app/messenger/proc/create_message(var/mob/living/U, var/obj/item/device/pda/P) var/t = tgui_input_text(U, "Please enter message", name, null) @@ -178,7 +178,7 @@ SStgui.update_user_uis(U, P) // Update the sending user's PDA UI so that they can see the new message log_pda("(PDA: [src.name]) sent \"[t]\" to [P.name]", usr) - to_chat(U, "[bicon(pda)] Sent message to [P.owner] ([P.ownjob]), \"[t]\"") + to_chat(U, "\icon[pda][bicon(pda)] Sent message to [P.owner] ([P.ownjob]), \"[t]\"") else to_chat(U, "ERROR: Messaging server is not responding.") @@ -224,7 +224,7 @@ /datum/data/pda/app/messenger/multicast /datum/data/pda/app/messenger/multicast/receive_message(list/data, ref) . = ..() - + var/obj/item/device/pda/multicaster/M = pda if(!istype(M)) return diff --git a/code/modules/pda/pda.dm b/code/modules/pda/pda.dm index c61624e40b..e0408d024c 100644 --- a/code/modules/pda/pda.dm +++ b/code/modules/pda/pda.dm @@ -99,7 +99,7 @@ var/global/list/obj/item/device/pda/PDAs = list() S = 'sound/machines/twobeep.ogg' playsound(loc, S, 50, 1) for(var/mob/O in hearers(3, loc)) - O.show_message(text("[bicon(src)] *[ttone]*")) + O.show_message(text("\icon[src][bicon(src)] *[ttone]*")) /obj/item/device/pda/proc/set_ringtone() var/t = tgui_input_text(usr, "Please enter new ringtone", name, ttone) diff --git a/code/modules/planet/virgo3c_vr.dm b/code/modules/planet/virgo3c_vr.dm index 0555d29a3a..3afd9ca6c4 100644 --- a/code/modules/planet/virgo3c_vr.dm +++ b/code/modules/planet/virgo3c_vr.dm @@ -147,11 +147,11 @@ var/datum/planet/virgo3c/planet_virgo3c = null /datum/weather/virgo3c/clear name = "clear" transition_chances = list( - WEATHER_CLEAR = 60, - WEATHER_OVERCAST = 20, - WEATHER_LIGHT_SNOW = 1, - WEATHER_BLOOD_MOON = 1, - WEATHER_EMBERFALL = 0.5) + WEATHER_CLEAR = 120, + WEATHER_OVERCAST = 40, + WEATHER_LIGHT_SNOW = 2, + WEATHER_BLOOD_MOON = 2, + WEATHER_EMBERFALL = 1) transition_messages = list( "The sky clears up.", "The sky is visible.", diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 494e4152fc..8af3bbae52 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -366,7 +366,7 @@ GLOBAL_LIST_BOILERPLATE(all_singularities, /obj/singularity) // VOREStation Edit Start var/area/A = get_area(T) - if(A.forbid_events) //No going to dorms + if(A.forbid_singulo) //No going to dorms return 0 // VOREStation Edit End diff --git a/code/modules/projectiles/ammunition/ammo_boxes.dm b/code/modules/projectiles/ammunition/ammo_boxes.dm index 566b878c44..533a27bc4c 100644 --- a/code/modules/projectiles/ammunition/ammo_boxes.dm +++ b/code/modules/projectiles/ammunition/ammo_boxes.dm @@ -10,7 +10,7 @@ # # Use this format, followed by the caliber. For example, a shotgun's caliber # variable is "12g" as a result. Ergo, a shotgun round's path would have "a12g", -# or a magazine with shotgun shells would be "m12g" instead. To avoid confusion +# or a magazine with shotgun shells would be "m12g" instead. To avoid confusion // Avoid confusion my ass, when ammo is called only shells and suddenly switches to being called some obscure-ass military number # for developers and in-game admins spawning these items, stick to this format. # Likewise, when creating new rounds, the caliber variable should match whatever # the name says. diff --git a/code/modules/projectiles/guns/energy/special_vr.dm b/code/modules/projectiles/guns/energy/special_vr.dm index 73e878eed6..e7e2b70201 100644 --- a/code/modules/projectiles/guns/energy/special_vr.dm +++ b/code/modules/projectiles/guns/energy/special_vr.dm @@ -1,27 +1,102 @@ -/obj/item/weapon/gun/energy/ionrifle/pistol - projectile_type = /obj/item/projectile/ion/pistol // still packs a punch but no AoE - -/obj/item/weapon/gun/energy/ionrifle/weak - projectile_type = /obj/item/projectile/ion/small - -/obj/item/weapon/gun/energy/medigun //Adminspawn/ERT etc - name = "directed restoration system" - desc = "The BL-3 'Phoenix' is an adaptation on the ML-3 'Medbeam' design that channels the power of the beam into a single healing laser. It is highly energy-inefficient, but its medical power cannot be denied." - force = 5 - icon_state = "medbeam" - item_state = "medbeam" - icon = 'icons/obj/gun_vr.dmi' - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_guns_vr.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_guns_vr.dmi', - ) - slot_flags = SLOT_BELT - accuracy = 100 - fire_delay = 12 - fire_sound = 'sound/weapons/eluger.ogg' - - projectile_type = /obj/item/projectile/beam/medigun - - accept_cell_type = /obj/item/weapon/cell - cell_type = /obj/item/weapon/cell/high - charge_cost = 2500 \ No newline at end of file +/obj/item/weapon/gun/energy/ionrifle/pistol + projectile_type = /obj/item/projectile/ion/pistol // still packs a punch but no AoE + +/obj/item/weapon/gun/energy/ionrifle/weak + projectile_type = /obj/item/projectile/ion/small + +/obj/item/weapon/gun/energy/medigun //Adminspawn/ERT etc + name = "directed restoration system" + desc = "The BL-3 'Phoenix' is an adaptation on the ML-3 'Medbeam' design that channels the power of the beam into a single healing laser. It is highly energy-inefficient, but its medical power cannot be denied." + force = 5 + icon_state = "medbeam" + item_state = "medbeam" + icon = 'icons/obj/gun_vr.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_guns_vr.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_guns_vr.dmi', + ) + slot_flags = SLOT_BELT + accuracy = 100 + fire_delay = 12 + fire_sound = 'sound/weapons/eluger.ogg' + + projectile_type = /obj/item/projectile/beam/medigun + + accept_cell_type = /obj/item/weapon/cell + cell_type = /obj/item/weapon/cell/high + charge_cost = 2500 + +/obj/item/weapon/gun/energy/bfgtaser + name = "9000-series Ball Lightning Taser" + desc = "The brainchild of Hephaestus Industries Civil Pacification Division, the BLT-9000 was intended for riot control but despite enthusiastic interest from law-enforcement agencies across the Commonwealth and beyond, its indiscriminate nature led to it being banned from civilian use in virtually all jurisdictions. As a result, most pieces are found in the hands of collectors." + icon = 'icons/obj/gun_vr.dmi' + icon_state = "BFG" + fire_sound = 'sound/effects/phasein.ogg' + item_state = "mhdhowitzer" + wielded_item_state = "mhdhowitzer-wielded" //Placeholder + slot_flags = SLOT_BELT|SLOT_BACK + projectile_type = /obj/item/projectile/bullet/BFGtaser + fire_delay = 20 + w_class = ITEMSIZE_LARGE + one_handed_penalty = 90 // The thing's heavy and huge. + accuracy = 45 + charge_cost = 2400 //yes, this bad boy empties an entire weapon cell in one shot. What of it? + var/spinning_up = FALSE + +/obj/item/weapon/gun/energy/bfgtaser/Fire(atom/target, mob/living/user, clickparams, pointblank=0, reflex=0) + if(spinning_up) + return + if(!power_supply || !power_supply.check_charge(charge_cost)) + handle_click_empty(user) + return + + playsound(src, 'sound/weapons/chargeup.ogg', 100, 1) + spinning_up = TRUE + update_icon() + user.visible_message("[user] starts charging the [src]!", \ + "You start charging the [src]!") + if(do_after(user, 8, src)) + spinning_up = FALSE + ..() + else + spinning_up = FALSE + +/obj/item/projectile/beam/stun/weak/BFG + fire_sound = 'sound/effects/sparks6.ogg' + hitsound = 'sound/effects/sparks4.ogg' + hitsound_wall = 'sound/effects/sparks7.ogg' + +/obj/item/projectile/bullet/BFGtaser + name = "lightning ball" + icon = 'icons/obj/projectiles_vr.dmi' + icon_state = "minitesla" + speed=5 + damage = 100 + damage_type = AGONY + check_armour = "energy" + embed_chance = 0 + hitsound = 'sound/weapons/zapbang.ogg' + hitsound_wall = 'sound/weapons/effects/searwall.ogg' + var/zaptype = /obj/item/projectile/beam/stun/weak/BFG + +/obj/item/projectile/bullet/BFGtaser/process() + var/list/victims = list() + for(var/mob/living/M in living_mobs(world.view)) + if(M != firer) + victims += M + if(LAZYLEN(victims)) + var/target = pick(victims) + var/obj/item/projectile/P = new zaptype(src.loc) + P.launch_projectile_from_turf(target = target, target_zone = null, user = firer, params = null, angle_override = null, forced_spread = 0) + ..() + +/obj/item/projectile/bullet/BFGtaser/on_hit() + var/list/victims = list() + for(var/mob/living/M in living_mobs(world.view)) + if(M != firer) + victims += M + if(LAZYLEN(victims)) + for(var/target in victims) + var/obj/item/projectile/P = new zaptype(src.loc) + P.launch_projectile_from_turf(target = target, target_zone = null, user = firer, params = null, angle_override = null, forced_spread = 0) + ..() \ No newline at end of file diff --git a/code/modules/projectiles/guns/toy.dm b/code/modules/projectiles/guns/toy.dm index a4ef0dbf3b..22f8ef9f74 100644 --- a/code/modules/projectiles/guns/toy.dm +++ b/code/modules/projectiles/guns/toy.dm @@ -54,6 +54,19 @@ handle_casings = null recoil = null //it's a toy +/* + * Moist Nugget + */ +/obj/item/weapon/gun/projectile/shotgun/pump/toy/moistnugget + name = "\improper Donk-Soft mosin-nagant" + desc = "Donk-Soft foam mosin-nagant! It's Donk or Don't! Ages 8 and up." + description_fluff = "A special Donk-Soft rifle originally made to pair with a Soviet Soldier costume. It didn't catch on quite as well as other Donk-Soft products." + icon = 'icons/obj/gun_toy.dmi' + icon_state = "moistnugget" + item_state = "moistnugget" + max_shells = 5 + matter = list(MAT_PLASTIC = 2500) + /* * Pistol */ diff --git a/code/modules/random_map/noise/ore.dm b/code/modules/random_map/noise/ore.dm index a9273f5ec0..17c10cad1a 100644 --- a/code/modules/random_map/noise/ore.dm +++ b/code/modules/random_map/noise/ore.dm @@ -53,7 +53,7 @@ var/current_cell = map[get_map_cell(x,y)] if(current_cell < rare_val) // Surface metals. - T.resources["hematite"] = rand(RESOURCE_MID_MIN, RESOURCE_HIGH_MAX) + T.resources["hematite"] = rand(RESOURCE_HIGH_MIN, RESOURCE_HIGH_MAX) T.resources["gold"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) T.resources["silver"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) T.resources["uranium"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) @@ -81,17 +81,17 @@ T.resources["lead"] = rand(RESOURCE_LOW_MIN, RESOURCE_MID_MAX) T.resources["hydrogen"] = 0 T.resources["diamond"] = 0 - T.resources["hematite"] = rand(RESOURCE_HIGH_MIN, RESOURCE_HIGH_MAX) + T.resources["hematite"] = 0 T.resources["marble"] = 0 //T.resources["copper"] = 0 //T.resources["tin"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) //T.resources["bauxite"] = 0 - T.resources["rutile"] = rand(RESOURCE_LOW_MIN, RESOURCE_MID_MAX) + T.resources["rutile"] = 0 //T.resources["void opal"] = 0 //T.resources["quartz"] = 0 //T.resources["painite"] = 0 else // Deep metals. - T.resources["uranium"] = rand(RESOURCE_MID_MIN, RESOURCE_HIGH_MAX) + T.resources["uranium"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) T.resources["diamond"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) T.resources["verdantium"] = rand(RESOURCE_LOW_MIN, RESOURCE_MID_MAX) T.resources["phoron"] = rand(RESOURCE_HIGH_MIN, RESOURCE_HIGH_MAX) @@ -99,13 +99,13 @@ T.resources["hydrogen"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) T.resources["marble"] = rand(RESOURCE_MID_MIN, RESOURCE_HIGH_MAX) T.resources["lead"] = rand(RESOURCE_LOW_MIN, RESOURCE_HIGH_MAX) - T.resources["hematite"] = rand(RESOURCE_HIGH_MIN, RESOURCE_HIGH_MAX) - T.resources["gold"] = rand(RESOURCE_MID_MIN, RESOURCE_HIGH_MAX) - T.resources["silver"] = rand(RESOURCE_MID_MIN, RESOURCE_HIGH_MAX) + T.resources["hematite"] = 0 + T.resources["gold"] = 0 + T.resources["silver"] = 0 //T.resources["copper"] = 0 //T.resources["tin"] = 0 //T.resources["bauxite"] = 0 - T.resources["rutile"] = rand(RESOURCE_MID_MIN, RESOURCE_HIGH_MAX) + T.resources["rutile"] = 0 //T.resources["void opal"] = 0 //T.resources["quartz"] = 0 //T.resources["painite"] = 0 diff --git a/code/modules/reagents/reactions/_reactions.dm b/code/modules/reagents/reactions/_reactions.dm index d63967d900..61c926153e 100644 --- a/code/modules/reagents/reactions/_reactions.dm +++ b/code/modules/reagents/reactions/_reactions.dm @@ -119,7 +119,7 @@ var/list/seen = viewers(4, T) for(var/mob/M in seen) if(M.client) - M.show_message("[bicon(container)] [mix_message]", 1) + M.show_message("\icon[container][bicon(container)] [mix_message]", 1) playsound(T, reaction_sound, 80, 1) //obtains any special data that will be provided to the reaction products diff --git a/code/modules/reagents/reagents/_reagents.dm b/code/modules/reagents/reagents/_reagents.dm index 2ad71a4de1..a2db264456 100644 --- a/code/modules/reagents/reagents/_reagents.dm +++ b/code/modules/reagents/reagents/_reagents.dm @@ -171,7 +171,7 @@ if(overdose && (volume > overdose * M?.species.chemOD_threshold) && (active_metab.metabolism_class != CHEM_TOUCH && !can_overdose_touch)) overdose(M, alien, removed) if(M.species.allergens & allergen_type) //uhoh, we can't handle this! - M.add_chemical_effect(CE_ALLERGEN,allergen_factor) + M.add_chemical_effect(CE_ALLERGEN, allergen_factor * removed) remove_self(removed) return diff --git a/code/modules/reagents/reagents/core.dm b/code/modules/reagents/reagents/core.dm index 901b803cbb..0d803b63d3 100644 --- a/code/modules/reagents/reagents/core.dm +++ b/code/modules/reagents/reagents/core.dm @@ -46,12 +46,12 @@ var/effective_dose = dose if(issmall(M)) effective_dose *= 2 - var/is_vampire = 0 //VOREStation Edit START + var/is_vampire = FALSE //VOREStation Edit START if(ishuman(M)) var/mob/living/carbon/human/H = M - if(H.species.organic_food_coeff == 0) - H.adjust_nutrition(removed) - is_vampire = 1 //VOREStation Edit END + if(H.species.bloodsucker) + H.adjust_nutrition(removed*30) + is_vampire = TRUE //VOREStation Edit END if(alien == IS_SLIME) // Treat it like nutriment for the jello, but not equivalent. if(data["species"] == M.species.name) // Unless it's Promethean goo, then refill this one's goo. M.inject_blood(src, volume * volume_mod) @@ -65,10 +65,10 @@ return if(effective_dose > 5) - if(is_vampire == 0) //VOREStation Edit. + if(!is_vampire) //VOREStation Edit. M.adjustToxLoss(removed) //VOREStation Edit. if(effective_dose > 15) - if(is_vampire == 0) //VOREStation Edit. + if(!is_vampire) //VOREStation Edit. M.adjustToxLoss(removed) //VOREStation Edit. if(data && data["virus2"]) var/list/vlist = data["virus2"] diff --git a/code/modules/reagents/reagents/food_drinks_vr.dm b/code/modules/reagents/reagents/food_drinks_vr.dm index ef301925cb..668df0d83e 100644 --- a/code/modules/reagents/reagents/food_drinks_vr.dm +++ b/code/modules/reagents/reagents/food_drinks_vr.dm @@ -140,7 +140,7 @@ M.adjust_nutrition(alt_nutriment_factor * removed) if(ishuman(M)) var/mob/living/carbon/human/H = M - if(H.feral > 0 && H.nutrition > 100 && H.traumatic_shock < min(60, H.nutrition/10) && H.jitteriness < 100) // same check as feral triggers to stop them immediately re-feralling + if(H.feral > 0 && H.nutrition > 150 && H.traumatic_shock < 20 && H.jitteriness < 100) //Same check as feral triggers to stop them immediately re-feralling H.feral -= removed * 3 // should calm them down quick, provided they're actually in a state to STAY calm. if (H.feral <=0) //check if they're unferalled H.feral = 0 @@ -523,6 +523,7 @@ color = "#caa3c9" /datum/reagent/nutriment/protein/brainzsnax/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) + ..() if(prob(5) && !(alien == IS_CHIMERA || alien == IS_SLIME || alien == IS_PLANT || alien == IS_DIONA || alien == IS_SHADEKIN && !M.isSynthetic())) M.adjustBrainLoss(removed) //Any other species risks prion disease. M.Confuse(5) @@ -530,7 +531,7 @@ if(ishuman(M)) var/mob/living/carbon/human/H = M - if(H.feral > 0 && H.nutrition > 100 && H.traumatic_shock < min(60, H.nutrition/10) && H.jitteriness < 100) //Same check as feral triggers to stop them immediately re-feralling + if(H.feral > 0 && H.nutrition > 150 && H.traumatic_shock < 20 && H.jitteriness < 100) //Same check as feral triggers to stop them immediately re-feralling H.feral -= removed * 3 //Should calm them down quick, provided they're actually in a state to STAY calm. if(H.feral <=0) //Check if they're unferalled H.feral = 0 diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm index cceea53713..e77708d51a 100644 --- a/code/modules/research/message_server.dm +++ b/code/modules/research/message_server.dm @@ -84,7 +84,7 @@ var/global/list/obj/machinery/message_server/message_servers = list() /obj/machinery/message_server/examine(mob/user, distance, infix, suffix) . = ..() - . += "It appears to be [active ? "online" : "offline"]." + . += "It appears to be [active ? "online" : "offline"]." /obj/machinery/message_server/proc/GenerateKey() //Feel free to move to Helpers. @@ -131,12 +131,12 @@ var/global/list/obj/machinery/message_server/message_servers = list() if(2) if(!Console.silent) playsound(Console, 'sound/machines/twobeep.ogg', 50, 1) - Console.audible_message(text("[bicon(Console)] *The Requests Console beeps: 'PRIORITY Alert in [sender]'"),,5, runemessage = "beep! beep!") + Console.audible_message(text("\icon[Console][bicon(Console)] *The Requests Console beeps: 'PRIORITY Alert in [sender]'"),,5, runemessage = "beep! beep!") Console.message_log += list(list("High Priority message from [sender]", "[authmsg]")) else if(!Console.silent) playsound(Console, 'sound/machines/twobeep.ogg', 50, 1) - Console.audible_message(text("[bicon(Console)] *The Requests Console beeps: 'Message from [sender]'"),,4, runemessage = "beep beep") + Console.audible_message(text("\icon[Console][bicon(Console)] *The Requests Console beeps: 'Message from [sender]'"),,4, runemessage = "beep beep") Console.message_log += list(list("Message from [sender]", "[authmsg]")) Console.set_light(2) diff --git a/code/modules/shieldgen/emergency_shield.dm b/code/modules/shieldgen/emergency_shield.dm index 53c2f129ea..d7d244bac4 100644 --- a/code/modules/shieldgen/emergency_shield.dm +++ b/code/modules/shieldgen/emergency_shield.dm @@ -259,14 +259,14 @@ return if (src.active) - user.visible_message("[bicon(src)] [user] deactivated the shield generator.", \ - "[bicon(src)] You deactivate the shield generator.", \ + user.visible_message("\icon[src][bicon(src)] [user] deactivated the shield generator.", \ + "\icon[src][bicon(src)] You deactivate the shield generator.", \ "You hear heavy droning fade out.") src.shields_down() else if(anchored) - user.visible_message("[bicon(src)] [user] activated the shield generator.", \ - "[bicon(src)] You activate the shield generator.", \ + user.visible_message("\icon[src][bicon(src)] [user] activated the shield generator.", \ + "\icon[src][bicon(src)] You activate the shield generator.", \ "You hear heavy droning.") src.shields_up() else diff --git a/code/modules/shieldgen/shield_capacitor.dm b/code/modules/shieldgen/shield_capacitor.dm index b1ba46b57a..2bd6818d25 100644 --- a/code/modules/shieldgen/shield_capacitor.dm +++ b/code/modules/shieldgen/shield_capacitor.dm @@ -49,7 +49,7 @@ else if(W.is_wrench()) src.anchored = !src.anchored playsound(src, W.usesound, 75, 1) - src.visible_message("[bicon(src)] [src] has been [anchored ? "bolted to the floor" : "unbolted from the floor"] by [user].") + src.visible_message("\icon[src][bicon(src)] [src] has been [anchored ? "bolted to the floor" : "unbolted from the floor"] by [user].") if(anchored) spawn(0) diff --git a/code/modules/shieldgen/shield_gen.dm b/code/modules/shieldgen/shield_gen.dm index bf40ac9052..2617d6c28f 100644 --- a/code/modules/shieldgen/shield_gen.dm +++ b/code/modules/shieldgen/shield_gen.dm @@ -69,7 +69,7 @@ else if(W.is_wrench()) src.anchored = !src.anchored playsound(src, W.usesound, 75, 1) - src.visible_message("[bicon(src)] [src] has been [anchored?"bolted to the floor":"unbolted from the floor"] by [user].") + src.visible_message("\icon[src][bicon(src)] [src] has been [anchored?"bolted to the floor":"unbolted from the floor"] by [user].") if(active) toggle() @@ -122,7 +122,7 @@ "failing" = (C.time_since_fail <= 2), ))) lockedData["capacitors"] = caps - + lockedData["active"] = active lockedData["failing"] = (time_since_fail <= 2) lockedData["radius"] = field_radius @@ -242,7 +242,7 @@ covered_turfs = null for(var/mob/M in view(5,src)) - to_chat(M, "[bicon(src)] You hear heavy droning start up.") + to_chat(M, "\icon[src][bicon(src)] You hear heavy droning start up.") for(var/obj/effect/energy_field/E in field) // Update the icons here to ensure all the shields have been made already. E.update_icon() else @@ -252,7 +252,7 @@ qdel(D) for(var/mob/M in view(5,src)) - to_chat(M, "[bicon(src)] You hear heavy droning fade out.") + to_chat(M, "\icon[src][bicon(src)] You hear heavy droning fade out.") /obj/machinery/shield_gen/update_icon() if(stat & BROKEN) diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm index acbc8655dc..745dc3e892 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/implant.dm @@ -124,7 +124,14 @@ if(..()) var/obj/item/organ/external/affected = target.get_organ(target_zone) if(istype(user,/mob/living/silicon/robot)) - return + if(istype(tool, /obj/item/weapon/gripper)) + var/obj/item/weapon/gripper/Gripper = tool + if(Gripper.wrapped) + tool = Gripper.wrapped + else + return + else + return if(affected && affected.cavity) var/total_volume = tool.w_class for(var/obj/item/I in affected.implants) @@ -135,6 +142,9 @@ /datum/surgery_step/cavity/place_item/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) + if(isrobot(user) && istype(tool, /obj/item/weapon/gripper)) + var/obj/item/weapon/gripper/G = tool + tool = G.wrapped user.visible_message("[user] starts putting \the [tool] inside [target]'s [get_cavity(affected)] cavity.", \ "You start putting \the [tool] inside [target]'s [get_cavity(affected)] cavity." ) //Nobody will probably ever see this, but I made these two blue. ~CK target.custom_pain("The pain in your chest is living hell!",1) @@ -142,7 +152,12 @@ /datum/surgery_step/cavity/place_item/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/chest/affected = target.get_organ(target_zone) - + if(isrobot(user) && istype(tool, /obj/item/weapon/gripper)) + var/obj/item/weapon/gripper/G = tool + tool = G.wrapped + G.drop_item() + else + user.drop_item() user.visible_message("[user] puts \the [tool] inside [target]'s [get_cavity(affected)] cavity.", \ "You put \the [tool] inside [target]'s [get_cavity(affected)] cavity." ) if (tool.w_class > get_max_wclass(affected)/2 && prob(50) && (affected.robotic < ORGAN_ROBOT)) @@ -150,7 +165,6 @@ var/datum/wound/internal_bleeding/I = new (10) affected.wounds += I affected.owner.custom_pain("You feel something rip in your [affected.name]!", 1) - user.drop_item() affected.implants += tool tool.loc = affected if(istype(tool,/obj/item/device/nif)){var/obj/item/device/nif/N = tool;N.implant(target)} //VOREStation Add - NIF support diff --git a/code/modules/tgs/v5/chat_commands.dm b/code/modules/tgs/v5/chat_commands.dm index 53aeb57a3a..5a4386e6da 100644 --- a/code/modules/tgs/v5/chat_commands.dm +++ b/code/modules/tgs/v5/chat_commands.dm @@ -4,8 +4,26 @@ admin_only = FALSE /* YW EDIT: replaced by yw variant /datum/tgs_chat_command/status/Run(datum/tgs_chat_user/sender, params) - return "Current server status:\n**Web Manifest:**>1,C=23===c?o(2,-24)-o(2,-77):0,N=e<0||0===e&&1/e<0?1:0,b=0;for((e=n(e))!=e||e===Infinity?(u=e!=e?1:0,d=f):(d=r(a(e)/i),e*(s=o(2,-d))<1&&(d--,s*=2),(e+=d+h>=1?C/s:C*o(2,1-h))*s>=2&&(d++,s/=2),d+h>=f?(u=0,d=f):d+h>=1?(u=(e*s-1)*o(2,c),d+=h):(u=e*o(2,h-1)*o(2,c),d=0));c>=8;)m[b++]=255&u,u/=256,c-=8;for(d=d<