From 23e7de72af90b1ee50b75a0f8a634c58af83f067 Mon Sep 17 00:00:00 2001 From: EgorDinamit 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 ? "Cart" :"Cart" dat += " | " + dat += trade_screen == LOG_SCREEN ? "Logs" :"Logs" dat += "Exit" dat += "
" @@ -754,9 +758,12 @@ if(!sending) dat += "Sending beacon is missing!" else - dat += "Update" + dat += "Update " dat += "Export" dat += "
" + if(sending.export_cooldown > world.time) + dat += "Export cooldown: [round(sending.export_cooldown - world.time) / 1 SECONDS] seconds" + dat += "
" 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])
" total_cost += cost if(total_cost) dat += "Total export cost: [total_cost] [GLOB.using_map.local_currency_name_short]" else - dat += "There is no items within sending beacon's range!" + dat += "There is no items for export within sending beacon's range!" if(trade_screen == CART_SCREEN) dat += "Purchase | " @@ -794,6 +803,34 @@ dat += "
" dat += "
" + if(trade_screen == LOG_SCREEN) + dat += trade_screen == LOG_SHIPPING ? "Shipping" :"Shipping" + dat += " | " + dat += trade_screen == LOG_EXPORT ? "Export" :"Export" + + dat += "
" + + 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"]]
" + dat += "Account: [log["ordering_acct"]]
" + dat += "Link: [log["assoc_faction"]]
" + dat += "Total invoice: [log["total_paid"]] [GLOB.using_map.local_currency_name_short]
" + dat += "Articles bought: [log["contents"]]
" + dat += "Print" + dat += "
" + if(LOG_EXPORT) + for(var/log in reverseRange(SSsupply.export_log)) + dat += "Time: [log["time"]]
" + dat += "Account: [log["ordering_acct"]]
" + dat += "Link: [log["assoc_faction"]]
" + dat += "Total invoice: [log["total_paid"]] [GLOB.using_map.local_currency_name_short]
" + dat += "Articles sold: [log["contents"]]
" + dat += "Print" + dat += "
" + 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 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 ? "Cart" :"Cart" dat += " | " dat += trade_screen == LOG_SCREEN ? "Logs" :"Logs" + dat += " | " dat += "Exit" dat += "
" @@ -804,9 +805,9 @@ dat += "
" if(trade_screen == LOG_SCREEN) - dat += trade_screen == LOG_SHIPPING ? "Shipping" :"Shipping" + dat += log_screen == LOG_SHIPPING ? "Shipping" :"Shipping" dat += " | " - dat += trade_screen == LOG_EXPORT ? "Export" :"Export" + dat += log_screen == LOG_EXPORT ? "Export" :"Export" dat += "
" From 2531e4c1f612e7859e7a98cdf48689f104050396 Mon Sep 17 00:00:00 2001 From: EgorDinamit 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"]]
" dat += "Account: [log["ordering_acct"]]
" dat += "Link: [log["assoc_faction"]]
" @@ -823,7 +822,7 @@ dat += "Print" dat += "
" if(LOG_EXPORT) - for(var/log in reverseRange(SSsupply.export_log)) + for(var/list/log in reverseRange(SSsupply.export_log)) dat += "Time: [log["time"]]
" dat += "Account: [log["ordering_acct"]]
" dat += "Link: [log["assoc_faction"]]
" From 5ef58eb76e543772bf70c8229d08191ed42eed83 Mon Sep 17 00:00:00 2001 From: EgorDinamit 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 += "Export" dat += "
" if(sending.export_cooldown > world.time) - dat += "Export cooldown: [round(sending.export_cooldown - world.time) / 1 SECONDS] seconds" + dat += "Export cooldown: [round((sending.export_cooldown - world.time) / 10)] seconds" dat += "
" var/total_cost = 0 for(var/atom/movable/AM in sending.GetObjects()) From 179a27563c72a579ba656a64fc351e1fa1826555 Mon Sep 17 00:00:00 2001 From: EgorDinamit 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 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 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 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"]]
" dat += "Account: [log["ordering_acct"]]
" dat += "Link: [log["assoc_faction"]]
" @@ -822,7 +822,7 @@ dat += "Print" dat += "
" 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"]]
" dat += "Account: [log["ordering_acct"]]
" dat += "Link: [log["assoc_faction"]]
" From 20b9bfcde35705979e7f16ea2e9f4d129fa56423 Mon Sep 17 00:00:00 2001 From: EgorDinamit 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"]]
" dat += "Account: [log["ordering_acct"]]
" dat += "Link: [log["assoc_faction"]]
" @@ -822,7 +823,8 @@ dat += "Print" dat += "
" 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"]]
" dat += "Account: [log["ordering_acct"]]
" dat += "Link: [log["assoc_faction"]]
" From 8882b215d56dc02cc9c20c0057a57b8c596d65e0 Mon Sep 17 00:00:00 2001 From: EgorDinamit 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 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]
" + dat += "Balance: [account.get_balance()]
" dat += "Unlink

" else dat += "Link Account

" From a18a0e23d66281e22cbd6684ba7e7a005d92c860 Mon Sep 17 00:00:00 2001 From: EgorDinamit 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 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 [overmap_object.name] 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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 fxH>80llKKpr}Gg*6k+W`;!)tbZRIy!Bq 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

v*!GR&sY|gYu0oN*RPA!<)$_HO&2t7dC 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 literal 0 HcmV?d00001 From 57c8c06e2aedd7c2adeb98530e0712c074dd1bf5 Mon Sep 17 00:00:00 2001 From: EgorDinamit 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 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, "[line]") \ No newline at end of file + to_chat(user, "[line]") + +/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 = "O2" symbol = "O2" + value = 4 /decl/xgm_gas/nitrogen @@ -16,6 +17,7 @@ molar_mass = 0.028 // kg/mol symbol_html = "N2" symbol = "N2" + value = 2 /decl/xgm_gas/carbon_dioxide id = GAS_CO2 @@ -24,6 +26,7 @@ molar_mass = 0.044 // kg/mol symbol_html = "CO2" 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 = "CH3Br" 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 = "N2O" symbol = "N2O" + value = 3 /decl/xgm_gas/methane id = GAS_METHANE @@ -72,6 +78,7 @@ flags = XGM_GAS_FUEL symbol_html = "CH4" 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 = "H2" 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 = "H2O" symbol = "H2O" + value = 1 /decl/xgm_gas/sulfurdioxide id = GAS_SULFUR @@ -220,6 +239,7 @@ molar_mass = 0.044 // kg/mol symbol_html = "SO2" symbol = "SO2" + value = 12 /decl/xgm_gas/ammonia id = GAS_AMMONIA @@ -230,6 +250,7 @@ breathed_product = /datum/reagent/ammonia symbol_html = "NH3" 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 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 += "

  • [item.name]
  • " 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])
    " + 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 += " ([percent_diff]%)" + else if(cost > normal_cost) + var/percent_diff = round(cost / normal_cost, 0.01) * 100 + dat += " ([percent_diff]%)" + dat += "
    " total_cost += cost if(total_cost) dat += "Total export cost: [total_cost] [GLOB.using_map.local_currency_name_short]" From 10e41be5eee41ab0cf78dec0fdb07d6f405d59a2 Mon Sep 17 00:00:00 2001 From: EgorDinamit 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 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 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 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 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 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, "[line]") - -/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 = "O2" symbol = "O2" - value = 4 + value = 3 /decl/xgm_gas/nitrogen @@ -17,7 +17,7 @@ molar_mass = 0.028 // kg/mol symbol_html = "N2" 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 = "CO2" 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 = "CH3Br" 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 = "N2O" symbol = "N2O" - value = 3 + value = 2 /decl/xgm_gas/methane id = GAS_METHANE @@ -78,7 +78,7 @@ flags = XGM_GAS_FUEL symbol_html = "CH4" symbol = "CH4" - value = 3 + value = 2 /decl/xgm_gas/alium id = GAS_ALIEN @@ -117,21 +117,21 @@ burn_product = GAS_STEAM symbol_html = "H2" 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 = "NO2" 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 = "SO2" 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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 literal 24777 zcmbTebx<8m)IK;!@B|MQJV6sAxVr>Nf@^Sh_X`AfLV)1G-GjRY_u%gCaIuT+@P5Co z`f97Twrc-K-I-x#&UBydr=Rnj(+U0hS?VPkF&Y2>FF#3(D*^zVF!+xG1qr;;ZB%p$ zp5%Hct2>DsI~qEe+c}xr+5muCYVI!~+fEj&?ww5~^@^Wp(z!D6f0Q%A;PQ^+4avDX zYqG0i=^mh@KZVUdLB1M)%31Mr^?ppC_ta>!aj~jd`pc2QSfWql>6O^4pd?+c-t*7+ z4L#kf0ax-7N6hzzxE=Ba6QADn!;=oqQbk?$31xV;{r$ymCDOG`J^L~0t=aOQhz}-e z=~dW%7_Y1PhT;6w%NWuAcC$)T_Vv6dL=Ytj7(kOHJ(jhLoyEaG#hWI?TBb6l_~gdf zfBlYI3&Db{6{9Q^ zr6%CtYjm-C36Ik>mv{_zfo>5|v-!)rx#Mf2X?GhVvJv}Ld^;afZ{l0z+at=7si(^u z#$$S|6V>Mq)#aTUeY=vi+64dq~m4%*@C1o7WK&X`{F`Otm7KL;q zl^NEHPjoVf<|0&t?h=S=m)-E3KN!$ZP{^fYGAKg+1psI`GIXdPTEt*Kb++#eU1-=A zxcE{;M@|~A228ex7Mu9^t_AZ2q@1n}HLy?+MYY5i7nyy9DX@~!4SW&dGlxYneh5=k zYlOhzpagKDvkJq1A2Y#T1jK@(&v9U>9|G4XDMzd|+DgR)pYkzdzIN$x_sqZvugy8q z{zK%cBu2v6@gaH=aJ`CQz1-CG76Lv2cE=_5mzo8wdks~lRVj*fxx(P1xFQ%|ZM;c0 zpOE0{(WsL%7VmS=QmP`1{Zg5ITmje3l-T5b8Z$W9G0+Ss18#_b^`7M0^rwmN4i&wq z+ZX-hT3bGRgxS19tZfv5!OE-*c<_PDPpY>o$H0AZmdxZL>NfTtqlOMYZrd_PFAB&w0d`4*7{Ra`@1udooq)B=3-|H>FAVQBCG zdXGmq9rAXITIlqH8YytVud=X%@8inbCgVOniPZI|L4kn^0-jfhfb`oUA)lm($9vnQ z#&`9o#0M~3gtygh^}3JUD!Igi-un6og}I1^VQh$OB4xK9nrJ7~ud0}E++<2vj?>?C z$o;VNR`DdTd~bO+Pf+0$pLJ8k>X$?@bB}|I%kk?a3W~2dRmY0Y(}zS<;tN=+E#YT_`? zdNtipGM1B<*EursdFPL)VadT4j2~kRrva!soK=V!E!g*U$ufVlCBH&29a%+}=Eut= zWNG`(QqdOilu3QFX@_9V7{Z>k(!-Z4zSV9bTOZ!PU)|nDdcO4ebJVIrM&Zxd&M?G>gDGh|1Kd{OI$74)KUS%ZKD1|fuap`q`e z#t0+pT$ZM?Sa3{Gq!UtPs<1ZK1HdVFY8xcMo>wQHF!8KjznDC(aKrfrlvW)q=GARTzoK?E26At3I1k-Oo3dL|h%0A55)# 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 From 2f8ce52c77bf1ac7aa68af6bc87da2f3957b568b Mon Sep 17 00:00:00 2001 From: EgorDinamit 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 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 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 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 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 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:
    " t += "
    " t += "" + if(PAYROLLS) + t += "Accounts on payroll:" + 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]: [paycheck]
    " + t += "
    " + t += "Add new account" else t += "Account balance: [GLOB.using_map.local_currency_name_short][authenticated_account.money]" t += "
    " @@ -194,6 +206,7 @@ t += "Change account security level
    " t += "Make transfer
    " t += "View transaction log
    " + t += "Setup payrolls
    " t += "Print balance statement
    " //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 += "Link Faction

    " if(account) - dat += "Current Account: [account.owner_name]
    " + dat += "Current Account: [account.owner_name][account.suspended ? " \[SUSPENDED\]" : ""]
    " dat += "Balance: [account.get_balance()]
    " dat += "Unlink

    " else From edb7bcb74ce7d0712015313ddb2f88f3151ac031 Mon Sep 17 00:00:00 2001 From: EgorDinamit 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 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 += "
    " t += "" if(PAYROLLS) - t += "Accounts on payroll:" + t += "Accounts on payroll:
    " 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]: [paycheck]
    " t += "
    " - t += "Add new account" + t += "Add new account
    " else t += "Account balance: [GLOB.using_map.local_currency_name_short][authenticated_account.money]" t += "
    " @@ -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 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 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 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 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 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 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 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 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 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, " This extract has already been enhanced!") - return ..() - if(Uses == 0) - to_chat(user, " You can't enhance a used extract!") - 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, " This extract has already been enhanced!") + return ..() + if(Uses == 0) + to_chat(user, " You can't enhance a used extract!") + 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, " The potion only works on baby slimes!") - return ..() - if(M.is_adult) //Can't tame adults - to_chat(user, " Only baby slimes can be tamed!") - return..() - if(M.stat) - to_chat(user, " The slime is dead!") - return..() - if(M.mind) - to_chat(user, " The slime resists!") - 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, " The potion only works on baby slimes!") + return ..() + if(M.is_adult) //Can't tame adults + to_chat(user, " Only baby slimes can be tamed!") + return..() + if(M.stat) + to_chat(user, " The slime is dead!") + return..() + if(M.mind) + to_chat(user, " The slime resists!") + 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, " The potion only works on slimes!") - return ..() - if(M.stat) - to_chat(user, " The slime is dead!") - return..() - if(M.mind) - to_chat(user, " The slime resists!") - 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, " The potion only works on slimes!") + return ..() + if(M.stat) + to_chat(user, " The slime is dead!") + return..() + if(M.mind) + to_chat(user, " The slime resists!") + 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, " The steroid only works on baby slimes!") - return ..() - if(M.is_adult) //Can't tame adults - to_chat(user, " Only baby slimes can use the steroid!") - return..() - if(M.stat) - to_chat(user, " The slime is dead!") - return..() - if(M.cores == 3) - to_chat(user, " The slime already has the maximum amount of extract!") - 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, " The steroid only works on baby slimes!") + return ..() + if(M.is_adult) //Can't tame adults + to_chat(user, " Only baby slimes can use the steroid!") + return..() + if(M.stat) + to_chat(user, " The slime is dead!") + return..() + if(M.cores == 3) + to_chat(user, " The slime already has the maximum amount of extract!") + 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 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 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 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 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 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 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 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 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 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 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()