Your browser doesn't support the features required by impress.js, so you are presented with a simplified version of this presentation.

For the best experience please use the latest Chrome, Safari or Firefox browser.

RollOnline proposal/standard

Rolling scheme proposals:

This is for online dice pool rolling/chat app. But it should be considered as a possible online rolling standard to use.

roll channels:

  • /roll (Allows you to roll to your own private client window to set up your own roll templates/schemas. You can save these roll templates accordingly and double/right click on them to convert them to respective rolls towards different target roll channels accordingly..or you may, often as a GM or if given permissions, prompt other users online with such roll templates (as popup windows/tabs/etc.) on their screen to “poke” them to make the necessary rolls as the game flows on…)
  • /rollnow (By adding a now suffix, allows you to roll dice to current online public table slot prompted/made available by GM host, if any.)
  • /rollto (Similar to now suffix, but defers the execution of the rolling of results until later which is either triggered by GM or automated game event triggers (and the dice layout setup may be edited by GM/players) before actually rolling of the results. )
  • /gmroll /gmrollnow /gmrollto (Secretely rolls to GM. Doesn’t reveal this roll to other players at all, or indicates you actually rolled anything to other players. Simply Prefix above with gm.)

Often, rollto and rollnow would often have to conform to a particular schema/template since it rolls to the public online table, and this depends on the game setup by the GM and the current game situation. The template (and possible GUI) is clearly shown in the respective slot at the online table itself, or via popup window prompts, tabs, etc.. Additionally, usually online dice pool limits will apply to rollto and rollnow calls for each player, with the player only allowed to invest a limited number of dice into each of these rolls.

Null rolls…

Null rolls can be used to represent diceless actions or actions that are somewhat related to “dice” in concept, but have zero effective quantities.

  • /roll 0d - Dummy “null” roll to indicate rolling of “nothing” or a roll that requires 0 dice investment. Using d10/dWhatever/ie. any sided dice wouldn’t matter in this case..but it may act as further descriptio.n
  • /roll 0d0 - Strict dummy null roll of no sides.
  • /roll 0d10 - eg. Strict dummy null roll of zero “10” sided dice.

Variable rolls…

Without specifying a number prefix to the dice, you indicate rolling unknown “n” number of that respective dice.

  • /roll d10 - Roll some 10 sided dice.

Grouped/Multiple rolls…

Seperate grouped rolls with either a + or -, or optionally include = seperators between them to define explicitly seperate top-level tabulated groups, which may use the given inner +/- operators optionally (depending on the game/gm setup itself for the given roll template).

  • /roll 4d10 + 2d10 - Roll 4 10-sided dice and 2 10-sided dice
  • /roll 4d10 + 2d10 = - Roll 4 10-sided dice and 2 10-sided dice and compute results through default game scheme setup
  • /roll 4d10 + 2d10 = 3d10 = 2d10 Roll individually computed results with = seperated groups

Hidden dice results

Hide rolled dice results (can only be revealed by GM or if made allowable to specific players to “open” each individual dice), by suffixing dice with h character. Only GM can see the results.

  • /roll 4d10h - Roll 4 10 sided dice with results hidden to other players.

Hide entire portion of dice roll from other players and only GM knows about it. Suffix with

Suffix portion with gm.

  • /roll d10 + 4d10gm - Roll some 10 sided dice with the 4 10-sided dice portion hidden from other players.

Labeling dice

You can label dice by adding a colon :LabelDice after. (note: labels are not case sensitive..). Labeled dice may have their own limited dice pool quota per player for a given game, or may have their own implied number of sides/result resolution, depending on the game schema.

  • /roll d10:Red - Roll some 10 sided “Red” dice.
  • /roll d:WeirdDiceForGame - Roll some weird dice setup for a particular game called “WeirdDiceForGame”.

Describing dice

  • /roll 4d10 Jumping + 3d10 Swimming
  • /roll 4d10:Red Jumping + 3d10:Blue Swimming

Use specific target number to retrieve number of successes of rolls

Simply suffix >N to dice, where N is the specific target number.

/roll d10>7 - Rolls dice at TN 7 (target number 7, >=7)

Rolling towards target(s)

After rolling, you may add as many @ seperators to indicate who you wish to target with that roll, (the person/target zone/at something/etc.). Define detailed targeting within a specific “target” by seperating with colons :.

  • /roll 4d10 @Alfred - Roll 4 d10s towards Alfred
  • /roll 4d10 @ Alfred - Roll 4 d10s towards Alfred
  • /roll 4d10 @ Alfred : Downward Swing to Head - Roll 4 d10s towards Alfred with a Downward Swing to Head
  • /roll 4d10 @ Alfred @ John - Roll 4 d10s towards Alfred and John.

Rolling “now” in reply towards another person’s roll.

Usually, when you use rollnow/rollto @something..., many games will automatically create a rollnow/rollto reply number slot (with index number eg. #1 or #1.1 or #1.1.1 depending on the schema) towards a particular character to allow that character to respond with his own dice pool against another character’s roll.

/roll 7d10 @ Alfred.2 - Replies to Alfred with 7 D10s at number “2”.

Template tokens

To define your template variable token fields, enclose it with curly braces. Variable names are case sensitive. ANY_DICE is a reserved keyword though, allowing you to roll any combination of dice as you see fit.

  • roll d6 {varEntry1} + d10:{diceLabel} {varEntry2} @{Person} : {targetZone}
  • roll d10>{tn} {manuever} @ {Person} : {targetZone}
  • roll {ANY_DICE} {manuever} @ {Person} : {targetZone}

Optional tokens

Simply precede variable name with a question mark ?. ANY_DICE cannot be made optional though, only exception.

  • roll d6 {?desc}

Quantifiers tokens

Considering a enclosed section with square [] brackets, and subsequent regex style quantifier suffix? ANY_DICE cannot be quantified though, only exception.

Choice selection tokens

Enclosed brackets ().

  • roll 1(d6|d10) {description} - Roll 1 D6 or 1 D10 of particular description.

Roll Templates vs validations/processes

Templates don’t define validations or how the results may be processed. Validations/processes are done seperate from templates (either manually or through a seperate app-specific module) to avoid over-complicating templates. The position of the token within the prescribed Standard Roll Format and the labeling already implicitly determines what that token entails. By keeping such roll templates minimal/bare-bones, they can be better re-used for multiple games/rule-sets or re-interprated by human/AI GMs in any way he sees fit.

Likewise, whether a certain dice roll portion requires dice limits from player pool or not, is not handled by the roll template itself, but externally through the “game” itself.

Roll templates simply define the view “input structure” to use, but doesn’t contain any logic in itself.

Standard Roll Format


/rollChannel {ANY_DICE} [@ {target}]

??d## - Within {ANY_DICE}, a whole word smallcase d preceding an optional number ## (sidedness) indicates dice to roll, ie. the dice definition. ?? is optional to define specific number of dice to roll. This is further added by optional :label to indicate special dice label if needed (eg. d10:White ).
d## WholeWord - A whole word after dice indicates description of that preceding dice definition. (or may imply description fo all preceding dice definitions, this is up to personal interpretation and doesn’t concern the program)
@ - Target(s) seperator

RollOnline possible examples


Song of Swords

  • Roll for Bout Orientation /roll 1d10h:{orient} + 0d:{orientAnti}

  • Commit a Bout manuever to target with any additional dice cost (known only by GM) due to any manuever/range/misc modifiers with a given TN/rollto d10>{tn} {manuever} + d10gm cost @ {target}

  • Declare General action phase action (doesn’t require any dice roll, so use dummy 0d1 dice to represent it) towards optional target/area /rollto 0d1 {action} ?@


Ballad 3D tactics skirmish framework

A 3D Tactics sandbox framework to support the following features:

  • Free-form first/3rd person character movement in free-form 3D environment.
    • 3D ground Navmesh (phase ?>1 advanced) path click movement allowance/cost tracking
      • (Original) 3D Grid/voronoi zones (phase ?>2 advanced) generation over navmesh to facilitate highlighted movement allowance regions, approximation/cost tracking.
  • Percentage cover/concealment tracking against targets with varying methods balancing precision vs performance.
  • Covered/exposed hit locations tracking against targets with varying methods balancing precision vs performance.
  • Location-specific damage on targets
  • Hidden enemies: Camouflage/Stealth/Observation system for enemy target detection or concealment.
  • Configurable flat oriented-to-observer character/target billboards (for rapid prototyping and easy tabletop sandboxing for players, simply upload your own images/artwork/etc.)
  • Animated 3D character models and hitboxes (phase 2)
  • AI (phase ?>2 advanced)
  • Handling of Ballad of Laser Whales-related skirmish actions.

Target billboard hit location mapping:


Target humanoid billboard settings:

  • Total Humanoid Width
  • Total Humanoid Height
  • Standing Eye Level (unit or % of Humanoid Height)
  • Crouched Eye Level (unit or % of Modified Humanoid Height)
  • Prone Eye Level (unit or % of Current Humanoid Height)
  • Main body height (<= Total Body Height)
  • Torso fatness ( % of Total Body width)
  • Head fatness ( % of Total Body width)
  • Default Crouch Height (<= Total Body Height): exact unit or Auto cutoff % of remaining legs height
  • Default Prone Height (<= Total Crouch Height): exact unit or % of crouch height

Target board slices: (Convention)

Typical Main body 2D grid convention: 5 slices(vertically) x 3 columns(horizontally). (center grid column based off Torso fatness to represent Chest and Belly.)

Main body slices:

  • Head (1)
  • Chest/Arms (higher) (2)
  • Belly/Arms (lower)* (2)

Lower limb slices:

  • Legs (Upper) (1)
  • Legs (Lower) (1)

* Depending on intended pose, limps at this location may be excluded and included as part of Chest slice area instead

Determine overall percentage cover by:

  • clipped occluded visible surface area percentage
  • OR raycast over center of hit slice region and corners of it, count number of blocked rays vs visible rays optionally weighted by billboard area of each hit slice region.
  • OR raycast over entire billboard surface at fixed resolution to compare blocked rays vs non-blocked ones.

Determine covered hit locations by:

  • clipped occluded visible surface area percentage thresholds
  • OR raycast over center of hit slice region and corners of it to determine if any of them hits. (min X/5 amounts of hits according to user setting X../optionally count center hit as additional X points.etc.)

Prone sweep board volume:

When character is prone, an additional rotated/oriented sweep billboard target area is included from head tip billboard center, to tail end of prone character’s facing direction, with hit slice regions (vertical slices) for both Main body and Lower limbs, excluding Head.


Main body slices: (length makes up 4/5 of Main body: 80% height of Main body height)

  • Chest/Arms (higher) (1)
  • Belly/Arms (lower)* (1)

Lower limbs slices: (length is Total humanoid height - Main body height- 20% height of Main body height)

  • Legs (Upper) (1)
  • Legs (Lower) (1)

Hit box 3D mapping: (extended from 2D target billboard base)

Upperhead Volume
Face Side (box-side specific)
Neck Volume
Chest Side (box-side specific)
Belly Side (box-side specific)
Upper Back Side (of Chest) (box-side specific)
Lower Back Side (of Belly) (box-side specific)
Side Sides (left and right)
Hip Volume
Groin Sides (front and back)
Thigh Volume
Knee Volume
Shoulder Side (top side of Chest)
Upper Arm Volume
Elbow Sides (of elbow face of upper-arm and fore-arm respectively)
Forearm Volume
Hand Volume

Ballad of Laser Whales 3D:


PHASE 1: 3D sandbox Functionality:

  • Prototypey sandbox reusable target billboards that always face camera/observer and is sized according to volume, facing direction and intended character pose.
  • Terrain and environment.
  • HUD target 3D arc indiciators with color, flashing and angling to indicate enemies and interactions
  • Detect missile defense cover values and exposed hit locations on targets to determine chance to hit on target/various body parts/against armor, etc.
  • All Ballad actions
  • Cover and Active Defense detection availability checking for targets
  • Climbable/vaultable blocks

PHASE 2: Visual Aesthetic:

  • Standard figure 3D model biped with hit boxes to track covered hit locations (over static normalized poses: standing, crouch, prone + behaviour combinations)
  • Animation of figure 3D model poses and movement
  • Rotate body pose indepedant of camera (standing, crouch, prone) during movement
  • Location specific visual bullet tracers programmed to hit specific locations on hit box. Visual effects of weapons.
  • Full 3D model skinning/modelling
  • Foot IK solver to ensure no clipping into terrain and environment. (Either using any of the Unity built-in solutions or asset store solutions, or custom-code a basic solver like eg. )


Possible Choices are:

  • Unity (Desktop)
  • Heaps (HTML5 WebGL)
  • BabylonHX (HTML5 WebGL)
  • Alternativa3D (Flash)
  • Tabletop simulator (<- likely won’t work…too limited.)

Tactical 3D Engine Aspects:

When considering all targets while moving/aiming/shooting:

Periodic raycasts

  • Target Detection
    • Periodic random raycasts over ellipsoid point cloud, towards Hidden target during movement to determine if target remains Hidden(blocked raycast) or Potentially Detectable . Once Potentially Detectable and no longer hidden, immediately run Observation vs Stealth dice roll check against target.
  • Target No Longer Visible Detection
    • Once periodic raycast to center of Detected target while moving is blocked, raycast against all 4 corner of targeting billboard for next period (including center). If all 4 corners and center appear to be blocked, target goes back to Hidden mode for current period.

Repeated raycasts/occlusion clipping for periodic Stealth/Concealment/Cover/Hit Chance checks

  • Targeting billboard (flat bounding volume plane of target oriented in relation to observer). A conservative bounding volume plane to approximate visible targeting billboard region in relation to observer from any direction.
    • To determine this:
      • Get direction vector to target from observation eye position. Get Distance (square root once) of the squared distance of this vector, and normalize the vector to unit length.
      • Get right vector in relation to direction vector by running cross product with global Up vector vs. direction vector, and normalize it. (right-handed)
      • Get up vector in relation to direction vector by running cross product with direction vector vs. right vector (right-handed)
      • Run dot products of both right and up vectors over BOTH of scaled horizontal and vertical extents of ellipsoid, and use the resultant higher magnitude scalar as the appropiate width/height of right/up vector respectively. The horizontal extent vector, aligned perpendicular against the observer’s viewing direction, can be determined by first setting the upward component value of right vector to zero, (to “flatten” that vector direction), then re-normalizing and scaling it to match length of the horizontal extent of ellipsoid.
      • Add these vector extents to the current target center position in world space in order to get the translated positions of these extents from center position of target towards it’s corners. Thus, you’ve got the targeting billboard with all of it’s corner points, and can even create a frustum volume out of it (for culling/determining occlusion/etc.), if needed.
  • Potential occludables list vs detected target
    • Per target, collect and save all relavant potential occludable geometry by testing them with targeting billboard frustum against the following possible cases (would need to see which is best method or use combination thereof):
      • Against AABB
        • Easy-out test with closest to center of target billboard frustum AABB point (match maxD/minD components with >=0/<0 matching frustum plane normal case) and check if that given point lies fully outside one of the frustum planes.
  • Cover/Concealment Detection (For Stealth/Concealment/Chance To Hit checking) via Percentage Cover
    • by raycasting to all vertices of hitbox figure and comparing blocked raycasts over total number of hitbox vertices OR

When aiming/shooting at target:

  • Indirect Target Complications (subtract target-bound billboard by axis-aligned complicating target billboards that block main target’s targeting billboard)
    (additional complication = chance to hit other targets complicating shots). Requires at least around 50% blockage for 2RS worth of cover to ensure complication occurs.
    (For tabletop gameplay action purposes, shots may still fire through visually blocking targets…unless targets are explicitly specified as environmental obstacles as well via options/perks/player intent)

Stealth/Observation/Concealment modifiers for 3D game.


  • Lowered eye level to crouched.
  • Observation roll reduced -2 successes against targets not within your facing direction.
  • +1 RS concealment consideration at 100meters to >=150 meters.


  • Lowered eye level to prone.
  • Observation roll reduced -3 successes against targets not within your facing direction.
  • +2 RS concealment consideration at >50 meters to >=100 meters.

Concealment check requirement:

  • Consider concealment check required at >40 meters to >=50 meters.

<=3 to <=6 yards:

Consider Stealth Check not needed at all

GENERAL clipping approach for determining occlusion with multiple convex/non-convex occluders:

(To determine percentage exposure of occludee geometry, or whether occludee can be deemed fully occluded.)

Obviously, the “clipping” approach will be more computationally intensive, and isn’t needed in most cases unless you require more accuracy in determining object exposure, since the clipping method involves incrementally subtracting away visible surface area of objects to determine exposure of it. This algorithm should also work for non-convex occluders or combined groups of multiple convex/non-convex occluders.

The method, described for general case:

  • Form viewing frustum for given occludee from observer. (the occludee can be represented as a bounding convex hull, bounding box, or bounding billboard plane.) This viewing frustum involves testing against the front-faces of the occludee, and the edge side faces of the of the occludee’s outer contours towards the viewing point.
  • Get back/front-facing visibility of all faces of occluder geometry.
  • Only consider occluder’s contour geometry edges with 1 neighboring face back-facing and the other front-facing while also lying within the occludee’s viewing frustum.
  • Form view clipping planes across such geometry edges.
  • If all frustum corner points of occludee’s viewing frustum front-face(s) lie on one side of the edge’s view-clipping plane, such an edge can be skipped/removed from clip plane processing list since it won’t clip against occludee volume.
  • For edges whose points lie both in and out of the occluder’s front front-facing frustum plane(s), remember to still include the visible face of that edge as an additional clipping plane as well for processing that given edge.
  • Incremnetally clip against the occludee’s exposed face/faces for each edge. If there is no more visible face geomtry left to clip, then it is deemed the occludee is completley hidden.

Application example: Occlusion vs Terrain (tile-based):

  • Project viewing frustum towards occludee geometry.
  • Determine which terrain chunk(s) (if any) is/(are) within the frustum.
  • Project this viewing frustum (in 3D) to 2D over each terrain chunk to get a viewing triangle/trapezoid in 2D over the terrain chunk.
  • DDA grid raycast in 2D along the triangle/trapezoid’s 2D frustum edges to get the square terrain grid patches intersected by the DDA edge lines, then fill up the tiles enclosed by the edge lines.
    • To fill up the tiles enclosed by 2D frustum edge lines: When running DDA along the 2D frustum edges, for each displacement of y tile, record current min x and max x fill in each y-row buffer. Record the total minY and maxY being drawn out so far as well.
    • After that, fill up any missing inner column tiles from minx to maxX across minY to maxY rows.
  • With all “2D-visible” tile patch orthgonal edges on terrain chunk, record which triangle faces (on that patch) are visibly front-facing and which are invisbly back-facing into a buffer.
  • For terrain tile patches with a triangle face front-facing and the other triangle face side hidden as back-facing, get the diagonal edge of that terrain tile patch and deem it as a potential clipping edge if that edge lies within viewing frustum. Form the necessary view clipping plane of that clipping edge to confirm it into clipping list. Also check the “top-left” half set of 2-edges of each patch.
    • Include any additional checks if needed to ensure clipping edge does actually intersect the occludee geometry’s viewing frustum, like checking that all corner points of occludee geometry’s viewing frustum lie on either of the clipping edge plane.
    • If all corner points of occludee’s viewing frustum lie on the one side of the clipping edge plane and the edge points lie completely in front of the occludee, then no clipping is required for that particular edge.
  • Remember to also run through the last remaining edges at the “bottom-right” portions (last column edge/last row edge) respectively that were unaccounted for during “top-left” edge checking per patch, to see if there are also clip edges there that need to be considered.
  • For all valid clip edges, handle their respective clip planes accordingly to incrementally clip against the occludee’s geometry.

NOTE for chunk-based terrain:
(If using chunk-based terrain, note that each chunk buffer needs 1 tile padding to take into account face-visibility of neighboring tiles from neighboring chunks)

Ballad 3D skirmish rules

1 round of 3 phases each.


Instant Action Sub-Phase: (1 second instant action phase)

  • Aim
  • Shoot [(Single shot, Double Shot, Rapid Fire (with Run&Goone?) upon execution)]
  • Covering Fire
  • Melee Attack
  • Melee Ambush
  • Throw/Prepare Grenade
  • Reload
  • Active Defense
  • Misc (Other actions )
  • Sprint (in lieu of any actions. Remaining movement carries over to next Sub phase)

Simply declare your prefered mode of action to GM, regardless of whether you execute it or not during Instant Aciton Sub phase. Your character will change to the appropiate weapon/stance/direction automatically to hint to others what that action would likely be (Ranged, Melee, Thrown, Reloading, Misc, Sprint, etc.) and who is likely to be targeted. PER tests may be automatically applied to peek into actual nature of the declared action.

You are limited to moving 1.5 yards cap within this sub phase, or 3 yards (if sprinting), or (0.75 yards, if moving slowly).

Declared actions must be done against known targets in view, otherwise they still incur moving while shooting penalty if moving in any way to declare action on target.

Run & Gonne Sub-Phase: ( Remaining (MOB-3) allowance before declared/undeclared actions may occur)

  • Shoot (may count as undeclared* on opportunity)
  • Covering Fire (may count as undeclared* on opportunity)
  • Melee Attack (may count as undeclared* on opportunity)
  • Throw Prepared Grenade (prepared grenade must be declared beforehand)
  • Sprint (in lieu of any actions) (Doing Sprint at this stage only gives (MOB-3)*2) yards allowance.

*All undeclared actions use half base dice only.

Implied actions from 3D execution:

  • Take Cover (simply duck or prone to gain benefits from any cover, and do not declare any other actions)

Active Defense

You either receieve attacks upon breaking out of cover for too long, or if you do receive any attacks while behind cover, you gain your +ADR pool defense roll against it. You may run Active defense against a target during Instant Action Sub Phase and stay behind half cover while moving to take cover in relation to specific target’s movement.


Melee-ranged attacks:

All Melee Attacks are treated as 1-on-1 in Ballad. There are no X-vs-1 bouts in Ballad.

Any Shoot action executed within Melee range is treated as a 1-on-1 Melee Attack with the initiator having initiative, and also allows Character to react after being shot, or even steal initiative before attacking manuever is resolved (if the attack received is not Melee Ambush).

Once activated “melee-ranged” combat.. (Receives + ADR to Melee Combat Pool as Base Dice, can shoot up to max MP while in Melee against undefended, though any cover will act as RS.)

Ballad Blitz Movement during Melee and Skirmish

Determining zones of control for characters:

Add zone of control obstacles over each character, and any other characters (smaller for friends/larger obstacles for enemies or those in melee).

Alternatively, for contigous groups of characters in crowd formation (friendlies/enemies), useful for settiing up frontlines to hold, etc. set up a concave hull of these units via voronoi regions and also enclosing the outliers of the voronoi region. Run through all outlying faces being added and add them to navmesh.

Both of the above cases will influence the resulting navmesh.