diff --git a/_maps/RandomRuins/BeachRuins/beach_pirate_crash.dmm b/_maps/RandomRuins/BeachRuins/beach_pirate_crash.dmm index fddfa5bdc00f..ae5728bc008a 100644 --- a/_maps/RandomRuins/BeachRuins/beach_pirate_crash.dmm +++ b/_maps/RandomRuins/BeachRuins/beach_pirate_crash.dmm @@ -400,6 +400,7 @@ /obj/effect/turf_decal/weather/sand{ dir = 6 }, +/obj/effect/landmark/mission_poi/main/kill, /turf/open/floor/plating/asteroid/sand, /area/overmap_encounter/planetoid/cave/explored) "jZ" = ( diff --git a/_maps/RandomRuins/BeachRuins/beach_treasure_cove.dmm b/_maps/RandomRuins/BeachRuins/beach_treasure_cove.dmm index fbf9bf8ed4eb..7acdf76b5089 100644 --- a/_maps/RandomRuins/BeachRuins/beach_treasure_cove.dmm +++ b/_maps/RandomRuins/BeachRuins/beach_treasure_cove.dmm @@ -1297,6 +1297,11 @@ dir = 8 }, /mob/living/simple_animal/hostile/human/frontier/ranged/officer/neutured, +/obj/effect/landmark/mission_poi/main/kill{ + already_spawned = 1; + type_to_spawn = /mob/living/simple_animal/hostile/human/frontier/ranged/officer/neutured; + mission_index = 1 + }, /turf/open/floor/carpet/red, /area/ruin/beach/treasure_cove) "SX" = ( diff --git a/_maps/RandomRuins/IceRuins/icemoon_crashed_holemaker.dmm b/_maps/RandomRuins/IceRuins/icemoon_crashed_holemaker.dmm index 294dd1056431..7cd88c1e647c 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_crashed_holemaker.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_crashed_holemaker.dmm @@ -196,6 +196,7 @@ pixel_x = -32 }, /obj/effect/decal/cleanable/dirt/dust, +/obj/effect/landmark/mission_poi/main, /turf/open/floor/plasteel/dark, /area/ruin/unpowered/crashed_holemaker) "cS" = ( diff --git a/_maps/RandomRuins/IceRuins/icemoon_hydroponics_lab.dmm b/_maps/RandomRuins/IceRuins/icemoon_hydroponics_lab.dmm index 67613238e83d..9391e7e05f6c 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_hydroponics_lab.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_hydroponics_lab.dmm @@ -2195,6 +2195,11 @@ }, /turf/open/floor/plasteel/tech, /area/ruin/powered/hydroponicslab) +"Xb" = ( +/obj/structure/table/wood, +/obj/effect/landmark/mission_poi/main, +/turf/open/floor/wood/walnut, +/area/ruin/powered/hydroponicslab) "Xt" = ( /obj/structure/table/wood, /obj/item/folder{ @@ -2912,7 +2917,7 @@ pj da ic We -vH +Xb vH vH aJ diff --git a/_maps/RandomRuins/IceRuins/icemoon_ice_lodge.dmm b/_maps/RandomRuins/IceRuins/icemoon_ice_lodge.dmm index a698cf49ea18..92423c3b05e9 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_ice_lodge.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_ice_lodge.dmm @@ -103,7 +103,6 @@ dir = 6 }, /obj/structure/destructible/tribal_torch/lit{ - pixel_y = 0; pixel_x = 10 }, /turf/open/floor/wood/ebony, @@ -122,7 +121,6 @@ }, /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/contraband/backdoor_xeno_babes_6{ - pixel_y = 0; pixel_x = 30 }, /obj/item/reagent_containers/food/drinks/bottle/absinthe{ @@ -1724,7 +1722,6 @@ pixel_x = 5 }, /obj/item/storage/box/ammo/c38{ - pixel_y = 0; pixel_x = -11 }, /obj/item/storage/box/ammo/c38{ @@ -2355,7 +2352,6 @@ pixel_x = 4 }, /obj/item/candle/infinite{ - pixel_y = 0; pixel_x = 10 }, /obj/item/candle/infinite{ @@ -3408,6 +3404,10 @@ range_light = 5 }, /obj/effect/mob_spawn/human/corpse/srm/montagne, +/obj/effect/landmark/mission_poi/main{ + mission_index = 1; + already_spawned = 1 + }, /turf/open/floor/wood/maple, /area/ruin/powered/icemoon/lodge/cellar) "Yo" = ( @@ -3426,7 +3426,6 @@ pixel_x = 1 }, /obj/item/toy/cards/deck{ - pixel_y = 0; pixel_x = -4 }, /obj/item/storage/pill_bottle/dice{ diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm index f4db9fa9d9f7..3fc89a22eeb9 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm @@ -23,9 +23,7 @@ /obj/effect/turf_decal/corner/opaque/black{ dir = 1 }, -/obj/effect/turf_decal/corner/opaque/black{ - dir = 2 - }, +/obj/effect/turf_decal/corner/opaque/black, /turf/open/floor/plasteel, /area/ruin/powered) "cB" = ( @@ -79,6 +77,16 @@ /obj/item/reagent_containers/food/drinks/beer, /turf/open/floor/plating/ice/icemoon, /area/overmap_encounter/planetoid/cave/explored) +"hY" = ( +/obj/structure/vein/ice/classthree{ + vein_class = 4; + mining_charges = 30 + }, +/obj/effect/landmark/mission_poi/main/drill{ + mission_index = 2 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/overmap_encounter/planetoid/cave/explored) "iz" = ( /obj/structure/fence/door/opened{ dir = 8 @@ -138,6 +146,9 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/mission_poi/main{ + mission_index = 1 + }, /turf/open/floor/wood, /area/ruin/powered) "mI" = ( @@ -204,9 +215,7 @@ /obj/effect/turf_decal/corner/opaque/black{ dir = 1 }, -/obj/effect/turf_decal/corner/opaque/black{ - dir = 2 - }, +/obj/effect/turf_decal/corner/opaque/black, /turf/open/floor/plasteel, /area/ruin/powered) "tg" = ( @@ -248,9 +257,7 @@ /obj/effect/turf_decal/corner/opaque/black{ dir = 1 }, -/obj/effect/turf_decal/corner/opaque/black{ - dir = 2 - }, +/obj/effect/turf_decal/corner/opaque/black, /turf/open/floor/plasteel, /area/ruin/powered) "us" = ( @@ -476,6 +483,13 @@ /obj/structure/chair/comfy/orange/directional/east, /turf/open/floor/carpet, /area/ruin/powered) +"OI" = ( +/obj/effect/landmark/mission_poi/guard{ + type_to_spawn = /mob/living/simple_animal/hostile/human/frontier/ranged/trooper/internals; + mission_index = 2 + }, +/turf/open/floor/plating/asteroid/snow/icemoon, +/area/overmap_encounter/planetoid/cave/explored) "Pp" = ( /obj/effect/spawner/random/vending/snack, /turf/open/floor/holofloor/wood, @@ -981,7 +995,7 @@ Og Og Og zT -Og +OI Og zT Og @@ -1070,10 +1084,10 @@ Vn Og zT Og -Og -Og Bq Og +hY +Og Og Og Gy diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_brazillianlab.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_brazillianlab.dmm index 1a52405a3ec0..c1af911e1926 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_brazillianlab.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_brazillianlab.dmm @@ -1007,6 +1007,7 @@ pixel_y = 10 }, /obj/structure/table/wood/fancy/blue, +/obj/effect/landmark/mission_poi, /turf/open/floor/carpet/orange{ initial_gas_mix = "ICEMOON_ATMOS" }, diff --git a/_maps/RandomRuins/JungleRuins/jungle_bombed_starport.dmm b/_maps/RandomRuins/JungleRuins/jungle_bombed_starport.dmm index 1afed51826aa..f99c1a040e64 100644 --- a/_maps/RandomRuins/JungleRuins/jungle_bombed_starport.dmm +++ b/_maps/RandomRuins/JungleRuins/jungle_bombed_starport.dmm @@ -7415,6 +7415,7 @@ /area/overmap_encounter/planetoid/jungle/explored) "YA" = ( /obj/machinery/blackbox_recorder, +/obj/effect/landmark/mission_poi/main/blackbox, /turf/open/floor/mineral/plastitanium/red, /area/ruin/jungle/starport/tower) "YC" = ( diff --git a/_maps/RandomRuins/JungleRuins/jungle_cavecrew.dmm b/_maps/RandomRuins/JungleRuins/jungle_cavecrew.dmm index 1159123d30f1..0e0b6f0e5792 100644 --- a/_maps/RandomRuins/JungleRuins/jungle_cavecrew.dmm +++ b/_maps/RandomRuins/JungleRuins/jungle_cavecrew.dmm @@ -668,6 +668,9 @@ /obj/structure/cable{ icon_state = "1-2" }, +/obj/effect/landmark/mission_poi/main/kill{ + mission_index = 1 + }, /turf/open/floor/plasteel/tech, /area/ruin/jungle/cavecrew/bridge) "iN" = ( @@ -2176,6 +2179,9 @@ pixel_x = -5; pixel_y = -3 }, +/obj/effect/landmark/mission_poi/main{ + mission_index = 2 + }, /turf/open/floor/plasteel/tech, /area/ruin/jungle/cavecrew/bridge) "Al" = ( @@ -2733,6 +2739,10 @@ dir = 10 }, /obj/machinery/light/directional/south, +/obj/effect/landmark/mission_poi/guard{ + type_to_spawn = /mob/living/simple_animal/hostile/human/frontier/ranged/neutered; + mission_index = 2 + }, /turf/open/floor/plasteel/dark, /area/ruin/jungle/cavecrew/bridge) "Ir" = ( @@ -3219,7 +3229,7 @@ /obj/effect/turf_decal/industrial/hatch/yellow, /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate/secure/loot, -/obj/item/wallframe/bounty_board, +/obj/item/wallframe/bounty_viewer, /turf/open/floor/plasteel/patterned/cargo_one, /area/ruin/jungle/cavecrew/cargo) "Nf" = ( diff --git a/_maps/RandomRuins/JungleRuins/jungle_interceptor.dmm b/_maps/RandomRuins/JungleRuins/jungle_interceptor.dmm index 4d17f130e1ae..3d371042eb85 100644 --- a/_maps/RandomRuins/JungleRuins/jungle_interceptor.dmm +++ b/_maps/RandomRuins/JungleRuins/jungle_interceptor.dmm @@ -2634,9 +2634,7 @@ /area/overmap_encounter/planetoid/jungle/explored) "wI" = ( /obj/machinery/power/terminal, -/obj/structure/cable/orange{ - icon_state = "0-1" - }, +/obj/structure/cable/orange, /obj/structure/cable/orange{ icon_state = "1-5" }, @@ -3251,9 +3249,7 @@ icon_state = "1-2" }, /obj/machinery/door/airlock/security, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 2 - }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/door/firedoor/border_only{ dir = 1 }, @@ -3650,9 +3646,7 @@ dir = 4 }, /obj/structure/catwalk/over/plated_catwalk/dark, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 2 - }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/plating, /area/overmap_encounter/planetoid/jungle/explored) "FQ" = ( @@ -4769,9 +4763,7 @@ /area/overmap_encounter/planetoid/jungle/explored) "OL" = ( /obj/machinery/power/terminal, -/obj/structure/cable/orange{ - icon_state = "0-1" - }, +/obj/structure/cable/orange, /obj/effect/turf_decal/industrial/warning{ dir = 1 }, @@ -4812,9 +4804,7 @@ /area/overmap_encounter/planetoid/jungle/explored) "OW" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 2 - }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/item/stack/cable_coil/cut/orange, /turf/open/floor/plating/rust, /area/overmap_encounter/planetoid/jungle/explored) @@ -5274,9 +5264,7 @@ /area/ruin/jungle/interceptor/starhall) "ST" = ( /obj/machinery/power/terminal, -/obj/structure/cable/orange{ - icon_state = "0-1" - }, +/obj/structure/cable/orange, /obj/effect/turf_decal/industrial/warning{ dir = 1 }, @@ -5437,9 +5425,7 @@ /turf/open/floor/plating, /area/ruin/jungle/interceptor/starhall) "Up" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 2 - }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/item/stack/cable_coil/cut/orange, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, diff --git a/_maps/RandomRuins/JungleRuins/jungle_syndicate.dmm b/_maps/RandomRuins/JungleRuins/jungle_syndicate.dmm index 60d24171ad0f..e3600dde0bb7 100644 --- a/_maps/RandomRuins/JungleRuins/jungle_syndicate.dmm +++ b/_maps/RandomRuins/JungleRuins/jungle_syndicate.dmm @@ -56,6 +56,10 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/structure/table, /obj/item/storage/cans/sixbeer, +/obj/effect/landmark/mission_poi/main{ + blocks_emissive = 1; + mission_index = 1 + }, /turf/open/floor/plating, /area/ruin/jungle/syndifort) "bS" = ( @@ -128,6 +132,10 @@ name = "Jerry"; unsuitable_atmos_damage = 0 }, +/obj/effect/landmark/mission_poi/main/kill{ + already_spawned = 1; + mission_index = 2 + }, /turf/open/floor/plating, /area/ruin/jungle/syndifort/jerry) "es" = ( @@ -154,6 +162,10 @@ /area/ruin/jungle/syndifort) "eU" = ( /obj/structure/chair/plastic, +/obj/effect/landmark/mission_poi/guard{ + mission_index = 1; + type_to_spawn = /mob/living/simple_animal/hostile/human/syndicate/ranged + }, /turf/open/floor/plating, /area/ruin/jungle/syndifort) "eW" = ( @@ -762,6 +774,10 @@ /obj/structure/sign/poster/contraband/peacemaker{ pixel_x = 32 }, +/obj/effect/landmark/mission_poi/guard{ + mission_index = 1; + type_to_spawn = /mob/living/simple_animal/hostile/human/syndicate + }, /turf/open/floor/plating, /area/ruin/jungle/syndifort) "xm" = ( @@ -941,6 +957,10 @@ "BC" = ( /obj/structure/chair/plastic, /obj/machinery/light/small/directional/north, +/obj/effect/landmark/mission_poi/guard{ + mission_index = 1; + type_to_spawn = /mob/living/simple_animal/hostile/human/syndicate + }, /turf/open/floor/plating/rust, /area/ruin/jungle/syndifort) "BH" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_abandonedlisteningpost.dmm b/_maps/RandomRuins/LavaRuins/lavaland_abandonedlisteningpost.dmm index dd98807a4958..a70342230207 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_abandonedlisteningpost.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_abandonedlisteningpost.dmm @@ -151,6 +151,7 @@ /obj/effect/turf_decal/siding/thinplating/dark{ dir = 4 }, +/obj/effect/landmark/mission_poi/main/blackbox, /turf/open/floor/plasteel/dark, /area/ruin/unpowered/listening_post/operations) "db" = ( @@ -186,9 +187,7 @@ "dJ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/effect/decal/cleanable/dirt/dust, -/obj/effect/turf_decal/siding/wood{ - dir = 2 - }, +/obj/effect/turf_decal/siding/wood, /turf/open/floor/carpet/nanoweave/red, /area/ruin/unpowered/listening_post/commons) "dM" = ( @@ -298,9 +297,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 2 - }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/effect/turf_decal/siding/thinplating/dark{ dir = 1 @@ -464,9 +461,7 @@ /turf/open/floor/carpet/nanoweave/red, /area/ruin/unpowered/listening_post/commons) "hA" = ( -/obj/structure/cable{ - icon_state = "0-1" - }, +/obj/structure/cable, /obj/machinery/power/terminal{ dir = 1 }, @@ -1763,9 +1758,7 @@ /turf/open/floor/plasteel/dark, /area/ruin/unpowered/listening_post/operations) "FW" = ( -/obj/structure/cable{ - icon_state = "0-1" - }, +/obj/structure/cable, /obj/machinery/power/smes/engineering, /turf/open/floor/plating, /area/ruin/unpowered/listening_post/engineering) @@ -2199,9 +2192,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 2 - }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/effect/turf_decal/siding/thinplating/dark{ dir = 8 @@ -2471,9 +2462,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 2 - }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel/dark, diff --git a/_maps/RandomRuins/LavaRuins/lavaland_crashed_starwalker.dmm b/_maps/RandomRuins/LavaRuins/lavaland_crashed_starwalker.dmm index e0a98de791fc..f2d5738e71d8 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_crashed_starwalker.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_crashed_starwalker.dmm @@ -34,9 +34,7 @@ /obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 8 }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ - dir = 2 - }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, /obj/structure/cable/orange{ icon_state = "5-8" @@ -2541,6 +2539,7 @@ pixel_x = 32 }, /obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/mission_poi/main/blackbox, /turf/open/floor/plating/asteroid/basalt/lava_land_surface/lit, /area/ruin/unpowered/crashed_starwalker) "PH" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_buried_shrine.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_buried_shrine.dmm index 17094a2d2bff..80dd1309bc1f 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_buried_shrine.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_buried_shrine.dmm @@ -1250,6 +1250,9 @@ "EE" = ( /obj/structure/stone_tile/center/burnt, /obj/structure/stone_tile/surrounding/burnt, +/obj/effect/landmark/mission_poi/main{ + mission_index = 1 + }, /turf/open/lava/smooth/lava_land_surface, /area/ruin/unpowered/buried_shrine) "Fo" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_wrecked_factory.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_wrecked_factory.dmm index 3a6b545859b7..b66031e998be 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_wrecked_factory.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_wrecked_factory.dmm @@ -71,12 +71,15 @@ /turf/open/floor/plating/moss, /area/overmap_encounter/planetoid/lava/explored) "aM" = ( -/obj/item/documents/nanotrasen, /obj/item/spacecash/bundle/c1000, /obj/item/spacecash/bundle/c1000, /obj/item/spacecash/bundle/c1000, /obj/item/stock_parts/cell/gun/upgraded, /obj/structure/safe, +/obj/effect/landmark/mission_poi/main{ + mission_index = 1; + type_to_spawn = /obj/item/documents/nanotrasen + }, /turf/open/floor/carpet/blue, /area/ruin/lavaland/factory/manager_office) "aW" = ( @@ -229,6 +232,11 @@ /obj/effect/decal/cleanable/blood{ icon_state = "bubblegumfoot" }, +/obj/effect/landmark/mission_poi/main/implanted{ + mission_index = 3; + type_to_spawn = /mob/living/carbon/human; + already_spawned = 1 + }, /turf/open/floor/concrete/pavement/lava, /area/overmap_encounter/planetoid/lava/explored) "cx" = ( @@ -4834,8 +4842,7 @@ icon_state = "gibmid2" }, /obj/effect/decal/cleanable/blood{ - icon_state = "trails_2"; - dir = 2 + icon_state = "trails_2" }, /turf/open/floor/plasteel/dark, /area/ruin/lavaland/factory/dorms) @@ -5105,6 +5112,11 @@ /obj/structure/sign/poster/official/enlist{ pixel_y = 32 }, +/obj/effect/landmark/mission_poi/main{ + mission_index = 2; + type_to_spawn = /obj/item/clothing/accessory/medal/gold/captain; + already_spawned = 1 + }, /turf/open/floor/wood, /area/ruin/lavaland/factory/adminstrative) "YU" = ( diff --git a/_maps/RandomRuins/RockRuins/rockplanet_distillery.dmm b/_maps/RandomRuins/RockRuins/rockplanet_distillery.dmm index 6d6f81ffd5a0..1daae4437db2 100644 --- a/_maps/RandomRuins/RockRuins/rockplanet_distillery.dmm +++ b/_maps/RandomRuins/RockRuins/rockplanet_distillery.dmm @@ -746,9 +746,7 @@ /turf/open/floor/wood, /area/ruin/rockplanet/distillery/office) "ir" = ( -/obj/structure/cable/yellow{ - icon_state = "0-1" - }, +/obj/structure/cable/yellow, /obj/machinery/porta_turret/ship/weak, /turf/open/floor/plating/asteroid/rockplanet/cracked/lit, /area/ruin/rockplanet/distillery/office) @@ -778,9 +776,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/machinery/power/smes/shuttle/micro/precharged{ - dir = 4 - }, +/obj/machinery/power/smes/shuttle/micro/precharged, /obj/machinery/door/poddoor/shutters/preopen{ id = "pod_window" }, @@ -1100,9 +1096,7 @@ /turf/open/floor/pod/rockplanet, /area/ruin/rockplanet/distillery/shuttle) "mK" = ( -/turf/open/floor/plasteel/stairs/wood{ - color = "#5B3E1D" - }, +/turf/open/floor/plasteel/stairs/wood, /area/ruin/rockplanet/distillery/saloon) "mX" = ( /obj/effect/turf_decal/siding/wood{ @@ -2422,9 +2416,7 @@ /obj/effect/turf_decal/spline/fancy/opaque/white{ dir = 9 }, -/obj/effect/turf_decal/trimline/opaque/neutral/filled/corner{ - dir = 2 - }, +/obj/effect/turf_decal/trimline/opaque/neutral/filled/corner, /turf/open/floor/plasteel/patterned/rockplanet/lit, /area/overmap_encounter/planetoid/rockplanet/explored) "Bn" = ( @@ -2652,9 +2644,7 @@ /turf/open/floor/pod, /area/ruin/rockplanet/distillery/crew) "DX" = ( -/obj/structure/cable{ - icon_state = "0-1" - }, +/obj/structure/cable, /obj/structure/cable/yellow{ icon_state = "1-10" }, @@ -3592,9 +3582,7 @@ }, /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable/yellow{ - icon_state = "0-1" - }, +/obj/structure/cable/yellow, /obj/machinery/light/small/directional/south, /turf/open/floor/pod/rockplanet, /area/ruin/rockplanet/distillery) @@ -3668,9 +3656,7 @@ /turf/open/floor/plasteel/patterned/brushed, /area/ruin/rockplanet/distillery/engineering) "PI" = ( -/obj/machinery/power/shuttle/engine/electric{ - dir = 4 - }, +/obj/machinery/power/shuttle/engine/electric, /obj/structure/cable/yellow{ icon_state = "0-4" }, @@ -4404,6 +4390,10 @@ id = "frontier_armory" }, /mob/living/simple_animal/hostile/human/frontier/ranged/officer/internals, +/obj/effect/landmark/mission_poi{ + already_spawned = 1; + type_to_spawn = /mob/living/simple_animal/hostile/human/frontier/ranged/officer/internals + }, /turf/open/floor/wood, /area/ruin/rockplanet/distillery/office) "XD" = ( @@ -4544,9 +4534,7 @@ /obj/structure/window/reinforced{ dir = 1 }, -/obj/machinery/power/smes/shuttle/micro/precharged{ - dir = 4 - }, +/obj/machinery/power/smes/shuttle/micro/precharged, /obj/machinery/door/poddoor/shutters/preopen{ id = "pod_window" }, diff --git a/_maps/RandomRuins/SpaceRuins/corporate_mining.dmm b/_maps/RandomRuins/SpaceRuins/corporate_mining.dmm index 956466fc4be0..6dccfd7345fc 100644 --- a/_maps/RandomRuins/SpaceRuins/corporate_mining.dmm +++ b/_maps/RandomRuins/SpaceRuins/corporate_mining.dmm @@ -179,6 +179,14 @@ }, /turf/open/floor/plasteel/tech, /area/ruin/space/has_grav/corporatemine/bridge) +"fd" = ( +/obj/effect/decal/cleanable/blood/splatter, +/obj/effect/landmark/mission_poi/guard{ + mission_index = 1; + type_to_spawn = /mob/living/simple_animal/hostile/asteroid/hivelord + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/space) "fi" = ( /obj/structure/chair/office/light{ dir = 4 @@ -1093,6 +1101,20 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/airless, /area/ruin/space/has_grav/corporatemine) +"zQ" = ( +/obj/effect/landmark/mission_poi/guard{ + mission_index = 1; + type_to_spawn = /mob/living/simple_animal/hostile/asteroid/hivelord + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/space) +"Aa" = ( +/obj/effect/landmark/mission_poi{ + mission_index = 1; + type_to_spawn = /obj/structure/spawner/burrow/asteroid + }, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/space) "Ac" = ( /obj/structure/railing, /obj/structure/cable{ @@ -2100,6 +2122,14 @@ "UA" = ( /turf/closed/wall/rust, /area/ruin/space/has_grav/corporatemine/crewquarters) +"Vj" = ( +/obj/structure/vein/asteroid{ + vein_class = 4; + mining_charges = 30 + }, +/obj/effect/landmark/mission_poi/main/drill, +/turf/open/floor/plating/asteroid/airless, +/area/ruin/space) "Vr" = ( /obj/structure/grille/broken, /obj/item/shard, @@ -3719,9 +3749,9 @@ Al Al VM VM +Vj VM -VM -kp +fd bl VM Pn @@ -3822,7 +3852,7 @@ Al Al Iv VM -VM +zQ VM rG Bp @@ -3929,7 +3959,7 @@ VM VM bl VM -VM +Aa VM VM VM diff --git a/_maps/RandomRuins/SpaceRuins/power_puzzle.dmm b/_maps/RandomRuins/SpaceRuins/power_puzzle.dmm index c052a6f0cd04..f28ba5aa67a8 100644 --- a/_maps/RandomRuins/SpaceRuins/power_puzzle.dmm +++ b/_maps/RandomRuins/SpaceRuins/power_puzzle.dmm @@ -1216,7 +1216,7 @@ /obj/structure/chair/office{ dir = 8 }, -/obj/machinery/firealarm/directional/north, +/obj/machinery/firealarm/directional/east, /turf/open/floor/plasteel, /area/ruin/space/has_grav/powerpuzzle/secure) "jy" = ( @@ -3506,9 +3506,7 @@ /turf/open/floor/plasteel/dark, /area/ruin/space/has_grav/powerpuzzle/secure) "UV" = ( -/obj/structure/salvageable/computer{ - dir = 1 - }, +/obj/effect/landmark/mission_poi/main, /obj/machinery/door/poddoor/shutters{ id = "vaultshutters2" }, diff --git a/_maps/RandomRuins/WasteRuins/wasteplanet_abandoned_mechbay.dmm b/_maps/RandomRuins/WasteRuins/wasteplanet_abandoned_mechbay.dmm index 50d9986ea756..541bbf1569e6 100644 --- a/_maps/RandomRuins/WasteRuins/wasteplanet_abandoned_mechbay.dmm +++ b/_maps/RandomRuins/WasteRuins/wasteplanet_abandoned_mechbay.dmm @@ -1772,6 +1772,7 @@ /obj/effect/turf_decal/siding/thinplating/dark{ dir = 4 }, +/obj/effect/landmark/mission_poi/guard, /turf/open/floor/plasteel/dark, /area/ruin/wasteplanet/abandoned_mechbay/commandcontrol) "uD" = ( @@ -1931,6 +1932,7 @@ /obj/effect/turf_decal/siding/thinplating/dark{ dir = 10 }, +/obj/effect/landmark/mission_poi/main, /turf/open/floor/plasteel/mono/dark, /area/ruin/wasteplanet/abandoned_mechbay/commandcontrol) "wc" = ( @@ -2779,6 +2781,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 8 }, +/obj/effect/landmark/mission_poi/guard, /turf/open/floor/plasteel/dark, /area/ruin/wasteplanet/abandoned_mechbay/commandcontrol) "Hm" = ( @@ -3081,6 +3084,7 @@ pixel_y = 29; pixel_x = 28 }, +/obj/effect/landmark/mission_poi/guard, /turf/open/floor/plasteel/dark, /area/ruin/wasteplanet/abandoned_mechbay/commandcontrol) "Kj" = ( diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 229134b7eac7..dc3ae26b3e20 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -3964,34 +3964,34 @@ /area/centcom/evac) "aLV" = ( /turf/closed/indestructible/riveted, -/area/awaymission/errorroom) +/area/errorroom) "aLW" = ( /turf/closed/mineral/ash_rock, -/area/awaymission/errorroom) +/area/errorroom) "aLX" = ( /obj/structure/speaking_tile, /turf/closed/mineral/ash_rock, -/area/awaymission/errorroom) +/area/errorroom) "aLY" = ( /obj/item/rupee, /turf/open/floor/plating/ashplanet/wateryrock{ initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; planetary_atmos = 0 }, -/area/awaymission/errorroom) +/area/errorroom) "aLZ" = ( /turf/open/floor/plating/ashplanet/wateryrock{ initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; planetary_atmos = 0 }, -/area/awaymission/errorroom) +/area/errorroom) "aMa" = ( /obj/effect/landmark/error, /turf/open/floor/plating/ashplanet/wateryrock{ initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; planetary_atmos = 0 }, -/area/awaymission/errorroom) +/area/errorroom) "aMb" = ( /obj/structure/signpost/salvation{ icon = 'icons/obj/structures.dmi'; @@ -4002,7 +4002,7 @@ initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; planetary_atmos = 0 }, -/area/awaymission/errorroom) +/area/errorroom) "aMc" = ( /obj/structure/lattice, /turf/open/space, diff --git a/_maps/map_files/generic/blank.dmm b/_maps/map_files/generic/blank.dmm index b918e3fcaead..522ed46ce706 100644 --- a/_maps/map_files/generic/blank.dmm +++ b/_maps/map_files/generic/blank.dmm @@ -4,17 +4,17 @@ /area/space) "b" = ( /turf/closed/indestructible/riveted, -/area/awaymission/errorroom) +/area/errorroom) "p" = ( /turf/closed/mineral/ash_rock, -/area/awaymission/errorroom) +/area/errorroom) "t" = ( /obj/effect/landmark/error, /turf/open/floor/plating/ashplanet/wateryrock{ initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; planetary_atmos = 0 }, -/area/awaymission/errorroom) +/area/errorroom) "D" = ( /turf/closed/indestructible/riveted, /area/start) @@ -24,7 +24,7 @@ initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; planetary_atmos = 0 }, -/area/awaymission/errorroom) +/area/errorroom) "I" = ( /turf/open/floor/holofloor/hyperspace, /area/space) @@ -49,17 +49,17 @@ initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; planetary_atmos = 0 }, -/area/awaymission/errorroom) +/area/errorroom) "R" = ( /obj/structure/speaking_tile, /turf/closed/mineral/ash_rock, -/area/awaymission/errorroom) +/area/errorroom) "T" = ( /turf/open/floor/plating/ashplanet/wateryrock{ initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; planetary_atmos = 0 }, -/area/awaymission/errorroom) +/area/errorroom) "U" = ( /obj/effect/landmark/start/new_player, /turf/open/floor/plating, diff --git a/_maps/outpost/indie_space.dmm b/_maps/outpost/indie_space.dmm index b10b86822c8c..3e5ff1cab6e5 100644 --- a/_maps/outpost/indie_space.dmm +++ b/_maps/outpost/indie_space.dmm @@ -659,6 +659,11 @@ }, /turf/open/floor/plasteel, /area/outpost/hallway/central) +"ej" = ( +/obj/effect/turf_decal/corner/opaque/brown/full, +/obj/machinery/computer/mission, +/turf/open/floor/plasteel/patterned, +/area/outpost/cargo) "em" = ( /turf/closed/indestructible/reinforced, /area/outpost/external) @@ -5803,6 +5808,11 @@ }, /turf/open/floor/plasteel, /area/outpost/hallway/central) +"Jy" = ( +/obj/effect/turf_decal/corner/opaque/brown/full, +/obj/machinery/mission_pad, +/turf/open/floor/plasteel/patterned, +/area/outpost/cargo) "JA" = ( /obj/machinery/firealarm/directional/north, /obj/machinery/disposal/bin, @@ -17203,7 +17213,7 @@ HD Uw uw qN -UB +Jy UB gT FE @@ -17326,7 +17336,7 @@ HD Uw PI js -UB +ej yv Sl gO diff --git a/_maps/outpost/nanotrasen_asteroid.dmm b/_maps/outpost/nanotrasen_asteroid.dmm index 179aa234e780..eae76fe0a0b8 100644 --- a/_maps/outpost/nanotrasen_asteroid.dmm +++ b/_maps/outpost/nanotrasen_asteroid.dmm @@ -6155,7 +6155,6 @@ /obj/effect/turf_decal/techfloor{ dir = 5 }, -/obj/machinery/computer/bounty, /turf/open/floor/plasteel/tech, /area/outpost/hallway/fore) "vO" = ( @@ -7393,7 +7392,6 @@ /obj/effect/turf_decal/techfloor{ dir = 9 }, -/obj/machinery/computer/bounty, /turf/open/floor/plasteel/tech, /area/outpost/hallway/fore) "Aa" = ( @@ -10716,9 +10714,6 @@ /turf/open/floor/wood, /area/outpost/crew/library) "LE" = ( -/obj/machinery/computer/bounty{ - dir = 8 - }, /obj/effect/turf_decal/techfloor{ dir = 4 }, @@ -14878,7 +14873,6 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/computer/bounty, /turf/open/floor/plasteel/tech, /area/outpost/hallway/fore) "ZV" = ( diff --git a/_maps/outpost/nanotrasen_ice.dmm b/_maps/outpost/nanotrasen_ice.dmm index cfd32ad951ae..a6c142d66238 100644 --- a/_maps/outpost/nanotrasen_ice.dmm +++ b/_maps/outpost/nanotrasen_ice.dmm @@ -898,13 +898,14 @@ /obj/effect/turf_decal/siding/white{ dir = 10 }, -/obj/structure/table/reinforced, /obj/machinery/newscaster/directional/south, -/obj/item/newspaper, /obj/machinery/camera{ dir = 4 }, /obj/machinery/firealarm/directional/west, +/obj/machinery/computer/mission{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/outpost/cargo/smeltery) "gG" = ( @@ -3048,9 +3049,7 @@ /obj/effect/turf_decal/siding/white{ dir = 6 }, -/obj/structure/chair{ - dir = 1 - }, +/obj/machinery/mission_pad, /turf/open/floor/plasteel/dark, /area/outpost/cargo/smeltery) "us" = ( @@ -7419,9 +7418,6 @@ /obj/effect/turf_decal/siding/white{ dir = 8 }, -/obj/structure/chair{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ dir = 5 }, diff --git a/code/__DEFINES/dcs/signals/signals.dm b/code/__DEFINES/dcs/signals/signals.dm index 2293c5bf8fd5..7cc3f5e2c484 100644 --- a/code/__DEFINES/dcs/signals/signals.dm +++ b/code/__DEFINES/dcs/signals/signals.dm @@ -690,6 +690,10 @@ // Called by parent when pausing spawning, returns bool: (datum/source, spawning_started) #define COMSIG_SPAWNER_TOGGLE_SPAWNING "spawner_toggle" +// Drill signals +// Called when a mission drill finishes sampling +#define COMSIG_DRILL_SAMPLES_DONE "drill_done" + ///Beam Signals /// Called before beam is redrawn #define COMSIG_BEAM_BEFORE_DRAW "beam_before_draw" diff --git a/code/__DEFINES/dcs/signals/signals_ship.dm b/code/__DEFINES/dcs/signals/signals_overmap.dm similarity index 63% rename from code/__DEFINES/dcs/signals/signals_ship.dm rename to code/__DEFINES/dcs/signals/signals_overmap.dm index c18a26c5089d..9c9981960ad1 100644 --- a/code/__DEFINES/dcs/signals/signals_ship.dm +++ b/code/__DEFINES/dcs/signals/signals_overmap.dm @@ -1,2 +1,5 @@ ///Sent when a shuttle finishes loading to allow for any machinery that requires a late connection to fire that connection #define COMSIG_SHIP_DONE_CONNECTING "late_connect" + +///Send when a dynamic datum completes load level. +#define COMSIG_OVERMAP_LOADED "overmap_loaded" diff --git a/code/__DEFINES/economy.dm b/code/__DEFINES/economy.dm index c31bffa08bf3..7ff2cb1b984f 100644 --- a/code/__DEFINES/economy.dm +++ b/code/__DEFINES/economy.dm @@ -14,3 +14,7 @@ #define ACCOUNT_SEC_NAME "Defense Budget" #define NO_FREEBIES "commies go home" + +#define MISSION_REWARD_CASH "cash" +#define MISSION_REWARD_ITEMS "items" +#define MISSION_REWARD_REP "rep" diff --git a/code/__DEFINES/mission.dm b/code/__DEFINES/mission.dm new file mode 100644 index 000000000000..302da340edd8 --- /dev/null +++ b/code/__DEFINES/mission.dm @@ -0,0 +1,6 @@ +/// If this is deleted, so is the mission +#define MISSION_IMPORTANCE_CRITICAL "mission_critical" +/// If this and all other important missiosn are deleted, the mission is deleted +#define MISSION_IMPORTANCE_IMPORTANT "misison_important" +/// Relevent for the mission but can be deleted for free. +#define MISSION_IMPORTANCE_RELEVENT "mission_relevent" diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 1155ea88bed9..2a0d5e650387 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -188,6 +188,7 @@ #define FIRE_PRIORITY_CALLBACKS 600 #define FIRE_PRIORITY_EXPLOSIONS 666 #define FIRE_PRIORITY_TIMER 700 +#define FIRE_PRIORITY_MISSIONS 750 #define FIRE_PRIORITY_SOUND_LOOPS 800 #define FIRE_PRIORITY_OVERMAP_MOVEMENT 850 #define FIRE_PRIORITY_SPEECH_CONTROLLER 900 diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 7bd6f72771cc..ab45be40343b 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -681,7 +681,7 @@ GLOBAL_LIST_INIT(WALLITEMS, typecacheof(list( /obj/machinery/computer/security/telescreen, /obj/machinery/embedded_controller/radio/simple_vent_controller, /obj/item/storage/secure/safe, /obj/machinery/door_timer, /obj/machinery/flasher, /obj/machinery/keycard_auth, /obj/structure/mirror, /obj/structure/cabinet, /obj/machinery/computer/security/telescreen/entertainment, - /obj/structure/sign/picture_frame, /obj/machinery/bounty_board + /obj/structure/sign/picture_frame, /obj/machinery/bounty_viewer ))) GLOBAL_LIST_INIT(WALLITEMS_EXTERNAL, typecacheof(list( diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 37256f9ce833..b8ff6e1664e3 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -432,6 +432,14 @@ config_entry_value = 127 min_val = 127 +/datum/config_entry/number/max_simple_missions + config_entry_value = 6 + min_val = 0 + +/datum/config_entry/number/max_dynamic_missions + config_entry_value = 6 + min_val = 0 + /** * A config that skews with the random spawners weights * If the value is lower than 1, it'll tend to even out the odds @@ -439,5 +447,5 @@ */ /datum/config_entry/number/random_loot_weight_modifier integer = FALSE - default = 1 + config_entry_value = 1 min_val = 0.05 diff --git a/code/controllers/subsystem/faction.dm b/code/controllers/subsystem/faction.dm index 106fb4687b83..258ee273e9ae 100644 --- a/code/controllers/subsystem/faction.dm +++ b/code/controllers/subsystem/faction.dm @@ -30,3 +30,13 @@ SUBSYSTEM_DEF(factions) if(faction.type == path) return faction stack_trace("we did not return any faction with path [path]") + +/datum/controller/subsystem/factions/proc/faction_name(path_or_type) + var/datum/faction/faction + if(istype(path_or_type, /datum/faction)) + faction = path_or_type + else if(ispath(path_or_type)) + faction = faction_path_to_datum(path_or_type) + else + return "Unknown Faction" + return faction.name diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 3fecc68fbfe4..cd768d9c2062 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -16,6 +16,7 @@ SUBSYSTEM_DEF(mapping) var/list/ruin_types_probabilities = list() var/list/ruins_templates = list() var/list/planet_types = list() + var/list/mission_pois = list() var/list/maplist var/list/ship_purchase_list diff --git a/code/controllers/subsystem/missions.dm b/code/controllers/subsystem/missions.dm new file mode 100644 index 000000000000..c90cfb65058b --- /dev/null +++ b/code/controllers/subsystem/missions.dm @@ -0,0 +1,49 @@ +SUBSYSTEM_DEF(missions) + name = "Missions" + flags = SS_NO_INIT + priority = FIRE_PRIORITY_MISSIONS + var/list/obj/effect/landmark/mission_poi/unallocated_pois = list() + var/list/datum/mission/dynamic/inactive_missions = list() + var/list/datum/mission/dynamic/active_missions = list() + +/datum/controller/subsystem/missions/stat_entry(msg) + var/unallocated = unallocated_pois.len + var/inactive_count = inactive_missions.len + var/active_count = active_missions.len + msg = "missions:A[active_count]|I:[inactive_count]|pois:[unallocated]" + return ..() + +/datum/controller/subsystem/missions/fire(resumed) + if(active_missions.len < CONFIG_GET(number/max_dynamic_missions)) + for(var/i in 1 to inactive_missions.len) + //Make sure we dont ONLY take the one of the top. + if(prob(50)) + //Has the pleasnt result of grabbing the most recent mission, idealy this means a freshly created planet + var/datum/mission/dynamic/mission_to_start = inactive_missions[inactive_missions.len - (i - 1)] + mission_to_start.start_mission() + break + + +// should probably come up with a better solution for this +// hierarchical weighting? would need to distinguish between "real" and "fake" missions +/datum/controller/subsystem/missions/proc/get_weighted_mission_type() + var/static/list/weighted_missions + if(!weighted_missions) + weighted_missions = list() + var/list/mission_types = subtypesof(/datum/mission) + for(var/datum/mission/mis_type as anything in mission_types) + if(initial(mis_type.weight) > 0) + weighted_missions[mis_type] = initial(mis_type.weight) + return pickweight_float(weighted_missions) + +/datum/controller/subsystem/missions/proc/get_researcher_name() + var/group = pick(list( + "Cybersun Industries", + "CMM-GOLD", + "Nanotrasen Anomalous Studies Division", + "The Naturalienwissenschaftlicher Studentenverbindungs-Verband", + "The Central Solarian Anomaly Research Agency", + "DeForest Medical R&D", + "A strange sarathi on the outpost" + )) + return group diff --git a/code/controllers/subsystem/overmap.dm b/code/controllers/subsystem/overmap.dm index dd5515397277..0f713c80eae5 100644 --- a/code/controllers/subsystem/overmap.dm +++ b/code/controllers/subsystem/overmap.dm @@ -17,6 +17,8 @@ SUBSYSTEM_DEF(overmap) ///List of all events var/list/events + ///List of dynamic encounters, just planets rn. + var/list/dynamic_encounters ///Map of tiles at each radius (represented by index) around the sun var/list/list/radius_positions @@ -49,6 +51,7 @@ SUBSYSTEM_DEF(overmap) controlled_ships = list() outposts = list() events = list() + dynamic_encounters = list() generator_type = CONFIG_GET(string/overmap_generator_type) size = CONFIG_GET(number/overmap_size) @@ -79,6 +82,8 @@ SUBSYSTEM_DEF(overmap) return ..() /datum/controller/subsystem/overmap/fire() + if(length(dynamic_encounters) < CONFIG_GET(number/max_overmap_dynamic_events)) + spawn_ruin_level() if(events_enabled) for(var/datum/overmap/event/E as anything in events) if(E.get_nearby_overmap_objects()) @@ -127,10 +132,10 @@ SUBSYSTEM_DEF(overmap) /datum/controller/subsystem/overmap/proc/create_map() if (generator_type == OVERMAP_GENERATOR_SOLAR) spawn_events_in_orbits() - spawn_ruin_levels_in_orbits() else spawn_events() - spawn_ruin_levels() + + spawn_ruin_levels() spawn_outpost() //spawn_initial_ships() @@ -250,11 +255,10 @@ SUBSYSTEM_DEF(overmap) */ /datum/controller/subsystem/overmap/proc/spawn_ruin_levels() for(var/i in 1 to CONFIG_GET(number/max_overmap_dynamic_events)) - new /datum/overmap/dynamic() + spawn_ruin_level() -/datum/controller/subsystem/overmap/proc/spawn_ruin_levels_in_orbits() - for(var/i in 1 to CONFIG_GET(number/max_overmap_dynamic_events)) - new /datum/overmap/dynamic() +/datum/controller/subsystem/overmap/proc/spawn_ruin_level() + new /datum/overmap/dynamic() /** * Reserves a square dynamic encounter area, generates it, and spawns a ruin in it if one is supplied. @@ -378,7 +382,16 @@ SUBSYSTEM_DEF(overmap) quaternary_dock.dwidth = 0 docking_ports += quaternary_dock - return list(mapzone, docking_ports, ruin_turfs, ruin_templates) + var/list/spawned_mission_pois = list() + for(var/obj/effect/landmark/mission_poi/mission_poi in SSmissions.unallocated_pois) + if(!vlevel.is_in_bounds(mission_poi)) + continue + + spawned_mission_pois += mission_poi + SSmissions.unallocated_pois -= mission_poi + + + return list(mapzone, docking_ports, ruin_turfs, ruin_templates, spawned_mission_pois) /** * Returns a random, usually empty turf in the overmap @@ -494,6 +507,7 @@ SUBSYSTEM_DEF(overmap) overmap_objects = SSovermap.overmap_objects controlled_ships = SSovermap.controlled_ships events = SSovermap.events + dynamic_encounters = SSovermap.dynamic_encounters outposts = SSovermap.outposts radius_positions = SSovermap.radius_positions overmap_vlevel = SSovermap.overmap_vlevel diff --git a/code/datums/ruins.dm b/code/datums/ruins.dm index 3554faf3e2ca..3a4e85857a03 100644 --- a/code/datums/ruins.dm +++ b/code/datums/ruins.dm @@ -18,10 +18,11 @@ var/ruin_type var/ruin_tags = list() + var/dynamic_mission_types + /datum/map_template/ruin/New() if(!name && id) name = id mappath = prefix + suffix ..(path = mappath) - diff --git a/code/datums/ruins/beachplanet.dm b/code/datums/ruins/beachplanet.dm index 3b048ab940c1..ce4e7cd0c04d 100644 --- a/code/datums/ruins/beachplanet.dm +++ b/code/datums/ruins/beachplanet.dm @@ -31,6 +31,7 @@ description = "A small pirate outpost formed from the remains of a wrecked shuttle." suffix = "beach_pirate_crash.dmm" ruin_tags = list(RUIN_TAG_MEDIUM_COMBAT, RUIN_TAG_MEDIUM_LOOT, RUIN_TAG_LIVEABLE) + dynamic_mission_types = list(/datum/mission/dynamic/signaled/kill/frontiersmen) /datum/map_template/ruin/beachplanet/treasurecove name = "Treasure Cove" @@ -38,6 +39,7 @@ description = "A abandoned colony. It seems that this colony was abandoned, for a reason or another" suffix = "beach_treasure_cove.dmm" ruin_tags = list(RUIN_TAG_MEDIUM_COMBAT, RUIN_TAG_MEDIUM_LOOT, RUIN_TAG_LIVEABLE) + dynamic_mission_types = list(/datum/mission/dynamic/signaled/kill/frontiersmen) /datum/map_template/ruin/beachplanet/crashedengie name = "Crashed Engineer Ship" diff --git a/code/datums/ruins/icemoon.dm b/code/datums/ruins/icemoon.dm index 30b231c385c2..458370243f1d 100644 --- a/code/datums/ruins/icemoon.dm +++ b/code/datums/ruins/icemoon.dm @@ -10,6 +10,7 @@ description = "An abandoned hydroponics research facility containing hostile plant fauna." suffix = "icemoon_hydroponics_lab.dmm" ruin_tags = list(RUIN_TAG_MEDIUM_LOOT, RUIN_TAG_MEDIUM_COMBAT, RUIN_TAG_SHELTER) + dynamic_mission_types = list(/datum/mission/dynamic/data_reterival) /datum/map_template/ruin/icemoon/abandonedvillage name = "Abandoned Village" @@ -17,6 +18,10 @@ description = "Who knows what lies within?" suffix = "icemoon_underground_abandoned_village.dmm" ruin_tags = list(RUIN_TAG_MEDIUM_COMBAT, RUIN_TAG_MINOR_LOOT, RUIN_TAG_INHOSPITABLE) + dynamic_mission_types = list( + /datum/mission/dynamic/data_reterival, + /datum/mission/dynamic/signaled/drill + ) /datum/map_template/ruin/icemoon/brazillian_lab name = "Barricaded Compound" @@ -24,6 +29,7 @@ description = "A conspicuous compound in the middle of the cold wasteland. What goodies are inside?" suffix = "icemoon_underground_brazillianlab.dmm" ruin_tags = list(RUIN_TAG_BOSS_COMBAT, RUIN_TAG_MAJOR_LOOT, RUIN_TAG_INHOSPITABLE) + dynamic_mission_types = list(/datum/mission/dynamic/data_reterival) /datum/map_template/ruin/icemoon/crashed_holemaker name = "Crashed Holemaker" @@ -31,6 +37,7 @@ description = "Safety records for early Nanotrasen Spaceworks vessels were, and always have been, top of their class. Absolutely no multi-billion credit projects have been painstakingly erased from history. (Citation Needed)" suffix = "icemoon_crashed_holemaker.dmm" ruin_tags = list(RUIN_TAG_MEDIUM_COMBAT, RUIN_TAG_MINOR_LOOT, RUIN_TAG_SHELTER) + dynamic_mission_types = list(/datum/mission/dynamic/data_reterival) /datum/map_template/ruin/icemoon/ice_lodge name = "Ice Lodge" @@ -38,4 +45,11 @@ description = "Records show this settlement as belonging to the SRM, but no one has heard from them as of late. I wonder what happened?" suffix = "icemoon_ice_lodge.dmm" ruin_tags = list(RUIN_TAG_HARD_COMBAT, RUIN_TAG_MAJOR_LOOT, RUIN_TAG_SHELTER, RUIN_TAG_HAZARDOUS) + dynamic_mission_types = list(/datum/mission/dynamic/fallen_montagne) +/datum/mission/dynamic/fallen_montagne + name = "dark signal investigation" + desc = "We've lost contact with one of our lodges but there signal has gone dark. We suspect they may have been assulted by a hostile faction. If they are KIA please retrive the Montagne's body." + mission_reward = /obj/structure/fermenting_barrel/trickwine + faction = /datum/faction/srm + setpiece_item = /mob/living/carbon/human diff --git a/code/datums/ruins/jungle.dm b/code/datums/ruins/jungle.dm index faaefea4fd8b..c6ffbb3f8c49 100644 --- a/code/datums/ruins/jungle.dm +++ b/code/datums/ruins/jungle.dm @@ -10,6 +10,26 @@ description = "A small bunker owned by the Syndicate." suffix = "jungle_syndicate.dmm" ruin_tags = list(RUIN_TAG_MEDIUM_COMBAT, RUIN_TAG_MEDIUM_LOOT, RUIN_TAG_LIVEABLE) + dynamic_mission_types = list( + /datum/mission/dynamic/nt_files, + /datum/mission/dynamic/signaled/kill/jerry + ) + +/datum/mission/dynamic/signaled/kill/jerry + name = "FUCKING KIL JERRY THAT SUNOFA BITCH STOLE BY GODDAMN RELINA PLUSHIE!!" + desc = "I WANT MY FUCKIN PUSHIE BACK KILL HIM AND ILL PAY!" + author = "I FUCKING WANT HIM HUNG." + mission_reward = /obj/item/poster/random_rilena + registered_type = /mob/living/simple_animal/hostile/human/syndicate + setpiece_item = list( + /obj/item/toy/plush/rilena, + /obj/item/toy/plush/tali, + /obj/item/toy/plush/sharai, + /obj/item/toy/plush/xader, + /obj/item/toy/plush/mora, + /obj/item/toy/plush/kari + ) + /datum/map_template/ruin/jungle/interceptor name = "Old Crashed Interceptor" @@ -31,6 +51,7 @@ description = "A bombed out airbase from the ICW, taken back over by nature" suffix = "jungle_bombed_starport.dmm" ruin_tags = list(RUIN_TAG_MEDIUM_COMBAT, RUIN_TAG_MAJOR_LOOT, RUIN_TAG_HAZARDOUS, RUIN_TAG_LIVEABLE) + dynamic_mission_types = list(/datum/mission/dynamic/blackbox) /datum/map_template/ruin/jungle/medtech name = "MedTech facility" @@ -45,6 +66,10 @@ description = "A frontiersmen base, hidden within a cave. They don't seem friendly" suffix = "jungle_cavecrew.dmm" ruin_tags = list(RUIN_TAG_MEDIUM_COMBAT, RUIN_TAG_HAZARDOUS, RUIN_TAG_LIVEABLE, RUIN_TAG_MAJOR_LOOT) + dynamic_mission_types = list( + /datum/mission/dynamic/signaled/kill/frontiersmen, + /datum/mission/dynamic/data_reterival + ) /datum/map_template/ruin/jungle/library name = "Abandoned Library" diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm index f94d75bd71f9..aaac437efd7b 100644 --- a/code/datums/ruins/lavaland.dm +++ b/code/datums/ruins/lavaland.dm @@ -17,6 +17,7 @@ id = "buried_shrine" description = "An ancient temple belonging to some long-gone inhabitants, wrecked and buried by the volcanic activity of it's home planet." suffix = "lavaland_surface_buried_shrine.dmm" + dynamic_mission_types = list(/datum/mission/dynamic/signaled/kill/elite) /datum/map_template/ruin/lavaland/lava_canyon name = "Lava Canyon" @@ -29,15 +30,46 @@ id = "wreck_factory" description = "A Nanotrasen processing facility, assaulted by a pirate raid that has killed most of the staff. The offices however, remain unbreached for now." suffix = "lavaland_surface_wrecked_factory.dmm" + dynamic_mission_types = list( + /datum/mission/dynamic/nanotrasen_docs, + /datum/mission/dynamic/captain_medal, + /datum/mission/dynamic/brainchip + ) + +/datum/mission/dynamic/nanotrasen_docs + name = "recover some nanotrasen files." + value = 2500 + setpiece_item = /obj/item/documents/nanotrasen + +/datum/mission/dynamic/captain_medal + name = "recover my lost medal." + value = 1250 + setpiece_item = /obj/item/documents/nanotrasen + +/datum/mission/dynamic/brainchip + name = "one of our cargo techs died with some important tech in his head. get it back" + setpiece_item = /mob/living/carbon/human + +/obj/effect/landmark/mission_poi/main/implanted + var/implant_type = /obj/item/organ/cyberimp/brain/datachip + +/obj/effect/landmark/mission_poi/main/implanted/use_poi(_type_to_spawn) + var/mob/living/carbon/human/implanted = ..() + if(istype(implanted, /mob/living/carbon/human)) + var/obj/item/organ/implant = new implant_type() + implant.Insert(implanted) + return implant /datum/map_template/ruin/lavaland/fallenstar name = "Crashed Starwalker" id = "crashed_star" description = "A crashed pirate ship. It would seem that it's crew died a while ago." suffix = "lavaland_crashed_starwalker.dmm" + dynamic_mission_types = list(/datum/mission/dynamic/blackbox) /datum/map_template/ruin/lavaland/abandonedlisteningpost name = "Abandoned Listening Post" id = "abandonedlistening" description = "An abandoned Cybersun listening post. Seems like the Ramzi Clique has an interest in the site." suffix = "lavaland_abandonedlisteningpost.dmm" + dynamic_mission_types = list(/datum/mission/dynamic/blackbox) diff --git a/code/datums/ruins/rockplanet.dm b/code/datums/ruins/rockplanet.dm index 7382b2c5768a..3d879c3eb202 100644 --- a/code/datums/ruins/rockplanet.dm +++ b/code/datums/ruins/rockplanet.dm @@ -36,3 +36,4 @@ description = "A former pre-ICW era Nanotrasen outpost converted into a moonshine distillery by Frontiersman bootleggers." id = "rockplanet_distillery" suffix = "rockplanet_distillery.dmm" + dynamic_mission_types = list(/datum/mission/dynamic/signaled/kill/frontiersmen) diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm index f8cda3a84426..7a56e1587919 100644 --- a/code/datums/ruins/space.dm +++ b/code/datums/ruins/space.dm @@ -12,6 +12,7 @@ name = "Corporate Mining Module" description = "An old and rusty mining facility, with big ore potential." ruin_tags = list(RUIN_TAG_NO_COMBAT, RUIN_TAG_MEDIUM_LOOT, RUIN_TAG_SHELTER) + dynamic_mission_types = list(/datum/mission/dynamic/signaled/drill) /datum/map_template/ruin/space/bigderelict1 id = "bigderelict1" @@ -35,6 +36,7 @@ description = "an abandoned secure storage location. there is no power left in the batteries and the former ocupants locked it pretty tight before leaving.\ You will have to power areas to raise the bolts on the doors. look out for secrets." ruin_tags = list(RUIN_TAG_MINOR_COMBAT, RUIN_TAG_MAJOR_LOOT, RUIN_TAG_SHELTER, RUIN_TAG_HAZARDOUS) + dynamic_mission_types = list(/datum/mission/dynamic/data_reterival) /datum/map_template/ruin/space/astraeus id = "astraeus" diff --git a/code/game/area/areas/away_content.dm b/code/game/area/areas/away_content.dm index 53ccc590c72a..04b9b3badcbc 100644 --- a/code/game/area/areas/away_content.dm +++ b/code/game/area/areas/away_content.dm @@ -1,33 +1,7 @@ -/* -Unused icons for new areas are "awaycontent1" ~ "awaycontent30" -*/ - - -// Away Missions -/area/awaymission - name = "Strange Location" +/area/errorroom + name = "Super Secret Room" icon_state = "away" has_gravity = STANDARD_GRAVITY ambientsounds = AWAY_MISSION sound_environment = SOUND_ENVIRONMENT_ROOM - -/area/awaymission/beach - name = "Beach" - icon_state = "away" - dynamic_lighting = DYNAMIC_LIGHTING_DISABLED - requires_power = FALSE - has_gravity = STANDARD_GRAVITY - ambientsounds = list('sound/ambience/shore.ogg', 'sound/ambience/seag1.ogg','sound/ambience/seag2.ogg','sound/ambience/seag2.ogg','sound/ambience/ambiodd.ogg','sound/ambience/ambinice.ogg') - -/area/awaymission/errorroom - name = "Super Secret Room" - dynamic_lighting = DYNAMIC_LIGHTING_DISABLED - has_gravity = STANDARD_GRAVITY - -/area/awaymission/vr - name = "Virtual Reality" - icon_state = "awaycontent1" - requires_power = FALSE dynamic_lighting = DYNAMIC_LIGHTING_DISABLED - var/pacifist = TRUE // if when you enter this zone, you become a pacifist or not - var/death = FALSE // if when you enter this zone, you die diff --git a/code/game/machinery/bounty_board.dm b/code/game/machinery/bounty_board.dm deleted file mode 100644 index 4cc3413fe9d9..000000000000 --- a/code/game/machinery/bounty_board.dm +++ /dev/null @@ -1,191 +0,0 @@ -GLOBAL_LIST_EMPTY(allbountyboards) -GLOBAL_LIST_EMPTY(request_list) -/** - * A machine that acts basically like a quest board. - * Enables crew to create requests, crew can sign up to perform the request, and the requester can chose who to pay-out. - */ -/obj/machinery/bounty_board - name = "bounty board" - desc = "Alows you to place requests for goods and services across the sector, as well as pay those who actually did it." - icon = 'icons/obj/terminals.dmi' - icon_state = "request_kiosk" - light_color = LIGHT_COLOR_GREEN - ///Reference to the currently logged in user. - var/datum/bank_account/current_user - ///The station request datum being affected by UI actions. - var/datum/station_request/active_request - ///Value of the currently bounty input - var/bounty_value = 1 - ///Text of the currently written bounty - var/bounty_text = "" - -/obj/machinery/bounty_board/Initialize(mapload, ndir, building) - . = ..() - GLOB.allbountyboards += src - if(building) - setDir(ndir) - pixel_x = (dir & 3)? 0 : (dir == 4 ? -32 : 32) - pixel_y = (dir & 3)? (dir ==1 ? -32 : 32) : 0 - -/obj/machinery/bounty_board/Destroy() - GLOB.allbountyboards -= src - . = ..() - -/obj/machinery/bounty_board/attackby(obj/item/I, mob/living/user, params) - . = ..() - if(istype(I,/obj/item/card/bank)) - var/obj/item/card/bank/current_card = I - if(current_card.registered_account) - current_user = current_card.registered_account - return TRUE - to_chat(user, "There's no account assigned with this ID.") - return TRUE - if(I.tool_behaviour == TOOL_WRENCH) - to_chat(user, "You start [anchored ? "un" : ""]securing [name]...") - I.play_tool_sound(src) - if(I.use_tool(src, user, 30)) - playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) - if(machine_stat & BROKEN) - to_chat(user, "The broken remains of [src] fall on the ground.") - new /obj/item/stack/sheet/metal(loc, 3) - new /obj/item/shard(loc) - else - to_chat(user, "You [anchored ? "un" : ""]secure [name].") - new /obj/item/wallframe/bounty_board(loc) - qdel(src) - -/obj/machinery/bounty_board/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "RequestKiosk", name) - ui.open() - -/obj/machinery/bounty_board/ui_data(mob/user) - var/list/data = list() - var/list/formatted_requests = list() - var/list/formatted_applicants = list() - for(var/i in GLOB.request_list) - if(!i) - continue - var/datum/station_request/request = i - formatted_requests += list(list("owner" = request.owner, "value" = request.value, "description" = request.description, "acc_number" = request.req_number)) - if(request.applicants) - for(var/datum/bank_account/j in request.applicants) - formatted_applicants += list(list("name" = j.account_holder, "request_id" = request.owner_account.account_id, "requestee_id" = j.account_id)) - var/obj/item/card/bank/bank_card = user.get_bankcard() - if(bank_card?.registered_account) - current_user = bank_card.registered_account - if(current_user) - data["accountName"] = current_user.account_holder - data["requests"] = formatted_requests - data["applicants"] = formatted_applicants - data["bountyValue"] = bounty_value - data["bountyText"] = bounty_text - return data - -/obj/machinery/bounty_board/ui_act(action, list/params) - . = ..() - if(.) - return - - var/current_ref_num = params["request"] - var/current_app_num = params["applicant"] - var/datum/bank_account/request_target - if(current_ref_num) - for(var/datum/station_request/i in GLOB.request_list) - if("[i.req_number]" == "[current_ref_num]") - active_request = i - break - if(active_request) - for(var/datum/bank_account/j in active_request.applicants) - if("[j.account_id]" == "[current_app_num]") - request_target = j - break - switch(action) - if("createBounty") - if(!current_user || !bounty_text) - playsound(src, 'sound/machines/buzz-sigh.ogg', 20, TRUE) - return TRUE - for(var/datum/station_request/i in GLOB.request_list) - if("[i.req_number]" == "[current_user.account_id]") - say("Account already has active bounty.") - return - var/datum/station_request/curr_request = new /datum/station_request(current_user.account_holder, bounty_value,bounty_text,current_user.account_id, current_user) - GLOB.request_list += list(curr_request) - for(var/obj/i in GLOB.allbountyboards) - i.say("New bounty has been added!") - playsound(i.loc, 'sound/effects/cashregister.ogg', 30, TRUE) - if("apply") - if(!current_user) - say("Please swipe a valid ID first.") - return TRUE - if(current_user.account_holder == active_request.owner) - playsound(src, 'sound/machines/buzz-sigh.ogg', 20, TRUE) - return TRUE - active_request.applicants += list(current_user) - if("payApplicant") - if(!current_user) - return - if(!current_user.has_money(active_request.value) || (current_user.account_holder != active_request.owner)) - playsound(src, 'sound/machines/buzz-sigh.ogg', 30, TRUE) - return - request_target.transfer_money(current_user, active_request.value) - say("Paid out [active_request.value] credits.") - return TRUE - if("clear") - if(current_user) - current_user = null - say("Account Reset.") - return TRUE - if("deleteRequest") - if(!active_request || !current_user) - playsound(src, 'sound/machines/buzz-sigh.ogg', 20, TRUE) - return FALSE - if(active_request?.owner != current_user?.account_holder) - playsound(src, 'sound/machines/buzz-sigh.ogg', 20, TRUE) - return TRUE - say("Deleted current request.") - GLOB.request_list.Remove(active_request) - return TRUE - if("bountyVal") - bounty_value = text2num(params["bountyval"]) - if(!bounty_value) - bounty_value = 1 - if("bountyText") - bounty_text = (params["bountytext"]) - . = TRUE - -/obj/item/wallframe/bounty_board - name = "disassembled bounty board" - desc = "Used to build a new bounty board, just secure to the wall." - icon_state = "request_kiosk" - custom_materials = list(/datum/material/iron=14000, /datum/material/glass=8000) - result_path = /obj/machinery/bounty_board - inverse = FALSE - -/** - * A combined all in one datum that stores everything about the request, the requester's account, as well as the requestee's account - * All of this is passed to the Request Console UI in order to present in organized way. - */ -/datum/station_request - ///Name of the Request Owner. - var/owner - ///Value of the request. - var/value - ///Text description of the request to be shown within the UI. - var/description - ///Internal number of the request for organizing. Id card number. - var/req_number - ///The account of the request owner. - var/datum/bank_account/owner_account - ///the account of the request fulfiller. - var/list/applicants = list() - -/datum/station_request/New(owned, newvalue, newdescription, reqnum, own_account) - . = ..() - owner = owned - value = newvalue - description = newdescription - req_number = reqnum - if(istype(own_account, /datum/bank_account)) - owner_account = own_account diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index 5e82266f186c..15aeebdd819c 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -352,9 +352,14 @@ //Supply /obj/item/circuitboard/computer/bounty - name = "\improper Nanotrasen Bounty Console (Computer Board)" + name = "\improper Outpost Bounty Console (Computer Board)" icon_state = "supply" - build_path = /obj/machinery/computer/bounty + build_path = /obj/machinery/computer/mission + +/obj/item/circuitboard/computer/mission + name = "\improper Outpost Mission Console" + icon_state = "supply" + build_path = /obj/machinery/computer/mission /obj/item/circuitboard/computer/cargo name = "Outpost Comms Console (Computer Board)" diff --git a/code/game/objects/items/documents.dm b/code/game/objects/items/documents.dm index e7e78abb4abc..da7885742c24 100644 --- a/code/game/objects/items/documents.dm +++ b/code/game/objects/items/documents.dm @@ -59,7 +59,7 @@ var/forgedseal = 0 var/copy_type = null -/obj/item/documents/photocopy/New(loc, obj/item/documents/copy=null) +/obj/item/documents/photocopy/New(loc, obj/item/documents/copy = null) ..() if(copy) copy_type = copy.type diff --git a/code/game/turfs/open/dirtystation.dm b/code/game/turfs/open/dirtystation.dm index 29e13585bb7d..ad0110abeb80 100644 --- a/code/game/turfs/open/dirtystation.dm +++ b/code/game/turfs/open/dirtystation.dm @@ -53,8 +53,7 @@ return //Bathrooms. Blood, vomit, and shavings in the sinks. - var/static/list/bathroom_dirt_areas = typecacheof(list( /area/ship/crew/toilet, - /area/awaymission/research/interior/bathroom)) + var/static/list/bathroom_dirt_areas = typecacheof(list(/area/ship/crew/toilet)) if(is_type_in_typecache(A, bathroom_dirt_areas)) if(prob(40)) if(prob(90)) diff --git a/code/modules/admin/verbs/outpost.dm b/code/modules/admin/verbs/outpost.dm index 25632838f45f..acace102e9b8 100644 --- a/code/modules/admin/verbs/outpost.dm +++ b/code/modules/admin/verbs/outpost.dm @@ -19,7 +19,7 @@ /client/proc/spawn_outpost() set name = "Spawn Outpost" - set category = "Event.Spawning" + set category = "Event.Overmap" set desc = "Spawns the selected /datum/overmap/outpost subtype." if(!holder) diff --git a/code/modules/admin/verbs/overmap_token_manager.dm b/code/modules/admin/verbs/overmap_token_manager.dm index 1dc57b17b05e..1555d38531ea 100644 --- a/code/modules/admin/verbs/overmap_token_manager.dm +++ b/code/modules/admin/verbs/overmap_token_manager.dm @@ -1,6 +1,6 @@ /client/proc/overmap_datum_token_manager() set name = "Overmap Datum Token Manager" - set category = "Admin.Game" + set category = "Event.Overmap" set desc = "Manage the tokens of the overmap datum." var/static/datum/overmap_datum_token_manager/manager diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 68a2f4675bdb..e08c15c373fd 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -832,7 +832,7 @@ /client/proc/spawn_ruin() set name = "Spawn Planet/Ruin" - set category = "Event.Spawning" + set category = "Event.Overmap" if(!check_rights(R_ADMIN) || !check_rights(R_SPAWN)) return @@ -882,14 +882,7 @@ encounter.choose_level_type(FALSE) if(!ruin_target) encounter.ruin_type = null - encounter.preserve_level = TRUE - encounter.load_level() - - message_admins(span_big("Click here to jump to the overmap token: " + ADMIN_JMP(encounter.token))) - message_admins(span_big("Click here to jump to the overmap dock: " + ADMIN_JMP(encounter.reserve_docks[1]))) - for(var/ruin in encounter.ruin_turfs) - var/turf/ruin_turf = encounter.ruin_turfs[ruin] - message_admins(span_big("Click here to jump to \"[ruin]\": " + ADMIN_JMP(ruin_turf))) + encounter.admin_load() /client/proc/smite(mob/living/target as mob) set name = "Smite" diff --git a/code/modules/admin/verbs/shuttlepanel.dm b/code/modules/admin/verbs/shuttlepanel.dm index bb3bd11b7f42..33bb0aba8c5f 100644 --- a/code/modules/admin/verbs/shuttlepanel.dm +++ b/code/modules/admin/verbs/shuttlepanel.dm @@ -1,5 +1,5 @@ /datum/admins/proc/open_shuttlepanel() - set category = "Event" + set category = "Event.Overmap" set name = "Shuttle Manipulator" set desc = "Opens the shuttle manipulator UI." diff --git a/code/modules/awaymissions/mission_code/Academy.dm b/code/modules/awaymissions/mission_code/Academy.dm index 850d0e91ba09..58c25bf0bf64 100644 --- a/code/modules/awaymissions/mission_code/Academy.dm +++ b/code/modules/awaymissions/mission_code/Academy.dm @@ -1,34 +1,3 @@ - -//Academy Areas - -/area/awaymission/academy - name = "Academy Asteroids" - icon_state = "away" - -/area/awaymission/academy/headmaster - name = "Academy Fore Block" - icon_state = "away1" - -/area/awaymission/academy/classrooms - name = "Academy Classroom Block" - icon_state = "away2" - -/area/awaymission/academy/academyaft - name = "Academy Ship Aft Block" - icon_state = "away3" - -/area/awaymission/academy/academygate - name = "Academy Gateway" - icon_state = "away4" - -/area/awaymission/academy/academycellar - name = "Academy Cellar" - icon_state = "away4" - -/area/awaymission/academy/academyengine - name = "Academy Engine" - icon_state = "away4" - //Academy Items /obj/item/paper/fluff/awaymissions/academy/console_maint diff --git a/code/modules/awaymissions/mission_code/Cabin.dm b/code/modules/awaymissions/mission_code/Cabin.dm index bfbb8bbf52ea..2e289579be1a 100644 --- a/code/modules/awaymissions/mission_code/Cabin.dm +++ b/code/modules/awaymissions/mission_code/Cabin.dm @@ -1,40 +1,3 @@ - -/*Cabin areas*/ -/area/awaymission/cabin - name = "Cabin" - icon_state = "away2" - requires_power = TRUE - dynamic_lighting = DYNAMIC_LIGHTING_ENABLED - -/area/awaymission/cabin/snowforest - name = "Snow Forest" - icon_state = "away" - dynamic_lighting = DYNAMIC_LIGHTING_DISABLED - -/area/awaymission/cabin/snowforest/sovietsurface - name = "Snow Forest" - icon_state = "awaycontent29" - requires_power = FALSE - -/area/awaymission/cabin/lumbermill - name = "Lumbermill" - icon_state = "away3" - requires_power = FALSE - dynamic_lighting = DYNAMIC_LIGHTING_DISABLED - -/area/awaymission/cabin/caves/sovietcave - name = "Soviet Bunker" - icon_state = "awaycontent4" - -/area/awaymission/cabin/caves - name = "North Snowdin Caves" - icon_state = "awaycontent15" - dynamic_lighting = DYNAMIC_LIGHTING_FORCED - -/area/awaymission/cabin/caves/mountain - name = "North Snowdin Mountains" - icon_state = "awaycontent24" - /obj/structure/firepit name = "firepit" desc = "Warm and toasty." diff --git a/code/modules/awaymissions/mission_code/caves.dm b/code/modules/awaymissions/mission_code/caves.dm index abaaceefd604..8ace0c86bb0c 100644 --- a/code/modules/awaymissions/mission_code/caves.dm +++ b/code/modules/awaymissions/mission_code/caves.dm @@ -1,33 +1,3 @@ -//Areas - -/area/awaymission/caves/BMP_asteroid - name = "\improper BMP Asteroid Level 1" - icon_state = "awaycontent1" - -/area/awaymission/caves/BMP_asteroid/level_two - name = "\improper BMP Asteroid Level 2" - icon_state = "awaycontent2" - -/area/awaymission/caves/BMP_asteroid/level_three - name = "\improper BMP Asteroid Level 3" - icon_state = "awaycontent3" - -/area/awaymission/caves/BMP_asteroid/level_four - name = "\improper BMP Asteroid Level 4" - icon_state = "awaycontent4" - -/area/awaymission/caves/research - name = "Research Outpost" - icon_state = "awaycontent5" - dynamic_lighting = DYNAMIC_LIGHTING_ENABLED - -/area/awaymission/caves/northblock //engineering, bridge (not really north but it doesnt really need its own APC) - -/area/awaymission/caves/listeningpost - name = "Listening Post" - icon_state = "awaycontent6" - requires_power = FALSE - //caves papers /obj/item/paper/crumpled/awaymissions/caves/unsafe_area diff --git a/code/modules/awaymissions/mission_code/centcomAway.dm b/code/modules/awaymissions/mission_code/centcomAway.dm index 60741701b4d8..7bcafb0d1345 100644 --- a/code/modules/awaymissions/mission_code/centcomAway.dm +++ b/code/modules/awaymissions/mission_code/centcomAway.dm @@ -1,39 +1,3 @@ -//centcomAway areas - -/area/awaymission/centcomAway - name = "XCC-P5831" - icon_state = "away" - requires_power = FALSE - -/area/awaymission/centcomAway/general - name = "XCC-P5831" - ambientsounds = list('sound/ambience/ambigen3.ogg') - -/area/awaymission/centcomAway/maint - name = "XCC-P5831 Maintenance" - icon_state = "away1" - ambientsounds = list('sound/ambience/ambisin1.ogg') - -/area/awaymission/centcomAway/thunderdome - name = "XCC-P5831 Thunderdome" - icon_state = "away2" - ambientsounds = list('sound/ambience/ambisin2.ogg') - -/area/awaymission/centcomAway/cafe - name = "XCC-P5831 Kitchen Arena" - icon_state = "away3" - ambientsounds = list('sound/ambience/ambisin3.ogg') - -/area/awaymission/centcomAway/courtroom - name = "XCC-P5831 Courtroom" - icon_state = "away4" - ambientsounds = list('sound/ambience/ambisin4.ogg') - -/area/awaymission/centcomAway/hangar - name = "XCC-P5831 Hangars" - icon_state = "away4" - ambientsounds = list('sound/ambience/ambigen5.ogg') - //centcomAway items /obj/item/paper/pamphlet/centcom/visitor_info diff --git a/code/modules/awaymissions/mission_code/challenge.dm b/code/modules/awaymissions/mission_code/challenge.dm index 6f8bb473b77a..9e8abe6356b6 100644 --- a/code/modules/awaymissions/mission_code/challenge.dm +++ b/code/modules/awaymissions/mission_code/challenge.dm @@ -1,20 +1,3 @@ -//Challenge Areas - -/area/awaymission/challenge/start - name = "Where Am I?" - icon_state = "away" - -/area/awaymission/challenge/main - name = "Danger Room" - icon_state = "away1" - requires_power = FALSE - -/area/awaymission/challenge/end - name = "Administration" - icon_state = "away2" - requires_power = FALSE - - /obj/machinery/power/emitter/energycannon name = "Energy Cannon" desc = "A heavy duty industrial laser." diff --git a/code/modules/awaymissions/mission_code/murderdome.dm b/code/modules/awaymissions/mission_code/murderdome.dm index 914a1f2828c7..10bb96c12baa 100644 --- a/code/modules/awaymissions/mission_code/murderdome.dm +++ b/code/modules/awaymissions/mission_code/murderdome.dm @@ -1,8 +1,3 @@ -/area/awaymission/vr/murderdome - name = "Murderdome" - icon_state = "awaycontent8" - pacifist = FALSE - /obj/structure/window/reinforced/fulltile/indestructable name = "robust window" flags_1 = PREVENT_CLICK_UNDER_1 | NODECONSTRUCT_1 diff --git a/code/modules/awaymissions/mission_code/research.dm b/code/modules/awaymissions/mission_code/research.dm index b3e4ff8b863b..de1a8c88e574 100644 --- a/code/modules/awaymissions/mission_code/research.dm +++ b/code/modules/awaymissions/mission_code/research.dm @@ -1,67 +1,3 @@ -//Research Base Areas//-- - -/area/awaymission/research - name = "Research Outpost" - icon_state = "away" - dynamic_lighting = DYNAMIC_LIGHTING_ENABLED - -/area/awaymission/research/interior - name = "Research Inside" - requires_power = TRUE - icon_state = "away2" - -/area/awaymission/research/interior/cryo - name = "Research Cryostasis Room" - icon_state = "medbay" - -/area/awaymission/research/interior/clonestorage - name = "Research Clone Storage" - icon_state = "cloning" - -/area/awaymission/research/interior/genetics - name = "Research Genetics Research" - icon_state = "genetics" - -/area/awaymission/research/interior/engineering - name = "Research Engineering" - icon_state = "engine" - -/area/awaymission/research/interior/security - name = "Research Security" - icon_state = "security" - -/area/awaymission/research/interior/secure - name = "Research Secure Vault" - -/area/awaymission/research/interior/maint - name = "Research Maintenance" - icon_state = "maintcentral" - -/area/awaymission/research/interior/dorm - name = "Research Dorms" - icon_state = "Sleep" - -/area/awaymission/research/interior/escapepods - name = "Research Escape Wing" - icon_state = "exit" - -/area/awaymission/research/interior/gateway - name = "Research Gateway" - icon_state = "start" - -/area/awaymission/research/interior/bathroom - name = "Research Bathrooms" - icon_state = "restrooms" - -/area/awaymission/research/interior/medbay - name = "Research Medbay" - icon_state = "medbay" - -/area/awaymission/research/exterior - name = "Research Exterior" - icon_state = "unknown" - - //research papers /obj/item/paper/crumpled/awaymissions/research/sensitive_info diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm index 210a5cec7a47..fcd10c7c48d1 100644 --- a/code/modules/awaymissions/mission_code/snowdin.dm +++ b/code/modules/awaymissions/mission_code/snowdin.dm @@ -1,134 +1,3 @@ -//Snow Valley Areas//-- - -/area/awaymission/snowdin - name = "Snowdin" - icon_state = "awaycontent1" - requires_power = FALSE - dynamic_lighting = DYNAMIC_LIGHTING_DISABLED - -/area/awaymission/snowdin/outside - name = "Snowdin Tundra Plains" - icon_state = "awaycontent25" - -/area/awaymission/snowdin/post - name = "Snowdin Outpost" - icon_state = "awaycontent2" - requires_power = TRUE - dynamic_lighting = DYNAMIC_LIGHTING_ENABLED - -/area/awaymission/snowdin/post/medbay - name = "Snowdin Outpost - Medbay" - icon_state = "awaycontent3" - -/area/awaymission/snowdin/post/secpost - name = "Snowdin Outpost - Security Checkpoint" - icon_state = "awaycontent4" - -/area/awaymission/snowdin/post/hydro - name = "Snowdin Outpost - Hydroponics" - icon_state = "awaycontent5" - -/area/awaymission/snowdin/post/messhall - name = "Snowdin Outpost - Mess Hall" - icon_state = "awaycontent6" - -/area/awaymission/snowdin/post/gateway - name = "Snowdin Outpost - Gateway" - icon_state = "awaycontent7" - -/area/awaymission/snowdin/post/dorm - name = "Snowdin Outpost - Dorms" - icon_state = "awaycontent8" - -/area/awaymission/snowdin/post/kitchen - name = "Snowdin Outpost - Kitchen" - icon_state = "awaycontent9" - -/area/awaymission/snowdin/post/engineering - name = "Snowdin Outpost - Engineering" - icon_state = "awaycontent10" - -/area/awaymission/snowdin/post/custodials - name = "Snowdin Outpost - Custodials" - icon_state = "awaycontent11" - -/area/awaymission/snowdin/post/research - name = "Snowdin Outpost - Research Area" - icon_state = "awaycontent12" - -/area/awaymission/snowdin/post/garage - name = "Snowdin Outpost - Garage" - icon_state = "awaycontent13" - -/area/awaymission/snowdin/post/minipost - name = "Snowdin Outpost - Recon Post" - icon_state = "awaycontent19" - -/area/awaymission/snowdin/post/mining_main - name = "Snowdin Outpost - Mining Post" - icon_state = "awaycontent21" - -/area/awaymission/snowdin/post/mining_main/mechbay - name = "Snowdin Outpost - Mining Post Mechbay" - icon_state = "awaycontent25" - -/area/awaymission/snowdin/post/mining_main/robotics - name = "Snowdin Outpost - Mining Post Robotics" - icon_state = "awaycontent26" - -/area/awaymission/snowdin/post/cavern1 - name = "Snowdin Outpost - Cavern Outpost 1" - icon_state = "awaycontent27" - -/area/awaymission/snowdin/post/cavern2 - name = "Snowdin Outpost - Cavern Outpost 2" - icon_state = "awaycontent28" - -/area/awaymission/snowdin/post/mining_dock - name = "Snowdin Outpost - Underground Mine Post" - icon_state = "awaycontent22" - -/area/awaymission/snowdin/post/broken_shuttle - name = "Snowdin Outpost - Broken Transit Shuttle" - icon_state = "awaycontent20" - requires_power = FALSE - -/area/awaymission/snowdin/igloo - name = "Snowdin Igloos" - icon_state = "awaycontent14" - dynamic_lighting = DYNAMIC_LIGHTING_FORCED - -/area/awaymission/snowdin/cave - name = "Snowdin Caves" - icon_state = "awaycontent15" - dynamic_lighting = DYNAMIC_LIGHTING_FORCED - -/area/awaymission/snowdin/cave/cavern - name = "Snowdin Depths" - icon_state = "awaycontent23" - -/area/awaymission/snowdin/cave/mountain - name = "Snowdin Mountains" - icon_state = "awaycontent24" - - -/area/awaymission/snowdin/base - name = "Snowdin Main Base" - icon_state = "awaycontent16" - dynamic_lighting = DYNAMIC_LIGHTING_ENABLED - requires_power = TRUE - -/area/awaymission/snowdin/dungeon1 - name = "Snowdin Depths" - icon_state = "awaycontent17" - dynamic_lighting = DYNAMIC_LIGHTING_ENABLED - -/area/awaymission/snowdin/sekret - name = "Snowdin Operations" - icon_state = "awaycontent18" - dynamic_lighting = DYNAMIC_LIGHTING_ENABLED - requires_power = TRUE - //liquid plasma!!!!!!// /turf/open/floor/plasteel/dark/snowdin diff --git a/code/modules/awaymissions/mission_code/spacebattle.dm b/code/modules/awaymissions/mission_code/spacebattle.dm index f0131d830cd0..9a63a6fdbfa9 100644 --- a/code/modules/awaymissions/mission_code/spacebattle.dm +++ b/code/modules/awaymissions/mission_code/spacebattle.dm @@ -1,46 +1,3 @@ -//Spacebattle Areas - -/area/awaymission/spacebattle - name = "Space Battle" - icon_state = "awaycontent1" - requires_power = FALSE - -/area/awaymission/spacebattle/cruiser - name = "\improper Nanotrasen Cruiser" - icon_state = "awaycontent2" - -/area/awaymission/spacebattle/syndicate1 - name = "Syndicate Assault Ship 1" - icon_state = "awaycontent3" - -/area/awaymission/spacebattle/syndicate2 - name = "Syndicate Assault Ship 2" - icon_state = "awaycontent4" - -/area/awaymission/spacebattle/syndicate3 - name = "Syndicate Assault Ship 3" - icon_state = "awaycontent5" - -/area/awaymission/spacebattle/syndicate4 - name = "Syndicate War Sphere 1" - icon_state = "awaycontent6" - -/area/awaymission/spacebattle/syndicate5 - name = "Syndicate War Sphere 2" - icon_state = "awaycontent7" - -/area/awaymission/spacebattle/syndicate6 - name = "Syndicate War Sphere 3" - icon_state = "awaycontent8" - -/area/awaymission/spacebattle/syndicate7 - name = "Syndicate Fighter" - icon_state = "awaycontent9" - -/area/awaymission/spacebattle/secret - name = "Hidden Chamber" - icon_state = "awaycontent10" - /mob/living/simple_animal/hostile/human/syndicate/ranged/spacebattle loot = list(/obj/effect/mob_spawn/human/corpse/syndicatesoldier, /obj/item/gun/ballistic/automatic/smg/cobra, diff --git a/code/modules/awaymissions/mission_code/undergroundoutpost45.dm b/code/modules/awaymissions/mission_code/undergroundoutpost45.dm deleted file mode 100644 index 415303202430..000000000000 --- a/code/modules/awaymissions/mission_code/undergroundoutpost45.dm +++ /dev/null @@ -1,39 +0,0 @@ -// undergroundoutpost45 - -//Areas -/area/awaymission/undergroundoutpost45 - name = "space" - icon_state = "awaycontent1" - -/area/awaymission/undergroundoutpost45/central - name = "UO45 Central Hall" - icon_state = "awaycontent2" - -/area/awaymission/undergroundoutpost45/crew_quarters - name = "UO45 Crew Quarters" - icon_state = "awaycontent3" - -/area/awaymission/undergroundoutpost45/engineering - name = "UO45 Engineering" - icon_state = "awaycontent4" - -/area/awaymission/undergroundoutpost45/mining - name = "UO45 Mining" - icon_state = "awaycontent5" - -/area/awaymission/undergroundoutpost45/research - name = "UO45 Research" - icon_state = "awaycontent6" - -/area/awaymission/undergroundoutpost45/gateway - name = "UO45 Gateway" - icon_state = "awaycontent7" - -/area/awaymission/undergroundoutpost45/caves - name = "UO45 Caves" - icon_state = "awaycontent8" - always_unpowered = TRUE - power_environ = FALSE - power_equip = FALSE - power_light = FALSE - poweralm = FALSE diff --git a/code/modules/cargo/blackmarket/blackmarket_items/consumables.dm b/code/modules/cargo/blackmarket/blackmarket_items/consumables.dm index 65a72290bf07..6e8c37e46813 100644 --- a/code/modules/cargo/blackmarket/blackmarket_items/consumables.dm +++ b/code/modules/cargo/blackmarket/blackmarket_items/consumables.dm @@ -76,12 +76,14 @@ availability_prob = 40 /datum/blackmarket_item/consumable/trickwine/spawn_item(loc) - var/trickwine = pick(list(/obj/item/reagent_containers/food/drinks/breakawayflask/vintage/ashwine, - /obj/item/reagent_containers/food/drinks/breakawayflask/vintage/icewine, - /obj/item/reagent_containers/food/drinks/breakawayflask/vintage/shockwine, - /obj/item/reagent_containers/food/drinks/breakawayflask/vintage/hearthwine, - /obj/item/reagent_containers/food/drinks/breakawayflask/vintage/forcewine, - /obj/item/reagent_containers/food/drinks/breakawayflask/vintage/prismwine)) + var/trickwine = pick(list( + /obj/item/reagent_containers/food/drinks/breakawayflask/vintage/ashwine, + /obj/item/reagent_containers/food/drinks/breakawayflask/vintage/icewine, + /obj/item/reagent_containers/food/drinks/breakawayflask/vintage/shockwine, + /obj/item/reagent_containers/food/drinks/breakawayflask/vintage/hearthwine, + /obj/item/reagent_containers/food/drinks/breakawayflask/vintage/forcewine, + /obj/item/reagent_containers/food/drinks/breakawayflask/vintage/prismwine + )) return new trickwine(loc) /datum/blackmarket_item/consumable/stimpack diff --git a/code/modules/cargo/bounties/assistant.dm b/code/modules/cargo/bounties/assistant.dm deleted file mode 100644 index 37507132a865..000000000000 --- a/code/modules/cargo/bounties/assistant.dm +++ /dev/null @@ -1,219 +0,0 @@ -/datum/bounty/item/assistant/strange_object - name = "Strange Object" - description = "Nanotrasen has taken an interest in strange objects. Find one in maint, and ship it off to CentCom right away." - reward = 1200 - wanted_types = list(/obj/item/relic) - -/datum/bounty/item/assistant/scooter - name = "Scooter" - description = "Nanotrasen has determined walking to be wasteful. Ship a scooter to CentCom to speed operations up." - reward = 1080 // the mat hoffman - wanted_types = list(/obj/vehicle/ridden/scooter) - include_subtypes = FALSE - -/datum/bounty/item/assistant/skateboard - name = "Skateboard" - description = "Nanotrasen has determined walking to be wasteful. Ship a skateboard to CentCom to speed operations up." - reward = 900 // the tony hawk - wanted_types = list(/obj/vehicle/ridden/scooter/skateboard, /obj/item/skateboard) - -/datum/bounty/item/assistant/stunprod - name = "Stunprod" - description = "CentCom demands a stunprod to use against dissidents. Craft one, then ship it." - reward = 1300 - wanted_types = list(/obj/item/melee/baton/cattleprod) - -/datum/bounty/item/assistant/soap - name = "Soap" - description = "Soap has gone missing from CentCom's bathrooms and nobody knows who took it. Replace it and be the hero CentCom needs." - reward = 2000 - required_count = 3 - wanted_types = list(/obj/item/soap) - -/datum/bounty/item/assistant/spear - name = "Spears" - description = "CentCom's security forces are going through budget cuts. You will be paid if you ship a set of spears." - reward = 2000 - required_count = 5 - wanted_types = list(/obj/item/melee/spear) - -/datum/bounty/item/assistant/toolbox - name = "Toolboxes" - description = "There's an absence of robustness at Central Command. Hurry up and ship some toolboxes as a solution." - reward = 2000 - required_count = 6 - wanted_types = list(/obj/item/storage/toolbox) - -/datum/bounty/item/assistant/statue - name = "Statue" - description = "Central Command would like to commision an artsy statue for the lobby. Ship one out, when possible." - reward = 2000 - wanted_types = list(/obj/structure/statue) - -/datum/bounty/item/assistant/clown_box - name = "Clown Box" - description = "The universe needs laughter. Stamp cardboard with a clown stamp and ship it out." - reward = 1500 - wanted_types = list(/obj/item/storage/box/clown) - -/datum/bounty/item/assistant/cheesiehonkers - name = "Cheesie Honkers" - description = "Apparently the company that makes Cheesie Honkers is going out of business soon. CentCom wants to stock up before it happens!" - reward = 1200 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/cheesiehonkers) - -/datum/bounty/item/assistant/baseball_bat - name = "Baseball Bat" - description = "Baseball fever is going on at CentCom! Be a dear and ship them some baseball bats, so that management can live out their childhood dream." - reward = 2000 - required_count = 5 - wanted_types = list(/obj/item/melee/baseball_bat) - -/datum/bounty/item/assistant/extendohand - name = "Extendo-Hand" - description = "Commander Betsy is getting old, and can't bend over to get the telescreen remote anymore. Management has requested an extendo-hand to help her out." - reward = 2500 - wanted_types = list(/obj/item/extendohand) - -/datum/bounty/item/assistant/donut - name = "Donuts" - description = "CentCom's security forces are facing heavy losses against the Syndicate. Ship donuts to raise morale." - reward = 3000 - required_count = 10 - wanted_types = list(/obj/item/reagent_containers/food/snacks/donut) - -/datum/bounty/item/assistant/donkpocket - name = "Donk-Pockets" - description = "Consumer safety recall: Warning. Donk-Pockets manufactured in the past year contain hazardous lizard biomatter. Return units to CentCom immediately." - reward = 3000 - required_count = 10 - wanted_types = list(/obj/item/reagent_containers/food/snacks/donkpocket) - -/datum/bounty/item/assistant/briefcase - name = "Briefcase" - description = "Central Command will be holding a business convention this year. Ship a few briefcases in support." - reward = 2500 - required_count = 5 - wanted_types = list(/obj/item/storage/briefcase, /obj/item/storage/secure/briefcase) - -/datum/bounty/item/assistant/sunglasses - name = "Sunglasses" - description = "A famous blues duo is passing through the sector, but they've lost their shades and they can't perform. Ship new sunglasses to CentCom to rectify this." - reward = 3000 - required_count = 2 - wanted_types = list(/obj/item/clothing/glasses/sunglasses) - -/datum/bounty/item/assistant/monkey_hide - name = "Monkey Hide" - description = "One of the scientists at CentCom is interested in testing products on monkey skin. Your mission is to acquire monkey's hide and ship it." - reward = 1500 - wanted_types = list(/obj/item/stack/sheet/animalhide/monkey) - -/datum/bounty/item/assistant/shard - name = "Shards" - description = "A killer clown has been stalking CentCom, and staff have been unable to catch her because she's not wearing shoes. Please ship some shards so that a booby trap can be constructed." - reward = 1500 - required_count = 15 - wanted_types = list(/obj/item/shard) - -/datum/bounty/item/assistant/comfy_chair - name = "Comfy Chairs" - description = "Commander Pat is unhappy with his chair. He claims it hurts his back. Ship some alternatives out to humor him." - reward = 1500 - required_count = 5 - wanted_types = list(/obj/structure/chair/comfy) - -/datum/bounty/item/assistant/geranium - name = "Geraniums" - description = "Commander Zot has the hots for Commander Zena. Send a shipment of geraniums - her favorite flower - and he'll happily reward you." - reward = 4000 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/poppy/geranium) - -/datum/bounty/item/assistant/poppy - name = "Poppies" - description = "Commander Zot really wants to sweep Security Officer Olivia off her feet. Send a shipment of Poppies - her favorite flower - and he'll happily reward you." - reward = 1000 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/poppy) - include_subtypes = FALSE - -/datum/bounty/item/assistant/potted_plants - name = "Potted Plants" - description = "Central Command is looking to commission a new BirdBoat-class station. You've been ordered to supply the potted plants." - reward = 2000 - required_count = 8 - wanted_types = list(/obj/item/kirbyplants) - -/datum/bounty/item/assistant/earmuffs - name = "Earmuffs" - description = "Central Command is getting tired of your station's messages. They've ordered that you ship some earmuffs to lessen the annoyance." - reward = 1000 - wanted_types = list(/obj/item/clothing/ears/earmuffs) - -/datum/bounty/item/assistant/handcuffs - name = "Handcuffs" - description = "A large influx of escaped convicts have arrived at Central Command. Now is the perfect time to ship out spare handcuffs (or restraints)." - reward = 1000 - required_count = 5 - wanted_types = list(/obj/item/restraints/handcuffs) - -/datum/bounty/item/assistant/monkey_cubes - name = "Monkey Cubes" - description = "Due to a recent genetics accident, Central Command is in serious need of monkeys. Your mission is to ship monkey cubes." - reward = 2000 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/monkeycube) - -/datum/bounty/item/assistant/chainsaw - name = "Chainsaw" - description = "The chef at CentCom is having trouble butchering her animals. She requests one chainsaw, please." - reward = 2500 - wanted_types = list(/obj/item/chainsaw) - -/datum/bounty/item/assistant/ied - name = "IED" - description = "Nanotrasen's maximum security prison at CentCom is undergoing personnel training. Ship a handful of IEDs to serve as a training tools." - reward = 2000 - required_count = 3 - wanted_types = list(/obj/item/grenade/iedcasing) - -/datum/bounty/item/assistant/bonfire - name = "Lit Bonfire" - description = "Space heaters are malfunctioning and the cargo crew of Central Command is starting to feel cold. Ship a lit bonfire to warm them up." - reward = 5000 - wanted_types = list(/obj/structure/bonfire) - -/datum/bounty/item/assistant/bonfire/applies_to(obj/O) - if(!..()) - return FALSE - var/obj/structure/bonfire/B = O - return !!B.burning - -/datum/bounty/item/assistant/corgimeat - name = "Raw Corgi Meat" - description = "The Syndicate recently stole all of CentCom's Corgi meat. Ship out a replacement immediately." - reward = 3000 - wanted_types = list(/obj/item/reagent_containers/food/snacks/meat/slab/corgi) - -/datum/bounty/item/assistant/corgifarming - name = "Corgi Hides" - description = "Admiral Weinstein's space yacht needs new upholstery. A dozen Corgi furs should do just fine." - reward = 30000 //that's a lot of dead dogs - required_count = 12 - wanted_types = list(/obj/item/stack/sheet/animalhide/corgi) - -/datum/bounty/item/assistant/action_figures - name = "Action Figures" - description = "The vice president's son saw an ad for action figures on the telescreen and now he won't shut up about them. Ship some to ease his complaints." - reward = 4000 - required_count = 5 - wanted_types = list(/obj/item/toy/figure) - -/datum/bounty/item/assistant/dead_mice - name = "Dead Mice" - description = "Station 14 ran out of freeze-dried mice. Ship some fresh ones so their janitor doesn't go on strike." - reward = 5000 - required_count = 5 - wanted_types = list(/obj/item/reagent_containers/food/snacks/deadmouse) diff --git a/code/modules/cargo/bounties/botany.dm b/code/modules/cargo/bounties/botany.dm deleted file mode 100644 index 183d601c61d8..000000000000 --- a/code/modules/cargo/bounties/botany.dm +++ /dev/null @@ -1,201 +0,0 @@ -/datum/bounty/item/botany - reward = 5000 - var/datum/bounty/item/botany/multiplier = 0 //adds bonus reward money; increased for higher tier or rare mutations - var/datum/bounty/item/botany/bonus_desc //for adding extra flavor text to bounty descriptions - var/datum/bounty/item/botany/foodtype = "meal" //same here - -/datum/bounty/item/botany/New() - ..() - description = "Central Command's head chef is looking to prepare a fine [foodtype] with [name]. [bonus_desc]" - reward += multiplier * 1000 - required_count = rand(5, 10) - -/datum/bounty/item/botany/ambrosia_vulgaris - name = "Ambrosia Vulgaris Leaves" - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/ambrosia/vulgaris) - foodtype = "stew" - -/datum/bounty/item/botany/ambrosia_gaia - name = "Ambrosia Gaia Leaves" - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/ambrosia/gaia) - multiplier = 4 - foodtype = "stew" - -/datum/bounty/item/botany/apple_golden - name = "Golden Apples" - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/apple/gold) - multiplier = 4 - foodtype = "dessert" - -/datum/bounty/item/botany/banana - name = "Bananas" - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/banana) - exclude_types = list(/obj/item/reagent_containers/food/snacks/grown/banana/bluespace) - foodtype = "banana split" - -/datum/bounty/item/botany/banana_bluespace - name = "Bluespace Bananas" - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/banana/bluespace) - multiplier = 2 - foodtype = "banana split" - -/datum/bounty/item/botany/beans_koi - name = "Koi Beans" - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/koibeans) - multiplier = 2 - -/datum/bounty/item/botany/berries_death - name = "Death Berries" - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/berries/death) - multiplier = 2 - bonus_desc = "He insists that \"he knows what he's doing\"." - foodtype = "sorbet" - -/datum/bounty/item/botany/berries_glow - name = "Glow-Berries" - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/berries/glow) - multiplier = 2 - foodtype = "sorbet" - -/datum/bounty/item/botany/cannabis - name = "Cannabis Leaves" - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/cannabis) - exclude_types = list(/obj/item/reagent_containers/food/snacks/grown/cannabis/white, /obj/item/reagent_containers/food/snacks/grown/cannabis/death, /obj/item/reagent_containers/food/snacks/grown/cannabis/ultimate) - multiplier = 4 //hush money - bonus_desc = "Do not mention this shipment to security." - foodtype = "batch of \"muffins\"" - -/datum/bounty/item/botany/cannabis_white - name = "Lifeweed Leaves" - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/cannabis/white) - multiplier = 6 - bonus_desc = "Do not mention this shipment to security." - foodtype = "\"meal\"" - -/datum/bounty/item/botany/cannabis_death - name = "Deathweed Leaves" - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/cannabis/death) - multiplier = 6 - bonus_desc = "Do not mention this shipment to security." - foodtype = "\"meal\"" - -/datum/bounty/item/botany/cannabis_ultimate - name = "Omega Weed Leaves" - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/cannabis/ultimate) - multiplier = 6 - bonus_desc = "Under no circumstances mention this shipment to security." - foodtype = "batch of \"brownies\"" - -/datum/bounty/item/botany/wheat - name = "Wheat Grains" - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/wheat) - -/datum/bounty/item/botany/rice - name = "Rice Grains" - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/rice) - -/datum/bounty/item/botany/chili - name = "Chili Peppers" - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/chili) - -/datum/bounty/item/botany/ice_chili - name = "Chilly Peppers" - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/icepepper) - multiplier = 2 - -/datum/bounty/item/botany/ghost_chili - name = "Ghost Chili Peppers" - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/ghost_chili) - multiplier = 2 - -/datum/bounty/item/botany/citrus_lime - name = "Limes" - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/citrus/lime) - foodtype = "sorbet" - -/datum/bounty/item/botany/citrus_lemon - name = "Lemons" - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/citrus/lemon) - foodtype = "sorbet" - -/datum/bounty/item/botany/citrus_oranges - name = "Oranges" - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/citrus/orange) - bonus_desc = "Do not ship lemons or limes." //I vanted orahnge! - foodtype = "sorbet" - -/datum/bounty/item/botany/eggplant - name = "Eggplants" - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/eggplant) - bonus_desc = "Not to be confused with egg-plants." - -/datum/bounty/item/botany/eggplant_eggy - name = "Egg-plants" - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/shell/eggy) - bonus_desc = "Not to be confused with eggplants." - multiplier = 2 - -/datum/bounty/item/botany/kudzu - name = "Kudzu Pods" - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/kudzupod) - bonus_desc = "Store in a dry, dark place." - multiplier = 4 - -/datum/bounty/item/botany/watermelon - name = "Watermelons" - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/watermelon) - foodtype = "dessert" - -/datum/bounty/item/botany/watermelon_holy - name = "Holy Melons" - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/holymelon) - multiplier = 2 - foodtype = "dessert" - -/datum/bounty/item/botany/glowshroom - name = "Glowshrooms" - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/mushroom/glowshroom) - exclude_types = list(/obj/item/reagent_containers/food/snacks/grown/mushroom/glowshroom/glowcap, /obj/item/reagent_containers/food/snacks/grown/mushroom/glowshroom/shadowshroom) - foodtype = "omelet" - -/datum/bounty/item/botany/glowshroom_cap - name = "Glowcaps" - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/mushroom/glowshroom/glowcap) - multiplier = 2 - foodtype = "omelet" - -/datum/bounty/item/botany/glowshroom_shadow - name = "Shadowshrooms" - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/mushroom/glowshroom/shadowshroom) - multiplier = 2 - foodtype = "omelet" - -/datum/bounty/item/botany/nettles_death - name = "Death Nettles" - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/nettle/death) - multiplier = 2 - bonus_desc = "Wear protection when handling them." - foodtype = "cheese" - -/datum/bounty/item/botany/pineapples - name = "Pineapples" - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/pineapple) - bonus_desc = "Not for human consumption." - foodtype = "ashtray" - -/datum/bounty/item/botany/tomato - name = "Tomatoes" - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/tomato) - exclude_types = list(/obj/item/reagent_containers/food/snacks/grown/tomato/blue) - -/datum/bounty/item/botany/tomato_bluespace - name = "Bluespace Tomatoes" - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/tomato/blue/bluespace) - multiplier = 4 - -/datum/bounty/item/botany/oatz - name = "Oats" - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/oat) - multiplier = 2 - foodtype = "batch of oatmeal" - bonus_desc = "Squats and oats. We're all out of oats." diff --git a/code/modules/cargo/bounties/chef.dm b/code/modules/cargo/bounties/chef.dm deleted file mode 100644 index 969a41601fbb..000000000000 --- a/code/modules/cargo/bounties/chef.dm +++ /dev/null @@ -1,138 +0,0 @@ -/datum/bounty/item/chef/birthday_cake - name = "Birthday Cake" - description = "Nanotrasen's birthday is coming up! Ship them a birthday cake to celebrate!" - reward = 4000 - wanted_types = list(/obj/item/food/cake/birthday, /obj/item/food/cakeslice/birthday) - -/datum/bounty/item/chef/soup - name = "Soup" - description = "To quell the homeless uprising, Nanotrasen will be serving soup to all underpaid workers. Ship any type of soup." - reward = 3000 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/soup) - -/datum/bounty/item/chef/popcorn - name = "Popcorn Bags" - description = "Upper management wants to host a movie night. Ship bags of popcorn for the occasion." - reward = 3000 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/popcorn) - -/datum/bounty/item/chef/onionrings - name = "Onion Rings" - description = "Nanotrasen is remembering Saturn day. Ship onion rings to show the station's support." - reward = 3000 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/onionrings) - -/datum/bounty/item/chef/icecreamsandwich - name = "Ice Cream Sandwiches" - description = "Upper management has been screaming non-stop for ice cream. Please send some." - reward = 4000 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/icecreamsandwich) - -/datum/bounty/item/chef/strawberryicecreamsandwich - name = " Strawberry Ice Cream Sandwiches" - description = "Upper management has been screaming non-stop for more flavourful ice cream. Please send some." - reward = 5000 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/strawberryicecreamsandwich) - -/datum/bounty/item/chef/bread - name = "Bread" - description = "Problems with central planning have led to bread prices skyrocketing. Ship some bread to ease tensions." - reward = 1000 - wanted_types = list(/obj/item/food/bread, /obj/item/food/breadslice, /obj/item/reagent_containers/food/snacks/bun, /obj/item/reagent_containers/food/snacks/pizzabread, /obj/item/reagent_containers/food/snacks/rawpastrybase) - -/datum/bounty/item/chef/pie - name = "Pie" - description = "3.14159? No! CentCom management wants edible pie! Ship a whole one." - reward = 3142 - wanted_types = list(/obj/item/reagent_containers/food/snacks/pie) - -/datum/bounty/item/chef/salad - name = "Salad or Rice Bowls" - description = "CentCom management is going on a health binge. Your order is to ship salad or rice bowls." - reward = 3000 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/salad) - -/datum/bounty/item/chef/carrotfries - name = "Carrot Fries" - description = "Night sight can mean life or death! A shipment of carrot fries is the order." - reward = 3500 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/carrotfries) - -/datum/bounty/item/chef/superbite - name = "Super Bite Burger" - description = "Commander Tubbs thinks he can set a competitive eating world record. All he needs is a super bite burger shipped to him." - reward = 12000 - wanted_types = list(/obj/item/reagent_containers/food/snacks/burger/superbite) - -/datum/bounty/item/chef/poppypretzel - name = "Poppy Pretzel" - description = "Central Command needs a reason to fire their HR head. Send over a poppy pretzel to force a failed drug test." - reward = 3000 - wanted_types = list(/obj/item/reagent_containers/food/snacks/poppypretzel) - -/datum/bounty/item/chef/cubancarp - name = "Cuban Carp" - description = "To celebrate the birth of Castro XXVII, ship one cuban carp to CentCom." - reward = 8000 - wanted_types = list(/obj/item/reagent_containers/food/snacks/cubancarp) - -/datum/bounty/item/chef/hotdog - name = "Hot Dog" - description = "Nanotrasen is conducting taste tests to determine the best hot dog recipe. Ship your station's version to participate." - reward = 8000 - wanted_types = list(/obj/item/reagent_containers/food/snacks/hotdog) - -/datum/bounty/item/chef/eggplantparm - name = "Eggplant Parmigianas" - description = "A famous singer will be arriving at CentCom, and their contract demands that they only be served Eggplant Parmigiana. Ship some, please!" - reward = 3500 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/eggplantparm) - -/datum/bounty/item/chef/muffin - name = "Muffins" - description = "The Muffin Man is visiting CentCom, but he's forgotten his muffins! Your order is to rectify this." - reward = 3000 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/muffin) - -/datum/bounty/item/chef/chawanmushi - name = "Chawanmushi" - description = "Nanotrasen wants to improve relations with its sister company, Japanotrasen. Ship Chawanmushi immediately." - reward = 8000 - wanted_types = list(/obj/item/reagent_containers/food/snacks/chawanmushi) - -/datum/bounty/item/chef/kebab - name = "Kebabs" - description = "Remove all kebab from station you are best food. Ship to CentCom to remove from the premises." - reward = 3500 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/kebab) - -/datum/bounty/item/chef/soylentgreen - name = "Soylent Green" - description = "CentCom has heard wonderful things about the product 'Soylent Green', and would love to try some. If you endulge them, expect a pleasant bonus." - reward = 5000 - wanted_types = list(/obj/item/reagent_containers/food/snacks/soylentgreen) - -/datum/bounty/item/chef/pancakes - name = "Pancakes" - description = "Here at Nanotrasen we consider employees to be family. And you know what families love? Pancakes. Ship a baker's dozen." - reward = 5000 - required_count = 13 - wanted_types = list(/obj/item/reagent_containers/food/snacks/pancakes) - -/datum/bounty/item/chef/nuggies - name = "Chicken Nuggets" - description = "The vice president's son won't shut up about chicken nuggies. Would you mind shipping some?" - reward = 4000 - required_count = 6 - wanted_types = list(/obj/item/reagent_containers/food/snacks/nugget) - diff --git a/code/modules/cargo/bounties/engineering.dm b/code/modules/cargo/bounties/engineering.dm deleted file mode 100644 index d4832a460fbc..000000000000 --- a/code/modules/cargo/bounties/engineering.dm +++ /dev/null @@ -1,40 +0,0 @@ -/datum/bounty/item/engineering/gas - name = "Full Tank of Pluoxium" - description = "CentCom RnD is researching extra compact internals. Ship us a tank full of Pluoxium and you'll be compensated." - reward = 7500 - wanted_types = list(/obj/item/tank) - var/moles_required = 20 // A full tank is 28 moles, but CentCom ignores that fact. - var/gas_type = GAS_PLUOXIUM - -/datum/bounty/item/engineering/gas/applies_to(obj/O) - if(!..()) - return FALSE - var/obj/item/tank/T = O - return T.air_contents.get_moles(gas_type) >= moles_required - -/datum/bounty/item/engineering/gas/nitryl_tank - name = "Full Tank of Nitryl" - description = "The non-human staff of Station 88 has been volunteered to test performance enhancing drugs. Ship them a tank full of Nitryl so they can get started." - gas_type = GAS_NITRYL - -/datum/bounty/item/engineering/gas/freon_tank - name = "Full Tank of Freon" - description = "The Supermatter of station 33 has started the delamination process. Deliver a tank of Freon gas to help them stop it!" - gas_type = GAS_FREON - -/datum/bounty/item/engineering/gas/tritium_tank - name = "Full Tank of Tritium" - description = "Station 49 is looking to kickstart their research program. Ship them a tank full of Tritium." - gas_type = GAS_TRITIUM - -/datum/bounty/item/engineering/energy_ball - name = "Contained Tesla Ball" - description = "Station 24 is being overrun by hordes of angry Mothpeople. They are requesting the ultimate bug zapper." - reward = 75000 //requires 14k credits of purchases, not to mention cooperation with engineering/heads of staff to set up inside the cramped shuttle - wanted_types = list(/obj/singularity/energy_ball) - -/datum/bounty/item/engineering/energy_ball/applies_to(obj/O) - if(!..()) - return FALSE - var/obj/singularity/energy_ball/T = O - return !T.miniball diff --git a/code/modules/cargo/bounties/item.dm b/code/modules/cargo/bounties/item.dm deleted file mode 100644 index b2586d7c5bad..000000000000 --- a/code/modules/cargo/bounties/item.dm +++ /dev/null @@ -1,39 +0,0 @@ -/datum/bounty/item - var/required_count = 1 - var/shipped_count = 0 - var/list/wanted_types // Types accepted for the bounty. - var/include_subtypes = TRUE // Set to FALSE to make the datum apply only to a strict type. - var/list/exclude_types // Types excluded. - -/datum/bounty/item/New() - ..() - wanted_types = typecacheof(wanted_types) - exclude_types = typecacheof(exclude_types) - -/datum/bounty/item/completion_string() - return {"[shipped_count]/[required_count]"} - -/datum/bounty/item/can_claim() - return ..() && shipped_count >= required_count - -/datum/bounty/item/applies_to(obj/O) - if(!include_subtypes && !(O.type in wanted_types)) - return FALSE - if(include_subtypes && (!is_type_in_typecache(O, wanted_types) || is_type_in_typecache(O, exclude_types))) - return FALSE - if(O.flags_1 & HOLOGRAM_1) - return FALSE - return shipped_count < required_count - -/datum/bounty/item/ship(obj/O) - if(!applies_to(O)) - return - if(istype(O,/obj/item/stack)) - var/obj/item/stack/O_is_a_stack = O - shipped_count += O_is_a_stack.amount - else - shipped_count += 1 - -/datum/bounty/item/compatible_with(datum/other_bounty) - return type != other_bounty.type - diff --git a/code/modules/cargo/bounties/mech.dm b/code/modules/cargo/bounties/mech.dm deleted file mode 100644 index 62c846ea96a3..000000000000 --- a/code/modules/cargo/bounties/mech.dm +++ /dev/null @@ -1,44 +0,0 @@ -/datum/bounty/item/mech/New() - ..() - description = "Upper management has requested one [name] mech be sent as soon as possible. Ship it to receive a large payment." - -/datum/bounty/item/mech/ship(obj/O) - if(!applies_to(O)) - return - if(istype(O, /obj/mecha)) - var/obj/mecha/M = O - M.wreckage = null // So the mech doesn't explode. - ..() - -/datum/bounty/item/mech/mark_high_priority(scale_reward) - return ..(max(scale_reward * 0.7, 1.2)) - -/datum/bounty/item/mech/ripleymkii - name = "APLU MK-II \"Ripley\"" - reward = 13000 - wanted_types = list(/obj/mecha/working/ripley/mkii) - -/datum/bounty/item/mech/firefighter - name = "APLU \"Firefighter\"" - reward = 18000 - wanted_types = list(/obj/mecha/working/ripley/firefighter) - -/datum/bounty/item/mech/odysseus - name = "Odysseus" - reward = 11000 - wanted_types = list(/obj/mecha/medical/odysseus) - -/datum/bounty/item/mech/gygax - name = "Gygax" - reward = 28000 - wanted_types = list(/obj/mecha/combat/gygax) - -/datum/bounty/item/mech/durand - name = "Durand" - reward = 20000 - wanted_types = list(/obj/mecha/combat/durand) - -/datum/bounty/item/mech/phazon - name = "Phazon" - reward = 50000 - wanted_types = list(/obj/mecha/combat/phazon) diff --git a/code/modules/cargo/bounties/medical.dm b/code/modules/cargo/bounties/medical.dm deleted file mode 100644 index c0bcb1bd6f69..000000000000 --- a/code/modules/cargo/bounties/medical.dm +++ /dev/null @@ -1,47 +0,0 @@ -/datum/bounty/item/medical/heart - name = "Heart" - description = "Commander Johnson is in critical condition after suffering yet another heart attack. Doctors say he needs a new heart fast. Ship one, pronto!" - reward = 3000 - wanted_types = list(/obj/item/organ/heart) - -/datum/bounty/item/medical/lung - name = "Lungs" - description = "A recent explosion at Central Command has left multiple staff with punctured lungs. Ship spare lungs to be rewarded." - reward = 10000 - required_count = 3 - wanted_types = list(/obj/item/organ/lungs) - -/datum/bounty/item/medical/appendix - name = "Appendix" - description = "Chef Gibb of Central Command wants to prepare a meal using a very special delicacy: an appendix. If you ship one, he'll pay." - reward = 5000 //there are no synthetic appendixes - wanted_types = list(/obj/item/organ/appendix) - -/datum/bounty/item/medical/ears - name = "Ears" - description = "Multiple staff at Station 12 have been left deaf due to unauthorized clowning. Ship them new ears." - reward = 10000 - required_count = 3 - wanted_types = list(/obj/item/organ/ears) - -/datum/bounty/item/medical/liver - name = "Livers" - description = "Multiple high-ranking CentCom diplomats have been hospitalized with liver failure after a recent meeting. Help us out, will you?" - reward = 10000 - required_count = 3 - wanted_types = list(/obj/item/organ/liver) - -/datum/bounty/item/medical/eye - name = "Organic Eyes" - description = "Station 5's Research Director Willem is requesting a few pairs of non-robotic eyes. Don't ask questions, just ship them." - reward = 10000 - required_count = 3 - wanted_types = list(/obj/item/organ/eyes) - exclude_types = list(/obj/item/organ/eyes/robotic) - -/datum/bounty/item/medical/tongue - name = "Tongues" - description = "A recent attack by Mime extremists has left staff at Station 23 speechless. Ship some spare tongues." - reward = 10000 - required_count = 3 - wanted_types = list(/obj/item/organ/tongue) diff --git a/code/modules/cargo/bounties/mining.dm b/code/modules/cargo/bounties/mining.dm deleted file mode 100644 index 6527228f31ec..000000000000 --- a/code/modules/cargo/bounties/mining.dm +++ /dev/null @@ -1,71 +0,0 @@ -/datum/bounty/item/mining/goliath_steaks - name = "Lava-Cooked Goliath Steaks" - description = "Admiral Pavlov has gone on hunger strike ever since the canteen started serving only monkey and monkey byproducts. She is demanding lava-cooked Goliath steaks." - reward = 5000 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/meat/steak/goliath) - -/datum/bounty/item/mining/goliath_boat - name = "Goliath Hide Boat" - description = "Commander Menkov wants to participate in the annual Lavaland Regatta. He is asking your shipwrights to build the swiftest boat known to man." - reward = 10000 - wanted_types = list(/obj/vehicle/ridden/lavaboat) - -/datum/bounty/item/mining/bone_oar - name = "Bone Oars" - description = "Commander Menkov requires oars to participate in the annual Lavaland Regatta. Ship a pair over." - reward = 4000 - required_count = 2 - wanted_types = list(/obj/item/oar) - -/datum/bounty/item/mining/bone_axe - name = "Bone Axe" - description = "Station 12 has had their fire axes stolen by marauding clowns. Ship them a bone axe as a replacement." - reward = 7500 - wanted_types = list(/obj/item/melee/axe/bone) - -/datum/bounty/item/mining/bone_armor - name = "Bone Armor" - description = "Station 14 has volunteered their lizard crew for ballistic armor testing. Ship over some bone armor." - reward = 5000 - wanted_types = list(/obj/item/clothing/suit/armor/bone) - -/datum/bounty/item/mining/skull_helmet - name = "Skull Helmet" - description = "Station 42's Head of Security has her birthday tomorrow! We want to suprise her with a fashionable skull helmet." - reward = 4000 - wanted_types = list(/obj/item/clothing/head/helmet/skull) - -/datum/bounty/item/mining/bone_talisman - name = "Bone Talismans" - description = "Station 14's Research Director claims that pagan bone talismans protect their wearer. Ship them a few so they can start testing." - reward = 7500 - required_count = 3 - wanted_types = list(/obj/item/clothing/accessory/bonearmlet) - -/datum/bounty/item/mining/bone_dagger - name = "Bone Daggers" - description = "Central Command's canteen is undergoing budget cuts. Ship over some bone daggers so our Chef can keep working." - reward = 5000 - required_count = 3 - wanted_types = list(/obj/item/melee/knife/bone) - -/datum/bounty/item/mining/polypore_mushroom - name = "Mushroom Bowl" - description = "Lieutenant Jeb dropped his favorite mushroom bowl. Cheer him up by shipping a new one, will you?" - reward = 7500 //5x mushroom shavings - wanted_types = list(/obj/item/reagent_containers/glass/bowl/mushroom_bowl) - -/datum/bounty/item/mining/inocybe_mushroom - name = "Mushroom Caps" - description = "Our botanist claims that he can distill tasty liquor from absolutely any plant. Let's see what he'll do with Inocybe mushroom caps." - reward = 4500 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_cap) - -/datum/bounty/item/mining/porcini_mushroom - name = "Mushroom Leaves" - description = "Porcini mushroom leaves are rumored to have healing properties. Our researchers want to put that claim to the test." - reward = 4500 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_leaf) diff --git a/code/modules/cargo/bounties/reagent.dm b/code/modules/cargo/bounties/reagent.dm deleted file mode 100644 index 0fcbbf4f1794..000000000000 --- a/code/modules/cargo/bounties/reagent.dm +++ /dev/null @@ -1,253 +0,0 @@ -/datum/bounty/reagent - var/required_volume = 10 - var/shipped_volume = 0 - var/datum/reagent/wanted_reagent - -/datum/bounty/reagent/completion_string() - return {"[round(shipped_volume)]/[required_volume] Units"} - -/datum/bounty/reagent/can_claim() - return ..() && shipped_volume >= required_volume - -/datum/bounty/reagent/applies_to(obj/O) - if(!istype(O, /obj/item/reagent_containers)) - return FALSE - if(!O.reagents || !O.reagents.has_reagent(wanted_reagent.type)) - return FALSE - if(O.flags_1 & HOLOGRAM_1) - return FALSE - return shipped_volume < required_volume - -/datum/bounty/reagent/ship(obj/O) - if(!applies_to(O)) - return - shipped_volume += O.reagents.get_reagent_amount(wanted_reagent.type) - if(shipped_volume > required_volume) - shipped_volume = required_volume - -/datum/bounty/reagent/compatible_with(other_bounty) - if(!istype(other_bounty, /datum/bounty/reagent)) - return TRUE - var/datum/bounty/reagent/R = other_bounty - return wanted_reagent.type != R.wanted_reagent.type - -/datum/bounty/reagent/simple_drink - name = "Simple Drink" - reward = 1500 - -/datum/bounty/reagent/simple_drink/New() - // Don't worry about making this comprehensive. It doesn't matter if some drinks are skipped. - var/static/list/possible_reagents = list(\ - /datum/reagent/consumable/ethanol/antifreeze,\ - /datum/reagent/consumable/ethanol/andalusia,\ - /datum/reagent/consumable/tea/arnold_palmer,\ - /datum/reagent/consumable/ethanol/b52,\ - /datum/reagent/consumable/ethanol/bananahonk,\ - /datum/reagent/consumable/ethanol/beepsky_smash,\ - /datum/reagent/consumable/ethanol/between_the_sheets,\ - /datum/reagent/consumable/ethanol/bilk,\ - /datum/reagent/consumable/ethanol/black_russian,\ - /datum/reagent/consumable/ethanol/bloody_mary,\ - /datum/reagent/consumable/ethanol/brave_bull,\ - /datum/reagent/consumable/ethanol/martini,\ - /datum/reagent/consumable/ethanol/cuba_libre,\ - /datum/reagent/consumable/ethanol/eggnog,\ - /datum/reagent/consumable/ethanol/erikasurprise,\ - /datum/reagent/consumable/ethanol/ginfizz,\ - /datum/reagent/consumable/ethanol/gintonic,\ - /datum/reagent/consumable/ethanol/grappa,\ - /datum/reagent/consumable/ethanol/grog,\ - /datum/reagent/consumable/ethanol/hooch,\ - /datum/reagent/consumable/ethanol/iced_beer,\ - /datum/reagent/consumable/ethanol/irishcarbomb,\ - /datum/reagent/consumable/ethanol/manhattan,\ - /datum/reagent/consumable/ethanol/margarita,\ - /datum/reagent/consumable/ethanol/gargle_blaster,\ - /datum/reagent/consumable/ethanol/rum_coke,\ - /datum/reagent/consumable/ethanol/screwdrivercocktail,\ - /datum/reagent/consumable/ethanol/snowwhite,\ - /datum/reagent/consumable/soy_latte,\ - /datum/reagent/consumable/cafe_latte,\ - /datum/reagent/consumable/ethanol/syndicatebomb,\ - /datum/reagent/consumable/ethanol/tequila_sunrise,\ - /datum/reagent/consumable/ethanol/manly_dorf,\ - /datum/reagent/consumable/ethanol/vimukti,\ - /datum/reagent/consumable/triple_citrus,\ - /datum/reagent/consumable/ethanol/vodkamartini,\ - /datum/reagent/consumable/ethanol/whiskeysoda,\ - /datum/reagent/consumable/ethanol/beer/green,\ - /datum/reagent/consumable/ethanol/demonsblood,\ - /datum/reagent/consumable/ethanol/crevice_spike,\ - /datum/reagent/consumable/ethanol/singulo,\ - /datum/reagent/consumable/ethanol/whiskey_sour) - - var/reagent_type = pick(possible_reagents) - wanted_reagent = new reagent_type - name = wanted_reagent.name - description = "CentCom is thirsty! Send a shipment of [name] to CentCom to quench the company's thirst." - reward += rand(0, 2) * 500 - -/datum/bounty/reagent/complex_drink - name = "Complex Drink" - reward = 4000 - -/datum/bounty/reagent/complex_drink/New() - // Don't worry about making this comprehensive. It doesn't matter if some drinks are skipped. - var/static/list/possible_reagents = list(\ - /datum/reagent/consumable/ethanol/atomicbomb,\ - /datum/reagent/consumable/ethanol/bacchus_blessing,\ - /datum/reagent/consumable/ethanol/bastion_bourbon,\ - /datum/reagent/consumable/ethanol/booger,\ - /datum/reagent/consumable/ethanol/hippies_delight,\ - /datum/reagent/consumable/ethanol/drunkenblumpkin,\ - /datum/reagent/consumable/ethanol/goldschlager,\ - /datum/reagent/consumable/ethanol/neurotoxin,\ - /datum/reagent/consumable/ethanol/patron,\ - /datum/reagent/consumable/ethanol/quadruple_sec,\ - /datum/reagent/consumable/bluecherryshake,\ - /datum/reagent/consumable/doctor_delight,\ - /datum/reagent/consumable/ethanol/silencer,\ - /datum/reagent/consumable/ethanol/peppermint_patty,\ - /datum/reagent/consumable/ethanol/aloe,\ - /datum/reagent/consumable/pumpkin_latte) - - var/reagent_type = pick(possible_reagents) - wanted_reagent = new reagent_type - name = wanted_reagent.name - description = "CentCom is offering a reward for talented mixologists. Ship a container of [name] to claim the prize." - reward += rand(0, 4) * 500 - -/datum/bounty/reagent/chemical_simple - name = "Simple Chemical" - reward = 4000 - required_volume = 30 - -/datum/bounty/reagent/chemical_simple/New() - // Chemicals that can be mixed by a single skilled Chemist. - var/static/list/possible_reagents = list(\ - /datum/reagent/medicine/leporazine,\ - /datum/reagent/medicine/clonexadone,\ - /datum/reagent/medicine/mine_salve,\ - /datum/reagent/medicine/perfluorodecalin,\ - /datum/reagent/medicine/ephedrine,\ - /datum/reagent/medicine/diphenhydramine,\ - /datum/reagent/drug/space_drugs,\ - /datum/reagent/drug/crank,\ - /datum/reagent/gunpowder,\ - /datum/reagent/napalm,\ - /datum/reagent/firefighting_foam,\ - /datum/reagent/consumable/mayonnaise,\ - /datum/reagent/toxin/itching_powder,\ - /datum/reagent/toxin/cyanide,\ - /datum/reagent/toxin/heparin,\ - /datum/reagent/medicine/pen_acid,\ - /datum/reagent/medicine/atropine,\ - /datum/reagent/drug/aranesp,\ - /datum/reagent/drug/krokodil,\ - /datum/reagent/drug/methamphetamine,\ - /datum/reagent/teslium,\ - /datum/reagent/toxin/anacea,\ - /datum/reagent/pax) - - var/reagent_type = pick(possible_reagents) - wanted_reagent = new reagent_type - name = wanted_reagent.name - description = "CentCom is in desperate need of the chemical [name]. Ship a container of it to be rewarded." - reward += rand(0, 4) * 500 //4000 to 6000 credits - -/datum/bounty/reagent/chemical_complex - name = "Rare Chemical" - reward = 6000 - required_volume = 20 - -/datum/bounty/reagent/chemical_complex/New() - // Reagents that require interaction with multiple departments or are a pain to mix. Lower required_volume since acquiring 30u of some is unrealistic - var/static/list/possible_reagents = list(\ - /datum/reagent/medicine/pyroxadone,\ - /datum/reagent/medicine/rezadone,\ - /datum/reagent/medicine/regen_jelly,\ - /datum/reagent/drug/bath_salts,\ - /datum/reagent/hair_dye,\ - /datum/reagent/consumable/honey,\ - /datum/reagent/consumable/frostoil,\ - /datum/reagent/toxin/slimejelly,\ - /datum/reagent/teslium/energized_jelly,\ - /datum/reagent/toxin/mimesbane,\ - /datum/reagent/medicine/strange_reagent,\ - /datum/reagent/nitroglycerin,\ - /datum/reagent/medicine/rezadone,\ - /datum/reagent/toxin/zombiepowder,\ - /datum/reagent/toxin/ghoulpowder,\ - /datum/reagent/mulligan) - - var/reagent_type = pick(possible_reagents) - wanted_reagent = new reagent_type - name = wanted_reagent.name - description = "CentCom is paying premium for the chemical [name]. Ship a container of it to be rewarded." - reward += rand(0, 5) * 750 //6000 to 9750 credits - -/datum/bounty/pill - /// quantity of the pills needed, this value acts as minimum, gets randomized on new() - var/required_ammount = 80 - /// counter for pills sent - var/shipped_ammount = 0 - /// reagent requested - var/datum/reagent/wanted_reagent - /// minimum volume of chemical needed, gets randomized on new() - var/wanted_vol = 30 - -/datum/bounty/pill/completion_string() - return {"[shipped_ammount]/[required_ammount] pills"} - -/datum/bounty/pill/can_claim() - return ..() && shipped_ammount >= required_ammount - -/datum/bounty/pill/applies_to(obj/O) - if(!istype(O, /obj/item/reagent_containers/pill)) - return FALSE - if(O?.reagents.get_reagent_amount(wanted_reagent.type) >= wanted_vol) - return TRUE - return FALSE - -/datum/bounty/pill/ship(obj/O) - if(!applies_to(O)) - return - shipped_ammount += 1 - if(shipped_ammount > required_ammount) - shipped_ammount = required_ammount - -/datum/bounty/pill/compatible_with(other_bounty) - if(!istype(other_bounty, /datum/bounty/pill/simple_pill)) - return TRUE - var/datum/bounty/pill/simple_pill/P = other_bounty - return (wanted_reagent.type == P.wanted_reagent.type) && (wanted_vol == P.wanted_vol) - -/datum/bounty/pill/simple_pill - name = "Simple Pill" - reward = 10000 - -/datum/bounty/pill/simple_pill/New() - //reagent that are possible to be chem factory'd - var/static/list/possible_reagents = list(\ - /datum/reagent/medicine/spaceacillin,\ - /datum/reagent/medicine/synthflesh,\ - /datum/reagent/medicine/pen_acid,\ - /datum/reagent/medicine/atropine,\ - /datum/reagent/medicine/cryoxadone,\ - /datum/reagent/medicine/salbutamol,\ - /datum/reagent/drug/methamphetamine,\ - /datum/reagent/drug/crank,\ - /datum/reagent/nitrous_oxide,\ - /datum/reagent/barbers_aid,\ - /datum/reagent/pax,\ - /datum/reagent/flash_powder,\ - /datum/reagent/phlogiston,\ - /datum/reagent/firefighting_foam) - - var/datum/reagent/reagent_type = pick(possible_reagents) - wanted_reagent = new reagent_type - name = "[wanted_reagent.name] pills" - required_ammount += rand(1,60) - wanted_vol += rand(1,20) - description = "CentCom requires [required_ammount] of [name] containing at least [wanted_vol] each. Ship a container of it to be rewarded." - reward += rand(1, 5) * 3000 diff --git a/code/modules/cargo/bounties/science.dm b/code/modules/cargo/bounties/science.dm deleted file mode 100644 index 0849efb6ede4..000000000000 --- a/code/modules/cargo/bounties/science.dm +++ /dev/null @@ -1,66 +0,0 @@ -/datum/bounty/item/science/boh - name = "Bag of Holding" - description = "Nanotrasen would make good use of high-capacity backpacks. If you have any, please ship them." - reward = 10000 - wanted_types = list(/obj/item/storage/backpack/holding) - -/datum/bounty/item/science/tboh - name = "Trash Bag of Holding" - description = "Nanotrasen would make good use of high-capacity trash bags. If you have any, please ship them." - reward = 10000 - wanted_types = list(/obj/item/storage/bag/trash/bluespace) - -/datum/bounty/item/science/bluespace_syringe - name = "Bluespace Syringe" - description = "Nanotrasen would make good use of high-capacity syringes. If you have any, please ship them." - reward = 10000 - wanted_types = list(/obj/item/reagent_containers/syringe/bluespace) - -/datum/bounty/item/science/bluespace_body_bag - name = "Bluespace Body Bag" - description = "Nanotrasen would make good use of high-capacity body bags. If you have any, please ship them." - reward = 10000 - wanted_types = list(/obj/item/bodybag/bluespace) - -/datum/bounty/item/science/nightvision_goggles - name = "Night Vision Goggles" - description = "An electrical storm has busted all the lights at CentCom. While management is waiting for replacements, perhaps some night vision goggles can be shipped?" - reward = 10000 - wanted_types = list(/obj/item/clothing/glasses/night, /obj/item/clothing/glasses/meson/night, /obj/item/clothing/glasses/hud/health/night, /obj/item/clothing/glasses/hud/security/night, /obj/item/clothing/glasses/hud/diagnostic/night) - -/datum/bounty/item/science/experimental_welding_tool - name = "Experimental Welding Tool" - description = "A recent accident has left most of CentCom's welding tools exploded. Ship replacements to be rewarded." - reward = 10000 - required_count = 3 - wanted_types = list(/obj/item/weldingtool/experimental) - -/datum/bounty/item/science/cryostasis_beaker - name = "Cryostasis Beaker" - description = "Chemists at Central Command have discovered a new chemical that can only be held in cryostasis beakers. The only problem is they don't have any! Rectify this to receive payment." - reward = 10000 - wanted_types = list(/obj/item/reagent_containers/glass/beaker/noreact) - -/datum/bounty/item/science/diamond_drill - name = "Diamond Mining Drill" - description = "Central Command is willing to pay three months salary in exchange for one diamond mining drill." - reward = 15000 - wanted_types = list(/obj/item/pickaxe/drill/diamonddrill, /obj/item/mecha_parts/mecha_equipment/drill/diamonddrill) - -/datum/bounty/item/science/floor_buffer - name = "Floor Buffer Upgrade" - description = "One of CentCom's janitors made a small fortune betting on carp races. Now they'd like to commission an upgrade to their floor buffer." - reward = 10000 - wanted_types = list(/obj/item/janiupgrade) - -/datum/bounty/item/science/advanced_mop - name = "Advanced Mop" - description = "Excuse me. I'd like to request 17 cr for a push broom rebristling. Either that, or an advanced mop." - reward = 10000 - wanted_types = list(/obj/item/mop/advanced) - -/datum/bounty/item/science/advanced_egun - name = "Advanced Energy Gun" - description = "With the price of rechargers on the rise, upper management is interested in purchasing guns that are self-powered. If you ship one, they'll pay." - reward = 10000 - wanted_types = list(/obj/item/gun/energy/e_gun/nuclear) diff --git a/code/modules/cargo/bounties/security.dm b/code/modules/cargo/bounties/security.dm deleted file mode 100644 index 26711f560922..000000000000 --- a/code/modules/cargo/bounties/security.dm +++ /dev/null @@ -1,13 +0,0 @@ -/datum/bounty/item/security/riotshotgun - name = "Riot Shotguns" - description = "Hooligans have boarded CentCom! Ship riot shotguns quick, or things are going to get dirty." - reward = 5000 - required_count = 2 - wanted_types = list(/obj/item/gun/ballistic/shotgun/hellfire) - -/datum/bounty/item/security/recharger - name = "Rechargers" - description = "Nanotrasen military academy is conducting marksmanship exercises. They request that rechargers be shipped." - reward = 2000 - required_count = 3 - wanted_types = list(/obj/machinery/recharger) diff --git a/code/modules/cargo/bounties/special.dm b/code/modules/cargo/bounties/special.dm deleted file mode 100644 index fa581504ca89..000000000000 --- a/code/modules/cargo/bounties/special.dm +++ /dev/null @@ -1,55 +0,0 @@ -/datum/bounty/item/alien_organs - name = "Alien Organs" - description = "Nanotrasen is interested in studying Xenomorph biology. Ship a set of organs to be thoroughly compensated." - reward = 25000 - required_count = 3 - wanted_types = list(/obj/item/organ/brain/alien, /obj/item/organ/alien, /obj/item/organ/body_egg/alien_embryo, /obj/item/organ/liver/alien, /obj/item/organ/tongue/alien, /obj/item/organ/eyes/night_vision/alien) - -/datum/bounty/item/syndicate_documents - name = "Syndicate Documents" - description = "Intel regarding the syndicate is highly prized at CentCom. If you find syndicate documents, ship them. You could save lives." - reward = 15000 - wanted_types = list(/obj/item/documents/syndicate, /obj/item/documents/photocopy) - -/datum/bounty/item/syndicate_documents/applies_to(obj/O) - if(!..()) - return FALSE - if(istype(O, /obj/item/documents/photocopy)) - var/obj/item/documents/photocopy/Copy = O - return (Copy.copy_type && ispath(Copy.copy_type, /obj/item/documents/syndicate)) - return TRUE - -/datum/bounty/item/hellstone - name = "Hellstone" - description = "Nanotrasen's anomalous materials division is in desparate need for Hellstone. Send them a large shipment and we'll make it worth your while." - reward = 35000 - required_count = 10 - wanted_types = list(/obj/item/stack/sheet/mineral/hidden/hellstone) - -/datum/bounty/item/trash - name = "Trash" - description = "Recently a group of janitors have run out of trash to clean up, without any trash CentCom wants to fire them to cut costs. Send a shipment of trash to keep them employed, and they'll give you a small compensation." - reward = 1000 - required_count = 10 - wanted_types = list(/obj/item/trash) - -/datum/bounty/more_bounties - name = "More Bounties" - description = "Complete enough bounties and CentCom will issue new ones!" - reward = 5 // number of bounties - var/required_bounties = 5 - -/datum/bounty/more_bounties/can_claim() - return ..() && completed_bounty_count() >= required_bounties - -/datum/bounty/more_bounties/completion_string() - return "[min(required_bounties, completed_bounty_count())]/[required_bounties] Bounties" - -/datum/bounty/more_bounties/reward_string() - return "Up to [reward] new bounties" - -/datum/bounty/more_bounties/claim() - if(can_claim()) - claimed = TRUE - for(var/i = 0; i < reward; ++i) - try_add_bounty(random_bounty()) diff --git a/code/modules/cargo/bounties/virus.dm b/code/modules/cargo/bounties/virus.dm deleted file mode 100644 index 8f078a2668bd..000000000000 --- a/code/modules/cargo/bounties/virus.dm +++ /dev/null @@ -1,81 +0,0 @@ -/datum/bounty/virus - reward = 5000 - var/shipped = FALSE - var/stat_value = 0 - var/stat_name = "" - -/datum/bounty/virus/New() - ..() - stat_value = rand(4, 11) - if(rand(3) == 1) - stat_value *= -1 - name = "Virus ([stat_name] of [stat_value])" - description = "Nanotrasen is interested in a virus with a [stat_name] stat of exactly [stat_value]. Central Command will pay handsomely for such a virus." - reward += rand(0, 4) * 500 - -/datum/bounty/virus/completion_string() - return shipped ? "Shipped" : "Not Shipped" - -/datum/bounty/virus/can_claim() - return ..() && shipped - -/datum/bounty/virus/applies_to(obj/O) - if(shipped) - return FALSE - if(O.flags_1 & HOLOGRAM_1) - return FALSE - if(!istype(O, /obj/item/reagent_containers || !O.reagents || !O.reagents.reagent_list)) - return FALSE - var/datum/reagent/blood/B = locate() in O.reagents.reagent_list - if(!B) - return FALSE - for(var/V in B.get_diseases()) - if(!istype(V, /datum/disease/advance)) - continue - if(accepts_virus(V)) - return TRUE - return FALSE - -/datum/bounty/virus/ship(obj/O) - if(!applies_to(O)) - return - shipped = TRUE - -/datum/bounty/virus/compatible_with(datum/other_bounty) - if(!istype(other_bounty, /datum/bounty/virus)) - return TRUE - var/datum/bounty/virus/V = other_bounty - return type != V.type || stat_value != V.stat_value - - -/datum/bounty/virus/proc/accepts_virus(V) - return TRUE - -/datum/bounty/virus/resistance - stat_name = "resistance" - -/datum/bounty/virus/resistance/accepts_virus(V) - var/datum/disease/advance/A = V - return A.totalResistance() == stat_value - -/datum/bounty/virus/stage_speed - stat_name = "stage speed" - -/datum/bounty/virus/stage_speed/accepts_virus(V) - var/datum/disease/advance/A = V - return A.totalStageSpeed() == stat_value - -/datum/bounty/virus/stealth - stat_name = "stealth" - -/datum/bounty/virus/stealth/accepts_virus(V) - var/datum/disease/advance/A = V - return A.totalStealth() == stat_value - -/datum/bounty/virus/transmit - stat_name = "transmissible" - -/datum/bounty/virus/transmit/accepts_virus(V) - var/datum/disease/advance/A = V - return A.totalTransmittable() == stat_value - diff --git a/code/modules/cargo/bounty.dm b/code/modules/cargo/bounty.dm deleted file mode 100644 index 96d5218e551e..000000000000 --- a/code/modules/cargo/bounty.dm +++ /dev/null @@ -1,176 +0,0 @@ -GLOBAL_LIST_EMPTY(bounties_list) - -/datum/bounty - var/name - var/description - var/reward = 1000 // In credits. - var/claimed = FALSE - var/high_priority = FALSE - -// Displayed on bounty UI screen. -/datum/bounty/proc/completion_string() - return "" - -// Displayed on bounty UI screen. -/datum/bounty/proc/reward_string() - return "[reward] Credits" - -/datum/bounty/proc/can_claim() - return !claimed - -// Called when the claim button is clicked. Override to provide fancy rewards. -/datum/bounty/proc/claim(datum/bank_account/claimer_account) - if(can_claim() && claimer_account) - claimer_account.adjust_money(reward, "bounty") - claimed = TRUE - -// If an item sent in the cargo shuttle can satisfy the bounty. -/datum/bounty/proc/applies_to(obj/O) - return FALSE - -// Called when an object is shipped on the cargo shuttle. -/datum/bounty/proc/ship(obj/O) - return - -// When randomly generating the bounty list, duplicate bounties must be avoided. -// This proc is used to determine if two bounties are duplicates, or incompatible in general. -/datum/bounty/proc/compatible_with(other_bounty) - return TRUE - -/datum/bounty/proc/mark_high_priority(scale_reward = 2) - if(high_priority) - return - high_priority = TRUE - reward = round(reward * scale_reward) - -// This proc is called when the shuttle docks at CentCom. -// It handles items shipped for bounties. -/proc/bounty_ship_item_and_contents(atom/movable/AM, dry_run=FALSE) - if(!GLOB.bounties_list.len) - setup_bounties() - - var/list/matched_one = FALSE - for(var/thing in reverseRange(AM.GetAllContents())) - var/matched_this = FALSE - for(var/datum/bounty/B in GLOB.bounties_list) - if(B.applies_to(thing)) - matched_one = TRUE - matched_this = TRUE - if(!dry_run) - B.ship(thing) - if(!dry_run && matched_this) - qdel(thing) - return matched_one - -// Returns FALSE if the bounty is incompatible with the current bounties. -/proc/try_add_bounty(datum/bounty/new_bounty) - if(!new_bounty || !new_bounty.name || !new_bounty.description) - return FALSE - for(var/i in GLOB.bounties_list) - var/datum/bounty/B = i - if(!B.compatible_with(new_bounty) || !new_bounty.compatible_with(B)) - return FALSE - GLOB.bounties_list += new_bounty - return TRUE - -// Returns a new bounty of random type, but does not add it to GLOB.bounties_list. -/proc/random_bounty() - switch(rand(1, 12)) - if(1) - var/subtype = pick(subtypesof(/datum/bounty/item/assistant)) - return new subtype - if(2) - var/subtype = pick(subtypesof(/datum/bounty/item/mech)) - return new subtype - if(3) - var/subtype = pick(subtypesof(/datum/bounty/item/chef)) - return new subtype - if(4) - var/subtype = pick(subtypesof(/datum/bounty/item/security)) - return new subtype - if(5) - if(rand(2) == 1) - return new /datum/bounty/reagent/simple_drink - return new /datum/bounty/reagent/complex_drink - if(6) - if(rand(2) == 1) - return new /datum/bounty/reagent/chemical_simple - return new /datum/bounty/reagent/chemical_complex - if(7) - var/subtype = pick(subtypesof(/datum/bounty/virus)) - return new subtype - if(8) - var/subtype = pick(subtypesof(/datum/bounty/item/science)) - return new subtype - if(9) - var/subtype = pick(subtypesof(/datum/bounty/item/engineering)) - return new subtype - if(10) - var/subtype = pick(subtypesof(/datum/bounty/item/mining)) - return new subtype - if(11) - var/subtype = pick(subtypesof(/datum/bounty/item/medical)) - return new subtype - if(12) - var/subtype = pick(subtypesof(/datum/bounty/item/botany)) - return new subtype - -// Called lazily at startup to populate GLOB.bounties_list with random bounties. -/proc/setup_bounties() - - var/pick // instead of creating it a bunch let's go ahead and toss it here, we know we're going to use it for dynamics and subtypes! - - /********************************Subtype Gens********************************/ - var/list/easy_add_list_subtypes = list(/datum/bounty/item/assistant = 2, - /datum/bounty/item/mech = 1, - /datum/bounty/item/chef = 2, - /datum/bounty/item/security = 1, - /datum/bounty/virus = 1, - /datum/bounty/item/engineering = 1, - /datum/bounty/item/mining = 2, - /datum/bounty/item/medical = 2, - /datum/bounty/item/botany = 2) - - for(var/the_type in easy_add_list_subtypes) - for(var/i in 1 to easy_add_list_subtypes[the_type]) - pick = pick(subtypesof(the_type)) - try_add_bounty(new pick) - - /********************************Strict Type Gens********************************/ - var/list/easy_add_list_strict_types = list(/datum/bounty/reagent/simple_drink = 1, - /datum/bounty/reagent/complex_drink = 1, - /datum/bounty/reagent/chemical_simple = 1, - /datum/bounty/reagent/chemical_complex = 1, - /datum/bounty/pill/simple_pill = 1) - - for(var/the_strict_type in easy_add_list_strict_types) - for(var/i in 1 to easy_add_list_strict_types[the_strict_type]) - try_add_bounty(new the_strict_type) - - /********************************Dynamic Gens********************************/ - - for(var/i in 0 to 1) - pick = pick(subtypesof(/datum/bounty/item/science)) - try_add_bounty(new pick) - - /********************************Cutoff for Non-Low Priority Bounties********************************/ - var/datum/bounty/B = pick(GLOB.bounties_list) - B.mark_high_priority() - - /********************************Low Priority Gens********************************/ - var/list/low_priority_strict_type_list = list( /datum/bounty/item/alien_organs, - /datum/bounty/item/syndicate_documents, - /datum/bounty/item/hellstone, - /datum/bounty/item/trash, - /datum/bounty/more_bounties) - - for(var/low_priority_bounty in low_priority_strict_type_list) - try_add_bounty(new low_priority_bounty) - -/proc/completed_bounty_count() - var/count = 0 - for(var/i in GLOB.bounties_list) - var/datum/bounty/B = i - if(B.claimed) - ++count - return count diff --git a/code/modules/cargo/bounty_console.dm b/code/modules/cargo/bounty_console.dm deleted file mode 100644 index f8017122b040..000000000000 --- a/code/modules/cargo/bounty_console.dm +++ /dev/null @@ -1,69 +0,0 @@ -#define PRINTER_TIMEOUT 10 - -/obj/machinery/computer/bounty - name = "\improper Nanotrasen bounty console" - desc = "Used to check and claim bounties offered by Nanotrasen" - icon_screen = "bounty" - circuit = /obj/item/circuitboard/computer/bounty - light_color = COLOR_BRIGHT_ORANGE - COOLDOWN_DECLARE(printer_ready) - var/datum/bank_account/cargocash - -/obj/machinery/computer/bounty/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock) - . = ..() - cargocash = port.current_ship.ship_account - -/obj/machinery/computer/bounty/Initialize() - . = ..() - COOLDOWN_START(src, printer_ready, PRINTER_TIMEOUT) - -/obj/machinery/computer/bounty/proc/print_paper() - new /obj/item/paper/bounty_printout(loc) - -/obj/item/paper/bounty_printout - name = "paper - Bounties" - -/obj/item/paper/bounty_printout/Initialize() - . = ..() - default_raw_text = "

Nanotrasen Cargo Bounties


" - update_appearance() - - for(var/datum/bounty/bounty as anything in GLOB.bounties_list) - if(bounty.claimed) - continue - add_raw_text({"

[bounty.name]

- "}) - -/obj/machinery/computer/bounty/ui_interact(mob/user, datum/tgui/ui) - if(!length(GLOB.bounties_list)) - setup_bounties() - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "CargoBountyConsole", name) - ui.open() - -/obj/machinery/computer/bounty/ui_data(mob/user) - var/list/data = list() - var/list/bountyinfo = list() - for(var/datum/bounty/bounty as anything in GLOB.bounties_list) //This should probably be static data. - bountyinfo += list(list("name" = bounty.name, "description" = bounty.description, "reward_string" = bounty.reward_string(), "completion_string" = bounty.completion_string() , "claimed" = bounty.claimed, "can_claim" = bounty.can_claim(), "priority" = bounty.high_priority, "bounty_ref" = REF(bounty))) - data["stored_cash"] = cargocash?.account_balance - data["bountydata"] = bountyinfo - return data - -/obj/machinery/computer/bounty/ui_act(action,params) - . = ..() - if(.) - return - switch(action) - if("ClaimBounty") - var/datum/bounty/cashmoney = locate(params["bounty"]) in GLOB.bounties_list - if(cashmoney) - cashmoney.claim(cargocash) - return TRUE - if("Print") - if(COOLDOWN_FINISHED(src, printer_ready)) - COOLDOWN_START(src, printer_ready, PRINTER_TIMEOUT) - print_paper() - return TRUE diff --git a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm index 82fd2c11d01a..8910dda5db8c 100644 --- a/code/modules/cargo/console.dm +++ b/code/modules/cargo/console.dm @@ -98,8 +98,6 @@ outpost_docked = istype(ship.docked_to, /datum/overmap/outpost) data["onShip"] = !isnull(ship) - data["numMissions"] = ship ? LAZYLEN(ship.missions) : 0 - data["maxMissions"] = ship ? ship.max_missions : 0 data["outpostDocked"] = outpost_docked data["points"] = charge_account ? charge_account.account_balance : 0 data["siliconUser"] = user.has_unlimited_silicon_privilege && check_ship_ai_access(user) @@ -127,17 +125,6 @@ if (cooldown > 0)//cooldown used for printing beacons cooldown-- - data["shipMissions"] = list() - data["outpostMissions"] = list() - - if(ship) - for(var/datum/mission/M as anything in ship.missions) - data["shipMissions"] += list(M.get_tgui_info()) - if(outpost_docked) - var/datum/overmap/outpost/out = ship.docked_to - for(var/datum/mission/M as anything in out.missions) - data["outpostMissions"] += list(M.get_tgui_info()) - return data /obj/machinery/computer/cargo/ui_static_data(mob/user) @@ -240,25 +227,6 @@ update_appearance() // ?????????????????? return TRUE - if("mission-act") - var/datum/mission/mission = locate(params["ref"]) - var/obj/docking_port/mobile/D = SSshuttle.get_containing_shuttle(src) - var/datum/overmap/ship/controlled/ship = D.current_ship - var/datum/overmap/outpost/outpost = ship.docked_to - if(!istype(outpost) || mission.source_outpost != outpost) // important to check these to prevent href fuckery - return - if(!mission.accepted) - if(LAZYLEN(ship.missions) >= ship.max_missions) - return - mission.accept(ship, loc) - return TRUE - else if(mission.servant == ship) - if(mission.can_complete()) - mission.turn_in() - else - mission.give_up() - return TRUE - /obj/machinery/computer/cargo/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock) . = ..() reconnect(port) diff --git a/code/modules/cargo/export_scanner.dm b/code/modules/cargo/export_scanner.dm index 5ce0ff892142..275dc164ca13 100644 --- a/code/modules/cargo/export_scanner.dm +++ b/code/modules/cargo/export_scanner.dm @@ -1,6 +1,6 @@ /obj/item/export_scanner name = "export scanner" - desc = "A device used to check objects against Nanotrasen exports and bounty database." + desc = "A device used to check objects against exports and bounty database." icon = 'icons/obj/device.dmi' icon_state = "export_scanner" item_state = "radio" @@ -27,5 +27,3 @@ to_chat(user, "Scanned [O], value: [price] credits[O.contents.len ? " (contents included)" : ""].") else to_chat(user, "Scanned [O], no export value.") - if(bounty_ship_item_and_contents(O, dry_run=TRUE)) - to_chat(user, "Scanned item is eligible for one or more bounties.") diff --git a/code/modules/events/high_priority_bounty.dm b/code/modules/events/high_priority_bounty.dm index ffdcd8840b7e..f5f3253df756 100644 --- a/code/modules/events/high_priority_bounty.dm +++ b/code/modules/events/high_priority_bounty.dm @@ -1,3 +1,4 @@ +/* /datum/round_event_control/high_priority_bounty name = "High Priority Bounty" typepath = /datum/round_event/high_priority_bounty @@ -17,4 +18,4 @@ B.mark_high_priority(3) if(try_add_bounty(B)) break - +*/ diff --git a/code/modules/hydroponics/fermenting_barrel.dm b/code/modules/hydroponics/fermenting_barrel.dm index 6f1b40b3dc9d..24f0481f5ebd 100644 --- a/code/modules/hydroponics/fermenting_barrel.dm +++ b/code/modules/hydroponics/fermenting_barrel.dm @@ -77,15 +77,33 @@ return ..() /obj/structure/fermenting_barrel/gunpowder - name = "Gunpowder Barrel" + name = "gunpowder barrel" desc = "A wooden barrel packed with gunpowder. You should probably keep this away from sparks or open fires." /obj/structure/fermenting_barrel/gunpowder/Initialize() . = ..() reagents.add_reagent(/datum/reagent/gunpowder, 200) +/obj/structure/fermenting_barrel/trickwine + name = "barrel of trickwine" + desc = "finely crafted trickwine." + +/obj/structure/fermenting_barrel/trickwine/Initialize() + . = ..() + var/datum/reagent/trickwine_type + trickwine_type = pick(list( + /datum/reagent/consumable/ethanol/trickwine/ash_wine, + /datum/reagent/consumable/ethanol/trickwine/ice_wine, + /datum/reagent/consumable/ethanol/trickwine/shock_wine, + /datum/reagent/consumable/ethanol/trickwine/hearth_wine, + /datum/reagent/consumable/ethanol/trickwine/force_wine, + /datum/reagent/consumable/ethanol/trickwine/prism_wine + )) + reagents.add_reagent(trickwine_type, 200) + name = "barrel of [trickwine_type::name]" + /obj/structure/fermenting_barrel/distiller - name = "Distiller" + name = "distiller" icon_state = "distiller" closed_state = "distiller" desc = "A repurposed barrel and keg host to a special culture of bacteria native to Illestren" diff --git a/code/modules/missions/dynamic/_dynamic.dm b/code/modules/missions/dynamic/_dynamic.dm new file mode 100644 index 000000000000..8add34d8e165 --- /dev/null +++ b/code/modules/missions/dynamic/_dynamic.dm @@ -0,0 +1,71 @@ +/datum/mission/dynamic + value = 2000 + duration = null + /// Which landmark we will search for in spawned_mission_pois of the planet + var/setpiece_poi = /obj/effect/landmark/mission_poi/main + /// Item that will be spawned at the setpiece_poi + var/setpiece_item + /// Specific item uses an exact item, if false it will allow type or any subtype + var/specific_item = TRUE + /// The item that you can turn in to complete the mission. If specific_item is false it uses the type of the item. + var/atom/movable/required_item + +/datum/mission/dynamic/generate_mission_details() + . = ..() + setpiece_item = pick(setpiece_item) + +/datum/mission/dynamic/mission_regexs(mission_string) + mission_string = ..() + mission_string = replacetext(mission_string, "%MISSION_REQUIRED", "[author]") + return mission_string + +/datum/mission/dynamic/spawn_mission_details(datum/overmap/dynamic/planet) + if(isnull(mission_index)) + stack_trace("[src] does not have a mission index") + for(var/obj/effect/landmark/mission_poi/mission_poi in planet.spawned_mission_pois) + use_poi(mission_poi, planet) + + spawn_custom_details(planet) + +/datum/mission/dynamic/proc/use_poi(obj/effect/landmark/mission_poi/mission_poi, datum/overmap/dynamic/planet) + if(mission_poi.use_count <= 0) + qdel(mission_poi) + return + if(isnull(mission_poi.mission_index) || (mission_index != mission_poi.mission_index)) + return + + var/main = FALSE + if(istype(mission_poi, /obj/effect/landmark/mission_poi/main)) + main = TRUE + if(required_item) + return + + if(main) + if(istype(mission_poi, setpiece_poi)) + //Spawns the item or gets it via use_poi then sets it as bound so the mission fails if its deleted + spawn_main_piece(mission_poi, planet) + else + var/atom/poi_result = mission_poi.use_poi(FALSE, src) + if(isatom(poi_result)) + poi_result.AddComponent(/datum/component/mission_important, MISSION_IMPORTANCE_RELEVENT, src) + +/datum/mission/dynamic/proc/spawn_main_piece(obj/effect/landmark/mission_poi/mission_poi, datum/overmap/dynamic/planet) + required_item = mission_poi.use_poi(setpiece_item, src) + if(isatom(required_item)) + set_bound(required_item, null, TRUE, TRUE) + else + stack_trace("[src] did not generate a required item.") + qdel(src) + +/// For handling logic outside of main piece thats too complex for the basic reiteration or you want to not require indexs to match. +/datum/mission/dynamic/proc/spawn_custom_details(datum/overmap/dynamic/planet) + return + +/datum/mission/dynamic/can_turn_in(atom/movable/item_to_check) + if(istype(required_item)) + if(specific_item) + if(item_to_check == required_item) + return TRUE + else + if(istype(item_to_check, required_item.type)) + return TRUE diff --git a/code/modules/missions/dynamic/kill.dm b/code/modules/missions/dynamic/kill.dm new file mode 100644 index 000000000000..3840d26d3d39 --- /dev/null +++ b/code/modules/missions/dynamic/kill.dm @@ -0,0 +1,53 @@ +/obj/item/dog_tags + name = "dog tags" + icon_state = "skub" + +/obj/effect/landmark/mission_poi/main/kill + +/datum/mission/dynamic/signaled/kill + name = "%MISSION_TARGET termination" + desc = "Bounty for a high ranking %MISSION_TARGET residing on this planet. They should have identifying dogtags." + setpiece_poi = /obj/effect/landmark/mission_poi/main/kill + setpiece_item = /obj/item/dog_tags + mission_main_signal = COMSIG_MOB_DEATH + +/datum/mission/dynamic/signaled/kill/generate_mission_details() + . = ..() + registered_type = pick(registered_type) + +/datum/mission/dynamic/signaled/kill/mission_regexs(mission_string) + mission_string = ..() + if(ispath(registered_type)) + var/atom/target = registered_type + mission_string = replacetext(mission_string, "%MISSION_TARGET", "[target::name]") + return mission_string + +/datum/mission/dynamic/signaled/kill/frontiersmen + value = 2500 + mission_reward = /obj/item/gun/ballistic/automatic/pistol/mauler + registered_type = /mob/living/simple_animal/hostile/human/frontier/ranged/officer + +/datum/mission/dynamic/signaled/kill/syndi_docs + value = 3000 + registered_type = /mob/living/simple_animal/hostile/human/nanotrasen/elite + setpiece_item = /obj/item/folder/documents/syndicate + +/datum/mission/dynamic/signaled/kill/megafauna + +/datum/mission/dynamic/signaled/kill/megafauna/generate_mission_details() + registered_type = pick( + /mob/living/simple_animal/hostile/megafauna/blood_drunk_miner, + /mob/living/simple_animal/hostile/megafauna/claw, + ) + . = ..() + +/datum/mission/dynamic/signaled/kill/elite + +/datum/mission/dynamic/signaled/kill/elite/generate_mission_details() + registered_type = pick( + /mob/living/simple_animal/hostile/asteroid/elite/broodmother, + /mob/living/simple_animal/hostile/asteroid/elite/herald, + /mob/living/simple_animal/hostile/asteroid/elite/legionnaire, + /mob/living/simple_animal/hostile/asteroid/elite/pandora, + ) + . = ..() diff --git a/code/modules/missions/dynamic/missions.dm b/code/modules/missions/dynamic/missions.dm new file mode 100644 index 000000000000..52f2ea6ba3e1 --- /dev/null +++ b/code/modules/missions/dynamic/missions.dm @@ -0,0 +1,39 @@ +/datum/mission/dynamic/data_reterival + name = "data recovery" + desc = "We are looking for %MISSION_REQUIRED" + setpiece_item = list( + /obj/item/research_notes/loot, + /obj/item/documents + ) + +/obj/effect/landmark/mission_poi/main/blackbox + icon_state = "main_blackbox" + already_spawned = TRUE + +/obj/effect/landmark/mission_poi/main/blackbox/use_poi(_type_to_spawn) + var/obj/machinery/blackbox_recorder/recorder = ..() + if(istype(recorder, /obj/machinery/blackbox_recorder)) + if(istype(recorder.stored, /obj/item/blackbox)) + return recorder.stored + +/datum/mission/dynamic/blackbox + name = "blackbox recovery" + desc = "Recover some lost logs from this ruin's blackbox recorder." + setpiece_item = /obj/machinery/blackbox_recorder + +/datum/mission/dynamic/nt_files + name = "NT asset recovery" + desc = "Look- long story short, I need this folder retrieved. You don't ask why, I make sure you get paid." + value = 1250 + mission_reward = list( + /obj/item/gun/energy/e_gun/old, + /obj/item/gun/energy/laser/retro, + /obj/item/gun/energy/laser/captain + ) + faction = /datum/faction/nt + setpiece_item = /obj/item/documents/nanotrasen + +/datum/mission/dynamic/nt_files/generate_mission_details() + . = ..() + author = "Captain [random_species_name()]" + diff --git a/code/modules/missions/dynamic/signaled.dm b/code/modules/missions/dynamic/signaled.dm new file mode 100644 index 000000000000..ef099a4c1ae9 --- /dev/null +++ b/code/modules/missions/dynamic/signaled.dm @@ -0,0 +1,81 @@ +/datum/mission/dynamic/signaled + var/registered_type + var/atom/movable/registered_item + /// What signal will spawn the required item + var/mission_main_signal + +/datum/mission/dynamic/signaled/spawn_main_piece(obj/effect/landmark/mission_poi/mission_poi) + registered_item = mission_poi.use_poi(registered_type, src) + if(isatom(registered_item)) + registered_item = set_bound(registered_item, null, FALSE, TRUE) + RegisterSignal(registered_item, mission_main_signal, PROC_REF(on_signaled)) + else + stack_trace("[src] did not generate a required item.") + qdel(src) + +/datum/mission/dynamic/signaled/proc/on_signaled(atom/movable/registered_item) + SIGNAL_HANDLER + + required_item = new setpiece_item(registered_item.loc) + set_bound(required_item, null, FALSE, TRUE) + UnregisterSignal(registered_item, mission_main_signal) + remove_bound(registered_item) + +/obj/effect/landmark/mission_poi/main/drill + +/datum/mission/dynamic/signaled/drill + name = "drill mission" + desc = "get this drill back up and running and send us proof" + value = 3000 + faction = list( + /datum/faction/nt, + /datum/faction/nt/ns_logi, + /datum/faction/nt/vigilitas, + /datum/faction/frontier, + /datum/faction/independent + ) + registered_type = /obj/machinery/drill/mission/ruin + setpiece_item = /obj/item/drill_readout + mission_main_signal = COMSIG_DRILL_SAMPLES_DONE + +/* + * Core sampling drill +*/ +/obj/machinery/drill/mission + name = "core sampling research drill" + desc = "A specialized laser drill designed to extract geological samples." + + var/num_current = 0 + var/mission_class + var/num_wanted + +/obj/machinery/drill/mission/examine() + . = ..() + . += "The drill contains [num_current] of the [num_wanted] samples needed." + +/obj/machinery/drill/mission/start_mining() + if(mining.vein_class < mission_class && mining) + say("Error: A vein class of [mission_class] or greater is required for operation.") + return + . = ..() + +/obj/machinery/drill/mission/mine_success() + num_current++ + if(num_current == num_wanted) + SEND_SIGNAL(src, COMSIG_DRILL_SAMPLES_DONE) + +//I want this to be a 3x3 machine in future +/obj/machinery/drill/mission/ruin + name = "industrial grade mining drill" + desc = "A large scale laser drill. It's able to mine vast amounts of minerals from near-surface ore pockets, this one is designed for mining outposts." + anchored = TRUE + mission_class = 4 + num_wanted = 15 + +/obj/item/drill_readout + name = "drill debug information" + desc = "Created by a mining outpost drill." + icon = 'icons/obj/bureaucracy.dmi' + icon_state = "paper" + item_state = "paper" + w_class = WEIGHT_CLASS_SMALL diff --git a/code/modules/missions/landmark.dm b/code/modules/missions/landmark.dm new file mode 100644 index 000000000000..846925721b9c --- /dev/null +++ b/code/modules/missions/landmark.dm @@ -0,0 +1,84 @@ +/obj/effect/landmark/mission_poi + name = "mission poi" + icon = 'icons/effects/mission_poi.dmi' + icon_state = "side_thing" + layer = LOW_LANDMARK_LAYER + invisibility = INVISIBILITY_ABSTRACT + var/use_count = 1 + ///Assume the item we want is included in the map and we simple have to return it + var/already_spawned = FALSE + ///Grabbed as apart of late init to ensure that the item of intrest cant move + var/datum/weakref/prespawned_weakref + ///Only needed if you have multipe missiosn that would otherwise use the same poi's + var/mission_index = null + ///Prefered over the passed one, used for varediting primarly. + var/type_to_spawn + +/obj/effect/landmark/mission_poi/Initialize(mapload) + . = ..() + if(mapload && isnull(mission_index)) + CRASH("[src] didnt have a mission index") + SSmissions.unallocated_pois += list(src) + if(already_spawned && type_to_spawn) + var/atom/item_of_interest = search_poi() + prespawned_weakref = WEAKREF(item_of_interest) + +/obj/effect/landmark/mission_poi/LateInitialize() + . = ..() + if(!prespawned_weakref && already_spawned && type_to_spawn) + var/atom/item_of_interest = search_poi() + prespawned_weakref = WEAKREF(item_of_interest) + +/obj/effect/landmark/mission_poi/Destroy() + SSmissions.unallocated_pois -= src + . = ..() + +/obj/effect/landmark/mission_poi/proc/use_poi(_type_to_spawn, datum/mission/mission) + var/atom/item_of_interest + use_count-- + if(!ispath(type_to_spawn)) + type_to_spawn = _type_to_spawn + if(!ispath(type_to_spawn)) + CRASH("[src] didnt get passed a type.") + if(already_spawned) //Search for the item + item_of_interest = search_poi() + if(!item_of_interest) + CRASH("[src] is meant to have its item prespawned but could not find it on its tile.") + else //Spawn the item + item_of_interest = new type_to_spawn(loc) + // We dont have an item to return + if(!istype(item_of_interest)) + CRASH("[src] did not return a item_of_interest") + item_of_interest.AddComponent(/datum/component/mission_important, MISSION_IMPORTANCE_RELEVENT, mission) + return item_of_interest + +/obj/effect/landmark/mission_poi/proc/search_poi() + if(isweakref(prespawned_weakref)) + var/atom/prespawned_item = prespawned_weakref.resolve() + if(istype(prespawned_item, type_to_spawn)) + return prespawned_item + for(var/atom/movable/item_in_poi as anything in get_turf(src)) + if(istype(item_in_poi, type_to_spawn)) + return item_in_poi + +/obj/effect/landmark/mission_poi/main + name = "mission focus" + icon_state = "main_thing" + +/obj/effect/landmark/mission_poi/guard + icon_state = "guard" + +/obj/effect/landmark/mission_poi/remover + +/obj/effect/landmark/mission_poi/remover/use_poi(_type_to_spawn) + if(!ispath(type_to_spawn)) + type_to_spawn = _type_to_spawn + if(!ispath(type_to_spawn)) + stack_trace("[src] didnt get passed a type.") + if(already_spawned) //Search for the item + for(var/atom/movable/item_in_poi as anything in get_turf(src)) + if(istype(item_in_poi, type_to_spawn)) + qdel(item_in_poi) + return + stack_trace("[src] didnt remove anything somehow") + diff --git a/code/modules/missions/mission.dm b/code/modules/missions/mission.dm new file mode 100644 index 000000000000..25c46a49e870 --- /dev/null +++ b/code/modules/missions/mission.dm @@ -0,0 +1,268 @@ +/datum/mission + var/name = "Mission" + var/author = "" + var/desc = "Do something for me." + var/faction = /datum/faction/independent + /// The mission's payout. + var/value = 1000 + /// Optional var to give an item upon completion along with value + var/mission_reward + /// The relative probability of this mission being selected. 0-weight missions are never selected. + var/weight = 0 + + /// Only needed if you have multipe missions that use the same poi's on the map. Set at new. + var/mission_index + + var/location_specific = TRUE + /// The location the mission is relient on, often pulling varibles from it or will delete itself if the mission_location is deleted. Passed in New(). + var/datum/overmap/mission_location + + /// The amount of time in which to complete the mission. Setting it to 0 will result in no time limit + var/duration = 1.5 HOURS + /// Should mission value scale proportionally to the deviation from the mission's base duration? + var/dur_value_scaling = FALSE + /// The maximum deviation of the mission's true value from the base value, as a proportion. + var/val_mod_range = 0.3 + /// The maximum deviation of the mission's true duration from the base value, as a proportion. + var/dur_mod_range = 0.1 + + /// Timestamp for when the mission was activated + var/time_issued + var/active = FALSE + var/failed = FALSE + var/dur_timer + + // If the mission has been accepted by a ship. + var/accepted = FALSE + /// The ship that accepted this mission. Passed in accept(). + var/datum/overmap/ship/controlled/servant + + /// Assoc list of atoms "bound" to this mission; each atom is associated with a 2-element list. The first + /// entry in that list is a bool that determines if the mission should fail when the atom qdeletes; the second + /// is a callback to be invoked upon the atom's qdeletion. + var/list/atom/movable/bound_atoms + +/datum/mission/New(location, mission_index) + //source_outpost = _outpost + //RegisterSignal(source_outpost, COMSIG_PARENT_QDELETING, PROC_REF(on_vital_delete)) + src.mission_index = mission_index + SSmissions.inactive_missions += list(src) + + if(location_specific) + src.mission_location = location + RegisterSignal(mission_location, COMSIG_PARENT_QDELETING, PROC_REF(on_vital_delete)) + RegisterSignal(mission_location, COMSIG_OVERMAP_LOADED, PROC_REF(on_planet_load)) + + generate_mission_details() + regex_mission_text() + return ..() + +/datum/mission/Destroy() + //UnregisterSignal(source_outpost, COMSIG_PARENT_QDELETING) + if(location_specific) + UnregisterSignal(mission_location, COMSIG_PARENT_QDELETING, COMSIG_OVERMAP_LOADED) + if(active) + SSmissions.active_missions -= src + else + SSmissions.inactive_missions -= src + //LAZYREMOVE(source_outpost.missions, src) + //source_outpost = null + for(var/bound in bound_atoms) + remove_bound(bound) + deltimer(dur_timer) + return ..() + +/datum/mission/proc/on_vital_delete() + SSblackbox.record_feedback("tally", "mission_vital_delete", 1, src.type) + qdel(src) + +/datum/mission/proc/generate_mission_details() + var/val_mod = value * val_mod_range + value = rand(value-val_mod, value+val_mod) + if(duration) + var/old_dur = duration + var/dur_mod = duration * dur_mod_range + duration = round(rand(duration-dur_mod, duration+dur_mod), 30 SECONDS) + value = value * (dur_value_scaling ? old_dur / duration : 1) + value = round(value, 50) + + faction = pick(faction) + author = random_species_name() + mission_reward = pick(mission_reward) + return + +/datum/mission/proc/regex_mission_text() + name = mission_regexs(name) + desc = mission_regexs(desc) + +/datum/mission/proc/mission_regexs(mission_string) + mission_string = replacetext(mission_string, "%MISSION_AUTHOR", "[author]") + if(ispath(mission_reward)) + var/atom/reward = mission_reward + mission_string = replacetext(mission_string, "%MISSION_REWARD", "[reward::name]") + return mission_string + +/datum/mission/proc/reward_flavortext() + var/reward_string = "[value] cr upon completion" + if(ispath(mission_reward)) + var/atom/reward = mission_reward + reward_string += " along with [reward::name]" + return reward_string + +/datum/mission/proc/start_mission() + SSblackbox.record_feedback("tally", "mission_started", 1, src.type) + SSmissions.inactive_missions -= src + active = TRUE + time_issued = station_time_timestamp() + if(duration) + dur_timer = addtimer(VARSET_CALLBACK(src, failed, TRUE), duration, TIMER_STOPPABLE) + SSmissions.active_missions += src + +/datum/mission/proc/on_planet_load(datum/overmap/dynamic/planet) + SIGNAL_HANDLER + + // Status of mission is handled by items spawned in mission after this + UnregisterSignal(mission_location, COMSIG_PARENT_QDELETING) + if(!active) + qdel(src) + return + if(!planet.spawned_mission_pois.len) + stack_trace("[src] failed to start because it had no points of interest to use for its mission") + qdel(src) + return + + spawn_mission_details(planet) + +/datum/mission/proc/spawn_mission_details(datum/overmap/dynamic/planet) + return + +/datum/mission/proc/accept(datum/overmap/ship/controlled/acceptor, turf/accept_loc) + return + +/datum/mission/proc/can_turn_in(atom/movable/item_to_check) + return + +/datum/mission/proc/turn_in(atom/movable/item_to_turn_in) + if(can_turn_in(item_to_turn_in)) + SSblackbox.record_feedback("tally", "mission_turned_in", 1, src.type) + spawn_reward(item_to_turn_in.loc) + do_sparks(3, FALSE, get_turf(item_to_turn_in)) + qdel(item_to_turn_in) + qdel(src) + +/datum/mission/proc/spawn_reward(loc) + new /obj/item/spacecash/bundle(loc, value * 1.2) + if(ispath(mission_reward)) + new mission_reward(loc) + +/datum/mission/proc/can_complete() + return !failed + +/datum/mission/proc/get_tgui_info(list/items_on_pad = list()) + var/time_remaining = max(dur_timer ? timeleft(dur_timer) : duration, 0) + + var/act_str = "" + if(can_complete()) + act_str = "Turn in" + + var/can_turn_in = FALSE + var/list/acceptable_items = list() + for(var/atom/movable/item_on_pad in items_on_pad) + if(can_turn_in(item_on_pad)) + acceptable_items += list(item_on_pad.name) + can_turn_in = TRUE + break + + return list( + "ref" = REF(src), + "name" = src.name, + "author" = src.author, + "desc" = src.desc, + "reward" = src.reward_flavortext(), + "faction" = SSfactions.faction_name(src.faction), + "location" = "X[mission_location.x]/Y[mission_location.y]: [mission_location.name]", + "x" = mission_location.x, + "y" = mission_location.y, + "timeIssued" = time_issued, + "duration" = src.duration, + "remaining" = time_remaining, + "timeStr" = time2text(time_remaining, "mm:ss"), + "progressStr" = get_progress_string(), + "actStr" = act_str, + "canTurnIn" = can_turn_in, + "validItems" = acceptable_items + ) + +/datum/mission/proc/get_progress_string() + return "null" + +/** + * Spawns a "bound" atom of the given type at the given location. When the "bound" atom + * is qdeleted, the passed-in callback is invoked, and, by default, the mission fails. + * + * Intended to be used to spawn mission-linked atoms that can have + * references saved without causing harddels. + * + * Arguments: + * * a_type - The type of the atom to be spawned. Must be of type /atom/movable. + * * a_loc - The location to spawn the bound atom at. + * * destroy_cb - The callback to invoke when the bound atom is qdeleted. Default is null. + * * fail_on_delete - Bool; whether the mission should fail when the bound atom is qdeleted. Default TRUE. + * * sparks - Whether to spawn sparks after spawning the bound atom. Default TRUE. + */ +/datum/mission/proc/spawn_bound(atom/movable/a_type, a_loc, destroy_cb = null, fail_on_delete = TRUE, sparks = TRUE) + if(!ispath(a_type, /atom/movable)) + CRASH("[src] attempted to spawn bound atom of invalid type [a_type]!") + var/atom/movable/bound = new a_type(a_loc) + set_bound(bound, destroy_cb, fail_on_delete, sparks) + return bound + +/datum/mission/proc/set_bound(atom/movable/bound, destroy_cb = null, fail_on_delete = TRUE, sparks = TRUE) + if(!istype(bound, /atom/movable)) + CRASH("[src] bad type! [bound]") + if(sparks) + do_sparks(3, FALSE, get_turf(bound)) + LAZYSET(bound_atoms, bound, list(fail_on_delete, destroy_cb)) + RegisterSignal(bound, COMSIG_PARENT_QDELETING, PROC_REF(bound_deleted)) + bound.AddComponent(/datum/component/mission_important, MISSION_IMPORTANCE_CRITICAL, src) + return bound + +/** + * Removes the given atom from the mission's bound items, then qdeletes it. + * Does not invoke the callback or fail the mission; optionally creates sparks. + * + * Arguments: + * * bound - The bound atom to recall. + * * sparks - Whether to spawn sparks on the turf the bound atom is located on. Default TRUE. + */ +/datum/mission/proc/recall_bound(atom/movable/bound, sparks = TRUE) + if(sparks) + do_sparks(3, FALSE, get_turf(bound)) + remove_bound(bound) + qdel(bound) + +/// Signal handler for the qdeletion of bound atoms. +/datum/mission/proc/bound_deleted(atom/movable/bound, force) + SIGNAL_HANDLER + var/list/bound_info = bound_atoms[bound] + // first value in bound_info is whether to fail on item destruction + failed = bound_info[1] + // second value is callback to fire on atom destruction + if(bound_info[2] != null) + var/datum/callback/CB = bound_info[2] + CB.Invoke() + remove_bound(bound) + +/** + * Removes the given bound atom from the list of bound atoms. + * Does not invoke the associated callback or fail the mission. + * + * Arguments: + * * bound - The bound atom to remove. + */ +/datum/mission/proc/remove_bound(atom/movable/bound) + UnregisterSignal(bound, COMSIG_PARENT_QDELETING) + // delete the callback + qdel(LAZYACCESSASSOC(bound_atoms, bound, 2)) + // remove info from our list + LAZYREMOVE(bound_atoms, bound) diff --git a/code/modules/missions/mission_board.dm b/code/modules/missions/mission_board.dm new file mode 100644 index 000000000000..d19c78334d99 --- /dev/null +++ b/code/modules/missions/mission_board.dm @@ -0,0 +1,177 @@ +/obj/machinery/computer/mission + name = "\improper Outpost mission board" + desc = "Used to check and claim missions offered by the outpost." + icon_screen = "bounty" + circuit = /obj/item/circuitboard/computer/mission + light_color = COLOR_BRIGHT_ORANGE + var/datum/weakref/pad_ref + var/obj/item/card/id/inserted_scan_id + +/obj/machinery/computer/mission/LateInitialize() + . = ..() + if(istype(get_area(src.loc), /area/outpost)) + var/obj/machinery/mission_pad/pad = locate() in range(2,src) + pad_ref = WEAKREF(pad) + desc += "This one is not linked to any outpost." + +/obj/machinery/computer/mission/attackby(obj/item/I, mob/living/user, params) + if(isidcard(I)) + if(id_insert(user, I, inserted_scan_id)) + inserted_scan_id = I + return TRUE + return ..() + +/obj/machinery/computer/mission/AltClick(mob/user) + id_eject(user, inserted_scan_id) + return TRUE + +/obj/machinery/computer/mission/proc/id_insert(mob/user, obj/item/inserting_item, obj/item/target) + var/obj/item/card/id/card_to_insert = inserting_item + var/holder_item = FALSE + + if(!isidcard(card_to_insert)) + card_to_insert = inserting_item.RemoveID() + holder_item = TRUE + + if(!card_to_insert || !user.transferItemToLoc(card_to_insert, src)) + return FALSE + + if(target) + if(holder_item && inserting_item.InsertID(target)) + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + else + id_eject(user, target) + + user.visible_message(span_notice("[user] inserts \the [card_to_insert] into \the [src]."), + span_notice("You insert \the [card_to_insert] into \the [src].")) + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + ui_interact(user) + return TRUE + +/obj/machinery/computer/mission/proc/id_eject(mob/user, obj/target) + if(!target) + to_chat(user, span_warning("That slot is empty!")) + return FALSE + else + target.forceMove(drop_location()) + if(!issilicon(user) && Adjacent(user)) + user.put_in_hands(target) + user.visible_message(span_notice("[user] gets \the [target] from \the [src]."), \ + span_notice("You get \the [target] from \the [src].")) + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + inserted_scan_id = null + return TRUE + +/obj/machinery/computer/mission/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + var/obj/machinery/mission_pad/pad = pad_ref?.resolve() + if(!pad) + return + switch(action) + if("recalc") + recalc() + if("send") + var/datum/mission/dynamic/mission = locate(params["mission"]) + if(!istype(mission, /datum/mission/dynamic)) + return + turn_in(mission) + if("eject") + id_eject(usr, inserted_scan_id) + inserted_scan_id = null + . = TRUE + +/obj/machinery/computer/mission/proc/turn_in(datum/mission/dynamic/mission) + var/obj/machinery/mission_pad/pad = pad_ref?.resolve() + for(var/atom/movable/item_on_pad as anything in get_turf(pad)) + if(item_on_pad == pad) + continue + if(mission.can_turn_in(item_on_pad)) + mission.turn_in(item_on_pad) + return TRUE + +/// Return all items on pad +/obj/machinery/computer/mission/proc/recalc() + var/obj/machinery/mission_pad/pad = pad_ref?.resolve() + var/list/items_to_check = list() + for(var/atom/movable/item_on_pad as anything in get_turf(pad)) + if(item_on_pad == pad) + continue + items_to_check += list(item_on_pad) + //show_message(item_on_pad) + if(items_to_check.len) + return items_to_check + +/obj/machinery/computer/mission/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "MissionBoard", name) + ui.open() + +/obj/machinery/computer/mission/ui_data(mob/user) + var/list/data = list() + data["missions"] = list() + var/list/items_on_pad = recalc() + for(var/datum/mission/dynamic/M as anything in SSmissions.active_missions) + data["missions"] += list(M.get_tgui_info(items_on_pad)) + data["pad"] = pad_ref?.resolve() ? TRUE : FALSE + data["id_inserted"] = inserted_scan_id ? TRUE : FALSE + return data + +/obj/machinery/mission_pad + name = "\improper Outpost mission turn-in pad" + icon = 'icons/obj/telescience.dmi' + icon_state = "pad-idle" + +/obj/machinery/bounty_viewer + name = "bounty viewer" + desc = "A multi-platform network for placing requests across the sector, this one is view only." + icon = 'icons/obj/terminals.dmi' + icon_state = "request_kiosk" + light_color = LIGHT_COLOR_GREEN + +/obj/machinery/bounty_viewer/Initialize(mapload, ndir, building) + . = ..() + if(building) + setDir(ndir) + pixel_x = (dir & 3)? 0 : (dir == 4 ? -32 : 32) + pixel_y = (dir & 3)? (dir ==1 ? -32 : 32) : 0 + +/obj/machinery/bounty_viewer/wrench_act(mob/living/user, obj/item/I) + . = ..() + to_chat(user, span_notice("You start [anchored ? "un" : ""]securing [name]...")) + I.play_tool_sound(src) + if(I.use_tool(src, user, 30)) + playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) + if(machine_stat & BROKEN) + to_chat(user, span_warning("The broken remains of [src] fall on the ground.")) + new /obj/item/stack/sheet/metal(loc, 3) + new /obj/item/shard(loc) + else + to_chat(user, span_notice("You [anchored ? "un" : ""]secure [name].")) + new /obj/item/wallframe/bounty_viewer(loc) + qdel(src) + +/obj/machinery/bounty_viewer/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "MissionBoard", name) + ui.open() + +/obj/machinery/bounty_viewer/ui_data(mob/user) + var/list/data = list() + data["missions"] = list() + for(var/datum/mission/dynamic/M as anything in SSmissions.active_missions) + data["missions"] += list(M.get_tgui_info()) + data["pad"] = FALSE + data["id_inserted"] = FALSE + return data + +/obj/item/wallframe/bounty_viewer + name = "disassembled bounty viewer" + desc = "Used to build a new bounty viewer, just secure to the wall." + icon_state = "request_kiosk" + custom_materials = list(/datum/material/iron = 14000, /datum/material/glass = 8000) + result_path = /obj/machinery/bounty_viewer + inverse = FALSE diff --git a/code/modules/missions/mission_important_comp.dm b/code/modules/missions/mission_important_comp.dm new file mode 100644 index 000000000000..af099a25d824 --- /dev/null +++ b/code/modules/missions/mission_important_comp.dm @@ -0,0 +1,26 @@ +/// Shows examine hints on how it relates to a mission +/datum/component/mission_important + var/importance_level + var/datum/weakref/mission_ref + +/datum/component/mission_important/Initialize(_importance_level = MISSION_IMPORTANCE_RELEVENT, _mission) + importance_level = _importance_level + if(isdatum(_mission)) + mission_ref = WEAKREF(_mission) + if(isatom(parent)) + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(on_atom_examine)) + +/datum/component/mission_important/proc/on_atom_examine(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + + if(!isdatum(mission_ref.resolve())) + examine_list += span_notice("[parent] was useful to a mission.") + return + + switch(importance_level) + if(MISSION_IMPORTANCE_CRITICAL) + examine_list += span_notice("[parent] is critical to a mission.") + if(MISSION_IMPORTANCE_IMPORTANT) + examine_list += span_notice("[parent] is important to a mission.") + if(MISSION_IMPORTANCE_RELEVENT) + examine_list += span_notice("[parent] is relevent to a mission.") diff --git a/code/modules/missions/readme.md b/code/modules/missions/readme.md new file mode 100644 index 000000000000..83de87aef2e8 --- /dev/null +++ b/code/modules/missions/readme.md @@ -0,0 +1,7 @@ +# Dynamic Missions + +## About +A massive rework to missions with the core goal of making them more intresting and feeding into our existing loop better + +## Variables + diff --git a/code/modules/missions/simple/anomaly_mission.dm b/code/modules/missions/simple/anomaly_mission.dm new file mode 100644 index 000000000000..fb5831a28d38 --- /dev/null +++ b/code/modules/missions/simple/anomaly_mission.dm @@ -0,0 +1,15 @@ +/datum/mission/simple/anomaly + name = "Anomaly core requested" + desc = "%MISSION_AUTHOR has requested that a ship locate an anomaly core for research. \ + They've offered to pay well, so we're relaying this mission to you." + weight = 8 + value = 3000 + duration = 80 MINUTES + dur_mod_range = 0.2 + container_type = /obj/item/storage/box/anomaly + objective_type = /obj/item/assembly/signaler/anomaly + num_wanted = 1 + +/datum/mission/simple/anomaly/generate_mission_details() + . = ..() + researcher_name = SSmissions.get_researcher_name() diff --git a/code/modules/overmap/missions/drill_mission.dm b/code/modules/missions/simple/drill_mission.dm similarity index 73% rename from code/modules/overmap/missions/drill_mission.dm rename to code/modules/missions/simple/drill_mission.dm index 307d73d59592..b2198b5651b2 100644 --- a/code/modules/overmap/missions/drill_mission.dm +++ b/code/modules/missions/simple/drill_mission.dm @@ -11,10 +11,10 @@ var/num_wanted = 4 var/class_wanted = 1 -/datum/mission/drill/New(...) +/datum/mission/drill/generate_mission_details() + . = ..() num_wanted = rand(num_wanted-2,num_wanted+2) value += num_wanted*100 - return ..() /datum/mission/drill/accept(datum/overmap/ship/controlled/acceptor, turf/accept_loc) . = ..() @@ -22,6 +22,7 @@ sampler.mission_class = class_wanted sampler.num_wanted = num_wanted sampler.name += " (Class [class_wanted])" + //Gives players a little extra money for going past the mission goal /datum/mission/drill/turn_in() value += (sampler.num_current - num_wanted)*50 @@ -67,27 +68,3 @@ class_wanted = 3 num_wanted = 8 -/* - Core sampling drill -*/ - -/obj/machinery/drill/mission - name = "core sampling research drill" - desc = "A specialized laser drill designed to extract geological samples." - - var/num_current = 0 - var/mission_class - var/num_wanted - -/obj/machinery/drill/mission/examine() - . = ..() - . += "The drill contains [num_current] of the [num_wanted] samples needed." - -/obj/machinery/drill/mission/start_mining() - if(mining.vein_class < mission_class && mining) - say("Error: A vein class of [mission_class] or greater is required for operation.") - return - . = ..() - -/obj/machinery/drill/mission/mine_success() - num_current++ diff --git a/code/modules/overmap/missions.dm b/code/modules/missions/unticked/missions.dm similarity index 75% rename from code/modules/overmap/missions.dm rename to code/modules/missions/unticked/missions.dm index 0bc2c2f34722..6b54bc5fafeb 100644 --- a/code/modules/overmap/missions.dm +++ b/code/modules/missions/unticked/missions.dm @@ -1,17 +1,4 @@ /datum/mission - var/name = "Mission" - var/desc = "Do something for me." - var/value = 1000 /// The mission's payout. - var/duration = 30 MINUTES /// The amount of time in which to complete the mission. - var/weight = 0 /// The relative probability of this mission being selected. 0-weight missions are never selected. - - /// Should mission value scale proportionally to the deviation from the mission's base duration? - var/dur_value_scaling = TRUE - /// The maximum deviation of the mission's true value from the base value, as a proportion. - var/val_mod_range = 0.1 - /// The maximum deviation of the mission's true duration from the base value, as a proportion. - var/dur_mod_range = 0.1 - /// The outpost that issued this mission. Passed in New(). var/datum/overmap/outpost/source_outpost /// The ship that accepted this mission. Passed in accept(). @@ -21,11 +8,6 @@ var/failed = FALSE var/dur_timer - /// Assoc list of atoms "bound" to this mission; each atom is associated with a 2-element list. The first - /// entry in that list is a bool that determines if the mission should fail when the atom qdeletes; the second - /// is a callback to be invoked upon the atom's qdeletion. - var/list/atom/movable/bound_atoms - /datum/mission/New(_outpost) var/old_dur = duration var/val_mod = value * val_mod_range @@ -159,15 +141,3 @@ qdel(LAZYACCESSASSOC(bound_atoms, bound, 2)) // remove info from our list LAZYREMOVE(bound_atoms, bound) - -// should probably come up with a better solution for this -// hierarchical weighting? would need to distinguish between "real" and "fake" missions -/proc/get_weighted_mission_type() - var/static/list/weighted_missions - if(!weighted_missions) - weighted_missions = list() - var/list/mission_types = subtypesof(/datum/mission) - for(var/datum/mission/mis_type as anything in mission_types) - if(initial(mis_type.weight) > 0) - weighted_missions[mis_type] = initial(mis_type.weight) - return pickweight_float(weighted_missions) diff --git a/code/modules/overmap/missions/acquire_mission.dm b/code/modules/missions/unticked/missions/acquire_mission.dm similarity index 75% rename from code/modules/overmap/missions/acquire_mission.dm rename to code/modules/missions/unticked/missions/acquire_mission.dm index ea55beb00120..c744fdf6eb39 100644 --- a/code/modules/overmap/missions/acquire_mission.dm +++ b/code/modules/missions/unticked/missions/acquire_mission.dm @@ -87,21 +87,6 @@ but I just lost it! Could you please find me a replacement? I don't have long!" . = ..() -/datum/mission/acquire/true_love/puce - name = "Puce crystal needed (urgent!!)" - weight = 1 - objective_type = /obj/item/reagent_containers/food/snacks/grown/ash_flora/puce - -/datum/mission/acquire/true_love/fireblossom - name = "Fireblossom needed (urgent!!)" - weight = 1 - objective_type = /obj/item/reagent_containers/food/snacks/grown/ash_flora/fireblossom - -/datum/mission/acquire/true_love/icepepper - name = "Icepepper needed (urgent!!)" - weight = 1 - objective_type = /obj/item/reagent_containers/food/snacks/grown/icepepper - /datum/mission/acquire/true_love/strange_crystal name = "Strange crystal needed (urgent!!!)" value = 1000 @@ -112,33 +97,6 @@ Acquire: Anomaly */ -/datum/mission/acquire/anomaly - name = "Anomaly core requested" - weight = 8 - value = 3000 - duration = 80 MINUTES - dur_mod_range = 0.2 - container_type = /obj/item/storage/box/anomaly - objective_type = /obj/item/assembly/signaler/anomaly - num_wanted = 1 - -/datum/mission/acquire/anomaly/New(...) - var/group = pick(list( - "Cybersun Industries", - "CMM-GOLD", - "Nanotrasen Anomalous Studies Division", - "The Naturalienwissenschaftlicher Studentenverbindungs-Verband", - "The Central Solarian Anomaly Research Agency", - "DeForest Medical R&D", - "A strange lizard on the outpost" - )) - - desc = "[group] has requested that a ship [pick(list("procure", "grab", "acquire", "find", "locate"))] \ - an anomaly core for [pick(list("research", "analysis", "technical development", "closer inspection", "some reason"))]. \ - They've offered to pay well, so we're relaying this mission to you" - . = ..() - - /* @@ -146,9 +104,8 @@ Acquire: Anomaly */ /datum/mission/acquire/creature - name = "Capture a goliath" - desc = "I require a live goliath for research purposes. Trap one within the given \ - Lifeform Containment Unit and return it to me and you will be paid handsomely." + name = "" + desc = "" value = 1500 duration = 60 MINUTES weight = 6 @@ -156,6 +113,15 @@ Acquire: Anomaly objective_type = /mob/living/simple_animal/hostile/asteroid/goliath num_wanted = 1 count_stacks = FALSE + var/creature_name = "goliath" + +/datum/mission/acquire/creature/New(...) + if(!name) + name = "Capture a [creature_name]" + if(!desc) + desc = "I require a live [creature_name] for research purposes. Trap one within the given \ + Lifeform Containment Unit and return it to me and you will be paid handsomely." + . = ..() /datum/mission/acquire/creature/atom_effective_count(atom/movable/target) . = ..() @@ -166,43 +132,21 @@ Acquire: Anomaly return 0 /datum/mission/acquire/creature/legion - name = "Capture a legion" - desc = "I require a live legion for research purposes. Trap one within the given \ - Lifeform Containment Unit and return it to me and you will be paid handsomely." value = 1300 objective_type = /mob/living/simple_animal/hostile/asteroid/hivelord/legion + creature_name = "legion" /datum/mission/acquire/creature/ice_whelp - name = "Capture an ice whelp" - desc = "I require a live ice whelp for research purposes. Trap one within the given \ - Lifeform Containment Unit and return it to me and you will be paid handsomely." value = 1700 weight = 2 objective_type = /mob/living/simple_animal/hostile/asteroid/ice_whelp + creature_name = "ice whelp" /datum/mission/acquire/creature/migo - name = "Capture a live mi-go" - desc = "I require a live mi-go for research purposes. Trap one within the given \ - Lifeform Containment Unit and return it to me and you will be paid handsomely." value = 1050 weight = 2 objective_type = /mob/living/simple_animal/hostile/netherworld/migo/asteroid - -/datum/mission/acquire/creature/floorbot - name = "Detain a malfunctioning floorbot" - desc = "I require a functional abandoned floorbot for \"research\" purposes. Trap one within \ - the given Lifeform Containment Unit and return it to me and you will be paid handsomely." - value = 1450 - weight = 1 - objective_type = /mob/living/simple_animal/bot/floorbot/rockplanet - -/datum/mission/acquire/creature/firebot - name = "Detain a malfunctioning firebot" - desc = "I require a functional abandoned firebot for \"research\" purposes. Trap one within \ - the given Lifeform Containment Unit and return it to me and you will be paid handsomely." - value = 1450 - weight = 1 - objective_type = /mob/living/simple_animal/bot/firebot/rockplanet + creature_name = "mi-go" /* Acquire: Landmines diff --git a/code/modules/overmap/missions/research_mission.dm b/code/modules/missions/unticked/missions/research_mission.dm similarity index 91% rename from code/modules/overmap/missions/research_mission.dm rename to code/modules/missions/unticked/missions/research_mission.dm index 9481556d33be..25db33c423d9 100644 --- a/code/modules/overmap/missions/research_mission.dm +++ b/code/modules/missions/unticked/missions/research_mission.dm @@ -1,6 +1,6 @@ /datum/mission/research name = "Electrical storm research mission" - desc = "We require data on the behavior of electrical storms in the system for an ongoing study. \ + desc = " require data on the behavior of electrical storms in the system for an ongoing study. \ Please anchor the attached sensor array to your ship and fly it through the storms.\ It must be powered to collect the data. " value = 3000 // base value, before adding bonus for number of things to fly through @@ -11,10 +11,13 @@ var/obj/machinery/mission_scanner/scanner var/num_current = 0 var/num_wanted = 5 + var/researcher_name /datum/mission/research/New(...) + researcher_name = get_researcher_name() num_wanted = rand(num_wanted - 1, num_wanted + 1) value += num_wanted * 150 + desc = researcher_name + desc return ..() /datum/mission/research/accept(datum/overmap/ship/controlled/acceptor, turf/accept_loc) @@ -56,6 +59,7 @@ if(!over_obj || !scanner.is_operational || scanner_port?.current_ship != servant) return num_current++ + /* commented out until ion storms aren't literal torture /datum/mission/research/ion name = "Ion storm research mission" @@ -65,9 +69,10 @@ value = 3500 objective_type = /datum/overmap/event/emp */ + /datum/mission/research/meteor name = "Asteroid field research mission" - desc = "We require data on the behavior of asteroid fields in the system for an ongoing study. \ + desc = " require data on the behavior of asteroid fields in the system for an ongoing study. \ Please anchor the attached sensor array to your ship and fly it through the fields. \ It must be powered to collect the data." value = 4000 @@ -76,7 +81,7 @@ /datum/mission/research/carp name = "Carp migration research mission" - desc = "We require data on the migration patterns of space carp for an ongoing study. \ + desc = " require data on the migration patterns of space carp for an ongoing study. \ Please anchor the attached sensor array to your ship and fly it through the fields. \ It must be powered to collect the data." value = 2000 @@ -86,7 +91,7 @@ /datum/mission/research/dust name = "dust research mission" - desc = "We require data on the density of space dust for updated navcharts. \ + desc = " require data on the density of space dust for updated navcharts. \ Please anchor the attached sensor array to your ship and fly it through the fields. \ It must be powered to collect the data." value = 1000 diff --git a/code/modules/modular_computers/computers/item/tablet_presets.dm b/code/modules/modular_computers/computers/item/tablet_presets.dm index f74cc016ad3b..84d2fd434566 100644 --- a/code/modules/modular_computers/computers/item/tablet_presets.dm +++ b/code/modules/modular_computers/computers/item/tablet_presets.dm @@ -29,6 +29,7 @@ install_component(new /obj/item/computer_hardware/network_card) install_component(new /obj/item/computer_hardware/printer/mini) hard_drive.store_file(new /datum/computer_file/program/shipping) + hard_drive.store_file(new /datum/computer_file/program/bounty_board) /// Given by the syndicate as part of the contract uplink bundle - loads in the Contractor Uplink. /obj/item/modular_computer/tablet/syndicate_contract_uplink/preset/uplink/Initialize() diff --git a/code/modules/modular_computers/file_system/programs/bounty_board.dm b/code/modules/modular_computers/file_system/programs/bounty_board.dm index b3b9051e5b8f..fb575c6f0af6 100644 --- a/code/modules/modular_computers/file_system/programs/bounty_board.dm +++ b/code/modules/modular_computers/file_system/programs/bounty_board.dm @@ -1,120 +1,19 @@ +///I will work on reimplmenting player bounties! /datum/computer_file/program/bounty_board filename = "bountyboard" - filedesc = "Bounty Board Request Network" + filedesc = "Bounty Network Viewer" program_icon_state = "bountyboard" - extended_desc = "A multi-platform network for placing requests across the sector, with payment across the network being possible.." + extended_desc = "A multi-platform network for placing requests across the sector, modular software cant handle item transfer so this is only for viewing." requires_ntnet = TRUE size = 10 - tgui_id = "NtosRequestKiosk" - ///Reference to the currently logged in user. - var/datum/bank_account/current_user - ///The station request datum being affected by UI actions. - var/datum/station_request/active_request - ///Value of the currently bounty input - var/bounty_value = 1 - ///Text of the currently written bounty - var/bounty_text = "" - ///Has the app been added to the network yet? - var/networked = FALSE + available_on_ntnet = TRUE + tgui_id = "NtosMission" /datum/computer_file/program/bounty_board/ui_data(mob/user) var/list/data = get_header_data() - var/list/formatted_requests = list() - var/list/formatted_applicants = list() - var/obj/item/computer_hardware/card_slot/card_slot = computer.all_components[MC_CARD] - if(!networked) - GLOB.allbountyboards += computer - networked = TRUE - if(card_slot && card_slot.bank_card && card_slot.bank_card.registered_account) - current_user = card_slot.bank_card.registered_account - for(var/i in GLOB.request_list) - if(!i) - continue - var/datum/station_request/request = i - formatted_requests += list(list("owner" = request.owner, "value" = request.value, "description" = request.description, "acc_number" = request.req_number)) - if(request.applicants) - for(var/datum/bank_account/j in request.applicants) - formatted_applicants += list(list("name" = j.account_holder, "request_id" = request.owner_account.account_id, "requestee_id" = j.account_id)) - if(current_user) - data["accountName"] = current_user.account_holder - data["requests"] = formatted_requests - data["applicants"] = formatted_applicants - data["bountyValue"] = bounty_value - data["bountyText"] = bounty_text + data["missions"] = list() + for(var/datum/mission/dynamic/M as anything in SSmissions.active_missions) + data["missions"] += list(M.get_tgui_info()) + data["pad"] = FALSE + data["id_inserted"] = FALSE return data - -/datum/computer_file/program/bounty_board/ui_act(action, list/params) - . = ..() - if(.) - return - var/current_ref_num = params["request"] - var/current_app_num = params["applicant"] - var/datum/bank_account/request_target - if(current_ref_num) - for(var/datum/station_request/i in GLOB.request_list) - if("[i.req_number]" == "[current_ref_num]") - active_request = i - break - if(active_request) - for(var/datum/bank_account/j in active_request.applicants) - if("[j.account_id]" == "[current_app_num]") - request_target = j - break - switch(action) - if("createBounty") - if(!current_user || !bounty_text) - playsound(src, 'sound/machines/buzz-sigh.ogg', 20, TRUE) - return TRUE - for(var/datum/station_request/i in GLOB.request_list) - if("[i.req_number]" == "[current_user.account_id]") - computer.say("Account already has active bounty.") - return - var/datum/station_request/curr_request = new /datum/station_request(current_user.account_holder, bounty_value,bounty_text,current_user.account_id, current_user) - GLOB.request_list += list(curr_request) - for(var/obj/i in GLOB.allbountyboards) - i.say("New bounty has been added!") - playsound(i.loc, 'sound/effects/cashregister.ogg', 30, TRUE) - return TRUE - if("apply") - if(!current_user) - computer.say("Please swipe a valid ID first.") - return TRUE - if(current_user.account_holder == active_request.owner) - playsound(computer, 'sound/machines/buzz-sigh.ogg', 20, TRUE) - return TRUE - active_request.applicants += list(current_user) - if("payApplicant") - if(!current_user) - return - if(!current_user.has_money(active_request.value) || (current_user.account_holder != active_request.owner)) - playsound(computer, 'sound/machines/buzz-sigh.ogg', 30, TRUE) - return - request_target.transfer_money(current_user, active_request.value) - computer.say("Paid out [active_request.value] credits.") - return TRUE - if("clear") - if(current_user) - current_user = null - computer.say("Account Reset.") - return TRUE - if("deleteRequest") - if(!current_user) - playsound(computer, 'sound/machines/buzz-sigh.ogg', 20, TRUE) - return TRUE - if(active_request.owner != current_user.account_holder) - playsound(computer, 'sound/machines/buzz-sigh.ogg', 20, TRUE) - return TRUE - computer.say("Deleted current request.") - GLOB.request_list.Remove(active_request) - return TRUE - if("bountyVal") - bounty_value = text2num(params["bountyval"]) - if(!bounty_value) - bounty_value = 1 - if("bountyText") - bounty_text = (params["bountytext"]) - . = TRUE - -/datum/computer_file/program/bounty_board/Destroy() - GLOB.allbountyboards -= computer - . = ..() diff --git a/code/modules/overmap/_overmap_datum.dm b/code/modules/overmap/_overmap_datum.dm index 5244f2850188..66ddd6454a53 100644 --- a/code/modules/overmap/_overmap_datum.dm +++ b/code/modules/overmap/_overmap_datum.dm @@ -414,3 +414,6 @@ dock_to_adjust.forceMove(locate(new_dock_location[1], new_dock_location[2], dock_to_adjust.z)) dock_to_adjust.dheight = new_dheight dock_to_adjust.dwidth = new_dwidth + +/datum/overmap/proc/admin_load() + return diff --git a/code/modules/overmap/objects/dynamic_datum.dm b/code/modules/overmap/objects/dynamic_datum.dm index ad7d5007ca6d..36f1db6f179c 100644 --- a/code/modules/overmap/objects/dynamic_datum.dm +++ b/code/modules/overmap/objects/dynamic_datum.dm @@ -25,6 +25,12 @@ var/force_encounter ///Ruin types to generate var/ruin_type + ///Preditermined ruin made when the overmap is first created + var/selected_ruin + ///Fetched before anything is loaded from the ruin datum + var/dynamic_missions = list() + ///The list of mission pois once the planet has acctually loaded the ruin + var/list/obj/effect/landmark/mission_poi/spawned_mission_pois /// list of ruins and their target turf, indexed by name var/list/ruin_turfs /// list of ruin templates currently spawned on the planet. @@ -53,13 +59,14 @@ /datum/overmap/dynamic/Initialize(position, load_now=TRUE, ...) . = ..() - + SSovermap.dynamic_encounters += src vlevel_height = CONFIG_GET(number/overmap_encounter_size) vlevel_width = CONFIG_GET(number/overmap_encounter_size) if(load_now) choose_level_type(load_now) /datum/overmap/dynamic/Destroy() + SSovermap.dynamic_encounters -= src for(var/obj/docking_port/stationary/dock as anything in reserve_docks) reserve_docks -= dock qdel(dock) @@ -106,19 +113,12 @@ if(length(mapzone?.get_mind_mobs()) || SSlag_switch.measures[DISABLE_PLANETDEL]) return //Dont fuck over stranded people - log_shuttle("[src] [REF(src)] UNLOAD") - var/list/results = SSovermap.get_unused_overmap_square() - overmap_move(results["x"], results["y"]) + for(var/datum/mission/dynamic/dynamic_mission in dynamic_missions) + if(dynamic_mission.active) + return //Dont fuck over people trying to complete a mission. - for(var/obj/docking_port/stationary/dock as anything in reserve_docks) - reserve_docks -= dock - qdel(dock) - reserve_docks = null - if(mapzone) - mapzone.clear_reservation() - QDEL_NULL(mapzone) - choose_level_type() + qdel(src) /** * Chooses a type of level for the dynamic level to use. @@ -130,14 +130,13 @@ probabilities[initial(planet_type.planet)] = initial(planet_type.weight) planet = SSmapping.planet_types[force_encounter ? force_encounter : pick_weight_allow_zero(probabilities)] - - if(planet.planet !=DYNAMIC_WORLD_ASTEROID && planet.planet != DYNAMIC_WORLD_SPACERUIN) //these aren't real planets - planet_name = "[gen_planet_name()]" - Rename(planet_name) - token.name = "[planet_name]" + " ([planet.name])" if(planet.planet == DYNAMIC_WORLD_ASTEROID || planet.planet == DYNAMIC_WORLD_SPACERUIN) Rename(planet.name) token.name = "[planet.name]" + else //these aren't real planets + planet_name = "[gen_planet_name()]" + Rename(planet_name) + token.name = "[planet_name]" + " ([planet.name])" token.icon_state = planet.icon_state token.desc = planet.desc @@ -150,6 +149,13 @@ landing_sound = planet.landing_sound preserve_level = planet.preserve_level //it came to me while I was looking at chickens + // use the ruin type in template if it exists, or pick from ruin list if IT exists; otherwise null + selected_ruin = template || (ruin_type ? pick_weight_allow_zero(SSmapping.ruin_types_probabilities[ruin_type]) : null) + var/datum/map_template/ruin/used_ruin = ispath(selected_ruin) ? (new selected_ruin()) : selected_ruin + if(istype(used_ruin)) + for(var/mission_type in used_ruin.dynamic_mission_types) + dynamic_missions += new mission_type(src, 1 + length(dynamic_missions)) + if(vlevel_height >= 255 && vlevel_width >= 255) //little easter egg planet_name = "LV-[pick(rand(11111,99999))]" token.icon_state = "sector" @@ -191,8 +197,6 @@ loading = TRUE log_shuttle("[src] [REF(src)] LEVEL_INIT") - // use the ruin type in template if it exists, or pick from ruin list if IT exists; otherwise null - var/selected_ruin = template || (ruin_type ? pick_weight_allow_zero(SSmapping.ruin_types_probabilities[ruin_type]) : null) var/list/dynamic_encounter_values = SSovermap.spawn_dynamic_encounter(src, selected_ruin) if(!length(dynamic_encounter_values)) return FALSE @@ -201,10 +205,39 @@ reserve_docks = dynamic_encounter_values[2] ruin_turfs = dynamic_encounter_values[3] spawned_ruins = dynamic_encounter_values[4] + spawned_mission_pois = dynamic_encounter_values[5] + SEND_SIGNAL(src, COMSIG_OVERMAP_LOADED) loading = FALSE return TRUE +/datum/overmap/dynamic/admin_load() + preserve_level = TRUE + message_admins("Generating [src], this may take some time!") + load_level() + + message_admins(span_big("Click here to jump to the overmap token: " + ADMIN_JMP(token))) + message_admins(span_big("Click here to jump to the overmap dock: " + ADMIN_JMP(reserve_docks[1]))) + for(var/ruin in ruin_turfs) + var/turf/ruin_turf = ruin_turfs[ruin] + message_admins(span_big("Click here to jump to \"[ruin]\": " + ADMIN_JMP(ruin_turf))) + +/datum/overmap/dynamic/ui_data(mob/user) + . = ..() + .["active_missions"] = list() + .["inactive_missions"] = list() + for(var/datum/mission/dynamic/mission as anything in dynamic_missions) + if(mission.active) + .["active_missions"] += list(list( + "ref" = REF(mission), + "name" = mission.name, + )) + else + .["inactive_missions"] += list(list( + "ref" = REF(mission), + "name" = mission.name, + )) + /datum/overmap/dynamic/empty name = "Empty Space" diff --git a/code/modules/overmap/objects/outpost/outpost.dm b/code/modules/overmap/objects/outpost/outpost.dm index 01a100022cbf..d06e60094e58 100644 --- a/code/modules/overmap/objects/outpost/outpost.dm +++ b/code/modules/overmap/objects/outpost/outpost.dm @@ -36,12 +36,6 @@ var/datum/map_zone/mapzone var/list/datum/hangar_shaft/shaft_datums = list() - /// The maximum number of missions that may be offered by the outpost at one time. - /// Missions which have been accepted do not count against this limit. - var/max_missions = 15 - /// List of missions that can be accepted at this outpost. Missions which have been accepted are removed from this list. - var/list/datum/mission/missions - /datum/overmap/outpost/Initialize(position, ...) . = ..() // init our template vars with the correct singletons @@ -63,9 +57,6 @@ // doing this after the main level is loaded means that the outpost areas are all renamed for us Rename(gen_outpost_name()) - fill_missions() - addtimer(CALLBACK(src, PROC_REF(fill_missions)), 10 MINUTES, TIMER_STOPPABLE|TIMER_LOOP|TIMER_DELETE_ME) - /datum/overmap/outpost/Destroy(...) // cleanup our data structures. behavior here is currently relatively restrained; may be made more expansive in the future for(var/list/datum/hangar_shaft/h_shaft as anything in shaft_datums) @@ -116,6 +107,9 @@ // Shamelessly cribbed from how Elite: Dangerous does station names. /datum/overmap/outpost/proc/gen_outpost_name() + return "[random_species_name()] [pick(GLOB.station_suffixes)]" + +/proc/random_species_name() var/person_name if(prob(40)) // fun fact: "Hutton" is in last_names @@ -130,14 +124,7 @@ person_name = kepori_name() if(4) person_name = vox_name() - - return "[person_name] [pick(GLOB.station_suffixes)]" - -/datum/overmap/outpost/proc/fill_missions() - while(LAZYLEN(missions) < max_missions) - var/mission_type = get_weighted_mission_type() - var/datum/mission/M = new mission_type(src) - LAZYADD(missions, M) + return person_name /datum/overmap/outpost/proc/load_main_level() if(!main_template) diff --git a/code/modules/overmap/overmap_inspect.dm b/code/modules/overmap/overmap_inspect.dm new file mode 100644 index 000000000000..e0c3ca1fe87e --- /dev/null +++ b/code/modules/overmap/overmap_inspect.dm @@ -0,0 +1,92 @@ +/datum/admins/proc/overmap_view() + set category = "Debug" + set name = "Overmap View" + set desc = "Opens the basic overmap view UI." + + if(!check_rights(R_DEBUG)) + return + + SSovermap.overmap_container_view(usr) + +/datum/overmap/ui_interact(mob/user, datum/tgui/ui) + . = ..() + if(!check_rights(R_DEBUG)) + return + if(user.client) + var/datum/overmap_inspect/overmap_inspect = new(src, user) + overmap_inspect.ui_interact(user) + +/datum/overmap/ui_data(mob/user) + . = list() + . += basic_ui_data() + .["ascii"] = char_rep + .["desc"] = (isobj(token)) ? token.desc : "" + .["x"] = x || docked_to.x + .["y"] = y || docked_to.y + + .["dockedTo"] = list() + if(docked_to) + .["dockedTo"] += docked_to.basic_ui_data() + + .["docked"] = list() + for(var/datum/overmap/docked in contents) + .["docked"] += list(docked.basic_ui_data()) + +/datum/overmap/proc/basic_ui_data() + return list( + "ref" = REF(src), + "name" = name + ) + +/datum/overmap_inspect + var/datum/overmap/focus + var/mob/inspector + +/datum/overmap_inspect/New(datum/overmap/focus, mob/inspector) + . = ..() + src.focus = focus + src.inspector = inspector + RegisterSignal(src.focus, COMSIG_PARENT_QDELETING, PROC_REF(qdel)) + RegisterSignal(src.inspector, COMSIG_PARENT_QDELETING, PROC_REF(qdel)) + +/datum/overmap_inspect/Destroy() + UnregisterSignal(focus, COMSIG_PARENT_QDELETING) + UnregisterSignal(inspector, COMSIG_PARENT_QDELETING) + focus = null + inspector = null + . = ..() + +/datum/overmap_inspect/ui_status(mob/user, datum/ui_state/state) + if(!isdatum(focus)) + return UI_CLOSE + return (ismob(user)) ? UI_INTERACTIVE : UI_CLOSE + +/datum/overmap_inspect/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if (!ui) + ui = new(user, src, "OvermapInspect") + ui.open() + +/datum/overmap_inspect/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + switch(action) + if("inspect") + var/datum/overmap/token = locate(params["ref"]) + if(istype(token, /datum/overmap)) + focus = token + if("load") + if(!check_rights(R_DEBUG)) + return + if(istype(focus, /datum/overmap)) + focus.admin_load() + if("inspect_mission") + var/datum/mission/dynamic/mission = locate(params["ref"]) + if("load_mission") + var/datum/mission/dynamic/mission = locate(params["ref"]) + if(istype(mission, /datum/mission)) + mission.start_mission() + +/datum/overmap_inspect/ui_data(mob/user) + return focus.ui_data(user) diff --git a/code/modules/overmap/overmap_token.dm b/code/modules/overmap/overmap_token.dm index 4d4ca6d23bda..905a2c7b88b3 100644 --- a/code/modules/overmap/overmap_token.dm +++ b/code/modules/overmap/overmap_token.dm @@ -1,5 +1,6 @@ /obj/overmap icon = 'icons/misc/overmap.dmi' + mouse_opacity = 2 ///~~If we need to render a map for cameras and helms for this object~~ basically can you look at and use this as a ship or station. var/render_map = FALSE /// The parent overmap datum for this overmap token that has all of the actual functionality. @@ -46,13 +47,6 @@ QDEL_NULL(cam_background) return ..() -/obj/overmap/attack_ghost(mob/user) - . = ..() - var/turf/jump_to_turf = parent.get_jump_to_turf() - if(!jump_to_turf) - return - user.abstract_move(jump_to_turf) - /obj/overmap/vv_edit_var(var_name, var_value) switch(var_name) if(NAMEOF(src, render_map)) @@ -84,6 +78,7 @@ parent.Rename(var_value) return TRUE return ..() + /** * Updates the screen object, which is displayed on all connected helms */ @@ -101,3 +96,43 @@ cam_background.icon_state = "clear" cam_background.fill_rect(1, 1, size_x, size_y) return TRUE + +/obj/overmap/proc/choose_token(mob/user) + var/nearby_objects = SSovermap.overmap_container[parent.x][parent.y] + if(length(nearby_objects) <= 1) + return src + + var/list/choices_to_options = list() //Dict of object name | dict of object processing settings + var/list/choices = list() + for(var/datum/overmap/nearby_object in nearby_objects) + if(!nearby_object.token) + continue + var/obj/overmap/token = nearby_object.token + var/option_name = token.name + choices_to_options[option_name] = token + choices += list("[option_name]" = image(icon = token.icon, icon_state = token.icon_state)) + + var/picked = show_radial_menu(user, src, choices, radius = 42, require_near = FALSE) + var/obj/overmap/picked_token = choices_to_options[picked] + return picked_token + +/obj/overmap/Click(location, control, params) + var/obj/overmap/token = choose_token(usr) + if(!isobj(token)) + return + if(token.flags_1 & INITIALIZED_1) + SEND_SIGNAL(token, COMSIG_CLICK, location, control, params, usr) + + usr.ClickOn(token, params) + +/obj/overmap/attack_ghost(mob/user) + if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_GHOST, user) & COMPONENT_NO_ATTACK_HAND) + return TRUE + var/turf/jump_to_turf = parent.get_jump_to_turf() + if(!jump_to_turf) + return + user.abstract_move(jump_to_turf) + +/obj/overmap/examine(mob/user) + . = ..() + parent.ui_interact(user) diff --git a/code/modules/overmap/ships/controlled_ship_datum.dm b/code/modules/overmap/ships/controlled_ship_datum.dm index efa4e36026c0..f159557e80e5 100644 --- a/code/modules/overmap/ships/controlled_ship_datum.dm +++ b/code/modules/overmap/ships/controlled_ship_datum.dm @@ -32,11 +32,6 @@ ///Shipwide bank account used for cargo consoles and bounty payouts. var/datum/bank_account/ship/ship_account - /// List of currently-accepted missions. - var/list/datum/mission/missions - /// The maximum number of currently active missions that a ship may take on. - var/max_missions = 2 - /// Manifest list of people on the ship. Indexed by mob REAL NAME. value is JOB INSTANCE var/list/manifest = list() @@ -126,7 +121,6 @@ . = ..() SSovermap.controlled_ships -= src helms.Cut() - QDEL_LIST(missions) LAZYCLEARLIST(owner_candidates) if(!QDELETED(shuttle_port)) shuttle_port.current_ship = null diff --git a/code/modules/overmap/view_overmap_verb.dm b/code/modules/overmap/view_overmap_verb.dm deleted file mode 100644 index 0f844b82c782..000000000000 --- a/code/modules/overmap/view_overmap_verb.dm +++ /dev/null @@ -1,9 +0,0 @@ -/datum/admins/proc/overmap_view() - set category = "Debug" - set name = "Overmap View" - set desc = "Opens the basic overmap view UI." - - if(!check_rights(R_DEBUG)) - return - - SSovermap.overmap_container_view(usr) diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 5ac2370dc694..cfbf587a453e 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -727,7 +727,7 @@ id = "bountyboard_frame" build_type = AUTOLATHE materials = list(/datum/material/iron = 14000, /datum/material/glass = 8000) - build_path = /obj/item/wallframe/bounty_board + build_path = /obj/item/wallframe/bounty_viewer category = list("initial", "Construction") /datum/design/syringe diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index 022292c282b8..af8baad83c59 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -167,6 +167,14 @@ if(owner || !(organ_flags & ORGAN_FAILING)) SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "mindscrew", /datum/mood_event/mindscrew) +/obj/item/organ/cyberimp/brain/datachip + name = "Nanotrasen brain datachip" + desc = "Covered in serial codes and warnings. That data must be important." + +/obj/item/organ/cyberimp/brain/datachip/Insert() + . = ..() + to_chat(owner, span_notice("you feel well versed in the sales of donkpockets and other Donk Co. products")) + //[[[[MOUTH]]]] /obj/item/organ/cyberimp/mouth zone = BODY_ZONE_PRECISE_MOUTH diff --git a/code/modules/tgui/external.dm b/code/modules/tgui/external.dm index de99b3dc1179..5d6030b5ce91 100644 --- a/code/modules/tgui/external.dm +++ b/code/modules/tgui/external.dm @@ -15,7 +15,7 @@ * optional ui datum/tgui The UI to be updated, if it exists. */ /datum/proc/ui_interact(mob/user, datum/tgui/ui) - return FALSE // Not implemented. + return FALSE /** * public @@ -28,7 +28,7 @@ * return list Data to be sent to the UI. */ /datum/proc/ui_data(mob/user) - return list() // Not implemented. + return list() /** * public diff --git a/config/game_options.txt b/config/game_options.txt index 005649a1480c..de3eed4567d4 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -566,16 +566,16 @@ ECONOMY ## Overmap Settings ## ## Put max amount of different event clusters you want to spawn here -MAX_OVERMAP_EVENT_CLUSTERS 6 +MAX_OVERMAP_EVENT_CLUSTERS 10 ## Put the maximum amount of overmap events here -MAX_OVERMAP_EVENTS 50 +MAX_OVERMAP_EVENTS 250 -## Put the maximum amount of dynamic overmap locations here -MAX_OVERMAP_DYNAMIC_EVENTS 10 +## Put the maximum amount of dynamic (runtime loaded) overmap locations here +MAX_OVERMAP_DYNAMIC_EVENTS 100 ## Size of the overmap squared -OVERMAP_SIZE 12 +OVERMAP_SIZE 30 ## Which overmap generator to use ## Valid values are: "random", "solar_system" @@ -584,6 +584,9 @@ OVERMAP_GENERATOR_TYPE solar_system ## Size of overmap encounters, vertical and width with a 3 tile border OVERMAP_ENCOUNTER_SIZE 127 +## Max dynamic mission count +MAX_DYNAMIC_MISSIONS 10 + ## The time required before a ship is allowed to bluespace jump. -1 disables it entirely ## In deciseconds, valid values are -1 to INFINITY BLUESPACE_JUMP_WAIT 12000 diff --git a/icons/effects/mission_poi.dmi b/icons/effects/mission_poi.dmi new file mode 100644 index 000000000000..82de250c3162 Binary files /dev/null and b/icons/effects/mission_poi.dmi differ diff --git a/shiptest.dme b/shiptest.dme index 802166bd74c4..d6ca20530783 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -96,6 +96,7 @@ #include "code\__DEFINES\melee.dm" #include "code\__DEFINES\menu.dm" #include "code\__DEFINES\misc.dm" +#include "code\__DEFINES\mission.dm" #include "code\__DEFINES\mobs.dm" #include "code\__DEFINES\mod.dm" #include "code\__DEFINES\monkeys.dm" @@ -163,8 +164,8 @@ #include "code\__DEFINES\dcs\helpers.dm" #include "code\__DEFINES\dcs\signals\signals.dm" #include "code\__DEFINES\dcs\signals\signals_mod.dm" +#include "code\__DEFINES\dcs\signals\signals_overmap.dm" #include "code\__DEFINES\dcs\signals\signals_reagent.dm" -#include "code\__DEFINES\dcs\signals\signals_ship.dm" #include "code\__DEFINES\dcs\signals\signals_storage.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_carbon.dm" #include "code\__DEFINES\dcs\signals\signals_obj\signals_object.dm" @@ -355,6 +356,7 @@ #include "code\controllers\subsystem\mapping.dm" #include "code\controllers\subsystem\materials.dm" #include "code\controllers\subsystem\metrics.dm" +#include "code\controllers\subsystem\missions.dm" #include "code\controllers\subsystem\mobs.dm" #include "code\controllers\subsystem\moods.dm" #include "code\controllers\subsystem\mouse_entered.dm" @@ -897,7 +899,6 @@ #include "code\game\machinery\autolathe.dm" #include "code\game\machinery\bank_machine.dm" #include "code\game\machinery\beacon.dm" -#include "code\game\machinery\bounty_board.dm" #include "code\game\machinery\buttons.dm" #include "code\game\machinery\cell_charger.dm" #include "code\game\machinery\cloning.dm" @@ -1870,7 +1871,6 @@ #include "code\modules\awaymissions\mission_code\research.dm" #include "code\modules\awaymissions\mission_code\snowdin.dm" #include "code\modules\awaymissions\mission_code\spacebattle.dm" -#include "code\modules\awaymissions\mission_code\undergroundoutpost45.dm" #include "code\modules\balloon_alert\balloon_alert.dm" #include "code\modules\buildmode\bm_mode.dm" #include "code\modules\buildmode\buildmode.dm" @@ -1891,8 +1891,6 @@ #include "code\modules\buildmode\submodes\throwing.dm" #include "code\modules\buildmode\submodes\tweakcomps.dm" #include "code\modules\buildmode\submodes\variable_edit.dm" -#include "code\modules\cargo\bounty.dm" -#include "code\modules\cargo\bounty_console.dm" #include "code\modules\cargo\centcom_podlauncher.dm" #include "code\modules\cargo\console.dm" #include "code\modules\cargo\export_scanner.dm" @@ -1915,19 +1913,6 @@ #include "code\modules\cargo\blackmarket\blackmarket_items\tech.dm" #include "code\modules\cargo\blackmarket\blackmarket_items\tools.dm" #include "code\modules\cargo\blackmarket\blackmarket_items\weapons.dm" -#include "code\modules\cargo\bounties\assistant.dm" -#include "code\modules\cargo\bounties\botany.dm" -#include "code\modules\cargo\bounties\chef.dm" -#include "code\modules\cargo\bounties\engineering.dm" -#include "code\modules\cargo\bounties\item.dm" -#include "code\modules\cargo\bounties\mech.dm" -#include "code\modules\cargo\bounties\medical.dm" -#include "code\modules\cargo\bounties\mining.dm" -#include "code\modules\cargo\bounties\reagent.dm" -#include "code\modules\cargo\bounties\science.dm" -#include "code\modules\cargo\bounties\security.dm" -#include "code\modules\cargo\bounties\special.dm" -#include "code\modules\cargo\bounties\virus.dm" #include "code\modules\cargo\exports\gear.dm" #include "code\modules\cargo\exports\large_objects.dm" #include "code\modules\cargo\exports\lavaland.dm" @@ -2443,6 +2428,14 @@ #include "code\modules\mining\lavaland\ash_flora.dm" #include "code\modules\mining\lavaland\necropolis_chests.dm" #include "code\modules\mining\lavaland\ruins\gym.dm" +#include "code\modules\missions\landmark.dm" +#include "code\modules\missions\mission.dm" +#include "code\modules\missions\mission_board.dm" +#include "code\modules\missions\mission_important_comp.dm" +#include "code\modules\missions\dynamic\_dynamic.dm" +#include "code\modules\missions\dynamic\kill.dm" +#include "code\modules\missions\dynamic\missions.dm" +#include "code\modules\missions\dynamic\signaled.dm" #include "code\modules\mob\death.dm" #include "code\modules\mob\emote.dm" #include "code\modules\mob\inventory.dm" @@ -2907,13 +2900,9 @@ #include "code\modules\overmap\_overmap_datum.dm" #include "code\modules\overmap\docking_ticket.dm" #include "code\modules\overmap\helm.dm" -#include "code\modules\overmap\missions.dm" +#include "code\modules\overmap\overmap_inspect.dm" #include "code\modules\overmap\overmap_token.dm" #include "code\modules\overmap\overmap_turf.dm" -#include "code\modules\overmap\view_overmap_verb.dm" -#include "code\modules\overmap\missions\acquire_mission.dm" -#include "code\modules\overmap\missions\drill_mission.dm" -#include "code\modules\overmap\missions\research_mission.dm" #include "code\modules\overmap\objects\dynamic_datum.dm" #include "code\modules\overmap\objects\event_datum.dm" #include "code\modules\overmap\objects\star.dm" diff --git a/tgui/packages/tgui/interfaces/MissionBoard/index.tsx b/tgui/packages/tgui/interfaces/MissionBoard/index.tsx new file mode 100644 index 000000000000..d229785f395f --- /dev/null +++ b/tgui/packages/tgui/interfaces/MissionBoard/index.tsx @@ -0,0 +1,119 @@ +import { useBackend, useSharedState } from '../../backend'; +import { + ProgressBar, + Section, + Button, + LabeledList, + Box, + AnimatedNumber, +} from '../../components'; +import { Window } from '../../layouts'; + +import { Mission, Data } from './types'; + +export const MissionBoard = (props, context) => { + return ( + + + + + + ); +}; + +export const MissionsContent = (props, context) => { + const { act, data } = useBackend(context); + const { missions, pad, id_inserted } = data; + return ( +
+
+ ); +}; + +const MissionsList = (props, context) => { + const missionsArray = props.missions as Array; + const { act, data } = useBackend(context); + const { pad, id_inserted } = data; + + const missionTimer = (mission: Mission) => ( + + ); + + const missionJSX = missionsArray.map((mission: Mission) => { + const { + ref, + name, + author, + desc, + reward, + faction, + location, + timeIssued, + duration, + canTurnIn, + validItems, + } = mission; + return ( + + + {name} + {location} + {author} + {faction} + {desc} + + Issued: {timeIssued} + {duration && Duration Left: {missionTimer(mission)}} + + + {reward} + + {pad ? ( + + + + {validItems.map((validItem: string) => ( + {validItem} + ))} + + ) : null} + + + ); + }); + + return <>{missionJSX}; +}; diff --git a/tgui/packages/tgui/interfaces/MissionBoard/types.ts b/tgui/packages/tgui/interfaces/MissionBoard/types.ts new file mode 100644 index 000000000000..2d63c4023996 --- /dev/null +++ b/tgui/packages/tgui/interfaces/MissionBoard/types.ts @@ -0,0 +1,27 @@ +export type Data = { + missions: Array; + pad: Boolean; + id_inserted: Boolean; + sending: Boolean; +}; + +export type Mission = { + ref: string; + actStr: string; + name: string; + author: string; + desc: string; + reward: string; + faction: string; + location: string; + x: number; + y: number; + progressStr: string; + timeIssued: string; + remaining: number; + duration: number; + timeStr: string; + canTurnIn: Boolean; + validItems: Array; +}; + diff --git a/tgui/packages/tgui/interfaces/NtosMission.js b/tgui/packages/tgui/interfaces/NtosMission.js new file mode 100644 index 000000000000..847e047aa278 --- /dev/null +++ b/tgui/packages/tgui/interfaces/NtosMission.js @@ -0,0 +1,12 @@ +import { NtosWindow } from '../layouts'; +import { MissionsContent } from './MissionBoard'; + +export const NtosMission = () => { + return ( + + + + + + ); +}; diff --git a/tgui/packages/tgui/interfaces/OutpostCommunications/index.tsx b/tgui/packages/tgui/interfaces/OutpostCommunications/index.tsx index 9a7fecaefb1e..ad94b0aad99f 100644 --- a/tgui/packages/tgui/interfaces/OutpostCommunications/index.tsx +++ b/tgui/packages/tgui/interfaces/OutpostCommunications/index.tsx @@ -11,7 +11,7 @@ import { import { Window } from '../../layouts'; import { CargoCatalog } from './Catalog'; -import { Mission, Data } from './types'; +import { Data } from './types'; export const OutpostCommunications = (props, context) => { const { act, data } = useBackend(context); @@ -34,22 +34,6 @@ export const OutpostCommunications = (props, context) => { Cargo )} - {!!onShip && ( - setTab('shipMissions')} - > - Current Missions - - )} - {!!outpostDocked && ( - setTab('outpostMissions')} - > - Available Missions - - )} @@ -68,10 +52,6 @@ export const OutpostCommunications = (props, context) => { } /> {tab === 'cargo' && } - {tab === 'shipMissions' && !!onShip && } - {tab === 'outpostMissions' && !!outpostDocked && ( - - )} ); @@ -118,97 +98,3 @@ const CargoExpressContent = (props, context) => { ); }; - -const ShipMissionsContent = (props, context) => { - const { data } = useBackend(context); - const { numMissions, maxMissions, outpostDocked, shipMissions } = data; - return ( -
- -
- ); -}; - -const OutpostMissionsContent = (props, context) => { - const { data } = useBackend(context); - const { numMissions, maxMissions, outpostDocked, outpostMissions } = data; - const disabled = numMissions >= maxMissions; - return ( -
- -
- ); -}; - -const MissionsList = (props, context) => { - const showButton = props.showButton as Boolean; - const disabled = props.disabled as Boolean; - const tooltip = props.tooltip as string; - const missionsArray = props.missions as Array; - const { act } = useBackend(context); - // const { numMissions, maxMissions } = data; - - const buttonJSX = (mission: Mission, tooltip: string, disabled: Boolean) => { - return ( - - ); - }; - - const missionValues = (mission: Mission) => ( - - - - {`${mission.value} cr, completed: ${mission.progressStr}`} - - - - - - {mission.timeStr} - - - - - {(showButton && buttonJSX(mission, tooltip, disabled)) || undefined} - - - ); - - const missionJSX = missionsArray.map((mission: Mission) => ( - <> - - {mission.desc} - - - - )); - - return {missionJSX}; -}; diff --git a/tgui/packages/tgui/interfaces/OutpostCommunications/types.ts b/tgui/packages/tgui/interfaces/OutpostCommunications/types.ts index d76af7137ca2..d65d2e3be4c3 100644 --- a/tgui/packages/tgui/interfaces/OutpostCommunications/types.ts +++ b/tgui/packages/tgui/interfaces/OutpostCommunications/types.ts @@ -2,10 +2,6 @@ export type Data = { points: number; outpostDocked: boolean; onShip: boolean; - numMissions: number; - maxMissions: number; - shipMissions: Array; - outpostMissions: Array; beaconZone: string; beaconName: string; hasBeacon: boolean; @@ -14,15 +10,3 @@ export type Data = { printMsg: string; canBuyBeacon: boolean; }; - -export type Mission = { - ref: string; - actStr: string; - name: string; - desc: string; - progressStr: string; - value: number; - remaining: number; - duration: number; - timeStr: string; -}; diff --git a/tgui/packages/tgui/interfaces/OvermapInspect/index.tsx b/tgui/packages/tgui/interfaces/OvermapInspect/index.tsx new file mode 100644 index 000000000000..4bb12a2466c1 --- /dev/null +++ b/tgui/packages/tgui/interfaces/OvermapInspect/index.tsx @@ -0,0 +1,120 @@ +import { useBackend, useLocalState } from '../../backend'; + +import { + Button, + Box, + Divider, + Flex, + Icon, + Input, + Section, + LabeledList, + ProgressBar, + AnimatedNumber, +} from '../../components'; +import { ButtonInput } from '../../components/Button'; +import { Window } from '../../layouts'; + +export type OvermapData = { + ref: string; + name: string; + ascii: string; + desc: string; + x: number; + y: number; + dockedTo: NameAndRef; + docked: NameAndRef[]; + active_missions: NameAndRef[] | null; + inactive_missions: NameAndRef[] | null; +}; + +type NameAndRef = { + name: string; + ref: string; +}; + +export const OvermapInspect = (props, context) => { + const { act, data } = useBackend(context); + const { name, ascii, desc, x, y, dockedTo, docked = [] } = data; + + return ( + + +
act('load')}>Load} + > + + + X + + /Y + + + {desc} + {dockedTo.ref && ( + + + {dockedTo.name}{' '} + + + + )} + {docked.length != 0 && ( + + {docked.map((docked_datum) => ( + + {docked_datum.name}{' '} + + + ))} + + )} + + {data.active_missions?.map((mission) => ( + + {mission.name}{' '} + + + ))} + + + {data.inactive_missions?.map((mission) => ( + + {mission.name}{' '} + + + ))} + + +
+
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/OvermapTokenManager.tsx b/tgui/packages/tgui/interfaces/OvermapTokenManager.tsx index a5870a83eca4..2879c6cb25c9 100644 --- a/tgui/packages/tgui/interfaces/OvermapTokenManager.tsx +++ b/tgui/packages/tgui/interfaces/OvermapTokenManager.tsx @@ -28,7 +28,9 @@ type OvermapDatumData = { type OvermapTokenManagerData = Record; enum DatumType { + outpost = '/datum/overmap/outpost', ship = '/datum/overmap/ship', + dynamic = '/datum/overmap/dynamic', event = '/datum/overmap/event', star = '/datum/overmap/star', all = '***', @@ -36,8 +38,12 @@ enum DatumType { const tokenTypeToName = (type: DatumType) => { switch (type) { + case DatumType.outpost: + return 'Outpost'; case DatumType.ship: return 'Ship'; + case DatumType.dynamic: + return 'Dynamic Event'; case DatumType.event: return 'Event'; case DatumType.star: