mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-05-17 20:30:46 +01:00
d5849910e5
* Begin clickcode attack_self fix Begins the work to make everything call back to parent for attack_self so that signals are sacred. * Makes MORE things call the attack_self() parent Yes, I could make special_handling a var on obj/item HOWEVER i want it to be specific so it can be tracked down later and ONLY the objects that use it can be refactored instead of sitting there literally forever and it just becoming 'a thing'. * Finishes making the rest of attack_self call parent. As mentioned, things such as 'specialty_goggles' 'special_handling' and the such are only there to help with attack_self until the attack_self is recoded for those items. * begone foul demon * some more cleanup * These * GOD this was annoying * yeh * Fix this * fLARES * Thesee too * toys! * Even more! * More fixes * Even more * rest of em * these too * Update syndie.dm * hardref clear * Update code/game/gamemodes/nuclear/pinpointer.dm * Update code/game/objects/effects/mines.dm * Update code/game/objects/items/blueprints_vr.dm * Update code/game/objects/items/blueprints_vr.dm * Update code/game/objects/items/contraband_vr.dm * Update code/game/objects/items/crayons.dm * Update code/game/objects/items/crayons.dm * Update code/game/objects/items/gunbox.dm * Update code/game/objects/items/gunbox.dm * Update code/game/objects/items/gunbox_vr.dm * Update code/game/objects/items/gunbox_vr.dm * Update code/game/objects/items/weapons/gift_wrappaper.dm * Update code/game/objects/items/crayons.dm * Update code/game/objects/items/crayons.dm * Update code/game/objects/items/gunbox.dm * these too * Update maintpanel_stack.dm * angry warning * Fixes packaged snacks. Fixes improper var default. * Special handling for these * proper poly types * Fixes magclaws Makes the 'features' it had just part of base magboots that can be adjusted via varswap. * Fixes jackets Fixes https://github.com/VOREStation/VOREStation/issues/18941 * Small bugfix Makes p_Theyre properly capitialize Makes examine show proper wording * Update gift_wrappaper.dm
438 lines
13 KiB
Plaintext
438 lines
13 KiB
Plaintext
//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,span_warning("Either they don't have a NIF, or the uploader can't connect."))
|
|
return
|
|
|
|
var/extra = extra_params()
|
|
if(A == user)
|
|
to_chat(user,span_notice("You upload [src] into your NIF."))
|
|
else
|
|
Ht.visible_message(span_warning("[Hu] begins uploading [src] into [Ht]!"),span_danger("[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, target = 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, target = 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,span_warning("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)
|
|
. = ..(user)
|
|
if(.)
|
|
return TRUE
|
|
var/newlaws = tgui_input_text(user, "Please Input Laws", "Compliance Laws", laws, 2048, TRUE, prevent_enter = TRUE)
|
|
if(newlaws)
|
|
to_chat(user,span_filter_notice("You set the laws to: <br>" + span_notice("[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/Initialize(mapload)
|
|
. = ..()
|
|
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/Initialize(mapload)
|
|
. = ..()
|
|
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/Initialize(mapload)
|
|
. = ..()
|
|
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/Initialize(mapload)
|
|
. = ..()
|
|
for(var/i = 0 to 7)
|
|
new /obj/item/disk/nifsoft/mining(src)
|
|
|
|
// Pilot Disk //
|
|
/obj/item/disk/nifsoft/pilot
|
|
name = "NIFSoft Uploader - Pilot"
|
|
desc = "Contains free NIFSofts useful for pilot members.\n\
|
|
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_vr.dmi'
|
|
icon_state = "pilot"
|
|
stored_organic = /datum/nifsoft/package/pilot
|
|
stored_synthetic = /datum/nifsoft/package/pilot_synth
|
|
|
|
/datum/nifsoft/package/pilot
|
|
software = list(/datum/nifsoft/spare_breath)
|
|
|
|
/datum/nifsoft/package/pilot_synth
|
|
software = list(/datum/nifsoft/pressure,/datum/nifsoft/heatsinks)
|
|
|
|
/obj/item/storage/box/nifsofts_pilot
|
|
name = "pilot nifsoft uploaders"
|
|
desc = "A box of free nifsofts for pilot employees."
|
|
icon = 'icons/obj/boxes_vr.dmi'
|
|
icon_state = "nifsoft_kit_pilot"
|
|
|
|
/obj/item/storage/box/nifsofts_pilot/Initialize(mapload)
|
|
. = ..()
|
|
for(var/i = 0 to 7)
|
|
new /obj/item/disk/nifsoft/pilot(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/Initialize(mapload)
|
|
. = ..()
|
|
for(var/i = 0 to 7)
|
|
new /obj/item/disk/nifsoft/sizechange(src)
|