Merge branch 'CHOMPStation2:master' into Weapons/Armour

This commit is contained in:
Cyrelius
2023-03-01 08:53:21 -08:00
committed by GitHub
319 changed files with 71014 additions and 10536 deletions

View File

@@ -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
View 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

View File

@@ -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.

View File

@@ -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.

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View 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

View File

@@ -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)"

View File

@@ -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

View File

@@ -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

View File

@@ -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

View 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."))

View 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)

View File

@@ -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
*/
*/

View File

@@ -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

View File

@@ -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)]")

View File

@@ -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)
//////////////////////////////

View File

@@ -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(

View File

@@ -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

View File

@@ -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

View File

@@ -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")]"

View File

@@ -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)
. = ..()

View File

@@ -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

View 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!"

View File

@@ -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())

View File

@@ -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
)

View File

@@ -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"

View File

@@ -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,

View File

@@ -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

View File

@@ -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>")

View File

@@ -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

View File

@@ -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()

View File

@@ -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

View File

@@ -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

View File

@@ -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

View 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>")

View File

@@ -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

View File

@@ -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)

View File

@@ -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()

View File

@@ -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>")

View File

@@ -1,2 +0,0 @@
/turf
var/list/temp_check = list()

View File

@@ -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

View File

@@ -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(

View File

@@ -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>"

View File

@@ -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)

View File

@@ -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 ..()
*/

View File

@@ -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)

View File

@@ -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 *

View File

@@ -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))

View File

@@ -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
*/

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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 ..();

View File

@@ -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]")

View File

@@ -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

View 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!

View File

@@ -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"].")

View File

@@ -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

View File

@@ -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)

View File

@@ -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(

View File

@@ -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" : ""]"

View File

@@ -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//////////

View File

@@ -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'

View File

@@ -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

View File

@@ -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"

View File

@@ -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

View File

@@ -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

View File

@@ -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"

View File

@@ -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()

View File

@@ -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"

View File

@@ -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"

View File

@@ -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

View File

@@ -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))

View File

@@ -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

View File

@@ -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

View File

@@ -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")

View File

@@ -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--

View File

@@ -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)

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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)

View File

@@ -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.

View File

@@ -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

View File

@@ -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)

View File

@@ -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"

View File

@@ -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)

View File

@@ -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()

View File

@@ -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()

View File

@@ -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)

View File

@@ -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"

View File

@@ -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
)

View File

@@ -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

View File

@@ -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