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-2.1.0.tar.gz (244.6 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-2.1.0-py3-none-any.whl (249.9 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for inscript_lang-2.1.0.tar.gz
Algorithm Hash digest
SHA256 df3d98eca28bc3559c032b10fa0d3d00fde198af4138a1f0b5dbfea5aa997db4
MD5 c8f1964fe23a596bd1060a1756c7068e
BLAKE2b-256 1511bf78a2a4b566e4e1ae5ec2adce7e594f753b4f563b9bdf8cdcc7ff1757df

See more details on using hashes here.

File details

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

File metadata

  • Download URL: inscript_lang-2.1.0-py3-none-any.whl
  • Upload date:
  • Size: 249.9 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-2.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6eae2020391a010115652d032bde6682da08a253d5908c4955ecd4d0cc11ca15
MD5 23c2ad01c846b1fb62203c3e2c7fbf26
BLAKE2b-256 f2e52532497229b05ea8d49b383c02fd69ba4266346a672297876231747c38a1

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