Files
Bubberstation/code/datums/components/deployable.dm
Paxilmaniac b52f671be6 Makes bluespace navigation gigabeacons both significantly nicer to use, and significantly cooler (#77223)
## About The Pull Request

"Behold, a navigation beacon" Plato says to the crowd of shocked
onlookers.


![image](https://github.com/tgstation/tgstation/assets/82386923/a8ec22f0-69a0-4ba6-9032-9936031873f0)

What are you looking at here? Navigation beacons have been party
reworked for significantly improved ease of use, and for significantly
cooler functionality.

As it stands, in order to explore space with a ship of some sort, you
have to take the following steps:

Fly to target zlevel
Build a floor
Build a machine frame, then make the beacon out of it
Go back and park your ship

Now, while this doesn't eliminate this process, it makes it a step
shorter and a good bit less annoying to do. There are no gigabeacon
boards, instead a compact beacon can be printed. This can be used inhand
and, after a delay of three seconds, will create a brand new gigabeacon
in front of you with no extra hassle.

So, aside from the sprite (the old one is an alien power core, by the
way), what's new? Just a bit of flavor. Examining a gigabeacon will
mention a radio frequency. If you tune into this radio frequency, then
you might be able to catch the automatic messages the beacons put out
every five minutes. They detail a little bit about the beacon, namely
its coordinates, and if its activate or locked. While not critical info
my any means, it can be good information to have pop up every few
minutes, or for discovering that there are gigabeacons you didn't know
were there before.
## Why It's Good For The Game

Gigabeacons had two big problems, one was that they were pointlessly
annoying to set up, and two was that they didn't have their own sprite.
Yup, they just used a random alien tech structure and nobody said
anything about it. Hopefully this pr fixes both of those problems,
alongside adding a little neat bit of flavor to them in the form of the
automatic radio broadcasts they put every few minutes on a non-standard
channel.
## Changelog
🆑
qol: Gigabeacons no longer need to be constructed like standard
machines, instead being printed as items that can be deployed quickly
inhand without tools.
qol: Gigabeacons are no longer their own research node, instead being a
part of telecomms tech (due to the fact they're RADIO navigation
beacons)
image: Navigation gigabeacons now have their own unique sprites,
inspired by maritime EPIRB devices. If you find a yellow box with an
antenna on it, you probably found a nav beacon!
code: The deployable component now gives you an option to disable the
examine blurb it adds to its parent
/🆑
2023-08-11 19:36:19 -04:00

80 lines
3.2 KiB
Plaintext

/**
* Deployable - Bring your big guns with you, and smack em' down where you want.
*
* Allows items to spawn other items (usually objects) in front of the user after a short delay.
* If attaching this to something:
* Set deploy_time to a number in seconds for the deploy delay
* Set thing_to_be_deployed to an obj path for the thing that gets spawned
* Lastly, set delete_on_use to TRUE or FALSE if you want the object you're deploying with to get deleted when used
*/
/datum/component/deployable
/// The time it takes to deploy the object
var/deploy_time
/// The object that gets spawned if deployed successfully
var/obj/thing_to_be_deployed
/// If the item used to deploy gets deleted on use or not
var/delete_on_use
/// If the component adds a little bit into the parent's description
var/add_description_hint
/// Used in getting the name of the deployed object
var/deployed_name
/datum/component/deployable/Initialize(deploy_time = 5 SECONDS, thing_to_be_deployed, delete_on_use = TRUE, add_description_hint = TRUE)
. = ..()
if(!isitem(parent))
return COMPONENT_INCOMPATIBLE
src.deploy_time = deploy_time
src.thing_to_be_deployed = thing_to_be_deployed
src.delete_on_use = delete_on_use
src.add_description_hint = add_description_hint
if(add_description_hint)
RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(examine))
RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(on_attack_hand))
var/obj/item/typecast = thing_to_be_deployed
deployed_name = initial(typecast.name)
/datum/component/deployable/proc/examine(datum/source, mob/user, list/examine_list)
SIGNAL_HANDLER
examine_list += span_notice("[source.p_they()] look[source.p_s()] like [source.p_they()] can be deployed into \a [deployed_name].")
/datum/component/deployable/proc/on_attack_hand(datum/source, mob/user, location, direction)
SIGNAL_HANDLER
INVOKE_ASYNC(src, PROC_REF(deploy), source, user, location, direction)
/datum/component/deployable/proc/deploy(obj/source, mob/user, location, direction) //If there's no user, location and direction are used
var/obj/deployed_object //Used for spawning the deployed object
var/turf/deploy_location //Where our deployed_object gets put
var/new_direction //What direction do we want our deployed object in
if(user)
if(!ishuman(user))
return
deploy_location = get_step(user, user.dir) //Gets spawn location for thing_to_be_deployed if there is a user
if(deploy_location.is_blocked_turf(TRUE))
source.balloon_alert(user, "insufficient room to deploy here.")
return
new_direction = user.dir //Gets the direction for thing_to_be_deployed if there is a user
source.balloon_alert(user, "deploying...")
playsound(source, 'sound/items/ratchet.ogg', 50, TRUE)
if(!do_after(user, deploy_time))
return
else //If there is for some reason no user, then the location and direction are set here
deploy_location = location
new_direction = direction
deployed_object = new thing_to_be_deployed(deploy_location)
deployed_object.setDir(new_direction)
//Sets the integrity of the new deployed machine to that of the object it came from
deployed_object.modify_max_integrity(source.max_integrity)
deployed_object.update_icon_state()
if(delete_on_use)
qdel(source)