Compare commits

...

167 Commits

Author SHA1 Message Date
Redrover1760 cd4d7580cc [April Fools] Improvement (#3669) 2026-03-31 20:39:55 -04:00
monolith8319 c47beb06b7 Automated Changelog (#3668) 2026-03-31 23:34:05 +00:00
Redrover1760 90352ecdcb [april 1st] hehe (#3668) 2026-03-31 19:33:38 -04:00
monolith8319 bffbf53f95 Automated Changelog (#3664) 2026-03-31 18:30:49 +00:00
Redrover1760 4789162e2a [April 1st Patch] DRONES (#3664)
Co-authored-by: Ilya246 <57039557+Ilya246@users.noreply.github.com>
2026-03-31 14:30:20 -04:00
monolith8319 ac58a48797 Automated Changelog (#3659) 2026-03-31 13:18:34 +00:00
mikus f189117507 [April 1st] Update Rules (#3659)
Co-authored-by: g <no@reply.com>
Co-authored-by: Corrupt_ <compeldominik6@gmail.com>

Goida..
2026-03-31 15:18:02 +02:00
Ilya246 376da55886 Reapply "Merge branch 'april1st' into main" (#3655)
This reverts commit f3919fafc1.
2026-03-31 16:49:39 +04:00
Anri 31de4af5e2 Remove Repeat Work in ThermalSignatureSystem (#3631)
Co-authored-by: Ilya246 <57039557+Ilya246@users.noreply.github.com>
2026-03-31 11:28:47 +00:00
Ilya246 5e67e63032 Fix Server Log Spam (#3657) 2026-03-31 06:46:54 +00:00
Redrover1760 f3919fafc1 Revert "Merge branch 'april1st' into main" (#3655) 2026-03-30 21:01:19 -04:00
Redrover1760 974b78863b Merge branch 'april1st' into main 2026-03-30 20:48:47 -04:00
monolith8319 1654bd5cf8 Automated Changelog (#3650) 2026-03-30 19:42:07 +00:00
mikus d353667f97 [April 1st] Only True Noticers (#3650) 2026-03-30 15:41:35 -04:00
monolith8319 47116d8ba7 Automated Changelog (#3648) 2026-03-30 18:16:21 +00:00
Ilya246 9bd6d5f3f2 [April 1st] Asteroid Update (#3648) 2026-03-30 18:15:50 +00:00
Corrupt 1dc696deb6 AAAAA (#3646) 2026-03-30 19:34:15 +02:00
monolith8319 f2df23dc81 Automated Changelog (#3645) 2026-03-30 17:33:41 +00:00
mikus 76d6ea96e0 [April 1st] New Company (#3645)
Co-authored-by: Ilya246 <57039557+Ilya246@users.noreply.github.com>
2026-03-30 17:33:10 +00:00
monolith8319 93ba265e00 Automated Changelog (#3642) 2026-03-30 17:08:08 +00:00
tonotom1 16f73ec031 [April 1st] Buffs Space Pen (#3642) 2026-03-30 17:07:38 +00:00
monolith8319 9d3b0778b3 Automated Changelog (#3643) 2026-03-30 16:56:33 +00:00
lopsidedmanboobs 32b15951e2 PIrate CBT (#3643) 2026-03-30 18:56:00 +02:00
monolith8319 7a0f0d04c5 Automated Changelog (#3641) 2026-03-30 16:42:14 +00:00
mikus bcce8e67a3 [April 1st] 65 (#3641) 2026-03-30 16:41:45 +00:00
monolith8319 5afcdd9379 Automated Changelog (#3615) 2026-03-30 16:22:32 +00:00
mikus 01c7ea464a [April 1st] 65 (#3615) 2026-03-30 16:22:01 +00:00
monolith8319 55f6108312 Automated Changelog (#3514) 2026-03-30 16:16:08 +00:00
UnicornOnLSD 8be27c1658 Reworks the DIS Rig (#3514)
Co-authored-by: Corrupt <compeldominik6@gmail.com>
2026-03-30 18:15:38 +02:00
monolith8319 4df38cc9cc Automated Changelog (#3640) 2026-03-30 15:45:53 +00:00
mikus 8c0d2a50df [April 1st] Clanker Rebalance (#3640) 2026-03-30 15:45:19 +00:00
monolith8319 2d8105de13 Automated Changelog (#3611) 2026-03-30 15:43:28 +00:00
burrrkeye 01bb73bf56 [APRIL 1st] Charon Rebalance (#3611)
Co-authored-by: Corrupt <compeldominik6@gmail.com>
Co-authored-by: monolith8319 <195513600+monolith8319@users.noreply.github.com>
2026-03-30 15:42:55 +00:00
monolith8319 fb09b866f2 Automated Changelog (#3639) 2026-03-30 13:57:16 +00:00
tonotom1 0458a500ff Harmonica-Fy All Handheld Instruments (#3639) 2026-03-30 09:56:46 -04:00
monolith8319 4334b07093 Automated Changelog (#3638) 2026-03-30 09:23:54 +00:00
Isratosh ad2dd99a9b Thruster Capacitor Uniformity (#3638) 2026-03-30 13:23:22 +04:00
monolith8319 f11c83a96e Automated Changelog (#3626) 2026-03-30 04:38:58 +00:00
mikus 36d1740829 [April 1st] Adjusts (#3626) 2026-03-30 08:38:28 +04:00
Ghost581 1e201bb8d2 Viper Group Whitelist Fix (#3634) 2026-03-29 23:36:29 -04:00
monolith8319 c7a34dfc22 Automated Changelog (#3627) 2026-03-29 18:38:24 +00:00
Redrover1760 e366c4d7cc [April 1st] Adds a Very Fair Drone to the Game (#3627)
Co-authored-by: Corrupt <compeldominik6@gmail.com>
Co-authored-by: monolith8319 <195513600+monolith8319@users.noreply.github.com>
Co-authored-by: Ilya246 <57039557+Ilya246@users.noreply.github.com>
Co-authored-by: EckoAurum <202461799+EckoAurum@users.noreply.github.com>
Co-authored-by: ScarletLightweaver <82061820+ScarletLightweaverSS14@users.noreply.github.com>
2026-03-29 14:37:54 -04:00
monolith8319 bc0151e540 Automated Changelog (#3564) 2026-03-29 18:15:53 +00:00
UnicornOnLSD b2307660de Uniformises Shutter Sprites (#3564) 2026-03-29 20:15:23 +02:00
monolith8319 5d5f6b4654 Automated Changelog (#3622) 2026-03-29 18:10:30 +00:00
mikus 165f9950b5 {April 1st] Brings Back the Tactics of Evil Hidden TSF Ninja Warriors (#3622) 2026-03-29 14:10:01 -04:00
monolith8319 ef9858936d Automated Changelog (#3619) 2026-03-29 18:09:42 +00:00
Redrover1760 d0a95f5d8b [April 1st] Upgrades Bomb Collars (#3619)
Co-authored-by: Corrupt <compeldominik6@gmail.com>
Co-authored-by: monolith8319 <195513600+monolith8319@users.noreply.github.com>
Co-authored-by: Ilya246 <57039557+Ilya246@users.noreply.github.com>
Co-authored-by: EckoAurum <202461799+EckoAurum@users.noreply.github.com>
Co-authored-by: ScarletLightweaver <82061820+ScarletLightweaverSS14@users.noreply.github.com>
2026-03-29 14:09:11 -04:00
monolith8319 ee386b0633 Automated Changelog (#3623) 2026-03-29 18:08:59 +00:00
mikus de38cc18ef [April 1st] Buffs Shortband (#3623) 2026-03-29 14:08:28 -04:00
monolith8319 ca928bdc83 Automated Changelog (#3625) 2026-03-29 17:56:37 +00:00
mikus cee6ce9566 [April 1st] Updates Ownership of the Treasury to the Bank Of America (#3625) 2026-03-29 17:56:06 +00:00
monolith8319 984a2c9b71 Automated Changelog (#3624) 2026-03-29 17:16:08 +00:00
Ilya246 548e9eccb6 [April 1st] Mobile Pois 2 (#3624) 2026-03-29 17:15:36 +00:00
monolith8319 cd817abd2c Automated Changelog (#3620) 2026-03-29 16:54:09 +00:00
NazrinNya f276df8fe9 [1 April] Add Larp (#3620)
Co-authored-by: NazrinNya <macrohard@macrohard.localhost>
2026-03-29 16:53:40 +00:00
monolith8319 dd323be01d Automated Changelog (#3621) 2026-03-29 16:53:31 +00:00
mikus 0cf9b35f08 [April 1st] Adds New Forms of Energy Production (#3621) 2026-03-29 19:52:59 +03:00
monolith8319 114a09f290 Automated Changelog (#3618) 2026-03-29 16:20:15 +00:00
Redrover1760 dc4b50e71e updates VSC/build configurations (#3618) 2026-03-29 12:19:46 -04:00
monolith8319 c405c32c89 Automated Changelog (#3598) 2026-03-29 15:49:50 +00:00
monolith8319 34ff30a736 Automated Changelog (#3599) 2026-03-29 15:49:22 +00:00
ScarletLightweaver c8e162baa1 Made Bulwark Gauntlets Wideswing (#3598) 2026-03-29 11:49:12 -04:00
Ilya246 ffcbc32c43 Add Carpsuit to Xenopsychology (#3599) 2026-03-29 11:48:53 -04:00
monolith8319 351b225102 Automated Changelog (#3616) 2026-03-29 15:47:58 +00:00
gonz0 496432881e [April 1st] Detroit Borers (#3616) 2026-03-29 11:47:30 -04:00
monolith8319 9fd2a7b5af Automated Changelog (#3614) 2026-03-29 15:16:12 +00:00
EckoAurum 8972408ec1 Drone Turret Small Fix (#3614) 2026-03-29 11:15:43 -04:00
monolith8319 5798b57788 Automated Changelog (#3612) 2026-03-29 14:46:04 +00:00
mikus ec88162ac0 [April 1st] Adds New Type of Bluespace Drive (#3612) 2026-03-29 14:45:36 +00:00
monolith8319 3992aa846f Automated Changelog (#3610) 2026-03-29 14:18:14 +00:00
Ilya246 4b62f35f10 [April 1st] ilya changes round 2 (#3610) 2026-03-29 14:17:46 +00:00
Ilya246 cc1c91f39f Actually Fix Changelog (#3609) 2026-03-29 14:10:42 +00:00
mikus c5241854ce [April 1st] Piras314 Wrote This (#3606) 2026-03-29 13:57:07 +00:00
Ilya246 d02895a50f prune changelog 2026-03-29 13:55:25 +00:00
Ilya246 c41d005cf4 fix changelog workflow (#3607) 2026-03-29 13:52:43 +00:00
monolith8319 013f57a73d Automated Changelog (#3605) 2026-03-29 13:40:51 +00:00
mikus c3f687a493 [April 1st] Rebalances Gunnery Controls (#3605) 2026-03-29 13:40:19 +00:00
monolith8319 f837710be1 Automated Changelog (#3604) 2026-03-29 13:25:12 +00:00
Ilya246 7b00d623e0 [April 1st] Ilya April1st Changes Round 1 (#3603) 2026-03-29 13:24:54 +00:00
mikus dafbb5f3d8 [April 1st] Makes Borgs Balanced (#3604) 2026-03-29 13:24:41 +00:00
Corrupt d4487d9a5a RSC WL Update no.3 (#3601)
brr
2026-03-29 15:03:48 +02:00
monolith8319 7b9f602c55 Automated Changelog (#3571) 2026-03-29 06:31:08 +00:00
Antoine 97509dd3b6 Chat Message Highlighting (#3571)
Co-authored-by: Ilya246 <57039557+Ilya246@users.noreply.github.com>
2026-03-29 06:30:38 +00:00
monolith8319 55c2a03ea4 Automated Changelog (#3594) 2026-03-29 05:46:36 +00:00
Redrover1760 543c19645f Gigabuffs Signaller Range (#3594) 2026-03-29 01:46:05 -04:00
monolith8319 da8b19dd05 Automated Changelog (#3595) 2026-03-29 02:40:33 +00:00
Redrover1760 4fc44d3a9c Really Ensures Delayed Gamerules Don't Trigger Early (#3595) 2026-03-28 22:40:06 -04:00
Redrover1760 55688cc9e0 Nuke Collar Buff (#3593) 2026-03-28 18:29:23 -04:00
Redrover1760 5357469644 Adds Tsf/Pdv Borgs to Debug Map (#3591) 2026-03-28 17:59:46 -04:00
monolith8319 6040135534 Automated Changelog (#3590) 2026-03-28 19:05:03 +00:00
Ilya246 52649a871e Fastify Apoc (#3590) 2026-03-28 15:04:33 -04:00
monolith8319 fef33511d8 Automated Changelog (#3444) 2026-03-28 18:43:41 +00:00
EckoAurum fec5bfce0a Faction Borg Specialization | Independent Cyborg Selectable Whitelist (#3444) 2026-03-28 14:43:12 -04:00
monolith8319 11f82f95d3 Automated Changelog (#3459) 2026-03-28 18:17:06 +00:00
NazrinNya 3dbad97455 Small Mech Rebalance. (#3459)
Co-authored-by: NazrinNya <macrohard@macrohard.localhost>
2026-03-28 21:16:36 +03:00
monolith8319 a193ab828e Automated Changelog (#3574) 2026-03-28 16:46:17 +00:00
Vinny Shick c75083140d Vasnyx 150mm Launcher Buff (#3574) 2026-03-28 19:45:49 +03:00
Redrover1760 106f9b6d28 Actually Removes Lancelot Wildcard Trade Crate Selling (#3577) 2026-03-28 19:45:07 +03:00
monolith8319 fe24fc22bc Automated Changelog (#3589) 2026-03-28 16:43:10 +00:00
Redrover1760 85c9636003 Buffs Thruster Speed Increase (#3589) 2026-03-28 19:42:39 +03:00
monolith8319 a1d2f4dcbc Automated Changelog (#3587) 2026-03-28 16:22:15 +00:00
NazrinNya 3381fe165c Various Patches. (#3587)
Co-authored-by: NazrinNya <macrohard@macrohard.localhost>
2026-03-28 12:21:43 -04:00
monolith8319 a913c35b21 Automated Changelog (#3588) 2026-03-28 16:18:20 +00:00
Redrover1760 0706b759d4 Fixes Diagonal Collisions, Can Kill Kudzu/Chimerazu Under It (#3588) 2026-03-28 12:17:49 -04:00
monolith8319 73a91c0b0a Automated Changelog (#3585) 2026-03-28 06:42:25 +00:00
Redrover1760 9e390680bd Speciest Turrets Fix (#3585) 2026-03-28 02:41:55 -04:00
monolith8319 d3d391f5a0 Automated Changelog (#3582) 2026-03-27 21:58:06 +00:00
Redrover1760 a6506c7f46 Anti-Chimera RIP Turrets to CC and MD (#3582) 2026-03-27 17:57:35 -04:00
monolith8319 958421b6c9 Automated Changelog (#3461) 2026-03-27 19:26:53 +00:00
NazrinNya c513938ed9 Make Heavy Ballistic Turrets Less Painful. (#3461)
Co-authored-by: NazrinNya <macrohard@macrohard.localhost>
Co-authored-by: Redrover1760 <39284090+Redrover1760@users.noreply.github.com>
2026-03-27 15:26:22 -04:00
monolith8319 a6431c9bab Automated Changelog (#3570) 2026-03-27 17:58:37 +00:00
Ilya246 f3390a81cc Gamemode Fixes and Changes (#3570)
Co-authored-by: Redrover1760 <39284090+Redrover1760@users.noreply.github.com>
2026-03-27 13:58:07 -04:00
monolith8319 6ba80381cc Automated Changelog (#3565) 2026-03-27 07:21:00 +00:00
Redrover1760 ef095aec88 Mono Claws Guidebook Update (#3565) 2026-03-27 03:20:31 -04:00
monolith8319 d02738089c Automated Changelog (#3575) 2026-03-27 07:19:51 +00:00
Redrover1760 b9f0de8576 Improves Hydrakin Head Displacement (#3575) 2026-03-27 03:19:24 -04:00
monolith8319 5a6d4b74b1 Automated Changelog (#3524) 2026-03-27 05:49:41 +00:00
significant harassment 1ac13bf597 Triple Rot Delay (#3524)
Co-authored-by: Onezero0 <onezero0@outlook.com>
Co-authored-by: Redrover1760 <39284090+Redrover1760@users.noreply.github.com>
2026-03-27 01:49:14 -04:00
monolith8319 90ee912816 Automated Changelog (#3573) 2026-03-26 22:06:02 +00:00
Redrover1760 27665829e6 Viscerators No Longer Drop Lootboxes (#3572) 2026-03-26 18:05:41 -04:00
Redrover1760 e1459b0d43 Trade Crates Can No Longer Be Sold on Helios or Lancelot (#3573) 2026-03-26 18:05:32 -04:00
monolith8319 395d334dd7 Automated Changelog (#3560) 2026-03-26 05:55:40 +00:00
UnicornOnLSD 75e166e9b3 Maintains the DIS Femur (#3560)
Merged by Corrupt, Has 1 Fakefail.
2026-03-26 06:55:12 +01:00
monolith8319 d987cfe88d Automated Changelog (#3563) 2026-03-25 22:19:01 +00:00
Redrover1760 a942f3e7b1 Reflect Fixes (#3563) 2026-03-25 18:18:31 -04:00
monolith8319 4108933834 Automated Changelog (#3542) 2026-03-25 19:54:26 +00:00
Redrover1760 6af6f3b386 Fireteam Time Requirement Tweak (#3542) 2026-03-25 15:53:53 -04:00
monolith8319 9a590069d2 Automated Changelog (#3555) 2026-03-25 18:33:51 +00:00
Redrover1760 a60321f201 Ports CMO Webbing From Goob (#3555) 2026-03-25 19:33:22 +01:00
monolith8319 dfabb71045 Automated Changelog (#3554) 2026-03-25 06:13:58 +00:00
Redrover1760 ce034c3f19 Claws Tweak, Claws-Based Chemicals (#3554) 2026-03-25 02:13:30 -04:00
monolith8319 79c9dee112 Automated Changelog (#3558) 2026-03-25 05:50:21 +00:00
lopsidedmanboobs 6a048def33 Kill Ransom (#3558) 2026-03-25 01:49:54 -04:00
monolith8319 e41ef48441 Automated Changelog (#3556) 2026-03-25 04:12:58 +00:00
Redrover1760 27e7b2f70a Research Client Fix (#3556) 2026-03-25 00:12:27 -04:00
monolith8319 2bd317dadb Automated Changelog (#3551) 2026-03-25 00:09:05 +00:00
Maxim Bychkov 1145822797 Fix Voidboots Ability To Lie In Space (#3551) 2026-03-24 20:08:36 -04:00
monolith8319 27dca32ef3 Automated Changelog (#3260) 2026-03-24 23:42:18 +00:00
Avalon 4bdad8f6ee Ullman Coat 2 Electric Boogaloo (#3260)
Co-authored-by: Redrover1760 <39284090+Redrover1760@users.noreply.github.com>
2026-03-24 19:41:50 -04:00
monolith8319 38ebc2699c Automated Changelog (#3552) 2026-03-24 19:54:37 +00:00
Ilya246 82f75ff37f Nerf Big Ame (#3552) 2026-03-24 19:54:07 +00:00
Maxim Bychkov c84cde54cb Fix Map Painter (#3544) 2026-03-24 19:28:05 +00:00
monolith8319 f0c6624762 Automated Changelog (#3550) 2026-03-24 19:01:03 +00:00
Ilya246 277ad91140 Bugfixes (#3550) 2026-03-24 19:00:31 +00:00
monolith8319 b9419b25a1 Automated Changelog (#3155) 2026-03-24 15:08:01 +00:00
gelliii e1a5488f14 New Scrap Ship - Horsefly (#3155) 2026-03-24 16:07:30 +01:00
Redrover1760 d9b46ca6dc Update README.md 2026-03-24 09:15:30 -04:00
tonotom1 a672e9bd28 Revert "Cable Destruction Lag Reduction" (#3532) 2026-03-24 08:18:13 -04:00
monolith8319 2a5fe8fe6a Automated Changelog (#3548) 2026-03-24 12:07:19 +00:00
Redrover1760 e069f2ba9d Makes Printed Contraband Worth Things Again (#3548) 2026-03-24 08:06:49 -04:00
monolith8319 db3675b3e8 Automated Changelog (#3549) 2026-03-24 11:45:08 +00:00
chuga-git 79bf0fec68 Buffs MARAUDER Projectile Speed (#3549) 2026-03-24 07:44:39 -04:00
monolith8319 41b3fb9113 Automated Changelog (#3543) 2026-03-23 17:24:06 +00:00
Redrover1760 7cd749dfa6 Datafarm Fixes (#3543) 2026-03-23 13:23:36 -04:00
monolith8319 eb44deeeda Automated Changelog (#3534) 2026-03-23 06:05:19 +00:00
Redrover1760 7035e752a9 Majorly Buffs Part Wound Tending (#3534) 2026-03-23 02:04:49 -04:00
monolith8319 2fdd1cd573 Automated Changelog (#3381) 2026-03-23 04:08:14 +00:00
Kiithnaras 6c4101e0c0 Added Roofing and Emergency Lighting to Comet (#3381) 2026-03-23 00:00:28 -04:00
monolith8319 5f90433697 Automated Changelog (#3536) 2026-03-23 03:42:43 +00:00
Redrover1760 9f54374593 Research Datafarm Fix (#3536) 2026-03-22 23:42:15 -04:00
monolith8319 5272291275 Automated Changelog (#3533) 2026-03-22 23:23:01 +00:00
Redrover1760 4a0f4cec3a Buffed Chems and Surgery Part Healing/Damage (#3533) 2026-03-22 19:22:33 -04:00
monolith8319 5d68716090 Automated Changelog (#3530) 2026-03-22 22:54:38 +00:00
Redrover1760 a4b1a5317c People No Longer Thermal Regulate While Dead, Hydrakin Do Not While Crit Either (#3530) 2026-03-22 18:54:10 -04:00
monolith8319 ee48853724 Automated Changelog (#3520) 2026-03-22 22:41:50 +00:00
tonotom1 a8651f6457 Cable Destruction Lag Reduction (#3520) 2026-03-22 18:41:10 -04:00
350 changed files with 40545 additions and 30672 deletions
+5 -5
View File
@@ -1,5 +1,5 @@
name: PR Changelogs
concurrency: commit_action
concurrency: commit_action-${{ github.event.pull_request.base.ref }} # Mono
on:
pull_request_target:
types: [closed]
@@ -16,11 +16,11 @@ jobs:
permissions:
contents: write
steps:
- name: Checkout Master
- name: Checkout Base Branch # Mono
uses: actions/checkout@v3
with:
token: ${{ secrets.BOT_TOKEN }}
ref: "${{ vars.CHANGELOG_BRANCH }}"
ref: "${{ github.event.pull_request.base.ref }}" # Mono
- name: Setup Git
run: |
@@ -47,9 +47,9 @@ jobs:
- name: Commit Changelog
run: |
git pull origin main
git pull origin "${{ github.event.pull_request.base.ref }}"
git add "${{ env.CHANGELOG_DIR }}"
git commit -m "Automated Changelog (#${{ env.PR_NUMBER }})"
git push
git push origin "${{ github.event.pull_request.base.ref }}"
shell: bash
continue-on-error: true
+53 -7
View File
@@ -13,6 +13,26 @@
"console": "internalConsole",
"stopAtEntry": false
},
{
"name": "Client - Tools",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build - Tools",
"program": "${workspaceFolder}/bin/Content.Client/Content.Client.dll",
"args": [],
"console": "internalConsole",
"stopAtEntry": false
},
{
"name": "Client - Release",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build - Release",
"program": "${workspaceFolder}/bin/Content.Client/Content.Client.dll",
"args": [],
"console": "internalConsole",
"stopAtEntry": false
},
{
"name": "Client (Compatibility renderer)",
"type": "coreclr",
@@ -31,6 +51,26 @@
"console": "integratedTerminal",
"stopAtEntry": false
},
{
"name": "Server - Tools",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build - Tools",
"program": "${workspaceFolder}/bin/Content.Server/Content.Server.dll",
"args": [""],
"console": "integratedTerminal",
"stopAtEntry": false
},
{
"name": "Server - Release",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build - Release",
"program": "${workspaceFolder}/bin/Content.Server/Content.Server.dll",
"args": [""],
"console": "integratedTerminal",
"stopAtEntry": false
},
{
"name": "YAML Linter",
"type": "coreclr",
@@ -40,7 +80,7 @@
"cwd": "${workspaceFolder}/Content.YAMLLinter",
"console": "internalConsole",
"stopAtEntry": false
}
},
],
"compounds": [
{
@@ -51,14 +91,21 @@
],
"preLaunchTask": "build"
},
// Frontier begin
{
"name": "Server/Client (Release)",
"name": "Server/Client - Tools",
"configurations": [
"Server",
"Client"
"Server - Tools",
"Client - Tools"
],
"preLaunchTask": "build-release"
"preLaunchTask": "build - Tools"
},
{
"name": "Server/Client - Release",
"configurations": [
"Server - Release",
"Client - Release"
],
"preLaunchTask": "build - Release"
},
{
"name": "Server/Client (No Build)",
@@ -67,6 +114,5 @@
"Client"
]
}
// Frontier end
]
}
+26 -6
View File
@@ -21,26 +21,46 @@
},
"problemMatcher": "$msCompile"
},
// Frontier begin
{
"label": "build-release",
"label": "build - Tools",
"command": "dotnet",
"type": "shell",
"args": [
"build",
"--configuration=Release", // Build in release mode. Note: --, not /. /configuration doesn't work, because Microsoft.
"--configuration",
"Tools",
"/property:GenerateFullPaths=true", // Ask dotnet build to generate full paths for file names.
"/consoleloggerparameters:NoSummary" // Do not generate summary otherwise it leads to duplicate errors in Problems panel
"/consoleloggerparameters:'ForceNoAlign;NoSummary'", // Do not generate summary otherwise it leads to duplicate errors in Problems panel
],
"group": {
"kind": "build"
"kind": "build",
"isDefault": false
},
"presentation": {
"reveal": "silent"
},
"problemMatcher": "$msCompile"
},
{
"label": "build - Release",
"command": "dotnet",
"type": "shell",
"args": [
"build",
"--configuration",
"Release",
"/property:GenerateFullPaths=true", // Ask dotnet build to generate full paths for file names.
"/consoleloggerparameters:'ForceNoAlign;NoSummary'", // Do not generate summary otherwise it leads to duplicate errors in Problems panel
],
"group": {
"kind": "build",
"isDefault": false
},
"presentation": {
"reveal": "silent"
},
"problemMatcher": "$msCompile"
},
// Frontier end
{
"label": "build-yaml-linter",
"command": "dotnet",
@@ -32,6 +32,10 @@ public sealed class CharacterInfoSystem : EntitySystem
private void OnCharacterInfoEvent(CharacterInfoEvent msg, EntitySessionEventArgs args)
{
var entity = GetEntity(msg.NetEntity);
// Mono - fix
if (TerminatingOrDeleted(entity))
return;
var data = new CharacterData(entity, msg.JobTitle, msg.Objectives, msg.Briefing, Name(entity));
OnCharacterUpdate?.Invoke(data);
@@ -0,0 +1,7 @@
<Control xmlns="https://spacestation14.io">
<BoxContainer Orientation="Vertical">
<Label Name="TitleLabel" Access="Public" />
<Label Name="ExampleLabel" Access="Public" />
<ColorSelectorSliders Name="Slider" Access="Public" HorizontalExpand="True" />
</BoxContainer>
</Control>
@@ -0,0 +1,31 @@
using Content.Client.Options.UI;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface;
namespace Content.Client.Options.UI;
/// <summary>
/// Standard UI control used for color sliders in the options menu. Intended for use with <see cref="OptionsTabControlRow"/>.
/// </summary>
/// <seealso cref="OptionsTabControlRow.AddOptionColorSlider"/>
[GenerateTypedNameReferences]
public sealed partial class OptionColorSlider : Control
{
/// <summary>
/// The text describing what this slider affects.
/// </summary>
public string? Title
{
get => TitleLabel.Text;
set => TitleLabel.Text = value;
}
/// <summary>
/// The example text showing the current color of the slider.
/// </summary>
public string? Example
{
get => ExampleLabel.Text;
set => ExampleLabel.Text = value;
}
}
@@ -143,6 +143,19 @@ public sealed partial class OptionsTabControlRow : Control
return AddOption(new OptionSliderIntCVar(this, _cfg, cVar, slider, min, max, format ?? FormatInt));
}
/// <summary>
/// Add a color slider option, backed by a simple string CVar.
/// </summary>
/// <param name="cVar">The CVar represented by the slider.</param>
/// <param name="slider">The UI control for the option.</param>
/// <returns>The option instance backing the added option.</returns>
public OptionColorSliderCVar AddOptionColorSlider(
CVarDef<string> cVar,
OptionColorSlider slider)
{
return AddOption(new OptionColorSliderCVar(this, _cfg, cVar, slider));
}
/// <summary>
/// Add a drop-down option, backed by a CVar.
/// </summary>
@@ -518,6 +531,54 @@ public sealed class OptionSliderFloatCVar : BaseOptionCVar<float>
}
}
public sealed class OptionColorSliderCVar : BaseOptionCVar<string>
{
private readonly OptionColorSlider _slider;
protected override string Value
{
get => _slider.Slider.Color.ToHex();
set
{
_slider.Slider.Color = Color.FromHex(value);
UpdateLabelColor();
}
}
/// <summary>
/// Creates a new instance of this type.
/// </summary>
/// <remarks>
/// <para>
/// It is generally more convenient to call overloads on <see cref="OptionsTabControlRow"/>
/// such as <see cref="OptionsTabControlRow.AddOptionPercentSlider"/> instead of instantiating this type directly.
/// </para>
/// </remarks>
/// <param name="controller">The control row that owns this option.</param>
/// <param name="cfg">The configuration manager to get and set values from.</param>
/// <param name="cVar">The CVar that is being controlled by this option.</param>
/// <param name="slider">The UI control for the option.</param>
public OptionColorSliderCVar(
OptionsTabControlRow controller,
IConfigurationManager cfg,
CVarDef<string> cVar,
OptionColorSlider slider) : base(controller, cfg, cVar)
{
_slider = slider;
slider.Slider.OnColorChanged += _ =>
{
ValueChanged();
UpdateLabelColor();
};
}
private void UpdateLabelColor()
{
_slider.ExampleLabel.FontColorOverride = Color.FromHex(Value);
}
}
/// <summary>
/// Implementation of a CVar option that simply corresponds with an integer <see cref="OptionSlider"/>.
/// </summary>
@@ -12,6 +12,10 @@
<ui:OptionSlider Name="SpeechBubbleTextOpacitySlider" Title="{Loc 'ui-options-speech-bubble-text-opacity'}" />
<ui:OptionSlider Name="SpeechBubbleSpeakerOpacitySlider" Title="{Loc 'ui-options-speech-bubble-speaker-opacity'}" />
<ui:OptionSlider Name="SpeechBubbleBackgroundOpacitySlider" Title="{Loc 'ui-options-speech-bubble-background-opacity'}" />
<CheckBox Name="AutoFillHighlightsCheckBox" Text="{Loc 'ui-options-auto-fill-highlights'}" />
<ui:OptionColorSlider Name="HighlightsColorSlider"
Title="{Loc 'ui-options-highlights-color'}"
Example="{Loc 'ui-options-highlights-color-example'}"/>
</BoxContainer>
</ScrollContainer>
<ui:OptionsTabControlRow Name="Control" Access="Public" />
@@ -20,6 +20,8 @@ public sealed partial class AccessibilityTab : Control
Control.AddOptionPercentSlider(CCVars.SpeechBubbleTextOpacity, SpeechBubbleTextOpacitySlider);
Control.AddOptionPercentSlider(CCVars.SpeechBubbleSpeakerOpacity, SpeechBubbleSpeakerOpacitySlider);
Control.AddOptionPercentSlider(CCVars.SpeechBubbleBackgroundOpacity, SpeechBubbleBackgroundOpacitySlider);
Control.AddOptionCheckBox(CCVars.ChatAutoFillHighlights, AutoFillHighlightsCheckBox);
Control.AddOptionColorSlider(CCVars.ChatHighlightsColor, HighlightsColorSlider);
Control.Initialize();
}
@@ -33,9 +33,22 @@ public sealed partial class BorgSelectTypeMenu : FancyWindow
RobustXamlLoader.Load(this);
IoCManager.InjectDependencies(this);
foreach (var borgType in _prototypeManager.EnumeratePrototypes<BorgTypePrototype>().OrderBy(PrototypeName))
// Goobstation: Customizable borgs sprites
ConfirmTypeButton.OnPressed += ConfirmButtonPressed;
HelpGuidebookIds = GuidebookEntries;
SubtypeSelection.SubtypeSelected += () =>
ConfirmTypeButton.Disabled = false;
}
// foreach (var borgType in _prototypeManager.EnumeratePrototypes<BorgTypePrototype>().OrderBy(PrototypeName))
// Mono: Selectable borg whitelist
public void Populate(IReadOnlyList<ProtoId<BorgTypePrototype>> whitelist)
{
IEnumerable<BorgTypePrototype> types = whitelist.Select(id => _prototypeManager.Index(id)).OrderBy(PrototypeName);
foreach (var borgType in types)
// Mono: Selectable borg whitelist end
{
// Goobstation-Start: Customizable borgs sprites
var chassisList = new EntityPrototypeView
{
Scale = new Vector2(2, 2),
@@ -49,13 +62,6 @@ public sealed partial class BorgSelectTypeMenu : FancyWindow
};
SelectionsContainer.AddChild(chassisList);
}
ConfirmTypeButton.OnPressed += ConfirmButtonPressed;
HelpGuidebookIds = GuidebookEntries;
SubtypeSelection.SubtypeSelected += () =>
ConfirmTypeButton.Disabled = false;
// Goobstation-End: Customizable borgs sprites
}
@@ -23,8 +23,12 @@ public sealed class BorgSelectTypeUserInterface : BoundUserInterface
protected override void Open()
{
base.Open();
//Mono: Selectable borg whitelist
EntMan.TryGetComponent<BorgSwitchableTypeComponent>(Owner, out var comp);
var whitelist = comp?.TypeWhitelist ?? [];
_menu = this.CreateWindow<BorgSelectTypeMenu>();
_menu.Populate(whitelist); //Mono
_menu.ConfirmedBorgType += (prototype, subtype) => SendPredictedMessage(new BorgSelectTypeMessage(prototype, subtype));
}
}
@@ -46,18 +46,15 @@ public sealed class BorgSwitchableTypeSystem : SharedBorgSwitchableTypeSystem
{
if (TryComp(entity, out SpriteComponent? sprite))
{
_sprite.LayerSetRsiState((entity, sprite), BorgVisualLayers.Body, prototype.SpriteBodyState);
_sprite.LayerSetRsiState((entity, sprite), BorgVisualLayers.Light, prototype.SpriteBodyState);
_sprite.LayerSetRsiState((entity, sprite), BorgVisualLayers.LightStatus, prototype.SpriteBodyState);
var rsiPath = SpriteSpecifierSerializer.TextureRoot / subtypePrototype.SpritePath;
if (_resourceCache.TryGetResource<RSIResource>(rsiPath, out var resource))
{
_sprite.LayerSetRsi((entity, sprite), BorgVisualLayers.Body, resource.RSI);
_sprite.LayerSetRsi((entity, sprite), BorgVisualLayers.Light, resource.RSI);
_sprite.LayerSetRsi((entity, sprite), BorgVisualLayers.LightStatus, resource.RSI);
_sprite.LayerSetRsi((entity, sprite), BorgVisualLayers.Body, resource.RSI, prototype.SpriteBodyState);
_sprite.LayerSetRsi((entity, sprite), BorgVisualLayers.Light, resource.RSI, prototype.SpriteBodyState);
_sprite.LayerSetRsi((entity, sprite), BorgVisualLayers.LightStatus, resource.RSI, prototype.SpriteToggleLightState);
}
_sprite.LayerSetRsiState((entity, sprite), BorgVisualLayers.Body, prototype.SpriteBodyState);
_sprite.LayerSetRsiState((entity, sprite), BorgVisualLayers.LightStatus, prototype.SpriteBodyState);
_sprite.LayerSetRsiState((entity, sprite), BorgVisualLayers.LightStatus, prototype.SpriteToggleLightState);
}
@@ -0,0 +1,264 @@
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controllers;
using Content.Shared.CCVar;
using Content.Client.CharacterInfo;
using static Content.Client.CharacterInfo.CharacterInfoSystem;
namespace Content.Client.UserInterface.Systems.Chat;
public sealed partial class ChatUIController : IOnSystemChanged<CharacterInfoSystem>
{
[Dependency] private readonly ILocalizationManager _loc = default!;
[UISystemDependency] private readonly CharacterInfoSystem _characterInfo = default!;
private static readonly Regex StartDoubleQuote = new("\"$");
private static readonly Regex EndDoubleQuote = new("^\"|(?<=^@)\"");
private static readonly Regex StartAtSign = new("^@");
private readonly List<string> _highlights = new();
private readonly List<string> _autoFillRawKeywords = new();
private string? _highlightsColor;
private bool _autoFillHighlightsEnabled;
private bool _charInfoIsAttach = false;
private string? _currentCharacterName;
public event Action<string>? HighlightsUpdated;
public event Action<string>? AutoFillUpdated;
private void InitializeHighlights()
{
_config.OnValueChanged(CCVars.ChatAutoFillHighlights, (value) => { _autoFillHighlightsEnabled = value; }, true);
_config.OnValueChanged(CCVars.ChatHighlightsColor, (value) => { _highlightsColor = value; }, true);
var cvar = _config.GetCVar(CCVars.ChatHighlights);
}
public void OnSystemLoaded(CharacterInfoSystem system)
{
system.OnCharacterUpdate += OnCharacterUpdated;
}
public void OnSystemUnloaded(CharacterInfoSystem system)
{
system.OnCharacterUpdate -= OnCharacterUpdated;
}
private void UpdateAutoFillHighlights()
{
_currentCharacterName = null;
_autoFillRawKeywords.Clear();
_highlights.Clear();
AutoFillUpdated?.Invoke("");
HighlightsUpdated?.Invoke("");
_charInfoIsAttach = true;
_characterInfo.RequestCharacterInfo();
}
/// <summary>
/// Saves the user's custom keywords for the given character into the CVar,
/// then rebuilds the active highlight list.
/// Called when the user submits keywords from the popup.
/// </summary>
public void UpdateHighlights(string customKeywords)
{
if (_currentCharacterName == null)
{
return;
}
SaveCustomKeywords(_currentCharacterName, customKeywords);
RebuildHighlightsList(customKeywords);
HighlightsUpdated?.Invoke(customKeywords);
}
private void OnCharacterUpdated(CharacterData data)
{
if (!_charInfoIsAttach)
{
return;
}
var (_, job, _, _, entityName) = data;
_currentCharacterName = entityName;
_autoFillRawKeywords.Clear();
var autoFillDisplay = "";
if (_autoFillHighlightsEnabled)
{
// Special rules for names can be added here
var nameHighlights = "@" + entityName;
// Split on spaces first (handles any number of space-separated words).
if (nameHighlights.Contains(' '))
nameHighlights = nameHighlights.Replace(" ", "\n@");
// Handle hyphenated tokens: single hyphen splits normally (e.g. "First-Last"),
// multiple hyphens use the lizard rule — keep only first and last part (e.g. "Eats-The-Food" → @Eats @Food).
var dashParts = nameHighlights.Split('-');
if (dashParts.Length == 2)
nameHighlights = nameHighlights.Replace("-", "\n@");
else if (dashParts.Length > 2)
nameHighlights = dashParts[0] + "\n@" + dashParts[^1];
foreach (var token in nameHighlights.Split('\n', StringSplitOptions.RemoveEmptyEntries))
{
_autoFillRawKeywords.Add(token);
}
var jobKey = job.Replace(' ', '-').ToLower();
if (_loc.TryGetString($"highlights-{jobKey}", out var jobMatches))
{
foreach (var jobWord in jobMatches.Replace(", ", "\n").Split('\n', StringSplitOptions.RemoveEmptyEntries))
_autoFillRawKeywords.Add(jobWord);
}
autoFillDisplay = string.Join("\n", _autoFillRawKeywords);
}
var customKeywords = LoadCustomKeywords(entityName);
RebuildHighlightsList(customKeywords);
AutoFillUpdated?.Invoke(autoFillDisplay);
HighlightsUpdated?.Invoke(customKeywords);
_charInfoIsAttach = false;
}
private string LoadCustomKeywords(string characterName)
{
var cvar = _config.GetCVar(CCVars.ChatHighlights);
if (string.IsNullOrEmpty(cvar))
return "";
// Shouldn't be needed as no-one should have data by the time this rolls out but we never know
if (!cvar.Contains("||"))
{
return cvar;
}
foreach (var line in cvar.Split('\n', StringSplitOptions.RemoveEmptyEntries))
{
var sep = line.IndexOf("||", StringComparison.Ordinal);
if (sep < 0)
continue;
if (line[..sep] == characterName)
return DecodeKeywords(line[(sep + 2)..]);
}
return "";
}
private void SaveCustomKeywords(string characterName, string customKeywords)
{
var cvar = _config.GetCVar(CCVars.ChatHighlights);
var entries = new Dictionary<string, string>();
if (!string.IsNullOrEmpty(cvar) && cvar.Contains("||"))
{
foreach (var line in cvar.Split('\n', StringSplitOptions.RemoveEmptyEntries))
{
var sep = line.IndexOf("||", StringComparison.Ordinal);
if (sep < 0)
continue;
entries[line[..sep]] = line[(sep + 2)..];
}
}
entries[characterName] = EncodeKeywords(customKeywords);
var sb = new StringBuilder();
foreach (var (name, encoded) in entries)
sb.Append(name).Append("||").Append(encoded).Append('\n');
var newValue = sb.ToString().TrimEnd('\n');
_config.SetCVar(CCVars.ChatHighlights, newValue);
_config.SaveToFile();
}
private static string EncodeKeywords(string raw)
{
return raw
.Replace(@"\", @"\\")
.Replace("|", @"\|")
.Replace("\n", @"\n");
}
private static string DecodeKeywords(string encoded)
{
var sb = new StringBuilder(encoded.Length);
for (var i = 0; i < encoded.Length; i++)
{
if (encoded[i] == '\\' && i + 1 < encoded.Length)
{
switch (encoded[i + 1])
{
case 'n': sb.Append('\n'); i++; break;
case '|': sb.Append('|'); i++; break;
case '\\': sb.Append('\\'); i++; break;
default: sb.Append(encoded[i]); break;
}
}
else
{
sb.Append(encoded[i]);
}
}
return sb.ToString();
}
private void RebuildHighlightsList(string customRaw)
{
_highlights.Clear();
foreach (var raw in _autoFillRawKeywords)
_highlights.Add(ProcessKeyword(raw));
if (!string.IsNullOrWhiteSpace(customRaw))
{
foreach (var raw in customRaw.Split('\n', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries))
_highlights.Add(ProcessKeyword(raw));
}
_highlights.Sort((x, y) => y.Length.CompareTo(x.Length));
}
private string ProcessKeyword(string raw)
{
// Replace every "\" to prevent "\n", "\0", etc. in regex.
var keyword = raw.Replace(@"\", @"\\");
// Escape special regex characters.
keyword = Regex.Escape(keyword);
// Re-escape "[" for markup-adjacent positions.
keyword = keyword.Replace(@"\[", @"\\\[");
// words in double quotes will only be hightlighted as unique, not within another word
if (keyword.Any(c => c == '"'))
{
keyword = StartDoubleQuote.Replace(keyword, "(?!\\w)");
keyword = EndDoubleQuote.Replace(keyword, "(?<!\\w)");
}
// Make it so it doesn't hightlight your own name when you are talking
keyword = StartAtSign.Replace(keyword, @"(?<=\[BubbleContent\].*)");
return keyword;
}
}
@@ -44,7 +44,7 @@ using Robust.Shared.Utility;
namespace Content.Client.UserInterface.Systems.Chat;
public sealed class ChatUIController : UIController
public sealed partial class ChatUIController : UIController
{
[Dependency] private readonly IClientAdminManager _admin = default!;
[Dependency] private readonly IChatManager _manager = default!;
@@ -248,6 +248,8 @@ public sealed class ChatUIController : UIController
_config.OnValueChanged(CCVars.ChatWindowOpacity, OnChatWindowOpacityChanged);
InitializeHighlights();
}
public void OnScreenLoad()
@@ -434,6 +436,7 @@ public sealed class ChatUIController : UIController
private void OnAttachedChanged(EntityUid uid)
{
UpdateChannelPermissions();
UpdateAutoFillHighlights();
}
private void AddSpeechBubble(ChatMessage msg, SpeechBubble.SpeechType speechType)
@@ -877,6 +880,11 @@ public sealed class ChatUIController : UIController
}
}
foreach (var highlight in _highlights)
{
msg.WrappedMessage = SharedChatSystem.InjectTagAroundString(msg, highlight, "color", _highlightsColor);
}
// Log all incoming chat to repopulate when filter is un-toggled
if (!msg.HideChat)
{
@@ -912,7 +920,6 @@ public sealed class ChatUIController : UIController
case ChatChannel.Dead:
if (_ghost is not {IsGhost: true})
break;
AddSpeechBubble(msg, SpeechBubble.SpeechType.Say);
break;
@@ -1,10 +1,30 @@
<controls:ChannelFilterPopup
xmlns="https://spacestation14.io"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Systems.Chat.Controls">
xmlns:controls="clr-namespace:Content.Client.UserInterface.Systems.Chat.Controls"
xmlns:graphics="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client">
<PanelContainer Name="FilterPopupPanel" StyleClasses="BorderedWindowPanel">
<BoxContainer Orientation="Horizontal">
<Control MinSize="4 0"/>
<BoxContainer Name="FilterVBox" MinWidth="110" Margin="0 10" Orientation="Vertical" SeparationOverride="4"/>
<BoxContainer Name="HighlightsVBox" MinWidth="120" Margin="0 10" Orientation="Vertical" SeparationOverride="4">
<BoxContainer Name="AutoFillVBox" Orientation="Vertical" SeparationOverride="2" Visible="False">
<Label Text="{Loc 'hud-chatbox-autofill-highlights'}"/>
<PanelContainer>
<PanelContainer.PanelOverride>
<graphics:StyleBoxFlat BackgroundColor="#262736"/>
</PanelContainer.PanelOverride>
<RichTextLabel Name="AutoFillLabel" Margin="5 5"/>
</PanelContainer>
</BoxContainer>
<Label Text="{Loc 'hud-chatbox-highlights'}"/>
<PanelContainer>
<PanelContainer.PanelOverride>
<graphics:StyleBoxFlat BackgroundColor="#323446"/>
</PanelContainer.PanelOverride>
<TextEdit Name="HighlightEdit" MinHeight="150" Margin="5 5"/>
</PanelContainer>
<Button Name="HighlightButton" Text="{Loc 'hud-chatbox-highlights-button'}" ToolTip="{Loc 'hud-chatbox-highlights-tooltip'}"/>
</BoxContainer>
</BoxContainer>
</PanelContainer>
</controls:ChannelFilterPopup>
@@ -2,6 +2,7 @@ using Content.Shared.Chat;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Utility;
using static Robust.Client.UserInterface.Controls.BaseButton;
namespace Content.Client.UserInterface.Systems.Chat.Controls;
@@ -30,10 +31,13 @@ public sealed partial class ChannelFilterPopup : Popup
private readonly Dictionary<ChatChannel, ChannelFilterCheckbox> _filterStates = new();
public event Action<ChatChannel, bool>? OnChannelFilter;
public event Action<string>? OnNewHighlights;
public ChannelFilterPopup()
{
RobustXamlLoader.Load(this);
HighlightButton.OnPressed += HighlightsEntered;
HighlightEdit.Placeholder = new Rope.Leaf(Loc.GetString("hud-chatbox-highlights-placeholder"));
}
public bool IsActive(ChatChannel channel)
@@ -95,4 +99,36 @@ public sealed partial class ChannelFilterPopup : Popup
if (_filterStates.TryGetValue(channel, out var checkbox))
checkbox.UpdateUnreadCount(unread);
}
// Highlight
/// <summary>
/// Updates the read-only auto-fill section with name/job tokens.
/// </summary>
public void UpdateAutoFill(string autoFillKeywords)
{
AutoFillVBox.Visible = !string.IsNullOrEmpty(autoFillKeywords);
if (string.IsNullOrEmpty(autoFillKeywords))
return;
var msg = new FormattedMessage();
var lines = autoFillKeywords.Split('\n', StringSplitOptions.RemoveEmptyEntries);
for (var i = 0; i < lines.Length; i++)
{
if (i > 0) msg.PushNewline();
msg.AddText(lines[i]);
}
AutoFillLabel.SetMessage(msg);
}
public void UpdateHighlights(string highlights)
{
HighlightEdit.TextRope = new Rope.Leaf(highlights);
}
private void HighlightsEntered(ButtonEventArgs _args)
{
OnNewHighlights?.Invoke(Rope.Collapse(HighlightEdit.TextRope));
}
}
@@ -47,9 +47,12 @@ public partial class ChatBox : UIWidget
ChatInput.Input.OnFocusExit += OnFocusExit;
ChatInput.ChannelSelector.OnChannelSelect += OnChannelSelect;
ChatInput.FilterButton.Popup.OnChannelFilter += OnChannelFilter;
ChatInput.FilterButton.Popup.OnNewHighlights += OnNewHighlights;
_controller = UserInterfaceManager.GetUIController<ChatUIController>();
_controller.MessageAdded += OnMessageAdded;
_controller.HighlightsUpdated += OnHighlightsUpdated;
_controller.AutoFillUpdated += OnAutoFillUpdated;
_controller.RegisterChat(this);
// WD EDIT START
@@ -133,6 +136,21 @@ public partial class ChatBox : UIWidget
}
}
private void OnNewHighlights(string highlighs)
{
_controller.UpdateHighlights(highlighs);
}
private void OnHighlightsUpdated(string highlights)
{
ChatInput.FilterButton.Popup.UpdateHighlights(highlights);
}
private void OnAutoFillUpdated(string autoFillKeywords)
{
ChatInput.FilterButton.Popup.UpdateAutoFill(autoFillKeywords);
}
public void AddLine(string message, Color color, int repeat = 0) // WD EDIT
{
var formatted = new FormattedMessage(4); // WD EDIT // specifying size beforehand smells like a useless microoptimisation, but i'll give them the benefit of doubt
+5 -1
View File
@@ -64,7 +64,11 @@ namespace Content.Client.Voting.UI
var entry = _vote.Entries[i];
if (_vote.DisplayVotes)
{
_voteButtons[i].Text = Loc.GetString("ui-vote-button", ("text", entry.Text), ("votes", entry.Votes));
// Mono
if (entry.RealVotes != entry.Votes)
_voteButtons[i].Text = Loc.GetString("ui-vote-button-weighted", ("text", entry.Text), ("votes", entry.Votes), ("realvotes", entry.RealVotes));
else
_voteButtons[i].Text = Loc.GetString("ui-vote-button", ("text", entry.Text), ("votes", entry.Votes));
}
else
{
+2
View File
@@ -192,6 +192,7 @@ namespace Content.Client.Voting
for (var i = 0; i < message.Options.Length; i++)
{
existingVote.Entries[i].Votes = message.Options[i].votes;
existingVote.Entries[i].RealVotes = message.Options[i].realVotes; // Mono
}
if (@new && _popupContainer != null)
@@ -259,6 +260,7 @@ namespace Content.Client.Voting
{
public string Text { get; }
public int Votes { get; set; }
public int RealVotes; // Mono
public VoteEntry(string text)
{
@@ -39,6 +39,8 @@ namespace Content.MapRenderer.Painters
// Seriously whoever made MapPainter use GameMapPrototype I wish you step on a lego one time.
Map = map,
});
pair.ServerLogHandler.FailureLevel = LogLevel.Fatal;
pair.ClientLogHandler.FailureLevel = LogLevel.Fatal;
await foreach (var image in RenderPair(stopwatch, pair))
yield return image;
@@ -56,6 +58,8 @@ namespace Content.MapRenderer.Painters
Connected = true,
Fresh = false,
});
pair.ServerLogHandler.FailureLevel = LogLevel.Fatal;
pair.ClientLogHandler.FailureLevel = LogLevel.Fatal;
var server = pair.Server;
var client = pair.Client;
@@ -69,6 +73,14 @@ namespace Content.MapRenderer.Painters
foreach (var grid in sMapManager.GetAllGrids(mapId))
sEntityManager.QueueDeleteEntity(grid);
});
await pair.RunTicksSync(10);
await Task.WhenAll(client.WaitIdleAsync(), server.WaitIdleAsync());
await server.WaitPost(() =>
{
var mapId = sEntityManager.System<GameTicker>().DefaultMap;
try
{
+1 -1
View File
@@ -178,7 +178,7 @@ public sealed class AmeNodeGroup : BaseNodeGroup
// return MathF.Max(200000f * MathF.Log10(2 * fuel * MathF.Pow(cores, (float)-0.5)), 0); // Frontier: preferring old calculation for now
// return 200000f * MathF.Log10(fuel * fuel) * MathF.Pow(0.75f, cores - 1); // Frontier: preferring old calculation for now
if (cores > 0 && fuel > 0) // Mono - default zero power unless conditions are met
return 200000f * MathF.Log10(fuel * fuel) * MathF.Pow( 1.11111f, cores - 1); // Mono - Added positive returns from extra cores. Running AME at 2 fuel per core yields roughly the same power per core at all sizes
return 200000f * MathF.Log10(fuel * fuel) * MathF.Pow( 1.11111f, fuel / 2f - 1); // Mono - Exponential scaling at high injection
return 0;
}
@@ -61,4 +61,16 @@ public sealed partial class ThermalRegulatorComponent : Component
/// </summary>
[DataField]
public float ThermalRegulationTemperatureThreshold;
/// <summary>
/// Process regulation while they're dead if there is a MobStateComponent? - Mono Hydrakin
/// </summary>
[DataField]
public bool ProcessWhileDead = false;
/// <summary>
/// Process regulation in critical condition if there is a MobStateComponent? - Mono Hydrakin
/// </summary>
[DataField]
public bool ProcessWhileCrit = true;
}
@@ -2,6 +2,8 @@ using Content.Server.Body.Components;
using Content.Server.Temperature.Components;
using Content.Server.Temperature.Systems;
using Content.Shared.ActionBlocker;
using Content.Shared.Mobs; // Mono
using Content.Shared.Mobs.Components; // Mono
using Robust.Shared.Timing;
namespace Content.Server.Body.Systems;
@@ -51,6 +53,14 @@ public sealed class ThermalRegulatorSystem : EntitySystem
if (!Resolve(ent, ref ent.Comp2, logMissing: false))
return;
// mono begin
if (ent.Comp1.ProcessWhileDead == false && TryComp<MobStateComponent>(ent, out var mobComp1) && mobComp1.CurrentState == MobState.Dead)
return;
if (ent.Comp1.ProcessWhileCrit == false && TryComp<MobStateComponent>(ent, out var mobComp2) && mobComp2.CurrentState == MobState.Critical)
return;
// mono end
var totalMetabolismTempChange = ent.Comp1.MetabolismHeat - ent.Comp1.RadiatedHeat;
// implicit heat regulation
@@ -28,8 +28,6 @@ public sealed partial class BotanySystem : EntitySystem
[Dependency] private readonly SharedSolutionContainerSystem _solutionContainerSystem = default!;
[Dependency] private readonly MetaDataSystem _metaData = default!;
[Dependency] private readonly RandomHelperSystem _randomHelper = default!;
[Dependency] private readonly ContrabandTurnInSystem _contraband = default!; // Frontier
public override void Initialize()
{
base.Initialize();
@@ -100,7 +98,6 @@ public sealed partial class BotanySystem : EntitySystem
public EntityUid SpawnSeedPacket(SeedData proto, EntityCoordinates coords, EntityUid user, float? healthOverride = null)
{
var seed = SpawnAtPosition(proto.PacketPrototype, coords); // Frontier: Spawn<SpawnAtPosition
_contraband.ClearContrabandValue(seed); // Frontier
var seedComp = EnsureComp<SeedComponent>(seed);
seedComp.Seed = proto;
seedComp.HealthOverride = healthOverride;
@@ -160,7 +157,6 @@ public sealed partial class BotanySystem : EntitySystem
var product = _robustRandom.Pick(proto.ProductPrototypes);
var entity = SpawnAtPosition(product, position); // Frontier: Spawn<SpawnAtPosition
_contraband.ClearContrabandValue(entity); // Frontier
_randomHelper.RandomOffset(entity, 0.25f);
products.Add(entity);
@@ -171,7 +171,7 @@ namespace Content.Server.EntityEffects.Effects
interruptsDoAfters: false,
// Shitmed Change Start
targetPart: TargetBodyPart.All,
partMultiplier: 0.5f,
partMultiplier: 1.00f, // Mono, 0.5f->1.00f
canSever: false);
// Shitmed Change End
}
@@ -1,3 +1,4 @@
using Content.Server._Mono.Planets;
using Content.Server.Administration.Logs;
using Content.Server.Body.Systems;
using Content.Server.Explosion.Components;
@@ -39,6 +40,7 @@ using Content.Shared.Projectiles; // Frontier: embed triggers
using Content.Shared.Mind;
using Content.Shared.Mind.Components;
using Content.Shared.Roles;
using Robust.Shared.Map.Components;
namespace Content.Server.Explosion.EntitySystems
{
@@ -83,6 +85,7 @@ namespace Content.Server.Explosion.EntitySystems
[Dependency] private readonly InventorySystem _inventory = default!;
[Dependency] private readonly ElectrocutionSystem _electrocution = default!;
[Dependency] private readonly StationSystem _station = default!; // Frontier: medical insurance
[Dependency] private readonly SharedMapSystem _map = default!; // Frontier: medical insurance
public override void Initialize()
{
@@ -252,19 +255,19 @@ namespace Content.Server.Explosion.EntitySystems
var posText = $"({x}, {y})";
// Frontier: Gets station location of the implant
var station = _station.GetOwningStation(uid);
var stationText = station is null ? null : $"{Name(station.Value)} ";
var grid = ownerXform.GridUid;
var gridText = grid is null ? "" : MetaData(grid.Value).EntityName;
if (stationText == null)
stationText = "";
if (HasComp<MapComponent>(grid) && !HasComp<PlanetMapComponent>(grid))
gridText = "";
// Frontier: Gets species of the implant user
var speciesText = $"";
if (TryComp<HumanoidAppearanceComponent>(implanted.ImplantedEntity, out var species))
speciesText = $" ({species!.Species})";
speciesText = $" ({species.Species})";
var critMessage = Loc.GetString(component.CritMessage, ("user", implanted.ImplantedEntity.Value), ("specie", speciesText), ("grid", stationText!), ("position", posText));
var deathMessage = Loc.GetString(component.DeathMessage, ("user", implanted.ImplantedEntity.Value), ("specie", speciesText), ("grid", stationText!), ("position", posText));
var critMessage = Loc.GetString(component.CritMessage, ("user", implanted.ImplantedEntity.Value), ("specie", speciesText), ("grid", gridText), ("position", posText));
var deathMessage = Loc.GetString(component.DeathMessage, ("user", implanted.ImplantedEntity.Value), ("specie", speciesText), ("grid", gridText), ("position", posText));
if (!TryComp<MobStateComponent>(implanted.ImplantedEntity, out var mobstate))
return;
@@ -130,6 +130,10 @@ public sealed partial class GameTicker
if (MetaData(ruleEntity).EntityPrototype?.ID is not { } id) // you really fucked up
return false;
// Mono - ensure delayed start rules don't trigger ahead of time.
if (TryComp<DelayedStartRuleComponent>(ruleEntity, out var delayComp) && delayComp.RuleStartTime > _gameTiming.CurTime)
return false;
// If we already have it, then we just skip the delay as it has already happened.
if (!RemComp<DelayedStartRuleComponent>(ruleEntity) && ruleData.Delay != null)
{
@@ -42,5 +42,11 @@ namespace Content.Server.GameTicking.Presets
/// </summary>
[DataField("supportedMaps", customTypeSerializer: typeof(PrototypeIdSerializer<GameMapPoolPrototype>))]
public string? MapPool;
/// <summary>
/// Mono - as how much votes should each player click count.
/// </summary>
[DataField]
public float Weight = 1f;
}
}
-5
View File
@@ -59,7 +59,6 @@ namespace Content.Server.Lathe
[Dependency] private readonly SharedSolutionContainerSystem _solution = default!;
[Dependency] private readonly StackSystem _stack = default!;
[Dependency] private readonly TransformSystem _transform = default!;
[Dependency] private readonly ContrabandTurnInSystem _contraband = default!; // Frontier
[Dependency] private readonly DeviceLinkSystem _deviceLink = default!; // Mono
/// <summary>
@@ -326,11 +325,7 @@ namespace Content.Server.Lathe
// Frontier: adjust price before merge (stack prices changed once)
if (result.Valid)
{
ModifyPrintedEntityPrice(uid, comp, result);
_contraband.ClearContrabandValue(result);
}
// End Frontier
_stack.TryMergeToContacts(result);
@@ -39,11 +39,11 @@ public sealed class MechEquipmentSystem : EntitySystem
if (args.User == mechComp.PilotSlot.ContainedEntity)
return;
if (mechComp.EquipmentContainer.ContainedEntities.Count >= mechComp.MaxEquipmentAmount)
return;
// if (mechComp.EquipmentContainer.ContainedEntities.Count >= mechComp.MaxEquipmentAmount)
// return;
if (_whitelistSystem.IsWhitelistFail(mechComp.EquipmentWhitelist, args.Used))
return;
// if (_whitelistSystem.IsWhitelistFail(mechComp.EquipmentWhitelist, args.Used)) mono - no limit to the larp.
// return;
_popup.PopupEntity(Loc.GetString("mech-equipment-begin-install", ("item", uid)), mech);
@@ -323,7 +323,7 @@ public sealed class MoverController : SharedMoverController
var twr = thrust.Length() / body.Mass;
var twrMult = MathF.Pow(twr / shuttle.BaseMaxVelocityTWR, shuttle.MaxVelocityScalingExponent);
return vel.Normalized() * MathF.Min(shuttle.BaseMaxLinearVelocity * twrMult, MathF.Min(shuttle.UpperMaxVelocity, shuttle.SetMaxVelocity));
return vel.Normalized() * shuttle.BaseMaxLinearVelocity * twrMult;
}
private void HandleShuttleMovement(float frameTime)
@@ -21,6 +21,7 @@ namespace Content.Server.Preferences.Managers
IEnumerable<KeyValuePair<NetUserId, ICharacterProfile>> GetSelectedProfilesForPlayers(List<NetUserId> userIds);
bool HavePreferencesLoaded(ICommonSession session);
Task RefreshPreferencesAsync(ICommonSession session, CancellationToken cancel);
Task SetProfile(NetUserId userId, int slot, ICharacterProfile profile);
Task SetProfile(NetUserId userId, int slot, ICharacterProfile profile,
bool authoritative = true); // Mono
}
}
@@ -87,10 +87,11 @@ namespace Content.Server.Preferences.Managers
if (message.Profile == null)
_sawmill.Error($"User {userId} sent a {nameof(MsgUpdateCharacter)} with a null profile in slot {message.Slot}.");
else
await SetProfile(userId, message.Slot, message.Profile);
await SetProfile(userId, message.Slot, message.Profile, false);
}
public async Task SetProfile(NetUserId userId, int slot, ICharacterProfile profile)
public async Task SetProfile(NetUserId userId, int slot, ICharacterProfile profile,
bool authoritative = true) // Mono
{
if (!_cachedPlayerPrefs.TryGetValue(userId, out var prefsData) || !prefsData.PrefsLoaded)
{
@@ -105,6 +106,14 @@ namespace Content.Server.Preferences.Managers
var session = _playerManager.GetSessionById(userId);
profile.EnsureValid(session, _dependencies);
// Mono
if (!authoritative && profile is HumanoidCharacterProfile humanoid)
{
if (curPrefs.Characters.TryGetValue(slot, out var oldProfile) && oldProfile is HumanoidCharacterProfile oldHumanoid)
profile = humanoid.WithBankBalance(oldHumanoid.BankBalance);
else
profile = humanoid.WithBankBalance(HumanoidCharacterProfile.DefaultBalance);
}
var profiles = new Dictionary<int, ICharacterProfile>(curPrefs.Characters)
@@ -69,6 +69,8 @@ public sealed partial class ResearchSystem
if (serverComponent.Clients.Contains(client))
return;
UnregisterClient(client, clientComponent); // Mono Research Fix, unregister a client if applicable before registering to a new server
serverComponent.Clients.Add(client);
clientComponent.Server = server;
SyncClientWithServer(client, clientComponent: clientComponent);
+12 -3
View File
@@ -22,6 +22,7 @@ using Robust.Shared.Timing;
using Content.Shared.DeviceNetwork.Components;
using Timer = Robust.Shared.Timing.Timer;
using Content.Server._NF.SectorServices; // Frontier
using Content.Shared.GameTicking.Components; // Mono
namespace Content.Server.RoundEnd
{
@@ -354,9 +355,17 @@ namespace Content.Server.RoundEnd
public override void Update(float frameTime)
{
// Check if we should auto-call.
int mins = _autoCalledBefore ? _cfg.GetCVar(CCVars.EmergencyShuttleAutoCallExtensionTime)
: _cfg.GetCVar(CCVars.EmergencyShuttleAutoCallTime);
if (mins != 0 && _gameTiming.CurTime - AutoCallStartTime > TimeSpan.FromMinutes(mins))
var mins = TimeSpan.FromMinutes(_autoCalledBefore ? _cfg.GetCVar(CCVars.EmergencyShuttleAutoCallExtensionTime)
: _cfg.GetCVar(CCVars.EmergencyShuttleAutoCallTime));
// Mono
var query = EntityQueryEnumerator<RoundEndTimeRuleComponent, ActiveGameRuleComponent>();
while (query.MoveNext(out _, out var endTimeComp, out _))
{
mins = endTimeComp.EndAt;
}
if (mins.TotalSeconds != 0 && _gameTiming.CurTime - AutoCallStartTime > mins)
{
if (!_shuttle.EmergencyShuttleArrived && ExpectedCountdownEnd is null)
{
@@ -0,0 +1,13 @@
using System;
namespace Content.Server.RoundEnd;
/// <summary>
/// If a gamerule with this component is present, override the roundend time to the time set in it.
/// </summary>
[RegisterComponent]
public sealed partial class RoundEndTimeRuleComponent : Component
{
[DataField]
public TimeSpan EndAt;
}
@@ -20,7 +20,7 @@ namespace Content.Server.Shuttles.Components
/// Maximum velocity assuming TWR is BaseMaxVelocityTWR.
/// </summary>
[ViewVariables(VVAccess.ReadWrite)]
public float BaseMaxLinearVelocity = 75f; // Mono
public float BaseMaxLinearVelocity = 7500f; // Mono - april 1st
public const float MaxAngularVelocity = 4f;
@@ -71,7 +71,7 @@ namespace Content.Server.Shuttles.Components
public string MachinePartThrust = "Capacitor";
[DataField("partRatingThrustMultiplier")]
public float PartRatingThrustMultiplier = 1.15f; // Frontier - PR #1292 1.5f<1.15f
public float PartRatingThrustMultiplier = 1.25f; // Mono: 1.15->1.25 (frontier: 1.5->1.15)
/// <summary>
/// Frontier - Amount of charge this needs from an APC per second to function.
@@ -177,7 +177,8 @@ public sealed partial class ShuttleConsoleSystem
_shuttle.GetAllDockedShuttlesIgnoringFTLLock(shuttleUid.Value, dockedGrids);
// Mono
foreach (var (console, consoleComp) in _lookup.GetEntitiesInRange<ShuttleConsoleComponent>(_transform.GetMapCoordinates(xform), ShuttleFTLRange))
var selfCoord = _transform.GetMapCoordinates(xform);
foreach (var (console, consoleComp) in _lookup.GetEntitiesInRange<ShuttleConsoleComponent>(selfCoord, ShuttleFTLRange))
{
var consoleXform = Transform(console);
var consGrid = consoleXform.GridUid;
@@ -200,6 +201,15 @@ public sealed partial class ShuttleConsoleSystem
// Client sends the "adjusted" coordinates and we adjust it back to get the actual transform coordinates.
var adjustedCoordinates = targetCoordinates.Offset(targetAngle.RotateVec(-shuttlePhysics.LocalCenter));
var fromWorldPos = selfCoord.Position;
var toWorldPos = _transform.ToWorldPosition(adjustedCoordinates);
if (fromWorldPos.Length() < 10000 && toWorldPos.Length() > 9700)
{
_popup.PopupEntity(Loc.GetString("shuttle-ftl-thewall"), ent.Owner, PopupType.Medium);
UpdateConsoles(shuttleUid.Value);
return;
}
var tagEv = new FTLTagEvent();
RaiseLocalEvent(shuttleUid.Value, ref tagEv);
@@ -172,8 +172,8 @@ public sealed partial class ShuttleSystem
// Check if either grid has GridGodMode or ForceAnchor protection
var ourProtected = HasComp<GridGodModeComponent>(args.OurEntity) || HasComp<ForceAnchorComponent>(args.OurEntity);
var otherProtected = HasComp<GridGodModeComponent>(args.OtherEntity) || HasComp<ForceAnchorComponent>(args.OtherEntity);
var ourProtected = HasComp<GridGodModeComponent>(args.OurEntity); // || HasComp<ForceAnchorComponent>(args.OurEntity);
var otherProtected = HasComp<GridGodModeComponent>(args.OtherEntity); // || HasComp<ForceAnchorComponent>(args.OtherEntity);
// Check if the grids are docked together to prevent impact
var areGridsDocked = _dockSystem.AreGridsDocked(args.OurEntity, args.OtherEntity);
@@ -69,6 +69,12 @@ public sealed partial class StationEventComponent : Component
[DataField]
public ProtoId<RadioChannelPrototype> EndRadioAnnouncementChannel = "Supply"; // Frontier
/// <summary>
/// Mono - sender of start/warn/end announcements.
/// </summary>
[DataField]
public LocId? AnnounceSender = null;
/// <summary>
/// In minutes, when is the first round time this event can start
/// </summary>
@@ -50,7 +50,7 @@ public abstract class StationEventSystem<T> : GameRuleSystem<T> where T : ICompo
Filter allPlayersInGame = Filter.Empty().AddWhere(GameTicker.UserHasJoinedGame);
if (stationEvent.StartAnnouncement != null)
ChatSystem.DispatchFilteredAnnouncement(allPlayersInGame, Loc.GetString(stationEvent.StartAnnouncement), playSound: false, colorOverride: stationEvent.StartAnnouncementColor);
ChatSystem.DispatchFilteredAnnouncement(allPlayersInGame, Loc.GetString(stationEvent.StartAnnouncement), sender: stationEvent.AnnounceSender is { } send ? Loc.GetString(send) : null, playSound: false, colorOverride: stationEvent.StartAnnouncementColor);
// Frontier
if (stationEvent.StartRadioAnnouncement != null)
@@ -97,7 +97,7 @@ public abstract class StationEventSystem<T> : GameRuleSystem<T> where T : ICompo
Filter allPlayersInGame = Filter.Empty().AddWhere(GameTicker.UserHasJoinedGame);
if (stationEvent.EndAnnouncement != null)
ChatSystem.DispatchFilteredAnnouncement(allPlayersInGame, Loc.GetString(stationEvent.EndAnnouncement), playSound: false, colorOverride: stationEvent.EndAnnouncementColor);
ChatSystem.DispatchFilteredAnnouncement(allPlayersInGame, Loc.GetString(stationEvent.EndAnnouncement), sender: stationEvent.AnnounceSender is { } send ? Loc.GetString(send) : null, playSound: false, colorOverride: stationEvent.EndAnnouncementColor);
// Frontier: radio announcements
if (stationEvent.EndRadioAnnouncement != null)
@@ -139,7 +139,7 @@ public abstract class StationEventSystem<T> : GameRuleSystem<T> where T : ICompo
{
Filter allPlayersInGame = Filter.Empty().AddWhere(GameTicker.UserHasJoinedGame); // we don't want to send to players who aren't in game (i.e. in the lobby)
if (stationEvent.WarningAnnouncement != null)
ChatSystem.DispatchFilteredAnnouncement(allPlayersInGame, Loc.GetString(stationEvent.WarningAnnouncement), playSound: false, colorOverride: stationEvent.WarningAnnouncementColor);
ChatSystem.DispatchFilteredAnnouncement(allPlayersInGame, Loc.GetString(stationEvent.WarningAnnouncement), sender: stationEvent.AnnounceSender is { } send ? Loc.GetString(send) : null, playSound: false, colorOverride: stationEvent.WarningAnnouncementColor);
if (stationEvent.WarningRadioAnnouncement != null)
{
var message = Loc.GetString(stationEvent.WarningRadioAnnouncement);
@@ -58,7 +58,6 @@ namespace Content.Server.VendingMachines
[Dependency] private readonly BankSystem _bankSystem = default!; // Frontier
[Dependency] private readonly PopupSystem _popupSystem = default!; // Frontier
[Dependency] private readonly IAdminLogManager _adminLogger = default!; // Frontier
[Dependency] private readonly ContrabandTurnInSystem _contraband = default!; // Frontier
[Dependency] private readonly StackSystem _stack = default!; // Frontier
[Dependency] private readonly VendingMachinePurchaseSystem _vendingPurchase = default!; // Mono
@@ -545,8 +544,6 @@ namespace Content.Server.VendingMachines
var ent = Spawn(vendComponent.NextItemToEject, spawnCoordinates);
_contraband.ClearContrabandValue(ent); // Frontier
// Mono: Track vending machine purchases for pricing modifications
// Only track if this was a paid purchase (not a random eject or force eject)
if (!forceEject && vendComponent.LastPurchasePrice.HasValue)
@@ -233,7 +233,9 @@ namespace Content.Server.Voting.Managers
foreach (var (k, v) in presets)
{
options.Options.Add((Loc.GetString(v), k));
options.Options.Add((Loc.GetString(v.Name), k));
if (v.Weight != 1f)
options.Weights.Add(k, v.Weight);
}
WirePresetVoteInitiator(options, initiator);
@@ -247,13 +249,13 @@ namespace Content.Server.Voting.Managers
{
picked = (string) _random.Pick(args.Winners);
_chatManager.DispatchServerAnnouncement(
Loc.GetString("ui-vote-gamemode-tie", ("picked", Loc.GetString(presets[picked]))));
Loc.GetString("ui-vote-gamemode-tie", ("picked", Loc.GetString(presets[picked].Name))));
}
else
{
picked = (string) args.Winner;
_chatManager.DispatchServerAnnouncement(
Loc.GetString("ui-vote-gamemode-win", ("winner", Loc.GetString(presets[picked]))));
Loc.GetString("ui-vote-gamemode-win", ("winner", Loc.GetString(presets[picked].Name))));
}
_adminLogger.Add(LogType.Vote, LogImpact.Medium, $"Preset vote finished: {picked}");
var ticker = _entityManager.EntitySysManager.GetEntitySystem<GameTicker>();
@@ -585,9 +587,9 @@ namespace Content.Server.Voting.Managers
DirtyCanCallVoteAll();
}
private Dictionary<string, string> GetGamePresets()
private Dictionary<string, (string Name, float Weight)> GetGamePresets() // Mono - add weight
{
var presets = new Dictionary<string, string>();
var presets = new Dictionary<string, (string, float)>();
foreach (var preset in _prototypeManager.EnumeratePrototypes<GamePresetPrototype>())
{
@@ -600,7 +602,7 @@ namespace Content.Server.Voting.Managers
if(_playerManager.PlayerCount > (preset.MaxPlayers ?? int.MaxValue))
continue;
presets[preset.ID] = preset.ModeTitle;
presets[preset.ID] = (preset.ModeTitle, preset.Weight);
}
return presets;
}
+10 -5
View File
@@ -206,7 +206,8 @@ namespace Content.Server.Voting.Managers
{
var id = _nextVoteId++;
var entries = options.Options.Select(o => new VoteEntry(o.data, o.text)).ToArray();
// Mono - added weight
var entries = options.Options.Select(o => new VoteEntry(o.data, o.text, options.Weights.TryGetValue(o.data, out var weight) ? weight : 1f)).ToArray();
var start = _timing.RealTime;
var end = start + options.Duration;
@@ -286,11 +287,12 @@ namespace Content.Server.Voting.Managers
msg.DisplayVotes = true;
}
msg.Options = new (ushort votes, string name)[v.Entries.Length];
msg.Options = new (ushort votes, string name, ushort realVotes)[v.Entries.Length];
for (var i = 0; i < msg.Options.Length; i++)
{
ref var entry = ref v.Entries[i];
msg.Options[i] = (msg.DisplayVotes ? (ushort) entry.Votes : (ushort) 0, entry.Text);
var votes = msg.DisplayVotes ? (ushort) entry.Votes : (ushort) 0; // Mono
msg.Options[i] = (votes, entry.Text, (ushort) (votes * entry.Weight)); // Mono - account for weight
}
player.Channel.SendMessage(msg);
@@ -394,7 +396,7 @@ namespace Content.Server.Voting.Managers
// Find winner or stalemate.
var winners = v.Entries
.GroupBy(e => e.Votes)
.GroupBy(e => e.Votes * e.Weight) // Mono - add weight
.OrderByDescending(g => g.Key)
.First()
.Select(e => e.Data)
@@ -536,12 +538,15 @@ namespace Content.Server.Voting.Managers
public object Data;
public string Text;
public int Votes;
public float Weight; // Mono
public VoteEntry(object data, string text)
public VoteEntry(object data, string text,
float weight = 1f) // Mono
{
Data = data;
Text = text;
Votes = 0;
Weight = weight; // Mono
}
}
+4 -1
View File
@@ -39,6 +39,9 @@ namespace Content.Server.Voting
/// </summary>
public List<(string text, object data)> Options { get; set; } = new();
// Mono - this is evil but allows seamless integration with the code
public Dictionary<object, float> Weights = new();
/// <summary>
/// Which sessions may send a vote. Used when only a subset of players should be able to vote. Defaults to all.
/// </summary>
@@ -50,7 +53,7 @@ namespace Content.Server.Voting
public bool DisplayVotes = true;
/// <summary>
/// Whether the vote should have an entity attached to it, to be used for things like letting ghosts follow it.
/// Whether the vote should have an entity attached to it, to be used for things like letting ghosts follow it.
/// </summary>
public NetEntity? TargetEntity = null;
@@ -39,5 +39,11 @@ public sealed partial class DebrisFeaturePlacerControllerComponent : Component
/// </summary>
[DataField("densityNoiseChannel", customTypeSerializer: typeof(PrototypeIdSerializer<NoiseChannelPrototype>))]
public string DensityNoiseChannel { get; private set; } = default!;
[DataField]
public float? MinRange = null;
[DataField]
public float? MaxRange = null;
}
@@ -184,7 +184,10 @@ public sealed class DebrisFeaturePlacerSystem : BaseWorldSystem
.ToList();
}
points ??= GeneratePointsInChunk(args.Chunk, density, chunk.Coordinates, chunkMap);
if (component.MinRange is { } minr && component.MaxRange is { } maxr)
points ??= GeneratePointsInRing(args.Chunk, density, minr, maxr, chunk.Coordinates, chunkMap);
else
points ??= GeneratePointsInChunk(args.Chunk, density, chunk.Coordinates, chunkMap);
var mapId = map.MapId;
@@ -279,6 +282,44 @@ public sealed class DebrisFeaturePlacerSystem : BaseWorldSystem
return debrisPoints;
}
/// <summary>
/// Generates the points to put into a chunk using a poisson disk sampler.
/// </summary>
private List<Vector2> GeneratePointsInRing(EntityUid chunk, float density, float minr, float maxr, Vector2 coords, EntityUid map)
{
var wantWidth = maxr - minr;
var offs = (int) ((WorldGen.ChunkSize) / 2.0f);
var topLeft = new Vector2(-offs, -offs);
var lowerRight = new Vector2(offs, offs);
var width = lowerRight.X - topLeft.X;
var scl = wantWidth / width;
topLeft.X *= scl;
lowerRight.X *= scl;
var realCenter = WorldGen.ChunkToWorldCoordsCentered(coords.Floored());
if (realCenter.Length() + offs < minr || realCenter.Length() - offs > maxr) return new();
var radAdj = (maxr + minr) * 0.5f / realCenter.Length();
var rotBy = realCenter.ToAngle();
var rotTL = rotBy.RotateVec(topLeft);
var rotTR = rotBy.RotateVec(topLeft + new Vector2(offs * 2f, 0f));
var sclTL = offs / MathF.Max(MathF.Abs(rotTL.X), MathF.Abs(rotTL.Y));
var sclTR = offs / MathF.Max(MathF.Abs(rotTR.X), MathF.Abs(rotTR.Y));
var scl2 = MathF.Max(sclTL, sclTR);
topLeft.Y *= scl2;
lowerRight.Y *= scl2;
var enumerator = _sampler.SampleRectangle(topLeft, lowerRight, density);
var debrisPoints = new List<Vector2>();
var adjCenter = realCenter * radAdj;
while (enumerator.MoveNext(out var debrisPoint))
{
debrisPoints.Add(adjCenter + rotBy.RotateVec(debrisPoint.Value));
}
return debrisPoints;
}
}
/// <summary>
@@ -1,3 +1,7 @@
using Content.Shared.Damage;
using Content.Shared.Damage.Prototypes;
using Robust.Shared.Prototypes;
namespace Content.Server._EinsteinEngines.Silicon.Death;
/// <summary>
@@ -14,4 +18,12 @@ public sealed partial class SiliconDownOnDeadComponent : Component
/// </summary>
[ViewVariables(VVAccess.ReadOnly)]
public bool Dead;
/// <summary>
/// Mono - applies modifier when silicon is out of charge.
/// </summary>
[ViewVariables(VVAccess.ReadOnly)]
public ProtoId<DamageModifierSetPrototype>? ModifierOnDead = "IPCWeakened";
public ProtoId<DamageModifierSetPrototype>? OriginalModifier;
}
@@ -4,6 +4,7 @@ using Content.Shared.Bed.Sleep;
using Content.Server._EinsteinEngines.Silicon.Charge;
using Content.Server._EinsteinEngines.Power.Components;
using Content.Server.Humanoid;
using Content.Shared.Damage;
using Content.Shared.Humanoid;
using Content.Shared.Hands.Components;
using Content.Shared.Hands.EntitySystems; //Monolith IPC rework
@@ -15,7 +16,7 @@ public sealed class SiliconDeathSystem : EntitySystem
[Dependency] private readonly SleepingSystem _sleep = default!;
[Dependency] private readonly SiliconChargeSystem _silicon = default!;
[Dependency] private readonly HumanoidAppearanceSystem _humanoidAppearanceSystem = default!;
[Dependency] private readonly SharedHandsSystem _hands = default!; //Monolith IPC rework
[Dependency] private readonly DamageableSystem _damage = default!; // mono
public override void Initialize()
{
@@ -46,16 +47,15 @@ public sealed class SiliconDeathSystem : EntitySystem
var deadEvent = new SiliconChargeDyingEvent(uid, batteryComp, batteryUid);
RaiseLocalEvent(uid, deadEvent);
if (deadEvent.Cancelled)
if (deadEvent.Cancelled
|| siliconDeadComp.ModifierOnDead == null
|| !TryComp<DamageableComponent>(uid, out var damageComp))
return;
/*EntityManager.EnsureComponent<SleepingComponent>(uid); Monolith IPC rework edit start
EntityManager.EnsureComponent<ForcedSleepingComponent>(uid);*/
if(!TryComp<HandsComponent>(uid, out var handsComp))
return;
_hands.RemoveHands(uid, handsComp); // edit end
siliconDeadComp.OriginalModifier = damageComp.DamageModifierSetId;
_damage.SetDamageModifierSetId(uid, siliconDeadComp.ModifierOnDead.Value);
if (TryComp(uid, out HumanoidAppearanceComponent? humanoidAppearanceComponent))
{
@@ -73,8 +73,8 @@ public sealed class SiliconDeathSystem : EntitySystem
/*RemComp<ForcedSleepingComponent>(uid); Monolith IPC rework edit start
_sleep.TryWaking(uid, true, null);*/
_hands.AddHand(uid, "right hand", HandLocation.Right);
_hands.AddHand(uid, "left hand", HandLocation.Left); // edit end
if (siliconDeadComp.OriginalModifier != null)
_damage.SetDamageModifierSetId(uid, siliconDeadComp.OriginalModifier.Value);
siliconDeadComp.Dead = false;
+9 -1
View File
@@ -37,10 +37,18 @@ public sealed class ClawsSystem : SharedClawsSystem
if (TryGetStage<Declawed>(comp, out var declawed))
UpdateDeclaw(uid, declawed, comp, _updateCooldown);
if (HasComp<ClawsGrowthSuppressionComponent>(uid))
{
comp.AccumulatedBonusGrowth = TimeSpan.Zero;
continue;
}
if (!_protoMan.TryIndex(comp.ClawStage, out var claw) || !claw.CanGrow)
continue;
comp.GrowTimer += TimeSpan.FromSeconds(_updateCooldown);
comp.GrowTimer += TimeSpan.FromSeconds(_updateCooldown) + comp.AccumulatedBonusGrowth;
comp.AccumulatedBonusGrowth = TimeSpan.Zero;
if (comp.GrowTimer < claw.GrowCooldown)
{
@@ -9,7 +9,6 @@ using Content.Shared.Weapons.Ranged.Components;
using Content.Shared.Weapons.Ranged.Systems;
using Robust.Shared.Map.Components;
using Robust.Shared.Timing;
using System;
namespace Content.Server._Mono.Detection;
@@ -21,18 +20,22 @@ public sealed class ThermalSignatureSystem : EntitySystem
[Dependency] private readonly SharedPowerReceiverSystem _power = default!;
[Dependency] private readonly IGameTiming _timing = default!;
private float _updateInterval = 0.5f;
private float _updateAccumulator = 0f;
private EntityQuery<MapGridComponent> _gridQuery;
private const float UpdateIntervalSeconds = 1f;
private static readonly TimeSpan UpdateInterval = TimeSpan.FromSeconds(UpdateIntervalSeconds);
private TimeSpan _nextUpdateTime;
private const float HeatChangeThreshold = 1.02f;
private EntityQuery<ThermalSignatureComponent> _sigQuery;
private EntityQuery<GunComponent> _gunQuery;
private Dictionary<EntityUid, ThermalSignatureComponent> _gridCompMap = new();
private EntityQuery<MapGridComponent> _mapGridQuery;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<GridInitializeEvent>(OnGridInitialized);
// some of this could also be handled in shared but there's no point since PVS is a thing
SubscribeLocalEvent<MachineThermalSignatureComponent, GetThermalSignatureEvent>(OnMachineGetSignature);
SubscribeLocalEvent<PassiveThermalSignatureComponent, GetThermalSignatureEvent>(OnPassiveGetSignature);
@@ -42,9 +45,14 @@ public sealed class ThermalSignatureSystem : EntitySystem
SubscribeLocalEvent<ThrusterComponent, GetThermalSignatureEvent>(OnThrusterGetSignature);
SubscribeLocalEvent<FTLDriveComponent, GetThermalSignatureEvent>(OnFTLGetSignature);
_gridQuery = GetEntityQuery<MapGridComponent>();
_sigQuery = GetEntityQuery<ThermalSignatureComponent>();
_gunQuery = GetEntityQuery<GunComponent>();
_mapGridQuery = GetEntityQuery<MapGridComponent>();
}
private void OnGridInitialized(GridInitializeEvent args)
{
EnsureComp<ThermalSignatureComponent>(args.EntityUid);
}
private void OnGunShot(Entity<ThermalSignatureComponent> ent, ref GunShotEvent args)
@@ -87,48 +95,45 @@ public sealed class ThermalSignatureSystem : EntitySystem
public override void Update(float frameTime)
{
_updateAccumulator += frameTime;
if (_updateAccumulator < _updateInterval)
if (_timing.CurTime < _nextUpdateTime)
return;
_updateAccumulator -= _updateInterval;
var interval = _updateInterval;
_nextUpdateTime = _timing.CurTime + UpdateInterval;
_gridCompMap.Clear();
var gridQuery = EntityQueryEnumerator<MapGridComponent>();
while (gridQuery.MoveNext(out var uid, out _))
var gridQuery = EntityQueryEnumerator<MapGridComponent, ThermalSignatureComponent>();
while (gridQuery.MoveNext(out _, out _, out var gridSigComp))
{
if (!_sigQuery.TryComp(uid, out var sigComp))
sigComp = EnsureComp<ThermalSignatureComponent>(uid);
sigComp.TotalHeat = 0f;
_gridCompMap.Add(uid, sigComp);
gridSigComp.TotalHeat = 0f;
}
var query = EntityQueryEnumerator<ThermalSignatureComponent>();
while (query.MoveNext(out var uid, out var sigComp))
{
var ev = new GetThermalSignatureEvent(interval);
var ev = new GetThermalSignatureEvent();
RaiseLocalEvent(uid, ref ev);
sigComp.StoredHeat += ev.Signature * interval;
sigComp.StoredHeat *= MathF.Pow(sigComp.HeatDissipation, interval);
if (_gridCompMap.ContainsKey(uid))
sigComp.StoredHeat += ev.Signature * UpdateIntervalSeconds;
sigComp.StoredHeat *= MathF.Pow(sigComp.HeatDissipation, UpdateIntervalSeconds);
if (_mapGridQuery.HasComp(uid))
{
sigComp.TotalHeat += sigComp.StoredHeat;
// don't sync it if it didn't change heat much since last time, we don't need to sync 500 cold asteroids every system update
if (sigComp.TotalHeat <= sigComp.LastUpdateHeat * HeatChangeThreshold
&& sigComp.TotalHeat >= sigComp.LastUpdateHeat / HeatChangeThreshold)
continue;
sigComp.LastUpdateHeat = sigComp.TotalHeat;
Dirty(uid, sigComp);
}
else
{
var xform = Transform(uid);
sigComp.TotalHeat = sigComp.StoredHeat;
if (xform.GridUid != null && _gridCompMap.TryGetValue(xform.GridUid.Value, out var gridSig))
if (xform.GridUid != null && _sigQuery.TryGetComponent(xform.GridUid.Value, out var gridSig))
gridSig.TotalHeat += sigComp.StoredHeat;
}
}
foreach (var (uid, sigComp) in _gridCompMap)
{
Dirty(uid, sigComp); // sync to client
}
}
}
@@ -115,7 +115,7 @@ namespace Content.Server._Mono.EntityEffects.Effects
IgnoreResistances,
interruptsDoAfters: false,
targetPart: TargetBodyPart.All,
partMultiplier: 0.5f,
partMultiplier: 1.00f, // Mono, 0.5f->1.00f
canSever: false);
}
}
+8 -1
View File
@@ -1,5 +1,6 @@
using System.Linq;
using Content.Server.Damage.Systems;
using Content.Server.NPC.HTN;
using Content.Server.Spreader;
using Content.Shared._Mono;
using Content.Shared.Damage.Components;
@@ -68,7 +69,7 @@ public sealed class GridGodModeSystem : EntitySystem
/// </summary>
private void ProcessEntityOnGrid(EntityUid gridUid, EntityUid entityUid, GridGodModeComponent component)
{
// Don't apply GodMode to organic entities, ghosts, or kudzu
// Don't apply GodMode to organic entities, ghosts, npcs, or kudzu
if (IsOrganic(entityUid) || HasComp<GhostComponent>(entityUid) || HasComp<KudzuComponent>(entityUid))
return;
@@ -122,6 +123,12 @@ public sealed class GridGodModeSystem : EntitySystem
return true;
}
// Also check for anything with HTN such as NPCs, such as turrets.
if (HasComp<HTNComponent>(entityUid))
{
return true;
}
return false;
}
}
@@ -107,7 +107,8 @@ public sealed partial class RadarBlipSystem : EntitySystem
if (blipGrid != null)
{
var gridXform = Transform(blipGrid.Value);
blipVelocity -= _physics.GetLinearVelocity(blipGrid.Value, coord.Position);
if (TryComp<PhysicsComponent>(blipGrid.Value, out var gridBody)) // prevent log spam
blipVelocity -= _physics.GetLinearVelocity(blipGrid.Value, coord.Position, gridBody);
// it's local-frame velocity so rotate it too
blipVelocity = (-gridXform.LocalRotation).RotateVec(blipVelocity);
// and also offset the rotation
@@ -0,0 +1,4 @@
namespace Content.Server._Mono.StationEvents;
[RegisterComponent]
public sealed partial class BlankRuleComponent : Component;
@@ -0,0 +1,9 @@
using Content.Server.StationEvents.Events;
using JetBrains.Annotations;
namespace Content.Server._Mono.StationEvents;
[UsedImplicitly]
public sealed class FalseAlarmRule : StationEventSystem<BlankRuleComponent>
{
}
@@ -38,7 +38,6 @@ public sealed class VendingMachinePurchaseSystem : EntitySystem
var purchaseComponent = AddComp<VendingMachinePurchaseComponent>(purchasedEntity);
purchaseComponent.PurchaseGrid = vendingTransform.GridUid.Value;
purchaseComponent.OriginalPurchasePrice = purchasePrice;
purchaseComponent.VendingMachine = vendingMachine;
Dirty(purchasedEntity, purchaseComponent);
}
@@ -296,9 +296,7 @@ public sealed partial class MarketSystem
else
{
var maxQuantityToWithdraw = marketData.GetMaxQuantityToWithdraw(prototype);
var toWithdraw = args.Amount;
if (args.Amount > maxQuantityToWithdraw)
toWithdraw = maxQuantityToWithdraw;
var toWithdraw = MathHelper.Clamp(args.Amount, 1, maxQuantityToWithdraw);
var existing = FindMarketDataByPrototype(marketData, args.ItemPrototype!);
if (existing == null)
@@ -15,9 +15,9 @@ public sealed partial class ForceAnchorSystem : EntitySystem
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<ForceAnchorComponent, MapInitEvent>(OnForceAnchorMapInit);
SubscribeLocalEvent<ForceAnchorPostFTLComponent, FTLCompletedEvent>(OnForceAnchorPostFTLCompleted);
SubscribeLocalEvent<ConsoleFTLAttemptEvent>(OnConsoleFTLAttempt, before: new[] { typeof(ShuttleSystem) });
// SubscribeLocalEvent<ForceAnchorComponent, MapInitEvent>(OnForceAnchorMapInit);
// SubscribeLocalEvent<ForceAnchorPostFTLComponent, FTLCompletedEvent>(OnForceAnchorPostFTLCompleted);
// SubscribeLocalEvent<ConsoleFTLAttemptEvent>(OnConsoleFTLAttempt, before: new[] { typeof(ShuttleSystem) });
}
/// <summary>
@@ -14,8 +14,8 @@ namespace Content.Server.Shuttles.Systems;
public sealed partial class ShuttleSystem
{
private const float SpaceFrictionStrength = 0.0075f;
private const float DampenDampingStrength = 0.25f;
private const float AnchorDampingStrength = 2.5f;
private const float DampenDampingStrength = 0.0075f; // Mono - april 1st changes
private const float AnchorDampingStrength = 0.0075f; // Mono - april 1st changes
private void NfInitialize()
{
SubscribeLocalEvent<ShuttleConsoleComponent, SetInertiaDampeningRequest>(OnSetInertiaDampening);
@@ -150,7 +150,7 @@ public sealed class SurgerySystem : SharedSurgerySystem
if (HasComp<ForcedSleepingComponent>(args.Body))
damageChange = damageChange * ent.Comp.SleepModifier;
SetDamage(args.Body, damageChange, 0.5f, args.User, args.Part);
SetDamage(args.Body, damageChange, 1f, args.User, args.Part); // 0.5-> 1.0f part damage - Mono
}
private void OnSurgerySpecialDamageChange(Entity<SurgerySpecialDamageChangeEffectComponent> ent, ref SurgeryStepDamageChangeEvent args)
@@ -15,7 +15,7 @@ public sealed partial class PerishableComponent : Component
/// How long it takes after death to start rotting.
/// </summary>
[DataField("rotAfter"), ViewVariables(VVAccess.ReadWrite)]
public TimeSpan RotAfter = TimeSpan.FromMinutes(20);
public TimeSpan RotAfter = TimeSpan.FromMinutes(60); // Mono: Tripled default (20 > 60)
/// <summary>
/// How much rotting has occured
@@ -43,7 +43,7 @@ public sealed partial class BlockingSystem : SharedBlockingSystem // Mono
private void OnUserDamageModified(EntityUid uid, BlockingUserComponent component, DamageModifyEvent args)
{
if (TryComp<ItemToggleComponent>(component.BlockingItem, out var toggleComponent) && TryComp<BlockingComponent>(component.BlockingItem, out var blocking)) // Mono
if (TryComp<BlockingComponent>(component.BlockingItem, out var blocking)) // Mono
{
if (args.Damage.GetTotal() <= 0)
return;
@@ -52,7 +52,7 @@ public sealed partial class BlockingSystem : SharedBlockingSystem // Mono
if (!TryComp<DamageableComponent>(component.BlockingItem, out var dmgComp))
return;
if (!toggleComponent.Activated) // Mono
if (TryComp<ItemToggleComponent>(component.BlockingItem, out var toggleComponent) && !toggleComponent.Activated) // Mono
return;
var blockFraction = blocking.IsBlocking ? blocking.ActiveBlockFraction : blocking.PassiveBlockFraction;
+11
View File
@@ -65,4 +65,15 @@ public sealed partial class CCVars
"",
CVar.SERVER | CVar.SERVERONLY | CVar.ARCHIVE,
"A message broadcast to each player that joins the lobby.");
public static readonly CVarDef<string> ChatHighlights =
CVarDef.Create("chat.words_highlights", "", CVar.CLIENTONLY | CVar.ARCHIVE,
"Per-character custom highlight keywords. Format: one entry per line, 'CharacterName||encoded_keywords'. " +
"Encoded keywords use \\n for newlines, \\| for pipes, \\\\ for backslashes.");
public static readonly CVarDef<bool> ChatAutoFillHighlights =
CVarDef.Create("chat.auto_fill_highlights", false, CVar.CLIENTONLY | CVar.ARCHIVE, "Toggles automatically filling the highlights with the character's information.");
public static readonly CVarDef<string> ChatHighlightsColor =
CVarDef.Create("chat.highlights_color", "#17FFC1FF", CVar.CLIENTONLY | CVar.ARCHIVE, "The color in which the highlights will be displayed.");
}
@@ -25,6 +25,10 @@ public sealed partial class FlatpackComponent : Component
[DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
public EntProtoId? Entity;
// Mono - april 1st
[DataField]
public List<EntProtoId>? Entities = null;
/// <summary>
/// Sound effect played upon the object being unpacked.
/// </summary>
@@ -12,6 +12,7 @@ using Robust.Shared.Containers;
using Robust.Shared.Map.Components;
using Robust.Shared.Network;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
namespace Content.Shared.Construction;
@@ -30,6 +31,7 @@ public abstract class SharedFlatpackSystem : EntitySystem
[Dependency] private readonly MetaDataSystem _metaData = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!;
[Dependency] private readonly SharedToolSystem _tool = default!;
[Dependency] private readonly IRobustRandom _random = default!;
/// <inheritdoc/>
public override void Initialize()
@@ -67,7 +69,7 @@ public abstract class SharedFlatpackSystem : EntitySystem
args.Handled = true;
if (comp.Entity == null)
if (comp.Entity == null && (comp.Entities is not { } entsc || entsc.Count == 0))
{
Log.Error($"No entity prototype present for flatpack {ToPrettyString(ent)}.");
@@ -92,7 +94,8 @@ public abstract class SharedFlatpackSystem : EntitySystem
if (_net.IsServer)
{
var spawn = Spawn(comp.Entity, _map.GridTileToLocal(grid, gridComp, buildPos));
var entsp = comp.Entities is { } ents ? _random.Pick(ents) : comp.Entity;
var spawn = Spawn(entsp, _map.GridTileToLocal(grid, gridComp, buildPos));
if (TryComp(spawn, out TransformComponent? spawnXform)) // Frontier: rotatable flatpacks
spawnXform.LocalRotation = xform.LocalRotation.GetCardinalDir().ToAngle(); // Frontier: rotatable flatpacks
_adminLogger.Add(LogType.Construction,
@@ -78,7 +78,7 @@ public abstract class SharedMechSystem : EntitySystem
SubscribeLocalEvent<MechPilotComponent, AttackAttemptEvent>(OnAttackAttempt);
SubscribeLocalEvent<MechPilotComponent, EntGotRemovedFromContainerMessage>(OnEntGotRemovedFromContainer);
SubscribeLocalEvent<MechEquipmentComponent, ShotAttemptedEvent>(OnShotAttempted); // Goobstation
Subs.CVar(_config, GoobCVars.MechGunOutsideMech, value => _canUseMechGunOutside = value, false); // Goobstation
Subs.CVar(_config, GoobCVars.MechGunOutsideMech, value => _canUseMechGunOutside = value, true); // Goobstation
}
// GoobStation: Fixes scram implants or teleports locking the pilot out of being able to move.
@@ -265,11 +265,11 @@ public abstract class SharedMechSystem : EntitySystem
if (!Resolve(toInsert, ref equipmentComponent))
return;
if (component.EquipmentContainer.ContainedEntities.Count >= component.MaxEquipmentAmount)
return;
// if (component.EquipmentContainer.ContainedEntities.Count >= component.MaxEquipmentAmount)
// return;
if (_whitelistSystem.IsWhitelistFail(component.EquipmentWhitelist, toInsert))
return;
// if (_whitelistSystem.IsWhitelistFail(component.EquipmentWhitelist, toInsert)) // Mono - no limit to te larp
// return;
equipmentComponent.EquipmentOwner = uid;
_container.Insert(toInsert, component.EquipmentContainer);
@@ -131,6 +131,10 @@ namespace Content.Shared.Movement.Systems
private void OnMoverGetState(Entity<InputMoverComponent> entity, ref ComponentGetState args)
{
// Mono
if (TerminatingOrDeleted(entity.Comp.RelativeEntity))
entity.Comp.RelativeEntity = null;
args.State = new InputMoverComponentState()
{
CanMove = entity.Comp.CanMove,
@@ -29,6 +29,13 @@ public sealed partial class NpcFactionPrototype : IPrototype
/// </summary>
[DataField]
public bool DefaultHostile = false;
/// <summary>
/// Mono - Is this faction checked for default hostility?
/// </summary>
[DataField]
public bool DefaultHostileIncluded = true;
}
/// <summary>
@@ -348,6 +348,7 @@ public sealed partial class NpcFactionSystem : EntitySystem
{
if (iteratedFaction.Neutral.Contains(faction) ||
iteratedFaction.Friendly.Contains(faction) ||
!faction.DefaultHostileIncluded || // Mono
faction.ID == iteratedFaction.ID)
continue;
+2
View File
@@ -75,6 +75,8 @@ public enum CollisionGroup
SlipLayer = MidImpassable | LowImpassable,
ItemMask = Impassable | HighImpassable,
ThrownItem = Impassable | HighImpassable | BulletImpassable,
DiagonalWallLayer = Opaque | HighImpassable | MidImpassable | LowImpassable | BulletImpassable, // Mono
DiagonalGlassLayer = HighImpassable | MidImpassable | LowImpassable | BulletImpassable, // Mono
WallLayer = Opaque | Impassable | HighImpassable | MidImpassable | LowImpassable | BulletImpassable | InteractImpassable,
GlassLayer = Impassable | HighImpassable | MidImpassable | LowImpassable | BulletImpassable | InteractImpassable,
HalfWallLayer = MidImpassable | LowImpassable,
@@ -45,6 +45,9 @@ public sealed partial class BorgSwitchableTypeComponent : Component
/// </summary>
[DataField]
public ProtoId<RadioChannelPrototype>[] InherentRadioChannels = [];
//Mono: Selectable borg whitelist
[DataField(required: true), AutoNetworkedField]
public List<ProtoId<BorgTypePrototype>> TypeWhitelist = new();
}
/// <summary>
@@ -79,6 +79,14 @@ public abstract class SharedBorgSwitchableTypeSystem : EntitySystem
if (!Prototypes.HasIndex(args.Prototype) || !Prototypes.HasIndex(args.Subtype))
return;
//Mono: Selectable borg whitelist - Validation
if (ent.Comp.TypeWhitelist.Count == 0)
{
Log.Error("Empty whitelist on selectable cyborg chassis");
return;
}
if (!ent.Comp.TypeWhitelist.Contains(args.Prototype))
return;
SelectBorgModule(ent, args.Prototype, args.Subtype);
}
@@ -1063,12 +1063,12 @@ public abstract class SharedStorageSystem : EntitySystem
return false;
}
if (TryComp<StorageComponent>(insertEnt, out var insertStorage)
&& GetMaxItemSize((insertEnt, insertStorage)) >= maxSize)
{
reason = "comp-storage-too-big";
return false;
}
// if (TryComp<StorageComponent>(insertEnt, out var insertStorage) // mono larp.
// && GetMaxItemSize((insertEnt, insertStorage)) >= maxSize)
// {
// reason = "comp-storage-too-big";
// return false;
// }
if (!ignoreLocation && !storageComp.StoredItems.ContainsKey(insertEnt))
{
+5 -4
View File
@@ -14,7 +14,7 @@ namespace Content.Shared.Voting
public string VoteInitiator = string.Empty;
public TimeSpan StartTime; // Server RealTime.
public TimeSpan EndTime; // Server RealTime.
public (ushort votes, string name)[] Options = default!;
public (ushort votes, string name, ushort realVotes)[] Options = default!; // Mono - account for vote weight
public bool IsYourVoteDirty;
public byte? YourVote;
public bool DisplayVotes;
@@ -36,10 +36,10 @@ namespace Content.Shared.Voting
DisplayVotes = buffer.ReadBoolean();
TargetEntity = buffer.ReadVariableInt32();
Options = new (ushort votes, string name)[buffer.ReadByte()];
Options = new (ushort votes, string name, ushort realvotes)[buffer.ReadByte()];
for (var i = 0; i < Options.Length; i++)
{
Options[i] = (buffer.ReadUInt16(), buffer.ReadString());
Options[i] = (buffer.ReadUInt16(), buffer.ReadString(), buffer.ReadUInt16());
}
IsYourVoteDirty = buffer.ReadBoolean();
@@ -66,10 +66,11 @@ namespace Content.Shared.Voting
buffer.WriteVariableInt32(TargetEntity);
buffer.Write((byte) Options.Length);
foreach (var (votes, name) in Options)
foreach (var (votes, name, realVotes) in Options)
{
buffer.Write(votes);
buffer.Write(name);
buffer.Write(realVotes); // Mono
}
buffer.Write(IsYourVoteDirty);
@@ -1,3 +1,4 @@
using Content.Shared.Damage;
using Content.Shared.Weapons.Hitscan.Components;
using Content.Shared.Weapons.Hitscan.Events;
using Content.Shared.Weapons.Ranged.Events;
@@ -8,6 +9,7 @@ namespace Content.Shared.Weapons.Hitscan.Systems;
public sealed class HitscanReflectSystem : EntitySystem
{
[Dependency] private readonly DamageableSystem _damage = default!; // Mono
public override void Initialize()
{
base.Initialize();
@@ -23,8 +25,14 @@ public sealed class HitscanReflectSystem : EntitySystem
if (hitscan.Comp.CurrentReflections >= hitscan.Comp.MaxReflections)
return;
// Mono - Added null as default DamageSpecifier? Damage parameter
var ev = new HitScanReflectAttemptEvent(args.Shooter ?? args.Gun, args.Gun, hitscan.Comp.ReflectiveType, args.ShotDirection, false, null);
// Mono begin
DamageSpecifier damage = new();
if (EntityManager.TryGetComponent<HitscanBasicDamageComponent>(hitscan, out var hitscanDamage))
damage = hitscanDamage.Damage * _damage.UniversalHitscanDamageModifier;
// Mono - Use hitscan damage component if available
var ev = new HitScanReflectAttemptEvent(args.Shooter ?? args.Gun, args.Gun, hitscan.Comp.ReflectiveType, args.ShotDirection, false, damage);
// Mono End
RaiseLocalEvent(args.HitEntity.Value, ref ev);
if (!ev.Reflected)
@@ -305,14 +305,14 @@ public sealed partial class GunComponent : Component
/// Recoil to incur per ammo shot, kg*m/s.
/// </summary>
[DataField]
public float Recoil = 25f;
public float Recoil = 200f;
/// <summary>
/// Mono
/// Multiplier of how much recoil should rotate you.
/// </summary>
[DataField]
public float RecoilRotation = 0.2f;
public float RecoilRotation = 0.5f; // Mono - april 1st
/// <summary>
/// Mono
@@ -689,7 +689,7 @@ public abstract partial class SharedGunSystem : EntitySystem
// Mono - rewritten
public void CauseImpulse(EntityCoordinates toCoordinates, Entity<GunComponent> ent, float scale)
{
var totalImpulse = ent.Comp.Recoil * scale;
var totalImpulse = ent.Comp.Recoil * scale * 4f; // Mono - april 1st
var selfXform = Transform(ent);
var impulseCoord = new EntityCoordinates(ent, Vector2.Zero);
@@ -30,6 +30,9 @@ public sealed partial class ReflectComponent : Component
public SoundSpecifier? SoundOnReflect = new SoundPathSpecifier("/Audio/Weapons/Guns/Hits/laser_sear_wall.ogg");
// WD START
/// <summary>
/// How much damage does the reflecting item take on reflect?
/// </summary>
[DataField, AutoNetworkedField]
public float DamageOnReflectModifier;
// WD END
@@ -232,7 +232,7 @@ public sealed class ReflectSystem : EntitySystem
if (reflect.DamageOnReflectModifier != 0)
{
_damageable.TryChangeDamage(reflector, projectileComp.Damage * reflect.DamageOnReflectModifier,
projectileComp.IgnoreResistances, origin: projectileComp.Shooter);
projectileComp.IgnoreResistances, armorPenetration: projectileComp.ArmorPenetration, origin: projectileComp.Shooter); // Mono - Added armorpen
}
// WD EDIT END
@@ -0,0 +1,37 @@
using Content.Shared._Mono.Claws.Components;
using Content.Shared._Mono.Claws;
using Content.Shared.EntityEffects;
using Robust.Shared.Prototypes;
namespace Content.Server.EntityEffects.Effects
{
public sealed partial class ClawsGrowth : EntityEffect
{
/// <summary>
/// Bonus Claws growth in seconds. X seconds of additional growth per second.
/// </summary>
[DataField]
public double Growth;
protected override string? ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys)
=> Loc.GetString("reagent-effect-guidebook-claws-growth",
("chance", Probability),
("amount", Growth));
public override void Effect(EntityEffectBaseArgs args)
{
if (args.EntityManager.TryGetComponent<ClawsComponent>(args.TargetEntity, out var claws))
{
var sys = args.EntityManager.EntitySysManager.GetEntitySystem<SharedClawsSystem>();
var growth = Growth;
if (args is EntityEffectReagentArgs reagentArgs)
{
growth *= reagentArgs.Scale.Float();
}
sys.GrowClaws(TimeSpan.FromSeconds(growth), claws);
}
}
}
}
@@ -7,12 +7,13 @@ using Content.Shared.Popups;
using Content.Shared.Weapons.Melee.Events;
namespace Content.Shared._Mono.Claws;
public abstract partial class SharedClawsSystem
{
public void UpdateDeclaw(EntityUid uid, Declawed declawed, ClawsComponent claws, float updateTime)
{
if (!_state.IsAlive(uid))
return;
return;
var hands = _hands.EnumerateHands(uid).ToArray();
if (!_hands.EnumerateHeld(uid).Any())
@@ -43,7 +44,7 @@ public abstract partial class SharedClawsSystem
claws.DeclawItemHoldTimer = TimeSpan.Zero;
Dirty(uid,claws);
Dirty(uid, claws);
}
public void Declaw(EntityUid uid, ClawsComponent claws)
@@ -43,7 +43,7 @@ public abstract partial class SharedClawsSystem
public bool TryClipNails(NailClipperComponent component, EntityUid nailClipper, EntityUid user, EntityUid? target = null)
{
target ??= user;
if (!TryComp<ClawsComponent>(target, out var claws))
{
return false;
@@ -89,7 +89,7 @@ public abstract partial class SharedClawsSystem
if (nailClipper.DeclawChance > _random.NextFloat())
{
Declaw(uid,component);
Declaw(uid, component);
return;
}
@@ -97,6 +97,9 @@ public abstract partial class SharedClawsSystem
Math.Clamp(TryGetStageNumber(component) - nailClipper.StageReduction, 0, int.MaxValue));
_popup.PopupClient(Loc.GetString("claws-clipping-success"), Transform(uid).Coordinates, uid);
// Reset current growth progress
component.GrowTimer = TimeSpan.Zero;
UpdateClaws(uid, component);
Dirty(uid, component);
}
@@ -6,7 +6,7 @@ namespace Content.Shared._Mono.Claws.Components;
/// <summary>
/// This is claw component used for <see cref="SharedClawsSystem"/> System.
/// </summary>
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState, AutoGenerateComponentPause]
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
public sealed partial class ClawsComponent : Component
{
[DataField, AutoNetworkedField]
@@ -18,9 +18,12 @@ public sealed partial class ClawsComponent : Component
[DataField]
public LocId? ClawGrowthNotification;
[DataField, AutoPausedField]
[DataField]
public TimeSpan GrowTimer = TimeSpan.Zero;
[AutoPausedField]
[DataField]
public TimeSpan AccumulatedBonusGrowth = TimeSpan.Zero;
[DataField]
public TimeSpan DeclawItemHoldTimer = TimeSpan.Zero;
}
@@ -0,0 +1,7 @@
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
namespace Content.Shared._Mono.Claws.Components;
[RegisterComponent, NetworkedComponent]
public sealed partial class ClawsGrowthSuppressionComponent : Component;
@@ -104,6 +104,11 @@ public abstract partial class SharedClawsSystem : EntitySystem
gunAccuracyComp.SpreadMultiplier = stage.GunSpreadMultiplier;
}
public void GrowClaws(TimeSpan bonusGrowth, ClawsComponent component)
{
component.AccumulatedBonusGrowth += bonusGrowth;
}
protected bool TryGetStage<T>(ClawsComponent comp, [NotNullWhen(true)] out T? stage) where T : ClawType
{
if (!_protoMan.TryIndex(comp.ClawStage, out var clawProto) ||
@@ -9,6 +9,9 @@ namespace Content.Shared._Mono.Detection;
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
public sealed partial class ThermalSignatureComponent : Component
{
[ViewVariables(VVAccess.ReadOnly)]
public float LastUpdateHeat = 0f;
[DataField]
public float StoredHeat = 0f;
@@ -22,11 +22,4 @@ public sealed partial class VendingMachinePurchaseComponent : Component
/// </summary>
[DataField, AutoNetworkedField]
public double OriginalPurchasePrice;
/// <summary>
/// The entity ID of the vending machine this was purchased from.
/// Stored for reference and potential future features.
/// </summary>
[DataField, AutoNetworkedField]
public EntityUid VendingMachine;
}
+1 -1
View File
@@ -24,7 +24,7 @@ public sealed class NFCCVars
/// Respawn time, how long the player has to wait in seconds after death, or on subsequent cryo attempts.
/// </summary>
public static readonly CVarDef<float> RespawnTime =
CVarDef.Create("nf14.respawn.time", 1200.0f, CVar.SERVER | CVar.REPLICATED);
CVarDef.Create("nf14.respawn.time", 65f, CVar.SERVER | CVar.REPLICATED);
/// <summary>
/// Whether or not returning from cryosleep is enabled.
@@ -177,7 +177,7 @@ public abstract partial class SharedSurgerySystem
if (!HasComp<SanitizedComponent>(args.User))
{
var sepsis = new DamageSpecifier(_prototypes.Index<DamageTypePrototype>("Poison"), 15);
var ev = new SurgeryStepDamageEvent(args.User, args.Body, args.Part, args.Surgery, sepsis, 0.5f);
var ev = new SurgeryStepDamageEvent(args.User, args.Body, args.Part, args.Surgery, sepsis, 1.0f); // Mono - 0.5->1.0f - Mono Part surgery damage increase
RaiseLocalEvent(args.Body, ref ev);
}
}
@@ -360,7 +360,7 @@ public abstract partial class SharedSurgerySystem
foreach (var type in group)
adjustedDamage.DamageDict[type] -= bonus;
var ev = new SurgeryStepDamageEvent(args.User, args.Body, args.Part, args.Surgery, adjustedDamage, 0.5f);
var ev = new SurgeryStepDamageEvent(args.User, args.Body, args.Part, args.Surgery, adjustedDamage, 2.5f); // 0.5 -> 2.5f part damage, buffed wound surgery tending - Mono
RaiseLocalEvent(args.Body, ref ev);
}
@@ -43,7 +43,7 @@ public abstract class SharedLayingDownSystem : EntitySystem
{
if (session?.AttachedEntity == null ||
!HasComp<LayingDownComponent>(session.AttachedEntity) ||
_gravity.IsWeightless(session.AttachedEntity.Value))
!CanLieDown(session.AttachedEntity.Value)) // Mono
{
return;
}
@@ -112,7 +112,7 @@ public abstract class SharedLayingDownSystem : EntitySystem
// If the entity is not on a grid, try to make it stand up to avoid issues
if (!TryComp<StandingStateComponent>(uid, out var standingState)
|| standingState.CurrentState is StandingState.Standing
|| Transform(uid).GridUid != null)
|| CanLieDown(uid)) // Mono
{
return;
}
@@ -150,7 +150,8 @@ public abstract class SharedLayingDownSystem : EntitySystem
{
if (!Resolve(uid, ref standingState, false) ||
!Resolve(uid, ref layingDown, false) ||
standingState.CurrentState is not StandingState.Standing)
standingState.CurrentState is not StandingState.Standing ||
!CanLieDown(uid)) // Mono
{
if (behavior == DropHeldItemsBehavior.AlwaysDrop)
{
@@ -163,6 +164,12 @@ public abstract class SharedLayingDownSystem : EntitySystem
_standing.Down(uid, true, behavior != DropHeldItemsBehavior.NoDrop, false, standingState);
return true;
}
// Mono
private bool CanLieDown(EntityUid uid)
{
return _gravity.EntityOnGravitySupportingGridOrMap(uid);
}
}
[Serializable, NetSerializable]
+1 -1
View File
@@ -24,7 +24,7 @@ We provide some scripts shown below to make the job easier.
### Build dependencies
> - Git
> - .NET SDK 9.0.101
> - .NET SDK 10.0
### Windows
+666 -9
View File
@@ -14775,7 +14775,7 @@ Entries:
- type: Add
message: >-
The DIS Pluto MK. II has pierced it's way on the hull market. A
replacement of the honorable Pluto.
replacement of the honorable Pluto.
- type: Remove
message: >-
DIS Pluto hulls are no longer available on the hull market. We will miss
@@ -14885,7 +14885,7 @@ Entries:
- type: Tweak
message: >-
Spasaka sabotage kit has gotten equipment changes to help with boarding
as well as receiving the RX-01 suit.
as well as receiving the RX-01 suit.
id: 1651
time: '2025-12-13T08:10:05.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/2782
@@ -15226,7 +15226,7 @@ Entries:
- type: Tweak
message: >-
Bluespace crates occur more frequently. By extension there will be fewer
solar flares.
solar flares.
- type: Tweak
message: >-
Increased the number of smuggling hints sent out to ships. Happy
@@ -15789,7 +15789,7 @@ Entries:
- type: Add
message: >-
A new challanger! BT-Y Hazel enters the PDV Roster as a small-strafer in
place of the Vega featuring a 3 barreled 220m Battery!
place of the Vega featuring a 3 barreled 220m Battery!
- type: Remove
message: PDV Vega is now gone, o7.
id: 1752
@@ -15815,7 +15815,7 @@ Entries:
The Europa is now a beefy capital ship with medical and cloning
capabilities. She is now restricted to two vessels active at a time, as
well as costing 240k. These changes come with the benefit of a heavy
upgrade. Glory to Phaethon.
upgrade. Glory to Phaethon.
id: 1754
time: '2026-01-05T16:53:42.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/2929
@@ -16677,7 +16677,7 @@ Entries:
- type: Tweak
message: >-
Advanced chemicals now have 0.15u metabolism rate. Pyrazine healing was
buffed to 2.
buffed to 2.
- type: Tweak
message: Overseer's heavy maul sprite received changes.
id: 1847
@@ -16904,7 +16904,7 @@ Entries:
- type: Tweak
message: >-
Horizon Energy has begun sale of modernized versions of the Windreign to
the Colossus Sector.
the Colossus Sector.
id: 1871
time: '2026-02-01T19:28:28.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3141
@@ -17076,7 +17076,7 @@ Entries:
message: >-
the local syndicate outpost has finally invested in some automated
defenses. woe be the raider who tries to illegally park their ship right
in front of the outpost.
in front of the outpost.
id: 1887
time: '2026-02-11T01:31:25.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3044
@@ -17408,7 +17408,7 @@ Entries:
- type: Tweak
message: >-
Mech Fuel Cell now costs Fissile Uranium (1) and Diamond (1) among other
cost changes, but auto-regens to full within 4 minutes.
cost changes, but auto-regens to full within 4 minutes.
- type: Tweak
message: >-
Balance pass on Armored Frame (S2/S4 mech) weapons - RAC-6 spreads
@@ -18716,3 +18716,660 @@ Entries:
id: 2064
time: '2026-03-22T19:49:14.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3499
- author: tonotom1
changes:
- type: Tweak
message: >-
Cables no longer drop an item when destroyed, ever. Hopefully this will
reduce ram lag. Cable HP also standardized to 200 for all types.
id: 2065
time: '2026-03-22T22:41:10.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3520
- author: Redrover1760
changes:
- type: Tweak
message: Hydrakin no longer heat up in criticial.
- type: Fix
message: People no longer thermal regulate while dead.
id: 2066
time: '2026-03-22T22:54:10.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3530
- author: Redrover1760
changes:
- type: Fix
message: Part damage easier to heal/injure with surgery/chems
id: 2067
time: '2026-03-22T23:22:33.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3533
- author: Redrover1760
changes:
- type: Tweak
message: Built research datafarms now work
id: 2068
time: '2026-03-23T03:42:15.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3536
- author: Kiithnaras
changes:
- type: Tweak
message: Added roofing mask and emergency lighting to CDM Comet.
id: 2069
time: '2026-03-23T04:00:28.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3381
- author: Redrover1760
changes:
- type: Tweak
message: >-
Tending surgery heals bodyparts 2.5x the amount tended, previous value
was 0.5x
- type: Tweak
message: >-
Other surgery based damage increased to 1.0x part damage instead of 0.5x
(i.e sepsis)
id: 2070
time: '2026-03-23T06:04:49.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3534
- author: Redrover1760
changes:
- type: Tweak
message: Research datafarms now can be made with any 10000 point disk.
id: 2071
time: '2026-03-23T17:23:36.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3543
- author: chuga-git
changes:
- type: Tweak
message: MARAUDER plasma cannon projectile speed increased by 50%. (100->150)
id: 2072
time: '2026-03-24T11:44:39.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3549
- author: Redrover1760
changes:
- type: Fix
message: >-
Printed contraband-type items, aka enemy faction gear, can now be sold
for FMCs/DCs. Frontier is so frustrating man.
id: 2073
time: '2026-03-24T12:06:49.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3548
- author: gelliii
changes:
- type: Add
message: Added the Horsefly, welded together by hopes and dreams.
id: 2074
time: '2026-03-24T15:07:30.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3155
- author: Ilya246
changes:
- type: Fix
message: Fixes the server not checking some bank balance-related values.
id: 2075
time: '2026-03-24T19:00:31.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3550
- author: Ilya246
changes:
- type: Tweak
message: >-
AMEs no longer scale purely off core count. Injection count now matters
instead.
id: 2076
time: '2026-03-24T19:54:07.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3552
- author: Avalon-Proto
changes:
- type: Add
message: >-
Ullman Industries has released a new overcoat, this one with much
thicker fur around the neck
id: 2077
time: '2026-03-24T23:41:50.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3260
- author: Lokilife
changes:
- type: Fix
message: You can't lie in space with voidboots anymore
id: 2078
time: '2026-03-25T00:08:36.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3551
- author: Redrover1760
changes:
- type: Fix
message: >-
Research generating things no longer connect to multiple servers at once
when built
id: 2079
time: '2026-03-25T04:12:27.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3556
- author: lopsidedmanboobs
changes:
- type: Remove
message: >-
You cannot force people to pay their own ransom during Piracy anymore.
View Conflict Rule 3.
id: 2080
time: '2026-03-25T05:49:54.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3558
- author: Redrover1760
changes:
- type: Tweak
message: >-
Clipping Claws now resets growth time, ensuring you do not have to worry
about your claws reaching the next stage for a while.
- type: Add
message: >-
Phenoxzine and Meroxzine. Phenoxzine massively boosts claw growth speed,
Meroxzine halts it completely for a long period of time.
id: 2081
time: '2026-03-25T06:13:30.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3554
- author: Redrover1760
changes:
- type: Add
message: Ports CMO webbing from Goob, adds it to CMO/DoC lockers.
id: 2082
time: '2026-03-25T18:33:22.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3555
- author: Redrover1760
changes:
- type: Tweak
message: >-
Fireteam leader marine playtime requirement of 10 hours replaced with
general tsfmc playtime requirement of 10 hours
id: 2083
time: '2026-03-25T19:53:53.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3542
- author: Redrover1760
changes:
- type: Fix
message: >-
Energy shields now take damage from reflecting hitscan projectiles,
instead of just non-hitscan energy projectiles.
- type: Fix
message: Non-energy shields properly reduce damage taken.
- type: Fix
message: Riot and non-energy shields work now.
id: 2084
time: '2026-03-25T22:18:31.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3563
- author: UnicornOnLSD
changes:
- type: Tweak
message: >-
The DIS Femur has seen a light rework, see PR for more details. Report
feedback & issues to me on discord (@unicornonlsd)
id: 2085
time: '2026-03-26T05:55:13.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3560
- author: Redrover1760
changes:
- type: Remove
message: You can no longer sell crates on Helios/Lancelot
id: 2086
time: '2026-03-26T22:05:32.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3573
- author: Onezero0
changes:
- type: Tweak
message: Tripled the time it takes for a body to start rotting (20 -> 60 minutes)
id: 2087
time: '2026-03-27T05:49:14.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3524
- author: Redrover1760
changes:
- type: Fix
message: Hydrakin head displacement improved slightly
id: 2088
time: '2026-03-27T07:19:24.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3575
- author: Redrover1760
changes:
- type: Tweak
message: Updates Reptilian Guidebook with recent changes.
id: 2089
time: '2026-03-27T07:20:31.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3565
- author: Ilya246
changes:
- type: Add
message: Reenabled apocalypse gamemode.
- type: Tweak
message: Apocalypse now requires a 80% majority vote.
- type: Tweak
message: Some events can now trigger earlier.
- type: Fix
message: Fixed biothreat spawning chimera only 3 hours in. Now 1 hour.
id: 2090
time: '2026-03-27T17:58:07.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3570
- author: NazrinNya
changes:
- type: Tweak
message: >-
Heavy ballistic turrets now use 51mm antimaterial instead of 65mm.
Firerate 5 -> 4.5 Projectile speed 100 -> 65.
id: 2091
time: '2026-03-27T19:26:23.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3461
- author: Redrover1760
changes:
- type: Add
message: >-
Installs anti-chimera/hostile mob turrets to CC and MD to guard
cryosleep chambers using RIP ammo.
- type: Tweak
message: Grids with godmode no longer godmode turrets.
- type: Tweak
message: Turrets are now repairable via welder.
- type: Fix
message: Turrets no longer shoot mice.
id: 2092
time: '2026-03-27T21:57:35.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3582
- author: Redrover1760
changes:
- type: Fix
message: >-
Emergancy software update pushed. All turrets are no longer speciest and
kill goblins, harpies, felinids, and dwarves on sight.
id: 2093
time: '2026-03-28T06:41:55.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3585
- author: Redrover1760
changes:
- type: Fix
message: >-
Diagonal Walls/Windows no longer prevent destruction of kudzu/chimera
biomass.
id: 2094
time: '2026-03-28T16:17:49.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3588
- author: NazrinNya
changes:
- type: Tweak
message: Death rattle is properly working on grids and planets now
- type: Tweak
message: >-
IPC received system update: Their chassis now becomes more vulnerable to
all damage sources instead of losing hands on discharge.
- type: Tweak
message: Kobolds and Monkeys are now capable of piloting shuttles.
- type: Tweak
message: Capacitors required for thruster construction/upgrade 4 -> 1.
- type: Tweak
message: Ore/construction box/bag dumping speed is significantly faster now.
- type: Tweak
message: Security techfab now includes Mercenary techfab dynamic recipes.
- type: Fix
message: You actually get the mech pulse rifle in the TSFMC uplink now
- type: Tweak
message: Salt is now capable of being reprocessed into iron ore.
id: 2095
time: '2026-03-28T16:21:43.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3587
- author: Redrover1760
changes:
- type: Tweak
message: Thruster capacitor upgrades made more impactful.
id: 2096
time: '2026-03-28T16:42:39.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3589
- author: Vinny-Shick
changes:
- type: Tweak
message: Slightly Buffed the Vanyk
id: 2097
time: '2026-03-28T16:45:49.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3574
- author: NazrinNya
changes:
- type: Remove
message: Sabre has been removed from the game.
- type: Tweak
message: S2 mechs now use heavy mech armor
- type: Tweak
message: >-
S2 mechs received health buffs (1500 -> 1750 for broadsword, 1100 ->
2150 for halberd)
- type: Tweak
message: Halberd is uncapable of using light mounts now.
- type: Tweak
message: >-
LAC-29 now uses 35mm caliber - 45 piercing damage and 225 structural
damage. LAC-29 firerate 5 -> 2.5.
- type: Tweak
message: >-
RAC-6 now receives huge accuracy penalty if fired for long amount of
time. (>1.5s)
- type: Tweak
message: >-
SRM-8 now fires in burst - 3 rockets per second, 6 rockets in total.
Consumes 600 energy.
- type: Tweak
message: BRM-6 now consumes 250 energy instead of 100.
id: 2098
time: '2026-03-28T18:16:36.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3459
- author: EckoAurum
changes:
- type: Add
message: Added TSF and PDV Medical and Engineering Cyborg Variants.
- type: Add
message: Engineer cyborgs now have an inbuilt diagnostic hud.
id: 2099
time: '2026-03-28T18:43:12.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3444
- author: Ilya246
changes:
- type: Tweak
message: Portstrike is now announced.
- type: Tweak
message: Apocalypse now lasts 3 hours and has 1 hour portstrike.
- type: Tweak
message: Apocalypse chimera and ADS spawnrates doubled.
id: 2100
time: '2026-03-28T19:04:33.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3590
- author: Redrover1760
changes:
- type: Fix
message: 'Fixed portstrike being declared roundstart. '
id: 2101
time: '2026-03-29T02:40:06.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3595
- author: Redrover1760
changes:
- type: Tweak
message: Signaller range buffed to 90 meters.
- type: Tweak
message: Advanceds Signaller range buffed to 600 meters.
id: 2102
time: '2026-03-29T05:46:06.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3594
- author: AntoineXYZ
changes:
- type: Add
message: Per-character custom keyword chat highlighting
id: 2103
time: '2026-03-29T06:30:38.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3571
- author: EckoAurum
changes:
- type: Fix
message: Drone turrets shoot you now.
id: 2104
time: '2026-03-29T15:15:43.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3614
- author: Ilya246
changes:
- type: Add
message: The xenopsychology research now lets you make the carp hardsuit.
id: 2105
time: '2026-03-29T15:48:53.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3599
- author: Scarlet Lightweaver
changes:
- type: Tweak
message: Made the bulwarks gauntlets wideswing.
id: 2106
time: '2026-03-29T15:49:12.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3598
- author: Redrover1760
changes:
- type: Add
message: Adds tools VSC configuration.
id: 2107
time: '2026-03-29T16:19:46.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3618
- author: UnicornOnLSD
changes:
- type: Tweak
message: windowed shutters now properly fit with the normal kind
id: 2108
time: '2026-03-29T18:15:23.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3564
- author: Isratosh
changes:
- type: Tweak
message: >-
All faction thruster variants now require 1 capacitor from 3, in line
with the standard model
id: 2109
time: '2026-03-30T09:23:22.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3638
- author: tonotom1
changes:
- type: Tweak
message: 'Liberated all handheld instruments: you can play them hands-free'
id: 2110
time: '2026-03-30T13:56:46.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3639
- author: UnicornOnLSD
changes:
- type: Tweak
message: >-
the DIS Rig has seen a full rework. Report any issues to me on the
discord (@UnicornOnLSD)
id: 2111
time: '2026-03-30T16:15:38.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3514
- author: lopsidedmanboobs
changes:
- type: Tweak
message: Conflict rules 1 & 2 changed and clarifications added
id: 2112
time: '2026-03-30T16:56:00.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3643
- author: Ilya246
changes:
- type: Add
message: Added fun!
- type: Remove
message: Removed fun!
- type: Tweak
message: Changed fun!
- type: Fix
message: Fixed ship speed being limited.
- type: Fix
message: Fixed drive and park modes.
- type: Fix
message: Fixed autopilot.
- type: Fix
message: Fixed gun recoil.
- type: Fix
message: Cryptominers have been fixed to be AI datacenters (not for war trust).
id: 2104
time: '2026-03-29T14:17:46.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3610
- author: mikusssssss
changes:
- type: Add
message: 65 drive
id: 2105
time: '2026-03-29T14:45:36.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3612
- author: doktor-gonz0
changes:
- type: Tweak
message: Borers now originate from the mythical place called "Detroit".
id: 2106
time: '2026-03-29T15:47:30.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3616
- author: mikusssssss
changes:
- type: Add
message: New ways of producing power
id: 2107
time: '2026-03-29T16:52:59.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3621
- author: NazrinNya
changes:
- type: Tweak
message: improved mech and weapon larp.
- type: Tweak
message: improved inventory management.
- type: Add
message: added wyvern to shipyard
id: 2108
time: '2026-03-29T16:53:40.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3620
- author: Ilya246
changes:
- type: Add
message: Added fun!
- type: Fix
message: Fixed POIs not moving.
id: 2109
time: '2026-03-29T17:15:36.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3624
- author: mikusssssss
changes:
- type: Add
message: The ownership of all ATM's has been transferred to the Bank Of America
id: 2110
time: '2026-03-29T17:56:06.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3625
- author: mikusssssss
changes:
- type: Fix
message: Names of radio channels
id: 2111
time: '2026-03-29T18:08:28.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3623
- author: Redrover1760
changes:
- type: Remove
message: Removed Bomb Collars. Collars are gross, man, eww.
- type: Add
message: >-
Added Nuke Collars. A sudden surge in the supply of nuclear material has
redefined the nuclear warfare meta.
id: 2112
time: '2026-03-29T18:09:11.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3619
- author: mikusssssss
changes:
- type: Add
message: >-
Evil Hidden TSF Ninja Warrior Strategy Of Immediate Explosion has been
brought back
id: 2113
time: '2026-03-29T18:10:01.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3622
- author: Redrover1760
changes:
- type: Add
message: >-
Spikey spinners have been detected upon the Monolith Sector. Please
avoid contact with hostile spikey balls.
id: 2114
time: '2026-03-29T18:37:55.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3627
- author: mikusssssss
changes:
- type: Add
message: Added larpcomm
- type: Remove
message: Removed useless commie channel
id: 2115
time: '2026-03-30T04:38:28.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3626
- author: burrrkeye
changes:
- type: Fix
message: >-
A very crucial bug about Thanatos Mass-Driver was fixed! They now work
properly as intended.
- type: Fix
message: >-
A very crucial bug about Charon ships was fixed! They now have the
proper guns!
id: 2116
time: '2026-03-30T15:42:56.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3611
- author: mikusssssss
changes:
- type: Add
message: Added Caroline
- type: Add
message: Added new energy low sound effect
- type: Remove
message: Removed the round start IPC medium battery
- type: Tweak
message: Changed some values regarding unlocking and locking IPC's
id: 2117
time: '2026-03-30T15:45:19.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3640
- author: mikusssssss
changes:
- type: Tweak
message: the drillsite drills are now 65
id: 2118
time: '2026-03-30T16:22:01.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3615
- author: mikusssssss
changes:
- type: Add
message: >-
Ownership of most vending machines has been transferred to Yara Kameroni
Industries (65) :tm:
id: 2119
time: '2026-03-30T16:41:45.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3641
- author: tonotom1
changes:
- type: Tweak
message: Barozine's formulation was made way stronger!
- type: Tweak
message: >-
We did not dump Barozine reformulation byproduct anywhere. Do not
attempt to investigate.
id: 2120
time: '2026-03-30T17:07:39.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3642
- author: mikusssssss
changes:
- type: Add
message: Added 65 company
id: 2121
time: '2026-03-30T17:33:10.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3645
- author: Ilya246
changes:
- type: Tweak
message: >-
Slightly increased middle ring asteroid spawnrate to encourage
prospecting.
- type: Add
message: The Wall
id: 2122
time: '2026-03-30T18:15:50.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3648
- author: mikusssssss
changes:
- type: Tweak
message: 🥚
id: 2123
time: '2026-03-30T19:41:36.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3650
- author: mikusssssss
changes:
- type: Remove
message: Removed useless rules
- type: Tweak
message: Changed most rules
id: 2124
time: '2026-03-31T13:18:02.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3659
- author: Redrover1760
changes:
- type: Remove
message: '[april1st] decreases dronespam'
id: 2125
time: '2026-03-31T18:30:20.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3664
- author: Redrover1760
changes:
- type: Tweak
message: Hehe
id: 2126
time: '2026-03-31T23:33:38.0000000+00:00'
url: https://github.com/Monolith-Station/Monolith/pull/3668
@@ -1,13 +1,13 @@
advertisement-barista-1 = Freshly brewed, just for you!
advertisement-barista-2 = The galaxys finest teas and more!
advertisement-barista-3 = Start your shift with a perfect cup.
advertisement-barista-4 = Have a proppa' cuppa
advertisement-barista-5 = Try our new tea powders—now in stock!
advertisement-barista-6 = Cups, leaves, and everything you need for a break.
advertisement-barista-7 = Take a moment, sip some comfort.
advertisement-barista-8 = Barista: Your daily ritual, delivered.
thankyou-barista-1 = Enjoy your brew!
thankyou-barista-2 = May your day be steeped in flavor!
thankyou-barista-3 = Savor the moment, one cup at a time.
thankyou-barista-4 = Thank you for choosing Barista!
# died of cringe
advertisement-barista-1 = Freshly 65'd, just for you!
advertisement-barista-2 = The galaxys finest 65 and more!
advertisement-barista-3 = Start your 65 with a perfect 65.
advertisement-barista-4 = Have a proppa' 65
advertisement-barista-5 = Try our new 65 powders—now in stock!
advertisement-barista-6 = 65, 65, and everything you need for a break.
advertisement-barista-7 = Take a moment, sip some 65.
advertisement-barista-8 = Barista: Your daily 65, delivered.
thankyou-barista-1 = Enjoy your 65!
thankyou-barista-2 = May your day be steeped in 65!
thankyou-barista-3 = Savor the moment, one 65 at a time.
thankyou-barista-4 = Thank you for choosing 65!
# 65
@@ -0,0 +1,32 @@
# Examples for job highlights "-dummy" is the job key.
# highlights-dummy = "PDV", "Jupiter", Chimera, "CC", Camelot
# highlights-spacer =
# highlights-pilot =
# highlights-mercenary =
highlights-overseer = "Overseer", "CC", "Colossus"
highlights-station-traffic-controller = "STC", "Traffic", "CC", "Colossus"
highlights-judge = "Judge", "CC", "Colossus", "Contraband"
#highlights-service-worker = "Service", "Worker", "CC", "Colossus"
highlights-janitor = "Jani", "Janitor", "CC", "Colossus"
highlights-mail-carrier = "Mail man", "Mail carrier", "Mail"
highlights-cyborg = "borg", "cyborg", "robot", "CC"
highlights-pdv-grand-vizier = "Grand", "Vizier", "GD", Jupiter, Helios, PDV
highlights-pdv-asvaran = Asvaran, Jupiter, Helios, PDV
highlights-pdv-denasvar = Denasvar, Jupiter, Helios, PDV
highlights-pdv-spasaka = Spasaka, Jupiter, Helios, PDV
highlights-pdv-rahkshan = Rahkshan, Jupiter, Helios, PDV
highlights-pdv-cyborg = "borg", "cyborg", "robot"," Jupiter, Helios, PDV
highlights-director-of-care = "DoC", "Director", "Rescue", "MD"
highlights-emergency-responder = "EMT", "Emergency", "Responder", "Medic", "Doc", "Doctor", "Rescue", "MD"
highlights-tsfmc-colonel = Colonel, Halcyon, TSF, TSFMC
highlights-tsfmc-captain = Captain, "Cap", Halcyon, TSF, TSFMC
highlights-tsfmc-fireteam-leader = "FTL", "Leader", "SL", Halcyon, TSF, TSFMC
highlights-tsfmc-corpsman = Corpsman, Medical, Surgery, "Medic", "Doc", Halcyon, TSF, TSFMC
highlights-tsfmc-marine = Marine, Halcyon, TSF, TSFMC
highlights-tsfmc-engineer = Engineer, "Engi", Halcyon, TSF, TSFMC
highlights-tsfmc-cyborg = "borg", "cyborg", "robot", Halcyon, TSF, TSFMC
@@ -15,6 +15,8 @@ midnight-arms-co-description = Midnight Arms Company took advantage of a recentl
ussp-description = Once one of the dominant forces in the Colossus sector, the United Soviet Socialist Planets are a coalition of hard workers. Abused by their High Command and left in the Colossus sector, remnants of this once-great faction must now fight for survival, either for themselves, their legacy, or their people. NOTE: using this company does NOT make your character applicable to faction engagement rules - you must still follow ROE depending on your role.
65company-description = 65 65 65 65 65 65 ALWAYS ANTAG ROLL I NEED TO FRAG OUT 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65
# Major companies
dark-matter-enterprises-description = From the ashes of the Last Corporate War emerged Dark Matter Enterprises (DME), a beacon of pragmatic ambition in a galaxy still reeling from the war-torn interstellar landscape created by corporate greed and ideological differences. While the TSF and USSP grappled for galactic dominance, a collective of visionary corporate contractors saw a power vacuum left by the absence of the old powers that used to be. These individuals forged DME with a singular purpose: to transcend the old ways by controlling and enhancing the flow of knowledge and resources. Positioning themselves as indispensable to all, yet beholden to none. Their centralized structure is a direct response to the chaotic fragmentation of their predecessors, ensuring agile decision-making and a unified strategic vision.
@@ -54,4 +56,5 @@ viper-group-description = Formerly a Syndicate privateering company operating un
cerberus-surplus-provisions = The Cerberus, CSP, or provisionaries, are a black market company reigning from the Phaethon Dynasty's capital station Helios. From their "underground" headquarters the CSP conduct various operations within the criminal underworld to benefit the PD (Phaethon Dynasty) through means of trading any illegal substances, weaponry or general equipment that they can barter or find. The company maintains their utmost self-respect, keeping a strong and hospitable public image for potential buyers and business partners. The CSP will deal with anyone who is willing to take on a deal with the snake.
redsail-corsairs-description = The RedSail Corsairs, or RSC, are a dangerous and influential group of pirates and brigands, who are publicly known to engage in illegal and violent activities against civilians, officials, and military personnel alike. Their source of income and specialization is hijacking, cargo theft, hostage-taking, and armed robbery. They are openly marked by Colossus Central as a criminal organization. As a whole, the Corsairs function as a union between freebooting raiders of all walks of life who have sworn loyalty to each other.
redsail-corsairs-description = frag
@@ -0,0 +1,2 @@
gamerule-portstrike-announce-announcement = Total War has been declared by TSFMC and PDV High Command. Strikes on major military bases have been authorized. Civilians are advised to avoid them.
gamerule-portstrike-announce-sender = Colossus Diplomatic High Command
@@ -16,5 +16,5 @@ mono-ads-description = Native PD imperials threaten TSF colonial expansion into
mono-chimera-title = Biothreat (TSF|PDV)
mono-chimera-description = Native PDV imperials threaten TSF colonial expansion into the sector. The effects of a far away letoferol outbreak seep in.
mono-allatonce-title = Apocalypse (ALL)
mono-allatonce-description = A battleground between PD, and TSF forces alike, with ancient ADS systems and Chimera bioweapons seeping in.
mono-allatonce-title = Apocalypse (ALL, 3hr)
mono-allatonce-description = A battleground between PDV, and TSF forces alike, with ancient ADS systems and Chimera bioweapons seeping in.
@@ -10,4 +10,16 @@ reagent-effect-guidebook-health-scale =
{ $chance ->
[1] Multiplies existing { $changes }
*[other] Has a { $chance }% chance to multiply existing { $changes }
}
}
reagent-effect-guidebook-claws-growth =
{ $chance ->
[1] Grows
*[other] grow
} claws at { $amount }x the speed while metabolizing
reagent-effect-guidebook-claws-growth-suppression =
{ $chance ->
[1] Supresses
*[other] supress
} claws growth.

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