From 23e7de72af90b1ee50b75a0f8a634c58af83f067 Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Tue, 13 Feb 2024 15:46:46 +0300 Subject: [PATCH 01/49] More supply updates --- code/controllers/subsystems/supply.dm | 31 ++++++------ code/game/machinery/trade_beacon.dm | 2 +- .../file_system/programs/generic/supply.dm | 49 ++++++++++++++++--- 3 files changed, 59 insertions(+), 23 deletions(-) diff --git a/code/controllers/subsystems/supply.dm b/code/controllers/subsystems/supply.dm index b1e19dddd2..a5c6d4c194 100644 --- a/code/controllers/subsystems/supply.dm +++ b/code/controllers/subsystems/supply.dm @@ -10,8 +10,6 @@ SUBSYSTEM_DEF(supply) var/list/all_trading_stations = list() /// All visible and available stations var/list/visible_trading_stations = list() - /// All hidden/unavailable stations - var/list/hidden_trading_stations = list() /// All factions in the world; Assoc list Name = Datum. /// Trading stations get the datums from here var/list/factions = list() @@ -96,7 +94,6 @@ SUBSYSTEM_DEF(supply) for(var/datum/trading_station/TS in all_trading_stations) TS.RegainTradeStationsBudget() qdel(TS) - hidden_trading_stations -= TS visible_trading_stations -= TS all_trading_stations -= TS @@ -275,7 +272,7 @@ SUBSYSTEM_DEF(supply) return order_queue_slot -/datum/controller/subsystem/supply/proc/PurchaseOrder(obj/machinery/trade_beacon/receiving/beacon, order_id) +/datum/controller/subsystem/supply/proc/PurchaseOrder(obj/machinery/trade_beacon/receiving/beacon, order_id, used_faction = FACTION_INDEPENDENT) if(QDELETED(beacon) || !beacon || !order_id) return @@ -289,12 +286,12 @@ SUBSYSTEM_DEF(supply) var/total_cost = order["cost"] + order["fee"] var/is_requestor_master = (requesting_account == master_account) ? TRUE : FALSE - Buy(beacon, master_account, shopping_list, !is_requestor_master, requesting_account.owner_name) + Buy(beacon, master_account, shopping_list, !is_requestor_master, requesting_account.owner_name, used_faction) if(!is_requestor_master) requesting_account.transfer(master_account, total_cost, "Order Request") - CreateLogEntry("Order", requesting_account.owner_name, viewable_contents, total_cost) + CreateLogEntry("Order", requesting_account.owner_name, used_faction, viewable_contents, total_cost) -/datum/controller/subsystem/supply/proc/Buy(obj/machinery/trade_beacon/receiving/senderBeacon, datum/money_account/account, list/shopList, is_order = FALSE, buyer_name = null) +/datum/controller/subsystem/supply/proc/Buy(obj/machinery/trade_beacon/receiving/senderBeacon, datum/money_account/account, list/shopList, is_order = FALSE, buyer_name = null, used_faction = FACTION_INDEPENDENT) if(QDELETED(senderBeacon) || !istype(senderBeacon) || !account || !RecursiveLen(shopList)) return FALSE @@ -348,14 +345,17 @@ SUBSYSTEM_DEF(supply) if(count_of_all > 1) invoice_location = C - CreateLogEntry("Shipping", account.owner_name, order_contents_info, price_for_all, FALSE, invoice_location) + CreateLogEntry("Shipping", account.owner_name, used_faction, order_contents_info, price_for_all, FALSE, invoice_location) account.withdraw(price_for_all, "Purchase", "Trade Network") return TRUE -/datum/controller/subsystem/supply/proc/Export(obj/machinery/trade_beacon/sending/senderBeacon, datum/money_account/moneyAccount) +/datum/controller/subsystem/supply/proc/Export(obj/machinery/trade_beacon/sending/senderBeacon, datum/money_account/moneyAccount, used_faction = FACTION_INDEPENDENT) if(QDELETED(senderBeacon)) return + if(!senderBeacon.StartExport()) + return + var/invoice_contents_info var/export_count = 0 var/cost = 0 @@ -392,31 +392,30 @@ SUBSYSTEM_DEF(supply) if(export_count > 100) break - senderBeacon.StartExport() moneyAccount.deposit(cost, "Export", "Trade Network") if(invoice_contents_info) // If no info, then nothing was exported - CreateLogEntry("Export", moneyAccount.owner_name, invoice_contents_info, cost, FALSE, get_turf(senderBeacon)) + CreateLogEntry("Export", moneyAccount.owner_name, used_faction, invoice_contents_info, cost, FALSE, get_turf(senderBeacon)) return TRUE // Logging -/datum/controller/subsystem/supply/proc/CreateLogEntry(type, ordering_account, contents, total_paid, create_invoice = FALSE, invoice_location = null) +/datum/controller/subsystem/supply/proc/CreateLogEntry(type, ordering_account, assoc_faction = FACTION_INDEPENDENT, contents, total_paid, create_invoice = FALSE, invoice_location = null) var/log_id switch(type) if("Shipping") log_id = "[++shipping_invoice_number]-S" - shipping_log.Add(list(list("id" = log_id, "ordering_acct" = ordering_account, "contents" = contents, "total_paid" = total_paid, "time" = time2text(world.time, "hh:mm")))) + shipping_log.Add(list(list("id" = log_id, "ordering_acct" = ordering_account, "assoc_faction" = assoc_faction, "contents" = contents, "total_paid" = total_paid, "time" = time2text(world.time, "hh:mm")))) if("Export") log_id = "[++export_invoice_number]-E" - export_log.Add(list(list("id" = log_id, "ordering_acct" = ordering_account, "contents" = contents, "total_paid" = total_paid, "time" = time2text(world.time, "hh:mm")))) + export_log.Add(list(list("id" = log_id, "ordering_acct" = ordering_account, "assoc_faction" = assoc_faction, "contents" = contents, "total_paid" = total_paid, "time" = time2text(world.time, "hh:mm")))) if("Special Offer") log_id = "[++offer_invoice_number]-SO" - offer_log.Add(list(list("id" = log_id, "ordering_acct" = ordering_account, "contents" = contents, "total_paid" = total_paid, "time" = time2text(world.time, "hh:mm")))) + offer_log.Add(list(list("id" = log_id, "ordering_acct" = ordering_account, "assoc_faction" = assoc_faction, "contents" = contents, "total_paid" = total_paid, "time" = time2text(world.time, "hh:mm")))) if("Order") log_id = "[++order_number]-O" - order_log.Add(list(list("id" = log_id, "ordering_acct" = ordering_account, "contents" = contents, "total_paid" = total_paid, "time" = time2text(world.time, "hh:mm")))) + order_log.Add(list(list("id" = log_id, "ordering_acct" = ordering_account, "assoc_faction" = assoc_faction, "contents" = contents, "total_paid" = total_paid, "time" = time2text(world.time, "hh:mm")))) else return diff --git a/code/game/machinery/trade_beacon.dm b/code/game/machinery/trade_beacon.dm index 3f75313109..b67dbc2549 100644 --- a/code/game/machinery/trade_beacon.dm +++ b/code/game/machinery/trade_beacon.dm @@ -33,7 +33,7 @@ name = "sending trade beacon" icon_state = "beacon_sending" var/export_cooldown - var/export_cooldown_time = 120 SECONDS + var/export_cooldown_time = 90 SECONDS /obj/machinery/trade_beacon/sending/Initialize() . = ..() diff --git a/code/modules/modular_computers/file_system/programs/generic/supply.dm b/code/modules/modular_computers/file_system/programs/generic/supply.dm index 34d8840924..6b62c4f81c 100644 --- a/code/modules/modular_computers/file_system/programs/generic/supply.dm +++ b/code/modules/modular_computers/file_system/programs/generic/supply.dm @@ -215,7 +215,10 @@ return TRUE if(href_list["PRG_log_screen"]) - log_screen = input("Select log type", "Log Type", null) as null|anything in LOG_SCREEN_LIST + if(!(href_list["PRG_log_screen"] in LOG_SCREEN_LIST)) + return FALSE + + log_screen = href_list["PRG_log_screen"] current_log_page = 1 return TRUE @@ -595,7 +598,7 @@ if(get_area(receiving) != get_area(computer) && program_type != "master") to_chat(usr, SPAN_WARNING("ERROR: Receiving beacon is too far from \the [computer].")) return - if(!SSsupply.Buy(receiving, account, shopping_list)) + if(!SSsupply.Buy(receiving, account, shopping_list, FALSE, null, faction)) to_chat(usr, SPAN_WARNING("ERROR: Purchase failed.")) return FALSE ResetShopList() @@ -606,7 +609,7 @@ if(get_area(sending) != get_area(computer) && program_type != "master") to_chat(usr, SPAN_WARNING("ERROR: Sending beacon is too far from \the [computer].")) return - SSsupply.Export(sending, account) + SSsupply.Export(sending, account, faction) return TRUE if(href_list["PRG_approve_order"]) @@ -625,7 +628,7 @@ to_chat(usr, SPAN_WARNING("ERROR: Not enough funds in requesting account ([requesting_account.owner_name] #[requesting_account.account_number]).")) return - SSsupply.PurchaseOrder(receiving, order) + SSsupply.PurchaseOrder(receiving, order, faction) SSsupply.order_queue.Remove(order) if(current_order == order) current_order = null @@ -652,6 +655,7 @@ dat += " | " dat += trade_screen == CART_SCREEN ? "<b><u>Cart</u></b>" :"<A href='?src=\ref[src];PRG_trade_screen=[CART_SCREEN]'>Cart</A>" dat += " | " + dat += trade_screen == LOG_SCREEN ? "<b><u>Logs</u></b>" :"<A href='?src=\ref[src];PRG_trade_screen=[LOG_SCREEN]'>Logs</A>" dat += "<A href='?src=\ref[src];PC_exit=1'>Exit</A>" dat += "<hr>" @@ -754,9 +758,12 @@ if(!sending) dat += "<b>Sending beacon is missing!</b>" else - dat += "<A href='?src=\ref[src];PRG_update=1'>Update</A>" + dat += "<A href='?src=\ref[src];PRG_update=1'>Update</A> " dat += "<A href='?src=\ref[src];PRG_export=1'>Export</A>" dat += "<hr>" + if(sending.export_cooldown > world.time) + dat += "<b>Export cooldown: [round(sending.export_cooldown - world.time) / 1 SECONDS] seconds</b>" + dat += "<hr>" var/total_cost = 0 for(var/atom/movable/AM in sending.GetObjects()) if(ishuman(AM)) @@ -767,12 +774,14 @@ var/cost = 0 for(var/atom/movable/item in reverselist(contents_incl_self)) cost += get_value(item) + if(!cost) + continue dat += "- [AM.name] ([cost] [GLOB.using_map.local_currency_name_short])<br>" total_cost += cost if(total_cost) dat += "<b>Total export cost: [total_cost] [GLOB.using_map.local_currency_name_short]</b>" else - dat += "<b>There is no items within sending beacon's range!</b>" + dat += "<b>There is no items for export within sending beacon's range!</b>" if(trade_screen == CART_SCREEN) dat += "<A href='?src=\ref[src];PRG_receive=1'>Purchase</A> | " @@ -794,6 +803,34 @@ dat += "<br>" dat += "<br>" + if(trade_screen == LOG_SCREEN) + dat += trade_screen == LOG_SHIPPING ? "<b><u>Shipping</u></b>" :"<A href='?src=\ref[src];PRG_log_screen=[LOG_SHIPPING]'>Shipping</A>" + dat += " | " + dat += trade_screen == LOG_EXPORT ? "<b><u>Export</u></b>" :"<A href='?src=\ref[src];PRG_log_screen=[LOG_EXPORT]'>Export</A>" + + dat += "<hr>" + + switch(log_screen) + if(LOG_SHIPPING) + for(var/list/log in reverseRange(SSsupply.shipping_log)) + for(var/log in reverseRange(SSsupply.export_log)) + dat += "Time: [log["time"]]<br>" + dat += "Account: [log["ordering_acct"]]<br>" + dat += "Link: [log["assoc_faction"]]<br>" + dat += "Total invoice: [log["total_paid"]] [GLOB.using_map.local_currency_name_short]<br>" + dat += "Articles bought: [log["contents"]]<br>" + dat += "<A href='?src=\ref[src];PRG_print=[log["id"]]'>Print</A>" + dat += "<hr>" + if(LOG_EXPORT) + for(var/log in reverseRange(SSsupply.export_log)) + dat += "Time: [log["time"]]<br>" + dat += "Account: [log["ordering_acct"]]<br>" + dat += "Link: [log["assoc_faction"]]<br>" + dat += "Total invoice: [log["total_paid"]] [GLOB.using_map.local_currency_name_short]<br>" + dat += "Articles sold: [log["contents"]]<br>" + dat += "<A href='?src=\ref[src];PRG_print=[log["id"]]'>Print</A>" + dat += "<hr>" + var/datum/browser/popup = new(user, "supply_prg", "Trade Network", 600, 680) popup.set_content(dat) popup.open() From e63ebac2edcdb985342dbb4fa3e79565fb217e7e Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Tue, 13 Feb 2024 16:01:30 +0300 Subject: [PATCH 02/49] Tiny ui fix --- .../modular_computers/file_system/programs/generic/supply.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/modules/modular_computers/file_system/programs/generic/supply.dm b/code/modules/modular_computers/file_system/programs/generic/supply.dm index 6b62c4f81c..403115333b 100644 --- a/code/modules/modular_computers/file_system/programs/generic/supply.dm +++ b/code/modules/modular_computers/file_system/programs/generic/supply.dm @@ -656,6 +656,7 @@ dat += trade_screen == CART_SCREEN ? "<b><u>Cart</u></b>" :"<A href='?src=\ref[src];PRG_trade_screen=[CART_SCREEN]'>Cart</A>" dat += " | " dat += trade_screen == LOG_SCREEN ? "<b><u>Logs</u></b>" :"<A href='?src=\ref[src];PRG_trade_screen=[LOG_SCREEN]'>Logs</A>" + dat += " | " dat += "<A href='?src=\ref[src];PC_exit=1'>Exit</A>" dat += "<hr>" @@ -804,9 +805,9 @@ dat += "<br>" if(trade_screen == LOG_SCREEN) - dat += trade_screen == LOG_SHIPPING ? "<b><u>Shipping</u></b>" :"<A href='?src=\ref[src];PRG_log_screen=[LOG_SHIPPING]'>Shipping</A>" + dat += log_screen == LOG_SHIPPING ? "<b><u>Shipping</u></b>" :"<A href='?src=\ref[src];PRG_log_screen=[LOG_SHIPPING]'>Shipping</A>" dat += " | " - dat += trade_screen == LOG_EXPORT ? "<b><u>Export</u></b>" :"<A href='?src=\ref[src];PRG_log_screen=[LOG_EXPORT]'>Export</A>" + dat += log_screen == LOG_EXPORT ? "<b><u>Export</u></b>" :"<A href='?src=\ref[src];PRG_log_screen=[LOG_EXPORT]'>Export</A>" dat += "<hr>" From 2531e4c1f612e7859e7a98cdf48689f104050396 Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Tue, 13 Feb 2024 16:06:41 +0300 Subject: [PATCH 03/49] Fix logs --- .../modular_computers/file_system/programs/generic/supply.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/modular_computers/file_system/programs/generic/supply.dm b/code/modules/modular_computers/file_system/programs/generic/supply.dm index 403115333b..edac4f234f 100644 --- a/code/modules/modular_computers/file_system/programs/generic/supply.dm +++ b/code/modules/modular_computers/file_system/programs/generic/supply.dm @@ -814,7 +814,6 @@ switch(log_screen) if(LOG_SHIPPING) for(var/list/log in reverseRange(SSsupply.shipping_log)) - for(var/log in reverseRange(SSsupply.export_log)) dat += "Time: [log["time"]]<br>" dat += "Account: [log["ordering_acct"]]<br>" dat += "Link: [log["assoc_faction"]]<br>" @@ -823,7 +822,7 @@ dat += "<A href='?src=\ref[src];PRG_print=[log["id"]]'>Print</A>" dat += "<hr>" if(LOG_EXPORT) - for(var/log in reverseRange(SSsupply.export_log)) + for(var/list/log in reverseRange(SSsupply.export_log)) dat += "Time: [log["time"]]<br>" dat += "Account: [log["ordering_acct"]]<br>" dat += "Link: [log["assoc_faction"]]<br>" From 5ef58eb76e543772bf70c8229d08191ed42eed83 Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Tue, 13 Feb 2024 16:28:19 +0300 Subject: [PATCH 04/49] Fix cooldown display --- .../modular_computers/file_system/programs/generic/supply.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/modular_computers/file_system/programs/generic/supply.dm b/code/modules/modular_computers/file_system/programs/generic/supply.dm index edac4f234f..9a0268d9d4 100644 --- a/code/modules/modular_computers/file_system/programs/generic/supply.dm +++ b/code/modules/modular_computers/file_system/programs/generic/supply.dm @@ -763,7 +763,7 @@ dat += "<A href='?src=\ref[src];PRG_export=1'>Export</A>" dat += "<hr>" if(sending.export_cooldown > world.time) - dat += "<b>Export cooldown: [round(sending.export_cooldown - world.time) / 1 SECONDS] seconds</b>" + dat += "<b>Export cooldown: [round((sending.export_cooldown - world.time) / 10)] seconds</b>" dat += "<hr>" var/total_cost = 0 for(var/atom/movable/AM in sending.GetObjects()) From 179a27563c72a579ba656a64fc351e1fa1826555 Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Tue, 13 Feb 2024 17:02:14 +0300 Subject: [PATCH 05/49] Changes favor requirement on some traders --- .../trading_station_types/0_always_spawn/materials.dm | 2 +- .../trading_station_types/0_always_spawn/medical.dm | 2 +- .../trading_station_types/0_always_spawn/terra.dm | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/trading_stations/trading_station_types/0_always_spawn/materials.dm b/code/modules/trading_stations/trading_station_types/0_always_spawn/materials.dm index 44930f0cf2..8ac897271e 100644 --- a/code/modules/trading_stations/trading_station_types/0_always_spawn/materials.dm +++ b/code/modules/trading_stations/trading_station_types/0_always_spawn/materials.dm @@ -4,7 +4,7 @@ "FTB \"Steel Deck\"" = "Free Trade Beacon \"Steel Deck\": Best materials around this sector of space!", ) uid = "materials" - unlock_favor = 2500 + unlock_favor = 1200 faction = FACTION_INDEPENDENT spawn_always = TRUE markup = 1.5 diff --git a/code/modules/trading_stations/trading_station_types/0_always_spawn/medical.dm b/code/modules/trading_stations/trading_station_types/0_always_spawn/medical.dm index 50cb496b30..7d1e0dadc0 100644 --- a/code/modules/trading_stations/trading_station_types/0_always_spawn/medical.dm +++ b/code/modules/trading_stations/trading_station_types/0_always_spawn/medical.dm @@ -6,7 +6,7 @@ "ZHTB \"Medicus\"" = "Zeng-Hu Trade Beacon \"Medicus\": Bruise packs, surgery tools, chemicals!", ) uid = "medical" - unlock_favor = 5000 + unlock_favor = 3500 faction = FACTION_INDEPENDENT // Should be under Zeng Hu, potentially spawn_always = TRUE markup = 1.2 diff --git a/code/modules/trading_stations/trading_station_types/0_always_spawn/terra.dm b/code/modules/trading_stations/trading_station_types/0_always_spawn/terra.dm index 38486c579c..a86b148c45 100644 --- a/code/modules/trading_stations/trading_station_types/0_always_spawn/terra.dm +++ b/code/modules/trading_stations/trading_station_types/0_always_spawn/terra.dm @@ -3,7 +3,7 @@ "TTB \"Invictus\"" = "Terran Trade Beacon \"Invictus\": Marine Corps equipment, sold exclusively to TerraGov associates.", ) uid = "terra" - unlock_favor = 10000 + unlock_favor = 12000 faction = FACTION_TERRAGOV whitelist_factions = list(FACTION_TERRAGOV) spawn_always = TRUE From d5cc30e0b070685f524d6d04d4f716e0560b61b2 Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Tue, 13 Feb 2024 18:09:44 +0300 Subject: [PATCH 06/49] More tweaks & fixes --- code/controllers/subsystems/supply.dm | 3 +++ code/datums/uplink/devices and tools.dm | 3 ++- code/game/machinery/trade_beacon.dm | 2 ++ code/game/objects/items/weapons/storage/uplink_kits.dm | 1 - code/modules/item_worth/worths_list.dm | 10 +++++++--- code/modules/research/designs/designs_hud_optical.dm | 10 ++++++---- 6 files changed, 20 insertions(+), 9 deletions(-) diff --git a/code/controllers/subsystems/supply.dm b/code/controllers/subsystems/supply.dm index a5c6d4c194..0398fa1ede 100644 --- a/code/controllers/subsystems/supply.dm +++ b/code/controllers/subsystems/supply.dm @@ -373,6 +373,9 @@ SUBSYSTEM_DEF(supply) // We go backwards, so it'll be innermost objects sold first for(var/atom/movable/item in reverseRange(contents_incl_self)) + if(istype(item, /obj/screen)) + continue + var/item_price = get_value(item) var/export_value = item_price diff --git a/code/datums/uplink/devices and tools.dm b/code/datums/uplink/devices and tools.dm index d9f71b83e1..8a0922d25e 100644 --- a/code/datums/uplink/devices and tools.dm +++ b/code/datums/uplink/devices and tools.dm @@ -25,8 +25,9 @@ /datum/uplink_item/item/tools/money name = "Operations Funding" - item_cost = 8 + item_cost = 10 path = /obj/item/storage/secure/briefcase/money + /datum/uplink_item/item/tools/money/New() . = ..() desc = "A briefcase with 10,000 untraceable [GLOB.using_map.local_currency_name]. Makes a great bribe if they're willing to take you up on your offer." diff --git a/code/game/machinery/trade_beacon.dm b/code/game/machinery/trade_beacon.dm index b67dbc2549..5b1f216b9f 100644 --- a/code/game/machinery/trade_beacon.dm +++ b/code/game/machinery/trade_beacon.dm @@ -54,6 +54,8 @@ continue if(A.invisibility) continue + if(istype(A, /obj/screen)) + continue objects += A return objects diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index dcba0589de..8afecb09b9 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -166,7 +166,6 @@ make_exact_fit() /obj/item/storage/secure/briefcase/money - startswith = list(/obj/item/spacecash/bundle/c1000 = 10) /obj/item/storage/backpack/satchel/syndie_kit/armor diff --git a/code/modules/item_worth/worths_list.dm b/code/modules/item_worth/worths_list.dm index 1e849176b8..f34eb8b7d9 100644 --- a/code/modules/item_worth/worths_list.dm +++ b/code/modules/item_worth/worths_list.dm @@ -41,10 +41,10 @@ var/list/worths = list( /obj/item/gun/energy/temperature = 4000, /obj/item/gun/energy = 2000, //LAUNCHERS, - /obj/item/gun/launcher/crossbow = 120, + /obj/item/gun/launcher/crossbow = 150, /obj/item/gun/launcher/pneumatic/small = 100, - /obj/item/gun/launcher/pneumatic = 200, - /obj/item/gun/launcher/syringe = 150, + /obj/item/gun/launcher/pneumatic = 300, + /obj/item/gun/launcher/syringe = 450, /obj/item/gun/launcher/alien = 3500, /obj/item/gun/launcher = 300, //AUTOMATICS, @@ -101,6 +101,7 @@ var/list/worths = list( /obj/item/stack/medical/advanced/bruise_pack = -20, /obj/item/stack/medical/advanced/ointment = -30, /obj/item/stack/medical/splint = -25, + /obj/item/stack/medical/resin = -50, /obj/item/stack/medical = -15, /obj/item/stack/nanopaste = -30, /obj/item/stack/material/rods = -5, @@ -108,6 +109,7 @@ var/list/worths = list( /obj/item/stack/wax = -5, /obj/item/stack = -5, //STORAGE, + /obj/item/storage/backpack/holding = -2500, /obj/item/storage/briefcase/crimekit = -50, /obj/item/storage = -30, //WEAPONS, @@ -583,6 +585,8 @@ var/list/worths = list( /obj/item/bee_pack = 200, /obj/item/weedkiller = 30, /obj/item/sign/medipolma = 1500, + /obj/item/mop/advanced = 250, + /obj/item/mop = 25, /obj/item = 5, //STRUCTURES, /obj/structure/dogbed = 15, diff --git a/code/modules/research/designs/designs_hud_optical.dm b/code/modules/research/designs/designs_hud_optical.dm index adacddf300..f4a7ebb7e4 100644 --- a/code/modules/research/designs/designs_hud_optical.dm +++ b/code/modules/research/designs/designs_hud_optical.dm @@ -29,10 +29,12 @@ build_path = /obj/item/clothing/glasses/hud/janitor sort_string = "GAAAC" +/datum/design/item/optical + materials = list(MATERIAL_STEEL = 250, MATERIAL_GLASS = 250) + /datum/design/item/optical/AssembleDesignName() ..() name = "\[Optical HUD\] - [item_name]" - materials = list(MATERIAL_STEEL = 50, MATERIAL_GLASS = 50) /datum/design/item/optical/mesons name = "mesons" @@ -47,12 +49,12 @@ id = "mesons_material" req_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 3) build_path = /obj/item/clothing/glasses/material - sort_string = "GAAAB" + sort_string = "GBAAB" /datum/design/item/optical/tactical name = "tactical" id = "tactical_goggles" req_tech = list(TECH_MAGNET = 3, TECH_COMBAT = 5) - materials = list(MATERIAL_STEEL = 50, MATERIAL_GLASS = 50, MATERIAL_SILVER = 50, MATERIAL_GOLD = 50) + materials = list(MATERIAL_STEEL = 250, MATERIAL_GLASS = 250, MATERIAL_SILVER = 250, MATERIAL_GOLD = 250, MATERIAL_DIAMOND = 250) build_path = /obj/item/clothing/glasses/tacgoggles - sort_string = "GAAAC" \ No newline at end of file + sort_string = "GBAAC" \ No newline at end of file From 2a2a583a02c6a202a9ea63d7144ffbd7c677667d Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Tue, 13 Feb 2024 18:17:41 +0300 Subject: [PATCH 07/49] Platinum for sale --- .../trading_station_types/0_always_spawn/materials.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/trading_stations/trading_station_types/0_always_spawn/materials.dm b/code/modules/trading_stations/trading_station_types/0_always_spawn/materials.dm index 8ac897271e..d530ee3e45 100644 --- a/code/modules/trading_stations/trading_station_types/0_always_spawn/materials.dm +++ b/code/modules/trading_stations/trading_station_types/0_always_spawn/materials.dm @@ -15,6 +15,7 @@ /obj/item/stack/material/plastic/ten = CUSTOM_GOODS_NAME("plastic (x10)"), /obj/item/stack/material/aluminium/ten = CUSTOM_GOODS_NAME("aluminium (x10)"), /obj/item/stack/material/titanium/ten = CUSTOM_GOODS_NAME("titanium (x10)"), + /obj/item/stack/material/platinum/ten = CUSTOM_GOODS_NAME("platinum (x10)"), /obj/item/stack/material/phoron/ten = CUSTOM_GOODS_NAME("phoron (x10)"), /obj/item/stack/material/uranium/ten = CUSTOM_GOODS_NAME("uranium (x10)"), /obj/item/stack/material/tritium/ten = CUSTOM_GOODS_NAME("tritium (x10)"), From f48dd6f861fe24eb60fdb8a8e49b732a2c209927 Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Tue, 13 Feb 2024 19:06:50 +0300 Subject: [PATCH 08/49] Reverse-list instead of reverse-range --- .../modular_computers/file_system/programs/generic/supply.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/modular_computers/file_system/programs/generic/supply.dm b/code/modules/modular_computers/file_system/programs/generic/supply.dm index 9a0268d9d4..b824980b8e 100644 --- a/code/modules/modular_computers/file_system/programs/generic/supply.dm +++ b/code/modules/modular_computers/file_system/programs/generic/supply.dm @@ -813,7 +813,7 @@ switch(log_screen) if(LOG_SHIPPING) - for(var/list/log in reverseRange(SSsupply.shipping_log)) + for(var/list/log in reverselist(SSsupply.shipping_log)) dat += "Time: [log["time"]]<br>" dat += "Account: [log["ordering_acct"]]<br>" dat += "Link: [log["assoc_faction"]]<br>" @@ -822,7 +822,7 @@ dat += "<A href='?src=\ref[src];PRG_print=[log["id"]]'>Print</A>" dat += "<hr>" if(LOG_EXPORT) - for(var/list/log in reverseRange(SSsupply.export_log)) + for(var/list/log in reverselist(SSsupply.export_log)) dat += "Time: [log["time"]]<br>" dat += "Account: [log["ordering_acct"]]<br>" dat += "Link: [log["assoc_faction"]]<br>" From 20b9bfcde35705979e7f16ea2e9f4d129fa56423 Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Tue, 13 Feb 2024 21:32:17 +0300 Subject: [PATCH 09/49] Fix logs display again --- .../file_system/programs/generic/supply.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/modular_computers/file_system/programs/generic/supply.dm b/code/modules/modular_computers/file_system/programs/generic/supply.dm index b824980b8e..703e40aac6 100644 --- a/code/modules/modular_computers/file_system/programs/generic/supply.dm +++ b/code/modules/modular_computers/file_system/programs/generic/supply.dm @@ -813,7 +813,8 @@ switch(log_screen) if(LOG_SHIPPING) - for(var/list/log in reverselist(SSsupply.shipping_log)) + var/list/L = SSsupply.shipping_log.Copy() + for(var/list/log in reverseRange(L)) dat += "Time: [log["time"]]<br>" dat += "Account: [log["ordering_acct"]]<br>" dat += "Link: [log["assoc_faction"]]<br>" @@ -822,7 +823,8 @@ dat += "<A href='?src=\ref[src];PRG_print=[log["id"]]'>Print</A>" dat += "<hr>" if(LOG_EXPORT) - for(var/list/log in reverselist(SSsupply.export_log)) + var/list/L = SSsupply.export_log.Copy() + for(var/list/log in reverseRange(L)) dat += "Time: [log["time"]]<br>" dat += "Account: [log["ordering_acct"]]<br>" dat += "Link: [log["assoc_faction"]]<br>" From 8882b215d56dc02cc9c20c0057a57b8c596d65e0 Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Tue, 13 Feb 2024 22:47:28 +0300 Subject: [PATCH 10/49] Wizard item worths --- code/modules/item_worth/value_procs.dm | 6 ++++++ code/modules/item_worth/worths_list.dm | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/code/modules/item_worth/value_procs.dm b/code/modules/item_worth/value_procs.dm index d4e9ab6c22..3ef203f4d6 100644 --- a/code/modules/item_worth/value_procs.dm +++ b/code/modules/item_worth/value_procs.dm @@ -85,3 +85,9 @@ . = ..() if(damage) . -= round(. * (damage / max_damage)) + +/obj/item/spellbook/Value(base) + . = ..() + . += length(allowed_spells * 1000) + if(!isnull(owner)) + . *= 0.5 diff --git a/code/modules/item_worth/worths_list.dm b/code/modules/item_worth/worths_list.dm index f34eb8b7d9..7f3a0d3524 100644 --- a/code/modules/item_worth/worths_list.dm +++ b/code/modules/item_worth/worths_list.dm @@ -236,7 +236,7 @@ var/list/worths = list( /obj/item/rcd = 1000, /obj/item/rcd_ammo = 50, /obj/item/rsf = 300, - /obj/item/teleportation_scroll = 2000, + /obj/item/teleportation_scroll = 5000, /obj/item/shield/buckler = 300, //More expensive because people don't make them anymore, /obj/item/shield/riot = 150, /obj/item/shield/energy = 1200, @@ -587,6 +587,7 @@ var/list/worths = list( /obj/item/sign/medipolma = 1500, /obj/item/mop/advanced = 250, /obj/item/mop = 25, + /obj/item/spellbook = -8000, /obj/item = 5, //STRUCTURES, /obj/structure/dogbed = 15, From e7a005fe2a4eab37e870589cab193fa6ef5445ae Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Wed, 14 Feb 2024 17:08:25 +0300 Subject: [PATCH 11/49] Display balance in the console --- .../modular_computers/file_system/programs/generic/supply.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/modular_computers/file_system/programs/generic/supply.dm b/code/modules/modular_computers/file_system/programs/generic/supply.dm index 703e40aac6..ea04f11667 100644 --- a/code/modules/modular_computers/file_system/programs/generic/supply.dm +++ b/code/modules/modular_computers/file_system/programs/generic/supply.dm @@ -672,6 +672,7 @@ if(account) dat += "Current Account: [account.owner_name]<br>" + dat += "Balance: [account.get_balance()]<br>" dat += "<a href='?src=\ref[src];PRG_account_unlink=1'>Unlink</A><br><br>" else dat += "<A href='?src=\ref[src];PRG_account=1'>Link Account</A><br><br>" From a18a0e23d66281e22cbd6684ba7e7a005d92c860 Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Wed, 14 Feb 2024 19:15:04 +0300 Subject: [PATCH 12/49] Payrolls test --- code/controllers/subsystems/supply.dm | 6 ++++++ code/modules/economy/Accounts.dm | 13 +++++++++++++ 2 files changed, 19 insertions(+) diff --git a/code/controllers/subsystems/supply.dm b/code/controllers/subsystems/supply.dm index 0398fa1ede..cf1942974e 100644 --- a/code/controllers/subsystems/supply.dm +++ b/code/controllers/subsystems/supply.dm @@ -3,6 +3,8 @@ SUBSYSTEM_DEF(supply) name = "Supply" priority = SS_PRIORITY_SUPPLY flags = SS_NO_FIRE + runlevels = RUNLEVEL_GAME|RUNLEVEL_POSTGAME + wait = 30 MINUTES /// Budget for trading stations with spawn_always at FALSE var/trade_stations_budget = 5 @@ -65,6 +67,10 @@ SUBSYSTEM_DEF(supply) DeInitTradeStations() . = ..() +/datum/controller/subsystem/supply/fire() + for(var/datum/money_account/A in all_money_accounts) + A.PayrollTick() + /datum/controller/subsystem/supply/proc/GetFaction(fac) if(!(fac in factions)) return null diff --git a/code/modules/economy/Accounts.dm b/code/modules/economy/Accounts.dm index ae31ed28f7..a7dfc0573c 100644 --- a/code/modules/economy/Accounts.dm +++ b/code/modules/economy/Accounts.dm @@ -10,6 +10,8 @@ //1 - require manual login / account number and pin //2 - require card and manual login var/account_type = ACCOUNT_TYPE_PERSONAL + /// Associative list of money accounts which we pay into every 30 minutes; account_number = money + var/list/payroll_accounts = list() /datum/money_account/New(var/account_type) account_type = account_type ? account_type : ACCOUNT_TYPE_PERSONAL @@ -38,6 +40,17 @@ var/datum/transaction/T = new(src, to_account, amount, purpose) return T.perform() +// Called by supply subsystem fire() proc every ~30 minutes +/datum/money_account/proc/PayrollTick() + listclearnulls(payroll_accounts) + for(var/datum/money_account/A in payroll_accounts) + if(!payroll_accounts[A]) + payroll_accounts[A] = 0 + continue + var/pay = payroll_accounts[A] + if(!pay || pay > money) + continue + transfer(A, pay, "Payroll from [account_name]") /proc/create_account(var/account_name = "Default account name", var/owner_name, var/starting_funds = 0, var/account_type = ACCOUNT_TYPE_PERSONAL, var/obj/machinery/computer/account_database/source_db) From 3f8a84320aef2e6f649ec92888ca9375403c753c Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Wed, 14 Feb 2024 22:00:33 +0300 Subject: [PATCH 13/49] Hidden trading stations tiny tweak --- .../trading_stations/_trading_station.dm | 9 ++++++++- sound/machines/sensors/contact_generic.ogg | Bin 0 -> 9404 bytes sound/machines/sensors/contact_identified.ogg | Bin 0 -> 11616 bytes sound/machines/sensors/contact_lost.ogg | Bin 0 -> 12403 bytes sound/machines/sensors/contact_regained.ogg | Bin 0 -> 10234 bytes sound/machines/sensors/dradis.ogg | Bin 0 -> 36460 bytes 6 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 sound/machines/sensors/contact_generic.ogg create mode 100644 sound/machines/sensors/contact_identified.ogg create mode 100644 sound/machines/sensors/contact_lost.ogg create mode 100644 sound/machines/sensors/contact_regained.ogg create mode 100644 sound/machines/sensors/dradis.ogg diff --git a/code/modules/trading_stations/_trading_station.dm b/code/modules/trading_stations/_trading_station.dm index ee0930ad2f..54a67073c7 100644 --- a/code/modules/trading_stations/_trading_station.dm +++ b/code/modules/trading_stations/_trading_station.dm @@ -44,6 +44,7 @@ var/turf/overmap_location var/list/forced_overmap_zone // list(list(minx, maxx), list(miny, maxy)) var/overmap_opacity = 0 + var/overmap_color = null /// If not empty - only factions in this list can trade with it var/list/whitelist_factions = list() @@ -111,8 +112,10 @@ overmap_object.opacity = overmap_opacity overmap_object.dir = pick(rand(1,2), 4, 8) overmap_object.icon_state = pick(icon_states) + overmap_object.color = overmap_color if(start_hidden) + overmap_object.name = "unidentified trade beacon" overmap_object.color = "#444444" GLOB.entered_event.register(overmap_location, src, .proc/Discovered) @@ -121,7 +124,11 @@ return SSsupply.visible_trading_stations |= src - overmap_object.color = null + overmap_object.name = "bluespace trade beacon - [name]" + overmap_object.color = overmap_color + for(var/obj/machinery/computer/ship/helm/H in SSmachines.machinery) + H.visible_message(SPAN_NOTICE("\The [H] pings as <b>[overmap_object.name]</b> is discovered!")) + playsound(H, 'sound/machines/sensors/contact_generic.ogg', 50, TRUE, 3) GLOB.entered_event.unregister(overmap_location, src, .proc/Discovered) /datum/trading_station/proc/AssembleInventory() diff --git a/sound/machines/sensors/contact_generic.ogg b/sound/machines/sensors/contact_generic.ogg new file mode 100644 index 0000000000000000000000000000000000000000..ef4e04b9825743ee9406278a7b090d084d680290 GIT binary patch literal 9404 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 VfO(P#Gkt}dXopM&)xFIJ`aiB2|2O~u literal 0 HcmV?d00001 diff --git a/sound/machines/sensors/contact_identified.ogg b/sound/machines/sensors/contact_identified.ogg new file mode 100644 index 0000000000000000000000000000000000000000..531411c39ed1407632bcd4bd15af54bb7c1f3ba4 GIT binary patch literal 11616 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 KP<846@P7ca95j#s literal 0 HcmV?d00001 diff --git a/sound/machines/sensors/contact_lost.ogg b/sound/machines/sensors/contact_lost.ogg new file mode 100644 index 0000000000000000000000000000000000000000..4a1b7753658a4d6fc9c31147282d5f7b204b4fad GIT binary patch literal 12403 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 literal 0 HcmV?d00001 diff --git a/sound/machines/sensors/contact_regained.ogg b/sound/machines/sensors/contact_regained.ogg new file mode 100644 index 0000000000000000000000000000000000000000..9e35c81b3126782fedf44fde76eea7ea6c4bae1e GIT binary patch literal 10234 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 literal 0 HcmV?d00001 diff --git a/sound/machines/sensors/dradis.ogg b/sound/machines/sensors/dradis.ogg new file mode 100644 index 0000000000000000000000000000000000000000..aa53495a6fd6d4b0cbb929e96e731680cd47d03e GIT binary patch literal 36460 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 literal 0 HcmV?d00001 From 57c8c06e2aedd7c2adeb98530e0712c074dd1bf5 Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Wed, 14 Feb 2024 22:09:35 +0300 Subject: [PATCH 14/49] Faction link cooldown --- .../file_system/programs/generic/supply.dm | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/code/modules/modular_computers/file_system/programs/generic/supply.dm b/code/modules/modular_computers/file_system/programs/generic/supply.dm index ea04f11667..1b3fb0196a 100644 --- a/code/modules/modular_computers/file_system/programs/generic/supply.dm +++ b/code/modules/modular_computers/file_system/programs/generic/supply.dm @@ -33,6 +33,10 @@ // Our associated trade faction var/faction = FACTION_INDEPENDENT + // Point at world.time when we can set/reset the faction again + var/faction_cooldown + // How often we can change faction on the console + var/faction_cooldown_time = 2 MINUTES var/prg_screen = PRG_TREE var/trade_screen = GOODS_SCREEN @@ -229,6 +233,10 @@ return TRUE if(href_list["PRG_faction"]) + if(faction_cooldown > world.time) + to_chat(usr, SPAN_WARNING("The option is currently unavailable! Try again later!")) + return + var/obj/item/stock_parts/computer/card_slot/card_slot = computer.get_component(PART_CARD) if(!istype(card_slot)) to_chat(usr, SPAN_WARNING("Card slot is not installed.")) @@ -258,9 +266,14 @@ return faction = faction_chosen + faction_cooldown = world.time + faction_cooldown_time return TRUE if(href_list["PRG_faction_unlink"]) + if(faction_cooldown > world.time) + to_chat(usr, SPAN_WARNING("The option is currently unavailable! Try again later!")) + return + faction = FACTION_INDEPENDENT return TRUE From 24560e5c46dfc678194260662a186cf638ed22f0 Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Wed, 14 Feb 2024 23:26:59 +0300 Subject: [PATCH 15/49] Grown plants and gas values --- code/_helpers/atmospherics.dm | 7 ++++- code/modules/hydroponics/seed.dm | 42 ++++++++++++++++++++++++++ code/modules/item_worth/value_procs.dm | 26 ++++++++++++++++ code/modules/item_worth/worths_list.dm | 4 +-- code/modules/xgm/gases.dm | 22 ++++++++++++++ code/modules/xgm/xgm_gas_data.dm | 2 ++ 6 files changed, 100 insertions(+), 3 deletions(-) diff --git a/code/_helpers/atmospherics.dm b/code/_helpers/atmospherics.dm index ec309d81cf..1d050f4dea 100644 --- a/code/_helpers/atmospherics.dm +++ b/code/_helpers/atmospherics.dm @@ -13,4 +13,9 @@ /proc/print_atmos_analysis(user, var/list/result) for(var/line in result) - to_chat(user, "<span class='notice'>[line]</span>") \ No newline at end of file + to_chat(user, "<span class='notice'>[line]</span>") + +/proc/GetGasDatum(gas_id) + if(!(gas_id in gas_data.gases)) + return null + return gas_data.gases[gas_id] diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index eed07e7200..762a2bc751 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -861,3 +861,45 @@ res.overlays += I return res + +/datum/seed/proc/Value(check_chems = TRUE) + . = 5 + for(var/trait in traits) + var/trait_value = get_trait(trait) + if(!trait_value) + continue + + switch(trait) + if(TRAIT_POTENCY) + . += trait_value * 0.4 + if(TRAIT_EXPLOSIVE) + . += 15 + if(TRAIT_HARVEST_REPEAT) + . += 15 + if(TRAIT_PRODUCTION) + . += trait_value + if(TRAIT_YIELD) + . += trait_value + if(TRAIT_MATURATION) + . -= trait_value + if(TRAIT_ENDURANCE) + . += trait_value * 0.25 + if(TRAIT_JUICY) + . += trait_value * 5 + if(TRAIT_STINGS) + . += 15 + + for(var/gas_id in exude_gasses) + var/decl/xgm_gas/gas = GetGasDatum(gas_id) + if(!istype(gas)) + continue + . += gas.value * exude_gasses[gas_id] + + if(check_chems) + for(var/chem in chems) + var/datum/reagent/R = GLOB.chemical_reagents_list[chem] + if(!istype(R)) + continue + . += R.value * chems[chem] + + . = round(max(2, .)) diff --git a/code/modules/item_worth/value_procs.dm b/code/modules/item_worth/value_procs.dm index 3ef203f4d6..797f5e9366 100644 --- a/code/modules/item_worth/value_procs.dm +++ b/code/modules/item_worth/value_procs.dm @@ -91,3 +91,29 @@ . += length(allowed_spells * 1000) if(!isnull(owner)) . *= 0.5 + +/obj/item/reagent_containers/food/snacks/grown/Value(base) + . = ..() + . += seed.Value(FALSE) + +// Seeds cost less than fully grown plants +/obj/item/seeds/Value(base) + . = ..() + . += round(seed.Value(TRUE) * 0.3) + +/obj/item/tank/Value(base) + . = ..() + for(var/gas_id in air_contents.gas) + var/decl/xgm_gas/gas = GetGasDatum(gas_id) + if(!istype(gas)) + continue + . += gas.value * air_contents.gas[gas_id] + +// Mostly for canisters +/obj/machinery/portable_atmospherics/Value(base) + . = ..() + for(var/gas_id in air_contents.gas) + var/decl/xgm_gas/gas = GetGasDatum(gas_id) + if(!istype(gas)) + continue + . += gas.value * air_contents.gas[gas_id] diff --git a/code/modules/item_worth/worths_list.dm b/code/modules/item_worth/worths_list.dm index 7f3a0d3524..575762b498 100644 --- a/code/modules/item_worth/worths_list.dm +++ b/code/modules/item_worth/worths_list.dm @@ -300,8 +300,8 @@ var/list/worths = list( /obj/item/melee/classic_baton = 40, /obj/item/melee/telebaton = 100, /obj/item/excalibur = 5000, - /obj/item/tank/jetpack = 450, - /obj/item/tank = 50, + /obj/item/tank/jetpack = -250, + /obj/item/tank = -50, /obj/item/contraband/poster = 25, //MATERIAL, /obj/item/material/sword/katana/replica = -120, diff --git a/code/modules/xgm/gases.dm b/code/modules/xgm/gases.dm index 902182cb92..568d52b571 100644 --- a/code/modules/xgm/gases.dm +++ b/code/modules/xgm/gases.dm @@ -7,6 +7,7 @@ breathed_product = /datum/reagent/oxygen symbol_html = "O<sub>2</sub>" symbol = "O2" + value = 4 /decl/xgm_gas/nitrogen @@ -16,6 +17,7 @@ molar_mass = 0.028 // kg/mol symbol_html = "N<sub>2</sub>" symbol = "N2" + value = 2 /decl/xgm_gas/carbon_dioxide id = GAS_CO2 @@ -24,6 +26,7 @@ molar_mass = 0.044 // kg/mol symbol_html = "CO<sub>2</sub>" symbol = "CO2" + value = 4 /decl/xgm_gas/methyl_bromide id = GAS_METHYL_BROMIDE @@ -33,6 +36,7 @@ breathed_product = /datum/reagent/toxin/methyl_bromide symbol_html = "CH<sub>3</sub>Br" symbol = "CH3Br" + value = 8 /decl/xgm_gas/phoron id = GAS_PHORON @@ -53,6 +57,7 @@ breathed_product = /datum/reagent/toxin/phoron symbol_html = "Ph" symbol = "Ph" + value = 12 /decl/xgm_gas/sleeping_agent id = GAS_N2O @@ -63,6 +68,7 @@ breathed_product = /datum/reagent/nitrous_oxide symbol_html = "N<sub>2</sub>O" symbol = "N2O" + value = 3 /decl/xgm_gas/methane id = GAS_METHANE @@ -72,6 +78,7 @@ flags = XGM_GAS_FUEL symbol_html = "CH<sub>4</sub>" symbol = "CH4" + value = 3 /decl/xgm_gas/alium id = GAS_ALIEN @@ -79,6 +86,7 @@ hidden_from_codex = TRUE symbol_html = "X" symbol = "X" + value = 20 /decl/xgm_gas/alium/New() var/num = rand(100,999) @@ -109,18 +117,21 @@ burn_product = GAS_STEAM symbol_html = "H<sub>2</sub>" symbol = "H2" + value = 10 /decl/xgm_gas/hydrogen/deuterium id = GAS_DEUTERIUM name = "Deuterium" symbol_html = "D" symbol = "D" + value = 10 /decl/xgm_gas/hydrogen/tritium id = GAS_TRITIUM name = "Tritium" symbol_html = "T" symbol = "T" + value = 15 /decl/xgm_gas/helium id = GAS_HELIUM @@ -131,6 +142,7 @@ breathed_product = /datum/reagent/helium symbol_html = "He" symbol = "He" + value = 7 /decl/xgm_gas/argon id = GAS_ARGON @@ -139,6 +151,7 @@ molar_mass = 0.018 // kg/mol symbol_html = "Ar" symbol = "Ar" + value = 25 // If narcosis is ever simulated, krypton has a narcotic potency seven times greater than regular airmix. /decl/xgm_gas/krypton @@ -148,6 +161,7 @@ molar_mass = 0.036 // kg/mol symbol_html = "Kr" symbol = "Kr" + value = 25 /decl/xgm_gas/neon id = GAS_NEON @@ -156,6 +170,7 @@ molar_mass = 0.01 // kg/mol symbol_html = "Ne" symbol = "Ne" + value = 10 /decl/xgm_gas/xenon id = GAS_XENON @@ -165,6 +180,7 @@ breathed_product = /datum/reagent/nitrous_oxide/xenon symbol_html = "Xe" symbol = "Xe" + value = 10 /decl/xgm_gas/nitrodioxide id = GAS_NO2 @@ -186,6 +202,7 @@ flags = XGM_GAS_OXIDIZER symbol_html = "NO" symbol = "NO" + value = 15 /decl/xgm_gas/chlorine id = GAS_CHLORINE @@ -198,6 +215,7 @@ breathed_product = /datum/reagent/toxin/chlorine symbol_html = "Cl" symbol = "Cl" + value = 7 /decl/xgm_gas/vapor id = GAS_STEAM @@ -211,6 +229,7 @@ condensation_point = 308.15 // 35C. Dew point is ~20C but this is better for gameplay considerations. symbol_html = "H<sub>2</sub>O" symbol = "H2O" + value = 1 /decl/xgm_gas/sulfurdioxide id = GAS_SULFUR @@ -220,6 +239,7 @@ molar_mass = 0.044 // kg/mol symbol_html = "SO<sub>2</sub>" symbol = "SO2" + value = 12 /decl/xgm_gas/ammonia id = GAS_AMMONIA @@ -230,6 +250,7 @@ breathed_product = /datum/reagent/ammonia symbol_html = "NH<sub>3</sub>" symbol = "NH3" + value = 1 /decl/xgm_gas/carbon_monoxide id = GAS_CO @@ -239,3 +260,4 @@ breathed_product = /datum/reagent/carbon_monoxide symbol_html = "CO" symbol = "CO" + value = 5 diff --git a/code/modules/xgm/xgm_gas_data.dm b/code/modules/xgm/xgm_gas_data.dm index 46c76985ab..481a411380 100644 --- a/code/modules/xgm/xgm_gas_data.dm +++ b/code/modules/xgm/xgm_gas_data.dm @@ -51,6 +51,8 @@ var/symbol_html = "X" var/symbol = "X" + /// Cost per mole + var/value = 0 /hook/startup/proc/generateGasData() gas_data = new From bf88f402115e53acdd2ae00963670cde66fa8840 Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Wed, 14 Feb 2024 23:51:18 +0300 Subject: [PATCH 16/49] Market crash effect! --- code/controllers/subsystems/supply.dm | 32 ++++++++++++++++++- .../file_system/programs/generic/supply.dm | 13 ++++++-- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/code/controllers/subsystems/supply.dm b/code/controllers/subsystems/supply.dm index cf1942974e..10c0c1a728 100644 --- a/code/controllers/subsystems/supply.dm +++ b/code/controllers/subsystems/supply.dm @@ -35,6 +35,15 @@ SUBSYSTEM_DEF(supply) var/order_queue_id = 0 var/list/order_queue = list() + // For exporting + var/list/export_modifier = list() + var/list/export_counter = list() + /// Paths of atoms that are entirely unaffected by export price modifiers + var/list/export_modifier_exempt_types = list( + /obj/item/stack, + /obj/item/reagent_containers, + ) + /datum/controller/subsystem/supply/Initialize() . = ..() for(var/faction_type in typesof(/datum/trade_faction)) @@ -70,6 +79,9 @@ SUBSYSTEM_DEF(supply) /datum/controller/subsystem/supply/fire() for(var/datum/money_account/A in all_money_accounts) A.PayrollTick() + for(var/A in export_counter) + export_counter[A] = max(0, export_counter[A] -= 10000) + ExportCounterCheck() /datum/controller/subsystem/supply/proc/GetFaction(fac) if(!(fac in factions)) @@ -382,12 +394,16 @@ SUBSYSTEM_DEF(supply) if(istype(item, /obj/screen)) continue - var/item_price = get_value(item) + var/item_price = GetExportValue(item) var/export_value = item_price if(export_value) invoice_contents_info += "<li>[item.name]</li>" cost += export_value + if(!(is_path_in_list(item.type, export_modifier_exempt_types))) + if(!(item.type in export_counter)) + export_counter[item.type] = 0 + export_counter[item.type] += export_value //SEND_SIGNAL(src, COMSIG_TRADE_BEACON, item) qdel(item) ++export_count @@ -401,12 +417,26 @@ SUBSYSTEM_DEF(supply) if(export_count > 100) break + ExportCounterCheck() + moneyAccount.deposit(cost, "Export", "Trade Network") if(invoice_contents_info) // If no info, then nothing was exported CreateLogEntry("Export", moneyAccount.owner_name, used_faction, invoice_contents_info, cost, FALSE, get_turf(senderBeacon)) return TRUE +/datum/controller/subsystem/supply/proc/GetExportValue(atom/A) + . = get_value(A) + if(A.type in export_modifier) + . *= export_modifier[A.type] + +/datum/controller/subsystem/supply/proc/ExportCounterCheck() + for(var/A in export_counter) + if(export_counter[A] > 25000) + export_modifier[A] = clamp(round(25000 / export_counter[A], 0.01), 0.5, 2.0) + else if(A in export_modifier) + export_modifier -= A + // Logging /datum/controller/subsystem/supply/proc/CreateLogEntry(type, ordering_account, assoc_faction = FACTION_INDEPENDENT, contents, total_paid, create_invoice = FALSE, invoice_location = null) diff --git a/code/modules/modular_computers/file_system/programs/generic/supply.dm b/code/modules/modular_computers/file_system/programs/generic/supply.dm index 1b3fb0196a..a7cf554840 100644 --- a/code/modules/modular_computers/file_system/programs/generic/supply.dm +++ b/code/modules/modular_computers/file_system/programs/generic/supply.dm @@ -787,11 +787,20 @@ if(is_path_in_list(/mob/living/carbon/human, contents_incl_self)) continue var/cost = 0 + var/normal_cost = 0 for(var/atom/movable/item in reverselist(contents_incl_self)) - cost += get_value(item) + cost += SSsupply.GetExportValue(item) + normal_cost += get_value(item) if(!cost) continue - dat += "- [AM.name] ([cost] [GLOB.using_map.local_currency_name_short])<br>" + dat += "- [AM.name] ([cost] [GLOB.using_map.local_currency_name_short])" + if(cost < normal_cost) + var/percent_diff = round(cost / normal_cost, 0.01) * 100 + dat += " <span style='color: [COLOR_RED]'>([percent_diff]%)</span>" + else if(cost > normal_cost) + var/percent_diff = round(cost / normal_cost, 0.01) * 100 + dat += " <span style='color: [COLOR_GREEN]'>([percent_diff]%)</span>" + dat += "<br>" total_cost += cost if(total_cost) dat += "<b>Total export cost: [total_cost] [GLOB.using_map.local_currency_name_short]</b>" From 10e41be5eee41ab0cf78dec0fdb07d6f405d59a2 Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Thu, 15 Feb 2024 01:22:19 +0300 Subject: [PATCH 17/49] Fix issue with SMG mags --- code/modules/projectiles/ammunition/boxes.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm index daba6ffe5d..3b4d0fec53 100644 --- a/code/modules/projectiles/ammunition/boxes.dm +++ b/code/modules/projectiles/ammunition/boxes.dm @@ -126,7 +126,7 @@ /obj/item/ammo_magazine/machine_pistol/rubber labels = list("rubber") - ammo_type = /obj/item/projectile/bullet/smg/rubber + ammo_type = /obj/item/ammo_casing/smg/rubber /obj/item/ammo_magazine/machine_pistol/empty initial_ammo = 0 @@ -135,7 +135,7 @@ name = "top mounted magazine" icon_state = "smg_top" mag_type = MAGAZINE - ammo_type = /obj/item/projectile/bullet/smg/small + ammo_type = /obj/item/ammo_casing/smg/small matter = list(MATERIAL_STEEL = 1200) caliber = CALIBER_SMG_SMALL max_ammo = 20 From 02b4062237b97803423ea6f90dca1b9e5b25f70b Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Thu, 15 Feb 2024 01:42:49 +0300 Subject: [PATCH 18/49] Changes how market crash works --- code/controllers/subsystems/supply.dm | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/code/controllers/subsystems/supply.dm b/code/controllers/subsystems/supply.dm index 10c0c1a728..85d4e71c49 100644 --- a/code/controllers/subsystems/supply.dm +++ b/code/controllers/subsystems/supply.dm @@ -80,7 +80,7 @@ SUBSYSTEM_DEF(supply) for(var/datum/money_account/A in all_money_accounts) A.PayrollTick() for(var/A in export_counter) - export_counter[A] = max(0, export_counter[A] -= 10000) + export_counter[A] = max(0, export_counter[A] -= 10) ExportCounterCheck() /datum/controller/subsystem/supply/proc/GetFaction(fac) @@ -403,7 +403,8 @@ SUBSYSTEM_DEF(supply) if(!(is_path_in_list(item.type, export_modifier_exempt_types))) if(!(item.type in export_counter)) export_counter[item.type] = 0 - export_counter[item.type] += export_value + if(export_counter[item.type] < 30) + export_counter[item.type] += 1 //SEND_SIGNAL(src, COMSIG_TRADE_BEACON, item) qdel(item) ++export_count @@ -432,8 +433,8 @@ SUBSYSTEM_DEF(supply) /datum/controller/subsystem/supply/proc/ExportCounterCheck() for(var/A in export_counter) - if(export_counter[A] > 25000) - export_modifier[A] = clamp(round(25000 / export_counter[A], 0.01), 0.5, 2.0) + if(export_counter[A] > 20) + export_modifier[A] = clamp(round(20 / export_counter[A], 0.01), 0.5, 2.0) else if(A in export_modifier) export_modifier -= A From 56ccd1358ac575012cca78132a3c252f5f626f3f Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Thu, 15 Feb 2024 01:53:56 +0300 Subject: [PATCH 19/49] Fix gas proc --- code/_helpers/atmospherics.dm | 7 ++++++- code/controllers/subsystems/supply.dm | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/code/_helpers/atmospherics.dm b/code/_helpers/atmospherics.dm index 1d050f4dea..45a3acc802 100644 --- a/code/_helpers/atmospherics.dm +++ b/code/_helpers/atmospherics.dm @@ -18,4 +18,9 @@ /proc/GetGasDatum(gas_id) if(!(gas_id in gas_data.gases)) return null - return gas_data.gases[gas_id] + var/list/all_gases = decls_repository.get_decls_of_subtype(/decl/xgm_gas) + for(var/decl/xgm_gas/gas in all_gases) + if(gas_id != gas.id) + continue + return gas + return null diff --git a/code/controllers/subsystems/supply.dm b/code/controllers/subsystems/supply.dm index 85d4e71c49..9e83068f2f 100644 --- a/code/controllers/subsystems/supply.dm +++ b/code/controllers/subsystems/supply.dm @@ -404,7 +404,7 @@ SUBSYSTEM_DEF(supply) if(!(item.type in export_counter)) export_counter[item.type] = 0 if(export_counter[item.type] < 30) - export_counter[item.type] += 1 + export_counter[item.type] += 1 //SEND_SIGNAL(src, COMSIG_TRADE_BEACON, item) qdel(item) ++export_count From 0e9a63d6526238ed57929db21975f957baeffd1d Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Thu, 15 Feb 2024 01:59:50 +0300 Subject: [PATCH 20/49] Fix grown plants value --- code/modules/hydroponics/seed.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index 762a2bc751..8895e5eb9e 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -864,7 +864,8 @@ /datum/seed/proc/Value(check_chems = TRUE) . = 5 - for(var/trait in traits) + for(var/trait_text in traits) + var/trait = text2num(trait_text) var/trait_value = get_trait(trait) if(!trait_value) continue From 1fbd555dd43bc2b0baef19de8c17c8f6c6495262 Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Thu, 15 Feb 2024 02:13:06 +0300 Subject: [PATCH 21/49] Fix atmos worth again --- code/_helpers/atmospherics.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/_helpers/atmospherics.dm b/code/_helpers/atmospherics.dm index 45a3acc802..f5b593a5f2 100644 --- a/code/_helpers/atmospherics.dm +++ b/code/_helpers/atmospherics.dm @@ -19,7 +19,8 @@ if(!(gas_id in gas_data.gases)) return null var/list/all_gases = decls_repository.get_decls_of_subtype(/decl/xgm_gas) - for(var/decl/xgm_gas/gas in all_gases) + for(var/type in all_gases) + var/decl/xgm_gas/gas = all_gases[type] if(gas_id != gas.id) continue return gas From c7eb310597c0baeac76e54bfd93d468a0a298f84 Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Thu, 15 Feb 2024 14:10:11 +0300 Subject: [PATCH 22/49] Atmos tweaks --- baystation12.dme | 1 + code/__defines/supply.dm | 2 + code/_helpers/atmospherics.dm | 11 ----- code/game/machinery/atmoalter/canister.dm | 26 +++++++++++ code/modules/hydroponics/seed.dm | 5 +- code/modules/item_worth/value_procs.dm | 12 ++--- .../0_always_spawn/atmos.dm | 44 ++++++++++++++++++ code/modules/xgm/gases.dm | 35 +++++++------- code/modules/xgm/xgm_gas_data.dm | 7 ++- icons/obj/atmos.dmi | Bin 24777 -> 24668 bytes 10 files changed, 102 insertions(+), 41 deletions(-) create mode 100644 code/modules/trading_stations/trading_station_types/0_always_spawn/atmos.dm diff --git a/baystation12.dme b/baystation12.dme index 9e229bc049..b5702e3068 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -3289,6 +3289,7 @@ #include "code\modules\tgs\includes.dm" #include "code\modules\trading_stations\_faction.dm" #include "code\modules\trading_stations\_trading_station.dm" +#include "code\modules\trading_stations\trading_station_types\0_always_spawn\atmos.dm" #include "code\modules\trading_stations\trading_station_types\0_always_spawn\engineering.dm" #include "code\modules\trading_stations\trading_station_types\0_always_spawn\eva.dm" #include "code\modules\trading_stations\trading_station_types\0_always_spawn\materials.dm" diff --git a/code/__defines/supply.dm b/code/__defines/supply.dm index c03b4a6a7f..48f6dbdb93 100644 --- a/code/__defines/supply.dm +++ b/code/__defines/supply.dm @@ -24,6 +24,8 @@ #define TRADE_CAT_MEDKIT "Medical Kits" #define TRADE_CAT_CHEMICAL "Chemical" #define TRADE_CAT_CHEMCARTS "Chemical Cartridges" +#define TRADE_CAT_CANISTERS "Gas Canisters" +#define TRADE_CAT_MACHINES "Machinery" // As in - faction is a part of us #define FACTION_STATE_PROTECTORATE 4 diff --git a/code/_helpers/atmospherics.dm b/code/_helpers/atmospherics.dm index f5b593a5f2..7768dcfb11 100644 --- a/code/_helpers/atmospherics.dm +++ b/code/_helpers/atmospherics.dm @@ -14,14 +14,3 @@ /proc/print_atmos_analysis(user, var/list/result) for(var/line in result) to_chat(user, "<span class='notice'>[line]</span>") - -/proc/GetGasDatum(gas_id) - if(!(gas_id in gas_data.gases)) - return null - var/list/all_gases = decls_repository.get_decls_of_subtype(/decl/xgm_gas) - for(var/type in all_gases) - var/decl/xgm_gas/gas = all_gases[type] - if(gas_id != gas.id) - continue - return gas - return null diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 3a73dd94d6..178b4b45fc 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -174,6 +174,24 @@ GAS_CHLORINE = -1 ) +/obj/machinery/portable_atmospherics/canister/tritium + name = "gas canister \[Tritium\]" + icon_state = "green" + canister_color = "green" + can_label = FALSE + initial_gases = list( + GAS_TRITIUM = -1 + ) + +/obj/machinery/portable_atmospherics/canister/deuterium + name = "gas canister \[Deuterium\]" + icon_state = "green" + canister_color = "green" + can_label = FALSE + initial_gases = list( + GAS_DEUTERIUM = -1 + ) + /obj/machinery/portable_atmospherics/canister/air/airlock start_pressure = 3 * ONE_ATMOSPHERE @@ -219,6 +237,14 @@ icon_state = "purple" canister_type = /obj/machinery/portable_atmospherics/canister/hydrogen +/obj/machinery/portable_atmospherics/canister/empty/tritium + icon_state = "green" + canister_type = /obj/machinery/portable_atmospherics/canister/tritium + +/obj/machinery/portable_atmospherics/canister/empty/deuterium + icon_state = "green" + canister_type = /obj/machinery/portable_atmospherics/canister/deuterium + /obj/machinery/portable_atmospherics/canister/proc/check_change() diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index 8895e5eb9e..d5ce74fd8a 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -891,10 +891,7 @@ . += 15 for(var/gas_id in exude_gasses) - var/decl/xgm_gas/gas = GetGasDatum(gas_id) - if(!istype(gas)) - continue - . += gas.value * exude_gasses[gas_id] + . += gas_data.value[gas_id] * exude_gasses[gas_id] if(check_chems) for(var/chem in chems) diff --git a/code/modules/item_worth/value_procs.dm b/code/modules/item_worth/value_procs.dm index 797f5e9366..e89cfd7add 100644 --- a/code/modules/item_worth/value_procs.dm +++ b/code/modules/item_worth/value_procs.dm @@ -104,16 +104,12 @@ /obj/item/tank/Value(base) . = ..() for(var/gas_id in air_contents.gas) - var/decl/xgm_gas/gas = GetGasDatum(gas_id) - if(!istype(gas)) - continue - . += gas.value * air_contents.gas[gas_id] + . += gas_data.value[gas_id] * air_contents.gas[gas_id] + . = round(.) // Mostly for canisters /obj/machinery/portable_atmospherics/Value(base) . = ..() for(var/gas_id in air_contents.gas) - var/decl/xgm_gas/gas = GetGasDatum(gas_id) - if(!istype(gas)) - continue - . += gas.value * air_contents.gas[gas_id] + . += gas_data.value[gas_id] * air_contents.gas[gas_id] + . = round(.) diff --git a/code/modules/trading_stations/trading_station_types/0_always_spawn/atmos.dm b/code/modules/trading_stations/trading_station_types/0_always_spawn/atmos.dm new file mode 100644 index 0000000000..5b10a00d75 --- /dev/null +++ b/code/modules/trading_stations/trading_station_types/0_always_spawn/atmos.dm @@ -0,0 +1,44 @@ +/datum/trading_station/atmospherics + name_pool = list( + "FTB \"Deuterium Star\"" = "Free Trade Beacon \"Deuterium Star\": All the gases of the world in convenient packaging.", + "FTB \"Breathe-Easy\"" = "Free Trade Beacon \"Breathe-Easy\": Fill those corridors with fresh-fresh air!", + ) + uid = "atmospherics" + unlock_favor = 9000 + random_factions = list( + FACTION_INDEPENDENT, + FACTION_ISC, + ) + spawn_always = TRUE + markup = 1.4 + inventory = list( + TRADE_CAT_EQUIPMENT = list( + /obj/item/tank/oxygen = GOODS_DEFAULT, + /obj/item/tank/nitrogen = GOODS_DEFAULT, + /obj/item/tank/emergency/oxygen = GOODS_DEFAULT, + /obj/item/tank/emergency/oxygen/double = GOODS_DEFAULT, + /obj/item/tank/jetpack/carbondioxide = GOODS_DEFAULT, + /obj/item/tank/jetpack/oxygen = GOODS_DEFAULT, + ), + TRADE_CAT_CANISTERS = list( + /obj/machinery/portable_atmospherics/canister/empty = CUSTOM_GOODS_NAME("empty canister"), + /obj/machinery/portable_atmospherics/canister/oxygen = GOODS_DEFAULT, + /obj/machinery/portable_atmospherics/canister/nitrogen = GOODS_DEFAULT, + /obj/machinery/portable_atmospherics/canister/air = GOODS_DEFAULT, + /obj/machinery/portable_atmospherics/canister/carbon_dioxide = GOODS_DEFAULT, + /obj/machinery/portable_atmospherics/canister/phoron = GOODS_DEFAULT, + ), + TRADE_CAT_MACHINES = list( + /obj/machinery/portable_atmospherics/powered/pump = GOODS_DEFAULT, + /obj/machinery/portable_atmospherics/powered/scrubber = GOODS_DEFAULT, + ), + ) + hidden_inventory = list( + TRADE_CAT_EQUIPMENT = list( + /obj/item/tank/jetpack/ascent = CUSTOM_GOODS_NAME("unidentified alien jetpack"), + ), + TRADE_CAT_CANISTERS = list( + /obj/machinery/portable_atmospherics/canister/tritium = GOODS_DEFAULT, + /obj/machinery/portable_atmospherics/canister/deuterium = GOODS_DEFAULT, + ), + ) diff --git a/code/modules/xgm/gases.dm b/code/modules/xgm/gases.dm index 568d52b571..282c149ff1 100644 --- a/code/modules/xgm/gases.dm +++ b/code/modules/xgm/gases.dm @@ -7,7 +7,7 @@ breathed_product = /datum/reagent/oxygen symbol_html = "O<sub>2</sub>" symbol = "O2" - value = 4 + value = 3 /decl/xgm_gas/nitrogen @@ -17,7 +17,7 @@ molar_mass = 0.028 // kg/mol symbol_html = "N<sub>2</sub>" symbol = "N2" - value = 2 + value = 1.5 /decl/xgm_gas/carbon_dioxide id = GAS_CO2 @@ -26,7 +26,7 @@ molar_mass = 0.044 // kg/mol symbol_html = "CO<sub>2</sub>" symbol = "CO2" - value = 4 + value = 3 /decl/xgm_gas/methyl_bromide id = GAS_METHYL_BROMIDE @@ -36,7 +36,7 @@ breathed_product = /datum/reagent/toxin/methyl_bromide symbol_html = "CH<sub>3</sub>Br" symbol = "CH3Br" - value = 8 + value = 6 /decl/xgm_gas/phoron id = GAS_PHORON @@ -57,7 +57,7 @@ breathed_product = /datum/reagent/toxin/phoron symbol_html = "Ph" symbol = "Ph" - value = 12 + value = 8 /decl/xgm_gas/sleeping_agent id = GAS_N2O @@ -68,7 +68,7 @@ breathed_product = /datum/reagent/nitrous_oxide symbol_html = "N<sub>2</sub>O" symbol = "N2O" - value = 3 + value = 2 /decl/xgm_gas/methane id = GAS_METHANE @@ -78,7 +78,7 @@ flags = XGM_GAS_FUEL symbol_html = "CH<sub>4</sub>" symbol = "CH4" - value = 3 + value = 2 /decl/xgm_gas/alium id = GAS_ALIEN @@ -117,21 +117,21 @@ burn_product = GAS_STEAM symbol_html = "H<sub>2</sub>" symbol = "H2" - value = 10 + value = 5 /decl/xgm_gas/hydrogen/deuterium id = GAS_DEUTERIUM name = "Deuterium" symbol_html = "D" symbol = "D" - value = 10 + value = 12 /decl/xgm_gas/hydrogen/tritium id = GAS_TRITIUM name = "Tritium" symbol_html = "T" symbol = "T" - value = 15 + value = 12 /decl/xgm_gas/helium id = GAS_HELIUM @@ -142,7 +142,7 @@ breathed_product = /datum/reagent/helium symbol_html = "He" symbol = "He" - value = 7 + value = 5 /decl/xgm_gas/argon id = GAS_ARGON @@ -151,7 +151,7 @@ molar_mass = 0.018 // kg/mol symbol_html = "Ar" symbol = "Ar" - value = 25 + value = 15 // If narcosis is ever simulated, krypton has a narcotic potency seven times greater than regular airmix. /decl/xgm_gas/krypton @@ -161,7 +161,7 @@ molar_mass = 0.036 // kg/mol symbol_html = "Kr" symbol = "Kr" - value = 25 + value = 20 /decl/xgm_gas/neon id = GAS_NEON @@ -192,6 +192,7 @@ breathed_product = /datum/reagent/toxin symbol_html = "NO<sub>2</sub>" symbol = "NO2" + value = 2 /decl/xgm_gas/nitricoxide id = GAS_NO @@ -202,7 +203,7 @@ flags = XGM_GAS_OXIDIZER symbol_html = "NO" symbol = "NO" - value = 15 + value = 10 /decl/xgm_gas/chlorine id = GAS_CHLORINE @@ -215,7 +216,7 @@ breathed_product = /datum/reagent/toxin/chlorine symbol_html = "Cl" symbol = "Cl" - value = 7 + value = 5 /decl/xgm_gas/vapor id = GAS_STEAM @@ -239,7 +240,7 @@ molar_mass = 0.044 // kg/mol symbol_html = "SO<sub>2</sub>" symbol = "SO2" - value = 12 + value = 10 /decl/xgm_gas/ammonia id = GAS_AMMONIA @@ -260,4 +261,4 @@ breathed_product = /datum/reagent/carbon_monoxide symbol_html = "CO" symbol = "CO" - value = 5 + value = 4 diff --git a/code/modules/xgm/xgm_gas_data.dm b/code/modules/xgm/xgm_gas_data.dm index 481a411380..6f97027501 100644 --- a/code/modules/xgm/xgm_gas_data.dm +++ b/code/modules/xgm/xgm_gas_data.dm @@ -32,6 +32,9 @@ var/list/symbol_html = list() var/list/symbol = list() + //Values + var/list/value = list() + /decl/xgm_gas var/id = "" var/name = "Unnamed Gas" @@ -56,7 +59,7 @@ /hook/startup/proc/generateGasData() gas_data = new - for(var/p in (typesof(/decl/xgm_gas) - /decl/xgm_gas)) + for(var/p in subtypesof(/decl/xgm_gas)) var/decl/xgm_gas/gas = new p //avoid initial() because of potential New() actions if(gas.id in gas_data.gases) @@ -83,6 +86,8 @@ gas_data.breathed_product[gas.id] = gas.breathed_product gas_data.hidden_from_codex[gas.id] = gas.hidden_from_codex + gas_data.value[gas.id] = gas.value + return 1 /obj/effect/gas_overlay diff --git a/icons/obj/atmos.dmi b/icons/obj/atmos.dmi index 4d51b4e6f8c2367daf9b841f9b23d31a76303727..dd9990df312da292e36482a1e5a93aa291d99e9e 100644 GIT binary patch literal 24668 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	R{c?(+^Ce@_+I{Ef|;f6i;UeokT zb7`^JY1i~jPr8_|Msov;>`SJDq5l5$d+(;1<<;zpt|v!wcNd>p*x9a|)9%vxM?TG> z*eO#%d4F04Q<D!<*HGMkS|E%6o^7(qZNSPaqNYQb&<(yXiP7fUkI+Dv&#a*LdG7MR zucan{sp5m9^bc@HNV1s)57v6bKlyxsx}#@g3<5Gv$jHdkdjzJp)t2b{A|5B7b=%V0 z-WWB<78bHhPE9@W0l;<qppI$H5aWe@UbKSsS#+2WTt*b}Lx(-(`TBH`_Qyu&tObs@ zbSY~<G^khqnH&gBnVFfth2W4@J8wv<Hg{4fu1H$ku+$itg6ckP4d<oR;_h_=)FGR9 zd`+D!nyV;~xczR7@J<$TVPyJi#A%v9Rp_#rmU?w`t0v3fJ0e@6%H(plCJX-<-F)SF zF;X5Rqn(Q_e=buh2pbQ~V`b#e&yIn&zTD&*@Vhha#aG6*d!ZDkn;hrbBg&PE>_EBu z#OUs-lAeRReB<=if5Up?LR_$^9+lQd4#VZcGdn206)fmy5h1Ih;+6^9Df-s_{y+xw z5kH`zg3~%?TPrd&^pkQ;_F6W!djP0nEK!Q5tv#r{y<L>sjRlk=7qwF+uqK1ycRQnN z1@qNaO&^G1p2#;6fweU>2wX2S5h$kJ-(L);T+r;fHHuj$_Pqf6zWP%`j`RfhRa*`T zy6rt13il_kO(Y#pZ$gY3E-FfC;#+eZqYmET*l}@Yin-oV`>aI03&sDk=iZ&|WRygz z!MbB*LFRE*SbDqf3Y-#9@x(sm>d7*0%I}OSDg8yOAK%f-&$*hsMW=dc6{Bzd-4>8f z<S;%W{27U#6)OLqS^y~;SlQw3&O+S?A&n*Y>iqn?v1XS#fC`D<VKvo2zoDM|c6&R? zE@{aMEAJ*PE>1Q>#Ap1?oA5Ld&-30Cr}ML;1%5{88=i^cCWrb<R~HvA=W%eY?OY__ zT@d~IXCEA%YRPr3-RQ%*vJO`CukYkfLH8OHyRP)Uu&SfY6q1XgQ4PhXCKL1F4M;W) z`%U-BUrcfE{@pP~VU(F0I|^K5Z6qZg2@IOP{N%4gi!}++Fsc8%Tz-YZD<9gxvp=4N zLcJOv)~*C^<|mZ-0SBTOHp3$wAR3dR)D@btwzPaQ1+52^D%u22qdU7~WX8D(P&oXv zKfZ(E;RL64Ip*3<Lf5EtceuFkw4QCWXMheu1X;{>a}(b(g5cG8`Q}OKri47_#!0F9 zNjLb5i;LOu1JO(7_%S$`Um%KK{AAha&7qUK>Zd;0?#_GH3~Dwp%8e*KATT?F!SaYd zLNhC$y;>jtiej-%>MUPjTy5-9t$z%vF1m%oCmBrAy%;7Kf7kMMYfb(6LBy2D7RK}x zo5{$a8aY9!2g^ULrHh68o-6jM`6Uav?)*wk>^E>~|G_<g)<0GZ1Ob;<G3HRCq!zul zMdzzgz{gTJZM#m_K{STv*E+4G`&%-~zf?54n=KRNw!k#ch}@o1m)M^F&1eXJ5TmHy zFQoB=X$iyLEfJpZJqrk4R^6gmvT{Dba(dK-pRZNyUmjvRjH2hLd<PX$ry|Av4_w_D zjAQ%r=Z_6Hr3xU{pt>NQfNDHkc|Vq#P7Bi9Dv?j#an?ba%rXJz{}+-Q<8jt%$XU1{ zg9*fo(bCe=HdFa{fR!yd!y+kFb<%l$!9#;h`u8Y5^1ucNU99;Z?92i)43#wH16ge2 zcw<I~@GyJdZ4h6ix;?y{{ni!Y)i{_VT#YT{QJ44~-G$mzn^S#sXJ=x1C`Kq$d*(OY zAm*=q>TO>2(`aZ8Ffi7qtH6`V)PW^6G!z3!nr&HF{)QY=&{(<$04~(l_VxxK^%FVr zSZ^q?vcp09@8fr_tFx=mGz6LS?-AE)Rs6)GfNgy8;Qbc3lS4v&N5}q&&Qk{1%*4iq z1H^U!_`f%q7nb~i9Pcj>gy$;8fTpsXm1+fTCtsH0g}B-i4+k|v5(TXB9Tw|0Zzgg8 zy-K~hy1KQswSIg&LLhN3X(*??Oo3LyD48s$S|BC)Yw_G(lvr({V2$B(0+Mvo#>X(! ztX8K?v!D88bg`7_O$r*cOb6O3nm8!IF5NXGSkm5Wl0C#uJ4vR1xBp5tU36jV;^U$t zo;lHb=68C@z9B8l;yq3{Bq>xmGC!4?Z|Tc)E^5Bz4Lk$I3_OcZZS6X1J*>4g)lZw~ zl|MPoS4sTmed;`OU;4?G8@0oNJ9z4qx|W9C_m&phG2tGKSS%tR*g;-$2HzXiZ=gh# zZ~q`;66#W)=-Yf#W)E1)x(9=?c&vssM#d=Oncsm_nBS3!`0%31$^y7v|CXq4`Jj&4 zYS{@Lc*%?*{XvFL!v6g{2ten*wBPPf1{ID`aB*?5^x1q0h@h<h+ZCscu9?B-@#>Ad zkQ@%mXX@=P0AGA+iaqOowOPJ4jc()kfz*D<;ghX!=~GytV?$KEVsz`!X;v4amxRyu zXF)aMo{EclwknkY0N#ED@TYU&+A_;W54!2m)0Eq7?S9{{EPp{<2#2k#%=BVe3cn#B zAmBTn@)0h5DyDGl!$(0htbs`-)9{DJ#?&M3Yg6&ria!gN;!*Oimrl{|yG?t#ny=p9 zg8uaMe5pP|0KpnR<;p^kDhld+lWPI$zY&48dH2aaS_oBuI2djdeQT2Z)&RNDc{|o< zpHkp6T8Dg?@wg1+YG;7Z)Rp@^THe`ai0{ry?ar>v8&!Mv+`?AlV}5~dlJSGYXRz@& z7X&^Y9<0P%dU|>JoStKFTrdQ9p#$O1;CH}HC@PD@(u{zW2-6oEp<`|{+i>b9Wdxc9 zUS-GKva$e=UH7Pgi%~02RXnHyl*!?!07xB3`TYM+?M{3%m-#N<FaWXT0?s7J`LL`Z zyR{znFl*qneY=}caqcXdWl{r2?qk5MjCcL}2P+6IUu3@w@6&PHnMJJhBM=)1l6(pf zz)bPKrOnF9s%<HwmXD%B+ggx}U65K_nT=#mY0!B8UPh#?jyU)sq9P+b-O)E%ga;K3 z?W4(ag*^lQj_siYWe}@@C)sDncG%eM^-aOd^~g!PHdqY6w~nnOB9mY4k8KyIgf|~8 zsgoo2YIZ7`e!4#Ho7)O!?#3^xo7$<TH6irXFf3H0%?Mwqr|mR2Y!g+B-yOXaN4!s` zRE4xK;!5u6Lj5f)a#1S*Cy`Z0$p89eB@S+Ub+TfB{5>qJB(~k<zTBwAuB`nlQoDd! z`iq8z70>f&ZS|)pMXUaVu2}Q7i?P7iKS;OzCRLjgDz&`rmhN-F>b?empn1iKnPx6@ zV<3mmfej(z9id}R77Gm-=NlK4GcPtTqbhy^MMR6!X`are;MXY<3ZLdNwtG@Lrqi3l zvLFiG;(LF}n@GL=+;16<c;LgoYWX`2oZ=Fiom}nh0Z$K?;aBVyF^!M&TRh6!sm!k! zp#;<)bT#cKbAOCOu`bafW%)WX(!rW`ryH^!QKQATX#N+}>S!U=f?_l4nW6Qk7AxCs zG=87BeXowP0ONDNEAhDTLwh&rqg6I`1-MD$Iz7pum-KuxcmbV9A|(a>pm2Z=s=psg zVJxD=JjZzj01U$4M6)?Ui=49K-&#k98qO&_Ejl@Ypm1l-)|n*@J@kCU*&C~CRU3Kc zvSr6O_n3%-N-slciNB%B1CEq#;3C1(n;b<2EBdaOF8C!-Elv2#`Lt~$RYU{XR~Ch6 znHG=Z>2N)rV1L*l+wY|$9&3=G*S~ecO<o}D!-7M#51p0&A;U(2_4;?rIr-}nT5@t* zXK`P~&Vy-Bq=ow@6fbG@k_5CW=pGy&gzntdn22GLsM6rL0-CS343k<+vQ{?`#poFR z!WG?)buf1G*<sPwQ<nfPHvSuwARTz$H3O5tPk&TX<pJ_k{M2b^{WveZ=dND?ITj$? zFSHG3?0Hvi&m_qw0k*1L>Nu2$G+R1y9R}YRxO`-6;}`!{uiiKgPy&Q8ORG60(Xiz& zPJYJ&x^7(#2T%i-?ZFp|^-X2>spf1nto67~QUGRXGuukeI>1UL?DidCudrvdZtuZN z3u%h~f{cIr{+nj~aqd>MV|Z=0tpd;JQ3*NX>$N+bU?Udf!M|AUvSjl?UQSNw=NZ$> z{=+Z}E34#OWmVO@FPpv06)?@nIf({#qNA0ThFr2J7wWhf-T$_fI)eF-rv;!ho3Eam zm^OP98npQU2>$PtQgUe9<MWljA2v5PyE}t0y#G#nw~sYS`bp6wVV!sJ`frrYm`jLd zpmx;If2vlbc&dNfuXxC(op?dATLS;6JJmtpcYqO-{;Q+ILtDt}L1dDL$i`2|Sp3yE z*Vc2wh0am!b021~eox`=Y=8qPYb6e|n)>=m_j7Zs92{21mnfI%g#A_K4nlr6Zx>F= zKc_T?sTFmz3Lneg&ke|o9m(9EF@Aoa3+Xay0nMv8r5i9%W|;jPV{bBvAZ9ZQv?e4> zYCH67o{R%Qgczvr*G*>;wKM?;418o4R3I5b>Z@)q0CXD2xDd(kM0*51QcPrUAt*Gu zN-9b#o+D~@wa(7Z|8|Ao;7`m6NCXi1OhI+gw{QMAdxMXF%%&b60AnHvdaX;wUB+!1 z)PKh6f1buiREh<Tk^3d)d-crZm$k+z#xqZ$v=3k(t*xEGCfD76<xb6XZg!ekUvFU- z=i6;xxU?iVO|EuLwv%Kp+%wb?Uy4x@TAgLTxM*R&L<%|%nPgh@keU$y@>z0Cw|sWW zCBIJ4??{0pr6Z7dQ~*+3q`l&m;&E5hB7~4F%>SZbMf#WSF41=p86uvM%svqk*zld* z)s_aS75aYJHF9%n1%O6t+3j3P)bABGO^qEWr7Bk2yc9T*vFumFN!azrPwGAH+wPp| zbhL!Zi}wyOAQYX$<!yo&rXzdm{v5%P)F~I^K|%I1Yk(hR+~!Lz6QI9OnL^u<dB+Y> zx8lg?;mJwo@^-*cX14h(4vLbIO`?LJ37r}yKGICY$i=sfT6E>=QJ8^$`&51o<jZsN z6iA$FH!Ku6n}p^DBAr)9?ORP+BqVZBTq?>4w2N5ly~MXO1@n2kHXb4i*3h0%zTqTj zoKZ;*%%%z-TP~DxC4@2T$+A5<=uW?=*>eQ>-{^{7^f@wAWJ;D<+mJr{lOFpLv`XF_ zn4Qg#y>D?P>eyh>CCjsPBvTZmB;*^JyG6`58E}sIl2xcD)3I2m<O4djTS;KmgUO-2 z2E-D(<io>9S2%w2qy22@?^yV2gK%#bTxF>K;0z;qD}0d6>UyC>2uMLvOPbk5Pg71= za*lBQUA6gusE!Zo8$H|dRNvHEm&vI)_vuDCrS8u+;a_l1f7gevNX;PpzOhq-4UATU zZnOOFY@Dcis@F&@ROh^F?@?gQk2K}JnpPZYHk574*|SI1&}U{Y1$gQ~J)?c1FfwJ* z3e@#}WN(9(XH)LdFxbFbh$8}XTr2Esvm~VikM`Y~?a(#POTb`&8vloFWm|ig$+c|n zxd{scAVIcM^H2Mk#yWR4Ak48{%Mt^$PpX*jhq55M#o8i$0r!JgFxxH`VlfZ0Gfb{u z|Jhc{$uhjX6XB*cdPGo9V^cjwxWnuJ=s@ZTJCFzJWj^z-mclLBleT_&5AluSx1k0M z{e1>%8J3?Ati65)?6z=eEKNkW43160*ijHDjpb1?Mp+P9`Dlo3PfN?*HltKNCQR(G z>UXs9BoCdm?6nJ86y)OA8Su`RRws1FE`(*$%~M_K93BS(KJ(p07ZA$C6(D1**W_D0 zV@_kTlA1l`e}CS7AF_HkCeaGDMFySqMg5!owT+5~;mT?h8L~#+j7%#5#WvEF6{LWK zoA;@|{ntXgx`&N4FmQRW62_UZjHD7=PIzSW9s1~_UuU=N3|?7nYrWk$lr}*@0AB5H z#Te!y=0ej^Tv(21&&}|$_P9jGgAnBYOdine=pFl0E?BBu^k}YDxiY5dw&k_@R9)^- zgnoouXa^&*roAg)V_jb-gD!SQV#M!nHtl8r#50}O_S_;(7Uli_kTGylx0i#K!M$hK z%l)+3ov<)C%X3o;C}wIZ1u~P>6rbJr@{vbKT+1un;-Fe8B<33PK70lS29+!5*(OUJ z%bm+1t=H~umEF70couiX4fZZfT-+^b3(s^VHG141PtHSx_|Js77+(7a^aLM6=3{Bv zpiQd0HPt=){L|A@b!lm2pd=GL-}<vLsKsN@eK;tctZP1WORk&gFn+4qQrSI2d`E?s zo*oGTfxy6RKCt%}GXm7EVDd-N))XG5T`%~V9!>kT6sY}i`;{=St@8bZSIp&(%F%EV z&z{@%N0-U1fo4F9D$Eo~09zk&4+xvm{$WS_XK>m=*ln-lR9Uw_ObvRL)ze?b4fBbg zPpeE_lBQjs?pfOdz=9$1yC2Vkj4jq<=%0{3Z}p-41^{etURy=+ND+|U>>o33Cr?*7 zW&L{pufhwU3??QfoyP{q{c&y#F>seM*iz?qwA>^O^Lf$Ph;P^5t8Dq)6g!BPYB<H| zn;F^H(w!^}43ScNm5I6Il~<R1(*llXeEjdsJx(6eM3z=Q{cCP)B-7Q^jj8Qj`4nFF zM0$P0h!KSh$yPn+h4qOoXF`AM++2l8Ur*1pR=7l8CkjR*P!ynAuT$WkP;P|8Cc7S2 zG*C;$E7|saJ&Ht$EXfd%AKVYc7=rp9y&7!p0awlkf1NIUGZ}$$!JJCLjO<IvS%@?B zW91Z3-jalILW9@wgHh26mI4AqqGZM9pv8M>1%&+8a~d58YKu-+90x4yh6F+BH(U6| zZPz$%9lp?TjA+%%;}Wg<sMxKS=n`}dm?s=}zJ;Y6cFXg`>x!mt+(2ZdS=E+^FVZGF z2*6$)Jlx(n?f*I3Twct_Gquy-8CN$~_hAu$0`H2wKlT5jZwC8bD`5~&WtuNo;MX58 zL`==c&<sYLJlvfM41~=TRhZVixS9TD;#{H|by@NemG2)D!Y;mftZ~>8A8|Qb|IzGF z{SK)SfRE+yl6jo!MDe}4XDwyEMOA-9r2%loA4wvD37QWjp0{?@ag4Z{(l9{6FPm~O z21qC8xkMtaA><|`u#ZvqKh^G#(5&hg`pOzs2QwhY=qhZ^Wo>iSm@Jpn6;P)~|7N!n z!>o1)+?LH{xgBxW)YkHew2E59)5SVN{KbK9K}J18-|>8tc0`Ar{@Nc<i~Auur^-&j z!Ud2_Wbo<Iu3f87$wY4#_54hbA>*b!1>6FF&%9Zjy$%kX{ag%*R)wicJKFo)#?SHH z&&knBN>Z=<PEV2q(xi-X1RGr@S<5~KWH`{2UfR1yc_7^g0xC1Z{a%v%Qf2Swq?%ke zbQawW+}seg>&EJ5?*JSly_p1g&s^jN*ZoN*0Q><Eq@xy3f>Q)HO@o27H<urK#p)dz zZ3gRU!F#vGC|_eoblOWR-5m}O%ag!_jV2~~yJT{n*RvSU3eSYL0Y`dIJylS%!L$>( zD9kttS-ujW3A0+N&3RHf<iUI8DdZEmyZlo45Sb=2vO1MKIp?rcKVrd>8WlwVxHt4C zh^YSoI)esfj@qG(V8V$Alhc+UAb={ejhmqRsfk=$cB+^e#ztB}dQk~6uS@^eWbRuD z04@doZ=b4iW@mVx9Bc<l{K*E`%leGiJ|pqTZIt@-RMkWibv_55d{K&Apn%H`r{X_& z4X+~^7Y(*9u)CX0`5SnXge_21qNGK5>XaM+lyecMU3DMFtGJg|M)N-$9s)jLFwi=D zz<8|#U{D3qM56~61@EjQpD#DQ(W~sRBESMAx4d)7+P9}n<dFaaB}C>K{)ax!=gC0J zJY1^C5xfHAg+Wti9fKB_8B7@)<v-NV?j~OZY;2(uw9`?l0`Y@hs~49x=T^y%HJ)+| zJqSI99w>X*>R31>qrRgH6aN^|Qi2iEb9?YeC*l2F9oQCtbTpLs;^?L0BE3z*-RSvO zM@&pI+0tNJX1w%j3#6a)cH?Yj<O#odEAf?GE`oxI&t^QJM7N^a@785STV32XgDbY` zrli8Hcek+rEK2nJ`_{&Wl)u0D8u&WR@g^tgg8~HBuyznWrb!9YK?y$JuLP~?SH%KO z=)b8W@7jZ@m=9U1{T`lqz$F7=#HCZ2-cNw1#>U32uvr70WTJ5|;Ww6g%fC8TbPy7o z<;DAP`;~z2Uh+F*cIs0P1e}&8;<3K96^uIV>1jRa;+>ezO&w48;%C2FCesrL_}b1; zKYjDJJk9U_{K^r&#KYB~RVK<lkas$b2>VSXL|=Ty&vagM*)Gg1BUY}vu$*7oqb8M@ zA?a-XX#%)O_I2G#{!JL`|LbB|6^Ao>t`n5h;mUil{n$LTP7nv2Wukj2i>fzNxx1nJ zGHsj`F1^OhfLt1(M_Z1I6VeVe=x6>w!l%8hzT7KZpjvJSi8O+{I<Jwa^;THJei9Vt zng3HQsu10(UK67B-EJUiNmj4mYDTm4X)Z^f>-=N)JG45FV0x^~Ftltq>p2nW3E%iq zSgDh5W`W%IT~3qGpbRK8I@z=3^gSur<~=EJ07EtgY-52mhMJH82TV@wn`I(VLjh!S zT^rAU<wAJ&bQeJqdV37&yayYqyCT+=H}bd~`4?$C0l9<e#(RArBTdMcymBMfJ1$f@ zVd2HUSwJ~ZOfj4(mf0f?7H6^?^1eiz=xaIMG5g)NiAEb7$81m>nqBnROmW$BQJ|j= z2?_0LLnvm&#{2YJHJ6LgqOBLvD<(fsEFZzacWo?1CJ$|yY-~Rj;p8r#yeB%yw!^AC zju({>giqv5xMU+n8ok;3>Bh8)+fZ92x^cI^*|N8Ip^1OA8jzs=4EL-du|9j654_UV zc7QU&ZWvaZ+4>-#U9wRARJatAos;t;GP3-fvkD--Kui0|is|Y@u10h87j#lm^=P$I zfxCi?TVGlJe0g2kJBhOKxnMxU>_1hAX8L0VKe245iVgYwPcR2Zdhp6*(p2A2!dgq7 zsuM7F7Y-8*8m?e+*D?9I|I=|pA6CZ{ekY^oCfndq20tu1s<7GB%;LOs@&Kox-(0;4 z(bD`xv+94o>`6MsGd(xxOHh&T;g>q7SpaJ}5c9$rThj{F_)%WTKe67?jxdgWeaS=& zmwsfPYp@MCfr$=`asE|W^awh}3%a9db$T(eN<WdnhY)>qb1_KoI#gj3Mq75(J}~h4 zhdw_gP+XlR4;(q@57_Z*WVR&803?U(vI8@)n`RrBgj+iyIxQ^%5V<mjhYkHsSxIx0 z@u>_#SDY5l$8Hl0L}P5tkKxUdexr<tgbISrsuAk)wH$Ni-@hApJU49n4iDW0XB4;D zjg{o}@@Qj&<4pR0oZFJT&%dytp34xdGIXslK2zSu1lK?wnzNmzKsXiKNWbDQ*|7$| z<RoGNRpvQlcPdm13kx@E)N;MEFKhbZ4Wa0X<?l_N6C-G-dCsozdPdv{w9Onh5GIc= z1;kVSBK)^J_@Vq2@$jFwuji`ycAL#%Ft}Jz+arvodXd1+A$#MC4`P-%+oO;a{vyuA zbpBLrX3aqCsrvWu=M(Gs9rb#mnZovcub=T@U!I-Oo7)qLi|3c6^@M!fb2AP|Xe0da zBfK^3*Z`7yy7KM@mO$&Qe%(7X7rH!}<aG;Q_b>bU4(56K5Zd3rH1i1MlsM2p%!qSx znQdTxDAPyl`2PI-aKjI^ACYQt+5SQfkx%l5WsTz!;DbPql|bVC@(?H-%pA#Q4`FI; zlIZ;8@@g&K2%0;z@}>3&p4Z6*tm9lZmSjn|O_dnYgrlzg{>|^0xIus)&ZC|M?kSvD zln8$IX1_p_58e|~&*2d2OYMdcBd^5`IHO#+WHuY{*YwZ#=X3*0#4npEJTBk(-T>#B zNmy9_f#Ln%uveEuF!RBOC^D|VaxNpM?_-<<i*dp2X>bo1O6e|Z1(cHNip4zRhjv4n z#2Iq{oOX~0qF4mR;nS6QtO)WS2EHT-ofz;iT$Cu$zue^zEu+ZFf$5g%heWoO>enef zyqL~<ph$i<;HQLMYR60rFVWMxg3J`_92qq>%tHKsZJ~c9D=fyEc>zw5T|b<|Is0d4 zS6>p^SLTHLOzX--YT$mZ+!BSp{$+4G`8R9GpMQzvl{)yhp?z*4M^U9TITr0eg&QF) ztqH497G(3lUeRb`?z4Eu1#1E8u!y>%?OP@o#{RM5q*AuyK3kcohgxXvnk}!mc>2wa zSNB=W3#ML$xn4IJ{li1Ea5o2)zTCR@MeI@u>RIEVsZX~4k8H4epgQIBVonX}G6ww% z=f`_1@rcbKi&h`KvA;mkL3crWyK6w^(lTNm(vI%NH|4sTF8*HnF@K`LK4n}$vIg^? zoue?QAd(uLj?G(`bcz$SX2+!2a2ZEZT5ZBNkX~RbKjz)SHCtC8tNspboAtX~jM|oO z+N83h3#)klLiga-UePig`tAL}tuFEsItzfq`=nDBxQur^HkUd%3ey?bB&h=+bwNd* z<}?zZS6CF8_S{DK)!*x<s%rke#qZR~;y5%&!SBy~)r#^AE)d^do0&3RLC23bJ|qGv zD%F{)k$ML5)}2zFOjBJREUrkOK@vUh&mrvaTmu_y4=5Zqw==!D3a(%Vv>%lG5-8kr z^uSIcmv=~47`V@L=&cxn&*r0WFA*7=KlNCEIYgn2uKo;V^K06pu1WG)4u%N1b#)7u zKuMdljG)}c70CK&&vldV6%Ge&0d05~;2$!F`dpC4mjpbUF*m#_n|+)Xrn-lNXwC*M zusmJrJu)Vep?iku$p619!3%P~qN54-M@3Fw^6}M8FF%ZrYZL%CTi1_{j($1P_`t2M zL%)5~lE1XydcZ+-M~lI%%*~atTd2-k2rp0vYI~KHm6Uj$kl3dhlFBWI;+Oxx`8*!c z0-J-S7{7nn!NJ4hGmx2$QW;GZ+RW8?Y4%whNE291?aNzPkETw%AuMM4U;l4C{sF)% zwb`Gh@mIF8Ha3Mb425}Mf#3cStB{Z$iElcrgMM}jT5-c4_vT6;Mj|PY4(3D_Vmf1a z^=IVw=UNub-zrg*9c<bGBbFhqZyvZ*w5%G6-jp#c>IxHKBa&w-aL9<Ojz;`msM>R0 zC9BI$txCfAd>&yF3>RNT#q=z*$)1uO?r0-B!2PCql_YLiWCZ|JTW3}+T)Q#Sm#y8M zuIjG+X=764`noS&*dvkEz*=Fj2?;3pvws$c`SgVn8>;~Ad=*wj5zkT9M#UH{&^8Px zaBvu7%8O|4MEPK>I~P=r29Ilh9IU(Z@<!75m8Od5{YGBMy+>>CE3NEdY;?qOFqSpi z#VOc-<Y3N{_YkuT5(G0*PvXv#VT({Y&{e)M2|adi1c7LDp8j8eFxYYPqqwoL#qN&q z3Gz_?=!gza^LT|A-2FvpIO@RYi2M23xfbK^18ylXFpRzc0Aw7P--lhYxjjyerlDw5 zEIcRI6e@TCKZn=7gL32~Az1-4?LTt*Mnom(+PcdG4x-FHp0mikr~a+SK3;K&AaI-v zK3X<}E$a65*c$U{jTY^(=%7hMcVLIy$ume4615wen$f`EqG<ZVyBopUwPZ9fOj&2G zPs;w=v?I9X6k4~(`0Ao@!Mqi*==|^}C3qR04}Yu+ZUA|4-s6=BOGC}z_B0uel@9X) zJbVCE1wV5K&wTkJoX3(++*cgK4fbnowcE;?BLugcK*f5p3>Gi>Z?rM1Dg|5FhhHGE z<(y8j#n<*5-CX``vxUuxic??Lm!m^|(%XG`JmltQl-%6VdvWafVFq*DOHg0-ZbgR= zxdaV9<MPO6aO!4tDp*}p17seuEay1c<!I{NUgu=&W~d#M>kj<aXlJ#p?TQ^liraWT zvMGQ5Tza`+ov~6`Ho%Yfuif{Q&kK4p#L4zjV`lF(a>CQ)mf!p1pq#wu$GeBYp9i|K z?Y%IlUvFHwWliAe3eI(V{CiDs$@Qc2X1$hk471(P7Y|1c<>hWBL7QJEmuE&+QDdW{ zy^kkvx$6h#+yQb0*vc?u)ZF_|U!QFNg9!WGP2(oU9K3%n!xo57uNfO$nVZ<ve<SX! z1=1cWovid(kaZCc4bW$h?&JiLc^!<#?Hhg&ykXy(r;IxjD&OFU9(TUb)D-?bGX7z) zrl6Jq<^SvJyTjoM{&#oT=usjOy_e{n=n|di5z+hVLG->v3qeAnMzqxlqL)R~NQfT2 zMGZl)7Q5{Jj{CjOz2E!KeV+5jo^xjA%$)hm=e#rXzMs7iUd_<>?ch{ZS3~y2G@p5S zlj{V@!1Eo+FA?=fcR%nT(G7+&$OdNpp-ir+0bthOi{acmNR+#S;n>hn{F@rBi#e)w z^{|dq2PauJn-@GnO|bHD^oL)8is>l;>S@apKR!A83LvX5^I^t&sjIZkjk;Ky8O&-| z;s;xRjcpGw_TBJT0TO4Z3LUT!>XLd4M()k%@bR<DUN<>Y0IV9xIb0uw66j%*$9x*# zwf>y1Mz#bu&@&xBO)i_D(hohWFB(gRcL&z4yBEWj(jsDyx_t&aK6b^cKWd&e^PHcl zQ?;!S;&Yv4_Ot598D0A@b3Q`E-gu6&bkBN(;Kv3*A?s%G$VVL*n|tknN1wa8CKCI( z30i^0x5Lg;J^wd<ehYUu%JP<Bk%mq~l^aiSmpd%!8*d2y<^G+OBZLjGmx&Qa-3ouK zqEcT_s}%LfbH?-thp6SMIJa57V)Vy7`YAxNV@&QV6P`Nn*X-@{^HygoP(4c7g>cJQ z<d5i6_m5lj&ikLb?(tRG7%F1N0<5pPyX56u=oq949zGeO%A&Qs@xTB%ZryJuFVOsU z$`7&p*D@JS-aP!qT4qb8rL|B;Iizm$Vh+6L7lfcmxm*3HTU0GJ)AjCjGQaEM?Ph7R zL!HUv5>QMNokIYw=_<Xo)wG8EDd1we6y)ib@r;ZZKW`8{#eecmPD5vttj6)NJK>&l zS4^kxNbYgHL@3JR71>IwkHaemA<NbRbymQui_SU2#{k_zwRLOP<x_)vpl{sTBAS3u z57T%_^p|bU$H%7z;-==4EgnmCiS=XsbdIe*{)CQ$b+8Nr1%&F908lcWY~DDS1yEfB z%}>49v$FoB-os_wzu8Ah4QK^f=pDLXIp6!A0us88FO$!bYxUj3HI^a;vzrT8yc-vg zjmnZe-ecTXAub(LF!FF6aKl8bOoT$?GVf9Y@$Ac&WX(59YYgFSu{qS~V6tVa_g9ZW zp($tO_^$VV7SF&y(mayATm^l>iCPo}=k%O+BaMt@IIaBW5+>P>e>V-MUhk+yLp)3e z=L*;Ho-5u{%zLi^G>DV)-03+IG?<cX|5x0HdxtU8G3dZ1ZkT0)`Ts@Uc89%F1ZV() z+u^ztf-rHD#l;?v&G-1XOD&VIm;Oe~KqKklGu?`UNG5+=6@4oLSkiBwo10?@Xcv4X zr&OS_I(dJ)+bytTob=SjM7&z`oPu6;FqX9Q`sWkud|=!g()&-u;G+1l$gSAR+6Dfx zn`F0tq+vNG`iMLiiUyG?xy@_ucI{AmrkHD%%+3BxyApy(hYeINoB^23pjQ-P0Icq~ z5of}Ukp{p$szzz@{E&?-#5QIaTknI>^&8}pnXh4?3+@Ps7)U_QBQPvyXm$>-S<A@t z!^ng;omSUghiK%KOU+R^ruJ5TI4WBYr=OnwjGEgY*1&`C3grH%@F!gIG<)ARJBTem zX7kM#o077iYa0MRWyzE+b4!FyV)op9(M%oZPmANShK(;?9OSsoq-M*jjgkQuInO+b z6n3gnnA&_QI3iRgQYLq4q`0+RvVc`zsOVO_f_9K^<R>!>zZ~i!=c5DABXF+k?{oF~ z6%)fVA4wm!LEhyCzdz0F6M#Mpy@A}isVR44%qqAin0kPDLBg9SCFReJiiHKwwoZ$! zlSEH|S$WbgbV?_#DGwkpoAC86wfYq6ia)#kuLpbWwqG1E_~iz;7%wd}Ri`9P(bXC? z`}FZ;2$)r4`Ic7(Ue<qkl0QBD6yKp<g+&LAHtehIzOp@&PZ^g^q3>$2he?Lx1brlT z@PrN@SqeXK1}f~f{nCd5FKv2umUN1kJoKqxNLwqRVTi)=n&spQVwZ2SVnXv~`f%m{ zuTd?0KI@9H)GI8)A$((h%DkKVFj80CzCS_xeyzqETDBVVrtg)+l>~DYzRrr-a+y1& zPeikz%L@k8H<(X<`)7&q&QCOEX5AruFqPx@v7*C}qFT}*^LJ6G#iKLiZIlH=A`Lx# zqU3e#>GouOsQ$|@Mlu)YEEm!*ENjpJ+gL?VNbsZdto5}U0(b0%P+pXVa{TdsID$Rp z`RLs{JWTh|^4qY4IGZz8&2nke*L;Cu?chHAlepu*2d|#c;(n2W9(Qw}t%m$W&Y7zN zD=GZ`9~BTxWHf4cGIxSse7`Fhb!^azyFN)mn=75l$jR*^Ge5ks=*Y;A#LlnHVUD`< z%XeLR{A9Fr(1R)ySj%TCvKIG|$??6(7%w0SN8idt|C(vQsKwYHkh=V3#WZ|?X>%u+ zLbDcrL{MO70H3+8>I(T)nKE8$cD<nIRIF?<!ICAa{8qfMcT5TAA#(R-ncMXIj|Q_g zLCguwG_avjzOy&o*6=l8i*_qW2c1tNWE@}A^qj80;jnoBeS}SI1pz^;LSTjpQt%j= zv|m#FL#sK>Om#TygW7*UtQ*YO-k}5+hOW?xK8OC42*NG+O(i06p(wNM2voKf(|bXr zcmdaSW_OkyWmLEbc3HM0GQ>X;AHUP-f+l_!faFv&psz2v8{^V0`9eCeK99QtZm!<O z$A`#Jn`}b1#eAGnr~zze!&<JBbrZmea{Atjkx%dN0F^B`M=+7oTYk!#-o^A7)t4&u z`ge`8EnzRni?S3UVPGzyA7M$=l0&hSn)eoyq?;vgaEJQ=<(xY0+HF|ZCE_ZC*ESfw zMCc_~@1D+pAS9vgq@$CxD>o;3-nC1ZSK^6>p(F^xKR($n={#A$RY!caiMUpDU3N2U z3KbV~>oss4B$LhvH&)e-Uhjggi=cg^)pcq4h^ZS{08$YxF5*Zr_Y9_O_}tq!Ee!|} z;Z$+7HCrm)PvpTt_K#qFDpttvz&_$O#Z)6#kN=SM+XD565tVQw3}l;%Am|k(?e0ij zVJslGeJiQdYP#r8?3NO7jb5%37oDYv0k5!HBKSn@PW%awEnN~jwH7C>9FsLUpS2B^ ztE~hzf_2TaX@Wn5<6-JuVF1Hk;^Ko@y?t!CZ4DT^l&7B`nRqdy-rmiTXdBpMnN~oM zz<fBeip!F2pGfUE9<8)*0BTY1c9ZixApW}DtOmqA@$vELg&f#!etVbpONlld%Zs;W z)VPjvVm7ZNauW}{VwZ+JSOss*r*hZDecl}$u#Y5mIOP`-Dg|^(1qG~tZbfzZ6%&Mz zP#h3Z4nIu%OqR6WR(Be(sJ3`Gv^3YG1xUy7LhI<kvNFS1K;JQsTv%BFK?n#EHOKXU zO<!I?!5Tk_@>SyYQ%~>dT4qx*9kzK9tMf0oJg;;HmC6M=^T@fpm*f^I$9v{O?i(0G ztNd<9bq)}H1_IalAsm4ZDb14XdB>rleZwyYB<r%*o@iG<9k;XV-m$Kwqr)L$Ae3=| z!I;iL$^Zl66C!u+b!?lhvX2>z>WHZNS5IB?BugMLYT{3CHp*x~*Ly(+zr?55@2?VT zJx=oym2{thY97JB>l|sfq{%}g$Y0X>aB1zKpsw=e)#uMAJ1yr+iK2h})-{cyRg$%E zr*dhA)N$HY9D<U5@4YbHfBvBfDRjKLufp@tqLl*B+vAqpRzR=)oP#hK4*820E{Si1 zOec!DWr=HS=m3#l2AbU0JH-{U1EEprdHT)+U*b7o?}}&tBqsH_P96I)E%7tSKEr<F zBG%R}ghPP(49v^ib>4Z*oTTk=nRAC`)Yq=pagkc;>Ga$8V_rv&lpijy?l}RC;@TKH zdT{r&!;iQ<Ll8H?J|eQ`KJ`62tRew75`)VX0&F~;BsH6lmsj*+swiR~s@5hwFks@I zZ9#Yc$&Q|^c8ND|+>}2de;@ee*X|wQnYMrJCwqB4n`Cq`JF@+LL55Xz^$G+XyR;0v zT0`vlTK&81{E|RI&MdDSbb)yI$9BYFhwgMPIAt)?8GG{J47VtUnS1bEJ|)uGd6C`T zv&v*0UgOO`K44%?@+%V_r<|mY@9Yb^rMC-4rN~j&na4`RH8Ll7JCCc>#2Z!gs*$rF zyGU}5W?SA8xEt#YpA4`lIQb<Q%kQzc+@|y?Z$5ANMIbZ~TGnxj;mpm;%ga7G{W}tN ze%?v`R?e3bI@ZpV&ce)A(&m<HQvVL1aI8}b;LJI4Y&Psz6_z_zCJr(Xs=uo7o1fv0 z2|rQ3EWPyeic>aGQWh=pX(Lct=i=geT&+N7?H-1s?3bO=v>i}FW$9${fIJ@lO;hXu zjf9;<RGa@I=}E?&ojkCL6n<IO@-4Bp@Zs@>;N9R1rBxXX%Jb20-!%FHHR|@%Xuv26 z5I#Q08LW750si-_r?;uVE%#m|#uhZBj~885(heS>#MLVi*Jd>M=Sn??YZ_{C($-v6 z4JhG4?ly$;$WZEzCoL_K&zx!fXgHBUl7xfoG0*NEaVh9z+a>3)(9*uO)+?h1hJN(? z=vYgWw2TZLc3{PK=Vz=xyQx4^&z5ZJhA!SSLH7aJkJsml^!T7pxhp@uu*=<{27)$$ z8I^`nCVi3mo20_ER=f$A6Zsws&?mygq)ei<J8*v?Q`={McLdWeePmvP^O}EH*KW;u zNPQ1-Kb>8&$nD<l9qn%Iu4H+{_G-(9LToTN*=tEy=5D5U)(4iWrikz`B<O*Fz}=5} zWt+kw0H>Vz<?1fxpYP6?w`|^|Y}wT7PoJ1|scA?r^0REIRsnG`m21-Fk*Qhz?^OJY zsqcCqWs@ctZ#s<5_&NU9WA0|FpPMve&3lrS0no1p+qQ<gxm6iW?19|EuKqH3qn>qk zp<m-pZuQOfH+!Z>o@aJ{SMpk}+#9D_&&Rp^)6E0rCabt<uX*iS+)Z&JAtfz-=4a{& zvshWVGfrzy5XNCCiUZ!|Gky%Qv9Yn!qD|Y&TL5A8S53mGFs<<yna!V@qCU~L<SH@s zVXk-qPtU8QXsN19lu;@*L45fdTQvHjQ&YQazhBn-%M07qu|GS4po9h^#)N2<<@H7Y zJ5*oW4JdBQUQTP1nV7vl#Ho~%AC1cRw#_NP$9Jbc)Xi2Ix6fTIS5jIUr=v~6=-rLl zYVvV^v)JObqphtS1CWh)B`DN%b#LEK?n)~gYvnq%=#pUjyCJ}DpGPVu++H6h%EOO$ z`bk~mlXEf~s0yFoI*$q&lsxpJ=<k`iURZ2iot<|1)xMf<1FKqS(WQdPTNs^;e5KMp zX?=?#(6Lu#pBd;jHvKc*Xsg57czInfX25vWt(ouNb0X5x)9bem1bqVEVE_RT_4EZJ zIbldh2;8)>oluf7;Fc=v-S~wH4ajy#=usj{^$s<p!s7LF!a@GlXsIqU)(6=`A{hqh zI87I?<A885Z2poFy7})FP1MG1#3%)kuT+-pZRQZEm=QohGS0BO_Vra<j?mZ-j04?- z@X4{vUz^CG&x)?Jmgbdc2DqCu4J0aiHL-*y3|X-_wFc(o#*5Bvia?)uF3ZR(^3+)i z3(iD;nRRbV_M##B9r`?*VLRb+_LY?hMn*KJJ&dj{B;vQ+)Li#u)8`&vd5-whq;};` zJH;=BW1V1MpZxTw>6y5QudIX)7}oE{D;1d?D1hY8$;A6AJ)ez)n)jfX&cC`HJgpws z11)-Aan_xK_EEo4a~VGd61(k*V|Q)|*esDKTW>0EwH3VxY^^^Y#asWO@Jzmg6+0sQ z9DByDz~pV|l+4O5Wl=D}B(oPiO2g7(CqZD|ugZw<UhgfC9yeHZ9km^ZKxB*YBBeqp z>S*Q=gmcal0={29<g%>Q;6t*qUw#bajCG0V0v`=YW(Tq3umwZ8QfE>h6*mSOD_Vws z4gGk3U3gN<l_}hCK7aWUc_K)V+L_$995~Q_P@UkiWT8x^n}A+>MM2(<y}CR#oRBV> zqo~VR0sKX&BVlIHA)W0JnDkR9L3t%~KSi3@MfSt30^JYRQxyVFvZv!J-JnK7()?Jo z22ALF{7SC;3zlJQq+Y&{c!Oeg0tX`e;p8GABVL5~Sm<ldum<J1MmEJ4M!2he-8v!> z$pO6F(PUv%z1!Q8F`lAz7vv7a<Hd_#@OxQ1!NXTYcF~sM;fO<ab4r29MMP*|SU=_w zB@g5+8WXH8U2XBB_>^6|f~liZDVbJOZ+N@TA+x|GCi>ys!~WEk9v`!B5#_pKOZw+T z-vC#<A^K~=dtut6v1Rt_0ru7*?JbYbtqENGVj}hshTCF3(Q1|HBY84+iq(Bu{f1*_ z_zB@5y+b?5fvXYG+7E)%SEseJE|flubu+!|!}BXgSNkBQ<rkaVoCWJHO5FPQ>mn)Q zpEFSWmCFK+cbf}B*?WSd+Y2={UA~_4F!v;`HWwbpKWVk3xvEN`v)`boK7FYt#c=Oy zk>c9Lu++eiusNE`)cCqu<Z_+r;ju%mz@A@6RNPSx+!KSDCw-VoIEbh7tnM`-UyCv{ z0+c&o-rv&TU7gDUYPF2IoJ}ue@A*nQ%!QYLm@gbyZ=RrkP9;uNU>02Bmok*~!tT<3 zo54h`!M2ISC@&AU!_)yuz?6$JtZI?;YyNYYa^d9i|2@Vq?_<rM%ON0aFKuPg#DM?V zr|$XlKuSc}C;AtiMzR|JMscMrE3;fj_IGz%zXK06j|2xp=0a#h?_bk_>1@f?EL2T; zH{<6mlYjpeTBr2*GFAwEDVlx>p2(v#`AcqW*;`n{brDeGJTI4>FZK=O0GWV%xbymw zsxQ-^Sb*IXCc@zegFMR0xY$isri4%t{I4?_G3991C!}<&k0?uH$=<ROO+6;iq>OQ8 z!{;RGZF~#91F<uYyLKchaoVC9lWq*&h^q@7O7E&i5Ad66RO8MmR=KW4MA29KHA>YQ z(eE=pkO~W!!BR*~dld)gL<2X{_0MDc@5Cixho_wTe&tK}gpKUoueB7c4zA#|zpgp* zp!fk9`Rs+fOpQ~#7eyQ`BKV(5+Sw2i)!D<d&v<kh_0e#Bw5&+=?K(g-UUbrZ<fEyC zLV{h2Scsv&q|sLzDv{3_3KEuAqRL25o*tc>cq)jA4-LjfSmdHf+4$Y%|D-Gap@_1_ zCzGObXymr7F0X!y7<=!UI*^QI7#<Qi{$!}B(`IZgZ9n4gdig6>4!-sI(EVZf9|Faw z0JV7Ov{W#NdqtcC1owMG>uWW6xYtDhy15N<sl>&@9W?bHE7PlnM;`ppTjNhY1Am)b zt39f^?NaOIh)q_+g;?Rh1g${>@`c?=3RjYBx>%9JH$EqxixzXJ36ZbC-PYwHEFB1r z7s%D!Y!Zk(&-MzdMZ=kyYtFEEIIAlC=AQ{8oWjo29tVLFiKYGX!{XXJ`6)sIEtR`x zw@11sc5G_*ZJ@B<eWsxMU2@-wyOV}Ed=cDpLC?Fy7o}vmTXFdvCP&3i5NM;K8tg9E z2vY6<*_Bi}GTsHRb-a=v)DL7+SauKUl3<4JpGiF`<`5}9<Hds$y=CtyY{Z|fN&zvM zW=EPSAn<ucyf;RuNULecQ>vomTCO;i!(19%q6;B?l3M?jO*xOfXMlg3cz|mpv#WyI z8x{JD@M6=$w&$QXy#cZMdgSNM_zAUzp1$)t+jTtafPccMR=9unm-=&W4z>R(=Rc26 z1TC7c1%H>XI%QB=z6HCS#(apvSND)QFCg6He_lTKHXjd`&DwWwJfVo-zcW8*#KZ4N z+F!aTO%Y6*DEL-%2X(j$J>unMG%^-&kr(h1rIDFkIymL!a*U3yk64zS!GxJuur#lD zPn7{}S55@QPm){Kwv$tWJfz5H+Xd?8m%#7xT_RL`+Qu8!B%Oiv9F6IRY1uMT)y(VW ze!YxBXmh3{q*gu>0ik8(C%|vY4;`(weaFz0Zvns(oz<j-MJ|_J)cWt;44fLgloK#Z z;2`AM)qESR_Ci9s0g$sopYc4$$fQQAy`;W7N@aVSNw~S;EETN^3l0v(11)(usM#uX z{1B*GCIwxzuE`)c<2I-Mrh-5^IT6kY5mQ%QV9-3~6KnV+&ow1PvS%9#jy<KG2%TCy z={N|5CW^o8T-@5`WR)f?FQ@G!H;_<(C3CuZ8NL@H?m(!RT<m*=y=(5ToH>{7a@oh^ z2Tk&XPg10Gve>qCI<=ga!uU<M_J2l<{V<1x#wyOAAC0wZn13$cCEX=3He_41Cbs8( zd`;QKRtpTqPwul%-QNLC><UKKfcVogymEx)yG0(M*@1^+-(=6cVPw`wX%~r*74KPM zY+f#uMP2{WwjGsSYgoPp<8>|Ds@A-%Ac@Yn-qXy#d8+{3v(K<CYTjd{igEdc>paxA zc>O^V$a%|m&YTy>XNzMdXRux_3tnEy7B6d3<h*&i>58E4c=p$Z1(Edu57b}2zVHa_ z7TVrPy6_X=q6jo>5WGp0YpS$X;k}i+T@^u=x3aB42`MD(L)T|P9_{K_TYs9+61f|~ z$N2wok>5c7*LA(6P!|^DH(eH8$RA~pj#)Nba0#zB4dzsx<XHKOR?m+tJ|hmNn*{0n z_#S&dLx9L#%JH2R^-ytRwI$IGyNG#r(3YFss16s^{*9xIalnJl0#1&hMt_&$zdhtz zKo3p2ksO26S{*^hM3A|{tgNi4fFQ)oJWJParU?sPM{s7Dt?r(BH7XV=C9*4bAn-js z_k?4rtB-T!f2REJd=JEwL9Gr4vW{=)UQGlB=SOB|<nRdw$}mp8+?f$-v}pzXU9K?{ z%T@#dDeyr?vXe%}Tn9g^{^mDd_ugtwj{|nlKlkq<kuZq_G<G2`Qy3qo2(M5CnbBXJ zIW54p(dyebl|Y{9@4m9f@9ZkMQwI8I<nyoNOJkK>8*ut>!ZeLs@Jz!b@`1v>l@`4^ z7&eFoIl2;+Drs9L6kjofW0SkE#Nh=*25jmY$~O*7(}h9}Mj|SUS41R&<>;9a{_tHr zuM_hVx+h;FeizKwze|+BuI#G{OH~k){1S7g^8e%=jD%>avLu4;+516MsS0G+mD$@3 zAmx<B9IS~TUOdi5jdx%uG)1yeg$FR)>@(tP14c04*NJ5g%*ULx>aBIa4mYg3o0?3j zHYrKQr$OKXS8NLi_BUMLCENuVbgi@9-V;<I9FN5x(-$nS6!Kl2D;)=f#-pDCLm}57 zAAPOHG5~N8iGtZK;;sTh2}3?xC9%2!UpTn_Zc-(?Hyl^`?lBtf1r2{3`j~zVu;k)* z<Tt~Rr-<Ct#-`Rq<@k@SHuH;Os71+Jphz<tVL&?mMlZVXffVp9|4q@ru!aL$5p)&l US5}~ae+>X>sp+YHery~4Kb@>|@Bjb+ literal 24777 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%0A55)# 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 From 2f8ce52c77bf1ac7aa68af6bc87da2f3957b568b Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Thu, 15 Feb 2024 14:38:17 +0300 Subject: [PATCH 23/49] Canisters don't late init their gases --- code/game/machinery/atmoalter/canister.dm | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 178b4b45fc..9e3475cae8 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -35,14 +35,11 @@ /// A temperature in Kelvin for this canister's air contents to begin with. Use this for pre-chilled gases. var/initial_temperature -/obj/machinery/portable_atmospherics/canister/LateInitialize(mapload) +/obj/machinery/portable_atmospherics/canister/Initialize(mapload) . = ..(mapload) - if (prob(1)) + if(prob(1)) desc += " Does not hold GAS." // huhuhu - if (!mapload) // Call gas creation after normal init if we're midround - otherwise, we'll runtime and have no gases - addtimer(CALLBACK(src, .proc/create_initial_gases), 0) - else - create_initial_gases() + create_initial_gases() /// Fills this canister with gas based on its subtype's initial_gases list. Should only happen during initial creation. /obj/machinery/portable_atmospherics/canister/proc/create_initial_gases() From fa1884b15d96f5c6e0025c2f776395b389896885 Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Thu, 15 Feb 2024 14:48:37 +0300 Subject: [PATCH 24/49] Fix attempt --- code/game/machinery/atmoalter/canister.dm | 6 +++--- .../machinery/atmoalter/portable_atmospherics.dm | 12 +++--------- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 9e3475cae8..dcba9d30d1 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -33,10 +33,10 @@ /// Associative list of gases for this canister to begin with and the moles to have. A negative value will fill the tank to its starting pressure with the gas. var/list/initial_gases = list() /// A temperature in Kelvin for this canister's air contents to begin with. Use this for pre-chilled gases. - var/initial_temperature + var/initial_temperature = null /obj/machinery/portable_atmospherics/canister/Initialize(mapload) - . = ..(mapload) + . = ..() if(prob(1)) desc += " Does not hold GAS." // huhuhu create_initial_gases() @@ -46,7 +46,7 @@ if (initial_gases?.len) for (var/gas_id in initial_gases) air_contents.adjust_gas(gas_id, initial_gases[gas_id] < 0 ? MolesForPressure() : initial_gases[gas_id]) - if (initial_temperature) + if(!isnull(initial_temperature)) air_contents.temperature = initial_temperature update_icon() diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm index 234adee9c1..88e646fb88 100644 --- a/code/game/machinery/atmoalter/portable_atmospherics.dm +++ b/code/game/machinery/atmoalter/portable_atmospherics.dm @@ -15,14 +15,6 @@ var/maximum_pressure = 90 * ONE_ATMOSPHERE atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_CLIMBABLE -/obj/machinery/portable_atmospherics/New() - ..() - - air_contents.volume = volume - air_contents.temperature = T20C - - return 1 - /obj/machinery/portable_atmospherics/Destroy() QDEL_NULL(air_contents) QDEL_NULL(holding) @@ -30,6 +22,8 @@ /obj/machinery/portable_atmospherics/Initialize() ..() + air_contents.volume = volume + air_contents.temperature = T20C return INITIALIZE_HINT_LATELOAD /obj/machinery/portable_atmospherics/LateInitialize() @@ -50,7 +44,7 @@ GAS_OXYGEN = O2STANDARD * MolesForPressure(), GAS_NITROGEN = N2STANDARD * MolesForPressure()) -/obj/machinery/portable_atmospherics/proc/MolesForPressure(var/target_pressure = start_pressure) +/obj/machinery/portable_atmospherics/proc/MolesForPressure(target_pressure = start_pressure) return (target_pressure * air_contents.volume) / (R_IDEAL_GAS_EQUATION * air_contents.temperature) /obj/machinery/portable_atmospherics/on_update_icon() From f2019d25a6231bfa26c4d3651bef1580751ddc69 Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Thu, 15 Feb 2024 14:54:54 +0300 Subject: [PATCH 25/49] Fix please --- code/game/machinery/atmoalter/canister.dm | 8 ++------ code/game/machinery/atmoalter/portable_atmospherics.dm | 6 +++--- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index dcba9d30d1..cef384309b 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -32,8 +32,6 @@ var/update_flag = 0 /// Associative list of gases for this canister to begin with and the moles to have. A negative value will fill the tank to its starting pressure with the gas. var/list/initial_gases = list() - /// A temperature in Kelvin for this canister's air contents to begin with. Use this for pre-chilled gases. - var/initial_temperature = null /obj/machinery/portable_atmospherics/canister/Initialize(mapload) . = ..() @@ -43,11 +41,9 @@ /// Fills this canister with gas based on its subtype's initial_gases list. Should only happen during initial creation. /obj/machinery/portable_atmospherics/canister/proc/create_initial_gases() - if (initial_gases?.len) - for (var/gas_id in initial_gases) + if(LAZYLEN(initial_gases)) + for(var/gas_id in initial_gases) air_contents.adjust_gas(gas_id, initial_gases[gas_id] < 0 ? MolesForPressure() : initial_gases[gas_id]) - if(!isnull(initial_temperature)) - air_contents.temperature = initial_temperature update_icon() /obj/machinery/portable_atmospherics/canister/drain_power() diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm index 88e646fb88..5bc3613b02 100644 --- a/code/game/machinery/atmoalter/portable_atmospherics.dm +++ b/code/game/machinery/atmoalter/portable_atmospherics.dm @@ -3,11 +3,12 @@ use_power = POWER_USE_OFF construct_state = /decl/machine_construction/default/panel_closed - var/datum/gas_mixture/air_contents = new + var/datum/gas_mixture/air_contents var/obj/machinery/atmospherics/portables_connector/connected_port var/obj/item/tank/holding + var/initial_temperature = T20C var/volume = 0 var/destroyed = 0 @@ -22,8 +23,7 @@ /obj/machinery/portable_atmospherics/Initialize() ..() - air_contents.volume = volume - air_contents.temperature = T20C + air_contents = new(volume, initial_temperature) return INITIALIZE_HINT_LATELOAD /obj/machinery/portable_atmospherics/LateInitialize() From 198d8b4a90010c53be9b26aae7551194fc5b1c44 Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Thu, 15 Feb 2024 14:58:15 +0300 Subject: [PATCH 26/49] Pump fix --- code/game/machinery/atmoalter/pump.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/machinery/atmoalter/pump.dm b/code/game/machinery/atmoalter/pump.dm index 9f5fdaec83..6bd88f49ee 100644 --- a/code/game/machinery/atmoalter/pump.dm +++ b/code/game/machinery/atmoalter/pump.dm @@ -17,18 +17,18 @@ power_rating = 7500 //7500 W ~ 10 HP power_losses = 150 - + machine_name = "portable pump" machine_desc = "Used to equalize the pressure of the atmosphere in a surrounding area with its own contents, or to draw in air from the area around it. Runs on a battery backup; can be connected to atmospherics networks." /obj/machinery/portable_atmospherics/powered/pump/filled start_pressure = 90 * ONE_ATMOSPHERE -/obj/machinery/portable_atmospherics/powered/pump/New() - ..() +/obj/machinery/portable_atmospherics/powered/pump/Initialize() + . = ..() var/list/air_mix = StandardAirMix() - src.air_contents.adjust_multi(GAS_OXYGEN, air_mix[GAS_OXYGEN], GAS_NITROGEN, air_mix[GAS_NITROGEN]) + air_contents.adjust_multi(GAS_OXYGEN, air_mix[GAS_OXYGEN], GAS_NITROGEN, air_mix[GAS_NITROGEN]) /obj/machinery/portable_atmospherics/powered/pump/on_update_icon() overlays.Cut() From 391fc1470f7d5a0c50afbfb53cfc40ac17e0d9e7 Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Thu, 15 Feb 2024 15:17:15 +0300 Subject: [PATCH 27/49] Supermatter is now sold in hidden inv of engi trader --- .../trading_station_types/0_always_spawn/engineering.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/trading_stations/trading_station_types/0_always_spawn/engineering.dm b/code/modules/trading_stations/trading_station_types/0_always_spawn/engineering.dm index 84896177a2..cdee424779 100644 --- a/code/modules/trading_stations/trading_station_types/0_always_spawn/engineering.dm +++ b/code/modules/trading_stations/trading_station_types/0_always_spawn/engineering.dm @@ -43,4 +43,8 @@ TRADE_CAT_TOOLS = list( /obj/item/storage/toolbox/syndicate = GOODS_DEFAULT, ), + TRADE_CAT_EQUIPMENT = list( + /obj/machinery/power/supermatter/shard = GOODS_DEFAULT, + /obj/machinery/power/supermatter = GOODS_DEFAULT, + ), ) From 5722cdbf462bcee331c55384e95e812abddb9212 Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Thu, 15 Feb 2024 22:43:00 +0300 Subject: [PATCH 28/49] Payrolls update --- code/modules/economy/ATM.dm | 36 +++++++++++++++++++ code/modules/economy/Accounts.dm | 16 +++++---- .../file_system/programs/generic/supply.dm | 31 ++++++++++++++-- 3 files changed, 73 insertions(+), 10 deletions(-) diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm index 17690ffbf3..aa311c8900 100644 --- a/code/modules/economy/ATM.dm +++ b/code/modules/economy/ATM.dm @@ -2,6 +2,7 @@ #define CHANGE_SECURITY_LEVEL 1 #define TRANSFER_FUNDS 2 #define VIEW_TRANSACTION_LOGS 3 +#define PAYROLLS 4 /obj/item/card/id/var/money = 2000 @@ -184,6 +185,17 @@ t += "Transaction purpose: <input type='text' name='purpose' value='Funds transfer' style='width:200px; background-color:white;'><br>" t += "<input type='submit' value='Transfer funds'><br>" t += "</form>" + if(PAYROLLS) + t += "<b>Accounts on payroll:</b>" + for(var/acc_id in authenticated_account.payroll_accounts) + var/datum/money_account/A = get_account(text2num(acc_id)) + if(!istype(A)) + authenticated_account.payroll_accounts -= acc_id + continue + var/paycheck = authenticated_account.payroll_accounts[acc_id] + t += "[A.account_name]: <A href='?src=\ref[src];choice=set_payroll&account=[acc_id]'>[paycheck]</A><br>" + t += "<br>" + t += "<A href='?src=\ref[src];choice=set_payroll'>Add new account</A>" else t += "<b>Account balance:</b> [GLOB.using_map.local_currency_name_short][authenticated_account.money]" t += "<form name='withdrawal' action='?src=\ref[src]' method='get'>" @@ -194,6 +206,7 @@ t += "<A href='?src=\ref[src];choice=view_screen;view_screen=1'>Change account security level</a><br>" t += "<A href='?src=\ref[src];choice=view_screen;view_screen=2'>Make transfer</a><br>" t += "<A href='?src=\ref[src];choice=view_screen;view_screen=3'>View transaction log</a><br>" + t += "<A href='?src=\ref[src];choice=view_screen;view_screen=4'>Setup payrolls</a><br>" t += "<A href='?src=\ref[src];choice=balance_statement'>Print balance statement</a><br>" //Logout/back buttons, put here for some modularity and for less repeated code @@ -421,6 +434,29 @@ authenticated_account = null account_security_level = 0 + if("set_payroll") + if(!authenticated_account) + return + + var/list/payroll = authenticated_account.payroll_accounts + var/account_id = href_list["account"] + if(!account_id) + account_id = input("Enter account number", "Account payroll") as num|null + + var/datum/money_account/A = get_account(account_id) + if(!istype(A)) + to_chat(usr, SPAN_WARNING("Account with this number does not exist!")) + return + + var/autofill_pay = null + if(payroll[num2text(account_id)]) + autofill_pay = payroll[num2text(account_id)] + var/account_pay = input("Enter new payroll", "Account payroll", autofill_pay) as num|null + if(!account_pay) + payroll -= num2text(account_id) + else + payroll[num2text(account_id)] = account_pay + interact(usr) /obj/machinery/atm/proc/scan_user(mob/living/carbon/human/human_user as mob) diff --git a/code/modules/economy/Accounts.dm b/code/modules/economy/Accounts.dm index a7dfc0573c..eecec6ba64 100644 --- a/code/modules/economy/Accounts.dm +++ b/code/modules/economy/Accounts.dm @@ -5,12 +5,12 @@ var/remote_access_pin = 0 var/money = 0 var/list/transaction_log = list() - var/suspended = 0 + var/suspended = FALSE var/security_level = 0 //0 - auto-identify from worn ID, require only account number //1 - require manual login / account number and pin //2 - require card and manual login var/account_type = ACCOUNT_TYPE_PERSONAL - /// Associative list of money accounts which we pay into every 30 minutes; account_number = money + /// Associative list of account IDs which we pay into every 30 minutes; account_number = money var/list/payroll_accounts = list() /datum/money_account/New(var/account_type) @@ -43,17 +43,19 @@ // Called by supply subsystem fire() proc every ~30 minutes /datum/money_account/proc/PayrollTick() listclearnulls(payroll_accounts) - for(var/datum/money_account/A in payroll_accounts) + for(var/acc_id in payroll_accounts) + var/datum/money_account/A = get_account(text2num(acc_id)) + if(!istype(A)) + continue if(!payroll_accounts[A]) payroll_accounts[A] = 0 continue - var/pay = payroll_accounts[A] + var/pay = payroll_accounts[acc_id] if(!pay || pay > money) continue transfer(A, pay, "Payroll from [account_name]") -/proc/create_account(var/account_name = "Default account name", var/owner_name, var/starting_funds = 0, var/account_type = ACCOUNT_TYPE_PERSONAL, var/obj/machinery/computer/account_database/source_db) - +/proc/create_account(account_name = "Default account name", owner_name, starting_funds = 0, account_type = ACCOUNT_TYPE_PERSONAL, obj/machinery/computer/account_database/source_db) //create a new account var/datum/money_account/M = new() M.account_name = account_name @@ -110,7 +112,7 @@ if(D && D.security_level <= security_level_passed && (!D.security_level || D.remote_access_pin == attempt_pin_number) ) return D -/proc/get_account(var/account_number) +/proc/get_account(account_number) for(var/datum/money_account/D in all_money_accounts) if(D.account_number == account_number) return D diff --git a/code/modules/modular_computers/file_system/programs/generic/supply.dm b/code/modules/modular_computers/file_system/programs/generic/supply.dm index a7cf554840..3d649dc8bc 100644 --- a/code/modules/modular_computers/file_system/programs/generic/supply.dm +++ b/code/modules/modular_computers/file_system/programs/generic/supply.dm @@ -279,7 +279,17 @@ if(href_list["PRG_account"]) var/obj/item/stock_parts/computer/card_slot/card_slot = computer.get_component(PART_CARD) - var/acc_num = input("Enter account number", "Account linking", card_slot?.stored_card?.associated_account_number) as num|null + var/obj/item/card/id/ID = card_slot.stored_card + if(!istype(ID)) + ID = usr.GetIdCard() + // Account security level is 0 - auto-login from the ID + if(istype(ID) && ID.associated_account_number) + var/datum/money_account/A = get_account(ID.associated_account_number) + if(istype(A) && A.security_level == 0) + account = A + return TRUE + + var/acc_num = input("Enter account number", "Account linking", ID.associated_account_number) as num|null if(!acc_num) return @@ -287,7 +297,7 @@ if(!acc_pin) return - var/card_check = card_slot?.stored_card?.associated_account_number == acc_num + var/card_check = ID.associated_account_number == acc_num var/datum/money_account/A = attempt_account_access(acc_num, acc_pin, card_check ? 2 : 1, TRUE) if(!A) to_chat(usr, SPAN_WARNING("Unable to link account: access denied.")) @@ -318,6 +328,9 @@ if(!account) to_chat(usr, SPAN_WARNING("ERROR: No account linked.")) return + if(account.suspended) + to_chat(usr, SPAN_WARNING("ERROR: Linked account is suspended.")) + return if(LAZYLEN(station.whitelist_factions) && !(faction in station.whitelist_factions)) to_chat(usr, SPAN_WARNING("ERROR: Trading is forbidden for your associated faction.")) return @@ -345,6 +358,9 @@ if(!account) to_chat(usr, SPAN_WARNING("ERROR: No account linked.")) return + if(account.suspended) + to_chat(usr, SPAN_WARNING("ERROR: Linked account is suspended.")) + return if(LAZYLEN(station.whitelist_factions) && !(faction in station.whitelist_factions)) to_chat(usr, SPAN_WARNING("ERROR: Trading is forbidden for your associated faction.")) return @@ -417,6 +433,9 @@ if(orders_locked) to_chat(usr, SPAN_WARNING("ERROR: You cannot place an order at this time. Please wait 10 seconds.")) return + if(account.suspended) + to_chat(usr, SPAN_WARNING("ERROR: Linked account is suspended.")) + return var/reason = sanitizeName(input("Enter reason(s) for order", "Request Reason", ""), MAX_NAME_LEN) current_order = SSsupply.BuildOrder(account, reason, shopping_list) shopping_list = list() @@ -608,6 +627,9 @@ if(!account) to_chat(usr, SPAN_WARNING("ERROR: No account linked.")) return + if(account.suspended) + to_chat(usr, SPAN_WARNING("ERROR: Linked account is suspended.")) + return if(get_area(receiving) != get_area(computer) && program_type != "master") to_chat(usr, SPAN_WARNING("ERROR: Receiving beacon is too far from \the [computer].")) return @@ -622,6 +644,9 @@ if(get_area(sending) != get_area(computer) && program_type != "master") to_chat(usr, SPAN_WARNING("ERROR: Sending beacon is too far from \the [computer].")) return + if(account.suspended) + to_chat(usr, SPAN_WARNING("ERROR: Linked account is suspended.")) + return SSsupply.Export(sending, account, faction) return TRUE @@ -684,7 +709,7 @@ dat += "<A href='?src=\ref[src];PRG_faction=1'>Link Faction</A><br><br>" if(account) - dat += "Current Account: [account.owner_name]<br>" + dat += "Current Account: [account.owner_name][account.suspended ? " <span style='color: [COLOR_RED]'>\[SUSPENDED\]</span>" : ""]<br>" dat += "Balance: [account.get_balance()]<br>" dat += "<a href='?src=\ref[src];PRG_account_unlink=1'>Unlink</A><br><br>" else From edb7bcb74ce7d0712015313ddb2f88f3151ac031 Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Thu, 15 Feb 2024 23:00:31 +0300 Subject: [PATCH 29/49] Artifact values --- code/modules/item_worth/value_procs.dm | 10 ++++++++++ code/modules/item_worth/worths_list.dm | 4 ++-- .../xenoarcheaology/artifacts/effects/_effect.dm | 5 +++++ .../xenoarcheaology/artifacts/effects/bone_break.dm | 1 + .../xenoarcheaology/artifacts/effects/bone_mend.dm | 1 + .../xenoarcheaology/artifacts/effects/cellcharge.dm | 1 + .../xenoarcheaology/artifacts/effects/celldrain.dm | 1 + code/modules/xenoarcheaology/artifacts/effects/cold.dm | 1 + .../xenoarcheaology/artifacts/effects/dnaswitch.dm | 1 + .../xenoarcheaology/artifacts/effects/forcefield.dm | 1 + code/modules/xenoarcheaology/artifacts/effects/heal.dm | 1 + code/modules/xenoarcheaology/artifacts/effects/heat.dm | 1 + .../xenoarcheaology/artifacts/effects/hell_portal.dm | 8 ++++++++ code/modules/xenoarcheaology/artifacts/effects/hurt.dm | 1 + .../xenoarcheaology/artifacts/effects/organ_mend.dm | 1 + .../xenoarcheaology/artifacts/effects/pushback.dm | 6 ++++++ .../xenoarcheaology/artifacts/effects/radiate.dm | 5 +++++ .../xenoarcheaology/artifacts/effects/roboheal.dm | 1 + .../xenoarcheaology/artifacts/effects/robohurt.dm | 1 + .../xenoarcheaology/artifacts/effects/skill_buff.dm | 6 ++++++ .../xenoarcheaology/artifacts/effects/sleepy.dm | 1 + code/modules/xenoarcheaology/artifacts/effects/stun.dm | 1 + .../xenoarcheaology/artifacts/effects/teleport.dm | 1 + 23 files changed, 58 insertions(+), 2 deletions(-) diff --git a/code/modules/item_worth/value_procs.dm b/code/modules/item_worth/value_procs.dm index e89cfd7add..6f5d4c9938 100644 --- a/code/modules/item_worth/value_procs.dm +++ b/code/modules/item_worth/value_procs.dm @@ -113,3 +113,13 @@ for(var/gas_id in air_contents.gas) . += gas_data.value[gas_id] * air_contents.gas[gas_id] . = round(.) + +/obj/machinery/artifact/Value(base) + . = ..() + if(effect) + . += effect.Value() + +/obj/item/anobattery/Value(base) + . = ..() + if(battery_effect) + . += round(battery_effect.Value() * 0.25) diff --git a/code/modules/item_worth/worths_list.dm b/code/modules/item_worth/worths_list.dm index 575762b498..9356d35b90 100644 --- a/code/modules/item_worth/worths_list.dm +++ b/code/modules/item_worth/worths_list.dm @@ -178,7 +178,7 @@ var/list/worths = list( /obj/item/silencer = 60, /obj/item/fossil = 100, /obj/item/vampiric = 666, - /obj/item/anobattery = 1800, + /obj/item/anobattery = -1500, /obj/item/anodevice = 3300, /obj/item/scrying = 1000, /obj/item/magic_rock = 1500, @@ -666,7 +666,7 @@ var/list/worths = list( /obj/machinery/mining/brace = -300, /obj/machinery/auto_cloner = -25000, /obj/machinery/giga_drill = -9000, - /obj/machinery/artifact = -18000, + /obj/machinery/artifact = -10000, /obj/machinery/power/supermatter/shard = 60000, /obj/machinery/power/supermatter = 200000, /obj/machinery/atmospherics/pipe = 0, diff --git a/code/modules/xenoarcheaology/artifacts/effects/_effect.dm b/code/modules/xenoarcheaology/artifacts/effects/_effect.dm index b250def632..64d997b02a 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/_effect.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/_effect.dm @@ -18,6 +18,8 @@ var/on_time //time artifact should stay on for when toggled var/time_min_range = 50 var/time_max_range = 200 + // Base value of this effect + var/value = 0 /datum/artifact_effect/New(atom/artifact) ..() @@ -132,3 +134,6 @@ protected += 0.1 return 1 - protected + +/datum/artifact_effect/proc/Value() + return value diff --git a/code/modules/xenoarcheaology/artifacts/effects/bone_break.dm b/code/modules/xenoarcheaology/artifacts/effects/bone_break.dm index 248b1cddf1..e43870ffc6 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/bone_break.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/bone_break.dm @@ -6,6 +6,7 @@ ) possible_effect_types = list(EFFECT_TOUCH, EFFECT_PULSE) cooldown_time = 100 + value = 4000 /datum/artifact_effect/bone_break/getDescription() return "The artifact emits waves of shattering energy." diff --git a/code/modules/xenoarcheaology/artifacts/effects/bone_mend.dm b/code/modules/xenoarcheaology/artifacts/effects/bone_mend.dm index 92d6e6ecb8..314f6fa0c7 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/bone_mend.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/bone_mend.dm @@ -2,6 +2,7 @@ name = "bone mend" possible_effect_types = list(EFFECT_TOUCH, EFFECT_PULSE) cooldown_time = 100 + value = 8000 /datum/artifact_effect/bone_mend/getDescription() return "The artifact emits waves of mending energy." diff --git a/code/modules/xenoarcheaology/artifacts/effects/cellcharge.dm b/code/modules/xenoarcheaology/artifacts/effects/cellcharge.dm index bcb9c230a9..9081d691cd 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/cellcharge.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/cellcharge.dm @@ -1,6 +1,7 @@ /datum/artifact_effect/cellcharge name = "cell charge" possible_effect_types = list(EFFECT_TOUCH, EFFECT_AURA, EFFECT_PULSE) + value = 5000 var/last_message /datum/artifact_effect/cellcharge/getDescription() diff --git a/code/modules/xenoarcheaology/artifacts/effects/celldrain.dm b/code/modules/xenoarcheaology/artifacts/effects/celldrain.dm index 5c2a8ee228..ad46144529 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/celldrain.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/celldrain.dm @@ -1,6 +1,7 @@ /datum/artifact_effect/celldrain name = "cell drain" possible_effect_types = list(EFFECT_TOUCH, EFFECT_AURA, EFFECT_PULSE) + value = 2000 var/last_message /datum/artifact_effect/celldrain/getDescription() diff --git a/code/modules/xenoarcheaology/artifacts/effects/cold.dm b/code/modules/xenoarcheaology/artifacts/effects/cold.dm index ad461c1165..287ab5a62e 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/cold.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/cold.dm @@ -3,6 +3,7 @@ name = "cold" possible_effect_types = list(EFFECT_TOUCH, EFFECT_AURA) cooldown_time = 50 + value = 4000 var/target_temp /datum/artifact_effect/cold/getDescription() diff --git a/code/modules/xenoarcheaology/artifacts/effects/dnaswitch.dm b/code/modules/xenoarcheaology/artifacts/effects/dnaswitch.dm index 610a4ca57f..c0587c17ee 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/dnaswitch.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/dnaswitch.dm @@ -2,6 +2,7 @@ /datum/artifact_effect/dnaswitch name = "dnaswitch" possible_effect_types = list(EFFECT_TOUCH, EFFECT_AURA, EFFECT_PULSE) + value = 6000 var/severity /datum/artifact_effect/dnaswitch/getDescription() diff --git a/code/modules/xenoarcheaology/artifacts/effects/forcefield.dm b/code/modules/xenoarcheaology/artifacts/effects/forcefield.dm index db37c0e4cf..3dbfdc5a06 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/forcefield.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/forcefield.dm @@ -3,6 +3,7 @@ effect_type = EFFECT_TOUCH cooldown_time = 50 possible_effect_types = list(EFFECT_TOUCH, EFFECT_PULSE) + value = 6000 var/list/created_field = list() var/field_range = 4 var/field_color diff --git a/code/modules/xenoarcheaology/artifacts/effects/heal.dm b/code/modules/xenoarcheaology/artifacts/effects/heal.dm index 2407cc2daa..b98903b79f 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/heal.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/heal.dm @@ -2,6 +2,7 @@ name = "heal" possible_effect_types = list(EFFECT_TOUCH, EFFECT_AURA, EFFECT_PULSE) cooldown_time = 50 + value = 7000 /datum/artifact_effect/heal/getDescription() return "The artifact emits waves of soothing energy." diff --git a/code/modules/xenoarcheaology/artifacts/effects/heat.dm b/code/modules/xenoarcheaology/artifacts/effects/heat.dm index dfe6f785f0..c3c9ed965c 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/heat.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/heat.dm @@ -3,6 +3,7 @@ name = "heat" possible_effect_types = list(EFFECT_TOUCH, EFFECT_AURA) cooldown_time = 50 + value = 4000 var/target_temp /datum/artifact_effect/heat/getDescription() diff --git a/code/modules/xenoarcheaology/artifacts/effects/hell_portal.dm b/code/modules/xenoarcheaology/artifacts/effects/hell_portal.dm index 48a339096b..4a531a2add 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/hell_portal.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/hell_portal.dm @@ -1,6 +1,7 @@ /datum/artifact_effect/hellportal name = "hellportal" effect_type = EFFECT_PULSE + value = 1000 var/convert_count //how many turfs are converted to lava each activation var/active_portals_max //how many portals can be spawned at each interval var/maximum_mob_count @@ -49,6 +50,13 @@ ..() +/datum/artifact_effect/hellportal/Value() + . = ..() + . += convert_count * 1000 + . += active_portals_max * 2000 + . += maximum_mob_count * 500 + . += damage * 100 + /datum/artifact_effect/hellportal/DoEffectPulse() if (holder) convert_turfs() diff --git a/code/modules/xenoarcheaology/artifacts/effects/hurt.dm b/code/modules/xenoarcheaology/artifacts/effects/hurt.dm index 7f3a8e33e4..175dce030f 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/hurt.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/hurt.dm @@ -2,6 +2,7 @@ name = "hurt" possible_effect_types = list(EFFECT_TOUCH, EFFECT_AURA, EFFECT_PULSE) cooldown_time = 50 + value = 3000 /datum/artifact_effect/hurt/getDescription() return "The artifact emits waves of harmful energy." diff --git a/code/modules/xenoarcheaology/artifacts/effects/organ_mend.dm b/code/modules/xenoarcheaology/artifacts/effects/organ_mend.dm index d1a0a304a1..564a6117de 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/organ_mend.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/organ_mend.dm @@ -2,6 +2,7 @@ name = "organ mend" possible_effect_types = list(EFFECT_TOUCH, EFFECT_PULSE) cooldown_time = 100 + value = 12000 /datum/artifact_effect/organ_mend/getDescription() return "The artifact emits waves that positively affect internal organs." diff --git a/code/modules/xenoarcheaology/artifacts/effects/pushback.dm b/code/modules/xenoarcheaology/artifacts/effects/pushback.dm index 3b2a40befc..900264ea45 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/pushback.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/pushback.dm @@ -2,6 +2,7 @@ name = "pushback" possible_effect_types = list(EFFECT_TOUCH, EFFECT_PULSE) cooldown_time = 50 + value = 2000 var/throw_range var/damage var/speed = 3 @@ -14,6 +15,11 @@ throw_range = range + rand(-1, 3) damage = rand(5, 15) +/datum/artifact_effect/pushback/Value() + . = ..() + . += throw_range * 1500 + . += damage * 300 + /datum/artifact_effect/pushback/DoEffect(mob/toucher) if(holder && istype(toucher, /mob/living)) var/mob/living/M = toucher diff --git a/code/modules/xenoarcheaology/artifacts/effects/radiate.dm b/code/modules/xenoarcheaology/artifacts/effects/radiate.dm index ffdc7d6823..807a0beaa2 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/radiate.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/radiate.dm @@ -1,6 +1,7 @@ /datum/artifact_effect/radiate name = "radiation" possible_effect_types = list(EFFECT_TOUCH, EFFECT_AURA, EFFECT_PULSE) + value = 3000 var/radiation_strength /datum/artifact_effect/radiate/getDescription() @@ -15,6 +16,10 @@ ..() radiation_strength = rand(10, 50) +/datum/artifact_effect/radiate/Value() + . = ..() + . += radiation_strength * 100 + /datum/artifact_effect/radiate/DoEffect(mob/living/user) if(istype(user)) user.apply_damage(radiation_strength * 2,IRRADIATE, damage_flags = DAM_DISPERSED) diff --git a/code/modules/xenoarcheaology/artifacts/effects/roboheal.dm b/code/modules/xenoarcheaology/artifacts/effects/roboheal.dm index c9645c58cf..5df8e9948a 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/roboheal.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/roboheal.dm @@ -2,6 +2,7 @@ name = "robotic healing" possible_effect_types = list(EFFECT_TOUCH, EFFECT_AURA, EFFECT_PULSE) cooldown_time = 50 + value = 9000 var/last_message /datum/artifact_effect/roboheal/getDescription() diff --git a/code/modules/xenoarcheaology/artifacts/effects/robohurt.dm b/code/modules/xenoarcheaology/artifacts/effects/robohurt.dm index 8cfd4d3166..a3714bf73a 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/robohurt.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/robohurt.dm @@ -2,6 +2,7 @@ name = "robotic harm" possible_effect_types = list(EFFECT_TOUCH, EFFECT_AURA, EFFECT_PULSE) cooldown_time = 50 + value = 4000 var/last_message /datum/artifact_effect/robohurt/getDescription() diff --git a/code/modules/xenoarcheaology/artifacts/effects/skill_buff.dm b/code/modules/xenoarcheaology/artifacts/effects/skill_buff.dm index 7901ef9c9c..2433f242da 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/skill_buff.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/skill_buff.dm @@ -5,6 +5,7 @@ cooldown_time = 5 SECONDS time_min_range = 5 SECONDS time_max_range = 20 SECONDS + value = 500 var/datum/skill_buff/buff_type = /datum/skill_buff/artifact var/decl/hierarchy/skill/buff_skill var/buff_amount = 1 @@ -35,6 +36,11 @@ else if(prob(1)) // LEGENDARY buff_amount = 4 +/datum/artifact_effect/skill_buff/Value() + . = ..() + . += buff_amount * 10000 + . += buff_duration * 2 + /datum/artifact_effect/skill_buff/proc/BuffMob(mob/living/carbon/human/H) if(ishuman(H)) if(H.buff_skill(list(buff_skill.type = buff_amount), buff_duration, buff_type)) diff --git a/code/modules/xenoarcheaology/artifacts/effects/sleepy.dm b/code/modules/xenoarcheaology/artifacts/effects/sleepy.dm index 2200890ab9..77738ddf4d 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/sleepy.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/sleepy.dm @@ -2,6 +2,7 @@ name = "sleepy" possible_effect_types = list(EFFECT_TOUCH, EFFECT_AURA, EFFECT_PULSE) cooldown_time = 50 + value = 3000 /datum/artifact_effect/sleepy/getDescription() return "May induce temporary sense of harmony and peace in its targets." diff --git a/code/modules/xenoarcheaology/artifacts/effects/stun.dm b/code/modules/xenoarcheaology/artifacts/effects/stun.dm index c3269796b8..40a117a6e6 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/stun.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/stun.dm @@ -2,6 +2,7 @@ name = "stun" possible_effect_types = list(EFFECT_TOUCH, EFFECT_PULSE) cooldown_time = 50 + value = 5000 /datum/artifact_effect/stun/getDescription() return "Effects include rapid attack on the neural centers of the body." diff --git a/code/modules/xenoarcheaology/artifacts/effects/teleport.dm b/code/modules/xenoarcheaology/artifacts/effects/teleport.dm index 9f40d48138..71b88c22c7 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/teleport.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/teleport.dm @@ -2,6 +2,7 @@ name = "teleport" possible_effect_types = list(EFFECT_TOUCH, EFFECT_PULSE) cooldown_time = 50 + value = 7000 var/list/teleporting = list() //mobs waiting to be teleported /datum/artifact_effect/teleport/getDescription() From e62dee658cf5cd04645aec59b71c770e4898a703 Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Thu, 15 Feb 2024 23:56:42 +0300 Subject: [PATCH 30/49] Fix --- code/modules/economy/ATM.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm index aa311c8900..8b0a5dcd77 100644 --- a/code/modules/economy/ATM.dm +++ b/code/modules/economy/ATM.dm @@ -186,7 +186,7 @@ t += "<input type='submit' value='Transfer funds'><br>" t += "</form>" if(PAYROLLS) - t += "<b>Accounts on payroll:</b>" + t += "<b>Accounts on payroll:</b><br>" for(var/acc_id in authenticated_account.payroll_accounts) var/datum/money_account/A = get_account(text2num(acc_id)) if(!istype(A)) @@ -195,7 +195,7 @@ var/paycheck = authenticated_account.payroll_accounts[acc_id] t += "[A.account_name]: <A href='?src=\ref[src];choice=set_payroll&account=[acc_id]'>[paycheck]</A><br>" t += "<br>" - t += "<A href='?src=\ref[src];choice=set_payroll'>Add new account</A>" + t += "<A href='?src=\ref[src];choice=set_payroll'>Add new account</A><br>" else t += "<b>Account balance:</b> [GLOB.using_map.local_currency_name_short][authenticated_account.money]" t += "<form name='withdrawal' action='?src=\ref[src]' method='get'>" @@ -439,7 +439,7 @@ return var/list/payroll = authenticated_account.payroll_accounts - var/account_id = href_list["account"] + var/account_id = text2num(href_list["account"]) if(!account_id) account_id = input("Enter account number", "Account payroll") as num|null From 0f3754235dfc72313bed87fa304be3071b0c6e61 Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Fri, 16 Feb 2024 09:48:09 +0300 Subject: [PATCH 31/49] More trading stations --- baystation12.dme | 3 ++ code/__defines/supply.dm | 1 + code/controllers/subsystems/supply.dm | 13 +++--- code/game/jobs/access_datum.dm | 21 ++++++--- .../items/devices/mind_engraver_chip.dm | 36 ++++++++++++++++ code/modules/item_worth/value_procs.dm | 5 +++ code/modules/item_worth/worths_list.dm | 9 ++-- .../guns/magnetic/magnetic_railgun.dm | 2 +- code/modules/trading_stations/_faction.dm | 14 ++++++ .../0_always_spawn/atmos.dm | 3 ++ .../0_always_spawn/medical.dm | 1 + .../0_always_spawn/mining.dm | 43 +++++++++++++++++++ .../0_always_spawn/science.dm | 29 +++++++++++++ .../3_very_rare/dominion.dm | 23 ++++++++++ 14 files changed, 187 insertions(+), 16 deletions(-) create mode 100644 code/modules/trading_stations/trading_station_types/0_always_spawn/mining.dm create mode 100644 code/modules/trading_stations/trading_station_types/0_always_spawn/science.dm create mode 100644 code/modules/trading_stations/trading_station_types/3_very_rare/dominion.dm diff --git a/baystation12.dme b/baystation12.dme index b5702e3068..87845e536e 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -3294,9 +3294,12 @@ #include "code\modules\trading_stations\trading_station_types\0_always_spawn\eva.dm" #include "code\modules\trading_stations\trading_station_types\0_always_spawn\materials.dm" #include "code\modules\trading_stations\trading_station_types\0_always_spawn\medical.dm" +#include "code\modules\trading_stations\trading_station_types\0_always_spawn\mining.dm" +#include "code\modules\trading_stations\trading_station_types\0_always_spawn\science.dm" #include "code\modules\trading_stations\trading_station_types\0_always_spawn\security.dm" #include "code\modules\trading_stations\trading_station_types\0_always_spawn\terra.dm" #include "code\modules\trading_stations\trading_station_types\2_rare\weapons.dm" +#include "code\modules\trading_stations\trading_station_types\3_very_rare\dominion.dm" #include "code\modules\trading_stations\trading_station_types\3_very_rare\obs.dm" #include "code\modules\trusted-players\procs.dm" #include "code\modules\turbolift\_turbolift.dm" diff --git a/code/__defines/supply.dm b/code/__defines/supply.dm index 48f6dbdb93..2ec5ade744 100644 --- a/code/__defines/supply.dm +++ b/code/__defines/supply.dm @@ -26,6 +26,7 @@ #define TRADE_CAT_CHEMCARTS "Chemical Cartridges" #define TRADE_CAT_CANISTERS "Gas Canisters" #define TRADE_CAT_MACHINES "Machinery" +#define TRADE_CAT_ARTIFACT "Artifacts" // As in - faction is a part of us #define FACTION_STATE_PROTECTORATE 4 diff --git a/code/controllers/subsystems/supply.dm b/code/controllers/subsystems/supply.dm index 9e83068f2f..4ff3683584 100644 --- a/code/controllers/subsystems/supply.dm +++ b/code/controllers/subsystems/supply.dm @@ -36,6 +36,8 @@ SUBSYSTEM_DEF(supply) var/list/order_queue = list() // For exporting + /// Maximum price of an atom before it becomes affected by an export modifier + var/export_maximum = 25000 var/list/export_modifier = list() var/list/export_counter = list() /// Paths of atoms that are entirely unaffected by export price modifiers @@ -80,7 +82,8 @@ SUBSYSTEM_DEF(supply) for(var/datum/money_account/A in all_money_accounts) A.PayrollTick() for(var/A in export_counter) - export_counter[A] = max(0, export_counter[A] -= 10) + var/reduction = max(export_maximum, export_counter[A] * 0.5) + export_counter[A] = max(0, export_counter[A] -= reduction) ExportCounterCheck() /datum/controller/subsystem/supply/proc/GetFaction(fac) @@ -403,8 +406,8 @@ SUBSYSTEM_DEF(supply) if(!(is_path_in_list(item.type, export_modifier_exempt_types))) if(!(item.type in export_counter)) export_counter[item.type] = 0 - if(export_counter[item.type] < 30) - export_counter[item.type] += 1 + if(export_counter[item.type] < export_maximum * 2) + export_counter[item.type] += round(min(export_value, export_maximum * 0.25)) //SEND_SIGNAL(src, COMSIG_TRADE_BEACON, item) qdel(item) ++export_count @@ -433,8 +436,8 @@ SUBSYSTEM_DEF(supply) /datum/controller/subsystem/supply/proc/ExportCounterCheck() for(var/A in export_counter) - if(export_counter[A] > 20) - export_modifier[A] = clamp(round(20 / export_counter[A], 0.01), 0.5, 2.0) + if(export_counter[A] > export_maximum) + export_modifier[A] = clamp(round(export_maximum / export_counter[A], 0.01), 0.5, 2.0) else if(A in export_modifier) export_modifier -= A diff --git a/code/game/jobs/access_datum.dm b/code/game/jobs/access_datum.dm index 8388fabcd1..52d6ab480e 100644 --- a/code/game/jobs/access_datum.dm +++ b/code/game/jobs/access_datum.dm @@ -483,47 +483,54 @@ /datum/access/supplylink_solgov id = access_supplylink_solgov desc = "Supply Console - SolGov Link" - region = ACCESS_REGION_SUPPLY + region = ACCESS_REGION_NONE access_type = ACCESS_TYPE_NONE /var/const/access_supplylink_terragov = "ACCESS_SUPPLY_LINK_TERRAGOV" /datum/access/supplylink_terragov id = access_supplylink_terragov desc = "Supply Console - TerraGov Link" - region = ACCESS_REGION_SUPPLY + region = ACCESS_REGION_NONE access_type = ACCESS_TYPE_NONE /var/const/access_supplylink_isc = "ACCESS_SUPPLY_LINK_ISC" /datum/access/supplylink_isc id = access_supplylink_isc desc = "Supply Console - ISC Link" - region = ACCESS_REGION_SUPPLY + region = ACCESS_REGION_NONE access_type = ACCESS_TYPE_NONE /var/const/access_supplylink_nanotrasen = "ACCESS_SUPPLY_LINK_NANOTRASEN" /datum/access/supplylink_nanotrasen id = access_supplylink_nanotrasen desc = "Supply Console - Nanotrasen Link" - region = ACCESS_REGION_SUPPLY + region = ACCESS_REGION_NONE access_type = ACCESS_TYPE_NONE /var/const/access_supplylink_cybersun = "ACCESS_SUPPLY_LINK_CYBERSUN" /datum/access/supplylink_cybersun id = access_supplylink_cybersun desc = "Supply Console - Cybersun Link" - region = ACCESS_REGION_SUPPLY + region = ACCESS_REGION_NONE access_type = ACCESS_TYPE_NONE /var/const/access_supplylink_obs = "ACCESS_SUPPLY_LINK_OBS" /datum/access/supplylink_obs id = access_supplylink_obs desc = "Supply Console - OBS Link" - region = ACCESS_REGION_SUPPLY + region = ACCESS_REGION_NONE access_type = ACCESS_TYPE_NONE /var/const/access_supplylink_reborn_church = "ACCESS_SUPPLY_LINK_REBORN_CHURCH" /datum/access/supplylink_reborn_church id = access_supplylink_reborn_church desc = "Supply Console - Reborn Christian Church Link" - region = ACCESS_REGION_SUPPLY + region = ACCESS_REGION_NONE + access_type = ACCESS_TYPE_NONE + +/var/const/access_supplylink_dominion = "ACCESS_SUPPLY_LINK_TERRAN_DOMINION" +/datum/access/supplylink_dominion + id = access_supplylink_dominion + desc = "Supply Console - Reborn Christian Church Link" + region = ACCESS_REGION_NONE access_type = ACCESS_TYPE_NONE diff --git a/code/game/objects/items/devices/mind_engraver_chip.dm b/code/game/objects/items/devices/mind_engraver_chip.dm index ad6e54ba51..2bc80b5a36 100644 --- a/code/game/objects/items/devices/mind_engraver_chip.dm +++ b/code/game/objects/items/devices/mind_engraver_chip.dm @@ -46,6 +46,7 @@ /////////// /datum/engraver_data var/chip_type = "UNKNOWN" + var/value = 1500 /datum/engraver_data/proc/PrintFunction() return "UNKNOWN" @@ -55,6 +56,9 @@ return FALSE return TRUE +/datum/engraver_data/proc/Value() + return value + /* Skills */ /datum/engraver_data/skill chip_type = "Skill Imprint" @@ -89,6 +93,14 @@ target.skillset.on_levels_change() return TRUE +/datum/engraver_data/skill/Value() + . = ..() + for(var/decl/hierarchy/skill/S in GLOB.skills) + if(!(S.type in skills)) + continue + for(var/i = 1 to skills[S.type]) + . += S.get_cost(i) * 500 + // Random /datum/engraver_data/skill/random/New() . = ..() @@ -148,6 +160,29 @@ return TRUE +/datum/engraver_data/language/Value() + . = ..() + for(var/lang in languages) + switch(lang) + if(LANGUAGE_CHANGELING_GLOBAL, LANGUAGE_CULT_GLOBAL) + . += 22000 + if(LANGUAGE_BORER_GLOBAL) + . += 16000 + if(LANGUAGE_ROBOT_GLOBAL) + . += 12000 + if(LANGUAGE_DRONE_GLOBAL, LANGUAGE_MANTID_BROADCAST, LANGUAGE_ROOTGLOBAL) + . += 10000 + if(LANGUAGE_CULT, LANGUAGE_MANTID_VOCAL, LANGUAGE_MANTID_NONVOCAL, LANGUAGE_ALIUM) + . += 8000 + if(LANGUAGE_NABBER, LANGUAGE_ADHERENT, LANGUAGE_VOX, LANGUAGE_ROOTLOCAL, LANGUAGE_SKRELLIAN, LANGUAGE_UNATHI_SINTA, LANGUAGE_UNATHI_YEOSA) + . += 6000 + if(LANGUAGE_EAL) + . += 4000 + if(LANGUAGE_PRIMITIVE) + . += 2000 + else + . += 1000 + // Random /datum/engraver_data/language/random/New() . = ..() @@ -187,6 +222,7 @@ /* Fluff */ /datum/engraver_data/memory chip_type = "Memory Imprint" + value = 1000 var/function_text = "UNKNOWN" /datum/engraver_data/memory/PrintFunction() diff --git a/code/modules/item_worth/value_procs.dm b/code/modules/item_worth/value_procs.dm index 6f5d4c9938..dc965606a8 100644 --- a/code/modules/item_worth/value_procs.dm +++ b/code/modules/item_worth/value_procs.dm @@ -123,3 +123,8 @@ . = ..() if(battery_effect) . += round(battery_effect.Value() * 0.25) + +/obj/item/mind_engraver_chip/Value(base) + . = ..() + if(istype(stored_data)) + . += stored_data.Value() diff --git a/code/modules/item_worth/worths_list.dm b/code/modules/item_worth/worths_list.dm index 9356d35b90..13da7ef707 100644 --- a/code/modules/item_worth/worths_list.dm +++ b/code/modules/item_worth/worths_list.dm @@ -6,6 +6,7 @@ var/list/worths = list( //ROBOT ASSEMBLIES, /obj/item/device/bot_kit = 300, //REAGENT CONTAINERS, + /obj/item/reagent_containers/hypospray/vial = -500, /obj/item/reagent_containers/hypospray = -90, /obj/item/reagent_containers/spray = -23, /obj/item/reagent_containers/food/snacks/monkeycube = -25, @@ -39,6 +40,7 @@ var/list/worths = list( /obj/item/gun/energy/crossbow/largecrossbow = 8600, /obj/item/gun/energy/crossbow = 5750, /obj/item/gun/energy/temperature = 4000, + /obj/item/gun/energy/plasmacutter = 1750, /obj/item/gun/energy = 2000, //LAUNCHERS, /obj/item/gun/launcher/crossbow = 150, @@ -121,7 +123,6 @@ var/list/worths = list( /obj/item/pickaxe/drill = 500, /obj/item/pickaxe/jackhammer = 3500, /obj/item/pickaxe/gold = 1000, - /obj/item/gun/energy/plasmacutter = 750, /obj/item/pickaxe/diamond = 1500, /obj/item/pickaxe/diamonddrill = 2500, /obj/item/pickaxe = 100, @@ -167,7 +168,8 @@ var/list/worths = list( /obj/item/cell/hyper = 310, /obj/item/cell/infinite = 50000, /obj/item/cell/potato = 1, - /obj/item/cell/slime = 160, + /obj/item/cell/slime = 560, + /obj/item/cell = 50, //SMES COILS, /obj/item/stock_parts/smes_coil/weak = 1000, /obj/item/stock_parts/smes_coil/super_capacity = 5000, @@ -588,11 +590,12 @@ var/list/worths = list( /obj/item/mop/advanced = 250, /obj/item/mop = 25, /obj/item/spellbook = -8000, + /obj/item/mind_engraver_chip = -5000, /obj/item = 5, //STRUCTURES, /obj/structure/dogbed = 15, /obj/structure/ore_box = 12, - /obj/structure/constructshell = 100, + /obj/structure/constructshell = 1000, /obj/structure/cable = 1, /obj/structure/particle_accelerator = 2000, /obj/structure/droppod_door = 65, diff --git a/code/modules/projectiles/guns/magnetic/magnetic_railgun.dm b/code/modules/projectiles/guns/magnetic/magnetic_railgun.dm index a97b3037eb..5635911aef 100644 --- a/code/modules/projectiles/guns/magnetic/magnetic_railgun.dm +++ b/code/modules/projectiles/guns/magnetic/magnetic_railgun.dm @@ -142,7 +142,7 @@ cell = /obj/item/cell/hyper capacitor = /obj/item/stock_parts/capacitor/super - origin_tech = list(TECH_COMBAT = 9, TECH_MATERIAL = 6, TECH_MAGNET = 8, TECH_DOMINION = 5) + origin_tech = list(TECH_COMBAT = 10, TECH_MATERIAL = 6, TECH_MAGNET = 8, TECH_DOMINION = 5) firemodes = list( list(mode_name="semiauto", burst=1, fire_delay=null, one_hand_penalty=2, burst_accuracy=null, dispersion=null), diff --git a/code/modules/trading_stations/_faction.dm b/code/modules/trading_stations/_faction.dm index 2b2bd89325..90425605b6 100644 --- a/code/modules/trading_stations/_faction.dm +++ b/code/modules/trading_stations/_faction.dm @@ -120,6 +120,20 @@ // Misc +/datum/trade_faction/dominion + name = FACTION_TERRAN_DOMINION + desc = "A part of the Terran Dominion, the most powerful human state. Long lost after vanishing from this universe some hundreds of years ago." + relationship = list( + FACTION_INDEPENDENT = FACTION_STATE_WAR, + FACTION_TERRAGOV = FACTION_STATE_WELCOMING, + FACTION_SOL_CENTRAL = FACTION_STATE_WELCOMING, + FACTION_ISC = FACTION_STATE_WELCOMING, + FACTION_NANOTRASEN = FACTION_STATE_RIVAL, + FACTION_CYBERSUN = FACTION_STATE_RIVAL, + FACTION_REBORN_CHRISTIAN_CHURCH = FACTION_STATE_RIVAL, + ) + access_required = access_supplylink_dominion + /datum/trade_faction/obs name = FACTION_TERRASENATE_OBS desc = "A part of the Order of the Black Sun, a xenophobic ultra-nationalist terrorist group." diff --git a/code/modules/trading_stations/trading_station_types/0_always_spawn/atmos.dm b/code/modules/trading_stations/trading_station_types/0_always_spawn/atmos.dm index 5b10a00d75..94580e8098 100644 --- a/code/modules/trading_stations/trading_station_types/0_always_spawn/atmos.dm +++ b/code/modules/trading_stations/trading_station_types/0_always_spawn/atmos.dm @@ -41,4 +41,7 @@ /obj/machinery/portable_atmospherics/canister/tritium = GOODS_DEFAULT, /obj/machinery/portable_atmospherics/canister/deuterium = GOODS_DEFAULT, ), + TRADE_CAT_MACHINES = list( + /obj/machinery/portable_atmospherics/powered/scrubber/huge = GOODS_DEFAULT, + ), ) diff --git a/code/modules/trading_stations/trading_station_types/0_always_spawn/medical.dm b/code/modules/trading_stations/trading_station_types/0_always_spawn/medical.dm index 7d1e0dadc0..a483d11573 100644 --- a/code/modules/trading_stations/trading_station_types/0_always_spawn/medical.dm +++ b/code/modules/trading_stations/trading_station_types/0_always_spawn/medical.dm @@ -17,6 +17,7 @@ /obj/item/storage/firstaid/surgery = GOODS_DEFAULT, /obj/item/clothing/glasses/hud/health = GOODS_DEFAULT, /obj/item/device/scanner/health = GOODS_DEFAULT, + /obj/item/stock_parts/computer/scanner/reagent = GOODS_DEFAULT, /obj/item/autopsy_scanner = GOODS_DEFAULT, /obj/item/storage/box/pillbottles = GOODS_DEFAULT, /obj/item/storage/box/syringes = GOODS_DEFAULT, diff --git a/code/modules/trading_stations/trading_station_types/0_always_spawn/mining.dm b/code/modules/trading_stations/trading_station_types/0_always_spawn/mining.dm new file mode 100644 index 0000000000..b90a13cdec --- /dev/null +++ b/code/modules/trading_stations/trading_station_types/0_always_spawn/mining.dm @@ -0,0 +1,43 @@ +/datum/trading_station/mining + name_pool = list( + "FTB \"Phoron Fever\"" = "Free Trade Beacon \"Phoron Fever\": Grab that drill and get the deal!", + "FTB \"Drills & Ores\"" = "Free Trade Beacon \"Drills & Ores\": Mining equipment for all your dire ore needs.", + ) + uid = "mining" + unlock_favor = 8000 + random_factions = list( + FACTION_INDEPENDENT, + FACTION_NANOTRASEN, + ) + spawn_always = TRUE + markup = 1.2 + inventory = list( + TRADE_CAT_TOOLS = list( + /obj/item/pickaxe = GOODS_DEFAULT, + /obj/item/shovel = GOODS_DEFAULT, + /obj/item/pickaxe/drill = GOODS_DEFAULT, + /obj/item/gun/energy/plasmacutter = GOODS_DEFAULT, + ), + TRADE_CAT_EQUIPMENT = list( + /obj/item/clothing/glasses/material = GOODS_DEFAULT, + /obj/item/clothing/glasses/meson = GOODS_DEFAULT, + /obj/item/storage/ore = GOODS_DEFAULT, + /obj/structure/largecrate = GOODS_DEFAULT, + /obj/item/device/flashlight/lantern = GOODS_DEFAULT, + /obj/item/device/flashlight/lamp/floodlamp = GOODS_DEFAULT, + /obj/item/grenade/light = GOODS_DEFAULT, + /obj/item/device/scanner/mining = GOODS_DEFAULT, + /obj/item/device/scanner/gas = GOODS_DEFAULT, + ), + TRADE_CAT_CLOTHING = list( + /obj/item/clothing/under/rank/miner = GOODS_DEFAULT, + /obj/item/clothing/accessory/storage/brown_vest = GOODS_DEFAULT, + /obj/item/clothing/accessory/storage/webbing = GOODS_DEFAULT, + ), + ) + hidden_inventory = list( + TRADE_CAT_TOOLS = list( + /obj/item/pickaxe/diamonddrill = GOODS_DEFAULT, + /obj/item/pickaxe/jackhammer = GOODS_DEFAULT, + ), + ) diff --git a/code/modules/trading_stations/trading_station_types/0_always_spawn/science.dm b/code/modules/trading_stations/trading_station_types/0_always_spawn/science.dm new file mode 100644 index 0000000000..f0b33f9818 --- /dev/null +++ b/code/modules/trading_stations/trading_station_types/0_always_spawn/science.dm @@ -0,0 +1,29 @@ +/datum/trading_station/science + name_pool = list( + "CTB \"Absotech\"" = "Corporate Trade Beacon \"Absotech\": For when your tech has to be absolute!", + "CTB \"Know-how\"" = "Corporate Trade Beacon \"Know-how\": Learn the secrets of the universe for a small fee!", + ) + uid = "science" + unlock_favor = 10000 + random_factions = list( + FACTION_INDEPENDENT, + FACTION_NANOTRASEN, + FACTION_CYBERSUN, + ) + spawn_always = TRUE + markup = 1.2 + inventory = list( + TRADE_CAT_EQUIPMENT = list( + /obj/item/device/scanner/xenobio = GOODS_DEFAULT, + /obj/item/device/scanner/spectrometer = GOODS_DEFAULT, + /obj/item/portable_destructive_analyzer = GOODS_DEFAULT, + /obj/item/matter_decompiler = GOODS_DEFAULT, + /obj/item/aicard = GOODS_DEFAULT, + /obj/structure/anomaly_container = GOODS_DEFAULT, + ), + ) + hidden_inventory = list( + TRADE_CAT_ARTIFACT = list( + /obj/machinery/artifact = GOODS_DATA("artifact", list(1, 2), 20000) + ), + ) diff --git a/code/modules/trading_stations/trading_station_types/3_very_rare/dominion.dm b/code/modules/trading_stations/trading_station_types/3_very_rare/dominion.dm new file mode 100644 index 0000000000..53bc897645 --- /dev/null +++ b/code/modules/trading_stations/trading_station_types/3_very_rare/dominion.dm @@ -0,0 +1,23 @@ +/datum/trading_station/dominion + name_pool = list( + "TDASRTB-S9-149" = "Terran Dominion Automated Short Range Trade Beacon | Sector 9 | Unit 149.", + ) + uid = "dominion" + unlock_favor = 20000 + faction = FACTION_TERRAN_DOMINION + spawn_probability = 15 + start_hidden = TRUE + markup = 2.0 + inventory = list( + TRADE_CAT_EQUIPMENT = list( + /obj/item/mind_engraver_chip = GOODS_DATA("empty mind engraver chip", list(1, 4), 7000), + /obj/item/mind_engraver_chip/random_languages = GOODS_DATA("language engraver chip", list(1, 2), 15000), + /obj/item/mind_engraver_chip/random_skills = GOODS_DATA("skill engraver chip", list(1, 2), 30000), + ), + ) + // If someone manages to get two millions of disposable income - let them have it + hidden_inventory = list( + TRADE_CAT_WEAPONS = list( + /obj/item/gun/magnetic/railgun/automatic/dominion = GOODS_DATA("ST-410 railgun", list(1, 2), 864000), + ), + ) From e3eb5d43bed6e2cc94764eb8eda741b064136bbb Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Fri, 16 Feb 2024 09:58:39 +0300 Subject: [PATCH 32/49] Fix duplicate access name --- code/game/jobs/access_datum.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/jobs/access_datum.dm b/code/game/jobs/access_datum.dm index 52d6ab480e..0d0b5d73a8 100644 --- a/code/game/jobs/access_datum.dm +++ b/code/game/jobs/access_datum.dm @@ -531,6 +531,6 @@ /var/const/access_supplylink_dominion = "ACCESS_SUPPLY_LINK_TERRAN_DOMINION" /datum/access/supplylink_dominion id = access_supplylink_dominion - desc = "Supply Console - Reborn Christian Church Link" + desc = "Supply Console - Terran Dominion" region = ACCESS_REGION_NONE access_type = ACCESS_TYPE_NONE From 7252a9a7c6cb39d13a3ebe7f263ff41db0a10c13 Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Fri, 16 Feb 2024 10:33:03 +0300 Subject: [PATCH 33/49] Fix --- .../modular_computers/file_system/programs/generic/supply.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/modular_computers/file_system/programs/generic/supply.dm b/code/modules/modular_computers/file_system/programs/generic/supply.dm index 3d649dc8bc..ce80b0c2ee 100644 --- a/code/modules/modular_computers/file_system/programs/generic/supply.dm +++ b/code/modules/modular_computers/file_system/programs/generic/supply.dm @@ -289,7 +289,7 @@ account = A return TRUE - var/acc_num = input("Enter account number", "Account linking", ID.associated_account_number) as num|null + var/acc_num = input("Enter account number", "Account linking", ID?.associated_account_number) as num|null if(!acc_num) return From b71f6cf3eb5b630e05fe69b4fa9297506744ff77 Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Fri, 16 Feb 2024 10:50:30 +0300 Subject: [PATCH 34/49] Some tweaks Organ value depends on species rarity --- code/modules/item_worth/value_procs.dm | 2 ++ code/modules/item_worth/worths_list.dm | 1 + .../file_system/programs/generic/supply.dm | 7 +++---- code/modules/species/mantid/mantid.dm | 4 ++-- code/modules/species/outsider/random.dm | 2 +- code/modules/species/outsider/shadow.dm | 1 + code/modules/species/outsider/starlight.dm | 1 + code/modules/species/outsider/vox.dm | 2 +- code/modules/species/species.dm | 2 +- code/modules/species/station/adherent.dm | 2 +- code/modules/species/station/human_subspecies.dm | 1 + code/modules/species/station/skrell.dm | 1 + code/modules/species/station/unathi.dm | 1 + 13 files changed, 17 insertions(+), 10 deletions(-) diff --git a/code/modules/item_worth/value_procs.dm b/code/modules/item_worth/value_procs.dm index dc965606a8..ea74455107 100644 --- a/code/modules/item_worth/value_procs.dm +++ b/code/modules/item_worth/value_procs.dm @@ -83,6 +83,8 @@ /obj/item/organ/Value(base) . = ..() + if(istype(species)) + . *= species.rarity_value if(damage) . -= round(. * (damage / max_damage)) diff --git a/code/modules/item_worth/worths_list.dm b/code/modules/item_worth/worths_list.dm index 13da7ef707..44a3204453 100644 --- a/code/modules/item_worth/worths_list.dm +++ b/code/modules/item_worth/worths_list.dm @@ -655,6 +655,7 @@ var/list/worths = list( //MOBS, /mob/living/carbon/human = -10000, /mob/living/carbon/slime = 5000, + /mob/living/carbon/brain = 0, /mob/living/silicon/robot = 10000, /mob/living/silicon/pai = 1000, /mob/living/silicon/ai = 50000, diff --git a/code/modules/modular_computers/file_system/programs/generic/supply.dm b/code/modules/modular_computers/file_system/programs/generic/supply.dm index ce80b0c2ee..042950abc6 100644 --- a/code/modules/modular_computers/file_system/programs/generic/supply.dm +++ b/code/modules/modular_computers/file_system/programs/generic/supply.dm @@ -283,13 +283,12 @@ if(!istype(ID)) ID = usr.GetIdCard() // Account security level is 0 - auto-login from the ID + var/autofill = null if(istype(ID) && ID.associated_account_number) var/datum/money_account/A = get_account(ID.associated_account_number) if(istype(A) && A.security_level == 0) - account = A - return TRUE - - var/acc_num = input("Enter account number", "Account linking", ID?.associated_account_number) as num|null + autofill = ID.associated_account_number + var/acc_num = input("Enter account number", "Account linking", autofill) as num|null if(!acc_num) return diff --git a/code/modules/species/mantid/mantid.dm b/code/modules/species/mantid/mantid.dm index 50bfff54ea..6319cc2351 100644 --- a/code/modules/species/mantid/mantid.dm +++ b/code/modules/species/mantid/mantid.dm @@ -38,7 +38,7 @@ min_age = 1 max_age = 20 slowdown = -1 - rarity_value = 3 + rarity_value = 4 gluttonous = 2 body_temperature = null @@ -147,7 +147,7 @@ gluttonous = 3 slowdown = 2 - rarity_value = 10 + rarity_value = 15 min_age = 5 max_age = 500 blood_volume = 1200 diff --git a/code/modules/species/outsider/random.dm b/code/modules/species/outsider/random.dm index 75ac1b1e80..66b4b5a012 100644 --- a/code/modules/species/outsider/random.dm +++ b/code/modules/species/outsider/random.dm @@ -2,7 +2,7 @@ name = SPECIES_ALIEN name_plural = "Humanoids" description = "Some alien humanoid species, unknown to humanity. How exciting." - rarity_value = 5 + rarity_value = 8 species_flags = SPECIES_FLAG_NO_SCAN spawn_flags = SPECIES_IS_RESTRICTED diff --git a/code/modules/species/outsider/shadow.dm b/code/modules/species/outsider/shadow.dm index b395f2aa50..9c63ad828c 100644 --- a/code/modules/species/outsider/shadow.dm +++ b/code/modules/species/outsider/shadow.dm @@ -9,6 +9,7 @@ bone_material = null skin_material = null + rarity_value = 6 unarmed_types = list(/datum/unarmed_attack/claws/strong, /datum/unarmed_attack/bite/sharp) darksight_range = 8 darksight_tint = DARKTINT_GOOD diff --git a/code/modules/species/outsider/starlight.dm b/code/modules/species/outsider/starlight.dm index 8dae5e2cb9..c094ecc24a 100644 --- a/code/modules/species/outsider/starlight.dm +++ b/code/modules/species/outsider/starlight.dm @@ -26,6 +26,7 @@ force_cultural_info = list( TAG_CULTURE = CULTURE_STARLIGHT ) + rarity_value = 8 /datum/species/starlight/handle_death_check(var/mob/living/carbon/human/H) if(H.health == 0) diff --git a/code/modules/species/outsider/vox.dm b/code/modules/species/outsider/vox.dm index d7bf111c2d..2580d56d6d 100644 --- a/code/modules/species/outsider/vox.dm +++ b/code/modules/species/outsider/vox.dm @@ -15,7 +15,7 @@ /datum/unarmed_attack/punch, /datum/unarmed_attack/bite/strong ) - rarity_value = 4 + rarity_value = 7 description = "The Vox are the broken remnants of a once-proud race, now reduced to little more than \ scavenging vermin who prey on isolated stations, ships or planets to keep their own ancient arkships \ alive. They are four to five feet tall, reptillian, beaked, tailed and quilled; human crews often \ diff --git a/code/modules/species/species.dm b/code/modules/species/species.dm index 1e4017081f..c4b06f0254 100644 --- a/code/modules/species/species.dm +++ b/code/modules/species/species.dm @@ -174,7 +174,7 @@ var/holder_type var/gluttonous = 0 // Can eat some mobs. Values can be GLUT_TINY, GLUT_SMALLER, GLUT_ANYTHING, GLUT_ITEM_TINY, GLUT_ITEM_NORMAL, GLUT_ITEM_ANYTHING, GLUT_PROJECTILE_VOMIT var/stomach_capacity = 5 // How much stuff they can stick in their stomach - var/rarity_value = 1 // Relative rarity/collector value for this species. + var/rarity_value = 1 // Relative rarity/collector value for this species. Affects value of the mob and their organs. // Determines the organs that the species spawns with and var/list/has_organ = list( // which required-organ checks are conducted. BP_HEART = /obj/item/organ/internal/heart, diff --git a/code/modules/species/station/adherent.dm b/code/modules/species/station/adherent.dm index 71cb25f2ef..847815bb64 100644 --- a/code/modules/species/station/adherent.dm +++ b/code/modules/species/station/adherent.dm @@ -25,7 +25,7 @@ blood_mask = 'icons/mob/human_races/species/adherent/blood_mask.dmi' siemens_coefficient = 0 - rarity_value = 6 + rarity_value = 4 min_age = 8000 max_age = 12000 antaghud_offset_y = 14 diff --git a/code/modules/species/station/human_subspecies.dm b/code/modules/species/station/human_subspecies.dm index 4d49159df0..46aca5a2cd 100644 --- a/code/modules/species/station/human_subspecies.dm +++ b/code/modules/species/station/human_subspecies.dm @@ -165,6 +165,7 @@ blood_volume = SPECIES_BLOOD_DEFAULT * 0.85 min_age = 18 max_age = 45 + rarity_value = 3 /datum/species/human/mule/handle_post_spawn(var/mob/living/carbon/human/H) if(!H.psi) diff --git a/code/modules/species/station/skrell.dm b/code/modules/species/station/skrell.dm index 801cbda929..d729a48352 100644 --- a/code/modules/species/station/skrell.dm +++ b/code/modules/species/station/skrell.dm @@ -32,6 +32,7 @@ hazard_high_pressure = HAZARD_HIGH_PRESSURE / 0.84615 water_soothe_amount = 5 + rarity_value = 2 body_temperature = null // cold-blooded, implemented the same way nabbers do it darksight_range = 4 diff --git a/code/modules/species/station/unathi.dm b/code/modules/species/station/unathi.dm index dd89117f54..535be0f8f1 100644 --- a/code/modules/species/station/unathi.dm +++ b/code/modules/species/station/unathi.dm @@ -26,6 +26,7 @@ flash_mod = 1.2 blood_volume = 800 + rarity_value = 2 health_hud_intensity = 2 hunger_factor = DEFAULT_HUNGER_FACTOR * 2 From 57c453706827af5c0bb7025371dffa1c20c540c8 Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Fri, 16 Feb 2024 11:42:49 +0300 Subject: [PATCH 35/49] Fix payrolls --- code/modules/economy/Accounts.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/economy/Accounts.dm b/code/modules/economy/Accounts.dm index eecec6ba64..18d20307d4 100644 --- a/code/modules/economy/Accounts.dm +++ b/code/modules/economy/Accounts.dm @@ -47,8 +47,8 @@ var/datum/money_account/A = get_account(text2num(acc_id)) if(!istype(A)) continue - if(!payroll_accounts[A]) - payroll_accounts[A] = 0 + if(!isnum(payroll_accounts[acc_id])) + payroll_accounts[acc_id] = 0 continue var/pay = payroll_accounts[acc_id] if(!pay || pay > money) From 2e7d6b1c08c651a41ac5f48353d5a5c0fdb00ed7 Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Fri, 16 Feb 2024 11:52:43 +0300 Subject: [PATCH 36/49] Engraver uses considerably more power now --- code/game/machinery/mind_engraver.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/game/machinery/mind_engraver.dm b/code/game/machinery/mind_engraver.dm index 89c63367ca..722a886e1c 100644 --- a/code/game/machinery/mind_engraver.dm +++ b/code/game/machinery/mind_engraver.dm @@ -7,6 +7,9 @@ anchored = TRUE construct_state = /decl/machine_construction/default/panel_closed + idle_power_usage = 500 + active_power_usage = 90000 + machine_name = "mind engraver" machine_desc = "Mind Engravers are an ultra-tech device that was used by Terran Dominion during its power peak. \ Allows to imprint knowledge, skills or new memories into the mind of its occupant." @@ -277,6 +280,7 @@ if(!nanochip || !occupant) return FALSE + update_use_power(POWER_USE_ACTIVE) currently_imprinting = TRUE imprint_end = world.time + imprint_time visible_message(SPAN_NOTICE("\The [src] chimes as it begins its operation!")) @@ -285,6 +289,7 @@ /obj/machinery/mind_engraver/proc/StopImprint() currently_imprinting = FALSE + update_use_power(POWER_USE_IDLE) /obj/machinery/mind_engraver/proc/FinishImprint() StopImprint() From cdf58de7401506f23ebedc07478a33158c192654 Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Fri, 16 Feb 2024 11:58:37 +0300 Subject: [PATCH 37/49] Dominion trader price change --- .../trading_station_types/3_very_rare/dominion.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/trading_stations/trading_station_types/3_very_rare/dominion.dm b/code/modules/trading_stations/trading_station_types/3_very_rare/dominion.dm index 53bc897645..0557098e9c 100644 --- a/code/modules/trading_stations/trading_station_types/3_very_rare/dominion.dm +++ b/code/modules/trading_stations/trading_station_types/3_very_rare/dominion.dm @@ -7,17 +7,17 @@ faction = FACTION_TERRAN_DOMINION spawn_probability = 15 start_hidden = TRUE - markup = 2.0 + markup = 2.0 // Note: Markup doesn't apply to goods with custom prices, so keep that in mind inventory = list( TRADE_CAT_EQUIPMENT = list( - /obj/item/mind_engraver_chip = GOODS_DATA("empty mind engraver chip", list(1, 4), 7000), - /obj/item/mind_engraver_chip/random_languages = GOODS_DATA("language engraver chip", list(1, 2), 15000), - /obj/item/mind_engraver_chip/random_skills = GOODS_DATA("skill engraver chip", list(1, 2), 30000), + /obj/item/mind_engraver_chip = GOODS_DATA("empty mind engraver chip", list(1, 2), 15000), + /obj/item/mind_engraver_chip/random_languages = GOODS_DATA("language engraver chip", list(1, 2), 30000), + /obj/item/mind_engraver_chip/random_skills = GOODS_DATA("skill engraver chip", list(1, 2), 60000), ), ) // If someone manages to get two millions of disposable income - let them have it hidden_inventory = list( TRADE_CAT_WEAPONS = list( - /obj/item/gun/magnetic/railgun/automatic/dominion = GOODS_DATA("ST-410 railgun", list(1, 2), 864000), + /obj/item/gun/magnetic/railgun/automatic/dominion = GOODS_DATA("ST-410 railgun", list(1, 2), 1864000), ), ) From 78c90392439fd7533f422fb65a209a46d5335ffc Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Fri, 16 Feb 2024 12:47:14 +0300 Subject: [PATCH 38/49] Tweak --- .../trading_station_types/0_always_spawn/science.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/trading_stations/trading_station_types/0_always_spawn/science.dm b/code/modules/trading_stations/trading_station_types/0_always_spawn/science.dm index f0b33f9818..eddae9a3a8 100644 --- a/code/modules/trading_stations/trading_station_types/0_always_spawn/science.dm +++ b/code/modules/trading_stations/trading_station_types/0_always_spawn/science.dm @@ -4,7 +4,7 @@ "CTB \"Know-how\"" = "Corporate Trade Beacon \"Know-how\": Learn the secrets of the universe for a small fee!", ) uid = "science" - unlock_favor = 10000 + unlock_favor = 5000 random_factions = list( FACTION_INDEPENDENT, FACTION_NANOTRASEN, @@ -17,7 +17,6 @@ /obj/item/device/scanner/xenobio = GOODS_DEFAULT, /obj/item/device/scanner/spectrometer = GOODS_DEFAULT, /obj/item/portable_destructive_analyzer = GOODS_DEFAULT, - /obj/item/matter_decompiler = GOODS_DEFAULT, /obj/item/aicard = GOODS_DEFAULT, /obj/structure/anomaly_container = GOODS_DEFAULT, ), From e0ee2bcc1dd7f74cc6ebcab3d0f5f3cf6dbc6add Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Fri, 16 Feb 2024 13:05:16 +0300 Subject: [PATCH 39/49] Slime extract values --- code/modules/item_worth/value_procs.dm | 8 +- code/modules/item_worth/worths_list.dm | 25 ++- .../mob/living/carbon/xenobiological/items.dm | 160 +++++++++--------- 3 files changed, 110 insertions(+), 83 deletions(-) diff --git a/code/modules/item_worth/value_procs.dm b/code/modules/item_worth/value_procs.dm index ea74455107..dfe4272275 100644 --- a/code/modules/item_worth/value_procs.dm +++ b/code/modules/item_worth/value_procs.dm @@ -19,7 +19,8 @@ return ..() * material.value /obj/item/slime_extract/Value(base) - return base * Uses + . = ..() + . *= Uses /obj/item/ammo_casing/Value(base) . = ..() @@ -130,3 +131,8 @@ . = ..() if(istype(stored_data)) . += stored_data.Value() + +/mob/living/carbon/slime/Value(base) + . = ..() + var/atom/core_type = GetCoreType() + . += get_value(core_type) diff --git a/code/modules/item_worth/worths_list.dm b/code/modules/item_worth/worths_list.dm index 44a3204453..b365ab848f 100644 --- a/code/modules/item_worth/worths_list.dm +++ b/code/modules/item_worth/worths_list.dm @@ -549,7 +549,28 @@ var/list/worths = list( /obj/item/organ/internal = -900, /obj/item/organ = 100, //ITEMS, - /obj/item/slime_extract = 2500, + /obj/item/slime_extract/grey = -1000, + /obj/item/slime_extract/purple = -2000, + /obj/item/slime_extract/metal = -2000, + /obj/item/slime_extract/orange = -2000, + /obj/item/slime_extract/blue = -2000, + /obj/item/slime_extract/darkblue = -4000, + /obj/item/slime_extract/darkpurple = -4000, + /obj/item/slime_extract/yellow = -4000, + /obj/item/slime_extract/silver = -4000, + /obj/item/slime_extract/pink = -8000, + /obj/item/slime_extract/red = -8000, + /obj/item/slime_extract/gold = -8000, + /obj/item/slime_extract/green = -8000, + /obj/item/slime_extract/sepia = -8000, + /obj/item/slime_extract/bluespace = -8000, + /obj/item/slime_extract/cerulean = -8000, + /obj/item/slime_extract/pyrite = -8000, + /obj/item/slime_extract/lightpink = -16000, + /obj/item/slime_extract/oil = -16000, + /obj/item/slime_extract/adamantine = -16000, + /obj/item/slime_extract/black = -16000, + /obj/item/slime_extract = -500, /obj/item/robot_parts/robot_component = 250, /obj/item/robot_parts = 30, /obj/item/modular_computer/tablet = 600, @@ -654,7 +675,7 @@ var/list/worths = list( /mob/living/bot = 300, //MOBS, /mob/living/carbon/human = -10000, - /mob/living/carbon/slime = 5000, + /mob/living/carbon/slime = -2500, /mob/living/carbon/brain = 0, /mob/living/silicon/robot = 10000, /mob/living/silicon/pai = 1000, diff --git a/code/modules/mob/living/carbon/xenobiological/items.dm b/code/modules/mob/living/carbon/xenobiological/items.dm index 1bc2206858..fbec5ced81 100644 --- a/code/modules/mob/living/carbon/xenobiological/items.dm +++ b/code/modules/mob/living/carbon/xenobiological/items.dm @@ -13,18 +13,18 @@ var/enhanced = 0 //has it been enhanced before? atom_flags = ATOM_FLAG_OPEN_CONTAINER - attackby(obj/item/O as obj, mob/user as mob) - if(istype(O, /obj/item/slimesteroid2)) - if(enhanced == 1) - to_chat(user, "<span class='warning'> This extract has already been enhanced!</span>") - return ..() - if(Uses == 0) - to_chat(user, "<span class='warning'> You can't enhance a used extract!</span>") - return ..() - to_chat(user, "You apply the enhancer. It now has triple the amount of uses.") - Uses = 3 - enhanced = 1 - qdel(O) +/obj/item/slime_extract/attackby(obj/item/O, mob/user) + if(istype(O, /obj/item/slimesteroid2)) + if(enhanced == 1) + to_chat(user, "<span class='warning'> This extract has already been enhanced!</span>") + return ..() + if(Uses == 0) + to_chat(user, "<span class='warning'> You can't enhance a used extract!</span>") + return ..() + to_chat(user, "You apply the enhancer. It now has triple the amount of uses.") + Uses = 3 + enhanced = 1 + qdel(O) /obj/item/slime_extract/New() SSstatistics.extracted_slime_cores_amount++ @@ -132,33 +132,33 @@ icon = 'icons/obj/chemical.dmi' icon_state = "bottle19" - attack(mob/living/carbon/slime/M as mob, mob/user as mob) - if(!istype(M, /mob/living/carbon/slime))//If target is not a slime. - to_chat(user, "<span class='warning'> The potion only works on baby slimes!</span>") - return ..() - if(M.is_adult) //Can't tame adults - to_chat(user, "<span class='warning'> Only baby slimes can be tamed!</span>") - return..() - if(M.stat) - to_chat(user, "<span class='warning'> The slime is dead!</span>") - return..() - if(M.mind) - to_chat(user, "<span class='warning'> The slime resists!</span>") - return ..() - var/mob/living/simple_animal/slime/pet = new /mob/living/simple_animal/slime(M.loc) - pet.icon_state = "[M.colour] baby slime" - pet.icon_living = "[M.colour] baby slime" - pet.icon_dead = "[M.colour] baby slime dead" - pet.colour = "[M.colour]" - to_chat(user, "You feed the slime the potion, removing it's powers and calming it.") - qdel(M) - var/newname = sanitize(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text, MAX_NAME_LEN) - - if (!newname) - newname = "pet slime" - pet.SetName(newname) - pet.real_name = newname - qdel(src) +/obj/item/slimepotion/attack(mob/living/carbon/slime/M, mob/user) + if(!istype(M, /mob/living/carbon/slime))//If target is not a slime. + to_chat(user, "<span class='warning'> The potion only works on baby slimes!</span>") + return ..() + if(M.is_adult) //Can't tame adults + to_chat(user, "<span class='warning'> Only baby slimes can be tamed!</span>") + return..() + if(M.stat) + to_chat(user, "<span class='warning'> The slime is dead!</span>") + return..() + if(M.mind) + to_chat(user, "<span class='warning'> The slime resists!</span>") + return ..() + var/mob/living/simple_animal/slime/pet = new /mob/living/simple_animal/slime(M.loc) + pet.icon_state = "[M.colour] baby slime" + pet.icon_living = "[M.colour] baby slime" + pet.icon_dead = "[M.colour] baby slime dead" + pet.colour = "[M.colour]" + to_chat(user, "You feed the slime the potion, removing it's powers and calming it.") + qdel(M) + var/newname = sanitize(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text, MAX_NAME_LEN) + + if (!newname) + newname = "pet slime" + pet.SetName(newname) + pet.real_name = newname + qdel(src) /obj/item/slimepotion2 name = "advanced docility potion" @@ -166,30 +166,30 @@ icon = 'icons/obj/chemical.dmi' icon_state = "bottle19" - attack(mob/living/carbon/slime/M as mob, mob/user as mob) - if(!istype(M, /mob/living/carbon/slime/))//If target is not a slime. - to_chat(user, "<span class='warning'> The potion only works on slimes!</span>") - return ..() - if(M.stat) - to_chat(user, "<span class='warning'> The slime is dead!</span>") - return..() - if(M.mind) - to_chat(user, "<span class='warning'> The slime resists!</span>") - return ..() - var/mob/living/simple_animal/adultslime/pet = new /mob/living/simple_animal/adultslime(M.loc) - pet.icon_state = "[M.colour] adult slime" - pet.icon_living = "[M.colour] adult slime" - pet.icon_dead = "[M.colour] baby slime dead" - pet.colour = "[M.colour]" - to_chat(user, "You feed the slime the potion, removing it's powers and calming it.") - qdel(M) - var/newname = sanitize(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text, MAX_NAME_LEN) - - if (!newname) - newname = "pet slime" - pet.SetName(newname) - pet.real_name = newname - qdel(src) +/obj/item/slimepotion2/attack(mob/living/carbon/slime/M, mob/user) + if(!istype(M, /mob/living/carbon/slime/))//If target is not a slime. + to_chat(user, "<span class='warning'> The potion only works on slimes!</span>") + return ..() + if(M.stat) + to_chat(user, "<span class='warning'> The slime is dead!</span>") + return..() + if(M.mind) + to_chat(user, "<span class='warning'> The slime resists!</span>") + return ..() + var/mob/living/simple_animal/adultslime/pet = new /mob/living/simple_animal/adultslime(M.loc) + pet.icon_state = "[M.colour] adult slime" + pet.icon_living = "[M.colour] adult slime" + pet.icon_dead = "[M.colour] baby slime dead" + pet.colour = "[M.colour]" + to_chat(user, "You feed the slime the potion, removing it's powers and calming it.") + qdel(M) + var/newname = sanitize(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text, MAX_NAME_LEN) + + if (!newname) + newname = "pet slime" + pet.SetName(newname) + pet.real_name = newname + qdel(src) /obj/item/slimesteroid @@ -198,23 +198,23 @@ icon = 'icons/obj/chemical.dmi' icon_state = "bottle16" - attack(mob/living/carbon/slime/M as mob, mob/user as mob) - if(!istype(M, /mob/living/carbon/slime))//If target is not a slime. - to_chat(user, "<span class='warning'> The steroid only works on baby slimes!</span>") - return ..() - if(M.is_adult) //Can't tame adults - to_chat(user, "<span class='warning'> Only baby slimes can use the steroid!</span>") - return..() - if(M.stat) - to_chat(user, "<span class='warning'> The slime is dead!</span>") - return..() - if(M.cores == 3) - to_chat(user, "<span class='warning'> The slime already has the maximum amount of extract!</span>") - return..() - - to_chat(user, "You feed the slime the steroid. It now has triple the amount of extract.") - M.cores = 3 - qdel(src) +/obj/item/slimesteroid/attack(mob/living/carbon/slime/M, mob/user) + if(!istype(M, /mob/living/carbon/slime))//If target is not a slime. + to_chat(user, "<span class='warning'> The steroid only works on baby slimes!</span>") + return ..() + if(M.is_adult) //Can't tame adults + to_chat(user, "<span class='warning'> Only baby slimes can use the steroid!</span>") + return..() + if(M.stat) + to_chat(user, "<span class='warning'> The slime is dead!</span>") + return..() + if(M.cores == 3) + to_chat(user, "<span class='warning'> The slime already has the maximum amount of extract!</span>") + return..() + + to_chat(user, "You feed the slime the steroid. It now has triple the amount of extract.") + M.cores = 3 + qdel(src) /obj/item/slimesteroid2 name = "extract enhancer" From f5d6622c2a9503dac454cab6158dac4d5270b7d4 Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Fri, 16 Feb 2024 13:52:01 +0300 Subject: [PATCH 40/49] Adds more exempt types --- code/controllers/subsystems/supply.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/controllers/subsystems/supply.dm b/code/controllers/subsystems/supply.dm index 4ff3683584..da0e37df9d 100644 --- a/code/controllers/subsystems/supply.dm +++ b/code/controllers/subsystems/supply.dm @@ -42,8 +42,14 @@ SUBSYSTEM_DEF(supply) var/list/export_counter = list() /// Paths of atoms that are entirely unaffected by export price modifiers var/list/export_modifier_exempt_types = list( + /obj/item/ore, /obj/item/stack, /obj/item/reagent_containers, + /obj/item/slime_extract, + /obj/item/ammo_casing, + /obj/machinery/artifact, + /obj/machinery/portable_atmospherics/canister, + /mob/living/carbon/slime, ) /datum/controller/subsystem/supply/Initialize() From e2a28732ec55c8cb764004b41b1f5b082c4e0829 Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Fri, 16 Feb 2024 14:17:10 +0300 Subject: [PATCH 41/49] External organs cost scales --- code/modules/item_worth/worths_list.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/item_worth/worths_list.dm b/code/modules/item_worth/worths_list.dm index b365ab848f..ef4f432837 100644 --- a/code/modules/item_worth/worths_list.dm +++ b/code/modules/item_worth/worths_list.dm @@ -547,7 +547,7 @@ var/list/worths = list( /obj/item/organ/internal/heart = -2400, /obj/item/organ/internal/brain = -14000, /obj/item/organ/internal = -900, - /obj/item/organ = 100, + /obj/item/organ = -100, //ITEMS, /obj/item/slime_extract/grey = -1000, /obj/item/slime_extract/purple = -2000, From 198116ff3cb24e824d8fcd77a4aa075f9907018f Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Fri, 16 Feb 2024 14:19:13 +0300 Subject: [PATCH 42/49] Seeds price fix --- code/modules/item_worth/worths_list.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/item_worth/worths_list.dm b/code/modules/item_worth/worths_list.dm index ef4f432837..b3d10681e0 100644 --- a/code/modules/item_worth/worths_list.dm +++ b/code/modules/item_worth/worths_list.dm @@ -601,7 +601,7 @@ var/list/worths = list( /obj/item/rig_module/fabricator/energy_net = 1200, /obj/item/rig_module/fabricator = 2800, /obj/item/rig_module = 1000, - /obj/item/seeds = 10, + /obj/item/seeds = -10, /obj/item/bee_smoker = 60, /obj/item/honey_frame = 15, /obj/item/beehive_assembly = 100, From 4c4ad12419f4edc973bd518fb7bd6647a9b845e5 Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Fri, 16 Feb 2024 14:50:38 +0300 Subject: [PATCH 43/49] Auto-login at 0 security level --- .../file_system/programs/generic/supply.dm | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/code/modules/modular_computers/file_system/programs/generic/supply.dm b/code/modules/modular_computers/file_system/programs/generic/supply.dm index 042950abc6..777ea885d2 100644 --- a/code/modules/modular_computers/file_system/programs/generic/supply.dm +++ b/code/modules/modular_computers/file_system/programs/generic/supply.dm @@ -292,12 +292,18 @@ if(!acc_num) return + // 0 sec level - auto login + var/datum/money_account/A = attempt_account_access(acc_num) + if(istype(A)) + account = A + return TRUE + var/acc_pin = input("Enter PIN", "Account linking") as num|null if(!acc_pin) return var/card_check = ID.associated_account_number == acc_num - var/datum/money_account/A = attempt_account_access(acc_num, acc_pin, card_check ? 2 : 1, TRUE) + A = attempt_account_access(acc_num, acc_pin, card_check ? 2 : 1, TRUE) if(!A) to_chat(usr, SPAN_WARNING("Unable to link account: access denied.")) return From bc68f1e315f76c16914e43f681f67fae8dc6527e Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Fri, 16 Feb 2024 15:10:22 +0300 Subject: [PATCH 44/49] Dressup can be used on clientless mobs and ghosts --- code/modules/admin/admin_verbs.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 593e306d6c..7ec2e582f9 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -949,7 +949,7 @@ var/list/admin_verbs_mentors = list( log_and_message_admins("gave [key_name(T)] the spell [S].") // Right click panel -/datum/admins/proc/DressUpMob(mob/M as mob in GLOB.player_list) +/datum/admins/proc/DressUpMob(mob/M as mob in GLOB.ghost_mob_list + GLOB.human_mob_list) set category = null set name = "Dressup" set desc = "Changes outfit of a target mob. If it is a ghost - spawns their character first." From 3d90fad1aef6227a13650cf737b4081273245cc1 Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Fri, 16 Feb 2024 15:22:49 +0300 Subject: [PATCH 45/49] Organ price tweaks --- code/modules/item_worth/worths_list.dm | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/code/modules/item_worth/worths_list.dm b/code/modules/item_worth/worths_list.dm index b3d10681e0..13147340bf 100644 --- a/code/modules/item_worth/worths_list.dm +++ b/code/modules/item_worth/worths_list.dm @@ -531,21 +531,20 @@ var/list/worths = list( /obj/item/device/eftpos = 30, /obj/item/device = 90, //ORGANS, - /obj/item/organ/internal/brain/adherent = -10000, /obj/item/organ/internal/powered = -2000, - /obj/item/organ/internal/larva_producer = -14000, - /obj/item/organ/internal/heart/abomination = -9000, + /obj/item/organ/internal/larva_producer = -8000, + /obj/item/organ/internal/heart/abomination = -6000, /obj/item/organ/internal/posibrain = -2000, /obj/item/organ/internal/voicebox = -1200, /obj/item/organ/internal/eyes/insectoid = -1800, /obj/item/organ/internal/phoron = -2200, /obj/item/organ/internal/acetone = -1900, /obj/item/organ/internal/lungs/insectoid = -1200, - /obj/item/organ/internal/brain/starlight = -19000, - /obj/item/organ/internal/stomach/vox = -4900, - /obj/item/organ/internal/voxstack = -28000, + /obj/item/organ/internal/brain/starlight = -10000, + /obj/item/organ/internal/stomach/vox = -2900, + /obj/item/organ/internal/voxstack = -18000, /obj/item/organ/internal/heart = -2400, - /obj/item/organ/internal/brain = -14000, + /obj/item/organ/internal/brain = -8000, /obj/item/organ/internal = -900, /obj/item/organ = -100, //ITEMS, From 1ed3659bd70d6a5761c8c5914003d8146a80e89f Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Sat, 17 Feb 2024 12:09:54 +0300 Subject: [PATCH 46/49] Trading beacon circuits & designs --- baystation12.dme | 1 + .../circuitboards/machinery/trade_beacon.dm | 2 +- .../modules/research/designs/designs_circuits.dm | 16 +++++++++++++++- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/baystation12.dme b/baystation12.dme index 87845e536e..fbc79fe18c 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1112,6 +1112,7 @@ #include "code\game\objects\items\weapons\circuitboards\machinery\shieldgen.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\telecomms.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\teleporter.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\trade_beacon.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\unary_atmos.dm" #include "code\game\objects\items\weapons\grenades\anti_photon_grenade.dm" #include "code\game\objects\items\weapons\grenades\chem_grenade.dm" diff --git a/code/game/objects/items/weapons/circuitboards/machinery/trade_beacon.dm b/code/game/objects/items/weapons/circuitboards/machinery/trade_beacon.dm index 174269a4df..161a8f29c1 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/trade_beacon.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/trade_beacon.dm @@ -1,5 +1,5 @@ /obj/item/stock_parts/circuitboard/trade_beacon - origin_tech = list(TECH_BLUESPACE = 2) + origin_tech = list(TECH_BLUESPACE = 4) board_type = "machine" req_components = list( /obj/item/stock_parts/capacitor = 3, diff --git a/code/modules/research/designs/designs_circuits.dm b/code/modules/research/designs/designs_circuits.dm index e5e1a05b95..74647b16b9 100644 --- a/code/modules/research/designs/designs_circuits.dm +++ b/code/modules/research/designs/designs_circuits.dm @@ -728,13 +728,27 @@ build_path = /obj/item/stock_parts/circuitboard/bluespacerelay sort_string = "PAAAH" +/datum/design/circuit/trade_beacon_receiving + name = "receiving trade beacon" + id = "trade_receiving" + req_tech = list(TECH_DATA = 4, TECH_BLUESPACE = 4) + build_path = /obj/item/stock_parts/circuitboard/trade_beacon/receiving + sort_string = "QAAAA" + +/datum/design/circuit/trade_beacon_sending + name = "sending trade beacon" + id = "trade_sending" + req_tech = list(TECH_DATA = 4, TECH_BLUESPACE = 4) + build_path = /obj/item/stock_parts/circuitboard/trade_beacon/sending + sort_string = "QAAAB" + /datum/design/circuit/shield_generator name = "Shield Generator" desc = "Allows for the construction of a shield generator circuit board." id = "shield_generator" req_tech = list(TECH_MAGNET = 3, TECH_POWER = 4) build_path = /obj/item/stock_parts/circuitboard/shield_generator - sort_string = "VAAAC" + sort_string = "VAAAA" /datum/design/circuit/shield_diffuser name = "Shield Diffuser" From 869291fba909ffa28dd98f74b76500ac39a788c4 Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Sat, 17 Feb 2024 18:48:00 +0300 Subject: [PATCH 47/49] Construct states for trade beacons --- code/game/machinery/trade_beacon.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/machinery/trade_beacon.dm b/code/game/machinery/trade_beacon.dm index 5b1f216b9f..a25959eb1d 100644 --- a/code/game/machinery/trade_beacon.dm +++ b/code/game/machinery/trade_beacon.dm @@ -32,6 +32,7 @@ /obj/machinery/trade_beacon/sending name = "sending trade beacon" icon_state = "beacon_sending" + construct_state = /decl/machine_construction/default/panel_closed var/export_cooldown var/export_cooldown_time = 90 SECONDS @@ -69,6 +70,7 @@ /* Receiving */ /obj/machinery/trade_beacon/receiving name = "receiving trade beacon" + construct_state = /decl/machine_construction/default/panel_closed /obj/machinery/trade_beacon/receiving/Initialize() . = ..() From 7bfec9befb9d480ba9b63205f3d9a18e2190e483 Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Sun, 18 Feb 2024 00:26:46 +0300 Subject: [PATCH 48/49] Fix spellbook value --- code/modules/item_worth/value_procs.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/item_worth/value_procs.dm b/code/modules/item_worth/value_procs.dm index dfe4272275..9cd23a7737 100644 --- a/code/modules/item_worth/value_procs.dm +++ b/code/modules/item_worth/value_procs.dm @@ -91,7 +91,7 @@ /obj/item/spellbook/Value(base) . = ..() - . += length(allowed_spells * 1000) + . += length(allowed_spells) * 1000 if(!isnull(owner)) . *= 0.5 From 9a6af068870814a6ff4fdab1de942158efbe7d69 Mon Sep 17 00:00:00 2001 From: EgorDinamit <egorayn2003@gmail.com> Date: Sun, 18 Feb 2024 20:43:00 +0300 Subject: [PATCH 49/49] Rockets have higher weight --- code/modules/projectiles/ammunition/bullets.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/projectiles/ammunition/bullets.dm b/code/modules/projectiles/ammunition/bullets.dm index 57b74e7f9d..7d5e7a9b72 100644 --- a/code/modules/projectiles/ammunition/bullets.dm +++ b/code/modules/projectiles/ammunition/bullets.dm @@ -274,6 +274,7 @@ name = "rocket shell" desc = "An explosive designed to be fired from a launcher." icon_state = "shell_he" + w_class = ITEM_SIZE_NORMAL projectile_type = /obj/item/projectile/bullet/rocket caliber = CALIBER_ROCKET fall_sounds = list()