From eacf5cf7c19eeeaffba98884228023397f67fb02 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Mon, 19 Feb 2024 19:12:25 -0500 Subject: [PATCH] Kapuconomy Part 2 of X (#802) * wallets and cash * atm progress * remove civilian bounties * remove holochips * die holochips die * atm stuff * dead people dont get money * no more PDA imprinting * map in ATMs * fix outfit equip * atm layer * clean up wallet impl --- _maps/RandomRuins/SpaceRuins/oldAIsat.dmm | 9 +- _maps/map_files/Theseus/Theseus.dmm | 293 +++++++------- _maps/map_files/generic/CentCom.dmm | 78 ++-- _maps/shuttles/emergency_casino.dmm | 4 - _maps/shuttles/ruin_pirate_cutter.dmm | 1 - _maps/shuttles/whiteship_delta.dmm | 4 - _maps/shuttles/whiteship_kilo.dmm | 1 - code/__DEFINES/dcs/signals/signals_storage.dm | 13 + code/__DEFINES/inventory.dm | 2 +- code/__DEFINES/is_helpers.dm | 2 +- code/__DEFINES/memory_defines.dm | 3 +- code/__HELPERS/memory_helpers.dm | 5 +- code/controllers/subsystem/economy.dm | 54 ++- code/controllers/subsystem/job.dm | 14 +- .../components/food/ice_cream_holder.dm | 2 +- code/datums/elements/food/venue_price.dm | 2 +- code/datums/outfit.dm | 14 +- code/datums/station_traits/positive_traits.dm | 40 -- code/datums/storage/storage.dm | 11 +- code/datums/storage/subtypes/pockets.dm | 2 - code/game/area/areas/station.dm | 1 - code/game/machinery/atm.dm | 250 ++++++++++++ code/game/machinery/bank_machine.dm | 7 +- code/game/machinery/civilian_bounties.dm | 383 ------------------ code/game/machinery/computer/security.dm | 39 +- code/game/machinery/computer/warrant.dm | 8 +- code/game/machinery/fax_machine.dm | 6 +- code/game/machinery/slotmachine.dm | 102 ++--- .../effects/effect_system/effect_system.dm | 2 +- .../effects/spawners/random/entertainment.dm | 4 - code/game/objects/items.dm | 2 +- code/game/objects/items/cards_ids.dm | 266 +----------- .../circuitboards/computer_circuitboards.dm | 4 - .../circuitboards/machine_circuitboards.dm | 10 - code/game/objects/items/credit_holochip.dm | 129 ------ code/game/objects/items/mail.dm | 8 +- code/game/objects/items/stacks/cash.dm | 27 +- code/game/objects/items/storage/wallets.dm | 229 ++++++----- .../crates_lockers/closets/secure/freezer.dm | 8 +- .../structures/crates_lockers/crates.dm | 5 +- code/modules/cargo/bounties/assistant.dm | 204 ---------- code/modules/cargo/bounties/botany.dm | 223 ---------- code/modules/cargo/bounties/chef.dm | 153 ------- code/modules/cargo/bounties/engineering.dm | 54 --- code/modules/cargo/bounties/item.dm | 32 -- code/modules/cargo/bounties/mech.dm | 36 -- code/modules/cargo/bounties/medical.dm | 92 ----- code/modules/cargo/bounties/reagent.dm | 230 ----------- code/modules/cargo/bounties/security.dm | 75 ---- code/modules/cargo/bounties/slime.dm | 35 -- code/modules/cargo/bounties/special.dm | 37 -- code/modules/cargo/bounties/virus.dm | 72 ---- code/modules/cargo/bounty.dm | 74 ---- code/modules/cargo/export_scanner.dm | 24 -- code/modules/cargo/exports/civilain_bounty.dm | 8 - code/modules/cargo/order.dm | 32 +- code/modules/cargo/packs.dm | 6 + code/modules/clothing/neck/_neck.dm | 2 +- code/modules/economy/account.dm | 65 +-- code/modules/economy/holopay.dm | 292 ------------- code/modules/events/pirates.dm | 13 +- code/modules/explorer_drone/loot.dm | 2 +- code/modules/jobs/access.dm | 3 +- code/modules/jobs/job_types/_job.dm | 10 +- .../jobs/job_types/security_officer.dm | 2 +- .../ruins/spaceruin_code/crashedship.dm | 2 +- code/modules/mining/money_bag.dm | 2 +- .../mob/living/carbon/human/examine.dm | 3 +- .../mob/living/carbon/human/human_helpers.dm | 4 +- code/modules/mob/living/living.dm | 6 +- .../living/simple_animal/friendly/trader.dm | 13 +- .../computers/item/computer.dm | 6 +- .../modular_computers/hardware/card_slot.dm | 2 +- .../modular_computers/laptop_vendor.dm | 11 +- .../research/designs/comp_board_designs.dm | 5 - .../research/designs/machine_designs.dm | 7 - code/modules/vending/_vending.dm | 3 + code/modules/wiremod/shell/moneybot.dm | 4 +- daedalus.dme | 18 +- icons/obj/storage.dmi | Bin 82065 -> 83501 bytes icons/obj/terminals.dmi | Bin 14963 -> 15814 bytes strings/memories.json | 2 +- tools/UpdatePaths/kapuconomy2.txt | 10 + 83 files changed, 853 insertions(+), 3065 deletions(-) create mode 100644 code/game/machinery/atm.dm delete mode 100644 code/game/machinery/civilian_bounties.dm delete mode 100644 code/game/objects/items/credit_holochip.dm delete mode 100644 code/modules/cargo/bounties/assistant.dm delete mode 100644 code/modules/cargo/bounties/botany.dm delete mode 100644 code/modules/cargo/bounties/chef.dm delete mode 100644 code/modules/cargo/bounties/engineering.dm delete mode 100644 code/modules/cargo/bounties/item.dm delete mode 100644 code/modules/cargo/bounties/mech.dm delete mode 100644 code/modules/cargo/bounties/medical.dm delete mode 100644 code/modules/cargo/bounties/reagent.dm delete mode 100644 code/modules/cargo/bounties/security.dm delete mode 100644 code/modules/cargo/bounties/slime.dm delete mode 100644 code/modules/cargo/bounties/special.dm delete mode 100644 code/modules/cargo/bounties/virus.dm delete mode 100644 code/modules/cargo/bounty.dm delete mode 100644 code/modules/cargo/exports/civilain_bounty.dm delete mode 100644 code/modules/economy/holopay.dm create mode 100644 tools/UpdatePaths/kapuconomy2.txt diff --git a/_maps/RandomRuins/SpaceRuins/oldAIsat.dmm b/_maps/RandomRuins/SpaceRuins/oldAIsat.dmm index 237e37134a2c..3d0e00c2d2ca 100644 --- a/_maps/RandomRuins/SpaceRuins/oldAIsat.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldAIsat.dmm @@ -246,13 +246,6 @@ /obj/item/paper/crumpled, /turf/open/floor/iron/airless, /area/ruin/tcommsat_oldaisat) -"aX" = ( -/obj/item/food/meat/slab/synthmeat{ - name = "Cuban Pete-Meat" - }, -/obj/item/stack/spacecash/c200, -/turf/open/floor/engine, -/area/ruin/tcommsat_oldaisat) "aY" = ( /obj/structure/chair{ dir = 4 @@ -2910,7 +2903,7 @@ ag ao aE aE -aX +aE ag ag ag diff --git a/_maps/map_files/Theseus/Theseus.dmm b/_maps/map_files/Theseus/Theseus.dmm index 67dbbad4c3dc..049f3df7a159 100644 --- a/_maps/map_files/Theseus/Theseus.dmm +++ b/_maps/map_files/Theseus/Theseus.dmm @@ -735,19 +735,6 @@ /obj/structure/easel, /turf/open/floor/plating, /area/station/maintenance/disposal) -"ail" = ( -/obj/structure/closet/secure_closet/personal, -/obj/item/clothing/under/misc/assistantformal, -/obj/structure/sign/map/left{ - desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; - icon_state = "map-left-MS"; - pixel_y = 32 - }, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/shoes/winterboots, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/commons/locker) "aim" = ( /obj/structure/table, /obj/item/controller, @@ -2907,6 +2894,13 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"aJv" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/tile/dark{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) "aJw" = ( /obj/structure/railing{ dir = 4 @@ -5413,11 +5407,6 @@ }, /turf/open/floor/plating, /area/station/hallway/secondary/entry) -"bsm" = ( -/obj/item/beacon, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) "bsn" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/delivery, @@ -16186,13 +16175,6 @@ /obj/structure/sign/warning/securearea, /turf/closed/wall/r_wall/prepainted/daedalus, /area/station/command/corporate_showroom) -"eDt" = ( -/obj/machinery/computer/slot_machine{ - pixel_y = 2 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) "eDG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -24362,18 +24344,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"hhS" = ( -/obj/item/radio/intercom/directional/west, -/obj/machinery/piratepad/civilian, -/obj/effect/turf_decal/bot_white, -/obj/machinery/camera/directional/west{ - c_tag = "Central Primary Hallway - Fore - Port Corner" - }, -/obj/structure/cable/yellow{ - icon_state = "5" - }, -/turf/open/floor/iron, -/area/station/construction/storage_wing) "hhT" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/vending/cigarette, @@ -30079,14 +30049,6 @@ /obj/machinery/meter, /turf/open/floor/iron/ported/techfloor, /area/station/engineering/supermatter/room) -"iWt" = ( -/obj/machinery/light/directional/west, -/obj/machinery/computer/piratepad_control/civilian{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/filled/line, -/turf/open/floor/iron, -/area/station/construction/storage_wing) "iWx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/iron/ported/techfloor_grid, @@ -30196,13 +30158,6 @@ /obj/structure/sign/poster/random/directional/east, /turf/open/floor/wood, /area/station/service/theater) -"iYM" = ( -/obj/item/radio/intercom/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) "iZa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, @@ -31333,6 +31288,17 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/engineering/main) +"jqX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/starboard/lesser) "jro" = ( /obj/structure/chair/office, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -31700,15 +31666,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"jyb" = ( -/obj/structure/chair/stool, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/tile/dark{ - dir = 4 - }, -/obj/structure/noticeboard/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) "jyd" = ( /obj/structure/table, /obj/effect/turf_decal/bot, @@ -32912,13 +32869,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) -"jRR" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/machinery/restaurant_portal/bar, -/turf/open/floor/wood, -/area/station/commons/lounge) "jRT" = ( /obj/structure/table/wood, /obj/item/paper_bin{ @@ -35601,6 +35551,11 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron/freezer, /area/station/medical/coldroom/starboard) +"kLe" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atm, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) "kLn" = ( /obj/structure/cable/yellow{ icon_state = "3" @@ -36830,6 +36785,22 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"lfs" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) "lfA" = ( /obj/structure/cable/yellow{ icon_state = "12" @@ -38249,6 +38220,13 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"lCm" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/atm, +/turf/open/floor/wood, +/area/station/commons/lounge) "lCs" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -39281,11 +39259,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"lRn" = ( -/obj/structure/closet/firecloset, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) "lRr" = ( /obj/structure/chair/stool/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -40913,6 +40886,11 @@ /obj/machinery/light/directional/south, /turf/open/floor/wood, /area/station/service/lawoffice) +"mrE" = ( +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/trimline/brown/filled/line, +/turf/open/floor/iron, +/area/station/construction/storage_wing) "mrI" = ( /obj/effect/turf_decal/siding/blue{ dir = 4 @@ -43790,6 +43768,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"niT" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atm, +/turf/open/floor/wood, +/area/station/commons/lounge) "niW" = ( /obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, /obj/structure/cable/yellow{ @@ -47951,6 +47936,17 @@ dir = 1 }, /area/station/engineering/main) +"oyO" = ( +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/bot_white, +/obj/machinery/camera/directional/west{ + c_tag = "Central Primary Hallway - Fore - Port Corner" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) "oyP" = ( /obj/structure/window/reinforced{ dir = 8 @@ -48254,6 +48250,14 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/command/heads_quarters/ce) +"oDP" = ( +/obj/structure/closet/secure_closet/personal, +/obj/item/clothing/under/misc/assistantformal, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/shoes/winterboots, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/commons/locker) "oDQ" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -51651,6 +51655,13 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"pID" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/atm, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) "pIE" = ( /obj/structure/chair/office{ dir = 4 @@ -52757,17 +52768,6 @@ "qbl" = ( /turf/closed/wall/prepainted/daedalus, /area/station/maintenance/starboard/greater) -"qbn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable/yellow{ - icon_state = "3" - }, -/obj/structure/cable/yellow{ - icon_state = "2" - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/lesser) "qby" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ @@ -55250,11 +55250,6 @@ }, /turf/open/floor/iron, /area/station/security/prison) -"qPK" = ( -/obj/structure/chair/stool/directional/north, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) "qPM" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -57104,12 +57099,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/primary/central/fore) -"rtC" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/commons/lounge) "rtK" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/green{ @@ -60324,22 +60313,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"svC" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable/yellow{ - icon_state = "3" - }, -/obj/structure/cable/yellow{ - icon_state = "2" - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) "svS" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/line{ @@ -61838,19 +61811,6 @@ }, /turf/open/floor/iron, /area/station/engineering/break_room) -"sUq" = ( -/obj/structure/closet/secure_closet/personal, -/obj/item/clothing/under/misc/assistantformal, -/obj/structure/sign/map/right{ - desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; - icon_state = "map-right-MS"; - pixel_y = 32 - }, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/shoes/winterboots, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/commons/locker) "sUw" = ( /obj/effect/spawner/random/engineering/tracking_beacon, /obj/structure/cable/red{ @@ -64482,6 +64442,11 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"tME" = ( +/obj/structure/chair/stool, +/obj/machinery/atm, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) "tMH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -65035,6 +65000,14 @@ /obj/structure/sign/poster/contraband/random/directional/north, /turf/open/floor/wood, /area/station/service/theater) +"tYh" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/atm, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) "tYy" = ( /obj/structure/mirror/directional/east, /obj/machinery/shower{ @@ -65403,6 +65376,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, /turf/open/floor/iron/white, /area/station/science/cytology) +"ucQ" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/obj/machinery/atm, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) "ucW" = ( /obj/structure/table/wood, /obj/item/book/manual/wiki/security_space_law, @@ -66876,16 +66860,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron, /area/station/security/brig) -"uAH" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable/yellow{ - icon_state = "4" - }, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) "uAJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/trimline/brown/warning{ @@ -75183,6 +75157,12 @@ }, /turf/open/floor/catwalk_floor/iron_dark, /area/station/maintenance/fore) +"xhE" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) "xhO" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -76851,6 +76831,11 @@ }, /turf/open/floor/carpet, /area/station/command/heads_quarters/hop) +"xIz" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atm, +/turf/open/floor/iron/dark, +/area/station/commons/locker) "xIE" = ( /obj/machinery/door/airlock/maintenance{ req_one_access_txt = "12;22;25;37;38;46" @@ -77206,6 +77191,12 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel/office) +"xQQ" = ( +/obj/item/beacon, +/obj/effect/turf_decal/delivery, +/obj/machinery/atm, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) "xQU" = ( /obj/structure/railing{ dir = 6 @@ -89209,7 +89200,7 @@ aaa aaa aaa gbI -aVu +tYh kJr gbI lMJ @@ -89969,7 +89960,7 @@ aaa aaa lAu oWO -bsm +xQQ qVL bvF mQt @@ -90213,7 +90204,7 @@ aaa aaa aaa gbI -uAH +ucQ bvF aWU bab @@ -91790,8 +91781,8 @@ xYz aob mpF vYs -eDt -qPK +kLe +crh ckP ckP dvt @@ -100238,8 +100229,8 @@ iMB wcO mlD gFr -hhS -iWt +oyO +mrE uHx lrI nUa @@ -103612,7 +103603,7 @@ iRv nNz xGy vzN -gXE +tME rFw tOJ gME @@ -103650,7 +103641,7 @@ iIw rUF qby vml -lRn +xhE pkO iKr mQS @@ -103869,7 +103860,7 @@ pnP nNz uKz vzN -jyb +aJv lmv sBM gnf @@ -105450,7 +105441,7 @@ hhT lqg jFp vml -iYM +pID qpk cLm cLm @@ -111279,7 +111270,7 @@ euf goR iBZ goR -ail +oDP tzh qCf pRW @@ -111536,7 +111527,7 @@ gBi goR qxK goR -sUq +xIz tzh pRW sZR @@ -112326,7 +112317,7 @@ tDL wbk tFU gEz -jRR +lCm iSY xjg uQY @@ -113097,7 +113088,7 @@ tDL wbk tFU gEz -rtC +niT uQY klx itV @@ -114669,7 +114660,7 @@ jMi iAs dmE nOu -qbn +jqX duy fLE wJr @@ -118741,7 +118732,7 @@ raR gFk ssT dDX -svC +lfs fxM irJ nup diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index e2dcecd9bf4e..2007d78c2f2d 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -967,16 +967,6 @@ /obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) -"cL" = ( -/obj/item/gun/energy/pulse/carbine, -/obj/item/flashlight/seclite, -/obj/structure/table/reinforced, -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/admin/storage) "cN" = ( /obj/effect/turf_decal/siding/wood, /obj/effect/turf_decal/siding/wood{ @@ -1379,6 +1369,19 @@ }, /turf/open/floor/iron, /area/centcom/tdome/observation) +"dY" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/obj/structure/table/glass/plasmaglass, +/obj/item/folder/white, +/obj/item/pen{ + pixel_x = 6; + pixel_y = 5 + }, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) "dZ" = ( /obj/item/kirbyplants{ icon_state = "plant-21" @@ -5644,6 +5647,16 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/ert) +"pY" = ( +/obj/item/gun/energy/pulse/carbine, +/obj/item/flashlight/seclite, +/obj/structure/table/reinforced, +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/admin/storage) "pZ" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -8114,6 +8127,17 @@ /obj/machinery/vending/snack, /turf/open/floor/engine/cult, /area/centcom/wizard_station) +"xy" = ( +/obj/structure/table/reinforced, +/obj/item/paper/fluff/stations/centcom/disk_memo{ + pixel_x = -6; + pixel_y = -7 + }, +/obj/item/taperecorder{ + pixel_y = 15 + }, +/turf/open/floor/carpet, +/area/centcom/syndicate_mothership/control) "xz" = ( /obj/structure/table/wood/fancy, /obj/item/storage/photo_album, @@ -10863,18 +10887,6 @@ /obj/item/pen, /turf/open/floor/iron/dark/textured_large, /area/centcom/syndicate_mothership/control) -"Ft" = ( -/obj/structure/table/reinforced, -/obj/item/paper/fluff/stations/centcom/disk_memo{ - pixel_x = -6; - pixel_y = -7 - }, -/obj/item/taperecorder{ - pixel_y = 15 - }, -/obj/item/stack/spacecash/c50, -/turf/open/floor/carpet, -/area/centcom/syndicate_mothership/control) "Fv" = ( /obj/machinery/door/airlock/centcom{ name = "CentCom" @@ -13265,22 +13277,6 @@ /obj/structure/sign/nanotrasen, /turf/closed/indestructible/reinforced/centcom, /area/centcom/central_command_areas/briefing) -"MZ" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 8 - }, -/obj/structure/table/glass/plasmaglass, -/obj/item/folder/white, -/obj/item/pen{ - pixel_x = 6; - pixel_y = 5 - }, -/obj/machinery/light/cold/directional/west, -/obj/item/stack/spacecash/c200{ - pixel_y = 17 - }, -/turf/open/floor/mineral/plastitanium, -/area/centcom/syndicate_mothership/control) "Na" = ( /obj/effect/turf_decal/siding/thinplating_new/dark/corner, /turf/open/floor/mineral/plastitanium/red, @@ -25617,7 +25613,7 @@ ng VX XE od -MZ +dY Sr nz br @@ -37188,7 +37184,7 @@ nz HN gJ dy -Ft +xy nt HJ VJ @@ -58516,7 +58512,7 @@ XA Sx Nn yi -cL +pY YU vb oe diff --git a/_maps/shuttles/emergency_casino.dmm b/_maps/shuttles/emergency_casino.dmm index 1b4b07f0f694..8277983d9922 100644 --- a/_maps/shuttles/emergency_casino.dmm +++ b/_maps/shuttles/emergency_casino.dmm @@ -482,10 +482,6 @@ pixel_x = -2; pixel_y = 4 }, -/obj/item/stack/spacecash/c50{ - pixel_x = 2; - pixel_y = 7 - }, /obj/machinery/vending/wallmed/directional/west, /turf/open/floor/carpet/green, /area/shuttle/escape) diff --git a/_maps/shuttles/ruin_pirate_cutter.dmm b/_maps/shuttles/ruin_pirate_cutter.dmm index 7d55a7941aa9..c0e6d17840fc 100644 --- a/_maps/shuttles/ruin_pirate_cutter.dmm +++ b/_maps/shuttles/ruin_pirate_cutter.dmm @@ -552,7 +552,6 @@ "BI" = ( /obj/structure/table, /obj/machinery/light/small/directional/west, -/obj/item/stack/spacecash/c200, /turf/open/floor/iron/dark, /area/shuttle/caravan/pirate) "BL" = ( diff --git a/_maps/shuttles/whiteship_delta.dmm b/_maps/shuttles/whiteship_delta.dmm index a03b5565fb3f..f5c8722528d0 100644 --- a/_maps/shuttles/whiteship_delta.dmm +++ b/_maps/shuttles/whiteship_delta.dmm @@ -930,10 +930,6 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/cobweb, /obj/machinery/firealarm/directional/west, -/obj/item/stack/spacecash/c200{ - pixel_x = 7; - pixel_y = 4 - }, /obj/item/pen{ pixel_x = -4 }, diff --git a/_maps/shuttles/whiteship_kilo.dmm b/_maps/shuttles/whiteship_kilo.dmm index 35ddfeedab7f..fc8a760b4ba1 100644 --- a/_maps/shuttles/whiteship_kilo.dmm +++ b/_maps/shuttles/whiteship_kilo.dmm @@ -1634,7 +1634,6 @@ /obj/item/storage/toolbox/mechanical{ pixel_y = 6 }, -/obj/item/stack/spacecash/c200, /turf/open/floor/mineral/plastitanium, /area/shuttle/abandoned/bridge) "db" = ( diff --git a/code/__DEFINES/dcs/signals/signals_storage.dm b/code/__DEFINES/dcs/signals/signals_storage.dm index 456ac3c0781a..602ec54c0873 100644 --- a/code/__DEFINES/dcs/signals/signals_storage.dm +++ b/code/__DEFINES/dcs/signals/signals_storage.dm @@ -2,3 +2,16 @@ #define COMSIG_STORAGE_DUMP_CONTENT "storage_dump_contents" /// Return to stop the standard dump behavior. #define STORAGE_DUMP_HANDLED (1<<0) + +/// Sent after /datum/storage/attempt_insert(): (obj/item/inserted, mob/user, override, force) +#define COMSIG_STORAGE_INSERTED_ITEM "storage_inserted_item" + +/// Sent when /datum/storage/open_storage(): (mob/to_show, performing_quickdraw) +#define COMSIG_STORAGE_ATTEMPT_OPEN "storage_attempt_open" + /// Interrupt the opening. + #define STORAGE_INTERRUPT_OPEN (1<<0) + +/// Sent when /datum/storage/can_insert(): (obj/item/to_insert, mob/user, messages, force) +#define COMSIG_STORAGE_CAN_INSERT "storage_can_insert" + /// Disallow the insertion. + #define STORAGE_NO_INSERT (1<<0) diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index 2c6b0cec812e..d51aa4fcb404 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -1,7 +1,7 @@ /*ALL DEFINES RELATED TO INVENTORY OBJECTS, MANAGEMENT, ETC, GO HERE*/ //ITEM INVENTORY WEIGHT, FOR w_class -/// Usually items smaller then a human hand, (e.g. playing cards, lighter, scalpel, coins/holochips) +/// Usually items smaller then a human hand, (e.g. playing cards, lighter, scalpel, coins) #define WEIGHT_CLASS_TINY 1 /// Pockets can hold small and tiny items, (e.g. flashlight, multitool, grenades, GPS device) #define WEIGHT_CLASS_SMALL 2 diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 36f014ec514d..ceb211da6e41 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -223,7 +223,7 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( #define ismobholder(A) (istype(A, /obj/item/mob_holder)) -#define iscash(A) (istype(A, /obj/item/coin) || istype(A, /obj/item/stack/spacecash) || istype(A, /obj/item/holochip)) +#define iscash(A) (istype(A, /obj/item/coin) || istype(A, /obj/item/stack/spacecash)) #define isbodypart(A) (istype(A, /obj/item/bodypart)) diff --git a/code/__DEFINES/memory_defines.dm b/code/__DEFINES/memory_defines.dm index faaab7241610..be388f622099 100644 --- a/code/__DEFINES/memory_defines.dm +++ b/code/__DEFINES/memory_defines.dm @@ -108,7 +108,7 @@ * * ideally these eventually get moved off this system... though engraving your bank account is so HILARIOUSLY dumb so maybe leave that one */ -///your memorized code +///your memorized bank account #define MEMORY_ACCOUNT "account" ///your memorized drug #define MEMORY_QUIRK_DRUG "quirk_drug" @@ -147,6 +147,7 @@ #define DETAIL_HIGHFIVE_TYPE "HIGHFIVE_TYPE" #define DETAIL_BOMB_TYPE "BOMB_TYPE" #define DETAIL_ACCOUNT_ID "ACCOUNT_ID" +#define DETAIL_ACCOUNT_PIN "ACCOUNT_PIN" #define DETAIL_KISSER "KISSER" #define DETAIL_FOOD "FOOD" #define DETAIL_DRINK "DRINK" diff --git a/code/__HELPERS/memory_helpers.dm b/code/__HELPERS/memory_helpers.dm index cd96203685d7..64865d0a9f89 100644 --- a/code/__HELPERS/memory_helpers.dm +++ b/code/__HELPERS/memory_helpers.dm @@ -60,8 +60,9 @@ /datum/mind/proc/build_story_mob(mob/living/target) if(isanimal(target)) return "\the [target]" - if(target.mind?.assigned_role) - return "\the [lowertext(initial(target.mind?.assigned_role.title))]" + if(ishuman(target)) + var/mob/living/carbon/human/H = target + return H.get_face_name() return target ///returns the story name of anything diff --git a/code/controllers/subsystem/economy.dm b/code/controllers/subsystem/economy.dm index 1d6646c86a11..c7bfcc04e587 100644 --- a/code/controllers/subsystem/economy.dm +++ b/code/controllers/subsystem/economy.dm @@ -93,10 +93,19 @@ SUBSYSTEM_DEF(economy) //Split the station budget amongst the departments departmental_payouts() - ///See if we even have enough money to pay these idiots + //See if we even have enough money to pay these idiots var/required_funds = 0 + var/list/dead_people = list() + + //Dead people don't get money. + for(var/datum/data/record/medical_record in GLOB.data_core.general) //dont ask + if(medical_record.fields["status"] == "*Deceased*") + dead_people += medical_record.fields["name"] + for(var/account in bank_accounts_by_id) var/datum/bank_account/bank_account = bank_accounts_by_id[account] + if(bank_account.account_holder in dead_people) + continue required_funds += round(bank_account.account_job.paycheck * bank_account.payday_modifier) if(payroll_active) @@ -109,8 +118,16 @@ SUBSYSTEM_DEF(economy) run_dry = FALSE for(var/account in bank_accounts_by_id) var/datum/bank_account/bank_account = bank_accounts_by_id[account] + if(bank_account.account_holder in dead_people) + continue bank_account.payday() + priority_announce( + "Attention staff of [station_name()], you have received payment for this period. You may withdraw funds from your nearest ATM.", + "Station Announcement", + "Staff Update", + ) + //price_update() This doesn't need to fire every 5 minutes. The only current use is market crash, which handles it on its own. var/effective_mailcount = round(living_player_count()) mail_waiting += clamp(effective_mailcount, 1, MAX_MAIL_PER_MINUTE * delta_time) @@ -349,3 +366,38 @@ SUBSYSTEM_DEF(economy) spawned_paper.update_appearance() return spawned_paper + +/// Spawns a given amount of money in optimal stacks at the given location. +/datum/controller/subsystem/economy/proc/spawn_cash_for_amount(amt, spawn_loc) + amt = round(amt) // Don't pass in decimals you twat + var/ten_thousands = 0 + var/thousands = 0 + var/hundreds = 0 + var/tens = 0 + var/ones = 0 + + ten_thousands = floor(amt / 10000) + amt -= ten_thousands * 10000 + + thousands = floor(amt / 1000) + amt -= thousands * 1000 + + hundreds = floor(amt / 100) + amt -= hundreds * 100 + + tens = floor(amt / 10) + amt -= tens * 10 + + ones = amt + + if(ten_thousands) + new /obj/item/stack/spacecash/c10000(spawn_loc, ten_thousands) + if(thousands) + new /obj/item/stack/spacecash/c1000(spawn_loc, thousands) + if(hundreds) + new /obj/item/stack/spacecash/c100(spawn_loc, hundreds) + if(tens) + new /obj/item/stack/spacecash/c10(spawn_loc, tens) + if(ones) + new /obj/item/stack/spacecash/c1(spawn_loc, ones) + diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 71023efbccd6..4e6bf8b9d330 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -548,11 +548,6 @@ SUBSYSTEM_DEF(job) job.on_join_message(player_client, chosen_title) if(player_client) - // We agreed it's safe to remove this, but commented out instead of fully removed incase we want to reverse that decision. - /*if(job.req_admin_notify) - to_chat(player_client, "You are playing a job that is important for Game Progression. If you have to disconnect, please notify the admins via adminhelp.") - */ - var/related_policy = get_policy(job.title) if(related_policy) to_chat(player_client, related_policy) @@ -562,7 +557,10 @@ SUBSYSTEM_DEF(job) if(ishuman(equipping)) var/mob/living/carbon/human/wageslave = equipping - wageslave.mind.add_memory(MEMORY_ACCOUNT, list(DETAIL_ACCOUNT_ID = wageslave.account_id), story_value = STORY_VALUE_SHIT, memory_flags = MEMORY_FLAG_NOLOCATION) + var/datum/bank_account/bank = SSeconomy.bank_accounts_by_id["[wageslave.account_id]"] + + wageslave.mind.add_memory(MEMORY_ACCOUNT, list(DETAIL_ACCOUNT_ID = wageslave.account_id, DETAIL_ACCOUNT_PIN = bank.account_pin), story_value = STORY_VALUE_SHIT, memory_flags = MEMORY_FLAG_NOLOCATION) + to_chat(player_client, span_obviousnotice("Your bank account pin is: [bank.account_pin]")) setup_alt_job_items(wageslave, job, player_client) //PARIAH EDIT ADDITION @@ -846,8 +844,8 @@ SUBSYSTEM_DEF(job) // Force-give their ID card bridge access. var/obj/item/id_slot = new_captain.get_item_by_slot(ITEM_SLOT_ID) if(id_slot) - var/obj/item/card/id/id_card = id_slot.GetID() - if(!(ACCESS_HEADS in id_card.access)) + var/obj/item/card/id/id_card = id_slot.GetID() || locate() in id_slot + if(id_card && !(ACCESS_HEADS in id_card.access)) id_card.add_wildcards(list(ACCESS_HEADS), mode=FORCE_ADD_ALL) assigned_captain = TRUE diff --git a/code/datums/components/food/ice_cream_holder.dm b/code/datums/components/food/ice_cream_holder.dm index 432d370dd90c..082619faaf7d 100644 --- a/code/datums/components/food/ice_cream_holder.dm +++ b/code/datums/components/food/ice_cream_holder.dm @@ -177,7 +177,7 @@ var/datum/venue/venue_to_pay = sold_to.ai_controller?.blackboard[BB_CUSTOMER_ATTENDING_VENUE] - new /obj/item/holochip(get_turf(source), venue_price) + SSeconomy.spawn_cash_for_amount(venue_price, get_turf(source)) venue_to_pay.total_income += venue_price playsound(get_turf(source), 'sound/effects/cashregister.ogg', 60, TRUE) diff --git a/code/datums/elements/food/venue_price.dm b/code/datums/elements/food/venue_price.dm index 37a6bed81693..6a0df12cab34 100644 --- a/code/datums/elements/food/venue_price.dm +++ b/code/datums/elements/food/venue_price.dm @@ -21,6 +21,6 @@ var/datum/venue/venue_to_pay = sold_to.ai_controller?.blackboard[BB_CUSTOMER_ATTENDING_VENUE] - new /obj/item/holochip(get_turf(container), venue_price) + SSeconomy.spawn_cash_for_amount(venue_price, get_turf(sold_to)) venue_to_pay.total_income += venue_price playsound(get_turf(container), 'sound/effects/cashregister.ogg', 60, TRUE) diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm index 29c9e2940a4f..a65b142bf12d 100644 --- a/code/datums/outfit.dm +++ b/code/datums/outfit.dm @@ -107,6 +107,8 @@ ///ID of the slot containing a gas tank var/internals_slot = null + /// If TRUE, will spawn their ID in a wallet. + var/id_in_wallet = FALSE /** * Any skillchips the mob should have in their brain. * @@ -192,10 +194,18 @@ EQUIP_OUTFIT_ITEM(glasses, ITEM_SLOT_EYES) if(back) EQUIP_OUTFIT_ITEM(back, ITEM_SLOT_BACK) + if(id) - EQUIP_OUTFIT_ITEM(id, ITEM_SLOT_ID) + if(id_in_wallet && ispath(id, /obj/item/card/id)) + var/obj/item/storage/wallet/W = /obj/item/storage/wallet + EQUIP_OUTFIT_ITEM(W, ITEM_SLOT_ID) + W = H.wear_id + INVOKE_ASYNC(W, TYPE_PROC_REF(/obj/item, InsertID), SSwardrobe.provide_type(id), TRUE) + else + EQUIP_OUTFIT_ITEM(id, ITEM_SLOT_ID) + if(!visualsOnly && id_trim && H.wear_id) - var/obj/item/card/id/id_card = H.wear_id + var/obj/item/card/id/id_card = H.wear_id.GetID(TRUE) id_card.registered_age = H.age if(id_trim) if(!SSid_access.apply_trim_to_card(id_card, id_trim)) diff --git a/code/datums/station_traits/positive_traits.dm b/code/datums/station_traits/positive_traits.dm index 4ca1707cba5a..f7981921b4a1 100644 --- a/code/datums/station_traits/positive_traits.dm +++ b/code/datums/station_traits/positive_traits.dm @@ -230,43 +230,3 @@ var/obj/item/implant/deathrattle/implant_to_give = new() deathrattle_group.register(implant_to_give) implant_to_give.implant(spawned, spawned, BODY_ZONE_CHEST, TRUE, TRUE) - - -/datum/station_trait/wallets - name = "Wallets!" - trait_type = STATION_TRAIT_POSITIVE - show_in_report = TRUE - weight = 10 - report_message = "It has become temporarily fashionable to use a wallet, so everyone on the station has been issued one." - -/datum/station_trait/wallets/New() - . = ..() - RegisterSignal(SSdcs, COMSIG_GLOB_JOB_AFTER_SPAWN, PROC_REF(on_job_after_spawn)) - -/datum/station_trait/wallets/proc/on_job_after_spawn(datum/source, datum/job/job, mob/living/living_mob, mob/M, joined_late) - SIGNAL_HANDLER - - var/obj/item/card/id/advanced/id_card = living_mob.get_item_by_slot(ITEM_SLOT_ID) - if(!istype(id_card)) - return - - living_mob.temporarilyRemoveItemFromInventory(id_card, force=TRUE) - - // "Doc, what's wrong with me?" - var/obj/item/storage/wallet/wallet = new(src) - // "You've got a wallet embedded in your chest." - wallet.add_fingerprint(living_mob, ignoregloves = TRUE) - - living_mob.equip_to_slot_if_possible(wallet, ITEM_SLOT_ID, initial=TRUE) - - id_card.forceMove(wallet) - - var/holochip_amount = id_card.registered_account.account_balance - new /obj/item/holochip(wallet, holochip_amount) - id_card.registered_account.adjust_money(-holochip_amount) - - new /obj/effect/spawner/random/entertainment/wallet_storage(wallet) - - // Put our filthy fingerprints all over the contents - for(var/obj/item/item in wallet) - item.add_fingerprint(living_mob, ignoregloves = TRUE) diff --git a/code/datums/storage/storage.dm b/code/datums/storage/storage.dm index 7d610b4bf06a..8ca4110b57f1 100644 --- a/code/datums/storage/storage.dm +++ b/code/datums/storage/storage.dm @@ -365,6 +365,9 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) to_chat(user, span_warning("[resolve_parent] cannot hold [to_insert] as it's a storage item of the same size!")) return FALSE + if(SEND_SIGNAL(src, COMSIG_STORAGE_CAN_INSERT, to_insert, user, messages, force) & STORAGE_NO_INSERT) + return FALSE + return TRUE /** @@ -388,6 +391,7 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) to_insert.forceMove(resolve_location) item_insertion_feedback(user, to_insert, override) resolve_location.update_appearance() + SEND_SIGNAL(src, COMSIG_STORAGE_INSERTED_ITEM, to_insert, user, override, force) return TRUE /// Checks if the item is allowed into storage based on it's weight class @@ -491,10 +495,10 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) for(var/mob/viewing in oviewers(user, null)) if(in_range(user, viewing)) viewing.show_message(span_notice("[user] puts [thing] [insert_preposition]to [resolve_parent]."), MSG_VISUAL) - return + continue if(thing && thing.w_class >= 3) viewing.show_message(span_notice("[user] puts [thing] [insert_preposition]to [resolve_parent]."), MSG_VISUAL) - return + continue /** * Attempts to remove an item from the storage @@ -948,6 +952,9 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) if(!resolve_parent) return FALSE + if(SEND_SIGNAL(src, COMSIG_STORAGE_ATTEMPT_OPEN) & STORAGE_INTERRUPT_OPEN) + return FALSE + var/obj/item/resolve_location = real_location?.resolve() if(!resolve_location) return FALSE diff --git a/code/datums/storage/subtypes/pockets.dm b/code/datums/storage/subtypes/pockets.dm index 60e470c4b534..9bbd05795e3f 100644 --- a/code/datums/storage/subtypes/pockets.dm +++ b/code/datums/storage/subtypes/pockets.dm @@ -94,7 +94,6 @@ /obj/item/clothing/mask/cigarette, /obj/item/lighter, /obj/item/match, - /obj/item/holochip, /obj/item/toy/crayon), list(/obj/item/screwdriver/power, /obj/item/ammo_casing/caseless/rocket, @@ -125,7 +124,6 @@ /obj/item/clothing/mask/cigarette, /obj/item/lighter, /obj/item/match, - /obj/item/holochip, /obj/item/toy/crayon, /obj/item/bikehorn), list(/obj/item/screwdriver/power, diff --git a/code/game/area/areas/station.dm b/code/game/area/areas/station.dm index ea348be3122b..01e112a59228 100644 --- a/code/game/area/areas/station.dm +++ b/code/game/area/areas/station.dm @@ -1068,7 +1068,6 @@ ambientsounds = list('sound/ambience/aurora_caelus_short.ogg') //Security -///When adding a new area to the security areas, make sure to add it to /datum/bounty/item/security/paperwork as well! /area/station/security name = "Security" diff --git a/code/game/machinery/atm.dm b/code/game/machinery/atm.dm new file mode 100644 index 000000000000..b78540332586 --- /dev/null +++ b/code/game/machinery/atm.dm @@ -0,0 +1,250 @@ +/obj/machinery/atm + name = "automated teller machine" + desc = "An age-old technology for managing one's wealth." + icon = 'icons/obj/terminals.dmi' + icon_state = "atm" + base_icon_state = "atm" + + layer = ABOVE_OBJ_LAYER + 0.001 + pixel_y = 32 + base_pixel_y = 32 + + resistance_flags = INDESTRUCTIBLE + idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.1 + + /// The bank account being interfaced + var/datum/bank_account/authenticated_account + /// The card that is currently inserted + var/obj/item/card/id/inserted_card + + /// Particle system for EMAGging + var/datum/effect_system/spark_spread/spark_system + + var/entered_pin + var/reject_topic = FALSE + +/obj/machinery/atm/Initialize(mapload) + . = ..() + var/static/count = 1 + name = "[station_name()] A.T.M #[count]" + count++ + + spark_system = new /datum/effect_system/spark_spread + spark_system.set_up(5, 0, src) + spark_system.attach(src) + +/obj/machinery/atm/Destroy() + QDEL_NULL(inserted_card) + authenticated_account = null + QDEL_NULL(spark_system) + return ..() + +/obj/machinery/atm/examine(mob/user) + . = ..() + if(inserted_card) + . += span_notice("There is a card in the card slot.") + +/obj/machinery/atm/update_icon_state() + if(machine_stat & NOPOWER) + icon_state = "[base_icon_state]_off" + else + icon_state = base_icon_state + + return ..() + +/obj/machinery/atm/process() + if(machine_stat & NOPOWER) + return + + use_power(IDLE_POWER_USE) + +/obj/machinery/atm/emag_act(mob/user, obj/item/card/emag/emag_card) + . = ..() + if(obj_flags & EMAGGED) + to_chat(user, span_warning("This machine has already been hacked.")) + return + + obj_flags |= EMAGGED + spark_system.start() + dispense_cash(rand(20, 200)) + +/obj/machinery/atm/attackby(obj/item/I, mob/user, params) + if(!isidcard(I) && !iscash(I)) + return ..() + + if(machine_stat & NOPOWER) + to_chat(user, span_warning("You attempt to insert [I] into [src], but nothing happens.")) + return TRUE + + if(isidcard(I)) + if(inserted_card) + to_chat(user, span_warning("You attempt to insert [I] into [src], but there's already something in the slot.")) + return TRUE + if(!user.transferItemToLoc(I, src)) + return TRUE + + inserted_card = I + updateUsrDialog() + to_chat(user, span_notice("You insert [I] into [src].")) + return TRUE + + if(iscash(I)) + if(!authenticated_account) + to_chat(user, span_warning("You attempt to insert [I] into [src], but nothing happens.")) + return TRUE + + if(!user.transferItemToLoc(I, src)) + return TRUE + + var/value = I.get_item_credit_value() + qdel(I) + authenticated_account.adjust_money(value) + + to_chat(user, span_notice("You deposit [value] into [src].")) + updateUsrDialog() + return TRUE + +/// Dispense the given amount of cash and give feedback. +/obj/machinery/atm/proc/dispense_cash(amt) + if(!amt) + return + + playsound(src, 'sound/machines/ping.ogg') + reject_topic = TRUE + sleep(2 SECONDS) + reject_topic = FALSE + visible_message(span_notice("[src] dispenses a wad of money."), vision_distance = COMBAT_MESSAGE_RANGE) + + SSeconomy.spawn_cash_for_amount(amt, drop_location()) + +/obj/machinery/atm/proc/try_authenticate(pin) + if((machine_stat & NOPOWER) || !inserted_card?.registered_account) + return FALSE + + if(inserted_card.registered_account.account_pin != pin) + return FALSE + + authenticated_account = inserted_card.registered_account + return TRUE + +/obj/machinery/atm/ui_interact(mob/user, datum/tgui/ui) + var/datum/browser/popup = new(user, "atm", name, 460, 270) + popup.set_content(jointext(get_content(), "")) + popup.open() + +/obj/machinery/atm/Topic(href, href_list) + . = ..() + if(. || reject_topic) + return + + if(href_list["eject_id"]) + inserted_card.forceMove(drop_location()) + inserted_card = null + playsound(src, 'sound/machines/terminal_eject.ogg') + updateUsrDialog() + return TRUE + + if(href_list["enter_pin"]) + open_pinpad_ui(usr) + return TRUE + + if(href_list["type"]) + var/key = href_list["type"] + switch(key) + if("E") + if(try_authenticate(entered_pin)) + entered_pin = "" + updateUsrDialog() + sleep(world.tick_lag) + usr << browse(null, "window=atm-pinpad") + else + entered_pin = "ERROR" + open_pinpad_ui(usr) + + if("C") + entered_pin = "" + open_pinpad_ui(usr) + + else + if(!sanitize_text(key)) + return TRUE + if(length(entered_pin) >= 5) + return TRUE + + entered_pin = "[entered_pin][key]" + open_pinpad_ui(usr) + + return TRUE + + if(href_list["logout"]) + authenticated_account = null + updateUsrDialog() + return TRUE + + if(href_list["withdraw"]) + var/amt = tgui_input_number(usr, "Enter amount (1-100)", "Withdraw", 0, 100, 0) + if(!amt) + return TRUE + + amt = min(amt, authenticated_account.account_balance) + authenticated_account.adjust_money(-amt) + dispense_cash(amt) + updateUsrDialog() + return TRUE + +/obj/machinery/atm/proc/get_content() + PRIVATE_PROC(TRUE) + . = list() + . += "
" + . += "
" + . += {" + + Automated Teller Machine + + "} + + . += "
" + if(authenticated_account) + . += {" + Welcome, [authenticated_account.account_holder].

+ Your balance is: [authenticated_account.account_balance] + "} + + . += "
" + . += jointext(buttons(), "") + . += "
" + . += "
" + +/obj/machinery/atm/proc/buttons() + PRIVATE_PROC(TRUE) + RETURN_TYPE(/list) + . = list() + + . += "
[button_element(src, "Eject Card", "eject_id=1")]
" + + if(!authenticated_account) + . += "
[button_element(src, "Enter PIN", "enter_pin=1")]

" + else + . += "
[button_element(src, "Withdraw", "withdraw=1")]
" + . += "
[button_element(src, "Logout", "logout=1")]
" + +/obj/machinery/atm/proc/open_pinpad_ui(mob/user) + PRIVATE_PROC(TRUE) + var/datum/browser/popup = new(user, "atm-pinpad", "Enter Pin", 300, 280) + var/dat = "[src]
\n\n" + dat += {" +
\n>[entered_pin]
\n1 +-2 +-3
\n +4 +-5 +-6
\n +7 +-8 +-9
\n +C +-0 +-E
\n
"} + + popup.set_content(dat) + popup.open() diff --git a/code/game/machinery/bank_machine.dm b/code/game/machinery/bank_machine.dm index 2fb279f08b67..807306388efb 100644 --- a/code/game/machinery/bank_machine.dm +++ b/code/game/machinery/bank_machine.dm @@ -26,10 +26,7 @@ var/value = 0 if(istype(I, /obj/item/stack/spacecash)) var/obj/item/stack/spacecash/C = I - value = C.value * C.amount - else if(istype(I, /obj/item/holochip)) - var/obj/item/holochip/H = I - value = H.credits + value = C.get_item_credit_value() if(value) var/datum/bank_account/D = SSeconomy.department_accounts_by_id[ACCOUNT_CAR] if(D) @@ -100,5 +97,5 @@ /obj/machinery/computer/bank_machine/proc/end_syphon() siphoning = FALSE - new /obj/item/holochip(drop_location(), syphoning_credits) //get the loot + SSeconomy.spawn_cash_for_amount(syphoning_credits, drop_location()) syphoning_credits = 0 diff --git a/code/game/machinery/civilian_bounties.dm b/code/game/machinery/civilian_bounties.dm deleted file mode 100644 index a57e53472227..000000000000 --- a/code/game/machinery/civilian_bounties.dm +++ /dev/null @@ -1,383 +0,0 @@ -///Percentage of a civilian bounty the civilian will make. -#define CIV_BOUNTY_SPLIT 30 - -///Pad for the Civilian Bounty Control. -/obj/machinery/piratepad/civilian - name = "civilian bounty pad" - desc = "A machine designed to send civilian bounty targets to centcom." - layer = TABLE_LAYER - resistance_flags = FIRE_PROOF - circuit = /obj/item/circuitboard/machine/bountypad - -///Computer for assigning new civilian bounties, and sending bounties for collection. -/obj/machinery/computer/piratepad_control/civilian - name = "civilian bounty control terminal" - desc = "A console for assigning civilian bounties to inserted ID cards, and for controlling the bounty pad for export." - status_report = "Ready for delivery." - icon_screen = "civ_bounty" - icon_keyboard = "id_key" - warmup_time = 3 SECONDS - circuit = /obj/item/circuitboard/computer/bountypad - interface_type = "CivCargoHoldTerminal" - ///Typecast of an inserted, scanned ID card inside the console, as bounties are held within the ID card. - var/obj/item/card/id/inserted_scan_id - -/obj/machinery/computer/piratepad_control/civilian/attackby(obj/item/I, mob/living/user, params) - if(isidcard(I)) - if(id_insert(user, I, inserted_scan_id)) - inserted_scan_id = I - return TRUE - return ..() - -/obj/machinery/computer/piratepad_control/multitool_act(mob/living/user, obj/item/multitool/I) - if(istype(I) && istype(I.buffer,/obj/machinery/piratepad/civilian)) - to_chat(user, span_notice("You link [src] with [I.buffer] in [I] buffer.")) - pad_ref = WEAKREF(I.buffer) - return TRUE - -/obj/machinery/computer/piratepad_control/civilian/LateInitialize() - . = ..() - if(cargo_hold_id) - for(var/obj/machinery/piratepad/civilian/C in INSTANCES_OF(/obj/machinery/piratepad)) - if(C.cargo_hold_id == cargo_hold_id) - pad_ref = WEAKREF(C) - return - else - var/obj/machinery/piratepad/civilian/pad = locate() in range(4,src) - pad_ref = WEAKREF(pad) - -/obj/machinery/computer/piratepad_control/civilian/recalc() - if(sending) - return FALSE - if(!inserted_scan_id) - status_report = "Please insert your ID first." - playsound(loc, 'sound/machines/synth_no.ogg', 30 , TRUE) - return FALSE - if(!inserted_scan_id.registered_account.civilian_bounty) - status_report = "Please accept a new civilian bounty first." - playsound(loc, 'sound/machines/synth_no.ogg', 30 , TRUE) - return FALSE - status_report = "Civilian Bounty: " - var/obj/machinery/piratepad/pad = pad_ref?.resolve() - for(var/atom/movable/AM in get_turf(pad)) - if(AM == pad) - continue - if(inserted_scan_id.registered_account.civilian_bounty.applies_to(AM)) - status_report += "Target Applicable." - playsound(loc, 'sound/machines/synth_yes.ogg', 30 , TRUE) - return - status_report += "Not Applicable." - playsound(loc, 'sound/machines/synth_no.ogg', 30 , TRUE) - -/** - * This fully rewrites base behavior in order to only check for bounty objects, and nothing else. - */ -/obj/machinery/computer/piratepad_control/civilian/send() - playsound(loc, 'sound/machines/wewewew.ogg', 70, TRUE) - if(!sending) - return - if(!inserted_scan_id) - stop_sending() - return FALSE - if(!inserted_scan_id.registered_account.civilian_bounty) - stop_sending() - return FALSE - var/datum/bounty/curr_bounty = inserted_scan_id.registered_account.civilian_bounty - var/active_stack = 0 - var/obj/machinery/piratepad/pad = pad_ref?.resolve() - for(var/atom/movable/AM in get_turf(pad)) - if(AM == pad) - continue - if(curr_bounty.applies_to(AM)) - active_stack ++ - curr_bounty.ship(AM) - qdel(AM) - if(active_stack >= 1) - status_report += "Bounty Target Found x[active_stack]. " - else - status_report = "No applicable targets found. Aborting." - stop_sending() - if(curr_bounty.can_claim()) - //Pay for the bounty with the ID's department funds. - status_report += "Bounty completed! Please give your bounty cube to cargo for your automated payout shortly." - inserted_scan_id.registered_account.reset_bounty() - SSeconomy.civ_bounty_tracker++ - - var/obj/item/bounty_cube/reward = new /obj/item/bounty_cube(drop_location()) - reward.set_up(curr_bounty, inserted_scan_id) - - pad.visible_message(span_notice("[pad] activates!")) - flick(pad.sending_state,pad) - pad.icon_state = pad.idle_state - playsound(loc, 'sound/machines/synth_yes.ogg', 30 , TRUE) - sending = FALSE - -///Here is where cargo bounties are added to the player's bank accounts, then adjusted and scaled into a civilian bounty. -/obj/machinery/computer/piratepad_control/civilian/proc/add_bounties() - if(!inserted_scan_id || !inserted_scan_id.registered_account) - return - var/datum/bank_account/pot_acc = inserted_scan_id.registered_account - if((pot_acc.civilian_bounty || pot_acc.bounties) && !COOLDOWN_FINISHED(pot_acc, bounty_timer)) - var/curr_time = round((COOLDOWN_TIMELEFT(pot_acc, bounty_timer)) / (1 MINUTES), 0.01) - say("Internal ID network spools coiling, try again in [curr_time] minutes!") - return FALSE - if(!pot_acc.account_job) - say("Requesting ID card has no job assignment registered!") - return FALSE - var/list/datum/bounty/crumbs = list(random_bounty(pot_acc.account_job.bounty_types), // We want to offer 2 bounties from their appropriate job catagories - random_bounty(pot_acc.account_job.bounty_types), // and 1 guarenteed assistant bounty if the other 2 suck. - random_bounty(CIV_JOB_BASIC)) - COOLDOWN_START(pot_acc, bounty_timer, 5 MINUTES) - pot_acc.bounties = crumbs - -/obj/machinery/computer/piratepad_control/civilian/proc/pick_bounty(choice) - if(!inserted_scan_id || !inserted_scan_id.registered_account || !inserted_scan_id.registered_account.bounties || !inserted_scan_id.registered_account.bounties[choice]) - playsound(loc, 'sound/machines/synth_no.ogg', 40 , TRUE) - return - inserted_scan_id.registered_account.civilian_bounty = inserted_scan_id.registered_account.bounties[choice] - inserted_scan_id.registered_account.bounties = null - return inserted_scan_id.registered_account.civilian_bounty - -/obj/machinery/computer/piratepad_control/civilian/AltClick(mob/user) - . = ..() - if(!Adjacent(user)) - return FALSE - id_eject(user, inserted_scan_id) - -/obj/machinery/computer/piratepad_control/civilian/ui_data(mob/user) - . = list() - .["points"] = points - .["pad"] = pad_ref?.resolve() ? TRUE : FALSE - .["sending"] = sending - .["status_report"] = status_report - .["id_inserted"] = inserted_scan_id - if(inserted_scan_id?.registered_account) - if(inserted_scan_id.registered_account.civilian_bounty) - .["id_bounty_info"] = inserted_scan_id.registered_account.civilian_bounty.description - .["id_bounty_num"] = inserted_scan_id.registered_account.bounty_num() - .["id_bounty_value"] = (inserted_scan_id.registered_account.civilian_bounty.reward) * (CIV_BOUNTY_SPLIT/100) - if(inserted_scan_id.registered_account.bounties) - .["picking"] = TRUE - .["id_bounty_names"] = list(inserted_scan_id.registered_account.bounties[1].name, - inserted_scan_id.registered_account.bounties[2].name, - inserted_scan_id.registered_account.bounties[3].name) - .["id_bounty_values"] = list(inserted_scan_id.registered_account.bounties[1].reward * (CIV_BOUNTY_SPLIT/100), - inserted_scan_id.registered_account.bounties[2].reward * (CIV_BOUNTY_SPLIT/100), - inserted_scan_id.registered_account.bounties[3].reward * (CIV_BOUNTY_SPLIT/100)) - else - .["picking"] = FALSE - - return - -/obj/machinery/computer/piratepad_control/civilian/ui_act(action, params) - . = ..() - if(.) - return - if(!pad_ref?.resolve()) - return - if(!usr.canUseTopic(src, USE_CLOSE|USE_SILICON_REACH) || (machine_stat & (NOPOWER|BROKEN))) - return - switch(action) - if("recalc") - recalc() - if("send") - start_sending() - if("stop") - stop_sending() - if("pick") - pick_bounty(params["value"]) - if("bounty") - add_bounties() - if("eject") - id_eject(usr, inserted_scan_id) - inserted_scan_id = null - . = TRUE - -///Self explanitory, holds the ID card in the console for bounty payout and manipulation. -/obj/machinery/computer/piratepad_control/civilian/proc/id_insert(mob/user, obj/item/inserting_item, obj/item/target) - var/obj/item/card/id/card_to_insert = inserting_item - var/holder_item = FALSE - - if(!isidcard(card_to_insert)) - card_to_insert = inserting_item.RemoveID() - holder_item = TRUE - - if(!card_to_insert || !user.transferItemToLoc(card_to_insert, src)) - return FALSE - - if(target) - if(holder_item && inserting_item.InsertID(target)) - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) - else - id_eject(user, target) - - user.visible_message(span_notice("[user] inserts \the [card_to_insert] into \the [src]."), - span_notice("You insert \the [card_to_insert] into \the [src].")) - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) - ui_interact(user) - return TRUE - -///Removes A stored ID card. -/obj/machinery/computer/piratepad_control/civilian/proc/id_eject(mob/user, obj/target) - if(!target) - to_chat(user, span_warning("That slot is empty!")) - return FALSE - else - target.forceMove(drop_location()) - if(!issilicon(user) && Adjacent(user)) - user.put_in_hands(target) - user.visible_message(span_notice("[user] gets \the [target] from \the [src]."), \ - span_notice("You get \the [target] from \the [src].")) - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) - inserted_scan_id = null - return TRUE - -///Upon completion of a civilian bounty, one of these is created. It is sold to cargo to give the cargo budget bounty money, and the person who completed it cash. -/obj/item/bounty_cube - name = "bounty cube" - desc = "A bundle of compressed hardlight data, containing a completed bounty. Sell this on the cargo shuttle to claim it!" - icon = 'icons/obj/economy.dmi' - icon_state = "bounty_cube" - ///Value of the bounty that this bounty cube sells for. - var/bounty_value = 0 - ///Multiplier for the bounty payout received by the Supply budget if the cube is sent without having to nag. - var/speed_bonus = 0.2 - ///Multiplier for the bounty payout received by the person who completed the bounty. - var/holder_cut = 0.3 - ///Multiplier for the bounty payout received by the person who claims the handling tip. - var/handler_tip = 0.1 - ///Time between nags. - var/nag_cooldown = 5 MINUTES - ///How much the time between nags extends each nag. - var/nag_cooldown_multiplier = 1.25 - ///Next world tick to nag Supply listeners. - var/next_nag_time - ///Who completed the bounty. - var/bounty_holder - ///What job the bounty holder had. - var/bounty_holder_job - ///What the bounty was for. - var/bounty_name - ///Bank account of the person who completed the bounty. - var/datum/bank_account/bounty_holder_account - ///Bank account of the person who receives the handling tip. - var/datum/bank_account/bounty_handler_account - ///Our internal radio. - var/obj/item/radio/radio - ///The key our internal radio uses. - var/radio_key = /obj/item/encryptionkey/headset_cargo - -/obj/item/bounty_cube/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_NO_BARCODES, INNATE_TRAIT) // Don't allow anyone to override our pricetag component with a barcode - radio = new(src) - radio.keyslot = new radio_key - radio.set_listening(FALSE, TRUE) - radio.recalculateChannels() - RegisterSignal(radio, COMSIG_ITEM_PRE_EXPORT, PROC_REF(on_export)) - -/obj/item/bounty_cube/Destroy() - if(radio) - UnregisterSignal(radio, COMSIG_ITEM_PRE_EXPORT) - QDEL_NULL(radio) - return ..() - -/obj/item/bounty_cube/examine() - . = ..() - if(speed_bonus) - . += span_notice("[time2text(next_nag_time - world.time,"mm:ss")] remains until [bounty_value * speed_bonus] credit speedy delivery bonus lost.") - if(handler_tip && !bounty_handler_account) - . += span_notice("Scan this in the cargo shuttle with an export scanner to register your bank account for the [bounty_value * handler_tip] credit handling tip.") - -/* - * Signal proc for [COMSIG_ITEM_EXPORTED], registered on the internal radio. - * - * Deletes the internal radio before being exported, - * to stop it from bring counted as an export. - * - * No 4 free credits for you! - */ -/obj/item/bounty_cube/proc/on_export(datum/source) - SIGNAL_HANDLER - - QDEL_NULL(radio) - return COMPONENT_STOP_EXPORT // stops the radio from exporting, not the cube - -/obj/item/bounty_cube/process(delta_time) - //if our nag cooldown has finished and we aren't on Centcom or in transit, then nag - if(COOLDOWN_FINISHED(src, next_nag_time) && !is_centcom_level(z) && !is_reserved_level(z)) - //set up our nag message - var/nag_message = "[src] is unsent in [get_area(src)]." - - //nag on Supply channel and reduce the speed bonus multiplier to nothing - var/speed_bonus_lost = "[speed_bonus ? " Speedy delivery bonus of [bounty_value * speed_bonus] credit\s lost." : ""]" - radio.talk_into(src, "[nag_message][speed_bonus_lost]", RADIO_CHANNEL_SUPPLY) - speed_bonus = 0 - - //alert the holder - bounty_holder_account.bank_card_talk("[nag_message]") - - //if someone has registered for the handling tip, nag them - bounty_handler_account?.bank_card_talk(nag_message) - - //increase our cooldown length and start it again - nag_cooldown = nag_cooldown * nag_cooldown_multiplier - COOLDOWN_START(src, next_nag_time, nag_cooldown) - -/obj/item/bounty_cube/proc/set_up(datum/bounty/my_bounty, obj/item/card/id/holder_id) - bounty_value = my_bounty.reward - bounty_name = my_bounty.name - bounty_holder = holder_id.registered_name - bounty_holder_job = holder_id.assignment - bounty_holder_account = holder_id.registered_account - name = "\improper [bounty_value] cr [name]" - desc += " The sales tag indicates it was [bounty_holder] ([bounty_holder_job])'s reward for completing the [bounty_name] bounty." - AddComponent(/datum/component/pricetag, holder_id.registered_account, holder_cut, FALSE) - AddComponent(/datum/component/gps, "[src]") - START_PROCESSING(SSobj, src) - COOLDOWN_START(src, next_nag_time, nag_cooldown) - radio.talk_into(src,"Created in [get_area(src)] by [bounty_holder] ([bounty_holder_job]). Speedy delivery bonus lost in [time2text(next_nag_time - world.time,"mm:ss")].", RADIO_CHANNEL_SUPPLY) - -//for when you need a REAL bounty cube to test with and don't want to do a bounty each time your code changes -/obj/item/bounty_cube/debug_cube - name = "debug bounty cube" - desc = "Use in-hand to set it up with a random bounty. Requires an ID it can detect with a bank account attached. \ - This will alert Supply over the radio with your name and location, and cargo techs will be dispatched with kill on sight clearance." - var/set_up = FALSE - -/obj/item/bounty_cube/debug_cube/attack_self(mob/user) - if(!isliving(user)) - to_chat(user, span_warning("You aren't eligible to use this!")) - return ..() - - if(!set_up) - var/mob/living/squeezer = user - if(squeezer.get_bank_account()) - set_up(random_bounty(), squeezer.get_idcard()) - set_up = TRUE - return ..() - to_chat(user, span_notice("It can't detect your bank account.")) - - return ..() - -///Beacon to launch a new bounty setup when activated. -/obj/item/civ_bounty_beacon - name = "civilian bounty beacon" - desc = "N.T. approved civilian bounty beacon, toss it down and you will have a bounty pad and computer delivered to you." - icon = 'icons/obj/objects.dmi' - icon_state = "floor_beacon" - var/uses = 2 - -/obj/item/civ_bounty_beacon/attack_self() - loc.visible_message(span_warning("\The [src] begins to beep loudly!")) - addtimer(CALLBACK(src, PROC_REF(launch_payload)), 1 SECONDS) - -/obj/item/civ_bounty_beacon/proc/launch_payload() - playsound(src, SFX_SPARKS, 80, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - switch(uses) - if(2) - new /obj/machinery/piratepad/civilian(drop_location()) - if(1) - new /obj/machinery/computer/piratepad_control/civilian(drop_location()) - qdel(src) - uses-- diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 3dcb49b68e07..74b2e491a62b 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -530,23 +530,30 @@ What a mess.*/ if("Pay") for(var/datum/data/crime/p in active2.fields["citation"]) if(p.dataId == text2num(href_list["cdataid"])) - var/obj/item/holochip/C = usr.is_holding_item_of_type(/obj/item/holochip) - if(C && istype(C)) - var/pay = C.get_item_credit_value() - if(!pay) - to_chat(usr, span_warning("[C] doesn't seem to be worth anything!")) - else - var/diff = p.fine - p.paid - GLOB.data_core.payCitation(active2.fields["id"], text2num(href_list["cdataid"]), pay) - to_chat(usr, span_notice("You have paid [pay] credit\s towards your fine.")) - if (pay == diff || pay > diff || pay >= diff) - investigate_log("Citation Paid off: [p.crimeName] Fine: [p.fine] | Paid off by [key_name(usr)]", INVESTIGATE_RECORDS) - to_chat(usr, span_notice("The fine has been paid in full.")) - SSblackbox.ReportCitation(text2num(href_list["cdataid"]),"","","","", 0, pay) - qdel(C) - playsound(src, SFX_TERMINAL_TYPE, 25, FALSE) + var/obj/item/stack/spacecash/S = usr.is_holding_item_of_type(/obj/item/stack/spacecash) + if(!istype(S)) + return TRUE + + var/pay = S.get_item_credit_value() + if(!pay) + to_chat(usr, span_warning("[S] doesn't seem to be worth anything!")) else - to_chat(usr, span_warning("Fines can only be paid with holochips!")) + var/diff = p.fine - p.paid + GLOB.data_core.payCitation(active2.fields["id"], text2num(href_list["cdataid"]), pay) + to_chat(usr, span_notice("You have paid [pay] credit\s towards your fine.")) + if (pay == diff || pay > diff || pay >= diff) + investigate_log("Citation Paid off: [p.crimeName] Fine: [p.fine] | Paid off by [key_name(usr)]", INVESTIGATE_RECORDS) + to_chat(usr, span_notice("The fine has been paid in full.")) + + var/overflow = pay - diff + if(overflow) + SSeconomy.spawn_cash_for_amount(overflow, drop_location()) + + SSblackbox.ReportCitation(text2num(href_list["cdataid"]),"","","","", 0, pay) + qdel(S) + playsound(src, SFX_TERMINAL_TYPE, 25, FALSE) + else + to_chat(usr, span_warning("Fines can only be paid with holochips!")) if("Print Record") if(!( printing )) diff --git a/code/game/machinery/computer/warrant.dm b/code/game/machinery/computer/warrant.dm index 8976317d5069..1e2e7faa28bf 100644 --- a/code/game/machinery/computer/warrant.dm +++ b/code/game/machinery/computer/warrant.dm @@ -116,8 +116,8 @@ if("Pay") for(var/datum/data/crime/p in current.fields["citation"]) if(p.dataId == text2num(href_list["cdataid"])) - var/obj/item/holochip/C = M.is_holding_item_of_type(/obj/item/holochip) - if(C && istype(C)) + var/obj/item/stack/spacecash/C = M.is_holding_item_of_type(/obj/item/stack/spacecash) + if(istype(C)) var/pay = C.get_item_credit_value() if(!pay) to_chat(M, span_warning("[C] doesn't seem to be worth anything!")) @@ -128,6 +128,10 @@ if (pay == diff || pay > diff || pay >= diff) investigate_log("Citation Paid off: [p.crimeName] Fine: [p.fine] | Paid off by [key_name(usr)]", INVESTIGATE_RECORDS) to_chat(M, span_notice("The fine has been paid in full.")) + + var/overflow = pay - diff + if(overflow) + SSeconomy.spawn_cash_for_amount(overflow, drop_location()) SSblackbox.ReportCitation(text2num(href_list["cdataid"]),"","","","", 0, pay) qdel(C) playsound(src, SFX_TERMINAL_TYPE, 25, FALSE) diff --git a/code/game/machinery/fax_machine.dm b/code/game/machinery/fax_machine.dm index ad40d67076ca..dae60acdce19 100644 --- a/code/game/machinery/fax_machine.dm +++ b/code/game/machinery/fax_machine.dm @@ -509,7 +509,11 @@ GLOBAL_LIST_EMPTY(fax_machines) playsound(src, 'sound/machines/buzz-sigh.ogg', 50) . = FALSE else - new /obj/item/holochip(drop_location(), rand(15, 25)) + if(prob(50)) + new /obj/item/stack/spacecash/c10(drop_location()) + else + new /obj/item/stack/spacecash/c20(drop_location()) + playsound(src, 'sound/machines/ping.ogg', 60) . = TRUE diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm index c11004db4f50..8ecdf3b19601 100644 --- a/code/game/machinery/slotmachine.dm +++ b/code/game/machinery/slotmachine.dm @@ -11,8 +11,6 @@ #define SPIN_TIME 65 //As always, deciseconds. #define REEL_DEACTIVATE_DELAY 7 #define SEVEN "7" -#define HOLOCHIP 1 -#define COIN 2 /obj/machinery/computer/slot_machine name = "slot machine" @@ -29,7 +27,6 @@ var/working = FALSE var/balance = 0 //How much money is in the machine, ready to be CONSUMED. var/jackpots = 0 - var/paymode = HOLOCHIP //toggles between HOLOCHIP/COIN, defined above var/cointype = /obj/item/coin/iron //default cointype var/static/list/coinvalues = list() var/list/reels = list(list("", "", "") = 0, list("", "", "") = 0, list("", "", "") = 0, list("", "", "") = 0, list("", "", "") = 0) @@ -84,48 +81,25 @@ return ..() /obj/machinery/computer/slot_machine/attackby(obj/item/I, mob/living/user, params) - if(istype(I, /obj/item/coin)) - var/obj/item/coin/C = I - if(paymode == COIN) - if(prob(2)) - if(!user.transferItemToLoc(C, drop_location(), silent = FALSE)) - return - C.throw_at(user, 3, 10) - if(prob(10)) - balance = max(balance - SPIN_PRICE, 0) - to_chat(user, span_warning("[src] spits your coin back out!")) - - else - if(!user.temporarilyRemoveItemFromInventory(C)) - return - to_chat(user, span_notice("You insert [C] into [src]'s slot!")) - balance += C.value - qdel(C) - else - to_chat(user, span_warning("This machine is only accepting holochips!")) - else if(istype(I, /obj/item/holochip)) - if(paymode == HOLOCHIP) - var/obj/item/holochip/H = I - if(!user.temporarilyRemoveItemFromInventory(H)) - return - to_chat(user, span_notice("You insert [H.credits] holocredits into [src]'s slot!")) - balance += H.credits - qdel(H) - else - to_chat(user, span_warning("This machine is only accepting coins!")) - else if(I.tool_behaviour == TOOL_MULTITOOL) - if(balance > 0) - visible_message("[src] says, 'ERROR! Please empty the machine balance before altering paymode'") //Prevents converting coins into holocredits and vice versa - else - if(paymode == HOLOCHIP) - paymode = COIN - visible_message("[src] says, 'This machine now works with COINS!'") - else - paymode = HOLOCHIP - visible_message("[src] says, 'This machine now works with HOLOCHIPS!'") - else + if(!istype(I, /obj/item/coin)) return ..() + var/obj/item/coin/C = I + if(prob(2)) + if(!user.transferItemToLoc(C, drop_location(), silent = FALSE)) + return + C.throw_at(user, 3, 10) + if(prob(10)) + balance = max(balance - SPIN_PRICE, 0) + to_chat(user, span_warning("[src] spits your coin back out!")) + + else + if(!user.temporarilyRemoveItemFromInventory(C)) + return + to_chat(user, span_notice("You insert [C] into [src]'s slot!")) + balance += C.value + qdel(C) + /obj/machinery/computer/slot_machine/emag_act() if(obj_flags & EMAGGED) return @@ -268,13 +242,10 @@ jackpots += 1 balance += money - give_payout(JACKPOT) money = 0 - if(paymode == HOLOCHIP) - new /obj/item/holochip(loc,JACKPOT) - else - for(var/i in 1 to 5) - cointype = pick(subtypesof(/obj/item/coin)) - var/obj/item/coin/C = new cointype(loc) - random_step(C, 2, 50) + for(var/i in 1 to 5) + cointype = pick(subtypesof(/obj/item/coin)) + var/obj/item/coin/C = new cointype(loc) + random_step(C, 2, 50) else if(linelength == 5) visible_message("[src] says, 'Big Winner! You win a thousand credits!'") @@ -318,10 +289,7 @@ balance += surplus /obj/machinery/computer/slot_machine/proc/give_payout(amount) - if(paymode == HOLOCHIP) - cointype = /obj/item/holochip - else - cointype = obj_flags & EMAGGED ? /obj/item/coin/iron : /obj/item/coin/silver + cointype = obj_flags & EMAGGED ? /obj/item/coin/iron : /obj/item/coin/silver if(!(obj_flags & EMAGGED)) amount = dispense(amount, cointype, null, 0) @@ -334,22 +302,16 @@ return amount /obj/machinery/computer/slot_machine/proc/dispense(amount = 0, cointype = /obj/item/coin/silver, mob/living/target, throwit = 0) - if(paymode == HOLOCHIP) - var/obj/item/holochip/H = new /obj/item/holochip(loc,amount) - + var/value = coinvalues["[cointype]"] + if(value <= 0) + CRASH("Coin value of zero, refusing to payout in dispenser") + while(amount >= value) + var/obj/item/coin/C = new cointype(loc) //DOUBLE THE PAIN + amount -= value if(throwit && target) - H.throw_at(target, 3, 10) - else - var/value = coinvalues["[cointype]"] - if(value <= 0) - CRASH("Coin value of zero, refusing to payout in dispenser") - while(amount >= value) - var/obj/item/coin/C = new cointype(loc) //DOUBLE THE PAIN - amount -= value - if(throwit && target) - C.throw_at(target, 3, 10) - else - random_step(C, 2, 40) + C.throw_at(target, 3, 10) + else + random_step(C, 2, 40) return amount @@ -359,5 +321,3 @@ #undef BIG_PRIZE #undef SMALL_PRIZE #undef SPIN_PRICE -#undef HOLOCHIP -#undef COIN diff --git a/code/game/objects/effects/effect_system/effect_system.dm b/code/game/objects/effects/effect_system/effect_system.dm index 8fb5d73807e0..74047ac9a466 100644 --- a/code/game/objects/effects/effect_system/effect_system.dm +++ b/code/game/objects/effects/effect_system/effect_system.dm @@ -65,7 +65,7 @@ would spawn and follow the beaker, even if it is carried or thrown. else direction = pick(GLOB.alldirs) var/step_amt = pick(1,2,3) - var/step_delay = 5 + var/step_delay = 3 var/datum/move_loop/loop = SSmove_manager.move(effect, direction, step_delay, timeout = step_delay * step_amt, priority = MOVEMENT_ABOVE_SPACE_PRIORITY) RegisterSignal(loop, COMSIG_PARENT_QDELETING, PROC_REF(decrement_total_effect)) diff --git a/code/game/objects/effects/spawners/random/entertainment.dm b/code/game/objects/effects/spawners/random/entertainment.dm index 0f005d255854..3d0a273ad222 100644 --- a/code/game/objects/effects/spawners/random/entertainment.dm +++ b/code/game/objects/effects/spawners/random/entertainment.dm @@ -83,7 +83,6 @@ /obj/item/stack/spacecash/c1 = 10, /obj/item/stack/spacecash/c10 = 5, /obj/item/stack/spacecash/c20 = 3, - /obj/item/stack/spacecash/c50 = 2, /obj/item/stack/spacecash/c100 = 1, ) @@ -96,10 +95,7 @@ /obj/item/stack/spacecash/c1 = 100, /obj/item/stack/spacecash/c10 = 80, /obj/item/stack/spacecash/c20 = 60, - /obj/item/stack/spacecash/c50 = 40, /obj/item/stack/spacecash/c100 = 30, - /obj/item/stack/spacecash/c200 = 20, - /obj/item/stack/spacecash/c500 = 10, /obj/item/stack/spacecash/c1000 = 5, /obj/item/stack/spacecash/c10000 = 1, ) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 37174c4b4dcc..ef90559f64ea 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -617,7 +617,7 @@ DEFINE_INTERACTABLE(/obj/item) R.hud_used.update_robot_modules_display() /obj/item/attackby(obj/item/item, mob/living/user, params) - if(user.try_slapcraft(src, item)) + if(user?.try_slapcraft(src, item)) return TRUE return ..() diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index c3a6876c7660..94d9494bf523 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -7,8 +7,6 @@ /// Fallback time if none of the config entries are set for USE_LOW_LIVING_HOUR_INTERN #define INTERN_THRESHOLD_FALLBACK_HOURS 15 -/// Max time interval between projecting holopays -#define HOLOPAY_PROJECTION_INTERVAL 7 SECONDS /* Cards * Contains: @@ -58,30 +56,10 @@ /// How many magical mining Disney Dollars this card has for spending at the mining equipment vendors. var/mining_points = 0 + /// Linked bank account. var/datum/bank_account/registered_account - /// Linked holopay. - var/obj/structure/holopay/my_store - /// Cooldown between projecting holopays - COOLDOWN_DECLARE(last_holopay_projection) - /// List of logos available for holopay customization - via font awesome 5 - var/static/list/available_logos = list("angry", "ankh", "bacon", "band-aid", "cannabis", "cat", "cocktail", "coins", "comments-dollar", - "cross", "cut", "dog", "donate", "dna", "fist-raised", "flask", "glass-cheers", "glass-martini-alt", "hamburger", "hand-holding-usd", - "hat-wizard", "head-side-cough-slash", "heart", "heart-broken", "laugh-beam", "leaf", "money-check-alt", "music", "piggy-bank", - "pizza-slice", "prescription-bottle-alt", "radiation", "robot", "smile", "skull-crossbones", "smoking", "space-shuttle", "tram", - "trash", "user-ninja", "utensils", "wrench") - /// Replaces the "pay whatever" functionality with a set amount when non-zero. - var/holopay_fee = 0 - /// The holopay icon chosen by the user - var/holopay_logo = "donate" - /// Maximum forced fee. It's unlikely for a user to encounter this type of money, much less pay it willingly. - var/holopay_max_fee = 5000 - /// Minimum forced fee for holopay stations. Registers as "pay what you want." - var/holopay_min_fee = 0 - /// The holopay name chosen by the user - var/holopay_name = "holographic pay stand" - /// The name registered on the card (for example: Dr Bryan See) var/registered_name = null /// The name used in the ID UI. See update_label() @@ -130,13 +108,9 @@ register_context() - RegisterSignal(src, COMSIG_ATOM_UPDATED_ICON, PROC_REF(update_in_wallet)) - /obj/item/card/id/Destroy() if (registered_account) registered_account.bank_cards -= src - if (my_store) - QDEL_NULL(my_store) return ..() /obj/item/card/id/get_id_examine_strings(mob/user) @@ -421,21 +395,6 @@ show(user) add_fingerprint(user) -/obj/item/card/id/afterattack_secondary(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) - return - if(!proximity_flag || !check_allowed_items(target) || !isfloorturf(target)) - return - try_project_paystand(user, target) - -/obj/item/card/id/attack_self_secondary(mob/user, modifiers) - . = ..() - if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) - return - try_project_paystand(user) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - /obj/item/card/id/add_context(atom/source, list/context, obj/item/held_item, mob/user) . = ..() @@ -443,101 +402,8 @@ return context[SCREENTIP_CONTEXT_LMB] = "Show ID" - context[SCREENTIP_CONTEXT_RMB] = "Project pay stand" return CONTEXTUAL_SCREENTIP_SET -/obj/item/card/id/proc/try_project_paystand(mob/user, turf/target) - if(!COOLDOWN_FINISHED(src, last_holopay_projection)) - balloon_alert(user, "still recharging") - return - if(!registered_account || !registered_account.account_job) - balloon_alert(user, "no account") - to_chat(user, span_warning("You need a valid bank account to do this.")) - return - /// Determines where the holopay will be placed based on tile contents - var/turf/projection - var/turf/step_ahead = get_step(user, user.dir) - var/turf/user_loc = user.loc - if(target && can_proj_holopay(target)) - projection = target - else if(can_proj_holopay(step_ahead)) - projection = step_ahead - else if(can_proj_holopay(user_loc)) - projection = user_loc - if(!projection) - balloon_alert(user, "no space") - to_chat(user, span_warning("You need to be standing on or near an open tile to do this.")) - return - /// Success: Valid tile for holopay placement - if(my_store) - my_store.dissipate() - var/obj/structure/holopay/new_store = new(projection) - if(new_store?.assign_card(projection, src)) - COOLDOWN_START(src, last_holopay_projection, HOLOPAY_PROJECTION_INTERVAL) - playsound(projection, "sound/effects/empulse.ogg", 40, TRUE) - my_store = new_store - -/** - * Determines whether a new holopay can be placed on the given turf. - * Checks if there are dense contents, too many contents, or another - * holopay already exists on the turf. - * - * Arguments: - * * turf/target - The target turf to be checked for dense contents - * Returns: - * * TRUE if the target is a valid holopay location, FALSE otherwise. - */ -/obj/item/card/id/proc/can_proj_holopay(turf/target) - if(!isfloorturf(target)) - return FALSE - if(target.density) - return FALSE - if(length(target.contents) > 5) - return FALSE - for(var/obj/checked_obj in target.contents) - if(checked_obj.density) - return FALSE - if(istype(checked_obj, /obj/structure/holopay)) - return FALSE - return TRUE - -/** - * Setter for the shop logo on linked holopays - * - * Arguments: - * * new_logo - The new logo to be set. - */ -/obj/item/card/id/proc/set_holopay_logo(new_logo) - if(!available_logos.Find(new_logo)) - CRASH("User input a holopay shop logo that didn't exist.") - holopay_logo = new_logo - -/** - * Setter for changing the force fee on a holopay. - * - * Arguments: - * * new_fee - The new fee to be set. - */ -/obj/item/card/id/proc/set_holopay_fee(new_fee) - if(!isnum(new_fee)) - CRASH("User input a non number into the holopay fee field.") - if(new_fee < holopay_min_fee || new_fee > holopay_max_fee) - CRASH("User input a number outside of the valid range into the holopay fee field.") - holopay_fee = new_fee - -/** - * Setter for changing the holopay name. - * - * Arguments: - * * new_name - The new name to be set. - */ -/obj/item/card/id/proc/set_holopay_name(name) - if(length(name) < 3 || length(name) > MAX_NAME_LEN) - to_chat(usr, span_warning("Must be between 3 - 42 characters.")) - else - holopay_name = html_encode(trim(name, MAX_NAME_LEN)) - - /obj/item/card/id/vv_edit_var(var_name, var_value) . = ..() if(.) @@ -549,84 +415,8 @@ if(ispath(trim)) SSid_access.apply_trim_to_card(src, trim) -/obj/item/card/id/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/rupee)) - to_chat(user, span_warning("Your ID smartly rejects the strange shard of glass. Who knew, apparently it's not ACTUALLY valuable!")) - return - else if(iscash(W)) - insert_money(W, user) - return - else if(istype(W, /obj/item/storage/bag/money)) - var/obj/item/storage/bag/money/money_bag = W - var/list/money_contained = money_bag.contents - var/money_added = mass_insert_money(money_contained, user) - if (money_added) - to_chat(user, span_notice("You stuff the contents into the card! They disappear in a puff of bluespace smoke, adding [money_added] worth of credits to the linked account.")) - return - else - return ..() - -/** - * Insert credits or coins into the ID card and add their value to the associated bank account. - * - * Arguments: - * money - The item to attempt to convert to credits and insert into the card. - * user - The user inserting the item. - * physical_currency - Boolean, whether this is a physical currency such as a coin and not a holochip. - */ -/obj/item/card/id/proc/insert_money(obj/item/money, mob/user) - var/physical_currency - if(istype(money, /obj/item/stack/spacecash) || istype(money, /obj/item/coin)) - physical_currency = TRUE - - if(!registered_account) - to_chat(user, span_warning("[src] doesn't have a linked account to deposit [money] into!")) - return - var/cash_money = money.get_item_credit_value() - if(!cash_money) - to_chat(user, span_warning("[money] doesn't seem to be worth anything!")) - return - registered_account.adjust_money(cash_money) - SSblackbox.record_feedback("amount", "credits_inserted", cash_money) - log_econ("[cash_money] credits were inserted into [src] owned by [src.registered_name]") - if(physical_currency) - to_chat(user, span_notice("You stuff [money] into [src]. It disappears in a small puff of bluespace smoke, adding [cash_money] credits to the linked account.")) - else - to_chat(user, span_notice("You insert [money] into [src], adding [cash_money] credits to the linked account.")) - - to_chat(user, span_notice("The linked account now reports a balance of [registered_account.account_balance] cr.")) - qdel(money) - -/** - * Insert multiple money or money-equivalent items at once. - * - * Arguments: - * money - List of items to attempt to convert to credits and insert into the card. - * user - The user inserting the items. - */ -/obj/item/card/id/proc/mass_insert_money(list/money, mob/user) - if(!registered_account) - to_chat(user, span_warning("[src] doesn't have a linked account to deposit into!")) - return FALSE - - if (!money || !length(money)) - return FALSE - - var/total = 0 - - for (var/obj/item/physical_money in money) - total += physical_money.get_item_credit_value() - CHECK_TICK - - registered_account.adjust_money(total) - SSblackbox.record_feedback("amount", "credits_inserted", total) - log_econ("[total] credits were inserted into [src] owned by [src.registered_name]") - QDEL_LIST(money) - - return total - -/// Helper proc. Can the user alt-click the ID? -/obj/item/card/id/proc/alt_click_can_use_id(mob/living/user) +/// Helper proc. Can the user interact with the ID? +/obj/item/card/id/proc/can_use_id(mob/living/user) if(!isliving(user)) return if(!user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) @@ -641,52 +431,29 @@ if(loc != user) to_chat(user, span_warning("You must be holding the ID to continue!")) return FALSE + var/new_bank_id = tgui_input_number(user, "Enter your account ID number", "Account Reclamation", 111111, 999999, 111111) - if(!new_bank_id || QDELETED(user) || QDELETED(src) || issilicon(user) || !alt_click_can_use_id(user) || loc != user) + if(!new_bank_id || QDELETED(user) || QDELETED(src) || issilicon(user) || !can_use_id(user) || loc != user) return FALSE + if(registered_account?.account_id == new_bank_id) to_chat(user, span_warning("The account ID was already assigned to this card.")) return FALSE + var/datum/bank_account/account = SSeconomy.bank_accounts_by_id["[new_bank_id]"] if(isnull(account)) to_chat(user, span_warning("The account ID number provided is invalid.")) return FALSE + if(old_account) old_account.bank_cards -= src account.account_balance += old_account.account_balance + account.bank_cards += src registered_account = account to_chat(user, span_notice("The provided account has been linked to this ID card. It contains [account.account_balance] credits.")) return TRUE -/obj/item/card/id/AltClick(mob/living/user) - if(!alt_click_can_use_id(user)) - return - if(!registered_account || registered_account.replaceable) - set_new_account(user) - return - if (registered_account.being_dumped) - registered_account.bank_card_talk(span_warning("内部服务器错误"), TRUE) - return - if(loc != user) - to_chat(user, span_warning("You must be holding the ID to continue!")) - return - var/amount_to_remove = tgui_input_number(user, "How much do you want to withdraw? (Max: [registered_account.account_balance] cr)", "Withdraw Funds", max_value = registered_account.account_balance) - if(!amount_to_remove || QDELETED(user) || QDELETED(src) || issilicon(user) || loc != user) - return - if(!alt_click_can_use_id(user)) - return - if(registered_account.adjust_money(-amount_to_remove)) - var/obj/item/holochip/holochip = new (user.drop_location(), amount_to_remove) - user.put_in_hands(holochip) - to_chat(user, span_notice("You withdraw [amount_to_remove] credits into a holochip.")) - SSblackbox.record_feedback("amount", "credits_removed", amount_to_remove) - log_econ("[amount_to_remove] credits were removed from [src] owned by [src.registered_name]") - return - else - var/difference = amount_to_remove - registered_account.account_balance - registered_account.bank_card_talk(span_warning("ERROR: The linked account requires [difference] more credit\s to perform that withdrawal."), TRUE) - /obj/item/card/id/examine(mob/user) . = ..() . += "\[Look at ID\]" @@ -723,22 +490,12 @@ /obj/item/card/id/GetAccess() return access.Copy() -/obj/item/card/id/GetID() +/obj/item/card/id/GetID(bypass_wallet) return src /obj/item/card/id/RemoveID() return src -/// Called on COMSIG_ATOM_UPDATED_ICON. Updates the visuals of the wallet this card is in. -/obj/item/card/id/proc/update_in_wallet() - SIGNAL_HANDLER - - if(istype(loc, /obj/item/storage/wallet)) - var/obj/item/storage/wallet/powergaming = loc - if(powergaming.front_id == src) - powergaming.update_label() - powergaming.update_appearance() - /// Updates the name based on the card's vars and state. /obj/item/card/id/proc/update_label() var/name_string = registered_name ? "[registered_name]'s ID Card" : initial(name) @@ -883,9 +640,6 @@ department_name = ACCOUNT_CAR_NAME icon_state = "car_budget" //saving up for a new tesla -/obj/item/card/id/departmental_budget/AltClick(mob/living/user) - registered_account.bank_card_talk(span_warning("Withdrawing is not compatible with this card design."), TRUE) //prevents the vault bank machine being useless and putting money from the budget to your card to go over personal crates - /obj/item/card/id/advanced name = "identification card" desc = "A card used to provide ID and determine access across the station. Has an integrated digital display and advanced microchips." diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index ac86c642ab73..c474e8bb7c2c 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -332,10 +332,6 @@ name = "Salvage Pod Recall (Computer Board)" build_path = /obj/machinery/computer/shuttle/white_ship/pod/recall -/obj/item/circuitboard/computer/bountypad - name = "Bounty Pad (Computer Board)" - build_path = /obj/machinery/computer/piratepad_control/civilian - /obj/item/circuitboard/computer/tram_controls name = "Tram Controls (Computer Board)" build_path = /obj/machinery/computer/tram_controls diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index 2e756322efb1..c825f1c7f2f0 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -586,16 +586,6 @@ /obj/item/stack/sheet/glass = 1, /obj/item/vending_refill/donksoft = 1) -/obj/item/circuitboard/machine/bountypad - name = "Civilian Bounty Pad (Machine Board)" - greyscale_colors = CIRCUIT_COLOR_GENERIC - build_path = /obj/machinery/piratepad/civilian - req_components = list( - /obj/item/stock_parts/card_reader = 1, - /obj/item/stock_parts/scanning_module = 1, - /obj/item/stock_parts/micro_laser = 1 - ) - //Medical /obj/item/circuitboard/machine/chem_dispenser diff --git a/code/game/objects/items/credit_holochip.dm b/code/game/objects/items/credit_holochip.dm deleted file mode 100644 index 25667d753272..000000000000 --- a/code/game/objects/items/credit_holochip.dm +++ /dev/null @@ -1,129 +0,0 @@ -/obj/item/holochip - name = "credit holochip" - desc = "A hard-light chip encoded with an amount of credits. It is a modern replacement for physical money that can be directly converted to virtual currency and viceversa. Keep away from magnets." - icon = 'icons/obj/economy.dmi' - icon_state = "holochip" - base_icon_state = "holochip" - throwforce = 0 - force = 0 - w_class = WEIGHT_CLASS_TINY - var/credits = 0 - -/obj/item/holochip/Initialize(mapload, amount) - . = ..() - if(amount) - credits = amount - update_appearance() - -/obj/item/holochip/examine(mob/user) - . = ..() - . += "[span_notice("It's loaded with [credits] credit[( credits > 1 ) ? "s" : ""]")]\n"+\ - span_notice("Alt-Click to split.") - -/obj/item/holochip/get_item_credit_value() - return credits - -/obj/item/holochip/update_name() - name = "\improper [credits] credit holochip" - return ..() - -/obj/item/holochip/update_icon_state() - var/icon_suffix = "" - switch(credits) - if(1e3 to (1e6 - 1)) - icon_suffix = "_kilo" - if(1e6 to (1e9 - 1)) - icon_suffix = "_mega" - if(1e9 to INFINITY) - icon_suffix = "_giga" - - icon_state = "[base_icon_state][icon_suffix]" - return ..() - -/obj/item/holochip/update_overlays() - . = ..() - var/rounded_credits - switch(credits) - if(0 to (1e3 - 1)) - rounded_credits = round(credits) - if(1e3 to (1e6 - 1)) - rounded_credits = round(credits * 1e-3) - if(1e6 to (1e9 - 1)) - rounded_credits = round(credits * 1e-6) - if(1e9 to INFINITY) - rounded_credits = round(credits * 1e-9) - - var/overlay_color = "#914792" - switch(rounded_credits) - if(0 to 4) - overlay_color = "#8E2E38" - if(5 to 9) - overlay_color = "#914792" - if(10 to 19) - overlay_color = "#BF5E0A" - if(20 to 49) - overlay_color = "#358F34" - if(50 to 99) - overlay_color = "#676767" - if(100 to 199) - overlay_color = "#009D9B" - if(200 to 499) - overlay_color = "#0153C1" - if(500 to INFINITY) - overlay_color = "#2C2C2C" - - var/mutable_appearance/holochip_overlay = mutable_appearance('icons/obj/economy.dmi', "[icon_state]-color") - holochip_overlay.color = overlay_color - . += holochip_overlay - -/obj/item/holochip/proc/spend(amount, pay_anyway = FALSE) - if(credits >= amount) - credits -= amount - if(credits == 0) - qdel(src) - update_appearance() - return amount - else if(pay_anyway) - qdel(src) - return credits - else - return 0 - -/obj/item/holochip/attackby(obj/item/I, mob/user, params) - ..() - if(istype(I, /obj/item/holochip)) - var/obj/item/holochip/H = I - credits += H.credits - to_chat(user, span_notice("You insert the credits into [src].")) - update_appearance() - qdel(H) - -/obj/item/holochip/AltClick(mob/user) - if(!user.canUseTopic(src, USE_CLOSE|USE_DEXTERITY|USE_IGNORE_TK)) - return - if(loc != user) - to_chat(user, span_warning("You must be holding the holochip to continue!")) - return FALSE - var/split_amount = tgui_input_number(user, "How many credits do you want to extract from the holochip? (Max: [credits] cr)", "Holochip", max_value = credits) - if(!split_amount || QDELETED(user) || QDELETED(src) || issilicon(user) || !usr.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK|USE_DEXTERITY) || loc != user) - return - var/new_credits = spend(split_amount, TRUE) - var/obj/item/holochip/H = new(user ? user : drop_location(), new_credits) - if(user) - if(!user.put_in_hands(H)) - H.forceMove(user.drop_location()) - add_fingerprint(user) - H.add_fingerprint(user) - to_chat(user, span_notice("You extract [split_amount] credits into a new holochip.")) - -/obj/item/holochip/emp_act(severity) - . = ..() - if(. & EMP_PROTECT_SELF) - return - var/wipe_chance = 60 / severity - if(prob(wipe_chance)) - visible_message(span_warning("[src] fizzles and disappears!")) - qdel(src) //rip cash - -/obj/item/holochip/thousand - credits = 1000 diff --git a/code/game/objects/items/mail.dm b/code/game/objects/items/mail.dm index 4c11921d011b..d9a358a40fbb 100644 --- a/code/game/objects/items/mail.dm +++ b/code/game/objects/items/mail.dm @@ -20,11 +20,9 @@ var/goodie_count = 1 /// Goodies which can be given to anyone. The base weight for cash is 56. For there to be a 50/50 chance of getting a department item, they need 56 weight as well. var/list/generic_goodies = list( - /obj/item/stack/spacecash/c50 = 10, - /obj/item/stack/spacecash/c100 = 25, - /obj/item/stack/spacecash/c200 = 15, - /obj/item/stack/spacecash/c500 = 5, - /obj/item/stack/spacecash/c1000 = 1, + /obj/item/stack/spacecash/c10 = 50, + /obj/item/stack/spacecash/c20 = 5, + /obj/item/stack/spacecash/c100 = 1, ) // Overlays (pure fluff) /// Does the letter have the postmark overlay? diff --git a/code/game/objects/items/stacks/cash.dm b/code/game/objects/items/stacks/cash.dm index c5f81af758d8..814df9bfa383 100644 --- a/code/game/objects/items/stacks/cash.dm +++ b/code/game/objects/items/stacks/cash.dm @@ -11,9 +11,11 @@ w_class = WEIGHT_CLASS_TINY full_w_class = WEIGHT_CLASS_TINY resistance_flags = FLAMMABLE - var/value = 0 grind_results = list(/datum/reagent/cellulose = 10) + /// How much money one "amount" of this is worth. Use get_item_credit_value(). + VAR_PROTECTED/value = 0 + /obj/item/stack/spacecash/Initialize(mapload, new_amount, merge = TRUE, list/mat_override=null, mat_amt=1) . = ..() update_desc() @@ -34,6 +36,11 @@ . = ..() update_desc() +/// Like use(), but for financial amounts. use_cash(20) on a stack of 10s will use 2. use_cash(22) on a stack of 10s will use 3. +/obj/item/stack/spacecash/proc/use_cash(value_to_pay) + var/amt = ceil(value_to_pay / value) + return use(amt) + /obj/item/stack/spacecash/update_icon_state() . = ..() switch(amount) @@ -64,30 +71,12 @@ value = 20 merge_type = /obj/item/stack/spacecash/c20 -/obj/item/stack/spacecash/c50 - icon_state = "spacecash50" - singular_name = "fifty credit bill" - value = 50 - merge_type = /obj/item/stack/spacecash/c50 - /obj/item/stack/spacecash/c100 icon_state = "spacecash100" singular_name = "one hundred credit bill" value = 100 merge_type = /obj/item/stack/spacecash/c100 -/obj/item/stack/spacecash/c200 - icon_state = "spacecash200" - singular_name = "two hundred credit bill" - value = 200 - merge_type = /obj/item/stack/spacecash/c200 - -/obj/item/stack/spacecash/c500 - icon_state = "spacecash500" - singular_name = "five hundred credit bill" - value = 500 - merge_type = /obj/item/stack/spacecash/c500 - /obj/item/stack/spacecash/c1000 icon_state = "spacecash1000" singular_name = "one thousand credit bill" diff --git a/code/game/objects/items/storage/wallets.dm b/code/game/objects/items/storage/wallets.dm index 0f3ce86c5e41..762ffd5baefe 100644 --- a/code/game/objects/items/storage/wallets.dm +++ b/code/game/objects/items/storage/wallets.dm @@ -1,89 +1,41 @@ /obj/item/storage/wallet name = "wallet" - desc = "It can hold a few small and personal things." + desc = "An old leather wallet with RFID blocking potential." icon_state = "wallet" w_class = WEIGHT_CLASS_SMALL resistance_flags = FLAMMABLE slot_flags = ITEM_SLOT_ID + /// Is the wallet open? + var/is_open = FALSE + /// The ID that is visible and functional if the wallet is open. var/obj/item/card/id/front_id = null - var/list/combined_access + var/cached_flat_icon /obj/item/storage/wallet/Initialize() . = ..() + atom_storage.animated = FALSE + atom_storage.rustle_sound = FALSE atom_storage.max_slots = 4 - atom_storage.set_holdable(list( - /obj/item/stack/spacecash, - /obj/item/holochip, - /obj/item/card, - /obj/item/clothing/mask/cigarette, - /obj/item/flashlight/pen, - /obj/item/seeds, - /obj/item/stack/medical, - /obj/item/toy/crayon, - /obj/item/coin, - /obj/item/dice, - /obj/item/disk, - /obj/item/implanter, - /obj/item/lighter, - /obj/item/lipstick, - /obj/item/match, - /obj/item/paper, - /obj/item/pen, - /obj/item/photo, - /obj/item/reagent_containers/dropper, - /obj/item/reagent_containers/syringe, - /obj/item/reagent_containers/pill, - /obj/item/screwdriver, - /obj/item/stamp), - list(/obj/item/screwdriver/power)) + atom_storage.max_specific_storage = WEIGHT_CLASS_TINY + atom_storage.max_total_storage = WEIGHT_CLASS_TINY * 4 + + RegisterSignal(atom_storage, COMSIG_STORAGE_CAN_INSERT, PROC_REF(can_insert_item)) + RegisterSignal(atom_storage, COMSIG_STORAGE_ATTEMPT_OPEN, PROC_REF(on_attempt_open_storage)) + register_context() + +/obj/item/storage/wallet/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + context[SCREENTIP_CONTEXT_RMB] = is_open ? "Close" : "Open" + context[SCREENTIP_CONTEXT_ALT_LMB] = is_open ? "Close" : "Open" + return CONTEXTUAL_SCREENTIP_SET /obj/item/storage/wallet/Exited(atom/movable/gone, direction) . = ..() if(istype(gone, /obj/item/card/id)) refreshID() -/** - * Calculates the new front ID. - * - * Picks the ID card that has the most combined command or higher tier accesses. - */ -/obj/item/storage/wallet/proc/refreshID() - LAZYCLEARLIST(combined_access) - - front_id = null - var/winning_tally = 0 - var/is_magnetic_found = FALSE - for(var/obj/item/card/id/id_card in contents) - // Certain IDs can forcibly jump to the front so they can disguise other cards in wallets. Chameleon/Agent ID cards are an example of this. - if(!is_magnetic_found && HAS_TRAIT(id_card, TRAIT_MAGNETIC_ID_CARD)) - front_id = id_card - is_magnetic_found = TRUE - - if(!is_magnetic_found) - var/card_tally = SSid_access.tally_access(id_card, ACCESS_FLAG_COMMAND) - if(card_tally > winning_tally) - winning_tally = card_tally - front_id = id_card - - LAZYINITLIST(combined_access) - combined_access |= id_card.access - - // If we didn't pick a front ID - Maybe none of our cards have any command accesses? Just grab the first card (if we even have one). - // We could also have no ID card in the wallet at all, which will mean we end up with a null front_id and that's fine too. - if(!front_id) - front_id = (locate(/obj/item/card/id) in contents) - - if(ishuman(loc)) - var/mob/living/carbon/human/wearing_human = loc - if(wearing_human.wear_id == src) - wearing_human.sec_hud_set_ID() - - update_label() - update_appearance(UPDATE_ICON) - update_slot_icon() - /obj/item/storage/wallet/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) . = ..() if(istype(arrived, /obj/item/card/id)) @@ -92,40 +44,50 @@ /obj/item/storage/wallet/update_overlays() . = ..() cached_flat_icon = null - if(!front_id) + if(!is_open) return - . += mutable_appearance(front_id.icon, front_id.icon_state) - . += front_id.overlays - . += mutable_appearance(icon, "wallet_overlay") - -/obj/item/storage/wallet/proc/get_cached_flat_icon() - if(!cached_flat_icon) - cached_flat_icon = getFlatIcon(src) - return cached_flat_icon -/obj/item/storage/wallet/get_examine_string(mob/user, thats = FALSE) + . += image(icon, "wallet_underlay") if(front_id) - return "[icon2html(get_cached_flat_icon(), user)] [thats? "That's ":""][get_examine_name(user)]" //displays all overlays in chat - return ..() + . += image(front_id.icon, front_id.icon_state) + . += front_id.overlays + . += image(icon, "wallet_overlay") -/obj/item/storage/wallet/proc/update_label() - if(front_id) - name = "wallet displaying [front_id]" +/obj/item/storage/wallet/attack_self(mob/user, modifiers) + . = ..() + if(.) + return + + if(is_open) + close() else - name = "wallet" + open() -/obj/item/storage/wallet/examine() +/obj/item/storage/wallet/attack_hand_secondary(mob/user, list/modifiers) + if(is_open) + close() + else + open() + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +/obj/item/storage/wallet/AltClick(mob/user) . = ..() - if(front_id) - . += span_notice("Alt-click to remove the id.") + if(!.) + return + + if(is_open) + close() + else + open() /obj/item/storage/wallet/get_id_examine_strings(mob/user) . = ..() - if(front_id) + if(front_id && is_open) . += front_id.get_id_examine_strings(user) -/obj/item/storage/wallet/GetID() - return front_id +/obj/item/storage/wallet/GetID(bypass_wallet) + if(is_open || bypass_wallet) + return front_id /obj/item/storage/wallet/RemoveID() if(!front_id) @@ -133,21 +95,94 @@ . = front_id front_id.forceMove(get_turf(src)) -/obj/item/storage/wallet/InsertID(obj/item/inserting_item) +/obj/item/storage/wallet/InsertID(obj/item/inserting_item, force) var/obj/item/card/inserting_id = inserting_item.RemoveID() if(!inserting_id) return FALSE - attackby(inserting_id) - if(inserting_id in contents) - return TRUE - return FALSE + return atom_storage.attempt_insert(inserting_item, force = force) /obj/item/storage/wallet/GetAccess() - if(LAZYLEN(combined_access)) - return combined_access + if(is_open && front_id) + return front_id.GetAccess() else return ..() +/obj/item/storage/wallet/get_examine_string(mob/user, thats = FALSE) + if(front_id && is_open) + return "[icon2html(get_cached_flat_icon(), user)] [thats? "That's ":""][get_examine_name(user)]" //displays all overlays in chat + return ..() + +/obj/item/storage/wallet/proc/open() + SIGNAL_HANDLER + if(is_open) + return + + is_open = TRUE + update_appearance() + +/obj/item/storage/wallet/proc/close() + if(!is_open) + return + is_open = FALSE + atom_storage.close_all() + update_appearance() + +/obj/item/storage/wallet/proc/get_cached_flat_icon() + if(!cached_flat_icon) + cached_flat_icon = getFlatIcon(src) + return cached_flat_icon + +/obj/item/storage/wallet/update_name() + . = ..() + if(front_id && is_open) + name = "wallet displaying \a [front_id.name]" + else + name = "wallet" + +/obj/item/storage/wallet/proc/on_attempt_open_storage(datum/storage/source, mob/user) + SIGNAL_HANDLER + if(!is_open) + return STORAGE_INTERRUPT_OPEN + +/obj/item/storage/wallet/proc/can_insert_item(datum/storage/source, obj/item/I, mob/user, messages, force) + SIGNAL_HANDLER + if(!is_open && user) + return STORAGE_NO_INSERT + +/obj/item/storage/wallet/proc/id_icon_updated(datum/source) + SIGNAL_HANDLER + update_appearance() + +/** + * Calculates the new front ID. + * + * Picks the ID card that has the most combined command or higher tier accesses. + */ +/obj/item/storage/wallet/proc/refreshID() + if(front_id) + UnregisterSignal(front_id, COMSIG_ATOM_UPDATED_ICON) + + front_id = null + for(var/obj/item/card/id/id_card in contents) + // Certain IDs can forcibly jump to the front so they can disguise other cards in wallets. Chameleon/Agent ID cards are an example of this. + if(HAS_TRAIT(id_card, TRAIT_MAGNETIC_ID_CARD)) + front_id = id_card + break + + if(!front_id) + front_id = locate(/obj/item/card/id) in contents + + if(front_id) + RegisterSignal(front_id, COMSIG_ATOM_UPDATED_ICON, PROC_REF(id_icon_updated)) + + if(ishuman(loc)) + var/mob/living/carbon/human/wearing_human = loc + if(wearing_human.wear_id == src) + wearing_human.sec_hud_set_ID() + + update_appearance() + update_slot_icon() + /obj/item/storage/wallet/random icon_state = "random_wallet" // for mapping purposes @@ -156,5 +191,5 @@ icon_state = "wallet" /obj/item/storage/wallet/random/PopulateContents() - new /obj/item/holochip(src, rand(5, 30)) + SSeconomy.spawn_cash_for_amount(rand(5, 30), src) new /obj/effect/spawner/random/entertainment/wallet_storage(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm index 1e9e86791f47..05f819dc34ea 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm @@ -108,12 +108,10 @@ /obj/structure/closet/secure_closet/freezer/money/PopulateContents() ..() - for(var/i in 1 to 3) - new /obj/item/stack/spacecash/c1000(src) for(var/i in 1 to 5) - new /obj/item/stack/spacecash/c500(src) - for(var/i in 1 to 6) - new /obj/item/stack/spacecash/c200(src) + new /obj/item/stack/spacecash/c1000(src) + for(var/i in 1 to 15) + new /obj/item/stack/spacecash/c100(src) /obj/structure/closet/secure_closet/freezer/cream_pie name = "cream pie closet" diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 95a348b0d274..dd828bb56308 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -89,9 +89,8 @@ to_chat(user, span_notice("You tear the manifest off of [src].")) playsound(src, 'sound/items/poster_ripped.ogg', 75, TRUE) - manifest.forceMove(loc) - if(ishuman(user)) - user.put_in_hands(manifest) + if(!user.put_in_hands(manifest)) + manifest.forceMove(loc.drop_location()) manifest = null update_appearance() diff --git a/code/modules/cargo/bounties/assistant.dm b/code/modules/cargo/bounties/assistant.dm deleted file mode 100644 index 5a06d102b00b..000000000000 --- a/code/modules/cargo/bounties/assistant.dm +++ /dev/null @@ -1,204 +0,0 @@ -/datum/bounty/item/assistant/scooter - name = "Scooter" - description = "Ananke has determined walking to be wasteful. Ship a scooter to CentCom to speed operations up." - reward = CARGO_CRATE_VALUE * 2.16 // the mat hoffman - wanted_types = list(/obj/vehicle/ridden/scooter = TRUE) - include_subtypes = FALSE - -/datum/bounty/item/assistant/skateboard - name = "Skateboard" - description = "Ananke has determined walking to be wasteful. Ship a skateboard to CentCom to speed operations up." - reward = CARGO_CRATE_VALUE * 1.8 // the tony hawk - wanted_types = list( - /obj/vehicle/ridden/scooter/skateboard = TRUE, - /obj/item/melee/skateboard = TRUE, - ) - -/datum/bounty/item/assistant/stunprod - name = "Stunprod" - description = "CentCom demands a stunprod to use against dissidents. Craft one, then ship it." - reward = CARGO_CRATE_VALUE * 2.6 - wanted_types = list(/obj/item/melee/baton/security/cattleprod = TRUE) - -/datum/bounty/item/assistant/soap - name = "Soap" - description = "Soap has gone missing from CentCom's bathrooms and nobody knows who took it. Replace it and be the hero CentCom needs." - reward = CARGO_CRATE_VALUE * 4 - required_count = 3 - wanted_types = list(/obj/item/soap = TRUE) - -/datum/bounty/item/assistant/spear - name = "Spears" - description = "CentCom's security forces are going through budget cuts. You will be paid if you ship a set of spears." - reward = CARGO_CRATE_VALUE * 4 - required_count = 5 - wanted_types = list(/obj/item/spear = TRUE) - -/datum/bounty/item/assistant/toolbox - name = "Toolboxes" - description = "There's an absence of robustness at Central Command. Hurry up and ship some toolboxes as a solution." - reward = CARGO_CRATE_VALUE * 4 - required_count = 6 - wanted_types = list(/obj/item/storage/toolbox = TRUE) - -/datum/bounty/item/assistant/statue - name = "Statue" - description = "Central Command would like to commision an artsy statue for the lobby. Ship one out, when possible." - reward = CARGO_CRATE_VALUE * 4 - wanted_types = list(/obj/structure/statue = TRUE) - -/datum/bounty/item/assistant/clown_box - name = "Clown Box" - description = "The universe needs laughter. Stamp cardboard with a clown stamp and ship it out." - reward = CARGO_CRATE_VALUE * 3 - wanted_types = list(/obj/item/storage/box/clown = TRUE) - -/datum/bounty/item/assistant/cheesiehonkers - name = "Cheesie Honkers" - description = "Apparently the company that makes Cheesie Honkers is going out of business soon. CentCom wants to stock up before it happens!" - reward = CARGO_CRATE_VALUE * 2.4 - required_count = 3 - wanted_types = list(/obj/item/food/cheesiehonkers = TRUE) - -/datum/bounty/item/assistant/baseball_bat - name = "Baseball Bat" - description = "Baseball fever is going on at CentCom! Be a dear and ship them some baseball bats, so that management can live out their childhood dream." - reward = CARGO_CRATE_VALUE * 4 - required_count = 5 - wanted_types = list(/obj/item/melee/baseball_bat = TRUE) - -/datum/bounty/item/assistant/extendohand - name = "Extendo-Hand" - description = "Commander Betsy is getting old, and can't bend over to get the telescreen remote anymore. Management has requested an extendo-hand to help her out." - reward = CARGO_CRATE_VALUE * 5 - wanted_types = list(/obj/item/extendohand = TRUE) - -/datum/bounty/item/assistant/donut - name = "Donuts" - description = "CentCom's security forces are facing heavy losses against the Syndicate. Ship donuts to raise morale." - reward = CARGO_CRATE_VALUE * 6 - required_count = 6 - wanted_types = list(/obj/item/food/donut = TRUE) - -/datum/bounty/item/assistant/donkpocket - name = "Donk-Pockets" - description = "Consumer safety recall: Warning. Donk-Pockets manufactured in the past year contain hazardous biomatter. Return units to management immediately." - reward = CARGO_CRATE_VALUE * 6 - required_count = 10 - wanted_types = list(/obj/item/food/donkpocket = TRUE) - -/datum/bounty/item/assistant/briefcase - name = "Briefcase" - description = "Central Command will be holding a business convention this year. Ship a few briefcases in support." - reward = CARGO_CRATE_VALUE * 5 - required_count = 5 - wanted_types = list( - /obj/item/storage/briefcase = TRUE, - /obj/item/storage/secure/briefcase = TRUE, - ) - -/datum/bounty/item/assistant/sunglasses - name = "Sunglasses" - description = "A famous blues duo is passing through the sector, but they've lost their shades and they can't perform. Ship new sunglasses to CentCom to rectify this." - reward = CARGO_CRATE_VALUE * 6 - required_count = 2 - wanted_types = list(/obj/item/clothing/glasses/sunglasses = TRUE) - -/datum/bounty/item/assistant/monkey_hide - name = "Monkey Hide" - description = "One of the scientists at CentCom is interested in testing products on monkey skin. Your mission is to acquire monkey's hide and ship it." - reward = CARGO_CRATE_VALUE * 3 - wanted_types = list(/obj/item/stack/sheet/animalhide/monkey = TRUE) - -/datum/bounty/item/assistant/comfy_chair - name = "Comfy Chairs" - description = "Commander Pat is unhappy with his chair. He claims it hurts his back. Ship some alternatives out to humor him." - reward = CARGO_CRATE_VALUE * 3 - required_count = 5 - wanted_types = list(/obj/structure/chair/comfy = TRUE) - -/datum/bounty/item/assistant/geranium - name = "Geraniums" - description = "Commander Zot has the hots for Commander Zena. Send a shipment of geraniums - her favorite flower - and he'll happily reward you." - reward = CARGO_CRATE_VALUE * 8 - required_count = 3 - wanted_types = list(/obj/item/food/grown/poppy/geranium = TRUE) - include_subtypes = FALSE - -/datum/bounty/item/assistant/poppy - name = "Poppies" - description = "Commander Zot really wants to sweep Security Officer Olivia off her feet. Send a shipment of Poppies - her favorite flower - and he'll happily reward you." - reward = CARGO_CRATE_VALUE * 2 - required_count = 3 - wanted_types = list(/obj/item/food/grown/poppy = TRUE) - include_subtypes = FALSE - -/datum/bounty/item/assistant/shadyjims - name = "Shady Jim's" - description = "There's an irate officer at CentCom demanding that he receive a box of Shady Jim's cigarettes. Please ship one. He's starting to make threats." - reward = CARGO_CRATE_VALUE - wanted_types = list(/obj/item/storage/fancy/cigarettes/cigpack_shadyjims = TRUE) - -/datum/bounty/item/assistant/potted_plants - name = "Potted Plants" - description = "Central Command is looking to commission a new BirdBoat-class station. You've been ordered to supply the potted plants." - reward = CARGO_CRATE_VALUE * 4 - required_count = 8 - wanted_types = list(/obj/item/kirbyplants = TRUE) - -/datum/bounty/item/assistant/monkey_cubes - name = "Monkey Cubes" - description = "Due to a recent genetics accident, Central Command is in serious need of monkeys. Your mission is to ship monkey cubes." - reward = CARGO_CRATE_VALUE * 4 - required_count = 3 - wanted_types = list(/obj/item/food/monkeycube = TRUE) - -/datum/bounty/item/assistant/ied - name = "IED" - description = "The Core Worlds' maximum security prison back home is undergoing personnel training. Ship a handful of IEDs to serve as a training tools." - reward = CARGO_CRATE_VALUE * 4 - required_count = 3 - wanted_types = list(/obj/item/grenade/iedcasing = TRUE) - -/datum/bounty/item/assistant/corgimeat - name = "Raw Corgi Meat" - description = "The Syndicate recently stole all of CentCom's Corgi meat. Ship out a replacement immediately." - reward = CARGO_CRATE_VALUE * 6 - wanted_types = list(/obj/item/food/meat/slab/corgi = TRUE) - -/datum/bounty/item/assistant/action_figures - name = "Action Figures" - description = "The vice president's son saw an ad for action figures on the telescreen and now he won't shut up about them. Ship some to ease his complaints." - reward = CARGO_CRATE_VALUE * 8 - required_count = 5 - wanted_types = list(/obj/item/toy/figure = TRUE) - -/datum/bounty/item/assistant/dead_mice - name = "Dead Mice" - description = "Station 14 ran out of freeze-dried mice. Ship some fresh ones so their janitor doesn't go on strike." - reward = CARGO_CRATE_VALUE * 10 - required_count = 5 - wanted_types = list(/obj/item/food/deadmouse = TRUE) - -/datum/bounty/item/assistant/paper_bin - name = "Paper Bins" - description = "Our accounting division is all out of paper. We need a new shipment immediately." - reward = CARGO_CRATE_VALUE * 5 - required_count = 5 - wanted_types = list(/obj/item/paper_bin = TRUE) - - -/datum/bounty/item/assistant/crayons - name = "Crayons" - description = "Dr Jones' kid ate all our crayons again. Please send us yours." - reward = CARGO_CRATE_VALUE * 4 - required_count = 24 - wanted_types = list(/obj/item/toy/crayon = TRUE) - -/datum/bounty/item/assistant/pens - name = "Pens" - description = "We are hosting the intergalactic pen balancing competition. We need you to send us some standardized ball point pens." - reward = CARGO_CRATE_VALUE * 4 - required_count = 10 - include_subtypes = FALSE - wanted_types = list(/obj/item/pen = TRUE) diff --git a/code/modules/cargo/bounties/botany.dm b/code/modules/cargo/bounties/botany.dm deleted file mode 100644 index 71f751c81a13..000000000000 --- a/code/modules/cargo/bounties/botany.dm +++ /dev/null @@ -1,223 +0,0 @@ -/datum/bounty/item/botany - reward = CARGO_CRATE_VALUE * 10 - var/datum/bounty/item/botany/multiplier = 0 //adds bonus reward money; increased for higher tier or rare mutations - var/datum/bounty/item/botany/bonus_desc //for adding extra flavor text to bounty descriptions - var/datum/bounty/item/botany/foodtype = "meal" //same here - -/datum/bounty/item/botany/New() - ..() - description = "Central Command's head chef is looking to prepare a fine [foodtype] with [name]. [bonus_desc]" - reward += multiplier * (CARGO_CRATE_VALUE * 2) - required_count = rand(5, 10) - -/datum/bounty/item/botany/ambrosia_vulgaris - name = "Ambrosia Vulgaris Leaves" - wanted_types = list(/obj/item/food/grown/ambrosia/vulgaris = TRUE) - foodtype = "stew" - -/datum/bounty/item/botany/ambrosia_gaia - name = "Ambrosia Gaia Leaves" - wanted_types = list(/obj/item/food/grown/ambrosia/gaia = TRUE) - multiplier = 4 - foodtype = "stew" - -/datum/bounty/item/botany/apple_golden - name = "Golden Apples" - wanted_types = list(/obj/item/food/grown/apple/gold = TRUE) - multiplier = 4 - foodtype = "dessert" - -/datum/bounty/item/botany/banana - name = "Bananas" - wanted_types = list( - /obj/item/food/grown/banana = TRUE, - /obj/item/food/grown/banana/bluespace = FALSE, - ) - foodtype = "banana split" - -/datum/bounty/item/botany/banana_bluespace - name = "Bluespace Bananas" - wanted_types = list(/obj/item/food/grown/banana/bluespace = TRUE) - multiplier = 2 - foodtype = "banana split" - -/datum/bounty/item/botany/beans_koi - name = "Koi Beans" - wanted_types = list(/obj/item/food/grown/koibeans = TRUE) - multiplier = 2 - -/datum/bounty/item/botany/berries_death - name = "Death Berries" - wanted_types = list(/obj/item/food/grown/berries/death = TRUE) - multiplier = 2 - bonus_desc = "He insists that \"he knows what he's doing\"." - foodtype = "sorbet" - -/datum/bounty/item/botany/berries_glow - name = "Glow-Berries" - wanted_types = list(/obj/item/food/grown/berries/glow = TRUE) - multiplier = 2 - foodtype = "sorbet" - -/datum/bounty/item/botany/cannabis - name = "Cannabis Leaves" - wanted_types = list( - /obj/item/food/grown/cannabis = TRUE, - /obj/item/food/grown/cannabis/white = FALSE, - /obj/item/food/grown/cannabis/death = FALSE, - /obj/item/food/grown/cannabis/ultimate = FALSE, - ) - multiplier = 4 //hush money - bonus_desc = "Do not mention this shipment to security." - foodtype = "batch of \"muffins\"" - -/datum/bounty/item/botany/cannabis_white - name = "Lifeweed Leaves" - wanted_types = list(/obj/item/food/grown/cannabis/white = TRUE) - multiplier = 6 - bonus_desc = "Do not mention this shipment to security." - foodtype = "\"meal\"" - -/datum/bounty/item/botany/cannabis_death - name = "Deathweed Leaves" - wanted_types = list(/obj/item/food/grown/cannabis/death = TRUE) - multiplier = 6 - bonus_desc = "Do not mention this shipment to security." - foodtype = "\"meal\"" - -/datum/bounty/item/botany/cannabis_ultimate - name = "Omega Weed Leaves" - wanted_types = list(/obj/item/food/grown/cannabis/ultimate = TRUE) - multiplier = 6 - bonus_desc = "Under no circumstances mention this shipment to security." - foodtype = "batch of \"brownies\"" - -/datum/bounty/item/botany/wheat - name = "Wheat Grains" - wanted_types = list(/obj/item/food/grown/wheat = TRUE) - -/datum/bounty/item/botany/rice - name = "Rice Grains" - wanted_types = list(/obj/item/food/grown/rice = TRUE) - -/datum/bounty/item/botany/chili - name = "Chili Peppers" - wanted_types = list(/obj/item/food/grown/chili = TRUE) - -/datum/bounty/item/botany/ice_chili - name = "Chilly Peppers" - wanted_types = list(/obj/item/food/grown/icepepper = TRUE) - multiplier = 2 - -/datum/bounty/item/botany/ghost_chili - name = "Ghost Chili Peppers" - wanted_types = list(/obj/item/food/grown/ghost_chili = TRUE) - multiplier = 2 - -/datum/bounty/item/botany/citrus_lime - name = "Limes" - wanted_types = list(/obj/item/food/grown/citrus/lime = TRUE) - foodtype = "sorbet" - -/datum/bounty/item/botany/citrus_lemon - name = "Lemons" - wanted_types = list(/obj/item/food/grown/citrus/lemon = TRUE) - foodtype = "sorbet" - -/datum/bounty/item/botany/citrus_oranges - name = "Oranges" - wanted_types = list(/obj/item/food/grown/citrus/orange = TRUE) - bonus_desc = "Do not ship lemons or limes." //I vanted orahnge! - foodtype = "sorbet" - -/datum/bounty/item/botany/eggplant - name = "Eggplants" - wanted_types = list(/obj/item/food/grown/eggplant = TRUE) - bonus_desc = "Not to be confused with egg-plants." - -/datum/bounty/item/botany/eggplant_eggy - name = "Egg-plants" - wanted_types = list(/obj/item/food/grown/shell/eggy = TRUE) - bonus_desc = "Not to be confused with eggplants." - multiplier = 2 - -/datum/bounty/item/botany/kudzu - name = "Kudzu Pods" - wanted_types = list(/obj/item/food/grown/kudzupod = TRUE) - bonus_desc = "Store in a dry, dark place." - multiplier = 4 - -/datum/bounty/item/botany/watermelon - name = "Watermelons" - wanted_types = list(/obj/item/food/grown/watermelon = TRUE) - foodtype = "dessert" - -/datum/bounty/item/botany/watermelon_holy - name = "Holy Melons" - wanted_types = list(/obj/item/food/grown/holymelon = TRUE) - multiplier = 2 - foodtype = "dessert" - -/datum/bounty/item/botany/glowshroom - name = "Glowshrooms" - wanted_types = list( - /obj/item/food/grown/mushroom/glowshroom = TRUE, - /obj/item/food/grown/mushroom/glowshroom/glowcap = FALSE, - /obj/item/food/grown/mushroom/glowshroom/shadowshroom = FALSE, - ) - foodtype = "omelet" - -/datum/bounty/item/botany/glowshroom_cap - name = "Glowcaps" - wanted_types = list(/obj/item/food/grown/mushroom/glowshroom/glowcap = TRUE) - multiplier = 2 - foodtype = "omelet" - -/datum/bounty/item/botany/glowshroom_shadow - name = "Shadowshrooms" - wanted_types = list(/obj/item/food/grown/mushroom/glowshroom/shadowshroom = TRUE) - multiplier = 2 - foodtype = "omelet" - -/datum/bounty/item/botany/nettles_death - name = "Death Nettles" - wanted_types = list(/obj/item/food/grown/nettle/death = TRUE) - multiplier = 2 - bonus_desc = "Wear protection when handling them." - foodtype = "cheese" - -/datum/bounty/item/botany/pineapples - name = "Pineapples" - wanted_types = list(/obj/item/food/grown/pineapple = TRUE) - bonus_desc = "Not for human consumption." - foodtype = "ashtray" - -/datum/bounty/item/botany/tomato - name = "Tomatoes" - wanted_types = list( - /obj/item/food/grown/tomato = TRUE, - /obj/item/food/grown/tomato/blue = FALSE, - ) - -/datum/bounty/item/botany/tomato_bluespace - name = "Bluespace Tomatoes" - wanted_types = list(/obj/item/food/grown/tomato/blue/bluespace = TRUE) - multiplier = 4 - -/datum/bounty/item/botany/oatz - name = "Oats" - wanted_types = list(/obj/item/food/grown/oat = TRUE) - multiplier = 2 - foodtype = "batch of oatmeal" - bonus_desc = "Squats and oats. We're all out of oats." - -/datum/bounty/item/botany/bonfire - name = "Lit Bonfire" - description = "Space heaters are malfunctioning and the cargo crew of Central Command is starting to feel cold. Grow some logs and Ship a lit bonfire to warm them up." - wanted_types = list(/obj/structure/bonfire = TRUE) - -/datum/bounty/item/botany/bonfire/applies_to(obj/O) - if(!..()) - return FALSE - var/obj/structure/bonfire/B = O - return !!B.burning diff --git a/code/modules/cargo/bounties/chef.dm b/code/modules/cargo/bounties/chef.dm deleted file mode 100644 index 3e15c3688bb1..000000000000 --- a/code/modules/cargo/bounties/chef.dm +++ /dev/null @@ -1,153 +0,0 @@ -/datum/bounty/item/chef/birthday_cake - name = "Birthday Cake" - description = "Nanotrasen's birthday is coming up! Ship them a birthday cake to celebrate!" - reward = CARGO_CRATE_VALUE * 8 - wanted_types = list( - /obj/item/food/cake/birthday = TRUE, - /obj/item/food/cakeslice/birthday = TRUE - ) - -/datum/bounty/item/chef/soup - name = "Soup" - description = "To quell the homeless uprising, Nanotrasen will be serving soup to all underpaid workers. Ship any type of soup." - reward = CARGO_CRATE_VALUE * 6 - required_count = 3 - wanted_types = list(/obj/item/food/soup = TRUE) - -/datum/bounty/item/chef/popcorn - name = "Popcorn Bags" - description = "Upper management wants to host a movie night. Ship bags of popcorn for the occasion." - reward = CARGO_CRATE_VALUE * 6 - required_count = 3 - wanted_types = list(/obj/item/food/popcorn = TRUE) - -/datum/bounty/item/chef/onionrings - name = "Onion Rings" - description = "Nanotrasen is remembering Saturn day. Ship onion rings to show the station's support." - reward = CARGO_CRATE_VALUE * 6 - required_count = 3 - wanted_types = list(/obj/item/food/onionrings = TRUE) - -/datum/bounty/item/chef/icecreamsandwich - name = "Ice Cream Sandwiches" - description = "Upper management has been screaming non-stop for ice cream. Please send some." - reward = CARGO_CRATE_VALUE * 8 - required_count = 3 - wanted_types = list(/obj/item/food/icecreamsandwich = TRUE) - -/datum/bounty/item/chef/strawberryicecreamsandwich - name = " Strawberry Ice Cream Sandwiches" - description = "Upper management has been screaming non-stop for more flavourful ice cream. Please send some." - reward = CARGO_CRATE_VALUE * 10 - required_count = 3 - wanted_types = list(/obj/item/food/strawberryicecreamsandwich = TRUE) - -/datum/bounty/item/chef/bread - name = "Bread" - description = "Problems with central planning have led to bread prices skyrocketing. Ship some bread to ease tensions." - reward = CARGO_CRATE_VALUE * 2 - wanted_types = list( - /obj/item/food/bread = TRUE, - /obj/item/food/breadslice = TRUE, - /obj/item/food/bun = TRUE, - /obj/item/food/pizzabread = TRUE, - /obj/item/food/rawpastrybase = TRUE, - ) - -/datum/bounty/item/chef/pie - name = "Pie" - description = "3.14159? No! CentCom management wants edible pie! Ship a whole one." - reward = 3142 //Screw it I'll do this one by hand - wanted_types = list(/obj/item/food/pie = TRUE) - -/datum/bounty/item/chef/salad - name = "Salad or Rice Bowls" - description = "CentCom management is going on a health binge. Your order is to ship salad or rice bowls." - reward = CARGO_CRATE_VALUE * 6 - required_count = 3 - wanted_types = list(/obj/item/food/salad = TRUE) - -/datum/bounty/item/chef/carrotfries - name = "Carrot Fries" - description = "Night sight can mean life or death! A shipment of carrot fries is the order." - reward = CARGO_CRATE_VALUE * 7 - required_count = 3 - wanted_types = list(/obj/item/food/carrotfries = TRUE) - -/datum/bounty/item/chef/superbite - name = "Super Bite Burger" - description = "Commander Tubbs thinks he can set a competitive eating world record. All he needs is a super bite burger shipped to him." - reward = CARGO_CRATE_VALUE * 24 - wanted_types = list(/obj/item/food/burger/superbite = TRUE) - -/datum/bounty/item/chef/poppypretzel - name = "Poppy Pretzel" - description = "Central Command needs a reason to fire their HR head. Send over a poppy pretzel to force a failed drug test." - reward = CARGO_CRATE_VALUE * 6 - wanted_types = list(/obj/item/food/poppypretzel = TRUE) - -/datum/bounty/item/chef/cubancarp - name = "Cuban Carp" - description = "To celebrate the birth of Castro XXVII, ship one cuban carp to CentCom." - reward = CARGO_CRATE_VALUE * 16 - wanted_types = list(/obj/item/food/cubancarp = TRUE) - -/datum/bounty/item/chef/hotdog - name = "Hot Dog" - description = "Nanotrasen is conducting taste tests to determine the best hot dog recipe. Ship your station's version to participate." - reward = CARGO_CRATE_VALUE * 16 - wanted_types = list(/obj/item/food/hotdog = TRUE) - -/datum/bounty/item/chef/eggplantparm - name = "Eggplant Parmigianas" - description = "A famous singer will be arriving at CentCom, and their contract demands that they only be served Eggplant Parmigiana. Ship some, please!" - reward = CARGO_CRATE_VALUE * 7 - required_count = 3 - wanted_types = list(/obj/item/food/eggplantparm = TRUE) - -/datum/bounty/item/chef/muffin - name = "Muffins" - description = "The Muffin Man is visiting CentCom, but he's forgotten his muffins! Your order is to rectify this." - reward = CARGO_CRATE_VALUE * 6 - required_count = 3 - wanted_types = list(/obj/item/food/muffin = TRUE) - -/datum/bounty/item/chef/chawanmushi - name = "Chawanmushi" - description = "Nanotrasen wants to improve relations with its sister company, Japanotrasen. Ship Chawanmushi immediately." - reward = CARGO_CRATE_VALUE * 16 - wanted_types = list(/obj/item/food/chawanmushi = TRUE) - -/datum/bounty/item/chef/kebab - name = "Kebabs" - description = "Remove all kebab from station you are best food. Ship to CentCom to remove from the premises." - reward = CARGO_CRATE_VALUE * 7 - required_count = 3 - wanted_types = list(/obj/item/food/kebab = TRUE) - -/datum/bounty/item/chef/soylentgreen - name = "Soylent Green" - description = "CentCom has heard wonderful things about the product 'Soylent Green', and would love to try some. If you endulge them, expect a pleasant bonus." - reward = CARGO_CRATE_VALUE * 10 - wanted_types = list(/obj/item/food/soylentgreen = TRUE) - -/datum/bounty/item/chef/pancakes - name = "Pancakes" - description = "Here at Nanotrasen we consider employees to be family. And you know what families love? Pancakes. Ship a baker's dozen." - reward = CARGO_CRATE_VALUE * 10 - required_count = 13 - wanted_types = list(/obj/item/food/pancakes = TRUE) - -/datum/bounty/item/chef/nuggies - name = "Chicken Nuggets" - description = "The vice president's son won't shut up about chicken nuggies. Would you mind shipping some?" - reward = CARGO_CRATE_VALUE * 8 - required_count = 6 - wanted_types = list(/obj/item/food/nugget = TRUE) - -/datum/bounty/item/chef/corgifarming //Butchering is a chef's job. - name = "Corgi Hides" - description = "Admiral Weinstein's space yacht needs new upholstery. A dozen Corgi furs should do just fine." - reward = CARGO_CRATE_VALUE * 60 //that's a lot of dead dogs - required_count = 12 - wanted_types = list(/obj/item/stack/sheet/animalhide/corgi = TRUE) diff --git a/code/modules/cargo/bounties/engineering.dm b/code/modules/cargo/bounties/engineering.dm deleted file mode 100644 index 83d80134134f..000000000000 --- a/code/modules/cargo/bounties/engineering.dm +++ /dev/null @@ -1,54 +0,0 @@ -/datum/bounty/item/engineering/gas - name = "Full Tank of Pluoxium" - description = "CentCom RnD is researching extra compact internals. Ship us a tank full of Pluoxium and you'll be compensated." - reward = CARGO_CRATE_VALUE * 15 - wanted_types = list(/obj/item/tank = TRUE) - var/moles_required = 20 // A full tank is 28 moles, but CentCom ignores that fact. - var/gas_type - -/datum/bounty/item/engineering/gas/applies_to(obj/O) - if(!..()) - return FALSE - var/obj/item/tank/T = O - var/datum/gas_mixture/our_mix = T.unsafe_return_air() - if(!our_mix.getGroupGas(gas_type)) - return FALSE - return our_mix.getGroupGas(gas_type) >= moles_required - -/datum/bounty/item/engineering/gas/nitrium_tank - name = "Full Tank of Nitrium" - description = "The non-human staff of Station 88 has been volunteered to test performance enhancing drugs. Ship them a tank full of Nitrium so they can get started. (20 Moles)" -// gas_type = /datum/gas/nitrium - -/datum/bounty/item/engineering/gas/freon_tank - name = "Full Tank of Freon" - description = "The Supermatter of station 33 has started the delamination process. Deliver a tank of Freon gas to help them stop it! (20 Moles)" - //gas_type = /datum/gas/freon - -/datum/bounty/item/engineering/gas/tritium_tank - name = "Full Tank of Tritium" - description = "Station 49 is looking to kickstart their research program. Ship them a tank full of Tritium. (20 Moles)" - //gas_type = /datum/gas/tritium - -/datum/bounty/item/engineering/gas/hydrogen_tank - name = "Full Tank of Hydrogen" - description = "Our R&D department is working on the development of more efficient electrical batteries using hydrogen as a catalyst. Ship us a tank full of it. (20 Moles)" - //gas_type = /datum/gas/hydrogen - -/datum/bounty/item/engineering/gas/zauker_tank - name = "Full Tank of Zauker" - description = "The main planet of \[REDACTED] has been chosen as testing grounds for the new weapon that uses Zauker gas. Ship us a tank full of it. (20 Moles)" - reward = CARGO_CRATE_VALUE * 20 - //gas_type = /datum/gas/zauker - -/datum/bounty/item/engineering/emitter - name = "Emitter" - description = "We think there may be a defect in your station's emitter designs, based on the sheer number of delaminations your sector seems to see. Ship us one of yours." - reward = CARGO_CRATE_VALUE * 5 - wanted_types = list(/obj/machinery/power/emitter = TRUE) - -/datum/bounty/item/engineering/hydro_tray - name = "Hydroponics Tray" - description = "The lab technicians are trying to figure out how to lower the power drain of hydroponics trays, but we fried our last one. Mind building one for us?" - reward = CARGO_CRATE_VALUE * 4 - wanted_types = list(/obj/machinery/hydroponics/constructable = TRUE) diff --git a/code/modules/cargo/bounties/item.dm b/code/modules/cargo/bounties/item.dm deleted file mode 100644 index 1aa8f9bd4f05..000000000000 --- a/code/modules/cargo/bounties/item.dm +++ /dev/null @@ -1,32 +0,0 @@ -/datum/bounty/item - ///How many items have to be shipped to complete the bounty - var/required_count = 1 - ///How many items have been shipped for the bounty so far - var/shipped_count = 0 - ///Types accepted|denied by the bounty. (including all subtypes, unless include_subtypes is set to FALSE) - var/list/wanted_types - ///Set to FALSE to make the bounty not accept subtypes of the wanted_types - var/include_subtypes = TRUE - -/datum/bounty/item/New() - ..() - wanted_types = string_assoc_list(zebra_typecacheof(wanted_types, only_root_path = !include_subtypes)) - -/datum/bounty/item/can_claim() - return ..() && shipped_count >= required_count - -/datum/bounty/item/applies_to(obj/O) - if(!is_type_in_typecache(O, wanted_types)) - return FALSE - if(O.flags_1 & HOLOGRAM_1) - return FALSE - return shipped_count < required_count - -/datum/bounty/item/ship(obj/O) - if(!applies_to(O)) - return - if(istype(O,/obj/item/stack)) - var/obj/item/stack/O_is_a_stack = O - shipped_count += O_is_a_stack.amount - else - shipped_count += 1 diff --git a/code/modules/cargo/bounties/mech.dm b/code/modules/cargo/bounties/mech.dm deleted file mode 100644 index 9cacba95ff30..000000000000 --- a/code/modules/cargo/bounties/mech.dm +++ /dev/null @@ -1,36 +0,0 @@ -/datum/bounty/item/mech/New() - ..() - description = "Upper management has requested one [name] mech be sent as soon as possible. Ship it to receive a large payment." - -/datum/bounty/item/mech/ship(obj/O) - if(!applies_to(O)) - return - if(istype(O, /obj/vehicle/sealed/mecha)) - var/obj/vehicle/sealed/mecha/M = O - M.wreckage = null // So the mech doesn't explode. - ..() - -/datum/bounty/item/mech/ripleymk2 - name = "APLU MK-II \"Ripley\"" - reward = CARGO_CRATE_VALUE * 26 - wanted_types = list(/obj/vehicle/sealed/mecha/working/ripley/mk2 = TRUE) - -/datum/bounty/item/mech/clarke - name = "Clarke" - reward = CARGO_CRATE_VALUE * 32 - wanted_types = list(/obj/vehicle/sealed/mecha/working/clarke = TRUE) - -/datum/bounty/item/mech/odysseus - name = "Odysseus" - reward = CARGO_CRATE_VALUE * 22 - wanted_types = list(/obj/vehicle/sealed/mecha/medical/odysseus = TRUE) - -/datum/bounty/item/mech/gygax - name = "Gygax" - reward = CARGO_CRATE_VALUE * 56 - wanted_types = list(/obj/vehicle/sealed/mecha/combat/gygax = TRUE) - -/datum/bounty/item/mech/durand - name = "Durand" - reward = CARGO_CRATE_VALUE * 40 - wanted_types = list(/obj/vehicle/sealed/mecha/combat/durand = TRUE) diff --git a/code/modules/cargo/bounties/medical.dm b/code/modules/cargo/bounties/medical.dm deleted file mode 100644 index 84767efed23f..000000000000 --- a/code/modules/cargo/bounties/medical.dm +++ /dev/null @@ -1,92 +0,0 @@ -/datum/bounty/item/medical/heart - name = "Heart" - description = "Commander Johnson is in critical condition after suffering yet another heart attack. Doctors say he needs a new heart fast. Ship one, pronto! We'll take a better cybernetic one, if need be." - reward = CARGO_CRATE_VALUE * 6 - wanted_types = list( - /obj/item/organ/heart = TRUE, - /obj/item/organ/heart/cybernetic = FALSE, - /obj/item/organ/heart/cybernetic/tier2 = TRUE, - /obj/item/organ/heart/cybernetic/tier3 = TRUE, - ) - -/datum/bounty/item/medical/lung - name = "Lungs" - description = "A recent explosion at Central Command has left multiple staff with punctured lungs. Ship spare lungs to be rewarded. We'll take a better cybernetic one, if need be." - reward = CARGO_CRATE_VALUE * 20 - required_count = 3 - wanted_types = list( - /obj/item/organ/lungs = TRUE, - /obj/item/organ/lungs/cybernetic = FALSE, - /obj/item/organ/lungs/cybernetic/tier2 = TRUE, - /obj/item/organ/lungs/cybernetic/tier3 = TRUE, - ) - -/datum/bounty/item/medical/appendix - name = "Appendix" - description = "Chef Gibb of Central Command wants to prepare a meal using a very special delicacy: an appendix. If you ship one, he'll pay. We'll take a better cybernetic one, if need be." - reward = CARGO_CRATE_VALUE * 5 //there are no synthetic appendixes - wanted_types = list(/obj/item/organ/appendix = TRUE) - -/datum/bounty/item/medical/ears - name = "Ears" - description = "Multiple staff at Station 12 have been left deaf due to unauthorized clowning. Ship them new ears. " - reward = CARGO_CRATE_VALUE * 10 - required_count = 3 - wanted_types = list( - /obj/item/organ/ears = TRUE, - /obj/item/organ/ears/cybernetic = FALSE, - /obj/item/organ/ears/cybernetic/upgraded = TRUE, - ) - -/datum/bounty/item/medical/liver - name = "Livers" - description = "Multiple high-ranking CentCom diplomats have been hospitalized with liver failure after a recent meeting with Third Soviet Union ambassadors. Help us out, will you? We'll take better cybernetic ones, if need be." - reward = CARGO_CRATE_VALUE * 10 - required_count = 3 - wanted_types = list( - /obj/item/organ/liver = TRUE, - /obj/item/organ/liver/cybernetic = FALSE, - /obj/item/organ/liver/cybernetic/tier2 = TRUE, - /obj/item/organ/liver/cybernetic/tier3 = TRUE, - ) - -/datum/bounty/item/medical/eye - name = "Organic Eyes" - description = "Station 5's Research Director Willem is requesting a few pairs of non-robotic eyes. Don't ask questions, just ship them." - reward = CARGO_CRATE_VALUE * 20 - required_count = 3 - wanted_types = list( - /obj/item/organ/eyes = TRUE, - /obj/item/organ/eyes/robotic = FALSE, - ) - -/datum/bounty/item/medical/tongue - name = "Tongues" - description = "A recent attack by Mime extremists has left staff at Station 23 speechless. Ship some spare tongues." - reward = CARGO_CRATE_VALUE * 20 - required_count = 3 - wanted_types = list(/obj/item/organ/tongue = TRUE) - -/datum/bounty/item/medical/cat_tail - name = "Cat Tail" - description = "Central Command has run out of heavy duty pipe cleaners. Can you ship over a cat tail to help us out?" - reward = CARGO_CRATE_VALUE * 6 - wanted_types = list(/obj/item/organ/tail/cat = TRUE) - -/datum/bounty/item/medical/chainsaw - name = "Chainsaw" - description = "A CMO at CentCom is having trouble operating on golems. She requests one chainsaw, please." - reward = CARGO_CRATE_VALUE * 5 - wanted_types = list(/obj/item/chainsaw = TRUE) - -/datum/bounty/item/medical/tail_whip //Like the cat tail bounties, with more processing. - name = "Nine Tails whip" - description = "Commander Jackson is looking for a fine addition to her exotic weapons collection. She will reward you handsomely for either a Cat o' Nine Tails." - reward = CARGO_CRATE_VALUE * 8 - wanted_types = list(/obj/item/melee/chainofcommand/kitty = TRUE) - -/datum/bounty/item/medical/surgerytable - name = "Operating Table" - description = "After a recent influx of infected crew members recently, we've seen that masks just aren't cutting it alone. Silver Operating tables might just do the trick though, send us one to use." - reward = CARGO_CRATE_VALUE * 6 - wanted_types = list(/obj/structure/table/optable = TRUE) diff --git a/code/modules/cargo/bounties/reagent.dm b/code/modules/cargo/bounties/reagent.dm deleted file mode 100644 index c4db3cba2c15..000000000000 --- a/code/modules/cargo/bounties/reagent.dm +++ /dev/null @@ -1,230 +0,0 @@ -/datum/bounty/reagent - var/required_volume = 10 - var/shipped_volume = 0 - var/datum/reagent/wanted_reagent - -/datum/bounty/reagent/can_claim() - return ..() && shipped_volume >= required_volume - -/datum/bounty/reagent/applies_to(obj/O) - if(!istype(O, /obj/item/reagent_containers)) - return FALSE - if(!O.reagents || !O.reagents.has_reagent(wanted_reagent.type)) - return FALSE - if(O.flags_1 & HOLOGRAM_1) - return FALSE - return shipped_volume < required_volume - -/datum/bounty/reagent/ship(obj/O) - if(!applies_to(O)) - return - shipped_volume += O.reagents.get_reagent_amount(wanted_reagent.type) - if(shipped_volume > required_volume) - shipped_volume = required_volume - -/datum/bounty/reagent/simple_drink - name = "Simple Drink" - reward = CARGO_CRATE_VALUE * 3 - -/datum/bounty/reagent/simple_drink/New() - // Don't worry about making this comprehensive. It doesn't matter if some drinks are skipped. - var/static/list/possible_reagents = list(\ - /datum/reagent/consumable/ethanol/antifreeze,\ - /datum/reagent/consumable/ethanol/andalusia,\ - /datum/reagent/consumable/tea/arnold_palmer,\ - /datum/reagent/consumable/ethanol/b52,\ - /datum/reagent/consumable/ethanol/bananahonk,\ - /datum/reagent/consumable/ethanol/beepsky_smash,\ - /datum/reagent/consumable/ethanol/between_the_sheets,\ - /datum/reagent/consumable/ethanol/bilk,\ - /datum/reagent/consumable/ethanol/black_russian,\ - /datum/reagent/consumable/ethanol/bloody_mary,\ - /datum/reagent/consumable/ethanol/martini,\ - /datum/reagent/consumable/ethanol/cuba_libre,\ - /datum/reagent/consumable/ethanol/eggnog,\ - /datum/reagent/consumable/ethanol/erikasurprise,\ - /datum/reagent/consumable/ethanol/ginfizz,\ - /datum/reagent/consumable/ethanol/gintonic,\ - /datum/reagent/consumable/ethanol/grappa,\ - /datum/reagent/consumable/ethanol/grog,\ - /datum/reagent/consumable/ethanol/hooch,\ - /datum/reagent/consumable/ethanol/iced_beer,\ - /datum/reagent/consumable/ethanol/irishcarbomb,\ - /datum/reagent/consumable/ethanol/manhattan,\ - /datum/reagent/consumable/ethanol/margarita,\ - /datum/reagent/consumable/ethanol/gargle_blaster,\ - /datum/reagent/consumable/ethanol/rum_coke,\ - /datum/reagent/consumable/ethanol/screwdrivercocktail,\ - /datum/reagent/consumable/ethanol/snowwhite,\ - /datum/reagent/consumable/soy_latte,\ - /datum/reagent/consumable/cafe_latte,\ - /datum/reagent/consumable/ethanol/syndicatebomb,\ - /datum/reagent/consumable/ethanol/tequila_sunrise,\ - /datum/reagent/consumable/ethanol/manly_dorf,\ - /datum/reagent/consumable/triple_citrus,\ - /datum/reagent/consumable/ethanol/vodkamartini,\ - /datum/reagent/consumable/ethanol/whiskeysoda,\ - /datum/reagent/consumable/ethanol/beer/green,\ - /datum/reagent/consumable/ethanol/demonsblood,\ - /datum/reagent/consumable/ethanol/crevice_spike,\ - /datum/reagent/consumable/ethanol/singulo,\ - /datum/reagent/consumable/ethanol/whiskey_sour) - - var/reagent_type = pick(possible_reagents) - wanted_reagent = new reagent_type - name = wanted_reagent.name - description = "CentCom is thirsty! Send a shipment of [name] to CentCom to quench the company's thirst." - reward += rand(0, 2) * 500 - -/datum/bounty/reagent/complex_drink - name = "Complex Drink" - reward = CARGO_CRATE_VALUE * 8 - -/datum/bounty/reagent/complex_drink/New() - // Don't worry about making this comprehensive. It doesn't matter if some drinks are skipped. - var/static/list/possible_reagents = list(\ - /datum/reagent/consumable/ethanol/atomicbomb,\ - /datum/reagent/consumable/ethanol/bacchus_blessing,\ - /datum/reagent/consumable/ethanol/booger,\ - /datum/reagent/consumable/ethanol/hippies_delight,\ - /datum/reagent/consumable/ethanol/drunkenblumpkin,\ - /datum/reagent/consumable/ethanol/fetching_fizz,\ - /datum/reagent/consumable/ethanol/goldschlager,\ - /datum/reagent/consumable/ethanol/manhattan_proj,\ - /datum/reagent/consumable/ethanol/narsour,\ - /datum/reagent/consumable/ethanol/neurotoxin,\ - /datum/reagent/consumable/ethanol/patron,\ - /datum/reagent/consumable/ethanol/quadruple_sec,\ - /datum/reagent/consumable/bluecherryshake,\ - /datum/reagent/consumable/doctor_delight,\ - /datum/reagent/consumable/ethanol/silencer,\ - /datum/reagent/consumable/ethanol/peppermint_patty,\ - /datum/reagent/consumable/ethanol/aloe,\ - /datum/reagent/consumable/pumpkin_latte) - - var/reagent_type = pick(possible_reagents) - wanted_reagent = new reagent_type - name = wanted_reagent.name - description = "CentCom is offering a reward for talented mixologists. Ship a container of [name] to claim the prize." - reward += rand(0, 4) * 500 - -/datum/bounty/reagent/chemical_simple - name = "Simple Chemical" - reward = CARGO_CRATE_VALUE * 8 - required_volume = 30 - -/datum/bounty/reagent/chemical_simple/New() - // Chemicals that can be mixed by a single skilled Chemist. - var/static/list/possible_reagents = list(\ - /datum/reagent/medicine/leporazine,\ - /datum/reagent/medicine/clonexadone,\ - /datum/reagent/medicine/ephedrine,\ - /datum/reagent/medicine/diphenhydramine, - /datum/reagent/drug/space_drugs, - /datum/reagent/drug/blastoff, - /datum/reagent/gunpowder, - /datum/reagent/napalm, - /datum/reagent/firefighting_foam, - /datum/reagent/consumable/mayonnaise, - /datum/reagent/toxin/itching_powder, - /datum/reagent/toxin/cyanide, - /datum/reagent/toxin/heparin, - /datum/reagent/medicine/atropine, - /datum/reagent/drug/aranesp, - /datum/reagent/drug/krokodil, - /datum/reagent/drug/methamphetamine, - /datum/reagent/toxin/anacea, - ) - - var/reagent_type = pick(possible_reagents) - wanted_reagent = new reagent_type - name = wanted_reagent.name - description = "CentCom is in desperate need of the chemical [name]. Ship a container of it to be rewarded." - reward += rand(0, 4) * 500 //4000 to 6000 credits - -/datum/bounty/reagent/chemical_complex - name = "Rare Chemical" - reward = CARGO_CRATE_VALUE * 12 - required_volume = 20 - -/datum/bounty/reagent/chemical_complex/New() - // Reagents that require interaction with multiple departments or are a pain to mix. Lower required_volume since acquiring 30u of some is unrealistic - var/static/list/possible_reagents = list(\ - /datum/reagent/medicine/cryoxadone, - /datum/reagent/medicine/regen_jelly, - /datum/reagent/drug/bath_salts, - /datum/reagent/hair_dye, - /datum/reagent/consumable/honey, - /datum/reagent/consumable/frostoil, - /datum/reagent/toxin/slimejelly, - /datum/reagent/toxin/mimesbane, - /datum/reagent/medicine/strange_reagent, - /datum/reagent/nitroglycerin, - /datum/reagent/toxin/zombiepowder, - /datum/reagent/toxin/ghoulpowder, - /datum/reagent/mulligan - ) - - var/reagent_type = pick(possible_reagents) - wanted_reagent = new reagent_type - name = wanted_reagent.name - description = "CentCom is paying premium for the chemical [name]. Ship a container of it to be rewarded." - reward += rand(0, 5) * 750 //6000 to 9750 credits - -/datum/bounty/pill - /// quantity of the pills needed, this value acts as minimum, gets randomized on new() - var/required_ammount = 80 - /// counter for pills sent - var/shipped_ammount = 0 - /// reagent requested - var/datum/reagent/wanted_reagent - /// minimum volume of chemical needed, gets randomized on new() - var/wanted_vol = 30 - -/datum/bounty/pill/can_claim() - return ..() && shipped_ammount >= required_ammount - -/datum/bounty/pill/applies_to(obj/O) - if(!istype(O, /obj/item/reagent_containers/pill)) - return FALSE - if(O?.reagents.get_reagent_amount(wanted_reagent.type) >= wanted_vol) - return TRUE - return FALSE - -/datum/bounty/pill/ship(obj/O) - if(!applies_to(O)) - return - shipped_ammount += 1 - if(shipped_ammount > required_ammount) - shipped_ammount = required_ammount - -/datum/bounty/pill/simple_pill - name = "Simple Pill" - reward = CARGO_CRATE_VALUE * 20 - -/datum/bounty/pill/simple_pill/New() - //reagent that are possible to be chem factory'd - var/static/list/possible_reagents = list( - /datum/reagent/medicine/spaceacillin, - /datum/reagent/medicine/synthflesh, - /datum/reagent/medicine/dexalin, - /datum/reagent/medicine/atropine, - /datum/reagent/medicine/cryoxadone, - /datum/reagent/medicine/dexalin, - /datum/reagent/medicine/dermaline, - /datum/reagent/medicine/meralyne, - /datum/reagent/drug/methamphetamine, - /datum/reagent/nitrous_oxide, - /datum/reagent/barbers_aid, - /datum/reagent/flash_powder, - /datum/reagent/phlogiston, - /datum/reagent/firefighting_foam - ) - - var/datum/reagent/reagent_type = pick(possible_reagents) - wanted_reagent = new reagent_type - name = "[wanted_reagent.name] pills" - required_ammount += rand(1,60) - wanted_vol += rand(1,20) - description = "CentCom requires [required_ammount] of [name] containing at least [wanted_vol] each. Ship a container of it to be rewarded." - reward += rand(1, 5) * (CARGO_CRATE_VALUE * 6) diff --git a/code/modules/cargo/bounties/security.dm b/code/modules/cargo/bounties/security.dm deleted file mode 100644 index bce1fcbe210e..000000000000 --- a/code/modules/cargo/bounties/security.dm +++ /dev/null @@ -1,75 +0,0 @@ -/datum/bounty/item/security/recharger - name = "Rechargers" - description = "The Mars Executive Outcomes military academy is conducting marksmanship exercises. They request that rechargers be shipped." - reward = CARGO_CRATE_VALUE * 4 - required_count = 3 - wanted_types = list(/obj/machinery/recharger = TRUE) - -/datum/bounty/item/security/pepperspray - name = "Pepperspray" - description = "We've been having a bad run of riots on Space Station 76. We could use some new pepperspray cans." - reward = CARGO_CRATE_VALUE * 6 - required_count = 4 - wanted_types = list(/obj/item/reagent_containers/spray/pepper = TRUE) - -/datum/bounty/item/security/prison_clothes - name = "Prison Uniforms" - description = "Terragov has been unable to source any new prisoner uniforms, so if you have any spares, we'll take them off your hands." - reward = CARGO_CRATE_VALUE * 4 - required_count = 4 - wanted_types = list(/obj/item/clothing/under/rank/prisoner = TRUE) - -/datum/bounty/item/security/plates - name = "License Plates" - description = "As a result of a bad clown car crash, we could use an advance on some of your prisoner's license plates." - reward = CARGO_CRATE_VALUE * 2 - required_count = 10 - wanted_types = list(/obj/item/stack/license_plates/filled = TRUE) - -/datum/bounty/item/security/earmuffs - name = "Earmuffs" - description = "Central Command is getting tired of your station's messages. They've ordered that you ship some earmuffs to lessen the annoyance." - reward = CARGO_CRATE_VALUE * 2 - wanted_types = list(/obj/item/clothing/ears/earmuffs = TRUE) - -/datum/bounty/item/security/handcuffs - name = "Handcuffs" - description = "A large influx of escaped convicts have arrived at Central Command. Now is the perfect time to ship out spare handcuffs (or restraints)." - reward = CARGO_CRATE_VALUE * 2 - required_count = 5 - wanted_types = list(/obj/item/restraints/handcuffs = TRUE) - - -///Bounties that require you to perform documentation and inspection of your department to send to centcom. -/datum/bounty/item/security/paperwork - name = "Routine Security Inspection" - description = "Perform a routine security inspection using an N-spect scanner on the following station area:" - required_count = 1 - wanted_types = list(/obj/item/paper/report = TRUE) - reward = CARGO_CRATE_VALUE * 5 - var/area/demanded_area - -/datum/bounty/item/security/paperwork/New() - ///list of areas for security to choose from to perform an inspection. - var/static/list/possible_areas = list(\ - /area/station/maintenance,\ - /area/station/commons,\ - /area/station/service,\ - /area/station/hallway/primary,\ - /area/station/security/office,\ - /area/station/security/prison,\ - /area/station/security/range,\ - /area/station/security/checkpoint,\ - /area/station/security/interrogation) - demanded_area = pick(possible_areas) - name = name + ": [initial(demanded_area.name)]" - description = initial(description) + " [initial(demanded_area.name)]" - -/datum/bounty/item/security/paperwork/applies_to(obj/O) - . = ..() - if(!istype(O, /obj/item/paper/report)) - return FALSE - var/obj/item/paper/report/slip = O - if(istype(slip.scanned_area, demanded_area)) - return TRUE - return FALSE diff --git a/code/modules/cargo/bounties/slime.dm b/code/modules/cargo/bounties/slime.dm deleted file mode 100644 index b30588d8ae97..000000000000 --- a/code/modules/cargo/bounties/slime.dm +++ /dev/null @@ -1,35 +0,0 @@ -/datum/bounty/item/slime - reward = CARGO_CRATE_VALUE * 6 - -/datum/bounty/item/slime/New() - ..() - description = "Nanotrasen's science lead is hunting for the rare and exotic [name]. A bounty has been offered for finding it." - reward += rand(0, 4) * 500 - -/datum/bounty/item/slime/green - name = "Green Slime Extract" - wanted_types = list(/obj/item/slime_extract/green = TRUE) - -/datum/bounty/item/slime/pink - name = "Pink Slime Extract" - wanted_types = list(/obj/item/slime_extract/pink = TRUE) - -/datum/bounty/item/slime/gold - name = "Gold Slime Extract" - wanted_types = list(/obj/item/slime_extract/gold = TRUE) - -/datum/bounty/item/slime/oil - name = "Oil Slime Extract" - wanted_types = list(/obj/item/slime_extract/oil = TRUE) - -/datum/bounty/item/slime/black - name = "Black Slime Extract" - wanted_types = list(/obj/item/slime_extract/black = TRUE) - -/datum/bounty/item/slime/lightpink - name = "Light Pink Slime Extract" - wanted_types = list(/obj/item/slime_extract/lightpink = TRUE) - -/datum/bounty/item/slime/rainbow - name = "Rainbow Slime Extract" - wanted_types = list(/obj/item/slime_extract/rainbow = TRUE) diff --git a/code/modules/cargo/bounties/special.dm b/code/modules/cargo/bounties/special.dm deleted file mode 100644 index 93fd8208dd89..000000000000 --- a/code/modules/cargo/bounties/special.dm +++ /dev/null @@ -1,37 +0,0 @@ -/datum/bounty/item/alien_organs - name = "Alien Organs" - description = "Nanotrasen is interested in studying Xenomorph biology. Ship a set of organs to be thoroughly compensated." - reward = CARGO_CRATE_VALUE * 50 - required_count = 3 - wanted_types = list( - /obj/item/organ/brain/alien = TRUE, - /obj/item/organ/alien = TRUE, - /obj/item/organ/body_egg/alien_embryo = TRUE, - /obj/item/organ/liver/alien = TRUE, - /obj/item/organ/tongue/alien = TRUE, - /obj/item/organ/eyes/night_vision/alien = TRUE, - ) - -/datum/bounty/item/syndicate_documents - name = "Syndicate Documents" - description = "Intel regarding the syndicate is highly prized at CentCom. If you find syndicate documents, ship them. You could save lives." - reward = CARGO_CRATE_VALUE * 30 - wanted_types = list( - /obj/item/documents/syndicate = TRUE, - /obj/item/documents/photocopy = TRUE, - ) - -/datum/bounty/item/syndicate_documents/applies_to(obj/O) - if(!..()) - return FALSE - if(istype(O, /obj/item/documents/photocopy)) - var/obj/item/documents/photocopy/Copy = O - return (Copy.copy_type && ispath(Copy.copy_type, /obj/item/documents/syndicate)) - return TRUE - -/datum/bounty/item/trash - name = "Trash" - description = "Recently a group of janitors have run out of trash to clean up, without any trash CentCom wants to fire them to cut costs. Send a shipment of trash to keep them employed, and they'll give you a small compensation." - reward = CARGO_CRATE_VALUE * 2 - required_count = 10 - wanted_types = list(/obj/item/trash = TRUE) diff --git a/code/modules/cargo/bounties/virus.dm b/code/modules/cargo/bounties/virus.dm deleted file mode 100644 index daa41fbea811..000000000000 --- a/code/modules/cargo/bounties/virus.dm +++ /dev/null @@ -1,72 +0,0 @@ -/datum/bounty/virus - reward = CARGO_CRATE_VALUE * 10 - var/shipped = FALSE - var/stat_value = 0 - var/stat_name = "" - -/datum/bounty/virus/New() - ..() - stat_value = rand(4, 11) - if(rand(3) == 1) - stat_value *= -1 - name = "Virus ([stat_name] of [stat_value])" - description = "Nanotrasen is interested in a virus with a [stat_name] stat of exactly [stat_value]. Central Command will pay handsomely for such a virus." - reward += rand(0, 4) * CARGO_CRATE_VALUE - -/datum/bounty/virus/can_claim() - return ..() && shipped - -/datum/bounty/virus/applies_to(obj/O) - if(shipped) - return FALSE - if(O.flags_1 & HOLOGRAM_1) - return FALSE - if(!istype(O, /obj/item/reagent_containers || !O.reagents || !O.reagents.reagent_list)) - return FALSE - var/datum/reagent/blood/B = locate() in O.reagents.reagent_list - if(!B) - return FALSE - for(var/V in B.get_diseases()) - if(!istype(V, /datum/disease/advance)) - continue - if(accepts_virus(V)) - return TRUE - return FALSE - -/datum/bounty/virus/ship(obj/O) - if(!applies_to(O)) - return - shipped = TRUE - - -/datum/bounty/virus/proc/accepts_virus(V) - return TRUE - -/datum/bounty/virus/resistance - stat_name = "resistance" - -/datum/bounty/virus/resistance/accepts_virus(V) - var/datum/disease/advance/A = V - return A.totalResistance() == stat_value - -/datum/bounty/virus/stage_speed - stat_name = "stage speed" - -/datum/bounty/virus/stage_speed/accepts_virus(V) - var/datum/disease/advance/A = V - return A.totalStageSpeed() == stat_value - -/datum/bounty/virus/stealth - stat_name = "stealth" - -/datum/bounty/virus/stealth/accepts_virus(V) - var/datum/disease/advance/A = V - return A.totalStealth() == stat_value - -/datum/bounty/virus/transmit - stat_name = "transmissible" - -/datum/bounty/virus/transmit/accepts_virus(V) - var/datum/disease/advance/A = V - return A.totalTransmittable() == stat_value - diff --git a/code/modules/cargo/bounty.dm b/code/modules/cargo/bounty.dm deleted file mode 100644 index 480cd6578cc5..000000000000 --- a/code/modules/cargo/bounty.dm +++ /dev/null @@ -1,74 +0,0 @@ -/datum/bounty - var/name - var/description - var/reward = 1000 // In credits. - var/claimed = FALSE - var/high_priority = FALSE - -/datum/bounty/proc/can_claim() - return !claimed - -/// Called when the claim button is clicked. Override to provide fancy rewards. -/datum/bounty/proc/claim() - if(can_claim()) - var/datum/bank_account/D = SSeconomy.station_master - if(D) - D.adjust_money(reward * SSeconomy.bounty_modifier) - claimed = TRUE - -/// If an item sent in the cargo shuttle can satisfy the bounty. -/datum/bounty/proc/applies_to(obj/O) - return FALSE - -/// Called when an object is shipped on the cargo shuttle. -/datum/bounty/proc/ship(obj/O) - return - -/** Returns a new bounty of random type, but does not add it to GLOB.bounties_list. - * - * *Guided determines what specific catagory of bounty should be chosen. - */ -/proc/random_bounty(guided = 0) - var/bounty_num - if(guided && (guided != CIV_JOB_RANDOM)) - bounty_num = guided - else - bounty_num = rand(1,11) - switch(bounty_num) - if(CIV_JOB_BASIC) - var/subtype = pick(subtypesof(/datum/bounty/item/assistant)) - return new subtype - if(CIV_JOB_ROBO) - var/subtype = pick(subtypesof(/datum/bounty/item/mech)) - return new subtype - if(CIV_JOB_CHEF) - var/subtype = pick(subtypesof(/datum/bounty/item/chef)) - return new subtype - if(CIV_JOB_SEC) - var/subtype = pick(subtypesof(/datum/bounty/item/security)) - return new subtype - if(CIV_JOB_DRINK) - if(rand(2) == 1) - return new /datum/bounty/reagent/simple_drink - return new /datum/bounty/reagent/complex_drink - if(CIV_JOB_CHEM) - if(rand(2) == 1) - return new /datum/bounty/reagent/chemical_simple - return new /datum/bounty/reagent/chemical_complex - if(CIV_JOB_VIRO) - var/subtype = pick(subtypesof(/datum/bounty/virus)) - return new subtype - if(CIV_JOB_ENG) - var/subtype = pick(subtypesof(/datum/bounty/item/engineering)) - return new subtype - if(CIV_JOB_MED) - var/subtype = pick(subtypesof(/datum/bounty/item/medical)) - return new subtype - if(CIV_JOB_GROW) - var/subtype = pick(subtypesof(/datum/bounty/item/botany)) - return new subtype - - stack_trace("Tried to return a null bounty! Replacing with assistant.") - var/subtype = pick(subtypesof(/datum/bounty/item/assistant)) - return new subtype - diff --git a/code/modules/cargo/export_scanner.dm b/code/modules/cargo/export_scanner.dm index 26d0422c7f8e..988e1b4680ea 100644 --- a/code/modules/cargo/export_scanner.dm +++ b/code/modules/cargo/export_scanner.dm @@ -24,27 +24,3 @@ to_chat(user, span_notice("Scanned [O], value: [price] credits[O.contents.len ? " (contents included)" : ""].")) else to_chat(user, span_warning("Scanned [O], no export value.")) - - if(ishuman(user)) - var/mob/living/carbon/human/scan_human = user - if(istype(O, /obj/item/bounty_cube)) - var/obj/item/bounty_cube/cube = O - var/datum/bank_account/scanner_account = scan_human.get_bank_account() - - if(!istype(get_area(cube), /area/shuttle/supply)) - to_chat(user, span_warning("Shuttle placement not detected. Handling tip not registered.")) - - else if(cube.bounty_handler_account) - to_chat(user, span_warning("Bank account for handling tip already registered!")) - - else if(scanner_account) - cube.AddComponent(/datum/component/pricetag, scanner_account, cube.handler_tip, FALSE) - - cube.bounty_handler_account = scanner_account - cube.bounty_handler_account.bank_card_talk("Bank account for [price ? "[price * cube.handler_tip] credit " : ""]handling tip successfully registered.") - - if(cube.bounty_holder_account != cube.bounty_handler_account) //No need to send a tracking update to the person scanning it - cube.bounty_holder_account.bank_card_talk("[cube] was scanned in \the [get_area(cube)] by [scan_human] ([scan_human.job]).") - - else - to_chat(user, span_warning("Bank account not detected. Handling tip not registered.")) diff --git a/code/modules/cargo/exports/civilain_bounty.dm b/code/modules/cargo/exports/civilain_bounty.dm deleted file mode 100644 index 05241e0ab755..000000000000 --- a/code/modules/cargo/exports/civilain_bounty.dm +++ /dev/null @@ -1,8 +0,0 @@ -/datum/export/bounty_box - cost = 1 - k_elasticity = 0 //Bounties are non-elastic funds. - unit_name = "completed bounty cube" - export_types = list(/obj/item/bounty_cube) - -/datum/export/bounty_box/get_cost(obj/item/bounty_cube/cube, apply_elastic) - return cube.bounty_value + (cube.bounty_value * cube.speed_bonus) diff --git a/code/modules/cargo/order.dm b/code/modules/cargo/order.dm index 89426e9c7b29..2d55cebd43bf 100644 --- a/code/modules/cargo/order.dm +++ b/code/modules/cargo/order.dm @@ -1,5 +1,7 @@ /// The chance for a manifest or crate to be created with errors -#define MANIFEST_ERROR_CHANCE 5 +#define MANIFEST_BAD_CONTENTS_CHANCE 5 +#define MANIFEST_BAD_NAME_CHANCE 5 +#define MANIFEST_MISSING_CONTENTS_CHANCE 7 // MANIFEST BITFLAGS /// Determines if the station name will be incorrect on the manifest @@ -19,13 +21,15 @@ order_id = id order_cost = cost - if(prob(MANIFEST_ERROR_CHANCE)) + if(prob(MANIFEST_BAD_NAME_CHANCE)) errors |= MANIFEST_ERROR_NAME investigate_log("Supply order #[order_id] generated a manifest with an incorrect station name.", INVESTIGATE_CARGO) - if(prob(MANIFEST_ERROR_CHANCE)) + + if(prob(MANIFEST_BAD_CONTENTS_CHANCE)) errors |= MANIFEST_ERROR_CONTENTS investigate_log("Supply order #[order_id] generated a manifest missing listed contents.", INVESTIGATE_CARGO) - if(prob(MANIFEST_ERROR_CHANCE)) + + if(prob(MANIFEST_MISSING_CONTENTS_CHANCE)) errors |= MANIFEST_ERROR_ITEM investigate_log("Supply order #[order_id] generated with incorrect contents shipped.", INVESTIGATE_CARGO) @@ -95,22 +99,26 @@ P.info += "Item: [packname]
" P.info += "Contents:
" P.info += "" P.info += "

Stamp below to confirm receipt of goods:

" if(P.errors & MANIFEST_ERROR_ITEM) - if(istype(container, /obj/structure/closet/crate/secure) || istype(container, /obj/structure/closet/crate/large)) + if(!pack.can_be_missing_contents) P.errors &= ~MANIFEST_ERROR_ITEM else - var/lost = max(round(container.contents.len / 10), 1) - while(--lost >= 0) + var/lost = max(ceil(container.contents.len * (rand(5, 15) / 100)), 1) // Missing between 5% and 15% + while(lost >= 1) + lost-- qdel(pick(container.contents)) P.update_appearance() @@ -120,8 +128,6 @@ var/obj/structure/closet/crate/C = container C.manifest = P C.update_appearance() - else - container.contents += P return P @@ -143,7 +149,9 @@ generateManifest(miscbox, misc_own, "", misc_cost) return -#undef MANIFEST_ERROR_CHANCE #undef MANIFEST_ERROR_NAME #undef MANIFEST_ERROR_CONTENTS #undef MANIFEST_ERROR_ITEM +#undef MANIFEST_BAD_CONTENTS_CHANCE +#undef MANIFEST_BAD_NAME_CHANCE +#undef MANIFEST_MISSING_CONTENTS_CHANCE diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 0b69806b92a6..0ce51cf120d5 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -8,17 +8,23 @@ var/access = FALSE var/access_view = FALSE var/access_any = FALSE + var/list/contains = null var/crate_name = "crate" var/id var/desc = ""//no desc by default var/crate_type = /obj/structure/closet/crate + + /// If TRUE, can spawn with missing contents due to MANIFEST_ERROR_ITEM occuring. + var/can_be_missing_contents = TRUE var/dangerous = FALSE // Should we message admins? var/special = FALSE //Event/Station Goals/Admin enabled packs var/special_enabled = FALSE + var/DropPodOnly = FALSE //only usable by the Bluespace Drop Pod via the express cargo console var/special_pod //If this pack comes shipped in a specific pod when launched from the express console var/admin_spawned = FALSE + var/goody = FALSE //Goodies can only be purchased by private accounts and can have coupons apply to them. They also come in a lockbox instead of a full crate, so the 700 min doesn't apply /datum/supply_pack/New() diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index 392cbf382942..536ecac58b0d 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -235,7 +235,7 @@ var/true_price = round(price*profit_scaling) to_chat(user, span_notice("[selling ? "Sold" : "Getting the price of"] [I], value: [true_price] credits[I.contents.len ? " (exportable contents included)" : ""].[profit_scaling < 1 && selling ? "[round(price-true_price)] credit\s taken as processing fee\s." : ""]")) if(selling) - new /obj/item/holochip(get_turf(user),true_price) + SSeconomy.spawn_cash_for_amount(true_price, get_turf(user)) else to_chat(user, span_warning("There is no export value for [I] or any items within it.")) diff --git a/code/modules/economy/account.dm b/code/modules/economy/account.dm index a8d7c747afb6..2ed534e0c04b 100644 --- a/code/modules/economy/account.dm +++ b/code/modules/economy/account.dm @@ -11,20 +11,19 @@ var/datum/job/account_job ///List of the physical ID card objects that are associated with this bank_account var/list/bank_cards = list() - ///Should this ID be added to the global list of accounts? If true, will be subject to station-bound economy effects as well as income. - var/add_to_accounts = TRUE + ///The Unique ID number code associated with the owner's bank account, assigned at round start. var/account_id - ///Is there a CRAB 17 on the station draining funds? Prevents manual fund transfer. pink levels are rising - var/being_dumped = FALSE - ///Reference to the current civilian bounty that the account is working on. - var/datum/bounty/civilian_bounty - ///If player is currently picking a civilian bounty to do, these options are held here to prevent soft-resetting through the UI. - var/list/datum/bounty/bounties + /// A randomly generated 5-digit pin to access the bank account. This is stored as a string! + var/account_pin + ///Can this account be replaced? Set to true for default IDs not recognized by the station. var/replaceable = FALSE - ///Cooldown timer on replacing a civilain bounty. Bounties can only be replaced once every 5 minutes. - COOLDOWN_DECLARE(bounty_timer) + ///Should this ID be added to the global list of accounts? If true, will be subject to station-bound economy effects as well as income. + var/add_to_accounts = TRUE + + ///Is there a CRAB 17 on the station draining funds? Prevents manual fund transfer. pink levels are rising + var/being_dumped = FALSE /datum/bank_account/New(newname, job, modifier = 1, player_account = TRUE) account_holder = newname @@ -33,6 +32,9 @@ add_to_accounts = player_account setup_unique_account_id() + for(var/i in 1 to 5) + account_pin = "[account_pin][rand(0, 9)]" + /datum/bank_account/Destroy() if(add_to_accounts) SSeconomy.bank_accounts_by_id -= "[account_id]" @@ -122,7 +124,9 @@ /datum/bank_account/proc/payday(amt_of_paychecks = 1, free = FALSE) if(!account_job) return + var/money_to_transfer = round(account_job.paycheck * payday_modifier * amt_of_paychecks) + if(free) adjust_money(money_to_transfer) SSblackbox.record_feedback("amount", "free_income", money_to_transfer) @@ -131,9 +135,7 @@ else var/datum/bank_account/D = SSeconomy.station_master if(D && transfer_money(D, money_to_transfer)) - bank_card_talk("Payday processed, account now holds [account_balance] cr.") return TRUE - bank_card_talk("ERROR: Payday aborted, unable to contact departmental account.") return FALSE /** @@ -175,45 +177,6 @@ M.playsound_local(get_turf(sound_atom), 'sound/machines/twobeep_high.ogg', 50, TRUE) to_chat(M, "[icon2html(icon_source, M)] [span_notice("[message]")]") -/** - * Returns a string with the civilian bounty's description on it. - */ -/datum/bank_account/proc/bounty_text() - if(!civilian_bounty) - return FALSE - return civilian_bounty.description - - -/** - * Returns the required item count, or required chemical units required to submit a bounty. - */ -/datum/bank_account/proc/bounty_num() - if(!civilian_bounty) - return FALSE - if(istype(civilian_bounty, /datum/bounty/item)) - var/datum/bounty/item/item = civilian_bounty - return "[item.shipped_count]/[item.required_count]" - if(istype(civilian_bounty, /datum/bounty/reagent)) - var/datum/bounty/reagent/chemical = civilian_bounty - return "[chemical.shipped_volume]/[chemical.required_volume] u" - if(istype(civilian_bounty, /datum/bounty/virus)) - return "At least 1u" - -/** - * Produces the value of the account's civilian bounty reward, if able. - */ -/datum/bank_account/proc/bounty_value() - if(!civilian_bounty) - return FALSE - return civilian_bounty.reward - -/** - * Performs house-cleaning on variables when a civilian bounty is replaced, or, when a bounty is claimed. - */ -/datum/bank_account/proc/reset_bounty() - civilian_bounty = null - COOLDOWN_RESET(src, bounty_timer) - /datum/bank_account/department account_holder = "Guild Credit Agency" var/department_id = "REPLACE_ME" diff --git a/code/modules/economy/holopay.dm b/code/modules/economy/holopay.dm deleted file mode 100644 index 845c2204b2e4..000000000000 --- a/code/modules/economy/holopay.dm +++ /dev/null @@ -1,292 +0,0 @@ -/obj/structure/holopay - name = "holographic pay stand" - desc = "an unregistered pay stand" - icon = 'icons/obj/economy.dmi' - icon_state = "card_scanner" - alpha = 150 - anchored = TRUE - armor = list(BLUNT = 0, PUNCTURE = 50, SLASH = 0, LASER = 50, ENERGY = 50, BOMB = 0, BIO = 0, FIRE = 20, ACID = 20) - max_integrity = 15 - layer = FLY_LAYER - /// ID linked to the holopay - var/obj/item/card/id/linked_card - /// Max range at which the hologram can be projected before it deletes - var/max_holo_range = 4 - /// The holopay shop icon displayed in the UI - var/shop_logo = "donate" - /// Replaces the "pay whatever" functionality with a set amount when non-zero. - var/force_fee = 0 - -/obj/structure/holopay/examine(mob/user) - . = ..() - if(force_fee) - . += span_boldnotice("This holopay forces a payment of [force_fee] credit\s per swipe instead of a variable amount.") - -/obj/structure/holopay/Initialize(mapload) - . = ..() - register_context() - -/obj/structure/holopay/add_context(atom/source, list/context, obj/item/held_item, mob/user) - . = ..() - - if(istype(held_item, /obj/item/card/id)) - context[SCREENTIP_CONTEXT_LMB] = "Pay" - var/obj/item/card/id/held_id = held_item - if(held_id.my_store && held_id.my_store == src) - context[SCREENTIP_CONTEXT_RMB] = "Dissipate pay stand" - return CONTEXTUAL_SCREENTIP_SET - - else if(istype(held_item, /obj/item/holochip)) - context[SCREENTIP_CONTEXT_LMB] = "Pay" - return CONTEXTUAL_SCREENTIP_SET - -/obj/structure/holopay/attack_hand(mob/living/user, list/modifiers) - . = ..() - if(.) - return - if(!user.combat_mode) - ui_interact(user) - return . - user.do_attack_animation(src, ATTACK_EFFECT_PUNCH) - user.changeNext_move(CLICK_CD_MELEE) - take_damage(5, BRUTE, BLUNT, 1) - -/obj/structure/holopay/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) - switch(damage_type) - if(BRUTE) - playsound(loc, 'sound/weapons/egloves.ogg', 80, TRUE) - if(BURN) - playsound(loc, 'sound/weapons/egloves.ogg', 80, TRUE) - -/obj/structure/holopay/deconstruct() - dissipate() - return ..() - -/obj/structure/holopay/Destroy() - linked_card?.my_store = null - linked_card = null - return ..() - -/obj/structure/holopay/attackby(obj/item/held_item, mob/item_holder, params) - var/mob/living/user = item_holder - if(!isliving(user)) - return ..() - /// Users can pay with an ID to skip the UI - if(istype(held_item, /obj/item/card/id)) - if(force_fee && tgui_alert(item_holder, "This holopay has a [force_fee] cr fee. Confirm?", "Holopay Fee", list("Pay", "Cancel")) != "Pay") - return TRUE - process_payment(user) - return TRUE - /// Users can also pay by holochip - if(istype(held_item, /obj/item/holochip)) - /// Account checks - var/obj/item/holochip/chip = held_item - if(!chip.credits) - balloon_alert(user, "holochip is empty") - to_chat(user, span_warning("There doesn't seem to be any credits here.")) - return FALSE - /// Charges force fee or uses pay what you want - var/cash_deposit = force_fee || tgui_input_number(user, "How much? (Max: [chip.credits])", "Patronage", max_value = chip.credits) - /// Exit sanity checks - if(!cash_deposit) - return TRUE - if(QDELETED(held_item) || QDELETED(user) || QDELETED(src) || !user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) - return FALSE - if(!chip.spend(cash_deposit, FALSE)) - balloon_alert(user, "insufficient credits") - to_chat(user, span_warning("You don't have enough credits to pay with this chip.")) - return FALSE - /// Success: Alert buyer - alert_buyer(user, cash_deposit) - return TRUE - /// Throws errors if they try to use space cash - if(istype(held_item, /obj/item/stack/spacecash)) - to_chat(user, "What is this, the 2000s? We only take card here.") - return TRUE - if(istype(held_item, /obj/item/coin)) - to_chat(user, "What is this, the 1800s? We only take card here.") - return TRUE - return ..() - -/obj/structure/holopay/attackby_secondary(obj/item/weapon, mob/user, params) - /// Can kill it by right-clicking with ID because it seems useful and intuitive, to me, at least - if(!istype(weapon, /obj/item/card/id)) - return ..() - var/obj/item/card/id/attacking_id = weapon - if(!attacking_id.my_store || attacking_id.my_store != src) - return ..() - dissipate() - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - -/obj/structure/holopay/ui_interact(mob/user, datum/tgui/ui) - . = ..() - if(.) - return FALSE - var/mob/living/interactor = user - if(isliving(interactor) && interactor.combat_mode) - return FALSE - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "HoloPay") - ui.open() - -/obj/structure/holopay/ui_status(mob/user) - . = ..() - if(!in_range(user, src) && !isobserver(user)) - return UI_CLOSE - -/obj/structure/holopay/ui_static_data(mob/user) - . = list() - .["available_logos"] = linked_card.available_logos - .["description"] = desc - .["max_fee"] = linked_card.holopay_max_fee - .["owner"] = linked_card.registered_account?.account_holder || null - .["shop_logo"] = shop_logo - -/obj/structure/holopay/ui_data(mob/user) - . = list() - .["force_fee"] = force_fee - .["name"] = name - if(!isliving(user)) - return . - var/mob/living/card_holder = user - var/obj/item/card/id/id_card = card_holder.get_idcard(TRUE) - var/datum/bank_account/account = id_card?.registered_account || null - if(account) - .["user"] = list() - .["user"]["name"] = account.account_holder - .["user"]["balance"] = account.account_balance - -/obj/structure/holopay/ui_act(action, list/params, datum/tgui/ui) - . = ..() - if(.) - return FALSE - switch(action) - if("done") - ui.send_full_update() - return TRUE - if("fee") - linked_card.set_holopay_fee(params["amount"]) - force_fee = linked_card.holopay_fee - if("logo") - linked_card.set_holopay_logo(params["logo"]) - shop_logo = linked_card.holopay_logo - if("pay") - ui.close() - process_payment(usr) - return TRUE - if("rename") - linked_card.set_holopay_name(params["name"]) - name = linked_card.holopay_name - return FALSE - -/** - * Links the source card to the holopay. Begins checking if its in range. - * - * Parameters: - * * turf/target - The tile to project the holopay onto - * * obj/item/card/id/card - The card to link to the holopay - * Returns: - * * TRUE - the card was linked - */ -/obj/structure/holopay/proc/assign_card(turf/target, obj/item/card/id/card) - linked_card = card - desc = "Pays directly into [card.registered_account.account_holder]'s bank account." - force_fee = card.holopay_fee - shop_logo = card.holopay_logo - name = card.holopay_name - add_atom_colour("#77abff", FIXED_COLOUR_PRIORITY) - set_light(2) - visible_message(span_notice("A holographic pay stand appears.")) - /// Start checking if the source projection is in range - track(linked_card) - return TRUE - -/obj/structure/holopay/proc/track(atom/movable/thing) - RegisterSignal(thing, COMSIG_MOVABLE_MOVED, PROC_REF(handle_move)) - var/list/locations = get_nested_locs(thing, include_turf = FALSE) - for(var/atom/movable/location in locations) - RegisterSignal(location, COMSIG_MOVABLE_MOVED, PROC_REF(handle_move)) - -/obj/structure/holopay/proc/untrack(atom/movable/thing) - UnregisterSignal(thing, COMSIG_MOVABLE_MOVED) - var/list/locations = get_nested_locs(thing, include_turf = FALSE) - for(var/atom/movable/location in locations) - UnregisterSignal(location, COMSIG_MOVABLE_MOVED) - -/** - * A periodic check to see if the projecting card is nearby. - * Deletes the holopay if not. - */ -/obj/structure/holopay/proc/handle_move(atom/movable/source, atom/old_loc, dir, forced, list/old_locs) - if(ismovable(old_loc)) - untrack(old_loc) - if(!IN_GIVEN_RANGE(src, linked_card, max_holo_range)) - dissipate() - return - if(ismovable(source.loc)) - track(source.loc) - -/** - * Creates holopay vanishing effects. - * Deletes the holopay thereafter. - */ -/obj/structure/holopay/proc/dissipate() - playsound(loc, "sound/effects/empulse.ogg", 40, TRUE) - visible_message(span_notice("The pay stand vanishes.")) - qdel(src) - -/** - * Initiates a transaction between accounts. - * - * Parameters: - * * mob/living/user - The user who initiated the transaction. - * Returns: - * * TRUE - transaction was successful - */ -/obj/structure/holopay/proc/process_payment(mob/living/user) - /// Account checks - var/obj/item/card/id/id_card - id_card = user.get_idcard(TRUE) - if(!id_card || !id_card.registered_account || !id_card.registered_account.account_job) - balloon_alert(user, "invalid account") - to_chat(user, span_warning("You don't have a valid account.")) - return FALSE - var/datum/bank_account/payee = id_card.registered_account - if(payee == linked_card?.registered_account) - balloon_alert(user, "invalid transaction") - to_chat(user, span_warning("You can't pay yourself.")) - return FALSE - /// If the user has enough money, ask them the amount or charge the force fee - var/amount = force_fee || tgui_input_number(user, "How much? (Max: [payee.account_balance])", "Patronage", max_value = payee.account_balance) - /// Exit checks in case the user cancelled or entered an invalid amount - if(!amount || QDELETED(user) || QDELETED(src) || !user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) - return FALSE - if(!payee.adjust_money(-amount)) - balloon_alert(user, "insufficient credits") - to_chat(user, span_warning("You don't have the money to pay for this.")) - return FALSE - /// Success: Alert the buyer - alert_buyer(user, amount) - return TRUE - -/** - * Alerts the owner of the transaction. - * - * Parameters: - * * payee - The user who initiated the transaction. - * * amount - The amount of money that was paid. - * Returns: - * * TRUE - alert was successful. - */ -/obj/structure/holopay/proc/alert_buyer(payee, amount) - /// Pay the owner - linked_card.registered_account.adjust_money(amount) - /// Make alerts - linked_card.registered_account.bank_card_talk("[payee] has deposited [amount] cr at your holographic pay stand.") - say("Thank you for your patronage, [payee]!") - playsound(src, 'sound/effects/cashregister.ogg', 20, TRUE) - /// Log the event - log_econ("[amount] credits were transferred from [payee]'s transaction to [linked_card.registered_account.account_holder]") - SSblackbox.record_feedback("amount", "credits_transferred", amount) - return TRUE diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm index 3533b4ea5f24..ddb0e72a7063 100644 --- a/code/modules/events/pirates.dm +++ b/code/modules/events/pirates.dm @@ -150,7 +150,7 @@ /obj/machinery/shuttle_scrambler/proc/dump_loot(mob/user) if(credits_stored) // Prevents spamming empty holochips - new /obj/item/holochip(drop_location(), credits_stored) + SSeconomy.spawn_cash_for_amount(credits_stored, drop_location()) to_chat(user,span_notice("You retrieve the siphoned credits!")) credits_stored = 0 else @@ -492,13 +492,4 @@ /datum/export/pirate/cash/get_amount(obj/O) var/obj/item/stack/spacecash/C = O - return ..() * C.amount * C.value - -/datum/export/pirate/holochip - cost = 1 - unit_name = "holochip" - export_types = list(/obj/item/holochip) - -/datum/export/pirate/holochip/get_cost(atom/movable/AM) - var/obj/item/holochip/H = AM - return H.credits + return ..() * C.get_item_credit_value() diff --git a/code/modules/explorer_drone/loot.dm b/code/modules/explorer_drone/loot.dm index 9fc39c3b6268..5b9aa890a1e1 100644 --- a/code/modules/explorer_drone/loot.dm +++ b/code/modules/explorer_drone/loot.dm @@ -69,7 +69,7 @@ GLOBAL_LIST_INIT(adventure_loot_generator_index,generate_generator_index()) /// Valuables /datum/adventure_loot_generator/simple/cash id = "cash" - loot_list = list(/obj/item/storage/bag/money,/obj/item/antique,/obj/item/stack/spacecash/c1000,/obj/item/holochip/thousand) + loot_list = list(/obj/item/storage/bag/money,/obj/item/antique,/obj/item/stack/spacecash/c1000,) /// Drugs /datum/adventure_loot_generator/simple/drugs diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm index 766c9e2f3408..bc00a11b262b 100644 --- a/code/modules/jobs/access.dm +++ b/code/modules/jobs/access.dm @@ -34,7 +34,8 @@ /obj/item/proc/GetAccess() return list() -/obj/item/proc/GetID() +/// Get an /obj/item/card/id from this object. bypass_wallet will grab the ID from a wallet even if it's closed +/obj/item/proc/GetID(bypass_wallet = FALSE) return null /obj/item/proc/RemoveID() diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index 51f8d7a99d16..0848185c9008 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -244,11 +244,16 @@ GLOBAL_LIST_INIT(job_display_order, list( /mob/living/carbon/human/on_job_equipping(datum/job/equipping, datum/preferences/used_pref) var/datum/bank_account/bank_account = new(real_name, equipping, dna.species.payday_modifier) - bank_account.payday(STARTING_PAYCHECKS, TRUE) account_id = bank_account.account_id bank_account.replaceable = FALSE dress_up_as_job(equipping, FALSE, used_pref, TRUE) + var/obj/item/storage/wallet/W = wear_id + if(istype(W)) + var/monero = round(equipping.paycheck * dna.species.payday_modifier * STARTING_PAYCHECKS, 10) + SSeconomy.spawn_cash_for_amount(monero, W) + else + bank_account.payday(STARTING_PAYCHECKS, TRUE) /mob/living/proc/dress_up_as_job(datum/job/equipping, visual_only = FALSE) return @@ -321,6 +326,7 @@ GLOBAL_LIST_INIT(job_display_order, list( shoes = /obj/item/clothing/shoes/sneakers/black box = /obj/item/storage/box/survival + id_in_wallet = TRUE preload = TRUE // These are used by the prefs ui, and also just kinda could use the extra help at roundstart var/backpack = /obj/item/storage/backpack @@ -370,7 +376,7 @@ GLOBAL_LIST_INIT(job_display_order, list( if(!J) J = SSjob.GetJob(H.job) - var/obj/item/card/id/card = H.wear_id + var/obj/item/card/id/card = H.wear_id.GetID() if(istype(card)) ADD_TRAIT(card, TRAIT_JOB_FIRST_ID_CARD, ROUNDSTART_TRAIT) shuffle_inplace(card.access) // Shuffle access list to make NTNet passkeys less predictable diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index ff3de3128d2b..7bde55c55bda 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -123,7 +123,7 @@ GLOBAL_LIST_EMPTY(security_officer_distribution) // If there's a departmental sec trim to apply to the card, overwrite. if(dep_trim) - var/obj/item/card/id/worn_id = spawning.get_idcard(hand_first = FALSE) + var/obj/item/card/id/worn_id = spawning.get_idcard(hand_first = FALSE, bypass_wallet = TRUE) SSid_access.apply_trim_to_card(worn_id, dep_trim) spawning.sec_hud_set_ID() diff --git a/code/modules/mapfluff/ruins/spaceruin_code/crashedship.dm b/code/modules/mapfluff/ruins/spaceruin_code/crashedship.dm index 4f47da876140..61999fc6199b 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/crashedship.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/crashedship.dm @@ -35,7 +35,7 @@ gloves = /obj/item/clothing/gloves/color/fyellow head = /obj/item/clothing/head/hardhat r_pocket = /obj/item/paper/fluff/ruins/crashedship/old_diary - l_pocket = /obj/item/stack/spacecash/c200 + l_pocket = /obj/item/stack/spacecash/c100 mask = /obj/item/clothing/mask/breath belt = /obj/item/tank/internals/emergency_oxygen/engi diff --git a/code/modules/mining/money_bag.dm b/code/modules/mining/money_bag.dm index 2ef2b5b9b4a9..914f4700740e 100644 --- a/code/modules/mining/money_bag.dm +++ b/code/modules/mining/money_bag.dm @@ -16,7 +16,7 @@ icon_state = "moneybagalt" atom_storage.max_slots = 40 atom_storage.max_specific_storage = 40 - atom_storage.set_holdable(list(/obj/item/coin, /obj/item/stack/spacecash, /obj/item/holochip)) + atom_storage.set_holdable(list(/obj/item/coin, /obj/item/stack/spacecash)) /obj/item/storage/bag/money/vault/PopulateContents() new /obj/item/coin/silver(src) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 5ac62502d609..521070e05c4a 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -100,7 +100,8 @@ //ID if(wear_id && !(wear_id.item_flags & EXAMINE_SKIP)) - . += "[t_He] [t_is] wearing [wear_id.get_examine_string(user)]. \[Look at ID\]" + var/id_topic = wear_id.GetID() ? " \[Look at ID\]" : "" + . += "[t_He] [t_is] wearing [wear_id.get_examine_string(user)].[id_topic]" //Status effects diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index f88a05a0c2a7..b279e3737fad 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -79,14 +79,14 @@ . = if_no_id //to prevent null-names making the mob unclickable return -/mob/living/carbon/human/get_idcard(hand_first = TRUE) +/mob/living/carbon/human/get_idcard(hand_first = TRUE, bypass_wallet) RETURN_TYPE(/obj/item/card/id) . = ..() if(. && hand_first) return //Check inventory slots - return (wear_id?.GetID() || belt?.GetID()) + return (wear_id?.GetID(bypass_wallet) || belt?.GetID(bypass_wallet)) /mob/living/carbon/human/can_track(mob/living/user) if(istype(head, /obj/item/clothing/head)) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index b1554e462406..c3f2f0d0bcf9 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -407,7 +407,7 @@ * Argument: * * hand_firsts - boolean that checks the hands of the mob first if TRUE. */ -/mob/living/proc/get_idcard(hand_first) +/mob/living/proc/get_idcard(hand_first, bypass_wallet) RETURN_TYPE(/obj/item/card/id) if(!length(held_items)) //Early return for mobs without hands. @@ -415,11 +415,11 @@ //Check hands var/obj/item/held_item = get_active_held_item() if(held_item) //Check active hand - . = held_item.GetID() + . = held_item.GetID(bypass_wallet) if(!.) //If there is no id, check the other hand held_item = get_inactive_held_item() if(held_item) - . = held_item.GetID() + . = held_item.GetID(bypass_wallet) /mob/living/proc/get_id_in_hand() var/obj/item/held_item = get_active_held_item() diff --git a/code/modules/mob/living/simple_animal/friendly/trader.dm b/code/modules/mob/living/simple_animal/friendly/trader.dm index 31f8e85ce2c1..033c8c4fa859 100644 --- a/code/modules/mob/living/simple_animal/friendly/trader.dm +++ b/code/modules/mob/living/simple_animal/friendly/trader.dm @@ -151,12 +151,13 @@ if(npc_result != "Yes") return face_atom(user) - var/obj/item/holochip/cash - cash = user.is_holding_item_of_type(/obj/item/holochip) - if(!cash || cash.credits < products[item_to_buy]) + + var/obj/item/stack/spacecash/cash = user.is_holding_item_of_type(/obj/item/stack/spacecash) + if(!cash || cash.get_item_credit_value() < products[item_to_buy]) say(nocashphrase) return - cash.spend(products[item_to_buy]) + + cash.use_cash(products[item_to_buy]) item_to_buy = new item_to_buy(get_turf(user)) user.put_in_hands(item_to_buy) playsound(src, sell_sound, 50, TRUE) @@ -213,9 +214,7 @@ * * user - The mob we put the holochip in hands of */ /mob/living/simple_animal/hostile/retaliate/trader/proc/generate_cash(value, mob/user) - var/obj/item/holochip/chip = new /obj/item/holochip(get_turf(user), value) - user.put_in_hands(chip) - + SSeconomy.spawn_cash_for_amount(value, get_turf(user)) /mob/living/simple_animal/hostile/retaliate/trader/mrbones name = "Mr. Bones" desc = "A skeleton merchant, he seems very humerus." diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index 3e70063cf5fe..d7ec158b7f16 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -170,7 +170,7 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar return card_slot.GetAccess() return ..() -/obj/item/modular_computer/GetID() +/obj/item/modular_computer/GetID(bypass_wallet) var/obj/item/computer_hardware/card_slot/card_slot = all_components[MC_CARD] var/obj/item/computer_hardware/card_slot/card_slot2 = all_components[MC_CARD2] @@ -617,10 +617,10 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar return TRUE /obj/item/modular_computer/proc/UpdateDisplay() - if(!imprint_prefix || !saved_identification) + if(!imprint_prefix) name = initial(name) //No saved ID, no fucked up name. return - name = "[imprint_prefix] - [saved_identification] [saved_job ? "([saved_job])" : null]" + name = "[imprint_prefix] - [saved_job ? "([saved_job])" : null]" /obj/item/modular_computer/screwdriver_act(mob/user, obj/item/tool) if(!deconstructable) diff --git a/code/modules/modular_computers/hardware/card_slot.dm b/code/modules/modular_computers/hardware/card_slot.dm index 2e527435c8ef..9c7ecae036c9 100644 --- a/code/modules/modular_computers/hardware/card_slot.dm +++ b/code/modules/modular_computers/hardware/card_slot.dm @@ -43,7 +43,7 @@ total_access |= card_slot2.stored_card.GetAccess() return total_access -/obj/item/computer_hardware/card_slot/GetID() +/obj/item/computer_hardware/card_slot/GetID(bypass_wallet) if(stored_card) return stored_card return ..() diff --git a/code/modules/modular_computers/laptop_vendor.dm b/code/modules/modular_computers/laptop_vendor.dm index 25adb8307fe3..2a53e21b9f3f 100644 --- a/code/modules/modular_computers/laptop_vendor.dm +++ b/code/modules/modular_computers/laptop_vendor.dm @@ -225,16 +225,11 @@ var/obj/item/stack/spacecash/c = I if(!user.temporarilyRemoveItemFromInventory(c)) return - credits += c.value - visible_message(span_info("[span_name("[user]")] inserts [c.value] cr into [src].")) + credits += c.get_item_credit_value() + visible_message(span_info("[span_name("[user]")] inserts [c.get_item_credit_value()] cr into [src].")) qdel(c) return - else if(istype(I, /obj/item/holochip)) - var/obj/item/holochip/HC = I - credits += HC.credits - visible_message(span_info("[user] inserts a [HC.credits] cr holocredit chip into [src].")) - qdel(HC) - return + else if(istype(I, /obj/item/card/id)) if(state != 2) return diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm index 97a4771987f8..93dab29d6a36 100644 --- a/code/modules/research/designs/comp_board_designs.dm +++ b/code/modules/research/designs/comp_board_designs.dm @@ -206,11 +206,6 @@ id = "advanced_camera" build_path = /obj/item/circuitboard/computer/advanced_camera -/datum/design/board/bountypad_control - name = "Circuit Board (Civilian Bounty Pad Control)" - desc = "Allows for the construction of circuit boards used to build a new civilian bounty pad console." - id = "bounty_pad_control" - build_path = /obj/item/circuitboard/computer/bountypad /datum/design/board/exoscanner_console name = "Circuit Board (Scanner Array Control Console)" desc = "Allows for the construction of circuit boards used to build a new scanner array control console." diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 0fbd2f02cba8..6d9cc5d55375 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -512,13 +512,6 @@ build_path = /obj/item/circuitboard/machine/vendatray mapload_design_flags = DESIGN_IMPRINTER -/datum/design/board/bountypad - name = "Machine Board (Civilian Bounty Pad)" - desc = "The circuit board for a Civilian Bounty Pad." - id = "bounty_pad" - build_path = /obj/item/circuitboard/machine/bountypad - mapload_design_flags = DESIGN_IMPRINTER - /datum/design/board/skill_station name = "Machine Board (Skill station)" desc = "The circuit board for Skill station." diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index 163441cd1950..658a54d2c87c 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -1267,16 +1267,19 @@ GLOBAL_LIST_EMPTY(vending_products) break if(!dispensed_item) return FALSE + /// Charges the user if its not the owner if(!compartmentLoadAccessCheck(user)) if(!payee.has_money(dispensed_item.custom_price)) balloon_alert(user, "insufficient funds") return TRUE + /// Make the transaction payee.adjust_money(-dispensed_item.custom_price) linked_account.adjust_money(dispensed_item.custom_price) linked_account.bank_card_talk("[payee.account_holder] made a [dispensed_item.custom_price] \ cr purchase at your custom vendor.") + /// Log the transaction SSblackbox.record_feedback("amount", "vending_spent", dispensed_item.custom_price) log_econ("[dispensed_item.custom_price] credits were spent on [src] buying a \ diff --git a/code/modules/wiremod/shell/moneybot.dm b/code/modules/wiremod/shell/moneybot.dm index 2ee9cf6fa023..f63c460e5914 100644 --- a/code/modules/wiremod/shell/moneybot.dm +++ b/code/modules/wiremod/shell/moneybot.dm @@ -16,7 +16,7 @@ var/locked = FALSE /obj/structure/money_bot/deconstruct(disassembled) - new /obj/item/holochip(drop_location(), stored_money) + SSeconomy.spawn_cash_for_amount(stored_money, drop_location()) return ..() /obj/structure/money_bot/proc/add_money(to_add) @@ -76,7 +76,7 @@ return attached_bot.add_money(-to_dispense) - new /obj/item/holochip(drop_location(), to_dispense) + SSeconomy.spawn_cash_for_amount(to_dispense, drop_location()) /obj/item/circuit_component/money_bot display_name = "Money Bot" diff --git a/daedalus.dme b/daedalus.dme index 5bd9169dd60e..3870386a4ab6 100644 --- a/daedalus.dme +++ b/daedalus.dme @@ -1265,12 +1265,12 @@ #include "code\game\machinery\ai_slipper.dm" #include "code\game\machinery\airlock_control.dm" #include "code\game\machinery\announcement_system.dm" +#include "code\game\machinery\atm.dm" #include "code\game\machinery\autolathe.dm" #include "code\game\machinery\bank_machine.dm" #include "code\game\machinery\buttons.dm" #include "code\game\machinery\canister_frame.dm" #include "code\game\machinery\cell_charger.dm" -#include "code\game\machinery\civilian_bounties.dm" #include "code\game\machinery\constructable_frame.dm" #include "code\game\machinery\dance_machine.dm" #include "code\game\machinery\data_disk.dm" @@ -1514,7 +1514,6 @@ #include "code\game\objects\items\courtroom.dm" #include "code\game\objects\items\crab17.dm" #include "code\game\objects\items\crayons.dm" -#include "code\game\objects\items\credit_holochip.dm" #include "code\game\objects\items\debug_items.dm" #include "code\game\objects\items\defib.dm" #include "code\game\objects\items\dehy_carp.dm" @@ -2497,7 +2496,6 @@ #include "code\modules\cards\deck\kotahi.dm" #include "code\modules\cards\deck\tarot.dm" #include "code\modules\cards\deck\wizoff.dm" -#include "code\modules\cargo\bounty.dm" #include "code\modules\cargo\centcom_podlauncher.dm" #include "code\modules\cargo\coupon.dm" #include "code\modules\cargo\department_order.dm" @@ -2511,20 +2509,7 @@ #include "code\modules\cargo\packs.dm" #include "code\modules\cargo\supplypod.dm" #include "code\modules\cargo\supplypod_beacon.dm" -#include "code\modules\cargo\bounties\assistant.dm" -#include "code\modules\cargo\bounties\botany.dm" -#include "code\modules\cargo\bounties\chef.dm" -#include "code\modules\cargo\bounties\engineering.dm" -#include "code\modules\cargo\bounties\item.dm" -#include "code\modules\cargo\bounties\mech.dm" -#include "code\modules\cargo\bounties\medical.dm" -#include "code\modules\cargo\bounties\reagent.dm" -#include "code\modules\cargo\bounties\security.dm" -#include "code\modules\cargo\bounties\slime.dm" -#include "code\modules\cargo\bounties\special.dm" -#include "code\modules\cargo\bounties\virus.dm" #include "code\modules\cargo\exports\antiques.dm" -#include "code\modules\cargo\exports\civilain_bounty.dm" #include "code\modules\cargo\exports\food_and_drink.dm" #include "code\modules\cargo\exports\gear.dm" #include "code\modules\cargo\exports\large_objects.dm" @@ -2852,7 +2837,6 @@ #include "code\modules\discord\discord_sql_functions.dm" #include "code\modules\economy\_economy.dm" #include "code\modules\economy\account.dm" -#include "code\modules\economy\holopay.dm" #include "code\modules\emoji\emoji_parse.dm" #include "code\modules\error_handler\error_handler.dm" #include "code\modules\error_handler\error_viewer.dm" diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index 7dce9bbed3bd6a21817043b954ab5c11cc2078b4..7fd093bd3dbefeaa401d19802b15edb041803aee 100644 GIT binary patch delta 62514 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

?55FEFnGj_B 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 delta 61060 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 diff --git a/icons/obj/terminals.dmi b/icons/obj/terminals.dmi index 7909abe0fa86f1bece59e00bad2d304c8a982026..e3b4457d623d6aef3a4e8de9169c16009414ce9c 100644 GIT binary patch literal 15814 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 U8>S5WJ{wR|(o)QqH~H}20MXANrT_o{ literal 14963 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