From 4cda2f0494ab8ad0e44ac9fbd97ad48928f43f21 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 30 Aug 2024 10:35:42 -0500 Subject: [PATCH 1/7] Squashed commit of the following: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 020f625c8218857d5684bb08e2cac723c9d2a92f Merge: c49ac0276c d29a2b2a27 Author: FalloutFalcon Date: Fri Aug 30 10:26:10 2024 -0500 Merge branch 'fixes-orbit-menu-i-hope' of https://github.com/FalloutFalcon/ShiptestF into fixes-orbit-menu-i-hope commit c49ac0276c9222e1fe09544efe1483247c066996 Author: FalloutFalcon Date: Sun Aug 11 21:01:52 2024 -0500 small tweaks commit c98c1f78922282f31518a33652653325baa659c0 Author: FalloutFalcon Date: Sat Aug 10 21:36:59 2024 -0500 some player panel cruft and removes some random helms from centcomm commit 94cc46bf143adc7214debf309ea7985f42924f86 Author: FalloutFalcon Date: Sat Aug 10 21:28:03 2024 -0500 fixes player panel commit 2ab14bef0b8e61cc7f8172cbaf1637eadbf40187 Author: FalloutFalcon Date: Sat Aug 10 20:32:11 2024 -0500 dont add points of intrest twice please commit f7cb4afdd9f5346e03f6fd993e139101a3a011f4 Author: FalloutFalcon Date: Sat Aug 10 17:03:44 2024 -0500 small fix to syntax commit 4483c79aa094b2ecee44cc89bc3fe1352e2bae8a Author: FalloutFalcon Date: Sat Aug 10 17:01:44 2024 -0500 this? commit 853bf2674078acc6109157aba1a2dd2986e35450 Author: FalloutFalcon Date: Sat Aug 10 16:56:58 2024 -0500 oops had the syntax wrong on the const, was still using func syntax commit 670ae6e45c540e74b25c08888659db1407478fd0 Author: FalloutFalcon Date: Sat Aug 10 16:52:46 2024 -0500 const instead of functions commit e55a194fcb0a73f87d8005e34c5b15263ecb3d3c Author: Changelogs Date: Fri Aug 9 20:33:53 2024 -0500 Automatic changelog generation for PR #3264 [ci skip] commit 627a947ba4424547f7427324e4d84ea0623ad409 Author: firebudgy <153147550+firebudgy@users.noreply.github.com> Date: Fri Aug 9 20:12:47 2024 -0400 Vox Sprite Update - Scarves and other Assorted Items (#3264) For some reason while watching Gundam I got the urge to sit down and start doing things, so here I am. Creates onmob_neck_vox.dmi for Vox neck items. Adds Vox sprites for all the striped scarves in-game to Vox, as well as Shemaghs, Cameras and the Stethoscope. And chest-high towels. And industrial jackets. And updates the palette on security HUDs and medical HUDs. ![image](https://github.com/user-attachments/assets/5fb64134-8e0e-49b7-8fe2-281184babfb5) ![image](https://github.com/user-attachments/assets/e68b6e4c-17bf-4bd2-bf00-fa39fbc017d1) ![image](https://github.com/user-attachments/assets/fd847523-87a0-40ba-a510-c3fbb8c604ba) ![image](https://github.com/user-attachments/assets/7cc64efc-cb23-46bf-828f-72bd7d98d071) ![image](https://github.com/user-attachments/assets/c2366b63-e925-42c6-bd84-051bba2cde36) ![image](https://github.com/user-attachments/assets/596add83-4423-4653-a1a3-4d9c6a2f7966) ![image](https://github.com/user-attachments/assets/4a6adb9f-b8a2-415f-ab3b-35e02bc6291e) ![image](https://github.com/user-attachments/assets/0f189fe1-7a99-47ac-ab23-63b5b052d3fa) ![image](https://github.com/user-attachments/assets/c8ef064f-3764-4142-b5ae-cacee6a9c93d) Adds more supported items for the Vox, which is pretty cool I think. Hopefully, plenty of people will appreciate the more customization options. :cl: add: Sprites for several different kinds of scarves for Vox! add: Additional sprites for several other items for Vox, such as chest-high towels and hazard jackets. add: Created onmob_neck_vox.dmi file, plus enabled support for it. /:cl: commit ffea7f0bce0c7574884c768b7d95a300e76a9711 Author: Changelogs Date: Fri Aug 9 20:19:59 2024 -0500 Automatic changelog generation for PR #3260 [ci skip] commit 810df8ae58a54b616cc3164b3631f09a3c04eac3 Author: Latency <55075747+Latentish@users.noreply.github.com> Date: Fri Aug 9 17:12:24 2024 -0700 Give the Talos a Corpsman (#3260) Adds the corpsman role to the Talos,. The talos has lost its surgery medkit, which has been replaced with a brute and burn kit. Surgery is dummy busted, not having a medic on a milship forces the role on someone else. :cl:phoaly balance: Talos Corpsman has been readded with a different medkit loadout. /:cl: commit 1404861478021274c361a74133fbc8d198382f9e Author: Changelogs Date: Fri Aug 9 20:06:55 2024 -0500 Automatic changelog generation for PR #3278 [ci skip] commit daced87719f9f6e82173be02d6c1a16fa8a34f0f Author: generalthrax <139387950+generalthrax@users.noreply.github.com> Date: Fri Aug 9 17:11:49 2024 -0700 Industrial Jacket Warm (For Real) (#3278) adds one line i forgot to add its Bleak :cl: fix: Fixes the Industrial Jacket to be warm (For Real) /:cl: commit d6f8a56209794e495bca5aa2f60cd6d239ea5854 Author: Changelogs Date: Sat Aug 10 00:56:08 2024 +0000 Automatic changelog compile [ci skip] commit d594becb624dcd648fd4baee89df3acf39e9e789 Author: Changelogs Date: Fri Aug 9 19:44:27 2024 -0500 Automatic changelog generation for PR #3279 [ci skip] commit 35e1b8978c8138eaf69c403454ebc3ccbcaec691 Author: generalthrax <139387950+generalthrax@users.noreply.github.com> Date: Fri Aug 9 17:10:53 2024 -0700 Cleanbots destroy cigarette butts (#3279) Cleanbots now shoot acid at cigarette butts like they do to normal trash. Increased the amount of acid cleanbots shoot out by an amount so the trash actually gets destroyed. To restore order in a ship full of smokers :cl: add: Cleanbots now destroy cigarette butts, and dispense enough acid to do so. /:cl: commit 60b7f1060508c39705cb65ff8c29d2da59f54446 Author: Changelogs Date: Fri Aug 9 19:20:45 2024 -0500 Automatic changelog generation for PR #3281 [ci skip] commit 3e7162065180b588d840e391c5ac6ffff86ba614 Author: rye-rice <58402542+rye-rice@users.noreply.github.com> Date: Fri Aug 9 17:10:14 2024 -0700 Fixes indie sec hardsuit sprite (#3281) Fixes the indie sec hardsuit not showing up on digi ![image](https://github.com/user-attachments/assets/7f965a42-0945-4a0c-ace1-b29378eb7b60) I fucked up :cl: fix: indie sec hardsuit now shows up /:cl: Co-authored-by: retlaw34 <58402542+retlaw34@users.noreply.github.com> commit 7972bc9ef24023e092f3711aba48e99b4f10eabc Author: Changelogs Date: Wed Aug 7 00:56:28 2024 +0000 Automatic changelog compile [ci skip] commit 56912079049e3fd846181c4ab7168bff094fa3ee Author: Changelogs Date: Tue Aug 6 03:33:04 2024 -0500 Automatic changelog generation for PR #3006 [ci skip] commit 2f286eed910c43f081245a4cc05d761ccff1727a Author: Sadhorizon <108196626+Sadhorizon@users.noreply.github.com> Date: Tue Aug 6 10:21:53 2024 +0200 Remaps the Dwayne. (#3006) As the title might hint, this remaps the Dwayne. **TODO:** - [x] hydrogen thrusters (after that PR is merged) - [x] fix bridge - [x] fix atmos - [x] finish the wiki page --- not finished, but good enough for now - [x] processing console directionals Most glaring changes are addition of second hangar (dedicated to cargo), addition of crew areas, addition of a smelter setup, and removal of medical area. Miners have lost some gear too - namely, crusher, KA and the explorer suits are now dead. Also fixes a bunch of weird issues Dwayne had. But yea, this is pretty much a complete remap. Every room was tweaked pretty hard, while trying to keep the ship's soul. ![scrnshot1](https://github.com/shiptest-ss13/Shiptest/assets/108196626/a8e2cbf5-5b96-4520-ba3a-25ded82d41be) ![StrongDMM-2024-07-09 00 04 40](https://github.com/shiptest-ss13/Shiptest/assets/108196626/84c7539f-1e54-481d-a213-2f94008f585f) ![StrongDMM-2024-07-01 01 24 00](https://github.com/shiptest-ss13/Shiptest/assets/108196626/568d2514-56df-4f2b-8c44-97579c9fbc9f) **JOB SLOT CHANGES:** - No doctor - there is no medical. What do you want them to do??? - Two less deckhands - you REALLY don't need three. Dwayne is old and can use some tweaks. :cl: tweak: Remapped the Dwayne-class Long Range Mining Transport. add: Added a random plushie spawner and a random moth plushie spawner. /:cl: commit b1f6111af4838ace236b81b790fb996f0c8d6947 Author: Changelogs Date: Tue Aug 6 02:49:06 2024 -0500 Automatic changelog generation for PR #3180 [ci skip] commit b7e2688505dc2a3ba2e741bda59a447bbd19cb14 Author: HelmCrab <90987989+Thera-Pissed@users.noreply.github.com> Date: Tue Aug 6 02:39:16 2024 -0500 Hazardous Gases (Cl and HCl) (#3180) Adds chlorine gas and hydrogen chloride gas These gases hurt to be exposed to in high concentration if not in EVA Plasma, Trit, Cl, and HCl now damage eyes if not wearing goggles (welding, heat, or cold goggles currently) Chlorine reacts with hydrogen to make HCl and makes heat while doing so. HCl burns into H2O and Cl. ![image](https://github.com/shiptest-ss13/Shiptest/assets/90987989/e0263c74-0958-475f-b956-4024b32ed237) ![image](https://github.com/user-attachments/assets/ac384206-c567-4baa-9fbc-42ec56a5e02e) Scrubbers are now set to filter most gases at roundstart. Hazardous planetary gases! (not actually implemented in this PR, but opens up the possibility) More gases that are actually relevant to Normal shiptest rounds is good, since there's few station gases that can be reasonably seen or made (freon has been made like once. stimulum and nitryl are dumb. likely could be removed) :cl: add: Chlorine and Hydrogen Chloride gases! Wear your goggles! /:cl: --------- Signed-off-by: HelmCrab <90987989+Thera-Pissed@users.noreply.github.com> Co-authored-by: Mark Suckerberg Co-authored-by: JimKil3 <47290811+JimKil3@users.noreply.github.com> Co-authored-by: goober3 <118859017+goober3@users.noreply.github.com> Co-authored-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Co-authored-by: rye-rice <58402542+rye-rice@users.noreply.github.com> Co-authored-by: Theos commit 5438affef0de4e7506afb336c585c1841c2ab61b Author: Paynt <45183811+Major00@users.noreply.github.com> Date: Mon Aug 5 20:27:08 2024 -0400 Saint Roumain Kepori outfits (#3262) Makes Kepori variations for the SRM outfits. Thanks to ryerice and spookypineapple for hanging out and helping me with these! **uniform** ![Screenshot 2024-08-02 011344](https://github.com/user-attachments/assets/831e8bac-1c3a-42a3-a8d8-27441ace650c) **shadow** ![Screenshot 2024-08-02 011922](https://github.com/user-attachments/assets/834cdb8a-971d-40d2-be78-206bbb4b2eff) **Hunter** ![Screenshot 2024-08-02 012056](https://github.com/user-attachments/assets/e69e1fb7-8e7b-4dee-a9fc-810afc680c38) **Hunter Doctor** ![Screenshot 2024-08-02 012340](https://github.com/user-attachments/assets/948f3c06-4113-44e5-9bfd-2b2efaa71aaf) **Flamebearer** ![Screenshot 2024-08-02 012544](https://github.com/user-attachments/assets/f02934ea-79e1-4cfd-a5ea-127b0a2cc545) **Colligne** ![Screenshot 2024-08-02 012745](https://github.com/user-attachments/assets/0e95e4b1-c920-48a2-8fd5-d323cc53590f) **montange** ![Screenshot 2024-08-02 013047](https://github.com/user-attachments/assets/6fd7504f-4e7e-4a44-a627-9649ca19094a) **Hardsuit** ![Screenshot 2024-08-02 013807](https://github.com/user-attachments/assets/cbac829e-73d0-43a1-ad53-ce810f7d7c51) Kepori can finally be played in the SRM :cl: add: Added new things add: Added more things imageadd: added some icons and images code: changed some code /:cl: commit 74ed9ba8bfb0cdd2a75b58758e539abc4b9c7de4 Author: Changelogs Date: Sun Aug 4 00:59:50 2024 +0000 Automatic changelog compile [ci skip] commit 850d59a2cf92e1b88336fd4fb39e3dcd2290ab12 Author: Changelogs Date: Sat Aug 3 07:08:34 2024 -0500 Automatic changelog generation for PR #3222 [ci skip] commit fd067f9ded9afcbe361eb00824b8254a2665fbd0 Author: zevo <95449138+Zevotech@users.noreply.github.com> Date: Sat Aug 3 06:22:15 2024 -0400 Social Anxiety quirk fixes and tweaks (#3222) Changes some things about the social anxiety quirk to make it more bearable to deal with. - Removes the ability for it to silence you, which would eat messages players tried to send while roleplaying. - Decreases the severity of stuttering across the board, and prevents it from removing characters in the message. - Psicodine now actually suppresses the main effects of social anxiety while it is active, making the medicine actually usable once more. Players were unable to use this quirk due to a variety of reasons. It would randomly silence you around people, give you an exaggerated stutter that made your runechat impossible to read, and couldn't even be suppressed because it's treatment medication was bugged and had very little use outside of it. Now the quirk is a little more managable, and players should be able to take it and roleplay with it again. I may mess with the stutter further if needed as I still think its a little extreme in some cases. :cl: balance: the Quirk Social Anxiety no longer silences you randomly fix: Stuttering is now far less extreme and will not delete characters fix: Psicodine now actually suppresses the effects of social anxiety /:cl: commit aa9f93c70304c73157d55b7d64724e2fed0da733 Author: Changelogs Date: Sat Aug 3 06:56:25 2024 -0500 Automatic changelog generation for PR #3225 [ci skip] commit cd4afda688ec07aeb0bf0b122a9332446d027975 Author: Gristlebee <56049844+Gristlebee@users.noreply.github.com> Date: Sat Aug 3 03:21:18 2024 -0700 Sandbags can be bought at the outpost and deconstructed by click dragging them onto yourself (#3225) Adds empty sandbags to the outpost, 7 sandbags for 150 under the sec supply tab Sandbags can be deconned by click dragging them onto your mob and a short do after. Adds an examine message for how to decon. Sandbags are odious to use currently, being effectively single use once deployed and just sitting there once the fight's done. If you want to clean them up afterwards you're stuck smashing them apart until they break These changes should make sandbags more accessible and practical to use. :cl: add: Sandbags can be deconed by click dragging them onto your mob. add: Sandbags to the outpost for 150 credits. /:cl: commit ae65633662979d0fefb199ba2648b404d9457522 Author: Changelogs Date: Sat Aug 3 06:44:13 2024 -0500 Automatic changelog generation for PR #3240 [ci skip] commit 8d3711c4e4993328f7b04603b8ba71a1b339d2a1 Author: Martinpachu <86135885+Martinpachu@users.noreply.github.com> Date: Sat Aug 3 07:20:07 2024 -0300 Autolathable stripper clips and 7.62 polymer rifle. (#3240) Requested by Apogee. Makes all stripper clips able to be created at the autolathe, since they're supposed to be simple, cheap, disposable things, as opposed to magazines which are more complex and important. They don't get built with ammo, of course. And the polymer rifle gets changed to being chambered in 7.62, which has the same stats as .300 blackout. They've been done in the same PR since it'll add the polymer rifle's 762 speedloader to the autolathe too. Clips are supposed to be disposable cheap things, when right now they're equal to speedloaders and magazines. The polymer rifle having a special bullet type all to itself that you could get only by killing hermits was a bit befuddling. :cl: add: Clips of all kinds (not magazines!) can now be produced on the autolathe. del: .300 blackout. The polymer rifle now fires 7.62. del: Clip cargo packs, as they are now redundant. /:cl: commit dc06dd10f2d810dd567804fe4bbb7670f6f24b19 Author: Changelogs Date: Sat Aug 3 06:29:39 2024 -0500 Automatic changelog generation for PR #3234 [ci skip] commit c4a5eddd458283783a1f5de399db335453447e64 Author: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Sat Aug 3 05:18:44 2024 -0500 Legions drop less money (#3234) swaps money drops from medium to small legions drop a bit too much money right now? :cl: balance: nerfed legion money drops. /:cl: commit bb23404cbeba984a47376bfcc053fb98c6fa8c05 Author: Changelogs Date: Sat Aug 3 06:16:53 2024 -0500 Automatic changelog generation for PR #3229 [ci skip] commit e8ce1702f2bf4535c31614d10234e461c5627b34 Author: Apogee-dev <60533805+Apogee-dev@users.noreply.github.com> Date: Sat Aug 3 03:16:00 2024 -0700 Removes Syndie survival boxes (#3229) Gives Syndicate outfit datums the same boxes as their normal equivalents, flattening that part of job gear and getting rid of the annoying syndicate gas mask issue so those can be treated like the specialty masks they are. why did syndies get a snowflake box anyway. no other faction does :cl: balance: Replaced syndie survival boxes in outfit datums with normal job-equivalent boxes /:cl: commit f44532dd6ec1df0562fef1d4b2e564def7c6356a Author: Changelogs Date: Sat Aug 3 06:04:42 2024 -0500 Automatic changelog generation for PR #3263 [ci skip] commit b77b5a195f24d58faf7b05a8353f764422251c78 Author: Latency <55075747+Latentish@users.noreply.github.com> Date: Sat Aug 3 03:12:21 2024 -0700 Buffs the LP hardsuits (#3263) - These are their primary gear, they better be good in comparison to others. This buffs the armor values of the LP hardsuits and adds slowdown reduction and a reagent scanner to the medical hardsuit. The Ranger's whole shtick is that it revolves around the faux ert team. they have little in the way of guns so their hardsuits are important. They were meant to stay in level with other similar hardsuits but have remained unmaintained. :cl:phoaly balance: Buffed LP hardsuits /:cl: commit d18ceb11c4cc306fb5643c00f93d3a100ce9fc7d Author: Changelogs Date: Sat Aug 3 05:52:00 2024 -0500 Automatic changelog generation for PR #3265 [ci skip] commit 7df058b1ef342c9c7a808dc549afb10da38a9874 Author: firebudgy <153147550+firebudgy@users.noreply.github.com> Date: Sat Aug 3 06:12:11 2024 -0400 Fixes three total typos in the code. (#3265) Fixes some small errors in the code. Hooray! Game is playable again! :cl: fix: Fixed three typos in the code. /:cl: commit 75a907595bc6f233db615d6698ad283acce6b931 Author: Changelogs Date: Sat Aug 3 05:39:44 2024 -0500 Automatic changelog generation for PR #3198 [ci skip] commit 399a806481d09e5c435ac2f90dd41c7221a73917 Author: Sadhorizon <108196626+Sadhorizon@users.noreply.github.com> Date: Sat Aug 3 12:06:24 2024 +0200 Adds directionals for the mining processing console/electrolyzer console. (#3198) Taking this out of the Dwayne remap, cuz it really should just be a seperate PR. As title suggests, directionals now exist. Also rotates the consoles in in the outposts. They look weird without directionals. :cl: imageadd: Added directionals for mining processing consoles. /:cl: commit 55615ba191987c909507e665122b5cc0cee04bbf Author: Changelogs Date: Sat Aug 3 05:27:19 2024 -0500 Automatic changelog generation for PR #3195 [ci skip] commit 0477796ed8ef8809b9f3e24173a18b9e4d1d8d1a Author: Apogee-dev <60533805+Apogee-dev@users.noreply.github.com> Date: Sat Aug 3 03:05:54 2024 -0700 Consistent Exosuit Terminology (#3195) Changes just about every player-facing instance of the word "mech" to "exosuit." God help me, I did this manually so there shouldn't be any stupid find-and-replace shenanigans. Consistent terminology is good, and maybe people will stop thinking the overgrown power armor is a gundam. :cl: fix: Changed almost every player facing instance of the word "mech" to "exosuit" /:cl: commit 6b258916100e8150c4a7810799ef843d81a66ba2 Author: Changelogs Date: Sat Aug 3 05:15:07 2024 -0500 Automatic changelog generation for PR #3202 [ci skip] commit bb2164d6cb0cee1070aaa788c8d92168a65927db Author: HelmCrab <90987989+Thera-Pissed@users.noreply.github.com> Date: Sat Aug 3 05:05:07 2024 -0500 Combustion & Electrolyzer fixes (#3202) Hydrogen now burns with the correct (I think) enthalpy, making hydrogen TEGs viable. yay! Komodo, Skipper, and Inkwell get instruction sheets. Crying-sun had one and the upcoming dwayne remap adds one. Electrolyzers now try to link when ice goes in instead of on init, which caused certain maps to not connect. Electrolyzer multitool linking works now. Merits can no longer turn into a magic 0 value slip. Replaces nt_ice passive pumps with volume pumps (skipper keeps hydrogen, the commits lie) Hydrogen pumps not correctly connecting to the pipenet even when the Other recent map bug isn't in effect is still an issue, but I've got no idea how to fix it. Leaving it as an issue for now. fixed single wrong pixel on the sprite. new ![image](https://github.com/user-attachments/assets/575e4ef0-5f29-4fc8-bbf6-cc2d57eb28c4) old ![image](https://github.com/user-attachments/assets/2165bc33-f260-41ab-934d-3f6a90062277) Fixes some of my mistakes. :cl: fix: hydrogen and combustion bugs /:cl: commit 637161e0660f88d1d0b46c22e8d922b561790fbc Author: Changelogs Date: Fri Aug 2 21:49:55 2024 -0500 Automatic changelog generation for PR #3267 [ci skip] commit 269f136dd61960a5a2cff46e3b48b21a5e8e3145 Author: Imaginos16 <77556824+Imaginos16@users.noreply.github.com> Date: Fri Aug 2 19:39:22 2024 -0700 Muzzle Flash-ening! (#3267) Resprites muzzle flashes so that they no longer look like transparent jpgs! ![image](https://github.com/user-attachments/assets/eea2f9c3-e331-462c-8dcb-dcd095eef6a3) Why did TGMC have literal jpg cutouts and call that muzzle flashes? Actually deranged. :cl: PositiveEntropy imageadd: Resprites muzzle flashes! /:cl: commit 83b359342f32598cc76ae59cd9dd7e16695cdf42 Author: Changelogs Date: Sat Aug 3 00:54:47 2024 +0000 Automatic changelog compile [ci skip] commit 900c4c473613726c7748152654266a837b23f165 Author: Changelogs Date: Fri Aug 2 02:21:33 2024 -0500 Automatic changelog generation for PR #3247 [ci skip] commit 929682320d557edf25cf858aa3f9779f1c7de14f Author: Sadhorizon <108196626+Sadhorizon@users.noreply.github.com> Date: Fri Aug 2 09:11:12 2024 +0200 Makes oxygen tanks at the outpost very cheap. (#3247) What if internals were cheap AF at the outpost? Would people actually buy them, instead of stealing from legions/hermits? Probably not, but worth a try. Reduces the price of internals crate to a whopping 100 credits and changes the contents: 2 gas masks, 2 breathe masks -> 4 breathe masks 2 empty small tanks, 2 empty big tanks -> 3 full adv tanks, 1 full big tank Reduces the price of plasmaman tank kit to 100 credits, makes the tanks full, renames to "plasmaman internals crate". :cl: tweak: Internals Crate now costs 100 credits and contains full oxygen tanks. tweak: Plasmaman Tank Kit renamed to Plasmaman Internals Crate. It now costs 100 credits and contains full plasma tanks. /:cl: commit 37de7db2f60822e4c380714530f0019ae9283415 Author: Changelogs Date: Thu Aug 1 23:16:57 2024 -0500 Automatic changelog generation for PR #3242 [ci skip] commit 488843e2c65e43dac6e6865767a6d6e2d66cc8b5 Author: Martinpachu <86135885+Martinpachu@users.noreply.github.com> Date: Fri Aug 2 00:14:17 2024 -0300 Makes 8x50 boxes have exactly 5 rounds more. (#3242) Mystery PR. Makes ammo for the illestren slightly cheaper! Enough for it to be as good economically as pistols i think. :cl: balance: 8x50 boxes now come with 25 ammo as opposed to 20. /:cl: commit 773fd896b8768f3cf614c4fdff370621eef35214 Author: Changelogs Date: Thu Aug 1 23:04:36 2024 -0500 Automatic changelog generation for PR #3236 [ci skip] commit 346cf928f3b6c41840cd885609d9f28f3a88ee65 Author: Yata9arasu_alt <58084138+Yata9ar4su@users.noreply.github.com> Date: Fri Aug 2 10:09:05 2024 +0700 Fixed: wrong cash bundle value, cash dropping upon stacking (#3236) Fixing wrong cash bundle value, cash dropping upon stacking Can now collect and stack money without dropping it on the floor. Working as intended Cash bundle values before (wrong): ![image](https://github.com/user-attachments/assets/65f7da39-1996-4bf0-95ba-df6b98f12342) Cash bundle values after (right): ![image](https://github.com/user-attachments/assets/79b51f48-4a99-407a-87e0-a60a96fe2a2c) And money stacking: ![ezgif-5-8e33dfacb3](https://github.com/user-attachments/assets/8251068a-1e51-4229-b70d-d37d740f86d0) :cl: fix: Cash bundle value will now be correct in chat, cash will not drop upon stacking /:cl: commit 0f8a8fec1ee681d99a63199be1a7e53f0c2e17a9 Author: Changelogs Date: Thu Aug 1 22:40:26 2024 -0500 Automatic changelog generation for PR #3253 [ci skip] commit 25c48171336e947ecad824806bade60e1df3a003 Author: CoreyLee Hassell Date: Thu Aug 1 23:05:38 2024 -0400 Fixed gun executions (#3253) Fixes executions. Also fired off a few other rounds to make sure nothing else was wonky. No Kepori were actually harmed in the making of this film. ![dreamseeker_W5IavcWlZT](https://github.com/user-attachments/assets/81aa66eb-41d1-46ba-8633-d9d822d111fb) There was a circular logic issue that arose with the gun.dm refactor from a couple months ago and that's what was causing the issue. Fixes https://github.com/shiptest-ss13/Shiptest/issues/3252 Intended feature is working again :cl: fix: Executing someone with a gun is back, you psychos. Paint the floor red! /:cl: commit 550ee68a672151ec3e939838461bdfb36324e64d Author: Changelogs Date: Thu Aug 1 22:28:13 2024 -0500 Automatic changelog generation for PR #3254 [ci skip] commit f8f7b49b58c5f27f18d8e5ab55d5866550723aa6 Author: zimon9 <122945887+zimon9@users.noreply.github.com> Date: Thu Aug 1 23:04:55 2024 -0400 Adds an anesthetics crate to cargo (#3254) This PR adds a cargo crate containing an Anesthetics tank and a medical mask for it, for 500 credits. It's rather difficult to get good quality anesthetics in-game without having to resort to ghetto chemistry, salvaging for it, or by hoping to get lucky with the black market. This PR should give an option for those that want anesthetics available in-round, in a way that makes sense for a medical professional to acquire. :cl: add: an anesthetics crate /:cl: commit 16d12051952622058c696cd2ce6860282d0e91d4 Author: Changelogs Date: Thu Aug 1 22:14:58 2024 -0500 Automatic changelog generation for PR #3241 [ci skip] commit 511586bb0f17d41f98868bfb71eb67a500c9ee6f Author: Theos Date: Thu Aug 1 23:04:33 2024 -0400 Guncase fix 2 (#3241) Fixes #3232 :cl: fix: mini/energy gun cases no longer spawn with the wrong weapon in them /:cl: Signed-off-by: Theos commit 79faf3bd75a3634b1039960ae6624e639eeddb3f Author: Changelogs Date: Thu Aug 1 21:02:50 2024 -0500 Automatic changelog generation for PR #3255 [ci skip] commit 077f4457d665c63281f1ae0d57debf6c431d3393 Author: firebudgy <153147550+firebudgy@users.noreply.github.com> Date: Thu Aug 1 21:52:00 2024 -0400 Additional sprites for Vox - Inteq and NGR (#3255) Added Vox Variations for the HV outfit, the Blood-Red Hazard Vest and two NGR hard hats. Also resprites the Vox Vanguard Battlecoat to closer match the current iteration with significant help from Rylie/Retlaw34/Ryerice. - Honorable Vanguard Beret - Honorable Vanguard Battlecoat - Vanguard Battlecoat - Leather Satchel - Blood Red Hazard Vest - NGR Hard Hat - NGR Foreman Hard Hat ![image](https://github.com/user-attachments/assets/e301f60c-2a23-4461-be34-e039301f339a) ![image](https://github.com/user-attachments/assets/5494cba3-ab60-4a01-9c28-26c148bf594d) ![image](https://github.com/user-attachments/assets/4857d900-50f9-4f92-b8a3-b9059997b3b0) ![image](https://github.com/user-attachments/assets/b2c6cfa0-318a-415c-80b0-5e051f3fd7ca) (honestly this satchel looks pretty bad in general but I figured i'd get it out of the way) ![image](https://github.com/user-attachments/assets/153fabb3-2ef3-497f-98b0-a98601232e24) Some of these sprites were some I saw people sad about lacking, and I figured that I might as well get off my lazy ass and do something about it. Knocked the HV gear out of the way and did a bit of a resprite for the Vanguard Battlecoat after being suggested to do it by a few people. :cl: add: New sprites for Vox! Vanguard and Honorable Vanguard Battlecoat sprite changes, NGR hard hats, and hazard vests! /:cl: commit 1cde96bbcc279c359203e832e1e8aedd7129b549 Author: Changelogs Date: Thu Aug 1 20:44:14 2024 -0500 Automatic changelog generation for PR #3259 [ci skip] commit de314e2c07ebd12c98ef576fb2093dce2c0769d1 Author: generalthrax <139387950+generalthrax@users.noreply.github.com> Date: Thu Aug 1 16:45:25 2024 -0700 Cargo Typos (Contender) (#3259) Beacon got renamed a long while ago Yeah :cl: fix: Contender is now called the Beacon in cargo fix: .38 is now .38 and no longer has a bunch of random letters in front of it /:cl: commit 1f14419eb7af6706ca2bd5b214da29c6a556a05f Author: Changelogs Date: Thu Aug 1 20:31:07 2024 -0500 Automatic changelog generation for PR #3257 [ci skip] commit e1148b0f03d99fef76933265459a84ace87d1ca5 Author: Theos Date: Thu Aug 1 19:45:05 2024 -0400 Attachments are now small instead of normal sized (#3257) Allows attachments to be carried in things like boxes and pockets. This is mostly useless since there is very little reason to not have an attachment glued to a gun after buying it, but suppressors being untenable to store (either taking up a bunch of bag space or making a gun potentially impossible to stow) is a bit silly :cl: balance: gun attachments are now small instead of normal sized /:cl: Signed-off-by: Theos commit 1eb39f2a60f035858a32a4919ae7d5de1a3e7953 Author: Changelogs Date: Thu Aug 1 20:07:12 2024 -0500 Automatic changelog generation for PR #3251 [ci skip] commit 20bf7fb51178a5cc4515855ddd439e5471a4a99a Author: generalthrax <139387950+generalthrax@users.noreply.github.com> Date: Thu Aug 1 16:44:16 2024 -0700 makes the industrial jacket warm (#3251) Gives the industrial jacket cold protection It looks pretty comfy and warm but isn't. It's kind of Strange :cl: add: Industrial jacket now keeps you warm /:cl: commit 6d60f7f233690e2711997da6ec0813420d5e7c81 Author: Changelogs Date: Fri Aug 2 00:55:20 2024 +0000 Automatic changelog compile [ci skip] commit 6d35af2efbb1ffca4d2d19ad63f7e4e894db6d77 Author: Changelogs Date: Thu Aug 1 19:51:58 2024 -0500 Automatic changelog generation for PR #3217 [ci skip] commit 93aacd50208d98770f40057dbb0b063d3ec61589 Author: Sadhorizon <108196626+Sadhorizon@users.noreply.github.com> Date: Fri Aug 2 01:44:06 2024 +0200 Coffee jitter nerf. (#3217) Variants of coffee (cafe latte, iced coffee, hot ice coffee, soy latte) now only jitter on OD, same as normal coffee. It's annoying as hell to jitter all the time, just because your character likes coffee. :cl: tweak: Cafe latte, iced coffee, hot ice coffee and soy latte now only make your character jitter on OD. /:cl: commit aba599dbfcaff611dc12f43e88aca450e9aab724 Author: Changelogs Date: Thu Aug 1 19:25:43 2024 -0500 Automatic changelog generation for PR #3221 [ci skip] commit 5b0d88afc5aa815081c6a749d3e3097c7c54b961 Author: Sadhorizon <108196626+Sadhorizon@users.noreply.github.com> Date: Fri Aug 2 01:41:57 2024 +0200 Reduces prices of first aid kits. (#3221) Standard: 750 -> 400 Brute/Burn: 1250 -> 700 Oxy/Tox: 1250 -> 500 Rad: 1000 -> 500 Those prices weren't really that affordable in-game. Spending a 1000 credits on a single medikit is kinda goofy. This fixes that, in hopes that medikits are more used in general. :cl: tweak: Reduced the prices of first aid kits. /:cl: commit d014feecc43103520edf972af8f1e182944ab6bb Author: Changelogs Date: Thu Aug 1 19:12:24 2024 -0500 Automatic changelog generation for PR #3186 [ci skip] commit 027e88f4d309b01e7e17c4cc4d72c832654d5920 Author: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Thu Aug 1 18:40:42 2024 -0500 distress signal admin button (#3186) A simple button that creates a announcement on whatever ship your hovering over! ![image](https://github.com/shiptest-ss13/Shiptest/assets/86381784/a38409fb-9530-47ba-9c77-cb28e8e75645) ![image](https://github.com/shiptest-ss13/Shiptest/assets/86381784/6230d9da-246c-41ee-8e08-7453a275c400) ![image](https://github.com/shiptest-ss13/Shiptest/assets/86381784/4317a4a6-0a6b-4550-89df-47a7248d31ca) Should save admins a lot of time :cl: add: New admin button to launch a distress announcement quicker. /:cl: commit b4824499e223c54b6c60d48665994db64e851a3d Author: Changelogs Date: Thu Aug 1 18:59:34 2024 -0500 Automatic changelog generation for PR #3141 [ci skip] commit ca878ff286a5681b01d300c826ed4bb34feb165b Author: Theos Date: Thu Aug 1 19:39:24 2024 -0400 Legion attacks now kill you slower (#3141) Getting attacked by a legion skull while unconscious now causes it to generate a funny new organ (and staunch some current bleeding, so the victim will die slower) which will eventually transform you into a legion if untreated. Legion skulls will also not attack people who are in hardcrit. If a surgical table is not present, the onset of legionnification can be postponed by injecting spaceacillin or synaptizine, which halt the disease's progress while being metabolized. Dying instantly? boring !! time for drama. :cl: add: legion attacks will now inject an organ which eventually causes a transformation, rather than instantly killing and transforming people. /:cl: --------- Signed-off-by: Theos commit 07d7c9206bf84dda1df88ab1ee377ef63e3041f1 Author: Changelogs Date: Thu Aug 1 18:36:04 2024 -0500 Automatic changelog generation for PR #3199 [ci skip] commit b959160931a1a1b2e90301a929015da6e7b570b9 Author: Sadhorizon <108196626+Sadhorizon@users.noreply.github.com> Date: Fri Aug 2 01:25:15 2024 +0200 Remaps the Kilo (#3199) This remaps the Kilo. **TODO:** - [x] ship desc - [ ] wiki page - [x] Maurice - [ ] processing console directionals Hull is now made from metal instead of titanium. The manufacturer was swapped from NT to Miskilamo. Crew areas were expanded. KA and Egun were swapped for two DBs - have fun with this one. Wires got a tiny bit messier. Starting cash was nerfed from 5500 to 3500. ORM was replaced with a smelter setup. ![scrnshot1](https://github.com/user-attachments/assets/91611c45-9b0c-4f0b-a929-f0fdc485570c) ![StrongDMM-2024-07-19 13 24 26](https://github.com/user-attachments/assets/2a65ac1d-2aa8-43d9-9bb8-b9019177ed42) ![StrongDMM-2024-07-14 01 21 13](https://github.com/user-attachments/assets/4babaf21-6143-48cb-8e47-95e76f50da2f) **JOB SLOT CHANGES:** - No doctor - There never was a medical. Why were they here? - One more deckhand - Apogee requested the ship to stay at 5 crew members. Kilo's ancient. This modernizes it. :cl: tweak: Remapped the Kilo-class Mining Ship /:cl: commit e16c200c595a52d7e992313aadef5936dbe25bae Author: Changelogs Date: Wed Jul 31 00:45:05 2024 +0000 Automatic changelog compile [ci skip] commit bdd3c4f3ddfcaedc19a33fa94e67791e79c40067 Author: Changelogs Date: Tue Jul 30 17:37:26 2024 -0500 Automatic changelog generation for PR #3148 [ci skip] commit 749a2994bd01a1e20a8421378b3e3627ae70356e Author: Tsar-Salat <62388554+Tsar-Salat@users.noreply.github.com> Date: Tue Jul 30 18:25:33 2024 -0400 [MDB Ignore] Rkz's Newfood: Part 1 of 4 (#3148) This is a port of my beestation newfood pr. It's the culmination of many months of effort during my free time in university, and my first large-scale project on bee. Due to interest from a few shiptest people, I have ported the PR mostly-as-is from Bee, additional alterations where needed. Ports from TG: - https://github.com/tgstation/tgstation/pull/49192 - https://github.com/tgstation/tgstation/pull/53047 - https://github.com/tgstation/tgstation/pull/53225 - https://github.com/tgstation/tgstation/pull/53316 - https://github.com/tgstation/tgstation/pull/53574 - https://github.com/tgstation/tgstation/pull/66257 - https://github.com/tgstation/tgstation/pull/69095 - https://github.com/tgstation/tgstation/pull/71449 Ports from Bee, from yours truly: - https://github.com/BeeStation/BeeStation-Hornet/pull/8748 A rundown of the plan: - This is Part 1 of newfood. This is basically the foundational newfood shit that's needed for the rest of the system we want to work. - Part 2 will complete all the foundational shit (killing oldfood), with some minor refactors to ready cooking for the upcoming features. This will conclude the development of the edible component and things left in limbo from part 1. It will remove the temporary vars and procs, and customizable food will be fully reenabled. - Part 3 will contain the cooking features (Griddle). Now for the changes: 1. convert bread to newfood 2. convert spaghetti to newfood 3. convert cake to newfood 4. Cleaned up the edible component. It should be a lot more consistent going forward, and will basically be completely functional as of part 2's merge. 5. Adds Food Storage component, which lets you hide small items in large food. (Stick a shard of glass inside a cake to fuck over someone.) 6. Adds FOOD_FINGER_FOOD food flag, which lets you eat food whilst moving. It applies to small food that really shouldnt take your full concentration to consume whilst walking, like lollipops! 7. Sets PRAGMATIC weights for as many foods as I could. Seriously this sucked really bad. candycorn and cakes are not the same ducking size. 8. food trash is sane, stuff thats clearly eaten on a plate and has a plate underneath it, will spawn a plate rubbish when completely eaten. (you dont eat the plate on cake any more smh) 9. Begins the framework of something called Accidental Consumption. Its basically if you end up eating non-food related it will cause you differing effects. This is again very early stages, and will require wounds, full newfood implementation, and bringing over tg's stomach metabolism. The proc exists, but its not getting called until part 2 or 3 is merged. 10. Adjusts some nutritional values. Minor, but I will note that I did so Newfood seems to be a heavily requested feature here. This is but the framework. Really, players wont notice the difference besides the incompatiblity between oldfood & newfood, but once the griddle is implemented in part 3, it will be glorious. When discussing with shiptest, I floated my plan and I received overall agreement. This should hopefully be less painful for me and for you than a bulk merge. :cl: rkz, benbot(benjamin), Time-Green, SteelSlayer, floyd, Qustinuus, ArcaneDefence, FlowerCuco add: Food storage! Hide some glass in the captains cake! Begone digestive tract! add: Bread, Cake and Spaghetti to Newfood add: some smaller foods can now be eaten whilst on the run! (This ONLY applies to newfood items thus far!) add: converted edible component to work with newfood del: oldfood for Bread, Cake and Spaghetti del: Temporarily removes customfood bread, cake, pasta, and sandwiches tweak: edited a few messed up values tweak: food trash is sensible now. Finishing stuff like cake will actually spawn a plate rubbish. Instead of you eating the plate, biggun, perhaps properly dispose of it! fix: Wildly STUPID item weights. Candycorn and cakes are no longer the SAME size code: provides some semblance of sorting for signal defines /:cl: --------- Signed-off-by: thgvr <81882910+thgvr@users.noreply.github.com> Co-authored-by: thgvr <81882910+thgvr@users.noreply.github.com> commit 55b1d838a1a7bc50f9d086872dd42028d958e08c Author: Changelogs Date: Sat Jul 27 00:54:36 2024 +0000 Automatic changelog compile [ci skip] commit 04c0a61e2992171fc85dc3c50b1ad994ca7da570 Author: Changelogs Date: Fri Jul 26 14:52:35 2024 -0500 Automatic changelog generation for PR #3224 [ci skip] commit 9adee9730d6078e80e096b8424c9e3f9d59a3054 Author: Gristlebee <56049844+Gristlebee@users.noreply.github.com> Date: Fri Jul 26 12:42:04 2024 -0700 Marker Beacons can be printed in the autolathe (#3224) Marker beacons can be printed in the autolathe under the Misc tab Marker beacons aren't practically obtainable outside of the occasional loot drops currently, and I think they're a nice thematic way to lay trails or mark points of interest as you navigate the planet rather than going around laying spray paint everywhere. :cl: add: Marker beacons can now be printed at the autolathe from the Misc tab /:cl: commit 3721dafb4bf44b6bbdf65e3eedb0198ad1de387e Author: Changelogs Date: Fri Jul 26 00:54:55 2024 +0000 Automatic changelog compile [ci skip] commit 2f9fdf7c23020ac8646f6f4fb690972cb52d3f21 Author: Changelogs Date: Wed Jul 24 21:07:45 2024 -0500 Automatic changelog generation for PR #3103 [ci skip] commit 73173c4b91ce1f58b1d00f118c5f49ac6911a290 Author: firebudgy <153147550+firebudgy@users.noreply.github.com> Date: Wed Jul 24 21:57:01 2024 -0400 Adds a new ruin: the Abandoned Listening Post (#3103) Adds a brand new ruin to Lava Worlds, a remaster of the old listening post ruin now abandoned mid-ICW and searched by the Ramzi Clique for valuables. Major Loot: - Stechkin, loaded + 1 spare magazine - Safe containing Loadsamoney spawner and Secret Documents, plus folder to hold documents in - Blackbox - Telecommunications assembly, capable of receiving only - C-20r in end room with no magazine and one spare unloaded magazine - Scalpal, Cautery and Latex Gloves in the small infirmary Contains for threat: - 3 Pistol Ramzi Commandos - 1 SMG Ramzi Commando - 1 Shotgun Ramzi Commando in the final room StrongDMM Areas Screenshot: ![image](https://github.com/user-attachments/assets/3735ed3d-fda3-4528-845f-8124f6957fca) StrongDMM No Areas Screenshot: ![image](https://github.com/user-attachments/assets/14c12ef1-f323-4614-9a95-e865d6f272ac) In-Game Screenshot: ![image](https://github.com/user-attachments/assets/5abb80d7-1363-4f1f-95b3-97a7713a761e) With the recent Ruincut more ruins are necessary to round out the planets in-game, and replacing a poorly designed ruin from the past with a higher-quality remake is something I like doing. This also adds an interesting environment of an abandoned holding from the ICW, of which not many exist as ruins despite the ICW being such a large event. :cl: Cloudbreak add: A new ruin, the Abandoned Listening Post. add: Areas associated with the listening post. fix: Single line in maps catalogue. /:cl: --------- Signed-off-by: firebudgy <153147550+firebudgy@users.noreply.github.com> Co-authored-by: meem <75212565+meemofcourse@users.noreply.github.com> commit f4e72870e445a04967beaf2c5af791d4220ecf62 Author: Changelogs Date: Wed Jul 24 00:56:07 2024 +0000 Automatic changelog compile [ci skip] commit bd694fdcb193bb7f317f862cf4a1ed0280654aee Author: goober3 <118859017+goober3@users.noreply.github.com> Date: Tue Jul 23 18:11:29 2024 +0100 Frontiersman Distillery Ruin (#2907)
The Ruin ![image](https://github.com/shiptest-ss13/Shiptest/assets/118859017/e9b43902-945a-4090-9be9-a0da753ebcff) ![2c5f52abe42891f0bfc41d57205f0e86](https://github.com/shiptest-ss13/Shiptest/assets/118859017/4697ec2b-a78b-46ad-930e-d1ce491295dc) ![image](https://github.com/shiptest-ss13/Shiptest/assets/118859017/d05d6996-47da-46ea-8f35-ef35ac5578ca)
![image](https://github.com/shiptest-ss13/Shiptest/assets/118859017/39eb60d5-1244-4cc1-9524-96f31438d689) This PR adds a new ruin to rockplanets featuring a group of New Frontiersman bootleggers based out of a pre-ICW era Nanotrasen research facility. A new type of bottle crate for moonshine bottles has been added, as well as a new subtype of Frontiersmen, without need for air. Moonshine now requires a fermenting barrel or distillery to be produced. Thank you to @FalloutFalcon for providing the code that makes this work, as well as refactoring bottle crates to make them work with variables.
Threats ``` - Melee Frontiersman (x3) - Revolver Frontiersman (x4) - Rifle Frontiersman Trooper (x4) - Rifle Frontiersman - Frontiersman Officer - Mi-go (Dog) - Explosive Mines (x5) ```
Major Loot ``` - Moonshine Jugs (x31) - Moonshine Keg - Moonshine Vat - Regular Medkit - Bicaridine Bottles (x2) - Common Machine Boards (x2) - Common Computer Board - Drink Dispenser - Booze Dispenser - SRM Distiller - Autolathe - Uranium PACMAN Generator - ~4000 credits - Hydroponics Trays (x2) - .357 Revolver (x2) - HP Shadow - .45 Speedloader - .357 Speedloader (x2) - Commander - Stetchkin Pistol - Empty Commander Magazine (x2) - AP 9mm Ammo Box - Stetchkin Magazine (x2) - Mosin Rifle (x3) - Mosin Clip (x2) - Armor Vest (x3) - SWAT helmet (x2) ```
🆑 goober3, FalloutFalcon add: A new Frontiersman-themed rockplanet ruin. add: Frontiersmen now have subtypes with oxygen masks. tweak: Moonshine can now only be brewed via fermenting barrels & distillers. code: Drinks recipes can now have multiple required containers. /🆑 --------- Signed-off-by: goober3 <118859017+goober3@users.noreply.github.com> Co-authored-by: Theos commit 330d9190559b051febf44763b7e6a8c7caef7d56 Author: Changelogs Date: Tue Jul 23 12:35:13 2024 -0500 Automatic changelog generation for PR #3209 [ci skip] commit ab01731cff65054ef89ce9cdab46805dbe389da0 Author: DIB-DOG Date: Tue Jul 23 12:11:09 2024 -0500 Changes the ingredients of two Gezenan drinks to better reflect their descriptions. (#3209) This PR changes the foodtypes of the Gezenan Dark Mead and Keh'Lu'Tex Liqueur to more accurately reflect their descriptions. This change is good for the game as it will enable Sarathi to enjoy drinks which are referenced to be popular Gezenan drinks. Both of the changed drinks are described to be made without the use of grain or vegetable products. This PR simply adjusts their foodtypes to reflect this and permit Gezena's majority population to enjoy native beverages. :cl: fix: fixed the foodtype of two Gezenan drinks to match their descriptions add: added a taste description to Keh'Lu'Tex Liqueur /:cl: commit 7160ec9bdf97a06897bd5cb662b707f165db8124 Author: Changelogs Date: Tue Jul 23 12:21:38 2024 -0500 Automatic changelog generation for PR #3211 [ci skip] commit 2c52faacd3d81c503052cc19f685948c5e93f77e Author: Gristlebee <56049844+Gristlebee@users.noreply.github.com> Date: Tue Jul 23 10:10:17 2024 -0700 Mission Drills and Containers display what they need (#3211) Outpost mission drills and containers from acquire missions show what they need in the object's name. ![image](https://github.com/user-attachments/assets/fb10de74-f6f8-4c52-8757-eb85efa275cd) ![image](https://github.com/user-attachments/assets/b9c6ac35-b5f8-404b-b343-c5073a3f627d) Also changes the name of the base fish type so it doesn't look odd when displayed. Quality of life change, and should help prevent bounty mission objectives being mixed up. It's fairly awkward mixing up two creature captures and having to shuffle them for example. :cl: add: Acquire Mission containers and Mission drills display their objective type. add: Changed name of base fish type to generic fish /:cl: commit d72a8bb2c03002ae43eb38f195264fb2040f1b2e Author: Changelogs Date: Tue Jul 23 07:21:54 2024 -0500 Automatic changelog generation for PR #3230 [ci skip] commit b702622ab8315472f304f7cf8ef3cdb967bdb6a5 Author: Theos Date: Tue Jul 23 07:58:37 2024 -0400 BG-16 fixes (#3230) BG-16 ammo now costs 666 power as intended (I think) down from 1000, so they get 30 shots instead of not 30 with an advanced/military cell BG-16 also gets its automatic firemode back since it was lost in the firemode refactor fancy gun version gets less shots per cell without doing more damage when it shouldnt do that :cl: fix: the BG-16 is now as ammo efficient as the BG-12 fix: the BG-16 has automatic fire again /:cl: --------- Signed-off-by: Theos commit 5b5378e9245809a879141dc5ebd310b3a7419ea9 Author: Changelogs Date: Tue Jul 23 07:08:49 2024 -0500 Automatic changelog generation for PR #3223 [ci skip] commit 676ae40814ac4105f0c823160c5944265ba6f967 Author: generalthrax <139387950+generalthrax@users.noreply.github.com> Date: Tue Jul 23 04:57:50 2024 -0700 reverts 'Increases the price of automatic weapons and some handguns' (#3223) Reverts https://github.com/shiptest-ss13/Shiptest/pull/3111 as it was awaiting testmerges for being a Very Unpopular pr among maintainers and other voices in private-dev (extensively discussed) before it was full-merged without that happening. Lol ![woe2](https://github.com/user-attachments/assets/94c29def-6fe8-4bad-8b72-e66af04276fd) :cl: balance: Undoubles the price on every automatic gun and removed 250 from the price of every semi-auto pistol. /:cl: commit e4ac2b092beddd389313a841b60af67e3ca6d4f2 Author: Changelogs Date: Thu Jul 18 00:54:15 2024 +0000 Automatic changelog compile [ci skip] commit 1d8781cd1134397b7b12857628d66471b16a22f0 Author: Changelogs Date: Tue Jul 16 22:43:19 2024 -0500 Automatic changelog generation for PR #3205 [ci skip] commit c5de25c3b248c783660c1c95fe61922d09a92d2d Author: Fest1v3 <154591738+Fest1v3@users.noreply.github.com> Date: Tue Jul 16 21:32:32 2024 -0600 Minor Vox Sprite Tune-Up (#3205) Adds, Fixes and Updates a few vox sprites. - Cigars, cigarettes & corncob pipe - Mining & Solgov helmet - Syndie & SWAT masks - Safety vests - Bubblegum - EVIL (red) nitrate, leather gloves & combat gloves. - NVGs New/Updated sprites Mining Helmet off/on ![image](https://github.com/user-attachments/assets/5324891d-2088-456d-abe0-b408b487d2b2) ![image](https://github.com/user-attachments/assets/82944ee6-1167-4656-a763-388080d76082) Solgov Helmet off/on ![image](https://github.com/user-attachments/assets/d2ff5b8a-8d63-4fb0-9e30-fadeea076abb) ![image](https://github.com/user-attachments/assets/d3469e8c-59d9-4ac2-b814-12d6d959f667) SWAT Mask ![image](https://github.com/user-attachments/assets/fe5217f5-930d-4027-bb99-0ebb202f6092) Safety Vest ![image](https://github.com/user-attachments/assets/5215d700-6c5b-4440-bcc8-b330ea2a4bce) Safety Vest Solgov ![image](https://github.com/user-attachments/assets/16f8381f-d43a-4472-9c2b-217770fb11da) EVIL nitrate ![image](https://github.com/user-attachments/assets/598a24b0-10b0-4534-b70a-1eb0764c6f2c) Did a few sprites commonly noted (by the 3 total Vox players, of which I am one) as being old/missing. (commit messages confused me please do not laugh) I love Vox! :cl: add: adds a few vox sprites fix: fixes a few vox sprites /:cl: commit 2c6ca10c7a45bd70c2ba946ed5db28072cf7d0c5 Author: FalloutFalcon Date: Sun Jul 21 07:10:47 2024 -0500 removes some cruft vars commit 2e7936b6c9338d23b37651604b93c45956be58a2 Author: FalloutFalcon Date: Sun Jul 21 06:59:01 2024 -0500 prettier commit 2a5f7d92d4ac6e895fae91e39588c4f801d6f80a Author: FalloutFalcon Date: Sun Jul 21 06:55:47 2024 -0500 removes unused vars commit 40ca0ea1240484a382ef592545b685697fc16228 Author: FalloutFalcon Date: Sun Jul 21 06:52:31 2024 -0500 few more small fixees commit d8aa0a3e804348390a49b0f50a065a110011c29c Author: FalloutFalcon Date: Sun Jul 21 05:54:50 2024 -0500 ports most of the tg orbit menu commit 8936d3f49785171966b69dde53be6d053fe65e84 Author: FalloutFalcon Date: Wed Jul 17 21:05:38 2024 -0500 this might fix it commit a5d7a60a7c4dc60493888c9123a77e3b0b6370f3 Author: Changelogs Date: Wed Jul 17 00:55:39 2024 +0000 Automatic changelog compile [ci skip] commit 54ed5c62db85fe0e92574c6a29d18ff6a8bd42e4 Author: Changelogs Date: Tue Jul 16 05:27:16 2024 -0500 Automatic changelog generation for PR #3169 [ci skip] commit 2a73d01ebafdb5be0da681a591467030e8a012fb Author: Sadhorizon <108196626+Sadhorizon@users.noreply.github.com> Date: Tue Jul 16 11:04:55 2024 +0200 Reflavors choice beacons. (#3169) Now, instead of orbitally dropped guitars, they are just in a box. Nothing crazy. Pod delivery is... somewhat goofy, to say the least. This makes the concept less out there, and possibly more usable in general. :cl: tweak: Choice beacons were reflavored into choice boxes. /:cl: commit 2d741c2b7aa8ed9036c358426d397d7228e37de3 Author: Changelogs Date: Tue Jul 16 05:13:33 2024 -0500 Automatic changelog generation for PR #3111 [ci skip] commit c45267d1af5abddde64faa6982914ef377626bbb Author: Martinpachu <86135885+Martinpachu@users.noreply.github.com> Date: Tue Jul 16 06:00:41 2024 -0300 Increases the price of automatic weapons and some handguns (#3111) Self explanatory. Also slightly nerfs the price on pistols to make them more balanced compared to revolvers. Automatics are EXTREMELY powerful and it's supposed to be a big deal to equip everyone or most people in a crew with them. ESPECIALLY AR's. Pistols one is more to just make revolvers more viable. :cl: balance: Doubled the price on every automatic gun and added 250 credits to the price of every semi-auto pistol. /:cl: --------- Signed-off-by: Martinpachu <86135885+Martinpachu@users.noreply.github.com> Co-authored-by: Theos commit e1d02b5b121ab8d0a6df8425e39d4994f4f95269 Author: Changelogs Date: Tue Jul 16 05:00:34 2024 -0500 Automatic changelog generation for PR #3178 [ci skip] commit 9982ef3616fd40c28c2222f447136f30f1033345 Author: Theos Date: Tue Jul 16 04:56:47 2024 -0400 subshuttles now inherit gravity if they are docked at a ship (#3178) gravity checks now also check any docking point for gravity generators, allowing ships docked to eachother to share gravity ghhhmhm :cl: fix: ships docked to eachother now share gravity /:cl: Signed-off-by: Theos commit 458b5cfb3982f6bcbc3ccc206e6c8de7afb15a84 Author: Changelogs Date: Tue Jul 16 04:27:12 2024 -0500 Automatic changelog generation for PR #3197 [ci skip] commit 66d79abdde8d4d817d6955b6d5deebe7d7f2ddca Author: Changelogs Date: Tue Jul 16 04:14:14 2024 -0500 Automatic changelog generation for PR #3213 [ci skip] commit 7dd2b855f93d2bbff19fcf6ca18f1000ba2ece94 Author: Sadhorizon <108196626+Sadhorizon@users.noreply.github.com> Date: Tue Jul 16 10:53:24 2024 +0200 Removes cruft from the loadout. (#3213) List of removed items: - Pet collar - meme item - Tiki mask - very weird item - Joymask - meme item - Baloons - I don't think I've ever seen anyone with a baloon. Can revert if it's somehow loved. - Tinfoil hat - meme item - Cat ears - meme item - Horse mask - meme item - Pirate hat - weird to have in the loadout - galaxy suit - yeah, cuz average spessman can afford an animated suit - tacticool turtleneck - use pants and a turtleneck undershirt This also reflavors the Cybersun labcoat into a "translucent labcoat" so it can stay in loadout until a unique coat is made for them. Loadout has a bunch of items that it shouldn't have. :cl: del: Removed a bunch of meme, weird and unused items from the loadout. tweak: Reflavored the Cybersun labcoat into a generic "translucent labcoat" /:cl: commit 954acb09cf211100594ae0294697d82331954a4a Author: Changelogs Date: Tue Jul 16 03:49:03 2024 -0500 Automatic changelog generation for PR #2994 [ci skip] commit 0af56b3a635f475f123318a3d0ce0326fc26d0d5 Author: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Tue Jul 16 03:38:29 2024 -0500 Express Console Supremacy (#2994) Cuts out the old cargo console the express was a subtype, combining behaviors so there is only one. I would like to add the shopping list feature back so we can pool shipments together since most of our packs are now 1 item. Easier code managment :cl: refactor: refactored express console to not be a subtype of the cargo console and replacing it. /:cl: commit fb2082bd3b0841a1adf099da8e7d39bd6220e991 Author: Changelogs Date: Mon Jul 15 00:56:44 2024 +0000 Automatic changelog compile [ci skip] commit 0896cc72f745770df1ea1e043c5c0817f987d3db Author: Changelogs Date: Sun Jul 14 19:33:40 2024 -0500 Automatic changelog generation for PR #2917 [ci skip] commit 4cd699cd811fa718a1a3bd228274969443b88291 Author: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Sun Jul 14 19:22:32 2024 -0500 Gun attachments (#2917) Finishing #145 Requires #2877 :cl: refactor: refactored attachments to be modular /:cl: --------- Signed-off-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Signed-off-by: Theos Co-authored-by: Matthew Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com> Co-authored-by: Theos Co-authored-by: thgvr <81882910+thgvr@users.noreply.github.com> commit 9f0fdabf1a79a9eead14a2dde8f72404184c2310 Author: Changelogs Date: Sun Jul 14 06:43:51 2024 -0500 Automatic changelog generation for PR #3204 [ci skip] commit 2af6b1dce2b762e02017735ce28954698193c1fc Author: Sadhorizon <108196626+Sadhorizon@users.noreply.github.com> Date: Sun Jul 14 13:33:17 2024 +0200 Two minor sunskipper tweaks. (#3204) - Changed it's prefix to SV - adds a missing pipe it is :cl: tweak: Changed sunskipper's prefix to SV. fix: Added a missing pipe to the sunskipper. /:cl: commit 12e36fef8cb8a235ab68bd47f9c4b91828d57515 Author: Changelogs Date: Sun Jul 14 05:30:03 2024 -0500 Automatic changelog generation for PR #3158 [ci skip] commit f5888f78afd02e4f2e42a052c1f01aa4bc5f8401 Author: Theos Date: Sun Jul 14 06:19:08 2024 -0400 Guncrate fixes (#3158) The beacon now has a proper subtype for not being loaded with ammo rather than having that be its default state The WT-550 no longer starts full in its guncase SKM magazines no longer start full in their guncases either Energy weapons which are meant to start empty now actually start empty The brimstone, hellfire, and scout now come with their respective guncases when ordered via cargo jjjjjjjjjjjjjjjjjjjjjj :cl: fix: gun cargo packs now act more as they would be expected to /:cl: commit 2dbc39a1ba856ec55302a2dd7d4d357d3019922f Author: Changelogs Date: Sun Jul 14 03:54:11 2024 -0500 Automatic changelog generation for PR #3080 [ci skip] commit 08cb713d2b6296be3a94654358a54f2ecb0f8d9e Author: Skies-Of-Blue <86762641+Skies-Of-Blue@users.noreply.github.com> Date: Sun Jul 14 01:29:59 2024 -0700 Ports 'Command bar typing indicators (client side html version)' (#3080) Directly ports https://github.com/tgstation/tgstation/pull/83081, allowing typing indicators to trigger off of the command bar. Typing indicators are there for a reason! It's helpful to know if another player is cooking a message for thirty seconds or just staring at you. However, a good chunk of our players exclusively use the command bar to send messages, leaving us in the dark! This helps level the playing field. :cl: add: typing indicators now trigger off of the command bar /:cl: commit f13ab58bac964dd9844e62501c18246d8ac18d1f Author: Changelogs Date: Sun Jul 14 03:40:46 2024 -0500 Automatic changelog generation for PR #3067 [ci skip] commit 4d1967f3ea425a931170f32aefcaf4a8e8b66d61 Author: Skies-Of-Blue <86762641+Skies-Of-Blue@users.noreply.github.com> Date: Sun Jul 14 01:29:45 2024 -0700 SSD Indicators Will Be Real In 2020 (#3067) Loosely ports https://github.com/Skyrat-SS13/Skyrat13/pull/420, splicing Novasector's SSD mechanics with our own. When a player goes SSD, they initially remain awake and gain a Zz icon above the character indicating they are away.
look here! ![nyaru goes afk](https://github.com/shiptest-ss13/Shiptest/assets/86762641/98c61f04-7e65-4b24-a434-2769cc8a25f6)
After the player has been disconnected for three minutes, their character will resume our current implementation of SSD behavior - losing the Zz icon and falling asleep.
see? ![nyaru has been gone a while, huh](https://github.com/shiptest-ss13/Shiptest/assets/86762641/8c51e05f-a41d-40af-a259-3a2dc7e7cca2)
This also adds the time spent SSD to examine text.
it's helpful! ![taking a bit](https://github.com/shiptest-ss13/Shiptest/assets/86762641/15f91ab4-01b8-4d2f-8d8f-f5cf65f99213)
Our current implementation of being SSD leaves some things to be desired. Whenever you disconnect, your character instantly passes out. This can lead to: - dropping critical items in dangerous situations, which is just sort of the worst - aghost causing your character to faint on the spot, something I've heard more than a few admins complain about over the last few years - players *reacting* to your character falling asleep as if it was a planned thing within your control - players moving your character to a bed, disrupting a scene you may have been intent on continuing if it weren't for that pesky internet cut - SSD players flooding the nearby chat with *snore out of nowhere Of course, there's merit to our current implementation as well. Having characters fall asleep keeps immersion clean, and having an SSD Indicator can be immersion breaking. This is why I've opted to remove the indicator and have characters fall asleep after a grace period of three minutes. It allows players a time to reconnect, or admins time to view what they needed to, without all of the disruptions listed above. :cl: add: an SSD Indicator for when you have been disconnected for less than three minutes balance: players will now remain awake for three minutes after disconnecting, with a new SSD icon to boot! balance: players SSD longer than three minutes will lose their icon and fall asleep, much like the previous behavior /:cl: commit f3ea52f3b683973055ef03166680ac7619b08820 Author: Changelogs Date: Sat Jul 13 00:54:58 2024 +0000 Automatic changelog compile [ci skip] commit 8d25df8f07180c1334516fb0204333ab0b659cb6 Author: Changelogs Date: Fri Jul 12 18:47:00 2024 -0500 Automatic changelog generation for PR #3150 [ci skip] commit d82aa2608940decca3db0c3c7a49647a85cd54d9 Author: generalthrax <139387950+generalthrax@users.noreply.github.com> Date: Fri Jul 12 16:23:50 2024 -0700 capsaicin no longer straight up kills you (#3150) removes the body temperature increase from capsaicin >eats two chili peppers >starts running a fever 30C over the boiling point of water ![nacho](https://github.com/shiptest-ss13/Shiptest/assets/139387950/4ee8470c-f220-4181-83ab-a0d78755aa12) :cl: del: Capsaicin no longer Boils you /:cl: commit 1332f4b5af2d963b066f5c2a549a308228c7a275 Author: Changelogs Date: Fri Jul 12 18:34:06 2024 -0500 Automatic changelog generation for PR #3206 [ci skip] commit 8d6370524020cee987f2f7cdda8ab24d99dd1ad3 Author: Gristlebee <56049844+Gristlebee@users.noreply.github.com> Date: Fri Jul 12 16:23:24 2024 -0700 357 Revolver Guncase uses the correct subtype (#3206) Fixes #3200 The guncase had the wrong subtype. I DEMAND "Apogee-Dev" BE DEMOTED- ![image](https://github.com/user-attachments/assets/8f6881f0-3f84-4af1-8ce4-8d4977e87f5a) :cl: fix: 357 guncase spawns with the correct revolver /:cl: commit b837cd319aed5bce61f0504ec34983ec93c7606d Author: Changelogs Date: Fri Jul 12 17:17:21 2024 -0500 Automatic changelog generation for PR #2905 [ci skip] commit 13f6acddea812b16be967a3e66f9a15eda8e2a34 Author: cuddleandtea <105150564+cuddleandtea@users.noreply.github.com> Date: Sat Jul 13 00:37:38 2024 +0300 Build mode light maker (#2905) Hello dear comrades! Adds new submode for admins buildmode. You can create lights on any turf/mob/obj with different range, power and color. based on: #2902 because it's changes the same .dmi file with sprites Here is how it work in the video: https://youtu.be/Ias2_tdiLeU Admins can light up fast any areas and points of interest or just dark places that needs to be lit. A very handy tool for events and stuff. 1. Go to build mode and select my little lightbulb icon ![image](https://github.com/shiptest-ss13/Shiptest/assets/105150564/7c391e51-056f-43cb-be0e-6c1277aa632b) 2. Already you can place light with power 1, range 3 and white color. Press Build Mode button to change this settings. ![image](https://github.com/shiptest-ss13/Shiptest/assets/105150564/8c6eb212-42f4-48e8-8557-a940c5af3b6a) ![image](https://github.com/shiptest-ss13/Shiptest/assets/105150564/ad0b44fa-96e5-43ef-9d18-3245d857ed16) 3. Enjoy this great tool for events and points of interest ![image](https://github.com/shiptest-ss13/Shiptest/assets/105150564/c884ba28-8bac-488a-88ca-5973b29306d0) :cl: admin: new light maker subtype for build mode /:cl: --------- Signed-off-by: cuddleandtea <105150564+cuddleandtea@users.noreply.github.com> commit 1721a4296d245c40c6f1cce5f72523ce7136d688 Author: Changelogs Date: Fri Jul 12 16:54:24 2024 -0500 Automatic changelog generation for PR #2848 [ci skip] commit 7c65b3f0ba9ae69a952354fce574500e8a14a8d3 Author: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Fri Jul 12 16:32:07 2024 -0500 Mob Spawner Rework (#2848) reworks most mob spawners to fall under a much simpler spawner/burrow each planet has one simple nest instead of the old system with difficultly levels i never even noticed were there despite the fact i used to basically just kill nests and powergame when i first played this has the byproduct of killing off all the awful magic item spawns attacking a bunch of other cruft, mostly lavaland :cl: add: A new generic nest used across all planets del: Old portal and tendrils and other cruft refactor: refactorted mob spawners to have one for each planet /:cl: --------- Signed-off-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Signed-off-by: Theos Co-authored-by: Mark Suckerberg Co-authored-by: Theos commit a6c3432656342ece7bbe3836a82e2d30a4705733 Author: Changelogs Date: Fri Jul 12 00:39:57 2024 -0500 Automatic changelog generation for PR #3181 [ci skip] commit 68edb786e4ee325c8ca1b539fc1ff40e4fee5559 Author: Theos Date: Fri Jul 12 00:41:36 2024 -0400 Bone crits are now only rolled for brute damage (#3181) ![image](https://github.com/shiptest-ss13/Shiptest/assets/24857008/b6659939-8c1e-4ef0-9c5b-a5bc6399d9ac) Life or random damage ticks for disabler cat :cl: fix: brute damage is now required to break bones /:cl: Signed-off-by: Theos commit 6fe4e56bc7777c27f091e4287412e34a2c151bdd Author: Changelogs Date: Fri Jul 12 00:16:24 2024 -0500 Automatic changelog generation for PR #3191 [ci skip] commit 6cc191e0c3a0bb601dc4434d548625ad84cda5c5 Author: Skies-Of-Blue <86762641+Skies-Of-Blue@users.noreply.github.com> Date: Thu Jul 11 21:41:00 2024 -0700 Hoodie/Winter Coat Storage Parity (#3191) Winter coats lost their innate storage due to an oversight in https://github.com/shiptest-ss13/Shiptest/pull/2121. This fixes that! Additionally, this PR matches the items you can fit in the suit storage slot across hoodies and coats. As an added bonus, you can now fit pill bottles in both! Things working as intended is good, and one should reasonably be able to fit a pill bottle in your coat pocket. :cl: balance: you can now fit radios and pill bottles in both hoodies and winter coats fix: the innate storage on winter coats has been restored, alt click to access! /:cl: commit 28c8a478a37223533ca12b9977e9beb9896bf1bb Author: Changelogs Date: Fri Jul 12 00:03:09 2024 -0500 Automatic changelog generation for PR #3179 [ci skip] commit 0a8f4e3dd80dc2853d9ce33c63501fe1d780dda3 Author: Euan <46800751+TiberianEuan@users.noreply.github.com> Date: Fri Jul 12 14:40:10 2024 +1000 Black and White Hoodie (#3179) Adds a black hoodie with grey hood to the game. Very stylish. Much wow. ![image](https://github.com/shiptest-ss13/Shiptest/assets/46800751/f3878729-4657-468e-afe2-5ac780dc5bd9) It's rather a simple addition, and won't affect the game very much, but it would help increase the diversity of hoodies available for characters to wear. Such a simple design really, don't know why it wouldn't already be here. Due to thgvr's request, the hoodie now also fits kepori crew. :cl: TiberianEuan add: Black hoodie with grey hood. imageadd: New hoodie icons. /:cl: **Do note:** A bunch of other commits are in there because last time I tried to publish Lethal Company 13 commits to this repo they were shot down, (which made me rather upset at the time but whatever) They have been reverted. Those commits will not be added to the game upon merging this PR. Please ignore them. I don't know how to get rid of them from the PR itself. commit 28d89bc731cfccf7347a58a7d5fe3a055b1d69f2 Author: Changelogs Date: Thu Jul 11 23:50:25 2024 -0500 Automatic changelog generation for PR #3201 [ci skip] commit deb0d73fc634dca19f1049ec08cab6fbd0617d28 Author: generalthrax <139387950+generalthrax@users.noreply.github.com> Date: Thu Jul 11 21:39:34 2024 -0700 Landmine Bounty Changes (#3201) Fancies up the mission description a tiny bit and correctly says the mission is for all (pressure) landmines instead of just rusted mines. Prox mines can't really be disarmed so they're not included. Also decreases the amount of landmines required (and by extension, increasing the amount of credits rewarded per mine) to allow people to actually reliably complete the missions with the flat 25% chance you get to disarm mines. Fine tuning the mission after my own testing and observing other people completing them. :cl: fix: Fixed the Landmine mission description and flavoured it a little balance: Decreased the amount of landmines required for its mission and increased the value per mine slightly /:cl: commit bef91117720474c9a3c72faa1d25be71105ee01d Author: Changelogs Date: Thu Jul 11 23:20:44 2024 -0500 Automatic changelog generation for PR #3196 [ci skip] commit c0252119d0ee60c64b33d0b239bbe51fb05cd5da Author: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Thu Jul 11 23:10:23 2024 -0500 Two fixes relating to IDs (#3196) Fixes runtimes caused by mobs without ids trying to open doors and wallets not having there access untill you reinsert your wallet IDs now send a signal that there access has been changed which wallets listen for. Fixes two bugs I caused! Fixes #3137 :cl: fix: pets no longer cause run times trying to open ship doors fix: no longer have to reinsert your id into your wallet for access /:cl: commit 7248012c86f2114b905d1b33b842da9764c71cc5 Author: Changelogs Date: Fri Jul 12 00:54:11 2024 +0000 Automatic changelog compile [ci skip] commit 7e8e780004fdc35f22fbb56df7f7579ae9d6ee67 Author: Changelogs Date: Thu Jul 11 18:28:44 2024 -0500 Automatic changelog generation for PR #3147 [ci skip] commit b77d484239993a827820e9157d39fe9d1061e458 Author: generalthrax <139387950+generalthrax@users.noreply.github.com> Date: Thu Jul 11 15:55:22 2024 -0700 Mine Defusal Outpost Missions (#3147) There's now an outpost mission to deliver defused landmines for money. Descriptions subject to change I imagine several organizations would definitely offer bounties to collect leftover landmines. Cute little flavour and some more variety in outpost missions (with some danger). :cl: add: The outpost is now offering bounties to defuse landmines to Frontier vessels. /:cl: --------- Signed-off-by: rye-rice <58402542+rye-rice@users.noreply.github.com> Co-authored-by: rye-rice <58402542+rye-rice@users.noreply.github.com> Co-authored-by: Theos commit 5ad0f9a3795557feaa284f684091e39826f6827d Author: Changelogs Date: Thu Jul 11 18:15:57 2024 -0500 Automatic changelog generation for PR #3142 [ci skip] commit 4ad8d9e0c9465e948f0d64ebc94ab1e7ee74b86f Author: generalthrax <139387950+generalthrax@users.noreply.github.com> Date: Thu Jul 11 15:44:26 2024 -0700 broad cringe removal (#3142) - Removes the ability for ghosts to click on mice and take control of them - Removes a vast majority of forcesays from the game (gibbering I've left untouched for now but if theres interest in axing it I will) - Removes char from the game (only made you spout forcesays) - Spraytan overdose no longer exists and will no longer turn you into a surfer - Removes every gibbering line - Removes Chav, Swedish, and Elvis mutations - Misc forcesay removals No more White Sands jank and no more unfunny forcesay leftovers from tg :cl: del: Removed mice possession del: Broad removal of forcesays from most reagents and items del: Removed char reagent and spraytan overdose del: Removed gibbering lines del: Removed Chav, Swedish, Elvis mutations /:cl: commit 767795e2f801861d0efe3eb0982dece1834edbda Author: Changelogs Date: Thu Jul 11 18:02:56 2024 -0500 Automatic changelog generation for PR #3115 [ci skip] commit 11343eef2cba66156c244e0388f38c28af647658 Author: meem <75212565+meemofcourse@users.noreply.github.com> Date: Thu Jul 11 18:44:16 2024 -0400 Valor Remap, Minor Inteq Code Tweaks (#3115) ![imagen](https://github.com/shiptest-ss13/Shiptest/assets/75212565/67b0dbfa-3b5a-45fa-b6ee-2dab27b8c755) ![imagen](https://github.com/shiptest-ss13/Shiptest/assets/75212565/8a62c180-cc96-449c-95cb-194685a789fa) * Remaps certain parts of the Valor. The Haste has not been touched apart from a single handrail. * The Valor now has a Shuttle Pilot, and a Shuttle Corpsman. The Shuttle Pilot gets an office and an outfit. * The Vanguard basetype was changed to be consistent with the other outfits (e.g. empty subtype instead of being empty by default) * there was complaints that the valor sucked * born to map dmm is a fuck 地图 strongdmm 2019 i am maptainer 410,757,864,350 mapping sins :cl: balance: Remapped the Valor, with two extra jobs (Shuttle Corpsman, Shuttle Pilot). code: The Vanguard base outfit starts with gear. /:cl: commit 51084524fa530e7e816445abc6bef1adc93bbd88 Author: Changelogs Date: Thu Jul 11 00:55:17 2024 +0000 Automatic changelog compile [ci skip] commit b223bba2c743900f7347175ae3736de7ce63064c Author: Changelogs Date: Wed Jul 10 01:22:13 2024 -0500 Automatic changelog generation for PR #3187 [ci skip] commit d2be8597b9c734fe4a47c57e55c29cc8f1268670 Author: Imaginos16 <77556824+Imaginos16@users.noreply.github.com> Date: Tue Jul 9 23:11:54 2024 -0700 SolCon/SolGov Hardsuits (And Its Subtypes) Can Now Stow Away Guns! (#3187) Does what it says on the tin. You can now holster guns, ammo and such on the armor slot while equipping the hardsuit. I almost got shot because people got terrified at the fact I had a gun on my hand, when I couldn't holster due to this oversight. Amazing. :cl: PositiveEntropy fix: You can now store guns, ammunition, and melee weapons on the armor slot when equipping a SolCon/SolGov hardsuit, and its subtypes! /:cl: commit 13003cc94c4247b89d65c961b2cbe605bacabcd6 Author: Changelogs Date: Wed Jul 10 01:02:20 2024 -0500 Automatic changelog generation for PR #3193 [ci skip] commit 17e4490136d46b2ee84e9155439d56f8a16175c0 Author: Imaginos16 <77556824+Imaginos16@users.noreply.github.com> Date: Tue Jul 9 22:25:55 2024 -0700 The Ares Poster Now Correctly Calls The Planet Mars (#3193) Does what it says on the title. ![image](https://github.com/shiptest-ss13/Shiptest/assets/77556824/dc713a4f-685f-44d5-a73b-3a4e3cc24da1) It was a weird misconception that for some reason SolCon decided to rename all the planets into their greek counterparts. This is very much not the case, especially since if it *was*, Terra would've been called Gaia and the moon would've been called Selene instead of Luna. This does however mean that Uranus is now called Caelus, though this will be depicted in a poster in another time. :cl: PositiveEntropy fix: Mars and Venus are now referred to by their correct names! /:cl: commit 0f2e65940b1b0755fb64173c2832c7f9e99d4a8d Author: Changelogs Date: Wed Jul 10 00:49:30 2024 -0500 Automatic changelog generation for PR #3175 [ci skip] commit 304fdeb60fd88f0c40178d835ef7a48a4278b3cf Author: generalthrax <139387950+generalthrax@users.noreply.github.com> Date: Tue Jul 9 22:14:20 2024 -0700 Removes tatortots and fixes recipe issues (#3175) Potatoes no longer turn into tator tots when put into the food processor, instead becoming fries. The potato wedge to fries recipe was removed as well. Fixes: https://github.com/shiptest-ss13/Shiptest/issues/2693, and despite tator tots existing the sprite sucks ass big time, has a flavour profile that references validhunting, and is Straight Up the only use for potato wedges for an item that is never put on the table. This subsequently prevents potato wedges from infinitely being able to be cut into itself, and be used for normal potato recipes. :cl: del: Removed tator tots and raw potato wedges /:cl: commit b7d811aa806b0e986b5fbca76941ee6ab0470fc4 Author: Changelogs Date: Wed Jul 10 00:36:52 2024 -0500 Automatic changelog generation for PR #3163 [ci skip] commit 4044eb8ebbb448d2003e3d8f6bcda046b4d2f357 Author: Martinpachu <86135885+Martinpachu@users.noreply.github.com> Date: Wed Jul 10 02:13:55 2024 -0300 Makes pizza cheaper. (#3163) Makes the cargo pack for pizza cheaper, 6000-3000 a little snack for a reasonable price, still pricier than less tasty options (donks and rations) :cl: balance: Pizzas have become cheaper. (6000 cr - 3000 cr) /:cl: commit 131c57206f1f3674000e5b1e63648bf2eb3363a8 Author: Changelogs Date: Wed Jul 10 00:24:09 2024 -0500 Automatic changelog generation for PR #3188 [ci skip] commit 9a5dec0dfaf8081f093f09b9695833c89da8df9c Author: firebudgy <153147550+firebudgy@users.noreply.github.com> Date: Wed Jul 10 01:13:02 2024 -0400 Fixes another singular typo within the code (#3188) Fixes another typo within the code You have evaded my gaze for too long, Unqiue. You must perish for the sake of grammatical correctness. :cl: Cloudbreak code: Fixes a singular typo within the code. /:cl: commit 19e44b0c19eb8471c8e740752fddd7d86d23f547 Author: Changelogs Date: Wed Jul 10 00:55:15 2024 +0000 Automatic changelog compile [ci skip] commit 9e8687e832ad76c530c4c32e03cd7b0aa76d978e Author: Changelogs Date: Tue Jul 9 15:11:03 2024 -0500 Automatic changelog generation for PR #3114 [ci skip] commit 140a1d04bd97383d496e8a32786844be063ec992 Author: meem <75212565+meemofcourse@users.noreply.github.com> Date: Tue Jul 9 15:59:14 2024 -0400 the tortuga's holofields now work (#3114) * the tortuga, and the brawler's holofields now work. all the shutters on the brawler are now also three wide * minor greeble on the tortuga such as fire extinguishers and emergency closets competent maptainer :cl: add: Minor changes to the Tortuga. fix: The holofields on the Tortuga-class and Brawler-class now work. /:cl: commit 70f6b9f4f7852ab595a16ebe546e185f29a76560 Author: Changelogs Date: Mon Jul 8 22:01:39 2024 -0500 Automatic changelog generation for PR #3192 [ci skip] commit 27b62fe62aa64e347ae1427ee3dbd293469f9e71 Author: firebudgy <153147550+firebudgy@users.noreply.github.com> Date: Mon Jul 8 22:50:13 2024 -0400 Fixes Vox sprites for a few clothing items (#3192) A few items that had Vox variations at some point stopped properly displaying them. This makes them appear as they should again. The Inteq SWAT helmet, standard Inteq helmet and Inteq HUD goggles now properly show their sprite on Vox. Items having sprites is generally a good thing. :cl: Cloudbreak fix: A few clothing items now properly display again for Vox. /:cl: commit 17fe5a15be843f0e0ff6f1691d7180de8b849e74 Author: Changelogs Date: Tue Jul 9 00:54:33 2024 +0000 Automatic changelog compile [ci skip] commit e9e640cf9f11214762467cc328641b83ce15c8d9 Author: Changelogs Date: Mon Jul 8 15:56:31 2024 -0500 Automatic changelog generation for PR #3177 [ci skip] commit b5f1f5aabfc16186683480e24891a66843b426b2 Author: Theos Date: Mon Jul 8 15:59:01 2024 -0400 Projectiles are no longer bloodthirsty for stam/softcrit people (#3177) replaces stat == dead check with a generic stat check because any stat above 0 means the target is incapable of doing much of anything Stamcrit now gives TRAIT_HANDS_BLOCKED like other stuns, this shouldn't do much except allow projectiles to fly over them since you can't do hands stuff in stamcrit anyway I don't WANT to fill the poor sod in the front with 500000 rubber bullets I WANT to crowd control!! :cl: code: People who are stunned are now more reliably passed by bullets not aimed directly at them /:cl: commit ad1a5210525d99f13361b0daece980c3996aad83 Author: Changelogs Date: Mon Jul 8 15:43:19 2024 -0500 Automatic changelog generation for PR #3171 [ci skip] commit a36d9f9d1747dea0ec6418cef72d4ffc9746e5aa Author: generalthrax <139387950+generalthrax@users.noreply.github.com> Date: Mon Jul 8 12:58:54 2024 -0700 The Tip-pening (#3171) Removes a grand majority of the station-based / bad tips from selection, and adds around 80 new ones. A lot of these old tips were no longer relevant to Shiptest's gameplay loop. These new ones are a combination of roleplay, command, combat, survival, and general gameplay tips that come from my own knowledge of in-game mechanics. :cl: del: Removed some irrelevant old tips of the round add: Added 80+ new tips more relevant to Shiptest's gameplay loop /:cl: commit d612e3ef64e872d52309475f7831e03db5e35987 Author: Changelogs Date: Mon Jul 8 15:29:50 2024 -0500 Automatic changelog generation for PR #3165 [ci skip] commit 94376b6b5068ad0b2e7b01d2cf29963aad80e160 Author: Apogee-dev <60533805+Apogee-dev@users.noreply.github.com> Date: Mon Jul 8 12:58:43 2024 -0700 Fixes N+S Captain loadout (#3165) I forgot to set some slots on the N+S Captain loadout to NULL, causing them to inherit normal Nanotrasen items. This PR nulls them out, making the N+S Captain effectively dressed as a Quartermaster, as he should be. bugfixes good :cl: fix: N+S Captains no longer spawn with Nanotrasen coats. /:cl: commit e306ad20744d4fb1d7d17b25465e9adbab2e4c6b Author: Martinpachu <86135885+Martinpachu@users.noreply.github.com> Date: Mon Jul 8 16:58:14 2024 -0300 Makes .38 speedloaders cheaper. (#3159) Makes .38 speedloaders cheaper 350 - 250 makes speedloaders less expensive than the gun :cl: balance: .38 speedloaders are cheaper /:cl: commit 6931783e054450680a6d103b916447eaaf7fdd98 Author: Changelogs Date: Mon Jul 8 14:15:11 2024 -0500 Automatic changelog generation for PR #3168 [ci skip] commit 7f7f264fa1df1dcf0542b0b83445310218d0c281 Author: Sadhorizon <108196626+Sadhorizon@users.noreply.github.com> Date: Mon Jul 8 19:39:45 2024 +0200 Adds plastic flowers. (#3168) Adds a new item, a plastic flower. It can be reskinned into all of flowers with an alt+click. Adds that item into loadout, so chars can go and have flowers as part of their drip. ![obraz](https://github.com/shiptest-ss13/Shiptest/assets/108196626/247a8051-3316-446d-9771-79c4d6bece6a) More options for character creation. :cl: add: Added a plastic flower - a selection of flowers to wear. Added it to the loadout too. /:cl: commit 285fc751434c0a8f03332ef8eb0c00788ad411b3 Author: Changelogs Date: Mon Jul 8 14:01:33 2024 -0500 Automatic changelog generation for PR #3164 [ci skip] commit cd08b91cd15b19c3d7f03d965705b9e27e98a246 Author: Theos Date: Mon Jul 8 13:39:30 2024 -0400 Should fix the loadout-box-killing runtime (#3164) invalid items in loadout = runtime = no box This should remove any loadout items that don't exist before they can try to exist (they won't) uhm box :cl: fix: loadout boxes will no longer sometimes not spawn /:cl: Signed-off-by: Theos commit 7942781340d8b7ed3e7de9c6756575cd9274afc0 Author: Changelogs Date: Mon Jul 8 13:23:25 2024 -0500 Automatic changelog generation for PR #3166 [ci skip] commit b6a2fcd72568a6acdea2a0d8b780b4eb0836a5ec Author: Apogee-dev <60533805+Apogee-dev@users.noreply.github.com> Date: Mon Jul 8 10:37:32 2024 -0700 Reduces ship spawn limit for everything to 1 (#3166) Reduces the spawn limit for every ship to 1, and makes the default limit for new ships 1. Nearly every ship was already set to a limit of 1. Making it the default just saves time. Most of the handful of ships that still had a cap of 2- mudskipper, li tieguai, and delta, for instance - were ships that would just compete for pop or nudge each other out of their niche if double-spawned, and a greater variety of ships are available to accept players after existing ones fill up than there previously were. :cl: balance: reduced default ship spawn limit to 1. /:cl: commit 18310967163be114a5cdc7c62e13359b00fd5aa9 Author: Changelogs Date: Mon Jul 8 12:59:12 2024 -0500 Automatic changelog generation for PR #3105 [ci skip] commit f773e440edb7b7ada654d0ea2416184c81e38979 Author: Apogee-dev <60533805+Apogee-dev@users.noreply.github.com> Date: Mon Jul 8 10:34:11 2024 -0700 Talos QOL Improvements (#3105) ![talos2](https://github.com/shiptest-ss13/Shiptest/assets/60533805/f7fb731c-c2e6-4360-8c32-1375c2fe99f6) Makes some adjustments to address common issues with the Talos. - Areas have been changed so cargo no longer drops in the wings - Artificer Class II is now Honorable Artificer - Gas storage tank access buttons are restricted to Honorable Artificer - Comms and workshop have switched places - Crate shelves have been added to cargobay - Additional shuttle docks have been added on the starboard side - Added an autolathe to cargo - Removed Corpsmen Talos is a decent ship but had a few recurring problems. This fixes them. :cl: fix: Cargo pods no longer land in Talos maint fix: Gas tanks on the Talos have higher security fix: Talos now has an autolathe in cargo /:cl: commit e889628022fb04dbdafc74a3125fe266788492f7 Author: Changelogs Date: Mon Jul 8 12:43:25 2024 -0500 Automatic changelog generation for PR #3075 [ci skip] commit d3e0168a8cee548ee38d543d57bda617b67b2a7d Author: SapphicOverload <93578146+SapphicOverload@users.noreply.github.com> Date: Mon Jul 8 13:32:13 2024 -0400 Fixes a few ships' TEG setups (#3075) Removes the disposals chutes some TEG setups have for you to throw lit welding tools into, and replaces them with proper igniters. Having a disposals chute to throw lit welding tools into was a stop-gap solution to igniters not working, which was fixed over a year ago in :cl: add: Adds an igniter and button to the TEG of every ship that was missing one del: Removed the welding tool TEG chute some ships had /:cl: commit b2f1473c5865cfc636c2690a9bc91ef0e251b641 Author: Changelogs Date: Sat Jul 6 00:52:29 2024 +0000 Automatic changelog compile [ci skip] commit 0f44b7a04de7a0348a3272c657efca5e79eac46e Author: Changelogs Date: Fri Jul 5 01:09:05 2024 -0500 Automatic changelog generation for PR #3139 [ci skip] commit b5f944e08c190f2639220d66eb84bfc16e2e934e Author: Sadhorizon <108196626+Sadhorizon@users.noreply.github.com> Date: Fri Jul 5 07:50:21 2024 +0200 Makes dog beds anchored. (#3139) Title. Mobs buckled can just. Walk with it. :cl: fix: Dog beds start anchored now. Mobs can no longer move while buckled. /:cl: commit 940415b190603569888b6a6c3b5afc80a2959f5f Author: Changelogs Date: Fri Jul 5 00:45:18 2024 -0500 Automatic changelog generation for PR #3176 [ci skip] commit 69f7a823213a8ec31d48bbba7d9c3ec2de5bca33 Author: rye-rice <58402542+rye-rice@users.noreply.github.com> Date: Thu Jul 4 22:34:23 2024 -0700 [IDB IGNORE][MDB IGNORE] Reorganizes Guns Sprites and Repaths (#3176) This reorganizes most of the gun spritesheets into separate files, making it not fucking agony to look through This also repaths pistols and revolvers, this is a mystery tool we will need later. This also take the liberty of removing belt_mirror.dmi because fuck that file, all suit storage slots will pull from either mob overlay icon or back.dmi as a fallback. Would be very helpful for the 5 million gun rewokrs that are done, but not implmented yet. While it is true i'm waiting on gun attachments, this is more pressing than that. :cl: add: Resprites the E-50 and gives it proper inhands now! fix: The Syndicate sniper rifle fires at a normal rate of fire and has the correct recoil now. /:cl: --------- Co-authored-by: retlaw34 <58402542+retlaw34@users.noreply.github.com> commit 1e7d82f1a1de2b65e6e7a3820eaa471833e87dd5 Author: Changelogs Date: Thu Jul 4 00:53:50 2024 +0000 Automatic changelog compile [ci skip] commit 5e15cdaa3c03448c3ca460dd430a2a8317366169 Author: FalloutFalcon Date: Fri Aug 30 10:18:14 2024 -0500 Revert "Revert "orbit menu is less cluttered" (#3218)" This reverts commit 08a4dbfdd5ddd12746bf1904210b5c2dade1ecd5. commit d29a2b2a27153a9ac699c1a77624ac108e47016b Author: FalloutFalcon Date: Sun Aug 11 21:01:52 2024 -0500 small tweaks commit 13a3ff696cd857a28ead32b623fd8a0bf8dc243f Author: FalloutFalcon Date: Sat Aug 10 21:36:59 2024 -0500 some player panel cruft and removes some random helms from centcomm commit 3aa25706e6ebae5dadd00b2c5caf1b6305358542 Author: FalloutFalcon Date: Sat Aug 10 21:28:03 2024 -0500 fixes player panel commit 32a5652cd8393dcd66bd664ae294689d9278366e Author: FalloutFalcon Date: Sat Aug 10 20:32:11 2024 -0500 dont add points of intrest twice please commit 65db0ec93949bbab596b59a3e02160326c52045f Author: FalloutFalcon Date: Sat Aug 10 17:03:44 2024 -0500 small fix to syntax commit 28d48d1d73762f7fd776f30dffffd6da8eb3e45b Author: FalloutFalcon Date: Sat Aug 10 17:01:44 2024 -0500 this? commit 6e917061cd3cf773f614c17c17c94dbdce77346d Author: FalloutFalcon Date: Sat Aug 10 16:56:58 2024 -0500 oops had the syntax wrong on the const, was still using func syntax commit 816d8c07318d5517807d736617fd57d767a3dd23 Author: FalloutFalcon Date: Sat Aug 10 16:52:46 2024 -0500 const instead of functions commit 3ba6d4f60f617cb4f0bbdb8497985b6fdea0e7cf Merge: d0ce67a8ae 7fd43e1582 Author: FalloutFalcon Date: Sat Aug 10 06:43:36 2024 -0500 Merge branch 'master' of https://github.com/shiptest-ss13/Shiptest into fixes-orbit-menu-i-hope commit d0ce67a8ae1d59119db54982279f50a4c3a8c67f Author: FalloutFalcon Date: Sun Jul 21 07:10:47 2024 -0500 removes some cruft vars commit 7d4c006b035af63b4339f14a4fa75591498aafc2 Author: FalloutFalcon Date: Sun Jul 21 06:59:01 2024 -0500 prettier commit 795854a3dd40172720241bb34ee308f56e70b846 Author: FalloutFalcon Date: Sun Jul 21 06:55:47 2024 -0500 removes unused vars commit b07af8d6ccab82232ed16ded7ffcec8a433c6d7b Author: FalloutFalcon Date: Sun Jul 21 06:52:31 2024 -0500 few more small fixees commit a5ca9c5f38dca2e019370086d8109b573eceaeec Author: FalloutFalcon Date: Sun Jul 21 05:54:50 2024 -0500 ports most of the tg orbit menu commit 7ace3d6ab1a1ad300701e74b517b3435632d465b Author: FalloutFalcon Date: Wed Jul 17 21:05:38 2024 -0500 this might fix it --- _maps/map_files/generic/CentCom.dmm | 12 +- code/__DEFINES/dcs/signals/signals.dm | 6 + code/__HELPERS/_lists.dm | 36 +++ code/__HELPERS/roundend.dm | 2 +- code/__HELPERS/unsorted.dm | 61 +--- code/_globalvars/lists/objects.dm | 2 - .../subsystem/points_of_interest.dm | 225 +++++++++++++++ code/datums/elements/point_of_interest.dm | 20 ++ code/datums/spawners_menu.dm | 2 +- code/game/atom/atom_orbit.dm | 33 +++ code/game/atoms.dm | 5 - code/game/gamemodes/wizard/wizard.dm | 2 +- code/game/mecha/mecha.dm | 4 +- code/game/objects/items/eightball.dm | 4 +- code/modules/admin/player_panel.dm | 12 +- code/modules/admin/verbs/adminjump.dm | 2 +- code/modules/antagonists/cult/runes.dm | 6 +- .../nukeop/equipment/nuclearbomb.dm | 8 +- .../nukeop/equipment/pinpointer.dm | 2 +- code/modules/antagonists/nukeop/nukeop.dm | 2 +- code/modules/awaymissions/capture_the_flag.dm | 4 +- code/modules/awaymissions/corpse.dm | 4 +- code/modules/cargo/centcom_podlauncher.dm | 2 +- code/modules/events/immovable_rod.dm | 4 +- code/modules/events/wizard/greentext.dm | 4 +- .../mining/lavaland/necropolis_chests.dm | 4 +- code/modules/mob/dead/observer/observer.dm | 9 +- code/modules/mob/dead/observer/orbit.dm | 268 ++++++++++++++---- code/modules/mob/living/living.dm | 1 + .../friendly/drone/drones_as_items.dm | 5 - .../hostile/megafauna/colossus.dm | 4 +- .../file_system/programs/radar.dm | 6 +- code/modules/overmap/helm.dm | 3 + code/modules/power/singularity/singularity.dm | 4 +- code/modules/power/supermatter/supermatter.dm | 4 +- code/modules/power/tesla/energy_ball.dm | 2 +- code/modules/projectiles/guns/energy/pulse.dm | 4 +- code/modules/spells/spell_types/lichdom.dm | 4 +- shiptest.dme | 3 + tgui/packages/tgui/interfaces/Orbit.js | 218 -------------- .../tgui/interfaces/Orbit/OrbitContent.tsx | 98 +++++++ .../tgui/interfaces/Orbit/OrbitItem.tsx | 50 ++++ .../tgui/interfaces/Orbit/OrbitSection.tsx | 65 +++++ .../tgui/interfaces/Orbit/OrbitTooltip.tsx | 57 ++++ .../tgui/interfaces/Orbit/constants.ts | 8 + .../packages/tgui/interfaces/Orbit/helpers.ts | 113 ++++++++ tgui/packages/tgui/interfaces/Orbit/index.tsx | 86 ++++++ tgui/packages/tgui/interfaces/Orbit/types.ts | 38 +++ 48 files changed, 1114 insertions(+), 404 deletions(-) create mode 100644 code/controllers/subsystem/points_of_interest.dm create mode 100644 code/datums/elements/point_of_interest.dm create mode 100644 code/game/atom/atom_orbit.dm delete mode 100644 tgui/packages/tgui/interfaces/Orbit.js create mode 100644 tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx create mode 100644 tgui/packages/tgui/interfaces/Orbit/OrbitItem.tsx create mode 100644 tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx create mode 100644 tgui/packages/tgui/interfaces/Orbit/OrbitTooltip.tsx create mode 100644 tgui/packages/tgui/interfaces/Orbit/constants.ts create mode 100644 tgui/packages/tgui/interfaces/Orbit/helpers.ts create mode 100644 tgui/packages/tgui/interfaces/Orbit/index.tsx create mode 100644 tgui/packages/tgui/interfaces/Orbit/types.ts diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index de0cba96be2f..451b655413d7 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -26,7 +26,7 @@ /turf/open/floor/plasteel/dark, /area/tdome/tdomeadmin) "afh" = ( -/obj/machinery/computer/helm{ +/obj/machinery/computer{ dir = 4 }, /obj/effect/turf_decal/industrial/warning{ @@ -1356,7 +1356,7 @@ /turf/open/floor/plasteel, /area/wizard_station) "ara" = ( -/obj/machinery/computer/helm, +/obj/machinery/computer, /turf/open/floor/plasteel, /area/wizard_station) "ard" = ( @@ -3940,7 +3940,7 @@ /turf/open/floor/mineral/titanium/blue, /area/centcom/evac) "aLP" = ( -/obj/machinery/computer/helm{ +/obj/machinery/computer{ dir = 1 }, /turf/open/floor/mineral/titanium/blue, @@ -8846,7 +8846,7 @@ }, /area/centcom) "gFU" = ( -/obj/machinery/computer/helm, +/obj/machinery/computer, /obj/effect/turf_decal/industrial/warning{ dir = 6 }, @@ -12249,7 +12249,7 @@ /turf/open/floor/plasteel/dark, /area/tdome/tdomeadmin) "nEL" = ( -/obj/machinery/computer/helm, +/obj/machinery/computer, /obj/effect/turf_decal/industrial/warning{ dir = 10 }, @@ -15797,7 +15797,7 @@ /turf/open/floor/plasteel/dark, /area/ctf) "vcL" = ( -/obj/machinery/computer/helm, +/obj/machinery/computer, /obj/effect/turf_decal/corner/transparent/bar, /obj/effect/turf_decal/corner/transparent/bar{ dir = 1 diff --git a/code/__DEFINES/dcs/signals/signals.dm b/code/__DEFINES/dcs/signals/signals.dm index 38f7d8692853..f3295b737904 100644 --- a/code/__DEFINES/dcs/signals/signals.dm +++ b/code/__DEFINES/dcs/signals/signals.dm @@ -735,3 +735,9 @@ ///sent when the access on an id is changed/updated, ensures wallets get updated once ids generate there access #define COSMIG_ACCESS_UPDATED "acces_updated" + +// Point of interest signals +/// Sent from base of /datum/controller/subsystem/points_of_interest/proc/on_poi_element_added : (atom/new_poi) +#define COMSIG_ADDED_POINT_OF_INTEREST "added_point_of_interest" +/// Sent from base of /datum/controller/subsystem/points_of_interest/proc/on_poi_element_removed : (atom/old_poi) +#define COMSIG_REMOVED_POINT_OF_INTEREST "removed_point_of_interest" diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index 435b83e29797..b231b4e944c9 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -87,6 +87,42 @@ };\ } while(FALSE) + +/** + * Custom binary search sorted insert utilising comparison procs instead of vars. + * INPUT: Object to be inserted + * LIST: List to insert object into + * TYPECONT: The typepath of the contents of the list + * COMPARE: The object to compare against, usualy the same as INPUT + * COMPARISON: The plaintext name of a proc on INPUT that takes a single argument to accept a single element from LIST and returns a positive, negative or zero number to perform a comparison. + * COMPTYPE: How should the values be compared? Either COMPARE_KEY or COMPARE_VALUE. + */ +#define BINARY_INSERT_PROC_COMPARE(INPUT, LIST, TYPECONT, COMPARE, COMPARISON, COMPTYPE) \ + do {\ + var/list/__BIN_LIST = LIST;\ + var/__BIN_CTTL = length(__BIN_LIST);\ + if(!__BIN_CTTL) {\ + __BIN_LIST += INPUT;\ + } else {\ + var/__BIN_LEFT = 1;\ + var/__BIN_RIGHT = __BIN_CTTL;\ + var/__BIN_MID = (__BIN_LEFT + __BIN_RIGHT) >> 1;\ + var ##TYPECONT/__BIN_ITEM;\ + while(__BIN_LEFT < __BIN_RIGHT) {\ + __BIN_ITEM = COMPTYPE;\ + if(__BIN_ITEM.##COMPARISON(COMPARE) <= 0) {\ + __BIN_LEFT = __BIN_MID + 1;\ + } else {\ + __BIN_RIGHT = __BIN_MID;\ + };\ + __BIN_MID = (__BIN_LEFT + __BIN_RIGHT) >> 1;\ + };\ + __BIN_ITEM = COMPTYPE;\ + __BIN_MID = __BIN_ITEM.##COMPARISON(COMPARE) > 0 ? __BIN_MID : __BIN_MID + 1;\ + __BIN_LIST.Insert(__BIN_MID, INPUT);\ + };\ + } while(FALSE) + //Returns a list in plain english as a string /proc/english_list(list/input, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = "" ) var/total = length(input) diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 97740a79537e..01fd964120ea 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -116,7 +116,7 @@ SSblackbox.record_feedback("associative", "antagonists", 1, antag_info) /datum/controller/subsystem/ticker/proc/record_nuke_disk_location() - var/obj/item/disk/nuclear/N = locate() in GLOB.poi_list + var/obj/item/disk/nuclear/N = locate() in SSpoints_of_interest.other_points_of_interest if(N) var/list/data = list() var/turf/T = get_turf(N) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 36764c6bae9f..d831296dbb62 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -294,65 +294,6 @@ Turf and target are separate in case you want to teleport some distance from a t /proc/ionnum() return "[pick("!","@","#","$","%","^","&")][pick("!","@","#","$","%","^","&","*")][pick("!","@","#","$","%","^","&","*")][pick("!","@","#","$","%","^","&","*")]" -//Returns a list of all items of interest with their name -/proc/getpois(mobs_only = FALSE, skip_mindless = FALSE, specify_dead_role = TRUE) - var/list/mobs = sortmobs() - var/list/namecounts = list() - var/list/pois = list() - for(var/mob/M in mobs) - if(skip_mindless && (!M.mind && !M.ckey)) - if(!isbot(M) && !iscameramob(M) && !ismegafauna(M)) - continue - if(M.client && M.client.holder && M.client.holder.fakekey) //stealthmins - continue - var/name = avoid_assoc_duplicate_keys(M.name, namecounts) + M.get_realname_string() - - if(M.stat == DEAD && specify_dead_role) - if(isobserver(M)) - name += " \[ghost\]" - else - name += " \[dead\]" - pois[name] = M - - if(!mobs_only) - for(var/atom/A in GLOB.poi_list) - if(!A || !A.loc) - continue - pois[avoid_assoc_duplicate_keys(A.name, namecounts)] = A - - return pois -//Orders mobs by type then by name -/proc/sortmobs() - var/list/moblist = list() - var/list/sortmob = sortNames(GLOB.mob_list) - for(var/mob/living/silicon/ai/M in sortmob) - moblist.Add(M) - for(var/mob/camera/M in sortmob) - moblist.Add(M) - for(var/mob/living/silicon/pai/M in sortmob) - moblist.Add(M) - for(var/mob/living/silicon/robot/M in sortmob) - moblist.Add(M) - for(var/mob/living/carbon/human/M in sortmob) - moblist.Add(M) - for(var/mob/living/brain/M in sortmob) - moblist.Add(M) - for(var/mob/living/carbon/alien/M in sortmob) - moblist.Add(M) - for(var/mob/dead/observer/M in sortmob) - moblist.Add(M) - for(var/mob/dead/new_player/M in sortmob) - moblist.Add(M) - for(var/mob/living/carbon/monkey/M in sortmob) - moblist.Add(M) - for(var/mob/living/simple_animal/slime/M in sortmob) - moblist.Add(M) - for(var/mob/living/simple_animal/M in sortmob) - moblist.Add(M) - for(var/mob/living/carbon/true_devil/M in sortmob) - moblist.Add(M) - return moblist - // Format a power value in W, kW, MW, or GW. /proc/DisplayPower(powerused) if(powerused < 1000) //Less than a kW @@ -384,7 +325,7 @@ Turf and target are separate in case you want to teleport some distance from a t /proc/get_mob_by_ckey(key) if(!key) return - var/list/mobs = sortmobs() + var/list/mobs = SSpoints_of_interest.get_mob_pois() for(var/mob/M in mobs) if(M.ckey == key) return M diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 7ee53ec1f37b..6d08f1d1bceb 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -46,8 +46,6 @@ GLOBAL_LIST_EMPTY(apcs_list) GLOBAL_LIST_EMPTY(tracked_implants) /// List of implants the prisoner console can track and send inject commands too GLOBAL_LIST_EMPTY(tracked_chem_implants) -/// List of points of interest for observe/follow -GLOBAL_LIST_EMPTY(poi_list) /// List of all pinpointers. Used to change stuff they are pointing to all at once. GLOBAL_LIST_EMPTY(pinpointer_list) /// List of all zombie_infection organs, for any mass "animation" diff --git a/code/controllers/subsystem/points_of_interest.dm b/code/controllers/subsystem/points_of_interest.dm new file mode 100644 index 000000000000..b8e8b6397424 --- /dev/null +++ b/code/controllers/subsystem/points_of_interest.dm @@ -0,0 +1,225 @@ +/// Subsystem for managing all POIs. +SUBSYSTEM_DEF(points_of_interest) + name = "Points of Interest" + + flags = SS_NO_FIRE | SS_NO_INIT + + /// List of mob POIs. This list is automatically sorted. + var/list/datum/point_of_interest/mob_poi/mob_points_of_interest = list() + /// List of non-mob POIs. This list is automatically sorted. + var/list/datum/point_of_interest/other_points_of_interest = list() + /// List of all value:POI datums by their key:target refs. + var/list/datum/point_of_interest/points_of_interest_by_target_ref = list() + +/** + * Turns new_poi into a new point of interest by adding the /datum/element/point_of_interest element to it. + */ +/datum/controller/subsystem/points_of_interest/proc/make_point_of_interest(atom/new_poi) + new_poi.AddElement(/datum/element/point_of_interest) + +/** + * Stops old_poi from being a point of interest by removing the /datum/element/point_of_interest element from it. + */ +/datum/controller/subsystem/points_of_interest/proc/remove_point_of_interest(atom/old_poi) + old_poi.RemoveElement(/datum/element/point_of_interest) + +/** + * Called by [/datum/element/point_of_interest] when it gets removed from old_poi. + */ +/datum/controller/subsystem/points_of_interest/proc/on_poi_element_added(atom/new_poi) + var/datum/point_of_interest/new_poi_datum + if(ismob(new_poi)) + new_poi_datum = new /datum/point_of_interest/mob_poi(new_poi) + BINARY_INSERT_PROC_COMPARE(new_poi_datum, mob_points_of_interest, /datum/point_of_interest/mob_poi, new_poi_datum, compare_to, COMPARE_KEY) + points_of_interest_by_target_ref[REF(new_poi)] = new_poi_datum + else + new_poi_datum = new /datum/point_of_interest(new_poi) + BINARY_INSERT_PROC_COMPARE(new_poi_datum, other_points_of_interest, /datum/point_of_interest, new_poi_datum, compare_to, COMPARE_KEY) + points_of_interest_by_target_ref[REF(new_poi)] = new_poi_datum + + + SEND_SIGNAL(src, COMSIG_ADDED_POINT_OF_INTEREST, new_poi) + +/** + * Called by [/datum/element/point_of_interest] when it gets removed from old_poi. + */ +/datum/controller/subsystem/points_of_interest/proc/on_poi_element_removed(atom/old_poi) + var/poi_ref = REF(old_poi) + var/datum/point_of_interest/poi_to_remove = points_of_interest_by_target_ref[poi_ref] + + if(!poi_to_remove) + return + + if(ismob(old_poi)) + mob_points_of_interest -= poi_to_remove + else + other_points_of_interest -= poi_to_remove + + points_of_interest_by_target_ref -= poi_ref + + poi_to_remove.target = null + + SEND_SIGNAL(src, COMSIG_REMOVED_POINT_OF_INTEREST, old_poi) + +/** + * If there is a valid POI for a given reference, it returns that POI's associated atom. Otherwise, it returns null. + */ +/datum/controller/subsystem/points_of_interest/proc/get_poi_atom_by_ref(reference) + return points_of_interest_by_target_ref[reference]?.target + +/** + * Returns a list of mob POIs with names as keys and mobs as values. + * + * If multiple POIs have the same name, then avoid_assoc_duplicate_keys is used alongside used_name_list to + * tag them as Mob Name (1), Mob Name (2), Mob Name (3) etc. + * + * Arguments: + * * poi_validation_override - [OPTIONAL] Callback to a proc that takes a single argument for the POI and returns TRUE if this POI should be included. Overrides standard POI validation. + * * append_dead_role - [OPTIONAL] If TRUE, adds a ghost tag to the end of observer names and a dead tag to the end of any other mob which is not alive. + */ +/datum/controller/subsystem/points_of_interest/proc/get_mob_pois(datum/callback/poi_validation_override = null, append_dead_role = TRUE) + var/list/pois = list() + var/list/used_name_list = list() + + for(var/datum/point_of_interest/mob_poi/mob_poi as anything in mob_points_of_interest) + if(poi_validation_override) + if(!poi_validation_override.Invoke(mob_poi)) + continue + else if(!mob_poi.validate()) + continue + + var/mob/target_mob = mob_poi.target + var/name = avoid_assoc_duplicate_keys(target_mob.name, used_name_list) + target_mob.get_realname_string() + + // Add the ghost/dead tag to the end of dead mob POIs. + if(append_dead_role && target_mob.stat == DEAD) + if(isobserver(target_mob)) + name += " \[ghost\]" + else + name += " \[dead\]" + + pois[name] = target_mob + + return pois + +/** + * Returns a list of non-mob POIs with names as keys and atoms as values. + * + * If multiple POIs have the same name, then avoid_assoc_duplicate_keys is used alongside used_name_list to + * tag them as Object Name (1), Object Name (2), Object Name (3) etc. + * + * Arguments: + * * poi_validation_override - [OPTIONAL] Callback to a proc that takes a single argument for the POI and returns TRUE if this POI should be included. Overrides standard POI validation. + */ +/datum/controller/subsystem/points_of_interest/proc/get_other_pois(datum/callback/poi_validation_override = null) + var/list/pois = list() + var/list/used_name_list = list() + + for(var/datum/point_of_interest/other_poi as anything in other_points_of_interest) + if(poi_validation_override) + if(!poi_validation_override.Invoke(other_poi)) + continue + else if(!other_poi.validate()) + continue + + var/atom/target_poi = other_poi.target + + pois[avoid_assoc_duplicate_keys(target_poi.name, used_name_list)] = target_poi + + return pois + +/// Returns TRUE if potential_poi has an associated poi_datum that validates. +/datum/controller/subsystem/points_of_interest/proc/is_valid_poi(atom/potential_poi, datum/callback/poi_validation_override = null) + var/datum/point_of_interest/poi_datum = points_of_interest_by_target_ref[REF(potential_poi)] + + if(!poi_datum) + return FALSE + + if(poi_validation_override) + return poi_validation_override.Invoke(poi_datum) + + return poi_datum.validate() + +/// Simple helper datum for points of interest. +/datum/point_of_interest + /// The specific point of interest this datum references. This won't hard del as the POI element will be removed from the target when it qdels, which will clear this reference. + var/atom/target + /// The type of POI this datum references. + var/poi_type = /atom + +/datum/point_of_interest/New(poi_target) + if(!istype(poi_target, poi_type)) + CRASH("Incorrect target type provided to /datum/point_of_interest/New: Expected \[[poi_type]\]") + + target = poi_target + +/// Validates the POI. Returns TRUE if the POI has valid state, returns FALSE if the POI has invalid state. +/datum/point_of_interest/proc/validate() + // In nullspace, invalid as a POI. + if(!target.loc) + return FALSE + + return TRUE + +/// Comparison proc used to sort POIs. Override to implement logic used doing binary sort insertions. +/datum/point_of_interest/proc/compare_to(datum/point_of_interest/rhs) + return cmp_name_asc(target, rhs.target) + +/datum/point_of_interest/mob_poi + poi_type = /mob + +/// Validation for mobs is expanded to invalidate stealthmins and /mob/dead/new_player as POIs. +/datum/point_of_interest/mob_poi/validate() + . = ..() + + if(!.) + return + + var/mob/poi_mob = target + + // Stealthmin, invalid as a POI. + if(poi_mob.client?.holder?.fakekey) + return FALSE + + // POI is a /mob/dead/new_player, players in the lobby are invalid as POIs. + if(isnewplayer(poi_mob)) + return FALSE + + return TRUE + +/// Mob POIs are sorted by a simple priority list depending on their type. When their type priority is identical, they're sub-sorted by name. +/datum/point_of_interest/mob_poi/compare_to(datum/point_of_interest/mob_poi/rhs) + var/sort_difference = get_type_sort_priority() - rhs.get_type_sort_priority() + + // If they're equal in priority, call parent to sort by name. + if(sort_difference == 0) + return ..() + // Else sort by priority. + else + return sort_difference + +/// Priority list broadly stolen from /proc/sortmobs(). Lower numbers are higher priorities when sorted and appear closer to the top or start of lists. +/datum/point_of_interest/mob_poi/proc/get_type_sort_priority() + if(isAI(target)) + return 0 + if(iscameramob(target)) + return 1 + if(ispAI(target)) + return 2 + if(iscyborg(target)) + return 3 + if(ishuman(target)) + return 4 + if(isbrain(target)) + return 5 + if(isalien(target)) + return 6 + if(isobserver(target)) + return 7 + if(isnewplayer(target)) + return 8 + if(isslime(target)) + return 9 + if(isanimal(target)) + return 10 + return 11 diff --git a/code/datums/elements/point_of_interest.dm b/code/datums/elements/point_of_interest.dm new file mode 100644 index 000000000000..3ab6c6296293 --- /dev/null +++ b/code/datums/elements/point_of_interest.dm @@ -0,0 +1,20 @@ +/// Designates the atom as a "point of interest", meaning it can be directly orbited +/datum/element/point_of_interest + element_flags = ELEMENT_DETACH + +/datum/element/point_of_interest/Attach(datum/target) + if (!isatom(target)) + return ELEMENT_INCOMPATIBLE + + // New players are abstract mobs assigned to people who are still in the lobby screen. + // As a result, they are not a valid POI and should never be a valid POI. If they + // somehow get this element attached to them, there's something we need to debug. + if(isnewplayer(target)) + return ELEMENT_INCOMPATIBLE + + SSpoints_of_interest.on_poi_element_added(target) + return ..() + +/datum/element/point_of_interest/Detach(datum/target) + SSpoints_of_interest.on_poi_element_removed(target) + return ..() diff --git a/code/datums/spawners_menu.dm b/code/datums/spawners_menu.dm index 9e7e4b334ddc..01709a00c1a1 100644 --- a/code/datums/spawners_menu.dm +++ b/code/datums/spawners_menu.dm @@ -53,7 +53,7 @@ if(!spawnerlist.len) return var/obj/effect/mob_spawn/MS = pick(spawnerlist) - if(!istype(MS) || !(MS in GLOB.poi_list)) + if(!istype(MS) || !(MS in SSpoints_of_interest.other_points_of_interest)) return switch(action) if("jump") diff --git a/code/game/atom/atom_orbit.dm b/code/game/atom/atom_orbit.dm new file mode 100644 index 000000000000..2294293bd8b7 --- /dev/null +++ b/code/game/atom/atom_orbit.dm @@ -0,0 +1,33 @@ +/atom + ///Reference to atom being orbited + var/atom/orbit_target + ///The orbiter component, if there's anything orbiting this atom + var/datum/component/orbiter/orbiters + +/** + * Recursive getter method to return a list of all ghosts orbitting this atom + * + * This will work fine without manually passing arguments. + * * processed - The list of atoms we've already convered + * * source - Is this the atom for who we're counting up all the orbiters? + * * ignored_stealthed_admins - If TRUE, don't count admins who are stealthmoded and orbiting this + */ +/atom/proc/get_all_orbiters(list/processed, source = TRUE, ignore_stealthed_admins = TRUE) + var/list/output = list() + if(!processed) + processed = list() + else if(src in processed) + return output + + if(!source) + output += src + + processed += src + for(var/atom/atom_orbiter as anything in orbiters?.orbiters) + output += atom_orbiter.get_all_orbiters(processed, source = FALSE) + return output + +/mob/get_all_orbiters(list/processed, source = TRUE, ignore_stealthed_admins = TRUE) + if(!source && ignore_stealthed_admins && client?.holder?.fakekey) + return list() + return ..() diff --git a/code/game/atoms.dm b/code/game/atoms.dm index f52b9bdace9e..b96e8a53c824 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -75,9 +75,6 @@ ///Economy cost of item in premium vendor var/custom_premium_price - //List of datums orbiting this atom - var/datum/component/orbiter/orbiters - /// Radiation insulation types var/rad_insulation = RAD_NO_INSULATION @@ -154,8 +151,6 @@ /// The current connector overlay appearance. Saved so that it can be cut when necessary. var/connector_overlay - ///Reference to atom being orbited - var/atom/orbit_target ///Default X pixel offset var/base_pixel_x ///Default Y pixel offset diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index c3895f302279..83d7a32d1fd9 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -56,7 +56,7 @@ if(isliving(wizard.current) && wizard.current.stat!=DEAD) return FALSE - for(var/obj/item/phylactery/P in GLOB.poi_list) //TODO : IsProperlyDead() + for(var/obj/item/phylactery/P in SSpoints_of_interest.other_points_of_interest) //TODO : IsProperlyDead() if(P.mind && P.mind.has_antag_datum(/datum/antagonist/wizard)) return FALSE diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index b903564c88d6..a1b46fd2fbfa 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -137,7 +137,7 @@ add_scanmod() add_capacitor() START_PROCESSING(SSobj, src) - GLOB.poi_list |= src + SSpoints_of_interest.make_point_of_interest(src) log_message("[src.name] created.", LOG_MECHA) GLOB.mechas_list += src //global mech list prepare_huds() @@ -176,7 +176,7 @@ AI.gib() //No wreck, no AI to recover AI = null STOP_PROCESSING(SSobj, src) - GLOB.poi_list.Remove(src) + SSpoints_of_interest.remove_point_of_interest(src) equipment.Cut() for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) diff --git a/code/game/objects/items/eightball.dm b/code/game/objects/items/eightball.dm index 1396521aaf9a..b721393e85ed 100644 --- a/code/game/objects/items/eightball.dm +++ b/code/game/objects/items/eightball.dm @@ -136,10 +136,10 @@ become_hearing_sensitive(ROUNDSTART_TRAIT) for (var/answer in haunted_answers) votes[answer] = 0 - GLOB.poi_list |= src + SSpoints_of_interest.make_point_of_interest(src) /obj/item/toy/eightball/haunted/Destroy() - GLOB.poi_list -= src + SSpoints_of_interest.remove_point_of_interest(src) . = ..() /obj/item/toy/eightball/haunted/MakeHaunted() diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index cf834c9f9c5d..e5888f8088df 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -216,9 +216,10 @@ "} - var/list/mobs = sortmobs() + var/list/mobs = SSpoints_of_interest.get_mob_pois() var/i = 1 - for(var/mob/M in mobs) + for(var/mob_name in mobs) + var/mob/M = mobs[mob_name] if(M.ckey) var/color = "#e6e6e6" @@ -254,12 +255,7 @@ M_job = "Silicon-based" else if(isanimal(M)) //simple animals - if(iscorgi(M)) - M_job = "Corgi" - else if(isslime(M)) - M_job = "slime" - else - M_job = "Animal" + M_job = "Animal" else M_job = "Living" diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm index 9b84224317a9..708448cf52cd 100644 --- a/code/modules/admin/verbs/adminjump.dm +++ b/code/modules/admin/verbs/adminjump.dm @@ -140,7 +140,7 @@ usr.forceMove(M.loc) SSblackbox.record_feedback("tally", "admin_verb", 1, "Get Key") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/proc/sendmob(mob/M in sortmobs()) +/client/proc/sendmob(mob/M in SSpoints_of_interest.get_mob_pois()) set category = "Admin.Game" set name = "Send Mob" if(!src.holder) diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index 5058dc73f081..d27ee061d462 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -458,10 +458,10 @@ structure_check() searches for nearby cultist structures required for the invoca /obj/effect/rune/narsie/Initialize(mapload, set_keyword) . = ..() - GLOB.poi_list |= src + SSpoints_of_interest.make_point_of_interest(src) /obj/effect/rune/narsie/Destroy() - GLOB.poi_list -= src + SSpoints_of_interest.remove_point_of_interest(src) . = ..() /obj/effect/rune/narsie/conceal() //can't hide this, and you wouldn't want to @@ -477,7 +477,7 @@ structure_check() searches for nearby cultist structures required for the invoca if(!(place in summon_objective.summon_spots)) to_chat(user, "The Geometer can only be summoned where the veil is weak - in [english_list(summon_objective.summon_spots)]!") return - if(locate(/obj/singularity/narsie) in GLOB.poi_list) + if(locate(/obj/singularity/narsie) in SSpoints_of_interest.other_points_of_interest) for(var/M in invokers) to_chat(M, "Nar'Sie is already on this plane!") log_game("Nar'Sie rune failed - already summoned") diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm index 920fbbdd557b..d53d1bc4cca0 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm @@ -38,7 +38,7 @@ core = new /obj/item/nuke_core(src) STOP_PROCESSING(SSobj, core) update_appearance() - GLOB.poi_list |= src + SSpoints_of_interest.make_point_of_interest(src) previous_level = get_security_level() /obj/machinery/nuclearbomb/Destroy() @@ -46,7 +46,7 @@ if(!exploding) // If we're not exploding, set the alert level back to normal set_safety() - GLOB.poi_list -= src + SSpoints_of_interest.remove_point_of_interest(src) GLOB.nuke_list -= src QDEL_NULL(countdown) QDEL_NULL(core) @@ -611,7 +611,7 @@ This is here to make the tiles around the station mininuke change when it's arme AddElement(/datum/element/bed_tuckable, 6, -6, 0) if(!fake) - GLOB.poi_list |= src + SSpoints_of_interest.make_point_of_interest(src) last_disk_move = world.time START_PROCESSING(SSobj, src) @@ -675,7 +675,7 @@ This is here to make the tiles around the station mininuke change when it's arme /obj/item/disk/nuclear/Destroy(force=FALSE) // respawning is handled in /obj/Destroy() if(force) - GLOB.poi_list -= src + SSpoints_of_interest.remove_point_of_interest(src) . = ..() /obj/item/disk/nuclear/fake diff --git a/code/modules/antagonists/nukeop/equipment/pinpointer.dm b/code/modules/antagonists/nukeop/equipment/pinpointer.dm index b316e60c5e14..c1f9ffa37428 100644 --- a/code/modules/antagonists/nukeop/equipment/pinpointer.dm +++ b/code/modules/antagonists/nukeop/equipment/pinpointer.dm @@ -32,7 +32,7 @@ target = null switch(mode) if(TRACK_NUKE_DISK) - var/obj/item/disk/nuclear/N = locate() in GLOB.poi_list + var/obj/item/disk/nuclear/N = locate() in SSpoints_of_interest.other_points_of_interest target = N if(TRACK_MALF_AI) for(var/V in GLOB.ai_list) diff --git a/code/modules/antagonists/nukeop/nukeop.dm b/code/modules/antagonists/nukeop/nukeop.dm index 9f807d9521e7..f51c64142450 100644 --- a/code/modules/antagonists/nukeop/nukeop.dm +++ b/code/modules/antagonists/nukeop/nukeop.dm @@ -345,7 +345,7 @@ /datum/team/nuclear/antag_listing_entry() var/disk_report = "Nuclear Disk(s)
" disk_report += "
" - for(var/obj/item/disk/nuclear/N in GLOB.poi_list) + for(var/obj/item/disk/nuclear/N in SSpoints_of_interest.other_points_of_interest) disk_report += "
[N.name], " var/atom/disk_loc = N.loc while(!isturf(disk_loc)) diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm index 2f87eea6d2a7..17458c661f1b 100644 --- a/code/modules/awaymissions/capture_the_flag.dm +++ b/code/modules/awaymissions/capture_the_flag.dm @@ -194,10 +194,10 @@ /obj/machinery/capture_the_flag/Initialize() . = ..() - GLOB.poi_list |= src + SSpoints_of_interest.make_point_of_interest(src) /obj/machinery/capture_the_flag/Destroy() - GLOB.poi_list.Remove(src) + SSpoints_of_interest.remove_point_of_interest(src) return ..() /obj/machinery/capture_the_flag/process() diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 0bf0b74c715a..26361b99cfc6 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -61,11 +61,11 @@ if(instant || (roundstart && (mapload || (SSticker && SSticker.current_state > GAME_STATE_SETTING_UP)))) INVOKE_ASYNC(src, PROC_REF(create)) else if(ghost_usable) - GLOB.poi_list |= src + SSpoints_of_interest.make_point_of_interest(src) LAZYADD(GLOB.mob_spawners[name], src) /obj/effect/mob_spawn/Destroy() - GLOB.poi_list -= src + SSpoints_of_interest.remove_point_of_interest(src) var/list/spawners = GLOB.mob_spawners[name] LAZYREMOVE(spawners, src) if(!LAZYLEN(spawners)) diff --git a/code/modules/cargo/centcom_podlauncher.dm b/code/modules/cargo/centcom_podlauncher.dm index dfec659e1644..0b302925e10e 100644 --- a/code/modules/cargo/centcom_podlauncher.dm +++ b/code/modules/cargo/centcom_podlauncher.dm @@ -383,7 +383,7 @@ if (specificTarget) specificTarget = null return - var/list/mobs = getpois()//code stolen from observer.dm + var/list/mobs = SSpoints_of_interest.get_mob_pois() var/inputTarget = input("Select a mob! (Smiting does this automatically)", "Target", null, null) as null|anything in mobs if (isnull(inputTarget)) return diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm index adde1124935f..4ba2d878ad46 100644 --- a/code/modules/events/immovable_rod.dm +++ b/code/modules/events/immovable_rod.dm @@ -62,7 +62,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 z_original = z destination = end special_target = aimed_at - GLOB.poi_list += src + SSpoints_of_interest.make_point_of_interest(src) var/special_target_valid = FALSE if(special_target) @@ -81,7 +81,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 ghost.ManualFollow(src) /obj/effect/immovablerod/Destroy() - GLOB.poi_list -= src + SSpoints_of_interest.remove_point_of_interest(src) . = ..() /obj/effect/immovablerod/Moved() diff --git a/code/modules/events/wizard/greentext.dm b/code/modules/events/wizard/greentext.dm index 890bbc0f1f2b..8e4baab893fc 100644 --- a/code/modules/events/wizard/greentext.dm +++ b/code/modules/events/wizard/greentext.dm @@ -34,7 +34,7 @@ /obj/item/greentext/Initialize(mapload) . = ..() - GLOB.poi_list |= src + SSpoints_of_interest.make_point_of_interest(src) roundend_callback = CALLBACK(src, PROC_REF(check_winner)) SSticker.OnRoundend(roundend_callback) @@ -83,7 +83,7 @@ if(!(resistance_flags & ON_FIRE) && !force) return QDEL_HINT_LETMELIVE - GLOB.poi_list.Remove(src) + SSpoints_of_interest.remove_point_of_interest(src) LAZYREMOVE(SSticker.round_end_events, roundend_callback) roundend_callback = null //This ought to free the callback datum, and prevent us from harddeling for(var/i in GLOB.player_list) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index a2b48d9319b9..4bfa9c67e674 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -1234,7 +1234,7 @@ . = ..() spirits = list() START_PROCESSING(SSobj, src) - GLOB.poi_list |= src + SSpoints_of_interest.make_point_of_interest(src) AddComponent(/datum/component/butchering, 150, 90) /obj/item/melee/ghost_sword/Destroy() @@ -1242,7 +1242,7 @@ G.invisibility = GLOB.observer_default_invisibility spirits.Cut() STOP_PROCESSING(SSobj, src) - GLOB.poi_list -= src + SSpoints_of_interest.remove_point_of_interest(src) . = ..() /obj/item/melee/ghost_sword/attack_self(mob/user) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index c15c4a1af835..ceff585ea460 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -62,6 +62,9 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) var/datum/orbit_menu/orbit_menu var/datum/spawners_menu/spawners_menu + // The POI we're orbiting (orbit menu) + var/orbiting_ref + /mob/dead/observer/Initialize() set_invisibility(GLOB.observer_default_invisibility) @@ -142,6 +145,8 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) . = ..() + SSpoints_of_interest.make_point_of_interest(src) + grant_all_languages() show_data_huds() data_huds_on = 1 @@ -499,7 +504,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/list/dest = list() //List of possible destinations (mobs) var/target = null //Chosen target. - dest += getpois(mobs_only = TRUE) //Fill list, prompt user with list + dest += SSpoints_of_interest.get_mob_pois() target = input("Please, select a player!", "Jump to Mob", null, null) as null|anything in dest if (!target)//Make sure we actually have a target @@ -852,7 +857,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set name = "Observe" set category = "Ghost" - var/list/creatures = getpois() + var/list/creatures = SSpoints_of_interest.get_mob_pois() reset_perspective(null) diff --git a/code/modules/mob/dead/observer/orbit.dm b/code/modules/mob/dead/observer/orbit.dm index 86d54577538c..eb1c54df7934 100644 --- a/code/modules/mob/dead/observer/orbit.dm +++ b/code/modules/mob/dead/observer/orbit.dm @@ -1,6 +1,9 @@ /datum/orbit_menu + ///mobs worth orbiting. Because spaghetti, all mobs have the point of interest, but only some are allowed to actually show up. + ///this obviously should be changed in the future, so we only add mobs as POI if they actually are interesting, and we don't use + ///a typecache. + var/static/list/mob_allowed_typecache var/mob/dead/observer/owner - var/auto_observe = FALSE /datum/orbit_menu/New(mob/dead/observer/new_owner) if(!istype(new_owner)) @@ -23,87 +26,240 @@ switch(action) if ("orbit") var/ref = params["ref"] - var/atom/movable/poi = (locate(ref) in GLOB.mob_list) || (locate(ref) in GLOB.poi_list) - if (poi == null) - . = TRUE - return + var/auto_observe = params["auto_observe"] + var/atom/movable/poi = SSpoints_of_interest.get_poi_atom_by_ref(ref) + + if((ismob(poi) && !SSpoints_of_interest.is_valid_poi(poi, CALLBACK(src, PROC_REF(validate_mob_poi)))) \ + || !SSpoints_of_interest.is_valid_poi(poi) + ) + to_chat(usr, span_notice("That point of interest is no longer valid.")) + return TRUE + + var/mob/dead/observer/user = usr owner.ManualFollow(poi) owner.reset_perspective(null) + user.orbiting_ref = ref if (auto_observe) owner.do_observe(poi) . = TRUE if ("refresh") update_static_data(owner, ui) . = TRUE - if ("toggle_observe") - auto_observe = !auto_observe - if (auto_observe && owner.orbit_target) - owner.do_observe(owner.orbit_target) - else - owner.reset_perspective(null) + /datum/orbit_menu/ui_data(mob/user) var/list/data = list() - data["auto_observe"] = auto_observe + + if(isobserver(user)) + data["orbiting"] = get_currently_orbiting(user) + return data /datum/orbit_menu/ui_static_data(mob/user) - var/list/data = list() + var/list/new_mob_pois = SSpoints_of_interest.get_mob_pois(CALLBACK(src, PROC_REF(validate_mob_poi)), append_dead_role = FALSE) + var/list/new_other_pois = SSpoints_of_interest.get_other_pois() var/list/alive = list() var/list/antagonists = list() + var/list/critical = list() var/list/dead = list() var/list/ghosts = list() var/list/misc = list() var/list/npcs = list() + var/list/ships = list() - var/list/pois = getpois(skip_mindless = TRUE, specify_dead_role = FALSE) - for (var/name in pois) + for(var/name in new_mob_pois) var/list/serialized = list() - serialized["name"] = name - - var/poi = pois[name] - - serialized["ref"] = REF(poi) - - var/mob/M = poi - if (istype(M)) - if (isobserver(M)) - ghosts += list(serialized) - else if (M.stat == DEAD) - dead += list(serialized) - else if (M.mind == null) - npcs += list(serialized) - else - var/number_of_orbiters = M.orbiters?.orbiters?.len - if (number_of_orbiters) - serialized["orbiters"] = number_of_orbiters - - var/datum/mind/mind = M.mind - var/was_antagonist = FALSE - - for (var/_A in mind.antag_datums) - var/datum/antagonist/A = _A - if (A.show_to_ghosts) - was_antagonist = TRUE - serialized["antag"] = A.name - antagonists += list(serialized) - break - - if (!was_antagonist) - alive += list(serialized) + var/mob/mob_poi = new_mob_pois[name] + var/number_of_orbiters = length(mob_poi.get_all_orbiters()) + + serialized["ref"] = REF(mob_poi) + serialized["full_name"] = mob_poi.name + serialized["job"] = mob_poi.job + if(number_of_orbiters) + serialized["orbiters"] = number_of_orbiters + + if(isobserver(mob_poi)) + ghosts += list(serialized) + continue + + if(mob_poi.stat == DEAD) + dead += list(serialized) + continue + + if(isnull(mob_poi.mind)) + if(isliving(mob_poi)) + var/mob/living/npc = mob_poi + serialized["health"] = FLOOR((npc.health / npc.maxHealth * 100), 1) + + npcs += list(serialized) + continue + + serialized["client"] = !!mob_poi.client + serialized["name"] = mob_poi.real_name + + if(isliving(mob_poi)) + serialized += get_living_data(mob_poi) + + var/list/antag_data = get_antag_data(mob_poi.mind) + if(length(antag_data)) + serialized += antag_data + antagonists += list(serialized) + continue + + alive += list(serialized) + + for(var/name in new_other_pois) + var/atom/atom_poi = new_other_pois[name] + + var/list/other_data = get_misc_data(atom_poi) + var/misc_data = list(other_data[1]) + + if(istype(atom_poi, /obj/machinery/computer/helm)) + ships += misc_data else - misc += list(serialized) - - data["alive"] = alive - data["antagonists"] = antagonists - data["dead"] = dead - data["ghosts"] = ghosts - data["misc"] = misc - data["npcs"] = npcs - return data + misc += misc_data + + if(other_data[2]) // Critical = TRUE + critical += misc_data + + return list( + "alive" = alive, + "antagonists" = antagonists, + "critical" = critical, + "dead" = dead, + "ghosts" = ghosts, + "misc" = misc, + "npcs" = npcs, + "ships" = ships, + ) /datum/orbit_menu/ui_assets() . = ..() || list() . += get_asset_datum(/datum/asset/simple/orbit) +/// Helper function to get threat type, group, overrides for job and icon +/datum/orbit_menu/proc/get_antag_data(datum/mind/poi_mind) as /list + var/list/serialized = list() + + for(var/datum/antagonist/antag as anything in poi_mind.antag_datums) + if(!antag.show_to_ghosts) + continue + + serialized["antag"] = antag.name + serialized["antag_group"] = antag.antagpanel_category + serialized["job"] = antag.name + serialized["icon"] = antag.antag_hud_name + + return serialized + +/// Helper to get the current thing we're orbiting (if any) +/datum/orbit_menu/proc/get_currently_orbiting(mob/dead/observer/user) + if(isnull(user.orbiting_ref)) + return + + var/atom/poi = SSpoints_of_interest.get_poi_atom_by_ref(user.orbiting_ref) + if(isnull(poi)) + user.orbiting_ref = null + return + + if((ismob(poi) && !SSpoints_of_interest.is_valid_poi(poi, CALLBACK(src, PROC_REF(validate_mob_poi)))) \ + || !SSpoints_of_interest.is_valid_poi(poi) + ) + user.orbiting_ref = null + return + + var/list/serialized = list() + + if(!ismob(poi)) + var/list/misc_info = get_misc_data(poi) + serialized += misc_info[1] + return serialized + + var/mob/mob_poi = poi + serialized["full_name"] = mob_poi.name + serialized["ref"] = REF(poi) + + if(mob_poi.mind) + serialized["client"] = !!mob_poi.client + serialized["name"] = mob_poi.real_name + + if(isliving(mob_poi)) + serialized += get_living_data(mob_poi) + + return serialized + +/// Helper function to get job / icon / health data for a living mob +/datum/orbit_menu/proc/get_living_data(mob/living/player) as /list + var/list/serialized = list() + + serialized["health"] = FLOOR((player.health / player.maxHealth * 100), 1) + + return serialized + + +/// Gets a list: Misc data and whether it's critical. Handles all snowflakey type cases +/datum/orbit_menu/proc/get_misc_data(atom/movable/atom_poi) as /list + var/list/misc = list() + var/critical = FALSE + + misc["ref"] = REF(atom_poi) + misc["full_name"] = atom_poi.name + + // Display the nuke timer + if(istype(atom_poi, /obj/machinery/nuclearbomb)) + var/obj/machinery/nuclearbomb/bomb = atom_poi + + if(bomb.timing) + misc["extra"] = "Timer: [bomb.countdown?.displayed_text]s" + critical = TRUE + + return list(misc, critical) + + // Display the holder if its a nuke disk + if(istype(atom_poi, /obj/item/disk/nuclear)) + var/obj/item/disk/nuclear/disk = atom_poi + var/mob/holder = disk.pulledby || get(disk, /mob) + misc["extra"] = "Location: [holder?.real_name || "Unsecured"]" + + return list(misc, critical) + + // Display singuloths if they exist + if(istype(atom_poi, /obj/singularity)) + var/obj/singularity/singulo = atom_poi + misc["extra"] = "Energy: [round(singulo.energy)]" + + if(singulo.current_size > 2) + critical = TRUE + + return list(misc, critical) + + if(istype(atom_poi, /obj/machinery/computer/helm)) + var/obj/machinery/computer/helm/helm_poi = atom_poi + if(helm_poi.current_ship) + misc["extra"] = "Ship: [helm_poi.current_ship.name]" + + return list(misc, critical) + + return list(misc, critical) + +/** + * Helper POI validation function passed as a callback to various SSpoints_of_interest procs. + * + * Provides extended validation above and beyond standard, limiting mob POIs without minds or ckeys + * unless they're mobs, camera mobs or megafauna. Also allows exceptions for mobs that are deadchat controlled. + * + * If they satisfy that requirement, falls back to default validation for the POI. + */ +/datum/orbit_menu/proc/validate_mob_poi(datum/point_of_interest/mob_poi/potential_poi) + var/mob/potential_mob_poi = potential_poi.target + if(!potential_mob_poi.mind && !potential_mob_poi.ckey) + if(!mob_allowed_typecache) + mob_allowed_typecache = typecacheof(list( + /mob/living/simple_animal/hostile/megafauna, + /mob/living/simple_animal/hostile/boss + )) + if(!is_type_in_typecache(potential_mob_poi, mob_allowed_typecache) && !potential_mob_poi.GetComponent(/datum/component/deadchat_control)) + return FALSE + + return potential_poi.validate() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 1258df8b84c5..6046cfe82b63 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -9,6 +9,7 @@ diag_hud.add_to_hud(src) faction += "[REF(src)]" GLOB.mob_living_list += src + SSpoints_of_interest.make_point_of_interest(src) if(speed) update_living_varspeed() diff --git a/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm b/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm index e0537594c8ff..76dc1f095009 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm @@ -30,11 +30,6 @@ var/area/A = get_area(src) if(A) notify_ghosts("A drone shell has been created in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_DRONE) - GLOB.poi_list |= src - -/obj/effect/mob_spawn/drone/Destroy() - GLOB.poi_list -= src - . = ..() //ATTACK GHOST IGNORING PARENT RETURN VALUE /obj/effect/mob_spawn/drone/attack_ghost(mob/user) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index 863abf56dad1..ff06df9c6113 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -607,12 +607,12 @@ GLOBAL_DATUM(blackbox, /obj/machinery/smartfridge/black_box) var/ready_to_deploy = FALSE /obj/machinery/anomalous_crystal/helpers/Destroy() - GLOB.poi_list -= src + SSpoints_of_interest.remove_point_of_interest(src) . = ..() /obj/machinery/anomalous_crystal/helpers/ActivationReaction(mob/user, method) if(..() && !ready_to_deploy) - GLOB.poi_list |= src + SSpoints_of_interest.make_point_of_interest(src) ready_to_deploy = TRUE notify_ghosts("An anomalous crystal has been activated in [get_area(src)]! This crystal can always be used by ghosts hereafter.", enter_link = "(Click to enter)", ghost_sound = 'sound/effects/ghost2.ogg', source = src, action = NOTIFY_ATTACK, header = "Anomalous crystal activated") diff --git a/code/modules/modular_computers/file_system/programs/radar.dm b/code/modules/modular_computers/file_system/programs/radar.dm index d082503a012d..06324b8f8b78 100644 --- a/code/modules/modular_computers/file_system/programs/radar.dm +++ b/code/modules/modular_computers/file_system/programs/radar.dm @@ -156,7 +156,7 @@ *something like "mob_209". In order to find the actual atom, we need *to search the appropriate list for the REF string. This is dependant *on the program (Lifeline uses GLOB.human_list, while Fission360 uses - *GLOB.poi_list), but the result will be the same; evaluate the string and + *SSpoints_of_interest.other_points_of_interest), but the result will be the same; evaluate the string and *return an atom reference. */ /datum/computer_file/program/radar/proc/find_atom() @@ -269,7 +269,7 @@ pointercolor = "red" /datum/computer_file/program/radar/fission360/find_atom() - return locate(selected) in GLOB.poi_list + return locate(selected) in SSpoints_of_interest.other_points_of_interest /datum/computer_file/program/radar/fission360/scan() if(world.time < next_scan) @@ -286,7 +286,7 @@ name = nuke.name, ) objects += list(nukeinfo) - var/obj/item/disk/nuclear/disk = locate() in GLOB.poi_list + var/obj/item/disk/nuclear/disk = locate() in SSpoints_of_interest.other_points_of_interest if(trackable(disk)) var/list/nukeinfo = list( ref = REF(disk), diff --git a/code/modules/overmap/helm.dm b/code/modules/overmap/helm.dm index 5b1f27fa2cb9..3b825ce39524 100644 --- a/code/modules/overmap/helm.dm +++ b/code/modules/overmap/helm.dm @@ -49,6 +49,8 @@ /obj/machinery/computer/helm/Initialize(mapload, obj/item/circuitboard/C) . = ..() + if(!viewer) + SSpoints_of_interest.make_point_of_interest(src) jump_allowed = world.time + CONFIG_GET(number/bluespace_jump_wait) ntnet_relay = new(src) @@ -76,6 +78,7 @@ SStgui.close_uis(src) ASSERT(length(concurrent_users) == 0) QDEL_NULL(ntnet_relay) + SSpoints_of_interest.remove_point_of_interest(src) if(current_ship) current_ship.helms -= src current_ship = null diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 9218b829e940..499a88b161f1 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -38,7 +38,7 @@ src.energy = starting_energy . = ..() START_PROCESSING(SSobj, src) - GLOB.poi_list |= src + SSpoints_of_interest.make_point_of_interest(src) GLOB.singularities |= src for(var/obj/machinery/power/singularity_beacon/singubeacon in GLOB.machines) if(singubeacon.active) @@ -53,7 +53,7 @@ /obj/singularity/Destroy() STOP_PROCESSING(SSobj, src) - GLOB.poi_list.Remove(src) + SSpoints_of_interest.remove_point_of_interest(src) GLOB.singularities.Remove(src) return ..() diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index b6fc6367e85c..3d94de599aab 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -275,7 +275,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) SSair.start_processing_machine(src, mapload) countdown = new(src) countdown.start() - GLOB.poi_list |= src + SSpoints_of_interest.make_point_of_interest(src) radio = new(src) radio.keyslot = new radio_key radio.listening = 0 @@ -293,7 +293,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) investigate_log("has been destroyed.", INVESTIGATE_SUPERMATTER) SSair.stop_processing_machine(src) QDEL_NULL(radio) - GLOB.poi_list -= src + SSpoints_of_interest.remove_point_of_interest(src) QDEL_NULL(countdown) if(is_main_engine && GLOB.main_supermatter_engine == src) GLOB.main_supermatter_engine = null diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index 7d58610fc7f7..d4a6f71cca4d 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -151,7 +151,7 @@ /obj/singularity/energy_ball/orbit(obj/singularity/energy_ball/target) if (istype(target)) target.orbiting_balls += src - GLOB.poi_list -= src + SSpoints_of_interest.remove_point_of_interest(src) target.dissipate_strength = target.orbiting_balls.len . = ..() diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index c2e5b4cb2933..40fd10e94785 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -46,7 +46,7 @@ /obj/item/gun/energy/pulse/prize/Initialize() . = ..() - GLOB.poi_list += src + SSpoints_of_interest.make_point_of_interest(src) var/turf/T = get_turf(src) message_admins("A pulse rifle prize has been created at [ADMIN_VERBOSEJMP(T)]") @@ -55,7 +55,7 @@ notify_ghosts("Someone won a pulse rifle as a prize!", source = src, action = NOTIFY_ORBIT, header = "Pulse rifle prize") /obj/item/gun/energy/pulse/prize/Destroy() - GLOB.poi_list -= src + SSpoints_of_interest.remove_point_of_interest(src) . = ..() /obj/item/gun/energy/pulse/pistol diff --git a/code/modules/spells/spell_types/lichdom.dm b/code/modules/spells/spell_types/lichdom.dm index 720670e3fc21..38e2f0df145e 100644 --- a/code/modules/spells/spell_types/lichdom.dm +++ b/code/modules/spells/spell_types/lichdom.dm @@ -99,7 +99,7 @@ name = "phylactery of [mind.name]" active_phylacteries++ - GLOB.poi_list |= src + SSpoints_of_interest.make_point_of_interest(src) START_PROCESSING(SSobj, src) if(initial(SSticker.mode.round_ends_with_antag_death)) SSticker.mode.round_ends_with_antag_death = FALSE @@ -107,7 +107,7 @@ /obj/item/phylactery/Destroy(force=FALSE) STOP_PROCESSING(SSobj, src) active_phylacteries-- - GLOB.poi_list -= src + SSpoints_of_interest.remove_point_of_interest(src) if(!active_phylacteries) SSticker.mode.round_ends_with_antag_death = initial(SSticker.mode.round_ends_with_antag_death) . = ..() diff --git a/shiptest.dme b/shiptest.dme index 55ad11a800d5..0e379318cbf9 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -366,6 +366,7 @@ #include "code\controllers\subsystem\persistence.dm" #include "code\controllers\subsystem\physics.dm" #include "code\controllers\subsystem\ping.dm" +#include "code\controllers\subsystem\points_of_interest.dm" #include "code\controllers\subsystem\profiler.dm" #include "code\controllers\subsystem\radiation.dm" #include "code\controllers\subsystem\radio.dm" @@ -669,6 +670,7 @@ #include "code\datums\elements\lazy_fishing_spot.dm" #include "code\datums\elements\light_blocking.dm" #include "code\datums\elements\mobappearance.dm" +#include "code\datums\elements\point_of_interest.dm" #include "code\datums\elements\renamemob.dm" #include "code\datums\elements\selfknockback.dm" #include "code\datums\elements\snail_crawl.dm" @@ -854,6 +856,7 @@ #include "code\game\area\areas\ruins\space.dm" #include "code\game\area\areas\ruins\templates.dm" #include "code\game\area\areas\ruins\wasteplanet.dm" +#include "code\game\atom\atom_orbit.dm" #include "code\game\gamemodes\events.dm" #include "code\game\gamemodes\game_mode.dm" #include "code\game\gamemodes\objective.dm" diff --git a/tgui/packages/tgui/interfaces/Orbit.js b/tgui/packages/tgui/interfaces/Orbit.js deleted file mode 100644 index 91bf9d1f7929..000000000000 --- a/tgui/packages/tgui/interfaces/Orbit.js +++ /dev/null @@ -1,218 +0,0 @@ -import { createSearch } from 'common/string'; -import { multiline } from 'common/string'; -import { resolveAsset } from '../assets'; -import { useBackend, useLocalState } from '../backend'; -import { - Box, - Button, - Divider, - Flex, - Icon, - Input, - Section, -} from '../components'; -import { Window } from '../layouts'; - -const PATTERN_NUMBER = / \(([0-9]+)\)$/; - -const searchFor = (searchText) => - createSearch(searchText, (thing) => thing.name); - -const compareString = (a, b) => (a < b ? -1 : a > b); - -const compareNumberedText = (a, b) => { - const aName = a.name; - const bName = b.name; - - // Check if aName and bName are the same except for a number at the end - // e.g. Medibot (2) and Medibot (3) - const aNumberMatch = aName.match(PATTERN_NUMBER); - const bNumberMatch = bName.match(PATTERN_NUMBER); - - if ( - aNumberMatch && - bNumberMatch && - aName.replace(PATTERN_NUMBER, '') === bName.replace(PATTERN_NUMBER, '') - ) { - const aNumber = parseInt(aNumberMatch[1], 10); - const bNumber = parseInt(bNumberMatch[1], 10); - - return aNumber - bNumber; - } - - return compareString(aName, bName); -}; - -const BasicSection = (props, context) => { - const { act } = useBackend(context); - const { searchText, source, title } = props; - const things = source.filter(searchFor(searchText)); - things.sort(compareNumberedText); - return ( - source.length > 0 && ( -
- {things.map((thing) => ( -
- ) - ); -}; - -const OrbitedButton = (props, context) => { - const { act } = useBackend(context); - const { color, thing } = props; - - return ( - - ); -}; - -export const Orbit = (props, context) => { - const { act, data } = useBackend(context); - const { alive, antagonists, auto_observe, dead, ghosts, misc, npcs } = data; - - const [searchText, setSearchText] = useLocalState(context, 'searchText', ''); - - const collatedAntagonists = {}; - for (const antagonist of antagonists) { - if (collatedAntagonists[antagonist.antag] === undefined) { - collatedAntagonists[antagonist.antag] = []; - } - collatedAntagonists[antagonist.antag].push(antagonist); - } - - const sortedAntagonists = Object.entries(collatedAntagonists); - sortedAntagonists.sort((a, b) => { - return compareString(a[0], b[0]); - }); - - const orbitMostRelevant = (searchText) => { - for (const source of [ - sortedAntagonists.map(([_, antags]) => antags), - alive, - ghosts, - dead, - npcs, - misc, - ]) { - const member = source - .filter(searchFor(searchText)) - .sort(compareNumberedText)[0]; - if (member !== undefined) { - act('orbit', { ref: member.ref }); - break; - } - } - }; - - return ( - - -
- - - - - - setSearchText(value)} - onEnter={(_, value) => orbitMostRelevant(value)} - /> - - - - - -
- {antagonists.length > 0 && ( -
- {sortedAntagonists.map(([name, antags]) => ( -
- {antags - .filter(searchFor(searchText)) - .sort(compareNumberedText) - .map((antag) => ( - - ))} -
- ))} -
- )} - -
- {alive - .filter(searchFor(searchText)) - .sort(compareNumberedText) - .map((thing) => ( - - ))} -
- -
- {ghosts - .filter(searchFor(searchText)) - .sort(compareNumberedText) - .map((thing) => ( - - ))} -
- - - - - - -
-
- ); -}; diff --git a/tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx b/tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx new file mode 100644 index 000000000000..f3c59a75e189 --- /dev/null +++ b/tgui/packages/tgui/interfaces/Orbit/OrbitContent.tsx @@ -0,0 +1,98 @@ +import { toTitleCase } from 'common/string'; + +import { useBackend } from '../../backend'; +import { NoticeBox, Section, Stack, Table, Tooltip } from '../../components'; + +import { getAntagCategories } from './helpers'; +import { AntagGroup, Observable, OrbitData } from './types'; +import { OrbitSection } from './OrbitSection'; + +type ContentSection = { + content: Observable[]; + title: string; + color?: string; +}; + +export const OrbitContent = (props, context) => { + const { act, data } = useBackend(context); + const { antagonists = [], critical = [] } = data; + const { searchText, autoObserve } = props; + + let antagGroups: AntagGroup[] = []; + if (antagonists.length) { + antagGroups = getAntagCategories(antagonists); + } + + const sections: readonly ContentSection[] = [ + { + content: data.alive, + title: 'Alive', + color: 'good', + }, + { + content: data.dead, + title: 'Dead', + }, + { + content: data.ghosts, + title: 'Ghosts', + }, + { + content: data.misc, + title: 'Misc', + }, + { + content: data.npcs, + title: 'NPCs', + }, + { + content: data.ships, + title: 'Ships', + }, + ]; + + return ( +
+ + {critical.map((crit) => ( + + act('orbit', { ref: crit.ref })} + > + + + {toTitleCase(crit.full_name)} + {crit.extra} + +
+
+
+ ))} + + {antagGroups.map(([title, members]) => ( + + ))} + + {sections.map((section) => ( + + ))} +
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/Orbit/OrbitItem.tsx b/tgui/packages/tgui/interfaces/Orbit/OrbitItem.tsx new file mode 100644 index 000000000000..957104afa8b9 --- /dev/null +++ b/tgui/packages/tgui/interfaces/Orbit/OrbitItem.tsx @@ -0,0 +1,50 @@ +import { useBackend } from '../../backend'; +import { Stack, Button, Flex, Icon } from '../../components'; + +import { capitalizeFirst } from 'common/string'; + +import { getDisplayColor, getDisplayName } from './helpers'; +import { Antagonist, Observable, OrbitData } from './types'; + +type Props = { + item: Observable | Antagonist; + autoObserve: boolean; + color: string | undefined; +}; + +export const OrbitItem = (props: Props, context) => { + const { item, autoObserve, color } = props; + const { full_name, icon, job, name, orbiters, ref } = item; + + const { act, data } = useBackend(context); + const { orbiting } = data; + + const selected = ref === orbiting?.ref; + const validIcon = !!job && !!icon && icon !== 'hudunknown'; + + return ( + act('orbit', { auto_observe: autoObserve, ref })} + style={{ + display: 'flex', + }} + > + + + ); +}; diff --git a/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx b/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx new file mode 100644 index 000000000000..b81ba27c1f27 --- /dev/null +++ b/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx @@ -0,0 +1,65 @@ +import { Collapsible, Flex, Tooltip } from '../../components'; +import { isJobOrNameMatch } from './helpers'; +import { OrbitItem } from './OrbitItem'; +import { OrbitTooltip } from './OrbitTooltip'; +import { Observable } from './types'; + +type Props = { + color?: string; + section: Observable[]; + title: string; + searchQuery: string; + autoObserve: boolean; +}; + +/** + * Displays a collapsible with a map of observable items. + * Filters the results if there is a provided search query. + */ +export const OrbitSection = (props: Props) => { + const { color, section = [], title, searchQuery, autoObserve } = props; + + const filteredSection = section.filter((observable) => + isJobOrNameMatch(observable, searchQuery) + ); + + if (!filteredSection.length) { + return <>; + } + + return ( + + + {filteredSection.map((item) => { + const content = ( + + ); + + if (!item.health && !item.extra) { + return content; + } + + return ( + } + key={item.ref} + position="bottom-start" + > + {content} + + ); + })} + + + ); +}; diff --git a/tgui/packages/tgui/interfaces/Orbit/OrbitTooltip.tsx b/tgui/packages/tgui/interfaces/Orbit/OrbitTooltip.tsx new file mode 100644 index 000000000000..0a941dcb0fb5 --- /dev/null +++ b/tgui/packages/tgui/interfaces/Orbit/OrbitTooltip.tsx @@ -0,0 +1,57 @@ +import { LabeledList, NoticeBox } from '../../components'; +import { Antagonist, Observable } from './types'; + +type Props = { + item: Observable | Antagonist; +}; + +/** Displays some info on the mob as a tooltip. */ +export const OrbitTooltip = (props: Props) => { + const { item } = props; + const { extra, name, full_name, health, job } = item; + + let antag; + if ('antag' in item) { + antag = item.antag; + } + + const extraInfo = extra?.split(':'); + const displayHealth = !!health && health >= 0 ? `${health}%` : 'Critical'; + const showAFK = 'client' in item && !item.client; + + return ( + <> + + Last Known Data + + + {extraInfo ? ( + + {extraInfo[1]} + + ) : ( + <> + {!!name && ( + {name} + )} + {!!full_name && ( + + {full_name} + + )} + {!!job && {job}} + {!!antag && ( + {antag} + )} + {!!health && ( + + {displayHealth} + + )} + + )} + {showAFK && Away} + + + ); +}; diff --git a/tgui/packages/tgui/interfaces/Orbit/constants.ts b/tgui/packages/tgui/interfaces/Orbit/constants.ts new file mode 100644 index 000000000000..1edadc9bfe45 --- /dev/null +++ b/tgui/packages/tgui/interfaces/Orbit/constants.ts @@ -0,0 +1,8 @@ +export const HEALTH = { + Good: 69, // nice + Average: 19, + Bad: 0, + Crit: -30, + Dead: -100, + Ruined: -200, +} as const; diff --git a/tgui/packages/tgui/interfaces/Orbit/helpers.ts b/tgui/packages/tgui/interfaces/Orbit/helpers.ts new file mode 100644 index 000000000000..e502446e855c --- /dev/null +++ b/tgui/packages/tgui/interfaces/Orbit/helpers.ts @@ -0,0 +1,113 @@ +import { createSearch } from '../../../common/string'; + +import { HEALTH } from './constants'; +import { AntagGroup, Antagonist, Observable } from './types'; + +const PATTERN_NUMBER = / \(([0-9]+)\)$/; + +/** Return a map of strings with each antag in its antag_category */ +export const getAntagCategories = (antagonists: Antagonist[]): AntagGroup[] => { + const categories = new Map(); + + for (const player of antagonists) { + const { antag_group } = player; + + if (!categories.has(antag_group)) { + categories.set(antag_group, []); + } + categories.get(antag_group)!.push(player); + } + + const sorted = Array.from(categories.entries()).sort((a, b) => { + const lowerA = a[0].toLowerCase(); + const lowerB = b[0].toLowerCase(); + + if (lowerA < lowerB) return -1; + if (lowerA > lowerB) return 1; + return 0; + }); + + return sorted; +}; + +/** Returns a disguised name in case the person is wearing someone else's ID */ +export const getDisplayName = (full_name: string, nickname?: string): string => { + if (!nickname) { + return full_name; + } + + return nickname; +}; + +/** Displays color for buttons based on the health or orbiter count. */ +export const getDisplayColor = (item: Observable, override?: string): string => { + const { job, health, orbiters } = item; + + // Things like blob camera, etc + if (typeof health !== 'number') { + return override ? 'good' : 'grey'; + } + + // Players that are AFK + if ('client' in item && !item.client) { + return 'grey'; + } + + return getHealthColor(health); +}; + +/** Returns the display color for certain health percentages */ +const getHealthColor = (health: number): string => { + switch (true) { + case health > HEALTH.Good: + return 'good'; + case health > HEALTH.Average: + return 'average'; + default: + return 'bad'; + } +}; + +/** Checks if a full name or job title matches the search. */ +export const isJobOrNameMatch = ( + observable: Observable, + searchQuery: string +): boolean => { + if (!searchQuery) return true; + + const { full_name, job } = observable; + + return ( + full_name?.toLowerCase().includes(searchQuery?.toLowerCase()) || + job?.toLowerCase().includes(searchQuery?.toLowerCase()) || + false + ); +}; + +export const searchFor = (searchText) => + createSearch(searchText, (thing) => thing.name); + +export const compareString = (a, b) => (a < b ? -1 : a > b); + +export const compareNumberedText = (a, b) => { + const aName = a.name; + const bName = b.name; + + // Check if aName and bName are the same except for a number at the end + // e.g. Medibot (2) and Medibot (3) + const aNumberMatch = aName.match(PATTERN_NUMBER); + const bNumberMatch = bName.match(PATTERN_NUMBER); + + if ( + aNumberMatch && + bNumberMatch && + aName.replace(PATTERN_NUMBER, '') === bName.replace(PATTERN_NUMBER, '') + ) { + const aNumber = parseInt(aNumberMatch[1], 10); + const bNumber = parseInt(bNumberMatch[1], 10); + + return aNumber - bNumber; + } + + return compareString(aName, bName); +}; diff --git a/tgui/packages/tgui/interfaces/Orbit/index.tsx b/tgui/packages/tgui/interfaces/Orbit/index.tsx new file mode 100644 index 000000000000..05ce4e2539f5 --- /dev/null +++ b/tgui/packages/tgui/interfaces/Orbit/index.tsx @@ -0,0 +1,86 @@ +import { multiline } from '../../../common/string'; +import { useBackend, useLocalState } from '../../backend'; +import { Button, Divider, Flex, Icon, Input, Section } from '../../components'; +import { Window } from '../../layouts'; + +import { searchFor } from './helpers'; +import { OrbitData } from './types'; +import { OrbitContent } from './OrbitContent'; + +export const Orbit = (props, context) => { + const { act, data } = useBackend(context); + + const [searchText, setSearchText] = useLocalState(context, 'searchText', ''); + const [autoObserve, setAutoObserve] = useLocalState( + context, + 'autoObserve', + false + ); + + const orbitMostRelevant = () => { + const mostRelevant = [ + data.antagonists, + data.alive, + data.ghosts, + data.dead, + data.npcs, + data.misc, + data.ships, + ] + .flat() + .filter(searchFor(searchText)) + .sort()[0]; + + if (mostRelevant !== undefined) { + act('orbit', { ref: mostRelevant.ref }); + } + }; + + return ( + + +
+ + + + + + setSearchText(value)} + onEnter={(_, value) => orbitMostRelevant()} + /> + + + + + +
+ +
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/Orbit/types.ts b/tgui/packages/tgui/interfaces/Orbit/types.ts new file mode 100644 index 000000000000..4912ae10db4c --- /dev/null +++ b/tgui/packages/tgui/interfaces/Orbit/types.ts @@ -0,0 +1,38 @@ +import { BooleanLike } from '../../../common/react'; + +export type Antagonist = Observable & { antag: string; antag_group: string }; + +export type AntagGroup = [string, Antagonist[]]; + +export type OrbitData = { + alive: Observable[]; + antagonists: Antagonist[]; + critical: Critical[]; + dead: Observable[]; + ghosts: Observable[]; + misc: Observable[]; + npcs: Observable[]; + ships: Observable[]; + orbiting: Observable | null; + autoObserve: boolean; +}; + +export type Observable = { + full_name: string; + ref: string; + // Optionals +} & Partial<{ + client: BooleanLike; + extra: string; + health: number; + icon: string; + job: string; + name: string; + orbiters: number; +}>; + +type Critical = { + extra: string; + full_name: string; + ref: string; +}; From 0a352202b050e0f248aced64f2e652645468e06e Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 30 Aug 2024 11:13:34 -0500 Subject: [PATCH 2/7] fixed admin menu and passes autoObserve but it seems really broken --- code/controllers/subsystem/points_of_interest.dm | 2 ++ code/datums/elements/point_of_interest.dm | 2 ++ code/modules/mob/dead/new_player/new_player.dm | 1 + code/modules/mob/dead/observer/orbit.dm | 3 +++ tgui/packages/tgui/interfaces/Orbit/index.tsx | 2 +- 5 files changed, 9 insertions(+), 1 deletion(-) diff --git a/code/controllers/subsystem/points_of_interest.dm b/code/controllers/subsystem/points_of_interest.dm index b8e8b6397424..6de327bc8666 100644 --- a/code/controllers/subsystem/points_of_interest.dm +++ b/code/controllers/subsystem/points_of_interest.dm @@ -181,9 +181,11 @@ SUBSYSTEM_DEF(points_of_interest) if(poi_mob.client?.holder?.fakekey) return FALSE + /* // POI is a /mob/dead/new_player, players in the lobby are invalid as POIs. if(isnewplayer(poi_mob)) return FALSE + */ return TRUE diff --git a/code/datums/elements/point_of_interest.dm b/code/datums/elements/point_of_interest.dm index 3ab6c6296293..d64ee5466ace 100644 --- a/code/datums/elements/point_of_interest.dm +++ b/code/datums/elements/point_of_interest.dm @@ -6,11 +6,13 @@ if (!isatom(target)) return ELEMENT_INCOMPATIBLE + /* // New players are abstract mobs assigned to people who are still in the lobby screen. // As a result, they are not a valid POI and should never be a valid POI. If they // somehow get this element attached to them, there's something we need to debug. if(isnewplayer(target)) return ELEMENT_INCOMPATIBLE + */ SSpoints_of_interest.on_poi_element_added(target) return ..() diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 8fbf9c32a38e..2dbbd9d4b65b 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -35,6 +35,7 @@ . = ..() GLOB.new_player_list += src + SSpoints_of_interest.make_point_of_interest(src) /mob/dead/new_player/Destroy() GLOB.new_player_list -= src diff --git a/code/modules/mob/dead/observer/orbit.dm b/code/modules/mob/dead/observer/orbit.dm index eb1c54df7934..051faa5bedac 100644 --- a/code/modules/mob/dead/observer/orbit.dm +++ b/code/modules/mob/dead/observer/orbit.dm @@ -73,6 +73,9 @@ var/mob/mob_poi = new_mob_pois[name] var/number_of_orbiters = length(mob_poi.get_all_orbiters()) + if(isnewplayer(mob_poi)) + continue + serialized["ref"] = REF(mob_poi) serialized["full_name"] = mob_poi.name serialized["job"] = mob_poi.job diff --git a/tgui/packages/tgui/interfaces/Orbit/index.tsx b/tgui/packages/tgui/interfaces/Orbit/index.tsx index 05ce4e2539f5..a233f1aa45c3 100644 --- a/tgui/packages/tgui/interfaces/Orbit/index.tsx +++ b/tgui/packages/tgui/interfaces/Orbit/index.tsx @@ -79,7 +79,7 @@ export const Orbit = (props, context) => { - + ); From bf6de7210df51f505a783dee6e3bbefa9f81c092 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Fri, 30 Aug 2024 11:58:27 -0500 Subject: [PATCH 3/7] found the issue, eye aint getting set, wil fix --- code/modules/mob/dead/observer/observer.dm | 14 +++++++++----- code/modules/mob/mob.dm | 2 +- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index ceff585ea460..dc2635d00afc 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -844,15 +844,19 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/dead/observer/reset_perspective(atom/A) if(client) if(ismob(client.eye) && (client.eye != src)) - var/mob/target = client.eye - observetarget = null - if(target.observers) - LAZYREMOVE(target.observers, src) + cleanup_observe() if(..()) if(hud_used) client.screen = list() hud_used.show_hud(hud_used.hud_version) +/mob/dead/observer/proc/cleanup_observe() + var/mob/target = client.eye + observetarget = null + client?.perspective = initial(client.perspective) + if(target.observers) + LAZYREMOVE(target.observers, src) + /mob/dead/observer/verb/observe() set name = "Observe" set category = "Ghost" @@ -873,7 +877,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/dead/observer/proc/do_observe(mob/mob_eye) //Istype so we filter out points of interest that are not mobs if(client && mob_eye && istype(mob_eye)) - client.eye = mob_eye + client.set_eye(mob_eye) if(mob_eye.hud_used) client.screen = list() LAZYOR(mob_eye.observers, src) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index b1788a7aa50d..a05c2e65688e 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -462,7 +462,7 @@ else client.perspective = EYE_PERSPECTIVE client.eye = loc - return 1 + return TRUE /// Show the mob's inventory to another mob /mob/proc/show_inv(mob/user) From df15017cef3b07706058ab8c05e23b6e9fecc43a Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Tue, 3 Sep 2024 16:45:03 -0500 Subject: [PATCH 4/7] yea --- code/modules/mob/dead/observer/observer.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index dc2635d00afc..0fcfa5c13940 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -877,7 +877,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/dead/observer/proc/do_observe(mob/mob_eye) //Istype so we filter out points of interest that are not mobs if(client && mob_eye && istype(mob_eye)) - client.set_eye(mob_eye) + client.eye = mob_eye if(mob_eye.hud_used) client.screen = list() LAZYOR(mob_eye.observers, src) From d32e761fc153a826692db88ccd5422c82df94db8 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Wed, 4 Sep 2024 07:51:28 -0500 Subject: [PATCH 5/7] prettier --- tgui/packages/tgui/interfaces/Orbit/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tgui/packages/tgui/interfaces/Orbit/index.tsx b/tgui/packages/tgui/interfaces/Orbit/index.tsx index a233f1aa45c3..f0854f7bfa69 100644 --- a/tgui/packages/tgui/interfaces/Orbit/index.tsx +++ b/tgui/packages/tgui/interfaces/Orbit/index.tsx @@ -79,7 +79,7 @@ export const Orbit = (props, context) => { - + ); From 8b1944a5e33a971d2a7f36b8a5c2cb04899b0c6a Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sat, 14 Sep 2024 14:44:37 -0500 Subject: [PATCH 6/7] fix linters and search its full name --- tgui/packages/tgui/interfaces/Orbit/helpers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tgui/packages/tgui/interfaces/Orbit/helpers.ts b/tgui/packages/tgui/interfaces/Orbit/helpers.ts index e502446e855c..648796234633 100644 --- a/tgui/packages/tgui/interfaces/Orbit/helpers.ts +++ b/tgui/packages/tgui/interfaces/Orbit/helpers.ts @@ -85,7 +85,7 @@ export const isJobOrNameMatch = ( }; export const searchFor = (searchText) => - createSearch(searchText, (thing) => thing.name); + createSearch(searchText, (thing: Observable) => thing.full_name); export const compareString = (a, b) => (a < b ? -1 : a > b); From 89d48d412f016ae40ed216266a658b3cda945a20 Mon Sep 17 00:00:00 2001 From: FalloutFalcon Date: Sat, 21 Sep 2024 17:39:04 -0500 Subject: [PATCH 7/7] i dunno if null works here --- tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx | 2 +- tgui/packages/tgui/interfaces/Orbit/helpers.ts | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx b/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx index b81ba27c1f27..d27d9080e08d 100644 --- a/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx +++ b/tgui/packages/tgui/interfaces/Orbit/OrbitSection.tsx @@ -24,7 +24,7 @@ export const OrbitSection = (props: Props) => { ); if (!filteredSection.length) { - return <>; + return null; } return ( diff --git a/tgui/packages/tgui/interfaces/Orbit/helpers.ts b/tgui/packages/tgui/interfaces/Orbit/helpers.ts index 648796234633..7046f784cd6c 100644 --- a/tgui/packages/tgui/interfaces/Orbit/helpers.ts +++ b/tgui/packages/tgui/interfaces/Orbit/helpers.ts @@ -31,7 +31,10 @@ export const getAntagCategories = (antagonists: Antagonist[]): AntagGroup[] => { }; /** Returns a disguised name in case the person is wearing someone else's ID */ -export const getDisplayName = (full_name: string, nickname?: string): string => { +export const getDisplayName = ( + full_name: string, + nickname?: string +): string => { if (!nickname) { return full_name; } @@ -40,7 +43,10 @@ export const getDisplayName = (full_name: string, nickname?: string): string => }; /** Displays color for buttons based on the health or orbiter count. */ -export const getDisplayColor = (item: Observable, override?: string): string => { +export const getDisplayColor = ( + item: Observable, + override?: string +): string => { const { job, health, orbiters } = item; // Things like blob camera, etc