Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
215 commits
Select commit Hold shift + click to select a range
692760b
Rewrite CMake build: modern target-based with explicit source lists
greenfire27 Jun 23, 2026
eb75307
Add generator scripts and macOS/Linux/iOS CMake scaffolding
greenfire27 Jun 23, 2026
df90b94
CI: build every platform from CMake instead of the checked-in project…
greenfire27 Jun 23, 2026
d5e1691
Android: build via CMake source of truth + modernize the Gradle project
greenfire27 Jun 23, 2026
0a31769
Android: fix settings.gradle block order (plugins{} must follow plugi…
greenfire27 Jun 23, 2026
95cafd0
Android: commit the prebuilt arm64 freetype/openal libs (un-ignore them)
greenfire27 Jun 23, 2026
750d607
Linux: make the CMake build work for 32- and 64-bit
greenfire27 Jun 23, 2026
bcd03a3
platform: detect aarch64 (__aarch64__) as 64-bit ARM in types.gcc.h
greenfire27 Jun 23, 2026
079986d
cmake: suppress -Wregister on non-MSVC (clang errors on C++17 'regist…
greenfire27 Jun 23, 2026
d1de994
math: gate SSE inline asm on TORQUE_CPU_X86_64, not TORQUE_CPU_X64
greenfire27 Jun 23, 2026
c62dcc6
cmake(android): add platformAndroid to the include path
greenfire27 Jun 23, 2026
bcd6d06
docs: Android builds an APK in CI (record the fixes that got it there)
greenfire27 Jun 23, 2026
b77cab7
CI(linux): bound `--parallel` to nproc (unbounded -j OOM-killed the r…
greenfire27 Jun 23, 2026
903bb9a
cmake(apple): get macOS (arm64) and iOS (arm64 sim) building
greenfire27 Jun 23, 2026
c40b04f
zlib: don't define the Classic-Mac fdopen() stub on modern Apple
greenfire27 Jun 23, 2026
6f95805
docs: record the zlib fdopen fix in the build notes
greenfire27 Jun 23, 2026
712b58c
lpng: don't include the Classic-Mac <fp.h> on modern Apple
greenfire27 Jun 23, 2026
5b75161
fix(linux): match Win32 dumpDirectories semantics so getDirectoryList…
greenfire27 Jun 24, 2026
f654fbb
fix(linux): make the window resizable and follow resizes to the canvas
greenfire27 Jun 24, 2026
6199501
cmake(linux): add build-linux.sh one-shot build script and update pla…
greenfire27 Jun 24, 2026
c79ac19
chore: gitignore the engine's console.log runtime artifact
greenfire27 Jun 24, 2026
9dd6720
mac: flesh out generate-xcode.command + Xcode Run working directory
greenfire27 Jun 24, 2026
0634886
macOS: bootstrap AppKit programmatically so the window appears
greenfire27 Jun 24, 2026
8ed3324
gui: fix invalid std::sort comparators in GuiListBoxCtrl (abort on la…
greenfire27 Jun 24, 2026
c6ddc2c
macOS: fix frozen sim clock on arm64 (getRealMilliseconds saturated)
greenfire27 Jun 24, 2026
9d34fa2
macOS: boot Torque only once (fixes intermittent duplicate windows)
greenfire27 Jun 24, 2026
3a3ef7f
cmake(macOS): build a code-signed .app bundle (stops duplicate windows)
greenfire27 Jun 24, 2026
c5d0d07
math: fix Fluid fade-out frozen on arm64 (negative float -> U8 satura…
greenfire27 Jun 24, 2026
e3d2b8e
docs: macOS is runtime-verified — record the six runtime fixes
greenfire27 Jun 24, 2026
e90f94f
docs: Linux 32-bit is runtime-verified; correct the SDL -dev coexist …
greenfire27 Jun 24, 2026
958819a
cmake: retire the legacy desktop project files (CMake is now the sour…
greenfire27 Jun 24, 2026
542331c
iOS: make the CMake build run on device & simulator (bundle + arm64 r…
greenfire27 Jun 25, 2026
ff0add3
cmake: retire the legacy iOS Xcode project (iOS is now CMake-verified)
greenfire27 Jun 25, 2026
98f4add
Android: fix the empty main.cs dir that crashed module registration
greenfire27 Jun 26, 2026
5ffccc6
cmake(emscripten): build the Web/WASM target — boots in-browser
greenfire27 Jun 26, 2026
337364c
fonts: render the web editor's text from the .uft cache
greenfire27 Jun 26, 2026
17e9353
fonts: FreeType-on-wasm rasterizer for the web (uncached faces/sizes …
greenfire27 Jun 26, 2026
72b304e
fix(emscripten): list immediate dirs at depth 0 so the project select…
greenfire27 Jun 26, 2026
2471c3d
fix(string): hash bytes as unsigned so high-bit input doesn't read ou…
greenfire27 Jun 26, 2026
b99fff1
fix(emscripten): don't emit a character ascii for non-character keys …
greenfire27 Jun 26, 2026
d580a60
fix(emscripten): iterate a local event copy in ProcessMessages (re-en…
greenfire27 Jun 26, 2026
08e30e1
fix(emscripten): disable GL_BLEND after glEnd() so the light fades out
greenfire27 Jun 26, 2026
f64e454
docs(emscripten): Web target is runtime-verified — record interaction…
greenfire27 Jun 26, 2026
3dddc66
Android: render the editor on-device (font-name parse + 3MB frame all…
greenfire27 Jun 27, 2026
a351c0a
docs(android): record the decorative-font fallback as deferred
greenfire27 Jun 27, 2026
542330f
cmake: retire the legacy Emscripten recipe (Web is CMake-verified)
greenfire27 Jun 27, 2026
b37e5dd
Merge pull request #79 from TorqueGameEngines/cmake-do-over
greenfire27 Jun 27, 2026
0637fb1
TruckToy: reskin into an alien-world space rover
greenfire27 Jun 29, 2026
a547caf
Sandbox: re-fit camera aspect on toy load/reset
greenfire27 Jun 29, 2026
89788ad
Merge pull request #80 from TorqueGameEngines/truck-toy-update
greenfire27 Jun 29, 2026
95c6764
Add PlanetX: a complete twin-stick demo game
greenfire27 Jul 4, 2026
354f932
Emscripten: preload PlanetX, fix texImage2D on resizable heap
greenfire27 Jul 4, 2026
4690f62
PlanetX: fit camera to window aspect on resize
greenfire27 Jul 5, 2026
64c8b1f
platformOSX: fix crash enumerating display modes
greenfire27 Jul 5, 2026
b7cc3e1
PlanetX: survivors-scale graphics overhaul
greenfire27 Jul 5, 2026
bcbf227
PlanetX: noise-driven placements, alien nests, grounded rocks
greenfire27 Jul 5, 2026
cae477c
PlanetX: gun overheating with a HUD heat bar
greenfire27 Jul 5, 2026
1fc450d
platformOSX: survive an empty active display list
greenfire27 Jul 5, 2026
0a6ce28
PlanetX: steam vent effect and hiss on gun overheat
greenfire27 Jul 5, 2026
6f11424
PlanetX: stop pooled bullets from spinning
greenfire27 Jul 5, 2026
09d25f2
PlanetX: add the brute - a dark-shelled alien with 4x health
greenfire27 Jul 5, 2026
02dae6e
PlanetX: fix objective placement clustering - noise is not an RNG
greenfire27 Jul 5, 2026
e3c7033
PlanetX: level progression with scaling difficulty
greenfire27 Jul 6, 2026
eeac1b9
PlanetX: catch the docs up with the game
greenfire27 Jul 12, 2026
20b0e6b
PlanetX: fix crystal landing in the same corner every level
greenfire27 Jul 12, 2026
8890826
Updated Project Icon for the ToyBox
greenfire27 Jul 16, 2026
191a2b6
TorqueScript conventions + PlanetX refactored to match
greenfire27 Jul 16, 2026
4128e2c
Windows: fix OpenAL init failure on x64 by shipping OpenAL Soft
greenfire27 Jul 16, 2026
7f5b52e
PlanetX: design doc for sound effects
greenfire27 Jul 17, 2026
24ba214
PlanetX: keep sound-effects changes in the game module
greenfire27 Jul 17, 2026
6e12595
PlanetX: drive enemy sounds through object-to-object events
greenfire27 Jul 17, 2026
d92846a
PlanetX: sound effects
greenfire27 Jul 17, 2026
d669e2c
Removed A Few Design Files
greenfire27 Jul 17, 2026
db93522
PlanetX: art pass — new title background and sprite reskins
greenfire27 Jul 17, 2026
d478fd1
PlanetX: two-player co-op mode
greenfire27 Jul 18, 2026
4818d1e
PlanetX: weapon upgrades chosen at each level's end
greenfire27 Jul 18, 2026
2b260d6
Audio: add a Priority flag so key sounds aren't voice-stolen
greenfire27 Jul 18, 2026
01fbe41
PlanetX: options window, pause menu, and rebindable controls
greenfire27 Jul 18, 2026
8c982fa
PlanetX: particle death effects for enemies and the player
greenfire27 Jul 19, 2026
4d71492
Merge pull request #81 from TorqueGameEngines/planetX
greenfire27 Jul 19, 2026
214daed
GuiProfileTheme: approved design doc
greenfire27 Jul 19, 2026
4c06492
GuiProfileTheme: adjustValue/setAlpha color helpers (TDD)
greenfire27 Jul 19, 2026
da5bc05
GuiProfileTheme: theme-membership plumbing on profiles and borders
greenfire27 Jul 19, 2026
147b2d4
GuiProfileTheme: theme core - ownership, stamping, delete safety
greenfire27 Jul 19, 2026
01bfb72
GuiProfileTheme: full category recipe port from AppCore guiProfiles.cs
greenfire27 Jul 19, 2026
3bd00d7
GuiProfileTheme: TAML persistence via TamlChildren
greenfire27 Jul 19, 2026
6a2c14d
GuiProfileTheme: console API in guiProfileTheme_ScriptBinding.h
greenfire27 Jul 19, 2026
fa432ba
GuiProfileEditor: full-screen theme/profile editor dialog in the Gui …
greenfire27 Jul 20, 2026
8cd2b02
GuiProfileEditor: theme edit form, resizable panes, sample preview + …
greenfire27 Jul 21, 2026
11f60c1
GuiProfileEditor: Borders pane + 6-border theme model
greenfire27 Jul 22, 2026
9ac67f9
GuiProfileEditor: defer preview rebuilds to fix re-entrant crash
greenfire27 Jul 22, 2026
249584c
GuiTreeViewCtrl: fix collapse-scroll jump and drag-reorder crash
greenfire27 Jul 24, 2026
0f7ab9a
GuiProfileTheme: resolve fallback side borders when stamping
greenfire27 Jul 24, 2026
f900bdb
GuiProfileEditor: refine generated theme, theme sliders, harden circl…
greenfire27 Jul 25, 2026
6cc49dc
GuiProfileEditor: custom border pane + shared border grid
greenfire27 Jul 25, 2026
5d7a6f4
GuiProfileEditor: context-aware profile pane on a reflowing grid
greenfire27 Jul 25, 2026
02704f7
GuiTreeViewCtrl: move the selection with the arrow keys
greenfire27 Jul 26, 2026
4d921b8
GuiProfileEditor: empty the Properties pane on header rows
greenfire27 Jul 26, 2026
ccf3474
GuiCursor: don't kill the editor over a cursor that isn't there
greenfire27 Jul 26, 2026
4936557
Editor: unload the editor at exit so its modules tear themselves down
greenfire27 Jul 26, 2026
3f01005
GuiProfileEditor: choose fonts from the ones you have installed
greenfire27 Jul 26, 2026
472c60e
Themes: a Gui gets its profiles from one, and AppCore ships none
greenfire27 Jul 26, 2026
c1b91cd
GuiProfileEditor: stand-alone profiles you can pick, rename and delete
greenfire27 Jul 26, 2026
4159047
GuiProfileEditor: pick a profile bitmap, and write a path that travels
greenfire27 Jul 27, 2026
a843961
GuiProfileEditor: pick an image asset by looking at it
greenfire27 Jul 27, 2026
1bd02bb
GuiColorPopup: theme colors to click, and channels you can type
greenfire27 Jul 27, 2026
9338451
Tests: the smoke suites move off the root and get a runner
greenfire27 Jul 27, 2026
38adc8d
Tests: border was chasing a bundle shape that changed under it
greenfire27 Jul 27, 2026
88d225c
Tests: profileForm was asking for a row that no longer exists
greenfire27 Jul 27, 2026
66ee1d7
Tests: say what the caret folder actually is
greenfire27 Jul 27, 2026
7fa39bb
GuiSliderCtrl: bind the groove rect to a name so clang/gcc accept it
greenfire27 Jul 27, 2026
fc969cc
osxFont/iOSFont: make the font backend safe for the Profile Editor to…
greenfire27 Jul 27, 2026
af5c4ee
Tests: a bash runner so the smoke suites run on macOS and Linux
greenfire27 Jul 27, 2026
459512b
SimObject: fix numeric fields dropped from TAML on glibc (aliased spr…
greenfire27 Jul 27, 2026
c98f7f8
Tests(font): relax the installed-font floor so it passes on a sparse …
greenfire27 Jul 27, 2026
063d08f
Merge pull request #84 from TorqueGameEngines/Gui-Profile-Editor
greenfire27 Jul 27, 2026
38ed8b6
Editor icons: all 304 of the Mono set, at four sizes, behind names
greenfire27 Jul 28, 2026
8916d58
Editor icons: add align top, middle and bottom
greenfire27 Jul 28, 2026
2a93b70
GuiControl: add rendersChildren() and applySizing() for the editor
greenfire27 Jul 29, 2026
5433672
GuiControl: name the sizing flags for the edge they hold, and give ev…
greenfire27 Jul 29, 2026
830a8b9
SimObject: stop persisting hidden and locked
greenfire27 Jul 29, 2026
aced3ac
EditorIconButton: keep the disabled look while the pointer is over it
greenfire27 Jul 29, 2026
8bc5612
Gui Editor: replace the inspector with a custom properties pane
greenfire27 Jul 29, 2026
7b35118
Gui Editor: let a GuiControl be told what it is, and give its text a …
greenfire27 Jul 29, 2026
3e020cf
Gui Editor: compact the properties pane, and tell each switch what it…
greenfire27 Jul 29, 2026
b03115b
Gui Editor: draw the controls, so the palette can stop naming them
greenfire27 Jul 29, 2026
d51f8e6
Gui Editor: let the shot harness make the folder it writes into
greenfire27 Jul 29, 2026
50f1d37
Gui Editor: make the control palette a palette
greenfire27 Jul 29, 2026
bfcf8c7
Gui Editor: undo and redo, on the machinery that was already there
greenfire27 Jul 29, 2026
afe11ca
Merge branch 'gui-editor-improvements' into gui-editor-palette
greenfire27 Jul 29, 2026
01d1f8f
Gui Editor: check that placing by click is undoable
greenfire27 Jul 29, 2026
5659bf3
Tests: let every harness that screenshots make the folder it writes into
greenfire27 Jul 29, 2026
f6127b5
SimObject: a deep clone that copies the data and runs no lifecycle
greenfire27 Jul 30, 2026
0c02d31
Gui Editor: copy, cut and paste
greenfire27 Jul 30, 2026
37f4a08
Gui Editor: a control arrives where it can be seen, and a delete says so
greenfire27 Jul 30, 2026
d2845d7
Gui Editor: a tab book makes its own pages
greenfire27 Jul 30, 2026
dc61382
Gui Editor: a menu bar makes its own items
greenfire27 Jul 31, 2026
6e888f9
Gui Editor: a list carries the rows it was authored with
greenfire27 Aug 1, 2026
9daf5b2
Gui Editor: one caret, on the line the return made
greenfire27 Aug 2, 2026
b3c4d43
Gui Editor: an icon takes its color from the theme it is worn in
greenfire27 Aug 2, 2026
44e14f0
Gui Editor: fixed a few sizing issues with Torque Suit Theme
greenfire27 Aug 2, 2026
089e4cb
Gui Editor: a control tile shows its name under the picture
greenfire27 Aug 2, 2026
e71a846
Gui: a scroll control leaves room for its own scroll bar
greenfire27 Aug 2, 2026
9a089e6
Gui: a tree row can carry more than a triangle and a name
greenfire27 Aug 3, 2026
e638819
Gui Editor: the control icons at 16px, for the Explorer tree
greenfire27 Aug 3, 2026
c7eb636
Gui Editor: hidden and locked leave the properties pane for the Explorer
greenfire27 Aug 3, 2026
713b22a
Gui Editor: the Explorer tree indents by twelve, not by a row
greenfire27 Aug 3, 2026
b783f03
Tests: one command for the C++ unit suite, and correct what the docs …
greenfire27 Aug 3, 2026
29ac819
Gui Editor: four defects a read-through of the editor turned up
greenfire27 Aug 3, 2026
e6e59b3
Gui Editor: ask before throwing away a Gui that has not been saved
greenfire27 Aug 3, 2026
5e06aa0
GuiEditCtrl: remove saveSelection and loadSelection
greenfire27 Aug 3, 2026
3aff6ba
README: describe the Gui Editor that is actually there
greenfire27 Aug 3, 2026
ca3635e
Gui Editor: Duplicate, and a Delete you can find
greenfire27 Aug 3, 2026
615c4f3
GuiProfileTheme: cursors, and an editor for aiming them
greenfire27 Aug 5, 2026
7dd89c0
Gui Editor: cursors in the Profile Editor, and slots that only appear…
greenfire27 Aug 5, 2026
f42c994
Gui Editor: ask before deleting a cursor's image, and only when it is…
greenfire27 Aug 5, 2026
c4fa947
PlanetX: the theme's cursors, and the art that goes with them
greenfire27 Aug 5, 2026
3e994df
PlanetX: a name is already a namespace, and a sound that was really a…
greenfire27 Aug 5, 2026
30884c5
GuiImageButtonCtrl: a profile's imageAsset was already the answer
greenfire27 Aug 6, 2026
8be9a90
KeyboardToy: the toy nobody had opened since the controls changed
greenfire27 Aug 6, 2026
8a71029
KeyboardToy: the dialogs as the Gui Editor laid them out
greenfire27 Aug 6, 2026
d6fab96
GuiButtonCtrl: a caption the author cleared stays cleared
greenfire27 Aug 6, 2026
3447653
GuiTextEditProfile: a field with focus is still a field
greenfire27 Aug 6, 2026
d021c74
KeyboardToy: the dialogs and the keyboard, as the Gui Editor laid the…
greenfire27 Aug 6, 2026
c6f6612
Remove the design docs
greenfire27 Aug 6, 2026
e1a1897
GuiControl: a control that changes parent keeps the size it had
greenfire27 Aug 7, 2026
64485f7
Gui Editor: a control a tree drag stranded comes back into view
greenfire27 Aug 7, 2026
cf7f9db
Gui Editor: a hidden control is out of the way, not just out of sight
greenfire27 Aug 7, 2026
176670a
GuiEditorCursorCtrl: the pane lets go of a cursor that is deleted
greenfire27 Aug 7, 2026
7e5899b
Tests: run.sh finds the input-driven suites instead of naming two of …
greenfire27 Aug 7, 2026
a40c039
Linux: implement Platform::pathCopy and Platform::fileRename
greenfire27 Aug 7, 2026
d2e11c9
Linux: fix dStrcatl, dStrrev and dItoa
greenfire27 Aug 7, 2026
3468019
Platform (macOS): a file name with no directory names no directory
greenfire27 Aug 8, 2026
c58193f
Platform (macOS, iOS): a file's size counts the bytes not yet written…
greenfire27 Aug 8, 2026
7374690
Merge pull request #86 from TorqueGameEngines/linux-path-copy-rename
greenfire27 Aug 8, 2026
8e85afb
Merge pull request #85 from TorqueGameEngines/gui-editor-improvements
greenfire27 Aug 8, 2026
6019571
Torque2D 4.0 is now Early Access 4
greenfire27 Aug 8, 2026
4eb4371
Removed Pass-through Test Gui
greenfire27 Aug 8, 2026
8ee744e
Added additional PlanetX font sizes
greenfire27 Aug 8, 2026
194ef3b
Asset Library: tiles or rows, a search box, and sort by name or category
greenfire27 Aug 8, 2026
27c748a
A word too long to wrap left an empty line under it
greenfire27 Aug 8, 2026
6f694e0
Tests: a log per suite, and a run that tidies up after itself
greenfire27 Aug 8, 2026
dea43e3
Asset Manager: an image asset inspector, in four blocks that reflow
greenfire27 Aug 9, 2026
f1ce6e2
An animation kept the frame numbers from an image's old cut
greenfire27 Aug 10, 2026
9b81e99
Drawing one frame of a sheet was a tree's private business
greenfire27 Aug 10, 2026
7ea4d52
Windows pathCopy could not make a folder, or refuse itself
greenfire27 Aug 10, 2026
5bb754a
A grid of an image's frames, and the arithmetic of where cell N sits
greenfire27 Aug 10, 2026
436bab6
The palette you drag frames from, and the timeline you drag them to
greenfire27 Aug 10, 2026
2f68664
Room for the preview to be split three ways, taken by nothing yet
greenfire27 Aug 10, 2026
1c0699b
An animation editor where the preview used to be
greenfire27 Aug 10, 2026
626897a
Editing a timeline no longer restarts the animation it is editing
greenfire27 Aug 10, 2026
30445a2
Play it, loop it, and fill it from "frames 28 to 32"
greenfire27 Aug 10, 2026
54a9b1b
An inspector for animations, and room for the next one
greenfire27 Aug 10, 2026
2a80ece
The two gestures worth posting a real click for
greenfire27 Aug 10, 2026
a2a22e9
Eight things wrong with the animation editor
greenfire27 Aug 10, 2026
d3879d8
An icon button's picture and the sprite holding it are two different …
greenfire27 Aug 11, 2026
dd9943c
The dragged frame, the timeline's colors, and a transport that fits
greenfire27 Aug 11, 2026
d4122a7
An asset you can change your mind about
greenfire27 Aug 12, 2026
7aa5e18
A menu bar that belongs to whoever is in front
greenfire27 Aug 12, 2026
453500a
What a font asset actually contains
greenfire27 Aug 13, 2026
9050120
A sound you can hear no matter how the game is mixing it
greenfire27 Aug 13, 2026
f854d68
Which of an emitter's thirty knobs are actually connected
greenfire27 Aug 13, 2026
7d8afb1
The preview that kept showing the asset you had just left
greenfire27 Aug 13, 2026
9e4ae28
What color a particle actually is at half its life
greenfire27 Aug 15, 2026
fa4d341
Frames an animation can call by name
greenfire27 Aug 16, 2026
a681d32
Merge pull request #87 from TorqueGameEngines/asset-manager-improvements
greenfire27 Aug 17, 2026
1544f6d
A new project that is named after your game
greenfire27 Aug 18, 2026
f9af640
A declared path spelled the way it was written
greenfire27 Aug 18, 2026
cd879a1
The folder a scan names is the folder you can open
greenfire27 Aug 18, 2026
ad80a00
Merge pull request #88 from TorqueGameEngines/new-project-improvements
greenfire27 Aug 18, 2026
7b8ff48
A record of what changed, kept where the changes are
greenfire27 Aug 18, 2026
904825d
A way in for anyone who wants to help
greenfire27 Aug 18, 2026
74704a0
Changelog: the project naming work PR 88 landed
greenfire27 Aug 18, 2026
84fa829
CLAUDE.md: the three files that arrived this week
greenfire27 Aug 18, 2026
f54f05f
The engine knew it was 4.0 everywhere except in itself
greenfire27 Aug 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
69 changes: 69 additions & 0 deletions .claude/skills/checking-torquescript-conventions/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
---
name: checking-torquescript-conventions
description: Use when reviewing or verifying changed TorqueScript (.cs) files against the project's coding conventions — after editing or adding game/UI scripts, before committing or opening a PR, or whenever asked to check that script code conforms to TORQUE_SCRIPT.md.
---

# Checking TorqueScript conventions

## Overview

Verify that the `.cs` script files changed on this branch follow the project's TorqueScript
conventions. The rules live in **`TORQUE_SCRIPT.md`** at the repo root — that file is the source
of truth; this skill is the review procedure. Read the doc; don't check from memory (it evolves).

## Steps

1. **List the changed `.cs` files.** Default scope = everything this branch changed, committed or
not:
```bash
git status --porcelain -- '*.cs' # uncommitted: modified (M), staged, untracked (??)
git diff --name-only <base>...HEAD -- '*.cs' # committed on this branch (<base> = development/master/main)
```
Review the union, deduped. **Skip deleted (`D`) files.** The conventions target game/UI module
scripts — don't audit vendored engine code or unrelated sample toys unless those are what changed.
State which scope you used.

2. **Read `TORQUE_SCRIPT.md`.** Use its rules + checklist as the criteria.

3. **Check each file against the checklist** (below).

4. **Report** per-file: `conforms`, or list each violation with the file, the rule it breaks, and a
`file:line`. End with a one-line summary.

## Checklist (condensed — see TORQUE_SCRIPT.md for the full text)

- One class per file; the filename matches the class (a shared prefix/suffix may be dropped). Every
`function X::y` in the file shares class `X` (or its base) — no god-namespace.
- Managers/systems are `ScriptObject` subclasses, not methods piled on the module namespace.
- The class configures itself in `onAdd`; the spawner sets only `class`/`superclass` + the values IT
controls (constructor params, incl. object handles).
- `onRemove` deletes what the class created and cancels every **self-rescheduling / repeating**
`schedule()` it started — a pulse or tick loop (event id stored on `%this`).
- Owned objects stored on `%this`; cross-boundary deletes are `isObject()`-guarded.
- `class`/`superclass` inheritance uses the `init()` pattern (only the most-derived `onAdd` fires).
- New globals are only `ActionMap` bind targets or genuine game-state singletons.

## Legitimate patterns — do NOT flag these

These look like violations but are correct per the doc. False-positives here are the most common
failure of this review:

- **The module object with many methods** (e.g. `PlanetXGame`). The module's create-function `%this`
is the ONE sanctioned top-level singleton — fine as long as it orchestrates (state machine, owns
child managers) and delegates real per-object behavior to those managers.
- **Global `ActionMap` bind-target functions** (bare `function moveUp(%val)`). The engine calls them
by bare name, so they MUST be global. Fine when thin and delegating to an object.
- **A pool manager that does NOT delete its pooled `SceneObject`s in `onRemove`.** Objects `add()`ed
to a Scene are owned by the scene (`clearScene` safeDeletes them); the manager only cancels its own
schedules. Deleting them too would be the bug.
- **Fields set in a spawner's `new{}` block beyond class/position.** Correct when the spawner controls
that value.
- **One-shot, fire-and-forget `schedule()`s** (e.g. a 120 ms color/flash reset). Rule 7 targets
self-rescheduling loops; one-shots don't need to be tracked or cancelled.

## Common mistakes

- Guessing the scope instead of running the git commands.
- Re-deriving rules from memory instead of reading `TORQUE_SCRIPT.md`.
- False-positives on the legitimate patterns above.
- Checking non-`.cs` or deleted files.
11 changes: 9 additions & 2 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -1,2 +1,9 @@
$ cat .gitattributes
engine/lib/* linguist-vendored
# Keep the vendored third-party libraries out of GitHub language statistics.
engine/lib/* linguist-vendored

# Line endings for the cross-platform generator scripts:
# shell scripts must stay LF (CRLF breaks the shebang on macOS/Linux),
# batch files stay CRLF for cmd.exe.
*.sh text eol=lf
*.command text eol=lf
*.bat text eol=crlf
257 changes: 161 additions & 96 deletions .github/workflows/PR-builds.yml
Original file line number Diff line number Diff line change
@@ -1,129 +1,194 @@
name: Build Packages

on: [push, pull_request, workflow_dispatch]

# Cancel superseded runs on the same ref to save runner minutes.
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

# NOTE: every job now builds from the CMake source of truth (generate a project
# file, then build it) instead of the checked-in solution/make/xcode files.
# Windows is verified; macOS / Linux / iOS are freshly migrated to CMake and may
# need iteration — these jobs ARE the verification loop for those platforms.

jobs:
Build-Windows-32bit-VS2019:
name: 32-bit Windows On VS2019
runs-on: windows-2019
# ===========================================================================
# Windows — generate the Visual Studio solution from CMake and build it.
# VS2019 is retired; we test VS2026 and VS2022, each in 64- and 32-bit.
# ===========================================================================
windows:
name: Windows ${{ matrix.label }}
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
matrix:
include:
- { label: 'VS2026 x64', runner: windows-2025-vs2026, generator: 'Visual Studio 18 2026', arch: x64, artifact: Torque2D_Windows_x64_VS2026 }
- { label: 'VS2026 Win32', runner: windows-2025-vs2026, generator: 'Visual Studio 18 2026', arch: Win32, artifact: Torque2D_Windows_x86_VS2026 }
- { label: 'VS2022 x64', runner: windows-2022, generator: 'Visual Studio 17 2022', arch: x64, artifact: Torque2D_Windows_x64_VS2022 }
- { label: 'VS2022 Win32', runner: windows-2022, generator: 'Visual Studio 17 2022', arch: Win32, artifact: Torque2D_Windows_x86_VS2022 }
steps:
- uses: actions/checkout@v2
- uses: microsoft/setup-msbuild@v1.1
with:
vs-version: '[16.0, 17.0)'
- run: msbuild -m "engine/compilers/VisualStudio 2019/Torque 2D.sln" /p:Configuration=Debug /p:Platform=win32
- run: msbuild -m "engine/compilers/VisualStudio 2019/Torque 2D.sln" /p:Configuration=Release /p:Platform=win32
- uses: actions/checkout@v4
# Ensure a recent CMake — the "Visual Studio 18 2026" generator needs CMake 4.x.
- uses: lukka/get-cmake@latest
- name: Configure
run: cmake -S . -B build/ci -G "${{ matrix.generator }}" -A ${{ matrix.arch }}
- name: Build Debug
run: cmake --build build/ci --config Debug --parallel
- name: Build Release
run: cmake --build build/ci --config Release --parallel
- uses: actions/upload-artifact@v4
with:
name: Torque2D_Windows_x86_32bit_VS2019
name: ${{ matrix.artifact }}
path: |
.
! .git/
! engine/
Build-Windows-64bit-VS2019:
name: 64-bit Windows On VS2019
runs-on: windows-2019
!.git/**
!engine/**
!build/**

# ===========================================================================
# Linux — generate Unix Makefiles from CMake and build (x86_64 and 32-bit x86).
# ===========================================================================
linux-x64:
name: Linux x86_64
# Pinned to 22.04: the engine's X11 back-end needs GENUINE SDL 1.2 (it links
# the SDL-1.2 X11 driver symbol X11_KeyToUnicode and calls 1.2-only APIs).
# On 24.04, libsdl1.2-dev is the SDL2-based sdl12-compat shim, which does NOT
# export those symbols, so the link fails.
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v2
- uses: microsoft/setup-msbuild@v1.1
with:
vs-version: '[16.0, 17.0)'
msbuild-architecture: x64
- run: msbuild -m "engine/compilers/VisualStudio 2019/Torque 2D.sln" /p:Configuration=Debug /p:Platform=x64
- run: msbuild -m "engine/compilers/VisualStudio 2019/Torque 2D.sln" /p:Configuration=Release /p:Platform=x64
- uses: actions/checkout@v4
- uses: lukka/get-cmake@latest
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y build-essential \
libsdl1.2-dev libx11-dev libxft-dev libfreetype6-dev libopenal-dev libgl1-mesa-dev
- name: Build Debug
run: |
cmake -S . -B build/linux-debug -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug
# Bound parallelism to the core count: bare `--parallel` passes `make -j`
# with NO limit, which fires off every TU at once (100s of g++) and
# OOM-kills the runner ("received a shutdown signal"), hit by the
# memory-heavier 64-bit Debug build.
cmake --build build/linux-debug --parallel "$(nproc)"
- name: Build Release
run: |
cmake -S . -B build/linux-release -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release
cmake --build build/linux-release --parallel "$(nproc)"
- uses: actions/upload-artifact@v4
with:
name: Torque2D_Windows_x86_64bit_VS2019
name: Torque2D_Linux_x86_64
path: |
.
! .git/
! engine/
Build-Windows-32bit-VS2022:
name: 32-bit Windows On VS2022
runs-on: windows-latest
!.git/**
!engine/**
!build/**

linux-x86:
name: Linux x86 (32-bit)
# Pinned to 22.04 for genuine SDL 1.2 (see the linux-x64 job). The 32-bit
# build additionally needs NASM: platform/platformCPUInfo.asm (detectX86CPUInfo)
# is compiled only on 32-bit (it is x86-only and is skipped on 64-bit via
# TORQUE_64).
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v2
- uses: microsoft/setup-msbuild@v1.1
with:
vs-version: '[17.0, 18.0)'
- run: msbuild -m "engine/compilers/VisualStudio 2022/Torque 2D.sln" /p:Configuration=Debug /p:Platform=win32
- run: msbuild -m "engine/compilers/VisualStudio 2022/Torque 2D.sln" /p:Configuration=Release /p:Platform=win32
- uses: actions/checkout@v4
- uses: lukka/get-cmake@latest
# 32-bit (multilib) toolchain + NASM + :i386 dev libraries.
- name: Install 32-bit dependencies (multilib)
run: |
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install -y gcc-multilib g++-multilib nasm \
libsdl1.2-dev:i386 libx11-dev:i386 libxft-dev:i386 libfreetype6-dev:i386 \
libopenal-dev:i386 libgl1-mesa-dev:i386
- name: Build Release (-m32)
env:
# Point pkg-config / find_package at the 32-bit libraries.
PKG_CONFIG_PATH: /usr/lib/i386-linux-gnu/pkgconfig
run: |
cmake -S . -B build/linux32 -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_C_FLAGS=-m32 -DCMAKE_CXX_FLAGS=-m32 -DCMAKE_EXE_LINKER_FLAGS=-m32
cmake --build build/linux32 --parallel "$(nproc)"
- uses: actions/upload-artifact@v4
with:
name: Torque2D_Windows_x86_32bit_VS2022
name: Torque2D_Linux_x86_32bit
path: |
.
! .git/
! engine/
Build-Windows-64bit-VS2022:
name: 64-bit Windows On VS2022
runs-on: windows-latest
!.git/**
!engine/**
!build/**

# ===========================================================================
# macOS — generate an Xcode project from CMake and build it.
# ===========================================================================
macos:
name: macOS
runs-on: macos-latest
steps:
- uses: actions/checkout@v2
- uses: microsoft/setup-msbuild@v1.1
with:
vs-version: '[17.0, 18.0)'
msbuild-architecture: x64
- uses: ChristopheLav/windows-sdk-install@v1
with:
version-sdk: 22621
features: 'OptionId.UWPCPP,OptionId.DesktopCPParm64'
- run: msbuild -m "engine/compilers/VisualStudio 2022/Torque 2D.sln" /p:Configuration=Debug /p:Platform=x64
- run: msbuild -m "engine/compilers/VisualStudio 2022/Torque 2D.sln" /p:Configuration=Release /p:Platform=x64
- uses: actions/checkout@v4
- uses: lukka/get-cmake@latest
- name: Configure
run: cmake -S . -B build/xcode -G Xcode
- name: Build Debug
run: cmake --build build/xcode --config Debug
- name: Build Release
run: cmake --build build/xcode --config Release
- uses: actions/upload-artifact@v4
with:
name: Torque2D_Windows_x86_64bit_VS2022
name: Torque2D_macOS
path: |
.
! .git/
! engine/
Build-Linux-32Bit:
name: Build package for 32-bit x86 Linux
runs-on: ubuntu-latest
!.git/**
!engine/**
!build/**

# ===========================================================================
# iOS — generate an Xcode project targeting iOS; build without code signing.
# ===========================================================================
ios:
name: iOS
runs-on: macos-latest
steps:
- uses: actions/checkout@v2
- run: cd engine/compilers/Make-32bit/ && make
- uses: actions/checkout@v4
- uses: lukka/get-cmake@latest
- name: Configure (iOS)
run: cmake -S . -B build/ios -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0
- name: Build Release (no code signing)
run: cmake --build build/ios --config Release -- CODE_SIGNING_ALLOWED=NO
- uses: actions/upload-artifact@v4
with:
name: Torque2D_Linux_x86_32bit
name: Torque2D_iOS
path: |
.
! .git/
! engine/
Build-Linux-64bit:
name: Build package for 64-bit x86 Linux
!.git/**
!engine/**
!build/**

# ===========================================================================
# Android — modern Gradle build whose native step runs CMake via the NDK,
# producing libtorque2d.so packaged into an APK. arm64-v8a only for now.
# ===========================================================================
android:
name: Android (arm64-v8a)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- run: cd engine/compilers/Make-64bit/ && make
- uses: actions/upload-artifact@v4
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
name: Torque2D_Linux_x86_64bit
path: |
.
! .git/
! engine/
Build-MacOS:
name: Build package for MacOS
runs-on: macOS-latest
steps:
- uses: actions/checkout@v2
- run: cd engine/compilers/Xcode && xcodebuild -project Torque2D.xcodeproj
- uses: actions/upload-artifact@v4
with:
name: Torque2D_MacOS
path: |
.
! .git/
! engine/
Build-iOS:
name: Build package for iOS
runs-on: macOS-latest
steps:
- uses: actions/checkout@v2
- run: cd engine/compilers/Xcode_iOS && xcodebuild CODE_SIGNING_ALLOWED=no -project Torque2D.xcodeproj
distribution: temurin
java-version: '17'
- uses: android-actions/setup-android@v3
- name: Install NDK + CMake (match app/build.gradle ndkVersion)
run: sdkmanager "ndk;25.2.9519653" "cmake;3.22.1"
- name: Build APK (assembleDebug)
working-directory: engine/compilers/android-studio
run: |
chmod +x ./gradlew
./gradlew assembleDebug --no-daemon --stacktrace
- uses: actions/upload-artifact@v4
with:
name: Torque2D_iOS
path: |
.
! .git/
! engine/
name: Torque2D_Android_arm64
path: engine/compilers/android-studio/app/build/outputs/apk/**/*.apk
Loading
Loading