From 3e9c29258ecd78a7679d301e209290a4a958b924 Mon Sep 17 00:00:00 2001 From: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com> Date: Mon, 29 Apr 2024 20:51:19 -0400 Subject: [PATCH] Diverse Traders (#24883) * Diverse Traders Types * Trader Type control, announcements, species spawning * Trader Outfits * Posh Moth - Posh Cane * Landmarks, Trader ID Name Change * Trader Shuttle Adjustment - Landmarks for Item Pools * Outfit Survival Kit changes * Added another refill for the hand labeler due to more cargo * Trader Shuttle locker fix * Item Stocks, Item Stock Assignments, Box Kits, Love Bottle * Mech access, No double mechs, Small box fix * Removed Solgov Gunkit from General Pool * Spacing * Moved traders to not be event subtypes, added documentation to vars * Boxed spacing, removed improper * Moved postequip, used box variables * Lore team requested change - Bolt action instead of AK * Changed landmark * Moved soviet ammo to minor gear, increased soviet minor gear to 8. * Obfuscated Cybersun * Lootpool Adjustments * Readded Solgov Kit to general pool at low weight * Commas! * Spelling Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com> * Comments Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com> * Re-Nulled After_Equip_Job * Removed extraneous var spaces * Relocated space in trader introduction message * Robomoon is now once again Cybersun * Impropered Enforcer Kit * No more ERT box for non-NT boxes * Fixed turbine kit stock part amount * Subtyped skrell/unathi suit boxes * Replaced meson cyber eye (nodrop issue) with meson sunglasses/gar mesons * Reduced weight on arm/esword implant rare items * Also reduced arm laser weight * Added a couple items to skipjack large - more 'random', filled in reduced weights * Path typo fix Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com> * Removed trailing / in path Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com> * Removed Cheap Breacher suit from inventory * Apply suggestions from code review Signed-off-by: DGamerL <108773801+DGamerL@users.noreply.github.com> --------- Signed-off-by: DGamerL <108773801+DGamerL@users.noreply.github.com> Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com> Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com> --- _maps/map_files/generic/centcomm.dmm | 22 +- code/datums/outfits/outfit_admin.dm | 84 ++++- code/game/mecha/combat/gygax.dm | 3 + code/game/mecha/combat/marauder.dm | 3 + code/game/objects/effects/landmarks.dm | 12 +- .../game/objects/effects/spawners/lootdrop.dm | 325 +++++++++++++++++- .../objects/items/weapons/storage/boxes.dm | 72 ++++ code/modules/events/traders.dm | 173 +++++++++- .../reagent_containers/chemical_bottle.dm | 6 + 9 files changed, 667 insertions(+), 33 deletions(-) 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