mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-20 11:40:07 +01:00
commit cb550ab79badae3ffd493dcee24d96f7ad146ed6 Merge: 732416f01d82fac5d45a6Author: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Mon Apr 14 14:40:04 2025 -0400 Merge branch 'master' into upstream-25-04a commit2fac5d45a6Author: Arturlang <24881678+Arturlang@users.noreply.github.com> Date: Mon Apr 14 01:11:47 2025 +0100 bring back heretic mute ghoul maxhp to 135 HP (#3464) ## About The Pull Request bring back heretic mute ghoul maxhp to 135 HP, these are the changes made in https://github.com/Bubberstation/Bubberstation/pull/2972 ## Why It's Good For The Game otherwise flesh heretic is really sad ## Proof Of Testing numbers change, no need ## Changelog no cl --------- Co-authored-by: Roxy <75404941+TealSeer@users.noreply.github.com> commite9c4522c27Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Mon Apr 14 01:59:19 2025 +0200 Automatic changelog for PR #3453 [ci skip] commit2d595eba4fAuthor: shellspeed1 <46614774+shellspeed1@users.noreply.github.com> Date: Sun Apr 13 16:58:54 2025 -0700 Fixes bitrunning sim having cybersun comms and also makes sure persistence borgs have correct key (#3453) ## About The Pull Request What it says on the tin ## Why It's Good For The Game Its best to not let bitrunners ghost spawns talk on comms ## Proof Of Testing I just did my last cpa today, I'll test this later. Besides its 3 lines with just an item swaped. <details> <summary>Screenshots/Videos</summary> </details> ## Changelog 🆑 fix: Bitrunning sims no longer have comms access fix: Borgs given the persistence access upgrade no longer default to interdyne and get cybersun comms instead /🆑 Co-authored-by: Roxy <75404941+TealSeer@users.noreply.github.com> commit394e8d64d4Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sun Apr 13 23:24:50 2025 +0000 Bubberstation automatic changelog compile [ci skip] commit49141446bfAuthor: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Mon Apr 14 00:18:15 2025 +0200 Automatic changelog for PR #3497 [ci skip] commit0332c060a8Author: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Sun Apr 13 18:17:52 2025 -0400 Xenoarch Machine QOL (#3497) <!-- Write **BELOW** The Headers and **ABOVE** The comments else it may not be viewable. --> <!-- You can view Contributing.MD for a detailed description of the pull request process. --> ## About The Pull Request A little treat for xenoarch - The xenoarch bag can now hold broken items and useless relics in addition to strange rocks - You can use the bag on both the researcher and the recoverer to dump the contents in - The digger and the researcher make a sound now ## Why It's Good For The Game A bag that holds only one type of item is annoying, you get a lot of the other two items too ## Proof Of Testing <!-- Compile and run your code locally. Make sure it works. This is the place to show off your changes! We are not responsible for testing your features. --> <details> <summary>Screenshots/Videos</summary>  </details> ## Changelog <!-- If your PR modifies aspects of the game that can be concretely observed by players or admins you should add a changelog. If your change does NOT meet this description, remove this section. Be sure to properly mark your PRs to prevent unnecessary GBP loss. You can read up on GBP and its effects on PRs in the tgstation guides for contributors. Please note that maintainers freely reserve the right to remove and add tags should they deem it appropriate. You can attempt to finagle the system all you want, but it's best to shoot for clear communication right off the bat. --> 🆑 qol: the xenoarch bag can now hold broken items and useless relics qol: you can use the bag on the researcher and the recoverer to dump items in sound: the digger and researcher now make a sound when they complete a cycle /🆑 <!-- Both 🆑's are required for the changelog to work! You can put your name to the right of the first 🆑 if you want to overwrite your GitHub username as author ingame. --> <!-- You can use multiple of the same prefix (they're only used for the icon ingame) and delete the unneeded ones. Despite some of the tags, changelogs should generally represent how a player might be affected by the changes rather than a summary of the PR's contents. --> <!-- By opening a pull request. You have read and understood the repository rules located on the main README.md on this project. --> commit2b8c074406Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sun Apr 13 19:47:30 2025 +0200 Automatic changelog for PR #3498 [ci skip] commite613940adaAuthor: nevimer <77420409+nevimer@users.noreply.github.com> Date: Sun Apr 13 13:47:04 2025 -0400 restores RCD vending, moves RCD's to lockers (#3498) ## About The Pull Request moves RCD's from engineers backpacks to their lockers roundstart - to accommodate the stowaway change aswell as keep a tab on infinite station resources. ## Why It's Good For The Game Above point ## Proof Of Testing <details> <summary>Screenshots/Videos</summary> </details> ## Changelog 🆑 balance: reenabled the RCD vendors and moved RCD's from spawning in backpacks to lockers. /🆑 commit 732416f01d8ccc6e082cbdbeb60b30c461d8e965 Author: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Sun Apr 13 03:03:20 2025 -0400 these use GMM prices and thus fluctuate commit 99f097d67faf17569711d670d5891103d96932b1 Merge: 790b64602cd945479a622Author: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Sun Apr 13 02:12:01 2025 -0400 Merge branch 'master' into upstream-25-04a commit945479a622Author: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Sun Apr 13 00:59:23 2025 -0400 Fix hot spring runtime related to duplicate elements (#90555) If something is mapped to spawn in on a hot spring tile, the tile will add the immerse element in `/turf/open/water/Entered` before `Initialize` runs, and when it does there's no check if the element has already been added, unlike other spots where the immerse element is added. This fixes that by adding a check on the call in `Initialize`. commit3472fddc11Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun Apr 13 04:16:19 2025 +0000 Automatic TGS DMAPI Update (#2743) This pull request updates the TGS DMAPI to the latest version. Please note any changes that may be breaking or unimplemented in your codebase by checking what changes are in the definitions file: code/__DEFINES/tgs.dm before merging. Full changelog can be found [here](https://raw.githubusercontent.com/tgstation/tgstation-server/gh-pages/changelog.yml). - Added compatibility with SpacemanDMM's `redefined_proc` lint. (#2058 Cyberboss) #tgs-dmapi-release Co-authored-by: tgstation-ci[bot] <179393467+tgstation-ci[bot]@users.noreply.github.com> commite5630753aeAuthor: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sun Apr 13 05:53:13 2025 +0200 Automatic changelog for PR #3481 [ci skip] commitac3fea9660Author: chestlet <98193039+chestlet@users.noreply.github.com> Date: Sat Apr 12 20:52:34 2025 -0700 Nova Port: RB-MK2 GUI Rework (#5136) (#3481) ## About The Pull Request A significant [rework of the RB-MK2 GUI](https://github.com/NovaSector/NovaSector/pull/5136) that I did over on Nova. The one you guys have now is painful to use in comparison so let's get it up to snuff. ## Why It's Good For The Game More information makes the RB-MK2 easier to use and teach in character. With how the GUI is currently, it gives no intuitive explanation for what it's doing. You can't tell what's going on with it. ## Proof Of Testing <details> <summary>Screenshots/Videos</summary> https://github.com/user-attachments/assets/7a178ac2-df8e-40d3-a6f3-b6aa617b69fd </details> ## Changelog 🆑 Chestlet admin: Improved RB-MK2 logging so admins have a full trace of exactly what happened with it. fix: Corrected 'tritium usage' math in the RB-MK2. code: We've noticed that the Radioscopical Bluespace Reactor Mark Two blueprints provided to our stations came with antiquated firmware. This issue has been rectified. (Significant rework of the RB-MK2 GUI) /🆑 commit071fcd84a8Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sun Apr 13 05:48:58 2025 +0200 Automatic changelog for PR #3495 [ci skip] commit0a5f60a36cAuthor: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Sat Apr 12 23:48:24 2025 -0400 Xenoarch machines cleanup (#3495) ## About The Pull Request Clean up the code for xenoarch machines some because it made me sad. - Changes `attackby`'s to `item_interaction` - Keep a list of xenoarch items in contents instead of storing them in **an instance of `/obj/item` (yes the abstract concept of an item)** - Add context tips for all item interactions and removes that info from examine text - Switched a list to `static` - Add assoc list of `broken_item` types to reward pools instead of having a nightmare ladder of `istype` checks ## Why It's Good For The Game Fixes #3442 ## Proof Of Testing Scout's honor ## Changelog 🆑 qol: xenoarch machines have context tooltips now fix: fixed xenoarch diggers not working /🆑 commit16f02c756bAuthor: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sun Apr 13 05:34:54 2025 +0200 Automatic changelog for PR #3441 [ci skip] commitede9fc1646Author: Bombermansam <Bombermansam@yahoo.com> Date: Sat Apr 12 23:34:09 2025 -0400 [Modular] Adds crowbars to standard borg models that do not have them (#3441) ## About The Pull Request Adds crowbars to standard borg models that do not have them. ## Why It's Good For The Game This is a QOL addition, it should not affect balance. Half the borg models in the game do not have crowbars and can get stuck behind doors if the power fails which is no fun for anyone. This fixes it. ## Proof Of Testing It compiles and was tested locally. <details> <summary> Screenshots </summary>     </details> ## Changelog 🆑 add: Adds Crowbars to Service, Medical, Clown, Sec and Peacekeeper borgs /🆑 commit8e4d6f7052Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sun Apr 13 05:32:18 2025 +0200 Automatic changelog for PR #3491 [ci skip] commit0cdf875cecAuthor: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sun Apr 13 03:32:09 2025 +0000 Bubberstation automatic changelog compile [ci skip] commitc6f88a026eAuthor: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Sat Apr 12 23:31:16 2025 -0400 Fix HEV armor not fully initializing (#3491) ## About The Pull Request `ADD_TRAIT`/`REMOVE_TRAIT` don't take lists you need to use a proc for that ## Why It's Good For The Game Fixes #3484 ## Proof Of Testing <details> <summary>Screenshots/Videos</summary>  </details> ## Changelog 🆑 fix: fixed HEV suit not turning on properly /🆑 commitf93466e6abAuthor: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sun Apr 13 05:18:39 2025 +0200 Automatic changelog for PR #3486 [ci skip] commit952a110077Author: ariaworld <143797359+ariaworld@users.noreply.github.com> Date: Sun Apr 13 05:18:04 2025 +0200 [FIX?] - Brings robotic brain surgery in line with organic brain sugery/lobotomy after the recent update (#3486) ## About The Pull Request As title! ## Why It's Good For The Game I originally opened this as an issue because I wasn't sure if this was intended, it's why I labeled it as [FIX?] Currently organic brain surgery heals the previous tiers of traumas as well which makes sure there's no leftover traumas left and also removes the RNG re-roll, applying a status effect instead. This PR brings the robotic surgery/lobotomy in line with the organic one in a few ways: 1. Robotic blessed lobotomy now requires holy water as well (just like organic) 2. Fix posibrain surgery now cures TRAUMA_RESILIENCE_SURGERY traumas as well 3. Reticulate splines surgery now cures TRAUMA_RESILIENCE_SURGERY and TRAUMA_RESILIENCE_LOBOTOMY traumas as well 4. Replaced RNG prob(75) roll with the 15-minute status effect that was added to organic brain surgery. This should balance/fix the robotic brain surgery to the recent change that was done to the organic brain surgery. Only issue is the fact how the original surgery was coded: there was no RNG roll for fix posibrain surgery, while the normal organic surgery did. Please feel free to close this PR if this was an intended feature/there are issues with potential balance arguments. ## Proof Of Testing <details> <summary>Screenshots/Videos</summary> (It compiles, very simple code just handles surgery steps) </details> ## Changelog 🆑 Goku balance: Robotic blessed lobotomy now also requires holy water (just like the organic surgery) balance: Robotic blessed lobotomy requires liquid solder instead of Palladium Synthate Catalyst fix: Fix posibrain surgery now also cures surgery-tier brain traumas balance: Reticulate splines surgery now also cures lower tier brain traumas (surgery and lobotomy) balance: Replaced advanced robotic brain surgery RNG roll with the 15-minute vulnerability status effect that was added to organic brain surgery /🆑 --------- Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com> commit 790b64602cd2e59b8397c4fe2451d2c14bddb546 Merge: 7d39bddbcb25e1b40cf89Author: lessthanthree <83487515+lessthnthree@users.noreply.github.com> Date: Sat Apr 12 20:13:11 2025 -0700 Merge branch 'master' into upstream-25-04a commit5e1b40cf89Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sun Apr 13 05:08:22 2025 +0200 Automatic changelog for PR #3492 [ci skip] commit5e94554873Author: ariaworld <143797359+ariaworld@users.noreply.github.com> Date: Sun Apr 13 05:07:55 2025 +0200 [FIX] Fixes Wooden shelves turning into metal racks when broken. (#3492) ## About The Pull Request Title! ## Why It's Good For The Game Bugfix, my immersion was ruined ## Proof Of Testing <details> <summary>Screenshots/Videos</summary>  </details> ## Changelog :cl:Goku fix: Fix wooden shelves turning into metal rack parts when broken. /🆑 commit7fed3cb7e4Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sun Apr 13 05:07:00 2025 +0200 Automatic changelog for PR #3493 [ci skip] commit2d38b200a0Author: LT3 <83487515+lessthnthree@users.noreply.github.com> Date: Sat Apr 12 20:06:37 2025 -0700 Allow hypospray in medical pouch (#3493) ## About The Pull Request Adds hypospray and cable to the allowed list of items in the medical pouch ## Why It's Good For The Game Commonly held items, other reagent containers are accepted but hypo is missing. ## Changelog 🆑 LT3 qol: The medical pouch can now hold hyposprays and cable coil /🆑 commit 7d39bddbcb2e775207a4a3e72a3940f9fbf3b0f1 Merge: fde55e27444 bb642474217 Author: lessthanthree <83487515+lessthnthree@users.noreply.github.com> Date: Sat Apr 12 17:25:22 2025 -0700 Merge branch 'upstream-25-04a' of https://github.com/Bubberstation/Bubberstation into upstream-25-04a commit fde55e2744421b10f115724f70f3db8339b13df0 Author: lessthanthree <83487515+lessthnthree@users.noreply.github.com> Date: Sat Apr 12 17:25:20 2025 -0700 screenshots commitcfa0c20656Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sun Apr 13 01:39:06 2025 +0200 Automatic changelog for PR #3478 [ci skip] commit0397536620Author: CatoChristopherMrow <johnmaddentickeledmyrear@gmail.com> Date: Sat Apr 12 19:38:42 2025 -0400 Makes tackle gloves reskinnable (#3478) ## About The Pull Request Makes tackle gloves reskinnable to their blue, red, and black variants. ## Why It's Good For The Game Stops basic sec gear forcing you to either wear clashing colors or not get the benefit of standard equipment. Viva la matching colors. ## Proof Of Testing Works on my machine <details> <summary>Screenshots/Videos</summary> </details> ## Changelog 🆑 UvvU add: Tackle gloves are now reskinnable. /🆑 --------- Co-authored-by: Ian Yanik <Iwantpornspam@gmail.com> commit42b725836aAuthor: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sat Apr 12 23:24:45 2025 +0000 Bubberstation automatic changelog compile [ci skip] commit bb642474217244fd233372d9c68cb4bab5f871f7 Merge: 72beef087eac872e81588Author: LT3 <83487515+lessthnthree@users.noreply.github.com> Date: Sat Apr 12 16:10:29 2025 -0700 Merge branch 'master' into upstream-25-04a commit 72beef087ea8a1b291e286b09a0eb5a6713ba255 Author: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Sat Apr 12 15:26:15 2025 -0400 this now returns an icon path not an icon object commit 4e85c985ee77a37b44dcef393b815a04421463b7 Author: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Sat Apr 12 15:08:12 2025 -0400 broken dmi commitc872e81588Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sat Apr 12 07:45:40 2025 +0200 Automatic changelog for PR #3490 [ci skip] commit27801b991cAuthor: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Sat Apr 12 01:45:17 2025 -0400 Fix admin chat buttons to cancel/refund storyteller events not working (#3490) ## About The Pull Request The chat messages that get sent when a storyteller event is about to run try to call `Topic` on the scheduled event datum but there isn't actually a `Topic` proc defined for them ## Why It's Good For The Game It's mean to trick admins with fake buttons ## Proof Of Testing <details> <summary>Screenshots/Videos</summary>  </details> ## Changelog 🆑 admin: the cancel and refund buttons in storyteller event notifications will actually do something now /🆑 commit bb14605128db2b1b5390d60b28665ed0ceae154a Author: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Sat Apr 12 01:06:39 2025 -0400 im tired commit 1245d5145e4f41d63dbe983355ef4619b6441655 Author: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Sat Apr 12 00:40:09 2025 -0400 what if the world was made of pudding commit 7011b910d3bfaa0dba4a3d118721ad1d42a7625c Merge: b8c00cbd266e9ede320c9Author: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Sat Apr 12 00:31:56 2025 -0400 Merge branch 'master' into upstream-25-04a commit b8c00cbd2660017d578f07ce20c3732dcfcdb60f Author: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Sat Apr 12 00:31:01 2025 -0400 silence linters commit 3a3ea510ed12812fba0d97f545bf87749c16831a Author: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Sat Apr 12 00:00:12 2025 -0400 the economy is in shambles commit 0a3e17e897b270dc19a63038b8e99e15ff9242ce Author: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Fri Apr 11 23:43:06 2025 -0400 missing icons commit fefc1348f722cf26bb407e6f7a5ba98184867fba Author: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Fri Apr 11 23:24:46 2025 -0400 no override for this commit 952f2a7502d972093e1f86bd9fa20bf3ea9788bf Author: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Fri Apr 11 23:16:07 2025 -0400 shotgun icon states commit 8e256d21c2bdfd2136f60705a3b5f7600ca6c9e7 Author: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Fri Apr 11 23:02:28 2025 -0400 no icon commit 60164e1a4c038661d41bbb25a1e0e536147455a2 Author: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Fri Apr 11 22:39:35 2025 -0400 fucking capital letters? commit 1e395535db671e61ce6514c35928a900d61a3570 Author: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Fri Apr 11 22:28:06 2025 -0400 GRRRRRR commit 68e35b0068388eb94d1c9ec5b865787b1cdc300a Author: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Fri Apr 11 21:19:15 2025 -0400 wrong commit 9f8c9499f2890fad3c479d42c12888b1e0c55a3a Author: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Fri Apr 11 20:59:17 2025 -0400 just put your icons anywhere who gives a shit commit f6bc1091867a3b234f2634e8cb120eae5b0053d9 Author: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Fri Apr 11 19:58:40 2025 -0400 buh commit edc876bff750ddce0593e917f5a68de02383c55e Author: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Fri Apr 11 19:49:32 2025 -0400 added our GAGS configs to deploy commite9ede320c9Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Fri Apr 11 23:23:21 2025 +0000 Bubberstation automatic changelog compile [ci skip] commit c726e4ee2d231d48334d43b8ce42d8b4e70b52b0 Author: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Fri Apr 11 18:50:04 2025 -0400 fixed recipe foodtypes commit 9e23291b14371e4703a38ae1711b1fe5b75cbf37 Author: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Fri Apr 11 18:24:53 2025 -0400 Fix changelogs commit bb8477826614c6e81285c5586de07ee26686c6b1 Author: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Fri Apr 11 17:59:23 2025 -0400 number of args changed for inject commitf00ed38c1dAuthor: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Fri Apr 11 11:03:02 2025 +0200 Automatic changelog for PR #3456 [ci skip] commit29b3c8dabaAuthor: aKromatopzia <94389683+aKromatopzia@users.noreply.github.com> Date: Fri Apr 11 17:02:38 2025 +0800 Smolraptor Updates (#3456) ## About The Pull Request Adds blue and red sec smolraptors, makes janitor an alt of service  ## Proof Of Testing it works ## Changelog 🆑 add: sec smolraptors image: fixes some errors in smolraptors /🆑 commit7c0978a47fAuthor: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Fri Apr 11 08:21:22 2025 +0200 Automatic changelog for PR #3463 [ci skip] commit04fd2b0a8aAuthor: ArrisFairburne <arrisfairburne@gmail.com> Date: Fri Apr 11 02:20:59 2025 -0400 Synth brain PDAs now have departmental PDA apps pre-installed (#3463) ## About The Pull Request Synth brains now start with your department's apps pre-installed. For example, Scientist synths now start with NT Science Hub. They also now have double the storage space compared to the basic PDA. ## Why It's Good For The Game Convenience. Also, synth PDAs have sort of existed in a weird limbo where (at least, from my point of view having talked to some others) most synth players just don't actually use one of the defining features of their race because normal PDAs are largely better and more convenient, hopefully this change emphasizes their abilities. The doubled brain storage space is just so that synth brain PDAs can comfortably house whatever programs come with being a dept. head. Balance wise, I doubt it will affect anything (what could you even do with the extra storage space, short of the dept. head apps? basic crew apps fit comfortably on the basic PDA limit, synths can't be emagged for expensive syndie apps, and synths can't store files on their brain via disks). ## Proof Of Testing (image taken after I spawned as RD; this is the synth brain PDA)  ## Changelog 🆑 qol: Synthetic crew now spawn in with PDA apps relevant to their work station. bal: Synthetic crew brain PDAs now have 128 max capacity points (was previously 64) /🆑 commiteaa6352affAuthor: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Fri Apr 11 08:20:28 2025 +0200 Automatic changelog for PR #3471 [ci skip] commit02f3cfdb00Author: ariaworld <143797359+ariaworld@users.noreply.github.com> Date: Fri Apr 11 08:20:05 2025 +0200 [MAPPING]: Change Kilo Station dorms area type from Locker to Dorms. (#3471) ## About The Pull Request Makes sure Kilo Station's dorms area actually is a Dorms area. ## Why It's Good For The Game Other stations' dorms are inside actual Dorms areas, effectively granting protection from events like sudden brain trauma/heart attack, but Kilo Station didn't have this, they were classified as lockers instead. ## Proof Of Testing <details> <summary>Screenshots/Videos</summary>  </details> ## Changelog :cl:Goku map: Kilo Station's Dormitories area type is now classified as dormitories, not as a Locker room. /🆑 commit5266275bc4Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Fri Apr 11 07:03:33 2025 +0200 Automatic changelog for PR #3485 [ci skip] commit0a38cf2824Author: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Fri Apr 11 01:03:07 2025 -0400 Fix examine menu character preview being tiny (#3485) ## About The Pull Request Upstream fixed the tiny character preview but it requires a little tweak on implementations ## Why It's Good For The Game I can't see the blorbo ## Proof Of Testing <details> <summary>Screenshots/Videos</summary>  </details> ## Changelog 🆑 fix: fixed character preview in the examine window being tiny /🆑 commit3fc7296b82Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Fri Apr 11 06:23:15 2025 +0200 Automatic changelog for PR #3483 [ci skip] commit1d52e91fd0Author: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Fri Apr 11 00:22:51 2025 -0400 Fix double box on vote results chat message (#3483) ## About The Pull Request There's a redundant override in `vote.dm` to enclose the vote results in a purple examine box, this is the default way votes are displayed now so it's making vote results appear as a box within a box ## Why It's Good For The Game Looks wrong ## Proof Of Testing <details> <summary>Screenshots/Videos</summary> Before:  After:  </details> ## Changelog 🆑 fix: fixed vote results in chat having an extra box around them /🆑 commitab74044fc6Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Fri Apr 11 06:20:31 2025 +0200 Automatic changelog for PR #3363 [ci skip] commitcb06f207d3Author: Kepteyn <94123167+Kepteyn@users.noreply.github.com> Date: Fri Apr 11 05:20:07 2025 +0100 Just a couple more hotel rooms (#3363) ## About The Pull Request This adds four (and a half) new infinidorm hotel rooms -- A bar themed one, for when you want bar RP that's less public; a nightclub themed one; an space themed one for the spaceophilliacs who want to bang in space (or an airlock), and finally an oasis themed one, with a day and a night version. It also fixes the lights in the Library room, given we're no longer downstreaming from Skyrat, and it adds a template dmm that should make it easier for people to add new rooms should they wish - the plaque on the floor represents the spawn point. ## Why It's Good For The Game This adds even more variety to the infinidorm room options for people to roleplay in as a ghost. Or to _roleplay_ in. The bar one in particular provides an option for people who want to do a bar RP with some friends without getting pesky interruptions from their fellow human beings who feel the need to start a gunfight in the bar. ## Proof Of Testing All the new hotel rooms and the library have been tested in game, and are working quite nicely! The template map does not show up as an option in-game, as it exists to help mappers. ## Screenshots <details> <summary>Foxbar</summary>  </details> <details> <summary>Nightclub</summary>  </details> <details> <summary>EVA</summary>  _The floor is, infact, fake space, and is surrounded by a fake-space wall. You will survive nude in space here. Spacesuits still provided._ </details> <details> <summary>Oasis</summary>  _Only one is shown for brevity's sake, as the only difference between day and night versions is the strength of the external lighting_ </details> <details> <summary>Template</summary>  _The template room. The bluespace border must be indestructible solid in some form, while the dark grey flooring represents the wall's location on the defautl Hilbert room. The door is located where the default door is on it, and the plaque on the ground shows where the player will spawn_ </details> ## Changelog 🆑 add: Added infinidorms: Fox Bar; The Nightclub; EVA; and Oasis (day and night versions) add: Added a mapping template for creating new infinidorms at modular_skyrat\modules\hotel_rooms fix: modified the lights of the Library infinidorm so it's not so damn dark. /🆑 commit700856e3c5Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Thu Apr 10 23:25:40 2025 +0000 Bubberstation automatic changelog compile [ci skip] commit02353b9ec2Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Fri Apr 11 01:05:38 2025 +0200 Automatic changelog for PR #3475 [ci skip] commitf1722bb1c6Author: LT3 <83487515+lessthnthree@users.noreply.github.com> Date: Thu Apr 10 16:05:12 2025 -0700 Disable lean reset on direction change (#3475) ## About The Pull Request Edits TG's lean component to perform the same as the pixel shift component ## Why It's Good For The Game Consistent shifting movement ## Changelog 🆑 LT3 qol: Leaning no longer resets with directional change /🆑 commit 4a5c80e1813ecaf7d26ddeabf2593d2b44c86dcb Merge: b908b32d387ada9345244Author: Majkl-J <49160555+Majkl-J@users.noreply.github.com> Date: Thu Apr 10 10:46:20 2025 -0700 Merge branch 'master' of https://github.com/Bubberstation/Bubberstation into upstream-25-04a commitada9345244Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Thu Apr 10 19:16:21 2025 +0200 Automatic changelog for PR #2896 [ci skip] commit472893ae5eAuthor: Manatee <74586965+MajManatee@users.noreply.github.com> Date: Thu Apr 10 12:15:56 2025 -0500 Tarkon Tweaks and Xeno Changes (#2896) ## About The Pull Request Update as of 01/26 So that was a lie Anyways I completely remade tarkon, which is what I ORIGNIALLY wanted to do, but used a lot of the pre-existing tarkon assets to do so, to maintain the same feel. Some NEW NEW features (as the project grew in scope) include: Med/RND/Engineering are now separate "Islands" like charlie (tarkon was always meant to be like that anyhow Each one has a few xenos, and a new "Emergency power generator" Scanning this with the new (not a ripoff) Hack-C tool will call in a repair drone (Original content) to repair it, and it needs to be defended from the xenos it alerts. Sucsesfully completing a defence will reward sickass weapons and gear you wouldn't normally ever get to see, making further areas easier, and a key for the final area. Once all 3 keys are obtained, and the areas are re-secured, you can go to the boss area and clear out the AI sat / command zone. A bitrunning server to allow them to make their own bitden (it's the first prototype, and the rest must be researched so it's not shift-start) more floor safes with various things like some ore thumpers and two bluespace beakers Crates! Someone misfiled a crate of goodies and it got sent here! These orders should be delivered to their owners! I'm sure they would appreciate it! Probably... A Recycler (Amazing) A produce order console! Now you can actually cook whatever you want! And it gives you a reason to sell stuff for money! more stuff, lots more stuff. things keep getting added the longer it takes for this to be looked at. Also adds three new variants of xenobio, and two new variants of the cargo bay. One cult (we miss you cult), one carp, and a monkey themed xenobio. ## Why It's Good For The Game Part 1 of my attempt to make tarkon feel better to play. The overall gameplay was very "Meta" and didn't really give you any reason to clear out xenos or the threats. Who knows what might come next. Tarkon was pretty stale. A bit of new stuff might be nice. plus a reason to use their shuttle is good. Furthermore, tarkon WILL run on solar, so if you REALLY don't want to, you don't HAVE to go and clear everything out. ## Proof Of Testing <details> <summary>Screenshots/Videos</summary>           I did test it, and run the wave defense, it DOES work. </details> ## Changelog 🆑 add: BUNCH of new tarkon things! map: Tarkon QOL changes /🆑 --------- Co-authored-by: Waterpig <49160555+Majkl-J@users.noreply.github.com> Co-authored-by: Arturlang <24881678+Arturlang@users.noreply.github.com> commit b908b32d387ffe9a2b40d2d25a03cd04c2e62868 Author: Majkl-J <49160555+Majkl-J@users.noreply.github.com> Date: Thu Apr 10 08:35:37 2025 -0700 Compiletimes done commit a9601004a82714a72f62e9b5db07d2adde27c0c3 Author: Majkl-J <49160555+Majkl-J@users.noreply.github.com> Date: Thu Apr 10 08:35:26 2025 -0700 We are so comically stupid commit0f8d37991fAuthor: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Thu Apr 10 00:05:02 2025 +0000 Bubberstation automatic changelog compile [ci skip] commit31897a95e9Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Thu Apr 10 01:54:47 2025 +0200 Automatic changelog for PR #3468 [ci skip] commit385b734424Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Thu Apr 10 01:54:32 2025 +0200 Automatic changelog for PR #3470 [ci skip] commit0903ee683eAuthor: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Wed Apr 9 19:54:20 2025 -0400 Fix shuttles no longer making sounds or (un)bolting doors (#3468) ## About The Pull Request The code for these things got lost in an upstream because shuttle code got split into multiple files ## Why It's Good For The Game Fixes #3251 ## Proof Of Testing I tested it and the shuttle went bwwwwrrmmmmm pshewww and the door bolts went chk ## Changelog 🆑 fix: fixed shuttles missing landing/take off engine sounds fix: fixed shuttles not bolting/unbolting their doors when moving /🆑 commite5b57bc08cAuthor: LT3 <83487515+lessthnthree@users.noreply.github.com> Date: Wed Apr 9 16:54:09 2025 -0700 Fix meow emote for cat tongues (#3470) ## About The Pull Request Fixes the meow emote to use the correct emote if you have a cat tongue ## Why It's Good For The Game MEOW. ## Changelog 🆑 LT3 fix: Mobs with cat tongue get their alternate meow sound back /🆑 commit204ea57363Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Wed Apr 9 23:23:16 2025 +0000 Bubberstation automatic changelog compile [ci skip] commit ce5944e0733f4c5985e2e48878a02c0c35463d0a Author: Majkl-J <49160555+Majkl-J@users.noreply.github.com> Date: Wed Apr 9 08:19:09 2025 -0700 6 compiletime errors left commitd1905c44f5Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Wed Apr 9 14:03:13 2025 +0200 Automatic changelog for PR #3461 [ci skip] commit6c3bc53604Author: Odairu <39929315+Odairu@users.noreply.github.com> Date: Wed Apr 9 08:02:51 2025 -0400 Deathmatch now stores and reapplies your respawn timer prior to being spawned (#3461) ## About The Pull Request Title ## Why It's Good For The Game item number TWO on the list ## Proof Of Testing  <details> <summary>Screenshots/Videos</summary> </details> ## Changelog 🆑 code: deathmatch doesn't reset your respawn timer /🆑 commit f890cb36b9265f011a187b4f332812590838292c Author: Majkl-J <49160555+Majkl-J@users.noreply.github.com> Date: Wed Apr 9 01:45:20 2025 -0700 some color stuff commit fb849a2a8ebc2166915cfbec1e850510678b2f22 Author: Majkl-J <49160555+Majkl-J@users.noreply.github.com> Date: Wed Apr 9 01:38:18 2025 -0700 Fixes commit 381d77fa68707cc5315b698474df026c2103166c Author: Majkl-J <49160555+Majkl-J@users.noreply.github.com> Date: Wed Apr 9 01:20:20 2025 -0700 We love guncode and refactors!!!! commit f30bb6ca01319218795e4004219938aa3d976eb3 Author: Majkl-J <49160555+Majkl-J@users.noreply.github.com> Date: Wed Apr 9 01:00:40 2025 -0700 I love cherry picking!!! commit 6677a4c7bbe3c7536276178c841290a489d0a4a9 Author: Majkl-J <49160555+Majkl-J@users.noreply.github.com> Date: Wed Apr 9 01:00:27 2025 -0700 so apparently some dumbass on nova reused the turret flag bitfield and it only now runtimes commit 7acc721baadbdea3d3795a45b9837cfeb4fd4fd0 Author: Majkl-J <49160555+Majkl-J@users.noreply.github.com> Date: Wed Apr 9 00:58:48 2025 -0700 Martials and arcade rework updates commit bf9f393204fe7d40d5e57e76db870eb1a32aed25 Author: Majkl-J <49160555+Majkl-J@users.noreply.github.com> Date: Wed Apr 9 00:47:58 2025 -0700 This might break taur icons, remember to test once we compile commit 3bc256cb16ca2e85b78830345bba0a487f49fc17 Author: Majkl-J <49160555+Majkl-J@users.noreply.github.com> Date: Wed Apr 9 00:41:03 2025 -0700 Several varchanges from tg commit76f5dc1b5fAuthor: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Tue Apr 8 23:23:40 2025 +0000 Bubberstation automatic changelog compile [ci skip] commit 538049c4cd4960d2c81c43f2e387896049fb02c7 Author: Waterpig <wtryoutube@seznam.cz> Date: Tue Apr 8 20:00:59 2025 +0200 reagent applicators fixes commit df43e50d68419d2f24bd62eef0432bda8394cc7d Author: Waterpig <wtryoutube@seznam.cz> Date: Tue Apr 8 19:56:27 2025 +0200 Some missed merge fixes commit0f0838bb35Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Tue Apr 8 09:27:36 2025 +0200 Automatic changelog for PR #3399 [ci skip] commit234a410586Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Tue Apr 8 09:27:29 2025 +0200 Automatic changelog for PR #3397 [ci skip] commit722b51eb07Author: Iamgoofball <iamgoofball@gmail.com> Date: Tue Apr 8 02:27:12 2025 -0500 [MODULAR] Removes the 60 round Sol drum from being printable in Security (#3399) ## About The Pull Request Removes the 60 round Sol drum from being printable in Security ## Why It's Good For The Game After discussing magazine size standardization, this came up and to be 100% honest, the crew does not need LMG ammo capacity on any of their guns. Even though it's illegal contraband to use(yes, Illegal Tech is still fuckin' Illegal lol), it's still a lot of ammo capacity that we don't really want the crew to have. ## Proof Of Testing Just deleting a research design. ## Changelog 🆑 del: Removes the 60 round Sol drum from being printable in Security /🆑 --------- Co-authored-by: The Sharkening <95130227+StrangeWeirdKitten@users.noreply.github.com> commit3e7223b959Author: Iamgoofball <iamgoofball@gmail.com> Date: Tue Apr 8 02:27:06 2025 -0500 [MODULAR] Puts the Sol/Carwo/Romulus/Szot/Trappiste gun magazine sizes in line with /tg/ standards (tiny for everything but rifles which are normal) (#3397) ## About The Pull Request Puts the Sol/Carwo/Romulus/Szot/Trappiste gun magazine sizes in line with /tg/ standards (tiny for everything but rifles which are normal) ## Why It's Good For The Game Size inconsistencies between items results in confused players; it's good to keep this sort of thing synced up so that we're not having players ask why one pistol magazine fits in a box while another pistol magazine doesn't fit in a box when the air tank that's bigger than both of them does fit in the box. If I find other guns with weird weight classes I'll fix those too. ## Proof Of Testing Single-line changes, weight classes is a proven working system already. ## Changelog 🆑 qol: Puts the Sol/Carwo/Romulus/Szot/Trappiste gun magazine weight classes in line with /tg/ standards for magazine weight classes (tiny for everything but rifles or larger which are normal) /🆑 commit7b420bb680Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Mon Apr 7 22:16:23 2025 +0000 Bubberstation automatic changelog compile [ci skip] commitf30b0d5df0Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Tue Apr 8 00:12:44 2025 +0200 Automatic changelog for PR #3452 [ci skip] commitaa4901b571Author: LT3 <83487515+lessthnthree@users.noreply.github.com> Date: Mon Apr 7 15:11:59 2025 -0700 Map vote is called automatically on blob/nukies/etc. round end (#3452) ## About The Pull Request Triggers the automatic map vote when the round is about to end due to a station threat, if it hasn't happened. ## Why It's Good For The Game Saves it delaying the next round if no admin catches it in time, causing a delay as the vote and another restart needs to occur. ## Changelog 🆑 LT3 admin: Map vote is automatically triggered near the conclusion of station ending threats fix: Only a single announcement is sent when the shuttle is called, fixing the overlapping sounds /🆑 commita6845577bdAuthor: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Mon Apr 7 21:55:15 2025 +0000 Bubberstation automatic changelog compile [ci skip] commitbf8c0ef85fAuthor: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Mon Apr 7 23:49:40 2025 +0200 Automatic changelog for PR #3459 [ci skip] commit28e4e2cd42Author: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Mon Apr 7 17:49:12 2025 -0400 Refactor changelog handling to separate files (#3459) ## About The Pull Request This rewrites how our actions handle changelogs, and rewrites a bunch of the changelog TGUI (in a separate file cause I don't feel like massacring the upstream one). The gist of it is that our actions will now create autochangelog files with bubber in the name, our changelog compile will only compile those autochangelogs (not upstream ones if they happen to be in there), and the compile will be done into separate bubber changelog files in `html/changelogs/bubber_archive`. In game, the UI will pull both archive files (upstream and ours) and combine them in the changelog list, putting the codebase logo next to each change to distinguish which one it's from. ~~NOTE: I'm opening this as a draft because I'm going to try and reset our tg changelogs and then reapply all our historical changelogs into the new bubber archive files, I'm just putting this up now so the code can be reviewed and shit~~ done ## Why It's Good For The Game For players this makes it easier to distinguish where a change came from, and for developers this means we don't need to worry about breaking the changelog when we do an upstream pull, we can completely ignore it and just pull everything, and our tg archive files will be 1:1 with upstream with no shit from us added in. ## Proof Of Testing <details> <summary>Screenshots/Videos</summary>  </details> ## Changelog 🆑 TealSeer, LT3 refactor: refactored how changelogs are generated and displayed /🆑 --------- Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com> commit7de99181dbAuthor: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Mon Apr 7 17:44:07 2025 -0400 Rename Autochangelog (#3462) the refactor is about to merge this isnt gonna be included otherwise commit0ed680f2aaAuthor: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Mon Apr 7 23:36:02 2025 +0200 Automatic changelog for PR #3457 [ci skip] commit0f13b89457Author: Odairu <39929315+Odairu@users.noreply.github.com> Date: Mon Apr 7 17:35:25 2025 -0400 30 minute grace period to respawn (world time, not round time) (#3457) ## About The Pull Request from when the server starts to 30 minutes after, respawning is free of charge ## Why It's Good For The Game item #1 on the list ## Proof Of Testing it works dude trust me <details> <summary>Screenshots/Videos</summary> </details> ## Changelog 🆑 code: respawn enabled until 30 min (world time) /🆑 commit99cb23f3c5Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Mon Apr 7 18:30:45 2025 +0200 Automatic changelog for PR #3434 [ci skip] commit697d89abf3Author: pixelkitty286 <78038207+pixelkitty286@users.noreply.github.com> Date: Mon Apr 7 11:30:19 2025 -0500 Cleans up and reorganizes some of the borg code (#3434) ## About The Pull Request This PR reorganizes and cleans up some of the borg code and separates sprite defines and borg defines once more but this time correctly. Also fixes some small bugs with foot steps with chameleon module. Moved some borg model specific trait procs into their own file. ## Why It's Good For The Game Makes it more organized so we don't have one HUGE file containing all the sprite defines and borg model code ## Proof Of Testing It's all back end. Compile test was last done late march. <details> <summary>Screenshots/Videos</summary> </details> ## Changelog 🆑 fix: chameleon model foot steps code: moved many of the borg defines to their correct _defines file and folder /🆑 commit74985f40fcAuthor: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Mon Apr 7 10:28:15 2025 +0200 Automatic changelog for PR #3447 [ci skip] commitd58cf909afAuthor: Jinshee <96621959+Jinshee@users.noreply.github.com> Date: Mon Apr 7 01:27:49 2025 -0700 Change podperson eye color (Again (Thanks Upstream)) (#3447) commitcb3052e6eaAuthor: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Mon Apr 7 02:04:52 2025 +0200 Automatic changelog for PR #3448 [ci skip] commitc29d36ada5Author: sippykot <sippythekot@outlook.com> Date: Mon Apr 7 02:04:27 2025 +0200 Fish Ass: ports over large shark tails from CHOMP (#3448) ## About The Pull Request see title if you want to see who made the sprites, follow the accreditation chain: https://github.com/CHOMPStation2/CHOMPStation2/pull/9926 it doesn't fully use all the sprites, because our system here is so much clunkier to use - if someone wants they can probably bash out several more tail variants by copying and rearranging the existing sprites ## Why It's Good For The Game people wanted them, gushed over them in #suggestions, and then no one did anything, so... also, 🦈 ## Proof Of Testing yeah i compiled it, they finally showed up in game, thanks #coder-longue ## Changelog 🆑 add: 4 new tail options image: new tail sprites /🆑 --------- Co-authored-by: Roxy <75404941+TealSeer@users.noreply.github.com> commitfa6845f9e6Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sun Apr 6 23:22:10 2025 +0000 Bubberstation automatic changelog compile [ci skip] commit55fd8dd1f7Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Mon Apr 7 01:01:20 2025 +0200 Automatic changelog for PR #3426 [ci skip] commit16f6d07548Author: Odairu <39929315+Odairu@users.noreply.github.com> Date: Sun Apr 6 19:00:55 2025 -0400 Shadekin NV and movespeed rebalance (#3426) ## About The Pull Request title + nerf movespeed in the light ## Why It's Good For The Game still can't see shit (nv trait is 4.5, bumping it up to 15) ## Proof Of Testing it werks <details> <summary>Screenshots/Videos</summary> </details> ## Changelog 🆑 balance: shadekin nv buffed from 4.5/100 to 15/100 balance: shadekin move a bit slower in the light /🆑 commitd2f96730baAuthor: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sun Apr 6 22:16:10 2025 +0000 Bubberstation automatic changelog compile [ci skip] commitc7def946b6Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sun Apr 6 17:39:00 2025 +0200 Automatic changelog for PR #3450 [ci skip] commitf833f3edc4Author: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Sun Apr 6 11:38:26 2025 -0400 Fix persistence medbots speaking on syndicate frequency (#3450) ## About The Pull Request Make them speak on cybersun frequency ## Why It's Good For The Game Fixes #3446 ## Proof Of Testing <details> <summary>Screenshots/Videos</summary>  </details> ## Changelog 🆑 fix: fixed persistence medbots speaking on wrong radio frequency /🆑 commit17b620b48eAuthor: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sun Apr 6 10:19:15 2025 +0200 Automatic changelog for PR #3438 [ci skip] commitbfb9c9e2b5Author: pixelkitty286 <78038207+pixelkitty286@users.noreply.github.com> Date: Sun Apr 6 03:18:52 2025 -0500 Nerfs super syndicat and makes it no longer a freedom implant. (#3438) ## About The Pull Request - This PR makes the new syndicat ears item have a 1 minute cool down when used and the normal ears have the same thing. - This also ports a fix that was done on monkey station: https://github.com/Monkestation/Monkestation2.0/pull/6017 ## Why It's Good For The Game - After watching a round on here and getting complaints about this from SPLURT I understand now why 20 seconds is too short for such a item like this if your gonna be a cat your gonna be a cat for a long while. - Also to quote monkey station: "It will make the cat not able to bypass any security non-lethal means, which in turns mean security won't be forced to lethal them everytime they see it." ## Proof Of Testing Should work only changed the time values. Edit: Compiled and tested locally <details> <summary>Screenshots/Videos</summary> </details> ## Changelog 🆑 balance: Super cat ear cool downs are longer and removed the freedom implant function. /🆑 commit4ed70fa4c7Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sun Apr 6 10:18:17 2025 +0200 Automatic changelog for PR #3451 [ci skip] commit65331b085fAuthor: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Sun Apr 6 04:17:45 2025 -0400 Fix invisible sprites on security HUD nightvision goggles (#3451) ## About The Pull Request Upstream changed NV goggles to have different icon states for on and off and we dont have that so I reverted it to the tg sprite ## Why It's Good For The Game Fixes #3383 ## Proof Of Testing <details> <summary>Screenshots/Videos</summary>  </details> ## Changelog 🆑 fix: fixed sechud nv goggles being invisible when off /🆑 commit8aad924f76Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sun Apr 6 10:16:18 2025 +0200 Automatic changelog for PR #3443 [ci skip] commit3bd5803844Author: Swift <jackwars4@gmail.com> Date: Sun Apr 6 03:15:53 2025 -0500 Removes tackle buff for having cat ears (#3443) ## About The Pull Request Title, manual revert of #1513 ## Why It's Good For The Game Tackle chance could be brought to 100% and people have reportedly been exploiting this fact. ## Proof Of Testing I think it will complie ## Changelog :cl:Swiftfeather balance: Cat ears no longer provide a tackle bonus /🆑 commit89594c8547Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sun Apr 6 00:56:59 2025 +0000 Bubberstation automatic changelog compile [ci skip] commitb4af64b182Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sun Apr 6 02:25:40 2025 +0200 Automatic changelog for PR #3370 [ci skip] commit0e684db68aAuthor: LT3 <83487515+lessthnthree@users.noreply.github.com> Date: Sat Apr 5 17:24:44 2025 -0700 Update various sound prefs for 516 compatibility (#3370) ## About The Pull Request Updates our various sound prefs to be functional post upstream/516. ## Why It's Good For The Game We can control sound as expected again. ## To-Do - [x] Conditional preference sounds - [x] Jukebox sound toggle - [x] Jukebox volume override ## Changelog 🆑 LT3 fix: Sound prefs that went missing post-516 are restored add: Jukebox volume slider in game preferences /🆑 --------- Co-authored-by: tgstation-ci[bot] <179393467+tgstation-ci[bot]@users.noreply.github.com> commit60e73702c6Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sat Apr 5 07:14:09 2025 +0000 Bubberstation automatic changelog compile [ci skip] commit9a36823173Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sat Apr 5 09:02:26 2025 +0200 Automatic changelog for PR #3425 [ci skip] commit1ab85fd206Author: Odairu <39929315+Odairu@users.noreply.github.com> Date: Sat Apr 5 03:02:02 2025 -0400 Spices up vulpkanin [bounty] (#3425) ## About The Pull Request Changes vulpkanin in several ways: - Peanutbutter gives a mood buff - Chocolate deals toxin damage while inside you - innate hardened soles - innate night vision - hunger will drain twice as fast - higher sensitivity to flashes ## Why It's Good For The Game vulpkanin are literally human but fluffy, they don't even have lore in the species selector (lol) also I'm being paid ## Proof Of Testing    <details> <summary>Screenshots/Videos</summary> </details> ## Changelog 🆑 add: several vulpkanin species buffs/debuffs /🆑 --------- Co-authored-by: LT3 <83487515+lessthnthree@users.noreply.github.com> commit4da0397b16Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sat Apr 5 08:54:22 2025 +0200 Automatic changelog for PR #3396 [ci skip] commit1ed1187fcaAuthor: Jinshee <96621959+Jinshee@users.noreply.github.com> Date: Fri Apr 4 23:53:57 2025 -0700 Slug Scream! (#3396) ## About The Pull Request Adds a new scream, "Slug". Sound file ripped from Splurt ## Why It's Good For The Game Expression is the best thing that this video game medium can offer. ## Proof Of Testing https://github.com/user-attachments/assets/147be9dc-98c2-4ee4-bc76-762331710143 ## Changelog 🆑 sound: Slug Scream sound added to *scream choices /🆑 commit66e28121d4Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sat Apr 5 08:53:15 2025 +0200 Automatic changelog for PR #3431 [ci skip] commit88a238b93cAuthor: Bombermansam <Bombermansam@yahoo.com> Date: Sat Apr 5 02:52:48 2025 -0400 Allows players to be sad like raptors (#3431) ## About The Pull Request Adds a Sad Kweh emote from the two unused raptor sound files. ## Why It's Good For The Game You can now sad birdly. ## Proof Of Testing It compiles and was tested locally. https://github.com/user-attachments/assets/bc5f31fb-ad12-4026-be94-d28d2db542df ## Changelog 🆑 add: *skweh emote to be sad /🆑 commit4a93b42977Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sat Apr 5 08:51:43 2025 +0200 Automatic changelog for PR #3432 [ci skip] commitf51c4d7942Author: Bombermansam <Bombermansam@yahoo.com> Date: Sat Apr 5 02:51:18 2025 -0400 Silicons can now Yip (#3432) ## About The Pull Request Silicons can now emit a singular yip so they can express their inner kobold but not too much. ## Why It's Good For The Game Silicons can yipyip but not yip. This fixes it. ## Proof Of Testing It compiles and was tested locally. </details> ## Changelog 🆑 fix: Silicons can now yip. /🆑 commit14ec8a0440Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sat Apr 5 08:43:03 2025 +0200 Automatic changelog for PR #3437 [ci skip] commite05fe31faaAuthor: Odairu <39929315+Odairu@users.noreply.github.com> Date: Sat Apr 5 02:42:41 2025 -0400 Adds more flavor to shadekin empathy (#3437) ## About The Pull Request BASED ON SANITY SHADEKIN EMPATHY WILL: -Take more or less time to send -At lowest levels of sanity the message starts to break down some -Be a different color in chat ## Why It's Good For The Game Shadekin empathy is communication through FEELINGS so it being better/worse based on how you're FEELING makes sense (to me) ## Proof Of Testing  <details> <summary>Screenshots/Videos</summary> </details> ## Changelog 🆑 balance: shadekin empathy is better/worse based on mood /🆑 --------- Co-authored-by: Waterpig <49160555+Majkl-J@users.noreply.github.com> commit457754c461Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Sat Apr 5 06:38:05 2025 +0000 Bubberstation automatic changelog compile [ci skip] commitc3fe3d31baAuthor: LT3 <83487515+lessthnthree@users.noreply.github.com> Date: Fri Apr 4 23:16:53 2025 -0700 You can cuff people to the tram rails #90293 (#3445) ## About The Pull Request https://github.com/tgstation/tgstation/pull/90293  Handcuffed people can be buckled to the tram rails. If the tram hits them then they will die badly. If they're not shockproof and are buckled to a powered rail, it will zap them repeatedly for a little bit of damage (but not a lot because you probably want them to die from something else). Unbuckling someone from a powered rail is also pretty dangerous. While doing this I fucked around a bit with how the "is the tram deadly" calculation worked because I didn't like how a deadly tram cuts your head off but does literally no other damage. Now it pulverises and beheads you. ## Why It's Good For The Game  --------- Co-authored-by: tgstation-ci[bot] <179393467+tgstation-ci[bot]@users.noreply.github.com> commit3c1c05052fAuthor: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Fri Apr 4 23:23:13 2025 +0000 Bubberstation automatic changelog compile [ci skip] commit0287fe4d0bAuthor: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Fri Apr 4 21:54:53 2025 +0200 Automatic changelog for PR #3440 [ci skip] commit6d081fe0daAuthor: Bombermansam <Bombermansam@yahoo.com> Date: Fri Apr 4 15:54:30 2025 -0400 [Modularized] Nugget Boxes and Foodpacks can now be placed into paper sacks. (#3440) ## About The Pull Request Nugget Boxes and Foodpacks can now be placed into paper sacks. ## Why It's Good For The Game You can now live out your minimum wage dreams as a fast food worker a Chick'fil'a. To quote someone that wanted this "I can now fastfoodmax as a chef". Food packs can also be placed into paper sacks because it makes sense. ## Proof Of Testing It compiles and was tested locally.  I would like to praise [lessthnthree](https://github.com/lessthnthree) for their remarkable patience in teaching me how to properly modularize code. Really, thank you so much! </details> ## Changelog 🆑 add: Makes Nugget Boxes and Food packs small /🆑 --------- Co-authored-by: LT3 <83487515+lessthnthree@users.noreply.github.com> commit0824cb07baAuthor: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Thu Apr 3 20:19:08 2025 +0000 Bubberstation automatic changelog compile [ci skip] commit9d8a54be49Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Thu Apr 3 22:14:42 2025 +0200 Automatic changelog for PR #3433 [ci skip] commit45477353d2Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Thu Apr 3 22:14:33 2025 +0200 Automatic changelog for PR #3403 [ci skip] commitb6b6fbfba4Author: The Sharkening <95130227+StrangeWeirdKitten@users.noreply.github.com> Date: Thu Apr 3 14:14:17 2025 -0600 Job Spawn borgs prioritize linking to the malf AI (#3433) ## About The Pull Request So there's this little quirk where late join cyborgs will auto link to whatever AI has the least cyborgs. This changes that. This adds a priority: Malf AI > AI cores Also this deletes an unused file I noticed. ## Why It's Good For The Game Every cyborg that spawns in the game during an active malf round should always connect to the malf AI if it's available. ## Proof Of Testing It works ## Changelog 🆑 balance: Cyborgs now auto link in a priority system. Malf > AI cores > Suit AIs / Cards /🆑 commit1f3aedc6c1Author: LT3 <83487515+lessthnthree@users.noreply.github.com> Date: Thu Apr 3 13:14:07 2025 -0700 Fix brain trauma surgery (#3403) ## About The Pull Request Fixes the highest level of trauma surgery leaving leftover traumas. Applies a status effect instead of the random roll of a new trauma. ## Why It's Good For The Game Having to do lobotomy surgery over and over until you hit the 25% RNG to make it successfully go away isn't a good gameplay experience. Better to just apply a status effect for a while instead. ## Changelog 🆑 LT3 fix: Lobotomy/blessed lobotomy should correctly remove all surgery based traumas balance: Lobotomy/blessed lobotomy now provides a predictable status effect instead of a trauma RNG roll /🆑 commit95d97cf4a2Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Thu Apr 3 18:50:51 2025 +0200 Automatic changelog for PR #3429 [ci skip] commit3c30dfbaffAuthor: Jinshee <96621959+Jinshee@users.noreply.github.com> Date: Thu Apr 3 09:50:24 2025 -0700 Shadekin Ear Gradient (#3429) ## About The Pull Request Adds a new ear type: Shadekin Gradient ## Why It's Good For The Game Makes Healer happy ## Proof Of Testing   ## Changelog 🆑 add: Added new ear type: Shadekin Gradient /🆑 --------- Co-authored-by: Jinshee <manastra2536@gmail.com> commit3dd8af584eAuthor: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Thu Apr 3 06:33:08 2025 +0200 Automatic changelog for PR #3415 [ci skip] commitc83b14b15dAuthor: Jinshee <96621959+Jinshee@users.noreply.github.com> Date: Wed Apr 2 21:32:45 2025 -0700 Porting New Bug Customization + IPC Screens (#3415) commitd9d40def4cAuthor: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Thu Apr 3 02:35:34 2025 +0200 Automatic changelog for PR #3387 [ci skip] commita154dd9d97Author: Jinshee <96621959+Jinshee@users.noreply.github.com> Date: Wed Apr 2 17:35:10 2025 -0700 Fixes Waggingtail Sprite for Shadekin tails + Ringtail (#3387) ## About The Pull Request All of the shadekin tails, ringtail included, had incorrectly assigned dmi files for their wagging state, causing them to go invisible. This, simply, fixes that. ## Why It's Good For The Game I love fixing sprites! ## Proof Of Testing https://github.com/user-attachments/assets/186f7dc6-4b78-4e9e-968e-fcbdae40bf2f ## Changelog 🆑 fix: fixed wagging state for all shadekin tails and ring tail (long) /🆑 commitba3fa0684cAuthor: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Wed Apr 2 21:56:26 2025 +0000 Bubberstation automatic changelog compile [ci skip] commit70143cdadbAuthor: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Wed Apr 2 23:52:41 2025 +0200 Automatic changelog for PR #3419 [ci skip] commitad62db6f9bAuthor: LT3 <83487515+lessthnthree@users.noreply.github.com> Date: Wed Apr 2 14:52:18 2025 -0700 Adds pipe carp (#3419) ## About The Pull Request A Ferocious, highly aggressive fish that thrives in the depths of shoddy engineering work. Drawn to poorly sealed pipes, mismatched connectors, and hastily patched atmospherics, these creatures feast on structural incompetence with alarming efficiency. ## Changelog 🆑 LT3 add: Added new carp variant: carpmospheric technician /🆑 commitdab0ff6a09Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Wed Apr 2 11:40:26 2025 +0200 Automatic changelog for PR #3423 [ci skip] commit27027d5cebAuthor: The Sharkening <95130227+StrangeWeirdKitten@users.noreply.github.com> Date: Wed Apr 2 03:40:00 2025 -0600 take two: Reverts the disaboot apirl fools (#3423) ## About The Pull Request Apirl fools code cleanup. Was a funny meme, but I don't think they should happen next year. ## Changelog 🆑 del: Disaboots have been removed from apirl fools. /🆑 commit1c08269f2aAuthor: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Wed Apr 2 03:08:41 2025 +0000 Bubberstation automatic changelog compile [ci skip] commitc43c9d01edAuthor: LT3 <83487515+lessthnthree@users.noreply.github.com> Date: Tue Apr 1 19:38:12 2025 -0700 [TM ONLY] let me send long ass subtler messages to my heart's content (TGUI payload chunking) (#3406) ## About The Pull Request (https://github.com/tgstation/tgstation/pull/90295) ## Changelog 🆑 Y0SH1M4S73R code: Any tgui message that would be too big to send to the server is now split into chunks and sent in sequence. This fixes several issues, such as... fix: It is once again possible to save large amounts of text on paper at once. /🆑 --------- Co-authored-by: Y0SH1M4S73R <legoboyo@earthlink.net> Co-authored-by: Y0SH1M4S73R <y0sh1m4s73r@gmail.com> Co-authored-by: Lucy <lucy@absolucy.moe> commitc96d028562Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Wed Apr 2 04:35:29 2025 +0200 Automatic changelog for PR #3420 [ci skip] commite22c174b35Author: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Wed Apr 2 04:35:09 2025 +0200 Automatic changelog for PR #3407 [ci skip] commit43a4b964b1Author: plsleavemealon <106043510+plsleavemealon@users.noreply.github.com> Date: Tue Apr 1 21:35:04 2025 -0500 Ethereal Powercell Bugfix (#3420) ## About The Pull Request Fixes ethereal powercells from 20kj back to 220kj which is what they used to be. ## Why It's Good For The Game It is what it used to be, and with the present vanilla values you have to recharge yourself once every ~5 minutes or so or suffer a huge mood debuff. And if you are entombed, you will suffer death after ~10 minutes if you do not recharge. ## Proof Of Testing ## Changelog 🆑 fix: fixed ethereals powercell back to bubbers values /🆑 commit3068303ae3Author: The Sharkening <95130227+StrangeWeirdKitten@users.noreply.github.com> Date: Tue Apr 1 20:34:46 2025 -0600 Reverts "Adds crew monitors to Advanced biotech and lathes" (#3407) ## About The Pull Request This removes the handheld crew monitor from the medical lathe. ## Why It's Good For The Game Alright, I just want to start out with all sources of the handheld crew monitor after this PR - Paramedics spawn with them - Blueshield (command only) - The medical vendor premium section. - Borg upgrades Overall while there's been a lot of QOL to the crew monitor which I enjoy, it's all gradually made it so deaths are very noticable and often times with someone in medical 1 second later running towards an active fight to drag corpses away. - I think overall we have a sort of medical omnipresence issue, especially with an easy research destroying a level of scarcity with the hand held crew monitor. Anyone can print it if they have the materials and access to the lathe versus only a few existing outside of the paramedic starting with them. This PR of course is not going to fully tackle it. It's not going to stop a paramedic constantly staring at sensors or the medical console beeping when someone's in crit. But this aims to get less eyes on sensors, mostly the ability for everyone in medical to have a little screen to pull out and see the live feed without actively moving to a console. Overall I think we have this issue (a lot of it being administrative) where every single death must be immedietly found and the person revived in 10 minutes. This won't fully tackle that, but if the solution is we must bloat a ton of antag abilities and items to combat sensors then I think we have too many eyes on sensors. ## Proof Of Testing  ## Changelog 🆑 del: Removes the handheld crew monitor from the medical lathes. /🆑 commitc9cca3fbefAuthor: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Tue Apr 1 23:24:18 2025 +0000 Bubberstation automatic changelog compile [ci skip] commitde81adcb6dAuthor: Waterpig <49160555+Majkl-J@users.noreply.github.com> Date: Wed Apr 2 00:55:25 2025 +0200 Makes the roundend mapvote not rerun after it gets called the first time (#3418) ## About The Pull Request See name ## Why It's Good For The Game Fixes #3395 ## Proof Of Testing It worked I did test it ## Changelog Nothing player facing, basically allows us to cancel the vote once it initializes commitb36c477460Author: Roxy <75404941+TealSeer@users.noreply.github.com> Date: Tue Apr 1 18:35:54 2025 -0400 Fix every fucking piece of maint loot being skub (#3412) ## About The Pull Request the override should append to the global maint loot list not replace it ## Why It's Good For The Game I'm anti-skub ## Proof Of Testing I did this PR from my phone in bed because there's no power
695 lines
36 KiB
Plaintext
695 lines
36 KiB
Plaintext
/// how many things can we knock off a table at once by diving into it?
|
|
#define MAX_TABLE_MESSES 18
|
|
|
|
/**
|
|
* For when you want to throw a person at something and have fun stuff happen
|
|
*
|
|
* This component is made for carbon mobs (really, humans), and allows its parent to throw themselves and perform tackles. This is done by enabling throw mode, then clicking on your
|
|
* intended target with an empty hand. You will then launch toward your target. If you hit a carbon, you'll roll to see how hard you hit them. If you hit a solid non-mob, you'll
|
|
* roll to see how badly you just messed yourself up. If, along your journey, you hit a table, you'll slam onto it and send up to MAX_TABLE_MESSES (8) /obj/items on the table flying,
|
|
* and take a bit of extra damage and stun for each thing launched.
|
|
*
|
|
* There are 2 separate """skill rolls""" involved here, which are handled and explained in [rollTackle()][/datum/component/tackler/proc/rollTackle] (for roll 1, carbons), and [splat()][/datum/component/tackler/proc/splat] (for roll 2, walls and solid objects)
|
|
*/
|
|
/datum/component/tackler
|
|
dupe_mode = COMPONENT_DUPE_UNIQUE
|
|
|
|
///If we're currently tackling or are on cooldown. Actually, shit, if I use this to handle cooldowns, then getting thrown by something while on cooldown will count as a tackle..... whatever, i'll fix that next commit
|
|
var/tackling = TRUE
|
|
///How much stamina it takes to launch a tackle
|
|
var/stamina_cost
|
|
///Launching a tackle calls Knockdown on you for this long, so this is your cooldown. Once you stand back up, you can tackle again.
|
|
var/base_knockdown
|
|
///Your max range for how far you can tackle.
|
|
var/range
|
|
///How fast you sail through the air. Standard tackles are 1 speed, but gloves that throw you faster come at a cost: higher speeds make it more likely you'll be badly injured if you fly into a non-mob obstacle.
|
|
var/speed
|
|
///A flat modifier to your roll against your target, as described in [rollTackle()][/datum/component/tackler/proc/rollTackle]. Slightly misleading, skills aren't relevant here, this is a matter of what type of gloves (or whatever) is granting you the ability to tackle.
|
|
var/skill_mod
|
|
///Some gloves, generally ones that increase mobility, may have a minimum distance to fly. Rocket gloves are especially dangerous with this, be sure you'll hit your target or have a clear background if you miss, or else!
|
|
var/min_distance
|
|
///A wearkef to the throwdatum we're currently dealing with, if we need it
|
|
var/datum/weakref/tackle_ref
|
|
|
|
/datum/component/tackler/Initialize(stamina_cost = 25, base_knockdown = 1 SECONDS, range = 4, speed = 1, skill_mod = 0, min_distance = min_distance)
|
|
if(!iscarbon(parent))
|
|
return COMPONENT_INCOMPATIBLE
|
|
|
|
src.stamina_cost = stamina_cost
|
|
src.base_knockdown = base_knockdown
|
|
src.range = range
|
|
src.speed = speed
|
|
src.skill_mod = skill_mod
|
|
src.min_distance = min_distance
|
|
|
|
var/mob/P = parent
|
|
to_chat(P, span_notice("You are now able to launch tackles! You can do so by activating throw mode, and ") + span_boldnotice("RIGHT-CLICKING on your target with an empty hand."))
|
|
|
|
addtimer(CALLBACK(src, PROC_REF(resetTackle)), base_knockdown, TIMER_STOPPABLE)
|
|
|
|
/datum/component/tackler/Destroy()
|
|
var/mob/P = parent
|
|
to_chat(P, span_notice("You can no longer tackle."))
|
|
return ..()
|
|
|
|
/datum/component/tackler/RegisterWithParent()
|
|
RegisterSignal(parent, COMSIG_MOB_CLICKON, PROC_REF(checkTackle))
|
|
RegisterSignal(parent, COMSIG_MOVABLE_PRE_IMPACT, PROC_REF(sack))
|
|
RegisterSignal(parent, COMSIG_MOVABLE_POST_THROW, PROC_REF(registerTackle))
|
|
|
|
/datum/component/tackler/UnregisterFromParent()
|
|
UnregisterSignal(parent, list(COMSIG_MOB_CLICKON, COMSIG_MOVABLE_PRE_IMPACT, COMSIG_MOVABLE_MOVED, COMSIG_MOVABLE_POST_THROW))
|
|
|
|
///Store the thrownthing datum for later use
|
|
/datum/component/tackler/proc/registerTackle(mob/living/carbon/user, datum/thrownthing/tackle)
|
|
SIGNAL_HANDLER
|
|
|
|
tackle_ref = WEAKREF(tackle)
|
|
tackle.thrower = WEAKREF(user)
|
|
|
|
///See if we can tackle or not. If we can, leap!
|
|
/datum/component/tackler/proc/checkTackle(mob/living/carbon/user, atom/clicked_atom, list/modifiers)
|
|
SIGNAL_HANDLER
|
|
|
|
if(!modifiers[RIGHT_CLICK] || modifiers[ALT_CLICK] || modifiers[SHIFT_CLICK] || modifiers[CTRL_CLICK] || modifiers[MIDDLE_CLICK])
|
|
return
|
|
|
|
if(!user.throw_mode || user.get_active_held_item() || user.pulling || user.buckled || user.incapacitated)
|
|
return
|
|
|
|
if(!clicked_atom || !(isturf(clicked_atom) || isturf(clicked_atom.loc)))
|
|
return
|
|
|
|
if(HAS_TRAIT(user, TRAIT_HULK))
|
|
to_chat(user, span_warning("You're too angry to remember how to tackle!"))
|
|
return
|
|
|
|
if(HAS_TRAIT(user, TRAIT_HANDS_BLOCKED))
|
|
to_chat(user, span_warning("You need free use of your hands to tackle!"))
|
|
return
|
|
|
|
if(user.body_position == LYING_DOWN)
|
|
to_chat(user, span_warning("You must be standing to tackle!"))
|
|
return
|
|
|
|
if(tackling)
|
|
to_chat(user, span_warning("You're not ready to tackle!"))
|
|
return
|
|
|
|
if(user.get_timed_status_effect_duration(/datum/status_effect/staggered)) // can't tackle if you're staggered
|
|
to_chat(user, span_warning("You're too off balance to tackle!"))
|
|
return
|
|
|
|
user.face_atom(clicked_atom)
|
|
|
|
tackling = TRUE
|
|
RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(checkObstacle))
|
|
playsound(user, 'sound/items/weapons/thudswoosh.ogg', 40, TRUE, -1)
|
|
|
|
var/leap_word = isfeline(user) || HAS_TRAIT(user, TRAIT_TACKLING_TAILED_POUNCE) ? "pounce" : "leap" //If cat, "pounce" instead of "leap". // BUBBER EDIT - FELINE TRAITS. Was: isfelinid(user)
|
|
if(can_see(user, clicked_atom, 7))
|
|
user.visible_message(span_warning("[user] [leap_word]s at [clicked_atom]!"), span_danger("You [leap_word] at [clicked_atom]!"))
|
|
else
|
|
user.visible_message(span_warning("[user] [leap_word]s!"), span_danger("You [leap_word]!"))
|
|
|
|
if(get_dist(user, clicked_atom) < min_distance)
|
|
var/tackle_angle = get_angle(user, clicked_atom)
|
|
clicked_atom = get_turf_in_angle(tackle_angle, get_turf(user), min_distance)
|
|
|
|
user.Knockdown(base_knockdown, ignore_canstun = TRUE)
|
|
user.adjustStaminaLoss(stamina_cost)
|
|
user.throw_at(clicked_atom, range, speed, user, FALSE)
|
|
addtimer(CALLBACK(src, PROC_REF(resetTackle)), base_knockdown, TIMER_STOPPABLE)
|
|
return(COMSIG_MOB_CANCEL_CLICKON)
|
|
|
|
/**
|
|
* sack() is called when you actually smack into something, assuming we're mid-tackle. First it deals with smacking into non-carbons, in two cases:
|
|
* * If it's a non-carbon mob, we don't care, get out of here and do normal thrown-into-mob stuff
|
|
* * Else, if it's something dense (walls, machinery, structures, most things other than the floor), go to [/datum/component/tackler/proc/splat] and get ready for some high grade shit
|
|
*
|
|
* If it's a carbon we hit, we'll call rollTackle() which rolls a die and calculates modifiers for both the tackler and target, then gives us a number. Negatives favor the target, while positives favor the tackler.
|
|
* Check [rollTackle()][/datum/component/tackler/proc/rollTackle] for a more thorough explanation on the modifiers at play.
|
|
*
|
|
* Then, we figure out what effect we want, and we get to work! Note that with standard gripper gloves and no modifiers, the range of rolls is (-3, 3). The results are as follows, based on what we rolled:
|
|
* * -inf to -1: We have a negative roll result, which means something unfortunate or less than ideal happens to our sacker! Could mean just getting knocked down, but it could also mean they get a concussion. Ouch.
|
|
* * 0: We get a relatively neutral result, mildly favouring the tackler.
|
|
* * 1 to inf: We get a positive roll result, which means we get a reasonable to significant advantage against the target!
|
|
*
|
|
* Finally, we return a bitflag to [COMSIG_MOVABLE_IMPACT] that forces the hitpush to false so that we don't knock them away.
|
|
*/
|
|
/datum/component/tackler/proc/sack(mob/living/carbon/user, atom/hit)
|
|
SIGNAL_HANDLER
|
|
|
|
var/datum/thrownthing/tackle = tackle_ref?.resolve()
|
|
if(!tackling || !tackle)
|
|
tackle = null
|
|
return
|
|
|
|
user.toggle_throw_mode()
|
|
if(!iscarbon(hit))
|
|
if(hit.density)
|
|
INVOKE_ASYNC(src, PROC_REF(splat), user, hit)
|
|
return
|
|
|
|
var/mob/living/carbon/target = hit
|
|
var/tackle_word = isfeline(user) ? "pounce" : "tackle" //If cat, "pounce" instead of "tackle". // SKYRAT EDIT - FELINE TRAITS - ORIGINAL : var/tackle_word = isfelinid(user) ? "pounce" : "tackle"
|
|
|
|
var/roll = rollTackle(target)
|
|
tackling = FALSE
|
|
tackle.gentle = TRUE
|
|
|
|
if(target.check_block(user, 0, user.name, attack_type = LEAP_ATTACK))
|
|
user.visible_message(span_danger("[user]'s tackle is blocked by [target], softening the effect!"), span_userdanger("Your tackle is blocked by [target], softening the effect!"), ignored_mobs = target)
|
|
to_chat(target, span_userdanger("[target] blocks [user]'s tackle attempt, softening the effect!"))
|
|
neutral_outcome(user, target, tackle_word) //Forces a neutral outcome so you're not screwed too much from being blocked while tackling
|
|
return COMPONENT_MOVABLE_IMPACT_FLIP_HITPUSH
|
|
|
|
switch(roll)
|
|
if(-INFINITY to -1)
|
|
negative_outcome(user, target, roll, tackle_word) //OOF
|
|
|
|
if(0) //nothing good, nothing bad
|
|
neutral_outcome(user, target, tackle_word)
|
|
|
|
if(1 to INFINITY)
|
|
positive_outcome(user, target, roll, tackle_word)
|
|
|
|
return COMPONENT_MOVABLE_IMPACT_FLIP_HITPUSH
|
|
|
|
/// Helper to do a grab and then adjust the grab state if necessary
|
|
/datum/component/tackler/proc/do_grab(mob/living/carbon/tackler, mob/living/carbon/tackled, skip_to_state = GRAB_PASSIVE)
|
|
set waitfor = FALSE
|
|
|
|
if(!tackler.grab(tackled) || tackler.pulling != tackled)
|
|
return
|
|
if(tackler.grab_state != skip_to_state)
|
|
tackler.setGrabState(skip_to_state)
|
|
|
|
/**
|
|
* Our positive tackling outcomes.
|
|
*
|
|
* We pass our tackle result here to determine the potential outcome of the tackle. Typically, this results in a very poor state for the tackled, and a positive outcome for the tackler.
|
|
*
|
|
* First, we determine severity by taking our roll result, multiplying it by 10, and then rolling within that value.
|
|
*
|
|
* If our target is human, their armor will reduce the severity of the roll. We pass along any MELEE armor as a percentage reduction.
|
|
* If they're not human (such as a carbon), we give them a small grace of a 10% reduction.
|
|
*
|
|
* Finally, we figure out what effect our target receives. Note that all positive outcomes inflict staggered, resulting in a much harder time escaping the potential grab:
|
|
* * 1 to 20: Our target is briefly stunned and knocked down. suffers 30 stamina damage, and our tackler is also knocked down.
|
|
* * 21 to 49: Our target is knocked down, dealt 40 stamina damage, and put into a passive grab. Given they are staggered, this means the target must resist to escape!
|
|
* * 50 to inf: Our target is hit with a significant chunk of stamina damage, put into an aggressive grab, and knocked down. They're probably not escaping after this. If our tackler is stamcrit when they land this, so is our target.
|
|
*/
|
|
|
|
/datum/component/tackler/proc/positive_outcome(mob/living/carbon/user, mob/living/carbon/target, roll = 1, tackle_word = "tackle")
|
|
var/potential_outcome = (roll * 10)
|
|
|
|
if(ishuman(target))
|
|
potential_outcome *= ((100 - target.run_armor_check(BODY_ZONE_CHEST, MELEE)) /100)
|
|
else
|
|
potential_outcome *= 0.9
|
|
|
|
switch(potential_outcome)
|
|
if(-INFINITY to 0) //I don't want to know how this has happened, okay?
|
|
neutral_outcome(user, target, roll, tackle_word) //Default to neutral
|
|
|
|
if(1 to 20)
|
|
user.visible_message(span_warning("[user] lands a solid [tackle_word] on [target], knocking them both down hard!"), span_userdanger("You land a solid [tackle_word] on [target], knocking you both down hard!"), ignored_mobs = target)
|
|
to_chat(target, span_userdanger("[user] lands a solid [tackle_word] on you, knocking you both down hard!"))
|
|
|
|
target.apply_damage(30, STAMINA)
|
|
target.Paralyze(0.5 SECONDS)
|
|
user.Knockdown(1 SECONDS)
|
|
target.Knockdown(2 SECONDS)
|
|
target.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH * 2, 10 SECONDS)
|
|
|
|
if(21 to 49) // really good hit, the target is definitely worse off here. Without positive modifiers, this is as good a tackle as you can land
|
|
user.visible_message(span_warning("[user] lands an expert [tackle_word] on [target], knocking [target.p_them()] down hard while landing on [user.p_their()] feet with a passive grip!"), span_userdanger("You land an expert [tackle_word] on [target], knocking [target.p_them()] down hard while landing on your feet with a passive grip!"), ignored_mobs = target)
|
|
to_chat(target, span_userdanger("[user] lands an expert [tackle_word] on you, knocking you down hard and maintaining a passive grab!"))
|
|
|
|
// Ignore_canstun has to be true, or else a stunimmune user would stay knocked down.
|
|
user.SetKnockdown(0, ignore_canstun = TRUE)
|
|
user.get_up(TRUE)
|
|
user.forceMove(get_turf(target))
|
|
target.apply_damage(40, STAMINA)
|
|
target.Paralyze(0.5 SECONDS)
|
|
target.Knockdown(3 SECONDS)
|
|
target.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH * 2, 10 SECONDS)
|
|
do_grab(user, target)
|
|
|
|
if(50 to INFINITY) // absolutely BODIED
|
|
var/stamcritted_user = HAS_TRAIT_FROM(user, TRAIT_INCAPACITATED, STAMINA)
|
|
if(stamcritted_user) // in case the user went into stamcrit from the tackle itself and cannot actually aggro grab (since they will be crit) we make the tackle effectivelly mutually assured...stamina crit
|
|
user.visible_message(span_warning("[user] lands a monsterly reckless [tackle_word] on [target], knocking both of them senseless!"), span_userdanger("You land a monsterly reckless [tackle_word] on [target], knocking both of you senseless!"), ignored_mobs = target)
|
|
to_chat(target, span_userdanger("[user] lands a monsterly reckless [tackle_word] on you, knocking the both of you senseless!"))
|
|
user.forceMove(get_turf(target))
|
|
target.apply_damage(100, STAMINA) // CRASHING THIS PLANE WITH NO SURVIVORS
|
|
target.Paralyze(1 SECONDS)
|
|
target.Knockdown(5 SECONDS)
|
|
target.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH * 3, 10 SECONDS)
|
|
else
|
|
user.visible_message(span_warning("[user] lands a monster [tackle_word] on [target], knocking [target.p_them()] senseless and applying an aggressive pin!"), span_userdanger("You land a monster [tackle_word] on [target], knocking [target.p_them()] senseless and applying an aggressive pin!"), ignored_mobs = target)
|
|
to_chat(target, span_userdanger("[user] lands a monster [tackle_word] on you, knocking you senseless and aggressively pinning you!"))
|
|
|
|
// Ignore_canstun has to be true, or else a stunimmune user would stay knocked down.
|
|
user.SetKnockdown(0, ignore_canstun = TRUE)
|
|
user.get_up(TRUE)
|
|
user.forceMove(get_turf(target))
|
|
target.apply_damage(60, STAMINA)
|
|
target.Paralyze(0.5 SECONDS)
|
|
target.Knockdown(3 SECONDS)
|
|
target.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH * 3, 10 SECONDS)
|
|
do_grab(user, target, GRAB_AGGRESSIVE)
|
|
|
|
/**
|
|
* Our neutral tackling outcome.
|
|
*
|
|
* Our tackler and our target are staggered. The target longer than the tackler. However, the tackler stands up after this outcome. This is maybe less neutral than it appears, but the tackler initiated, so...
|
|
* This outcome also occurs when our target has blocked the tackle in some way, preventing situations where someone tackling into a blocker is too severely punished as a result. Hence, this has its own proc.
|
|
*/
|
|
|
|
/datum/component/tackler/proc/neutral_outcome(mob/living/carbon/user, mob/living/carbon/target, roll = 1, tackle_word = "tackle")
|
|
|
|
|
|
user.visible_message(span_warning("[user] lands a [tackle_word] on [target], briefly staggering them both!"), span_userdanger("You land a [tackle_word] on [target], briefly staggering [target.p_them()] and yourself!"), ignored_mobs = target)
|
|
to_chat(target, span_userdanger("[user] lands a [tackle_word] on you, briefly staggering you both!"))
|
|
|
|
user.SetKnockdown(0, ignore_canstun = TRUE)
|
|
user.get_up(TRUE)
|
|
user.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH, 10 SECONDS)
|
|
target.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH * 2, 10 SECONDS) //okay maybe slightly good for the sacker, it's a mild benefit okay?
|
|
|
|
/**
|
|
* Our negative tackling outcomes.
|
|
*
|
|
* We pass our tackle result here to determine the potential outcome of the tackle. Typically, this results in a very poor state for the tackler, and a mostly okay outcome for the tackled.
|
|
*
|
|
* First, we determine severity by taking our roll result, multiplying it by -10, and then rolling within that value.
|
|
*
|
|
* If our tackler is human, their armor will reduce the severity of the roll. We pass along any MELEE armor as a percentage reduction.
|
|
* If they're not human (such as a carbon), we give them a small grace of a 10% reduction.
|
|
*
|
|
* Finally, we figure out what effect our target receives and what our tackler receives:
|
|
* * 1 to 20: Our tackler is knocked down and become staggered, and our target suffers stamina damage and is knocked staggered. So not all bad, but the target most likely can punish you for this.
|
|
* * 21 to 49: Our tackler is knocked down, suffers stamina damage, and is staggered. Ouch.
|
|
* * 50 to inf: Our tackler suffers a catastrophic failure, receiving significant stamina damage, a concussion, and is paralyzed for 3 seconds. Oh, and they're staggered for a LONG time.
|
|
*/
|
|
|
|
/datum/component/tackler/proc/negative_outcome(mob/living/carbon/user, mob/living/carbon/target, roll = -1, tackle_word = "tackle")
|
|
var/potential_roll_outcome = (roll * -10)
|
|
|
|
if(ishuman(user))
|
|
potential_roll_outcome *= ((100 - target.run_armor_check(BODY_ZONE_CHEST, MELEE)) /100)
|
|
else
|
|
potential_roll_outcome *= 0.9
|
|
|
|
var/actual_roll = rand(1, potential_roll_outcome)
|
|
|
|
switch(actual_roll)
|
|
|
|
if(-INFINITY to 0) //I don't want to know how this has happened, okay?
|
|
neutral_outcome(user, target, roll, tackle_word) //Default to neutral
|
|
|
|
if(1 to 20) // It's not completely terrible! But you are somewhat vulernable for doing it.
|
|
user.visible_message(span_warning("[user] lands a weak [tackle_word] on [target], briefly staggering [target.p_them()]!"), span_userdanger("You land a weak [tackle_word] on [target], briefly staggering [target.p_them()]!"), ignored_mobs = target)
|
|
to_chat(target, span_userdanger("[user] lands a weak [tackle_word] on you, staggering you!"))
|
|
|
|
user.Knockdown(1 SECONDS)
|
|
user.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH * 2, 10 SECONDS)
|
|
target.apply_damage(20, STAMINA)
|
|
target.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH * 2, 10 SECONDS)
|
|
|
|
if(21 to 49) // oughe
|
|
user.visible_message(span_warning("[user] lands a dreadful [tackle_word] on [target], briefly knocking [user.p_them()] to the ground!"), span_userdanger("You land a dreadful [tackle_word] on [target], briefly knocking you to the ground!"), ignored_mobs = target)
|
|
to_chat(target, span_userdanger("[user] lands a dreadful [tackle_word] on you, briefly knocking [user.p_them()] to the ground!"))
|
|
|
|
user.Knockdown(3 SECONDS)
|
|
user.apply_damage(40, STAMINA)
|
|
user.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH * 2, 10 SECONDS)
|
|
|
|
if(50 to INFINITY) // It has been decided that you will suffer
|
|
user.visible_message(span_danger("[user] botches [user.p_their()] [tackle_word] and slams [user.p_their()] head into [target], knocking [user.p_them()]self silly!"), span_userdanger("You botch your [tackle_word] and slam your head into [target], knocking yourself silly!"), ignored_mobs = target)
|
|
to_chat(target, span_userdanger("[user] botches [user.p_their()] [tackle_word] and slams [user.p_their()] head into you, knocking [user.p_them()]self silly!"))
|
|
|
|
user.Paralyze(3 SECONDS)
|
|
user.apply_damage(80, STAMINA)
|
|
user.apply_damage(20, BRUTE, BODY_ZONE_HEAD)
|
|
user.gain_trauma(/datum/brain_trauma/mild/concussion)
|
|
user.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH * 3, 10 SECONDS)
|
|
|
|
/**
|
|
* This handles all of the modifiers for the actual carbon-on-carbon tackling, and gets its own proc because of how many there are (with plenty more in mind!)
|
|
*
|
|
* The base roll is between (-3, 3), with negative numbers favoring the target, and positive numbers favoring the tackler. The target and the tackler are both assessed for
|
|
* how easy they are to knock over, with clumsiness and dwarfiness being strong maluses for each, and gigantism giving a bonus for each. These numbers and ideas
|
|
* are absolutely subject to change.
|
|
|
|
* In addition, after subtracting the defender's mod and adding the attacker's mod to the roll, the component's base (skill) mod is added as well. Some sources of tackles
|
|
* are better at taking people down, like the bruiser and rocket gloves, while the dolphin gloves have a malus in exchange for better mobility.
|
|
*/
|
|
/datum/component/tackler/proc/rollTackle(mob/living/carbon/target)
|
|
var/defense_mod = 0
|
|
var/attack_mod = 0
|
|
|
|
// DE-FENSE
|
|
|
|
// Drunks are easier to knock off balance
|
|
var/target_drunkenness = target.get_drunk_amount()
|
|
if(target_drunkenness > 60)
|
|
defense_mod -= 3
|
|
else if(target_drunkenness > 30)
|
|
defense_mod -= 1
|
|
|
|
//Arms contribute a great deal to potential tackling prowess and defense. Better arms = better bonus
|
|
var/obj/item/bodypart/arm/defender_arm = target.get_active_hand()
|
|
|
|
if(defender_arm) //the target may not actually have arms
|
|
defense_mod += (defender_arm.unarmed_effectiveness/10)
|
|
else //sucks to be you if you don't though haha
|
|
defense_mod -= 2
|
|
|
|
if(HAS_TRAIT(target, TRAIT_CLUMSY))
|
|
defense_mod -= 2
|
|
if(HAS_TRAIT(target, TRAIT_OFF_BALANCE_TACKLER)) // chonkers are harder to knock over
|
|
defense_mod += 1
|
|
if(HAS_TRAIT(target, TRAIT_GRABWEAKNESS))
|
|
defense_mod -= 2
|
|
|
|
if(HAS_TRAIT(target, TRAIT_GIANT))
|
|
defense_mod += 2
|
|
if(target.get_organic_health() < 50)
|
|
defense_mod -= 1
|
|
|
|
var/leg_wounds = 0 // -1 defense per 2 leg wounds
|
|
for(var/i in target.all_wounds)
|
|
var/datum/wound/iterwound = i
|
|
if((iterwound.limb.body_zone in list(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)))
|
|
leg_wounds++
|
|
defense_mod -= round(leg_wounds * 0.5)
|
|
|
|
if(ishuman(target))
|
|
var/mob/living/carbon/human/tackle_target = target
|
|
|
|
if(tackle_target.mob_height <= HUMAN_HEIGHT_SHORTEST) //WHO ARE YOU CALLING SHORT?
|
|
defense_mod -= 2
|
|
|
|
if(isnull(tackle_target.wear_suit) && isnull(tackle_target.w_uniform)) // who honestly puts all of their effort into tackling a naked guy?
|
|
defense_mod += 2
|
|
if(tackle_target.mob_negates_gravity())
|
|
defense_mod += 1
|
|
if(HAS_TRAIT(tackle_target, TRAIT_BRAWLING_KNOCKDOWN_BLOCKED)) // riot armor and such
|
|
defense_mod += 5
|
|
|
|
var/obj/item/organ/tail/lizard/el_tail = tackle_target.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL)
|
|
if(HAS_TRAIT(tackle_target, TRAIT_TACKLING_TAILED_DEFENDER) && !el_tail)
|
|
defense_mod -= 1
|
|
if(el_tail && (el_tail.wag_flags & WAG_WAGGING)) // lizard tail wagging is robust and can swat away assailants!
|
|
defense_mod += 1
|
|
|
|
var/obj/item/organ/cyberimp/chest/spine/potential_spine = tackle_target.get_organ_slot(ORGAN_SLOT_SPINE)
|
|
if(istype(potential_spine))
|
|
defense_mod += potential_spine.strength_bonus
|
|
|
|
// OF-FENSE
|
|
var/mob/living/carbon/sacker = parent
|
|
var/sacker_drunkenness = sacker.get_drunk_amount()
|
|
|
|
//Arms contribute a great deal to potential tackling prowess and defense. Better arms = better bonus
|
|
var/obj/item/bodypart/arm/sacker_arm = sacker.get_active_hand()
|
|
|
|
if(sacker_arm) //I have no idea how you would be tackling without hands, but just in case
|
|
attack_mod += (sacker_arm.unarmed_effectiveness/10)
|
|
else //I don't want to know how you got to this point but if you have, fuck you, good luck tackling without ARMS
|
|
attack_mod -= 4
|
|
|
|
if(sacker_drunkenness > 60) // you're far too drunk to hold back!
|
|
attack_mod += 1
|
|
else if(sacker_drunkenness > 30) // if you're only a bit drunk though, you're just sloppy
|
|
attack_mod -= 1
|
|
|
|
if(HAS_TRAIT(sacker, TRAIT_CLUMSY))
|
|
attack_mod -= 2
|
|
if(HAS_TRAIT(sacker, TRAIT_GIANT))
|
|
attack_mod += 2
|
|
if(HAS_TRAIT(sacker, TRAIT_NOGUNS)) //Those dedicated to martial combat are particularly skilled tacklers
|
|
attack_mod += 2
|
|
|
|
if(HAS_TRAIT(sacker, TRAIT_TACKLING_TAILED_POUNCE))
|
|
var/obj/item/organ/tail/lizard/sacker_tail = sacker.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL)
|
|
attack_mod += sacker_tail ? 2 : -2
|
|
|
|
if(HAS_TRAIT(sacker, TRAIT_TACKLING_WINGED_ATTACKER))
|
|
var/obj/item/organ/wings/moth/sacker_moth_wing = sacker.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS)
|
|
if(!sacker_moth_wing || sacker_moth_wing.burnt)
|
|
attack_mod -= 2
|
|
var/obj/item/organ/wings/sacker_wing = sacker.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS)
|
|
if(sacker_wing)
|
|
attack_mod += 2
|
|
|
|
var/obj/item/organ/cyberimp/chest/spine/potential_spine = sacker.get_organ_slot(ORGAN_SLOT_SPINE)
|
|
if(istype(potential_spine))
|
|
attack_mod += potential_spine.strength_bonus
|
|
|
|
if(ishuman(sacker))
|
|
var/mob/living/carbon/human/human_sacker = sacker
|
|
|
|
if(human_sacker.mob_height <= HUMAN_HEIGHT_SHORTEST) //JUST YOU WAIT TILL I FIND A CHAIR, BUDDY, THEN YOU'LL BE SORRY
|
|
attack_mod -= 2
|
|
|
|
if(human_sacker.mob_mood.sanity_level == SANITY_LEVEL_INSANE) //I've gone COMPLETELY INSANE
|
|
attack_mod += 15
|
|
human_sacker.adjustStaminaLoss(100) //AHAHAHAHAHAHAHAHA
|
|
|
|
if(HAS_TRAIT(human_sacker, TRAIT_BRAWLING_KNOCKDOWN_BLOCKED)) // tackling with riot specialized armor, like riot armor, is effective but tiring
|
|
attack_mod += 2
|
|
human_sacker.adjustStaminaLoss(20)
|
|
|
|
var/randomized_tackle_roll = rand(-3, 3) - defense_mod + attack_mod + skill_mod
|
|
return randomized_tackle_roll
|
|
|
|
|
|
/**
|
|
* This is where we handle diving into dense atoms, generally with effects ranging from bad to REALLY bad. This works as a percentile roll that is modified in two steps as detailed below. The higher
|
|
* the roll, the more severe the result.
|
|
*
|
|
* Mod 1: Speed-
|
|
* * Base tackle speed is 1, which is what normal gripper gloves use. For other sources with higher speed tackles, like dolphin and ESPECIALLY rocket gloves, we obey Newton's laws and hit things harder.
|
|
* * For every unit of speed above 1, move the lower bound of the roll up by 15. Unlike Mod 2, this only serves to raise the lower bound, so it can't be directly counteracted by anything you can control.
|
|
*
|
|
* Mod 2: Misc-
|
|
* -Flat modifiers, these take whatever you rolled and add/subtract to it, with the end result capped between the minimum from Mod 1 and 100. Note that since we can't roll higher than 100 to start with,
|
|
* wearing a helmet should be enough to remove any chance of permanently paralyzing yourself and dramatically lessen knocking yourself unconscious, even with rocket gloves. Will expand on maybe
|
|
* * Wearing a helmet: -6
|
|
* * Wearing riot armor: -6
|
|
* * Clumsy: +6
|
|
*
|
|
* Effects: Below are the outcomes based off your roll, in order of increasing severity
|
|
*
|
|
* * 1-67: Knocked down for a few seconds and a bit of brute and stamina damage
|
|
* * 68-85: Knocked silly, gain some confusion as well as the above
|
|
* * 86-92: Cranial trauma, get a concussion and more confusion, plus more damage
|
|
* * 93-96: Knocked unconscious, get a random mild brain trauma, as well as a fair amount of damage
|
|
* * 97-98: Massive head damage, probably crack your skull open, random mild brain trauma
|
|
* * 99-Infinity: Break your spinal cord, get paralyzed, take a bunch of damage too. Very unlucky!
|
|
*/
|
|
/datum/component/tackler/proc/splat(mob/living/carbon/user, atom/hit)
|
|
if(istype(hit, /obj/machinery/vending)) // before we do anything else-
|
|
var/obj/machinery/vending/darth_vendor = hit
|
|
darth_vendor.tilt(user, 100)
|
|
return
|
|
else if(istype(hit, /obj/structure/window))
|
|
var/obj/structure/window/W = hit
|
|
splatWindow(user, W)
|
|
if(QDELETED(W))
|
|
return COMPONENT_MOVABLE_IMPACT_NEVERMIND
|
|
return
|
|
|
|
var/oopsie_mod = 0
|
|
var/danger_zone = (speed - 1) * 13 // for every extra speed we have over 1, take away 13 of the safest chance
|
|
danger_zone = max(min(danger_zone, 100), 1)
|
|
|
|
if(HAS_TRAIT(user, TRAIT_BRAWLING_KNOCKDOWN_BLOCKED))
|
|
oopsie_mod -= 6
|
|
if(HAS_TRAIT(user, TRAIT_HEAD_INJURY_BLOCKED))
|
|
oopsie_mod -= 6
|
|
|
|
var/obj/item/organ/cyberimp/chest/spine/potential_spine = user.get_organ_slot(ORGAN_SLOT_SPINE) // Can't snap that spine if it's made of metal.
|
|
if(istype(potential_spine))
|
|
oopsie_mod -= potential_spine.strength_bonus
|
|
|
|
if(HAS_TRAIT(user, TRAIT_CLUMSY))
|
|
oopsie_mod += 6 //honk!
|
|
|
|
if(HAS_TRAIT(user, TRAIT_TACKLING_FRAIL_ATTACKER))
|
|
oopsie_mod += 6 // flies don't take smacking into a window/wall easily
|
|
|
|
var/oopsie = rand(danger_zone, 100)
|
|
if(oopsie >= 94 && oopsie_mod < 0) // good job avoiding getting paralyzed! gold star!
|
|
to_chat(user, span_notice("You're really glad you're wearing protection!"))
|
|
oopsie += oopsie_mod
|
|
|
|
switch(oopsie)
|
|
if(99 to INFINITY)
|
|
// can you imagine standing around minding your own business when all of the sudden some guy fucking launches himself into a wall at full speed and irreparably paralyzes himself?
|
|
user.visible_message(span_danger("[user] slams face-first into [hit] at an awkward angle, severing [user.p_their()] spinal column with a sickening crack! Fucking shit!"), span_userdanger("You slam face-first into [hit] at an awkward angle, severing your spinal column with a sickening crack! Fucking shit!"))
|
|
user.apply_damage(40, BRUTE, BODY_ZONE_HEAD, wound_bonus = 40)
|
|
user.apply_damage(30, STAMINA)
|
|
playsound(user, 'sound/effects/blob/blobattack.ogg', 60, TRUE)
|
|
playsound(user, 'sound/effects/splat.ogg', 70, TRUE)
|
|
playsound(user, 'sound/effects/wounds/crack2.ogg', 70, TRUE)
|
|
user.emote("scream")
|
|
user.gain_trauma(/datum/brain_trauma/severe/paralysis/paraplegic) // oopsie indeed!
|
|
shake_camera(user, 7, 7)
|
|
user.flash_act(1, TRUE, TRUE, length = 4.5)
|
|
|
|
if(97 to 98)
|
|
user.visible_message(span_danger("[user] slams skull-first into [hit] with a sound like crumpled paper, revealing a horrifying breakage in [user.p_their()] cranium! Holy shit!"), span_userdanger("You slam skull-first into [hit] and your senses are filled with warm goo flooding across your face! Your skull is open!"))
|
|
user.apply_damage(30, BRUTE, BODY_ZONE_HEAD, wound_bonus = 25)
|
|
user.apply_damage(30, STAMINA)
|
|
user.gain_trauma_type(BRAIN_TRAUMA_MILD)
|
|
playsound(user, 'sound/effects/blob/blobattack.ogg', 60, TRUE)
|
|
playsound(user, 'sound/effects/splat.ogg', 70, TRUE)
|
|
user.emote("gurgle")
|
|
shake_camera(user, 7, 7)
|
|
user.flash_act(1, TRUE, TRUE, length = 4.5)
|
|
|
|
if(93 to 96)
|
|
user.visible_message(span_danger("[user] slams face-first into [hit] with a concerning squish, immediately going limp!"), span_userdanger("You slam face-first into [hit], and immediately lose consciousness!"))
|
|
user.apply_damage(30, BRUTE, spread_damage = TRUE)
|
|
user.apply_damage(30, STAMINA)
|
|
user.Unconscious(10 SECONDS)
|
|
user.gain_trauma_type(BRAIN_TRAUMA_MILD)
|
|
user.playsound_local(get_turf(user), 'sound/items/weapons/flashbang.ogg', 100, TRUE, 8)
|
|
shake_camera(user, 6, 6)
|
|
user.flash_act(1, TRUE, TRUE, length = 3.5)
|
|
|
|
if(86 to 92)
|
|
user.visible_message(span_danger("[user] slams head-first into [hit], suffering major cranial trauma!"), span_userdanger("You slam head-first into [hit], and the world explodes around you!"))
|
|
user.apply_damage(30, BRUTE, spread_damage = TRUE)
|
|
user.apply_damage(30, STAMINA)
|
|
user.adjust_confusion(15 SECONDS)
|
|
if(prob(80))
|
|
user.gain_trauma(/datum/brain_trauma/mild/concussion)
|
|
user.playsound_local(get_turf(user), 'sound/items/weapons/flashbang.ogg', 100, TRUE, 8)
|
|
user.Knockdown(4 SECONDS)
|
|
shake_camera(user, 5, 5)
|
|
user.flash_act(1, TRUE, TRUE, length = 2.5)
|
|
|
|
if(68 to 85)
|
|
user.visible_message(span_danger("[user] slams hard into [hit], knocking [user.p_them()] senseless!"), span_userdanger("You slam hard into [hit], knocking yourself senseless!"))
|
|
user.apply_damage(10, BRUTE, spread_damage = TRUE)
|
|
user.apply_damage(30, STAMINA)
|
|
user.adjust_confusion(10 SECONDS)
|
|
user.Knockdown(3 SECONDS)
|
|
shake_camera(user, 3, 4)
|
|
|
|
if(1 to 67)
|
|
user.visible_message(span_danger("[user] slams into [hit]!"), span_userdanger("You slam into [hit]!"))
|
|
user.apply_damage(10, BRUTE, spread_damage = TRUE)
|
|
user.apply_damage(20, STAMINA)
|
|
user.Knockdown(2 SECONDS)
|
|
shake_camera(user, 2, 2)
|
|
|
|
playsound(user, 'sound/items/weapons/smash.ogg', 70, TRUE)
|
|
|
|
|
|
/datum/component/tackler/proc/resetTackle()
|
|
tackling = FALSE
|
|
QDEL_NULL(tackle_ref)
|
|
UnregisterSignal(parent, COMSIG_MOVABLE_MOVED)
|
|
|
|
///A special case for splatting for handling windows
|
|
/datum/component/tackler/proc/splatWindow(mob/living/carbon/user, obj/structure/window/windscreen_casualty)
|
|
playsound(user, 'sound/effects/glass/Glasshit.ogg', 140, TRUE)
|
|
|
|
if(windscreen_casualty.type in list(/obj/structure/window, /obj/structure/window/fulltile, /obj/structure/window/unanchored, /obj/structure/window/fulltile/unanchored)) // boring unreinforced windows
|
|
for(var/i in 1 to speed)
|
|
var/obj/item/shard/shard = new /obj/item/shard(get_turf(user))
|
|
var/datum/embedding/embed = shard.get_embed()
|
|
embed.embed_chance = 100
|
|
embed.ignore_throwspeed_threshold = TRUE
|
|
embed.impact_pain_mult = 1
|
|
user.hitby(shard, skipcatch = TRUE, hitpush = FALSE)
|
|
embed.embed_chance = initial(embed.embed_chance)
|
|
embed.ignore_throwspeed_threshold = initial(embed.ignore_throwspeed_threshold)
|
|
embed.impact_pain_mult = initial(embed.impact_pain_mult)
|
|
windscreen_casualty.atom_destruction()
|
|
user.adjustStaminaLoss(10 * speed)
|
|
user.Paralyze(3 SECONDS)
|
|
user.visible_message(span_danger("[user] smacks into [windscreen_casualty] and shatters it, shredding [user.p_them()]self with glass!"), span_userdanger("You smacks into [windscreen_casualty] and shatter it, shredding yourself with glass!"))
|
|
|
|
else
|
|
user.visible_message(span_danger("[user] smacks into [windscreen_casualty] like a bug!"), span_userdanger("You smacks into [windscreen_casualty] like a bug!"))
|
|
user.Paralyze(1 SECONDS)
|
|
user.Knockdown(3 SECONDS)
|
|
windscreen_casualty.take_damage(30 * speed)
|
|
user.adjustStaminaLoss(10 * speed, updating_stamina=FALSE)
|
|
user.adjustBruteLoss(5 * speed)
|
|
|
|
/datum/component/tackler/proc/delayedSmash(obj/structure/window/windscreen_casualty)
|
|
if(windscreen_casualty)
|
|
windscreen_casualty.atom_destruction()
|
|
playsound(windscreen_casualty, SFX_SHATTER, 70, TRUE)
|
|
|
|
///Check to see if we hit a table, and if so, make a big mess!
|
|
/datum/component/tackler/proc/checkObstacle(mob/living/carbon/owner)
|
|
SIGNAL_HANDLER
|
|
|
|
if(!tackling)
|
|
return
|
|
|
|
var/turf/our_turf = get_turf(owner)
|
|
var/obj/structure/table/kevved = locate(/obj/structure/table) in our_turf.contents
|
|
if(!kevved)
|
|
return
|
|
|
|
var/list/messes = list()
|
|
|
|
// we split the mess-making into two parts (check what we're gonna send flying, intermission for dealing with the tackler, then actually send stuff flying) for the benefit of making sure the face-slam text
|
|
// comes before the list of stuff that goes flying, but can still adjust text + damage to how much of a mess it made
|
|
for(var/obj/item/item_in_turf in our_turf.contents)
|
|
if(!item_in_turf.anchored)
|
|
messes += item_in_turf
|
|
if(messes.len >= MAX_TABLE_MESSES)
|
|
break
|
|
|
|
// for telling HOW big of a mess we just made
|
|
var/HOW_big_of_a_miss_did_we_just_make = ""
|
|
if(messes.len)
|
|
if(messes.len < MAX_TABLE_MESSES * 0.125)
|
|
HOW_big_of_a_miss_did_we_just_make = ", making a mess"
|
|
else if(messes.len < MAX_TABLE_MESSES * 0.25)
|
|
HOW_big_of_a_miss_did_we_just_make = ", making a big mess"
|
|
else if(messes.len < MAX_TABLE_MESSES * 0.5)
|
|
HOW_big_of_a_miss_did_we_just_make = ", making a giant mess"
|
|
else if(messes.len < MAX_TABLE_MESSES)
|
|
HOW_big_of_a_miss_did_we_just_make = ", making a gnarly mess"
|
|
else
|
|
HOW_big_of_a_miss_did_we_just_make = ", making a ginormous mess!" // an extra exclamation point!! for emphasis!!!
|
|
|
|
owner.visible_message(span_danger("[owner] trips over [kevved] and slams into it face-first[HOW_big_of_a_miss_did_we_just_make]!"), span_userdanger("You trip over [kevved] and slam into it face-first[HOW_big_of_a_miss_did_we_just_make]!"))
|
|
owner.adjustStaminaLoss(15 + messes.len * 2, updating_stamina = FALSE)
|
|
owner.adjustBruteLoss(8 + messes.len, updating_health = FALSE)
|
|
owner.Paralyze(0.4 SECONDS * messes.len) // .4 seconds of paralyze for each thing you knock around
|
|
owner.Knockdown(2 SECONDS + 0.4 SECONDS * messes.len) // 2 seconds of knockdown after the paralyze
|
|
owner.updatehealth()
|
|
|
|
for(var/obj/item/item_in_mess in messes)
|
|
// The amount of distance the object flies away when launched by our tackle
|
|
var/item_launch_distance = rand(1, 3)
|
|
// The transfered speed at which an item is launched by our tackle
|
|
var/item_launch_speed = 2
|
|
if(prob(25 * (src.speed - 1))) // if our tackle speed is higher than 1, with chance (speed - 1 * 25%), throw the thing at our tackle speed + 1
|
|
item_launch_speed = speed + 1
|
|
item_in_mess.throw_at(get_ranged_target_turf(item_in_mess, pick(GLOB.alldirs), range = item_launch_distance), range = item_launch_distance, speed = item_launch_speed)
|
|
item_in_mess.visible_message(span_danger("[item_in_mess] goes flying[item_launch_speed < EMBED_THROWSPEED_THRESHOLD ? "" : " dangerously fast" ]!")) // standard embed speed
|
|
|
|
var/datum/thrownthing/tackle = tackle_ref?.resolve()
|
|
|
|
playsound(owner, 'sound/items/weapons/smash.ogg', 70, TRUE)
|
|
if(tackle)
|
|
tackle.finalize(hit=TRUE)
|
|
resetTackle()
|
|
|
|
#undef MAX_TABLE_MESSES
|