Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions bun.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

40 changes: 40 additions & 0 deletions plugins/gamemaker/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# @game-ci/gamemaker (draft)

GameMaker Studio engine plugin. **Not functional yet** - this is a structural
skeleton: a real, correctly-typed `GameCIPlugin` conforming to game-ci/cli's
plugin interface, registered the same way any other plugin is (dynamically,
via `PluginLoader.load('@game-ci/gamemaker')` or `--plugin @game-ci/gamemaker`

- it is deliberately **not** wired into core's default load list, unlike
`orchestrator` and `steam-deploy`, since its build logic doesn't work yet).

## Why GameMaker

Large, underserved indie audience. GameMaker ships an official CLI (`Igor`)
that the Editor itself calls for builds - this plugin wraps that, the same
way `godot-plugin.ts` wraps `godot --headless --export-release`.

## What's real vs. TODO

- Plugin registration shape (engine detector + command dispatch): real,
follows the exact pattern of `src/plugin/builtin/godot-plugin.ts`.
- Project detection (`*.yyp` file presence): stubbed, returns `false`
unconditionally.
- Build command: throws immediately, pointing here.

## Remaining work before this is real

1. Verify Igor's actual CLI invocation shape against a real GameMaker
install - flags for runtime/license selection, target platform, output
path. Do not guess this; it needs to be checked against real GameMaker
documentation/behavior, the same way this repo's other engine plugins
were verified against real source before shipping.
2. Parse the GameMaker/runtime version out of the project for
`engineVersion` (GameMaker's project format should expose this
somewhere in the `.yyp` or a sibling options file - needs checking).
3. Decide the Docker story: does Igor need a licensed GameMaker install
inside a container (like Unreal), or can it run against a
community-buildable image (like Godot)? This affects whether the
plugin needs a `--customImage` requirement or ships a default image.
4. Tests mirroring `godot-plugin.test.ts` / the build-command test pattern
once the above is real.
32 changes: 32 additions & 0 deletions plugins/gamemaker/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
{
"name": "@game-ci/gamemaker",
"version": "0.0.1",
"description": "GameMaker Studio engine plugin (draft). Wraps GameMaker's official Igor CLI for project builds.",
"license": "MIT",
"repository": "git@github.com:game-ci/cli.git",
"files": [
"dist"
],
"main": "dist/index.js",
"types": "dist/index.d.ts",
"exports": {
".": {
"bun": "./src/index.ts",
"types": "./dist/index.d.ts",
"default": "./dist/index.js"
}
},
"scripts": {
"build": "tsc",
"test": "vitest run",
"typecheck": "tsc --noEmit"
},
"devDependencies": {
"@types/node": "^17.0.23",
"typescript": "4.7.4",
"vitest": "^4"
},
"engines": {
"node": ">=18.x"
}
}
55 changes: 55 additions & 0 deletions plugins/gamemaker/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/**
* GameMaker Studio engine plugin - DRAFT.
*
* Plan: detect a GameMaker project via a *.yyp file, and build via
* GameMaker's official Igor CLI (the same command line tool the Editor
* itself calls). Igor's actual invocation shape (runtime/license
* selection quirks, `igor.exe -uf <project> -c <config> -j 8 <verb>`
* style arguments) needs real verification against a GameMaker install
* before this is functional - left as TODOs rather than guessed, per
* this repo's own convention of not shipping unverified domain logic.
*/

export interface GameMakerVersionDetector {
isGameMakerProject(projectPath: string): boolean;
}

// TODO: detect a .yyp file in projectPath (GameMaker's project manifest).
function isGameMakerProject(_projectPath: string): boolean {
return false;
}

export const gamemakerPlugin = {
name: "gamemaker",
version: "0.0.1",

engineDetectors: [
{
name: "gamemaker",
detect(projectPath: string) {
if (isGameMakerProject(projectPath)) {
// TODO: read the actual GameMaker/Igor version once detection is real.
return { engine: "gamemaker", engineVersion: "unknown" };
}
return null;
},
},
],

commands: [
{
engine: "gamemaker",
createCommand(command: string, _subCommands: string[]) {
if (command === "build") {
throw new Error(
"GameMaker build support is not implemented yet (draft plugin). " +
"See plugins/gamemaker/README.md for the planned Igor CLI invocation shape.",
);
}
return null;
},
},
],
};

export default gamemakerPlugin;
19 changes: 19 additions & 0 deletions plugins/gamemaker/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"compilerOptions": {
"target": "es2022",
"lib": ["es2022"],
"module": "commonjs",
"moduleResolution": "node",
"declaration": true,
"outDir": "./dist",
"rootDir": "./src",
"strict": true,
"noImplicitAny": false,
"esModuleInterop": true,
"skipLibCheck": true,
"resolveJsonModule": true,
"types": ["node"]
},
"include": ["src/**/*"],
"exclude": ["node_modules", "**/*.test.ts", "dist"]
}
Loading