- Created manifest.json to track file metadata for the project. - Added plan.md detailing the implementation strategy for the ba-auto-daily automation script, including feature prioritization and prerequisites.
171 lines
8.1 KiB
Markdown
171 lines
8.1 KiB
Markdown
# ba-auto-daily implementation plan
|
||
|
||
Personal Blue Archive **JP** daily-automation script. Controls the game via `xdotool`
|
||
over a remote X11 session (Steam+Proton on `nik-gpu`), using OpenCV template/color
|
||
matching for detection. No OCR is set up yet (see Prerequisites).
|
||
|
||
Feature list and priority ordering below is derived from studying
|
||
`~/repo/baas-reference` (pur1fying/blue_archive_auto_script, GPL-3.0, read-only
|
||
reference — **not copied from**, reimplemented fresh in our own style). Its own
|
||
default scheduler priority, complexity, and JP-relevance were used to rank the
|
||
backlog. See "Reference" under each feature for the baas file(s) that describe the
|
||
mechanic, for research purposes only.
|
||
|
||
## Status snapshot
|
||
|
||
| Feature | Status |
|
||
|---|---|
|
||
| Mailbox claim | ✅ Done (`do_mailbox`) |
|
||
| Cafe (pats + income) | ✅ Done (`do_cafe`) |
|
||
| Everything else below | Not started |
|
||
|
||
## Prerequisites (cross-cutting, unblock multiple tiers)
|
||
|
||
- **OCR.** Not set up. Needed for currency/ticket-count readouts, region/tab name
|
||
search, and a few other read-a-number moments. When we get there, evaluate
|
||
Tesseract vs PaddleOCR in the existing `~/.venvs/ba-auto-daily` venv. Until then,
|
||
stick to features that are pure color-check / template-match.
|
||
- **Auto-fight primitive.** A shared "start fight → max speed + auto-mode →
|
||
detect win/lose" routine that Arena, and any future story/raid automation, all
|
||
need. Build once, early, before Tier 3 combat features.
|
||
Reference: `module/main_story.py` (`auto_fight`/`enter_battle`).
|
||
|
||
---
|
||
|
||
## Tier 1 — High priority, no OCR needed
|
||
|
||
### Stamina/AP sweep (free + task-menu power)
|
||
Claim the daily free 10 AP purchase and the daily task-menu AP/pyroxene rewards.
|
||
Pure color-check state detection, fixed clicks. High value: AP is capped and this
|
||
is free currency/materials left on the table every day.
|
||
Reference: `module/collect_daily_free_power.py`, `module/collect_daily_task_power.py`.
|
||
|
||
### Club/Group AP claim
|
||
Claim 10 AP from the club/dorm menu. Trivial fixed click + color check.
|
||
Reference: `module/group.py` (29 lines).
|
||
|
||
### Momo Talk (chat app conversations)
|
||
Auto-complete unread chat conversations, including relationship-rank-up story
|
||
beats, claim pyroxene. No OCR — pure pixel-column scanning state machine
|
||
(reply bubble / "enter story" prompt detection by color). Runs on its own ~3h
|
||
cadence like cafe. Moderate build effort but no new dependencies.
|
||
Reference: `module/momo_talk.py` (183 lines, `getConversationState`).
|
||
|
||
---
|
||
|
||
## Tier 2 — Medium priority, sweep-style AP consumption
|
||
|
||
These three share the same shape: buy tickets (optional), sweep N times per
|
||
sub-area, detected mostly by color (a multi-pixel "sss/star-rank" signature, not
|
||
OCR). Minor OCR only for optional coin-balance readouts — can hardcode/skip that
|
||
part initially and just sweep until out of stamina/tickets.
|
||
|
||
### Commissions ("Special Task" / 委託)
|
||
Two sub-dungeons (Base Defense = EXP, Item Retrieval = credits).
|
||
Reference: `module/clear_special_task_power.py` (148 lines).
|
||
|
||
### Scrimmage (学院交流会)
|
||
Three academies, ticket purchase available on JP.
|
||
Reference: `module/scrimmage.py` (166 lines).
|
||
|
||
### Bounty ("Rewarded Task" / 悬赏通缉)
|
||
Three sub-areas, ticket purchase (0–12). Needs a little OCR for bounty-coin
|
||
balance if we want auto-refresh; otherwise skippable.
|
||
Reference: `module/rewarded_task.py` (204 lines).
|
||
|
||
### Normal/Hard story AP sweep (re-clear already-cleared stages)
|
||
Sweep already-cleared main-story stages by region/mission count to burn AP.
|
||
Needs OCR for current-region-number + a fuzzy swipe-search over mission
|
||
buttons — more OCR-dependent than the three above, so ranked after them.
|
||
Reference: `module/explore_tasks/sweep_task.py`, `module/explore_tasks/task_utils.py`.
|
||
|
||
---
|
||
|
||
## Tier 3 — Needs real OCR investment
|
||
|
||
Do these once OCR is actually set up.
|
||
|
||
### Battle Pass claim (JP-only feature upstream — relevant to us)
|
||
Claim pass mission points + tier rewards. Simple template claim-flow; OCR only
|
||
needed for the optional level/points stat readout (can stub that part).
|
||
Reference: `module/collect_pass_reward.py` (146 lines).
|
||
|
||
### Common Shop + Tactical (Arena) Shop
|
||
Auto-buy configured items, auto-refresh when affordable. OCR needed for
|
||
currency balances and shop-tab name search.
|
||
Reference: `module/shop/common_shop.py`, `module/shop/tactical_challenge_shop.py`,
|
||
`module/shop/shop_utils.py`.
|
||
|
||
### Arena (PvP ladder)
|
||
Fight until out of tickets or rank 1, claim season + daily rewards. Needs the
|
||
Tier-1-prerequisite auto-fight primitive, plus OCR for ticket count and
|
||
self/opponent level. High value (decays twice daily, at 06:00/20:00 reset) but
|
||
gated on OCR + auto-fight both being ready.
|
||
Reference: `module/arena.py` (173 lines).
|
||
|
||
---
|
||
|
||
## Tier 4 — Heavy investment, lower ROI (defer)
|
||
|
||
### Lesson / Schedule (affection farming via classes)
|
||
Structurally the most complex non-crafting feature: fuzzy OCR region-name
|
||
matching, per-region student-portrait templates, multi-page swipe search, and a
|
||
bespoke isometric-grid pixel-sampling helper for locating a specific favorite
|
||
student. A stripped-down "just pick the highest-affection lesson in a fixed
|
||
region" version would be much cheaper than full favorite-student targeting —
|
||
consider that subset first if we ever pick this up.
|
||
Reference: `module/lesson.py` (615 lines).
|
||
|
||
### Crafting (自动制造)
|
||
The single most complex feature in the reference project (1000+ lines): 3-phase
|
||
material selection, priority-list + rarity-tier config, quantity-stepper OCR,
|
||
filter/sort UI manipulation. Large one-time build cost for recurring but
|
||
non-urgent value (crafting mats don't decay the way AP/tickets do).
|
||
Reference: `module/create.py` (1028 lines).
|
||
|
||
### Main story / Normal-Hard story "push" (auto-clear next uncleared stage)
|
||
Distinct from the Tier-1/2 "sweep already-cleared stages" — this is unlocking
|
||
new content. baas ships ~920KB of hand-authored per-stage click/formation-swap
|
||
JSON scripts for "grid mode"; "simple mode" (plain auto-fight, no positioning)
|
||
is far cheaper but doesn't work on every stage. Only worth building incrementally,
|
||
per-stage, on demand — not a batch feature.
|
||
Reference: `module/main_story.py`, `module/explore_tasks/explore_task.py`.
|
||
|
||
### Group Story / Mini Story (side-plot cleanup)
|
||
OCR-detect a "NEW" badge across a paged grid, clear each unread plot. Pure
|
||
convenience, optional.
|
||
Reference: `module/group_story.py`, `module/mini_story.py`.
|
||
|
||
### Event content (Activities: story/mission/challenge push)
|
||
Shape mirrors Tier-2 sweep work, but the content is 100% ephemeral — a new
|
||
JSON/script per event, expires when the event ends. Recommendation: only build
|
||
the generic "event AP sweep" (reuses Tier-1/2 sweep logic almost as-is) as a
|
||
standing capability; don't try to pre-build specific named events. Note also
|
||
that per baas's own docs, current JP/Global events have mostly moved away from
|
||
grid-walking challenges, so "challenge push" content increasingly needs manual
|
||
play anyway — low automation ROI there specifically.
|
||
Reference: `module/activities/activity_utils.py`, `module/sweep_activity.py`.
|
||
|
||
---
|
||
|
||
## Skip list (not relevant to this project)
|
||
|
||
| Feature | Why skip |
|
||
|---|---|
|
||
| Total Assault (raid) | Stubbed/dead code upstream too (`return True` before any real logic) and disabled by default; low value to chase. |
|
||
| Joint Firing Drill (综合战术测试) | Hard-disabled for JP server in baas's own code (`if self.server == "JP": return True`) despite being in their README — it's a no-op on JP regardless. |
|
||
| De-clothes localization toggle | CN-only. |
|
||
| Restart / refresh-uiautomator2 | Android/ADB housekeeping for baas's mobile control backend; not applicable to our PC/Steam/Proton setup. |
|
||
| Auto-unfriend | Disabled by default upstream too; low value, mildly risky (deletes friends). |
|
||
| Daily minigame dispatcher | Event-specific and changes every campaign — not a stable feature to pre-build. Handle ad hoc if/when a specific live minigame is worth automating. |
|
||
|
||
---
|
||
|
||
## Notes on cadence
|
||
|
||
Several features are time-decaying rather than "any time" farmable, which should
|
||
inform how often the script runs (cron/scheduler), not just build order:
|
||
- Cafe income + Momo Talk: effectively continuous, ~3h internal cadence.
|
||
- Arena: resets twice daily (06:00, 20:00 UTC).
|
||
- Everything else: once-daily, JP/Global reset at 20:00 UTC (03:00 UTC+8).
|