mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-13 03:33:21 +00:00
Merge branch 'CHOMPStation2:master' into Weapons/Armour
This commit is contained in:
@@ -3,4 +3,7 @@ dreamchecker = true
|
||||
|
||||
[code_standards]
|
||||
disallow_relative_type_definitions = true
|
||||
disallow_relative_proc_definitions = true
|
||||
disallow_relative_proc_definitions = true
|
||||
|
||||
[debugger]
|
||||
engine = "auxtools"
|
||||
|
||||
11
_runtimestation.dm
Normal file
11
_runtimestation.dm
Normal file
@@ -0,0 +1,11 @@
|
||||
/*
|
||||
Toggle this var to 1 to compile using runtime station instead.
|
||||
Useful if you're constantly having to recompile to debug something.
|
||||
*/
|
||||
#define RUNTIME_STATION 0
|
||||
|
||||
#if RUNTIME_STATION
|
||||
#include "modular_chomp/maps/runtime/runtime_station_defines.dm"
|
||||
#include "modular_chomp/maps/runtime/runtime_station.dmm"
|
||||
#define USING_MAP_DATUM /datum/map/runtime_station
|
||||
#endif
|
||||
@@ -43,6 +43,7 @@
|
||||
#define BE_MORPH 0x40000
|
||||
#define BE_CORGI 0x80000
|
||||
#define BE_CURSEDSWORD 0x100000
|
||||
#define BE_SURVIVOR 0x200000
|
||||
//VOREStation Add End
|
||||
|
||||
var/list/be_special_flags = list(
|
||||
@@ -68,6 +69,7 @@ var/list/be_special_flags = list(
|
||||
"Morph" = BE_MORPH,
|
||||
"Corgi" = BE_CORGI,
|
||||
"Cursed Sword" = BE_CURSEDSWORD,
|
||||
"Ship Survivor" = BE_SURVIVOR
|
||||
//VOREStation Add End
|
||||
)
|
||||
|
||||
@@ -111,6 +113,7 @@ var/list/be_special_flags = list(
|
||||
#define MODE_INFILTRATOR "infiltrator"
|
||||
#define MODE_THUG "thug"
|
||||
#define MODE_STOWAWAY "stowaway"
|
||||
#define MODE_SURVIVOR "Shipwreck Survivor"
|
||||
|
||||
#define DEFAULT_TELECRYSTAL_AMOUNT 120
|
||||
|
||||
@@ -176,4 +179,4 @@ var/list/be_special_flags = list(
|
||||
#define ASPECT_EMP "emp" //Unused now.
|
||||
#define ASPECT_UNSTABLE "unstable" //Heavily RNG-based, causes instability to the victim.
|
||||
#define ASPECT_CHROMATIC "chromatic" //Used to combine with other spells.
|
||||
#define ASPECT_UNHOLY "unholy" //Involves the dead, blood, and most things against divine beings.
|
||||
#define ASPECT_UNHOLY "unholy" //Involves the dead, blood, and most things against divine beings.
|
||||
|
||||
@@ -136,8 +136,9 @@
|
||||
#define CLASS_MIDDLE "Average"
|
||||
#define CLASS_LOWMID "Underpaid"
|
||||
#define CLASS_LOWER "Poor"
|
||||
#define CLASS_BROKE "Broke" //VOREStation Add
|
||||
|
||||
#define ECONOMIC_CLASS list(CLASS_UPPER,CLASS_UPMID,CLASS_MIDDLE,CLASS_LOWMID,CLASS_LOWER)
|
||||
#define ECONOMIC_CLASS list(CLASS_UPPER,CLASS_UPMID,CLASS_MIDDLE,CLASS_LOWMID,CLASS_LOWER,CLASS_BROKE)
|
||||
|
||||
|
||||
// Defines mob sizes, used by lockers and to determine what is considered a small sized mob, etc.
|
||||
|
||||
@@ -218,40 +218,24 @@
|
||||
|
||||
return hear
|
||||
|
||||
var/mobs_radio_range_fired = 1 //CHOMPEdit
|
||||
//CHOMPEdit - entire proc changed basically to use recursive listening
|
||||
/proc/get_mobs_in_radio_ranges(var/list/obj/item/device/radio/radios)
|
||||
|
||||
set background = 1
|
||||
var/our_iter = num2text(++mobs_radio_range_fired) //CHOMPEdit
|
||||
. = list()
|
||||
// Returns a list of mobs who can hear any of the radios given in @radios
|
||||
var/list/speaker_coverage = list()
|
||||
for(var/obj/item/device/radio/R as anything in radios)
|
||||
var/turf/speaker = get_turf(R)
|
||||
if(speaker)
|
||||
if(get_turf(R))
|
||||
for(var/turf/T in R.can_broadcast_to()) //CHOMPEdit
|
||||
T.temp_check[our_iter] = TRUE //CHOMPEdit
|
||||
speaker_coverage[T] = R
|
||||
for (var/atom/movable/hearing in T)
|
||||
if (hearing.recursive_listeners)
|
||||
. |= hearing.recursive_listeners
|
||||
|
||||
CHECK_TICK //CHOMPEdit
|
||||
// Try to find all the players who can hear the message
|
||||
//CHOMPEdit Begin
|
||||
//So, to explain a bit here: The old code that used to be here was pretty slow for a few reasons, most of which have been addressed now.
|
||||
//Unsurprisingly, checking through the entire list of turfs within a radio's range for every mob's turf to see if it's in there is very slow.
|
||||
//So, instead, we set a variable in a list on the turf that's unique to this runthrough(and thus multiple of these can run simultaneously)
|
||||
//Then we just have to check if that variable is true for the turf the mob is on, and if it is, add that mob to our list.
|
||||
for(var/i = 1; i <= player_list.len; i++)
|
||||
var/mob/M = player_list[i]
|
||||
var/turf/T = get_turf(M)
|
||||
if(istype(T) && T.temp_check[our_iter])
|
||||
. += M
|
||||
else if(istype(M,/mob/observer)) //Give ghosts global hearing.
|
||||
. += M
|
||||
CHECK_TICK
|
||||
for(var/turf/T in speaker_coverage)
|
||||
T.temp_check -= our_iter //Freeing up the memory.
|
||||
//CHOMPEdit End
|
||||
return .
|
||||
for (var/mob/M as anything in .)
|
||||
if (!istype(M) || !M.client)
|
||||
. -= M
|
||||
for (var/mob/observer/O in player_list)
|
||||
. |= O
|
||||
|
||||
/mob/proc/can_hear_radio(var/list/hearturfs)
|
||||
return FALSE
|
||||
|
||||
@@ -946,6 +946,26 @@ var/global/list/event_wildlife_roaming = list(
|
||||
)
|
||||
|
||||
|
||||
var/global/list/selectable_speech_bubbles = list(
|
||||
"default",
|
||||
"normal",
|
||||
"slime",
|
||||
"comm",
|
||||
"machine",
|
||||
"synthetic",
|
||||
"synthetic_evil",
|
||||
"cyber",
|
||||
"ghost",
|
||||
"slime_green",
|
||||
"dark",
|
||||
"plant",
|
||||
"clown",
|
||||
"fox",
|
||||
"maus",
|
||||
"heart",
|
||||
"textbox",
|
||||
"posessed")
|
||||
|
||||
|
||||
|
||||
// AREA GENERATION AND BLUEPRINT STUFF BELOW HERE
|
||||
|
||||
@@ -232,7 +232,7 @@
|
||||
curblend = BLEND_OVERLAY
|
||||
add = icon(I.icon, I.icon_state, base_icon_dir)
|
||||
else // 'I' is an appearance object.
|
||||
add = getFlatIcon(image(I), I.dir||curdir, curicon, curstate, curblend, FALSE, no_anim)
|
||||
add = getFlatIcon(image(I), curdir, curicon, curstate, curblend, FALSE, no_anim)
|
||||
if(!add)
|
||||
continue
|
||||
// Find the new dimensions of the flat icon to fit the added overlay
|
||||
|
||||
@@ -826,10 +826,22 @@ Turf and target are seperate in case you want to teleport some distance from a t
|
||||
else
|
||||
O=new original.type(locate(0,0,0))
|
||||
|
||||
var/static/list/blacklisted_var_names = list(
|
||||
"ATOM_TOPIC_EXAMINE",
|
||||
"type",
|
||||
"loc",
|
||||
"locs",
|
||||
"vars",
|
||||
"parent",
|
||||
"parent_type",
|
||||
"verbs",
|
||||
"ckey",
|
||||
"key"
|
||||
)
|
||||
if(perfectcopy)
|
||||
if((O) && (original))
|
||||
for(var/V in original.vars)
|
||||
if(!(V in list("type","loc","locs","vars", "parent", "parent_type","verbs","ckey","key")))
|
||||
if(!(V in blacklisted_var_names))
|
||||
O.vars[V] = original.vars[V]
|
||||
return O
|
||||
|
||||
|
||||
@@ -79,7 +79,7 @@ SUBSYSTEM_DEF(vote)
|
||||
if(transfer_votes / total_votes > 0.7)
|
||||
greatest_votes = transfer_votes
|
||||
. = list("Initiate Crew Transfer")
|
||||
else
|
||||
else
|
||||
greatest_votes = extend_votes
|
||||
. = list("Extend the Shift")
|
||||
else
|
||||
@@ -233,7 +233,7 @@ SUBSYSTEM_DEF(vote)
|
||||
if(ticker.current_state <= GAME_STATE_SETTING_UP)
|
||||
to_chat(initiator_key, "The crew transfer button has been disabled!")
|
||||
return 0
|
||||
question = "Your PDA beeps with a message from Central. Would you like an additional hour to finish ongoing projects?" //Yawn Wider Edit //CHOMP EDIT: Changed to 'one' hour.
|
||||
question = "Your PDA beeps with a message from Central. Would you like an additional hour to finish ongoing projects? (OOC Notice: Transfer votes must have a majority (70%) of all votes to initiate transfer.)" //Yawn Wider Edit //CHOMP EDIT: Changed to 'one' hour. Add notice stating transfer must contain 70% of total vote.
|
||||
choices.Add("Initiate Crew Transfer", "Extend the Shift") //VOREStation Edit
|
||||
if(VOTE_ADD_ANTAGONIST)
|
||||
if(!config.allow_extra_antags || ticker.current_state >= GAME_STATE_SETTING_UP)
|
||||
|
||||
@@ -198,3 +198,12 @@
|
||||
Would you like to play as the soul imprisoned within?"
|
||||
be_special_flag = BE_CURSEDSWORD
|
||||
cutoff_number = 1
|
||||
|
||||
/datum/ghost_query/shipwreck_survivor
|
||||
role_name = "Shipwreck survivor"
|
||||
question = "A person suspended in cryosleep has been discovered by a crewmember \
|
||||
aboard a wrecked spaceship \
|
||||
and they are attempting to open the cryopod.\n \
|
||||
Would you like to play as the occupant? \n \
|
||||
You MUST NOT use your station character!!!"
|
||||
cutoff_number = 1
|
||||
|
||||
62
code/datums/looping_sounds/alarm_sounds.dm
Normal file
62
code/datums/looping_sounds/alarm_sounds.dm
Normal file
@@ -0,0 +1,62 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/looping_sound/alarm
|
||||
volume_chan = VOLUME_CHANNEL_ALARMS
|
||||
pref_check = /datum/client_preference/looping_alarms
|
||||
|
||||
/datum/looping_sound/alarm/fire_alarm // Commented out start/end as I don't feel they're very fitting
|
||||
// start_sound = 'sound/effects/alarms/fire_alarm/fire_alarm_start.ogg'
|
||||
// start_length = 40
|
||||
mid_sounds = list('sound/effects/alarms/fire_alarm/fire_alarm_mid.ogg' = 1)
|
||||
mid_length = 6 SECONDS // Exact loop, these things should be constantly running while there's a fire actively going
|
||||
// end_sound = 'sound/effects/alarms/fire_alarm/fire_alarm_stop.ogg'
|
||||
volume = 30
|
||||
extra_range = 60 // Alarms should be clearly heard from far away
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/looping_sound/alarm/decompression_alarm
|
||||
mid_sounds = list('sound/effects/alarms/decon_alarm.ogg'=1)
|
||||
mid_length = 4 SECONDS // Delay by 1 second so as to not spam it
|
||||
volume = 100
|
||||
extra_range = 20
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/looping_sound/alarm/engineering_alarm
|
||||
mid_sounds = list('sound/effects/alarms/engineering_alarm.ogg'=1)
|
||||
mid_length = 30
|
||||
volume = 20
|
||||
extra_range = 30
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/looping_sound/alarm/threat_level_high
|
||||
mid_sounds = list('sound/effects/alarms/threat_level_high.ogg'=1)
|
||||
mid_length = 4 SECONDS
|
||||
volume = 60
|
||||
extra_range = 40
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/looping_sound/alarm/threat_level_extreme
|
||||
mid_sounds = list('sound/effects/alarms/threat_level_extreme.ogg'=1)
|
||||
mid_length = 4 SECONDS
|
||||
volume = 60
|
||||
extra_range = 40
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/looping_sound/alarm/sm_critical_alarm
|
||||
mid_sounds = list('sound/effects/alarms/crit_alarm.ogg'=1)
|
||||
mid_length = 3 SECONDS
|
||||
volume = 90
|
||||
extra_range = 40
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/looping_sound/alarm/sm_causality_alarm
|
||||
mid_sounds = list('sound/effects/alarms/causality_alarm.ogg'=1)
|
||||
mid_length = 9 SECONDS
|
||||
volume = 80
|
||||
extra_range = 60
|
||||
@@ -220,7 +220,7 @@
|
||||
|
||||
/datum/supply_pack/eng/smbig
|
||||
name = "Supermatter Core"
|
||||
contains = list(/obj/machinery/power/supermatter)
|
||||
contains = list(/obj/machinery/power/supermatter/station) // CHOMPEdit: Station SM for Cargo Orders
|
||||
cost = 150
|
||||
containertype = /obj/structure/closet/crate/secure/phoron
|
||||
containername = "Supermatter crate (CAUTION)"
|
||||
|
||||
@@ -72,15 +72,16 @@
|
||||
/obj/item/device/camera_film = 2,
|
||||
/obj/item/weapon/storage/photo_album,
|
||||
/obj/item/weapon/packageWrap,
|
||||
/obj/item/weapon/reagent_containers/glass/paint/red,
|
||||
/obj/item/weapon/reagent_containers/glass/paint/green,
|
||||
/obj/item/weapon/reagent_containers/glass/paint/blue,
|
||||
/obj/item/weapon/reagent_containers/glass/paint/yellow,
|
||||
/obj/item/weapon/reagent_containers/glass/paint/purple,
|
||||
/obj/item/weapon/reagent_containers/glass/paint/black,
|
||||
/obj/item/weapon/reagent_containers/glass/paint/white,
|
||||
/obj/item/poster/custom,
|
||||
/obj/item/weapon/wrapping_paper = 3
|
||||
/obj/item/weapon/wrapping_paper = 3,
|
||||
/obj/structure/easel,
|
||||
/obj/item/paint_brush,
|
||||
/obj/item/paint_palette,
|
||||
/obj/item/canvas = 3,
|
||||
/obj/item/canvas/nineteen_nineteen = 2,
|
||||
/obj/item/canvas/twentythree_nineteen = 2,
|
||||
/obj/item/canvas/twentythree_twentythree = 2,
|
||||
/obj/item/canvas/twentyfour_twentyfour = 2
|
||||
)
|
||||
cost = 10
|
||||
containertype = /obj/structure/closet/crate/allico
|
||||
@@ -94,7 +95,17 @@
|
||||
contains = list(
|
||||
/obj/item/device/pipe_painter = 2,
|
||||
/obj/item/device/floor_painter = 2,
|
||||
///obj/item/device/closet_painter = 2
|
||||
/obj/item/weapon/reagent_containers/glass/paint/red,
|
||||
/obj/item/weapon/reagent_containers/glass/paint/green,
|
||||
/obj/item/weapon/reagent_containers/glass/paint/blue,
|
||||
/obj/item/weapon/reagent_containers/glass/paint/yellow,
|
||||
/obj/item/weapon/reagent_containers/glass/paint/violet,
|
||||
/obj/item/weapon/reagent_containers/glass/paint/cyan,
|
||||
/obj/item/weapon/reagent_containers/glass/paint/orange,
|
||||
/obj/item/weapon/reagent_containers/glass/paint/purple,
|
||||
/obj/item/weapon/reagent_containers/glass/paint/grey,
|
||||
/obj/item/weapon/reagent_containers/glass/paint/black,
|
||||
/obj/item/weapon/reagent_containers/glass/paint/white = 3
|
||||
)
|
||||
|
||||
/datum/supply_pack/recreation/cheapbait
|
||||
|
||||
@@ -77,4 +77,14 @@
|
||||
/datum/category_item/underwear/bottom/neko
|
||||
name = "Panties, Neko"
|
||||
icon_state = "panties_neko"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/bottom/swimbottom
|
||||
name = "Swimming Bottoms"
|
||||
icon_state = "swimbottom"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/bottom/onepiece
|
||||
name = "Swimming One Piece"
|
||||
icon_state = "onepiece"
|
||||
has_color = TRUE
|
||||
@@ -90,4 +90,9 @@
|
||||
/datum/category_item/underwear/top/sarashi
|
||||
name = "Sarashi"
|
||||
icon_state = "bandages"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/top/swimtop
|
||||
name = "Swimming Top"
|
||||
icon_state = "swimtop"
|
||||
has_color = TRUE
|
||||
45
code/game/antagonist/outsider/shipwreck_survivor.dm
Normal file
45
code/game/antagonist/outsider/shipwreck_survivor.dm
Normal file
@@ -0,0 +1,45 @@
|
||||
var/datum/antagonist/shipwreck_survivor/survivors
|
||||
|
||||
//Shipwreck survivors can only spawn from ghost_pods at time of this commit.
|
||||
//These are NOT meant to be real antagonists
|
||||
//They are, at best, comparable to ERT.
|
||||
/datum/antagonist/SURVIVOR
|
||||
id = MODE_SURVIVOR
|
||||
role_type = BE_SURVIVOR
|
||||
role_text = "Shipwreck Survivor"
|
||||
role_text_plural = "Shipwreck Survivors"
|
||||
bantype = "Shipwreck Survivor" //also blocked by GhostRoles ban, in current implementation at least
|
||||
welcome_text = "Something disastrous happened to the ship you were on! You awaken to your supposed rescuers in pain..."
|
||||
antag_text = "You are a <b>NOT</b> an antagonist! All rules apply to you as well. Your job is to help make the world seem more alive. \n \
|
||||
You are not an existing station character, but some average person who has suffered a terrible accident. \
|
||||
Feel free to make up what happened to the ship you awakened on as you please, \
|
||||
but listening to your rescuers for context might help improve your mutual immersion! \n \
|
||||
Please play along. It is OK to not be co-operative, but <i>'yes, and'</i> and \
|
||||
<i>'no, but'</i> are better ways to approach things than to shut them down outright.\n\n \
|
||||
Please ahelp if you are uncertain about anything pertaining to this role. \
|
||||
It is always better to be safe than sorry! \n\n \
|
||||
You will receive the option to set your ambitions. Please remember the server rules \
|
||||
abuse can mean being banned from ghost roles \n \
|
||||
You should use your ambitions to flesh out why your ship got wrecked \
|
||||
and how you wish to proceed now that you were rescued. \n \
|
||||
You <b>DON'T</b> need to set your ambitions. Feel free to ignore them."
|
||||
|
||||
antag_sound = 'sound/voice/hiss1.ogg'
|
||||
|
||||
can_speak_aooc = FALSE
|
||||
can_hear_aooc = FALSE
|
||||
|
||||
/datum/antagonist/SURVIVOR/greet(var/datum/mind/player)
|
||||
to_chat(player.current, SPAN_WARNING("You are a <b>NOT</b> an antagonist! All rules apply to you as well. Your job is to help make the world seem more alive. \n \
|
||||
You are not an existing station character, but some average person who has suffered a terrible accident. \
|
||||
Feel free to make up what happened to the ship you awakened on as you please, \
|
||||
but listening to your rescuers for context might help improve your mutual immersion! \n \
|
||||
Please play along. It is OK to not be co-operative, but <i>'yes, and'</i> and \
|
||||
<i>'no, but'</i> are better ways to approach things than to shut them down outright.\n\n \
|
||||
Please ahelp if you are uncertain about anything pertaining to this role. \
|
||||
It is always better to be safe than sorry! \n\n \
|
||||
You will receive the option to set your ambitions. Please remember the server rules \
|
||||
abuse can mean being banned from ghost roles \n \
|
||||
You should use your ambitions to flesh out why your ship got wrecked \
|
||||
and how you wish to proceed now that you were rescued. \n \
|
||||
You <b>DON'T</b> need to set your ambitions. Feel free to ignore them."))
|
||||
51
code/game/atoms_movable_ch.dm
Normal file
51
code/game/atoms_movable_ch.dm
Normal file
@@ -0,0 +1,51 @@
|
||||
#define NON_LISTENING_ATOM 0
|
||||
#define LISTENING_ATOM 1
|
||||
#define LISTENING_PLAYER 2
|
||||
//gonna be honest this is really just a ripoff of tg's recursive hearing
|
||||
/atom/movable
|
||||
var/recursive_listeners
|
||||
var/listening_recursive = NON_LISTENING_ATOM
|
||||
|
||||
/atom/movable/New()
|
||||
. = ..()
|
||||
if (listening_recursive)
|
||||
set_listening(listening_recursive)
|
||||
|
||||
/atom/movable/proc/set_listening(var/set_to)
|
||||
if (listening_recursive && !set_to)
|
||||
LAZYREMOVE(recursive_listeners, src)
|
||||
if (!LAZYLEN(recursive_listeners))
|
||||
for (var/atom/movable/location as anything in get_nested_locs(src))
|
||||
LAZYREMOVE(location.recursive_listeners, src)
|
||||
if (!listening_recursive && set_to)
|
||||
LAZYOR(recursive_listeners, src)
|
||||
for (var/atom/movable/location as anything in get_nested_locs(src))
|
||||
LAZYOR(location.recursive_listeners, src)
|
||||
listening_recursive = set_to
|
||||
|
||||
///Returns a list of all locations (except the area) the movable is within.
|
||||
/proc/get_nested_locs(atom/movable/atom_on_location, include_turf = FALSE)
|
||||
. = list()
|
||||
var/atom/location = atom_on_location.loc
|
||||
var/turf/our_turf = get_turf(atom_on_location)
|
||||
while(location && location != our_turf)
|
||||
. += location
|
||||
location = location.loc
|
||||
if(our_turf && include_turf) //At this point, only the turf is left, provided it exists.
|
||||
. += our_turf
|
||||
|
||||
/atom/movable/Exited(atom/movable/gone, atom/new_loc)
|
||||
. = ..()
|
||||
|
||||
if (!LAZYLEN(gone.recursive_listeners))
|
||||
return
|
||||
for (var/atom/movable/location as anything in get_nested_locs(src)|src)
|
||||
LAZYREMOVE(location.recursive_listeners, gone.recursive_listeners)
|
||||
|
||||
/atom/movable/Entered(atom/movable/arrived, atom/old_loc)
|
||||
. = ..()
|
||||
|
||||
if (!LAZYLEN(arrived.recursive_listeners))
|
||||
return
|
||||
for (var/atom/movable/location as anything in get_nested_locs(src)|src)
|
||||
LAZYOR(location.recursive_listeners, arrived.recursive_listeners)
|
||||
@@ -70,6 +70,7 @@
|
||||
if(CLASS_MIDDLE) income = 1
|
||||
if(CLASS_LOWMID) income = 0.75
|
||||
if(CLASS_LOWER) income = 0.50
|
||||
if(CLASS_BROKE) income = 0 //VOREStation Add - Rent's not cheap
|
||||
|
||||
//give them an account in the station database
|
||||
var/money_amount = (rand(15,40) + rand(15,40)) * income * economic_modifier * ECO_MODIFIER //VOREStation Edit - Smoothed peaks, ECO_MODIFIER rather than per-species ones.
|
||||
@@ -186,4 +187,4 @@
|
||||
return TRUE
|
||||
if(brain_type in banned_job_species)
|
||||
return TRUE
|
||||
*/
|
||||
*/
|
||||
|
||||
@@ -84,6 +84,9 @@
|
||||
|
||||
var/alarms_hidden = FALSE //If the alarms from this machine are visible on consoles
|
||||
|
||||
var/datum/looping_sound/alarm/decompression_alarm/soundloop // CHOMPEdit: Looping Alarms
|
||||
var/atmoswarn = FALSE // CHOMPEdit: Looping Alarms
|
||||
|
||||
/obj/machinery/alarm/nobreach
|
||||
breach_detection = 0
|
||||
|
||||
@@ -128,6 +131,7 @@
|
||||
if(alarm_area && alarm_area.master_air_alarm == src)
|
||||
alarm_area.master_air_alarm = null
|
||||
elect_master(exclude_self = TRUE)
|
||||
QDEL_NULL(soundloop) // CHOMPEdit: Looping Alarms
|
||||
return ..()
|
||||
|
||||
/obj/machinery/alarm/proc/offset_airalarm()
|
||||
@@ -165,6 +169,7 @@
|
||||
set_frequency(frequency)
|
||||
if(!master_is_operating())
|
||||
elect_master()
|
||||
soundloop = new(list(src), FALSE) // CHOMPEdit: Looping Alarms
|
||||
|
||||
/obj/machinery/alarm/process()
|
||||
if((stat & (NOPOWER|BROKEN)) || shorted)
|
||||
@@ -194,6 +199,13 @@
|
||||
mode = AALARM_MODE_FILL
|
||||
apply_mode()
|
||||
|
||||
if(alarm_area?.atmosalm || danger_level > 0) // CHOMPEdit: Looping Alarms (Trigger Decompression alarm here, on detection of any breach in the area)
|
||||
soundloop.start() // CHOMPEdit: Looping Alarms
|
||||
atmoswarn = TRUE // CHOMPEdit: Looping Alarms
|
||||
else if(danger_level == 0 && alarm_area?.atmosalm == 0) // CHOMPEdit: Looping Alarms (Cancel Decompression alarm here)
|
||||
soundloop.stop() // CHOMPEdit: Looping Alarms
|
||||
atmoswarn = FALSE // CHOMPEdit: Looping Alarms
|
||||
|
||||
//atmos computer remote controll stuff
|
||||
switch(rcon_setting)
|
||||
if(RCON_NO)
|
||||
@@ -831,6 +843,12 @@
|
||||
..()
|
||||
spawn(rand(0,15))
|
||||
update_icon()
|
||||
// CHOMPEdit Start: Looping Alarms
|
||||
if(stat & (NOPOWER | BROKEN))
|
||||
soundloop.stop()
|
||||
else if(atmoswarn)
|
||||
soundloop.start()
|
||||
// CHOMPEdit End
|
||||
|
||||
// VOREStation Edit Start
|
||||
/obj/machinery/alarm/freezer
|
||||
@@ -845,14 +863,14 @@
|
||||
/obj/machinery/alarm/sifwilderness
|
||||
breach_detection = 0
|
||||
report_danger_level = 0
|
||||
|
||||
|
||||
/obj/machinery/alarm/sifwilderness/first_run()
|
||||
. = ..()
|
||||
|
||||
|
||||
TLV["oxygen"] = list(16, 17, 135, 140)
|
||||
TLV["pressure"] = list(0,ONE_ATMOSPHERE*0.10,ONE_ATMOSPHERE*1.50,ONE_ATMOSPHERE*1.60)
|
||||
TLV["temperature"] = list(T0C - 40, T0C - 31, T0C + 40, T0C + 120)
|
||||
// CHOMPEdit END
|
||||
#undef LOAD_TLV_VALUES
|
||||
#undef TEST_TLV_VALUES
|
||||
#undef DECLARE_TLV_VALUES
|
||||
#undef DECLARE_TLV_VALUES
|
||||
|
||||
@@ -26,6 +26,16 @@ FIRE ALARM
|
||||
circuit = /obj/item/weapon/circuitboard/firealarm
|
||||
var/alarms_hidden = FALSE //If the alarms from this machine are visible on consoles
|
||||
|
||||
var/datum/looping_sound/alarm/fire_alarm/soundloop // CHOMPEdit: Soundloops
|
||||
var/datum/looping_sound/alarm/engineering_alarm/engalarm // CHOMPEdit: Soundloops
|
||||
var/datum/looping_sound/alarm/sm_critical_alarm/critalarm // CHOMPEdit: Soundloops
|
||||
var/datum/looping_sound/alarm/sm_causality_alarm/causality // CHOMPEdit: Soundloops
|
||||
|
||||
var/firewarn = FALSE // CHOMPEdit: Looping Alarms
|
||||
var/engwarn = FALSE // CHOMPEdit: Looping Alarms
|
||||
var/critwarn = FALSE // CHOMPEdit: Looping Alarms
|
||||
var/causalitywarn = FALSE // CHOMPEdit: Looping Alarms
|
||||
|
||||
/obj/machinery/firealarm/alarms_hidden
|
||||
alarms_hidden = TRUE
|
||||
|
||||
@@ -51,6 +61,18 @@ FIRE ALARM
|
||||
if(z in using_map.contact_levels)
|
||||
set_security_level(security_level ? get_security_level() : "green")
|
||||
|
||||
soundloop = new(list(src), FALSE) // CHOMPEdit: Create soundloop
|
||||
engalarm = new(list(src), FALSE) // CHOMPEdit: Create soundloop
|
||||
critalarm = new(list(src), FALSE) // CHOMPEdit: Create soundloop
|
||||
causality = new(list(src), FALSE) // CHOMPEdit: Create soundloop
|
||||
|
||||
/obj/machinery/firealarm/Destroy()
|
||||
QDEL_NULL(soundloop) // CHOMPEdit: Just clearing the loop here
|
||||
QDEL_NULL(engalarm) // CHOMPEdit: Clearing the loop here too
|
||||
QDEL_NULL(critalarm) // CHOMPEdit: Clearing the loop here too
|
||||
QDEL_NULL(causality) // CHOMPEdit: Clearing the loop here too
|
||||
return ..()
|
||||
|
||||
/obj/machinery/firealarm/proc/offset_alarm()
|
||||
pixel_x = (dir & 3) ? 0 : (dir == 4 ? 26 : -26)
|
||||
pixel_y = (dir & 3) ? (dir == 1 ? -26 : 26) : 0
|
||||
@@ -88,14 +110,14 @@ FIRE ALARM
|
||||
if("blue") set_light(l_range = 2, l_power = 0.25, l_color = "#1024A9")
|
||||
if("red") set_light(l_range = 4, l_power = 0.9, l_color = "#ff0000")
|
||||
if("delta") set_light(l_range = 4, l_power = 0.9, l_color = "#FF6633")
|
||||
|
||||
|
||||
. += mutable_appearance(icon, fire_state)
|
||||
. += emissive_appearance(icon, fire_state)
|
||||
|
||||
|
||||
if(seclevel)
|
||||
. += mutable_appearance(icon, "overlay_[seclevel]")
|
||||
. += emissive_appearance(icon, "overlay_[seclevel]")
|
||||
|
||||
|
||||
add_overlay(.)
|
||||
|
||||
/obj/machinery/firealarm/fire_act(datum/gas_mixture/air, temperature, volume)
|
||||
@@ -159,6 +181,22 @@ FIRE ALARM
|
||||
..()
|
||||
spawn(rand(0,15))
|
||||
update_icon()
|
||||
// CHOMPEdit Start: Looping Red/Violet/Orange Alarms
|
||||
if(stat & (NOPOWER | BROKEN)) // Are we broken or out of power?
|
||||
soundloop.stop() // Stop the loop once we're out of power
|
||||
engalarm.stop() // Stop these bc we're out of power
|
||||
critalarm.stop() // Stop these, out of power
|
||||
causality.stop() // etc etc
|
||||
else
|
||||
if(firewarn)
|
||||
soundloop.start()
|
||||
if(engwarn)
|
||||
engalarm.start()
|
||||
if(critwarn)
|
||||
critalarm.start()
|
||||
if(causalitywarn)
|
||||
causality.start()
|
||||
// CHOMPEdit End
|
||||
|
||||
/obj/machinery/firealarm/attack_hand(mob/user as mob)
|
||||
if(user.stat || stat & (NOPOWER | BROKEN))
|
||||
@@ -177,6 +215,8 @@ FIRE ALARM
|
||||
var/area/area = get_area(src)
|
||||
for(var/obj/machinery/firealarm/FA in area)
|
||||
fire_alarm.clearAlarm(src.loc, FA)
|
||||
FA.soundloop.stop() // CHOMPEdit: Soundloop
|
||||
FA.firewarn = FALSE // CHOMPEdit: Soundloop Fix
|
||||
update_icon()
|
||||
if(user)
|
||||
log_game("[user] reset a fire alarm at [COORD(src)]")
|
||||
@@ -187,8 +227,10 @@ FIRE ALARM
|
||||
var/area/area = get_area(src)
|
||||
for(var/obj/machinery/firealarm/FA in area)
|
||||
fire_alarm.triggerAlarm(loc, FA, duration, hidden = alarms_hidden)
|
||||
FA.soundloop.start() // CHOMPEdit: Soundloop
|
||||
FA.firewarn = TRUE // CHOMPEdit: Soundloop Fix
|
||||
update_icon()
|
||||
playsound(src, 'sound/machines/airalarm.ogg', 25, 0, 4, volume_channel = VOLUME_CHANNEL_ALARMS)
|
||||
// playsound(src, 'sound/machines/airalarm.ogg', 25, 0, 4, volume_channel = VOLUME_CHANNEL_ALARMS) // CHOMPEdit: Disable as per soundloop
|
||||
if(user)
|
||||
log_game("[user] triggered a fire alarm at [COORD(src)]")
|
||||
|
||||
|
||||
@@ -202,6 +202,12 @@
|
||||
frame_class = FRAME_CLASS_MACHINE
|
||||
frame_size = 3
|
||||
|
||||
/datum/frame/frame_types/injector_maker
|
||||
name = "Ready-to-Use Medicine 3000"
|
||||
frame_class = FRAME_CLASS_MACHINE
|
||||
circuit = /obj/machinery/atmospheric_field_generator
|
||||
frame_size = 3
|
||||
|
||||
//////////////////////////////
|
||||
// Frame Object (Structure)
|
||||
//////////////////////////////
|
||||
|
||||
@@ -101,7 +101,7 @@
|
||||
required_type = list(/obj/mecha/combat)
|
||||
|
||||
damage_minimum = 15
|
||||
minimum_penetration = 25
|
||||
minimum_penetration = 20 //chompedit making this less OP, was 25, is now 20
|
||||
|
||||
damage_absorption = list(
|
||||
"brute"=0.5,
|
||||
@@ -216,9 +216,9 @@
|
||||
/obj/item/mecha_parts/component/armor/alien
|
||||
name = "strange mecha plating"
|
||||
step_delay = 2
|
||||
//Chompedit start This armour is dogshit and needs this to improve it.
|
||||
//Chompedit start Trying to make this armor decent, without making it OP.
|
||||
damage_minimum = 12
|
||||
minimum_penetration = 15
|
||||
minimum_penetration = 10
|
||||
//Chompedit end
|
||||
|
||||
damage_absorption = list(
|
||||
|
||||
@@ -132,15 +132,15 @@
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/spider/eggcluster/small
|
||||
spiders_min = 1
|
||||
spiders_max = 3
|
||||
spiders_min = 2 //CHOMP Edit
|
||||
spiders_max = 6 //CHOMP Edit
|
||||
|
||||
/obj/effect/spider/eggcluster/small/frost
|
||||
spider_type = /obj/effect/spider/spiderling/frost
|
||||
|
||||
/obj/effect/spider/eggcluster/royal
|
||||
spiders_min = 2
|
||||
spiders_max = 5
|
||||
spiders_max = 6 //CHOMP Edit
|
||||
spider_type = /obj/effect/spider/spiderling/varied
|
||||
|
||||
/obj/effect/spider/spiderling
|
||||
|
||||
@@ -509,17 +509,22 @@ var/list/global/slot_flags_enumeration = list(
|
||||
return
|
||||
if(!usr.canmove || usr.stat || usr.restrained() || !Adjacent(usr))
|
||||
return
|
||||
if((!istype(usr, /mob/living/carbon)) || (istype(usr, /mob/living/carbon/brain)))//Is humanoid, and is not a brain
|
||||
if(isanimal(usr)) //VOREStation Edit Start - Allows simple mobs with hands to use the pickup verb
|
||||
var/mob/living/simple_mob/s = usr
|
||||
if(!s.has_hands)
|
||||
to_chat(usr, "<span class='warning'>You can't pick things up!</span>")
|
||||
return
|
||||
else if((!istype(usr, /mob/living/carbon)) || (istype(usr, /mob/living/carbon/brain)))//Is humanoid, and is not a brain
|
||||
to_chat(usr, "<span class='warning'>You can't pick things up!</span>")
|
||||
return
|
||||
var/mob/living/carbon/C = usr
|
||||
var/mob/living/L = usr
|
||||
if( usr.stat || usr.restrained() )//Is not asleep/dead and is not restrained
|
||||
to_chat(usr, "<span class='warning'>You can't pick things up!</span>")
|
||||
return
|
||||
if(src.anchored) //Object isn't anchored
|
||||
to_chat(usr, "<span class='warning'>You can't pick that up!</span>")
|
||||
return
|
||||
if(C.get_active_hand()) //Hand is not full
|
||||
if(L.get_active_hand()) //Hand is not full //VOREStation Edit End
|
||||
to_chat(usr, "<span class='warning'>Your hand is full.</span>")
|
||||
return
|
||||
if(!istype(src.loc, /turf)) //Object is on a turf
|
||||
|
||||
@@ -88,8 +88,18 @@
|
||||
|
||||
/obj/item/device/taperecorder/hear_talk(mob/M, list/message_pieces, verb)
|
||||
var/msg = multilingual_to_message(message_pieces, requires_machine_understands = TRUE, with_capitalization = TRUE)
|
||||
//START OF CHOMPEDIT
|
||||
var/voice = "Unknown"
|
||||
if (M.type == /mob/living/carbon/human)
|
||||
{
|
||||
var/mob/living/carbon/human/H = M
|
||||
voice = H.voice
|
||||
}
|
||||
else
|
||||
voice = M.name
|
||||
//END OF CHOMPEDIT
|
||||
if(mytape && recording)
|
||||
mytape.record_speech("[M.name] [verb], \"[msg]\"")
|
||||
mytape.record_speech("[voice] [verb], \"[msg]\"") //CHOMP Edit
|
||||
|
||||
|
||||
/obj/item/device/taperecorder/see_emote(mob/M as mob, text, var/emote_type)
|
||||
@@ -432,4 +442,4 @@
|
||||
|
||||
//Random colour tapes
|
||||
/obj/item/device/tape/random/New()
|
||||
icon_state = "tape_[pick("white", "blue", "red", "yellow", "purple")]"
|
||||
icon_state = "tape_[pick("white", "blue", "red", "yellow", "purple")]"
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
slot_flags = SLOT_BELT | SLOT_HOLSTER
|
||||
var/print_cooldown = 1 MINUTE
|
||||
var/last_print
|
||||
w_class = ITEMSIZE_SMALL //CHOMP Add because something so small, trivial, and used for silly RP should not be practically gigantic.
|
||||
|
||||
/obj/item/device/ticket_printer/attack_self(mob/user)
|
||||
. = ..()
|
||||
|
||||
@@ -98,10 +98,8 @@
|
||||
suit.desc = new_desc
|
||||
suit.icon_state = "[new_icon]_suit"
|
||||
suit.toggleicon = "[new_icon]_suit"
|
||||
suit.item_state = "[new_icon]_suit"
|
||||
var/obj/item/clothing/head/hood/S = suit.hood
|
||||
S.icon_state = "[new_icon]_helmet"
|
||||
S.item_state = "[new_icon]_helmet"
|
||||
if(new_icon_file)
|
||||
suit.icon = new_icon_file
|
||||
S.icon = new_icon_file
|
||||
|
||||
@@ -99,16 +99,55 @@
|
||||
name = "janihound plushie"
|
||||
icon_state = "scrubpuppy"
|
||||
|
||||
/obj/item/toy/plushie/borgplushie/drakiesec
|
||||
name = "security drake plushie"
|
||||
/obj/item/toy/plushie/borgplushie/drake
|
||||
icon = 'icons/obj/drakietoy_vr.dmi'
|
||||
var/lights_glowing = FALSE
|
||||
|
||||
/obj/item/toy/plushie/borgplushie/drake/AltClick(mob/living/user)
|
||||
. = ..()
|
||||
var/turf/T = get_turf(src)
|
||||
if(!T.AdjacentQuick(user)) // So people aren't messing with these from across the room
|
||||
return FALSE
|
||||
lights_glowing = !lights_glowing
|
||||
to_chat(user, "<span class='notice'>You turn the [src]'s glow-fabric [lights_glowing ? "on" : "off"].</span>")
|
||||
update_icon()
|
||||
|
||||
/obj/item/toy/plushie/borgplushie/drake/update_icon()
|
||||
cut_overlays()
|
||||
if (lights_glowing)
|
||||
add_overlay(emissive_appearance(icon, "[icon_state]-lights"))
|
||||
|
||||
/obj/item/toy/plushie/borgplushie/drake/get_description_info()
|
||||
return "The lights on the plushie can be toggled [lights_glowing ? "off" : "on"] by alt-clicking on it."
|
||||
|
||||
/obj/item/toy/plushie/borgplushie/drake/sec
|
||||
name = "security drake plushie"
|
||||
icon_state = "secdrake"
|
||||
|
||||
/obj/item/toy/plushie/borgplushie/drakiemed
|
||||
/obj/item/toy/plushie/borgplushie/drake/med
|
||||
name = "medical drake plushie"
|
||||
icon = 'icons/obj/drakietoy_vr.dmi'
|
||||
icon_state = "meddrake"
|
||||
|
||||
/obj/item/toy/plushie/borgplushie/drake/sci
|
||||
name = "science drake plushie"
|
||||
icon_state = "scidrake"
|
||||
|
||||
/obj/item/toy/plushie/borgplushie/drake/jani
|
||||
name = "janitor drake plushie"
|
||||
icon_state = "janidrake"
|
||||
|
||||
/obj/item/toy/plushie/borgplushie/drake/eng
|
||||
name = "engineering drake plushie"
|
||||
icon_state = "engdrake"
|
||||
|
||||
/obj/item/toy/plushie/borgplushie/drake/mine
|
||||
name = "mining drake plushie"
|
||||
icon_state = "minedrake"
|
||||
|
||||
/obj/item/toy/plushie/borgplushie/drake/trauma
|
||||
name = "trauma drake plushie"
|
||||
icon_state = "traumadrake"
|
||||
|
||||
/obj/item/toy/plushie/foxbear
|
||||
name = "toy fox"
|
||||
desc = "Issa fox!"
|
||||
|
||||
@@ -452,7 +452,9 @@
|
||||
//Let's let our mob out!
|
||||
/obj/item/capture_crystal/proc/unleash(mob/living/user, atom/target)
|
||||
if(!user && !target) //We got thrown but we're not sure who did it, let's go to where the crystal is
|
||||
bound_mob.forceMove(src.drop_location())
|
||||
var/drop_loc = get_turf(src)
|
||||
if (drop_loc)
|
||||
bound_mob.forceMove(drop_loc)
|
||||
return
|
||||
if(!target) //We know who wants to let us out, but they didn't say where, so let's drop us on them
|
||||
bound_mob.forceMove(user.drop_location())
|
||||
|
||||
@@ -270,4 +270,17 @@
|
||||
/obj/item/weapon/stock_parts/micro_laser/high = 2, //field emitters
|
||||
/obj/item/weapon/stock_parts/scanning_module = 1, //atmosphere sensor
|
||||
/obj/item/weapon/stock_parts/capacitor/adv = 1, //for the JUICE
|
||||
/obj/item/stack/cable_coil = 10)
|
||||
/obj/item/stack/cable_coil = 10)
|
||||
|
||||
|
||||
/obj/item/weapon/circuitboard/injector_maker
|
||||
name = T_BOARD("Ready-to-Use Medicine 3000")
|
||||
build_path = /obj/machinery/injector_maker
|
||||
board_type = new /datum/frame/frame_types/injector_maker
|
||||
origin_tech = list(TECH_BIO = 3, TECH_ENGINEERING = 2, TECH_MATERIAL = 2)
|
||||
req_components = list(
|
||||
/obj/item/weapon/stock_parts/matter_bin = 2,
|
||||
/obj/item/weapon/stock_parts/manipulator = 1,
|
||||
/obj/item/weapon/stock_parts/micro_laser = 1,
|
||||
/obj/item/weapon/stock_parts/console_screen = 1
|
||||
)
|
||||
|
||||
@@ -27,44 +27,52 @@ var/global/list/cached_icons = list()
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/paint/New()
|
||||
if(paint_type && length(paint_type) > 0)
|
||||
name = paint_type + " " + name
|
||||
..()
|
||||
reagents.add_reagent("water", volume*3/5)
|
||||
reagents.add_reagent("plasticide", volume/5)
|
||||
if(paint_type == "white") //why don't white crayons exist
|
||||
reagents.add_reagent("aluminum", volume/5)
|
||||
else if (paint_type == "black")
|
||||
reagents.add_reagent("carbon", volume/5)
|
||||
else
|
||||
reagents.add_reagent("marker_ink_[paint_type]", volume/5)
|
||||
reagents.handle_reactions()
|
||||
if(paint_type)
|
||||
reagents.add_reagent("paint", volume, paint_type)
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/paint/red
|
||||
icon_state = "paint_red"
|
||||
paint_type = "red"
|
||||
paint_type = "#FF0000"
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/paint/yellow
|
||||
icon_state = "paint_yellow"
|
||||
paint_type = "yellow"
|
||||
paint_type = "#FFFF00"
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/paint/green
|
||||
icon_state = "paint_green"
|
||||
paint_type = "green"
|
||||
paint_type = "#00FF00"
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/paint/blue
|
||||
icon_state = "paint_blue"
|
||||
paint_type = "blue"
|
||||
paint_type = "#0000FF"
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/paint/purple
|
||||
/obj/item/weapon/reagent_containers/glass/paint/violet
|
||||
icon_state = "paint_violet"
|
||||
paint_type = "purple"
|
||||
paint_type = "#FF00FF"
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/paint/black
|
||||
icon_state = "paint_black"
|
||||
paint_type = "black"
|
||||
paint_type = "#000000"
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/paint/grey
|
||||
icon_state = "paint_neutral"
|
||||
paint_type = "#808080"
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/paint/orange
|
||||
icon_state = "paint_orange"
|
||||
paint_type = "#FFA500"
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/paint/purple
|
||||
icon_state = "paint_purple"
|
||||
paint_type = "#A500FF"
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/paint/cyan
|
||||
icon_state = "paint_cyan"
|
||||
paint_type = "#00FFFF"
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/paint/white
|
||||
name = "paint remover bucket"
|
||||
icon_state = "paint_white"
|
||||
paint_type = "white"
|
||||
paint_type = "#FFFFFF"
|
||||
|
||||
|
||||
@@ -753,8 +753,13 @@
|
||||
/obj/item/toy/plushie/nukeplushie,
|
||||
/obj/item/toy/plushie/otter,
|
||||
/obj/item/toy/plushie/vox,
|
||||
/obj/item/toy/plushie/borgplushie/drakiesec,
|
||||
/obj/item/toy/plushie/borgplushie/drakiemed,
|
||||
pick(list(/obj/item/toy/plushie/borgplushie/drake/sec,
|
||||
/obj/item/toy/plushie/borgplushie/drake/med,
|
||||
/obj/item/toy/plushie/borgplushie/drake/sci,
|
||||
/obj/item/toy/plushie/borgplushie/drake/jani,
|
||||
/obj/item/toy/plushie/borgplushie/drake/eng,
|
||||
/obj/item/toy/plushie/borgplushie/drake/mine,
|
||||
/obj/item/toy/plushie/borgplushie/drake/trauma)),
|
||||
//VOREStation Add End
|
||||
//YawnWider Add Start
|
||||
/obj/item/toy/plushie/teshari/_yw,
|
||||
|
||||
@@ -248,7 +248,7 @@
|
||||
framed_offset_y = 6
|
||||
|
||||
/obj/item/canvas/twentyfour_twentyfour
|
||||
name = "ai universal standard canvas"
|
||||
//name = "ai universal standard canvas" // Uncomment this when AI can actually
|
||||
//desc = "Besides being very large, the AI can accept these as a display from their internal database after you've hung it up." // Not yet
|
||||
icon_state = "24x24"
|
||||
width = 24
|
||||
|
||||
@@ -397,6 +397,13 @@
|
||||
if(ishuman(usr) || isrobot(usr))
|
||||
add_fingerprint(usr)
|
||||
toggle(usr)
|
||||
else if(isanimal(usr)) //VOREStation Addition Start
|
||||
var/mob/living/simple_mob/s = usr
|
||||
if(s.has_hands)
|
||||
add_fingerprint(usr)
|
||||
toggle(usr)
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>This mob type can't use this verb.</span>") //VOREStation Addition End
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>This mob type can't use this verb.</span>")
|
||||
|
||||
|
||||
@@ -1444,7 +1444,7 @@
|
||||
"stripes" = COLOR_OFF_WHITE,
|
||||
"glass" = COLOR_WHITE
|
||||
)
|
||||
|
||||
|
||||
/decl/closet_appearance/wall_double/survival
|
||||
color = COLOR_CYAN_BLUE
|
||||
decals = null
|
||||
@@ -1452,6 +1452,119 @@
|
||||
"stripe_outer" = COLOR_WHITE
|
||||
)
|
||||
|
||||
/decl/closet_appearance/wall_double/emergency_engi
|
||||
color = COLOR_YELLOW_GRAY
|
||||
decals = null
|
||||
extra_decals = list(
|
||||
"stripe_inner" = COLOR_ORANGE,
|
||||
"stripe_outer" = COLOR_OFF_WHITE,
|
||||
"glass" = COLOR_WHITE
|
||||
)
|
||||
|
||||
/decl/closet_appearance/wall_double/security
|
||||
color = COLOR_NT_RED
|
||||
decals = null
|
||||
extra_decals = list(
|
||||
"vertical_stripe_left_l" = COLOR_WARM_YELLOW,
|
||||
"vertical_stripe_left_m" = COLOR_WARM_YELLOW
|
||||
)
|
||||
|
||||
/decl/closet_appearance/wall_double/cargo
|
||||
color = COLOR_WARM_YELLOW
|
||||
|
||||
/decl/closet_appearance/wall_double/gaming
|
||||
color = COLOR_DARK_BLUE_GRAY
|
||||
decals = null
|
||||
extra_decals = list(
|
||||
"stripe_outer" = COLOR_PALE_PINK,
|
||||
"glass" = COLOR_WHITE
|
||||
)
|
||||
|
||||
/decl/closet_appearance/wall_double/science
|
||||
decals = list(
|
||||
"holes"
|
||||
)
|
||||
color = COLOR_OFF_WHITE
|
||||
extra_decals = list(
|
||||
"stripe_inner_lower" = COLOR_PURPLE,
|
||||
"stripe_inner_middle" = COLOR_PURPLE
|
||||
)
|
||||
|
||||
/decl/closet_appearance/wall_double/command
|
||||
decals = list(
|
||||
"holes_right"
|
||||
)
|
||||
color = COLOR_BLUE_GRAY
|
||||
extra_decals = list(
|
||||
"vertical_stripe_left_l" = COLOR_GOLD,
|
||||
"vertical_stripe_left_m" = COLOR_GOLD,
|
||||
"vertical_stripe_left_r" = COLOR_GOLD
|
||||
)
|
||||
|
||||
/decl/closet_appearance/wall_double/ce
|
||||
decals = list(
|
||||
"holes_right"
|
||||
)
|
||||
color = COLOR_OFF_WHITE
|
||||
extra_decals = list(
|
||||
"vertical_stripe_left_l" = COLOR_DARK_GOLD,
|
||||
"vertical_stripe_left_m" = COLOR_DARK_GOLD,
|
||||
"vertical_stripe_left_r" = COLOR_DARK_GOLD
|
||||
)
|
||||
|
||||
/decl/closet_appearance/wall_double/rd
|
||||
decals = list(
|
||||
"holes_right"
|
||||
)
|
||||
color = COLOR_OFF_WHITE
|
||||
extra_decals = list(
|
||||
"vertical_stripe_left_l" = COLOR_PURPLE,
|
||||
"vertical_stripe_left_m" = COLOR_GOLD,
|
||||
"vertical_stripe_left_r" = COLOR_PURPLE
|
||||
)
|
||||
|
||||
/decl/closet_appearance/wall_double/cmo
|
||||
decals = list(
|
||||
"holes_right"
|
||||
)
|
||||
color = COLOR_BABY_BLUE
|
||||
extra_decals = list(
|
||||
"vertical_stripe_left_l" = COLOR_GOLD,
|
||||
"vertical_stripe_left_m" = COLOR_GOLD,
|
||||
"vertical_stripe_left_r" = COLOR_GOLD
|
||||
)
|
||||
|
||||
/decl/closet_appearance/wall_double/hos
|
||||
decals = list(
|
||||
"holes_right"
|
||||
)
|
||||
color = COLOR_NT_RED
|
||||
extra_decals = list(
|
||||
"vertical_stripe_left_l" = COLOR_GOLD,
|
||||
"vertical_stripe_left_m" = COLOR_WARM_YELLOW,
|
||||
"vertical_stripe_left_r" = COLOR_GOLD
|
||||
)
|
||||
|
||||
/decl/closet_appearance/wall_double/iaa
|
||||
decals = list(
|
||||
"holes_right"
|
||||
)
|
||||
color = COLOR_DARK_BLUE_GRAY
|
||||
extra_decals = list(
|
||||
"vertical_stripe_left_l" = COLOR_GOLD,
|
||||
"vertical_stripe_left_m" = COLOR_GOLD,
|
||||
"vertical_stripe_left_r" = COLOR_GOLD
|
||||
)
|
||||
|
||||
/decl/closet_appearance/wall_double/engineering
|
||||
decals = list(
|
||||
"holes"
|
||||
)
|
||||
color = COLOR_YELLOW_GRAY
|
||||
|
||||
/decl/closet_appearance/wall_double/generic_civ
|
||||
color = COLOR_DARK_BLUE_GRAY
|
||||
|
||||
// Carts
|
||||
/decl/closet_appearance/cart
|
||||
color = COLOR_GRAY20
|
||||
|
||||
@@ -155,6 +155,7 @@
|
||||
/obj/item/weapon/gun/projectile/revolvershotgun,
|
||||
/obj/item/ammo_magazine/m12gdrumjack/beanbag,
|
||||
/obj/item/ammo_magazine/m12gdrumjack/beanbag,
|
||||
/obj/item/device/ticket_printer, //CHOMPStation addition
|
||||
/obj/item/device/retail_scanner/security //CHOMPStation addition
|
||||
)
|
||||
|
||||
@@ -198,7 +199,8 @@
|
||||
/obj/item/device/flashlight/maglight,
|
||||
/obj/item/device/holowarrant, //CHOMPStation addition
|
||||
/obj/item/device/retail_scanner/security, //CHOMPStation addition
|
||||
/obj/item/clothing/glasses/hud/security //CHOMPStation addition
|
||||
/obj/item/clothing/glasses/hud/security, //CHOMPStation addition
|
||||
/obj/item/device/ticket_printer //CHOMPStation addition
|
||||
)
|
||||
|
||||
/obj/structure/closet/secure_closet/security/Initialize()
|
||||
|
||||
@@ -51,6 +51,7 @@
|
||||
// /obj/item/clothing/head/beret/sec/corporate/hos, //CHOMP Remove
|
||||
// /obj/item/clothing/suit/storage/hooded/wintercoat/security, //CHOMP Remove
|
||||
// /obj/item/clothing/shoes/boots/winter/security, //CHOMP Remove
|
||||
/obj/item/device/ticket_printer, //CHOMP Add
|
||||
/obj/item/device/flashlight/maglight)
|
||||
|
||||
//Custom NT Security Lockers, Only found at central command
|
||||
|
||||
@@ -196,6 +196,7 @@
|
||||
/obj/structure/closet/hydrant //wall mounted fire closet
|
||||
name = "fire-safety closet"
|
||||
desc = "It's a storage unit for fire-fighting supplies."
|
||||
icon = 'icons/obj/closets/bases/wall.dmi'
|
||||
closet_appearance = /decl/closet_appearance/wall/hydrant
|
||||
plane = TURF_PLANE
|
||||
layer = ABOVE_TURF_LAYER
|
||||
@@ -218,7 +219,10 @@
|
||||
/obj/structure/closet/medical_wall //wall mounted medical closet
|
||||
name = "first-aid closet"
|
||||
desc = "It's wall-mounted storage unit for first aid supplies."
|
||||
icon = 'icons/obj/closets/bases/wall.dmi'
|
||||
closet_appearance = /decl/closet_appearance/wall/medical
|
||||
plane = TURF_PLANE
|
||||
layer = ABOVE_TURF_LAYER
|
||||
anchored = TRUE
|
||||
density = FALSE
|
||||
wall_mounted = 1
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
/obj/structure/closet/walllocker
|
||||
desc = "A wall mounted storage locker."
|
||||
name = "Wall Locker"
|
||||
name = "wall locker"
|
||||
icon = 'icons/obj/closets/bases/wall.dmi'
|
||||
closet_appearance = /decl/closet_appearance/wall
|
||||
density = FALSE
|
||||
@@ -85,7 +85,7 @@
|
||||
//double-size "cabinet" lockers, from Killian
|
||||
/obj/structure/closet/walllocker_double
|
||||
desc = "A wall mounted storage cabinet."
|
||||
name = "Wall Cabinet"
|
||||
name = "wall cabinet"
|
||||
icon = 'icons/obj/closets/bases/wall_double.dmi'
|
||||
closet_appearance = /decl/closet_appearance/wall_double
|
||||
density = FALSE
|
||||
@@ -116,7 +116,7 @@
|
||||
|
||||
/obj/structure/closet/walllocker_double/kitchen
|
||||
desc = "A wall mounted storage cabinet, for the kitchen. Now where's the flour gone..?"
|
||||
name = "Kitchen Cabinet"
|
||||
name = "kitchen cabinet"
|
||||
icon = 'icons/obj/closets/bases/wall_double.dmi'
|
||||
closet_appearance = /decl/closet_appearance/wall_double/kitchen
|
||||
density = FALSE
|
||||
@@ -139,7 +139,7 @@
|
||||
dir = EAST
|
||||
|
||||
/obj/structure/closet/walllocker_double/medical
|
||||
name = "Medical Cabinet"
|
||||
name = "medical cabinet"
|
||||
desc = "A wall mounted medical supply cabinet. Probably full of drugs!" //not actually full of drugs, sorry!
|
||||
closet_appearance = /decl/closet_appearance/wall_double/medical
|
||||
|
||||
@@ -159,12 +159,37 @@
|
||||
pixel_x = 32
|
||||
dir = EAST
|
||||
|
||||
/obj/structure/closet/walllocker_double/emergency_engi
|
||||
name = "emergency supplies cabinet"
|
||||
desc = "A wall mounted cabinet. Seemingly has cool stuff for 'emergency use only'."
|
||||
closet_appearance = /decl/closet_appearance/wall_double/emergency_engi
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/mask/breath = 2,
|
||||
/obj/item/weapon/tank/emergency/oxygen/engi = 2,
|
||||
/obj/item/weapon/storage/briefcase/inflatable,
|
||||
/obj/item/device/radio = 3)
|
||||
|
||||
/obj/structure/closet/walllocker_double/emergency_engi/north
|
||||
pixel_y = 32
|
||||
dir = SOUTH
|
||||
|
||||
/obj/structure/closet/walllocker_double/emergency_engi/south
|
||||
pixel_y = -32
|
||||
dir = NORTH
|
||||
|
||||
/obj/structure/closet/walllocker_double/emergency_engi/west
|
||||
pixel_x = -32
|
||||
dir = WEST
|
||||
|
||||
/obj/structure/closet/walllocker_double/emergency_engi/east
|
||||
pixel_x = 32
|
||||
dir = EAST
|
||||
|
||||
/obj/structure/closet/walllocker_double/hydrant
|
||||
name = "fire-safety closet"
|
||||
desc = "It's a storage cabinet packed with fire-fighting supplies."
|
||||
closet_appearance = /decl/closet_appearance/wall_double/fire_safety
|
||||
anchored = TRUE
|
||||
density = FALSE
|
||||
|
||||
starts_with = list(
|
||||
/obj/item/clothing/suit/fire,
|
||||
@@ -192,7 +217,7 @@
|
||||
|
||||
/obj/structure/closet/walllocker_double/survival
|
||||
desc = "A wall mounted storage cabinet. It contains a small amount of emergency supplies for wilderness survival, but they probably won't last very long."
|
||||
name = "Emergency Survival Wall Cabinet"
|
||||
name = "emergency survival wall cabinet"
|
||||
icon = 'icons/obj/closets/bases/wall_double.dmi'
|
||||
closet_appearance = /decl/closet_appearance/wall_double/survival
|
||||
density = FALSE
|
||||
@@ -228,5 +253,159 @@
|
||||
dir = WEST
|
||||
|
||||
/obj/structure/closet/walllocker_double/survival/east
|
||||
pixel_x = 32
|
||||
dir = EAST
|
||||
|
||||
/obj/structure/closet/walllocker_double/security
|
||||
name = "security cabinet"
|
||||
desc = "A wall mounted cabinet. This one is suspiciously red."
|
||||
closet_appearance = /decl/closet_appearance/wall_double/security
|
||||
|
||||
/obj/structure/closet/walllocker_double/security/north
|
||||
pixel_y = 32
|
||||
dir = SOUTH
|
||||
|
||||
/obj/structure/closet/walllocker_double/security/south
|
||||
pixel_y = -32
|
||||
dir = NORTH
|
||||
|
||||
/obj/structure/closet/walllocker_double/security/west
|
||||
pixel_x = -32
|
||||
dir = WEST
|
||||
|
||||
/obj/structure/closet/walllocker_double/security/east
|
||||
pixel_x = 32
|
||||
dir = EAST
|
||||
|
||||
/obj/structure/closet/walllocker_double/misc_civ
|
||||
closet_appearance = /decl/closet_appearance/wall_double/gaming
|
||||
|
||||
/obj/structure/closet/walllocker_double/misc_civ/north
|
||||
pixel_y = 32
|
||||
dir = SOUTH
|
||||
|
||||
/obj/structure/closet/walllocker_double/misc_civ/south
|
||||
pixel_y = -32
|
||||
dir = NORTH
|
||||
|
||||
/obj/structure/closet/walllocker_double/misc_civ/west
|
||||
pixel_x = -32
|
||||
dir = WEST
|
||||
|
||||
/obj/structure/closet/walllocker_double/misc_civ/east
|
||||
pixel_x = 32
|
||||
dir = EAST
|
||||
|
||||
/obj/structure/closet/walllocker_double/generic_civ
|
||||
closet_appearance = /decl/closet_appearance/wall_double/generic_civ
|
||||
|
||||
/obj/structure/closet/walllocker_double/generic_civ/north
|
||||
pixel_y = 32
|
||||
dir = SOUTH
|
||||
|
||||
/obj/structure/closet/walllocker_double/generic_civ/south
|
||||
pixel_y = -32
|
||||
dir = NORTH
|
||||
|
||||
/obj/structure/closet/walllocker_double/generic_civ/west
|
||||
pixel_x = -32
|
||||
dir = WEST
|
||||
|
||||
/obj/structure/closet/walllocker_double/generic_civ/east
|
||||
pixel_x = 32
|
||||
dir = EAST
|
||||
|
||||
/obj/structure/closet/walllocker_double/cargo
|
||||
desc = "A wall mounted cabinet. This one is in cargo colors."
|
||||
closet_appearance = /decl/closet_appearance/wall_double/cargo
|
||||
|
||||
/obj/structure/closet/walllocker_double/cargo/north
|
||||
pixel_y = 32
|
||||
dir = SOUTH
|
||||
|
||||
/obj/structure/closet/walllocker_double/cargo/south
|
||||
pixel_y = -32
|
||||
dir = NORTH
|
||||
|
||||
/obj/structure/closet/walllocker_double/cargo/west
|
||||
pixel_x = -32
|
||||
dir = WEST
|
||||
|
||||
/obj/structure/closet/walllocker_double/cargo/east
|
||||
pixel_x = 32
|
||||
dir = EAST
|
||||
|
||||
/obj/structure/closet/walllocker_double/science
|
||||
desc = "A wall mounted cabinet. This one is in research colors."
|
||||
closet_appearance = /decl/closet_appearance/wall_double/science
|
||||
|
||||
/obj/structure/closet/walllocker_double/science/north
|
||||
pixel_y = 32
|
||||
dir = SOUTH
|
||||
|
||||
/obj/structure/closet/walllocker_double/science/south
|
||||
pixel_y = -32
|
||||
dir = NORTH
|
||||
|
||||
/obj/structure/closet/walllocker_double/science/west
|
||||
pixel_x = -32
|
||||
dir = WEST
|
||||
|
||||
/obj/structure/closet/walllocker_double/science/east
|
||||
pixel_x = 32
|
||||
dir = EAST
|
||||
|
||||
/obj/structure/closet/walllocker_double/command
|
||||
desc = "A wall mounted cabinet. This one is in command colors."
|
||||
closet_appearance = /decl/closet_appearance/wall_double/command
|
||||
|
||||
/obj/structure/closet/walllocker_double/command/north
|
||||
pixel_y = 32
|
||||
dir = SOUTH
|
||||
|
||||
/obj/structure/closet/walllocker_double/command/south
|
||||
pixel_y = -32
|
||||
dir = NORTH
|
||||
|
||||
/obj/structure/closet/walllocker_double/command/west
|
||||
pixel_x = -32
|
||||
dir = WEST
|
||||
|
||||
/obj/structure/closet/walllocker_double/command/east
|
||||
pixel_x = 32
|
||||
dir = EAST
|
||||
|
||||
/obj/structure/closet/walllocker_double/command/ce
|
||||
closet_appearance = /decl/closet_appearance/wall_double/ce
|
||||
|
||||
/obj/structure/closet/walllocker_double/command/cmo
|
||||
closet_appearance = /decl/closet_appearance/wall_double/cmo
|
||||
|
||||
/obj/structure/closet/walllocker_double/command/rd
|
||||
closet_appearance = /decl/closet_appearance/wall_double/rd
|
||||
|
||||
/obj/structure/closet/walllocker_double/command/hos
|
||||
closet_appearance = /decl/closet_appearance/wall_double/hos
|
||||
|
||||
/obj/structure/closet/walllocker_double/command/iaa
|
||||
closet_appearance = /decl/closet_appearance/wall_double/iaa
|
||||
|
||||
/obj/structure/closet/walllocker_double/engineering
|
||||
desc = "A wall mounted cabinet. This one is in engineering colors."
|
||||
closet_appearance = /decl/closet_appearance/wall_double/engineering
|
||||
|
||||
/obj/structure/closet/walllocker_double/engineering/north
|
||||
pixel_y = 32
|
||||
dir = SOUTH
|
||||
|
||||
/obj/structure/closet/walllocker_double/engineering/south
|
||||
pixel_y = -32
|
||||
dir = NORTH
|
||||
|
||||
/obj/structure/closet/walllocker_double/engineering/west
|
||||
pixel_x = -32
|
||||
dir = WEST
|
||||
|
||||
/obj/structure/closet/walllocker_double/engineering/east
|
||||
pixel_x = 32
|
||||
dir = EAST
|
||||
138
code/game/objects/structures/ghost_pods/survivor.dm
Normal file
138
code/game/objects/structures/ghost_pods/survivor.dm
Normal file
@@ -0,0 +1,138 @@
|
||||
//Based on /manual/human but not created as a child for better control over how we create a mob.
|
||||
/obj/structure/ghost_pod/manual/survivor
|
||||
name = "Emergency Cryopod"
|
||||
desc = "A damaged cryopod smeared with blood. An injured body seems frozen in time within."
|
||||
description_info = "This contains a body, which may wake at any time. The external controls\
|
||||
seem to be functioning, though the warning lights that flash give no solace.."
|
||||
ghost_query_type = /datum/ghost_query/shipwreck_survivor
|
||||
var/occupant_type = "shipwreck survivor"
|
||||
|
||||
icon = 'icons/obj/Cryogenic2.dmi'
|
||||
icon_state = "sleeper_1"
|
||||
icon_state_opened = "sleeper_0"
|
||||
density = TRUE
|
||||
|
||||
var/allow_appearance_change = TRUE
|
||||
var/special_role = MODE_SURVIVOR //Set this to NULL as GM if you don't want the "survivor" stuff to fire.
|
||||
var/list/clothing_possibilities
|
||||
|
||||
var/start_injured = FALSE //failsafe to prevent accidentally making a pod that deals damage when not intended
|
||||
|
||||
var/suffer_brute = FALSE
|
||||
var/brute_severity = 20 //We inflict UP TO this much damage. Range is 1 to this value
|
||||
var/brute_instances = 3 //We inflict damage this many times. Helps spread it around multiple limbs!
|
||||
|
||||
|
||||
var/suffer_burn = FALSE
|
||||
var/burn_severity = 20
|
||||
var/burn_instances = 3
|
||||
|
||||
var/suffer_toxloss = FALSE
|
||||
var/tox_severity = 20
|
||||
|
||||
var/suffer_oxloss = FALSE
|
||||
var/oxy_severity = 20
|
||||
|
||||
var/suffer_cloneloss = FALSE
|
||||
var/clone_severity = 5
|
||||
|
||||
/obj/structure/ghost_pod/manual/survivor/Initialize()
|
||||
. = ..()
|
||||
|
||||
handle_clothing_setup()
|
||||
|
||||
/obj/structure/ghost_pod/manual/survivor/proc/handle_clothing_setup()
|
||||
clothing_possibilities = list()
|
||||
|
||||
clothing_possibilities |= subtypesof(/obj/item/clothing/under/utility)
|
||||
clothing_possibilities |= subtypesof(/obj/item/clothing/head/beret)
|
||||
clothing_possibilities |= /obj/item/clothing/shoes/black
|
||||
clothing_possibilities |= /obj/item/device/radio/headset
|
||||
|
||||
/obj/structure/ghost_pod/manual/survivor/create_occupant(var/mob/M)
|
||||
..()
|
||||
var/turf/T = get_turf(src)
|
||||
var/mob/living/carbon/human/H = new(src)
|
||||
if(M.mind)
|
||||
M.mind.transfer_to(H)
|
||||
to_chat(M, "<span class='notice'>You are a [occupant_type]!</span>")
|
||||
H.ckey = M.ckey
|
||||
visible_message("<span class='warning'>As \the [src] opens, the pipes on \the [src] surge, before it grows dark.</span>")
|
||||
log_and_message_admins("successfully opened \a [src] and got a [occupant_type].")
|
||||
|
||||
var/list/uniform_options
|
||||
var/list/shoe_options
|
||||
var/list/head_options
|
||||
var/list/headset_options
|
||||
|
||||
if(clothing_possibilities && clothing_possibilities.len)
|
||||
for(var/path in clothing_possibilities)
|
||||
if(ispath(path, /obj/item/clothing/under))
|
||||
if(!uniform_options)
|
||||
uniform_options = list()
|
||||
uniform_options |= path
|
||||
if(ispath(path, /obj/item/clothing/shoes))
|
||||
if(!shoe_options)
|
||||
shoe_options = list()
|
||||
shoe_options |= path
|
||||
if(ispath(path, /obj/item/clothing/head))
|
||||
if(!head_options)
|
||||
head_options = list()
|
||||
head_options |= path
|
||||
if(ispath(path, /obj/item/device/radio/headset))
|
||||
if(!headset_options)
|
||||
headset_options = list()
|
||||
headset_options |= path
|
||||
|
||||
if(uniform_options && uniform_options.len)
|
||||
var/newpath = pick(uniform_options)
|
||||
var/obj/item/clothing/C = new newpath(H)
|
||||
H.equip_to_appropriate_slot(C)
|
||||
|
||||
if(shoe_options && shoe_options.len)
|
||||
var/newpath = pick(shoe_options)
|
||||
var/obj/item/clothing/C = new newpath(H)
|
||||
H.equip_to_appropriate_slot(C)
|
||||
|
||||
if(head_options && head_options.len)
|
||||
var/newpath = pick(head_options)
|
||||
var/obj/item/clothing/C = new newpath(H)
|
||||
H.equip_to_appropriate_slot(C)
|
||||
|
||||
if(headset_options && headset_options.len)
|
||||
var/newpath = pick(headset_options)
|
||||
var/obj/item/C = new newpath(H)
|
||||
H.equip_to_appropriate_slot(C)
|
||||
|
||||
var/newname = sanitize(tgui_input_text(H, "Your mind feels foggy, and you recall your name might be [H.real_name]. Would you like to change your name?", "Name change", null, MAX_NAME_LEN), MAX_NAME_LEN)
|
||||
if (newname)
|
||||
H.real_name = newname
|
||||
|
||||
icon_state = icon_state_opened
|
||||
|
||||
H.forceMove(T)
|
||||
|
||||
if(special_role)
|
||||
var/datum/antagonist/role = all_antag_types[special_role] //Explicitly NOT an antagonist.
|
||||
if(role)
|
||||
if(role.add_antagonist(H.mind, 1, 1, 0, 1, 1))
|
||||
log_admin("\The [src] made [key_name(src)] into a [role.role_text].")
|
||||
|
||||
if(start_injured) //Doublechecking if we actually want them to be injured
|
||||
if(suffer_brute)
|
||||
for(var/br = 1, br < brute_instances, br++)
|
||||
H.adjustBruteLoss(rand(1,brute_severity))
|
||||
if(suffer_burn)
|
||||
for(var/bu = 1, bu < burn_instances, bu++)
|
||||
H.adjustFireLoss(rand(1,burn_severity))
|
||||
if(suffer_oxloss)
|
||||
H.adjustOxyLoss(rand(1,oxy_severity))
|
||||
if(suffer_toxloss)
|
||||
H.adjustToxLoss(rand(1,tox_severity))
|
||||
if(suffer_cloneloss)
|
||||
H.adjustCloneLoss(rand(1,clone_severity))
|
||||
|
||||
if(allow_appearance_change)
|
||||
H.change_appearance(APPEARANCE_ALL, H, check_species_whitelist = 1)
|
||||
|
||||
visible_message("<span class='aliem'>\The [src] [pick("gurgles", "seizes", "clangs")] before releasing \the [H]!</span>")
|
||||
@@ -22,15 +22,17 @@ FLOOR SAFES
|
||||
var/maxspace = 24 //the maximum combined w_class of stuff in the safe
|
||||
|
||||
|
||||
/obj/structure/safe/New()
|
||||
/obj/structure/safe/Initialize()
|
||||
tumbler_1_pos = rand(0, 72)
|
||||
tumbler_1_open = rand(0, 72)
|
||||
|
||||
tumbler_2_pos = rand(0, 72)
|
||||
tumbler_2_open = rand(0, 72)
|
||||
|
||||
if(. != INITIALIZE_HINT_QDEL)
|
||||
return INITIALIZE_HINT_LATELOAD
|
||||
|
||||
/obj/structure/safe/Initialize()
|
||||
/obj/structure/safe/LateInitialize()
|
||||
. = ..()
|
||||
for(var/obj/item/I in loc)
|
||||
if(space >= maxspace)
|
||||
@@ -115,7 +117,7 @@ FLOOR SAFES
|
||||
if(canhear)
|
||||
to_chat(user, "<span class='notice'>You hear a [pick("click", "chink", "clink")] from \the [src].</span>")
|
||||
playsound(src, 'sound/machines/click.ogg', 20, 1)
|
||||
check_unlocked(user, canhear)
|
||||
check_unlocked(user, canhear)
|
||||
|
||||
updateUsrDialog()
|
||||
return
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
var/oreAmount = 7
|
||||
var/knock_sound = 'sound/machines/door/knock_glass.ogg'
|
||||
var/knock_hammer_sound = 'sound/weapons/sonic_jackhammer.ogg'
|
||||
|
||||
|
||||
/obj/structure/simple_door/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||
TemperatureAct(exposed_temperature)
|
||||
|
||||
@@ -173,7 +173,7 @@
|
||||
return
|
||||
|
||||
/obj/structure/simple_door/bullet_act(var/obj/item/projectile/Proj)
|
||||
hardness -= Proj.force/10
|
||||
take_damage(Proj.damage/10)
|
||||
CheckHardness()
|
||||
|
||||
/obj/structure/simple_door/take_damage(var/damage)
|
||||
|
||||
@@ -31,7 +31,7 @@ var/world_time_season
|
||||
var/tree_types = list()
|
||||
var/snow_chance = 10
|
||||
|
||||
/turf/simulated/floor/outdoors/grass/seasonal/Initialize()
|
||||
/turf/simulated/floor/outdoors/grass/seasonal/Initialize() //There are A LOT of chompedits here, I guess.
|
||||
|
||||
switch(world_time_season)
|
||||
if("spring")
|
||||
@@ -41,10 +41,10 @@ var/world_time_season
|
||||
/obj/structure/flora/tree/jungle
|
||||
)
|
||||
animal_types = list(
|
||||
/mob/living/simple_mob/vore/alienanimals/teppi = 10,
|
||||
/mob/living/simple_mob/vore/alienanimals/teppi/mutant = 1,
|
||||
/mob/living/simple_mob/vore/alienanimals/teppi = 10, //CHOMP Edit
|
||||
/mob/living/simple_mob/vore/alienanimals/teppi/mutant = 1, //CHOMP Edit
|
||||
/mob/living/simple_mob/vore/redpanda = 40,
|
||||
/mob/living/simple_mob/vore/redpanda/fae = 2,
|
||||
/mob/living/simple_mob/vore/redpanda/fae = 2, //CHOMP Edit
|
||||
/mob/living/simple_mob/vore/sheep = 20,
|
||||
/mob/living/simple_mob/vore/rabbit/black = 20,
|
||||
/mob/living/simple_mob/vore/rabbit/white = 20,
|
||||
@@ -52,7 +52,12 @@ var/world_time_season
|
||||
/mob/living/simple_mob/vore/leopardmander = 2,
|
||||
/mob/living/simple_mob/vore/horse/big = 10,
|
||||
/mob/living/simple_mob/vore/bigdragon/friendly = 1,
|
||||
/mob/living/simple_mob/vore/alienanimals/dustjumper = 20
|
||||
/mob/living/simple_mob/vore/alienanimals/dustjumper = 20,
|
||||
/mob/living/simple_mob/vore/bee = 20,
|
||||
/mob/living/simple_mob/vore/horse/big = 5,
|
||||
/mob/living/simple_mob/animal/wolf = 5,
|
||||
/mob/living/simple_mob/animal/wolf/direwolf = 1,
|
||||
/mob/living/simple_mob/animal/wolf/direwolf/dog = 1
|
||||
)
|
||||
grass_types = list(
|
||||
/obj/structure/flora/ausbushes/sparsegrass,
|
||||
@@ -77,8 +82,8 @@ var/world_time_season
|
||||
animal_types = list(
|
||||
/mob/living/simple_mob/vore/alienanimals/teppi = 10,
|
||||
/mob/living/simple_mob/vore/alienanimals/teppi/mutant = 1,
|
||||
/mob/living/simple_mob/vore/redpanda = 40,
|
||||
/mob/living/simple_mob/vore/redpanda/fae = 2,
|
||||
/mob/living/simple_mob/vore/redpanda = 40, //CHOMP Edit
|
||||
/mob/living/simple_mob/vore/redpanda/fae = 2, //CHOMP Edit
|
||||
/mob/living/simple_mob/vore/sheep = 20,
|
||||
/mob/living/simple_mob/vore/rabbit/black = 20,
|
||||
/mob/living/simple_mob/vore/rabbit/white = 20,
|
||||
@@ -86,7 +91,13 @@ var/world_time_season
|
||||
/mob/living/simple_mob/vore/leopardmander = 2,
|
||||
/mob/living/simple_mob/vore/horse/big = 10,
|
||||
/mob/living/simple_mob/vore/bigdragon/friendly = 1,
|
||||
/mob/living/simple_mob/vore/alienanimals/dustjumper = 20
|
||||
/mob/living/simple_mob/vore/alienanimals/dustjumper = 20,
|
||||
/mob/living/simple_mob/vore/bee = 5,
|
||||
/mob/living/simple_mob/vore/horse/big = 5,
|
||||
/mob/living/simple_mob/vore/pakkun = 2,
|
||||
/mob/living/simple_mob/vore/fennix = 1,
|
||||
/mob/living/simple_mob/animal/wolf/direwolf/dog = 1,
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot = 1
|
||||
)
|
||||
grass_types = list(
|
||||
/obj/structure/flora/ausbushes/sparsegrass,
|
||||
@@ -108,7 +119,11 @@ var/world_time_season
|
||||
/mob/living/simple_mob/vore/rabbit/white = 20,
|
||||
/mob/living/simple_mob/vore/rabbit/brown = 20,
|
||||
/mob/living/simple_mob/vore/horse/big = 10,
|
||||
/mob/living/simple_mob/vore/alienanimals/dustjumper = 20
|
||||
/mob/living/simple_mob/vore/alienanimals/dustjumper = 20,
|
||||
/mob/living/simple_mob/vore/horse/big = 1,
|
||||
/mob/living/simple_mob/animal/wolf = 1,
|
||||
/mob/living/simple_mob/animal/wolf/direwolf = 1,
|
||||
/mob/living/simple_mob/animal/wolf/direwolf/dog = 1
|
||||
)
|
||||
grass_types = list(
|
||||
/obj/structure/flora/ausbushes/sparsegrass,
|
||||
@@ -129,7 +144,14 @@ var/world_time_season
|
||||
/mob/living/simple_mob/vore/rabbit/white = 40,
|
||||
/mob/living/simple_mob/vore/alienanimals/teppi = 10,
|
||||
/mob/living/simple_mob/vore/alienanimals/teppi/mutant = 1,
|
||||
/mob/living/simple_mob/vore/redpanda = 10
|
||||
/mob/living/simple_mob/vore/redpanda = 10,
|
||||
/mob/living/simple_mob/animal/wolf = 10,
|
||||
/mob/living/simple_mob/animal/wolf/direwolf = 1,
|
||||
/mob/living/simple_mob/animal/wolf/direwolf/dog = 1,
|
||||
/mob/living/simple_mob/otie/friendly = 2,
|
||||
/mob/living/simple_mob/otie/friendly/chubby = 1,
|
||||
/mob/living/simple_mob/otie/red/friendly = 1,
|
||||
/mob/living/simple_mob/otie/red/chubby = 1
|
||||
)
|
||||
if(prob(snow_chance))
|
||||
chill()
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
var/static/list/has_rocks = list("dirt5", "dirt6", "dirt7", "dirt8", "dirt9")
|
||||
|
||||
/turf/simulated/floor/outdoors/newdirt/attack_hand(mob/user)
|
||||
if(user.pulling)
|
||||
return ..()
|
||||
var/static/list/has_rocks = list("dirt5", "dirt6", "dirt7", "dirt8", "dirt9")
|
||||
if(!Adjacent(user))
|
||||
return ..()
|
||||
if(user.a_intent != I_HELP)
|
||||
return ..()
|
||||
if(icon_state in has_rocks)
|
||||
user.visible_message("[user] loosens rocks from \the [src]...", "You loosen rocks from \the [src]...")
|
||||
if(do_after(user, 5 SECONDS, exclusive = TASK_USER_EXCLUSIVE))
|
||||
@@ -76,4 +79,4 @@
|
||||
S.pixel_y = rand(-6,6)
|
||||
sticks = FALSE
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You don't see any loose sticks...</span>")
|
||||
to_chat(user, "<span class='notice'>You don't see any loose sticks...</span>")
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
/turf
|
||||
var/list/temp_check = list()
|
||||
@@ -41,6 +41,13 @@
|
||||
src.update_status()
|
||||
setup_season() //VOREStation Addition
|
||||
|
||||
// CHOMPStation Addition: Spaceman DMM Debugging
|
||||
var/debug_server = world.GetConfig("env", "AUXTOOLS_DEBUG_DLL")
|
||||
if (debug_server)
|
||||
call(debug_server, "auxtools_init")()
|
||||
enable_debugging()
|
||||
// CHOMPStation Add End
|
||||
|
||||
. = ..()
|
||||
|
||||
#if UNIT_TEST
|
||||
@@ -597,7 +604,7 @@ var/failed_old_db_connections = 0
|
||||
if(num_tries==5)
|
||||
log_admin("ERROR TRYING TO CLEAR erro_attacklog")
|
||||
qdel(query_truncate2)
|
||||
else
|
||||
else
|
||||
to_world_log("Feedback database connection failed.")
|
||||
//CHOMPEdit End
|
||||
return 1
|
||||
@@ -775,3 +782,21 @@ var/global/game_id = null
|
||||
game_id = "[c[(t % l) + 1]][game_id]"
|
||||
t = round(t / l)
|
||||
return 1
|
||||
|
||||
// CHOMPStation Add: Spaceman DMM Debugger
|
||||
/proc/auxtools_stack_trace(msg)
|
||||
CRASH(msg)
|
||||
|
||||
/proc/auxtools_expr_stub()
|
||||
CRASH("auxtools not loaded")
|
||||
|
||||
/proc/enable_debugging(mode, port)
|
||||
CRASH("auxtools not loaded")
|
||||
|
||||
/world/Del()
|
||||
var/debug_server = world.GetConfig("env", "AUXTOOLS_DEBUG_DLL")
|
||||
if (debug_server)
|
||||
call(debug_server, "auxtools_shutdown")()
|
||||
. = ..()
|
||||
|
||||
// CHOMPStation Add End: Spaceman DMM Debugger
|
||||
|
||||
@@ -145,7 +145,6 @@ var/list/robot_module_types = list(
|
||||
"Miner", "Janitor", "Service", "Clerical", "Security",
|
||||
"Research", "Medihound", "K9", "Janihound", "Sci-borg", "Pupdozer",
|
||||
"Service-Hound", "BoozeHound", "KMine", "TraumaHound"
|
||||
, "UnityHound", "Honk-Hound" // CHOMPEdit -- Adds the UnityHound drone to the list.
|
||||
)
|
||||
// List of modules added during code red
|
||||
var/list/emergency_module_types = list(
|
||||
|
||||
@@ -283,7 +283,8 @@
|
||||
|
||||
output += "<td width='65%' align='center' bgcolor='#f9f9f9'>"
|
||||
|
||||
output += "<form method='GET' action='?src=\ref[src]'><b>Add custom ban:</b> (ONLY use this if you can't ban through any other method)"
|
||||
output += "<form method='GET' action='?src=\ref[src]'>[HrefTokenFormField()]"
|
||||
output += "<b>Add custom ban:</b> (ONLY use this if you can't ban through any other method)"
|
||||
output += "<input type='hidden' name='src' value='\ref[src]'>"
|
||||
output += "<table width='100%'><tr>"
|
||||
output += "<td width='50%' align='right'><b>Ban type:</b><select name='dbbanaddtype'>"
|
||||
@@ -318,7 +319,8 @@
|
||||
output += "</tr>"
|
||||
output += "</table>"
|
||||
|
||||
output += "<form method='GET' action='?src=\ref[src]'><table width='60%'><tr><td colspan='2' align='left'><b>Search:</b>"
|
||||
output += "<form method='GET' action='?src=\ref[src]'>[HrefTokenFormField()]"
|
||||
output += "<table width='60%'><tr><td colspan='2' align='left'><b>Search:</b>"
|
||||
output += "<input type='hidden' name='src' value='\ref[src]'></td></tr>"
|
||||
output += "<tr><td width='50%' align='right'><b>Ckey:</b> <input type='text' name='dbsearchckey' value='[playerckey]'></td>"
|
||||
output += "<td width='50%' align='right'><b>Admin ckey:</b> <input type='text' name='dbsearchadmin' value='[adminckey]'></td></tr>"
|
||||
|
||||
@@ -70,10 +70,10 @@
|
||||
// Step 4, give us our selected target.
|
||||
/datum/ai_holder/proc/give_target(new_target, urgent = FALSE)
|
||||
ai_log("give_target() : Given '[new_target]', urgent=[urgent].", AI_LOG_TRACE)
|
||||
|
||||
|
||||
if(target)
|
||||
remove_target()
|
||||
|
||||
|
||||
target = new_target
|
||||
|
||||
if(target != null)
|
||||
@@ -282,7 +282,7 @@
|
||||
|
||||
// Checks to see if an atom attacked us lately
|
||||
/datum/ai_holder/proc/check_attacker(var/atom/movable/A)
|
||||
return (A in attackers)
|
||||
return (A.name in attackers)
|
||||
|
||||
// We were attacked by this thing recently
|
||||
/datum/ai_holder/proc/add_attacker(var/atom/movable/A)
|
||||
|
||||
@@ -3,3 +3,14 @@
|
||||
return FALSE
|
||||
|
||||
return ..()
|
||||
/*
|
||||
/datum/ai_holder/can_see_target(atom/movable/the_target, view_range = vision_range)
|
||||
log_world("TARGET: [the_target] and TARGET.LOC: [the_target.loc]")
|
||||
if(the_target && !isturf(the_target.loc)) //CHOMPEdit, AI shouldn't be targetting people inside objects of any kind
|
||||
if(ismecha(the_target.loc)) //Except mechs, of course
|
||||
target = the_target.loc
|
||||
else
|
||||
return FALSE
|
||||
|
||||
return ..()
|
||||
*/
|
||||
@@ -896,9 +896,10 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
/* VOREStation Removal - No markings whitelist, let people mix/match
|
||||
for(var/M in usable_markings)
|
||||
var/datum/sprite_accessory/S = usable_markings[M]
|
||||
var/datum/species/spec = GLOB.all_species[pref.species]
|
||||
if(!S.species_allowed.len)
|
||||
continue
|
||||
else if(!(pref.species in S.species_allowed))
|
||||
else if(!(pref.species in S.species_allowed) && !(pref.custom_base in S.species_allowed) && !(spec.base_species in S.species_allowed))
|
||||
usable_markings -= M
|
||||
*/ //VOREStation Removal End
|
||||
var/new_marking = tgui_input_list(user, "Choose a body marking:", "Character Preference", usable_markings)
|
||||
|
||||
@@ -157,6 +157,12 @@ var/list/_client_preferences_by_type
|
||||
enabled_description = "Audible"
|
||||
disabled_description = "Silent"
|
||||
|
||||
/datum/client_preference/looping_alarms // CHOMPStation Add: Looping Alarms
|
||||
description ="Looping Alarm Sounds"
|
||||
key = "SOUND_ALARMLOOP"
|
||||
enabled_description = "Audible"
|
||||
disabled_description = "Silent"
|
||||
|
||||
/datum/client_preference/old_door_sounds
|
||||
description ="Old Door Sounds"
|
||||
key = "SOUND_OLDDOORS"
|
||||
@@ -375,6 +381,14 @@ var/list/_client_preferences_by_type
|
||||
key = "RECEIVE_TIPS"
|
||||
enabled_description = "Enabled"
|
||||
disabled_description = "Disabled"
|
||||
|
||||
/datum/client_preference/pain_frequency
|
||||
description = "Pain Messages Cooldown"
|
||||
key = "PAIN_FREQUENCY"
|
||||
enabled_by_default = FALSE
|
||||
enabled_description = "Extended"
|
||||
disabled_description = "Default"
|
||||
|
||||
|
||||
/********************
|
||||
* Staff Preferences *
|
||||
|
||||
@@ -57,6 +57,7 @@
|
||||
// look if theres a better way to do this im all ears
|
||||
blacklisted_types += subtypesof(/obj/item/toy/plushie/therapy)
|
||||
blacklisted_types += subtypesof(/obj/item/toy/plushie/fluff)
|
||||
blacklisted_types += /obj/item/toy/plushie/borgplushie/drake //VOREStation addition
|
||||
for(var/obj/item/toy/plushie/plushie_type as anything in subtypesof(/obj/item/toy/plushie) - blacklisted_types)
|
||||
plushies[initial(plushie_type.name)] = plushie_type
|
||||
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(plushies))
|
||||
|
||||
@@ -72,6 +72,22 @@
|
||||
..()
|
||||
gear_tweaks += gear_tweak_free_color_choice
|
||||
|
||||
/datum/gear/head/halo/alt
|
||||
display_name = "halo, alt"
|
||||
path = /obj/item/clothing/head/halo/alt
|
||||
|
||||
/datum/gear/head/buckethat
|
||||
display_name = "hat, bucket"
|
||||
path = /obj/item/clothing/head/buckethat
|
||||
|
||||
/datum/gear/head/buckethat/New()
|
||||
..()
|
||||
gear_tweaks += gear_tweak_free_color_choice
|
||||
|
||||
/datum/gear/head/nonla
|
||||
display_name = "hat, non la"
|
||||
path = /obj/item/clothing/head/nonla
|
||||
|
||||
/*
|
||||
Talon hats
|
||||
*/
|
||||
|
||||
@@ -74,4 +74,11 @@
|
||||
for(var/gaiter in typesof(/obj/item/clothing/accessory/gaiter))
|
||||
var/obj/item/clothing/accessory/gaiter_type = gaiter
|
||||
gaiters[initial(gaiter_type.name)] = gaiter_type
|
||||
gear_tweaks += new/datum/gear_tweak/path(sortTim(gaiters, /proc/cmp_text_asc))
|
||||
gear_tweaks += new/datum/gear_tweak/path(sortTim(gaiters, /proc/cmp_text_asc))
|
||||
|
||||
/datum/gear/mask/lace
|
||||
display_name = "lace veil"
|
||||
path = /obj/item/clothing/mask/lacemask
|
||||
|
||||
/datum/gear/mask/lace/New()
|
||||
gear_tweaks += gear_tweak_free_color_choice
|
||||
@@ -30,5 +30,9 @@
|
||||
path = /obj/item/clothing/shoes/boots/singer/yellow
|
||||
|
||||
/datum/gear/shoes/antediluvian
|
||||
display_name = "antediluvian legwraps"
|
||||
path = /obj/item/clothing/shoes/antediluvian
|
||||
display_name = "legwraps, antediluvian"
|
||||
path = /obj/item/clothing/shoes/antediluvian
|
||||
|
||||
/datum/gear/shoes/flats/alt
|
||||
display_name = "flats, alt"
|
||||
path = /obj/item/clothing/shoes/flats/white/color/alt
|
||||
@@ -225,4 +225,96 @@ Talon winter coat
|
||||
"blue mantle"=/obj/item/clothing/accessory/poncho/roles/cloak/mantle/hop,
|
||||
"gold mantle"=/obj/item/clothing/accessory/poncho/roles/cloak/mantle/cap
|
||||
)
|
||||
gear_tweaks += new/datum/gear_tweak/path(mantles)
|
||||
gear_tweaks += new/datum/gear_tweak/path(mantles)
|
||||
|
||||
//Boat cloaks
|
||||
/datum/gear/suit/roles/boatcloak
|
||||
display_name = "boat cloak, colorable"
|
||||
path = /obj/item/clothing/accessory/poncho/roles/cloak/boat
|
||||
|
||||
/datum/gear/suit/roles/boatcloak/New()
|
||||
gear_tweaks += gear_tweak_free_color_choice
|
||||
|
||||
/datum/gear/suit/roles/capboatcloak
|
||||
display_name = "boat cloak, site manager"
|
||||
path = /obj/item/clothing/accessory/poncho/roles/cloak/boat/cap
|
||||
allowed_roles = list("Site Manager")
|
||||
|
||||
/datum/gear/suit/roles/hopboatcloak
|
||||
display_name = "boat cloak, head of personnel"
|
||||
path = /obj/item/clothing/accessory/poncho/roles/cloak/boat/hop
|
||||
allowed_roles = list("Head of Personnel")
|
||||
|
||||
/datum/gear/suit/roles/boatcloaks
|
||||
display_name = "boat cloak selection"
|
||||
path = /obj/item/clothing/accessory/poncho/roles/cloak/boat/security
|
||||
|
||||
/datum/gear/suit/roles/boatcloaks/New()
|
||||
..()
|
||||
var/list/boatcloaks = list(
|
||||
"security boat cloak"=/obj/item/clothing/accessory/poncho/roles/cloak/boat/security,
|
||||
"engineering boat cloak"=/obj/item/clothing/accessory/poncho/roles/cloak/boat/engineering,
|
||||
"atmospherics boat cloak"=/obj/item/clothing/accessory/poncho/roles/cloak/boat/atmos,
|
||||
"medical boat cloak"=/obj/item/clothing/accessory/poncho/roles/cloak/boat/medical,
|
||||
"service boat cloak"=/obj/item/clothing/accessory/poncho/roles/cloak/boat/service,
|
||||
"cargo boat cloak"=/obj/item/clothing/accessory/poncho/roles/cloak/boat/cargo,
|
||||
"mining boat cloak"=/obj/item/clothing/accessory/poncho/roles/cloak/boat/mining,
|
||||
"research boat cloak"=/obj/item/clothing/accessory/poncho/roles/cloak/boat/science
|
||||
)
|
||||
gear_tweaks += new/datum/gear_tweak/path(boatcloaks)
|
||||
|
||||
//Shrouds
|
||||
/datum/gear/suit/roles/shroud
|
||||
display_name = "shroud, colorable"
|
||||
path = /obj/item/clothing/accessory/poncho/roles/cloak/shroud
|
||||
|
||||
/datum/gear/suit/roles/shroud/New()
|
||||
gear_tweaks += gear_tweak_free_color_choice
|
||||
|
||||
/datum/gear/suit/roles/capshroud
|
||||
display_name = "shroud, site manager"
|
||||
path = /obj/item/clothing/accessory/poncho/roles/cloak/shroud/cap
|
||||
allowed_roles = list("Site Manager")
|
||||
|
||||
/datum/gear/suit/roles/hopshroud
|
||||
display_name = "shroud, head of personnel"
|
||||
path = /obj/item/clothing/accessory/poncho/roles/cloak/shroud/hop
|
||||
allowed_roles = list("Head of Personnel")
|
||||
|
||||
/datum/gear/suit/roles/shrouds
|
||||
display_name = "shroud selection"
|
||||
path = /obj/item/clothing/accessory/poncho/roles/cloak/shroud/security
|
||||
|
||||
/datum/gear/suit/roles/shrouds/New()
|
||||
..()
|
||||
var/list/shrouds = list(
|
||||
"security shroud"=/obj/item/clothing/accessory/poncho/roles/cloak/shroud/security,
|
||||
"engineering shroud"=/obj/item/clothing/accessory/poncho/roles/cloak/shroud/engineering,
|
||||
"atmospherics shroud"=/obj/item/clothing/accessory/poncho/roles/cloak/shroud/atmos,
|
||||
"medical shroud"=/obj/item/clothing/accessory/poncho/roles/cloak/shroud/medical,
|
||||
"service shroud"=/obj/item/clothing/accessory/poncho/roles/cloak/shroud/service,
|
||||
"cargo shroud"=/obj/item/clothing/accessory/poncho/roles/cloak/shroud/cargo,
|
||||
"mining shroud"=/obj/item/clothing/accessory/poncho/roles/cloak/shroud/mining,
|
||||
"research shroud"=/obj/item/clothing/accessory/poncho/roles/cloak/shroud/science
|
||||
)
|
||||
gear_tweaks += new/datum/gear_tweak/path(shrouds)
|
||||
|
||||
//Actually colorable hoodies
|
||||
/datum/gear/suit/roles/choodies
|
||||
display_name = "hoodie selection, colorable"
|
||||
path = /obj/item/clothing/suit/storage/hooded/toggle/colorable
|
||||
|
||||
/datum/gear/suit/roles/choodies/New()
|
||||
..()
|
||||
var/list/choodies = list(
|
||||
"normal hoodie"=/obj/item/clothing/suit/storage/hooded/toggle/colorable,
|
||||
"sleeveless hoodie"=/obj/item/clothing/suit/storage/hooded/toggle/colorable/sleeveless,
|
||||
"cropped hoodie"=/obj/item/clothing/suit/storage/hooded/toggle/colorable/cropped
|
||||
)
|
||||
gear_tweaks += gear_tweak_free_color_choice
|
||||
gear_tweaks += new/datum/gear_tweak/path(choodies)
|
||||
|
||||
//ABOUT TIME SOMEONE ADDED THIS TO A LOADOUT
|
||||
/datum/gear/suit/bladerunnercoat
|
||||
display_name = "leather coat, massive"
|
||||
path = /obj/item/clothing/suit/storage/bladerunner
|
||||
@@ -346,4 +346,27 @@ Talon jumpsuit
|
||||
|
||||
/datum/gear/uniform/antediluvianalt
|
||||
display_name = "corset, antediluvian alt"
|
||||
path = /obj/item/clothing/under/dress/antediluvian/sheerless
|
||||
path = /obj/item/clothing/under/dress/antediluvian/sheerless
|
||||
|
||||
//Colorable skirts
|
||||
/datum/gear/uniform/coloredskirts
|
||||
display_name = "skirt selection, colorable"
|
||||
path = /obj/item/clothing/under/skirt/colorable
|
||||
|
||||
/datum/gear/uniform/coloredskirts/New()
|
||||
..()
|
||||
var/list/skirts = list(
|
||||
"casual skirt"=/obj/item/clothing/under/skirt/colorable,
|
||||
"puffy skirt"=/obj/item/clothing/under/skirt/colorable/puffy,
|
||||
"skater skirt"=/obj/item/clothing/under/skirt/colorable/skater,
|
||||
"pleated skirt"=/obj/item/clothing/under/skirt/colorable/pleated,
|
||||
"pencil skirt"=/obj/item/clothing/under/skirt/colorable/pencil,
|
||||
"plaid skirt"=/obj/item/clothing/under/skirt/colorable/plaid,
|
||||
"tube skirt"=/obj/item/clothing/under/skirt/colorable/tube,
|
||||
"long skirt"=/obj/item/clothing/under/skirt/colorable/long,
|
||||
"high skirt"=/obj/item/clothing/under/skirt/colorable/high,
|
||||
"swept skirt"=/obj/item/clothing/under/skirt/colorable/swept,
|
||||
"jumper skirt"=/obj/item/clothing/under/skirt/colorable/jumper,
|
||||
"jumper dress"=/obj/item/clothing/under/skirt/colorable/jumperdress
|
||||
)
|
||||
gear_tweaks += list(new/datum/gear_tweak/path(skirts), gear_tweak_free_color_choice)
|
||||
@@ -17,6 +17,7 @@
|
||||
var/offset_override = FALSE //CHOMPEdit
|
||||
var/voice_freq = 42500 //CHOMPEdit - Why was the default 0
|
||||
var/voice_sound = "goon speak 1" //CHOMPEdit - Changed the default voice to one less jarring
|
||||
var/custom_speech_bubble = "default"
|
||||
|
||||
// Definition of the stuff for Sizing
|
||||
/datum/category_item/player_setup_item/vore/size
|
||||
@@ -32,6 +33,7 @@
|
||||
S["offset_override"] >> pref.offset_override //CHOMPEdit
|
||||
S["voice_freq"] >> pref.voice_freq
|
||||
S["voice_sound"] >> pref.voice_sound
|
||||
S["custom_speech_bubble"] >> pref.custom_speech_bubble
|
||||
|
||||
/datum/category_item/player_setup_item/vore/size/save_character(var/savefile/S)
|
||||
S["size_multiplier"] << pref.size_multiplier
|
||||
@@ -42,6 +44,7 @@
|
||||
S["offset_override"] << pref.offset_override //CHOMPEdit
|
||||
S["voice_freq"] << pref.voice_freq
|
||||
S["voice_sound"] << pref.voice_sound
|
||||
S["custom_speech_bubble"] << pref.custom_speech_bubble
|
||||
|
||||
|
||||
/datum/category_item/player_setup_item/vore/size/sanitize_character()
|
||||
@@ -54,6 +57,8 @@
|
||||
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)
|
||||
if(!(pref.custom_speech_bubble in selectable_speech_bubbles))
|
||||
pref.custom_speech_bubble = "default"
|
||||
|
||||
/datum/category_item/player_setup_item/vore/size/copy_to_mob(var/mob/living/carbon/human/character)
|
||||
character.weight = pref.weight_vr
|
||||
@@ -95,6 +100,7 @@
|
||||
character.voice_sounds_list = goon_speak_roach_sound
|
||||
if("goon speak skelly")
|
||||
character.voice_sounds_list = goon_speak_skelly_sound
|
||||
character.custom_speech_bubble = pref.custom_speech_bubble
|
||||
|
||||
/datum/category_item/player_setup_item/vore/size/content(var/mob/user)
|
||||
. += "<br>"
|
||||
@@ -103,7 +109,8 @@
|
||||
. += "<b>Scaling Center:</b> <a [pref.offset_override ? "" : ""] href='?src=\ref[src];toggle_offset_override=1'><b>[pref.offset_override ? "Odd" : "Even"]</b></a><br>" //CHOMPEdit
|
||||
. += "<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>"
|
||||
// . += "<a href='?src=\ref[src];voice_test=1'><b>Test Voice:</b></a><br>" Maybe later
|
||||
. += "<a href='?src=\ref[src];voice_test=1'><b>Test Selected Voice</b></a><br>"
|
||||
. += "<b>Custom Speech Bubble:</b> <a href='?src=\ref[src];customize_speech_bubble=1'>[pref.custom_speech_bubble]</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>"
|
||||
@@ -200,8 +207,48 @@
|
||||
pref.voice_sound = "goon speak 1" //CHOMPEdit - Defaults voice to a less jarring sound
|
||||
else
|
||||
pref.voice_sound = choice
|
||||
/* Maybe later
|
||||
return TOPIC_REFRESH
|
||||
else if(href_list["customize_speech_bubble"])
|
||||
var/choice = tgui_input_list(usr, "What speech bubble style do you want to use? (default for automatic selection)", "Custom Speech Bubble", selectable_speech_bubbles)
|
||||
if(!choice)
|
||||
pref.custom_speech_bubble = "default"
|
||||
else
|
||||
pref.custom_speech_bubble = choice
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["voice_test"])
|
||||
SEND_SOUND(user, sound(pick(voice_sounds_list), 50, frequency = pref.voice_freq))
|
||||
*/
|
||||
return ..();
|
||||
var/sound/S = pick(pref.voice_sound)
|
||||
switch(pref.voice_sound)
|
||||
if("beep-boop")
|
||||
S = sound(pick(talk_sound))
|
||||
if("goon speak 1")
|
||||
S = sound(pick(goon_speak_one_sound))
|
||||
if("goon speak 2")
|
||||
S = sound(pick(goon_speak_two_sound))
|
||||
if("goon speak 3")
|
||||
S = sound(pick(goon_speak_three_sound))
|
||||
if("goon speak 4")
|
||||
S = sound(pick(goon_speak_four_sound))
|
||||
if("goon speak blub")
|
||||
S = sound(pick(goon_speak_blub_sound))
|
||||
if("goon speak bottalk")
|
||||
S = sound(pick(goon_speak_bottalk_sound))
|
||||
if("goon speak buwoo")
|
||||
S = sound(pick(goon_speak_buwoo_sound))
|
||||
if("goon speak cow")
|
||||
S = sound(pick(goon_speak_cow_sound))
|
||||
if("goon speak lizard")
|
||||
S = sound(pick(goon_speak_lizard_sound))
|
||||
if("goon speak pug")
|
||||
S = sound(pick(goon_speak_pug_sound))
|
||||
if("goon speak pugg")
|
||||
S = sound(pick(goon_speak_pugg_sound))
|
||||
if("goon speak roach")
|
||||
S = sound(pick(goon_speak_roach_sound))
|
||||
if("goon speak skelly")
|
||||
S = sound(pick(goon_speak_skelly_sound))
|
||||
S.frequency = pick(pref.voice_freq)
|
||||
S.volume = 50
|
||||
SEND_SOUND(user, S)
|
||||
|
||||
return ..();
|
||||
@@ -26,6 +26,9 @@
|
||||
pref.nif_path = null //Kill!
|
||||
WARNING("Loaded a NIF but it was an invalid path, [pref.real_name]")
|
||||
|
||||
if (ispath(pref.nif_path, /obj/item/device/nif/protean) && pref.species != SPECIES_PROTEAN) //no free nifs
|
||||
pref.nif_path = null
|
||||
|
||||
if(ispath(pref.nif_path) && isnull(pref.nif_durability)) //How'd you lose this?
|
||||
pref.nif_durability = initial(pref.nif_path.durability) //Well, have a new one, my bad.
|
||||
WARNING("Loaded a NIF but with no durability, [pref.real_name]")
|
||||
|
||||
@@ -413,6 +413,7 @@ var/list/preferences_datums = list()
|
||||
var/name
|
||||
var/nickname //vorestation edit - This set appends nicknames to the save slot
|
||||
var/list/charlist = list()
|
||||
var/default //VOREStation edit
|
||||
for(var/i=1, i<= config.character_slots, i++)
|
||||
S.cd = "/character[i]"
|
||||
S["real_name"] >> name
|
||||
@@ -423,10 +424,12 @@ var/list/preferences_datums = list()
|
||||
name = "►[i] - [name]"
|
||||
else
|
||||
name = "[i] - [name]"
|
||||
if (i == default_slot) //VOREStation edit
|
||||
default = "[name][nickname ? " ([nickname])" : ""]"
|
||||
charlist["[name][nickname ? " ([nickname])" : ""]"] = i
|
||||
|
||||
selecting_slots = TRUE
|
||||
var/choice = tgui_input_list(user, "Select a character to load:", "Load Slot", charlist)
|
||||
var/choice = tgui_input_list(user, "Select a character to load:", "Load Slot", charlist, default)
|
||||
selecting_slots = FALSE
|
||||
if(!choice)
|
||||
return
|
||||
|
||||
14
code/modules/client/preferences_ch.dm
Normal file
14
code/modules/client/preferences_ch.dm
Normal file
@@ -0,0 +1,14 @@
|
||||
/client/verb/toggle_looping_alarms()
|
||||
set name = "Looping Alarms"
|
||||
set category = "Preferences"
|
||||
set desc = "Toggles alarm sound loops."
|
||||
|
||||
var/pref_path = /datum/client_preference/looping_alarms
|
||||
|
||||
toggle_preference(pref_path)
|
||||
|
||||
to_chat(src, "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear alarm sounds looping.")
|
||||
|
||||
SScharacter_setup.queue_preferences_save(prefs)
|
||||
|
||||
feedback_add_details("admin_verb","TAlarmLoops") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
@@ -135,3 +135,18 @@
|
||||
toggle_preference(pref_path)
|
||||
|
||||
to_chat(src, "You are [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] periodically receiving advice on gameplay and roleplay.")
|
||||
|
||||
SScharacter_setup.queue_preferences_save(prefs)
|
||||
|
||||
feedback_add_details("admin_verb", "TReceivePlayerTips")
|
||||
|
||||
/client/verb/toggle_pain_frequency()
|
||||
set name = "Toggle Pain Frequency"
|
||||
set category = "Preferences"
|
||||
set desc = "When toggled on, increases the cooldown of pain messages sent to chat for minor injuries"
|
||||
|
||||
var/pref_path = /datum/client_preference/pain_frequency
|
||||
|
||||
toggle_preference(pref_path)
|
||||
|
||||
to_chat(src, "The cooldown between pain messages for minor (under 20/5 injury. Multi-limb injuries are still faster) is now [ (is_preference_enabled(pref_path)) ? "extended" : "default"].")
|
||||
|
||||
@@ -214,7 +214,8 @@
|
||||
throwforce = 2
|
||||
slot_flags = SLOT_EARS
|
||||
sprite_sheets = list(
|
||||
SPECIES_TESHARI = 'icons/inventory/ears/mob_teshari.dmi')
|
||||
SPECIES_TESHARI = 'icons/inventory/ears/mob_teshari.dmi',
|
||||
SPECIES_VOX = 'icons/inventory/hands/mob_vox.dmi')
|
||||
|
||||
/obj/item/clothing/ears/attack_hand(mob/user as mob)
|
||||
if (!user) return
|
||||
@@ -473,7 +474,7 @@
|
||||
|
||||
/obj/item/clothing/head/proc/update_flashlight(var/mob/user = null)
|
||||
set_light_on(!light_on)
|
||||
|
||||
|
||||
if(light_system == STATIC_LIGHT)
|
||||
update_light()
|
||||
|
||||
@@ -786,7 +787,7 @@
|
||||
var/image/standing = ..()
|
||||
if(taurized) //Special snowflake var on suits
|
||||
standing.pixel_x = -16
|
||||
standing.layer = BODY_LAYER + 17 // 17 is above tail layer, so will not be covered by taurbody. TAIL_UPPER_LAYER +1
|
||||
standing.layer = BODY_LAYER + 18 // 17 is above tail layer, so will not be covered by taurbody. TAIL_UPPER_LAYER +1
|
||||
return standing
|
||||
|
||||
/obj/item/clothing/suit/apply_accessories(var/image/standing)
|
||||
@@ -828,7 +829,7 @@
|
||||
var/rolled_down = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled
|
||||
var/rolled_down_icon_override = TRUE
|
||||
var/rolled_sleeves = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled
|
||||
var/rolled_sleeves_icon_override = TRUE
|
||||
var/rolled_sleeves_icon_override = TRUE
|
||||
sprite_sheets = list(
|
||||
SPECIES_TESHARI = 'icons/inventory/uniform/mob_teshari.dmi',
|
||||
SPECIES_VOX = 'icons/inventory/uniform/mob_vox.dmi'
|
||||
@@ -1058,10 +1059,10 @@
|
||||
/obj/item/clothing/under/rank/New()
|
||||
sensor_mode = pick(0,1,2,3)
|
||||
..()
|
||||
|
||||
|
||||
//Vorestation edit - eject mobs from clothing before deletion
|
||||
/obj/item/clothing/Destroy()
|
||||
for(var/mob/living/M in contents)
|
||||
M.forceMove(get_turf(src))
|
||||
return ..()
|
||||
//Vorestation edit end
|
||||
//Vorestation edit end
|
||||
|
||||
@@ -100,6 +100,7 @@
|
||||
/obj/item/clothing/ears
|
||||
sprite_sheets = list(
|
||||
SPECIES_TESHARI = 'icons/inventory/ears/mob_teshari.dmi',
|
||||
SPECIES_VOX = 'icons/inventory/ears/mob_vox.dmi',
|
||||
SPECIES_WEREBEAST = 'icons/inventory/ears/mob_vr_werebeast.dmi')
|
||||
|
||||
/obj/item/clothing/relaymove(var/mob/living/user,var/direction)
|
||||
|
||||
@@ -122,6 +122,7 @@
|
||||
item_state = "tajblind"
|
||||
prescription = 1
|
||||
body_parts_covered = EYES
|
||||
sprite_sheets = list(SPECIES_VOX = 'icons/inventory/eyes/mob_vox.dmi')
|
||||
|
||||
/obj/item/clothing/glasses/hud/health/tajblind
|
||||
name = "lightweight veil"
|
||||
@@ -131,6 +132,7 @@
|
||||
icon_state = "tajblind_med"
|
||||
item_state = "tajblind_med"
|
||||
body_parts_covered = EYES
|
||||
sprite_sheets = list(SPECIES_VOX = 'icons/inventory/eyes/mob_vox.dmi')
|
||||
|
||||
/obj/item/clothing/glasses/sunglasses/sechud/tajblind
|
||||
name = "sleek veil"
|
||||
@@ -141,6 +143,7 @@
|
||||
item_state = "tajblind_sec"
|
||||
prescription = 1
|
||||
body_parts_covered = EYES
|
||||
sprite_sheets = list(SPECIES_VOX = 'icons/inventory/eyes/mob_vox.dmi')
|
||||
|
||||
/obj/item/clothing/glasses/meson/prescription/tajblind
|
||||
name = "industrial veil"
|
||||
@@ -151,6 +154,7 @@
|
||||
item_state = "tajblind_meson"
|
||||
off_state = "tajblind"
|
||||
body_parts_covered = EYES
|
||||
sprite_sheets = list(SPECIES_VOX = 'icons/inventory/eyes/mob_vox.dmi')
|
||||
|
||||
/obj/item/clothing/glasses/material/prescription/tajblind
|
||||
name = "mining veil"
|
||||
@@ -161,6 +165,7 @@
|
||||
item_state = "tajblind_meson"
|
||||
off_state = "tajblind"
|
||||
body_parts_covered = EYES
|
||||
sprite_sheets = list(SPECIES_VOX = 'icons/inventory/eyes/mob_vox.dmi')
|
||||
|
||||
/obj/item/clothing/glasses
|
||||
sprite_sheets = list(
|
||||
|
||||
@@ -76,3 +76,20 @@
|
||||
/obj/item/clothing/head/hood/winter
|
||||
sprite_sheets = list( SPECIES_TESHARI = 'icons/inventory/head/mob_vr_teshari.dmi',
|
||||
SPECIES_VOX = 'icons/inventory/head/mob_vox.dmi')
|
||||
|
||||
//Better hoodies hood
|
||||
/obj/item/clothing/head/hood/toggleable
|
||||
name = "super special hood"
|
||||
desc = "This hood is so special that you weren't even supposed to lay eyes on it! Tell a developer!"
|
||||
var/open = FALSE
|
||||
|
||||
/obj/item/clothing/head/hood/toggleable/colorable
|
||||
name = "hoodie hood"
|
||||
desc = "It's the hood part of a hoodie. What kind of hoodie would it be without one? A poser, obviously."
|
||||
icon = 'icons/inventory/head/item_vr.dmi'
|
||||
icon_override = 'icons/inventory/head/mob_vr.dmi'
|
||||
icon_state = "choodie"
|
||||
|
||||
/obj/item/clothing/head/hood/toggleable/colorable/update_icon()
|
||||
. = ..()
|
||||
icon_state = "[initial(icon_state)][open ? "_open" : ""]"
|
||||
@@ -96,9 +96,30 @@
|
||||
/obj/item/clothing/head/wedding
|
||||
name = "wedding veil"
|
||||
desc = "A lace veil worn over the face, typically by a bride during their wedding."
|
||||
icon_state = "weddingveil"
|
||||
icon = 'icons/inventory/head/item_vr.dmi'
|
||||
icon_override = 'icons/inventory/head/mob_vr.dmi'
|
||||
icon_state = "weddingveil"
|
||||
|
||||
/obj/item/clothing/head/halo/alt
|
||||
name = "metal halo"
|
||||
desc = "A halo made of a light metal. This one doesn't float, but it's still a circle on your head!"
|
||||
icon = 'icons/inventory/head/item_vr.dmi'
|
||||
icon_override = 'icons/inventory/head/mob_vr.dmi'
|
||||
icon_state = "halo_alt"
|
||||
|
||||
/obj/item/clothing/head/buckethat
|
||||
name = "bucket hat"
|
||||
desc = "Turns out these are actually called 'gatsby caps' but telling people you wear a bucket is slightly more interesting, so that's what it's called."
|
||||
icon = 'icons/inventory/head/item_vr.dmi'
|
||||
icon_override = 'icons/inventory/head/mob_vr.dmi'
|
||||
icon_state = "buckethat"
|
||||
|
||||
/obj/item/clothing/head/nonla
|
||||
name = "non la"
|
||||
desc = "A conical hat typically woven from leaves, good for keeping the sun AND rain off your head, in case it happens to be sunny while raining."
|
||||
icon = 'icons/inventory/head/item_vr.dmi'
|
||||
icon_override = 'icons/inventory/head/mob_vr.dmi'
|
||||
icon_state = "nonla"
|
||||
|
||||
//////////TALON HATS//////////
|
||||
|
||||
|
||||
@@ -1,4 +1,11 @@
|
||||
/obj/item/clothing/mask/emotions
|
||||
sprite_sheets = list(
|
||||
SPECIES_TESHARI = 'icons/inventory/face/mob_vr_teshari.dmi'
|
||||
)
|
||||
)
|
||||
|
||||
/obj/item/clothing/mask/lacemask
|
||||
name = "lace mask"
|
||||
desc = "A sheer lace mask that rests above the nose and trails down below the chin."
|
||||
icon = 'icons/inventory/face/item_vr.dmi'
|
||||
icon_state = "lace_mask"
|
||||
icon_override = 'icons/inventory/face/mob_vr.dmi'
|
||||
@@ -144,7 +144,7 @@
|
||||
item_state_slots = list(slot_r_hand_str = "slippers", slot_l_hand_str = "slippers")
|
||||
|
||||
/obj/item/clothing/shoes/laceup
|
||||
name = "black oxford shoes"
|
||||
name = "black oxford shoes"
|
||||
icon_state = "oxford_black"
|
||||
|
||||
/obj/item/clothing/shoes/laceup/grey
|
||||
|
||||
@@ -98,4 +98,11 @@
|
||||
icon = 'icons/inventory/feet/item_vr.dmi'
|
||||
icon_override = 'icons/inventory/feet/mob_vr.dmi'
|
||||
icon_state = "antediluvian"
|
||||
item_state = "antediluvian"
|
||||
item_state = "antediluvian"
|
||||
|
||||
//Alternative flats
|
||||
/obj/item/clothing/shoes/flats/white/color/alt
|
||||
icon = 'icons/inventory/feet/item_vr.dmi'
|
||||
icon_override = 'icons/inventory/feet/mob_vr.dmi'
|
||||
icon_state = "flatsalt"
|
||||
item_state = "flatsalt"
|
||||
@@ -536,7 +536,8 @@
|
||||
offline = 0
|
||||
if(istype(wearer) && !wearer.wearing_rig)
|
||||
wearer.wearing_rig = src
|
||||
slowdown = initial(slowdown)
|
||||
if(!istype(src,/obj/item/weapon/rig/protean)) //CHOMPEdit - Stupid snowflake protean special check for rig assimilation code
|
||||
slowdown = initial(slowdown)
|
||||
|
||||
if(offline)
|
||||
if(offline == 1)
|
||||
@@ -921,9 +922,13 @@
|
||||
return
|
||||
|
||||
//CHOMP Addition - Added this for protean living hardsuit
|
||||
wearer_move_delay = world.time + 2
|
||||
if(ai_moving)
|
||||
if(!ai_can_move_suit(user, check_user_module = 1))
|
||||
return
|
||||
// AIs are a bit slower than regular and ignore move intent.
|
||||
//CHOMPEdit - Moved this to where it's relevant
|
||||
wearer_move_delay = world.time + ai_controlled_move_delay
|
||||
|
||||
//This is sota the goto stop mobs from moving var
|
||||
if(wearer.transforming || !wearer.canmove)
|
||||
@@ -955,9 +960,6 @@
|
||||
to_chat(src, "<span class='notice'>Your host is pinned to a wall by [wearer.pinned[1]]</span>!")
|
||||
return 0
|
||||
|
||||
// AIs are a bit slower than regular and ignore move intent.
|
||||
wearer_move_delay = world.time + ai_controlled_move_delay
|
||||
|
||||
if(istype(wearer.buckled, /obj/vehicle))
|
||||
//manually set move_delay for vehicles so we don't inherit any mob movement penalties
|
||||
//specific vehicle move delays are set in code\modules\vehicles\vehicle.dm
|
||||
|
||||
@@ -32,8 +32,8 @@
|
||||
..()
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/proc/RemoveHood()
|
||||
icon_state = toggleicon
|
||||
hood_up = FALSE
|
||||
update_icon()
|
||||
hood.canremove = TRUE // This shouldn't matter anyways but just incase.
|
||||
if(ishuman(hood.loc))
|
||||
var/mob/living/carbon/H = hood.loc
|
||||
@@ -55,16 +55,20 @@
|
||||
to_chat(H, "<span class='warning'>You're already wearing something on your head!</span>")
|
||||
return
|
||||
else
|
||||
if(color != hood.color)
|
||||
hood.color = color
|
||||
H.equip_to_slot_if_possible(hood,slot_head,0,0,1)
|
||||
hood_up = TRUE
|
||||
hood.canremove = FALSE
|
||||
icon_state = "[toggleicon]_t"
|
||||
update_icon()
|
||||
H.update_inv_wear_suit()
|
||||
if(color != hood.color)
|
||||
hood.color = color
|
||||
else
|
||||
RemoveHood()
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/update_icon()
|
||||
. = ..()
|
||||
icon_state = "[toggleicon][hood_up ? "_t" : ""]"
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/costume
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
|
||||
flags_inv = HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
|
||||
|
||||
@@ -159,3 +159,23 @@
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat
|
||||
sprite_sheets = list( SPECIES_TESHARI = 'icons/inventory/suit/mob_vr_teshari.dmi',
|
||||
SPECIES_VOX = 'icons/inventory/suit/mob_vox.dmi')
|
||||
|
||||
//Hoodies worth their weight in gold (as in you can unbutton them and toggle the hood independently)
|
||||
/obj/item/clothing/suit/storage/hooded/toggle/colorable
|
||||
name = "hoodie"
|
||||
desc = "A rather plain hoodie. If you can't find it in your closet, chances are your significant other is borrowing it."
|
||||
icon = 'icons/inventory/suit/item_vr.dmi'
|
||||
icon_override = 'icons/inventory/suit/mob_vr.dmi'
|
||||
icon_state = "choodie"
|
||||
hoodtype = /obj/item/clothing/head/hood/toggleable/colorable
|
||||
open = FALSE
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/toggle/colorable/sleeveless
|
||||
name = "sleeveless hoodie"
|
||||
desc = "Either your arms were too hot or the sleeves vaporized when you gave someone a 'gunshow' with your muscles. Either way, the sleeves are missing."
|
||||
icon_state = "choodie_sleeveless"
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/toggle/colorable/cropped
|
||||
name = "cropped hoodie"
|
||||
desc = "It's not that this is a size too small, you just like showing off your tum. I guess."
|
||||
icon_state = "choodie_crop"
|
||||
@@ -68,19 +68,27 @@
|
||||
|
||||
if(open == 1) //Will check whether icon state is currently set to the "open" or "closed" state and switch it around with a message to the user
|
||||
open = 0
|
||||
icon_state = initial(icon_state)
|
||||
update_icon()
|
||||
flags_inv = HIDETIE|HIDEHOLSTER
|
||||
to_chat(usr, "You button up the coat.")
|
||||
else if(open == 0)
|
||||
open = 1
|
||||
icon_state = "[icon_state]_open"
|
||||
update_icon()
|
||||
flags_inv = HIDEHOLSTER
|
||||
to_chat(usr, "You unbutton the coat.")
|
||||
else //in case some goofy admin switches icon states around without switching the icon_open or icon_closed
|
||||
to_chat(usr, "You attempt to button-up the velcro on your [src], before promptly realising how silly you are.")
|
||||
return
|
||||
update_clothing_icon() //so our overlays update
|
||||
if(istype(hood,/obj/item/clothing/head/hood/toggleable)) //checks if a hood (which you should use) is attached
|
||||
var/obj/item/clothing/head/hood/toggleable/T = hood
|
||||
T.open = open //copy the jacket's open state to the hood
|
||||
T.update_icon(usr) //usr as an arg to fix a weird runtime
|
||||
T.update_clothing_icon()
|
||||
update_clothing_icon() //so our overlays update
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/toggle/update_icon()
|
||||
. = ..()
|
||||
icon_state = "[toggleicon][open ? "_open" : ""][hood_up ? "_t" : ""]"
|
||||
|
||||
//New Vest 4 pocket storage and badge toggles, until suit accessories are a thing.
|
||||
/obj/item/clothing/suit/storage/vest/heavy/New()
|
||||
|
||||
@@ -572,3 +572,117 @@
|
||||
desc = "A shoulder mantle bearing the colors usually found on a Site Manager, a commanding blue with regal gold inlay."
|
||||
icon_state = "capmantle"
|
||||
item_state = "capmantle"
|
||||
|
||||
//Boat cloaks
|
||||
/obj/item/clothing/accessory/poncho/roles/cloak/boat
|
||||
name = "boat cloak"
|
||||
desc = "A cloak that might've been worn on boats once or twice. It's just a flappy cape otherwise."
|
||||
icon_state = "boatcloak"
|
||||
item_state = "boatcloak"
|
||||
|
||||
/obj/item/clothing/accessory/poncho/roles/cloak/boat/cap
|
||||
name = "site manager boat cloak"
|
||||
icon_state = "capboatcloak"
|
||||
item_state = "capboatcloak"
|
||||
|
||||
/obj/item/clothing/accessory/poncho/roles/cloak/boat/hop
|
||||
name = "head of personnel boat cloak"
|
||||
icon_state = "hopboatcloak"
|
||||
item_state = "hopboatcloak"
|
||||
|
||||
/obj/item/clothing/accessory/poncho/roles/cloak/boat/security
|
||||
name = "security boat cloak"
|
||||
icon_state = "secboatcloak"
|
||||
item_state = "secboatcloak"
|
||||
|
||||
/obj/item/clothing/accessory/poncho/roles/cloak/boat/engineering
|
||||
name = "engineering boat cloak"
|
||||
icon_state = "engboatcloak"
|
||||
item_state = "engboatcloak"
|
||||
|
||||
/obj/item/clothing/accessory/poncho/roles/cloak/boat/atmos
|
||||
name = "atmospherics boat cloak"
|
||||
icon_state = "atmosboatcloak"
|
||||
item_state = "atmosboatcloak"
|
||||
|
||||
/obj/item/clothing/accessory/poncho/roles/cloak/boat/medical
|
||||
name = "medical boat cloak"
|
||||
icon_state = "medboatcloak"
|
||||
item_state = "medboatcloak"
|
||||
|
||||
/obj/item/clothing/accessory/poncho/roles/cloak/boat/service
|
||||
name = "service boat cloak"
|
||||
icon_state = "botboatcloak"
|
||||
item_state = "botboatcloak"
|
||||
|
||||
/obj/item/clothing/accessory/poncho/roles/cloak/boat/cargo
|
||||
name = "cargo boat cloak"
|
||||
icon_state = "supboatcloak"
|
||||
item_state = "supboatcloak"
|
||||
|
||||
/obj/item/clothing/accessory/poncho/roles/cloak/boat/mining
|
||||
name = "mining boat cloak"
|
||||
icon_state = "minboatcloak"
|
||||
item_state = "minboatcloak"
|
||||
|
||||
/obj/item/clothing/accessory/poncho/roles/cloak/boat/science
|
||||
name = "research boat cloak"
|
||||
icon_state = "sciboatcloak"
|
||||
item_state = "sciboatcloak"
|
||||
|
||||
//Shrouds
|
||||
/obj/item/clothing/accessory/poncho/roles/cloak/shroud
|
||||
name = "shroud cape"
|
||||
desc = "A sharp looking cape that covers more of one side than the other. Just a bit edgy."
|
||||
icon_state = "shroud"
|
||||
item_state = "shroud"
|
||||
|
||||
/obj/item/clothing/accessory/poncho/roles/cloak/shroud/cap
|
||||
name = "site manager shroud"
|
||||
icon_state = "capshroud"
|
||||
item_state = "capshroud"
|
||||
|
||||
/obj/item/clothing/accessory/poncho/roles/cloak/shroud/hop
|
||||
name = "head of personnel shroud"
|
||||
icon_state = "hopshroud"
|
||||
item_state = "hopshroud"
|
||||
|
||||
/obj/item/clothing/accessory/poncho/roles/cloak/shroud/security
|
||||
name = "security shroud"
|
||||
icon_state = "secshroud"
|
||||
item_state = "secshroud"
|
||||
|
||||
/obj/item/clothing/accessory/poncho/roles/cloak/shroud/engineering
|
||||
name = "engineering shroud"
|
||||
icon_state = "engshroud"
|
||||
item_state = "engshroud"
|
||||
|
||||
/obj/item/clothing/accessory/poncho/roles/cloak/shroud/atmos
|
||||
name = "atmospherics shroud"
|
||||
icon_state = "atmosshroud"
|
||||
item_state = "atmosshroud"
|
||||
|
||||
/obj/item/clothing/accessory/poncho/roles/cloak/shroud/medical
|
||||
name = "medical shroud"
|
||||
icon_state = "medshroud"
|
||||
item_state = "medshroud"
|
||||
|
||||
/obj/item/clothing/accessory/poncho/roles/cloak/shroud/service
|
||||
name = "service shroud"
|
||||
icon_state = "botshroud"
|
||||
item_state = "botshroud"
|
||||
|
||||
/obj/item/clothing/accessory/poncho/roles/cloak/shroud/cargo
|
||||
name = "cargo shroud"
|
||||
icon_state = "supshroud"
|
||||
item_state = "supshroud"
|
||||
|
||||
/obj/item/clothing/accessory/poncho/roles/cloak/shroud/mining
|
||||
name = "mining shroud"
|
||||
icon_state = "minshroud"
|
||||
item_state = "minshroud"
|
||||
|
||||
/obj/item/clothing/accessory/poncho/roles/cloak/shroud/science
|
||||
name = "research shroud"
|
||||
icon_state = "scishroud"
|
||||
item_state = "scishroud"
|
||||
|
||||
@@ -505,4 +505,85 @@
|
||||
|
||||
/obj/item/clothing/under/dress/antediluvian/sheerless
|
||||
desc = "A regal black and gold tight corset with silky sleeves. This one is just the corset and sleeves, sans lace stockings and gloves."
|
||||
worn_state = "antediluvian_c"
|
||||
worn_state = "antediluvian_c"
|
||||
|
||||
//Colorable skirts
|
||||
/obj/item/clothing/under/skirt/colorable
|
||||
name = "skirt"
|
||||
desc = "A rather plain looking skirt."
|
||||
icon = 'icons/inventory/uniform/item_vr.dmi'
|
||||
default_worn_icon = 'icons/inventory/uniform/mob_vr.dmi'
|
||||
icon_state = "skirt_casual"
|
||||
item_state = "skirt_casual"
|
||||
worn_state = "skirt_casual"
|
||||
|
||||
/obj/item/clothing/under/skirt/colorable/puffy
|
||||
icon_state = "skirt_puffy"
|
||||
item_state = "skirt_puffy"
|
||||
worn_state = "skirt_puffy"
|
||||
|
||||
/obj/item/clothing/under/skirt/colorable/skater
|
||||
desc = "A skirt with loose frills."
|
||||
icon_state = "skirt_skater"
|
||||
item_state = "skirt_skater"
|
||||
worn_state = "skirt_skater"
|
||||
|
||||
/obj/item/clothing/under/skirt/colorable/pleated
|
||||
desc = "A short skirt featuring pleat trailing up from the hem."
|
||||
icon_state = "skirt_pleated"
|
||||
item_state = "skirt_pleated"
|
||||
worn_state = "skirt_pleated"
|
||||
|
||||
/obj/item/clothing/under/skirt/colorable/pencil
|
||||
name = "pencil skirt"
|
||||
desc = "A short skirt that's almost as thin as a pencil. Almost."
|
||||
icon_state = "skirt_pencil"
|
||||
item_state = "skirt_pencil"
|
||||
worn_state = "skirt_pencil"
|
||||
|
||||
/obj/item/clothing/under/skirt/colorable/plaid
|
||||
name = "plaid skirt"
|
||||
desc = "A skirt featuring a plaid pattern."
|
||||
icon_state = "skirt_plaid"
|
||||
item_state = "skirt_plaid"
|
||||
worn_state = "skirt_plaid"
|
||||
|
||||
/obj/item/clothing/under/skirt/colorable/tube
|
||||
desc = "A long thin skirt that trails beyond the knees."
|
||||
icon_state = "skirt_tube"
|
||||
item_state = "skirt_tube"
|
||||
worn_state = "skirt_tube"
|
||||
|
||||
/obj/item/clothing/under/skirt/colorable/long
|
||||
name = "long skirt"
|
||||
icon_state = "skirt_long"
|
||||
item_state = "skirt_long"
|
||||
worn_state = "skirt_long"
|
||||
|
||||
/obj/item/clothing/under/skirt/colorable/high
|
||||
name = "high skirt"
|
||||
desc = "A skirt that rests at the waist instead of the hips."
|
||||
icon_state = "skirt_high"
|
||||
item_state = "skirt_high"
|
||||
worn_state = "skirt_high"
|
||||
|
||||
/obj/item/clothing/under/skirt/colorable/swept
|
||||
name = "swept skirt"
|
||||
desc = "A skirt with an angled hem; shorter on one side, longer on the other, like a sweep."
|
||||
icon_state = "skirt_swept"
|
||||
item_state = "skirt_swept"
|
||||
worn_state = "skirt_swept"
|
||||
|
||||
/obj/item/clothing/under/skirt/colorable/jumper
|
||||
name = "jumper skirt"
|
||||
desc = "A skirt that's held up by suspenders."
|
||||
icon_state = "skirt_jumper"
|
||||
item_state = "skirt_jumper"
|
||||
worn_state = "skirt_jumper"
|
||||
|
||||
/obj/item/clothing/under/skirt/colorable/jumperdress
|
||||
name = "jumper dress"
|
||||
desc = "A dress held up by suspenders. Not quite a skirt anymore."
|
||||
icon_state = "skirt_jumperdress"
|
||||
item_state = "skirt_jumperdress"
|
||||
worn_state = "skirt_jumperdress"
|
||||
@@ -198,6 +198,10 @@
|
||||
emote_sound = pick(smolsound)
|
||||
else
|
||||
emote_sound = pick(bigsound)
|
||||
else if(istype(user, /mob/living/silicon/pai))
|
||||
var/mob/living/silicon/pai/me = user
|
||||
if(me.chassis == "teppi")
|
||||
emote_sound = pick(bigsound)
|
||||
else if(user.size_multiplier >= 1.5)
|
||||
emote_sound = pick(bigsound)
|
||||
else
|
||||
|
||||
@@ -13,7 +13,14 @@
|
||||
var/obj/item/organ/external/L = H.get_organ(limb)
|
||||
if(istype(L) && L.is_usable() && !L.splinted)
|
||||
return TRUE
|
||||
return FALSE
|
||||
else if(isanimal(user)) //VOREStation Addition Start
|
||||
var/mob/living/simple_mob/S = user
|
||||
if(S.has_hands)
|
||||
return TRUE
|
||||
else if(ispAI(user))
|
||||
return TRUE
|
||||
else //VOREStation Addition End
|
||||
return FALSE
|
||||
|
||||
/decl/emote/audible/snap/do_emote(var/atom/user, var/extra_params)
|
||||
if(!can_snap(user))
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
|
||||
/datum/event/carp_migration/setup()
|
||||
if(prob(50))
|
||||
log_debug("Carp migration failed successfully.")
|
||||
kill()
|
||||
return
|
||||
announceWhen = rand(30, 60) // 1 to 2 minutes
|
||||
|
||||
@@ -46,6 +46,7 @@
|
||||
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Shipping Error", /datum/event/shipping_error , 30, list(ASSIGNMENT_ANY = 2), 0),
|
||||
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Trivial News", /datum/event/trivial_news, 400),
|
||||
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Lore News", /datum/event/lore_news, 400),
|
||||
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Supply Demand", /datum/event/supply_demand, 0, list(ASSIGNMENT_ANY = 5, ASSIGNMENT_SCIENCE = 15, ASSIGNMENT_GARDENER = 10, ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_MEDICAL = 15), 1, min_jobs = list(ASSIGNMENT_CARGO = 1)),
|
||||
// Spawns mice, lizards, or dud spiderlings
|
||||
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Vermin Infestation",/datum/event/infestation, 100, list(ASSIGNMENT_ANY = 5, ASSIGNMENT_JANITOR = 100), 1),
|
||||
// Rot only weakens walls, not destroy them
|
||||
@@ -94,6 +95,7 @@
|
||||
// Radiation, but only in space.
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Solar Storm", /datum/event/solar_storm, 20, list(ASSIGNMENT_ENGINEER = 40, ASSIGNMENT_SECURITY = 20), 1),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spider Infestation", /datum/event/spider_infestation, -20, list(ASSIGNMENT_SECURITY = 30, ASSIGNMENT_HOS = 20, ASSIGNMENT_WARDEN = 20), 0, min_jobs = list(ASSIGNMENT_SECURITY = 1)),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Supply Demand", /datum/event/supply_demand, 0, list(ASSIGNMENT_ANY = 5, ASSIGNMENT_SCIENCE = 15, ASSIGNMENT_GARDENER = 10, ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_MEDICAL = 15), 1),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Virology Breach", /datum/event/prison_break/virology, 0, list(ASSIGNMENT_MEDICAL = 100), 1, min_jobs = list(ASSIGNMENT_MEDICAL = 1)),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Xenobiology Breach", /datum/event/prison_break/xenobiology, 0, list(ASSIGNMENT_SCIENCE = 100), 1, min_jobs = list(ASSIGNMENT_SCIENTIST = 1), min_jobs = list(ASSIGNMENT_SCIENTIST = 1, ASSIGNMENT_SECURITY =1)),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Jellyfish School", /datum/event/jellyfish_migration, 5, list(ASSIGNMENT_ANY = 1, ASSIGNMENT_SECURITY = 5, ASSIGNMENT_MEDICAL = 3), 1),
|
||||
@@ -116,12 +118,14 @@
|
||||
available_events = list(
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Nothing", /datum/event/nothing, 900),
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Atmos Leak", /datum/event/atmos_leak, 5, list(ASSIGNMENT_ENGINEER = 35), 1),
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Blob", /datum/event/blob, -100, list(ASSIGNMENT_SECURITY = 40, ASSIGNMENT_HOS = 10, ASSIGNMENT_WARDEN = 10, ASSIGNMENT_ENGINEER = 5), 1, min_jobs = list(ASSIGNMENT_SECURITY = 3)),
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Blob", /datum/event/blob, -100, list(ASSIGNMENT_SECURITY = 40, ASSIGNMENT_HOS = 10, ASSIGNMENT_WARDEN = 10, ASSIGNMENT_ENGINEER = 5), 1, min_jobs = list(ASSIGNMENT_SECURITY = 1)),
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Carp Migration", /datum/event/carp_migration, -110, list(ASSIGNMENT_SECURITY = 50, ASSIGNMENT_HOS = 10, ASSIGNMENT_WARDEN = 10), 1, min_jobs = list(ASSIGNMENT_SECURITY = 3)),
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Jellyfish Migration", /datum/event/jellyfish_migration, 5, list(ASSIGNMENT_ANY = 1, ASSIGNMENT_SECURITY = 5, ASSIGNMENT_MEDICAL = 3), 1),
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave", /datum/event/meteor_wave, -110, list(ASSIGNMENT_ENGINEER = 50), 1, min_jobs = list(ASSIGNMENT_ENGINEER = 3)),
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Metroid Infestation", /datum/event/metroid_infestation, -105, list(ASSIGNMENT_SECURITY = 30, ASSIGNMENT_SCIENCE = 20, ASSIGNMENT_HOS = 15, ASSIGNMENT_WARDEN = 15), 1 , min_jobs = list(ASSIGNMENT_SECURITY = 3, ASSIGNMENT_SCIENCE = 1)),
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave", /datum/event/meteor_wave, -90, list(ASSIGNMENT_ENGINEER = 50, ASSIGNMENT_MEDICAL = 10, ASSIGNMENT_ANY = 1), 1, min_jobs = list(ASSIGNMENT_ENGINEER = 1)),
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Metroid Infestation", /datum/event/metroid_infestation, -100, list(ASSIGNMENT_SECURITY = 30, ASSIGNMENT_SCIENCE = 20, ASSIGNMENT_HOS = 15, ASSIGNMENT_WARDEN = 15, ASSIGNMENT_ANY = 2), 1 , min_jobs = list(ASSIGNMENT_SECURITY = 2, ASSIGNMENT_SCIENCE = 1)),
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Space Vines", /datum/event/spacevine, 20, list(ASSIGNMENT_ENGINEER = 15), 1),
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Spider Infestation", /datum/event/spider_infestation, -60, list(ASSIGNMENT_SECURITY = 20, ASSIGNMENT_HOS = 10, ASSIGNMENT_WARDEN = 10, ASSIGNMENT_ANY = 3), 0),
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Supply Demand", /datum/event/supply_demand, 0, list(ASSIGNMENT_ANY = 5, ASSIGNMENT_SCIENCE = 15, ASSIGNMENT_GARDENER = 10, ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_MEDICAL = 15), 1, min_jobs = list(ASSIGNMENT_CARGO = 1)),
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Viral Infection", /datum/event/viral_infection, -50, list(ASSIGNMENT_MEDICAL = 25), 1, min_jobs = list(ASSIGNMENT_MEDICAL = 2)),
|
||||
)
|
||||
add_disabled_events(list(
|
||||
@@ -129,7 +133,6 @@
|
||||
//Needs Xenobio containment breach fixed
|
||||
//new /datum/event_meta(EVENT_LEVEL_MAJOR, "Xenobiology Breach", /datum/event/prison_break/xenobiology, -10, list(ASSIGNMENT_SCIENCE = 30, ASSIGNMENT_ENGINEER = 20), 1),
|
||||
//new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Strike", /datum/event/meteor_strike, 10, list(ASSIGNMENT_ENGINEER = 15), 1),
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Supply Demand", /datum/event/supply_demand, 0, list(ASSIGNMENT_ANY = 5, ASSIGNMENT_SCIENCE = 15, ASSIGNMENT_GARDENER = 10, ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_MEDICAL = 15), 1, min_jobs = list(ASSIGNMENT_CARGO = 1)),
|
||||
))
|
||||
|
||||
#undef ASSIGNMENT_ANY
|
||||
|
||||
@@ -4,11 +4,18 @@
|
||||
var/spawncount = 1
|
||||
var/list/vents = list()
|
||||
var/give_positions = 0
|
||||
var/active_metroid_event = TRUE
|
||||
|
||||
/datum/event/metroid_infestation/setup()
|
||||
if(prob(50)) //50% chance of the event to even occur if procced
|
||||
active_metroid_event = FALSE
|
||||
log_debug("Metroid infestation failed successfully.")
|
||||
kill()
|
||||
return
|
||||
active_metroid_event = TRUE
|
||||
announceWhen = rand(announceWhen, announceWhen + 60)
|
||||
|
||||
spawncount = rand(1 * severity, 2 * severity)
|
||||
spawncount = rand(2 * severity, 4 * severity)
|
||||
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in machines)
|
||||
//CHOMPEdit: Added a couple areas to the exclusion. Also made this actually work.
|
||||
@@ -25,7 +32,15 @@
|
||||
/datum/event/metroid_infestation/start()
|
||||
while((spawncount >= 1) && vents.len)
|
||||
var/obj/vent = pick(vents)
|
||||
new /mob/living/simple_mob/metroid/juvenile/baby(get_turf(vent))
|
||||
var/spawn_metroids = pickweight(list(
|
||||
/mob/living/simple_mob/metroid/juvenile/baby = 60,
|
||||
/mob/living/simple_mob/metroid/juvenile/super = 30,
|
||||
/mob/living/simple_mob/metroid/juvenile/alpha = 10,
|
||||
/mob/living/simple_mob/metroid/juvenile/gamma = 3,
|
||||
/mob/living/simple_mob/metroid/juvenile/zeta = 2,
|
||||
/mob/living/simple_mob/metroid/juvenile/omega = 1,
|
||||
))
|
||||
new spawn_metroids(get_turf(vent))
|
||||
vents -= vent
|
||||
spawncount--
|
||||
vents.Cut()
|
||||
@@ -42,6 +57,6 @@
|
||||
qdel(M) //Must have been nullspaced
|
||||
continue
|
||||
area_names |= metroid_area.name
|
||||
if(area_names.len)
|
||||
if(area_names.len && active_metroid_event == TRUE)
|
||||
var/english_list = english_list(area_names)
|
||||
command_announcement.Announce("Sensors have narrowed down remaining lifeforms to the followng areas: [english_list]", "Lifesign Alert")
|
||||
|
||||
@@ -6,8 +6,12 @@
|
||||
|
||||
|
||||
/datum/event/spider_infestation/setup()
|
||||
if(prob(25) && severity == 3) //CHOMP Add 25% chance for the event to fail if chosen and is major severity
|
||||
log_debug("Major spider infestation failed successfully.")
|
||||
kill()
|
||||
return
|
||||
announceWhen = rand(announceWhen, announceWhen + 60)
|
||||
spawncount = rand(6 * severity, 12 * severity) //spiderlings only have a 50% chance to grow big and strong //CHOMP Edit: Tripled amount spawned
|
||||
spawncount = rand(6 * severity, 14 * severity) //spiderlings only have a 50% chance to grow big and strong //CHOMP Edit: old: 2/4 new: 6/14
|
||||
sent_spiders_to_station = 0
|
||||
|
||||
/datum/event/spider_infestation/announce()
|
||||
@@ -29,6 +33,6 @@
|
||||
|
||||
while((spawncount >= 1) && vents.len)
|
||||
var/obj/vent = pick(vents)
|
||||
new /obj/effect/spider/spiderling/virgo(vent.loc) //VOREStation Edit - No nurses
|
||||
new /obj/effect/spider/spiderling(vent.loc) //VOREStation Edit - No nurses //Oh my JESUS CHRIST, this slipped past me. Literally no nurses. Well guess what, nurses are back.
|
||||
vents -= vent
|
||||
spawncount--
|
||||
|
||||
@@ -55,7 +55,7 @@ var/global/ingredientLimit = 20000
|
||||
|
||||
if(src.addTop)
|
||||
cut_overlay(topping)
|
||||
if(!fullyCustom && !stackIngredients && our_overlays.len)
|
||||
if(!fullyCustom && !stackIngredients && LAZYLEN(our_overlays))
|
||||
cut_overlay(filling) //we can't directly modify the overlay, so we have to remove it and then add it again
|
||||
var/newcolor = S.filling_color != "#FFFFFF" ? S.filling_color : AverageColor(getFlatIcon(S, S.dir, 0), 1, 1)
|
||||
filling.color = BlendRGB(filling.color, newcolor, 1/ingredients.len)
|
||||
|
||||
@@ -102,7 +102,7 @@
|
||||
for(var/turf/T as anything in all_turfs)
|
||||
if(T.is_outdoors())
|
||||
turfs_to_use += T
|
||||
|
||||
|
||||
if(!turfs_to_use.len)
|
||||
warning("Fake sun placed on a level where it can't find any outdoor turfs to color at [x],[y],[z].")
|
||||
return
|
||||
@@ -131,23 +131,14 @@
|
||||
"color" = "#F4EA55"
|
||||
),
|
||||
list(
|
||||
"brightness" = 1.0,
|
||||
"brightness" = 4.0,
|
||||
"color" = "#F07AD8"
|
||||
),
|
||||
list(
|
||||
"brightness" = 1.0,
|
||||
"color" = "#b4361f"
|
||||
),
|
||||
|
||||
list(
|
||||
"brightness" = 0.7,
|
||||
"brightness" = 4.0,
|
||||
"color" = "#f3932d"
|
||||
),
|
||||
|
||||
list(
|
||||
"brightness" = 0.1,
|
||||
"color" = "#B92B00"
|
||||
)
|
||||
|
||||
)
|
||||
|
||||
/obj/effect/fake_sun/cool
|
||||
|
||||
@@ -65,7 +65,18 @@ var/list/name_to_material
|
||||
. = list()
|
||||
for(var/mat in matter)
|
||||
var/datum/material/M = GET_MATERIAL_REF(mat)
|
||||
.[M] = matter[mat]
|
||||
if(M.composite_material && M.composite_material.len)
|
||||
for(var/submat in M.composite_material)
|
||||
var/datum/material/SM = GET_MATERIAL_REF(submat)
|
||||
if(SM in .)
|
||||
.[SM] += matter[mat]*(M.composite_material[submat]/SHEET_MATERIAL_AMOUNT)
|
||||
else
|
||||
.[SM] = matter[mat]*(M.composite_material[submat]/SHEET_MATERIAL_AMOUNT)
|
||||
else
|
||||
if(M in .)
|
||||
.[M] += matter[mat]
|
||||
else
|
||||
.[M] = matter[mat]
|
||||
|
||||
// Builds the datum list above.
|
||||
/proc/populate_material_list(force_remake=0)
|
||||
|
||||
@@ -253,6 +253,12 @@
|
||||
ore_chunk.stored_ore[ore] = 0
|
||||
qdel(ore_chunk)
|
||||
|
||||
for(var/obj/item/weapon/ore/O in input.loc)
|
||||
if(!isnull(ores_stored[O.material]))
|
||||
ores_stored[O.material]++
|
||||
points += (ore_values[O.material]*points_mult)
|
||||
qdel(O)
|
||||
|
||||
if(!active)
|
||||
return
|
||||
|
||||
|
||||
@@ -86,6 +86,7 @@ var/list/holder_mob_icon_cache = list()
|
||||
/obj/item/weapon/holder/Exited(atom/movable/thing, atom/OldLoc)
|
||||
if(thing == held_mob)
|
||||
held_mob.transform = original_transform
|
||||
held_mob.update_transform() //VOREStation edit
|
||||
held_mob.vis_flags = original_vis_flags
|
||||
held_mob = null
|
||||
..()
|
||||
@@ -106,11 +107,14 @@ var/list/holder_mob_icon_cache = list()
|
||||
/obj/item/weapon/holder/proc/dump_mob()
|
||||
if(!held_mob)
|
||||
return
|
||||
held_mob.transform = original_transform
|
||||
held_mob.vis_flags = original_vis_flags
|
||||
held_mob.forceMove(get_turf(src))
|
||||
held_mob.reset_view(null)
|
||||
held_mob = null
|
||||
if (held_mob.loc == src || isnull(held_mob.loc)) //VOREStation edit
|
||||
held_mob.transform = original_transform
|
||||
held_mob.update_transform() //VOREStation edit
|
||||
held_mob.vis_flags = original_vis_flags
|
||||
held_mob.forceMove(get_turf(src))
|
||||
held_mob.reset_view(null)
|
||||
held_mob = null
|
||||
invisibility = INVISIBILITY_ABSTRACT //VOREStation edit
|
||||
|
||||
/obj/item/weapon/holder/throw_at(atom/target, range, speed, thrower)
|
||||
if(held_mob)
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
/mob/living/carbon/brain/runechat_holder(datum/chatmessage/CM)
|
||||
if(isturf(loc))
|
||||
return ..()
|
||||
|
||||
|
||||
return loc
|
||||
|
||||
/mob/living/carbon/brain/set_typing_indicator(var/state)
|
||||
@@ -59,8 +59,11 @@
|
||||
loc.cut_overlay(typing_indicator, TRUE)
|
||||
return
|
||||
|
||||
if(!typing_indicator)
|
||||
init_typing_indicator("[speech_bubble_appearance()]_typing")
|
||||
var/cur_bubble_appearance = custom_speech_bubble
|
||||
if(!cur_bubble_appearance || cur_bubble_appearance == "default")
|
||||
cur_bubble_appearance = speech_bubble_appearance()
|
||||
if(!typing_indicator || cur_typing_indicator != cur_bubble_appearance)
|
||||
init_typing_indicator("[cur_bubble_appearance]_typing")
|
||||
|
||||
if(state && !typing)
|
||||
loc.add_overlay(typing_indicator, TRUE)
|
||||
@@ -80,7 +83,7 @@
|
||||
var/datum/transcore_db/db = SStranscore.db_by_mind_name(mind.name)
|
||||
if(db)
|
||||
var/datum/transhuman/mind_record/record = db.backed_up[src.mind.name]
|
||||
if(!(record.dead_state == MR_DEAD))
|
||||
if(!(record.dead_state == MR_DEAD))
|
||||
if((world.time - timeofhostdeath ) > 5 MINUTES) //Allows notify transcore to be used if you have an entry but for some reason weren't marked as dead
|
||||
record.dead_state = MR_DEAD //Such as if you got scanned but didn't take an implant. It's a little funky, but I mean, you got scanned
|
||||
db.notify(record) //So you probably will want to let someone know if you die.
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
var/total_burn = 0
|
||||
var/total_brute = 0
|
||||
for(var/obj/item/organ/external/O in organs) //hardcoded to streamline things a bit
|
||||
if((O.robotic >= ORGAN_ROBOT) && !O.vital)
|
||||
if((O.robotic >= ORGAN_ROBOT) && !O.vital && !(O.robotic ==ORGAN_NANOFORM)) //CHOMPEdit - Protean changes
|
||||
continue //*non-vital* robot limbs don't count towards shock and crit
|
||||
total_brute += O.brute_dam
|
||||
total_burn += O.burn_dam
|
||||
@@ -68,7 +68,7 @@
|
||||
/mob/living/carbon/human/getBruteLoss()
|
||||
var/amount = 0
|
||||
for(var/obj/item/organ/external/O in organs)
|
||||
if(O.robotic >= ORGAN_ROBOT && !O.vital)
|
||||
if(O.robotic >= ORGAN_ROBOT && !O.vital && !(O.robotic ==ORGAN_NANOFORM)) //CHOMPEdit - Protean changes
|
||||
continue //*non-vital*robot limbs don't count towards death, or show up when scanned
|
||||
amount += O.brute_dam
|
||||
return amount
|
||||
@@ -90,7 +90,7 @@
|
||||
/mob/living/carbon/human/getFireLoss()
|
||||
var/amount = 0
|
||||
for(var/obj/item/organ/external/O in organs)
|
||||
if(O.robotic >= ORGAN_ROBOT && !O.vital)
|
||||
if(O.robotic >= ORGAN_ROBOT && !O.vital && !(O.robotic ==ORGAN_NANOFORM)) //CHOMPEdit - Protean changes
|
||||
continue //*non-vital*robot limbs don't count towards death, or show up when scanned
|
||||
amount += O.burn_dam
|
||||
return amount
|
||||
@@ -318,7 +318,7 @@
|
||||
halloss = 0
|
||||
else
|
||||
..()
|
||||
|
||||
|
||||
/mob/living/carbon/human/Stun(var/amount)
|
||||
if(amount > 0) //only multiply it by the mod if it's positive, or else it takes longer to fade too!
|
||||
amount = amount*species.stun_mod
|
||||
@@ -326,12 +326,12 @@
|
||||
|
||||
/mob/living/carbon/human/SetStunned(var/amount)
|
||||
..()
|
||||
|
||||
|
||||
/mob/living/carbon/human/AdjustStunned(var/amount)
|
||||
if(amount > 0) // Only multiply it if positive.
|
||||
amount = amount*species.stun_mod
|
||||
..(amount)
|
||||
|
||||
|
||||
/mob/living/carbon/human/Weaken(var/amount)
|
||||
if(amount > 0) //only multiply it by the mod if it's positive, or else it takes longer to fade too!
|
||||
amount = amount*species.weaken_mod
|
||||
@@ -339,7 +339,7 @@
|
||||
|
||||
/mob/living/carbon/human/SetWeakened(var/amount)
|
||||
..()
|
||||
|
||||
|
||||
/mob/living/carbon/human/AdjustWeakened(var/amount)
|
||||
if(amount > 0) // Only multiply it if positive.
|
||||
amount = amount*species.weaken_mod
|
||||
|
||||
@@ -129,7 +129,7 @@
|
||||
message_data[2] = pick(M.say_verbs)
|
||||
. = 1
|
||||
|
||||
if(CE_SPEEDBOOST in chem_effects || is_jittery) // motor mouth
|
||||
else if(CE_SPEEDBOOST in chem_effects || is_jittery) // motor mouth
|
||||
// Despite trying to url/html decode these, byond is just being bad and I dunno.
|
||||
var/static/regex/speedboost_initial = new (@"&[a-z]{2,5};|&#\d{2};","g")
|
||||
// Not herestring because bad vs code syntax highlight panics at apostrophe
|
||||
@@ -137,6 +137,7 @@
|
||||
for(var/datum/multilingual_say_piece/S in message_data[1])
|
||||
S.message = speedboost_initial.Replace(S.message, "")
|
||||
S.message = speedboost_main.Replace(S.message, "")
|
||||
. = 1
|
||||
else
|
||||
. = ..(message_data)
|
||||
|
||||
|
||||
@@ -50,7 +50,8 @@
|
||||
siemens_coefficient = 0.2
|
||||
|
||||
flags = NO_SCAN | NO_DEFIB
|
||||
appearance_flags = HAS_EYE_COLOR | HAS_HAIR_COLOR | HAS_SKIN_COLOR //CHOMP Edit
|
||||
spawn_flags = SPECIES_IS_WHITELISTED
|
||||
appearance_flags = HAS_EYE_COLOR | HAS_HAIR_COLOR | HAS_SKIN_COLOR
|
||||
|
||||
blood_color = "#9066BD"
|
||||
flesh_color = "#808D11"
|
||||
|
||||
@@ -16,7 +16,7 @@ var/list/wrapped_species_by_ref = list()
|
||||
//var/default_form = SPECIES_HUMAN //VOREStation edit
|
||||
|
||||
/datum/species/shapeshifter/get_valid_shapeshifter_forms(var/mob/living/carbon/human/H)
|
||||
return valid_transform_species
|
||||
return list(vanity_base_fit)|valid_transform_species //CHOMPEdit
|
||||
|
||||
/datum/species/shapeshifter/get_icobase(var/mob/living/carbon/human/H, var/get_deform)
|
||||
if(!H) return ..(null, get_deform)
|
||||
|
||||
@@ -190,4 +190,4 @@
|
||||
wrapped_species_by_ref["\ref[src]"] = new_species
|
||||
if (visible)
|
||||
visible_message("<b>\The [src]</b> shifts and contorts, taking the form of \a [new_species]!")
|
||||
regenerate_icons()
|
||||
regenerate_icons()
|
||||
@@ -34,6 +34,7 @@
|
||||
/mob/living/carbon/human/proc/prommie_blobform,
|
||||
/mob/living/proc/set_size,
|
||||
/mob/living/carbon/human/proc/promethean_select_opaqueness,
|
||||
/mob/living/carbon/human/proc/shapeshifter_reassemble //CHOMPEdit: reform verb
|
||||
)
|
||||
|
||||
/mob/living/carbon/human/proc/prommie_blobform()
|
||||
|
||||
@@ -404,6 +404,7 @@
|
||||
blob.ooc_notes = ooc_notes
|
||||
blob.transforming = FALSE
|
||||
blob.name = name
|
||||
blob.real_name = real_name //CHOMPEdit
|
||||
blob.nutrition = nutrition
|
||||
blob.color = rgb(r_skin, g_skin, b_skin)
|
||||
playsound(src.loc, "sound/effects/slime_squish.ogg", 15)
|
||||
@@ -514,9 +515,9 @@
|
||||
B.owner = src
|
||||
|
||||
//vore_organs.Cut()
|
||||
|
||||
|
||||
//ChompEdit begin. And let's drop them again.
|
||||
// if(blob.prev_left_hand) put_in_l_hand(blob.prev_left_hand)
|
||||
// if(blob.prev_left_hand) put_in_l_hand(blob.prev_left_hand)
|
||||
// if(blob.prev_right_hand) put_in_r_hand(blob.prev_right_hand)
|
||||
|
||||
if(blob.l_hand) blob.drop_from_inventory(blob.l_hand)
|
||||
|
||||
@@ -27,8 +27,9 @@
|
||||
/mob/living/carbon/human/proc/reconstitute_form,
|
||||
/mob/living/carbon/human/proc/sonar_ping,
|
||||
/mob/living/carbon/human/proc/tie_hair,
|
||||
/mob/living/carbon/human/proc/lick_wounds) //Xenochimera get all the special verbs since they can't select traits.
|
||||
// CHOMPEdit: Lick Wounds Verb
|
||||
/mob/living/carbon/human/proc/lick_wounds,
|
||||
/mob/living/carbon/human/proc/shapeshifter_reassemble) //Xenochimera get all the special verbs since they can't select traits.
|
||||
// CHOMPEdit: Lick Wounds Verb, reform verb
|
||||
|
||||
virus_immune = 1 // They practically ARE one.
|
||||
min_age = 18
|
||||
@@ -445,7 +446,7 @@
|
||||
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/vulpkanin)
|
||||
|
||||
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE//Whitelisted as restricted is broken. ChompEdit;renable
|
||||
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE//Whitelisted as restricted is broken. ChompEdit;renable
|
||||
appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_COLOR | HAS_EYE_COLOR
|
||||
|
||||
flesh_color = "#AFA59E"
|
||||
|
||||
@@ -413,7 +413,11 @@
|
||||
min_age = 18
|
||||
inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) //Get ya quills done did
|
||||
icobase = 'icons/mob/human_races/r_vox_old.dmi'
|
||||
tail = "voxtail"
|
||||
tail_animation = 'icons/mob/species/vox/tail.dmi'
|
||||
deform = 'icons/mob/human_races/r_def_vox_old.dmi'
|
||||
color_mult = 1
|
||||
|
||||
descriptors = list(
|
||||
/datum/mob_descriptor/vox_markings = 0
|
||||
)
|
||||
|
||||
@@ -391,20 +391,23 @@
|
||||
/datum/trait/negative/reduced_biocompat_minor
|
||||
name = "Reduced Biocompatibility, Minor"
|
||||
desc = "For whatever reason, you're one of the unlucky few who don't get as much benefit from modern-day chemicals. Remember to note this down in your medical records! Chems are only 80% as effective on you!"
|
||||
cost = -1
|
||||
cost = -2
|
||||
var_changes = list("chem_strength_heal" = 0.8)
|
||||
can_take = ORGANICS
|
||||
|
||||
/datum/trait/negative/reduced_biocompat
|
||||
name = "Reduced Biocompatibility"
|
||||
desc = "For whatever reason, you're one of the unlucky few who don't get as much benefit from modern-day chemicals. Remember to note this down in your medical records! Chems are only 60% as effective on you!"
|
||||
cost = -4
|
||||
var_changes = list("chem_strength_heal" = 0.6)
|
||||
can_take = ORGANICS
|
||||
|
||||
/datum/trait/negative/reduced_biocompat_extreme
|
||||
name = "Reduced Biocompatibility, Major"
|
||||
desc = "For whatever reason, you're one of the unlucky few who don't get as much benefit from modern-day chemicals. Remember to note this down in your medical records! Chems are only 30% as effective on you!"
|
||||
cost = -8
|
||||
var_changes = list("chem_strength_heal" = 0.3)
|
||||
can_take = ORGANICS
|
||||
|
||||
// Rykkanote: Relocated these here as we're no longer a YW downstream.
|
||||
/datum/trait/negative/light_sensitivity
|
||||
|
||||
@@ -79,3 +79,13 @@
|
||||
),
|
||||
autohiss_exempt = list("Vespinae"))
|
||||
excludes = list(/datum/trait/neutral/autohiss_tajaran, /datum/trait/neutral/autohiss_unathi)
|
||||
|
||||
/datum/trait/neutral/gargoyle
|
||||
name = "Gargoyle"
|
||||
desc = "You turn into a statue at will, but also whenever you run out of energy. Being a statue replenishes your energy slowly."
|
||||
cost = 0
|
||||
custom_only = TRUE //slimes, xenochimera, diona, proteans, etc, basically anything but custom doesn't make sense (as much as I wanna play a petrifying slime)
|
||||
|
||||
/datum/trait/neutral/gargoyle/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.LoadComponent(/datum/component/gargoyle)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user