Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 7f8f09a3ac | |||
| 70f93c3d29 | |||
| 4aa2e136b2 | |||
| 3ae30a5263 | |||
| 4da26911fe | |||
| df1daee6ab | |||
| 9d1a26c8e0 | |||
| 8a4970742c | |||
| b50a6a2f95 | |||
| 4646b51459 | |||
| a72b7bc1e1 | |||
| 7aca648396 |
67
ACTIONS.md
Normal file
67
ACTIONS.md
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
# ACTIONS.md
|
||||||
|
|
||||||
|
VERSION: 2
|
||||||
|
MODE: machine-first
|
||||||
|
LANG: ru
|
||||||
|
|
||||||
|
ROUTING:
|
||||||
|
- match_user_request_to_action_id: true
|
||||||
|
- if_match: propose_action
|
||||||
|
- if_no_match: ignore_actions_md
|
||||||
|
- if_no_match_user_message: none
|
||||||
|
|
||||||
|
PROPOSE_RULE:
|
||||||
|
- prompt_template: "Приступить к выполнению '{action_id}'?"
|
||||||
|
- require_user_confirmation: true
|
||||||
|
- execute_without_confirmation: false
|
||||||
|
|
||||||
|
EXECUTION_BASELINE:
|
||||||
|
- enforce_agents_md: true
|
||||||
|
- minimal_non_breaking_changes: true
|
||||||
|
- steps_count_range: [3, 7]
|
||||||
|
- before_commit_push: request_user_approval
|
||||||
|
|
||||||
|
REPORT_FORMAT:
|
||||||
|
- done
|
||||||
|
- changed_files
|
||||||
|
- checks
|
||||||
|
- remaining
|
||||||
|
|
||||||
|
ACTIONS:
|
||||||
|
translation:update:
|
||||||
|
intent: sync_ru_translation_with_upstream
|
||||||
|
inputs:
|
||||||
|
- Mods/DnD 5.5e AIO Russian/Localization/Russian/russian.xml
|
||||||
|
- glossary/glossary.normalized.json
|
||||||
|
- AGENTS.md::Canonical Paths::Upstream English reference
|
||||||
|
plan:
|
||||||
|
- compare_en_vs_ru_by_keys
|
||||||
|
- classify_diff_into_new_changed_stale_candidate
|
||||||
|
- update_ru_for_new_and_changed_using_glossary
|
||||||
|
- validate_xml_structure_and_service_attributes
|
||||||
|
- prepare_delta_summary_counts
|
||||||
|
checks:
|
||||||
|
- xml_valid
|
||||||
|
- glossary_consistency
|
||||||
|
- scope_limited_to_localization_and_allowed_metadata
|
||||||
|
outputs:
|
||||||
|
- Mods/DnD 5.5e AIO Russian/Localization/Russian/russian.xml
|
||||||
|
- optional: Mods/DnD 5.5e AIO Russian/meta.lsx (release-only)
|
||||||
|
|
||||||
|
action:report:
|
||||||
|
intent: unified_task_report
|
||||||
|
inputs:
|
||||||
|
- task_context
|
||||||
|
- modified_files
|
||||||
|
- verification_results
|
||||||
|
plan:
|
||||||
|
- summarize_done
|
||||||
|
- list_changed_files
|
||||||
|
- list_checks
|
||||||
|
- list_remaining
|
||||||
|
checks:
|
||||||
|
- concise
|
||||||
|
- factual
|
||||||
|
- no_unverified_claims
|
||||||
|
outputs:
|
||||||
|
- final_user_report
|
||||||
203
AGENTS.md
203
AGENTS.md
@@ -1,154 +1,73 @@
|
|||||||
# AGENTS.md
|
# AGENTS.md
|
||||||
|
|
||||||
## Project Overview
|
## Scope (MUST)
|
||||||
|
- Repository purpose: standalone Russian localization mod only.
|
||||||
This repository contains a standalone Russian localization mod for **Baldur's Gate 3**:
|
- Allowed domain: localization content + packaging/release metadata.
|
||||||
|
- Forbidden: gameplay logic, Script Extender content, unrelated assets.
|
||||||
- Mod name: `DnD 5.5e All-in-One BEYOND Russian Localization`
|
- Keep repository source-only.
|
||||||
- Mod folder: `Mods/DnD 5.5e AIO Russian`
|
- Never commit `.pak` or temporary build artifacts.
|
||||||
- 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
|
|
||||||
|
|
||||||
|
## Canonical Paths (MUST)
|
||||||
- Mod sources: `Mods/DnD 5.5e AIO Russian`
|
- Mod sources: `Mods/DnD 5.5e AIO Russian`
|
||||||
- Localization XML: `Mods/DnD 5.5e AIO Russian/Localization/Russian/russian.xml`
|
- Russian localization: `Mods/DnD 5.5e AIO Russian/Localization/Russian/russian.xml`
|
||||||
- Original English localization reference: `https://github.com/Yoonmoonsik/dnd55e/blob/main/Mods/DnD2024_897914ef-5c96-053c-44af-0be823f895fe/Localization/English/english.xml`
|
|
||||||
- Translation glossary reference: `glossary/glossary.normalized.json` — use this as the primary terminology reference when translating
|
|
||||||
- Mod metadata: `Mods/DnD 5.5e AIO Russian/meta.lsx`
|
- Mod metadata: `Mods/DnD 5.5e AIO Russian/meta.lsx`
|
||||||
|
- Build script (single source of build truth): `scripts/build.ps1`
|
||||||
- CI workflow: `.gitea/workflows/build.yml`
|
- CI workflow: `.gitea/workflows/build.yml`
|
||||||
- Main build script: `scripts/build.ps1`
|
- Glossary (primary terminology reference): `glossary/glossary.normalized.json`
|
||||||
|
- Action catalog and command playbooks: `ACTIONS.md`
|
||||||
|
- Upstream English reference: `https://github.com/Yoonmoonsik/dnd55e/blob/main/Mods/DnD2024_897914ef-5c96-053c-44af-0be823f895fe/Localization/English/english.xml`
|
||||||
|
|
||||||
## Build And Release Model
|
## Packaging Invariants (MUST)
|
||||||
|
- `.pak` must contain only BG3 mod structure under `Mods/...`.
|
||||||
|
- Required content in `.pak`:
|
||||||
|
- `Mods/DnD 5.5e AIO Russian/meta.lsx`
|
||||||
|
- `Mods/DnD 5.5e AIO Russian/Localization/Russian/russian.xml`
|
||||||
|
- Must not leak into `.pak`: `.git`, `.gitea`, `scripts`, `tools`, `.tools`, `build`, staging dirs.
|
||||||
|
- Staging for packaging must be in `%TEMP%`, not in dot-prefixed repo dirs.
|
||||||
|
|
||||||
The authoritative build logic lives in:
|
## Build/CI Contract (MUST)
|
||||||
|
- CI workflow stays thin:
|
||||||
|
1. prepare workspace
|
||||||
|
2. download Divine
|
||||||
|
3. call `scripts/build.ps1`
|
||||||
|
4. publish tag archive
|
||||||
|
- Expected build outputs:
|
||||||
|
- `build/DnD 5.5e AIO Russian.pak`
|
||||||
|
- `build/info.json`
|
||||||
|
- `build/DnD 5.5e AIO Russian <tag>.zip` (for tag builds)
|
||||||
|
- Release ZIP must include only `.pak` + `info.json`.
|
||||||
|
- CI triggers: tag `v*` and manual dispatch; not every push to `main`.
|
||||||
|
|
||||||
- `scripts/build.ps1`
|
## Version/Release Rules (MUST)
|
||||||
|
- Read release version only from `save/region/node[@id="ModuleSettings"]/children/node[@id="ModuleInfo"]/attribute[@id="Version64"]` via explicit XML parsing.
|
||||||
|
- `PublishVersion` must not be changed during release preparation.
|
||||||
|
- Release tag must match the source-of-truth version.
|
||||||
|
- Decision logic before tagging:
|
||||||
|
1. If `ModuleInfo/Version64` was manually changed (e.g. BG3 Toolkit), use matching tag and release.
|
||||||
|
2. If `ModuleInfo/Version64` equals latest released version, bump version first (e.g. `scripts/set-version.ps1 -VersionTag <tag>`), commit, then create/push tag.
|
||||||
|
- `scripts/build.ps1` derives release `Version64` from tag and writes it to generated `info.json` and staged `meta.lsx`.
|
||||||
|
|
||||||
The Gitea workflow should stay thin and only:
|
## info.json Contract (MUST)
|
||||||
|
- Top-level keys: `Mods`, `MD5`.
|
||||||
|
- Per-mod keys: `Author`, `Name`, `Folder`, `Version`, `Description`, `UUID`, `Created`, `Dependencies`, `Group`.
|
||||||
|
- `Dependencies` is an array of UUIDs.
|
||||||
|
- Current dependency UUID: `897914ef-5c96-053c-44af-0be823f895fe`.
|
||||||
|
|
||||||
1. prepare the workspace
|
## Git Collaboration Policy (MUST)
|
||||||
2. download `Divine`
|
- Ask user permission before commit.
|
||||||
3. call `scripts/build.ps1`
|
- After approval: commit and push immediately.
|
||||||
4. publish the release zip for tag builds
|
- At the start of each new fix/feature task: propose switching to a dedicated `fix/*` or `feat/*` branch.
|
||||||
|
- After finishing work in `fix/*` or `feat/*`: propose either
|
||||||
|
1. creating an MR into `main`, or
|
||||||
|
2. merging to `main` immediately and deleting the `fix/*`/`feat/*` branch.
|
||||||
|
- Commit messages and comments: Russian.
|
||||||
|
- Commit message content: what was done (not what should be done).
|
||||||
|
- If push fails: retry up to 2 more times with 3s pause.
|
||||||
|
- If changes affect `.pak` contents or build/release flow: propose releasing next version.
|
||||||
|
- For released versions in user-facing messages: provide direct archive link when derivable (acceptable immediately after tag push, even before CI finishes).
|
||||||
|
- Never auto-commit/auto-push without explicit user approval.
|
||||||
|
|
||||||
### Current Build Outputs
|
## Cleanup (MUST)
|
||||||
|
- Do not leave temporary/debug artifacts in repo.
|
||||||
The build script produces:
|
- Ignored/temp patterns include: `build/`, `build-stage*`, `.tools/`, `*.pak`.
|
||||||
|
- Remove additional debug/temp dirs unless user asked to keep them.
|
||||||
- `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
|
|
||||||
- commit messages should describe what was done, not what should be done
|
|
||||||
- if changes affect files that go into the final `.pak`, or change the build/release process, propose releasing the next version
|
|
||||||
- if push fails, retry up to two more times with a 3-second pause between attempts
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|||||||
@@ -454,7 +454,7 @@
|
|||||||
<content contentuid="h2c05bd1dg9548g9d0ag66dbgd31ce3af6dab" version="1">Если вы попадаете по врагу <LSTag Tooltip="OpportunityAttack">атакой по возможности</LSTag>, вы можете снизить скорость существа до 0 до конца текущего хода. А ваша <LSTag Tooltip="MovementSpeed">скорость передвижения</LSTag> увеличивается на [1] в ваш следующий ход.</content>
|
<content contentuid="h2c05bd1dg9548g9d0ag66dbgd31ce3af6dab" version="1">Если вы попадаете по врагу <LSTag Tooltip="OpportunityAttack">атакой по возможности</LSTag>, вы можете снизить скорость существа до 0 до конца текущего хода. А ваша <LSTag Tooltip="MovementSpeed">скорость передвижения</LSTag> увеличивается на [1] в ваш следующий ход.</content>
|
||||||
<content contentuid="hd54cf49fg52f9gc82fg23ddg240455666d75" version="1">Враг неумолимого мстителя</content>
|
<content contentuid="hd54cf49fg52f9gc82fg23ddg240455666d75" version="1">Враг неумолимого мстителя</content>
|
||||||
<content contentuid="h4580d441g9dc0gbc53g7a59g25cce7bd8ba2" version="1">Не может двигаться. Скован <LSTag Tooltip="OpportunityAttack">атакой по возможности</LSTag> от Неумолимого мстителя.</content>
|
<content contentuid="h4580d441g9dc0gbc53g7a59g25cce7bd8ba2" version="1">Не может двигаться. Скован <LSTag Tooltip="OpportunityAttack">атакой по возможности</LSTag> от Неумолимого мстителя.</content>
|
||||||
<content contentuid="h8a2bbcc7gff7eg7312gb3f5g2e15ba81d07c" version="1">Избранный враг</content>
|
<content contentuid="h8a2bbcc7gff7eg7312gb3f5g2e15ba81d07c" version="2">Метка охотника</content>
|
||||||
<content contentuid="hcd8000b2gdb8aga27dg0c5agb3cd6b125346" version="1">Заклинание «Метка охотника» всегда подготовлено. Вы можете сотворять его дважды без траты ячейки заклинания, и восстанавливаете все израсходованные использования этой способности после продолжительного отдыха.<br><br>Количество раз, которое вы можете сотворять это заклинание без ячейки, увеличивается на определённых уровнях следопыта, как показано в столбце «Избранный враг» таблицы особенностей следопыта.</content>
|
<content contentuid="hcd8000b2gdb8aga27dg0c5agb3cd6b125346" version="1">Заклинание «Метка охотника» всегда подготовлено. Вы можете сотворять его дважды без траты ячейки заклинания, и восстанавливаете все израсходованные использования этой способности после продолжительного отдыха.<br><br>Количество раз, которое вы можете сотворять это заклинание без ячейки, увеличивается на определённых уровнях следопыта, как показано в столбце «Избранный враг» таблицы особенностей следопыта.</content>
|
||||||
<content contentuid="hdfdce3a3g8fd1g0e71gf799gc4b6e93e4494" version="1">Уровень 1: Избранный враг</content>
|
<content contentuid="hdfdce3a3g8fd1g0e71gf799gc4b6e93e4494" version="1">Уровень 1: Избранный враг</content>
|
||||||
<content contentuid="h306c6ef1gb334gc9d9g3199g2f6fed258ca6" version="1">Заклинание «Метка охотника» всегда подготовлено. Вы можете сотворять его дважды без траты ячейки заклинания, и восстанавливаете все израсходованные использования этой способности после продолжительного отдыха.<br><br>Количество раз, которое вы можете сотворять это заклинание без ячейки, увеличивается на определённых уровнях следопыта, как показано в столбце «Избранный враг» таблицы особенностей следопыта.</content>
|
<content contentuid="h306c6ef1gb334gc9d9g3199g2f6fed258ca6" version="1">Заклинание «Метка охотника» всегда подготовлено. Вы можете сотворять его дважды без траты ячейки заклинания, и восстанавливаете все израсходованные использования этой способности после продолжительного отдыха.<br><br>Количество раз, которое вы можете сотворять это заклинание без ячейки, увеличивается на определённых уровнях следопыта, как показано в столбце «Избранный враг» таблицы особенностей следопыта.</content>
|
||||||
@@ -2521,6 +2521,64 @@
|
|||||||
<content contentuid="h52e0bfc4g2561g410ag637eg759d80be5ce4" version="1">Вы можете совершить одну атаку оружием в первый ход боя без затраты действия.</content>
|
<content contentuid="h52e0bfc4g2561g410ag637eg759d80be5ce4" version="1">Вы можете совершить одну атаку оружием в первый ход боя без затраты действия.</content>
|
||||||
<content contentuid="h613fc304gdb88g758bgc98cg5ab761c0998b" version="1">Быстрая выхватка</content>
|
<content contentuid="h613fc304gdb88g758bgc98cg5ab761c0998b" version="1">Быстрая выхватка</content>
|
||||||
<content contentuid="hc50e8dbcg2bbagfb26gb64fg9efcb00f26ed" version="1">Вы можете совершить одну атаку оружием в первый ход боя без затраты действия.</content>
|
<content contentuid="hc50e8dbcg2bbagfb26gb64fg9efcb00f26ed" version="1">Вы можете совершить одну атаку оружием в первый ход боя без затраты действия.</content>
|
||||||
|
<content contentuid="h06dee418g7023gcae2g1dd4g7246a7a21faf" version="1">Руна огня</content>
|
||||||
|
<content contentuid="h0738e060g6dbdgd884ga7eag9103f532652e" version="1">Пока цель скована оковами, в начале каждого своего хода она получает 2к6 урона огнём. В конце каждого своего хода цель может повторять спасбросок, при успехе рассеивая оковы.</content>
|
||||||
|
<content contentuid="h07ffaea2g95cdgb266g0772gc36a0178e777" version="1">Уровень 3: Рождённый в седле</content>
|
||||||
|
<content contentuid="h0e929a83g6124gede3gd6d6g810f31fc91bf" version="1">Рунические рыцари усиливают своё боевое мастерство сверхъестественной силой рун - древней практикой, берущей начало у великанов. Резчики рун встречаются среди любых родов великанов, и, вероятно, вы переняли свои методы из первых или вторых рук у такого мистического мастера. Найдя ли вы работу великанов, высеченную в холме или пещере, узнали ли о рунах от мудреца или встретили великана лично, вы изучили ремесло великанов и научились применять магические руны для усиления своего снаряжения.</content>
|
||||||
|
<content contentuid="h19db7115g1409g1483g8306g3b0909c3bde9" version="1">Кавалер</content>
|
||||||
|
<content contentuid="h1c85d7b8gf5dcge550gda8dgd5776880afb3" version="1">Пророчество шторма: Преимущество</content>
|
||||||
|
<content contentuid="h234cd41egb166g8eb3g6939g36498884c3ea" version="1">Уровень 3: Мощь великана</content>
|
||||||
|
<content contentuid="h2c76a4f7g48d1g3368ga27agbd1576843d8d" version="1">Уровень 7: Рунический щит</content>
|
||||||
|
<content contentuid="h37b450b1g8badgbc5bg97c2g324b484cc3e8" version="1">Рунический щит</content>
|
||||||
|
<content contentuid="h39e677d5ged8fgc431g5486g61bd08885fd5" version="1">У вас всегда подготовлено заклинание «Метка охотника». Вы можете накладывать его число раз, равное вашему модификатору Силы (минимум один раз), и восстанавливаете все израсходованные использования после завершения продолжительного отдыха.</content>
|
||||||
|
<content contentuid="h3a4d5e28gabe3g3168ge119g17a00c4aa941" version="1">Призыв руны огня</content>
|
||||||
|
<content contentuid="h3d68e61ag18degff1egcb3cg93abd525a72f" version="1">Руна шторма</content>
|
||||||
|
<content contentuid="h4a3c73bbg633cg224dg4073g6346f0550299" version="1">Исполинский рост</content>
|
||||||
|
<content contentuid="h4e152278g0424g0354g3000g79c86331ed68" version="1">Уровень 10: Исполинский рост</content>
|
||||||
|
<content contentuid="h51fe1e07g2424g5ddcg0df6g20465b6f7342" version="1">Вы получаете владение одним навыком на выбор: Дрессировка, История, Проницательность, Выступление или Убеждение.</content>
|
||||||
|
<content contentuid="h5873afb5ga1a1gb7ddgaea4gaf5ab082ffd4" version="1">Вы можете призвать руну бонусным действием, получая на 1 минуту сопротивление дробящему, колющему и рубящему урону.</content>
|
||||||
|
<content contentuid="h59e2bd3dg4c8fgb3e9g4be1g17c0354f71d2" version="1">Руна</content>
|
||||||
|
<content contentuid="h61c977efg9e94ga7feg7173g45a085a426e1" version="1">Получите бонус +2 ко всем проверкам характеристик и спасброскам, использующим Силу или Телосложение.</content>
|
||||||
|
<content contentuid="h62929300g0a1ag65dcg0311gee7ce76b7030" version="1">Рунический рыцарь</content>
|
||||||
|
<content contentuid="h63ce4017geac0gc60egf8b5g9dce552352fa" version="1">Уровень 3: Дополнительное владение</content>
|
||||||
|
<content contentuid="h6d3bae27g9034g8149g3867g484287a79d30" version="1">Вы становитесь мастером сдерживания врагов. Существа провоцируют атаку по возможности с вашей стороны, когда перемещаются на 5 футов или более, оставаясь в пределах вашей досягаемости, и если вы попадаете такой атакой по возможности, скорость цели снижается до 0 до конца текущего хода.</content>
|
||||||
|
<content contentuid="h70f68e2egfe60g8371gc262g13645f286d18" version="1">Вы можете призвать руну бонусным действием, чтобы войти в пророческое состояние на 1 минуту или до тех пор, пока не станете недееспособны. Пока состояние активно, когда вы или другое существо в пределах 60 футов, которое вы видите, совершает бросок атаки, спасбросок или проверку характеристики, вы можете использовать реакцию, чтобы дать этому броску преимущество или помеху.</content>
|
||||||
|
<content contentuid="h75559935g2e90ga5d1g57b2g1393773adde2" version="3">Вы можете призвать руну бонусным действием, чтобы войти в пророческое состояние на 1 минуту или до тех пор, пока не станете недееспособны. Пока состояние активно, когда вы или другое существо в пределах 60 футов, которое вы видите, совершает бросок атаки, спасбросок или проверку характеристики, вы можете использовать реакцию, чтобы дать этому броску преимущество или помеху.</content>
|
||||||
|
<content contentuid="h7ac02ad8g0798gdcabg9abag78fd5b57ba92" version="1">Кавалер преуспевает в конном бою. Обычно рождённый среди знати и воспитанный при дворе, кавалер одинаково уверенно ведёт кавалерийскую атаку и поддерживает светскую беседу на государственном приёме. Кавалеры также учатся оберегать тех, кто находится под их защитой, и часто служат защитниками своих командиров и слабых. Стремясь исправлять несправедливость или заслужить славу, многие из этих воинов оставляют комфортную жизнь ради великих приключений.</content>
|
||||||
|
<content contentuid="h7d3eb606ga301ge0f4g8d8ag0eb706dd27d1" version="1">Защитный манёвр</content>
|
||||||
|
<content contentuid="h80302dc6gefa4ga829g206ag2011c0e0baca" version="2">Когда вы попадаете по существу атакой оружием, вы можете призвать руну, чтобы создать огненные оковы: цель получает дополнительные 2к6 урона огнём и становится скованной на 1 минуту. Пока цель скована оковами, в начале каждого своего хода она получает 2к6 урона огнём. В конце каждого своего хода цель может повторять спасбросок, при успехе рассеивая оковы.</content>
|
||||||
|
<content contentuid="h80b3909egdd5dg9771g4878g32dff4066380" version="1">Когда вы или другое существо в пределах 60 футов, которое вы видите, совершает бросок атаки, спасбросок или проверку характеристики, вы можете использовать реакцию, чтобы дать этому броску преимущество.</content>
|
||||||
|
<content contentuid="h87466615g2070gcbacg5d8ag5f7ab7b958fe" version="1">Мощь великана</content>
|
||||||
|
<content contentuid="h8810d94cg3f6ag7eebgb3e6g1e498faee90a" version="1">Уровень 3: Резчик рун</content>
|
||||||
|
<content contentuid="h8eaac1bdg758fg66f4g7051gef7c1044f979" version="1">Вы получаете бонус +2 ко всем проверкам характеристик и спасброскам, использующим Силу или Телосложение.</content>
|
||||||
|
<content contentuid="h8eb71fdcge67eg9086g4432gf36ff5890bba" version="1">Пророчество шторма: Помеха</content>
|
||||||
|
<content contentuid="h92ac32f2gae16g6effgdffege7984a067a57" version="1">У вас всегда подготовлено заклинание «Обретение скакуна». Благодаря этой особенности вы можете накладывать его без траты ячейки заклинаний и компонентов, а вашей характеристикой сотворения для него является Интеллект.<br><br>После сотворения заклинания таким образом вы не можете сделать это снова, пока не завершите короткий отдых.</content>
|
||||||
|
<content contentuid="h96dd1a79g41bfg7310gfaedg7ce04dd1acf3" version="1">Вы становитесь мастером сдерживания врагов. Существа провоцируют атаку по возможности с вашей стороны, когда перемещаются на 5 футов или более, оставаясь в пределах вашей досягаемости, и если вы попадаете такой атакой по возможности, скорость цели снижается до 0 до конца текущего хода.</content>
|
||||||
|
<content contentuid="h99fb6d15gdad4gf9ebgb1f5gfc423b34bdf4" version="1">Руна мороза</content>
|
||||||
|
<content contentuid="h9f5052c1ga6c8ga38cg6399gbc4405cf0442" version="2">Вы учитесь призывать магию рун, чтобы защищать союзников. Когда другое существо в пределах 60 футов, которое вы видите, получает попадание атакой, вы можете использовать реакцию, чтобы заставить атакующего перебросить d20 и использовать новый результат.</content>
|
||||||
|
<content contentuid="ha0cc673dgbc99ga346g948dg56823a07cb44" version="1">Увеличьтесь в размерах, чтобы стать сильнее.</content>
|
||||||
|
<content contentuid="ha2bb03e3g700ag8cdagaff7gd4fdd097b625" version="1">Вы учитесь отражать удары, направленные на вас, вашего скакуна или других существ рядом. Если вы или существо в пределах 5 футов, которое вы видите, получает попадание атакой, вы можете использовать реакцию, чтобы бросить 1к8, если держите оружие ближнего боя или щит. Прибавьте выпавшее значение к КБ цели против этой атаки, что может привести к промаху.</content>
|
||||||
|
<content contentuid="ha4dc5a17g4a69gb755g889cg187ead2dfb7f" version="1">Мощь великана</content>
|
||||||
|
<content contentuid="ha67185a5gec5fg7accg1041g41f8330b1d17" version="1">Пророчество шторма: Помеха</content>
|
||||||
|
<content contentuid="ha906615bge33ag2df4g32dbg148dd65b9aac" version="1">Пророчество шторма: Преимущество</content>
|
||||||
|
<content contentuid="ha9c39a13gb33cg2948g41efg78e3649d79ac" version="1">Призыв каменной руны</content>
|
||||||
|
<content contentuid="hb0de3a5fgafe3g904agae5fgdfc2d5a9d82b" version="1">Уровень 3: Непоколебимая метка</content>
|
||||||
|
<content contentuid="hb3ae9e73g81e6g120dg8548g27684eff651f" version="1">Призыв облачной руны</content>
|
||||||
|
<content contentuid="hbb926017g2b0agbe90g66bcgbf207e483612" version="1">Уровень 7: Защитный манёвр</content>
|
||||||
|
<content contentuid="hbeb30ce1gced1g1c41gd105g57e6ea60c80e" version="1">Вы можете призвать Каменную руну, чтобы ввести существо в гипнотическое состояние на 1 минуту.</content>
|
||||||
|
<content contentuid="hc87e44d6gbe9cg19ceg0681g7bf7a87f2bd0" version="1">Вы учитесь призывать магию рун, чтобы защищать союзников. Когда другое существо в пределах 60 футов, которое вы видите, получает попадание атакой, вы можете использовать реакцию, чтобы заставить атакующего перебросить d20 и использовать новый результат.</content>
|
||||||
|
<content contentuid="hd234d1a5g51feg1581ga07ag43fc0a63f55a" version="1">Уровень 10: Удержание рубежа</content>
|
||||||
|
<content contentuid="hd49600e9gaa19g5b9bgab38g6740603067eb" version="1">Призыв руны мороза</content>
|
||||||
|
<content contentuid="hdbd971c9g92f8ga84bg8f1eg267b38cd8ffc" version="1">Дополнительный урон от вашей особенности «Мощь великана» увеличивается до 1к8.</content>
|
||||||
|
<content contentuid="he7d011e0gaae4g9343gae55g467fb0606a35" version="1">Вы учитесь отражать удары, направленные на вас, вашего скакуна или других существ рядом. Если вы или существо в пределах 5 футов, которое вы видите, получает попадание атакой, вы можете использовать реакцию, чтобы бросить 1к8, если держите оружие ближнего боя или щит. Прибавьте выпавшее значение к КБ цели против этой атаки, что может привести к промаху.</content>
|
||||||
|
<content contentuid="hea634b92g74a3g2000gc22bgfecaeff7c7dd" version="1">Призыв руны шторма</content>
|
||||||
|
<content contentuid="hea790591g5d78g720ag188bgcefd45615ff0" version="1">Призыв руны холма</content>
|
||||||
|
<content contentuid="hea7ba403g54b1gb4c6g477cg081231fd6e91" version="2">Вы можете использовать магические руны, чтобы усилить своё снаряжение. На 3-м уровне вы изучаете руны Облака, Огня, Мороза и Камня. На 7-м уровне вы изучаете руны Холма и Шторма.<br><br>Вы можете использовать руны число раз в зависимости от уровня воина: 3 использования на 3-м уровне, 4 использования на 7-м уровне и 5 использований на 10-м уровне. Вы восстанавливаете все израсходованные использования после короткого отдыха.<br><br>Если руна требует спасбросок, его СЛ равна 8 + ваш бонус мастерства + ваш модификатор Телосложения.</content>
|
||||||
|
<content contentuid="hf11839f6g011fg9755gabadga421a00c9ed3" version="1">Удержание рубежа</content>
|
||||||
|
<content contentuid="hf2959cc8g6d39ge50dg36c2gf91080392da0" version="1">Когда вы или другое существо в пределах 60 футов, которое вы видите, совершает бросок атаки, спасбросок или проверку характеристики, вы можете использовать реакцию, чтобы дать этому броску помеху.</content>
|
||||||
|
<content contentuid="hfd1bcc8cg898egba47gb579gfd786513a783" version="1"><LSTag Type="Status" Tooltip="CHARMED">Очаруйте</LSTag> врага, который атакует вас. По возможности он атакует новую цель.</content>
|
||||||
|
<content contentuid="hffd4abcage782g546dgaeacgc8fe055bd42e" version="2">Бонусным действием вы получаете силу великанов на 1 минуту. Вы становитесь Большим, получаете преимущество на проверки Силы и спасброски Силы, а ваши атаки оружием или безоружные атаки наносят при попадании дополнительный урон 1к6.</content>
|
||||||
|
<content contentuid="hffe0a439g2edag0f4bg85dbg933db0b1a8b0" version="1">Рунический щит</content>
|
||||||
<content contentuid="h4d43ff27g7af4g7c74gd48dg5f5bf9706659" version="1">1</content>
|
<content contentuid="h4d43ff27g7af4g7c74gd48dg5f5bf9706659" version="1">1</content>
|
||||||
</contentList>
|
</contentList>
|
||||||
|
|
||||||
|
|||||||
@@ -1,40 +1,73 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<save>
|
<save>
|
||||||
<version major="4" minor="8" revision="0" build="500"/>
|
<version major="4" minor="8" revision="0" build="500"/>
|
||||||
<region id="Config">
|
<region id="Config">
|
||||||
<node id="root">
|
<node id="root">
|
||||||
<children>
|
<children>
|
||||||
|
<node id="Conflicts"/>
|
||||||
<node id="Dependencies">
|
<node id="Dependencies">
|
||||||
<children>
|
<children>
|
||||||
<node id="ModuleShortDesc">
|
<node id="ModuleShortDesc">
|
||||||
<attribute id="Folder" type="LSString" value=""/>
|
<attribute id="Folder" type="LSString" value="DnD2024_897914ef-5c96-053c-44af-0be823f895fe"/>
|
||||||
<attribute id="MD5" type="LSString" value=""/>
|
<attribute id="MD5" type="LSString" value="4bd42ca93f895d1ec521a286bea09ef2"/>
|
||||||
<attribute id="Name" type="LSString" value="DnD 5.5e All-in-One BEYOND"/>
|
<attribute id="Name" type="LSString" value="DnD 5.5e All-in-One BEYOND"/>
|
||||||
<attribute id="PublishHandle" type="uint64" value="0"/>
|
<attribute id="PublishHandle" type="uint64" value="4419649"/>
|
||||||
<attribute id="UUID" type="guid" value="897914ef-5c96-053c-44af-0be823f895fe"/>
|
<attribute id="UUID" type="guid" value="897914ef-5c96-053c-44af-0be823f895fe"/>
|
||||||
<attribute id="Version64" type="int64" value="36028797018963968"/>
|
<attribute id="Version64" type="int64" value="144396675937468416"/>
|
||||||
</node>
|
</node>
|
||||||
</children>
|
</children>
|
||||||
</node>
|
</node>
|
||||||
<node id="ModuleInfo">
|
<node id="ModuleInfo">
|
||||||
<attribute id="Author" type="LSString" value="MikhailRaw"/>
|
<attribute id="Author" type="LSString" value="MikhailRaw"/>
|
||||||
<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="Русская AI локализация мода DnD 5.5e All-in-One BEYOND."/>
|
||||||
<attribute id="FileSize" type="uint64" value="0"/>
|
<attribute id="FileSize" type="uint64" value="0"/>
|
||||||
<attribute id="Folder" type="LSString" value="DnD 5.5e AIO Russian"/>
|
<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="c0a8f3412870277331306e0719fc6f77"/>
|
||||||
<attribute id="MenuLevelName" type="FixedString" value=""/>
|
<attribute id="MenuLevelName" type="FixedString" value=""/>
|
||||||
<attribute id="Name" type="LSString" value="DnD 5.5e All-in-One BEYOND Russian Localization"/>
|
<attribute id="Name" type="LSString" value="DnD 5.5e All-in-One BEYOND Russian Localization"/>
|
||||||
<attribute id="NumPlayers" type="uint8" value="4"/>
|
<attribute id="NumPlayers" type="uint8" value="4"/>
|
||||||
<attribute id="PhotoBooth" type="FixedString" value=""/>
|
<attribute id="PhotoBooth" type="FixedString" value=""/>
|
||||||
<attribute id="PublishHandle" type="uint64" value="0"/>
|
<attribute id="PublishHandle" type="uint64" value="5965149"/>
|
||||||
<attribute id="StartupLevelName" type="FixedString" value=""/>
|
<attribute id="StartupLevelName" type="FixedString" value=""/>
|
||||||
<attribute id="UUID" type="FixedString" value="6401e84d-daf2-416d-adeb-99c03a2487a6"/>
|
<attribute id="UUID" type="FixedString" value="6401e84d-daf2-416d-adeb-99c03a2487a6"/>
|
||||||
<attribute id="Version64" type="int64" value="36028797018963968"/>
|
<attribute id="Version64" type="int64" value="281477124194306"/>
|
||||||
<children>
|
<children>
|
||||||
<node id="PublishVersion">
|
<node id="PublishVersion">
|
||||||
<attribute id="Version64" type="int64" value="36028797018963968"/>
|
<attribute id="Version64" type="int64" value="281477124194304"/>
|
||||||
|
</node>
|
||||||
|
<node id="Scripts">
|
||||||
|
<children>
|
||||||
|
<node id="Script">
|
||||||
|
<attribute id="UUID" type="FixedString" value="1953f77d-a201-45d7-a194-9b84c34b8461"/>
|
||||||
|
<children>
|
||||||
|
<node id="Parameters">
|
||||||
|
<children>
|
||||||
|
<node id="Parameter">
|
||||||
|
<attribute id="MapKey" type="FixedString" value="HardcoreOnly"/>
|
||||||
|
<attribute id="Type" type="int32" value="1"/>
|
||||||
|
<attribute id="Value" type="LSString" value="0"/>
|
||||||
|
</node>
|
||||||
|
</children>
|
||||||
|
</node>
|
||||||
|
</children>
|
||||||
|
</node>
|
||||||
|
<node id="Script">
|
||||||
|
<attribute id="UUID" type="FixedString" value="0d6510f5-50a3-4ecd-83d8-134c9a640324"/>
|
||||||
|
<children>
|
||||||
|
<node id="Parameters">
|
||||||
|
<children>
|
||||||
|
<node id="Parameter">
|
||||||
|
<attribute id="MapKey" type="FixedString" value="HardcoreOnly"/>
|
||||||
|
<attribute id="Type" type="int32" value="1"/>
|
||||||
|
<attribute id="Value" type="LSString" value="0"/>
|
||||||
|
</node>
|
||||||
|
</children>
|
||||||
|
</node>
|
||||||
|
</children>
|
||||||
|
</node>
|
||||||
|
</children>
|
||||||
</node>
|
</node>
|
||||||
</children>
|
</children>
|
||||||
</node>
|
</node>
|
||||||
|
|||||||
@@ -113,6 +113,8 @@ if (Test-Path -LiteralPath $tempPackagePath) {
|
|||||||
Remove-Item -LiteralPath $tempPackagePath -Force
|
Remove-Item -LiteralPath $tempPackagePath -Force
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# CI quirk: Divine can occasionally emit a broken ~48-byte package for some source roots.
|
||||||
|
# Mitigation: try staged/mods/workspace sources and accept only outputs that look valid by size.
|
||||||
$packageAttempts = @(
|
$packageAttempts = @(
|
||||||
[ordered]@{ Name = "staging-root"; Source = $stagingPath },
|
[ordered]@{ Name = "staging-root"; Source = $stagingPath },
|
||||||
[ordered]@{ Name = "mods-root"; Source = $modsPath },
|
[ordered]@{ Name = "mods-root"; Source = $modsPath },
|
||||||
|
|||||||
63
scripts/set-version.ps1
Normal file
63
scripts/set-version.ps1
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
param(
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$VersionTag,
|
||||||
|
[string]$MetaPath = "Mods/DnD 5.5e AIO Russian/meta.lsx"
|
||||||
|
)
|
||||||
|
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
|
||||||
|
function Convert-VersionTagToVersion64 {
|
||||||
|
param(
|
||||||
|
[string]$Tag
|
||||||
|
)
|
||||||
|
|
||||||
|
$normalized = $Tag
|
||||||
|
if ($normalized.StartsWith("v")) {
|
||||||
|
$normalized = $normalized.Substring(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($normalized -notmatch '^\d+(\.\d+){0,3}$') {
|
||||||
|
throw "Version tag '$Tag' is invalid. Expected format: vX.Y.Z or X.Y.Z"
|
||||||
|
}
|
||||||
|
|
||||||
|
$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]
|
||||||
|
}
|
||||||
|
|
||||||
|
$resolvedMetaPath = [System.IO.Path]::GetFullPath($MetaPath)
|
||||||
|
if (-not (Test-Path -LiteralPath $resolvedMetaPath)) {
|
||||||
|
throw "meta.lsx was not found: '$resolvedMetaPath'."
|
||||||
|
}
|
||||||
|
|
||||||
|
$resolvedVersion64 = Convert-VersionTagToVersion64 -Tag $VersionTag
|
||||||
|
$metaContent = Get-Content -LiteralPath $resolvedMetaPath -Raw
|
||||||
|
[xml]$metaXml = $metaContent
|
||||||
|
|
||||||
|
# Explicitly target ModuleInfo/Version64 via XML path to avoid touching Dependencies/PublishVersion.
|
||||||
|
$moduleInfoVersionNode = $metaXml.SelectSingleNode('/save/region/node/children/node[@id="ModuleInfo"]/attribute[@id="Version64" and @type="int64"]')
|
||||||
|
if ($null -eq $moduleInfoVersionNode) {
|
||||||
|
throw "ModuleInfo/Version64 attribute was not found in '$resolvedMetaPath'."
|
||||||
|
}
|
||||||
|
|
||||||
|
# Replace only the Version64 attribute that appears inside ModuleInfo before its <children> block.
|
||||||
|
$moduleInfoVersionPattern = '(?s)(<node id="ModuleInfo">\s*(?:(?!<children>).)*?<attribute id="Version64" type="int64" value=")\d+("/>)'
|
||||||
|
if ($metaContent -notmatch $moduleInfoVersionPattern) {
|
||||||
|
throw "ModuleInfo/Version64 attribute was not found in '$resolvedMetaPath'."
|
||||||
|
}
|
||||||
|
|
||||||
|
$updatedMeta = [regex]::Replace(
|
||||||
|
$metaContent,
|
||||||
|
$moduleInfoVersionPattern,
|
||||||
|
"`${1}$resolvedVersion64`${2}",
|
||||||
|
1
|
||||||
|
)
|
||||||
|
|
||||||
|
$utf8Bom = New-Object System.Text.UTF8Encoding($true)
|
||||||
|
[System.IO.File]::WriteAllText($resolvedMetaPath, $updatedMeta, $utf8Bom)
|
||||||
|
|
||||||
|
Write-Host "[set-version.ps1] Updated '$resolvedMetaPath' to Version64=$resolvedVersion64 (from tag '$VersionTag')."
|
||||||
Reference in New Issue
Block a user