# Intensity Engine Architecture Overview

## Goals

A platform for shared 3D environments, with the following features:

- Allows all kinds of activities/games/worlds
- Allows easy modding/editing/scripting and sharing/collaboration
- Can run new content in a secure sandboxed manner (like a web browser)
- Reasonable resource requirements
- Open source
- Cross platform

## Approach

- Start with Cube 2/Sauerbraten

- Mod it (C++) to remove limitations on types of games/activities it can run, e.g.,

- Generic entity system, not hardcoded sauer ents
- Load the map on the server for optional server-side physics
- etc.

- Add various features, e.g.

- Smoother camera movement
- Optional editing in thirdperson
- etc.

- Extend with Python

- New high-level logic, e.g.,

- Asset system
- Master server communication
- etc.

- Suitable for non-sandboxable tasks

- Extend with JavaScript (Google V8)

- 'Game logic':

- Define entity classes and behavior
- Simple way to determine what information is automatically synchronized by the engine (state variables)
- Actions, events, etc.

- Suitable for sandboxable tasks

- Add a new master server (Python/Django)

- Manage asset and user account metadata
- Plugin components handle storing of assets, etc.

## Usage Patterns

- Play games/participate in activities

- Download the client
- Run it
- Client automatically downloads assets (maps, scripts, textures, meshes, etc.)

- Create games/activities

- Write JavaScript code

- Game/map specific code, e.g.,

- Game rules (points/scoring, etc.)
- Entity classes
- etc.

- Extend existing code using modular plugins, e.g.,

- Show a visual effect when health is low
- New weapons and actions
- Let server test for 'cheating' by the clients (walking through walls, moving too fast, etc.)
- etc.

- No necessary distinction between game/map specific code and modular plugins, if developing the game/activity in a clean, modular way (recommended)

- Create world geometry using in-game editor
- Import meshes from external 3D design tools
- Upload to master server as an asset/assets

- Extend the client and/or server

- Write plugin components in Python or scripts in cubescript
- Distribute them manually
- Examples:

- UI modifications in cubescript
- Server plugin to check memory usage
- etc.

- Extend the master server

- Write plugin components in Python
- Distribute them manually
- Examples:

- Component to store assets in Amazon S3
- Component to let people rate assets
- etc.