Skip to main content

InScript — a game-focused scripting language with 59 game modules and a bytecode VM

Project description

InScript v1.1.0 — First Stable Release

839 tests passing · 59 stdlib modules · Python 3.10+ · Audit 9.5/10
pip install inscript-lang · v1.1.0 is the first production-ready release

InScript is a statically-typed scripting language for 2D games — a readable, safe alternative to GDScript with 59 built-in game modules and a complete bytecode VM.


Install

pip install inscript-lang                  # core
pip install "inscript-lang[game]"          # with pygame
pip install "inscript-lang[all]"           # pygame + LSP
inscript --version                         # InScript 1.1.0

Quick Start

inscript --repl               # interactive shell
inscript game.ins             # run a file
inscript --watch game.ins     # auto-rerun on save
inscript --fmt game.ins       # format code
inscript --test               # run test_*.ins files
inscript --check game.ins     # static analysis only

Language

// Arrow functions
let evens = [1,2,3,4,5].filter(fn(x) => x % 2 == 0)
let names = users.map(fn(u) => u.name).sorted()

// ADT enums + exhaustive pattern matching
enum Shape { Circle(r: float)  Rect(w: float, h: float) }

fn area(s: Shape) -> float {
    return match s {
        case Shape.Circle(r) if r > 10.0 { "large" }
        case Shape.Circle(r)             { 3.14159 * r * r }
        case Shape.Rect(w, h)            { w * h }
        case 0..=5                       { 0.0 }
    }
}

// Structs with priv, super, decorators
struct Entity {
    priv id: int = 0
    name: string
    fn update(dt: float) { }
}
struct Player extends Entity {
    fn update(dt: float) {
        super.update(dt)
        self.move(dt)
    }
}

// Result type chaining
fn divide(a: float, b: float) -> Result {
    if b == 0.0 { return Err("zero") }
    return Ok(a / b)
}
let r = divide(10.0, 2.0)
    .map(fn(v) => v * 3.0)
    .unwrap_or(0.0)

// Type aliases + nullable + union
type PlayerID = int
fn find(id: PlayerID?) -> string|nil { ... }

// Rest destructuring
let [first, ...rest] = [1,2,3,4,5]
print(rest)   // [2, 3, 4, 5]

Developer Tools

Tool Command
Format inscript --fmt file.ins · --fmt-check for CI
Watch inscript --watch file.ins (auto-rerun on save)
Test inscript --test (discovers test_*.ins)
REPL inscript --repl · .doc math for live module docs
Check inscript --check file.ins (static analysis)
LSP inscript --lsp (VS Code extension available)
Playground authorss81.github.io/inscript/playground.html

59 Game Modules

import "physics2d" as P  // RigidBody, World, collision callbacks
import "ecs"       as E  // Entity-Component-System
import "pathfind"  as N  // A*, Dijkstra, flow fields
import "tilemap"   as T  // load Tiled maps
import "camera2d"  as C  // follow, shake, zoom
import "particle"  as FX // emitter, burst, continuous
import "fsm"       as SM // state machine with guards
import "save"      as S  // save slots
import "audio"     as A  // load/play/stop/volume
import "localize"  as L  // multi-language strings
// + 49 more: animation, ecs, net_game, image, atlas, shader, ...

Testing Your Code

// test_game.ins
test "player moves right" {
    let p = Player{x: 0.0, y: 0.0}
    p.move(1.0, 0.0)
    assert(p.x == 5.0, "moved right")
}

test "score increases" {
    let g = Game{}
    g.add_score(100)
    assert(g.score == 100, "score added")
}
inscript --test              # ✅ 2/2 tests passed  12ms
inscript --test --verbose    # shows each test name

GitHub Actions (auto-publish)

The .github/workflows/publish.yml workflow automatically publishes to PyPI when you push a version tag:

git tag -a v1.2.0 -m "InScript v1.2.0"
git push origin v1.2.0
# → tests run, then auto-uploads to PyPI

Setup: add PYPI_API_TOKEN to GitHub repo secrets.


Upgrading

pip install --upgrade inscript-lang   # from v1.0.x

All v1.0.x syntax is fully backward compatible. No changes needed.


Roadmap

Version Focus
v1.1.0 ← you are here First stable — all tooling complete
v1.2.0 Type safety — generic enforcement, type narrowing
v1.3.0 Performance — C extension (5-15× speedup)
v2.0.0 Ecosystem — package registry, Studio IDE, WASM

ROADMAP.md · Audit (9.5/10) · Docs


MIT License · GitHub · PyPI

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

inscript_lang-1.9.7.tar.gz (236.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

inscript_lang-1.9.7-py3-none-any.whl (242.1 kB view details)

Uploaded Python 3

File details

Details for the file inscript_lang-1.9.7.tar.gz.

File metadata

  • Download URL: inscript_lang-1.9.7.tar.gz
  • Upload date:
  • Size: 236.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for inscript_lang-1.9.7.tar.gz
Algorithm Hash digest
SHA256 08166230080f8a3fce15a45b154abe9d0ccdedd827d4e77e759301e2a82b4a68
MD5 6df5b02c8e5bb12fa75e6ad2001af7b9
BLAKE2b-256 33e2d5f40ac8360d9e0a22545556838cb0045e336d7507b78385371c7be1b2d8

See more details on using hashes here.

File details

Details for the file inscript_lang-1.9.7-py3-none-any.whl.

File metadata

  • Download URL: inscript_lang-1.9.7-py3-none-any.whl
  • Upload date:
  • Size: 242.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for inscript_lang-1.9.7-py3-none-any.whl
Algorithm Hash digest
SHA256 203de79d04ee16b6fda23d0188d3f2deea5e4f05edcef5deebb9849a113aff73
MD5 17798b01ec17a749eca66029638868e3
BLAKE2b-256 7b161d0475224e3c1880ef7b24681ed448b009b7a0f518859cd392e35b502b3d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page