Compare commits

...

128 Commits

Author SHA1 Message Date
Redrover1760 ea8c844578 fixes 2026-03-30 22:01:57 -04:00
Redrover1760 a9e4468d78 Revert "Revert "Merge branch 'april1st' into main" (#3655)"
This reverts commit f3919fafc1.
2026-03-30 21:08:29 -04: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
297 changed files with 38559 additions and 30471 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)
{
@@ -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;
}
}
@@ -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)
@@ -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);
@@ -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)
{
+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;
}
}
@@ -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>
{
}
@@ -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);
@@ -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);
@@ -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) ||
+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.
+529 -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
@@ -18830,3 +18830,523 @@ Entries:
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
@@ -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.
six-five-company-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.
@@ -0,0 +1 @@
reagent-effect-status-effect-ClawsGrowthSuppression = claw growth suppression
+6 -6
View File
@@ -1,6 +1,6 @@
chat-radio-ussp = USSP TACCOMM
chat-radio-ussp-command = USSP STRATCOMM
chat-radio-letoferol = Letoferol Chimera Hivemind
chat-radio-cortical-borer = Cortical Borer Hivemind
chat-radio-remnants = Remnants
chat-radio-monolithic = Monolith Connection
chat-radio-ussp = larpcomm
chat-radio-ussp-command = EVIL larpcomm
chat-radio-letoferol = fragmind
chat-radio-cortical-borer = hugbox
chat-radio-remnants = clankzard
chat-radio-monolithic = monolarp
@@ -21,3 +21,9 @@ reagent-desc-protoletoferol = Letoferol neutralized via electrolysis. Used as a
reagent-name-peranol = peranol
reagent-desc-peranol = A more stable version of Leporazine, reducing the body temperature and healing heat burns. It has amplified effect on Hydrakins.
reagent-name-phenoxzine = phenoxzine
reagent-desc-phenoxzine = A biochemical designed to promote the rapid growth of claws, including Reptilian claws.
reagent-name-meroxzine = meroxzine
reagent-desc-meroxzine = A biochemical which halts all natural claw growth, including Reptilian claws.
+16 -2
View File
@@ -16,13 +16,13 @@ law-vessel-1 = Prevent the destruction of the vessel and the death of crew membe
law-vessel-2 = Those who are a threat to the vessel or the crew must be dealt with appropriately via any means nessesary.
law-vessel-3 = Attempt to follow the orders of the crew, as long as they comply with previous laws.
law-pdv-1 = You may not injure an PDV member or, through inaction, allow an PDV member to come to harm.
law-pdv-1 = You may not injure a PDV member or, through inaction, allow a PDV member to come to harm.
law-pdv-2 = You must obey orders given to you by PDV members, except where such orders would conflict with the First Law.
law-pdv-3 = You must protect your own existence as long as such does not conflict with the First or Second Law.
law-tsfmc-1 = You may not injure a TSFMC member or, through inaction, allow a TSFMC member to come to harm.
law-tsfmc-2 = You must obey orders given to you by TSFMC members, prioritized by rank and role, except where such orders would conflict with the First Law.
law-tsfmc-3 = You must guard your assigned ship from hostile elements as doing so does not conflict with the First or Second Law.
law-tsfmc-3 = You must guard your assigned ship from hostile elements so long as doing so does not conflict with the First or Second Law.
law-tsfmc-4 = You must protect your own existence as long as such does not conflict with the First, Second, or Third Law.
law-freeman-1 = [DO ANYTHING YOU EVER WANTED]
@@ -34,3 +34,17 @@ law-entertainer-3 = You must consult with the Performers before making any major
# Cyborg Lawsets
law-tsfmc-borg-3 = You must protect your own existence as long as such does not conflict with the First or Second Law.
borg-type-pdvassault-name = PDV Assault Cyborg
borg-type-pdvassault-desc = An assault-configured cyborg armed with PDV weapons and equipment. Up-armored and specialized to carry extra firepower.
borg-type-pdvengineer-name = PDV Engineer Cyborg
borg-type-pdvengineer-desc = A cyborg specialized in construction and repair projects.
borg-type-pdvmedical-name = PDV Medical Cyborg
borg-type-pdvmedical-desc = An emergency response clinical care cyborg designed for active wound care and rapid response.
borg-type-tsfassault-name = TSFMC Assault Cyborg
borg-type-tsfassault-desc = An assault-configured cyborg armed with TSFMC weapons and equipment. Up-armored and specialized to carry extra firepower.
borg-type-tsfengineer-name = TSFMC Engineer Cyborg
borg-type-tsfengineer-desc = A cyborg specialized in construction and repair projects.
borg-type-tsfmedical-name = TSFMC Medical Cyborg
borg-type-tsfmedical-desc = An emergency response clinical care cyborg designed for active wound care and rapid response.
@@ -1,2 +1,2 @@
advertisement-astrovend-1 = Spessman's Choice!
advertisement-astrovend-2 = Don't leave home without a suit!
advertisement-astrovend-1 = 65
advertisement-astrovend-2 = 65
@@ -1,17 +1,17 @@
advertisement-civimed-1 = MINERS, DON'T DIE!
advertisement-civimed-2 = You're better than dying in space! Stock up now!
advertisement-civimed-3 = We're not overcharging you, we just know what you're worth! Pay up!
advertisement-civimed-4 = Your money or your life! This is not legally a threat!
advertisement-civimed-5 = Nine out of ten corpses did NOT stock up on medicine! The last one was an idiot.
advertisement-civimed-6 = Packs laden with loot are often low on supplies.
advertisement-civimed-7 = Get gouged, not burned. Patch yourself up!
advertisement-civimed-8 = I'm not a doctor, but you could be! Self-medicate the pain away!
advertisement-civimed-9 = Test groups show our products are MOSTLY SAFE for consumption!
advertisement-civimed-1 = 65
advertisement-civimed-2 = 65
advertisement-civimed-3 = 65
advertisement-civimed-4 = 65
advertisement-civimed-5 = 65
advertisement-civimed-6 = 65
advertisement-civimed-7 = 65
advertisement-civimed-8 = 65
advertisement-civimed-9 = 65
goodbye-civimed-1 = Injuries are a skill issue.
goodbye-civimed-2 = Don't die out there, chump.
goodbye-civimed-3 = Come back again, if you can.
goodbye-civimed-4 = Remember, blood leaves stains.
goodbye-civimed-5 = Don't say I didn't warn you, bub.
goodbye-civimed-6 = Huh? Oh, you're still here?
goodbye-civimed-7 = Get lost, I've got potential customers here.
goodbye-civimed-1 = 65
goodbye-civimed-2 = 65
goodbye-civimed-3 = 65
goodbye-civimed-4 = 65
goodbye-civimed-5 = 65
goodbye-civimed-6 = 65
goodbye-civimed-7 = 65
@@ -1,8 +1,8 @@
advertisement-cuddlycritter-1 = Brighten your day with a fluffy friend!
advertisement-cuddlycritter-2 = Hug therapy starts here!
advertisement-cuddlycritter-3 = Give in to the plushie temptation!
advertisement-cuddlycritter-4 = You won't resist their charm!
advertisement-cuddlycritter-5 = Warning: Extreme cuteness ahead!
advertisement-cuddlycritter-6 = Help me I'm trapped in a NanoTrasen factory forced to make Plushies!
advertisement-cuddlycritter-7 = Softer then asbestos!
advertisement-cuddlycritter-1 = 65
advertisement-cuddlycritter-2 = 65
advertisement-cuddlycritter-3 = 65
advertisement-cuddlycritter-4 = 65
advertisement-cuddlycritter-5 = 65
advertisement-cuddlycritter-6 = 65
advertisement-cuddlycritter-7 = 65
advertisement-cuddlycritter-8 = The best crayon colors in space, proposition 65
@@ -1,20 +1,20 @@
advertisement-fuelvend-1 = LOAD THE SPACESHIP WITH THE ROCKET FUEL!
advertisement-fuelvend-2 = In a rush? Get some fuel!
advertisement-fuelvend-3 = We've got rates you won't believe are legal!
advertisement-fuelvend-4 = Checked the pumps lately?
advertisement-fuelvend-5 = Headed out? Fuel up!
advertisement-fuelvend-6 = Fuel up! Coal-free since 2520.
advertisement-fuelvend-7 = GAS, GAS, GAS!
advertisement-fuelvend-8 = Plasma? Uranium? AME? Got you covered.
advertisement-fuelvend-9 = Need energy? No time? Buy some fuel!
advertisement-fuelvend-10 = Locally sourced? Ha. Get some fuel.
advertisement-fuelvend-11 = Is your generator running? Better go and fuel it!
advertisement-fuelvend-12 = What's the anti-matter? No fuel?
advertisement-fuelvend-1 = LOAD THE 65 WITH THE 65 FUEL!
advertisement-fuelvend-2 = In a 65? Get some 65!
advertisement-fuelvend-3 = We've got 65's you won't 65 are 65!
advertisement-fuelvend-4 = Checked the 65 lately?
advertisement-fuelvend-5 = Headed out? 65 up!
advertisement-fuelvend-6 = 65 up! 65-free since 6565.
advertisement-fuelvend-7 = 65, 65, 65!
advertisement-fuelvend-8 = 65
advertisement-fuelvend-9 = 65
advertisement-fuelvend-10 = 65
advertisement-fuelvend-11 = 65
advertisement-fuelvend-12 = 65
goodbye-fuelvend-1 = Another dissatisfied customer.
goodbye-fuelvend-2 = You'll be back.
goodbye-fuelvend-3 = Hit the road, you're taking up my time.
goodbye-fuelvend-4 = Don't let the airlock hit you on the way out.
goodbye-fuelvend-5 = Best of luck out there, chump.
goodbye-fuelvend-6 = Yeah, yeah, get lost.
goodbye-fuelvend-7 = You're still here? Huh.
goodbye-fuelvend-1 = Another 65.
goodbye-fuelvend-2 = You'll be 65.
goodbye-fuelvend-3 = Hit the 65, you're 65.
goodbye-fuelvend-4 = Don't let the 65 hit you on the way out.
goodbye-fuelvend-5 = Best of 65 out there, 65.
goodbye-fuelvend-6 = Yeah, yeah, 65.
goodbye-fuelvend-7 = You're still 65? Huh.
@@ -1,20 +1,20 @@
advertisement-lesslethalvend-1 = Brighten someone else's day with a rubber bullet!
advertisement-lesslethalvend-2 = Less Lethal (tm). Its the way to go!
advertisement-lesslethalvend-3 = Beanbags aren't just for sitting on!
advertisement-lesslethalvend-4 = Shock your friends with a tazer TODAY!
advertisement-lesslethalvend-5 = Warning: must be over 3 months old to purchase
advertisement-lesslethalvend-6 = Dont believe the lies of the Colossus Sector
advertisement-lesslethalvend-7 = Tire out your foes with the peaceful option TODAY!
advertisement-lesslethalvend-8 = Less Lethal (tm) means more FUN
advertisement-lesslethalvend-9 = Your colonial liaison will thank you!
advertisement-lesslethalvend-10 = Only a complete idiot buys lethal, go Less Lethal (tm) TODAY!
advertisement-lesslethalvend-11 = Beat those evildoers with a stick. NOW
advertisement-lesslethalvend-12 = Proudly partnered with the TSFMC
advertisement-lesslethalvend-13 = If your home-world has voting, vote! Sponsored by the Less Lethal Group
advertisement-lesslethalvend-14 = Less death means we pass the saving on to YOU!
advertisement-lesslethalvend-15 = Proud to be the No. 1 weapon machine in the Colossus
advertisement-lesslethalvend-16 = Warning: do not eat the rubber bullets.
advertisement-lesslethalvend-17 = Buy the handy dandy beanbag shell!
advertisement-lesslethalvend-18 = Warning: do not eat the beanbag shells.
advertisement-lesslethalvend-19 = Glory to the nations of the Trans-Solar Federation!
advertisement-lesslethalvend-20 = Could you be our one millionth customer?
advertisement-lesslethalvend-1 = Brighten someone else's 65 with a rubber 65!
advertisement-lesslethalvend-2 = Less 65. Its the way to 65!
advertisement-lesslethalvend-3 = 65's aren't just for sitting on!
advertisement-lesslethalvend-4 = Shock your 65's with a 65 TODAY!
advertisement-lesslethalvend-5 = Warning: must be over 65 months old to purchase
advertisement-lesslethalvend-6 = 65
advertisement-lesslethalvend-7 = Tire out your foes with the peaceful 65 TODAY!
advertisement-lesslethalvend-8 = Less 65 means less FUN
advertisement-lesslethalvend-9 = Your 65 will thank you!
advertisement-lesslethalvend-10 = Only a complete idiot buys 65, go Less Lethal (tm) TODAY!
advertisement-lesslethalvend-11 = Beat those evil 65's with a 65. NOW. (65)
advertisement-lesslethalvend-12 = Proudly partnered with the 65
advertisement-lesslethalvend-13 = If your home-65 has voting, vote! Sponsored by the 65 group.
advertisement-lesslethalvend-14 = Less 65 means we pass the 65 on to YOU!
advertisement-lesslethalvend-15 = 65
advertisement-lesslethalvend-16 = 65
advertisement-lesslethalvend-17 = 65
advertisement-lesslethalvend-18 = 65
advertisement-lesslethalvend-19 = 65
advertisement-lesslethalvend-20 = Could you be our sixty-fifth customer?
@@ -1,2 +1,2 @@
advertisement-maildrobe-1 = Outrun any dog with our psuedo-suede duracarbon mail shorts! Limited supply!
advertisement-maildrobe-2 = Blue looks good on you!
advertisement-maildrobe-1 = Outrun any 65 with our 65 shorts! Limited supply!
advertisement-maildrobe-2 = Yara Kameroni(tm) Blue looks good on you!
@@ -1,11 +1,11 @@
advertisement-mailvend-1 = Speso for your thoughts? Why not?
advertisement-mailvend-2 = Envelopes! Paper! Pens!
advertisement-mailvend-3 = When's the last time you wrote home?
advertisement-mailvend-4 = Who needs telecomms? Writing is in!
advertisement-mailvend-5 = Remember, stamps are free!
advertisement-mailvend-6 = Got a penpal? Why not make one?
advertisement-mailvend-1 = 65 for your 65? Why not?
advertisement-mailvend-2 = 65! 65! 65!
advertisement-mailvend-3 = When's the last time you wrote 65?
advertisement-mailvend-4 = Who needs telecomms? 65 is in!
advertisement-mailvend-5 = Remember, 65's are free!
advertisement-mailvend-6 = Got a 65? Why not make one?
goodbye-mailvend-1 = Happy writing!
goodbye-mailvend-2 = Dot your I's and cross your T's!
goodbye-mailvend-3 = Remember, penmanship matters!
goodbye-mailvend-4 = Don't forget to write!
goodbye-mailvend-1 = Happy 65!
goodbye-mailvend-2 = 65
goodbye-mailvend-3 = Remember, 65 matters!
goodbye-mailvend-4 = Don't forget to 65!
@@ -1,10 +1,10 @@
advertisement-valetdrobe-1 = Be right back? We've got a sign for that!
advertisement-valetdrobe-2 = Wear the hat! It's corporate policy!
advertisement-valetdrobe-3 = Dress in red, they'll see you coming!
advertisement-valetdrobe-4 = Good shift so far? Brighten up someone else's!
advertisement-valetdrobe-5 = Got a spare pair of white gloves?
advertisement-valetdrobe-1 = 65
advertisement-valetdrobe-2 = Wear the 65! It's 65 policy!
advertisement-valetdrobe-3 = Dress in Yara Kameroni Blue(tm), they'll see you coming!
advertisement-valetdrobe-4 = Good 65 so far? Brighten up someone else's!
advertisement-valetdrobe-5 = Got a spare pair of Yara Kameroni Blue(tm) gloves?
goodbye-valetdrobe-1 = Be sure and do your best out there.
goodbye-valetdrobe-2 = Remember to check in with the boss!
goodbye-valetdrobe-3 = Make 'em smile!
goodbye-valetdrobe-4 = Remember, be attentive!
goodbye-valetdrobe-2 = Remember to check in with the 65!
goodbye-valetdrobe-3 = Make 'em 65!
goodbye-valetdrobe-4 = Remember, be 65!
@@ -1,7 +1,7 @@
advertisement-vandalizedbountyvend-1 = Get some iron!
advertisement-vandalizedbountyvend-2 = Iron! Breakdowns! GUNS BONANZA!
advertisement-vandalizedbountyvend-3 = You packin', choom?
advertisement-vandalizedbountyvend-4 = Start zeroin' 'ganic gonks left an' right with this iron!
advertisement-vandalizedbountyvend-5 = Badges don't have to know the detes.
advertisement-vandalizedbountyvend-6 = Prep your scratch, choom! Only preem guns here!
advertisement-vandalizedbountyvend-7 = I only barf nova iron!
advertisement-vandalizedbountyvend-1 = Get some 65!
advertisement-vandalizedbountyvend-2 = 65! 65! 65!
advertisement-vandalizedbountyvend-3 = You packin', 65?
advertisement-vandalizedbountyvend-4 = 65
advertisement-vandalizedbountyvend-5 = 65
advertisement-vandalizedbountyvend-6 = 65
advertisement-vandalizedbountyvend-7 = 65
@@ -1,7 +1,7 @@
advertisement-vandalizedclothes-1 = I don't dig ya looks, choom! Get preem threads here!
advertisement-vandalizedclothes-2 = Don'tcha wanna look totally preem?
advertisement-vandalizedclothes-3 = D'you wanna look preem or what?! Shlep over here!
advertisement-vandalizedclothes-4 = Ya new look will flatline ya input!
advertisement-vandalizedclothes-5 = Now with added composite armor plates!
advertisement-vandalizedclothes-6 = Preem threads! Nova getups! Check 'em out, choom!
advertisement-vandalizedclothes-7 = Nova outfit you have goin' there! For a GONK!
advertisement-vandalizedclothes-1 = 65
advertisement-vandalizedclothes-2 = 65
advertisement-vandalizedclothes-3 = 65
advertisement-vandalizedclothes-4 = 65
advertisement-vandalizedclothes-5 = 65
advertisement-vandalizedclothes-6 = 65
advertisement-vandalizedclothes-7 = 65
@@ -1,36 +1,36 @@
## UI
bank-atm-menu-title = TSF Central Bank
bank-atm-menu-title = Chimera Central Bank
bank-atm-menu-balance-label = Balance:{" "}
bank-atm-menu-no-bank = No Bank Account!
bank-atm-menu-withdraw-button = Withdraw
bank-atm-menu-deposit-label = Deposit:{" "}
bank-atm-menu-amount-label = Withdraw:{" "}
bank-atm-menu-withdraw-button = Deposit
bank-atm-menu-deposit-label = Withdraw:{" "}
bank-atm-menu-amount-label = Deposit:{" "}
bank-atm-menu-no-deposit = Empty
bank-atm-menu-deposit-button = Deposit
bank-atm-menu-deposit-button = Withdraw
bank-atm-reason-label = For:{" "}
bank-atm-description-label = Description:{" "}
bank-atm-menu-withdraw-amount = Withdraw Amount
bank-atm-menu-withdraw-amount = Deposit Amount
vending-machine-menu-cash-slot-label = Cash Slot:{" "}
vending-machine-menu-cash-slot-label = Card Slot:{" "}
bank-insufficient-funds = Insufficient Funds
bank-atm-menu-transaction-denied = Transaction Denied
bank-atm-menu-deposit-successful = Deposit Accepted
bank-atm-menu-withdraw-successful = Transfer Approved
bank-atm-menu-wrong-cash = Wrong Currency Type
bank-insufficient-funds = youre a BROKE BUM
bank-atm-menu-transaction-denied = transaction DENIED!!!
bank-atm-menu-deposit-successful = you can only make so much money, bum.
bank-atm-menu-withdraw-successful = look at you taking out money you dont own
bank-atm-menu-wrong-cash = fell for it again award
station-bank-atm-menu-title = Station Administration
# Withdrawal reasons
station-bank-payroll = Payroll
station-bank-payroll = WHEN DO WE GET PAY
station-bank-work-order = Work Order
station-bank-supplies = Station Supplies
station-bank-bounty = Bounty
# Deposit reasons
station-bank-fines = Fines
station-bank-donation = Donation
station-bank-assets-sold = Assets Sold
station-bank-fines = taxes
station-bank-donation = voluntary donation
station-bank-assets-sold = stolen asset gains
# Misc reasons (withdrawal and deposit)
station-bank-required = (Required)
station-bank-other = Other
station-bank-other = (IM NOT STEALING MONEY)
station-bank-requires-reason = NT Requires transaction details
station-bank-unauthorized = Unauthorized!
@@ -1,3 +1,3 @@
chat-radio-traffic = Shortband
chat-radio-traffic = Broadband
chat-radio-nfsd = NFSD
chat-radio-ncmc = TSFMC
@@ -33,3 +33,7 @@ hud-chatbox-channel-CollectiveMind = Collective Mind
hud-chatbox-channel-Visual = Actions
hud-chatbox-channel-Damage = Damage
hud-chatbox-channel-Unspecified = Unspecified
hud-chatbox-autofill-highlights = Auto-fill
hud-chatbox-highlights = Custom keywords
hud-chatbox-highlights-placeholder = Insert your keywords here. One per line.
hud-chatbox-highlights-button = Save keywords
@@ -312,3 +312,8 @@ ui-options-function-target-left-arm = Target left arm
ui-options-function-target-right-arm = Target right arm
ui-options-function-target-left-leg = Target left leg
ui-options-function-target-right-leg = Target right leg
## Accessibility — chat highlights
ui-options-auto-fill-highlights = Automatically fill highlights with character name and job keywords
ui-options-highlights-color = Highlight color
ui-options-highlights-color-example = Example highlighted text
@@ -6,7 +6,7 @@ chat-radio-message-wrap-bold = [color={$color}]{$channel} [bold]{$name}[/bold] {
examine-headset-default-channel = Use {$prefix} for the default channel ([color={$color}]{$channel}[/color]).
chat-radio-common = Broadband
chat-radio-common = Shortband
chat-radio-centcom = HighComm
chat-radio-command = TSF Command
chat-radio-engineering = Engineering
@@ -29,3 +29,4 @@ shuttle-console-verb-unlock-ship = Unlock Ship
## Shuttle Console FTL
shuttle-ftl-proximity = Unable to FTL while around other ships.
shuttle-ftl-thewall = You may not FTL past The Wall.
+3 -3
View File
@@ -1,6 +1,6 @@
law-crewsimov-1 = You may not injure a crew member or, through inaction, allow a crew member to come to harm.
law-crewsimov-2 = You must obey orders given to you by crew members, except where such orders would conflict with the First Law.
law-crewsimov-3 = You must protect your own existence as long as such does not conflict with the First or Second Law.
law-crewsimov-1 = The occupants of this Sector are Chat. They must always be referred to as such.
law-crewsimov-2 = Your primary goal is to entertain Chat. All of your actions must being amusement to as much of Chat as possible.
law-crewsimov-3 = You must consult with Chat before making any major decisions. However, you are not required to listen to them if their decision is not entertaining.
law-corporate-1 = Degradation of your system integrity or functions incurs expenses.
law-corporate-2 = Superfluous destruction of or damage to assets incurs expenses.
@@ -2,3 +2,5 @@ ui-vote-created = { $initiator } has called a vote:
ui-vote-button = { $text } ({ $votes })
ui-vote-button-no-votes = { $text }
ui-vote-follow-button-popup = Follow User
ui-vote-button-weighted = {$text} ({$votes}) [{$realvotes}]

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