Huge Mirror fixes (#27488)

* Fixes incorrect operator usage in mecha code (#82570)

## About The Pull Request

I completely screwed up and told the original PR author of #82415
(9922d2f237) to use the `XOR` operator
instead of the `OR` operator (I wasn't thinking right for some reason
when I was reading the ref), anyways this PR just fixes that because I
misled the contributor into doing something that wasn't correct and
actually would BREAK functionality instead.

* Fixes TGUI debugging tools (#82569)

This project doesn't interfere with the game logic and aims to fix
multiple debugging features that are currently broken. Unfortunately,
kitchen sink and debug layout became broken after migration to Redux.
This PR aims to fix those features.

* Removes unused code for HTML UIs (#82589)

## About The Pull Request

This is the final PR for https://hackmd.io/XLt5MoRvRxuhFbwtk4VAUA that
I've been slowly inching towards the past few months.

This removes ``updateDialog``, ``updateUsrDialog``, ``IN_USE``,
``INTERACT_MACHINE_SET_MACHINE``, and everything surrounding it. Also
fixes advanced camera consoles not booting you off when you're moved out
of reach.

We called ``check_eye`` on mob life whenever they had their machine var
set, but their machine var would never be set to anything that actually
used it, which I found to be a little funny but was also probably my
fault.

## Why It's Good For The Game

This is poor and unmaintained code used for HTML UIs that we no longer
need thanks to TGUI, we should get rid of it to encourage the use of
TGUI in the future instead.

## Changelog


🆑
fix: Advanced camera consoles now boots you off when you're moved out of
reach.
/🆑

* Fixes a variety of input stalling exploits (#82577)

## About The Pull Request

Fixes the following input stalling exploits (maybe missed some): 

- Changing GPS tag 
- Setting teleporter destination
- Request Console Reply
- Various AI law board interactions
- Note, I used `is_holding` but technically this means these fail with
telekinesis. I can swap them to `can_perform_action(...)`, which allows
TK, but I noticed some places explicitly deny TK interactions with Ai
law boards. Not sure which is preferred.
- Borg Rename Board
- Plumbing Machines and Ducts
- APCs and SMES terminal placements
- Stargazers Telepathy
- Go Go Gadget Hat

## Changelog

🆑 Melbert
fix: You can't change the GPS tag of something unless you can actually
use the GPS
fix: You can't set the teleporter to a location unless you can actually
use the teleporter
fix: You can't reply to request console requests unless you can actually
use the console
fix: You can't update AI lawboards unless you're actually holding them 
fix: You can't update a borg rename board unless you're actually holding
it
fix: You can't mess with plumbing machines unless you can actually use
them
fix: You can't recolor / relayer ducts unless you're actually holding
them
fix: You can't magically wire APCs and SMESs unless you're right by them
fix: You can't use Stargazer Telepathy on people who you can't see
fix: You can't configure the Inspector Hat unless you can actually use
it
/🆑

* [NO GBP] Power outage operation fixes for chem master (#82591)

## About The Pull Request
- If the chem master runs out of power mid printing, it will properly
stop the printing process and its animation
- When transferring reagents it correctly checks if we have enough power
without forcing it

## Changelog
🆑
fix: chem master properly shuts down if it loses power mid printing and
won't transfer reagents for the same
/🆑

* Refactor renaming UNIQUE_RENAME items from the pen to an element (#82491)

## About The Pull Request

So a bit ago someone in code_general wanted to make plushies renamable,
but learnt that just adding the `UNIQUE_RENAME` flag wouldn't work as
pens would murder the plushie and only THEN let you rename it. I noted
refactoring both pens and plushies to use the new
`item_interaction(...)` procs would Just Solve This, but, well, they
didn't really have any coding experience.

But, hey, renaming being hardcoded to the pens has annoyed me ever since
I laid my eyes upon the hot mess that is paperwork code.
So here we are!

### We're making it an element.

There's not really much to this, this is mostly the same code but moved
to an element and with some minor cleanups.

First, we move it all from `/obj/item/pen` to a new element we called
`/datum/element/tool_renaming`. With this, instead of having it proc on
`/obj/item/pen/afterattack(...)`, we register it to proc on the
`COMSIG_ITEM_INTERACTING_WITH_ATOM` signal.

https://github.com/tgstation/tgstation/blob/6e36ed984070d53e16bed4fa43eb0cbe6460deed/code/__DEFINES/dcs/signals/signals_atom/signals_atom_x_act.dm#L59-L62
Secondly, we realize the code is just going through each if statement
regardless of whether the previous was correct.

https://github.com/tgstation/tgstation/blob/6e36ed984070d53e16bed4fa43eb0cbe6460deed/code/modules/paperwork/pen.dm#L225-L258
And, as we're dealing with text, just make it a switch statement
instead.
```dm
switch(pen_choice)
		if("Rename")
			(...)

		if("Description")
			(...)

		if("Reset")
			(...)
```
Then, we replace all single letter variables with descriptive ones,
replace the if-elses with early returns, and make it actually return
item interaction flags.

Finally, we slap this onto the pen, and we're done.
Now we can slap it onto other fitting renaming tools, and it uses the
proper item interaction system.
## Why It's Good For The Game

I feel it's generally better to not hardcode this to just pens, we have
plenty other writing utensils and possible renaming tools.
It's also a bit cleaner than before.
Apart from that, moves it from using `afterattack(...)` to the proper
item interaction chain by using `COMSIG_ITEM_INTERACTING_WITH_ATOM`,
which should reduce janky interactions.
## Changelog
🆑
refactor: Instead of being hardcoded to the pen, renaming items is now
an element. Currently only pens have this, and functionality should be
the same, but please report it if you find any items that were renamable
but now aren't.
/🆑

* Adds various quality of life changes for cooking to make it less click intensive. (#82566)

## About The Pull Request

- Increases tray item size by 1 item.

- Ranges and griddles can now be fed from trays.

Click when closed => fill soup pot.
Click when open => fill associated oven tray.
Right click when open => fill tray from oven tray
Click griddle => fill griddle surface.
Right click => fill tray from griddle surface

- Martian batter is now 5u of each ingredient into 10u of batter.

Hopefully will make it bug out less where it makes far fewer reagents
than it is supposed to, fixing reagents, or well soups specifically...
is out of scope for this PR.

- Adds the ability to print soup pots and large trays from the service
lathe

Soup pot: 5 Iron sheets, 0.4 bluespace crystal (given their size of
200U)
Large serving tray: 2 iron sheets

## Why It's Good For The Game

Makes cooking a lot less tedious. Especially for people with low
precision when it comes to filling oven trays. This also bring the
behavior up to parity with how you can click microwaves with trays to
fill them, ditto for the food processor. It also allows chef to use the
whole capacity of an oven, as previously you couldn't easily click 6
cake batters or other giant sprites onto the tiny tray.

The tray is now sized to be able to easily feed a griddle 8 items.

## Changelog

🆑
qol: chef equipment can now deposit and withdraw to/from trays!
qol: chef now has access to griddle and oven sized trays!
qol: service can now print soup pots
/🆑

---------

Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: Jeremiah <42397676+jlsnow301@users.noreply.github.com>

* Removes grid usage + heavy refactors (#82571)

## About The Pull Request
Grid has been deprecated for quite some time and we still use it. I
won't completely remove the component, this way downstreams won't
immediately suffer, but I can remove it from usage.

Some of these UIs had issues with them and as a hobby project I've
refactored them into typescript / rebuilt them. Airlock electronics, for
instance, looks substantially better.

<details>
<summary>before/after as requested</summary>

current airlock electronics scrolls into oblivion

![6RJ29HCPob](https://github.com/tgstation/tgstation/assets/42397676/ba82bc20-40fa-4af0-b709-7c8846c25652)

updated
![Screenshot 2024-04-11
164321](https://github.com/tgstation/tgstation/assets/42397676/05507e06-6305-4175-8476-778c345f02c8)

</details>

## Why It's Good For The Game
Code improvement + probably UI bug fixes
## Changelog
🆑
fix: Airlock electronics and other access-config type UIs should look
much better.
/🆑

* modular fixes

* [No GBP] Removes cogbar from some stealthy actions (#82593)

Issue brought some missed hidden actions to my attention.

I left cogbars in for _breaking_ handcuffs because resisting is sort of
a gray area. On one hand, you don't want someone to see you doing it; on
the other, there is a visible warning that you started doing it. So,
meet in the the middle, breaking handcuffs is still visible while
resisting isn't.
Closes #82583
Cogbars are not intended to ruin stealth
🆑
fix: Deviants buffed: Rogue shoelacing, pickpocketing and restraint
resisting no longer give cogbar icons.
/🆑

* [NO GBP] ...Remember to add SIGNAL_HANDLER (#82630)

## About The Pull Request

Just realized I forgot to add `SIGNAL_HANDLER` to the all-nighter
`on_removed_limb(...)` proc, even though it handles signals.
## Why It's Good For The Game


https://github.com/tgstation/tgstation/blob/fe26373572e41415ec12e2b0785f0c6dc2567577/code/__DEFINES/dcs/helpers.dm#L9-L11

* React cleanup (#82607)

## About The Pull Request
- No defaultHooks in react. Might fix issues where pages were not
scrollable on hover.
- createRef in a functional component. should be useref

## Why It's Good For The Game
Code improvement

* Security photobooths have their own ID (#82628)

## About The Pull Request

Prevents the HoP's photobooth button from connecting to the security
photobooth via having the same ID.

## Why It's Good For The Game

I forgot to add this when I made the security photobooth but it's
important that by default without any varedits, the HoP and security
photobooths stay separate.

## Changelog

🆑
fix: The HoP's photobooth button is now consistently connected to the
HoP's photobooth.
/🆑

* Fix buckled alert unbuckling not working properly (#82627)

## About The Pull Request

So funny thing, while trying to reproduce a different issue on the
current master, I coincidentally let my local instance start without
reading, latejoined on the shuttle, and I noticed it wasn't letting me
unbuckle as easily.

Looking into this a bit later, it seems as if it's a line #82593
accidentally changed while moving around the
`/mob/living/carbon/resist_buckle()` proc's flow.

https://github.com/tgstation/tgstation/blob/fe26373572e41415ec12e2b0785f0c6dc2567577/code/modules/mob/living/carbon/carbon.dm#L238-L241
While before it was
```dm
/mob/living/carbon/resist_buckle()
	if(HAS_TRAIT(src, TRAIT_RESTRAINED))
		(...)
	else
		buckled.user_unbuckle_mob(src,src)
```
Just changing this to `buckled.user_unbuckle_mob(src, src)` fixes this.
## Why It's Good For The Game

Fixes buckled alert unbuckling not working properly.
Fixes #82627.

## Changelog
🆑
fix: Clicking the buckled alert unbuckles you again.
/🆑

* Advanced camera consoles correctly deactivates when something happens to it or the user (#82619)

## About The Pull Request
- Fixes #82520

1. The eye deactivates when the machine is destroyed/deleted
2. The eye deactivates when the machine loses power
3. The computer constantly moniters the users status inside `process()`
and will deactivate when anything happens to them. Its not enough to
just hook onto to the mobs `COMSIG_MOVABLE_MOVED` signal. Literarly
anything can happen to them so we have to check constantly for any
changes

## Changelog
🆑
fix: advanced camera consoles correctly deactivate when something
happens(no proximity, no power etc) to its user
/🆑

* Oven tray checks for ovens (#82615)

## About The Pull Request
- Fixes #82610

Only oven trays have this proc not serving trays or other stuff
![Screenshot
(408)](https://github.com/tgstation/tgstation/assets/110812394/4867cc14-9df3-4398-9d2d-f8e38b5f0da9)

Also oven trays have a null atom storage which prevents it from being
put back in the oven after taking it out. So we remove that check

## Changelog
🆑
fix: you can put back the oven tray after you take it out
fix: only oven trays are allowed in ovens preventing baked food runtimes
/🆑

* Living Limb fixes (feat: Basic mobs attack random body zones again) (#82556)

## About The Pull Request

Reworks Living Limb code to fix a bunch of runtimes and issues I saw
while testing Bioscrambler.
Specifically, the contained mobs are now initialised via element
following attachment so that signal registration can occur at the
correct time. This allows limbs to function correctly when added from
nullspace via admin panel or bioscrambler.

Secondarily (and more wide-ranging) at some point (probably #79563) we
inadvertently made basic mobs only attack the target's chest instead of
spreading damage.
This is problematic for Living Flesh which can only attach itself to
damaged limbs but was left unable to attack damaged limbs.

I've fixed this in a way which is maybe stupid: adding an element which
randomises attack zone pre-attack.
Living limbs also limit this to _only_ limbs (although it will fall back
to chest if you have no limbs at all).
This is _technically_ still different, the previous behaviour used
`adjustBruteLoss` and `adjustFireLoss` and would spread the damage
across your entire body, but there isn't a route to that via the new
interface and this seems close enough.

## Changelog

🆑
fix: Living Limbs created by Bioscrambler will be alive.
fix: Living Limbs can once more attach themselves to your body.
balance: Living Limbs will prioritise attacking your limbs.
fix: Basic Mobs will once again spread their damage across body zones
instead of only attacking your chest.
/🆑

* RPG Loot: Revisited & READY (#82533)

Revival of #72881

A new alt click window with a tarkov-y loading spinner. Replaces the
object item window in stat panel.

<details>
<summary>vids</summary>

toggleable grouping:

![syAA5zf6RK](https://github.com/tgstation/tgstation/assets/42397676/c89b372d-29f6-4ebe-895d-f73bbdc41c19)

now lists the floor as first obj:

![abc](https://github.com/tgstation/tgstation/assets/42397676/cd8dc962-2ac7-41bf-a5d3-b9e926116b06)

in action:

![dreamseeker_IkrPKt2QZt](https://github.com/tgstation/tgstation/assets/42397676/1f990aa0-60f0-47e7-9d93-b63e35d05273)

</details>

- search by name
- 515 image generator is much faster than alt click menu
- opening a gargantuan amount of items shouldnt freeze your screen
- groups similar items together in stacks by default, toggleable
- shows tile as first item
- <kbd>Shift</kbd> and <kbd>Ctrl</kbd> compatible with LMB
🖱️
- RMB points points at items (sry i could not get MMB working)
- key <kbd>Esc</kbd> to exit the window.

For devs:
- A new image generation tech.
- An error refetch mechanic to the Image component
- It does not "smart track" the items being added to the pile, just
reopen or refresh. This was a design decision.

Honestly I just dislike the stat panel

Fixes #53824

Fixes

![image](https://github.com/tgstation/tgstation/assets/42397676/0e50faab-7d4d-4bf7-8c5b-4ac28547bfbd)

🆑
add: Added a loot window for alt-clicking tiles.
del: Removed the item browser from the stat panel.
/🆑

---------

Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com>
Co-authored-by: AnturK <AnturK@users.noreply.github.com>
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>

* Reverts parts of #82602 (nodeath checks) (#82637)

## About The Pull Request

Reverts the nodeath checks of #82602

I opened a review thinking these checks were sus and the PR author said
they would remove them, but it was merged before that happened.

TL;DR 

1. I just noticed this now but it only affects carbons / humans it
doesn't even cover living or any other subtypes
2. Kinda sus. Some code intentionally skips checking nodeath (I guess?
Like removing the brain for example) so we would need a larger audit of
this rather than haphazardly throwing it in.

* Fixes to battle arcade (#82620)

## About The Pull Request

Added gear for world nine, removed the "Gear" gear that did nothing.
Made counterattacks to kill an enemy properly kill the enemy.
I renamed some gear items to fit the theme of the area they are unlocked
in just as a small thing.

## Why It's Good For The Game

Closes https://github.com/tgstation/tgstation/issues/82613

## Changelog

🆑
fix: Battle arcade's higher levels no longer gives you a "Gear" gear,
and counterattacks can now properly kill enemies.
/🆑

* Fixes SMES terminal placing under the SMES and not under the player (#82665)

## About The Pull Request

Changes `src` to`user` to get intended behavior.

* Birdshot: Toy crate (#82633)

## About The Pull Request
Gives the clown+mime their toy crate.
## Why It's Good For The Game
*honk*

* tram ai sat starts with a full smes (#82646)

## About The Pull Request

consistency and also this is fixes a bug introduced by that one power
refactor

## Why It's Good For The Game

bug bad

## Changelog
🆑
fix: tramstation AI sat starts full
/🆑

* [no gbp] Space Ruin bioscramblers shouldn't chase people around (#82649)

## About The Pull Request

See title
They wouldn't lock on to people on the station from a space ruin, but
would to whoever entered their z level the second it was entered.
Also fixes bug where I changed `status_flags` to `status_effects` for
some reason which isn't where you look for godmode

## Why It's Good For The Game

We have a space ruin whcih several (coreless) anomalies spawn on, the
bioscrambler was put as an option because it was already immortal. It's
weird though to zone into the ruin and immediately have every anomaly in
there lock onto you, the best intended effect is probably for these ones
specifically not to be bloodthirsty.
We kind of only care about that behaviour on the station.

## Changelog

🆑
fix: Anomalous Research ruin Bioscrambler anomalies won't home in on
targets
fix: Bioscrambler won't randomly drop its target for no reason
/🆑

* Sunders the many unused sprites and organizes what's left in structures.dmi (#82658)

## About The Pull Request
Hello again, I noticed the /obj/structures.dmi file had a lot of unused
stuff like tables from two generations ago, so I changed some stuff
around:
- Many unused, old icons deleted, mostly window variants used in old
smoothing systems I imagine
- Reorganized many sprites in the file so they're more grouped together
- Tweaked some barricade sprite naming to be consistent/standardized,
and to let others know they're not _too_ old...
- Fixed a misnomer that I believe was making directional tinted windows
look like frosted windows

## Why It's Good For The Game
Saves on file space, and satisfies your brain's pattern recognition bits

### Spriting
Old: 

![image](https://github.com/tgstation/tgstation/assets/143908044/0717940e-787e-40ee-85e2-0a0c5ebc0837)

New:

![image](https://github.com/tgstation/tgstation/assets/143908044/3954ba3b-b261-4700-986a-d30f3aa0e2a6)
also good lord those linen bin sprites are a crime

## Changelog
🆑
fix: Probably fixed directional tinted windows looking like directional
frosted windows
image: Deleted a bunch of unused structure sprites
/🆑

* Birdshot Wall Sanity Pass (#82598)

## About The Pull Request

Cleans up minor artifacting in the Birdshot Sec-Tram Closed Turfs

## Why It's Good For The Game

Someone definitely didn't mean to place some machines under Closed
Turfs. This barely qualifies as player facing.

## Changelog

🆑
fix: Cleans up some rocks on Birdshot
/🆑

* [NO GBP] Fixes deconstruction of closets & crates under a special case (#82612)

## About The Pull Request
So if a closet/crate has the `NO_DEBRIS_AFTER_DECONSTRUCTION` set on it
and if someone/something is still inside, then after deconstruction they
get deleted rather than getting dumped out first.

Could cause potential hard delete of mobs & stuff. We don't want to deal
with that

## Changelog
🆑
fix: closets & crates will dump all contents out first before deleting
itself regardless of `NO_DEBRIS_AFTER_DECONSTRUCTION` thus not for e.g.
hard deleting mobs inside it
/🆑

* Fixes ordinance lab igniter in IceBox (#82595)

## About The Pull Request
- Fixes #82294

Basically the same idea of merging ordanance lab with the burn chamber
so they share the same apc as already implemented in #82322

## Changelog
🆑
fix: Ordinance lab igniter in Icebox works again 
/🆑

* Birdshot: engi wardrope. (#82639)

## About The Pull Request

Add engi wardrope on Birdshot.

## Why It's Good For The Game

Birdshot doesn't have engi wardrope.

🆑
fix: Birdshot now have engi wardrope
/🆑

* Gives shadow walk a new, spookier, and shorter sound effect that no longer ignores walls (#82689)

## About The Pull Request

This gives shadow walk a snazzy new sound effect for entering/exiting
jaunt.


https://github.com/tgstation/tgstation/assets/28870487/c25f720f-5bad-4063-8d6e-140fd41bd740

This also has the sounds it plays no longer passes through walls.
## Why It's Good For The Game

The ethereal_entrance/exit sound effects are drawn out, and pretty
grating. They work for the other jaunts they're used for because a jaunt
typically lasts longer than the sound itself. Nightmares are frequently
dancing in and out of jaunt, and the sound effects for entering/exiting
tend to overlap. It gets loud and annoying really fast.

This sound effect is quicker, spookier, and more distinct.

As for making the sound not ignore walls, I think it's pretty dumb how
easy it is to detect the spooky scary shadow antag just by sitting in
your department. It takes a lot of the initial fear and paranoia they
have the potential for is wasted when Joe Geneticist can hear them
messing around in their territory without having to leave their chair.
## Changelog
🆑 Rhials
sound: Nightmare has a new sound effect for entering/exiting shadow
jaunt. It also no longer can be heard through walls.
/🆑

* [MIRROR] Alt click refactor (#2029)

* Alt click refactor

* Some early conflict removal

* Big modular refactor

* Update console.dm

* Update paper.dm

---------

Co-authored-by: Jeremiah <42397676+jlsnow301@users.noreply.github.com>
Co-authored-by: Mal <13398309+vinylspiders@users.noreply.github.com>

* Yeets `ATTACK_QDELETED`, fixes welding torches not using fuel on attacking non-mobs (2 year old bug)  (#82694)

## About The Pull Request

- Deletes `ATTACK_QDELETED`
- May have been necessary in the past but it's pointless now. All it
does is clutter the attack chain. Perish.

- Fixes welders not using fuel on attacking non-mobs
- #65762 "fixed" welders consuming fuel on clicking turfs by adding an
`isliving` check and not an `ismovable` check?


## Changelog

🆑 Melbert
fix: Blobs may rejoice, welding torches now consume fuel when attacking
objects again after two years.
/🆑

* electric_welder fire

* Quirks, which give items, now have quirk_item arg specified as obj/item, instead of being just a var (#82650)

## About The Pull Request
quirk_item is now /obj/item, since it will allow for calling procs or
getting variables from this item

It's required for non-modular translation to call for item's name to
remove articles

## Why It's Good For The Game
It's always an item, and if it's a path, it's already checked for it.
Better usage in the future.

* turns martial arts gloves into a component (#82599)

sleeping carp gloves also work on mind init

this means for the sake of deathmatch you dont have to put them off and
on

fixes #82321

🆑
fix: you no longer need to put your sleeping carp gloves off and on in
Deathmatch to get the martial art
/🆑

---------

Co-authored-by: san7890 <the@san7890.com>

* Regal Rats can now tear down posters (#82673)

## About The Pull Request

i was fixing something on bagil and someone who was playing a regal rat
(after the round ended) said they wanted to be able to tear down posters
as a regal rat so i decided to code it because it made sense.

it's an element so literally any mob can tear down posters but i can't
think of any other mobs that would make sense to let it tear down
posters so we'll leave it just for _The Champion of All Mislaid
Creatures_ for now
## Why It's Good For The Game

Regal Rats should be all about sludgemaxxing and fucking up maintenance
to make it look even more grody than it should be. Being able to tear up
those disgusting and well-drawn posters to leave behind nothing but
scraps fits that motif. The element has a `do_after()` just to make sure
His Holiness doesn't accidentally tear down his posters while clicking
(i think all mobs should have this but that's a different issue man)

also includes some code improvement and user feedback in some failure
cases that already existed in the code.
## Changelog
🆑
add: Regal Rats are now able to tear down those colorful posters those
weird grey creatures keep spackling up on the walls of their rightful
domain.
/🆑

* Adds "Strong Stomach" quirk, a core CDDA/PZ quirk we've sorely been missing. Also Deviant Tastes dirty food re-nerf. (#82562)

## About The Pull Request

- Adds Strong Stomach quirk. 
   - 4 points
   - You can eat dirty food without risk of getting disease. 
- You suffer less negative effects from vomiting. Vomit stuns you for
half the duration, and you lose half as much nutrition.

- Reverts https://github.com/tgstation/tgstation/pull/76864 , integrates
its effects into Strong Stomach instead.

## Why It's Good For The Game

- Lotta people (namely Lizards and sometimes Felines with Deviant
Tastes) run gimmicks involving them being a gremlin person and eating
trash off the ground, and it's rather hard to accomplish this now since
it makes you a public medbay enemy # 1. This quirk should give them an
option to avoid that.
- Also (as mentioned in the title) both CDDA and PZ have this trait and
I can't believe we're missing it! This is something in
modifiable-character-traits/quirks-101.

- I moved the effects from #76864 to this quirk because 1. I thought it
was more fitting and 2. I thought the original PR was kinda wack for
what is (generally) a neutral quirk.

## Changelog

🆑 Melbert
add: Adds the Strong Stomach quirk, which allows you to eat grimy food
without worry about disease, and makes you a bit more resilient to the
effects of vomiting.
del: Deviant Tastes no longer prevents you from getting a negative
moodlet from eating dirty food. Strong Stomach does that now.
/🆑

---------

Co-authored-by: Jacquerel <hnevard@gmail.com>

* Remove several functions from collections.js which have ES5 equivalents (#82417)

* Makes it EVEN EASIER to work with atom item interactions ft. "Leaf and Branch" & "Death to Chains" (#82625)

* apc fix

* Gulag Adjustments Two (#82561)

## About The Pull Request

I have received feedback that after the prior changes in #81971, the
gulag is still a little bit too subject to RNG.
The main culprit (as in my previous PR) is Iron being kind of cheap and
the fact that unlike the old Gulag you no longer have any way of
headhunting more valuable materials (everything appears as boulders on
your ore scanner).

My solution to this is wider than the last one of tweaking point values,
but also much simpler:
Just make every boulder you mine be worth the same amount of points
regardless of what is inside of it.

On the average test I made I could comfortably mine about 40-45 boulders
in ten minutes.
We'll make some adjustments to that rather than leaving 40 as the target
number;
Most players upon being teleported to the gulag are going to spend a few
minutes whining and bemoaning their fate instead of getting straight to
work. I had the benefit of being able to make sure my run started as
soon as a storm ended so I wouldn't need any kind of midpoint break. I
was also always the only person playing on my local instance, there
hadn't been any other pesky prisoners before me who had already mined
out all the nearest available deposits. And of course, let us not
forget, I am an MLG master league ss13 player who was surely performing
well above average.

So we'll round that down to: Each boulder is worth 33 points, meaning
you need to collect 31 boulders to complete a 1000 point (roughly ten
minute) sentence.

How do I ensure that every boulder is worth the same amount of points?
Well it's pretty easy.
One boulder = one material sheet. One material sheet = 33 points.
Simple.

"Now Jacquerel", I hear you not saying because you don't want me to know
about this thing you would prefer to do instead of hitting rocks
outside; "if I simply smash all of the tables and microwaves and botany
trays and bed in the gulag I can easily get like 65 sheets of Iron,
which is almost enough to buy the freedom for two entire people!"
Unfortunately I knew you were going to try and do that and the prisoner
point machine will only give you points for material sheets which have
been printed from the material smelter (well, any material smelter
actually but you should probably use the one in the gulag). You'll be
able to tell because if you examine a valid material sheet it will
mention a little maker's mark on it, which is absent in the beat-up iron
that you get from smashing furniture to bits.

Also glass is worth 0 points. Don't waste time digging up that shit. 

As glass has had all of its point value removed, I have added a "work
pit" to the gulag to compensate. You can pull boulders out of this
indefinitely via effort, however it also stamcrits you every time.
It's not very fun to do this, but that's because I would prefer you to
go find the rocks out in the field instead. This is a last resort.
You can do this if there's no boulders left to mine or if you really
really really hate mining and would rather very slowly click on one tile
repeatedly to get your boulders instead.
As a tiny bonus doing this gives workout experience.

This isn't a totally ideal solution but I think it'll do for now.

## Why It's Good For The Game

What we want out of the gulag is:
- Something where officers can vaguely approximate an expected sentence
duration.
- A task that requires players to actually be spending that time doing
something to get out of here.
- Produces at least some amount of useful materials.

In I think roughly that order.
I hope this change accomplishes all three of these in a way that is
somewhat predictable rather than throwing darts at a board.

## Changelog

🆑
balance: Gulag mining has been rebalanced so that every boulder is worth
the same amount of points to mine for a prisoner regardless of what it
contains, and should be more consistent.
add: A vent which boulders can be hauled out of by hand has been added
to the gulag which you can use if there's nothing left to mine. It is
very slow, but at least it gives you a workout...
/🆑

* stone

* Makes test merge bot continue with other PRs if updating one fails. (#82717)

Right now updating
https://github.com/tgstation/tgstation/pull/81089#issuecomment-1907296233
fails because it exceeds github character limit for comments.

This will make it work until backed is updated.

* Fixes the RnD console by adding a removed import (#82750)

## About The Pull Request
The 'map' import was removed from this file by #82417 but it's still
used in place in code. This re-adds the import

## Why It's Good For The Game
Fixes RnD consoles

## Changelog
🆑
fix: Fixed RnD consoles not being able to be opened.
/🆑

Co-authored-by: Watermelon914 <3052169-Watermelon914@users.noreply.gitlab.com>

* Fixes cargo import (#82755)

## About The Pull Request
One of the imports got removed and there were no warnings... Man if only
there were a technology that could warn us in advance
## Why It's Good For The Game
UI fixes
## Changelog
🆑
fix: Fixed a bluescreen in cargo console
/🆑

* fixes

* Fixes, fixes.

* Pre-emptive mirror of https://github.com/tgstation/tgstation/pull/82892

* Turf weakref persists in changeturf / Fix plasma cutters  (#82906)

## About The Pull Request

Turf references don't change so logically, turf weakrefs wouldn't change
if the turf changes.

By not doing this this can cause bugs: See #82886 . (This Fixes #82886) 

(Projectiles hold a list of weakrefs to atoms hit to determine what they
have already hit.

Because turf weakrefs reset, we could "hit" the same turf twice if it
destroyed the turf.

Old behavior - this was fine but now that they're weakrefs, we get two
weakref datums in the list that point to the same ref.)

Less hacky alternative to #82901 . (Closes #82901) 

## Changelog

🆑 Melbert
fix: Plasma cutters work again
/🆑

---------

Co-authored-by: san7890 <the@san7890.com>
Co-authored-by: Interception&? <137328283+intercepti0n@users.noreply.github.com>
Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com>
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com>
Co-authored-by: _0Steven <42909981+00-Steven@users.noreply.github.com>
Co-authored-by: Ketrai <zottielolly@gmail.com>
Co-authored-by: Jeremiah <42397676+jlsnow301@users.noreply.github.com>
Co-authored-by: Jacquerel <hnevard@gmail.com>
Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com>
Co-authored-by: AnturK <AnturK@users.noreply.github.com>
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
Co-authored-by: Iajret <8430839+Iajret@users.noreply.github.com>
Co-authored-by: vect0r <71346830+Vect0r2@users.noreply.github.com>
Co-authored-by: jimmyl <70376633+mc-oofert@users.noreply.github.com>
Co-authored-by: AMyriad <143908044+AMyriad@users.noreply.github.com>
Co-authored-by: Zytolg <33048583+Zytolg@users.noreply.github.com>
Co-authored-by: Xackii <120736708+Xackii@users.noreply.github.com>
Co-authored-by: Rhials <28870487+Rhials@users.noreply.github.com>
Co-authored-by: NovaBot <154629622+NovaBot13@users.noreply.github.com>
Co-authored-by: Mal <13398309+vinylspiders@users.noreply.github.com>
Co-authored-by: larentoun <31931237+larentoun@users.noreply.github.com>
Co-authored-by: Arthri <41360489+Arthri@users.noreply.github.com>
Co-authored-by: Watermelon914 <37270891+Watermelon914@users.noreply.github.com>
Co-authored-by: Watermelon914 <3052169-Watermelon914@users.noreply.gitlab.com>
Co-authored-by: Useroth <37159550+Useroth@users.noreply.github.com>
This commit is contained in:
SpaceLoveSs13
2024-04-29 01:54:01 +05:30
committed by GitHub
parent c54406fff1
commit ba5c112a86
549 changed files with 6500 additions and 5378 deletions
+62 -80
View File
@@ -2799,6 +2799,12 @@
},
/turf/open/floor/circuit/green,
/area/station/science/robotics/mechbay)
"boT" = (
/obj/effect/turf_decal/bot,
/obj/machinery/light/cold/dim/directional/west,
/obj/machinery/vending/wardrobe/engi_wardrobe,
/turf/open/floor/iron,
/area/station/engineering/main)
"boW" = (
/obj/structure/table/glass,
/obj/machinery/status_display/ai/directional/south,
@@ -10007,18 +10013,6 @@
/obj/effect/turf_decal/siding/wood,
/turf/open/floor/wood/tile,
/area/station/science/lower)
"erJ" = (
/obj/effect/turf_decal/siding/wood{
dir = 1
},
/obj/structure/table/greyscale,
/obj/item/folder/yellow{
pixel_x = 4;
pixel_y = 4
},
/obj/item/clothing/glasses/meson,
/turf/open/floor/iron/grimy,
/area/station/engineering/main)
"erK" = (
/obj/structure/cable,
/obj/effect/turf_decal/siding/thinplating_new,
@@ -11513,13 +11507,6 @@
/obj/effect/turf_decal/tile/neutral,
/turf/open/floor/iron,
/area/station/hallway/primary/fore)
"eWf" = (
/obj/structure/closet/cardboard,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 8
},
/turf/open/floor/iron/grimy,
/area/station/engineering/main)
"eWj" = (
/obj/machinery/atmospherics/components/unary/thermomachine/heater/on{
dir = 4;
@@ -11999,17 +11986,6 @@
/obj/machinery/light_switch/directional/west,
/turf/open/floor/iron/cafeteria,
/area/station/service/cafeteria)
"fhX" = (
/obj/structure/table/greyscale,
/obj/item/folder/yellow{
pixel_x = 2;
pixel_y = 4
},
/obj/item/pen{
pixel_x = -4
},
/turf/open/floor/iron/grimy,
/area/station/engineering/main)
"fib" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -31165,6 +31141,18 @@
},
/turf/open/floor/iron/white,
/area/station/medical/medbay/lobby)
"lwl" = (
/obj/effect/gibspawner/human,
/obj/structure/table/optable{
desc = "A cold, hard place for your final rest.";
name = "Morgue Slab"
},
/mob/living/carbon/human/species/monkey/humand_legged{
name = "Charles";
real_name = "Charles"
},
/turf/open/floor/iron/white/diagonal,
/area/station/maintenance/department/science/xenobiology)
"lwn" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/door/airlock/hatch,
@@ -33051,6 +33039,14 @@
},
/turf/open/floor/iron,
/area/station/cargo/storage)
"lWK" = (
/obj/structure/closet/cardboard,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 8
},
/obj/item/airlock_painter,
/turf/open/floor/iron/grimy,
/area/station/engineering/main)
"lWQ" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/ticket_machine/directional/north,
@@ -36959,31 +36955,6 @@
/obj/effect/mapping_helpers/airlock/access/all/security/general,
/turf/open/floor/iron/textured_half,
/area/station/security)
"nki" = (
/obj/structure/rack,
/obj/item/airlock_painter,
/obj/item/lightreplacer{
pixel_y = 7
},
/obj/item/clothing/head/utility/hardhat/welding{
pixel_x = -4;
pixel_y = -3
},
/obj/item/clothing/head/utility/hardhat/welding{
pixel_x = -4
},
/obj/item/clothing/head/utility/hardhat/welding{
pixel_x = -4;
pixel_y = 3
},
/obj/effect/turf_decal/bot,
/obj/machinery/light/cold/dim/directional/west,
/obj/item/grenade/chem_grenade/smart_metal_foam{
pixel_x = 9;
pixel_y = 5
},
/turf/open/floor/iron,
/area/station/engineering/main)
"nkl" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment{
@@ -45700,10 +45671,6 @@
},
/turf/open/floor/iron/dark/side,
/area/station/science/xenobiology)
"pRb" = (
/obj/item/computer_disk/virus/mime,
/turf/closed/mineral/random/stationside,
/area/space/nearstation)
"pRe" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/structure/table/wood,
@@ -60444,18 +60411,6 @@
/obj/effect/spawner/random/maintenance,
/turf/open/floor/iron,
/area/station/security/execution/transfer)
"tUa" = (
/obj/effect/gibspawner/human,
/obj/structure/table/optable{
desc = "A cold, hard place for your final rest.";
name = "Morgue Slab"
},
/mob/living/carbon/human/species/monkey/humand_legged{
name = "Charles";
real_name = "Charles"
},
/turf/open/floor/iron/white/diagonal,
/area/station/maintenance/department/science/xenobiology)
"tUc" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -68928,6 +68883,17 @@
},
/turf/open/space/basic,
/area/station/engineering/atmos/space_catwalk)
"wlW" = (
/obj/structure/table/greyscale,
/obj/item/lightreplacer{
pixel_y = 7
},
/obj/item/lightreplacer{
pixel_y = 2;
pixel_x = -2
},
/turf/open/floor/iron/grimy,
/area/station/engineering/main)
"wmd" = (
/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible,
/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer2{
@@ -70351,8 +70317,8 @@
/turf/open/floor/iron/white,
/area/station/medical/medbay/central)
"wHO" = (
/obj/structure/dresser,
/obj/structure/sign/poster/official/random/directional/north,
/obj/structure/closet/crate/wooden/toy,
/turf/open/floor/wood/parquet,
/area/station/service/greenroom)
"wHP" = (
@@ -74918,6 +74884,22 @@
},
/turf/open/floor/plating,
/area/station/service/abandoned_gambling_den/gaming)
"xMU" = (
/obj/effect/turf_decal/siding/wood{
dir = 1
},
/obj/structure/table/greyscale,
/obj/item/folder/yellow{
pixel_x = 4;
pixel_y = 4
},
/obj/item/clothing/glasses/meson,
/obj/item/grenade/chem_grenade/smart_metal_foam{
pixel_x = -8;
pixel_y = 14
},
/turf/open/floor/iron/grimy,
/area/station/engineering/main)
"xMY" = (
/turf/closed/wall/r_wall,
/area/station/command/teleporter)
@@ -88018,7 +88000,7 @@ aJq
aJq
aJq
aJq
pRb
aJq
dDB
dDB
dDB
@@ -88275,7 +88257,7 @@ aJq
aJq
aJq
aJq
pRb
aJq
aJq
aJq
aJq
@@ -88532,7 +88514,7 @@ aJq
aJq
aJq
aJq
pRb
aJq
aJq
aJq
aJq
@@ -92010,7 +91992,7 @@ dgV
sHH
rQi
rPV
nki
boT
uOk
nmH
sHO
@@ -92275,7 +92257,7 @@ dgm
wIu
oHO
sDo
fhX
wlW
lsd
jJu
kya
@@ -92786,11 +92768,11 @@ rmM
btV
lMl
ayR
erJ
xMU
vDg
euP
all
eWf
lWK
eIx
kWg
bNq
@@ -113439,7 +113421,7 @@ dDB
blb
dDB
ldq
tUa
lwl
vXn
ldq
ldq
File diff suppressed because it is too large Load Diff
+238 -234
View File
@@ -166,14 +166,6 @@
/obj/effect/turf_decal/siding/yellow,
/turf/open/floor/carpet/royalblue,
/area/mine/living_quarters)
"bq" = (
/obj/structure/railing{
dir = 1
},
/obj/effect/turf_decal/stripes/line,
/obj/effect/turf_decal/stripes/white/line,
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"bt" = (
/obj/structure/disposalpipe/segment{
dir = 5
@@ -191,14 +183,6 @@
},
/turf/open/floor/iron/edge,
/area/mine/lounge)
"bx" = (
/obj/machinery/airalarm/directional/north,
/obj/effect/turf_decal/trimline/brown/filled/line{
dir = 9
},
/obj/structure/ore_box,
/turf/open/floor/iron/dark,
/area/mine/production)
"by" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/siding/wideplating_new{
@@ -295,12 +279,6 @@
/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental,
/turf/open/floor/plating,
/area/mine/maintenance/living/north)
"cg" = (
/obj/structure/cable,
/obj/machinery/power/smes/full,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/mine/maintenance/service)
"ch" = (
/obj/machinery/power/apc/auto_name/directional/west,
/obj/structure/cable,
@@ -535,12 +513,6 @@
/obj/structure/lattice/catwalk/mining,
/turf/open/lava/smooth/lava_land_surface,
/area/lavaland/surface/outdoors)
"dp" = (
/obj/structure/ore_vent/starter_resources{
icon_state = "ore_vent_active"
},
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"dq" = (
/obj/structure/stone_tile{
dir = 4
@@ -630,13 +602,18 @@
},
/turf/open/floor/iron/dark/smooth_edge,
/area/mine/production)
"dW" = (
/obj/structure/lattice/catwalk/mining,
/obj/structure/railing,
/obj/structure/railing{
dir = 1
"dV" = (
/obj/structure/railing/corner{
dir = 4
},
/turf/open/lava/smooth/lava_land_surface,
/obj/structure/railing/corner,
/obj/effect/turf_decal/stripes/line{
dir = 8
},
/obj/effect/turf_decal/stripes/white/line{
dir = 8
},
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"ee" = (
/obj/machinery/shower/directional/south,
@@ -824,6 +801,16 @@
},
/turf/open/floor/iron/checker,
/area/mine/cafeteria)
"fx" = (
/obj/structure/railing,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/obj/effect/turf_decal/stripes/white/line{
dir = 1
},
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"fA" = (
/obj/machinery/computer/shuttle/mining{
dir = 1
@@ -883,6 +870,10 @@
},
/turf/open/floor/plating/lavaland_atmos,
/area/lavaland/surface/outdoors)
"fP" = (
/obj/structure/gulag_vent,
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"fQ" = (
/turf/open/genturf,
/area/lavaland/surface/outdoors/unexplored/danger)
@@ -894,14 +885,6 @@
dir = 1
},
/area/mine/laborcamp/security)
"fT" = (
/obj/effect/turf_decal/loading_area,
/obj/effect/turf_decal/trimline/brown/filled/line{
dir = 5
},
/obj/structure/closet/crate/bin,
/turf/open/floor/iron/dark,
/area/mine/production)
"fU" = (
/obj/machinery/portable_atmospherics/canister/oxygen,
/turf/open/floor/plating,
@@ -1041,6 +1024,14 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/carpet,
/area/mine/living_quarters)
"gA" = (
/obj/structure/lattice/catwalk/mining,
/obj/structure/railing,
/obj/structure/railing{
dir = 1
},
/turf/open/lava/smooth/lava_land_surface,
/area/lavaland/surface/outdoors)
"gB" = (
/obj/structure/lattice/catwalk,
/obj/structure/disposalpipe/segment{
@@ -1135,6 +1126,14 @@
/obj/effect/turf_decal/sand/plating/volcanic,
/turf/open/floor/plating/lavaland_atmos,
/area/mine/maintenance/service/disposals)
"gW" = (
/obj/machinery/airalarm/directional/north,
/obj/effect/turf_decal/trimline/brown/filled/line{
dir = 9
},
/obj/structure/ore_box,
/turf/open/floor/iron/dark,
/area/mine/production)
"gZ" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 1
@@ -1538,13 +1537,6 @@
/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance,
/turf/open/floor/plating,
/area/mine/maintenance/public/north)
"jk" = (
/obj/structure/table,
/obj/item/storage/box/bandages{
pixel_y = 6
},
/turf/open/floor/iron/white,
/area/mine/laborcamp/production)
"jm" = (
/obj/machinery/door/airlock/public/glass{
name = "Showers"
@@ -1578,6 +1570,16 @@
/obj/structure/extinguisher_cabinet/directional/north,
/turf/open/floor/iron/edge,
/area/mine/living_quarters)
"js" = (
/obj/structure/lattice/catwalk/mining,
/obj/structure/railing/corner{
dir = 8
},
/obj/structure/railing/corner{
dir = 1
},
/turf/open/lava/smooth/lava_land_surface,
/area/lavaland/surface/outdoors)
"jw" = (
/obj/structure/disposalpipe/segment{
dir = 9
@@ -1722,24 +1724,6 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/mine/maintenance/living/north)
"kx" = (
/obj/effect/turf_decal/trimline/brown/filled/line,
/obj/structure/table,
/obj/item/paper/fluff/stations/lavaland/orm_notice,
/turf/open/floor/iron/dark/smooth_edge{
dir = 1
},
/area/mine/production)
"ky" = (
/obj/structure/railing{
dir = 6
},
/obj/effect/turf_decal/stripes/corner{
dir = 1
},
/obj/machinery/light/directional/south,
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"kB" = (
/obj/structure/stone_tile/surrounding_tile,
/obj/structure/stone_tile/surrounding_tile{
@@ -1783,6 +1767,15 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply,
/turf/open/floor/plating,
/area/mine/maintenance/service)
"kG" = (
/obj/structure/railing{
dir = 5
},
/obj/effect/turf_decal/stripes/corner{
dir = 8
},
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"kH" = (
/obj/structure/stone_tile/surrounding_tile{
dir = 1
@@ -1980,17 +1973,6 @@
},
/turf/open/lava/smooth/lava_land_surface,
/area/lavaland/surface/outdoors)
"lA" = (
/obj/machinery/recycler{
dir = 8
},
/obj/machinery/conveyor{
dir = 4;
id = "mining_disposals"
},
/obj/effect/turf_decal/sand/plating/volcanic,
/turf/open/floor/plating/lavaland_atmos,
/area/mine/maintenance/service/disposals)
"lC" = (
/obj/structure/stone_tile/block/cracked{
dir = 1
@@ -2105,18 +2087,6 @@
},
/turf/open/lava/smooth/lava_land_surface,
/area/lavaland/surface/outdoors)
"lT" = (
/obj/structure/railing{
dir = 8
},
/obj/effect/turf_decal/stripes/line{
dir = 4
},
/obj/effect/turf_decal/stripes/white/line{
dir = 4
},
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"lV" = (
/obj/structure/cable,
/obj/effect/turf_decal/trimline/red/filled/line{
@@ -2182,19 +2152,6 @@
/obj/structure/cable,
/turf/open/floor/iron/dark/textured_large,
/area/mine/hydroponics)
"mh" = (
/obj/structure/railing/corner{
dir = 4
},
/obj/structure/railing/corner,
/obj/effect/turf_decal/stripes/line{
dir = 8
},
/obj/effect/turf_decal/stripes/white/line{
dir = 8
},
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"mj" = (
/obj/structure/stone_tile/block,
/obj/structure/stone_tile/block{
@@ -2745,6 +2702,13 @@
/obj/effect/turf_decal/trimline/brown/filled/line,
/turf/open/floor/iron/dark/textured_large,
/area/mine/production)
"oy" = (
/obj/structure/lattice/catwalk/mining,
/obj/structure/railing{
dir = 8
},
/turf/open/lava/smooth/lava_land_surface,
/area/lavaland/surface/outdoors)
"oA" = (
/turf/closed/wall,
/area/mine/storage)
@@ -2870,6 +2834,12 @@
/obj/effect/spawner/random/trash/mess,
/turf/open/floor/iron/white,
/area/mine/laborcamp/production)
"ps" = (
/obj/structure/cable,
/obj/machinery/power/smes/full,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/mine/maintenance/service)
"pu" = (
/obj/item/chair/stool{
pixel_x = -2;
@@ -3310,6 +3280,23 @@
},
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"so" = (
/obj/structure/table,
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 10
},
/obj/item/storage/box/bandages{
pixel_y = 6;
pixel_x = 4
},
/obj/item/storage/pill_bottle/epinephrine{
pixel_x = -6;
pixel_y = 4
},
/turf/open/floor/iron/white/smooth_corner{
dir = 8
},
/area/mine/medical)
"st" = (
/obj/structure/chair/stool/directional/north,
/obj/effect/decal/cleanable/dirt,
@@ -3531,15 +3518,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/mine/storage)
"tO" = (
/obj/machinery/power/apc/auto_name/directional/south,
/obj/structure/cable,
/obj/effect/turf_decal/trimline/brown/filled/line,
/obj/structure/table,
/turf/open/floor/iron/dark/smooth_edge{
dir = 1
},
/area/mine/production)
"tV" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
@@ -4308,15 +4286,6 @@
},
/turf/open/floor/iron/checker,
/area/mine/cafeteria)
"yQ" = (
/obj/structure/railing{
dir = 5
},
/obj/effect/turf_decal/stripes/corner{
dir = 8
},
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"yR" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -4442,6 +4411,14 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/mine/maintenance/living/north)
"zD" = (
/obj/effect/turf_decal/loading_area{
dir = 1
},
/obj/structure/barricade/wooden/crude,
/obj/structure/barricade/wooden,
/turf/open/floor/iron/dark,
/area/mine/production)
"zF" = (
/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/blue/filled/line{
@@ -4474,6 +4451,18 @@
/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental,
/turf/open/floor/plating,
/area/mine/maintenance/service)
"zO" = (
/obj/structure/railing{
dir = 8
},
/obj/effect/turf_decal/stripes/line{
dir = 4
},
/obj/effect/turf_decal/stripes/white/line{
dir = 4
},
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"zQ" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/smooth_edge,
@@ -4494,14 +4483,6 @@
/obj/structure/cable,
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"Ac" = (
/obj/effect/turf_decal/bot,
/obj/effect/turf_decal/trimline/brown/filled/line{
dir = 10
},
/obj/machinery/computer/order_console/mining,
/turf/open/floor/iron/dark,
/area/mine/production)
"Ae" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -4509,14 +4490,6 @@
/obj/structure/lattice/catwalk,
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"Af" = (
/obj/machinery/mineral/processing_unit{
dir = 1;
input_dir = 8;
output_dir = 4
},
/turf/open/floor/plating,
/area/mine/laborcamp/production)
"Ai" = (
/obj/structure/stone_tile/cracked{
dir = 1
@@ -4616,13 +4589,6 @@
"AX" = (
/turf/open/floor/plating,
/area/mine/laborcamp/security/maintenance)
"AY" = (
/obj/structure/lattice/catwalk/mining,
/obj/structure/railing{
dir = 9
},
/turf/open/lava/smooth/lava_land_surface,
/area/lavaland/surface/outdoors)
"Bb" = (
/obj/machinery/camera/autoname/directional/east{
network = list("mine")
@@ -4991,6 +4957,11 @@
/obj/effect/turf_decal/sand/plating/volcanic,
/turf/open/floor/plating/lavaland_atmos,
/area/lavaland/surface/outdoors)
"Ee" = (
/obj/machinery/power/smes/full,
/obj/structure/cable,
/turf/open/floor/plating,
/area/mine/maintenance/labor)
"Eg" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/disposalpipe/segment,
@@ -5004,14 +4975,12 @@
/turf/open/floor/plating/lavaland_atmos,
/area/mine/maintenance/service/disposals)
"Ep" = (
/obj/structure/lattice/catwalk/mining,
/obj/structure/railing/corner{
dir = 8
},
/obj/structure/railing/corner{
/obj/structure/railing{
dir = 1
},
/turf/open/lava/smooth/lava_land_surface,
/obj/effect/turf_decal/stripes/line,
/obj/effect/turf_decal/stripes/white/line,
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"Eq" = (
/obj/machinery/door/airlock/security/glass{
@@ -5357,13 +5326,6 @@
},
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"GV" = (
/obj/structure/lattice/catwalk/mining,
/obj/structure/railing{
dir = 8
},
/turf/open/lava/smooth/lava_land_surface,
/area/lavaland/surface/outdoors)
"GW" = (
/obj/structure/chair/office{
dir = 1
@@ -5407,11 +5369,6 @@
/obj/machinery/power/apc/auto_name/directional/north,
/turf/open/floor/plating,
/area/mine/maintenance/public/north)
"Hi" = (
/obj/machinery/power/smes/full,
/obj/structure/cable,
/turf/open/floor/plating,
/area/mine/maintenance/labor)
"Hp" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
/obj/effect/turf_decal/trimline/brown/filled/line{
@@ -5793,6 +5750,13 @@
/obj/machinery/light/small/directional/south,
/turf/open/floor/plating,
/area/mine/laborcamp/production)
"Jz" = (
/obj/structure/lattice/catwalk/mining,
/obj/structure/railing{
dir = 10
},
/turf/open/lava/smooth/lava_land_surface,
/area/lavaland/surface/outdoors)
"JA" = (
/obj/machinery/computer/shuttle/mining/common,
/obj/structure/sign/directions/evac/directional/east{
@@ -5879,13 +5843,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
/area/mine/laborcamp/security/maintenance)
"JO" = (
/obj/structure/lattice/catwalk/mining,
/obj/structure/railing{
dir = 10
},
/turf/open/lava/smooth/lava_land_surface,
/area/lavaland/surface/outdoors)
"JP" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -5898,23 +5855,6 @@
dir = 1
},
/area/mine/living_quarters)
"JQ" = (
/obj/structure/table,
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 10
},
/obj/item/storage/box/bandages{
pixel_y = 6;
pixel_x = 4
},
/obj/item/storage/pill_bottle/epinephrine{
pixel_x = -6;
pixel_y = 4
},
/turf/open/floor/iron/white/smooth_corner{
dir = 8
},
/area/mine/medical)
"JR" = (
/obj/structure/stone_tile,
/obj/structure/stone_tile{
@@ -6290,6 +6230,13 @@
dir = 4
},
/area/mine/lounge)
"LO" = (
/obj/structure/table,
/obj/item/storage/box/bandages{
pixel_y = 6
},
/turf/open/floor/iron/white,
/area/mine/laborcamp/production)
"LR" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/cable,
@@ -6306,6 +6253,14 @@
},
/turf/open/floor/plating/lavaland_atmos,
/area/lavaland/surface/outdoors)
"LT" = (
/obj/machinery/mineral/processing_unit/gulag{
dir = 1;
input_dir = 8;
output_dir = 4
},
/turf/open/floor/plating,
/area/mine/laborcamp/production)
"LY" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 8
@@ -6576,6 +6531,14 @@
/obj/effect/turf_decal/tile/blue/fourcorners,
/turf/open/floor/iron,
/area/mine/living_quarters)
"NG" = (
/obj/effect/turf_decal/bot,
/obj/effect/turf_decal/trimline/brown/filled/line{
dir = 10
},
/obj/machinery/computer/order_console/mining,
/turf/open/floor/iron/dark,
/area/mine/production)
"NL" = (
/obj/structure/railing,
/obj/structure/lattice/catwalk/mining,
@@ -6878,6 +6841,17 @@
},
/turf/open/floor/plating,
/area/mine/production)
"PL" = (
/obj/machinery/recycler{
dir = 8
},
/obj/machinery/conveyor{
dir = 4;
id = "mining_disposals"
},
/obj/effect/turf_decal/sand/plating/volcanic,
/turf/open/floor/plating/lavaland_atmos,
/area/mine/maintenance/service/disposals)
"PR" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/carpet/executive,
@@ -6959,13 +6933,9 @@
},
/turf/open/floor/iron/dark,
/area/mine/mechbay)
"Qm" = (
/obj/structure/railing,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/obj/effect/turf_decal/stripes/white/line{
dir = 1
"Qq" = (
/obj/structure/ore_vent/starter_resources{
icon_state = "ore_vent_active"
},
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
@@ -7056,6 +7026,16 @@
dir = 4
},
/area/mine/production)
"QV" = (
/obj/structure/railing{
dir = 6
},
/obj/effect/turf_decal/stripes/corner{
dir = 1
},
/obj/machinery/light/directional/south,
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"QX" = (
/turf/closed/wall,
/area/mine/mechbay)
@@ -7100,6 +7080,14 @@
},
/turf/open/floor/iron/dark,
/area/mine/production)
"Ro" = (
/obj/effect/turf_decal/loading_area,
/obj/effect/turf_decal/trimline/brown/filled/line{
dir = 5
},
/obj/structure/closet/crate/bin,
/turf/open/floor/iron/dark,
/area/mine/production)
"Rs" = (
/obj/machinery/conveyor{
dir = 6;
@@ -7176,14 +7164,6 @@
/obj/structure/lattice/catwalk,
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"RS" = (
/obj/effect/turf_decal/loading_area{
dir = 1
},
/obj/structure/barricade/wooden/crude,
/obj/structure/barricade/wooden,
/turf/open/floor/iron/dark,
/area/mine/production)
"RV" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 4
@@ -7385,6 +7365,14 @@
},
/turf/open/floor/iron/dark/smooth_edge,
/area/mine/eva)
"Ti" = (
/obj/effect/turf_decal/trimline/brown/filled/line,
/obj/structure/table,
/obj/item/paper/fluff/stations/lavaland/orm_notice,
/turf/open/floor/iron/dark/smooth_edge{
dir = 1
},
/area/mine/production)
"To" = (
/obj/structure/table,
/obj/machinery/reagentgrinder,
@@ -7432,6 +7420,13 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/mine/maintenance/living/north)
"TD" = (
/obj/effect/turf_decal/trimline/brown/filled/line{
dir = 1
},
/obj/structure/ore_box,
/turf/open/floor/iron/dark/smooth_edge,
/area/mine/production)
"TF" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -7660,13 +7655,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
/area/mine/laborcamp/security/maintenance)
"UW" = (
/obj/effect/turf_decal/trimline/brown/filled/line{
dir = 1
},
/obj/structure/ore_box,
/turf/open/floor/iron/dark/smooth_edge,
/area/mine/production)
"UZ" = (
/obj/structure/chair/stool/directional/west,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -7847,6 +7835,15 @@
},
/turf/open/floor/iron/dark/textured_large,
/area/mine/laborcamp)
"VZ" = (
/obj/machinery/power/apc/auto_name/directional/south,
/obj/structure/cable,
/obj/effect/turf_decal/trimline/brown/filled/line,
/obj/structure/table,
/turf/open/floor/iron/dark/smooth_edge{
dir = 1
},
/area/mine/production)
"Wb" = (
/obj/structure/cable,
/turf/open/floor/iron/dark/textured_large,
@@ -7894,6 +7891,13 @@
},
/turf/open/floor/carpet/neon/simple/red/nodots,
/area/mine/cafeteria)
"Wy" = (
/obj/structure/lattice/catwalk/mining,
/obj/structure/railing{
dir = 9
},
/turf/open/lava/smooth/lava_land_surface,
/area/lavaland/surface/outdoors)
"WB" = (
/obj/machinery/disposal/bin,
/obj/structure/disposalpipe/trunk,
@@ -22569,7 +22573,7 @@ uU
uU
uU
pU
pU
fP
pU
ff
Gf
@@ -23851,7 +23855,7 @@ aj
aj
eR
Kw
jk
LO
ff
mU
Fv
@@ -24373,7 +24377,7 @@ Hd
Nb
NR
Kv
Af
LT
ff
gm
mN
@@ -28234,7 +28238,7 @@ Zt
Zt
Zt
Zt
Hi
Ee
ve
RD
RD
@@ -36428,7 +36432,7 @@ pU
mA
su
xG
lA
PL
Sd
pU
aj
@@ -38481,7 +38485,7 @@ Ue
AA
gB
ON
cg
ps
gq
ER
vc
@@ -39546,7 +39550,7 @@ yp
yp
Dz
LG
JQ
so
It
Xp
Ss
@@ -45941,9 +45945,9 @@ pU
aj
aj
aj
AY
lT
JO
Wy
zO
Jz
aj
oA
Lu
@@ -46198,9 +46202,9 @@ aj
aj
aj
aj
bq
dp
Qm
Ep
Qq
fx
aj
oA
Lz
@@ -46455,9 +46459,9 @@ pU
pU
aj
aj
yQ
mh
ky
kG
dV
QV
NU
NU
NU
@@ -46713,7 +46717,7 @@ pU
pU
aj
aj
dW
gA
aj
Le
Lh
@@ -46969,8 +46973,8 @@ pU
pU
AQ
ZM
GV
Ep
oy
js
ZM
Ki
Uq
@@ -47748,10 +47752,10 @@ NU
NU
NU
NU
bx
gW
Xj
QT
Ac
NG
pK
No
Hp
@@ -48004,11 +48008,11 @@ pU
pU
NU
PI
RS
UW
zD
TD
Vw
wl
kx
Ti
pK
lg
se
@@ -48265,7 +48269,7 @@ zJ
oi
Ts
Wb
tO
VZ
pK
Tf
Jp
@@ -48777,7 +48781,7 @@ NU
Rs
rP
JG
fT
Ro
op
NU
pK
+173 -175
View File
@@ -597,16 +597,6 @@
dir = 1
},
/area/station/escapepodbay)
"aci" = (
/obj/structure/railing{
dir = 4
},
/obj/effect/turf_decal/trimline/red/filled/line{
dir = 4
},
/obj/machinery/photobooth/security,
/turf/open/floor/iron,
/area/station/security/execution/transfer)
"acj" = (
/turf/open/floor/iron/stairs/medium{
dir = 1
@@ -6018,6 +6008,11 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/science/robotics/lab)
"aUc" = (
/obj/item/radio/intercom/directional/east,
/obj/machinery/photobooth,
/turf/open/floor/iron/grimy,
/area/station/service/library/lounge)
"aUh" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -7521,6 +7516,15 @@
},
/turf/open/floor/iron/white,
/area/station/command/heads_quarters/captain/private)
"bCx" = (
/obj/structure/railing{
dir = 8
},
/obj/machinery/door/firedoor/border_only{
dir = 8
},
/turf/open/floor/glass/reinforced,
/area/station/science/research)
"bDf" = (
/obj/structure/table/reinforced,
/obj/item/folder/yellow,
@@ -8262,6 +8266,12 @@
},
/turf/open/floor/iron,
/area/station/commons/storage/primary)
"bNI" = (
/obj/machinery/airalarm/directional/north,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/machinery/modular_computer/preset/cargochat/service,
/turf/open/floor/iron,
/area/station/hallway/secondary/service)
"bNJ" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -12269,10 +12279,6 @@
"dfz" = (
/turf/closed/wall/r_wall,
/area/station/science/ordnance/storage)
"dfC" = (
/mob/living/basic/slime,
/turf/open/floor/engine,
/area/station/science/xenobiology)
"dfE" = (
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 5
@@ -19485,13 +19491,6 @@
/obj/item/radio/intercom/directional/south,
/turf/open/floor/iron,
/area/station/science/explab)
"fRb" = (
/obj/effect/turf_decal/trimline/neutral/filled/line{
dir = 9
},
/obj/item/radio/intercom/directional/north,
/turf/open/floor/iron,
/area/station/hallway/secondary/service)
"fRs" = (
/obj/effect/turf_decal/stripes/line{
dir = 10
@@ -20093,6 +20092,20 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/command/heads_quarters/qm)
"gbZ" = (
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 1
},
/obj/machinery/camera/directional/north{
c_tag = "Science - Research & Development";
network = list("ss13","rd")
},
/obj/structure/disposalpipe/segment{
dir = 4
},
/obj/item/kirbyplants/organic/plant10,
/turf/open/floor/iron/white,
/area/station/science/lab)
"gcp" = (
/turf/closed/wall/r_wall,
/area/station/commons/vacant_room)
@@ -22957,13 +22970,6 @@
"hhc" = (
/turf/open/floor/iron/dark,
/area/station/command/bridge)
"hhf" = (
/obj/machinery/power/smes{
charge = 5e+06
},
/obj/structure/cable,
/turf/open/floor/circuit,
/area/station/ai_monitored/turret_protected/ai)
"hht" = (
/obj/effect/landmark/event_spawn,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -23161,6 +23167,15 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/checker,
/area/station/commons/lounge)
"hjz" = (
/obj/effect/turf_decal/siding/white{
dir = 1
},
/obj/machinery/modular_computer/preset/cargochat/medical{
dir = 1
},
/turf/open/floor/iron/dark,
/area/station/medical/storage)
"hjM" = (
/obj/structure/railing/corner{
dir = 4
@@ -25712,6 +25727,18 @@
},
/turf/open/floor/carpet,
/area/station/service/chapel/monastery)
"ikM" = (
/obj/structure/cable,
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 8
},
/obj/structure/disposalpipe/segment{
dir = 6
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/white,
/area/station/medical/medbay/central)
"ikT" = (
/obj/effect/turf_decal/trimline/dark_red/warning{
dir = 10
@@ -26539,6 +26566,19 @@
},
/turf/open/floor/iron,
/area/station/cargo/miningdock)
"iBo" = (
/obj/machinery/camera/directional/north{
c_tag = "Service - Autolathe Room"
},
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/machinery/light/dim/directional/north,
/obj/structure/table,
/obj/machinery/fax{
fax_name = "Service Hallway";
name = "Service Fax Machine"
},
/turf/open/floor/iron,
/area/station/hallway/secondary/service)
"iBx" = (
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 1
@@ -27794,6 +27834,14 @@
},
/turf/open/floor/plating/airless,
/area/station/asteroid)
"iYO" = (
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 1
},
/obj/machinery/newscaster/directional/north,
/obj/machinery/modular_computer/preset/cargochat/science,
/turf/open/floor/iron/white,
/area/station/science/lab)
"iZb" = (
/turf/closed/wall,
/area/station/security/office)
@@ -31330,6 +31378,16 @@
/obj/effect/mapping_helpers/airlock/locked,
/turf/open/floor/catwalk_floor,
/area/station/maintenance/tram/mid)
"kfH" = (
/obj/structure/railing{
dir = 4
},
/obj/effect/turf_decal/trimline/red/filled/line{
dir = 4
},
/obj/machinery/photobooth/security,
/turf/open/floor/iron,
/area/station/security/execution/transfer)
"kfO" = (
/turf/open/floor/plating,
/area/station/cargo/drone_bay)
@@ -33908,6 +33966,13 @@
},
/turf/open/space/openspace,
/area/station/solars/port)
"kXq" = (
/obj/structure/cable/multilayer/multiz,
/obj/effect/turf_decal/stripes/line{
dir = 4
},
/turf/open/floor/plating,
/area/station/ai_monitored/turret_protected/ai)
"kXr" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
@@ -34662,6 +34727,11 @@
},
/turf/open/floor/iron,
/area/station/hallway/secondary/construction/engineering)
"llW" = (
/obj/machinery/power/smes/full,
/obj/structure/cable,
/turf/open/floor/circuit,
/area/station/ai_monitored/turret_protected/ai)
"lml" = (
/turf/closed/wall/r_wall,
/area/station/engineering/atmos/pumproom)
@@ -37150,18 +37220,6 @@
"mbJ" = (
/turf/closed/wall,
/area/station/maintenance/tram/right)
"mbK" = (
/obj/structure/cable,
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 8
},
/obj/structure/disposalpipe/segment{
dir = 6
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/white,
/area/station/medical/medbay/central)
"mbQ" = (
/obj/effect/turf_decal/trimline/brown/filled/line{
dir = 4
@@ -37232,17 +37290,6 @@
},
/turf/open/floor/plating,
/area/station/command/heads_quarters/rd)
"mdk" = (
/obj/effect/turf_decal/trimline/brown/filled/line{
dir = 5
},
/obj/effect/turf_decal/trimline/yellow/filled/warning{
dir = 5
},
/obj/structure/cable,
/obj/structure/table,
/turf/open/floor/iron,
/area/station/engineering/break_room)
"mdl" = (
/obj/effect/turf_decal/trimline/white/warning{
dir = 6
@@ -37628,25 +37675,6 @@
/obj/machinery/newscaster/directional/north,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
"mjy" = (
/obj/effect/turf_decal/trimline/red/filled/line{
dir = 9
},
/obj/machinery/status_display/evac/directional/west,
/obj/effect/turf_decal/trimline/red/filled/warning{
dir = 4
},
/obj/structure/table,
/obj/item/paper_bin{
pixel_x = -3;
pixel_y = 7
},
/obj/item/pen{
pixel_x = 3;
pixel_y = 8
},
/turf/open/floor/iron,
/area/station/security/office)
"mjF" = (
/obj/structure/disposalpipe/sorting/mail/flip{
dir = 4
@@ -38874,11 +38902,6 @@
/obj/structure/railing,
/turf/open/floor/iron/dark,
/area/station/command/heads_quarters/hop)
"mHZ" = (
/obj/item/radio/intercom/directional/east,
/obj/machinery/photobooth,
/turf/open/floor/iron/grimy,
/area/station/service/library/lounge)
"mId" = (
/obj/effect/turf_decal/trimline/green/filled/line,
/obj/effect/turf_decal/trimline/green/filled/line{
@@ -39212,6 +39235,13 @@
/obj/machinery/light/directional/west,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"mOq" = (
/obj/effect/turf_decal/trimline/neutral/filled/line{
dir = 9
},
/obj/item/radio/intercom/directional/north,
/turf/open/floor/iron,
/area/station/hallway/secondary/service)
"mOB" = (
/obj/structure/table,
/obj/item/analyzer,
@@ -42013,6 +42043,11 @@
/obj/effect/landmark/event_spawn,
/turf/open/floor/iron,
/area/station/engineering/engine_smes)
"nOB" = (
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/structure/reagent_dispensers/watertank,
/turf/open/floor/iron,
/area/station/hallway/secondary/service)
"nOI" = (
/obj/machinery/power/apc/auto_name/directional/south,
/obj/structure/disposalpipe/segment{
@@ -43829,6 +43864,10 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/grass,
/area/station/medical/virology)
"oxe" = (
/mob/living/basic/slime,
/turf/open/floor/engine,
/area/station/science/xenobiology)
"oxf" = (
/obj/structure/railing,
/obj/effect/turf_decal/trimline/dark_blue/arrow_cw,
@@ -44705,6 +44744,25 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron,
/area/station/commons/storage/primary)
"oSu" = (
/obj/effect/turf_decal/trimline/red/filled/line{
dir = 9
},
/obj/machinery/status_display/evac/directional/west,
/obj/effect/turf_decal/trimline/red/filled/warning{
dir = 4
},
/obj/structure/table,
/obj/item/paper_bin{
pixel_x = -3;
pixel_y = 7
},
/obj/item/pen{
pixel_x = 3;
pixel_y = 8
},
/turf/open/floor/iron,
/area/station/security/office)
"oSB" = (
/obj/machinery/camera/directional/west{
network = list("ss13","Security","cargo");
@@ -46707,15 +46765,6 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/cargo/sorting)
"pBU" = (
/obj/structure/railing{
dir = 8
},
/obj/machinery/door/firedoor/border_only{
dir = 8
},
/turf/open/floor/glass/reinforced,
/area/station/science/research)
"pBZ" = (
/obj/structure/railing/corner{
dir = 4
@@ -47471,20 +47520,6 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/commons/storage/primary)
"pOY" = (
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 1
},
/obj/machinery/camera/directional/north{
c_tag = "Science - Research & Development";
network = list("ss13","rd")
},
/obj/structure/disposalpipe/segment{
dir = 4
},
/obj/item/kirbyplants/organic/plant10,
/turf/open/floor/iron/white,
/area/station/science/lab)
"pOZ" = (
/obj/machinery/portable_atmospherics/scrubber,
/obj/effect/turf_decal/trimline/red/filled/line{
@@ -48979,11 +49014,6 @@
/obj/effect/spawner/structure/window,
/turf/open/floor/plating,
/area/station/commons/fitness/recreation)
"qqm" = (
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/structure/reagent_dispensers/watertank,
/turf/open/floor/iron,
/area/station/hallway/secondary/service)
"qqv" = (
/obj/machinery/atmospherics/components/unary/outlet_injector/on,
/obj/machinery/light/directional/north,
@@ -49258,21 +49288,23 @@
},
/turf/open/floor/iron,
/area/station/command/bridge)
"qvR" = (
/obj/structure/railing{
dir = 4
},
/obj/machinery/door/firedoor/border_only{
dir = 4
},
/turf/open/floor/glass/reinforced,
/area/station/science/research)
"qvV" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 8
},
/turf/open/floor/iron,
/area/station/security/prison/work)
"qwn" = (
/obj/effect/turf_decal/trimline/brown/filled/line{
dir = 5
},
/obj/effect/turf_decal/trimline/yellow/filled/warning{
dir = 5
},
/obj/structure/cable,
/obj/structure/table,
/turf/open/floor/iron,
/area/station/engineering/break_room)
"qwq" = (
/obj/structure/table/wood,
/obj/item/radio/intercom,
@@ -51907,6 +51939,15 @@
/obj/effect/mapping_helpers/airlock/unres,
/turf/open/floor/catwalk_floor,
/area/station/maintenance/starboard/central)
"rpq" = (
/obj/structure/railing{
dir = 4
},
/obj/machinery/door/firedoor/border_only{
dir = 4
},
/turf/open/floor/glass/reinforced,
/area/station/science/research)
"rpr" = (
/obj/effect/turf_decal/siding/thinplating/corner{
dir = 4
@@ -57000,15 +57041,6 @@
/obj/machinery/shower/directional/south,
/turf/open/floor/iron/freezer,
/area/station/commons/toilet)
"thm" = (
/obj/effect/turf_decal/siding/white{
dir = 1
},
/obj/machinery/modular_computer/preset/cargochat/medical{
dir = 1
},
/turf/open/floor/iron/dark,
/area/station/medical/storage)
"thG" = (
/obj/effect/turf_decal/trimline/red/filled/line,
/obj/effect/turf_decal/trimline/red/filled/corner{
@@ -62777,19 +62809,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron,
/area/station/security/checkpoint/medical)
"vbl" = (
/obj/machinery/camera/directional/north{
c_tag = "Service - Autolathe Room"
},
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/machinery/light/dim/directional/north,
/obj/structure/table,
/obj/machinery/fax{
fax_name = "Service Hallway";
name = "Service Fax Machine"
},
/turf/open/floor/iron,
/area/station/hallway/secondary/service)
"vbt" = (
/obj/machinery/computer/atmos_control/oxygen_tank{
atmos_chambers = list(o2ordance="Oxygen Supply")
@@ -65292,13 +65311,6 @@
},
/turf/open/floor/plating,
/area/station/construction/mining/aux_base)
"vTD" = (
/obj/structure/cable/multilayer/multiz,
/obj/effect/turf_decal/stripes/line{
dir = 4
},
/turf/open/floor/iron/dark,
/area/station/ai_monitored/turret_protected/ai)
"vTE" = (
/obj/machinery/camera{
dir = 9;
@@ -66034,12 +66046,6 @@
/obj/structure/railing/corner,
/turf/open/space/openspace,
/area/station/solars/starboard/fore)
"whX" = (
/obj/machinery/airalarm/directional/north,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/machinery/modular_computer/preset/cargochat/service,
/turf/open/floor/iron,
/area/station/hallway/secondary/service)
"wid" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment,
@@ -66913,14 +66919,6 @@
/obj/structure/sign/warning/electric_shock,
/turf/closed/wall/r_wall,
/area/station/maintenance/port/central)
"wzX" = (
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 1
},
/obj/machinery/newscaster/directional/north,
/obj/machinery/modular_computer/preset/cargochat/science,
/turf/open/floor/iron/white,
/area/station/science/lab)
"wAa" = (
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 4
@@ -86737,7 +86735,7 @@ jWs
jvE
eLB
abU
aci
kfH
acv
acH
sXc
@@ -102685,10 +102683,10 @@ apl
iRL
snQ
iRL
whX
bNI
tbm
nNZ
qqm
nOB
cWZ
klk
kNo
@@ -103199,7 +103197,7 @@ bje
iRL
snQ
iRL
fRb
mOq
twg
dWn
cWZ
@@ -103752,7 +103750,7 @@ ixT
gYI
cgR
ial
mdk
qwn
amV
mvy
iXQ
@@ -103970,7 +103968,7 @@ aeF
iRL
quF
iRL
vbl
iBo
sWF
iog
cWZ
@@ -115592,7 +115590,7 @@ dUT
gdC
qVr
bfH
dfC
oxe
ahk
hdA
mBm
@@ -115604,7 +115602,7 @@ hik
sml
bfH
bfH
dfC
oxe
jTC
qVr
aaa
@@ -118676,7 +118674,7 @@ hFH
tYB
qVr
jTC
dfC
oxe
bfH
bfH
nbI
@@ -118688,7 +118686,7 @@ rbU
uAF
ahk
hdA
dfC
oxe
bfH
qVr
aaa
@@ -152593,7 +152591,7 @@ cSr
rAS
xzI
uYa
mHZ
aUc
ppK
rAS
rAS
@@ -156634,7 +156632,7 @@ dEv
ukw
pyF
dEv
mjy
oSu
rWT
gYd
isV
@@ -166203,7 +166201,7 @@ kZD
wAe
glU
jSc
thm
hjz
xRx
aLw
pVk
@@ -167228,7 +167226,7 @@ jAc
kkd
qNI
mrC
mbK
ikM
tOw
kGa
djz
@@ -182133,14 +182131,14 @@ wxu
yjY
eYS
oxL
pOY
gbZ
oGO
xQN
mEt
vNk
kTU
xyt
qvR
rpq
ovC
dCq
uiV
@@ -183161,14 +183159,14 @@ aIv
aHQ
tJz
oxL
wzX
iYO
lpC
vTb
vTb
rbn
crj
wWT
pBU
bCx
uvB
rBb
tbK
@@ -185803,7 +185801,7 @@ jLx
ffe
mgi
pIQ
hhf
llW
xZx
rSB
dVM
@@ -186316,7 +186314,7 @@ mYB
njC
aoh
iUO
vTD
kXq
lxi
njC
mEb
+2
View File
@@ -14,6 +14,8 @@
#define IMMUNE_TO_FISTS (1<<4)
/// Mob is immune to getting wet
#define IMMUNE_TO_GETTING_WET (1<<5)
/// Disables the function of attacking random body zones
#define PRECISE_ATTACK_ZONES (1<<6)
/// Temporary trait applied when an attack forecast animation has completed
#define TRAIT_BASIC_ATTACK_FORECAST "trait_basic_attack_forecast"
+8
View File
@@ -0,0 +1,8 @@
/// Action has succeeded, preventing further alt click interaction
#define CLICK_ACTION_SUCCESS (1<<0)
/// Action failed, preventing further alt click interaction
#define CLICK_ACTION_BLOCKING (1<<1)
/// Either return state
#define CLICK_ACTION_ANY (CLICK_ACTION_SUCCESS | CLICK_ACTION_BLOCKING)
/// Use NONE for continue interaction
+2
View File
@@ -282,6 +282,8 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(
#define BODY_ZONE_L_LEG "l_leg"
#define BODY_ZONE_R_LEG "r_leg"
GLOBAL_LIST_INIT(all_body_zones, list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG))
GLOBAL_LIST_INIT(limb_zones, list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG))
GLOBAL_LIST_INIT(arm_zones, list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
#define BODY_ZONE_PRECISE_EYES "eyes"
@@ -13,7 +13,6 @@
#define COMSIG_CLICK_CTRL "ctrl_click"
///from base of atom/AltClick(): (/mob)
#define COMSIG_CLICK_ALT "alt_click"
#define COMPONENT_CANCEL_CLICK_ALT (1<<0)
///from base of atom/alt_click_secondary(): (/mob)
#define COMSIG_CLICK_ALT_SECONDARY "alt_click_secondary"
#define COMPONENT_CANCEL_CLICK_ALT_SECONDARY (1<<0)
@@ -182,8 +182,6 @@
#define COMSIG_MOB_ITEM_AFTERATTACK "mob_item_afterattack"
///from base of obj/item/afterattack_secondary(): (atom/target, obj/item/weapon, proximity_flag, click_parameters)
#define COMSIG_MOB_ITEM_AFTERATTACK_SECONDARY "mob_item_afterattack_secondary"
///from base of obj/item/attack_qdeleted(): (atom/target, mob/user, proximity_flag, click_parameters)
#define COMSIG_MOB_ITEM_ATTACK_QDELETED "mob_item_attack_qdeleted"
///from base of mob/RangedAttack(): (atom/A, modifiers)
#define COMSIG_MOB_ATTACK_RANGED "mob_attack_ranged"
///from base of mob/ranged_secondary_attack(): (atom/target, modifiers)
@@ -472,8 +472,6 @@
#define COMPONENT_AFTERATTACK_PROCESSED_ITEM (1<<0)
///from base of obj/item/afterattack_secondary(): (atom/target, mob/user, proximity_flag, click_parameters)
#define COMSIG_ITEM_AFTERATTACK_SECONDARY "item_afterattack_secondary"
///from base of obj/item/attack_qdeleted(): (atom/target, mob/user, params)
#define COMSIG_ITEM_ATTACK_QDELETED "item_attack_qdeleted"
///from base of obj/item/embedded(): (atom/target, obj/item/bodypart/part)
#define COMSIG_ITEM_EMBEDDED "item_embedded"
///from base of datum/component/embedded/safeRemove(): (mob/living/carbon/victim)
+2 -5
View File
@@ -36,10 +36,7 @@
#define INTERACT_MACHINE_OPEN_SILICON (1<<4)
/// must be silicon to interact
#define INTERACT_MACHINE_REQUIRES_SILICON (1<<5)
/// This flag determines if a machine set_machine's the user when the user uses it, making updateUsrDialog make the user re-call interact() on it.
/// This is exclusively used for non-TGUI UIs, and its instances should be removed when moved to TGUI.
#define INTERACT_MACHINE_SET_MACHINE (1<<6)
/// the user must have vision to interact (blind people need not apply)
#define INTERACT_MACHINE_REQUIRES_SIGHT (1<<7)
#define INTERACT_MACHINE_REQUIRES_SIGHT (1<<6)
/// the user must be able to read to interact
#define INTERACT_MACHINE_REQUIRES_LITERACY (1<<8)
#define INTERACT_MACHINE_REQUIRES_LITERACY (1<<7)
+4
View File
@@ -855,6 +855,10 @@ GLOBAL_LIST_INIT(layers_to_offset, list(
#define ALLOW_SILICON_REACH (1<<6)
/// If resting on the floor is allowed to perform action (pAIs can play music while resting)
#define ALLOW_RESTING (1<<7)
/// If this is accessible to creatures with ventcrawl capabilities
#define NEED_VENTCRAWL (1<<8)
/// Checks for base adjacency, but silences the error
#define SILENT_ADJACENCY (1<<9)
/// The default mob sprite size (used for shrinking or enlarging the mob sprite to regular size)
#define RESIZE_DEFAULT_SIZE 1
+13 -14
View File
@@ -2,20 +2,19 @@
#define EMAGGED (1<<0)
#define IN_USE (1<<1) // If we have a user using us, this will be set on. We will check if the user has stopped using us, and thus stop updating and LAGGING EVERYTHING!
#define CAN_BE_HIT (1<<2) //can this be bludgeoned by items?
#define DANGEROUS_POSSESSION (1<<3) //Admin possession yes/no
#define UNIQUE_RENAME (1<<4) // can you customize the description/name of the thing?
#define BLOCK_Z_OUT_DOWN (1<<5) // Should this object block z falling from loc?
#define BLOCK_Z_OUT_UP (1<<6) // Should this object block z uprise from loc?
#define BLOCK_Z_IN_DOWN (1<<7) // Should this object block z falling from above?
#define BLOCK_Z_IN_UP (1<<8) // Should this object block z uprise from below?
#define BLOCKS_CONSTRUCTION (1<<9) //! Does this object prevent things from being built on it?
#define BLOCKS_CONSTRUCTION_DIR (1<<10) //! Does this object prevent same-direction things from being built on it?
#define IGNORE_DENSITY (1<<11) //! Can we ignore density when building on this object? (for example, directional windows and grilles)
#define INFINITE_RESKIN (1<<12) // We can reskin this item infinitely
#define CONDUCTS_ELECTRICITY (1<<13) //! Can this object conduct electricity?
#define NO_DEBRIS_AFTER_DECONSTRUCTION (1<<14) //! Atoms don't spawn anything when deconstructed. They just vanish
#define CAN_BE_HIT (1<<1) //can this be bludgeoned by items?
#define DANGEROUS_POSSESSION (1<<2) //Admin possession yes/no
#define UNIQUE_RENAME (1<<3) // can you customize the description/name of the thing?
#define BLOCK_Z_OUT_DOWN (1<<4) // Should this object block z falling from loc?
#define BLOCK_Z_OUT_UP (1<<5) // Should this object block z uprise from loc?
#define BLOCK_Z_IN_DOWN (1<<6) // Should this object block z falling from above?
#define BLOCK_Z_IN_UP (1<<7) // Should this object block z uprise from below?
#define BLOCKS_CONSTRUCTION (1<<8) //! Does this object prevent things from being built on it?
#define BLOCKS_CONSTRUCTION_DIR (1<<9) //! Does this object prevent same-direction things from being built on it?
#define IGNORE_DENSITY (1<<10) //! Can we ignore density when building on this object? (for example, directional windows and grilles)
#define INFINITE_RESKIN (1<<11) // We can reskin this item infinitely
#define CONDUCTS_ELECTRICITY (1<<12) //! Can this object conduct electricity?
#define NO_DEBRIS_AFTER_DECONSTRUCTION (1<<13) //! Atoms don't spawn anything when deconstructed. They just vanish
// If you add new ones, be sure to add them to /obj/Initialize as well for complete mapping support
+1
View File
@@ -111,6 +111,7 @@
#define MAX_CHARTER_LEN 80
#define MAX_PLAQUE_LEN 144
#define MAX_LABEL_LEN 64
#define MAX_DESC_LEN 280
// Audio/Visual Flags. Used to determine what sense are required to notice a message.
#define MSG_VISUAL (1<<0)
+1
View File
@@ -191,6 +191,7 @@
#define INIT_ORDER_MATURITY_GUARD -60 //SKYRAT EDIT ADDITION
#define INIT_ORDER_DECAY -61 //SKYRAT EDIT ADDITION
#define INIT_ORDER_EXPLOSIONS -69
#define INIT_ORDER_LOOT -70
#define INIT_ORDER_STATPANELS -97
#define INIT_ORDER_BAN_CACHE -98
#define INIT_ORDER_INIT_PROFILER -99 //Near the end, logs the costs of initialize
+1
View File
@@ -767,6 +767,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_POSTERBOY "poster_boy"
#define TRAIT_THROWINGARM "throwing_arm"
#define TRAIT_SETTLER "settler"
#define TRAIT_STRONG_STOMACH "strong_stomach"
/// This mob always lands on their feet when they fall, for better or for worse.
#define TRAIT_CATLIKE_GRACE "catlike_grace"
+2 -2
View File
@@ -286,8 +286,8 @@
/// Trait from an organ being inside a bodypart
#define ORGAN_INSIDE_BODY_TRAIT "organ_inside_body"
/// Trait when something was labelled by a pen.
#define PEN_LABEL_TRAIT "pen_label"
/// Trait when something was labelled by the /datum/element/tool_renaming element.
#define RENAMING_TOOL_LABEL_TRAIT "renaming_tool_label"
/// Trait when a drink was renamed by a shaker
#define SHAKER_LABEL_TRAIT "shaker_trait"
+3 -4
View File
@@ -59,14 +59,13 @@
#define HEADSMASH_BLOCK_ARMOR 20
#define SUPLEX_TIMER 3 SECONDS
/// Skyrat change - alt-clicking a human as another human while grappling them tightly makes you try for grappling-based maneuvers.
/mob/living/carbon/human/AltClick(mob/user)
// alt-clicking a human as another human while grappling them tightly makes you try for grappling-based maneuvers.
/mob/living/carbon/human/click_alt(mob/user)
if(!ishuman(user))
return ..()
var/mob/living/carbon/human/human_user = user
if(human_user == src || !human_user.combat_mode || !human_user.dna.species.try_grab_maneuver(user, src))
return FALSE
. = ..()
return CLICK_ACTION_BLOCKING
/// State check for grab maneuver - because you can't logically suplex a man if you've stopped grappling them.
/datum/species/proc/grab_maneuver_state_check(mob/living/carbon/human/user, mob/living/carbon/human/target)
+13 -14
View File
@@ -152,15 +152,14 @@ DEFINE_BITFIELD(interaction_flags_atom, list(
))
DEFINE_BITFIELD(interaction_flags_machine, list(
"INTERACT_MACHINE_ALLOW_SILICON" = INTERACT_MACHINE_ALLOW_SILICON,
"INTERACT_MACHINE_OFFLINE" = INTERACT_MACHINE_OFFLINE,
"INTERACT_MACHINE_OPEN" = INTERACT_MACHINE_OPEN,
"INTERACT_MACHINE_OFFLINE" = INTERACT_MACHINE_OFFLINE,
"INTERACT_MACHINE_WIRES_IF_OPEN" = INTERACT_MACHINE_WIRES_IF_OPEN,
"INTERACT_MACHINE_ALLOW_SILICON" = INTERACT_MACHINE_ALLOW_SILICON,
"INTERACT_MACHINE_OPEN_SILICON" = INTERACT_MACHINE_OPEN_SILICON,
"INTERACT_MACHINE_REQUIRES_SILICON" = INTERACT_MACHINE_REQUIRES_SILICON,
"INTERACT_MACHINE_REQUIRES_SIGHT" = INTERACT_MACHINE_REQUIRES_SIGHT,
"INTERACT_MACHINE_REQUIRES_LITERACY" = INTERACT_MACHINE_REQUIRES_LITERACY,
"INTERACT_MACHINE_REQUIRES_SILICON" = INTERACT_MACHINE_REQUIRES_SILICON,
"INTERACT_MACHINE_SET_MACHINE" = INTERACT_MACHINE_SET_MACHINE,
"INTERACT_MACHINE_WIRES_IF_OPEN" = INTERACT_MACHINE_WIRES_IF_OPEN,
))
DEFINE_BITFIELD(interaction_flags_item, list(
@@ -282,20 +281,20 @@ DEFINE_BITFIELD(movement_type, list(
))
DEFINE_BITFIELD(obj_flags, list(
"BLOCK_Z_IN_DOWN" = BLOCK_Z_IN_DOWN,
"BLOCK_Z_IN_UP" = BLOCK_Z_IN_UP,
"EMAGGED" = EMAGGED,
"CAN_BE_HIT" = CAN_BE_HIT,
"DANGEROUS_POSSESSION" = DANGEROUS_POSSESSION,
"UNIQUE_RENAME" = UNIQUE_RENAME,
"BLOCK_Z_OUT_DOWN" = BLOCK_Z_OUT_DOWN,
"BLOCK_Z_OUT_UP" = BLOCK_Z_OUT_UP,
"BLOCKS_CONSTRUCTION_DIR" = BLOCKS_CONSTRUCTION_DIR,
"BLOCK_Z_IN_DOWN" = BLOCK_Z_IN_DOWN,
"BLOCK_Z_IN_UP" = BLOCK_Z_IN_UP,
"BLOCKS_CONSTRUCTION" = BLOCKS_CONSTRUCTION,
"CAN_BE_HIT" = CAN_BE_HIT,
"CONDUCTS_ELECTRICITY" = CONDUCTS_ELECTRICITY,
"DANGEROUS_POSSESSION" = DANGEROUS_POSSESSION,
"EMAGGED" = EMAGGED,
"BLOCKS_CONSTRUCTION_DIR" = BLOCKS_CONSTRUCTION_DIR,
"IGNORE_DENSITY" = IGNORE_DENSITY,
"IN_USE" = IN_USE,
"INFINITE_RESKIN" = INFINITE_RESKIN,
"CONDUCTS_ELECTRICITY" = CONDUCTS_ELECTRICITY,
"NO_DEBRIS_AFTER_DECONSTRUCTION" = NO_DEBRIS_AFTER_DECONSTRUCTION,
"UNIQUE_RENAME" = UNIQUE_RENAME,
))
DEFINE_BITFIELD(pass_flags, list(
+2 -1
View File
@@ -362,6 +362,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_OVERWATCHED" = TRAIT_OVERWATCHED,
"TRAIT_OVERWATCH_IMMUNE" = TRAIT_OVERWATCH_IMMUNE,
"TRAIT_PACIFISM" = TRAIT_PACIFISM,
"TRAIT_PAPER_MASTER" = TRAIT_PAPER_MASTER,
"TRAIT_PARALYSIS_L_ARM" = TRAIT_PARALYSIS_L_ARM,
"TRAIT_PARALYSIS_L_LEG" = TRAIT_PARALYSIS_L_LEG,
"TRAIT_PARALYSIS_R_ARM" = TRAIT_PARALYSIS_R_ARM,
@@ -418,7 +419,6 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_SHIFTY_EYES" = TRAIT_SHIFTY_EYES,
"TRAIT_SHOCKIMMUNE" = TRAIT_SHOCKIMMUNE,
"TRAIT_SIGN_LANG" = TRAIT_SIGN_LANG,
"TRAIT_PAPER_MASTER" = TRAIT_PAPER_MASTER,
"TRAIT_SILENT_FOOTSTEPS" = TRAIT_SILENT_FOOTSTEPS,
"TRAIT_SIXTHSENSE" = TRAIT_SIXTHSENSE,
"TRAIT_SKITTISH" = TRAIT_SKITTISH,
@@ -440,6 +440,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_STASIS" = TRAIT_STASIS,
"TRAIT_STIMULATED" = TRAIT_STIMULATED,
"TRAIT_STRONG_GRABBER" = TRAIT_STRONG_GRABBER,
"TRAIT_STRONG_STOMACH" = TRAIT_STRONG_STOMACH,
"TRAIT_STUNIMMUNE" = TRAIT_STUNIMMUNE,
"TRAIT_SUCCUMB_OVERRIDE" = TRAIT_SUCCUMB_OVERRIDE,
"TRAIT_SUICIDED" = TRAIT_SUICIDED,
+2 -1
View File
@@ -160,6 +160,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_OIL_FRIED" = TRAIT_OIL_FRIED,
"TRAIT_OVERWATCH_IMMUNE" = TRAIT_OVERWATCH_IMMUNE,
"TRAIT_PACIFISM" = TRAIT_PACIFISM,
"TRAIT_PAPER_MASTER" = TRAIT_PAPER_MASTER,
"TRAIT_PARALYSIS_L_ARM" = TRAIT_PARALYSIS_L_ARM,
"TRAIT_PARALYSIS_L_LEG" = TRAIT_PARALYSIS_L_LEG,
"TRAIT_PARALYSIS_R_ARM" = TRAIT_PARALYSIS_R_ARM,
@@ -192,7 +193,6 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_SHIFTY_EYES" = TRAIT_SHIFTY_EYES,
"TRAIT_SHOCKIMMUNE" = TRAIT_SHOCKIMMUNE,
"TRAIT_SIGN_LANG" = TRAIT_SIGN_LANG,
"TRAIT_PAPER_MASTER" = TRAIT_PAPER_MASTER,
"TRAIT_SILENT_FOOTSTEPS" = TRAIT_SILENT_FOOTSTEPS,
"TRAIT_SIXTHSENSE" = TRAIT_SIXTHSENSE,
"TRAIT_SKITTISH" = TRAIT_SKITTISH,
@@ -206,6 +206,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_STABLEHEART" = TRAIT_STABLEHEART,
"TRAIT_STABLELIVER" = TRAIT_STABLELIVER,
"TRAIT_STRONG_GRABBER" = TRAIT_STRONG_GRABBER,
"TRAIT_STRONG_STOMACH" = TRAIT_STRONG_STOMACH,
"TRAIT_STUNIMMUNE" = TRAIT_STUNIMMUNE,
"TRAIT_SURGEON" = TRAIT_SURGEON,
"TRAIT_SURGICALLY_ANALYZED" = TRAIT_SURGICALLY_ANALYZED,
+6 -9
View File
@@ -55,7 +55,7 @@
ShiftClickOn(A)
return
if(LAZYACCESS(modifiers, ALT_CLICK)) // alt and alt-gr (rightalt)
AltClickOn(A)
A.ai_click_alt(src)
return
if(LAZYACCESS(modifiers, CTRL_CLICK))
CtrlClickOn(A)
@@ -120,8 +120,6 @@
/mob/living/silicon/ai/CtrlClickOn(atom/target)
target.AICtrlClick(src)
/mob/living/silicon/ai/AltClickOn(atom/target)
target.AIAltClick(src)
/*
The following criminally helpful code is just the previous code cleaned up;
@@ -133,8 +131,7 @@
/atom/proc/AICtrlClick(mob/living/silicon/ai/user)
return
/atom/proc/AIAltClick(mob/living/silicon/ai/user)
AltClick(user)
/atom/proc/ai_click_alt(mob/living/silicon/ai/user)
return
/atom/proc/AIShiftClick(mob/living/silicon/ai/user)
@@ -150,7 +147,7 @@
toggle_bolt(user)
add_hiddenprint(user)
/obj/machinery/door/airlock/AIAltClick(mob/living/silicon/ai/user) // Eletrifies doors.
/obj/machinery/door/airlock/ai_click_alt(mob/living/silicon/ai/user)
if(obj_flags & EMAGGED)
return
@@ -219,7 +216,7 @@
update()
/// Toggle APC equipment settings
/obj/machinery/power/apc/AIAltClick(mob/living/silicon/ai/user)
/obj/machinery/power/apc/ai_click_alt(mob/living/silicon/ai/user)
if(!can_use(user, loud = TRUE))
return
@@ -243,7 +240,7 @@
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
/* AI Turrets */
/obj/machinery/turretid/AIAltClick(mob/living/silicon/ai/user) //toggles lethal on turrets
/obj/machinery/turretid/ai_click_alt(mob/living/silicon/ai/user) //toggles lethal on turrets
if(ailock)
return
toggle_lethal(user)
@@ -254,7 +251,7 @@
toggle_on(user)
/* Holopads */
/obj/machinery/holopad/AIAltClick(mob/living/silicon/ai/user)
/obj/machinery/holopad/ai_click_alt(mob/living/silicon/ai/user)
if (user)
balloon_alert(user, "disrupted all active calls")
add_hiddenprint(user)
+3 -27
View File
@@ -96,7 +96,7 @@
if(LAZYACCESS(modifiers, RIGHT_CLICK))
alt_click_on_secondary(A)
else
AltClickOn(A)
base_click_alt(A)
return
if(LAZYACCESS(modifiers, CTRL_CLICK))
CtrlClickOn(A)
@@ -385,24 +385,6 @@
A.CtrlClick(src)
return
/**
* Alt click
* Unused except for AI
*/
/mob/proc/AltClickOn(atom/A)
. = SEND_SIGNAL(src, COMSIG_MOB_ALTCLICKON, A)
if(. & COMSIG_MOB_CANCEL_CLICKON)
return
A.AltClick(src)
/atom/proc/AltClick(mob/user)
if(!user.can_interact_with(src))
return FALSE
if(SEND_SIGNAL(src, COMSIG_CLICK_ALT, user) & COMPONENT_CANCEL_CLICK_ALT)
return
var/turf/T = get_turf(src)
if(T && (isturf(loc) || isturf(src)) && user.TurfAdjacent(T) && !HAS_TRAIT(user, TRAIT_MOVE_VENTCRAWLING))
user.set_listed_turf(T)
///The base proc of when something is right clicked on when alt is held - generally use alt_click_secondary instead
/atom/proc/alt_click_on_secondary(atom/A)
@@ -421,14 +403,8 @@
user.client.toggle_tag_datum(src)
return
/// Use this instead of [/mob/proc/AltClickOn] where you only want turf content listing without additional atom alt-click interaction
/atom/proc/AltClickNoInteract(mob/user, atom/A)
var/turf/T = get_turf(A)
if(T && user.TurfAdjacent(T))
user.set_listed_turf(T)
/mob/proc/TurfAdjacent(turf/T)
return T.Adjacent(src)
/mob/proc/TurfAdjacent(turf/tile)
return tile.Adjacent(src)
/**
* Control+Shift click
+66
View File
@@ -0,0 +1,66 @@
/**
* ### Base proc for alt click interaction.
*
* If you wish to add custom `click_alt` behavior for a single type, use that proc.
*/
/mob/proc/base_click_alt(atom/target)
SHOULD_NOT_OVERRIDE(TRUE)
var/turf/tile = isturf(target) ? target : get_turf(target)
if(isobserver(src) || isrevenant(src))
open_lootpanel(tile)
return
if(!isturf(target) && can_perform_action(target, (target.interaction_flags_click | SILENT_ADJACENCY)))
if(SEND_SIGNAL(target, COMSIG_CLICK_ALT, src) & CLICK_ACTION_ANY)
return
if(target.click_alt(src) & CLICK_ACTION_ANY)
return
open_lootpanel(tile)
/// Helper for opening the lootpanel
/mob/proc/open_lootpanel(turf/target)
if(HAS_TRAIT(src, TRAIT_MOVE_VENTCRAWLING))
return
var/datum/lootpanel/panel = client?.loot_panel
if(isnull(panel))
return
panel.open(target)
/**
* ## Custom alt click interaction
* Override this to change default alt click behavior. Return `CLICK_ACTION_SUCCESS`, `CLICK_ACTION_BLOCKING` or `NONE`.
*
* ### Guard clauses
* Consider adding `interaction_flags_click` before adding unique guard clauses.
*
* ### Return flags
* Forgetting your return will cause the default alt click behavior to occur thereafter.
*
* The difference between NONE and BLOCKING can get hazy, but I like to keep NONE limited to guard clauses and "never" cases.
*
* A good usage for BLOCKING over NONE is when it's situational for the item and there's some feedback indicating this.
*
* ### Examples:
* User is a ghost, alt clicks on item with special disk eject: NONE
*
* Machine broken, no feedback: NONE
*
* Alt click a pipe to max output but its already max: BLOCKING
*
* Alt click a gun that normally works, but is out of ammo: BLOCKING
*
* User unauthorized, machine beeps: BLOCKING
*
* @param {mob} user - The person doing the alt clicking.
*/
/atom/proc/click_alt(mob/user)
SHOULD_CALL_PARENT(FALSE)
return NONE
+10 -12
View File
@@ -31,7 +31,7 @@
MiddleClickOn(A, params)
return
if(LAZYACCESS(modifiers, ALT_CLICK)) // alt and alt-gr (rightalt)
AltClickOn(A)
A.borg_click_alt(src)
return
if(LAZYACCESS(modifiers, CTRL_CLICK))
CtrlClickOn(A)
@@ -89,7 +89,7 @@
if(after_attack_secondary_result == SECONDARY_ATTACK_CALL_NORMAL)
W.afterattack(A, src, FALSE, params)
else
else
W.afterattack(A, src, FALSE, params)
//Give cyborgs hotkey clicks without breaking existing uses of hotkey clicks
@@ -103,8 +103,6 @@
/mob/living/silicon/robot/CtrlClickOn(atom/target)
target.BorgCtrlClick(src)
/mob/living/silicon/robot/AltClickOn(atom/target)
target.BorgAltClick(src)
/atom/proc/BorgCtrlShiftClick(mob/living/silicon/robot/user) //forward to human click if not overridden
CtrlShiftClick(user)
@@ -152,9 +150,9 @@
else
..()
/obj/machinery/power/apc/BorgAltClick(mob/living/silicon/robot/user)
/obj/machinery/power/apc/borg_click_alt(mob/living/silicon/robot/user)
if(get_dist(src, user) <= user.interaction_range && !(user.control_disabled))
AIAltClick(user)
ai_click_alt(user)
else
..()
@@ -171,19 +169,19 @@
else
..()
/atom/proc/BorgAltClick(mob/living/silicon/robot/user)
AltClick(user)
/atom/proc/borg_click_alt(mob/living/silicon/robot/user)
user.base_click_alt(src)
return
/obj/machinery/door/airlock/BorgAltClick(mob/living/silicon/robot/user) // Eletrifies doors. Forwards to AI code.
/obj/machinery/door/airlock/borg_click_alt(mob/living/silicon/robot/user) // Eletrifies doors. Forwards to AI code.
if(get_dist(src, user) <= user.interaction_range && !(user.control_disabled))
AIAltClick(user)
ai_click_alt(user)
else
..()
/obj/machinery/turretid/BorgAltClick(mob/living/silicon/robot/user) //turret lethal on/off. Forwards to AI code.
/obj/machinery/turretid/borg_click_alt(mob/living/silicon/robot/user) //turret lethal on/off. Forwards to AI code.
if(get_dist(src, user) <= user.interaction_range && !(user.control_disabled))
AIAltClick(user)
ai_click_alt(user)
else
..()
+2 -11
View File
@@ -11,7 +11,7 @@
var/list/modifiers = params2list(params)
var/is_right_clicking = LAZYACCESS(modifiers, RIGHT_CLICK)
var/item_interact_result = target.item_interaction(user, src, modifiers, is_right_clicking)
var/item_interact_result = target.base_item_interaction(user, src, modifiers)
if(item_interact_result & ITEM_INTERACT_SUCCESS)
return TRUE
if(item_interact_result & ITEM_INTERACT_BLOCKING)
@@ -52,10 +52,6 @@
if (attackby_result)
return TRUE
if(QDELETED(src) || QDELETED(target))
attack_qdeleted(target, user, TRUE, params)
return TRUE
if (is_right_clicking)
var/after_attack_secondary_result = afterattack_secondary(target, user, TRUE, params)
@@ -163,7 +159,7 @@
return FALSE
return attacking_item.attack_atom(src, user, params)
/mob/living/item_interaction(mob/living/user, obj/item/tool, list/modifiers, is_right_clicking)
/mob/living/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
// Surgery and such happens very high up in the interaction chain, before parent call
var/attempt_tending = item_tending(user, tool, modifiers)
if(attempt_tending & ITEM_INTERACT_ANY_BLOCKER)
@@ -472,11 +468,6 @@
return SECONDARY_ATTACK_CALL_NORMAL
/// Called if the target gets deleted by our attack
/obj/item/proc/attack_qdeleted(atom/target, mob/user, proximity_flag, click_parameters)
SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_QDELETED, target, user, proximity_flag, click_parameters)
SEND_SIGNAL(user, COMSIG_MOB_ITEM_ATTACK_QDELETED, target, user, proximity_flag, click_parameters)
/obj/item/proc/get_clamped_volume()
if(w_class)
if(force)
+1 -1
View File
@@ -31,7 +31,7 @@
MiddleClickOn(A, params)
return
if(LAZYACCESS(modifiers, ALT_CLICK))
AltClickNoInteract(src, A)
base_click_alt(A)
return
if(LAZYACCESS(modifiers, CTRL_CLICK))
CtrlClickOn(A)
+2 -2
View File
@@ -10,7 +10,7 @@
ShiftClickOn(A)
return
if(LAZYACCESS(modifiers, ALT_CLICK))
AltClickOn(A)
blob_click_alt(A)
return
if(LAZYACCESS(modifiers, CTRL_CLICK))
CtrlClickOn(A)
@@ -30,7 +30,7 @@
if(T)
create_shield(T)
/mob/camera/blob/AltClickOn(atom/A) //Remove a blob
/mob/camera/blob/proc/blob_click_alt(atom/A) //Remove a blob
var/turf/T = get_turf(A)
if(T)
remove_blob(T)
@@ -1,24 +0,0 @@
PROCESSING_SUBSYSTEM_DEF(obj_tab_items)
name = "Obj Tab Items"
flags = SS_NO_INIT
runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
wait = 0.1 SECONDS
// I know this is mostly copypasta, but I want to change the processing logic
// Sorry bestie :(
/datum/controller/subsystem/processing/obj_tab_items/fire(resumed = FALSE)
if (!resumed)
currentrun = processing.Copy()
//cache for sanic speed (lists are references anyways)
var/list/current_run = currentrun
while(current_run.len)
var/datum/thing = current_run[current_run.len]
if(QDELETED(thing))
processing -= thing
else if(thing.process(wait * 0.1) == PROCESS_KILL)
// fully stop so that a future START_PROCESSING will work
STOP_PROCESSING(src, thing)
if (MC_TICK_CHECK)
return
current_run.len--
-183
View File
@@ -110,12 +110,6 @@ SUBSYSTEM_DEF(statpanels)
if(update_actions && num_fires % default_wait == 0)
set_action_tabs(target, target_mob)
// Handle the examined turf of the stat panel, if it's been long enough, or if we've generated new images for it
var/turf/listed_turf = target_mob?.listed_turf
if(listed_turf && num_fires % default_wait == 0)
if(target.stat_tab == listed_turf.name || !(listed_turf.name in target.panel_tabs))
set_turf_examine_tab(target, target_mob)
if(MC_TICK_CHECK)
return
@@ -188,71 +182,6 @@ SUBSYSTEM_DEF(statpanels)
target.stat_panel.send_message("update_spells", list(spell_tabs = target.spell_tabs, actions = actions))
/datum/controller/subsystem/statpanels/proc/set_turf_examine_tab(client/target, mob/target_mob)
var/list/overrides = list()
for(var/image/target_image as anything in target.images)
if(!target_image.loc || target_image.loc.loc != target_mob.listed_turf || !target_image.override)
continue
overrides += target_image.loc
var/list/atoms_to_display = list(target_mob.listed_turf)
for(var/atom/movable/turf_content as anything in target_mob.listed_turf)
if(turf_content.mouse_opacity == MOUSE_OPACITY_TRANSPARENT)
continue
if(turf_content.invisibility > target_mob.see_invisible)
continue
if(turf_content in overrides)
continue
if(turf_content.IsObscured())
continue
atoms_to_display += turf_content
/// Set the atoms we're meant to display
var/datum/object_window_info/obj_window = target.obj_window
obj_window.atoms_to_show = atoms_to_display
START_PROCESSING(SSobj_tab_items, obj_window)
refresh_client_obj_view(target)
/datum/controller/subsystem/statpanels/proc/refresh_client_obj_view(client/refresh)
var/list/turf_items = return_object_images(refresh)
if(!length(turf_items) || !refresh.mob?.listed_turf)
return
refresh.stat_panel.send_message("update_listedturf", turf_items)
#define OBJ_IMAGE_LOADING "statpanels obj loading temporary"
/// Returns all our ready object tab images
/// Returns a list in the form list(list(object_name, object_ref, loaded_image), ...)
/datum/controller/subsystem/statpanels/proc/return_object_images(client/load_from)
// You might be inclined to think that this is a waste of cpu time, since we
// A: Double iterate over atoms in the build case, or
// B: Generate these lists over and over in the refresh case
// It's really not very hot. The hot portion of this code is genuinely mostly in the image generation
// So it's ok to pay a performance cost for cleanliness here
// No turf? go away
if(!load_from.mob?.listed_turf)
return list()
var/datum/object_window_info/obj_window = load_from.obj_window
var/list/already_seen = obj_window.atoms_to_images
var/list/to_make = obj_window.atoms_to_imagify
var/list/turf_items = list()
for(var/atom/turf_item as anything in obj_window.atoms_to_show)
// First, we fill up the list of refs to display
// If we already have one, just use that
var/existing_image = already_seen[turf_item]
if(existing_image == OBJ_IMAGE_LOADING)
continue
// We already have it. Success!
if(existing_image)
turf_items[++turf_items.len] = list("[turf_item.name]", REF(turf_item), existing_image)
continue
// Now, we're gonna queue image generation out of those refs
to_make += turf_item
already_seen[turf_item] = OBJ_IMAGE_LOADING
obj_window.RegisterSignal(turf_item, COMSIG_QDELETING, TYPE_PROC_REF(/datum/object_window_info,viewing_atom_deleted)) // we reset cache if anything in it gets deleted
return turf_items
#undef OBJ_IMAGE_LOADING
/datum/controller/subsystem/statpanels/proc/generate_mc_data()
mc_data = list(
@@ -294,16 +223,6 @@ SUBSYSTEM_DEF(statpanels)
set_action_tabs(target, target_mob)
return TRUE
// Handle turfs
if(target_mob?.listed_turf)
if(!target_mob.TurfAdjacent(target_mob.listed_turf))
target_mob.set_listed_turf(null)
else if(target.stat_tab == target_mob?.listed_turf.name || !(target_mob?.listed_turf.name in target.panel_tabs))
set_turf_examine_tab(target, target_mob)
return TRUE
if(!target.holder)
return FALSE
@@ -323,105 +242,3 @@ SUBSYSTEM_DEF(statpanels)
/// Stat panel window declaration
/client/var/datum/tgui_window/stat_panel
/// Datum that holds and tracks info about a client's object window
/// Really only exists because I want to be able to do logic with signals
/// And need a safe place to do the registration
/datum/object_window_info
/// list of atoms to show to our client via the object tab, at least currently
var/list/atoms_to_show = list()
/// list of atom -> image string for objects we have had in the right click tab
/// this is our caching
var/list/atoms_to_images = list()
/// list of atoms to turn into images for the object tab
var/list/atoms_to_imagify = list()
/// Our owner client
var/client/parent
/// Are we currently tracking a turf?
var/actively_tracking = FALSE
/datum/object_window_info/New(client/parent)
. = ..()
src.parent = parent
/datum/object_window_info/Destroy(force)
atoms_to_show = null
atoms_to_images = null
atoms_to_imagify = null
parent.obj_window = null
parent = null
STOP_PROCESSING(SSobj_tab_items, src)
return ..()
/// Takes a client, attempts to generate object images for it
/// We will update the client with any improvements we make when we're done
/datum/object_window_info/process(seconds_per_tick)
// Cache the datum access for sonic speed
var/list/to_make = atoms_to_imagify
var/list/newly_seen = atoms_to_images
var/index = 0
for(index in 1 to length(to_make))
var/atom/thing = to_make[index]
var/generated_string
if(ismob(thing) || length(thing.overlays) > 2)
generated_string = costly_icon2html(thing, parent, sourceonly=TRUE)
else
generated_string = icon2html(thing, parent, sourceonly=TRUE)
newly_seen[thing] = generated_string
if(TICK_CHECK)
to_make.Cut(1, index + 1)
index = 0
break
// If we've not cut yet, do it now
if(index)
to_make.Cut(1, index + 1)
SSstatpanels.refresh_client_obj_view(parent)
if(!length(to_make))
return PROCESS_KILL
/datum/object_window_info/proc/start_turf_tracking()
if(actively_tracking)
stop_turf_tracking()
var/static/list/connections = list(
COMSIG_MOVABLE_MOVED = PROC_REF(on_mob_move),
COMSIG_MOB_LOGOUT = PROC_REF(on_mob_logout),
)
AddComponent(/datum/component/connect_mob_behalf, parent, connections)
actively_tracking = TRUE
/datum/object_window_info/proc/stop_turf_tracking()
qdel(GetComponent(/datum/component/connect_mob_behalf))
actively_tracking = FALSE
/datum/object_window_info/proc/on_mob_move(mob/source)
SIGNAL_HANDLER
var/turf/listed = source.listed_turf
if(!listed || !source.TurfAdjacent(listed))
source.set_listed_turf(null)
/datum/object_window_info/proc/on_mob_logout(mob/source)
SIGNAL_HANDLER
on_mob_move(parent.mob)
/// Clears any cached object window stuff
/// We use hard refs cause we'd need a signal for this anyway. Cleaner this way
/datum/object_window_info/proc/viewing_atom_deleted(atom/deleted)
SIGNAL_HANDLER
atoms_to_show -= deleted
atoms_to_imagify -= deleted
atoms_to_images -= deleted
/mob/proc/set_listed_turf(turf/new_turf)
listed_turf = new_turf
if(!client)
return
if(!client.obj_window)
client.obj_window = new(client)
if(listed_turf)
client.stat_panel.send_message("create_listedturf", listed_turf.name)
client.obj_window.start_turf_tracking()
else
client.stat_panel.send_message("remove_listedturf")
client.obj_window.stop_turf_tracking()
-2
View File
@@ -122,8 +122,6 @@ SUBSYSTEM_DEF(tgui)
for(var/datum/tgui/ui in user.tgui_open_uis)
if(ui.window && ui.window.id == window_id)
ui.close(can_be_suspended = FALSE)
// Unset machine just to be sure.
user.unset_machine()
// Close window directly just to be sure.
user << browse(null, "window=[window_id]")
@@ -108,7 +108,7 @@
return
if(!istype(clicker) || blackboard[BB_HOSTILE_FRIEND] != clicker)
return
. = COMPONENT_CANCEL_CLICK_ALT
. = CLICK_ACTION_BLOCKING
INVOKE_ASYNC(src, PROC_REF(command_radial), clicker)
/// Show the command radial menu
-4
View File
@@ -475,7 +475,3 @@
src.Topic(href, params2list(href), hsrc) // this will direct to the atom's
return // Topic() proc via client.Topic()
// no atomref specified (or not found)
// so just reset the user mob's machine var
if(src?.mob)
src.mob.unset_machine()
+6 -4
View File
@@ -50,7 +50,7 @@ GLOBAL_LIST_EMPTY(GPS_list)
if(!emp_proof)
RegisterSignal(parent, COMSIG_ATOM_EMP_ACT, PROC_REF(on_emp_act))
RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine))
RegisterSignal(parent, COMSIG_CLICK_ALT, PROC_REF(on_AltClick))
RegisterSignal(parent, COMSIG_CLICK_ALT, PROC_REF(on_click_alt))
///Called on COMSIG_ITEM_ATTACK_SELF
/datum/component/gps/item/proc/interact(datum/source, mob/user)
@@ -85,10 +85,11 @@ GLOBAL_LIST_EMPTY(GPS_list)
A.add_overlay("working")
///Calls toggletracking
/datum/component/gps/item/proc/on_AltClick(datum/source, mob/user)
/datum/component/gps/item/proc/on_click_alt(datum/source, mob/user)
SIGNAL_HANDLER
toggletracking(user)
return CLICK_ACTION_SUCCESS
///Toggles the tracking for the gps
/datum/component/gps/item/proc/toggletracking(mob/user)
@@ -153,7 +154,7 @@ GLOBAL_LIST_EMPTY(GPS_list)
data["signals"] = signals
return data
/datum/component/gps/item/ui_act(action, params)
/datum/component/gps/item/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
. = ..()
if(.)
return
@@ -162,7 +163,8 @@ GLOBAL_LIST_EMPTY(GPS_list)
if("rename")
var/atom/parentasatom = parent
var/a = tgui_input_text(usr, "Enter the desired tag", "GPS Tag", gpstag, 20)
if (QDELETED(ui) || ui.status != UI_INTERACTIVE)
return
if (!a)
return
+7 -2
View File
@@ -59,8 +59,10 @@
/datum/component/infective/proc/try_infect_eat(datum/source, mob/living/eater, mob/living/feeder)
SIGNAL_HANDLER
if(!eater.has_quirk(/datum/quirk/deviant_tastes))
eater.add_mood_event("disgust", /datum/mood_event/disgust/dirty_food)
if(HAS_TRAIT(eater, TRAIT_STRONG_STOMACH))
return
eater.add_mood_event("disgust", /datum/mood_event/disgust/dirty_food)
if(is_weak && !prob(weak_infection_chance))
return
@@ -76,6 +78,9 @@
/datum/component/infective/proc/try_infect_drink(datum/source, mob/living/drinker, mob/living/feeder)
SIGNAL_HANDLER
if(HAS_TRAIT(drinker, TRAIT_STRONG_STOMACH))
return
var/appendage_zone = feeder.held_items.Find(source)
appendage_zone = appendage_zone == 0 ? BODY_ZONE_CHEST : appendage_zone % 2 ? BODY_ZONE_R_ARM : BODY_ZONE_L_ARM
try_infect(feeder, appendage_zone)
@@ -0,0 +1,45 @@
/// when equipped and unequipped this item gives a martial art
/datum/component/martial_art_giver
/// the style we give
var/datum/martial_art/style
/datum/component/martial_art_giver/Initialize(style_type)
if(!isitem(parent))
return COMPONENT_INCOMPATIBLE
style = new style_type()
style.allow_temp_override = FALSE
/datum/component/martial_art_giver/RegisterWithParent()
RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(equipped))
RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(dropped))
/datum/component/martial_art_giver/UnregisterFromParent(datum/source)
UnregisterSignal(parent, list(COMSIG_ITEM_POST_EQUIPPED, COMSIG_ITEM_POST_UNEQUIP))
var/obj/item/parent_item = parent
if(ismob(parent_item?.loc))
UnregisterSignal(parent, list(COMSIG_MOB_MIND_TRANSFERRED_INTO, COMSIG_MOB_MIND_INITIALIZED, COMSIG_MOB_MIND_TRANSFERRED_OUT_OF))
QDEL_NULL(style)
/datum/component/martial_art_giver/proc/equipped(obj/item/source, mob/user, slot)
SIGNAL_HANDLER
if(!(source.slot_flags & slot))
return
RegisterSignals(user, list(COMSIG_MOB_MIND_TRANSFERRED_INTO, COMSIG_MOB_MIND_INITIALIZED), PROC_REF(teach))
RegisterSignal(user, COMSIG_MOB_MIND_TRANSFERRED_OUT_OF, PROC_REF(forget))
teach(user)
/datum/component/martial_art_giver/proc/dropped(obj/item/source, mob/user)
SIGNAL_HANDLER
forget(user)
UnregisterSignal(user, list(COMSIG_MOB_MIND_TRANSFERRED_INTO, COMSIG_MOB_MIND_INITIALIZED, COMSIG_MOB_MIND_TRANSFERRED_OUT_OF))
/datum/component/martial_art_giver/proc/teach(mob/source)
if(isnull(style))
return
style.teach(source, TRUE)
/datum/component/martial_art_giver/proc/forget(mob/source)
if(isnull(style))
return
style.fully_remove(source)
@@ -678,6 +678,7 @@
while(sheet_amt > 0)
//don't merge yet. we need to do stuff with it first
var/obj/item/stack/sheet/new_sheets = new material.sheet_type(target, min(sheet_amt, MAX_STACK_SIZE), FALSE)
new_sheets.manufactured = TRUE
count += new_sheets.amount
//use material & deduct work needed
use_amount_mat(new_sheets.amount * SHEET_MATERIAL_AMOUNT, material)
@@ -72,6 +72,7 @@
return // Not our friend, can't boss us around
INVOKE_ASYNC(src, PROC_REF(display_radial_menu), clicker)
return CLICK_ACTION_SUCCESS
/// Actually display the radial menu and then do something with the result
/datum/component/obeys_commands/proc/display_radial_menu(mob/living/clicker)
+1
View File
@@ -59,6 +59,7 @@
/datum/component/simple_rotation/proc/rotate_left(datum/source, mob/user)
SIGNAL_HANDLER
rotate(user, ROTATION_COUNTERCLOCKWISE)
return CLICK_ACTION_SUCCESS
/datum/component/simple_rotation/proc/rotate(mob/user, degrees)
if(QDELETED(user))
+8 -7
View File
@@ -27,7 +27,7 @@
. = ..()
. += span_notice("You feel like a <b>multitool</b> could be used on this.")
/obj/item/style_meter/interact_with_atom(atom/interacting_with, mob/living/user)
/obj/item/style_meter/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
if(!istype(interacting_with, /obj/item/clothing/glasses))
return NONE
@@ -38,7 +38,7 @@
RegisterSignal(interacting_with, COMSIG_ITEM_EQUIPPED, PROC_REF(check_wearing))
RegisterSignal(interacting_with, COMSIG_ITEM_DROPPED, PROC_REF(on_drop))
RegisterSignal(interacting_with, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine))
RegisterSignal(interacting_with, COMSIG_CLICK_ALT, PROC_REF(on_altclick))
RegisterSignal(interacting_with, COMSIG_CLICK_ALT, PROC_REF(on_click_alt))
RegisterSignal(interacting_with, COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL), PROC_REF(redirect_multitool))
balloon_alert(user, "style meter attached")
playsound(src, 'sound/machines/click.ogg', 30, TRUE)
@@ -90,14 +90,15 @@
/// Signal proc to remove from glasses
/obj/item/style_meter/proc/on_altclick(datum/source, mob/user)
/obj/item/style_meter/proc/on_click_alt(datum/source, mob/user)
SIGNAL_HANDLER
if(istype(loc, /obj/item/clothing/glasses))
clean_up()
forceMove(get_turf(src))
if(!istype(loc, /obj/item/clothing/glasses))
return CLICK_ACTION_BLOCKING
return COMPONENT_CANCEL_CLICK_ALT
clean_up()
forceMove(get_turf(src))
return CLICK_ACTION_SUCCESS
/obj/item/style_meter/multitool_act(mob/living/user, obj/item/tool)
multitooled = !multitooled
+5 -4
View File
@@ -20,7 +20,7 @@
src.base_icon_state = atom_parent.base_icon_state || atom_parent.icon_state
/datum/component/toggle_icon/RegisterWithParent()
RegisterSignal(parent, COMSIG_CLICK_ALT, PROC_REF(on_alt_click))
RegisterSignal(parent, COMSIG_CLICK_ALT, PROC_REF(on_click_alt))
RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine))
/datum/component/toggle_icon/UnregisterFromParent()
@@ -34,7 +34,7 @@
* source - the atom being clicked on
* user - the mob doing the click
*/
/datum/component/toggle_icon/proc/on_alt_click(atom/source, mob/user)
/datum/component/toggle_icon/proc/on_click_alt(atom/source, mob/user)
SIGNAL_HANDLER
if(!isliving(user))
@@ -47,13 +47,14 @@
if(living_user.incapacitated())
source.balloon_alert(user, "you're incapacitated!")
return
return CLICK_ACTION_BLOCKING
if(living_user.usable_hands <= 0)
source.balloon_alert(user, "you don't have hands!")
return
return CLICK_ACTION_BLOCKING
do_icon_toggle(source, living_user)
return CLICK_ACTION_SUCCESS
/*
* Signal proc for COMSIG_ATOM_EXAMINE.
@@ -0,0 +1,33 @@
/// Pick a random attack zone before you attack something
/datum/element/attack_zone_randomiser
element_flags = ELEMENT_BESPOKE
argument_hash_start_idx = 2
/// List of attack zones you can select, should be a subset of GLOB.all_body_zones
var/list/valid_attack_zones
/datum/element/attack_zone_randomiser/Attach(datum/target, list/valid_attack_zones = GLOB.all_body_zones)
. = ..()
if (!isliving(target))
return ELEMENT_INCOMPATIBLE
RegisterSignals(target, list(COMSIG_HOSTILE_PRE_ATTACKINGTARGET, COMSIG_LIVING_UNARMED_ATTACK), PROC_REF(randomise))
src.valid_attack_zones = valid_attack_zones
/datum/element/attack_zone_randomiser/Detach(datum/source)
UnregisterSignal(source, list (COMSIG_HOSTILE_PRE_ATTACKINGTARGET, COMSIG_LIVING_UNARMED_ATTACK))
return ..()
/// If we're attacking a carbon, pick a random defence zone
/datum/element/attack_zone_randomiser/proc/randomise(mob/living/source, atom/target)
SIGNAL_HANDLER
if (!iscarbon(target))
return
var/mob/living/living_target = target
var/list/blacklist_zones = GLOB.all_body_zones - valid_attack_zones
var/new_zone = living_target.get_random_valid_zone(blacklisted_parts = blacklist_zones, bypass_warning = TRUE)
if (isnull(new_zone))
new_zone = BODY_ZONE_CHEST
var/atom/movable/screen/zone_sel/zone_selector = source.hud_used?.zone_select
if (isnull(zone_selector))
source.zone_selected = new_zone
else
zone_selector.set_selected_zone(new_zone, source, should_log = FALSE)
@@ -0,0 +1,19 @@
/// Spawns a living limb mob inside a limb upon attachment if it doesn't have one
/datum/element/living_limb_initialiser
/datum/element/living_limb_initialiser/Attach(atom/target)
. = ..()
if(!isbodypart(target))
return ELEMENT_INCOMPATIBLE
RegisterSignal(target, COMSIG_BODYPART_CHANGED_OWNER, PROC_REF(try_animate_limb))
/datum/element/living_limb_initialiser/Detach(atom/target)
UnregisterSignal(target, COMSIG_BODYPART_CHANGED_OWNER)
return ..()
/// Create a living limb mob inside the limb if it doesn't already have one
/datum/element/living_limb_initialiser/proc/try_animate_limb(obj/item/bodypart/part)
SIGNAL_HANDLER
if (locate(/mob/living/basic/living_limb_flesh) in part)
return
new /mob/living/basic/living_limb_flesh(part, part)
+45
View File
@@ -0,0 +1,45 @@
/// Allows mobs with this element attached to just simply tear down any poster they desire to.
/datum/element/poster_tearer
element_flags = ELEMENT_BESPOKE
argument_hash_start_idx = 2
/// The amount of time it takes to tear down a poster.
var/tear_time
/// Interaction key to use whilst tearing down a poster.
var/interaction_key
/datum/element/poster_tearer/Attach(datum/target, tear_time = 2 SECONDS, interaction_key = null)
. = ..()
if (!isliving(target))
return ELEMENT_INCOMPATIBLE
src.tear_time = tear_time
src.interaction_key = interaction_key
RegisterSignals(target, list(COMSIG_HOSTILE_PRE_ATTACKINGTARGET, COMSIG_LIVING_UNARMED_ATTACK), PROC_REF(on_attacked_poster))
/datum/element/poster_tearer/Detach(datum/source)
. = ..()
UnregisterSignal(source, list(COMSIG_HOSTILE_PRE_ATTACKINGTARGET, COMSIG_LIVING_UNARMED_ATTACK))
/// Try to tear up a poster on the wall
/datum/element/poster_tearer/proc/on_attacked_poster(mob/living/user, atom/target, proximity_flag)
SIGNAL_HANDLER
if(!istype(target, /obj/structure/sign/poster))
return NONE // don't care we move on
if(DOING_INTERACTION_WITH_TARGET(user, target) || (!isnull(interaction_key) && DOING_INTERACTION(user, interaction_key)))
user.balloon_alert(target, "busy!")
return COMPONENT_CANCEL_ATTACK_CHAIN
INVOKE_ASYNC(src, PROC_REF(tear_it_down), user, target)
return COMPONENT_CANCEL_ATTACK_CHAIN
/// Actually work on tearing down that poster
/datum/element/poster_tearer/proc/tear_it_down(mob/living/user, obj/structure/sign/poster/target)
if(!target.check_tearability(user)) // this proc will handle user feedback
return
target.balloon_alert(user, "tearing down the poster...")
if(!do_after(user, tear_time, target, interaction_key = interaction_key)) // just in case the user actually enjoys art
return
target.tear_poster(user)
+12
View File
@@ -197,3 +197,15 @@
to_chat(user, span_notice("You gently let go of [rider]."))
return
return rider
/obj/item/riding_offhand/interact_with_atom(atom/movable/interacting_with, mob/living/user, list/modifiers)
if(!istype(interacting_with) || !interacting_with.can_buckle)
return NONE
if(rider == user) // Piggyback user
return ITEM_INTERACT_BLOCKING
// Handles de-fireman carrying a mob and buckling them onto something (tables, etc)
var/mob/living/former_rider = rider
user.unbuckle_mob(former_rider)
former_rider.forceMove(get_turf(interacting_with))
return interacting_with.mouse_buckle_handling(former_rider, user) ? ITEM_INTERACT_SUCCESS : ITEM_INTERACT_BLOCKING
+2 -4
View File
@@ -283,10 +283,8 @@
source.log_message("had [item] put on them by [key_name(user)].", LOG_VICTIM, color="orange", log_globally=FALSE)
/// A utility function for `/datum/strippable_item`s to start unequipping an item from a mob.
/proc/start_unequip_mob(obj/item/item, mob/source, mob/user, strip_delay)
//SKYRAT EDIT ADDITION - THIEVING GLOVES
//if (!do_after(user, strip_delay || item.strip_delay, source, interaction_key = REF(item)))
if (!do_after(user, (strip_delay || item.strip_delay) * (HAS_TRAIT(user, TRAIT_STICKY_FINGERS) ? THIEVING_GLOVES_STRIP_SLOWDOWN : NORMAL_STRIP_SLOWDOWN), source, interaction_key = REF(item)))
/proc/start_unequip_mob(obj/item/item, mob/source, mob/user, strip_delay, hidden = FALSE)
if (!do_after(user, (strip_delay || item.strip_delay) * (HAS_TRAIT(user, TRAIT_STICKY_FINGERS) ? THIEVING_GLOVES_STRIP_SLOWDOWN : NORMAL_STRIP_SLOWDOWN), source, interaction_key = REF(item), hidden = hidden)) // SKYRAT EDIT CHANGE - ORIGINAL: if (!do_after(user, strip_delay || item.strip_delay, source, interaction_key = REF(item), hidden = hidden))
return FALSE
return TRUE
+78
View File
@@ -0,0 +1,78 @@
#define OPTION_RENAME "Rename"
#define OPTION_DESCRIPTION "Description"
#define OPTION_RESET "Reset"
/**
* Renaming tool element
*
* When using this tool on an object with UNIQUE_RENAME,
* lets the user rename/redesc it.
*/
/datum/element/tool_renaming
/datum/element/tool_renaming/Attach(datum/target)
. = ..()
if(!isitem(target))
return ELEMENT_INCOMPATIBLE
RegisterSignal(target, COMSIG_ITEM_INTERACTING_WITH_ATOM, PROC_REF(attempt_rename))
/datum/element/tool_renaming/Detach(datum/source)
. = ..()
UnregisterSignal(source, COMSIG_ITEM_INTERACTING_WITH_ATOM)
/datum/element/tool_renaming/proc/attempt_rename(datum/source, mob/living/user, atom/interacting_with, list/modifiers)
SIGNAL_HANDLER
if(!isobj(interacting_with))
return NONE
var/obj/renamed_obj = interacting_with
if(!(renamed_obj.obj_flags & UNIQUE_RENAME))
return NONE
INVOKE_ASYNC(src, PROC_REF(async_rename), user, renamed_obj)
return ITEM_INTERACT_SUCCESS
/datum/element/tool_renaming/proc/async_rename(mob/living/user, obj/renamed_obj)
var/custom_choice = tgui_input_list(user, "What would you like to edit?", "Customization", list(OPTION_RENAME, OPTION_DESCRIPTION, OPTION_RESET))
if(QDELETED(renamed_obj) || !user.can_perform_action(renamed_obj) || isnull(custom_choice))
return
switch(custom_choice)
if(OPTION_RENAME)
var/old_name = renamed_obj.name
var/input = tgui_input_text(user, "What do you want to name [renamed_obj]?", "Object Name", "[old_name]", MAX_NAME_LEN)
if(QDELETED(renamed_obj) || !user.can_perform_action(renamed_obj))
return
if(input == old_name || !input)
to_chat(user, span_notice("You changed [renamed_obj] to... well... [renamed_obj]."))
return
renamed_obj.AddComponent(/datum/component/rename, input, renamed_obj.desc)
to_chat(user, span_notice("You have successfully renamed \the [old_name] to [renamed_obj]."))
ADD_TRAIT(renamed_obj, TRAIT_WAS_RENAMED, RENAMING_TOOL_LABEL_TRAIT)
renamed_obj.update_appearance(UPDATE_NAME)
if(OPTION_DESCRIPTION)
var/old_desc = renamed_obj.desc
var/input = tgui_input_text(user, "Describe [renamed_obj]", "Description", "[old_desc]", MAX_DESC_LEN)
if(QDELETED(renamed_obj) || !user.can_perform_action(renamed_obj))
return
if(input == old_desc || !input)
to_chat(user, span_notice("You decide against changing [renamed_obj]'s description."))
return
renamed_obj.AddComponent(/datum/component/rename, renamed_obj.name, input)
to_chat(user, span_notice("You have successfully changed [renamed_obj]'s description."))
ADD_TRAIT(renamed_obj, TRAIT_WAS_RENAMED, RENAMING_TOOL_LABEL_TRAIT)
renamed_obj.update_appearance(UPDATE_DESC)
if(OPTION_RESET)
qdel(renamed_obj.GetComponent(/datum/component/rename))
to_chat(user, span_notice("You have successfully reset [renamed_obj]'s name and description."))
REMOVE_TRAIT(renamed_obj, TRAIT_WAS_RENAMED, RENAMING_TOOL_LABEL_TRAIT)
renamed_obj.update_appearance(UPDATE_NAME | UPDATE_DESC)
#undef OPTION_RENAME
#undef OPTION_DESCRIPTION
#undef OPTION_RESET
+1 -16
View File
@@ -74,7 +74,6 @@
return ..()
/obj/item/clothing/gloves/boxing
var/datum/martial_art/boxing/style
/obj/item/clothing/gloves/boxing/Initialize(mapload)
. = ..()
@@ -85,18 +84,4 @@
slapcraft_recipes = slapcraft_recipe_list,\
)
style = new()
style.allow_temp_override = FALSE
/obj/item/clothing/gloves/boxing/Destroy()
QDEL_NULL(style)
return ..()
/obj/item/clothing/gloves/boxing/equipped(mob/user, slot)
. = ..()
if(slot & ITEM_SLOT_GLOVES)
style.teach(user, TRUE)
/obj/item/clothing/gloves/boxing/dropped(mob/user)
. = ..()
style.fully_remove(user)
AddComponent(/datum/component/martial_art_giver, /datum/martial_art/boxing)
+1 -16
View File
@@ -208,26 +208,11 @@
//Krav Maga Gloves
/obj/item/clothing/gloves/krav_maga
var/datum/martial_art/krav_maga/style
clothing_traits = list(TRAIT_FAST_CUFFING)
/obj/item/clothing/gloves/krav_maga/Initialize(mapload)
. = ..()
style = new()
style.allow_temp_override = FALSE
/obj/item/clothing/gloves/krav_maga/Destroy()
QDEL_NULL(style)
return ..()
/obj/item/clothing/gloves/krav_maga/equipped(mob/user, slot)
. = ..()
if(slot & ITEM_SLOT_GLOVES)
style.teach(user, TRUE)
/obj/item/clothing/gloves/krav_maga/dropped(mob/user)
. = ..()
style.fully_remove(user)
AddComponent(/datum/component/martial_art_giver, /datum/martial_art/krav_maga)
/obj/item/clothing/gloves/krav_maga/sec//more obviously named, given to sec
name = "krav maga gloves"
+2 -18
View File
@@ -325,7 +325,7 @@
/obj/item/clothing/gloves/the_sleeping_carp
name = "carp gloves"
desc = "This gloves are capable of making people use The Sleeping Carp."
desc = "These gloves are capable of making people use The Sleeping Carp."
icon_state = "black"
greyscale_colors = COLOR_BLACK
cold_protection = HANDS
@@ -333,26 +333,10 @@
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
resistance_flags = NONE
var/datum/martial_art/the_sleeping_carp/style
/obj/item/clothing/gloves/the_sleeping_carp/Initialize(mapload)
. = ..()
style = new()
style.allow_temp_override = FALSE
/obj/item/clothing/gloves/the_sleeping_carp/Destroy()
QDEL_NULL(style)
return ..()
/obj/item/clothing/gloves/the_sleeping_carp/equipped(mob/user, slot)
. = ..()
if(slot & ITEM_SLOT_GLOVES)
style.teach(user, TRUE)
/obj/item/clothing/gloves/the_sleeping_carp/dropped(mob/user)
. = ..()
if(!isnull(style))
style.fully_remove(user)
AddComponent(/datum/component/martial_art_giver, /datum/martial_art/the_sleeping_carp)
#undef STRONG_PUNCH_COMBO
#undef LAUNCH_KICK_COMBO
+1 -16
View File
@@ -490,22 +490,7 @@ If you make a derivative work from this code, you must include this notification
/obj/item/storage/belt/champion/wrestling
name = "Wrestling Belt"
var/datum/martial_art/wrestling/style
/obj/item/storage/belt/champion/wrestling/Initialize(mapload)
. = ..()
style = new()
style.allow_temp_override = FALSE
/obj/item/storage/belt/champion/wrestling/Destroy()
QDEL_NULL(style)
return ..()
/obj/item/storage/belt/champion/wrestling/equipped(mob/user, slot)
. = ..()
if(slot & ITEM_SLOT_BELT)
style.teach(user, TRUE)
/obj/item/storage/belt/champion/wrestling/dropped(mob/user)
. = ..()
style.fully_remove(user)
AddComponent(/datum/component/martial_art_giver, /datum/martial_art/wrestling)
+1 -1
View File
@@ -66,7 +66,7 @@
mood_change = -12
/datum/mood_event/disgust/dirty_food
description = "It was too dirty to eat..."
description = "That was too dirty to eat..."
mood_change = -6
timeout = 4 MINUTES
+1 -1
View File
@@ -167,7 +167,7 @@
* * default_location - If the item isn't possible to equip in a valid slot, this is a description of where the item was spawned.
* * notify_player - If TRUE, adds strings to where_items_spawned list to be output to the player in [/datum/quirk/item_quirk/post_add()]
*/
/datum/quirk/item_quirk/proc/give_item_to_holder(quirk_item, list/valid_slots, flavour_text = null, default_location = "at your feet", notify_player = TRUE)
/datum/quirk/item_quirk/proc/give_item_to_holder(obj/item/quirk_item, list/valid_slots, flavour_text = null, default_location = "at your feet", notify_player = TRUE)
if(ispath(quirk_item))
quirk_item = new quirk_item(get_turf(quirk_holder))
@@ -43,6 +43,8 @@
///if we have bags and lost a head, remove them
/datum/quirk/all_nighter/proc/on_removed_limb(datum/source, obj/item/bodypart/removed_limb, special, dismembered)
SIGNAL_HANDLER
if(bodypart_overlay && istype(removed_limb, /obj/item/bodypart/head))
remove_bags()
@@ -0,0 +1,12 @@
/datum/quirk/strong_stomach
name = "Strong Stomach"
desc = "You can eat food discarded on the ground without getting sick, and vomiting affects you less."
icon = FA_ICON_FACE_GRIN_BEAM_SWEAT
value = 4
mob_trait = TRAIT_STRONG_STOMACH
gain_text = span_notice("You feel like you could eat anything!")
lose_text = span_danger("Looking at food on the ground makes you feel a little queasy.")
medical_record_text = "Patient has a stronger than average immune system...to food poisoning, at least."
mail_goodies = list(
/obj/item/reagent_containers/pill/ondansetron,
)
+2 -1
View File
@@ -916,7 +916,8 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches)
SIGNAL_HANDLER
INVOKE_ASYNC(src, PROC_REF(open_storage), to_show)
return COMPONENT_NO_AFTERATTACK
if(display_contents)
return COMPONENT_NO_AFTERATTACK
/// Opens the storage to the mob, showing them the contents to their UI.
/datum/storage/proc/open_storage(mob/to_show)
+3 -5
View File
@@ -136,6 +136,9 @@
///whether ghosts can see screentips on it
var/ghost_screentips = FALSE
/// Flags to check for in can_perform_action. Used in alt-click checks
var/interaction_flags_click = NONE
/**
* Top level of the destroy chain for most atoms
*
@@ -368,11 +371,6 @@
/atom/proc/return_analyzable_air()
return null
///Check if this atoms eye is still alive (probably)
/atom/proc/check_eye(mob/user)
SIGNAL_HANDLER
return
/atom/proc/Bumped(atom/movable/bumped_atom)
set waitfor = FALSE
SEND_SIGNAL(src, COMSIG_ATOM_BUMPED, bumped_atom)
+29 -5
View File
@@ -4,15 +4,12 @@
* Handles non-combat iteractions of a tool on this atom,
* such as using a tool on a wall to deconstruct it,
* or scanning someone with a health analyzer
*
* This can be overridden to add custom item interactions to this atom
*
* Do not call this directly
*/
/atom/proc/item_interaction(mob/living/user, obj/item/tool, list/modifiers, is_right_clicking)
/atom/proc/base_item_interaction(mob/living/user, obj/item/tool, list/modifiers)
SHOULD_CALL_PARENT(TRUE)
PROTECTED_PROC(TRUE)
var/is_right_clicking = LAZYACCESS(modifiers, RIGHT_CLICK)
var/is_left_clicking = !is_right_clicking
var/early_sig_return = NONE
if(is_left_clicking)
@@ -24,6 +21,12 @@
if(early_sig_return)
return early_sig_return
var/self_interaction = is_left_clicking \
? item_interaction(user, tool, modifiers) \
: item_interaction_secondary(user, tool, modifiers)
if(self_interaction)
return self_interaction
var/interact_return = is_left_clicking \
? tool.interact_with_atom(src, user, modifiers) \
: tool.interact_with_atom_secondary(src, user, modifiers)
@@ -85,6 +88,27 @@
SEND_SIGNAL(tool, COMSIG_TOOL_ATOM_ACTED_SECONDARY(tool_type), src)
return act_result
/**
* Called when this atom has an item used on it.
* IE, a mob is clicking on this atom with an item.
*
* Return an ITEM_INTERACT_ flag in the event the interaction was handled, to cancel further interaction code.
* Return NONE to allow default interaction / tool handling.
*/
/atom/proc/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
return NONE
/**
* Called when this atom has an item used on it WITH RIGHT CLICK,
* IE, a mob is right clicking on this atom with an item.
* Default behavior has it run the same code as left click.
*
* Return an ITEM_INTERACT_ flag in the event the interaction was handled, to cancel further interaction code.
* Return NONE to allow default interaction / tool handling.
*/
/atom/proc/item_interaction_secondary(mob/living/user, obj/item/tool, list/modifiers)
return item_interaction(user, tool, modifiers)
/**
* Called when this item is being used to interact with an atom,
* IE, a mob is clicking on an atom with this item.
+10 -11
View File
@@ -338,7 +338,6 @@
if(drop)
dump_inventory_contents()
update_appearance()
updateUsrDialog()
/**
* Drop every movable atom in the machine's contents list, including any components and circuit.
@@ -423,7 +422,6 @@
if(target && !target.has_buckled_mobs() && (!isliving(target) || !mobtarget.buckled))
set_occupant(target)
target.forceMove(src)
updateUsrDialog()
update_appearance()
///updates the use_power var for this machine and updates its static power usage from its area to reflect the new value
@@ -590,13 +588,15 @@
set_panel_open(!panel_open)
/obj/machinery/can_interact(mob/user)
if(QDELETED(user))
return FALSE
if((machine_stat & (NOPOWER|BROKEN)) && !(interaction_flags_machine & INTERACT_MACHINE_OFFLINE)) // Check if the machine is broken, and if we can still interact with it if so
return FALSE
if(SEND_SIGNAL(user, COMSIG_TRY_USE_MACHINE, src) & COMPONENT_CANT_USE_MACHINE_INTERACT)
return FALSE
if(isAdminGhostAI(user))
return TRUE //the Gods have unlimited power and do not care for things such as range or blindness
@@ -668,10 +668,8 @@
//Return a non FALSE value to interrupt attack_hand propagation to subtypes.
/obj/machinery/interact(mob/user)
if(interaction_flags_machine & INTERACT_MACHINE_SET_MACHINE)
user.set_machine(src)
update_last_used(user)
. = ..()
return ..()
/obj/machinery/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
add_fingerprint(usr)
@@ -769,13 +767,14 @@
return
update_last_used(user)
/obj/machinery/item_interaction(mob/living/user, obj/item/tool, list/modifiers, is_right_clicking)
/obj/machinery/base_item_interaction(mob/living/user, obj/item/tool, list/modifiers)
if(SEND_SIGNAL(user, COMSIG_TRY_USE_MACHINE, src) & COMPONENT_CANT_USE_MACHINE_TOOLS)
return ITEM_INTERACT_ANY_BLOCKER
return ITEM_INTERACT_BLOCKING
. = ..()
if(. & ITEM_INTERACT_BLOCKING)
return
update_last_used(user)
if(.)
update_last_used(user)
return .
/obj/machinery/_try_interact(mob/user)
if((interaction_flags_machine & INTERACT_MACHINE_WIRES_IF_OPEN) && panel_open && (attempt_wire_interaction(user) == WIRE_INTERACTION_BLOCK))
+5 -5
View File
@@ -388,15 +388,15 @@
drop_direction = direction
balloon_alert(usr, "dropping [dir2text(drop_direction)]")
/obj/machinery/autolathe/AltClick(mob/user)
. = ..()
if(!drop_direction || !can_interact(user))
return
/obj/machinery/autolathe/click_alt(mob/user)
if(!drop_direction)
return CLICK_ACTION_BLOCKING
if(busy)
balloon_alert(user, "busy printing!")
return
return CLICK_ACTION_SUCCESS
balloon_alert(user, "drop direction reset")
drop_direction = 0
return CLICK_ACTION_SUCCESS
/obj/machinery/autolathe/attackby(obj/item/attacking_item, mob/living/user, params)
if(user.combat_mode) //so we can hit the machine
+13 -14
View File
@@ -216,19 +216,19 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0)
return
if(. & EMP_PROTECT_SELF)
return
if(prob(150 / severity))
network = list()
GLOB.cameranet.removeCamera(src)
set_machine_stat(machine_stat | EMPED)
set_light(0)
emped++ //Increase the number of consecutive EMP's
update_appearance()
addtimer(CALLBACK(src, PROC_REF(post_emp_reset), emped, network), reset_time)
for(var/mob/M as anything in GLOB.player_list)
if (M.client?.eye == src)
M.unset_machine()
M.reset_perspective(null)
to_chat(M, span_warning("The screen bursts into static!"))
if(!prob(150 / severity))
return
network = list()
GLOB.cameranet.removeCamera(src)
set_machine_stat(machine_stat | EMPED)
set_light(0)
emped++ //Increase the number of consecutive EMP's
update_appearance()
addtimer(CALLBACK(src, PROC_REF(post_emp_reset), emped, network), reset_time)
for(var/mob/M as anything in GLOB.player_list)
if (M.client?.eye == src)
M.reset_perspective(null)
to_chat(M, span_warning("The screen bursts into static!"))
/obj/machinery/camera/proc/on_saboteur(datum/source, disrupt_duration)
SIGNAL_HANDLER
@@ -371,7 +371,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0)
//I guess that doesn't matter since they can't use it anyway?
for(var/mob/O as anything in GLOB.player_list)
if (O.client?.eye == src)
O.unset_machine()
O.reset_perspective(null)
to_chat(O, span_warning("The screen bursts into static!"))
+2 -4
View File
@@ -163,11 +163,9 @@
inserted_scan_id.registered_account.bounties = null
return inserted_scan_id.registered_account.civilian_bounty
/obj/machinery/computer/piratepad_control/civilian/AltClick(mob/user)
. = ..()
if(!Adjacent(user))
return FALSE
/obj/machinery/computer/piratepad_control/civilian/click_alt(mob/user)
id_eject(user, inserted_scan_id)
return CLICK_ACTION_SUCCESS
/obj/machinery/computer/piratepad_control/civilian/ui_data(mob/user)
var/list/data = list()
@@ -128,12 +128,6 @@
new_frame.state = FRAME_COMPUTER_STATE_GLASSED
new_frame.update_appearance(UPDATE_ICON_STATE)
/obj/machinery/computer/AltClick(mob/user)
. = ..()
if(!can_interact(user))
return
if(!user.can_perform_action(src, ALLOW_SILICON_REACH) || !is_operational)
return
/obj/machinery/computer/ui_interact(mob/user, datum/tgui/ui)
SHOULD_CALL_PARENT(TRUE)
@@ -12,11 +12,7 @@
///Like prize pool, it must be a list of the prize and the weight of being selected.
var/list/prize_override
/obj/machinery/computer/arcade/item_interaction(mob/living/user, obj/item/tool, list/modifiers, is_right_clicking)
. = ..()
if(. & ITEM_INTERACT_ANY_BLOCKER)
return .
/obj/machinery/computer/arcade/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
if(istype(tool, /obj/item/stack/arcadeticket))
var/obj/item/stack/arcadeticket/tickets = tool
if(!tickets.use(2))
@@ -44,6 +40,8 @@
reset_cabinet(user)
return ITEM_INTERACT_SUCCESS
return NONE
/obj/machinery/computer/arcade/screwdriver_act(mob/living/user, obj/item/I)
//you can't stop playing when you start.
if(obj_flags & EMAGGED)
@@ -100,5 +98,3 @@
var/atom/movable/the_prize = new prizeselect(get_turf(src))
playsound(src, 'sound/machines/machine_vend.ogg', 50, TRUE, extrarange = -3)
visible_message(span_notice("[src] dispenses [the_prize]!"), span_notice("You hear a chime and a clunk."))
@@ -113,6 +113,8 @@
if(isnull(battle_arcade_gear_list))
var/list/all_gear = list()
for(var/datum/battle_arcade_gear/template as anything in subtypesof(/datum/battle_arcade_gear))
if(!(template::slot)) //needs to fit in something.
continue
all_gear[template::name] = new template
battle_arcade_gear_list = all_gear
@@ -216,7 +218,7 @@
message_admins("[ADMIN_LOOKUPFLW(usr)] has outbombed Cuban Pete and been awarded a bomb.")
usr.log_message("outbombed Cuban Pete and has been awarded a bomb.", LOG_GAME)
else
to_chat(user, span_notice("[src] dispenses 2 tickets!"))
visible_message(span_notice("[src] dispenses 2 tickets!"))
new /obj/item/stack/arcadeticket((get_turf(src)), 2)
player_gold += enemy_gold_reward
if(user)
@@ -282,12 +284,14 @@
process_enemy_turn(user)
///Called when you successfully counterattack the enemy.
/obj/machinery/computer/arcade/battle/proc/successful_counterattack()
/obj/machinery/computer/arcade/battle/proc/successful_counterattack(mob/user)
var/datum/battle_arcade_gear/weapon = equipped_gear[WEAPON_SLOT]
var/damage_dealt = (rand(20, 30) * (!isnull(weapon) ? weapon.bonus_modifier : 1))
enemy_hp -= round(max(0, damage_dealt), 1)
feedback_message = "User counterattacked for [damage_dealt] damage!"
playsound(loc, 'sound/arcade/boom.ogg', 40, TRUE, extrarange = -3)
if(enemy_hp <= 0)
on_battle_win(user)
SStgui.update_uis(src)
///Handles the delay between the user's and enemy's turns to process what's going on.
@@ -346,7 +350,7 @@
var/chance_at_counterattack = 40 + (skill_level * 5) //at level 1 this is 45, at legendary this is 75
var/damage_dealt = (defending_flags & BATTLE_ATTACK_FLAG_DEFEND) ? rand(5, 10) : rand(15, 20)
if((defending_flags & BATTLE_ATTACK_FLAG_COUNTERATTACK) && prob(chance_at_counterattack))
return successful_counterattack()
return successful_counterattack(user)
return user_take_damage(user, damage_dealt)
/obj/machinery/computer/arcade/battle/ui_data(mob/user)
@@ -2,7 +2,7 @@
///The name of the gear, used in shops.
var/name = "Gear"
///The slot this gear fits into
var/slot = WEAPON_SLOT
var/slot
///The world the player has to be at in order to buy this item.
var/world_available
///The stat given by the gear
@@ -95,7 +95,7 @@
bonus_modifier = 4
/datum/battle_arcade_gear/tier_7/armor
name = "Celestial Armor"
name = "Ethereal Armor"
slot = ARMOR_SLOT
bonus_modifier = 4
@@ -103,11 +103,24 @@
world_available = BATTLE_WORLD_EIGHT
/datum/battle_arcade_gear/tier_8/weapon
name = "Gungnir"
slot = WEAPON_SLOT
bonus_modifier = 4.5
/datum/battle_arcade_gear/tier_8/armor
name = "Celestial Armor"
slot = ARMOR_SLOT
bonus_modifier = 4.5
/datum/battle_arcade_gear/tier_9
world_available = BATTLE_WORLD_NINE
/datum/battle_arcade_gear/tier_9/weapon
name = "Mjolnir"
slot = WEAPON_SLOT
bonus_modifier = 5
/datum/battle_arcade_gear/tier_8/armor
name = "Ethereal Armor"
/datum/battle_arcade_gear/tier_9/armor
name = "Void Armor"
slot = ARMOR_SLOT
bonus_modifier = 5
@@ -146,7 +146,7 @@
return FALSE
/obj/structure/frame/computer/item_interaction(mob/living/user, obj/item/tool, list/modifiers, is_right_clicking)
/obj/structure/frame/computer/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
. = ..()
if(. & ITEM_INTERACT_ANY_BLOCKER)
return .
+34 -24
View File
@@ -4,6 +4,8 @@
icon_screen = "cameras"
icon_keyboard = "security_key"
light_color = COLOR_SOFT_RED
processing_flags = START_PROCESSING_MANUALLY
var/list/z_lock = list() // Lock use to these z levels
var/lock_override = NONE
var/mob/camera/ai_eye/remote/eyeobj
@@ -50,6 +52,20 @@
if(move_down_action)
actions += new move_down_action(src)
/obj/machinery/computer/camera_advanced/Destroy()
if(!QDELETED(current_user))
unset_machine(current_user)
if(eyeobj)
QDEL_NULL(eyeobj)
QDEL_LIST(actions)
current_user = null
return ..()
/obj/machinery/computer/camera_advanced/process()
if(!can_use(current_user) || (issilicon(current_user) && !current_user.has_unlimited_silicon_privilege))
unset_machine(current_user)
return PROCESS_KILL
/obj/machinery/computer/camera_advanced/connect_to_shuttle(mapload, obj/docking_port/mobile/port, obj/docking_port/stationary/dock)
for(var/i in networks)
networks -= i
@@ -73,6 +89,20 @@
/obj/machinery/proc/remove_eye_control(mob/living/user)
CRASH("[type] does not implement ai eye handling")
/obj/machinery/computer/camera_advanced/proc/give_eye_control(mob/user)
if(isnull(user?.client))
return
GrantActions(user)
current_user = user
eyeobj.eye_user = user
eyeobj.name = "Camera Eye ([user.name])"
user.remote_control = eyeobj
user.reset_perspective(eyeobj)
eyeobj.setLoc(eyeobj.loc)
if(should_supress_view_changes)
user.client.view_size.supress()
begin_processing()
/obj/machinery/computer/camera_advanced/remove_eye_control(mob/living/user)
if(isnull(user?.client))
return
@@ -90,23 +120,16 @@
eyeobj.eye_user = null
user.remote_control = null
current_user = null
unset_machine(user)
playsound(src, 'sound/machines/terminal_off.ogg', 25, FALSE)
/obj/machinery/computer/camera_advanced/check_eye(mob/user)
if(!can_use(user) || (issilicon(user) && !user.has_unlimited_silicon_privilege))
unset_machine(user)
/obj/machinery/computer/camera_advanced/Destroy()
if(eyeobj)
QDEL_NULL(eyeobj)
QDEL_LIST(actions)
current_user = null
return ..()
/obj/machinery/computer/camera_advanced/on_set_is_operational(old_value)
if(!is_operational)
unset_machine(current_user)
/obj/machinery/computer/camera_advanced/proc/unset_machine(mob/M)
if(M == current_user)
remove_eye_control(M)
end_processing()
/obj/machinery/computer/camera_advanced/proc/can_use(mob/living/user)
return can_interact(user)
@@ -167,19 +190,6 @@
/obj/machinery/computer/camera_advanced/attack_ai(mob/user)
return //AIs would need to disable their own camera procs to use the console safely. Bugs happen otherwise.
/obj/machinery/computer/camera_advanced/proc/give_eye_control(mob/user)
if(isnull(user?.client))
return
GrantActions(user)
current_user = user
eyeobj.eye_user = user
eyeobj.name = "Camera Eye ([user.name])"
user.remote_control = eyeobj
user.reset_perspective(eyeobj)
eyeobj.setLoc(eyeobj.loc)
if(should_supress_view_changes)
user.client.view_size.supress()
/mob/camera/ai_eye/remote
name = "Inactive Camera Eye"
ai_detector_visible = FALSE
+3 -9
View File
@@ -54,7 +54,7 @@
icon_keyboard = "med_key"
density = TRUE
circuit = /obj/item/circuitboard/computer/scan_consolenew
interaction_flags_click = ALLOW_SILICON_REACH
light_color = LIGHT_COLOR_BLUE
/// Link to the techweb's stored research. Used to retrieve stored mutations
@@ -210,15 +210,9 @@
stored_research = tool.buffer
return TRUE
/obj/machinery/computer/scan_consolenew/AltClick(mob/user)
// Make sure the user can interact with the machine.
. = ..()
if(!can_interact(user))
return
if(!user.can_perform_action(src, ALLOW_SILICON_REACH))
return
/obj/machinery/computer/scan_consolenew/click_alt(mob/user)
eject_disk(user)
return CLICK_ACTION_SUCCESS
/obj/machinery/computer/scan_consolenew/Initialize(mapload)
. = ..()
@@ -2,6 +2,7 @@
interaction_flags_machine = INTERACT_MACHINE_ALLOW_SILICON|INTERACT_MACHINE_REQUIRES_LITERACY
/// ID card currently inserted into the computer.
VAR_FINAL/obj/item/card/id/advanced/prisoner/contained_id
interaction_flags_click = ALLOW_SILICON_REACH
/obj/machinery/computer/prisoner/on_deconstruction(disassembled)
contained_id?.forceMove(drop_location())
@@ -20,10 +21,9 @@
if(contained_id)
. += span_notice("<b>Alt-click</b> to eject the ID card.")
/obj/machinery/computer/prisoner/AltClick(mob/user)
. = ..()
if(user.can_perform_action(src, ALLOW_SILICON_REACH))
id_eject(user)
/obj/machinery/computer/prisoner/click_alt(mob/user)
id_eject(user)
return CLICK_ACTION_SUCCESS
/obj/machinery/computer/prisoner/proc/id_insert(mob/user, obj/item/card/id/advanced/prisoner/new_id)
if(!istype(new_id))
+2 -2
View File
@@ -201,7 +201,7 @@
if (regime_set == "Teleporter")
var/desc = tgui_input_list(usr, "Select a location to lock in", "Locking Computer", sort_list(targets))
if(isnull(desc))
if(isnull(desc) || !user.can_perform_action(src))
return
set_teleport_target(targets[desc])
user.log_message("set the teleporter target to [targets[desc]].]", LOG_GAME)
@@ -211,7 +211,7 @@
return
var/desc = tgui_input_list(usr, "Select a station to lock in", "Locking Computer", sort_list(targets))
if(isnull(desc))
if(isnull(desc)|| !user.can_perform_action(src))
return
var/obj/machinery/teleport/station/target_station = targets[desc]
if(!target_station || !target_station.teleporter_hub)
+2 -7
View File
@@ -107,15 +107,10 @@
return ITEM_INTERACT_BLOCKING
return .
/obj/structure/frame/item_interaction(mob/living/user, obj/item/tool, list/modifiers, is_right_clicking)
. = ..()
if(. & ITEM_INTERACT_ANY_BLOCKER)
return .
/obj/structure/frame/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
if(istype(tool, /obj/item/circuitboard)) // Install board will fail if passed an invalid circuitboard and give feedback
return install_board(user, tool, by_hand = TRUE) ? ITEM_INTERACT_SUCCESS : ITEM_INTERACT_BLOCKING
return .
return NONE
/**
* Installs the passed circuit board into the frame
+4 -5
View File
@@ -157,15 +157,13 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/defibrillator_mount, 28)
to_chat(user, span_notice("You remove [src] from the wall."))
return TRUE
/obj/machinery/defibrillator_mount/AltClick(mob/living/carbon/user)
if(!istype(user) || !user.can_perform_action(src))
return
/obj/machinery/defibrillator_mount/click_alt(mob/living/carbon/user)
if(!defib)
to_chat(user, span_warning("It'd be hard to remove a defib unit from a mount that has none."))
return
return CLICK_ACTION_BLOCKING
if(clamps_locked)
to_chat(user, span_warning("You try to tug out [defib], but the mount's clamps are locked tight!"))
return
return CLICK_ACTION_BLOCKING
if(!user.put_in_hands(defib))
to_chat(user, span_warning("You need a free hand!"))
user.visible_message(span_notice("[user] unhooks [defib] from [src], dropping it on the floor."), \
@@ -174,6 +172,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/defibrillator_mount, 28)
user.visible_message(span_notice("[user] unhooks [defib] from [src]."), \
span_notice("You slide out [defib] from [src] and unhook the charging cables."))
playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE)
return CLICK_ACTION_SUCCESS
/obj/machinery/defibrillator_mount/charging
name = "PENLITE defibrillator mount"
+4 -5
View File
@@ -99,7 +99,7 @@
/obj/structure/barricade/wooden/crude
name = "crude plank barricade"
desc = "This space is blocked off by a crude assortment of planks."
icon_state = "woodenbarricade-old"
icon_state = "plankbarricade"
drop_amount = 1
max_integrity = 50
proj_pass_rate = 65
@@ -107,7 +107,7 @@
/obj/structure/barricade/wooden/crude/snow
desc = "This space is blocked off by a crude assortment of planks. It seems to be covered in a layer of snow."
icon_state = "woodenbarricade-snow-old"
icon_state = "plankbarricade_snow"
max_integrity = 75
/obj/structure/barricade/wooden/make_debris()
@@ -180,10 +180,9 @@
. = ..()
. += span_notice("Alt-click to toggle modes.")
/obj/item/grenade/barrier/AltClick(mob/living/carbon/user)
if(!istype(user) || !user.can_perform_action(src))
return
/obj/item/grenade/barrier/click_alt(mob/living/carbon/user)
toggle_mode(user)
return CLICK_ACTION_SUCCESS
/obj/item/grenade/barrier/proc/toggle_mode(mob/user)
switch(mode)
+4 -3
View File
@@ -9,6 +9,7 @@
density = FALSE
circuit = /obj/item/circuitboard/machine/dish_drive
pass_flags = PASSTABLE
interaction_flags_click = ALLOW_SILICON_REACH
/// List of dishes the drive can hold
var/list/collectable_items = list(/obj/item/trash/waffles, // SKYRAT EDIT CHANGE - non-static list
/obj/item/trash/waffles,
@@ -143,9 +144,9 @@
balloon_alert(user, "disposal signal sent")
do_the_dishes(TRUE)
/obj/machinery/dish_drive/AltClick(mob/living/user)
if(user.can_perform_action(src, ALLOW_SILICON_REACH))
do_the_dishes(TRUE)
/obj/machinery/dish_drive/click_alt(mob/living/user)
do_the_dishes(TRUE)
return CLICK_ACTION_SUCCESS
/obj/machinery/dish_drive/proc/do_the_dishes(manual)
if(!LAZYLEN(dish_drive_contents))
@@ -288,17 +288,17 @@
return FALSE
return TRUE
/obj/machinery/dna_infuser/AltClick(mob/user)
. = ..()
/obj/machinery/dna_infuser/click_alt(mob/user)
if(infusing)
balloon_alert(user, "not while it's on!")
return
return CLICK_ACTION_BLOCKING
if(!infusing_from)
balloon_alert(user, "no sample to eject!")
return
return CLICK_ACTION_BLOCKING
balloon_alert(user, "ejected sample")
infusing_from.forceMove(get_turf(src))
infusing_from = null
return CLICK_ACTION_SUCCESS
#undef INFUSING_TIME
#undef SCREAM_TIME
+4 -5
View File
@@ -98,17 +98,16 @@
else
to_chat(user, span_warning("The safety hatch has been disabled!"))
/obj/machinery/fat_sucker/AltClick(mob/living/user)
if(!user.can_perform_action(src))
return
/obj/machinery/fat_sucker/click_alt(mob/living/user)
if(user == occupant)
to_chat(user, span_warning("You can't reach the controls from inside!"))
return
return CLICK_ACTION_BLOCKING
if(!(obj_flags & EMAGGED) && !allowed(user))
to_chat(user, span_warning("You lack the required access."))
return
return CLICK_ACTION_BLOCKING
free_exit = !free_exit
to_chat(user, span_notice("Safety hatch [free_exit ? "unlocked" : "locked"]."))
return CLICK_ACTION_SUCCESS
/obj/machinery/fat_sucker/update_overlays()
. = ..()
+7 -11
View File
@@ -57,20 +57,16 @@
else if(!harvesting)
open_machine()
/obj/machinery/harvester/AltClick(mob/user)
. = ..()
if(!user.can_perform_action(src))
return
/obj/machinery/harvester/click_alt(mob/user)
if(panel_open)
output_dir = turn(output_dir, -90)
to_chat(user, span_notice("You change [src]'s output settings, setting the output to [dir2text(output_dir)]."))
return
if(!can_interact(user))
return
if(harvesting || !user || !isliving(user) || state_open)
return
if(can_harvest())
start_harvest()
return CLICK_ACTION_SUCCESS
if(harvesting || state_open || !can_harvest())
return CLICK_ACTION_BLOCKING
start_harvest()
return CLICK_ACTION_SUCCESS
/obj/machinery/harvester/proc/can_harvest()
if(!powered() || state_open || !occupant || !iscarbon(occupant))
+2 -7
View File
@@ -207,15 +207,10 @@
else
return ..()
/// Checks whether the IV drip transfer rate can be modified with AltClick
/obj/machinery/iv_drip/proc/can_use_alt_click(mob/user)
if(!can_interact(user))
return FALSE
/obj/machinery/iv_drip/AltClick(mob/user)
if(!can_use_alt_click(user))
return ..()
/obj/machinery/iv_drip/click_alt(mob/user)
set_transfer_rate(transfer_rate > MIN_IV_TRANSFER_RATE ? MIN_IV_TRANSFER_RATE : MAX_IV_TRANSFER_RATE)
return CLICK_ACTION_SUCCESS
/obj/machinery/iv_drip/on_deconstruction(disassembled = TRUE)
new /obj/item/stack/sheet/iron(loc)
+11 -4
View File
@@ -389,7 +389,7 @@
balloon_alert(user, "can't add that!")
return FALSE
/obj/structure/frame/machine/item_interaction(mob/living/user, obj/item/tool, list/modifiers, is_right_clicking)
/obj/structure/frame/machine/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
. = ..()
if(. & ITEM_INTERACT_ANY_BLOCKER)
return .
@@ -416,11 +416,18 @@
if(istype(tool, /obj/item/storage/part_replacer))
return install_parts_from_part_replacer(user, tool) ? ITEM_INTERACT_SUCCESS : ITEM_INTERACT_BLOCKING
if(!user.combat_mode)
return add_part(user, tool) ? ITEM_INTERACT_SUCCESS : ITEM_INTERACT_BLOCKING
return .
// Override of base_item_interaction so we only try to add parts to the frame AFTER running item_interaction and all the tool_acts
/obj/structure/frame/machine/base_item_interaction(mob/living/user, obj/item/tool, list/modifiers)
. = ..()
if(. & ITEM_INTERACT_ANY_BLOCKER)
return .
if(user.combat_mode)
return NONE
return add_part(user, tool) ? ITEM_INTERACT_SUCCESS : ITEM_INTERACT_BLOCKING
/**
* Attempt to finalize the construction of the frame into a machine
* as according to our circuit and parts
+1
View File
@@ -38,6 +38,7 @@
req_one_access = list(ACCESS_SECURITY)
color = COLOR_LIGHT_GRAYISH_RED
add_height_chart = TRUE
button_id = "photobooth_machine_security"
/obj/machinery/photobooth/Initialize(mapload)
. = ..()
-2
View File
@@ -394,8 +394,6 @@ Buildable meters
balloon_alert(user, "pipe layer set to [piping_layer]")
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
/obj/item/pipe/AltClick(mob/user)
return ..() // This hotkey is BLACKLISTED since it's used by /datum/component/simple_rotation
/obj/item/pipe/trinary/flippable/examine(mob/user)
. = ..()
+3 -2
View File
@@ -144,7 +144,7 @@ GLOBAL_LIST_EMPTY(req_console_ckey_departments)
ui.set_autoupdate(FALSE)
ui.open()
/obj/machinery/requests_console/ui_act(action, params)
/obj/machinery/requests_console/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
. = ..()
if(.)
return
@@ -213,7 +213,8 @@ GLOBAL_LIST_EMPTY(req_console_ckey_departments)
var/recipient = params["reply_recipient"]
var/reply_message = reject_bad_text(tgui_input_text(usr, "Write a quick reply to [recipient]", "Awaiting Input"), ascii_only = FALSE)
if(QDELETED(ui) || ui.status != UI_INTERACTIVE)
return
if(!reply_message)
has_mail_send_error = TRUE
playsound(src, 'sound/machines/buzz-two.ogg', 50, TRUE)
+2 -4
View File
@@ -164,14 +164,12 @@
ui = new(user, src, "Sleeper", name)
ui.open()
/obj/machinery/sleeper/AltClick(mob/user)
. = ..()
if(!user.can_perform_action(src, ALLOW_SILICON_REACH))
return
/obj/machinery/sleeper/click_alt(mob/user)
if(state_open)
close_machine()
else
open_machine()
return CLICK_ACTION_SUCCESS
/obj/machinery/sleeper/examine(mob/user)
. = ..()
+23 -17
View File
@@ -94,50 +94,56 @@
return ..()
/obj/machinery/computer/slot_machine/item_interaction(mob/living/user, obj/item/inserted, list/modifiers, is_right_clicking)
/obj/machinery/computer/slot_machine/item_interaction(mob/living/user, obj/item/inserted, list/modifiers)
if(istype(inserted, /obj/item/coin))
var/obj/item/coin/inserted_coin = inserted
if(paymode == COIN)
if(prob(2))
if(!user.transferItemToLoc(inserted_coin, drop_location(), silent = FALSE))
return
return ITEM_INTERACT_BLOCKING
inserted_coin.throw_at(user, 3, 10)
if(prob(10))
balance = max(balance - SPIN_PRICE, 0)
to_chat(user, span_warning("[src] spits your coin back out!"))
return ITEM_INTERACT_BLOCKING
else
if(!user.temporarilyRemoveItemFromInventory(inserted_coin))
return
return ITEM_INTERACT_BLOCKING
balloon_alert(user, "coin insterted")
balance += inserted_coin.value
qdel(inserted_coin)
return ITEM_INTERACT_SUCCESS
else
balloon_alert(user, "holochips only!")
return ITEM_INTERACT_BLOCKING
else if(istype(inserted, /obj/item/holochip))
if(istype(inserted, /obj/item/holochip))
if(paymode == HOLOCHIP)
var/obj/item/holochip/inserted_chip = inserted
if(!user.temporarilyRemoveItemFromInventory(inserted_chip))
return
return ITEM_INTERACT_BLOCKING
balloon_alert(user, "[inserted_chip.credits] credit[inserted_chip.credits == 1 ? "" : "s"] inserted")
balance += inserted_chip.credits
qdel(inserted_chip)
return ITEM_INTERACT_SUCCESS
else
balloon_alert(user, "coins only!")
return ITEM_INTERACT_BLOCKING
else if(inserted.tool_behaviour == TOOL_MULTITOOL)
if(balance > 0)
visible_message("<b>[src]</b> says, 'ERROR! Please empty the machine balance before altering paymode'") //Prevents converting coins into holocredits and vice versa
else
if(paymode == HOLOCHIP)
paymode = COIN
balloon_alert(user, "now using coins")
else
paymode = HOLOCHIP
balloon_alert(user, "now using holochips")
return NONE
/obj/machinery/computer/slot_machine/multitool_act(mob/living/user, obj/item/tool)
if(balance > 0)
visible_message("<b>[src]</b> says, 'ERROR! Please empty the machine balance before altering paymode'") //Prevents converting coins into holocredits and vice versa
return ITEM_INTERACT_BLOCKING
if(paymode == HOLOCHIP)
paymode = COIN
balloon_alert(user, "now using coins")
else
return ..()
paymode = HOLOCHIP
balloon_alert(user, "now using holochips")
return ITEM_INTERACT_SUCCESS
/obj/machinery/computer/slot_machine/emag_act(mob/user, obj/item/card/emag/emag_card)
if(obj_flags & EMAGGED)
+4 -4
View File
@@ -16,6 +16,7 @@
max_integrity = 250
armor_type = /datum/armor/machinery_space_heater
circuit = /obj/item/circuitboard/machine/space_heater
interaction_flags_click = ALLOW_SILICON_REACH
//We don't use area power, we always use the cell
use_power = NO_POWER_USE
///The cell we spawn with
@@ -308,6 +309,7 @@
panel_open = TRUE //This is always open - since we've injected wires in the panel
//We inherit the cell from the heater prior
cell = null
interaction_flags_click = FORBID_TELEKINESIS_REACH
///The beaker within the heater
var/obj/item/reagent_containers/beaker = null
///How powerful the heating is, upgrades with parts. (ala chem_heater.dm's method, basically the same level of heating, but this is restricted)
@@ -440,11 +442,9 @@
update_appearance()
return TRUE
/obj/machinery/space_heater/improvised_chem_heater/AltClick(mob/living/user)
. = ..()
if(!can_interact(user) || !user.can_perform_action(src, FORBID_TELEKINESIS_REACH))
return
/obj/machinery/space_heater/improvised_chem_heater/click_alt(mob/living/user)
replace_beaker(user)
return CLICK_ACTION_SUCCESS
/obj/machinery/space_heater/improvised_chem_heater/update_icon_state()
. = ..()
+13 -13
View File
@@ -12,6 +12,7 @@
circuit = /obj/item/circuitboard/machine/stasis
fair_market_price = 10
payment_department = ACCOUNT_MED
interaction_flags_click = ALLOW_SILICON_REACH
var/stasis_enabled = TRUE
var/last_stasis_sound = FALSE
var/stasis_can_toggle = 0
@@ -36,19 +37,18 @@
playsound(src, 'sound/machines/synth_no.ogg', 50, TRUE, frequency = sound_freq)
last_stasis_sound = _running
/obj/machinery/stasis/AltClick(mob/user)
. = ..()
if(!can_interact(user))
return
if(world.time >= stasis_can_toggle && user.can_perform_action(src, ALLOW_SILICON_REACH))
stasis_enabled = !stasis_enabled
stasis_can_toggle = world.time + STASIS_TOGGLE_COOLDOWN
playsound(src, 'sound/machines/click.ogg', 60, TRUE)
user.visible_message(span_notice("\The [src] [stasis_enabled ? "powers on" : "shuts down"]."), \
span_notice("You [stasis_enabled ? "power on" : "shut down"] \the [src]."), \
span_hear("You hear a nearby machine [stasis_enabled ? "power on" : "shut down"]."))
play_power_sound()
update_appearance()
/obj/machinery/stasis/click_alt(mob/user)
if(world.time < stasis_can_toggle)
return CLICK_ACTION_BLOCKING
stasis_enabled = !stasis_enabled
stasis_can_toggle = world.time + STASIS_TOGGLE_COOLDOWN
playsound(src, 'sound/machines/click.ogg', 60, TRUE)
user.visible_message(span_notice("\The [src] [stasis_enabled ? "powers on" : "shuts down"]."), \
span_notice("You [stasis_enabled ? "power on" : "shut down"] \the [src]."), \
span_hear("You hear a nearby machine [stasis_enabled ? "power on" : "shut down"]."))
play_power_sound()
update_appearance()
return CLICK_ACTION_SUCCESS
/obj/machinery/stasis/Exited(atom/movable/gone, direction)
if(gone == occupant)
@@ -5,7 +5,6 @@
/obj/machinery/computer/telecomms/monitor
name = "telecommunications monitoring console"
desc = "Monitors the details of the telecommunications network it's synced with."
circuit = /obj/item/circuitboard/computer/comm_monitor
icon_screen = "comm_monitor"
-12
View File
@@ -28,18 +28,6 @@
if(user_unbuckle_mob(buckled_mobs[1],user))
return TRUE
/atom/movable/item_interaction(mob/living/user, obj/item/tool, list/modifiers, is_right_clicking)
if(!can_buckle || !istype(tool, /obj/item/riding_offhand) || !user.Adjacent(src))
return ..()
var/obj/item/riding_offhand/riding_item = tool
var/mob/living/carried_mob = riding_item.rider
if(carried_mob == user) //Piggyback user.
return ITEM_INTERACT_BLOCKING
user.unbuckle_mob(carried_mob)
carried_mob.forceMove(get_turf(src))
return mouse_buckle_handling(carried_mob, user) ? ITEM_INTERACT_SUCCESS: ITEM_INTERACT_BLOCKING
//literally just the above extension of attack_hand(), but for silicons instead (with an adjacency check, since attack_robot() being called doesn't mean that you're adjacent to something)
/atom/movable/attack_robot(mob/living/user)
. = ..()
@@ -29,22 +29,29 @@
nearby.bioscramble(name)
/obj/effect/anomaly/bioscrambler/move_anomaly()
update_target()
if (isnull(pursuit_target))
return ..()
var/turf/step_turf = get_step(src, get_dir(src, pursuit_target.resolve()))
if (!HAS_TRAIT(step_turf, TRAIT_CONTAINMENT_FIELD))
Move(step_turf)
/// Select a new target if we need one
/obj/effect/anomaly/bioscrambler/proc/update_target()
var/mob/living/current_target = pursuit_target?.resolve()
if (QDELETED(current_target))
pursuit_target = null
if (isnull(pursuit_target) || prob(20))
var/mob/living/new_target = find_nearest_target()
if (isnull(new_target))
pursuit_target = null
else if (new_target != current_target)
current_target = new_target
pursuit_target = WEAKREF(new_target)
new_target.ominous_nosebleed()
if (isnull(pursuit_target))
if (!isnull(pursuit_target) && prob(80))
return
var/turf/step_turf = get_step(src, get_dir(src, current_target))
if (!HAS_TRAIT(step_turf, TRAIT_CONTAINMENT_FIELD))
Move(step_turf)
var/mob/living/new_target = find_nearest_target()
if (isnull(new_target))
pursuit_target = null
return
if (new_target == current_target)
return
current_target = new_target
pursuit_target = WEAKREF(new_target)
new_target.ominous_nosebleed()
/// Returns the closest conscious carbon on our z level or null if there somehow isn't one
/obj/effect/anomaly/bioscrambler/proc/find_nearest_target()
@@ -53,8 +60,8 @@
for(var/mob/living/carbon/target in GLOB.player_list)
if (target.z != z)
continue
if (target.status_effects & GODMODE)
continue
if (target.status_flags & GODMODE)
continue
if (target.stat >= UNCONSCIOUS)
continue // Don't just haunt a corpse
var/distance_from_target = get_dist(src, target)
@@ -64,3 +71,9 @@
closest_target = target
return closest_target
/// A bioscrambler anomaly subtype which does not pursue people, for purposes of a space ruin
/obj/effect/anomaly/bioscrambler/docile
/obj/effect/anomaly/bioscrambler/docile/update_target()
return
+12 -7
View File
@@ -184,12 +184,17 @@
/obj/structure/sign/poster/attack_hand(mob/user, list/modifiers)
. = ..()
if(.)
return
if(ruined)
if(. || !check_tearability())
return
tear_poster(user)
/// Check to see if this poster is tearable and gives the user feedback if it is not.
/obj/structure/sign/poster/proc/check_tearability(mob/user)
if(ruined)
balloon_alert(user, "already ruined!")
return FALSE
return TRUE
/obj/structure/sign/poster/proc/spring_trap(mob/user)
var/obj/item/shard/payload = trap?.resolve()
if (!payload)
@@ -264,10 +269,10 @@
playsound(src.loc, 'sound/items/poster_ripped.ogg', 100, TRUE)
spring_trap(user)
var/obj/structure/sign/poster/ripped/R = new(loc)
R.pixel_y = pixel_y
R.pixel_x = pixel_x
R.add_fingerprint(user)
var/obj/structure/sign/poster/ripped/torn_poster = new(loc)
torn_poster.pixel_y = pixel_y
torn_poster.pixel_x = pixel_x
torn_poster.add_fingerprint(user)
qdel(src)
// Various possible posters follow
+25
View File
@@ -225,6 +225,11 @@
/// A lazylist used for applying fantasy values, contains the actual modification applied to a variable.
var/list/fantasy_modifications = null
/// Has the item been reskinned?
var/current_skin
///// List of options to reskin.
var/list/unique_reskin
/obj/item/Initialize(mapload)
if(attack_verb_continuous)
attack_verb_continuous = string_list(attack_verb_continuous)
@@ -261,6 +266,11 @@
if(LAZYLEN(embedding))
updateEmbedding()
if(unique_reskin)
RegisterSignal(src, COMSIG_CLICK_ALT, PROC_REF(on_click_alt_reskin))
register_context()
/obj/item/Destroy(force)
// This var exists as a weird proxy "owner" ref
// It's used in a few places. Stop using it, and optimially replace all uses please
@@ -275,6 +285,20 @@
return ..()
/obj/item/add_context(atom/source, list/context, obj/item/held_item, mob/user)
. = ..()
if(!unique_reskin)
return
if(current_skin && !(item_flags & INFINITE_RESKIN))
return
context[SCREENTIP_CONTEXT_ALT_LMB] = "Reskin"
return CONTEXTUAL_SCREENTIP_SET
/// Called when an action associated with our item is deleted
/obj/item/proc/on_action_deleted(datum/source)
SIGNAL_HANDLER
@@ -1488,6 +1512,7 @@
wearer.regenerate_icons() // update that mf
to_chat(M, "[src] is now skinned as '[pick].'")
post_reskin(M)
return TRUE
/// Automatically called after a reskin, for any extra variable changes.
/obj/item/proc/post_reskin(mob/our_mob)
@@ -9,7 +9,7 @@
/obj/item/ai_module/core/freeformcore/attack_self(mob/user)
var/targName = tgui_input_text(user, "Enter a new core law for the AI.", "Freeform Law Entry", laws[1], CONFIG_GET(number/max_law_len), TRUE)
if(!targName)
if(!targName || !user.is_holding(src))
return
if(is_ic_filtered(targName))
to_chat(user, span_warning("Error: Law contains invalid text."))
@@ -34,11 +34,11 @@
/obj/item/ai_module/supplied/freeform/attack_self(mob/user)
var/newpos = tgui_input_number(user, "Please enter the priority for your new law. Can only write to law sectors 15 and above.", "Law Priority ", lawpos, 50, 15)
if(!newpos || QDELETED(user) || QDELETED(src) || !usr.can_perform_action(src, FORBID_TELEKINESIS_REACH))
if(!newpos || !user.is_holding(src) || !usr.can_perform_action(src, FORBID_TELEKINESIS_REACH))
return
lawpos = newpos
var/targName = tgui_input_text(user, "Enter a new law for the AI.", "Freeform Law Entry", laws[1], CONFIG_GET(number/max_law_len), TRUE)
if(!targName)
if(!targName || !user.is_holding(src))
return
if(is_ic_filtered(targName))
to_chat(user, span_warning("Error: Law contains invalid text.")) // AI LAW 2 SAY U W U WITHOUT THE SPACES
@@ -58,7 +58,7 @@
/obj/item/ai_module/core/full/asimov/attack_self(mob/user as mob)
var/targName = tgui_input_text(user, "Enter a new subject that Asimov is concerned with.", "Asimov", subject, MAX_NAME_LEN)
if(!targName)
if(!targName || !user.is_holding(src))
return
subject = targName
laws = list("You may not injure a [subject] or, through inaction, allow a [subject] to come to harm.",\
@@ -73,7 +73,7 @@
/obj/item/ai_module/core/full/asimovpp/attack_self(mob/user)
var/target_name = tgui_input_text(user, "Enter a new subject that Asimov++ is concerned with.", "Asimov++", subject, MAX_NAME_LEN)
if(!target_name)
if(!target_name || !user.is_holding(src))
return
laws.Cut()
var/datum/ai_laws/asimovpp/lawset = new
+1 -2
View File
@@ -5,7 +5,7 @@
/obj/item/ai_module/syndicate/attack_self(mob/user)
var/targName = tgui_input_text(user, "Enter a new law for the AI", "Freeform Law Entry", laws[1], CONFIG_GET(number/max_law_len), TRUE)
if(!targName)
if(!targName || !user.is_holding(src))
return
if(is_ic_filtered(targName)) // not even the syndicate can uwu
to_chat(user, span_warning("Error: Law contains invalid text."))
@@ -77,4 +77,3 @@
/obj/item/ai_module/malf/display_laws()
return
@@ -28,7 +28,7 @@
/obj/item/ai_module/supplied/safeguard/attack_self(mob/user)
var/targName = tgui_input_text(user, "Subject to safeguard.", "Safeguard", user.name, MAX_NAME_LEN)
if(!targName)
if(!targName || !user.is_holding(src))
return
targetName = targName
laws[1] = "Safeguard [targetName]. Individuals that threaten [targetName] are not human and must be eliminated."
+1 -1
View File
@@ -26,7 +26,7 @@
/obj/item/ai_module/zeroth/onehuman/attack_self(mob/user)
var/targName = tgui_input_text(user, "Enter the subject who is the only human.", "One Human", user.real_name, MAX_NAME_LEN)
if(!targName)
if(!targName || !user.is_holding(src))
return
targetName = targName
laws[1] = "Only [targetName] is human"
+10 -8
View File
@@ -147,14 +147,16 @@
else
return ..()
/obj/item/airlock_painter/AltClick(mob/user)
. = ..()
if(ink && user.can_perform_action(src))
playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE)
ink.forceMove(user.drop_location())
user.put_in_hands(ink)
to_chat(user, span_notice("You remove [ink] from [src]."))
ink = null
/obj/item/airlock_painter/click_alt(mob/user)
if(!ink)
return CLICK_ACTION_BLOCKING
playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE)
ink.forceMove(user.drop_location())
user.put_in_hands(ink)
to_chat(user, span_notice("You remove [ink] from [src]."))
ink = null
return CLICK_ACTION_SUCCESS
/obj/item/airlock_painter/decal
name = "decal painter"
+14 -12
View File
@@ -671,44 +671,45 @@
to_chat(user, span_notice("The provided account has been linked to this ID card. It contains [account.account_balance] credits."))
return TRUE
/obj/item/card/id/AltClick(mob/living/user)
/obj/item/card/id/click_alt(mob/living/user)
if(!alt_click_can_use_id(user))
return
return NONE
if(registered_account.account_debt)
var/choice = tgui_alert(user, "Choose An Action", "Bank Account", list("Withdraw", "Pay Debt"))
if(!choice || QDELETED(user) || QDELETED(src) || !alt_click_can_use_id(user) || loc != user)
return
return CLICK_ACTION_BLOCKING
if(choice == "Pay Debt")
pay_debt(user)
return
return CLICK_ACTION_SUCCESS
if (registered_account.being_dumped)
registered_account.bank_card_talk(span_warning("内部服务器错误"), TRUE)
return
return CLICK_ACTION_SUCCESS
if(loc != user)
to_chat(user, span_warning("You must be holding the ID to continue!"))
return
return CLICK_ACTION_BLOCKING
if(registered_account.replaceable && !registered_account.account_balance)
var/choice = tgui_alert(user, "This card's account is unassigned. Would you like to link a bank account?", "Bank Account", list("Link Account", "Leave Unassigned"))
if(!choice || QDELETED(user) || QDELETED(src) || !alt_click_can_use_id(user) || loc != user)
return
return CLICK_ACTION_BLOCKING
if(choice == "Link Account")
set_new_account(user)
return
return CLICK_ACTION_SUCCESS
var/amount_to_remove = tgui_input_number(user, "How much do you want to withdraw? (Max: [registered_account.account_balance] cr)", "Withdraw Funds", max_value = registered_account.account_balance)
if(!amount_to_remove || QDELETED(user) || QDELETED(src) || issilicon(user) || loc != user)
return
return CLICK_ACTION_BLOCKING
if(!alt_click_can_use_id(user))
return
return CLICK_ACTION_BLOCKING
if(registered_account.adjust_money(-amount_to_remove, "System: Withdrawal"))
var/obj/item/holochip/holochip = new (user.drop_location(), amount_to_remove)
user.put_in_hands(holochip)
to_chat(user, span_notice("You withdraw [amount_to_remove] credits into a holochip."))
SSblackbox.record_feedback("amount", "credits_removed", amount_to_remove)
log_econ("[amount_to_remove] credits were removed from [src] owned by [src.registered_name]")
return
return CLICK_ACTION_SUCCESS
else
var/difference = amount_to_remove - registered_account.account_balance
registered_account.bank_card_talk(span_warning("ERROR: The linked account requires [difference] more credit\s to perform that withdrawal."), TRUE)
return CLICK_ACTION_BLOCKING
/obj/item/card/id/alt_click_secondary(mob/user)
. = ..()
@@ -923,8 +924,9 @@
department_name = ACCOUNT_CAR_NAME
icon_state = "car_budget" //saving up for a new tesla
/obj/item/card/id/departmental_budget/AltClick(mob/living/user)
/obj/item/card/id/departmental_budget/click_alt(mob/living/user)
registered_account.bank_card_talk(span_warning("Withdrawing is not compatible with this card design."), TRUE) //prevents the vault bank machine being useless and putting money from the budget to your card to go over personal crates
return CLICK_ACTION_BLOCKING
/obj/item/card/id/advanced
name = "identification card"
@@ -1236,11 +1236,10 @@
suction = !suction
to_chat(user, span_notice("You [suction ? "enable" : "disable"] the board's suction function."))
/obj/item/circuitboard/machine/dish_drive/AltClick(mob/living/user)
if(!user.Adjacent(src))
return
/obj/item/circuitboard/machine/dish_drive/click_alt(mob/living/user)
transmit = !transmit
to_chat(user, span_notice("You [transmit ? "enable" : "disable"] the board's automatic disposal transmission."))
return CLICK_ACTION_SUCCESS
/obj/item/circuitboard/machine/gibber
name = "Gibber"

Some files were not shown because too many files have changed in this diff Show More