Rifles in the Peninsula | Mission Generator

Version 0.1
Mission Type
Enemy Army


This page requires a HTML5-capable web browser. If you are seeing this message for more than an instant after loading the page, it's because initialization of the application is not finished, which means that either this app is not compatible with your browser or initialization is taking unusually long. More information about the error may (or may not) be available in your browser's so-called "development tools". In compatible browsers, however, it's likely that this message disappeared long before you could read to the end of this paragraph.

Select the desired configuration options then use the [Generate Mission] button to create a PDF with the mission details. It will be shown in the Mission tab, where it can previewed before downloading it.

Use the buttons at the top of the page to switch between tabs/views: Docs, Mission, About.

New options appear once a mission has been generated:

  • The [Toggle preview mode] button toggles between plain text, JSON, and PDF preview. Not all browsers support embedded PDF previews.
  • The [Rebuild PDF] button feeds the same mission data through the PDF generator, and is useful when you want to change the font size without generating a new mission.

The generated mission can be previewed and downloaded from the Mission tab. The filename can be customized using the filename configuration field in that tab:

  • MM and DD get replaced by the current month and day.
  • YY and YYYY get replaced by the current year with 2 or 4 digits, respectively.
  • ## gets replaced by a random 5-digit number.
  • The following placeholders correspond to mission configuration options:
    • %D = mission difficulty
    • %M = mission type
    • %T = mission terrain

The JSON Editor can be used to edit the specifics of a mission. See the JSON Docs tab for a description of the various JSON properties.

Predefined formats:

(Using the embedded PDF viewer's Save button will download a randomly-generated filename!)

Rifles in the... is a series of single-player war games by Gottardo Zancani. More information about them can be found via...

This mission generator is made available as a service to Rifles players, but without any warranty or guarantees of future availability or usability.

Mission generator TODOs include, in no particular order...

  • JSON export/import. Most of the bits for this are in place.
  • "Responsive" HTML layout (mobile-friendly).
  • Potentially a mini-map view. This first requires that we come up with a syntax for explaining mission details, including random factors, in a way the computer can understand (as opposed to natural text).
  • Export to epub might be interesting, but is low-priority.
  • ...
Messages from the editor will appear here.

Mission JSON Format Docs

This section provides a description of the JSON format used by this mission generator/editor tool. It assumes some knowledge of JSON and does not describe the specifics of JSON in general, only the data elements used by this tool and the semantics it applies to them.

A mission is made up of a single top-level Object with many or all of the properties described in the following sections. The easiest way to see these in action is to use the "Generate Mission" feature, then toggle the preview mode to "JSON". Once a mission is generated, it can also be imported into the JSON Editor and browsed or manipulated from there.

The String & Numeric Fields

The following list describes the "basic" mission properties: those defined as a single string or numeric value.

  • missionSchemaVersion (integer, required): this describes the version number of the mission JSON format. It must currently be set to 1. If/when the format changes this number will be incremented. A mission without this field is not a valid mission object and the app may refuse to import it via the JSON editor.
  • name (string, required): the brief name of the mission (e.g. "Attack on Blueberry Hill").
  • objective (string, required): a description of the mission's objective. May be arbitrarily long.
  • setup (string, required): a description of the mission's setup instructions. May be arbitrarily long.
  • turnLimit (integer, optional): the number of turns permitted by the scenario.
  • specialRules (string, optional): description of mission-specific rules.
  • specialEquipment (string, optional): description of any mission-specific equipment.
  • support (string, optional): description of any friendly support, e.g. off-board artillery or reinforcements.
  • supportLabel (string, optional): a brief, descriptive label for the support, e.g. "Platoon Support" or "Friendly Forces". If not set, but support is, then a generic default is used.
  • terrainRules (string, optional): description of mission-specific terrain rules.
  • difficulty (string, optional): this is used by the app to modify generated missions, but is not required for hand-written scenarios. Values: EASY, NORMAL, HARD.
  • missionType (string, optional): a single-word description of the mission type. This is primarily used by automated mission generators, and is not required for hand-written missions. In technical terms, if provided, this value should (must?) correspond to one of the RiTA.missionGenerators entries (which can be installed via RiTA.installMission().
  • terrainType (string, optional): a single-word description of the mission's overall terrain tendency. This is primarily used by automated mission generators and is not strictly required by hand-written missions. Currenly used values include (but may not be limited to): URBAN, COUNTRY, BEACH.
  • theater (string, optional (mostly)): a one-word string describing the theater of operations. This must be "PTO" for the Pacific theater and "ETO" for the European theater. This is used by mission generators to tweak terrain tables but is not needed for hand-written missions.
  • author (string, optional): an optional string containing the author's information (whatever the author cares to include). It should be kept brief, e.g. a name and URL, but not a paragraph. This field, if set to a truthy value, is used as the Author property of the mission's generated PDF, and any given PDF view may or may not limit the visible length of the value.
  • lastUpdated (date string, optional): An ISO-8601-format date string in any of these formats: YYYY-MM-DD, YYYY-MM-DD HH:MM, YYYY-MM-DD HH:MM:SS. It may optionally have a timezone offset, but timestamps for this application are not considered significant enough to warrant that level of detail: YYYY-MM-DD will suffice for almost all cases. It is up to the person editing the JSON to set this because the Rita JSON editor component cannot truly distinguish when a mission's data has "really" been modified.

Event Table

The events list has a unique structure in the mission data. It is an array of strings describing the mission's Event tokens, but has one unconventional atttribute: the first element in the array (i.e. at index zero) is not used. The reason for this is so that the game's event numbers match up with the array index holding them, which reduces cognitive dissonance while hand-coding mission generator functions. It remains to be seen whether it will cause more confusion than it saves in the JSON format ;). Any element in the first array position (zero'th index) is ignored by the mission generator app, so index 0 can hypothetically be used to store anything the mission creator likes. Any elements in indexes after the 0th which are set to a "falsy" value (false, null, undefined, empty string, or zero) are rendered as "Nothing" (or something semantically equivalent) in the generated document.

Here's an example event table:

[ null, /* the 0th element is IGNORED so that Event numbers correspond to their array index! */ "Place the |Objective| in Stripe #1. Place the Defending Units as a single Group in Stripe #1", "Place the |Objective| in Stripe #1. Place the Defending Units as a single Group in Stripe #1", "Place the |Objective| in Stripe #2. Place the Defending Units as a single Group in Stripe #2", null, /* null (any "falsy" value) renders as "Nothing" (or similar) */ null, "Roll on [Patrol Table] on the Army Sheet", "Roll on [Patrol Table] on the Army Sheet", "Enemy: two Rifles on {Tree}" ]


Much of the information for a Rita mission is presented in the form of tables, and most of these use an identical JSON structure, internally called "RitaTable":

{ header: "header text", lines: [ "list", "of", "strings (one per line of the table)" ] }

All of the mission elements described below use this structure. The lines array property has a few formatting options which apply to most of the tables:

  • Lines starting with a ! are output in bold.
  • Lines starting with a single space are output indented a standardized amount. To simplify editing, most of the standard tables get indented automatically, regardless of this space! In particular, customTables entries require this formatting option if they should be indented.
  • Use a starting ! followed by a space to get an indented bold line. (Exception: the standard terrainTable field uses its own bolding rules, described below.)

The following is a list of all RitaTable fields, none of which are required (and all of which are demonstrated in detail in the app's automatically-generated missions)...

  • enemyPresenceTable: Each line lists a die roll result or range and the enemy unit(s) which appear(s) for that result. This table's lines are automatically indented.
  • enemyActivationTable: Each line lists a die roll result or range and a description of how the enemy unit(s) react for that result. This table's lines are automatically indented.
  • enemyForcesTable: Each line lists a die roll result or range and the enemy unit(s) which appear(s) as a result. This table's lines are automatically indented.
  • targetTable: this free-form table typically has a top section describing which group of the player's units will be targeted and a second second describing which unit(s) in that group will be targeted. This table is not automatically indented - use the RitaTable formatting conventions to format it.
  • terrainTable: this table lists which terrain goes into which Stripes and conventionally follows the following pattern:
    { "header": "My Terrain", "lines": [ "Stripes #1 and #2: (1-2) Open (3-5) Woods (6) Fields)", "Stripe #3: (1-4) Open with {Hill} (5-6) Woods with {Hill}", "Stripe #4: (1-2) Open (3-5) {Trees} (6) {Building}", "Stripes #5 and #6: (1-2) Open (3-4) Woods (5-6) {Building}" ] }

    (The numbers in parenthesis refer to die roll results.) This table has the following peculiarities vis-a-vis the other tables:

    • The text of each line up to and including the first colon gets bolded, but everything after that is not bold. The ! formatting flag (bold) is ignored for this table.
    • As a general rule (but this really depends on the context), if this table is not set on a mission which is passed through the mission generator then a terrain table with certain random elements will be automatically injected into it. (That does not apply when a mission is its own mission generator nor when a mission is fed directly from the editor to the document renderer (both topics out of scope here for the time being).) To suppress automatic generation of such a table entirely, set its value to false.
  • customTables: this is an array of RitaTables containing any mission-specific tabular information the creator desires. They are output to the generated document in the order they appear in the array. They are not automatically indented - use the RitaTable formatting conventions to format them.

That about covers it! The easiest way to become familiar with the data is to allow the app to generate a mission, then peruse its JSON data via the JSON preview mode or the JSON editor tab.