SYSuit basic

This commit is contained in:
Dahlular
2021-11-04 14:42:20 -06:00
parent 16f829f1aa
commit 3606fd6724
6 changed files with 341 additions and 0 deletions
+61
View File
@@ -0,0 +1,61 @@
//Condensed location for abilities of the SYSuit
//Lord forgive me because I'm mostly referencing the ninja suit, and it's kind of messy.
/obj/item/clothing/suit/toggle/sysuit/proc/lock_suit(mob/living/carbon/human/H)
//there is certainly a better way to do this, but again, referencing ninja code for now
//First we make the checks for correct clothing being present
if(!istype(H))
return FALSE
if(!istype(H.head, /obj/item/clothing/head/sycap))
to_chat(H, "<span class='userdanger'>ERROR</span>: 100113 UNABLE TO LOCATE HEAD GEAR\nABORTING...")
return FALSE
if(!istype(H.glasses, /obj/item/clothing/glasses/hud/toggle/syvisor))
to_chat(H, "<span class='userdanger'>ERROR</span>: 90211 UNABLE TO LOCATE EYE GEAR\nABORTING...")
return FALSE
if(!istype(H.shoes, /obj/item/clothing/shoes/syshoes))
to_chat(H, "<span class='userdanger'>ERROR</span>: 122011 UNABLE TO LOCATE FOOT GEAR\nABORTING...")
return FALSE
if(!istype(H.gloves, /obj/item/clothing/gloves/sygloves))
to_chat(H, "<span class='userdanger'>ERROR</span>: 110223 UNABLE TO LOCATE HAND GEAR\nABORTING...")
return FALSE
if(!istype(H.w_uniform, /obj/item/clothing/under/syclothing))
to_chat(H, "<span class='userdanger'>ERROR</span>: 140021 UNABLE TO LOCATE BASE GEAR\nABORTING...")
return FALSE
//Now we prevent them from being removed
affecting = H
ADD_TRAIT(src, TRAIT_NODROP, SYTECH_SUIT_TRAIT) //apply to the suit itself
sy_cap = H.head
ADD_TRAIT(sy_cap, TRAIT_NODROP, SYTECH_SUIT_TRAIT)
sy_visor = H.glasses
ADD_TRAIT(sy_visor, TRAIT_NODROP, SYTECH_SUIT_TRAIT)
sy_shoes = H.shoes
ADD_TRAIT(sy_shoes, TRAIT_NODROP, SYTECH_SUIT_TRAIT)
sy_gloves = H.gloves
ADD_TRAIT(sy_gloves, TRAIT_NODROP, SYTECH_SUIT_TRAIT)
sy_clothing = H.w_uniform
ADD_TRAIT(sy_clothing, TRAIT_NODROP, SYTECH_SUIT_TRAIT)
return TRUE
//this hurts my eyes to look at
/obj/item/clothing/suit/toggle/sysuit/proc/unlock_suit()
affecting = null
REMOVE_TRAIT(src, TRAIT_NODROP, SYTECH_SUIT_TRAIT)
if(sy_cap)
REMOVE_TRAIT(sy_cap, TRAIT_NODROP, SYTECH_SUIT_TRAIT)
if(sy_visor)
REMOVE_TRAIT(sy_visor, TRAIT_NODROP, SYTECH_SUIT_TRAIT)
if(sy_shoes)
REMOVE_TRAIT(sy_shoes, TRAIT_NODROP, SYTECH_SUIT_TRAIT)
if(sy_gloves)
REMOVE_TRAIT(sy_gloves, TRAIT_NODROP, SYTECH_SUIT_TRAIT)
if(sy_clothing)
REMOVE_TRAIT(sy_clothing, TRAIT_NODROP, SYTECH_SUIT_TRAIT)
/obj/item/clothing/suit/toggle/sysuit/ui_action_click(mob/user, action)
if(istype(action, /datum/action/item_action/initialize_sysuit))
toggle_on_off()
return TRUE
if(!s_initialized)
to_chat(user, "<span class='warning'><b>ERROR</b>: suit offline. Please activate suit.</span>")
return FALSE
+183
View File
@@ -0,0 +1,183 @@
//This is the SYSuit, effectively a way for micros to dominate larger partners. Adminbus only right now, but will soon be purchasable via cargo with a preference to opt into, to prevent abuse.
//It will also have a charge function in the future and further balance passing.
//SYTech, pronounced as Sigh Tech; like what am I doing with my life?
//TO DO: make things a little more optimized and put everything under it's own "SY" obj, so we can get rid of some redundancy
//The suit itself
/obj/item/clothing/under/syclothing
name = "SYTech Nanoweave suit"
desc = "A leading-grade suit developed by SYTech, with an internal dampening field to lessen accidents at micro scales. This one seems to be more skimpy and developed for bedroom-play, though."
icon = 'hyperstation/icons/obj/clothing/uniforms.dmi'
icon_state = "sysuit"
item_state = "sysuit"
alternate_worn_icon = 'hyperstation/icons/mobs/uniforms.dmi'
armor = list("melee" = 90, "bullet" = 25, "laser" = 5, "energy" = 15, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 90)
//The overcoat
/obj/item/clothing/suit/toggle/sysuit
name = "SYTech Nanoweave overcoat"
desc = "An overcoat complimenting a SYTech suit. Can be worn in different ways, but is required for the function of the Nanoweave tech. This one is incredibly revealing, oddly enough."
icon = 'hyperstation/icons/obj/clothing/suits.dmi'
icon_state = "sysuit"
item_state = "sysuit"
alternate_worn_icon = 'hyperstation/icons/mobs/suits.dmi'
togglename = "toggle"
body_parts_covered = CHEST|ARMS|LEGS
cold_protection = CHEST|GROIN|LEGS|ARMS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
strip_delay = 70
equip_delay_other = 40
max_integrity = 250
resistance_flags = FLAMMABLE
armor = list("melee" = 90, "bullet" = 25, "laser" = 5, "energy" = 15, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 90)
actions_types = list(/datum/action/item_action/initialize_sysuit)
//var/obj/whateverkinkyitemiputhere
//The whole getup needs to be worn! Variables referenced for later
var/obj/item/clothing/under/syclothing/sy_clothing
var/obj/item/clothing/head/sycap/sy_cap
var/obj/item/clothing/glasses/hud/toggle/syvisor/sy_visor
var/obj/item/clothing/shoes/syshoes/sy_shoes
var/obj/item/clothing/gloves/sygloves/sy_gloves
var/s_initialized = 0 //Suit starts off
var/s_coold = 0 //If the suit is on cooldown. Can be used to attach different cooldowns to abilities. Ticks down every second based on suit ntick().
var/s_delay = 40//How fast the suit does certain things, lower is faster. Can be overridden in specific procs. Also determines adverse probability.
var/s_busy = FALSE
var/mob/living/carbon/affecting //???? i hate byond
/obj/item/clothing/suit/toggle/sysuit/examine(mob/user)
. = ..()
if(s_initialized && user == affecting)
. += "All systems operational. Currently online and functioning." //Add more data to this later
//The cap
/obj/item/clothing/head/sycap
name = "SYTech Nanoweave cap"
desc = "A piece of clothing for a SYTech suit, allowing for extended control and breathability at micro scales via amplified hardlight respiration. This one seems to be modeled like a dominatrix cap, however."
icon = 'hyperstation/icons/obj/clothing/head.dmi'
icon_state = "syhat"
item_state = "syhat"
alternate_worn_icon = 'hyperstation/icons/mobs/head.dmi'
armor = list("melee" = 90, "bullet" = 25, "laser" = 5, "energy" = 15, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 90)
cold_protection = HEAD
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
strip_delay = 60
resistance_flags = FLAMMABLE
var/cloaked = 0
/obj/item/clothing/head/sycap/dropped()
src.icon_state = "syhat"
src.cloaked=0
..()
/obj/item/clothing/head/sycap/verb/cloakcap()
set category = "Object"
set name = "Cloak hat"
cloak(usr)
/obj/item/clothing/head/sycap/AltClick(mob/user)
. = ..()
if(!user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
cloak(user)
return TRUE
/obj/item/clothing/head/sycap/proc/cloak(mob/user)
if(!user.incapacitated())
src.cloaked = !src.cloaked
if(src.cloaked)
icon_state = "syhat_active"
to_chat(user, "<span class='notice'>You toggle the hat\'s cloaking.</span>")
else
icon_state = "syhat"
to_chat(user, "<span class='notice'>You reveal the hat again.</span>")
usr.update_inv_head() //so our mob-overlays update
/obj/item/clothing/head/sycap/examine(mob/user)
. = ..()
. += "<span class='notice'>Alt-click the hat to toggle it\'s cloaking [cloaked ? "off" : "on"].</span>"
//The visor
/obj/item/clothing/glasses/hud/toggle/syvisor
name = "SYTech Analysis Visor"
desc = "A high-tech visor developed for SYTech suits, for helping internal processes lead augment decisions. This one looks like a pair of darkened sunglasses."
icon = 'hyperstation/icons/obj/clothing/glasses.dmi'
icon_state = "syvisor"
item_state = "trayson-meson"
flash_protect = 1
tint = 1
flags_cover = GLASSESCOVERSEYES
visor_flags_cover = GLASSESCOVERSEYES
alternate_worn_icon = 'hyperstation/icons/mobs/eyes.dmi'
hud_type = DATA_HUD_DIAGNOSTIC_ADVANCED
actions_types = list(/datum/action/item_action/switch_hud)
glass_colour_type = /datum/client_colour/glass_colour/lightyellow
//effectively the same thing as a Zao HUD, but required for SYTech to work. More or less for flavor.
/obj/item/clothing/glasses/hud/toggle/syvisor/attack_self(mob/user)
if(!ishuman(user))
return
var/mob/living/carbon/human/wearer = user
if (wearer.glasses != src)
return
if (hud_type)
var/datum/atom_hud/H = GLOB.huds[hud_type]
H.remove_hud_from(user)
if (hud_type == DATA_HUD_DIAGNOSTIC_ADVANCED)
icon_state = "syvisor_off"
item_state = "syvisor_off"
hud_type = null
flash_protect = 0
tint = 0
change_glass_color(user, /datum/client_colour/glass_colour/white)
else
hud_type = DATA_HUD_DIAGNOSTIC_ADVANCED
icon_state = "syvisor"
item_state = "syvisor"
flash_protect = 1
tint = 1
change_glass_color(user, /datum/client_colour/glass_colour/lightyellow)
if (hud_type)
var/datum/atom_hud/H = GLOB.huds[hud_type]
H.add_hud_to(user)
user.update_inv_glasses()
//Shoes
/obj/item/clothing/shoes/syshoes
name = "SYTech Nanoweave platform heels"
desc = "A complimentary piece of SYTech apparel for gravity-altering applications. It even allows you to walk up walls! This pair takes on the appearance of skimpy, thigh-high latex boots with stilletos."
icon_state = "sysuit"
item_state = "sysuit"
icon = 'hyperstation/icons/obj/clothing/shoes.dmi'
alternate_worn_icon = 'hyperstation/icons/mobs/feet.dmi'
/obj/item/clothing/shoes/sy_shoes/Initialize()
. = ..()
AddComponent(/datum/component/squeak, list('sound/effects/footstep/highheel1.ogg' = 1,'sound/effects/footstep/highheel2.ogg' = 1), 20)
//Gloves
/obj/item/clothing/gloves/sygloves
name = "SYTech Nanoweave sleeves"
desc = "A pair of enhanced sleeves, developed by SYTech. These allow remote and psionic levels of manipulation to the electrical currents inside living beings, or objects. Use with caution!"
icon_state = "sysuit"
item_state = "sysuit"
icon = 'hyperstation/icons/obj/clothing/gloves.dmi'
alternate_worn_icon = 'hyperstation/icons/mobs/gloves.dmi'
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
strip_delay = 120
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
@@ -0,0 +1,89 @@
/obj/item/clothing/suit/toggle/sysuit/proc/toggle_on_off()
if(s_busy)
to_chat(loc, "<span class='userdanger'>ERROR</span>: You cannot use this function at this time.")
return FALSE
if(s_initialized)
deinitialize()
else
ninitialize()
. = TRUE
/obj/item/clothing/suit/toggle/sysuit/proc/ninitialize(delay = s_delay, mob/living/carbon/human/U = loc)
if(!U.mind)
return //Not sure how this could happen.
s_busy = TRUE
to_chat(U, "<span class='notice'>Now initializing...</span>")
addtimer(CALLBACK(src, .proc/ninitialize_two, delay, U), delay)
/obj/item/clothing/suit/toggle/sysuit/proc/ninitialize_two(delay, mob/living/carbon/human/U)
if(!lock_suit(U))//To lock the suit onto wearer.
s_busy = FALSE
return
to_chat(U, "<span class='notice'>Analyzing body composition and data...\nSecuring external locking mechanism...</span>")
addtimer(CALLBACK(src, .proc/ninitialize_three, delay, U), delay)
/obj/item/clothing/suit/toggle/sysuit/proc/ninitialize_three(delay, mob/living/carbon/human/U)
to_chat(U, "<span class='notice'>Preparing for psionic link...\nNow monitoring brain activity...</span>")
addtimer(CALLBACK(src, .proc/ninitialize_four, delay, U), delay)
/obj/item/clothing/suit/toggle/sysuit/proc/ninitialize_four(delay, mob/living/carbon/human/U)
if(U.stat == DEAD|| U.health <= 0)
to_chat(U, "<span class='danger'><B>FĆAL �Rr�R</B>: 344--93#�&&21 BR��N |/|/aV� PATT$RN <B>RED</B>\nA-A-aB�rT�NG...</span>")
unlock_suit()
s_busy = FALSE
return
to_chat(U, "<span class='notice'>Psionic link processing...\nPattern</span>\green <B>GREEN</B><span class='notice'>, continuing operation.</span>")
addtimer(CALLBACK(src, .proc/ninitialize_five, delay, U), delay)
/obj/item/clothing/suit/toggle/sysuit/proc/ninitialize_five(delay, mob/living/carbon/human/U)
to_chat(U, "<span class='notice'>PHASE-shift device status: <B>ONLINE</B>.\nInertial dampeners: <B>ONLINE</B>.</span>")
addtimer(CALLBACK(src, .proc/ninitialize_six, delay, U), delay)
/obj/item/clothing/suit/toggle/sysuit/proc/ninitialize_six(delay, mob/living/carbon/human/U)
to_chat(U, "<span class='notice'>Primary system status: <B>ONLINE</B>.\nBackup system status: <B>ONLINE</B>.\nDownscaling for application...</span>")
do_sparks(5, FALSE, U.loc)
addtimer(CALLBACK(src, .proc/ninitialize_seven, delay, U), delay)
/obj/item/clothing/suit/toggle/sysuit/proc/ninitialize_seven(delay, mob/living/carbon/human/U)
to_chat(U, "<span class='notice'>All systems operational. Welcome to <B>SYTech OS</B>, [U.real_name].</span>")
s_initialized = TRUE
s_busy = FALSE
U.size_multiplier = 0.25
/obj/item/clothing/suit/toggle/sysuit/proc/deinitialize(delay = s_delay)
if(affecting==loc)
var/mob/living/carbon/human/U = affecting
if(alert("Are you certain you wish to remove the suit? This will take time and remove all abilities, as well as keep you small!",,"Yes","No")=="No")
return
s_busy = TRUE
addtimer(CALLBACK(src, .proc/deinitialize_two, delay, U), delay)
/obj/item/clothing/suit/toggle/sysuit/proc/deinitialize_two(delay, mob/living/carbon/human/U)
to_chat(U, "<span class='notice'>Now de-initializing...</span>")
addtimer(CALLBACK(src, .proc/deinitialize_three, delay, U), delay)
/obj/item/clothing/suit/toggle/sysuit/proc/deinitialize_three(delay, mob/living/carbon/human/U)
to_chat(U, "<span class='notice'>Logging off, [U.real_name]. Shutting down <B>SYTech OS</B>.</span>")
addtimer(CALLBACK(src, .proc/deinitialize_four, delay, U), delay)
/obj/item/clothing/suit/toggle/sysuit/proc/deinitialize_four(delay, mob/living/carbon/human/U)
to_chat(U, "<span class='notice'>Primary system status: <B>OFFLINE</B>.\nBackup system status: <B>OFFLINE</B>.</span>")
addtimer(CALLBACK(src, .proc/deinitialize_five, delay, U), delay)
/obj/item/clothing/suit/toggle/sysuit/proc/deinitialize_five(delay, mob/living/carbon/human/U)
to_chat(U, "<span class='notice'>PHASE-shift device status: <B>OFFLINE</B>.\nInertial dampeners: <B>OFFLINE</B>.</span>")
addtimer(CALLBACK(src, .proc/deinitialize_six, delay, U), delay)
/obj/item/clothing/suit/toggle/sysuit/proc/deinitialize_six(delay, mob/living/carbon/human/U)
to_chat(U, "<span class='notice'>Disconnecting psionic-link...</span>\green<B>Success</B><span class='notice'>.</span>")
addtimer(CALLBACK(src, .proc/deinitialize_seven, delay, U), delay)
/obj/item/clothing/suit/toggle/sysuit/proc/deinitialize_seven(delay, mob/living/carbon/human/U)
to_chat(U, "<span class='notice'>Disengaging body analysis and brain-monitoring...</span>\green<B>Success</B><span class='notice'>.</span>")
addtimer(CALLBACK(src, .proc/deinitialize_eight, delay, U), delay)
/obj/item/clothing/suit/toggle/sysuit/proc/deinitialize_eight(delay, mob/living/carbon/human/U)
to_chat(U, "<span class='notice'>Unsecuring external locking mechanism...\nTechnology engram secured.\nOperation status: <B>FINISHED</B>.</span>")
unlock_suit()
s_initialized = FALSE
s_busy = FALSE