diff --git a/baystation12.dme b/baystation12.dme index 337852f8f4554..724b96bdbab78 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -2640,6 +2640,7 @@ #include "code\modules\overmap\overmap_shuttle.dm" #include "code\modules\overmap\sectors.dm" #include "code\modules\overmap\spacetravel.dm" +#include "code\modules\overmap\trading_locations.dm" #include "code\modules\overmap\contacts\_contacts.dm" #include "code\modules\overmap\contacts\contact_sensors.dm" #include "code\modules\overmap\contacts\tracker.dm" diff --git a/code/controllers/subsystems/misc.dm b/code/controllers/subsystems/misc.dm index 0c81cd1117560..5117cf6b29e72 100644 --- a/code/controllers/subsystems/misc.dm +++ b/code/controllers/subsystems/misc.dm @@ -56,8 +56,8 @@ SUBSYSTEM_DEF(misc) GLOBAL_LIST_EMPTY(traders) GLOBAL_LIST_EMPTY(trader_types) -GLOBAL_VAR_INIT(trader_max, 10) -GLOBAL_VAR_INIT(trader_station_count, 3) +GLOBAL_VAR_INIT(trader_max, 5) +GLOBAL_VAR_INIT(trader_station_count, 2) GLOBAL_VAR_INIT(trader_unique_chance, 5) GLOBAL_LIST_INIT(trader_stations, subtypesof(/datum/trader) - typesof(/datum/trader/ship)) GLOBAL_LIST_INIT(trader_ships, subtypesof(/datum/trader/ship) - typesof(/datum/trader/ship/unique)) @@ -65,44 +65,47 @@ GLOBAL_LIST_INIT(trader_uniques, subtypesof(/datum/trader/ship/unique)) /datum/controller/subsystem/misc/proc/UpdateTraders(resumed, no_mc_tick, generate_stations = 0) - if (!resumed) + if(!resumed) queue = GLOB.trader_types.Copy() var/count = length(queue) var/max = GLOB.trader_max var/trader_type var/datum/trader/trader - if (count < max && prob(100 - 50 * count / max)) + if(count < max && prob(100 - 50 * count / max)) var/list/candidates - if (generate_stations) + if(generate_stations) candidates = GLOB.trader_stations.Copy() - GLOB.trader_types - else if (prob(GLOB.trader_unique_chance)) + else if(prob(GLOB.trader_unique_chance)) candidates = GLOB.trader_uniques.Copy() - GLOB.trader_types else candidates = GLOB.trader_ships.Copy() - GLOB.trader_types - if (length(candidates)) - for (var/i = (generate_stations || 1) to 1 step -1) + if(length(candidates)) + for(var/i = (generate_stations || 1) to 1 step -1) + if(!GLOB.using_map || length(GLOB.trader_types) >= GLOB.using_map.num_traders) + break trader_type = pick(candidates) candidates -= trader_type GLOB.trader_types += trader_type GLOB.traders[trader_type] = new trader_type - if (generate_stations) + if(generate_stations) CHECK_TICK - else if (MC_TICK_CHECK) + else if(MC_TICK_CHECK) return - for (var/i = count to 1 step -1) + for(var/i = count to 1 step -1) trader_type = queue[i] trader = GLOB.traders[trader_type] - if (QDELETED(trader)) + if(QDELETED(trader)) GLOB.trader_types -= trader_type GLOB.traders[trader_type] = null continue - if (!trader.tick()) + if(!trader.tick()) GLOB.trader_types -= trader_type GLOB.traders[trader_type] = null + trader.leave_map() qdel(trader) - if (no_mc_tick) + if(no_mc_tick) CHECK_TICK - else if (MC_TICK_CHECK) + else if(MC_TICK_CHECK) queue.Cut(i) return diff --git a/code/datums/trading/ai.dm b/code/datums/trading/ai.dm index 940eaccee075a..384c3808f681f 100644 --- a/code/datums/trading/ai.dm +++ b/code/datums/trading/ai.dm @@ -7,39 +7,39 @@ They sell generic supplies and ask for generic supplies. */ /datum/trader/trading_beacon - name = "AI" - origin = "Trading Beacon" + name = "Омега" + origin = "Торговый Маяк" name_language = LANGUAGE_EAL - trade_flags = TRADER_MONEY|TRADER_GOODS - speech = list(TRADER_HAIL_GENERIC = "Greetings, I am MERCHANT, Artifical Intelligence onboard ORIGIN, tasked with trading goods in return for CURRENCY and supplies.", - TRADER_HAIL_DENY = "We are sorry, your connection has been blacklisted. Have a nice day.", + trade_flags = TRADER_MONEY|TRADER_GOODS|TRADER_WANTED_ONLY + speech = list(TRADER_HAIL_GENERIC = "Приветствую, Я MERCHANT, ИскИн на борту ORIGIN, основной задачей которого является покупка и продажа вещей за CURRENCY и другие припасы.", + TRADER_HAIL_DENY = "Приношу свои извинения, ваша линия была добавлена в чёрный список. Хорошего дня.", - TRADER_TRADE_COMPLETE = "Thank you for your patronage.", - TRADER_NOT_ENOUGH = "I'm sorry, your offer is not worth what you are asking for.", - TRADER_NO_BLACKLISTED = "You have offered a blacklisted item. My laws do not allow me to trade for that.", - TRADER_HOW_MUCH = "ITEM will cost you roughly VALUE CURRENCY, or something of equal worth.", - TRADER_WHAT_WANT = "I have logged need for", + TRADER_TRADE_COMPLETE = "Благодарю за покупку.", + TRADER_NOT_ENOUGH = "Прошу прощения, но ваше предложение не удовлетворяет реальную стоимость этого товара.", + TRADER_NO_BLACKLISTED = "Предлагаемый вами товар запрещён на территории большинства известных государств. Мои законы не позволяют принять его в качестве оплаты.", + TRADER_HOW_MUCH = "ITEM будет стоить для вас VALUE CURRENCY, или объекта аналогичной ценности.", + TRADER_WHAT_WANT = "Я регистрирую потребность в", - TRADER_COMPLEMENT_FAILURE = "I'm sorry, I am not allowed to let compliments affect the trade.", - TRADER_COMPLEMENT_SUCCESS = "Thank you, but that will not not change our business interactions.", - TRADER_INSULT_GOOD = "I do not understand, are we not on good terms?", - TRADER_INSULT_BAD = "I do not understand, are you insulting me?", + TRADER_COMPLEMENT_FAILURE = "Прошу прощения, но я не могу позволить своим вне-рабочим отношениям как-то повлиять на торги.", + TRADER_COMPLEMENT_SUCCESS = "Благодарю, но я не могу позволить своим вне-рабочим отношениям как-то повлиять на торги.", + TRADER_INSULT_GOOD = "Я не понимаю, разве эти условия недостаточно удовлетворяют спрос?", + TRADER_INSULT_BAD = "Я не понимаю, это было оскорблением?", - TRADER_BRIBE_FAILURE = "You have given me money to stay, however, I am a station. I do not leave.", + TRADER_BRIBE_FAILURE = "Мы благодарим вас за ваше вложение - но ORIGIN является станцией. Он в любом случае никуда не улетит.", ) - possible_wanted_items = list(/obj/item/device = TRADER_SUBTYPES_ONLY, + possible_wanted_items = list(/obj/item/device/ = TRADER_SUBTYPES_ONLY, /obj/item/device/assembly = TRADER_BLACKLIST_ALL, /obj/item/device/assembly_holder = TRADER_BLACKLIST_ALL, /obj/item/device/encryptionkey/syndicate = TRADER_BLACKLIST, - /obj/item/tank/phoron/onetankbomb = TRADER_BLACKLIST, + /obj/item/tank/phoron/onetankbomb = TRADER_BLACKLIST, /obj/item/device/radio = TRADER_BLACKLIST_ALL, - /obj/item/modular_computer/pda = TRADER_BLACKLIST_SUB, + /obj/item/modular_computer/pda = TRADER_BLACKLIST_SUB, /obj/item/device/uplink = TRADER_BLACKLIST) possible_trading_items = list(/obj/item/storage/bag = TRADER_SUBTYPES_ONLY, /obj/item/storage/bag/cash/infinite = TRADER_BLACKLIST, /obj/item/storage/backpack = TRADER_ALL, /obj/item/storage/backpack/cultpack = TRADER_BLACKLIST, - /obj/item/storage/backpack/holding = TRADER_BLACKLIST, + /obj/item/storage/backpack/holding = TRADER_BLACKLIST_ALL, /obj/item/storage/backpack/satchel/grey/withwallet = TRADER_BLACKLIST, /obj/item/storage/backpack/satchel/syndie_kit = TRADER_BLACKLIST_ALL, /obj/item/storage/backpack/chameleon = TRADER_BLACKLIST, @@ -55,9 +55,10 @@ They sell generic supplies and ask for generic supplies. /obj/item/storage/toolbox = TRADER_ALL, /obj/item/storage/wallet = TRADER_THIS_TYPE, /obj/item/storage/photo_album = TRADER_THIS_TYPE, + /obj/item/mag_table_plate = TRADER_THIS_TYPE, /obj/item/clothing/glasses = TRADER_SUBTYPES_ONLY, /obj/item/clothing/glasses/hud = TRADER_BLACKLIST_ALL, - /obj/item/clothing/glasses/blindfold/tape = TRADER_BLACKLIST, + /obj/item/clothing/glasses/blindfold/tape = TRADER_BLACKLIST, /obj/item/clothing/glasses/chameleon = TRADER_BLACKLIST ) @@ -69,35 +70,32 @@ They sell generic supplies and ask for generic supplies. origin = "[origin] #[rand(100,999)]" /datum/trader/trading_beacon/mine - origin = "Mining Beacon" + origin = "Добывающий Маяк" - possible_trading_items = list(/obj/item/ore = TRADER_SUBTYPES_ONLY, - /obj/item/stack/material/glass = TRADER_ALL, - /obj/item/stack/material/glass/fifty = TRADER_BLACKLIST, - /obj/item/stack/material/iron = TRADER_THIS_TYPE, - /obj/item/stack/material/sandstone = TRADER_THIS_TYPE, - /obj/item/stack/material/marble = TRADER_THIS_TYPE, - /obj/item/stack/material/diamond = TRADER_THIS_TYPE, - /obj/item/stack/material/uranium = TRADER_THIS_TYPE, - /obj/item/stack/material/phoron = TRADER_THIS_TYPE, - /obj/item/stack/material/plastic = TRADER_THIS_TYPE, - /obj/item/stack/material/gold = TRADER_THIS_TYPE, - /obj/item/stack/material/silver = TRADER_THIS_TYPE, - /obj/item/stack/material/platinum = TRADER_THIS_TYPE, - /obj/item/stack/material/mhydrogen = TRADER_THIS_TYPE, - /obj/item/stack/material/tritium = TRADER_THIS_TYPE, - /obj/item/stack/material/osmium = TRADER_THIS_TYPE, - /obj/item/stack/material/steel = TRADER_THIS_TYPE, - /obj/item/stack/material/plasteel = TRADER_THIS_TYPE, + possible_trading_items = list(/obj/item/stack/material/glass = TRADER_SUBTYPES_ONLY, + /obj/item/stack/material/iron = TRADER_SUBTYPES_ONLY, + /obj/item/stack/material/sandstone = TRADER_SUBTYPES_ONLY, + /obj/item/stack/material/marble = TRADER_SUBTYPES_ONLY, + /obj/item/stack/material/diamond = TRADER_SUBTYPES_ONLY, + /obj/item/stack/material/uranium = TRADER_SUBTYPES_ONLY, + /obj/item/stack/material/phoron = TRADER_SUBTYPES_ONLY, + /obj/item/stack/material/plastic = TRADER_SUBTYPES_ONLY, + /obj/item/stack/material/gold = TRADER_SUBTYPES_ONLY, + /obj/item/stack/material/silver = TRADER_SUBTYPES_ONLY, + /obj/item/stack/material/platinum = TRADER_SUBTYPES_ONLY, + /obj/item/stack/material/mhydrogen = TRADER_SUBTYPES_ONLY, + /obj/item/stack/material/tritium = TRADER_SUBTYPES_ONLY, + /obj/item/stack/material/osmium = TRADER_SUBTYPES_ONLY, + /obj/item/stack/material/steel = TRADER_SUBTYPES_ONLY, + /obj/item/stack/material/plasteel = TRADER_SUBTYPES_ONLY, /obj/machinery/mining = TRADER_SUBTYPES_ONLY ) /datum/trader/trading_beacon/manufacturing - origin = "Manifacturing Beacon" + origin = "Производственный Маяк" possible_trading_items = list(/obj/structure/AIcore = TRADER_THIS_TYPE, - /obj/structure/girder = TRADER_THIS_TYPE, - /obj/structure/grille = TRADER_THIS_TYPE, + /obj/structure/girder/displaced = TRADER_THIS_TYPE, /obj/structure/mopbucket = TRADER_THIS_TYPE, /obj/structure/ore_box = TRADER_THIS_TYPE, /obj/structure/coatrack = TRADER_THIS_TYPE, @@ -111,8 +109,9 @@ They sell generic supplies and ask for generic supplies. /obj/structure/filingcabinet = TRADER_THIS_TYPE, /obj/structure/safe = TRADER_THIS_TYPE, /obj/structure/plushie = TRADER_SUBTYPES_ONLY, - /obj/structure/sign = TRADER_SUBTYPES_ONLY, - /obj/structure/sign/double = TRADER_BLACKLIST_ALL, - /obj/structure/sign/goldenplaque = TRADER_BLACKLIST_ALL, - /obj/structure/sign/poster = TRADER_BLACKLIST + /obj/item/contraband/poster = TRADER_THIS_TYPE, + /obj/structure/holoplant = TRADER_THIS_TYPE, + /obj/structure/flora/pottedplant = TRADER_THIS_TYPE, + /obj/structure/reagent_dispensers/water_cooler = TRADER_THIS_TYPE + ) diff --git a/code/datums/trading/ship.dm b/code/datums/trading/ship.dm index e03363da0497f..7ba5b7fc6f74e 100644 --- a/code/datums/trading/ship.dm +++ b/code/datums/trading/ship.dm @@ -2,7 +2,9 @@ //They are ALSO the only ones that can appear after round start /datum/trader/ship var/duration_of_stay = 0 - var/typical_duration = 20 //minutes (since trader processes only tick once a minute) + var/typical_duration = 30 //minutes (since trader processes only tick once a minute) + + overmap_object_type = /obj/overmap/trading/ship /datum/trader/ship/New() ..() @@ -10,12 +12,12 @@ /datum/trader/ship/tick() ..() - if(prob(-disposition) || refuse_comms) + if(prob(-min(list_values(disposition)))) duration_of_stay -= 5 return --duration_of_stay > 0 -/datum/trader/ship/bribe_to_stay_longer(amt) - if(prob(-disposition)) +/datum/trader/ship/bribe_to_stay_longer(amt, ship_z) + if(prob(-disposition[map_sectors["[ship_z]"]])) return ..() var/length = round(amt/100) diff --git a/code/datums/trading/trade.dm b/code/datums/trading/trade.dm index 72fbeefad4bf1..9c765d289327b 100644 --- a/code/datums/trading/trade.dm +++ b/code/datums/trading/trade.dm @@ -2,7 +2,7 @@ var/name = "unsuspicious trader" //The name of the trader in question var/origin = "some place" //The place that they are trading from var/list/possible_origins //Possible names of the trader origin - var/disposition = 0 //The current disposition of them to us. + var/list/disposition = list() //The current disposition of them to us. var/trade_flags = TRADER_MONEY //Flags var/name_language //If this is set to a language name this will generate a name from the language var/icon/portrait //The icon that shows up in the menu @TODO @@ -14,6 +14,12 @@ var/list/blacklisted_trade_items = list(/mob/living/carbon/human) //Things they will automatically refuse + var/obj/overmap/trading/overmap_representation //Эффект на карте, представляющий судно/станцию данного торговца + var/overmap_object_type = /obj/overmap/trading //Путь к эффекту выше + var/overmap_object_color = COLOR_WHITE //Цвет судна/станции + + var/skill_req = SKILL_BUREAUCRACY //Какой скилл требуется для общения с торговцем + var/list/speech = list() //The list of all their replies and messages. Structure is (id = talk) /*SPEECH IDS: hail_generic When merchants hail a person @@ -36,7 +42,7 @@ var/price_rng = 10 //Percentage max variance in sell prices. var/insult_drop = 5 //How far disposition drops on insult var/compliment_increase = 5 //How far compliments increase disposition - var/refuse_comms = 0 //Whether they refuse further communication +// var/refuse_comms = 0 //Whether they refuse further communication var/mob_transfer_message = "You are transported to ORIGIN." //What message gets sent to mobs that get sold. @@ -58,10 +64,13 @@ if(possible_trading_items) possible_trading_items = generate_pool(possible_trading_items) + update_disposition_list() + for(var/i in 3 to 6) add_to_pool(trading_items, possible_trading_items, force = 1) add_to_pool(wanted_items, possible_wanted_items, force = 1) + generate_overmap_representation() /datum/trader/proc/generate_pool(list/pool) var/list/result = list() @@ -79,6 +88,50 @@ result -= subtypesof(path) return result +/datum/trader/proc/update_disposition_list() + for(var/obj/overmap/visitable/possible_trading_visitables) + if(!possible_trading_visitables) + continue + if(possible_trading_visitables in disposition) + continue + disposition += possible_trading_visitables + disposition[possible_trading_visitables] = 0 + +/datum/trader/proc/select_spawn_location() + var/list/map_turfs = block(locate(2,2,GLOB.using_map.overmap_z),locate(GLOB.using_map.overmap_size-2,GLOB.using_map.overmap_size-2,GLOB.using_map.overmap_z)) + + for(var/turf/T in shuffle(map_turfs)) + var/valid = TRUE + for(var/obj/overmap/event/E in T) + if(E) + valid = FALSE + break + for(var/obj/overmap/trading/M in T) + if(M) + valid = FALSE + break + for(var/obj/overmap/visitable/V) + if(T in view(7, V)) + valid = FALSE + break + if(valid) + return T + +/datum/trader/proc/generate_overmap_representation() + var/turf/spawn_location = select_spawn_location() + + if(!spawn_location) + log_and_message_admins("NO SPACE TO PLACE NEW TRADER!") + return + + overmap_representation = new overmap_object_type(spawn_location) + overmap_representation.color = overmap_object_color + overmap_representation.trader_merchant_datum = src + overmap_representation.name = origin +// overmap_representation.desc = + +/datum/trader/proc/leave_map() + qdel(overmap_representation) // TODO: overmap bluespace jump animation //If this hits 0 then they decide to up and leave. /datum/trader/proc/tick() @@ -196,13 +249,13 @@ if(!trading_worth) return make_response(TRADER_NOT_ENOUGH, "That's not enough.", 0, FALSE) var/percent = offer_worth/trading_worth - if(percent > max(0.9, 0.9-disposition / 100)) + if(percent > max(0.9, 0.9-disposition[map_sectors["[location.z]"]] / 100)) trade_quantity(quantity, offers, num, location) return make_response(TRADER_TRADE_COMPLETE, "Thank you for your patronage!", 0, TRUE) return make_response(TRADER_NOT_ENOUGH, "That's not enough.", 0, FALSE) /datum/trader/proc/hail(mob/user) - if(!can_hail()) + if(!can_hail(user)) return make_response(TRADER_HAIL_DENY, "No, go away.", 0, FALSE) var/specific if(istype(user, /mob/living/carbon/human)) @@ -217,26 +270,28 @@ tr.text = replacetext(tr.text, "MOB", user.name) return tr -/datum/trader/proc/can_hail() - if(!refuse_comms && prob(-disposition)) - refuse_comms = 1 - return !refuse_comms +/datum/trader/proc/can_hail(mob/user) + if(prob(-disposition[map_sectors["[user.z]"]])) + return FALSE + return TRUE -/datum/trader/proc/insult() - disposition -= rand(insult_drop, insult_drop * 2) - if(prob(-disposition/10)) - refuse_comms = 1 - if(disposition > 50) +/datum/trader/proc/insult(ship_z, mob/user) + var/randed = rand(insult_drop * max(0.1, user.get_skill_value(skill_req) * 0.2), insult_drop * max(1, user.get_skill_value(skill_req) * 1.5)) + disposition[map_sectors["[ship_z]"]] -= randed + if(randed > insult_drop * 2) return make_response(TRADER_INSULT_GOOD,"What? I thought we were cool!", 0, TRUE) else + disposition[map_sectors["[ship_z]"]] -= randed * 0.5 return make_response(TRADER_INSULT_BAD, "Right back at you asshole!", 0, FALSE) -/datum/trader/proc/compliment() - if(prob(-disposition)) +/datum/trader/proc/compliment(ship_z, mob/user) + var/randed = rand(compliment_increase * max(0.1, user.get_skill_value(skill_req) * 0.2), compliment_increase * max(1, user.get_skill_value(skill_req) * 1.5)) + if(randed < compliment_increase * 2) + disposition[map_sectors["[ship_z]"]] -= randed * 0.5 return make_response(TRADER_COMPLEMENT_FAILURE, "Fuck you!", 0, FALSE) - if(prob(100-disposition)) - disposition += rand(compliment_increase, compliment_increase * 2) - return make_response(TRADER_COMPLEMENT_SUCCESS, "Thank you!", 0, TRUE) + else + disposition[map_sectors["[ship_z]"]] += randed + return make_response(TRADER_COMPLEMENT_SUCCESS, "Thank you!", 0, TRUE) /datum/trader/proc/trade_quantity(quantity, list/offers, num, turf/location) for(var/offer in offers) @@ -253,7 +308,7 @@ M += new type(location) playsound(location, 'sound/effects/teleport.ogg', 50, 1) - disposition += quantity * (rand(compliment_increase, compliment_increase * 3)) + disposition[map_sectors["[location.z]"]] += quantity * (rand(compliment_increase, compliment_increase * 3)) return M @@ -298,5 +353,5 @@ qdel(offer) return make_response(TRADER_TRADE_COMPLETE, "Thanks for the goods!", total, TRUE) -/datum/trader/proc/bribe_to_stay_longer(amt) +/datum/trader/proc/bribe_to_stay_longer(amt, ship_z) return make_response(TRADER_BRIBE_FAILURE, "How about no?", 0, FALSE) diff --git a/code/datums/trading/unique.dm b/code/datums/trading/unique.dm index ff5c612a533e3..9c70747c83e74 100644 --- a/code/datums/trading/unique.dm +++ b/code/datums/trading/unique.dm @@ -3,7 +3,7 @@ want_multiplier = 5 typical_duration = 40 -/datum/trader/ship/unique/New() +/*/datum/trader/ship/unique/New() ..() wanted_items = list() for(var/type in possible_wanted_items) @@ -15,10 +15,10 @@ if(status & TRADER_BLACKLIST) wanted_items -= type if(status & TRADER_BLACKLIST_SUB) - wanted_items -= subtypesof(type) + wanted_items -= subtypesof(type)*/ /datum/trader/ship/unique/tick() - if(prob(-disposition) || refuse_comms) + if(prob(-min(list_values(disposition)))) duration_of_stay-- return --duration_of_stay > 0 @@ -28,6 +28,7 @@ /datum/trader/ship/unique/severance name = "Unknown" origin = "SGS Severance" + skill_req = SKILL_COOKING possible_wanted_items = list( /obj/item/reagent_containers/food/snacks/human = TRADER_SUBTYPES_ONLY, @@ -35,6 +36,12 @@ /mob/living/carbon/human = TRADER_ALL ) + wanted_items = list( + /obj/item/reagent_containers/food/snacks/human = TRADER_SUBTYPES_ONLY, + /obj/item/reagent_containers/food/snacks/meat/human = TRADER_THIS_TYPE, + /mob/living/carbon/human = TRADER_ALL + ) + possible_trading_items = list(/obj/item/gun/projectile/automatic = TRADER_SUBTYPES_ONLY, /obj/item/gun/projectile/automatic/machine_pistol/usi = TRADER_BLACKLIST, /obj/item/gun/projectile/automatic/l6_saw/mag = TRADER_BLACKLIST @@ -65,9 +72,10 @@ origin = "Floating rock" possible_wanted_items = list(/obj/item/ore = TRADER_ALL) + wanted_items = list(/obj/item/ore = TRADER_ALL) possible_trading_items = list(/obj/machinery/power/supermatter = TRADER_ALL, /obj/item/aiModule = TRADER_SUBTYPES_ONLY) - want_multiplier = 5000 + want_multiplier = 4000 // was 5000, yeah speech = list(TRADER_HAIL_GENERIC = "Blub am MERCHANT. Blub hunger for things. Boo bring them to blub, yes?", TRADER_HAIL_DENY = "Blub does not want to speak to boo.", diff --git a/code/modules/merchant/merchant_programs.dm b/code/modules/merchant/merchant_programs.dm index c03564deb34de..8bbaf5df73f21 100644 --- a/code/modules/merchant/merchant_programs.dm +++ b/code/modules/merchant/merchant_programs.dm @@ -7,13 +7,16 @@ nanomodule_path = /datum/nano_module/program/merchant size = 12 usage_flags = PROGRAM_CONSOLE - required_access = access_merchant + required_access = access_cargo var/obj/machinery/merchant_pad/pad = null var/current_merchant = 0 var/show_trades = FALSE var/hailed_merchant = FALSE var/last_comms = null var/temp = null + + var/ignore_distance = FALSE + /// Stores the money deposited into the merchant program var/bank = 0 @@ -101,16 +104,16 @@ if(bank < amt) last_comms = "ERROR: NOT ENOUGH FUNDS." return - get_response(T.bribe_to_stay_longer(amt)) + get_response(T.bribe_to_stay_longer(amt,holder.loc.z)) /datum/computer_file/program/merchant/proc/offer_item(datum/trader/T, num, skill) var/quantity = 1 if(pad) var/list/targets = pad.get_targets() - for(var/target in targets) +/* for(var/target in targets) if(!computer.emagged() && istype(target,/mob/living/carbon/human)) last_comms = "SAFETY LOCK ENABLED: SENTIENT MATTER UNTRANSMITTABLE" - return + return*/ get_response(T.offer_items_for_bulk(quantity, targets, num, get_turf(pad), skill)) else last_comms = "PAD NOT CONNECTED" @@ -156,6 +159,9 @@ if(!pad) last_comms = "PAD NOT CONNECTED. CANNOT TRANSFER" return + if(bank <= 0) + last_comms = "BANK IS EMPTY. CANNOT TRANSFER" + return var/turf/T = get_turf(pad) var/obj/item/spacecash/bundle/B = new(T) B.worth = bank @@ -165,6 +171,7 @@ /datum/computer_file/program/merchant/Topic(href, href_list) if(..()) return TOPIC_HANDLED + var/obj/overmap/visitable/linked = map_sectors["[holder.loc.z]"] var/mob/user = usr if(href_list["PRG_connect_pad"]) . = TOPIC_HANDLED @@ -214,8 +221,11 @@ if(!hailed_merchant) if(href_list["PRG_hail"]) . = TOPIC_HANDLED - hailed_merchant = get_response(T.hail(user)) - show_trades = FALSE + if((T.overmap_representation in view(12,linked)) || ignore_distance) + hailed_merchant = get_response(T.hail(user)) + show_trades = FALSE + else + temp = "Cannot find this trader within sensors reach. Trader located in X[T.overmap_representation.x] Y[T.overmap_representation.y]" . = TOPIC_HANDLED else if(href_list["PRG_show_trades"]) @@ -223,10 +233,10 @@ show_trades = !show_trades if(href_list["PRG_insult"]) . = TOPIC_HANDLED - get_response(T.insult()) + get_response(T.insult(holder.loc.z), user) if(href_list["PRG_compliment"]) . = TOPIC_HANDLED - get_response(T.compliment()) + get_response(T.compliment(holder.loc.z), user) if(href_list["PRG_offer_item"]) . = TOPIC_HANDLED offer_item(T,text2num(href_list["PRG_offer_item"]) + 1, user.get_skill_value(SKILL_FINANCE)) @@ -251,3 +261,11 @@ if(href_list["PRG_bribe"]) . = TOPIC_HANDLED bribe(T, text2num(href_list["PRG_bribe"])) + +/datum/computer_file/program/merchant/no_id + required_access = null + +/datum/computer_file/program/merchant/ignore_distance + available_on_ntnet = FALSE + ignore_distance = TRUE + required_access = access_merchant diff --git a/code/modules/overmap/sectors.dm b/code/modules/overmap/sectors.dm index 6babf753d318e..552b1c5fc93fd 100644 --- a/code/modules/overmap/sectors.dm +++ b/code/modules/overmap/sectors.dm @@ -158,6 +158,9 @@ GLOBAL_LIST_EMPTY(known_overmap_sectors) for(var/obj/machinery/computer/ship/helm/H as anything in GLOB.overmap_helm_computers) update_known_connections(TRUE) + for(var/datum/trader/merchant) + merchant.update_disposition_list() + /obj/overmap/visitable/sector/update_known_connections(notify = FALSE) . = ..() diff --git a/code/modules/overmap/trading_locations.dm b/code/modules/overmap/trading_locations.dm new file mode 100644 index 0000000000000..86dcc6f8449c4 --- /dev/null +++ b/code/modules/overmap/trading_locations.dm @@ -0,0 +1,20 @@ +/obj/overmap/trading + name = "station" + desc = "A trading station." + icon_state = "sector" + scannable = TRUE + requires_contact = FALSE // Whether or not the effect must be identified by ship sensors before being seen. + instant_contact = TRUE // Do we instantly identify ourselves to any ship in sensors range? + plane = 4 + + var/datum/trader/trader_merchant_datum + +/obj/overmap/trading/on_update_icon() + return + +/obj/overmap/trading/ship + name = "ship" + desc = "A trading ship." + icon_state = "ship" + requires_contact = FALSE // Whether or not the effect must be identified by ship sensors before being seen. + instant_contact = TRUE // Do we instantly identify ourselves to any ship in sensors range? diff --git a/maps/mapsystem/maps.dm b/maps/mapsystem/maps.dm index 793611ca1ce4a..68785be198ecd 100644 --- a/maps/mapsystem/maps.dm +++ b/maps/mapsystem/maps.dm @@ -101,6 +101,7 @@ var/global/const/MAP_HAS_RANK = 2 //Rank system, also togglable var/id_hud_icons = 'icons/mob/hud.dmi' // Used by the ID HUD (primarily sechud) overlay. + var/num_traders = 0 var/num_exoplanets = 0 var/list/planet_size //dimensions of planet zlevel, defaults to world size. Due to how maps are generated, must be (2^n+1) e.g. 17,33,65,129 etc. Map will just round up to those if set to anything other. var/away_site_budget = 0 @@ -275,6 +276,7 @@ var/global/const/MAP_HAS_RANK = 2 //Rank system, also togglable if ("overmap_z") overmap_z = text2num_or_default(value, overmap_z) if ("overmap_size") overmap_size = text2num_or_default(value, overmap_size) if ("overmap_event_areas") overmap_event_areas = text2num_or_default(value, overmap_event_areas) + if ("num_traders") num_traders = text2num_or_default(value, num_traders) if ("num_exoplanets") num_exoplanets = text2num_or_default(value, num_exoplanets) if ("away_site_budget") away_site_budget = text2num_or_default(value, away_site_budget) if ("station_name") station_name = value diff --git a/maps/torch_fd/fd_torch.dm b/maps/torch_fd/fd_torch.dm index 372261de95845..5244ac436b6b4 100644 --- a/maps/torch_fd/fd_torch.dm +++ b/maps/torch_fd/fd_torch.dm @@ -248,6 +248,7 @@ #include "../../mods/_fd/combat_stances/_combat_stances.dme" #include "../../mods/_fd/complementary_xeno_ablities/_complementary_xeno_ablities.dme" #include "../../mods/_fd/conference_holopads/_conference_holopads.dme" + #include "../../mods/_fd/expanded_traders/_expanded_traders.dme" #include "../../mods/_fd/fd_species/_fd_species.dme" #include "../../mods/_fd/hestia_missiles/_hestia_missiles.dme" #include "../../mods/_fd/immersive_overmap/_immersive_overmap.dme" diff --git a/maps/torch_fd/torch_define.dm b/maps/torch_fd/torch_define.dm index c497be90e04dc..8546b37ef2de0 100644 --- a/maps/torch_fd/torch_define.dm +++ b/maps/torch_fd/torch_define.dm @@ -50,6 +50,7 @@ use_overmap = 1 num_exoplanets = 0 + num_traders = 0 away_site_budget = 0 min_offmap_players = 12 diff --git a/maps/torch_fd/torch_overmap.dm b/maps/torch_fd/torch_overmap.dm index 7bb7aa9b3aad1..05f6d4777bcc0 100644 --- a/maps/torch_fd/torch_overmap.dm +++ b/maps/torch_fd/torch_overmap.dm @@ -1,4 +1,13 @@ +/obj/overmap/visitable/ship/torch/Initialize() + . = ..() + add_starter_trader() + +/obj/overmap/visitable/ship/torch/proc/add_starter_trader() + var/trader_type = /datum/trader/trading_beacon/starter + GLOB.traders[trader_type] = new trader_type + GLOB.trader_types += trader_type + // --- BUBBLE --- // /obj/overmap/visitable/ship/landable/bubble diff --git a/mods/_fd/backgrounds/_fd_backgrounds.dme b/mods/_fd/backgrounds/_fd_backgrounds.dme index 2ce9013d5af68..e01cd800ee6f8 100644 --- a/mods/_fd/backgrounds/_fd_backgrounds.dme +++ b/mods/_fd/backgrounds/_fd_backgrounds.dme @@ -9,4 +9,13 @@ #include "code/locations_humankind.dm" #include "code/locations_ipc.dm" +//Vox stuff +#include "code/vox/code.dm" + +#include "code/vox/culture.dm" +#include "code/vox/factions.dm" +#include "code/vox/location.dm" +#include "code/vox/religion.dm" + + #endif diff --git a/mods/_fd/backgrounds/code/cultures_humankind.dm b/mods/_fd/backgrounds/code/cultures_humankind.dm index 262023f1f305d..7af9fa0ac15e9 100644 --- a/mods/_fd/backgrounds/code/cultures_humankind.dm +++ b/mods/_fd/backgrounds/code/cultures_humankind.dm @@ -51,6 +51,8 @@ CULTURE_HUMAN_SOLCOL, \ CULTURE_HUMAN_CONFEDC, \ CULTURE_HUMAN_CONFEDO, \ + CULTURE_HUMAN_CONFEDC, \ + CULTURE_HUMAN_CONFEDO, \ CULTURE_HUMAN_GAIAN, \ CULTURE_HUMAN_OTHER, \ CULTURE_HUMAN_NYXIAN) @@ -147,7 +149,6 @@ Это олигархи и прочие сливки общества, едва ли видевшие обратную сторону медали. Впрочем, их нельзя назвать эгоистичными или самовлюблёнными, \ ведь они прекрасно понимают, что их блага - это чужие слёзы и часы. Скорее, подобно своим предкам - Гидеонцам, они не спешат отказываться от \ утопичной, комфортной жизни в пользу борьбы за равенство и справедливость. \ - ------------------------------------------------------------------------------ \ Не смотря на то, что Марс был колонизирован ещё двести с лишним лет назад, как и на Луне - жизнь вне специальных городов-куполов на нём невозможна. \ Большая часть Монсийцев распределена между тремя локациями - Горой Олимп, Провинцией Фарсида и Кратером Эллады, в то время как остальные поселения - \ это преимущественно коммерческие и административные зоны, или же крупные фермерские угодья." @@ -176,7 +177,6 @@ Больше половины населения спутника находится за чертой бедности, пребывая в постоянных конфликтах друг с другом. \ Банды сражаются за территорию, наёмники выполняют грязную работу для \"Конгломерата Четырёх\", а хакеры снабжают их информацией \ и новыми контрактами. \ - ------------------------------------------------------------------------------ \ Здесь нет хороших и плохих, есть только те, кто едят и те кто сдыхают с голоду. Если верхушка рвёт глотки \ ради статуса и славы, то здесь это делают из чистого желания жить, ведь так и устроены \"подворотни\". \ Если вам удалось дожить хотя бы до двадцати и выбраться из этой дыры - то это действительно достижение. Для кого-то. \ @@ -193,7 +193,6 @@ на недостаток денег, но тем не менее, вокруг вас постоянно крутятся те, кто хотят эти деньги отобрать. \ С самого рождения вы впутаны в их \"Игру\". Интриги, политические манёвры, предательства и пособничество криминалитету - \ это то, чем живёт местная элита. Так уж тут заведено, что те, кто не готов идти по чужим головам - всегда будут оставаться на дне. \ - ------------------------------------------------------------------------------ \ Вероятно, вы крайне начитанный и умный человек, посвещавший не мало времени своему культурному развитию и различного рода творчеству. \ Это отражается не только в ваших взглядах на мир, но и в характере. Многие отмечают, что звёздные дети персоны крайне меркантильные, мелочные, и капризные." economic_power = 1.3 @@ -208,7 +207,6 @@ особняков высокопставленных офицеров, государственных представителей и глав корпораций. По этой же причине, не редко именно данная планета \ становится центров для переговоров и решения важных дипломатических вопросов. Уровень преступности здесь, в практически полностью изолированной среде - \ близится к нулю. И тем не менее, олигархи не чураются меряться размерами своих частных дивизионов, чаще всего состоящих из контрактников \"PCRC\". \ - ------------------------------------------------------------------------------ \ Какой-то устоявшейся бюрократической цепочки, законов, или вида управления на Венере нет, ведь каждая Зона(за некоторыми исключениями) уже давно \ выкуплена частными предпринимателями и богатыми семьями, что сами обеспечивают своё снабжение, безопасность, и соблюдение прав гражданина. \ Поэтому, средний класс, чаще всего, работает в соответствующих своим \"владельцам\" сферах, будь то пансионаты, казино, или огромные клубы. \ @@ -223,7 +221,6 @@ Многие из здешний вовсе давно позабыли то, как они здесь оказались и ради чего пашут каждый день, передавая свои кредитные обязательства \ от деда к отцу, и от отца к сыну. Многие из сегодняшних \"поверхностников\" вовсе не видели внешнего мира, собирая картину о нём по мусору, \ что поступает сюда с верхов. \ - ------------------------------------------------------------------------------ \ Жителей этих старых шахт можно охарактеризовать как крайне трудолюбивых, справедливых мужей и женщин, что чтят традиции своих предков и вкладывают \ всего себя в превращении этих ветхих тоннелей в прекрасный сад для своих будущих детей. Впрочем, как бы демократичны и уверены в себе они не были, \ едва ли живущие там, в облаках, будут согласны поделиться с шахтёрами частичкой своей роскоши. И всё же, те не оставляют своих попыток достучаться до правительства." @@ -237,7 +234,6 @@ Местные на протяжении столетий работали в промышленной сфере - сначала как шахтёры, а ныне как кораблестроители. \ Корпорация Falco Designs значительно поспособствовала тому, что сегодня Церериане практические повсеместно считаются мастерами своего дела, \ благодаря чему те имеют достаточно большой спрос на рынке труда как среди частников, так и у государства. \ - ------------------------------------------------------------------------------ \ Тем не менее, культура Белтеров в первую очередь ассоциируется с переменами, ведь живя на огромной верфи - ты не имеешь особого контроля \ над теми кто приходит и уходит. Церера - подобно клетке - является отличной платформой для старта, зоной комфорта, но не даёт своим жителям \ абсолютно никаких перспектив. В этом, отчасти, они прохожи на своих ближайших родственников - Спейсеров." @@ -278,7 +274,6 @@ восстановления планеты - несколько крупных кусков Евразии уже подверглось полной терраформации, открывая возможность для \ завоза первых травоядных. Большая часть Земли обитает в крупных аркологиях, разбросанных тут и там. Таковые \ часто носят названия существовавших в истории городов или стран, используя приписку Нью и Олд. \ - ------------------------------------------------------------------------------ \ Земляне крайне приятные в общении и чуткие люди, уважающие чужие культуры. Они редко вступают в конфликты и привыкли вести достаточно \ мирный образ жизни, наученные горьким опытом предыдущих ошибок. В их распоряжении не редко можно найти крайне старые, уже давно \ не работающие устройства и вещи, хранимые исключительно из желания почтить усилия и достижения их предков." @@ -293,7 +288,6 @@ Эпсилон известен своими молодыми умами и изобретательным подходом практически ко всему, что есть в нашей жизни. Сложно назвать хотя бы одну вещь, \ которую местные не смогли бы оптимизировать. Что уж говорить, если их столичный город - Иакон - лёг в основу многих сегодняшних колоний как эталон \ практичности и логистической эффективности. \ - ------------------------------------------------------------------------------ \ Впрочем, несмотря на выше перечисленное, чаще всего Цетитов можно разделить на две группы - безумцев и зануд, что в принципе хорошо отражает их планету." economic_power = 1.3 @@ -304,7 +298,6 @@ родиться непосредственно на планете - за то малое время, что провёл на ней человек. Подобно Земной Аляске, Мир Фостера является крайне негостеприимной локацией для проживания, \ тем не менее захватывающей своими красотами и туристическими возможностями. Фостерианцы крайне весёлые, полные энергии личности, которые ищут в жизни простоты и свободы от \ забот сегодняшнего корпоративного мира. \ - ------------------------------------------------------------------------------ \ Стоит заметить, что жители Сануры редко покидают свою родную систему, дорожа своей зоной комфорта и стараясь получать от неё максимум. Если Фостерианец всё-таки оказался за \ пределами своей уютной хай-тек хибары посреди тундры, то, вероятно, по работе или из-за вынужденных мер." economic_power = 1.4 diff --git a/mods/_fd/backgrounds/code/cultures_ipc.dm b/mods/_fd/backgrounds/code/cultures_ipc.dm index ff39dabf40be5..4d929ed9bfea9 100644 --- a/mods/_fd/backgrounds/code/cultures_ipc.dm +++ b/mods/_fd/backgrounds/code/cultures_ipc.dm @@ -39,10 +39,6 @@ CULTURE_HUMAN_SPACER_FD, \ CULTURE_HUMAN_OTHER_FD) -/datum/map/New() - available_cultural_info[TAG_CULTURE] += IPC_CULTURES_TO_ADD - . = ..() - /datum/species/machine/New() available_cultural_info[TAG_CULTURE] += IPC_CULTURES_TO_ADD ..() diff --git a/mods/_fd/backgrounds/code/factions_ipc.dm b/mods/_fd/backgrounds/code/factions_ipc.dm index b2586d415f9de..4c5c9c14a552a 100644 --- a/mods/_fd/backgrounds/code/factions_ipc.dm +++ b/mods/_fd/backgrounds/code/factions_ipc.dm @@ -22,10 +22,6 @@ FACTION_POSITRONICS_THIRDGEN_CORPORATE, \ FACTION_POSITRONICS_THIRDGEN_STATE) -/datum/map/New() - available_cultural_info[TAG_FACTION] += IPC_FACTIONS_TO_ADD - . = ..() - /datum/species/machine/New() available_cultural_info[TAG_FACTION] += IPC_FACTIONS_TO_ADD ..() diff --git a/mods/_fd/backgrounds/code/locations_humankind.dm b/mods/_fd/backgrounds/code/locations_humankind.dm index 8bb2d7d5f040b..79839a364632b 100644 --- a/mods/_fd/backgrounds/code/locations_humankind.dm +++ b/mods/_fd/backgrounds/code/locations_humankind.dm @@ -79,8 +79,9 @@ //OUR OWN LOCATIONS// //START// -/singleton/cultural_info/location/human/meotourne +/singleton/cultural_info/location/human_fd/meotourne name = HOME_SYSTEM_MEOT + nickname = "Меотурн" distance = "23 light years" description = "Meotourne, the only planet in Delta Pavonis system, is a unique temperate world with its own ecosystem. \ While a big chunk of its surface is a barren wasteland scorched by the star it's always facing, other areas are many other habitable, although never habitated and mostly unresearched, biomes with lush pine-like flora \ @@ -93,8 +94,9 @@ economic_power = 1.1 ruling_body = "Belmeone Federation" -/singleton/cultural_info/location/human/pospolita +/singleton/cultural_info/location/human_fd/pospolita name = HOME_SYSTEM_REPUBL + nickname = "Республика Нова" distance = "23 light years" description = "Nova Respublica is, in fact, not much more than several small planetary and asteroid resource extraction colonies and many space installations across Delta Pavonis and Kestalia systems. \ Once united as means for simple survival, over time it became a large entity as lots of hardy spacers joined the fledgling colonial alliance. \ @@ -113,6 +115,7 @@ /singleton/cultural_info/location/human_fd name = HOME_SYSTEM_MARS_FD + nickname = "Марс" description = "-" distance = "1.5AU" capital = "Олимп" @@ -120,6 +123,7 @@ /singleton/cultural_info/location/human_fd/earth name = HOME_SYSTEM_EARTH_FD + nickname = "Земля" description = "-" distance = "1AU" capital = "Женева" @@ -127,6 +131,7 @@ /singleton/cultural_info/location/human_fd/luna name = HOME_SYSTEM_LUNA_FD + nickname = "Луна" distance = "1AU" description = "-" capital = "Селена" @@ -135,6 +140,7 @@ /singleton/cultural_info/location/human_fd/venus name = HOME_SYSTEM_VENUS_FD + nickname = "Венера" distance = "0.7AU" description = "-" capital = "Центральная Административная \"Зона\"" @@ -142,12 +148,14 @@ /singleton/cultural_info/location/human_fd/ceres name = HOME_SYSTEM_CERES_FD + nickname = "Церера" distance = "2.7AU" description = "-" capital = "Строительная верфь \"Кханион\"" /singleton/cultural_info/location/human_fd/pluto name = HOME_SYSTEM_PLUTO_FD + nickname = "Плутон" distance = "45AU" description = "-" capital = "Нью-Доминго" @@ -156,6 +164,7 @@ /singleton/cultural_info/location/human_fd/cetiepsilon name = HOME_SYSTEM_TAU_CETI_FD + nickname = "Цети Эпсилон" distance = "11.9 light years" description = "-" capital = "Иакон" @@ -163,6 +172,7 @@ /singleton/cultural_info/location/human_fd/eos name = HOME_SYSTEM_HELIOS_FD + nickname = "Еос" description = "-" capital = "Сария" economic_power = 1.3 @@ -170,6 +180,7 @@ /singleton/cultural_info/location/human_fd/terra name = HOME_SYSTEM_TERRA_FD + nickname = "Терра" description = "-" capital = "Амерант" distance = "22.5 light years." @@ -179,6 +190,7 @@ /singleton/cultural_info/location/human_fd/saffar name = HOME_SYSTEM_SAFFAR + nickname = "Саффар" distance = "44 light years" description = "-" capital = "Орбитальная станция \"Саффар-1\"" @@ -186,6 +198,7 @@ /singleton/cultural_info/location/human_fd/tadmor name = HOME_SYSTEM_TADMOR_FD + nickname = "Тадмор" distance = "45 light years" description = "-" capital = "Пальмира" @@ -193,6 +206,7 @@ /singleton/cultural_info/location/human_fd/pirx name = HOME_SYSTEM_PIRX_FD + nickname = "Пиркс" distance = "41 light years" description = "-" capital = "Йуду" @@ -200,6 +214,7 @@ /singleton/cultural_info/location/human_fd/brahe name = HOME_SYSTEM_BRAHE_FD + nickname = "Браге" distance = "41 light years" description = "-" capital = "Нью-Орхус" @@ -207,6 +222,7 @@ /singleton/cultural_info/location/human_fd/iolaus name = HOME_SYSTEM_IOLAUS_FD + nickname = "Иолай" distance = "41 light years" description = "-" capital = "Немея" @@ -214,6 +230,7 @@ /singleton/cultural_info/location/human_fd/gaia name = HOME_SYSTEM_GAIA_FD + nickname = "Гайя" distance = "14 light years" description = "-" capital = "Новая Венеция" @@ -221,6 +238,7 @@ /singleton/cultural_info/location/human_fd/magnitka name = HOME_SYSTEM_MAGNITKA_FD + nickname = "Магнитка" distance = "24 light years" description = "-" capital = "Стройгородок" @@ -229,6 +247,7 @@ /singleton/cultural_info/location/human_fd/castilla name = HOME_SYSTEM_CASTILLA_FD + nickname = "Кастилья-ла-Нуэва" distance = "10 light years" description = "-" capital = "Пласида" @@ -236,6 +255,7 @@ /singleton/cultural_info/location/human_fd/fosters name = HOME_SYSTEM_FOSTER_FD + nickname = "Мир Фостера" distance = "11 light years" description = "-" capital = "Вайтхилл" diff --git a/mods/_fd/backgrounds/code/locations_ipc.dm b/mods/_fd/backgrounds/code/locations_ipc.dm index f550681b9f9bb..3c81d5b042167 100644 --- a/mods/_fd/backgrounds/code/locations_ipc.dm +++ b/mods/_fd/backgrounds/code/locations_ipc.dm @@ -1,6 +1,4 @@ #define HOME_SYSTEM_ERIDANI "Themis" -#define HOME_SYSTEM_MEOT "Meotourne" -#define HOME_SYSTEM_REPUBL "Nova Respublica" #define HOME_SYSTEM_EARTH_FD "Earth" #define HOME_SYSTEM_LUNA_FD "Luna" @@ -65,12 +63,9 @@ ..() available_cultural_info[TAG_HOMEWORLD] -= IPC_HOMES_TO_DELETE -/datum/map/New() - available_cultural_info[TAG_HOMEWORLD] += IPC_HOMES_TO_ADD - . = ..() - /singleton/cultural_info/location/eridani name = HOME_SYSTEM_ERIDANI + nickname = "Фемида" description = "Themis, the claimed homeworld of the Positronic Union, is a verdant world slowly falling \ to mass mechanization. Although there are populations of positronics living directly on the surface, \ most operate from orbital stations. IPCs living on Themis tend to be more callous than those in organic territories, \ @@ -79,8 +74,6 @@ distance = "19 light years" #undef HOME_SYSTEM_ERIDANI -#undef HOME_SYSTEM_MEOT -#undef HOME_SYSTEM_REPUBL #undef HOME_SYSTEM_EARTH_FD #undef HOME_SYSTEM_LUNA_FD diff --git a/mods/_fd/backgrounds/code/vox/code.dm b/mods/_fd/backgrounds/code/vox/code.dm new file mode 100644 index 0000000000000..5c63931e564ef --- /dev/null +++ b/mods/_fd/backgrounds/code/vox/code.dm @@ -0,0 +1,81 @@ +#define CULTURE_VOX_ACOLYTE "Resolute Acolyte" +#define CULTURE_VOX_TRUTH "Artificer of Truth" +#define CULTURE_VOX_TECHNICIAN "Sacred Technician" +#define CULTURE_VOX_LIGHT "Voidborne Vigilant" +#define CULTURE_VOX_MERCHANT "Sworn Merchant" + +#define HOME_SYSTEM_VOX_CAPITAL "Ark of the Starlight Herald" +#define HOME_SYSTEM_VOX_FORTRESS "Ark of the Stalwart Guardian" +#define HOME_SYSTEM_VOX_RESEARCH "Ark of the Curious Acolyte" +#define HOME_SYSTEM_VOX_PROCESSING "Ark of the Dutiful Blade" +#define HOME_SYSTEM_VOX_PRODUCTION "Ark of the Vigilant Prophet" + +#define FACTION_VOX_FLEET "Fleet Vox" +#define FACTION_VOX_COVENANT "Covenant Vox" +#define FACTION_VOX_ARK "Ark Vox" + +#define RELIGION_VOX_CODEX "Chakala, The Immortal Codex" +#define RELIGION_VOX_GUARDIAN "Kihikihi, The Watchful Guardian" +#define RELIGION_VOX_FORCE "Kritika, The Unrelenting Force" + +#define CULTURE_VOX_FD list(CULTURE_VOX_ACOLYTE, \ + CULTURE_VOX_TRUTH, \ + CULTURE_VOX_TECHNICIAN, \ + CULTURE_VOX_LIGHT, \ + CULTURE_VOX_MERCHANT \ +) + +#define HOME_SYSTEM_VOX_FD list(HOME_SYSTEM_VOX_CAPITAL, \ + HOME_SYSTEM_VOX_FORTRESS, \ + HOME_SYSTEM_VOX_RESEARCH, \ + HOME_SYSTEM_VOX_PROCESSING, \ + HOME_SYSTEM_VOX_PRODUCTION, \ +) + +#define FACTION_VOX_FD list(FACTION_VOX_FLEET, \ + FACTION_VOX_COVENANT, \ + FACTION_VOX_ARK, \ +) + +#define RELIGION_VOX_FD list(RELIGION_VOX_CODEX, \ + RELIGION_VOX_GUARDIAN, \ + RELIGION_VOX_FORCE, \ +) + +// Debug + +/datum/species/vox/New() + ..() + available_cultural_info = list( + TAG_CULTURE = list( + CULTURE_VOX_ACOLYTE, + CULTURE_VOX_TRUTH, + CULTURE_VOX_TECHNICIAN, + CULTURE_VOX_LIGHT, + CULTURE_VOX_MERCHANT + ), + TAG_HOMEWORLD = list( + HOME_SYSTEM_VOX_CAPITAL, + HOME_SYSTEM_VOX_FORTRESS, + HOME_SYSTEM_VOX_RESEARCH, + HOME_SYSTEM_VOX_PROCESSING, + HOME_SYSTEM_VOX_PRODUCTION + ), + TAG_FACTION = list( + FACTION_VOX_FLEET, + FACTION_VOX_COVENANT, + FACTION_VOX_ARK + ), + TAG_RELIGION = list( + RELIGION_VOX_CODEX, + RELIGION_VOX_GUARDIAN, + RELIGION_VOX_FORCE + ) + ) + +/* + available_cultural_info[TAG_CULTURE] = CULTURE_VOX_FD + available_cultural_info[TAG_HOMEWORLD] = HOME_SYSTEM_VOX_FD + available_cultural_info[TAG_FACTION] = FACTION_VOX_FD + available_cultural_info[TAG_RELIGION] = RELIGION_VOX_FD +*/ diff --git a/mods/_fd/backgrounds/code/vox/culture.dm b/mods/_fd/backgrounds/code/vox/culture.dm new file mode 100644 index 0000000000000..c7ca97aed5ffb --- /dev/null +++ b/mods/_fd/backgrounds/code/vox/culture.dm @@ -0,0 +1,59 @@ +/singleton/cultural_info/culture/vox_fd + name = CULTURE_VOX_ACOLYTE + description = "You are a Resolute Acolyte, and you have kept alive the flame of the Auralis, blessed may they be. \ + In the Great Collapse, your kin had forgotten their origin, but the Covenant of Truth which you serve has brought sanctity and purpose to their existence once more. \ + If you serve Chakala, you likely promote most heavily the advancement of the sciences to grow ever closer to the Auralis and to understand their plans for their divine children, the Vox. \ + If you serve Kihikihi, you likely promote new understandings and kinship, even in unexpected places. \ + Finally, as an Acolyte of Kritika, you promote Vox dominance of the galaxy, using a combination of military force and tactful alliance with the worthy. \ + Acolyte experience with aliens can vary based on assignment." + hidden_from_codex = TRUE + language = LANGUAGE_VOX + secondary_langs = list( + LANGUAGE_HUMAN_EURO, + LANGUAGE_SPACER, + LANGUAGE_GUTTER, + LANGUAGE_SIGN + ) + +/singleton/cultural_info/culture/vox_fd/truth + name = CULTURE_VOX_TRUTH + description = "You are an Artificer of Truth, and you know that your kin cannot survive on salvage alone, not just due to their number but their needs. \ + You are a skilled laborer or create what is needed by your kin, and can most often be found aboard the sacred arks of the Auralis. \ + You have had a long service in the arts, or the raising of livestock, or crafting the living weapons of your blood. \ + From music to tools to meals, you know that for the Vox to survive so must their culture, and it must continue to create and evolve. \ + You are an essential part of this, but in your tireless works you experience little of the information or events outside the comforting walls of the arks. \ + Your claws find purchase outside your regular home as you have been called to service for your kin." + +/singleton/cultural_info/culture/vox_fd/tech + name = CULTURE_VOX_TECHNICIAN + description = "In the times before the Great Collapse, during the Era of Decay which has only so recently come to a close, and in these times of revival, one thing remains true above all else; without the work of the Sacred Technicians, your kin would be lost. \ + Ranging from the salvage technician to the biotechnician, that which was left by the Auralis and made after by the Vox require constant maintenance. \ + Among your kin, you are one who is most skilled in stripping salvage from dead ships and ruins, and not just maintaining but improving upon the sacred Auralis technology. \ + Your experience with Non-Vox is mostly with spacers and colonists, with mixed results. Sanctified in oil and armed with wrench and steel, you halt entropy itself. \ + The stars will die before the arks." + +/singleton/cultural_info/culture/vox_fd/light + name = CULTURE_VOX_LIGHT + description = "You are a Voidborne Vigilant, and you know this to be true; to be Vox is to be an enemy of those who covet the arks and their untold miracles of eons dead. \ + You have served extensively aboard the ark fleets, massive sacred naval assemblies safeguarding each artifact-world in their voidborne flight. \ + Your experience with outsiders comes twofold, in the Novalis and the Heretic. \ + The Novalis are Non-Vox who have proven their loyalty and kinship to your people, and earned the honor of serving aboard the ships of the fleet. \ + They are often spacers or of the lower-class of their societies, and easily find their feet on both repurposed frigates and bioship cruisers. \ + To the Heretic, from the SAARE mercenaries to the Kharmanni purifiers, you give the blessing of silence. \ + Not once has a Non-Vox found purchase aboard the Arks, and this will remain true." + +/singleton/cultural_info/culture/vox_fd/merch + name = CULTURE_VOX_MERCHANT + description = "You are a sworn merchant of the Vox, skilled in matters of trade and speechcraft. \ + Out of all your kin, you see and interact the most with aliens such as humans, skrell, unathi and untold more. \ + Your family of fifty odd billion have no need for currency amongst each other, but to exist among the Non-Vox is to have the means to barter and haggle, which means an eye for appraisal and a tongue for parlay. \ + Of your surviving people, you know the most of matters outside the arks and their vigilant fleets. \ + Colonial rebels, skrellian pirate kings, human political groups, through your work with these outsiders and the mercantile grapevine, you supply your kin with vital intel and trade what is not needed among your people for what is needed. \ + Honor is found in all services." + + +#undef CULTURE_VOX_ACOLYTE +#undef CULTURE_VOX_TRUTH +#undef CULTURE_VOX_TECHNICIAN +#undef CULTURE_VOX_LIGHT +#undef CULTURE_VOX_MERCHANT diff --git a/mods/_fd/backgrounds/code/vox/factions.dm b/mods/_fd/backgrounds/code/vox/factions.dm new file mode 100644 index 0000000000000..a772601732209 --- /dev/null +++ b/mods/_fd/backgrounds/code/vox/factions.dm @@ -0,0 +1,26 @@ +/singleton/cultural_info/faction/vox_fd + name = FACTION_VOX_FLEET + description = "The Ark Fleets are massive martial assemblies, consisting of modern vessels both Vox-made and otherwise, with the rare bio-tech ship. \ + These ships can range from shuttles to city sized battleships. \ + Non-Vox who have proven themselves trustworthy may earn the title of Novalis, and the honor of serving among the crews of these craft. \ + Fleet Vox are highly disciplined even by standards of their kin, defending their homes from greedy pirates, amoral mercenaries, hostile empires and opportunistic salvagers. \ + They have the most experience with the rest of the galaxy." + hidden_from_codex = TRUE + +/singleton/cultural_info/faction/vox_fd/covenant + name = FACTION_VOX_COVENANT + description = "The Covenant of Truth keeps lit the flame of the Auralis, ensuring their memory lives and their teachings followed by their crafted children, the Vox. \ + The makers had taught them both to take pride in their works, yet to remember their place and scale in the vast galaxy. \ + Acolytes of the Covenant are responsible for reviving the faith of the Auralis, communing with what remains of their once living Gods through arcane technology and ritual for guidance and how to properly honor their intentions. \ + They believe in divine purpose, and foretell the return of the Auralis." + +/singleton/cultural_info/faction/vox_fd/ark + name = FACTION_VOX_ARK + description = "The majority of Vox live on and serve the arkships. \ + This includes artificers creating all that their civilization requires, acolytes keeping alive the flame of the Auralis, technicians maintaining the arcane works of eons past, merchants serving supply needs as they rejoin and depart for their duties beyond home and warriors that defend the sacred home worlds from any outside threat. \ + Ark Vox are the closest their society has to civilians, living with a degree of ease and comfort, assured by the Apex guiding their construct world and the Ark Admiral that leads matters of local state." + + +#undef FACTION_VOX_FLEET +#undef FACTION_VOX_COVENANT +#undef FACTION_VOX_ARK diff --git a/mods/_fd/backgrounds/code/vox/location.dm b/mods/_fd/backgrounds/code/vox/location.dm new file mode 100644 index 0000000000000..a38391ffede4c --- /dev/null +++ b/mods/_fd/backgrounds/code/vox/location.dm @@ -0,0 +1,49 @@ +/singleton/cultural_info/location/vox_fd + name = HOME_SYSTEM_VOX_CAPITAL + description = "The Ark of the Starlight Herald is the capital ark of the Vox Fleets, its Apex the first to commune with the faithful and to rekindle activity from the stagnant centuries since the loss of the Auralis. \ + It holds the most populous districts and over fifteen billion Vox at any given time, its fleet being the strongest and assembled of only the most skilled veterans of countless wars past. \ + From the most sacred halls of the construct world the Archon commands, the leader of the military junta of ark admirals, an Armalis twice the size of their contemporaries, and who commands all Vox in their wisdom. \ + It is the most holy of the arks, and all are expected to make regular pilgrimages to its blessed halls, temples found at nearly every corner of its polished halls. \ + It is a great honor to both live and serve aboard the Ark of the Starlight Herald, and nearly all Vox aspire to this goal." + ruling_body = "the Apex" + distance = "multiple systems" + hidden_from_codex = TRUE + +/singleton/cultural_info/location/vox_fd/fortress + name = HOME_SYSTEM_VOX_FORTRESS + description = "The Ark of the Stalwart Guardian is a heavily fortified ark of the Vox Fleets, its Apex defensive in both its administration and its calculation of potential outcomes. \ + Through their deliberation, the fleets have been assembled and armed, ancient fleet doctrine and training returning to the Vox from eons long past. \ + While a place of warmth and home as all arks are, a certain pride and rigid nature is inherent to those serving the machinations of the Stalwart Guardian and the scarred ark admiral serving by their side, a hobbled primalis with two cracked eyes, who has dealt with many of the species of the galaxy before their appointment. \ + At any given time, the population of this ark is about eight billion, and many return to its decks for retraining of skills long lost. \ + The halls are clean, the artisans of its district centers collected and proper in the presentation of their creations to the general crew. \ + All aboard the Ark of the Stalwart Guardian are expected to train diligently in combat, to maintain a ready state for whatever new fate the galaxy may cast." + +/singleton/cultural_info/location/vox_fd/research + name = HOME_SYSTEM_VOX_RESEARCH + description = "The Ark of the Curious Acolyte is as all arks, led by the Apex it takes name from, the Curious Acolyte. \ + This Apex is of the remaining quintet the most caught in its own machinations, diving ever deeper into personal research and directing their Ark Admiral to new archeo-tech digs from the ancient sites of industry and science it recalls in deep thought. \ + The resident Ark Admiral is a Primalis with extensive augmentation, possessing their original body from first its cortical stack was activated, with ark-made legs, arms, and two of their three eyes replacing the original. \ + Holding an average at most times of seven billion Vox, most research projects and archeological digs are conducted by this traveling world and its attached fleet, with an abnormal amount of research districts and the majority of ark-made prosthetics and rediscovered technology coming from its halls. \ + Its fleet is known to conduct cooperative tech digs with outsiders on occasion." + +/singleton/cultural_info/location/vox_fd/processing + name = HOME_SYSTEM_VOX_PROCESSING + description = "The Ark of the Dutiful Blade is the processing center of most salvage and raw ore collected by the Vox Fleets, its population holding at any given time thirteen billion Vox, the second most populous of the artifact-worlds. \ + Many honor this ark as the beating heart of Vox industry, which produces the vast majority of resources for itself and the rest as its many technicians repurpose and deconstruct what the fleets bring in, melting down scrap and ore for new materials. \ + The Ark Admiral serving as the Dutiful Blades personal claw is an Armalis clad in the distinctive bronze salvage suits of its technicians, known for their perfected appraisal of alien tech and ability to find the most value possible from a pile of tangled debris. \ + This Ark holds not just the majority of technicians, but has a notable amount of decks dedicated to a merchant sub-fleet, constantly departing with what the arks have no need for, and returning with holds full of supply." + +/singleton/cultural_info/location/vox_fd/production + name = HOME_SYSTEM_VOX_PRODUCTION + description = "The Ark of the Vigilant Prophet is the heart of production among the relic-worlds, where great barges of ore, massive spools of wire, crates of biomass are fed to the hungry forges of the most calculating Apex, the Vigilant Prophet. \ + Here the majority of newly forged starships take flight, and Quill-Captains make berths to unload that which they cannot use, and take what is needed for the long voyages away from the warmth of the home fleets. \ + Biomatter, both the vacuum-sealed from Zeng-Hu laboratories to the raw flesh of slaughtered space carp, the scraps of exotic matter from abandoned foreign mines to entire space hulks drifting in the void, all feeds the ever gnawing heart of the Vigilant Prophets maw of industry. \ + New biotech ships are born here, given life and sapience, and crews to make their new family-band. \ + It is the largest shipyard of the Vox, much of the ark dedicated to general production and naval industry." + + +#undef HOME_SYSTEM_VOX_CAPITAL +#undef HOME_SYSTEM_VOX_FORTRESS +#undef HOME_SYSTEM_VOX_RESEARCH +#undef HOME_SYSTEM_VOX_PROCESSING +#undef HOME_SYSTEM_VOX_PRODUCTION diff --git a/mods/_fd/backgrounds/code/vox/religion.dm b/mods/_fd/backgrounds/code/vox/religion.dm new file mode 100644 index 0000000000000..da68d9fb5331f --- /dev/null +++ b/mods/_fd/backgrounds/code/vox/religion.dm @@ -0,0 +1,29 @@ +/singleton/cultural_info/religion/vox_fd/codex + name = RELIGION_VOX_CODEX + description = "During the fall of the Auralis' grand federation, the risk of their collective knowledge being lost was high. \ + However, of the Auralis who did all they could to preserve their technology, she did the most; having kept alive for the Vox the ways of biotechnology, \ + and saving the five sacred arks from the calamity which destroyed all others. Those who follow Chakala believe the way forward for the Vox \ + is the discovery of science both old and new. Their symbol is a golden trinity of eyes." + hidden_from_codex = TRUE + +/singleton/cultural_info/religion/vox_fd/guardian + name = RELIGION_VOX_GUARDIAN + description = "The Auralis are gone, this fact is not denied by the Vox in but one exceptional circumstance. \ + Kihikihi the Watchful is debated to either protect their children from either this plane of reality or another. \ + What is not debated, however, is the miraculous events he has performed to save his children. \ + Some claim to have witnessed Kihikihi in their dying breaths, a comforting claw placed on their shoulder as their sleeve passed on. \ + The symbol of Kihikihi is a lone feather, glowing bright blue." + hidden_from_codex = TRUE + +/singleton/cultural_info/religion/vox_fd/force + name = RELIGION_VOX_FORCE + description = "The Auralis responsible for the unification of the galaxy through both diplomatic might and application of military strength. \ + Kritika was one of the fiercest warriors of the Auralis, and after the loss of their blade wing continued to serve with brilliance in both command and diplomacy. \ + Those who follow Kritika ascribe to the belief that a true warrior is not just physically powerful, but clever. \ + His symbol is an outstretched claw, talons wide and embossed over an open flame." + hidden_from_codex = TRUE + + +#undef RELIGION_VOX_CODEX +#undef RELIGION_VOX_GUARDIAN +#undef RELIGION_VOX_FORCE diff --git a/mods/_fd/expanded_traders/README.md b/mods/_fd/expanded_traders/README.md new file mode 100644 index 0000000000000..0f32408d2d170 --- /dev/null +++ b/mods/_fd/expanded_traders/README.md @@ -0,0 +1,79 @@ + +#### Список PRов: + +- https://github.com/SierraBay/SierraBay12/pull/##### + + + +## Мод-пример + +ID мода: EXAMPLE + + +### Описание мода + +Этот мод служит примером для разработчиков и существует лишь для того, +чтобы его можно было легко скопировать и вставить в другое место. + + +### Изменения *кор кода* + +- `code/modules/mob/living.dm`: `proc/overriden_proc`, `var/overriden_var` + + +### Оверрайды + +- `mods/_master_files/sound/my_cool_sound.ogg` +- `mods/_master_files/code/my_modular_override.dm`: `proc/overriden_proc`, `var/overriden_var` + + +### Дефайны + +- `code/__defines/~mods/example.dm`: `EXAMPLE_SPEED_MULTIPLIER`, `EXAMPLE_SPEED_BASE` + + +### Используемые файлы, не содержащиеся в модпаке + +- `mods/_master_files/icons/obj/alien.dmi` + + +### Авторы: + +Твой никнейм + diff --git a/mods/_fd/expanded_traders/_expanded_traders.dm b/mods/_fd/expanded_traders/_expanded_traders.dm new file mode 100644 index 0000000000000..51a198634b882 --- /dev/null +++ b/mods/_fd/expanded_traders/_expanded_traders.dm @@ -0,0 +1,4 @@ +/singleton/modpack/example + name = "Expanded Traders" + desc = "Расширенная и переработанная механика торговли" + author = "Doctor Alex" diff --git a/mods/_fd/expanded_traders/_expanded_traders.dme b/mods/_fd/expanded_traders/_expanded_traders.dme new file mode 100644 index 0000000000000..8433bd2cc38be --- /dev/null +++ b/mods/_fd/expanded_traders/_expanded_traders.dme @@ -0,0 +1,10 @@ +#ifndef MODPACK_EXPANDED_TRADERS +#define MODPACK_EXPANDED_TRADERS + +#include "_expanded_traders.dm" + +#include "code/ai.dm" + +#include "code/preset_console.dm" + +#endif diff --git a/mods/_fd/expanded_traders/code/ai.dm b/mods/_fd/expanded_traders/code/ai.dm new file mode 100644 index 0000000000000..310d7eeb7f189 --- /dev/null +++ b/mods/_fd/expanded_traders/code/ai.dm @@ -0,0 +1,140 @@ +/datum/trader/trading_beacon/engineering + origin = "Инженерный Маяк" + + possible_trading_items = list(/obj/machinery/portable_atmospherics/canister/nitrogen = TRADER_THIS_TYPE, + /obj/machinery/portable_atmospherics/canister/oxygen = TRADER_THIS_TYPE, + /obj/machinery/portable_atmospherics/canister/hydrogen = TRADER_THIS_TYPE, + /obj/machinery/portable_atmospherics/canister/phoron = TRADER_THIS_TYPE, + /obj/machinery/portable_atmospherics/canister/carbon_dioxide = TRADER_THIS_TYPE, + /obj/machinery/portable_atmospherics/canister/air = TRADER_THIS_TYPE, + /obj/machinery/portable_atmospherics/canister/helium = TRADER_THIS_TYPE, + /obj/machinery/portable_atmospherics/canister/methyl_bromide = TRADER_THIS_TYPE, + /obj/machinery/portable_atmospherics/canister/chlorine = TRADER_THIS_TYPE, + /obj/item/storage/toolbox/syndicate = TRADER_THIS_TYPE, + /obj/item/stock_parts/scanning_module/adv = TRADER_THIS_TYPE, + /obj/item/stock_parts/manipulator/pico = TRADER_THIS_TYPE, + /obj/item/stock_parts/micro_laser/high = TRADER_THIS_TYPE, + /obj/item/stock_parts/matter_bin/adv = TRADER_THIS_TYPE, + /obj/item/stock_parts/capacitor/adv = TRADER_THIS_TYPE, + /obj/item/stack/material/aluminium/fifty = TRADER_THIS_TYPE, + /obj/item/stack/material/steel/fifty = TRADER_THIS_TYPE, + /obj/item/stack/material/plasteel/fifty = TRADER_THIS_TYPE, + /obj/item/stack/material/wood/fifty = TRADER_THIS_TYPE, + /obj/item/stack/material/glass/reinforced/fifty = TRADER_THIS_TYPE, + /obj/item/stack/material/glass/fifty = TRADER_THIS_TYPE, + /obj/item/clothing/glasses/material = TRADER_THIS_TYPE, + /obj/item/material/knife/folding/swiss/engineer = TRADER_THIS_TYPE, + /obj/item/inflatable_dispenser = TRADER_THIS_TYPE, + /obj/item/taperoll/engineering = TRADER_THIS_TYPE, + /obj/item/tank/jetpack/carbondioxide = TRADER_THIS_TYPE, + /obj/item/tank/air = TRADER_THIS_TYPE, + /obj/item/welder_tank/huge = TRADER_THIS_TYPE, + /obj/structure/reagent_dispensers/fueltank = TRADER_THIS_TYPE + ) + + +/datum/trader/trading_beacon/starter + possible_wanted_items = list(/obj/item/device/ = TRADER_SUBTYPES_ONLY, + /obj/item/device/tape/random = TRADER_BLACKLIST, + /obj/item/device/assembly = TRADER_BLACKLIST_ALL, + /obj/item/device/assembly_holder = TRADER_BLACKLIST_ALL, + /obj/item/device/encryptionkey/syndicate = TRADER_BLACKLIST, + /obj/item/tank/phoron/onetankbomb = TRADER_BLACKLIST, + /obj/item/device/radio = TRADER_BLACKLIST_ALL, + /obj/item/modular_computer/pda = TRADER_BLACKLIST_SUB, + /obj/item/device/uplink = TRADER_BLACKLIST, + /obj/item/stack/material/phoron = TRADER_ALL) + possible_trading_items = list(/obj/item/storage/bag = TRADER_SUBTYPES_ONLY, + /obj/item/storage/bag/cash/infinite = TRADER_BLACKLIST, + /obj/item/storage/backpack = TRADER_SUBTYPES_ONLY, + /obj/item/storage/backpack/cultpack = TRADER_BLACKLIST, + /obj/item/storage/backpack/holding = TRADER_BLACKLIST, + /obj/item/storage/backpack/satchel/grey/withwallet = TRADER_BLACKLIST, + /obj/item/storage/backpack/satchel/syndie_kit = TRADER_BLACKLIST_ALL, + /obj/item/storage/backpack/chameleon = TRADER_BLACKLIST, + /obj/item/storage/backpack/ert = TRADER_BLACKLIST_ALL, + /obj/item/storage/backpack/dufflebag/syndie = TRADER_BLACKLIST_SUB, + /obj/item/gun/energy/lasertag = TRADER_SUBTYPES_ONLY, + /obj/item/storage/briefcase = TRADER_THIS_TYPE, + /obj/item/device/bot_kit = TRADER_THIS_TYPE, + /obj/item/book = TRADER_SUBTYPES_ONLY, + /obj/item/device/scanner = TRADER_SUBTYPES_ONLY, + /obj/item/storage/fancy = TRADER_SUBTYPES_ONLY, + /obj/item/storage/secure/briefcase = TRADER_THIS_TYPE, + /obj/item/storage/plants = TRADER_THIS_TYPE, + /obj/item/storage/ore = TRADER_SUBTYPES_ONLY, + /obj/item/storage/lunchbox = TRADER_SUBTYPES_ONLY, + /obj/item/storage/mre = TRADER_SUBTYPES_ONLY, + /obj/item/storage/toolbox = TRADER_SUBTYPES_ONLY, + /obj/item/storage/wallet = TRADER_THIS_TYPE, + /obj/item/storage/photo_album = TRADER_THIS_TYPE, + /obj/item/mag_table_plate = TRADER_THIS_TYPE, + /obj/item/clothing/glasses = TRADER_SUBTYPES_ONLY, + /obj/item/clothing/glasses/hud = TRADER_BLACKLIST_ALL, + /obj/item/clothing/glasses/blindfold/tape = TRADER_BLACKLIST, + /obj/item/clothing/glasses/chameleon = TRADER_BLACKLIST, + /obj/item/stack/material/glass = TRADER_SUBTYPES_ONLY, + /obj/item/stack/material/iron = TRADER_SUBTYPES_ONLY, + /obj/item/stack/material/sandstone = TRADER_SUBTYPES_ONLY, + /obj/item/stack/material/marble = TRADER_SUBTYPES_ONLY, + /obj/item/stack/material/diamond = TRADER_SUBTYPES_ONLY, + /obj/item/stack/material/uranium = TRADER_SUBTYPES_ONLY, + /obj/item/stack/material/phoron = TRADER_SUBTYPES_ONLY, + /obj/item/stack/material/plastic = TRADER_SUBTYPES_ONLY, + /obj/item/stack/material/gold = TRADER_SUBTYPES_ONLY, + /obj/item/stack/material/silver = TRADER_SUBTYPES_ONLY, + /obj/item/stack/material/platinum = TRADER_SUBTYPES_ONLY, + /obj/item/stack/material/mhydrogen = TRADER_SUBTYPES_ONLY, + /obj/item/stack/material/tritium = TRADER_SUBTYPES_ONLY, + /obj/item/stack/material/osmium = TRADER_SUBTYPES_ONLY, + /obj/item/stack/material/steel = TRADER_SUBTYPES_ONLY, + /obj/item/stack/material/plasteel = TRADER_SUBTYPES_ONLY, + /obj/machinery/mining = TRADER_SUBTYPES_ONLY, + /obj/structure/AIcore = TRADER_THIS_TYPE, + /obj/structure/mopbucket = TRADER_THIS_TYPE, + /obj/structure/ore_box = TRADER_THIS_TYPE, + /obj/structure/coatrack = TRADER_THIS_TYPE, + /obj/item/bee_pack = TRADER_THIS_TYPE, + /obj/item/bee_smoker = TRADER_THIS_TYPE, + /obj/item/beehive_assembly = TRADER_THIS_TYPE, + /obj/item/honey_frame = TRADER_THIS_TYPE, + /obj/structure/dispenser = TRADER_SUBTYPES_ONLY, + /obj/structure/filingcabinet = TRADER_THIS_TYPE, + /obj/structure/safe = TRADER_THIS_TYPE, + /obj/structure/plushie = TRADER_SUBTYPES_ONLY, + /obj/item/a_gift = TRADER_THIS_TYPE, + /obj/item/contraband/poster = TRADER_THIS_TYPE, + /obj/item/storage/pill_bottle/bicaridine = TRADER_THIS_TYPE, + /obj/item/storage/pill_bottle/kelotane = TRADER_THIS_TYPE, + /obj/item/storage/pill_bottle/dylovene = TRADER_THIS_TYPE, + /obj/item/storage/pill_bottle/dexalin = TRADER_THIS_TYPE, + /obj/item/storage/pill_bottle/citalopram = TRADER_THIS_TYPE + + ) + +/datum/trader/trading_beacon/starter/select_spawn_location() + var/turf/torch = get_turf(locate(/obj/overmap/visitable/ship/torch)) + if(!torch) + stack_trace("TORCH NOT FOUND IN trading_beacon/starter/select_spawn_location()") + return ..() + + var/list/turfs = orange(2, torch) + for(var/turf/T in shuffle(turfs)) + var/valid = TRUE + for(var/obj/overmap/event/E in T) + if(E) + valid = FALSE + break + for(var/obj/overmap/trading/M in T) + if(M) + valid = FALSE + break + for(var/obj/overmap/visitable/V in T) + if(V) + valid = FALSE + break + if(valid) + return T + + stack_trace("NO ROOM FOR THE /datum/trader/trading_beacon/starter, PLACING ON DEFAULT LOCATION") + return ..() diff --git a/mods/_fd/expanded_traders/code/preset_console.dm b/mods/_fd/expanded_traders/code/preset_console.dm new file mode 100644 index 0000000000000..007c89dc78677 --- /dev/null +++ b/mods/_fd/expanded_traders/code/preset_console.dm @@ -0,0 +1,6 @@ +/obj/machinery/computer/modular/preset/merchant/ignore_distance + default_software = list( + /datum/computer_file/program/merchant/ignore_distance, + /datum/computer_file/program/email_client, + /datum/computer_file/program/wordprocessor + )