Skip to content

Commit 443d082

Browse files
updates
1 parent c93e458 commit 443d082

File tree

1,756 files changed

+597805
-8
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,756 files changed

+597805
-8
lines changed

.github/copilot-instructions.md

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# Copilot instructions for arrastools
2+
3+
Purpose: Help AI coding agents work productively in this repo of desktop automation tools and a PPO-based Arras AI. Scripts control keyboard/mouse, read pixels, and automate gameplay/UI flows on macOS.
4+
5+
## Architecture and key files
6+
- This is a collection of standalone Python scripts (no package/pytest). Common patterns repeat across files.
7+
- Screen + input automation:
8+
- `arrastools.py` — hotkey-driven macros using pynput. Listeners run at module end and spawn daemon threads via `start_*` helpers.
9+
- `arrasbot.py` — a watchdog that samples screen pixels with `mss`, reacts to state (disconnected/died/banned), and logs/screenshots.
10+
- PPO AI prototype:
11+
- `arrasai.py` — defines PPO agent (PolicyNetwork, PPOMemory, ArrasAI) and training/exec loops over screen observations sampled in a polygon (`GAME_REGION`). Models saved to `arras_models/` (e.g., `arras_model.pt_best`).
12+
- Assets/data: `arras_models/`, `logs/`, `copypastas/`.
13+
14+
## Runtime assumptions and permissions (macOS)
15+
- Requires Accessibility (keyboard/mouse control) and Screen Recording permissions for Terminal/VS Code (pynput + mss).
16+
- Coordinates are absolute screen pixels for a specific UI layout. Retina scaling handled manually:
17+
- `arrasbot.py`: `MONITOR_INDEX` (default 1) and `SCALE` (2 on Retina, 1 on non-Retina). Convert global to local with these.
18+
- If your resolution/layout differs, update `GAME_REGION` and bounds used by `arrastools.py` and `arrasai.py` (e.g., mouse x in [2,1693], y in [128,1094]).
19+
20+
## Dependencies used across scripts
21+
- Core: `pynput`, `mss`, `numpy`.
22+
- Bot: `ping3`, `Pillow`, `mss.tools`.
23+
- AI: `torch`, `shapely`, `pytesseract` (requires system Tesseract), `Pillow`.
24+
- Example install (Python 3.10+): pynput, mss, numpy, ping3, pillow, torch, shapely, pytesseract.
25+
26+
## How to run and control
27+
- `arrastools.py` hotkeys (hold Ctrl):
28+
- `Ctrl+1` one/two/three presses within 2s: `$arena size` automation type 1/2/3 (`start_arena_automation`).
29+
- `Ctrl+y` begin “Controlled Nuke”: click 2 points in 10s to spray `k` within rectangle (uses global mouse listener).
30+
- Safety: `Esc` stops activities; `Ctrl+Esc` immediate exit.
31+
- Other examples: `Ctrl+6` double-press within 5s triggers `ballcrash()`; `Ctrl+9` runs `nuke()`; `Ctrl+m` benchmarks ball spam.
32+
- `arrasbot.py` CLI commands (typed in terminal while running): `stop`, `setscale <1|2>`, `setmon <index>`, `dbgmon`, `screenshot`, `status`, `ping`, `probe`, `forcedisconnect`, `forcedeath`, `forcereconnect`.
33+
- Logs: `logs/abss_*.log`; screenshots: `~/Desktop/abss/<session>/`. Uses `color_close()` for tolerant RGB checks.
34+
- `arrasai.py` training:
35+
- Hotkeys while running: `Esc` force-stop (hard exit), `p` pause/resume, `r` simulate death.
36+
- Samples RGB at `OBSERVATION_POINTS = sample_points_in_polygon(GAME_REGION, step=10)` using `mss`; outputs: action (W/A/S/D/Space), mouse target, Sum42 head, and upgrade path.
37+
- Models saved in `arras_models/` with suffixes `_best`, `_final`, `_interrupted` based on training flow.
38+
39+
## Conventions and patterns to follow
40+
- Threading: Use `threading.Thread(..., daemon=True)` for background actions; toggle with global flags (e.g., `slowballs`, `randomwalld`). Provide `start_*` helpers to avoid duplicate threads.
41+
- Input synthesis: Use a single `KeyboardController`/`MouseController` per module; batch keystrokes within backtick-quoted console in-game by `controller.press("`")``controller.release("`")`.
42+
- Color detection: Prefer `color_close(tupleRGB, tupleRGB, tol=6)` rather than strict equality to account for antialiasing/transparency.
43+
- File outputs: Prefer timestamped paths from `timestamp()`; keep bot logs under `logs/` and images under `~/Desktop/abss/<session>/`.
44+
45+
## When extending
46+
- For new macros, mirror `arrastools.py` style: add a function, a `start_*` wrapper if it loops, and wire a Ctrl+<key> branch in `on_press()` with debouncing if needed.
47+
- For new detectors, add small, monitor-relative probes (`probe` in `arrasbot.py`) and gate user-visible actions with tolerant checks + cooldowns.
48+
- If changing layout/resolution, update `GAME_REGION`, bounds and any hard-coded click points in `arrastools.py` (e.g., `conq_quickstart()` positions).
49+
50+
References: `arrastools.py`, `arrasbot.py`, `arrasai.py`, `arras_models/`, `logs/`, `copypastas/`. Keep changes minimal and aligned with existing patterns.

.venv/bin/Activate.ps1

Lines changed: 241 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,241 @@
1+
<#
2+
.Synopsis
3+
Activate a Python virtual environment for the current PowerShell session.
4+
5+
.Description
6+
Pushes the python executable for a virtual environment to the front of the
7+
$Env:PATH environment variable and sets the prompt to signify that you are
8+
in a Python virtual environment. Makes use of the command line switches as
9+
well as the `pyvenv.cfg` file values present in the virtual environment.
10+
11+
.Parameter VenvDir
12+
Path to the directory that contains the virtual environment to activate. The
13+
default value for this is the parent of the directory that the Activate.ps1
14+
script is located within.
15+
16+
.Parameter Prompt
17+
The prompt prefix to display when this virtual environment is activated. By
18+
default, this prompt is the name of the virtual environment folder (VenvDir)
19+
surrounded by parentheses and followed by a single space (ie. '(.venv) ').
20+
21+
.Example
22+
Activate.ps1
23+
Activates the Python virtual environment that contains the Activate.ps1 script.
24+
25+
.Example
26+
Activate.ps1 -Verbose
27+
Activates the Python virtual environment that contains the Activate.ps1 script,
28+
and shows extra information about the activation as it executes.
29+
30+
.Example
31+
Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv
32+
Activates the Python virtual environment located in the specified location.
33+
34+
.Example
35+
Activate.ps1 -Prompt "MyPython"
36+
Activates the Python virtual environment that contains the Activate.ps1 script,
37+
and prefixes the current prompt with the specified string (surrounded in
38+
parentheses) while the virtual environment is active.
39+
40+
.Notes
41+
On Windows, it may be required to enable this Activate.ps1 script by setting the
42+
execution policy for the user. You can do this by issuing the following PowerShell
43+
command:
44+
45+
PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
46+
47+
For more information on Execution Policies:
48+
https://go.microsoft.com/fwlink/?LinkID=135170
49+
50+
#>
51+
Param(
52+
[Parameter(Mandatory = $false)]
53+
[String]
54+
$VenvDir,
55+
[Parameter(Mandatory = $false)]
56+
[String]
57+
$Prompt
58+
)
59+
60+
<# Function declarations --------------------------------------------------- #>
61+
62+
<#
63+
.Synopsis
64+
Remove all shell session elements added by the Activate script, including the
65+
addition of the virtual environment's Python executable from the beginning of
66+
the PATH variable.
67+
68+
.Parameter NonDestructive
69+
If present, do not remove this function from the global namespace for the
70+
session.
71+
72+
#>
73+
function global:deactivate ([switch]$NonDestructive) {
74+
# Revert to original values
75+
76+
# The prior prompt:
77+
if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) {
78+
Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt
79+
Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT
80+
}
81+
82+
# The prior PYTHONHOME:
83+
if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) {
84+
Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME
85+
Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME
86+
}
87+
88+
# The prior PATH:
89+
if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) {
90+
Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH
91+
Remove-Item -Path Env:_OLD_VIRTUAL_PATH
92+
}
93+
94+
# Just remove the VIRTUAL_ENV altogether:
95+
if (Test-Path -Path Env:VIRTUAL_ENV) {
96+
Remove-Item -Path env:VIRTUAL_ENV
97+
}
98+
99+
# Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether:
100+
if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) {
101+
Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force
102+
}
103+
104+
# Leave deactivate function in the global namespace if requested:
105+
if (-not $NonDestructive) {
106+
Remove-Item -Path function:deactivate
107+
}
108+
}
109+
110+
<#
111+
.Description
112+
Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the
113+
given folder, and returns them in a map.
114+
115+
For each line in the pyvenv.cfg file, if that line can be parsed into exactly
116+
two strings separated by `=` (with any amount of whitespace surrounding the =)
117+
then it is considered a `key = value` line. The left hand string is the key,
118+
the right hand is the value.
119+
120+
If the value starts with a `'` or a `"` then the first and last character is
121+
stripped from the value before being captured.
122+
123+
.Parameter ConfigDir
124+
Path to the directory that contains the `pyvenv.cfg` file.
125+
#>
126+
function Get-PyVenvConfig(
127+
[String]
128+
$ConfigDir
129+
) {
130+
Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg"
131+
132+
# Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue).
133+
$pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue
134+
135+
# An empty map will be returned if no config file is found.
136+
$pyvenvConfig = @{ }
137+
138+
if ($pyvenvConfigPath) {
139+
140+
Write-Verbose "File exists, parse `key = value` lines"
141+
$pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath
142+
143+
$pyvenvConfigContent | ForEach-Object {
144+
$keyval = $PSItem -split "\s*=\s*", 2
145+
if ($keyval[0] -and $keyval[1]) {
146+
$val = $keyval[1]
147+
148+
# Remove extraneous quotations around a string value.
149+
if ("'""".Contains($val.Substring(0, 1))) {
150+
$val = $val.Substring(1, $val.Length - 2)
151+
}
152+
153+
$pyvenvConfig[$keyval[0]] = $val
154+
Write-Verbose "Adding Key: '$($keyval[0])'='$val'"
155+
}
156+
}
157+
}
158+
return $pyvenvConfig
159+
}
160+
161+
162+
<# Begin Activate script --------------------------------------------------- #>
163+
164+
# Determine the containing directory of this script
165+
$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition
166+
$VenvExecDir = Get-Item -Path $VenvExecPath
167+
168+
Write-Verbose "Activation script is located in path: '$VenvExecPath'"
169+
Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)"
170+
Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)"
171+
172+
# Set values required in priority: CmdLine, ConfigFile, Default
173+
# First, get the location of the virtual environment, it might not be
174+
# VenvExecDir if specified on the command line.
175+
if ($VenvDir) {
176+
Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values"
177+
}
178+
else {
179+
Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir."
180+
$VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/")
181+
Write-Verbose "VenvDir=$VenvDir"
182+
}
183+
184+
# Next, read the `pyvenv.cfg` file to determine any required value such
185+
# as `prompt`.
186+
$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir
187+
188+
# Next, set the prompt from the command line, or the config file, or
189+
# just use the name of the virtual environment folder.
190+
if ($Prompt) {
191+
Write-Verbose "Prompt specified as argument, using '$Prompt'"
192+
}
193+
else {
194+
Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value"
195+
if ($pyvenvCfg -and $pyvenvCfg['prompt']) {
196+
Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'"
197+
$Prompt = $pyvenvCfg['prompt'];
198+
}
199+
else {
200+
Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virutal environment)"
201+
Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'"
202+
$Prompt = Split-Path -Path $venvDir -Leaf
203+
}
204+
}
205+
206+
Write-Verbose "Prompt = '$Prompt'"
207+
Write-Verbose "VenvDir='$VenvDir'"
208+
209+
# Deactivate any currently active virtual environment, but leave the
210+
# deactivate function in place.
211+
deactivate -nondestructive
212+
213+
# Now set the environment variable VIRTUAL_ENV, used by many tools to determine
214+
# that there is an activated venv.
215+
$env:VIRTUAL_ENV = $VenvDir
216+
217+
if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) {
218+
219+
Write-Verbose "Setting prompt to '$Prompt'"
220+
221+
# Set the prompt to include the env name
222+
# Make sure _OLD_VIRTUAL_PROMPT is global
223+
function global:_OLD_VIRTUAL_PROMPT { "" }
224+
Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT
225+
New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt
226+
227+
function global:prompt {
228+
Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) "
229+
_OLD_VIRTUAL_PROMPT
230+
}
231+
}
232+
233+
# Clear PYTHONHOME
234+
if (Test-Path -Path Env:PYTHONHOME) {
235+
Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME
236+
Remove-Item -Path Env:PYTHONHOME
237+
}
238+
239+
# Add the venv to the PATH
240+
Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH
241+
$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH"

.venv/bin/activate

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
# This file must be used with "source bin/activate" *from bash*
2+
# you cannot run it directly
3+
4+
deactivate () {
5+
# reset old environment variables
6+
if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then
7+
PATH="${_OLD_VIRTUAL_PATH:-}"
8+
export PATH
9+
unset _OLD_VIRTUAL_PATH
10+
fi
11+
if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then
12+
PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}"
13+
export PYTHONHOME
14+
unset _OLD_VIRTUAL_PYTHONHOME
15+
fi
16+
17+
# This should detect bash and zsh, which have a hash command that must
18+
# be called to get it to forget past commands. Without forgetting
19+
# past commands the $PATH changes we made may not be respected
20+
if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
21+
hash -r 2> /dev/null
22+
fi
23+
24+
if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then
25+
PS1="${_OLD_VIRTUAL_PS1:-}"
26+
export PS1
27+
unset _OLD_VIRTUAL_PS1
28+
fi
29+
30+
unset VIRTUAL_ENV
31+
if [ ! "${1:-}" = "nondestructive" ] ; then
32+
# Self destruct!
33+
unset -f deactivate
34+
fi
35+
}
36+
37+
# unset irrelevant variables
38+
deactivate nondestructive
39+
40+
VIRTUAL_ENV="/Users/alexoh/Documents/GitHub/arrastools/.venv"
41+
export VIRTUAL_ENV
42+
43+
_OLD_VIRTUAL_PATH="$PATH"
44+
PATH="$VIRTUAL_ENV/bin:$PATH"
45+
export PATH
46+
47+
# unset PYTHONHOME if set
48+
# this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
49+
# could use `if (set -u; : $PYTHONHOME) ;` in bash
50+
if [ -n "${PYTHONHOME:-}" ] ; then
51+
_OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}"
52+
unset PYTHONHOME
53+
fi
54+
55+
if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then
56+
_OLD_VIRTUAL_PS1="${PS1:-}"
57+
PS1="(.venv) ${PS1:-}"
58+
export PS1
59+
fi
60+
61+
# This should detect bash and zsh, which have a hash command that must
62+
# be called to get it to forget past commands. Without forgetting
63+
# past commands the $PATH changes we made may not be respected
64+
if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
65+
hash -r 2> /dev/null
66+
fi

.venv/bin/activate.csh

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# This file must be used with "source bin/activate.csh" *from csh*.
2+
# You cannot run it directly.
3+
# Created by Davide Di Blasi <[email protected]>.
4+
# Ported to Python 3.3 venv by Andrew Svetlov <[email protected]>
5+
6+
alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate'
7+
8+
# Unset irrelevant variables.
9+
deactivate nondestructive
10+
11+
setenv VIRTUAL_ENV "/Users/alexoh/Documents/GitHub/arrastools/.venv"
12+
13+
set _OLD_VIRTUAL_PATH="$PATH"
14+
setenv PATH "$VIRTUAL_ENV/bin:$PATH"
15+
16+
17+
set _OLD_VIRTUAL_PROMPT="$prompt"
18+
19+
if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then
20+
set prompt = "(.venv) $prompt"
21+
endif
22+
23+
alias pydoc python -m pydoc
24+
25+
rehash

0 commit comments

Comments
 (0)