From 0a693b9dfad8f361ae1ae1937903fec32e27f75c Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Fri, 22 Mar 2024 17:17:51 +0100 Subject: [PATCH] [MIRROR] Bitrunning 1.5: Secondary Objectives (#26821) * Bitrunning 1.5: Secondary Objectives (#81828) ## About The Pull Request Added secondary objective lockboxes to bitrunning. These pull from a list of secondary objective loot on the domain, with a limited quantity of items. Once there are no items left to pull, the secondary objective disappears. If multiple secondary objective markers are placed, they will be placed until all markers have been used, or all the items in the loot pool are already spoken for. To support this functionality, adds SSbitrunning, which stores all domains as instances, instead of checking the hardcoded types as previously. SSbitrunning manages listing domains for the quantum console, and rolling secondary loot. As an example of this functionality, added a side path to Glacier Grind with a polar bear and some loot. ## Why It's Good For The Game Secondary objectives give mappers ways to encourage players to venture into a wider range of domains by offering non-trivial loot beyond the fluff items given in the main caches. The absolute limit on the number of items available ensures these items can't be farmed. As well as supporting secondary objectives, SSbitrunning allows for future support of features relying on mid-round modification of domains, for instance adding custom domains. ## Changelog :cl: add: Added secondary objectives to bitrunning! add: Pick up encrypted curiosities and return them to the safehouse to claim their contents. add: Glacier Grind has been given a secondary objective, look out for the limited edition hat. add: Bitrunning domains can now be modified during the round by admins. /:cl: * Bitrunning 1.5: Secondary Objectives * Update virtual_domain.dm --------- Co-authored-by: Thunder12345 Co-authored-by: Pinta <68373373+softcerv@users.noreply.github.com> --- _maps/virtual_domains/stairs_and_cliffs.dmm | 161 ++++++++++-------- code/__DEFINES/access.dm | 5 + code/controllers/subsystem/bitrunning.dm | 60 +++++++ code/modules/bitrunning/objects/byteforge.dm | 2 +- code/modules/bitrunning/objects/landmarks.dm | 5 + code/modules/bitrunning/objects/loot_box.dm | 53 ++++++ code/modules/bitrunning/objects/loot_crate.dm | 16 +- .../bitrunning/objects/quantum_console.dm | 2 +- code/modules/bitrunning/server/_parent.dm | 6 - code/modules/bitrunning/server/loot.dm | 9 + .../modules/bitrunning/server/map_handling.dm | 21 ++- .../bitrunning/server/obj_generation.dm | 20 +++ .../bitrunning/server/signal_handlers.dm | 4 + code/modules/bitrunning/server/util.dm | 24 --- .../virtual_domain/domains/abductor_ship.dm | 2 +- .../virtual_domain/domains/beach_bar.dm | 2 +- .../virtual_domain/domains/bubblegum.dm | 2 +- .../virtual_domain/domains/clown_planet.dm | 2 +- .../virtual_domain/domains/pipedream.dm | 2 +- .../virtual_domain/domains/psyker_zombies.dm | 2 +- .../domains/stairs_and_cliffs.dm | 3 +- .../domains/syndicate_assault.dm | 2 +- .../virtual_domain/domains/vaporwave.dm | 2 +- .../virtual_domain/domains/xeno_nest.dm | 2 +- .../virtual_domain/virtual_domain.dm | 6 +- code/modules/clothing/head/hat.dm | 7 + .../living/basic/space_fauna/bear/_bear.dm | 6 + code/modules/unit_tests/bitrunning.dm | 4 +- icons/mob/clothing/head/costume.dmi | Bin 56667 -> 57134 bytes .../inhands/equipment/briefcase_lefthand.dmi | Bin 607 -> 766 bytes .../inhands/equipment/briefcase_righthand.dmi | Bin 603 -> 766 bytes icons/obj/clothing/head/costume.dmi | Bin 32167 -> 32667 bytes icons/obj/storage/case.dmi | Bin 3322 -> 1989 bytes .../ancient_milsim/virtual_domain.dm | 2 +- tgstation.dme | 2 + .../tgui/interfaces/QuantumConsole.tsx | 16 +- 36 files changed, 327 insertions(+), 125 deletions(-) create mode 100644 code/controllers/subsystem/bitrunning.dm create mode 100644 code/modules/bitrunning/objects/loot_box.dm diff --git a/_maps/virtual_domains/stairs_and_cliffs.dmm b/_maps/virtual_domains/stairs_and_cliffs.dmm index 3c9e0711e02..accdf93bf00 100644 --- a/_maps/virtual_domains/stairs_and_cliffs.dmm +++ b/_maps/virtual_domains/stairs_and_cliffs.dmm @@ -5,6 +5,10 @@ }, /turf/open/cliff/snowrock/virtual_domain, /area/icemoon/underground/explored/virtual_domain) +"bU" = ( +/mob/living/basic/bear/snow/ancient, +/turf/open/misc/asteroid/snow, +/area/icemoon/underground/explored/virtual_domain) "cu" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 4 @@ -19,6 +23,10 @@ /obj/structure/chair/sofa/bench, /turf/open/floor/plating/snowed/smoothed, /area/icemoon/underground/explored/virtual_domain) +"cS" = ( +/obj/structure/barricade/wooden/snowed, +/turf/open/floor/iron/stairs, +/area/icemoon/underground/explored/virtual_domain) "dR" = ( /turf/open/misc/asteroid/snow, /area/icemoon/underground/explored/virtual_domain) @@ -34,6 +42,14 @@ /obj/structure/railing/corner, /turf/open/cliff/snowrock/virtual_domain, /area/icemoon/underground/explored/virtual_domain) +"gF" = ( +/obj/effect/landmark/bitrunning/curiosity_spawn, +/turf/open/misc/asteroid/snow, +/area/icemoon/underground/explored/virtual_domain) +"gY" = ( +/obj/effect/decal/remains/human, +/turf/open/misc/asteroid/snow, +/area/icemoon/underground/explored/virtual_domain) "hc" = ( /obj/structure/railing/corner/end{ dir = 8 @@ -65,6 +81,10 @@ /obj/structure/flora/tree/pine/style_random, /turf/open/misc/asteroid/snow, /area/icemoon/underground/explored/virtual_domain) +"mr" = ( +/obj/structure/fluff/fokoff_sign, +/turf/open/misc/asteroid/snow, +/area/icemoon/underground/explored/virtual_domain) "mx" = ( /obj/structure/railing, /obj/structure/railing{ @@ -86,6 +106,13 @@ }, /turf/open/floor/wood, /area/icemoon/underground/explored/virtual_domain) +"nY" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing, +/turf/open/floor/wood, +/area/icemoon/underground/explored/virtual_domain) "pl" = ( /obj/structure/bonfire/prelit, /turf/open/misc/asteroid/snow, @@ -597,10 +624,10 @@ dR dR dR dR -sM -sM -sM -sM +Nv +Nv +Nv +dR sM sM sM @@ -672,23 +699,23 @@ Qv Qv kK sw -dR +gY dR sM sM sM +dR +cS +Nv +Nv +dR +dR +sw sM sM sM -sM -sM -sM -sM -sM -sM -sM -sM -sM +qc +gF sM sM sM @@ -754,18 +781,18 @@ dR sM sM sM +sa sM sM +gY +dR +dR +sa +dR sM sM -sM -sM -sM -sM -sM -sM -sM -sM +Dz +dR sM sM sM @@ -827,21 +854,21 @@ Qv eB sw dR +mr +sM +sM +sM +sM +sM +sM +mr +sa dR +dR +gY sM sM -sM -sM -sM -sM -sM -sM -sM -sM -sM -sM -sM -sM +nY sM sM sM @@ -901,24 +928,24 @@ Am Am Qv Qv -dR +mr eB dR -sw +dR dR sM sM sM sM sM -sM -sM -sM -sM -sM -sM -sM -sM +kK +dR +bU +dR +dR +cS +Nv +hc sM sM sM @@ -989,10 +1016,10 @@ sM sM sM sM -sM -sM -sM -sM +dR +sa +gY +dR sM sM sM @@ -1063,13 +1090,13 @@ dR sM sM sM +pL sM sM -sM -sM -sM -sM -sM +sw +dR +dR +sa sM sM sM @@ -1140,13 +1167,13 @@ sM sM sM sM +pL +pL sM sM -sM -sM -sM -sM -sM +dR +dR +sw sM sM sM @@ -1217,8 +1244,8 @@ sM sM sM sM -sM -sM +pL +pL sM sM sM @@ -1295,11 +1322,11 @@ sM sM sM sM -sM -sM -sM -sM -sM +pL +pL +pL +pL +pL sM sM sM @@ -1373,8 +1400,8 @@ sM sM sM sM -sM -sM +pL +pL sM sM sM diff --git a/code/__DEFINES/access.dm b/code/__DEFINES/access.dm index 08c06ebcc73..381fe5eef79 100644 --- a/code/__DEFINES/access.dm +++ b/code/__DEFINES/access.dm @@ -193,6 +193,11 @@ /// HUNTERS #define ACCESS_HUNTER "hunter" +/// - - - MISC - - - + // These don't really fit anywhere else +/// For things that aren't ever supposed to be accessed +#define ACCESS_INACCESSIBLE "inaccessible" + /// - - - END ACCESS IDS - - - /// A list of access levels that, when added to an ID card, will warn admins. diff --git a/code/controllers/subsystem/bitrunning.dm b/code/controllers/subsystem/bitrunning.dm new file mode 100644 index 00000000000..2b303911e42 --- /dev/null +++ b/code/controllers/subsystem/bitrunning.dm @@ -0,0 +1,60 @@ +#define REDACTED "???" + +SUBSYSTEM_DEF(bitrunning) + name = "Bitrunning" + flags = SS_NO_FIRE + + var/list/all_domains = list() + +/datum/controller/subsystem/bitrunning/Initialize() + InitializeDomains() + return SS_INIT_SUCCESS + +/datum/controller/subsystem/bitrunning/proc/InitializeDomains() + for(var/path in subtypesof(/datum/lazy_template/virtual_domain)) + all_domains += new path() + +/// Compiles a list of available domains. +/datum/controller/subsystem/bitrunning/proc/get_available_domains(scanner_tier, points) + var/list/levels = list() + + for(var/datum/lazy_template/virtual_domain/domain as anything in all_domains) + if(domain.test_only) + continue + var/can_view = domain.difficulty < scanner_tier && domain.cost <= points + 5 + var/can_view_reward = domain.difficulty < (scanner_tier + 1) && domain.cost <= points + 3 + + levels += list(list( + "cost" = domain.cost, + "desc" = can_view ? domain.desc : "Limited scanning capabilities. Cannot infer domain details.", + "difficulty" = domain.difficulty, + "id" = domain.key, + "is_modular" = domain.is_modular, + "has_secondary_objectives" = assoc_value_sum(domain.secondary_loot) ? TRUE : FALSE, + "name" = can_view ? domain.name : REDACTED, + "reward" = can_view_reward ? domain.reward_points : REDACTED, + )) + + return levels + +/datum/controller/subsystem/bitrunning/proc/pick_secondary_loot(completed_domain) + var/datum/lazy_template/virtual_domain/domain = completed_domain + var/choice + + if(assoc_value_sum(domain.secondary_loot)) + choice = pick_weight(domain.secondary_loot) + domain.secondary_loot[choice] -= 1 + else + choice = /obj/item/paper/paperslip/bitrunning_error + CRASH("Virtual domain [domain.name] tried to pick secondary objective loot, but secondary_loot list was empty.") + return choice + +/obj/item/paper/paperslip/bitrunning_error + name = "Apology Letter" + desc = "Something went wrong here." + +/obj/item/paper/paperslip/bitrunning_error/Initialize(mapload) + default_raw_text = "Your reward for collecting the encrypted curiosity failed to arrive, please report this to technical support." + return ..() + +#undef REDACTED diff --git a/code/modules/bitrunning/objects/byteforge.dm b/code/modules/bitrunning/objects/byteforge.dm index 5f089bf66ca..f8212b7666b 100644 --- a/code/modules/bitrunning/objects/byteforge.dm +++ b/code/modules/bitrunning/objects/byteforge.dm @@ -63,5 +63,5 @@ /obj/machinery/byteforge/proc/start_to_spawn(obj/cache) flicker() - addtimer(CALLBACK(src, PROC_REF(spawn_cache), cache), 1 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE) + addtimer(CALLBACK(src, PROC_REF(spawn_cache), cache), 1 SECONDS) diff --git a/code/modules/bitrunning/objects/landmarks.dm b/code/modules/bitrunning/objects/landmarks.dm index 3a90939dae1..3b38493edff 100644 --- a/code/modules/bitrunning/objects/landmarks.dm +++ b/code/modules/bitrunning/objects/landmarks.dm @@ -22,6 +22,11 @@ name = "Bitrunning crate spawn" icon_state = "crate" +/// Where you want secondary objectives to spawn +/obj/effect/landmark/bitrunning/curiosity_spawn + name = "Bitrunning curiosity spawn" + icon_state = "crate" + ///Swaps the locations of an encrypted crate in the area with another randomly selected crate. ///Randomizes names, so you have to inspect crates manually. /obj/effect/landmark/bitrunning/crate_replacer diff --git a/code/modules/bitrunning/objects/loot_box.dm b/code/modules/bitrunning/objects/loot_box.dm new file mode 100644 index 00000000000..39209c33d97 --- /dev/null +++ b/code/modules/bitrunning/objects/loot_box.dm @@ -0,0 +1,53 @@ +/obj/item/storage/lockbox/bitrunning + name = "base class curiosity" + desc = "Talk to a coder." + req_access = list(ACCESS_INACCESSIBLE) + icon_state = "bitrunning+l" + inhand_icon_state = "bitrunning" + base_icon_state = "bitrunning" + icon_locked = "bitrunning+l" + icon_closed = "bitrunning" + icon_broken = "bitrunning+b" + +/obj/item/storage/lockbox/bitrunning/encrypted + name = "encrypted curiosity" + desc = "Needs to be decrypted at the safehouse to be opened." + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + /// Path for the loot we are assigned + var/loot_path + +/obj/item/storage/lockbox/bitrunning/encrypted/emag_act(mob/user, obj/item/card/emag/emag_card) + return FALSE + +/obj/item/storage/lockbox/bitrunning/decrypted + name = "decrypted curiosity" + desc = "Compiled from the virtual domain. An extra reward of a successful bitrunner." + /// What virtual domain did we come from. + var/datum/lazy_template/virtual_domain/source_domain + +/obj/item/storage/lockbox/bitrunning/decrypted/Initialize( + mapload, + datum/lazy_template/virtual_domain/completed_domain, + ) + + if(isnull(completed_domain)) + log_runtime("Decrypted curiosity was created with no source domain.") + return INITIALIZE_HINT_QDEL + + if(!istype(completed_domain, /datum/lazy_template/virtual_domain)) // Check if this is a proper virtual domain before doing anything with it + log_runtime("Decrypted curiosity was created with an invalid source domain. [completed_domain.name] ([completed_domain.type]).") + return INITIALIZE_HINT_QDEL + + source_domain = completed_domain + + . = ..() + atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL + atom_storage.max_slots = 1 + atom_storage.max_total_storage = 3 + atom_storage.locked = STORAGE_NOT_LOCKED + icon_state = icon_closed + playsound(src, 'sound/magic/blink.ogg', 50, TRUE) + +/obj/item/storage/lockbox/bitrunning/decrypted/PopulateContents() + var/choice = SSbitrunning.pick_secondary_loot(source_domain) + new choice(src) diff --git a/code/modules/bitrunning/objects/loot_crate.dm b/code/modules/bitrunning/objects/loot_crate.dm index a0a74ecb4b9..db3f927e021 100644 --- a/code/modules/bitrunning/objects/loot_crate.dm +++ b/code/modules/bitrunning/objects/loot_crate.dm @@ -42,11 +42,11 @@ if(isnull(completed_domain)) return - PopulateContents(completed_domain.reward_points, completed_domain.extra_loot, rewards_multiplier) + PopulateContents(completed_domain.reward_points, completed_domain.completion_loot, rewards_multiplier) -/obj/structure/closet/crate/secure/bitrunning/decrypted/PopulateContents(reward_points, list/extra_loot, rewards_multiplier) +/obj/structure/closet/crate/secure/bitrunning/decrypted/PopulateContents(reward_points, list/completion_loot, rewards_multiplier) . = ..() - spawn_loot(extra_loot) + spawn_loot(completion_loot) new /obj/item/stack/ore/iron(src, calculate_loot(reward_points, rewards_multiplier, ORE_MULTIPLIER_IRON)) new /obj/item/stack/ore/glass(src, calculate_loot(reward_points, rewards_multiplier, ORE_MULTIPLIER_GLASS)) @@ -70,16 +70,16 @@ var/random_sum = (rand() + 0.5) * base return ROUND_UP(random_sum * ore_multiplier) -/// Handles spawning extra loot. This tries to handle bad flat and assoc lists -/obj/structure/closet/crate/secure/bitrunning/decrypted/proc/spawn_loot(list/extra_loot) - for(var/path in extra_loot) +/// Handles spawning completion loot. This tries to handle bad flat and assoc lists +/obj/structure/closet/crate/secure/bitrunning/decrypted/proc/spawn_loot(list/completion_loot) + for(var/path in completion_loot) if(!ispath(path)) return FALSE - if(isnull(extra_loot[path])) + if(isnull(completion_loot[path])) return FALSE - for(var/i in 1 to extra_loot[path]) + for(var/i in 1 to completion_loot[path]) new path(src) return TRUE diff --git a/code/modules/bitrunning/objects/quantum_console.dm b/code/modules/bitrunning/objects/quantum_console.dm index 71d7df87f12..6cc8aef6dae 100644 --- a/code/modules/bitrunning/objects/quantum_console.dm +++ b/code/modules/bitrunning/objects/quantum_console.dm @@ -56,7 +56,7 @@ if(isnull(server)) return data - data["available_domains"] = server.get_available_domains() + data["available_domains"] = SSbitrunning.get_available_domains(server.scanner_tier, server.points) data["avatars"] = server.get_avatar_data() return data diff --git a/code/modules/bitrunning/server/_parent.dm b/code/modules/bitrunning/server/_parent.dm index 62e20367190..f3f71376897 100644 --- a/code/modules/bitrunning/server/_parent.dm +++ b/code/modules/bitrunning/server/_parent.dm @@ -20,8 +20,6 @@ var/is_ready = TRUE /// Chance multipled by threat to spawn a glitch var/glitch_chance = 0.05 - /// List of available domains - var/list/available_domains = list() /// Current plugged in users var/list/datum/weakref/avatar_connection_refs = list() /// Cached list of mutable mobs in zone for cybercops @@ -63,13 +61,9 @@ RegisterSignals(src, list(COMSIG_MACHINERY_BROKEN, COMSIG_MACHINERY_POWER_LOST), PROC_REF(on_broken)) RegisterSignal(src, COMSIG_QDELETING, PROC_REF(on_delete)) - // This further gets sorted in the client by cost so it's random and grouped - available_domains = shuffle(subtypesof(/datum/lazy_template/virtual_domain)) - /obj/machinery/quantum_server/Destroy(force) . = ..() - available_domains.Cut() mutation_candidate_refs.Cut() avatar_connection_refs.Cut() spawned_threat_refs.Cut() diff --git a/code/modules/bitrunning/server/loot.dm b/code/modules/bitrunning/server/loot.dm index 0aab2a86ff4..cb4902abfe3 100644 --- a/code/modules/bitrunning/server/loot.dm +++ b/code/modules/bitrunning/server/loot.dm @@ -40,6 +40,15 @@ chosen_forge.start_to_spawn(reward_cache) return TRUE +/obj/machinery/quantum_server/proc/generate_secondary_loot(obj/curiosity, obj/machinery/byteforge/chosen_forge) + spark_at_location(curiosity) // abracadabra! + qdel(curiosity) // and it's gone! + + var/obj/item/storage/lockbox/bitrunning/decrypted/reward_curiosity = new(src, generated_domain) + + chosen_forge.start_to_spawn(reward_curiosity) + return TRUE + /// Returns the markdown text containing domain completion information /obj/machinery/quantum_server/proc/get_completion_certificate() var/base_points = generated_domain.reward_points diff --git a/code/modules/bitrunning/server/map_handling.dm b/code/modules/bitrunning/server/map_handling.dm index 5018e464d6a..2ddff04fc15 100644 --- a/code/modules/bitrunning/server/map_handling.dm +++ b/code/modules/bitrunning/server/map_handling.dm @@ -67,9 +67,9 @@ /// Initializes a new domain if the given key is valid and the user has enough points /obj/machinery/quantum_server/proc/load_domain(map_key) - for(var/datum/lazy_template/virtual_domain/available as anything in subtypesof(/datum/lazy_template/virtual_domain)) - if(map_key == initial(available.key) && points >= initial(available.cost)) - generated_domain = new available() + for(var/datum/lazy_template/virtual_domain/available in SSbitrunning.all_domains) + if(map_key == available.key && points >= available.cost) + generated_domain = available RegisterSignal(generated_domain, COMSIG_LAZY_TEMPLATE_LOADED, PROC_REF(on_template_loaded)) generated_domain.lazy_load() return TRUE @@ -80,6 +80,7 @@ /obj/machinery/quantum_server/proc/load_map_items() var/turf/goal_turfs = list() var/turf/cache_turfs = list() + var/turf/curiosity_turfs = list() for(var/obj/effect/landmark/bitrunning/thing in GLOB.landmarks_list) if(istype(thing, /obj/effect/landmark/bitrunning/hololadder_spawn)) @@ -100,6 +101,11 @@ qdel(thing) continue + if(istype(thing, /obj/effect/landmark/bitrunning/curiosity_spawn)) + curiosity_turfs += get_turf(thing) + qdel(thing) + continue + if(istype(thing, /obj/effect/landmark/bitrunning/loot_signal)) var/turf/signaler_turf = get_turf(thing) signaler_turf.AddComponent(/datum/component/bitrunning_points, generated_domain) @@ -113,6 +119,13 @@ if(!attempt_spawn_cache(cache_turfs)) return FALSE + while(length(curiosity_turfs)) + var/turf/picked_turf = attempt_spawn_curiosity(curiosity_turfs) + if(!picked_turf) + break + generated_domain.secondary_loot_generated += 1 + curiosity_turfs -= picked_turf + return TRUE /// Stops the current virtual domain and disconnects all users @@ -151,6 +164,8 @@ creature.dust(just_ash = TRUE, force = TRUE) // sometimes mobs just don't die + generated_domain.secondary_loot_generated = 0 + avatar_connection_refs.Cut() exit_turfs = list() generated_domain = null diff --git a/code/modules/bitrunning/server/obj_generation.dm b/code/modules/bitrunning/server/obj_generation.dm index 38fee74d4a8..ab17682fb6f 100644 --- a/code/modules/bitrunning/server/obj_generation.dm +++ b/code/modules/bitrunning/server/obj_generation.dm @@ -15,6 +15,26 @@ new /obj/structure/closet/crate/secure/bitrunning/encrypted(chosen_turf) return TRUE +/// Attempts to spawn a lootbox +/obj/machinery/quantum_server/proc/attempt_spawn_curiosity(list/possible_turfs) + if(!length(possible_turfs)) // Out of turfs to place a curiosity + return FALSE + + if(generated_domain.secondary_loot_generated >= assoc_value_sum(generated_domain.secondary_loot)) // Out of curiosities to place + return FALSE + + shuffle_inplace(possible_turfs) + var/turf/chosen_turf = validate_turf(pick(possible_turfs)) + + if(isnull(chosen_turf)) + possible_turfs.Remove(chosen_turf) + chosen_turf = validate_turf(pick(possible_turfs)) + if(isnull(chosen_turf)) + CRASH("vdom: after two attempts, could not find a valid turf for curiosity") + + new /obj/item/storage/lockbox/bitrunning/encrypted(chosen_turf) + return chosen_turf + /// Generates a new avatar for the bitrunner. /obj/machinery/quantum_server/proc/generate_avatar(obj/structure/hololadder/wayout, datum/outfit/netsuit) var/mob/living/carbon/human/avatar = new(wayout.loc) diff --git a/code/modules/bitrunning/server/signal_handlers.dm b/code/modules/bitrunning/server/signal_handlers.dm index 81db7a5b9b0..0e5e949e8bb 100644 --- a/code/modules/bitrunning/server/signal_handlers.dm +++ b/code/modules/bitrunning/server/signal_handlers.dm @@ -47,6 +47,10 @@ generate_loot(arrived, chosen_forge) return + if(istype(arrived, /obj/item/storage/lockbox/bitrunning/encrypted)) + generate_secondary_loot(arrived, chosen_forge, generated_domain) + return + /// Handles examining the server. Shows cooldown time and efficiency. /obj/machinery/quantum_server/proc/on_goal_turf_examined(datum/source, mob/examiner, list/examine_text) SIGNAL_HANDLER diff --git a/code/modules/bitrunning/server/util.dm b/code/modules/bitrunning/server/util.dm index a6069d45e90..24ed78210cf 100644 --- a/code/modules/bitrunning/server/util.dm +++ b/code/modules/bitrunning/server/util.dm @@ -1,4 +1,3 @@ -#define REDACTED "???" #define MAX_DISTANCE 4 // How far crates can spawn from the server /// Resets the cooldown state and updates icons @@ -7,28 +6,6 @@ update_appearance() radio.talk_into(src, "Thermal systems within operational parameters. Proceeding to domain configuration.", RADIO_CHANNEL_SUPPLY) -/// Compiles a list of available domains. -/obj/machinery/quantum_server/proc/get_available_domains() - var/list/levels = list() - - for(var/datum/lazy_template/virtual_domain/domain as anything in available_domains) - if(initial(domain.test_only)) - continue - var/can_view = initial(domain.difficulty) < scanner_tier && initial(domain.cost) <= points + 5 - var/can_view_reward = initial(domain.difficulty) < (scanner_tier + 1) && initial(domain.cost) <= points + 3 - - levels += list(list( - "cost" = initial(domain.cost), - "desc" = can_view ? initial(domain.desc) : "Limited scanning capabilities. Cannot infer domain details.", - "difficulty" = initial(domain.difficulty), - "id" = initial(domain.key), - "is_modular" = initial(domain.is_modular), - "name" = can_view ? initial(domain.name) : REDACTED, - "reward" = can_view_reward ? initial(domain.reward_points) : REDACTED, - )) - - return levels - /// If there are hosted minds, attempts to get a list of their current virtual bodies w/ vitals /obj/machinery/quantum_server/proc/get_avatar_data() var/list/hosted_avatars = list() @@ -120,5 +97,4 @@ if(!tile.is_blocked_turf()) return chosen_turf -#undef REDACTED #undef MAX_DISTANCE diff --git a/code/modules/bitrunning/virtual_domain/domains/abductor_ship.dm b/code/modules/bitrunning/virtual_domain/domains/abductor_ship.dm index 6475a20a0c7..55e6d08a147 100644 --- a/code/modules/bitrunning/virtual_domain/domains/abductor_ship.dm +++ b/code/modules/bitrunning/virtual_domain/domains/abductor_ship.dm @@ -3,7 +3,7 @@ cost = BITRUNNER_COST_MEDIUM desc = "Board an abductor ship and take their goodies." difficulty = BITRUNNER_DIFFICULTY_MEDIUM - extra_loot = list(/obj/item/toy/plush/abductor/agent = 1) + completion_loot = list(/obj/item/toy/plush/abductor/agent = 1) help_text = "An abductor mothership unknowingly entered a hostile environment. \ They are currently preparing to escape the area with their gear and loot including \ the crate. Be careful, they are known for their advanced weaponry." diff --git a/code/modules/bitrunning/virtual_domain/domains/beach_bar.dm b/code/modules/bitrunning/virtual_domain/domains/beach_bar.dm index ae00fc56cf7..80f07448b69 100644 --- a/code/modules/bitrunning/virtual_domain/domains/beach_bar.dm +++ b/code/modules/bitrunning/virtual_domain/domains/beach_bar.dm @@ -1,7 +1,7 @@ /datum/lazy_template/virtual_domain/beach_bar name = "Beach Bar" desc = "A cheerful seaside haven where friendly skeletons serve up drinks. Say, how'd you guys get so dead?" - extra_loot = list(/obj/item/toy/beach_ball = 1) + completion_loot = list(/obj/item/toy/beach_ball = 1) help_text = "This place is running on a skeleton crew, and they don't seem to be too keen to share details. \ Maybe a few drinks of liquid charm will get the spirits up. As the saying goes, if you can't beat 'em, join 'em." key = "beach_bar" diff --git a/code/modules/bitrunning/virtual_domain/domains/bubblegum.dm b/code/modules/bitrunning/virtual_domain/domains/bubblegum.dm index f7f58273d89..ab8b282cfbf 100644 --- a/code/modules/bitrunning/virtual_domain/domains/bubblegum.dm +++ b/code/modules/bitrunning/virtual_domain/domains/bubblegum.dm @@ -3,7 +3,7 @@ cost = BITRUNNER_COST_HIGH desc = "King of the slaughter demons. Bubblegum is a massive, hulking beast with a penchant for violence." difficulty = BITRUNNER_DIFFICULTY_HIGH - extra_loot = list(/obj/item/toy/plush/bubbleplush = 1) + completion_loot = list(/obj/item/toy/plush/bubbleplush = 1) forced_outfit = /datum/outfit/job/miner key = "bubblegum" map_name = "bubblegum" diff --git a/code/modules/bitrunning/virtual_domain/domains/clown_planet.dm b/code/modules/bitrunning/virtual_domain/domains/clown_planet.dm index f1bf4468608..3aff298efdb 100644 --- a/code/modules/bitrunning/virtual_domain/domains/clown_planet.dm +++ b/code/modules/bitrunning/virtual_domain/domains/clown_planet.dm @@ -3,7 +3,7 @@ cost = BITRUNNER_COST_LOW desc = "In the deep, dark reaches of space, there is only Honk." difficulty = BITRUNNER_DIFFICULTY_LOW - extra_loot = list(/obj/item/bikehorn = 1) + completion_loot = list(/obj/item/bikehorn = 1) forced_outfit = /datum/outfit/job/clown help_text = "The trials of the Honkitude have begun. The sound of bike horns wailing in the distance. \ this realm- some sort of puzzle, has existed in legend as the final test of just how silly you are." diff --git a/code/modules/bitrunning/virtual_domain/domains/pipedream.dm b/code/modules/bitrunning/virtual_domain/domains/pipedream.dm index 3eb23b94386..595600ce71c 100644 --- a/code/modules/bitrunning/virtual_domain/domains/pipedream.dm +++ b/code/modules/bitrunning/virtual_domain/domains/pipedream.dm @@ -3,7 +3,7 @@ cost = BITRUNNER_COST_LOW desc = "An abandoned and infested factory manufacturing disposal pipes." difficulty = BITRUNNER_DIFFICULTY_LOW - extra_loot = list(/obj/item/stack/pipe_cleaner_coil/random/five = 1) + completion_loot = list(/obj/item/stack/pipe_cleaner_coil/random/five = 1) help_text = "Not long ago, this place was thriving with activity. The workers \ seemed to have left in a hurry, and now productivity is in the bin. Something \ must have trashed the place, but what?" diff --git a/code/modules/bitrunning/virtual_domain/domains/psyker_zombies.dm b/code/modules/bitrunning/virtual_domain/domains/psyker_zombies.dm index 9cb299055dd..2d4d2c5ee36 100644 --- a/code/modules/bitrunning/virtual_domain/domains/psyker_zombies.dm +++ b/code/modules/bitrunning/virtual_domain/domains/psyker_zombies.dm @@ -4,7 +4,7 @@ desc = "Another neglected corner of the virtual world. This one had to be abandoned due to zombie virus. \ Warning -- Virtual domain does not support visual display. This mission must be completed using echolocation." difficulty = BITRUNNER_DIFFICULTY_MEDIUM - extra_loot = list(/obj/item/radio/headset/psyker = 1) //Looks cool, might make your local burdened chaplain happy. + completion_loot = list(/obj/item/radio/headset/psyker = 1) //Looks cool, might make your local burdened chaplain happy. forced_outfit = /datum/outfit/echolocator help_text = "This once-beloved virtual domain has been corrupted by a virus, rendering it unstable, full of holes, and full of ZOMBIES! \ There should be a Mystery Box nearby to help get you armed. Get armed, and finish what the cyber-police started!" diff --git a/code/modules/bitrunning/virtual_domain/domains/stairs_and_cliffs.dm b/code/modules/bitrunning/virtual_domain/domains/stairs_and_cliffs.dm index 1c79d8fd21d..4d100482429 100644 --- a/code/modules/bitrunning/virtual_domain/domains/stairs_and_cliffs.dm +++ b/code/modules/bitrunning/virtual_domain/domains/stairs_and_cliffs.dm @@ -6,7 +6,8 @@ instead of ladders its stairs and instead of snakes its a steep drop down a \ cliff into rough rocks or liquid plasma." difficulty = BITRUNNER_DIFFICULTY_LOW - extra_loot = list(/obj/item/clothing/suit/costume/snowman = 2) + completion_loot = list(/obj/item/clothing/suit/costume/snowman = 2) + secondary_loot = list(/obj/item/clothing/shoes/wheelys/skishoes = 2, /obj/item/clothing/head/costume/ushanka/polar = 1) forced_outfit = /datum/outfit/job/virtual_domain_iceclimber key = "stairs_and_cliffs" map_name = "stairs_and_cliffs" diff --git a/code/modules/bitrunning/virtual_domain/domains/syndicate_assault.dm b/code/modules/bitrunning/virtual_domain/domains/syndicate_assault.dm index 24fa6e5482a..5f754dd433a 100644 --- a/code/modules/bitrunning/virtual_domain/domains/syndicate_assault.dm +++ b/code/modules/bitrunning/virtual_domain/domains/syndicate_assault.dm @@ -3,7 +3,7 @@ cost = BITRUNNER_COST_MEDIUM desc = "Board the enemy ship and recover the stolen cargo." difficulty = BITRUNNER_DIFFICULTY_MEDIUM - extra_loot = list(/obj/item/toy/plush/nukeplushie = 1) + completion_loot = list(/obj/item/toy/plush/nukeplushie = 1) help_text = "A group of Syndicate operatives have stolen valuable cargo from the station. \ They have boarded their ship and are attempting to escape. Infiltrate their ship and recover \ the crate. Be careful, they are extremely armed." diff --git a/code/modules/bitrunning/virtual_domain/domains/vaporwave.dm b/code/modules/bitrunning/virtual_domain/domains/vaporwave.dm index b704441edaa..5da6449ccf9 100644 --- a/code/modules/bitrunning/virtual_domain/domains/vaporwave.dm +++ b/code/modules/bitrunning/virtual_domain/domains/vaporwave.dm @@ -3,7 +3,7 @@ cost = BITRUNNER_COST_EXTREME desc = "Suspended in the silent void of space, the Neon Relic is a haunting echo of a retro-futuristic era. Hang out, enjoy the view." difficulty = BITRUNNER_DIFFICULTY_NONE - extra_loot = list(/obj/item/stack/spacecash/c500 = 4) + completion_loot = list(/obj/item/stack/spacecash/c500 = 4) key = "vaporwave" map_name = "vaporwave" reward_points = BITRUNNER_REWARD_EXTREME diff --git a/code/modules/bitrunning/virtual_domain/domains/xeno_nest.dm b/code/modules/bitrunning/virtual_domain/domains/xeno_nest.dm index ed708d0592c..6b76956eacc 100644 --- a/code/modules/bitrunning/virtual_domain/domains/xeno_nest.dm +++ b/code/modules/bitrunning/virtual_domain/domains/xeno_nest.dm @@ -3,7 +3,7 @@ cost = BITRUNNER_COST_LOW desc = "Our ship scanners have detected lifeforms of unknown origin. Friendly attempts to contact them have failed." difficulty = BITRUNNER_DIFFICULTY_LOW - extra_loot = list(/obj/item/toy/plush/rouny = 1) + completion_loot = list(/obj/item/toy/plush/rouny = 1) help_text = "You are on a barren planet filled with hostile creatures. There is a crate here, not hidden, \ simply protected. Expect resistance." is_modular = TRUE diff --git a/code/modules/bitrunning/virtual_domain/virtual_domain.dm b/code/modules/bitrunning/virtual_domain/virtual_domain.dm index 41e5da8973e..b316bb97cae 100644 --- a/code/modules/bitrunning/virtual_domain/virtual_domain.dm +++ b/code/modules/bitrunning/virtual_domain/virtual_domain.dm @@ -29,7 +29,11 @@ /// Byond will look for modular mob segment landmarks then choose from here at random. You can make them unique also. var/list/datum/modular_mob_segment/mob_modules = list() /// An assoc list of typepath/amount to spawn on completion. Not weighted - the value is the amount - var/list/extra_loot + var/list/completion_loot + /// An accoc list of typepath/amount to spawn from secondary objectives. Not weighted - the value is the total number of items that can be obtained. + var/list/secondary_loot = list() + /// Number of secondary loot boxes generated. Resets when the domain is reloaded. + var/secondary_loot_generated /// Forces all mob modules to only load once var/modular_unique_mobs = FALSE // Name to show in the UI diff --git a/code/modules/clothing/head/hat.dm b/code/modules/clothing/head/hat.dm index 1b65af66d33..33e110efba8 100644 --- a/code/modules/clothing/head/hat.dm +++ b/code/modules/clothing/head/hat.dm @@ -313,6 +313,13 @@ to_chat(user, span_notice("You lower the ear flaps on the ushanka.")) earflaps = !earflaps +/obj/item/clothing/head/costume/ushanka/polar + name = "bear hunter's ushanka" + desc = "Handcrafted in Siberia from real polar bears." + icon_state = "ushankadown_polar" + upsprite = "ushankaup_polar" + downsprite = "ushankadown_polar" + /obj/item/clothing/head/costume/nightcap/blue name = "blue nightcap" desc = "A blue nightcap for all the dreamers and snoozers out there." diff --git a/code/modules/mob/living/basic/space_fauna/bear/_bear.dm b/code/modules/mob/living/basic/space_fauna/bear/_bear.dm index e23e022d00e..eef08b30197 100644 --- a/code/modules/mob/living/basic/space_fauna/bear/_bear.dm +++ b/code/modules/mob/living/basic/space_fauna/bear/_bear.dm @@ -82,6 +82,12 @@ icon_dead = "snowbear_dead" desc = "It's a polar bear, in space, but not actually in space." +/mob/living/basic/bear/snow/ancient + name = "ancient polar bear" + desc = "A grizzled old polar bear, its hide thick enough to make it impervious to almost all weapons." + status_flags = CANPUSH | GODMODE + gold_core_spawnable = NO_SPAWN + /mob/living/basic/bear/snow/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_SNOWSTORM_IMMUNE, INNATE_TRAIT) diff --git a/code/modules/unit_tests/bitrunning.dm b/code/modules/unit_tests/bitrunning.dm index 568eeeed8c1..44dd69390af 100644 --- a/code/modules/unit_tests/bitrunning.dm +++ b/code/modules/unit_tests/bitrunning.dm @@ -9,7 +9,7 @@ TEST_ASSERT_NOTNULL(vdom.key, "[path] should have a key") TEST_ASSERT_NOTNULL(vdom.map_name, "[path] should have a map name") - if(!length(vdom.extra_loot)) + if(!length(vdom.completion_loot)) continue - TEST_ASSERT_EQUAL(cache.spawn_loot(vdom.extra_loot), TRUE, "[path] didn't spawn loot. Extra loot should be an associative list") + TEST_ASSERT_EQUAL(cache.spawn_loot(vdom.completion_loot), TRUE, "[path] didn't spawn loot. Completion loot should be an associative list") diff --git a/icons/mob/clothing/head/costume.dmi b/icons/mob/clothing/head/costume.dmi index cddd1f7148d9cc21a7b4da83c912f696c18b6e35..4bce495a291437f7e8a1deae13a695123628079d 100644 GIT binary patch delta 12853 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 diff --git a/icons/mob/inhands/equipment/briefcase_lefthand.dmi b/icons/mob/inhands/equipment/briefcase_lefthand.dmi index 5781ecdc992a778ab111cfc44bb0deac7fecfd29..9eb7d24a3ce12c5622d7a0526c7612ddc0e9a32f 100644 GIT binary patch delta 578 zcmV-I0=@m;1pWn(7Y=|30{{R3^x%>C00018ktIVjCLSkDK}RAbHFQRcsFHA`Zkh}V z5qW4{K|@U=6)NEf{muXY00DGTPE!Ct=GbNc004`TeRO|8bxD~eMWuOpnR)5BlqxH@ z`niC;1ps`TKg)6=6dwQp0k}y-K~#90?bvN^fNmQp~MjiBpwTVc7d%U6xezr1<(QWiEm)?7n3y4hZ}GR z1=j4~~|}F%c0F5fSy8CUp43^N%Rt z(A07QMk%1Cy|xV-fIGm|~x!ppCNYgYo>7#y6w3uGu8-S`RdDe9d Q6951J07*qoM6N<$g286>6951J delta 418 zcmV;T0bTz71>Xda7Y<+u0{{R3;-rdu0000#ktIVF2niIe00001bW%=J06^y0W&i*H zf03JXe=c>(3a)-GV7CGQl$K zN`dr|jQB^-({5mW_YI_?8(3FR01cs4Czs`Tzg` diff --git a/icons/mob/inhands/equipment/briefcase_righthand.dmi b/icons/mob/inhands/equipment/briefcase_righthand.dmi index d48529a54e9eef2bff729ce586f289729739a483..06ed8e2c8eca2e7366cff94b9df28f224fd822ea 100644 GIT binary patch delta 578 zcmV-I0=@m)1pWn(7Y=|30{{R3^x%>C00018ktIVjCLSkDK}RAbHFQRcsFHA`Zkh}V z5qW4{K|@U=6)Nx6X!-yE00DGTPE!Ct=GbNc004`TeRO|8bxD~eMWuOpnR)5BlqxH@ z`niC;1ps`TKg)6=6dwQp0k}y-K~#90?U>tc!Y~j-!<_z&V4eo68uNv@zyf3~(qL6%xilA$ zt&;@Uq)2~JU#+aafo%1w5jiHxTIzajE+AU{Y6KJr8VkI4fsX_z5Hu|n?KE3A39w7k zlEHZXT~;k(qSk>5-<^ml>)^Zs2q>7Z9y}H3A9*O^eNb466j(gf&74A%qY@NT6x5t$tlexplxJ z3Z!zusz%$I3m|Ko2CEufXD%RHyT0@EDCS$%Lfc`mUV&_Fhx26^E@u$q(3a)-GV7CGQl$===~)ZH#zf55bssQ?O8jRpR@z+M3bs^+Dl&9L>L zfGtl`L-6@eSqUM85JCuff*1TKJxtw%Q;PcT0!KYq^*E+*fdsOW9;|va-$3BS#0@>2 zq77_onF@A{$X@FC94=s5%Txdbs>TBUU0_l`fvS0_Xftf({{w^&LI@$`=W$=$V%9Qu zY*HRQ;1vb*VAW%u!v&Ca)`L}#<{P-bp2H>o3F&f){zYP2%T%yqMD|j14i_-3DPMC1 z6sVe)+I|Der*9y)-N3Sh3z*h26+nTid9lr3!&!k#SR!Yrqw=1uK)l507*qo IM6N<$g7q-9CjbBd diff --git a/icons/obj/clothing/head/costume.dmi b/icons/obj/clothing/head/costume.dmi index 9344243d72349d0cd5957bd3e3e47a0ffd235a12..e72c278b6eb3706f33a9d27db113cdfc42b2b342 100644 GIT binary patch delta 13415 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 z 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 delta 12911 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 IW)Sed0N?ZEeEEHFQRc zOhHGAii$x)O{8v`x3;s`%fcfSDx4q;4xAkf3K6K1aKa=72)-3H002ftMpRT(|1&ep z004M+crP(4GygL)%ri_(O!Bb+|I`4}4zPO(XaE2I&d$z;M=gLX94IL*x3{;Ajg3%K zTB8mQ;Naj(OH2C}0I#pFzTN3F{{UoYan#h*aBy%_Q&T)XMAp{Uz`(#7I}r*n08m;{ zWN~EEJdCIS0004WQchCV=-0C=30)Xi?gAPfND zb9f5W9=BFqw;gwxT2(!?uTVLO6RZ%Z4E@>Lk1pzZ+Hk}L&?jTSFx8*y&33O>yRAAS z2l7sT=(qVo6&I?bNrTs=DhyI<;xGsiBBt)7WWuI`fD={J#39YSsG?!$ap?cbfYphm z>|lM>VV%`CR{HCcl}d5MGAm1pd~%LlD_H)4$HdJi(PIr(b^>=QhW?0d6dseWkj`3f z^JOs5qlM6e5C^iU)@3-W$TegmL-c$QJqFJ$ILTey;q2nM`?Gr9(=1x}x;@+H<7E~J~qVzpSP6e<|p;6c$$Q#ZCr(n~YQU|Y&?IX|Q9y8IO+Y4=Qrp@`^Zy-z%6XGs<$x`Ob!@;_H(yJbY3dOTI2$C;K(KD^;C0{OFw@i{ z8t~$0AXqnFSHG_+GhF>4M6av#Zy1wf0+0%O(l5ttK9{_+L+|`|W^* z^biBBcITkew3{6aX%0GVE`p@GfuyoWDTfx&BN=G5S|k9{_y(9jM^fFXkt>x@WIcj` z!#9WRcKZ-R8axmJOr$&UmE0SNuQ8uLOb;?JKg4+V9yL2ZcgP+l%~8|l$`(w2%k;NF z`Z3dwB^^0Yk)7f6cmp9ieMWu@d0s+xw|ii9e(6}+8x`nXtQsL0VdM@jwp@~Mb*h8zwU{6brOJO+ctTPlg2N= z1o~`?^m@IvYF{I61-h{^ z@2gLUfzbLr=8u7Tia$T9^-n{!{?})fsx}Z_zsC$h415eRFdVA&&+!dJsNZWxRez6C zzt@hc{vM@%uN~DXjZ(kYjk5k8p?F9CX*Z5lP8Fz--hY8A)kMHE9!Ftv&}z`|6jENUp!~m*TBl2fjb3r z1NZk24-fYY+7l+wr>njO=3fN(?fdxn=)8wnkDoxFKKgoxFT$OBxx=}E;qd9{X~>{G zVFG>hFsf!13!dkj4rOo;9vO3TI%T@eIVS&riMa5A>aZ*wx|bi-HUd#IDazm1Jii z{t7(5;EV9$UhXi{6^L1%XPGA3#e+M{%s~A5JUhfVR_^WN3^OzkpOrWQ0002M|CE0K X-eVkh(zdZA00000NkvXXu0mjfCAgV; literal 3322 zcmai1c{CL4_s4kcOO{?@WUbMQBCjx*k!+)gkg-IRtzo9IGt5Yfk!6xCWtY8|RAX#2 zDugh0ldUO2OpA;$%?$Z@f9Ll*=X=g~`{Q};xz9c4p8Gua^SSrAY0ge|l443?e0+S8 zFnj9@`?BosB_g!Hr;h~d?TgI>H+YnFVC0pE(Cbm5C?p?WTv6V{E97f^3BJ)t=0O>t z@zKk3=mOC{(aC<6NXDs)6N;w%EnT1|0UhTWT#l!)WI++;#P1BkFtxEoInpYv=M`n9 zpr-8@)eTgjFml$_)Ku|Y@cX2 zVO>Xu!+eFP;`T(iZNqQUj&!*geFEI+*sx%`k9!VcI|Tq1ad-=Dv{q?Xp%mc{F-eZr zJ@|G#u7BKWbaGKBI5psWePMU|+b?J+5%b)TNAKX!NgdBI^t?Zfj70fbwU^)XJI}vN zPClr3;HdyW;NoS=mtqnk@I%1IW3Ges6Wh=9Fb^Ff=qjkh;IVn#-Gc4Ix=OoNuSxs^ ziE_4AjVm`z&e<13qdu7g#siOjm*&ZDX(~4?EjKj{bH>kx2(9ImCu*L`KCa|94z3!2QC*Mc0FEXR;${y_({;qRyUvjFCLxFQqY#LOGAgcSSp~iIc`T#dFqr!1bhc=QE+ro?!5Ohd?49K! zx|NdfhytoGSR#UfdiV4d9#ULf9Pn+vZSljan*sY*s_5+WDS{+<&Db_RC#g?2`F%&I zE{@Y|Uw)gb3KHD1tA>S|oi00bDEjd5GAG|B=Ao-HW+8D>6^iYAYFh?d&KZi9K8LfM zb839vVmhB_(!8GxDb;yUkfYT0N6)peuh*L%CxgE?!t&m17GL=`0JmH9&ouj$YgCgk z-Toqx)dkWRqqm|f57fmhu?QZiP3KcPo{BvCt97e5)jy%#YA#J}E85Q`e~_ui^YMWG zk;G%@v(~J!3+>V6VGR@tq?vm|sKT_oe{1`Za4xgFC9*}E1<1+9U42X2TuJ{1o z*(TA-adx=nx1Fe7vFKmDz`3(e+Em(DDw6%hrCB0|JHo^Fd+Yo@hy1TzMkO76J#-sk zJWk26iC`!Iya2wf*H3?$A=?!)GFP^N=;>%lZ{=sRKW~E>-t60vnUk}sn|6}N44$dOIA_igXQ z01c)wWSkjl>qr#XIe%SF{LH%o1)ih)Co5ftBs;*{o$ERtjq-CO6v4tH?RZ2d#)H^q z{`Fc;i-n3nRdy|Nt&>U+ZDj?n$~9q-Rn_D!W=`#QCH`VxyEHO$k6mRGKr1v{eAj$s zF^gz8w7H8aQt&%o8la2&(M|T8Q$~ve#s5a%M+@v2(er$wthw`p5XlEGcH+wP$E3PP{S7k) z9PaIFPtic(+|}^ywe_CVA=rK=vcO=?`JRNRl)ojAFl^+N_;3jh#}Zu@efuQzJ*X$U zR9arx3lOxN+7a(MIXS7#?5?_SEKvFNHE=upm7?0yMNaEJwWQ>azBNc&t{cm6DUl#;}Qam<-HPQSlXjA&c4t2tnW?^CR21_Io z3j+@xJUGj(Pw2iQDZX>dct5?y680+{T>%ekRJ^v?Nh_Nr9Ks)iUm0%qsvn824WBPO zxlzdupKD2~Cx#WaWY)j0bFCRa4d&;LF?bFhYL3;0CAu{yAI_iqT<}Z!7R9lA>L#R% z5)1$ro(QX~D>G)z&f#RzyEgHjLBqd;lekgg7N0>L^a&fhD$^#=A;ERpl+4M_b6?Sd zN?^!V(|f&(N4{_)R8!V@?PB?<)2+jH{ixic3FAhF^>fn!R2kV?~rR!64`X%MySoSG)j3ZgQ0(g8c7L*lcamXU3Ppp)`Wcw=QG%@>&*Ktb5C7pl zf&X0N|0@`1Ln60JN{=7o>R{WorseZeqf2UZE+)Y%J%FdohS~Tb^Xyus^9CW_mbJOp=HTKUvHT@uuMh%SY z46X({q(CIop2XRA4Qs#qF(QZ|$4{x7DBYuabD`!-=Cy5YGrFM_&t{b7a=X5(btXmvT|e*lAx BWqJSr diff --git a/modular_skyrat/modules/bitrunning/code/virtual_domains/ancient_milsim/virtual_domain.dm b/modular_skyrat/modules/bitrunning/code/virtual_domains/ancient_milsim/virtual_domain.dm index 9d20d537ed9..a6d0843cb16 100644 --- a/modular_skyrat/modules/bitrunning/code/virtual_domains/ancient_milsim/virtual_domain.dm +++ b/modular_skyrat/modules/bitrunning/code/virtual_domains/ancient_milsim/virtual_domain.dm @@ -4,7 +4,7 @@ cost = BITRUNNER_COST_HIGH desc = "Recreate the events of the Border War's 'hot' part-long-gone as a Solarian strike team sweeping CIN compounds; sponsored by the SolFed recreation enthusiasts. \ Multiplayer playthrough and proper preparation highly recommended." - extra_loot = list(/obj/item/bitrunning_disk/item/ancient_milsim = 1) + completion_loot = list(/obj/item/bitrunning_disk/item/ancient_milsim = 1) difficulty = BITRUNNER_DIFFICULTY_HIGH help_text = "The last part of this domain has a chance to be very PvP-centric. It's best if you don't come alone, and smuggle some ability and gear disks." forced_outfit = /datum/outfit/solfed_bitrun diff --git a/tgstation.dme b/tgstation.dme index 8cf1bb15132..3d4cf38d3af 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -710,6 +710,7 @@ #include "code\controllers\subsystem\atoms.dm" #include "code\controllers\subsystem\augury.dm" #include "code\controllers\subsystem\ban_cache.dm" +#include "code\controllers\subsystem\bitrunning.dm" #include "code\controllers\subsystem\blackbox.dm" #include "code\controllers\subsystem\blackmarket.dm" #include "code\controllers\subsystem\chat.dm" @@ -3515,6 +3516,7 @@ #include "code\modules\bitrunning\objects\hololadder.dm" #include "code\modules\bitrunning\objects\host_monitor.dm" #include "code\modules\bitrunning\objects\landmarks.dm" +#include "code\modules\bitrunning\objects\loot_box.dm" #include "code\modules\bitrunning\objects\loot_crate.dm" #include "code\modules\bitrunning\objects\netpod.dm" #include "code\modules\bitrunning\objects\quantum_console.dm" diff --git a/tgui/packages/tgui/interfaces/QuantumConsole.tsx b/tgui/packages/tgui/interfaces/QuantumConsole.tsx index dca8f2dbf15..7d64056307c 100644 --- a/tgui/packages/tgui/interfaces/QuantumConsole.tsx +++ b/tgui/packages/tgui/interfaces/QuantumConsole.tsx @@ -50,6 +50,7 @@ type Domain = { difficulty: number; id: string; is_modular: BooleanLike; + has_secondary_objectives: BooleanLike; name: string; reward: number | string; }; @@ -228,7 +229,16 @@ const AccessView = (props) => { const DomainEntry = (props: DomainEntryProps) => { const { - domain: { cost, desc, difficulty, id, is_modular, name, reward }, + domain: { + cost, + desc, + difficulty, + id, + is_modular, + has_secondary_objectives, + name, + reward, + }, } = props; const { act, data } = useBackend(); if (!isConnected(data)) { @@ -268,6 +278,9 @@ const DomainEntry = (props: DomainEntryProps) => { <> {name} {!!is_modular && name !== '???' && } + {!!has_secondary_objectives && name !== '???' && ( + + )} } > @@ -275,6 +288,7 @@ const DomainEntry = (props: DomainEntryProps) => { {desc} {!!is_modular && ' (Modular)'} + {!!has_secondary_objectives && ' (Secondary Objective Available)'}