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"