Merge branch 'master' into fuckatmos
This commit is contained in:
@@ -126,3 +126,18 @@ GLOBAL_LIST(round_end_notifiees)
|
||||
/datum/tgs_chat_command/reload_admins/proc/ReloadAsync()
|
||||
set waitfor = FALSE
|
||||
load_admins()
|
||||
|
||||
/datum/tgs_chat_command/addbunkerbypass
|
||||
name = "whitelist"
|
||||
help_text = "whitelist <ckey>"
|
||||
admin_only = TRUE
|
||||
|
||||
/datum/tgs_chat_command/addbunkerbypass/Run(datum/tgs_chat_user/sender, params)
|
||||
if(!CONFIG_GET(flag/sql_enabled))
|
||||
return "The Database is not enabled!"
|
||||
|
||||
GLOB.bunker_passthrough |= ckey(params)
|
||||
|
||||
log_admin("[sender.friendly_name] has added [params] to the current round's bunker bypass list.")
|
||||
message_admins("[sender.friendly_name] has added [params] to the current round's bunker bypass list.")
|
||||
return "[params] has been added to the current round's bunker bypass list."
|
||||
@@ -217,3 +217,7 @@
|
||||
/proc/_step_away(ref, trg, max)
|
||||
step_away(ref, trg, max)
|
||||
|
||||
/proc/_instantiate_at(thing, location)
|
||||
new thing(location)
|
||||
|
||||
|
||||
|
||||
@@ -150,6 +150,42 @@
|
||||
message_admins("[key_name_admin(src)] set the round end sound to [S]")
|
||||
SSblackbox.record_feedback("tally", "admin_verb", 1, "Set Round End Sound") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/proc/play_web_sound_manual()
|
||||
set category = "Fun"
|
||||
set name = "Manual Play Internet Sound"
|
||||
if(!check_rights(R_SOUNDS))
|
||||
return
|
||||
|
||||
var/web_sound_input = input("Enter youtube-dl fetched content URL (supported sites only, leave blank to stop playing)", "Send youtube-dl media link") as text|null
|
||||
if(!istext(web_sound_input))
|
||||
return
|
||||
web_sound_input = trim(web_sound_input)
|
||||
if(!length(web_sound_input))
|
||||
log_admin("[key_name(src)] stopped web sound")
|
||||
message_admins("[key_name(src)] stopped web sound")
|
||||
for(var/m in GLOB.player_list)
|
||||
var/mob/M = m
|
||||
var/client/C = M.client
|
||||
if((C.prefs.toggles & SOUND_MIDI) && C.chatOutput && !C.chatOutput.broken && C.chatOutput.loaded)
|
||||
C.chatOutput.stopMusic()
|
||||
return
|
||||
var/freq = input(usr, "What frequency would you like the sound to play at?",, 1) as null|num
|
||||
if(!freq)
|
||||
return
|
||||
if(web_sound_input && !findtext(web_sound_input, GLOB.is_http_protocol))
|
||||
to_chat(src, "<span class='boldwarning'>BLOCKED: Content URL not using http(s) protocol</span>")
|
||||
to_chat(src, "<span class='warning'>The media provider returned a content URL that isn't using the HTTP or HTTPS protocol</span>")
|
||||
return
|
||||
|
||||
SSblackbox.record_feedback("nested tally", "played_url_manual", 1, list("[ckey]", "[web_sound_input]"))
|
||||
log_admin("[key_name(src)] manually played web sound: [web_sound_input]")
|
||||
message_admins("[key_name(src)] manually played web sound: <a href='web_sound_input'>HREF</a>")
|
||||
for(var/m in GLOB.player_list)
|
||||
var/mob/M = m
|
||||
var/client/C = M.client
|
||||
if((C.prefs.toggles & SOUND_MIDI) && C.chatOutput && !C.chatOutput.broken && C.chatOutput.loaded)
|
||||
C.chatOutput.sendMusic(web_sound_input, freq)
|
||||
|
||||
/client/proc/stop_sounds()
|
||||
set category = "Debug"
|
||||
set name = "Stop All Playing Sounds"
|
||||
|
||||
@@ -1249,7 +1249,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
|
||||
if(!check_rights(R_ADMIN) || !check_rights(R_FUN))
|
||||
return
|
||||
|
||||
var/list/punishment_list = list(ADMIN_PUNISHMENT_LIGHTNING, ADMIN_PUNISHMENT_BRAINDAMAGE, ADMIN_PUNISHMENT_GIB, ADMIN_PUNISHMENT_BSA, ADMIN_PUNISHMENT_FIREBALL, ADMIN_PUNISHMENT_ROD, ADMIN_PUNISHMENT_SUPPLYPOD, ADMIN_PUNISHMENT_MAZING)
|
||||
var/list/punishment_list = list(ADMIN_PUNISHMENT_PIE, ADMIN_PUNISHMENT_FIREBALL, ADMIN_PUNISHMENT_LIGHTNING, ADMIN_PUNISHMENT_BRAINDAMAGE, ADMIN_PUNISHMENT_BSA, ADMIN_PUNISHMENT_GIB, ADMIN_PUNISHMENT_SUPPLYPOD, ADMIN_PUNISHMENT_MAZING, ADMIN_PUNISHMENT_ROD)
|
||||
|
||||
var/punishment = input("Choose a punishment", "DIVINE SMITING") as null|anything in punishment_list
|
||||
|
||||
@@ -1294,6 +1294,9 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
|
||||
if(!puzzle_imprison(target))
|
||||
to_chat(usr,"<span class='warning'>Imprisonment failed!</span>")
|
||||
return
|
||||
if(ADMIN_PUNISHMENT_PIE)
|
||||
var/obj/item/reagent_containers/food/snacks/pie/cream/nostun/creamy = new(get_turf(target))
|
||||
creamy.splat(target)
|
||||
|
||||
var/msg = "[key_name_admin(usr)] punished [key_name_admin(target)] with [punishment]."
|
||||
message_admins(msg)
|
||||
|
||||
@@ -108,10 +108,20 @@
|
||||
to_chat(loc, "<span class='warning'>Combat injection is still recharging.</span>")
|
||||
return
|
||||
var/mob/living/carbon/human/M = loc
|
||||
M.adjustStaminaLoss(-75)
|
||||
M.SetSleeping(0)
|
||||
M.SetUnconscious(0)
|
||||
M.SetStun(0)
|
||||
M.SetKnockdown(0)
|
||||
M.reagents.add_reagent("inaprovaline", 3)
|
||||
M.reagents.add_reagent("synaptizine", 10)
|
||||
M.reagents.add_reagent("stimulants", 10)
|
||||
M.adjustStaminaLoss(-150)
|
||||
M.stuttering = 0
|
||||
M.updatehealth()
|
||||
M.update_stamina()
|
||||
M.resting = 0
|
||||
M.lying = 0
|
||||
M.update_canmove()
|
||||
combat_cooldown = 0
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
@@ -503,6 +513,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
|
||||
L.lastattacker = user.real_name
|
||||
L.lastattackerckey = user.ckey
|
||||
|
||||
L.adjustStaminaLoss(35) //because previously it took 5-6 hits to actually "incapacitate" someone for the purposes of the sleep inducement
|
||||
L.Knockdown(140)
|
||||
L.apply_effect(EFFECT_STUTTER, 7)
|
||||
SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK)
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
icon_state = "blank_blob"
|
||||
desc = "A huge, pulsating yellow mass."
|
||||
max_integrity = 400
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 90)
|
||||
armor = list("melee" = 30, "bullet" = 30, "laser" = 20, "energy" = 5, "bomb" = 70, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 90) // Last stand
|
||||
explosion_block = 6
|
||||
point_return = -1
|
||||
health_regen = 0 //we regen in Life() instead of when pulsed
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
max_integrity = 200
|
||||
health_regen = 1
|
||||
point_return = 25
|
||||
armor = list("melee" = 10, "bullet" = 20, "laser" = 15, "energy" = 10, "bomb" = 40, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
|
||||
var/list/spores = list()
|
||||
var/mob/living/simple_animal/hostile/blob/blobbernaut/naut = null
|
||||
var/max_spores = 3
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
desc = "A thin spire of slightly swaying tendrils."
|
||||
max_integrity = 60
|
||||
point_return = 15
|
||||
armor = list("melee" = 10, "bullet" = 10, "laser" = 0, "energy" = 0, "bomb" = 15, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
|
||||
var/resource_delay = 0
|
||||
|
||||
/obj/structure/blob/resource/scannerreport()
|
||||
|
||||
@@ -8,7 +8,8 @@
|
||||
explosion_block = 3
|
||||
point_return = 4
|
||||
atmosblock = TRUE
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
|
||||
armor = list("melee" = 25, "bullet" = 25, "laser" = 15, "energy" = 10, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
|
||||
var/weakened
|
||||
|
||||
/obj/structure/blob/shield/scannerreport()
|
||||
if(atmosblock)
|
||||
@@ -20,14 +21,20 @@
|
||||
|
||||
/obj/structure/blob/shield/update_icon()
|
||||
..()
|
||||
if(obj_integrity <= 75)
|
||||
if(obj_integrity <= 70)
|
||||
icon_state = "blob_shield_damaged"
|
||||
name = "weakened strong blob"
|
||||
desc = "A wall of twitching tendrils."
|
||||
atmosblock = FALSE
|
||||
if(!weakened)
|
||||
armor = armor.setRating("melee" = 15, "bullet" = 15, "laser" = 5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
|
||||
weakened = TRUE
|
||||
else
|
||||
icon_state = initial(icon_state)
|
||||
name = initial(name)
|
||||
desc = initial(desc)
|
||||
atmosblock = TRUE
|
||||
air_update_turf(1)
|
||||
if(weakened)
|
||||
armor = armor.setRating("melee" = 25, "bullet" = 25, "laser" = 15, "energy" = 10, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
|
||||
weakened = FALSE
|
||||
air_update_turf(1)
|
||||
@@ -19,6 +19,14 @@
|
||||
user.SetKnockdown(0)
|
||||
user.reagents.add_reagent("changelingadrenaline", 10)
|
||||
user.reagents.add_reagent("changelinghaste", 2) //For a really quick burst of speed
|
||||
user.adjustStaminaLoss(-75)
|
||||
user.reagents.add_reagent("inaprovaline", 3) //let's give another chance to dumb fucks who forget to breathe
|
||||
user.adjustStaminaLoss(-150)
|
||||
user.stuttering = 0
|
||||
user.updatehealth()
|
||||
user.update_stamina()
|
||||
user.resting = 0
|
||||
user.lying = 0
|
||||
user.update_canmove()
|
||||
|
||||
return TRUE
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
if (user.has_trait(CHANGELING_HIVEMIND_MUTE))
|
||||
to_chat(user, "<span class='warning'>The poison in the air hinders our ability to interact with the hivemind.</span>")
|
||||
return
|
||||
var/input = stripped_input(usr, "Please choose a message to transmit.", "Changeling Hivemind", "")
|
||||
var/input = html_decode(stripped_input(usr, "Please choose a message to transmit.", "Changeling Hivemind", ""))
|
||||
user.say(".g[input]")
|
||||
|
||||
/obj/effect/proc_holder/changeling/hivemind_comms/on_purchase(mob/user, is_respec)
|
||||
|
||||
@@ -64,11 +64,11 @@
|
||||
/obj/effect/proc_holder/changeling/sting/transformation
|
||||
name = "Transformation Sting"
|
||||
desc = "We silently sting a human, injecting a retrovirus that forces them to transform."
|
||||
helptext = "The victim will transform much like a changeling would. Does not provide a warning to others. Mutations will not be transferred, and monkeys will become human. This ability is somewhat loud, and carries a small risk of our blood gaining violent sensitivity to heat."
|
||||
helptext = "The victim will transform much like a changeling would. Does not provide a warning to others. Mutations will not be transferred, and monkeys will become human. This ability is loud, and might cause our blood to react violently to heat."
|
||||
sting_icon = "sting_transform"
|
||||
chemical_cost = 50
|
||||
dna_cost = 3
|
||||
loudness = 1
|
||||
loudness = 2
|
||||
var/datum/changelingprofile/selected_dna = null
|
||||
action_icon = 'icons/mob/actions/actions_changeling.dmi'
|
||||
action_icon_state = "ling_sting_transform"
|
||||
|
||||
@@ -6,7 +6,8 @@
|
||||
icon_state = "clockwork_helmet"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
flags_inv = HIDEEARS|HIDEHAIR|HIDEFACE
|
||||
flags_inv = HIDEEARS|HIDEHAIR|HIDEFACE|HIDESNOUT
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
armor = list("melee" = 50, "bullet" = 70, "laser" = -25, "energy" = 0, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
|
||||
|
||||
/obj/item/clothing/head/helmet/clockwork/Initialize()
|
||||
|
||||
@@ -44,12 +44,13 @@
|
||||
|
||||
/obj/item/clockwork/slab/cyborg //three scriptures, plus a spear and fabricator
|
||||
clockwork_desc = "A divine link to the Celestial Derelict, allowing for limited recital of scripture."
|
||||
quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/ranged_ability/judicial_marker, /datum/clockwork_scripture/ranged_ability/linked_vanguard)
|
||||
quickbound = list(/datum/clockwork_scripture/ranged_ability/judicial_marker, /datum/clockwork_scripture/ranged_ability/linked_vanguard, \
|
||||
/datum/clockwork_scripture/create_object/stargazer)
|
||||
maximum_quickbound = 6 //we usually have one or two unique scriptures, so if ratvar is up let us bind one more
|
||||
actions_types = list()
|
||||
|
||||
/obj/item/clockwork/slab/cyborg/engineer //two scriptures, plus a fabricator
|
||||
quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/sigil_of_transmission)
|
||||
/obj/item/clockwork/slab/cyborg/engineer //three scriptures, plus a fabricator
|
||||
quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/sigil_of_transmission, /datum/clockwork_scripture/create_object/stargazer)
|
||||
|
||||
/obj/item/clockwork/slab/cyborg/medical //five scriptures, plus a spear
|
||||
quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/ranged_ability/linked_vanguard, /datum/clockwork_scripture/ranged_ability/sentinels_compromise, \
|
||||
@@ -61,12 +62,12 @@
|
||||
/obj/item/clockwork/slab/cyborg/peacekeeper //two scriptures, plus a spear
|
||||
quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/ranged_ability/hateful_manacles, /datum/clockwork_scripture/ranged_ability/judicial_marker)
|
||||
|
||||
/obj/item/clockwork/slab/cyborg/janitor //five scriptures, plus a fabricator
|
||||
/obj/item/clockwork/slab/cyborg/janitor //six scriptures, plus a fabricator
|
||||
quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/sigil_of_transgression, \
|
||||
/datum/clockwork_scripture/create_object/ocular_warden, /datum/clockwork_scripture/create_object/mania_motor)
|
||||
/datum/clockwork_scripture/create_object/stargazer, /datum/clockwork_scripture/create_object/ocular_warden, /datum/clockwork_scripture/create_object/mania_motor)
|
||||
|
||||
/obj/item/clockwork/slab/cyborg/service //five scriptures, plus xray vision
|
||||
quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/create_object/replicant, \
|
||||
/obj/item/clockwork/slab/cyborg/service //six scriptures, plus xray vision
|
||||
quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/create_object/replicant,/datum/clockwork_scripture/create_object/stargazer, \
|
||||
/datum/clockwork_scripture/spatial_gateway, /datum/clockwork_scripture/create_object/clockwork_obelisk)
|
||||
|
||||
/obj/item/clockwork/slab/cyborg/miner //two scriptures, plus a spear and xray vision
|
||||
|
||||
@@ -2,6 +2,32 @@
|
||||
// DRIVERS //
|
||||
/////////////
|
||||
|
||||
//Stargazer: Creates a stargazer, a cheap power generator that utilizes starlight.
|
||||
/datum/clockwork_scripture/create_object/stargazer
|
||||
descname = "Generates Power From Starlight"
|
||||
name = "Stargazer"
|
||||
desc = "Forms a weak structure that generates power every second while within three tiles of starlight."
|
||||
invocations = list("Capture their inferior light for us!")
|
||||
channel_time = 50
|
||||
power_cost = 200
|
||||
object_path = /obj/structure/destructible/clockwork/stargazer
|
||||
creator_message = "<span class='brass'>You form a stargazer, which will generate power near starlight.</span>"
|
||||
observer_message = "<span class='warning'>A large lantern-shaped machine forms!</span>"
|
||||
usage_tip = "For obvious reasons, make sure to place this near a window or somewhere else that can see space!"
|
||||
tier = SCRIPTURE_DRIVER
|
||||
one_per_tile = TRUE
|
||||
primary_component = HIEROPHANT_ANSIBLE
|
||||
sort_priority = 1
|
||||
quickbind = TRUE
|
||||
quickbind_desc = "Creates a stargazer, which generates power when near starlight."
|
||||
|
||||
/datum/clockwork_scripture/create_object/stargazer/check_special_requirements()
|
||||
var/area/A = get_area(invoker)
|
||||
if(A.outdoors || A.map_name == "Space" || !A.blob_allowed)
|
||||
to_chat(invoker, "<span class='danger'>Stargazers can't be built off-station.</span>")
|
||||
return
|
||||
return ..()
|
||||
|
||||
|
||||
//Integration Cog: Creates an integration cog that can be inserted into APCs to passively siphon power.
|
||||
/datum/clockwork_scripture/create_object/integration_cog
|
||||
@@ -18,7 +44,7 @@
|
||||
tier = SCRIPTURE_DRIVER
|
||||
space_allowed = TRUE
|
||||
primary_component = HIEROPHANT_ANSIBLE
|
||||
sort_priority = 1
|
||||
sort_priority = 2
|
||||
important = TRUE
|
||||
quickbind = TRUE
|
||||
quickbind_desc = "Creates an integration cog, which can be used to siphon power from an open APC."
|
||||
@@ -39,7 +65,7 @@
|
||||
tier = SCRIPTURE_DRIVER
|
||||
one_per_tile = TRUE
|
||||
primary_component = HIEROPHANT_ANSIBLE
|
||||
sort_priority = 2
|
||||
sort_priority = 3
|
||||
quickbind = TRUE
|
||||
quickbind_desc = "Creates a Sigil of Transgression, which will briefly stun and slow the next non-Servant to cross it."
|
||||
|
||||
@@ -59,7 +85,7 @@
|
||||
tier = SCRIPTURE_DRIVER
|
||||
one_per_tile = TRUE
|
||||
primary_component = HIEROPHANT_ANSIBLE
|
||||
sort_priority = 3
|
||||
sort_priority = 4
|
||||
quickbind = TRUE
|
||||
quickbind_desc = "Creates a Sigil of Submission, which will convert non-Servants that remain on it."
|
||||
|
||||
@@ -76,7 +102,7 @@
|
||||
usage_tip = "The light can be used from up to two tiles away. Damage taken will GREATLY REDUCE the stun's duration."
|
||||
tier = SCRIPTURE_DRIVER
|
||||
primary_component = BELLIGERENT_EYE
|
||||
sort_priority = 4
|
||||
sort_priority = 5
|
||||
slab_overlay = "volt"
|
||||
ranged_type = /obj/effect/proc_holder/slab/kindle
|
||||
ranged_message = "<span class='brass'><i>You charge the clockwork slab with divine energy.</i>\n\
|
||||
@@ -100,7 +126,7 @@
|
||||
usage_tip = "The manacles are about as strong as zipties, and break when removed."
|
||||
tier = SCRIPTURE_DRIVER
|
||||
primary_component = BELLIGERENT_EYE
|
||||
sort_priority = 5
|
||||
sort_priority = 6
|
||||
ranged_type = /obj/effect/proc_holder/slab/hateful_manacles
|
||||
slab_overlay = "hateful_manacles"
|
||||
ranged_message = "<span class='neovgre_small'><i>You charge the clockwork slab with divine energy.</i>\n\
|
||||
@@ -124,7 +150,7 @@
|
||||
usage_tip = "You cannot reactivate Vanguard while still shielded by it."
|
||||
tier = SCRIPTURE_DRIVER
|
||||
primary_component = VANGUARD_COGWHEEL
|
||||
sort_priority = 6
|
||||
sort_priority = 7
|
||||
quickbind = TRUE
|
||||
quickbind_desc = "Allows you to temporarily have quickly regenerating stamina and absorb stuns. All stuns absorbed will affect you when disabled."
|
||||
|
||||
@@ -156,7 +182,7 @@
|
||||
usage_tip = "The Compromise is very fast to invoke, and will remove holy water from the target Servant."
|
||||
tier = SCRIPTURE_DRIVER
|
||||
primary_component = VANGUARD_COGWHEEL
|
||||
sort_priority = 7
|
||||
sort_priority = 8
|
||||
quickbind = TRUE
|
||||
quickbind_desc = "Allows you to convert a Servant's brute, burn, and oxygen damage to half toxin damage.<br><b>Click your slab to disable.</b>"
|
||||
slab_overlay = "compromise"
|
||||
@@ -180,7 +206,7 @@
|
||||
usage_tip = "This can't be used while on Reebe, for obvious reasons."
|
||||
tier = SCRIPTURE_DRIVER
|
||||
primary_component = GEIS_CAPACITOR
|
||||
sort_priority = 8
|
||||
sort_priority = 9
|
||||
important = TRUE
|
||||
quickbind = TRUE
|
||||
quickbind_desc = "Returns you to Reebe."
|
||||
@@ -238,7 +264,7 @@
|
||||
tier = SCRIPTURE_DRIVER
|
||||
space_allowed = TRUE
|
||||
primary_component = GEIS_CAPACITOR
|
||||
sort_priority = 9
|
||||
sort_priority = 10
|
||||
important = TRUE
|
||||
quickbind = TRUE
|
||||
quickbind_desc = "Creates a new Clockwork Slab."
|
||||
@@ -259,6 +285,6 @@
|
||||
tier = SCRIPTURE_DRIVER
|
||||
space_allowed = TRUE
|
||||
primary_component = GEIS_CAPACITOR
|
||||
sort_priority = 10
|
||||
sort_priority = 11
|
||||
quickbind = TRUE
|
||||
quickbind_desc = "Creates a pair of Wraith Spectacles, which grant true sight but cause gradual vision loss."
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
#define STARGAZER_RANGE 3 //How many tiles the stargazer can see out to
|
||||
#define STARGAZER_POWER 7 //How many watts will be produced per second when the stargazer sees starlight
|
||||
|
||||
//Stargazer: A very fragile but cheap generator that creates power from starlight.
|
||||
/obj/structure/destructible/clockwork/stargazer
|
||||
name = "stargazer"
|
||||
desc = "A large lantern-shaped machine made of thin brass. It looks fragile."
|
||||
clockwork_desc = "A lantern-shaped generator that produces power when near starlight."
|
||||
icon_state = "stargazer"
|
||||
unanchored_icon = "stargazer_unwrenched"
|
||||
max_integrity = 40
|
||||
construction_value = 5
|
||||
layer = WALL_OBJ_LAYER
|
||||
break_message = "<span class='warning'>The stargazer's fragile body shatters into pieces!</span>"
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
light_color = "#DAAA18"
|
||||
var/star_light_star_bright = FALSE //If this stargazer can see starlight
|
||||
|
||||
/obj/structure/destructible/clockwork/stargazer/Initialize()
|
||||
. = ..()
|
||||
START_PROCESSING(SSprocessing, src)
|
||||
|
||||
/obj/structure/destructible/clockwork/stargazer/Destroy()
|
||||
STOP_PROCESSING(SSprocessing, src)
|
||||
. = ..()
|
||||
|
||||
/obj/structure/destructible/clockwork/stargazer/examine(mob/user)
|
||||
..()
|
||||
if(is_servant_of_ratvar(user))
|
||||
to_chat(user, "<span class='nzcrentr_small'>Generates <b>[DisplayPower(STARGAZER_POWER)]</b> per second while viewing starlight within [STARGAZER_RANGE] tiles.</span>")
|
||||
if(star_light_star_bright)
|
||||
to_chat(user, "[is_servant_of_ratvar(user) ? "<span class='nzcrentr_small'>It can see starlight!</span>" : "It's shining brilliantly!"]")
|
||||
|
||||
/obj/structure/destructible/clockwork/stargazer/process()
|
||||
star_light_star_bright = check_starlight()
|
||||
if(star_light_star_bright)
|
||||
adjust_clockwork_power(STARGAZER_POWER)
|
||||
|
||||
/obj/structure/destructible/clockwork/stargazer/update_anchored(mob/living/user, damage)
|
||||
. = ..()
|
||||
star_light_star_bright = check_starlight()
|
||||
|
||||
/obj/structure/destructible/clockwork/stargazer/proc/check_starlight()
|
||||
var/old_status = star_light_star_bright
|
||||
var/has_starlight
|
||||
if(!anchored)
|
||||
has_starlight = FALSE
|
||||
else
|
||||
for(var/turf/T in view(3, src))
|
||||
if(isspaceturf(T))
|
||||
has_starlight = TRUE
|
||||
break
|
||||
if(has_starlight && anchored)
|
||||
var/area/A = get_area(src)
|
||||
if(A.outdoors || A.map_name == "Space" || !A.blob_allowed)
|
||||
has_starlight = FALSE
|
||||
if(old_status != has_starlight)
|
||||
if(has_starlight)
|
||||
visible_message("<span class='nzcrentr_small'>[src] hums and shines brilliantly!</span>")
|
||||
playsound(src, 'sound/machines/clockcult/stargazer_activate.ogg', 50, TRUE)
|
||||
add_overlay("stargazer_light")
|
||||
set_light(1.5, 5)
|
||||
else
|
||||
if(anchored) //We lost visibility somehow
|
||||
visible_message("<span class='danger'>[src] flickers, and falls dark.</span>")
|
||||
else
|
||||
visible_message("<span class='danger'>[src] whooshes quietly as it slides into a less bulky form.</span>")
|
||||
cut_overlays()
|
||||
set_light(0)
|
||||
return has_starlight
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
//Mech sensor: Activates when stepped on by a mech
|
||||
/obj/structure/destructible/clockwork/trap/trigger/pressure_sensor/mech
|
||||
name = "mech sensor"
|
||||
desc = "A thin plate of brass, barely visible but clearly distinct."
|
||||
clockwork_desc = "A trigger that will activate when a mech controlled by a non-servant runs across it."
|
||||
max_integrity = 5
|
||||
icon_state = "pressure_sensor"
|
||||
alpha = 75
|
||||
|
||||
/obj/structure/destructible/clockwork/trap/trigger/pressure_sensor/mech/Crossed(atom/movable/AM)
|
||||
|
||||
if(!istype(AM,/obj/mecha/))
|
||||
return
|
||||
|
||||
var/obj/mecha/M = AM
|
||||
if(M.occupant && is_servant_of_ratvar(M.occupant))
|
||||
return
|
||||
audible_message("<i>*click*</i>")
|
||||
playsound(src, 'sound/items/screwdriver2.ogg', 50, TRUE)
|
||||
activate()
|
||||
@@ -68,7 +68,14 @@
|
||||
mouse_opacity = MOUSE_OPACITY_OPAQUE //So players can interact with the tile it's on to pull them off
|
||||
buckle_mob(squirrel, TRUE)
|
||||
else
|
||||
visible_message("<span class='danger'>A massive brass spike erupts from the ground!</span>")
|
||||
var/obj/mecha/M = locate() in get_turf(src)
|
||||
if(M)
|
||||
M.take_damage(50,BRUTE,"melee")
|
||||
M.visible_message("<span class='danger'>A massive brass spike erupts from the ground, penetrating \the [M] and shattering the trap into pieces!</span>")
|
||||
addtimer(CALLBACK(src, .proc/take_damage, max_integrity), 1)
|
||||
else
|
||||
visible_message("<span class='danger'>A massive brass spike erupts from the ground!</span>")
|
||||
|
||||
playsound(src, 'sound/machines/clockcult/brass_skewer.ogg', 75, FALSE)
|
||||
icon_state = "[initial(icon_state)]_extended"
|
||||
density = TRUE //Skewers are one-use only
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
/obj/structure/destructible/clockwork/trap/power_nullifier
|
||||
name = "power nullifier"
|
||||
desc = "A well hidden set of wires and connections."
|
||||
clockwork_desc = "When triggered, it sets off a 3x3 emp pulse with the center suffering a stronger pulse."
|
||||
icon_state = "electric_trap"
|
||||
break_message = "<span class='warning'>The power nullifier sparks, then slowly crumbles to debris!</span>"
|
||||
max_integrity = 40
|
||||
density = FALSE
|
||||
var/activated = FALSE
|
||||
|
||||
/obj/structure/destructible/clockwork/trap/power_nullifier/activate()
|
||||
if(!activated)
|
||||
activated = TRUE
|
||||
empulse(get_turf(src),1,1,TRUE)
|
||||
|
||||
/obj/structure/destructible/clockwork/trap/power_nullifier/emp_act(var/strength=1)
|
||||
activate()
|
||||
@@ -211,8 +211,6 @@
|
||||
else
|
||||
return FALSE
|
||||
|
||||
|
||||
|
||||
/datum/action/innate/cult/spin2win
|
||||
name = "Geometer's Fury"
|
||||
desc = "You draw on the power of the sword's ancient runes, spinning it wildly around you as you become immune to most attacks."
|
||||
@@ -267,7 +265,6 @@
|
||||
return
|
||||
. = ..()
|
||||
|
||||
|
||||
/obj/item/clothing/head/culthood
|
||||
name = "ancient cultist hood"
|
||||
icon_state = "culthood"
|
||||
@@ -294,7 +291,6 @@
|
||||
heat_protection = CHEST|GROIN|LEGS|ARMS
|
||||
max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT
|
||||
|
||||
|
||||
/obj/item/clothing/head/culthood/alt
|
||||
name = "cultist hood"
|
||||
desc = "An armored hood worn by the followers of Nar'Sie."
|
||||
@@ -313,15 +309,15 @@
|
||||
/obj/item/clothing/suit/cultrobes/alt/ghost
|
||||
item_flags = NODROP | DROPDEL
|
||||
|
||||
|
||||
/obj/item/clothing/head/magus
|
||||
name = "magus helm"
|
||||
icon_state = "magus"
|
||||
item_state = "magus"
|
||||
desc = "A helm worn by the followers of Nar'Sie."
|
||||
flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDEEARS|HIDEEYES
|
||||
flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDEEARS|HIDEEYES|HIDESNOUT
|
||||
armor = list("melee" = 30, "bullet" = 30, "laser" = 30,"energy" = 20, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 10, "acid" = 10)
|
||||
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/suit/magusred
|
||||
name = "magus robes"
|
||||
@@ -528,7 +524,12 @@
|
||||
"The shuttle's custodian was found washing the windows with their own blood.",
|
||||
"A shuttle engineer began screaming 'DEATH IS NOT THE END' and ripped out wires until an arc flash seared off her flesh.",
|
||||
"A shuttle inspector started laughing madly over the radio and then threw herself into an engine turbine.",
|
||||
"An assistant was found on the shuttle.",
|
||||
"A medical officer was found pouring out several blood bags onto the shuttle's instrument panels, before slitting both wrists open and screaming 'DEATH IS NOT THE END'.",
|
||||
"A fuel technician was found replacing the fuel with his blood.",
|
||||
"All the lights aboard the shuttle turned a crimson red before blowing out..",
|
||||
"The shuttle dispatcher was found dead with bloody symbols carved into their flesh.",
|
||||
"An engine turbine began leaking blood when it was powered on.",
|
||||
"The shuttle's transponder is emitting the encoded message 'FEAR THE OLD BLOOD' in lieu of its assigned identification signal.")
|
||||
var/message = pick_n_take(curses)
|
||||
message += " The shuttle will be delayed by three minutes."
|
||||
|
||||
@@ -58,18 +58,12 @@
|
||||
<A href='byond://?src=[REF(src)];send=1'>Send Signal</A><BR>
|
||||
<B>Frequency/Code</B> for signaler:<BR>
|
||||
Frequency:
|
||||
<A href='byond://?src=[REF(src)];freq=-10'>-</A>
|
||||
<A href='byond://?src=[REF(src)];freq=-2'>-</A>
|
||||
[format_frequency(src.frequency)]
|
||||
<A href='byond://?src=[REF(src)];freq=2'>+</A>
|
||||
<A href='byond://?src=[REF(src)];freq=10'>+</A><BR>
|
||||
<A href='byond://?src=[REF(src)];set=freq'>Set</A><BR>
|
||||
|
||||
Code:
|
||||
<A href='byond://?src=[REF(src)];code=-5'>-</A>
|
||||
<A href='byond://?src=[REF(src)];code=-1'>-</A>
|
||||
[src.code]
|
||||
<A href='byond://?src=[REF(src)];code=1'>+</A>
|
||||
<A href='byond://?src=[REF(src)];code=5'>+</A><BR>
|
||||
<A href='byond://?src=[REF(src)];set=code'>Set</A><BR>
|
||||
[t1]
|
||||
</TT>"}
|
||||
user << browse(dat, "window=radio")
|
||||
@@ -85,17 +79,23 @@ Code:
|
||||
onclose(usr, "radio")
|
||||
return
|
||||
|
||||
if (href_list["freq"])
|
||||
var/new_frequency = (frequency + text2num(href_list["freq"]))
|
||||
if(new_frequency < MIN_FREE_FREQ || new_frequency > MAX_FREE_FREQ)
|
||||
new_frequency = sanitize_frequency(new_frequency)
|
||||
set_frequency(new_frequency)
|
||||
if (href_list["set"])
|
||||
|
||||
if(href_list["code"])
|
||||
src.code += text2num(href_list["code"])
|
||||
src.code = round(src.code)
|
||||
src.code = min(100, src.code)
|
||||
src.code = max(1, src.code)
|
||||
if(href_list["set"] == "freq")
|
||||
var/new_freq = input(usr, "Input a new signalling frequency", "Remote Signaller Frequency", format_frequency(frequency)) as num|null
|
||||
if(!usr.canUseTopic(src, BE_CLOSE))
|
||||
return
|
||||
new_freq = unformat_frequency(new_freq)
|
||||
new_freq = sanitize_frequency(new_freq, TRUE)
|
||||
set_frequency(new_freq)
|
||||
|
||||
if(href_list["set"] == "code")
|
||||
var/new_code = input(usr, "Input a new signalling code", "Remote Signaller Code", code) as num|null
|
||||
if(!usr.canUseTopic(src, BE_CLOSE))
|
||||
return
|
||||
new_code = round(new_code)
|
||||
new_code = CLAMP(new_code, 1, 100)
|
||||
code = new_code
|
||||
|
||||
if(href_list["send"])
|
||||
spawn( 0 )
|
||||
@@ -206,4 +206,4 @@ Code:
|
||||
/obj/item/assembly/signaler/cyborg/attackby(obj/item/W, mob/user, params)
|
||||
return
|
||||
/obj/item/assembly/signaler/cyborg/screwdriver_act(mob/living/user, obj/item/I)
|
||||
return
|
||||
return
|
||||
@@ -55,7 +55,6 @@
|
||||
contents_cost = 700
|
||||
export_types = list(/obj/structure/reagent_dispensers/beerkeg)
|
||||
|
||||
|
||||
/datum/export/large/pipedispenser
|
||||
cost = 500
|
||||
unit_name = "pipe dispenser"
|
||||
@@ -122,7 +121,6 @@
|
||||
unit_name = "packaged antimatter reactor section"
|
||||
export_types = list(/obj/item/am_shielding_container)
|
||||
|
||||
|
||||
/datum/export/large/iv
|
||||
cost = 50
|
||||
unit_name = "iv drip"
|
||||
@@ -133,3 +131,86 @@
|
||||
unit_name = "security barrier"
|
||||
export_types = list(/obj/item/grenade/barrier, /obj/structure/barricade/security)
|
||||
|
||||
/datum/export/large/odysseus
|
||||
cost = 5500
|
||||
unit_name = "working odysseus"
|
||||
export_types = list(/obj/mecha/medical/odysseus)
|
||||
include_subtypes = FALSE
|
||||
|
||||
/datum/export/large/ripley
|
||||
cost = 6500
|
||||
unit_name = "working ripley"
|
||||
export_types = list(/obj/mecha/working/ripley)
|
||||
include_subtypes = FALSE
|
||||
|
||||
/datum/export/large/firefighter
|
||||
cost = 9000
|
||||
unit_name = "working firefighter"
|
||||
export_types = list(/obj/mecha/working/ripley/firefighter)
|
||||
include_subtypes = FALSE
|
||||
|
||||
/datum/export/large/gygax
|
||||
cost = 19000
|
||||
unit_name = "working gygax"
|
||||
export_types = list(/obj/mecha/combat/gygax)
|
||||
include_subtypes = FALSE
|
||||
|
||||
/datum/export/large/durand
|
||||
cost = 10000
|
||||
unit_name = "working durand"
|
||||
export_types = list(/obj/mecha/combat/durand)
|
||||
include_subtypes = FALSE
|
||||
|
||||
/datum/export/large/phazon
|
||||
cost = 25000 //Little over half do to needing a core
|
||||
unit_name = "working phazon"
|
||||
export_types = list(/obj/mecha/combat/phazon)
|
||||
include_subtypes = FALSE
|
||||
|
||||
/datum/export/large/marauder
|
||||
cost = 15000 //Still a Combat class mech - CC tech as well! 150% "normal" boundy price.
|
||||
unit_name = "working marauder"
|
||||
export_types = list(/obj/mecha/combat/marauder)
|
||||
include_subtypes = FALSE
|
||||
|
||||
/datum/export/large/deathripley
|
||||
cost = 8500 //Still a "Combat class" mech - Illegal tech as well! 165% "normal" boundy price.
|
||||
unit_name = "working illegally modified"
|
||||
export_types = list(/obj/mecha/working/ripley/deathripley)
|
||||
include_subtypes = FALSE
|
||||
|
||||
/datum/export/large/gygaxdark
|
||||
cost = 28500 //Still a Combat class mech - Illegal tech as well! 150% "normal" boundy price.
|
||||
unit_name = "working illegally modified gygax"
|
||||
export_types = list(/obj/mecha/combat/gygax/dark)
|
||||
include_subtypes = FALSE
|
||||
|
||||
/datum/export/large/oldripley
|
||||
cost = 6250 //old mech - Scrap metal ! 50% "normal" boundy price.
|
||||
unit_name = "working miner ripley"
|
||||
export_types = list(/obj/mecha/working/ripley/mining)
|
||||
include_subtypes = FALSE
|
||||
|
||||
/datum/export/large/honk
|
||||
cost = 12000 //Still a "Combat class" mech - Comats bordem honk!
|
||||
unit_name = "working honker"
|
||||
export_types = list(/obj/mecha/combat/honker)
|
||||
include_subtypes = FALSE
|
||||
|
||||
/datum/export/large/reticence
|
||||
cost = 12000 //Still a "Combat class" mech - Has cloking and lethal weaponds.
|
||||
unit_name = "working reticence"
|
||||
export_types = list(/obj/mecha/combat/reticence)
|
||||
include_subtypes = FALSE
|
||||
|
||||
/datum/export/large/seraph
|
||||
cost = 25500 //Still a Combat class mech - CC tech as well! 150% "normal" boundy price.
|
||||
unit_name = "working seraph"
|
||||
export_types = list(/obj/mecha/combat/marauder/seraph)
|
||||
include_subtypes = FALSE
|
||||
|
||||
/datum/export/large/mauler
|
||||
cost = 12000 //Still a Combat class mech - CC lethal weaponds.
|
||||
unit_name = "working legally modified marauder"
|
||||
export_types = list(/obj/mecha/combat/marauder/mauler)
|
||||
include_subtypes = FALSE
|
||||
|
||||
@@ -81,6 +81,21 @@
|
||||
crate_name = "emergency crate"
|
||||
crate_type = /obj/structure/closet/crate/internals
|
||||
|
||||
/datum/supply_pack/emergency/radiatione_emergency
|
||||
name = "Emergenc Radiation Protection Crate"
|
||||
desc = "Survive the Nuclear Apocalypse and Supermatter Engine alike with two sets of Radiation suits. Each set contains a helmet, suit, and Geiger counter. We'll even throw in a few pill bottles that are able to handles radiation and the affects of the poisoning."
|
||||
cost = 2500
|
||||
contains = list(/obj/item/clothing/head/radiation,
|
||||
/obj/item/clothing/head/radiation,
|
||||
/obj/item/clothing/suit/radiation,
|
||||
/obj/item/clothing/suit/radiation,
|
||||
/obj/item/geiger_counter,
|
||||
/obj/item/geiger_counter,
|
||||
/obj/item/storage/pill_bottle/mutarad,
|
||||
/obj/item/storage/firstaid/radbgone)
|
||||
crate_name = "radiation protection crate"
|
||||
crate_type = /obj/structure/closet/crate/radiation
|
||||
|
||||
/datum/supply_pack/emergency/rcds
|
||||
name = "Emergency RCDs"
|
||||
desc = "Bombs going off on station? SME blown and now you need to fix the hole it left behind? Well this crate has a pare of Rcds to be able to easily fix up any problem you may have!"
|
||||
@@ -1357,6 +1372,19 @@
|
||||
/obj/item/storage/firstaid/o2)
|
||||
crate_name = "oxygen deprivation kit crate"
|
||||
|
||||
/datum/supply_pack/medical/advrad
|
||||
name = "Radiation Treatment Crate Deluxe"
|
||||
desc = "A crate for when radiation is out of hand... Contains two rad-b-gone kits, one bottle of anti radiation deluxe pill bottle, as well as a radiation treatment deluxe pill bottle!"
|
||||
cost = 3500
|
||||
contains = list(/obj/item/storage/pill_bottle/antirad_plus,
|
||||
/obj/item/storage/pill_bottle/mutarad,
|
||||
/obj/item/storage/firstaid/radbgone,
|
||||
/obj/item/storage/firstaid/radbgone,
|
||||
/obj/item/geiger_counter,
|
||||
/obj/item/geiger_counter)
|
||||
crate_name = "radiation protection crate"
|
||||
crate_type = /obj/structure/closet/crate/radiation
|
||||
|
||||
/datum/supply_pack/medical/surgery
|
||||
name = "Surgical Supplies Crate"
|
||||
desc = "Do you want to perform surgery, but don't have one of those fancy shmancy degrees? Just get started with this crate containing a medical duffelbag, Sterilizine spray and collapsible roller bed."
|
||||
@@ -1671,7 +1699,7 @@
|
||||
/obj/item/t_scanner/adv_mining_scanner/lesser,
|
||||
/obj/item/radio/headset/headset_cargo/mining,
|
||||
/obj/item/storage/bag/ore,
|
||||
/obj/item/clothing/suit/hooded/explorer,
|
||||
/obj/item/clothing/suit/hooded/explorer/standard,
|
||||
/obj/item/clothing/mask/gas/explorer)
|
||||
crate_name = "shaft miner starter kit"
|
||||
crate_type = /obj/structure/closet/crate/secure
|
||||
|
||||
@@ -21,6 +21,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
var/last_ip
|
||||
var/last_id
|
||||
|
||||
//Cooldowns for saving/loading. These are four are all separate due to loading code calling these one after another
|
||||
var/saveprefcooldown
|
||||
var/loadprefcooldown
|
||||
var/savecharcooldown
|
||||
var/loadcharcooldown
|
||||
|
||||
//game-preferences
|
||||
var/lastchangelog = "" //Saved changlog filesize to detect if there was a change
|
||||
var/ooccolor = null
|
||||
@@ -75,13 +81,80 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
var/eye_color = "000" //Eye color
|
||||
var/datum/species/pref_species = new /datum/species/human() //Mutant race
|
||||
var/list/features = list("mcolor" = "FFF",
|
||||
"tail_lizard" = "Smooth", "tail_human" = "Cat",
|
||||
"snout" = "Round", "horns" = "None", "ears" = "Cat",
|
||||
"wings" = "None", "frills" = "None", "spines" = "None",
|
||||
"body_markings" = "None", "legs" = "Normal Legs", "moth_wings" = "Plain")
|
||||
"tail_lizard" = "Smooth",
|
||||
"tail_human" = "None",
|
||||
"snout" = "Round",
|
||||
"horns" = "None",
|
||||
"ears" = "None",
|
||||
"wings" = "None",
|
||||
"frills" = "None",
|
||||
"spines" = "None",
|
||||
"body_markings" = "None",
|
||||
"legs" = "Normal Legs",
|
||||
"moth_wings" = "Plain",
|
||||
"mcolor2" = "FFF",
|
||||
"mcolor3" = "FFF",
|
||||
"mam_body_markings" = "Plain",
|
||||
"mam_ears" = "None",
|
||||
"mam_snouts" = "None",
|
||||
"mam_tail" = "None",
|
||||
"mam_tail_animated" = "None",
|
||||
"xenodorsal" = "Standard",
|
||||
"xenohead" = "Standard",
|
||||
"xenotail" = "Xenomorph Tail",
|
||||
"taur" = "None",
|
||||
"exhibitionist" = FALSE,
|
||||
"genitals_use_skintone" = FALSE,
|
||||
"has_cock" = FALSE,
|
||||
"cock_shape" = "Human",
|
||||
"cock_length" = 6,
|
||||
"cock_girth_ratio" = COCK_GIRTH_RATIO_DEF,
|
||||
"cock_color" = "fff",
|
||||
"has_sheath" = FALSE,
|
||||
"sheath_color" = "fff",
|
||||
"has_balls" = FALSE,
|
||||
"balls_internal" = FALSE,
|
||||
"balls_color" = "fff",
|
||||
"balls_amount" = 2,
|
||||
"balls_sack_size" = BALLS_SACK_SIZE_DEF,
|
||||
"balls_size" = BALLS_SIZE_DEF,
|
||||
"balls_cum_rate" = CUM_RATE,
|
||||
"balls_cum_mult" = CUM_RATE_MULT,
|
||||
"balls_efficiency" = CUM_EFFICIENCY,
|
||||
"balls_fluid" = "semen",
|
||||
"has_ovi" = FALSE,
|
||||
"ovi_shape" = "knotted",
|
||||
"ovi_length" = 6,
|
||||
"ovi_color" = "fff",
|
||||
"has_eggsack" = FALSE,
|
||||
"eggsack_internal" = TRUE,
|
||||
"eggsack_color" = "fff",
|
||||
"eggsack_size" = BALLS_SACK_SIZE_DEF,
|
||||
"eggsack_egg_color" = "fff",
|
||||
"eggsack_egg_size" = EGG_GIRTH_DEF,
|
||||
"has_breasts" = FALSE,
|
||||
"breasts_color" = "fff",
|
||||
"breasts_size" = "C",
|
||||
"breasts_shape" = "Pair",
|
||||
"breasts_fluid" = "milk",
|
||||
"has_vag" = FALSE,
|
||||
"vag_shape" = "Human",
|
||||
"vag_color" = "fff",
|
||||
"vag_clits" = 1,
|
||||
"vag_clit_diam" = 0.25,
|
||||
"has_womb" = FALSE,
|
||||
"womb_cum_rate" = CUM_RATE,
|
||||
"womb_cum_mult" = CUM_RATE_MULT,
|
||||
"womb_efficiency" = CUM_EFFICIENCY,
|
||||
"womb_fluid" = "femcum",
|
||||
"ipc_screen" = "Sunburst",
|
||||
"ipc_antenna" = "None",
|
||||
"flavor_text" = ""
|
||||
)
|
||||
|
||||
var/list/custom_names = list()
|
||||
var/prefered_security_department = SEC_DEPT_RANDOM
|
||||
var/custom_species = null
|
||||
|
||||
//Quirk list
|
||||
var/list/positive_quirks = list()
|
||||
@@ -127,6 +200,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
|
||||
var/action_buttons_screen_locs = list()
|
||||
|
||||
//backgrounds
|
||||
var/mutable_appearance/character_background
|
||||
var/icon/bgstate = "steel"
|
||||
var/list/bgstate_options = list("000", "midgrey", "FFF", "white", "steel", "techmaint", "dark", "plating", "reinforced")
|
||||
|
||||
/datum/preferences/New(client/C)
|
||||
parent = C
|
||||
|
||||
@@ -264,8 +342,10 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "<h2>Body</h2>"
|
||||
dat += "<b>Gender:</b><a style='display:block;width:100px' href='?_src_=prefs;preference=gender'>[gender == MALE ? "Male" : (gender == FEMALE ? "Female" : (gender == PLURAL ? "Non-binary" : "Object"))]</a><BR>"
|
||||
dat += "<b>Species:</b><a style='display:block;width:100px' href='?_src_=prefs;preference=species;task=input'>[pref_species.id]</a><BR>"
|
||||
dat += "<b>Custom Species Name:</b><a style='display:block;width:100px' href='?_src_=prefs;preference=custom_species;task=input'>[custom_species ? custom_species : "None"]</a><BR>"
|
||||
dat += "<a style='display:block;width:100px' href='?_src_=prefs;preference=all;task=random'>Random Body</A><BR>"
|
||||
dat += "<b>Always Random Body:</b><a href='?_src_=prefs;preference=all'>[be_random_body ? "Yes" : "No"]</A><BR>"
|
||||
dat += "<br><b>Cycle background:</b><a style='display:block;width:100px' href='?_src_=prefs;preference=cycle_bg;task=input'>[bgstate]</a><BR>"
|
||||
|
||||
var/use_skintones = pref_species.use_skintones
|
||||
if(use_skintones)
|
||||
@@ -810,10 +890,10 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "<tr><td colspan=4><hr></td></tr>"
|
||||
dat += "<tr><td colspan=4><b><center>[gear_tab]</center></b></td></tr>"
|
||||
dat += "<tr><td colspan=4><hr></td></tr>"
|
||||
dat += "<tr style='vertical-align:top;'><td width=15%><b>Name</b></td>"
|
||||
dat += "<td width=5% style='vertical-align:top'><b>Cost</b></td>"
|
||||
dat += "<td><font size=2><b>Restrictions</b></font></td>"
|
||||
dat += "<td><font size=2><b>Description</b></font></td></tr>"
|
||||
dat += "<tr width=10% style='vertical-align:top;'><td width=15%><b>Name</b></td>"
|
||||
dat += "<td style='vertical-align:top'><b>Cost</b></td>"
|
||||
dat += "<td width=10%><font size=2><b>Restrictions</b></font></td>"
|
||||
dat += "<td width=80%><font size=2><b>Description</b></font></td></tr>"
|
||||
for(var/j in GLOB.loadout_items[gear_tab])
|
||||
var/datum/gear/gear = GLOB.loadout_items[gear_tab][j]
|
||||
var/donoritem
|
||||
@@ -834,9 +914,14 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "<td width = 5% style='vertical-align:top'>[gear.cost]</td><td>"
|
||||
if(islist(gear.restricted_roles))
|
||||
if(gear.restricted_roles.len)
|
||||
dat += "<font size=2>"
|
||||
dat += gear.restricted_roles.Join(";")
|
||||
dat += "</font>"
|
||||
if(gear.restricted_desc)
|
||||
dat += "<font size=2>"
|
||||
dat += gear.restricted_desc
|
||||
dat += "</font>"
|
||||
else
|
||||
dat += "<font size=2>"
|
||||
dat += gear.restricted_roles.Join(";")
|
||||
dat += "</font>"
|
||||
dat += "</td><td><font size=2><i>[gear.description]</i></font></td></tr>"
|
||||
dat += "</table>"
|
||||
|
||||
@@ -1385,48 +1470,35 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
|
||||
if("hair_style")
|
||||
var/new_hair_style
|
||||
if(gender == MALE)
|
||||
new_hair_style = input(user, "Choose your character's hair style:", "Character Preference") as null|anything in GLOB.hair_styles_male_list
|
||||
else
|
||||
new_hair_style = input(user, "Choose your character's hair style:", "Character Preference") as null|anything in GLOB.hair_styles_female_list
|
||||
new_hair_style = input(user, "Choose your character's hair style:", "Character Preference") as null|anything in GLOB.hair_styles_list
|
||||
if(new_hair_style)
|
||||
hair_style = new_hair_style
|
||||
|
||||
if("next_hair_style")
|
||||
if (gender == MALE)
|
||||
hair_style = next_list_item(hair_style, GLOB.hair_styles_male_list)
|
||||
else
|
||||
hair_style = next_list_item(hair_style, GLOB.hair_styles_female_list)
|
||||
hair_style = next_list_item(hair_style, GLOB.hair_styles_list)
|
||||
|
||||
if("previous_hair_style")
|
||||
if (gender == MALE)
|
||||
hair_style = previous_list_item(hair_style, GLOB.hair_styles_male_list)
|
||||
else
|
||||
hair_style = previous_list_item(hair_style, GLOB.hair_styles_female_list)
|
||||
hair_style = previous_list_item(hair_style, GLOB.hair_styles_list)
|
||||
|
||||
if("facial")
|
||||
var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference","#"+facial_hair_color) as color|null
|
||||
if(new_facial)
|
||||
facial_hair_color = sanitize_hexcolor(new_facial)
|
||||
if("facial_hair_style")
|
||||
var/new_facial_hair_style
|
||||
if(gender == MALE)
|
||||
new_facial_hair_style = input(user, "Choose your character's facial-hair style:", "Character Preference") as null|anything in GLOB.facial_hair_styles_male_list
|
||||
else
|
||||
new_facial_hair_style = input(user, "Choose your character's facial-hair style:", "Character Preference") as null|anything in GLOB.facial_hair_styles_female_list
|
||||
if(new_facial_hair_style)
|
||||
facial_hair_style = new_facial_hair_style
|
||||
|
||||
if("facial_hair_style")
|
||||
var/new_facial_hair_style
|
||||
new_facial_hair_style = input(user, "Choose your character's facial-hair style:", "Character Preference") as null|anything in GLOB.facial_hair_styles_list
|
||||
if(new_facial_hair_style)
|
||||
facial_hair_style = new_facial_hair_style
|
||||
|
||||
if("next_facehair_style")
|
||||
if (gender == MALE)
|
||||
facial_hair_style = next_list_item(facial_hair_style, GLOB.facial_hair_styles_male_list)
|
||||
else
|
||||
facial_hair_style = next_list_item(facial_hair_style, GLOB.facial_hair_styles_female_list)
|
||||
if("previous_facehair_style")
|
||||
if (gender == MALE)
|
||||
facial_hair_style = previous_list_item(facial_hair_style, GLOB.facial_hair_styles_male_list)
|
||||
else
|
||||
facial_hair_style = previous_list_item(facial_hair_style, GLOB.facial_hair_styles_female_list)
|
||||
facial_hair_style = next_list_item(facial_hair_style, GLOB.facial_hair_styles_list)
|
||||
|
||||
if("previous_facehair_style")
|
||||
facial_hair_style = previous_list_item(facial_hair_style, GLOB.facial_hair_styles_list)
|
||||
|
||||
if("cycle_bg")
|
||||
bgstate = next_list_item(bgstate, bgstate_options)
|
||||
|
||||
if("underwear")
|
||||
var/new_underwear
|
||||
@@ -1463,18 +1535,16 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
var/newtype = GLOB.species_list[result]
|
||||
pref_species = new newtype()
|
||||
//let's ensure that no weird shit happens on species swapping.
|
||||
custom_species = null
|
||||
if(!("body_markings" in pref_species.default_features))
|
||||
features["body_markings"] = "None"
|
||||
if(!("mam_body_markings" in pref_species.default_features))
|
||||
features["mam_body_markings"] = "None"
|
||||
if("mam_body_markings" in pref_species.default_features && features["mam_body_markings"] == "None")
|
||||
features["mam_body_markings"] = "Plain"
|
||||
if("mam_body_markings" in pref_species.default_features)
|
||||
if(features["mam_body_markings"] == "None")
|
||||
features["mam_body_markings"] = "Plain"
|
||||
if("tail_lizard" in pref_species.default_features)
|
||||
features["tail_lizard"] = "Smooth"
|
||||
if("mam_tail" in pref_species.default_features)
|
||||
features["mam_tail"] = "None"
|
||||
if("mam_ears" in pref_species.default_features)
|
||||
features["mam_ears"] = "None"
|
||||
if(pref_species.id == "felinid")
|
||||
features["mam_tail"] = "Cat"
|
||||
features["mam_ears"] = "Cat"
|
||||
@@ -1488,6 +1558,13 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if(features["mcolor3"] == "#000" || (!(MUTCOLORS_PARTSONLY in pref_species.species_traits) && ReadHSV(temp_hsv)[3] < ReadHSV("#202020")[3]))
|
||||
features["mcolor3"] = pref_species.default_color
|
||||
|
||||
if("custom_species")
|
||||
var/new_species = reject_bad_name(input(user, "Choose your species subtype, if unique. This will show up on examinations and health scans. Do not abuse this:", "Character Preference", custom_species) as null|text)
|
||||
if(new_species)
|
||||
custom_species = new_species
|
||||
else
|
||||
custom_species = null
|
||||
|
||||
if("mutant_color")
|
||||
var/new_mutantcolor = input(user, "Choose your character's alien/mutant color:", "Character Preference","#"+features["mcolor"]) as color|null
|
||||
if(new_mutantcolor)
|
||||
@@ -1584,16 +1661,33 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
features["tail_lizard"] = "None"
|
||||
|
||||
if("snout")
|
||||
var/list/snowflake_snouts_list = list()
|
||||
for(var/path in GLOB.snouts_list)
|
||||
var/datum/sprite_accessory/mam_snouts/instance = GLOB.snouts_list[path]
|
||||
if(istype(instance, /datum/sprite_accessory))
|
||||
var/datum/sprite_accessory/S = instance
|
||||
if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(user.client.ckey)))
|
||||
snowflake_snouts_list[S.name] = path
|
||||
var/new_snout
|
||||
new_snout = input(user, "Choose your character's snout:", "Character Preference") as null|anything in GLOB.snouts_list
|
||||
new_snout = input(user, "Choose your character's snout:", "Character Preference") as null|anything in snowflake_snouts_list
|
||||
if(new_snout)
|
||||
features["snout"] = new_snout
|
||||
features["mam_snouts"] = "None"
|
||||
|
||||
|
||||
if("mam_snouts")
|
||||
var/list/snowflake_mam_snouts_list = list()
|
||||
for(var/path in GLOB.mam_snouts_list)
|
||||
var/datum/sprite_accessory/mam_snouts/instance = GLOB.mam_snouts_list[path]
|
||||
if(istype(instance, /datum/sprite_accessory))
|
||||
var/datum/sprite_accessory/S = instance
|
||||
if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(user.client.ckey)))
|
||||
snowflake_mam_snouts_list[S.name] = path
|
||||
var/new_mam_snouts
|
||||
new_mam_snouts = input(user, "Choose your character's snout:", "Character Preference") as null|anything in GLOB.mam_snouts_list
|
||||
new_mam_snouts = input(user, "Choose your character's snout:", "Character Preference") as null|anything in snowflake_mam_snouts_list
|
||||
if(new_mam_snouts)
|
||||
features["mam_snouts"] = new_mam_snouts
|
||||
features["snout"] = "None"
|
||||
|
||||
if("horns")
|
||||
var/new_horns
|
||||
@@ -1601,12 +1695,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if(new_horns)
|
||||
features["horns"] = new_horns
|
||||
|
||||
if("ears")
|
||||
var/new_ears
|
||||
new_ears = input(user, "Choose your character's ears:", "Character Preference") as null|anything in GLOB.ears_list
|
||||
if(new_ears)
|
||||
features["ears"] = new_ears
|
||||
|
||||
if("wings")
|
||||
var/new_wings
|
||||
new_wings = input(user, "Choose your character's wings:", "Character Preference") as null|anything in GLOB.r_wings_list
|
||||
@@ -2115,6 +2203,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
character.real_name = nameless ? "[real_name] #[rand(10000, 99999)]" : real_name
|
||||
character.name = character.real_name
|
||||
character.nameless = nameless
|
||||
character.custom_species = custom_species
|
||||
|
||||
character.gender = gender
|
||||
character.age = age
|
||||
@@ -2149,34 +2238,29 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
character.dna.features = features.Copy()
|
||||
character.dna.real_name = character.real_name
|
||||
character.dna.nameless = character.nameless
|
||||
character.dna.custom_species = character.custom_species
|
||||
|
||||
if("tail_lizard" in pref_species.default_features)
|
||||
character.dna.species.mutant_bodyparts |= "tail_lizard"
|
||||
else if("mam_tail" in pref_species.default_features)
|
||||
if("mam_tail" in pref_species.default_features)
|
||||
character.dna.species.mutant_bodyparts |= "mam_tail"
|
||||
else if("xenotail" in pref_species.default_features)
|
||||
if("xenotail" in pref_species.default_features)
|
||||
character.dna.species.mutant_bodyparts |= "xenotail"
|
||||
|
||||
if("legs" in pref_species.default_features)
|
||||
if(character.dna.features["legs"] == "Digitigrade Legs")
|
||||
pref_species.species_traits += DIGITIGRADE
|
||||
character.Digitigrade_Leg_Swap(FALSE)
|
||||
|
||||
if(character.dna.features["legs"] == "Normal Legs" && DIGITIGRADE in pref_species.species_traits)
|
||||
pref_species.species_traits -= DIGITIGRADE
|
||||
character.Digitigrade_Leg_Swap(TRUE)
|
||||
|
||||
else if((!"legs" in pref_species.default_features) && DIGITIGRADE in pref_species.species_traits)
|
||||
if(("legs" in character.dna.species.mutant_bodyparts) && character.dna.features["legs"] == "Digitigrade Legs")
|
||||
pref_species.species_traits |= DIGITIGRADE
|
||||
else
|
||||
pref_species.species_traits -= DIGITIGRADE
|
||||
character.Digitigrade_Leg_Swap(TRUE)
|
||||
|
||||
if(DIGITIGRADE in pref_species.species_traits)
|
||||
character.Digitigrade_Leg_Swap(FALSE)
|
||||
else
|
||||
character.Digitigrade_Leg_Swap(TRUE)
|
||||
|
||||
if(icon_updates)
|
||||
character.update_body()
|
||||
character.update_hair()
|
||||
character.update_body_parts()
|
||||
//let's be sure the character updates
|
||||
character.update_body()
|
||||
character.update_hair()
|
||||
character.update_body_parts()
|
||||
|
||||
/datum/preferences/proc/get_default_name(name_id)
|
||||
switch(name_id)
|
||||
|
||||
@@ -58,6 +58,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
/datum/preferences/proc/load_preferences()
|
||||
if(!path)
|
||||
return 0
|
||||
if(world.time < loadprefcooldown)
|
||||
if(istype(parent))
|
||||
to_chat(parent, "<span class='warning'>You're attempting to load your preferences a little too fast. Wait half a second, then try again.</span>")
|
||||
return 0
|
||||
loadprefcooldown = world.time + PREF_SAVELOAD_COOLDOWN
|
||||
if(!fexists(path))
|
||||
return 0
|
||||
|
||||
@@ -152,6 +157,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
/datum/preferences/proc/save_preferences()
|
||||
if(!path)
|
||||
return 0
|
||||
if(world.time < saveprefcooldown)
|
||||
if(istype(parent))
|
||||
to_chat(parent, "<span class='warning'>You're attempting to save your preferences a little too fast. Wait half a second, then try again.</span>")
|
||||
return 0
|
||||
saveprefcooldown = world.time + PREF_SAVELOAD_COOLDOWN
|
||||
var/savefile/S = new /savefile(path)
|
||||
if(!S)
|
||||
return 0
|
||||
@@ -204,6 +214,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
/datum/preferences/proc/load_character(slot)
|
||||
if(!path)
|
||||
return 0
|
||||
if(world.time < loadcharcooldown) //This is before the check to see if the filepath exists to ensure that BYOND can't get hung up on read attempts when the hard drive is a little slow
|
||||
if(istype(parent))
|
||||
to_chat(parent, "<span class='warning'>You're attempting to load your character a little too fast. Wait half a second, then try again.</span>")
|
||||
return "SLOW THE FUCK DOWN" //the reason this isn't null is to make sure that people don't have their character slots overridden by random chars if they accidentally double-click a slot
|
||||
loadcharcooldown = world.time + PREF_SAVELOAD_COOLDOWN
|
||||
if(!fexists(path))
|
||||
return 0
|
||||
var/savefile/S = new /savefile(path)
|
||||
@@ -236,6 +251,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
//Character
|
||||
S["real_name"] >> real_name
|
||||
S["nameless"] >> nameless
|
||||
S["custom_species"] >> custom_species
|
||||
S["name_is_always_random"] >> be_random_name
|
||||
S["body_is_always_random"] >> be_random_body
|
||||
S["gender"] >> gender
|
||||
@@ -260,12 +276,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
S["feature_lizard_body_markings"] >> features["body_markings"]
|
||||
S["feature_lizard_legs"] >> features["legs"]
|
||||
S["feature_moth_wings"] >> features["moth_wings"]
|
||||
if(!CONFIG_GET(flag/join_with_mutant_humans))
|
||||
features["tail_human"] = "none"
|
||||
features["ears"] = "none"
|
||||
else
|
||||
S["feature_human_tail"] >> features["tail_human"]
|
||||
S["feature_human_ears"] >> features["ears"]
|
||||
S["feature_human_tail"] >> features["tail_human"]
|
||||
S["feature_human_ears"] >> features["ears"]
|
||||
|
||||
//Custom names
|
||||
for(var/custom_name_id in GLOB.preferences_custom_names)
|
||||
@@ -354,7 +366,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
gender = sanitize_gender(gender, TRUE, TRUE)
|
||||
if(!real_name)
|
||||
real_name = random_unique_name(gender)
|
||||
|
||||
custom_species = reject_bad_name(custom_species)
|
||||
for(var/custom_name_id in GLOB.preferences_custom_names)
|
||||
var/namedata = GLOB.preferences_custom_names[custom_name_id]
|
||||
custom_names[custom_name_id] = reject_bad_name(custom_names[custom_name_id],namedata["allow_numbers"])
|
||||
@@ -388,15 +400,15 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
uplink_spawn_loc = sanitize_inlist(uplink_spawn_loc, GLOB.uplink_spawn_loc_list, initial(uplink_spawn_loc))
|
||||
features["mcolor"] = sanitize_hexcolor(features["mcolor"], 3, 0)
|
||||
features["tail_lizard"] = sanitize_inlist(features["tail_lizard"], GLOB.tails_list_lizard)
|
||||
features["tail_human"] = sanitize_inlist(features["tail_human"], GLOB.tails_list_human, "None")
|
||||
features["tail_human"] = sanitize_inlist(features["tail_human"], GLOB.tails_list_human)
|
||||
features["snout"] = sanitize_inlist(features["snout"], GLOB.snouts_list)
|
||||
features["horns"] = sanitize_inlist(features["horns"], GLOB.horns_list)
|
||||
features["ears"] = sanitize_inlist(features["ears"], GLOB.ears_list, "None")
|
||||
features["ears"] = sanitize_inlist(features["ears"], GLOB.ears_list)
|
||||
features["frills"] = sanitize_inlist(features["frills"], GLOB.frills_list)
|
||||
features["spines"] = sanitize_inlist(features["spines"], GLOB.spines_list)
|
||||
features["body_markings"] = sanitize_inlist(features["body_markings"], GLOB.body_markings_list)
|
||||
features["feature_lizard_legs"] = sanitize_inlist(features["legs"], GLOB.legs_list, "Normal Legs")
|
||||
features["moth_wings"] = sanitize_inlist(features["moth_wings"], GLOB.moth_wings_list, "Plain")
|
||||
features["feature_lizard_legs"] = sanitize_inlist(features["legs"], GLOB.legs_list)
|
||||
features["moth_wings"] = sanitize_inlist(features["moth_wings"], GLOB.moth_wings_list)
|
||||
|
||||
joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole))
|
||||
job_civilian_high = sanitize_integer(job_civilian_high, 0, 65535, initial(job_civilian_high))
|
||||
@@ -421,6 +433,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
/datum/preferences/proc/save_character()
|
||||
if(!path)
|
||||
return 0
|
||||
if(world.time < savecharcooldown)
|
||||
if(istype(parent))
|
||||
to_chat(parent, "<span class='warning'>You're attempting to save your character a little too fast. Wait half a second, then try again.</span>")
|
||||
return 0
|
||||
savecharcooldown = world.time + PREF_SAVELOAD_COOLDOWN
|
||||
var/savefile/S = new /savefile(path)
|
||||
if(!S)
|
||||
return 0
|
||||
@@ -431,6 +448,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
//Character
|
||||
WRITE_FILE(S["real_name"] , real_name)
|
||||
WRITE_FILE(S["nameless"] , nameless)
|
||||
WRITE_FILE(S["custom_species"] , custom_species)
|
||||
WRITE_FILE(S["name_is_always_random"] , be_random_name)
|
||||
WRITE_FILE(S["body_is_always_random"] , be_random_body)
|
||||
WRITE_FILE(S["gender"] , gender)
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
var/blockTracking = 0 //For AI tracking
|
||||
var/can_toggle = null
|
||||
dynamic_hair_suffix = "+generic"
|
||||
var/muzzle_var = NORMAL_STYLE
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION //not all hats have muzzles
|
||||
|
||||
/obj/item/clothing/head/Initialize()
|
||||
. = ..()
|
||||
@@ -15,6 +17,30 @@
|
||||
var/mob/living/carbon/human/H = loc
|
||||
H.update_hair()
|
||||
|
||||
/obj/item/clothing/head/equipped(mob/user, slot)
|
||||
..()
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
var/datum/species/pref_species = H.dna.species
|
||||
|
||||
if(mutantrace_variation)
|
||||
if("mam_snouts" in pref_species.default_features)
|
||||
if(H.dna.features["mam_snouts"] != "None")
|
||||
muzzle_var = ALT_STYLE
|
||||
else
|
||||
muzzle_var = NORMAL_STYLE
|
||||
|
||||
else if("snout" in pref_species.default_features)
|
||||
if(H.dna.features["snout"] != "None")
|
||||
muzzle_var = ALT_STYLE
|
||||
else
|
||||
muzzle_var = NORMAL_STYLE
|
||||
|
||||
else
|
||||
muzzle_var = NORMAL_STYLE
|
||||
|
||||
H.update_inv_head()
|
||||
|
||||
/obj/item/clothing/head/worn_overlays(isinhands = FALSE)
|
||||
. = list()
|
||||
if(!isinhands)
|
||||
|
||||
@@ -79,8 +79,9 @@
|
||||
name = "atmospheric technician's firefighting helmet"
|
||||
desc = "A firefighter's helmet, able to keep the user cool in any situation."
|
||||
clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
|
||||
heat_protection = HEAD
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
cold_protection = HEAD
|
||||
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
|
||||
@@ -74,6 +74,7 @@
|
||||
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
dog_fashion = null
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/head/helmet/attack_self(mob/user)
|
||||
if(can_toggle && !user.incapacitated())
|
||||
@@ -210,10 +211,11 @@
|
||||
icon_state = "knight_green"
|
||||
item_state = "knight_green"
|
||||
armor = list("melee" = 41, "bullet" = 15, "laser" = 5,"energy" = 5, "bomb" = 5, "bio" = 2, "rad" = 0, "fire" = 0, "acid" = 50)
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT
|
||||
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
strip_delay = 80
|
||||
dog_fashion = null
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
|
||||
|
||||
/obj/item/clothing/head/helmet/knight/Initialize(mapload)
|
||||
@@ -242,6 +244,7 @@
|
||||
icon_state = "skull"
|
||||
item_state = "skull"
|
||||
strip_delay = 100
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
|
||||
//LightToggle
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
icon_state = "captain"
|
||||
item_state = "that"
|
||||
flags_inv = 0
|
||||
armor = list("melee" = 25, "bullet" = 15, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
|
||||
armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
|
||||
strip_delay = 60
|
||||
dog_fashion = /datum/dog_fashion/head/captain
|
||||
|
||||
@@ -38,15 +38,28 @@
|
||||
|
||||
dog_fashion = null
|
||||
|
||||
/obj/item/clothing/head/caphat/beret
|
||||
name = "captain's beret"
|
||||
desc = "A beret fit for a leader."
|
||||
icon_state = "capberet"
|
||||
|
||||
dog_fashion = null
|
||||
|
||||
//Head of Personnel
|
||||
/obj/item/clothing/head/hopcap
|
||||
name = "head of personnel's cap"
|
||||
icon_state = "hopcap"
|
||||
desc = "The symbol of true bureaucratic micromanagement."
|
||||
armor = list("melee" = 25, "bullet" = 15, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
|
||||
armor = list("melee" = 30, "bullet" = 25, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
|
||||
dog_fashion = /datum/dog_fashion/head/hop
|
||||
|
||||
/obj/item/clothing/head/hopcap/beret
|
||||
name = "head of personnel's beret"
|
||||
desc = "The symbol of true bureaucratic micromanagement, although in a fancy form."
|
||||
icon_state = "hopberet"
|
||||
|
||||
dog_fashion = null
|
||||
|
||||
//Chaplain
|
||||
/obj/item/clothing/head/nun_hood
|
||||
name = "nun hood"
|
||||
@@ -164,3 +177,27 @@
|
||||
name = "treasure hunter's fedora"
|
||||
desc = "You got red text today kid, but it doesn't mean you have to like it."
|
||||
icon_state = "curator"
|
||||
|
||||
//Chief Medical Officer
|
||||
/obj/item/clothing/head/beret/cmo
|
||||
name = "chief medical officer's beret"
|
||||
desc = "A fancy beret with a green cross, signifying your status in the station's medbay."
|
||||
icon_state = "cmoberet"
|
||||
|
||||
//Research Director
|
||||
/obj/item/clothing/head/beret/rd
|
||||
name = "research director's beret"
|
||||
desc = "A beret worn only by highly intelligent people."
|
||||
icon_state = "rdberet"
|
||||
|
||||
//Chief Engineer
|
||||
/obj/item/clothing/head/beret/ce
|
||||
name = "chief engineer's beret"
|
||||
desc = "A beret that will surely make you look way cooler than a hard hat, although lack of protection is the price."
|
||||
icon_state = "ceberet"
|
||||
|
||||
//Quartermaster
|
||||
/obj/item/clothing/head/beret/qm
|
||||
name = "quartermaster's beret"
|
||||
desc = "This headwear shows off your Cargonian leadership"
|
||||
icon_state = "qmberet"
|
||||
|
||||
@@ -65,7 +65,8 @@
|
||||
icon_state = "syndicate-helm-black-red"
|
||||
item_state = "syndicate-helm-black-red"
|
||||
desc = "A plastic replica of a Syndicate agent's space helmet. You'll look just like a real murderous Syndicate agent in this! This is a toy, it is not made for use in space!"
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/head/cueball
|
||||
name = "cueball helmet"
|
||||
@@ -73,7 +74,7 @@
|
||||
icon_state = "cueball"
|
||||
item_state="cueball"
|
||||
flags_cover = HEADCOVERSEYES|HEADCOVERSMOUTH
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
|
||||
|
||||
/obj/item/clothing/head/snowman
|
||||
name = "Snowman Head"
|
||||
@@ -81,14 +82,14 @@
|
||||
icon_state = "snowman_h"
|
||||
item_state = "snowman_h"
|
||||
flags_cover = HEADCOVERSEYES
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
|
||||
|
||||
/obj/item/clothing/head/justice
|
||||
name = "justice hat"
|
||||
desc = "Fight for what's righteous!"
|
||||
icon_state = "justicered"
|
||||
item_state = "justicered"
|
||||
flags_inv = HIDEHAIR|HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR
|
||||
flags_inv = HIDEHAIR|HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR|HIDESNOUT
|
||||
flags_cover = HEADCOVERSEYES
|
||||
|
||||
/obj/item/clothing/head/justice/blue
|
||||
@@ -159,14 +160,14 @@
|
||||
desc = "Bkaw!"
|
||||
icon_state = "chickenhead"
|
||||
item_state = "chickensuit"
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
|
||||
|
||||
/obj/item/clothing/head/griffin
|
||||
name = "griffon head"
|
||||
desc = "Why not 'eagle head'? Who knows."
|
||||
icon_state = "griffinhat"
|
||||
item_state = "griffinhat"
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
|
||||
|
||||
/obj/item/clothing/head/bearpelt
|
||||
name = "bear pelt hat"
|
||||
@@ -179,7 +180,7 @@
|
||||
icon_state = "xenos"
|
||||
item_state = "xenos_helm"
|
||||
desc = "A helmet made out of chitinous alien hide."
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
|
||||
|
||||
/obj/item/clothing/head/fedora
|
||||
name = "fedora"
|
||||
@@ -267,13 +268,13 @@
|
||||
name = "paper sack hat"
|
||||
desc = "A paper sack with crude holes cut out for eyes. Useful for hiding one's identity or ugliness."
|
||||
icon_state = "papersack"
|
||||
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
|
||||
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS|HIDESNOUT
|
||||
|
||||
/obj/item/clothing/head/papersack/smiley
|
||||
name = "paper sack hat"
|
||||
desc = "A paper sack with crude holes cut out for eyes and a sketchy smile drawn on the front. Not creepy at all."
|
||||
icon_state = "papersack_smile"
|
||||
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
|
||||
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS|HIDESNOUT
|
||||
|
||||
/obj/item/clothing/head/crown
|
||||
name = "crown"
|
||||
@@ -297,7 +298,7 @@
|
||||
name = "foam lobster head"
|
||||
desc = "When everything's going to crab, protecting your head is the best choice."
|
||||
icon_state = "lobster_hat"
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
|
||||
|
||||
/obj/item/clothing/head/drfreezehat
|
||||
name = "doctor freeze's wig"
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
visor_flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
|
||||
visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
resistance_flags = FIRE_PROOF
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/head/welding/attack_self(mob/user)
|
||||
weldingvisortoggle(user)
|
||||
@@ -113,7 +114,7 @@
|
||||
icon_state = "hardhat0_pumpkin"
|
||||
item_state = "hardhat0_pumpkin"
|
||||
item_color = "pumpkin"
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
brightness_on = 2 //luminosity when on
|
||||
flags_cover = HEADCOVERSEYES
|
||||
@@ -163,7 +164,7 @@
|
||||
icon_state = "cardborg_h"
|
||||
item_state = "cardborg_h"
|
||||
flags_cover = HEADCOVERSEYES
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
|
||||
|
||||
dog_fashion = /datum/dog_fashion/head/cardborg
|
||||
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
equip_delay_other = 40
|
||||
var/mask_adjusted = 0
|
||||
var/adjusted_flags = null
|
||||
var/muzzle_var = NORMAL_STYLE
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION //most masks have overrides, but not all probably.
|
||||
|
||||
|
||||
/obj/item/clothing/mask/worn_overlays(isinhands = FALSE)
|
||||
@@ -18,6 +20,31 @@
|
||||
IF_HAS_BLOOD_DNA(src)
|
||||
. += mutable_appearance('icons/effects/blood.dmi', "maskblood")
|
||||
|
||||
/obj/item/clothing/mask/equipped(mob/user, slot)
|
||||
..()
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
var/datum/species/pref_species = H.dna.species
|
||||
|
||||
if(mutantrace_variation)
|
||||
if("mam_snouts" in pref_species.default_features)
|
||||
if(H.dna.features["mam_snouts"] != "None")
|
||||
muzzle_var = ALT_STYLE
|
||||
else
|
||||
muzzle_var = NORMAL_STYLE
|
||||
|
||||
else if("snout" in pref_species.default_features)
|
||||
if(H.dna.features["snout"] != "None")
|
||||
muzzle_var = ALT_STYLE
|
||||
else
|
||||
muzzle_var = NORMAL_STYLE
|
||||
|
||||
else
|
||||
muzzle_var = NORMAL_STYLE
|
||||
|
||||
H.update_inv_wear_mask()
|
||||
|
||||
|
||||
/obj/item/clothing/mask/update_clothes_damaged_state(damaging = TRUE)
|
||||
..()
|
||||
if(ismob(loc))
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
visor_flags_inv = HIDEFACE|HIDEFACIALHAIR
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
actions_types = list(/datum/action/item_action/adjust)
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/mask/balaclava/attack_self(mob/user)
|
||||
adjustmask(user)
|
||||
@@ -18,6 +19,7 @@
|
||||
item_state = "luchag"
|
||||
flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/mask/luchador/speechModification(message)
|
||||
if(copytext(message, 1, 2) != "*")
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
flags_cover = MASKCOVERSMOUTH
|
||||
visor_flags_cover = MASKCOVERSMOUTH
|
||||
resistance_flags = NONE
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/mask/breath/suicide_act(mob/living/carbon/user)
|
||||
user.visible_message("<span class='suicide'>[user] is wrapping \the [src]'s tube around [user.p_their()] neck! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
|
||||
@@ -3,13 +3,21 @@
|
||||
desc = "A face-covering mask that can be connected to an air supply. While good for concealing your identity, it isn't good for blocking gas flow." //More accurate
|
||||
icon_state = "gas_alt"
|
||||
clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
|
||||
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR
|
||||
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR|HIDESNOUT
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
item_state = "gas_alt"
|
||||
gas_transfer_coefficient = 0.01
|
||||
permeability_coefficient = 0.01
|
||||
flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH
|
||||
resistance_flags = NONE
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/mask/gas/glass
|
||||
name = "glass gas mask"
|
||||
desc = "A face-covering mask that can be connected to an air supply. This one doesn't obscure your face however." //More accurate
|
||||
icon_state = "gas_clear"
|
||||
flags_inv = HIDEEYES
|
||||
|
||||
|
||||
// **** Welding gas mask ****
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
gas_transfer_coefficient = 0.9
|
||||
equip_delay_other = 20
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/mask/muzzle/attack_paw(mob/user)
|
||||
if(iscarbon(user))
|
||||
@@ -30,6 +31,7 @@
|
||||
permeability_coefficient = 0.01
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 25, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
actions_types = list(/datum/action/item_action/adjust)
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/mask/surgical/attack_self(mob/user)
|
||||
adjustmask(user)
|
||||
@@ -39,6 +41,7 @@
|
||||
desc = "Warning: moustache is fake."
|
||||
icon_state = "fake-moustache"
|
||||
flags_inv = HIDEFACE
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/mask/fakemoustache/italian
|
||||
name = "italian moustache"
|
||||
@@ -66,6 +69,7 @@
|
||||
name = "joy mask"
|
||||
desc = "Express your happiness or hide your sorrows with this laughing face with crying tears of joy cutout."
|
||||
icon_state = "joy"
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/mask/pig
|
||||
name = "pig mask"
|
||||
@@ -225,6 +229,7 @@
|
||||
slot_flags = ITEM_SLOT_MASK
|
||||
adjusted_flags = ITEM_SLOT_HEAD
|
||||
icon_state = "bandbotany"
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/mask/bandana/attack_self(mob/user)
|
||||
adjustmask(user)
|
||||
|
||||
@@ -171,17 +171,114 @@
|
||||
icon_state = "stripedbluescarf"
|
||||
item_color = "stripedbluescarf"
|
||||
|
||||
/obj/item/clothing/neck/petcollar //don't really wear this though please c'mon seriously guys
|
||||
///////////
|
||||
//COLLARS//
|
||||
///////////
|
||||
|
||||
/obj/item/clothing/neck/petcollar
|
||||
name = "pet collar"
|
||||
desc = "It's for pets. Though you probably could wear it yourself, you'd doubtless be the subject of ridicule."
|
||||
desc = "It's for pets. Though you probably could wear it yourself, you'd doubtless be the subject of ridicule. It seems to be made out of a polychromic material."
|
||||
icon_state = "petcollar"
|
||||
item_color = "petcollar"
|
||||
alternate_worn_icon = 'icons/mob/neck.dmi' //Because, as it appears, the item itself is normally not directly aware of its worn overlays, so this is about the easiest way, without adding a new var.
|
||||
hasprimary = TRUE
|
||||
primary_color = "#00BBBB"
|
||||
pocket_storage_component_path = /datum/component/storage/concrete/pockets/small/collar
|
||||
var/tagname = null
|
||||
|
||||
/obj/item/clothing/neck/petcollar/attack_self(mob/user)
|
||||
tagname = copytext(sanitize(input(user, "Would you like to change the name on the tag?", "Name your new pet", "Spot") as null|text),1,MAX_NAME_LEN)
|
||||
name = "[initial(name)] - [tagname]"
|
||||
|
||||
/obj/item/clothing/neck/petcollar/worn_overlays(isinhands, icon_file)
|
||||
. = ..()
|
||||
if(hasprimary | hassecondary | hastertiary)
|
||||
if(!isinhands) //prevents the worn sprites from showing up if you're just holding them
|
||||
if(hasprimary) //checks if overlays are enabled
|
||||
var/mutable_appearance/primary_worn = mutable_appearance(alternate_worn_icon, "[item_color]-primary") //automagical sprite selection
|
||||
primary_worn.color = primary_color //colors the overlay
|
||||
. += primary_worn //adds the overlay onto the buffer list to draw on the mob sprite
|
||||
if(hassecondary)
|
||||
var/mutable_appearance/secondary_worn = mutable_appearance(alternate_worn_icon, "[item_color]-secondary")
|
||||
secondary_worn.color = secondary_color
|
||||
. += secondary_worn
|
||||
if(hastertiary)
|
||||
var/mutable_appearance/tertiary_worn = mutable_appearance(alternate_worn_icon, "[item_color]-tertiary")
|
||||
tertiary_worn.color = tertiary_color
|
||||
. += tertiary_worn
|
||||
|
||||
/obj/item/clothing/neck/petcollar/leather
|
||||
name = "leather pet collar"
|
||||
icon_state = "leathercollar"
|
||||
item_color = "leathercollar"
|
||||
|
||||
hasprimary = TRUE
|
||||
hassecondary = TRUE
|
||||
primary_color = "#222222"
|
||||
secondary_color = "#888888"
|
||||
|
||||
/obj/item/clothing/neck/petcollar/choker
|
||||
desc = "Quite fashionable... if you're somebody who's just read their first BDSM-themed erotica novel."
|
||||
name = "choker"
|
||||
icon_state = "choker"
|
||||
item_color = "choker"
|
||||
|
||||
hasprimary = TRUE
|
||||
primary_color = "#222222"
|
||||
|
||||
/obj/item/clothing/neck/petcollar/locked
|
||||
name = "locked collar"
|
||||
desc = "A collar that has a small lock on it to keep it from being removed."
|
||||
pocket_storage_component_path = /datum/component/storage/concrete/pockets/small/collar/locked
|
||||
var/lock = FALSE
|
||||
|
||||
/obj/item/clothing/neck/petcollar/locked/attackby(obj/item/K, mob/user, params)
|
||||
if(istype(K, /obj/item/key/collar))
|
||||
if(lock != FALSE)
|
||||
to_chat(user, "<span class='warning'>With a click the collar unlocks!</span>")
|
||||
lock = FALSE
|
||||
else
|
||||
to_chat(user, "<span class='warning'>With a click the collar locks!</span>")
|
||||
lock = TRUE
|
||||
return
|
||||
|
||||
/obj/item/clothing/neck/petcollar/locked/attack_hand(mob/user)
|
||||
if(loc == user && user.get_item_by_slot(SLOT_NECK) && lock != FALSE)
|
||||
to_chat(user, "<span class='warning'>The collar is locked! You'll need unlock the collar before you can take it off!</span>")
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/clothing/neck/petcollar/locked/leather
|
||||
name = "leather pet collar"
|
||||
icon_state = "leathercollar"
|
||||
item_color = "leathercollar"
|
||||
|
||||
hasprimary = TRUE
|
||||
hassecondary = TRUE
|
||||
primary_color = "#222222"
|
||||
secondary_color = "#888888"
|
||||
|
||||
/obj/item/clothing/neck/petcollar/locked/choker
|
||||
name = "choker"
|
||||
desc = "Quite fashionable... if you're somebody who's just read their first BDSM-themed erotica novel."
|
||||
icon_state = "choker"
|
||||
item_color = "choker"
|
||||
|
||||
hasprimary = TRUE
|
||||
primary_color = "#222222"
|
||||
|
||||
/obj/item/key/collar
|
||||
name = "Collar Key"
|
||||
desc = "A key for a tiny lock on a collar or bag."
|
||||
|
||||
/obj/item/clothing/neck/petcollar/Initialize()
|
||||
. = ..()
|
||||
new /obj/item/reagent_containers/food/snacks/cookie(src)
|
||||
|
||||
/obj/item/clothing/neck/petcollar/locked/Initialize()
|
||||
. = ..()
|
||||
new /obj/item/key/collar(src)
|
||||
|
||||
//////////////
|
||||
//DOPE BLING//
|
||||
//////////////
|
||||
@@ -191,4 +288,4 @@
|
||||
desc = "Damn, it feels good to be a gangster."
|
||||
icon = 'icons/obj/clothing/neck.dmi'
|
||||
icon_state = "bling"
|
||||
item_color = "bling"
|
||||
item_color = "bling"
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
item_state = "spaceold"
|
||||
permeability_coefficient = 0.01
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 50, "fire" = 80, "acid" = 70)
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
|
||||
dynamic_hair_suffix = ""
|
||||
dynamic_fhair_suffix = ""
|
||||
cold_protection = HEAD
|
||||
@@ -21,6 +21,7 @@
|
||||
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
resistance_flags = NONE
|
||||
dog_fashion = null
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/suit/space
|
||||
name = "space suit"
|
||||
|
||||
@@ -64,6 +64,7 @@ Contains:
|
||||
strip_delay = 130
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/suit/space/officer
|
||||
name = "officer's jacket"
|
||||
@@ -114,6 +115,7 @@ Contains:
|
||||
desc = "Ho ho ho. Merrry X-mas!"
|
||||
icon_state = "santahat"
|
||||
flags_cover = HEADCOVERSEYES
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
|
||||
dog_fashion = /datum/dog_fashion/head/santa
|
||||
|
||||
@@ -137,12 +139,14 @@ Contains:
|
||||
strip_delay = 40
|
||||
equip_delay_other = 20
|
||||
flags_cover = HEADCOVERSEYES
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/head/helmet/space/pirate/bandana
|
||||
name = "royal bandana"
|
||||
desc = "A space-proof bandanna crafted with reflective kevlar."
|
||||
icon_state = "bandana"
|
||||
item_state = "bandana"
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/suit/space/pirate
|
||||
name = "royal waistcoat "
|
||||
@@ -250,6 +254,7 @@ Contains:
|
||||
strip_delay = 130
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
resistance_flags = ACID_PROOF | FIRE_PROOF
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/suit/space/freedom
|
||||
name = "eagle suit"
|
||||
@@ -273,6 +278,7 @@ Contains:
|
||||
brightness_on = 0 //luminosity when on
|
||||
actions_types = list()
|
||||
item_flags = NODROP
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/carp
|
||||
@@ -295,6 +301,7 @@ Contains:
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
actions_types = list()
|
||||
resistance_flags = FIRE_PROOF
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/ert/paranormal
|
||||
name = "paranormal response team suit"
|
||||
@@ -304,6 +311,7 @@ Contains:
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
resistance_flags = FIRE_PROOF
|
||||
tauric = TRUE //Citadel Add for tauric hardsuits
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/ert/paranormal/Initialize()
|
||||
. = ..()
|
||||
|
||||
@@ -41,12 +41,6 @@
|
||||
if(tauric == TRUE)
|
||||
center = TRUE
|
||||
dimension_x = 64
|
||||
/*
|
||||
else if(H.dna.features["taur"] == "Horse" || "Cow")
|
||||
taurmode = HOOF_TAURIC //tweak this for when the exotics get their own suits, if ever.
|
||||
center = TRUE
|
||||
dimension_x = 64
|
||||
*/
|
||||
else
|
||||
taurmode = NOT_TAURIC
|
||||
if(tauric == TRUE)
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
item_state = "armoralt"
|
||||
blood_overlay_type = "armor"
|
||||
dog_fashion = /datum/dog_fashion/back
|
||||
tauric = TRUE //Citadel Add for tauric hardsuits
|
||||
|
||||
/obj/item/clothing/suit/armor/vest/alt
|
||||
desc = "A Type I armored vest that provides decent protection against most types of damage."
|
||||
|
||||
@@ -6,9 +6,10 @@
|
||||
permeability_coefficient = 0.01
|
||||
clothing_flags = THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 60, "fire" = 30, "acid" = 100)
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDEFACE
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDEFACE|HIDESNOUT
|
||||
resistance_flags = ACID_PROOF
|
||||
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/suit/bio_suit
|
||||
name = "bio suit"
|
||||
|
||||
@@ -5,7 +5,28 @@
|
||||
item_state = "labcoat"
|
||||
blood_overlay_type = "coat"
|
||||
body_parts_covered = CHEST|ARMS
|
||||
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/soap, /obj/item/sensor_device, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
|
||||
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/hypospray/mkii,
|
||||
/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/soap,
|
||||
/obj/item/sensor_device,
|
||||
/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" = 50, "acid" = 50)
|
||||
togglename = "buttons"
|
||||
species_exception = list(/datum/species/golem)
|
||||
|
||||
@@ -180,6 +180,7 @@
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/proc/ToggleHelmet()
|
||||
var/mob/living/carbon/human/H = src.loc
|
||||
var/datum/species/pref_species = H.dna.species
|
||||
if(!helmettype)
|
||||
return
|
||||
if(!helmet)
|
||||
@@ -193,6 +194,18 @@
|
||||
to_chat(H, "<span class='warning'>You're already wearing something on your head!</span>")
|
||||
return
|
||||
else if(H.equip_to_slot_if_possible(helmet,SLOT_HEAD,0,0,1))
|
||||
if(helmet.mutantrace_variation)
|
||||
if("mam_snouts" in pref_species.default_features)
|
||||
if(H.dna.features["mam_snouts"] != "None")
|
||||
helmet.muzzle_var = ALT_STYLE
|
||||
|
||||
else if("snout" in pref_species.default_features)
|
||||
if(H.dna.features["snout"] != "None")
|
||||
helmet.muzzle_var = ALT_STYLE
|
||||
else
|
||||
helmet.muzzle_var = NORMAL_STYLE
|
||||
H.update_inv_head()
|
||||
|
||||
to_chat(H, "<span class='notice'>You engage the helmet on the hardsuit.</span>")
|
||||
suittoggled = TRUE
|
||||
H.update_inv_wear_suit()
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
icon_state = "bombsuit"
|
||||
clothing_flags = THICKMATERIAL
|
||||
armor = list("melee" = 20, "bullet" = 0, "laser" = 20,"energy" = 10, "bomb" = 100, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50)
|
||||
flags_inv = HIDEFACE|HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR
|
||||
flags_inv = HIDEFACE|HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
|
||||
dynamic_hair_suffix = ""
|
||||
dynamic_fhair_suffix = ""
|
||||
cold_protection = HEAD
|
||||
@@ -71,6 +71,7 @@
|
||||
equip_delay_other = 70
|
||||
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
resistance_flags = NONE
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
|
||||
|
||||
/obj/item/clothing/suit/bomb_suit
|
||||
@@ -123,13 +124,14 @@
|
||||
icon_state = "rad"
|
||||
desc = "A hood with radiation protective properties. The label reads, 'Made with lead. Please do not consume insulation.'"
|
||||
clothing_flags = THICKMATERIAL
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEFACE|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEFACE|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 60, "rad" = 100, "fire" = 30, "acid" = 30)
|
||||
strip_delay = 60
|
||||
equip_delay_other = 60
|
||||
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
resistance_flags = NONE
|
||||
rad_flags = RAD_PROTECT_CONTENTS
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/suit/radiation
|
||||
name = "radiation suit"
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
CAT_PIZZA,
|
||||
CAT_SALAD,
|
||||
CAT_SANDWICH,
|
||||
CAT_SUSHI,
|
||||
CAT_SOUP,
|
||||
CAT_SPAGHETTI),
|
||||
CAT_CLOTHING) //Clothing subcategories
|
||||
|
||||
@@ -189,6 +189,16 @@
|
||||
time = 40
|
||||
category = CAT_ROBOT
|
||||
|
||||
/datum/crafting_recipe/Firebot
|
||||
name = "Firebot"
|
||||
result = /mob/living/simple_animal/bot/firebot
|
||||
reqs = list(/obj/item/extinguisher = 1,
|
||||
/obj/item/bodypart/r_arm/robot = 1,
|
||||
/obj/item/assembly/prox_sensor = 1,
|
||||
/obj/item/clothing/head/hardhat/red = 1)
|
||||
time = 40
|
||||
category = CAT_ROBOT
|
||||
|
||||
/datum/crafting_recipe/improvised_pneumatic_cannon //Pretty easy to obtain but
|
||||
name = "Pneumatic Cannon"
|
||||
result = /obj/item/pneumatic_cannon/ghetto
|
||||
@@ -435,6 +445,15 @@
|
||||
result = /obj/item/extendohand
|
||||
category = CAT_MISC
|
||||
|
||||
/datum/crafting_recipe/bluespacehonker
|
||||
name = "Bluespace Bike horn"
|
||||
result = /obj/item/bikehorn/bluespacehonker
|
||||
time = 10
|
||||
reqs = list(/obj/item/stack/ore/bluespace_crystal = 1,
|
||||
/obj/item/toy/crayon/blue = 1,
|
||||
/obj/item/bikehorn = 1)
|
||||
category = CAT_MISC
|
||||
|
||||
/datum/crafting_recipe/chemical_payload
|
||||
name = "Chemical Payload (C4)"
|
||||
result = /obj/item/bombcore/chemical
|
||||
@@ -686,6 +705,16 @@
|
||||
reqs = list(/obj/item/bedsheet = 1)
|
||||
category = CAT_CLOTHING
|
||||
|
||||
/datum/crafting_recipe/briefcase
|
||||
name = "Hand made Briefcase"
|
||||
result = /obj/item/storage/briefcase/crafted
|
||||
time = 35
|
||||
tools = list(TOOL_WIRECUTTER)
|
||||
reqs = list(/obj/item/stack/sheet/cardboard = 1,
|
||||
/obj/item/stack/sheet/cloth = 2,
|
||||
/obj/item/stack/sheet/leather = 5)
|
||||
category = CAT_CLOTHING
|
||||
|
||||
/datum/crafting_recipe/aitater
|
||||
name = "intelliTater"
|
||||
result = /obj/item/aicard/aitater
|
||||
@@ -706,6 +735,17 @@
|
||||
name = "Improvised Jetpack"
|
||||
result = /obj/item/tank/jetpack/improvised
|
||||
time = 30
|
||||
reqs = list(/obj/item/tank/internals/oxygen/red = 2, /obj/item/extinguisher = 1, /obj/item/pipe = 3, /obj/item/stack/cable_coil = 30)//red oxygen tank so it looks right
|
||||
reqs = list(/obj/item/tank/internals/oxygen = 2, /obj/item/extinguisher = 1, /obj/item/pipe = 3, /obj/item/stack/cable_coil = 30)//red oxygen tank so it looks right
|
||||
category = CAT_MISC
|
||||
tools = list(TOOL_WRENCH, TOOL_WELDER, TOOL_WIRECUTTER)
|
||||
|
||||
/datum/crafting_recipe/goldenbox
|
||||
name = "Gold Plated Toolbox"
|
||||
result = /obj/item/storage/toolbox/gold_fake
|
||||
reqs = list(/obj/item/stack/sheet/cardboard = 1, //so we dont null items in crafting
|
||||
/obj/item/stack/cable_coil = 10,
|
||||
/obj/item/stack/sheet/mineral/gold = 1,
|
||||
/obj/item/stock_parts/cell = 1,
|
||||
/datum/reagent/water = 15)
|
||||
time = 40
|
||||
category = CAT_MISC
|
||||
|
||||
@@ -48,8 +48,6 @@
|
||||
if(!shuttle_spawned)
|
||||
spawn_shuttle()
|
||||
|
||||
|
||||
|
||||
/datum/round_event/pirates/start()
|
||||
if(!paid_off && !shuttle_spawned)
|
||||
spawn_shuttle()
|
||||
@@ -150,7 +148,6 @@
|
||||
to_chat(user,"<span class='notice'>You retrieve the siphoned credits!</span>")
|
||||
credits_stored = 0
|
||||
|
||||
|
||||
/obj/machinery/shuttle_scrambler/proc/send_notification()
|
||||
priority_announce("Data theft signal detected, source registered on local gps units.")
|
||||
|
||||
@@ -222,8 +219,7 @@
|
||||
suit_type = /obj/item/clothing/suit/space
|
||||
helmet_type = /obj/item/clothing/head/helmet/space
|
||||
mask_type = /obj/item/clothing/mask/breath
|
||||
storage_type = /obj/item/tank/internals/oxygen
|
||||
|
||||
storage_type = /obj/item/tank/jetpack/void
|
||||
|
||||
/obj/machinery/loot_locator
|
||||
name = "Booty Locator"
|
||||
@@ -454,4 +450,4 @@
|
||||
|
||||
/datum/export/pirate/cash/get_amount(obj/O)
|
||||
var/obj/item/stack/spacecash/C = O
|
||||
return ..() * C.amount * C.value
|
||||
return ..() * C.amount * C.value
|
||||
|
||||
@@ -13,42 +13,95 @@
|
||||
var/list/vents = list()
|
||||
var/randomProbability = 1
|
||||
var/reagentsAmount = 100
|
||||
var/list/saferChems = list("water","carbon","flour","cleaner","nutriment","condensedcapsaicin","mushroomhallucinogen","lube","pink_glitter","cryptobiolin",
|
||||
"plantbgone","blood","charcoal","space_drugs","morphine","holywater","ethanol","hot_coco","sacid","mindbreaker","rotatium","bluespace",
|
||||
"pax","laughter","concentrated_barbers_aid","colorful_reagent","dizzysolution","tiresolution","sodiumchloride","beer","hair_dye","sugar","white_glitter","growthserum")
|
||||
var/list/saferChems = list(
|
||||
"water",
|
||||
"carbon",
|
||||
"flour",
|
||||
"cleaner",
|
||||
"nutriment",
|
||||
"condensedcapsaicin",
|
||||
"mushroomhallucinogen",
|
||||
"lube",
|
||||
"pink_glitter",
|
||||
"cryptobiolin",
|
||||
"plantbgone",
|
||||
"blood",
|
||||
"charcoal",
|
||||
"space_drugs",
|
||||
"morphine",
|
||||
"holywater",
|
||||
"ethanol",
|
||||
"hot_coco",
|
||||
"sacid",
|
||||
"mindbreaker",
|
||||
"rotatium",
|
||||
"bluespace",
|
||||
"pax",
|
||||
"laughter",
|
||||
"concentrated_barbers_aid",
|
||||
"colorful_reagent",
|
||||
"dizzysolution",
|
||||
"tiresolution",
|
||||
"sodiumchloride",
|
||||
"beer",
|
||||
"hair_dye",
|
||||
"sugar",
|
||||
"white_glitter",
|
||||
"growthserum",
|
||||
"cornoil",
|
||||
"uranium",
|
||||
"carpet",
|
||||
"firefighting_foam",
|
||||
"semen",
|
||||
"femcum",
|
||||
"tearjuice",
|
||||
"strange_reagent"
|
||||
|
||||
)
|
||||
//needs to be chemid unit checked at some point
|
||||
|
||||
/datum/round_event/vent_clog/announce()
|
||||
priority_announce("The scrubbers network is experiencing a backpressure surge. Some ejection of contents may occur.", "Atmospherics alert")
|
||||
|
||||
/datum/round_event/vent_clog/setup()
|
||||
endWhen = rand(25, 100)
|
||||
endWhen = rand(120, 180)
|
||||
for(var/obj/machinery/atmospherics/components/unary/vent_scrubber/temp_vent in GLOB.machines)
|
||||
var/turf/T = get_turf(temp_vent)
|
||||
if(T && is_station_level(T.z) && !temp_vent.welded)
|
||||
var/area/A = T.loc
|
||||
if(T && is_station_level(T.z) && !temp_vent.welded && !A.safe)
|
||||
vents += temp_vent
|
||||
|
||||
if(!vents.len)
|
||||
return kill()
|
||||
|
||||
/datum/round_event/vent_clog/start()
|
||||
for(var/obj/machinery/atmospherics/components/unary/vent in vents)
|
||||
if(vent && vent.loc)
|
||||
var/datum/reagents/R = new/datum/reagents(1000)
|
||||
R.my_atom = vent
|
||||
if (prob(randomProbability))
|
||||
R.add_reagent(get_random_reagent_id(), reagentsAmount)
|
||||
else
|
||||
R.add_reagent(pick(saferChems), reagentsAmount)
|
||||
/datum/round_event/vent_clog/tick()
|
||||
|
||||
var/datum/effect_system/foam_spread/foam = new
|
||||
foam.set_up(200, get_turf(vent), R)
|
||||
foam.start()
|
||||
if(!vents.len)
|
||||
return kill()
|
||||
|
||||
var/cockroaches = prob(33) ? 3 : 0
|
||||
while(cockroaches)
|
||||
new /mob/living/simple_animal/cockroach(get_turf(vent))
|
||||
cockroaches--
|
||||
CHECK_TICK
|
||||
CHECK_TICK
|
||||
|
||||
var/obj/machinery/atmospherics/components/unary/vent = pick(vents)
|
||||
vents -= vent
|
||||
|
||||
if(!vent || vent.welded)
|
||||
return
|
||||
|
||||
var/turf/T = get_turf(vent)
|
||||
if(!T)
|
||||
return
|
||||
|
||||
var/datum/reagents/R = new/datum/reagents(1000)
|
||||
R.my_atom = vent
|
||||
if (prob(randomProbability))
|
||||
R.add_reagent(get_random_reagent_id(), reagentsAmount)
|
||||
else
|
||||
R.add_reagent(pick(saferChems), reagentsAmount)
|
||||
|
||||
var/datum/effect_system/smoke_spread/chem/smoke_machine/C = new
|
||||
C.set_up(R,16,1,T)
|
||||
C.start()
|
||||
playsound(T, 'sound/effects/smoke.ogg', 50, 1, -3)
|
||||
|
||||
/datum/round_event_control/vent_clog/threatening
|
||||
name = "Clogged Vents: Threatening"
|
||||
@@ -108,7 +161,7 @@
|
||||
|
||||
/datum/round_event/vent_clog/beer/start()
|
||||
for(var/obj/machinery/atmospherics/components/unary/vent in vents)
|
||||
if(vent && vent.loc)
|
||||
if(vent && vent.loc && !vent.welded)
|
||||
var/datum/reagents/R = new/datum/reagents(1000)
|
||||
R.my_atom = vent
|
||||
R.add_reagent("beer", reagentsAmount)
|
||||
@@ -123,7 +176,7 @@
|
||||
|
||||
/datum/round_event/vent_clog/male/start()
|
||||
for(var/obj/machinery/atmospherics/components/unary/vent in vents)
|
||||
if(vent && vent.loc)
|
||||
if(vent && vent.loc && !vent.welded)
|
||||
var/datum/reagents/R = new/datum/reagents(1000)
|
||||
R.my_atom = vent
|
||||
R.add_reagent("semen", reagentsAmount)
|
||||
@@ -138,7 +191,7 @@
|
||||
|
||||
/datum/round_event/vent_clog/female/start()
|
||||
for(var/obj/machinery/atmospherics/components/unary/vent in vents)
|
||||
if(vent && vent.loc)
|
||||
if(vent && vent.loc && !vent.welded)
|
||||
var/datum/reagents/R = new/datum/reagents(1000)
|
||||
R.my_atom = vent
|
||||
R.add_reagent("femcum", reagentsAmount)
|
||||
@@ -153,7 +206,7 @@
|
||||
|
||||
/datum/round_event/vent_clog/plasma_decon/start()
|
||||
for(var/obj/machinery/atmospherics/components/unary/vent in vents)
|
||||
if(vent && vent.loc)
|
||||
if(vent && vent.loc && !vent.welded)
|
||||
var/datum/effect_system/smoke_spread/freezing/decon/smoke = new
|
||||
smoke.set_up(7, get_turf(vent), 7)
|
||||
smoke.start()
|
||||
|
||||
@@ -5,6 +5,18 @@
|
||||
max_occurrences = 5
|
||||
earliest_start = 0 MINUTES
|
||||
|
||||
/datum/round_event/wizard/race
|
||||
var/list/stored_name
|
||||
var/list/stored_species
|
||||
var/list/stored_dna
|
||||
|
||||
/datum/round_event/wizard/race/setup()
|
||||
stored_name = list()
|
||||
stored_species = list()
|
||||
stored_dna = list()
|
||||
endWhen = rand(600,1200) //10 to 20 minutes
|
||||
..()
|
||||
|
||||
/datum/round_event/wizard/race/start()
|
||||
|
||||
var/all_the_same = 0
|
||||
@@ -12,18 +24,35 @@
|
||||
|
||||
for(var/speciestype in subtypesof(/datum/species))
|
||||
var/datum/species/S = new speciestype()
|
||||
if(!S.dangerous_existence && !S.blacklisted)
|
||||
if(!S.dangerous_existence && !S.blacklisted && !S.nojumpsuit) //Dangerous Species, Blacklisted Species, and Species who can't wear jumpsuits are blacklisted.
|
||||
all_species += speciestype
|
||||
|
||||
var/datum/species/new_species = pick(all_species)
|
||||
|
||||
if(prob(50))
|
||||
if(prob(75))
|
||||
all_the_same = 1
|
||||
|
||||
for(var/mob/living/carbon/human/H in GLOB.carbon_list) //yes, even the dead
|
||||
for(var/mob/living/carbon/human/H in GLOB.carbon_list)
|
||||
var/turf/T = get_turf(H)
|
||||
if(!T)
|
||||
continue
|
||||
if(!is_station_level(T.z))
|
||||
continue
|
||||
stored_name[H] = H.real_name
|
||||
stored_species[H] = H.dna.species
|
||||
stored_dna[H] = H.dna.unique_enzymes
|
||||
H.set_species(new_species)
|
||||
H.real_name = H.dna.species.random_name(H.gender,1)
|
||||
H.dna.unique_enzymes = H.dna.generate_unique_enzymes()
|
||||
to_chat(H, "<span class='notice'>You feel somehow... different?</span>")
|
||||
if(!all_the_same)
|
||||
new_species = pick(all_species)
|
||||
|
||||
/datum/round_event/wizard/race/end()
|
||||
for(var/mob/living/carbon/human/H in GLOB.carbon_list)
|
||||
if(!(stored_name[H] && stored_species[H] && stored_dna[H]))
|
||||
continue
|
||||
H.set_species(stored_species[H])
|
||||
H.real_name = stored_name[H]
|
||||
H.dna.unique_enzymes = stored_dna[H]
|
||||
to_chat(H, "<span class='notice'>You feel back to your normal self again.</span>")
|
||||
@@ -54,7 +54,6 @@
|
||||
tastes = list("cake" = 5, "sweetness" = 2, "carrot" = 1)
|
||||
foodtype = GRAIN | DAIRY | VEGETABLES | SUGAR
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/store/cake/brain
|
||||
name = "brain cake"
|
||||
desc = "A squishy cake-thing."
|
||||
@@ -86,7 +85,6 @@
|
||||
tastes = list("cake" = 4, "cream cheese" = 3)
|
||||
foodtype = GRAIN | DAIRY
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/cakeslice/cheese
|
||||
name = "cheese cake slice"
|
||||
desc = "Slice of pure cheestisfaction."
|
||||
@@ -95,7 +93,6 @@
|
||||
tastes = list("cake" = 4, "cream cheese" = 3)
|
||||
foodtype = GRAIN | DAIRY
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/store/cake/orange
|
||||
name = "orange cake"
|
||||
desc = "A cake with added orange."
|
||||
@@ -132,7 +129,6 @@
|
||||
tastes = list("cake" = 5, "sweetness" = 2, "unbearable sourness" = 2)
|
||||
foodtype = GRAIN | DAIRY | FRUIT | SUGAR
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/store/cake/lemon
|
||||
name = "lemon cake"
|
||||
desc = "A cake with added lemon."
|
||||
@@ -143,7 +139,6 @@
|
||||
tastes = list("cake" = 5, "sweetness" = 2, "sourness" = 2)
|
||||
foodtype = GRAIN | DAIRY | FRUIT | SUGAR
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/cakeslice/lemon
|
||||
name = "lemon cake slice"
|
||||
desc = "Just a slice of cake, it is enough for everyone."
|
||||
@@ -163,7 +158,6 @@
|
||||
tastes = list("cake" = 5, "sweetness" = 1, "chocolate" = 4)
|
||||
foodtype = GRAIN | DAIRY | JUNKFOOD | SUGAR
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/cakeslice/chocolate
|
||||
name = "chocolate cake slice"
|
||||
desc = "Just a slice of cake, it is enough for everyone."
|
||||
@@ -172,7 +166,6 @@
|
||||
tastes = list("cake" = 5, "sweetness" = 1, "chocolate" = 4)
|
||||
foodtype = GRAIN | DAIRY | JUNKFOOD | SUGAR
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/store/cake/birthday
|
||||
name = "birthday cake"
|
||||
desc = "Happy Birthday little clown..."
|
||||
@@ -250,5 +243,100 @@
|
||||
icon_state = "pumpkinspicecakeslice"
|
||||
filling_color = "#FFD700"
|
||||
tastes = list("cake" = 5, "sweetness" = 1, "pumpkin" = 1)
|
||||
|
||||
foodtype = GRAIN | DAIRY | VEGETABLES | SUGAR
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/store/cake/bsvc // blackberry strawberries vanilla cake
|
||||
name = "blackberry and strawberry vanilla cake"
|
||||
desc = "A plain cake, filled with assortment of blackberries and strawberries!"
|
||||
icon = 'modular_citadel/icons/obj/food/cake.dmi'
|
||||
icon_state = "blackbarry_strawberries_cake_vanilla_cake"
|
||||
slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/bsvc
|
||||
bonus_reagents = list("nutriment" = 14, "vitamin" = 4)
|
||||
tastes = list("blackbarry" = 2, "strawberries" = 2, "vanilla" = 2, "sweetness" = 2, "cake" = 3)
|
||||
foodtype = GRAIN | DAIRY | FRUIT | SUGAR
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/cakeslice/bsvc
|
||||
name = "blackberry and strawberry vanilla cake slice"
|
||||
desc = "Just a slice of cake filled with assortment of blackberries and strawberries!"
|
||||
icon = 'modular_citadel/icons/obj/food/cake.dmi'
|
||||
icon_state = "blackbarry_strawberries_cake_vanilla_slice"
|
||||
filling_color = "#FFD700"
|
||||
tastes = list("blackbarry" = 2, "strawberries" = 2, "vanilla" = 2, "sweetness" = 2,"cake" = 3)
|
||||
foodtype = GRAIN | DAIRY | FRUIT | SUGAR
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/store/cake/bscc // blackbarry strawberries chocolate cake
|
||||
name = "blackberry and strawberry chocolate cake"
|
||||
desc = "A plain cake, filled with assortment of blackberries and strawberries!"
|
||||
icon = 'modular_citadel/icons/obj/food/cake.dmi'
|
||||
icon_state = "blackbarry_strawberries_cake_coco_cake"
|
||||
slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/bscc
|
||||
bonus_reagents = list("nutriment" = 14, "vitamin" = 4, "cocoa" = 5)
|
||||
tastes = list("blackberry" = 2, "strawberries" = 2, "chocolate" = 2, "sweetness" = 2,"cake" = 3)
|
||||
foodtype = GRAIN | DAIRY | FRUIT | SUGAR
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/cakeslice/bscc
|
||||
name = "blackberry and strawberry chocolate cake slice"
|
||||
desc = "Just a slice of cake filled with assortment of blackberries and strawberries!"
|
||||
icon = 'modular_citadel/icons/obj/food/cake.dmi'
|
||||
icon_state = "blackbarry_strawberries_cake_coco_cake_slice"
|
||||
filling_color = "#FFD700"
|
||||
tastes = list("blackberry" = 2, "strawberries" = 2, "chocolate" = 2, "sweetness" = 2,"cake" = 3)
|
||||
foodtype = GRAIN | DAIRY | FRUIT | SUGAR
|
||||
|
||||
obj/item/reagent_containers/food/snacks/store/cake/holy_cake
|
||||
name = "angel food cake"
|
||||
desc = "A cake made for angels and chaplains alike! Contains holy water."
|
||||
icon = 'modular_citadel/icons/obj/food/cake.dmi'
|
||||
icon_state = "holy_cake"
|
||||
slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/holy_cake_slice
|
||||
bonus_reagents = list("nutriment" = 1, "vitamin" = 3, "holy_water" = 10)
|
||||
tastes = list("cake" = 5, "sweetness" = 1, "clouds" = 1)
|
||||
foodtype = GRAIN | DAIRY | SUGAR
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/cakeslice/holy_cake_slice
|
||||
name = "angel food cake slice"
|
||||
desc = "A slice of heavenly cake."
|
||||
icon = 'modular_citadel/icons/obj/food/cake.dmi'
|
||||
icon_state = "holy_cake_slice"
|
||||
filling_color = "#00FFFF"
|
||||
tastes = list("cake" = 5, "sweetness" = 1, "clouds" = 1)
|
||||
foodtype = GRAIN | DAIRY | SUGAR
|
||||
|
||||
obj/item/reagent_containers/food/snacks/store/cake/pound_cake
|
||||
name = "pound cake"
|
||||
desc = "A condensed cake made for filling people up quickly."
|
||||
icon = 'modular_citadel/icons/obj/food/cake.dmi'
|
||||
icon_state = "pound_cake"
|
||||
slices_num = 7 //Its ment to feed the party
|
||||
slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/pound_cake_slice
|
||||
bonus_reagents = list("nutriment" = 60)
|
||||
tastes = list("cake" = 5, "sweetness" = 1, "batter" = 1)
|
||||
foodtype = GRAIN | DAIRY | SUGAR | JUNKFOOD
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/cakeslice/pound_cake_slice
|
||||
name = "pound cake slice"
|
||||
desc = "A slice of condensed cake made for filling people up quickly."
|
||||
icon = 'modular_citadel/icons/obj/food/cake.dmi'
|
||||
icon_state = "pound_cake_slice"
|
||||
filling_color = "#00FFFF"
|
||||
tastes = list("cake" = 5, "sweetness" = 5, "batter" = 1)
|
||||
foodtype = GRAIN | DAIRY | SUGAR | JUNKFOOD
|
||||
|
||||
obj/item/reagent_containers/food/snacks/store/cake/hardware_cake
|
||||
name = "hardware cake"
|
||||
desc = "A cake that is made with electronic boards and leaks acid..."
|
||||
icon = 'modular_citadel/icons/obj/food/cake.dmi'
|
||||
icon_state = "hardware_cake"
|
||||
slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/hardware_cake_slice
|
||||
bonus_reagents = list("sacid" = 15, "oil" = 15)
|
||||
tastes = list("acid" = 1, "metal" = 1, "regret" = 10)
|
||||
foodtype = GRAIN | GROSS
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/cakeslice/hardware_cake_slice
|
||||
name = "hardware cake slice"
|
||||
desc = "A slice of electronic boards and some acid."
|
||||
icon = 'modular_citadel/icons/obj/food/cake.dmi'
|
||||
icon_state = "hardware_cake_slice"
|
||||
filling_color = "#00FFFF"
|
||||
tastes = list("acid" = 1, "metal" = 1, "regret" = 10)
|
||||
foodtype = GRAIN | GROSS
|
||||
|
||||
@@ -54,6 +54,43 @@
|
||||
tastes = list("fish" = 1, "chips" = 1)
|
||||
foodtype = MEAT | VEGETABLES | FRIED
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sushi_basic
|
||||
name = "funa hosomaki"
|
||||
desc = "A small cylindrical kudzu skin, filled with rice and fish."
|
||||
icon = 'modular_citadel/icons/obj/food/food.dmi'
|
||||
icon_state = "sushie_basic"
|
||||
bonus_reagents = list("vitamin" = 2)
|
||||
list_reagents = list("nutriment" = 4)
|
||||
bitesize = 10
|
||||
filling_color = "#F2EEEA" //rgb(242, 238, 234)
|
||||
tastes = list("fish" = 1, "rice" = 2, "salt" = 1)
|
||||
foodtype = MEAT | VEGETABLES
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sushi_adv
|
||||
name = "funa nigiri"
|
||||
desc = "A peace of carp lightly placed on some rice."
|
||||
icon = 'modular_citadel/icons/obj/food/food.dmi'
|
||||
icon_state = "sushie_adv"
|
||||
bonus_reagents = list("vitamin" = 2)
|
||||
list_reagents = list("nutriment" = 6)
|
||||
bitesize = 10
|
||||
filling_color = "#F2EEEA" //rgb(242, 238, 234)
|
||||
tastes = list("fish" = 2, "rice" = 2, "salt" = 1)
|
||||
foodtype = MEAT | VEGETABLES
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sushi_pro
|
||||
name = "funa nigiri"
|
||||
desc = "A well prepared peace of the best of the carp fillet placed on rice. Looks fancy and fresh!"
|
||||
icon = 'modular_citadel/icons/obj/food/food.dmi'
|
||||
icon_state = "sushie_pro"
|
||||
bonus_reagents = list("nutriment" = 2, "vitamin" = 2)
|
||||
list_reagents = list("nutriment" = 6, "vitamin" = 2)
|
||||
bitesize = 10
|
||||
filling_color = "#F2EEEA" //rgb(242, 238, 234)
|
||||
tastes = list("fish" = 3, "rice" = 2, "salt" = 1)
|
||||
foodtype = MEAT | VEGETABLES
|
||||
|
||||
|
||||
////////////////////////////////////////////MEATS AND ALIKE////////////////////////////////////////////
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/tofu
|
||||
|
||||
@@ -207,6 +207,16 @@
|
||||
tastes = list("cobwebs" = 1, "sugar" = 2)
|
||||
foodtype = JUNKFOOD | SUGAR
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/tobiko
|
||||
name = "tobiko"
|
||||
desc = "Spider eggs wrapped in a thin salted Kudzu pod"
|
||||
icon = 'modular_citadel/icons/obj/food/food.dmi'
|
||||
icon_state = "sushie_egg"
|
||||
list_reagents = list("nutriment" = 6, "vitamin" = 2)
|
||||
filling_color = "#FF3333" // R225 G051 B051
|
||||
tastes = list("seaweed" = 1, "cobwebs" = 1, "salty" = 2)
|
||||
foodtype = MEAT | VEGETABLES
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/chococoin
|
||||
name = "chocolate coin"
|
||||
desc = "A completely edible but nonflippable festive coin."
|
||||
@@ -569,3 +579,12 @@
|
||||
filling_color = "#A0522D"
|
||||
tastes = list("chocolate" = 1)
|
||||
foodtype = JUNKFOOD | SUGAR
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/riceball
|
||||
name = "onigiri"
|
||||
desc = "A ball of rice with some light salt and a wrap of Kudzu skin."
|
||||
icon = 'modular_citadel/icons/obj/food/food.dmi'
|
||||
icon_state = "riceball"
|
||||
list_reagents = list("nutriment" = 6, "sodiumchloride" = 2)
|
||||
tastes = list("rice" = 3, "salt" = 1)
|
||||
foodtype = GRAIN
|
||||
|
||||
@@ -102,3 +102,13 @@
|
||||
list_reagents = list("nutriment" = 2, "vitamin" = 2)
|
||||
tastes = list("bread" = 2)
|
||||
foodtype = GRAIN
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/tuna_sandwich
|
||||
name = "tuna sandwich"
|
||||
desc = "Both a salad and a sandwich in one."
|
||||
icon = 'modular_citadel/icons/obj/food/food.dmi'
|
||||
icon_state = "tunasandwich"
|
||||
trash = /obj/item/trash/plate
|
||||
bonus_reagents = list("nutriment" = 1, "vitamin" = 3)
|
||||
tastes = list("tuna" = 4, "mayonnaise" = 2, "bread" = 2)
|
||||
foodtype = GRAIN | MEAT
|
||||
|
||||
@@ -0,0 +1,95 @@
|
||||
//////////////////////////Sushi Components///////////////////////
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sushi_rice
|
||||
name = "Sushi Rice"
|
||||
desc = "A bowl of sticky rice for making sushi."
|
||||
icon = 'modular_citadel/icons/obj/food/food.dmi'
|
||||
icon_state = "sushi_rice"
|
||||
list_reagents = list("sodiumchloride" = 5)
|
||||
tastes = list("rice" = 5, "salt" = 1)
|
||||
foodtype = GRAIN
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sea_weed
|
||||
name = "Sea Weed Sheet"
|
||||
desc = "A thin, light salt sheet of plant mater. This is commenly used in sushi recipes,"
|
||||
icon = 'modular_citadel/icons/obj/food/food.dmi'
|
||||
icon_state = "sea_weed"
|
||||
list_reagents = list("sodiumchloride" = 2)
|
||||
tastes = list("plants" = 2, "salt" = 1)
|
||||
foodtype = VEGETABLES
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/tuna
|
||||
name = "Canned Tuna"
|
||||
desc = "A small can of tuna fish beloved by felines."
|
||||
icon = 'modular_citadel/icons/obj/food/food.dmi'
|
||||
icon_state = "tuna_can"
|
||||
//trash = /obj/item/trash/tuna_used //I dont know if I like this idea - A Masked Cat
|
||||
list_reagents = list("sodiumchloride" = 5, "mercury" = 2)
|
||||
tastes = list("tuna" = 15, "mercury" = 1, "salt" = 3)
|
||||
foodtype = MEAT
|
||||
|
||||
//////////////////////////Sushi/////////////////////////////////
|
||||
/obj/item/reagent_containers/food/snacks/sushie_basic
|
||||
name = "Funa Hosomaki"
|
||||
desc = "A small cylindrical filled with rice and fish."
|
||||
icon = 'modular_citadel/icons/obj/food/food.dmi'
|
||||
icon_state = "sushie_basic"
|
||||
bonus_reagents = list("vitamin" = 2)
|
||||
list_reagents = list("nutriment" = 1)
|
||||
bitesize = 1
|
||||
filling_color = "#F2EEEA" //rgb(242, 238, 234)
|
||||
tastes = list("fish" = 1, "rice" = 1, "salt" = 1)
|
||||
foodtype = MEAT | VEGETABLES
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sushie_adv
|
||||
name = "Funa Nigiri"
|
||||
desc = "A pice of carp lightly placed on some rice."
|
||||
icon = 'modular_citadel/icons/obj/food/food.dmi'
|
||||
icon_state = "sushie_adv"
|
||||
bonus_reagents = list("vitamin" = 2)
|
||||
list_reagents = list("nutriment" = 2)
|
||||
bitesize = 1
|
||||
filling_color = "#F2EEEA" //rgb(242, 238, 234)
|
||||
tastes = list("fish" = 1, "rice" = 1, "salt" = 1)
|
||||
foodtype = MEAT | VEGETABLES
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sushie_pro
|
||||
name = "Funa Nigiri"
|
||||
desc = "A well prepared pice of the best of the carp fillet placed on rice. Looks fancy and fresh!"
|
||||
icon = 'modular_citadel/icons/obj/food/food.dmi'
|
||||
icon_state = "sushie_pro"
|
||||
bonus_reagents = list("nutriment" = 1, "vitamin" = 2)
|
||||
list_reagents = list("nutriment" = 8, "vitamin" = 1)
|
||||
bitesize = 1
|
||||
filling_color = "#F2EEEA" //rgb(242, 238, 234)
|
||||
tastes = list("fish" = 1, "rice" = 1, "salt" = 1)
|
||||
foodtype = MEAT | VEGETABLES
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/tobiko
|
||||
name = "Tobiko"
|
||||
desc = "Spider eggs wrapped in a thin salted Kudzu pod"
|
||||
icon = 'modular_citadel/icons/obj/food/food.dmi'
|
||||
icon_state = "sushie_egg"
|
||||
list_reagents = list("nutriment" = 3, "vitamin" = 2)
|
||||
filling_color = "#FF3333" // R225 G051 B051
|
||||
tastes = list("seaweed" = 1, "salty" = 2)
|
||||
foodtype = MEAT | VEGETABLES
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/riceball
|
||||
name = "Onigiri"
|
||||
desc = "A ball of rice with some light salt and a wrap of Kudzu skin."
|
||||
icon = 'modular_citadel/icons/obj/food/food.dmi'
|
||||
icon_state = "riceball"
|
||||
list_reagents = list("nutriment" = 5, "sodiumchloride" = 2)
|
||||
tastes = list("rice" = 4, "salt" = 1)
|
||||
foodtype = GRAIN
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sashimi
|
||||
name = "carp sashimi"
|
||||
desc = "Celebrate surviving attack from hostile alien lifeforms by hospitalising yourself."
|
||||
icon_state = "sashimi"
|
||||
bonus_reagents = list("nutriment" = 1, "capsaicin" = 4, "vitamin" = 4)
|
||||
list_reagents = list("nutriment" = 6, "capsaicin" = 5)
|
||||
filling_color = "#FA8072"
|
||||
tastes = list("fish" = 1, "hot peppers" = 1)
|
||||
foodtype = MEAT | TOXIC
|
||||
@@ -102,6 +102,52 @@
|
||||
result = /obj/item/reagent_containers/food/snacks/store/cake/pumpkinspice
|
||||
subcategory = CAT_CAKE
|
||||
|
||||
/datum/crafting_recipe/food/holycake
|
||||
name = "Angel food cake"
|
||||
reqs = list(
|
||||
/datum/reagent/water/holywater = 15,
|
||||
/obj/item/reagent_containers/food/snacks/store/cake/plain = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/store/cake/holy_cake
|
||||
subcategory = CAT_CAKE
|
||||
|
||||
/datum/crafting_recipe/food/poundcake
|
||||
name = "Pound cake"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/store/cake/plain = 4
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/store/cake/pound_cake
|
||||
subcategory = CAT_CAKE
|
||||
|
||||
/datum/crafting_recipe/food/hardwarecake
|
||||
name = "Hardware cake"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
|
||||
/obj/item/circuitboard = 2,
|
||||
/datum/reagent/toxin/acid = 5
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/store/cake/hardware_cake
|
||||
subcategory = CAT_CAKE
|
||||
|
||||
/datum/crafting_recipe/food/bscccake
|
||||
name = "blackberry and strawberry chocolate cake"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
|
||||
/obj/item/reagent_containers/food/snacks/chocolatebar = 2,
|
||||
/obj/item/reagent_containers/food/snacks/grown/berries = 5
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/store/cake/bscc
|
||||
subcategory = CAT_CAKE
|
||||
|
||||
/datum/crafting_recipe/food/bscvcake
|
||||
name = "blackberry and strawberry vanilla cake"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
|
||||
/obj/item/reagent_containers/food/snacks/grown/berries = 5
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/store/cake/bsvc
|
||||
subcategory = CAT_CAKE
|
||||
|
||||
/datum/crafting_recipe/food/cak
|
||||
name = "Living cat/cake hybrid"
|
||||
reqs = list(
|
||||
@@ -114,4 +160,4 @@
|
||||
/datum/reagent/teslium = 1 //To shock the whole thing into life
|
||||
)
|
||||
result = /mob/living/simple_animal/pet/cat/cak
|
||||
subcategory = CAT_CAKE //Cat! Haha, get it? CAT? GET IT???
|
||||
subcategory = CAT_CAKE //Cat! Haha, get it? CAT? GET IT? We get it - Love Catpeople
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
|
||||
|
||||
////////////////////////////////////////////////KEBABS////////////////////////////////////////////////
|
||||
|
||||
/datum/crafting_recipe/food/humankebab
|
||||
@@ -71,16 +69,6 @@
|
||||
result = /obj/item/reagent_containers/food/snacks/fishfingers
|
||||
subcategory = CAT_MEAT
|
||||
|
||||
/datum/crafting_recipe/food/sashimi
|
||||
name = "Sashimi"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/soysauce = 5,
|
||||
/obj/item/reagent_containers/food/snacks/spidereggs = 1,
|
||||
/obj/item/reagent_containers/food/snacks/carpmeat = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/sashimi
|
||||
subcategory = CAT_MEAT
|
||||
|
||||
////////////////////////////////////////////////MR SPIDER////////////////////////////////////////////////
|
||||
|
||||
/datum/crafting_recipe/food/spidereggsham
|
||||
|
||||
@@ -345,3 +345,13 @@
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/salad/ricepudding
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
/datum/crafting_recipe/food/riceball
|
||||
name = "Onigiri"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/soysauce = 1,
|
||||
/obj/item/reagent_containers/food/snacks/grown/kudzupod = 1,
|
||||
/obj/item/reagent_containers/food/snacks/salad/boiledrice = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/riceball
|
||||
subcategory = CAT_MISCFOOD
|
||||
|
||||
@@ -62,5 +62,13 @@
|
||||
result = /obj/item/reagent_containers/food/snacks/notasandwich
|
||||
subcategory = CAT_SANDWICH
|
||||
|
||||
|
||||
|
||||
/datum/crafting_recipe/food/notasandwich
|
||||
name = "Tuna sandwich"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/breadslice/plain = 2,
|
||||
/obj/item/reagent_containers/food/snacks/tuna = 1,
|
||||
/obj/item/reagent_containers/food/snacks/grown/onion = 1,
|
||||
/obj/item/reagent_containers/food/condiment/mayonnaise = 5
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/tuna_sandwich
|
||||
subcategory = CAT_SANDWICH
|
||||
|
||||
@@ -0,0 +1,94 @@
|
||||
//////////////////////////Sushi Components///////////////////////
|
||||
|
||||
/datum/crafting_recipe/food/sushi_rice
|
||||
name = "Sushi Rice"
|
||||
reqs = list(
|
||||
/datum/reagent/water = 40,
|
||||
/datum/reagent/consumable/rice = 10
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/sushi_rice
|
||||
subcategory = CAT_SUSHI
|
||||
|
||||
/datum/crafting_recipe/food/sea_weed
|
||||
name = "Sea Weed Sheet"
|
||||
reqs = list(
|
||||
/datum/reagent/water = 30,
|
||||
/datum/reagent/consumable/soysauce = 5,
|
||||
/obj/item/reagent_containers/food/snacks/grown/kudzupod = 1,
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/sea_weed
|
||||
subcategory = CAT_SUSHI
|
||||
|
||||
/datum/crafting_recipe/food/tuna_can
|
||||
name = "Can of Tuna"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/sodiumchloride = 15,
|
||||
/datum/reagent/consumable/cooking_oil = 5,
|
||||
/obj/item/reagent_containers/food/snacks/carpmeat = 1,
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/tuna
|
||||
subcategory = CAT_SUSHI
|
||||
|
||||
//////////////////////////Sushi/////////////////////////////////
|
||||
|
||||
/datum/crafting_recipe/food/sashimi
|
||||
name = "Sashimi"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/soysauce = 5,
|
||||
/obj/item/reagent_containers/food/snacks/spidereggs = 1,
|
||||
/obj/item/reagent_containers/food/snacks/carpmeat = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/sashimi
|
||||
subcategory = CAT_SUSHI
|
||||
|
||||
/datum/crafting_recipe/food/riceball
|
||||
name = "Onigiri"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/soysauce = 1,
|
||||
/obj/item/reagent_containers/food/snacks/sea_weed = 1,
|
||||
/obj/item/reagent_containers/food/snacks/sushi_rice = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/riceball
|
||||
subcategory = CAT_SUSHI
|
||||
|
||||
/datum/crafting_recipe/food/sushie_egg
|
||||
name = "Tobiko"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/soysauce = 6,
|
||||
/obj/item/reagent_containers/food/snacks/spidereggs = 1,
|
||||
/obj/item/reagent_containers/food/snacks/sea_weed = 2,
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/tobiko
|
||||
subcategory = CAT_SUSHI
|
||||
|
||||
/datum/crafting_recipe/food/sushie_basic
|
||||
name = "Funa Hosomaki"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/soysauce = 3,
|
||||
/obj/item/reagent_containers/food/snacks/sushi_rice = 1,
|
||||
/obj/item/reagent_containers/food/snacks/carpmeat = 2,
|
||||
/obj/item/reagent_containers/food/snacks/sea_weed = 3,
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/sushie_basic
|
||||
subcategory = CAT_SUSHI
|
||||
|
||||
/datum/crafting_recipe/food/sushie_adv
|
||||
name = "Funa Nigiri"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/soysauce = 5,
|
||||
/obj/item/reagent_containers/food/snacks/sushi_rice = 1,
|
||||
/obj/item/reagent_containers/food/snacks/carpmeat = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/sushie_adv
|
||||
subcategory = CAT_SUSHI
|
||||
|
||||
/datum/crafting_recipe/food/sushie_pro
|
||||
name = "Well made Funa Nigiri"
|
||||
reqs = list(
|
||||
/datum/reagent/consumable/soysauce = 10,
|
||||
/obj/item/reagent_containers/food/snacks/sushi_rice = 2,
|
||||
/obj/item/reagent_containers/food/snacks/carpmeat = 5,
|
||||
/obj/item/reagent_containers/food/snacks/sea_weed = 1
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/sushie_pro
|
||||
subcategory = CAT_SUSHI
|
||||
@@ -316,7 +316,9 @@ h1.alert, h2.alert {color: #000000;}
|
||||
.unconscious {color: #0000ff; font-weight: bold;}
|
||||
.suicide {color: #ff5050; font-style: italic;}
|
||||
.green {color: #03ff39;}
|
||||
.nicegreen {color: #14a833;}
|
||||
.nicegreen {color: #14a833;}
|
||||
.userlove {color: #FF1493; font-style: italic; font-weight: bold; text-shadow: 0 0 6px #ff6dbc;}
|
||||
.love {color: #ff006a; font-style: italic; text-shadow: 0 0 6px #ff6d6d;}
|
||||
.shadowling {color: #3b2769;}
|
||||
.cult {color: #960000;}
|
||||
|
||||
|
||||
@@ -304,6 +304,8 @@
|
||||
|
||||
else if(href_list["create"])
|
||||
var/amount = (text2num(href_list["amount"]))
|
||||
//Can't be outside these (if you change this keep a sane limit)
|
||||
amount = CLAMP(amount, 1, 50)
|
||||
var/datum/design/D = locate(href_list["create"])
|
||||
create_product(D, amount)
|
||||
updateUsrDialog()
|
||||
|
||||
@@ -643,6 +643,11 @@
|
||||
icon_state = "setup_small_pda"
|
||||
desc = "It's a case, for building small electronics with. This one resembles a PDA."
|
||||
|
||||
/obj/item/electronic_assembly/dildo
|
||||
name = "type-g electronic assembly"
|
||||
icon_state = "setup_dildo_medium"
|
||||
desc = "It's a case, for building small electronics with. This one has a phallic design."
|
||||
|
||||
/obj/item/electronic_assembly/small
|
||||
name = "electronic device"
|
||||
icon_state = "setup_device"
|
||||
@@ -674,6 +679,11 @@
|
||||
icon_state = "setup_device_box"
|
||||
desc = "It's a case, for building tiny-sized electronics with. This one has a boxy design."
|
||||
|
||||
/obj/item/electronic_assembly/small/dildo
|
||||
name = "type-f electronic device"
|
||||
icon_state = "setup_dildo_small"
|
||||
desc = "It's a case, for building tiny-sized electronics with. This one has a phallic design."
|
||||
|
||||
/obj/item/electronic_assembly/medium
|
||||
name = "electronic mechanism"
|
||||
icon_state = "setup_medium"
|
||||
@@ -714,6 +724,12 @@
|
||||
icon_state = "setup_medium_radio"
|
||||
desc = "It's a case, for building medium-sized electronics with. This one resembles an old radio."
|
||||
|
||||
/obj/item/electronic_assembly/medium/dildo
|
||||
name = "type-g electronic mechanism"
|
||||
icon_state = "setup_dildo_large"
|
||||
desc = "It's a case, for building medium-sized electronics with. This one has a phallic design."
|
||||
|
||||
|
||||
/obj/item/electronic_assembly/large
|
||||
name = "electronic machine"
|
||||
icon_state = "setup_large"
|
||||
|
||||
@@ -25,7 +25,9 @@
|
||||
"green" = COLOR_ASSEMBLY_GREEN,
|
||||
"light blue" = COLOR_ASSEMBLY_LBLUE,
|
||||
"blue" = COLOR_ASSEMBLY_BLUE,
|
||||
"purple" = COLOR_ASSEMBLY_PURPLE
|
||||
"purple" = COLOR_ASSEMBLY_PURPLE,
|
||||
"pink" = COLOR_ASSEMBLY_PINK,
|
||||
"custom" = COLOR_ASSEMBLY_WHITE
|
||||
)
|
||||
|
||||
/obj/item/integrated_electronics/detailer/Initialize()
|
||||
@@ -43,6 +45,9 @@
|
||||
if(!color_list[color_choice])
|
||||
return
|
||||
if(!in_range(src, user))
|
||||
return
|
||||
detail_color = color_list[color_choice]
|
||||
return
|
||||
if(color_choice == "custom")
|
||||
detail_color = input(user,"","Choose Color",detail_color) as color|null
|
||||
else
|
||||
detail_color = color_list[color_choice]
|
||||
update_icon()
|
||||
|
||||
@@ -142,13 +142,14 @@
|
||||
|
||||
/obj/item/integrated_circuit/converter/concatenator
|
||||
name = "concatenator"
|
||||
desc = "This can join up to 8 strings together to get one big string."
|
||||
desc = "This can join up to 8 strings together to get a string with a maximum of 512 characters."
|
||||
complexity = 4
|
||||
inputs = list()
|
||||
outputs = list("result" = IC_PINTYPE_STRING)
|
||||
activators = list("concatenate" = IC_PINTYPE_PULSE_IN, "on concatenated" = IC_PINTYPE_PULSE_OUT)
|
||||
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
|
||||
var/number_of_pins = 8
|
||||
var/max_string_length = 512
|
||||
|
||||
/obj/item/integrated_circuit/converter/concatenator/Initialize()
|
||||
for(var/i = 1 to number_of_pins)
|
||||
@@ -157,26 +158,46 @@
|
||||
|
||||
/obj/item/integrated_circuit/converter/concatenator/do_work()
|
||||
var/result = null
|
||||
var/spamprotection
|
||||
for(var/k in 1 to inputs.len)
|
||||
var/I = get_pin_data(IC_INPUT, k)
|
||||
if(!isnull(I))
|
||||
if((result ? length(result) : 0) + length(I) > max_string_length)
|
||||
spamprotection = (result ? length(result) : 0) + length(I)
|
||||
break
|
||||
result = result + I
|
||||
|
||||
if(spamprotection >= max_string_length*1.75 && assembly)
|
||||
if(assembly.fingerprintslast)
|
||||
var/mob/M = get_mob_by_key(assembly.fingerprintslast)
|
||||
var/more = ""
|
||||
if(M)
|
||||
more = "[ADMIN_LOOKUPFLW(M)] "
|
||||
message_admins("A concatenator circuit has greatly exceeded its [max_string_length] character limit with a total of [spamprotection] characters, and has been deleted. Assembly last touched by [more ? more : assembly.fingerprintslast].")
|
||||
investigate_log("A concatenator circuit has greatly exceeded its [max_string_length] character limit with a total of [spamprotection] characters, and has been deleted. Assembly last touched by [assembly.fingerprintslast].", INVESTIGATE_CIRCUIT)
|
||||
else
|
||||
message_admins("A concatenator circuit has greatly exceeded its [max_string_length] character limit with a total of [spamprotection] characters, and has been deleted. No associated key.")
|
||||
investigate_log("A concatenator circuit has greatly exceeded its [max_string_length] character limit with a total of [spamprotection] characters, and has been deleted. No associated key.", INVESTIGATE_CIRCUIT)
|
||||
qdel(assembly)
|
||||
return
|
||||
|
||||
set_pin_data(IC_OUTPUT, 1, result)
|
||||
push_data()
|
||||
activate_pin(2)
|
||||
|
||||
/obj/item/integrated_circuit/converter/concatenator/small
|
||||
name = "small concatenator"
|
||||
desc = "This can join up to 4 strings together to get one big string."
|
||||
desc = "This can join up to 4 strings together to get a string with a maximum of 256 characters."
|
||||
complexity = 2
|
||||
number_of_pins = 4
|
||||
max_string_length = 256
|
||||
|
||||
/obj/item/integrated_circuit/converter/concatenator/large
|
||||
name = "large concatenator"
|
||||
desc = "This can join up to 16 strings together to get one very big string."
|
||||
desc = "This can join up to 16 strings together to get a string with a maximum of 1024 characters."
|
||||
complexity = 6
|
||||
number_of_pins = 16
|
||||
max_string_length = 1024
|
||||
|
||||
/obj/item/integrated_circuit/converter/separator
|
||||
name = "separator"
|
||||
|
||||
@@ -1309,4 +1309,35 @@
|
||||
|
||||
set_pin_data(IC_OUTPUT, 2, regurgitated_contents)
|
||||
push_data()
|
||||
activate_pin(2)
|
||||
|
||||
//Degens
|
||||
/obj/item/integrated_circuit/input/bonermeter
|
||||
name = "bonermeter"
|
||||
desc = "Detects the target's arousal and various statistics about the target's arousal levels. Invasive!"
|
||||
icon_state = "medscan"
|
||||
complexity = 4
|
||||
inputs = list("target" = IC_PINTYPE_REF)
|
||||
outputs = list(
|
||||
"current arousal" = IC_PINTYPE_NUMBER,
|
||||
"minimum arousal" = IC_PINTYPE_NUMBER,
|
||||
"maximum arousal" = IC_PINTYPE_NUMBER,
|
||||
"can be aroused" = IC_PINTYPE_BOOLEAN
|
||||
)
|
||||
activators = list("scan" = IC_PINTYPE_PULSE_IN, "on scanned" = IC_PINTYPE_PULSE_OUT)
|
||||
spawn_flags = IC_SPAWN_RESEARCH
|
||||
power_draw_per_use = 40
|
||||
|
||||
/obj/item/integrated_circuit/input/bonermeter/do_work()
|
||||
|
||||
var/mob/living/L = get_pin_data_as_type(IC_INPUT, 1, /mob/living)
|
||||
|
||||
if(!istype(L) || !L.Adjacent(get_turf(src)) ) //Invalid input
|
||||
return
|
||||
|
||||
set_pin_data(IC_OUTPUT, 1, L.getArousalLoss())
|
||||
set_pin_data(IC_OUTPUT, 2, L.min_arousal)
|
||||
set_pin_data(IC_OUTPUT, 3, L.max_arousal)
|
||||
set_pin_data(IC_OUTPUT, 4, L.canbearoused)
|
||||
push_data()
|
||||
activate_pin(2)
|
||||
@@ -1,139 +1,6 @@
|
||||
/obj/item/integrated_circuit/manipulation
|
||||
category_text = "Manipulation"
|
||||
|
||||
/obj/item/integrated_circuit/manipulation/weapon_firing
|
||||
name = "weapon firing mechanism"
|
||||
desc = "This somewhat complicated system allows one to slot in a gun, direct it towards a position, and remotely fire it."
|
||||
extended_desc = "The firing mechanism can slot in any energy weapon. \
|
||||
The first and second inputs need to be numbers which correspond to coordinates for the gun to fire at relative to the machine itself. \
|
||||
The 'fire' activator will cause the mechanism to attempt to fire the weapon at the coordinates, if possible. Mode will switch between \
|
||||
lethal (TRUE) or stun (FALSE) modes. It uses the internal battery of the weapon itself, not the assembly. If you wish to fire the gun while the circuit is in \
|
||||
hand, you will need to use an assembly that is a gun."
|
||||
complexity = 20
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
size = 3
|
||||
inputs = list(
|
||||
"target X rel" = IC_PINTYPE_NUMBER,
|
||||
"target Y rel" = IC_PINTYPE_NUMBER,
|
||||
"mode" = IC_PINTYPE_BOOLEAN
|
||||
)
|
||||
outputs = list("reference to gun" = IC_PINTYPE_REF)
|
||||
activators = list(
|
||||
"fire" = IC_PINTYPE_PULSE_IN
|
||||
|
||||
)
|
||||
var/obj/item/gun/energy/installed_gun = null
|
||||
spawn_flags = IC_SPAWN_RESEARCH
|
||||
action_flags = IC_ACTION_COMBAT
|
||||
power_draw_per_use = 0
|
||||
ext_cooldown = 1
|
||||
var/mode = FALSE
|
||||
|
||||
var/stun_projectile = null //stun mode projectile type
|
||||
var/stun_projectile_sound
|
||||
var/lethal_projectile = null //lethal mode projectile type
|
||||
var/lethal_projectile_sound
|
||||
|
||||
demands_object_input = TRUE // You can put stuff in once the circuit is in assembly,passed down from additem and handled by attackby()
|
||||
|
||||
|
||||
|
||||
/obj/item/integrated_circuit/manipulation/weapon_firing/Destroy()
|
||||
qdel(installed_gun)
|
||||
return ..()
|
||||
|
||||
/obj/item/integrated_circuit/manipulation/weapon_firing/attackby(var/obj/O, var/mob/user)
|
||||
if(istype(O, /obj/item/gun/energy))
|
||||
var/obj/item/gun/gun = O
|
||||
if(installed_gun)
|
||||
to_chat(user, "<span class='warning'>There's already a weapon installed.</span>")
|
||||
return
|
||||
user.transferItemToLoc(gun,src)
|
||||
installed_gun = gun
|
||||
var/list/gun_properties = gun.get_turret_properties()
|
||||
to_chat(user, "<span class='notice'>You slide \the [gun] into the firing mechanism.</span>")
|
||||
playsound(src, 'sound/items/Crowbar.ogg', 50, 1)
|
||||
stun_projectile = gun_properties["stun_projectile"]
|
||||
stun_projectile_sound = gun_properties["stun_projectile_sound"]
|
||||
lethal_projectile = gun_properties["lethal_projectile"]
|
||||
lethal_projectile_sound = gun_properties["lethal_projectile_sound"]
|
||||
if(gun_properties["shot_delay"])
|
||||
cooldown_per_use = gun_properties["shot_delay"]*10
|
||||
if(cooldown_per_use<30)
|
||||
cooldown_per_use = 30
|
||||
if(gun_properties["reqpower"])
|
||||
power_draw_per_use = gun_properties["reqpower"]
|
||||
set_pin_data(IC_OUTPUT, 1, WEAKREF(installed_gun))
|
||||
push_data()
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/integrated_circuit/manipulation/weapon_firing/attack_self(var/mob/user)
|
||||
if(installed_gun)
|
||||
installed_gun.forceMove(drop_location())
|
||||
to_chat(user, "<span class='notice'>You slide \the [installed_gun] out of the firing mechanism.</span>")
|
||||
size = initial(size)
|
||||
playsound(src, 'sound/items/Crowbar.ogg', 50, 1)
|
||||
installed_gun = null
|
||||
set_pin_data(IC_OUTPUT, 1, WEAKREF(null))
|
||||
push_data()
|
||||
else
|
||||
to_chat(user, "<span class='notice'>There's no weapon to remove from the mechanism.</span>")
|
||||
|
||||
/obj/item/integrated_circuit/manipulation/weapon_firing/do_work()
|
||||
if(!installed_gun || !installed_gun.handle_pins())
|
||||
return
|
||||
if(!isturf(assembly.loc) && !(assembly.can_fire_equipped && ishuman(assembly.loc)))
|
||||
return
|
||||
set_pin_data(IC_OUTPUT, 1, WEAKREF(installed_gun))
|
||||
push_data()
|
||||
var/datum/integrated_io/xo = inputs[1]
|
||||
var/datum/integrated_io/yo = inputs[2]
|
||||
var/datum/integrated_io/mode1 = inputs[3]
|
||||
|
||||
mode = mode1.data
|
||||
if(assembly)
|
||||
if(isnum(xo.data))
|
||||
xo.data = round(xo.data, 1)
|
||||
if(isnum(yo.data))
|
||||
yo.data = round(yo.data, 1)
|
||||
|
||||
var/turf/T = get_turf(assembly)
|
||||
var/target_x = CLAMP(T.x + xo.data, 0, world.maxx)
|
||||
var/target_y = CLAMP(T.y + yo.data, 0, world.maxy)
|
||||
|
||||
assembly.visible_message("<span class='danger'>[assembly] fires [installed_gun]!</span>")
|
||||
shootAt(locate(target_x, target_y, T.z))
|
||||
|
||||
/obj/item/integrated_circuit/manipulation/weapon_firing/proc/shootAt(turf/target)
|
||||
var/turf/T = get_turf(src)
|
||||
var/turf/U = target
|
||||
if(!istype(T) || !istype(U))
|
||||
return
|
||||
if(!installed_gun.cell)
|
||||
return
|
||||
if(!installed_gun.cell.charge)
|
||||
return
|
||||
var/obj/item/ammo_casing/energy/shot = installed_gun.ammo_type[mode?2:1]
|
||||
if(installed_gun.cell.charge < shot.e_cost)
|
||||
return
|
||||
if(!shot)
|
||||
return
|
||||
update_icon()
|
||||
var/obj/item/projectile/A
|
||||
if(!mode)
|
||||
A = new stun_projectile(T)
|
||||
playsound(loc, stun_projectile_sound, 75, 1)
|
||||
else
|
||||
A = new lethal_projectile(T)
|
||||
playsound(loc, lethal_projectile_sound, 75, 1)
|
||||
installed_gun.cell.use(shot.e_cost)
|
||||
//Shooting Code:
|
||||
A.preparePixelProjectile(target, src)
|
||||
A.fire()
|
||||
log_attack("[assembly] [REF(assembly)] has fired [installed_gun].")
|
||||
return A
|
||||
|
||||
/obj/item/integrated_circuit/manipulation/locomotion
|
||||
name = "locomotion circuit"
|
||||
desc = "This allows a machine to move in a given direction."
|
||||
@@ -144,7 +11,7 @@
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
complexity = 10
|
||||
cooldown_per_use = 1
|
||||
ext_cooldown = 1
|
||||
ext_cooldown = 2
|
||||
inputs = list("direction" = IC_PINTYPE_DIR)
|
||||
outputs = list("obstacle" = IC_PINTYPE_REF)
|
||||
activators = list("step towards dir" = IC_PINTYPE_PULSE_IN,"on step"=IC_PINTYPE_PULSE_OUT,"blocked"=IC_PINTYPE_PULSE_OUT)
|
||||
@@ -171,80 +38,6 @@
|
||||
return FALSE
|
||||
return FALSE
|
||||
|
||||
/obj/item/integrated_circuit/manipulation/grenade
|
||||
name = "grenade primer"
|
||||
desc = "This circuit comes with the ability to attach most types of grenades and prime them at will."
|
||||
extended_desc = "The time between priming and detonation is limited to between 1 to 12 seconds, but is optional. \
|
||||
If the input is not set, not a number, or a number less than 1, the grenade's built-in timing will be used. \
|
||||
Beware: Once primed, there is no aborting the process!"
|
||||
icon_state = "grenade"
|
||||
complexity = 30
|
||||
cooldown_per_use = 10
|
||||
inputs = list("detonation time" = IC_PINTYPE_NUMBER)
|
||||
outputs = list()
|
||||
activators = list("prime grenade" = IC_PINTYPE_PULSE_IN)
|
||||
spawn_flags = IC_SPAWN_RESEARCH
|
||||
action_flags = IC_ACTION_COMBAT
|
||||
var/obj/item/grenade/attached_grenade
|
||||
var/pre_attached_grenade_type
|
||||
demands_object_input = TRUE // You can put stuff in once the circuit is in assembly,passed down from additem and handled by attackby()
|
||||
|
||||
/obj/item/integrated_circuit/manipulation/grenade/Initialize()
|
||||
. = ..()
|
||||
if(pre_attached_grenade_type)
|
||||
var/grenade = new pre_attached_grenade_type(src)
|
||||
attach_grenade(grenade)
|
||||
|
||||
/obj/item/integrated_circuit/manipulation/grenade/Destroy()
|
||||
if(attached_grenade && !attached_grenade.active)
|
||||
attached_grenade.forceMove(loc)
|
||||
detach_grenade()
|
||||
return ..()
|
||||
|
||||
/obj/item/integrated_circuit/manipulation/grenade/attackby(var/obj/item/grenade/G, var/mob/user)
|
||||
if(istype(G))
|
||||
if(attached_grenade)
|
||||
to_chat(user, "<span class='warning'>There is already a grenade attached!</span>")
|
||||
else if(user.transferItemToLoc(G,src))
|
||||
user.visible_message("<span class='warning'>\The [user] attaches \a [G] to \the [src]!</span>", "<span class='notice'>You attach \the [G] to \the [src].</span>")
|
||||
attach_grenade(G)
|
||||
G.forceMove(src)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/integrated_circuit/manipulation/grenade/attack_self(var/mob/user)
|
||||
if(attached_grenade)
|
||||
user.visible_message("<span class='warning'>\The [user] removes \an [attached_grenade] from \the [src]!</span>", "<span class='notice'>You remove \the [attached_grenade] from \the [src].</span>")
|
||||
user.put_in_hands(attached_grenade)
|
||||
detach_grenade()
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/integrated_circuit/manipulation/grenade/do_work()
|
||||
if(attached_grenade && !attached_grenade.active)
|
||||
var/datum/integrated_io/detonation_time = inputs[1]
|
||||
var/dt
|
||||
if(isnum(detonation_time.data) && detonation_time.data > 0)
|
||||
dt = CLAMP(detonation_time.data, 1, 12)*10
|
||||
else
|
||||
dt = 15
|
||||
addtimer(CALLBACK(attached_grenade, /obj/item/grenade.proc/prime), dt)
|
||||
var/atom/holder = loc
|
||||
message_admins("activated a grenade assembly. Last touches: Assembly: [holder.fingerprintslast] Circuit: [fingerprintslast] Grenade: [attached_grenade.fingerprintslast]")
|
||||
|
||||
// These procs do not relocate the grenade, that's the callers responsibility
|
||||
/obj/item/integrated_circuit/manipulation/grenade/proc/attach_grenade(var/obj/item/grenade/G)
|
||||
attached_grenade = G
|
||||
G.forceMove(src)
|
||||
desc += " \An [attached_grenade] is attached to it!"
|
||||
|
||||
/obj/item/integrated_circuit/manipulation/grenade/proc/detach_grenade()
|
||||
if(!attached_grenade)
|
||||
return
|
||||
attached_grenade.forceMove(drop_location())
|
||||
attached_grenade = null
|
||||
desc = initial(desc)
|
||||
|
||||
/obj/item/integrated_circuit/manipulation/plant_module
|
||||
name = "plant manipulation module"
|
||||
desc = "Used to uproot weeds and harvest/plant trays."
|
||||
@@ -478,7 +271,7 @@
|
||||
|
||||
/obj/item/integrated_circuit/manipulation/thrower
|
||||
name = "thrower"
|
||||
desc = "A compact launcher to throw things from inside or nearby tiles."
|
||||
desc = "A compact launcher to throw things from inside or nearby tiles at a low enough velocity not to harm someone."
|
||||
extended_desc = "The first and second inputs need to be numbers which correspond to the coordinates to throw objects at relative to the machine itself. \
|
||||
The 'fire' activator will cause the mechanism to attempt to throw objects at the coordinates, if possible. Note that the \
|
||||
projectile needs to be inside the machine, or on an adjacent tile, and must be medium sized or smaller. The assembly \
|
||||
@@ -544,7 +337,7 @@
|
||||
A.embedding = list("embed_chance" = 0)
|
||||
//throw it
|
||||
assembly.visible_message("<span class='danger'>[assembly] has thrown [A]!</span>")
|
||||
log_attack("[assembly] [REF(assembly)] has thrown [A].")
|
||||
log_attack("[assembly] [REF(assembly)] has thrown [A] with non-lethal force.")
|
||||
A.forceMove(drop_location())
|
||||
A.throw_at(locate(x_abs, y_abs, T.z), range, 3, , , , CALLBACK(src, .proc/post_throw, A))
|
||||
|
||||
@@ -813,4 +606,7 @@
|
||||
set_pin_data(IC_OUTPUT, 1, assembly.detail_color)
|
||||
push_data()
|
||||
|
||||
activate_pin(3)
|
||||
activate_pin(3)
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -548,9 +548,12 @@
|
||||
desc = "Unlike most electronics, creating smoke is completely intentional."
|
||||
icon_state = "smoke"
|
||||
extended_desc = "This smoke generator creates clouds of smoke on command. It can also hold liquids inside, which will go \
|
||||
into the smoke clouds when activated. The reagents are consumed when the smoke is made."
|
||||
into the smoke clouds when activated. The reagents are consumed when the smoke is made. Requires at least 10 units of reagents to generate smoke."
|
||||
ext_cooldown = 1
|
||||
|
||||
volume = 100
|
||||
container_type = OPENCONTAINER
|
||||
|
||||
complexity = 20
|
||||
cooldown_per_use = 1 SECONDS
|
||||
inputs = list()
|
||||
@@ -573,6 +576,7 @@
|
||||
if(changetype == ADD_REAGENT)
|
||||
notified = FALSE
|
||||
push_vol()
|
||||
|
||||
/obj/item/integrated_circuit/reagent/smoke/do_work(ord)
|
||||
switch(ord)
|
||||
if(1)
|
||||
@@ -598,9 +602,10 @@
|
||||
name = "integrated extinguisher"
|
||||
desc = "This circuit sprays any of its contents out like an extinguisher."
|
||||
icon_state = "injector"
|
||||
extended_desc = "This circuit can hold up to 30 units of any given chemicals. On each use, it sprays these reagents like a fire extinguisher."
|
||||
extended_desc = "This circuit can hold up to 30 units of any given chemicals. On each use, it sprays these reagents like a fire extinguisher. Requires at least 10 units of reagents to work."
|
||||
|
||||
volume = 30
|
||||
container_type = OPENCONTAINER
|
||||
|
||||
complexity = 20
|
||||
cooldown_per_use = 6 SECONDS
|
||||
@@ -631,7 +636,7 @@
|
||||
/obj/item/integrated_circuit/reagent/extinguisher/do_work()
|
||||
//Check if enough volume
|
||||
set_pin_data(IC_OUTPUT, 1, reagents.total_volume)
|
||||
if(!reagents || reagents.total_volume < 5 || busy)
|
||||
if(!reagents || reagents.total_volume < IC_SMOKE_REAGENTS_MINIMUM_UNITS || busy)
|
||||
push_data()
|
||||
activate_pin(3)
|
||||
return
|
||||
|
||||
@@ -125,7 +125,7 @@
|
||||
name = "man-machine interface tank"
|
||||
desc = "This circuit is just a jar filled with an artificial liquid mimicking the cerebrospinal fluid."
|
||||
extended_desc = "This jar can hold 1 man-machine interface and let it take control of some basic functions of the assembly."
|
||||
complexity = 29
|
||||
complexity = 60
|
||||
inputs = list("laws" = IC_PINTYPE_LIST)
|
||||
outputs = list(
|
||||
"man-machine interface" = IC_PINTYPE_REF,
|
||||
@@ -254,7 +254,7 @@
|
||||
name = "pAI connector circuit"
|
||||
desc = "This circuit lets you fit in a personal artificial intelligence to give it some form of control over the bot."
|
||||
extended_desc = "You can wire various functions to it."
|
||||
complexity = 29
|
||||
complexity = 60
|
||||
inputs = list("laws" = IC_PINTYPE_LIST)
|
||||
outputs = list(
|
||||
"personal artificial intelligence" = IC_PINTYPE_REF,
|
||||
|
||||
@@ -0,0 +1,343 @@
|
||||
/obj/item/integrated_circuit/weaponized
|
||||
category_text = "Weaponized"
|
||||
|
||||
/obj/item/integrated_circuit/weaponized/weapon_firing
|
||||
name = "weapon firing mechanism"
|
||||
desc = "This somewhat complicated system allows one to slot in a gun, direct it towards a position, and remotely fire it."
|
||||
extended_desc = "The firing mechanism can slot in any energy weapon. \
|
||||
The first and second inputs need to be numbers which correspond to coordinates for the gun to fire at relative to the machine itself. \
|
||||
The 'fire' activator will cause the mechanism to attempt to fire the weapon at the coordinates, if possible. Mode will switch between \
|
||||
lethal (TRUE) or stun (FALSE) modes. It uses the internal battery of the weapon itself, not the assembly. If you wish to fire the gun while the circuit is in \
|
||||
hand, you will need to use an assembly that is a gun."
|
||||
complexity = 20
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
size = 3
|
||||
inputs = list(
|
||||
"target X rel" = IC_PINTYPE_NUMBER,
|
||||
"target Y rel" = IC_PINTYPE_NUMBER,
|
||||
"mode" = IC_PINTYPE_BOOLEAN
|
||||
)
|
||||
outputs = list("reference to gun" = IC_PINTYPE_REF)
|
||||
activators = list(
|
||||
"fire" = IC_PINTYPE_PULSE_IN
|
||||
|
||||
)
|
||||
var/obj/item/gun/energy/installed_gun = null
|
||||
spawn_flags = IC_SPAWN_RESEARCH
|
||||
action_flags = IC_ACTION_COMBAT
|
||||
power_draw_per_use = 0
|
||||
ext_cooldown = 1
|
||||
var/mode = FALSE
|
||||
|
||||
var/stun_projectile = null //stun mode projectile type
|
||||
var/stun_projectile_sound
|
||||
var/lethal_projectile = null //lethal mode projectile type
|
||||
var/lethal_projectile_sound
|
||||
|
||||
demands_object_input = TRUE // You can put stuff in once the circuit is in assembly,passed down from additem and handled by attackby()
|
||||
|
||||
|
||||
|
||||
/obj/item/integrated_circuit/weaponized/weapon_firing/Destroy()
|
||||
qdel(installed_gun)
|
||||
return ..()
|
||||
|
||||
/obj/item/integrated_circuit/weaponized/weapon_firing/attackby(var/obj/O, var/mob/user)
|
||||
if(istype(O, /obj/item/gun/energy))
|
||||
var/obj/item/gun/gun = O
|
||||
if(installed_gun)
|
||||
to_chat(user, "<span class='warning'>There's already a weapon installed.</span>")
|
||||
return
|
||||
user.transferItemToLoc(gun,src)
|
||||
installed_gun = gun
|
||||
var/list/gun_properties = gun.get_turret_properties()
|
||||
to_chat(user, "<span class='notice'>You slide \the [gun] into the firing mechanism.</span>")
|
||||
playsound(src, 'sound/items/Crowbar.ogg', 50, 1)
|
||||
stun_projectile = gun_properties["stun_projectile"]
|
||||
stun_projectile_sound = gun_properties["stun_projectile_sound"]
|
||||
lethal_projectile = gun_properties["lethal_projectile"]
|
||||
lethal_projectile_sound = gun_properties["lethal_projectile_sound"]
|
||||
if(gun_properties["shot_delay"])
|
||||
cooldown_per_use = gun_properties["shot_delay"]*10
|
||||
if(cooldown_per_use<30)
|
||||
cooldown_per_use = 30
|
||||
if(gun_properties["reqpower"])
|
||||
power_draw_per_use = gun_properties["reqpower"]
|
||||
set_pin_data(IC_OUTPUT, 1, WEAKREF(installed_gun))
|
||||
push_data()
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/integrated_circuit/weaponized/weapon_firing/attack_self(var/mob/user)
|
||||
if(installed_gun)
|
||||
installed_gun.forceMove(drop_location())
|
||||
to_chat(user, "<span class='notice'>You slide \the [installed_gun] out of the firing mechanism.</span>")
|
||||
size = initial(size)
|
||||
playsound(src, 'sound/items/Crowbar.ogg', 50, 1)
|
||||
installed_gun = null
|
||||
set_pin_data(IC_OUTPUT, 1, WEAKREF(null))
|
||||
push_data()
|
||||
else
|
||||
to_chat(user, "<span class='notice'>There's no weapon to remove from the mechanism.</span>")
|
||||
|
||||
/obj/item/integrated_circuit/weaponized/weapon_firing/do_work()
|
||||
if(!installed_gun || !installed_gun.handle_pins())
|
||||
return
|
||||
if(!isturf(assembly.loc) && !(assembly.can_fire_equipped && ishuman(assembly.loc)))
|
||||
return
|
||||
set_pin_data(IC_OUTPUT, 1, WEAKREF(installed_gun))
|
||||
push_data()
|
||||
var/datum/integrated_io/xo = inputs[1]
|
||||
var/datum/integrated_io/yo = inputs[2]
|
||||
var/datum/integrated_io/mode1 = inputs[3]
|
||||
|
||||
mode = mode1.data
|
||||
if(assembly)
|
||||
if(isnum(xo.data))
|
||||
xo.data = round(xo.data, 1)
|
||||
if(isnum(yo.data))
|
||||
yo.data = round(yo.data, 1)
|
||||
|
||||
var/turf/T = get_turf(assembly)
|
||||
var/target_x = CLAMP(T.x + xo.data, 0, world.maxx)
|
||||
var/target_y = CLAMP(T.y + yo.data, 0, world.maxy)
|
||||
|
||||
assembly.visible_message("<span class='danger'>[assembly] fires [installed_gun]!</span>")
|
||||
shootAt(locate(target_x, target_y, T.z))
|
||||
|
||||
/obj/item/integrated_circuit/weaponized/weapon_firing/proc/shootAt(turf/target)
|
||||
var/turf/T = get_turf(src)
|
||||
var/turf/U = target
|
||||
if(!istype(T) || !istype(U))
|
||||
return
|
||||
if(!installed_gun.cell)
|
||||
return
|
||||
if(!installed_gun.cell.charge)
|
||||
return
|
||||
var/obj/item/ammo_casing/energy/shot = installed_gun.ammo_type[mode?2:1]
|
||||
if(installed_gun.cell.charge < shot.e_cost)
|
||||
return
|
||||
if(!shot)
|
||||
return
|
||||
update_icon()
|
||||
var/obj/item/projectile/A
|
||||
if(!mode)
|
||||
A = new stun_projectile(T)
|
||||
playsound(loc, stun_projectile_sound, 75, 1)
|
||||
else
|
||||
A = new lethal_projectile(T)
|
||||
playsound(loc, lethal_projectile_sound, 75, 1)
|
||||
installed_gun.cell.use(shot.e_cost)
|
||||
//Shooting Code:
|
||||
A.preparePixelProjectile(target, src)
|
||||
A.fire()
|
||||
log_attack("[assembly] [REF(assembly)] has fired [installed_gun].")
|
||||
return A
|
||||
|
||||
/obj/item/integrated_circuit/weaponized/grenade
|
||||
name = "grenade primer"
|
||||
desc = "This circuit comes with the ability to attach most types of grenades and prime them at will."
|
||||
extended_desc = "The time between priming and detonation is limited to between 1 to 12 seconds, but is optional. \
|
||||
If the input is not set, not a number, or a number less than 1, the grenade's built-in timing will be used. \
|
||||
Beware: Once primed, there is no aborting the process!"
|
||||
icon_state = "grenade"
|
||||
complexity = 30
|
||||
cooldown_per_use = 10
|
||||
inputs = list("detonation time" = IC_PINTYPE_NUMBER)
|
||||
outputs = list()
|
||||
activators = list("prime grenade" = IC_PINTYPE_PULSE_IN)
|
||||
spawn_flags = IC_SPAWN_RESEARCH
|
||||
action_flags = IC_ACTION_COMBAT
|
||||
var/obj/item/grenade/attached_grenade
|
||||
var/pre_attached_grenade_type
|
||||
demands_object_input = TRUE // You can put stuff in once the circuit is in assembly,passed down from additem and handled by attackby()
|
||||
|
||||
/obj/item/integrated_circuit/weaponized/grenade/Initialize()
|
||||
. = ..()
|
||||
if(pre_attached_grenade_type)
|
||||
var/grenade = new pre_attached_grenade_type(src)
|
||||
attach_grenade(grenade)
|
||||
|
||||
/obj/item/integrated_circuit/weaponized/grenade/Destroy()
|
||||
if(attached_grenade && !attached_grenade.active)
|
||||
attached_grenade.forceMove(loc)
|
||||
detach_grenade()
|
||||
return ..()
|
||||
|
||||
/obj/item/integrated_circuit/weaponized/grenade/attackby(var/obj/item/grenade/G, var/mob/user)
|
||||
if(istype(G))
|
||||
if(attached_grenade)
|
||||
to_chat(user, "<span class='warning'>There is already a grenade attached!</span>")
|
||||
else if(user.transferItemToLoc(G,src))
|
||||
user.visible_message("<span class='warning'>\The [user] attaches \a [G] to \the [src]!</span>", "<span class='notice'>You attach \the [G] to \the [src].</span>")
|
||||
attach_grenade(G)
|
||||
G.forceMove(src)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/integrated_circuit/weaponized/grenade/attack_self(var/mob/user)
|
||||
if(attached_grenade)
|
||||
user.visible_message("<span class='warning'>\The [user] removes \an [attached_grenade] from \the [src]!</span>", "<span class='notice'>You remove \the [attached_grenade] from \the [src].</span>")
|
||||
user.put_in_hands(attached_grenade)
|
||||
detach_grenade()
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/integrated_circuit/weaponized/grenade/do_work()
|
||||
if(attached_grenade && !attached_grenade.active)
|
||||
var/datum/integrated_io/detonation_time = inputs[1]
|
||||
var/dt
|
||||
if(isnum(detonation_time.data) && detonation_time.data > 0)
|
||||
dt = CLAMP(detonation_time.data, 1, 12)*10
|
||||
else
|
||||
dt = 15
|
||||
addtimer(CALLBACK(attached_grenade, /obj/item/grenade.proc/prime), dt)
|
||||
var/atom/holder = loc
|
||||
message_admins("activated a grenade assembly. Last touches: Assembly: [holder.fingerprintslast] Circuit: [fingerprintslast] Grenade: [attached_grenade.fingerprintslast]")
|
||||
|
||||
// These procs do not relocate the grenade, that's the callers responsibility
|
||||
/obj/item/integrated_circuit/weaponized/grenade/proc/attach_grenade(var/obj/item/grenade/G)
|
||||
attached_grenade = G
|
||||
G.forceMove(src)
|
||||
desc += " \An [attached_grenade] is attached to it!"
|
||||
|
||||
/obj/item/integrated_circuit/weaponized/grenade/proc/detach_grenade()
|
||||
if(!attached_grenade)
|
||||
return
|
||||
attached_grenade.forceMove(drop_location())
|
||||
attached_grenade = null
|
||||
desc = initial(desc)
|
||||
|
||||
/obj/item/integrated_circuit/weaponized/air_cannon
|
||||
name = "pneumatic cannon"
|
||||
desc = "A compact pneumatic cannon to throw things from inside or nearby tiles at a high enough velocity to cause damage. Requires air from a canister to fire."
|
||||
extended_desc = "The first and second inputs need to be numbers which correspond to the coordinates to throw objects at relative to the machine itself. \
|
||||
The 'fire' activator will cause the mechanism to attempt to launch objects at the coordinates, if possible. Note that the \
|
||||
projectile needs to be inside the machine, or on an adjacent tile, and must be medium sized or smaller. The assembly \
|
||||
must also be a gun if you wish to launch something while the assembly is in hand."
|
||||
complexity = 75
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
size = 4
|
||||
cooldown_per_use = 30
|
||||
ext_cooldown = 15
|
||||
inputs = list(
|
||||
"target X rel" = IC_PINTYPE_NUMBER,
|
||||
"target Y rel" = IC_PINTYPE_NUMBER,
|
||||
"projectile" = IC_PINTYPE_REF,
|
||||
"canister" = IC_PINTYPE_REF
|
||||
)
|
||||
outputs = list()
|
||||
activators = list(
|
||||
"fire" = IC_PINTYPE_PULSE_IN
|
||||
)
|
||||
spawn_flags = IC_SPAWN_RESEARCH
|
||||
action_flags = IC_ACTION_COMBAT
|
||||
power_draw_per_use = 50
|
||||
var/gas_per_throw = 6
|
||||
|
||||
/obj/item/integrated_circuit/weaponized/air_cannon/do_work()
|
||||
|
||||
var/max_w_class = assembly.w_class
|
||||
var/target_x_rel = round(get_pin_data(IC_INPUT, 1))
|
||||
var/target_y_rel = round(get_pin_data(IC_INPUT, 2))
|
||||
var/obj/item/A = get_pin_data_as_type(IC_INPUT, 3, /obj/item)
|
||||
var/obj/item/integrated_circuit/atmospherics/AT = get_pin_data_as_type(IC_INPUT, 4, /obj/item/integrated_circuit/atmospherics)
|
||||
|
||||
if(!A || A.anchored || A.throwing || A == assembly || istype(A, /obj/item/twohanded) || istype(A, /obj/item/transfer_valve))
|
||||
return
|
||||
|
||||
if(!AT || !AT.air_contents)
|
||||
return
|
||||
|
||||
if (istype(assembly.loc, /obj/item/implant/storage)) //Prevents the more abusive form of chestgun.
|
||||
return
|
||||
|
||||
if(max_w_class && (A.w_class > max_w_class))
|
||||
return
|
||||
|
||||
if(!assembly.can_fire_equipped && ishuman(assembly.loc))
|
||||
return
|
||||
|
||||
// Is the target inside the assembly or close to it?
|
||||
if(!check_target(A, exclude_components = TRUE))
|
||||
return
|
||||
|
||||
var/turf/T = get_turf(get_object())
|
||||
if(!T)
|
||||
return
|
||||
|
||||
// If the item is in mob's inventory, try to remove it from there.
|
||||
if(ismob(A.loc))
|
||||
var/mob/living/M = A.loc
|
||||
if(!M.temporarilyRemoveItemFromInventory(A))
|
||||
return
|
||||
|
||||
var/datum/gas_mixture/source_air = AT.return_air()
|
||||
var/datum/gas_mixture/target_air = T.return_air()
|
||||
|
||||
if(!source_air || !target_air)
|
||||
return
|
||||
|
||||
var/datum/gas_mixture/removed = source_air.remove(gas_per_throw)
|
||||
if(!removed)
|
||||
return
|
||||
target_air.merge(removed)
|
||||
|
||||
// If the item is in a grabber circuit we'll update the grabber's outputs after we've thrown it.
|
||||
var/obj/item/integrated_circuit/manipulation/grabber/G = A.loc
|
||||
|
||||
var/x_abs = CLAMP(T.x + target_x_rel, 0, world.maxx)
|
||||
var/y_abs = CLAMP(T.y + target_y_rel, 0, world.maxy)
|
||||
var/range = round(CLAMP(sqrt(target_x_rel*target_x_rel+target_y_rel*target_y_rel),0,8),1)
|
||||
assembly.visible_message("<span class='danger'>\The [assembly] has thrown [A]!</span>")
|
||||
log_attack("[assembly] [REF(assembly)] has thrown [A] with lethal force.")
|
||||
A.forceMove(drop_location())
|
||||
A.throw_at(locate(x_abs, y_abs, T.z), range, 3)
|
||||
|
||||
air_update_turf()
|
||||
|
||||
// If the item came from a grabber now we can update the outputs since we've thrown it.
|
||||
if(istype(G))
|
||||
G.update_outputs()
|
||||
|
||||
|
||||
/obj/item/integrated_circuit/weaponized/stun
|
||||
name = "electronic stun module"
|
||||
desc = "Used to stun a target holding the device via electricity."
|
||||
icon_state = "power_relay"
|
||||
extended_desc = "Attempts to stun the holder of this device, with the strength input being the strength of the stun, from 1 to 70."
|
||||
complexity = 60
|
||||
size = 4
|
||||
inputs = list("strength" = IC_PINTYPE_NUMBER)
|
||||
activators = list("stun" = IC_PINTYPE_PULSE_IN, "on success" = IC_PINTYPE_PULSE_OUT, "on fail" = IC_PINTYPE_PULSE_OUT)
|
||||
spawn_flags = IC_SPAWN_RESEARCH
|
||||
power_draw_per_use = 2000
|
||||
cooldown_per_use = 50
|
||||
ext_cooldown = 25
|
||||
|
||||
|
||||
/obj/item/integrated_circuit/weaponized/stun/do_work()
|
||||
var/stunforce = CLAMP(get_pin_data(IC_INPUT, 1),1,70)
|
||||
var/mob/living/L = assembly.loc
|
||||
if(attempt_stun(L,stunforce))
|
||||
activate_pin(2)
|
||||
else
|
||||
activate_pin(3)
|
||||
|
||||
/obj/item/integrated_circuit/weaponized/proc/attempt_stun(var/mob/living/L,var/stunforce = 70) //Copied from stunbaton code.
|
||||
|
||||
if(!L || !isliving(L))
|
||||
return 0
|
||||
|
||||
L.Knockdown(stunforce)
|
||||
SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK)
|
||||
|
||||
message_admins("stunned someone with an assembly. Last touches: Assembly: [assembly.fingerprintslast] Circuit: [fingerprintslast]")
|
||||
|
||||
L.visible_message("<span class='danger'>\The [assembly] has stunned \the [L] with \the [src]!</span>", "<span class='userdanger'>\The [assembly] has stunned you with \the [src]!</span>")
|
||||
playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1)
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
H.forcesay(GLOB.hit_appends)
|
||||
|
||||
return 1
|
||||
@@ -110,7 +110,7 @@ Shaft Miner
|
||||
|
||||
/datum/outfit/job/miner/equipped
|
||||
name = "Shaft Miner (Lavaland + Equipment)"
|
||||
suit = /obj/item/clothing/suit/hooded/explorer
|
||||
suit = /obj/item/clothing/suit/hooded/explorer/standard
|
||||
mask = /obj/item/clothing/mask/gas/explorer
|
||||
glasses = /obj/item/clothing/glasses/meson
|
||||
suit_store = /obj/item/tank/internals/oxygen
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
//this needs to come after the job_types subfolder to keep the correct ordering
|
||||
|
||||
#include "..\..\..\..\_maps\map_files\OmegaStation\job_changes.dm"
|
||||
#undef JOB_MODIFICATION_MAP_NAME
|
||||
#include "..\..\..\..\_maps\map_files\PubbyStation\job_changes.dm"
|
||||
//this needs to come after the job_types subfolder to keep the correct ordering
|
||||
|
||||
#include "..\..\..\..\_maps\map_files\PubbyStation\job_changes.dm"
|
||||
#undef JOB_MODIFICATION_MAP_NAME
|
||||
@@ -15,6 +15,7 @@
|
||||
resistance_flags = FIRE_PROOF
|
||||
tauric = TRUE //Citadel Add for tauric hardsuits
|
||||
|
||||
|
||||
/obj/item/clothing/head/hooded/explorer
|
||||
name = "explorer hood"
|
||||
desc = "An armoured hood for exploring harsh environments."
|
||||
@@ -26,11 +27,15 @@
|
||||
armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50)
|
||||
resistance_flags = FIRE_PROOF
|
||||
|
||||
/obj/item/clothing/suit/hooded/explorer/Initialize()
|
||||
/obj/item/clothing/suit/hooded/explorer/standard
|
||||
|
||||
/obj/item/clothing/head/hooded/explorer/standard
|
||||
|
||||
/obj/item/clothing/suit/hooded/explorer/standard/Initialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/armor_plate)
|
||||
|
||||
/obj/item/clothing/head/hooded/explorer/Initialize()
|
||||
/obj/item/clothing/head/hooded/explorer/standard/Initialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/armor_plate)
|
||||
|
||||
@@ -122,28 +127,23 @@
|
||||
|
||||
/****************SEVA Suit and Mask****************/
|
||||
|
||||
/obj/item/clothing/suit/hooded/seva
|
||||
/obj/item/clothing/suit/hooded/explorer/seva
|
||||
name = "SEVA Suit"
|
||||
desc = "A fire-proof suit for exploring hot environments."
|
||||
icon_state = "seva"
|
||||
item_state = "seva"
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
hoodtype = /obj/item/clothing/head/hooded/seva
|
||||
hoodtype = /obj/item/clothing/head/hooded/explorer/seva
|
||||
armor = list("melee" = 15, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 25, "bio" = 50, "rad" = 25, "fire" = 100, "acid" = 25)
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe)
|
||||
resistance_flags = FIRE_PROOF | GOLIATH_WEAKNESS
|
||||
tauric = TRUE //Citadel Add for tauric hardsuits
|
||||
|
||||
/obj/item/clothing/head/hooded/seva
|
||||
/obj/item/clothing/head/hooded/explorer/seva
|
||||
name = "SEVA Hood"
|
||||
desc = "A fire-proof hood for exploring hot environments."
|
||||
icon_state = "seva"
|
||||
item_state = "seva"
|
||||
body_parts_covered = HEAD
|
||||
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 25, "bio" = 50, "rad" = 25, "fire" = 100, "acid" = 25)
|
||||
resistance_flags = FIRE_PROOF | GOLIATH_WEAKNESS
|
||||
@@ -152,43 +152,27 @@
|
||||
name = "SEVA Mask"
|
||||
desc = "A face-covering plate that can be connected to an air supply. Intended for use with the SEVA Suit."
|
||||
icon_state = "seva"
|
||||
clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
|
||||
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
item_state = "seva"
|
||||
gas_transfer_coefficient = 0.01
|
||||
permeability_coefficient = 0.01
|
||||
flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH
|
||||
resistance_flags = FIRE_PROOF
|
||||
|
||||
/****************Exo-Suit and Mask****************/
|
||||
|
||||
/obj/item/clothing/suit/hooded/exo
|
||||
/obj/item/clothing/suit/hooded/explorer/exo
|
||||
name = "Exo-suit"
|
||||
desc = "A robust suit for exploring dangerous environments."
|
||||
icon_state = "exo"
|
||||
item_state = "exo"
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
|
||||
cold_protection = CHEST|GROIN|LEGS|ARMS
|
||||
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
|
||||
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
hoodtype = /obj/item/clothing/head/hooded/exo
|
||||
hoodtype = /obj/item/clothing/head/hooded/explorer/exo
|
||||
armor = list("melee" = 65, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 60, "bio" = 25, "rad" = 10, "fire" = 0, "acid" = 0)
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe)
|
||||
resistance_flags = FIRE_PROOF | GOLIATH_RESISTANCE
|
||||
tauric = TRUE //Citadel Add for tauric hardsuits
|
||||
|
||||
/obj/item/clothing/head/hooded/exo
|
||||
/obj/item/clothing/head/hooded/explorer/exo
|
||||
name = "Exo-hood"
|
||||
desc = "A robust helmet for exploring dangerous environments."
|
||||
icon_state = "exo"
|
||||
item_state = "exo"
|
||||
body_parts_covered = HEAD
|
||||
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
|
||||
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
|
||||
max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
|
||||
armor = list("melee" = 65, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 60, "bio" = 25, "rad" = 10, "fire" = 0, "acid" = 0)
|
||||
resistance_flags = FIRE_PROOF | GOLIATH_RESISTANCE
|
||||
|
||||
@@ -196,11 +180,5 @@
|
||||
name = "Exosuit Mask"
|
||||
desc = "A face-covering mask that can be connected to an air supply. Intended for use with the Exosuit."
|
||||
icon_state = "exo"
|
||||
clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
|
||||
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
item_state = "exo"
|
||||
gas_transfer_coefficient = 0.01
|
||||
permeability_coefficient = 0.01
|
||||
flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH
|
||||
resistance_flags = FIRE_PROOF
|
||||
resistance_flags = FIRE_PROOF
|
||||
|
||||
@@ -230,7 +230,7 @@
|
||||
desc = "A wing ripped from a watcher. Suitable as a trophy for a kinetic crusher."
|
||||
icon_state = "watcher_wing"
|
||||
denied_type = /obj/item/crusher_trophy/watcher_wing
|
||||
bonus_value = 5
|
||||
bonus_value = 10
|
||||
|
||||
/obj/item/crusher_trophy/watcher_wing/effect_desc()
|
||||
return "mark detonation to prevent certain creatures from using certain attacks for <b>[bonus_value*0.1]</b> second\s"
|
||||
|
||||
@@ -22,10 +22,11 @@
|
||||
new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 300),
|
||||
new /datum/data/mining_equipment("Fulton Beacon", /obj/item/fulton_core, 400),
|
||||
new /datum/data/mining_equipment("Shelter Capsule", /obj/item/survivalcapsule, 400),
|
||||
new /datum/data/mining_equipment("Survival Knife", /obj/item/kitchen/knife/combat/survival, 450),
|
||||
new /datum/data/mining_equipment("GAR Meson Scanners", /obj/item/clothing/glasses/meson/gar, 500),
|
||||
new /datum/data/mining_equipment("Explorer's Webbing", /obj/item/storage/belt/mining, 500),
|
||||
new /datum/data/mining_equipment("Larger Ore Bag", /obj/item/storage/bag/ore/large, 500),
|
||||
new /datum/data/mining_equipment("500 Point Transfer Card", /obj/item/card/mining_point_card/mp500, 500),
|
||||
new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/storage/firstaid/brute, 600),
|
||||
new /datum/data/mining_equipment("Tracking Implant Kit", /obj/item/storage/box/minertracker, 600),
|
||||
new /datum/data/mining_equipment("Survival Medipen", /obj/item/reagent_containers/hypospray/medipen/survival, 750),
|
||||
new /datum/data/mining_equipment("Stabilizing Serum", /obj/item/hivelordstabilizer, 750),
|
||||
@@ -42,16 +43,18 @@
|
||||
new /datum/data/mining_equipment("Lazarus Injector", /obj/item/lazarus_injector, 1000),
|
||||
new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/pickaxe/silver, 1000),
|
||||
new /datum/data/mining_equipment("Mining Conscription Kit", /obj/item/storage/backpack/duffelbag/mining_conscript, 1000),
|
||||
new /datum/data/mining_equipment("1000 Point Transfer Card", /obj/item/card/mining_point_card/mp1000, 1000),
|
||||
new /datum/data/mining_equipment("1500 Point Transfer Card", /obj/item/card/mining_point_card/mp1500, 1500),
|
||||
new /datum/data/mining_equipment("2000 Point Transfer Card", /obj/item/card/mining_point_card/mp2000, 2000),
|
||||
new /datum/data/mining_equipment("1000 Point Transfer Card", /obj/item/card/mining_point_card/mp1000, 1000),
|
||||
new /datum/data/mining_equipment("1500 Point Transfer Card", /obj/item/card/mining_point_card/mp1500, 1500),
|
||||
new /datum/data/mining_equipment("2000 Point Transfer Card", /obj/item/card/mining_point_card/mp2000, 2000),
|
||||
new /datum/data/mining_equipment("Jetpack Upgrade", /obj/item/tank/jetpack/suit, 2000),
|
||||
new /datum/data/mining_equipment("Space Cash", /obj/item/stack/spacecash/c1000, 2000),
|
||||
new /datum/data/mining_equipment("Mining Hardsuit", /obj/item/clothing/suit/space/hardsuit/mining, 2000),
|
||||
new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/pickaxe/diamond, 2000),
|
||||
new /datum/data/mining_equipment("Spare Suit Voucher", /obj/item/suit_voucher, 2000),
|
||||
new /datum/data/mining_equipment("Super Resonator", /obj/item/resonator/upgraded, 2500),
|
||||
new /datum/data/mining_equipment("Jump Boots", /obj/item/clothing/shoes/bhop, 2500),
|
||||
new /datum/data/mining_equipment("Luxury Shelter Capsule", /obj/item/survivalcapsule/luxury, 3000),
|
||||
new /datum/data/mining_equipment("Miner Full Replacement", /obj/item/storage/backpack/duffelbag/mining_cloned, 3000),
|
||||
new /datum/data/mining_equipment("Nanotrasen Minebot", /mob/living/simple_animal/hostile/mining_drone, 800),
|
||||
new /datum/data/mining_equipment("Minebot Melee Upgrade", /obj/item/mine_bot_upgrade, 400),
|
||||
new /datum/data/mining_equipment("Minebot Armor Upgrade", /obj/item/mine_bot_upgrade/health, 400),
|
||||
@@ -67,6 +70,7 @@
|
||||
new /datum/data/mining_equipment("KA Cooldown Decrease", /obj/item/borg/upgrade/modkit/cooldown, 1000),
|
||||
new /datum/data/mining_equipment("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000),
|
||||
new /datum/data/mining_equipment("Premium Accelerator", /obj/item/gun/energy/kinetic_accelerator/premiumka, 8000)
|
||||
|
||||
)
|
||||
|
||||
/datum/data/mining_equipment
|
||||
@@ -315,14 +319,34 @@
|
||||
new /obj/item/clothing/glasses/meson(src)
|
||||
new /obj/item/t_scanner/adv_mining_scanner/lesser(src)
|
||||
new /obj/item/storage/bag/ore(src)
|
||||
new /obj/item/clothing/suit/hooded/explorer(src)
|
||||
new /obj/item/clothing/suit/hooded/explorer/standard(src)
|
||||
new /obj/item/encryptionkey/headset_cargo(src)
|
||||
new /obj/item/clothing/mask/gas/explorer(src)
|
||||
new /obj/item/card/mining_access_card(src)
|
||||
|
||||
|
||||
//CITADEL ADDITIONS BELOW
|
||||
|
||||
/obj/item/storage/backpack/duffelbag/mining_cloned
|
||||
name = "mining replacement kit"
|
||||
desc = "A large bag that has advance tools and a spare jumpsuit, boots, and gloves for a newly cloned miner to get back in the field. Even as a new Id!"
|
||||
|
||||
/obj/item/storage/backpack/duffelbag/mining_cloned/PopulateContents()
|
||||
new /obj/item/pickaxe/mini(src)
|
||||
new /obj/item/clothing/under/rank/miner/lavaland(src)
|
||||
new /obj/item/clothing/shoes/workboots/mining(src)
|
||||
new /obj/item/clothing/gloves/color/black(src)
|
||||
new /obj/item/implanter/tracking/gps(src)
|
||||
new /obj/item/kitchen/knife/combat/survival(src)
|
||||
new /obj/item/storage/firstaid/regular(src)
|
||||
new /obj/item/reagent_containers/hypospray/medipen/survival(src)
|
||||
new /obj/item/t_scanner/adv_mining_scanner(src)
|
||||
new /obj/item/clothing/suit/hooded/explorer/standard(src)
|
||||
new /obj/item/encryptionkey/headset_cargo(src)
|
||||
new /obj/item/clothing/mask/gas/explorer(src)
|
||||
new /obj/item/card/id/mining(src)
|
||||
new /obj/item/storage/bag/ore(src)
|
||||
new /obj/item/clothing/glasses/meson/prescription(src)
|
||||
|
||||
/obj/machinery/mineral/equipment_vendor/proc/RedeemSVoucher(obj/item/suit_voucher/voucher, mob/redeemer)
|
||||
var/items = list("Exo-suit", "SEVA suit")
|
||||
|
||||
@@ -332,10 +356,10 @@
|
||||
var/drop_location = drop_location()
|
||||
switch(selection)
|
||||
if("Exo-suit")
|
||||
new /obj/item/clothing/suit/hooded/exo(drop_location)
|
||||
new /obj/item/clothing/suit/hooded/explorer/exo(drop_location)
|
||||
new /obj/item/clothing/mask/gas/exo(drop_location)
|
||||
if("SEVA suit")
|
||||
new /obj/item/clothing/suit/hooded/seva(drop_location)
|
||||
new /obj/item/clothing/suit/hooded/explorer/seva(drop_location)
|
||||
new /obj/item/clothing/mask/gas/seva(drop_location)
|
||||
|
||||
SSblackbox.record_feedback("tally", "suit_voucher_redeemed", 1, selection)
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
// var/wide_icon = FALSE //CITDEL THINGS
|
||||
// if(features["taur"] != "None")
|
||||
// wide_icon = TRUE
|
||||
|
||||
if(job_engsec_high)
|
||||
switch(job_engsec_high)
|
||||
if(AI_JF)
|
||||
@@ -37,6 +36,8 @@
|
||||
|
||||
// Set up the dummy for its photoshoot
|
||||
var/mob/living/carbon/human/dummy/mannequin = generate_or_wait_for_human_dummy(DUMMY_HUMAN_SLOT_PREFERENCES)
|
||||
mannequin.cut_overlays()
|
||||
mannequin.add_overlay(mutable_appearance('modular_citadel/icons/ui/backgrounds.dmi', bgstate, layer = SPACE_LAYER))
|
||||
copy_to(mannequin)
|
||||
|
||||
// Determine what job is marked as 'High' priority, and dress them up as such.
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
|
||||
Hello and welcome to sprite_accessories: For sprite accessories, such as hair,
|
||||
facial hair, and possibly tattoos and stuff somewhere along the line. This file is
|
||||
intended to be friendly for people with little to no actual coding experience.
|
||||
The process of adding in new hairstyles has been made pain-free and easy to do.
|
||||
Enjoy! - Doohl
|
||||
|
||||
|
||||
Notice: This all gets automatically compiled in a list in dna.dm, so you do not
|
||||
have to define any UI values for sprite accessories manually for hair and facial
|
||||
hair. Just add in new hair types and the game will naturally adapt.
|
||||
|
||||
!!WARNING!!: changing existing hair information can be VERY hazardous to savefiles,
|
||||
to the point where you may completely corrupt a server's savefiles. Please refrain
|
||||
from doing this unless you absolutely know what you are doing, and have defined a
|
||||
conversion in savefile.dm
|
||||
*/
|
||||
/proc/init_sprite_accessory_subtypes(prototype, list/L, list/male, list/female,var/roundstart = FALSE)//Roundstart argument builds a specific list for roundstart parts where some parts may be locked
|
||||
if(!istype(L))
|
||||
L = list()
|
||||
if(!istype(male))
|
||||
male = list()
|
||||
if(!istype(female))
|
||||
female = list()
|
||||
|
||||
for(var/path in typesof(prototype))
|
||||
if(path == prototype)
|
||||
continue
|
||||
if(roundstart)
|
||||
var/datum/sprite_accessory/P = path
|
||||
if(initial(P.locked))
|
||||
continue
|
||||
var/datum/sprite_accessory/D = new path()
|
||||
|
||||
if(D.icon_state)
|
||||
L[D.name] = D
|
||||
else
|
||||
L += D.name
|
||||
|
||||
switch(D.gender)
|
||||
if(MALE)
|
||||
male += D.name
|
||||
if(FEMALE)
|
||||
female += D.name
|
||||
else
|
||||
male += D.name
|
||||
female += D.name
|
||||
return L
|
||||
|
||||
/datum/sprite_accessory
|
||||
var/icon //the icon file the accessory is located in
|
||||
var/icon_state //the icon_state of the accessory
|
||||
var/name //the preview name of the accessory
|
||||
var/gender = NEUTER //Determines if the accessory will be skipped or included in random hair generations
|
||||
var/gender_specific //Something that can be worn by either gender, but looks different on each
|
||||
var/color_src = MUTCOLORS //Currently only used by mutantparts so don't worry about hair and stuff. This is the source that this accessory will get its color from. Default is MUTCOLOR, but can also be HAIR, FACEHAIR, EYECOLOR and 0 if none.
|
||||
var/hasinner //Decides if this sprite has an "inner" part, such as the fleshy parts on ears.
|
||||
var/locked = FALSE //Is this part locked from roundstart selection? Used for parts that apply effects
|
||||
var/dimension_x = 32
|
||||
var/dimension_y = 32
|
||||
var/center = FALSE //Should we center the sprite?
|
||||
@@ -0,0 +1,25 @@
|
||||
//////////.//////////////////
|
||||
// MutantParts Definitions //
|
||||
/////////////////////////////
|
||||
|
||||
/datum/sprite_accessory/body_markings
|
||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||
|
||||
/datum/sprite_accessory/body_markings/none
|
||||
name = "None"
|
||||
icon_state = "none"
|
||||
|
||||
/datum/sprite_accessory/body_markings/dtiger
|
||||
name = "Dark Tiger Body"
|
||||
icon_state = "dtiger"
|
||||
gender_specific = 1
|
||||
|
||||
/datum/sprite_accessory/body_markings/ltiger
|
||||
name = "Light Tiger Body"
|
||||
icon_state = "ltiger"
|
||||
gender_specific = 1
|
||||
|
||||
/datum/sprite_accessory/body_markings/lbelly
|
||||
name = "Light Belly"
|
||||
icon_state = "lbelly"
|
||||
gender_specific = 1
|
||||
@@ -0,0 +1,7 @@
|
||||
datum/sprite_accessory/caps
|
||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||
color_src = HAIR
|
||||
|
||||
/datum/sprite_accessory/caps/round
|
||||
name = "Round"
|
||||
icon_state = "round"
|
||||
@@ -0,0 +1,12 @@
|
||||
/datum/sprite_accessory/ears
|
||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||
|
||||
/datum/sprite_accessory/ears/none
|
||||
name = "None"
|
||||
icon_state = "none"
|
||||
|
||||
/datum/sprite_accessory/ears/cat
|
||||
name = "Cat"
|
||||
icon_state = "cat"
|
||||
hasinner = 1
|
||||
color_src = HAIR
|
||||
@@ -0,0 +1,18 @@
|
||||
/datum/sprite_accessory/frills
|
||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||
|
||||
/datum/sprite_accessory/frills/none
|
||||
name = "None"
|
||||
icon_state = "none"
|
||||
|
||||
/datum/sprite_accessory/frills/simple
|
||||
name = "Simple"
|
||||
icon_state = "simple"
|
||||
|
||||
/datum/sprite_accessory/frills/short
|
||||
name = "Short"
|
||||
icon_state = "short"
|
||||
|
||||
/datum/sprite_accessory/frills/aquatic
|
||||
name = "Aquatic"
|
||||
icon_state = "aqua"
|
||||
@@ -0,0 +1,89 @@
|
||||
/////////////////////////////
|
||||
// Facial Hair Definitions //
|
||||
/////////////////////////////
|
||||
/datum/sprite_accessory/facial_hair
|
||||
icon = 'icons/mob/human_face.dmi'
|
||||
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/abe
|
||||
name = "Beard (Abraham Lincoln)"
|
||||
icon_state = "facial_abe"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/brokenman
|
||||
name = "Beard (Broken Man)"
|
||||
icon_state = "facial_brokenman"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/chinstrap
|
||||
name = "Beard (Chinstrap)"
|
||||
icon_state = "facial_chin"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/dwarf
|
||||
name = "Beard (Dwarf)"
|
||||
icon_state = "facial_dwarf"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/fiveoclock
|
||||
name = "Beard (Five o Clock Shadow)"
|
||||
icon_state = "facial_fiveoclock"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/fullbeard
|
||||
name = "Beard (Full)"
|
||||
icon_state = "facial_fullbeard"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/gt
|
||||
name = "Beard (Goatee)"
|
||||
icon_state = "facial_gt"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/hip
|
||||
name = "Beard (Hipster)"
|
||||
icon_state = "facial_hip"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/jensen
|
||||
name = "Beard (Jensen)"
|
||||
icon_state = "facial_jensen"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/neckbeard
|
||||
name = "Beard (Neckbeard)"
|
||||
icon_state = "facial_neckbeard"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/vlongbeard
|
||||
name = "Beard (Very Long)"
|
||||
icon_state = "facial_wise"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/longbeard
|
||||
name = "Beard (Long)"
|
||||
icon_state = "facial_longbeard"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/fu
|
||||
name = "Moustache (Fu Manchu)"
|
||||
icon_state = "facial_fumanchu"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/hogan
|
||||
name = "Moustache (Hulk Hogan)"
|
||||
icon_state = "facial_hogan" //-Neek
|
||||
|
||||
/datum/sprite_accessory/facial_hair/selleck
|
||||
name = "Moustache (Selleck)"
|
||||
icon_state = "facial_selleck"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/chaplin
|
||||
name = "Moustache (Square)"
|
||||
icon_state = "facial_chaplin"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/vandyke
|
||||
name = "Moustache (Van Dyke)"
|
||||
icon_state = "facial_vandyke"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/watson
|
||||
name = "Moustache (Watson)"
|
||||
icon_state = "facial_watson"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/shaved
|
||||
name = "Shaved"
|
||||
icon_state = null
|
||||
gender = NEUTER
|
||||
|
||||
/datum/sprite_accessory/facial_hair/elvis
|
||||
name = "Sideburns (Elvis)"
|
||||
icon_state = "facial_elvis"
|
||||
@@ -0,0 +1,460 @@
|
||||
//////////////////////
|
||||
// Hair Definitions //
|
||||
//////////////////////
|
||||
/datum/sprite_accessory/hair
|
||||
icon = 'icons/mob/human_face.dmi' // default icon for all hairs
|
||||
|
||||
// please make sure they're sorted alphabetically and, where needed, categorized
|
||||
// try to capitalize the names please~
|
||||
// try to spell
|
||||
// you do not need to define _s or _l sub-states, game automatically does this for you
|
||||
|
||||
/datum/sprite_accessory/hair/afro
|
||||
name = "Afro"
|
||||
icon_state = "hair_afro"
|
||||
|
||||
/datum/sprite_accessory/hair/afro2
|
||||
name = "Afro 2"
|
||||
icon_state = "hair_afro2"
|
||||
|
||||
/datum/sprite_accessory/hair/afro_large
|
||||
name = "Afro (Large)"
|
||||
icon_state = "hair_bigafro"
|
||||
|
||||
/datum/sprite_accessory/hair/antenna
|
||||
name = "Ahoge"
|
||||
icon_state = "hair_antenna"
|
||||
|
||||
/datum/sprite_accessory/hair/bald
|
||||
name = "Bald"
|
||||
icon_state = null
|
||||
|
||||
/datum/sprite_accessory/hair/balding
|
||||
name = "Balding Hair"
|
||||
icon_state = "hair_e"
|
||||
|
||||
/datum/sprite_accessory/hair/bedhead
|
||||
name = "Bedhead"
|
||||
icon_state = "hair_bedhead"
|
||||
|
||||
/datum/sprite_accessory/hair/bedhead2
|
||||
name = "Bedhead 2"
|
||||
icon_state = "hair_bedheadv2"
|
||||
|
||||
/datum/sprite_accessory/hair/bedhead3
|
||||
name = "Bedhead 3"
|
||||
icon_state = "hair_bedheadv3"
|
||||
|
||||
/datum/sprite_accessory/hair/beehive
|
||||
name = "Beehive"
|
||||
icon_state = "hair_beehive"
|
||||
|
||||
/datum/sprite_accessory/hair/beehive2
|
||||
name = "Beehive 2"
|
||||
icon_state = "hair_beehivev2"
|
||||
|
||||
/datum/sprite_accessory/hair/bob
|
||||
name = "Bob Hair"
|
||||
icon_state = "hair_bob"
|
||||
|
||||
/datum/sprite_accessory/hair/bob2
|
||||
name = "Bob Hair 2"
|
||||
icon_state = "hair_bob2"
|
||||
|
||||
/datum/sprite_accessory/hair/bob3
|
||||
name = "Bob Hair 3"
|
||||
icon_state = "hair_bobcut"
|
||||
|
||||
/datum/sprite_accessory/hair/bobcurl
|
||||
name = "Bobcurl"
|
||||
icon_state = "hair_bobcurl"
|
||||
|
||||
/datum/sprite_accessory/hair/boddicker
|
||||
name = "Boddicker"
|
||||
icon_state = "hair_boddicker"
|
||||
|
||||
/datum/sprite_accessory/hair/bowl
|
||||
name = "Bowl"
|
||||
icon_state = "hair_bowlcut"
|
||||
|
||||
/datum/sprite_accessory/hair/braid
|
||||
name = "Braid (Floorlength)"
|
||||
icon_state = "hair_braid"
|
||||
|
||||
/datum/sprite_accessory/hair/braided
|
||||
name = "Braided"
|
||||
icon_state = "hair_braided"
|
||||
|
||||
/datum/sprite_accessory/hair/front_braid
|
||||
name = "Braided Front"
|
||||
icon_state = "hair_braidfront"
|
||||
|
||||
/datum/sprite_accessory/hair/not_floorlength_braid
|
||||
name = "Braid (High)"
|
||||
icon_state = "hair_braid2"
|
||||
|
||||
/datum/sprite_accessory/hair/lowbraid
|
||||
name = "Braid (Low)"
|
||||
icon_state = "hair_hbraid"
|
||||
|
||||
/datum/sprite_accessory/hair/shortbraid
|
||||
name = "Braid (Short)"
|
||||
icon_state = "hair_shortbraid"
|
||||
|
||||
/datum/sprite_accessory/hair/braidtail
|
||||
name = "Braided Tail"
|
||||
icon_state = "hair_braidtail"
|
||||
|
||||
/datum/sprite_accessory/hair/bun
|
||||
name = "Bun Head"
|
||||
icon_state = "hair_bun"
|
||||
|
||||
/datum/sprite_accessory/hair/bun2
|
||||
name = "Bun Head 2"
|
||||
icon_state = "hair_bunhead2"
|
||||
|
||||
/datum/sprite_accessory/hair/largebun
|
||||
name = "Bun (Large)"
|
||||
icon_state = "hair_largebun"
|
||||
|
||||
/datum/sprite_accessory/hair/business
|
||||
name = "Business Hair"
|
||||
icon_state = "hair_business"
|
||||
|
||||
/datum/sprite_accessory/hair/business2
|
||||
name = "Business Hair 2"
|
||||
icon_state = "hair_business2"
|
||||
|
||||
/datum/sprite_accessory/hair/business3
|
||||
name = "Business Hair 3"
|
||||
icon_state = "hair_business3"
|
||||
|
||||
/datum/sprite_accessory/hair/business4
|
||||
name = "Business Hair 4"
|
||||
icon_state = "hair_business4"
|
||||
|
||||
/datum/sprite_accessory/hair/buzz
|
||||
name = "Buzzcut"
|
||||
icon_state = "hair_buzzcut"
|
||||
|
||||
/datum/sprite_accessory/hair/combover
|
||||
name = "Combover"
|
||||
icon_state = "hair_combover"
|
||||
|
||||
/datum/sprite_accessory/hair/crew
|
||||
name = "Crewcut"
|
||||
icon_state = "hair_crewcut"
|
||||
|
||||
/datum/sprite_accessory/hair/curls
|
||||
name = "Curls"
|
||||
icon_state = "hair_curls"
|
||||
|
||||
/datum/sprite_accessory/hair/cut
|
||||
name = "Cut Hair"
|
||||
icon_state = "hair_c"
|
||||
|
||||
/datum/sprite_accessory/hair/devillock
|
||||
name = "Devil Lock"
|
||||
icon_state = "hair_devilock"
|
||||
|
||||
/datum/sprite_accessory/hair/dreadlocks
|
||||
name = "Dreadlocks"
|
||||
icon_state = "hair_dreads"
|
||||
|
||||
/datum/sprite_accessory/hair/drillhair
|
||||
name = "Drill Hair"
|
||||
icon_state = "hair_drillhair"
|
||||
|
||||
/datum/sprite_accessory/hair/drillhairextended
|
||||
name = "Drill Hair (Extended)"
|
||||
icon_state = "hair_drillhairextended"
|
||||
|
||||
/datum/sprite_accessory/hair/emo
|
||||
name = "Emo"
|
||||
icon_state = "hair_emo"
|
||||
|
||||
/datum/sprite_accessory/hair/feather
|
||||
name = "Feather"
|
||||
icon_state = "hair_feather"
|
||||
|
||||
/datum/sprite_accessory/hair/sargeant
|
||||
name = "Flat Top"
|
||||
icon_state = "hair_sargeant"
|
||||
|
||||
/datum/sprite_accessory/hair/bigflattop
|
||||
name = "Flat Top (Big)"
|
||||
icon_state = "hair_bigflattop"
|
||||
|
||||
/datum/sprite_accessory/hair/fag
|
||||
name = "Flow Hair"
|
||||
icon_state = "hair_f"
|
||||
|
||||
/datum/sprite_accessory/hair/gelled
|
||||
name = "Gelled Back"
|
||||
icon_state = "hair_gelled"
|
||||
|
||||
/datum/sprite_accessory/hair/gentle
|
||||
name = "Gentle"
|
||||
icon_state = "hair_gentle"
|
||||
|
||||
/datum/sprite_accessory/hair/halfbang
|
||||
name = "Half-banged Hair"
|
||||
icon_state = "hair_halfbang"
|
||||
|
||||
/datum/sprite_accessory/hair/halfbang2
|
||||
name = "Half-banged Hair 2"
|
||||
icon_state = "hair_halfbang2"
|
||||
|
||||
/datum/sprite_accessory/hair/hedgehog
|
||||
name = "Hedgehog Hair"
|
||||
icon_state = "hair_hedgehog"
|
||||
|
||||
/datum/sprite_accessory/hair/himecut
|
||||
name = "Hime Cut"
|
||||
icon_state = "hair_himecut"
|
||||
|
||||
/datum/sprite_accessory/hair/himecut2
|
||||
name = "Hime Cut 2"
|
||||
icon_state = "hair_himecut2"
|
||||
|
||||
/datum/sprite_accessory/hair/himeup
|
||||
name = "Hime Updo"
|
||||
icon_state = "hair_himeup"
|
||||
|
||||
/datum/sprite_accessory/hair/hitop
|
||||
name = "Hitop"
|
||||
icon_state = "hair_hitop"
|
||||
|
||||
/datum/sprite_accessory/hair/jensen
|
||||
name = "Jensen Hair"
|
||||
icon_state = "hair_jensen"
|
||||
|
||||
/datum/sprite_accessory/hair/keanu
|
||||
name = "Keanu Hair"
|
||||
icon_state = "hair_keanu"
|
||||
|
||||
/datum/sprite_accessory/hair/kusangi
|
||||
name = "Kusanagi Hair"
|
||||
icon_state = "hair_kusanagi"
|
||||
|
||||
/datum/sprite_accessory/hair/long
|
||||
name = "Long Hair 1"
|
||||
icon_state = "hair_long"
|
||||
|
||||
/datum/sprite_accessory/hair/long2
|
||||
name = "Long Hair 2"
|
||||
icon_state = "hair_long2"
|
||||
|
||||
/datum/sprite_accessory/hair/long3
|
||||
name = "Long Hair 3"
|
||||
icon_state = "hair_long3"
|
||||
|
||||
/datum/sprite_accessory/hair/long_over_eye
|
||||
name = "Long Over Eye"
|
||||
icon_state = "hair_longovereye"
|
||||
|
||||
/datum/sprite_accessory/hair/longbangs
|
||||
name = "Long Bangs"
|
||||
icon_state = "hair_lbangs"
|
||||
|
||||
/datum/sprite_accessory/hair/longemo
|
||||
name = "Long Emo"
|
||||
icon_state = "hair_longemo"
|
||||
|
||||
/datum/sprite_accessory/hair/longfringe
|
||||
name = "Long Fringe"
|
||||
icon_state = "hair_longfringe"
|
||||
|
||||
/datum/sprite_accessory/hair/sidepartlongalt
|
||||
name = "Long Side Part"
|
||||
icon_state = "hair_longsidepart"
|
||||
|
||||
/datum/sprite_accessory/hair/megaeyebrows
|
||||
name = "Mega Eyebrows"
|
||||
icon_state = "hair_megaeyebrows"
|
||||
|
||||
/datum/sprite_accessory/hair/messy
|
||||
name = "Messy"
|
||||
icon_state = "hair_messy"
|
||||
|
||||
/datum/sprite_accessory/hair/mohawk
|
||||
name = "Mohawk"
|
||||
icon_state = "hair_d"
|
||||
|
||||
/datum/sprite_accessory/hair/reversemohawk
|
||||
name = "Mohawk (Reverse)"
|
||||
icon_state = "hair_reversemohawk"
|
||||
|
||||
/datum/sprite_accessory/hair/odango
|
||||
name = "Odango"
|
||||
icon_state = "hair_odango"
|
||||
|
||||
/datum/sprite_accessory/hair/ombre
|
||||
name = "Ombre"
|
||||
icon_state = "hair_ombre"
|
||||
|
||||
/datum/sprite_accessory/hair/oneshoulder
|
||||
name = "One Shoulder"
|
||||
icon_state = "hair_oneshoulder"
|
||||
|
||||
/datum/sprite_accessory/hair/over_eye
|
||||
name = "Over Eye"
|
||||
icon_state = "hair_shortovereye"
|
||||
|
||||
//Donator item - fractious
|
||||
/datum/sprite_accessory/hair/over_eye_fr
|
||||
name = "Over Eye (fract)"
|
||||
icon_state = "hair_shortovereye_1f"
|
||||
ckeys_allowed = list("fractious")
|
||||
|
||||
/datum/sprite_accessory/hair/parted
|
||||
name = "Parted"
|
||||
icon_state = "hair_parted"
|
||||
|
||||
/datum/sprite_accessory/hair/partedside
|
||||
name = "Parted (Side)"
|
||||
icon_state = "hair_part"
|
||||
|
||||
/datum/sprite_accessory/hair/kagami
|
||||
name = "Pigtails"
|
||||
icon_state = "hair_kagami"
|
||||
|
||||
/datum/sprite_accessory/hair/pigtail
|
||||
name = "Pigtails 2"
|
||||
icon_state = "hair_pigtails"
|
||||
|
||||
/datum/sprite_accessory/hair/pigtail2
|
||||
name = "Pigtails 3"
|
||||
icon_state = "hair_pigtails2"
|
||||
|
||||
/datum/sprite_accessory/hair/pixie
|
||||
name = "Pixie Cut"
|
||||
icon_state = "hair_pixie"
|
||||
|
||||
/datum/sprite_accessory/hair/pompadour
|
||||
name = "Pompadour"
|
||||
icon_state = "hair_pompadour"
|
||||
|
||||
/datum/sprite_accessory/hair/bigpompadour
|
||||
name = "Pompadour (Big)"
|
||||
icon_state = "hair_bigpompadour"
|
||||
|
||||
/datum/sprite_accessory/hair/ponytail1
|
||||
name = "Ponytail"
|
||||
icon_state = "hair_ponytail"
|
||||
|
||||
/datum/sprite_accessory/hair/ponytail2
|
||||
name = "Ponytail 2"
|
||||
icon_state = "hair_ponytail2"
|
||||
|
||||
/datum/sprite_accessory/hair/ponytail3
|
||||
name = "Ponytail 3"
|
||||
icon_state = "hair_ponytail3"
|
||||
|
||||
/datum/sprite_accessory/hair/ponytail4
|
||||
name = "Ponytail 4"
|
||||
icon_state = "hair_ponytail4"
|
||||
|
||||
/datum/sprite_accessory/hair/ponytail5
|
||||
name = "Ponytail 5"
|
||||
icon_state = "hair_ponytail5"
|
||||
|
||||
/datum/sprite_accessory/hair/highponytail
|
||||
name = "Ponytail (High)"
|
||||
icon_state = "hair_highponytail"
|
||||
|
||||
/datum/sprite_accessory/hair/longponytail
|
||||
name = "Ponytail (Long)"
|
||||
icon_state = "hair_longstraightponytail"
|
||||
|
||||
/datum/sprite_accessory/hair/sidetail
|
||||
name = "Ponytail (Side)"
|
||||
icon_state = "hair_sidetail"
|
||||
|
||||
/datum/sprite_accessory/hair/sidetail2
|
||||
name = "Ponytail (Side) 2"
|
||||
icon_state = "hair_sidetail2"
|
||||
|
||||
/datum/sprite_accessory/hair/sidetail3
|
||||
name = "Ponytail (Side) 3"
|
||||
icon_state = "hair_sidetail3"
|
||||
|
||||
/datum/sprite_accessory/hair/sidetail4
|
||||
name = "Ponytail (Side) 4"
|
||||
icon_state = "hair_sidetail4"
|
||||
|
||||
/datum/sprite_accessory/hair/quiff
|
||||
name = "Quiff"
|
||||
icon_state = "hair_quiff"
|
||||
|
||||
/datum/sprite_accessory/hair/short
|
||||
name = "Short Hair"
|
||||
icon_state = "hair_a"
|
||||
|
||||
/datum/sprite_accessory/hair/shorthair2
|
||||
name = "Short Hair 2"
|
||||
icon_state = "hair_shorthair2"
|
||||
|
||||
/datum/sprite_accessory/hair/shorthair3
|
||||
name = "Short Hair 3"
|
||||
icon_state = "hair_shorthair3"
|
||||
|
||||
/datum/sprite_accessory/hair/shoulderlength
|
||||
name = "Shoulder-length Hair"
|
||||
icon_state = "hair_b"
|
||||
|
||||
/datum/sprite_accessory/hair/sidecut
|
||||
name = "Sidecut"
|
||||
icon_state = "hair_sidecut"
|
||||
|
||||
/datum/sprite_accessory/hair/skinhead
|
||||
name = "Skinhead"
|
||||
icon_state = "hair_skinhead"
|
||||
|
||||
/datum/sprite_accessory/hair/protagonist
|
||||
name = "Slightly Long Hair"
|
||||
icon_state = "hair_protagonist"
|
||||
|
||||
/datum/sprite_accessory/hair/spiky
|
||||
name = "Spiky"
|
||||
icon_state = "hair_spikey"
|
||||
|
||||
/datum/sprite_accessory/hair/spiky2
|
||||
name = "Spiky 2"
|
||||
icon_state = "hair_spiky"
|
||||
|
||||
/datum/sprite_accessory/hair/spiky3
|
||||
name = "Spiky 3"
|
||||
icon_state = "hair_spiky2"
|
||||
|
||||
/datum/sprite_accessory/hair/swept
|
||||
name = "Swept Back Hair"
|
||||
icon_state = "hair_swept"
|
||||
|
||||
/datum/sprite_accessory/hair/swept2
|
||||
name = "Swept Back Hair 2"
|
||||
icon_state = "hair_swept2"
|
||||
|
||||
/datum/sprite_accessory/hair/tressshoulder
|
||||
name = "Tress Shoulder"
|
||||
icon_state = "hair_tressshoulder"
|
||||
|
||||
/datum/sprite_accessory/hair/updo
|
||||
name = "Updo"
|
||||
icon_state = "hair_updo"
|
||||
|
||||
/datum/sprite_accessory/hair/longer
|
||||
name = "Very Long Hair"
|
||||
icon_state = "hair_vlong"
|
||||
|
||||
/datum/sprite_accessory/hair/longest
|
||||
name = "Very Long Hair 2"
|
||||
icon_state = "hair_longest"
|
||||
|
||||
/datum/sprite_accessory/hair/longest2
|
||||
name = "Very Long Over Eye"
|
||||
icon_state = "hair_longest2"
|
||||
|
||||
/datum/sprite_accessory/hair/longestalt
|
||||
name = "Very Long with Fringe"
|
||||
icon_state = "hair_vlongfringe"
|
||||
@@ -0,0 +1,26 @@
|
||||
/datum/sprite_accessory/horns
|
||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||
|
||||
/datum/sprite_accessory/horns/none
|
||||
name = "None"
|
||||
icon_state = "none"
|
||||
|
||||
/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"
|
||||
@@ -0,0 +1,8 @@
|
||||
/datum/sprite_accessory/legs //legs are a special case, they aren't actually sprite_accessories but are updated with them.
|
||||
icon = null //These datums exist for selecting legs on preference, and little else
|
||||
|
||||
/datum/sprite_accessory/legs/none
|
||||
name = "Normal Legs"
|
||||
|
||||
/datum/sprite_accessory/legs/digitigrade_lizard
|
||||
name = "Digitigrade Legs"
|
||||
@@ -0,0 +1,68 @@
|
||||
/datum/sprite_accessory/moth_wings
|
||||
icon = 'icons/mob/wings.dmi'
|
||||
color_src = null
|
||||
|
||||
/datum/sprite_accessory/moth_wings/plain
|
||||
name = "Plain"
|
||||
icon_state = "plain"
|
||||
|
||||
/datum/sprite_accessory/moth_wings/monarch
|
||||
name = "Monarch"
|
||||
icon_state = "monarch"
|
||||
|
||||
/datum/sprite_accessory/moth_wings/luna
|
||||
name = "Luna"
|
||||
icon_state = "luna"
|
||||
|
||||
/datum/sprite_accessory/moth_wings/atlas
|
||||
name = "Atlas"
|
||||
icon_state = "atlas"
|
||||
|
||||
/datum/sprite_accessory/moth_wings/reddish
|
||||
name = "Reddish"
|
||||
icon_state = "redish"
|
||||
|
||||
/datum/sprite_accessory/moth_wings/royal
|
||||
name = "Royal"
|
||||
icon_state = "royal"
|
||||
|
||||
/datum/sprite_accessory/moth_wings/gothic
|
||||
name = "Gothic"
|
||||
icon_state = "gothic"
|
||||
|
||||
/datum/sprite_accessory/moth_wings/lovers
|
||||
name = "Lovers"
|
||||
icon_state = "lovers"
|
||||
|
||||
/datum/sprite_accessory/moth_wings/whitefly
|
||||
name = "White Fly"
|
||||
icon_state = "whitefly"
|
||||
|
||||
/datum/sprite_accessory/moth_wings/punished
|
||||
name = "Burnt Off"
|
||||
icon_state = "punished"
|
||||
locked = TRUE
|
||||
|
||||
/datum/sprite_accessory/moth_wings/firewatch
|
||||
name = "Firewatch"
|
||||
icon_state = "firewatch"
|
||||
|
||||
/datum/sprite_accessory/moth_wings/deathhead
|
||||
name = "Deathshead"
|
||||
icon_state = "deathhead"
|
||||
|
||||
/datum/sprite_accessory/moth_wings/poison
|
||||
name = "Poison"
|
||||
icon_state = "poison"
|
||||
|
||||
/datum/sprite_accessory/moth_wings/ragged
|
||||
name = "Ragged"
|
||||
icon_state = "ragged"
|
||||
|
||||
/datum/sprite_accessory/moth_wings/moonfly
|
||||
name = "Moon Fly"
|
||||
icon_state = "moonfly"
|
||||
|
||||
/datum/sprite_accessory/moth_wings/snow
|
||||
name = "Snow"
|
||||
icon_state = "snow"
|
||||
@@ -0,0 +1,53 @@
|
||||
/datum/sprite_accessory/spines
|
||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||
|
||||
/datum/sprite_accessory/spines_animated
|
||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||
|
||||
/datum/sprite_accessory/spines/none
|
||||
name = "None"
|
||||
icon_state = "none"
|
||||
|
||||
/datum/sprite_accessory/spines_animated/none
|
||||
name = "None"
|
||||
icon_state = "none"
|
||||
|
||||
/datum/sprite_accessory/spines/short
|
||||
name = "Short"
|
||||
icon_state = "short"
|
||||
|
||||
/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/long
|
||||
name = "Long"
|
||||
icon_state = "long"
|
||||
|
||||
/datum/sprite_accessory/spines_animated/long
|
||||
name = "Long"
|
||||
icon_state = "long"
|
||||
|
||||
/datum/sprite_accessory/spines/longmeme
|
||||
name = "Long + Membrane"
|
||||
icon_state = "longmeme"
|
||||
|
||||
/datum/sprite_accessory/spines_animated/longmeme
|
||||
name = "Long + Membrane"
|
||||
icon_state = "longmeme"
|
||||
|
||||
/datum/sprite_accessory/spines/aqautic
|
||||
name = "Aquatic"
|
||||
icon_state = "aqua"
|
||||
|
||||
/datum/sprite_accessory/spines_animated/aqautic
|
||||
name = "Aquatic"
|
||||
icon_state = "aqua"
|
||||
@@ -0,0 +1,18 @@
|
||||
/datum/sprite_accessory/snouts
|
||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||
|
||||
/datum/sprite_accessory/snouts/sharp
|
||||
name = "Sharp"
|
||||
icon_state = "sharp"
|
||||
|
||||
/datum/sprite_accessory/snouts/round
|
||||
name = "Round"
|
||||
icon_state = "round"
|
||||
|
||||
/datum/sprite_accessory/snouts/sharplight
|
||||
name = "Sharp + Light"
|
||||
icon_state = "sharplight"
|
||||
|
||||
/datum/sprite_accessory/snouts/roundlight
|
||||
name = "Round + Light"
|
||||
icon_state = "roundlight"
|
||||
@@ -0,0 +1,96 @@
|
||||
///////////////////////
|
||||
// Socks Definitions //
|
||||
///////////////////////
|
||||
|
||||
/datum/sprite_accessory/socks
|
||||
icon = 'icons/mob/underwear.dmi'
|
||||
|
||||
/datum/sprite_accessory/socks/nude
|
||||
name = "Nude"
|
||||
icon_state = null
|
||||
|
||||
// please make sure they're sorted alphabetically and categorized
|
||||
|
||||
/datum/sprite_accessory/socks/black_knee
|
||||
name = "Knee-high (Black)"
|
||||
icon_state = "black_knee"
|
||||
|
||||
/datum/sprite_accessory/socks/commie_knee
|
||||
name = "Knee-High (Commie)"
|
||||
icon_state = "commie_knee"
|
||||
|
||||
/datum/sprite_accessory/socks/usa_knee
|
||||
name = "Knee-High (Freedom)"
|
||||
icon_state = "assblastusa_knee"
|
||||
|
||||
/datum/sprite_accessory/socks/rainbow_knee
|
||||
name = "Knee-high (Rainbow)"
|
||||
icon_state = "rainbow_knee"
|
||||
|
||||
/datum/sprite_accessory/socks/striped_knee
|
||||
name = "Knee-high (Striped)"
|
||||
icon_state = "striped_knee"
|
||||
|
||||
/datum/sprite_accessory/socks/thin_knee
|
||||
name = "Knee-high (Thin)"
|
||||
icon_state = "thin_knee"
|
||||
|
||||
/datum/sprite_accessory/socks/uk_knee
|
||||
name = "Knee-High (UK)"
|
||||
icon_state = "uk_knee"
|
||||
|
||||
/datum/sprite_accessory/socks/white_knee
|
||||
name = "Knee-high (White)"
|
||||
icon_state = "white_knee"
|
||||
|
||||
/datum/sprite_accessory/socks/black_norm
|
||||
name = "Normal (Black)"
|
||||
icon_state = "black_norm"
|
||||
|
||||
/datum/sprite_accessory/socks/white_norm
|
||||
name = "Normal (White)"
|
||||
icon_state = "white_norm"
|
||||
|
||||
/datum/sprite_accessory/socks/pantyhose
|
||||
name = "Pantyhose"
|
||||
icon_state = "pantyhose"
|
||||
|
||||
/datum/sprite_accessory/socks/black_short
|
||||
name = "Short (Black)"
|
||||
icon_state = "black_short"
|
||||
|
||||
/datum/sprite_accessory/socks/white_short
|
||||
name = "Short (White)"
|
||||
icon_state = "white_short"
|
||||
|
||||
/datum/sprite_accessory/socks/black_thigh
|
||||
name = "Thigh-high (Black)"
|
||||
icon_state = "black_thigh"
|
||||
|
||||
/datum/sprite_accessory/socks/commie_thigh
|
||||
name = "Thigh-high (Commie)"
|
||||
icon_state = "commie_thigh"
|
||||
|
||||
/datum/sprite_accessory/socks/usa_thigh
|
||||
name = "Thigh-high (Freedom)"
|
||||
icon_state = "assblastusa_thigh"
|
||||
|
||||
/datum/sprite_accessory/socks/rainbow_thigh
|
||||
name = "Thigh-high (Rainbow)"
|
||||
icon_state = "rainbow_thigh"
|
||||
|
||||
/datum/sprite_accessory/socks/striped_thigh
|
||||
name = "Thigh-high (Striped)"
|
||||
icon_state = "striped_thigh"
|
||||
|
||||
/datum/sprite_accessory/socks/thin_thigh
|
||||
name = "Thigh-high (Thin)"
|
||||
icon_state = "thin_thigh"
|
||||
|
||||
/datum/sprite_accessory/socks/uk_thigh
|
||||
name = "Thigh-high (UK)"
|
||||
icon_state = "uk_thigh"
|
||||
|
||||
/datum/sprite_accessory/socks/white_thigh
|
||||
name = "Thigh-high (White)"
|
||||
icon_state = "white_thigh"
|
||||
@@ -0,0 +1,55 @@
|
||||
/datum/sprite_accessory/tails
|
||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||
|
||||
/datum/sprite_accessory/tails_animated
|
||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||
|
||||
/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"
|
||||
|
||||
/datum/sprite_accessory/tails/human/none
|
||||
name = "None"
|
||||
icon_state = "none"
|
||||
|
||||
/datum/sprite_accessory/tails_animated/human/none
|
||||
name = "None"
|
||||
icon_state = "none"
|
||||
/*
|
||||
/datum/sprite_accessory/tails/human/cat
|
||||
name = "Cat"
|
||||
icon_state = "cat"
|
||||
color_src = HAIR
|
||||
|
||||
/datum/sprite_accessory/tails_animated/human/cat
|
||||
name = "Cat"
|
||||
icon_state = "cat"
|
||||
color_src = HAIR*/
|
||||
@@ -0,0 +1,308 @@
|
||||
////////////////////////////
|
||||
// Undershirt Definitions //
|
||||
////////////////////////////
|
||||
|
||||
/datum/sprite_accessory/undershirt
|
||||
icon = 'icons/mob/underwear.dmi'
|
||||
gender = NEUTER
|
||||
|
||||
/datum/sprite_accessory/undershirt/nude
|
||||
name = "Nude"
|
||||
icon_state = null
|
||||
|
||||
// please make sure they're sorted alphabetically and categorized
|
||||
|
||||
/datum/sprite_accessory/undershirt/bluejersey
|
||||
name = "Shirt, Jersey - Blue"
|
||||
icon_state = "shirt_bluejersey"
|
||||
|
||||
/datum/sprite_accessory/undershirt/redjersey
|
||||
name = "Shirt, Jersey - Red"
|
||||
icon_state = "shirt_redjersey"
|
||||
|
||||
/datum/sprite_accessory/undershirt/bluepolo
|
||||
name = "Shirt, Polo - Blue"
|
||||
icon_state = "bluepolo"
|
||||
|
||||
/datum/sprite_accessory/undershirt/grayyellowpolo
|
||||
name = "Shirt, Polo - Gray, Yellow"
|
||||
icon_state = "grayyellowpolo"
|
||||
|
||||
/datum/sprite_accessory/undershirt/redpolo
|
||||
name = "Shirt, Polo - Red"
|
||||
icon_state = "redpolo"
|
||||
|
||||
/datum/sprite_accessory/undershirt/whitepolo
|
||||
name = "Shirt, Polo - White"
|
||||
icon_state = "whitepolo"
|
||||
|
||||
/datum/sprite_accessory/undershirt/alienshirt
|
||||
name = "Shirt - Alien"
|
||||
icon_state = "shirt_alien"
|
||||
|
||||
/datum/sprite_accessory/undershirt/mondmondjaja
|
||||
name = "Shirt - Band"
|
||||
icon_state = "band"
|
||||
|
||||
/datum/sprite_accessory/undershirt/shirt_black
|
||||
name = "Shirt - Black"
|
||||
icon_state = "shirt_black"
|
||||
|
||||
/datum/sprite_accessory/undershirt/blueshirt
|
||||
name = "Shirt - Blue"
|
||||
icon_state = "shirt_blue"
|
||||
|
||||
/datum/sprite_accessory/undershirt/clownshirt
|
||||
name = "Shirt - Clown"
|
||||
icon_state = "shirt_clown"
|
||||
|
||||
/datum/sprite_accessory/undershirt/commie
|
||||
name = "Shirt - Commie"
|
||||
icon_state = "shirt_commie"
|
||||
|
||||
/datum/sprite_accessory/undershirt/greenshirt
|
||||
name = "Shirt - Green"
|
||||
icon_state = "shirt_green"
|
||||
|
||||
/datum/sprite_accessory/undershirt/shirt_grey
|
||||
name = "Shirt - Grey"
|
||||
icon_state = "shirt_grey"
|
||||
|
||||
/datum/sprite_accessory/undershirt/ian
|
||||
name = "Shirt - Ian"
|
||||
icon_state = "ian"
|
||||
|
||||
/datum/sprite_accessory/undershirt/ilovent
|
||||
name = "Shirt - I Love NT"
|
||||
icon_state = "ilovent"
|
||||
|
||||
/datum/sprite_accessory/undershirt/lover
|
||||
name = "Shirt - Lover"
|
||||
icon_state = "lover"
|
||||
|
||||
/datum/sprite_accessory/undershirt/matroska
|
||||
name = "Shirt - Matroska"
|
||||
icon_state = "matroska"
|
||||
|
||||
/datum/sprite_accessory/undershirt/meat
|
||||
name = "Shirt - Meat"
|
||||
icon_state = "shirt_meat"
|
||||
|
||||
/datum/sprite_accessory/undershirt/nano
|
||||
name = "Shirt - Nanotrasen"
|
||||
icon_state = "shirt_nano"
|
||||
|
||||
/datum/sprite_accessory/undershirt/peace
|
||||
name = "Shirt - Peace"
|
||||
icon_state = "peace"
|
||||
|
||||
/datum/sprite_accessory/undershirt/pacman
|
||||
name = "Shirt - Pogoman"
|
||||
icon_state = "pogoman"
|
||||
|
||||
/datum/sprite_accessory/undershirt/question
|
||||
name = "Shirt - Question"
|
||||
icon_state = "shirt_question"
|
||||
|
||||
/datum/sprite_accessory/undershirt/redshirt
|
||||
name = "Shirt - Red"
|
||||
icon_state = "shirt_red"
|
||||
|
||||
/datum/sprite_accessory/undershirt/skull
|
||||
name = "Shirt - Skull"
|
||||
icon_state = "shirt_skull"
|
||||
|
||||
/datum/sprite_accessory/undershirt/ss13
|
||||
name = "Shirt - SS13"
|
||||
icon_state = "shirt_ss13"
|
||||
|
||||
/datum/sprite_accessory/undershirt/stripe
|
||||
name = "Shirt - Striped"
|
||||
icon_state = "shirt_stripes"
|
||||
|
||||
/datum/sprite_accessory/undershirt/tiedye
|
||||
name = "Shirt - Tie-dye"
|
||||
icon_state = "shirt_tiedye"
|
||||
|
||||
/datum/sprite_accessory/undershirt/uk
|
||||
name = "Shirt - UK"
|
||||
icon_state = "uk"
|
||||
|
||||
/datum/sprite_accessory/undershirt/usa
|
||||
name = "Shirt - USA"
|
||||
icon_state = "shirt_assblastusa"
|
||||
|
||||
/datum/sprite_accessory/undershirt/shirt_white
|
||||
name = "Shirt - White"
|
||||
icon_state = "shirt_white"
|
||||
|
||||
/datum/sprite_accessory/undershirt/blackshortsleeve
|
||||
name = "Shirt, Short Sleeved - Black"
|
||||
icon_state = "blackshortsleeve"
|
||||
|
||||
/datum/sprite_accessory/undershirt/blueshortsleeve
|
||||
name = "Shirt, Short Sleeved - Blue"
|
||||
icon_state = "blueshortsleeve"
|
||||
|
||||
/datum/sprite_accessory/undershirt/greenshortsleeve
|
||||
name = "Shirt, Short Sleeved - Green"
|
||||
icon_state = "greenshortsleeve"
|
||||
|
||||
/datum/sprite_accessory/undershirt/purpleshortsleeve
|
||||
name = "Shirt, Short Sleeved - Purple"
|
||||
icon_state = "purpleshortsleeve"
|
||||
|
||||
/datum/sprite_accessory/undershirt/whiteshortsleeve
|
||||
name = "Shirt, Short Sleeved - White"
|
||||
icon_state = "whiteshortsleeve"
|
||||
|
||||
/datum/sprite_accessory/undershirt/blueshirtsport
|
||||
name = "Shirt, Sports - Blue"
|
||||
icon_state = "blueshirtsport"
|
||||
gender = NEUTER
|
||||
|
||||
/datum/sprite_accessory/undershirt/greenshirtsport
|
||||
name = "Shirt, Sports - Green"
|
||||
icon_state = "greenshirtsport"
|
||||
gender = NEUTER
|
||||
|
||||
/datum/sprite_accessory/undershirt/redshirtsport
|
||||
name = "Shirt, Sports - Red"
|
||||
icon_state = "redshirtsport"
|
||||
gender = NEUTER
|
||||
|
||||
/datum/sprite_accessory/undershirt/redtop
|
||||
name = "Shirt, Short - Red"
|
||||
icon_state = "redtop"
|
||||
|
||||
/datum/sprite_accessory/undershirt/whitetop
|
||||
name = "Shirt, Short - White"
|
||||
icon_state = "whitetop"
|
||||
|
||||
/datum/sprite_accessory/undershirt/tshirt_blue
|
||||
name = "T-Shirt - Blue"
|
||||
icon_state = "blueshirt"
|
||||
|
||||
/datum/sprite_accessory/undershirt/tshirt_green
|
||||
name = "T-Shirt - Green"
|
||||
icon_state = "greenshirt"
|
||||
|
||||
/datum/sprite_accessory/undershirt/tshirt_red
|
||||
name = "T-Shirt - Red"
|
||||
icon_state = "redshirt"
|
||||
|
||||
/datum/sprite_accessory/undershirt/yellowshirt
|
||||
name = "T-Shirt - Yellow"
|
||||
icon_state = "yellowshirt"
|
||||
|
||||
/datum/sprite_accessory/undershirt/tank_black
|
||||
name = "Tank Top - Black"
|
||||
icon_state = "tank_black"
|
||||
|
||||
/datum/sprite_accessory/undershirt/tankfire
|
||||
name = "Tank Top - Fire"
|
||||
icon_state = "tank_fire"
|
||||
|
||||
/datum/sprite_accessory/undershirt/tank_grey
|
||||
name = "Tank Top - Grey"
|
||||
icon_state = "tank_grey"
|
||||
|
||||
/datum/sprite_accessory/undershirt/female_midriff
|
||||
name = "Tank Top - Midriff"
|
||||
icon_state = "tank_midriff"
|
||||
|
||||
/datum/sprite_accessory/undershirt/tank_red
|
||||
name = "Tank Top - Red"
|
||||
icon_state = "tank_red"
|
||||
|
||||
/datum/sprite_accessory/undershirt/tankstripe
|
||||
name = "Tank Top - Striped"
|
||||
icon_state = "tank_stripes"
|
||||
|
||||
/datum/sprite_accessory/undershirt/tank_white
|
||||
name = "Tank Top - White"
|
||||
icon_state = "tank_white"
|
||||
|
||||
/datum/sprite_accessory/undershirt/female_red
|
||||
name = "Bra - Red"
|
||||
icon_state = "bra_red"
|
||||
|
||||
/datum/sprite_accessory/undershirt/female_pink
|
||||
name = "Bra - Pink"
|
||||
icon_state = "bra_pink"
|
||||
|
||||
/datum/sprite_accessory/undershirt/female_kinky
|
||||
name = "Bra - Kinky Black"
|
||||
icon_state = "bra_kinky"
|
||||
|
||||
/datum/sprite_accessory/undershirt/female_green
|
||||
name = "Bra - Green"
|
||||
icon_state = "bra_green"
|
||||
|
||||
/datum/sprite_accessory/undershirt/female_commie
|
||||
name = "Bra - Freedom"
|
||||
icon_state = "bra_assblastusa"
|
||||
|
||||
/datum/sprite_accessory/undershirt/female_commie
|
||||
name = "Bra - Commie"
|
||||
icon_state = "bra_commie"
|
||||
|
||||
/datum/sprite_accessory/undershirt/female_babyblue
|
||||
name = "Bra, Baby Blue"
|
||||
icon_state = "bra_babyblue"
|
||||
|
||||
/datum/sprite_accessory/undershirt/female_black
|
||||
name = "Bra - Black"
|
||||
icon_state = "bra_black"
|
||||
|
||||
/datum/sprite_accessory/undershirt/female_uk
|
||||
name = "Bra - UK"
|
||||
icon_state = "bra_uk"
|
||||
|
||||
/datum/sprite_accessory/undershirt/female_white
|
||||
name = "Bra - White"
|
||||
icon_state = "bra_white"
|
||||
|
||||
/datum/sprite_accessory/undershirt/female_white_neko
|
||||
name = "Bra, Neko - white"
|
||||
icon_state = "bra_neko_white"
|
||||
|
||||
/datum/sprite_accessory/undershirt/female_black_neko
|
||||
name = "Bra, Neko - Black"
|
||||
icon_state = "bra_neko_black"
|
||||
|
||||
/datum/sprite_accessory/undershirt/female_blackalt
|
||||
name = "Bra, Sports - Black"
|
||||
icon_state = "bra_sports_black"
|
||||
|
||||
/datum/sprite_accessory/undershirt/sports_bra
|
||||
name = "Bra, Sports 1 - White"
|
||||
icon_state = "sports_bra"
|
||||
|
||||
/datum/sprite_accessory/undershirt/female_whitealt
|
||||
name = "Bra, Sports 2 - White"
|
||||
icon_state = "bra_sports_white"
|
||||
|
||||
/datum/sprite_accessory/undershirt/sports_bra2
|
||||
name = "Bra, Sports 3 - White"
|
||||
icon_state = "sports_bra_alt"
|
||||
|
||||
/datum/sprite_accessory/undershirt/female_yellow
|
||||
name = "Bra - Yellow"
|
||||
icon_state = "bra_yellow"
|
||||
|
||||
/datum/sprite_accessory/undershirt/female_thong
|
||||
name = "Bra, Strapless - Pink"
|
||||
icon_state = "bra_strapless_pink"
|
||||
|
||||
/datum/sprite_accessory/undershirt/female_blue
|
||||
name = "Bra, Strapless - Blue"
|
||||
icon_state = "bra_blue"
|
||||
|
||||
/datum/sprite_accessory/undershirt/swimsuit_green
|
||||
name = "Swimsuit, Top - Green"
|
||||
icon_state = "bra_swimming_green"
|
||||
|
||||
/datum/sprite_accessory/undershirt/swimsuit_purple
|
||||
name = "Swimsuit, Top - Purple"
|
||||
icon_state = "bra_swimming_purple"
|
||||
@@ -0,0 +1,171 @@
|
||||
///////////////////////////
|
||||
// Underwear Definitions //
|
||||
///////////////////////////
|
||||
/datum/sprite_accessory/underwear
|
||||
icon = 'icons/mob/underwear.dmi'
|
||||
gender = NEUTER
|
||||
|
||||
/datum/sprite_accessory/underwear/nude
|
||||
name = "Nude"
|
||||
icon_state = null
|
||||
|
||||
/datum/sprite_accessory/underwear/mankini
|
||||
name = "Mankini - Green"
|
||||
icon_state = "mankini_green"
|
||||
|
||||
/datum/sprite_accessory/underwear/male_kinky
|
||||
name = "Jockstrap - White"
|
||||
icon_state = "jockstrap_white"
|
||||
|
||||
/datum/sprite_accessory/underwear/male_white
|
||||
name = "Briefs - White"
|
||||
icon_state = "briefs_white"
|
||||
|
||||
/datum/sprite_accessory/underwear/male_black
|
||||
name = "Briefs - Black"
|
||||
icon_state = "briefs_black"
|
||||
|
||||
/datum/sprite_accessory/underwear/male_grey
|
||||
name = "Briefs - Grey"
|
||||
icon_state = "briefs_grey"
|
||||
|
||||
/datum/sprite_accessory/underwear/male_red
|
||||
name = "Briefs - Red"
|
||||
icon_state = "briefs_red"
|
||||
|
||||
/datum/sprite_accessory/underwear/male_green
|
||||
name = "Briefs - Green"
|
||||
icon_state = "briefs_green"
|
||||
|
||||
/datum/sprite_accessory/underwear/male_blue
|
||||
name = "Briefs - Blue"
|
||||
icon_state = "briefs_blue"
|
||||
|
||||
/datum/sprite_accessory/underwear/male_blackalt
|
||||
name = "Boxers - Black"
|
||||
icon_state = "boxers_black"
|
||||
|
||||
/datum/sprite_accessory/underwear/male_greyalt
|
||||
name = "Boxers - Grey"
|
||||
icon_state = "boxers_grey"
|
||||
|
||||
/datum/sprite_accessory/underwear/male_hearts
|
||||
name = "Boxers - Heart"
|
||||
icon_state = "boxers_heart"
|
||||
|
||||
/datum/sprite_accessory/underwear/male_stripe
|
||||
name = "Boxers - Striped"
|
||||
icon_state = "boxers_striped"
|
||||
|
||||
/datum/sprite_accessory/underwear/male_commie
|
||||
name = "Boxers - Striped Communist"
|
||||
icon_state = "boxers_commie"
|
||||
|
||||
/datum/sprite_accessory/underwear/male_usastripe
|
||||
name = "Boxers - Striped Freedom"
|
||||
icon_state = "boxers_assblastusa"
|
||||
|
||||
/datum/sprite_accessory/underwear/male_uk
|
||||
name = "Boxers - Striped UK"
|
||||
icon_state = "boxers_uk"
|
||||
|
||||
|
||||
/datum/sprite_accessory/underwear/female_whitealt
|
||||
name = "Boxer Briefs - White"
|
||||
icon_state = "boxer_briefs_white"
|
||||
|
||||
/datum/sprite_accessory/underwear/female_blackalt
|
||||
name = "Boxer Briefs - Black"
|
||||
icon_state = "boxer_briefs_black"
|
||||
|
||||
/datum/sprite_accessory/underwear/female_pink
|
||||
name = "Boxer Briefs - Pink"
|
||||
icon_state = "boxer_briefs_pink"
|
||||
|
||||
/datum/sprite_accessory/underwear/female_babyblue
|
||||
name = "Boxer Briefs - Baby Blue"
|
||||
icon_state = "boxer_briefs_babyblue"
|
||||
|
||||
/datum/sprite_accessory/underwear/female_yellow
|
||||
name = "Boxer Briefs - Yellow"
|
||||
icon_state = "boxer_briefs_yellow"
|
||||
|
||||
|
||||
/datum/sprite_accessory/underwear/female_black
|
||||
name = "Panties - Black"
|
||||
icon_state = "panties_black"
|
||||
|
||||
/datum/sprite_accessory/underwear/female_blue
|
||||
name = "Panties - Blue"
|
||||
icon_state = "panties_blue"
|
||||
|
||||
/datum/sprite_accessory/underwear/female_commie
|
||||
name = "Panties - Commie"
|
||||
icon_state = "panties_commie"
|
||||
|
||||
/datum/sprite_accessory/underwear/female_usastripe
|
||||
name = "Panties - Freedom"
|
||||
icon_state = "panties_assblastusa"
|
||||
|
||||
/datum/sprite_accessory/underwear/female_green
|
||||
name = "Panties - Green"
|
||||
icon_state = "panties_green"
|
||||
|
||||
/datum/sprite_accessory/underwear/female_kinky
|
||||
name = "Panties - Kinky Black"
|
||||
icon_state = "panties_kinky"
|
||||
|
||||
/datum/sprite_accessory/underwear/female_red
|
||||
name = "Panties - Red"
|
||||
icon_state = "panties_red"
|
||||
|
||||
/datum/sprite_accessory/underwear/female_uk
|
||||
name = "Panties - UK"
|
||||
icon_state = "panties_uk"
|
||||
|
||||
/datum/sprite_accessory/underwear/female_white
|
||||
name = "Panties - White"
|
||||
icon_state = "panties_white"
|
||||
|
||||
/datum/sprite_accessory/underwear/female_white_neko
|
||||
name = "Panties, Neko - White"
|
||||
icon_state = "panties_neko_white"
|
||||
|
||||
/datum/sprite_accessory/underwear/female_black_neko
|
||||
name = "Panties, Neko - Black"
|
||||
icon_state = "panties_neko_black"
|
||||
|
||||
|
||||
/datum/sprite_accessory/underwear/swimsuit_red
|
||||
name = "Swimsuit, One Piece - Red"
|
||||
icon_state = "swimming_red"
|
||||
|
||||
/datum/sprite_accessory/underwear/swimsuit
|
||||
name = "Swimsuit, One Piece - Black"
|
||||
icon_state = "swimming_black"
|
||||
|
||||
/datum/sprite_accessory/underwear/swimsuit_blue
|
||||
name = "Swimsuit, One Piece - Striped Blue"
|
||||
icon_state = "swimming_blue"
|
||||
|
||||
/datum/sprite_accessory/underwear/swimsuit_green
|
||||
name = "Swimsuit, Bottom - Green"
|
||||
icon_state = "panties_swimming_green"
|
||||
|
||||
/datum/sprite_accessory/underwear/swimsuit_purple
|
||||
name = "Swimsuit, Bottom - Purple"
|
||||
icon_state = "panties_swimming_purple"
|
||||
|
||||
/datum/sprite_accessory/underwear/female_thong_black
|
||||
name = "Thong - Black"
|
||||
icon_state = "thong_black"
|
||||
|
||||
/datum/sprite_accessory/underwear/female_thong
|
||||
name = "Thong - Pink"
|
||||
icon_state = "thong_pink"
|
||||
|
||||
/datum/sprite_accessory/underwear/female_babydoll
|
||||
name = "Babydoll - Black"
|
||||
icon_state = "babydoll"
|
||||
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
/datum/sprite_accessory/wings/none
|
||||
name = "None"
|
||||
icon_state = "none"
|
||||
|
||||
/datum/sprite_accessory/wings_open
|
||||
icon = 'icons/mob/wings.dmi'
|
||||
|
||||
/datum/sprite_accessory/wings_open/angel
|
||||
name = "Angel"
|
||||
icon_state = "angel"
|
||||
color_src = 0
|
||||
dimension_x = 46
|
||||
center = TRUE
|
||||
dimension_y = 34
|
||||
|
||||
/datum/sprite_accessory/wings
|
||||
icon = 'icons/mob/wings.dmi'
|
||||
|
||||
/datum/sprite_accessory/wings/angel
|
||||
name = "Angel"
|
||||
icon_state = "angel"
|
||||
color_src = 0
|
||||
dimension_x = 46
|
||||
center = TRUE
|
||||
dimension_y = 34
|
||||
locked = TRUE
|
||||
@@ -21,6 +21,7 @@
|
||||
flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH
|
||||
layer = MOB_LAYER
|
||||
max_integrity = 100
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
|
||||
var/stat = CONSCIOUS //UNCONSCIOUS is the idle state in this case
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
/mob/living/carbon/human/dummy
|
||||
real_name = "Test Dummy"
|
||||
status_flags = GODMODE|CANPUSH
|
||||
mouse_drag_pointer = MOUSE_INACTIVE_POINTER
|
||||
var/in_use = FALSE
|
||||
|
||||
INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy)
|
||||
|
||||
@@ -39,6 +39,19 @@
|
||||
restraint_check = TRUE
|
||||
emote_type = EMOTE_AUDIBLE
|
||||
|
||||
/datum/emote/living/carbon/human/mawp
|
||||
key = "mawp"
|
||||
key_third_person = "mawps"
|
||||
message = "mawps annoyingly."
|
||||
emote_type = EMOTE_AUDIBLE
|
||||
|
||||
/datum/emote/living/carbon/human/mawp/run_emote(mob/living/user, params)
|
||||
. = ..()
|
||||
if(.)
|
||||
if(ishuman(user))
|
||||
if(prob(10))
|
||||
user.adjustEarDamage(-5, -5)
|
||||
|
||||
/datum/emote/living/carbon/human/mumble
|
||||
key = "mumble"
|
||||
key_third_person = "mumbles"
|
||||
|
||||
@@ -18,6 +18,16 @@
|
||||
var/list/obscured = check_obscured_slots()
|
||||
var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE))
|
||||
|
||||
if(ishuman(src)) //user just returned, y'know, the user's own species. dumb.
|
||||
var/mob/living/carbon/human/H = src
|
||||
var/datum/species/pref_species = H.dna.species
|
||||
if(get_visible_name() == "Unknown") // same as flavor text, but hey it works.
|
||||
msg += "You can't make out what species they are.\n"
|
||||
else if(skipface)
|
||||
msg += "You can't make out what species they are.\n"
|
||||
else
|
||||
msg += "[t_He] [t_is] a [H.dna.custom_species ? H.dna.custom_species : pref_species.name]!\n"
|
||||
|
||||
//uniform
|
||||
if(w_uniform && !(SLOT_W_UNIFORM in obscured))
|
||||
//accessory
|
||||
|
||||
@@ -47,6 +47,8 @@
|
||||
|
||||
var/nameless = FALSE //For drones of both the insectoid and robotic kind. And other types of nameless critters.
|
||||
|
||||
var/custom_species = null
|
||||
|
||||
var/datum/personal_crafting/handcrafting
|
||||
var/datum/physiology/physiology
|
||||
|
||||
|
||||
@@ -1,9 +1,14 @@
|
||||
/mob/living/carbon/human/say_mod(input, message_mode)
|
||||
verb_say = dna.species.say_mod
|
||||
if(slurring)
|
||||
return "slurs"
|
||||
else
|
||||
. = ..()
|
||||
switch(slurring)
|
||||
if(10 to 25)
|
||||
return "jumbles"
|
||||
if(25 to 50)
|
||||
return "slurs"
|
||||
if(50 to INFINITY)
|
||||
return "garbles"
|
||||
else
|
||||
. = ..()
|
||||
|
||||
/mob/living/carbon/human/treat_message(message)
|
||||
message = dna.species.handle_speech(message,src)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user