feat: new floppy disk sprites; most disks are now under the /item/disk type; adds disk stacking, uqinue styling and wrapping (#94112)

## About The Pull Request

Floppy disks received a sprite upgrade, as well as unique wraps:

<img width="364" height="150" alt="image"
src="https://github.com/user-attachments/assets/0ac433e3-7432-4c06-bec2-aeae00b6852f"
/>

<img width="786" height="527" alt="image"
src="https://github.com/user-attachments/assets/0f36bd0d-0362-4431-8131-49060a2fe348"
/>

You can now stack floppy disks! They also scatter around when thrown.
The video also showcases new styling options with a selection of
stickers! You can also write something on the disk instead of selecting
an icon:


https://github.com/user-attachments/assets/ff0a8542-9d79-4108-ae46-672ca5d620a2

MOST disks now inherit the `/item/disk` type to properly stack and do...
stuff. An updatepaths script included.

## Why It's Good For The Game

Old school is cool. Stacking disks makes them feel more authentic, while
styling allows for more crearivity!

## Changelog

🆑
add: New unique wraps for floppy disks
qol: Floppy disks can now be stacked
image: New sprites and stickers for floppy disks
map: Added and ran an updatepaths script
refactor: Most disks are now under the base disk item type
/🆑

---------

Co-authored-by: The-Tyrant <tyrantofgaming@gmail.com>
This commit is contained in:
mcbalaam
2026-01-04 08:52:18 +13:00
committed by GitHub
co-authored by The-Tyrant
parent d16ac25c1b
commit 3799968eb3
81 changed files with 694 additions and 342 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
/obj/item/bitrunning_debug
name = "bitrunning debug item"
desc = "Adds points and reduces cooldown time for debugging"
icon = 'icons/obj/devices/circuitry_n_data.dmi'
icon = 'icons/obj/devices/floppy_disks.dmi'
base_icon_state = "datadisk"
icon_state = "datadisk0"
+24 -24
View File
@@ -4,16 +4,17 @@
* You can make the custom cheese spells you've always wanted.
* Just make it fun and engaging, it's PvE content.
*/
/obj/item/bitrunning_disk
/obj/item/disk/bitrunning
name = "generic bitrunning program"
desc = "A disk containing source code."
icon = 'icons/obj/devices/circuitry_n_data.dmi'
base_icon_state = "datadisk"
icon_state = "datadisk0"
sticker_icon_state = "o_code"
reskin_allowed = FALSE
/// Name of the choice made
var/choice_made
/obj/item/bitrunning_disk/Initialize(mapload)
/obj/item/disk/bitrunning/Initialize(mapload)
. = ..()
icon_state = "[base_icon_state][rand(0, 7)]"
@@ -23,7 +24,7 @@
load_callback = CALLBACK(src, PROC_REF(load_onto_avatar)), \
)
/obj/item/bitrunning_disk/examine(mob/user)
/obj/item/disk/bitrunning/examine(mob/user)
. = ..()
. += span_infoplain("This disk must be carried on your person into a netpod to be used.")
@@ -35,18 +36,17 @@
. += span_notice("It cannot make another selection.")
/// Handles loading our stuff onto avatars
/obj/item/bitrunning_disk/proc/load_onto_avatar(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, domain_flags)
/obj/item/disk/bitrunning/proc/load_onto_avatar(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, domain_flags)
return NONE
/obj/item/bitrunning_disk/ability
/obj/item/disk/bitrunning/ability
desc = "A disk containing source code. It can be used to preload abilities into the virtual domain. Duplicate abilities will be ignored."
/// The selected ability that this grants
var/datum/action/granted_action
/// The list of actions that this can grant
var/list/datum/action/selectable_actions = list()
/obj/item/bitrunning_disk/ability/load_onto_avatar(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, domain_flags)
/obj/item/disk/bitrunning/ability/load_onto_avatar(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, domain_flags)
if(domain_flags & DOMAIN_FORBIDS_ABILITIES)
return BITRUNNER_GEAR_LOAD_BLOCKED
@@ -60,8 +60,8 @@
our_action.Grant(avatar)
return NONE
/obj/item/bitrunning_disk/ability/attack_self(mob/user, modifiers)
. = ..()
/obj/item/disk/bitrunning/ability/attack_self(mob/user, modifiers)
// Not calling parent to not flip the protection tab
if(choice_made)
return
@@ -86,7 +86,7 @@
choice_made = choice
/// Tier 1 programs. Simple, funny, or helpful.
/obj/item/bitrunning_disk/ability/tier1
/obj/item/disk/bitrunning/ability/tier1
name = "bitrunning program: basic"
selectable_actions = list(
/datum/action/cooldown/spell/conjure/cheese,
@@ -94,7 +94,7 @@
)
/// Tier 2 programs. More complex, powerful, or useful.
/obj/item/bitrunning_disk/ability/tier2
/obj/item/disk/bitrunning/ability/tier2
name = "bitrunning program: complex"
selectable_actions = list(
/datum/action/cooldown/spell/pointed/projectile/fireball,
@@ -103,7 +103,7 @@
)
/// Tier 3 abilities. Very powerful, game breaking.
/obj/item/bitrunning_disk/ability/tier3
/obj/item/disk/bitrunning/ability/tier3
name = "bitrunning program: elite"
selectable_actions = list(
/datum/action/cooldown/spell/shapeshift/dragon,
@@ -111,14 +111,14 @@
)
/obj/item/bitrunning_disk/item
/obj/item/disk/bitrunning/item
desc = "A disk containing source code. It can be used to preload items into the virtual domain."
/// The selected item that this grants
var/obj/granted_item
/// The list of actions that this can grant
var/list/obj/selectable_items = list()
/obj/item/bitrunning_disk/item/load_onto_avatar(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, domain_flags)
/obj/item/disk/bitrunning/item/load_onto_avatar(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, domain_flags)
if(domain_flags & DOMAIN_FORBIDS_ITEMS)
return BITRUNNER_GEAR_LOAD_BLOCKED
@@ -128,7 +128,7 @@
avatar.put_in_hands(new granted_item())
return NONE
/obj/item/bitrunning_disk/item/attack_self(mob/user, modifiers)
/obj/item/disk/bitrunning/item/attack_self(mob/user, modifiers)
. = ..()
if(choice_made)
@@ -151,7 +151,7 @@
choice_made = choice
/// Tier 1 items. Simple, funny, or helpful.
/obj/item/bitrunning_disk/item/tier1
/obj/item/disk/bitrunning/item/tier1
name = "bitrunning gear: simple"
selectable_items = list(
/obj/item/pizzabox/infinite,
@@ -160,7 +160,7 @@
)
/// Tier 2 items. More complex, powerful, or useful.
/obj/item/bitrunning_disk/item/tier2
/obj/item/disk/bitrunning/item/tier2
name = "bitrunning gear: complex"
selectable_items = list(
/obj/item/reagent_containers/hypospray/medipen/survival/luxury,
@@ -169,7 +169,7 @@
)
/// Tier 3 items. Very powerful, game breaking.
/obj/item/bitrunning_disk/item/tier3
/obj/item/disk/bitrunning/item/tier3
name = "bitrunning gear: advanced"
selectable_items = list(
/obj/item/gun/energy/e_gun/nuclear,
@@ -178,7 +178,7 @@
)
///proto-kinetic accelerator mods, to be applied to pka's given inside domains
/obj/item/bitrunning_disk/item/pka_mods
/obj/item/disk/bitrunning/item/pka_mods
name = "bitrunning gear: proto-kinetic accelerator mods"
selectable_items = list(
/obj/item/borg/upgrade/modkit/range,
@@ -188,7 +188,7 @@
/obj/item/borg/upgrade/modkit/human_passthrough,
)
/obj/item/bitrunning_disk/item/pka_mods/premium
/obj/item/disk/bitrunning/item/pka_mods/premium
name = "bitrunning gear: premium proto-kinetic accelerator mods"
selectable_items = list(
/obj/item/borg/upgrade/modkit/cooldown/repeater,
@@ -199,7 +199,7 @@
)
///proto-kinetic crusher trophies, to be applied to pkc's given inside domains
/obj/item/bitrunning_disk/item/pkc_mods
/obj/item/disk/bitrunning/item/pkc_mods
name = "bitrunning gear: proto-kinetic crusher mods"
selectable_items = list(
/obj/item/crusher_trophy/watcher_wing,
@@ -208,7 +208,7 @@
/obj/item/crusher_trophy/wolf_ear,
)
/obj/item/bitrunning_disk/item/pkc_mods/premium
/obj/item/disk/bitrunning/item/pkc_mods/premium
name = "bitrunning gear: premium proto-kinetic crusher mods"
selectable_items = list(
/obj/item/crusher_trophy/watcher_wing/ice_wing,
@@ -220,7 +220,7 @@
/obj/item/crusher_trophy/ice_demon_cube,
)
/obj/item/bitrunning_disk/item/mini_uzi
/obj/item/disk/bitrunning/item/mini_uzi
name = "bitrunning gear: mini-uzi"
selectable_items = list(
/obj/item/gun/ballistic/automatic/mini_uzi,
@@ -2,23 +2,23 @@
/**
* Bitrunning tech disks which let you load full loadouts into the vdom on first avatar generation.
*/
/obj/item/bitrunning_disk/gimmick
/obj/item/disk/bitrunning/gimmick
desc = "A disk containing source code. It can be used to preload gimmick loadouts into the virtual domain."
/// The selected loadout that this grants
var/datum/bitrunning_gimmick/granted_loadout
/// The list of loadouts that this can grant
var/list/datum/bitrunning_gimmick/selectable_loadouts
/obj/item/bitrunning_disk/gimmick/Destroy()
/obj/item/disk/bitrunning/gimmick/Destroy()
QDEL_NULL(granted_loadout)
return ..()
/obj/item/bitrunning_disk/gimmick/load_onto_avatar(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, domain_flags)
/obj/item/disk/bitrunning/gimmick/load_onto_avatar(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, domain_flags)
if(isnull(granted_loadout))
return BITRUNNER_GEAR_LOAD_FAILED
return granted_loadout.grant_loadout(neo, avatar, domain_flags)
/obj/item/bitrunning_disk/gimmick/attack_self(mob/user, modifiers)
/obj/item/disk/bitrunning/gimmick/attack_self(mob/user, modifiers)
. = ..()
if(granted_loadout)
@@ -3,7 +3,7 @@
* Bitrunning gimmick loadouts themed around dungeon crawling.
* Mostly for fun, have niche but not insignificant advantages.
*/
/obj/item/bitrunning_disk/gimmick/dungeon
/obj/item/disk/bitrunning/gimmick/dungeon
name = "bitrunning gimmick: dungeon crawling"
selectable_loadouts = list(
/datum/bitrunning_gimmick/alchemist,
@@ -3,7 +3,7 @@
* Bitrunning gimmick loadouts themed around sports.
* Mostly for fun, have niche or little advantages.
*/
/obj/item/bitrunning_disk/gimmick/sports
/obj/item/disk/bitrunning/gimmick/sports
name = "bitrunning gimmick: sports"
selectable_loadouts = list(
/datum/bitrunning_gimmick/boxer,