Compare commits

...
Author SHA1 Message Date
admin 42eddebad2 Refocus command guidance on players 2026-07-11 09:45:22 -07:00
admin 011343ad28 Explain Eagle command availability 2026-07-11 09:30:44 -07:00
adminandGitHub fb35514410 Clarify optional Shardok roll argument (#8439) 2026-07-11 09:27:23 -07:00
adminandGitHub 88e9c46fce Refine Issue Orders table layout (#8438) 2026-07-11 08:54:55 -07:00
adminandGitHub 5a8c791e4c Fix links in command detail rows (#8437) 2026-07-11 08:52:01 -07:00
adminandGitHub f80718719c Add cross-links throughout Eagle0pedia (#8436) 2026-07-11 08:39:22 -07:00
adminandGitHub 8f1371dd61 Fix Issue Orders ruler names after revisiting panel (#8435) 2026-07-11 08:28:13 -07:00
adminandGitHub 91244dd06d Clarify diplomacy offer timing (#8434)
* Clarify diplomacy offer timing

* Clarify vassal command documentation
2026-07-11 08:25:22 -07:00
adminandGitHub 5c8811441c Tighten Issue Orders availability docs (#8433) 2026-07-11 08:15:58 -07:00
adminandGitHub 090d440501 Refine Decline Quest panel layout (#8432) 2026-07-11 08:08:32 -07:00
adminandGitHub e123c0fade Document text client operation (#8431) 2026-07-11 08:05:47 -07:00
adminandGitHub da89636165 Compact command help cards (#8428) 2026-07-11 07:50:40 -07:00
adminandGitHub 3eb2607a7a Document Eagle prisoner handling (#8430) 2026-07-11 05:59:02 -07:00
adminandGitHub 51be13b8b1 Document Eagle battle and conquest flow (#8427) 2026-07-10 22:16:42 -07:00
adminandGitHub 90d1cf702f Reconnect text client streams (#8429) 2026-07-10 22:16:18 -07:00
adminandGitHub 6a0162109b Expand province logistics documentation (#8426) 2026-07-10 22:06:41 -07:00
adminandGitHub 25e1fd4f90 Link Eagle command info buttons to pedia (#8405)
* Link Eagle command info buttons to pedia

* Add tooltip to command pedia button

* Show command help on info hover

* Avoid toggling command help on hover

* Let command info button receive hover events

* Handle command info hover on icon

* Show command help on explicit hover

* Use local command info hover help

* Place command info help over map

* Refine command info hover placement

* Initialize command info popup before hover

* Place command help above command panel

* Use screen coordinates for command help placement

* Separate command hover help from warnings

* Add dedicated command info panel

* Show command help text in compact panel

* Simplify command help text layout

* Fit command help text within its card

* Size command help to its content
2026-07-10 22:02:29 -07:00
adminandGitHub 8e30daa63b Track generated text in text client (#8424) 2026-07-10 19:20:33 -07:00
adminandGitHub 311cf6e262 Suppress expected cancelled stream logs (#8425) 2026-07-10 19:20:04 -07:00
adminandGitHub 43ee2bfd1f Add text client march warnings (#8423) 2026-07-10 16:00:26 -07:00
adminandGitHub c358567a3f Classify text client command errors (#8422) 2026-07-10 14:34:56 -07:00
adminandGitHub b142acbf3f Clarify Send Supplies arrival timing (#8421)
* Clarify Send Supplies arrival timing

* Clarify Send Supplies before food consumption
2026-07-10 14:18:34 -07:00
adminandGitHub 5875062bd3 Document Eagle command vigor costs (#8420)
* Document Eagle command vigor costs

* Tighten Eagle vigor cost wording
2026-07-10 14:15:16 -07:00
adminandGitHub 20cf458c61 Clarify March arrival timing (#8419) 2026-07-10 14:04:22 -07:00
adminandGitHub 72c392a2dc Document riot handling consequences (#8418)
* Document riot handling consequences

* Simplify riot crackdown power docs

* Clarify riot charisma source
2026-07-10 13:55:40 -07:00
adminandGitHub bc17291691 Add prestige modifiers for battle outcomes (#8417) 2026-07-10 13:51:48 -07:00
adminandGitHub c2438e093f Clarify faction relationships and destruction (#8416)
* Clarify faction relationships and destruction

* Document free hero recruitment states

* Clarify traveler and outlaw free heroes

* Clarify faction destruction criteria
2026-07-10 13:30:31 -07:00
adminandGitHub 93b639e452 Document province order behavior (#8415)
* Document province order behavior

* Clarify vassal supply shipping orders
2026-07-10 13:14:16 -07:00
adminandGitHub 0adf8b3765 Document Eagle command numeric effects (#8414)
* Document Eagle command numeric effects

* Clarify Divine command recruitment flow
2026-07-10 13:07:25 -07:00
adminandGitHub 931ae4b926 Add Eagle0 concept pages (#8413) 2026-07-10 12:49:44 -07:00
adminandGitHub 59d000f792 Document Shardok command AP costs (#8411)
* Document Shardok command AP costs

* Add Shardok command source map comments

* Trim Shardok command intro copy

* Style Shardok AP cost as command field

* Clarify Shardok archery range rules

* Clarify Shardok movement effect

* Document Shardok command ranges

* Simplify Shardok command intro

* Clarify Shardok command requirements

* Remove redundant Shardok command intro
2026-07-10 11:20:44 -07:00
adminandGitHub a5348a54ee Add text client drop game command (#8412) 2026-07-10 11:08:58 -07:00
adminandGitHub bb777da84a Structure Shardok command reference (#8410) 2026-07-10 10:57:20 -07:00
adminandGitHub 06c76daba2 Polish Eagle command reference layout (#8409)
* Polish Eagle command reference layout

* Fix conditional command heading casing
2026-07-10 10:49:07 -07:00
adminandGitHub ecd0d3605b Resize moving army popup backing (#8408) 2026-07-10 10:44:13 -07:00
adminandGitHub d1160855d4 Gate heartbeat success logs (#8407) 2026-07-10 10:39:53 -07:00
adminandGitHub 700f090331 Make alternating table rows opaque (#8406) 2026-07-10 10:19:26 -07:00
adminandGitHub 390bdcb77f Structure Eagle command reference entries (#8404)
* Structure Eagle command reference entries

* Clarify weather and epidemic target range

* Clarify hero gift loyalty requirement
2026-07-10 09:20:07 -07:00
adminandGitHub 138b00fdc4 Clarify Eagle play area standard layout (#8403) 2026-07-10 09:19:28 -07:00
adminandGitHub d169a38761 Organize Eagle command reference by phase (#8402)
* Organize Eagle command reference by phase

* Use Swear Kinship terminology in Eagle commands

* Group Eagle command reference by phase

* Document Handle Riot as one command

* Add availability notes for conditional commands
2026-07-10 09:08:17 -07:00
adminandGitHub 3c9e01f4b8 Make Eagle0pedia landing page player-facing (#8401) 2026-07-10 08:50:16 -07:00
adminandGitHub 610f32ae5c Remove duplicate Eagle0pedia page headings (#8400) 2026-07-10 08:45:50 -07:00
adminandGitHub e84d608638 Add Eagle0pedia concept reference pages (#8399)
* Add Eagle0pedia concept reference pages

* Expand Eagle0pedia profession reference

* Document faction leader mechanics

* Document hero battle capability thresholds

* Call out profession-restricted commands
2026-07-10 08:40:51 -07:00
adminandGitHub 349e38cad8 Extract Eagle play area prefab (#8398) 2026-07-10 08:32:05 -07:00
adminandGitHub 90796d8932 Use App Platform hosting for Eagle0pedia (#8397) 2026-07-10 08:02:48 -07:00
adminandGitHub d5ac8d0ff1 Extract Eagle command canvas prefab (#8395)
* Extract Eagle command canvas prefab

* Remove unused command panel prefab
2026-07-10 08:00:43 -07:00
adminandGitHub 7df9a7f074 Use scoped Eagle0pedia Spaces credentials (#8396) 2026-07-10 07:28:23 -07:00
adminandGitHub b56665b65b Clean Eagle0pedia deploy artifact staging (#8394)
* Clean Eagle0pedia deploy artifact staging

* Ensure Git LFS before Eagle0pedia checkout

* Use non-LFS checkout for Eagle0pedia deploy
2026-07-10 07:13:03 -07:00
adminandGitHub 6891fe2fce Deploy Eagle0pedia to DigitalOcean Spaces (#8392)
* Add DigitalOcean build wrapper for Eagle0pedia

* Deploy Eagle0pedia from GitHub Actions
2026-07-10 07:03:25 -07:00
adminandGitHub dee7724ec2 Extract Eagle map canvas prefab (#8391) 2026-07-10 06:46:06 -07:00
adminandGitHub caca9e4f6a Add Bazel-built Eagle0pedia Starlight site (#8390) 2026-07-09 22:04:49 -07:00
adminandGitHub fb34a6f3d1 Extract factions and moving armies panel prefab (#8389) 2026-07-09 21:18:29 -07:00
adminandGitHub 2b65a547a1 Add initial Eagle0pedia command reference (#8388) 2026-07-09 21:14:53 -07:00
adminandGitHub 5fd3adcf80 Add normal game creation to text client (#8383) 2026-07-09 20:32:08 -07:00
adminandGitHub 14e8343eaa Return command error for unavailable march origin (#8386) 2026-07-09 20:29:24 -07:00
adminandGitHub 15b870152a Remove per-operation Postgres connection logs (#8385) 2026-07-09 18:54:24 -07:00
adminandGitHub df84625b15 Extract heroes and battalions panel prefab (#8384) 2026-07-09 18:27:39 -07:00
adminandGitHub 7b41d8f4f9 Remove stale Shardok container prefab (#8380) 2026-07-09 17:04:09 -07:00
adminandGitHub b67f6b3ceb Apply Eagle state diffs in text client (#8382) 2026-07-09 13:43:10 -07:00
adminandGitHub e839a60270 Extract chronicle canvas prefab (#8381) 2026-07-09 13:41:53 -07:00
adminandGitHub 2db68d61f2 Extract Popup Column panel prefab (#8378)
* Extract Hero Popup panel prefab

* Rename popup column prefab
2026-07-09 13:27:02 -07:00
adminandGitHub 455d6c1aff Show known Shardok units in text client (#8379) 2026-07-09 13:23:00 -07:00
adminandGitHub 1b6df9fa62 Extract Command Warning panel prefab (#8377) 2026-07-09 13:03:53 -07:00
adminandGitHub 74052faecf Fix tutorial Tarn disappearance after reappearance (#8376)
* Fix tutorial Tarn disappearance after reappearance

* Cover unaffiliated tutorial Tarn disappearance
2026-07-09 12:38:13 -07:00
adminandGitHub aaa890ed8a Borrow Postgres text connections per operation (#8375) 2026-07-09 12:06:41 -07:00
adminandGitHub 775b0a915b Extract Ransom Offer panel prefab (#8374) 2026-07-09 12:06:08 -07:00
adminandGitHub c489ae1511 Borrow Postgres history connections per operation (#8373) 2026-07-09 11:09:58 -07:00
adminandGitHub 6274ba4195 Pool Postgres connections behind provider (#8372)
* Pool Postgres connections behind provider

* Use smaller production Postgres pool default
2026-07-09 10:47:54 -07:00
adminandGitHub 09a2f0bf30 Extract Please Recruit Me panel prefab (#8371) 2026-07-09 10:39:15 -07:00
adminandGitHub 0f89f7a2ea Surface Eagle warmup startup failures (#8370) 2026-07-09 10:06:23 -07:00
adminandGitHub 29c1d4a232 Unload idle games to reduce Postgres pressure (#8369) 2026-07-09 09:57:06 -07:00
adminandGitHub 043166c35b Extract notification panel prefab (#8367)
* Extract notification panel prefab

* Handle stale Unity missing prefab logs

* Fix notification panel prefab import
2026-07-09 09:10:00 -07:00
adminandGitHub a69cee40d3 Limit tutorial battle config to opening battle (#8368) 2026-07-09 09:04:30 -07:00
adminandGitHub f6192d408e Tweak battle progress row layout (#8366) 2026-07-09 08:11:16 -07:00
adminandGitHub 688fea67af Extract province info panel prefab (#8365) 2026-07-09 06:53:57 -07:00
adminandGitHub 73748072b5 Extract diplomacy offer panels to prefabs (#8364) 2026-07-08 22:05:38 -07:00
adminandGitHub 92e7482c92 Fix Ransom slider handle (#8358) 2026-07-08 21:49:46 -07:00
adminandGitHub 9e47778bdd Extract Dominion view panels into prefabs (#8362)
* Extract dominion view panels into prefabs

* Fix narrow Dominion panel toggle callback

* Align narrow Dominion ruler names left
2026-07-08 17:02:03 -07:00
adminandGitHub 8bbf0ba6d5 Mark ended games terminal (#8360) 2026-07-08 15:15:14 -07:00
adminandGitHub 2e2f24596a Extract battle progress panel prefab (#8359) 2026-07-08 15:04:41 -07:00
adminandGitHub 7f2acd73ad Fix March slider handles (#8357) 2026-07-08 13:20:20 -07:00
adminandGitHub 4a081a691d Fix battle aftermath slider handles (#8356) 2026-07-08 13:03:40 -07:00
adminandGitHub bf60a59fbd Fix Handle Riot Give slider handles (#8355) 2026-07-08 12:41:24 -07:00
adminandGitHub d08fe34434 Clarify loyalty management decision reasons (#8354) 2026-07-08 12:33:16 -07:00
adminandGitHub 31904a2bb4 Fix Give Alms slider layout (#8353)
* Fix Give Alms slider layout

* Adjust Give Alms slider spacing
2026-07-08 12:32:29 -07:00
adminandGitHub 0b870de473 Make Send Supplies sliders touch-friendly (#8350)
* Make Send Supplies sliders touch-friendly

* Fix Send Supplies slider control layout

* Align Send Supplies sliders

* Widen Send Supplies slider rows

* Refine Send Supplies slider layout
2026-07-08 11:53:59 -07:00
adminandGitHub 0ac81eadec Expose Shardok commands in text client (#8352) 2026-07-08 11:45:34 -07:00
adminandGitHub 0aa7edbb06 Route tutorial create requests to tutorial games (#8351) 2026-07-08 11:20:59 -07:00
adminandGitHub 0950fecb2e Support bearer token auth in Eagle text client (#8348)
* Support bearer token auth in Eagle text client

* Fix tutorial creation in text client
2026-07-08 10:59:18 -07:00
adminandGitHub 2eace68955 Preserve AI selector reasons in logs (#8349) 2026-07-08 10:47:33 -07:00
adminandGitHub c048b8ed2f Add Eagle text client (#8347) 2026-07-08 10:40:34 -07:00
adminandGitHub 83de80c73d Throttle AI leader relocation marches (#8346) 2026-07-08 10:36:51 -07:00
adminandGitHub 9d83e48371 Disable unavailable recommended config button (#8345) 2026-07-08 10:22:55 -07:00
adminandGitHub f02ea4b1ad Show attacker origins on battle progress rows (#8341)
* Show battle attacker origins in progress rows

* Refine battle progress origin labels

* Improve battle progress province label contrast

* Use plain battle progress province labels

* Stabilize battle progress row layout

* Widen battle progress thermometer

* Remove battle progress origin prefix
2026-07-08 10:01:56 -07:00
adminandGitHub b56607cfb6 Export admin save DB from SQLite snapshot (#8344) 2026-07-08 09:59:02 -07:00
adminandGitHub caf21766a9 Use decision log snapshot for save exports (#8343) 2026-07-08 09:12:46 -07:00
adminandGitHub c6cfda11ec Import decision logs into save export db (#8342)
* Import decision logs into save export db

* Add admin export decision record dependency
2026-07-08 08:50:49 -07:00
adminandGitHub cf2071f3b1 Copy history rows for Postgres save exports (#8340) 2026-07-08 08:33:59 -07:00
adminandGitHub 38a73e0de3 Add Attack Decision tribute slider controls (#8337)
* Add Attack Decision tribute slider controls

* Use plain Attack Decision slider button icons
2026-07-08 08:18:19 -07:00
adminandGitHub 3613949d7e Compact admin save exports (#8339) 2026-07-08 08:03:53 -07:00
adminandGitHub e26e18670b Persist decision records in game db (#8338) 2026-07-08 07:43:10 -07:00
adminandGitHub a22fad2487 Log unified command decisions (#8336) 2026-07-08 07:25:21 -07:00
adminandGitHub 53c84e030e Adjust Handle Riot Crack Down layout (#8335) 2026-07-08 07:04:41 -07:00
adminandGitHub e7285b6000 Use Handle Riot command panel prefabs (#8334) 2026-07-08 06:48:24 -07:00
adminandGitHub efc518a74a Use prefab for Travel command panel (#8331) 2026-07-07 21:38:04 -07:00
adminandGitHub 483657d520 Use Resolve Tribute command panel prefab (#8333) 2026-07-07 20:03:10 -07:00
adminandGitHub af1eb2113a Imprison boxed-in alliance ambassadors (#8332) 2026-07-07 19:39:36 -07:00
adminandGitHub 0b52492d92 Record structured AI decision reasons (#8330) 2026-07-07 19:29:13 -07:00
adminandGitHub fdb1e9b338 Offer truces for shaky hostile borders (#8326) 2026-07-07 19:25:18 -07:00
adminandGitHub cef5a16f05 Tighten Improve panel prefab layout (#8329) 2026-07-07 19:23:58 -07:00
adminandGitHub d973746917 Include AI logs in game save downloads (#8328) 2026-07-07 19:23:29 -07:00
adminandGitHub 9063fe0468 Fix Arm Troops max button label layout (#8327) 2026-07-07 19:05:53 -07:00
adminandGitHub 20e8063185 Extract peace offer expansion check (#8325)
* Extract peace offer expansion check

* Rename peace expansion helper
2026-07-07 18:41:05 -07:00
adminandGitHub 482634a7c7 Prefer development over generic border training (#8324) 2026-07-07 18:38:41 -07:00
adminandGitHub b2f02dfdcd Move Arm Troops touch layout into prefab (#8323)
* Move Arm Troops touch layout into prefab

* Refine Arm Troops prefab layout

* Fix Arm Troops available summary layout

* Polish Arm Troops prefab spacing
2026-07-07 18:36:01 -07:00
adminandGitHub 36ddd24ce1 Fix Hero Gift province dropdown template (#8322)
* Fix Hero Gift province dropdown template

* Refine Hero Gift panel layout
2026-07-07 16:13:06 -07:00
adminandGitHub 7b9d01678d Use Swear Brotherhood command panel prefab (#8320) 2026-07-07 14:20:02 -07:00
adminandGitHub 5bb59f8dff Tune AI loyalty Feast and Gift choices (#8321)
* Cover human-style loyalty maintenance choices

* Implement human-style loyalty maintenance choices
2026-07-07 12:43:23 -07:00
adminandGitHub 107ffe0e09 Use Suppress Beasts command panel prefab in scene (#8319) 2026-07-07 12:41:32 -07:00
adminandGitHub c7d33a479b Prefer Feast over Rest for comfortable AI provinces (#8316)
* Prefer feast over rest for comfortable AI provinces

* Sync Bazel Xcode config before CI builds

* Sync Xcode config in server build scripts

* Gate feast preference on loyalty benefit

* Move Bazel test workflow sync to separate PR

* Keep CI Xcode sync out of Feast PR
2026-07-07 11:37:47 -07:00
adminandGitHub c5400544b0 Sync Bazel Xcode config before Bazel tests (#8318)
* Sync Bazel Xcode config before Bazel tests

* Sync Xcode config across Bazel CI paths
2026-07-07 11:37:09 -07:00
adminandGitHub 76a797a663 Tweak Handle Captured Hero layout (#8298)
* Tweak Handle Captured Hero layout

* Fix captured hero action icon sizing
2026-07-07 11:36:48 -07:00
adminandGitHub d42308a2cd Use Start Epidemic command panel prefab in scene (#8317) 2026-07-07 10:37:24 -07:00
adminandGitHub bfa6f5c5ed Use Return command panel prefab in scene (#8315) 2026-07-07 09:33:14 -07:00
adminandGitHub c93ac21b90 Use Recruit Heroes command panel prefab in scene (#8312) 2026-07-07 07:48:00 -07:00
adminandGitHub 2132355a7b Use Recon command panel prefab in scene (#8311) 2026-07-07 07:28:08 -07:00
adminandGitHub ec9ef43868 Use Issue Orders command panel prefab in scene (#8310) 2026-07-07 07:00:16 -07:00
adminandGitHub f33c455ecf Use Ransom command panel prefab in scene (#8307) 2026-07-07 06:46:43 -07:00
adminandGitHub 266ddf5570 Use Improve command panel prefab in scene (#8306) 2026-07-06 18:39:00 -07:00
adminandGitHub 5e31e3ff6b Use prefab for Hero Gift panel (#8305)
* Use prefab for Hero Gift panel

* Fix Hero Gift slider controls

* Refine Hero Gift slider spacing

* Remove duplicate Hero Gift button circles

* Match Hero Gift button art to Trade

* Default Hero Gift province dropdown to lone province
2026-07-06 15:15:15 -07:00
190 changed files with 154429 additions and 207633 deletions
+4
View File
@@ -15,6 +15,7 @@ on:
- '.clang-tidy'
- 'scripts/run-clang-tidy.sh'
- 'scripts/check_shardok_clang_tidy.sh'
- 'scripts/sync_bazel_xcode.sh'
- '.github/actions/setup-bazel/**'
- '.github/workflows/bazel_test.yml'
- '!src/main/csharp/**'
@@ -32,6 +33,7 @@ on:
- '.clang-tidy'
- 'scripts/run-clang-tidy.sh'
- 'scripts/check_shardok_clang_tidy.sh'
- 'scripts/sync_bazel_xcode.sh'
- '.github/actions/setup-bazel/**'
- '.github/workflows/bazel_test.yml'
- '!src/main/csharp/**'
@@ -120,6 +122,8 @@ jobs:
lfs: false
- name: Setup Bazel
uses: ./.github/actions/setup-bazel
- name: Sync Bazel Xcode config
run: ./scripts/sync_bazel_xcode.sh
- name: Run tests
run: bazel test --build_event_json_file=test.json //src/test/... //src/main/go/...
- name: Summarize Bazel build metrics
+6
View File
@@ -19,6 +19,7 @@ on:
- 'src/main/resources/**'
- 'ci/BUILD.bazel'
- 'ci/github_actions/ensure_bazel_installed.sh'
- 'scripts/sync_bazel_xcode.sh'
- '.github/actions/setup-bazel/**'
- 'MODULE.bazel'
- 'MODULE.bazel.lock'
@@ -41,6 +42,7 @@ on:
- 'ci/BUILD.bazel'
- 'ci/github_actions/ensure_bazel_installed.sh'
- 'ci/github_actions/fetch_lfs.sh'
- 'scripts/sync_bazel_xcode.sh'
- '.github/actions/setup-bazel/**'
- 'go.mod'
- 'go.sum'
@@ -125,6 +127,10 @@ jobs:
if: steps.check-latest.outputs.skip != 'true'
uses: ./.github/actions/setup-bazel
- name: Sync Bazel Xcode config
if: steps.check-latest.outputs.skip != 'true'
run: ./scripts/sync_bazel_xcode.sh
- name: Fetch LFS files needed for admin server
if: steps.check-latest.outputs.skip != 'true'
env:
+86
View File
@@ -0,0 +1,86 @@
name: Eagle0pedia Build
on:
push:
branches: [ "main" ]
paths:
- 'docs/eagle0pedia/**'
- 'ci/github_actions/ensure_bazel_installed.sh'
- '.github/actions/setup-bazel/**'
- '.github/workflows/eagle0pedia_build.yml'
- 'MODULE.bazel'
- 'MODULE.bazel.lock'
- '.bazelrc'
pull_request:
paths:
- 'docs/eagle0pedia/**'
- 'ci/github_actions/ensure_bazel_installed.sh'
- '.github/actions/setup-bazel/**'
- '.github/workflows/eagle0pedia_build.yml'
- 'MODULE.bazel'
- 'MODULE.bazel.lock'
- '.bazelrc'
workflow_dispatch:
permissions:
contents: read
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
jobs:
build:
runs-on: [self-hosted, bazel]
steps:
- name: Prepare workspace
run: |
chmod -R u+w eagle0pedia-dist 2>/dev/null || true
rm -rf eagle0pedia-dist
- name: Prepare non-LFS checkout
env:
GIT_CONFIG_GLOBAL: ${{ runner.temp }}/gitconfig-no-lfs
GIT_CONFIG_NOSYSTEM: "1"
run: |
git config --global --unset-all filter.lfs.process || true
git config --global filter.lfs.smudge "cat"
git config --global filter.lfs.clean "cat"
git config --global filter.lfs.required false
if [ -d ".git" ]; then
git config --local --unset-all filter.lfs.process || true
git config --local filter.lfs.smudge "cat"
git config --local filter.lfs.clean "cat"
git config --local filter.lfs.required false
fi
rm -f .git/hooks/post-checkout .git/hooks/post-merge .git/hooks/pre-push
- name: Checkout repository
uses: actions/checkout@v6
env:
GIT_CONFIG_GLOBAL: ${{ runner.temp }}/gitconfig-no-lfs
GIT_CONFIG_NOSYSTEM: "1"
with:
persist-credentials: false
lfs: false
- name: Setup Bazel
uses: ./.github/actions/setup-bazel
- name: Build Eagle0pedia
run: bazel build //docs/eagle0pedia:site
- name: Stage static site artifact
run: |
rm -rf eagle0pedia-dist
mkdir -p eagle0pedia-dist
cp -R bazel-bin/docs/eagle0pedia/dist/. eagle0pedia-dist/
chmod -R u+w eagle0pedia-dist
- name: Upload static site artifact
uses: actions/upload-artifact@v7
with:
name: eagle0pedia-dist
path: eagle0pedia-dist/
if-no-files-found: error
retention-days: 3
+18
View File
@@ -29,6 +29,23 @@ bazel_dep(name = "rules_nodejs", version = "6.7.4")
bazel_dep(name = "rules_pkg", version = "1.2.0")
bazel_dep(name = "rules_shell", version = "0.8.0")
multiple_version_override(
module_name = "aspect_rules_js",
versions = [
"2.3.8",
"3.2.2",
],
)
npm = use_extension("@aspect_rules_js//npm:extensions.bzl", "npm")
npm.npm_translate_lock(
name = "eagle0pedia_npm",
pnpm_lock = "//docs/eagle0pedia:pnpm-lock.yaml",
run_lifecycle_hooks = False,
update_pnpm_lock = False,
)
use_repo(npm, "eagle0pedia_npm")
#
# Language Support - Scala
#
@@ -365,6 +382,7 @@ maven.install(
"org.xerial:sqlite-jdbc:3.53.2.0",
# Postgres for production history benchmarking and migration work
"com.zaxxer:HikariCP:6.3.3",
"org.postgresql:postgresql:42.7.11",
],
duplicate_version_warning = "error",
+508 -55
View File
File diff suppressed because one or more lines are too long
+14
View File
@@ -39,6 +39,13 @@ services:
EAGLE_POSTGRES_USER: "${EAGLE_POSTGRES_USER:-}"
EAGLE_POSTGRES_PASSWORD: "${EAGLE_POSTGRES_PASSWORD:-}"
EAGLE_POSTGRES_SSLMODE: "${EAGLE_POSTGRES_SSLMODE:-require}"
EAGLE_POSTGRES_MAX_POOL_SIZE: "${EAGLE_POSTGRES_MAX_POOL_SIZE:-7}"
EAGLE_POSTGRES_MIN_IDLE: "${EAGLE_POSTGRES_MIN_IDLE:-0}"
EAGLE_POSTGRES_CONNECTION_TIMEOUT_MILLIS: "${EAGLE_POSTGRES_CONNECTION_TIMEOUT_MILLIS:-10000}"
EAGLE_POSTGRES_IDLE_TIMEOUT_MILLIS: "${EAGLE_POSTGRES_IDLE_TIMEOUT_MILLIS:-120000}"
EAGLE_POSTGRES_MAX_LIFETIME_MILLIS: "${EAGLE_POSTGRES_MAX_LIFETIME_MILLIS:-1500000}"
EAGLE_POSTGRES_KEEPALIVE_TIME_MILLIS: "${EAGLE_POSTGRES_KEEPALIVE_TIME_MILLIS:-300000}"
EAGLE_POSTGRES_LEAK_DETECTION_THRESHOLD_MILLIS: "${EAGLE_POSTGRES_LEAK_DETECTION_THRESHOLD_MILLIS:-60000}"
# JWT public key for token validation (auth service handles signing)
# Reads from /etc/eagle0/keys/public.pem via shared volume
# Auth token for Shardok on Hetzner (required)
@@ -95,6 +102,13 @@ services:
EAGLE_POSTGRES_USER: "${EAGLE_POSTGRES_USER:-}"
EAGLE_POSTGRES_PASSWORD: "${EAGLE_POSTGRES_PASSWORD:-}"
EAGLE_POSTGRES_SSLMODE: "${EAGLE_POSTGRES_SSLMODE:-require}"
EAGLE_POSTGRES_MAX_POOL_SIZE: "${EAGLE_POSTGRES_MAX_POOL_SIZE:-7}"
EAGLE_POSTGRES_MIN_IDLE: "${EAGLE_POSTGRES_MIN_IDLE:-0}"
EAGLE_POSTGRES_CONNECTION_TIMEOUT_MILLIS: "${EAGLE_POSTGRES_CONNECTION_TIMEOUT_MILLIS:-10000}"
EAGLE_POSTGRES_IDLE_TIMEOUT_MILLIS: "${EAGLE_POSTGRES_IDLE_TIMEOUT_MILLIS:-120000}"
EAGLE_POSTGRES_MAX_LIFETIME_MILLIS: "${EAGLE_POSTGRES_MAX_LIFETIME_MILLIS:-1500000}"
EAGLE_POSTGRES_KEEPALIVE_TIME_MILLIS: "${EAGLE_POSTGRES_KEEPALIVE_TIME_MILLIS:-300000}"
EAGLE_POSTGRES_LEAK_DETECTION_THRESHOLD_MILLIS: "${EAGLE_POSTGRES_LEAK_DETECTION_THRESHOLD_MILLIS:-60000}"
# JWT public key for token validation (auth service handles signing)
# Reads from /etc/eagle0/keys/public.pem via shared volume
SHARDOK_AUTH_TOKEN: "${SHARDOK_AUTH_TOKEN:-}"
+136
View File
@@ -0,0 +1,136 @@
# Text Client Operator Guide
This guide covers operating the Eagle text client against a running Eagle server. It does not cover game strategy.
## Authentication And Startup
The current bearer-token file is:
```
/private/tmp/eagle0-text-client-token.txt
```
If that file is absent or authentication fails, stop and ask the user for a current bearer token. Do not invent a token or use another user's credentials.
Start the production client with:
```bash
bazel run //src/main/scala/net/eagle0/eagle/text_client:eagle_text_client -- --tls --host prod.eagle0.net --port 443 --bearer-token-file /private/tmp/eagle0-text-client-token.txt
```
At the `eagle0>` prompt, use `lobby` to list running games and available new-game leaders. To resume a game, use:
```text
stream <game-id>
```
Wait for `subscription: success=true` before posting a command.
## Inspecting State
Use these commands before acting:
```text
status
state
commands
commands-json
```
`state` is the concise map and owned-province view. `state-json` prints the complete view. `commands-json` includes the exact fields, IDs, resource amounts, and command choices currently accepted by the server.
Generated text is stored locally during the client process. Use `text <text-id>` for a text ID without spaces, such as `text hn_105`. Province leaders in `state` are resolved through this store when their names have been received.
## Posting Eagle Commands
Use the available-command data from `commands-json` to select a command, then post a matching selected command:
```text
post-json <province-id> <SelectedCommandType> <JSON>
```
For example:
```text
post-json 13 ImproveSelectedCommand {"improvementType":"ECONOMY","actingHeroId":105,"lockType":true}
post-rest 13
post-feast 13
```
The client has shortcuts for `post-rest`, `post-return`, `post-feast`, riot decisions, and battle aftermath. Other selected-command JSON schemas are defined in:
```text
src/main/protobuf/net/eagle0/eagle/api/selected_command.proto
```
Only post a selected command that is currently listed as available. A successful request prints `post-command: SUCCESS`; do not assume a command was accepted until that response or a later game update arrives.
Some actions enter a temporary subcommand state. For example, trading is operated as:
```text
post-json <province-id> TravelSelectedCommand {}
post-json <province-id> TradeSelectedCommand {"tradeType":"BUY_FOOD","amount":<amount>}
post-return <province-id>
```
After each step, run `commands-json` again. The server will reject a nested command, such as `TradeSelectedCommand`, if its parent state has not been entered.
## March Warnings
Marches may produce a warning before being sent. Review it, then resubmit only when intentional:
```text
post-json --force <province-id> MarchSelectedCommand <JSON>
```
`MarchSelectedCommand.marchingUnits` contains combat units. Each selected battalion is paired with a distinct hero in the same combat-unit entry; do not submit battalion-only entries.
## Shardok Battles
When a battle is active, inspect it with:
```text
shardok-units
shardok-commands
```
Post one of the currently listed command indices with:
```text
post-shardok <index>
```
Omit the optional roll value during normal play. The server then generates any
roll required by the selected command. To override that roll for deterministic
testing, append an integer value:
```text
post-shardok <index> <integer-roll>
```
`roll` is a placeholder in command usage, not a literal argument. Only an
integer is accepted, and the override has an effect only for Shardok commands
that support a client-supplied roll.
For a specific active battle:
```text
post-shardok <shardok-game-id> <index>
post-shardok <shardok-game-id> <index> <integer-roll>
```
Use `shardok-commands-json` or `shardok-units-json` when the concise output omits a needed field.
## Reconnects And Shutdown
The client automatically recreates a failed gRPC stream and re-subscribes to the active game. It retains its in-process `ClientTextStore`, so a reconnect should announce:
```text
Reconnecting to game <game-id> with saved text state.
```
Followed by a successful subscription without replaying the full generated-text catalog. Do not start a second client merely because a stream reports `GOAWAY`, `UNAVAILABLE`, or `RST_STREAM`; wait for the automatic reconnect and subscription acknowledgment.
The text store is in memory. A newly launched process performs an initial text sync once, then retains byte offsets for reconnects during that process.
Use `quit` to close the client cleanly. Use `drop <game-id>` only when intentionally abandoning that game.
+44
View File
@@ -0,0 +1,44 @@
load("@aspect_rules_js//js:defs.bzl", "js_binary", "js_run_binary")
load("@eagle0pedia_npm//:defs.bzl", "npm_link_all_packages")
package(default_visibility = ["//visibility:public"])
exports_files([
"package.json",
"pnpm-lock.yaml",
])
npm_link_all_packages()
filegroup(
name = "site_sources",
srcs = glob([
"src/**",
"astro.config.mjs",
"package.json",
"tsconfig.json",
]),
)
js_binary(
name = "astro",
data = [
":node_modules",
],
entry_point = "tools/astro-cli.mjs",
)
js_run_binary(
name = "site",
srcs = [
":node_modules",
":site_sources",
],
args = ["build"],
chdir = package_name(),
env = {
"ASTRO_TELEMETRY_DISABLED": "1",
},
out_dirs = ["dist"],
tool = ":astro",
)
+48
View File
@@ -0,0 +1,48 @@
# Eagle0pedia Site
Eagle0pedia is a Starlight static site. CI validates it through Bazel, while
DigitalOcean App Platform builds and hosts it directly as a static site.
## Local Build
```bash
bazel build //docs/eagle0pedia:site
```
The generated site is written to:
```text
bazel-bin/docs/eagle0pedia/dist
```
## Deployment
Eagle0pedia is hosted by DigitalOcean App Platform as a static site. Use these
component settings:
```text
Resource type: Static Site
Source directory: docs/eagle0pedia
Build command: corepack enable && pnpm install --frozen-lockfile && pnpm build
Output directory: dist
HTTP route: /
Domain: pedia.eagle0.net
```
The App Platform build uses the normal Starlight package scripts:
```text
npm run build
```
Set this App Platform environment variable:
```text
ASTRO_TELEMETRY_DISABLED=1
```
CI still validates the Bazel build:
```text
bazel build //docs/eagle0pedia:site
```
+50
View File
@@ -0,0 +1,50 @@
import { defineConfig } from "astro/config";
import starlight from "@astrojs/starlight";
export default defineConfig({
site: "https://pedia.eagle0.net",
integrations: [
starlight({
title: "Eagle0pedia",
description: "Reference guide for Eagle0 commands, systems, and game concepts.",
customCss: ["./src/styles/custom.css"],
editLink: {
baseUrl: "https://github.com/nolen777/eagle0/edit/main/docs/eagle0pedia/src/content/docs/",
},
sidebar: [
{
label: "Reference",
items: [
{ label: "Eagle0pedia", slug: "" },
{
label: "Concepts",
items: [
{ label: "Game Concepts", slug: "concepts" },
{ label: "Eagle Round Flow", slug: "concepts/eagle-round-flow" },
{ label: "From Eagle to Shardok", slug: "concepts/eagle-to-shardok" },
{ label: "Shardok Battles", slug: "concepts/shardok-battles" },
{
label: "Shardok Victory Conditions",
slug: "concepts/shardok-victory-conditions",
},
],
},
{ label: "Eagle Commands", slug: "commands" },
{ label: "Shardok Commands", slug: "shardok-commands" },
{ label: "Heroes", slug: "heroes" },
{ label: "Factions", slug: "factions" },
{ label: "Provinces", slug: "provinces" },
{ label: "Integration Notes", slug: "integration" },
],
},
],
social: [
{
icon: "github",
label: "GitHub",
href: "https://github.com/nolen777/eagle0",
},
],
}),
],
});
+23
View File
@@ -0,0 +1,23 @@
{
"name": "eagle0pedia",
"version": "0.1.0",
"private": true,
"type": "module",
"packageManager": "pnpm@9.15.9",
"scripts": {
"build": "astro build",
"dev": "astro dev",
"preview": "astro preview"
},
"dependencies": {
"@astrojs/starlight": "^0.36.0",
"astro": "^5.11.0",
"sharp": "^0.34.0"
},
"devDependencies": {
"typescript": "^5.8.0"
},
"pnpm": {
"onlyBuiltDependencies": []
}
}
+4378
View File
File diff suppressed because it is too large Load Diff
+6
View File
@@ -0,0 +1,6 @@
import { defineCollection } from "astro:content";
import { docsSchema } from "@astrojs/starlight/schema";
export const collections = {
docs: defineCollection({ schema: docsSchema() }),
};
@@ -0,0 +1,666 @@
---
title: Eagle Commands
description: Strategic command reference for Eagle command panels.
---
Eagle commands are the strategic actions a faction can take from a province command panel. The panel shows the actions that are possible for the current province and situation.
Most commands belong to the province currently acting this turn. Some are reaction commands, such as resolving diplomacy offers, handling captured heroes, or choosing a battle aftermath decision.
## Why commands appear and disappear
The command panel changes as the game changes. If an action is not currently possible, it is usually absent instead of appearing as a disabled button.
Availability can change when:
- another command spends gold, food, vigor, or the province's turn;
- a hero, battalion, prisoner, event, or incoming army moves or changes state;
- the game advances to another phase;
- a profession or minimum stat is required; or
- a target is no longer valid.
If a command you expected is missing, check its **Available when** entry. The most common reasons are insufficient gold, food, or vigor; no valid target; the wrong hero profession; the hero being elsewhere; or the province having already spent its turn.
An **eligible hero** is simply one of the heroes you can currently choose to perform that action. Eligibility can depend on location, vigor, profession, leadership, and the command's own restrictions.
## Reading a command entry
- **Hero requirements** identifies profession or hero restrictions. “None” means no particular profession, not that the command never needs an acting hero.
- **Vigor cost** is paid by the selected acting hero when the command resolves as described.
- **Available when** summarizes the state that makes the command appear.
- **Effect** describes what the action does.
- **Selection** lists what you must choose before confirming it.
## Turns, reactions, and command states
Most commands under **Normal Command Phase Commands** spend the acting province's turn. After using one, you normally cannot choose another ordinary action for that province this round. Entries explicitly identify exceptions such as Issue Orders.
Diplomacy responses, attack and defense decisions, riots, and battle aftermath are prompted by events in their own phases. Resolving one of these decisions does not replace or grant another ordinary province turn.
**Travel** enters a temporary command state. Traveling commands then become available, and the player may use multiple traveling commands in the same round. **Return** leaves that state and returns to the normal province command flow. Individual traveling actions can still spend resources or alter which later choices remain available.
Before confirming any command, check the selected hero, destination, units, gold, and food. Treat confirmation as issuing the order rather than previewing it.
<span class="command-reference-marker" aria-hidden="true"></span>
<!--
Source map for numeric command details:
- Alms: src/main/resources/net/eagle0/eagle/settings.tsv fields almsSupportIncreasePerFood=0.01, almsPaladinSupportMultiplier=4, maxAlmsFood=1000; applied in src/main/scala/net/eagle0/eagle/library/actions/impl/command/AlmsCommand.scala and src/main/scala/net/eagle0/eagle/library/actions/availability/AvailableAlmsCommandFactory.scala.
- Feast: settings fields loyaltyGainFromFeast=10, vigorGainFromFeast=10, feastGoldCostPerHero=20; applied in src/main/scala/net/eagle0/eagle/library/actions/impl/command/FeastCommand.scala and src/main/scala/net/eagle0/eagle/library/actions/availability/AvailableFeastCommandFactory.scala.
- Hero Gift: settings fields loyaltyIncreasePerGold=0.25 and maxGiftGold=100; applied in src/main/scala/net/eagle0/eagle/library/actions/impl/command/HeroGiftCommand.scala and src/main/scala/net/eagle0/eagle/library/actions/availability/AvailableHeroGiftCommandFactory.scala.
- Rest: settings field restVigorGain=15; applied in src/main/scala/net/eagle0/eagle/library/actions/impl/command/RestCommand.scala.
- Vigor costs: src/main/resources/net/eagle0/eagle/settings.tsv fields actionVigorCost=15, reconVigorCost=30, apprehendOutlawVigorCost=30, controlWeatherVigorDelta=-40, startEpidemicVigorDelta=-30, vigorGainFromFeast=10, restVigorGain=15.
- Divine: divinable heroes are unaffiliated heroes with RecruitmentInfo.NotDivined; see src/main/scala/net/eagle0/eagle/library/actions/availability/AvailableDivineCommandsFactory.scala and src/main/scala/net/eagle0/eagle/library/actions/impl/command/DivineCommand.scala.
- Issue Orders: order availability comes from src/main/scala/net/eagle0/eagle/library/actions/availability/AvailableIssueOrdersCommandFactory.scala; vassal order behavior comes from src/main/scala/net/eagle0/eagle/library/actions/impl/action/PerformVassalCommandsPhaseAction.scala, src/main/scala/net/eagle0/eagle/library/util/command_choice_helpers/CommandChoiceHelpers.scala, and src/main/scala/net/eagle0/eagle/library/util/command_choice_helpers/ExpandCommandSelector.scala.
- Send Supplies: shipment scheduling comes from src/main/scala/net/eagle0/eagle/library/actions/impl/command/SendSuppliesCommand.scala; arrival comes from src/main/scala/net/eagle0/eagle/library/actions/impl/action/PerformProvinceMoveResolutionAction.scala and src/main/scala/net/eagle0/eagle/library/actions/impl/action/ShipmentArrivedAction.scala; timing/loss settings are src/main/resources/net/eagle0/eagle/settings.tsv fields turnsToResolveShipment=1 and shipSuppliesLoss=0.1.
- Battle Aftermath Decision: availability comes from src/main/scala/net/eagle0/eagle/library/actions/availability/AvailableBattleAftermathDecisionCommandFactory.scala; selection comes from src/main/scala/net/eagle0/eagle/library/actions/impl/command/BattleAftermathDecisionCommand.scala; finalization comes from src/main/scala/net/eagle0/eagle/library/actions/impl/action/FinalizeAftermathAction.scala.
- Manage Prisoners: availability comes from src/main/scala/net/eagle0/eagle/library/actions/availability/AvailableManagePrisonersCommandFactory.scala; option effects come from src/main/scala/net/eagle0/eagle/library/actions/impl/command/ManagePrisonersCommand.scala; prisoner move/return timing comes from src/main/scala/net/eagle0/eagle/library/actions/impl/action/EndPlayerCommandsPhaseAction.scala; settings include prisonerEscapeChance=0.01.
- Handle Captured Hero: availability comes from src/main/scala/net/eagle0/eagle/library/actions/availability/AvailableHandleCapturedHeroCommandFactory.scala; option effects come from src/main/scala/net/eagle0/eagle/library/actions/impl/command/HandleCapturedHeroesCommand.scala; deferred aftermath effects come from src/main/scala/net/eagle0/eagle/library/actions/impl/action/EndBattleAftermathPhaseAction.scala; settings include startingLoyalty=60 and truceMonthsFromReturningLeader=12.
-->
## Normal Command Phase Commands
Most command phase actions spend the acting province's turn.
### Alms
<b>Hero requirements:</b> None. [Paladins](/heroes/#paladin) get a bonus.
<b>Vigor cost:</b> 15.
<b>Available when:</b> the acting province has food to give and an eligible hero with enough vigor.
<b>Effect:</b> Give up to 1000 food from the acting province as charity. The province gains 1 [support](/provinces/#support) per 100 food, capped by the province's maximum 100 support. Paladins multiply the support gain by 4, so a Paladin gives 4 support per 100 food. The acting hero spends vigor and gains charisma XP.
<b>Selection:</b> choose an amount of food and the acting hero.
### Apprehend Outlaw
<b>Hero requirements:</b> None.
<b>Vigor cost:</b> 30.
<b>Available when:</b> an [outlaw hero](/factions/#free-heroes) is present in the acting province and an eligible hero has enough vigor.
<b>Effect:</b> Attempt to capture the outlaw. On success, the outlaw is removed from the province's unaffiliated heroes and re-added as a prisoner with a bias against the imprisoning faction. The acting hero spends vigor, and the game creates a deferred notification/story request.
<b>Selection:</b> choose the outlaw, an optional battalion, and the acting hero.
### Control Weather
<b>Hero requirements:</b> [Mage](/heroes/#mage).
<b>Vigor cost:</b> 40.
<b>Available when:</b> a Mage has enough vigor and the acting province or an adjacent province has a valid weather change.
<b>Effect:</b> Change weather in a target province. Available options can start or end blizzards and droughts. The target province receives a deferred weather change, and the acting hero records a weather backstory event, spends or gains the configured vigor delta, and gains wisdom XP.
<b>Selection:</b> choose the weather control type, target province, and acting hero.
### Diplomacy
<b>Hero requirements:</b> None.
<b>Vigor cost:</b> 15 from the messenger hero.
<b>Available when:</b> a diplomatic option is valid against another faction and an eligible messenger hero can be sent.
<b>Effect:</b> Send a hero to another faction with a diplomatic proposal. The target faction receives the offer at the end of the current round, after any battles this round have taken place. Truce, invitation, alliance, break-alliance, and ransom options create [incoming diplomacy offers](/factions/#incoming-diplomacy-offers) for the target faction and story-generation requests. Most diplomacy options spend gold, remove the messenger hero from the acting province, and cost the messenger vigor.
<b>Selection:</b> choose the diplomacy option, target faction, and sent hero.
### Exile Vassal
<b>Hero requirements:</b> None.
<b>Vigor cost:</b> None.
<b>Available when:</b> this province has at least one [vassal](/heroes/#vassals).
<b>Effect:</b> Remove the selected vassal from your faction.
<b>Selection:</b> choose the hero to exile.
### Feast
<b>Hero requirements:</b> None.
<b>Vigor cost:</b> None. This restores up to 10 vigor for each ruling-faction hero in the province.
<b>Available when:</b> the acting province can pay the feast cost: 20 gold per ruling-faction hero in the province, multiplied by the province [price index](/provinces/#price-index).
<b>Effect:</b> Hold a feast in the acting province. Every ruling-faction hero in the province gains up to 10 loyalty, capped at 100, and up to 10 vigor, capped by constitution. Faction leaders do not gain loyalty, but can still gain vigor. The province spends gold, the price index may change, and feast-spending quest counters can advance.
<b>Selection:</b> no additional choices.
### Hero Gift
<b>Hero requirements:</b> None.
<b>Vigor cost:</b> None.
<b>Available when:</b> the province has a non-leader hero with less than 100 LOY and gold available to give.
<b>Effect:</b> Send up to 100 gold as a gift to the selected hero. Loyalty gain depends on the gold amount, the recipient province's price index, and the hero's current loyalty: the base gain is 0.25 loyalty per gold, divided by price index, capped by the remaining room to 100 LOY.
<b>Selection:</b> choose the recipient hero and amount.
### Improve
<b>Hero requirements:</b> None. [Engineers](/heroes/#engineer) get a bonus.
<b>Vigor cost:</b> 15.
<b>Available when:</b> a hero has enough vigor and the province has an available improvement or devastation repair option.
<b>Effect:</b> Improve a province using one of the available improvement types. [Economy, agriculture, and infrastructure](/provinces/#development-stats) rise toward 100; [devastation](/provinces/#devastation) repair reduces all three devastation tracks. The acting hero spends vigor and gains strength/agility XP, and the improvement can optionally be locked as the province's preferred type.
<b>Selection:</b> choose the improvement type, acting hero, and whether to lock the type.
### Issue Orders
<b>Hero requirements:</b> None.
<b>Vigor cost:</b> None. This does not take your turn.
<b>Available when:</b> a faction leader is acting and your faction controls more than one province. This command does not take your turn.
<b>Effect:</b> Set [standing orders](/provinces/#province-orders) for your provinces. Orders guide vassal-ruled provinces during the [Vassal Commands phase](/concepts/eagle-round-flow/#vassal-commands); provinces led directly by faction leaders are still commanded directly. Vassals may still handle urgent problems first, such as defense, riots, severe fatigue, low support, beast suppression, loyalty management, or other immediately available crisis commands.
<b>Selection:</b> submit the new province orders and the new focus province, or clear the focus province.
#### Order Meanings
##### Entrust
Use the vassal's judgment. If the province borders an enemy, the vassal tends to act like **Mobilize**. Otherwise, the vassal tends to act like **Develop**.
##### Develop
Build up the province. The vassal may send away surplus gold and food toward your focus province, if one is set, or otherwise toward the nearest faction leader. Then it prefers **Improve** actions that raise economy, agriculture, infrastructure, or repair devastation. If nothing useful is available, the province rests.
##### Mobilize
Prepare for war. The vassal may ship excess gold and food toward your focus province, if one is set, or otherwise toward the nearest faction leader. Then it may organize troops, arm troops, improve infrastructure when it limits training, train battalions, and fall back to improvement or rest.
##### Expand
Look for growth or attack opportunities. The vassal first tries to march into neutral provinces, usually leaving enough heroes behind to keep the origin province held. If expansion is not practical, it may spread heroes among your existing provinces, attack enemies when appropriate, improve the province, or rest.
### March
<b>Hero requirements:</b> None.
<b>Vigor cost:</b> 15 from each marching hero.
<b>Available when:</b> the acting province has movable heroes, battalions, gold, or food and at least one valid destination.
<b>Effect:</b> Move heroes, battalions, gold, and food from one province to another. The selected units and supplies leave the origin province immediately, each marching hero spends vigor and gains wisdom XP, and the destination receives an [incoming army](/provinces/#incoming-armies) scheduled for the next round.
If the destination is already ruled by your faction when the army arrives, the heroes, battalions, gold, and food enter the province during the next round's Province Move Resolution phase, before riots, vassal commands, and player commands.
If the destination is neutral or hostile, the army does not simply appear in the province at Province Move Resolution. It is set up as a hostile army later in that same next round, after player commands. A neutral province can then be taken in the Uncontested Conquest phase; a defended province can lead into attack, defense, battle request, and battle resolution phases. Until one of those outcomes resolves, the marching heroes are still in the moving army rather than ruling the destination.
<!-- Sources:
- March scheduling: src/main/scala/net/eagle0/eagle/library/actions/impl/command/MarchCommand.scala
- Friendly arrival timing: src/main/scala/net/eagle0/eagle/library/actions/impl/action/PerformProvinceMoveResolutionAction.scala
- Hostile setup and neutral conquest timing:
src/main/scala/net/eagle0/eagle/library/actions/impl/action/PerformHostileArmySetupAction.scala
src/main/scala/net/eagle0/eagle/library/actions/impl/action/PerformUncontestedConquestAction.scala
- Phase order: src/main/scala/net/eagle0/eagle/model/state/RoundPhase.scala
-->
<b>Selection:</b> choose origin, destination, gold, food, and marching units.
### Organize Troops
<b>Hero requirements:</b> None.
<b>Vigor cost:</b> None.
<b>Available when:</b> the acting province has battalions to manage, troops to reorganize, or gold to raise new troops.
<b>Effect:</b> Create, resize, merge, transfer, or dismiss battalions in the acting province. New troops cost gold and enter with no training or armament, while transferred troops preserve weighted training and armament. Empty battalions are destroyed, new battalions get generated names and initial backstory requests, and the province price index may change from the gold spend.
<b>Selection:</b> submit changed battalions and new battalions, including troop movements and new troop counts.
### Recon
<b>Hero requirements:</b> [Ranger](/heroes/#ranger).
<b>Vigor cost:</b> 30.
<b>Available when:</b> a Ranger has enough vigor and there is a valid target province to scout.
<b>Effect:</b> Send a hero to scout another province.
<b>Selection:</b> choose the acting hero and target province.
### Rest
<b>Hero requirements:</b> None.
<b>Vigor cost:</b> None. This restores up to 15 vigor for each ruling-faction hero in the province.
<b>Available when:</b> the acting province can spend its turn resting.
<b>Effect:</b> Have the acting province rest for the turn. Faction heroes in the province regain up to 15 vigor, capped by constitution, and rest-related quest counters can advance.
<b>Selection:</b> no additional choices.
### Send Supplies
<b>Hero requirements:</b> None.
<b>Vigor cost:</b> 15.
<b>Available when:</b> the acting province has supplies to send, an eligible hero, and a valid destination province.
<b>Effect:</b> Send gold and food from the acting province to another province. The origin province loses the full selected amount immediately, and the destination receives an [incoming shipment](/provinces/#incoming-shipments) scheduled for the next round.
Shipments arrive during the next round's Province Move Resolution phase, before riots, hero departures, vassal commands, player commands, battles, and food consumption. That means food shipped this way is available to feed the destination province later in the same round it arrives. When the shipment arrives, 10% is lost in transit and the destination receives the remaining gold and food, rounded down.
<b>Selection:</b> choose gold, food, acting hero, and destination province.
### Start Epidemic
<b>Hero requirements:</b> [Necromancer](/heroes/#necromancer).
<b>Vigor cost:</b> 30.
<b>Available when:</b> a Necromancer has enough vigor and the acting province or an adjacent province can receive an epidemic.
<b>Effect:</b> Start an epidemic in the target province.
<b>Selection:</b> choose the target province and acting hero.
### Suppress Beasts
<b>Hero requirements:</b> None. Heroes with any profession get a power bonus.
<b>Vigor cost:</b> 15 on success, plus any vigor lost to casualties. If the hero is killed, the command fails.
<b>Available when:</b> the acting province has a [beast event](/provinces/#province-events) and an eligible hero.
<b>Effect:</b> Send a hero, optionally with a battalion, to suppress beasts in the acting province. The fight rolls beast power, applies casualties to the battalion and/or hero, removes the beast event on success or failure, and creates a story notification. Success can award gold, food, support, hero XP, and battalion backstory; failure can kill the hero and destroy the battalion.
<b>Selection:</b> choose the hero and optional battalion.
### Swear Kinship
<b>Hero requirements:</b> The target hero must have at least 95 loyalty.
<b>Vigor cost:</b> None.
<b>Available when:</b> the faction head is in the province, your faction has fewer than 5 faction leaders, and another hero in the province has at least 95 loyalty.
<b>Effect:</b> Choose a hero for a kinship bond. A hero who swears kinship becomes a [faction leader](/heroes/#faction-leaders).
<b>Selection:</b> choose the hero to swear kinship with.
### Train
<b>Hero requirements:</b> None. [Champions](/heroes/#champion) get a bonus.
<b>Vigor cost:</b> 15.
<b>Available when:</b> a hero has enough vigor and the province has at least one battalion with less than 100 TRN.
<b>Effect:</b> Raise the TRN of all trainable battalions in the province. The more troops are present, the lower the amount raised. The acting hero spends vigor and gains charisma, strength, and agility XP.
<b>Selection:</b> choose the acting hero.
### Travel
<b>Hero requirements:</b> None.
<b>Vigor cost:</b> 15.
<b>Available when:</b> the acting province can enter the traveling command state.
<b>Effect:</b> Unlock the traveling commands below. Once you are traveling, you can use as many traveling commands as you want in the same round before using Return to come back to camp.
<b>Selection:</b> no additional choices.
## Traveling Commands
You must use Travel before these commands appear. Once you are traveling, you can use as many traveling commands as you want in one round before using Return to come back to camp.
### Arm Troops
<b>Hero requirements:</b> None.
<b>Vigor cost:</b> None.
<b>Available when:</b> you are traveling, the province has gold, and at least one battalion can raise ARM without exceeding effective infrastructure.
<b>Effect:</b> Spend gold to raise armament on existing battalions. New armament must be higher than the battalion's current armament and cannot exceed the province's effective infrastructure. The province spends gold, the price index may change, and each armed battalion records a backstory event.
<b>Selection:</b> choose the battalions to arm and how much armament each receives.
### Decline Quest
<b>Hero requirements:</b> None.
<b>Vigor cost:</b> None.
<b>Available when:</b> you are traveling and an [unaffiliated hero](/heroes/#unaffiliated-heroes) quest is available in the province.
<b>Effect:</b> Decline one of the unaffiliated hero quests available in the acting province.
<b>Selection:</b> choose the hero whose quest should be declined.
### Divine
<b>Hero requirements:</b> None.
<b>Vigor cost:</b> None.
<b>Available when:</b> you are traveling, the province has gold, and there are free heroes who are not yet ready to join your faction but might be won over.
<b>Effect:</b> Spend gold to divine one or more [free heroes](/factions/#free-heroes). For each divined hero, you receive details about what could impress them enough to become recruitable. Fulfill that ask, and the hero can later appear under Recruit Heroes. Cost scales by the province price index, the province spends gold, and the price index may change.
<b>Selection:</b> choose the heroes to divine.
### Manage Prisoners
<b>Hero requirements:</b> None.
<b>Vigor cost:</b> None.
<b>Available when:</b> you are traveling and the province has prisoner heroes with available management options.
<b>Effect:</b> Choose what happens to ordinary prisoners in the province. These are heroes who are already in the prisoner state, not newly captured heroes still waiting for a battle aftermath decision.
<b>Selection:</b> choose the prisoner and management option.
#### Options
##### Execute
<b>Effect:</b> Kill the prisoner and remove them from the game.
##### Exile
<b>Available when:</b> the prisoner is not a faction leader.
<b>Effect:</b> Turn the prisoner into an outlaw in the same province.
##### Release
<b>Available when:</b> the prisoner is not a faction leader.
<b>Effect:</b> Release the prisoner as a traveler in the same province. Released prisoners are no longer in your custody, but they do not automatically join another faction.
##### Move
<b>Available when:</b> you control an adjacent province.
<b>Effect:</b> Send the prisoner to one adjacent province ruled by your faction. The prisoner leaves the origin province now and arrives at the destination at the end of the Player Commands phase. There is a 1% chance the prisoner escapes during the move; if that happens, they become an outlaw in the destination province instead of remaining a prisoner.
##### Return
<b>Available when:</b> the prisoner is a faction leader and their faction still controls at least one province.
<b>Effect:</b> Return the prisoner to their faction. They leave your custody now and rejoin their faction at the end of the Player Commands phase as a ruling hero in one of that faction's provinces.
Ordinary prisoners cannot be returned this way. Faction leader prisoners cannot be released or exiled, but they can be executed, moved within your territory, or returned if their faction still exists.
### Recruit Heroes
<b>Hero requirements:</b> None.
<b>Vigor cost:</b> None.
<b>Available when:</b> you are traveling and unaffiliated heroes in the province are willing to join.
<b>Effect:</b> Recruit available unaffiliated heroes in the acting province. Recruited heroes join the faction at starting loyalty, move from the province's unaffiliated hero list into its ruling faction heroes, and receive a recruitment backstory event.
<b>Selection:</b> choose the heroes to recruit.
### Return
<b>Hero requirements:</b> None.
<b>Vigor cost:</b> None.
<b>Available when:</b> you are traveling.
<b>Effect:</b> Return from the traveling command state to the normal strategic flow.
<b>Selection:</b> no additional choices.
### Trade
<b>Hero requirements:</b> None.
<b>Vigor cost:</b> None.
<b>Available when:</b> you are traveling and the province has enough gold or food for at least one trade.
<b>Effect:</b> Buy or sell food using the acting province's gold and food stores. Food buy and sell prices are based on the province price index. Buying spends gold and adds food; selling removes food and adds gold. The price index may change after the trade.
<b>Selection:</b> choose buy or sell and the amount of food.
## Special and Conditional Commands
These commands appear only when the game is resolving a special situation, response, or pending decision.
### Attack Decision
<b>Hero requirements:</b> None.
<b>Vigor cost:</b> None.
<b>Available when:</b> an attack decision is pending.
<b>Effect:</b> Choose how to respond to a pending attack opportunity or battle decision. The command shows involved armies, acting units, and the available attack decision types. See [Attack and Defense Decisions](/concepts/eagle-to-shardok/#attack-and-defense-decisions) for how this fits into battle creation.
<b>Selection:</b> choose one available attack decision.
### Defend
<b>Hero requirements:</b> None.
<b>Vigor cost:</b> None.
<b>Available when:</b> a province is under attack and can commit defenders.
<b>Effect:</b> Respond to an incoming attack by committing a defending army. The selected defenders become the province's defending army. If flee provinces are available, one must be selected as the army's fallback destination. See [Attack and Defense Decisions](/concepts/eagle-to-shardok/#attack-and-defense-decisions) for what happens next.
<b>Selection:</b> choose defending units and, when available, an optional flee province.
### Handle Captured Hero
<b>Hero requirements:</b> None.
<b>Vigor cost:</b> None.
<b>Available when:</b> a newly captured hero needs a battle aftermath decision.
<b>Effect:</b> Decide what happens to a hero captured during [battle aftermath](/concepts/eagle-to-shardok/#aftermath) or conquest. Captured heroes are not yet ordinary prisoners. If you imprison one, they become a normal prisoner and can later be handled with Manage Prisoners.
<b>Selection:</b> choose the captured hero and the handling option.
#### Options
##### Recruit
<b>Available when:</b> the captured hero is not a faction leader, has not already refused recruitment, and is not someone who will never join your faction.
<b>Effect:</b> Try to persuade the captured hero to join you immediately. The chance depends on your faction head, your faction's prestige, and the captured hero. On success, the hero joins your faction in the captured province with 60 loyalty. On failure, the hero refuses; you cannot try to recruit that captured hero again from this aftermath decision and must choose another option.
##### Imprison
<b>Effect:</b> Keep the hero as a prisoner in the captured province. This converts them into an ordinary prisoner when the aftermath resolves.
##### Exile
<b>Available when:</b> the captured hero is not a faction leader whose faction still controls a province.
<b>Effect:</b> Cast the hero out as an outlaw in the captured province when the aftermath resolves.
##### Execute
<b>Effect:</b> Kill the captured hero and remove them from the game when the aftermath resolves.
##### Return
<b>Available when:</b> the captured hero is a faction leader and their faction still controls at least one province.
<b>Effect:</b> Return the captured faction leader to the closest province ruled by their old faction when the aftermath resolves. Returning a captured leader creates a 12-month truce between your faction and theirs.
### Handle Riot
<b>Hero requirements:</b> None.
<b>Vigor cost:</b> Depends on the option. Crack Down can cost vigor; Give and Do Nothing do not.
<b>Available when:</b> a province has a riot.
<b>Effect:</b> Respond to a [riot](/provinces/#province-events) in the acting province. The client presents this as one command with multiple response options. The [province leader](/provinces/#ruling-faction-and-ruling-hero)'s Charisma matters, even if a different hero is selected to crack down: leader Charisma improves gift success and makes forceful crackdowns face smaller riots.
If you fail to stop the riot, or if the riot is still unresolved when the riot phase ends, the riot happens. The province loses 25 support, gains 25 economy devastation, gains 25 infrastructure devastation, and the riot event is removed.
<!-- Sources:
- Riot options: src/main/scala/net/eagle0/eagle/library/actions/impl/command/HandleRiotGiveCommand.scala
src/main/scala/net/eagle0/eagle/library/actions/impl/command/HandleRiotCrackDownCommand.scala
src/main/scala/net/eagle0/eagle/library/actions/impl/command/HandleRiotDoNothingCommand.scala
- Riot consequences: src/main/scala/net/eagle0/eagle/library/actions/impl/command/HandleRiotUtils.scala
- Riot settings: src/main/scala/net/eagle0/eagle/library/settings/BUILD.bazel
-->
#### Options
##### Crack Down
<b>Vigor cost:</b> 15 on success, plus any vigor lost to casualties. If the hero is killed, the command fails.
<b>Effect:</b> Try to suppress the riot by force using a hero and optionally a battalion. The riot size is random from 100 to 1500, but the province leader's Charisma, not the selected acting hero's Charisma, reduces the roll before the size is calculated. Higher leader Charisma therefore makes the riot smaller and easier to defeat.
Casualties are based on riot size against the power of the acting hero and any attached battalion. If a battalion is used, casualties hit the battalion first; the battalion can be destroyed, and excess casualties can injure or kill the acting hero. If no battalion is used, casualties hit the acting hero directly.
Crack Down succeeds if the acting hero survives. On success, the riot event is removed and the acting hero spends 15 vigor, gains Strength and Agility XP, and may take additional vigor damage from casualties. If a battalion helped and survived, its size is reduced by its casualties. A successful crackdown does not directly reduce support, add devastation, or change loyalty; the cost is the violence itself.
Crack Down fails if the acting hero is killed. A failed crackdown does not stop the riot; the riot will still occur and apply the normal riot damage.
<b>Selection:</b> choose the acting hero and an optional battalion.
##### Do Nothing
<b>Vigor cost:</b> None.
<b>Effect:</b> Let the riot proceed without intervention. The riot will occur, causing the normal riot damage: -25 support, +25 economy devastation, and +25 infrastructure devastation.
<b>Selection:</b> no additional choices.
##### Give
<b>Vigor cost:</b> None.
<b>Effect:</b> Offer either food or gold to address the riot. You cannot combine food and gold in the same response. The maximum useful gift is 1000 food or 500 gold, and the selected amount is spent whether the attempt succeeds or fails.
Gift success is probabilistic. The chance is based on the province leader's Charisma plus the fraction of the maximum gift you gave: larger gifts help, and more leader Charisma helps. A partial gift can fail. On success, the riot event is removed. On failure, the gift is still spent and the riot will still occur.
<b>Selection:</b> choose a food amount or a gold amount.
### Please Recruit Me
<b>Hero requirements:</b> None.
<b>Vigor cost:</b> None.
<b>Available when:</b> unaffiliated heroes ask to join.
<b>Effect:</b> Respond to unaffiliated heroes who are asking to join a province.
<b>Selection:</b> choose the province, hero, and whether to accept.
### Resolve Alliance Offer
<b>Hero requirements:</b> None.
<b>Vigor cost:</b> None.
<b>Available when:</b> another faction offers an alliance.
<b>Effect:</b> Accept or reject an [incoming alliance offer](/factions/#incoming-diplomacy-offers).
<b>Selection:</b> choose the originating faction and the resolution.
### Resolve Break Alliance
<b>Hero requirements:</b> None.
<b>Vigor cost:</b> None.
<b>Available when:</b> another faction tries to break an alliance.
<b>Effect:</b> Respond to a faction attempting to break an alliance.
<b>Selection:</b> choose the originating faction and the resolution.
### Resolve Invitation
<b>Hero requirements:</b> None.
<b>Vigor cost:</b> None.
<b>Available when:</b> another faction sends an invitation.
<b>Effect:</b> Accept or reject an invitation from another faction.
<b>Selection:</b> choose the originating faction and the resolution.
### Resolve Ransom Offer
<b>Hero requirements:</b> None.
<b>Vigor cost:</b> None.
<b>Available when:</b> another faction makes a ransom offer.
<b>Effect:</b> Accept or reject an incoming ransom offer.
<b>Selection:</b> choose the offering faction, the ransom offer, and the resolution.
### Resolve Truce Offer
<b>Hero requirements:</b> None.
<b>Vigor cost:</b> None.
<b>Available when:</b> another faction offers a truce.
<b>Effect:</b> Accept or reject an incoming truce offer.
<b>Selection:</b> choose the originating faction and the resolution.
### Resolve Tribute
<b>Hero requirements:</b> None.
<b>Vigor cost:</b> None.
<b>Available when:</b> another faction demands tribute.
<b>Effect:</b> Decide whether to pay demanded tribute. The command shows the demanding factions, requested tribute, their rough strength, and the acting province's available food and gold.
<b>Selection:</b> choose the demanding faction and whether tribute is paid.
### Battle Aftermath Decision
<b>Hero requirements:</b> None.
<b>Vigor cost:</b> None.
<b>Available when:</b> multiple allied attacking factions won the same province and Eagle needs to decide which claimant keeps it.
<b>Effect:</b> Decide what your surviving claimant army does during [battle aftermath](/concepts/eagle-to-shardok/#aftermath) after a shared victory. If no ally has claimed the province yet, you may choose **Keep Province** and become the conqueror. If an ally has already claimed it, you must withdraw.
Keeping the province finalizes conquest: your surviving non-fled heroes become the new ruling heroes, surviving battalions become the province battalions, support is reset to 0, province orders reset to **Entrust**, and non-fled defenders or former ruling heroes can become prisoners.
Withdrawing sends your surviving units to an adjacent province as a moving army. You may take up to the gold and food your claimant army brought into the battle. The withdrawal army arrives next round and does not use the normal Send Supplies transit loss.
<b>Selection:</b> choose whether to keep the province or withdraw. If withdrawing, choose destination province and supplies to take.
@@ -0,0 +1,137 @@
---
title: Eagle Round Flow
description: How Eagle strategic rounds advance, including simultaneous player action.
---
<!--
Source map:
- Phase enum: src/main/protobuf/net/eagle0/eagle/common/round_phase.proto.
- Phase advancement: src/main/scala/net/eagle0/eagle/library/RoundPhaseAdvancer.scala.
- Command availability by phase: src/main/scala/net/eagle0/eagle/library/actions/availability/AvailableCommandsFactory.scala.
- Result visibility/filtering: src/main/scala/net/eagle0/eagle/library/ActionResultFilter.scala and src/main/scala/net/eagle0/eagle/library/util/view_filters/.
-->
Eagle is a simultaneous-turn strategy game. During a phase, every faction gets the chance to act in parallel. The game does not fully resolve the phase just because one player chooses a command; it waits until every required player choice has been made, then advances the phase and reveals the results each faction is allowed to know.
That means two things matter:
- Your orders are not a private single-player timeline. Other factions may be choosing their own commands at the same time.
- You do not automatically see every action in the world. You see your faction's results, your allies' visible results, and information your faction has earned through scouting, battle revelations, diplomacy, or province control.
## Round Shape
Most rounds follow this broad rhythm:
1. Upkeep and automatic world changes happen.
2. Vassals and players issue strategic commands.
3. Marching armies arrive, attacks are decided, and battles are requested.
4. Shardok battles resolve outside the strategic map.
5. Eagle applies battle results, aftermath choices, diplomacy, recon, and end-of-round changes.
Some phases are player-facing. Others are bookkeeping phases that advance automatically unless a special decision is needed.
## Automatic Upkeep
These phases usually advance without direct player input:
### New Round
The game starts a new strategic round. Provinces, heroes, factions, and long-running state are updated for the new date.
### Prisoner Exchange
The game resolves automatic prisoner exchange state.
### Province Events
Province events such as local problems or opportunities are processed.
### Forced Turn Back
Armies that must turn back do so before normal movement resolution.
### Province Move Resolution
Moving armies arrive at their destinations, supplies move, and incoming hostile groups are created where armies meet resistance.
### Hero Departures
Heroes who are ready to leave unaffiliated states or temporary situations may depart.
### Unaffiliated Hero Actions
Unaffiliated heroes may move, appear, escape, or otherwise act without belonging to a faction.
### Hostile Army Setup
The game prepares hostile army groups before conquest or battle decisions.
### Uncontested Conquest
If an attacker reaches a province with no defending force, the conquest can resolve without a Shardok battle.
### Truce Turn Back
Armies affected by truces may turn back instead of fighting.
### Battle Request
Eagle creates Shardok battles for provinces where attackers and defenders must fight.
### Food Consumption
Armies consume food before or around battle handling.
### Battle Resolution
Eagle waits for outstanding Shardok battles to report results. If there are none, the phase advances automatically.
### Recon Resolution
Recon results are applied after the relevant strategic activity has completed.
## Player Decision Phases
These phases can pause until required players have submitted decisions.
### Handle Riot
If your province has a riot, you may need to decide how to respond before the round can continue.
### Please Recruit Me
Some unaffiliated heroes may ask to join a faction. The phase waits while available recruitment decisions remain.
### Vassal Commands
Vassals choose province actions for provinces they rule. Vassals lead provinces and make their own choices, so these commands can happen before the direct player command phase.
### Player Commands
This is the main strategic command phase. Each player acts for provinces and heroes they can command directly. Every player is acting within the same phase, so your command is submitted into a shared strategic moment rather than immediately revealing a global timeline.
See [Eagle commands](/commands/) for the command reference.
### Attack Decision
When an army reaches a hostile province, the attacking side may need to choose whether to attack.
### Defense Decision
The defending side may need to decide how to respond to an incoming attack.
### Battle Aftermath
After Shardok results return to Eagle, winners may need to decide what happens to conquered provinces, captured heroes, or multiple allied claimants.
### Diplomacy Resolution
Diplomatic offers are resolved after players choose how to answer them. Offers can be accepted, rejected, invalidated, or lead to consequences such as imprisonment.
## Simultaneous Information
The important habit is to think in phases, not in a fully visible turn order.
If two factions both issue orders during Player Commands, those orders belong to the same command phase. When the phase ends, each faction receives the filtered results it is allowed to observe. Your own actions are visible to you. Allied and nearby events may be visible depending on game state. Enemy actions may be hidden until scouts, battles, diplomacy, or later consequences reveal them.
This is why Eagle often feels less like "I move, then you move" and more like issuing orders into a living world, then discovering what happened.
@@ -0,0 +1,133 @@
---
title: From Eagle to Shardok
description: How strategic Eagle armies become tactical Shardok battles.
---
<!--
Source map:
- Movement resolution: src/main/scala/net/eagle0/eagle/library/actions/impl/action/PerformProvinceMoveResolutionAction.scala.
- Battle setup phase: src/main/scala/net/eagle0/eagle/library/actions/impl/action/PerformHostileArmySetupAction.scala.
- Uncontested conquest: src/main/scala/net/eagle0/eagle/library/actions/impl/action/PerformUncontestedConquestAction.scala.
- Battle request creation: src/main/scala/net/eagle0/eagle/library/actions/impl/action/RequestBattlesAction.scala.
- Tactical battle resolution back into Eagle: src/main/scala/net/eagle0/eagle/library/actions/impl/action/ResolveBattleAction.scala.
- Province held/conquered outcomes: src/main/scala/net/eagle0/eagle/library/actions/impl/action/ProvinceHeldAction.scala and src/main/scala/net/eagle0/eagle/library/actions/impl/action/ProvinceConqueredAction.scala.
- Multi-winner aftermath: src/main/scala/net/eagle0/eagle/library/actions/impl/action/MultiVictorBattleSetupAction.scala, src/main/scala/net/eagle0/eagle/library/actions/impl/command/BattleAftermathDecisionCommand.scala, and src/main/scala/net/eagle0/eagle/library/actions/impl/action/FinalizeAftermathAction.scala.
- Battle aftermath decisions: src/main/scala/net/eagle0/eagle/library/actions/impl/action/FinalizeAftermathAction.scala and AutoResolveBattleAftermathAction.scala.
-->
Eagle is the strategic layer. Shardok is the tactical layer. The two connect when armies meet in a province and Eagle needs a battlefield result instead of a simple strategic update.
## Strategic Movement
In Eagle, armies move through the March command. A moving army has an origin province, destination province, arrival round, heroes, battalions, and supplies.
Because Eagle is simultaneous, multiple factions can send armies during the same strategic phase. Those armies arrive later during movement resolution, after every relevant player has had the chance to submit orders for the phase.
## Arrival
When an army reaches its destination, the first question is whether it is friendly to the province's current ruler.
Friendly armies arrive during Province Move Resolution. Their heroes, battalions, gold, and food enter the destination province at that point.
Hostile armies do not immediately enter the province. They are converted into hostile army groups later in the round, after player commands, with one group per attacking faction. Each group keeps the armies, units, supplies, and approach direction from the province it marched from.
After hostile setup, Eagle checks for cases that do not need a tactical battle:
- If a hostile army reaches an unruled province, the largest army group takes it during Uncontested Conquest. Ties are broken by troop power and then a deterministic random tie-breaker.
- If a single attacking army is attacking and there is no defending army, Eagle can resolve the attack directly as a conquest.
- If diplomacy or truces apply, armies may turn back before fighting.
Otherwise, the player may see attack or defense decision phases before a battle is requested.
## Attack and Defense Decisions
Hostile army groups first wait for an attack decision. An attacking faction can choose whether to press the attack when the game asks for that decision.
If an attack proceeds against a ruled province, the defender may need to choose a defending army. The chosen defenders become the province's defending army. If a fallback province is available, the defender may also need to choose where the army should flee or retreat if Shardok produces that outcome.
## Battle Creation
When Eagle creates a Shardok battle, it sends:
- The province's Shardok map.
- The attacking armies.
- The defending army, if any.
- Each side's food for the battle.
- Victory conditions for each player.
- The battle type and battle id.
Attackers in a normal province assault are trying to take the province. Defenders are trying to hold it or survive long enough for the attacker to fail.
The battle food sent to Shardok is limited. Attackers bring up to one month of food consumption from their carried supplies. Defenders bring up to one month of food consumption from the province's food, and that food is removed from the province when the battle is created.
## Tactical Resolution
The battle then runs in Shardok. Players place units, move, attack, use profession commands, spend Action Points, and try to satisfy their victory conditions.
Eagle waits in the battle resolution phase until outstanding Shardok battles report back.
See [Shardok battles](/concepts/shardok-battles/) for the tactical overview and [Shardok victory conditions](/concepts/shardok-victory-conditions/) for battle-ending rules.
## Returning To Eagle
When Shardok reports a result, Eagle applies battle consequences before deciding who owns the province.
The battle result can change:
- Hero locations and status.
- Battalion size and survival.
- Captured heroes and prisoners.
- Supplies brought by attacking armies.
- Province devastation.
- Quest progress and battle history.
- Prestige. Winners gain battle prestige; losers lose battle prestige.
Battles add devastation to the battle province. Surviving units may return, flee, become outlaws, be secured, or be captured depending on the tactical result.
Attackers' remaining gold and food are added to the battle province as part of battle resolution. If the defender holds the province, those supplies become part of the defended province. If an attacker later conquers it, the province changes hands with the supplies already present.
## If The Defender Wins
If the defending side wins, the province remains with its current ruler.
Attackers who did not flee, become outlaws, or get otherwise secured may be captured by the defending faction. Captured attacker battalions can be destroyed. The defender receives a Province Held result and any captured heroes become prisoners in the province.
## If One Attacker Wins
If exactly one attacking faction wins, that faction conquers the province directly.
Conquest does several things at once:
- Sets the conquering faction as the province's ruler.
- Removes the old ruling-faction heroes from the province.
- Adds the surviving non-fled conquering heroes as the new ruling-faction heroes.
- Replaces the province battalions with the surviving conquering battalions.
- Clears the defending army.
- Sets province support to 0.
- Resets province orders to **Entrust**.
- Captures non-fled defenders and former ruling heroes as prisoners.
- Clears the old owner's focus province if this province was their focus.
- Clears recon on the province for all factions.
Prisoners already held in the conquered province can also be freed. Prisoners from the conquering faction join the new rulers at freed-prisoner loyalty. Prisoners from allied factions are sent toward the closest allied province when possible; if no allied province exists, they can become outlaws.
## If Multiple Allied Attackers Win
If multiple attacking factions win together, Eagle cannot automatically know who should keep the province. It creates a pending conquest decision for the surviving attacking claimants.
During Battle Aftermath, each claimant may be asked to choose:
- **Keep Province:** claim the province. Only one claimant can keep it.
- **Withdraw:** leave for an adjacent province, taking up to the gold and food that claimant brought into the battle.
If an ally has already claimed the province, the remaining claimants must withdraw. If only one undecided claimant remains and nobody has claimed the province, Eagle auto-resolves that claimant as keeping it.
When aftermath finalizes, the keeper conquers the province through the same conquest rules as a single attacking winner. Withdrawing claimants become incoming armies to their chosen adjacent provinces, arriving next round with the gold and food they chose to take. These aftermath withdrawals do not apply shipment transit loss.
## Aftermath
Some battle results need another Eagle decision before the round can continue. This happens mainly when multiple allied attackers win the same province or when captured heroes create follow-up handling decisions.
Battle Aftermath happens after tactical results return but before the strategic round fully moves on. It is not a second Shardok battle; it is Eagle deciding ownership, withdrawals, supplies, and captured-hero consequences from the battle that already ended.
Captured heroes can create separate follow-up decisions after this. Those decisions determine what the capturing faction does with the hero now that the battle result has placed them in custody.
@@ -0,0 +1,16 @@
---
title: Game Concepts
description: Player-facing explanations of Eagle and Shardok systems.
---
These pages explain how Eagle0's major systems fit together. Use them when you want the big picture behind the command reference.
## Eagle
- [Eagle round flow](eagle-round-flow/) explains how a strategic round advances, why actions are simultaneous, and when players see results.
- [From Eagle to Shardok](eagle-to-shardok/) explains how strategic movement turns into tactical battles and how battle results return to Eagle.
## Shardok
- [Shardok battles](shardok-battles/) explains tactical setup, turns, units, morale, vigor, terrain, and battle aftermath.
- [Shardok victory conditions](shardok-victory-conditions/) explains how tactical battles end.
@@ -0,0 +1,76 @@
---
title: Shardok Battles
description: How tactical Shardok battles work at a high level.
---
<!--
Source map:
- Shardok battle model: src/main/scala/net/eagle0/eagle/model/state/shardok_battle/ShardokBattle.scala.
- Battle creation from Eagle: src/main/scala/net/eagle0/eagle/library/actions/impl/action/RequestBattlesAction.scala.
- Battle resolution back into Eagle: src/main/scala/net/eagle0/eagle/library/actions/impl/action/ResolveBattleAction.scala.
- Tactical command availability: src/main/cpp/net/eagle0/shardok/library/AvailableCommandsFactory.cpp and command_factories/.
- Victory checks: src/main/cpp/net/eagle0/shardok/library/actions/UpdateGameStatusAction.cpp.
-->
Shardok is the tactical battle layer. Eagle decides that a battle should happen, sends armies into Shardok, and later receives the result back.
## Setup
At the start of a battle, each side places its units onto valid setup hexes. Some battles include reserve or reinforcement units that enter later. Rangers on stealth-capable units may be able to deploy hidden.
The map comes from the province where the battle occurs. A province's Shardok map defines terrain, castles, cities, rivers, bridges, water, and critical tiles.
## Units
A Shardok unit usually represents a hero attached to a battalion. The hero brings stats, vigor, profession abilities, and special command access. The battalion brings troop count, type, morale, training, armament, movement costs, damage profile, and battlefield limits.
Some commands require a profession. Some also require the attached battalion type to support that role. For example, many spell commands require a unit that can cast, while Ranger stealth depends on a stealth-capable battalion.
See [Heroes](/heroes/) for professions and [Shardok commands](/shardok-commands/) for command requirements.
## Action Points
Units act using Action Points. Moving through terrain spends AP based on the terrain and battalion type. Many major actions require a fixed AP minimum and then consume all remaining AP. The [Shardok command reference](/shardok-commands/) lists each command's AP cost and requirements.
Unless a command says otherwise, a unit with morale must have at least 10 morale, and a unit with an attached hero must have at least 10 vigor.
## Turns And Rounds
Shardok advances tactically while units move, attack, cast, hide, scout, flee, and reinforce. When a side ends its turn, control passes according to the tactical state. At the end of a tactical round, Shardok checks end-of-round victory conditions such as holding critical tiles or surviving to the round limit.
Some [victory conditions](/concepts/shardok-victory-conditions/), such as last player standing, can end the battle as soon as only one eligible side remains. Others wait until the end of a round so the opposing side has a chance to respond.
## Terrain
Terrain matters constantly:
- It changes movement costs.
- It affects damage and resistance.
- It can block line of fire.
- Castles and cities can become critical objectives.
- Water, bridges, ice, fire, and mountains create command-specific constraints.
Shardok is not just a troop-count comparison. Position, terrain, hidden information, and command timing matter.
## Hidden Units
Hidden units are not fully visible to enemies. Ranger abilities, scouting, terrain, movement, and proximity can reveal or preserve hidden information.
A hidden unit can matter even at battle end. If a losing hidden unit has a capable hero and can flee, it may escape rather than being resolved like an ordinary visible loser.
## Fleeing, Retreating, And Outlaws
Units can leave a battle through flee or retreat mechanics when those commands are available. A hero may also become an outlaw through battle consequences. Eagle receives these statuses when Shardok reports the final battle result.
## Battle Results
When the battle ends, Shardok reports each player's surviving units, destroyed battalions, fled units, captured or secured units, and victory or loss condition.
Eagle then applies the result:
- Defenders who win hold the province.
- A single attacking winner can conquer the province.
- Multiple allied attacking winners may trigger battle aftermath decisions.
- Captured heroes and prisoners can create follow-up decisions.
- Battle damage can devastate province economy, agriculture, and infrastructure.
- Winning battles can advance quests.
@@ -0,0 +1,58 @@
---
title: Shardok Victory Conditions
description: How tactical battles decide winners and losers.
---
<!--
Source map:
- Victory condition enum: src/main/protobuf/net/eagle0/common/victory_condition.proto.
- Shardok victory checks: src/main/cpp/net/eagle0/shardok/library/actions/UpdateGameStatusAction.cpp.
- Eagle assignment of battle victory conditions: src/main/scala/net/eagle0/eagle/library/actions/impl/action/RequestBattlesAction.scala.
-->
Shardok battles end when one of the battle's victory conditions is satisfied. Each player has a set of conditions that apply to them.
In a normal Eagle province assault, attackers usually get **Hold Critical Tiles**, **Last Player Standing**, and **Last Alliance Standing**. The defender usually gets **Last Player Standing** and **Win After Max Rounds**.
## Last Player Standing
A player wins if they are the only surviving player and they have this victory condition.
A player counts as surviving when they still have a visible normal unit with troops, or a visible normal unit with a living hero. Hidden units do not keep a player alive for this check, though some hidden losing units may be able to flee when the battle ends.
## Last Alliance Standing
Multiple players can win together if all surviving players are mutually allied and all have this victory condition.
This is the tactical version of "the only forces left on the field are allies."
## Win After Max Rounds
A player wins if the battle lasts past the maximum number of Shardok rounds and they have this victory condition.
In normal province assaults, this is usually the defender's clock. The attacker has to force a result before time runs out.
## Hold Critical Tiles
A player wins by controlling every critical tile on the map. Critical tiles are usually castles or other objective tiles.
To count, each critical tile must be occupied by a unit belonging to the winning player, and the occupying unit must have an attached hero.
Allied attackers can also win this way together if allied players collectively occupy all critical tiles, all occupying players have the condition, and the occupants are mutually allied.
This condition is checked at the end of a tactical round, not immediately after every move, so the defender has a chance to retake objectives before the round closes.
## Most Troops Standing
This condition exists in the battle model, but normal Eagle province assaults do not currently assign it to attackers or defenders.
If a battle type uses it, the winner is the player with the most troops standing when the battle reaches the relevant ending check.
## What Happens After Victory
Shardok reports each player as victorious or defeated, including which condition ended the battle. Eagle then turns that tactical result into strategic consequences:
- A defending winner holds the province.
- A single attacking winner conquers the province.
- Multiple allied attacking winners may need to decide who keeps the province.
- Captured heroes, destroyed battalions, fled units, outlaws, and secured prisoners are applied to the Eagle game state.
@@ -0,0 +1,104 @@
---
title: Factions
description: Reference for Eagle factions, leaders, prestige, diplomacy, and province focus.
---
Factions are the political actors in Eagle. They control provinces, command heroes and battalions, negotiate diplomacy, and compete for victory.
<!-- Sources:
- FactionView shape: src/main/protobuf/net/eagle0/eagle/views/faction_view.proto
- Relationship levels: src/main/protobuf/net/eagle0/eagle/views/faction_relationship_view.proto
- Trust storage: src/main/scala/net/eagle0/eagle/model/state/faction/FactionRelationship.scala
- Swear Kinship availability: src/main/scala/net/eagle0/eagle/library/actions/availability/AvailableSwearBrotherhoodCommandFactory.scala
- Swear Kinship effect: src/main/scala/net/eagle0/eagle/library/actions/impl/command/SwearBrotherhoodCommand.scala
- Leadership and destruction: src/main/scala/net/eagle0/eagle/library/actions/impl/action/CheckForFactionChangesAction.scala
- Free hero states and recruitment info: src/main/scala/net/eagle0/eagle/model/state/unaffiliated_hero/UnaffiliatedHeroT.scala
- Recruitment availability and odds: src/main/scala/net/eagle0/eagle/library/actions/availability/AvailableRecruitHeroesCommandFactory.scala
and src/main/scala/net/eagle0/eagle/library/util/recruitment_odds/RecruitmentOdds.scala
- Prestige calculation: src/main/scala/net/eagle0/eagle/library/util/faction_utils/FactionUtils.scala
- Truce, alliance, break-alliance, ransom, and imprisonment effects:
src/main/scala/net/eagle0/eagle/library/actions/impl/action/diplomacy_helpers/
- Trust constants: src/main/scala/net/eagle0/eagle/library/settings/BUILD.bazel
-->
## Faction Head
The faction head is the hero who represents the faction. In a normal game, this is usually your starting leader: the hero whose ideals, title, and story define what your faction is about.
If the faction head is killed, another faction leader can take over as faction head. The faction may also be renamed around the new head if that hero has a faction name of their own.
## Leaders
[Faction leaders](/heroes/#faction-leaders) are the heroes you can command directly. They are different from [vassals](/heroes/#vassals), who rule provinces for you and make their own choices.
You can gain more faction leaders with [**Swear Kinship**](/commands/#swear-kinship). The command is available when your faction head is in the province, your faction has fewer than 5 leaders, and another hero in the province has at least 95 loyalty. The new kinship hero becomes a faction leader.
Faction leaders matter for succession. If the faction head dies, the next available faction leader becomes faction head. If no surviving leader is available to take over immediately, the strongest remaining vassal can rise to become a new faction leader and faction head.
## Prestige
Prestige is a high-level measure of faction stature. It is also the main faction-wide factor in whether free heroes are willing to join you.
You gain prestige by:
- Controlling more provinces whose support is high enough for taxes. Each supported province is worth 10 prestige.
- Winning battles.
- Defeating beasts.
Prestige is not the only recruitment factor. The faction head's charisma, the free hero's power and ambition, the hero's current state, and any personal bias toward or against your faction also matter. But when you want more heroes to take you seriously, prestige is the big strategic lever.
## Free Heroes
Free heroes are heroes in a province who do not currently belong to your faction's command structure. The Free Hero panel tells you what state they are in and whether they can be recruited, divined, or managed another way.
The common states are:
- **Resident:** A hero living in the province. Residents may be willing to join outright. If they are not ready, they may be divinable: use [**Divine**](/commands/#divine) to learn what would impress them, then fulfill that ask to make them recruitable.
- **Traveler:** A hero passing through. You do not know whether a traveler would join you until a faction leader travels there and talks to them. Travelers are harder to recruit than residents, but they might still join if your prestige and other recruitment factors are strong enough. They are also likely to leave the province soon, so they are more time-sensitive than residents.
- **Prisoner:** A captured hero. Prisoners start with a strong bias against the faction holding them, but desperation can build over time. Eventually a prisoner may become willing to join, especially if your prestige is high enough.
- **Outlaw:** A hostile free hero in the province. Outlaws are not ordinary recruits and will not simply join from the Free Hero panel; you generally deal with them through commands such as [**Apprehend Outlaw**](/commands/#apprehend-outlaw).
Some free heroes are effectively unavailable until circumstances change. For example, a province without one of your faction leaders cannot recruit from the Free Hero panel, and a hero may refuse forever if they have a permanent reason not to join your faction.
## Relationships
Faction relationships have a visible diplomatic state and an internal trust value.
The visible relationship states are:
- **Hostile:** The default enemy state. Hostile factions can fight each other.
- **Truce:** A temporary peace. Truce offers set a reset date; when that date passes, the relationship returns to hostile. A truce or alliance also causes hostile armies between those factions to turn back during the truce turn-back phase.
- **Alliance:** A stronger cooperative relationship. Alliances do not have a reset date. They last until they are broken.
Trust is a hidden number used by AI diplomacy. Higher trust makes a faction more willing to accept diplomatic offers. Trust changes in a few ways:
- Trust rises by 1 each new round between every pair of factions.
- Accepting a ransom offer raises the offering faction's trust in the faction that accepted it by 25.
- Rejecting a ransom offer lowers the offering faction's trust in the rejecting faction by 25.
- Imprisoning another faction's ambassador is a major trust hit: the ambassador's faction loses 150 trust toward the imprisoning faction.
- Other factions also notice ambassador imprisonment: each neutral faction loses 40 trust toward the imprisoning faction.
## Incoming Diplomacy Offers
Incoming offers are unresolved diplomatic proposals from other factions. They become [special and conditional commands](/commands/#special-and-conditional-commands) such as resolving truce offers, alliance offers, invitations, ransom offers, or alliance breaks.
## Focus Province
A faction can have a focus province. The focus province helps direct [province orders](/provinces/#province-orders) and AI attention toward a particular province.
## Faction Destruction
A faction is destroyed if either of these is true:
- It has no ruled provinces and no moving armies.
- It has no faction leaders left.
The leader case has one extra succession step. If a faction loses its available leaders but still has provinces or armies, the game first looks for the strongest surviving vassal and promotes that hero to faction leader and faction head. If no vassal can rise, the faction has no faction leaders left and is destroyed.
When a faction is destroyed:
- Its provinces lose their ruling faction.
- Its incoming armies are removed, and their supplies are left in the province.
- Its heroes lose their faction assignment.
- Other factions lose relationships and incoming offers involving the destroyed faction.
- If only one faction remains, the game ends and that faction wins. If no factions remain, the game ends with no winner.
@@ -0,0 +1,216 @@
---
title: Heroes
description: Reference for Eagle heroes, stats, professions, and battlefield roles.
---
Heroes are named characters who lead factions, rule provinces, command troops, perform strategic commands, and appear as units in Shardok battles.
The player-facing hero model is `HeroView`. It includes identity, faction membership, profession, core stats, personality stats, vigor, loyalty, abilities, portrait path, and backstory text.
## Core Stats
- **Strength** affects physical power and contributes to combat-oriented commands.
- **Agility** affects mobility, scouting-style competence, and some profession eligibility.
- **Constitution** sets a hero's endurance profile and is closely tied to vigor.
- **Charisma** affects leadership, loyalty, diplomacy-flavored actions, and some profession eligibility.
- **Wisdom** affects knowledge, magic-flavored actions, and some profession eligibility.
Stats can also have XP values. Strategic commands often spend vigor and grant XP in the stats connected to that action.
## Personality Stats
- **Integrity** represents trustworthiness and moral reliability.
- **Ambition** represents appetite for power or advancement.
- **Gregariousness** represents sociability and ease with other heroes.
- **Bravery** represents willingness to face danger.
These values help drive hero flavor, AI decisions, and story generation.
## Vigor
Vigor is a hero's current energy. Many commands require an acting hero and spend vigor. Resting restores vigor up to the hero's constitution.
## Loyalty
Loyalty measures a hero's attachment to their faction. Feasts, events, captures, faction bias, and story consequences can move loyalty over time.
## Professions
Professions give heroes special command access, bonuses, and tactical identity. Some effects are Eagle strategic effects, while others apply only when the hero is attached to a Shardok battle unit.
Several Shardok profession commands also depend on the attached battalion type. For example, many magic commands require a battalion type that allows casting, and stealth commands require a battalion type that allows stealth.
### Mage
Eagle effects:
- Unlocks **Control Weather** for a mage in the acting province with enough vigor.
- Can start or end blizzards and droughts in the acting province or a neighboring province.
- Counts as a profession for general hero power and riot-crackdown hero power.
- Makes the hero naturally capable of starting fires.
Shardok effects:
- Unlocks **Lightning Bolt** when attached to a casting-capable unit.
- Unlocks the multi-round **Meteor** command chain: start, target, cast, and cancel.
- Unlocks **Freeze Water** on adjacent water when attached to a casting-capable unit.
- Improves **Start Fire** odds when the unit can start fires.
- Changes hero melee damage from physical damage to magical damage: lightning, cold, fire, and aether essence.
- Can influence AI water-crossing evaluation because Mage can freeze water.
Profession gain:
- Wisdom is the qualifying stat for Mage.
### Necromancer
Eagle effects:
- Unlocks **Start Epidemic** for a necromancer in the acting province with enough vigor.
- Epidemics can target the acting province or neighboring provinces, excluding friendly provinces that already have an epidemic.
- Counts as a profession for general hero power and riot-crackdown hero power.
Shardok effects:
- Unlocks **Raise Dead** when attached to a casting-capable unit and not already controlling a unit.
- Unlocks **Fear** against eligible enemy units when attached to a casting-capable unit.
- Raised dead and fear use the hero's charisma and wisdom in their odds.
Profession gain:
- Charisma is one qualifying stat for Necromancer.
### Engineer
Eagle effects:
- Is recommended first for **Improve** when an engineer is available.
- Adds the configured engineer bonus to province improvements and devastation repair.
- Counts as a profession for general hero power and riot-crackdown hero power.
Shardok effects:
- Unlocks **Build Bridge** from non-water terrain onto adjacent water.
- Unlocks **Repair** for damaged bridges and castles.
- Unlocks **Blow Bridge** while standing on a bridge.
- Unlocks **Reduce** from a castle or fortified position against enemy units or castles.
- Unlocks **Fortify** on fortifiable terrain.
- Can influence AI water-crossing evaluation because engineers can create and destroy bridge access.
Profession gain:
- Agility is one qualifying stat for Engineer.
### Paladin
Eagle effects:
- Improves **Alms** by multiplying the support gained per food given.
- Is sorted first in the **Alms** hero list when eligible.
- Counts as a profession for general hero power and riot-crackdown hero power.
Shardok effects:
- Unlocks **Holy Wave** when the paladin has enough action points.
Profession gain:
- Charisma is one qualifying stat for Paladin.
### Ranger
Eagle effects:
- Unlocks **Recon** for a ranger in the acting province with enough vigor.
- Recon can target provinces not ruled by the acting faction, as long as that faction does not already have a pending recon there.
- Counts as a profession for general hero power and riot-crackdown hero power.
Shardok effects:
- Unlocks **Scout** when attached to a stealth-capable unit.
- Unlocks **Hide** when attached to a stealth-capable unit, outside enemy zone of control, and with multiple hideable positions.
- Allows defending rangers with stealth-capable units to use hidden placement during setup.
- Gives a bonus to **Brave Water** odds when the unit can brave water.
- Reveals adjacent hidden enemies while moving.
- Prevents adjacent enemies from hiding or remaining hidden when the ranger has enough knowledge to be identified.
Profession gain:
- Agility is one qualifying stat for Ranger.
### Champion
Eagle effects:
- Is recommended first for **Train** when a champion is available.
- Adds the configured champion bonus to training gained by trainable battalions.
- Counts as a profession for general hero power and riot-crackdown hero power.
Shardok effects:
- Unlocks **Challenge Duel** against adjacent enemy heroes outside castles.
- The target must have an attached hero and must either have enough known vigor to accept or be insufficiently known to rule that out.
Profession gain:
- Strength is the qualifying stat for Champion.
### Warden
Eagle effects:
- Improves prisoner recruitment over time. At new round processing, prisoners in a province with a ruling-faction Warden gain additional faction bias toward that province's ruler.
- Counts as a profession for general hero power and riot-crackdown hero power.
Shardok effects:
- Unlocks **Evacuate Prisoners** when the warden's unit can flee, has enough action points, and hostile captured hero units are present.
Profession gain:
- Constitution is the qualifying stat for Warden.
### NoProfession
Heroes with no profession have no profession-specific command unlocks. They can still lead, fight, train, improve, march, use many normal strategic commands, and gain a profession later.
## Profession Gain
Only heroes with **NoProfession** can gain a profession. At the end of a round, heroes with enough XP can gain stats. If a no-profession hero gains one or more stats, the game checks for profession gain:
- The hero gets one profession-gain roll for each stat that increased.
- Eligible professions are based on all post-gain stats at or above the configured prime-stat threshold.
- Strength qualifies **Champion**.
- Agility qualifies **Engineer** and **Ranger**.
- Wisdom qualifies **Mage**.
- Charisma qualifies **Necromancer** and **Paladin**.
- Constitution qualifies **Warden**.
## Faction Leaders
Every faction starts with a **faction head**. The faction head is the hero who defines what the faction represents: its political identity, its public story, and the starting point for its leadership.
Factions can gain additional faction leaders through **Swear Kinship** with another hero. The candidate must already belong to the faction, must have at least 95 loyalty, and must be in a province with the faction head. When the command succeeds, that hero becomes one of the faction's leaders.
Faction leaders are directly commandable. Vassals, by contrast, lead provinces and make their own choices when their province acts. Promoting a loyal vassal into leadership gives the player more direct control over that hero.
Faction leaders also provide succession. If the faction head is killed, another available faction leader can take over as the new faction head.
## Vassals
A **vassal** is a hero who belongs to your faction and rules one of its provinces, but is not a faction leader. You cannot command vassals directly. Instead, their provinces act during the Vassal Commands phase, when each vassal chooses an action based on the province's standing orders and immediate needs.
Vassals can be given standing orders with **Issue Orders**, promoted to faction leaders with **Swear Kinship**, or removed from the faction with **Exile Vassal**.
## Unaffiliated Heroes
Unaffiliated heroes can appear in provinces before joining a faction. Their province entry includes name, profession, status, leader flag, and recruitment information.
Common interactions include recruiting them, divining more information about them, declining their quests, or responding when they ask to join.
## Battle Capabilities
Hero views expose whether a hero is archery-capable or start-fire-capable. Those capabilities affect Shardok command availability when the hero is represented in battle.
- **Archery-capable**: the hero needs at least 75 agility.
- **Start-fire-capable**: the hero is always capable if they are a Mage. Otherwise, they need at least 70 agility and at least 70 wisdom.
@@ -0,0 +1,23 @@
---
title: Eagle0pedia
description: Reference companion for Eagle0 commands, systems, and game concepts.
---
Eagle0pedia is the in-game reference companion for Eagle0. The tutorial answers "what should I do next?"; these pages answer "what does this mean?"
Eagle0 is a strategy game about factions, heroes, provinces, armies, diplomacy, and tactical battles. The broad strategic layer is **Eagle**: provinces produce food and gold, heroes lead factions or rule as vassals, armies march across the map, and diplomacy shapes the war. When armies clash, battles are resolved in **Shardok**, the tactical hex-based combat system.
Use these pages when you want a quick reference for commands, hero professions, faction leadership, province stats, or tactical battle options.
## Sections
- [Game concepts](concepts/) explains the flow of Eagle rounds, the handoff from Eagle to Shardok, tactical battles, and victory conditions.
- [Eagle round flow](concepts/eagle-round-flow/) explains strategic phases and simultaneous player action.
- [From Eagle to Shardok](concepts/eagle-to-shardok/) explains how strategic armies become tactical battles.
- [Shardok battles](concepts/shardok-battles/) explains tactical battle structure, units, terrain, and aftermath.
- [Shardok victory conditions](concepts/shardok-victory-conditions/) explains how tactical battles end.
- [Eagle commands](commands/) explains the strategic commands available from province command panels.
- [Shardok commands](shardok-commands/) explains tactical battle commands and profession-gated battlefield actions.
- [Heroes](heroes/) covers stats, vigor, loyalty, professions, faction leaders, and battle capabilities.
- [Factions](factions/) covers faction heads, leaders, prestige, diplomacy, and focus provinces.
- [Provinces](provinces/) covers province stats, supplies, orders, armies, maps, castles, and unaffiliated heroes.
@@ -0,0 +1,19 @@
---
title: Integration Notes
description: Technical notes for Eagle0pedia links, deployment, and review.
---
Eagle0pedia lives close to the game data and can be reviewed with code changes before being deployed to `pedia.eagle0.net`.
## Link Targets
Unity info buttons should link to stable concept URLs. For the command panel, start with anchors on the command reference page:
- `https://pedia.eagle0.net/commands/#train`
- `https://pedia.eagle0.net/commands/#march`
- `https://pedia.eagle0.net/commands/#diplomacy`
- `https://pedia.eagle0.net/shardok-commands/#melee`
- `https://pedia.eagle0.net/heroes/#professions`
- `https://pedia.eagle0.net/provinces/#province-stats`
When individual command pages are split out, keep redirects or aliases for these anchors so older clients still land somewhere useful.
@@ -0,0 +1,229 @@
---
title: Provinces
description: Reference for Eagle provinces, resources, infrastructure, orders, and tactical maps.
---
Provinces are the strategic map locations in Eagle. They hold resources, heroes, battalions, province orders, incoming armies, local events, and the Shardok map used when battles occur there.
The player-facing province model is `ProvinceView`. Public information includes id, name, ruling faction, known events, known incoming armies, and an `as_of` date. When you have full information, `FullProvinceInfo` adds the detailed local state: gold, food, caps, support, food consumption, battalions, heroes, orders, incoming shipments, and local events.
<!--
Source map:
- Province view fields: src/main/protobuf/net/eagle0/eagle/views/province_view.proto and src/main/scala/net/eagle0/eagle/library/util/view_filters/ProvinceViewFilter.scala.
- Province utilities: src/main/scala/net/eagle0/eagle/library/util/province/ProvinceUtils.scala.
- New year production and yearly degradation: src/main/scala/net/eagle0/eagle/library/actions/impl/action/NewYearAction.scala.
- New round caps, price-index drift, empty-province devastation repair, and hero-cap loyalty pressure: src/main/scala/net/eagle0/eagle/library/actions/impl/action/NewRoundAction.scala.
- Food consumption and starvation: src/main/scala/net/eagle0/eagle/library/actions/impl/action/PerformFoodConsumptionPhaseAction.scala.
- Shipment arrival: src/main/scala/net/eagle0/eagle/library/actions/impl/action/ShipmentArrivedAction.scala and src/main/scala/net/eagle0/eagle/library/actions/impl/action/PerformProvinceMoveResolutionAction.scala.
- Price index: src/main/scala/net/eagle0/eagle/library/util/PriceIndexUtils.scala.
- Settings: src/main/resources/net/eagle0/eagle/settings.tsv.
-->
## Strategic Role
A province is both a resource base and a staging point. It can:
- Produce gold and food at the new year.
- Store gold and food between commands.
- Feed stationed battalions each round.
- Hold heroes, battalions, prisoners, unaffiliated heroes, and events.
- Launch March, Send Supplies, Train, Improve, Arm Troops, Trade, and other province commands.
- Become a Shardok battlefield when hostile armies meet there.
The important strategic question is usually not just "how high are the stats?" It is "can this province keep support above 40, feed its troops, store enough supplies, and stage the actions I need before another faction interferes?"
## Development Stats
The three main development stats are **economy**, **agriculture**, and **infrastructure**.
- **Economy** drives annual gold production. A supported province produces 35 gold per effective economy at the new year.
- **Agriculture** drives annual food production. A supported province produces 50 food per effective agriculture at the new year.
- **Infrastructure** increases gold and food storage caps, affects improvement quality, and caps how far battalions can be armed.
Each stat has a matching devastation track. The effective value is the stat minus its devastation, never below 0. For example, 80 agriculture with 25 agriculture devastation behaves like 55 effective agriculture for production and other effective-stat checks.
Improve can raise economy, agriculture, or infrastructure. It can also repair devastation across all three devastation tracks. Engineers get a bonus when improving.
## Support
Support is local backing for the ruling faction. It ranges from 0 to 100 and is one of the most important province numbers.
A province needs at least **40 support** to provide annual gold and food production. If support is below 40, the province does not produce taxes at the new year. That also matters for prestige: supported provinces are worth prestige to the ruling faction.
Support changes through several commands and events:
- **Alms** spends food to raise support.
- **Improve** raises support as a side effect.
- **Riot** damage reduces support by 25 if the riot is not stopped.
- **Suppress Beasts** can raise support on success.
- Province events can raise or lower support.
Support also affects risk. Low support makes the province less useful economically and affects riot timing.
## Gold
Gold pays for many strategic actions. Feast, Organize Troops, Arm Troops, Divine, Hero Gift, diplomacy, Trade buys, and some other commands spend gold.
At the new year, supported provinces gain annual gold equal to:
`effective economy * 35`
Gold is stored in the province until spent, traded, shipped, marched away, captured through conquest, or lost because the province is over its storage cap.
Feast costs gold, not food: 20 gold per ruling-faction hero in the province, multiplied by the province price index.
## Food
Food supports armies and can also be spent strategically.
At the new year, supported provinces gain annual food equal to:
`effective agriculture * 50`
Food is consumed during the Food Consumption phase by battalions stationed in the province and by moving armies. The province view exposes monthly food consumption so you can judge how long the province can feed its current troops.
Food is also used by:
- **Alms**, which spends food to raise support.
- **Trade**, which buys or sells food for gold.
- **Send Supplies**, which can ship food to another province.
- **March**, which can carry food with moving armies.
- Riot gifts, if you choose to give food.
## Food Consumption and Starvation
Food consumption happens during the Food Consumption phase, after Province Move Resolution, player commands, hostile army setup, and battle requests, but before Battle Resolution.
This timing matters:
- A Send Supplies shipment that arrives during Province Move Resolution is available before the destination province consumes food later that same round.
- A friendly marching army that arrives during Province Move Resolution can also bring food before that round's food consumption.
- Moving armies consume food from their own carried supplies while they are still incoming.
If a province cannot feed its battalions, it spends all remaining province food and the battalions are reduced. The maximum battalion reduction from a food shortage is 20% in a single food-consumption event.
The same starvation rule applies to moving armies: if the army's carried food is not enough, the moving battalions are reduced and the army's food drops to 0.
Low-food warnings look ahead to incoming food, upcoming taxes, support, and expected production. If the province has enough food arriving before the next consumption, the warning can account for that.
## Storage Caps
Provinces have separate gold and food caps. These caps are based on effective development and infrastructure:
- Gold cap uses effective economy plus effective infrastructure.
- Food cap uses effective agriculture plus effective infrastructure.
- Both start from a base storage limit of 5000.
- Each point of relevant development or infrastructure adds 50 storage.
- A faction's focus province gets 1.5x storage.
Being over cap is not an immediate hard cutoff. During New Round processing, the province loses 20% of the amount above each cap, rounded up. Excess supplies therefore decay over time unless you spend them, ship them, trade them, or move them.
## Price Index
Price index is local price pressure. It changes costs and trade prices in the province.
The normal range is 0.75 to 1.5. A price index above 1 makes local purchases more expensive; below 1 makes them cheaper.
Gold spending can push the price index upward. Selling food counts as negative gold spending and can push it downward. Each gold spent changes the index by 0.0001, clamped to the normal range.
The price index also drifts each new round toward a local steady state based on development and devastation. It moves 10% of the distance toward that steady state per round.
Commands affected by price index include:
- **Feast** gold cost.
- **Organize Troops** troop costs.
- **Arm Troops** armament costs.
- **Trade** buy and sell prices.
- **Divine** cost.
- **Hero Gift** loyalty gained per gold.
## Devastation
Devastation is damage to province systems. Economy, agriculture, and infrastructure each have their own devastation value.
Devastation reduces the corresponding effective stat. That means:
- Economy devastation reduces gold production and gold storage.
- Agriculture devastation reduces food production and food storage.
- Infrastructure devastation reduces storage, armament ceiling, and infrastructure-dependent checks.
Battles and province events can add devastation. Riots add economy and infrastructure devastation. Blizzards, droughts, floods, epidemics, and battle results can damage different province systems.
Improve with the Devastation option repairs all three devastation tracks. Empty provinces also recover devastation slowly during new round processing.
## Infrastructure and Troops
Infrastructure matters militarily because it caps armament. Arm Troops cannot raise a battalion's ARM above the province's effective infrastructure.
Economy and agriculture also affect which battalion types can be raised in the province. Battalion type availability checks the province's effective economy and effective agriculture against the battalion type's minimums.
Training is handled by [**Train**](/commands/#train). Armament is handled by [**Arm Troops**](/commands/#arm-troops). Organizing troop counts, creating battalions, resizing battalions, and dismissing battalions are handled by [**Organize Troops**](/commands/#organize-troops).
## Heroes and Hero Cap
A province has a hero cap. The default map data sets hero cap from castle count: each castle gives 5 hero capacity.
Going over the cap is allowed, but it creates loyalty pressure. During new round processing, if the province has too many established ruling-faction heroes, those heroes lose loyalty. Newly joined heroes are exempt for their first few rounds.
This is why moving heroes around is not just about command access. Keeping too many heroes stacked in one province can create long-term loyalty damage.
## Ruling Faction and Ruling Hero
A province can have a ruling faction and a ruling hero. The ruling hero is the local leader for the province.
If a faction leader rules the province, the player can command that leader directly. If a [vassal](/heroes/#vassals) rules it, the province acts through vassal behavior during the [Vassal Commands phase](/concepts/eagle-round-flow/#vassal-commands) unless another special phase interrupts it.
Province leadership also matters for riots. The province leader's Charisma affects riot size and gift success, even if another hero is selected to crack down.
## Province Orders
Province orders are standing instructions for vassal-led provinces. The [**Issue Orders**](/commands/#issue-orders) command changes them and can also set or clear the faction focus province.
The main orders are:
- **Entrust:** let the vassal judge the situation.
- **Develop:** build up and improve the province.
- **Mobilize:** prepare military strength and supplies.
- **Expand:** look for growth, movement, and attack opportunities.
The focus province also affects logistics. Vassals may ship excess gold and food toward the focus province if one is set, or toward the nearest faction leader if not.
## Incoming Armies
Incoming armies represent forces that are moving toward the province but have not arrived or resolved yet.
Friendly incoming armies arrive during [Province Move Resolution](/concepts/eagle-round-flow/#province-move-resolution) if the destination is already ruled by their faction. Hostile arrivals do not simply enter the province; they can become hostile army groups and later trigger conquest, attack decisions, defense decisions, battle requests, and [Shardok battles](/concepts/eagle-to-shardok/).
Incoming armies can carry gold and food. If supplies arrive with a friendly movement, transit loss can reduce the amount received.
## Incoming Shipments
Incoming shipments are supplies sent by [**Send Supplies**](/commands/#send-supplies).
The origin province loses the selected gold and food immediately. The destination receives an incoming shipment scheduled for the next round. During the next round's Province Move Resolution phase, the shipment arrives before food consumption. 10% is lost in transit, rounded down after loss.
Because shipments arrive before food consumption, shipping food can prevent starvation in the destination province during the arrival round.
## Province Events
Province events are temporary or local conditions that affect the province.
Important event types include:
- **Riot:** requires a decision if it reaches Handle Riot. If not stopped, it causes support loss and devastation.
- **Beasts:** can damage support over time and can be suppressed for rewards and prestige.
- **Blizzard:** damages province systems and affects supplies.
- **Drought:** damages agriculture.
- **Flood:** damages infrastructure and agriculture.
- **Epidemic:** damages economy, battalions, and hero vigor, and can spread or end over time.
- **Festival:** improves support and prestige while active.
Some events can be created or changed by commands. Mages can use [**Control Weather**](/commands/#control-weather) to start or end blizzards and droughts. Necromancers can use [**Start Epidemic**](/commands/#start-epidemic).
## Tactical Map and Castles
Each province has a `hex_map_name`. When a battle occurs there, Eagle uses that name to choose the Shardok tactical map.
`castle_count` records the province's fortification count. Castles matter for hero capacity, defensive setup, tactical objectives, and some battle behavior.
The source map data in `province_map.tsv` defines province ids, names, neighbor ids, neighbor positions, tactical map names, neighbor names, and castle counts.
@@ -0,0 +1,422 @@
---
title: Shardok Commands
description: Tactical command reference for Shardok battles.
---
<span class="command-reference-marker" aria-hidden="true"></span>
<span class="command-reference-five-row-marker" aria-hidden="true"></span>
<!--
Source map for Shardok command requirements/costs:
- Shared morale/vigor filters: src/main/resources/net/eagle0/shardok/settings.tsv fields minimumMoraleToAct=10 and minimumVigorToAct=10; applied in src/main/cpp/net/eagle0/shardok/library/AvailableCommandsFactory.cpp.
- Fixed AP setting values: src/main/resources/net/eagle0/shardok/settings.tsv. Most command factories call SettingsGetter::ActionCostFor(...) in src/main/cpp/net/eagle0/shardok/library/settings/GameSettings.cpp, which returns ActionCost::usesAll; see src/main/cpp/net/eagle0/shardok/library/ActionCost.hpp and src/main/cpp/net/eagle0/shardok/library/unit/Unit.cpp.
- Melee: meleeActionPointCost=5; src/main/cpp/net/eagle0/shardok/library/command_factories/melee_command_factory/MeleeCommandFactory.cpp.
- Archery: archeryActionPointCost=5 and longbowWindBonusRangeMinSpeed=20; hero archery threshold is agility >= 75 in src/main/cpp/net/eagle0/shardok/ai_battle_simulator/AiBattleSimulator.cpp; normal targets come from TwoAwayTilesUnblockedByMountains in src/main/cpp/net/eagle0/shardok/library/util/HexMapUtils.cpp; longbow castle-adjacent and wind-assisted range-3 exceptions are in src/main/cpp/net/eagle0/shardok/library/command_factories/archery_command_factory/ArcheryCommandFactory.cpp; volley spend is in src/main/cpp/net/eagle0/shardok/library/commands/ArcheryCommand.cpp.
- Charge: terrain-entry cost from BattalionType::GetCostToEnterTerrain(...); allowsMoveAfterCharge is true for Light Cavalry and Heavy Cavalry in src/main/resources/net/eagle0/shardok/battalionTypes.tsv; stun settings are baseStunChanceOnCharge and trainingDifferenceMultiplierForStunChanceOnCharge in the same file; src/main/cpp/net/eagle0/shardok/library/command_factories/ChargeCommandFactory.cpp.
- Move: per-hex terrain-entry costs, plus extraCostForZocMovement=1; src/main/cpp/net/eagle0/shardok/library/command_factories/MoveCommandFactory.cpp and src/main/cpp/net/eagle0/shardok/library/commands/MoveCommand.cpp.
- Lightning Bolt: lightningActionPointCost=5 and lightningRange=3; src/main/cpp/net/eagle0/shardok/library/command_factories/LightningBoltCommandFactory.cpp and src/main/cpp/net/eagle0/shardok/library/commands/LightningBoltCommand.cpp.
- Meteor: meteorStartActionPointCost=5, meteorTargetActionPointCost=0, meteorCancelActionPointCost=0, meteorCastActionPointCost=1, meteorCastVigorCost=20, and meteorRange=3; src/main/cpp/net/eagle0/shardok/library/command_factories/MeteorStartCommandFactory.cpp, MeteorTargetCommandFactory.cpp, src/main/cpp/net/eagle0/shardok/library/util/MeteorRangeCoords.cpp, src/main/cpp/net/eagle0/shardok/library/commands/MeteorStartCommand.cpp, MeteorTargetCommand.cpp, MeteorCancelCommand.cpp, and src/main/cpp/net/eagle0/shardok/library/actions/MeteorCastAction.cpp.
- Start Fire: startFireActionPointCost=5; hero start-fire thresholds are Mage or agility >= 70 and wisdom >= 70 in src/main/cpp/net/eagle0/shardok/ai_battle_simulator/AiBattleSimulator.cpp; src/main/cpp/net/eagle0/shardok/library/command_factories/StartFireCommandFactory.cpp and src/main/cpp/net/eagle0/shardok/library/commands/StartFireCommand.cpp.
- Extinguish Fire: extinguishActionPointCost=5; src/main/cpp/net/eagle0/shardok/library/command_factories/ExtinguishFireCommandFactory.cpp and src/main/cpp/net/eagle0/shardok/library/commands/ExtinguishFireCommand.cpp.
- Freeze Water: freezeWaterActionPointCost=5; src/main/cpp/net/eagle0/shardok/library/command_factories/FreezeWaterCommandFactory.cpp.
- Build Bridge: buildBridgeActionPointCost=5; src/main/cpp/net/eagle0/shardok/library/command_factories/BuildBridgeCommandFactory.cpp.
- Blow Bridge: blowBridgeActionPointCost=5; src/main/cpp/net/eagle0/shardok/library/command_factories/BlowBridgeCommandFactory.cpp.
- Placement: no AP cost in setup commands; src/main/cpp/net/eagle0/shardok/library/actions/PlaceUnitCommand.cpp and PlaceHiddenUnitCommand.cpp.
- Scout: scoutActionPointCost=5 and scoutRange=4; src/main/cpp/net/eagle0/shardok/library/command_factories/ScoutCommandFactory.cpp.
- Raise Dead: raiseDeadActionPointCost=5 and raiseDeadRange=2; src/main/cpp/net/eagle0/shardok/library/command_factories/RaiseDeadCommandFactory.cpp.
- Dismiss Unit: requires remainingActionPoints > 0 in src/main/cpp/net/eagle0/shardok/library/command_factories/ControlCommandFactory.cpp; execution zeroes both units in src/main/cpp/net/eagle0/shardok/library/commands/DismissUnitCommand.cpp.
- Holy Wave: holyWaveActionPointCost=5; src/main/cpp/net/eagle0/shardok/library/command_factories/HolyWaveCommandFactory.cpp.
- Stop and Rest: stop posts no AP cost; rest zeroes AP in src/main/cpp/net/eagle0/shardok/library/commands/UnitRestCommand.cpp; stop implementation in UnitStopCommand.cpp.
- Challenge Duel: challengeDuelActionPointCost=5; src/main/cpp/net/eagle0/shardok/library/command_factories/ChallengeDuelCommandFactory.cpp and src/main/cpp/net/eagle0/shardok/library/commands/challenge_duel_command/ChallengeDuelCommand.cpp.
- Fear: fearActionPointCost=5 and fearRange=3; src/main/cpp/net/eagle0/shardok/library/command_factories/FearCommandFactory.cpp.
- Repair: repairActionPointCost=5; src/main/cpp/net/eagle0/shardok/library/command_factories/RepairCommandFactory.cpp.
- Reduce: reduceActionPointCost=5 and reduceRange=3; src/main/cpp/net/eagle0/shardok/library/command_factories/ReduceCommandFactory.cpp.
- Flee and Retreat: fleeActionPointCost=5 and retreatActionPointCost=5; src/main/cpp/net/eagle0/shardok/library/command_factories/FleeCommandFactory.cpp and RetreatCommandFactory.cpp.
- Control: requires remainingActionPoints > 0 in ControlCommandFactory.cpp; execution zeroes acting unit in src/main/cpp/net/eagle0/shardok/library/commands/ControlCommand.cpp.
- Reinforce: reinforceActionPointCost=5; src/main/cpp/net/eagle0/shardok/library/command_factories/ReinforceCommandFactory.cpp.
- Brave Water: braveWaterActionPointCost=8; src/main/cpp/net/eagle0/shardok/library/command_factories/BraveWaterCommandFactory.cpp and src/main/cpp/net/eagle0/shardok/library/commands/BraveWaterCommand.cpp.
- Release Unit: requires remainingActionPoints > 0 in ControlCommandFactory.cpp; execution zeroes both units in src/main/cpp/net/eagle0/shardok/library/commands/ReleaseUnitCommand.cpp.
- End Turn and Setup: no command AP cost; end turn zeroes player unit AP in src/main/cpp/net/eagle0/shardok/library/commands/EndTurnCommand.cpp; setup end in src/main/cpp/net/eagle0/shardok/library/actions/EndPlayerSetupCommand.cpp.
- Hide: hideActionPointCost=5; src/main/cpp/net/eagle0/shardok/library/command_factories/HideCommandFactory.cpp.
- Fortify: fortifyActionPointCost=5; src/main/cpp/net/eagle0/shardok/library/command_factories/FortifyCommandFactory.cpp.
- Become Outlaw: uses fleeActionPointCost=5 through src/main/cpp/net/eagle0/shardok/library/command_factories/FleeCommandFactory.cpp and src/main/cpp/net/eagle0/shardok/library/commands/BecomeOutlawCommand.cpp.
- Evacuate Prisoners: evacuatePrisonersActionPointCost=5; src/main/cpp/net/eagle0/shardok/library/command_factories/EvacuatePrisonersCommandFactory.cpp.
-->
## Shared Requirements
Unless noted otherwise: **10 morale**, **10 hero vigor**, and the listed **Action Point cost**.
## Tactical Commands
### Melee
<b>Unit requirements:</b> any unit.
<b>Action Point cost:</b> 5 AP; consumes all remaining AP.
<b>Available when:</b> an enemy target is adjacent and the acting unit can still act.
<b>Effect:</b> Attack the target in close combat. The UI may show combat odds before you choose the attack.
<b>Selection:</b> choose the attacking unit and adjacent target.
### Archery
<b>Unit requirements:</b> Longbowmen, or a unit with an attached hero who has at least 75 AGI. The unit must have at least one volley remaining.
<b>Action Point cost:</b> 5 AP; consumes all remaining AP.
<b>Available when:</b> a known enemy is exactly 2 hexes away, and the line between the attacker and target is not blocked by mountains.
<b>Effect:</b> Make a ranged attack without requiring adjacency, spending one volley. Longbowmen can also fire at adjacent hexes while standing in a castle, and can fire 3 hexes when the wind is at least 20 mph and blowing toward the target.
<b>Selection:</b> choose the firing unit and target unit or hex.
### Charge
<b>Unit requirements:</b> any unit.
<b>Action Point cost:</b> the cost to enter the target's terrain. Knights and Dragoons spend only that terrain cost and may be able to move again afterward; other units spend all remaining AP.
<b>Available when:</b> a valid path reaches a target that can be attacked at the end of the move.
<b>Effect:</b> Move into an attack as one action. Charge attacks have a chance to stun the target unit.
<b>Selection:</b> choose the charging unit, path, and target.
### Move
<b>Unit requirements:</b> any unit.
<b>Action Point cost:</b> the terrain cost for each hex in the path, plus 1 extra AP for steps that start in enemy zone of control.
<b>Available when:</b> one or more reachable destination hexes are valid for the acting unit.
<b>Effect:</b> Move the unit along the chosen path to a reachable hex, paying terrain costs as it goes. Hidden units may reveal themselves if they move into exposed terrain or near an enemy Ranger.
<b>Selection:</b> choose the unit and destination path.
### Lightning Bolt
<b>Unit requirements:</b> [Mage](/heroes/#mage) attached to Light Infantry, Light Cavalry, or Longbowmen. Heavy units and Undead cannot cast.
<b>Action Point cost:</b> 5 AP; consumes all remaining AP.
<b>Available when:</b> a known enemy is within 3 hexes of the caster.
<b>Effect:</b> Cast a lightning attack at the target. The descriptor may include odds or roll information when the client can display expected results.
<b>Selection:</b> choose the casting unit and target.
### Meteor
<b>Unit requirements:</b> [Mage](/heroes/#mage) attached to Light Infantry, Light Cavalry, or Longbowmen, with enough vigor to start the spell. Heavy units and Undead cannot cast.
<b>Action Point cost:</b> start costs 5 AP and consumes all remaining AP; target and cancel cost 0 AP; the automatic cast step is configured as 1 AP but resolves by setting the caster to 0 AP.
<b>Available when:</b> the caster can begin the spell, choose or change a target within 3 hexes, cast the pending meteor, or cancel the pending meteor.
<b>Effect:</b> Begin a delayed meteor spell, choose where it will land, then resolve the strike when the cast step becomes available. You can cancel while the meteor is still pending.
<b>Selection:</b> choose the caster, spell target, or cancel option depending on the current meteor step.
### Start Fire
<b>Unit requirements:</b> a unit with an attached [Mage](/heroes/#mage), or an attached hero with at least 70 AGI and 70 WIS. Mages improve the odds.
<b>Action Point cost:</b> 5 AP; consumes all remaining AP.
<b>Available when:</b> a target hex can be set on fire.
<b>Effect:</b> Attempt to start a fire on the target hex.
<b>Selection:</b> choose the acting unit and target hex.
### Extinguish Fire
<b>Unit requirements:</b> any unit with an attached hero.
<b>Action Point cost:</b> 5 AP; consumes all remaining AP.
<b>Available when:</b> a target hex contains fire that can be reduced or removed.
<b>Effect:</b> Remove or reduce fire on the target hex.
<b>Selection:</b> choose the acting unit and burning target hex.
### Freeze Water
<b>Unit requirements:</b> [Mage](/heroes/#mage) attached to Light Infantry, Light Cavalry, or Longbowmen. Heavy units and Undead cannot cast.
<b>Action Point cost:</b> 5 AP; consumes all remaining AP.
<b>Available when:</b> a valid water hex can be frozen.
<b>Effect:</b> Turn water into traversable frozen terrain where the command is valid.
<b>Selection:</b> choose the caster and water hex.
### Build Bridge
<b>Unit requirements:</b> [Engineer](/heroes/#engineer).
<b>Action Point cost:</b> 5 AP; consumes all remaining AP.
<b>Available when:</b> the engineer has a valid water or gap target where a bridge can be built.
<b>Effect:</b> Create a bridge across the target.
<b>Selection:</b> choose the engineer unit and bridge target.
### Blow Bridge
<b>Unit requirements:</b> [Engineer](/heroes/#engineer) standing on a bridge.
<b>Action Point cost:</b> 5 AP; consumes all remaining AP.
<b>Available when:</b> the bridge can be destroyed.
<b>Effect:</b> Destroy the existing bridge target.
<b>Selection:</b> choose the engineer unit and bridge.
### Placement
<b>Unit requirements:</b> a unit available for setup placement. Hidden placement requires a defending [Ranger](/heroes/#ranger) attached to a stealth-capable unit.
<b>Action Point cost:</b> no AP cost during setup.
<b>Available when:</b> the battle is in setup and a valid placement hex is available.
<b>Effect:</b> Put a reserve unit onto the battlefield. Rangers on stealth-capable units can be placed hidden during defensive setup.
<b>Selection:</b> choose the unit and setup hex.
### Scout
<b>Unit requirements:</b> [Ranger](/heroes/#ranger) attached to a stealth-capable unit.
<b>Action Point cost:</b> 5 AP; consumes all remaining AP.
<b>Available when:</b> the ranger can scout a hex within 4 hexes.
<b>Effect:</b> Reveal information about the target hex and nearby terrain, including possible hidden-unit information.
<b>Selection:</b> choose the scouting unit and target.
### Raise Dead
<b>Unit requirements:</b> [Necromancer](/heroes/#necromancer) attached to Light Infantry, Light Cavalry, or Longbowmen, and the hero must not already control a unit. Heavy units and Undead cannot cast.
<b>Action Point cost:</b> 5 AP; consumes all remaining AP.
<b>Available when:</b> there is an empty, undead-traversable target hex within 2 hexes.
<b>Effect:</b> Create or restore undead forces through necromantic action.
<b>Selection:</b> choose the necromancer unit and target.
### Dismiss Unit
<b>Unit requirements:</b> a unit that is allowed to be dismissed.
<b>Action Point cost:</b> requires the controlling unit to have more than 0 AP; execution sets both the controlling unit and dismissed unit to 0 AP.
<b>Available when:</b> dismissal is valid for the current tactical state.
<b>Effect:</b> Remove the unit from the tactical battle.
<b>Selection:</b> choose the unit to dismiss.
### Holy Wave
<b>Unit requirements:</b> [Paladin](/heroes/#paladin).
<b>Action Point cost:</b> 5 AP; consumes all remaining AP.
<b>Available when:</b> the paladin has a valid holy-wave action.
<b>Effect:</b> Use a holy-area effect from the capable unit.
<b>Selection:</b> choose the paladin unit and command target, if one is required.
### Stop and Rest
<b>Unit requirements:</b> a unit that can stop or rest.
<b>Action Point cost:</b> Stop costs 0 AP; Rest consumes all remaining AP.
<b>Available when:</b> the unit can end movement or spend its action resting.
<b>Effect:</b> `UNIT_STOP_COMMAND` stops a unit. `UNIT_REST_COMMAND` has a unit spend its action resting instead of acting aggressively.
<b>Selection:</b> choose stop or rest for the acting unit.
### Challenge Duel
<b>Unit requirements:</b> [Champion](/heroes/#champion).
<b>Action Point cost:</b> 5 AP; consumes all remaining AP.
<b>Available when:</b> an opposing unit can be challenged.
<b>Effect:</b> Challenge an opposing unit to a duel. The tactical action emits accepted or declined outcomes directly.
<b>Selection:</b> choose the champion unit and duel target.
### Fear
<b>Unit requirements:</b> [Necromancer](/heroes/#necromancer) attached to Light Infantry, Light Cavalry, or Longbowmen. Heavy units and Undead cannot cast.
<b>Action Point cost:</b> 5 AP; consumes all remaining AP.
<b>Available when:</b> a known enemy that uses morale is within 3 hexes.
<b>Effect:</b> Use a fear effect against the target.
<b>Selection:</b> choose the necromancer unit and target.
### Repair
<b>Unit requirements:</b> [Engineer](/heroes/#engineer).
<b>Action Point cost:</b> 5 AP; consumes all remaining AP.
<b>Available when:</b> a damaged unit or battlefield object can be repaired.
<b>Effect:</b> Repair the damaged target.
<b>Selection:</b> choose the engineer unit and repair target.
### Reduce
<b>Unit requirements:</b> [Engineer](/heroes/#engineer) in a castle or fortified position.
<b>Action Point cost:</b> 5 AP; consumes all remaining AP.
<b>Available when:</b> an enemy or damaged castle is within 3 hexes and the line is not blocked by mountains.
<b>Effect:</b> Reduce the target's defensive or structural value.
<b>Selection:</b> choose the engineer unit and target.
### Flee and Retreat
<b>Unit requirements:</b> a unit that is allowed to leave or withdraw.
<b>Action Point cost:</b> 5 AP; consumes all remaining AP.
<b>Available when:</b> flight or retreat is valid for the current battlefield state.
<b>Effect:</b> `FLEE_COMMAND` handles immediate flight from a tactical situation. `RETREAT_COMMAND` handles a more formal withdrawal command.
<b>Selection:</b> choose the fleeing or retreating unit.
### Control
<b>Unit requirements:</b> a unit with access to a control effect.
<b>Action Point cost:</b> requires more than 0 AP; execution sets the acting unit to 0 AP.
<b>Available when:</b> a valid target can be controlled.
<b>Effect:</b> Take control of the target when the command is available.
<b>Selection:</b> choose the acting unit and control target.
### Reinforce
<b>Unit requirements:</b> reinforcements available to enter the battle.
<b>Action Point cost:</b> 5 AP; consumes all remaining AP.
<b>Available when:</b> the battle state allows reinforcement and there is a valid entry option.
<b>Effect:</b> Bring reinforcements into the battle.
<b>Selection:</b> choose the reinforcement option and entry placement.
### Brave Water
<b>Unit requirements:</b> a unit that can attempt brave-water movement. [Ranger](/heroes/#ranger) is not required, but Rangers get an odds bonus.
<b>Action Point cost:</b> 8 AP; consumes all remaining AP.
<b>Available when:</b> the unit has a valid water path or water target.
<b>Effect:</b> Move through water despite the usual danger or restriction.
<b>Selection:</b> choose the unit and water movement target.
### Release Unit
<b>Unit requirements:</b> a unit that can release a constrained target.
<b>Action Point cost:</b> requires more than 0 AP; execution sets both the controlling unit and released unit to 0 AP.
<b>Available when:</b> a controlled, held, or otherwise constrained unit can be released.
<b>Effect:</b> Release the constrained unit.
<b>Selection:</b> choose the acting unit and unit to release.
### End Turn and Setup
<b>Unit requirements:</b> None.
<b>Action Point cost:</b> no AP cost to post the command; End Turn then sets that player's remaining unit AP to 0.
<b>Available when:</b> the active player can end the tactical turn or finish setup.
<b>Effect:</b> `END_TURN_COMMAND` ends the active tactical turn. `END_PLAYER_SETUP_COMMAND` ends that player's setup phase.
<b>Selection:</b> choose the end-turn or end-setup command.
### Hide
<b>Unit requirements:</b> [Ranger](/heroes/#ranger) attached to a stealth-capable unit.
<b>Action Point cost:</b> 5 AP; consumes all remaining AP.
<b>Available when:</b> the unit can enter or remain in hidden status.
<b>Effect:</b> Hide the unit.
<b>Selection:</b> choose the ranger unit.
### Fortify
<b>Unit requirements:</b> [Engineer](/heroes/#engineer).
<b>Action Point cost:</b> 5 AP; consumes all remaining AP.
<b>Available when:</b> the engineer can fortify its current position.
<b>Effect:</b> Have the unit fortify its current position.
<b>Selection:</b> choose the engineer unit.
### Become Outlaw
<b>Unit requirements:</b> a unit or hero eligible for the outlaw consequence.
<b>Action Point cost:</b> 5 AP through the flee/outlaw action.
<b>Available when:</b> the battle result or tactical state allows the outlaw transition.
<b>Effect:</b> Mark the unit or hero as becoming an outlaw as a battle consequence.
<b>Selection:</b> choose the outlaw command when offered.
### Evacuate Prisoners
<b>Unit requirements:</b> [Warden](/heroes/#warden) on a unit that can flee.
<b>Action Point cost:</b> 5 AP; consumes all remaining AP.
<b>Available when:</b> prisoners can be moved out of danger.
<b>Effect:</b> Move prisoners out of danger when the battlefield state allows prisoner evacuation.
<b>Selection:</b> choose the warden unit and evacuation command.
+258
View File
@@ -0,0 +1,258 @@
.sl-markdown-content:has(.command-reference-marker) {
--command-border: color-mix(in srgb, var(--sl-color-gray-5), transparent 18%);
--command-surface: color-mix(in srgb, var(--sl-color-bg), var(--sl-color-gray-6) 22%);
--command-surface-strong: color-mix(in srgb, var(--sl-color-bg), var(--sl-color-accent-low) 28%);
--command-muted: var(--sl-color-gray-2);
--command-label: var(--sl-color-accent-high);
}
.command-reference-marker {
display: none;
}
.command-reference-five-row-marker {
display: none;
}
.sl-markdown-content:has(.command-reference-marker) > p:has(.command-reference-marker) {
display: none;
}
.sl-markdown-content:has(.command-reference-five-row-marker) > p:has(.command-reference-five-row-marker) {
display: none;
}
.sl-markdown-content:has(.command-reference-marker) > p {
max-width: 68rem;
}
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h2 {
margin-top: 3rem;
padding: 1rem 1.125rem;
border: 1px solid var(--command-border);
border-radius: 0.5rem;
background:
linear-gradient(90deg, var(--sl-color-accent-low), transparent 72%),
var(--command-surface);
}
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h2 h2 {
font-size: clamp(1.35rem, 2.4vw, 1.7rem);
line-height: 1.2;
}
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h2 + p {
margin-top: 0.75rem;
color: var(--command-muted);
}
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h3 {
margin-top: 1.5rem;
margin-bottom: 0;
padding: 1rem 1.125rem 0.875rem;
border: 1px solid var(--command-border);
border-bottom: 0;
border-radius: 0.5rem 0.5rem 0 0;
background: var(--command-surface-strong);
font-size: 1.18rem;
}
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h3 h3 {
font-size: 1.15rem;
}
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h3 + p,
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h3 + p + p,
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h3 + p + p + p,
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h3 + p + p + p + p {
margin: 0;
padding: 0.75rem 1.125rem;
border-right: 1px solid var(--command-border);
border-left: 1px solid var(--command-border);
background: var(--sl-color-bg);
position: relative;
padding-left: 13.625rem;
}
.sl-markdown-content:has(.command-reference-five-row-marker)
.sl-heading-wrapper.level-h3
+ p
+ p
+ p
+ p
+ p {
margin: 0;
padding: 0.75rem 1.125rem;
border-right: 1px solid var(--command-border);
border-left: 1px solid var(--command-border);
background: var(--sl-color-bg);
position: relative;
padding-left: 13.625rem;
}
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h3 + p {
padding-top: 1rem;
}
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h3 + p + p + p + p {
padding-bottom: 1rem;
border-bottom: 1px solid var(--command-border);
border-radius: 0 0 0.5rem 0.5rem;
box-shadow: 0 0.7rem 1.6rem color-mix(in srgb, black, transparent 92%);
}
.sl-markdown-content:has(.command-reference-five-row-marker)
.sl-heading-wrapper.level-h3
+ p
+ p
+ p
+ p {
padding-bottom: 0.75rem;
border-bottom: 0;
border-radius: 0;
box-shadow: none;
}
.sl-markdown-content:has(.command-reference-five-row-marker)
.sl-heading-wrapper.level-h3
+ p
+ p
+ p
+ p
+ p {
padding-bottom: 1rem;
border-bottom: 1px solid var(--command-border);
border-radius: 0 0 0.5rem 0.5rem;
box-shadow: 0 0.7rem 1.6rem color-mix(in srgb, black, transparent 92%);
}
.sl-markdown-content:has(.command-reference-marker) p > b:first-child {
color: var(--command-label);
font-size: 0.82rem;
letter-spacing: 0.04em;
text-transform: uppercase;
white-space: nowrap;
}
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h3 + p > b:first-child,
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h3 + p + p > b:first-child,
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h3 + p + p + p > b:first-child,
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h3 + p + p + p + p > b:first-child,
.sl-markdown-content:has(.command-reference-five-row-marker)
.sl-heading-wrapper.level-h3
+ p
+ p
+ p
+ p
+ p
> b:first-child {
position: absolute;
left: 1.125rem;
width: 11.5rem;
}
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h4 {
margin-top: 1rem;
padding: 0.65rem 1rem;
border: 1px solid var(--command-border);
border-radius: 0.45rem;
background: color-mix(in srgb, var(--sl-color-gray-6), transparent 55%);
color: var(--sl-color-white);
font-size: 0.92rem;
letter-spacing: 0.02em;
text-transform: uppercase;
}
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h5 {
margin-top: 1rem;
margin-bottom: 0;
padding: 0.75rem 1rem 0.25rem;
border-top: 1px solid var(--command-border);
color: var(--sl-color-accent-high);
}
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h5 + p,
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h5 + p + p {
margin: 0;
padding: 0.4rem 1rem;
border-right: 1px solid var(--command-border);
border-left: 1px solid var(--command-border);
position: relative;
padding-left: 7.5rem;
}
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h5 + p > b:first-child,
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h5 + p + p > b:first-child {
position: absolute;
left: 1rem;
width: 5.5rem;
}
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h5 + p + p {
padding-bottom: 0.8rem;
border-bottom: 1px solid var(--command-border);
border-radius: 0 0 0.45rem 0.45rem;
}
@media (max-width: 50rem) {
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h2,
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h3 {
padding-right: 0.875rem;
padding-left: 0.875rem;
}
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h3 + p,
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h3 + p + p,
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h3 + p + p + p,
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h3 + p + p + p + p,
.sl-markdown-content:has(.command-reference-five-row-marker)
.sl-heading-wrapper.level-h3
+ p
+ p
+ p
+ p
+ p {
padding-right: 0.875rem;
padding-left: 0.875rem;
}
.sl-markdown-content:has(.command-reference-marker) p > b:first-child {
display: block;
margin-bottom: 0.2rem;
white-space: normal;
}
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h3 + p,
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h3 + p + p,
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h3 + p + p + p,
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h3 + p + p + p + p,
.sl-markdown-content:has(.command-reference-five-row-marker)
.sl-heading-wrapper.level-h3
+ p
+ p
+ p
+ p
+ p,
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h5 + p,
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h5 + p + p {
padding-left: 0.875rem;
}
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h3 + p > b:first-child,
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h3 + p + p > b:first-child,
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h3 + p + p + p > b:first-child,
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h3 + p + p + p + p > b:first-child,
.sl-markdown-content:has(.command-reference-five-row-marker)
.sl-heading-wrapper.level-h3
+ p
+ p
+ p
+ p
+ p
> b:first-child,
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h5 + p > b:first-child,
.sl-markdown-content:has(.command-reference-marker) .sl-heading-wrapper.level-h5 + p + p > b:first-child {
position: static;
width: auto;
}
}
+1
View File
@@ -0,0 +1 @@
import "../node_modules/astro/astro.js";
+3
View File
@@ -0,0 +1,3 @@
{
"extends": "astro/tsconfigs/strict"
}
+22
View File
@@ -29,6 +29,7 @@
"com.thesamet.scalapb:scalapb-json4s_3": -772830803,
"com.thesamet.scalapb:scalapb-runtime-grpc_3": -2026114331,
"com.thesamet.scalapb:scalapb-runtime_3": -1281968352,
"com.zaxxer:HikariCP": 1858991878,
"io.netty:netty-buffer": 732437843,
"io.netty:netty-codec": -1199307927,
"io.netty:netty-codec-http": -1456497900,
@@ -117,6 +118,7 @@
"com.thesamet.scalapb:scalapb-runtime-grpc_3": 97373115,
"com.thesamet.scalapb:scalapb-runtime_3": 818778125,
"com.typesafe:config": -1791448454,
"com.zaxxer:HikariCP": -704610647,
"commons-codec:commons-codec": 1377992676,
"commons-io:commons-io": 669567296,
"dev.dirs:directories": 1716880629,
@@ -550,6 +552,12 @@
},
"version": "1.4.6"
},
"com.zaxxer:HikariCP": {
"shasums": {
"jar": "709f378c05756280939ce50fc1b1f1a53bb8e1899dc1b249f21f12703640b48b"
},
"version": "6.3.3"
},
"commons-codec:commons-codec": {
"shasums": {
"jar": "f700de80ac270d0344fdea7468201d8b9c805e5c648331c3619f2ee067ccfc59"
@@ -1581,6 +1589,9 @@
"org.scala-lang.modules:scala-collection-compat_3",
"org.scala-lang:scala3-library_3"
],
"com.zaxxer:HikariCP": [
"org.slf4j:slf4j-api"
],
"io.get-coursier:coursier-cache_2.13": [
"io.get-coursier.jniutils:windows-jni-utils",
"io.get-coursier:cache-util",
@@ -2557,6 +2568,16 @@
"com.typesafe.config.impl",
"com.typesafe.config.parser"
],
"com.zaxxer:HikariCP": [
"com.zaxxer.hikari",
"com.zaxxer.hikari.hibernate",
"com.zaxxer.hikari.metrics",
"com.zaxxer.hikari.metrics.dropwizard",
"com.zaxxer.hikari.metrics.micrometer",
"com.zaxxer.hikari.metrics.prometheus",
"com.zaxxer.hikari.pool",
"com.zaxxer.hikari.util"
],
"commons-codec:commons-codec": [
"org.apache.commons.codec",
"org.apache.commons.codec.binary",
@@ -4100,6 +4121,7 @@
"com.thesamet.scalapb:scalapb-runtime-grpc_3",
"com.thesamet.scalapb:scalapb-runtime_3",
"com.typesafe:config",
"com.zaxxer:HikariCP",
"commons-codec:commons-codec",
"commons-io:commons-io",
"dev.dirs:directories",
+4
View File
@@ -10,4 +10,8 @@ if [ -n "${BAZEL_OUTPUT_BASE:-}" ]; then
bazel_cmd+=("--output_base=${BAZEL_OUTPUT_BASE}")
fi
if [ "$(uname -s)" = "Darwin" ]; then
./scripts/sync_bazel_xcode.sh
fi
"${bazel_cmd[@]}" build "$@" //src/main/scala/net/eagle0/eagle:eagle_server
+4
View File
@@ -10,4 +10,8 @@ if [ -n "${BAZEL_OUTPUT_BASE:-}" ]; then
bazel_cmd+=("--output_base=${BAZEL_OUTPUT_BASE}")
fi
if [ "$(uname -s)" = "Darwin" ]; then
./scripts/sync_bazel_xcode.sh
fi
"${bazel_cmd[@]}" build -c opt "$@" //src/main/cpp/net/eagle0/shardok:shardok-server
+2
View File
@@ -241,6 +241,8 @@ main() {
if [ -x "${WARMUP_SCRIPT}" ]; then
if ! "${WARMUP_SCRIPT}" "localhost:${staging_port}"; then
log_error "Warmup/smoke test failed, aborting deployment"
log_error "Recent eagle-${staging} logs:"
docker logs "eagle-${staging}" --tail 200 2>&1 || true
docker compose -f "${COMPOSE_FILE}" stop "eagle-${staging}"
cleanup_markers_on_failure "eagle-${active}"
exit 1
@@ -2,7 +2,6 @@ using System;
using System.Collections.Generic;
using System.Linq;
using Eagle0.Tutorial;
using EagleGUIUtils;
using Net.Eagle0.Common;
using Net.Eagle0.Eagle.Views;
using Shardok;
@@ -15,8 +14,8 @@ namespace eagle {
private const string FightButtonTutorialId = "FightButton";
public TMP_Text provinceLabel;
public TMP_Text defenderProvinceLabel;
public BattleThermometer thermometer;
public TMP_Text outcomeLabel;
public Button actionButton;
public TMP_Text actionButtonLabel;
@@ -24,114 +23,79 @@ namespace eagle {
public void
Populate(ShardokBattleView battle, IGameModel model, Action<string> goToBattleAction) {
// Province name
if (model.Provinces.TryGetValue(battle.DefenderProvince, out var pv) &&
model.PlayerId.HasValue) {
provinceLabel.text = GUIUtils.DarkColoredProvinceName(pv, model.PlayerId.Value);
} else if (pv != null) {
provinceLabel.text = pv.Name;
} else {
provinceLabel.text = $"Province {battle.DefenderProvince}";
}
model.Provinces.TryGetValue(battle.DefenderProvince, out var pv);
provinceLabel.text = AttackerOriginsText(battle, model);
defenderProvinceLabel.text =
pv != null ? pv.Name : $"Province {battle.DefenderProvince}";
bool isSelf = battle.PlayerInfos.Any(pi => pi.Hostility == Hostility.SelfHostility);
bool isAllied = isSelf ||
battle.PlayerInfos.Any(pi => pi.Hostility == Hostility.AlliedHostility);
bool hasWinner = battle.WinningFactionId.HasValue;
if (hasWinner) {
thermometer.gameObject.SetActive(false);
outcomeLabel.gameObject.SetActive(true);
bool isAlliedWin = false;
if (model.PlayerId.HasValue) {
var playerFaction = model.PlayerId.Value;
var winnerFaction = battle.WinningFactionId.Value;
isAlliedWin =
winnerFaction == playerFaction ||
(model.ActiveFactions.TryGetValue(winnerFaction, out var wf) &&
wf.FactionRelationships.Any(
r => r.TargetFactionId == playerFaction &&
r.RelationshipLevel == FactionRelationshipView.Types
.RelationshipLevel.Ally));
}
outcomeLabel.text = isAllied && isAlliedWin ? "Victory!" : "Defeat!";
outcomeLabel.color =
isAlliedWin ? new Color(0.2f, 0.8f, 0.2f) : new Color(0.8f, 0.2f, 0.2f);
SetActionButtonVisible(false);
} else {
thermometer.gameObject.SetActive(true);
outcomeLabel.gameObject.SetActive(false);
Color defColor;
IList<Color> atkColors;
if (pv != null && pv.RulingFactionId.HasValue) {
int defFactionId = pv.RulingFactionId.Value;
defColor = PlayerColors.LightPlayerColor(defFactionId);
atkColors = battle.PlayerInfos.Where(pi => pi.EagleFactionId != defFactionId)
.Select(pi => pi.EagleFactionId)
.Distinct()
.OrderBy(id => id)
.Select(id => PlayerColors.LightPlayerColor(id))
.ToList();
if (atkColors.Count == 0)
atkColors = new List<Color> { PlayerColors.LightPlayerColor(1) };
} else {
defColor = PlayerColors.LightPlayerColor(0);
Color defColor;
IList<Color> atkColors;
if (pv != null && pv.RulingFactionId.HasValue) {
int defFactionId = pv.RulingFactionId.Value;
defColor = PlayerColors.LightPlayerColor(defFactionId);
atkColors = battle.PlayerInfos.Where(pi => pi.EagleFactionId != defFactionId)
.Select(pi => pi.EagleFactionId)
.Distinct()
.OrderBy(id => id)
.Select(id => PlayerColors.LightPlayerColor(id))
.ToList();
if (atkColors.Count == 0)
atkColors = new List<Color> { PlayerColors.LightPlayerColor(1) };
}
if (isAllied && battle.DefenderTroopCount.HasValue &&
battle.AttackerTroopCount.HasValue) {
thermometer.UpdateBalance(
battle.DefenderTroopCount.Value,
battle.AttackerTroopCount.Value,
defColor,
atkColors);
} else {
thermometer.UpdateBalance(battle.DefenderRatio, defColor, atkColors);
}
actionButton.onClick.RemoveAllListeners();
var gameId = battle.ShardokGameId;
bool modelReady = model.ShardokGameModels.ContainsKey(gameId);
if (isSelf) {
bool canFight = battle.CanFight && modelReady;
SetActionButtonVisible(true);
actionButton.interactable = canFight;
actionButtonLabel.text =
modelReady ? battle.CanFight ? "Fight!" : "Waiting..." : "Loading...";
if (canFight) {
actionButton.onClick.AddListener(() => goToBattleAction?.Invoke(gameId));
}
SetFightButtonTutorialRegistration(canFight);
} else if (isAllied) {
// ShardokBattles is populated when a NewBattle eagle update arrives, but the
// matching ShardokGameModel isn't created until the first action-result
// response for that battle reaches us. During that gap, GoToBattle would
// throw on Model.ShardokGameModels[gameId]; gate the button on the model
// existing so the click can never land in the gap.
bool canObserve = battle.CanObserve && modelReady;
SetActionButtonVisible(true);
actionButton.interactable = canObserve;
actionButtonLabel.text = modelReady
? battle.CanObserve ? "Observe" : "Waiting..."
: "Loading...";
if (canObserve) {
actionButton.onClick.AddListener(() => goToBattleAction?.Invoke(gameId));
}
SetFightButtonTutorialRegistration(false);
} else {
SetActionButtonVisible(false);
SetFightButtonTutorialRegistration(false);
}
} else {
defColor = PlayerColors.LightPlayerColor(0);
atkColors = new List<Color> { PlayerColors.LightPlayerColor(1) };
}
if (hasWinner) { SetFightButtonTutorialRegistration(false); }
if (isAllied && battle.DefenderTroopCount.HasValue &&
battle.AttackerTroopCount.HasValue) {
thermometer.UpdateBalance(
battle.DefenderTroopCount.Value,
battle.AttackerTroopCount.Value,
defColor,
atkColors);
thermometer.attackerLabel.text = battle.AttackerTroopCount.Value.ToString();
thermometer.defenderLabel.text = battle.DefenderTroopCount.Value.ToString();
} else {
thermometer.UpdateBalance(battle.DefenderRatio, defColor, atkColors);
}
actionButton.onClick.RemoveAllListeners();
var gameId = battle.ShardokGameId;
bool modelReady = model.ShardokGameModels.ContainsKey(gameId);
if (isSelf) {
bool canFight = battle.CanFight && modelReady;
SetActionButtonVisible(true);
actionButton.interactable = canFight;
actionButtonLabel.text =
modelReady ? battle.CanFight ? "Fight!" : "Waiting..." : "Loading...";
if (canFight) {
actionButton.onClick.AddListener(() => goToBattleAction?.Invoke(gameId));
}
SetFightButtonTutorialRegistration(canFight);
} else if (isAllied) {
// ShardokBattles is populated when a NewBattle eagle update arrives, but the
// matching ShardokGameModel isn't created until the first action-result
// response for that battle reaches us. During that gap, GoToBattle would
// throw on Model.ShardokGameModels[gameId]; gate the button on the model
// existing so the click can never land in the gap.
bool canObserve = battle.CanObserve && modelReady;
SetActionButtonVisible(true);
actionButton.interactable = canObserve;
actionButtonLabel.text =
modelReady ? battle.CanObserve ? "Observe" : "Waiting..." : "Loading...";
if (canObserve) {
actionButton.onClick.AddListener(() => goToBattleAction?.Invoke(gameId));
}
SetFightButtonTutorialRegistration(false);
} else {
SetActionButtonVisible(false);
SetFightButtonTutorialRegistration(false);
}
}
private void SetActionButtonVisible(bool visible) {
@@ -145,6 +109,31 @@ namespace eagle {
}
}
private static string AttackerOriginsText(ShardokBattleView battle, IGameModel model) {
var attackerOrigins = AttackerOriginLabels(battle, model);
if (!attackerOrigins.Any()) { return ""; }
return string.Join(", ", attackerOrigins);
}
private static IEnumerable<string> AttackerOriginLabels(
ShardokBattleView battle,
IGameModel model) {
return battle.PlayerInfos.Where(pi => !pi.IsDefender)
.SelectMany(pi => pi.OriginProvinceIds)
.Where(pid => pid != battle.DefenderProvince)
.Distinct()
.OrderBy(
pid => model.Provinces.TryGetValue(pid, out var p) ? p.Name
: $"Province {pid}")
.Select(pid => ProvinceName(model, pid));
}
private static string ProvinceName(IGameModel model, int provinceId) {
if (model.Provinces.TryGetValue(provinceId, out var province)) { return province.Name; }
return $"Province {provinceId}";
}
private void SetFightButtonTutorialRegistration(bool shouldRegister) {
var registry = TutorialManager.Instance?.TargetRegistry;
if (registry == null) return;
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 1965814cb30c4ce180ad94e7dd5d0aa2
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
File diff suppressed because it is too large Load Diff
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: f056276704b3c4dce8528471e52686c7
guid: 1ef36969f7ec34d56a99120e75452d45
PrefabImporter:
externalObjects: {}
userData:
@@ -0,0 +1,18 @@
using UnityEngine;
using UnityEngine.EventSystems;
namespace eagle {
public class CommandInfoButtonHoverController : MonoBehaviour,
IPointerEnterHandler,
IPointerExitHandler {
public CommandPanelController commandPanelController;
public void OnPointerEnter(PointerEventData eventData) {
commandPanelController.InfoButtonHovered();
}
public void OnPointerExit(PointerEventData eventData) {
commandPanelController.InfoButtonExited();
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: d809e028e4e54409bfb770ee807c0011
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -2,7 +2,6 @@
using System.Collections.Generic;
using System.Linq;
using common.GUIUtils;
using Eagle0.Tutorial;
using Net.Eagle0.Eagle.Api;
using TMPro;
using UnityEngine;
@@ -10,6 +9,220 @@ using UnityEngine.UI;
namespace eagle {
public class CommandPanelController : MonoBehaviour {
private const string Eagle0pediaCommandsBaseUrl = "https://pedia.eagle0.net/commands/";
private static readonly Dictionary<
AvailableCommand.SealedValueOneofCase,
string> Eagle0pediaCommandAnchors = new() {
{ AvailableCommand.SealedValueOneofCase.AlmsCommand, "alms" },
{ AvailableCommand.SealedValueOneofCase.ApprehendOutlawCommand, "apprehend-outlaw" },
{ AvailableCommand.SealedValueOneofCase.ArmTroopsCommand, "arm-troops" },
{ AvailableCommand.SealedValueOneofCase.AttackDecisionCommand, "attack-decision" },
{ AvailableCommand.SealedValueOneofCase.BattleAftermathDecisionCommand,
"battle-aftermath-decision" },
{ AvailableCommand.SealedValueOneofCase.ControlWeatherAvailableCommand,
"control-weather" },
{ AvailableCommand.SealedValueOneofCase.DeclineQuestCommand, "decline-quest" },
{ AvailableCommand.SealedValueOneofCase.DefendCommand, "defend" },
{ AvailableCommand.SealedValueOneofCase.DiplomacyCommand, "diplomacy" },
{ AvailableCommand.SealedValueOneofCase.DivineCommand, "divine" },
{ AvailableCommand.SealedValueOneofCase.ExileVassalCommand, "exile-vassal" },
{ AvailableCommand.SealedValueOneofCase.FeastCommand, "feast" },
{ AvailableCommand.SealedValueOneofCase.HandleCapturedHeroCommand,
"handle-captured-hero" },
{ AvailableCommand.SealedValueOneofCase.HandleRiotCrackDownAvailableCommand,
"handle-riot" },
{ AvailableCommand.SealedValueOneofCase.HandleRiotDoNothingAvailableCommand,
"handle-riot" },
{ AvailableCommand.SealedValueOneofCase.HandleRiotGiveAvailableCommand, "handle-riot" },
{ AvailableCommand.SealedValueOneofCase.HeroGiftCommand, "hero-gift" },
{ AvailableCommand.SealedValueOneofCase.ImproveCommand, "improve" },
{ AvailableCommand.SealedValueOneofCase.IssueOrdersCommand, "issue-orders" },
{ AvailableCommand.SealedValueOneofCase.ManagePrisonerCommand, "manage-prisoners" },
{ AvailableCommand.SealedValueOneofCase.MarchCommand, "march" },
{ AvailableCommand.SealedValueOneofCase.OrganizeTroopsCommand, "organize-troops" },
{ AvailableCommand.SealedValueOneofCase.PleaseRecruitMeCommand, "please-recruit-me" },
{ AvailableCommand.SealedValueOneofCase.ReconCommand, "recon" },
{ AvailableCommand.SealedValueOneofCase.RecruitHeroesCommand, "recruit-heroes" },
{ AvailableCommand.SealedValueOneofCase.ResolveAllianceOfferCommand,
"resolve-alliance-offer" },
{ AvailableCommand.SealedValueOneofCase.ResolveBreakAllianceCommand,
"resolve-break-alliance" },
{ AvailableCommand.SealedValueOneofCase.ResolveInvitationCommand,
"resolve-invitation" },
{ AvailableCommand.SealedValueOneofCase.ResolveRansomOfferCommand,
"resolve-ransom-offer" },
{ AvailableCommand.SealedValueOneofCase.ResolveTributeCommand, "resolve-tribute" },
{ AvailableCommand.SealedValueOneofCase.ResolveTruceOfferCommand,
"resolve-truce-offer" },
{ AvailableCommand.SealedValueOneofCase.RestCommand, "rest" },
{ AvailableCommand.SealedValueOneofCase.ReturnCommand, "return" },
{ AvailableCommand.SealedValueOneofCase.SendSuppliesCommand, "send-supplies" },
{ AvailableCommand.SealedValueOneofCase.StartEpidemicCommand, "start-epidemic" },
{ AvailableCommand.SealedValueOneofCase.SuppressBeastsCommand, "suppress-beasts" },
{ AvailableCommand.SealedValueOneofCase.SwearBrotherhoodCommand, "swear-kinship" },
{ AvailableCommand.SealedValueOneofCase.TradeCommand, "trade" },
{ AvailableCommand.SealedValueOneofCase.TrainCommand, "train" },
{ AvailableCommand.SealedValueOneofCase.TravelCommand, "travel" },
};
private readonly struct CommandInfo {
public readonly string Title;
public readonly string Text;
public CommandInfo(string title, string text) {
Title = title;
Text = text;
}
}
private static readonly Dictionary<
AvailableCommand.SealedValueOneofCase,
CommandInfo> CommandInfos = new() {
{ AvailableCommand.SealedValueOneofCase.AlmsCommand,
new CommandInfo(
"Give Alms",
"Spend food to raise support in the province. Paladins are especially effective at this.") },
{ AvailableCommand.SealedValueOneofCase.ApprehendOutlawCommand,
new CommandInfo(
"Apprehend Outlaw",
"Send a hero to deal with an outlaw disrupting the province.") },
{ AvailableCommand.SealedValueOneofCase.ArmTroopsCommand,
new CommandInfo(
"Arm Troops",
"Improve battalion armament by spending available resources.") },
{ AvailableCommand.SealedValueOneofCase.AttackDecisionCommand,
new CommandInfo(
"Attack Decision",
"Choose how to resolve the strategic battle decision before tactical combat begins.") },
{ AvailableCommand.SealedValueOneofCase.BattleAftermathDecisionCommand,
new CommandInfo("Battle Aftermath", "Choose what to do after a battle has ended.") },
{ AvailableCommand.SealedValueOneofCase.ControlWeatherAvailableCommand,
new CommandInfo(
"Control Weather",
"Use a suitable hero to affect the weather in a province.") },
{ AvailableCommand.SealedValueOneofCase.DeclineQuestCommand,
new CommandInfo("Decline Quest", "Refuse the quest currently being offered.") },
{ AvailableCommand.SealedValueOneofCase.DefendCommand,
new CommandInfo(
"Defend",
"Assign heroes and battalions to defend a province and choose a fallback route.") },
{ AvailableCommand.SealedValueOneofCase.DiplomacyCommand,
new CommandInfo(
"Diplomacy",
"Send a diplomatic offer or demand to another faction.") },
{ AvailableCommand.SealedValueOneofCase.DivineCommand,
new CommandInfo(
"Divine",
"Ask a diviner for information about the world or another faction.") },
{ AvailableCommand.SealedValueOneofCase.ExileVassalCommand,
new CommandInfo(
"Exile Vassal",
"Remove a vassal from your faction, forcing them out of your service.") },
{ AvailableCommand.SealedValueOneofCase.FeastCommand,
new CommandInfo(
"Feast",
"Spend food and gold to improve loyalty and morale among your heroes.") },
{ AvailableCommand.SealedValueOneofCase.HandleCapturedHeroCommand,
new CommandInfo(
"Handle Captured Hero",
"Choose whether to recruit, imprison, exile, execute, or return a captured hero.") },
{ AvailableCommand.SealedValueOneofCase.HandleRiotCrackDownAvailableCommand,
new CommandInfo(
"Handle Riot",
"Crack down on a riot. This may restore order, but it is harsh.") },
{ AvailableCommand.SealedValueOneofCase.HandleRiotDoNothingAvailableCommand,
new CommandInfo("Handle Riot", "Ignore a riot and accept the consequences.") },
{ AvailableCommand.SealedValueOneofCase.HandleRiotGiveAvailableCommand,
new CommandInfo("Handle Riot", "Give resources to the populace to calm a riot.") },
{ AvailableCommand.SealedValueOneofCase.HeroGiftCommand,
new CommandInfo("Give to Hero", "Give gold to a hero to improve loyalty.") },
{ AvailableCommand.SealedValueOneofCase.ImproveCommand,
new CommandInfo(
"Improve Province",
"Use a hero to improve agriculture, economy, infrastructure, or devastation in the province.") },
{ AvailableCommand.SealedValueOneofCase.IssueOrdersCommand,
new CommandInfo(
"Issue Orders",
"Give standing orders that influence how a faction or force behaves.") },
{ AvailableCommand.SealedValueOneofCase.ManagePrisonerCommand,
new CommandInfo(
"Manage Prisoners",
"Release, move, exile, execute, or return imprisoned heroes.") },
{ AvailableCommand.SealedValueOneofCase.MarchCommand,
new CommandInfo(
"March",
"Move heroes, battalions, gold, and food from one province to another.") },
{ AvailableCommand.SealedValueOneofCase.OrganizeTroopsCommand,
new CommandInfo(
"Organize Troops",
"Create, merge, split, or disband battalions in the province.") },
{ AvailableCommand.SealedValueOneofCase.PleaseRecruitMeCommand,
new CommandInfo(
"Recruit Offer",
"Respond to a hero who wants to join your faction.") },
{ AvailableCommand.SealedValueOneofCase.ReconCommand,
new CommandInfo("Recon", "Send a hero to gather information about a province.") },
{ AvailableCommand.SealedValueOneofCase.RecruitHeroesCommand,
new CommandInfo(
"Recruit Heroes",
"Spend gold to recruit available heroes into your faction.") },
{ AvailableCommand.SealedValueOneofCase.ResolveAllianceOfferCommand,
new CommandInfo(
"Alliance Offer",
"Accept or reject another faction's alliance offer.") },
{ AvailableCommand.SealedValueOneofCase.ResolveBreakAllianceCommand,
new CommandInfo(
"Break Alliance",
"Resolve a diplomatic request to end an alliance.") },
{ AvailableCommand.SealedValueOneofCase.ResolveInvitationCommand,
new CommandInfo(
"Invitation",
"Accept or reject an invitation involving one of your heroes.") },
{ AvailableCommand.SealedValueOneofCase.ResolveRansomOfferCommand,
new CommandInfo(
"Ransom Offer",
"Accept or reject a ransom offer for imprisoned heroes.") },
{ AvailableCommand.SealedValueOneofCase.ResolveTributeCommand,
new CommandInfo(
"Tribute Demand",
"Respond to another faction's demand for tribute.") },
{ AvailableCommand.SealedValueOneofCase.ResolveTruceOfferCommand,
new CommandInfo("Truce Offer", "Accept or reject another faction's truce offer.") },
{ AvailableCommand.SealedValueOneofCase.RestCommand,
new CommandInfo(
"Rest",
"Let heroes recover vigor and prepare for future commands.") },
{ AvailableCommand.SealedValueOneofCase.ReturnCommand,
new CommandInfo(
"Return",
"Bring a hero back from their current assignment or situation.") },
{ AvailableCommand.SealedValueOneofCase.SendSuppliesCommand,
new CommandInfo(
"Send Supplies",
"Send food or gold to another province with a selected hero.") },
{ AvailableCommand.SealedValueOneofCase.StartEpidemicCommand,
new CommandInfo(
"Start Epidemic",
"Use a suitable hero to unleash disease in a province.") },
{ AvailableCommand.SealedValueOneofCase.SuppressBeastsCommand,
new CommandInfo(
"Suppress Beasts",
"Send a hero to deal with beasts threatening a province.") },
{ AvailableCommand.SealedValueOneofCase.SwearBrotherhoodCommand,
new CommandInfo(
"Swear Kinship",
"Bind heroes together to improve their relationship and loyalty.") },
{ AvailableCommand.SealedValueOneofCase.TradeCommand,
new CommandInfo(
"Trade",
"Exchange food and gold using the province's buy and sell prices.") },
{ AvailableCommand.SealedValueOneofCase.TrainCommand,
new CommandInfo("Train", "Have a hero train to improve their abilities.") },
{ AvailableCommand.SealedValueOneofCase.TravelCommand,
new CommandInfo("Travel", "Move a hero between provinces without moving an army.") },
};
public EagleGameController mainController;
public CommandSelector _selector;
@@ -33,8 +246,10 @@ namespace eagle {
public IGameModel Model { get; set; }
public ErrorHandler errorHandler;
public CommandWarningPanelController commandWarningPanelController;
public CommandWarningPanelController commandInfoPanelController;
private AvailableCommand _availableCommand;
private bool _commandInfoShowing;
public AvailableCommand AvailableCommand {
get => _availableCommand;
private
@@ -70,7 +285,7 @@ namespace eagle {
public void SetAvailableCommandAndSelector(AvailableCommand cmd, CommandSelector sel) {
// Check if command help is currently showing before changing selector
bool helpWasShowing = IsCommandHelpShowing();
bool helpWasShowing = _commandInfoShowing;
AvailableCommand = cmd;
Selector = sel;
@@ -95,38 +310,46 @@ namespace eagle {
}
}
/// <summary>
/// Returns true if a command help panel is currently showing.
/// </summary>
private bool IsCommandHelpShowing() {
var activeId = TutorialManager.Instance?.ActiveSequenceId;
return activeId != null && activeId.StartsWith("command_");
}
/// <summary>
/// Shows help for the current command (used when switching commands while help is open).
/// </summary>
private void ShowCurrentCommandHelp() {
if (Selector == null) return;
string tutorialId = GetCurrentCommandTutorialId();
if (tutorialId != null) { TutorialManager.Instance?.ShowCommandHelp(tutorialId); }
var info = GetCurrentCommandInfo();
commandInfoPanelController.SetInfo(info.Title, info.Text, (RectTransform)transform);
_commandInfoShowing = true;
}
/// <summary>
/// Gets the tutorial ID for the current command.
/// </summary>
private string GetCurrentCommandTutorialId() {
if (Selector == null) return null;
var commandName = Selector.CommandType.ToString();
if (commandName.EndsWith("Command")) {
commandName = commandName.Substring(0, commandName.Length - "Command".Length);
private void ToggleCurrentCommandHelp() {
if (_commandInfoShowing) {
commandInfoPanelController.ClearWarning();
_commandInfoShowing = false;
} else {
ShowCurrentCommandHelp();
}
var snakeCase = System.Text.RegularExpressions.Regex.Replace(
commandName,
"([a-z])([A-Z])",
"$1_$2");
return $"command_{snakeCase.ToLower()}";
}
public void InfoButtonHovered() {
if (Selector == null) return;
ShowCurrentCommandHelp();
}
public void InfoButtonExited() {
if (!_commandInfoShowing) return;
commandInfoPanelController.ClearWarning();
_commandInfoShowing = false;
}
private CommandInfo GetCurrentCommandInfo() {
if (Selector != null && CommandInfos.TryGetValue(Selector.CommandType, out var info)) {
return info;
}
return new CommandInfo(
Selector?.HeaderString ?? "Command",
"Open the command reference for complete details.");
}
public List<CommandSelector> AppropriateSelectors(AvailableCommand cmd) =>
@@ -164,12 +387,13 @@ namespace eagle {
public void Update() {
// '?' key (Shift + /) toggles help panel when a command is selected
if (Selector != null && GameInput.QuestionMarkPressed()) { InfoButtonClicked(); }
if (Selector != null && GameInput.QuestionMarkPressed()) { ToggleCurrentCommandHelp(); }
}
public void PointerEnteredCommitButton() {
if (Selector != null) {
if (!Selector.EnableCommitButton) {
_commandInfoShowing = false;
if (string.IsNullOrEmpty(Selector.DisabledCommitButtonReason)) {
commandWarningPanelController.SetWarning(
"Invalid",
@@ -180,6 +404,7 @@ namespace eagle {
Selector.DisabledCommitButtonReason);
}
} else if (Selector.WarnOnCommitButton) {
_commandInfoShowing = false;
commandWarningPanelController.SetWarning(
"Are you sure?",
Selector.CommitWarningText);
@@ -190,13 +415,21 @@ namespace eagle {
public void PointerExitedCommitButton() { commandWarningPanelController.ClearWarning(); }
/// <summary>
/// Called when the info button is clicked. Shows help for the current command.
/// Called when the info button is clicked. Opens the full command reference.
/// </summary>
public void InfoButtonClicked() {
if (Selector == null) return;
string tutorialId = GetCurrentCommandTutorialId();
if (tutorialId != null) { TutorialManager.Instance?.ShowCommandHelp(tutorialId); }
string url = GetCurrentCommandPediaUrl();
if (url != null) { Application.OpenURL(url); }
}
private string GetCurrentCommandPediaUrl() {
if (Selector == null) return null;
return Eagle0pediaCommandAnchors.TryGetValue(Selector.CommandType, out var anchor)
? $"{Eagle0pediaCommandsBaseUrl}#{anchor}"
: Eagle0pediaCommandsBaseUrl;
}
public void OnGUI() {
@@ -221,8 +454,10 @@ namespace eagle {
if (infoButton != null) { infoButton.gameObject.SetActive(true); }
if (disableWarningPanel) {
MainQueue.Q.EnqueueForNextUpdate(
() => { commandWarningPanelController.ClearWarning(); });
MainQueue.Q.EnqueueForNextUpdate(() => {
commandWarningPanelController.ClearWarning();
_commandInfoShowing = false;
});
}
}
} catch (Exception e) {
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 2e3e00f85a9464a9384b1458c4924f72
guid: c5a1c92c3d80408c9db0ea566ab6f44b
PrefabImporter:
externalObjects: {}
userData:
@@ -33,7 +33,7 @@ RectTransform:
m_Father: {fileID: 4805301374137502840}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 10, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
@@ -55,8 +55,8 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
@@ -75,6 +75,62 @@ MonoBehaviour:
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &535498202979445979
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2589949536373363099}
- component: {fileID: 7053810932999177912}
m_Layer: 0
m_Name: Spacer (1)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &2589949536373363099
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 535498202979445979}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 2852530471765076928}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &7053810932999177912
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 535498202979445979}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.LayoutElement
m_IgnoreLayout: 0
m_MinWidth: 5
m_MinHeight: -1
m_PreferredWidth: 5
m_PreferredHeight: -1
m_FlexibleWidth: -1
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!1 &812417728419379797
GameObject:
m_ObjectHideFlags: 0
@@ -108,9 +164,9 @@ RectTransform:
m_Father: {fileID: 7457910521309802151}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 20, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: -4, y: 0}
m_SizeDelta: {x: 32, y: 32}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &6039712640275130388
CanvasRenderer:
@@ -130,8 +186,8 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
@@ -142,7 +198,7 @@ MonoBehaviour:
m_Calls: []
m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 0
m_PreserveAspect: 0
m_PreserveAspect: 1
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
@@ -159,7 +215,7 @@ GameObject:
serializedVersion: 6
m_Component:
- component: {fileID: 9048542243371672087}
- component: {fileID: 6652335321146229564}
- component: {fileID: 7818582976864677524}
m_Layer: 0
m_Name: Container
m_TagString: Untagged
@@ -188,7 +244,7 @@ RectTransform:
m_AnchoredPosition: {x: 0, y: 5}
m_SizeDelta: {x: -20, y: -10}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &6652335321146229564
--- !u!114 &7818582976864677524
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
@@ -197,16 +253,16 @@ MonoBehaviour:
m_GameObject: {fileID: 1500799938174959881}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.HorizontalLayoutGroup
m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.VerticalLayoutGroup
m_Padding:
m_Left: 0
m_Right: 0
m_Top: 0
m_Bottom: 0
m_ChildAlignment: 1
m_Spacing: 0
m_Spacing: 5
m_ChildForceExpandWidth: 0
m_ChildForceExpandHeight: 0
m_ChildControlWidth: 1
@@ -305,8 +361,8 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
@@ -336,6 +392,7 @@ GameObject:
- component: {fileID: 3167184831608549096}
- component: {fileID: 4255069183235372801}
- component: {fileID: 4776345542478574581}
- component: {fileID: 7206900340996448385}
m_Layer: 0
m_Name: Food Icon
m_TagString: Untagged
@@ -357,10 +414,10 @@ RectTransform:
m_Children: []
m_Father: {fileID: 2852530471765076928}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -153.11115, y: 0}
m_SizeDelta: {x: 32, y: 32}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &4255069183235372801
CanvasRenderer:
@@ -380,8 +437,8 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
@@ -400,6 +457,26 @@ MonoBehaviour:
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!114 &7206900340996448385
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3589966439211354413}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.LayoutElement
m_IgnoreLayout: 0
m_MinWidth: -1
m_MinHeight: -1
m_PreferredWidth: 40
m_PreferredHeight: 40
m_FlexibleWidth: 0
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!1 &3720475151093134755
GameObject:
m_ObjectHideFlags: 0
@@ -435,10 +512,10 @@ RectTransform:
- {fileID: 5351494155106131392}
m_Father: {fileID: 2852530471765076928}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -117.111115, y: 0}
m_SizeDelta: {x: 18, y: 18}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &3577476254976666949
CanvasRenderer:
@@ -458,19 +535,19 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 0.5019608}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
m_PreserveAspect: 0
m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 0
m_PreserveAspect: 1
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
@@ -488,8 +565,8 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Name:
m_EditorClassIdentifier:
m_Navigation:
m_Mode: 3
m_WrapAround: 0
@@ -531,7 +608,7 @@ MonoBehaviour:
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
m_IntArgument: 0
m_FloatArgument: 0
m_StringArgument:
m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
--- !u!114 &4096552507942873891
@@ -544,14 +621,14 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Name:
m_EditorClassIdentifier:
m_IgnoreLayout: 0
m_MinWidth: -1
m_MinHeight: -1
m_PreferredWidth: 25
m_PreferredHeight: 25
m_FlexibleWidth: -1
m_PreferredWidth: 44
m_PreferredHeight: 44
m_FlexibleWidth: 0
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!1 &4320584972973156239
@@ -601,6 +678,7 @@ GameObject:
- component: {fileID: 2444745957850351905}
- component: {fileID: 5441494304328330379}
- component: {fileID: 7691150794451487006}
- component: {fileID: 7701340894734174317}
m_Layer: 0
m_Name: Food Given Label
m_TagString: Untagged
@@ -622,10 +700,10 @@ RectTransform:
m_Children: []
m_Father: {fileID: 2852530471765076928}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 135.88887, y: -0.00002670288}
m_SizeDelta: {x: 70, y: 20}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &5441494304328330379
CanvasRenderer:
@@ -645,8 +723,8 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
@@ -728,6 +806,82 @@ MonoBehaviour:
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!114 &7701340894734174317
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6084383316558638559}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.LayoutElement
m_IgnoreLayout: 0
m_MinWidth: -1
m_MinHeight: -1
m_PreferredWidth: 70
m_PreferredHeight: -1
m_FlexibleWidth: 0
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!1 &6395408087832493535
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1840577926034661281}
- component: {fileID: 6414301501645049181}
m_Layer: 0
m_Name: Spacer
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1840577926034661281
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6395408087832493535}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 2852530471765076928}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &6414301501645049181
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6395408087832493535}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.LayoutElement
m_IgnoreLayout: 0
m_MinWidth: 5
m_MinHeight: -1
m_PreferredWidth: 5
m_PreferredHeight: -1
m_FlexibleWidth: -1
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!1 &6442975694674051199
GameObject:
m_ObjectHideFlags: 0
@@ -741,6 +895,7 @@ GameObject:
- component: {fileID: 8116477721251383681}
- component: {fileID: 178744607440981802}
- component: {fileID: 2044719651128023728}
- component: {fileID: 7659419844362864192}
m_Layer: 0
m_Name: Plus
m_TagString: Untagged
@@ -763,10 +918,10 @@ RectTransform:
- {fileID: 7271010028556466978}
m_Father: {fileID: 2852530471765076928}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 106.88872, y: 0}
m_SizeDelta: {x: 18, y: 18}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &778641105167446119
CanvasRenderer:
@@ -786,19 +941,19 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 0.5019608}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
m_PreserveAspect: 0
m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 0
m_PreserveAspect: 1
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
@@ -816,8 +971,8 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Name:
m_EditorClassIdentifier:
m_Navigation:
m_Mode: 3
m_WrapAround: 0
@@ -859,7 +1014,7 @@ MonoBehaviour:
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
m_IntArgument: 0
m_FloatArgument: 0
m_StringArgument:
m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
--- !u!114 &2044719651128023728
@@ -872,13 +1027,33 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Name:
m_EditorClassIdentifier:
m_IgnoreLayout: 0
m_MinWidth: -1
m_MinHeight: -1
m_PreferredWidth: 25
m_PreferredHeight: 25
m_PreferredWidth: 44
m_PreferredHeight: 44
m_FlexibleWidth: 0
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!114 &7659419844362864192
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6442975694674051199}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.LayoutElement
m_IgnoreLayout: 0
m_MinWidth: -1
m_MinHeight: -1
m_PreferredWidth: -1
m_PreferredHeight: -1
m_FlexibleWidth: -1
m_FlexibleHeight: -1
m_LayoutPriority: 1
@@ -914,10 +1089,10 @@ RectTransform:
m_Children: []
m_Father: {fileID: 5399656178080988241}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_SizeDelta: {x: 26, y: 26}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &1635267172464500121
CanvasRenderer:
@@ -937,19 +1112,19 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 0, g: 0, b: 0, a: 1}
m_Color: {r: 0, g: 0, b: 0, a: 0.9}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 21300002, guid: 66995b6b61aed864daa956ae255d7fee, type: 3}
m_Sprite: {fileID: 21300000, guid: 26aa44d57374b4f3c8ba477d8bd86235, type: 3}
m_Type: 0
m_PreserveAspect: 0
m_PreserveAspect: 1
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
@@ -975,7 +1150,7 @@ GameObject:
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 0
m_IsActive: 1
--- !u!224 &6576563980865636295
RectTransform:
m_ObjectHideFlags: 0
@@ -1014,8 +1189,8 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 0}
m_RaycastTarget: 1
@@ -1044,8 +1219,8 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 2bb1950fe39a149adb1556ace998b8bd, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Name:
m_EditorClassIdentifier:
ButtonImage: {fileID: 2800000, guid: 9925ce3d379cd7f45b411cb75bc0dd80, type: 3}
heroDropdownController: {fileID: 4444860144084792508}
foodSlider: {fileID: 4707563203409665355}
@@ -1060,6 +1235,7 @@ GameObject:
m_Component:
- component: {fileID: 3326176103930392485}
- component: {fileID: 4707563203409665355}
- component: {fileID: 4682851079698865289}
m_Layer: 0
m_Name: Food Slider
m_TagString: Untagged
@@ -1084,10 +1260,10 @@ RectTransform:
- {fileID: 7457910521309802151}
m_Father: {fileID: 2852530471765076928}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -4.111191, y: 0}
m_SizeDelta: {x: 200, y: 20}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &4707563203409665355
MonoBehaviour:
@@ -1099,8 +1275,8 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 67db9e8f0e2ae9c40bc1e2b64352a6b4, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Name:
m_EditorClassIdentifier:
m_Navigation:
m_Mode: 3
m_WrapAround: 0
@@ -1149,9 +1325,29 @@ MonoBehaviour:
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
m_IntArgument: 0
m_FloatArgument: 0
m_StringArgument:
m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
--- !u!114 &4682851079698865289
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8236402555298992454}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.LayoutElement
m_IgnoreLayout: 0
m_MinWidth: -1
m_MinHeight: -1
m_PreferredWidth: -1
m_PreferredHeight: 28
m_FlexibleWidth: 1
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!1 &8370458353524890633
GameObject:
m_ObjectHideFlags: 0
@@ -1162,6 +1358,7 @@ GameObject:
m_Component:
- component: {fileID: 2852530471765076928}
- component: {fileID: 192088198235984118}
- component: {fileID: 5412937391956506375}
m_Layer: 0
m_Name: Slider
m_TagString: Untagged
@@ -1181,17 +1378,19 @@ RectTransform:
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 80276436953855367}
- {fileID: 3167184831608549096}
- {fileID: 2444745957850351905}
- {fileID: 80276436953855367}
- {fileID: 1840577926034661281}
- {fileID: 3326176103930392485}
- {fileID: 2589949536373363099}
- {fileID: 2444745957850351905}
- {fileID: 5399656178080988241}
m_Father: {fileID: 9048542243371672087}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 600.35156, y: -119}
m_SizeDelta: {x: 250, y: 238}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &192088198235984118
MonoBehaviour:
@@ -1203,16 +1402,42 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.LayoutElement
m_IgnoreLayout: 0
m_MinWidth: -1
m_MinWidth: 250
m_MinHeight: -1
m_PreferredWidth: 250
m_PreferredHeight: -1
m_PreferredWidth: 500
m_PreferredHeight: 44
m_FlexibleWidth: 0
m_FlexibleHeight: 1
m_FlexibleHeight: 0
m_LayoutPriority: 1
--- !u!114 &5412937391956506375
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8370458353524890633}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.HorizontalLayoutGroup
m_Padding:
m_Left: 0
m_Right: 0
m_Top: 0
m_Bottom: 0
m_ChildAlignment: 4
m_Spacing: 5
m_ChildForceExpandWidth: 0
m_ChildForceExpandHeight: 0
m_ChildControlWidth: 1
m_ChildControlHeight: 1
m_ChildScaleWidth: 0
m_ChildScaleHeight: 0
m_ReverseArrangement: 0
--- !u!1 &8397644247425213167
GameObject:
m_ObjectHideFlags: 0
@@ -1245,10 +1470,10 @@ RectTransform:
m_Children: []
m_Father: {fileID: 80276436953855367}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_SizeDelta: {x: 26, y: 26}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &8316459456501615428
CanvasRenderer:
@@ -1268,19 +1493,19 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 0, g: 0, b: 0, a: 1}
m_Color: {r: 0, g: 0, b: 0, a: 0.9}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 21300002, guid: 9964955250a501b49ad0d9df1c632e82, type: 3}
m_Sprite: {fileID: 21300000, guid: 7ace66eb7c422453b8396a46cb97c9c5, type: 3}
m_Type: 0
m_PreserveAspect: 0
m_PreserveAspect: 1
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
@@ -1369,7 +1594,7 @@ PrefabInstance:
- target: {fileID: 6176764422977772731, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_AnchorMax.y
value: 1
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6176764422977772731, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
@@ -1379,12 +1604,12 @@ PrefabInstance:
- target: {fileID: 6176764422977772731, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_AnchorMin.y
value: 1
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6176764422977772731, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_SizeDelta.x
value: 400
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6176764422977772731, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
@@ -1429,12 +1654,12 @@ PrefabInstance:
- target: {fileID: 6176764422977772731, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_AnchoredPosition.x
value: 275.35156
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6176764422977772731, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_AnchoredPosition.y
value: -25
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6176764422977772731, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
@@ -1481,6 +1706,71 @@ PrefabInstance:
propertyPath: m_StaticEditorFlags
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6993301234712457781, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6993301234712457781, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6993301234712457781, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6993301234712457781, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6993301234712457781, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6993301234712457781, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8655783301447689420, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8655783301447689420, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8655783301447689420, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8655783301447689420, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8655783301447689420, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8655783301447689420, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8800000000000006001, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_MinHeight
value: -1
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
@@ -1506,7 +1796,7 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.LayoutElement
m_IgnoreLayout: 0
m_MinWidth: -1
@@ -1532,5 +1822,5 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: bd19585e1f7d445a3b2c459d2c8535eb, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Name:
m_EditorClassIdentifier:
@@ -3719,7 +3719,7 @@ RectTransform:
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 20, y: 0}
m_SizeDelta: {x: 32, y: 32}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &9091830150784588802
CanvasRenderer:
@@ -3751,7 +3751,7 @@ MonoBehaviour:
m_Calls: []
m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 0
m_PreserveAspect: 0
m_PreserveAspect: 1
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
@@ -5211,7 +5211,7 @@ RectTransform:
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 20, y: 0}
m_SizeDelta: {x: 32, y: 32}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &814846324982690194
CanvasRenderer:
@@ -5243,7 +5243,7 @@ MonoBehaviour:
m_Calls: []
m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 0
m_PreserveAspect: 0
m_PreserveAspect: 1
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: ea45ed7390894a42aaf69626015eadf1
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,984 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &58495604
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 58495605}
- component: {fileID: 58495607}
- component: {fileID: 58495608}
- component: {fileID: 58495606}
m_Layer: 0
m_Name: Text (TMP)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 2147483647
m_IsActive: 1
--- !u!224 &58495605
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 58495604}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: -0.00004119873}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 972466483}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: -28}
m_SizeDelta: {x: -36, y: -76}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &58495606
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 58495604}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier:
m_IgnoreLayout: 0
m_MinWidth: -1
m_MinHeight: -1
m_PreferredWidth: -1
m_PreferredHeight: -1
m_FlexibleWidth: 1
m_FlexibleHeight: 1
m_LayoutPriority: 1
--- !u!222 &58495607
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 58495604}
m_CullTransparentMesh: 0
--- !u!114 &58495608
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 58495604}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: "Four score and seven years ago our fathers brought forth upon this continent,
a new nation, conceived in Liberty, and dedicated to the proposition that all
men are created equal.\nNow we are engaged in a great civil war, testing whether
that nation, or any nation so conceived and so dedicated, can long endure. We
are met on a great battle-field of that war. We have come to dedicate a portion
of that field, as a final resting place for those who here gave their lives that
that nation might live. It is altogether fitting and proper that we should do
this.\n\nBut, in a larger sense, we can not dedicate\u2014we can not consecrate\u2014we
can not hallow\u2014this ground. The brave men, living and dead, who struggled
here, have consecrated it, far above our poor power to add or detract. The world
will little note, nor long remember what we say here, but it can never forget
what they did here. It is for us the living, rather, to be dedicated here to
the unfinished work which they who fought here have thus far so nobly advanced.
It is rather for us to be here dedicated to the great task remaining before us\u2014that
from these honored dead we take increased devotion to that cause for which they
gave the last full measure of devotion\u2014that we here highly resolve that
these dead shall not have died in vain\u2014that this nation, under God, shall
have a new birth of freedom\u2014and that government of the people, by the people,
for the people, shall not perish from the earth.\n\n--\nAt this second appearing
to take the oath of the presidential office, there is less occasion for an extended
address than there was at the first. Then a statement, somewhat in detail, of
a course to be pursued, seemed fitting and proper. Now, at the expiration of
four years, during which public declarations have been constantly called forth
on every point and phase of the great contest which still absorbs the attention,
and engrosses the enerergies of the nation, little that is new could be presented.
The progress of our arms, upon which all else chiefly depends, is as well known
to the public as to myself; and it is, I trust, reasonably satisfactory and encouraging
to all. With high hope for the future, no prediction in regard to it is ventured.\n\nOn
the occasion corresponding to this four years ago, all thoughts were anxiously
directed to an impending civil-war. All dreaded it -- all sought to avert it.
While the inaugeral address was being delivered from this place, devoted altogether
to saving the Union without war, insurgent agents were in the city seeking to
destroy it without war -- seeking to dissole the Union, and divide effects, by
negotiation. Both parties deprecated war; but one of them would make war rather
than let the nation survive; and the other would accept war rather than let it
perish. And the war came.\n\nOne eighth of the whole population were colored
slaves, not distributed generally over the Union, but localized in the Southern
half part of it. These slaves constituted a peculiar and powerful interest. All
knew that this interest was, somehow, the cause of the war. To strengthen, perpetuate,
and extend this interest was the object for which the insurgents would rend the
Union, even by war; while the government claimed no right to do more than to
restrict the territorial enlargement of it. Neither party expected for the war,
the magnitude, or the duration, which it has already attained. Neither anticipated
that the cause of the conflict might cease with, or even before, the conflict
itself should cease. Each looked for an easier triumph, and a result less fundamental
and astounding. Both read the same Bible, and pray to the same God; and each
invokes His aid against the other. It may seem strange that any men should dare
to ask a just God's assistance in wringing their bread from the sweat of other
men's faces; but let us judge not that we be not judged. The prayers of both
could not be answered; that of neither has been answered fully. The Almighty
has His own purposes. \"Woe unto the world because of offences! for it must needs
be that offences come; but woe to that man by whom the offence cometh!\" If we
shall suppose that American Slavery is one of those offences which, in the providence
of God, must needs come, but which, having continued through His appointed time,
He now wills to remove, and that He gives to both North and South, this terrible
war, as the woe due to those by whom the offence came, shall we discern therein
any departure from those divine attributes which the believers in a Living God
always ascribe to Him? Fondly do we hope -- fervently do we pray -- that this
mighty scourge of war may speedily pass away. Yet, if God wills that it continue,
until all the wealth piled by the bond-man's two hundred and fifty years of unrequited
toil shall be sunk, and until every drop of blood drawn with the lash, shall
be paid by another drawn with the sword, as was said f[our] three thousand years
ago, so still it must be said \"the judgments of the Lord, are true and righteous
altogether\"\n\nWith malice toward none; with charity for all; with firmness
in the right, as God gives us to see the right, let us strive on to finish the
work we are in; to bind up the nation's wounds; to care for him who shall have
borne the battle, and for his widow, and his orphan -- to achieve and cherish
a lasting peace among ourselves and with the world. to do all which may achieve
and cherish a just, and a lasting peace, among ourselves, and with the world.
all nations.\n\n"
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: ec2736df0379a45bfa7349b652fd07d6, type: 2}
m_sharedMaterial: {fileID: 1026247389042360723, guid: ec2736df0379a45bfa7349b652fd07d6,
type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4278190080
m_fontColor: {r: 0, g: 0, b: 0, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 22
m_fontSizeBase: 22
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 256
m_textAlignment: 65535
m_characterSpacing: 0
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_ActiveFontFeatures: 00000000
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 1
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &312788434
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 312788435}
- component: {fileID: 312788437}
- component: {fileID: 312788436}
m_Layer: 0
m_Name: Handle
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 2147483647
m_IsActive: 1
--- !u!224 &312788435
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 312788434}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1571989322}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.89239186}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 20, y: 20}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &312788436
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 312788434}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!222 &312788437
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 312788434}
m_CullTransparentMesh: 0
--- !u!1 &872978101
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 872978102}
- component: {fileID: 872978105}
- component: {fileID: 872978104}
- component: {fileID: 872978103}
m_Layer: 0
m_Name: Scroll View
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 2147483647
m_IsActive: 0
--- !u!224 &872978102
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 872978101}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 2139237571}
- {fileID: 1554185316}
m_Father: {fileID: 972466483}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: -28}
m_SizeDelta: {x: -32, y: -82}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &872978103
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 872978101}
m_Enabled: 0
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Content: {fileID: 935480733}
m_Horizontal: 0
m_Vertical: 1
m_MovementType: 2
m_Elasticity: 0.1
m_Inertia: 1
m_DecelerationRate: 0.135
m_ScrollSensitivity: 10
m_Viewport: {fileID: 2139237571}
m_HorizontalScrollbar: {fileID: 0}
m_VerticalScrollbar: {fileID: 1554185317}
m_HorizontalScrollbarVisibility: 2
m_VerticalScrollbarVisibility: 2
m_HorizontalScrollbarSpacing: -3
m_VerticalScrollbarSpacing: -3
m_OnValueChanged:
m_PersistentCalls:
m_Calls: []
--- !u!114 &872978104
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 872978101}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 0}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!222 &872978105
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 872978101}
m_CullTransparentMesh: 0
--- !u!1 &935480732
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 935480733}
- component: {fileID: 935480735}
- component: {fileID: 935480734}
m_Layer: 0
m_Name: Content
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 2147483647
m_IsActive: 1
--- !u!224 &935480733
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 935480732}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 58495605}
m_Father: {fileID: 2139237571}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &935480734
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 935480732}
m_Enabled: 0
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Padding:
m_Left: 5
m_Right: 5
m_Top: 0
m_Bottom: 0
m_ChildAlignment: 0
m_Spacing: 0
m_ChildForceExpandWidth: 1
m_ChildForceExpandHeight: 1
m_ChildControlWidth: 1
m_ChildControlHeight: 1
m_ChildScaleWidth: 0
m_ChildScaleHeight: 0
m_ReverseArrangement: 0
--- !u!114 &935480735
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 935480732}
m_Enabled: 0
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3}
m_Name:
m_EditorClassIdentifier:
m_HorizontalFit: 0
m_VerticalFit: 2
--- !u!1 &972466481
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 972466483}
- component: {fileID: 972466485}
- component: {fileID: 972466484}
- component: {fileID: 972466482}
m_Layer: 0
m_Name: Command Info Panel
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 2147483647
m_IsActive: 0
--- !u!114 &972466482
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 972466481}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 6a522d3d61f4f4545b383b9533992a17, type: 3}
m_Name:
m_EditorClassIdentifier:
canvas: {fileID: 0}
mapController: {fileID: 0}
textField: {fileID: 58495608}
title: {fileID: 2065074679}
imagesAndNamesContainer: {fileID: 0}
firstImage: {fileID: 0}
firstName: {fileID: 0}
secondImage: {fileID: 0}
secondName: {fileID: 0}
thirdImage: {fileID: 0}
thirdName: {fileID: 0}
nextButton: {fileID: 0}
--- !u!224 &972466483
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 972466481}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 2065074681}
- {fileID: 872978102}
- {fileID: 58495605}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &972466484
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 972466481}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 0.99215686, g: 0.80784315, b: 0.93333334, a: 0.85882354}
m_RaycastTarget: 0
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!222 &972466485
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 972466481}
m_CullTransparentMesh: 0
--- !u!1 &1554185315
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1554185316}
- component: {fileID: 1554185319}
- component: {fileID: 1554185318}
- component: {fileID: 1554185317}
m_Layer: 0
m_Name: Scrollbar Vertical
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 2147483647
m_IsActive: 0
--- !u!224 &1554185316
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1554185315}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 1571989322}
m_Father: {fileID: 872978102}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 3, y: 0}
m_Pivot: {x: 1, y: 1}
--- !u!114 &1554185317
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1554185315}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Navigation:
m_Mode: 3
m_WrapAround: 0
m_SelectOnUp: {fileID: 0}
m_SelectOnDown: {fileID: 0}
m_SelectOnLeft: {fileID: 0}
m_SelectOnRight: {fileID: 0}
m_Transition: 1
m_Colors:
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
m_HighlightedSprite: {fileID: 0}
m_PressedSprite: {fileID: 0}
m_SelectedSprite: {fileID: 0}
m_DisabledSprite: {fileID: 0}
m_AnimationTriggers:
m_NormalTrigger: Normal
m_HighlightedTrigger: Highlighted
m_PressedTrigger: Pressed
m_SelectedTrigger: Selected
m_DisabledTrigger: Disabled
m_Interactable: 1
m_TargetGraphic: {fileID: 312788436}
m_HandleRect: {fileID: 312788435}
m_Direction: 2
m_Value: 1.0000001
m_Size: 0.10760812
m_NumberOfSteps: 0
m_OnValueChanged:
m_PersistentCalls:
m_Calls: []
--- !u!114 &1554185318
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1554185315}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!222 &1554185319
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1554185315}
m_CullTransparentMesh: 0
--- !u!1 &1571989321
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1571989322}
m_Layer: 0
m_Name: Sliding Area
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 2147483647
m_IsActive: 1
--- !u!224 &1571989322
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1571989321}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 312788435}
m_Father: {fileID: 1554185316}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: -20, y: -20}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &2065074678
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2065074681}
- component: {fileID: 2065074680}
- component: {fileID: 2065074679}
m_Layer: 0
m_Name: Title Text
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 2147483647
m_IsActive: 1
--- !u!114 &2065074679
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2065074678}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: A thing happened!
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: ec2736df0379a45bfa7349b652fd07d6, type: 2}
m_sharedMaterial: {fileID: 1026247389042360723, guid: ec2736df0379a45bfa7349b652fd07d6,
type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4278190080
m_fontColor: {r: 0, g: 0, b: 0, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 36
m_fontSizeBase: 36
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 256
m_textAlignment: 65535
m_characterSpacing: 0
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_ActiveFontFeatures: 00000000
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 1
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!222 &2065074680
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2065074678}
m_CullTransparentMesh: 0
--- !u!224 &2065074681
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2065074678}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 972466483}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: -20}
m_SizeDelta: {x: 0, y: 36}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &2139237570
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2139237571}
- component: {fileID: 2139237574}
- component: {fileID: 2139237573}
- component: {fileID: 2139237572}
m_Layer: 0
m_Name: Viewport
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 2147483647
m_IsActive: 1
--- !u!224 &2139237571
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2139237570}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 935480733}
m_Father: {fileID: 872978102}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0, y: 1}
--- !u!114 &2139237572
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2139237570}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3}
m_Name:
m_EditorClassIdentifier:
m_ShowMaskGraphic: 0
--- !u!114 &2139237573
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2139237570}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!222 &2139237574
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2139237570}
m_CullTransparentMesh: 0
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: e42cfb09bd114e0e977be539621cc201
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,983 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &58495604
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 58495605}
- component: {fileID: 58495607}
- component: {fileID: 58495608}
- component: {fileID: 58495606}
m_Layer: 0
m_Name: Text (TMP)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 2147483647
m_IsActive: 1
--- !u!224 &58495605
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 58495604}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: -0.00004119873}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 935480733}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 316, y: -920.005}
m_SizeDelta: {x: 622, y: 1840.01}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &58495606
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 58495604}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier:
m_IgnoreLayout: 0
m_MinWidth: -1
m_MinHeight: -1
m_PreferredWidth: -1
m_PreferredHeight: -1
m_FlexibleWidth: 1
m_FlexibleHeight: 1
m_LayoutPriority: 1
--- !u!222 &58495607
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 58495604}
m_CullTransparentMesh: 0
--- !u!114 &58495608
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 58495604}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: "Four score and seven years ago our fathers brought forth upon this continent,
a new nation, conceived in Liberty, and dedicated to the proposition that all
men are created equal.\nNow we are engaged in a great civil war, testing whether
that nation, or any nation so conceived and so dedicated, can long endure. We
are met on a great battle-field of that war. We have come to dedicate a portion
of that field, as a final resting place for those who here gave their lives that
that nation might live. It is altogether fitting and proper that we should do
this.\n\nBut, in a larger sense, we can not dedicate\u2014we can not consecrate\u2014we
can not hallow\u2014this ground. The brave men, living and dead, who struggled
here, have consecrated it, far above our poor power to add or detract. The world
will little note, nor long remember what we say here, but it can never forget
what they did here. It is for us the living, rather, to be dedicated here to
the unfinished work which they who fought here have thus far so nobly advanced.
It is rather for us to be here dedicated to the great task remaining before us\u2014that
from these honored dead we take increased devotion to that cause for which they
gave the last full measure of devotion\u2014that we here highly resolve that
these dead shall not have died in vain\u2014that this nation, under God, shall
have a new birth of freedom\u2014and that government of the people, by the people,
for the people, shall not perish from the earth.\n\n--\nAt this second appearing
to take the oath of the presidential office, there is less occasion for an extended
address than there was at the first. Then a statement, somewhat in detail, of
a course to be pursued, seemed fitting and proper. Now, at the expiration of
four years, during which public declarations have been constantly called forth
on every point and phase of the great contest which still absorbs the attention,
and engrosses the enerergies of the nation, little that is new could be presented.
The progress of our arms, upon which all else chiefly depends, is as well known
to the public as to myself; and it is, I trust, reasonably satisfactory and encouraging
to all. With high hope for the future, no prediction in regard to it is ventured.\n\nOn
the occasion corresponding to this four years ago, all thoughts were anxiously
directed to an impending civil-war. All dreaded it -- all sought to avert it.
While the inaugeral address was being delivered from this place, devoted altogether
to saving the Union without war, insurgent agents were in the city seeking to
destroy it without war -- seeking to dissole the Union, and divide effects, by
negotiation. Both parties deprecated war; but one of them would make war rather
than let the nation survive; and the other would accept war rather than let it
perish. And the war came.\n\nOne eighth of the whole population were colored
slaves, not distributed generally over the Union, but localized in the Southern
half part of it. These slaves constituted a peculiar and powerful interest. All
knew that this interest was, somehow, the cause of the war. To strengthen, perpetuate,
and extend this interest was the object for which the insurgents would rend the
Union, even by war; while the government claimed no right to do more than to
restrict the territorial enlargement of it. Neither party expected for the war,
the magnitude, or the duration, which it has already attained. Neither anticipated
that the cause of the conflict might cease with, or even before, the conflict
itself should cease. Each looked for an easier triumph, and a result less fundamental
and astounding. Both read the same Bible, and pray to the same God; and each
invokes His aid against the other. It may seem strange that any men should dare
to ask a just God's assistance in wringing their bread from the sweat of other
men's faces; but let us judge not that we be not judged. The prayers of both
could not be answered; that of neither has been answered fully. The Almighty
has His own purposes. \"Woe unto the world because of offences! for it must needs
be that offences come; but woe to that man by whom the offence cometh!\" If we
shall suppose that American Slavery is one of those offences which, in the providence
of God, must needs come, but which, having continued through His appointed time,
He now wills to remove, and that He gives to both North and South, this terrible
war, as the woe due to those by whom the offence came, shall we discern therein
any departure from those divine attributes which the believers in a Living God
always ascribe to Him? Fondly do we hope -- fervently do we pray -- that this
mighty scourge of war may speedily pass away. Yet, if God wills that it continue,
until all the wealth piled by the bond-man's two hundred and fifty years of unrequited
toil shall be sunk, and until every drop of blood drawn with the lash, shall
be paid by another drawn with the sword, as was said f[our] three thousand years
ago, so still it must be said \"the judgments of the Lord, are true and righteous
altogether\"\n\nWith malice toward none; with charity for all; with firmness
in the right, as God gives us to see the right, let us strive on to finish the
work we are in; to bind up the nation's wounds; to care for him who shall have
borne the battle, and for his widow, and his orphan -- to achieve and cherish
a lasting peace among ourselves and with the world. to do all which may achieve
and cherish a just, and a lasting peace, among ourselves, and with the world.
all nations.\n\n"
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: ec2736df0379a45bfa7349b652fd07d6, type: 2}
m_sharedMaterial: {fileID: 1026247389042360723, guid: ec2736df0379a45bfa7349b652fd07d6,
type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4278190080
m_fontColor: {r: 0, g: 0, b: 0, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 16
m_fontSizeBase: 16
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 256
m_textAlignment: 65535
m_characterSpacing: 0
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_ActiveFontFeatures: 00000000
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 1
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &312788434
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 312788435}
- component: {fileID: 312788437}
- component: {fileID: 312788436}
m_Layer: 0
m_Name: Handle
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 2147483647
m_IsActive: 1
--- !u!224 &312788435
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 312788434}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1571989322}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.89239186}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 20, y: 20}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &312788436
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 312788434}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!222 &312788437
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 312788434}
m_CullTransparentMesh: 0
--- !u!1 &872978101
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 872978102}
- component: {fileID: 872978105}
- component: {fileID: 872978104}
- component: {fileID: 872978103}
m_Layer: 0
m_Name: Scroll View
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 2147483647
m_IsActive: 1
--- !u!224 &872978102
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 872978101}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 2139237571}
- {fileID: 1554185316}
m_Father: {fileID: 972466483}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: -35}
m_SizeDelta: {x: -40, y: -90}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &872978103
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 872978101}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Content: {fileID: 935480733}
m_Horizontal: 0
m_Vertical: 1
m_MovementType: 2
m_Elasticity: 0.1
m_Inertia: 1
m_DecelerationRate: 0.135
m_ScrollSensitivity: 10
m_Viewport: {fileID: 2139237571}
m_HorizontalScrollbar: {fileID: 0}
m_VerticalScrollbar: {fileID: 1554185317}
m_HorizontalScrollbarVisibility: 2
m_VerticalScrollbarVisibility: 2
m_HorizontalScrollbarSpacing: -3
m_VerticalScrollbarSpacing: -3
m_OnValueChanged:
m_PersistentCalls:
m_Calls: []
--- !u!114 &872978104
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 872978101}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 0}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!222 &872978105
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 872978101}
m_CullTransparentMesh: 0
--- !u!1 &935480732
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 935480733}
- component: {fileID: 935480735}
- component: {fileID: 935480734}
m_Layer: 0
m_Name: Content
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 2147483647
m_IsActive: 1
--- !u!224 &935480733
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 935480732}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 58495605}
m_Father: {fileID: 2139237571}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: -0.00010179012}
m_SizeDelta: {x: 0, y: 1840.01}
m_Pivot: {x: 0, y: 1}
--- !u!114 &935480734
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 935480732}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Padding:
m_Left: 5
m_Right: 5
m_Top: 0
m_Bottom: 0
m_ChildAlignment: 0
m_Spacing: 0
m_ChildForceExpandWidth: 1
m_ChildForceExpandHeight: 1
m_ChildControlWidth: 1
m_ChildControlHeight: 1
m_ChildScaleWidth: 0
m_ChildScaleHeight: 0
m_ReverseArrangement: 0
--- !u!114 &935480735
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 935480732}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3}
m_Name:
m_EditorClassIdentifier:
m_HorizontalFit: 0
m_VerticalFit: 2
--- !u!1 &972466481
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 972466483}
- component: {fileID: 972466485}
- component: {fileID: 972466484}
- component: {fileID: 972466482}
m_Layer: 0
m_Name: Command Warning Panel
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 2147483647
m_IsActive: 0
--- !u!114 &972466482
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 972466481}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 6a522d3d61f4f4545b383b9533992a17, type: 3}
m_Name:
m_EditorClassIdentifier:
canvas: {fileID: 0}
mapController: {fileID: 0}
textField: {fileID: 58495608}
title: {fileID: 2065074679}
imagesAndNamesContainer: {fileID: 0}
firstImage: {fileID: 0}
firstName: {fileID: 0}
secondImage: {fileID: 0}
secondName: {fileID: 0}
thirdImage: {fileID: 0}
thirdName: {fileID: 0}
nextButton: {fileID: 0}
--- !u!224 &972466483
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 972466481}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 2065074681}
- {fileID: 872978102}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &972466484
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 972466481}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 0.99215686, g: 0.80784315, b: 0.93333334, a: 0.85882354}
m_RaycastTarget: 0
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!222 &972466485
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 972466481}
m_CullTransparentMesh: 0
--- !u!1 &1554185315
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1554185316}
- component: {fileID: 1554185319}
- component: {fileID: 1554185318}
- component: {fileID: 1554185317}
m_Layer: 0
m_Name: Scrollbar Vertical
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 2147483647
m_IsActive: 1
--- !u!224 &1554185316
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1554185315}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 1571989322}
m_Father: {fileID: 872978102}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 3, y: 0}
m_Pivot: {x: 1, y: 1}
--- !u!114 &1554185317
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1554185315}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Navigation:
m_Mode: 3
m_WrapAround: 0
m_SelectOnUp: {fileID: 0}
m_SelectOnDown: {fileID: 0}
m_SelectOnLeft: {fileID: 0}
m_SelectOnRight: {fileID: 0}
m_Transition: 1
m_Colors:
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
m_HighlightedSprite: {fileID: 0}
m_PressedSprite: {fileID: 0}
m_SelectedSprite: {fileID: 0}
m_DisabledSprite: {fileID: 0}
m_AnimationTriggers:
m_NormalTrigger: Normal
m_HighlightedTrigger: Highlighted
m_PressedTrigger: Pressed
m_SelectedTrigger: Selected
m_DisabledTrigger: Disabled
m_Interactable: 1
m_TargetGraphic: {fileID: 312788436}
m_HandleRect: {fileID: 312788435}
m_Direction: 2
m_Value: 1.0000001
m_Size: 0.10760812
m_NumberOfSteps: 0
m_OnValueChanged:
m_PersistentCalls:
m_Calls: []
--- !u!114 &1554185318
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1554185315}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!222 &1554185319
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1554185315}
m_CullTransparentMesh: 0
--- !u!1 &1571989321
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1571989322}
m_Layer: 0
m_Name: Sliding Area
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 2147483647
m_IsActive: 1
--- !u!224 &1571989322
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1571989321}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 312788435}
m_Father: {fileID: 1554185316}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: -20, y: -20}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &2065074678
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2065074681}
- component: {fileID: 2065074680}
- component: {fileID: 2065074679}
m_Layer: 0
m_Name: Title Text
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 2147483647
m_IsActive: 1
--- !u!114 &2065074679
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2065074678}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: A thing happened!
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: ec2736df0379a45bfa7349b652fd07d6, type: 2}
m_sharedMaterial: {fileID: 1026247389042360723, guid: ec2736df0379a45bfa7349b652fd07d6,
type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4278190080
m_fontColor: {r: 0, g: 0, b: 0, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 36
m_fontSizeBase: 36
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 256
m_textAlignment: 65535
m_characterSpacing: 0
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_ActiveFontFeatures: 00000000
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 1
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!222 &2065074680
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2065074678}
m_CullTransparentMesh: 0
--- !u!224 &2065074681
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2065074678}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 972466483}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: -40}
m_SizeDelta: {x: 0, y: 30}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &2139237570
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2139237571}
- component: {fileID: 2139237574}
- component: {fileID: 2139237573}
- component: {fileID: 2139237572}
m_Layer: 0
m_Name: Viewport
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 2147483647
m_IsActive: 1
--- !u!224 &2139237571
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2139237570}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 935480733}
m_Father: {fileID: 872978102}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0, y: 1}
--- !u!114 &2139237572
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2139237570}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3}
m_Name:
m_EditorClassIdentifier:
m_ShowMaskGraphic: 0
--- !u!114 &2139237573
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2139237570}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!222 &2139237574
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2139237570}
m_CullTransparentMesh: 0
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 4263c2dff8577344814ecd7f6f156c4f
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -13,6 +13,7 @@ GameObject:
- component: {fileID: 7304466873427689647}
- component: {fileID: 4514640250283625222}
- component: {fileID: 4793284665252726042}
- component: {fileID: 1921053570888756492}
m_Layer: 0
m_Name: Decline Quest Panel
m_TagString: Untagged
@@ -32,6 +33,7 @@ RectTransform:
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 747301221526076857}
- {fileID: 6368400333478319171}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
@@ -107,6 +109,32 @@ MonoBehaviour:
targetHeroDropdown: {fileID: 747301221526076838}
heroDetailsController: {fileID: 3838410328221040661}
declineQuestText: {fileID: 4486646683703429208}
--- !u!114 &1921053570888756492
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3055524910934872252}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.VerticalLayoutGroup
m_Padding:
m_Left: 0
m_Right: 0
m_Top: 0
m_Bottom: 0
m_ChildAlignment: 1
m_Spacing: 20
m_ChildForceExpandWidth: 0
m_ChildForceExpandHeight: 0
m_ChildControlWidth: 1
m_ChildControlHeight: 1
m_ChildScaleWidth: 0
m_ChildScaleHeight: 0
m_ReverseArrangement: 0
--- !u!1 &5813862264744512601
GameObject:
m_ObjectHideFlags: 0
@@ -117,8 +145,9 @@ GameObject:
m_Component:
- component: {fileID: 6368400333478319171}
- component: {fileID: 1398492992348864411}
- component: {fileID: 8505920786737488133}
m_Layer: 0
m_Name: Panel
m_Name: Columns
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
@@ -136,14 +165,14 @@ RectTransform:
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 2206779547989052154}
- {fileID: 6689648540304325297}
- {fileID: 2206779547989052154}
m_Father: {fileID: 4072512051861312416}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 1366, y: -1038}
m_SizeDelta: {x: 2732, y: 1940}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1398492992348864411
MonoBehaviour:
@@ -171,6 +200,26 @@ MonoBehaviour:
m_ChildScaleWidth: 0
m_ChildScaleHeight: 0
m_ReverseArrangement: 0
--- !u!114 &8505920786737488133
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5813862264744512601}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.LayoutElement
m_IgnoreLayout: 0
m_MinWidth: -1
m_MinHeight: -1
m_PreferredWidth: -1
m_PreferredHeight: -1
m_FlexibleWidth: 1
m_FlexibleHeight: 1
m_LayoutPriority: 1
--- !u!1 &6174309605085819799
GameObject:
m_ObjectHideFlags: 0
@@ -183,7 +232,7 @@ GameObject:
- component: {fileID: 6383551726386725355}
- component: {fileID: 3163938733187805409}
m_Layer: 0
m_Name: Right Column
m_Name: Hero Details Column
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
@@ -197,7 +246,7 @@ RectTransform:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6174309605085819799}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: -0}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
@@ -206,8 +255,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 565.7031, y: -121.5}
m_SizeDelta: {x: 500, y: 243}
m_AnchoredPosition: {x: 1061, y: -967.5}
m_SizeDelta: {x: 500, y: 1935}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &6383551726386725355
MonoBehaviour:
@@ -291,8 +340,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 150.35156, y: -95.005}
m_SizeDelta: {x: 300.70312, y: 60.01}
m_AnchoredPosition: {x: 300, y: -20.005}
m_SizeDelta: {x: 600, y: 40.01}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &5556111701288548158
CanvasRenderer:
@@ -439,7 +488,7 @@ GameObject:
- component: {fileID: 4778271629951264446}
- component: {fileID: 4407934141401368998}
m_Layer: 0
m_Name: Left Column
m_Name: Quest Column
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
@@ -457,14 +506,13 @@ RectTransform:
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 747301221526076857}
- {fileID: 4912695182407438506}
m_Father: {fileID: 6368400333478319171}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 155.35156, y: -121.5}
m_SizeDelta: {x: 300.70312, y: 243}
m_AnchoredPosition: {x: 1621, y: -967.5}
m_SizeDelta: {x: 600, y: 1935}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &4778271629951264446
MonoBehaviour:
@@ -481,9 +529,9 @@ MonoBehaviour:
m_IgnoreLayout: 0
m_MinWidth: 250
m_MinHeight: -1
m_PreferredWidth: 500
m_PreferredWidth: 600
m_PreferredHeight: -1
m_FlexibleWidth: 1
m_FlexibleWidth: 0
m_FlexibleHeight: 1
m_LayoutPriority: 1
--- !u!114 &4407934141401368998
@@ -501,7 +549,7 @@ MonoBehaviour:
m_Padding:
m_Left: 0
m_Right: 0
m_Top: 25
m_Top: 0
m_Bottom: 0
m_ChildAlignment: 1
m_Spacing: 0
@@ -608,7 +656,7 @@ PrefabInstance:
- target: {fileID: 439147160563542590, guid: 5294d9ccdfeff49a7922b57958f1f36f,
type: 3}
propertyPath: m_AnchoredPosition.y
value: -101.495
value: -959.995
objectReference: {fileID: 0}
- target: {fileID: 659192060282283700, guid: 5294d9ccdfeff49a7922b57958f1f36f,
type: 3}
@@ -718,7 +766,7 @@ PrefabInstance:
- target: {fileID: 969154235268918954, guid: 5294d9ccdfeff49a7922b57958f1f36f,
type: 3}
propertyPath: m_SizeDelta.y
value: 177.99
value: 1894.99
objectReference: {fileID: 0}
- target: {fileID: 969154235268918954, guid: 5294d9ccdfeff49a7922b57958f1f36f,
type: 3}
@@ -728,7 +776,7 @@ PrefabInstance:
- target: {fileID: 969154235268918954, guid: 5294d9ccdfeff49a7922b57958f1f36f,
type: 3}
propertyPath: m_AnchoredPosition.y
value: -129.005
value: -987.505
objectReference: {fileID: 0}
- target: {fileID: 974966414672551377, guid: 5294d9ccdfeff49a7922b57958f1f36f,
type: 3}
@@ -783,7 +831,7 @@ PrefabInstance:
- target: {fileID: 1222442002938798293, guid: 5294d9ccdfeff49a7922b57958f1f36f,
type: 3}
propertyPath: m_SizeDelta.y
value: 177.99
value: 1894.99
objectReference: {fileID: 0}
- target: {fileID: 1222442002938798293, guid: 5294d9ccdfeff49a7922b57958f1f36f,
type: 3}
@@ -793,7 +841,7 @@ PrefabInstance:
- target: {fileID: 1222442002938798293, guid: 5294d9ccdfeff49a7922b57958f1f36f,
type: 3}
propertyPath: m_AnchoredPosition.y
value: -88.995
value: -947.495
objectReference: {fileID: 0}
- target: {fileID: 1501647672983792286, guid: 5294d9ccdfeff49a7922b57958f1f36f,
type: 3}
@@ -928,12 +976,12 @@ PrefabInstance:
- target: {fileID: 2244499192882503191, guid: 5294d9ccdfeff49a7922b57958f1f36f,
type: 3}
propertyPath: m_SizeDelta.x
value: 0
value: 500
objectReference: {fileID: 0}
- target: {fileID: 2244499192882503191, guid: 5294d9ccdfeff49a7922b57958f1f36f,
type: 3}
propertyPath: m_SizeDelta.y
value: 243
value: 1935
objectReference: {fileID: 0}
- target: {fileID: 2244499192882503191, guid: 5294d9ccdfeff49a7922b57958f1f36f,
type: 3}
@@ -978,7 +1026,7 @@ PrefabInstance:
- target: {fileID: 2244499192882503191, guid: 5294d9ccdfeff49a7922b57958f1f36f,
type: 3}
propertyPath: m_AnchoredPosition.y
value: -121.5
value: -967.5
objectReference: {fileID: 0}
- target: {fileID: 2244499192882503191, guid: 5294d9ccdfeff49a7922b57958f1f36f,
type: 3}
@@ -1338,7 +1386,7 @@ PrefabInstance:
- target: {fileID: 4733968769770696120, guid: 5294d9ccdfeff49a7922b57958f1f36f,
type: 3}
propertyPath: m_SizeDelta.y
value: 218
value: 1935
objectReference: {fileID: 0}
- target: {fileID: 4733968769770696120, guid: 5294d9ccdfeff49a7922b57958f1f36f,
type: 3}
@@ -1348,7 +1396,7 @@ PrefabInstance:
- target: {fileID: 4733968769770696120, guid: 5294d9ccdfeff49a7922b57958f1f36f,
type: 3}
propertyPath: m_AnchoredPosition.y
value: -134
value: -967.5
objectReference: {fileID: 0}
- target: {fileID: 4825520812147858518, guid: 5294d9ccdfeff49a7922b57958f1f36f,
type: 3}
@@ -1588,7 +1636,7 @@ PrefabInstance:
- target: {fileID: 7659572975609845316, guid: 5294d9ccdfeff49a7922b57958f1f36f,
type: 3}
propertyPath: m_Padding.m_Top
value: 25
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7852428794777875364, guid: 5294d9ccdfeff49a7922b57958f1f36f,
type: 3}
@@ -1618,7 +1666,7 @@ PrefabInstance:
- target: {fileID: 7852428794777875364, guid: 5294d9ccdfeff49a7922b57958f1f36f,
type: 3}
propertyPath: m_AnchoredPosition.y
value: -97.5
value: -72.5
objectReference: {fileID: 0}
- target: {fileID: 7976385755436594187, guid: 5294d9ccdfeff49a7922b57958f1f36f,
type: 3}
@@ -1638,7 +1686,7 @@ PrefabInstance:
- target: {fileID: 7976385755436594187, guid: 5294d9ccdfeff49a7922b57958f1f36f,
type: 3}
propertyPath: m_SizeDelta.y
value: 177.99
value: 1894.99
objectReference: {fileID: 0}
- target: {fileID: 7976385755436594187, guid: 5294d9ccdfeff49a7922b57958f1f36f,
type: 3}
@@ -1648,7 +1696,7 @@ PrefabInstance:
- target: {fileID: 7976385755436594187, guid: 5294d9ccdfeff49a7922b57958f1f36f,
type: 3}
propertyPath: m_AnchoredPosition.y
value: -88.995
value: -947.495
objectReference: {fileID: 0}
- target: {fileID: 8013616528074449795, guid: 5294d9ccdfeff49a7922b57958f1f36f,
type: 3}
@@ -1803,7 +1851,7 @@ PrefabInstance:
- target: {fileID: 9214905588738920408, guid: 5294d9ccdfeff49a7922b57958f1f36f,
type: 3}
propertyPath: m_AnchoredPosition.y
value: -76.495
value: -934.995
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
@@ -1864,7 +1912,7 @@ PrefabInstance:
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 2206779547989052154}
m_TransformParent: {fileID: 4072512051861312416}
m_Modifications:
- target: {fileID: 1665200140771224366, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
@@ -1964,12 +2012,12 @@ PrefabInstance:
- target: {fileID: 6176764422977772731, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_SizeDelta.x
value: 300
value: 500
objectReference: {fileID: 0}
- target: {fileID: 6176764422977772731, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_SizeDelta.y
value: 40
value: 48
objectReference: {fileID: 0}
- target: {fileID: 6176764422977772731, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
@@ -2009,12 +2057,12 @@ PrefabInstance:
- target: {fileID: 6176764422977772731, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_AnchoredPosition.x
value: 150.35156
value: 1366
objectReference: {fileID: 0}
- target: {fileID: 6176764422977772731, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_AnchoredPosition.y
value: -45
value: -24
objectReference: {fileID: 0}
- target: {fileID: 6176764422977772731, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
@@ -2061,6 +2109,41 @@ PrefabInstance:
propertyPath: m_StaticEditorFlags
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8655783301447689420, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_AnchorMax.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 8655783301447689420, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_AnchorMin.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 8655783301447689420, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_SizeDelta.x
value: 500
objectReference: {fileID: 0}
- target: {fileID: 8655783301447689420, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_SizeDelta.y
value: 48
objectReference: {fileID: 0}
- target: {fileID: 8655783301447689420, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_AnchoredPosition.x
value: 250
objectReference: {fileID: 0}
- target: {fileID: 8655783301447689420, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_AnchoredPosition.y
value: -24
objectReference: {fileID: 0}
- target: {fileID: 8800000000000006001, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_PreferredHeight
value: 48
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
@@ -36,7 +36,7 @@ RectTransform:
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 5, y: -16.5}
m_SizeDelta: {x: 24, y: 29}
m_SizeDelta: {x: 29, y: 29}
m_Pivot: {x: 0, y: 0.5}
--- !u!222 &1967979697809000645
CanvasRenderer:
@@ -86,12 +86,12 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.LayoutElement
m_IgnoreLayout: 0
m_MinWidth: 24
m_MinHeight: 24
m_PreferredWidth: -1
m_PreferredHeight: -1
m_MinWidth: 29
m_MinHeight: 29
m_PreferredWidth: 29
m_PreferredHeight: 29
m_FlexibleWidth: 0
m_FlexibleHeight: 1
m_FlexibleHeight: 0
m_LayoutPriority: 1
--- !u!1 &323794254024283253
GameObject:
@@ -688,8 +688,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 890, y: -90}
m_SizeDelta: {x: 780, y: 180}
m_AnchoredPosition: {x: 860, y: -90}
m_SizeDelta: {x: 840, y: 180}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &5216468686439189857
CanvasRenderer:
@@ -1040,7 +1040,7 @@ RectTransform:
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 5, y: -16.5}
m_SizeDelta: {x: 24, y: 29}
m_SizeDelta: {x: 29, y: 29}
m_Pivot: {x: 0, y: 0.5}
--- !u!222 &1092329404558107655
CanvasRenderer:
@@ -1090,12 +1090,12 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.LayoutElement
m_IgnoreLayout: 0
m_MinWidth: 24
m_MinHeight: 24
m_PreferredWidth: -1
m_PreferredHeight: -1
m_MinWidth: 29
m_MinHeight: 29
m_PreferredWidth: 29
m_PreferredHeight: 29
m_FlexibleWidth: 0
m_FlexibleHeight: 1
m_FlexibleHeight: 0
m_LayoutPriority: 1
--- !u!1 &2628862479193374973
GameObject:
@@ -1868,7 +1868,7 @@ RectTransform:
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 5, y: -16.5}
m_SizeDelta: {x: 24, y: 29}
m_SizeDelta: {x: 29, y: 29}
m_Pivot: {x: 0, y: 0.5}
--- !u!222 &4614042214772514269
CanvasRenderer:
@@ -1918,12 +1918,12 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.LayoutElement
m_IgnoreLayout: 0
m_MinWidth: 24
m_MinHeight: 24
m_PreferredWidth: -1
m_PreferredHeight: -1
m_MinWidth: 29
m_MinHeight: 29
m_PreferredWidth: 29
m_PreferredHeight: 29
m_FlexibleWidth: 0
m_FlexibleHeight: 1
m_FlexibleHeight: 0
m_LayoutPriority: 1
--- !u!1 &3232467184437485346
GameObject:
@@ -2328,8 +2328,8 @@ MonoBehaviour:
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 14
m_fontSizeBase: 14
m_fontSize: 16
m_fontSizeBase: 16
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
@@ -2604,7 +2604,7 @@ RectTransform:
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 5, y: -16.5}
m_SizeDelta: {x: 24, y: 29}
m_SizeDelta: {x: 29, y: 29}
m_Pivot: {x: 0, y: 0.5}
--- !u!222 &7288121121076005505
CanvasRenderer:
@@ -2654,12 +2654,12 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.LayoutElement
m_IgnoreLayout: 0
m_MinWidth: 24
m_MinHeight: 24
m_PreferredWidth: -1
m_PreferredHeight: -1
m_MinWidth: 29
m_MinHeight: 29
m_PreferredWidth: 29
m_PreferredHeight: 29
m_FlexibleWidth: 0
m_FlexibleHeight: 1
m_FlexibleHeight: 0
m_LayoutPriority: 1
--- !u!1 &4160156237388562034
GameObject:
@@ -3441,7 +3441,7 @@ RectTransform:
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 5, y: -16.5}
m_SizeDelta: {x: 24, y: 29}
m_SizeDelta: {x: 29, y: 29}
m_Pivot: {x: 0, y: 0.5}
--- !u!222 &937264502616461264
CanvasRenderer:
@@ -3491,12 +3491,12 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.LayoutElement
m_IgnoreLayout: 0
m_MinWidth: 24
m_MinHeight: 24
m_PreferredWidth: -1
m_PreferredHeight: -1
m_MinWidth: 29
m_MinHeight: 29
m_PreferredWidth: 29
m_PreferredHeight: 29
m_FlexibleWidth: 0
m_FlexibleHeight: 1
m_FlexibleHeight: 0
m_LayoutPriority: 1
--- !u!1 &6435023218012385878
GameObject:
@@ -428,7 +428,7 @@ MonoBehaviour:
m_Top: 0
m_Bottom: 0
m_ChildAlignment: 1
m_Spacing: 0
m_Spacing: 5
m_ChildForceExpandWidth: 0
m_ChildForceExpandHeight: 0
m_ChildControlWidth: 1
@@ -581,10 +581,10 @@ RectTransform:
- {fileID: 3903543594601902919}
m_Father: {fileID: 1151709395816446968}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 405.35156, y: -139.005}
m_SizeDelta: {x: 810.7031, y: 207.99}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &9052340837898540059
MonoBehaviour:
@@ -625,11 +625,11 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.LayoutElement
m_IgnoreLayout: 0
m_MinWidth: -1
m_MinWidth: 600
m_MinHeight: -1
m_PreferredWidth: -1
m_PreferredWidth: 1000
m_PreferredHeight: -1
m_FlexibleWidth: 1
m_FlexibleWidth: 0
m_FlexibleHeight: 1
m_LayoutPriority: 1
--- !u!1 &3654445705173138577
@@ -671,10 +671,10 @@ RectTransform:
- {fileID: 6837268157669639115}
m_Father: {fileID: 2046428078496443616}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 608.02734, y: -20}
m_SizeDelta: {x: 405.35156, y: 40}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &3906631210223910519
CanvasRenderer:
@@ -818,11 +818,11 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.LayoutElement
m_IgnoreLayout: 0
m_MinWidth: -1
m_MinHeight: -1
m_PreferredWidth: -1
m_PreferredHeight: 40
m_FlexibleWidth: 1
m_MinWidth: 300
m_MinHeight: 48
m_PreferredWidth: 400
m_PreferredHeight: 48
m_FlexibleWidth: -1
m_FlexibleHeight: 0
m_LayoutPriority: 1
--- !u!1 &4021439620816784687
@@ -931,7 +931,7 @@ GameObject:
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 0
m_IsActive: 1
--- !u!224 &3640788133641476897
RectTransform:
m_ObjectHideFlags: 0
@@ -1402,10 +1402,10 @@ RectTransform:
m_Children: []
m_Father: {fileID: 1151709395816446968}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 405.35156, y: -17.504997}
m_SizeDelta: {x: 810.7031, y: 35.01}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &4716576479069741427
CanvasRenderer:
@@ -1751,6 +1751,21 @@ PrefabInstance:
serializedVersion: 3
m_TransformParent: {fileID: 2046428078496443616}
m_Modifications:
- target: {fileID: 5259921443769458350, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_MinWidth
value: -1
objectReference: {fileID: 0}
- target: {fileID: 5259921443769458350, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_FlexibleWidth
value: 1
objectReference: {fileID: 0}
- target: {fileID: 5259921443769458350, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_PreferredWidth
value: -1
objectReference: {fileID: 0}
- target: {fileID: 6176764421710205222, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_StaticEditorFlags
@@ -1796,6 +1811,11 @@ PrefabInstance:
propertyPath: m_Name
value: Hero Dropdown
objectReference: {fileID: 0}
- target: {fileID: 6176764422977772730, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_IsActive
value: 1
objectReference: {fileID: 0}
- target: {fileID: 6176764422977772730, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_StaticEditorFlags
@@ -1824,7 +1844,7 @@ PrefabInstance:
- target: {fileID: 6176764422977772731, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_AnchorMax.y
value: 1
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6176764422977772731, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
@@ -1834,17 +1854,17 @@ PrefabInstance:
- target: {fileID: 6176764422977772731, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_AnchorMin.y
value: 1
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6176764422977772731, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_SizeDelta.x
value: 405.35156
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6176764422977772731, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_SizeDelta.y
value: 40
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6176764422977772731, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
@@ -1884,12 +1904,12 @@ PrefabInstance:
- target: {fileID: 6176764422977772731, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_AnchoredPosition.x
value: 202.67578
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6176764422977772731, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_AnchoredPosition.y
value: -20
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6176764422977772731, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
@@ -1936,6 +1956,86 @@ PrefabInstance:
propertyPath: m_StaticEditorFlags
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6993301234712457781, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6993301234712457781, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6993301234712457781, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6993301234712457781, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6993301234712457781, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6993301234712457781, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8655783301447689420, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_AnchorMax.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8655783301447689420, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_AnchorMin.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8655783301447689420, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8655783301447689420, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8655783301447689420, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8655783301447689420, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_AnchoredPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8800000000000006001, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_MinWidth
value: 300
objectReference: {fileID: 0}
- target: {fileID: 8800000000000006001, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_FlexibleWidth
value: -1
objectReference: {fileID: 0}
- target: {fileID: 8800000000000006001, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_PreferredWidth
value: 400
objectReference: {fileID: 0}
- target: {fileID: 8800000000000006001, guid: 59599ef87ad824f52ada88f126d58c5f,
type: 3}
propertyPath: m_PreferredHeight
value: 48
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
@@ -471,9 +471,9 @@ RectTransform:
m_Father: {fileID: 5013570139773795706}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 20, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: -4, y: 0}
m_SizeDelta: {x: 32, y: 32}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &8251998612228591481
CanvasRenderer:
@@ -505,7 +505,7 @@ MonoBehaviour:
m_Calls: []
m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 0
m_PreserveAspect: 0
m_PreserveAspect: 1
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
@@ -1350,9 +1350,9 @@ RectTransform:
m_Father: {fileID: 8313290806719960784}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 20, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: -4, y: 0}
m_SizeDelta: {x: 32, y: 32}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &5487557479881611719
CanvasRenderer:
@@ -1384,7 +1384,7 @@ MonoBehaviour:
m_Calls: []
m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 0
m_PreserveAspect: 0
m_PreserveAspect: 1
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: f3df4d0c5f564bdf9f4992367af6002a
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -757,7 +757,7 @@ MonoBehaviour:
m_MinHeight: 20
m_PreferredWidth: 40
m_PreferredHeight: 20
m_FlexibleWidth: -1
m_FlexibleWidth: 0
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!1 &1754093268113756140
@@ -913,11 +913,11 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
m_IgnoreLayout: 0
m_MinWidth: 300
m_MinWidth: 200
m_MinHeight: -1
m_PreferredWidth: 300
m_PreferredHeight: -1
m_FlexibleWidth: -1
m_FlexibleWidth: 1
m_FlexibleHeight: 1
m_LayoutPriority: 1
--- !u!1 &1810710812334572201
@@ -1277,7 +1277,7 @@ RectTransform:
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: -2, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0, y: 1}
--- !u!222 &8447576075203272444
CanvasRenderer:
@@ -2426,7 +2426,7 @@ MonoBehaviour:
m_MinHeight: 0
m_PreferredWidth: 65
m_PreferredHeight: -1
m_FlexibleWidth: -1
m_FlexibleWidth: 0
m_FlexibleHeight: 1
m_LayoutPriority: 1
--- !u!1 &6493905219313391869
@@ -2837,11 +2837,11 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
m_IgnoreLayout: 0
m_MinWidth: 75
m_MinWidth: 100
m_MinHeight: 30
m_PreferredWidth: 75
m_PreferredWidth: 100
m_PreferredHeight: 30
m_FlexibleWidth: -1
m_FlexibleWidth: 0
m_FlexibleHeight: 1
m_LayoutPriority: 1
--- !u!1 &7724864368595114084
@@ -2939,8 +2939,8 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
m_Padding:
m_Left: 5
m_Right: 5
m_Left: 10
m_Right: 10
m_Top: 5
m_Bottom: 5
m_ChildAlignment: 3
@@ -3435,7 +3435,7 @@ MonoBehaviour:
m_MinHeight: 0
m_PreferredWidth: 150
m_PreferredHeight: -1
m_FlexibleWidth: -1
m_FlexibleWidth: 0
m_FlexibleHeight: 1
m_LayoutPriority: 1
--- !u!1 &8600209887432893839
@@ -6841,9 +6841,9 @@ RectTransform:
m_Father: {fileID: 906553694472734689}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 20, y: 0}
m_SizeDelta: {x: 32, y: 32}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &8754685779818912985
CanvasRenderer:
@@ -6875,7 +6875,7 @@ MonoBehaviour:
m_Calls: []
m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 0
m_PreserveAspect: 0
m_PreserveAspect: 1
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
@@ -7929,9 +7929,9 @@ RectTransform:
m_Father: {fileID: 5006087206053140860}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 20, y: 0}
m_SizeDelta: {x: 32, y: 32}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &165492527378934902
CanvasRenderer:
@@ -7963,7 +7963,7 @@ MonoBehaviour:
m_Calls: []
m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 0
m_PreserveAspect: 0
m_PreserveAspect: 1
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 7f492c3bc217238cfc26f0727b473f56
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 5427576fb37a1cbcb0a9fe7482fd770d
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -3365,9 +3365,9 @@ RectTransform:
m_Father: {fileID: 379581513358603947}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 20, y: 0}
m_SizeDelta: {x: 32, y: 32}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &7041734972534468306
CanvasRenderer:
@@ -3399,7 +3399,7 @@ MonoBehaviour:
m_Calls: []
m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 0
m_PreserveAspect: 0
m_PreserveAspect: 1
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: a91d6c36fdbf4e179caa09cf2cad9001
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -20,43 +20,6 @@ namespace eagle {
private int _availableGold;
private int _maxArmament;
private MaxAttainableEverywhereBattalions _maxAttainableEverywhereBattalions;
private int? _selectedBattalionIndex;
private GameObject _touchActionStrip;
private TMP_Text _touchActionStripLabel;
private Button _touchPlusButton;
private Button _touchMinusButton;
private Button _touchResetButton;
private Button _touchMaxButton;
private Image _touchPlusIcon;
private Image _touchMinusIcon;
private Image _touchResetIcon;
private Image _touchMaxIcon;
private Transform _touchActionButtonGrid;
private GameObject _allBattalionsHeader;
private GameObject _allBattalionsMaxButtonRow;
private bool _capturedTableLayout;
private bool _capturedAllBattalionsLayout;
private Vector2 _tableAnchoredPosition;
private Vector2 _tableSizeDelta;
private LayoutElement _tableLayoutElement;
private float _tableMinWidth;
private float _tablePreferredWidth;
private float _tableFlexibleWidth;
private HorizontalLayoutGroup _mainContentLayout;
private float _mainContentSpacing;
private Transform _touchActionStripParent;
private int _touchActionStripSiblingIndex;
private RectTransform _allBattalionsControlsRectTransform;
private Vector2 _allBattalionsControlsAnchoredPosition;
private Vector2 _allBattalionsControlsSizeDelta;
private VerticalLayoutGroup _allBattalionsControlsLayout;
private TextAnchor _allBattalionsControlsAlignment;
private RectTransform _maxAllButtonRectTransform;
private RectTransform _maxEvenButtonRectTransform;
private Transform _maxAllButtonParent;
private Transform _maxEvenButtonParent;
private int _maxAllButtonSiblingIndex;
private int _maxEvenButtonSiblingIndex;
public EventBasedTable armTroopsTable;
public TMP_Text totalCostText;
@@ -71,9 +34,6 @@ namespace eagle {
private ArmTroopsAvailableCommand ArmTroopsAvailableCommand =>
_availableCommand.ArmTroopsCommand;
private ProvinceId ActingProvinceId => ArmTroopsAvailableCommand.ActingProvinceId;
private bool UseTouchActionStrip =>
IsNarrowLayout && GameInput.HasTouchscreen() &&
(!GameInput.HasMousePointer() || GameInput.HasSimulatedTouchscreen());
private struct MaxAttainableEverywhereBattalions {
public int Armament;
@@ -147,14 +107,6 @@ namespace eagle {
}
protected override void SetUpUI() {
EnsureTouchActionStrip();
if (armTroopsTable.RowClickedHandler == null) {
armTroopsTable.RowClickedHandler = new EventBasedTable.RowClickedEvent();
}
armTroopsTable.WireRuntimeRowClickHandlers = true;
armTroopsTable.RowClickedHandler.RemoveListener(RowClicked);
armTroopsTable.RowClickedHandler.AddListener(RowClicked);
var province = _model.Provinces[ActingProvinceId];
_battalions =
ArmTroopsAvailableCommand.AvailableBattalions
@@ -182,13 +134,11 @@ namespace eagle {
maxLabel.text = _maxArmament.ToString();
availableText.text = _availableGold.ToString();
ApplyInputModeLayout();
UpdateTableAndCost();
}
public override void OnLayoutModeChanged() {
if (_battalions == null) return;
ApplyInputModeLayout();
UpdateTableAndCost();
}
@@ -212,12 +162,8 @@ namespace eagle {
row.MinusButtonClickedCallback = () => MinusClicked(index);
row.ResetButtonClickedCallback = () => ResetClicked(index);
row.MaxButtonClickedCallback = () => MaxClicked(index);
row.RowClickedCallback = () => RowClicked(index);
row.SetActionButtonsVisible(!UseTouchActionStrip);
row.SetNameVisible(!UseTouchActionStrip);
row.SetContentRaycastTargets(!UseTouchActionStrip);
row.Selectable = true;
row.Selected = UseTouchActionStrip && _selectedBattalionIndex == index;
row.Selected = false;
SetValuesAndButtons(index);
}
@@ -237,7 +183,6 @@ namespace eagle {
row.AllowReset = battalion.Armament != newArmament;
UpdateCost();
UpdateTouchActionStrip();
}
private void UpdateCost() {
@@ -258,28 +203,11 @@ namespace eagle {
}
private void UpdateTableAndCost() {
if (UseTouchActionStrip && _battalions.Count > 0) {
if (_selectedBattalionIndex == null || _selectedBattalionIndex < 0 ||
_selectedBattalionIndex >= _battalions.Count) {
_selectedBattalionIndex = 0;
}
} else {
_selectedBattalionIndex = null;
}
armTroopsTable.RowCount = _battalions.Count;
for (int i = 0; i < _battalions.Count; i++) { PopulateRow(i); }
armTroopsTable.RefreshRowEventHandlers();
UpdateCost();
UpdateTouchActionStrip();
}
public void RowClicked(int index) {
if (!UseTouchActionStrip) return;
SelectBattalion(index);
}
public void PlusClicked(int index) {
@@ -353,378 +281,5 @@ namespace eagle {
}
private int Cost() { return Cost(_newArmaments); }
private void SelectBattalion(int index) {
_selectedBattalionIndex = index;
for (int i = 0; i < _battalions.Count; i++) {
armTroopsTable.ComponentAt<ArmTroopsRowController>(i).Selected = i == index;
}
UpdateTouchActionStrip();
}
private bool TrySelectedBattalionIndex(out int index) {
index = _selectedBattalionIndex ?? -1;
return UseTouchActionStrip && index >= 0 && index < _battalions.Count;
}
private void UpdateTouchActionStrip() {
if (_touchActionStrip == null) return;
if (!TrySelectedBattalionIndex(out int index)) {
_touchActionStrip.SetActive(false);
return;
}
var battalion = _battalions[index];
var originalArmament = (int)(battalion.Armament ?? 0);
var newArmament = _newArmaments[index];
_touchActionStrip.SetActive(true);
_touchActionStripLabel.text = battalion.Name;
UpdateTouchActionButtonIcons();
_touchPlusButton.interactable = newArmament < _maxArmament;
_touchMinusButton.interactable = originalArmament < newArmament;
_touchResetButton.interactable = originalArmament != newArmament;
_touchMaxButton.interactable = newArmament < _maxArmament;
}
private void EnsureTouchActionStrip() {
if (_touchActionStrip != null) return;
_touchActionStrip = new GameObject(
"Touch Action Strip",
typeof(RectTransform),
typeof(LayoutElement),
typeof(Image),
typeof(VerticalLayoutGroup));
_touchActionStrip.transform.SetParent(transform, false);
_touchActionStripParent = transform;
_touchActionStripSiblingIndex = _touchActionStrip.transform.GetSiblingIndex();
var rectTransform = _touchActionStrip.GetComponent<RectTransform>();
rectTransform.anchorMin = new Vector2(0.5f, 0.5f);
rectTransform.anchorMax = new Vector2(0.5f, 0.5f);
rectTransform.pivot = new Vector2(0.5f, 0.5f);
rectTransform.anchoredPosition = new Vector2(55f, -16f);
rectTransform.sizeDelta = new Vector2(176f, 186f);
var stripLayoutElement = _touchActionStrip.GetComponent<LayoutElement>();
stripLayoutElement.minWidth = 176f;
stripLayoutElement.preferredWidth = 176f;
stripLayoutElement.minHeight = 202f;
stripLayoutElement.preferredHeight = 202f;
stripLayoutElement.flexibleWidth = -1f;
stripLayoutElement.flexibleHeight = 1f;
var background = _touchActionStrip.GetComponent<Image>();
background.color = Color.clear;
var layout = _touchActionStrip.GetComponent<VerticalLayoutGroup>();
layout.padding = new RectOffset(0, 0, 0, 0);
layout.spacing = 6f;
layout.childAlignment = TextAnchor.UpperCenter;
layout.childControlWidth = true;
layout.childControlHeight = true;
layout.childForceExpandWidth = false;
layout.childForceExpandHeight = false;
_touchActionStripLabel = CreateActionStripLabel();
_touchActionButtonGrid = CreateActionButtonGrid();
_touchMinusButton = CreateActionStripButton("Minus Button", out _touchMinusIcon, () => {
if (TrySelectedBattalionIndex(out int index)) { MinusClicked(index); }
});
_touchPlusButton = CreateActionStripButton("Plus Button", out _touchPlusIcon, () => {
if (TrySelectedBattalionIndex(out int index)) { PlusClicked(index); }
});
_touchResetButton = CreateActionStripButton("Reset Button", out _touchResetIcon, () => {
if (TrySelectedBattalionIndex(out int index)) { ResetClicked(index); }
});
_touchMaxButton = CreateActionStripButton("Max Button", out _touchMaxIcon, () => {
if (TrySelectedBattalionIndex(out int index)) { MaxClicked(index); }
});
_touchActionStrip.SetActive(false);
EnsureAllBattalionsHeader();
}
private void ApplyInputModeLayout() {
var tableRectTransform = armTroopsTable.GetComponent<RectTransform>();
if (!_capturedTableLayout) {
_tableAnchoredPosition = tableRectTransform.anchoredPosition;
_tableSizeDelta = tableRectTransform.sizeDelta;
_tableLayoutElement = armTroopsTable.GetComponent<LayoutElement>();
_tableMinWidth = _tableLayoutElement.minWidth;
_tablePreferredWidth = _tableLayoutElement.preferredWidth;
_tableFlexibleWidth = _tableLayoutElement.flexibleWidth;
_mainContentLayout =
tableRectTransform.parent.GetComponent<HorizontalLayoutGroup>();
_mainContentSpacing = _mainContentLayout.spacing;
_allBattalionsControlsRectTransform =
maxEvenButton.transform.parent.GetComponent<RectTransform>();
_allBattalionsControlsAnchoredPosition =
_allBattalionsControlsRectTransform.anchoredPosition;
_allBattalionsControlsSizeDelta = _allBattalionsControlsRectTransform.sizeDelta;
_capturedTableLayout = true;
}
CaptureAllBattalionsLayout();
EnsureAllBattalionsHeader();
EnsureAllBattalionsMaxButtonRow();
if (UseTouchActionStrip) {
var touchTableWidth = 270f;
_mainContentLayout.spacing = _mainContentSpacing;
_tableLayoutElement.minWidth = touchTableWidth;
_tableLayoutElement.preferredWidth = touchTableWidth;
_tableLayoutElement.flexibleWidth = -1f;
tableRectTransform.anchoredPosition = _tableAnchoredPosition;
tableRectTransform.sizeDelta = _tableSizeDelta;
_allBattalionsControlsRectTransform.anchoredPosition =
_allBattalionsControlsAnchoredPosition;
_allBattalionsControlsRectTransform.sizeDelta = new Vector2(190f, 202f);
_allBattalionsControlsLayout.childAlignment = TextAnchor.UpperCenter;
_touchActionStrip.transform.SetParent(tableRectTransform.parent, false);
_touchActionStrip.transform.SetSiblingIndex(
tableRectTransform.GetSiblingIndex() + 1);
var touchActionStripRectTransform = _touchActionStrip.GetComponent<RectTransform>();
touchActionStripRectTransform.anchoredPosition = Vector2.zero;
touchActionStripRectTransform.sizeDelta = new Vector2(176f, 202f);
_allBattalionsHeader.transform.SetParent(
_allBattalionsControlsRectTransform,
false);
_allBattalionsHeader.transform.SetSiblingIndex(0);
_allBattalionsMaxButtonRow.transform.SetParent(
_allBattalionsControlsRectTransform,
false);
_allBattalionsMaxButtonRow.transform.SetSiblingIndex(1);
_maxAllButtonRectTransform.SetParent(_allBattalionsMaxButtonRow.transform, false);
_maxAllButtonRectTransform.SetSiblingIndex(0);
_maxEvenButtonRectTransform.SetParent(_allBattalionsMaxButtonRow.transform, false);
_maxEvenButtonRectTransform.SetSiblingIndex(1);
_allBattalionsHeader.SetActive(true);
_allBattalionsMaxButtonRow.SetActive(true);
} else {
_mainContentLayout.spacing = 18f;
_tableLayoutElement.minWidth = _tableMinWidth;
_tableLayoutElement.preferredWidth = _tablePreferredWidth;
_tableLayoutElement.flexibleWidth = _tableFlexibleWidth;
tableRectTransform.anchoredPosition = _tableAnchoredPosition;
tableRectTransform.sizeDelta = _tableSizeDelta;
_touchActionStrip.transform.SetParent(_touchActionStripParent, false);
_touchActionStrip.transform.SetSiblingIndex(_touchActionStripSiblingIndex);
_allBattalionsControlsRectTransform.anchoredPosition =
_allBattalionsControlsAnchoredPosition;
_allBattalionsControlsRectTransform.sizeDelta = _allBattalionsControlsSizeDelta;
_allBattalionsControlsLayout.childAlignment = _allBattalionsControlsAlignment;
RestoreAllBattalionsMaxButtons();
if (_allBattalionsHeader != null) { _allBattalionsHeader.SetActive(false); }
if (_allBattalionsMaxButtonRow != null) {
_allBattalionsMaxButtonRow.SetActive(false);
}
}
}
private void CaptureAllBattalionsLayout() {
if (_capturedAllBattalionsLayout) return;
_allBattalionsControlsLayout =
_allBattalionsControlsRectTransform.GetComponent<VerticalLayoutGroup>();
_allBattalionsControlsAlignment = _allBattalionsControlsLayout.childAlignment;
_maxAllButtonRectTransform =
_allBattalionsControlsRectTransform.GetChild(0).GetComponent<RectTransform>();
_maxEvenButtonRectTransform = maxEvenButton.GetComponent<RectTransform>();
_maxAllButtonParent = _maxAllButtonRectTransform.parent;
_maxEvenButtonParent = _maxEvenButtonRectTransform.parent;
_maxAllButtonSiblingIndex = _maxAllButtonRectTransform.GetSiblingIndex();
_maxEvenButtonSiblingIndex = _maxEvenButtonRectTransform.GetSiblingIndex();
_capturedAllBattalionsLayout = true;
}
private void RestoreAllBattalionsMaxButtons() {
_maxAllButtonRectTransform.SetParent(_maxAllButtonParent, false);
_maxAllButtonRectTransform.SetSiblingIndex(_maxAllButtonSiblingIndex);
_maxEvenButtonRectTransform.SetParent(_maxEvenButtonParent, false);
_maxEvenButtonRectTransform.SetSiblingIndex(_maxEvenButtonSiblingIndex);
}
private TMP_Text CreateActionStripLabel() {
var label = new GameObject(
"Selected Battalion Label",
typeof(RectTransform),
typeof(LayoutElement),
typeof(TextMeshProUGUI));
label.transform.SetParent(_touchActionStrip.transform, false);
var layoutElement = label.GetComponent<LayoutElement>();
layoutElement.minWidth = 176f;
layoutElement.preferredWidth = 176f;
layoutElement.minHeight = 56f;
layoutElement.preferredHeight = 56f;
var text = label.GetComponent<TextMeshProUGUI>();
text.alignment = TextAlignmentOptions.Top;
text.color = Color.black;
text.font = maxLabel.font;
text.fontSize = 16f;
text.textWrappingMode = TextWrappingModes.Normal;
text.overflowMode = TextOverflowModes.Ellipsis;
return text;
}
private Transform CreateActionButtonGrid() {
var gridObject = new GameObject(
"Action Button Grid",
typeof(RectTransform),
typeof(LayoutElement),
typeof(GridLayoutGroup));
gridObject.transform.SetParent(_touchActionStrip.transform, false);
var layoutElement = gridObject.GetComponent<LayoutElement>();
layoutElement.minWidth = 108f;
layoutElement.preferredWidth = 108f;
layoutElement.minHeight = 108f;
layoutElement.preferredHeight = 108f;
var grid = gridObject.GetComponent<GridLayoutGroup>();
grid.cellSize = new Vector2(48f, 48f);
grid.spacing = new Vector2(6f, 6f);
grid.constraint = GridLayoutGroup.Constraint.FixedColumnCount;
grid.constraintCount = 2;
grid.childAlignment = TextAnchor.MiddleCenter;
return gridObject.transform;
}
private Button CreateActionStripButton(
string name,
out Image icon,
UnityEngine.Events.UnityAction action) {
var buttonObject = new GameObject(
name,
typeof(RectTransform),
typeof(LayoutElement),
typeof(Image),
typeof(Button));
buttonObject.transform.SetParent(_touchActionButtonGrid, false);
var layoutElement = buttonObject.GetComponent<LayoutElement>();
layoutElement.minWidth = 48f;
layoutElement.preferredWidth = 48f;
layoutElement.minHeight = 48f;
layoutElement.preferredHeight = 48f;
var image = buttonObject.GetComponent<Image>();
image.color = new Color(0.94f, 0.94f, 0.96f, 1f);
CopyButtonBackground(maxEvenButton, image);
var button = buttonObject.GetComponent<Button>();
button.targetGraphic = image;
button.onClick.AddListener(action);
var iconObject = new GameObject("Icon", typeof(RectTransform), typeof(Image));
iconObject.transform.SetParent(buttonObject.transform, false);
var iconRectTransform = iconObject.GetComponent<RectTransform>();
iconRectTransform.anchorMin = new Vector2(0.5f, 0.5f);
iconRectTransform.anchorMax = new Vector2(0.5f, 0.5f);
iconRectTransform.anchoredPosition = Vector2.zero;
iconRectTransform.sizeDelta = new Vector2(34f, 34f);
icon = iconObject.GetComponent<Image>();
icon.color = Color.black;
icon.preserveAspect = true;
return button;
}
private void UpdateTouchActionButtonIcons() {
if (_battalions == null || _battalions.Count == 0) return;
var row = armTroopsTable.ComponentAt<ArmTroopsRowController>(0);
_touchMinusIcon.sprite = ButtonIconSprite(row.minusButton);
_touchPlusIcon.sprite = ButtonIconSprite(row.plusButton);
_touchResetIcon.sprite = ButtonIconSprite(row.resetButton);
_touchMaxIcon.sprite = ButtonIconSprite(row.maxButton);
}
private Sprite ButtonIconSprite(Button button) {
foreach (var image in button.GetComponentsInChildren<Image>(includeInactive: true)) {
if (image.gameObject != button.gameObject && image.sprite != null) {
return image.sprite;
}
}
return null;
}
private void CopyButtonBackground(Button sourceButton, Image targetImage) {
var sourceImage = sourceButton.targetGraphic as Image;
if (sourceImage == null) return;
targetImage.sprite = sourceImage.sprite;
targetImage.type = sourceImage.type;
targetImage.pixelsPerUnitMultiplier = sourceImage.pixelsPerUnitMultiplier;
}
private void EnsureAllBattalionsMaxButtonRow() {
if (_allBattalionsMaxButtonRow != null) return;
_allBattalionsMaxButtonRow = new GameObject(
"All Battalions Max Button Row",
typeof(RectTransform),
typeof(LayoutElement),
typeof(HorizontalLayoutGroup));
_allBattalionsMaxButtonRow.transform.SetParent(
_allBattalionsControlsRectTransform,
false);
var layoutElement = _allBattalionsMaxButtonRow.GetComponent<LayoutElement>();
layoutElement.minWidth = 190f;
layoutElement.preferredWidth = 190f;
layoutElement.minHeight = 60f;
layoutElement.preferredHeight = 60f;
var layout = _allBattalionsMaxButtonRow.GetComponent<HorizontalLayoutGroup>();
layout.padding = new RectOffset(0, 0, 0, 0);
layout.spacing = 8f;
layout.childAlignment = TextAnchor.MiddleCenter;
layout.childControlWidth = true;
layout.childControlHeight = true;
layout.childForceExpandWidth = false;
layout.childForceExpandHeight = false;
_allBattalionsMaxButtonRow.SetActive(false);
}
private void EnsureAllBattalionsHeader() {
if (_allBattalionsHeader != null) return;
_allBattalionsHeader = new GameObject(
"All Battalions Header",
typeof(RectTransform),
typeof(LayoutElement),
typeof(TextMeshProUGUI));
_allBattalionsHeader.transform.SetParent(transform, false);
var layoutElement = _allBattalionsHeader.GetComponent<LayoutElement>();
layoutElement.minWidth = 190f;
layoutElement.preferredWidth = 190f;
layoutElement.minHeight = 56f;
layoutElement.preferredHeight = 56f;
var text = _allBattalionsHeader.GetComponent<TextMeshProUGUI>();
text.text = "All Battalions";
text.alignment = TextAlignmentOptions.Top;
text.color = Color.black;
text.font = maxLabel.font;
text.fontSize = 16f;
text.textWrappingMode = TextWrappingModes.NoWrap;
_allBattalionsHeader.SetActive(false);
}
}
}
@@ -196,6 +196,30 @@ namespace eagle {
foodLabel.text = ((int)newValue).ToString();
}
public void GoldMinusClicked() {
goldSlider.value =
Math.Max(goldSlider.minValue, goldSlider.value - KeyModifiedAmount.Amount());
GoldSliderChanged(goldSlider.value);
}
public void GoldPlusClicked() {
goldSlider.value =
Math.Min(goldSlider.maxValue, goldSlider.value + KeyModifiedAmount.Amount());
GoldSliderChanged(goldSlider.value);
}
public void FoodMinusClicked() {
foodSlider.value =
Math.Max(foodSlider.minValue, foodSlider.value - KeyModifiedAmount.Amount());
FoodSliderChanged(foodSlider.value);
}
public void FoodPlusClicked() {
foodSlider.value =
Math.Min(foodSlider.maxValue, foodSlider.value + KeyModifiedAmount.Amount());
FoodSliderChanged(foodSlider.value);
}
private void EnableSliders(bool newEnabled) { tributeContainer.SetActive(newEnabled); }
public void ToggleChanged(bool value) {
@@ -111,8 +111,8 @@ namespace eagle {
_model = model;
_availableCommand = ac;
SetUpUI();
// Note: Command tutorials are now shown via info button instead of automatic popups.
// See CommandPanelController.InfoButtonClicked() for the new flow.
// Note: Command tutorials are now opened explicitly instead of automatic popups.
// See CommandPanelController.ShowCurrentCommandHelp() for the help-panel flow.
}
}
}
@@ -18,15 +18,15 @@ namespace eagle {
public Slider goldSlider;
public TMP_Text goldGivenLabel;
private List<ProvinceId> availableProvinceIds = new List<ProvinceId>();
private HeroGiftAvailableCommand HeroGiftCommand => _availableCommand.HeroGiftCommand;
private ProvinceId ActingProvinceId => HeroGiftCommand.ActingProvinceId;
private ProvinceId? FilterProvince =>
provinceDropdown.value == 0 ? null
: (ProvinceId?)HeroGiftCommand.EligibleGifts
.GroupBy(eg => eg.RecipientProvinceId)
.ToList()[provinceDropdown.value - 1]
.Key;
provinceDropdown.value == 0
? null
: (ProvinceId?)availableProvinceIds[provinceDropdown.value - 1];
private List<EligibleGift> FilteredEligibleGifts =>
FilterProvince == null
@@ -70,10 +70,7 @@ namespace eagle {
set {
var newIndex = 0;
if (value is ProvinceId pid) {
var index = HeroGiftCommand.EligibleGifts.GroupBy(eg => eg.RecipientProvinceId)
.Select(x => x.Key)
.ToList()
.IndexOf(pid);
var index = availableProvinceIds.IndexOf(pid);
if (index != -1) newIndex = index + 1;
}
@@ -93,16 +90,16 @@ namespace eagle {
protected override void SetUpUI() {
provinceDropdown.ClearOptions();
var availableProvinces =
availableProvinceIds =
HeroGiftCommand.EligibleGifts.GroupBy(eg => eg.RecipientProvinceId)
.Select(x => x.Key)
.ToList();
var optionsList = new List<string> { "All" };
optionsList.AddRange(availableProvinces.Select(pid => _model.Provinces[pid].Name));
optionsList.AddRange(availableProvinceIds.Select(pid => _model.Provinces[pid].Name));
provinceDropdown.AddOptions(optionsList);
provinceDropdown.value = 0;
provinceDropdown.interactable = availableProvinces.Count() > 1;
provinceDropdown.value = availableProvinceIds.Count == 1 ? 1 : 0;
provinceDropdown.interactable = availableProvinceIds.Count > 1;
SetUpHeroDropdown();
goldGivenLabel.text = "0";
goldSlider.value = 0;
@@ -123,17 +123,7 @@ namespace eagle {
"",
"",
i,
(index, text) => {
if (index < scrollContent.transform.childCount) {
var rowTransform = scrollContent.transform.GetChild(index);
var rowTextComponents =
rowTransform
.GetComponentsInChildren<TextMeshProUGUI>();
if (rowTextComponents.Length > 2) {
rowTextComponents[2].text = text;
}
}
});
(_, text) => rulingHeroTextComponent.text = text);
rulingHeroListeners.Add(listener);
ClientTextProvider.Provider.AddListener(listener);
@@ -68,7 +68,7 @@ namespace eagle {
public SelectorLayoutModeSupport layoutModeSupport = SelectorLayoutModeSupport.All;
private MarchNarrowStep _narrowStep = MarchNarrowStep.RouteSupplies;
private bool _recommendedButtonAvailable;
private bool _recommendedConfigAvailable;
private bool UsesNarrowTabs => layoutModeSupport == SelectorLayoutModeSupport.Narrow;
private PlayerId _playerId;
@@ -305,17 +305,14 @@ namespace eagle {
orderedBattalions,
dict,
recommendedUnits);
_recommendedButtonAvailable =
unitSelector.recommendedConfigButton.gameObject.activeSelf;
if (!IsNarrowLayout) {
unitSelector.recommendedConfigButton.gameObject.SetActive(
_recommendedButtonAvailable);
}
_recommendedConfigAvailable = recommendedUnits.Count > 0;
UpdateRecommendedButtonState();
unitSelector.selectionChanged.RemoveListener(UpdateNarrowTabVisuals);
unitSelector.selectionChanged.AddListener(UpdateNarrowTabVisuals);
}
public void RecommendedButtonClicked() {
if (!_recommendedConfigAvailable) return;
foodSlider.value = _recommendedFood;
goldSlider.value = _recommendedGold;
}
@@ -362,8 +359,7 @@ namespace eagle {
wideBattalionsColumn.SetActive(true);
heroesColumn.SetActive(true);
battalionsColumn.SetActive(true);
unitSelector.recommendedConfigButton.gameObject.SetActive(
_recommendedButtonAvailable);
UpdateRecommendedButtonState();
SetFlexibleColumn(routeAndSuppliesColumn, 250, 300, 0);
SetFlexibleColumn(selectedUnitsColumn, -1, -1, 1);
return;
@@ -444,7 +440,7 @@ namespace eagle {
routeAndSuppliesColumn.SetActive(routeStep);
NarrowUnitsTab.SetActive(unitsStep);
unitSelector.recommendedConfigButton.gameObject.SetActive(_recommendedButtonAvailable);
UpdateRecommendedButtonState();
if (routeStep) { EnsureNarrowRouteTouchTargets(); }
if (unitsStep) {
@@ -453,6 +449,11 @@ namespace eagle {
UpdateNarrowTabVisuals();
}
private void UpdateRecommendedButtonState() {
unitSelector.recommendedConfigButton.gameObject.SetActive(true);
unitSelector.recommendedConfigButton.interactable = _recommendedConfigAvailable;
}
private GameObject NarrowUnitsTab => selectedUnitsColumn.transform.parent.gameObject;
private void EnsureNarrowRouteTouchTargets() {
@@ -116,7 +116,8 @@ namespace eagle {
SelectedIds.Clear();
var hasRecommendedConfig = RecommendedUnits.Count > 0;
recommendedConfigButton.gameObject.SetActive(hasRecommendedConfig);
recommendedConfigButton.gameObject.SetActive(true);
recommendedConfigButton.interactable = hasRecommendedConfig;
SetUpTables();
}
@@ -1,11 +1,55 @@
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
namespace eagle {
using ProvinceId = Int32;
public class CommandWarningPanelController : PopupPanelController {
private static readonly Color InfoBackgroundColor = new(0.78f, 0.80f, 0.82f, 0.98f);
private RectTransform _rectTransform;
private Image _background;
private Vector2 _defaultAnchorMin;
private Vector2 _defaultAnchorMax;
private Vector2 _defaultAnchoredPosition;
private Vector2 _defaultPivot;
private Vector2 _defaultSizeDelta;
private Color _defaultBackgroundColor;
public override bool BlocksInteraction => false;
private void Awake() { InitializeCachedFields(); }
private void InitializeCachedFields() {
if (_rectTransform != null) return;
_rectTransform = (RectTransform)transform;
_background = GetComponent<Image>();
_defaultAnchorMin = _rectTransform.anchorMin;
_defaultAnchorMax = _rectTransform.anchorMax;
_defaultAnchoredPosition = _rectTransform.anchoredPosition;
_defaultPivot = _rectTransform.pivot;
_defaultSizeDelta = _rectTransform.sizeDelta;
_defaultBackgroundColor = _background.color;
}
public void SetWarning(string title, string text) {
InitializeCachedFields();
RestoreDefaultPlacement();
PopupInfos = new List<PopupInfo> { new PopupInfo {
titleText = title,
mainText = text,
affectedProvinceIds = new List<ProvinceId>()
} };
SetUpPanel();
}
public void SetInfo(string title, string text, RectTransform placementTarget) {
InitializeCachedFields();
PlaceInfoCard(placementTarget, title, text);
_background.color = InfoBackgroundColor;
PopupInfos = new List<PopupInfo> { new PopupInfo {
titleText = title,
mainText = text,
@@ -20,5 +64,63 @@ namespace eagle {
SetUpPanel();
}
}
private void RestoreDefaultPlacement() {
InitializeCachedFields();
_rectTransform.anchorMin = _defaultAnchorMin;
_rectTransform.anchorMax = _defaultAnchorMax;
_rectTransform.anchoredPosition = _defaultAnchoredPosition;
_rectTransform.pivot = _defaultPivot;
_rectTransform.sizeDelta = _defaultSizeDelta;
_background.color = _defaultBackgroundColor;
}
private void PlaceInfoCard(RectTransform target, string titleText, string bodyText) {
InitializeCachedFields();
var parent = _rectTransform.parent as RectTransform;
Vector3[] corners = new Vector3[4];
target.GetWorldCorners(corners);
var targetCanvas = target.GetComponentInParent<Canvas>();
var targetCamera = targetCanvas.renderMode == RenderMode.ScreenSpaceOverlay
? null
: targetCanvas.worldCamera;
var parentCanvas = parent.GetComponentInParent<Canvas>();
var parentCamera = parentCanvas.renderMode == RenderMode.ScreenSpaceOverlay
? null
: parentCanvas.worldCamera;
var bottomLeftScreen =
RectTransformUtility.WorldToScreenPoint(targetCamera, corners[0]);
var topRightScreen = RectTransformUtility.WorldToScreenPoint(targetCamera, corners[2]);
RectTransformUtility.ScreenPointToLocalPointInRectangle(
parent,
bottomLeftScreen,
parentCamera,
out var bottomLeft);
RectTransformUtility.ScreenPointToLocalPointInRectangle(
parent,
topRightScreen,
parentCamera,
out var topRight);
var size = topRight - bottomLeft;
var width = Mathf.Min(size.x - 32f, 760f);
var titleHeight = title.GetPreferredValues(titleText, width, 0f).y;
var bodyHeight = textField.GetPreferredValues(bodyText, width - 36f, 0f).y;
var maxHeight = Mathf.Max(160f, Mathf.Min(size.y * 0.55f, 240f));
var height = Mathf.Clamp(titleHeight + bodyHeight + 44f, 160f, maxHeight);
var margin = 18f;
_rectTransform.anchorMin = new Vector2(0.5f, 0.5f);
_rectTransform.anchorMax = new Vector2(0.5f, 0.5f);
_rectTransform.pivot = new Vector2(0.5f, 0.5f);
_rectTransform.anchoredPosition =
new Vector2(bottomLeft.x + size.x / 2f, topRight.y + margin + height / 2f);
_rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, width);
_rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, height);
}
}
}
}
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 08f5d02255174c55b813203bf0af83cc
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 20fa860b10b34542bb1b912b5fc83f9a
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 95e2b408503a4cc8a9bb86d78cb1965a
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -59,9 +59,6 @@ namespace eagle {
[Header("Layout Spacers")]
public GameObject wideSpacer;
public LayoutElement heroesAndBattalionsLayoutElement;
public LayoutElement popupCanvasLeftSpacer;
public LayoutElement popupCanvasRightSpacer;
[Header("Clicked Province Panel")]
public GameObject clickedProvincePanel;
@@ -187,15 +184,6 @@ namespace eagle {
dominionPanelControllerNarrow.gameObject.SetActive(false);
if (wideSpacer != null) wideSpacer.SetActive(true);
// Match HeroesAndBattalions width to Popup Canvas spacers
if (heroesAndBattalionsLayoutElement != null && popupCanvasLeftSpacer != null &&
popupCanvasRightSpacer != null) {
var width = popupCanvasLeftSpacer.preferredWidth +
popupCanvasRightSpacer.preferredWidth;
heroesAndBattalionsLayoutElement.preferredWidth = width;
SetPopupColumnSpacerWidth(width);
}
provinceInfoPanelController.WideScreen = true;
} else {
// Show narrow layout containers, hide wide layout containers
@@ -205,13 +193,6 @@ namespace eagle {
// Narrow dominion panel visibility controlled by user toggle, don't change here
if (wideSpacer != null) wideSpacer.SetActive(false);
// Match HeroesAndBattalions width to left spacer only
if (heroesAndBattalionsLayoutElement != null && popupCanvasLeftSpacer != null) {
var width = popupCanvasLeftSpacer.preferredWidth;
heroesAndBattalionsLayoutElement.preferredWidth = width;
SetPopupColumnSpacerWidth(width);
}
provinceInfoPanelController.WideScreen = false;
}
@@ -221,14 +202,6 @@ namespace eagle {
underClickedProvincePanel.SetActive(IsNarrowScreen);
}
private void SetPopupColumnSpacerWidth(float width) {
var spacer = heroesAndBattalionsPanelController?.popupColumnSpacer;
if (spacer == null) return;
spacer.preferredWidth = width;
spacer.minWidth = width;
spacer.flexibleWidth = 0;
}
public void StopAll() {
_newModel = null;
if (ModelUpdater != null) {
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 7c4a3d4c82fcc4ea99f89afc50397fb1
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 95c6956ab496b400abfa20e57158362a
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -11,6 +11,7 @@ GameObject:
- component: {fileID: 6993301234712457781}
- component: {fileID: 8561537581077853438}
- component: {fileID: 2583823285591727170}
- component: {fileID: 976117207394964339}
m_Layer: 0
m_Name: Headshot
m_TagString: Untagged
@@ -31,12 +32,11 @@ RectTransform:
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 6176764422977772731}
m_RootOrder: 4
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: -94}
m_SizeDelta: {x: 125, y: 125}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &8561537581077853438
CanvasRenderer:
@@ -56,8 +56,8 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
@@ -73,6 +73,126 @@ MonoBehaviour:
y: 0
width: 1
height: 1
--- !u!114 &976117207394964339
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1665200140771224366}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.LayoutElement
m_IgnoreLayout: 0
m_MinWidth: 125
m_MinHeight: 125
m_PreferredWidth: 125
m_PreferredHeight: 125
m_FlexibleWidth: -1
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!1 &5555661528506628849
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8655783301447689420}
- component: {fileID: 5259921443769458350}
- component: {fileID: 5375006739092399994}
- component: {fileID: 520784488369365440}
m_Layer: 0
m_Name: Dropdown
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &8655783301447689420
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5555661528506628849}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 6176764422572337598}
- {fileID: 6176764421848850766}
- {fileID: 6176764421710205223}
- {fileID: 6176764421851344161}
m_Father: {fileID: 6176764422977772731}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &5259921443769458350
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5555661528506628849}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.LayoutElement
m_IgnoreLayout: 0
m_MinWidth: -1
m_MinHeight: 48
m_PreferredWidth: -1
m_PreferredHeight: 48
m_FlexibleWidth: 1
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!222 &5375006739092399994
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5555661528506628849}
m_CullTransparentMesh: 1
--- !u!114 &520784488369365440
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5555661528506628849}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &6176764421710205222
GameObject:
m_ObjectHideFlags: 0
@@ -98,13 +218,12 @@ RectTransform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6176764421710205222}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 6176764422977772731}
m_RootOrder: 2
m_Father: {fileID: 8655783301447689420}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0.5}
m_AnchorMax: {x: 1, y: 0.5}
@@ -129,8 +248,8 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
@@ -174,18 +293,17 @@ RectTransform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6176764421848850765}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 6176764422977772731}
m_RootOrder: 1
m_Father: {fileID: 8655783301447689420}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 12.5, y: -0.5}
m_SizeDelta: {x: -75, y: -13}
m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 1, y: 0.5}
m_AnchoredPosition: {x: 8, y: 0}
m_SizeDelta: {x: -66, y: 30}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &6176764421848850760
CanvasRenderer:
@@ -205,8 +323,8 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
@@ -254,20 +372,23 @@ MonoBehaviour:
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 1
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
@@ -311,19 +432,18 @@ RectTransform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6176764421851344160}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 6176764422246408519}
- {fileID: 6176764423597331357}
m_Father: {fileID: 6176764422977772731}
m_RootOrder: 3
m_Father: {fileID: 8655783301447689420}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 0}
m_AnchoredPosition: {x: 0, y: 2}
m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 1, y: 0.5}
m_AnchoredPosition: {x: 0, y: 24}
m_SizeDelta: {x: 0, y: 150}
m_Pivot: {x: 0.5, y: 1}
--- !u!222 &6176764421851344172
@@ -344,8 +464,8 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
@@ -374,8 +494,8 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Name:
m_EditorClassIdentifier:
m_Content: {fileID: 6176764423449496427}
m_Horizontal: 0
m_Vertical: 1
@@ -405,6 +525,7 @@ GameObject:
- component: {fileID: 6176764421927073093}
- component: {fileID: 6176764421927073095}
- component: {fileID: 6176764421927073094}
- component: {fileID: 7220579833510473385}
m_Layer: 0
m_Name: Item Label
m_TagString: Untagged
@@ -419,18 +540,17 @@ RectTransform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6176764421927073092}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 6176764423105613647}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 20, y: -0.5}
m_SizeDelta: {x: -60, y: -3}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 265, y: -20}
m_SizeDelta: {x: 436, y: 40}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &6176764421927073095
CanvasRenderer:
@@ -450,8 +570,8 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
@@ -462,14 +582,15 @@ MonoBehaviour:
m_Calls: []
m_text: Option A
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: ec2736df0379a45bfa7349b652fd07d6, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontAsset: {fileID: 11400000, guid: 370883a030e9f4b37b4e711cebf8518b, type: 2}
m_sharedMaterial: {fileID: 479170051110541622, guid: 370883a030e9f4b37b4e711cebf8518b,
type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4294967295
rgba: 4281479730
m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
@@ -482,7 +603,7 @@ MonoBehaviour:
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: 0
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
@@ -495,23 +616,26 @@ MonoBehaviour:
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 1
m_VerticalAlignment: 256
m_textAlignment: 513
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 1
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
@@ -526,9 +650,29 @@ MonoBehaviour:
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 1
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!114 &7220579833510473385
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6176764421927073092}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.LayoutElement
m_IgnoreLayout: 0
m_MinWidth: -1
m_MinHeight: -1
m_PreferredWidth: -1
m_PreferredHeight: -1
m_FlexibleWidth: 1
m_FlexibleHeight: 1
m_LayoutPriority: 1
--- !u!1 &6176764422246408518
GameObject:
m_ObjectHideFlags: 0
@@ -562,12 +706,11 @@ RectTransform:
m_Children:
- {fileID: 6176764423449496427}
m_Father: {fileID: 6176764421851344161}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: -18, y: 0}
m_SizeDelta: {x: -17, y: 0}
m_Pivot: {x: 0, y: 1}
--- !u!114 &6176764422246408514
MonoBehaviour:
@@ -579,8 +722,8 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Name:
m_EditorClassIdentifier:
m_ShowMaskGraphic: 0
--- !u!222 &6176764422246408513
CanvasRenderer:
@@ -600,8 +743,8 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
@@ -631,6 +774,7 @@ GameObject:
- component: {fileID: 6176764422342584650}
- component: {fileID: 6176764422342584692}
- component: {fileID: 6176764422342584651}
- component: {fileID: 6715854969616124018}
m_Layer: 0
m_Name: Item Background
m_TagString: Untagged
@@ -651,11 +795,10 @@ RectTransform:
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 6176764423105613647}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 0, y: 0.5}
m_AnchoredPosition: {x: 25, y: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 31, y: -20}
m_SizeDelta: {x: 32, y: 32}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &6176764422342584692
@@ -676,8 +819,8 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_RaycastTarget: 1
@@ -696,6 +839,26 @@ MonoBehaviour:
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!114 &6715854969616124018
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6176764422342584649}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.LayoutElement
m_IgnoreLayout: 0
m_MinWidth: 32
m_MinHeight: 32
m_PreferredWidth: 32
m_PreferredHeight: 32
m_FlexibleWidth: -1
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!1 &6176764422572337597
GameObject:
m_ObjectHideFlags: 0
@@ -726,12 +889,11 @@ RectTransform:
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 6176764422977772731}
m_RootOrder: 0
m_Father: {fileID: 8655783301447689420}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 0, y: 0.5}
m_AnchoredPosition: {x: 25, y: 0}
m_AnchoredPosition: {x: 22, y: 0}
m_SizeDelta: {x: 32, y: 32}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &6176764422572337592
@@ -752,8 +914,8 @@ MonoBehaviour:
m_Enabled: 0
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
@@ -782,10 +944,10 @@ GameObject:
m_Component:
- component: {fileID: 6176764422977772731}
- component: {fileID: 6176764422977772711}
- component: {fileID: 6176764422977772710}
- component: {fileID: 6176764422977772709}
- component: {fileID: 6176764422977772708}
- component: {fileID: 8800000000000006001}
- component: {fileID: 341489514146635559}
m_Layer: 0
m_Name: Hero Dropdown
m_TagString: Untagged
@@ -805,18 +967,14 @@ RectTransform:
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 6176764422572337598}
- {fileID: 6176764421848850766}
- {fileID: 6176764421710205223}
- {fileID: 6176764421851344161}
- {fileID: 8655783301447689420}
- {fileID: 6993301234712457781}
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -287, y: 47}
m_SizeDelta: {x: 500, y: 50}
m_SizeDelta: {x: 500, y: 180}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &6176764422977772711
CanvasRenderer:
@@ -826,36 +984,6 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6176764422977772730}
m_CullTransparentMesh: 0
--- !u!114 &6176764422977772710
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6176764422977772730}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!114 &6176764422977772709
MonoBehaviour:
m_ObjectHideFlags: 0
@@ -866,8 +994,8 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 7b743370ac3e4ec2a1668f5455a8ef8a, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Name:
m_EditorClassIdentifier:
m_Navigation:
m_Mode: 3
m_WrapAround: 0
@@ -896,7 +1024,7 @@ MonoBehaviour:
m_SelectedTrigger: Selected
m_DisabledTrigger: Disabled
m_Interactable: 1
m_TargetGraphic: {fileID: 6176764422977772710}
m_TargetGraphic: {fileID: 0}
m_Template: {fileID: 6176764421851344161}
m_CaptionText: {fileID: 6176764421848850767}
m_CaptionImage: {fileID: 6176764422572337599}
@@ -904,14 +1032,18 @@ MonoBehaviour:
m_ItemText: {fileID: 6176764421927073094}
m_ItemImage: {fileID: 6176764422342584651}
m_Value: 0
m_MultiSelect: 0
m_Options:
m_Options:
- m_Text: Option A
m_Image: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
- m_Text: Option B
m_Image: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
- m_Text: Option C
m_Image: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_OnValueChanged:
m_PersistentCalls:
m_Calls: []
@@ -926,11 +1058,58 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: bd19585e1f7d445a3b2c459d2c8535eb, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Name:
m_EditorClassIdentifier:
HeadshotImage: {fileID: 2583823285591727170}
showCondition: 1
ConditionName: VIG
FallbackText:
--- !u!114 &8800000000000006001
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6176764422977772730}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.LayoutElement
m_IgnoreLayout: 0
m_MinWidth: 400
m_MinHeight: 48
m_PreferredWidth: 500
m_PreferredHeight: -1
m_FlexibleWidth: 0
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!114 &341489514146635559
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6176764422977772730}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.VerticalLayoutGroup
m_Padding:
m_Left: 0
m_Right: 0
m_Top: 0
m_Bottom: 0
m_ChildAlignment: 1
m_Spacing: 5
m_ChildForceExpandWidth: 0
m_ChildForceExpandHeight: 0
m_ChildControlWidth: 1
m_ChildControlHeight: 1
m_ChildScaleWidth: 0
m_ChildScaleHeight: 0
m_ReverseArrangement: 0
--- !u!1 &6176764423105613646
GameObject:
m_ObjectHideFlags: 0
@@ -941,6 +1120,7 @@ GameObject:
m_Component:
- component: {fileID: 6176764423105613647}
- component: {fileID: 6176764423105613640}
- component: {fileID: 1618993084020171538}
m_Layer: 0
m_Name: Item
m_TagString: Untagged
@@ -960,11 +1140,10 @@ RectTransform:
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 6176764422342584650}
- {fileID: 6176764423214552056}
- {fileID: 6176764422342584650}
- {fileID: 6176764421927073093}
m_Father: {fileID: 6176764423449496427}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 1, y: 0.5}
@@ -981,8 +1160,8 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Name:
m_EditorClassIdentifier:
m_Navigation:
m_Mode: 3
m_WrapAround: 0
@@ -1019,6 +1198,32 @@ MonoBehaviour:
m_PersistentCalls:
m_Calls: []
m_IsOn: 1
--- !u!114 &1618993084020171538
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6176764423105613646}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.HorizontalLayoutGroup
m_Padding:
m_Left: 0
m_Right: 0
m_Top: 0
m_Bottom: 0
m_ChildAlignment: 4
m_Spacing: 0
m_ChildForceExpandWidth: 0
m_ChildForceExpandHeight: 0
m_ChildControlWidth: 1
m_ChildControlHeight: 1
m_ChildScaleWidth: 0
m_ChildScaleHeight: 0
m_ReverseArrangement: 0
--- !u!1 &6176764423214552063
GameObject:
m_ObjectHideFlags: 0
@@ -1030,6 +1235,7 @@ GameObject:
- component: {fileID: 6176764423214552056}
- component: {fileID: 6176764423214552058}
- component: {fileID: 6176764423214552057}
- component: {fileID: 4237570525283516452}
m_Layer: 0
m_Name: Item Checkmark
m_TagString: Untagged
@@ -1044,18 +1250,17 @@ RectTransform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6176764423214552063}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 6176764423105613647}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 0, y: 0.5}
m_AnchoredPosition: {x: 10, y: 0}
m_SizeDelta: {x: 20, y: 20}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 7.5, y: -20}
m_SizeDelta: {x: 15, y: 15}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &6176764423214552058
CanvasRenderer:
@@ -1075,8 +1280,8 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
@@ -1095,6 +1300,26 @@ MonoBehaviour:
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!114 &4237570525283516452
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6176764423214552063}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.LayoutElement
m_IgnoreLayout: 0
m_MinWidth: 15
m_MinHeight: 15
m_PreferredWidth: 15
m_PreferredHeight: 15
m_FlexibleWidth: -1
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!1 &6176764423349273605
GameObject:
m_ObjectHideFlags: 0
@@ -1126,10 +1351,9 @@ RectTransform:
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 6176764423452779220}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 0.2}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 20, y: 20}
m_Pivot: {x: 0.5, y: 0.5}
@@ -1151,8 +1375,8 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
@@ -1201,7 +1425,6 @@ RectTransform:
m_Children:
- {fileID: 6176764423105613647}
m_Father: {fileID: 6176764422246408519}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 1, y: 1}
@@ -1238,7 +1461,6 @@ RectTransform:
m_Children:
- {fileID: 6176764423349273606}
m_Father: {fileID: 6176764423597331357}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
@@ -1278,7 +1500,6 @@ RectTransform:
m_Children:
- {fileID: 6176764423452779220}
m_Father: {fileID: 6176764421851344161}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0}
m_AnchorMax: {x: 1, y: 1}
@@ -1303,8 +1524,8 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
@@ -1333,8 +1554,8 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Name:
m_EditorClassIdentifier:
m_Navigation:
m_Mode: 3
m_WrapAround: 0
@@ -1367,28 +1588,8 @@ MonoBehaviour:
m_HandleRect: {fileID: 6176764423349273606}
m_Direction: 2
m_Value: 0
m_Size: 0.2
m_Size: 1
m_NumberOfSteps: 0
m_OnValueChanged:
m_PersistentCalls:
m_Calls: []
--- !u!114 &8800000000000006001
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6176764422977772730}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.LayoutElement
m_IgnoreLayout: 0
m_MinWidth: -1
m_MinHeight: 48
m_PreferredWidth: -1
m_PreferredHeight: -1
m_FlexibleWidth: -1
m_FlexibleHeight: -1
m_LayoutPriority: 1
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 8b0ee60782544d9e8fc72d0ca236473f
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 6bc44796bb5a14799ac1d3f536e54263
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -3,6 +3,7 @@ using System.Linq;
using common;
using Net.Eagle0.Eagle.Views;
using UnityEngine;
using UnityEngine.UI;
using FactionId = System.Int32;
using ProvinceId = System.Int32;
@@ -56,6 +57,7 @@ namespace eagle {
row.BattalionSize.gameObject.SetActive(false);
}
}
ResizeMovingArmyPopup(movingArmy.UnitDetails.Count);
movingArmyPopupPanel.SetActive(true);
}
@@ -65,9 +67,27 @@ namespace eagle {
row.SetSummaryText(MovingArmySummaryText(movingArmy));
row.BattalionImage.gameObject.SetActive(false);
row.BattalionSize.gameObject.SetActive(false);
ResizeMovingArmyPopup(1);
movingArmyPopupPanel.SetActive(true);
}
private void ResizeMovingArmyPopup(int rowCount) {
var rowHeight =
movingArmyPopupTable.rowPrefab.GetComponent<LayoutElement>().preferredHeight;
var contentLayout =
movingArmyPopupTable.contentViewTransform.GetComponent<LayoutGroup>();
var popupLayout = movingArmyPopupPanel.GetComponent<LayoutGroup>();
var contentHeight = rowCount * rowHeight + contentLayout.padding.vertical;
((RectTransform)movingArmyPopupTable.contentViewTransform)
.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, contentHeight);
var popupHeight = contentHeight + popupLayout.padding.vertical;
movingArmyPopupPanel.GetComponent<RectTransform>().SetSizeWithCurrentAnchors(
RectTransform.Axis.Vertical,
popupHeight);
}
private static string MovingArmySummaryText(IncomingArmyView movingArmy) {
if (movingArmy.HeroCount == 0 && movingArmy.TroopCount == 0) {
var supplies = new List<string>();
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: e0eb75741f66646babd30f8e636e40ec
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: c56744b095d4a4aa88015564e7e8eacf
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 4f864d4fd2fc4d05a2a1ae2de37c2f56
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

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