Skip to content

Latest commit

 

History

History
executable file
·
152 lines (102 loc) · 3.67 KB

File metadata and controls

executable file
·
152 lines (102 loc) · 3.67 KB

Overview

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.

Getting Started

You will need a MonoGame Project that would include the engine and setup its modules.

See Example project.

Adding Content

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/

BS Programming

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.

Describing a scene

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
        }
    }
}

Describing an actor

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

Example Games

Charlie Spotlight is an example game that uses this engine. Available as a Steam demo.

❤️ Built With

This project is made possible by the following open-source projects: