State of Survival bot — ADB + OpenCV automation framework
Go to file
bachko 3309a47e10 Initial commit: SoS bot framework
- ADB client (connect, tap, swipe, screencap, app control)
- Vision module (in-memory screenshot + OpenCV template matching)
- Action loader (auto-discovers .py files in actions/)
- Engine (screenshot → detect → act loop with YAML playbook)
- 12 built-in actions: tap, click, wait, swipe, find,
  find_and_click, wait_until, click_seq, keyevent, app, log
- Example custom action template
- Debug screenshot tool for template creation
- Detailed plan.md with 20 actions across 9 phases
- Sample playbook with 10 steps
2026-07-09 13:52:31 +00:00
actions Initial commit: SoS bot framework 2026-07-09 13:52:31 +00:00
core Initial commit: SoS bot framework 2026-07-09 13:52:31 +00:00
playbook Initial commit: SoS bot framework 2026-07-09 13:52:31 +00:00
templates Initial commit: SoS bot framework 2026-07-09 13:52:31 +00:00
.gitignore Initial commit: SoS bot framework 2026-07-09 13:52:31 +00:00
debug_screenshot.py Initial commit: SoS bot framework 2026-07-09 13:52:31 +00:00
main.py Initial commit: SoS bot framework 2026-07-09 13:52:31 +00:00
plan.md Initial commit: SoS bot framework 2026-07-09 13:52:31 +00:00
README.md Initial commit: SoS bot framework 2026-07-09 13:52:31 +00:00
requirements.txt Initial commit: SoS bot framework 2026-07-09 13:52:31 +00:00

State of Survival Bot

ADB + OpenCV Python bot for State of Survival running in BlueStacks.

Quick Start

# 1. Activate venv
cd sos_bot
source .venv/bin/activate

# 2. Verify ADB connects to BlueStacks
adb connect 127.0.0.1:5555
adb devices

# 3. Capture the first screenshot
python debug_screenshot.py

# 4. Crop reference templates from the screenshot, save to templates/
#    (use GIMP, Krita, MSPaint, or any image editor)

# 5. Edit playbook/default.yaml to add steps matching your templates

# 6. Run the bot
python main.py

Architecture

sos_bot/
├── main.py                  # Entry point
├── debug_screenshot.py      # Capture screenshots for template creation
├── requirements.txt
├── core/
│   ├── adb.py               # ADB client (connect, tap, swipe, screencap)
│   ├── vision.py            # In-memory screenshot + OpenCV template matching
│   ├── engine.py            # Main loop: screenshot → detect → act
│   └── action_loader.py     # Dynamic action discovery (.py files)
├── actions/
│   ├── tap.py               # Tap at (x, y)
│   ├── click.py             # Alias for tap
│   ├── wait.py              # Sleep N seconds
│   ├── swipe.py             # Swipe gesture
│   ├── find.py              # Locate a template (no click)
│   ├── find_and_click.py    # Locate template → tap it
│   ├── wait_until.py        # Wait for template to appear
│   ├── click_seq.py         # Tap multiple coordinates in sequence
│   ├── keyevent.py          # Android key events (back, home, etc.)
│   ├── app.py               # Launch/stop/restart apps
│   └── log.py               # Write to log
├── templates/               # Reference PNG images for matching
│   └── README.txt
└── playbook/
    └── default.yaml         # Step-by-step behavior definition

How It Works

  1. Main loop takes a screenshot every loop_delay seconds
  2. Each playbook step checks its condition against the screenshot
  3. The first matching step runs its action sequence
  4. Screenshots are never saved to disk — they live in memory as numpy arrays

Playbook Conditions

Each step can use one of these triggers:

Condition Description
if_template Template matching — looks for a reference PNG
if_pixel Pixel color check at specific coordinates
if_multiple All specified templates must match (AND)
if_counter Triggers every N iterations
always: true Always matches (fallback / idle)

Playbook Actions

Action Params What it does
tap x, y Tap at coordinates
click x, y Same as tap
wait seconds Pause N seconds
find template, confidence, region Find template (returns position)
find_and_click template, confidence, region, offset_x/y Find + tap
wait_until template, confidence, timeout, poll_interval Wait for template
swipe x1, y1, x2, y2, duration_ms Swipe gesture
click_seq coords (list of [x,y]), delay Tap sequence
keyevent key (back/home/menu/enter) Android key event
app action (launch/stop/restart), package App control
log message Write to log

Extending: Custom Actions

Create a new .py file in actions/ with this structure:

"""Action: my_action — description of what it does."""


class Action:
    name = "my_action"

    def run(self, ctx, params):
        # ctx = {adb, vision, engine, screenshot, log, _templates_dir}
        # params = dict from playbook YAML

        x = params["x"]
        y = params["y"]
        ctx["adb"].tap(x, y)
        ctx["log"].info("my_action @ (%d, %d)", x, y)

The file is auto-discovered on next startup. No registration needed.

Creating Templates

  1. Run python debug_screenshot.py → saves current screen
  2. Open the PNG in an image editor
  3. Crop EXACTLY the button/icon you want to detect
  4. Save as templates/my_button.png
  5. Reference it in the playbook: if_template: "my_button.png"

Template tips:

  • Crop tightly around the target (no excess background)
  • Use a unique, static UI element
  • Start with confidence: 0.8, lower to 0.7 if it's not found
  • Use region: [x1, y1, x2, y2] to constrain search area (faster, fewer false positives)

Common ADB Ports

BlueStacks Instance Port
First instance 5555
Second instance 5557
Third instance 5559
(Nth) 5555 + (N-1)*2

BlueStacks Settings Required

  • Settings → Advanced → Android Debug Bridge (ADB): ON
  • Settings → Display → Resolution: 1600×900 (recommended)
  • Settings → Display → DPI: 240