diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm index 8088eaa5e1..e13f9b5024 100644 --- a/code/_helpers/global_lists_vr.dm +++ b/code/_helpers/global_lists_vr.dm @@ -5,8 +5,10 @@ var/global/list/hair_accesories_list= list()// Stores /datum/sprite_accessory/hair_accessory indexed by type var/global/list/negative_traits = list() // Negative custom species traits, indexed by path var/global/list/neutral_traits = list() // Neutral custom species traits, indexed by path -var/global/list/everyone_traits = list() // Neutral traits available to all species, indexed by path var/global/list/positive_traits = list() // Positive custom species traits, indexed by path +var/global/list/everyone_traits_positive = list() // Neutral traits available to all species, indexed by path +var/global/list/everyone_traits_neutral = list() // Neutral traits available to all species, indexed by path +var/global/list/everyone_traits_negative = list() // Neutral traits available to all species, indexed by path var/global/list/traits_costs = list() // Just path = cost list, saves time in char setup var/global/list/all_traits = list() // All of 'em at once (same instances) var/global/list/active_ghost_pods = list() @@ -254,7 +256,8 @@ var/global/list/edible_trash = list(/obj/item/broken_device, /obj/item/weapon/folder, /obj/item/weapon/clipboard, /obj/item/weapon/coin, - /obj/item/clothing/ears //chompstation addition end + /obj/item/clothing/ears, //chompstation addition end + //CHOMPedit: disabled because this is in a file we don't use /obj/item/roulette_ball ) var/global/list/contamination_flavors = list( @@ -563,12 +566,16 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN, switch(category) if(-INFINITY to -0.1) negative_traits[traitpath] = T + if(!(T.custom_only)) + everyone_traits_negative[traitpath] = T if(0) neutral_traits[traitpath] = T if(!(T.custom_only)) - everyone_traits[traitpath] = T + everyone_traits_neutral[traitpath] = T if(0.1 to INFINITY) positive_traits[traitpath] = T + if(!(T.custom_only)) + everyone_traits_positive[traitpath] = T // Weaver recipe stuff @@ -838,4 +845,4 @@ var/global/list/xenobio_rainbow_extracts = list( /obj/item/slime_extract/ruby = 3, /obj/item/slime_extract/emerald = 3, /obj/item/slime_extract/light_pink = 1, - /obj/item/slime_extract/rainbow = 1) \ No newline at end of file + /obj/item/slime_extract/rainbow = 1) diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 6af55c0c7e..d08c7a7246 100755 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -966,6 +966,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station icon_state = "Sleep" ambience = AMBIENCE_GENERIC forbid_events = TRUE + forbid_singulo = TRUE /area/crew_quarters/toilet name = "\improper Dormitory Toilets" diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index ad9ef7a6dd..18d7dc4666 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -51,6 +51,7 @@ var/sound_env = STANDARD_STATION var/turf/base_turf //The base turf type of the area, which can be used to override the z-level's base turf var/forbid_events = FALSE // If true, random events will not start inside this area. + var/forbid_singulo = FALSE // If true singulo will not move in. var/no_spoilers = FALSE // If true, makes it much more difficult to see what is inside an area with things like mesons. var/soundproofed = FALSE // If true, blocks sounds from other areas and prevents hearers on other areas from hearing the sounds within. @@ -379,7 +380,7 @@ var/list/mob/living/forced_ambiance_list = new /area/Entered(mob/M) if(!istype(M) || !M.ckey) return - + if(!isliving(M)) M.lastarea = src return diff --git a/code/game/jobs/job/medical_vr.dm b/code/game/jobs/job/medical_vr.dm index 120d538e4a..fefe89d760 100644 --- a/code/game/jobs/job/medical_vr.dm +++ b/code/game/jobs/job/medical_vr.dm @@ -71,10 +71,15 @@ /datum/job/paramedic pto_type = PTO_MEDICAL - alt_titles = list("Emergency Medical Technician" = /datum/alt_title/emt, "Medical Responder" = /datum/alt_title/medical_responder) + alt_titles = list("Emergency Medical Technician" = /datum/alt_title/emt, "Medical Responder" = /datum/alt_title/medical_responder) //CHOMPedit: Removed SAR because that's an actual job here /datum/alt_title/medical_responder title = "Medical Responder" title_blurb = "A Medical Responder is primarily concerned with the recovery of patients who are unable to make it to the Medical Department on their \ own. They are capable of keeping a patient stabilized until they reach the hands of someone with more training." title_outfit = /decl/hierarchy/outfit/job/medical/paramedic/emt + +/* //CHOMPedit: Commented out because this is an actual job here +/datum/alt_title/sar + title = "Search and Rescue" +*/ diff --git a/code/game/jobs/job/security_vr.dm b/code/game/jobs/job/security_vr.dm index b6b704660f..bba60df71a 100644 --- a/code/game/jobs/job/security_vr.dm +++ b/code/game/jobs/job/security_vr.dm @@ -45,7 +45,7 @@ spawn_positions = 5 pto_type = PTO_SECURITY alt_titles = list("Patrol Officer" = /datum/alt_title/patrol_officer, "Security Guard" = /datum/alt_title/security_guard, - "Security Deputy" = /datum/alt_title/security_guard, "Junior Officer" = /datum/alt_title/junior_officer) + "Security Deputy" = /datum/alt_title/security_guard, "Junior Officer" = /datum/alt_title/junior_officer, "Security Contractor" = /datum/alt_title/security_contractor) /datum/alt_title/patrol_officer title = "Patrol Officer" @@ -55,3 +55,6 @@ /datum/alt_title/security_deputy title = "Security Deputy" + +/datum/alt_title/security_contractor + title = "Security Contractor" diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index b038d90c42..7d384f6bf8 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -95,3 +95,9 @@ P.accuracy += M.accuracy if(!isnull(M.accuracy_dispersion)) P.dispersion = max(P.dispersion + M.accuracy_dispersion, 0) + + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if(H.species) + P.accuracy += H.species.gun_accuracy_mod + P.dispersion = max(P.dispersion + H.species.gun_accuracy_dispersion_mod, 0) diff --git a/code/game/mecha/micro/micro.dm b/code/game/mecha/micro/micro.dm index abc39eb5a2..bea6f6f1dd 100644 --- a/code/game/mecha/micro/micro.dm +++ b/code/game/mecha/micro/micro.dm @@ -122,7 +122,7 @@ /obj/mecha/micro/move_inside() var/mob/living/carbon/C = usr - if (C.size_multiplier >= 0.5) + if (C.get_effective_size(TRUE) >= 0.5) to_chat(C, "You can't fit in this suit!") return else @@ -130,7 +130,7 @@ /obj/mecha/micro/move_inside_passenger() var/mob/living/carbon/C = usr - if (C.size_multiplier >= 0.5) + if (C.get_effective_size(TRUE) >= 0.5) to_chat(C, "You can't fit in this suit!") return else diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 2ef7d5d2ca..d3d63650dc 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -993,3 +993,6 @@ Note: This proc can be overwritten to allow for different types of auto-alignmen // this gets called when the item gets chucked by the vending machine /obj/item/proc/vendor_action(var/obj/machinery/vending/V) return + +/obj/item/proc/on_holder_escape(var/obj/item/weapon/holder/H) + return diff --git a/code/game/objects/items/stacks/tiles/fifty_spawner_tiles.dm b/code/game/objects/items/stacks/tiles/fifty_spawner_tiles.dm index 45fdb8d39c..deec4b6964 100644 --- a/code/game/objects/items/stacks/tiles/fifty_spawner_tiles.dm +++ b/code/game/objects/items/stacks/tiles/fifty_spawner_tiles.dm @@ -48,15 +48,15 @@ name = "stack of brown carpet" type_to_spawn = /obj/item/stack/tile/carpet/brncarpet -/obj/fiftyspawner/brncarpet +/obj/fiftyspawner/blucarpet2 name = "stack of blue carpet" type_to_spawn = /obj/item/stack/tile/carpet/blucarpet2 -/obj/fiftyspawner/brncarpet +/obj/fiftyspawner/greencarpet name = "stack of green carpet" type_to_spawn = /obj/item/stack/tile/carpet/greencarpet -/obj/fiftyspawner/brncarpet +/obj/fiftyspawner/purplecarpet name = "stack of purple carpet" type_to_spawn = /obj/item/stack/tile/carpet/purplecarpet diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index d4279b3890..12b2b5b2fb 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -882,8 +882,8 @@ if(target != user) return // If the user didn't drag themselves, exit if(user.incapacitated() || user.buckled) return // If user is incapacitated or buckled, exit if(get_holder_of_type(src, /mob/living/carbon/human) == user) return // No jumping into your own equipment - if(ishuman(user) && user.get_effective_size() > 0.25) return // Only micro characters - if(ismouse(user) && user.get_effective_size() > 1) return // Only normal sized mice or less + if(ishuman(user) && user.get_effective_size(TRUE) > 0.25) return // Only micro characters + if(ismouse(user) && user.get_effective_size(TRUE) > 1) return // Only normal sized mice or less // Create a dummy holder with user's size to test insertion var/obj/item/weapon/holder/D = new/obj/item/weapon/holder 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/sound.dm b/code/game/sound.dm index 4c2cc64c88..bfc01ad2cc 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -291,3 +291,18 @@ 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') +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') +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/modules/casino/boxes_casino.dm b/code/modules/casino/boxes_casino.dm index 03b6aa9d17..3b4c548056 100644 --- a/code/modules/casino/boxes_casino.dm +++ b/code/modules/casino/boxes_casino.dm @@ -49,4 +49,46 @@ /obj/item/clothing/accessory/holster/hip, /obj/item/clothing/head/cowboy/ranger, /obj/item/clothing/shoes/boots/cowboy/brown - ) \ No newline at end of file + ) + +/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 b73ed6990f..a1de440a49 100644 --- a/code/modules/casino/casino.dm +++ b/code/modules/casino/casino.dm @@ -7,7 +7,7 @@ // /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 @@ -26,39 +26,301 @@ /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" + icon_state = "roulette_chart" + +/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() > 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 diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index 19e8d760d7..b73a5fe290 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -81,10 +81,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. @@ -108,4 +113,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 f68ddc011d..24df219632 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -86,7 +86,7 @@ return sane = TRUE break - + if(!sane) to_chat(src, "Sorry, that link doesn't appear to be valid. Please try again.") return @@ -196,6 +196,8 @@ . = ..() //calls mob.Login() prefs.sanitize_preferences() + if(prefs) + prefs.selecting_slots = FALSE connection_time = world.time connection_realtime = world.realtime @@ -573,3 +575,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/02_language.dm b/code/modules/client/preference_setup/general/02_language.dm index 039498c3f9..4b15fdc7f0 100644 --- a/code/modules/client/preference_setup/general/02_language.dm +++ b/code/modules/client/preference_setup/general/02_language.dm @@ -1,3 +1,6 @@ +/datum/preferences + var/extra_languages = 0 + /datum/category_item/player_setup_item/general/language name = "Language" sort_order = 2 @@ -5,19 +8,17 @@ /datum/category_item/player_setup_item/general/language/load_character(var/savefile/S) S["language"] >> pref.alternate_languages + S["extra_languages"] >> pref.extra_languages + testing("LANGSANI: Loaded from [pref.client]'s character [pref.real_name || "-name not yet loaded-"] savefile: [english_list(pref.alternate_languages || list())]") S["language_prefixes"] >> pref.language_prefixes //CHOMPEdit Begin S["species"] >> pref.species - S["pos_traits"] >> pref.pos_traits - var/morelang = 0 - for(var/trait in pref.pos_traits) - if(trait==/datum/trait/positive/linguist) - morelang = 1 - pref.num_languages = morelang * 12 //CHOMPEdit End /datum/category_item/player_setup_item/general/language/save_character(var/savefile/S) S["language"] << pref.alternate_languages + S["extra_languages"] << pref.extra_languages + testing("LANGSANI: Saved to [pref.client]'s character [pref.real_name || "-name not yet loaded-"] savefile: [english_list(pref.alternate_languages || list())]") S["language_prefixes"] << pref.language_prefixes /datum/category_item/player_setup_item/general/language/sanitize_character() @@ -26,9 +27,9 @@ var/datum/species/S = GLOB.all_species[pref.species] if(!istype(S)) return - - if(pref.alternate_languages.len > pref.numlanguage()) //CHOMPEdit - pref.alternate_languages.len = pref.numlanguage() // Truncate to allowed length CHOMPEdit + if(pref.alternate_languages.len > (S.num_alternate_languages + pref.extra_languages)) + testing("LANGSANI: Truncated [pref.client]'s character [pref.real_name || "-name not yet loaded-"] language list because it was too long (len: [pref.alternate_languages.len], allowed: [S.num_alternate_languages])") + pref.alternate_languages.len = (S.num_alternate_languages + pref.extra_languages) // Truncate to allowed length // Sanitize illegal languages for(var/language in pref.alternate_languages) @@ -46,18 +47,20 @@ /datum/category_item/player_setup_item/general/language/content() . += "Languages
" var/datum/species/S = GLOB.all_species[pref.species] + if(pref.alternate_languages.len > (S.num_alternate_languages + pref.extra_languages)) + testing("LANGSANI: Truncated [pref.client]'s character [pref.real_name || "-name not yet loaded-"] language list because it was too long (len: [pref.alternate_languages.len], allowed: [S.num_alternate_languages])") + pref.alternate_languages.len = (S.num_alternate_languages + pref.extra_languages) // Truncate to allowed length if(S.language) . += "- [S.language]
" if(S.default_language && S.default_language != S.language) . += "- [S.default_language]
" - if(pref.numlanguage()) //CHOMPEdit + if(S.num_alternate_languages + pref.extra_languages) if(pref.alternate_languages.len) for(var/i = 1 to pref.alternate_languages.len) var/lang = pref.alternate_languages[i] . += "- [lang] - remove
" - - if(pref.alternate_languages.len < pref.numlanguage()) //CHOMPEdit - . += "- add ([pref.numlanguage() - pref.alternate_languages.len] remaining)
" //CHOMPEdit + if(pref.alternate_languages.len < (S.num_alternate_languages + pref.extra_languages)) + . += "- add ([(S.num_alternate_languages + pref.extra_languages) - pref.alternate_languages.len] remaining)
" else . += "- [pref.species] cannot choose secondary languages.
" @@ -71,7 +74,7 @@ return TOPIC_REFRESH else if(href_list["add_language"]) var/datum/species/S = GLOB.all_species[pref.species] - if(pref.alternate_languages.len >= pref.numlanguage()) //CHOMPEdit + if(pref.alternate_languages.len >= (S.num_alternate_languages + pref.extra_languages)) tgui_alert_async(user, "You have already selected the maximum number of alternate languages for this species!") else var/list/available_languages = S.secondary_langs.Copy() @@ -89,8 +92,12 @@ tgui_alert_async(user, "There are no additional languages available to select.") else var/new_lang = tgui_input_list(user, "Select an additional language", "Character Generation", available_languages) - if(new_lang && pref.alternate_languages.len < pref.numlanguage()) //CHOMPEdit - pref.alternate_languages |= new_lang + if(new_lang && pref.alternate_languages.len < (S.num_alternate_languages + pref.extra_languages)) + var/datum/language/chosen_lang = GLOB.all_languages[new_lang] + if(istype(chosen_lang)) + var/choice = tgui_alert(usr, "[chosen_lang.desc]",chosen_lang.name, list("Take","Cancel")) + if(choice != "Cancel" && pref.alternate_languages.len < (S.num_alternate_languages + pref.extra_languages)) + pref.alternate_languages |= new_lang return TOPIC_REFRESH else if(href_list["change_prefix"]) diff --git a/code/modules/client/preference_setup/global/setting_datums.dm b/code/modules/client/preference_setup/global/setting_datums.dm index bade14759f..a594492b7d 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" @@ -301,6 +301,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" 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 c3af5a25c0..7c847009df 100644 --- a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm @@ -752,6 +752,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" @@ -1301,4 +1307,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/vore/02_size.dm b/code/modules/client/preference_setup/vore/02_size.dm index 37a71587b1..bff1637e47 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,17 @@ 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 +56,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) . += "
" . += "Scale: [round(pref.size_multiplier*100)]%
" . += "Scaled Appearance: [pref.fuzzy ? "Fuzzy" : "Sharp"]
" + . += "Voice Frequency: [pref.voice_freq]
" + . += "Voice Sounds: [pref.voice_sound]
" . += "
" . += "Relative Weight: [pref.weight_vr]
" . += "Weight Gain Rate: [pref.weight_gain]
" @@ -104,4 +150,43 @@ pref.weight_loss = round(text2num(weight_loss_rate),1) return TOPIC_REFRESH + else if(href_list["voice_freq"]) + var/list/preset_voice_freqs = list("high" = MAX_VOICE_FREQ, "middle-high" = 56250, "middle" = 42500, "middle-low"= 28750, "low" = MIN_VOICE_FREQ, "custom" = 1, "random" = 0) + var/choice = tgui_input_list(usr, "What would you like to set your voice frequency to? ([MIN_VOICE_FREQ] - [MAX_VOICE_FREQ])", "Voice Frequency", preset_voice_freqs) + if(!choice) + return + choice = preset_voice_freqs[choice] + if(choice == 0) + pref.voice_freq = choice + return TOPIC_REFRESH + else if(choice == 1) + choice = tgui_input_number(user, "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) + if(choice > MAX_VOICE_FREQ) + choice = MAX_VOICE_FREQ + else if(choice < MIN_VOICE_FREQ) + choice = MIN_VOICE_FREQ + + pref.voice_freq = choice + return TOPIC_REFRESH + else if(href_list["voice_sounds_list"]) + 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) + pref.voice_sound = "beep-boop" + else + pref.voice_sound = choice return ..(); diff --git a/code/modules/client/preference_setup/vore/07_traits.dm b/code/modules/client/preference_setup/vore/07_traits.dm index 62b8cefe4b..ddd0ff612c 100644 --- a/code/modules/client/preference_setup/vore/07_traits.dm +++ b/code/modules/client/preference_setup/vore/07_traits.dm @@ -20,7 +20,7 @@ var/list/neg_traits = list() var/traits_cheating = 0 //Varedit by admins allows saving new maximums on people who apply/etc - var/starting_trait_points = STARTING_SPECIES_POINTS + var/starting_trait_points = 0 var/max_traits = MAX_SPECIES_TRAITS var/dirty_synth = 0 //Are you a synth var/gross_meatbag = 0 //Where'd I leave my Voight-Kampff test kit? @@ -72,7 +72,11 @@ pref.blood_color = sanitize_hexcolor(pref.blood_color, default="#A10808") if(!pref.traits_cheating) - pref.starting_trait_points = STARTING_SPECIES_POINTS + var/datum/species/S = GLOB.all_species[pref.species] + if(S) + pref.starting_trait_points = S.trait_points + else + pref.starting_trait_points = 0 pref.max_traits = MAX_SPECIES_TRAITS if(pref.organ_data[O_BRAIN]) //Checking if we have a synth on our hands, boys. @@ -82,14 +86,14 @@ pref.gross_meatbag = 1 pref.dirty_synth = 0 - if(pref.species != SPECIES_CUSTOM) - pref.pos_traits.Cut() - pref.neg_traits.Cut() // Clean up positive traits for(var/datum/trait/path as anything in pref.pos_traits) if(!(path in positive_traits)) pref.pos_traits -= path continue + if(!(pref.species == SPECIES_CUSTOM) && !(path in everyone_traits_positive)) + pref.pos_traits -= path + continue var/take_flags = initial(path.can_take) if((pref.dirty_synth && !(take_flags & SYNTHETICS)) || (pref.gross_meatbag && !(take_flags & ORGANICS))) pref.pos_traits -= path @@ -98,7 +102,7 @@ if(!(path in neutral_traits)) pref.neu_traits -= path continue - if(!(pref.species == SPECIES_CUSTOM) && !(path in everyone_traits)) + if(!(pref.species == SPECIES_CUSTOM) && !(path in everyone_traits_neutral)) pref.neu_traits -= path continue var/take_flags = initial(path.can_take) @@ -109,6 +113,9 @@ if(!(path in negative_traits)) pref.neg_traits -= path continue + if(!(pref.species == SPECIES_CUSTOM) && !(path in everyone_traits_negative)) + pref.neg_traits -= path + continue var/take_flags = initial(path.can_take) if((pref.dirty_synth && !(take_flags & SYNTHETICS)) || (pref.gross_meatbag && !(take_flags & ORGANICS))) pref.neg_traits -= path @@ -141,6 +148,9 @@ var/datum/species/S = character.species var/datum/species/new_S = S.produceCopy(pref.pos_traits + pref.neu_traits + pref.neg_traits, character, pref.custom_base) + for(var/datum/trait/T in new_S.traits) + T.apply_pref(src) + //Any additional non-trait settings can be applied here new_S.blood_color = pref.blood_color @@ -151,8 +161,6 @@ //Statistics for this would be nice var/english_traits = english_list(new_S.traits, and_text = ";", comma_text = ";") log_game("TRAITS [pref.client_ckey]/([character]) with: [english_traits]") //Terrible 'fake' key_name()... but they aren't in the same entity yet - else - /datum/category_item/player_setup_item/vore/traits/content(var/mob/user) . += "Custom Species Name: " @@ -164,38 +172,41 @@ . += "[pref.custom_base ? pref.custom_base : "Human"]
" var/traits_left = pref.max_traits - - if(pref.species == SPECIES_CUSTOM) - var/points_left = pref.starting_trait_points - for(var/T in pref.pos_traits + pref.neg_traits) // CHOMPEdit: Only Positive traits cost slots now. - points_left -= traits_costs[T] - for(var/T in pref.pos_traits) - traits_left-- - . += "Traits Left: [traits_left]
" - . += "Points Left: [points_left]
" - if(points_left < 0 || traits_left < 0 || !pref.custom_species) - . += "^ Fix things! ^
" - . += "Positive Trait(s) (Limited) +
" // CHOMPEdit: More obvious/clear to players. - . += "" + var/points_left = pref.starting_trait_points + + + for(var/T in pref.pos_traits + pref.neg_traits) // CHOMPEdit: Only Positive traits cost slots now. + points_left -= traits_costs[T] + for(var/T in pref.pos_traits) + traits_left-- + . += "Traits Left: [traits_left]
" + . += "Points Left: [points_left]
" + if(points_left < 0 || traits_left < 0 || (!pref.custom_species && pref.species == SPECIES_CUSTOM)) + . += "^ Fix things! ^
" + + . += "Positive Trait(s) (Limited) +
" // CHOMPEdit: More obvious/clear to players. + . += "" - . += "Negative Trait(s) (No Limit) +
" // CHOMPEdit: More obvious/clear to players. - . += "" . += "Neutral Trait(s) (No Limit) +
" // CHOMPEdit: More obvious/clear to players. . += "" + + . += "Negative Trait(s) (No Limit) +
" // CHOMPEdit: More obvious/clear to players. + . += "" + . += "Blood Color: " //People that want to use a certain species to have that species traits (xenochimera/promethean/spider) should be able to set their own blood color. . += "Set Color" . += "R
" @@ -251,13 +262,12 @@ return TOPIC_REFRESH else if(href_list["clicked_pos_trait"]) - var/traitpath = text2path(href_list["clicked_pos_trait"]) //CHOMPEdit var/datum/trait/trait = text2path(href_list["clicked_pos_trait"]) var/choice = tgui_alert(usr, "Remove [initial(trait.name)] and regain [initial(trait.cost)] points?","Remove Trait",list("Remove","Cancel")) if(choice == "Remove") - if(traitpath == /datum/trait/positive/linguist) //CHOMPEdit - pref.num_languages = null //CHOMPEdit pref.pos_traits -= trait + var/datum/trait/instance = all_traits[trait] + instance.remove_pref(pref) return TOPIC_REFRESH else if(href_list["clicked_neu_trait"]) @@ -265,6 +275,8 @@ var/choice = tgui_alert(usr, "Remove [initial(trait.name)]?","Remove Trait",list("Remove","Cancel")) if(choice == "Remove") pref.neu_traits -= trait + var/datum/trait/instance = all_traits[trait] + instance.remove_pref(pref) return TOPIC_REFRESH else if(href_list["clicked_neg_trait"]) @@ -272,6 +284,8 @@ var/choice = tgui_alert(usr, "Remove [initial(trait.name)] and lose [initial(trait.cost)] points?","Remove Trait",list("Remove","Cancel")) if(choice == "Remove") pref.neg_traits -= trait + var/datum/trait/instance = all_traits[trait] + instance.remove_pref(pref) return TOPIC_REFRESH else if(href_list["custom_say"]) @@ -328,18 +342,26 @@ var/list/mylist switch(mode) if(POSITIVE_MODE) - picklist = positive_traits.Copy() - pref.pos_traits - mylist = pref.pos_traits + if(pref.species == SPECIES_CUSTOM) + picklist = positive_traits.Copy() - pref.pos_traits + mylist = pref.pos_traits + else + picklist = everyone_traits_positive.Copy() - pref.pos_traits + mylist = pref.pos_traits if(NEUTRAL_MODE) if(pref.species == SPECIES_CUSTOM) picklist = neutral_traits.Copy() - pref.neu_traits mylist = pref.neu_traits else - picklist = everyone_traits.Copy() - pref.neu_traits + picklist = everyone_traits_neutral.Copy() - pref.neu_traits mylist = pref.neu_traits if(NEGATIVE_MODE) - picklist = negative_traits.Copy() - pref.neg_traits - mylist = pref.neg_traits + if(pref.species == SPECIES_CUSTOM) + picklist = negative_traits.Copy() - pref.neg_traits + mylist = pref.neg_traits + else + picklist = everyone_traits_negative.Copy() - pref.neg_traits + mylist = pref.neg_traits else if(isnull(picklist)) @@ -424,11 +446,16 @@ conflict = instance_test.name break varconflict + for(var/V in instance.var_changes_pref) + if(V in instance_test.var_changes_pref) + conflict = instance_test.name + break varconflict + if(conflict) tgui_alert_async(usr, "You cannot take this trait and [conflict] at the same time. Please remove that trait, or pick another trait to add.", "Error") return TOPIC_REFRESH - if(path==/datum/trait/positive/linguist) //CHOMPEdit - pref.num_languages = 12 //CHOMPEdit + + instance.apply_pref(pref) mylist += path return TOPIC_REFRESH diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index c06d0ab35d..b4a63bea83 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -33,7 +33,6 @@ var/list/preferences_datums = list() var/tgui_swapped_buttons = FALSE //character preferences - var/num_languages = 0 //CHOMPEdit var/real_name //our character's name var/be_random_name = 0 //whether we are a random name every round var/nickname //our character's nickname @@ -164,12 +163,6 @@ var/list/preferences_datums = list() ///If they are currently in the process of swapping slots, don't let them open 999 windows for it and get confused var/selecting_slots = FALSE -//CHOMPEdit Begin -/datum/preferences/proc/numlanguage() - var/datum/species/S = GLOB.all_species[species] - var/num = max(num_languages, S.num_alternate_languages) - return (num == 0) ? 3 : num //Don't return 0 -//CHOMPEdit End /datum/preferences/New(client/C) player_setup = new(src) diff --git a/code/modules/client/preferences_toggle_procs.dm b/code/modules/client/preferences_toggle_procs.dm index 495c0c4d03..2ea3296631 100644 --- a/code/modules/client/preferences_toggle_procs.dm +++ b/code/modules/client/preferences_toggle_procs.dm @@ -406,8 +406,6 @@ feedback_add_details("admin_verb","TRadioSounds") -<<<<<<< HEAD -======= /client/verb/toggle_say_sounds() set name = "Sound-Toggle-Say" set category = "Preferences" @@ -460,7 +458,6 @@ feedback_add_details("admin_verb","TSubtleSounds") ->>>>>>> 103d0e094b... Merge pull request #13352 from Very-Soft/master // Not attached to a pref datum because those are strict binary toggles /client/verb/toggle_examine_mode() set name = "Toggle Examine Mode" diff --git a/code/modules/clothing/under/miscellaneous_vr.dm b/code/modules/clothing/under/miscellaneous_vr.dm index e52df06471..ef719641c9 100644 --- a/code/modules/clothing/under/miscellaneous_vr.dm +++ b/code/modules/clothing/under/miscellaneous_vr.dm @@ -109,7 +109,7 @@ /obj/item/clothing/under/hyperfiber/bluespace/mob_can_unequip(mob/M, slot, disable_warning = 0) . = ..() - if(. && ishuman(M) && original_size) + if(. && ishuman(M) && original_size && !disable_warning) var/mob/living/carbon/human/H = M H.resize(original_size, ignore_prefs = TRUE) original_size = null @@ -129,7 +129,7 @@ /obj/item/clothing/gloves/bluespace/mob_can_equip(mob/M, gloves, disable_warning = 0) . = ..() - if(. && ishuman(M)) + if(. && ishuman(M) && !disable_warning) var/mob/living/carbon/human/H = M if(!H.resizable) return @@ -145,7 +145,7 @@ /obj/item/clothing/gloves/bluespace/mob_can_unequip(mob/M, gloves, disable_warning = 0) . = ..() - if(. && ishuman(M) && original_size) + if(. && ishuman(M) && original_size && !disable_warning) var/mob/living/carbon/human/H = M if(!H.resizable) return diff --git a/code/modules/emotes/emote_mob.dm b/code/modules/emotes/emote_mob.dm index 03e30b0189..29e8ed58e3 100644 --- a/code/modules/emotes/emote_mob.dm +++ b/code/modules/emotes/emote_mob.dm @@ -191,10 +191,21 @@ if(message) message = encode_html_emphasis(message) + var/ourfreq = null + if(isliving(src)) + var/mob/living/L = src + if(L.voice_freq > 0 ) + ourfreq = L.voice_freq + + // Hearing gasp and such every five seconds is not good emotes were not global for a reason. // Maybe some people are okay with that. var/turf/T = get_turf(src) + if(!T) return + + if(client) + playsound(T, pick(emote_sound), 25, TRUE, falloff = 1 , is_global = TRUE, frequency = ourfreq, ignore_walls = FALSE, preference = /datum/client_preference/emote_sounds) var/list/in_range = get_mobs_and_objs_in_view_fast(T,range,2,remote_ghosts = client ? TRUE : FALSE) var/list/m_viewers = in_range["mobs"] var/list/o_viewers = in_range["objs"] diff --git a/code/modules/holodeck/HolodeckControl.dm b/code/modules/holodeck/HolodeckControl.dm index 48e2942323..3f0cbafe43 100644 --- a/code/modules/holodeck/HolodeckControl.dm +++ b/code/modules/holodeck/HolodeckControl.dm @@ -336,6 +336,7 @@ spawn(30) for(var/obj/effect/landmark/L in linkedholodeck) + L.delete_me = 1 if(L.name=="Atmospheric Test Start") spawn(20) var/turf/T = get_turf(L) diff --git a/code/modules/materials/materials/_materials.dm b/code/modules/materials/materials/_materials.dm index f059aa28c6..168fd67938 100644 --- a/code/modules/materials/materials/_materials.dm +++ b/code/modules/materials/materials/_materials.dm @@ -109,7 +109,7 @@ var/list/name_to_material var/datum/material/key = arguments[1] if(istype(key)) return key // we want to convert anything we're given to a material - + if(istext(key)) // text ID . = name_to_material[key] if(!.) @@ -363,7 +363,7 @@ var/list/name_to_material ) if(icon_base == "solid") // few icons recipes += new /datum/stack_recipe("[display_name] wall girders (eris)", /obj/structure/girder/eris, 2, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) - recipes += new /datum/stack_recipe_list("low walls",list( + recipes += new /datum/stack_recipe_list("low walls",list( new /datum/stack_recipe("low wall (bay style)", /obj/structure/low_wall/bay, 3, time = 20, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", recycle_material = "[name]"), new /datum/stack_recipe("low wall (eris style)", /obj/structure/low_wall/eris, 3, time = 20, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", recycle_material = "[name]") )) diff --git a/code/modules/materials/materials/metals/steel.dm b/code/modules/materials/materials/metals/steel.dm index ca63d24b9c..cc6a58792a 100644 --- a/code/modules/materials/materials/metals/steel.dm +++ b/code/modules/materials/materials/metals/steel.dm @@ -69,7 +69,7 @@ new /datum/stack_recipe("regular floor tile", /obj/item/stack/tile/floor, 1, 4, 20, recycle_material = "[name]"), new /datum/stack_recipe("roofing tile", /obj/item/stack/tile/roofing, 3, 4, 20, recycle_material = "[name]"), new /datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60, recycle_material = "[name]"), - new /datum/stack_recipe("frame", /obj/item/frame, 5, time = 25, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), + new /datum/stack_recipe("frame parts", /obj/item/frame, 5, time = 25, on_floor = 1, recycle_material = "[name]"), new /datum/stack_recipe("mirror frame", /obj/item/frame/mirror, 1, time = 5, one_per_turf = 0, on_floor = 1, recycle_material = "[name]"), new /datum/stack_recipe("fire extinguisher cabinet frame", /obj/item/frame/extinguisher_cabinet, 4, time = 5, one_per_turf = 0, on_floor = 1, recycle_material = "[name]"), new /datum/stack_recipe("railing", /obj/structure/railing, 2, time = 50, one_per_turf = 0, on_floor = 1, recycle_material = "[name]"), diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm index 5b718fe0df..9fcf0f9427 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -107,11 +107,13 @@ var/list/holder_mob_icon_cache = list() to_chat(held, "You extricate yourself from [holster].") forceMove(get_turf(src)) held.reset_view(null) - else if(isitem(loc)) + var/obj/item/I = loc to_chat(held, "You struggle free of [loc].") forceMove(get_turf(src)) held.reset_view(null) + if(istype(I)) + I.on_holder_escape(src) //Mob specific holders. /obj/item/weapon/holder/diona diff --git a/code/modules/mob/language/generic.dm b/code/modules/mob/language/generic.dm index 55ba735af4..0c2fecfabc 100644 --- a/code/modules/mob/language/generic.dm +++ b/code/modules/mob/language/generic.dm @@ -18,7 +18,7 @@ // 'basic' language; spoken by default. /datum/language/common name = LANGUAGE_GALCOM - desc = "The common galactic tongue, engineered for cross-species communication." + desc = "The common galactic tongue, engineered for cross-species communication. Every spacer there is knows this!" speech_verb = "says" whisper_verb = "whispers" key = "0" @@ -127,7 +127,7 @@ /datum/language/sign name = LANGUAGE_SIGN - desc = "A sign language commonly used for those who are deaf or mute." + desc = "A sign language commonly used for those who are deaf or mute. Especially popular with spacers, due to practicality in airless environments." signlang_verb = list("gestures") colour = "say_quote" key = "s" @@ -152,7 +152,7 @@ // Silly language for those times when you try to talk a languague you normally can't /datum/language/gibberish name = LANGUAGE_GIBBERISH - desc = "A completely incomprehensible language." + desc = "A completely incomprehensible gibberish that can barely be called a language." signlang_verb = list("flails") speech_verb = "spews" whisper_verb = "mumbles" diff --git a/code/modules/mob/language/monkey.dm b/code/modules/mob/language/monkey.dm index 6736b803fc..0ceaf4a88f 100644 --- a/code/modules/mob/language/monkey.dm +++ b/code/modules/mob/language/monkey.dm @@ -1,6 +1,6 @@ /datum/language/human/monkey name = "Chimpanzee" - desc = "Ook ook ook." + desc = "A collection of ooking noises made by monkeys" speech_verb = "chimpers" ask_verb = "chimpers" exclaim_verb = "screeches" @@ -10,28 +10,28 @@ /datum/language/skrell/monkey name = "Neaera" - desc = "Squik squik squik." + desc = "A collection of squiking noises made by naera." key = "8" - syllables = list("hiss","gronk") + syllables = list("squick","croak") machine_understands = 0 /datum/language/unathi/monkey name = "Stok" - desc = "Hiss hiss hiss." + desc = "A collection of hissing noises made by stok." key = "7" - syllables = list("squick","croak") + syllables = list("hiss","gronk") machine_understands = 0 /datum/language/tajaran/monkey name = "Farwa" - desc = "Meow meow meow." + desc = "A collection of meowing noises made by farwa." key = "9" syllables = list("meow","mew") machine_understands = 0 /datum/language/corgi name = "Dog" - desc = "Woof woof woof." + desc = "A set of barks and woofs that only dogs can understand." speech_verb = "barks" ask_verb = "woofs" exclaim_verb = "howls" @@ -43,7 +43,7 @@ /datum/language/cat name = "Cat" - desc = "Meow meow meow." + desc = "A set of meows and mrowls that only cats can understand." speech_verb = "meows" ask_verb = "mrowls" exclaim_verb = "yowls" @@ -55,7 +55,7 @@ /datum/language/mouse name = "Mouse" - desc = "Squeak squeak. *Nibbles on cheese*" + desc = "A set of squeaks that only mice can understand." speech_verb = "squeaks" ask_verb = "squeaks" exclaim_verb = "squeaks" @@ -67,7 +67,7 @@ /datum/language/bird name = "Bird" - desc = "Chirp chirp, give me food" + desc = "A set of chirps and squawks that only birds can understand." speech_verb = "chirps" ask_verb = "tweets" exclaim_verb = "squawks" @@ -76,3 +76,15 @@ machine_understands = 0 space_chance = 100 syllables = list("chirp", "squawk", "tweet") + +/datum/language/teppi + name = "Teppi" + desc = "A set of gyohs that only teppi can understand." + speech_verb = "rumbles" + ask_verb = "tilts" + exclaim_verb = "roars" + key = "i" + flags = WHITELISTED + machine_understands = 0 + space_chance = 100 + syllables = list("gyoh", "snoof", "gyoooooOOOooh", "iuuuuh", "gyuuuuh") diff --git a/code/modules/mob/language/station.dm b/code/modules/mob/language/station.dm index 3069427453..641143b1f0 100644 --- a/code/modules/mob/language/station.dm +++ b/code/modules/mob/language/station.dm @@ -114,7 +114,7 @@ /datum/language/skrell name = LANGUAGE_SKRELLIAN - desc = "A set of warbles and hums, the language itself a complex mesh of both melodic and rhythmic components, exceptionally capable of conveying intent and emotion of the speaker." + desc = "A set of warbles and hums, the language itself a complex mesh of both melodic and rhythmic components, exceptionally capable of conveying intent and emotion of the speaker. Native to Skrell." speech_verb = "warbles" ask_verb = "warbles" exclaim_verb = "sings" @@ -127,7 +127,7 @@ /datum/language/skrellfar name = LANGUAGE_SKRELLIANFAR - desc = "The most common language among the Skrellian Far Kingdoms. Has an even higher than usual concentration of inaudible phonemes." + desc = "The most common language among the Skrellian Far Kingdoms. Has an even higher than usual concentration of inaudible phonemes. Native to Skrell." speech_verb = "warbles" ask_verb = "warbles" exclaim_verb = "sings" @@ -145,7 +145,7 @@ /datum/language/human name = LANGUAGE_SOL_COMMON - desc = "A bastardized hybrid of many languages, including Chinese, English, French, and more; it is the common language of the Sol system." + desc = "A bastardized hybrid of many human languages, including Chinese, English, French, and more; it is the common language of the Sol system." speech_verb = "says" whisper_verb = "whispers" colour = "solcom" @@ -172,7 +172,7 @@ /datum/language/machine name = LANGUAGE_EAL - desc = "An efficient language of encoded tones developed by positronics." + desc = "An efficient language of encoded tones developed by positronics, although compatible with any synthetic lifeforms." speech_verb = "whistles" ask_verb = "chirps" exclaim_verb = "whistles loudly" @@ -190,7 +190,7 @@ /datum/language/teshari name = LANGUAGE_SCHECHI - desc = "A trilling language spoken by the diminutive Teshari." + desc = "A trilling language spoken by the Teshari." speech_verb = "chirps" ask_verb = "chirrups" exclaim_verb = "trills" @@ -222,7 +222,7 @@ /datum/language/promethean name = LANGUAGE_PROMETHEAN - desc = "A complex language composed of guttural noises and bioluminescent signals" + desc = "A complex language of prometheans, composed of guttural noises and bioluminescent signals." signlang_verb = list("flickers","flashes","rapidly flashes a light","quickly flickers a light") speech_verb = "gurgles" ask_verb = "gurgles" diff --git a/code/modules/mob/language/station_vr.dm b/code/modules/mob/language/station_vr.dm index 9c52508724..95b804d7e5 100644 --- a/code/modules/mob/language/station_vr.dm +++ b/code/modules/mob/language/station_vr.dm @@ -11,7 +11,7 @@ /datum/language/birdsong name = LANGUAGE_BIRDSONG - desc = "A language primarily spoken by Narvians" + desc = "A tweety language primarily spoken by Nevreans." speech_verb = "chirps" colour = "birdsongc" key = "G" @@ -160,7 +160,7 @@ /datum/language/tavan name = LANGUAGE_TAVAN - desc = "A language native to the Altevians, it has been adopted by other rodent faring species over time." + desc = "A language native to the rat-like Altevians, it has been adopted by other rodent faring species over time." key = "E" speech_verb = "squeaks" whisper_verb = "squiks" @@ -171,7 +171,7 @@ /datum/language/echosong name = LANGUAGE_ECHOSONG - desc = "An ultrasound-based language, inaudible to those unable to understand it." + desc = "An ultrasound-based language, inaudible to those unable to understand it, spoken by few species capable of actually hearing it." key = "U" signlang_verb = list("opens their mouth soundlessly", "mouthes something silently") signlang_verb_understood = list("squeaks") diff --git a/code/modules/mob/living/carbon/human/examine_vr.dm b/code/modules/mob/living/carbon/human/examine_vr.dm index cb73c0fdc5..52162a96af 100644 --- a/code/modules/mob/living/carbon/human/examine_vr.dm +++ b/code/modules/mob/living/carbon/human/examine_vr.dm @@ -85,13 +85,13 @@ /mob/living/carbon/human/proc/examine_pickup_size(mob/living/H) var/message = "" - if(istype(H) && (H.get_effective_size() - src.get_effective_size()) >= 0.50) + if(istype(H) && (H.get_effective_size(FALSE) - src.get_effective_size(TRUE)) >= 0.50) message = "They are small enough that you could easily pick them up!" return message /mob/living/carbon/human/proc/examine_step_size(mob/living/H) var/message = "" - if(istype(H) && (H.get_effective_size() - src.get_effective_size()) >= 0.75) + if(istype(H) && (H.get_effective_size(FALSE) - src.get_effective_size(TRUE)) >= 0.75) message = "They are small enough that you could easily trample them!" return message diff --git a/code/modules/mob/living/carbon/human/species/outsider/vox.dm b/code/modules/mob/living/carbon/human/species/outsider/vox.dm index 04de53ba87..da0e0e0b9b 100644 --- a/code/modules/mob/living/carbon/human/species/outsider/vox.dm +++ b/code/modules/mob/living/carbon/human/species/outsider/vox.dm @@ -6,7 +6,7 @@ default_language = LANGUAGE_VOX language = LANGUAGE_GALCOM species_language = LANGUAGE_VOX - num_alternate_languages = 1 + num_alternate_languages = 3 color_mult = 1 //CHOMP Edit assisted_langs = list(LANGUAGE_ROOTGLOBAL) unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/strong, /datum/unarmed_attack/bite/strong) diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 844590e79b..f1f8fcdd7d 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -281,6 +281,8 @@ var/wikilink = null //link to wiki page for species var/icon_height = 32 var/agility = 20 //prob() to do agile things + var/gun_accuracy_mod = 0 // More is better + var/gun_accuracy_dispersion_mod = 0 // More is worse var/sort_hint = SPECIES_SORT_NORMAL diff --git a/code/modules/mob/living/carbon/human/species/species_vr.dm b/code/modules/mob/living/carbon/human/species/species_vr.dm index 6598ed9a5b..6430516a9d 100644 --- a/code/modules/mob/living/carbon/human/species/species_vr.dm +++ b/code/modules/mob/living/carbon/human/species/species_vr.dm @@ -25,6 +25,10 @@ var/list/traits = list() //Vars that need to be copied when producing a copy of species. var/list/copy_vars = list("base_species", "icobase", "deform", "tail", "tail_animation", "icobase_tail", "color_mult", "primitive_form", "appearance_flags", "flesh_color", "base_color", "blood_mask", "damage_mask", "damage_overlays", "move_trail", "has_floating_eyes") + var/trait_points = 0 + + var/micro_size_mod = 0 // How different is our size for interactions that involve us being small? + var/macro_size_mod = 0 // How different is our size for interactions that involve us being big? /datum/species/proc/give_numbing_bite() //Holy SHIT this is hacky, but it works. Updating a mob's attacks mid game is insane. unarmed_attacks = list() diff --git a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm index 2962b30fc5..e33a98502e 100644 --- a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm @@ -46,6 +46,8 @@ BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right, "descriptor" = "right foot") ) + trait_points = 2 + /datum/species/custom/update_sort_hint() sort_hint = SPECIES_SORT_CUSTOM diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index a43dfc5bd7..50ae8ac2e0 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -522,7 +522,7 @@ health_hud_intensity = 2.5 item_slowdown_mod = 0.1 - num_alternate_languages = 2 + num_alternate_languages = 3 name_language = LANGUAGE_ROOTLOCAL species_language = LANGUAGE_ROOTLOCAL secondary_langs = list(LANGUAGE_ROOTGLOBAL) 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 675da1d92d..9d97a0d9e1 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 @@ -17,7 +17,7 @@ base_species = "Xenochimera" selects_bodytype = TRUE - num_alternate_languages = 2 + num_alternate_languages = 3 secondary_langs = list("Sol Common") //color_mult = 1 //It seemed to work fine in testing, but I've been informed it's unneeded. tail = "tail" //Scree's tail. Can be disabled in the vore tab by choosing "hide species specific tail sprite" @@ -339,7 +339,7 @@ brute_mod = 0.8 //20% brute damage reduction burn_mod = 1.15 //15% burn damage increase. They're spiders. Aerosol can+lighter = dead spiders. - num_alternate_languages = 2 + num_alternate_languages = 3 secondary_langs = list(LANGUAGE_VESPINAE) color_mult = 1 tail = "tail" //Spider tail. 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 cc283b4e7d..aa9b570889 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 @@ -587,7 +587,7 @@ unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) darksight = 4 //Better hunters in the dark. hunger_factor = 0.1 //In exchange, they get hungry a tad faster. - num_alternate_languages = 2 + num_alternate_languages = 3 min_age = 18 max_age = 80 diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/_traits.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/_traits.dm new file mode 100644 index 0000000000..6abec0e517 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/_traits.dm @@ -0,0 +1,7 @@ +#define TRAIT_TYPE_NEGATIVE -1 +#define TRAIT_TYPE_NEUTRAL 0 +#define TRAIT_TYPE_POSITIVE 1 + +#define TRAIT_VARCHANGE_LESS_BETTER -1 +#define TRAIT_VARCHANGE_ALWAYS_OVERRIDE 0 +#define TRAIT_VARCHANGE_MORE_BETTER 1 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm index 90cf90f7ea..7c01fd47f7 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm @@ -1,5 +1,5 @@ /datum/trait/negative - category = -1 + category = TRAIT_TYPE_NEGATIVE /datum/trait/negative/speed_slow name = "Slowdown" @@ -92,6 +92,8 @@ desc = "Increases your susceptibility to electric shocks by 100%" cost = -3 //CHOMPEdit var_changes = list("siemens_coefficient" = 2.0) //This makes you extremely weak to tasers. + custom_only = FALSE + varchange_type = TRAIT_VARCHANGE_LESS_BETTER /datum/trait/negative/haemophilia name = "Haemophilia" // CHOMPEdit: Trait List Organization @@ -99,6 +101,8 @@ cost = -2 var_changes = list("bloodloss_rate" = 2) can_take = ORGANICS + custom_only = FALSE + varchange_type = TRAIT_VARCHANGE_LESS_BETTER /datum/trait/negative/hollow name = "Hollow Bones/Aluminum Alloy" @@ -116,6 +120,7 @@ desc = "Your light weight and poor balance make you very susceptible to unhelpful bumping. Think of it like a bowling ball versus a pin. (STOP TAKING THIS AS SECURITY! We're MRP, so expect to lose your junk immediately, especially in events. - Love, Admins)" //CHOMP Edit btw cost = -2 var_changes = list("lightweight" = 1) + custom_only = FALSE /datum/trait/negative/neural_hypersensitivity name = "Neural Hypersensitivity" @@ -137,3 +142,37 @@ name = "Nitrogen Breather" desc = "You breathe nitrogen instead of oxygen (which is poisonous to you). Incidentally, phoron isn't poisonous to breathe to you." var_changes = list("breath_type" = "nitrogen", "poison_type" = "oxygen") + +/datum/trait/negative/monolingual + name = "Monolingual" + desc = "You are not good at learning languages." + cost = -3 + var_changes = list("num_alternate_languages" = 0) + varchange_type = TRAIT_VARCHANGE_MORE_BETTER + +/datum/trait/negative/monolingual + name = "Monolingual" + desc = "You are not good at learning languages." + cost = -1 + var_changes = list("num_alternate_languages" = 0) + var_changes_pref = list("extra_languages" = -3) + custom_only = FALSE + varchange_type = TRAIT_VARCHANGE_MORE_BETTER + +/datum/trait/negative/dark_blind + name = "Nyctalopia" + desc = "You cannot see in dark at all." + cost = -1 + var_changes = list("darksight" = 0) + custom_only = FALSE + varchange_type = TRAIT_VARCHANGE_MORE_BETTER + +/* // CHOMPedit: commented out because we disabled baymiss so this does nothing. +/datum/trait/negative/bad_shooter + name = "Bad Shot" + desc = "You are terrible at aiming." + cost = -1 + var_changes = list("gun_accuracy_mod" = -35) + custom_only = FALSE + varchange_type = TRAIT_VARCHANGE_MORE_BETTER +*/ 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 b6035fe667..0c99e212d3 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 @@ -1,4 +1,5 @@ /datum/trait/neutral + category = TRAIT_TYPE_NEUTRAL /datum/trait/neutral/metabolism_up name = "Metabolism, Fast" @@ -542,3 +543,17 @@ /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) 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 cc65469af9..be507a7c78 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 @@ -1,5 +1,5 @@ /datum/trait/positive - category = 1 + category = TRAIT_TYPE_POSITIVE /datum/trait/positive/speed_fast name = "Haste" @@ -127,6 +127,7 @@ desc = "You can fall from certain heights without suffering any injuries, be it via wings, lightness of frame or general dexterity." cost = 1 var_changes = list("soft_landing" = TRUE) + custom_only = FALSE /datum/trait/positive/hardfeet name = "Hard Feet" @@ -150,6 +151,8 @@ desc = "You're capable of parkour and can *flip over low objects (most of the time)." cost = 1 //CHOMPEdit this is not worth 2 points var_changes = list("agility" = 90) + custom_only = FALSE + varchange_type = TRAIT_VARCHANGE_MORE_BETTER /datum/trait/positive/snowwalker name = "Snow Walker" @@ -182,8 +185,28 @@ name = "Cocoon Spinner" desc = "Allows you to build a cocoon around yourself, using it to transform your body if you desire." cost = 1 - //custom_only = FALSE /datum/trait/positive/cocoon_tf/apply(var/datum/species/S,var/mob/living/carbon/human/H) ..(S,H) - H.verbs |= /mob/living/carbon/human/proc/enter_cocoon \ No newline at end of file + H.verbs |= /mob/living/carbon/human/proc/enter_cocoon + +/* //CHOMPedit: We already have our own version of this trait. +/datum/trait/positive/linguist + name = "Linguist" + desc = "Allows you to have more languages." + cost = 1 + var_changes = list("num_alternate_languages" = 6) + var_changes_pref = list("extra_languages" = 3) + custom_only = FALSE + varchange_type = TRAIT_VARCHANGE_MORE_BETTER +*/ + +/* // CHOMPedit: commented out because we disabled baymiss so this does nothing. +/datum/trait/positive/good_shooter + name = "Eagle Eye" + desc = "You are better at aiming than most." + cost = 2 + var_changes = list("gun_accuracy_mod" = 25) + custom_only = FALSE + varchange_type = TRAIT_VARCHANGE_MORE_BETTER +*/ diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive_ch.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/positive_ch.dm index 0643aa75f8..342d768b97 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive_ch.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/positive_ch.dm @@ -2,7 +2,8 @@ name = "Master Linguist" desc = "You are a master of languages! For whatever reason you might have, you are able to learn many more languages than others. Your language cap is 12 slots." cost = 2 - var_changes = list("num_alternate_languages" = 12) + var_changes = list("num_alternate_languages" = 15) + var_changes_pref = list("extra_languages" = 12) /datum/trait/positive/darksight name = "Darksight" @@ -354,4 +355,4 @@ /datum/trait/positive/sonar/apply(var/datum/species/S,var/mob/living/carbon/human/H) ..(S,H) - H.verbs |= /mob/living/carbon/human/proc/sonar_ping \ No newline at end of file + H.verbs |= /mob/living/carbon/human/proc/sonar_ping diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm index 91bf5fafea..03e3966ff9 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm @@ -4,23 +4,43 @@ var/cost = 0 var/sort = TRAIT_SORT_NORMAL // Sort order, 1 before 2 before 3 etc. Alphabetical is used for same-group traits. - var/category = 0 // What category this trait is. -1 is Negative, 0 is Neutral, 1 is Positive + var/category = TRAIT_TYPE_NEUTRAL // What category this trait is. -1 is Negative, 0 is Neutral, 1 is Positive var/list/var_changes // A list to apply to the custom species vars. + var/list/var_changes_pref // A list to apply to the preference vars. var/list/excludes // Store a list of paths of traits to exclude, but done automatically if they change the same vars. var/can_take = ORGANICS|SYNTHETICS // Can freaking synths use those. var/list/banned_species // A list of species that can't take this trait var/list/allowed_species // VORESTATION EDIT:chomp port. A list of species that CAN take this trait, use this if only a few species can use it. -shark var/custom_only = TRUE // Trait only available for custom species + var/varchange_type = TRAIT_VARCHANGE_ALWAYS_OVERRIDE //Mostly used for non-custom species. //Proc can be overridden lower to include special changes, make sure to call up though for the vars changes /datum/trait/proc/apply(var/datum/species/S,var/mob/living/carbon/human/H) ASSERT(S) if(var_changes) for(var/V in var_changes) + if((category == TRAIT_TYPE_POSITIVE && ((varchange_type == TRAIT_VARCHANGE_LESS_BETTER && var_changes[V] > S.vars[V]) || (varchange_type == TRAIT_VARCHANGE_MORE_BETTER && var_changes[V] < S.vars[V]))) || (category == TRAIT_TYPE_NEGATIVE && ((varchange_type == TRAIT_VARCHANGE_LESS_BETTER && var_changes[V] < S.vars[V]) || (varchange_type == TRAIT_VARCHANGE_MORE_BETTER && var_changes[V] > S.vars[V])))) + continue S.vars[V] = var_changes[V] return +//Applying trait to preferences rather than just us. +/datum/trait/proc/apply_pref(var/datum/preferences/P) + ASSERT(P) + if(var_changes_pref) + for(var/V in var_changes_pref) + P.vars[V] = var_changes_pref[V] + return + //Similar to the above, but for removing. Probably won't be called often/ever. /datum/trait/proc/remove(var/datum/species/S) ASSERT(S) return + +//Similar to the above, but for removing. +/datum/trait/proc/remove_pref(var/datum/preferences/P) + ASSERT(P) + if(var_changes_pref) + for(var/V in var_changes_pref) + P.vars[V] = initial(P.vars[V]) + return diff --git a/code/modules/mob/living/living_vr.dm b/code/modules/mob/living/living_vr.dm index 9689953ebb..e4b639533c 100644 --- a/code/modules/mob/living/living_vr.dm +++ b/code/modules/mob/living/living_vr.dm @@ -33,4 +33,75 @@ 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 18aef57d34..d7abf3bcc1 100644 --- a/code/modules/mob/living/login.dm +++ b/code/modules/mob/living/login.dm @@ -13,13 +13,13 @@ 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) @@ -29,4 +29,40 @@ verbs += /mob/living/proc/vore_check_reagents //CHOMP If mob doesnt have bellies it cant use this verb for anything verbs += /mob/living/proc/vore_bellyrub //CHOMP If mob doesnt have bellies it probably won't be needing this anyway + //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 766a7adbcb..da722c0aa4 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -259,6 +259,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 +305,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 +402,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/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 6238ea7d5e..c79d777efb 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/simple_mob/subtypes/animal/alien animals/teppi.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm index fd1db82577..0660735db4 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm @@ -876,18 +876,6 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have? speak_chance = 0.5 wander = TRUE -/datum/language/teppi - name = "Teppi" - desc = "The language of the meat things." - speech_verb = "rumbles" - ask_verb = "tilts" - exclaim_verb = "roars" - key = "i" - flags = RESTRICTED - machine_understands = 0 - space_chance = 100 - syllables = list("gyoh", "snoof", "gyoooooOOOooh", "iuuuuh", "gyuuuuh") - ////////////////// Da babby ////////////// /mob/living/simple_mob/vore/alienanimals/teppi/baby diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index a5b81d0f8a..c36a48f13f 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -132,7 +132,7 @@ // Emulates targetting a specific body part, and miss chances // May return null if missed // miss_chance_mod may be negative. -/proc/get_zone_with_miss_chance(zone, var/mob/target, var/miss_chance_mod = 0, var/ranged_attack=0) +/proc/get_zone_with_miss_chance(zone, var/mob/target, var/miss_chance_mod = 0, var/ranged_attack=0, var/force_hit = FALSE) zone = check_zone(zone) if(!ranged_attack) @@ -144,6 +144,9 @@ if(G.state >= GRAB_AGGRESSIVE) return zone + if(force_hit) + return zone + var/miss_chance = 10 if (zone in base_miss_chance) miss_chance = base_miss_chance[zone] diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm index bd338109b4..39a396b19c 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/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/gun.dm b/code/modules/projectiles/gun.dm index 4bf31a2747..39df5708c9 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -668,6 +668,12 @@ if(!isnull(M.accuracy_dispersion)) P.dispersion = max(P.dispersion + M.accuracy_dispersion, 0) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if(H.species) + P.accuracy += H.species.gun_accuracy_mod + P.dispersion = max(P.dispersion + H.species.gun_accuracy_dispersion_mod, 0) + //does the actual launching of the projectile /obj/item/weapon/gun/proc/process_projectile(obj/projectile, mob/user, atom/target, var/target_zone, var/params=null) var/obj/item/projectile/P = projectile @@ -804,8 +810,8 @@ user.hud_used.remove_ammo_hud(user, src) return ..() - -/obj/item/weapon/gun/dropped(mob/living/user) // Ditto as above, we remove the HUD. Pending porting TGMC code to clean up this fucking nightmare of spaghetti. + +/obj/item/weapon/gun/dropped(mob/living/user) // Ditto as above, we remove the HUD. Pending porting TGMC code to clean up this fucking nightmare of spaghetti. user.hud_used.remove_ammo_hud(user, src) - ..() \ No newline at end of file + ..() diff --git a/code/modules/projectiles/guns/energy/cell_loaded_vr/nerd_cells.dm b/code/modules/projectiles/guns/energy/cell_loaded_vr/nerd_cells.dm index 34a1790ffb..29432dfe79 100644 --- a/code/modules/projectiles/guns/energy/cell_loaded_vr/nerd_cells.dm +++ b/code/modules/projectiles/guns/energy/cell_loaded_vr/nerd_cells.dm @@ -17,6 +17,8 @@ combustion = FALSE + can_miss = FALSE + muzzle_type = /obj/effect/projectile/muzzle/medigun tracer_type = /obj/effect/projectile/tracer/medigun impact_type = /obj/effect/projectile/impact/medigun diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index a24acd21cd..ed7beee2b4 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -40,6 +40,7 @@ var/ricochets = 0 var/ricochets_max = 2 var/ricochet_chance = 30 + var/can_miss = TRUE //Hitscan var/hitscan = FALSE //Whether this is hitscan. If it is, speed is basically ignored. @@ -139,7 +140,7 @@ var/impact_effect_type = null var/list/impacted_mobs = list() - + // TGMC Ammo HUD Port var/hud_state = "unknown" // What HUD state we use when we have ammunition. var/hud_state_empty = "unknown" // The empty state. DON'T USE _FLASH IN THE NAME OF THE EMPTY STATE STRING, THAT IS ADDED BY THE CODE. @@ -663,7 +664,7 @@ //roll to-hit miss_modifier = max(miss_modifier + target_mob.get_evasion(), -100) //CHOMPEDIT - removing baymiss - var/hit_zone = get_zone_with_miss_chance(def_zone, target_mob, miss_modifier, ranged_attack=(distance > 1 || original != target_mob)) //if the projectile hits a target we weren't originally aiming at then retain the chance to miss + var/hit_zone = get_zone_with_miss_chance(def_zone, target_mob, miss_modifier, ranged_attack=(distance > 1 || original != target_mob), force_hit = !can_miss) //if the projectile hits a target we weren't originally aiming at then retain the chance to miss var/result = PROJECTILE_FORCE_MISS if(hit_zone) diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm index 838ff53f1b..a4bd70c186 100644 --- a/code/modules/vore/eating/living_vr.dm +++ b/code/modules/vore/eating/living_vr.dm @@ -30,6 +30,8 @@ var/absorbing_prey = 0 // Determines if the person is using the succubus drain or not. See station_special_abilities_vr. var/drain_finalized = 0 // Determines if the succubus drain will be KO'd/absorbed. Can be toggled on at any time. var/fuzzy = 0 // Preference toggle for sharp/fuzzy icon. + var/voice_freq = 0 // Preference for character voice frequency + var/list/voice_sounds_list = list() // The sound list containing our voice sounds! var/permit_healbelly = TRUE var/stumble_vore = TRUE //Enabled by default since you have to enable drop pred/prey to do this anyway var/slip_vore = TRUE //Enabled by default since you have to enable drop pred/prey to do this anyway @@ -807,7 +809,7 @@ to_chat(src, "You can taste the flavor of aromatic rolling paper and funny looks.") else if(istype(I,/obj/item/weapon/paper)) to_chat(src, "You can taste the dry flavor of bureaucracy.") - else if(istype(I,/obj/item/weapon/dice)) + else if(istype(I,/obj/item/weapon/dice)) //CHOMPedit: Removed roulette ball because that's not active here. to_chat(src, "You can taste the bitter flavor of cheating.") else if(istype(I,/obj/item/weapon/lipstick)) to_chat(src, "You can taste the flavor of couture and style. Toddler at the make-up bag style.") diff --git a/code/modules/vore/fluffstuff/custom_clothes_vr.dm b/code/modules/vore/fluffstuff/custom_clothes_vr.dm index c220e68676..d4bc360743 100644 --- a/code/modules/vore/fluffstuff/custom_clothes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_clothes_vr.dm @@ -2456,4 +2456,18 @@ Departamental Swimsuits, for general use icon = 'icons/vore/custom_clothes_vr.dmi' icon_override = 'icons/vore/custom_onmob_vr.dmi' +//Pandora029:Seona Young +/obj/item/clothing/under/fluff/foxoflightsuit + name = "padded flightsui" + desc = "A ruddy-orange combination immersion-and-flight suit, fitted with extra padding across the front of its legs. Warm, waterproof and practical, seveal patches are scattered across it alongside a hard-wearing harness." + + icon = 'icons/vore/custom_clothes_vr.dmi' + icon_state = "foxflightsuit" + worn_state = "foxflightsuit_mob" + rolled_sleeves = 0 + rolled_down = 0 + + icon_override = 'icons/vore/custom_clothes_vr.dmi' + item_state = "foxflightsuit_mob" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS End CHOMP Removal*/ diff --git a/code/modules/vore/resizing/resize_vr.dm b/code/modules/vore/resizing/resize_vr.dm index 4dd7d3f531..f531ad05fe 100644 --- a/code/modules/vore/resizing/resize_vr.dm +++ b/code/modules/vore/resizing/resize_vr.dm @@ -39,12 +39,20 @@ * but in the future we may also incorporate the "mob_size", so that * a macro mouse is still only effectively "normal" or a micro dragon is still large etc. */ -/mob/proc/get_effective_size() +/mob/proc/get_effective_size(var/micro = FALSE) return 100000 //Whatever it is, it's too big to pick up, or it's a ghost, or something. -/mob/living/get_effective_size() +/mob/living/get_effective_size(var/micro = FALSE) return size_multiplier +/mob/living/carbon/human/get_effective_size(var/micro = FALSE) // Set micro to TRUE for interactions where you're small, to FALSE for ones where you're large. + var/effective_size = size_multiplier + if(micro) + effective_size += species.micro_size_mod + else + effective_size += species.macro_size_mod + return effective_size + /atom/movable/proc/size_range_check(size_select) //both objects and mobs needs to have that var/area/A = get_area(src) //Get the atom's area to check for size limit. if((A?.limit_mob_size && (size_select > 200 || size_select < 25)) || (size_select > 600 || size_select <1)) @@ -164,7 +172,7 @@ return 0 if(!(M.a_intent == I_HELP)) return 0 - var/size_diff = M.get_effective_size() - get_effective_size() + var/size_diff = M.get_effective_size(FALSE) - get_effective_size(TRUE) if(!holder_default && holder_type) holder_default = holder_type if(!istype(M)) @@ -198,16 +206,16 @@ return TRUE //Both small! Go ahead and go. - if(get_effective_size() <= RESIZE_A_SMALLTINY && tmob.get_effective_size() <= RESIZE_A_SMALLTINY) + if(get_effective_size(TRUE) <= RESIZE_A_SMALLTINY && tmob.get_effective_size(TRUE) <= RESIZE_A_SMALLTINY) // For help intent interaction just assume both are 'smol' return TRUE //Worthy of doing messages at all - if(abs(get_effective_size() - tmob.get_effective_size()) >= 0.50) + if(abs(get_effective_size(TRUE) - tmob.get_effective_size(TRUE)) >= 0.50) var/src_message = null var/tmob_message = null //Smaller person being stepped onto - if(get_effective_size() > tmob.get_effective_size() && ishuman(src)) + if(get_effective_size(TRUE) > tmob.get_effective_size(TRUE) && ishuman(src)) src_message = "You carefully step over [tmob]." tmob_message = "[src] steps over you carefully!" var/mob/living/carbon/human/H = src @@ -219,7 +227,7 @@ tmob_message = tail.msg_prey_help_run //Smaller person stepping under larger person - else if(get_effective_size() < tmob.get_effective_size() && ishuman(tmob)) + else if(get_effective_size(TRUE) < tmob.get_effective_size(TRUE) && ishuman(tmob)) src_message = "You run between [tmob]'s legs." tmob_message = "[src] runs between your legs." var/mob/living/carbon/human/H = tmob @@ -270,7 +278,7 @@ // We need to be above a certain size ratio in order to do anything to the prey. // For DISARM and HURT intent, this is >=0.75, for GRAB it is >=0.5 - var/size_ratio = get_effective_size() - tmob.get_effective_size() + var/size_ratio = get_effective_size(FALSE) - tmob.get_effective_size(TRUE) if((a_intent == I_GRAB || a_intent == I_DISARM) && size_ratio < 0.5) //CHOMPEDIT - more step changes return FALSE if(a_intent == I_HURT && size_ratio < 0.75) diff --git a/code/modules/vore/resizing/sizegun_slow_vr.dm b/code/modules/vore/resizing/sizegun_slow_vr.dm index 5a267cb6da..d6edc19361 100644 --- a/code/modules/vore/resizing/sizegun_slow_vr.dm +++ b/code/modules/vore/resizing/sizegun_slow_vr.dm @@ -50,16 +50,16 @@ if(unresizable) return TRUE - if(!(target.has_large_resize_bounds()) && (target.get_effective_size() >= RESIZE_MAXIMUM) && sizeshift_mode == SIZE_GROW) + if(!(target.has_large_resize_bounds()) && (target.size_multiplier >= RESIZE_MAXIMUM) && sizeshift_mode == SIZE_GROW) return TRUE - if(target.get_effective_size() >= RESIZE_MAXIMUM_DORMS && sizeshift_mode == SIZE_GROW) + if(target.size_multiplier >= RESIZE_MAXIMUM_DORMS && sizeshift_mode == SIZE_GROW) return TRUE - if(!(target.has_large_resize_bounds()) && (target.get_effective_size() <= RESIZE_MINIMUM) && sizeshift_mode == SIZE_SHRINK) + if(!(target.has_large_resize_bounds()) && (target.size_multiplier <= RESIZE_MINIMUM) && sizeshift_mode == SIZE_SHRINK) return TRUE - if(target.get_effective_size() <= RESIZE_MINIMUM_DORMS && sizeshift_mode == SIZE_SHRINK) + if(target.size_multiplier <= RESIZE_MINIMUM_DORMS && sizeshift_mode == SIZE_SHRINK) return TRUE return FALSE @@ -123,9 +123,9 @@ stoplag(3) if(sizeshift_mode == SIZE_SHRINK) - L.resize((L.get_effective_size() - size_increment), uncapped = L.has_large_resize_bounds(), aura_animation = FALSE) + L.resize((L.size_multiplier - size_increment), uncapped = L.has_large_resize_bounds(), aura_animation = FALSE) else if(sizeshift_mode == SIZE_GROW) - L.resize((L.get_effective_size() + size_increment), uncapped = L.has_large_resize_bounds(), aura_animation = FALSE) + L.resize((L.size_multiplier + size_increment), uncapped = L.has_large_resize_bounds(), aura_animation = FALSE) busy = FALSE current_target = null diff --git a/code/modules/vore/resizing/sizegun_vr.dm b/code/modules/vore/resizing/sizegun_vr.dm index d932351db1..8decb8dde6 100644 --- a/code/modules/vore/resizing/sizegun_vr.dm +++ b/code/modules/vore/resizing/sizegun_vr.dm @@ -136,6 +136,7 @@ damage = 0 check_armour = "laser" var/set_size = 1 //Let's default to 100% + can_miss = FALSE muzzle_type = /obj/effect/projectile/muzzle/xray tracer_type = /obj/effect/projectile/tracer/xray diff --git a/code/modules/vore/smoleworld/smoleworld_vr.dm b/code/modules/vore/smoleworld/smoleworld_vr.dm index f9d1c92a64..ae44a9ab2b 100644 --- a/code/modules/vore/smoleworld/smoleworld_vr.dm +++ b/code/modules/vore/smoleworld/smoleworld_vr.dm @@ -19,9 +19,9 @@ var/mob/living/L = A if(L.hovering) // Flying things shouldn't make footprints. return ..() - if(L.get_effective_size() <= RESIZE_NORMAL) + if(L.get_effective_size(FALSE) <= RESIZE_NORMAL) return ..() - if(L.get_effective_size() >= RESIZE_A_BIGNORMAL) + if(L.get_effective_size(FALSE) >= RESIZE_A_BIGNORMAL) playsound(src, 'sound/effects/footstep/giantstep_gigga.ogg', 35, 1, -1, volume_channel = VOLUME_CHANNEL_MASTER) var/mdir = "[A.dir]" crossed_dirs[mdir] = 1 @@ -365,7 +365,7 @@ // . = ..() // if(.) // -// if(M.get_effective_size() > RESIZE_TINY) +// if(M.get_effective_size(TRUE) > RESIZE_TINY) // to_chat(M, SPAN_WARNING("You are to big to fit in \the [src].")) // . = FALSE // diff --git a/icons/obj/boxes.dmi b/icons/obj/boxes.dmi index 7978b9a564..4cfbd48c04 100644 Binary files a/icons/obj/boxes.dmi and b/icons/obj/boxes.dmi differ diff --git a/icons/obj/casino.dmi b/icons/obj/casino.dmi index 472e1317d4..6a1bfda2ea 100644 Binary files a/icons/obj/casino.dmi and b/icons/obj/casino.dmi differ diff --git a/icons/vore/custom_clothes_vr.dmi b/icons/vore/custom_clothes_vr.dmi index cc7b242670..78fa46a05c 100644 Binary files a/icons/vore/custom_clothes_vr.dmi and b/icons/vore/custom_clothes_vr.dmi differ diff --git a/maps/groundbase/gb-z1.dmm b/maps/groundbase/gb-z1.dmm index e8d98c0e4c..b14bf9286e 100644 --- a/maps/groundbase/gb-z1.dmm +++ b/maps/groundbase/gb-z1.dmm @@ -489,6 +489,14 @@ lel outdoors = 0 }, /area/groundbase/security/lobby) +"bq" = ( +/obj/machinery/vending/wardrobe/atmosdrobe, +/obj/machinery/atmospherics/unary/vent_pump/on, +/obj/structure/sign/scenery/fakefireaxe{ + pixel_y = 32 + }, +/turf/simulated/floor/tiled, +/area/groundbase/engineering/atmos/monitoring) "br" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 @@ -9005,11 +9013,6 @@ lel /obj/item/weapon/hand_labeler, /turf/simulated/floor/carpet, /area/groundbase/security/detective) -"vS" = ( -/obj/machinery/vending/wardrobe/atmosdrobe, -/obj/machinery/atmospherics/unary/vent_pump/on, -/turf/simulated/floor/tiled, -/area/groundbase/engineering/atmos/monitoring) "vT" = ( /obj/machinery/atmospherics/portables_connector{ dir = 8 @@ -36642,7 +36645,7 @@ Lt Lt Lt iS -vS +bq wu aM iS diff --git a/maps/groundbase/gb-z3.dmm b/maps/groundbase/gb-z3.dmm index 65142980a0..22e16aef7e 100644 --- a/maps/groundbase/gb-z3.dmm +++ b/maps/groundbase/gb-z3.dmm @@ -5,6 +5,13 @@ lol "aa" = ( /turf/simulated/wall, /area/groundbase/exploration/equipment) +"ab" = ( +/obj/machinery/suit_cycler/medical, +/obj/structure/sign/scenery/fakefireaxe{ + pixel_y = 32 + }, +/turf/simulated/floor/tiled/white, +/area/groundbase/medical/paramedic) "ak" = ( /obj/structure/table/glass, /obj/item/weapon/paper_bin, @@ -16476,7 +16483,7 @@ ID lz Cv Vm -og +ab to to Qk diff --git a/maps/groundbase/groundbase_areas.dm b/maps/groundbase/groundbase_areas.dm index e18548d204..92db5129a9 100644 --- a/maps/groundbase/groundbase_areas.dm +++ b/maps/groundbase/groundbase_areas.dm @@ -358,6 +358,7 @@ name = "Arrivals" lightswitch = 1 forbid_events = TRUE + forbid_singulo = TRUE /area/groundbase/civilian/toolstorage name = "Tool Storage" lightswitch = 1 @@ -441,6 +442,7 @@ limit_mob_size = FALSE block_suit_sensors = TRUE forbid_events = TRUE + forbid_singulo = TRUE /area/groundbase/dorms/bathroom name = "Dormitory Bathroom" diff --git a/maps/stellar_delight/stellar_delight2.dmm b/maps/stellar_delight/stellar_delight2.dmm index fceb40e341..55de13db00 100644 --- a/maps/stellar_delight/stellar_delight2.dmm +++ b/maps/stellar_delight/stellar_delight2.dmm @@ -1736,6 +1736,18 @@ /obj/machinery/hologram/holopad, /turf/simulated/floor/tiled/eris/dark/orangecorner, /area/engineering/locker_room) +"dT" = ( +/obj/machinery/computer/atmos_alert{ + dir = 1 + }, +/obj/machinery/camera/network/engineering{ + dir = 4 + }, +/obj/structure/sign/scenery/fakefireaxe{ + pixel_x = -32 + }, +/turf/simulated/floor/tiled/techfloor, +/area/engineering/atmos/monitoring) "dU" = ( /obj/structure/bed/chair/backed_red{ dir = 4 @@ -14518,15 +14530,6 @@ }, /turf/simulated/floor/tiled/eris/cafe, /area/crew_quarters/kitchen) -"GC" = ( -/obj/machinery/computer/atmos_alert{ - dir = 1 - }, -/obj/machinery/camera/network/engineering{ - dir = 4 - }, -/turf/simulated/floor/tiled/techfloor, -/area/engineering/atmos/monitoring) "GD" = ( /obj/machinery/door/firedoor/glass, /obj/machinery/atmospherics/pipe/simple/hidden/green, @@ -29690,7 +29693,7 @@ NK eq sz to -GC +dT Ag Fl sp diff --git a/maps/stellar_delight/stellar_delight_areas.dm b/maps/stellar_delight/stellar_delight_areas.dm index 7d8e9a5326..a720cb6060 100644 --- a/maps/stellar_delight/stellar_delight_areas.dm +++ b/maps/stellar_delight/stellar_delight_areas.dm @@ -130,6 +130,7 @@ limit_mob_size = FALSE block_suit_sensors = TRUE forbid_events = TRUE + forbid_singulo = TRUE /area/stellardelight/deck1/dorms/dorm1 name = "Dormitory One" @@ -273,9 +274,11 @@ /area/stellardelight/deck3/transitgateway name = "Transit Gateway" forbid_events = TRUE + forbid_singulo = TRUE /area/stellardelight/deck3/cryo name = "Cryogenic Storage" forbid_events = TRUE + forbid_singulo = TRUE /area/stellardelight/deck3/readingroom name = "Reading Rooms" diff --git a/maps/tether/tether_jobs.dm b/maps/tether/tether_jobs.dm index d81c701abf..7505bba142 100644 --- a/maps/tether/tether_jobs.dm +++ b/maps/tether/tether_jobs.dm @@ -138,11 +138,14 @@ timeoff_factor = 1 access = list(access_talon) minimal_access = list(access_talon) - alt_titles = list("Talon Security" = /datum/alt_title/talon_security) + alt_titles = list("Talon Security" = /datum/alt_title/talon_security, "Talon Marine" = /datum/alt_title/talon_marine) /datum/alt_title/talon_security title = "Talon Security" +/datum/alt_title/talon_marine + title = "Talon Marine" + /datum/job/talon_miner title = "Talon Miner" flag = TALMIN diff --git a/sound/effects/pai_login.ogg b/sound/effects/pai_login.ogg new file mode 100644 index 0000000000..b3aa132905 Binary files /dev/null and b/sound/effects/pai_login.ogg differ diff --git a/sound/talksounds/a.ogg b/sound/talksounds/a.ogg new file mode 100644 index 0000000000..5c9920eaff Binary files /dev/null and b/sound/talksounds/a.ogg differ diff --git a/sound/talksounds/b.ogg b/sound/talksounds/b.ogg new file mode 100644 index 0000000000..294af704dc Binary files /dev/null and b/sound/talksounds/b.ogg differ diff --git a/sound/talksounds/c.ogg b/sound/talksounds/c.ogg new file mode 100644 index 0000000000..54d1dce5b4 Binary files /dev/null and b/sound/talksounds/c.ogg differ diff --git a/sound/talksounds/d.ogg b/sound/talksounds/d.ogg new file mode 100644 index 0000000000..e82bd21a8b Binary files /dev/null and b/sound/talksounds/d.ogg differ diff --git a/sound/talksounds/e.ogg b/sound/talksounds/e.ogg new file mode 100644 index 0000000000..2637136bbb Binary files /dev/null and b/sound/talksounds/e.ogg differ diff --git a/sound/talksounds/f.ogg b/sound/talksounds/f.ogg new file mode 100644 index 0000000000..2a30912e27 Binary files /dev/null and b/sound/talksounds/f.ogg differ diff --git a/sound/talksounds/g.ogg b/sound/talksounds/g.ogg new file mode 100644 index 0000000000..5f61e4b39d Binary files /dev/null and b/sound/talksounds/g.ogg differ diff --git a/sound/talksounds/goon/blub.ogg b/sound/talksounds/goon/blub.ogg new file mode 100644 index 0000000000..ee6de6ede4 Binary files /dev/null and b/sound/talksounds/goon/blub.ogg differ diff --git a/sound/talksounds/goon/blub_ask.ogg b/sound/talksounds/goon/blub_ask.ogg new file mode 100644 index 0000000000..193c3952b0 Binary files /dev/null and b/sound/talksounds/goon/blub_ask.ogg differ diff --git a/sound/talksounds/goon/blub_exclaim.ogg b/sound/talksounds/goon/blub_exclaim.ogg new file mode 100644 index 0000000000..b879fbd464 Binary files /dev/null and b/sound/talksounds/goon/blub_exclaim.ogg differ diff --git a/sound/talksounds/goon/bottalk_1.ogg b/sound/talksounds/goon/bottalk_1.ogg new file mode 100644 index 0000000000..b727224998 Binary files /dev/null and b/sound/talksounds/goon/bottalk_1.ogg differ diff --git a/sound/talksounds/goon/bottalk_2.ogg b/sound/talksounds/goon/bottalk_2.ogg new file mode 100644 index 0000000000..745b1a4edc Binary files /dev/null and b/sound/talksounds/goon/bottalk_2.ogg differ diff --git a/sound/talksounds/goon/bottalk_3.ogg b/sound/talksounds/goon/bottalk_3.ogg new file mode 100644 index 0000000000..e91f6bc156 Binary files /dev/null and b/sound/talksounds/goon/bottalk_3.ogg differ diff --git a/sound/talksounds/goon/bottalk_4.wav b/sound/talksounds/goon/bottalk_4.wav new file mode 100644 index 0000000000..130dfc3a8e Binary files /dev/null and b/sound/talksounds/goon/bottalk_4.wav differ diff --git a/sound/talksounds/goon/buwoo.ogg b/sound/talksounds/goon/buwoo.ogg new file mode 100644 index 0000000000..45bcbd50c6 Binary files /dev/null and b/sound/talksounds/goon/buwoo.ogg differ diff --git a/sound/talksounds/goon/buwoo_ask.ogg b/sound/talksounds/goon/buwoo_ask.ogg new file mode 100644 index 0000000000..d7011219b5 Binary files /dev/null and b/sound/talksounds/goon/buwoo_ask.ogg differ diff --git a/sound/talksounds/goon/buwoo_exclaim.ogg b/sound/talksounds/goon/buwoo_exclaim.ogg new file mode 100644 index 0000000000..935a802862 Binary files /dev/null and b/sound/talksounds/goon/buwoo_exclaim.ogg differ diff --git a/sound/talksounds/goon/cow.ogg b/sound/talksounds/goon/cow.ogg new file mode 100644 index 0000000000..db6c0a63ca Binary files /dev/null and b/sound/talksounds/goon/cow.ogg differ diff --git a/sound/talksounds/goon/cow_ask.ogg b/sound/talksounds/goon/cow_ask.ogg new file mode 100644 index 0000000000..aabd6f75c1 Binary files /dev/null and b/sound/talksounds/goon/cow_ask.ogg differ diff --git a/sound/talksounds/goon/cow_exclaim.ogg b/sound/talksounds/goon/cow_exclaim.ogg new file mode 100644 index 0000000000..dfac225463 Binary files /dev/null and b/sound/talksounds/goon/cow_exclaim.ogg differ diff --git a/sound/talksounds/goon/lizard.ogg b/sound/talksounds/goon/lizard.ogg new file mode 100644 index 0000000000..48638b0f23 Binary files /dev/null and b/sound/talksounds/goon/lizard.ogg differ diff --git a/sound/talksounds/goon/lizard_ask.ogg b/sound/talksounds/goon/lizard_ask.ogg new file mode 100644 index 0000000000..60cf84ff09 Binary files /dev/null and b/sound/talksounds/goon/lizard_ask.ogg differ diff --git a/sound/talksounds/goon/lizard_exclaim.ogg b/sound/talksounds/goon/lizard_exclaim.ogg new file mode 100644 index 0000000000..20d3c0b768 Binary files /dev/null and b/sound/talksounds/goon/lizard_exclaim.ogg differ diff --git a/sound/talksounds/goon/pug.ogg b/sound/talksounds/goon/pug.ogg new file mode 100644 index 0000000000..86d50225a5 Binary files /dev/null and b/sound/talksounds/goon/pug.ogg differ diff --git a/sound/talksounds/goon/pug_ask.ogg b/sound/talksounds/goon/pug_ask.ogg new file mode 100644 index 0000000000..4cdf1c8a5e Binary files /dev/null and b/sound/talksounds/goon/pug_ask.ogg differ diff --git a/sound/talksounds/goon/pug_exclaim.ogg b/sound/talksounds/goon/pug_exclaim.ogg new file mode 100644 index 0000000000..ed47bcf1c6 Binary files /dev/null and b/sound/talksounds/goon/pug_exclaim.ogg differ diff --git a/sound/talksounds/goon/pugg.ogg b/sound/talksounds/goon/pugg.ogg new file mode 100644 index 0000000000..90fa070e8b Binary files /dev/null and b/sound/talksounds/goon/pugg.ogg differ diff --git a/sound/talksounds/goon/pugg_ask.ogg b/sound/talksounds/goon/pugg_ask.ogg new file mode 100644 index 0000000000..463aa0afa0 Binary files /dev/null and b/sound/talksounds/goon/pugg_ask.ogg differ diff --git a/sound/talksounds/goon/pugg_exclaim.ogg b/sound/talksounds/goon/pugg_exclaim.ogg new file mode 100644 index 0000000000..c8d4ae1b4f Binary files /dev/null and b/sound/talksounds/goon/pugg_exclaim.ogg differ diff --git a/sound/talksounds/goon/radio.ogg b/sound/talksounds/goon/radio.ogg new file mode 100644 index 0000000000..0dcb87214f Binary files /dev/null and b/sound/talksounds/goon/radio.ogg differ diff --git a/sound/talksounds/goon/radio2.ogg b/sound/talksounds/goon/radio2.ogg new file mode 100644 index 0000000000..a9364857a5 Binary files /dev/null and b/sound/talksounds/goon/radio2.ogg differ diff --git a/sound/talksounds/goon/radio_ai.ogg b/sound/talksounds/goon/radio_ai.ogg new file mode 100644 index 0000000000..97eaf17417 Binary files /dev/null and b/sound/talksounds/goon/radio_ai.ogg differ diff --git a/sound/talksounds/goon/roach.ogg b/sound/talksounds/goon/roach.ogg new file mode 100644 index 0000000000..55a2ad8ac7 Binary files /dev/null and b/sound/talksounds/goon/roach.ogg differ diff --git a/sound/talksounds/goon/roach_ask.ogg b/sound/talksounds/goon/roach_ask.ogg new file mode 100644 index 0000000000..dc15d884cd Binary files /dev/null and b/sound/talksounds/goon/roach_ask.ogg differ diff --git a/sound/talksounds/goon/roach_exclaim.ogg b/sound/talksounds/goon/roach_exclaim.ogg new file mode 100644 index 0000000000..3a5a17d47a Binary files /dev/null and b/sound/talksounds/goon/roach_exclaim.ogg differ diff --git a/sound/talksounds/goon/skelly.ogg b/sound/talksounds/goon/skelly.ogg new file mode 100644 index 0000000000..b8e1a2921a Binary files /dev/null and b/sound/talksounds/goon/skelly.ogg differ diff --git a/sound/talksounds/goon/skelly_ask.ogg b/sound/talksounds/goon/skelly_ask.ogg new file mode 100644 index 0000000000..e81552d8df Binary files /dev/null and b/sound/talksounds/goon/skelly_ask.ogg differ diff --git a/sound/talksounds/goon/skelly_exclaim.ogg b/sound/talksounds/goon/skelly_exclaim.ogg new file mode 100644 index 0000000000..79eb112d1a Binary files /dev/null and b/sound/talksounds/goon/skelly_exclaim.ogg differ diff --git a/sound/talksounds/goon/speak_1.ogg b/sound/talksounds/goon/speak_1.ogg new file mode 100644 index 0000000000..ab8ddde4a6 Binary files /dev/null and b/sound/talksounds/goon/speak_1.ogg differ diff --git a/sound/talksounds/goon/speak_1_ask.ogg b/sound/talksounds/goon/speak_1_ask.ogg new file mode 100644 index 0000000000..89d631c6f6 Binary files /dev/null and b/sound/talksounds/goon/speak_1_ask.ogg differ diff --git a/sound/talksounds/goon/speak_1_exclaim.ogg b/sound/talksounds/goon/speak_1_exclaim.ogg new file mode 100644 index 0000000000..3be20fef39 Binary files /dev/null and b/sound/talksounds/goon/speak_1_exclaim.ogg differ diff --git a/sound/talksounds/goon/speak_2.ogg b/sound/talksounds/goon/speak_2.ogg new file mode 100644 index 0000000000..a8c9444a52 Binary files /dev/null and b/sound/talksounds/goon/speak_2.ogg differ diff --git a/sound/talksounds/goon/speak_2_ask.ogg b/sound/talksounds/goon/speak_2_ask.ogg new file mode 100644 index 0000000000..a2c9c86385 Binary files /dev/null and b/sound/talksounds/goon/speak_2_ask.ogg differ diff --git a/sound/talksounds/goon/speak_2_exclaim.ogg b/sound/talksounds/goon/speak_2_exclaim.ogg new file mode 100644 index 0000000000..7e0838d721 Binary files /dev/null and b/sound/talksounds/goon/speak_2_exclaim.ogg differ diff --git a/sound/talksounds/goon/speak_3.ogg b/sound/talksounds/goon/speak_3.ogg new file mode 100644 index 0000000000..33ec079b84 Binary files /dev/null and b/sound/talksounds/goon/speak_3.ogg differ diff --git a/sound/talksounds/goon/speak_3_ask.ogg b/sound/talksounds/goon/speak_3_ask.ogg new file mode 100644 index 0000000000..13156c332e Binary files /dev/null and b/sound/talksounds/goon/speak_3_ask.ogg differ diff --git a/sound/talksounds/goon/speak_3_exclaim.ogg b/sound/talksounds/goon/speak_3_exclaim.ogg new file mode 100644 index 0000000000..e10eb615b0 Binary files /dev/null and b/sound/talksounds/goon/speak_3_exclaim.ogg differ diff --git a/sound/talksounds/goon/speak_4.ogg b/sound/talksounds/goon/speak_4.ogg new file mode 100644 index 0000000000..6de26114ae Binary files /dev/null and b/sound/talksounds/goon/speak_4.ogg differ diff --git a/sound/talksounds/goon/speak_4_ask.ogg b/sound/talksounds/goon/speak_4_ask.ogg new file mode 100644 index 0000000000..76421d8fdd Binary files /dev/null and b/sound/talksounds/goon/speak_4_ask.ogg differ diff --git a/sound/talksounds/goon/speak_4_exclaim.ogg b/sound/talksounds/goon/speak_4_exclaim.ogg new file mode 100644 index 0000000000..ae6f3985be Binary files /dev/null and b/sound/talksounds/goon/speak_4_exclaim.ogg differ diff --git a/sound/talksounds/h.ogg b/sound/talksounds/h.ogg new file mode 100644 index 0000000000..9ed1f01341 Binary files /dev/null and b/sound/talksounds/h.ogg differ diff --git a/sound/talksounds/me_a.ogg b/sound/talksounds/me_a.ogg new file mode 100644 index 0000000000..8cb55c54f5 Binary files /dev/null and b/sound/talksounds/me_a.ogg differ diff --git a/sound/talksounds/me_b.ogg b/sound/talksounds/me_b.ogg new file mode 100644 index 0000000000..48e6b61d59 Binary files /dev/null and b/sound/talksounds/me_b.ogg differ diff --git a/sound/talksounds/me_c.ogg b/sound/talksounds/me_c.ogg new file mode 100644 index 0000000000..65476ee720 Binary files /dev/null and b/sound/talksounds/me_c.ogg differ diff --git a/sound/talksounds/me_d.ogg b/sound/talksounds/me_d.ogg new file mode 100644 index 0000000000..45d44bf2a1 Binary files /dev/null and b/sound/talksounds/me_d.ogg differ diff --git a/sound/talksounds/me_e.ogg b/sound/talksounds/me_e.ogg new file mode 100644 index 0000000000..d56c27d97d Binary files /dev/null and b/sound/talksounds/me_e.ogg differ diff --git a/sound/talksounds/me_f.ogg b/sound/talksounds/me_f.ogg new file mode 100644 index 0000000000..25e9754fec Binary files /dev/null and b/sound/talksounds/me_f.ogg differ diff --git a/sound/talksounds/subtle_sound.ogg b/sound/talksounds/subtle_sound.ogg new file mode 100644 index 0000000000..b8986f13fc Binary files /dev/null and b/sound/talksounds/subtle_sound.ogg differ diff --git a/tgui/public/tgui.html b/tgui/public/tgui.html index 07d74341f7..b5fc63f0c8 100644 --- a/tgui/public/tgui.html +++ b/tgui/public/tgui.html @@ -301,6 +301,7 @@ if (type === 'js') { var node = document.createElement('script'); node.type = 'text/javascript'; + node.crossOrigin = 'anonymous'; // IE8: Prefer non-https protocols node.src = Byond.IS_LTE_IE9 ? url.replace('https://', 'http://') diff --git a/vorestation.dme b/vorestation.dme index 1d12d4b2fb..5b8c0609c9 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -3045,6 +3045,7 @@ #include "code\modules\mob\living\carbon\human\species\station\teshari_vr.dm" #include "code\modules\mob\living\carbon\human\species\station\xenochimera_hud_vr.dm" #include "code\modules\mob\living\carbon\human\species\station\xenochimera_trait_vr.dm" +#include "code\modules\mob\living\carbon\human\species\station\traits_vr\_traits.dm" #include "code\modules\mob\living\carbon\human\species\station\traits_vr\negative.dm" #include "code\modules\mob\living\carbon\human\species\station\traits_vr\negative_ch.dm" #include "code\modules\mob\living\carbon\human\species\station\traits_vr\neutral.dm"