# Bevy Engine Users
The purpose of this document is to help us evaluate designs for the Bevy Editor by identifying:
+ Who is going to use the editor,
+ How they will expect it to work,
+ What they will want to do with it,
+ And whether or not we need to support that use-case.
This isn't intended to be super prescriptive: it's just a basic tool for prioritization and talking about our users.
## Overview
In general, we have two broad categories of users:
+ **Technical Users**: Users who are comfortable with rust. Programmers, in short.
+ **Non-Technical Users**: Users who are not comfortable with rust. Artists, Writers, Game Designers. They may know basic programming, but they are not Programmers.
These people may work as individuals or in teams. The main difference between teams is size:
+ **Individuals**: Don't have to worry much about versioning or collaboration. Their time is precious, so they are concerned about ergonomics and development speed. They hate things that feel slow, tedious, or repetitive.
+ **Small Teams**: Say teams or 2 to 20. Prioritize specialization and diversity of workflows. Everyone on their team is going to use the editor in a different way, for a different reason.
+ **Large Teams**: Teams of 20 or more. Prioritize management, control, correctness, and collaboration. Large teams worry about version conflicts, corrupting data, and irreversible changes.
Teams and users are **Commercial** (as opposed to **Non-Commercial**) if they have funding for their work, or plan to use Bevy to make money.
One of the other key difference between teams is their willingness to hack bevy's internals:
+ **Mainline Teams**: Uses the latest or stable release of Bevy, and uses the mainline editor.
+ **Patching Teams**: Ships mainline, but is willing to submit patches to the engine or editor.
+ **Forking Teams**: Maintains their own fork of either the engine or the editor.
Users can be further differentiated according to many other less general aspects:
+ Their reasons for using bevy, and the goal they want to accomplish.
+ Their concerns and goals while using the editor.
+ Their level of experience with the engine or editor.
+ Their level of expertise in their own discipline; game design, art, programming, etc.
+ What other tools they use in their development process.
+ How frequently they use the editor.
+ Whether they prefer coding or graphical user interfaces in a given context.
+ How much they enjoy writing Rust (many skilled programmers do not).
+ Whether they choose to use bevy or are forced to by external constraints.
## Current User-base
Bevy has a large user-base of of **Non-Commercial Technical Individuals** (hobbyist programmers). Most of these people are **Mainline**, using the most recent release of bevy as a dependency. They do not build the engine from source, modify the engine internals, or submit patches to the repo.
We have a smaller set of **Forking/Patching Technical Individuals** (engine contributors). These are mostly **Non-Commercial** as well, and work on bevy in their spare time. One of Bevy's greatest strengths is that "Bevy App developers are Bevy Engine developers, they just don't know it yet," which means this set of users is porous and constantly expanding.
There are a small number of **Commercial Technical Individuals** like Dustin Deweese (Noumental) and Pressing Thumbs Games (Times of Progress). Dustin is **Forking**, and upstreams mainline changes to his private branches. Pressing Thumbs is keeps **Mainline**.
We have basically no **Non-Technical Individuals** currently. But that's to be expected; it's a code-forward engine.
Moving on to teams, we've got more diversity. **Non-commercial** teams seem to be uniformly **Mainline**. They don't have the resources to fiddle with the engine or editor. Most **Commercial** teams seem to be **Patching** or **Mainline**, including Foresight and Dead Money (Architect of Ruin). This is likely due to our non-existent legacy support and our policy of not back-porting critical patches to older versions; a hard fork is not an easy thing to maintain. One notable exception is Pounce Light (Tiny Glade) who went **Forking** very early on (to great success).
## Prioritization
For the MVP, we are going to focus on supporting:
+ Small to midsized **Commercial Teams** (2 to 20 people),
+ Who are either **Forking** or **Patching**
+ And who have a mix of **Technical Users** and **Non-Technical Users**.
I'm going to call people from these sorts of teams *Category A*.
Why focus on these people? First of all, it is commercial teams that ship most games and provide the bulk of the Bevy Foundation's funding. It's also commercial teams where you will currently find most **Non-Technical Users**. And **Forking/Patching** teams specifically are able to provide support and customization for their **Non-Technical** members, a burden that would otherwise would fall to us. These teams are also the most likely to contribute patches to the editor once they start using it.
So what shouldn't we prioritize? Bevy is explicitly not targeted at **Non-Technical Individuals**; someone on your team needs to know rust to use bevy.
The remaining group, **Mainline Technical Users** and their **Non-Technical Teammates**, are a second-class priority. Features that support these users are good; but it's not what we should focus on. I'm going to call these people *Category B*.
## Preliminary Conclusions
Here are some general conclusions about category A.
+ The Editor is for both technical and non-technical people.
+ We can expect non-technical people to rely on their technical team-members for support.
+ Much like bevy itself, technical editor users are editor contributors.
+ The editor source code must be easy and friendly to fork and modify.
+ The editor does not need to be modifiable or extensible *at run-time* however.
+ The editor expects to operate in a cargo workspace, and for rust tooling to be installed.
+ But it should be fairly easy for Non-Technicals to install the editor along with the rust tooling.
+ And it should be easy for Technical Users to package and deploy custom forks of the editor.
+ It should be easy to fork the editor without having to fork bevy.
## User Workflows
Now let's imagine a few little teams of this sort, and follow along as they go about their work. This is a slight adaption of the typical "User Stories" which is better suited to making broad technical decisions.
### Lynn and Kate
We'll start with simple two-person game studio: Lynn (programmer/level-designer) and Kate (artist/writer/level-designer). Lynn is great with rust, Kate has some programming experience but not in rust. Both know how to use version control. Neither has used Bevy before.
### Puzzle Platformer
Our two-person studio is designing a 2d puzzle-platformer, the exact mechanics of which are not important.
The first thing Lynn has to do is install bevy and the editor on both of their machines, set up a project, and check it into version control.
> This screams *template* to me. It's probably fine to ship this as a command line tool, since it's Lynn's job to do this part. Not something we need for a prototype, but important for the MVP.
Meanwhile, Kate makes a sprite-sheet for different tiles. They check it in to version control, and wait for Lynn to show them how to start making maps.
Lynn decides to add `bevy_ecs_tilemap` to the project and does some very minimal setup. Then she opens the editor, because she wants to make a test-map to learn about how queries work.
> Ideally, she should be greeted by an editor that knows about the important components defined by `bevy_ecs_tilemap`.
What Lynn needs to do next is spawn an entity with a `TileMapBundle` (or the `bsn` equivalent).
> How does she do this? More importantly, how does she know she needs to do this?
Let's assume the `TileMapBundle` she spawns is empty. She selects the tile map entity so she can edit it.
> Perhaps she clicks on it in some sort of hierarchy explorer? It won't be visible yet.
She is presented with a widget that shows the different properties of the components on that entity. She configures things like the size, shape, and transform, and connects up Kate's sprite-sheet as a texture.
> How does Lynn get feedback that what she is doing is correct? Pcwalton suggests loading a serialized form of `Schematic` data from the main app.
Now Lynn wants to add some tiles to the tile-sheet. This is complicated; `bevy_ecs_tilemap` contains an index, which records the position of different entities. She discovers that she has to spawn each tile entity manually, then go and update the index with it's position before it shows up.
> Obviously this isn't ideal, but for the purposes of this user-story let's assume `bevy_ecs_tilemap` has no extra editor support; it's just a WYSIWYG editor for entities and components.
Lynn gets frustrated. But she has heard that Bevy's editor is supposed to be painlessly extensible, so she clones the editor repo, asks for help on discord, and it's not long before she has extended the editor with a widget that lets you spawn and position a tile in a single step.
> I'm going to end it here, with the question: How does Lynn get her widget onto Kate's computer? Does she compile a binary and send it to her, or does she check the editor into a new repo (maybe even the game repo?) and let Kate build it?
## Editor's Note
The existing team is supposed to represent a pair of expert game devs who are new to Bevy, and want to evaluate it for their next project.
In future, I'd like to do another pass on their personas. I'd also like to think about the following cohorts
+ Expert programmers who are new to Game Dev and Bevy. (We have to ask ourselves, why are they here?)
+ People who dislike Rust but who try bevy because they like the ECS design. (credit pcwalton)
+ People who are interested in using our advanced rendering features, but who may not be very interested in rust or bevy. (credit pcwalton)
+ People creating mods for some Bevy game who are using Bevy in anger. (credit pcwalton)
+ Students/novices/complete beginners. (credit IQuick)
+ Researchers/arcademics who want to use bevy as a research platform.
+ Participants in a game jam.
Obviously, not all of these groups should be prioritized; but it is good to consider as broad and diverse a user-base as possible. People *always* always find unexpected ways to use software.
I would also like to add some consideration of commercial/funded vs non-commercial groups to the overview section. In some sense, I think it really is commercial groups the editor aught to target initially, if only because we need more sources of funding the non-profit.
Please feel free to modify this document however you see fit.