Merge remote-tracking branch 'upstream/master'

This commit is contained in:
DeltaFire
2020-08-29 17:51:29 +02:00
99 changed files with 2315 additions and 1588 deletions
File diff suppressed because it is too large Load Diff
+11 -26
View File
@@ -7014,9 +7014,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall,
/area/crew_quarters/fitness/recreation)
"amG" = (
/turf/closed/wall,
/area/space)
"amH" = (
/obj/machinery/door/airlock/external{
req_one_access_txt = "13,8"
@@ -46794,7 +46791,7 @@
dir = 8
},
/turf/open/floor/plating,
/area/space/nearstation)
/area/maintenance/starboard/fore)
"bOZ" = (
/obj/machinery/chem_master/condimaster{
name = "CondiMaster Neo";
@@ -70554,7 +70551,7 @@
dir = 8
},
/turf/open/floor/plating,
/area/space/nearstation)
/area/maintenance/starboard/aft)
"cJg" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/item/bedsheet/medical,
@@ -81152,10 +81149,6 @@
/obj/machinery/vr_sleeper,
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/recreation)
"evy" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/space)
"eEe" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 8
@@ -81385,10 +81378,6 @@
},
/turf/open/floor/plating,
/area/maintenance/port/aft)
"hKW" = (
/obj/structure/lattice,
/turf/open/space/basic,
/area/maintenance/aft)
"ioI" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -82834,10 +82823,6 @@
},
/turf/open/floor/plating,
/area/security/prison)
"wkz" = (
/obj/structure/lattice/catwalk,
/turf/open/space,
/area/space)
"wlH" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -113085,7 +113070,7 @@ cCq
cgN
cMl
bTs
hKW
lMJ
aaf
aaf
aaf
@@ -113342,7 +113327,7 @@ cCq
cLA
bTs
bTs
hKW
lMJ
aaf
aaa
aaa
@@ -119762,9 +119747,9 @@ cEA
aaf
aaa
aaa
blx
dvY
cJf
blx
dvY
aaa
dbN
gsT
@@ -120019,9 +120004,9 @@ blx
aaa
aaa
aaa
wkz
ack
uim
wkz
ack
aaa
aaf
dbR
@@ -121287,7 +121272,7 @@ ciL
cgs
csc
dvY
evy
dxk
krD
lsv
txj
@@ -129695,8 +129680,8 @@ aaa
aaa
aaf
aaa
amG
blx
dnh
dnh
bOY
dqT
aaf
+64 -68
View File
@@ -2822,7 +2822,7 @@
req_access_txt = "65"
},
/turf/open/floor/plating,
/area/space/nearstation)
/area/ai_monitored/turret_protected/aisat_interior)
"ahi" = (
/obj/structure/lattice/catwalk,
/turf/open/space,
@@ -2923,8 +2923,15 @@
/turf/open/floor/plasteel/showroomfloor,
/area/security/main)
"ahr" = (
/turf/closed/wall/r_wall,
/area/space)
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 8
},
/obj/machinery/door/airlock/external{
name = "Security External Airlock";
req_access_txt = "63"
},
/turf/open/floor/plating,
/area/maintenance/fore)
"ahs" = (
/obj/structure/lattice/catwalk,
/obj/structure/transit_tube,
@@ -4686,7 +4693,7 @@
pixel_y = 20
},
/turf/open/space,
/area/space)
/area/space/nearstation)
"alc" = (
/obj/structure/table,
/obj/item/storage/fancy/cigarettes/cigars,
@@ -6629,13 +6636,6 @@
/turf/open/floor/plating,
/area/maintenance/fore)
"apn" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 8
},
/obj/machinery/door/airlock/external{
name = "Security External Airlock";
req_access_txt = "63"
},
/turf/open/floor/plating,
/area/maintenance/fore)
"apo" = (
@@ -8698,9 +8698,18 @@
/turf/closed/wall,
/area/bridge)
"atZ" = (
/obj/structure/lattice/catwalk,
/turf/open/space,
/area/space)
/obj/structure/cable{
icon_state = "4-8"
},
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 8
},
/obj/machinery/door/airlock/external{
name = "Solar Maintenance";
req_access_txt = "10; 13"
},
/turf/open/floor/plating,
/area/maintenance/solars/starboard)
"aua" = (
/obj/structure/closet/secure_closet/freezer/money,
/obj/item/reagent_containers/food/drinks/bottle/vodka/badminka,
@@ -23763,18 +23772,12 @@
/turf/open/floor/plating,
/area/bridge)
"bcO" = (
/obj/structure/cable{
icon_state = "4-8"
/obj/structure/lattice/catwalk,
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
dir = 9
},
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 8
},
/obj/machinery/door/airlock/external{
name = "Solar Maintenance";
req_access_txt = "10; 13"
},
/turf/open/floor/plating,
/area/maintenance/solars/starboard)
/turf/open/space,
/area/space/nearstation)
"bcQ" = (
/obj/structure/lattice/catwalk,
/obj/structure/cable{
@@ -39888,12 +39891,6 @@
/area/science/mixing)
"bMp" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 1
},
/obj/machinery/door/airlock/external{
req_access_txt = "8"
},
/turf/open/floor/plating,
/area/science/mixing)
"bMq" = (
@@ -40373,11 +40370,10 @@
/turf/open/floor/engine/vacuum,
/area/science/mixing)
"bNq" = (
/obj/structure/lattice/catwalk,
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
dir = 6
/obj/machinery/atmospherics/components/unary/outlet_injector/on{
dir = 1
},
/turf/open/space,
/turf/open/floor/plating/airless,
/area/science/mixing)
"bNr" = (
/obj/structure/window/reinforced{
@@ -40813,10 +40809,11 @@
/turf/open/floor/engine/vacuum,
/area/science/mixing)
"bOu" = (
/obj/machinery/atmospherics/components/unary/outlet_injector/on{
dir = 1
/obj/structure/lattice/catwalk,
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
dir = 6
},
/turf/open/floor/plating/airless,
/turf/open/space,
/area/science/mixing)
"bOv" = (
/obj/structure/window/reinforced{
@@ -41104,12 +41101,15 @@
/turf/open/floor/engine/n2o,
/area/engine/atmos)
"bPl" = (
/obj/structure/lattice/catwalk,
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
dir = 9
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 1
},
/turf/open/space,
/area/space/nearstation)
/obj/machinery/door/airlock/external{
req_access_txt = "8"
},
/turf/open/floor/plating,
/area/science/mixing)
"bPn" = (
/obj/machinery/door/airlock/grunge{
name = "Chapel"
@@ -53174,10 +53174,6 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"dhS" = (
/obj/structure/window/reinforced,
/turf/open/space/basic,
/area/space)
"dir" = (
/obj/machinery/atmospherics/pipe/simple/general/visible{
dir = 5
@@ -59590,7 +59586,7 @@
},
/obj/machinery/door/airlock/external,
/turf/open/floor/plating,
/area/space/nearstation)
/area/chapel/asteroid/monastery)
"rBh" = (
/obj/structure/mopbucket,
/obj/item/mop,
@@ -77801,7 +77797,7 @@ aiu
aiu
axC
axB
rKr
azN
axB
aaa
aaa
@@ -82501,8 +82497,8 @@ aht
aaa
aaa
abI
dhS
cqS
bGI
bNs
rzF
bNs
bOw
@@ -90640,9 +90636,9 @@ aaa
aaa
aaa
aaa
aaa
ahi
ahi
aoz
ahr
aoz
aqG
arD
asO
@@ -90898,8 +90894,8 @@ aaa
aaa
aaa
aaa
aaa
aaa
cdm
cdm
aqG
arE
arA
@@ -94741,7 +94737,7 @@ ags
adX
adX
adX
ahr
adX
aaa
aaa
aaa
@@ -94997,7 +94993,7 @@ cnC
adX
adX
adX
shH
adX
alb
aaa
aaa
@@ -95255,7 +95251,7 @@ agt
agD
agR
ahh
atZ
ahi
aaa
aaa
aaa
@@ -95511,7 +95507,7 @@ agg
adX
adX
adX
shH
adX
alb
aaa
aaa
@@ -95769,7 +95765,7 @@ ags
adX
adX
adX
shH
adX
aFj
aht
aht
@@ -105617,9 +105613,9 @@ bIN
dAF
bCV
bCV
bNq
bCV
bOu
aht
bNq
aaa
aaa
aaa
@@ -105875,8 +105871,8 @@ bJT
wOS
bMp
bPl
mZE
aht
bcO
aaa
aaa
aaa
aaa
@@ -106131,9 +106127,9 @@ fBz
bCV
bCV
bCV
bCV
ahi
aht
aht
abI
abI
abI
@@ -109182,7 +109178,7 @@ aXC
aYF
baG
sut
bcO
oCX
rWE
baG
dsv
@@ -109439,7 +109435,7 @@ aEl
aEl
baG
rWE
oCX
atZ
rWE
baG
aEj
+1 -2
View File
@@ -64,7 +64,6 @@
#define DEFAULT_BODYPART_ICON 'icons/mob/human_parts.dmi'
#define DEFAULT_BODYPART_ICON_ORGANIC 'icons/mob/human_parts_greyscale.dmi'
#define DEFAULT_BODYPART_ICON_ROBOTIC 'icons/mob/augmentation/augments.dmi'
#define DEFAULT_BODYPART_ICON_CITADEL 'modular_citadel/icons/mob/mutant_bodyparts.dmi'
#define MONKEY_BODYPART "monkey"
#define ALIEN_BODYPART "alien"
@@ -333,4 +332,4 @@
/// If you examine the same atom twice in this timeframe, we call examine_more() instead of examine()
#define EXAMINE_MORE_TIME 1 SECONDS
#define SILENCE_RANGED_MESSAGE (1<<0)
#define SILENCE_RANGED_MESSAGE (1<<0)
+7
View File
@@ -0,0 +1,7 @@
#define ROCKPAPERSCISSORS_RANGE 3
#define ROCKPAPERSCISSORS_TIME_LIMIT 20 SECONDS
#define ROCKPAPERSCISSORS_LOSE "lose"
#define ROCKPAPERSCISSORS_WIN "win"
#define ROCKPAPERSCISSORS_TIE "tie"
#define ROCKPAPERSCISSORS_NOT_DECIDED "not_decided"
+3
View File
@@ -24,7 +24,10 @@ GLOBAL_LIST_INIT(default_weight_class_to_volume, list(
// Let's keep all of this in one place. given what we put above anyways..
// volume amount for items
/// volume for a data disk
#define ITEM_VOLUME_DISK 1
/// volume for a shotgun stripper clip holding 4 shells
#define ITEM_VOLUME_STRIPPER_CLIP (DEFAULT_VOLUME_NORMAL * 0.5)
// #define SAMPLE_VOLUME_AMOUNT 2
+5 -5
View File
@@ -17,9 +17,9 @@ For fast lookups, this is generated using regenerate_donator_grouping_list()
/proc/regenerate_donator_grouping_list()
GLOB.donators_by_group = list() //reinit everything
var/list/donator_list = GLOB.donators_by_group //cache
var/list/tier_1 = TIER_1_DONATORS
donator_list[DONATOR_GROUP_TIER_1] = tier_1.Copy() //The .Copy() is to "decouple"/make a new list, rather than letting the global list impact the config list.
var/list/tier_2 = tier_1 + TIER_2_DONATORS //Using + on lists implies making new lists, so we don't need to manually Copy().
var/list/tier_3 = TIER_3_DONATORS
donator_list[DONATOR_GROUP_TIER_3] = tier_3.Copy() //The .Copy() is to "decouple"/make a new list, rather than letting the global list impact the config list.
var/list/tier_2 = tier_3 + TIER_2_DONATORS //Using + on lists implies making new lists, so we don't need to manually Copy().
donator_list[DONATOR_GROUP_TIER_2] = tier_2
var/list/tier_3 = tier_2 + TIER_3_DONATORS
donator_list[DONATOR_GROUP_TIER_3] = tier_3
var/list/tier_1 = tier_2 + TIER_1_DONATORS
donator_list[DONATOR_GROUP_TIER_1] = tier_1
+5
View File
@@ -278,3 +278,8 @@ GLOBAL_LIST_INIT(all_mutant_parts, list("tail_lizard" = "Tail", "mam_tail" = "Ta
GLOBAL_LIST_INIT(unlocked_mutant_parts, list("horns", "insect_fluff"))
//parts in either of the above two lists that require a second option that allows them to be coloured
GLOBAL_LIST_INIT(colored_mutant_parts, list("insect_wings" = "wings_color", "deco_wings" = "wings_color", "horns" = "horns_color"))
//species ids that have greyscale sprites
GLOBAL_LIST_INIT(greyscale_limb_types, list("human","moth","lizard","pod","plant","jelly","slime","golem","lum","stargazer","mush","ethereal","snail","c_golem","b_golem","mammal","xeno","ipc","insect","synthliz","avian","aquatic"))
//species ids that need snowflake coloring applied
+3
View File
@@ -41,3 +41,6 @@ GLOBAL_LIST_EMPTY(ai_status_displays)
GLOBAL_LIST_EMPTY(mob_spawners) // All mob_spawn objects
GLOBAL_LIST_EMPTY(alert_consoles) // Station alert consoles, /obj/machinery/computer/station_alert
//list of everyone playing rock paper scissors
GLOBAL_LIST_EMPTY(rockpaperscissors_players)
+1 -1
View File
@@ -32,4 +32,4 @@
/mob/camera/blob/AltClickOn(atom/A) //Remove a blob
var/turf/T = get_turf(A)
if(T)
remove_blob(T)
remove_blob(T)
@@ -4,16 +4,26 @@ PROCESSING_SUBSYSTEM_DEF(instruments)
init_order = INIT_ORDER_INSTRUMENTS
flags = SS_KEEP_TIMING
priority = FIRE_PRIORITY_INSTRUMENTS
var/static/list/datum/instrument/instrument_data = list() //id = datum
/// List of all instrument data, associative id = datum
var/static/list/datum/instrument/instrument_data = list()
/// List of all song datums.
var/static/list/datum/song/songs = list()
/// Max lines in songs
var/static/musician_maxlines = 600
/// Max characters per line in songs
var/static/musician_maxlinechars = 300
/// Deciseconds between hearchecks. Too high and instruments seem to lag when people are moving around in terms of who can hear it. Too low and the server lags from this.
var/static/musician_hearcheck_mindelay = 5
/// Maximum instrument channels total instruments are allowed to use. This is so you don't have instruments deadlocking all sound channels.
var/static/max_instrument_channels = MAX_INSTRUMENT_CHANNELS
/// Current number of channels allocated for instruments
var/static/current_instrument_channels = 0
/// Single cached list for synthesizer instrument ids, so you don't have to have a new list with every synthesizer.
var/static/list/synthesizer_instrument_ids
/datum/controller/subsystem/processing/instruments/Initialize()
initialize_instrument_data()
synthesizer_instrument_ids = get_allowed_instrument_ids()
return ..()
/datum/controller/subsystem/processing/instruments/proc/on_song_new(datum/song/S)
@@ -29,7 +39,10 @@ PROCESSING_SUBSYSTEM_DEF(instruments)
continue
I = new path
I.Initialize()
instrument_data[I.id || "[I.type]"] = I
if(!I.id)
qdel(I)
continue
instrument_data[I.id] = I
CHECK_TICK
/datum/controller/subsystem/processing/instruments/proc/get_instrument(id_or_path)
+31 -5
View File
@@ -103,13 +103,21 @@ GLOBAL_LIST_EMPTY(explosions)
// 3/7/14 will calculate to 80 + 35
var/far_dist = 0
far_dist += heavy_impact_range * 5
far_dist += heavy_impact_range * 15 // Large explosions carry further
far_dist += devastation_range * 20
if(!silent)
var/frequency = get_rand_frequency()
var/sound/explosion_sound = sound(get_sfx("explosion"))
var/sound/far_explosion_sound = sound('sound/effects/explosionfar.ogg')
var/sound/creaking_explosion_sound = sound(get_sfx("explosion_creaking"))
var/sound/hull_creaking_sound = sound(get_sfx("hull_creaking"))
var/sound/explosion_echo_sound = sound('sound/effects/explosion_distant.ogg')
var/on_station = SSmapping.level_trait(epicenter.z, ZTRAIT_STATION)
var/creaking_explosion = FALSE
if(prob(devastation_range*30+heavy_impact_range*5) && on_station) // Huge explosions are near guaranteed to make the station creak and whine, smaller ones might.
creaking_explosion = TRUE // prob over 100 always returns true
for(var/mob/M in GLOB.player_list)
// Double check for client
@@ -126,11 +134,29 @@ GLOBAL_LIST_EMPTY(explosions)
shake_camera(M, 25, clamp(baseshakeamount, 0, 10))
// You hear a far explosion if you're outside the blast radius. Small bombs shouldn't be heard all over the station.
else if(dist <= far_dist)
var/far_volume = clamp(far_dist, 30, 50) // Volume is based on explosion size and dist
far_volume += (dist <= far_dist * 0.5 ? 50 : 0) // add 50 volume if the mob is pretty close to the explosion
M.playsound_local(epicenter, null, far_volume, 1, frequency, falloff = 5, S = far_explosion_sound)
if(baseshakeamount > 0)
var/far_volume = clamp(far_dist/2, 40, 60) // Volume is based on explosion size and dist
if(creaking_explosion)
M.playsound_local(epicenter, null, far_volume, 1, frequency, S = creaking_explosion_sound, distance_multiplier = 0)
else if(prob(75))
M.playsound_local(epicenter, null, far_volume, 1, frequency, S = far_explosion_sound, distance_multiplier = 0) // Far sound
else
M.playsound_local(epicenter, null, far_volume, 1, frequency, S = explosion_echo_sound, distance_multiplier = 0) // Echo sound
if(baseshakeamount > 0 || devastation_range)
if(!baseshakeamount) // Devastating explosions rock the station and ground
baseshakeamount = devastation_range*3
shake_camera(M, 10, clamp(baseshakeamount*0.25, 0, 2.5))
else if(M.can_hear() && !isspaceturf(get_turf(M)) && heavy_impact_range) // Big enough explosions echo throughout the hull
var/echo_volume = 40
if(devastation_range)
baseshakeamount = devastation_range
shake_camera(M, 10, clamp(baseshakeamount*0.25, 0, 2.5))
echo_volume = 60
M.playsound_local(epicenter, null, echo_volume, 1, frequency, S = explosion_echo_sound, distance_multiplier = 0)
if(creaking_explosion) // 5 seconds after the bang, the station begins to creak
addtimer(CALLBACK(M, /mob/proc/playsound_local, epicenter, null, rand(25, 40), 1, frequency, null, null, FALSE, hull_creaking_sound, null, null, null, null, 0), 5 SECONDS)
EX_PREPROCESS_CHECK_TICK
//postpone processing for a bit
+2
View File
@@ -90,6 +90,8 @@
to_chat(user, "<span class='boldnotice'>You catch some drifting memories of their past conversations...</span>")
for(var/spoken_memory in recent_speech)
to_chat(user, "<span class='notice'>[recent_speech[spoken_memory]]</span>")
if(usr in GLOB.rockpaperscissors_players)
to_chat(user, "<span class='notice'>They're planning on playing [GLOB.rockpaperscissors_players[usr][1]]</span>")
if(iscarbon(M))
var/mob/living/carbon/human/H = M
to_chat(user, "<span class='boldnotice'>You find that their intent is to [H.a_intent]...</span>")
+5 -3
View File
@@ -53,8 +53,6 @@
/datum/wires/airlock/interactable(mob/user)
var/obj/machinery/door/airlock/A = holder
if(!A.hasSiliconAccessInArea(user) && A.isElectrified() && A.shock(user, 100))
return FALSE
if(A.panel_open)
return TRUE
@@ -73,6 +71,8 @@
/datum/wires/airlock/on_pulse(wire)
set waitfor = FALSE
var/obj/machinery/door/airlock/A = holder
if(!A.hasSiliconAccessInArea(usr) && A.isElectrified() && A.shock(usr, 100))
return FALSE
switch(wire)
if(WIRE_POWER1, WIRE_POWER2) // Pulse to loose power.
A.loseMainPower()
@@ -127,6 +127,8 @@
/datum/wires/airlock/on_cut(wire, mend)
var/obj/machinery/door/airlock/A = holder
if(!A.hasSiliconAccessInArea(usr) && A.isElectrified() && A.shock(usr, 100))
return FALSE
switch(wire)
if(WIRE_POWER1, WIRE_POWER2) // Cut to loose power, repair all to gain power.
if(mend && !is_cut(WIRE_POWER1) && !is_cut(WIRE_POWER2))
@@ -174,4 +176,4 @@
A.update_icon()
if(WIRE_ZAP1, WIRE_ZAP2) // Ouch.
if(isliving(usr))
A.shock(usr, 50)
A.shock(usr, 50)
+16 -3
View File
@@ -3,13 +3,14 @@
/obj/machinery/iv_drip
name = "\improper IV drip"
desc = "An IV drip with an advanced infusion pump that can both drain blood into and inject liquids from attached containers. Blood packs are processed at an accelerated rate."
desc = "An IV drip with an advanced infusion pump that can both drain blood into and inject liquids from attached containers. Blood packs are processed at an accelerated rate. Alt-Click to change the transfer rate."
icon = 'icons/obj/iv_drip.dmi'
icon_state = "iv_drip"
anchored = FALSE
mouse_drag_pointer = MOUSE_ACTIVE_POINTER
var/mob/living/carbon/attached
var/mode = IV_INJECTING
var/dripfeed = FALSE
var/obj/item/reagent_containers/beaker
var/static/list/drip_containers = typecacheof(list(/obj/item/reagent_containers/blood,
/obj/item/reagent_containers/food,
@@ -132,9 +133,11 @@
if(mode)
if(beaker.reagents.total_volume)
var/transfer_amount = 5
if (dripfeed)
transfer_amount = 1
if(istype(beaker, /obj/item/reagent_containers/blood))
// speed up transfer on blood packs
transfer_amount = 10
transfer_amount *= 2
var/fraction = min(transfer_amount/beaker.reagents.total_volume, 1) //the fraction that is transfered of the total volume
beaker.reagents.reaction(attached, INJECT, fraction, FALSE) //make reagents reacts, but don't spam messages
beaker.reagents.trans_to(attached, transfer_amount)
@@ -169,6 +172,16 @@
else
toggle_mode()
/obj/machinery/iv_drip/AltClick(mob/living/user)
if(!user.canUseTopic(src, be_close=TRUE))
return
if(dripfeed)
dripfeed = FALSE
to_chat(usr, "<span class='notice'>You loosen the valve to speed up the [src].</span>")
else
dripfeed = TRUE
to_chat(usr, "<span class='notice'>You tighten the valve to slowly drip-feed the contents of [src].</span>")
/obj/machinery/iv_drip/attack_robot(mob/user)
if(Adjacent(user))
attack_hand(user)
@@ -227,7 +240,7 @@
/obj/machinery/iv_drip/telescopic
name = "telescopic IV drip"
desc = "An IV drip with an advanced infusion pump that can both drain blood into and inject liquids from attached containers. Blood packs are processed at an accelerated rate. This one is telescopic, and can be picked up and put down."
desc = "An IV drip with an advanced infusion pump that can both drain blood into and inject liquids from attached containers. Blood packs are processed at an accelerated rate. This one is telescopic, and can be picked up and put down.Alt-Click with a beaker attached to change the transfer rate."
icon_state = "iv_drip"
/obj/machinery/iv_drip/telescopic/update_icon_state()
@@ -63,3 +63,23 @@
/datum/effect_system/lightning_spread
effect_type = /obj/effect/particle_effect/sparks/electricity
//fake sparks, not subtyped because we don't want light/heat, nor checks inside an often used proc for a rare subcase for saving like 10 lines of code
/obj/effect/particle_effect/fake_sparks
name = "lightning"
icon_state = "electricity"
/obj/effect/particle_effect/fake_sparks/Initialize()
. = ..()
flick(icon_state, src) // replay the animation
playsound(src, "sparks", 100, TRUE)
QDEL_IN(src, 20)
/datum/effect_system/fake_spark_spread
effect_type = /obj/effect/particle_effect/fake_sparks
/proc/do_fake_sparks(n, c, source)
var/datum/effect_system/fake_spark_spread/sparks = new
sparks.set_up(n, c, source)
sparks.autocleanup = TRUE
sparks.start()
+77 -13
View File
@@ -47,8 +47,11 @@
spawn_option(stored_options[choice],M)
qdel(src)
/obj/item/choice_beacon/proc/spawn_option(obj/choice,mob/living/M)
var/obj/new_item = new choice()
/obj/item/choice_beacon/proc/create_choice_atom(atom/choice, mob/owner)
return new choice()
/obj/item/choice_beacon/proc/spawn_option(atom/choice,mob/living/M)
var/obj/new_item = create_choice_atom(choice, M)
var/obj/structure/closet/supplypod/bluespacepod/pod = new()
pod.explosionSize = list(0,0,0,0)
new_item.forceMove(pod)
@@ -152,10 +155,50 @@
augment_list[initial(A.name)] = A
return augment_list
/obj/item/choice_beacon/augments/spawn_option(obj/choice,mob/living/M)
/obj/item/choice_beacon/augments/spawn_option(atom/choice,mob/living/M)
new choice(get_turf(M))
to_chat(M, "<span class='hear'>You hear something crackle from the beacon for a moment before a voice speaks. \"Please stand by for a message from S.E.L.F. Message as follows: <b>Item request received. Your package has been transported, use the autosurgeon supplied to apply the upgrade.</b> Message ends.\"</span>")
/obj/item/choice_beacon/pet //donator beacon that summons a small friendly animal
name = "pet beacon"
desc = "Straight from the outerspace pet shop to your feet."
var/static/list/pets = list("Crab" = /mob/living/simple_animal/crab,
"Cat" = /mob/living/simple_animal/pet/cat,
"Space cat" = /mob/living/simple_animal/pet/cat/space,
"Kitten" = /mob/living/simple_animal/pet/cat/kitten,
"Dog" = /mob/living/simple_animal/pet/dog,
"Corgi" = /mob/living/simple_animal/pet/dog/corgi,
"Pug" = /mob/living/simple_animal/pet/dog/pug,
"Exotic Corgi" = /mob/living/simple_animal/pet/dog/corgi/exoticcorgi,
"Fox" = /mob/living/simple_animal/pet/fox,
"Red Panda" = /mob/living/simple_animal/pet/redpanda,
"Possum" = /mob/living/simple_animal/opossum)
var/pet_name
/obj/item/choice_beacon/pet/generate_display_names()
return pets
/obj/item/choice_beacon/pet/create_choice_atom(atom/choice, mob/owner)
var/mob/living/simple_animal/new_choice = new choice()
new_choice.butcher_results = null //please don't eat your pet, chef
var/obj/item/pet_carrier/donator/carrier = new() //a donator pet carrier is just a carrier that can't be shoved in an autolathe for metal
carrier.add_occupant(new_choice)
new_choice.mob_size = MOB_SIZE_TINY //yeah we're not letting you use this roundstart pet to hurt people / knock them down
new_choice.pass_flags = PASSTABLE | PASSMOB //your pet is not a bullet/person shield
new_choice.density = FALSE
new_choice.blood_volume = 0 //your pet cannot be used to drain blood from for a bloodsucker
new_choice.desc = "A pet [initial(choice.name)], owned by [owner]!"
new_choice.can_have_ai = FALSE //no it cant be sentient damnit
if(pet_name)
new_choice.name = pet_name
new_choice.unique_name = TRUE
return carrier
/obj/item/choice_beacon/pet/spawn_option(atom/choice,mob/living/M)
pet_name = input(M, "What would you like to name the pet? (leave blank for default name)", "Pet Name")
..()
//choice boxes (they just open in your hand instead of making a pod)
/obj/item/choice_beacon/box
name = "choice box (default)"
desc = "Think really hard about what you want, and then rip it open!"
@@ -163,21 +206,17 @@
icon_state = "deliverypackage3"
item_state = "deliverypackage3"
/obj/item/choice_beacon/box/spawn_option(obj/choice,mob/living/M)
to_chat(M, "<span class='hear'>The box opens, revealing the [choice]!</span>")
/obj/item/choice_beacon/box/spawn_option(atom/choice,mob/living/M)
var/choice_text = choice
if(ispath(choice_text))
choice_text = initial(choice.name)
to_chat(M, "<span class='hear'>The box opens, revealing the [choice_text]!</span>")
playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1)
M.temporarilyRemoveItemFromInventory(src, TRUE)
M.put_in_hands(new choice)
qdel(src)
/obj/item/choice_beacon/box/plushie
name = "choice box (plushie)"
desc = "Using the power of quantum entanglement, this box contains every plush, until the moment it is opened!"
icon = 'icons/obj/plushes.dmi'
icon_state = "box"
item_state = "box"
/obj/item/choice_beacon/box/spawn_option(choice,mob/living/M)
/obj/item/choice_beacon/box/plushie/spawn_option(choice,mob/living/M)
if(ispath(choice, /obj/item/toy/plush))
..() //regular plush, spawn it naturally
else
@@ -188,6 +227,31 @@
M.put_in_hands(new choice)
qdel(src)
/obj/item/choice_beacon/box/carpet //donator carpet beacon
name = "choice box (carpet)"
desc = "Contains 50 of a selected carpet inside!"
var/static/list/carpet_list = list(/obj/item/stack/tile/carpet/black/fifty = "Black Carpet",
"Black & Red Carpet" = /obj/item/stack/tile/carpet/blackred/fifty,
"Monochrome Carpet" = /obj/item/stack/tile/carpet/monochrome/fifty,
"Blue Carpet" = /obj/item/stack/tile/carpet/blue/fifty,
"Cyan Carpet" = /obj/item/stack/tile/carpet/cyan/fifty,
"Green Carpet" = /obj/item/stack/tile/carpet/green/fifty,
"Orange Carpet" = /obj/item/stack/tile/carpet/orange/fifty,
"Purple Carpet" = /obj/item/stack/tile/carpet/purple/fifty,
"Red Carpet" = /obj/item/stack/tile/carpet/red/fifty,
"Royal Black Carpet" = /obj/item/stack/tile/carpet/royalblack/fifty,
"Royal Blue Carpet" = /obj/item/stack/tile/carpet/royalblue/fifty)
/obj/item/choice_beacon/box/carpet/generate_display_names()
return carpet_list
/obj/item/choice_beacon/box/plushie
name = "choice box (plushie)"
desc = "Using the power of quantum entanglement, this box contains every plush, until the moment it is opened!"
icon = 'icons/obj/plushes.dmi'
icon_state = "box"
item_state = "box"
/obj/item/choice_beacon/box/plushie/generate_display_names()
var/list/plushie_list = list()
//plushie set 1: just subtypes of /obj/item/toy/plush
+3
View File
@@ -29,6 +29,9 @@
var/has_lock_sprites = TRUE //whether to load the lock overlays or not
var/allows_hostiles = FALSE //does the pet carrier allow hostile entities to be held within it?
/obj/item/pet_carrier/donator
custom_materials = null //you cant just use the loadout item to get free metal!
/obj/item/pet_carrier/Destroy()
if(occupants.len)
for(var/V in occupants)
+2 -1
View File
@@ -281,6 +281,7 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons)
/obj/item/clothing/suit/armor/vest/infiltrator,
/obj/item/clothing/under/syndicate/bloodred,
/obj/item/clothing/gloves/color/latex/nitrile/infiltrator,
/obj/item/clothing/gloves/tackler/combat/insulated/infiltrator,
/obj/item/clothing/mask/infiltrator,
/obj/item/clothing/shoes/combat/sneakboots,
/obj/item/gun/ballistic/automatic/pistol,
@@ -292,7 +293,7 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons)
new /obj/item/clothing/head/helmet/infiltrator(src)
new /obj/item/clothing/suit/armor/vest/infiltrator(src)
new /obj/item/clothing/under/syndicate/bloodred(src)
new /obj/item/clothing/gloves/color/latex/nitrile/infiltrator(src)
new /obj/item/clothing/gloves/tackler/combat/insulated/infiltrator(src)
new /obj/item/clothing/mask/infiltrator(src)
new /obj/item/clothing/shoes/combat/sneakboots(src)
+6 -3
View File
@@ -291,7 +291,8 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BACK
w_class = WEIGHT_CLASS_BULKY
force = 9
force = 7 //how much harm mode damage we do
var/stamina_damage_increment = 4 //how much extra damage do we do when in non-harm mode
throwforce = 10
damtype = STAMINA
attack_verb = list("whacked", "smacked", "struck")
@@ -342,17 +343,19 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
/obj/item/melee/bokken/Initialize()
. = ..()
AddElement(/datum/element/sword_point)
if(!harm) //if initialised in non-harm mode, setup force accordingly
force = force + stamina_damage_increment
/obj/item/melee/bokken/attack_self(mob/user)
harm = !harm
if(harm)
force -= 2
force -= stamina_damage_increment
damtype = BRUTE
attack_verb = list("bashed", "smashed", "attacked")
bare_wound_bonus = 15 // having your leg smacked by a wooden stick is probably not great for it if it's naked
wound_bonus = 0
else
force += 2
force += stamina_damage_increment
damtype = STAMINA
attack_verb = list("whacked", "smacked", "struck")
bare_wound_bonus = 0
+15 -1
View File
@@ -243,10 +243,24 @@ LINEN BINS
/obj/item/bedsheet/random/Initialize()
..()
var/type = pick(typesof(/obj/item/bedsheet) - /obj/item/bedsheet/random)
var/type = pick(typesof(/obj/item/bedsheet) - list(/obj/item/bedsheet/random, /obj/item/bedsheet/chameleon))
new type(loc)
return INITIALIZE_HINT_QDEL
/obj/item/bedsheet/chameleon //donator chameleon bedsheet
name = "chameleon bedsheet"
desc = "Bedsheet technology has truly gone too far."
var/datum/action/item_action/chameleon/change/chameleon_action
/obj/item/bedsheet/chameleon/New()
..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/bedsheet
chameleon_action.chameleon_name = "Bedsheet"
chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/bedsheet/chameleon, /obj/item/bedsheet/random), only_root_path = TRUE)
chameleon_action.initialize_disguises()
//bedsheet bin
/obj/structure/bedsheetbin
name = "linen bin"
desc = "It looks rather cosy."
+5 -1
View File
@@ -86,6 +86,10 @@
/obj/structure/grille/attack_animal(mob/user)
. = ..()
if(!user.CheckActionCooldown(CLICK_CD_MELEE))
return
user.DelayNextAction(flush = TRUE)
user.do_attack_animation(src)
if(!shock(user, 70) && !QDELETED(src)) //Last hit still shocks but shouldn't deal damage to the grille)
take_damage(rand(5,10), BRUTE, "melee", 1)
@@ -114,12 +118,12 @@
/obj/structure/grille/attack_alien(mob/living/user)
if(!user.CheckActionCooldown(CLICK_CD_MELEE))
return
user.DelayNextAction(flush = TRUE)
user.do_attack_animation(src)
user.visible_message("<span class='warning'>[user] mangles [src].</span>", null, null, COMBAT_MESSAGE_RANGE)
if(!shock(user, 70))
take_damage(20, BRUTE, "melee", 1)
/obj/structure/grille/CanPass(atom/movable/mover, turf/target)
if(istype(mover) && (mover.pass_flags & PASSGRILLE))
return TRUE
+4
View File
@@ -130,6 +130,10 @@
/proc/get_sfx(soundin)
if(istext(soundin))
switch(soundin)
if ("explosion_creaking") // from skyrat-ss13/skyrat13/pull/3295
soundin = pick('sound/effects/explosioncreak1.ogg', 'sound/effects/explosioncreak2.ogg')
if ("hull_creaking") // from skyrat-ss13/skyrat13/pull/3295
soundin = pick('sound/effects/creak1.ogg', 'sound/effects/creak2.ogg', 'sound/effects/creak3.ogg')
if ("shatter")
soundin = pick('sound/effects/glassbr1.ogg','sound/effects/glassbr2.ogg','sound/effects/glassbr3.ogg')
if ("explosion")
@@ -54,7 +54,7 @@
REMOVE_TRAIT(user, TRAIT_PIERCEIMMUNE, "fortitude")
REMOVE_TRAIT(user, TRAIT_NODISMEMBER, "fortitude")
REMOVE_TRAIT(user, TRAIT_STUNIMMUNE, "fortitude")
REMOVE_TRAIT(user, TRAIT_STUNIMMUNE, "fortitude")
REMOVE_TRAIT(user, TRAIT_NORUNNING, "fortitude")
if(!ishuman(owner))
return
var/mob/living/carbon/human/H = owner
+16 -3
View File
@@ -246,6 +246,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
/// Which of the 5 persistent scar slots we randomly roll to load for this round, if enabled. Actually rolled in [/datum/preferences/proc/load_character(slot)]
var/scars_index = 1
var/chosen_limb_id //body sprite selected to load for the users limbs, null means default, is sanitized when loaded
/datum/preferences/New(client/C)
parent = C
@@ -521,6 +523,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "</td>"
mutant_category = 0
if(length(pref_species.allowed_limb_ids))
if(!chosen_limb_id || !(chosen_limb_id in pref_species.allowed_limb_ids))
chosen_limb_id = pref_species.id
dat += "<h3>Body sprite</h3>"
dat += "<a style='display:block;width:100px' href='?_src_=prefs;preference=bodysprite;task=input'>[chosen_limb_id]</a>"
if(mutant_category)
dat += "</td>"
mutant_category = 0
@@ -801,7 +809,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(!subcategories.Find(gear_subcategory))
gear_subcategory = subcategories[1]
var/firstsubcat = FALSE
var/firstsubcat = TRUE
for(var/subcategory in subcategories)
if(firstsubcat)
firstsubcat = FALSE
@@ -2092,8 +2100,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
else
features["body_model"] = chosengender
gender = chosengender
facial_hair_style = random_facial_hair_style(gender)
hair_style = random_hair_style(gender)
if("body_size")
var/min = CONFIG_GET(number/body_size_min)
@@ -2119,6 +2125,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/selected_custom_speech_verb = input(user, "Choose your desired speech verb (none means your species speech verb)", "Character Preference") as null|anything in GLOB.speech_verbs
if(selected_custom_speech_verb)
custom_speech_verb = selected_custom_speech_verb
if("bodysprite")
var/selected_body_sprite = input(user, "Choose your desired body sprite", "Character Preference") as null|anything in pref_species.allowed_limb_ids
if(selected_body_sprite)
chosen_limb_id = selected_body_sprite //this gets sanitized before loading
else
switch(href_list["preference"])
//CITADEL PREFERENCES EDIT - I can't figure out how to modularize these, so they have to go here. :c -Pooj
@@ -2510,6 +2521,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
character.dna.features = features.Copy()
character.set_species(chosen_species, icon_update = FALSE, pref_load = TRUE)
if(chosen_limb_id && (chosen_limb_id in character.dna.species.allowed_limb_ids))
character.dna.species.mutant_bodyparts["limbs_id"] = chosen_limb_id
character.dna.real_name = character.real_name
character.dna.nameless = character.nameless
character.dna.custom_species = character.custom_species
@@ -514,6 +514,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["scars3"] >> scars_list["3"]
S["scars4"] >> scars_list["4"]
S["scars5"] >> scars_list["5"]
S["chosen_limb_id"] >> chosen_limb_id
//Custom names
@@ -844,6 +845,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["feature_ooc_notes"], features["ooc_notes"])
WRITE_FILE(S["chosen_limb_id"], chosen_limb_id)
//Custom names
for(var/custom_name_id in GLOB.preferences_custom_names)
var/savefile_slot_name = custom_name_id + "_name" //TODO remove this
@@ -199,12 +199,16 @@
/obj/item/clothing/gloves/evening
name = "evening gloves"
desc = "Thin, pretty gloves intended for use in regal feminine attire, but knowing Space China these are just for some maid fetish."
desc = "Thin, pretty gloves intended for use in regal feminine attire. A tag on the hem claims they were 'maid' in Space China, these were probably intended for use in some maid fetish."
icon_state = "evening"
item_state = "evening"
strip_delay = 40
equip_delay_other = 20
transfer_prints = TRUE
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
strip_mod = 0.9
custom_price = PRICE_ALMOST_CHEAP
/obj/item/clothing/gloves/evening/black
name = "midnight gloves"
desc = "Thin, pretty gloves intended for use in sexy feminine attire. A tag on the hem claims they pair great with black stockings."
icon_state = "eveningblack"
item_state = "eveningblack"
+19
View File
@@ -72,6 +72,25 @@
siemens_coefficient = 0
permeability_coefficient = 0.05
/obj/item/clothing/gloves/tackler/combat/insulated/infiltrator
name = "insidious guerrilla gloves"
desc = "Specialized combat gloves for carrying people around. Transfers tactical kidnapping and tackling knowledge to the user via the use of nanochips."
icon_state = "infiltrator"
item_state = "infiltrator"
siemens_coefficient = 0
permeability_coefficient = 0.05
resistance_flags = FIRE_PROOF | ACID_PROOF
var/carrytrait = TRAIT_QUICKER_CARRY
/obj/item/clothing/gloves/tackler/combat/insulated/infiltrator/equipped(mob/user, slot)
. = ..()
if(slot == SLOT_GLOVES)
ADD_TRAIT(user, carrytrait, GLOVE_TRAIT)
/obj/item/clothing/gloves/tackler/combat/insulated/infiltrator/dropped(mob/user)
. = ..()
REMOVE_TRAIT(user, carrytrait, GLOVE_TRAIT)
/obj/item/clothing/gloves/tackler/rocket
name = "rocket gloves"
desc = "The ultimate in high risk, high reward, perfect for when you need to stop a criminal from fifty feet away or die trying. Banned in most Spinward gridiron football and rugby leagues."
+5 -5
View File
@@ -625,7 +625,7 @@
desc = "An arctic white winter coat with a small blue caduceus instead of a plastic zipper tab. Snazzy."
icon_state = "coatmedical"
item_state = "coatmedical"
allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
allowed = list(/obj/item/analyzer, /obj/item/sensor_device, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 45)
hoodtype = /obj/item/clothing/head/hooded/winterhood/medical
@@ -638,7 +638,7 @@
desc = "An arctic white winter coat with a small blue caduceus instead of a plastic zipper tab. The normal liner is replaced with an exceptionally thick, soft layer of fur."
icon_state = "coatcmo"
item_state = "coatcmo"
allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
allowed = list(/obj/item/analyzer, /obj/item/sensor_device, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
armor = list("melee" = 5, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 0)
hoodtype = /obj/item/clothing/head/hooded/winterhood/cmo
@@ -651,7 +651,7 @@
desc = "A lab-grade winter coat made with acid resistant polymers. For the enterprising chemist who was exiled to a frozen wasteland on the go."
icon_state = "coatchemistry"
item_state = "coatchemistry"
allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
allowed = list(/obj/item/analyzer, /obj/item/sensor_device, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 30, "rad" = 0, "fire" = 30, "acid" = 45)
hoodtype = /obj/item/clothing/head/hooded/winterhood/chemistry
@@ -664,7 +664,7 @@
desc = "A white winter coat with green markings. Warm, but wont fight off the common cold or any other disease. Might make people stand far away from you in the hallway. The zipper tab looks like an oversized bacteriophage."
icon_state = "coatviro"
item_state = "coatviro"
allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
allowed = list(/obj/item/analyzer, /obj/item/sensor_device, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 30, "rad" = 0, "fire" = 0, "acid" = 0)
hoodtype = /obj/item/clothing/head/hooded/winterhood/viro
@@ -677,7 +677,7 @@
desc = "A winter coat with blue markings. Warm, but probably won't protect from biological agents. For the cozy doctor on the go."
icon_state = "coatparamed"
item_state = "coatparamed"
allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
allowed = list(/obj/item/analyzer, /obj/item/sensor_device, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 45)
hoodtype = /obj/item/clothing/head/hooded/winterhood/paramedic
+4 -1
View File
@@ -97,9 +97,12 @@ All foods are distributed among various categories. Use common sense.
return
/obj/item/reagent_containers/food/snacks/attack(mob/living/M, mob/living/user, def_zone)
/obj/item/reagent_containers/food/snacks/attack(mob/living/M, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1)
if(user.a_intent == INTENT_HARM)
return ..()
INVOKE_ASYNC(src, .proc/attempt_forcefeed, M, user)
/obj/item/reagent_containers/food/snacks/proc/attempt_forcefeed(mob/living/M, mob/living/user)
if(!eatverb)
eatverb = pick("bite","chew","nibble","gnaw","gobble","chomp")
if(!reagents.total_volume) //Shouldn't be needed but it checks to see if it has anything left in it.
+9 -4
View File
@@ -103,6 +103,7 @@
throwforce = 5
throw_speed = 2
throw_range = 3
attack_speed = CLICK_CD_MELEE
w_class = WEIGHT_CLASS_BULKY
flags_1 = CONDUCT_1
armour_penetration = 20
@@ -125,9 +126,12 @@
playsound(src,pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg') ,50, 1, -1)
return (BRUTELOSS)
/obj/item/scythe/pre_attack(atom/A, mob/living/user, params)
/obj/item/scythe/pre_attack(atom/A, mob/living/user, params, attackchain_flags, damage_multiplier)
. = ..()
if(. & STOP_ATTACK_PROC_CHAIN)
return
if(swiping || !istype(A, /obj/structure/spacevine) || get_turf(A) == get_turf(user))
return ..()
return
else
var/turf/user_turf = get_turf(user)
var/dir_to_target = get_dir(user_turf, get_turf(A))
@@ -138,11 +142,12 @@
var/turf/T = get_step(user_turf, turn(dir_to_target, i))
for(var/obj/structure/spacevine/V in T)
if(user.Adjacent(V))
melee_attack_chain(user, V)
melee_attack_chain(user, V, attackchain_flags = ATTACK_IGNORE_CLICKDELAY)
stam_gain += 5 //should be hitcost
swiping = FALSE
stam_gain += 2 //Initial hitcost
user.adjustStaminaLoss(-stam_gain)
user.DelayNextAction()
// *************************************
// Nutrient defines for hydroponics
@@ -192,4 +197,4 @@
/obj/item/reagent_containers/glass/bottle/killer/pestkiller
name = "bottle of pest spray"
desc = "Contains a pesticide."
list_reagents = list(/datum/reagent/toxin/pestkiller = 50)
list_reagents = list(/datum/reagent/toxin/pestkiller = 50)
+134 -37
View File
@@ -2,6 +2,12 @@
#define MUSIC_MAXLINES 1000
#define MUSIC_MAXLINECHARS 300
/**
* # Song datum
*
* These are the actual backend behind instruments.
* They attach to an atom and provide the editor + playback functionality.
*/
/datum/song
/// Name of the song
var/name = "Untitled"
@@ -15,6 +21,9 @@
/// delay between notes in deciseconds
var/tempo = 5
/// How far we can be heard
var/instrument_range = 15
/// Are we currently playing?
var/playing = FALSE
@@ -53,17 +62,24 @@
/////////////////// Playing variables ////////////////
/**
* Only used in synthesized playback - The chords we compiled. Non assoc list of lists:
* list(list(key1, key2, key3..., tempo_divisor), list(key1, key2..., tempo_divisor), ...)
* tempo_divisor always exists
* if key1 (and so if there's no keys) doesn't exist it's a rest
* Build by compile_chords()
* Must be rebuilt on instrument switch.
* Compilation happens when we start playing and is cleared after we finish playing.
* Format: list of chord lists, with chordlists having (key1, key2, key3, tempodiv)
*/
var/list/compiled_chords
/// Current section of a long chord we're on, so we don't need to make a billion chords, one for every unit ticklag.
var/elapsed_delay
/// Amount of delay to wait before playing the next chord
var/delay_by
/// Current chord we're on.
var/current_chord
/// Channel as text = current volume percentage but it's 0 to 100 instead of 0 to 1.
var/list/channels_playing = list()
/// List of channels that aren't being used, as text. This is to prevent unnecessary freeing and reallocations from SSsounds/SSinstruments.
var/list/channels_idle = list()
/// Person playing us
var/mob/user_playing
//////////////////////////////////////////////////////
/// Last world.time we checked for who can hear us
@@ -72,8 +88,6 @@
var/list/hearing_mobs
/// If this is enabled, some things won't be strictly cleared when they usually are (liked compiled_chords on play stop)
var/debug_mode = FALSE
/// Last time we processed decay
var/last_process_decay
/// Max sound channels to occupy
var/max_sound_channels = CHANNELS_PER_INSTRUMENT
/// Current channels, so we can save a length() call.
@@ -113,7 +127,7 @@
var/cached_exponential_dropoff = 1.045
/////////////////////////////////////////////////////////////////////////
/datum/song/New(atom/parent, list/instrument_ids)
/datum/song/New(atom/parent, list/instrument_ids, new_range)
SSinstruments.on_song_new(src)
lines = list()
tempo = sanitize_tempo(tempo)
@@ -125,6 +139,8 @@
hearing_mobs = list()
volume = clamp(volume, min_volume, max_volume)
update_sustain()
if(new_range)
instrument_range = new_range
/datum/song/Destroy()
stop_playing()
@@ -135,12 +151,15 @@
parent = null
return ..()
/**
* Checks and stores which mobs can hear us. Terminates sounds for mobs that leave our range.
*/
/datum/song/proc/do_hearcheck()
last_hearcheck = world.time
var/list/old = hearing_mobs.Copy()
hearing_mobs.len = 0
var/turf/source = get_turf(parent)
for(var/mob/M in get_hearers_in_view(15, source))
for(var/mob/M in get_hearers_in_view(instrument_range, source))
if(!(M?.client?.prefs?.toggles & SOUND_INSTRUMENTS))
continue
hearing_mobs[M] = get_dist(M, source)
@@ -148,10 +167,15 @@
for(var/i in exited)
terminate_sound_mob(i)
/// I can either be a datum, id, or path (if the instrument has no id).
/**
* Sets our instrument, caching anything necessary for faster accessing. Accepts an ID, typepath, or instantiated instrument datum.
*/
/datum/song/proc/set_instrument(datum/instrument/I)
terminate_all_sounds()
var/old_legacy
if(using_instrument)
using_instrument.songs_using -= src
old_legacy = (using_instrument.instrument_flags & INSTRUMENT_LEGACY)
using_instrument = null
cached_samples = null
cached_legacy_ext = null
@@ -162,7 +186,7 @@
if(istype(I))
using_instrument = I
I.songs_using += src
var/instrument_legacy = CHECK_BITFIELD(I.instrument_flags, INSTRUMENT_LEGACY)
var/instrument_legacy = (I.instrument_flags & INSTRUMENT_LEGACY)
if(instrument_legacy)
cached_legacy_ext = I.legacy_instrument_ext
cached_legacy_dir = I.legacy_instrument_path
@@ -170,23 +194,37 @@
else
cached_samples = I.samples
legacy = FALSE
if(isnull(old_legacy) || (old_legacy != instrument_legacy))
if(playing)
compile_chords()
/// THIS IS A BLOCKING CALL.
/**
* Attempts to start playing our song.
*/
/datum/song/proc/start_playing(mob/user)
if(playing)
return
if(!using_instrument?.ready())
to_chat(user, "<span class='warning'>An error has occured with [src]. Please reset the instrument.</span>")
return
compile_chords()
if(!length(compiled_chords))
to_chat(user, "<span class='warning'>Song is empty.</span>")
return
playing = TRUE
updateDialog()
updateDialog(user_playing)
//we can not afford to runtime, since we are going to be doing sound channel reservations and if we runtime it means we have a channel allocation leak.
//wrap the rest of the stuff to ensure stop_playing() is called.
last_process_decay = world.time
do_hearcheck()
elapsed_delay = 0
delay_by = 0
current_chord = 1
user_playing = user
START_PROCESSING(SSinstruments, src)
. = do_play_lines(user)
stop_playing()
/**
* Stops playing, terminating all sounds if in synthesized mode. Clears hearing_mobs.
*/
/datum/song/proc/stop_playing()
if(!playing)
return
@@ -196,42 +234,93 @@
STOP_PROCESSING(SSinstruments, src)
terminate_all_sounds(TRUE)
hearing_mobs.len = 0
updateDialog()
user_playing = null
/// THIS IS A BLOCKING CALL.
/datum/song/proc/do_play_lines(user)
if(!playing)
/**
* Processes our song.
*/
/datum/song/proc/process_song(wait)
if(!length(compiled_chords) || should_stop_playing(user_playing))
stop_playing()
return
do_hearcheck()
if(legacy)
do_play_lines_legacy(user)
else
do_play_lines_synthesized(user)
var/list/chord = compiled_chords[current_chord]
if(++elapsed_delay >= delay_by)
play_chord(chord)
elapsed_delay = 0
delay_by = tempodiv_to_delay(chord[length(chord)])
current_chord++
if(current_chord > length(compiled_chords))
if(repeat)
repeat--
current_chord = 1
return
else
stop_playing()
return
/**
* Converts a tempodiv to ticks to elapse before playing the next chord, taking into account our tempo.
*/
/datum/song/proc/tempodiv_to_delay(tempodiv)
if(!tempodiv)
tempodiv = 1 // no division by 0. some song converters tend to use 0 for when it wants to have no div, for whatever reason.
return max(1, round((tempo/tempodiv) / world.tick_lag, 1))
/**
* Compiles chords.
*/
/datum/song/proc/compile_chords()
legacy? compile_legacy() : compile_synthesized()
/**
* Plays a chord.
*/
/datum/song/proc/play_chord(list/chord)
// last value is timing information
for(var/i in 1 to (length(chord) - 1))
legacy? playkey_legacy(chord[i][1], chord[i][2], chord[i][3], user_playing) : playkey_synth(chord[i], user_playing)
/**
* Checks if we should halt playback.
*/
/datum/song/proc/should_stop_playing(mob/user)
return QDELETED(parent) || !using_instrument || !playing
/**
* Sanitizes tempo to a value that makes sense and fits the current world.tick_lag.
*/
/datum/song/proc/sanitize_tempo(new_tempo)
new_tempo = abs(new_tempo)
return clamp(round(new_tempo, world.tick_lag), world.tick_lag, 5 SECONDS)
/**
* Gets our beats per minute based on our tempo.
*/
/datum/song/proc/get_bpm()
return 600 / tempo
/**
* Sets our tempo from a beats-per-minute, sanitizing it to a valid number first.
*/
/datum/song/proc/set_bpm(bpm)
tempo = sanitize_tempo(600 / bpm)
/// Updates the window for our user. Override in subtypes.
/datum/song/proc/updateDialog(mob/user = usr)
/**
* Updates the window for our users. Override down the line.
*/
/datum/song/proc/updateDialog(mob/user)
ui_interact(user)
/datum/song/process(wait)
if(!playing)
return PROCESS_KILL
var/delay = world.time - last_process_decay
process_decay(delay)
last_process_decay = world.time
// it's expected this ticks at every world.tick_lag. if it lags, do not attempt to catch up.
process_song(world.tick_lag)
process_decay(world.tick_lag)
/**
* Updates our cached linear/exponential falloff stuff, saving calculations down the line.
*/
/datum/song/proc/update_sustain()
// Exponential is easy
cached_exponential_dropoff = sustain_exponential_dropoff
@@ -241,21 +330,33 @@
var/volume_decrease_per_decisecond = volume_diff / target_duration
cached_linear_dropoff = volume_decrease_per_decisecond
/**
* Setter for setting output volume.
*/
/datum/song/proc/set_volume(volume)
src.volume = clamp(volume, max(0, min_volume), min(100, max_volume))
update_sustain()
updateDialog()
/**
* Setter for setting how low the volume has to get before a note is considered "dead" and dropped
*/
/datum/song/proc/set_dropoff_volume(volume)
sustain_dropoff_volume = clamp(volume, INSTRUMENT_MIN_SUSTAIN_DROPOFF, 100)
update_sustain()
updateDialog()
/**
* Setter for setting exponential falloff factor.
*/
/datum/song/proc/set_exponential_drop_rate(drop)
sustain_exponential_dropoff = clamp(drop, INSTRUMENT_EXP_FALLOFF_MIN, INSTRUMENT_EXP_FALLOFF_MAX)
update_sustain()
updateDialog()
/**
* Setter for setting linear falloff duration.
*/
/datum/song/proc/set_linear_falloff_duration(duration)
sustain_linear_duration = clamp(duration, 0.1, INSTRUMENT_MAX_TOTAL_SUSTAIN)
update_sustain()
@@ -277,10 +378,8 @@
// subtype for handheld instruments, like violin
/datum/song/handheld
/datum/song/handheld/updateDialog(mob/user = usr)
if(user.machine != src)
return
parent.ui_interact(user)
/datum/song/handheld/updateDialog(mob/user)
parent.ui_interact(user || usr)
/datum/song/handheld/should_stop_playing(mob/user)
. = ..()
@@ -292,10 +391,8 @@
// subtype for stationary structures, like pianos
/datum/song/stationary
/datum/song/stationary/updateDialog(mob/user = usr)
if(user.machine != src)
return
parent.ui_interact(user)
/datum/song/stationary/updateDialog(mob/user)
parent.ui_interact(user || usr)
/datum/song/stationary/should_stop_playing(mob/user)
. = ..()
+48 -44
View File
@@ -1,48 +1,52 @@
/// Playing legacy instruments - None of the "advanced" like sound reservations and decay are invoked.
/datum/song/proc/do_play_lines_legacy(mob/user)
while(repeat >= 0)
var/cur_oct[7]
var/cur_acc[7]
for(var/i = 1 to 7)
cur_oct[i] = 3
cur_acc[i] = "n"
/**
* Compiles our lines into "chords" with filenames for legacy playback. This makes there have to be a bit of lag at the beginning of the song, but repeats will not have to parse it again, and overall playback won't be impacted by as much lag.
*/
/datum/song/proc/compile_legacy()
if(!length(src.lines))
return
var/list/lines = src.lines //cache for hyepr speed!
compiled_chords = list()
var/list/octaves = list(3, 3, 3, 3, 3, 3, 3)
var/list/accents = list("n", "n", "n", "n", "n", "n", "n")
for(var/line in lines)
var/list/chords = splittext(lowertext(line), ",")
for(var/chord in chords)
var/list/compiled_chord = list()
var/tempodiv = 1
var/list/notes_tempodiv = splittext(chord, "/")
var/len = length(notes_tempodiv)
if(len >= 2)
tempodiv = text2num(notes_tempodiv[2])
if(len) //some dunkass is going to do ,,,, to make 3 rests instead of ,/1 because there's no standardization so let's be prepared for that.
var/list/notes = splittext(notes_tempodiv[1], "-")
for(var/note in notes)
if(length(note) == 0)
continue
// 1-7, A-G
var/key = text2ascii(note) - 96
if((key < 1) || (key > 7))
continue
for(var/i in 2 to length(note))
var/oct_acc = copytext(note, i, i + 1)
var/num = text2num(oct_acc)
if(!num) //it's an accidental
accents[key] = oct_acc //if they misspelled it/fucked up that's on them lmao, no safety checks.
else //octave
octaves[key] = clamp(num, octave_min, octave_max)
compiled_chord[++compiled_chord.len] = list(key, accents[key], octaves[key])
compiled_chord += tempodiv //this goes last
if(length(compiled_chord))
compiled_chords[++compiled_chords.len] = compiled_chord
for(var/line in lines)
for(var/beat in splittext(lowertext(line), ","))
if(should_stop_playing(user))
return
var/list/notes = splittext(beat, "/")
if(length(notes)) //because some jack-butts are going to do ,,,, to symbolize 3 rests instead of something reasonable like ,/1.
for(var/note in splittext(notes[1], "-"))
if(length(note) == 0)
continue
var/cur_note = text2ascii(note) - 96
if(cur_note < 1 || cur_note > 7)
continue
for(var/i=2 to length(note))
var/ni = copytext(note,i,i+1)
if(!text2num(ni))
if(ni == "#" || ni == "b" || ni == "n")
cur_acc[cur_note] = ni
else if(ni == "s")
cur_acc[cur_note] = "#" // so shift is never required
else
cur_oct[cur_note] = text2num(ni)
playnote_legacy(cur_note, cur_acc[cur_note], cur_oct[cur_note])
if(notes.len >= 2 && text2num(notes[2]))
sleep(sanitize_tempo(tempo / text2num(notes[2])))
else
sleep(tempo)
if(should_stop_playing(user))
return
repeat--
updateDialog()
repeat = 0
// note is a number from 1-7 for A-G
// acc is either "b", "n", or "#"
// oct is 1-8 (or 9 for C)
/datum/song/proc/playnote_legacy(note, acc as text, oct)
/**
* Proc to play a legacy note. Just plays the sound to hearing mobs (and does hearcheck if necessary), no fancy channel/sustain/management.
*
* Arguments:
* * note is a number from 1-7 for A-G
* * acc is either "b", "n", or "#"
* * oct is 1-8 (or 9 for C)
*/
/datum/song/proc/playkey_legacy(note, acc as text, oct, mob/user)
// handle accidental -> B<>C of E<>F
if(acc == "b" && (note == 3 || note == 6)) // C or F
if(note == 3)
@@ -1,27 +1,7 @@
/datum/song/proc/do_play_lines_synthesized(mob/user)
compile_lines()
while(repeat >= 0)
if(should_stop_playing(user))
return
var/warned = FALSE
for(var/_chord in compiled_chords)
if(should_stop_playing(user))
return
var/list/chord = _chord
var/tempodiv = chord[chord.len]
for(var/i in 1 to chord.len - 1)
var/key = chord[i]
if(!playkey_synth(key))
if(!warned)
warned = TRUE
to_chat(user, "<span class='boldwarning'>Your instrument has ran out of channels. You might be playing your song too fast or be setting sustain to too high of a value. This warning will be suppressed for the rest of this cycle.</span>")
sleep(sanitize_tempo(tempo / (tempodiv || 1)))
repeat--
updateDialog()
repeat = 0
/// C-Db2-A-A4/2,A-B#4-C/3,/4,A,A-B-C as an example
/datum/song/proc/compile_lines()
/**
* Compiles our lines into "chords" with numbers. This makes there have to be a bit of lag at the beginning of the song, but repeats will not have to parse it again, and overall playback won't be impacted by as much lag.
*/
/datum/song/proc/compile_synthesized()
if(!length(src.lines))
return
var/list/lines = src.lines //cache for hyepr speed!
@@ -57,10 +37,12 @@
compiled_chord += tempodiv //this goes last
if(length(compiled_chord))
compiled_chords[++compiled_chords.len] = compiled_chord
CHECK_TICK
return compiled_chords
/datum/song/proc/playkey_synth(key)
/**
* Plays a specific numerical key from our instrument to anyone who can hear us.
* Does a hearing check if enough time has passed.
*/
/datum/song/proc/playkey_synth(key, mob/user)
if(can_noteshift)
key = clamp(key + note_shift, key_min, key_max)
if((world.time - MUSICIAN_HEARCHECK_MINDELAY) > last_hearcheck)
@@ -83,6 +65,9 @@
M.playsound_local(get_turf(parent), null, volume, FALSE, K.frequency, INSTRUMENT_DISTANCE_NO_FALLOFF, channel, null, copy, distance_multiplier = INSTRUMENT_DISTANCE_FALLOFF_BUFF)
// Could do environment and echo later but not for now
/**
* Stops all sounds we are "responsible" for. Only works in synthesized mode.
*/
/datum/song/proc/terminate_all_sounds(clear_channels = TRUE)
for(var/i in hearing_mobs)
terminate_sound_mob(i)
@@ -93,10 +78,16 @@
using_sound_channels = 0
SSsounds.free_datum_channels(src)
/**
* Stops all sounds we are responsible for in a given person. Only works in synthesized mode.
*/
/datum/song/proc/terminate_sound_mob(mob/M)
for(var/channel in channels_playing)
M.stop_sound_channel(text2num(channel))
/**
* Pops a channel we have reserved so we don't have to release and re-request them from SSsounds every time we play a note. This is faster.
*/
/datum/song/proc/pop_channel()
if(length(channels_idle)) //just pop one off of here if we have one available
. = text2num(channels_idle[1])
@@ -108,6 +99,12 @@
if(!isnull(.))
using_sound_channels++
/**
* Decays our channels and updates their volumes to mobs who can hear us.
*
* Arguments:
* * wait_ds - the deciseconds we should decay by. This is to compensate for any lag, as otherwise songs would get pretty nasty during high time dilation.
*/
/datum/song/proc/process_decay(wait_ds)
var/linear_dropoff = cached_linear_dropoff * wait_ds
var/exponential_dropoff = cached_exponential_dropoff ** wait_ds
@@ -35,18 +35,20 @@
return destinations
/obj/item/wormhole_jaunter/proc/activate(mob/user, adjacent)
/obj/item/wormhole_jaunter/proc/activate(mob/user, adjacent, force_entry = FALSE)
if(!turf_check(user))
return
var/list/L = get_destinations(user)
if(!L.len)
to_chat(user, "<span class='notice'>The [src.name] found no beacons in the world to anchor a wormhole to.</span>")
to_chat(user, "<span class='notice'>The [name] found no beacons in the world to anchor a wormhole to.</span>")
return
var/chosen_beacon = pick(L)
var/obj/effect/portal/jaunt_tunnel/J = new (get_turf(src), src, 100, null, FALSE, get_turf(chosen_beacon))
var/obj/effect/portal/jaunt_tunnel/J = new (get_turf(src), 100, null, FALSE, get_turf(chosen_beacon))
if(adjacent)
try_move_adjacent(J)
if(force_entry)
J.teleport(user, force = TRUE)
playsound(src,'sound/effects/sparks4.ogg',50,1)
qdel(src)
@@ -73,7 +75,7 @@
if(user.get_item_by_slot(SLOT_BELT) == src)
to_chat(user, "Your [name] activates, saving you from the chasm!</span>")
SSblackbox.record_feedback("tally", "jaunter", 1, "Chasm") // chasm automatic activation
activate(user, FALSE)
activate(user, FALSE, TRUE)
else
to_chat(user, "[src] is not attached to your belt, preventing it from saving you from the chasm. RIP.</span>")
@@ -84,9 +86,10 @@
icon_state = "bhole3"
desc = "A stable hole in the universe made by a wormhole jaunter. Turbulent doesn't even begin to describe how rough passage through one of these is, but at least it will always get you somewhere near a beacon."
mech_sized = TRUE //save your ripley
teleport_channel = TELEPORT_CHANNEL_WORMHOLE
innate_accuracy_penalty = 6
/obj/effect/portal/jaunt_tunnel/teleport(atom/movable/M)
/obj/effect/portal/jaunt_tunnel/teleport(atom/movable/M, force = FALSE)
. = ..()
if(.)
// KERPLUNK
@@ -14,14 +14,14 @@
name = "Standard"
icon_state = "standard"
/datum/sprite_accessory/xeno_dorsal/royal
name = "Royal"
icon_state = "royal"
/datum/sprite_accessory/xeno_dorsal/down
name = "Dorsal Down"
icon_state = "down"
/datum/sprite_accessory/xeno_dorsal/royal
name = "Royal"
icon_state = "royal"
/******************************************
************* Xeno Tails ******************
*******************************************/
@@ -57,14 +57,14 @@
name = "Standard"
icon_state = "standard"
/datum/sprite_accessory/xeno_head/royal
name = "royal"
icon_state = "royal"
/datum/sprite_accessory/xeno_head/hollywood
name = "hollywood"
icon_state = "hollywood"
/datum/sprite_accessory/xeno_head/royal
name = "royal"
icon_state = "royal"
/datum/sprite_accessory/xeno_head/warrior
name = "warrior"
icon_state = "warrior"
@@ -16,6 +16,12 @@
icon_state = "dtiger"
gender_specific = 1
/datum/sprite_accessory/body_markings/guilmon
name = "Guilmon"
icon_state = "guilmon"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/datum/sprite_accessory/body_markings/ltiger
name = "Light Tiger Body"
icon_state = "ltiger"
@@ -49,11 +55,6 @@
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
relevant_layers = null
/datum/sprite_accessory/mam_body_markings/plain
name = "Plain"
icon_state = "plain"
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/datum/sprite_accessory/mam_body_markings/redpanda
name = "Redpanda"
icon_state = "redpanda"
@@ -77,14 +78,14 @@
icon_state = "bellyslim"
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/datum/sprite_accessory/mam_body_markings/corgi
name = "Corgi"
icon_state = "corgi"
/datum/sprite_accessory/mam_body_markings/cow
name = "Bovine"
icon_state = "bovine"
/datum/sprite_accessory/mam_body_markings/corgi
name = "Corgi"
icon_state = "corgi"
/datum/sprite_accessory/mam_body_markings/corvid
name = "Corvid"
icon_state = "corvid"
@@ -139,15 +140,19 @@
name = "Hyena"
icon_state = "hyena"
/datum/sprite_accessory/mam_body_markings/lab
name = "Lab"
icon_state = "lab"
/datum/sprite_accessory/mam_body_markings/insect
name = "Insect"
icon_state = "insect"
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/datum/sprite_accessory/mam_body_markings/lab
name = "Lab"
icon_state = "lab"
/datum/sprite_accessory/mam_body_markings/orca
name = "Orca"
icon_state = "orca"
/datum/sprite_accessory/mam_body_markings/otie
name = "Otie"
icon_state = "otie"
@@ -156,14 +161,15 @@
name = "Otter"
icon_state = "otter"
/datum/sprite_accessory/mam_body_markings/orca
name = "Orca"
icon_state = "orca"
/datum/sprite_accessory/mam_body_markings/panther
name = "Panther"
icon_state = "panther"
/datum/sprite_accessory/mam_body_markings/plain
name = "Plain"
icon_state = "plain"
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/datum/sprite_accessory/mam_body_markings/possum
name = "Possum"
icon_state = "possum"
@@ -172,6 +178,10 @@
name = "Raccoon"
icon_state = "raccoon"
/datum/sprite_accessory/mam_body_markings/sergal
name = "Sergal"
icon_state = "sergal"
/datum/sprite_accessory/mam_body_markings/pede
name = "Scolipede"
icon_state = "scolipede"
@@ -181,18 +191,14 @@
name = "Shark"
icon_state = "shark"
/datum/sprite_accessory/mam_body_markings/skunk
name = "Skunk"
icon_state = "skunk"
/datum/sprite_accessory/mam_body_markings/sergal
name = "Sergal"
icon_state = "sergal"
/datum/sprite_accessory/mam_body_markings/shepherd
name = "Shepherd"
icon_state = "shepherd"
/datum/sprite_accessory/mam_body_markings/skunk
name = "Skunk"
icon_state = "skunk"
/datum/sprite_accessory/mam_body_markings/tajaran
name = "Tajaran"
icon_state = "tajaran"
@@ -232,75 +238,10 @@
icon_state = "none"
relevant_layers = null
/datum/sprite_accessory/insect_fluff/plain
name = "Plain"
icon_state = "plain"
/datum/sprite_accessory/insect_fluff/reddish
name = "Reddish"
icon_state = "redish"
/datum/sprite_accessory/insect_fluff/royal
name = "Royal"
icon_state = "royal"
/datum/sprite_accessory/insect_fluff/gothic
name = "Gothic"
icon_state = "gothic"
/datum/sprite_accessory/insect_fluff/lovers
name = "Lovers"
icon_state = "lovers"
/datum/sprite_accessory/insect_fluff/whitefly
name = "White Fly"
icon_state = "whitefly"
/datum/sprite_accessory/insect_fluff/punished
name = "Burnt Off"
icon_state = "punished"
/datum/sprite_accessory/insect_fluff/firewatch
name = "Firewatch"
icon_state = "firewatch"
/datum/sprite_accessory/insect_fluff/deathhead
name = "Deathshead"
icon_state = "deathhead"
/datum/sprite_accessory/insect_fluff/poison
name = "Poison"
icon_state = "poison"
/datum/sprite_accessory/insect_fluff/ragged
name = "Ragged"
icon_state = "ragged"
/datum/sprite_accessory/insect_fluff/moonfly
name = "Moon Fly"
icon_state = "moonfly"
/datum/sprite_accessory/insect_fluff/snow
name = "Snow"
icon_state = "snow"
/datum/sprite_accessory/insect_fluff/oakworm
name = "Oak Worm"
icon_state = "oakworm"
/datum/sprite_accessory/insect_fluff/jungle
name = "Jungle"
icon_state = "jungle"
/datum/sprite_accessory/insect_fluff/witchwing
name = "Witch Wing"
icon_state = "witchwing"
/datum/sprite_accessory/insect_fluff/colored
name = "Colored (Hair)"
icon_state = "snow"
color_src = HAIR
/datum/sprite_accessory/insect_fluff/colored1
name = "Colored (Primary)"
icon_state = "snow"
@@ -314,4 +255,69 @@
/datum/sprite_accessory/insect_fluff/colored3
name = "Colored (Tertiary)"
icon_state = "snow"
color_src = MUTCOLORS3
color_src = MUTCOLORS3
/datum/sprite_accessory/insect_fluff/colored
name = "Colored (Hair)"
icon_state = "snow"
color_src = HAIR
/datum/sprite_accessory/insect_fluff/deathhead
name = "Deathshead"
icon_state = "deathhead"
/datum/sprite_accessory/insect_fluff/firewatch
name = "Firewatch"
icon_state = "firewatch"
/datum/sprite_accessory/insect_fluff/gothic
name = "Gothic"
icon_state = "gothic"
/datum/sprite_accessory/insect_fluff/jungle
name = "Jungle"
icon_state = "jungle"
/datum/sprite_accessory/insect_fluff/lovers
name = "Lovers"
icon_state = "lovers"
/datum/sprite_accessory/insect_fluff/moonfly
name = "Moon Fly"
icon_state = "moonfly"
/datum/sprite_accessory/insect_fluff/oakworm
name = "Oak Worm"
icon_state = "oakworm"
/datum/sprite_accessory/insect_fluff/plain
name = "Plain"
icon_state = "plain"
/datum/sprite_accessory/insect_fluff/poison
name = "Poison"
icon_state = "poison"
/datum/sprite_accessory/insect_fluff/ragged
name = "Ragged"
icon_state = "ragged"
/datum/sprite_accessory/insect_fluff/reddish
name = "Reddish"
icon_state = "redish"
/datum/sprite_accessory/insect_fluff/royal
name = "Royal"
icon_state = "royal"
/datum/sprite_accessory/insect_fluff/snow
name = "Snow"
icon_state = "snow"
/datum/sprite_accessory/insect_fluff/whitefly
name = "White Fly"
icon_state = "whitefly"
/datum/sprite_accessory/insect_fluff/witchwing
name = "Witch Wing"
icon_state = "witchwing"
@@ -41,7 +41,7 @@
extra = TRUE
extra_color_src = NONE
/datum/sprite_accessory/ears/human/bigwolfdark
/datum/sprite_accessory/ears/human/bigwolfdark //ignore alphabetical sort here for ease-of-use
name = "Dark Big Wolf"
icon_state = "bigwolfdark"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
@@ -55,6 +55,12 @@
extra = TRUE
extra_color_src = NONE
/datum/sprite_accessory/ears/bunny
name = "Bunny"
icon_state = "bunny"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
/datum/sprite_accessory/ears/cat
name = "Cat"
icon_state = "cat"
@@ -74,6 +80,12 @@
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MUTCOLORS3
/datum/sprite_accessory/ears/lab
name = "Dog, Floppy"
icon_state = "lab"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
/datum/sprite_accessory/ears/human/eevee
name = "Eevee"
icon_state = "eevee"
@@ -115,12 +127,6 @@
icon_state = "jellyfish"
color_src = HAIR
/datum/sprite_accessory/ears/lab
name = "Dog, Floppy"
icon_state = "lab"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
/datum/sprite_accessory/ears/murid
name = "Murid"
icon_state = "murid"
@@ -133,18 +139,18 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
/datum/sprite_accessory/ears/human/pede
name = "Scolipede"
icon_state = "pede"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/ears/human/rabbit
name = "Rabbit"
icon_state = "rabbit"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
/datum/sprite_accessory/ears/human/pede
name = "Scolipede"
icon_state = "pede"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/ears/human/sergal
name = "Sergal"
icon_state = "sergal"
@@ -169,12 +175,6 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
/datum/sprite_accessory/ears/bunny
name = "Bunny"
icon_state = "bunny"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
/******************************************
*************** Furry Ears ****************
*******************************************/
@@ -216,7 +216,7 @@
extra = TRUE
extra_color_src = NONE
/datum/sprite_accessory/ears/mam_ears/bigwolfdark
/datum/sprite_accessory/ears/mam_ears/bigwolfdark //alphabetical sort ignored here for ease-of-use
name = "Dark Big Wolf"
icon_state = "bigwolfdark"
@@ -226,6 +226,10 @@
extra = TRUE
extra_color_src = NONE
/datum/sprite_accessory/ears/mam_ears/bunny
name = "Bunny"
icon_state = "bunny"
/datum/sprite_accessory/ears/mam_ears/cat
name = "Cat"
icon_state = "cat"
@@ -256,13 +260,11 @@
name = "Eevee"
icon_state = "eevee"
/datum/sprite_accessory/ears/mam_ears/elf
name = "Elf"
icon_state = "elf"
color_src = MUTCOLORS3
/datum/sprite_accessory/ears/mam_ears/elephant
name = "Elephant"
icon_state = "elephant"
@@ -283,15 +285,15 @@
name = "Husky"
icon_state = "wolf"
/datum/sprite_accessory/ears/mam_ears/kangaroo
name = "kangaroo"
icon_state = "kangaroo"
/datum/sprite_accessory/ears/mam_ears/jellyfish
name = "Jellyfish"
icon_state = "jellyfish"
color_src = HAIR
/datum/sprite_accessory/ears/mam_ears/kangaroo
name = "kangaroo"
icon_state = "kangaroo"
/datum/sprite_accessory/ears/mam_ears/lab
name = "Dog, Long"
icon_state = "lab"
@@ -304,18 +306,14 @@
name = "Otusian"
icon_state = "otie"
/datum/sprite_accessory/ears/mam_ears/squirrel
name = "Squirrel"
icon_state = "squirrel"
/datum/sprite_accessory/ears/mam_ears/rabbit
name = "Rabbit"
icon_state = "rabbit"
/datum/sprite_accessory/ears/mam_ears/pede
name = "Scolipede"
icon_state = "pede"
/datum/sprite_accessory/ears/mam_ears/rabbit
name = "Rabbit"
icon_state = "rabbit"
/datum/sprite_accessory/ears/mam_ears/sergal
name = "Sergal"
icon_state = "sergal"
@@ -324,10 +322,10 @@
name = "skunk"
icon_state = "skunk"
/datum/sprite_accessory/ears/mam_ears/squirrel
name = "Squirrel"
icon_state = "squirrel"
/datum/sprite_accessory/ears/mam_ears/wolf
name = "Wolf"
icon_state = "wolf"
/datum/sprite_accessory/ears/mam_ears/bunny
name = "Bunny"
icon_state = "bunny"
@@ -11,6 +11,10 @@
icon_state = "none"
relevant_layers = null
/datum/sprite_accessory/frills/aquatic
name = "Aquatic"
icon_state = "aqua"
/datum/sprite_accessory/frills/simple
name = "Simple"
icon_state = "simple"
@@ -18,7 +22,3 @@
/datum/sprite_accessory/frills/short
name = "Short"
icon_state = "short"
/datum/sprite_accessory/frills/aquatic
name = "Aquatic"
icon_state = "aqua"
@@ -6,6 +6,10 @@
gender = MALE // barf (unless you're a dorf, dorfs dig chix w/ beards :P)
// please make sure they're sorted alphabetically and categorized
/datum/sprite_accessory/facial_hair/shaved //this is exempt from the alphabetical sort
name = "Shaved"
icon_state = null
gender = NEUTER
/datum/sprite_accessory/facial_hair/threeoclock
name = "Beard (3 o\'Clock)"
@@ -135,11 +139,6 @@
name = "Mutton Chops with Moustache"
icon_state = "facial_muttonmus"
/datum/sprite_accessory/facial_hair/shaved
name = "Shaved"
icon_state = null
gender = NEUTER
/datum/sprite_accessory/facial_hair/sideburn
name = "Sideburns"
icon_state = "facial_sideburns"
@@ -9,6 +9,10 @@
// try to spell
// you do not need to define _s or _l sub-states, game automatically does this for you
/datum/sprite_accessory/hair/bald //this is exempt from the alphabetical sort
name = "Bald"
icon_state = "bald"
/datum/sprite_accessory/hair/afro
name = "Afro"
icon_state = "hair_afro"
@@ -25,10 +29,6 @@
name = "Ahoge"
icon_state = "hair_antenna"
/datum/sprite_accessory/hair/bald
name = "Bald"
icon_state = "bald"
/datum/sprite_accessory/hair/balding
name = "Balding Hair"
icon_state = "hair_e"
@@ -12,22 +12,10 @@
icon_state = "none"
relevant_layers = null
/datum/sprite_accessory/horns/simple
name = "Simple"
icon_state = "simple"
/datum/sprite_accessory/horns/short
name = "Short"
icon_state = "short"
/datum/sprite_accessory/horns/curled
name = "Curled"
icon_state = "curled"
/datum/sprite_accessory/horns/ram
name = "Ram"
icon_state = "ram"
/datum/sprite_accessory/horns/angler
name = "Angeler"
icon_state = "angler"
@@ -40,3 +28,15 @@
/datum/sprite_accessory/horns/guilmon
name = "Guilmon"
icon_state = "guilmon"
/datum/sprite_accessory/horns/ram
name = "Ram"
icon_state = "ram"
/datum/sprite_accessory/horns/simple
name = "Simple"
icon_state = "simple"
/datum/sprite_accessory/horns/short
name = "Short"
icon_state = "short"
@@ -11,96 +11,90 @@
name = "Blank"
icon_state = "blank"
/datum/sprite_accessory/screen/pink
name = "Pink"
icon_state = "pink"
/datum/sprite_accessory/screen/green
name = "Green"
icon_state = "green"
/datum/sprite_accessory/screen/red
name = "Red"
icon_state = "red"
/datum/sprite_accessory/screen/blue
name = "Blue"
icon_state = "blue"
/datum/sprite_accessory/screen/yellow
name = "Yellow"
icon_state = "yellow"
/datum/sprite_accessory/screen/shower
name = "Shower"
icon_state = "shower"
/datum/sprite_accessory/screen/nature
name = "Nature"
icon_state = "nature"
/datum/sprite_accessory/screen/eight
name = "Eight"
icon_state = "eight"
/datum/sprite_accessory/screen/goggles
name = "Goggles"
icon_state = "goggles"
/datum/sprite_accessory/screen/heart
name = "Heart"
icon_state = "heart"
/datum/sprite_accessory/screen/monoeye
name = "Mono eye"
icon_state = "monoeye"
/datum/sprite_accessory/screen/breakout
name = "Breakout"
icon_state = "breakout"
/datum/sprite_accessory/screen/purple
name = "Purple"
icon_state = "purple"
/datum/sprite_accessory/screen/scroll
name = "Scroll"
icon_state = "scroll"
/datum/sprite_accessory/screen/bsod
name = "BSOD"
icon_state = "bsod"
/datum/sprite_accessory/screen/console
name = "Console"
icon_state = "console"
/datum/sprite_accessory/screen/rgb
name = "RGB"
icon_state = "rgb"
/datum/sprite_accessory/screen/eight
name = "Eight"
icon_state = "eight"
/datum/sprite_accessory/screen/eyes
name = "Eyes"
icon_state = "eyes"
/datum/sprite_accessory/screen/ecgwave
name = "ECG wave"
icon_state = "ecgwave"
/datum/sprite_accessory/screen/green
name = "Green"
icon_state = "green"
/datum/sprite_accessory/screen/goggles
name = "Goggles"
icon_state = "goggles"
/datum/sprite_accessory/screen/golglider
name = "Gol Glider"
icon_state = "golglider"
/datum/sprite_accessory/screen/heart
name = "Heart"
icon_state = "heart"
/datum/sprite_accessory/screen/pink
name = "Pink"
icon_state = "pink"
/datum/sprite_accessory/screen/red
name = "Red"
icon_state = "red"
/datum/sprite_accessory/screen/monoeye
name = "Mono eye"
icon_state = "monoeye"
/datum/sprite_accessory/screen/nature
name = "Nature"
icon_state = "nature"
/datum/sprite_accessory/screen/purple
name = "Purple"
icon_state = "purple"
/datum/sprite_accessory/screen/rainbow
name = "Rainbow"
icon_state = "rainbow"
/datum/sprite_accessory/screen/sunburst
name = "Sunburst"
icon_state = "sunburst"
/datum/sprite_accessory/screen/static
name = "Static"
icon_state = "static"
//Oracle Station sprites
/datum/sprite_accessory/screen/bsod
name = "BSOD"
icon_state = "bsod"
/datum/sprite_accessory/screen/redtext
name = "Red Text"
icon_state = "retext"
/datum/sprite_accessory/screen/rgb
name = "RGB"
icon_state = "rgb"
/datum/sprite_accessory/screen/scroll
name = "Scroll"
icon_state = "scroll"
/datum/sprite_accessory/screen/shower
name = "Shower"
icon_state = "shower"
/datum/sprite_accessory/screen/sinewave
name = "Sine wave"
icon_state = "sinewave"
@@ -109,22 +103,25 @@
name = "Square wave"
icon_state = "squarwave"
/datum/sprite_accessory/screen/ecgwave
name = "ECG wave"
icon_state = "ecgwave"
/datum/sprite_accessory/screen/stars
name = "Stars"
icon_state = "stars"
/datum/sprite_accessory/screen/eyes
name = "Eyes"
icon_state = "eyes"
/datum/sprite_accessory/screen/static
name = "Static"
icon_state = "static"
/datum/sprite_accessory/screen/sunburst
name = "Sunburst"
icon_state = "sunburst"
/datum/sprite_accessory/screen/textdrop
name = "Text drop"
icon_state = "textdrop"
/datum/sprite_accessory/screen/stars
name = "Stars"
icon_state = "stars"
/datum/sprite_accessory/screen/yellow
name = "Yellow"
icon_state = "yellow"
/******************************************
************** IPC Antennas ***************
@@ -145,14 +142,6 @@
name = "Angled Antennae"
icon_state = "antennae"
/datum/sprite_accessory/antenna/tvantennae
name = "TV Antennae"
icon_state = "tvantennae"
/datum/sprite_accessory/antenna/cyberhead
name = "Cyberhead"
icon_state = "cyberhead"
/datum/sprite_accessory/antenna/antlers
name = "Antlers"
icon_state = "antlers"
@@ -160,3 +149,11 @@
/datum/sprite_accessory/antenna/crowned
name = "Crowned"
icon_state = "crowned"
/datum/sprite_accessory/antenna/cyberhead
name = "Cyberhead"
icon_state = "cyberhead"
/datum/sprite_accessory/antenna/tvantennae
name = "TV Antennae"
icon_state = "tvantennae"
@@ -49,6 +49,13 @@
relevant_layers = null
hide_legs = FALSE
/datum/sprite_accessory/taur/canine
name = "Canine"
icon_state = "canine"
taur_mode = STYLE_PAW_TAURIC
color_src = MUTCOLORS
extra = TRUE
/datum/sprite_accessory/taur/cow
name = "Cow"
icon_state = "cow"
@@ -95,6 +102,13 @@
color_src = MUTCOLORS
extra = TRUE
/datum/sprite_accessory/taur/feline
name = "Feline"
icon_state = "feline"
taur_mode = STYLE_PAW_TAURIC
color_src = MUTCOLORS
extra = TRUE
/datum/sprite_accessory/taur/horse
name = "Horse"
icon_state = "horse"
@@ -126,17 +140,3 @@
taur_mode = STYLE_SNEK_TAURIC
color_src = MUTCOLORS
hide_legs = USE_SNEK_CLIP_MASK
/datum/sprite_accessory/taur/canine
name = "Canine"
icon_state = "canine"
taur_mode = STYLE_PAW_TAURIC
color_src = MUTCOLORS
extra = TRUE
/datum/sprite_accessory/taur/feline
name = "Feline"
icon_state = "feline"
taur_mode = STYLE_PAW_TAURIC
color_src = MUTCOLORS
extra = TRUE
@@ -7,14 +7,19 @@
var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD)
return ((H.wear_mask && (H.wear_mask.flags_inv & HIDESNOUT)) || (H.head && (H.head.flags_inv & HIDESNOUT)) || !HD || HD.status == BODYPART_ROBOTIC)
/datum/sprite_accessory/snouts/sharp
name = "Sharp"
icon_state = "sharp"
/datum/sprite_accessory/snout/guilmon
name = "Guilmon"
icon_state = "guilmon"
color_src = MATRIXED
/datum/sprite_accessory/snouts/round
name = "Round"
icon_state = "round"
/datum/sprite_accessory/snouts/sharp
name = "Sharp"
icon_state = "sharp"
/datum/sprite_accessory/snouts/sharplight
name = "Sharp + Light"
icon_state = "sharplight"
@@ -23,11 +28,6 @@
name = "Round + Light"
icon_state = "roundlight"
/datum/sprite_accessory/snout/guilmon
name = "Guilmon"
icon_state = "guilmon"
color_src = MATRIXED
//christ this was a mistake, but it's here just in case someone wants to selectively fix -- Pooj
/************* Lizard compatable snoots ***********
/datum/sprite_accessory/snouts/bird
@@ -192,11 +192,19 @@
extra = TRUE
extra_color_src = MUTCOLORS3
/datum/sprite_accessory/snouts/mam_snouts/skulldog
name = "Skulldog"
icon_state = "skulldog"
/datum/sprite_accessory/snouts/mam_snouts/husky
name = "Husky"
icon_state = "husky"
/datum/sprite_accessory/snouts/mam_snouts/rhino
name = "Horn"
icon_state = "rhino"
extra = TRUE
extra_color_src = MATRIXED
extra = MUTCOLORS3
/datum/sprite_accessory/snouts/mam_snouts/rodent
name = "Rodent"
icon_state = "rodent"
/datum/sprite_accessory/snouts/mam_snouts/lcanid
name = "Mammal, Long"
@@ -226,32 +234,20 @@
name = "Mammal, Thick ALT"
icon_state = "wolfalt"
/datum/sprite_accessory/snouts/mam_snouts/redpanda
name = "WahCoon"
icon_state = "wah"
/datum/sprite_accessory/snouts/mam_snouts/redpandaalt
name = "WahCoon ALT"
icon_state = "wahalt"
/datum/sprite_accessory/snouts/mam_snouts/rhino
name = "Horn"
icon_state = "rhino"
extra = TRUE
extra = MUTCOLORS3
/datum/sprite_accessory/snouts/mam_snouts/rodent
name = "Rodent"
icon_state = "rodent"
/datum/sprite_accessory/snouts/mam_snouts/husky
name = "Husky"
icon_state = "husky"
/datum/sprite_accessory/snouts/mam_snouts/otie
name = "Otie"
icon_state = "otie"
/datum/sprite_accessory/snouts/mam_snouts/round
name = "Round"
icon_state = "round"
color_src = MUTCOLORS
/datum/sprite_accessory/snouts/mam_snouts/roundlight
name = "Round + Light"
icon_state = "roundlight"
color_src = MUTCOLORS
/datum/sprite_accessory/snouts/mam_snouts/pede
name = "Scolipede"
icon_state = "pede"
@@ -268,30 +264,33 @@
name = "hShark"
icon_state = "hshark"
/datum/sprite_accessory/snouts/mam_snouts/toucan
name = "Toucan"
icon_state = "toucan"
/datum/sprite_accessory/snouts/mam_snouts/sharp
name = "Sharp"
icon_state = "sharp"
color_src = MUTCOLORS
/datum/sprite_accessory/snouts/mam_snouts/round
name = "Round"
icon_state = "round"
color_src = MUTCOLORS
/datum/sprite_accessory/snouts/mam_snouts/sharplight
name = "Sharp + Light"
icon_state = "sharplight"
color_src = MUTCOLORS
/datum/sprite_accessory/snouts/mam_snouts/roundlight
name = "Round + Light"
icon_state = "roundlight"
color_src = MUTCOLORS
/datum/sprite_accessory/snouts/mam_snouts/skulldog
name = "Skulldog"
icon_state = "skulldog"
extra = TRUE
extra_color_src = MATRIXED
/datum/sprite_accessory/snouts/mam_snouts/toucan
name = "Toucan"
icon_state = "toucan"
/datum/sprite_accessory/snouts/mam_snouts/redpanda
name = "WahCoon"
icon_state = "wah"
/datum/sprite_accessory/snouts/mam_snouts/redpandaalt
name = "WahCoon ALT"
icon_state = "wahalt"
/******************************************
**************** Snouts *******************
@@ -318,6 +317,16 @@
extra = TRUE
extra_color_src = MUTCOLORS3
/datum/sprite_accessory/snouts/mam_snouts/frhino
name = "Horn (Top)"
icon_state = "frhino"
extra = TRUE
extra = MUTCOLORS3
/datum/sprite_accessory/snouts/mam_snouts/fhusky
name = "Husky (Top)"
icon_state = "fhusky"
/datum/sprite_accessory/snouts/mam_snouts/flcanid
name = "Mammal, Long (Top)"
icon_state = "flcanid"
@@ -346,27 +355,23 @@
name = "Mammal, Thick ALT (Top)"
icon_state = "fwolfalt"
/datum/sprite_accessory/snouts/mam_snouts/fredpanda
name = "WahCoon (Top)"
icon_state = "fwah"
/datum/sprite_accessory/snouts/mam_snouts/frhino
name = "Horn (Top)"
icon_state = "frhino"
extra = TRUE
extra = MUTCOLORS3
/datum/sprite_accessory/snouts/mam_snouts/fotie
name = "Otie (Top)"
icon_state = "fotie"
/datum/sprite_accessory/snouts/mam_snouts/frodent
name = "Rodent (Top)"
icon_state = "frodent"
/datum/sprite_accessory/snouts/mam_snouts/fhusky
name = "Husky (Top)"
icon_state = "fhusky"
/datum/sprite_accessory/snouts/mam_snouts/fround
name = "Round (Top)"
icon_state = "fround"
color_src = MUTCOLORS
/datum/sprite_accessory/snouts/mam_snouts/fotie
name = "Otie (Top)"
icon_state = "fotie"
/datum/sprite_accessory/snouts/mam_snouts/froundlight
name = "Round + Light (Top)"
icon_state = "froundlight"
color_src = MUTCOLORS
/datum/sprite_accessory/snouts/mam_snouts/fpede
name = "Scolipede (Top)"
@@ -380,26 +385,20 @@
name = "Shark (Top)"
icon_state = "fshark"
/datum/sprite_accessory/snouts/mam_snouts/ftoucan
name = "Toucan (Top)"
icon_state = "ftoucan"
/datum/sprite_accessory/snouts/mam_snouts/fsharp
name = "Sharp (Top)"
icon_state = "fsharp"
color_src = MUTCOLORS
/datum/sprite_accessory/snouts/mam_snouts/fround
name = "Round (Top)"
icon_state = "fround"
color_src = MUTCOLORS
/datum/sprite_accessory/snouts/mam_snouts/fsharplight
name = "Sharp + Light (Top)"
icon_state = "fsharplight"
color_src = MUTCOLORS
/datum/sprite_accessory/snouts/mam_snouts/froundlight
name = "Round + Light (Top)"
icon_state = "froundlight"
color_src = MUTCOLORS
/datum/sprite_accessory/snouts/mam_snouts/ftoucan
name = "Toucan (Top)"
icon_state = "ftoucan"
/datum/sprite_accessory/snouts/mam_snouts/fredpanda
name = "WahCoon (Top)"
icon_state = "fwah"
@@ -20,6 +20,10 @@
name = "Knee-high - Bee"
icon_state = "bee_knee"
/datum/sprite_accessory/underwear/socks/christmas_knee
name = "Knee-High - Christmas"
icon_state = "christmas_knee"
/datum/sprite_accessory/underwear/socks/commie_knee
name = "Knee-High - Commie"
icon_state = "commie_knee"
@@ -32,6 +36,14 @@
name = "Knee-high - Rainbow"
icon_state = "rainbow_knee"
/datum/sprite_accessory/underwear/socks/candycaner_knee
name = "Knee-High - Red Candy Cane"
icon_state = "candycaner_knee"
/datum/sprite_accessory/underwear/socks/candycaneg_knee //ignore alphabetisation for ease of use in scenarios like this
name = "Knee-High - Green Candy Cane"
icon_state = "candycaneg_knee"
/datum/sprite_accessory/underwear/socks/striped_knee
name = "Knee-high - Striped"
icon_state = "striped_knee"
@@ -46,18 +58,6 @@
name = "Knee-High - UK"
icon_state = "uk_knee"
/datum/sprite_accessory/underwear/socks/christmas_knee
name = "Knee-High - Christmas"
icon_state = "christmas_knee"
/datum/sprite_accessory/underwear/socks/candycaner_knee
name = "Knee-High - Red Candy Cane"
icon_state = "candycaner_knee"
/datum/sprite_accessory/underwear/socks/candycaneg_knee
name = "Knee-High - Green Candy Cane"
icon_state = "candycaneg_knee"
/datum/sprite_accessory/underwear/socks/socks_norm
name = "Normal"
icon_state = "socks_norm"
@@ -129,22 +129,34 @@
name = "Thigh-high - Bee"
icon_state = "bee_thigh"
/datum/sprite_accessory/underwear/socks/christmas_thigh
name = "Thigh-high - Christmas"
icon_state = "christmas_thigh"
/datum/sprite_accessory/underwear/socks/commie_thigh
name = "Thigh-high - Commie"
icon_state = "commie_thigh"
/datum/sprite_accessory/underwear/socks/usa_thigh
name = "Thigh-high - Freedom"
icon_state = "assblastusa_thigh"
/datum/sprite_accessory/underwear/socks/fishnet
name = "Thigh-high - Fishnet"
icon_state = "fishnet"
/datum/sprite_accessory/underwear/socks/usa_thigh
name = "Thigh-high - Freedom"
icon_state = "assblastusa_thigh"
/datum/sprite_accessory/underwear/socks/rainbow_thigh
name = "Thigh-high - Rainbow"
icon_state = "rainbow_thigh"
/datum/sprite_accessory/underwear/socks/candycaner_thigh
name = "Thigh-high - Red Candy Cane"
icon_state = "candycaner_thigh"
/datum/sprite_accessory/underwear/socks/candycaneg_thigh
name = "Thigh-high - Green Candy Cane"
icon_state = "candycaneg_thigh"
/datum/sprite_accessory/underwear/socks/striped_thigh
name = "Thigh-high - Striped"
icon_state = "striped_thigh"
@@ -157,16 +169,4 @@
/datum/sprite_accessory/underwear/socks/uk_thigh
name = "Thigh-high - UK"
icon_state = "uk_thigh"
/datum/sprite_accessory/underwear/socks/christmas_thigh
name = "Thigh-high - Christmas"
icon_state = "christmas_thigh"
/datum/sprite_accessory/underwear/socks/candycaner_thigh
name = "Thigh-high - Red Candy Cane"
icon_state = "candycaner_thigh"
/datum/sprite_accessory/underwear/socks/candycaneg_thigh
name = "Thigh-high - Green Candy Cane"
icon_state = "candycaneg_thigh"
icon_state = "uk_thigh"
@@ -21,21 +21,13 @@
name = "None"
icon_state = "none"
/datum/sprite_accessory/spines/short
name = "Short"
icon_state = "short"
/datum/sprite_accessory/spines/aqautic
name = "Aquatic"
icon_state = "aqua"
/datum/sprite_accessory/spines_animated/short
name = "Short"
icon_state = "short"
/datum/sprite_accessory/spines/shortmeme
name = "Short + Membrane"
icon_state = "shortmeme"
/datum/sprite_accessory/spines_animated/shortmeme
name = "Short + Membrane"
icon_state = "shortmeme"
/datum/sprite_accessory/spines_animated/aqautic
name = "Aquatic"
icon_state = "aqua"
/datum/sprite_accessory/spines/long
name = "Long"
@@ -53,10 +45,18 @@
name = "Long + Membrane"
icon_state = "longmeme"
/datum/sprite_accessory/spines/aqautic
name = "Aquatic"
icon_state = "aqua"
/datum/sprite_accessory/spines/short
name = "Short"
icon_state = "short"
/datum/sprite_accessory/spines_animated/aqautic
name = "Aquatic"
icon_state = "aqua"
/datum/sprite_accessory/spines_animated/short
name = "Short"
icon_state = "short"
/datum/sprite_accessory/spines/shortmeme
name = "Short + Membrane"
icon_state = "shortmeme"
/datum/sprite_accessory/spines_animated/shortmeme
name = "Short + Membrane"
icon_state = "shortmeme"
@@ -25,12 +25,6 @@
icon_state = "synthliz_tertunder"
//Synth body markings
/datum/sprite_accessory/mam_body_markings/synthliz
recommended_species = list("synthliz")
icon = 'modular_citadel/icons/mob/synthliz_body_markings.dmi'
name = "Synthetic Lizard - Plates"
icon_state = "synthlizscutes"
/datum/sprite_accessory/mam_body_markings/synthliz/synthliz_pecs
icon = 'modular_citadel/icons/mob/synthliz_body_markings.dmi'
name = "Synthetic Lizard - Pecs"
@@ -41,6 +35,12 @@
name = "Synthetic Lizard - Pecs Light"
icon_state = "synthlizpecslight"
/datum/sprite_accessory/mam_body_markings/synthliz
recommended_species = list("synthliz")
icon = 'modular_citadel/icons/mob/synthliz_body_markings.dmi'
name = "Synthetic Lizard - Plates"
icon_state = "synthlizscutes"
//Synth tails
/datum/sprite_accessory/tails/mam_tails/synthliz
recommended_species = list("synthliz")
@@ -70,17 +70,17 @@
name = "Synthetic Lizard - Curled"
icon_state = "synth_curled"
/datum/sprite_accessory/antenna/synthliz/synthliz_thick
/datum/sprite_accessory/antenna/synthliz/synth_horns
icon = 'modular_citadel/icons/mob/synthliz_antennas.dmi'
color_src = MUTCOLORS
name = "Synthetic Lizard - Thick"
icon_state = "synth_thick"
name = "Synthetic Lizard - Horns"
icon_state = "synth_horns"
/datum/sprite_accessory/antenna/synthliz/synth_thicklight
/datum/sprite_accessory/antenna/synthliz/synth_hornslight
icon = 'modular_citadel/icons/mob/synthliz_antennas.dmi'
color_src = MATRIXED
name = "Synthetic Lizard - Thick Light"
icon_state = "synth_thicklight"
name = "Synthetic Lizard - Horns Light"
icon_state = "synth_hornslight"
/datum/sprite_accessory/antenna/synthliz/synth_short
icon = 'modular_citadel/icons/mob/synthliz_antennas.dmi'
@@ -100,17 +100,17 @@
name = "Synthetic Lizard - Sharp Light"
icon_state = "synth_sharplight"
/datum/sprite_accessory/antenna/synthliz/synth_horns
/datum/sprite_accessory/antenna/synthliz/synthliz_thick
icon = 'modular_citadel/icons/mob/synthliz_antennas.dmi'
color_src = MUTCOLORS
name = "Synthetic Lizard - Horns"
icon_state = "synth_horns"
name = "Synthetic Lizard - Thick"
icon_state = "synth_thick"
/datum/sprite_accessory/antenna/synthliz/synth_hornslight
/datum/sprite_accessory/antenna/synthliz/synth_thicklight
icon = 'modular_citadel/icons/mob/synthliz_antennas.dmi'
color_src = MATRIXED
name = "Synthetic Lizard - Horns Light"
icon_state = "synth_hornslight"
name = "Synthetic Lizard - Thick Light"
icon_state = "synth_thicklight"
//Synth Taurs (Ported from Virgo)
/datum/sprite_accessory/taur/synthliz
@@ -18,38 +18,7 @@
/datum/sprite_accessory/tails_animated/lizard/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
return (((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric) || H.dna.species.mutant_bodyparts["tail_lizard"])
/datum/sprite_accessory/tails/lizard/smooth
name = "Smooth"
icon_state = "smooth"
/datum/sprite_accessory/tails_animated/lizard/smooth
name = "Smooth"
icon_state = "smooth"
/datum/sprite_accessory/tails/lizard/dtiger
name = "Dark Tiger"
icon_state = "dtiger"
/datum/sprite_accessory/tails_animated/lizard/dtiger
name = "Dark Tiger"
icon_state = "dtiger"
/datum/sprite_accessory/tails/lizard/ltiger
name = "Light Tiger"
icon_state = "ltiger"
/datum/sprite_accessory/tails_animated/lizard/ltiger
name = "Light Tiger"
icon_state = "ltiger"
/datum/sprite_accessory/tails/lizard/spikes
name = "Spikes"
icon_state = "spikes"
/datum/sprite_accessory/tails_animated/lizard/spikes
name = "Spikes"
icon_state = "spikes"
//this goes first regardless of alphabetical order
/datum/sprite_accessory/tails/lizard/none
name = "None"
icon_state = "None"
@@ -72,11 +41,13 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/body_markings/guilmon
name = "Guilmon"
icon_state = "guilmon"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/datum/sprite_accessory/tails/lizard/dtiger
name = "Dark Tiger"
icon_state = "dtiger"
/datum/sprite_accessory/tails_animated/lizard/dtiger
name = "Dark Tiger"
icon_state = "dtiger"
/datum/sprite_accessory/tails/lizard/guilmon
name = "Guilmon"
@@ -90,6 +61,30 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails/lizard/ltiger
name = "Light Tiger"
icon_state = "ltiger"
/datum/sprite_accessory/tails_animated/lizard/ltiger
name = "Light Tiger"
icon_state = "ltiger"
/datum/sprite_accessory/tails/lizard/smooth
name = "Smooth"
icon_state = "smooth"
/datum/sprite_accessory/tails_animated/lizard/smooth
name = "Smooth"
icon_state = "smooth"
/datum/sprite_accessory/tails/lizard/spikes
name = "Spikes"
icon_state = "spikes"
/datum/sprite_accessory/tails_animated/lizard/spikes
name = "Spikes"
icon_state = "spikes"
/******************************************
************** Human Tails ****************
*******************************************/
@@ -107,18 +102,6 @@
/datum/sprite_accessory/tails_animated/human/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
return (((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric)|| H.dna.species.mutant_bodyparts["tail_human"])
/datum/sprite_accessory/tails/human/ailurus
name = "Red Panda"
icon_state = "wah"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails_animated/human/ailurus
name = "Red Panda"
icon_state = "wah"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails/human/axolotl
name = "Axolotl"
icon_state = "axolotl"
@@ -199,6 +182,14 @@
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails/human/corvid
name = "Corvid"
icon_state = "crow"
/datum/sprite_accessory/tails_animated/human/corvid
name = "Corvid"
icon_state = "crow"
/datum/sprite_accessory/tails/human/cow
name = "Cow"
icon_state = "cow"
@@ -211,13 +202,25 @@
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails/human/corvid
name = "Corvid"
icon_state = "crow"
/datum/sprite_accessory/tails/human/dtiger
name = "Dark Tiger"
icon_state = "dtiger"
/datum/sprite_accessory/tails_animated/human/corvid
name = "Corvid"
icon_state = "crow"
/datum/sprite_accessory/tails_animated/human/dtiger
name = "Dark Tiger"
icon_state = "dtiger"
/datum/sprite_accessory/tails/human/datashark
name = "datashark"
icon_state = "datashark"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails_animated/human/datashark
name = "datashark"
icon_state = "datashark"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails/human/eevee
name = "Eevee"
@@ -298,7 +301,7 @@
color_src = MATRIXED
/datum/sprite_accessory/tails_animated/human/insect
name = "insect"
name = "Insect"
icon_state = "insect"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
@@ -315,6 +318,14 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails/human/ltiger
name = "Light Tiger"
icon_state = "ltiger"
/datum/sprite_accessory/tails_animated/human/ltiger
name = "Light Tiger"
icon_state = "ltiger"
/datum/sprite_accessory/tails/human/murid
name = "Murid"
icon_state = "murid"
@@ -327,18 +338,6 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails/human/otie
name = "Otusian"
icon_state = "otie"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails_animated/human/otie
name = "Otusian"
icon_state = "otie"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails/orca
name = "Orca"
icon_state = "orca"
@@ -351,15 +350,15 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails/human/pede
name = "Scolipede"
icon_state = "pede"
/datum/sprite_accessory/tails/human/otie
name = "Otusian"
icon_state = "otie"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails_animated/human/pede
name = "Scolipede"
icon_state = "pede"
/datum/sprite_accessory/tails_animated/human/otie
name = "Otusian"
icon_state = "otie"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
@@ -375,6 +374,30 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails/human/ailurus
name = "Red Panda"
icon_state = "wah"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails_animated/human/ailurus
name = "Red Panda"
icon_state = "wah"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails/human/pede
name = "Scolipede"
icon_state = "pede"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails_animated/human/pede
name = "Scolipede"
icon_state = "pede"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails/human/sergal
name = "Sergal"
icon_state = "sergal"
@@ -387,6 +410,18 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails/human/shark
name = "Shark"
icon_state = "shark"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails_animated/human/shark
name = "Shark"
icon_state = "shark"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails/human/skunk
name = "skunk"
icon_state = "skunk"
@@ -415,30 +450,6 @@
name = "Spikes"
icon_state = "spikes"
/datum/sprite_accessory/tails/human/shark
name = "Shark"
icon_state = "shark"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails_animated/human/shark
name = "Shark"
icon_state = "shark"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails/human/datashark
name = "datashark"
icon_state = "datashark"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails_animated/human/datashark
name = "datashark"
icon_state = "datashark"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails/human/straighttail
name = "Straight Tail"
icon_state = "straighttail"
@@ -495,22 +506,6 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails/human/dtiger
name = "Dark Tiger"
icon_state = "dtiger"
/datum/sprite_accessory/tails_animated/human/dtiger
name = "Dark Tiger"
icon_state = "dtiger"
/datum/sprite_accessory/tails/human/ltiger
name = "Light Tiger"
icon_state = "ltiger"
/datum/sprite_accessory/tails_animated/human/ltiger
name = "Light Tiger"
icon_state = "ltiger"
/datum/sprite_accessory/tails/human/wolf
name = "Wolf"
icon_state = "wolf"
@@ -554,16 +549,6 @@
icon_state = "none"
relevant_layers = null
/datum/sprite_accessory/tails/mam_tails/ailurus
name = "Red Panda"
icon_state = "wah"
extra = TRUE
/datum/sprite_accessory/tails_animated/mam_tails_animated/ailurus
name = "Red Panda"
icon_state = "wah"
extra = TRUE
/datum/sprite_accessory/tails/mam_tails/axolotl
name = "Axolotl"
icon_state = "axolotl"
@@ -638,6 +623,18 @@
name = "Cow"
icon_state = "cow"
/datum/sprite_accessory/tails/mam_tails/dtiger
name = "Dark Tiger"
icon_state = "dtiger"
color_src = MUTCOLORS
icon = 'icons/mob/mutant_bodyparts.dmi'
/datum/sprite_accessory/tails_animated/mam_tails_animated/dtiger
name = "Dark Tiger"
icon_state = "dtiger"
color_src = MUTCOLORS
icon = 'icons/mob/mutant_bodyparts.dmi'
/datum/sprite_accessory/tails/mam_tails/eevee
name = "Eevee"
icon_state = "eevee"
@@ -728,6 +725,18 @@ datum/sprite_accessory/tails/mam_tails/insect
name = "Lab"
icon_state = "lab"
/datum/sprite_accessory/tails/mam_tails/ltiger
name = "Light Tiger"
icon_state = "ltiger"
color_src = MUTCOLORS
icon = 'icons/mob/mutant_bodyparts.dmi'
/datum/sprite_accessory/tails_animated/mam_tails_animated/ltiger
name = "Light Tiger"
icon_state = "ltiger"
color_src = MUTCOLORS
icon = 'icons/mob/mutant_bodyparts.dmi'
/datum/sprite_accessory/tails/mam_tails/murid
name = "Murid"
icon_state = "murid"
@@ -736,14 +745,6 @@ datum/sprite_accessory/tails/mam_tails/insect
name = "Murid"
icon_state = "murid"
/datum/sprite_accessory/tails/mam_tails/otie
name = "Otusian"
icon_state = "otie"
/datum/sprite_accessory/tails_animated/mam_tails_animated/otie
name = "Otusian"
icon_state = "otie"
/datum/sprite_accessory/tails/mam_tails/orca
name = "Orca"
icon_state = "orca"
@@ -752,13 +753,13 @@ datum/sprite_accessory/tails/mam_tails/insect
name = "Orca"
icon_state = "orca"
/datum/sprite_accessory/tails/mam_tails/pede
name = "Scolipede"
icon_state = "pede"
/datum/sprite_accessory/tails/mam_tails/otie
name = "Otusian"
icon_state = "otie"
/datum/sprite_accessory/tails_animated/mam_tails_animated/pede
name = "Scolipede"
icon_state = "pede"
/datum/sprite_accessory/tails_animated/mam_tails_animated/otie
name = "Otusian"
icon_state = "otie"
/datum/sprite_accessory/tails/mam_tails/rabbit
name = "Rabbit"
@@ -768,6 +769,24 @@ datum/sprite_accessory/tails/mam_tails/insect
name = "Rabbit"
icon_state = "rabbit"
/datum/sprite_accessory/tails/mam_tails/ailurus
name = "Red Panda"
icon_state = "wah"
extra = TRUE
/datum/sprite_accessory/tails_animated/mam_tails_animated/ailurus
name = "Red Panda"
icon_state = "wah"
extra = TRUE
/datum/sprite_accessory/tails/mam_tails/pede
name = "Scolipede"
icon_state = "pede"
/datum/sprite_accessory/tails_animated/mam_tails_animated/pede
name = "Scolipede"
icon_state = "pede"
/datum/sprite_accessory/tails/mam_tails/sergal
name = "Sergal"
icon_state = "sergal"
@@ -776,6 +795,22 @@ datum/sprite_accessory/tails/mam_tails/insect
name = "Sergal"
icon_state = "sergal"
/datum/sprite_accessory/tails/mam_tails/shark
name = "Shark"
icon_state = "shark"
/datum/sprite_accessory/tails_animated/mam_tails_animated/shark
name = "Shark"
icon_state = "shark"
/datum/sprite_accessory/tails/mam_tails/shepherd
name = "Shepherd"
icon_state = "shepherd"
/datum/sprite_accessory/tails_animated/mam_tails_animated/shepherd
name = "Shepherd"
icon_state = "shepherd"
/datum/sprite_accessory/tails/mam_tails/skunk
name = "Skunk"
icon_state = "skunk"
@@ -808,22 +843,6 @@ datum/sprite_accessory/tails/mam_tails/insect
color_src = MUTCOLORS
icon = 'icons/mob/mutant_bodyparts.dmi'
/datum/sprite_accessory/tails/mam_tails/shark
name = "Shark"
icon_state = "shark"
/datum/sprite_accessory/tails_animated/mam_tails_animated/shark
name = "Shark"
icon_state = "shark"
/datum/sprite_accessory/tails/mam_tails/shepherd
name = "Shepherd"
icon_state = "shepherd"
/datum/sprite_accessory/tails_animated/mam_tails_animated/shepherd
name = "Shepherd"
icon_state = "shepherd"
/datum/sprite_accessory/tails/mam_tails/straighttail
name = "Straight Tail"
icon_state = "straighttail"
@@ -864,30 +883,6 @@ datum/sprite_accessory/tails/mam_tails/insect
name = "Tiger"
icon_state = "tiger"
/datum/sprite_accessory/tails/mam_tails/dtiger
name = "Dark Tiger"
icon_state = "dtiger"
color_src = MUTCOLORS
icon = 'icons/mob/mutant_bodyparts.dmi'
/datum/sprite_accessory/tails_animated/mam_tails_animated/dtiger
name = "Dark Tiger"
icon_state = "dtiger"
color_src = MUTCOLORS
icon = 'icons/mob/mutant_bodyparts.dmi'
/datum/sprite_accessory/tails/mam_tails/ltiger
name = "Light Tiger"
icon_state = "ltiger"
color_src = MUTCOLORS
icon = 'icons/mob/mutant_bodyparts.dmi'
/datum/sprite_accessory/tails_animated/mam_tails_animated/ltiger
name = "Light Tiger"
icon_state = "ltiger"
color_src = MUTCOLORS
icon = 'icons/mob/mutant_bodyparts.dmi'
/datum/sprite_accessory/tails/mam_tails/wolf
name = "Wolf"
icon_state = "wolf"
@@ -12,6 +12,38 @@
// please make sure they're sorted alphabetically and categorized
/datum/sprite_accessory/underwear/top/cowboyshirt
name = "Cowboy Shirt Black"
icon_state = "cowboyshirt"
/datum/sprite_accessory/underwear/top/cowboyshirt/red
name = "Cowboy Shirt Red"
icon_state = "cowboyshirt_red"
/datum/sprite_accessory/underwear/top/cowboyshirt/navy
name = "Cowboy Shirt Navy"
icon_state = "cowboyshirt_navy"
/datum/sprite_accessory/underwear/top/cowboyshirt/white
name = "Cowboy Shirt White"
icon_state = "cowboyshirt_white"
/datum/sprite_accessory/underwear/top/cowboyshirt/s
name = "Cowboy Shirt Shortsleeved Black"
icon_state = "cowboyshirt_s"
/datum/sprite_accessory/underwear/top/cowboyshirt/red/s
name = "Cowboy Shirt Shortsleeved Red"
icon_state = "cowboyshirt_reds"
/datum/sprite_accessory/underwear/top/cowboyshirt/navy/s
name = "Cowboy Shirt Shortsleeved Navy"
icon_state = "cowboyshirt_navys"
/datum/sprite_accessory/underwear/top/cowboyshirt/white/s
name = "Cowboy Shirt Shortsleeved White"
icon_state = "cowboyshirt_whites"
/datum/sprite_accessory/underwear/top/longjon
name = "Long John Shirt"
icon_state = "ljont"
@@ -30,36 +62,6 @@
icon_state = "undershirt"
has_color = TRUE
/datum/sprite_accessory/underwear/top/bowlingw
name = "Shirt - Bowling"
icon_state = "bowlingw"
has_color = TRUE
/datum/sprite_accessory/underwear/top/bowling
name = "Shirt, Bowling - Red"
icon_state = "bowling"
/datum/sprite_accessory/underwear/top/bowlingp
name = "Shirt, Bowling - Pink"
icon_state = "bowlingp"
/datum/sprite_accessory/underwear/top/bowlinga
name = "Shirt, Bowling - Aqua"
icon_state = "bowlinga"
/datum/sprite_accessory/underwear/top/bluejersey
name = "Shirt, Jersey - Blue"
icon_state = "shirt_bluejersey"
/datum/sprite_accessory/underwear/top/redjersey
name = "Shirt, Jersey - Red"
icon_state = "shirt_redjersey"
/datum/sprite_accessory/underwear/top/polo
name = "Shirt - Polo"
icon_state = "polo"
has_color = TRUE
/datum/sprite_accessory/underwear/top/alienshirt
name = "Shirt - Alien"
icon_state = "shirt_alien"
@@ -72,6 +74,23 @@
name = "Shirt - Bee"
icon_state = "bee_shirt"
/datum/sprite_accessory/underwear/top/bowlingw
name = "Shirt - Bowling"
icon_state = "bowlingw"
has_color = TRUE
/datum/sprite_accessory/underwear/top/bowlinga
name = "Shirt, Bowling - Aqua"
icon_state = "bowlinga"
/datum/sprite_accessory/underwear/top/bowling
name = "Shirt, Bowling - Red"
icon_state = "bowling"
/datum/sprite_accessory/underwear/top/bowlingp
name = "Shirt, Bowling - Pink"
icon_state = "bowlingp"
/datum/sprite_accessory/underwear/top/clownshirt
name = "Shirt - Clown"
icon_state = "shirt_clown"
@@ -88,6 +107,14 @@
name = "Shirt - I Love NT"
icon_state = "ilovent"
/datum/sprite_accessory/underwear/top/bluejersey
name = "Shirt, Jersey - Blue"
icon_state = "shirt_bluejersey"
/datum/sprite_accessory/underwear/top/redjersey
name = "Shirt, Jersey - Red"
icon_state = "shirt_redjersey"
/datum/sprite_accessory/underwear/top/lover
name = "Shirt - Lover"
icon_state = "lover"
@@ -112,6 +139,11 @@
name = "Shirt - Pogoman"
icon_state = "pogoman"
/datum/sprite_accessory/underwear/top/polo
name = "Shirt - Polo"
icon_state = "polo"
has_color = TRUE
/datum/sprite_accessory/underwear/top/question
name = "Shirt - Question"
icon_state = "shirt_question"
@@ -120,6 +152,23 @@
name = "Shirt - Skull"
icon_state = "shirt_skull"
/datum/sprite_accessory/underwear/top/shortsleeve
name = "Shirt - Short Sleeved"
icon_state = "shortsleeve"
has_color = TRUE
/datum/sprite_accessory/underwear/top/blueshirtsport
name = "Shirt, Sports - Blue"
icon_state = "blueshirtsport"
/datum/sprite_accessory/underwear/top/greenshirtsport
name = "Shirt, Sports - Green"
icon_state = "greenshirtsport"
/datum/sprite_accessory/underwear/top/redshirtsport
name = "Shirt, Sports - Red"
icon_state = "redshirtsport"
/datum/sprite_accessory/underwear/top/ss13
name = "Shirt - SS13"
icon_state = "shirt_ss13"
@@ -141,27 +190,6 @@
name = "Shirt - USA"
icon_state = "shirt_assblastusa"
/datum/sprite_accessory/underwear/top/shortsleeve
name = "Shirt - Short Sleeved"
icon_state = "shortsleeve"
has_color = TRUE
/datum/sprite_accessory/underwear/top/blueshirtsport
name = "Shirt, Sports - Blue"
icon_state = "blueshirtsport"
/datum/sprite_accessory/underwear/top/greenshirtsport
name = "Shirt, Sports - Green"
icon_state = "greenshirtsport"
/datum/sprite_accessory/underwear/top/redshirtsport
name = "Shirt, Sports - Red"
icon_state = "redshirtsport"
/datum/sprite_accessory/underwear/top/tankfire
name = "Tank Top - Fire"
icon_state = "tank_fire"
/datum/sprite_accessory/underwear/top/tanktop
name = "Tank Top"
icon_state = "tanktop"
@@ -172,6 +200,10 @@
icon_state = "tanktop_alt"
has_color = TRUE
/datum/sprite_accessory/underwear/top/tankfire
name = "Tank Top - Fire"
icon_state = "tank_fire"
/datum/sprite_accessory/underwear/top/tanktop_midriff
name = "Tank Top - Midriff"
icon_state = "tank_midriff"
@@ -192,6 +224,8 @@
name = "Tank top - Sun"
icon_state = "tank_sun"
//feminine accessories from here on
/datum/sprite_accessory/underwear/top/babydoll
name = "Baby-Doll"
icon_state = "babydoll"
@@ -210,15 +244,25 @@
has_color = TRUE
gender = FEMALE
/datum/sprite_accessory/underwear/top/bra_thin
name = "Bra - Thin"
icon_state = "bra_thin"
has_color = TRUE
/datum/sprite_accessory/underwear/top/bra_beekini
name = "Bra - Bee-kini"
icon_state = "bra_bee-kini"
gender = FEMALE
/datum/sprite_accessory/underwear/top/bra_kinky
name = "Bra - Kinky Black"
icon_state = "bra_kinky"
/datum/sprite_accessory/underwear/top/bra_binder
name = "Bra (binder)"
icon_state = "bra_binder"
has_color = TRUE
/datum/sprite_accessory/underwear/top/bra_binder_strapless
name = "Bra (binder, strapless)"
icon_state = "bra_binder_strapless"
has_color = TRUE
/datum/sprite_accessory/underwear/top/bra_commie
name = "Bra - Commie"
icon_state = "bra_commie"
gender = FEMALE
/datum/sprite_accessory/underwear/top/bra_freedom
@@ -226,33 +270,17 @@
icon_state = "bra_assblastusa"
gender = FEMALE
/datum/sprite_accessory/underwear/top/bra_commie
name = "Bra - Commie"
icon_state = "bra_commie"
gender = FEMALE
/datum/sprite_accessory/underwear/top/bra_beekini
name = "Bra - Bee-kini"
icon_state = "bra_bee-kini"
gender = FEMALE
/datum/sprite_accessory/underwear/top/bra_uk
name = "Bra - UK"
icon_state = "bra_uk"
gender = FEMALE
/datum/sprite_accessory/underwear/top/bra_neko
name = "Bra - Neko"
icon_state = "bra_neko"
has_color = TRUE
gender = FEMALE
/datum/sprite_accessory/underwear/top/halterneck_bra
name = "Bra - Halterneck"
icon_state = "halterneck_bra"
has_color = TRUE
gender = FEMALE
/datum/sprite_accessory/underwear/top/bra_kinky
name = "Bra - Kinky Black"
icon_state = "bra_kinky"
gender = FEMALE
/datum/sprite_accessory/underwear/top/sports_bra
name = "Bra, Sports"
icon_state = "sports_bra"
@@ -283,9 +311,21 @@
has_color = TRUE
gender = FEMALE
/datum/sprite_accessory/underwear/top/fishnet_sleeves
name = "Fishnet - sleeves"
icon_state = "fishnet_sleeves"
/datum/sprite_accessory/underwear/top/bra_thin
name = "Bra - Thin"
icon_state = "bra_thin"
has_color = TRUE
gender = FEMALE
/datum/sprite_accessory/underwear/top/bra_neko
name = "Bra - Neko"
icon_state = "bra_neko"
has_color = TRUE
gender = FEMALE
/datum/sprite_accessory/underwear/top/bra_uk
name = "Bra - UK"
icon_state = "bra_uk"
gender = FEMALE
/datum/sprite_accessory/underwear/top/fishnet_gloves
@@ -293,6 +333,11 @@
icon_state = "fishnet_gloves"
gender = FEMALE
/datum/sprite_accessory/underwear/top/fishnet_sleeves
name = "Fishnet - sleeves"
icon_state = "fishnet_sleeves"
gender = FEMALE
/datum/sprite_accessory/underwear/top/fishnet_base
name = "Fishnet - top"
icon_state = "fishnet_body"
@@ -315,45 +360,3 @@
icon_state = "tubetop"
has_color = TRUE
gender = FEMALE
/datum/sprite_accessory/underwear/top/cowboyshirt
name = "Cowboy Shirt Black"
icon_state = "cowboyshirt"
/datum/sprite_accessory/underwear/top/cowboyshirt/s
name = "Cowboy Shirt Shortsleeved Black"
icon_state = "cowboyshirt_s"
/datum/sprite_accessory/underwear/top/cowboyshirt/white
name = "Cowboy Shirt White"
icon_state = "cowboyshirt_white"
/datum/sprite_accessory/underwear/top/cowboyshirt/white/s
name = "Cowboy Shirt Shortsleeved White"
icon_state = "cowboyshirt_whites"
/datum/sprite_accessory/underwear/top/cowboyshirt/navy
name = "Cowboy Shirt Navy"
icon_state = "cowboyshirt_navy"
/datum/sprite_accessory/underwear/top/cowboyshirt/navy/s
name = "Cowboy Shirt Shortsleeved Navy"
icon_state = "cowboyshirt_navys"
/datum/sprite_accessory/underwear/top/cowboyshirt/red
name = "Cowboy Shirt Red"
icon_state = "cowboyshirt_red"
/datum/sprite_accessory/underwear/top/cowboyshirt/red/s
name = "Cowboy Shirt Shortsleeved Red"
icon_state = "cowboyshirt_reds"
/datum/sprite_accessory/underwear/top/bra_binder
name = "Bra (binder)"
icon_state = "bra_binder"
has_color = TRUE
/datum/sprite_accessory/underwear/top/bra_binder_strapless
name = "Bra (binder, strapless)"
icon_state = "bra_binder_strapless"
has_color = TRUE
@@ -10,18 +10,6 @@
icon_state = null
covers_groin = FALSE
/datum/sprite_accessory/underwear/bottom/mankini
name = "Mankini"
icon_state = "mankini"
has_color = TRUE
gender = MALE
/datum/sprite_accessory/underwear/bottom/male_kinky
name = "Jockstrap"
icon_state = "jockstrap"
has_color = TRUE
gender = MALE
/datum/sprite_accessory/underwear/bottom/briefs
name = "Briefs"
icon_state = "briefs"
@@ -77,6 +65,26 @@
has_digitigrade = TRUE
has_color = TRUE
/datum/sprite_accessory/underwear/bottom/male_kinky
name = "Jockstrap"
icon_state = "jockstrap"
has_color = TRUE
gender = MALE
/datum/sprite_accessory/underwear/bottom/longjon
name = "Long John Bottoms"
icon_state = "ljonb"
has_digitigrade = TRUE
has_color = TRUE
/datum/sprite_accessory/underwear/bottom/mankini
name = "Mankini"
icon_state = "mankini"
has_color = TRUE
gender = MALE
//feminine underwear from here on
/datum/sprite_accessory/underwear/bottom/panties
name = "Panties"
icon_state = "panties"
@@ -89,11 +97,6 @@
has_color = TRUE
gender = FEMALE
/datum/sprite_accessory/underwear/bottom/fishnet_lower
name = "Panties - Fishnet"
icon_state = "fishnet_lower"
gender = FEMALE
/datum/sprite_accessory/underwear/bottom/female_beekini
name = "Panties - Bee-kini"
icon_state = "panties_bee-kini"
@@ -104,6 +107,11 @@
icon_state = "panties_commie"
gender = FEMALE
/datum/sprite_accessory/underwear/bottom/fishnet_lower
name = "Panties - Fishnet"
icon_state = "fishnet_lower"
gender = FEMALE
/datum/sprite_accessory/underwear/bottom/female_usastripe
name = "Panties - Freedom"
icon_state = "panties_assblastusa"
@@ -114,11 +122,6 @@
icon_state = "panties_kinky"
gender = FEMALE
/datum/sprite_accessory/underwear/bottom/panties_uk
name = "Panties - UK"
icon_state = "panties_uk"
gender = FEMALE
/datum/sprite_accessory/underwear/bottom/panties_neko
name = "Panties - Neko"
icon_state = "panties_neko"
@@ -149,17 +152,10 @@
has_color = TRUE
gender = FEMALE
/datum/sprite_accessory/underwear/bottom/longjon
name = "Long John Bottoms"
icon_state = "ljonb"
has_digitigrade = TRUE
has_color = TRUE
/datum/sprite_accessory/underwear/bottom/swimsuit_red
name = "Swimsuit, One Piece - Red"
icon_state = "swimming_red"
/datum/sprite_accessory/underwear/bottom/panties_uk
name = "Panties - UK"
icon_state = "panties_uk"
gender = FEMALE
covers_chest = TRUE
/datum/sprite_accessory/underwear/bottom/swimsuit
name = "Swimsuit, One Piece - Black"
@@ -173,6 +169,12 @@
gender = FEMALE
covers_chest = TRUE
/datum/sprite_accessory/underwear/bottom/swimsuit_red
name = "Swimsuit, One Piece - Red"
icon_state = "swimming_red"
gender = FEMALE
covers_chest = TRUE
/datum/sprite_accessory/underwear/bottom/thong
name = "Thong"
icon_state = "thong"
@@ -184,5 +186,3 @@
icon_state = "thong_babydoll"
has_color = TRUE
gender = FEMALE
@@ -58,6 +58,10 @@
dimension_y = 34
relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER)
/datum/sprite_accessory/deco_wings/atlas
name = "Atlas"
icon_state = "atlas"
/datum/sprite_accessory/deco_wings/bat
name = "Bat"
icon_state = "bat"
@@ -66,6 +70,10 @@
name = "Bee"
icon_state = "bee"
/datum/sprite_accessory/deco_wings/deathhead
name = "Deathshead"
icon_state = "deathhead"
/datum/sprite_accessory/deco_wings/fairy
name = "Fairy"
icon_state = "fairy"
@@ -74,14 +82,6 @@
name = "Feathery"
icon_state = "feathery"
/datum/sprite_accessory/deco_wings/atlas
name = "Atlas"
icon_state = "atlas"
/datum/sprite_accessory/deco_wings/deathhead
name = "Deathshead"
icon_state = "deathhead"
/datum/sprite_accessory/deco_wings/firewatch
name = "Firewatch"
icon_state = "firewatch"
@@ -150,6 +150,10 @@
icon_state = "none"
relevant_layers = null
/datum/sprite_accessory/insect_wings/atlas
name = "Atlas"
icon_state = "atlas"
/datum/sprite_accessory/insect_wings/bat
name = "Bat"
icon_state = "bat"
@@ -158,6 +162,10 @@
name = "Bee"
icon_state = "bee"
/datum/sprite_accessory/insect_wings/deathhead
name = "Deathshead"
icon_state = "deathhead"
/datum/sprite_accessory/insect_wings/fairy
name = "Fairy"
icon_state = "fairy"
@@ -166,14 +174,6 @@
name = "Feathery"
icon_state = "feathery"
/datum/sprite_accessory/insect_wings/atlas
name = "Atlas"
icon_state = "atlas"
/datum/sprite_accessory/insect_wings/deathhead
name = "Deathshead"
icon_state = "deathhead"
/datum/sprite_accessory/insect_wings/firewatch
name = "Firewatch"
icon_state = "firewatch"
@@ -182,6 +182,10 @@
name = "Gothic"
icon_state = "gothic"
/datum/sprite_accessory/insect_wings/jungle
name = "Jungle"
icon_state = "jungle"
/datum/sprite_accessory/insect_wings/lovers
name = "Lovers"
icon_state = "lovers"
@@ -198,6 +202,10 @@
name = "Moon Fly"
icon_state = "moonfly"
/datum/sprite_accessory/insect_wings/oakworm
name = "Oak Worm"
icon_state = "oakworm"
/datum/sprite_accessory/insect_wings/plain
name = "Plain"
icon_state = "plain"
@@ -230,14 +238,6 @@
name = "White Fly"
icon_state = "whitefly"
/datum/sprite_accessory/insect_wings/oakworm
name = "Oak Worm"
icon_state = "oakworm"
/datum/sprite_accessory/insect_wings/jungle
name = "Jungle"
icon_state = "jungle"
/datum/sprite_accessory/insect_wings/witchwing
name = "Witch Wing"
icon_state = "witchwing"
+2 -2
View File
@@ -87,7 +87,7 @@
if(user != src && (user.a_intent == INTENT_HELP || user.a_intent == INTENT_DISARM))
for(var/datum/surgery/S in surgeries)
if(S.next_step(user,user.a_intent))
return 1
return STOP_ATTACK_PROC_CHAIN
if(!all_wounds || !(user.a_intent == INTENT_HELP || user == src))
return ..()
@@ -95,7 +95,7 @@
for(var/i in shuffle(all_wounds))
var/datum/wound/W = i
if(W.try_treating(I, user))
return 1
return STOP_ATTACK_PROC_CHAIN
return ..()
@@ -7,6 +7,11 @@
message = "cries."
emote_type = EMOTE_AUDIBLE
/datum/emote/living/carbon/human/cry/run_emote(mob/user, params)
. = ..()
if(. && isipcperson(user))
do_fake_sparks(5,FALSE,user)
/datum/emote/living/carbon/human/dap
key = "dap"
key_third_person = "daps"
@@ -187,3 +192,71 @@
key_third_person = "chimes"
message = "chimes."
sound = 'sound/machines/chime.ogg'
//rock paper scissors emote handling
/mob/living/carbon/human/proc/beginRockPaperScissors(var/chosen_move)
GLOB.rockpaperscissors_players[src] = list(chosen_move, ROCKPAPERSCISSORS_NOT_DECIDED)
do_after_advanced(src, ROCKPAPERSCISSORS_TIME_LIMIT, src, DO_AFTER_REQUIRES_USER_ON_TURF|DO_AFTER_NO_COEFFICIENT|DO_AFTER_NO_PROGRESSBAR|DO_AFTER_DISALLOW_MOVING_ABSOLUTE_USER, CALLBACK(src, .proc/rockpaperscissors_tick))
var/new_entry = GLOB.rockpaperscissors_players[src]
if(new_entry[2] == ROCKPAPERSCISSORS_NOT_DECIDED)
to_chat(src, "You put your hand back down.")
GLOB.rockpaperscissors_players -= src
/mob/living/carbon/human/proc/rockpaperscissors_tick() //called every cycle of the progress bar for rock paper scissors while waiting for an opponent
var/mob/living/carbon/human/opponent
for(var/mob/living/carbon/human/potential_opponent in (GLOB.rockpaperscissors_players - src)) //dont play against yourself
if(get_dist(src, potential_opponent) <= ROCKPAPERSCISSORS_RANGE)
opponent = potential_opponent
break
if(opponent)
//we found an opponent before they found us
var/move_to_number = list("rock" = 0, "paper" = 1, "scissors" = 2)
var/our_move = move_to_number[GLOB.rockpaperscissors_players[src][1]]
var/their_move = move_to_number[GLOB.rockpaperscissors_players[opponent][1]]
var/result_us = ROCKPAPERSCISSORS_WIN
var/result_them = ROCKPAPERSCISSORS_LOSE
if(our_move == their_move)
result_us = ROCKPAPERSCISSORS_TIE
result_them = ROCKPAPERSCISSORS_TIE
else
if(((our_move + 1) % 3) == their_move)
result_us = ROCKPAPERSCISSORS_LOSE
result_them = ROCKPAPERSCISSORS_WIN
//we decided our results so set them in the list
GLOB.rockpaperscissors_players[src][2] = result_us
GLOB.rockpaperscissors_players[opponent][2] = result_them
//show what happened
src.visible_message("<b>[src]</b> makes [GLOB.rockpaperscissors_players[src][1]] with their hand!")
opponent.visible_message("<b>[opponent]</b> makes [GLOB.rockpaperscissors_players[opponent][1]] with their hands!")
switch(result_us)
if(ROCKPAPERSCISSORS_TIE)
src.visible_message("It was a tie!")
if(ROCKPAPERSCISSORS_WIN)
src.visible_message("<b>[src]</b> wins!")
if(ROCKPAPERSCISSORS_LOSE)
src.visible_message("<b>[opponent]</b> wins!")
//make the progress bar end so that each player can handle the result
return DO_AFTER_STOP
//no opponent was found, so keep searching
return DO_AFTER_PROCEED
//the actual emotes
/datum/emote/living/carbon/human/rockpaperscissors
message = "is attempting to play rock paper scissors!"
/datum/emote/living/carbon/human/rockpaperscissors/rock
key = "rock"
/datum/emote/living/carbon/human/rockpaperscissors/paper
key = "paper"
/datum/emote/living/carbon/human/rockpaperscissors/scissors
key = "scissors"
/datum/emote/living/carbon/human/rockpaperscissors/run_emote(mob/living/carbon/human/user, params)
if(!(user in GLOB.rockpaperscissors_players)) //no using the emote again while already playing!
. = ..()
user.beginRockPaperScissors(key)
@@ -114,6 +114,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
/// Our default override for typing indicator state
var/typing_indicator_state
//the ids you can use for your species, if empty, it means default only and not changeable
var/list/allowed_limb_ids
///////////
// PROCS //
///////////
@@ -121,7 +124,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
/datum/species/New()
if(!limbs_id) //if we havent set a limbs id to use, just use our own id
limbs_id = id
mutant_bodyparts["limbs_id"] = id //done this way to be non-intrusive to the existing system
else
mutant_bodyparts["limbs_id"] = limbs_id
..()
//update our mutant bodyparts to include unlocked ones
@@ -13,10 +13,11 @@
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/insect
liked_food = MEAT | FRUIT
disliked_food = TOXIC
icon_limbs = DEFAULT_BODYPART_ICON_CITADEL
exotic_bloodtype = "BUG"
exotic_blood_color = BLOOD_COLOR_BUG
tail_type = "mam_tail"
wagging_type = "mam_waggingtail"
species_type = "insect"
species_type = "insect"
allowed_limb_ids = list("insect","apid","moth","moth_not_greyscale")
@@ -2,7 +2,6 @@
name = "Anthromorph"
id = "mammal"
default_color = "4B4B4B"
icon_limbs = DEFAULT_BODYPART_ICON_CITADEL
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR,HORNCOLOR,WINGCOLOR,HAS_FLESH,HAS_BONE)
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BEAST
mutant_bodyparts = list("mcolor" = "FFFFFF","mcolor2" = "FFFFFF","mcolor3" = "FFFFFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "deco_wings" = "None",
@@ -17,3 +16,5 @@
tail_type = "mam_tail"
wagging_type = "mam_waggingtail"
species_type = "furry"
allowed_limb_ids = list("mammal","aquatic","avian")
@@ -3,7 +3,6 @@
id = "ipc"
say_mod = "beeps"
default_color = "00FF00"
icon_limbs = DEFAULT_BODYPART_ICON_CITADEL
blacklisted = 0
sexes = 0
species_traits = list(MUTCOLORS,NOEYES,NOTRANSSTING,HAS_FLESH,HAS_BONE)
@@ -21,6 +21,8 @@
species_type = "plant"
allowed_limb_ids = list("pod","mush")
/datum/species/pod/on_species_gain(mob/living/carbon/C, datum/species/old_species)
. = ..()
C.faction |= "plants"
@@ -1,7 +1,6 @@
/datum/species/synthliz
name = "Synthetic Lizardperson"
id = "synthliz"
icon_limbs = DEFAULT_BODYPART_ICON_CITADEL
say_mod = "beeps"
default_color = "00FF00"
species_traits = list(MUTCOLORS,NOTRANSSTING,EYECOLOR,LIPS,HAIR,HAS_FLESH,HAS_BONE)
@@ -61,7 +61,7 @@
mutant_organs = S.mutant_organs.Copy()
nojumpsuit = S.nojumpsuit
no_equip = S.no_equip.Copy()
limbs_id = S.limbs_id
limbs_id = S.mutant_bodyparts["limbs_id"]
use_skintones = S.use_skintones
fixed_mut_color = S.fixed_mut_color
hair_color = S.hair_color
@@ -4,7 +4,6 @@
id = "xeno"
say_mod = "hisses"
default_color = "00FF00"
icon_limbs = DEFAULT_BODYPART_ICON_CITADEL
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,CAN_SCAR)
mutant_bodyparts = list("xenotail"="Xenomorph Tail","xenohead"="Standard","xenodorsal"="Standard", "mam_body_markings" = "Xeno","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None", "legs" = "Digitigrade")
attack_verb = "slash"
@@ -660,7 +660,7 @@ use_mob_overlay_icon: if FALSE, it will always use the default_icon_file even if
//produces a key based on the human's limbs
/mob/living/carbon/human/generate_icon_render_key()
. = "[dna.species.limbs_id]"
. = "[dna.species.mutant_bodyparts["limbs_id"]]"
if(dna.check_mutation(HULK))
. += "-coloured-hulk"
+1 -4
View File
@@ -8,8 +8,6 @@
spill_organs(no_brain, no_organs, no_bodyparts)
release_vore_contents(silent = TRUE) // return of the bomb safe internals.
if(!no_bodyparts)
spread_bodyparts(no_brain, no_organs)
@@ -46,7 +44,6 @@
buckled.unbuckle_mob(src, force = TRUE)
dust_animation()
release_vore_contents(silent = TRUE) //technically grief protection, I guess? if they're SM'd it doesn't matter seconds after anyway.
spawn_dust(just_ash)
QDEL_IN(src,5) // since this is sometimes called in the middle of movement, allow half a second for movement to finish, ghosting to happen and animation to play. Looks much nicer and doesn't cause multiple runtimes.
@@ -103,5 +100,5 @@
for(var/s in sharedSoullinks)
var/datum/soullink/S = s
S.sharerDies(gibbed)
release_vore_contents(silent = TRUE)
return TRUE
+5
View File
@@ -9,6 +9,11 @@
key_third_person = "blushes"
message = "blushes."
/datum/emote/living/blush/run_emote(mob/user, params)
. = ..()
if(. && isipcperson(user))
do_fake_sparks(5,FALSE,user)
/datum/emote/living/bow
key = "bow"
key_third_person = "bows"
+41 -34
View File
@@ -289,50 +289,57 @@
return FALSE
return ISINRANGE(T1.x, T0.x - interaction_range, T0.x + interaction_range) && ISINRANGE(T1.y, T0.y - interaction_range, T0.y + interaction_range)
/mob/living/silicon/robot/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/weldingtool) && (user.a_intent != INTENT_HARM || user == src))
/mob/living/silicon/robot/proc/attempt_welder_repair(obj/item/weldingtool/W, mob/user)
if (!getBruteLoss())
to_chat(user, "<span class='warning'>[src] is already in good condition!</span>")
return
if (!W.tool_start_check(user, amount=0)) //The welder has 1u of fuel consumed by it's afterattack, so we don't need to worry about taking any away.
return
user.DelayNextAction(CLICK_CD_MELEE)
if(src == user)
to_chat(user, "<span class='notice'>You start fixing yourself...</span>")
if(!W.use_tool(src, user, 50))
return
adjustBruteLoss(-10)
else
to_chat(user, "<span class='notice'>You start fixing [src]...</span>")
if(!do_after(user, 30, target = src))
return
adjustBruteLoss(-30)
updatehealth()
add_fingerprint(user)
visible_message("<span class='notice'>[user] has fixed some of the dents on [src].</span>")
/mob/living/silicon/robot/proc/attempt_cable_repair(obj/item/stack/cable_coil/W, mob/user)
if (getFireLoss() > 0 || getToxLoss() > 0)
user.DelayNextAction(CLICK_CD_MELEE)
if (!getBruteLoss())
to_chat(user, "<span class='warning'>[src] is already in good condition!</span>")
return
if (!W.tool_start_check(user, amount=0)) //The welder has 1u of fuel consumed by it's afterattack, so we don't need to worry about taking any away.
return
if(src == user)
to_chat(user, "<span class='notice'>You start fixing yourself...</span>")
if(!W.use_tool(src, user, 50))
if(!W.use_tool(src, user, 50, 1, skill_gain_mult = TRIVIAL_USE_TOOL_MULT))
to_chat(user, "<span class='warning'>You need more cable to repair [src]!</span>")
return
adjustBruteLoss(-10)
adjustFireLoss(-10)
adjustToxLoss(-10)
else
to_chat(user, "<span class='notice'>You start fixing [src]...</span>")
if(!do_after(user, 30, target = src))
if(!W.use_tool(src, user, 30, 1))
to_chat(user, "<span class='warning'>You need more cable to repair [src]!</span>")
return
adjustBruteLoss(-30)
updatehealth()
add_fingerprint(user)
visible_message("<span class='notice'>[user] has fixed some of the dents on [src].</span>")
adjustFireLoss(-30)
adjustToxLoss(-30)
updatehealth()
user.visible_message("[user] has fixed some of the burnt wires on [src].", "<span class='notice'>You fix some of the burnt wires on [src].</span>")
else
to_chat(user, "The wires seem fine, there's no need to fix them.")
/mob/living/silicon/robot/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/weldingtool) && (user.a_intent != INTENT_HARM || user == src))
INVOKE_ASYNC(src, .proc/attempt_welder_repair, W, user)
return
else if(istype(W, /obj/item/stack/cable_coil) && wiresexposed)
user.DelayNextAction(CLICK_CD_MELEE)
if (getFireLoss() > 0 || getToxLoss() > 0)
if(src == user)
to_chat(user, "<span class='notice'>You start fixing yourself...</span>")
if(!W.use_tool(src, user, 50, 1, skill_gain_mult = TRIVIAL_USE_TOOL_MULT))
to_chat(user, "<span class='warning'>You need more cable to repair [src]!</span>")
return
adjustFireLoss(-10)
adjustToxLoss(-10)
else
to_chat(user, "<span class='notice'>You start fixing [src]...</span>")
if(!W.use_tool(src, user, 30, 1))
to_chat(user, "<span class='warning'>You need more cable to repair [src]!</span>")
return
adjustFireLoss(-30)
adjustToxLoss(-30)
updatehealth()
user.visible_message("[user] has fixed some of the burnt wires on [src].", "<span class='notice'>You fix some of the burnt wires on [src].</span>")
else
to_chat(user, "The wires seem fine, there's no need to fix them.")
INVOKE_ASYNC(src, .proc/attempt_cable_repair, W, user)
return
else if(istype(W, /obj/item/crowbar)) // crowbar means open or close the cover
if(opened)
@@ -661,7 +661,7 @@ Difficulty: Normal
continue
to_chat(M.occupant, "<span class='userdanger'>Your [M.name] is struck by a [name]!</span>")
playsound(M,'sound/weapons/sear.ogg', 50, 1, -4)
M.take_damage(damage, BURN, 0, 0)
M.take_damage(damage, BURN, 0, 0, null, 50)
/obj/effect/hierophant
name = "hierophant beacon"
@@ -200,6 +200,8 @@
L.Stun(75)
L.adjustBruteLoss(rand(15,20)) // Less stun more harm
latched = TRUE
for(var/obj/mecha/M in loc)
M.take_damage(20, BRUTE, null, null, null, 25)
if(!latched)
retract()
else
+5 -2
View File
@@ -19,8 +19,11 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, typecacheof(list(
to_chat(src, "You can't vent crawl while you're restrained!")
return
if(has_buckled_mobs())
to_chat(src, "You can't vent crawl with other creatures on you!")
return
// attempt once
unbuckle_all_mobs()
if(has_buckled_mobs())
to_chat(src, "You can't vent crawl with other creatures on you!")
return
if(buckled)
to_chat(src, "You can't vent crawl while buckled!")
return
@@ -95,6 +95,10 @@ GLOBAL_LIST_EMPTY(allCasters)
. = ..()
update_icon()
/obj/machinery/newscaster/attack_ghost(mob/dead/observer/user)
if(istype(user))
user.read_news()
/obj/machinery/newscaster/ui_interact(mob/user)
. = ..()
if(ishuman(user) || issilicon(user))
+13 -13
View File
@@ -96,7 +96,7 @@ Accidental Reentry:
/obj/item/paper/guides/cogstation/job_changes
name = "MEMO: Job Changes"
info = "To ensure minimal employee downtime, please take note of the following changes to select professions that CogStation specifically requires:<BR>\n<BR>\n- Scientists <I>are</I> to have access to chemistry in order to reach the MedSci router.<BR>\n<BR>\n- Chemists should at the very least be provided with an encryption key for the Science channel, if not basic access to the Research department at large. <BR>\n- Roboticists are to have <B>basic Medical and Morgue access</B>. <BR>\n- Engineers and Atmospheric Technicians <I>are</I> to have Warehouse and Mining access.<BR>\n- The Cook should <I>not</I> have Morgue access <BR>\n- The Clown and Mime <I>are</I> to have Maintenance access. This is necessary due to the location of their offices.<BR>\n<BR>\n<I>Generated by Organic Resources Bot #2053</I>"
info = "To ensure minimal employee downtime, please take note of the following changes to select professions that CogStation specifically requires:<BR>\n<BR>\n- Engineers and Atmospheric Technicians <I>are</I> to have Warehouse and Mining access. <BR>\n- The Cook should <I>not</I> have Morgue access. <BR>\n- The Clown and Mime <I>are</I> to have Maintenance access. This is necessary due to the location of their offices.<BR>\n<BR>\n<I>Generated by Organic Resources Bot #2053</I>"
/obj/item/paper/guides/cogstation/letter_sec
name = "To future Security personnel"
@@ -104,7 +104,7 @@ Accidental Reentry:
/obj/item/paper/guides/cogstation/disposals
name = "Regarding the disposal system:"
info = "As you might have noticed, this station has far more disposal pipes than you may expect from your average Nanotrasen research facility. Part of the reason for this is specialization - mail, trash, even corpses have their own disposal systems. Unfortunately, the convenient color-coding was lost in translocation and we've had to compensate by marking the area around each bin. <BR>\n<BR>\n- <B>WHITE/GRAY STRIPES is for DELIVERIES. <BR>\n- RED STRIPES is for CORPSES. <BR>\n- EVERYTHING ELSE is for TRASH,</B> barring a few exceptions that should be labeled as such. <BR>\n<BR>\nIdeally the station won't sustain any heavy structural damage during your time here but if it does, or someone decides to tamper with/sabotage this system, you'll be forgiven if you can't put it back together perfectly. <BR>\n<BR>\n<I>-C. Donnelly</I> <BR>Architectural Analyst"
info = "As you might have noticed, this station has far more disposal pipes than you may expect from your average Nanotrasen research facility. Part of the reason for this is specialization - mail, trash, even corpses have their own disposal systems. Unfortunately, the convenient color-coding was lost in translocation and we've had to compensate by marking the area around each bin. <BR>\n<BR>\n- <B>WHITE/GRAY STRIPES are for DELIVERIES. <BR>\n- RED STRIPES are for CORPSES. <BR>\n- EVERYTHING ELSE is for TRASH,</B> barring a few exceptions that should be labeled as such. <BR>\n<BR>\nIdeally the station won't sustain any heavy structural damage during your time here but if it does, or someone decides to tamper with/sabotage this system, you'll be forgiven if you can't put it back together perfectly. <BR>\n<BR>\n<I>-C. Donnelly</I> <BR>Architectural Analyst"
/obj/item/paper/guides/cogstation/janitor
name = "a quick tip"
@@ -128,7 +128,7 @@ Accidental Reentry:
/obj/item/paper/guides/cogstation/letter_eng
name = "To future Engineering staff:"
info = "I'm not gonna sugarcoat this. Compared to other departments, <I>you might have your work cut out for you.</I> CogStation is an entirely different beast than your standard Box, but everyone's still gonna expect you to keep the place running. <BR>\n<BR>\n If there's any good news, <B>it's your time to shine if you know how to run a thermo-electric generator.</B> That's what this station runs on, and that isn't likely to change anytime soon. If it's absolutely critical you <I>might</I> be able to run a singularity or tesla engine east of mining, but it won't have any sort of shielding out there. <BR>\n<BR>\n<B>You still have three solar arrays to work with,</B> two of them being on each end of the starboard side. The port side array will need you to either get access from a head of staff or security, unless you want to spacewalk around the whole station. Don't be afraid to ask the latter - they're there for you, after all. As for other utilities <B>the air system is a bit different than you'd expect</B>, but fortunately you should have the atmos techs this station needed a long time ago. <B>The disposal network is significantly more complicated, yet more capable.</B> I've already elaborated on it, so I'll let you find and read my write-up for that. <B>As for the routing system,</B> it's just begging to get hit by a stray meteor so <B>consider other utilities a higher priority.</B> <BR>\n<BR>\nGood luck. You're gonna need it. <BR>\n<BR>\n<I>-C. Donnelly</I> <BR>Architectural Analyst"
info = "I'm not gonna sugarcoat this. Compared to other departments, <I>you might have your work cut out for you.</I> CogStation is an entirely different beast than your standard Box, but everyone's still gonna expect you to keep the place running. <BR>\n<BR>\n If there's any good news, <B>it's your time to shine if you know how to run a thermo-electric generator.</B> That's what this station runs on, and that isn't likely to change anytime soon. If it's absolutely critical you <I>might</I> be able to run a singularity or tesla engine east of mining, but it won't have any sort of protection out there. <BR>\n<BR>\n<B>You still have three solar arrays to work with,</B> two of them being on each end of the starboard side. The port side array will need you to either get access from a head of staff or security, unless you want to spacewalk around the whole station. Don't be afraid to ask the latter - they're there for you, after all. As for other utilities <B>the air system is a bit different than you'd expect</B>, but fortunately you should have the atmos techs this station needed a long time ago. <B>The disposal network is significantly more complicated, yet more capable.</B> I've already elaborated on it, so I'll let you find and read my write-up for that. <B>As for the routing system,</B> it's just begging to get hit by a stray meteor so <B>consider other utilities a higher priority.</B> <BR>\n<BR>\nGood luck. You're gonna need it. <BR>\n<BR>\n<I>-C. Donnelly</I> <BR>Architectural Analyst"
/obj/item/paper/guides/cogstation/letter_atmos
name = "To future Atmospheric Technicians:"
@@ -140,15 +140,15 @@ Accidental Reentry:
/obj/item/paper/guides/cogstation/letter_hos
name = "To the future HoS"
info = "I'm gonna be rather disappointed if CentCom doesn't brief you about this station, but if they don't <B>I wrote up another letter for your department that should cover it pretty well.</B> Make sure your officers read it if they aren't up to speed. <BR>\n<BR>\nSomething you in particular should know is that if someone's getting to be too much to handle, the boys and I have constructed a 'discount transfer centre' just behind the router. <B>Use it only as a last resort</B> - the walls may be reinforced but they're still thin, and you'll have big trouble on your hands if the AI or any cyborgs find out about it. <BR>\n<BR><I>-LC</I>"
info = "I'm gonna be rather disappointed if Central Command doesn't brief you about this station, but if they don't <B>I wrote up another letter for your department that should cover it pretty well.</B> Make sure your officers read it if they aren't up to speed. <BR>\n<BR>\nSomething you in particular should know is that if someone's getting to be too much to handle, the boys and I have constructed a 'discount transfer centre' just behind the router. <B>Use it only as a last resort</B> - the walls may be reinforced but they're still thin, and you'll have big trouble on your hands if the AI or any cyborgs find out about it. <BR>\n<BR><I>-LC</I>"
/obj/item/paper/guides/cogstation/letter_supp
name = "To future Supply Staff:"
info = "Cargo, move freight. Miners, don't die. Your jobs are pretty straightforward, which is likely why they originally fell under Engineering on this station as opposed to their own department. Although we've considerably readjusted this part of the station to accommodate you, there are potential differences you should be aware of.<BR>\n<BR>\nEngineering<I>will</I> have access to some of your department, namely the warehouse and mining dock. Mining operations on this station were originally asteroid-based, hence the catwalk into the great beyond. Although you won't need to worry about being space-worthy due to a newly installed shuttle dock, they might need to get out there. <BR>\n<BR>\nYou'll have all your usual means of shipping out goods, but the disposal network is more complex with a separate line for mail and trash. I've left another note that explains this in detail, but know trash is the janitor's responsibility, not yours. <BR>\n<BR>\nThe biggest difference has to be this station's router system, which allows departments to ship goods between themselves. Even if the belts aren't working properly they'll still have their own request consoles, so you'll want to check for orders regularly. <BR>\n<BR>\n<I>-C. Donnelly</I> <BR>\nArchitectural Analyst"
info = "Cargo, move freight. Miners, don't die. Your jobs are pretty straightforward, which is likely why they originally fell under Engineering on this station as opposed to their own department. Although we've considerably readjusted this part of the station to accommodate you, there are potential differences you should be aware of.<BR>\n<BR>\nEngineering<I>will</I> have access to some of your department, namely the warehouse and mining dock. Mining operations on this station were originally asteroid-based, hence the catwalk into the great beyond. Although you won't need to worry about being space-worthy due to a newly installed shuttle dock, they might need to get out there. <BR>\n<BR>\nYou'll have all your usual means of shipping out goods, but the disposal network is more complex with a separate line for mail and trash. It also isn't fully space-proofed, meanin it may not be the best choice for livestock, monkey cubes, or clowns. I've left another note that explains this in detail, but know trash is the janitor's responsibility, not yours. <BR>\n<BR>\nThe biggest difference has to be this station's router system, which allows departments to ship goods between themselves. Even if the belts aren't working properly they'll still have their own request consoles, so you'll want to check for orders regularly. <BR>\n<BR>\n<I>-C. Donnelly</I> <BR>\nArchitectural Analyst"
/obj/item/paper/fluff/cogstation/sleepers
name = "Re: Sleepers?"
info = "Yes, the sleepers are meant to be publicly accessible. Policies in this station's original location encouraged crew to visit the clinic or treat themselves when it came to minor injuries. <BR>\n<BR>\n<B>This is no excuse for you not to do your jobs.</B> You may wish to keep an eye on the sleepers as to ensure they're being used responsibly. Remember, allowing an overdose to happen under your watch isn't much different from administering that overdose yourself. <BR>\n<BR>\n<I>- Dr. Halley</I>"
/obj/item/paper/guides/cogstation/letter_med
name = "Re: Future Medical Staff"
info = "With this station nearing approval for regular use, I've been told to consolidate anything noteworthy about its general medical department into a single document. As you may be able to guess, this is that document. <BR>\n<BR>\n- First, you should know a <B>medical clinic is present in the civilian (starboard bow) wing.</B> If you have personnel to spare, it's recommended you have someone staff it - that way people with minor injuries can report there instead of clogging up the research wing. <BR>\n<BR>\n- Despite recent renovations to bring this station in line with regional policy, you'll still find the robotics lab directly adjacent to your department. <B>I advise you take full advantage of this,</B> whether it's requesting prosthetics in advance or harvesting organs from those who have undergone more...permanent procedures. <BR>\n<BR>\n- Lastly, <B>please make a habit of checking the morgue on a regular basis.</B> Thanks to the Corpse Disposal Network (or CDN for short), you may find the station's deceased delivered directly to you. Some may be employees capable of being revived - more information can be found in the morgue itself. <BR>\n<BR>\n<I>- Dr. Halley</I>"
/obj/item/paper/fluff/cogstation/cloner
name = "Re: Issue with the cloner?"
@@ -172,7 +172,7 @@ Accidental Reentry:
/obj/item/paper/fluff/cogstation/letter_chap
name = "A message from the DHDA"
info = "Regardless of what the name leads you to believe, CogStation is neither Ratvarian in origin nor designed by members of this so-called 'clock cult'. Despite a potential common enemy and instances of exhibiting peaceful behavior, their beliefs have been labeled 'Heretical' by the Department of Higher-Dimensional Affairs and following them is grounds for immediate termination. <BR>\nAs the station's designated Chaplain, it is advised you correct anyone who claims this station and/or its designers are Ratvarian. While they are most likely misinformed or 'joking around', untruths gain credibility the more they are repeated. <BR>\n<BR>\n<I>Soulstone Obelisk</I> <BR>\n<BR>\nDepartment of Higher-Dimensional Affairs"
info = "Regardless of what the name leads you to believe, CogStation is neither Ratvarian in origin nor designed by members of this so-called 'clock cult'. Despite a potential common enemy and instances of exhibiting peaceful behavior, their beliefs have been labeled 'Heretical' by the Department of Higher-Dimensional Affairs and following them is grounds for immediate termination. <BR>\nAs the station's designated Chaplain, it is advised you correct anyone who claims this station and/or its designers are Ratvarian. While they are most likely misinformed or 'joking around', untruths gain credibility the more they are repeated. <BR>\n<BR>\n<I>Soulstone Obelisk</I> <BR>\n<BR>\nDepartment of Higher-Dimensional Affairs"
/obj/item/paper/fluff/cogstation/cluwne
name = "Mysterious Note"
@@ -184,7 +184,7 @@ Accidental Reentry:
/obj/item/paper/fluff/cogstation/eva
name = "MEMO: Spacesuits"
info = "As a Head of Personnel, you may be familiar with crew members requesting EVA access, particularly when there is an absence of credible threats on the station. While it is your decision to grant or deny access unless overriden by your superior(s), you should be aware of an abundance of spacesuits on this station. While intended for emergencies, these suits are cheaper to replace. You may find it beneficial to direct aspiring 'space explorers' towards finding one of these suits instead, although it is advised you order replacement suits in advance through the cargo department. <BR>\n<BR>\n-Generated by Organic Resources Bot #2053"
info = "As a Head of Personnel, you may be familiar with crew members requesting EVA access, particularly when there is an absence of credible threats on the station. While it is your decision to grant or deny access unless overriden by your superior(s), you should be aware of an abundance of spacesuits on this station. While intended for emergencies, these suits are cheaper to replace. You may find it beneficial to direct aspiring 'space explorers' towards finding one of these suits instead, although it is advised you order replacement suits in advance through the cargo department. <BR>\n<BR>\n<I>Generated by Organic Resources Bot #2053</I>"
/obj/item/paper/fluff/cogstation/chemists
name = "Re: Scientists?!"
@@ -214,9 +214,9 @@ Accidental Reentry:
name = "ROUTER STATUS: LIMITED"
info = "Currently, this router cannot receive deliveries from the Airbridge, MedSci, Security, or Service Routers. Cargo and the recycler are the only points currently accepting deliveries from here, although manual input from the routing depot is currently required. <BR>\n<BR>\n<I>-C. Donnelly</I> <BR>\n<BR>\nArchitectural Analyst"
/obj/item/paper/fluff/cogstation/router_cargo
name = "ROUTER STATUS: VERY LIMITED"
info = "Currently, this router cannot receive deliveries from the Airbridge, MedSci, Security, or Service Routers. It is not yet capable of making deliveries, beyond sending items to the recycler. <BR>\n<BR>\n<I>-C. Donnelly</I> <BR>\n<BR>\nArchitectural Analyst"
/obj/item/paper/fluff/cogstation/mulebot
name = "MEMO: MULEbots"
info = "As you may know, MULEbots have been coded to minimize travel distance for maximum efficiency. In the case of this station, that may include travelling through depressurized areas exposed to space. Please bear this in mind before using them to transport living tissue. <BR>\n<BR>\n<I>Generated by Organic Resources Bot #2053</I>"
/////////// CentCom
+1 -1
View File
@@ -66,7 +66,7 @@
var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity)
var/heat = energy_transfer*(1-efficiency)
lastgen += energy_transfer*efficiency
lastgen += LOGISTIC_FUNCTION(1000000,0.0034,delta_temperature,2000)
hot_air.set_temperature(hot_air.return_temperature() - energy_transfer/hot_air_heat_capacity)
cold_air.set_temperature(cold_air.return_temperature() + heat/cold_air_heat_capacity)
@@ -149,6 +149,9 @@
icon = 'icons/obj/ammo.dmi'
icon_state = "shotgunclip"
caliber = "shotgun" // slapped in to allow shell mix n match
slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_POCKET
w_class = WEIGHT_CLASS_NORMAL
w_volume = ITEM_VOLUME_STRIPPER_CLIP
ammo_type = /obj/item/ammo_casing/shotgun
max_ammo = 4
var/pixeloffsetx = 4
@@ -19,6 +19,10 @@
var/stream_range = 1 //the range of tiles the sprayer will reach when in stream mode.
var/stream_amount = 10 //the amount of reagents transfered when in stream mode.
var/spray_delay = 3 //The amount of sleep() delay between each chempuff step.
/// Last world.time of spray
var/last_spray = 0
/// Spray cooldown
var/spray_cooldown = CLICK_CD_MELEE
var/can_fill_from_container = TRUE
amount_per_transfer_from_this = 5
volume = 250
@@ -27,8 +31,6 @@
/obj/item/reagent_containers/spray/afterattack(atom/A, mob/user)
. = ..()
if(!user.CheckActionCooldown(CLICK_CD_MELEE))
return
if(istype(A, /obj/structure/sink) || istype(A, /obj/structure/janitorialcart) || istype(A, /obj/machinery/hydroponics))
return
@@ -49,7 +51,8 @@
to_chat(user, "<span class='warning'>[src] is empty!</span>")
return
spray(A)
if(!spray(A))
return
playsound(src.loc, 'sound/effects/spray2.ogg', 50, 1, -6)
user.last_action = world.time
@@ -64,10 +67,10 @@
if(reagents.has_reagent(/datum/reagent/lube))
message_admins("[ADMIN_LOOKUPFLW(user)] fired Space lube from \a [src] at [ADMIN_VERBOSEJMP(T)].")
log_game("[key_name(user)] fired Space lube from \a [src] at [AREACOORD(T)].")
return
/obj/item/reagent_containers/spray/proc/spray(atom/A)
if((last_spray + spray_cooldown) > world.time)
return
var/range = clamp(get_dist(src, A), 1, current_range)
var/obj/effect/decal/chempuff/D = new /obj/effect/decal/chempuff(get_turf(src))
D.create_reagents(amount_per_transfer_from_this, NONE, NO_REAGENTS_VALUE)
@@ -79,10 +82,11 @@
reagents.trans_to(D, amount_per_transfer_from_this, 1/range)
D.color = mix_color_from_reagents(D.reagents.reagent_list)
var/wait_step = max(round(2+ spray_delay * INVERSE(range)), 2)
do_spray(A, wait_step, D, range, puff_reagent_left)
last_spray = world.time
INVOKE_ASYNC(src, .proc/do_spray, A, wait_step, D, range, puff_reagent_left)
return TRUE
/obj/item/reagent_containers/spray/proc/do_spray(atom/A, wait_step, obj/effect/decal/chempuff/D, range, puff_reagent_left)
set waitfor = FALSE
var/range_left = range
for(var/i=0, i<range, i++)
range_left--
@@ -42,6 +42,8 @@
return
. = ..()
if(!.)
return
new /obj/item/grown/bananapeel(target)
/obj/effect/proc_holder/spell/aimed/banana_peel/update_icon()
+7 -7
View File
@@ -598,7 +598,7 @@
var/datum/species/S = H.dna.species
base_bp_icon = S?.icon_limbs || DEFAULT_BODYPART_ICON
species_id = S.limbs_id
species_id = S.mutant_bodyparts["limbs_id"]
species_flags_list = H.dna.species.species_traits
//body marking memes
@@ -613,7 +613,6 @@
if(S.use_skintones)
skin_tone = H.skin_tone
base_bp_icon = (base_bp_icon == DEFAULT_BODYPART_ICON) ? DEFAULT_BODYPART_ICON_ORGANIC : base_bp_icon
else
skin_tone = ""
@@ -626,13 +625,9 @@
species_color = S.fixed_mut_color
else
species_color = H.dna.features["mcolor"]
base_bp_icon = (base_bp_icon == DEFAULT_BODYPART_ICON) ? DEFAULT_BODYPART_ICON_ORGANIC : base_bp_icon
else
species_color = ""
if(base_bp_icon != DEFAULT_BODYPART_ICON)
color_src = mut_colors ? MUTCOLORS : ((H.dna.skin_tone_override && S.use_skintones == USE_SKINTONES_GRAYSCALE_CUSTOM) ? CUSTOM_SKINTONE : SKINTONE)
if(S.mutant_bodyparts["legs"])
if(body_zone == BODY_ZONE_L_LEG || body_zone == BODY_ZONE_R_LEG)
if(DIGITIGRADE in S.species_traits)
@@ -652,11 +647,16 @@
body_markings = "plain"
aux_marking = "plain"
markings_color = list(colorlist)
else
body_markings = null
aux_marking = null
if(species_id in GLOB.greyscale_limb_types) //should they have greyscales?
base_bp_icon = DEFAULT_BODYPART_ICON_ORGANIC
if(base_bp_icon != DEFAULT_BODYPART_ICON)
color_src = mut_colors ? MUTCOLORS : ((H.dna.skin_tone_override && S.use_skintones == USE_SKINTONES_GRAYSCALE_CUSTOM) ? CUSTOM_SKINTONE : SKINTONE)
if(!dropping_limb && H.dna.check_mutation(HULK))
mutation_color = "00aa00"
else
+5 -1
View File
@@ -265,6 +265,10 @@
var/C = input(owner, "Select Color", "Select color", "#ffffff") as color|null
if(!C || QDELETED(src) || QDELETED(user) || QDELETED(owner) || owner != user)
return
var/list/hsv = ReadHSV(RGBtoHSV(C))
if(hsv[2] > 125)
to_chat(user, "<span class='warning'>A color that saturated? Surely not!</span>")
return
var/range = input(user, "Enter range (0 - [max_light_beam_distance])", "Range Select", 0) as null|num
if(!isnum(range))
return
@@ -396,4 +400,4 @@
#undef BLURRY_VISION_ONE
#undef BLURRY_VISION_TWO
#undef BLIND_VISION_THREE
#undef BLIND_VISION_THREE
@@ -177,6 +177,7 @@
organic host as a home base and source of fuel. Holoparasites come in various types and share damage with their host."
item = /obj/item/storage/box/syndie_kit/guardian
cost = 15
limited_stock = 1 // you can only have one holopara apparently?
refundable = TRUE
cant_discount = TRUE
surplus = 0
@@ -80,6 +80,7 @@
item = /obj/item/cartridge/virus/syndicate
cost = 5
restricted = TRUE
limited_stock = 1
/datum/uplink_item/explosives/emp
name = "EMP Grenades and Implanter Kit"
+1
View File
@@ -36,6 +36,7 @@
/obj/item/clothing/under/misc/keyholesweater = 2,
/obj/item/clothing/under/misc/stripper/mankini = 2,
/obj/item/clothing/under/costume/jabroni = 2,
/obj/item/clothing/gloves/evening/black = 2,
/obj/item/dildo/flared/huge = 3
)
premium = list(
+97
View File
@@ -50,6 +50,103 @@
-->
<div class="commit sansserif">
<h2 class="date">28 August 2020</h2>
<h3 class="author">EmeraldSundisk updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Adds more paper to the library</li>
<li class="rscadd">The law office now has a desk window</li>
<li class="tweak">Expands most of CogStation's exterior airlocks. Slightly adjusts surrounding areas to accommodate this.</li>
<li class="tweak">Updates some of CogStation's paperwork</li>
<li class="tweak">The rat in the morgue turned themselves into a possum. Funniest shit I've ever seen.</li>
<li class="bugfix">Adjusts some area designations so cameras should receive power properly</li>
<li class="bugfix">Cleans up an errant decal</li>
</ul>
<h3 class="author">Hatterhat updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Traitor holoparasites can now only be bought once, because apparently you can only have one active holopara.</li>
<li class="balance">PDA bombs can now only be bought once per uplink.</li>
</ul>
<h3 class="author">lolman360 updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">atmos = radiation = chemistry.</li>
</ul>
<h3 class="author">shellspeed1 updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Adds slow mode for iv drips</li>
</ul>
<h3 class="author">timothyteakettle updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">an ancient game over a thousand years old has re-emerged among crewmembers - rock paper scissors</li>
<li class="tweak">customization features appear in alphabetical order where necessary</li>
<li class="tweak">bokken do two more stamina damage now</li>
<li class="rscadd">you can now choose a body sprite as an anthromorph or anthromorphic insect, and can choose from aquatic/avian and apid respectively (and obviously back to the defaults too)</li>
</ul>
<h2 class="date">27 August 2020</h2>
<h3 class="author">silicons updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">eyebeam lighting can only have 128 maximum HSV saturation now.</li>
<li class="balance">no more shotgun stripper clips in boxes.</li>
<li class="balance">goliath tentacles now do 20 damage to mechs at 25% ap</li>
</ul>
<h3 class="author">timothyteakettle updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">changing your character's gender won't randomize its hairstyle and facial hairstyle now</li>
</ul>
<h2 class="date">26 August 2020</h2>
<h3 class="author">ancientpower updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Ghosts can read newscasters by clicking on them.</li>
</ul>
<h3 class="author">silicons updated:</h3>
<ul class="changes bgimages16">
<li class="balance">hierophant vortex blasts now have 50% armor penetration vs mecha</li>
<li class="balance">ventcrawling now kicks off every attached/buckled mob, even for non humans.</li>
</ul>
<h2 class="date">25 August 2020</h2>
<h3 class="author">Hatterhat updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Insidious combat gloves have been replaced by insidious guerilla gloves. They're generally the same, except now you can tackle with them.</li>
</ul>
<h3 class="author">Literallynotpickles updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">You can now equip handheld crew monitors on all medical-related winter coats.</li>
</ul>
<h3 class="author">Putnam3145 updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">vore now ejects occupants on death</li>
</ul>
<h3 class="author">raspy-on-osu updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Thermoelectric Generator power output</li>
</ul>
<h3 class="author">timothyteakettle updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">I.P.Cs now short their circuits when expressing emotion, causing sparks to appear around them.</li>
</ul>
<h2 class="date">24 August 2020</h2>
<h3 class="author">MrJWhit updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Fixes areas on expanded airlocks</li>
</ul>
<h3 class="author">silicons updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">wormhole jaunters work</li>
<li class="tweak">wormhole jaunters no longer get interference from bags of holding</li>
<li class="bugfix">airlocks now only shock on pulse/wirecutters instead of on tgui panel open.</li>
</ul>
<h3 class="author">timothyteakettle updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">three new items are in the loadout for all donators</li>
</ul>
<h3 class="author">zeroisthebiggay updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">contraband black evening gloves in kinkvend</li>
</ul>
<h2 class="date">23 August 2020</h2>
<h3 class="author">DeltaFire15 updated:</h3>
<ul class="changes bgimages16">
+67
View File
@@ -27060,3 +27060,70 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- rscadd: suiciding with the temporal katana omae wa mou shinderius you into the
shadow realm
- soundadd: twilight isnt earrape
2020-08-24:
MrJWhit:
- bugfix: Fixes areas on expanded airlocks
silicons:
- bugfix: wormhole jaunters work
- tweak: wormhole jaunters no longer get interference from bags of holding
- bugfix: airlocks now only shock on pulse/wirecutters instead of on tgui panel
open.
timothyteakettle:
- rscadd: three new items are in the loadout for all donators
zeroisthebiggay:
- rscadd: contraband black evening gloves in kinkvend
2020-08-25:
Hatterhat:
- rscadd: Insidious combat gloves have been replaced by insidious guerilla gloves.
They're generally the same, except now you can tackle with them.
Literallynotpickles:
- tweak: You can now equip handheld crew monitors on all medical-related winter
coats.
Putnam3145:
- tweak: vore now ejects occupants on death
raspy-on-osu:
- tweak: Thermoelectric Generator power output
timothyteakettle:
- tweak: I.P.Cs now short their circuits when expressing emotion, causing sparks
to appear around them.
2020-08-26:
ancientpower:
- tweak: Ghosts can read newscasters by clicking on them.
silicons:
- balance: hierophant vortex blasts now have 50% armor penetration vs mecha
- balance: ventcrawling now kicks off every attached/buckled mob, even for non humans.
2020-08-27:
silicons:
- tweak: eyebeam lighting can only have 128 maximum HSV saturation now.
- balance: no more shotgun stripper clips in boxes.
- balance: goliath tentacles now do 20 damage to mechs at 25% ap
timothyteakettle:
- tweak: changing your character's gender won't randomize its hairstyle and facial
hairstyle now
2020-08-28:
EmeraldSundisk:
- rscadd: Adds more paper to the library
- rscadd: The law office now has a desk window
- tweak: Expands most of CogStation's exterior airlocks. Slightly adjusts surrounding
areas to accommodate this.
- tweak: Updates some of CogStation's paperwork
- tweak: The rat in the morgue turned themselves into a possum. Funniest shit I've
ever seen.
- bugfix: Adjusts some area designations so cameras should receive power properly
- bugfix: Cleans up an errant decal
Hatterhat:
- tweak: Traitor holoparasites can now only be bought once, because apparently you
can only have one active holopara.
- balance: PDA bombs can now only be bought once per uplink.
lolman360:
- rscadd: atmos = radiation = chemistry.
shellspeed1:
- rscadd: Adds slow mode for iv drips
timothyteakettle:
- rscadd: an ancient game over a thousand years old has re-emerged among crewmembers
- rock paper scissors
- tweak: customization features appear in alphabetical order where necessary
- tweak: bokken do two more stamina damage now
- rscadd: you can now choose a body sprite as an anthromorph or anthromorphic insect,
and can choose from aquatic/avian and apid respectively (and obviously back
to the defaults too)
@@ -0,0 +1,6 @@
author: "raspy-on-osu"
delete-after: True
changes:
- rscadd: "new explosion echoes"
- tweak: "explosion echo range"
- soundadd: "5 new explosion related sounds"
Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 20 KiB

@@ -7,6 +7,27 @@
category = LOADOUT_CATEGORY_DONATOR
ckeywhitelist = list("This entry should never appear with this variable set.") //If it does, then that means somebody fucked up the whitelist system pretty hard
/datum/gear/donator/pet
name = "Pet Beacon"
slot = SLOT_IN_BACKPACK
path = /obj/item/choice_beacon/pet
ckeywhitelist = list()
donator_group_id = DONATOR_GROUP_TIER_1 // can be accessed by all donators
/datum/gear/donator/carpet
name = "Carpet Beacon"
slot = SLOT_IN_BACKPACK
path = /obj/item/choice_beacon/box/carpet
ckeywhitelist = list()
donator_group_id = DONATOR_GROUP_TIER_1
/datum/gear/donator/chameleon_bedsheet
name = "Chameleon Bedsheet"
slot = SLOT_NECK
path = /obj/item/bedsheet/chameleon
ckeywhitelist = list()
donator_group_id = DONATOR_GROUP_TIER_1
/datum/gear/donator/donortestingbikehorn
name = "Donor item testing bikehorn"
slot = SLOT_IN_BACKPACK
@@ -9,6 +9,10 @@
/datum/gear/gloves/evening
name = "Evening gloves"
path = /obj/item/clothing/gloves/evening
/datum/gear/gloves/midnight
name = "Midnight gloves"
path = /obj/item/clothing/gloves/evening/black
/datum/gear/gloves/goldring
name = "A gold ring"
Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+6 -5
View File
@@ -131,7 +131,8 @@
"@pick(semicolon)*weh",
"@pick(semicolon)My balls finally feel full, again.",
"@pick(semicolon)Assaltign a sec osficer aren't crime if ur @pick(roles)",
";SEC I SPILED MU JICE HELELPH HELPJ JLEP HELP"
";SEC I SPILED MU JICE HELELPH HELPJ JLEP HELP",
"@pick(semicolon) atmos is chemistyr is radation fast air is FASTER cheemsitry and FASTER RADIATION AND FASTER DEATH!!!"
],
"mutations": [
@@ -199,7 +200,7 @@
"abdoocters",
"revinent"
],
"bug": [
"",
"IS TIS A BUG??",
@@ -207,7 +208,7 @@
"BUG!!!",
"HUE, FEATURE!!"
],
"semicolon": [
"",
";",
@@ -271,7 +272,7 @@
"arrdee",
"sek"
],
"cargo": [
"GUNS",
"HATS",
@@ -279,7 +280,7 @@
"MEMES",
"GLOWY CYSTAL"
],
"s_roles": [
"ert",
"shadowlig",
+1
View File
@@ -96,6 +96,7 @@
#include "code\__DEFINES\reagents_specific_heat.dm"
#include "code\__DEFINES\research.dm"
#include "code\__DEFINES\robots.dm"
#include "code\__DEFINES\rockpaperscissors.dm"
#include "code\__DEFINES\role_preferences.dm"
#include "code\__DEFINES\rust_g.dm"
#include "code\__DEFINES\say.dm"