BetaEngine is a 2D cross-platform point-and-click adventure game engine built with .NET 8 and MonoGame with support for native AOT compilation.
Notable components:
Beta - The engine itself.
BDSM - Beta Domain Scripting Mechanism, an interpreter for BetaScript.
ACED - ACtor EDitor, actor and scene editor.
You will need a MonoGame Project that would include the engine and setup its modules.
See Example project.
Game content will be managed with the Monogame Content Pipeline for media: images, fonts, etc.
Other game content should be copied to the output directory under Content, but will not be managed by the pipeline:
- scripts/
- resources/
Content like scenes and actors is generated by ACED that must target the game project.
ACED will place media files as well as data files under resources/ and scripts/
The scripts for the engine are written in a domain-specific interpreted language called BetaScript.
BetaScript is neither a general purpose nor a good programming language, it is bs.
BetaScript is dynamically typed. BetaScript has no support for collection data types.
BetaScript does not support the 'this' keyword, nor is it able to defer 'this' from context, because it is bs.
BetaScript is an instance-oriented language, in a sense that declaring any complex entity, like an actor or a scene is equivalent to instancing it for the duration of program runtime. This and other design decisions stem from the fact that it is bs.
scene myScene {
var music = "theme"
var name = "My Scene"
fun onEnter() {
}
fun exit(index) {
// Optionally check if we can exit depending
// on exit index.
return true
}
prop myProp "Example Prop" {
verb LOOK {
player.say("That's an example")
}
verb INTERACT {
player.say("That's an example")
}
verb TALK {
player.say("That's an example")
}
verb PICKUP {
player.say("That's an example")
}
verb USE item {
player.say("That's an example")
}
}
region myRegion {
fun onEnter() {
// Do something
}
}
}
actor player {
var name = "My Player"
var color = "#ffa366" // Dialogue color
var someState = 42
verb LOOK {
player.say("What are you looking at?")
}
verb PICKUP {
player.say("What are you looking at?")
}
verb TALK {
player.say("What are you looking at?")
}
fun update() {
// Optionally do something
}
verb USE something {
player.say("I'm using something on myself.")
}
}
Main script can then be:
import "myScene.bs"
import "player.bs"
setscene(myScene)
setplayer(player)
requeststateplaying()
A list of standard library functions can be found under BDSM/StandardLibrary/stdapi.txt
Charlie Spotlight is an example game that uses this engine. Available as a Steam demo.
This project is made possible by the following open-source projects: