From 1f533dcceb762356645343d6d65204d862bdecf1 Mon Sep 17 00:00:00 2001 From: LDip999 Date: Sat, 28 Feb 2026 01:15:29 +0100 Subject: [PATCH 01/16] some initial work --- modular_causticcove/__DEFINES/supplies.dm | 7 + .../code/modules/supplies/supplies.dm | 0 .../code/modules/supplies/supplyface.dm | 23 ++ .../code/modules/supplies/supplyface_datum.dm | 13 + .../code/modules/supplies/supplymail.dm | 11 + .../code/modules/supplies/voucher.dm | 7 + modular_causticcove/icons/items/supplies.dmi | Bin 0 -> 428 bytes roguetown.dme | 244 +++++++++--------- tgui/packages/tgui/interfaces/Supplies.js | 27 ++ 9 files changed, 213 insertions(+), 119 deletions(-) create mode 100644 modular_causticcove/__DEFINES/supplies.dm create mode 100644 modular_causticcove/code/modules/supplies/supplies.dm create mode 100644 modular_causticcove/code/modules/supplies/supplyface.dm create mode 100644 modular_causticcove/code/modules/supplies/supplyface_datum.dm create mode 100644 modular_causticcove/code/modules/supplies/supplymail.dm create mode 100644 modular_causticcove/code/modules/supplies/voucher.dm create mode 100644 modular_causticcove/icons/items/supplies.dmi create mode 100644 tgui/packages/tgui/interfaces/Supplies.js diff --git a/modular_causticcove/__DEFINES/supplies.dm b/modular_causticcove/__DEFINES/supplies.dm new file mode 100644 index 00000000000..0d842439713 --- /dev/null +++ b/modular_causticcove/__DEFINES/supplies.dm @@ -0,0 +1,7 @@ +#define SUPPLY_TIER_SLOP "budget" +#define SUPPLY_TIER_COMMON "common" +#define SUPPLY_TIER_GOOD "good" +#define SUPPLY_TIER_EXCELLENT "excellent" +#define SUPPLY_TIER_RESERVE "royal reserve" + + diff --git a/modular_causticcove/code/modules/supplies/supplies.dm b/modular_causticcove/code/modules/supplies/supplies.dm new file mode 100644 index 00000000000..e69de29bb2d diff --git a/modular_causticcove/code/modules/supplies/supplyface.dm b/modular_causticcove/code/modules/supplies/supplyface.dm new file mode 100644 index 00000000000..7732c4ae7e5 --- /dev/null +++ b/modular_causticcove/code/modules/supplies/supplyface.dm @@ -0,0 +1,23 @@ +/obj/structure/roguemachine/supplyface + name = "SUPPLYFACE" + desc = "A specialized goldface, which, instead of paying with coins, accepts favours from the Azurian Mercenary's Guild." + var/datum/supplyfacedatum/sfd + +/obj/structure/roguemachine/supplyface/Initialize() + . = ..() + sfd = new() + sfd.parent = src + +/obj/structure/roguemachine/supplyface/attackby(obj/item/P, mob/user, params) + if(istype(P, /obj/item/voucher/quest)) + sfd.favours += 1 + playsound(loc, 'sound/misc/machinevomit.ogg', 100, TRUE, -1) + say("Genuine voucher accepted!") + +/obj/structure/roguemachine/supplyface/attack_hand(mob/living/user) + var/datum/job/mob_job = user.job ? SSjob.GetJob(user.job) : null + if(istype(mob_job, /datum/job/roguetown/merchant)) + sfd.ui_interact(user) + else + say(user.name + " is not authorized as a merchant. This incident will be reported.") + return diff --git a/modular_causticcove/code/modules/supplies/supplyface_datum.dm b/modular_causticcove/code/modules/supplies/supplyface_datum.dm new file mode 100644 index 00000000000..3c91f46512e --- /dev/null +++ b/modular_causticcove/code/modules/supplies/supplyface_datum.dm @@ -0,0 +1,13 @@ +/datum/supplyfacedatum + var/obj/structure/roguemachine/supplyface/parent + var/favours = 1 + var/cooldown = 0 + + +/datum/supplyfacedatum/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Supplies", "Order Supplies") + ui.open() + + diff --git a/modular_causticcove/code/modules/supplies/supplymail.dm b/modular_causticcove/code/modules/supplies/supplymail.dm new file mode 100644 index 00000000000..d1deeef4766 --- /dev/null +++ b/modular_causticcove/code/modules/supplies/supplymail.dm @@ -0,0 +1,11 @@ +/datum/supply_mail + var/name = "Number fifteen: Burger Duke Foot Cabbage" + var/desc = "If you see this let Mia know..." + var/cost = 0 + var/supply_tier = SUPPLY_TIER_SLOP + var/list/contents = list( + /obj/item/reagent_containers/food/snacks/grown/cabbage/rogue + ) + + + diff --git a/modular_causticcove/code/modules/supplies/voucher.dm b/modular_causticcove/code/modules/supplies/voucher.dm new file mode 100644 index 00000000000..8ccf476b48c --- /dev/null +++ b/modular_causticcove/code/modules/supplies/voucher.dm @@ -0,0 +1,7 @@ +/obj/item/voucher + icon = 'modular_causticcove/icons/items/supplies.dmi' + icon_state = "voucher" + +/obj/item/voucher/quest + name = "Mercenaries' Guild voucher" + desc = "A voucher issued by the Mercenary's Guild, a little ticket representing an owed favour. Can be used for calling in special missions!" diff --git a/modular_causticcove/icons/items/supplies.dmi b/modular_causticcove/icons/items/supplies.dmi new file mode 100644 index 0000000000000000000000000000000000000000..5a854299ec2e63786087f5e21c5b26168e860bd2 GIT binary patch literal 428 zcmV;d0aN~oP)V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+ z(=$pSoZ^zil2jm5sVu)VIU}`5iHkEOv#1y-V#vjrR+N~V3SlcNxca$(4F&*w#2W`z z%VTo@008_+L_t(|oMT`Z1*2dTPzk(0+VYwy{EvV>1Ivet41(4*B$-LE17McJ z0I7~(qSOIE%TV|r$B+^oWIF(A2?#TaYWtGy2(qF8IoP3=gUtE=`s!vBb;Lvm$qqn| zb4ndSQWU@}M-OtSr5Mpc)eyktb7UVQhXhbPQMrLA2M}X97Do^T2u1;x1P2B%%Ryqu z;vk=s0`R&N-EwR`Mh4`Rgm^;$WEjX$5J0!Q!zcudDY2ZO1JE4-0_Zt_63an=>|7wC z { + const { act, data } = useBackend(); + + return( + + + + + + + + + + ); +} From 2e6c61616cbb9021c40335b90b7f112f44639686 Mon Sep 17 00:00:00 2001 From: LDip999 Date: Sat, 28 Feb 2026 20:23:16 +0100 Subject: [PATCH 02/16] slop part 2 --- .../code/modules/supplies/supplyface.dm | 2 +- .../code/modules/supplies/supplymail.dm | 3 + .../supplymails/supplymail_ingredients.dm | 133 ++++++++++++++++++ .../supplymails/supplymail_merchant.dm | 41 ++++++ roguetown.dme | 2 + 5 files changed, 180 insertions(+), 1 deletion(-) create mode 100644 modular_causticcove/code/modules/supplies/supplymails/supplymail_ingredients.dm create mode 100644 modular_causticcove/code/modules/supplies/supplymails/supplymail_merchant.dm diff --git a/modular_causticcove/code/modules/supplies/supplyface.dm b/modular_causticcove/code/modules/supplies/supplyface.dm index 7732c4ae7e5..dddff119452 100644 --- a/modular_causticcove/code/modules/supplies/supplyface.dm +++ b/modular_causticcove/code/modules/supplies/supplyface.dm @@ -10,7 +10,7 @@ /obj/structure/roguemachine/supplyface/attackby(obj/item/P, mob/user, params) if(istype(P, /obj/item/voucher/quest)) - sfd.favours += 1 + sfd.favours += 50 playsound(loc, 'sound/misc/machinevomit.ogg', 100, TRUE, -1) say("Genuine voucher accepted!") diff --git a/modular_causticcove/code/modules/supplies/supplymail.dm b/modular_causticcove/code/modules/supplies/supplymail.dm index d1deeef4766..d49fae44521 100644 --- a/modular_causticcove/code/modules/supplies/supplymail.dm +++ b/modular_causticcove/code/modules/supplies/supplymail.dm @@ -6,6 +6,9 @@ var/list/contents = list( /obj/item/reagent_containers/food/snacks/grown/cabbage/rogue ) + var/list/datum/job/recipents = list( + /datum/job/roguetown/merchant + ) diff --git a/modular_causticcove/code/modules/supplies/supplymails/supplymail_ingredients.dm b/modular_causticcove/code/modules/supplies/supplymails/supplymail_ingredients.dm new file mode 100644 index 00000000000..0b3f194a1f4 --- /dev/null +++ b/modular_causticcove/code/modules/supplies/supplymails/supplymail_ingredients.dm @@ -0,0 +1,133 @@ +/datum/supply_mail/alchemyingredients + recipents = list( + /datum/job/roguetown/apothecary, + /datum/job/roguetown/physician, + /datum/job/roguetown/wapprentice, + /datum/job/roguetown/magician + ) + +/datum/supply_mail/alchemyingredients/healthpot + name = "Small cache of health potion ingredients" + desc = "Some odds and ends for brewing health potions" + cost = 10 + supply_tier = SUPPLY_TIER_SLOP + contents = list( + /obj/item/alch/symphitum, + /obj/item/alch/symphitum, + /obj/item/alch/symphitum, + /obj/item/alch/symphitum, + /obj/item/alch/symphitum, + /obj/item/alch/symphitum, + /obj/item/alch/symphitum, + /obj/item/alch/symphitum, + /obj/item/alch/symphitum, + /obj/item/alch/symphitum, + /obj/item/alch/taraxacum, + /obj/item/alch/taraxacum, + /obj/item/alch/taraxacum, + /obj/item/alch/taraxacum, + /obj/item/alch/taraxacum, + /obj/item/alch/taraxacum, + /obj/item/alch/taraxacum, + /obj/item/alch/taraxacum, + /obj/item/alch/taraxacum, + /obj/item/alch/taraxacum, + + ) + + +/datum/supply_mail/alchemyingredients/healthpot + name = "Small cache of strong health potion ingredients" + desc = "Some odds and ends for brewing strong health potions" + cost = 30 + supply_tier = SUPPLY_TIER_SLOP + contents = list( + /obj/item/alch/calendula, + /obj/item/alch/calendula, + /obj/item/alch/calendula, + /obj/item/alch/calendula, + /obj/item/alch/calendula, + /obj/item/alch/calendula, + /obj/item/alch/calendula, + /obj/item/alch/calendula, + /obj/item/alch/calendula, + /obj/item/alch/calendula, + /obj/item/alch/viscera, + /obj/item/alch/viscera, + /obj/item/alch/viscera, + /obj/item/alch/viscera, + /obj/item/alch/viscera, + /obj/item/alch/viscera, + /obj/item/alch/viscera, + /obj/item/alch/viscera, + /obj/item/alch/viscera, + /obj/item/alch/viscera, + + ) + + +/datum/supply_mail/summoningingredients + recipents = list( + /datum/job/roguetown/wapprentice, + /datum/job/roguetown/magician + ) + + +/datum/supply_mail/summoningingredients/t1 + name = "Begineer's summoning supplies" + desc = "Some odds and ends for begineer summoners, enough for 4 summons of each category" + cost = 10 + supply_tier = SUPPLY_TIER_SLOP + contents = list( + /obj/item/ash, + /obj/item/ash, + /obj/item/magic/obsidian, + + /obj/item/ash, + /obj/item/ash, + /obj/item/magic/obsidian, + + /obj/item/ash, + /obj/item/ash, + /obj/item/magic/obsidian, + + /obj/item/ash, + /obj/item/ash, + /obj/item/magic/obsidian, + + /obj/item/reagent_containers/food/snacks/grown/manabloom, + /obj/item/reagent_containers/food/snacks/grown/berries/rogue, + + /obj/item/reagent_containers/food/snacks/grown/manabloom, + /obj/item/reagent_containers/food/snacks/grown/berries/rogue, + + /obj/item/reagent_containers/food/snacks/grown/manabloom, + /obj/item/reagent_containers/food/snacks/grown/berries/rogue, + + /obj/item/reagent_containers/food/snacks/grown/manabloom, + /obj/item/reagent_containers/food/snacks/grown/berries/rogue, + + /obj/item/reagent_containers/food/snacks/grown/manabloom, + /obj/item/reagent_containers/food/snacks/grown/berries/rogue, + + /obj/item/natural/stone, + /obj/item/natural/stone, + /obj/item/magic/manacrystal, + + /obj/item/natural/stone, + /obj/item/natural/stone, + /obj/item/magic/manacrystal, + + /obj/item/natural/stone, + /obj/item/natural/stone, + /obj/item/magic/manacrystal, + + /obj/item/natural/stone, + /obj/item/natural/stone, + /obj/item/magic/manacrystal, + + /obj/item/natural/stone, + /obj/item/natural/stone, + /obj/item/magic/manacrystal, + + ) diff --git a/modular_causticcove/code/modules/supplies/supplymails/supplymail_merchant.dm b/modular_causticcove/code/modules/supplies/supplymails/supplymail_merchant.dm new file mode 100644 index 00000000000..6ed7663f814 --- /dev/null +++ b/modular_causticcove/code/modules/supplies/supplymails/supplymail_merchant.dm @@ -0,0 +1,41 @@ +/datum/supply_mail/potions + name = "Small cache of potions" + desc = "A variety box of potion bottles" + cost = 50 + supply_tier = SUPPLY_TIER_COMMON + contents = list( + /obj/item/reagent_containers/glass/bottle/rogue/healthpot, + /obj/item/reagent_containers/glass/bottle/rogue/healthpot, + /obj/item/reagent_containers/glass/bottle/rogue/healthpot, + /obj/item/reagent_containers/glass/bottle/rogue/manapot, + /obj/item/reagent_containers/glass/bottle/rogue/manapot, + /obj/item/reagent_containers/glass/bottle/rogue/stampot + ) + recipents = list( + /datum/job/roguetown/merchant, + /datum/job/roguetown/shophand + ) + +/datum/supply_mail/potions/health + name = "Small cache of health potions" + desc = "5 red potions" + cost = 50 + supply_tier = SUPPLY_TIER_SLOP + contents = list( + /obj/item/reagent_containers/glass/bottle/rogue/healthpot, + /obj/item/reagent_containers/glass/bottle/rogue/healthpot, + /obj/item/reagent_containers/glass/bottle/rogue/healthpot, + /obj/item/reagent_containers/glass/bottle/rogue/healthpot, + /obj/item/reagent_containers/glass/bottle/rogue/healthpot, + ) + +/datum/supply_mail/potions/health + name = "Tiny cache of mana potions" + desc = "3 blue potions" + cost = 30 + supply_tier = SUPPLY_TIER_SLOP + contents = list( + /obj/item/reagent_containers/glass/bottle/rogue/manapot, + /obj/item/reagent_containers/glass/bottle/rogue/manapot, + /obj/item/reagent_containers/glass/bottle/rogue/manapot + ) diff --git a/roguetown.dme b/roguetown.dme index 7b262e7da9f..2913b40fafd 100644 --- a/roguetown.dme +++ b/roguetown.dme @@ -3146,6 +3146,8 @@ #include "modular_causticcove\code\modules\supplies\supplyface_datum.dm" #include "modular_causticcove\code\modules\supplies\supplymail.dm" #include "modular_causticcove\code\modules\supplies\voucher.dm" +#include "modular_causticcove\code\modules\supplies\supplymails\supplymail_ingredients.dm" +#include "modular_causticcove\code\modules\supplies\supplymails\supplymail_merchant.dm" #include "modular_causticcove\code\modules\taurs\taur_bodyparts.dm" #include "modular_causticcove\code\modules\taurs\taur_markings.dm" #include "modular_causticcove\code\modules\vices\combat_adverse.dm" From 79bba35525dd91ab01cff76bda3ae292f713625e Mon Sep 17 00:00:00 2001 From: LDip999 Date: Sun, 1 Mar 2026 20:44:53 +0100 Subject: [PATCH 03/16] More slop --- _maps/map_files/roguetest/roguetest.dmm | 6 ++- .../code/modules/supplies/supplyface.dm | 52 +++++++++++++++++-- .../code/modules/supplies/supplyface_datum.dm | 38 +++++++++++--- .../supplymails/supplymail_merchant.dm | 4 +- tgui/packages/tgui/interfaces/Supplies.js | 8 ++- 5 files changed, 93 insertions(+), 15 deletions(-) diff --git a/_maps/map_files/roguetest/roguetest.dmm b/_maps/map_files/roguetest/roguetest.dmm index 19035ce60ef..0de6c828198 100644 --- a/_maps/map_files/roguetest/roguetest.dmm +++ b/_maps/map_files/roguetest/roguetest.dmm @@ -392,6 +392,10 @@ /obj/item/seeds/wheat/oat, /turf/open/floor/rogue/grass, /area/rogue/outdoors) +"pj" = ( +/obj/structure/roguemachine/supplyface, +/turf/open/floor/rogue/grass, +/area/rogue/outdoors) "pk" = ( /obj/structure/rack/rogue/shelf/big{ icon_state = "shelf_biggest"; @@ -2974,7 +2978,7 @@ CZ yK yK rT -vq +pj rT rT rT diff --git a/modular_causticcove/code/modules/supplies/supplyface.dm b/modular_causticcove/code/modules/supplies/supplyface.dm index dddff119452..5150ebed857 100644 --- a/modular_causticcove/code/modules/supplies/supplyface.dm +++ b/modular_causticcove/code/modules/supplies/supplyface.dm @@ -1,23 +1,65 @@ /obj/structure/roguemachine/supplyface name = "SUPPLYFACE" desc = "A specialized goldface, which, instead of paying with coins, accepts favours from the Azurian Mercenary's Guild." - var/datum/supplyfacedatum/sfd + icon = 'icons/roguetown/misc/machines.dmi' + icon_state = "streetvendor1" //Placeholder :tm: + var/favours = 100 + var/cooldown = 0 /obj/structure/roguemachine/supplyface/Initialize() . = ..() - sfd = new() - sfd.parent = src /obj/structure/roguemachine/supplyface/attackby(obj/item/P, mob/user, params) if(istype(P, /obj/item/voucher/quest)) - sfd.favours += 50 + favours += 50 playsound(loc, 'sound/misc/machinevomit.ogg', 100, TRUE, -1) say("Genuine voucher accepted!") + qdel(P) /obj/structure/roguemachine/supplyface/attack_hand(mob/living/user) var/datum/job/mob_job = user.job ? SSjob.GetJob(user.job) : null if(istype(mob_job, /datum/job/roguetown/merchant)) - sfd.ui_interact(user) + say("Welcome "+ user.name + "... contact with the Mercenary's Guild estabilished.") + ui_interact(user) else say(user.name + " is not authorized as a merchant. This incident will be reported.") return + +/obj/structure/roguemachine/supplyface/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Supplies", "Order Supplies") + ui.open() + + + +/obj/structure/roguemachine/supplyface/ui_static_data(mob/user) + var/list/data = list() + data["favours"] = favours + + data["supplymails"] = list() + + data["supplymails"]["categories"] = list() + + data["supplymails"]["categories"]["Potions"] = list() + + AddSupplyMailToList(data["supplymails"]["categories"]["Potions"], /datum/supply_mail/potions) + + AddSupplyMailToList(data["supplymails"]["categories"]["Potions"], /datum/supply_mail/potions/health) + + AddSupplyMailToList(data["supplymails"]["categories"]["Potions"], /datum/supply_mail/potions/mana) + + return data + +/obj/structure/roguemachine/supplyface/proc/AddSupplyMailToList(list/appending, datum/supply_mail/sm) + appending[sm::name] = list( + "path" = sm, + "price" = sm.cost, + "desc" = sm.desc, + "tier" = sm.supply_tier, + "contents" = list(), + recipents = sm.recipents + ) + for(var/path in sm.contents) + var/atom/A = path + appending[sm::name]["contents"] += A.name + "\n" diff --git a/modular_causticcove/code/modules/supplies/supplyface_datum.dm b/modular_causticcove/code/modules/supplies/supplyface_datum.dm index 3c91f46512e..abc1953a806 100644 --- a/modular_causticcove/code/modules/supplies/supplyface_datum.dm +++ b/modular_causticcove/code/modules/supplies/supplyface_datum.dm @@ -1,13 +1,39 @@ /datum/supplyfacedatum + var/obj/structure/roguemachine/supplyface/parent - var/favours = 1 - var/cooldown = 0 + /datum/supplyfacedatum/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "Supplies", "Order Supplies") - ui.open() + +/datum/supplyfacedatum/ui_static_data(mob/user) + var/list/data = list() + //data["favous"] = favours + + data["supplymails"]["categories"] = list() + + data["supplymails"]["categories"]["Potions"] = list() + + AddSupplyMailToList(data["supplymails"]["categories"]["Potions"], /datum/supply_mail/potions) + + AddSupplyMailToList(data["supplymails"]["categories"]["Potions"], /datum/supply_mail/potions/health) + + AddSupplyMailToList(data["supplymails"]["categories"]["Potions"], /datum/supply_mail/potions/mana) + + return data + +/datum/supplyfacedatum/proc/AddSupplyMailToList(list/appending, datum/supply_mail/sm) + appending[sm::name] = list( + "path" = sm, + "price" = sm.cost, + "desc" = sm.desc, + "tier" = sm.supply_tier, + "contents" = list(), + recipents = sm.recipents + ) + for(var/path in sm.contents) + var/atom/A = path + appending[sm::name]["contents"] += A.name + "\n" + diff --git a/modular_causticcove/code/modules/supplies/supplymails/supplymail_merchant.dm b/modular_causticcove/code/modules/supplies/supplymails/supplymail_merchant.dm index 6ed7663f814..4227f88a549 100644 --- a/modular_causticcove/code/modules/supplies/supplymails/supplymail_merchant.dm +++ b/modular_causticcove/code/modules/supplies/supplymails/supplymail_merchant.dm @@ -29,10 +29,10 @@ /obj/item/reagent_containers/glass/bottle/rogue/healthpot, ) -/datum/supply_mail/potions/health +/datum/supply_mail/potions/mana name = "Tiny cache of mana potions" desc = "3 blue potions" - cost = 30 + cost = 15 supply_tier = SUPPLY_TIER_SLOP contents = list( /obj/item/reagent_containers/glass/bottle/rogue/manapot, diff --git a/tgui/packages/tgui/interfaces/Supplies.js b/tgui/packages/tgui/interfaces/Supplies.js index 53a5910ef60..ba1f7604035 100644 --- a/tgui/packages/tgui/interfaces/Supplies.js +++ b/tgui/packages/tgui/interfaces/Supplies.js @@ -12,13 +12,19 @@ import { Window } from '../layouts'; export const Supplies = (props, context) => { const { act, data } = useBackend(); + const [supply_mails] = useState(data.supplymails); return( - + { + data["favours"] + } + + + {JSON.stringify(data, null, 2)} From 9f7fc5283206130813321de7327d22d66feb516b Mon Sep 17 00:00:00 2001 From: LDip999 Date: Sat, 14 Mar 2026 22:55:30 +0100 Subject: [PATCH 04/16] Rejangles this --- code/modules/cargo/packsrogue/_rogue.dm | 2 +- .../job_types/roguetown/adventurer/trader.dm | 5 +- code/modules/roguetown/roguemachine/mail.dm | 23 ++ .../modules/supplies/travellingmerchant.dm | 118 ++++++++++ roguetown.dme | 209 +++++++++--------- tgui/packages/tgui/data_types/atom_basic.tsx | 5 + tgui/packages/tgui/data_types/datum_basic.tsx | 4 + tgui/packages/tgui/data_types/supply_pack.tsx | 8 + tgui/packages/tgui/interfaces/Hermes.tsx | 64 +++++- .../tgui/interfaces/common/InputButtons.tsx | 2 +- .../interfaces/common/SupplyPackStack.tsx | 92 ++++++++ 11 files changed, 418 insertions(+), 114 deletions(-) create mode 100644 modular_causticcove/code/modules/supplies/travellingmerchant.dm create mode 100644 tgui/packages/tgui/data_types/atom_basic.tsx create mode 100644 tgui/packages/tgui/data_types/datum_basic.tsx create mode 100644 tgui/packages/tgui/data_types/supply_pack.tsx create mode 100644 tgui/packages/tgui/interfaces/common/SupplyPackStack.tsx diff --git a/code/modules/cargo/packsrogue/_rogue.dm b/code/modules/cargo/packsrogue/_rogue.dm index 888fcb56e50..0e1b150b9ea 100644 --- a/code/modules/cargo/packsrogue/_rogue.dm +++ b/code/modules/cargo/packsrogue/_rogue.dm @@ -11,4 +11,4 @@ if(cost == initial(cost) && !static_cost) var/na = max(round(cost * randomprice_factor, 1), 1) cost = max(rand(cost-na, cost+na), 1) -#endif \ No newline at end of file +#endif diff --git a/code/modules/jobs/job_types/roguetown/adventurer/trader.dm b/code/modules/jobs/job_types/roguetown/adventurer/trader.dm index af54a0f70a3..a09d19cb775 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/trader.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/trader.dm @@ -32,5 +32,8 @@ /datum/advclass/trader/cuisiner, /datum/advclass/trader/peddler, /datum/advclass/trader/servant, - /datum/advclass/trader/doomsayer + /datum/advclass/trader/doomsayer, + //CC Edit + /datum/advclass/trader/travelling_merchant + //CC Edit ned ) diff --git a/code/modules/roguetown/roguemachine/mail.dm b/code/modules/roguetown/roguemachine/mail.dm index 8eb715d76e9..ae7d372019e 100644 --- a/code/modules/roguetown/roguemachine/mail.dm +++ b/code/modules/roguetown/roguemachine/mail.dm @@ -126,11 +126,21 @@ data["paper_cost"] = 1 data["quill_cost"] = 5 data["letter_cost"] = 1 + //CC Edit + var/datum/component/travelling_merchant/tmc = user.GetComponent(/datum/component/travelling_merchant) + if(tmc) + data["travellingmerchant_static"] = tmc.ui_static_data_fill_in() + //CC Edit End return data /obj/structure/roguemachine/mail/ui_data(mob/user) var/list/data = list() data["balance"] = coin_loaded + //CC Edit + var/datum/component/travelling_merchant/tmc = user.GetComponent(/datum/component/travelling_merchant) + if(tmc) + data["travellingmerchant"] = tmc.ui_dynamic_data_fill_in() + //CC Edit end return data /obj/structure/roguemachine/mail/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) @@ -223,6 +233,14 @@ coin_loaded = 0 update_icon() return TRUE + //CC Edit + if("addToCart") + var/datum/component/travelling_merchant/tmc = user.GetComponent(/datum/component/travelling_merchant) + if(tmc) + return TRUE + //CC Edit End + + /obj/structure/roguemachine/mail/attackby(obj/item/P, mob/user, params) if(istype(P, /obj/item/merctoken)) @@ -670,6 +688,11 @@ if(href_list["directory"]) view_directory(usr) + //CC Edit + return + + Topic_TravellingMerchant() + //CC Edit End /obj/structure/roguemachine/mail/proc/view_directory(mob/user) var/dat diff --git a/modular_causticcove/code/modules/supplies/travellingmerchant.dm b/modular_causticcove/code/modules/supplies/travellingmerchant.dm new file mode 100644 index 00000000000..06d92e4a0e8 --- /dev/null +++ b/modular_causticcove/code/modules/supplies/travellingmerchant.dm @@ -0,0 +1,118 @@ +/datum/advclass/trader/travelling_merchant + name = "Travelling Merchant" + tutorial = "You are a merchant forever on the move, stopping by for this week in the duchy of Azure Peak. While this isn't your home, you are extremely well connected, and can aquire goods for half the normal cost by pulling favours and rank, although getting to said supplies might be a bit bothersome. Better hire some mercs! Whenever you set up your own little peddling place, or work to supply the city's own merchant, keep in mind that you have little use for mammons, and would rather use them to expand your influence, as you are a multinational businessperson, and have little desire for local currency." + allowed_sexes = list(MALE, FEMALE) + allowed_races = RACES_ALL_KINDS + category_tags = list(CTAG_TRADER, CTAG_COURTAGENT, CTAG_LICKER_WRETCH) + class_select_category = CLASS_CAT_TRADER + +/datum/outfit/job/roguetown/adventurer/trader/travelling_merchant/pre_equip(mob/living/carbon/human/H) + ..() + to_chat(H, span_warning("You are a merchant forever on the move, stopping by for this week in the duchy of Azure Peak. While this isn't your home, you are extremely well connected, and can aquire goods for half the normal cost by pulling favours and rank, although getting to said supplies might be a bit bothersome. Better hire some mercs! Whenever you set up your own little peddling place, or work to supply the city's own merchant, keep in mind that you have little use for mammons, and would rather use them to expand your influence, as you are a multinational businessperson, and have little desire for local currency.")) + //H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/travelling_merchant/checkfavours) + //H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/travelling_merchant_sourcegoods) + //H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/travelling_merchant_sellgoods) + //H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/travelling_merchant_exploitmarket) + //H.AddComponent(/datum/component/travelling_merchant) + + +/*/obj/effect/proc_holder/spell/invoked/travelling_merchant/proc/getFavours(mob/living/user) + var/datum/travelling_merchant = user.GetComponent(datum/travelling_merchant) + return travelling_merchant.favours + +/obj/effect/proc_holder/spell/invoked/travelling_merchant/checkfavours + name = "Check favours" + desc = "Using your trusty journal, you can take a moment to remember how much clout you have with your connections." + +/obj/effect/proc_holder/spell/invoked/travelling_merchant/checkfavours/cast(mob/living/user) + var favours = getFavours(user) + to_chat(user, span_info("According to these pages, once you add everything up, it comes out to around [favours] mammons worth of clout.")) + +/obj/effect/proc_holder/spell/invoked/travelling_merchant/sourcegoods + name = "Source goods" + desc = "Use it on a hermes post to contact suppliers, arranging a dead drop for you to fetch.\nCooldown and package location difficulty is dependent on the amount of favours you are using." + + + +/obj/effect/proc_holder/spell/invoked/travelling_merchant/sellgoods + name = "Sell goods" + desc = "Use it on a hermes post to contact buyers, arranging a dead drop for you to deliver.\nCooldown and package location difficulty is dependent on the amount of favours you are getting." + +/obj/effect/proc_holder/spell/invoked/travelling_merchant/exploitmarket + name = "Exploit market" + desc = "Use it on a hermes post to contact counting houses, aquiring information on the favourable imports and exports of the world.\nCooldown and package location difficulty is dependent on the amount of favours you are using or getting." +*/ + +/datum/component/travelling_merchant + var/favours = 300 + var/favourtimer + var/list/allcats = list( + "Alcohols", + "Apparel", + "Consumable", + "Gems", + "Instruments", + "Luxury", + "Livestock", + "Cosmetics", + "Raw Materials", + "Seeds", + "Tools", + "Wardrobe", + "Adventuring Supplies", + "Armor (Light)", + "Armor (Iron)", + "Armor (Steel)", + "Armor (Exotic)", + "Potions", + "Weapons (Ranged)", + "Weapons (Iron and Shields)", + "Weapons (Steel)", + "Weapons (Foreign)", + "Diplomacy and Persuasion", + "Beverages", + "Exotic Import", + "General Labour", + "Health and Hygiene", + "Self Defense") + var/list/unlockedcats = list() + var/catunlockspending = 3 + var/list/current_cart = list() + +/datum/component/travelling_merchant/Initialize(...) + . = ..() + favourtimer = addtimer(CALLBACK(src, PROC_REF(AddFavours)),5 MINUTES, TIMER_STOPPABLE | TIMER_LOOP) + var/choice = SelectCategory() + while(choice && catunlockspending) + catunlockspending -= 1 + unlockedcats += choice + choice = SelectCategory() + +/datum/component/travelling_merchant/proc/SelectCategory() + var/list/catchoices = allcats - unlockedcats + var/choice = tgui_input_list(parent,"Category slots currently left: [catunlockspending]","Choose your starting categories. You can choose additional categories later, at any hermes, and buy additional slots as well.",catchoices) + return choice + +/datum/component/travelling_merchant/proc/AddFavours() + to_chat(parent,"Your previous deals still reverberate through your channels. Their debts, material or sentimental ever incuring interest... you are now 50 favours richer, for a total of [favours] favours.") + favours += 50 + +/datum/component/travelling_merchant/Destroy() + deltimer(favourtimer) + favourtimer = null + . = ..() + + +/datum/component/travelling_merchant/proc/ui_static_data_fill_in() + var/list/data = list() + data["supplypacks"] = SSmerchant.supply_packs + return data + + +/datum/component/travelling_merchant/proc/ui_dynamic_data_fill_in() + var/list/data = list() + data["favours"] = favours + data["unlockedCats"] = unlockedcats + data["catunlockspending"] = catunlockspending + return data + diff --git a/roguetown.dme b/roguetown.dme index 0c865b6f5af..33f899eda92 100644 --- a/roguetown.dme +++ b/roguetown.dme @@ -295,7 +295,6 @@ #include "code\_globalvars\lists\achievements.dm" #include "code\_globalvars\lists\admin.dm" #include "code\_globalvars\lists\ai.dm" -#include "code\_globalvars\lists\bounty.dm" #include "code\_globalvars\lists\client.dm" #include "code\_globalvars\lists\dendor.dm" #include "code\_globalvars\lists\flavor_misc.dm" @@ -310,6 +309,7 @@ #include "code\_globalvars\lists\surgery.dm" #include "code\_globalvars\lists\typecache.dm" #include "code\_globalvars\lists\wounds.dm" +#include "code\_globalvars\lists\bounty.dm" #include "code\_js\byjax.dm" #include "code\_js\menus.dm" #include "code\_onclick\adjacent.dm" @@ -498,7 +498,6 @@ #include "code\datums\action.dm" #include "code\datums\antag_retainer.dm" #include "code\datums\armor.dm" -#include "code\datums\autopunctuation.dm" #include "code\datums\beam.dm" #include "code\datums\browser.dm" #include "code\datums\callback.dm" @@ -518,7 +517,6 @@ #include "code\datums\forced_movement.dm" #include "code\datums\http_request.dm" #include "code\datums\hud.dm" -#include "code\datums\item_equipped_movement_rustle.dm" #include "code\datums\map_adjustment.dm" #include "code\datums\map_adjustment_include.dm" #include "code\datums\map_config.dm" @@ -540,7 +538,6 @@ #include "code\datums\saymode.dm" #include "code\datums\scheduled_event.dm" #include "code\datums\skill_holder.dm" -#include "code\datums\slapcrafting.dm" #include "code\datums\soullink.dm" #include "code\datums\spawners_menu.dm" #include "code\datums\taxsetter.dm" @@ -666,7 +663,6 @@ #include "code\datums\components\_component.dm" #include "code\datums\components\after_image.dm" #include "code\datums\components\anti_magic.dm" -#include "code\datums\components\armour_filtering.dm" #include "code\datums\components\art.dm" #include "code\datums\components\baothajoyride.dm" #include "code\datums\components\beauty.dm" @@ -676,6 +672,8 @@ #include "code\datums\components\construction.dm" #include "code\datums\components\creamed.dm" #include "code\datums\components\cursed_item.dm" +#include "code\datums\components\skill_blessed.dm" +#include "code\datums\components\armour_filtering.dm" #include "code\datums\components\deadchat_control.dm" #include "code\datums\components\decal.dm" #include "code\datums\components\dejavu.dm" @@ -709,7 +707,6 @@ #include "code\datums\components\shrapnel.dm" #include "code\datums\components\shrink.dm" #include "code\datums\components\sizzle.dm" -#include "code\datums\components\skill_blessed.dm" #include "code\datums\components\slippery.dm" #include "code\datums\components\soulstoned.dm" #include "code\datums\components\spawner.dm" @@ -921,11 +918,11 @@ #include "code\datums\sexcon2\actions\sex\other\thighjob.dm" #include "code\datums\sexcon2\actions\sex\other\vagina.dm" #include "code\datums\sexcon2\actions\toy\anus.dm" -#include "code\datums\sexcon2\actions\toy\oral.dm" -#include "code\datums\sexcon2\actions\toy\vagina.dm" #include "code\datums\sexcon2\actions\toy\other\anus.dm" -#include "code\datums\sexcon2\actions\toy\other\oral.dm" #include "code\datums\sexcon2\actions\toy\other\vagina.dm" +#include "code\datums\sexcon2\actions\toy\other\oral.dm" +#include "code\datums\sexcon2\actions\toy\oral.dm" +#include "code\datums\sexcon2\actions\toy\vagina.dm" #include "code\datums\skills\_skill.dm" #include "code\datums\skills\combat.dm" #include "code\datums\skills\craft.dm" @@ -940,9 +937,6 @@ #include "code\datums\status_effects\firestacker.dm" #include "code\datums\status_effects\gas.dm" #include "code\datums\status_effects\neutral.dm" -#include "code\datums\status_effects\relaxing_bath.dm" -#include "code\datums\status_effects\spider_cocoon.dm" -#include "code\datums\status_effects\spider_speak.dm" #include "code\datums\status_effects\status_effect.dm" #include "code\datums\status_effects\debuffs\silenced.dm" #include "code\datums\status_effects\rogue\alerts.dm" @@ -1018,23 +1012,21 @@ #include "code\game\gamemodes\objective.dm" #include "code\game\gamemodes\objective_items.dm" #include "code\game\gamemodes\objectives_rogue.dm" -#include "code\game\gamemodes\personal_objectives\ascendants\baotha\snort_drugs.dm" -#include "code\game\gamemodes\personal_objectives\ascendants\baotha\taste_lux.dm" -#include "code\game\gamemodes\personal_objectives\ascendants\graggar\eat_organs.dm" -#include "code\game\gamemodes\personal_objectives\ascendants\graggar\punch_targets.dm" -#include "code\game\gamemodes\personal_objectives\ascendants\matthios\hoard_mammons.dm" -#include "code\game\gamemodes\personal_objectives\ascendants\matthios\theft.dm" -#include "code\game\gamemodes\personal_objectives\ascendants\zizo\profane_shrines.dm" -#include "code\game\gamemodes\personal_objectives\ascendants\zizo\torture.dm" #include "code\game\gamemodes\personal_objectives\pantheon\abyssor\abyssoid_creation.dm" #include "code\game\gamemodes\personal_objectives\pantheon\abyssor\fish_release.dm" #include "code\game\gamemodes\personal_objectives\pantheon\astrata\become_noble.dm" #include "code\game\gamemodes\personal_objectives\pantheon\astrata\recruit_retainer.dm" +#include "code\game\gamemodes\personal_objectives\ascendants\baotha\snort_drugs.dm" +#include "code\game\gamemodes\personal_objectives\ascendants\baotha\taste_lux.dm" #include "code\game\gamemodes\personal_objectives\pantheon\dendor\make_wise_trees.dm" #include "code\game\gamemodes\personal_objectives\pantheon\dendor\tame.dm" #include "code\game\gamemodes\personal_objectives\pantheon\eora\hug.dm" +#include "code\game\gamemodes\personal_objectives\ascendants\graggar\eat_organs.dm" +#include "code\game\gamemodes\personal_objectives\ascendants\graggar\punch_targets.dm" #include "code\game\gamemodes\personal_objectives\pantheon\malum\craft_shrine.dm" #include "code\game\gamemodes\personal_objectives\pantheon\malum\improve_craft.dm" +#include "code\game\gamemodes\personal_objectives\ascendants\matthios\hoard_mammons.dm" +#include "code\game\gamemodes\personal_objectives\ascendants\matthios\theft.dm" #include "code\game\gamemodes\personal_objectives\pantheon\necra\bury.dm" #include "code\game\gamemodes\personal_objectives\pantheon\necra\listen_whispers.dm" #include "code\game\gamemodes\personal_objectives\pantheon\noc\get_literate.dm" @@ -1043,6 +1035,8 @@ #include "code\game\gamemodes\personal_objectives\pantheon\ravox\duel.dm" #include "code\game\gamemodes\personal_objectives\pantheon\ravox\improve_combat.dm" #include "code\game\gamemodes\personal_objectives\pantheon\xylix\mock.dm" +#include "code\game\gamemodes\personal_objectives\ascendants\zizo\profane_shrines.dm" +#include "code\game\gamemodes\personal_objectives\ascendants\zizo\torture.dm" #include "code\game\gamemodes\sandbox\h_sandbox.dm" #include "code\game\machinery\_machinery.dm" #include "code\game\machinery\trams_and_elevators\industrial_lift.dm" @@ -1117,9 +1111,7 @@ #include "code\game\objects\effects\spawners\structure.dm" #include "code\game\objects\effects\spawners\traps.dm" #include "code\game\objects\effects\temporary_visuals\cult.dm" -#include "code\game\objects\effects\temporary_visuals\miracles.dm" #include "code\game\objects\effects\temporary_visuals\miscellaneous.dm" -#include "code\game\objects\effects\temporary_visuals\music.dm" #include "code\game\objects\effects\temporary_visuals\offered_item_effect.dm" #include "code\game\objects\effects\temporary_visuals\surrender_flag.dm" #include "code\game\objects\effects\temporary_visuals\temporary_visual.dm" @@ -1136,33 +1128,19 @@ #include "code\game\objects\items\courtroom.dm" #include "code\game\objects\items\debug_items.dm" #include "code\game\objects\items\dice.dm" -#include "code\game\objects\items\donator_fluff_items.dm" -#include "code\game\objects\items\donator_modkit.dm" #include "code\game\objects\items\etherealdiscoball.dm" #include "code\game\objects\items\granters.dm" #include "code\game\objects\items\holster_component.dm" #include "code\game\objects\items\hot_potato.dm" #include "code\game\objects\items\hourglass.dm" -#include "code\game\objects\items\magic_staffs.dm" -#include "code\game\objects\items\mercmedals.dm" -#include "code\game\objects\items\mundanities.dm" -#include "code\game\objects\items\quicksilver.dm" -#include "code\game\objects\items\quiver.dm" -#include "code\game\objects\items\random_loot.dm" -#include "code\game\objects\items\ritechalk.dm" -#include "code\game\objects\items\ritualcircles.dm" -#include "code\game\objects\items\scabbard.dm" #include "code\game\objects\items\scrolls.dm" #include "code\game\objects\items\sharpener.dm" #include "code\game\objects\items\shooting_range.dm" #include "code\game\objects\items\signal_horn.dm" #include "code\game\objects\items\soap.dm" -#include "code\game\objects\items\spellbooks.dm" -#include "code\game\objects\items\surgery_bag.dm" #include "code\game\objects\items\taster.dm" #include "code\game\objects\items\toys.dm" #include "code\game\objects\items\trash.dm" -#include "code\game\objects\items\twstrap.dm" #include "code\game\objects\items\weaponry.dm" #include "code\game\objects\items\clothes\neck.dm" #include "code\game\objects\items\clothes\stockings.dm" @@ -1274,7 +1252,6 @@ #include "code\game\objects\structures\displaycase.dm" #include "code\game\objects\structures\divine.dm" #include "code\game\objects\structures\dungeontools.dm" -#include "code\game\objects\structures\fartravel.dm" #include "code\game\objects\structures\fence.dm" #include "code\game\objects\structures\fireaxe.dm" #include "code\game\objects\structures\flora.dm" @@ -1329,7 +1306,6 @@ #include "code\game\objects\structures\roguetown\talkstatue.dm" #include "code\game\objects\structures\roguetown\telescope.dm" #include "code\game\objects\structures\roguetown\traps.dm" -#include "code\game\objects\weapons\axes.dm" #include "code\game\rotational_objects\horizontal_gearbox.dm" #include "code\game\rotational_objects\item_rotation_contraption.dm" #include "code\game\rotational_objects\rotation_shaft.dm" @@ -1338,7 +1314,6 @@ #include "code\game\rotational_objects\waterwheel.dm" #include "code\game\turfs\baseturf_skipover.dm" #include "code\game\turfs\change_turf.dm" -#include "code\game\turfs\crawlspace.dm" #include "code\game\turfs\turf.dm" #include "code\game\turfs\turf_defense.dm" #include "code\game\turfs\closed\_closed.dm" @@ -1567,8 +1542,8 @@ #include "code\modules\client\client_procs.dm" #include "code\modules\client\darkmode.dm" #include "code\modules\client\familiar_prefs.dm" -#include "code\modules\client\gods_rankings.dm" #include "code\modules\client\loadout_menu.dm" +#include "code\modules\client\gods_rankings.dm" #include "code\modules\client\manual_donator.dm" #include "code\modules\client\message.dm" #include "code\modules\client\player_details.dm" @@ -1622,9 +1597,7 @@ #include "code\modules\clothing\neck\_neck.dm" #include "code\modules\clothing\outfits\vv_outfit.dm" #include "code\modules\clothing\rogueclothes\cloaks.dm" -#include "code\modules\clothing\rogueclothes\crown.dm" #include "code\modules\clothing\rogueclothes\feet.dm" -#include "code\modules\clothing\rogueclothes\hats.dm" #include "code\modules\clothing\rogueclothes\mask.dm" #include "code\modules\clothing\rogueclothes\mouth.dm" #include "code\modules\clothing\rogueclothes\neck.dm" @@ -1842,8 +1815,8 @@ #include "code\modules\jobs\job_types\roguetown\adventurer\types\antag\gnoll\gnoll_templar.dm" #include "code\modules\jobs\job_types\roguetown\adventurer\types\combat\cleric.dm" #include "code\modules\jobs\job_types\roguetown\adventurer\types\combat\foreigner.dm" -#include "code\modules\jobs\job_types\roguetown\adventurer\types\combat\mage.dm" #include "code\modules\jobs\job_types\roguetown\adventurer\types\combat\mystic.dm" +#include "code\modules\jobs\job_types\roguetown\adventurer\types\combat\mage.dm" #include "code\modules\jobs\job_types\roguetown\adventurer\types\combat\noble.dm" #include "code\modules\jobs\job_types\roguetown\adventurer\types\combat\ranger.dm" #include "code\modules\jobs\job_types\roguetown\adventurer\types\combat\rogue.dm" @@ -1887,14 +1860,6 @@ #include "code\modules\jobs\job_types\roguetown\adventurer\types\special\nakedandafraid.dm" #include "code\modules\jobs\job_types\roguetown\adventurer\types\special\torso.dm" #include "code\modules\jobs\job_types\roguetown\adventurer\types\special\whitecheesemaker.dm" -#include "code\modules\jobs\job_types\roguetown\adventurer\types\trader\brewer.dm" -#include "code\modules\jobs\job_types\roguetown\adventurer\types\trader\cuisiner.dm" -#include "code\modules\jobs\job_types\roguetown\adventurer\types\trader\doomsayer.dm" -#include "code\modules\jobs\job_types\roguetown\adventurer\types\trader\harlequin.dm" -#include "code\modules\jobs\job_types\roguetown\adventurer\types\trader\jeweler.dm" -#include "code\modules\jobs\job_types\roguetown\adventurer\types\trader\maid.dm" -#include "code\modules\jobs\job_types\roguetown\adventurer\types\trader\peddler.dm" -#include "code\modules\jobs\job_types\roguetown\adventurer\types\trader\scholar.dm" #include "code\modules\jobs\job_types\roguetown\adventurer\types\wretch\berserker.dm" #include "code\modules\jobs\job_types\roguetown\adventurer\types\wretch\blackoak.dm" #include "code\modules\jobs\job_types\roguetown\adventurer\types\wretch\defiler.dm" @@ -1946,6 +1911,27 @@ #include "code\modules\jobs\job_types\roguetown\Inquisition\orthoclasses\disciple.dm" #include "code\modules\jobs\job_types\roguetown\Inquisition\orthoclasses\psyalmist.dm" #include "code\modules\jobs\job_types\roguetown\Inquisition\orthoclasses\psydoniantemplar.dm" +#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\anthrax.dm" +#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\atgervi.dm" +#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\blackoak.dm" +#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\etrusca.dm" +#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\desertrider.dm" +#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\forlorn.dm" +#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\freifechter.dm" +#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\grenzelhoft.dm" +#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\gronn.dm" +#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\gronnheavy.dm" +#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\grudgebearer.dm" +#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\hangyaku.dm" +#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\lirvan.dm" +#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\routier.dm" +#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\rumaclan.dm" +#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\seonjang.dm" +#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\slayer.dm" +#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\steppesman.dm" +#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\underdweller.dm" +#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\vaquero.dm" +#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\warscholar.dm" #include "code\modules\jobs\job_types\roguetown\nobility\consort.dm" #include "code\modules\jobs\job_types\roguetown\nobility\lord.dm" #include "code\modules\jobs\job_types\roguetown\nobility\prince.dm" @@ -1969,27 +1955,14 @@ #include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary.dm" #include "code\modules\jobs\job_types\roguetown\sidefolk\vagabond.dm" #include "code\modules\jobs\job_types\roguetown\sidefolk\veteran.dm" -#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\anthrax.dm" -#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\atgervi.dm" -#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\blackoak.dm" -#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\desertrider.dm" -#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\etrusca.dm" -#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\forlorn.dm" -#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\freifechter.dm" -#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\grenzelhoft.dm" -#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\gronn.dm" -#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\gronnheavy.dm" -#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\grudgebearer.dm" -#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\hangyaku.dm" -#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\lirvan.dm" -#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\routier.dm" -#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\rumaclan.dm" -#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\seonjang.dm" -#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\slayer.dm" -#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\steppesman.dm" -#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\underdweller.dm" -#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\vaquero.dm" -#include "code\modules\jobs\job_types\roguetown\sidefolk\mercenary\warscholar.dm" +#include "code\modules\jobs\job_types\roguetown\adventurer\types\trader\brewer.dm" +#include "code\modules\jobs\job_types\roguetown\adventurer\types\trader\cuisiner.dm" +#include "code\modules\jobs\job_types\roguetown\adventurer\types\trader\doomsayer.dm" +#include "code\modules\jobs\job_types\roguetown\adventurer\types\trader\harlequin.dm" +#include "code\modules\jobs\job_types\roguetown\adventurer\types\trader\jeweler.dm" +#include "code\modules\jobs\job_types\roguetown\adventurer\types\trader\maid.dm" +#include "code\modules\jobs\job_types\roguetown\adventurer\types\trader\peddler.dm" +#include "code\modules\jobs\job_types\roguetown\adventurer\types\trader\scholar.dm" #include "code\modules\jobs\job_types\roguetown\sidefolk\vagabond\beggar.dm" #include "code\modules\jobs\job_types\roguetown\sidefolk\vagabond\courier.dm" #include "code\modules\jobs\job_types\roguetown\sidefolk\vagabond\destitute_scholar.dm" @@ -2368,7 +2341,6 @@ #include "code\modules\mob\living\simple_animal\rogue\orc.dm" #include "code\modules\mob\living\simple_animal\rogue\rogue_corpse.dm" #include "code\modules\mob\living\simple_animal\rogue\rogueanimals.dm" -#include "code\modules\mob\living\simple_animal\rogue\creacher\abyssal_monsters.dm" #include "code\modules\mob\living\simple_animal\rogue\creacher\badger.dm" #include "code\modules\mob\living\simple_animal\rogue\creacher\bigrat.dm" #include "code\modules\mob\living\simple_animal\rogue\creacher\bobcat.dm" @@ -2376,24 +2348,17 @@ #include "code\modules\mob\living\simple_animal\rogue\creacher\cat.dm" #include "code\modules\mob\living\simple_animal\rogue\creacher\direbear.dm" #include "code\modules\mob\living\simple_animal\rogue\creacher\dragger.dm" -#include "code\modules\mob\living\simple_animal\rogue\creacher\dragon.dm" #include "code\modules\mob\living\simple_animal\rogue\creacher\fox.dm" -#include "code\modules\mob\living\simple_animal\rogue\creacher\gethsmane.dm" #include "code\modules\mob\living\simple_animal\rogue\creacher\headless.dm" #include "code\modules\mob\living\simple_animal\rogue\creacher\honeyspider.dm" #include "code\modules\mob\living\simple_animal\rogue\creacher\lamia.dm" #include "code\modules\mob\living\simple_animal\rogue\creacher\mimic.dm" -#include "code\modules\mob\living\simple_animal\rogue\creacher\minotaur.dm" -#include "code\modules\mob\living\simple_animal\rogue\creacher\mirespiders.dm" #include "code\modules\mob\living\simple_animal\rogue\creacher\mole.dm" #include "code\modules\mob\living\simple_animal\rogue\creacher\mossback.dm" #include "code\modules\mob\living\simple_animal\rogue\creacher\mudcrab.dm" #include "code\modules\mob\living\simple_animal\rogue\creacher\raccoon.dm" #include "code\modules\mob\living\simple_animal\rogue\creacher\smallrat.dm" #include "code\modules\mob\living\simple_animal\rogue\creacher\tangler.dm" -#include "code\modules\mob\living\simple_animal\rogue\creacher\undead_animal_helpers.dm" -#include "code\modules\mob\living\simple_animal\rogue\creacher\undead_saiga.dm" -#include "code\modules\mob\living\simple_animal\rogue\creacher\undead_wolf.dm" #include "code\modules\mob\living\simple_animal\rogue\creacher\volf.dm" #include "code\modules\mob\living\simple_animal\rogue\creacher\trolls\troll.dm" #include "code\modules\mob\living\simple_animal\rogue\creacher\trolls\trollaxe.dm" @@ -2461,8 +2426,6 @@ #include "code\modules\reagents\reagent_containers\patch.dm" #include "code\modules\reagents\reagent_containers\pill.dm" #include "code\modules\reagents\reagent_containers\powderspice.dm" -#include "code\modules\reagents\reagent_containers\rotcure.dm" -#include "code\modules\reagents\reagent_containers\spider_venom.dm" #include "code\modules\roguetown\floorinteraction.dm" #include "code\modules\roguetown\heretic_commune.dm" #include "code\modules\roguetown\mapgen\beach.dm" @@ -2573,9 +2536,9 @@ #include "code\modules\roguetown\roguemachine\hoardmaster.dm" #include "code\modules\roguetown\roguemachine\lottery.dm" #include "code\modules\roguetown\roguemachine\mail.dm" +#include "code\modules\roguetown\roguemachine\smuggler_mail.dm" #include "code\modules\roguetown\roguemachine\money.dm" #include "code\modules\roguetown\roguemachine\potionseller.dm" -#include "code\modules\roguetown\roguemachine\smuggler_mail.dm" #include "code\modules\roguetown\roguemachine\submission.dm" #include "code\modules\roguetown\roguemachine\throne.dm" #include "code\modules\roguetown\roguemachine\titan.dm" @@ -2648,18 +2611,10 @@ #include "code\modules\sexcon\sex_organs\testicles.dm" #include "code\modules\sexcon\sex_organs\vagina.dm" #include "code\modules\spatial_grid\cell_tracking.dm" -#include "code\modules\spells\minion_order.dm" -#include "code\modules\spells\orison.dm" #include "code\modules\spells\spell.dm" -#include "code\modules\spells\warscholar.dm" #include "code\modules\spells\components\conjured_item.dm" #include "code\modules\spells\components\enchanted_weapon.dm" #include "code\modules\spells\components\fit_clothing.dm" -#include "code\modules\spells\pantheon\divine\necra.dm" -#include "code\modules\spells\pantheon\inhumen\baotha.dm" -#include "code\modules\spells\pantheon\inhumen\graggar.dm" -#include "code\modules\spells\pantheon\inhumen\matthios.dm" -#include "code\modules\spells\pantheon\inhumen\zizo.dm" #include "code\modules\spells\roguetown\_roguetown.dm" #include "code\modules\spells\roguetown\confessor.dm" #include "code\modules\spells\roguetown\create_abyssoid.dm" @@ -2790,8 +2745,8 @@ #include "code\modules\spells\spell_types\wizard\projectiles_aoe\greater_fireball.dm" #include "code\modules\spells\spell_types\wizard\projectiles_single\acid_splash.dm" #include "code\modules\spells\spell_types\wizard\projectiles_single\air_blade.dm" -#include "code\modules\spells\spell_types\wizard\projectiles_single\arcyne_bolt.dm" #include "code\modules\spells\spell_types\wizard\projectiles_single\arcyne_strike.dm" +#include "code\modules\spells\spell_types\wizard\projectiles_single\arcyne_bolt.dm" #include "code\modules\spells\spell_types\wizard\projectiles_single\blood_lightning.dm" #include "code\modules\spells\spell_types\wizard\projectiles_single\blood_steal.dm" #include "code\modules\spells\spell_types\wizard\projectiles_single\fetch.dm" @@ -3015,6 +2970,7 @@ #include "modular\Neu_Food\code\others\honey.dm" #include "modular\Neu_Food\code\others\preserved_meat.dm" #include "modular\Neu_Food\code\others\sweet.dm" +#include "modular\Neu_Food\code\recipes\cooking_recipes_base.dm" #include "modular\Neu_Food\code\raw\raw_deep_fried.dm" #include "modular\Neu_Food\code\raw\raw_dough.dm" #include "modular\Neu_Food\code\raw\raw_fish.dm" @@ -3023,9 +2979,56 @@ #include "modular\Neu_Food\code\raw\raw_pies.dm" #include "modular\Neu_Food\code\raw\raw_shellfish.dm" #include "modular\Neu_Food\code\raw\raw_veggies.dm" -#include "modular\Neu_Food\code\recipes\cooking_recipes_base.dm" #include "modular\Neu_Food\code\recipes\drying_recipes.dm" #include "modular\Neu_Food\code\recipes\stew_recipes.dm" +#include "modular\ze_genesis_call\genesis_call.dm" +#include "_statpacks.dm" +#include "_virtue.dm" +#include "code\datums\autopunctuation.dm" +#include "code\datums\item_equipped_movement_rustle.dm" +#include "code\datums\slapcrafting.dm" +#include "code\datums\status_effects\relaxing_bath.dm" +#include "code\datums\status_effects\spider_cocoon.dm" +#include "code\datums\status_effects\spider_speak.dm" +#include "code\game\objects\effects\temporary_visuals\miracles.dm" +#include "code\game\objects\effects\temporary_visuals\music.dm" +#include "code\game\objects\items\donator_fluff_items.dm" +#include "code\game\objects\items\donator_modkit.dm" +#include "code\game\objects\items\magic_staffs.dm" +#include "code\game\objects\items\mercmedals.dm" +#include "code\game\objects\items\mundanities.dm" +#include "code\game\objects\items\quicksilver.dm" +#include "code\game\objects\items\quiver.dm" +#include "code\game\objects\items\random_loot.dm" +#include "code\game\objects\items\ritechalk.dm" +#include "code\game\objects\items\ritualcircles.dm" +#include "code\game\objects\items\scabbard.dm" +#include "code\game\objects\items\spellbooks.dm" +#include "code\game\objects\items\surgery_bag.dm" +#include "code\game\objects\items\twstrap.dm" +#include "code\game\objects\structures\fartravel.dm" +#include "code\game\objects\weapons\axes.dm" +#include "code\game\turfs\crawlspace.dm" +#include "code\modules\clothing\rogueclothes\crown.dm" +#include "code\modules\clothing\rogueclothes\hats.dm" +#include "code\modules\mob\living\simple_animal\rogue\creacher\abyssal_monsters.dm" +#include "code\modules\mob\living\simple_animal\rogue\creacher\dragon.dm" +#include "code\modules\mob\living\simple_animal\rogue\creacher\gethsmane.dm" +#include "code\modules\mob\living\simple_animal\rogue\creacher\minotaur.dm" +#include "code\modules\mob\living\simple_animal\rogue\creacher\mirespiders.dm" +#include "code\modules\mob\living\simple_animal\rogue\creacher\undead_animal_helpers.dm" +#include "code\modules\mob\living\simple_animal\rogue\creacher\undead_saiga.dm" +#include "code\modules\mob\living\simple_animal\rogue\creacher\undead_wolf.dm" +#include "code\modules\reagents\reagent_containers\rotcure.dm" +#include "code\modules\reagents\reagent_containers\spider_venom.dm" +#include "code\modules\spells\minion_order.dm" +#include "code\modules\spells\orison.dm" +#include "code\modules\spells\warscholar.dm" +#include "code\modules\spells\pantheon\divine\necra.dm" +#include "code\modules\spells\pantheon\inhumen\baotha.dm" +#include "code\modules\spells\pantheon\inhumen\graggar.dm" +#include "code\modules\spells\pantheon\inhumen\matthios.dm" +#include "code\modules\spells\pantheon\inhumen\zizo.dm" #include "modular\piercing\carbon_defines.dm" #include "modular\piercing\features.dm" #include "modular\piercing\misc.dm" @@ -3055,8 +3058,6 @@ #include "modular_causticcove\code\datums\loadout.dm" #include "modular_causticcove\code\datums\spontaneous_vore.dm" #include "modular_causticcove\code\game\objects\effects\landmarks.dm" -#include "modular_causticcove\code\game\objects\effects\spawners\loot_magical.dm" -#include "modular_causticcove\code\game\objects\items\clothes\causthats.dm" #include "modular_causticcove\code\game\objects\items\clothes\stockings.dm" #include "modular_causticcove\code\game\objects\items\rogueitems\leash.dm" #include "modular_causticcove\code\game\objects\items\rogueitems\util.dm" @@ -3064,7 +3065,6 @@ #include "modular_causticcove\code\game\objects\items\weapons\ranged\arquebus.dm" #include "modular_causticcove\code\modules\accessability\epilepsy.dm" #include "modular_causticcove\code\modules\accessability\epilepsy_prefs.dm" -#include "modular_causticcove\code\modules\antagonists\roguetown\villains\werewolf\werewolf_transformation_resist.dm" #include "modular_causticcove\code\modules\baycode_port_helpers\baycode_port_helpers.dm" #include "modular_causticcove\code\modules\baycode_port_helpers\chemcolour.dm" #include "modular_causticcove\code\modules\baycode_port_helpers\hud.dm" @@ -3078,7 +3078,6 @@ #include "modular_causticcove\code\modules\classes\shrine_priest\shrine_guardian.dm" #include "modular_causticcove\code\modules\classes\shrine_priest\shrine_priest.dm" #include "modular_causticcove\code\modules\client\customizers\organ\genitals.dm" -#include "modular_causticcove\code\modules\clothing\npc\hobgoblin_armor.dm" #include "modular_causticcove\code\modules\dcbot\config.dm" #include "modular_causticcove\code\modules\dcbot\internaltools\ahelprelay.dm" #include "modular_causticcove\code\modules\dcbot\internaltools\whitelost.dm" @@ -3087,8 +3086,6 @@ #include "modular_causticcove\code\modules\dcbot\topichandlers\fetchmanifest.dm" #include "modular_causticcove\code\modules\dcbot\topichandlers\fetchplayers.dm" #include "modular_causticcove\code\modules\deadite_pac\deadite_pac.dm" -#include "modular_causticcove\code\modules\events\adventure\random_bosses\random_boss.dm" -#include "modular_causticcove\code\modules\events\adventure\random_patrols\random_patrols.dm" #include "modular_causticcove\code\modules\extra_virtue\prefs.dm" #include "modular_causticcove\code\modules\grazer\stomach.dm" #include "modular_causticcove\code\modules\grazer\virtue.dm" @@ -3108,9 +3105,10 @@ #include "modular_causticcove\code\modules\mob\dead\new_player\sprite_accessory\horns.dm" #include "modular_causticcove\code\modules\mob\dead\new_player\sprite_accessory\snout.dm" #include "modular_causticcove\code\modules\mob\living\carbon\hobgoblin\hobgoblin.dm" -#include "modular_causticcove\code\modules\mob\living\carbon\hobgoblin\ambush_config\ambush_hobgoblin.dm" #include "modular_causticcove\code\modules\mob\living\carbon\hobgoblin\npc\hobgoblin_npc.dm" #include "modular_causticcove\code\modules\mob\living\carbon\hobgoblin\species\hobgoblin_species.dm" +#include "modular_causticcove\code\modules\clothing\npc\hobgoblin_armor.dm" +#include "modular_causticcove\code\modules\mob\living\carbon\hobgoblin\ambush_config\ambush_hobgoblin.dm" #include "modular_causticcove\code\modules\nat_armor\nat_armor.dm" #include "modular_causticcove\code\modules\nat_armor\virtue.dm" #include "modular_causticcove\code\modules\persistance\serialize.dm" @@ -3134,16 +3132,7 @@ #include "modular_causticcove\code\modules\spells\animagus\zad.dm" #include "modular_causticcove\code\modules\spells\invoked_single_target\temperitem.dm" #include "modular_causticcove\code\modules\spells\components\temper_clothing.dm" -#include "modular_causticcove\code\modules\spells\invoked_single_target\temperitem.dm" -#include "modular_causticcove\code\modules\spells\spell_types\wizard\conjure\conjure_tool.dm" -#include "modular_causticcove\code\modules\standardized_sprite\standardized_sprite_verb.dm" -#include "modular_causticcove\code\modules\supplies\supplies.dm" -#include "modular_causticcove\code\modules\supplies\supplyface.dm" -#include "modular_causticcove\code\modules\supplies\supplyface_datum.dm" -#include "modular_causticcove\code\modules\supplies\supplymail.dm" -#include "modular_causticcove\code\modules\supplies\voucher.dm" -#include "modular_causticcove\code\modules\supplies\supplymails\supplymail_ingredients.dm" -#include "modular_causticcove\code\modules\supplies\supplymails\supplymail_merchant.dm" +#include "modular_causticcove\code\modules\supplies\travellingmerchant.dm" #include "modular_causticcove\code\modules\taurs\taur_bodyparts.dm" #include "modular_causticcove\code\modules\taurs\taur_markings.dm" #include "modular_causticcove\code\modules\vices\combat_adverse.dm" diff --git a/tgui/packages/tgui/data_types/atom_basic.tsx b/tgui/packages/tgui/data_types/atom_basic.tsx new file mode 100644 index 00000000000..6cfe9c07acd --- /dev/null +++ b/tgui/packages/tgui/data_types/atom_basic.tsx @@ -0,0 +1,5 @@ +import { datum_basic } from "./datum_basic"; + +export type atom_basic = datum_basic & { + +} diff --git a/tgui/packages/tgui/data_types/datum_basic.tsx b/tgui/packages/tgui/data_types/datum_basic.tsx new file mode 100644 index 00000000000..78c9c034b06 --- /dev/null +++ b/tgui/packages/tgui/data_types/datum_basic.tsx @@ -0,0 +1,4 @@ +export type datum_basic = { + name: string; + desc: string; +} diff --git a/tgui/packages/tgui/data_types/supply_pack.tsx b/tgui/packages/tgui/data_types/supply_pack.tsx new file mode 100644 index 00000000000..aba96c6e6a6 --- /dev/null +++ b/tgui/packages/tgui/data_types/supply_pack.tsx @@ -0,0 +1,8 @@ +import { atom_basic } from "./atom_basic"; +import { datum_basic } from "./datum_basic"; + +export type merchant_supply_pack = datum_basic & { + group: string; + cost: number; + contains: atom_basic[]; +} diff --git a/tgui/packages/tgui/interfaces/Hermes.tsx b/tgui/packages/tgui/interfaces/Hermes.tsx index 88d7fb1c4ac..c09ae650841 100644 --- a/tgui/packages/tgui/interfaces/Hermes.tsx +++ b/tgui/packages/tgui/interfaces/Hermes.tsx @@ -2,6 +2,7 @@ import { useState } from 'react'; import { Box, Button, + Collapsible, Input, Section, Stack, @@ -9,7 +10,10 @@ import { } from 'tgui-core/components'; import { useBackend } from '../backend'; +import { merchant_supply_pack } from "../data_types/supply_pack"; import { Window } from '../layouts'; +import { SupplyPackSection } from "./common/SupplyPackStack"; + type Data = { balance: number; @@ -17,11 +21,26 @@ type Data = { quill_cost: number; letter_cost: number; has_tube?: boolean; + travellingmerchant_static?: tm_static; + travellingmerchant?: tm; }; +type tm = { + favours: number; + unlockedCats: string[]; + catunlockspending : number; +} + +type tm_static = { + supplypacks: merchant_supply_pack[]; +} + + + + export const Hermes = (props: any, context: any) => { const { act, data } = useBackend(); - const { balance, paper_cost, quill_cost, letter_cost, has_tube } = data; + const { balance, paper_cost, quill_cost, letter_cost, has_tube, travellingmerchant_static, travellingmerchant } = data; const [recipient, setRecipient] = useState(''); const [sender, setSender] = useState(''); @@ -32,6 +51,19 @@ export const Hermes = (props: any, context: any) => { const canBuyQuill = balance >= quill_cost; const canSendTube = letterContent.length > 0; + const packsByCat = travellingmerchant_static ? travellingmerchant_static.supplypacks.reduce( + (cat, pacc) => { + cat[pacc.group] = cat[pacc.group] || []; + cat[pacc.group].push(pacc); + return cat; + }, Object.create(null) + ): null; + + const addToCart = (pack : merchant_supply_pack) => { + + } + + return ( @@ -158,6 +190,36 @@ export const Hermes = (props: any, context: any) => { + { + packsByCat && + ( + + + + { + packsByCat.map((packcat) => ( + + + {travellingmerchant!.unlockedCats.includes(packcat) ? + + { + packsByCat[packcat].map((pacc) => ( + addToCart(pacc)} on_buy_txt='Add to drop' /> + )) + } + + : (travellingmerchant!.catunlockspending > 0 ? : ) + + } + + + )) + } + + + ) + + } diff --git a/tgui/packages/tgui/interfaces/common/InputButtons.tsx b/tgui/packages/tgui/interfaces/common/InputButtons.tsx index 151b61a9459..3019447c638 100644 --- a/tgui/packages/tgui/interfaces/common/InputButtons.tsx +++ b/tgui/packages/tgui/interfaces/common/InputButtons.tsx @@ -20,7 +20,7 @@ export const InputButtons = (props: InputButtonsProps) => { const { act, data } = useBackend(); const { large_buttons, swapped_buttons } = data; const { input, message, on_submit, on_cancel, disabled } = props; - + let on_submit_actual = on_submit; if (!on_submit_actual) { on_submit_actual = () => { diff --git a/tgui/packages/tgui/interfaces/common/SupplyPackStack.tsx b/tgui/packages/tgui/interfaces/common/SupplyPackStack.tsx new file mode 100644 index 00000000000..ab1555b767d --- /dev/null +++ b/tgui/packages/tgui/interfaces/common/SupplyPackStack.tsx @@ -0,0 +1,92 @@ +import { Button, Section, Stack } from 'tgui-core/components'; +import { BooleanLike } from "tgui-core/react"; + +import { merchant_supply_pack } from "../../data_types/supply_pack"; + +type SupplyPackSectionProps = { + pack: merchant_supply_pack +} & Partial<{ + on_buy: () => void; + on_buy_txt?: string; + /** Disables the submit button */ + disabled: boolean; + disabled_txt?: string; + budget?: number; + pricemult?: number; + extramult?: number; + tax_amt?: number; + paying_tax?: BooleanLike; + currency?: string; +}> + +export const SupplyPackSection = (props: SupplyPackSectionProps) => { + const { pack, budget, pricemult, extramult, tax_amt, paying_tax, currency, on_buy, on_buy_txt, disabled, disabled_txt } = props; + // Don't you ever be supplying paying_taxt true without also supplying tax_amt Peta, worst mistake of your lyfe! Other way around as well! + const finalprice = ((pack.cost * ((pricemult ? pricemult : 1)+ (extramult ? extramult : 0))) + (paying_tax? tax_amt! : 0)); + const CanBeBought = (budget ? finalprice <= budget : false); + const CostColour = (CanBeBought ? "#00ff00" : "#ff0000"); + let moneytype = currency ? currency : "Mammons"; + const PackContents = () => { + return ( +
+ + { + pack.contains.map(cont => (
{cont.desc}
)) + } +
+
+ ); + }; + + const BuyBtn = () => { + if(disabled) { + return ( + + ); + } + else{ + return ( + + ); + } + }; + + + return( +
+ + + Cost: + + + + + Price: + + + + + Base price: {pack.cost} + + {pricemult? "" : (Price Multiplier: *{pricemult})} + {extramult? "" : (Commission Multiplier: *{extramult})} + {tax_amt? "" : (paying_tax ? (Tax: {tax_amt}) : (Tax: {tax_amt}... in theory.))} + + Final price: {finalprice} {moneytype} + + + + + + + + + + {BuyBtn()} + + +
+ ); + + +}; From 53a284eaf60bbc5457fac3714cfb9af79e317a21 Mon Sep 17 00:00:00 2001 From: LDip999 Date: Thu, 19 Mar 2026 21:28:51 +0100 Subject: [PATCH 05/16] Travelling merchant? Maybe? --- _maps/map_files/roguetest/roguetest.dmm | 6 +- .../structures/crates_lockers/crates.dm | 12 + code/modules/roguetown/roguemachine/mail.dm | 5 +- .../modules/supplies/travellingmerchant.dm | 258 +++++++++++++++++- tgui/packages/tgui/data_types/datum_basic.tsx | 1 + tgui/packages/tgui/data_types/supply_pack.tsx | 1 - tgui/packages/tgui/interfaces/Hermes.tsx | 80 ++++-- .../interfaces/common/SupplyPackStack.tsx | 36 +-- 8 files changed, 330 insertions(+), 69 deletions(-) diff --git a/_maps/map_files/roguetest/roguetest.dmm b/_maps/map_files/roguetest/roguetest.dmm index 0de6c828198..19035ce60ef 100644 --- a/_maps/map_files/roguetest/roguetest.dmm +++ b/_maps/map_files/roguetest/roguetest.dmm @@ -392,10 +392,6 @@ /obj/item/seeds/wheat/oat, /turf/open/floor/rogue/grass, /area/rogue/outdoors) -"pj" = ( -/obj/structure/roguemachine/supplyface, -/turf/open/floor/rogue/grass, -/area/rogue/outdoors) "pk" = ( /obj/structure/rack/rogue/shelf/big{ icon_state = "shelf_biggest"; @@ -2978,7 +2974,7 @@ CZ yK yK rT -pj +vq rT rT rT diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index e8295e0fa62..bbc940d9617 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -20,6 +20,18 @@ var/obj/item/paper/fluff/jobs/cargo/manifest/manifest var/base_icon_state +//CC EDIT +/obj/structure/closet/crate/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/fulton) && (!opened)) + user.visible_message("[user] attaches a fulton to the [src]", "You attach a fulton to the [src]") + fulton = TRUE + qdel(W) + if(istype(W,/obj/item/drop_signal_horn) && (!opened)) + var/obj/item/drop_signal_horn/dsh = W + dsh.sendCrate(user, src) + . = ..() +//CC EDIT END + /obj/structure/closet/crate/Initialize() . = ..() if(!base_icon_state) diff --git a/code/modules/roguetown/roguemachine/mail.dm b/code/modules/roguetown/roguemachine/mail.dm index ae7d372019e..fbdbc2d5684 100644 --- a/code/modules/roguetown/roguemachine/mail.dm +++ b/code/modules/roguetown/roguemachine/mail.dm @@ -237,6 +237,7 @@ if("addToCart") var/datum/component/travelling_merchant/tmc = user.GetComponent(/datum/component/travelling_merchant) if(tmc) + tmc.add_to_cart(params["pckpath"]) return TRUE //CC Edit End @@ -688,11 +689,7 @@ if(href_list["directory"]) view_directory(usr) - //CC Edit return - - Topic_TravellingMerchant() - //CC Edit End /obj/structure/roguemachine/mail/proc/view_directory(mob/user) var/dat diff --git a/modular_causticcove/code/modules/supplies/travellingmerchant.dm b/modular_causticcove/code/modules/supplies/travellingmerchant.dm index 06d92e4a0e8..6361dbfeffb 100644 --- a/modular_causticcove/code/modules/supplies/travellingmerchant.dm +++ b/modular_causticcove/code/modules/supplies/travellingmerchant.dm @@ -4,16 +4,56 @@ allowed_sexes = list(MALE, FEMALE) allowed_races = RACES_ALL_KINDS category_tags = list(CTAG_TRADER, CTAG_COURTAGENT, CTAG_LICKER_WRETCH) + subclass_skills = list( + /datum/skill/combat/swords = SKILL_LEVEL_APPRENTICE, + /datum/skill/combat/knives = SKILL_LEVEL_APPRENTICE, + /datum/skill/misc/reading = SKILL_LEVEL_MASTER, + /datum/skill/misc/sneaking = SKILL_LEVEL_APPRENTICE, + /datum/skill/misc/stealing = SKILL_LEVEL_APPRENTICE, + /datum/skill/craft/cooking = SKILL_LEVEL_JOURNEYMAN, + /datum/skill/misc/riding = SKILL_LEVEL_JOURNEYMAN, + /datum/skill/combat/firearms = SKILL_LEVEL_APPRENTICE, + /datum/skill/craft/crafting = SKILL_LEVEL_APPRENTICE + ) class_select_category = CLASS_CAT_TRADER + outfit = /datum/outfit/job/roguetown/adventurer/travelling_merchant + subclass_stats = list( + STATKEY_PER = 2, + STATKEY_INT = 2, + ) + traits_applied = list(TRAIT_SEEPRICES, TRAIT_CICERONE) -/datum/outfit/job/roguetown/adventurer/trader/travelling_merchant/pre_equip(mob/living/carbon/human/H) +/datum/outfit/job/roguetown/adventurer/travelling_merchant/pre_equip(mob/living/carbon/human/H) ..() to_chat(H, span_warning("You are a merchant forever on the move, stopping by for this week in the duchy of Azure Peak. While this isn't your home, you are extremely well connected, and can aquire goods for half the normal cost by pulling favours and rank, although getting to said supplies might be a bit bothersome. Better hire some mercs! Whenever you set up your own little peddling place, or work to supply the city's own merchant, keep in mind that you have little use for mammons, and would rather use them to expand your influence, as you are a multinational businessperson, and have little desire for local currency.")) + //Morshu drip + shoes = /obj/item/clothing/shoes/roguetown/boots + pants = /obj/item/clothing/under/roguetown/tights/green + shirt = /obj/item/clothing/suit/roguetown/shirt/tunic/orange + armor = /obj/item/clothing/suit/roguetown/armor/leather/heavy/jacket + head = /obj/item/clothing/head/roguetown/archercap + belt = /obj/item/storage/belt/rogue/leather + beltl = /obj/item/gun/ballistic/arquebus_pistol + beltr = /obj/item/rogueweapon/scabbard/sheath/courtphysician + backl = /obj/item/storage/backpack/rogue/satchel + backr = /obj/item/storage/backpack/rogue/backpack/bagpack + neck = /obj/item/quiver/bulletpouch/iron + r_hand = /obj/item/rogueweapon/sword/rapier/courtphysician + //Signal horn + fultons + other slop + backpack_contents = list( + /obj/item/powderflask = 1, + /obj/item/drop_signal_horn = 1, + /obj/item/fulton = 5, + /obj/item/flashlight/flare/torch/lantern = 1, //Lampoil? + /obj/item/rope = 1, //Rope? + /obj/item/bomb = 1, //Bomb? + /obj/item/storage/belt/rogue/pouch/merchant/coins = 1, + ) //H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/travelling_merchant/checkfavours) //H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/travelling_merchant_sourcegoods) //H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/travelling_merchant_sellgoods) //H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/travelling_merchant_exploitmarket) - //H.AddComponent(/datum/component/travelling_merchant) + H.AddComponent(/datum/component/travelling_merchant) /*/obj/effect/proc_holder/spell/invoked/travelling_merchant/proc/getFavours(mob/living/user) @@ -75,37 +115,40 @@ "General Labour", "Health and Hygiene", "Self Defense") - var/list/unlockedcats = list() - var/catunlockspending = 3 + var/list/unlockedcats = list( + "Travelling Merchant" + ) + var/catunlockspending = 6 var/list/current_cart = list() /datum/component/travelling_merchant/Initialize(...) . = ..() - favourtimer = addtimer(CALLBACK(src, PROC_REF(AddFavours)),5 MINUTES, TIMER_STOPPABLE | TIMER_LOOP) + favourtimer = addtimer(CALLBACK(src, PROC_REF(AddFavoursOverTime)),5 MINUTES, TIMER_STOPPABLE | TIMER_LOOP) var/choice = SelectCategory() - while(choice && catunlockspending) + + while(choice && catunlockspending > 0) catunlockspending -= 1 unlockedcats += choice - choice = SelectCategory() + if(catunlockspending > 0) + choice = SelectCategory() /datum/component/travelling_merchant/proc/SelectCategory() var/list/catchoices = allcats - unlockedcats var/choice = tgui_input_list(parent,"Category slots currently left: [catunlockspending]","Choose your starting categories. You can choose additional categories later, at any hermes, and buy additional slots as well.",catchoices) return choice -/datum/component/travelling_merchant/proc/AddFavours() - to_chat(parent,"Your previous deals still reverberate through your channels. Their debts, material or sentimental ever incuring interest... you are now 50 favours richer, for a total of [favours] favours.") +/datum/component/travelling_merchant/proc/AddFavoursOverTime() favours += 50 + to_chat(parent,"Your previous deals still reverberate through your channels. Their debts, material or sentimental ever incuring interest... you are now 50 favours richer, for a total of [favours] mammons worth of clout.") /datum/component/travelling_merchant/Destroy() deltimer(favourtimer) favourtimer = null . = ..() - /datum/component/travelling_merchant/proc/ui_static_data_fill_in() var/list/data = list() - data["supplypacks"] = SSmerchant.supply_packs + data["supplypacks"] = generate_supplypacks_data(SSmerchant.supply_packs, allcats) return data @@ -114,5 +157,198 @@ data["favours"] = favours data["unlockedCats"] = unlockedcats data["catunlockspending"] = catunlockspending + data["currentcart"] = generate_supplypacks_data(current_cart, unlockedcats) return data +/datum/component/travelling_merchant/proc/generate_supplypacks_data(sps, filtergroup) + var/list/supplypacks = list() + for(var/pack in sps) + var/datum/supply_pack/PA + if(sps[pack]) + PA = sps[pack] + else if(pack) + PA = pack + if(!PA.group) + continue + if(!(PA.group in filtergroup)) + continue + if(!supplypacks[PA.group]) + supplypacks[PA.group] = list() + var/list/PAL = list() + PAL["group"] = PA.group + PAL["cost"] = PA.cost + PAL["name"] = PA.name + PAL["desc"] = PA.desc + PAL["path"] = PA.type + supplypacks[PA.group][PA.type] = PAL + return supplypacks + +/datum/component/travelling_merchant/proc/add_to_cart(path) + if(ispath(text2path(path), /datum/supply_pack)) + var/datum/supply_pack/pacc = text2path(path) + if((pacc.group in unlockedcats) && (favours >= pacc.cost)) + + current_cart += pacc + favours -= pacc.cost + to_chat(parent, span_info("Your suppliers have been notified, and it is already being loaded to a balloon. Use your horn to call it in!")) + + +/obj/item/drop_signal_horn + name = "drop signal horn" + desc = "A horn capable of signalling your position to passing by trading balloons. If you know the right people, you can use one of these to call in your contractors to fulfill their obligations, and/or take goods off your hands. Keep in mind, this may attract people thirsty for your goods!" + icon = 'icons/obj/items/signalhorn.dmi' + icon_state = "signalhorn" + slot_flags = ITEM_SLOT_HIP|ITEM_SLOT_NECK + w_class = WEIGHT_CLASS_NORMAL + grid_height = 32 + grid_width = 64 + var/obj/effect/landmark/quest_spawner/attunedmark + var/bloon = FALSE + +/obj/item/drop_signal_horn/examine() + . = ..() + if(attunedmark) + . += "The horn is currently attuned to a landmark at the moment.\n" + . += get_target_location() + else + . += "The horn is currently unattuned. You can attune it by blowing it, signalling your contractor's balloon to pick a place, after which, the horn will lead you to the meeting point. Once there, you'll have to blow the horn again, to signal that it's you. It will then unload cargo meant for you, and give you a minute to fulton up any goods of your own." + +/obj/item/drop_signal_horn/proc/createCrate(mob/living/user, datum/component/travelling_merchant/tmc) + var/obj/structure/closet/crate/chest/C = new(get_turf(user)) + for(var/currpacc in tmc.current_cart) + var/datum/supply_pack/rogue/currpacccasted = SSmerchant.supply_packs[currpacc] + for(var/it in currpacccasted.contains) + new it(C) + C.visible_message("The balloon drops a crate!") + +/obj/item/drop_signal_horn/proc/sendCrate(mob/living/user, obj/structure/closet/crate/C) + + var/datum/component/travelling_merchant/tmc = user.GetComponent(/datum/component/travelling_merchant) + if(!tmc) + return + var/turf/CT = get_turf(C) + if(attunedmark && (get_turf(attunedmark) == CT) && bloon) + if(C.fulton) + CT.visible_message("The [C]'s fulton activates, and the crate flies off to the skies, ready to be picked up by the balloon!") + var/imakebigmoney = 0 + for(var/obj/item/iteminstance in C.contents) + var/itemvalue = iteminstance.get_real_price() + if(itemvalue) + imakebigmoney += itemvalue + qdel(iteminstance) + qdel(C) + imakebigmoney = round(imakebigmoney) + to_chat(user, span_good("You have just sent up [imakebigmoney] mammons worth of goodies!")) + tmc.favours += imakebigmoney + else + to_chat(user,span_warning("Attach a fulton first!")) + else + to_chat(user, span_warning("There is no balloon overhead, or it isn't ready to take your package!")) + +/obj/item/drop_signal_horn/proc/bloongohome() + attunedmark.visible_message("The balloon leaves.") + if(prob(1)) + attunedmark.visible_message("A honeyspider waves from the balloon...? Wait who is piloting this thing?") + attunedmark = null + bloon = FALSE + + +/obj/item/drop_signal_horn/attack_self(mob/living/user) + . = ..() + var/datum/component/travelling_merchant/tmc = user.GetComponent(/datum/component/travelling_merchant) + if(!tmc) + to_chat(user, "The horn rejects you...") + var/turf/CT = get_turf(src) + if(attunedmark && (get_turf(attunedmark) == CT)) + user.visible_message("[user] raises the horn to their mouth, preparing to signal for a balloon...") + user.playsound_local(get_turf(user), 'sound/items/horn/signalhorn.ogg', 35, FALSE, pressure_affected = FALSE) + if(do_after(user, 5 SECONDS)) + if(user.consider_ambush(TRUE, TRUE)) + var/additional_ambushes = rand(0,4) + for(var/i = 0, i user_turf.z ? "[z_diff] level\s above you" : "[z_diff] level\s below you" + var/dx = target_turf.x - user_turf.x // EAST direction + var/dy = target_turf.y - user_turf.y // NORTH direction + var/distance = sqrt(dx*dx + dy*dy) + var/direction_text = get_precise_direction_between(user_turf, target_turf) + var/returnval = "The balloon awaits you [distance] paces to the [direction_text]!" + if(last_z_level_hint) + returnval += "\n[last_z_level_hint], that is." + return returnval + +/obj/item/fulton + name = "fulton device" + desc = "A little package, designed to be attached to storage chests, to be lifted into the air for merchant balloons. While you could use it anywhere... it's kind of pointless to litter the air with free stuff, so be sure you signal for a balloon first!" + icon = 'modular/Neu_Food/icons/cookware/ration.dmi' + icon_state = "ration_small" + w_class = WEIGHT_CLASS_TINY + grid_height = 32 + grid_width = 32 + +/datum/supply_pack/rogue/travelling_merchant + group = "Travelling Merchant" + crate_name = "Mercantile Supplies" + crate_type = /obj/structure/closet/crate/chest + +/datum/supply_pack/rogue/travelling_merchant/dsh + name = "Spare drop signal horn" + cost = 500 + contains = list(/obj/item/drop_signal_horn) + +/datum/supply_pack/rogue/travelling_merchant/fultons + name = "5 fultons" + cost = 10 + contains = list(/obj/item/fulton) + + +/obj/structure/closet/crate + var/fulton = FALSE + + +/obj/item/clothing/suit/roguetown/shirt/tunic/orange + color = CLOTHING_ORANGE diff --git a/tgui/packages/tgui/data_types/datum_basic.tsx b/tgui/packages/tgui/data_types/datum_basic.tsx index 78c9c034b06..dabd026e946 100644 --- a/tgui/packages/tgui/data_types/datum_basic.tsx +++ b/tgui/packages/tgui/data_types/datum_basic.tsx @@ -1,4 +1,5 @@ export type datum_basic = { name: string; desc: string; + path?: string; } diff --git a/tgui/packages/tgui/data_types/supply_pack.tsx b/tgui/packages/tgui/data_types/supply_pack.tsx index aba96c6e6a6..921a39277c7 100644 --- a/tgui/packages/tgui/data_types/supply_pack.tsx +++ b/tgui/packages/tgui/data_types/supply_pack.tsx @@ -4,5 +4,4 @@ import { datum_basic } from "./datum_basic"; export type merchant_supply_pack = datum_basic & { group: string; cost: number; - contains: atom_basic[]; } diff --git a/tgui/packages/tgui/interfaces/Hermes.tsx b/tgui/packages/tgui/interfaces/Hermes.tsx index c09ae650841..0d7159e6ebf 100644 --- a/tgui/packages/tgui/interfaces/Hermes.tsx +++ b/tgui/packages/tgui/interfaces/Hermes.tsx @@ -29,10 +29,15 @@ type tm = { favours: number; unlockedCats: string[]; catunlockspending : number; + currentcart: merchant_supply_pack_cat[]; } type tm_static = { - supplypacks: merchant_supply_pack[]; + supplypacks: merchant_supply_pack_cat[] +} + +type merchant_supply_pack_cat = { + } @@ -51,22 +56,23 @@ export const Hermes = (props: any, context: any) => { const canBuyQuill = balance >= quill_cost; const canSendTube = letterContent.length > 0; - const packsByCat = travellingmerchant_static ? travellingmerchant_static.supplypacks.reduce( - (cat, pacc) => { - cat[pacc.group] = cat[pacc.group] || []; - cat[pacc.group].push(pacc); - return cat; - }, Object.create(null) - ): null; + const packsByCat = travellingmerchant_static ? travellingmerchant_static.supplypacks : null; - const addToCart = (pack : merchant_supply_pack) => { + + const addToCart = (pck : merchant_supply_pack) => { + act("addToCart", { pckpath : pck.path }); + }; + const removeFromCart = (pck : merchant_supply_pack) => { - } + }; + return ( - - + + + {/* JSON.stringify(packsByCat, null, 4)*/} + { @@ -195,32 +201,54 @@ export const Hermes = (props: any, context: any) => { ( + Current mammons worth of favours: {travellingmerchant!.favours} - { - packsByCat.map((packcat) => ( - - - {travellingmerchant!.unlockedCats.includes(packcat) ? - - { - packsByCat[packcat].map((pacc) => ( - addToCart(pacc)} on_buy_txt='Add to drop' /> + + {/* JSON.stringify(travellingmerchant?.currentcart, null, 4)*/} + { + Object.keys(travellingmerchant!.currentcart).map((key) => ( + + { + Object.keys(travellingmerchant!.currentcart[key]).map((pacckey) => ( + + removeFromCart(travellingmerchant!.currentcart[key][pacckey])} on_buy_txt='Remove from drop' /> + + )) + } + + + )) + } + + {Object.keys(packsByCat).map((key) => ( + + + + {travellingmerchant!.unlockedCats.includes(key) ? + + Object.keys(packsByCat[key]).map((pacckey) => ( + + addToCart(packsByCat[key][pacckey])} on_buy_txt='Add to drop' /> + )) - } - - : (travellingmerchant!.catunlockspending > 0 ? : ) + + + : + (travellingmerchant!.catunlockspending > 0 ? : ) + } - } + )) - } + } ) } + } ); diff --git a/tgui/packages/tgui/interfaces/common/SupplyPackStack.tsx b/tgui/packages/tgui/interfaces/common/SupplyPackStack.tsx index ab1555b767d..75160a28736 100644 --- a/tgui/packages/tgui/interfaces/common/SupplyPackStack.tsx +++ b/tgui/packages/tgui/interfaces/common/SupplyPackStack.tsx @@ -26,7 +26,7 @@ export const SupplyPackSection = (props: SupplyPackSectionProps) => { const CanBeBought = (budget ? finalprice <= budget : false); const CostColour = (CanBeBought ? "#00ff00" : "#ff0000"); let moneytype = currency ? currency : "Mammons"; - const PackContents = () => { + /* const PackContents = () => { return (
@@ -36,7 +36,7 @@ export const SupplyPackSection = (props: SupplyPackSectionProps) => {
); - }; + };*/ const BuyBtn = () => { if(disabled) { @@ -53,33 +53,25 @@ export const SupplyPackSection = (props: SupplyPackSectionProps) => { return( -
+
Cost: - - - Price: - - - - - Base price: {pack.cost} - - {pricemult? "" : (Price Multiplier: *{pricemult})} - {extramult? "" : (Commission Multiplier: *{extramult})} + + + + Base price: {pack.cost} + + {pricemult? "" : (Price Multiplier: {pricemult})} + {extramult? "" : (Commission Multiplier: {extramult})} {tax_amt? "" : (paying_tax ? (Tax: {tax_amt}) : (Tax: {tax_amt}... in theory.))} - + Final price: {finalprice} {moneytype} - - - - - - - + + + {BuyBtn()} From 03872daee66b8256887da91330264c49193e0765 Mon Sep 17 00:00:00 2001 From: LDip999 Date: Fri, 20 Mar 2026 01:17:28 +0100 Subject: [PATCH 06/16] Bugfixes --- .../code/modules/supplies/travellingmerchant.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modular_causticcove/code/modules/supplies/travellingmerchant.dm b/modular_causticcove/code/modules/supplies/travellingmerchant.dm index 6361dbfeffb..7889e1af38e 100644 --- a/modular_causticcove/code/modules/supplies/travellingmerchant.dm +++ b/modular_causticcove/code/modules/supplies/travellingmerchant.dm @@ -219,6 +219,7 @@ var/datum/supply_pack/rogue/currpacccasted = SSmerchant.supply_packs[currpacc] for(var/it in currpacccasted.contains) new it(C) + tmc.current_cart -= currpacc C.visible_message("The balloon drops a crate!") /obj/item/drop_signal_horn/proc/sendCrate(mob/living/user, obj/structure/closet/crate/C) @@ -259,7 +260,7 @@ if(!tmc) to_chat(user, "The horn rejects you...") var/turf/CT = get_turf(src) - if(attunedmark && (get_turf(attunedmark) == CT)) + if(attunedmark && (get_turf(attunedmark) == CT) && (!bloon)) user.visible_message("[user] raises the horn to their mouth, preparing to signal for a balloon...") user.playsound_local(get_turf(user), 'sound/items/horn/signalhorn.ogg', 35, FALSE, pressure_affected = FALSE) if(do_after(user, 5 SECONDS)) From 1901deb50ad07466520ee01e72c3a2f482cfaa35 Mon Sep 17 00:00:00 2001 From: LDip999 Date: Fri, 20 Mar 2026 01:17:41 +0100 Subject: [PATCH 07/16] Unslopifies the define --- modular_causticcove/code/__DEFINES/supplies.dm | 2 +- modular_causticcove/code/modules/supplies/supplymail.dm | 2 +- .../modules/supplies/supplymails/supplymail_ingredients.dm | 6 +++--- .../modules/supplies/supplymails/supplymail_merchant.dm | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/modular_causticcove/code/__DEFINES/supplies.dm b/modular_causticcove/code/__DEFINES/supplies.dm index 0d842439713..144f326c9ae 100644 --- a/modular_causticcove/code/__DEFINES/supplies.dm +++ b/modular_causticcove/code/__DEFINES/supplies.dm @@ -1,4 +1,4 @@ -#define SUPPLY_TIER_SLOP "budget" +#define SUPPLY_TIER_BUDGET "budget" #define SUPPLY_TIER_COMMON "common" #define SUPPLY_TIER_GOOD "good" #define SUPPLY_TIER_EXCELLENT "excellent" diff --git a/modular_causticcove/code/modules/supplies/supplymail.dm b/modular_causticcove/code/modules/supplies/supplymail.dm index d49fae44521..c712abe7536 100644 --- a/modular_causticcove/code/modules/supplies/supplymail.dm +++ b/modular_causticcove/code/modules/supplies/supplymail.dm @@ -2,7 +2,7 @@ var/name = "Number fifteen: Burger Duke Foot Cabbage" var/desc = "If you see this let Mia know..." var/cost = 0 - var/supply_tier = SUPPLY_TIER_SLOP + var/supply_tier = SUPPLY_TIER_BUDGET var/list/contents = list( /obj/item/reagent_containers/food/snacks/grown/cabbage/rogue ) diff --git a/modular_causticcove/code/modules/supplies/supplymails/supplymail_ingredients.dm b/modular_causticcove/code/modules/supplies/supplymails/supplymail_ingredients.dm index 0b3f194a1f4..24e22fc7db8 100644 --- a/modular_causticcove/code/modules/supplies/supplymails/supplymail_ingredients.dm +++ b/modular_causticcove/code/modules/supplies/supplymails/supplymail_ingredients.dm @@ -10,7 +10,7 @@ name = "Small cache of health potion ingredients" desc = "Some odds and ends for brewing health potions" cost = 10 - supply_tier = SUPPLY_TIER_SLOP + supply_tier = SUPPLY_TIER_BUDGET contents = list( /obj/item/alch/symphitum, /obj/item/alch/symphitum, @@ -40,7 +40,7 @@ name = "Small cache of strong health potion ingredients" desc = "Some odds and ends for brewing strong health potions" cost = 30 - supply_tier = SUPPLY_TIER_SLOP + supply_tier = SUPPLY_TIER_BUDGET contents = list( /obj/item/alch/calendula, /obj/item/alch/calendula, @@ -77,7 +77,7 @@ name = "Begineer's summoning supplies" desc = "Some odds and ends for begineer summoners, enough for 4 summons of each category" cost = 10 - supply_tier = SUPPLY_TIER_SLOP + supply_tier = SUPPLY_TIER_BUDGET contents = list( /obj/item/ash, /obj/item/ash, diff --git a/modular_causticcove/code/modules/supplies/supplymails/supplymail_merchant.dm b/modular_causticcove/code/modules/supplies/supplymails/supplymail_merchant.dm index 4227f88a549..0140b36f67e 100644 --- a/modular_causticcove/code/modules/supplies/supplymails/supplymail_merchant.dm +++ b/modular_causticcove/code/modules/supplies/supplymails/supplymail_merchant.dm @@ -20,7 +20,7 @@ name = "Small cache of health potions" desc = "5 red potions" cost = 50 - supply_tier = SUPPLY_TIER_SLOP + supply_tier = SUPPLY_TIER_BUDGET contents = list( /obj/item/reagent_containers/glass/bottle/rogue/healthpot, /obj/item/reagent_containers/glass/bottle/rogue/healthpot, @@ -33,7 +33,7 @@ name = "Tiny cache of mana potions" desc = "3 blue potions" cost = 15 - supply_tier = SUPPLY_TIER_SLOP + supply_tier = SUPPLY_TIER_BUDGET contents = list( /obj/item/reagent_containers/glass/bottle/rogue/manapot, /obj/item/reagent_containers/glass/bottle/rogue/manapot, From e8c259c729b829d5b7cf9a05730f066463f14a8f Mon Sep 17 00:00:00 2001 From: LDip999 Date: Fri, 20 Mar 2026 02:37:59 +0100 Subject: [PATCH 08/16] Adds missing return --- modular_causticcove/code/modules/supplies/travellingmerchant.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/modular_causticcove/code/modules/supplies/travellingmerchant.dm b/modular_causticcove/code/modules/supplies/travellingmerchant.dm index 7889e1af38e..eaf0cd04280 100644 --- a/modular_causticcove/code/modules/supplies/travellingmerchant.dm +++ b/modular_causticcove/code/modules/supplies/travellingmerchant.dm @@ -294,6 +294,7 @@ var/direction_text = get_precise_direction_between(get_turf(src), get_turf(attunedmark)) CT.visible_message("A balloon flies overhead, heading towards [direction_text]") user.playsound_local(get_turf(user), 'sound/items/horn/signalhorn.ogg', 35, FALSE, pressure_affected = FALSE) + return /obj/item/drop_signal_horn/proc/locationgood(landmark) var/turf/lmarkturf = get_turf(landmark) From 66e56d5692cea178bef30296f886c53c2626244e Mon Sep 17 00:00:00 2001 From: LDip999 Date: Fri, 20 Mar 2026 04:12:06 +0100 Subject: [PATCH 09/16] Jaks and hopefully not overcorrects (Eventually make it so that ambushes scale with cargo?) --- .../code/modules/supplies/travellingmerchant.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modular_causticcove/code/modules/supplies/travellingmerchant.dm b/modular_causticcove/code/modules/supplies/travellingmerchant.dm index eaf0cd04280..b345cef89e7 100644 --- a/modular_causticcove/code/modules/supplies/travellingmerchant.dm +++ b/modular_causticcove/code/modules/supplies/travellingmerchant.dm @@ -211,7 +211,7 @@ . += "The horn is currently attuned to a landmark at the moment.\n" . += get_target_location() else - . += "The horn is currently unattuned. You can attune it by blowing it, signalling your contractor's balloon to pick a place, after which, the horn will lead you to the meeting point. Once there, you'll have to blow the horn again, to signal that it's you. It will then unload cargo meant for you, and give you a minute to fulton up any goods of your own." + . += "The horn is currently unattuned. You can attune it by blowing it, signalling your contractor's balloon to pick a place, after which, the horn will lead you to the meeting point. Once there, you'll have to blow the horn again, to signal that it's you. It will then unload cargo meant for you, and give you 10 minutes to fulton up any goods of your own." /obj/item/drop_signal_horn/proc/createCrate(mob/living/user, datum/component/travelling_merchant/tmc) var/obj/structure/closet/crate/chest/C = new(get_turf(user)) @@ -265,7 +265,7 @@ user.playsound_local(get_turf(user), 'sound/items/horn/signalhorn.ogg', 35, FALSE, pressure_affected = FALSE) if(do_after(user, 5 SECONDS)) if(user.consider_ambush(TRUE, TRUE)) - var/additional_ambushes = rand(0,4) + var/additional_ambushes = rand(0,1) for(var/i = 0, i Date: Fri, 20 Mar 2026 19:52:03 +0100 Subject: [PATCH 10/16] Repairkits, first aid pouches, cheaper steward import alternative, and mistery meat, oh my! --- .../modules/supplies/travellingmerchant.dm | 115 +++++++++++++++++- 1 file changed, 114 insertions(+), 1 deletion(-) diff --git a/modular_causticcove/code/modules/supplies/travellingmerchant.dm b/modular_causticcove/code/modules/supplies/travellingmerchant.dm index b345cef89e7..e90abbdf500 100644 --- a/modular_causticcove/code/modules/supplies/travellingmerchant.dm +++ b/modular_causticcove/code/modules/supplies/travellingmerchant.dm @@ -116,7 +116,8 @@ "Health and Hygiene", "Self Defense") var/list/unlockedcats = list( - "Travelling Merchant" + "Travelling Merchant", + "Private Workshop" ) var/catunlockspending = 6 var/list/current_cart = list() @@ -347,6 +348,116 @@ cost = 10 contains = list(/obj/item/fulton) +/datum/supply_pack/rogue/travelling_merchant_pw + group = "Private Workshop" + crate_name = "Private Workshop" + crate_type = /obj/structure/closet/crate/chest + +/datum/supply_pack/rogue/travelling_merchant_pw/enchanting/woodcutting + name = "Woodcutting enchantment scroll" + cost = 100 + contains = list(/obj/item/enchantmentscroll/woodcut) + +/datum/supply_pack/rogue/travelling_merchant_pw/enchanting/mining + name = "Mining enchantment scroll" + cost = 100 + contains = list(/obj/item/enchantmentscroll/mining) + +/datum/supply_pack/rogue/travelling_merchant_pw/enchanting/light + name = "Light enchantment scroll" + cost = 100 + contains = list(/obj/item/enchantmentscroll/light) + +/datum/supply_pack/rogue/travelling_merchant_pw/enchanting/holding + name = "Holding enchantment scroll" + cost = 250 + contains = list(/obj/item/enchantmentscroll/holding) + +/datum/supply_pack/rogue/travelling_merchant_pw/mats/gold + name = "Raw gold" + cost = 65 + contains = list(/obj/item/rogueore/gold) + +/datum/supply_pack/rogue/travelling_merchant_pw/mats/iron + name = "Raw iron" + cost = 9 + contains = list(/obj/item/rogueore/iron) + +/datum/supply_pack/rogue/travelling_merchant_pw/mats/coal + name = "Coal" + cost = 7 + contains = list(/obj/item/rogueore/coal) + +/datum/supply_pack/rogue/travelling_merchant_pw/mats/log + name = "Large wooden log" + cost = 3 + contains = list(/obj/item/grown/log/tree) + +/datum/supply_pack/rogue/travelling_merchant_pw/usables/repairpoor + name = "Budget repair kit" + cost = 50 + contains = list(/obj/item/repair_kit/bad, /obj/item/repair_kit/metal/bad) + +/datum/supply_pack/rogue/travelling_merchant_pw/usables/emmed + name = "Individual First Aid Pouch" + cost = 30 + contains = list(/obj/item/storage/belt/rogue/pouch/medicine) + +/datum/supply_pack/rogue/travelling_merchant_pw/usables/emmed + name = "Mercenary First Aid Pouch" + cost = 60 + contains = list(/obj/item/storage/belt/rogue/pouch/medicine/merc) + + +/datum/supply_pack/rogue/travelling_merchant_pw/food/misterymeat + name = "Mistery meat...?" //Hehe + cost = 1 + contains = list (/obj/item/ration/misterymeat) + + + + +/obj/item/storage/belt/rogue/pouch/medicine/merc + populate_contents = list( + /obj/item/needle, + /obj/item/natural/cloth/presoaked/advanced, + /obj/item/natural/cloth/presoaked/advanced, + /obj/item/reagent_containers/glass/bottle/alchemical/healthpotnew + ) + + +/obj/item/natural/cloth/presoaked/advanced + name = "Grenzelcloth" + +/obj/item/natural/cloth/presoaked/advanced/Initialize() + medicine_quality = 1 + medicine_amount = 60 + desc += " This one has been imbued masterfully in a mixed medicinal coating..." + detail_color = "#820000" + +#define MISTERYMEAT_LIST list(\ + /obj/item/reagent_containers/food/snacks/rogue/meat/steak = 5,\ + /obj/item/reagent_containers/food/snacks/rogue/meat_rotten = 2,\ + /obj/item/reagent_containers/food/snacks/rogue/meat/spider = 2,\ + /obj/item/reagent_containers/food/snacks/rogue/meat/fatty = 1,\ + /obj/item/reagent_containers/food/snacks/rogue/meat/poultry = 4,\ + /obj/item/reagent_containers/food/snacks/rogue/meat/crab = 3,\ + /obj/item/reagent_containers/food/snacks/rogue/meat/rabbit = 4,\ + /obj/item/reagent_containers/food/snacks/rogue/meat/steak/wolf = 2,\ + /obj/item/reagent_containers/food/snacks/rogue/meat/fish = 5,\ + /obj/item/reagent_containers/food/snacks/rogue/meat/shellfish = 4,\ +) + +/obj/item/ration/misterymeat/Initialize() + . = ..() + food = pickweight(MISTERYMEAT_LIST) //LET'S GO GAMBLING! + food.rotprocess = FALSE + name = "Mistery meat..." + desc = "Who knows what's in it..." + icon_state = "ration_large" + update_icon() + + /obj/structure/closet/crate var/fulton = FALSE @@ -354,3 +465,5 @@ /obj/item/clothing/suit/roguetown/shirt/tunic/orange color = CLOTHING_ORANGE + + From 4961314d7a957484666afb41d3d2f425161db9b5 Mon Sep 17 00:00:00 2001 From: LDip999 Date: Fri, 20 Mar 2026 19:56:07 +0100 Subject: [PATCH 11/16] Linter weeps --- modular_causticcove/code/modules/supplies/travellingmerchant.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/modular_causticcove/code/modules/supplies/travellingmerchant.dm b/modular_causticcove/code/modules/supplies/travellingmerchant.dm index e90abbdf500..c38898461af 100644 --- a/modular_causticcove/code/modules/supplies/travellingmerchant.dm +++ b/modular_causticcove/code/modules/supplies/travellingmerchant.dm @@ -430,6 +430,7 @@ name = "Grenzelcloth" /obj/item/natural/cloth/presoaked/advanced/Initialize() + . = ..() medicine_quality = 1 medicine_amount = 60 desc += " This one has been imbued masterfully in a mixed medicinal coating..." From 7f80fbec27f214f46fd28c30395d6819ca65c1f3 Mon Sep 17 00:00:00 2001 From: LDip999 Date: Fri, 20 Mar 2026 21:04:46 +0100 Subject: [PATCH 12/16] Bugfix --- .../code/modules/supplies/travellingmerchant.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modular_causticcove/code/modules/supplies/travellingmerchant.dm b/modular_causticcove/code/modules/supplies/travellingmerchant.dm index c38898461af..8ed964eeaf9 100644 --- a/modular_causticcove/code/modules/supplies/travellingmerchant.dm +++ b/modular_causticcove/code/modules/supplies/travellingmerchant.dm @@ -114,7 +114,8 @@ "Exotic Import", "General Labour", "Health and Hygiene", - "Self Defense") + "Self Defense", + "Private Workshop") var/list/unlockedcats = list( "Travelling Merchant", "Private Workshop" From 3e0ceb8fc185d86a44b615316132d845215bd416 Mon Sep 17 00:00:00 2001 From: LDip999 Date: Fri, 20 Mar 2026 22:31:48 +0100 Subject: [PATCH 13/16] Bog removed --- modular_causticcove/code/modules/supplies/travellingmerchant.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_causticcove/code/modules/supplies/travellingmerchant.dm b/modular_causticcove/code/modules/supplies/travellingmerchant.dm index 8ed964eeaf9..bd4793c1725 100644 --- a/modular_causticcove/code/modules/supplies/travellingmerchant.dm +++ b/modular_causticcove/code/modules/supplies/travellingmerchant.dm @@ -303,7 +303,7 @@ if(!lmarkturf.can_see_sky()) return FALSE var/area/lmarkarea = get_area(lmarkturf) - if(!(lmarkarea.threat_region in list(THREAT_REGION_AZUREAN_COAST, THREAT_REGION_MOUNT_DECAP , THREAT_REGION_TERRORBOG))) + if(!(lmarkarea.threat_region in list(THREAT_REGION_AZUREAN_COAST, THREAT_REGION_MOUNT_DECAP))) return FALSE return TRUE From ed3e7630e1b6f0d3d0c7d4c687c01792c463eb1f Mon Sep 17 00:00:00 2001 From: LDip999 Date: Sat, 21 Mar 2026 13:44:11 +0100 Subject: [PATCH 14/16] Fixes travlling merchant not showing up and mistery meat being bugged hopefully --- .../code/modules/supplies/travellingmerchant.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modular_causticcove/code/modules/supplies/travellingmerchant.dm b/modular_causticcove/code/modules/supplies/travellingmerchant.dm index bd4793c1725..55dd45b8e46 100644 --- a/modular_causticcove/code/modules/supplies/travellingmerchant.dm +++ b/modular_causticcove/code/modules/supplies/travellingmerchant.dm @@ -115,6 +115,7 @@ "General Labour", "Health and Hygiene", "Self Defense", + "Travelling Merchant", "Private Workshop") var/list/unlockedcats = list( "Travelling Merchant", @@ -452,12 +453,12 @@ /obj/item/ration/misterymeat/Initialize() . = ..() - food = pickweight(MISTERYMEAT_LIST) //LET'S GO GAMBLING! + var/foodstuffs = pickweight(MISTERYMEAT_LIST) //LET'S GO GAMBLING! + food = new foodstuffs(src) food.rotprocess = FALSE name = "Mistery meat..." desc = "Who knows what's in it..." icon_state = "ration_large" - update_icon() From a2136f8f547e65b17c4443ee4a062b173e09c70f Mon Sep 17 00:00:00 2001 From: LDip999 Date: Sat, 21 Mar 2026 13:45:43 +0100 Subject: [PATCH 15/16] Ambushes too easy walancejakking it --- modular_causticcove/code/modules/supplies/travellingmerchant.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_causticcove/code/modules/supplies/travellingmerchant.dm b/modular_causticcove/code/modules/supplies/travellingmerchant.dm index 55dd45b8e46..2cb53cf32e7 100644 --- a/modular_causticcove/code/modules/supplies/travellingmerchant.dm +++ b/modular_causticcove/code/modules/supplies/travellingmerchant.dm @@ -268,7 +268,7 @@ user.playsound_local(get_turf(user), 'sound/items/horn/signalhorn.ogg', 35, FALSE, pressure_affected = FALSE) if(do_after(user, 5 SECONDS)) if(user.consider_ambush(TRUE, TRUE)) - var/additional_ambushes = rand(0,1) + var/additional_ambushes = rand(0,3) for(var/i = 0, i Date: Mon, 23 Mar 2026 16:59:47 +0100 Subject: [PATCH 16/16] Stop sending people to the hamlet! --- modular_causticcove/code/modules/supplies/travellingmerchant.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modular_causticcove/code/modules/supplies/travellingmerchant.dm b/modular_causticcove/code/modules/supplies/travellingmerchant.dm index 2cb53cf32e7..4bfea67e304 100644 --- a/modular_causticcove/code/modules/supplies/travellingmerchant.dm +++ b/modular_causticcove/code/modules/supplies/travellingmerchant.dm @@ -306,6 +306,8 @@ var/area/lmarkarea = get_area(lmarkturf) if(!(lmarkarea.threat_region in list(THREAT_REGION_AZUREAN_COAST, THREAT_REGION_MOUNT_DECAP))) return FALSE + if(!lmarkarea.ambush_mobs) + return FALSE return TRUE /obj/item/drop_signal_horn/proc/get_target_location()