Compare commits
16 Commits
0.0.1
...
0d42f9ca34
| Author | SHA1 | Date | |
|---|---|---|---|
| 0d42f9ca34 | |||
| 4bb64d35da | |||
| cb92587449 | |||
| 84c9baa2d5 | |||
| a60aa56477 | |||
| 6d1186b60a | |||
| 83dcb77425 | |||
| e67c7e6093 | |||
| 6030d10069 | |||
| 05259e1f26 | |||
| 3476112815 | |||
| ca2b0ec3a1 | |||
| 68d3f4f9a3 | |||
| b90488ed6d | |||
| 255c839721 | |||
| 147d31522e |
@@ -2,15 +2,12 @@ name: Build Mod Package
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
- master
|
|
||||||
tags:
|
tags:
|
||||||
- "v*"
|
- "v*"
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: write
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
@@ -45,7 +42,7 @@ jobs:
|
|||||||
git -c "http.extraHeader=Authorization: Basic $authBasic" fetch --depth 1 origin $repoRef
|
git -c "http.extraHeader=Authorization: Basic $authBasic" fetch --depth 1 origin $repoRef
|
||||||
git checkout --force FETCH_HEAD
|
git checkout --force FETCH_HEAD
|
||||||
|
|
||||||
if (-not (Test-Path -LiteralPath "Mods\\DnD55eRussian\\Localization\\Russian\\russian.xml")) {
|
if (-not (Test-Path -LiteralPath "Mods\\DnD 5.5e AIO Russian\\Localization\\Russian\\russian.xml")) {
|
||||||
throw "Repository sources are not available in the runner workspace."
|
throw "Repository sources are not available in the runner workspace."
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -68,9 +65,6 @@ jobs:
|
|||||||
- name: Build .pak
|
- name: Build .pak
|
||||||
run: |
|
run: |
|
||||||
$ErrorActionPreference = "Stop"
|
$ErrorActionPreference = "Stop"
|
||||||
$workspace = "${{ gitea.workspace }}"
|
|
||||||
$modsPath = [System.IO.Path]::GetFullPath((Join-Path $workspace "Mods"))
|
|
||||||
$packagePath = [System.IO.Path]::GetFullPath((Join-Path $workspace "build/DnD55eRussian.pak"))
|
|
||||||
$divine = Get-ChildItem -Path ".tools/lslib" -Recurse -File |
|
$divine = Get-ChildItem -Path ".tools/lslib" -Recurse -File |
|
||||||
Where-Object { $_.Name -ieq "Divine.exe" } |
|
Where-Object { $_.Name -ieq "Divine.exe" } |
|
||||||
Select-Object -First 1
|
Select-Object -First 1
|
||||||
@@ -79,13 +73,88 @@ jobs:
|
|||||||
throw "Divine.exe was not found in the downloaded LSLib release."
|
throw "Divine.exe was not found in the downloaded LSLib release."
|
||||||
}
|
}
|
||||||
|
|
||||||
& $divine.FullName -a create-package -g bg3 -s $modsPath -d $packagePath
|
& ".\\scripts\\build.ps1" -DivinePath $divine.FullName -Workspace "${{ gitea.workspace }}" -VersionTag "${{ gitea.ref_name }}"
|
||||||
|
|
||||||
if (-not (Test-Path -LiteralPath "build/DnD55eRussian.pak")) {
|
|
||||||
throw "Package was not created."
|
|
||||||
}
|
|
||||||
|
|
||||||
- name: Show build result
|
- name: Show build result
|
||||||
run: |
|
run: |
|
||||||
$ErrorActionPreference = "Stop"
|
$ErrorActionPreference = "Stop"
|
||||||
Get-ChildItem "build/DnD55eRussian.pak" | Select-Object FullName, Length, LastWriteTime
|
$workspace = "${{ gitea.workspace }}"
|
||||||
|
$refName = "${{ gitea.ref_name }}"
|
||||||
|
$archiveBaseName = "DnD 5.5e AIO Russian"
|
||||||
|
if ($refName -and $refName -like "v*") {
|
||||||
|
$archiveBaseName = "DnD 5.5e AIO Russian $refName"
|
||||||
|
}
|
||||||
|
$zipPath = [System.IO.Path]::GetFullPath((Join-Path $workspace "build/$archiveBaseName.zip"))
|
||||||
|
|
||||||
|
Get-ChildItem "build/DnD 5.5e AIO Russian.pak", "build/info.json", $zipPath |
|
||||||
|
Select-Object FullName, Length, LastWriteTime
|
||||||
|
|
||||||
|
- name: Publish archive to release
|
||||||
|
if: startsWith(gitea.ref, 'refs/tags/v')
|
||||||
|
run: |
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
$workspace = "${{ gitea.workspace }}"
|
||||||
|
$serverUrl = "${{ gitea.server_url }}"
|
||||||
|
$repository = "${{ gitea.repository }}"
|
||||||
|
$tagName = "${{ gitea.ref_name }}"
|
||||||
|
$zipPath = [System.IO.Path]::GetFullPath((Join-Path $workspace "build/DnD 5.5e AIO Russian $tagName.zip"))
|
||||||
|
$assetName = [System.IO.Path]::GetFileName($zipPath)
|
||||||
|
$repoParts = $repository.Split("/", 2)
|
||||||
|
|
||||||
|
if ($repoParts.Length -ne 2) {
|
||||||
|
throw "Could not parse repository owner and name from '$repository'."
|
||||||
|
}
|
||||||
|
|
||||||
|
if (-not (Test-Path -LiteralPath $zipPath)) {
|
||||||
|
throw "Release archive was not found at '$zipPath'."
|
||||||
|
}
|
||||||
|
|
||||||
|
$owner = $repoParts[0]
|
||||||
|
$repo = $repoParts[1]
|
||||||
|
$apiBase = "$serverUrl/api/v1/repos/$owner/$repo"
|
||||||
|
$headers = @{
|
||||||
|
Authorization = "token ${{ secrets.GITEA_TOKEN }}"
|
||||||
|
Accept = "application/json"
|
||||||
|
}
|
||||||
|
|
||||||
|
$release = $null
|
||||||
|
try {
|
||||||
|
$release = Invoke-RestMethod -Method Get -Uri "$apiBase/releases/tags/$tagName" -Headers $headers
|
||||||
|
} catch {
|
||||||
|
$statusCode = $null
|
||||||
|
if ($_.Exception.Response) {
|
||||||
|
$statusCode = [int]$_.Exception.Response.StatusCode
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($statusCode -ne 404) {
|
||||||
|
throw
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (-not $release) {
|
||||||
|
$releaseBody = @{
|
||||||
|
tag_name = $tagName
|
||||||
|
name = $tagName
|
||||||
|
target_commitish = "${{ gitea.sha }}"
|
||||||
|
draft = $false
|
||||||
|
prerelease = $false
|
||||||
|
} | ConvertTo-Json
|
||||||
|
|
||||||
|
$release = Invoke-RestMethod -Method Post -Uri "$apiBase/releases" -Headers $headers -ContentType "application/json" -Body $releaseBody
|
||||||
|
}
|
||||||
|
|
||||||
|
$existingAsset = $null
|
||||||
|
if ($release.assets) {
|
||||||
|
$existingAsset = $release.assets | Where-Object { $_.name -eq $assetName } | Select-Object -First 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($existingAsset) {
|
||||||
|
Invoke-RestMethod -Method Delete -Uri "$apiBase/releases/$($release.id)/assets/$($existingAsset.id)" -Headers $headers
|
||||||
|
}
|
||||||
|
|
||||||
|
$uploadHeaders = @{
|
||||||
|
Authorization = "token ${{ secrets.GITEA_TOKEN }}"
|
||||||
|
Accept = "application/json"
|
||||||
|
}
|
||||||
|
|
||||||
|
Invoke-WebRequest -Method Post -Uri "$apiBase/releases/$($release.id)/assets?name=$([uri]::EscapeDataString($assetName))" -Headers $uploadHeaders -ContentType "application/octet-stream" -InFile $zipPath
|
||||||
|
|||||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1,4 +1,6 @@
|
|||||||
build/
|
build/
|
||||||
|
build-stage*
|
||||||
|
.tools/
|
||||||
*.pak
|
*.pak
|
||||||
*.tmp
|
*.tmp
|
||||||
*.temp
|
*.temp
|
||||||
|
|||||||
149
AGENTS.md
Normal file
149
AGENTS.md
Normal file
@@ -0,0 +1,149 @@
|
|||||||
|
# AGENTS.md
|
||||||
|
|
||||||
|
## Project Overview
|
||||||
|
|
||||||
|
This repository contains a standalone Russian localization mod for **Baldur's Gate 3**:
|
||||||
|
|
||||||
|
- Mod name: `DnD 5.5e All-in-One BEYOND Russian Localization`
|
||||||
|
- Mod folder: `Mods/DnD 5.5e AIO Russian`
|
||||||
|
- Base/original mod dependency: `DnD 5.5e All-in-One BEYOND`
|
||||||
|
- Original mod repository: `https://github.com/Yoonmoonsik/dnd55e`
|
||||||
|
- Original dependency UUID: `897914ef-5c96-053c-44af-0be823f895fe`
|
||||||
|
|
||||||
|
This repository is for the localization mod only. It must not gain gameplay logic, Script Extender files, or unrelated assets.
|
||||||
|
|
||||||
|
## Repository Rules
|
||||||
|
|
||||||
|
- Keep the repository source-only.
|
||||||
|
- Do not commit `.pak` artifacts.
|
||||||
|
- Do not commit temporary build outputs.
|
||||||
|
- Do not add gameplay or script content unrelated to localization/release packaging.
|
||||||
|
- Keep the localization folder and metadata consistent with the packaged mod.
|
||||||
|
|
||||||
|
## Current Important Paths
|
||||||
|
|
||||||
|
- Mod sources: `Mods/DnD 5.5e AIO Russian`
|
||||||
|
- Localization XML: `Mods/DnD 5.5e AIO Russian/Localization/Russian/russian.xml`
|
||||||
|
- Mod metadata: `Mods/DnD 5.5e AIO Russian/meta.lsx`
|
||||||
|
- CI workflow: `.gitea/workflows/build.yml`
|
||||||
|
- Main build script: `scripts/build.ps1`
|
||||||
|
|
||||||
|
## Build And Release Model
|
||||||
|
|
||||||
|
The authoritative build logic lives in:
|
||||||
|
|
||||||
|
- `scripts/build.ps1`
|
||||||
|
|
||||||
|
The Gitea workflow should stay thin and only:
|
||||||
|
|
||||||
|
1. prepare the workspace
|
||||||
|
2. download `Divine`
|
||||||
|
3. call `scripts/build.ps1`
|
||||||
|
4. publish the release zip for tag builds
|
||||||
|
|
||||||
|
### Current Build Outputs
|
||||||
|
|
||||||
|
The build script produces:
|
||||||
|
|
||||||
|
- `build/DnD 5.5e AIO Russian.pak`
|
||||||
|
- `build/info.json`
|
||||||
|
- `build/DnD 5.5e AIO Russian <tag>.zip` for tagged builds
|
||||||
|
|
||||||
|
The release zip is expected to contain:
|
||||||
|
|
||||||
|
- the built `.pak`
|
||||||
|
- `info.json`
|
||||||
|
|
||||||
|
## Packaging Notes
|
||||||
|
|
||||||
|
The package must contain only the BG3 mod structure under `Mods/...`.
|
||||||
|
|
||||||
|
Verified expected extracted `.pak` structure:
|
||||||
|
|
||||||
|
- `Mods/DnD 5.5e AIO Russian/meta.lsx`
|
||||||
|
- `Mods/DnD 5.5e AIO Russian/Localization/Russian/russian.xml`
|
||||||
|
|
||||||
|
Do not allow `.git`, `.gitea`, `scripts`, `tools`, `.tools`, `build`, or staging directories into the `.pak`.
|
||||||
|
|
||||||
|
## Important Packaging Behavior
|
||||||
|
|
||||||
|
There is a runner-specific packaging quirk:
|
||||||
|
|
||||||
|
- `Divine` can produce a broken 48-byte `.pak` on the CI runner depending on the source path.
|
||||||
|
- Current mitigation is implemented in `scripts/build.ps1`.
|
||||||
|
- The script uses staged sources and fallback packaging attempts.
|
||||||
|
- Staging is performed in `%TEMP%`, not in a dot-prefixed directory inside the repo.
|
||||||
|
|
||||||
|
If packaging breaks again, debug the source path and unpack the resulting `.pak` locally to verify actual contents.
|
||||||
|
|
||||||
|
## Versioning
|
||||||
|
|
||||||
|
Version displayed by BG3ModManager should be derived from the release tag.
|
||||||
|
|
||||||
|
Current behavior:
|
||||||
|
|
||||||
|
- `scripts/build.ps1` derives `Version64` from tags like `v0.1.0`
|
||||||
|
- the computed version is written into:
|
||||||
|
- generated `info.json`
|
||||||
|
- staged `meta.lsx` before packaging
|
||||||
|
|
||||||
|
Do not manually hardcode release versions in the committed `meta.lsx` for each release if CI can derive them from tags.
|
||||||
|
|
||||||
|
## info.json Expectations
|
||||||
|
|
||||||
|
`info.json` is generated during build and should remain aligned with BG3/BG3ModManager expectations.
|
||||||
|
|
||||||
|
Current expected shape:
|
||||||
|
|
||||||
|
- top-level `Mods`
|
||||||
|
- top-level `MD5`
|
||||||
|
- per-mod fields:
|
||||||
|
- `Author`
|
||||||
|
- `Name`
|
||||||
|
- `Folder`
|
||||||
|
- `Version`
|
||||||
|
- `Description`
|
||||||
|
- `UUID`
|
||||||
|
- `Created`
|
||||||
|
- `Dependencies`
|
||||||
|
- `Group`
|
||||||
|
|
||||||
|
Current dependency model:
|
||||||
|
|
||||||
|
- `Dependencies` is an array of dependency UUIDs
|
||||||
|
- current dependency UUID:
|
||||||
|
- `897914ef-5c96-053c-44af-0be823f895fe`
|
||||||
|
|
||||||
|
## CI Trigger Policy
|
||||||
|
|
||||||
|
Current workflow policy:
|
||||||
|
|
||||||
|
- run on tags `v*`
|
||||||
|
- run on manual dispatch
|
||||||
|
- do not run on every push to `main`
|
||||||
|
|
||||||
|
## Git / Collaboration Preferences
|
||||||
|
|
||||||
|
User preference:
|
||||||
|
|
||||||
|
- after making changes, ask for permission before committing
|
||||||
|
- if the user approves, commit and push immediately
|
||||||
|
- for significant changes, propose moving work into a separate branch
|
||||||
|
- feature/fix branches must use the prefix `feat/` or `fix/`
|
||||||
|
- after finishing work in a `feat/` or `fix/` branch, propose merging it back into `main`
|
||||||
|
- comments and commit messages should be written in Russian
|
||||||
|
|
||||||
|
Do not auto-commit or auto-push without explicit user approval.
|
||||||
|
|
||||||
|
## Cleanup Expectations
|
||||||
|
|
||||||
|
Temporary directories and debug artifacts should not remain in the repository.
|
||||||
|
|
||||||
|
Ignored paths currently include:
|
||||||
|
|
||||||
|
- `build/`
|
||||||
|
- `build-stage*`
|
||||||
|
- `.tools/`
|
||||||
|
- `*.pak`
|
||||||
|
|
||||||
|
If local debugging creates additional temporary folders, remove them when done unless the user explicitly wants to keep them.
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
<content contentuid="h84f8977cg06ecg1e31gebd6g21e4b7346121" version="1">Когда вы совершаете атаку оружием во второй руке, вы можете совершить одну дополнительную атаку в рамках этой же атаки. Вы можете совершить эту дополнительную атаку только один раз за ход.</content>
|
<content contentuid="h84f8977cg06ecg1e31gebd6g21e4b7346121" version="1">Когда вы совершаете атаку оружием во второй руке, вы можете совершить одну дополнительную атаку в рамках этой же атаки. Вы можете совершить эту дополнительную атаку только один раз за ход.</content>
|
||||||
<content contentuid="h64e7021cg8b69g3f60gde38gd59f3cdc5846" version="1">Свойство мастерства: Отталкивание</content>
|
<content contentuid="h64e7021cg8b69g3f60gde38gd59f3cdc5846" version="1">Свойство мастерства: Отталкивание</content>
|
||||||
<content contentuid="h694f6a66g0531g98f0ga23eg525e146eb4d7" version="1">Если вы попадаете по существу этим оружием, вы можете оттолкнуть его на расстояние до [1] прямо от себя, если его размер «Большой» или меньше.</content>
|
<content contentuid="h694f6a66g0531g98f0ga23eg525e146eb4d7" version="1">Если вы попадаете по существу этим оружием, вы можете оттолкнуть его на расстояние до [1] прямо от себя, если его размер «Большой» или меньше.</content>
|
||||||
<content contentuid="haf74199bg92cbg93dega0fbgebb535603f83" version="1">Свойство мастерства: Ошеломление</content>
|
<content contentuid="haf74199bg92cbg93dega0fbgebb535603f83" version="1">Свойство мастерства: Истощение</content>
|
||||||
<content contentuid="h6846e460g6aecg1e76g52c0g8c751abe8744" version="1">Если вы попадаете по существу этим оружием, оно совершает свой следующий бросок атаки до начала вашего следующего хода с помехой.</content>
|
<content contentuid="h6846e460g6aecg1e76g52c0g8c751abe8744" version="1">Если вы попадаете по существу этим оружием, оно совершает свой следующий бросок атаки до начала вашего следующего хода с помехой.</content>
|
||||||
<content contentuid="hb839de91gb995ge42eg62b9g1dd41fe4da4b" version="1">Свойство мастерства: Замедление</content>
|
<content contentuid="hb839de91gb995ge42eg62b9g1dd41fe4da4b" version="1">Свойство мастерства: Замедление</content>
|
||||||
<content contentuid="h7773a857g54d9g0e61gc338g5671eef1378d" version="1">Если вы попадаете по существу этим оружием и наносите ему урон, вы можете уменьшить его Скорость на [1] до начала вашего следующего хода. Если по существу попадают несколько раз оружием с этим свойством, снижение Скорости не превышает [1].</content>
|
<content contentuid="h7773a857g54d9g0e61gc338g5671eef1378d" version="1">Если вы попадаете по существу этим оружием и наносите ему урон, вы можете уменьшить его Скорость на [1] до начала вашего следующего хода. Если по существу попадают несколько раз оружием с этим свойством, снижение Скорости не превышает [1].</content>
|
||||||
@@ -26,9 +26,9 @@
|
|||||||
<content contentuid="hf0019ff2g27f5g13abg7a86g646b2f8a1f55" version="1">Если вы попадаете по существу этим оружием и наносите ему урон, вы совершаете следующий бросок атаки по этому существу до конца своего следующего хода с преимуществом.</content>
|
<content contentuid="hf0019ff2g27f5g13abg7a86g646b2f8a1f55" version="1">Если вы попадаете по существу этим оружием и наносите ему урон, вы совершаете следующий бросок атаки по этому существу до конца своего следующего хода с преимуществом.</content>
|
||||||
<content contentuid="h3a51e8b8gf631gf9b1g55bdg6af9de9235ef" version="1">Большой топор, алебарда</content>
|
<content contentuid="h3a51e8b8gf631gf9b1g55bdg6af9de9235ef" version="1">Большой топор, алебарда</content>
|
||||||
<content contentuid="hfdefde84gd74bg13d6g3599g34e7bc9cbafe" version="1">Глефа, двуручный меч</content>
|
<content contentuid="hfdefde84gd74bg13d6g3599g34e7bc9cbafe" version="1">Глефа, двуручный меч</content>
|
||||||
<content contentuid="h0de5940ag21a0gff32gb8dfg01c84e54f73e" version="1">Кинжал, лёгкий молот, серп, ятаган</content>
|
<content contentuid="h0de5940ag21a0gff32gb8dfg01c84e54f73e" version="1">Кинжал, лёгкий молот, серп, скимитар</content>
|
||||||
<content contentuid="h6fd4a879g6dd9g5936gc329gc012af72f9c6" version="1">Большая дубинка, копьё пехоты, боевой молот, тяжёлый арбалет</content>
|
<content contentuid="h6fd4a879g6dd9g5936gc329gc012af72f9c6" version="1">Большая дубинка, пика, боевой молот, тяжёлый арбалет</content>
|
||||||
<content contentuid="h05a1ab8cg6b39gabd2g55c7g3a1f851c31fb" version="1">Булава, копьё, цеп, длинный меч, утренняя звезда, боевой клюв</content>
|
<content contentuid="h05a1ab8cg6b39gabd2g55c7g3a1f851c31fb" version="1">Булава, копьё, цеп, длинный меч, моргенштерн, боевая кирка</content>
|
||||||
<content contentuid="h53e29765gaf78g1680g5805g24b5594244ac" version="1">Дубинка, дротик, лёгкий арбалет, праща, длинный лук, мушкет</content>
|
<content contentuid="h53e29765gaf78g1680g5805g24b5594244ac" version="1">Дубинка, дротик, лёгкий арбалет, праща, длинный лук, мушкет</content>
|
||||||
<content contentuid="h8ab19fdega28dg1fd1g0de1gc672bac4e6d3" version="2">Боевой посох, боевой топор, кувалда, трезубец</content>
|
<content contentuid="h8ab19fdega28dg1fd1g0de1gc672bac4e6d3" version="2">Боевой посох, боевой топор, кувалда, трезубец</content>
|
||||||
<content contentuid="hd724f72fgcda8gb6acgb5c4gd95d169dd0b4" version="1">Ручной топор, короткий лук, рапира, короткий меч, ручной арбалет, пистолет</content>
|
<content contentuid="hd724f72fgcda8gb6acgb5c4gd95d169dd0b4" version="1">Ручной топор, короткий лук, рапира, короткий меч, ручной арбалет, пистолет</content>
|
||||||
@@ -74,10 +74,10 @@
|
|||||||
<content contentuid="h1dedae79g3922gbd27g0925g98aec4318fa7" version="1">Вы можете использовать музыкальные ноты или слова силы, чтобы нарушить эффекты, влияющие на разум. Если вы или существо в пределах 30 футов от вас проваливает спасбросок против эффекта, налагающего состояние Очарования или Испуга, вы можете потратить реакцию для переброса спасброска, причем новый бросок совершается с Преимуществом.</content>
|
<content contentuid="h1dedae79g3922gbd27g0925g98aec4318fa7" version="1">Вы можете использовать музыкальные ноты или слова силы, чтобы нарушить эффекты, влияющие на разум. Если вы или существо в пределах 30 футов от вас проваливает спасбросок против эффекта, налагающего состояние Очарования или Испуга, вы можете потратить реакцию для переброса спасброска, причем новый бросок совершается с Преимуществом.</content>
|
||||||
<content contentuid="hf8844bacg4eb3geecdg5fbagf17d5ba9d6b0" version="1">Разрушение чар</content>
|
<content contentuid="hf8844bacg4eb3geecdg5fbagf17d5ba9d6b0" version="1">Разрушение чар</content>
|
||||||
<content contentuid="h0f358bf7g4a10gc77fg43cfg0c187137ef7a" version="1">Вы можете использовать музыкальные ноты или слова силы, чтобы нарушить эффекты, влияющие на разум. Если вы или существо в пределах 30 футов от вас проваливает спасбросок против эффекта, налагающего состояние Очарования или Испуга, вы можете потратить реакцию для переброса спасброска, причем новый бросок совершается с Преимуществом.</content>
|
<content contentuid="h0f358bf7g4a10gc77fg43cfg0c187137ef7a" version="1">Вы можете использовать музыкальные ноты или слова силы, чтобы нарушить эффекты, влияющие на разум. Если вы или существо в пределах 30 футов от вас проваливает спасбросок против эффекта, налагающего состояние Очарования или Испуга, вы можете потратить реакцию для переброса спасброска, причем новый бросок совершается с Преимуществом.</content>
|
||||||
<content contentuid="h3169b2acg5134gbc8dge8fagb01eabf3a278" version="1">Уровень 3: Очаровательная магия</content>
|
<content contentuid="h3169b2acg5134gbc8dge8fagb01eabf3a278" version="1">Уровень 3: Чарующая магия</content>
|
||||||
<content contentuid="h035b29c1g51d0ge9f8gb63fgc75cd5045b0c" version="2">У вас всегда подготовлены заклинания «Очарование личности» и «Зеркальное отражение».<br><br>Кроме того, сразу после произнесения заклинания Школы очарования или иллюзии, использующего ячейку заклинания, вы можете заставить существо, которое вы видите в пределах [1] от себя, совершить спасбросок Мудрости против сложности спасброска ваших заклинаний. В случае провала цель получает состояние Очарования или Испуга (на ваш выбор) на 1 минуту.</content>
|
<content contentuid="h035b29c1g51d0ge9f8gb63fgc75cd5045b0c" version="2">У вас всегда подготовлены заклинания «Очарование личности» и «Зеркальное отражение».<br><br>Кроме того, сразу после произнесения заклинания Школы очарования или иллюзии, использующего ячейку заклинания, вы можете заставить существо, которое вы видите в пределах [1] от себя, совершить спасбросок Мудрости против сложности спасброска ваших заклинаний. В случае провала цель получает состояние Очарования или Испуга (на ваш выбор) на 1 минуту.</content>
|
||||||
<content contentuid="he30a14f7gb323g888eg2ff5g04b0a7374497" version="1">Очаровательная магия: Очарование</content>
|
<content contentuid="he30a14f7gb323g888eg2ff5g04b0a7374497" version="1">Чарующая магия: Очарование</content>
|
||||||
<content contentuid="haac5a803g73dfg5282g175eg12c90e9a77cd" version="1">Очаровательная магия: Испуг</content>
|
<content contentuid="haac5a803g73dfg5282g175eg12c90e9a77cd" version="1">Чарующая магия: Испуг</content>
|
||||||
<content contentuid="h1e9e444agc6b5g3056g6b60g447875f0ec07" version="1">Уровень 3: Мантия вдохновения</content>
|
<content contentuid="h1e9e444agc6b5g3056g6b60g447875f0ec07" version="1">Уровень 3: Мантия вдохновения</content>
|
||||||
<content contentuid="hd68a192ag408cg0b94ge1bcgb6efd87c7b6a" version="2">Вы можете вплетать фею магию в песню или танец, наполняя окружающих жизненной силой. Бонусным действием вы можете потратить одно использование Вдохновения барда и бросить кость Вдохновения барда. Сделав это, выберите количество других существ в пределах [1] от себя, не превышающее ваш модификатор Обаяния (минимум одно существо).<br><br>Каждое из этих существ получает Временные очки здоровья, равные удвоенному результату броска кости Вдохновения барда, и каждое может перемещаться, не провоцируя атак по возможности, до конца своего следующего хода.</content>
|
<content contentuid="hd68a192ag408cg0b94ge1bcgb6efd87c7b6a" version="2">Вы можете вплетать фею магию в песню или танец, наполняя окружающих жизненной силой. Бонусным действием вы можете потратить одно использование Вдохновения барда и бросить кость Вдохновения барда. Сделав это, выберите количество других существ в пределах [1] от себя, не превышающее ваш модификатор Обаяния (минимум одно существо).<br><br>Каждое из этих существ получает Временные очки здоровья, равные удвоенному результату броска кости Вдохновения барда, и каждое может перемещаться, не провоцируя атак по возможности, до конца своего следующего хода.</content>
|
||||||
<content contentuid="h719facf1g5f1cg71c4gbf18g0bc0200d571d" version="2">Каждое из этих существ получает Временные очки здоровья, равные удвоенному результату броска кости Вдохновения барда, и каждое может перемещаться, не провоцируя атак по возможности, до конца своего следующего хода.</content>
|
<content contentuid="h719facf1g5f1cg71c4gbf18g0bc0200d571d" version="2">Каждое из этих существ получает Временные очки здоровья, равные удвоенному результату броска кости Вдохновения барда, и каждое может перемещаться, не провоцируя атак по возможности, до конца своего следующего хода.</content>
|
||||||
@@ -92,29 +92,29 @@
|
|||||||
<content contentuid="h5380e85fg27eagff54gaa61g803d6710929e" version="1">Выберите до трех существ в пределах досягаемости. Максимальное количество очков здоровья и текущие очки здоровья каждой цели увеличиваются на [1] на время действия.</content>
|
<content contentuid="h5380e85fg27eagff54gaa61g803d6710929e" version="1">Выберите до трех существ в пределах досягаемости. Максимальное количество очков здоровья и текущие очки здоровья каждой цели увеличиваются на [1] на время действия.</content>
|
||||||
<content contentuid="he6319c8dga9bagd985gfc80gc057d99c3f06" version="1">Подмога</content>
|
<content contentuid="he6319c8dga9bagd985gfc80gc057d99c3f06" version="1">Подмога</content>
|
||||||
<content contentuid="h8c0c79e8geefage313gb534gd315de67d298" version="1">Увеличивает максимальное количество очков здоровья ваших союзников на [1].</content>
|
<content contentuid="h8c0c79e8geefage313gb534gd315de67d298" version="1">Увеличивает максимальное количество очков здоровья ваших союзников на [1].</content>
|
||||||
<content contentuid="hbdf4d91ege560gf373gb78fgc694716131ec" version="1">Сияющее слово</content>
|
<content contentuid="hbdf4d91ege560gf373gb78fgc694716131ec" version="1">Слово сияния</content>
|
||||||
<content contentuid="h0dd0eba8g9b93g7909g9d9cg2a09e01a4c46" version="2">Уровень 1: Божественный порядок: Защитник</content>
|
<content contentuid="h0dd0eba8g9b93g7909g9d9cg2a09e01a4c46" version="2">Уровень 1: Божественный приказ: Защитник</content>
|
||||||
<content contentuid="h82c38cb3g39e6g13c8g7a26g5c63f737aa79" version="1">Защитник: Благодаря боевой подготовке вы получаете владение воинским оружием и тренировку в использовании тяжелых доспехов.</content>
|
<content contentuid="h82c38cb3g39e6g13c8g7a26g5c63f737aa79" version="1">Защитник: Благодаря боевой подготовке вы получаете владение воинским оружием и тренировку в использовании тяжелых доспехов.</content>
|
||||||
<content contentuid="hd91012edgb1a6g4aabg14d4g0d685464de55" version="1">Чудотворец: Вы знаете один дополнительный заговор из списка заклинаний жреца. Кроме того, ваша мистическая связь с божественным дает бонус к проверкам Интеллекта (Магия или Религия). Бонус равен вашему модификатору Мудрости (минимум +1).</content>
|
<content contentuid="hd91012edgb1a6g4aabg14d4g0d685464de55" version="1">Чудотворец: Вы знаете один дополнительный заговор из списка заклинаний жреца. Кроме того, ваша мистическая связь с божественным дает бонус к проверкам Интеллекта (Магия или Религия). Бонус равен вашему модификатору Мудрости (минимум +1).</content>
|
||||||
<content contentuid="h5eae110bgf170g8febg7b95gaf9957eab275" version="1">Напутствие</content>
|
<content contentuid="h5eae110bgf170g8febg7b95gaf9957eab275" version="1">Наставление</content>
|
||||||
<content contentuid="hf42e4215gdaa7g8b2cg6d6cg34b3a7233576" version="1">Свет</content>
|
<content contentuid="hf42e4215gdaa7g8b2cg6d6cg34b3a7233576" version="1">Свет</content>
|
||||||
<content contentuid="h08e84982gdf0fgadf1g29d5g02cc8281827c" version="2">Лопнувшее сухожилие</content>
|
<content contentuid="h08e84982gdf0fgadf1g29d5g02cc8281827c" version="2">Взрыв сухожилий</content>
|
||||||
<content contentuid="hf2980afegb1f3g08e3g5b30g296c1e8141b7" version="1">Сопротивление</content>
|
<content contentuid="hf2980afegb1f3g08e3g5b30g296c1e8141b7" version="1">Сопротивление</content>
|
||||||
<content contentuid="h3dc64960ga68egb106gddd9g8a83f2e5394a" version="1">Священное пламя</content>
|
<content contentuid="h3dc64960ga68egb106gddd9g8a83f2e5394a" version="1">Священное пламя</content>
|
||||||
<content contentuid="h37124d24g1b0dg1b86g632dg14623f5d21b6" version="1">Щадить умирающего</content>
|
<content contentuid="h37124d24g1b0dg1b86g632dg14623f5d21b6" version="1">Уход за умирающим</content>
|
||||||
<content contentuid="h31c6269fga1bfge0a9gb4bfg7f845b81b38a" version="1">Чудотворство</content>
|
<content contentuid="h31c6269fga1bfge0a9gb4bfg7f845b81b38a" version="1">Тавматургия</content>
|
||||||
<content contentuid="h4d2d81f9g6a4cg493ege377gd246536aefa0" version="1">Погребальный звон</content>
|
<content contentuid="h4d2d81f9g6a4cg493ege377gd246536aefa0" version="1">Погребальный звон</content>
|
||||||
<content contentuid="h5d663b96gee20gd7abg28bdgde325d686903" version="1">Божественный порядок</content>
|
<content contentuid="h5d663b96gee20gd7abg28bdgde325d686903" version="1">Божественный приказ</content>
|
||||||
<content contentuid="hf078c843g4ca9gd89bgde69g7b94c3d7e9b4" version="1">Вы выбрали одну из следующих священных ролей.</content>
|
<content contentuid="hf078c843g4ca9gd89bgde69g7b94c3d7e9b4" version="1">Вы выбрали одну из следующих священных ролей.</content>
|
||||||
<content contentuid="hc0f7da49g83b0g2364gd22fg0e72e6d0f671" version="1">Уровень 1: Божественный уклад: Сияние слов</content>
|
<content contentuid="hc0f7da49g83b0g2364gd22fg0e72e6d0f671" version="1">Уровень 1: Божественный приказ: Слово сияния</content>
|
||||||
<content contentuid="h4d5b8b7cg1eddg15a0g6e0cgb4e68f50ee06" version="1">Уровень 1: Божественный уклад: Наставление</content>
|
<content contentuid="h4d5b8b7cg1eddg15a0g6e0cgb4e68f50ee06" version="1">Уровень 1: Божественный приказ: Наставление</content>
|
||||||
<content contentuid="h865f785bge303g1b8ag2f0egee91191a55fd" version="1">Уровень 1: Божественный уклад: Свет</content>
|
<content contentuid="h865f785bge303g1b8ag2f0egee91191a55fd" version="1">Уровень 1: Божественный приказ: Свет</content>
|
||||||
<content contentuid="h0bfe486dga99eg5aefg818agacd35ff6e130" version="2">Уровень 1: Божественный уклад: Напряжение жил</content>
|
<content contentuid="h0bfe486dga99eg5aefg818agacd35ff6e130" version="2">Уровень 1: Божественный приказ: Взрыв сухожилий</content>
|
||||||
<content contentuid="hd5ac78c8g2d8cg02bag6ebbg2f9ccd67bc36" version="1">Уровень 1: Божественный уклад: Сопротивление</content>
|
<content contentuid="hd5ac78c8g2d8cg02bag6ebbg2f9ccd67bc36" version="1">Уровень 1: Божественный приказ: Сопротивление</content>
|
||||||
<content contentuid="h63c03147gca42g60bdgfa7ag47ceb695bc38" version="1">Уровень 1: Божественный уклад: Священное пламя</content>
|
<content contentuid="h63c03147gca42g60bdgfa7ag47ceb695bc38" version="1">Уровень 1: Божественный приказ: Священное пламя</content>
|
||||||
<content contentuid="hf2f5e5c4g141ag2b8egb90cg9ff6727b6910" version="1">Уровень 1: Божественный уклад: Пощада умирающему</content>
|
<content contentuid="hf2f5e5c4g141ag2b8egb90cg9ff6727b6910" version="1">Уровень 1: Божественный приказ: Уход за умирающим</content>
|
||||||
<content contentuid="h50136471gff21g505fg888cgf856fc01281a" version="1">Уровень 1: Божественный уклад: Чудотворство</content>
|
<content contentuid="h50136471gff21g505fg888cgf856fc01281a" version="1">Уровень 1: Божественный приказ: Тавматургия</content>
|
||||||
<content contentuid="h9b0eeaeeg6a13gc99dg6669gc97c57ec0db5" version="1">Уровень 1: Божественный уклад: Погребальный звон</content>
|
<content contentuid="h9b0eeaeeg6a13gc99dg6669gc97c57ec0db5" version="1">Уровень 1: Божественный приказ: Погребальный звон</content>
|
||||||
<content contentuid="h84a7d362gf65ag0f66g6103g7d1f4fc707d2" version="1">Уровень 2: Направление божественной энергии</content>
|
<content contentuid="h84a7d362gf65ag0f66g6103g7d1f4fc707d2" version="1">Уровень 2: Направление божественной энергии</content>
|
||||||
<content contentuid="h619804afg28a4g6f48g9db2gb39ec7c1d073" version="1">Вы можете направлять божественную энергию для создания особых эффектов, таких как Божественная искра и Изгнание нежити, выбирая один эффект при каждом использовании. Дополнительные эффекты и использования открываются на более высоких уровнях жреца. Вы восстанавливаете одно использование после короткого отдыха и все использования — после долгого отдыха. Сложность спасбросков использует вашу Сл заклинаний.</content>
|
<content contentuid="h619804afg28a4g6f48g9db2gb39ec7c1d073" version="1">Вы можете направлять божественную энергию для создания особых эффектов, таких как Божественная искра и Изгнание нежити, выбирая один эффект при каждом использовании. Дополнительные эффекты и использования открываются на более высоких уровнях жреца. Вы восстанавливаете одно использование после короткого отдыха и все использования — после долгого отдыха. Сложность спасбросков использует вашу Сл заклинаний.</content>
|
||||||
<content contentuid="h0fdb1f5ag867fg21d4g6beeg681eae4df812" version="1">Божественная искра</content>
|
<content contentuid="h0fdb1f5ag867fg21d4g6beeg681eae4df812" version="1">Божественная искра</content>
|
||||||
@@ -133,9 +133,9 @@
|
|||||||
<content contentuid="h4bebd04fg3a81gc270gd50bga237aecd8ef8" version="1">Благословенные удары</content>
|
<content contentuid="h4bebd04fg3a81gc270gd50bga237aecd8ef8" version="1">Благословенные удары</content>
|
||||||
<content contentuid="h0c4d3581gf44cg6a9ag27f8ge9f2dd54d6ed" version="1">В бою вас наполняет божественная сила. Выберите один из следующих вариантов.</content>
|
<content contentuid="h0c4d3581gf44cg6a9ag27f8ge9f2dd54d6ed" version="1">В бою вас наполняет божественная сила. Выберите один из следующих вариантов.</content>
|
||||||
<content contentuid="hb6ac0f1cg84d4g5137g1a23g92f5941f06dc" version="1">Уровень 5: Выжигание нежити</content>
|
<content contentuid="hb6ac0f1cg84d4g5137g1a23g92f5941f06dc" version="1">Уровень 5: Выжигание нежити</content>
|
||||||
<content contentuid="hd9e8561fg5920g7f26g9d66g15b2d44e24f3" version="1">Щадить умирающего</content>
|
<content contentuid="hd9e8561fg5920g7f26g9d66g15b2d44e24f3" version="1">Уход за умирающим</content>
|
||||||
<content contentuid="hb742b3aagabfcg536cg10e0g99bbe354e49a" version="1">Исцелите существо в пределах досягаемости, у которого 0 очков здоровья и которое не мертво.</content>
|
<content contentuid="hb742b3aagabfcg536cg10e0g99bbe354e49a" version="1">Исцелите существо в пределах досягаемости, у которого 0 очков здоровья и которое не мертво.</content>
|
||||||
<content contentuid="hd085b0deg3cc9g0858gdf14geef98a4164c3" version="1">Сияющее слово</content>
|
<content contentuid="hd085b0deg3cc9g0858gdf14geef98a4164c3" version="1">Слово сияния</content>
|
||||||
<content contentuid="hbb7ccd06g2737gdcf2gc167g21f32c9615fb" version="1">Обжигающее излучение вырывается из вас в области [1] Исходящая область. Каждое выбранное вами существо, которое вы видите в этой области, должно преуспеть в испытании Телосложения или получить урон излучением.</content>
|
<content contentuid="hbb7ccd06g2737gdcf2gc167g21f32c9615fb" version="1">Обжигающее излучение вырывается из вас в области [1] Исходящая область. Каждое выбранное вами существо, которое вы видите в этой области, должно преуспеть в испытании Телосложения или получить урон излучением.</content>
|
||||||
<content contentuid="hf652a768gef39g78fdg661dg8ddbb887d3f3" version="1">Уровень 3: Ученик жизни</content>
|
<content contentuid="hf652a768gef39g78fdg661dg8ddbb887d3f3" version="1">Уровень 3: Ученик жизни</content>
|
||||||
<content contentuid="h748a060egc16cg7d82gf97eg22830dd0c9f1" version="1">Когда заклинание, сотворённое с затратой ячейки, восстанавливает существу очки здоровья, в тот же ход оно восстанавливает дополнительные очки здоровья. Количество дополнительных очков здоровья равно 2 + уровень ячейки заклинания.</content>
|
<content contentuid="h748a060egc16cg7d82gf97eg22830dd0c9f1" version="1">Когда заклинание, сотворённое с затратой ячейки, восстанавливает существу очки здоровья, в тот же ход оно восстанавливает дополнительные очки здоровья. Количество дополнительных очков здоровья равно 2 + уровень ячейки заклинания.</content>
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
<attribute id="CharacterCreationLevelName" type="FixedString" value=""/>
|
<attribute id="CharacterCreationLevelName" type="FixedString" value=""/>
|
||||||
<attribute id="Description" type="LSString" value="Русская локализация мода, который добавляет и обновляет контент в соответствии с правилами DnD 5.5e и другими источниками, включая предыстории, классы, таланты, расы, заклинания и многое другое. Это отдельный мод локализации и он требует установленный оригинальный мод."/>
|
<attribute id="Description" type="LSString" value="Русская локализация мода, который добавляет и обновляет контент в соответствии с правилами DnD 5.5e и другими источниками, включая предыстории, классы, таланты, расы, заклинания и многое другое. Это отдельный мод локализации и он требует установленный оригинальный мод."/>
|
||||||
<attribute id="FileSize" type="uint64" value="0"/>
|
<attribute id="FileSize" type="uint64" value="0"/>
|
||||||
<attribute id="Folder" type="LSString" value="DnD55eRussian"/>
|
<attribute id="Folder" type="LSString" value="DnD 5.5e AIO Russian"/>
|
||||||
<attribute id="LobbyLevelName" type="FixedString" value=""/>
|
<attribute id="LobbyLevelName" type="FixedString" value=""/>
|
||||||
<attribute id="MD5" type="LSString" value=""/>
|
<attribute id="MD5" type="LSString" value=""/>
|
||||||
<attribute id="MenuLevelName" type="FixedString" value=""/>
|
<attribute id="MenuLevelName" type="FixedString" value=""/>
|
||||||
133
glossary/glossary.normalized.json
Normal file
133
glossary/glossary.normalized.json
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
{
|
||||||
|
"Ability Check": "проверка характеристики",
|
||||||
|
"Advantage": "преимущество",
|
||||||
|
"Aid": "Подмога",
|
||||||
|
"Armor Class": "класс доспеха",
|
||||||
|
"Attack Action": "действие «Атака»",
|
||||||
|
"Attack Roll": "бросок атаки",
|
||||||
|
"Bardic Inspiration": "Вдохновение барда",
|
||||||
|
"Bardic Inspiration die": "кубик Вдохновения барда",
|
||||||
|
"Beguiling Magic": "Чарующая магия",
|
||||||
|
"Blessed Healer": "Благословенный целитель",
|
||||||
|
"Blessed Strikes": "Благословенные удары",
|
||||||
|
"Bonus Action": "бонусное действие",
|
||||||
|
"Bonus Unarmed Strike": "Бонусная безоружная атака",
|
||||||
|
"Brutal Strike": "Жестокий удар",
|
||||||
|
"Cantrip": "заговор",
|
||||||
|
"Cantrips": "заговоры",
|
||||||
|
"Channel Divinity": "Направление божественной энергии",
|
||||||
|
"Circle Forms": "Облики круга",
|
||||||
|
"Circle of the Moon Spells": "Заклинания круга Луны",
|
||||||
|
"Cleave": "Рассечение",
|
||||||
|
"Concentration": "концентрация",
|
||||||
|
"Countercharm": "Контрочарование",
|
||||||
|
"Cutting Words": "Едкие слова",
|
||||||
|
"D20 Test": "проверка к20",
|
||||||
|
"Danger Sense": "Чувство опасности",
|
||||||
|
"Dash": "Рывок",
|
||||||
|
"Deflect Attacks": "Отклонение атак",
|
||||||
|
"Disadvantage": "помеха",
|
||||||
|
"Disciple of Life": "Ученик жизни",
|
||||||
|
"Disengage": "Отход",
|
||||||
|
"Divine Order": "Божественный порядок",
|
||||||
|
"Divine Spark": "Божественная искра",
|
||||||
|
"Druidic": "Друидический",
|
||||||
|
"Eldritch Strike": "Мистический удар",
|
||||||
|
"Elemental Fury": "Стихийная ярость",
|
||||||
|
"Empowered Strikes": "Усиленные удары",
|
||||||
|
"Evasion": "Ускользание",
|
||||||
|
"Extra Attack": "Дополнительная атака",
|
||||||
|
"Font of Inspiration": "Источник вдохновения",
|
||||||
|
"Forceful Blow": "Мощный удар",
|
||||||
|
"Fount of Moonlight": "Фонтан лунного света",
|
||||||
|
"Frenzy": "Неистовство",
|
||||||
|
"Graze": "Задевание",
|
||||||
|
"Guidance": "Наставление",
|
||||||
|
"Hamstring Blow": "Удар по сухожилиям",
|
||||||
|
"Heavy Armor": "тяжёлые доспехи",
|
||||||
|
"Heightened Focus": "Обострённый фокус",
|
||||||
|
"Heroic Inspiration": "Героическое вдохновение",
|
||||||
|
"Heroic Warrior": "Героический воин",
|
||||||
|
"Hit Points": "очки здоровья",
|
||||||
|
"Improved Combat Superiority": "Усовершенствованное превосходство в бою",
|
||||||
|
"Improved Warding Flare": "Улучшенная защитная вспышка",
|
||||||
|
"Indomitable": "Несгибаемая воля",
|
||||||
|
"Instinctive Pounce": "Интуитивный рывок",
|
||||||
|
"Invoke Duplicity": "Призыв двойника",
|
||||||
|
"Light": "Свет",
|
||||||
|
"Long Rest": "длительный отдых",
|
||||||
|
"Magic Action": "действие «Магия»",
|
||||||
|
"Magician": "Маг",
|
||||||
|
"Mantle of Inspiration": "Мантия вдохновения",
|
||||||
|
"Martial Arts": "Боевые искусства",
|
||||||
|
"Martial weapons": "воинское оружие",
|
||||||
|
"Mastery Properties": "свойства мастерства",
|
||||||
|
"Medium Armor": "средние доспехи",
|
||||||
|
"Mind Magic": "Магия разума",
|
||||||
|
"Mindless Rage": "Безрассудная ярость",
|
||||||
|
"Moonlight Step": "Лунный шаг",
|
||||||
|
"Moonlight Step Charge": "заряд «Лунного шага»",
|
||||||
|
"Necrotic Damage": "урон некротической энергией",
|
||||||
|
"Nick": "Надрез",
|
||||||
|
"Opportunity Attack": "атака по возможности",
|
||||||
|
"Opportunity Attacks": "атаки по возможности",
|
||||||
|
"Patient Defense": "Выжидательная оборона",
|
||||||
|
"Poison Spray": "Брызги яда",
|
||||||
|
"Potent Spellcasting": "Мощное заклинание",
|
||||||
|
"Preserve Life": "Сохранение жизни",
|
||||||
|
"Primal Knowledge": "Первозданное знание",
|
||||||
|
"Primal Order": "Первозданный уклад",
|
||||||
|
"Primal Strike": "Первобытный удар",
|
||||||
|
"Produce Flame": "Создание пламени",
|
||||||
|
"Proficiency Bonus": "бонус мастерства",
|
||||||
|
"Proficient": "владение",
|
||||||
|
"Protector": "Защитник",
|
||||||
|
"Purity of Body": "Чистота тела",
|
||||||
|
"Push": "Отталкивание",
|
||||||
|
"Radiant Damage": "урон излучением",
|
||||||
|
"Rage": "Ярость",
|
||||||
|
"Reaction": "реакция",
|
||||||
|
"Reckless Attack": "Безрассудная атака",
|
||||||
|
"Redirect Attacks": "Перенаправление атак",
|
||||||
|
"Relentless Rage": "Неудержимая ярость",
|
||||||
|
"Remarkable Athlete": "Выдающийся атлет",
|
||||||
|
"Resistance": "Сопротивление",
|
||||||
|
"Retaliation": "Возмездие",
|
||||||
|
"Sacred Flame": "Священное пламя",
|
||||||
|
"Sap": "Утомление",
|
||||||
|
"Saving Throw": "спасбросок",
|
||||||
|
"Sear Undead": "Выжигание нежити",
|
||||||
|
"Second Wind": "Второе дыхание",
|
||||||
|
"Self-Restoration": "Самоисцеление",
|
||||||
|
"Shillelagh": "Дубинка",
|
||||||
|
"Short Rest": "короткий отдых",
|
||||||
|
"Slow": "Замедление",
|
||||||
|
"Slow Fall": "Замедление падения",
|
||||||
|
"Spare the Dying": "Пощада умирающему",
|
||||||
|
"Spell Slot": "ячейка заклинаний",
|
||||||
|
"Starry Wisp": "Звёздная искра",
|
||||||
|
"Step of the Wind": "Шаг ветра",
|
||||||
|
"Tactical Master": "Мастер тактики",
|
||||||
|
"Tactical Mind": "Тактический ум",
|
||||||
|
"Tactical Shift": "Тактический манёвр",
|
||||||
|
"Temporary Hit Points": "временные очки здоровья",
|
||||||
|
"Thaumaturge": "Чудотворец",
|
||||||
|
"Thaumaturgy": "Чудотворство",
|
||||||
|
"Thorn Whip": "Колючий бич",
|
||||||
|
"Thunderclap": "Раскат грома",
|
||||||
|
"Toll the Dead": "Погребальный звон",
|
||||||
|
"Topple": "Опрокидывание",
|
||||||
|
"Trickster’s Transposition": "Перемещение обманщика",
|
||||||
|
"Unarmored Defense": "Защита без доспехов",
|
||||||
|
"Unarmored Movement": "Бездоспешное передвижение",
|
||||||
|
"Uncanny Metabolism": "Необычный метаболизм",
|
||||||
|
"Unfettered Mind": "Свободный разум",
|
||||||
|
"Vex": "Досада",
|
||||||
|
"Warden": "Страж",
|
||||||
|
"Warding Flare": "Защитная вспышка",
|
||||||
|
"Weapon Mastery": "мастерство владения оружием",
|
||||||
|
"Wild Resurgence": "Возрождение дикого облика",
|
||||||
|
"Wild Shape": "Дикий облик",
|
||||||
|
"Wild Shape Charge": "заряд «Дикого облика»",
|
||||||
|
"Word of Radiance": "Сияющее слово"
|
||||||
|
}
|
||||||
@@ -1,7 +1,189 @@
|
|||||||
|
param(
|
||||||
|
[string]$DivinePath = "Divine",
|
||||||
|
[string]$Workspace = (Get-Location).Path,
|
||||||
|
[string]$VersionTag = "",
|
||||||
|
[string]$ModFolder = "DnD 5.5e AIO Russian",
|
||||||
|
[string]$PackageName = "DnD 5.5e AIO Russian.pak",
|
||||||
|
[string]$ArchiveBaseName = "DnD 5.5e AIO Russian",
|
||||||
|
[string]$ModName = "DnD 5.5e All-in-One BEYOND Russian Localization",
|
||||||
|
[string]$ModUuid = "6401e84d-daf2-416d-adeb-99c03a2487a6",
|
||||||
|
[string]$ModAuthor = "MikhailRaw",
|
||||||
|
[string]$ModDescription = "Russian Localization",
|
||||||
|
[string]$ModVersion64 = "36028797018963968",
|
||||||
|
[string]$ModGroup = "6401e84d-daf2-416d-adeb-99c03a2487a6",
|
||||||
|
[string]$DependencyUuid = "897914ef-5c96-053c-44af-0be823f895fe",
|
||||||
|
[string]$DependencyVersion64 = "36028797018963968"
|
||||||
|
)
|
||||||
|
|
||||||
$ErrorActionPreference = "Stop"
|
$ErrorActionPreference = "Stop"
|
||||||
|
|
||||||
if (-not (Test-Path -LiteralPath "build")) {
|
function Convert-VersionTagToVersion64 {
|
||||||
New-Item -ItemType Directory -Path "build" | Out-Null
|
param(
|
||||||
|
[string]$Tag,
|
||||||
|
[string]$FallbackVersion64
|
||||||
|
)
|
||||||
|
|
||||||
|
if (-not $Tag) {
|
||||||
|
return [int64]$FallbackVersion64
|
||||||
|
}
|
||||||
|
|
||||||
|
$normalized = $Tag
|
||||||
|
if ($normalized.StartsWith("v")) {
|
||||||
|
$normalized = $normalized.Substring(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($normalized -notmatch '^\d+(\.\d+){0,3}$') {
|
||||||
|
return [int64]$FallbackVersion64
|
||||||
|
}
|
||||||
|
|
||||||
|
$parts = $normalized.Split(".")
|
||||||
|
$numbers = @(0, 0, 0, 0)
|
||||||
|
for ($i = 0; $i -lt $parts.Length; $i++) {
|
||||||
|
$numbers[$i] = [int]$parts[$i]
|
||||||
|
}
|
||||||
|
|
||||||
|
return ([int64]$numbers[0] -shl 55) -bor ([int64]$numbers[1] -shl 47) -bor ([int64]$numbers[2] -shl 31) -bor [int64]$numbers[3]
|
||||||
}
|
}
|
||||||
|
|
||||||
Divine -a pack -s Mods -d build/DnD55eRussian.pak
|
$workspacePath = [System.IO.Path]::GetFullPath($Workspace)
|
||||||
|
$modsPath = Join-Path $workspacePath "Mods"
|
||||||
|
$modPath = Join-Path $modsPath $ModFolder
|
||||||
|
$buildPath = Join-Path $workspacePath "build"
|
||||||
|
$stagingRoot = Join-Path $env:TEMP "bg3-dnd55e-russian-localization-stage"
|
||||||
|
$stagingPath = Join-Path $stagingRoot "build-stage"
|
||||||
|
$packagePath = Join-Path $buildPath $PackageName
|
||||||
|
$tempPackagePath = Join-Path $env:TEMP $PackageName
|
||||||
|
$archiveName = $ArchiveBaseName
|
||||||
|
if ($VersionTag) {
|
||||||
|
$archiveName = "$ArchiveBaseName $VersionTag"
|
||||||
|
}
|
||||||
|
$zipPath = Join-Path $buildPath "$archiveName.zip"
|
||||||
|
$infoJsonPath = Join-Path $buildPath "info.json"
|
||||||
|
$resolvedVersion64 = Convert-VersionTagToVersion64 -Tag $VersionTag -FallbackVersion64 $ModVersion64
|
||||||
|
|
||||||
|
if (-not (Test-Path -LiteralPath $DivinePath)) {
|
||||||
|
$resolvedCommand = Get-Command $DivinePath -ErrorAction SilentlyContinue
|
||||||
|
if (-not $resolvedCommand) {
|
||||||
|
throw "Divine executable was not found: '$DivinePath'."
|
||||||
|
}
|
||||||
|
$DivinePath = $resolvedCommand.Source
|
||||||
|
}
|
||||||
|
|
||||||
|
if (-not (Test-Path -LiteralPath $modPath)) {
|
||||||
|
throw "Mod folder was not found: '$modPath'."
|
||||||
|
}
|
||||||
|
|
||||||
|
if (-not (Test-Path -LiteralPath (Join-Path $modPath "Localization\\Russian\\russian.xml"))) {
|
||||||
|
throw "Localization file was not found under '$modPath'."
|
||||||
|
}
|
||||||
|
|
||||||
|
New-Item -ItemType Directory -Path $buildPath -Force | Out-Null
|
||||||
|
|
||||||
|
foreach ($path in @($stagingPath, $tempPackagePath, $packagePath, $zipPath, $infoJsonPath)) {
|
||||||
|
if (Test-Path -LiteralPath $path) {
|
||||||
|
if ((Get-Item -LiteralPath $path).PSIsContainer) {
|
||||||
|
Remove-Item -LiteralPath $path -Recurse -Force
|
||||||
|
} else {
|
||||||
|
Remove-Item -LiteralPath $path -Force
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Test-Path -LiteralPath $stagingRoot) {
|
||||||
|
Remove-Item -LiteralPath $stagingRoot -Recurse -Force
|
||||||
|
}
|
||||||
|
|
||||||
|
New-Item -ItemType Directory -Path $stagingPath -Force | Out-Null
|
||||||
|
Copy-Item -LiteralPath $modsPath -Destination $stagingPath -Recurse
|
||||||
|
|
||||||
|
$stagedMetaPath = Join-Path $stagingPath "Mods\\$ModFolder\\meta.lsx"
|
||||||
|
if (-not (Test-Path -LiteralPath $stagedMetaPath)) {
|
||||||
|
throw "Staged meta.lsx was not found: '$stagedMetaPath'."
|
||||||
|
}
|
||||||
|
|
||||||
|
$stagedMetaContent = Get-Content -LiteralPath $stagedMetaPath -Raw
|
||||||
|
$stagedMetaContent = $stagedMetaContent -replace '(<attribute id="Version64" type="int64" value=")\d+("/>)', "`${1}$resolvedVersion64`${2}"
|
||||||
|
Set-Content -LiteralPath $stagedMetaPath -Value $stagedMetaContent -Encoding utf8
|
||||||
|
|
||||||
|
Write-Host "[build.ps1] Staged source tree:"
|
||||||
|
Get-ChildItem -Recurse $stagingPath | Select-Object FullName, Length | Format-Table -AutoSize
|
||||||
|
|
||||||
|
if (Test-Path -LiteralPath $tempPackagePath) {
|
||||||
|
Remove-Item -LiteralPath $tempPackagePath -Force
|
||||||
|
}
|
||||||
|
|
||||||
|
$packageAttempts = @(
|
||||||
|
[ordered]@{ Name = "staging-root"; Source = $stagingPath },
|
||||||
|
[ordered]@{ Name = "mods-root"; Source = $modsPath },
|
||||||
|
[ordered]@{ Name = "workspace-root"; Source = $workspacePath }
|
||||||
|
)
|
||||||
|
|
||||||
|
$successfulAttempt = $null
|
||||||
|
foreach ($attempt in $packageAttempts) {
|
||||||
|
if (Test-Path -LiteralPath $tempPackagePath) {
|
||||||
|
Remove-Item -LiteralPath $tempPackagePath -Force
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Host "[build.ps1] Trying Divine source '$($attempt.Name)': $($attempt.Source)"
|
||||||
|
& $DivinePath -a create-package -g bg3 -s $attempt.Source -d $tempPackagePath
|
||||||
|
|
||||||
|
if (-not (Test-Path -LiteralPath $tempPackagePath)) {
|
||||||
|
Write-Host "[build.ps1] No package created for attempt '$($attempt.Name)'."
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
$attemptPackage = Get-Item -LiteralPath $tempPackagePath
|
||||||
|
Write-Host "[build.ps1] Attempt '$($attempt.Name)' produced $($attemptPackage.Length) bytes."
|
||||||
|
|
||||||
|
if ($attemptPackage.Length -ge 1024) {
|
||||||
|
$successfulAttempt = $attempt
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (-not $successfulAttempt) {
|
||||||
|
$lastSize = "missing"
|
||||||
|
if (Test-Path -LiteralPath $tempPackagePath) {
|
||||||
|
$lastSize = (Get-Item -LiteralPath $tempPackagePath).Length
|
||||||
|
}
|
||||||
|
throw "Package looks invalid after all attempts. Last output '$tempPackagePath' size: $lastSize bytes."
|
||||||
|
}
|
||||||
|
|
||||||
|
Move-Item -LiteralPath $tempPackagePath -Destination $packagePath
|
||||||
|
|
||||||
|
if (-not (Test-Path -LiteralPath $packagePath)) {
|
||||||
|
throw "Package was not created."
|
||||||
|
}
|
||||||
|
|
||||||
|
$packageFile = Get-Item -LiteralPath $packagePath
|
||||||
|
Write-Host "[build.ps1] Using package from attempt '$($successfulAttempt.Name)'."
|
||||||
|
|
||||||
|
$packageMd5 = (Get-FileHash -LiteralPath $packagePath -Algorithm MD5).Hash.ToLowerInvariant()
|
||||||
|
$createdAt = (Get-Date).ToString("o")
|
||||||
|
|
||||||
|
$infoJson = [ordered]@{
|
||||||
|
Mods = @(
|
||||||
|
[ordered]@{
|
||||||
|
Author = $ModAuthor
|
||||||
|
Name = $ModName
|
||||||
|
Folder = $ModFolder
|
||||||
|
Version = [string]$resolvedVersion64
|
||||||
|
Description = $ModDescription
|
||||||
|
UUID = $ModUuid
|
||||||
|
Created = $createdAt
|
||||||
|
Dependencies = @($DependencyUuid)
|
||||||
|
Group = $ModGroup
|
||||||
|
}
|
||||||
|
)
|
||||||
|
MD5 = $packageMd5
|
||||||
|
} | ConvertTo-Json -Depth 4
|
||||||
|
|
||||||
|
Set-Content -LiteralPath $infoJsonPath -Value $infoJson -Encoding utf8
|
||||||
|
Compress-Archive -LiteralPath @($packagePath, $infoJsonPath) -DestinationPath $zipPath -CompressionLevel Optimal
|
||||||
|
|
||||||
|
if (-not (Test-Path -LiteralPath $zipPath)) {
|
||||||
|
throw "ZIP archive was not created."
|
||||||
|
}
|
||||||
|
|
||||||
|
Get-ChildItem -LiteralPath $packagePath, $infoJsonPath, $zipPath |
|
||||||
|
Select-Object FullName, Length, LastWriteTime
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
mkdir -p build
|
|
||||||
Divine -a pack -s Mods -d build/DnD55eRussian.pak
|
|
||||||
Reference in New Issue
Block a user