https://github.com/rustyscreeps/screeps-starter-rust
Starter Rust AI for Screeps, the JavaScript-based MMO game
https://github.com/rustyscreeps/screeps-starter-rust
rust screeps wasm
Last synced: 3 months ago
JSON representation
Starter Rust AI for Screeps, the JavaScript-based MMO game
- Host: GitHub
- URL: https://github.com/rustyscreeps/screeps-starter-rust
- Owner: rustyscreeps
- License: mit
- Created: 2018-03-01T17:30:41.000Z (over 8 years ago)
- Default Branch: main
- Last Pushed: 2025-04-09T20:19:51.000Z (about 1 year ago)
- Last Synced: 2025-04-09T21:28:24.241Z (about 1 year ago)
- Topics: rust, screeps, wasm
- Language: Rust
- Size: 55.7 KB
- Stars: 130
- Watchers: 6
- Forks: 48
- Open Issues: 7
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# screeps-starter-rust
Starter Rust AI for [Screeps: World][screeps], the JavaScript-based MMO game.
This uses the [`screeps-game-api`] bindings from the [rustyscreeps] organization.
[`wasm-pack`] is used for building the Rust code to WebAssembly. This example uses [Rollup] to
bundle the resulting javascript, [Babel] to transpile generated code for compatibility with older
Node.js versions running on the Screeps servers, and the [`screeps-api`] Node.js package to deploy.
Documentation for the Rust version of the game APIs is at https://docs.rs/screeps-game-api/.
Almost all crates on https://crates.io/ are usable (only things which interact with OS
apis are broken).
## Quickstart:
```sh
# Install rustup: https://rustup.rs/
# Install wasm-pack
cargo install wasm-pack
# Install wasm-opt
cargo install wasm-opt
# Install Node.js for build steps - versions 16 through 22 have been tested, any should work
# nvm is recommended but not required to manage the install, follow instructions at:
# Mac/Linux: https://github.com/nvm-sh/nvm
# Windows: https://github.com/coreybutler/nvm-windows
# Installs Node.js at version 20
# (all versions within LTS support should work;
# 20 is recommended due to some observed problems on Windows systems using 22)
nvm install 20
nvm use 20
# Clone the starter
git clone https://github.com/rustyscreeps/screeps-starter-rust.git
cd screeps-starter-rust
# note: if you customize the name of the crate, you'll need to update the MODULE_NAME
# variable in the js_src/main.js file and the module import with the updated name, as well
# as the "name" in the package.json
# Install dependencies for JS build
npm install
# Copy the example config, and set up at least one deployment mode.
cp .example-screeps.yaml .screeps.yaml
nano .screeps.yaml
# compile for a configured server but don't upload
npm run deploy -- --server ptr --dryrun
# compile and upload to a configured server
npm run deploy -- --server mmo
```
## Migration to 0.22
Versions of [`screeps-game-api`] at 0.22 or higher are no longer compatible with the
[`cargo-screeps`] tool for building and deployment; the transpile step being handled by [Babel] is
required to transform the generated JS into code that the game servers can load.
To migrate an existing bot to using the new JavaScript translation layer and deploy script:
- Create a `.screeps.yaml` with the relevant settings from your `screeps.toml` file applied to the
new `.example-screeps.yaml` example file in this repo.
- Add to your `.gitignore`: `.screeps.yaml`, `node_modules`, and `dist`
- Create a `package.json` copied from the one in this repo and make appropriate customizations.
- Importantly, if you've modified your module name from `screeps-starter-rust` to something else,
you need to update the `name` field in `package.json` to be your bot's name.
- Install Node.js (from the quickstart steps above), then run `npm install` from within the bot
directory to install the required packages.
- Copy the `deploy.js` script over to a new `js_tools` directory.
- Add `main.js` to a new `js_src` directory, either moved from your existing `javascript` dir and
updated, or freshly copied.
- If updating, you'll need to change:
- Import formatting, particularly for the wasm module.
- wasm module initialization has changed, requiring two calls to first compile the module,
then to initialize the instance of the module.
- Whether updating or copying fresh, if you've modified your bot name from `screeps-starter-rust`
you'll need to update the bot package import and `MODULE_NAME` at the beginning of `main.js`
to be your updated bot name.
- Update your `Cargo.toml` with version `0.22` for `screeps-game-api`
- Run `npm run deploy -- --server ptr --dryrun` to compile for PTR, remove the `--dryrun` to deploy
### Troubleshooting
#### Error: Not Authorized
If you encounter an error like the following:
```
Error: Not Authorized
at ScreepsAPI.req (PATH_TO_YOUR_BOT/node_modules/screeps-api/dist/ScreepsAPI.js:1212:17)
at process.processTicksAndRejections (node:internal/process/task_queues:105:5)
at async ScreepsAPI.auth (PATH_TO_YOUR_BOT/node_modules/screeps-api/dist/ScreepsAPI.js:1162:17)
at async ScreepsAPI.fromConfig (PATH_TO_YOUR_BOT/node_modules/screeps-api/dist/ScreepsAPI.js:1394:9)
at async upload (PATH_TO_YOUR_BOT/js_tools/deploy.js:148:17)
at async run (PATH_TO_YOUR_BOT/js_tools/deploy.js:163:3
```
Then the password in your `.screeps.yaml` file is getting picked up as something aside from a string. Passwords sent to the server must be a string. Wrap it in quotes: `password: "12345"`
#### Error: Unknown module
If you encounter an error like the following:
```
Error: Unknown module 'bot-name-here'
at Object.requireFn (:20897:23)
at Object.module.exports.loop (main:933:33)
at __mainLoop:1:52
at __mainLoop:2:3
at Object.exports.evalCode (:15381:76)
at Object.exports.run (:20865:24)
```
You need to make sure you update your `package.json` `name` field to be your bot name.
#### CompileError: WebAssembly.Module(): Invalid opcode
If you encounter an error like the following:
```
CompileError: WebAssembly.Module(): Compiling wasm function #327:core::unicode::printable::check::h9ddbb57eb721c858 failed: Invalid opcode (enable with --experimental-wasm-se) @+257876
at Object.module.exports.loop (main:934:35)
at __mainLoop:1:52
at __mainLoop:2:3
at Object.exports.evalCode (:15381:76)
at Object.exports.run (:20865:24)
```
You need to update your `Cargo.toml` to include the `--signext-lowering` flag for `wasm-opt`. For example:
```
[package.metadata.wasm-pack.profile.release]
wasm-opt = ["-O4", "--signext-lowering"]
```
[screeps]: https://screeps.com/
[`wasm-pack`]: https://rustwasm.github.io/wasm-pack/
[Rollup]: https://rollupjs.org/
[Babel]: https://babeljs.io/
[`screeps-api`]: https://github.com/screepers/node-screeps-api
[`screeps-game-api`]: https://github.com/rustyscreeps/screeps-game-api/
[`cargo-screeps`]: https://github.com/rustyscreeps/cargo-screeps/
[rustyscreeps]: https://github.com/rustyscreeps/