Files
Bubberstation/code/datums/components/simple_bodycam.dm
Jacquerel f47733d0e3 Final Objective: Battle Royale (#82258)
## About The Pull Request

Adds a new final objective option with a classic premise; the forced
battle to the death.
The concept is that the Syndicate will provide you with an implanter
tool you can use on an arbitrary number of crew members. Once you have
at least 6 (though there is no ceiling) you can activate the implants to
start the Battle Royale and broadcast the perspectives of everyone you
implanted live to the entertainment monitor.

After activation these implants cause you to explode upon death. If at
the end of 10 minutes, more than one person remains unexploded then all
of the remaining implants will detonate simultaneously.
Additionally, one of the station's departments (Medbay, Cargo, Science,
or Engineering) will be chosen as the arena. If after 5 minutes pass
you're not within that department (or if you leave it after that time
has passed) then you will be killed.

The Syndicate plan on both using the recorded footage to study
Nanotrasen technology, and also to sell it as an underground blood
sport, and so have employed a pirate broadcasting station to provide
colour commentary.

The implantation is silent, however it requires you and your target to
be adjacent and stood still for one and a half seconds.
Once implanted, it will occasionally itch and eventually signal to the
implantee that something is up, so once you start implanting someone
you're on a soft timer until you are given away. You can also implant
yourself if you want to do that for some reason.

Removing an implant from someone has a 70% chance of setting it off
instantly, but it _is_ possible. If the implant is exposed to EMP, this
value is randomised between 0 and 100%. You could also try doing surgery
while the patient is wearing a bomb suit or something, that puzzle is
for you to solve and I'm not going to tell you the answers. I'm sure
you'll think of ones I haven't.

## Why It's Good For The Game

Adds a somewhat more down-to-earth but still hopefully exciting and
threatening option which should let people mess around with the sandbox.
The mutual death element provides some roleplaying prompts; nothing
actually _forces_ you to fight apart from fear of death and it may be
possible to find other ways to survive, or perform some kind of
solidarity behaviour with your fellow contestants. Maybe you'll try that
but one of your fellow contestants just wants to be the last survivor
anyway. Maybe you'll pretend you're setting up some kind of mutual
survivorship thing in order to make sure you're the sole survivor.
Gives some people to watch on the bar TV channel.
The crew apparently love playing Deathmatch while dead so we might as
well enable doing it while alive.

Also I'm going to follow this up with a separate PR to remove the Space
Dragon objective and it felt like it'd be a good idea to do one out one
in

## Changelog

🆑
add: Adds a new Final Objective where you force your fellow crew to
fight to the death on pain of... death.
/🆑
2024-04-07 16:37:40 -07:00

70 lines
2.0 KiB
Plaintext

/// Simple component to integrate a bodycam into a mob
/datum/component/simple_bodycam
dupe_mode = COMPONENT_DUPE_SELECTIVE
/// The actual camera, in our mob's contents
VAR_PRIVATE/obj/machinery/camera/bodycam
/// How fast we update
var/camera_update_time = 0.5 SECONDS
/datum/component/simple_bodycam/Initialize(
camera_name = "bodycam",
c_tag = capitalize(camera_name),
network = "ss13",
emp_proof = FALSE,
camera_update_time = 0.5 SECONDS,
)
if(!isliving(parent))
return COMPONENT_INCOMPATIBLE
src.camera_update_time = camera_update_time
bodycam = new(parent)
bodycam.network = list(network)
bodycam.name = camera_name
bodycam.c_tag = c_tag
if(emp_proof)
bodycam.AddElement(/datum/element/empprotection, EMP_PROTECT_ALL)
RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(update_cam))
RegisterSignal(parent, COMSIG_ATOM_DIR_CHANGE, PROC_REF(rotate_cam))
RegisterSignals(bodycam, list(COMSIG_QDELETING, COMSIG_MOVABLE_MOVED), PROC_REF(camera_gone))
do_update_cam()
/datum/component/simple_bodycam/Destroy()
if(QDELETED(bodycam))
bodycam = null
else
QDEL_NULL(bodycam)
return ..()
/datum/component/simple_bodycam/CheckDupeComponent(
datum/component/simple_bodycam/new_bodycam, // will be null
camera_name,
c_tag,
network = "ss13",
emp_proof,
camera_update_time,
)
// Dupes are only allowed if we don't have a camera on that network already
return (network in bodycam.network)
/datum/component/simple_bodycam/proc/update_cam(datum/source, atom/old_loc, ...)
SIGNAL_HANDLER
if(get_turf(old_loc) != get_turf(parent))
do_update_cam()
/datum/component/simple_bodycam/proc/do_update_cam()
GLOB.cameranet.updatePortableCamera(bodycam, camera_update_time)
/datum/component/simple_bodycam/proc/rotate_cam(datum/source, old_dir, new_dir)
SIGNAL_HANDLER
// I don't actually think cameras care about dir but just in case
bodycam.setDir(new_dir)
/datum/component/simple_bodycam/proc/camera_gone(datum/source)
SIGNAL_HANDLER
if (!QDELETED(src))
qdel(src)