Merge branch 'master' into upstream-merge-13352

This commit is contained in:
Nadyr
2022-07-20 20:16:05 -04:00
committed by GitHub
134 changed files with 1076 additions and 205 deletions
+11 -4
View File
@@ -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)
/obj/item/slime_extract/rainbow = 1)
+1
View File
@@ -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"
+2 -1
View File
@@ -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
+6 -1
View File
@@ -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"
*/
+4 -1
View File
@@ -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"
@@ -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)
+2 -2
View File
@@ -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, "<span class='warning'>You can't fit in this suit!</span>")
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, "<span class='warning'>You can't fit in this suit!</span>")
return
else
+3
View File
@@ -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
@@ -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
@@ -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
+7 -1
View File
@@ -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"
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'
+15
View File
@@ -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')
+43 -1
View File
@@ -49,4 +49,46 @@
/obj/item/clothing/accessory/holster/hip,
/obj/item/clothing/head/cowboy/ranger,
/obj/item/clothing/shoes/boots/cowboy/brown
)
)
/obj/item/weapon/storage/box/roulette_balls_normal
name = "roulette ball box"
desc = "A box of spare roulette balls."
icon_state = "balls"
can_hold = list(/obj/item/roulette_ball)
starts_with = list(
/obj/item/roulette_ball = 7,
/obj/item/roulette_ball/hollow = 2)
/obj/item/weapon/storage/box/roulette_balls_fancy
name = "fancy roulette ball box"
desc = "A box of extra-pretty roulette balls."
icon_state = "balls"
can_hold = list(/obj/item/roulette_ball)
starts_with = list(
/obj/item/roulette_ball,
/obj/item/roulette_ball/hollow,
/obj/item/roulette_ball/red,
/obj/item/roulette_ball/orange,
/obj/item/roulette_ball/yellow,
/obj/item/roulette_ball/green,
/obj/item/roulette_ball/blue,
/obj/item/roulette_ball/purple,
/obj/item/roulette_ball/moon,
/obj/item/roulette_ball/planet,
/obj/item/roulette_ball/gold)
/obj/item/weapon/storage/box/roulette_balls_cheat
name = "special roulette ball box"
desc = "A box of 'special' roulette balls."
icon_state = "balls"
can_hold = list(/obj/item/roulette_ball)
starts_with = list(
/obj/item/roulette_ball/cheat/first_twelve,
/obj/item/roulette_ball/cheat/second_twelve,
/obj/item/roulette_ball/cheat/third_twelve,
/obj/item/roulette_ball/cheat/red,
/obj/item/roulette_ball/cheat/black,
/obj/item/roulette_ball/cheat/zeros,
/obj/item/roulette_ball/cheat/odd,
/obj/item/roulette_ball/cheat/even)
+279 -17
View File
@@ -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,"<span class='notice'>You cannot spin now! The roulette is already spinning.</span> ")
return
visible_message("<span class='notice'>\ [user] spins the roulette and throws inside little ball.</span>")
if(!ball)
to_chat(user,"<span class='notice'>This roulette wheel has no ball!</span> ")
return
visible_message("<span class='notice'>\The [user] spins the roulette and throws [ball.get_ball_desc()] into it.</span>")
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("<span class='notice'>The roulette stops spinning, the ball landing on [result], [color].</span>")
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, "<span class='notice'>You insert [W] into [src].</span>")
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, "<span class='warning'>You cannot remove \the [ball] while [src] is spinning!</span>")
return
if(ball)
usr.put_in_hands(ball)
to_chat(usr, "<span class='notice'>You remove \the [ball] from [src].</span>")
ball = null
return
else
to_chat(usr, "<span class='notice'>There is no ball in [src]!</span>")
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, "<span class='notice'>This ball already has something trapped in it!</span>")
return
if(istype(W, /obj/item/weapon/holder))
var/obj/item/weapon/holder/H = W
if(!H.held_mob)
to_chat(user, "<span class='warning'>This holder has nobody in it? Yell at a developer!</span>")
return
if(H.held_mob.get_effective_size() > 50)
to_chat(user, "<span class='warning'>\The [H] is too big to fit inside!</span>")
return
user.drop_from_inventory(H)
H.forceMove(src)
trapped = H
to_chat(user, "<span class='notice'>You trap \the [H] inside the glass roulette ball.</span>")
to_chat(H.held_mob, "<span class='warning'>\The [user] traps you inside a glass roulette ball!</span>")
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, "<span class='notice'>\The [src] is empty!</span>")
return
else
user.put_in_hands(trapped)
if(trapped.held_mob)
to_chat(user, "<span class='notice'>You take \the [trapped] out of the glass roulette ball.</span>")
to_chat(trapped.held_mob, "<span class='notice'>\The [user] takes you out of a glass roulette ball.</span>")
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, "<span class='critical'>THE WHOLE WORLD IS SENT WHIRLING AS THE ROULETTE SPINS!!!</span>")
/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
+7 -2
View File
@@ -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
#endif
+36 -1
View File
@@ -86,7 +86,7 @@
return
sane = TRUE
break
if(!sane)
to_chat(src, "<span class='warning'>Sorry, that link doesn't appear to be valid. Please try again.</span>")
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")
*/
@@ -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()
. += "<b>Languages</b><br>"
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]<br>"
if(S.default_language && S.default_language != S.language)
. += "- [S.default_language]<br>"
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] - <a href='?src=\ref[src];remove_language=[i]'>remove</a><br>"
if(pref.alternate_languages.len < pref.numlanguage()) //CHOMPEdit
. += "- <a href='?src=\ref[src];add_language=1'>add</a> ([pref.numlanguage() - pref.alternate_languages.len] remaining)<br>" //CHOMPEdit
if(pref.alternate_languages.len < (S.num_alternate_languages + pref.extra_languages))
. += "- <a href='?src=\ref[src];add_language=1'>add</a> ([(S.num_alternate_languages + pref.extra_languages) - pref.alternate_languages.len] remaining)<br>"
else
. += "- [pref.species] cannot choose secondary languages.<br>"
@@ -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"])
@@ -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"
@@ -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"
allowed_roles = "Chaplain"
@@ -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)
. += "<br>"
. += "<b>Scale:</b> <a href='?src=\ref[src];size_multiplier=1'>[round(pref.size_multiplier*100)]%</a><br>"
. += "<b>Scaled Appearance:</b> <a [pref.fuzzy ? "" : ""] href='?src=\ref[src];toggle_fuzzy=1'><b>[pref.fuzzy ? "Fuzzy" : "Sharp"]</b></a><br>"
. += "<b>Voice Frequency:</b> <a href='?src=\ref[src];voice_freq=1'>[pref.voice_freq]</a><br>"
. += "<b>Voice Sounds:</b> <a href='?src=\ref[src];voice_sounds_list=1'>[pref.voice_sound]</a><br>"
. += "<br>"
. += "<b>Relative Weight:</b> <a href='?src=\ref[src];weight=1'>[pref.weight_vr]</a><br>"
. += "<b>Weight Gain Rate:</b> <a href='?src=\ref[src];weight_gain=1'>[pref.weight_gain]</a><br>"
@@ -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 ..();
@@ -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)
. += "<b>Custom Species Name:</b> "
@@ -164,38 +172,41 @@
. += "<a href='?src=\ref[src];custom_base=1'>[pref.custom_base ? pref.custom_base : "Human"]</a><br>"
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--
. += "<b>Traits Left:</b> [traits_left]<br>"
. += "<b>Points Left:</b> [points_left]<br>"
if(points_left < 0 || traits_left < 0 || !pref.custom_species)
. += "<span style='color:red;'><b>^ Fix things! ^</b></span><br>"
. += "<a href='?src=\ref[src];add_trait=[POSITIVE_MODE]'>Positive Trait(s) (Limited) +</a><br>" // CHOMPEdit: More obvious/clear to players.
. += "<ul>"
for(var/T in pref.pos_traits)
var/datum/trait/trait = positive_traits[T]
. += "<li>- <a href='?src=\ref[src];clicked_pos_trait=[T]'>[trait.name] ([trait.cost])</a></li>"
. += "</ul>"
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--
. += "<b>Traits Left:</b> [traits_left]<br>"
. += "<b>Points Left:</b> [points_left]<br>"
if(points_left < 0 || traits_left < 0 || (!pref.custom_species && pref.species == SPECIES_CUSTOM))
. += "<span style='color:red;'><b>^ Fix things! ^</b></span><br>"
. += "<a href='?src=\ref[src];add_trait=[POSITIVE_MODE]'>Positive Trait(s) (Limited) +</a><br>" // CHOMPEdit: More obvious/clear to players.
. += "<ul>"
for(var/T in pref.pos_traits)
var/datum/trait/trait = positive_traits[T]
. += "<li>- <a href='?src=\ref[src];clicked_pos_trait=[T]'>[trait.name] ([trait.cost])</a></li>"
. += "</ul>"
. += "<a href='?src=\ref[src];add_trait=[NEGATIVE_MODE]'>Negative Trait(s) (No Limit) +</a><br>" // CHOMPEdit: More obvious/clear to players.
. += "<ul>"
for(var/T in pref.neg_traits)
var/datum/trait/trait = negative_traits[T]
. += "<li>- <a href='?src=\ref[src];clicked_neg_trait=[T]'>[trait.name] ([trait.cost])</a></li>"
. += "</ul>"
. += "<a href='?src=\ref[src];add_trait=[NEUTRAL_MODE]'>Neutral Trait(s) (No Limit) +</a><br>" // CHOMPEdit: More obvious/clear to players.
. += "<ul>"
for(var/T in pref.neu_traits)
var/datum/trait/trait = neutral_traits[T]
. += "<li>- <a href='?src=\ref[src];clicked_neu_trait=[T]'>[trait.name] ([trait.cost])</a></li>"
. += "</ul>"
. += "<a href='?src=\ref[src];add_trait=[NEGATIVE_MODE]'>Negative Trait(s) (No Limit) +</a><br>" // CHOMPEdit: More obvious/clear to players.
. += "<ul>"
for(var/T in pref.neg_traits)
var/datum/trait/trait = negative_traits[T]
. += "<li>- <a href='?src=\ref[src];clicked_neg_trait=[T]'>[trait.name] ([trait.cost])</a></li>"
. += "</ul>"
. += "<b>Blood Color: </b>" //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.
. += "<a href='?src=\ref[src];blood_color=1'>Set Color</a>"
. += "<a href='?src=\ref[src];blood_reset=1'>R</a><br>"
@@ -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
-7
View File
@@ -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)
@@ -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"
@@ -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
+11
View File
@@ -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"]
+1
View File
@@ -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)
@@ -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]")
))
@@ -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]"),
+3 -1
View File
@@ -107,11 +107,13 @@ var/list/holder_mob_icon_cache = list()
to_chat(held, "<span class='warning'>You extricate yourself from [holster].</span>")
forceMove(get_turf(src))
held.reset_view(null)
else if(isitem(loc))
var/obj/item/I = loc
to_chat(held, "<span class='warning'>You struggle free of [loc].</span>")
forceMove(get_turf(src))
held.reset_view(null)
if(istype(I))
I.on_holder_escape(src)
//Mob specific holders.
/obj/item/weapon/holder/diona
+3 -3
View File
@@ -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"
+22 -10
View File
@@ -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")
+6 -6
View File
@@ -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"
+3 -3
View File
@@ -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")
@@ -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 = "<font color='blue'>They are small enough that you could easily pick them up!</font>"
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 = "<font color='red'>They are small enough that you could easily trample them!</font>"
return message
@@ -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)
@@ -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
@@ -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()
@@ -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
@@ -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)
@@ -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.
@@ -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
@@ -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
@@ -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
*/
@@ -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)
@@ -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
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
*/
@@ -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
H.verbs |= /mob/living/carbon/human/proc/sonar_ping
@@ -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
+71
View File
@@ -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
+38 -2
View File
@@ -13,13 +13,13 @@
to_chat(src,"<span class='notice'>Mob AI disabled while you are controlling the mob.</span>")
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 .
+12
View File
@@ -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
@@ -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()
@@ -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
+4 -1
View File
@@ -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]
+34
View File
@@ -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, "<span class='changeling'>The captive mind of \the [M] thinks, \"[message]\"</span>") //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, "<span class='changeling'>\The [M] thinks, \"[message]\"</span>") //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, "<span class='changeling'>The captive mind of \the [M] thinks, \"[message]\"</span>") //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, "<span class='changeling'>\The [M] thinks, \"[message]\"</span>") //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, "<span class='changeling'><b>\The [M] thinks, \"[message]\"</b></span>") //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, "<span class='changeling'><b>\The [M] thinks, \"[message]\"</b></span>") //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, "<span class='changeling'>You think \"[message]\"</span>") //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, "<span class='changeling'><b>You think \"[message]\"</b></span>") //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, "<span class='changeling'>\The [M] [message]</span>") //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, "<span class='changeling'>\The [M] [message]</span>") //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, "<span class='changeling'>\The [M] [message]</span>") //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, "<span class='changeling'>\The [M] [message]</span>") //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, "<span class='changeling'><b>\The [M] [message]</b></span>") //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, "<span class='changeling'><b>\The [M] [message]</b></span>") //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, "<span class='changeling'>\The [M] [message]</span>") //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, "<span class='changeling'><b>\The [M] [message]</b></span>") //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
@@ -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
+9 -3
View File
@@ -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)
..()
..()
@@ -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
+3 -2
View File
@@ -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)
+3 -1
View File
@@ -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, "<span class='notice'>You can taste the flavor of aromatic rolling paper and funny looks.</span>")
else if(istype(I,/obj/item/weapon/paper))
to_chat(src, "<span class='notice'>You can taste the dry flavor of bureaucracy.</span>")
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, "<span class='notice'>You can taste the bitter flavor of cheating.</span>")
else if(istype(I,/obj/item/weapon/lipstick))
to_chat(src, "<span class='notice'>You can taste the flavor of couture and style. Toddler at the make-up bag style.</span>")
@@ -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*/
+16 -8
View File
@@ -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)
@@ -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
+1
View File
@@ -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
@@ -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
//
Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 200 KiB

After

Width:  |  Height:  |  Size: 205 KiB

+9 -6
View File
@@ -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
+8 -1
View File
@@ -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
+2
View File
@@ -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"
+13 -10
View File
@@ -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
@@ -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"
+4 -1
View File
@@ -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
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More