mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2026-08-23 21:27:01 +01:00
Merge branch 'master' into upstream-merge-13352
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
*/
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'
|
||||
@@ -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')
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -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]"),
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 .
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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*/
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 |
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user