nix: gaming packages

This commit is contained in:
js0ny 2026-01-26 18:23:44 +00:00
parent 18bdb02ca1
commit d0b6200eae
3 changed files with 166 additions and 33 deletions

View file

@ -4,45 +4,54 @@
pkgs,
...
}: let
# Helper to handle the logic check string
# 如果 force 为 trueBash 变量 FORCE 为 "true",否则为 "false"
# In Nix, (toString true) yields "1"
mkForceVar = force:
if force
then "true"
else "false";
mkMergedYaml = {
name, # This value should be unique for each merged YAML config
target, # The target YAML file path relative to $HOME
settings, # The Nix Settings to convert to YAML and merge
name,
target,
settings,
force ? false,
}: let
yamlContent = lib.generators.toYAML {} settings;
# This file will hold the Nix-managed YAML content
# symlink to /nix/store/***.nix-managed for clarity
patchFile = "${target}.nix-managed";
in {
# Write the Nix-managed YAML content for merging and preservation
home.file."${patchFile}".text = yamlContent;
home.activation."merge-${name}" = lib.hm.dag.entryAfter ["writeBoundary"] ''
TARGET="$HOME/${target}"
PATCH="$HOME/${patchFile}"
FORCE="${mkForceVar force}"
if [ -f "$PATCH" ]; then
verboseEcho "Merging Nix managed YAML config into: $TARGET"
if [ -f "$TARGET" ] || [ "$FORCE" = "true" ]; then
if [ -f "$PATCH" ]; then
verboseEcho "Merging Nix managed YAML config into: $TARGET"
run mkdir -p "$(dirname "$TARGET")"
# 只有在确定要操作时,才创建目录和空文件
run mkdir -p "$(dirname "$TARGET")"
if [ ! -f "$TARGET" ]; then
echo "{}" > "$TARGET"
if [ ! -f "$TARGET" ]; then
echo "{}" > "$TARGET"
fi
run ${pkgs.yq-go}/bin/yq -i -oy -P ". *= load(\"$PATCH\")" "$TARGET"
fi
# Arguments:
# * -i: In-place edit
# * -oy: Output YAML
# * -P: Pretty Print (indentation, etc.)
run ${pkgs.yq-go}/bin/yq -i -oy -P ". *= load(\"$PATCH\")" "$TARGET"
else
verboseEcho "Skipping merge for $TARGET: file missing and force=false"
fi
'';
};
mkMergedJson = {
name,
target,
settings,
force ? false,
}: let
jsonContent = builtins.toJSON settings;
patchFile = "${target}.nix-managed";
@ -52,24 +61,31 @@
home.activation."merge-${name}" = lib.hm.dag.entryAfter ["writeBoundary"] ''
TARGET="$HOME/${target}"
PATCH="$HOME/${patchFile}"
FORCE="${mkForceVar force}"
if [ -f "$PATCH" ]; then
verboseEcho "Merging Nix managed JSON config into: $TARGET"
if [ -f "$TARGET" ] || [ "$FORCE" = "true" ]; then
if [ -f "$PATCH" ]; then
verboseEcho "Merging Nix managed JSON config into: $TARGET"
run mkdir -p "$(dirname "$TARGET")"
run mkdir -p "$(dirname "$TARGET")"
if [ ! -f "$TARGET" ]; then
echo "{}" > "$TARGET"
if [ ! -f "$TARGET" ]; then
echo "{}" > "$TARGET"
fi
run ${pkgs.yq-go}/bin/yq -i -o json -P --indent 2 ". *= load(\"$PATCH\")" "$TARGET"
fi
run ${pkgs.yq-go}/bin/yq -i -o json -P --indent 2 ". *= load(\"$PATCH\")" "$TARGET"
else
verboseEcho "Skipping merge for $TARGET: file missing and force=false"
fi
'';
};
mkMergedIni = {
name,
target,
settings,
force ? false,
}: let
iniContent = lib.generators.toINI {} settings;
patchFile = "${target}.nix-managed";
@ -79,16 +95,22 @@
home.activation."merge-${name}" = lib.hm.dag.entryAfter ["writeBoundary"] ''
TARGET="$HOME/${target}"
PATCH="$HOME/${patchFile}"
if [ -f "$PATCH" ]; then
verboseEcho "Merging Nix managed INI config into: $TARGET"
FORCE="${mkForceVar force}"
run mkdir -p "$(dirname "$TARGET")"
if [ -f "$TARGET" ] || [ "$FORCE" = "true" ]; then
if [ -f "$PATCH" ]; then
verboseEcho "Merging Nix managed INI config into: $TARGET"
if [ ! -f "$TARGET" ]; then
echo "" > "$TARGET"
run mkdir -p "$(dirname "$TARGET")"
if [ ! -f "$TARGET" ]; then
echo "" > "$TARGET"
fi
run ${pkgs.crudini}/bin/crudini --merge "$TARGET" < "$PATCH"
fi
run ${pkgs.crudini}/bin/crudini --merge "$TARGET" < "$PATCH"
else
verboseEcho "Skipping merge for $TARGET: file missing and force=false"
fi
'';
};

View file

@ -1,4 +1,99 @@
{pkgs, ...}: {
{
pkgs,
config,
lib,
...
}: let
mergetools = import ../lib/mergetools.nix {inherit pkgs lib config;};
mkMergedJson = mergetools.mkMergedJson;
mkMergedIni = mergetools.mkMergedIni;
pdxrel = ".local/share/Paradox Interactive";
# pdxbase = "${config.home.homeDirectory}/${pdxrel}";
euvbase = "${config.home.homeDirectory}/.local/share/Steam/steamapps/compatdata/3450310/pfx/drive_c/users/steamuser/Documents/Paradox Interactive/Europa Universalis V";
paradoxLauncherUserSettings = mkMergedJson {
name = "paradox-launcher-usersettings";
target = "${pdxrel}/launcher-v2/userSettings.json";
settings = {
"optionalTelemetryDisabled" = true;
"language" = "zh-hans";
};
};
pdxSdkSettingsEU5 = mkMergedJson {
name = "pdxSdkaccountJsonEU5";
target = "${euvbase}/PDX/SDK/eu5/account.json";
settings = {
telemetryEnabled = false;
};
};
# 经典 $HOME 下拉屎
pdxSdkSettingsV3 = mkMergedJson {
name = "pdxSdkaccountJsonV3";
target = "PDX/SDK/victoria3/account.json";
settings = {
telemetryEnabled = false;
};
};
pdxSdkTelemetryEU5 = mkMergedJson {
name = "pdxSdktelemetryConsentEU5";
target = "${euvbase}/PDX/SDK/eu5/telemetry_consent.json";
settings = {
telemetry_consent_choice = "denied";
};
};
pdxSdkTelemetryV3 = mkMergedJson {
name = "pdxSdktelemetryConsentV3";
target = "PDX/SDK/victoria3/telemetry_consent.json";
settings = {
telemetry_consent_choice = "denied";
};
};
victoria3Settings = mkMergedJson {
name = "victoria3-settings";
target = "${pdxrel}/Victoria 3/pdx_settings.json";
settings = {
Account = {
telemetry_consent = false;
};
game = {
save_on_exit = true;
};
Theme = {
daynight_cycle = false;
};
};
};
prismLauncherCfg = mkMergedIni {
name = "prism-launcher-config";
target = ".local/share/PrismLauncher/prismlauncher.cfg";
settings = {
General = {
Language = "zh";
ApplicationTheme = "Adwaita-Dark";
ShowConsoleOnError = true;
PermGen = 128;
MinMemAlloc = 512;
MaxMemAlloc = 4096;
ShowGlobalGameTime = true;
RecordGameTime = true;
ShowGameTime = true;
ShowGameTimeWithoutDays = true;
};
};
};
ryujinxConfig = mkMergedJson {
name = "ryujinx-config";
target = ".config/Ryujinx/Config.json";
settings = {
game_dir = [
"${config.home.homeDirectory}/Games/ROM/Nintendo - Nintendo Switch"
];
"language_code" = "zh_CN";
"check_updates_on_start" = false;
};
};
in {
home.packages = with pkgs; [
steam
# Steam Adwaita Theme
@ -13,11 +108,26 @@
cemu
# Game launcher and library manager
lutris
# Steam Achievement Manager
samira
# Memory Scanner (Cheat Engine Alt.)
scanmem
];
imports = [
../programs/retroarch.nix
paradoxLauncherUserSettings
victoria3Settings
pdxSdkSettingsEU5
pdxSdkSettingsV3
pdxSdkTelemetryEU5
pdxSdkTelemetryV3
prismLauncherCfg
ryujinxConfig
];
xdg.dataFile = {
"Paradox Interactive/launcherpath".text = ''
${config.home.homeDirectory}/.local/share/paradoxlauncher
'';
};
}

View file

@ -13,6 +13,7 @@
''{"wm_class":"dev.benz.walker","scratch_layer":true}''
''{"wm_class":"org.pulseaudio.pavucontrol","scratch_layer":true}''
''{"wm_class":"mpv","scratch_layer":true}''
''{"wm_class":"org.gnome.NautilusPreviewer","scratch_layer":true}''
''{"wm_class":"terminal-popup","scratch_layer":true}''
''{"wm_class":"fsearch","scratch_layer":true}''
''{"wm_class":"QQ","title":"","scratch_layer":true}''