diff --git a/_maps/map_files/generic/centcomm.dmm b/_maps/map_files/generic/centcomm.dmm
index c5859d8697f..eff94377911 100644
--- a/_maps/map_files/generic/centcomm.dmm
+++ b/_maps/map_files/generic/centcomm.dmm
@@ -377,6 +377,10 @@
},
/turf/simulated/floor/plasteel/dark,
/area/ninja/outpost)
+"bA" = (
+/obj/effect/landmark/spawner/tradergearminor,
+/turf/simulated/floor/mineral/titanium,
+/area/shuttle/trade/sol)
"bB" = (
/obj/effect/landmark/abductor/scientist,
/turf/simulated/floor/plating/abductor,
@@ -6181,7 +6185,7 @@
/turf/simulated/floor/carpet/green,
/area/ghost_bar)
"vf" = (
-/obj/effect/landmark/spawner/soltrader,
+/obj/effect/landmark/spawner/trader,
/obj/structure/chair/comfy/brown,
/turf/simulated/floor/wood,
/area/trader_station/sol)
@@ -6281,7 +6285,7 @@
/area/centcom/control)
"vu" = (
/obj/structure/railing,
-/obj/effect/landmark/spawner/soltrader,
+/obj/effect/landmark/spawner/trader,
/obj/structure/chair/comfy/brown{
dir = 4
},
@@ -6331,7 +6335,7 @@
/area/trader_station/sol)
"vD" = (
/obj/structure/railing,
-/obj/effect/landmark/spawner/soltrader,
+/obj/effect/landmark/spawner/trader,
/obj/structure/chair/comfy/brown{
dir = 8
},
@@ -12756,6 +12760,10 @@
icon_state = "bot"
},
/area/shuttle/escape)
+"SU" = (
+/obj/effect/landmark/spawner/tradergearmajor,
+/turf/simulated/floor/mineral/titanium,
+/area/shuttle/trade/sol)
"SV" = (
/turf/simulated/wall/indestructible/fakeglass,
/area/tdome/tdomeadmin)
@@ -48808,9 +48816,9 @@ vG
of
oI
pc
-rK
+bA
pc
-uP
+SU
pc
vY
of
@@ -49322,9 +49330,9 @@ vG
of
oS
pc
-pa
+rK
pc
-pa
+uP
pc
wa
of
diff --git a/code/datums/outfits/outfit_admin.dm b/code/datums/outfits/outfit_admin.dm
index f6067d0a316..aeeb4f1a16a 100644
--- a/code/datums/outfits/outfit_admin.dm
+++ b/code/datums/outfits/outfit_admin.dm
@@ -834,25 +834,23 @@
)
is_solgov_lieutenant = TRUE
-/datum/outfit/admin/sol_trader
- name = "Sol Trader"
-
+/datum/outfit/admin/trader
+ name = "Trader"
uniform = /obj/item/clothing/under/rank/cargo/tech
back = /obj/item/storage/backpack/industrial
belt = /obj/item/melee/classic_baton
- head = /obj/item/clothing/head/soft
shoes = /obj/item/clothing/shoes/black
l_ear = /obj/item/radio/headset
glasses = /obj/item/clothing/glasses/sunglasses
id = /obj/item/card/id/supply
pda = /obj/item/pda
backpack_contents = list(
- /obj/item/storage/box/survival = 1,
/obj/item/hand_labeler = 1,
- /obj/item/hand_labeler_refill = 1
+ /obj/item/hand_labeler_refill = 2
)
+ box = /obj/item/storage/box/survival
-/datum/outfit/admin/sol_trader/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/admin/trader/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
. = ..()
if(visualsOnly)
return
@@ -862,6 +860,78 @@
apply_to_card(I, H, list(ACCESS_TRADE_SOL, ACCESS_MAINT_TUNNELS, ACCESS_EXTERNAL_AIRLOCKS), name)
H.sec_hud_set_ID()
+/datum/outfit/admin/trader/sol
+ name = "Trans-Solar Federation Trader"
+ suit = /obj/item/clothing/suit/jacket/cargobomber
+ head = /obj/item/clothing/head/soft
+
+/datum/outfit/admin/trader/cyber
+ name = "Cybersun Industries Trader"
+ uniform = /obj/item/clothing/under/syndicate/tacticool
+ suit = /obj/item/clothing/suit/jacket/syndicatebomber
+ gloves = /obj/item/clothing/gloves/color/black
+ shoes = /obj/item/clothing/shoes/combat
+ belt = /obj/item/melee/classic_baton/telescopic
+ back = /obj/item/storage/backpack/security
+ box = /obj/item/storage/box/survival
+
+/datum/outfit/admin/trader/commie
+ name = "USSP Trader"
+ uniform = /obj/item/clothing/under/new_soviet
+ suit = /obj/item/clothing/suit/sovietcoat
+ head = /obj/item/clothing/head/ushanka
+ box = /obj/item/storage/box/soviet
+
+/datum/outfit/admin/trader/unathi
+ name = "Glint-Scales Trader"
+ uniform = /obj/item/clothing/under/rank/cargo/qm
+ suit = /obj/item/clothing/suit/unathi/robe
+ shoes = /obj/item/clothing/shoes/footwraps
+
+/datum/outfit/admin/trader/vulp
+ name = "Steadfast Trading Co. Trader"
+ uniform = /obj/item/clothing/under/rank/cargo/qm/formal
+ suit = /obj/item/clothing/suit/jacket/leather/overcoat
+ belt = /obj/item/melee/classic_baton/telescopic
+
+/datum/outfit/admin/trader/ipc
+ name = "Synthetic Union Trader"
+ uniform = /obj/item/clothing/under/misc/vice
+ suit = /obj/item/clothing/suit/storage/iaa/blackjacket/armored
+ belt = /obj/item/melee/classic_baton/telescopic
+ back = /obj/item/storage/backpack/robotics
+
+/datum/outfit/admin/trader/vox
+ name = "Skipjack Trader"
+ uniform = /obj/item/clothing/under/vox/vox_casual
+ suit = /obj/item/clothing/suit/hooded/vox_robes
+ gloves = /obj/item/clothing/gloves/color/yellow/vox
+ shoes = /obj/item/clothing/shoes/magboots/vox
+ belt = /obj/item/melee/classic_baton/telescopic
+ mask = /obj/item/clothing/mask/breath/vox/respirator
+ suit_store = /obj/item/tank/internals/emergency_oxygen/double/vox
+ box = /obj/item/storage/box/survival_vox
+
+/datum/outfit/admin/trader/skrell
+ name = "Solar-Central Compact Trader"
+ uniform = /obj/item/clothing/under/misc/durathread
+ suit = /obj/item/clothing/suit/space/skrell/white
+ belt = /obj/item/melee/classic_baton/telescopic
+
+/datum/outfit/admin/trader/grey
+ name = "Technocracy Trader"
+ uniform = /obj/item/clothing/under/costume/psyjump
+ suit = /obj/item/clothing/suit/jacket/robobomber
+ belt = /obj/item/melee/classic_baton/telescopic
+ back = /obj/item/storage/backpack/robotics
+
+/datum/outfit/admin/trader/nian
+ name = "Merchant Guild Trader"
+ uniform = /obj/item/clothing/under/suit/really_black
+ suit = /obj/item/clothing/suit/pimpcoat
+ shoes = /obj/item/clothing/shoes/fluff/noble_boot
+ belt = /obj/item/melee/classic_baton/ntcane
+
/datum/outfit/admin/chrono
name = "Chrono Legionnaire"
diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm
index f8f4c97d9d9..da18bf23f57 100644
--- a/code/game/mecha/combat/gygax.dm
+++ b/code/game/mecha/combat/gygax.dm
@@ -50,6 +50,9 @@
starting_voice = /obj/item/mecha_modkit/voice/syndicate
destruction_sleep_duration = 2 SECONDS
+/obj/mecha/combat/gygax/dark/trader
+ operation_req_access = list() //Jailbroken mech
+
/obj/mecha/combat/gygax/dark/loaded/Initialize(mapload)
. = ..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot
diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm
index f53faf14515..1f537cabbac 100644
--- a/code/game/mecha/combat/marauder.dm
+++ b/code/game/mecha/combat/marauder.dm
@@ -120,6 +120,9 @@
starting_voice = /obj/item/mecha_modkit/voice/syndicate
emag_proof = FALSE //The crew can steal a syndicate mech. As a treat.
+/obj/mecha/combat/marauder/mauler/trader
+ operation_req_access = list() //Jailbroken mech
+
/obj/mecha/combat/marauder/mauler/loaded/Initialize(mapload)
. = ..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg(src)
diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm
index a2f5b11cbdd..a977b08c726 100644
--- a/code/game/objects/effects/landmarks.dm
+++ b/code/game/objects/effects/landmarks.dm
@@ -36,10 +36,18 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/newplayer_start) //Without this you sp
spawner_list += loc
return INITIALIZE_HINT_QDEL
-/obj/effect/landmark/spawner/soltrader
- name = "traderstart_sol"
+/obj/effect/landmark/spawner/trader
+ name = "traderstart"
icon_state = "Trader"
+/obj/effect/landmark/spawner/tradergearminor
+ name = "traderstart_specificgear_minor"
+ icon_state = "questionmark"
+
+/obj/effect/landmark/spawner/tradergearmajor
+ name = "traderstart_specificgear_major"
+ icon_state = "questionmark"
+
/obj/effect/landmark/spawner/ert
name = "Response Team"
icon_state = "ERT"
diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm
index a556d64132a..016f9af8e51 100644
--- a/code/game/objects/effects/spawners/lootdrop.dm
+++ b/code/game/objects/effects/spawners/lootdrop.dm
@@ -218,7 +218,6 @@
/obj/item/soap = 50,
/obj/item/clothing/under/syndicate/combat = 50,
/obj/item/soap/syndie = 50,
- /obj/item/lighter/zippo/gonzofist = 50,
/obj/item/clothing/under/costume/psyjump = 50,
/obj/item/immortality_talisman = 50,
/obj/item/clothing/mask/holo_cigar = 100,
@@ -338,8 +337,7 @@
// Ranged weapons
/obj/item/storage/box/enforcer_rubber = 50, //Lethal ammo can be printed at an autolathe, so no need for the lethal subtype
/obj/item/gun/projectile/shotgun/automatic/dual_tube = 100, // cycler shotgun, not normally available to crew
- /obj/item/weaponcrafting/gunkit/universal_gun_kit/sol_gov = 50, //Weapon crafting, lets officers experiment however lets not have it be C class
-
+ /obj/item/weaponcrafting/gunkit/universal_gun_kit/sol_gov = 20
)
/obj/effect/spawner/lootdrop/trade_sol/eng
@@ -417,7 +415,328 @@
/obj/structure/constructshell = 50 //Fuck it we ball what could go wrong
)
+/obj/effect/spawner/lootdrop/trade_sol/federation_minor
+ name = "11. trans-solar federation small gear"
+ loot = list(
+ /obj/item/storage/box/enforcer_rubber = 50,
+ /obj/item/lighter/zippo/gonzofist = 50,
+ /obj/item/clothing/glasses/welding/superior = 50,
+ /obj/item/clothing/suit/armor/bulletproof = 50,
+ /obj/item/clothing/mask/gas/explorer/marines = 50,
+ /obj/item/clothing/gloves/combat = 50,
+ /obj/item/storage/belt/military/assault = 50,
+ /obj/item/clothing/under/solgov = 50,
+ /obj/item/mod/module/dispenser = 50,
+ /obj/item/flag/solgov = 30
+ )
+/obj/effect/spawner/lootdrop/trade_sol/federation_major
+ name = "12. trans-solar federation large gear"
+ lootcount = 3
+ loot = list(
+ /obj/item/storage/box/deagle = 20, //One mag
+ /obj/item/gun/projectile/automatic/pistol/m1911 = 30, //Again, one mag. Don't lose it.
+ /obj/item/melee/baseball_bat/homerun = 50,
+ /obj/item/rcd/combat = 50,
+ /obj/item/weaponcrafting/gunkit/universal_gun_kit/sol_gov = 50,
+ /obj/item/storage/box/buck = 30, //Only seven shots, make them count
+ /obj/item/mod/module/noslip = 40,
+ /obj/item/clothing/mask/holo_cigar = 50
+ )
+
+/obj/effect/spawner/lootdrop/trade_sol/cybersun_minor
+ name = "11. cybersun industries small gear"
+ loot = list(
+ /obj/item/storage/box/syndidonkpockets = 50,
+ /obj/item/clothing/suit/jacket/syndicatebomber = 50,
+ /obj/item/storage/box/syndie_kit/space = 50,
+ /obj/item/clothing/glasses/meson/sunglasses = 50,
+ /obj/item/storage/pill_bottle/zoom = 50,
+ /obj/item/clothing/mask/gas/voice_modulator/chameleon = 50,
+ /obj/item/mecha_parts/mecha_equipment/weapon/energy/xray = 30,
+ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine = 30,
+ /obj/item/flag/syndi = 30
+ )
+
+// Damn near all of this is illegal. Gives officers something to do on a shift quiet enough to spawn traders.
+/obj/effect/spawner/lootdrop/trade_sol/cybersun_major
+ name = "12. cybersun industries large gear"
+ lootcount = 3
+ loot = list(
+ /obj/item/shield/energy = 20,
+ /obj/item/gun/projectile/automatic/pistol = 50,
+ /obj/item/bio_chip/storage = 50,
+ /obj/item/melee/knuckleduster/syndie = 50,
+ /obj/item/clothing/glasses/thermal/eyepatch = 50,
+ /obj/item/toy/syndicateballoon = 60,
+ /obj/item/organ/internal/cyberimp/arm/razorwire = 30,
+ /obj/item/organ/internal/cyberimp/arm/shell_launcher = 30,
+ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/dual = 30,
+ /obj/item/clothing/mask/holo_cigar = 50,
+ /obj/mecha/combat/marauder/mauler/trader = 3 //Extremely rare, unloaded so crew need to arm it for it to have any use. Also most definitely needs one helluva permit.
+ )
+ lootdoubles = FALSE //No double mechs.
+
+/obj/effect/spawner/lootdrop/trade_sol/ussp_minor
+ name = "11. USSP small gear"
+ lootcount = 8 //Mostly flavor items
+ loot = list(
+ /obj/item/clothing/under/new_soviet = 50,
+ /obj/item/clothing/suit/sovietcoat = 50,
+ /obj/item/clothing/head/ushanka = 50,
+ /obj/item/food/snacks/grown/potato = 50,
+ /obj/item/reagent_containers/drinks/bottle/vodka/badminka = 50,
+ /obj/item/clothing/head/sovietsidecap = 50,
+ /obj/item/flag/ussp = 30,
+ /obj/item/ammo_box/magazine/apsm10mm = 15, //Spare mags for APS pistol. Sometimes you don't get the APS, in which case, soviet logistics.
+ /obj/item/ammo_box/a762 = 15
+ )
+
+// Lots of things to write permits for. Gives officers something to do on a shift quiet enough to spawn traders.
+/obj/effect/spawner/lootdrop/trade_sol/ussp_major
+ name = "12. USSP large gear"
+ lootcount = 2 //Lots of dangerous stuff here - reduced amount
+ loot = list(
+ /obj/item/gun/projectile/revolver/nagant = 50,
+ /obj/item/gun/projectile/automatic/pistol/APS = 30,
+ /obj/item/gun/projectile/shotgun/boltaction = 50,
+ /obj/item/clothing/suit/space/hardsuit/soviet = 40,
+ /obj/item/clothing/glasses/thermal/eyepatch = 50,
+ /obj/item/clothing/mask/holo_cigar = 10
+ )
+
+/obj/effect/spawner/lootdrop/trade_sol/glintscale_minor
+ name = "11. glint-scale small gear"
+ loot = list(
+ /obj/item/clothing/suit/armor/vest/combat = 50,
+ /obj/item/clothing/under/syndicate/combat = 50,
+ /obj/item/claymore/ceremonial = 50,
+ /obj/item/harpoon = 50,
+ /obj/item/nullrod/claymore/chainsaw_sword = 50,
+ /obj/item/whetstone = 50,
+ /obj/item/flag/species/unathi = 20,
+ /obj/item/clothing/suit/armor/riot/knight/templar = 40,
+ /obj/item/clothing/head/helmet/riot/knight/templar = 40,
+ /obj/item/clothing/suit/unathi/robe = 20
+ )
+
+/obj/effect/spawner/lootdrop/trade_sol/glintscale_major
+ name = "12. glint-scale large gear"
+ lootcount = 3
+ loot = list(
+ /obj/item/melee/energy/sword/pirate = 30,
+ /obj/item/storage/box/breacher = 30,
+ /obj/item/fireaxe = 50,
+ /obj/item/fireaxe/boneaxe = 50,
+ /obj/item/gun/energy/kinetic_accelerator/crossbow/large = 10 //Big ebow.
+ )
+
+/obj/effect/spawner/lootdrop/trade_sol/steadfast_minor
+ name = "11. steadfast trading co. small gear"
+ lootcount = 8 //Since it's a lot of seeds, boosted amount
+ loot = list(
+ /obj/item/storage/box/botany_labelled_seeds = 50,
+ /obj/item/seeds/chili/ice = 20,
+ /obj/item/seeds/chili/ghost = 20,
+ /obj/item/seeds/cannabis/ultimate = 10,
+ /obj/item/seeds/cannabis/white = 20,
+ /obj/item/seeds/wheat/meat = 20,
+ /obj/item/seeds/glowshroom = 20,
+ /obj/item/seeds/glowshroom/glowcap = 20,
+ /obj/item/seeds/tobacco/space = 20,
+ /obj/item/storage/box/hydroponics_starter = 40,
+ /obj/item/mod/module/thermal_regulator = 20,
+ /obj/item/flag/species/vulp = 20
+ )
+
+/obj/effect/spawner/lootdrop/trade_sol/steadfast_major
+ name = "12. steadfast trading co. large gear"
+ lootcount = 3
+ loot = list(
+ /obj/item/mod/construction/plating/research = 30,
+ /obj/item/assembly/signaler/anomaly/random = 20,
+ /obj/item/gun/energy/gun = 50,
+ /obj/item/storage/box/dragonsbreath = 30,
+ /obj/item/storage/box/turbine_kit = 20,
+ /obj/item/mod/module/firefighting_tank = 40,
+ /obj/item/mod/module/jetpack/advanced = 40
+ )
+
+/obj/effect/spawner/lootdrop/trade_sol/syntheticunion_minor
+ name = "11. synthetic union small gear"
+ lootcount = 8 //A lot of these are available on station, so the amount of items spawned here is increased
+ loot = list(
+ /obj/item/clothing/glasses/meson/sunglasses = 50,
+ /obj/item/clothing/glasses/thermal/monocle = 50,
+ /obj/item/organ/internal/cyberimp/arm/toolset = 50,
+ /obj/item/organ/internal/cyberimp/arm/surgery = 50,
+ /obj/item/organ/internal/cyberimp/arm/janitorial = 50,
+ /obj/item/organ/internal/cyberimp/brain/anti_stam = 50,
+ /obj/item/organ/internal/cyberimp/brain/anti_sleep = 50,
+ /obj/item/organ/internal/cyberimp/brain/clown_voice = 40,
+ /obj/item/organ/internal/cyberimp/mouth/breathing_tube = 50,
+ /obj/item/organ/internal/cyberimp/chest/ipc_repair = 50,
+ /obj/item/organ/internal/cyberimp/chest/ipc_joints/magnetic_joints = 50,
+ /obj/item/organ/internal/cyberimp/chest/ipc_joints/sealed = 50,
+ /obj/item/autosurgeon/organ = 10,
+ /obj/item/flag/species/machine = 20
+ )
+
+/obj/effect/spawner/lootdrop/trade_sol/syntheticunion_major
+ name = "12. synthetic union large gear"
+ lootcount = 4
+ loot = list(
+ /obj/item/organ/internal/cyberimp/arm/toolset_abductor = 20,
+ /obj/item/organ/internal/cyberimp/arm/esword = 10,
+ /obj/item/organ/internal/cyberimp/arm/flash = 50,
+ /obj/item/organ/internal/cyberimp/chest/nutriment/plus/hardened = 50,
+ /obj/item/organ/internal/cyberimp/arm/telebaton = 25, //Security'll love this one
+ /obj/item/organ/internal/cyberimp/arm/razorwire = 30,
+ /obj/item/organ/internal/cyberimp/arm/shell_launcher = 30,
+ /obj/item/organ/internal/cyberimp/brain/anti_drop/hardened = 20,
+ /obj/item/organ/internal/cyberimp/brain/anti_stam/hardened = 30,
+ /obj/item/surveillance_upgrade = 35
+ )
+
+/obj/effect/spawner/lootdrop/trade_sol/skipjack_minor
+ name = "11. skipjack small gear"
+ loot = list(
+ /obj/item/clothing/glasses/meson/gar = 50,
+ /obj/item/clothing/glasses/thermal/eyepatch = 50,
+ /obj/item/melee/energy/sword/pirate = 50,
+ /obj/item/clothing/suit/hooded/vox_robes = 30,
+ /obj/item/clothing/under/vox/vox_casual = 30,
+ /obj/item/clothing/gloves/color/yellow/vox = 10, //Species limited - rare item
+ /obj/item/clothing/shoes/magboots/vox = 10, //Species limited - rare item
+ /obj/item/organ/internal/cyberimp/mouth/breathing_tube = 50,
+ /obj/item/mod/module/jetpack/advanced = 50,
+ /obj/item/gun/energy/plasma_pistol = 50,
+ /obj/item/mod/control/pre_equipped/standard = 40,
+ /obj/item/flag/species/vox = 20
+ )
+
+/obj/effect/spawner/lootdrop/trade_sol/skipjack_major //contains a variety of things - raider loot
+ name = "12. skipjack large gear"
+ lootcount = 3
+ loot = list(
+ /obj/item/storage/box/vox_spacesuit = 20,
+ /obj/item/storage/box/syndie_kit/chameleon = 50,
+ /obj/item/organ/internal/cyberimp/arm/esword = 10,
+ /obj/item/gun/energy/spikethrower = 20,
+ /obj/item/organ/internal/cyberimp/arm/medibeam = 50,
+ /obj/item/organ/internal/cyberimp/arm/toolset_abductor = 50,
+ /obj/item/organ/internal/cyberimp/brain/anti_stam/hardened = 10,
+ /obj/item/organ/internal/cyberimp/arm/gun/laser = 10,
+ /obj/item/fireaxe = 10,
+ /obj/item/gun/projectile/revolver/nagant = 10,
+ /obj/item/bio_chip/storage = 10,
+ /obj/item/rcd/combat = 10
+ )
+
+/obj/effect/spawner/lootdrop/trade_sol/solarcentral_minor
+ name = "11. skrellian central authority small gear" //Medical and protection theme - shields, mods, meds, and love
+ loot = list(
+ /obj/item/mod/control/pre_equipped/rescue = 60,
+ /obj/item/pen/sleepy/love = 50,
+ /obj/item/reagent_containers/glass/bottle/reagent/omnizine = 50,
+ /obj/item/reagent_containers/glass/bottle/love = 50,
+ /obj/item/reagent_containers/glass/bottle/reagent/lazarus_reagent = 50,
+ /obj/item/reagent_containers/applicator/dual = 50,
+ /obj/item/reagent_containers/hypospray/autoinjector/nanocalcium = 30,
+ /obj/item/storage/firstaid/surgery = 40,
+ /obj/item/dnainjector/nobreath = 50,
+ /obj/item/dnainjector/regenerate = 50,
+ /obj/item/dnainjector/insulation = 50,
+ /obj/item/flag/species/skrell = 20
+ )
+
+/obj/effect/spawner/lootdrop/trade_sol/solarcentral_major
+ name = "12. skrellian central authority large gear"
+ lootcount = 3
+ loot = list(
+ /obj/item/mod/module/energy_shield = 40,
+ /obj/item/shield/energy = 40,
+ /obj/item/reagent_containers/applicator/dual/syndi = 50, //Same as the above but comes emagged
+ /obj/item/gun/medbeam = 30,
+ /obj/item/gun/syringe/syndicate = 50,
+ /obj/item/storage/box/skrell_suit/black = 30,
+ /obj/item/storage/box/skrell_suit/white = 30,
+ /obj/item/rod_of_asclepius = 20
+ )
+
+/obj/effect/spawner/lootdrop/trade_sol/technocracy_minor
+ name = "11. technocracy small gear"
+ loot = list(
+ /obj/item/paper/researchnotes = 150, //More research from the smart ones
+ /obj/item/storage/box/beakers/bluespace = 50,
+ /obj/item/storage/box/stockparts/deluxe = 50,
+ /obj/item/clothing/glasses/thermal/monocle = 50,
+ /obj/item/organ/internal/cyberimp/arm/toolset_abductor = 30,
+ /obj/item/organ/internal/cyberimp/arm/surgery = 40,
+ /obj/item/organ/internal/cyberimp/arm/advmop = 30,
+ /obj/item/organ/internal/cyberimp/brain/anti_stam = 50,
+ /obj/item/organ/internal/cyberimp/brain/anti_sleep = 50,
+ /obj/item/organ/internal/cyberimp/brain/anti_drop = 50,
+ /obj/item/autosurgeon/organ = 10,
+ /obj/item/flag/species/greys = 20
+ )
+
+/obj/effect/spawner/lootdrop/trade_sol/technocracy_major
+ name = "12. technocracy large gear"
+ lootcount = 3
+ loot = list(
+ /obj/item/storage/box/syndie_kit/prescan = 30,
+ /obj/item/gun/energy/decloner = 50,
+ /obj/item/organ/internal/cyberimp/brain/anti_drop/hardened = 20,
+ /obj/item/organ/internal/cyberimp/brain/anti_stam/hardened = 30,
+ /obj/item/assembly/signaler/anomaly/random = 50,
+ /obj/item/surveillance_upgrade = 35,
+ /obj/item/mod/module/storage/bluespace = 40
+ )
+
+/obj/effect/spawner/lootdrop/trade_sol/merchantguild_minor
+ name = "11. merchant guild small gear"
+ lootcount = 12 //Much larger selection due to it being almost all clothes.
+ loot = list(
+ /obj/item/flag/species/nian = 20,
+ /obj/item/clothing/under/suit/really_black = 50,
+ /obj/item/clothing/under/syndicate/combat = 50,
+ /obj/item/clothing/under/syndicate/sniper = 50,
+ /obj/item/clothing/under/new_soviet/sovietofficer = 50,
+ /obj/item/clothing/under/solgov/elite = 50,
+ /obj/item/clothing/under/solgov/command = 50,
+ /obj/item/clothing/under/retro/security = 50,
+ /obj/item/clothing/under/misc/gimmick/rank/captain/suit = 50,
+ /obj/item/clothing/under/misc/durathread = 50,
+ /obj/item/clothing/under/psysuit = 50,
+ /obj/item/clothing/under/costume/cuban_suit = 50,
+ /obj/item/clothing/suit/armor/vest/jacket = 50,
+ /obj/item/clothing/head/collectable/petehat = 20,
+ /obj/item/clothing/head/collectable/tophat = 50,
+ /obj/item/clothing/head/collectable/police = 50,
+ /obj/item/clothing/head/collectable/kitty = 50,
+ /obj/item/clothing/under/costume/janimaid = 50,
+ /obj/item/clothing/under/costume/maid = 50,
+ /obj/item/storage/box/syndie_kit/chameleon = 60
+ )
+
+/obj/effect/spawner/lootdrop/trade_sol/merchantguild_major
+ name = "12. merchant guild large gear"
+ lootcount = 6 //Low-risk items, flavorful knick knacks - higher stock
+ loot = list(
+ /obj/item/clothing/suit/pimpcoat = 50,
+ /obj/item/dualsaber/toy = 50,
+ /obj/item/toy/sword = 50,
+ /obj/item/toy/plushie/carpplushie/dragon = 50,
+ /obj/item/toy/plushie/carpplushie/void = 50,
+ /obj/item/toy/plushie/ipcplushie = 30,
+ /obj/item/toy/plushie/nukeplushie = 30,
+ /obj/item/toy/plushie/nianplushie = 50, //*buzz
+ /obj/item/toy/windup_toolbox = 50,
+ /obj/item/toy/AI = 50,
+ /obj/item/clothing/mask/gas/voice_modulator/chameleon = 50,
+ /obj/item/storage/box/syndie_kit/chameleon = 50
+ )
/obj/effect/spawner/lootdrop/three_course_meal
name = "three course meal spawner"
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index 57598089247..a2578bc2cb5 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -777,6 +777,78 @@
new /obj/item/ammo_box/magazine/enforcer/lethal(src)
new /obj/item/ammo_box/magazine/enforcer/lethal(src)
+/obj/item/storage/box/hydroponics_starter
+ name = "hydroponics starter kit"
+ desc = "Everything you need to start your own botany lab."
+
+/obj/item/storage/box/hydroponics_starter/populate_contents()
+ for(var/I in 1 to 2)
+ new /obj/item/circuitboard/hydroponics(src)
+ new /obj/item/stock_parts/matter_bin(src)
+ new /obj/item/stock_parts/matter_bin(src)
+ new /obj/item/stock_parts/manipulator(src)
+ new /obj/item/reagent_containers/glass/bucket(src)
+
+/obj/item/storage/box/turbine_kit
+ name = "turbine kit"
+ desc = "Somehow, they managed to fit almost an entire turbine assembly into this box."
+
+/obj/item/storage/box/turbine_kit/populate_contents()
+ new /obj/item/circuitboard/turbine_computer(src)
+ new /obj/item/circuitboard/power_compressor(src)
+ new /obj/item/circuitboard/power_turbine(src)
+ for(var/I in 1 to 6)
+ new /obj/item/stock_parts/capacitor(src)
+ new /obj/item/stock_parts/manipulator(src)
+
+/obj/item/storage/box/deagle
+ name = "desert eagle handcannon kit"
+ desc = "A box marked with pictures of the iconic Desert Eagle pistol, one ammo clip, and the word 'LETHAL'."
+ icon_state = "doom_box"
+
+/obj/item/storage/box/deagle/populate_contents()
+ new /obj/item/gun/projectile/automatic/pistol/deagle(src)
+ new /obj/item/ammo_box/magazine/m50(src)
+
+/obj/item/storage/box/skrell_suit
+ name = "skrellian suit box"
+ desc = "A box containing a skrell-designed medical spacesuit."
+ icon_state = "doom_box"
+
+/obj/item/storage/box/skrell_suit/white
+ name = "white skrellian suit box"
+ desc = "A box containing a skrell-designed medical spacesuit. This one is white."
+
+/obj/item/storage/box/skrell_suit/white/populate_contents()
+ new /obj/item/clothing/head/helmet/space/skrell/white(src)
+ new /obj/item/clothing/suit/space/skrell/white(src)
+
+/obj/item/storage/box/skrell_suit/black
+ name = "black skrellian suit box"
+ desc = "A box containing a skrell-designed medical spacesuit. This one is black."
+
+/obj/item/storage/box/skrell_suit/black/populate_contents()
+ new /obj/item/clothing/head/helmet/space/skrell/black(src)
+ new /obj/item/clothing/suit/space/skrell/black(src)
+
+/obj/item/storage/box/breacher
+ name = "unathi breacher suit box"
+ desc = "A box containing a bulky unathi battlesuit."
+ icon_state = "doom_box"
+
+/obj/item/storage/box/breacher/populate_contents()
+ new /obj/item/clothing/suit/space/unathi/breacher(src)
+ new /obj/item/clothing/head/helmet/space/unathi/breacher(src)
+
+/obj/item/storage/box/vox_spacesuit
+ name = "vox voidsuit box"
+ desc = "A box containing an old, dusty voidsuit fit for vox."
+ icon_state = "doom_box"
+
+/obj/item/storage/box/vox_spacesuit/populate_contents()
+ new /obj/item/clothing/head/helmet/space/vox/pressure(src)
+ new /obj/item/clothing/suit/space/vox/pressure(src)
+
/obj/item/storage/box/telescience
name = "babies first telescience kit"
desc = "A now restricted kit for those who want to learn about telescience!"
diff --git a/code/modules/events/traders.dm b/code/modules/events/traders.dm
index 3b1427bed87..b0eb67f4df5 100644
--- a/code/modules/events/traders.dm
+++ b/code/modules/events/traders.dm
@@ -15,34 +15,58 @@ GLOBAL_LIST_INIT(unused_trade_stations, list("sol"))
/datum/event/traders/fake_announce()
. = TRUE
+ var/datum/traders/T = pick(/datum/traders/sol,
+ /datum/traders/cyber,
+ /datum/traders/commie,
+ /datum/traders/unathi,
+ /datum/traders/vulp,
+ /datum/traders/ipc,
+ /datum/traders/vox,
+ /datum/traders/skrell,
+ /datum/traders/grey,
+ /datum/traders/nian)
+
if(SSsecurity_level.get_current_level_as_number() >= SEC_LEVEL_RED)
- GLOB.minor_announcement.Announce("A trading shuttle from Jupiter Station has been denied docking permission due to the heightened security alert aboard [station_name()].", "Trader Shuttle Docking Request Refused")
+ GLOB.minor_announcement.Announce("A trading shuttle from [T.trader_location] has been denied docking permission due to the heightened security alert aboard [station_name()].", "Trader Shuttle Docking Request Refused")
return
- GLOB.minor_announcement.Announce("A trading shuttle from Jupiter Station has been granted docking permission at [station_name()] arrivals port 4.", "Trader Shuttle Docking Request Accepted")
+ GLOB.minor_announcement.Announce("A trading shuttle from [T.trader_location] has been granted docking permission at [station_name()] arrivals port 4.", "Trader Shuttle Docking Request Accepted")
/datum/event/traders/start()
if(!station) // If there are no unused stations, just no.
return
+
+ var/datum/traders/T = pick(/datum/traders/sol,
+ /datum/traders/cyber,
+ /datum/traders/commie,
+ /datum/traders/unathi,
+ /datum/traders/vulp,
+ /datum/traders/ipc,
+ /datum/traders/vox,
+ /datum/traders/skrell,
+ /datum/traders/grey,
+ /datum/traders/nian)
+
if(SSsecurity_level.get_current_level_as_number() >= SEC_LEVEL_RED)
- GLOB.minor_announcement.Announce("A trading shuttle from Jupiter Station has been denied docking permission due to the heightened security alert aboard [station_name()].", "Trader Shuttle Docking Request Refused")
+ GLOB.minor_announcement.Announce("A trading shuttle from [T.trader_location] has been denied docking permission due to the heightened security alert aboard [station_name()].", "Trader Shuttle Docking Request Refused")
// if the docking request was refused, fire another major event in 60 seconds
var/datum/event_container/EC = SSevents.event_containers[EVENT_LEVEL_MAJOR]
EC.next_event_time = world.time + (60 * 10)
return
+ //Get the list of spawn locations for traders
var/list/spawnlocs = list()
- for(var/obj/effect/landmark/spawner/soltrader/S in GLOB.landmarks_list)
+ for(var/obj/effect/landmark/spawner/trader/S in GLOB.landmarks_list)
spawnlocs += get_turf(S)
if(!length(spawnlocs))
return
trader_objectives = forge_trader_objectives()
- INVOKE_ASYNC(src, PROC_REF(spawn_traders), spawnlocs)
+ INVOKE_ASYNC(src, PROC_REF(spawn_traders), spawnlocs, T)
-/datum/event/traders/proc/spawn_traders(list/spawnlocs)
- var/list/candidates = SSghost_spawns.poll_candidates("Do you want to play as a Sol Trader?", ROLE_TRADER, TRUE)
+/datum/event/traders/proc/spawn_traders(list/spawnlocs, datum/traders/T)
+ var/list/candidates = SSghost_spawns.poll_candidates("Do you want to play as a [T.trader_type] Trader?", ROLE_TRADER, TRUE)
var/index = 1
while(spawn_count > 0 && length(candidates))
if(index > length(spawnlocs))
@@ -53,27 +77,41 @@ GLOBAL_LIST_INIT(unused_trade_stations, list("sol"))
var/mob/C = pick_n_take(candidates)
spawn_count--
if(C)
- var/mob/living/carbon/human/M = new /mob/living/carbon/human(picked_loc)
+ var/mob/living/carbon/human/M = new T.trader_species(picked_loc)
M.ckey = C.ckey // must be before equipOutfit, or that will runtime due to lack of mind
dust_if_respawnable(C)
- M.equipOutfit(/datum/outfit/admin/sol_trader)
+ M.equipOutfit(T.trader_outfit)
M.dna.species.after_equip_job(null, M)
for(var/datum/objective/O in trader_objectives)
M.mind.objective_holder.add_objective(O) // traders dont have a team, so we manually have to add this objective to all of their minds, without setting an owner
M.mind.offstation_role = TRUE
- greet_trader(M)
+
+ //Get the list of spawn locations for company specific items, spawn gear
+ for(var/obj/effect/landmark/spawner/tradergearminor/A in GLOB.landmarks_list)
+ var/obj/structure/closet/locker = new /obj/structure/closet(get_turf(A))
+ locker.open()
+ new T.trader_minor_special(locker)
+ locker.close()
+
+ for(var/obj/effect/landmark/spawner/tradergearmajor/B in GLOB.landmarks_list)
+ var/obj/structure/closet/locker = new /obj/structure/closet(get_turf(B))
+ locker.open()
+ new T.trader_major_special(locker)
+ locker.close()
+
+ greet_trader(M, T)
success_spawn = TRUE
if(success_spawn)
- GLOB.minor_announcement.Announce("A trading shuttle from Jupiter Station has been granted docking permission at [station_name()] arrivals port 4.", "Trader Shuttle Docking Request Accepted")
+ GLOB.minor_announcement.Announce("A trading shuttle from [T.trader_location] has been granted docking permission at [station_name()] arrivals port 4.", "Trader Shuttle Docking Request Accepted")
else
GLOB.unused_trade_stations += station // Return the station to the list of usable stations.
-/datum/event/traders/proc/greet_trader(mob/living/carbon/human/M)
+/datum/event/traders/proc/greet_trader(mob/living/carbon/human/M, datum/traders/T)
var/list/messages = list()
- messages.Add("You are a trader!You are currently docked at [get_area(M)].
You are about to trade with [station_name()].
")
+ messages.Add("You are a trader! You are currently docked at [T.dock_site].
You are about to trade with [station_name()].
")
messages.Add(M.mind.prepare_announce_objectives())
to_chat(M, chat_box_green(messages.Join("
")))
- M.create_log(MISC_LOG, "[M] was made into a Sol Trader")
+ M.create_log(MISC_LOG, "[M] was made into a [T.trader_type] Trader")
/datum/event/traders/proc/forge_trader_objectives()
var/list/objs = list()
@@ -82,3 +120,110 @@ GLOBAL_LIST_INIT(unused_trade_stations, list("sol"))
objs += new /datum/objective/trade/credits
return objs
+
+//Datums that handle the various announcements, species, outfits, and item lists.
+/datum/traders
+ /// What faction the trader is
+ var/trader_type
+ /// Where the traders originate from
+ var/trader_location
+ /// What specific station the traders came from
+ var/dock_site
+ /// What species the traders consist of
+ var/trader_species
+ /// What outfit do the traders spawn with
+ var/trader_outfit
+ /// What standard faction gear do they start with
+ var/trader_minor_special
+ /// What big ticket faction gear do they start with
+ var/trader_major_special
+
+/datum/traders/sol
+ trader_type = "Trans-Solar Federation"
+ trader_location = "Kayani Station"
+ dock_site = "Kayani Station"
+ trader_species = /mob/living/carbon/human
+ trader_outfit = /datum/outfit/admin/trader/sol
+ trader_minor_special = /obj/effect/spawner/lootdrop/trade_sol/federation_minor
+ trader_major_special = /obj/effect/spawner/lootdrop/trade_sol/federation_major
+
+/datum/traders/cyber
+ trader_type = "Cybersun Industries"
+ trader_location = "-=ERROR: Unregisted Station Charter=-"
+ dock_site = "an undercover robotics factory"
+ trader_species = /mob/living/carbon/human
+ trader_outfit = /datum/outfit/admin/trader/cyber
+ trader_minor_special = /obj/effect/spawner/lootdrop/trade_sol/cybersun_minor
+ trader_major_special = /obj/effect/spawner/lootdrop/trade_sol/cybersun_major
+
+/datum/traders/commie
+ trader_type = "USSP"
+ trader_location = "Belastrav"
+ dock_site = "Belastrav Station"
+ trader_species = /mob/living/carbon/human
+ trader_outfit = /datum/outfit/admin/trader/commie
+ trader_minor_special = /obj/effect/spawner/lootdrop/trade_sol/ussp_minor
+ trader_major_special = /obj/effect/spawner/lootdrop/trade_sol/ussp_major
+
+/datum/traders/unathi
+ trader_type = "Glint Scales"
+ trader_location = "Moghes"
+ dock_site = "a Glint-Scale outpost"
+ trader_species = /mob/living/carbon/human/unathi
+ trader_outfit = /datum/outfit/admin/trader/unathi
+ trader_minor_special = /obj/effect/spawner/lootdrop/trade_sol/glintscale_minor
+ trader_major_special = /obj/effect/spawner/lootdrop/trade_sol/glintscale_major
+
+/datum/traders/vulp
+ trader_type = "Steadfast Trading Co."
+ trader_location = "Vazzend"
+ dock_site = "the MV Steadfast Platinum"
+ trader_species = /mob/living/carbon/human/vulpkanin
+ trader_outfit = /datum/outfit/admin/trader/vulp
+ trader_minor_special = /obj/effect/spawner/lootdrop/trade_sol/steadfast_minor
+ trader_major_special = /obj/effect/spawner/lootdrop/trade_sol/steadfast_major
+
+/datum/traders/ipc
+ trader_type = "Synthetic Union"
+ trader_location = "Cadraenov Epsilon"
+ dock_site = "Cadraenov Station"
+ trader_species = /mob/living/carbon/human/machine
+ trader_outfit = /datum/outfit/admin/trader/ipc
+ trader_minor_special = /obj/effect/spawner/lootdrop/trade_sol/syntheticunion_minor
+ trader_major_special = /obj/effect/spawner/lootdrop/trade_sol/syntheticunion_major
+
+/datum/traders/vox
+ trader_type = "Skipjack"
+ trader_location = "a nearby skipjack"
+ dock_site = "a trading skipjack"
+ trader_species = /mob/living/carbon/human/vox
+ trader_outfit = /datum/outfit/admin/trader/vox
+ trader_minor_special = /obj/effect/spawner/lootdrop/trade_sol/skipjack_minor
+ trader_major_special = /obj/effect/spawner/lootdrop/trade_sol/skipjack_major
+
+/datum/traders/skrell
+ trader_type = "Skrellian Central Authority"
+ trader_location = "the Crown"
+ dock_site = "Crown Station"
+ trader_species = /mob/living/carbon/human/skrell
+ trader_outfit = /datum/outfit/admin/trader/skrell
+ trader_minor_special = /obj/effect/spawner/lootdrop/trade_sol/solarcentral_minor
+ trader_major_special = /obj/effect/spawner/lootdrop/trade_sol/solarcentral_major
+
+/datum/traders/grey
+ trader_type = "Technocracy"
+ trader_location = "Mauna-b"
+ dock_site = "Orbital Commerce Outpost 58"
+ trader_species = /mob/living/carbon/human/grey
+ trader_outfit = /datum/outfit/admin/trader/grey
+ trader_minor_special = /obj/effect/spawner/lootdrop/trade_sol/technocracy_minor
+ trader_major_special = /obj/effect/spawner/lootdrop/trade_sol/technocracy_major
+
+/datum/traders/nian
+ trader_type = "Merchant Guild"
+ trader_location = "the Nian Merchant Guild"
+ dock_site = "Guild Subsidiary Station 'Gilded Comet'"
+ trader_species = /mob/living/carbon/human/moth
+ trader_outfit = /datum/outfit/admin/trader/nian
+ trader_minor_special = /obj/effect/spawner/lootdrop/trade_sol/merchantguild_minor
+ trader_major_special = /obj/effect/spawner/lootdrop/trade_sol/merchantguild_major
diff --git a/code/modules/reagents/reagent_containers/chemical_bottle.dm b/code/modules/reagents/reagent_containers/chemical_bottle.dm
index 66c0b505d78..d9b3f6ab99e 100644
--- a/code/modules/reagents/reagent_containers/chemical_bottle.dm
+++ b/code/modules/reagents/reagent_containers/chemical_bottle.dm
@@ -168,6 +168,12 @@
icon_state = "round_bottle"
list_reagents = list("sulfonal" = 30)
+/obj/item/reagent_containers/glass/bottle/love
+ name = "love bottle"
+ desc = "A small bottle of love."
+ icon_state = "round_bottle"
+ list_reagents = list("love" = 50)
+
//Reagent bottles
/obj/item/reagent_containers/glass/bottle/reagent