//Please see the comment above the main NIF definition before
//trying to call any of these procs directly.
//A single piece of NIF software
/datum/nifsoft
var/name = "Prototype"
var/desc = "Contact a dev!"
var/obj/item/nif/nif //The NIF that the software is stored in
var/list_pos // List position in the nifsoft list
var/cost = 1000 // Cost in cash of buying this software from a terminal
var/vended = TRUE // This is available in NIFSoft Shops at the start of the game
var/wear = 1 // The wear (+/- 10% when applied) that this causes to the NIF
var/access // What access they need to buy it, can only set one for ~reasons~
var/illegal = FALSE // If this is a black-market nifsoft (emag option)
var/active = FALSE // Whether the active mode of this implant is on
var/p_drain = 0 // Passive power drain, can be used in various ways from the software
var/a_drain = 0 // Active power drain, same purpose as above, software can treat however
var/activates = TRUE // Whether or not this has an active power consumption mode
var/tick_flags = 0 // Flags to tell when we'd like to be ticked
var/empable = TRUE // If the implant can be destroyed via EMP attack
var/expiring = FALSE // Trial software! Or self-deleting illegal ones!
var/expires_at // World.time for when they expire
var/applies_to = (NIF_ORGANIC|NIF_SYNTHETIC) // Who this software is useful for
var/vision_flags = 0 // Various flags for fast lookups that are settable on the NIF
var/health_flags = 0 // These are added as soon as the implant is activated
var/combat_flags = 0 // Otherwise use set_flag/clear_flag in one of your own procs for tricks
var/other_flags = 0
var/vision_flags_mob = 0
var/darkness_view = 0
var/can_uninstall = TRUE
var/list/planes_enabled = null // List of vision planes this nifsoft enables when active
var/vision_exclusive = FALSE //Whether or not this NIFSoft provides exclusive vision modifier
var/list/incompatible_with = null // List of NIFSofts that are disabled when this one is enabled
//Constructor accepts the NIF it's being loaded into
/datum/nifsoft/New(var/obj/item/nif/nif_load)
ASSERT(nif_load)
nif = nif_load
if(!install(nif))
qdel(src)
//Destructor cleans up the software and nif reference
/datum/nifsoft/Destroy()
if(nif)
uninstall()
nif = null
return ..()
//Called when the software is installed in the NIF
/datum/nifsoft/proc/install()
if(!nif)
return
return nif.install(src)
//Called when the software is removed from the NIF
/datum/nifsoft/proc/uninstall()
if(!can_uninstall)
return nif.uninstall(src)
if(nif)
if(active)
deactivate()
. = nif.uninstall(src)
nif = null
if(!QDESTROYING(src))
qdel(src)
//Called every life() tick on a mob on active implants
/datum/nifsoft/proc/life(var/mob/living/carbon/human/human)
return TRUE
//Called when attempting to activate an implant (could be a 'pulse' activation or toggling it on)
/datum/nifsoft/proc/activate(var/force = FALSE)
if(active && !force)
return
var/nif_result = nif.activate(src)
//If the NIF was fine with it, or we're forcing it
if(nif_result || force)
active = TRUE
//If we enable vision planes
if(planes_enabled)
nif.add_plane(planes_enabled)
nif.vis_update()
//If we have other NIFsoft we need to turn off
if(incompatible_with)
nif.deactivate_these(incompatible_with)
//Set all our activation flags
nif.set_flag(vision_flags,NIF_FLAGS_VISION)
nif.set_flag(health_flags,NIF_FLAGS_HEALTH)
nif.set_flag(combat_flags,NIF_FLAGS_COMBAT)
nif.set_flag(other_flags,NIF_FLAGS_OTHER)
if(vision_exclusive)
var/mob/living/carbon/human/H = nif.human
if(H && istype(H))
H.recalculate_vis()
return nif_result
//Called when attempting to deactivate an implant
/datum/nifsoft/proc/deactivate(var/force = FALSE)
if(!active && !force)
return
var/nif_result = nif.deactivate(src)
//If the NIF was fine with it or we're forcing it
if(nif_result || force)
active = FALSE
//If we enable vision planes, disable them
if(planes_enabled)
nif.del_plane(planes_enabled)
nif.vis_update()
//Clear all our activation flags
nif.clear_flag(vision_flags,NIF_FLAGS_VISION)
nif.clear_flag(health_flags,NIF_FLAGS_HEALTH)
nif.clear_flag(combat_flags,NIF_FLAGS_COMBAT)
nif.clear_flag(other_flags,NIF_FLAGS_OTHER)
if(vision_exclusive)
var/mob/living/carbon/human/H = nif.human
if(H && istype(H))
H.recalculate_vis()
return nif_result
//Called when an implant expires
/datum/nifsoft/proc/expire()
uninstall()
return
//Called when installed from a disk
/datum/nifsoft/proc/disk_install(var/mob/living/carbon/human/target,var/mob/living/carbon/human/user)
return TRUE
//Status text for menu
/datum/nifsoft/proc/stat_text()
if(activates)
return "[active ? "Active" : "Disabled"]"
return "Always On"
//////////////////////
//A package of NIF software
/datum/nifsoft/package
var/list/software = list()
wear = 0 //Packages don't cause wear themselves, the software does
//Constructor accepts a NIF and loads all the software
/datum/nifsoft/package/New(var/obj/item/nif/nif_load)
ASSERT(nif_load)
for(var/P in software)
new P(nif_load)
qdel(src)
//Clean self up
/datum/nifsoft/package/Destroy()
software.Cut()
software = null
return ..()
/////////////////
// A NIFSoft Uploader
/obj/item/disk/nifsoft
name = "NIFSoft Uploader"
desc = "It has a small label: \n\
\"Portable NIFSoft Installation Media. \n\
Align ocular port with eye socket and depress red plunger.\""
icon = 'icons/obj/nanomods.dmi'
icon_state = "medical"
item_state = "nanomod"
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_vr.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_vr.dmi',
)
w_class = ITEMSIZE_SMALL
var/datum/nifsoft/stored_organic = null
var/datum/nifsoft/stored_synthetic = null
/obj/item/disk/nifsoft/afterattack(var/A, mob/user, flag, params)
if(!in_range(user, A))
return
if(!ishuman(user) || !ishuman(A))
return
var/mob/living/carbon/human/Ht = A
var/mob/living/carbon/human/Hu = user
if(!Ht.nif || Ht.nif.stat != NIF_WORKING)
to_chat(user,"Either they don't have a NIF, or the uploader can't connect.")
return
var/extra = extra_params()
if(A == user)
to_chat(user,"You upload [src] into your NIF.")
else
Ht.visible_message("[Hu] begins uploading [src] into [Ht]!","[Hu] is uploading [src] into you!")
icon_state = "[initial(icon_state)]-animate" //makes it play the item animation upon using on a valid target
update_icon()
if(A == user && do_after(Hu,1 SECONDS,Ht))
if(Ht.isSynthetic())
new stored_synthetic(Ht.nif,extra)
qdel(src)
else
new stored_organic(Ht.nif,extra)
qdel(src)
else if(A != user && do_after(Hu,10 SECONDS,Ht))
if(Ht.isSynthetic())
new stored_synthetic(Ht.nif,extra)
qdel(src)
else
new stored_organic(Ht.nif,extra)
qdel(src)
else
icon_state = "[initial(icon_state)]" //If it fails to apply to a valid target and doesn't get deleted, reset its icon state
update_icon()
//So disks can pass fancier stuff.
/obj/item/disk/nifsoft/proc/extra_params()
return null
// Compliance Disk //
/obj/item/disk/nifsoft/compliance
name = "NIFSoft Uploader (Compliance)"
desc = "Wow, adding laws to people? That seems illegal. It probably is. Okay, it really is."
icon_state = "compliance"
item_state = "healthanalyzer"
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand.dmi',
slot_r_hand_str = 'icons/mob/items/righthand.dmi',
)
stored_organic = /datum/nifsoft/compliance
stored_synthetic = /datum/nifsoft/compliance
var/laws
/obj/item/disk/nifsoft/compliance/afterattack(var/A, mob/user, flag, params)
if(!ishuman(A))
return
if(!laws)
to_chat(user,"You haven't set any laws yet. Use the disk in-hand first.")
return
..(A,user,flag,params)
/obj/item/disk/nifsoft/compliance/attack_self(mob/user)
var/newlaws = tgui_input_text(user, "Please Input Laws", "Compliance Laws", laws, multiline = TRUE, prevent_enter = TRUE)
newlaws = sanitize(newlaws,2048)
if(newlaws)
to_chat(user,"You set the laws to:
[newlaws]")
laws = newlaws
/obj/item/disk/nifsoft/compliance/extra_params()
return laws
// Security Disk //
/obj/item/disk/nifsoft/security
name = "NIFSoft Uploader - Security"
desc = "Contains free NIFSofts useful for security members.\n\
It has a small label: \n\
\"Portable NIFSoft Installation Media. \n\
Align ocular port with eye socket and depress red plunger.\""
icon_state = "security"
stored_organic = /datum/nifsoft/package/security
stored_synthetic = /datum/nifsoft/package/security
/datum/nifsoft/package/security
software = list(/datum/nifsoft/ar_sec,/datum/nifsoft/flashprot)
/obj/item/storage/box/nifsofts_security
name = "security nifsoft uploaders"
desc = "A box of free nifsofts for security employees."
icon = 'icons/obj/boxes.dmi'
icon_state = "nifsoft_kit_sec"
/obj/item/storage/box/nifsofts_security/New()
..()
for(var/i = 0 to 7)
new /obj/item/disk/nifsoft/security(src)
// Engineering Disk //
/obj/item/disk/nifsoft/engineering
name = "NIFSoft Uploader - Engineering"
desc = "Contains free NIFSofts useful for engineering members.\n\
It has a small label: \n\
\"Portable NIFSoft Installation Media. \n\
Align ocular port with eye socket and depress red plunger.\""
icon_state = "engineering"
stored_organic = /datum/nifsoft/package/engineering
stored_synthetic = /datum/nifsoft/package/engineering
/datum/nifsoft/package/engineering
software = list(/datum/nifsoft/ar_eng,/datum/nifsoft/alarmmonitor,/datum/nifsoft/uvblocker)
/obj/item/storage/box/nifsofts_engineering
name = "engineering nifsoft uploaders"
desc = "A box of free nifsofts for engineering employees."
icon = 'icons/obj/boxes.dmi'
icon_state = "nifsoft_kit_eng"
/obj/item/storage/box/nifsofts_engineering/New()
..()
for(var/i = 0 to 7)
new /obj/item/disk/nifsoft/engineering(src)
// Medical Disk //
/obj/item/disk/nifsoft/medical
name = "NIFSoft Uploader - Medical"
desc = "Contains free NIFSofts useful for medical members.\n\
It has a small label: \n\
\"Portable NIFSoft Installation Media. \n\
Align ocular port with eye socket and depress red plunger.\""
stored_organic = /datum/nifsoft/package/medical
stored_synthetic = /datum/nifsoft/package/medical
/datum/nifsoft/package/medical
software = list(/datum/nifsoft/ar_med,/datum/nifsoft/crewmonitor)
/obj/item/storage/box/nifsofts_medical
name = "medical nifsoft uploaders"
desc = "A box of free nifsofts for medical employees."
icon = 'icons/obj/boxes.dmi'
icon_state = "nifsoft_kit_med"
/obj/item/storage/box/nifsofts_medical/New()
..()
for(var/i = 0 to 7)
new /obj/item/disk/nifsoft/medical(src)
// Mining Disk //
/obj/item/disk/nifsoft/mining
name = "NIFSoft Uploader - Mining"
desc = "Contains free NIFSofts useful for mining members.\n\
It has a small label: \n\
\"Portable NIFSoft Installation Media. \n\
Align ocular port with eye socket and depress red plunger.\""
icon_state = "mining"
stored_organic = /datum/nifsoft/package/mining
stored_synthetic = /datum/nifsoft/package/mining_synth
/datum/nifsoft/package/mining
software = list(/datum/nifsoft/material,/datum/nifsoft/spare_breath)
/datum/nifsoft/package/mining_synth
software = list(/datum/nifsoft/material,/datum/nifsoft/pressure,/datum/nifsoft/heatsinks)
/obj/item/storage/box/nifsofts_mining
name = "mining nifsoft uploaders"
desc = "A box of free nifsofts for mining employees."
icon = 'icons/obj/boxes.dmi'
icon_state = "nifsoft_kit_mining"
/obj/item/storage/box/nifsofts_mining/New()
..()
for(var/i = 0 to 7)
new /obj/item/disk/nifsoft/mining(src)
// Mass Alteration Disk //
/obj/item/disk/nifsoft/sizechange
name = "NIFSoft Uploader - Mass Alteration"
desc = "Contains free NIFSofts for special purposes.\n\
It has a small label: \n\
\"Portable NIFSoft Installation Media. \n\
Align ocular port with eye socket and depress red plunger.\""
icon_state = "mining"
stored_organic = /datum/nifsoft/sizechange
stored_synthetic = /datum/nifsoft/sizechange
/obj/item/storage/box/nifsofts_sizechange
name = "mass alteration nifsoft uploaders"
desc = "A box of free nifsofts for special purposes."
icon = 'icons/obj/boxes.dmi'
icon_state = "nifsoft_kit_mining"
/obj/item/storage/box/nifsofts_sizechange/New()
..()
for(var/i = 0 to 7)
new /obj/item/disk/nifsoft/sizechange(src)