From 4b80394be8c432afa8534d78846d95f6dfffda14 Mon Sep 17 00:00:00 2001 From: Frank Force Date: Mon, 12 Aug 2024 12:14:18 -0500 Subject: [PATCH] update docs --- docs/Audio.html | 2 +- docs/Color.html | 2 +- docs/Debug.html | 2 +- docs/Draw.html | 2 +- docs/Engine.html | 2 +- docs/EngineObject.html | 2 +- docs/FontImage.html | 2 +- docs/Input.html | 2 +- docs/Music.html | 2 +- docs/Particle.html | 2 +- docs/Settings.html | 2 +- docs/Sound.html | 2 +- docs/TextureInfo.html | 2 +- docs/TileCollision.html | 2 +- docs/TileInfo.html | 2 +- docs/Utilities.html | 2 +- docs/WebGL.html | 2 +- docs/data/search.json | 2 +- docs/engine.js.html | 89 ++++++++++++++++++----------------- docs/engineAudio.js.html | 29 ++++++++---- docs/engineDebug.js.html | 6 ++- docs/engineDraw.js.html | 42 ++++++++--------- docs/engineInput.js.html | 48 ++++++++++++------- docs/engineMedals.js.html | 2 +- docs/engineObject.js.html | 4 +- docs/engineParticles.js.html | 21 +++++---- docs/engineSettings.js.html | 6 +-- docs/engineTileLayer.js.html | 4 +- docs/engineUtilities.js.html | 8 ++-- docs/engineWebGL.js.html | 8 +--- docs/examples/logo.png | Bin 15537 -> 15636 bytes docs/examples/screenshot.jpg | Bin 158756 -> 151932 bytes 32 files changed, 163 insertions(+), 140 deletions(-) diff --git a/docs/Audio.html b/docs/Audio.html index 30ca6fc7..43698e1c 100644 --- a/docs/Audio.html +++ b/docs/Audio.html @@ -1,3 +1,3 @@ Namespace: Audio
On this page

Audio

LittleJS Audio System

  • ZzFX Sound Effects - ZzFX Sound Effect Generator
  • ZzFXM Music - ZzFXM Music System
  • Caches sounds and music for fast playback
  • Can attenuate and apply stereo panning to sounds
  • Ability to play mp3, ogg, and wave files
  • Speech synthesis functions

Members

(static) audioContext :AudioContext

Audio context used by the engine

Type:
  • AudioContext

(static, constant) zzfxR

Sample rate used for all ZzFX sounds

Default Value
  • 44100

Methods

(static) getNoteFrequency(semitoneOffset, rootFrequencyopt) → {Number}

Get frequency of a note on a musical scale

Parameters:
NameTypeAttributesDefaultDescription
semitoneOffsetNumber

How many semitones away from the root note

rootFrequencyNumber<optional>
220

Frequency at semitone offset 0

Returns:
  • The frequency of the note
Type: 
Number

(static) playAudioFile(url, volumeopt, loopopt) → {HTMLAudioElement}

Play an mp3, ogg, or wav audio from a local file or url

Parameters:
NameTypeAttributesDefaultDescription
urlString

Location of sound file to play

volumeNumber<optional>
1

How much to scale volume by

loopBoolean<optional>
false

True if the music should loop

Returns:
  • The audio element for this sound
Type: 
HTMLAudioElement

(static) playSamples(sampleChannels, volumeopt, rateopt, panopt, loopopt, sampleRateopt) → {AudioBufferSourceNode}

Play cached audio samples with given settings

Parameters:
NameTypeAttributesDefaultDescription
sampleChannelsArray

Array of arrays of samples to play (for stereo playback)

volumeNumber<optional>
1

How much to scale volume by

rateNumber<optional>
1

The playback rate to use

panNumber<optional>
0

How much to apply stereo panning

loopBoolean<optional>
false

True if the sound should loop when it reaches the end

sampleRateNumber<optional>
44100

Sample rate for the sound

Returns:
  • The audio node of the sound played
Type: 
AudioBufferSourceNode

(static) speak(text, languageopt, volumeopt, rateopt, pitchopt) → {SpeechSynthesisUtterance}

Speak text with passed in settings

Parameters:
NameTypeAttributesDefaultDescription
textString

The text to speak

languageString<optional>

The language/accent to use (examples: en, it, ru, ja, zh)

volumeNumber<optional>
1

How much to scale volume by

rateNumber<optional>
1

How quickly to speak

pitchNumber<optional>
1

How much to change the pitch by

Returns:
  • The utterance that was spoken
Type: 
SpeechSynthesisUtterance

(static) speakStop()

Stop all queued speech

(static) zzfx(…zzfxSound) → {AudioBufferSourceNode}

Generate and play a ZzFX sound

Create sounds using the ZzFX Sound Designer.

Parameters:
NameTypeAttributesDescription
zzfxSoundArray<repeatable>

Array of ZzFX parameters, ex. [.5,.5]

Returns:
  • The audio node of the sound played
Type: 
AudioBufferSourceNode

(static) zzfxG(volumeopt, randomnessopt, frequencyopt, attackopt, sustainopt, releaseopt, shapeopt, shapeCurveopt, slideopt, deltaSlideopt, pitchJumpopt, pitchJumpTimeopt, repeatTimeopt, noiseopt, modulationopt, bitCrushopt, delayopt, sustainVolumeopt, decayopt, tremoloopt, filteropt) → {Array}

Generate samples for a ZzFX sound

Parameters:
NameTypeAttributesDefaultDescription
volumeNumber<optional>
1

Volume scale (percent)

randomnessNumber<optional>
0.05

How much to randomize frequency (percent Hz)

frequencyNumber<optional>
220

Frequency of sound (Hz)

attackNumber<optional>
0

Attack time, how fast sound starts (seconds)

sustainNumber<optional>
0

Sustain time, how long sound holds (seconds)

releaseNumber<optional>
0.1

Release time, how fast sound fades out (seconds)

shapeNumber<optional>
0

Shape of the sound wave

shapeCurveNumber<optional>
1

Squarenes of wave (0=square, 1=normal, 2=pointy)

slideNumber<optional>
0

How much to slide frequency (kHz/s)

deltaSlideNumber<optional>
0

How much to change slide (kHz/s/s)

pitchJumpNumber<optional>
0

Frequency of pitch jump (Hz)

pitchJumpTimeNumber<optional>
0

Time of pitch jump (seconds)

repeatTimeNumber<optional>
0

Resets some parameters periodically (seconds)

noiseNumber<optional>
0

How much random noise to add (percent)

modulationNumber<optional>
0

Frequency of modulation wave, negative flips phase (Hz)

bitCrushNumber<optional>
0

Resamples at a lower frequency in (samples*100)

delayNumber<optional>
0

Overlap sound with itself for reverb and flanger effects (seconds)

sustainVolumeNumber<optional>
1

Volume level for sustain (percent)

decayNumber<optional>
0

Decay time, how long to reach sustain after attack (seconds)

tremoloNumber<optional>
0

Trembling effect, rate controlled by repeat time (precent)

filterNumber<optional>
0

Filter cutoff frequency, positive for HPF, negative for LPF (Hz)

Returns:
  • Array of audio samples
Type: 
Array

(static) zzfxM(instruments, patterns, sequence, BPMopt) → {Array}

Generate samples for a ZzFM song with given parameters

Parameters:
NameTypeAttributesDefaultDescription
instrumentsArray

Array of ZzFX sound paramaters

patternsArray

Array of pattern data

sequenceArray

Array of pattern indexes

BPMNumber<optional>
125

Playback speed of the song in BPM

Returns:
  • Left and right channel sample data
Type: 
Array
\ No newline at end of file +
On this page

Audio

LittleJS Audio System

  • ZzFX Sound Effects - ZzFX Sound Effect Generator
  • ZzFXM Music - ZzFXM Music System
  • Caches sounds and music for fast playback
  • Can attenuate and apply stereo panning to sounds
  • Ability to play mp3, ogg, and wave files
  • Speech synthesis functions

Members

(static) audioContext :AudioContext

Audio context used by the engine

Type:
  • AudioContext

(static) audioSuspended :Boolean

Keep track if audio was suspended when last sound was played

Type:
  • Boolean

(static, constant) zzfxR

Sample rate used for all ZzFX sounds

Default Value
  • 44100

Methods

(static) getNoteFrequency(semitoneOffset, rootFrequencyopt) → {Number}

Get frequency of a note on a musical scale

Parameters:
NameTypeAttributesDefaultDescription
semitoneOffsetNumber

How many semitones away from the root note

rootFrequencyNumber<optional>
220

Frequency at semitone offset 0

Returns:
  • The frequency of the note
Type: 
Number

(static) playAudioFile(filename, volumeopt, loopopt) → {HTMLAudioElement}

Play an mp3, ogg, or wav audio from a local file or url

Parameters:
NameTypeAttributesDefaultDescription
filenameString

Location of sound file to play

volumeNumber<optional>
1

How much to scale volume by

loopBoolean<optional>
false

True if the music should loop

Returns:
  • The audio element for this sound
Type: 
HTMLAudioElement

(static) playSamples(sampleChannels, volumeopt, rateopt, panopt, loopopt, sampleRateopt) → {AudioBufferSourceNode}

Play cached audio samples with given settings

Parameters:
NameTypeAttributesDefaultDescription
sampleChannelsArray

Array of arrays of samples to play (for stereo playback)

volumeNumber<optional>
1

How much to scale volume by

rateNumber<optional>
1

The playback rate to use

panNumber<optional>
0

How much to apply stereo panning

loopBoolean<optional>
false

True if the sound should loop when it reaches the end

sampleRateNumber<optional>
44100

Sample rate for the sound

Returns:
  • The audio node of the sound played
Type: 
AudioBufferSourceNode

(static) speak(text, languageopt, volumeopt, rateopt, pitchopt) → {SpeechSynthesisUtterance}

Speak text with passed in settings

Parameters:
NameTypeAttributesDefaultDescription
textString

The text to speak

languageString<optional>

The language/accent to use (examples: en, it, ru, ja, zh)

volumeNumber<optional>
1

How much to scale volume by

rateNumber<optional>
1

How quickly to speak

pitchNumber<optional>
1

How much to change the pitch by

Returns:
  • The utterance that was spoken
Type: 
SpeechSynthesisUtterance

(static) speakStop()

Stop all queued speech

(static) zzfx(…zzfxSound) → {AudioBufferSourceNode}

Generate and play a ZzFX sound

Create sounds using the ZzFX Sound Designer.

Parameters:
NameTypeAttributesDescription
zzfxSoundArray<repeatable>

Array of ZzFX parameters, ex. [.5,.5]

Returns:
  • The audio node of the sound played
Type: 
AudioBufferSourceNode

(static) zzfxG(volumeopt, randomnessopt, frequencyopt, attackopt, sustainopt, releaseopt, shapeopt, shapeCurveopt, slideopt, deltaSlideopt, pitchJumpopt, pitchJumpTimeopt, repeatTimeopt, noiseopt, modulationopt, bitCrushopt, delayopt, sustainVolumeopt, decayopt, tremoloopt, filteropt) → {Array}

Generate samples for a ZzFX sound

Parameters:
NameTypeAttributesDefaultDescription
volumeNumber<optional>
1

Volume scale (percent)

randomnessNumber<optional>
0.05

How much to randomize frequency (percent Hz)

frequencyNumber<optional>
220

Frequency of sound (Hz)

attackNumber<optional>
0

Attack time, how fast sound starts (seconds)

sustainNumber<optional>
0

Sustain time, how long sound holds (seconds)

releaseNumber<optional>
0.1

Release time, how fast sound fades out (seconds)

shapeNumber<optional>
0

Shape of the sound wave

shapeCurveNumber<optional>
1

Squarenes of wave (0=square, 1=normal, 2=pointy)

slideNumber<optional>
0

How much to slide frequency (kHz/s)

deltaSlideNumber<optional>
0

How much to change slide (kHz/s/s)

pitchJumpNumber<optional>
0

Frequency of pitch jump (Hz)

pitchJumpTimeNumber<optional>
0

Time of pitch jump (seconds)

repeatTimeNumber<optional>
0

Resets some parameters periodically (seconds)

noiseNumber<optional>
0

How much random noise to add (percent)

modulationNumber<optional>
0

Frequency of modulation wave, negative flips phase (Hz)

bitCrushNumber<optional>
0

Resamples at a lower frequency in (samples*100)

delayNumber<optional>
0

Overlap sound with itself for reverb and flanger effects (seconds)

sustainVolumeNumber<optional>
1

Volume level for sustain (percent)

decayNumber<optional>
0

Decay time, how long to reach sustain after attack (seconds)

tremoloNumber<optional>
0

Trembling effect, rate controlled by repeat time (precent)

filterNumber<optional>
0

Filter cutoff frequency, positive for HPF, negative for LPF (Hz)

Returns:
  • Array of audio samples
Type: 
Array

(static) zzfxM(instruments, patterns, sequence, BPMopt) → {Array}

Generate samples for a ZzFM song with given parameters

Parameters:
NameTypeAttributesDefaultDescription
instrumentsArray

Array of ZzFX sound paramaters

patternsArray

Array of pattern data

sequenceArray

Array of pattern indexes

BPMNumber<optional>
125

Playback speed of the song in BPM

Returns:
  • Left and right channel sample data
Type: 
Array
\ No newline at end of file diff --git a/docs/Color.html b/docs/Color.html index 84589b8a..a0c04a1d 100644 --- a/docs/Color.html +++ b/docs/Color.html @@ -1,3 +1,3 @@ Class: Color
On this page

Color

Color object (red, green, blue, alpha) with some helpful functions

Constructor

new Color(ropt, gopt, bopt, aopt)

Create a color with the rgba components passed in, white by default

Parameters:
NameTypeAttributesDefaultDescription
rNumber<optional>
1

red

gNumber<optional>
1

green

bNumber<optional>
1

blue

aNumber<optional>
1

alpha

Example
let a = new Color;              // white
let b = new Color(1, 0, 0);     // red
let c = new Color(0, 0, 0, 0);  // transparent black
let d = rgb(0, 0, 1);           // blue using rgb color
let e = hsl(.3, 1, .5);         // green using hsl color

Members

a

Properties
TypeDescription
Number

Alpha

b

Properties
TypeDescription
Number

Blue

g

Properties
TypeDescription
Number

Green

r

Properties
TypeDescription
Number

Red

Methods

add(c) → {Color}

Returns a copy of this color plus the color passed in

Parameters:
NameTypeDescription
cColor

other color

Returns:
Type: 
Color

clamp() → {Color}

Returns a copy of this color clamped to the valid range between 0 and 1

Returns:
Type: 
Color

copy() → {Color}

Returns a new color that is a copy of this

Returns:
Type: 
Color

divide(c) → {Color}

Returns a copy of this color divided by the color passed in

Parameters:
NameTypeDescription
cColor

other color

Returns:
Type: 
Color

getHSLA() → {Array}

Returns this color expressed in hsla format

Returns:
Type: 
Array

lerp(c, percent) → {Color}

Returns a new color that is p percent between this and the color passed in

Parameters:
NameTypeDescription
cColor

other color

percentNumber
Returns:
Type: 
Color

multiply(c) → {Color}

Returns a copy of this color times the color passed in

Parameters:
NameTypeDescription
cColor

other color

Returns:
Type: 
Color

mutate(amountopt, alphaAmountopt) → {Color}

Returns a new color that has each component randomly adjusted

Parameters:
NameTypeAttributesDefaultDescription
amountNumber<optional>
0.05
alphaAmountNumber<optional>
0
Returns:
Type: 
Color

rgbaInt() → {Number}

Returns this color expressed as 32 bit RGBA value

Returns:
Type: 
Number

scale(scale, alphaScaleopt) → {Color}

Returns a copy of this color scaled by the value passed in, alpha can be scaled separately

Parameters:
NameTypeAttributesDefaultDescription
scaleNumber
alphaScaleNumber<optional>
scale
Returns:
Type: 
Color

setHSLA(hopt, sopt, lopt, aopt) → {Color}

Sets this color given a hue, saturation, lightness, and alpha

Parameters:
NameTypeAttributesDefaultDescription
hNumber<optional>
0

hue

sNumber<optional>
0

saturation

lNumber<optional>
1

lightness

aNumber<optional>
1

alpha

Returns:
Type: 
Color

setHex(hex) → {Color}

Set this color from a hex code

Parameters:
NameTypeDescription
hexString

html hex code

Returns:
Type: 
Color

subtract(c) → {Color}

Returns a copy of this color minus the color passed in

Parameters:
NameTypeDescription
cColor

other color

Returns:
Type: 
Color

toString(useAlphaopt) → {String}

Returns this color expressed as a hex color code

Parameters:
NameTypeAttributesDefaultDescription
useAlphaBoolean<optional>
true

if alpha should be included in result

Returns:
Type: 
String
\ No newline at end of file +
On this page

Color

Color object (red, green, blue, alpha) with some helpful functions

Constructor

new Color(ropt, gopt, bopt, aopt)

Create a color with the rgba components passed in, white by default

Parameters:
NameTypeAttributesDefaultDescription
rNumber<optional>
1

red

gNumber<optional>
1

green

bNumber<optional>
1

blue

aNumber<optional>
1

alpha

Example
let a = new Color;              // white
let b = new Color(1, 0, 0);     // red
let c = new Color(0, 0, 0, 0);  // transparent black
let d = rgb(0, 0, 1);           // blue using rgb color
let e = hsl(.3, 1, .5);         // green using hsl color

Members

a

Properties
TypeDescription
Number

Alpha

b

Properties
TypeDescription
Number

Blue

g

Properties
TypeDescription
Number

Green

r

Properties
TypeDescription
Number

Red

Methods

HSLA() → {Array}

Returns this color expressed in hsla format

Returns:
Type: 
Array

add(c) → {Color}

Returns a copy of this color plus the color passed in

Parameters:
NameTypeDescription
cColor

other color

Returns:
Type: 
Color

clamp() → {Color}

Returns a copy of this color clamped to the valid range between 0 and 1

Returns:
Type: 
Color

copy() → {Color}

Returns a new color that is a copy of this

Returns:
Type: 
Color

divide(c) → {Color}

Returns a copy of this color divided by the color passed in

Parameters:
NameTypeDescription
cColor

other color

Returns:
Type: 
Color

lerp(c, percent) → {Color}

Returns a new color that is p percent between this and the color passed in

Parameters:
NameTypeDescription
cColor

other color

percentNumber
Returns:
Type: 
Color

multiply(c) → {Color}

Returns a copy of this color times the color passed in

Parameters:
NameTypeDescription
cColor

other color

Returns:
Type: 
Color

mutate(amountopt, alphaAmountopt) → {Color}

Returns a new color that has each component randomly adjusted

Parameters:
NameTypeAttributesDefaultDescription
amountNumber<optional>
0.05
alphaAmountNumber<optional>
0
Returns:
Type: 
Color

rgbaInt() → {Number}

Returns this color expressed as 32 bit RGBA value

Returns:
Type: 
Number

scale(scale, alphaScaleopt) → {Color}

Returns a copy of this color scaled by the value passed in, alpha can be scaled separately

Parameters:
NameTypeAttributesDefaultDescription
scaleNumber
alphaScaleNumber<optional>
scale
Returns:
Type: 
Color

setHSLA(hopt, sopt, lopt, aopt) → {Color}

Sets this color given a hue, saturation, lightness, and alpha

Parameters:
NameTypeAttributesDefaultDescription
hNumber<optional>
0

hue

sNumber<optional>
0

saturation

lNumber<optional>
1

lightness

aNumber<optional>
1

alpha

Returns:
Type: 
Color

setHex(hex) → {Color}

Set this color from a hex code

Parameters:
NameTypeDescription
hexString

html hex code

Returns:
Type: 
Color

subtract(c) → {Color}

Returns a copy of this color minus the color passed in

Parameters:
NameTypeDescription
cColor

other color

Returns:
Type: 
Color

toString(useAlphaopt) → {String}

Returns this color expressed as a hex color code

Parameters:
NameTypeAttributesDefaultDescription
useAlphaBoolean<optional>
true

if alpha should be included in result

Returns:
Type: 
String
\ No newline at end of file diff --git a/docs/Debug.html b/docs/Debug.html index 0d8c1349..4b4cdf8a 100644 --- a/docs/Debug.html +++ b/docs/Debug.html @@ -1,3 +1,3 @@ Namespace: Debug
On this page

Debug

LittleJS Debug System

  • Press Esc to show debug overlay with mouse pick
  • Number keys toggle debug functions
  • +/- apply time scale
  • Debug primitive rendering
  • Save a 2d canvas as a png image

Members

(static, constant) debug :Boolean

True if debug is enabled

Type:
  • Boolean
Default Value
  • true

(static) debugKey :String

Key code used to toggle debug mode, Esc by default

Type:
  • String
Default Value
  • Escape

(static) debugOverlay :Boolean

True if the debug overlay is active, always false in release builds

Type:
  • Boolean

(static, constant) debugPointSize :Number

Size to render debug points by default

Type:
  • Number
Default Value
  • 0.5

(static, constant) enableAsserts :Boolean

True if asserts are enaled

Type:
  • Boolean
Default Value
  • true

(static) showWatermark :Boolean

True if watermark with FPS should be shown, false in release builds

Type:
  • Boolean
Default Value
  • true

Methods

(static) ASSERT(assert, outputopt)

Asserts if the experssion is false, does not do anything in release builds

Parameters:
NameTypeAttributesDescription
assertBoolean
outputObject<optional>

(static) debugAABB(pA, sA, pB, sB, coloropt)

Draw a debug axis aligned bounding box in world space

Parameters:
NameTypeAttributesDescription
pAVector2

position A

sAVector2

size A

pBVector2

position B

sBVector2

size B

colorString<optional>

(static) debugCircle(pos, radiusopt, coloropt, timeopt, fillopt)

Draw a debug circle in world space

Parameters:
NameTypeAttributesDefaultDescription
posVector2
radiusNumber<optional>
0
colorString<optional>
#fff
timeNumber<optional>
0
fillBoolean<optional>
false

(static) debugClear()

Clear all debug primitives in the list

(static) debugLine(posA, posB, coloropt, thicknessopt, timeopt)

Draw a debug line in world space

Parameters:
NameTypeAttributesDefaultDescription
posAVector2
posBVector2
colorString<optional>
thicknessNumber<optional>
0.1
timeNumber<optional>

(static) debugPoint(pos, coloropt, timeopt, angleopt)

Draw a debug point in world space

Parameters:
NameTypeAttributesDescription
posVector2
colorString<optional>
timeNumber<optional>
angleNumber<optional>

(static) debugRect(pos, sizeopt, coloropt, timeopt, angleopt, fillopt)

Draw a debug rectangle in world space

Parameters:
NameTypeAttributesDefaultDescription
posVector2
sizeVector2<optional>
Vector2()
colorString<optional>
#fff
timeNumber<optional>
0
angleNumber<optional>
0
fillBoolean<optional>
false

(static) debugSaveCanvas(canvas, filenameopt, typeopt)

Save a canvas to disk

Parameters:
NameTypeAttributesDefaultDescription
canvasHTMLCanvasElement
filenameString<optional>
typeString<optional>
image/png

(static) debugSaveDataURL(dataURL, filename)

Save a data url to disk

Parameters:
NameTypeDescription
dataURLString
filenameString

(static) debugSaveText(text, filenameopt, typeopt)

Save a text file to disk

Parameters:
NameTypeAttributesDefaultDescription
textString
filenameString<optional>
typeString<optional>
text/plain

(static) debugText(text, pos, sizeopt, coloropt, timeopt, angleopt, fontopt)

Draw a debug axis aligned bounding box in world space

Parameters:
NameTypeAttributesDefaultDescription
textString
posVector2
sizeNumber<optional>
1
colorString<optional>
#fff
timeNumber<optional>
0
angleNumber<optional>
0
fontString<optional>
monospace

(static) setDebugKey(key)

Set key code used to toggle debug mode, Esc by default

Parameters:
NameTypeDescription
keyString

(static) setShowWatermark(show)

Set if watermark with FPS should be shown

Parameters:
NameTypeDescription
showBoolean
\ No newline at end of file +
On this page

Debug

LittleJS Debug System

  • Press Esc to show debug overlay with mouse pick
  • Number keys toggle debug functions
  • +/- apply time scale
  • Debug primitive rendering
  • Save a 2d canvas as a png image

Members

(static, constant) debug :Boolean

True if debug is enabled

Type:
  • Boolean
Default Value
  • true

(static) debugKey :String

Key code used to toggle debug mode, Esc by default

Type:
  • String
Default Value
  • Escape

(static) debugOverlay :Boolean

True if the debug overlay is active, always false in release builds

Type:
  • Boolean

(static, constant) debugPointSize :Number

Size to render debug points by default

Type:
  • Number
Default Value
  • 0.5

(static, constant) enableAsserts :Boolean

True if asserts are enaled

Type:
  • Boolean
Default Value
  • true

(static) showWatermark :Boolean

True if watermark with FPS should be shown, false in release builds

Type:
  • Boolean
Default Value
  • true

Methods

(static) ASSERT(assert, outputopt)

Asserts if the expression is false, does not do anything in release builds

Parameters:
NameTypeAttributesDescription
assertBoolean
outputObject<optional>

(static) debugAABB(pA, sA, pB, sB, coloropt)

Draw a debug axis aligned bounding box in world space

Parameters:
NameTypeAttributesDescription
pAVector2

position A

sAVector2

size A

pBVector2

position B

sBVector2

size B

colorString<optional>

(static) debugCircle(pos, radiusopt, coloropt, timeopt, fillopt)

Draw a debug circle in world space

Parameters:
NameTypeAttributesDefaultDescription
posVector2
radiusNumber<optional>
0
colorString<optional>
#fff
timeNumber<optional>
0
fillBoolean<optional>
false

(static) debugClear()

Clear all debug primitives in the list

(static) debugLine(posA, posB, coloropt, thicknessopt, timeopt)

Draw a debug line in world space

Parameters:
NameTypeAttributesDefaultDescription
posAVector2
posBVector2
colorString<optional>
thicknessNumber<optional>
0.1
timeNumber<optional>

(static) debugPoint(pos, coloropt, timeopt, angleopt)

Draw a debug point in world space

Parameters:
NameTypeAttributesDescription
posVector2
colorString<optional>
timeNumber<optional>
angleNumber<optional>

(static) debugRect(pos, sizeopt, coloropt, timeopt, angleopt, fillopt)

Draw a debug rectangle in world space

Parameters:
NameTypeAttributesDefaultDescription
posVector2
sizeVector2<optional>
Vector2()
colorString<optional>
#fff
timeNumber<optional>
0
angleNumber<optional>
0
fillBoolean<optional>
false

(static) debugSaveCanvas(canvas, filenameopt, typeopt)

Save a canvas to disk

Parameters:
NameTypeAttributesDefaultDescription
canvasHTMLCanvasElement
filenameString<optional>
typeString<optional>
image/png

(static) debugSaveDataURL(dataURL, filename)

Save a data url to disk

Parameters:
NameTypeDescription
dataURLString
filenameString

(static) debugSaveText(text, filenameopt, typeopt)

Save a text file to disk

Parameters:
NameTypeAttributesDefaultDescription
textString
filenameString<optional>
typeString<optional>
text/plain

(static) debugText(text, pos, sizeopt, coloropt, timeopt, angleopt, fontopt)

Draw a debug axis aligned bounding box in world space

Parameters:
NameTypeAttributesDefaultDescription
textString
posVector2
sizeNumber<optional>
1
colorString<optional>
#fff
timeNumber<optional>
0
angleNumber<optional>
0
fontString<optional>
monospace

(static) setDebugKey(key)

Set key code used to toggle debug mode, Esc by default

Parameters:
NameTypeDescription
keyString

(static) setShowWatermark(show)

Set if watermark with FPS should be shown

Parameters:
NameTypeDescription
showBoolean
\ No newline at end of file diff --git a/docs/Draw.html b/docs/Draw.html index e097720c..c38c6ccb 100644 --- a/docs/Draw.html +++ b/docs/Draw.html @@ -1,3 +1,3 @@ Namespace: Draw
On this page

Draw

LittleJS Drawing System

  • Hybrid system with both Canvas2D and WebGL available
  • Super fast tile sheet rendering with WebGL
  • Can apply rotation, mirror, color and additive color
  • Font rendering system with built in engine font
  • Many useful utility functions

LittleJS uses a hybrid rendering solution with the best of both Canvas2D and WebGL. There are 3 canvas/contexts available to draw to... mainCanvas - 2D background canvas, non WebGL stuff like tile layers are drawn here. glCanvas - Used by the accelerated WebGL batch rendering system. overlayCanvas - Another 2D canvas that appears on top of the other 2 canvases.

The WebGL rendering system is very fast with some caveats...

  • Switching blend modes (additive) or textures causes another draw call which is expensive in excess
  • Group additive rendering together using renderOrder to mitigate this issue

The LittleJS rendering solution is intentionally simple, feel free to adjust it for your needs!

Members

(static) mainCanvas :HTMLCanvasElement

The primary 2D canvas visible to the user

Type:
  • HTMLCanvasElement

(static) mainCanvasSize :Vector2

The size of the main canvas (and other secondary canvases)

Type:

(static) mainContext :CanvasRenderingContext2D

2d context for mainCanvas

Type:
  • CanvasRenderingContext2D

(static) overlayCanvas :HTMLCanvasElement

A canvas that appears on top of everything the same size as mainCanvas

Type:
  • HTMLCanvasElement

(static) overlayContext :CanvasRenderingContext2D

2d context for overlayCanvas

Type:
  • CanvasRenderingContext2D

(static) textureInfos :Array

Array containing texture info for batch rendering system

Type:
  • Array

Methods

(static) drawCanvas2D(pos, size, angle, mirror, drawFunction, screenSpaceopt, contextopt)

Draw directly to a 2d canvas context in world space

Parameters:
NameTypeAttributesDefaultDescription
posVector2
sizeVector2
angleNumber
mirrorBoolean
drawFunctionfunction
screenSpaceBoolean<optional>
false
contextCanvasRenderingContext2D<optional>
mainContext

(static) drawLine(posA, posB, thicknessopt, coloropt, useWebGLopt, screenSpaceopt, contextopt)

Draw colored line between two points

Parameters:
NameTypeAttributesDefaultDescription
posAVector2
posBVector2
thicknessNumber<optional>
0.1
colorColor<optional>
(1,1,1,1)
useWebGLBoolean<optional>
glEnable
screenSpaceBoolean<optional>
false
contextCanvasRenderingContext2D<optional>

(static) drawPoly(points, coloropt, screenSpaceopt, contextopt)

Draw colored polygon using passed in points

Parameters:
NameTypeAttributesDefaultDescription
pointsArray

Array of Vector2 points

colorColor<optional>
(1,1,1,1)
screenSpaceBoolean<optional>
false
contextCanvasRenderingContext2D<optional>
mainContext

(static) drawRect(pos, sizeopt, coloropt, angleopt, useWebGLopt, screenSpaceopt, contextopt)

Draw colored rect centered on pos

Parameters:
NameTypeAttributesDefaultDescription
posVector2
sizeVector2<optional>
(1,1)
colorColor<optional>
(1,1,1,1)
angleNumber<optional>
useWebGLBoolean<optional>
glEnable
screenSpaceBoolean<optional>
false
contextCanvasRenderingContext2D<optional>

(static) drawText(text, pos, sizeopt, coloropt, lineWidthopt, lineColoropt, textAlignopt, fontopt, contextopt)

Draw text on overlay canvas in world space Automatically splits new lines into rows

Parameters:
NameTypeAttributesDefaultDescription
textString
posVector2
sizeNumber<optional>
1
colorColor<optional>
(1,1,1,1)
lineWidthNumber<optional>
0
lineColorColor<optional>
(0,0,0,1)
textAlignCanvasTextAlign<optional>
'center'
fontString<optional>
fontDefault
contextCanvasRenderingContext2D<optional>
overlayContext

(static) drawTextScreen(text, pos, sizeopt, coloropt, lineWidthopt, lineColoropt, textAlignopt, fontopt, contextopt)

Draw text on overlay canvas in screen space Automatically splits new lines into rows

Parameters:
NameTypeAttributesDefaultDescription
textString
posVector2
sizeNumber<optional>
1
colorColor<optional>
(1,1,1,1)
lineWidthNumber<optional>
0
lineColorColor<optional>
(0,0,0,1)
textAlignCanvasTextAlign<optional>
center
fontString<optional>
fontDefault
contextCanvasRenderingContext2D<optional>
overlayContext

(static) drawTile(pos, sizeopt, tileInfoopt, coloropt, angleopt, mirroropt, additiveColoropt, useWebGLopt, screenSpaceopt, contextopt)

Draw textured tile centered in world space, with color applied if using WebGL

Parameters:
NameTypeAttributesDefaultDescription
posVector2

Center of the tile in world space

sizeVector2<optional>
(1,1)

Size of the tile in world space

tileInfoTileInfo<optional>

Tile info to use, untextured if undefined

colorColor<optional>
(1,1,1,1)

Color to modulate with

angleNumber<optional>
0

Angle to rotate by

mirrorBoolean<optional>

If true image is flipped along the Y axis

additiveColorColor<optional>
(0,0,0,0)

Additive color to be applied

useWebGLBoolean<optional>
glEnable

Use accelerated WebGL rendering

screenSpaceBoolean<optional>
false

If true the pos and size are in screen space

contextCanvasRenderingContext2D<optional>

Canvas 2D context to draw to

(static) isFullscreen() → {Boolean}

Returns true if fullscreen mode is active

Returns:
Type: 
Boolean

(static) screenToWorld(screenPos) → {Vector2}

Convert from screen to world space coordinates

Parameters:
NameTypeDescription
screenPosVector2
Returns:
Type: 
Vector2

(static) setBlendMode(additiveopt, useWebGLopt, contextopt)

Enable normal or additive blend mode

Parameters:
NameTypeAttributesDefaultDescription
additiveBoolean<optional>
useWebGLBoolean<optional>
glEnable
contextCanvasRenderingContext2D<optional>
mainContext

(static) tile(posopt, sizeopt, textureIndexopt) → {TileInfo}

Create a tile info object

  • This can take vecs or floats for easier use and conversion
  • If an index is passed in, the tile size and index will determine the position
Parameters:
NameTypeAttributesDefaultDescription
posNumber | Vector2<optional>
(0,0)

Top left corner of tile in pixels or index

sizeNumber | Vector2<optional>
tileSizeDefault

Size of tile in pixels

textureIndexNumber<optional>
0

Texture index to use

Returns:
Type: 
TileInfo
Example
tile(2)                       // a tile at index 2 using the default tile size of 16
tile(5, 8)                    // a tile at index 5 using a tile size of 8
tile(1, 16, 3)                // a tile at index 1 of size 16 on texture 3
tile(vec2(4,8), vec2(30,10))  // a tile at pixel location (4,8) with a size of (30,10)

(static) toggleFullscreen()

Toggle fullsceen mode

(static) worldToScreen(worldPos) → {Vector2}

Convert from world to screen space coordinates

Parameters:
NameTypeDescription
worldPosVector2
Returns:
Type: 
Vector2
\ No newline at end of file +
On this page

Draw

LittleJS Drawing System

  • Hybrid system with both Canvas2D and WebGL available
  • Super fast tile sheet rendering with WebGL
  • Can apply rotation, mirror, color and additive color
  • Font rendering system with built in engine font
  • Many useful utility functions

LittleJS uses a hybrid rendering solution with the best of both Canvas2D and WebGL. There are 3 canvas/contexts available to draw to... mainCanvas - 2D background canvas, non WebGL stuff like tile layers are drawn here. glCanvas - Used by the accelerated WebGL batch rendering system. overlayCanvas - Another 2D canvas that appears on top of the other 2 canvases.

The WebGL rendering system is very fast with some caveats...

  • Switching blend modes (additive) or textures causes another draw call which is expensive in excess
  • Group additive rendering together using renderOrder to mitigate this issue

The LittleJS rendering solution is intentionally simple, feel free to adjust it for your needs!

Members

(static) mainCanvas :HTMLCanvasElement

The primary 2D canvas visible to the user

Type:
  • HTMLCanvasElement

(static) mainCanvasSize :Vector2

The size of the main canvas (and other secondary canvases)

Type:

(static) mainContext :CanvasRenderingContext2D

2d context for mainCanvas

Type:
  • CanvasRenderingContext2D

(static) overlayCanvas :HTMLCanvasElement

A canvas that appears on top of everything the same size as mainCanvas

Type:
  • HTMLCanvasElement

(static) overlayContext :CanvasRenderingContext2D

2d context for overlayCanvas

Type:
  • CanvasRenderingContext2D

(static) textureInfos :Array

Array containing texture info for batch rendering system

Type:
  • Array

Methods

(static) drawCanvas2D(pos, size, angle, mirror, drawFunction, screenSpaceopt, contextopt)

Draw directly to a 2d canvas context in world space

Parameters:
NameTypeAttributesDefaultDescription
posVector2
sizeVector2
angleNumber
mirrorBoolean
drawFunctionfunction
screenSpaceBoolean<optional>
false
contextCanvasRenderingContext2D<optional>
mainContext

(static) drawLine(posA, posB, thicknessopt, coloropt, useWebGLopt, screenSpaceopt, contextopt)

Draw colored line between two points

Parameters:
NameTypeAttributesDefaultDescription
posAVector2
posBVector2
thicknessNumber<optional>
0.1
colorColor<optional>
(1,1,1,1)
useWebGLBoolean<optional>
glEnable
screenSpaceBoolean<optional>
false
contextCanvasRenderingContext2D<optional>

(static) drawRect(pos, sizeopt, coloropt, angleopt, useWebGLopt, screenSpaceopt, contextopt)

Draw colored rect centered on pos

Parameters:
NameTypeAttributesDefaultDescription
posVector2
sizeVector2<optional>
(1,1)
colorColor<optional>
(1,1,1,1)
angleNumber<optional>
useWebGLBoolean<optional>
glEnable
screenSpaceBoolean<optional>
false
contextCanvasRenderingContext2D<optional>

(static) drawText(text, pos, sizeopt, coloropt, lineWidthopt, lineColoropt, textAlignopt, fontopt, contextopt)

Draw text on overlay canvas in world space Automatically splits new lines into rows

Parameters:
NameTypeAttributesDefaultDescription
textString
posVector2
sizeNumber<optional>
1
colorColor<optional>
(1,1,1,1)
lineWidthNumber<optional>
0
lineColorColor<optional>
(0,0,0,1)
textAlignCanvasTextAlign<optional>
'center'
fontString<optional>
fontDefault
contextCanvasRenderingContext2D<optional>
overlayContext

(static) drawTextScreen(text, pos, sizeopt, coloropt, lineWidthopt, lineColoropt, textAlignopt, fontopt, contextopt)

Draw text on overlay canvas in screen space Automatically splits new lines into rows

Parameters:
NameTypeAttributesDefaultDescription
textString
posVector2
sizeNumber<optional>
1
colorColor<optional>
(1,1,1,1)
lineWidthNumber<optional>
0
lineColorColor<optional>
(0,0,0,1)
textAlignCanvasTextAlign<optional>
center
fontString<optional>
fontDefault
contextCanvasRenderingContext2D<optional>
overlayContext

(static) drawTile(pos, sizeopt, tileInfoopt, coloropt, angleopt, mirroropt, additiveColoropt, useWebGLopt, screenSpaceopt, contextopt)

Draw textured tile centered in world space, with color applied if using WebGL

Parameters:
NameTypeAttributesDefaultDescription
posVector2

Center of the tile in world space

sizeVector2<optional>
(1,1)

Size of the tile in world space

tileInfoTileInfo<optional>

Tile info to use, untextured if undefined

colorColor<optional>
(1,1,1,1)

Color to modulate with

angleNumber<optional>
0

Angle to rotate by

mirrorBoolean<optional>

If true image is flipped along the Y axis

additiveColorColor<optional>
(0,0,0,0)

Additive color to be applied

useWebGLBoolean<optional>
glEnable

Use accelerated WebGL rendering

screenSpaceBoolean<optional>
false

If true the pos and size are in screen space

contextCanvasRenderingContext2D<optional>

Canvas 2D context to draw to

(static) getCameraSize() → {Vector2}

Get the camera's visible area in world space

Returns:
Type: 
Vector2

(static) isFullscreen() → {Boolean}

Returns true if fullscreen mode is active

Returns:
Type: 
Boolean

(static) screenToWorld(screenPos) → {Vector2}

Convert from screen to world space coordinates

Parameters:
NameTypeDescription
screenPosVector2
Returns:
Type: 
Vector2

(static) setBlendMode(additiveopt, useWebGLopt, contextopt)

Enable normal or additive blend mode

Parameters:
NameTypeAttributesDefaultDescription
additiveBoolean<optional>
useWebGLBoolean<optional>
glEnable
contextCanvasRenderingContext2D<optional>
mainContext

(static) tile(posopt, sizeopt, textureIndexopt) → {TileInfo}

Create a tile info object

  • This can take vecs or floats for easier use and conversion
  • If an index is passed in, the tile size and index will determine the position
Parameters:
NameTypeAttributesDefaultDescription
posNumber | Vector2<optional>
(0,0)

Top left corner of tile in pixels or index

sizeNumber | Vector2<optional>
tileSizeDefault

Size of tile in pixels

textureIndexNumber<optional>
0

Texture index to use

Returns:
Type: 
TileInfo
Example
tile(2)                       // a tile at index 2 using the default tile size of 16
tile(5, 8)                    // a tile at index 5 using a tile size of 8
tile(1, 16, 3)                // a tile at index 1 of size 16 on texture 3
tile(vec2(4,8), vec2(30,10))  // a tile at pixel location (4,8) with a size of (30,10)

(static) toggleFullscreen()

Toggle fullsceen mode

(static) worldToScreen(worldPos) → {Vector2}

Convert from world to screen space coordinates

Parameters:
NameTypeDescription
worldPosVector2
Returns:
Type: 
Vector2
\ No newline at end of file diff --git a/docs/Engine.html b/docs/Engine.html index 7053eb5a..16ca90cd 100644 --- a/docs/Engine.html +++ b/docs/Engine.html @@ -1,3 +1,3 @@ Namespace: Engine
On this page

Engine

LittleJS - The Tiny JavaScript Game Engine That Can! MIT License - Copyright 2021 Frank Force

Engine Features

  • Object oriented system with base class engine object
  • Base class object handles update, physics, collision, rendering, etc
  • Engine helper classes and functions like Vector2, Color, and Timer
  • Super fast rendering system for tile sheets
  • Sound effects audio with zzfx and music with zzfxm
  • Input processing system with gamepad and touchscreen support
  • Tile layer rendering and collision system
  • Particle effect system
  • Medal system tracks and displays achievements
  • Debug tools and debug rendering system
  • Post processing effects
  • Call engineInit() to start it up!

Members

(static, constant) engineName :String

Name of engine

Type:
  • String
Default Value
  • LittleJS

(static) engineObjects :Array

Array containing all engine objects

Type:
  • Array

(static) engineObjectsCollide :Array

Array containing only objects that are set to collide with other objects this frame (for optimization)

Type:
  • Array

(static, constant) engineVersion :String

Version of engine

Type:
  • String
Default Value
  • 1.9.2

(static) frame :Number

Current update frame, used to calculate time

Type:
  • Number

(static, constant) frameRate :Number

Frames per second to update objects

Type:
  • Number
Default Value
  • 60

(static) paused :Boolean

Is the game paused? Causes time and objects to not be updated

Type:
  • Boolean
Default Value
  • false

(static) time :Number

Current engine time since start in seconds, derived from frame

Type:
  • Number

(static, constant) timeDelta :Number

How many seconds each frame lasts, engine uses a fixed time step

Type:
  • Number
Default Value
  • 1/60

(static) timeReal :Number

Actual clock time since start in seconds (not affected by pause or frame rate clamping)

Type:
  • Number

Methods

(static) engineInit(gameInit, gameUpdate, gameUpdatePost, gameRender, gameRenderPost, imageSourcesopt)

Start up LittleJS engine with your callback functions

Parameters:
NameTypeAttributesDefaultDescription
gameInitfunction

Called once after the engine starts up, setup the game

gameUpdatefunction

Called every frame at 60 frames per second, handle input and update the game state

gameUpdatePostfunction

Called after physics and objects are updated, setup camera and prepare for render

gameRenderfunction

Called before objects are rendered, draw any background effects that appear behind objects

gameRenderPostfunction

Called after objects are rendered, draw effects or hud that appear above all objects

imageSourcesArray<optional>
['tiles.png']

Image to load

(static) engineObjectsCallback(posopt, sizeopt, callbackFunctionopt, objectsopt)

Triggers a callback for each object within a given area

Parameters:
NameTypeAttributesDefaultDescription
posVector2<optional>

Center of test area

sizeNumber | Vector2<optional>

Radius of circle if float, rectangle size if Vector2

callbackFunctionfunction<optional>

Calls this function on every object that passes the test

objectsArray<optional>
engineObjects

List of objects to check

(static) engineObjectsDestroy()

Destroy and remove all objects

(static) engineObjectsUpdate()

Update each engine object, remove destroyed objects, and update time

(static) setPaused(isPaused)

Set if game is paused

Parameters:
NameTypeDescription
isPausedBoolean
\ No newline at end of file +
On this page

Engine

LittleJS - The Tiny Fast JavaScript Game Engine MIT License - Copyright 2021 Frank Force

Engine Features

  • Object oriented system with base class engine object
  • Base class object handles update, physics, collision, rendering, etc
  • Engine helper classes and functions like Vector2, Color, and Timer
  • Super fast rendering system for tile sheets
  • Sound effects audio with zzfx and music with zzfxm
  • Input processing system with gamepad and touchscreen support
  • Tile layer rendering and collision system
  • Particle effect system
  • Medal system tracks and displays achievements
  • Debug tools and debug rendering system
  • Post processing effects
  • Call engineInit() to start it up!

Members

(static, constant) engineName :String

Name of engine

Type:
  • String
Default Value
  • LittleJS

(static) engineObjects :Array

Array containing all engine objects

Type:
  • Array

(static) engineObjectsCollide :Array

Array with only objects set to collide with other objects this frame (for optimization)

Type:
  • Array

(static, constant) engineVersion :String

Version of engine

Type:
  • String
Default Value
  • 1.9.4

(static) frame :Number

Current update frame, used to calculate time

Type:
  • Number

(static, constant) frameRate :Number

Frames per second to update

Type:
  • Number
Default Value
  • 60

(static) paused :Boolean

Is the game paused? Causes time and objects to not be updated

Type:
  • Boolean
Default Value
  • false

(static) time :Number

Current engine time since start in seconds

Type:
  • Number

(static, constant) timeDelta :Number

How many seconds each frame lasts, engine uses a fixed time step

Type:
  • Number
Default Value
  • 1/60

(static) timeReal :Number

Actual clock time since start in seconds (not affected by pause or frame rate clamping)

Type:
  • Number

Methods

(static) engineInit(gameInit, gameUpdate, gameUpdatePost, gameRender, gameRenderPost, imageSourcesopt)

Startup LittleJS engine with your callback functions

Parameters:
NameTypeAttributesDefaultDescription
gameInitfunction

Called once after the engine starts up, setup the game

gameUpdatefunction

Called every frame at 60 frames per second, handle input and update the game state

gameUpdatePostfunction

Called after physics and objects are updated, setup camera and prepare for render

gameRenderfunction

Called before objects are rendered, draw any background effects that appear behind objects

gameRenderPostfunction

Called after objects are rendered, draw effects or hud that appear above all objects

imageSourcesArray<optional>
['tiles.png']

Image to load

(static) engineObjectsCallback(posopt, sizeopt, callbackFunctionopt, objectsopt)

Triggers a callback for each object within a given area

Parameters:
NameTypeAttributesDefaultDescription
posVector2<optional>

Center of test area

sizeNumber | Vector2<optional>

Radius of circle if float, rectangle size if Vector2

callbackFunctionfunction<optional>

Calls this function on every object that passes the test

objectsArray<optional>
engineObjects

List of objects to check

(static) engineObjectsDestroy()

Destroy and remove all objects

(static) engineObjectsUpdate()

Update each engine object, remove destroyed objects, and update time

(static) setPaused(isPaused)

Set if game is paused

Parameters:
NameTypeDescription
isPausedBoolean
\ No newline at end of file diff --git a/docs/EngineObject.html b/docs/EngineObject.html index a24dd063..4664eee4 100644 --- a/docs/EngineObject.html +++ b/docs/EngineObject.html @@ -1,3 +1,3 @@ Class: EngineObject
On this page

EngineObject

LittleJS Object Base Object Class

  • Top level object class used by the engine
  • Automatically adds self to object list
  • Will be updated and rendered each frame
  • Renders as a sprite from a tilesheet by default
  • Can have color and addtive color applied
  • 2D Physics and collision system
  • Sorted by renderOrder
  • Objects can have children attached
  • Parents are updated before children, and set child transform
  • Call destroy() to get rid of objects

The physics system used by objects is simple and fast with some caveats...

  • Collision uses the axis aligned size, the object's rotation angle is only for rendering
  • Objects are guaranteed to not intersect tile collision from physics
  • If an object starts or is moved inside tile collision, it will not collide with that tile
  • Collision for objects can be set to be solid to block other objects
  • Objects may get pushed into overlapping other solid objects, if so they will push away
  • Solid objects are more performance intensive and should be used sparingly

Constructor

new EngineObject(posopt, sizeopt, tileInfoopt, angleopt, coloropt, renderOrderopt)

Create an engine object and adds it to the list of objects

Parameters:
NameTypeAttributesDefaultDescription
posVector2<optional>
(0,0)

World space position of the object

sizeVector2<optional>
(1,1)

World space size of the object

tileInfoTileInfo<optional>

Tile info to render object (undefined is untextured)

angleNumber<optional>
0

Angle the object is rotated by

colorColor<optional>
(1,1,1,1)

Color to apply to tile when rendered

renderOrderNumber<optional>
0

Objects sorted by renderOrder before being rendered

Example
// create an engine object, normally you would first extend the class with your own
const pos = vec2(2,3);
const object = new EngineObject(pos); 

Members

additiveColor

Properties
TypeDescription
Color

Additive color to apply when rendered

angle

Properties
TypeDescription
Number

Angle to rotate the object

angleDamping

Properties
NameTypeAttributesDefaultDescription
angleDampingNumber<optional>
objectDefaultAngleDamping

How much to slow down rotation each frame (0-1)

angleVelocity

Properties
TypeDescription
Number

Angular velocity of the object

children

Properties
TypeDescription
Array

List of children of this object

collideSolidObjects

Properties
TypeDescription
Boolean

Object collides with solid objects

collideTiles

Properties
TypeDescription
Boolean

Object collides with the tile collision

color

Properties
TypeDescription
Color

Color to apply when rendered

damping

Properties
NameTypeAttributesDefaultDescription
dampingNumber<optional>
objectDefaultDamping

How much to slow down velocity each frame (0-1)

drawSize

Properties
TypeDescription
Vector2

Size of object used for drawing, uses size if not set

elasticity

Properties
NameTypeAttributesDefaultDescription
elasticityNumber<optional>
objectDefaultElasticity

How bouncy the object is when colliding (0-1)

friction

Properties
NameTypeAttributesDefaultDescription
frictionNumber<optional>
objectDefaultFriction

How much friction to apply when sliding (0-1)

gravityScale

Properties
TypeDescription
Number

How much to scale gravity by for this object

isSolid

Properties
TypeDescription
Boolean

Object collides with and blocks other objects

localAngle

Properties
TypeDescription
Number

Local angle if child

localPos

Properties
TypeDescription
Vector2

Local position if child

mass

Properties
NameTypeAttributesDefaultDescription
massNumber<optional>
objectDefaultMass

How heavy the object is, static if 0

mirror

Properties
TypeDescription
Boolean

Should it flip along y axis when rendered

parent

Properties
TypeDescription
EngineObject

Parent of object if in local space

pos

Properties
TypeDescription
Vector2

World space position of the object

renderOrder

Properties
TypeDescription
Number

Objects are sorted by render order

size

Properties
TypeDescription
Vector2

World space width and height of the object

spawnTime

Properties
TypeDescription
Number

Track when object was created

tileInfo

Properties
TypeDescription
TileInfo

Tile info to render object (undefined is untextured)

velocity

Properties
TypeDescription
Vector2

Velocity of the object

Methods

addChild(child, localPosopt, localAngleopt)

Attaches a child to this with a given local transform

Parameters:
NameTypeAttributesDefaultDescription
childEngineObject
localPosVector2<optional>
(0,0)
localAngleNumber<optional>
0

applyAcceleration(acceleration)

Apply acceleration to this object (adjust velocity, not affected by mass)

Parameters:
NameTypeDescription
accelerationVector2

applyForce(force)

Apply force to this object (adjust velocity, affected by mass)

Parameters:
NameTypeDescription
forceVector2

collideWithObject(object) → {Boolean}

Called to check if a object collision should be resolved

Parameters:
NameTypeDescription
objectEngineObject

the object to test against

Returns:
  • true if the collision should be resolved
Type: 
Boolean

collideWithTile(tileData, pos) → {Boolean}

Called to check if a tile collision should be resolved

Parameters:
NameTypeDescription
tileDataNumber

the value of the tile at the position

posVector2

tile where the collision occured

Returns:
  • true if the collision should be resolved
Type: 
Boolean

collideWithTileRaycast(tileData, pos) → {Boolean}

Called to check if a tile raycast hit

Parameters:
NameTypeDescription
tileDataNumber

the value of the tile at the position

posVector2

tile where the raycast is

Returns:
  • true if the raycast should hit
Type: 
Boolean

destroy()

Destroy this object, destroy it's children, detach it's parent, and mark it for removal

getAliveTime() → {Number}

How long since the object was created

Returns:
Type: 
Number

getMirrorSign() → {Number}

Get the direction of the mirror

Returns:

-1 if this.mirror is true, or 1 if not mirrored

Type: 
Number

removeChild(child)

Removes a child from this one

Parameters:
NameTypeDescription
childEngineObject

render()

Render the object, draws a tile by default, automatically called each frame, sorted by renderOrder

setCollision(collideSolidObjectsopt, isSolidopt, collideTilesopt)

Set how this object collides

Parameters:
NameTypeAttributesDefaultDescription
collideSolidObjectsBoolean<optional>
true

Does it collide with solid objects

isSolidBoolean<optional>
true

Does it collide with and block other objects (expensive in large numbers)

collideTilesBoolean<optional>
true

Does it collide with the tile collision

toString() → {String}

Returns string containg info about this object for debugging

Returns:
Type: 
String

update()

Update the object transform and physics, called automatically by engine once each frame

\ No newline at end of file +
On this page

EngineObject

LittleJS Object Base Object Class

  • Top level object class used by the engine
  • Automatically adds self to object list
  • Will be updated and rendered each frame
  • Renders as a sprite from a tilesheet by default
  • Can have color and additive color applied
  • 2D Physics and collision system
  • Sorted by renderOrder
  • Objects can have children attached
  • Parents are updated before children, and set child transform
  • Call destroy() to get rid of objects

The physics system used by objects is simple and fast with some caveats...

  • Collision uses the axis aligned size, the object's rotation angle is only for rendering
  • Objects are guaranteed to not intersect tile collision from physics
  • If an object starts or is moved inside tile collision, it will not collide with that tile
  • Collision for objects can be set to be solid to block other objects
  • Objects may get pushed into overlapping other solid objects, if so they will push away
  • Solid objects are more performance intensive and should be used sparingly

Constructor

new EngineObject(posopt, sizeopt, tileInfoopt, angleopt, coloropt, renderOrderopt)

Create an engine object and adds it to the list of objects

Parameters:
NameTypeAttributesDefaultDescription
posVector2<optional>
(0,0)

World space position of the object

sizeVector2<optional>
(1,1)

World space size of the object

tileInfoTileInfo<optional>

Tile info to render object (undefined is untextured)

angleNumber<optional>
0

Angle the object is rotated by

colorColor<optional>
(1,1,1,1)

Color to apply to tile when rendered

renderOrderNumber<optional>
0

Objects sorted by renderOrder before being rendered

Example
// create an engine object, normally you would first extend the class with your own
const pos = vec2(2,3);
const object = new EngineObject(pos); 

Members

additiveColor

Properties
TypeDescription
Color

Additive color to apply when rendered

angle

Properties
TypeDescription
Number

Angle to rotate the object

angleDamping

Properties
NameTypeAttributesDefaultDescription
angleDampingNumber<optional>
objectDefaultAngleDamping

How much to slow down rotation each frame (0-1)

angleVelocity

Properties
TypeDescription
Number

Angular velocity of the object

children

Properties
TypeDescription
Array

List of children of this object

collideSolidObjects

Properties
TypeDescription
Boolean

Object collides with solid objects

collideTiles

Properties
TypeDescription
Boolean

Object collides with the tile collision

color

Properties
TypeDescription
Color

Color to apply when rendered

damping

Properties
NameTypeAttributesDefaultDescription
dampingNumber<optional>
objectDefaultDamping

How much to slow down velocity each frame (0-1)

drawSize

Properties
TypeDescription
Vector2

Size of object used for drawing, uses size if not set

elasticity

Properties
NameTypeAttributesDefaultDescription
elasticityNumber<optional>
objectDefaultElasticity

How bouncy the object is when colliding (0-1)

friction

Properties
NameTypeAttributesDefaultDescription
frictionNumber<optional>
objectDefaultFriction

How much friction to apply when sliding (0-1)

gravityScale

Properties
TypeDescription
Number

How much to scale gravity by for this object

isSolid

Properties
TypeDescription
Boolean

Object collides with and blocks other objects

localAngle

Properties
TypeDescription
Number

Local angle if child

localPos

Properties
TypeDescription
Vector2

Local position if child

mass

Properties
NameTypeAttributesDefaultDescription
massNumber<optional>
objectDefaultMass

How heavy the object is, static if 0

mirror

Properties
TypeDescription
Boolean

Should it flip along y axis when rendered

parent

Properties
TypeDescription
EngineObject

Parent of object if in local space

pos

Properties
TypeDescription
Vector2

World space position of the object

renderOrder

Properties
TypeDescription
Number

Objects are sorted by render order

size

Properties
TypeDescription
Vector2

World space width and height of the object

spawnTime

Properties
TypeDescription
Number

Track when object was created

tileInfo

Properties
TypeDescription
TileInfo

Tile info to render object (undefined is untextured)

velocity

Properties
TypeDescription
Vector2

Velocity of the object

Methods

addChild(child, localPosopt, localAngleopt)

Attaches a child to this with a given local transform

Parameters:
NameTypeAttributesDefaultDescription
childEngineObject
localPosVector2<optional>
(0,0)
localAngleNumber<optional>
0

applyAcceleration(acceleration)

Apply acceleration to this object (adjust velocity, not affected by mass)

Parameters:
NameTypeDescription
accelerationVector2

applyForce(force)

Apply force to this object (adjust velocity, affected by mass)

Parameters:
NameTypeDescription
forceVector2

collideWithObject(object) → {Boolean}

Called to check if a object collision should be resolved

Parameters:
NameTypeDescription
objectEngineObject

the object to test against

Returns:
  • true if the collision should be resolved
Type: 
Boolean

collideWithTile(tileData, pos) → {Boolean}

Called to check if a tile collision should be resolved

Parameters:
NameTypeDescription
tileDataNumber

the value of the tile at the position

posVector2

tile where the collision occured

Returns:
  • true if the collision should be resolved
Type: 
Boolean

collideWithTileRaycast(tileData, pos) → {Boolean}

Called to check if a tile raycast hit

Parameters:
NameTypeDescription
tileDataNumber

the value of the tile at the position

posVector2

tile where the raycast is

Returns:
  • true if the raycast should hit
Type: 
Boolean

destroy()

Destroy this object, destroy it's children, detach it's parent, and mark it for removal

getAliveTime() → {Number}

How long since the object was created

Returns:
Type: 
Number

getMirrorSign() → {Number}

Get the direction of the mirror

Returns:

-1 if this.mirror is true, or 1 if not mirrored

Type: 
Number

removeChild(child)

Removes a child from this one

Parameters:
NameTypeDescription
childEngineObject

render()

Render the object, draws a tile by default, automatically called each frame, sorted by renderOrder

setCollision(collideSolidObjectsopt, isSolidopt, collideTilesopt)

Set how this object collides

Parameters:
NameTypeAttributesDefaultDescription
collideSolidObjectsBoolean<optional>
true

Does it collide with solid objects

isSolidBoolean<optional>
true

Does it collide with and block other objects (expensive in large numbers)

collideTilesBoolean<optional>
true

Does it collide with the tile collision

toString() → {String}

Returns string containg info about this object for debugging

Returns:
Type: 
String

update()

Update the object transform and physics, called automatically by engine once each frame

\ No newline at end of file diff --git a/docs/FontImage.html b/docs/FontImage.html index abc5e589..de3d6513 100644 --- a/docs/FontImage.html +++ b/docs/FontImage.html @@ -1,3 +1,3 @@ Class: FontImage
On this page

FontImage

Font Image Object - Draw text on a 2D canvas by using characters in an image

  • 96 characters (from space to tilde) are stored in an image
  • Uses a default 8x8 font if none is supplied
  • You can also use fonts from the main tile sheet

Constructor

new FontImage(imageopt, tileSizeopt, paddingSizeopt, contextopt)

Create an image font

Parameters:
NameTypeAttributesDefaultDescription
imageHTMLImageElement<optional>

Image for the font, if undefined default font is used

tileSizeVector2<optional>
(8,8)

Size of the font source tiles

paddingSizeVector2<optional>
(0,1)

How much extra space to add between characters

contextCanvasRenderingContext2D<optional>
overlayContext

context to draw to

Example
// use built in font
const font = new ImageFont;

// draw text
font.drawTextScreen("LittleJS\nHello World!", vec2(200, 50));

Methods

drawText(text, pos, scaleopt, centeropt)

Draw text in world space using the image font

Parameters:
NameTypeAttributesDefaultDescription
textString
posVector2
scaleNumber<optional>
.25
centerBoolean<optional>

drawTextScreen(text, pos, scaleopt, centeropt)

Draw text in screen space using the image font

Parameters:
NameTypeAttributesDefaultDescription
textString
posVector2
scaleNumber<optional>
4
centerBoolean<optional>
\ No newline at end of file +
On this page

FontImage

Font Image Object - Draw text on a 2D canvas by using characters in an image

  • 96 characters (from space to tilde) are stored in an image
  • Uses a default 8x8 font if none is supplied
  • You can also use fonts from the main tile sheet

Constructor

new FontImage(imageopt, tileSizeopt, paddingSizeopt, contextopt)

Create an image font

Parameters:
NameTypeAttributesDefaultDescription
imageHTMLImageElement<optional>

Image for the font, if undefined default font is used

tileSizeVector2<optional>
(8,8)

Size of the font source tiles

paddingSizeVector2<optional>
(0,1)

How much extra space to add between characters

contextCanvasRenderingContext2D<optional>
overlayContext

context to draw to

Example
// use built in font
const font = new ImageFont;

// draw text
font.drawTextScreen("LittleJS\nHello World!", vec2(200, 50));

Methods

drawText(text, pos, scaleopt, centeropt)

Draw text in world space using the image font

Parameters:
NameTypeAttributesDefaultDescription
textString
posVector2
scaleNumber<optional>
.25
centerBoolean<optional>

drawTextScreen(text, pos, scaleopt, centeropt)

Draw text in screen space using the image font

Parameters:
NameTypeAttributesDefaultDescription
textString
posVector2
scaleNumber<optional>
4
centerBoolean<optional>
\ No newline at end of file diff --git a/docs/Input.html b/docs/Input.html index a0411c27..53de73dd 100644 --- a/docs/Input.html +++ b/docs/Input.html @@ -1,3 +1,3 @@ Namespace: Input
On this page

Input

LittleJS Input System

  • Tracks keyboard down, pressed, and released
  • Tracks mouse buttons, position, and wheel
  • Tracks multiple analog gamepads
  • Virtual gamepad for touch devices

Members

(static, constant) isTouchDevice

True if a touch device has been detected

(static) isUsingGamepad :Boolean

Returns true if user is using gamepad (has more recently pressed a gamepad button)

Type:
  • Boolean

(static) mousePos :Vector2

Mouse pos in world space

Type:

(static) mousePosScreen :Vector2

Mouse pos in screen space

Type:

(static) mouseWheel :Number

Mouse wheel delta this frame

Type:
  • Number

(static) preventDefaultInput :Boolean

Prevents input continuing to the default browser handling (false by default)

Type:
  • Boolean

Methods

(static) clearInput()

Clears all input

(static) gamepadIsDown(button, gamepadopt) → {Boolean}

Returns true if gamepad button is down

Parameters:
NameTypeAttributesDefaultDescription
buttonNumber
gamepadNumber<optional>
0
Returns:
Type: 
Boolean

(static) gamepadStick(stick, gamepadopt) → {Vector2}

Returns gamepad stick value

Parameters:
NameTypeAttributesDefaultDescription
stickNumber
gamepadNumber<optional>
0
Returns:
Type: 
Vector2

(static) gamepadWasPressed(button, gamepadopt) → {Boolean}

Returns true if gamepad button was pressed

Parameters:
NameTypeAttributesDefaultDescription
buttonNumber
gamepadNumber<optional>
0
Returns:
Type: 
Boolean

(static) gamepadWasReleased(button, gamepadopt) → {Boolean}

Returns true if gamepad button was released

Parameters:
NameTypeAttributesDefaultDescription
buttonNumber
gamepadNumber<optional>
0
Returns:
Type: 
Boolean

(static) keyIsDown(key, deviceopt) → {Boolean}

Returns true if device key is down

Parameters:
NameTypeAttributesDefaultDescription
keyString | Number
deviceNumber<optional>
0
Returns:
Type: 
Boolean

(static) keyWasPressed(key, deviceopt) → {Boolean}

Returns true if device key was pressed this frame

Parameters:
NameTypeAttributesDefaultDescription
keyString | Number
deviceNumber<optional>
0
Returns:
Type: 
Boolean

(static) keyWasReleased(key, deviceopt) → {Boolean}

Returns true if device key was released this frame

Parameters:
NameTypeAttributesDefaultDescription
keyString | Number
deviceNumber<optional>
0
Returns:
Type: 
Boolean

(static) mouseIsDown(button) → {Boolean}

Returns true if mouse button is down

Parameters:
NameTypeDescription
buttonNumber
Returns:
Type: 
Boolean

(static) mouseWasPressed(button) → {Boolean}

Returns true if mouse button was pressed

Parameters:
NameTypeDescription
buttonNumber
Returns:
Type: 
Boolean

(static) mouseWasReleased(button) → {Boolean}

Returns true if mouse button was released

Parameters:
NameTypeDescription
buttonNumber
Returns:
Type: 
Boolean

(static) vibrate(patternopt)

Pulse the vibration hardware if it exists

Parameters:
NameTypeAttributesDefaultDescription
patternNumber | Array<optional>
100

single value in ms or vibration interval array

(static) vibrateStop()

Cancel any ongoing vibration

\ No newline at end of file +
On this page

Input

LittleJS Input System

  • Tracks keyboard down, pressed, and released
  • Tracks mouse buttons, position, and wheel
  • Tracks multiple analog gamepads
  • Virtual gamepad for touch devices

Members

(static, constant) isTouchDevice

True if a touch device has been detected

(static) isUsingGamepad :Boolean

Returns true if user is using gamepad (has more recently pressed a gamepad button)

Type:
  • Boolean

(static) mousePos :Vector2

Mouse pos in world space

Type:

(static) mousePosScreen :Vector2

Mouse pos in screen space

Type:

(static) mouseWheel :Number

Mouse wheel delta this frame

Type:
  • Number

(static) preventDefaultInput :Boolean

Prevents input continuing to the default browser handling (false by default)

Type:
  • Boolean

Methods

(static) clearInput()

Clears all input

(static) gamepadIsDown(button, gamepadopt) → {Boolean}

Returns true if gamepad button is down

Parameters:
NameTypeAttributesDefaultDescription
buttonNumber
gamepadNumber<optional>
0
Returns:
Type: 
Boolean

(static) gamepadStick(stick, gamepadopt) → {Vector2}

Returns gamepad stick value

Parameters:
NameTypeAttributesDefaultDescription
stickNumber
gamepadNumber<optional>
0
Returns:
Type: 
Vector2

(static) gamepadWasPressed(button, gamepadopt) → {Boolean}

Returns true if gamepad button was pressed

Parameters:
NameTypeAttributesDefaultDescription
buttonNumber
gamepadNumber<optional>
0
Returns:
Type: 
Boolean

(static) gamepadWasReleased(button, gamepadopt) → {Boolean}

Returns true if gamepad button was released

Parameters:
NameTypeAttributesDefaultDescription
buttonNumber
gamepadNumber<optional>
0
Returns:
Type: 
Boolean

(static) keyIsDown(key, deviceopt) → {Boolean}

Returns true if device key is down

Parameters:
NameTypeAttributesDefaultDescription
keyString | Number
deviceNumber<optional>
0
Returns:
Type: 
Boolean

(static) keyWasPressed(key, deviceopt) → {Boolean}

Returns true if device key was pressed this frame

Parameters:
NameTypeAttributesDefaultDescription
keyString | Number
deviceNumber<optional>
0
Returns:
Type: 
Boolean

(static) keyWasReleased(key, deviceopt) → {Boolean}

Returns true if device key was released this frame

Parameters:
NameTypeAttributesDefaultDescription
keyString | Number
deviceNumber<optional>
0
Returns:
Type: 
Boolean

(static) mouseIsDown(button) → {Boolean}

Returns true if mouse button is down

Parameters:
NameTypeDescription
buttonNumber
Returns:
Type: 
Boolean

(static) mouseWasPressed(button) → {Boolean}

Returns true if mouse button was pressed

Parameters:
NameTypeDescription
buttonNumber
Returns:
Type: 
Boolean

(static) mouseWasReleased(button) → {Boolean}

Returns true if mouse button was released

Parameters:
NameTypeDescription
buttonNumber
Returns:
Type: 
Boolean

(static) vibrate(patternopt)

Pulse the vibration hardware if it exists

Parameters:
NameTypeAttributesDefaultDescription
patternNumber | Array<optional>
100

single value in ms or vibration interval array

(static) vibrateStop()

Cancel any ongoing vibration

\ No newline at end of file diff --git a/docs/Music.html b/docs/Music.html index 3f74b4c5..90a22b2f 100644 --- a/docs/Music.html +++ b/docs/Music.html @@ -1,3 +1,3 @@ Class: Music
On this page

Music

Music Object - Stores a zzfx music track for later use

Create music with the ZzFXM tracker.

Constructor

new Music(zzfxMusic)

Create a music object and cache the zzfx music samples for later use

Parameters:
NameTypeDescription
zzfxMusic
Example
// create some music
const music_example = new Music(
[
    [                         // instruments
      [,0,400]                // simple note
    ], 
    [                         // patterns
        [                     // pattern 1
            [                 // channel 0
                0, -1,        // instrument 0, left speaker
                1, 0, 9, 1    // channel notes
            ], 
            [                 // channel 1
                0, 1,         // instrument 1, right speaker
                0, 12, 17, -1 // channel notes
            ]
        ],
    ],
    [0, 0, 0, 0], // sequence, play pattern 0 four times
    90            // BPM
]);

// play the music
music_example.play();

Methods

playMusic(volumeopt, loopopt) → {AudioBufferSourceNode}

Play the music

Parameters:
NameTypeAttributesDefaultDescription
volumeNumber<optional>
1

How much to scale volume by

loopBoolean<optional>
1

True if the music should loop

Returns:
  • The audio source node
Type: 
AudioBufferSourceNode
\ No newline at end of file +
On this page

Music

Music Object - Stores a zzfx music track for later use

Create music with the ZzFXM tracker.

Constructor

new Music(zzfxMusic)

Create a music object and cache the zzfx music samples for later use

Parameters:
NameTypeDescription
zzfxMusic
Example
// create some music
const music_example = new Music(
[
    [                         // instruments
      [,0,400]                // simple note
    ], 
    [                         // patterns
        [                     // pattern 1
            [                 // channel 0
                0, -1,        // instrument 0, left speaker
                1, 0, 9, 1    // channel notes
            ], 
            [                 // channel 1
                0, 1,         // instrument 0, right speaker
                0, 12, 17, -1 // channel notes
            ]
        ],
    ],
    [0, 0, 0, 0], // sequence, play pattern 0 four times
    90            // BPM
]);

// play the music
music_example.play();

Methods

playMusic(volumeopt, loopopt) → {AudioBufferSourceNode}

Play the music

Parameters:
NameTypeAttributesDefaultDescription
volumeNumber<optional>
1

How much to scale volume by

loopBoolean<optional>
false

True if the music should loop

Returns:
  • The audio source node
Type: 
AudioBufferSourceNode
\ No newline at end of file diff --git a/docs/Particle.html b/docs/Particle.html index f4406d86..401eb7b3 100644 --- a/docs/Particle.html +++ b/docs/Particle.html @@ -1,3 +1,3 @@ Class: Particle
On this page

Particle

Particle Object - Created automatically by Particle Emitters

Constructor

new Particle(position, tileInfoopt, angleopt, colorStartopt, colorEndopt, lifeTimeopt, sizeStartopt, sizeEndopt, fadeRateopt, additiveopt, trailScaleopt, localSpaceEmitteropt, destroyCallbackopt)

Create a particle with the given shis.colorStart = undefined;ettings

Parameters:
NameTypeAttributesDescription
positionVector2

World space position of the particle

tileInfoTileInfo<optional>

Tile info to render particles

angleNumber<optional>

Angle to rotate the particle

colorStartColor<optional>

Color at start of life

colorEndColor<optional>

Color at end of life

lifeTimeNumber<optional>

How long to live for

sizeStartNumber<optional>

Angle to rotate the particle

sizeEndNumber<optional>

Angle to rotate the particle

fadeRateNumber<optional>

Angle to rotate the particle

additiveBoolean<optional>

Angle to rotate the particle

trailScaleNumber<optional>

If a trail, how long to make it

localSpaceEmitterParticleEmitter<optional>

Parent emitter if local space

destroyCallbackfunction<optional>

Called when particle dies

Extends

Members

additive

Properties
TypeDescription
Boolean

Is it additive

additiveColor

Properties
TypeDescription
Color

Additive color to apply when rendered

angle

Properties
TypeDescription
Number

Angle to rotate the object

angleDamping

Properties
NameTypeAttributesDefaultDescription
angleDampingNumber<optional>
objectDefaultAngleDamping

How much to slow down rotation each frame (0-1)

angleVelocity

Properties
TypeDescription
Number

Angular velocity of the object

children

Properties
TypeDescription
Array

List of children of this object

collideSolidObjects

Properties
TypeDescription
Boolean

Object collides with solid objects

collideTiles

Properties
TypeDescription
Boolean

Object collides with the tile collision

color

Properties
TypeDescription
Color

Color to apply when rendered

colorEndDelta

Properties
TypeDescription
Color

Calculated change in color

colorStart

Properties
TypeDescription
Color

Color at start of life

damping

Properties
NameTypeAttributesDefaultDescription
dampingNumber<optional>
objectDefaultDamping

How much to slow down velocity each frame (0-1)

destroyCallback

Properties
TypeDescription
function

Called when particle dies

drawSize

Properties
TypeDescription
Vector2

Size of object used for drawing, uses size if not set

elasticity

Properties
NameTypeAttributesDefaultDescription
elasticityNumber<optional>
objectDefaultElasticity

How bouncy the object is when colliding (0-1)

fadeRate

Properties
TypeDescription
Number

How quick to fade in/out

friction

Properties
NameTypeAttributesDefaultDescription
frictionNumber<optional>
objectDefaultFriction

How much friction to apply when sliding (0-1)

gravityScale

Properties
TypeDescription
Number

How much to scale gravity by for this object

isSolid

Properties
TypeDescription
Boolean

Object collides with and blocks other objects

lifeTime

Properties
TypeDescription
Number

How long to live for

localAngle

Properties
TypeDescription
Number

Local angle if child

localPos

Properties
TypeDescription
Vector2

Local position if child

localSpaceEmitter

Properties
TypeDescription
ParticleEmitter

Parent emitter if local space

mass

Properties
NameTypeAttributesDefaultDescription
massNumber<optional>
objectDefaultMass

How heavy the object is, static if 0

mirror

Properties
TypeDescription
Boolean

Should it flip along y axis when rendered

parent

Properties
TypeDescription
EngineObject

Parent of object if in local space

pos

Properties
TypeDescription
Vector2

World space position of the object

renderOrder

Properties
TypeDescription
Number

Objects are sorted by render order

size

Properties
TypeDescription
Vector2

World space width and height of the object

sizeEndDelta

Properties
TypeDescription
Number

Calculated change in size

sizeStart

Properties
TypeDescription
Number

Size at start of life

spawnTime

Properties
TypeDescription
Number

Track when object was created

tileInfo

Properties
TypeDescription
TileInfo

Tile info to render object (undefined is untextured)

trailScale

Properties
TypeDescription
Number

If a trail, how long to make it

velocity

Properties
TypeDescription
Vector2

Velocity of the object

Methods

addChild(child, localPosopt, localAngleopt)

Attaches a child to this with a given local transform

Parameters:
NameTypeAttributesDefaultDescription
childEngineObject
localPosVector2<optional>
(0,0)
localAngleNumber<optional>
0

applyAcceleration(acceleration)

Apply acceleration to this object (adjust velocity, not affected by mass)

Parameters:
NameTypeDescription
accelerationVector2

applyForce(force)

Apply force to this object (adjust velocity, affected by mass)

Parameters:
NameTypeDescription
forceVector2

collideWithObject(object) → {Boolean}

Called to check if a object collision should be resolved

Parameters:
NameTypeDescription
objectEngineObject

the object to test against

Returns:
  • true if the collision should be resolved
Type: 
Boolean

collideWithTile(tileData, pos) → {Boolean}

Called to check if a tile collision should be resolved

Parameters:
NameTypeDescription
tileDataNumber

the value of the tile at the position

posVector2

tile where the collision occured

Returns:
  • true if the collision should be resolved
Type: 
Boolean

collideWithTileRaycast(tileData, pos) → {Boolean}

Called to check if a tile raycast hit

Parameters:
NameTypeDescription
tileDataNumber

the value of the tile at the position

posVector2

tile where the raycast is

Returns:
  • true if the raycast should hit
Type: 
Boolean

destroy()

Destroy this object, destroy it's children, detach it's parent, and mark it for removal

getAliveTime() → {Number}

How long since the object was created

Returns:
Type: 
Number

getMirrorSign() → {Number}

Get the direction of the mirror

Returns:

-1 if this.mirror is true, or 1 if not mirrored

Type: 
Number

removeChild(child)

Removes a child from this one

Parameters:
NameTypeDescription
childEngineObject

render()

Render the particle, automatically called each frame, sorted by renderOrder

setCollision(collideSolidObjectsopt, isSolidopt, collideTilesopt)

Set how this object collides

Parameters:
NameTypeAttributesDefaultDescription
collideSolidObjectsBoolean<optional>
true

Does it collide with solid objects

isSolidBoolean<optional>
true

Does it collide with and block other objects (expensive in large numbers)

collideTilesBoolean<optional>
true

Does it collide with the tile collision

toString() → {String}

Returns string containg info about this object for debugging

Returns:
Type: 
String

update()

Update the object transform and physics, called automatically by engine once each frame

\ No newline at end of file +
On this page

Particle

Particle Object - Created automatically by Particle Emitters

Constructor

new Particle(position, tileInfoopt, angleopt, colorStartopt, colorEndopt, lifeTimeopt, sizeStartopt, sizeEndopt, fadeRateopt, additiveopt, trailScaleopt, localSpaceEmitteropt, destroyCallbackopt)

Create a particle with the given shis.colorStart = undefined;ettings

Parameters:
NameTypeAttributesDescription
positionVector2

World space position of the particle

tileInfoTileInfo<optional>

Tile info to render particles

angleNumber<optional>

Angle to rotate the particle

colorStartColor<optional>

Color at start of life

colorEndColor<optional>

Color at end of life

lifeTimeNumber<optional>

How long to live for

sizeStartNumber<optional>

Angle to rotate the particle

sizeEndNumber<optional>

Angle to rotate the particle

fadeRateNumber<optional>

Angle to rotate the particle

additiveBoolean<optional>

Angle to rotate the particle

trailScaleNumber<optional>

If a trail, how long to make it

localSpaceEmitterParticleEmitter<optional>

Parent emitter if local space

destroyCallbackfunction<optional>

Called when particle dies

Extends

Members

additive

Properties
TypeDescription
Boolean

Is it additive

additiveColor

Properties
TypeDescription
Color

Additive color to apply when rendered

angle

Properties
TypeDescription
Number

Angle to rotate the object

angleDamping

Properties
NameTypeAttributesDefaultDescription
angleDampingNumber<optional>
objectDefaultAngleDamping

How much to slow down rotation each frame (0-1)

angleVelocity

Properties
TypeDescription
Number

Angular velocity of the object

children

Properties
TypeDescription
Array

List of children of this object

collideSolidObjects

Properties
TypeDescription
Boolean

Object collides with solid objects

collideTiles

Properties
TypeDescription
Boolean

Object collides with the tile collision

color

Properties
TypeDescription
Color

Color to apply when rendered

colorEndDelta

Properties
TypeDescription
Color

Calculated change in color

colorStart

Properties
TypeDescription
Color

Color at start of life

damping

Properties
NameTypeAttributesDefaultDescription
dampingNumber<optional>
objectDefaultDamping

How much to slow down velocity each frame (0-1)

destroyCallback

Properties
TypeDescription
function

Called when particle dies

drawSize

Properties
TypeDescription
Vector2

Size of object used for drawing, uses size if not set

elasticity

Properties
NameTypeAttributesDefaultDescription
elasticityNumber<optional>
objectDefaultElasticity

How bouncy the object is when colliding (0-1)

fadeRate

Properties
TypeDescription
Number

How quick to fade in/out

friction

Properties
NameTypeAttributesDefaultDescription
frictionNumber<optional>
objectDefaultFriction

How much friction to apply when sliding (0-1)

gravityScale

Properties
TypeDescription
Number

How much to scale gravity by for this object

isSolid

Properties
TypeDescription
Boolean

Object collides with and blocks other objects

lifeTime

Properties
TypeDescription
Number

How long to live for

localAngle

Properties
TypeDescription
Number

Local angle if child

localPos

Properties
TypeDescription
Vector2

Local position if child

localSpaceEmitter

Properties
TypeDescription
ParticleEmitter

Parent emitter if local space

mass

Properties
NameTypeAttributesDefaultDescription
massNumber<optional>
objectDefaultMass

How heavy the object is, static if 0

mirror

Properties
TypeDescription
Boolean

Should it flip along y axis when rendered

parent

Properties
TypeDescription
EngineObject

Parent of object if in local space

pos

Properties
TypeDescription
Vector2

World space position of the object

renderOrder

Properties
TypeDescription
Number

Objects are sorted by render order

size

Properties
TypeDescription
Vector2

World space width and height of the object

sizeEndDelta

Properties
TypeDescription
Number

Calculated change in size

sizeStart

Properties
TypeDescription
Number

Size at start of life

spawnTime

Properties
TypeDescription
Number

Track when object was created

tileInfo

Properties
TypeDescription
TileInfo

Tile info to render object (undefined is untextured)

trailScale

Properties
TypeDescription
Number

If a trail, how long to make it

velocity

Properties
TypeDescription
Vector2

Velocity of the object

Methods

addChild(child, localPosopt, localAngleopt)

Attaches a child to this with a given local transform

Parameters:
NameTypeAttributesDefaultDescription
childEngineObject
localPosVector2<optional>
(0,0)
localAngleNumber<optional>
0

applyAcceleration(acceleration)

Apply acceleration to this object (adjust velocity, not affected by mass)

Parameters:
NameTypeDescription
accelerationVector2

applyForce(force)

Apply force to this object (adjust velocity, affected by mass)

Parameters:
NameTypeDescription
forceVector2

collideWithObject(object) → {Boolean}

Called to check if a object collision should be resolved

Parameters:
NameTypeDescription
objectEngineObject

the object to test against

Returns:
  • true if the collision should be resolved
Type: 
Boolean

collideWithTile(tileData, pos) → {Boolean}

Called to check if a tile collision should be resolved

Parameters:
NameTypeDescription
tileDataNumber

the value of the tile at the position

posVector2

tile where the collision occured

Returns:
  • true if the collision should be resolved
Type: 
Boolean

collideWithTileRaycast(tileData, pos) → {Boolean}

Called to check if a tile raycast hit

Parameters:
NameTypeDescription
tileDataNumber

the value of the tile at the position

posVector2

tile where the raycast is

Returns:
  • true if the raycast should hit
Type: 
Boolean

destroy()

Destroy this object, destroy it's children, detach it's parent, and mark it for removal

getAliveTime() → {Number}

How long since the object was created

Returns:
Type: 
Number

getMirrorSign() → {Number}

Get the direction of the mirror

Returns:

-1 if this.mirror is true, or 1 if not mirrored

Type: 
Number

removeChild(child)

Removes a child from this one

Parameters:
NameTypeDescription
childEngineObject

render()

Render the particle, automatically called each frame, sorted by renderOrder

setCollision(collideSolidObjectsopt, isSolidopt, collideTilesopt)

Set how this object collides

Parameters:
NameTypeAttributesDefaultDescription
collideSolidObjectsBoolean<optional>
true

Does it collide with solid objects

isSolidBoolean<optional>
true

Does it collide with and block other objects (expensive in large numbers)

collideTilesBoolean<optional>
true

Does it collide with the tile collision

toString() → {String}

Returns string containg info about this object for debugging

Returns:
Type: 
String

update()

Update the object transform and physics, called automatically by engine once each frame

\ No newline at end of file diff --git a/docs/Settings.html b/docs/Settings.html index ca5ca08a..3f310b60 100644 --- a/docs/Settings.html +++ b/docs/Settings.html @@ -1,3 +1,3 @@ Namespace: Settings
On this page

Settings

LittleJS Engine Settings

  • All settings for the engine are here

Members

(static) cameraPos :Vector2

Position of camera in world space

Type:
Default Value
  • Vector2()

(static) cameraScale :Number

Scale of camera in world space

Type:
  • Number
Default Value
  • 32

(static) canvasFixedSize :Vector2

Fixed size of the canvas, if enabled canvas size never changes

  • you may also need to set mainCanvasSize if using screen space coords in startup
Type:
Default Value
  • Vector2()

(static) canvasMaxSize :Vector2

The max size of the canvas, centered if window is larger

Type:
Default Value
  • Vector2(1920,1200)

(static) canvasPixelated :Boolean

Disables filtering for crisper pixel art if true

Type:
  • Boolean
Default Value
  • true

(static) enablePhysicsSolver :Boolean

Enable physics solver for collisions between objects

Type:
  • Boolean
Default Value
  • true

(static) fontDefault :String

Default font used for text rendering

Type:
  • String
Default Value
  • arial

(static) gamepadDirectionEmulateStick :Boolean

If true, the dpad input is also routed to the left analog stick (for better accessability)

Type:
  • Boolean
Default Value
  • true

(static) gamepadsEnable :Boolean

Should gamepads be allowed

Type:
  • Boolean
Default Value
  • true

(static) glEnable :Boolean

Enable webgl rendering, webgl can be disabled and removed from build (with some features disabled)

Type:
  • Boolean
Default Value
  • true

(static) glOverlay :Boolean

Fixes slow rendering in some browsers by not compositing the WebGL canvas

Type:
  • Boolean
Default Value
  • true

(static) gravity :Number

How much gravity to apply to objects along the Y axis, negative is down

Type:
  • Number

(static) inputWASDEmulateDirection :Boolean

If true the WASD keys are also routed to the direction keys (for better accessability)

Type:
  • Boolean
Default Value
  • true

(static) medalDisplayIconSize :Number

Size of icon in medal display

Type:
  • Number
Default Value
  • 50

(static) medalDisplaySize :Vector2

Size of medal display

Type:
Default Value
  • Vector2(640,80)

(static) medalDisplaySlideTime :Number

How quickly to slide on/off medals in seconds

Type:
  • Number
Default Value
  • 0.5

(static) medalDisplayTime :Number

How long to show medals for in seconds

Type:
  • Number
Default Value
  • 5

(static) medalsPreventUnlock :Boolean

Set to stop medals from being unlockable (like if cheats are enabled)

Type:
  • Boolean

(static) objectDefaultAngleDamping :Number

How much to slow angular velocity each frame (0-1)

Type:
  • Number
Default Value
  • 1

(static) objectDefaultDamping :Number

How much to slow velocity by each frame (0-1)

Type:
  • Number
Default Value
  • 1

(static) objectDefaultElasticity :Number

How much to bounce when a collision occurs (0-1)

Type:
  • Number

(static) objectDefaultFriction :Number

How much to slow when touching (0-1)

Type:
  • Number
Default Value
  • 0.8

(static) objectDefaultMass :Number

Default object mass for collison calcuations (how heavy objects are)

Type:
  • Number
Default Value
  • 1

(static) objectMaxSpeed :Number

Clamp max speed to avoid fast objects missing collisions

Type:
  • Number
Default Value
  • 1

(static) particleEmitRateScale :Number

Scales emit rate of particles, useful for low graphics mode (0 disables particle emitters)

Type:
  • Number
Default Value
  • 1

(static) showSplashScreen :Boolean

Enable to show the LittleJS splash screen be shown on startup

Type:
  • Boolean

(static) soundDefaultRange :Number

Default range where sound no longer plays

Type:
  • Number
Default Value
  • 40

(static) soundDefaultTaper :Number

Default range percent to start tapering off sound (0-1)

Type:
  • Number
Default Value
  • 0.7

(static) soundEnable :Boolean

All audio code can be disabled and removed from build

Type:
  • Boolean
Default Value
  • true

(static) soundVolume :Number

Volume scale to apply to all sound, music and speech

Type:
  • Number
Default Value
  • 0.5

(static) tileFixBleedScale :Number

How many pixels smaller to draw tiles to prevent bleeding from neighbors

Type:
  • Number
Default Value
  • 0.3

(static) tileSizeDefault :Vector2

Default size of tiles in pixels

Type:
Default Value
  • Vector2(16,16)

(static) touchGamepadAlpha :Number

Transparency of touch gamepad overlay

Type:
  • Number
Default Value
  • 0.3

(static) touchGamepadAnalog :Boolean

True if touch gamepad should be analog stick or false to use if 8 way dpad

Type:
  • Boolean
Default Value
  • true

(static) touchGamepadEnable :Boolean

True if touch gamepad should appear on mobile devices

  • Supports left analog stick, 4 face buttons and start button (button 9)
  • Must be set by end of gameInit to be activated
Type:
  • Boolean

(static) touchGamepadSize :Number

Size of virutal gamepad for touch devices in pixels

Type:
  • Number
Default Value
  • 99

(static) vibrateEnable :Boolean

Allow vibration hardware if it exists

Type:
  • Boolean
Default Value
  • true

Methods

(static) setCameraPos(pos)

Set position of camera in world space

Parameters:
NameTypeDescription
posVector2

(static) setCameraScale(scale)

Set scale of camera in world space

Parameters:
NameTypeDescription
scaleNumber

(static) setCanvasFixedSize(size)

Set fixed size of the canvas

Parameters:
NameTypeDescription
sizeVector2

(static) setCanvasMaxSize(size)

Set max size of the canvas

Parameters:
NameTypeDescription
sizeVector2

(static) setCanvasPixelated(pixelated)

Disables anti aliasing for pixel art if true

Parameters:
NameTypeDescription
pixelatedBoolean

(static) setEnablePhysicsSolver(enable)

Set if collisions between objects are enabled

Parameters:
NameTypeDescription
enableBoolean

(static) setFontDefault(font)

Set default font used for text rendering

Parameters:
NameTypeDescription
fontString

(static) setGamepadDirectionEmulateStick(enable)

Set if the dpad input is also routed to the left analog stick

Parameters:
NameTypeDescription
enableBoolean

(static) setGamepadsEnable(enable)

Set if gamepads are enabled

Parameters:
NameTypeDescription
enableBoolean

(static) setGlEnable(enable)

Set if webgl rendering is enabled

Parameters:
NameTypeDescription
enableBoolean

(static) setGlOverlay(overlay)

Set to not composite the WebGL canvas

Parameters:
NameTypeDescription
overlayBoolean

(static) setGravity(newGravity)

Set how much gravity to apply to objects along the Y axis

Parameters:
NameTypeDescription
newGravityNumber

(static) setInputWASDEmulateDirection(enable)

Set if true the WASD keys are also routed to the direction keys

Parameters:
NameTypeDescription
enableBoolean

(static) setMedalDisplayIconSize(size)

Set size of icon in medal display

Parameters:
NameTypeDescription
sizeNumber

(static) setMedalDisplaySize(size)

Set size of medal display

Parameters:
NameTypeDescription
sizeVector2

(static) setMedalDisplaySlideTime(time)

Set how quickly to slide on/off medals in seconds

Parameters:
NameTypeDescription
timeNumber

(static) setMedalDisplayTime(time)

Set how long to show medals for in seconds

Parameters:
NameTypeDescription
timeNumber

(static) setMedalsPreventUnlock(preventUnlock)

Set to stop medals from being unlockable

Parameters:
NameTypeDescription
preventUnlockBoolean

(static) setObjectDefaultAngleDamping(damp)

Set how much to slow angular velocity each frame

Parameters:
NameTypeDescription
dampNumber

(static) setObjectDefaultDamping(damp)

Set how much to slow velocity by each frame

Parameters:
NameTypeDescription
dampNumber

(static) setObjectDefaultElasticity(elasticity)

Set how much to bounce when a collision occur

Parameters:
NameTypeDescription
elasticityNumber

(static) setObjectDefaultFriction(friction)

Set how much to slow when touching

Parameters:
NameTypeDescription
frictionNumber

(static) setObjectDefaultMass(mass)

Set default object mass for collison calcuations

Parameters:
NameTypeDescription
massNumber

(static) setObjectMaxSpeed(speed)

Set max speed to avoid fast objects missing collisions

Parameters:
NameTypeDescription
speedNumber

(static) setParticleEmitRateScale(scale)

Set to scales emit rate of particles

Parameters:
NameTypeDescription
scaleNumber

(static) setShowSplashScreen(show)

Set if the LittleJS splash screen be shown on startup

Parameters:
NameTypeDescription
showBoolean

(static) setSoundDefaultRange(range)

Set default range where sound no longer plays

Parameters:
NameTypeDescription
rangeNumber

(static) setSoundDefaultTaper(taper)

Set default range percent to start tapering off sound

Parameters:
NameTypeDescription
taperNumber

(static) setSoundEnable(enable)

Set to disable all audio code

Parameters:
NameTypeDescription
enableBoolean

(static) setSoundVolume(volume)

Set volume scale to apply to all sound, music and speech

Parameters:
NameTypeDescription
volumeNumber

(static) setTileFixBleedScale(scale)

Set to prevent tile bleeding from neighbors in pixels

Parameters:
NameTypeDescription
scaleNumber

(static) setTileSizeDefault(size)

Set default size of tiles in pixels

Parameters:
NameTypeDescription
sizeVector2

(static) setTouchGamepadAlpha(alpha)

Set transparency of touch gamepad overlay

Parameters:
NameTypeDescription
alphaNumber

(static) setTouchGamepadAnalog(analog)

Set if touch gamepad should be analog stick or 8 way dpad

Parameters:
NameTypeDescription
analogBoolean

(static) setTouchGamepadEnable(enable)

Set if touch gamepad should appear on mobile devices

Parameters:
NameTypeDescription
enableBoolean

(static) setTouchGamepadSize(size)

Set size of virutal gamepad for touch devices in pixels

Parameters:
NameTypeDescription
sizeNumber

(static) setVibrateEnable(enable)

Set to allow vibration hardware if it exists

Parameters:
NameTypeDescription
enableBoolean
\ No newline at end of file +
On this page

Settings

LittleJS Engine Settings

  • All settings for the engine are here

Members

(static) cameraPos :Vector2

Position of camera in world space

Type:
Default Value
  • Vector2()

(static) cameraScale :Number

Scale of camera in world space

Type:
  • Number
Default Value
  • 32

(static) canvasFixedSize :Vector2

Fixed size of the canvas, if enabled canvas size never changes

  • you may also need to set mainCanvasSize if using screen space coords in startup
Type:
Default Value
  • Vector2()

(static) canvasMaxSize :Vector2

The max size of the canvas, centered if window is larger

Type:
Default Value
  • Vector2(1920,1200)

(static) canvasPixelated :Boolean

Disables filtering for crisper pixel art if true

Type:
  • Boolean
Default Value
  • true

(static) enablePhysicsSolver :Boolean

Enable physics solver for collisions between objects

Type:
  • Boolean
Default Value
  • true

(static) fontDefault :String

Default font used for text rendering

Type:
  • String
Default Value
  • arial

(static) gamepadDirectionEmulateStick :Boolean

If true, the dpad input is also routed to the left analog stick (for better accessability)

Type:
  • Boolean
Default Value
  • true

(static) gamepadsEnable :Boolean

Should gamepads be allowed

Type:
  • Boolean
Default Value
  • true

(static) glEnable :Boolean

Enable webgl rendering, webgl can be disabled and removed from build (with some features disabled)

Type:
  • Boolean
Default Value
  • true

(static) glOverlay :Boolean

Fixes slow rendering in some browsers by not compositing the WebGL canvas

Type:
  • Boolean
Default Value
  • true

(static) gravity :Number

How much gravity to apply to objects along the Y axis, negative is down

Type:
  • Number

(static) inputWASDEmulateDirection :Boolean

If true the WASD keys are also routed to the direction keys (for better accessability)

Type:
  • Boolean
Default Value
  • true

(static) medalDisplayIconSize :Number

Size of icon in medal display

Type:
  • Number
Default Value
  • 50

(static) medalDisplaySize :Vector2

Size of medal display

Type:
Default Value
  • Vector2(640,80)

(static) medalDisplaySlideTime :Number

How quickly to slide on/off medals in seconds

Type:
  • Number
Default Value
  • 0.5

(static) medalDisplayTime :Number

How long to show medals for in seconds

Type:
  • Number
Default Value
  • 5

(static) medalsPreventUnlock :Boolean

Set to stop medals from being unlockable (like if cheats are enabled)

Type:
  • Boolean

(static) objectDefaultAngleDamping :Number

How much to slow angular velocity each frame (0-1)

Type:
  • Number
Default Value
  • 1

(static) objectDefaultDamping :Number

How much to slow velocity by each frame (0-1)

Type:
  • Number
Default Value
  • 1

(static) objectDefaultElasticity :Number

How much to bounce when a collision occurs (0-1)

Type:
  • Number

(static) objectDefaultFriction :Number

How much to slow when touching (0-1)

Type:
  • Number
Default Value
  • 0.8

(static) objectDefaultMass :Number

Default object mass for collision calcuations (how heavy objects are)

Type:
  • Number
Default Value
  • 1

(static) objectMaxSpeed :Number

Clamp max speed to avoid fast objects missing collisions

Type:
  • Number
Default Value
  • 1

(static) particleEmitRateScale :Number

Scales emit rate of particles, useful for low graphics mode (0 disables particle emitters)

Type:
  • Number
Default Value
  • 1

(static) showSplashScreen :Boolean

Enable to show the LittleJS splash screen be shown on startup

Type:
  • Boolean

(static) soundDefaultRange :Number

Default range where sound no longer plays

Type:
  • Number
Default Value
  • 40

(static) soundDefaultTaper :Number

Default range percent to start tapering off sound (0-1)

Type:
  • Number
Default Value
  • 0.7

(static) soundEnable :Boolean

All audio code can be disabled and removed from build

Type:
  • Boolean
Default Value
  • true

(static) soundVolume :Number

Volume scale to apply to all sound, music and speech

Type:
  • Number
Default Value
  • 0.5

(static) tileFixBleedScale :Number

How many pixels smaller to draw tiles to prevent bleeding from neighbors

Type:
  • Number
Default Value
  • 0.1

(static) tileSizeDefault :Vector2

Default size of tiles in pixels

Type:
Default Value
  • Vector2(16,16)

(static) touchGamepadAlpha :Number

Transparency of touch gamepad overlay

Type:
  • Number
Default Value
  • 0.3

(static) touchGamepadAnalog :Boolean

True if touch gamepad should be analog stick or false to use if 8 way dpad

Type:
  • Boolean
Default Value
  • true

(static) touchGamepadEnable :Boolean

True if touch gamepad should appear on mobile devices

  • Supports left analog stick, 4 face buttons and start button (button 9)
  • Must be set by end of gameInit to be activated
Type:
  • Boolean

(static) touchGamepadSize :Number

Size of virtual gamepad for touch devices in pixels

Type:
  • Number
Default Value
  • 99

(static) vibrateEnable :Boolean

Allow vibration hardware if it exists

Type:
  • Boolean
Default Value
  • true

Methods

(static) setCameraPos(pos)

Set position of camera in world space

Parameters:
NameTypeDescription
posVector2

(static) setCameraScale(scale)

Set scale of camera in world space

Parameters:
NameTypeDescription
scaleNumber

(static) setCanvasFixedSize(size)

Set fixed size of the canvas

Parameters:
NameTypeDescription
sizeVector2

(static) setCanvasMaxSize(size)

Set max size of the canvas

Parameters:
NameTypeDescription
sizeVector2

(static) setCanvasPixelated(pixelated)

Disables anti aliasing for pixel art if true

Parameters:
NameTypeDescription
pixelatedBoolean

(static) setEnablePhysicsSolver(enable)

Set if collisions between objects are enabled

Parameters:
NameTypeDescription
enableBoolean

(static) setFontDefault(font)

Set default font used for text rendering

Parameters:
NameTypeDescription
fontString

(static) setGamepadDirectionEmulateStick(enable)

Set if the dpad input is also routed to the left analog stick

Parameters:
NameTypeDescription
enableBoolean

(static) setGamepadsEnable(enable)

Set if gamepads are enabled

Parameters:
NameTypeDescription
enableBoolean

(static) setGlEnable(enable)

Set if webgl rendering is enabled

Parameters:
NameTypeDescription
enableBoolean

(static) setGlOverlay(overlay)

Set to not composite the WebGL canvas

Parameters:
NameTypeDescription
overlayBoolean

(static) setGravity(newGravity)

Set how much gravity to apply to objects along the Y axis

Parameters:
NameTypeDescription
newGravityNumber

(static) setInputWASDEmulateDirection(enable)

Set if true the WASD keys are also routed to the direction keys

Parameters:
NameTypeDescription
enableBoolean

(static) setMedalDisplayIconSize(size)

Set size of icon in medal display

Parameters:
NameTypeDescription
sizeNumber

(static) setMedalDisplaySize(size)

Set size of medal display

Parameters:
NameTypeDescription
sizeVector2

(static) setMedalDisplaySlideTime(time)

Set how quickly to slide on/off medals in seconds

Parameters:
NameTypeDescription
timeNumber

(static) setMedalDisplayTime(time)

Set how long to show medals for in seconds

Parameters:
NameTypeDescription
timeNumber

(static) setMedalsPreventUnlock(preventUnlock)

Set to stop medals from being unlockable

Parameters:
NameTypeDescription
preventUnlockBoolean

(static) setObjectDefaultAngleDamping(damp)

Set how much to slow angular velocity each frame

Parameters:
NameTypeDescription
dampNumber

(static) setObjectDefaultDamping(damp)

Set how much to slow velocity by each frame

Parameters:
NameTypeDescription
dampNumber

(static) setObjectDefaultElasticity(elasticity)

Set how much to bounce when a collision occur

Parameters:
NameTypeDescription
elasticityNumber

(static) setObjectDefaultFriction(friction)

Set how much to slow when touching

Parameters:
NameTypeDescription
frictionNumber

(static) setObjectDefaultMass(mass)

Set default object mass for collison calcuations

Parameters:
NameTypeDescription
massNumber

(static) setObjectMaxSpeed(speed)

Set max speed to avoid fast objects missing collisions

Parameters:
NameTypeDescription
speedNumber

(static) setParticleEmitRateScale(scale)

Set to scales emit rate of particles

Parameters:
NameTypeDescription
scaleNumber

(static) setShowSplashScreen(show)

Set if the LittleJS splash screen be shown on startup

Parameters:
NameTypeDescription
showBoolean

(static) setSoundDefaultRange(range)

Set default range where sound no longer plays

Parameters:
NameTypeDescription
rangeNumber

(static) setSoundDefaultTaper(taper)

Set default range percent to start tapering off sound

Parameters:
NameTypeDescription
taperNumber

(static) setSoundEnable(enable)

Set to disable all audio code

Parameters:
NameTypeDescription
enableBoolean

(static) setSoundVolume(volume)

Set volume scale to apply to all sound, music and speech

Parameters:
NameTypeDescription
volumeNumber

(static) setTileFixBleedScale(scale)

Set to prevent tile bleeding from neighbors in pixels

Parameters:
NameTypeDescription
scaleNumber

(static) setTileSizeDefault(size)

Set default size of tiles in pixels

Parameters:
NameTypeDescription
sizeVector2

(static) setTouchGamepadAlpha(alpha)

Set transparency of touch gamepad overlay

Parameters:
NameTypeDescription
alphaNumber

(static) setTouchGamepadAnalog(analog)

Set if touch gamepad should be analog stick or 8 way dpad

Parameters:
NameTypeDescription
analogBoolean

(static) setTouchGamepadEnable(enable)

Set if touch gamepad should appear on mobile devices

Parameters:
NameTypeDescription
enableBoolean

(static) setTouchGamepadSize(size)

Set size of virutal gamepad for touch devices in pixels

Parameters:
NameTypeDescription
sizeNumber

(static) setVibrateEnable(enable)

Set to allow vibration hardware if it exists

Parameters:
NameTypeDescription
enableBoolean
\ No newline at end of file diff --git a/docs/Sound.html b/docs/Sound.html index a4d65ee2..ea7f5b0b 100644 --- a/docs/Sound.html +++ b/docs/Sound.html @@ -1,3 +1,3 @@ Class: Sound
On this page

Sound

Sound Object - Stores a zzfx sound for later use and can be played positionally

Create sounds using the ZzFX Sound Designer.

Constructor

new Sound(zzfxSound, rangeopt, taperopt)

Create a sound object and cache the zzfx samples for later use

Parameters:
NameTypeAttributesDefaultDescription
zzfxSoundArray

Array of zzfx parameters, ex. [.5,.5]

rangeNumber<optional>
soundDefaultRange

World space max range of sound, will not play if camera is farther away

taperNumber<optional>
soundDefaultTaper

At what percentage of range should it start tapering off

Example
// create a sound
const sound_example = new Sound([.5,.5]);

// play the sound
sound_example.play();

Members

randomness

Properties
TypeDescription
Number

How much to randomize frequency each time sound plays

range

Properties
TypeDescription
Number

World space max range of sound, will not play if camera is farther away

taper

Properties
TypeDescription
Number

At what percentage of range should it start tapering off

Methods

getDuration() → {Number}

Get how long this sound is in seconds

Returns:
  • How long the sound is in seconds (undefined if loading)
Type: 
Number

getSource() → {AudioBufferSourceNode}

Get source of most recent instance of this sound that was played

Returns:
Type: 
AudioBufferSourceNode

isLoading() → {Boolean}

Check if sound is loading, for sounds fetched from a url

Returns:
  • True if sound is loading and not ready to play
Type: 
Boolean

play(posopt, volumeopt, pitchopt, randomnessScaleopt, loopopt) → {AudioBufferSourceNode}

Play the sound

Parameters:
NameTypeAttributesDefaultDescription
posVector2<optional>

World space position to play the sound, sound is not attenuated if null

volumeNumber<optional>
1

How much to scale volume by (in addition to range fade)

pitchNumber<optional>
1

How much to scale pitch by (also adjusted by this.randomness)

randomnessScaleNumber<optional>
1

How much to scale randomness

loopBoolean<optional>
false

Should the sound loop

Returns:
  • The audio source node
Type: 
AudioBufferSourceNode

playNote(semitoneOffset, posopt, volumeopt) → {AudioBufferSourceNode}

Play the sound as a note with a semitone offset

Parameters:
NameTypeAttributesDefaultDescription
semitoneOffsetNumber

How many semitones to offset pitch

posVector2<optional>

World space position to play the sound, sound is not attenuated if null

volumeNumber<optional>
1

How much to scale volume by (in addition to range fade)

Returns:
  • The audio source node
Type: 
AudioBufferSourceNode

stop()

Stop the last instance of this sound that was played

\ No newline at end of file +
On this page

Sound

Sound Object - Stores a sound for later use and can be played positionally

Create sounds using the ZzFX Sound Designer.

Constructor

new Sound(zzfxSound, rangeopt, taperopt)

Create a sound object and cache the zzfx samples for later use

Parameters:
NameTypeAttributesDefaultDescription
zzfxSoundArray

Array of zzfx parameters, ex. [.5,.5]

rangeNumber<optional>
soundDefaultRange

World space max range of sound, will not play if camera is farther away

taperNumber<optional>
soundDefaultTaper

At what percentage of range should it start tapering

Example
// create a sound
const sound_example = new Sound([.5,.5]);

// play the sound
sound_example.play();

Members

randomness

Properties
TypeDescription
Number

How much to randomize frequency each time sound plays

range

Properties
TypeDescription
Number

World space max range of sound, will not play if camera is farther away

taper

Properties
TypeDescription
Number

At what percentage of range should it start tapering off

Methods

getDuration() → {Number}

Get how long this sound is in seconds

Returns:
  • How long the sound is in seconds (undefined if loading)
Type: 
Number

getSource() → {AudioBufferSourceNode}

Get source of most recent instance of this sound that was played

Returns:
Type: 
AudioBufferSourceNode

isLoading() → {Boolean}

Check if sound is loading, for sounds fetched from a url

Returns:
  • True if sound is loading and not ready to play
Type: 
Boolean

play(posopt, volumeopt, pitchopt, randomnessScaleopt, loopopt) → {AudioBufferSourceNode}

Play the sound

Parameters:
NameTypeAttributesDefaultDescription
posVector2<optional>

World space position to play the sound, sound is not attenuated if null

volumeNumber<optional>
1

How much to scale volume by (in addition to range fade)

pitchNumber<optional>
1

How much to scale pitch by (also adjusted by this.randomness)

randomnessScaleNumber<optional>
1

How much to scale randomness

loopBoolean<optional>
false

Should the sound loop

Returns:
  • The audio source node
Type: 
AudioBufferSourceNode

playNote(semitoneOffset, posopt, volumeopt) → {AudioBufferSourceNode}

Play the sound as a note with a semitone offset

Parameters:
NameTypeAttributesDefaultDescription
semitoneOffsetNumber

How many semitones to offset pitch

posVector2<optional>

World space position to play the sound, sound is not attenuated if null

volumeNumber<optional>
1

How much to scale volume by (in addition to range fade)

Returns:
  • The audio source node
Type: 
AudioBufferSourceNode

stop()

Stop the last instance of this sound that was played

\ No newline at end of file diff --git a/docs/TextureInfo.html b/docs/TextureInfo.html index ef96e9ec..995233b5 100644 --- a/docs/TextureInfo.html +++ b/docs/TextureInfo.html @@ -1,3 +1,3 @@ Class: TextureInfo
On this page

TextureInfo

Texture Info - Stores info about each texture

Constructor

new TextureInfo(image)

Create a TextureInfo, called automatically by the engine

Parameters:
NameTypeDescription
imageHTMLImageElement

Members

fixBleedSize

Properties
TypeDescription
Vector2

size to adjust tile to fix bleeding

glTexture

Properties
TypeDescription
WebGLTexture

webgl texture

image

Properties
TypeDescription
HTMLImageElement

image source

size

Properties
TypeDescription
Vector2

size of the image

\ No newline at end of file +
On this page

TextureInfo

Texture Info - Stores info about each texture

Constructor

new TextureInfo(image)

Create a TextureInfo, called automatically by the engine

Parameters:
NameTypeDescription
imageHTMLImageElement

Members

fixBleedSize

Properties
TypeDescription
Vector2

size to adjust tile to fix bleeding

glTexture

Properties
TypeDescription
WebGLTexture

webgl texture

image

Properties
TypeDescription
HTMLImageElement

image source

size

Properties
TypeDescription
Vector2

size of the image

\ No newline at end of file diff --git a/docs/TileCollision.html b/docs/TileCollision.html index 55741dcd..b016a864 100644 --- a/docs/TileCollision.html +++ b/docs/TileCollision.html @@ -1,3 +1,3 @@ Namespace: TileCollision
On this page

TileCollision

LittleJS Tile Layer System

  • Caches arrays of tiles to off screen canvas for fast rendering
  • Unlimted numbers of layers, allocates canvases as needed
  • Interfaces with EngineObject for collision
  • Collision layer is separate from visible layers
  • It is recommended to have a visible layer that matches the collision
  • Tile layers can be drawn to using their context with canvas2d
  • Drawn directly to the main canvas without using WebGL

Members

(static) tileCollision :Array

The tile collision layer array, use setTileCollisionData and getTileCollisionData to access

Type:
  • Array

(static) tileCollisionSize :Vector2

Size of the tile collision layer

Type:

Methods

(static) getTileCollisionData(pos) → {Number}

Get tile collision data

Parameters:
NameTypeDescription
posVector2
Returns:
Type: 
Number

(static) initTileCollision(size)

Clear and initialize tile collision

Parameters:
NameTypeDescription
sizeVector2

(static) setTileCollisionData(pos, dataopt)

Set tile collision data

Parameters:
NameTypeAttributesDefaultDescription
posVector2
dataNumber<optional>
0

(static) tileCollisionRaycast(posStart, posEnd, objectopt) → {Vector2}

Return the center of tile if any that is hit (does not return the exact intersection)

Parameters:
NameTypeAttributesDescription
posStartVector2
posEndVector2
objectEngineObject<optional>
Returns:
Type: 
Vector2

(static) tileCollisionTest(pos, sizeopt, objectopt) → {Boolean}

Check if collision with another object should occur

Parameters:
NameTypeAttributesDefaultDescription
posVector2
sizeVector2<optional>
(1,1)
objectEngineObject<optional>
Returns:
Type: 
Boolean
\ No newline at end of file +
On this page

TileCollision

LittleJS Tile Layer System

  • Caches arrays of tiles to off screen canvas for fast rendering
  • Unlimited numbers of layers, allocates canvases as needed
  • Interfaces with EngineObject for collision
  • Collision layer is separate from visible layers
  • It is recommended to have a visible layer that matches the collision
  • Tile layers can be drawn to using their context with canvas2d
  • Drawn directly to the main canvas without using WebGL

Members

(static) tileCollision :Array

The tile collision layer array, use setTileCollisionData and getTileCollisionData to access

Type:
  • Array

(static) tileCollisionSize :Vector2

Size of the tile collision layer

Type:

Methods

(static) getTileCollisionData(pos) → {Number}

Get tile collision data

Parameters:
NameTypeDescription
posVector2
Returns:
Type: 
Number

(static) initTileCollision(size)

Clear and initialize tile collision

Parameters:
NameTypeDescription
sizeVector2

(static) setTileCollisionData(pos, dataopt)

Set tile collision data

Parameters:
NameTypeAttributesDefaultDescription
posVector2
dataNumber<optional>
0

(static) tileCollisionRaycast(posStart, posEnd, objectopt) → {Vector2}

Return the center of tile if any that is hit (does not return the exact intersection)

Parameters:
NameTypeAttributesDescription
posStartVector2
posEndVector2
objectEngineObject<optional>
Returns:
Type: 
Vector2

(static) tileCollisionTest(pos, sizeopt, objectopt) → {Boolean}

Check if collision with another object should occur

Parameters:
NameTypeAttributesDefaultDescription
posVector2
sizeVector2<optional>
(0,0)
objectEngineObject<optional>
Returns:
Type: 
Boolean
\ No newline at end of file diff --git a/docs/TileInfo.html b/docs/TileInfo.html index 853d96a8..739e58af 100644 --- a/docs/TileInfo.html +++ b/docs/TileInfo.html @@ -1,3 +1,3 @@ Class: TileInfo
On this page

TileInfo

Tile Info - Stores info about how to draw a tile

Constructor

new TileInfo(posopt, sizeopt, textureIndexopt)

Create a tile info object

Parameters:
NameTypeAttributesDefaultDescription
posVector2<optional>
(0,0)

Top left corner of tile in pixels

sizeVector2<optional>
tileSizeDefault

Size of tile in pixels

textureIndexNumber<optional>
0

Texture index to use

Members

pos

Properties
TypeDescription
Vector2

Top left corner of tile in pixels

size

Properties
TypeDescription
Vector2

Size of tile in pixels

textureIndex

Properties
TypeDescription
Number

Texture index to use

Methods

getTextureInfo() → {TextureInfo}

Returns the texture info for this tile

Returns:
Type: 
TextureInfo

offset(offset) → {TileInfo}

Returns an offset copy of this tile, useful for animation

Parameters:
NameTypeDescription
offsetVector2

Offset to apply in pixels

Returns:
Type: 
TileInfo
\ No newline at end of file +
On this page

TileInfo

Tile Info - Stores info about how to draw a tile

Constructor

new TileInfo(posopt, sizeopt, textureIndexopt)

Create a tile info object

Parameters:
NameTypeAttributesDefaultDescription
posVector2<optional>
(0,0)

Top left corner of tile in pixels

sizeVector2<optional>
tileSizeDefault

Size of tile in pixels

textureIndexNumber<optional>
0

Texture index to use

Members

pos

Properties
TypeDescription
Vector2

Top left corner of tile in pixels

size

Properties
TypeDescription
Vector2

Size of tile in pixels

textureIndex

Properties
TypeDescription
Number

Texture index to use

Methods

frame(frame) → {TileInfo}

Returns a copy of this tile offset by a number of animation frames

Parameters:
NameTypeDescription
frameNumber

Offset to apply in animation frames

Returns:
Type: 
TileInfo

getTextureInfo() → {TextureInfo}

Returns the texture info for this tile

Returns:
Type: 
TextureInfo

offset(offset) → {TileInfo}

Returns a copy of this tile offset by a vector

Parameters:
NameTypeDescription
offsetVector2

Offset to apply in pixels

Returns:
Type: 
TileInfo
\ No newline at end of file diff --git a/docs/Utilities.html b/docs/Utilities.html index 3f2a00a1..653ec5ed 100644 --- a/docs/Utilities.html +++ b/docs/Utilities.html @@ -1,3 +1,3 @@ Namespace: Utilities
On this page

Utilities

LittleJS Utility Classes and Functions

  • General purpose math library
  • Vector2 - fast, simple, easy 2D vector class
  • Color - holds a rgba color with some math functions
  • Timer - tracks time automatically
  • RandomGenerator - seeded random number generator

Members

(static, constant) PI :Number

A shortcut to get Math.PI

Type:
  • Number
Default Value
  • Math.PI

Methods

(static) abs(value) → {Number}

Returns absoulte value of value passed in

Parameters:
NameTypeDescription
valueNumber
Returns:
Type: 
Number

(static) clamp(value, minopt, maxopt) → {Number}

Clamps the value beween max and min

Parameters:
NameTypeAttributesDefaultDescription
valueNumber
minNumber<optional>
0
maxNumber<optional>
1
Returns:
Type: 
Number

(static) distanceAngle(angleA, angleB) → {Number}

Returns signed wrapped distance between the two angles passed in

Parameters:
NameTypeDescription
angleANumber
angleBNumber
Returns:
Type: 
Number

(static) distanceWrap(valueA, valueB, wrapSizeopt) → {Number}

Returns signed wrapped distance between the two values passed in

Parameters:
NameTypeAttributesDefaultDescription
valueANumber
valueBNumber
wrapSizeNumber<optional>
1
Returns:
Type: 
Number

(static) formatTime(t) → {String}

Formats seconds to mm:ss style for display purposes

Parameters:
NameTypeDescription
tNumber

time in seconds

Returns:
Type: 
String

(static) hsl(hopt, sopt, lopt, aopt) → {Color}

Create a color object with HSLA values, white by default

Parameters:
NameTypeAttributesDefaultDescription
hNumber<optional>
0

hue

sNumber<optional>
0

saturation

lNumber<optional>
1

lightness

aNumber<optional>
1

alpha

Returns:
Type: 
Color

(static) isColor(c) → {Boolean}

Check if object is a valid Color

Parameters:
NameTypeDescription
cany
Returns:
Type: 
Boolean

(static) isOverlapping(pointA, sizeA, pointB, sizeBopt) → {Boolean}

Returns true if two axis aligned bounding boxes are overlapping

Parameters:
NameTypeAttributesDefaultDescription
pointAVector2

Center of box A

sizeAVector2

Size of box A

pointBVector2

Center of box B

sizeBVector2<optional>
(0,0)

Size of box B, a point if undefined

Returns:
  • True if overlapping
Type: 
Boolean

(static) isVector2(v) → {Boolean}

Check if object is a valid Vector2

Parameters:
NameTypeDescription
vany
Returns:
Type: 
Boolean

(static) lerp(percent, valueA, valueB) → {Number}

Linearly interpolates between values passed in using percent

Parameters:
NameTypeDescription
percentNumber
valueANumber
valueBNumber
Returns:
Type: 
Number

(static) lerpAngle(percent, angleA, angleB) → {Number}

Linearly interpolates between the angles passed in with wrappping

Parameters:
NameTypeDescription
percentNumber
angleANumber
angleBNumber
Returns:
Type: 
Number

(static) lerpWrap(percent, valueA, valueB, wrapSizeopt) → {Number}

Linearly interpolates between values passed in with wrappping

Parameters:
NameTypeAttributesDefaultDescription
percentNumber
valueANumber
valueBNumber
wrapSizeNumber<optional>
1
Returns:
Type: 
Number

(static) max(valueA, valueB) → {Number}

Returns highest of two values passed in

Parameters:
NameTypeDescription
valueANumber
valueBNumber
Returns:
Type: 
Number

(static) min(valueA, valueB) → {Number}

Returns lowest of two values passed in

Parameters:
NameTypeDescription
valueANumber
valueBNumber
Returns:
Type: 
Number

(static) mod(dividend, divisoropt) → {Number}

Returns first parm modulo the second param, but adjusted so negative numbers work as expected

Parameters:
NameTypeAttributesDefaultDescription
dividendNumber
divisorNumber<optional>
1
Returns:
Type: 
Number

(static) nearestPowerOfTwo(value) → {Number}

Returns the nearest power of two not less then the value

Parameters:
NameTypeDescription
valueNumber
Returns:
Type: 
Number

(static) percent(value, valueA, valueB) → {Number}

Returns what percentage the value is between valueA and valueB

Parameters:
NameTypeDescription
valueNumber
valueANumber
valueBNumber
Returns:
Type: 
Number

(static) rgb(ropt, gopt, bopt, aopt) → {Color}

Create a color object with RGBA values, white by default

Parameters:
NameTypeAttributesDefaultDescription
rNumber<optional>
1

red

gNumber<optional>
1

green

bNumber<optional>
1

blue

aNumber<optional>
1

alpha

Returns:
Type: 
Color

(static) sign(value) → {Number}

Returns the sign of value passed in (also returns 1 if 0)

Parameters:
NameTypeDescription
valueNumber
Returns:
Type: 
Number

(static) smoothStep(percent) → {Number}

Applies smoothstep function to the percentage value

Parameters:
NameTypeDescription
percentNumber
Returns:
Type: 
Number

(static) vec2(xopt, yopt) → {Vector2}

Create a 2d vector, can take another Vector2 to copy, 2 scalars, or 1 scalar

Parameters:
NameTypeAttributesDefaultDescription
xNumber | Vector2<optional>
0
yNumber<optional>
Returns:
Type: 
Vector2
Example
let a = vec2(0, 1); // vector with coordinates (0, 1)
let b = vec2(a);    // copy a into b
a = vec2(5);        // set a to (5, 5)
b = vec2();         // set b to (0, 0)

(static) wave(frequencyopt, amplitudeopt, topt) → {Number}

Returns an oscillating wave between 0 and amplitude with frequency of 1 Hz by default

Parameters:
NameTypeAttributesDefaultDescription
frequencyNumber<optional>
1

Frequency of the wave in Hz

amplitudeNumber<optional>
1

Amplitude (max height) of the wave

tNumber<optional>
time

Value to use for time of the wave

Returns:
  • Value waving between 0 and amplitude
Type: 
Number
\ No newline at end of file +
On this page

Utilities

LittleJS Utility Classes and Functions

  • General purpose math library
  • Vector2 - fast, simple, easy 2D vector class
  • Color - holds a rgba color with some math functions
  • Timer - tracks time automatically
  • RandomGenerator - seeded random number generator

Members

(static, constant) PI :Number

A shortcut to get Math.PI

Type:
  • Number
Default Value
  • Math.PI

Methods

(static) abs(value) → {Number}

Returns absoulte value of value passed in

Parameters:
NameTypeDescription
valueNumber
Returns:
Type: 
Number

(static) clamp(value, minopt, maxopt) → {Number}

Clamps the value beween max and min

Parameters:
NameTypeAttributesDefaultDescription
valueNumber
minNumber<optional>
0
maxNumber<optional>
1
Returns:
Type: 
Number

(static) distanceAngle(angleA, angleB) → {Number}

Returns signed wrapped distance between the two angles passed in

Parameters:
NameTypeDescription
angleANumber
angleBNumber
Returns:
Type: 
Number

(static) distanceWrap(valueA, valueB, wrapSizeopt) → {Number}

Returns signed wrapped distance between the two values passed in

Parameters:
NameTypeAttributesDefaultDescription
valueANumber
valueBNumber
wrapSizeNumber<optional>
1
Returns:
Type: 
Number

(static) formatTime(t) → {String}

Formats seconds to mm:ss style for display purposes

Parameters:
NameTypeDescription
tNumber

time in seconds

Returns:
Type: 
String

(static) hsl(hopt, sopt, lopt, aopt) → {Color}

Create a color object with HSLA values, white by default

Parameters:
NameTypeAttributesDefaultDescription
hNumber<optional>
0

hue

sNumber<optional>
0

saturation

lNumber<optional>
1

lightness

aNumber<optional>
1

alpha

Returns:
Type: 
Color

(static) isColor(c) → {Boolean}

Check if object is a valid Color

Parameters:
NameTypeDescription
cany
Returns:
Type: 
Boolean

(static) isOverlapping(pointA, sizeA, pointB, sizeBopt) → {Boolean}

Returns true if two axis aligned bounding boxes are overlapping

Parameters:
NameTypeAttributesDefaultDescription
pointAVector2

Center of box A

sizeAVector2

Size of box A

pointBVector2

Center of box B

sizeBVector2<optional>
(0,0)

Size of box B, a point if undefined

Returns:
  • True if overlapping
Type: 
Boolean

(static) isVector2(v) → {Boolean}

Check if object is a valid Vector2

Parameters:
NameTypeDescription
vany
Returns:
Type: 
Boolean

(static) lerp(percent, valueA, valueB) → {Number}

Linearly interpolates between values passed in using percent

Parameters:
NameTypeDescription
percentNumber
valueANumber
valueBNumber
Returns:
Type: 
Number

(static) lerpAngle(percent, angleA, angleB) → {Number}

Linearly interpolates between the angles passed in with wrapping

Parameters:
NameTypeDescription
percentNumber
angleANumber
angleBNumber
Returns:
Type: 
Number

(static) lerpWrap(percent, valueA, valueB, wrapSizeopt) → {Number}

Linearly interpolates between values passed in with wrapping

Parameters:
NameTypeAttributesDefaultDescription
percentNumber
valueANumber
valueBNumber
wrapSizeNumber<optional>
1
Returns:
Type: 
Number

(static) max(valueA, valueB) → {Number}

Returns highest of two values passed in

Parameters:
NameTypeDescription
valueANumber
valueBNumber
Returns:
Type: 
Number

(static) min(valueA, valueB) → {Number}

Returns lowest of two values passed in

Parameters:
NameTypeDescription
valueANumber
valueBNumber
Returns:
Type: 
Number

(static) mod(dividend, divisoropt) → {Number}

Returns first parm modulo the second param, but adjusted so negative numbers work as expected

Parameters:
NameTypeAttributesDefaultDescription
dividendNumber
divisorNumber<optional>
1
Returns:
Type: 
Number

(static) nearestPowerOfTwo(value) → {Number}

Returns the nearest power of two not less then the value

Parameters:
NameTypeDescription
valueNumber
Returns:
Type: 
Number

(static) percent(value, valueA, valueB) → {Number}

Returns what percentage the value is between valueA and valueB

Parameters:
NameTypeDescription
valueNumber
valueANumber
valueBNumber
Returns:
Type: 
Number

(static) rgb(ropt, gopt, bopt, aopt) → {Color}

Create a color object with RGBA values, white by default

Parameters:
NameTypeAttributesDefaultDescription
rNumber<optional>
1

red

gNumber<optional>
1

green

bNumber<optional>
1

blue

aNumber<optional>
1

alpha

Returns:
Type: 
Color

(static) sign(value) → {Number}

Returns the sign of value passed in

Parameters:
NameTypeDescription
valueNumber
Returns:
Type: 
Number

(static) smoothStep(percent) → {Number}

Applies smoothstep function to the percentage value

Parameters:
NameTypeDescription
percentNumber
Returns:
Type: 
Number

(static) vec2(xopt, yopt) → {Vector2}

Create a 2d vector, can take another Vector2 to copy, 2 scalars, or 1 scalar

Parameters:
NameTypeAttributesDefaultDescription
xNumber | Vector2<optional>
0
yNumber<optional>
Returns:
Type: 
Vector2
Example
let a = vec2(0, 1); // vector with coordinates (0, 1)
let b = vec2(a);    // copy a into b
a = vec2(5);        // set a to (5, 5)
b = vec2();         // set b to (0, 0)

(static) wave(frequencyopt, amplitudeopt, topt) → {Number}

Returns an oscillating wave between 0 and amplitude with frequency of 1 Hz by default

Parameters:
NameTypeAttributesDefaultDescription
frequencyNumber<optional>
1

Frequency of the wave in Hz

amplitudeNumber<optional>
1

Amplitude (max height) of the wave

tNumber<optional>
time

Value to use for time of the wave

Returns:
  • Value waving between 0 and amplitude
Type: 
Number
\ No newline at end of file diff --git a/docs/WebGL.html b/docs/WebGL.html index 10e534e4..95eac508 100644 --- a/docs/WebGL.html +++ b/docs/WebGL.html @@ -1,3 +1,3 @@ Namespace: WebGL
On this page

WebGL

LittleJS WebGL Interface

  • All webgl used by the engine is wrapped up here
  • For normal stuff you won't need to see or call anything in this file
  • For advanced stuff there are helper functions to create shaders, textures, etc
  • Can be disabled with glEnable to revert to 2D canvas rendering
  • Batches sprite rendering on GPU for incredibly fast performance
  • Sprite transform math is done in the shader where possible
  • Supports shadertoy style post processing shaders

Members

(static) glCanvas :HTMLCanvasElement

The WebGL canvas which appears above the main canvas and below the overlay canvas

Type:
  • HTMLCanvasElement

(static) glContext :WebGL2RenderingContext

2d context for glCanvas

Type:
  • WebGL2RenderingContext

Methods

(static) glCompileShader(source, type) → {WebGLShader}

Compile WebGL shader of the given type, will throw errors if in debug mode

Parameters:
NameTypeDescription
sourceString
typeNumber
Returns:
Type: 
WebGLShader

(static) glCopyToContext(context, forceDrawopt)

Draw any sprites still in the buffer, copy to main canvas and clear

Parameters:
NameTypeAttributesDefaultDescription
contextCanvasRenderingContext2D
forceDrawBoolean<optional>
false

(static) glCreateProgram(vsSource, fsSource) → {WebGLProgram}

Create WebGL program with given shaders

Parameters:
NameTypeDescription
vsSourceString
fsSourceString
Returns:
Type: 
WebGLProgram

(static) glCreateTexture(image) → {WebGLTexture}

Create WebGL texture from an image and init the texture settings

Parameters:
NameTypeDescription
imageHTMLImageElement
Returns:
Type: 
WebGLTexture

(static) glDraw(x, y, sizeX, sizeY, angle, uv0X, uv0Y, uv1X, uv1Y, rgba, rgbaAdditiveopt)

Add a sprite to the gl draw list, used by all gl draw functions

Parameters:
NameTypeAttributesDefaultDescription
xNumber
yNumber
sizeXNumber
sizeYNumber
angleNumber
uv0XNumber
uv0YNumber
uv1XNumber
uv1YNumber
rgbaNumber
rgbaAdditiveNumber<optional>
0

(static) glFlush()

Draw all sprites and clear out the buffer, called automatically by the system whenever necessary

(static) glInitPostProcess(shaderCode, includeOverlay)

Set up a post processing shader

Parameters:
NameTypeDefaultDescription
shaderCodeString
includeOverlayBooleanfalse

(static) glSetTexture(texture)

Set the WebGl texture, called automatically if using multiple textures

  • This may also flush the gl buffer resulting in more draw calls and worse performance
Parameters:
NameTypeDescription
textureWebGLTexture
\ No newline at end of file +
On this page

WebGL

LittleJS WebGL Interface

  • All webgl used by the engine is wrapped up here
  • For normal stuff you won't need to see or call anything in this file
  • For advanced stuff there are helper functions to create shaders, textures, etc
  • Can be disabled with glEnable to revert to 2D canvas rendering
  • Batches sprite rendering on GPU for incredibly fast performance
  • Sprite transform math is done in the shader where possible
  • Supports shadertoy style post processing shaders

Members

(static) glCanvas :HTMLCanvasElement

The WebGL canvas which appears above the main canvas and below the overlay canvas

Type:
  • HTMLCanvasElement

(static) glContext :WebGL2RenderingContext

2d context for glCanvas

Type:
  • WebGL2RenderingContext

Methods

(static) glCompileShader(source, type) → {WebGLShader}

Compile WebGL shader of the given type, will throw errors if in debug mode

Parameters:
NameTypeDescription
sourceString
typeNumber
Returns:
Type: 
WebGLShader

(static) glCopyToContext(context, forceDrawopt)

Draw any sprites still in the buffer, copy to main canvas and clear

Parameters:
NameTypeAttributesDefaultDescription
contextCanvasRenderingContext2D
forceDrawBoolean<optional>
false

(static) glCreateProgram(vsSource, fsSource) → {WebGLProgram}

Create WebGL program with given shaders

Parameters:
NameTypeDescription
vsSourceString
fsSourceString
Returns:
Type: 
WebGLProgram

(static) glCreateTexture(image) → {WebGLTexture}

Create WebGL texture from an image and init the texture settings

Parameters:
NameTypeDescription
imageHTMLImageElement
Returns:
Type: 
WebGLTexture

(static) glDraw(x, y, sizeX, sizeY, angle, uv0X, uv0Y, uv1X, uv1Y, rgba, rgbaAdditiveopt)

Add a sprite to the gl draw list, used by all gl draw functions

Parameters:
NameTypeAttributesDefaultDescription
xNumber
yNumber
sizeXNumber
sizeYNumber
angleNumber
uv0XNumber
uv0YNumber
uv1XNumber
uv1YNumber
rgbaNumber
rgbaAdditiveNumber<optional>
0

(static) glFlush()

Draw all sprites and clear out the buffer, called automatically by the system whenever necessary

(static) glInitPostProcess(shaderCode, includeOverlay)

Set up a post processing shader

Parameters:
NameTypeDefaultDescription
shaderCodeString
includeOverlayBooleanfalse

(static) glSetTexture(texture)

Set the WebGl texture, called automatically if using multiple textures

  • This may also flush the gl buffer resulting in more draw calls and worse performance
Parameters:
NameTypeDescription
textureWebGLTexture
\ No newline at end of file diff --git a/docs/data/search.json b/docs/data/search.json index 2409a822..6c93fe8f 100644 --- a/docs/data/search.json +++ b/docs/data/search.json @@ -1 +1 @@ -{"list":[{"title":"Audio","link":"Audio","description":"

LittleJS Audio System

\n"},{"title":"Audio.audioContext","link":"audioContext","description":"

Audio context used by the engine

"},{"title":"Audio.getNoteFrequency","link":"getNoteFrequency","description":"

Get frequency of a note on a musical scale

"},{"title":"Audio.playAudioFile","link":"playAudioFile","description":"

Play an mp3, ogg, or wav audio from a local file or url

"},{"title":"Audio.playSamples","link":"playSamples","description":"

Play cached audio samples with given settings

"},{"title":"Audio.speak","link":"speak","description":"

Speak text with passed in settings

"},{"title":"Audio.speakStop","link":"speakStop","description":"

Stop all queued speech

"},{"title":"Audio.zzfx","link":"zzfx","description":"

Generate and play a ZzFX sound

\n

Create sounds using the ZzFX Sound Designer.

"},{"title":"Audio.zzfxG","link":"zzfxG","description":"

Generate samples for a ZzFX sound

"},{"title":"Audio.zzfxM","link":"zzfxM","description":"

Generate samples for a ZzFM song with given parameters

"},{"title":"Audio.zzfxR","link":"zzfxR","description":"

Sample rate used for all ZzFX sounds

"},{"title":"Color","link":"Color","description":"

Create a color with the rgba components passed in, white by default

"},{"title":"Color#a","link":"a"},{"title":"Color#add","link":"add","description":"

Returns a copy of this color plus the color passed in

"},{"title":"Color#b","link":"b"},{"title":"Color#clamp","link":"clamp","description":"

Returns a copy of this color clamped to the valid range between 0 and 1

"},{"title":"Color#copy","link":"copy","description":"

Returns a new color that is a copy of this

"},{"title":"Color#divide","link":"divide","description":"

Returns a copy of this color divided by the color passed in

"},{"title":"Color#g","link":"g"},{"title":"Color#getHSLA","link":"getHSLA","description":"

Returns this color expressed in hsla format

"},{"title":"Color#lerp","link":"lerp","description":"

Returns a new color that is p percent between this and the color passed in

"},{"title":"Color#multiply","link":"multiply","description":"

Returns a copy of this color times the color passed in

"},{"title":"Color#mutate","link":"mutate","description":"

Returns a new color that has each component randomly adjusted

"},{"title":"Color#r","link":"r"},{"title":"Color#rgbaInt","link":"rgbaInt","description":"

Returns this color expressed as 32 bit RGBA value

"},{"title":"Color#scale","link":"scale","description":"

Returns a copy of this color scaled by the value passed in, alpha can be scaled separately

"},{"title":"Color#setHSLA","link":"setHSLA","description":"

Sets this color given a hue, saturation, lightness, and alpha

"},{"title":"Color#setHex","link":"setHex","description":"

Set this color from a hex code

"},{"title":"Color#subtract","link":"subtract","description":"

Returns a copy of this color minus the color passed in

"},{"title":"Color#toString","link":"toString","description":"

Returns this color expressed as a hex color code

"},{"title":"Debug","link":"Debug","description":"

LittleJS Debug System

\n"},{"title":"Debug.ASSERT","link":"ASSERT","description":"

Asserts if the experssion is false, does not do anything in release builds

"},{"title":"Debug.debug","link":"debug","description":"

True if debug is enabled

"},{"title":"Debug.debugAABB","link":"debugAABB","description":"

Draw a debug axis aligned bounding box in world space

"},{"title":"Debug.debugCircle","link":"debugCircle","description":"

Draw a debug circle in world space

"},{"title":"Debug.debugClear","link":"debugClear","description":"

Clear all debug primitives in the list

"},{"title":"Debug.debugKey","link":"debugKey","description":"

Key code used to toggle debug mode, Esc by default

"},{"title":"Debug.debugLine","link":"debugLine","description":"

Draw a debug line in world space

"},{"title":"Debug.debugOverlay","link":"debugOverlay","description":"

True if the debug overlay is active, always false in release builds

"},{"title":"Debug.debugPoint","link":"debugPoint","description":"

Draw a debug point in world space

"},{"title":"Debug.debugPointSize","link":"debugPointSize","description":"

Size to render debug points by default

"},{"title":"Debug.debugRect","link":"debugRect","description":"

Draw a debug rectangle in world space

"},{"title":"Debug.debugSaveCanvas","link":"debugSaveCanvas","description":"

Save a canvas to disk

"},{"title":"Debug.debugSaveDataURL","link":"debugSaveDataURL","description":"

Save a data url to disk

"},{"title":"Debug.debugSaveText","link":"debugSaveText","description":"

Save a text file to disk

"},{"title":"Debug.debugText","link":"debugText","description":"

Draw a debug axis aligned bounding box in world space

"},{"title":"Debug.enableAsserts","link":"enableAsserts","description":"

True if asserts are enaled

"},{"title":"Debug.setDebugKey","link":"setDebugKey","description":"

Set key code used to toggle debug mode, Esc by default

"},{"title":"Debug.setShowWatermark","link":"setShowWatermark","description":"

Set if watermark with FPS should be shown

"},{"title":"Debug.showWatermark","link":"showWatermark","description":"

True if watermark with FPS should be shown, false in release builds

"},{"title":"Draw","link":"Draw","description":"

LittleJS Drawing System

\n\n

LittleJS uses a hybrid rendering solution with the best of both Canvas2D and WebGL.\nThere are 3 canvas/contexts available to draw to...\nmainCanvas - 2D background canvas, non WebGL stuff like tile layers are drawn here.\nglCanvas - Used by the accelerated WebGL batch rendering system.\noverlayCanvas - Another 2D canvas that appears on top of the other 2 canvases.

\n

The WebGL rendering system is very fast with some caveats...

\n\n

The LittleJS rendering solution is intentionally simple, feel free to adjust it for your needs!

"},{"title":"Draw.drawCanvas2D","link":"drawCanvas2D","description":"

Draw directly to a 2d canvas context in world space

"},{"title":"Draw.drawLine","link":"drawLine","description":"

Draw colored line between two points

"},{"title":"Draw.drawPoly","link":"drawPoly","description":"

Draw colored polygon using passed in points

"},{"title":"Draw.drawRect","link":"drawRect","description":"

Draw colored rect centered on pos

"},{"title":"Draw.drawText","link":"drawText","description":"

Draw text on overlay canvas in world space\nAutomatically splits new lines into rows

"},{"title":"Draw.drawTextScreen","link":"drawTextScreen","description":"

Draw text on overlay canvas in screen space\nAutomatically splits new lines into rows

"},{"title":"Draw.drawTile","link":"drawTile","description":"

Draw textured tile centered in world space, with color applied if using WebGL

"},{"title":"Draw.isFullscreen","link":"isFullscreen","description":"

Returns true if fullscreen mode is active

"},{"title":"Draw.mainCanvas","link":"mainCanvas","description":"

The primary 2D canvas visible to the user

"},{"title":"Draw.mainCanvasSize","link":"mainCanvasSize","description":"

The size of the main canvas (and other secondary canvases)

"},{"title":"Draw.mainContext","link":"mainContext","description":"

2d context for mainCanvas

"},{"title":"Draw.overlayCanvas","link":"overlayCanvas","description":"

A canvas that appears on top of everything the same size as mainCanvas

"},{"title":"Draw.overlayContext","link":"overlayContext","description":"

2d context for overlayCanvas

"},{"title":"Draw.screenToWorld","link":"screenToWorld","description":"

Convert from screen to world space coordinates

"},{"title":"Draw.setBlendMode","link":"setBlendMode","description":"

Enable normal or additive blend mode

"},{"title":"Draw.textureInfos","link":"textureInfos","description":"

Array containing texture info for batch rendering system

"},{"title":"Draw.tile","link":"tile","description":"

Create a tile info object

\n"},{"title":"Draw.toggleFullscreen","link":"toggleFullscreen","description":"

Toggle fullsceen mode

"},{"title":"Draw.worldToScreen","link":"worldToScreen","description":"

Convert from world to screen space coordinates

"},{"title":"Engine","link":"Engine","description":"

LittleJS - The Tiny JavaScript Game Engine That Can!\nMIT License - Copyright 2021 Frank Force

\n

Engine Features

\n"},{"title":"Engine.engineInit","link":"engineInit","description":"

Start up LittleJS engine with your callback functions

"},{"title":"Engine.engineName","link":"engineName","description":"

Name of engine

"},{"title":"Engine.engineObjects","link":"engineObjects","description":"

Array containing all engine objects

"},{"title":"Engine.engineObjectsCallback","link":"engineObjectsCallback","description":"

Triggers a callback for each object within a given area

"},{"title":"Engine.engineObjectsCollide","link":"engineObjectsCollide","description":"

Array containing only objects that are set to collide with other objects this frame (for optimization)

"},{"title":"Engine.engineObjectsDestroy","link":"engineObjectsDestroy","description":"

Destroy and remove all objects

"},{"title":"Engine.engineObjectsUpdate","link":"engineObjectsUpdate","description":"

Update each engine object, remove destroyed objects, and update time

"},{"title":"Engine.engineVersion","link":"engineVersion","description":"

Version of engine

"},{"title":"Engine.frame","link":"frame","description":"

Current update frame, used to calculate time

"},{"title":"Engine.frameRate","link":"frameRate","description":"

Frames per second to update objects

"},{"title":"Engine.paused","link":"paused","description":"

Is the game paused? Causes time and objects to not be updated

"},{"title":"Engine.setPaused","link":"setPaused","description":"

Set if game is paused

"},{"title":"Engine.time","link":"time","description":"

Current engine time since start in seconds, derived from frame

"},{"title":"Engine.timeDelta","link":"timeDelta","description":"

How many seconds each frame lasts, engine uses a fixed time step

"},{"title":"Engine.timeReal","link":"timeReal","description":"

Actual clock time since start in seconds (not affected by pause or frame rate clamping)

"},{"title":"EngineObject","link":"EngineObject","description":"

Create an engine object and adds it to the list of objects

"},{"title":"EngineObject#addChild","link":"addChild","description":"

Attaches a child to this with a given local transform

"},{"title":"EngineObject#additiveColor","link":"additiveColor"},{"title":"EngineObject#angle","link":"angle"},{"title":"EngineObject#angleDamping","link":"angleDamping"},{"title":"EngineObject#angleVelocity","link":"angleVelocity"},{"title":"EngineObject#applyAcceleration","link":"applyAcceleration","description":"

Apply acceleration to this object (adjust velocity, not affected by mass)

"},{"title":"EngineObject#applyForce","link":"applyForce","description":"

Apply force to this object (adjust velocity, affected by mass)

"},{"title":"EngineObject#children","link":"children"},{"title":"EngineObject#collideSolidObjects","link":"collideSolidObjects"},{"title":"EngineObject#collideTiles","link":"collideTiles"},{"title":"EngineObject#collideWithObject","link":"collideWithObject","description":"

Called to check if a object collision should be resolved

"},{"title":"EngineObject#collideWithTile","link":"collideWithTile","description":"

Called to check if a tile collision should be resolved

"},{"title":"EngineObject#collideWithTileRaycast","link":"collideWithTileRaycast","description":"

Called to check if a tile raycast hit

"},{"title":"EngineObject#color","link":"color"},{"title":"EngineObject#damping","link":"damping"},{"title":"EngineObject#destroy","link":"destroy","description":"

Destroy this object, destroy it's children, detach it's parent, and mark it for removal

"},{"title":"EngineObject#drawSize","link":"drawSize"},{"title":"EngineObject#elasticity","link":"elasticity"},{"title":"EngineObject#friction","link":"friction"},{"title":"EngineObject#getAliveTime","link":"getAliveTime","description":"

How long since the object was created

"},{"title":"EngineObject#getMirrorSign","link":"getMirrorSign","description":"

Get the direction of the mirror

"},{"title":"EngineObject#gravityScale","link":"gravityScale"},{"title":"EngineObject#isSolid","link":"isSolid"},{"title":"EngineObject#localAngle","link":"localAngle"},{"title":"EngineObject#localPos","link":"localPos"},{"title":"EngineObject#mass","link":"mass"},{"title":"EngineObject#mirror","link":"mirror"},{"title":"EngineObject#parent","link":"parent"},{"title":"EngineObject#pos","link":"pos"},{"title":"EngineObject#removeChild","link":"removeChild","description":"

Removes a child from this one

"},{"title":"EngineObject#render","link":"render","description":"

Render the object, draws a tile by default, automatically called each frame, sorted by renderOrder

"},{"title":"EngineObject#renderOrder","link":"renderOrder"},{"title":"EngineObject#setCollision","link":"setCollision","description":"

Set how this object collides

"},{"title":"EngineObject#size","link":"size"},{"title":"EngineObject#spawnTime","link":"spawnTime"},{"title":"EngineObject#tileInfo","link":"tileInfo"},{"title":"EngineObject#toString","link":"toString","description":"

Returns string containg info about this object for debugging

"},{"title":"EngineObject#update","link":"update","description":"

Update the object transform and physics, called automatically by engine once each frame

"},{"title":"EngineObject#velocity","link":"velocity"},{"title":"FontImage","link":"FontImage","description":"

Create an image font

"},{"title":"FontImage#drawText","link":"drawText","description":"

Draw text in world space using the image font

"},{"title":"FontImage#drawTextScreen","link":"drawTextScreen","description":"

Draw text in screen space using the image font

"},{"title":"Input","link":"Input","description":"

LittleJS Input System

\n"},{"title":"Input.clearInput","link":"clearInput","description":"

Clears all input

"},{"title":"Input.gamepadIsDown","link":"gamepadIsDown","description":"

Returns true if gamepad button is down

"},{"title":"Input.gamepadStick","link":"gamepadStick","description":"

Returns gamepad stick value

"},{"title":"Input.gamepadWasPressed","link":"gamepadWasPressed","description":"

Returns true if gamepad button was pressed

"},{"title":"Input.gamepadWasReleased","link":"gamepadWasReleased","description":"

Returns true if gamepad button was released

"},{"title":"Input.isTouchDevice","link":"isTouchDevice","description":"

True if a touch device has been detected

"},{"title":"Input.isUsingGamepad","link":"isUsingGamepad","description":"

Returns true if user is using gamepad (has more recently pressed a gamepad button)

"},{"title":"Input.keyIsDown","link":"keyIsDown","description":"

Returns true if device key is down

"},{"title":"Input.keyWasPressed","link":"keyWasPressed","description":"

Returns true if device key was pressed this frame

"},{"title":"Input.keyWasReleased","link":"keyWasReleased","description":"

Returns true if device key was released this frame

"},{"title":"Input.mouseIsDown","link":"mouseIsDown","description":"

Returns true if mouse button is down

"},{"title":"Input.mousePos","link":"mousePos","description":"

Mouse pos in world space

"},{"title":"Input.mousePosScreen","link":"mousePosScreen","description":"

Mouse pos in screen space

"},{"title":"Input.mouseWasPressed","link":"mouseWasPressed","description":"

Returns true if mouse button was pressed

"},{"title":"Input.mouseWasReleased","link":"mouseWasReleased","description":"

Returns true if mouse button was released

"},{"title":"Input.mouseWheel","link":"mouseWheel","description":"

Mouse wheel delta this frame

"},{"title":"Input.preventDefaultInput","link":"preventDefaultInput","description":"

Prevents input continuing to the default browser handling (false by default)

"},{"title":"Input.vibrate","link":"vibrate","description":"

Pulse the vibration hardware if it exists

"},{"title":"Input.vibrateStop","link":"vibrateStop","description":"

Cancel any ongoing vibration

"},{"title":"Medal","link":"Medal","description":"

Create a medal object and adds it to the list of medals

"},{"title":"Medal#render","link":"render","description":"

Render a medal

"},{"title":"Medal#renderIcon","link":"renderIcon","description":"

Render the icon for a medal

"},{"title":"Medal#unlock","link":"unlock","description":"

Unlocks a medal if not already unlocked

"},{"title":"Medals","link":"Medals","description":"

LittleJS Medal System

\n"},{"title":"Medals.medals","link":"medals","description":"

List of all medals

"},{"title":"Medals.medalsInit","link":"medalsInit","description":"

Initialize medals with a save name used for storage

\n"},{"title":"Medals.newgroundsInit","link":"newgroundsInit","description":"

This can used to enable Newgrounds functionality

"},{"title":"Music","link":"Music","description":"

Create a music object and cache the zzfx music samples for later use

"},{"title":"Music#playMusic","link":"playMusic","description":"

Play the music

"},{"title":"Newgrounds","link":"Newgrounds","description":"

Create a newgrounds object

"},{"title":"Newgrounds#call","link":"call","description":"

Send a message to call a component of the Newgrounds API

"},{"title":"Newgrounds#getScores","link":"getScores","description":"

Get scores from a scoreboard

"},{"title":"Newgrounds#logView","link":"logView","description":"

Send message to log a view

"},{"title":"Newgrounds#postScore","link":"postScore","description":"

Send message to post score

"},{"title":"Newgrounds#unlockMedal","link":"unlockMedal","description":"

Send message to unlock a medal by id

"},{"title":"Particle","link":"Particle","description":"

Create a particle with the given shis.colorStart = undefined;ettings

"},{"title":"Particle#additive","link":"additive"},{"title":"Particle#colorEndDelta","link":"colorEndDelta"},{"title":"Particle#colorStart","link":"colorStart"},{"title":"Particle#destroyCallback","link":"destroyCallback"},{"title":"Particle#fadeRate","link":"fadeRate"},{"title":"Particle#lifeTime","link":"lifeTime"},{"title":"Particle#localSpaceEmitter","link":"localSpaceEmitter"},{"title":"Particle#render","link":"render","description":"

Render the particle, automatically called each frame, sorted by renderOrder

"},{"title":"Particle#sizeEndDelta","link":"sizeEndDelta"},{"title":"Particle#sizeStart","link":"sizeStart"},{"title":"Particle#trailScale","link":"trailScale"},{"title":"ParticleEmitter","link":"ParticleEmitter","description":"

Create a particle system with the given settings

"},{"title":"ParticleEmitter#additive","link":"additive"},{"title":"ParticleEmitter#angleDamping","link":"angleDamping"},{"title":"ParticleEmitter#angleSpeed","link":"angleSpeed"},{"title":"ParticleEmitter#collideTiles","link":"collideTiles"},{"title":"ParticleEmitter#colorEndA","link":"colorEndA"},{"title":"ParticleEmitter#colorEndB","link":"colorEndB"},{"title":"ParticleEmitter#colorStartA","link":"colorStartA"},{"title":"ParticleEmitter#colorStartB","link":"colorStartB"},{"title":"ParticleEmitter#damping","link":"damping"},{"title":"ParticleEmitter#emitConeAngle","link":"emitConeAngle"},{"title":"ParticleEmitter#emitParticle","link":"emitParticle","description":"

Spawn one particle

"},{"title":"ParticleEmitter#emitRate","link":"emitRate"},{"title":"ParticleEmitter#emitSize","link":"emitSize"},{"title":"ParticleEmitter#emitTime","link":"emitTime"},{"title":"ParticleEmitter#emitTimeBuffer","link":"emitTimeBuffer"},{"title":"ParticleEmitter#fadeRate","link":"fadeRate"},{"title":"ParticleEmitter#gravityScale","link":"gravityScale"},{"title":"ParticleEmitter#localSpace","link":"localSpace"},{"title":"ParticleEmitter#particleConeAngle","link":"particleConeAngle"},{"title":"ParticleEmitter#particleCreateCallback","link":"particleCreateCallback"},{"title":"ParticleEmitter#particleDestroyCallback","link":"particleDestroyCallback"},{"title":"ParticleEmitter#particleTime","link":"particleTime"},{"title":"ParticleEmitter#randomColorLinear","link":"randomColorLinear"},{"title":"ParticleEmitter#randomness","link":"randomness"},{"title":"ParticleEmitter#sizeEnd","link":"sizeEnd"},{"title":"ParticleEmitter#sizeStart","link":"sizeStart"},{"title":"ParticleEmitter#speed","link":"speed"},{"title":"ParticleEmitter#trailScale","link":"trailScale"},{"title":"ParticleEmitter#update","link":"update","description":"

Update the emitter to spawn particles, called automatically by engine once each frame

"},{"title":"Random","link":"Random","description":"

Random global functions

"},{"title":"Random.rand","link":"rand","description":"

Returns a random value between the two values passed in

"},{"title":"Random.randColor","link":"randColor","description":"

Returns a random color between the two passed in colors, combine components if linear

"},{"title":"Random.randInCircle","link":"randInCircle","description":"

Returns a random Vector2 within a circular shape

"},{"title":"Random.randInt","link":"randInt","description":"

Returns a floored random value the two values passed in

"},{"title":"Random.randSign","link":"randSign","description":"

Randomly returns either -1 or 1

"},{"title":"Random.randVector","link":"randVector","description":"

Returns a random Vector2 with the passed in length

"},{"title":"RandomGenerator","link":"RandomGenerator","description":"

Create a random number generator with the seed passed in

"},{"title":"RandomGenerator#float","link":"float","description":"

Returns a seeded random value between the two values passed in

"},{"title":"RandomGenerator#int","link":"int","description":"

Returns a floored seeded random value the two values passed in

"},{"title":"RandomGenerator#seed","link":"seed"},{"title":"RandomGenerator#sign","link":"sign","description":"

Randomly returns either -1 or 1 deterministically

"},{"title":"Settings","link":"Settings","description":"

LittleJS Engine Settings

\n"},{"title":"Settings.cameraPos","link":"cameraPos","description":"

Position of camera in world space

"},{"title":"Settings.cameraScale","link":"cameraScale","description":"

Scale of camera in world space

"},{"title":"Settings.canvasFixedSize","link":"canvasFixedSize","description":"

Fixed size of the canvas, if enabled canvas size never changes

\n"},{"title":"Settings.canvasMaxSize","link":"canvasMaxSize","description":"

The max size of the canvas, centered if window is larger

"},{"title":"Settings.canvasPixelated","link":"canvasPixelated","description":"

Disables filtering for crisper pixel art if true

"},{"title":"Settings.enablePhysicsSolver","link":"enablePhysicsSolver","description":"

Enable physics solver for collisions between objects

"},{"title":"Settings.fontDefault","link":"fontDefault","description":"

Default font used for text rendering

"},{"title":"Settings.gamepadDirectionEmulateStick","link":"gamepadDirectionEmulateStick","description":"

If true, the dpad input is also routed to the left analog stick (for better accessability)

"},{"title":"Settings.gamepadsEnable","link":"gamepadsEnable","description":"

Should gamepads be allowed

"},{"title":"Settings.glEnable","link":"glEnable","description":"

Enable webgl rendering, webgl can be disabled and removed from build (with some features disabled)

"},{"title":"Settings.glOverlay","link":"glOverlay","description":"

Fixes slow rendering in some browsers by not compositing the WebGL canvas

"},{"title":"Settings.gravity","link":"gravity","description":"

How much gravity to apply to objects along the Y axis, negative is down

"},{"title":"Settings.inputWASDEmulateDirection","link":"inputWASDEmulateDirection","description":"

If true the WASD keys are also routed to the direction keys (for better accessability)

"},{"title":"Settings.medalDisplayIconSize","link":"medalDisplayIconSize","description":"

Size of icon in medal display

"},{"title":"Settings.medalDisplaySize","link":"medalDisplaySize","description":"

Size of medal display

"},{"title":"Settings.medalDisplaySlideTime","link":"medalDisplaySlideTime","description":"

How quickly to slide on/off medals in seconds

"},{"title":"Settings.medalDisplayTime","link":"medalDisplayTime","description":"

How long to show medals for in seconds

"},{"title":"Settings.medalsPreventUnlock","link":"medalsPreventUnlock","description":"

Set to stop medals from being unlockable (like if cheats are enabled)

"},{"title":"Settings.objectDefaultAngleDamping","link":"objectDefaultAngleDamping","description":"

How much to slow angular velocity each frame (0-1)

"},{"title":"Settings.objectDefaultDamping","link":"objectDefaultDamping","description":"

How much to slow velocity by each frame (0-1)

"},{"title":"Settings.objectDefaultElasticity","link":"objectDefaultElasticity","description":"

How much to bounce when a collision occurs (0-1)

"},{"title":"Settings.objectDefaultFriction","link":"objectDefaultFriction","description":"

How much to slow when touching (0-1)

"},{"title":"Settings.objectDefaultMass","link":"objectDefaultMass","description":"

Default object mass for collison calcuations (how heavy objects are)

"},{"title":"Settings.objectMaxSpeed","link":"objectMaxSpeed","description":"

Clamp max speed to avoid fast objects missing collisions

"},{"title":"Settings.particleEmitRateScale","link":"particleEmitRateScale","description":"

Scales emit rate of particles, useful for low graphics mode (0 disables particle emitters)

"},{"title":"Settings.setCameraPos","link":"setCameraPos","description":"

Set position of camera in world space

"},{"title":"Settings.setCameraScale","link":"setCameraScale","description":"

Set scale of camera in world space

"},{"title":"Settings.setCanvasFixedSize","link":"setCanvasFixedSize","description":"

Set fixed size of the canvas

"},{"title":"Settings.setCanvasMaxSize","link":"setCanvasMaxSize","description":"

Set max size of the canvas

"},{"title":"Settings.setCanvasPixelated","link":"setCanvasPixelated","description":"

Disables anti aliasing for pixel art if true

"},{"title":"Settings.setEnablePhysicsSolver","link":"setEnablePhysicsSolver","description":"

Set if collisions between objects are enabled

"},{"title":"Settings.setFontDefault","link":"setFontDefault","description":"

Set default font used for text rendering

"},{"title":"Settings.setGamepadDirectionEmulateStick","link":"setGamepadDirectionEmulateStick","description":"

Set if the dpad input is also routed to the left analog stick

"},{"title":"Settings.setGamepadsEnable","link":"setGamepadsEnable","description":"

Set if gamepads are enabled

"},{"title":"Settings.setGlEnable","link":"setGlEnable","description":"

Set if webgl rendering is enabled

"},{"title":"Settings.setGlOverlay","link":"setGlOverlay","description":"

Set to not composite the WebGL canvas

"},{"title":"Settings.setGravity","link":"setGravity","description":"

Set how much gravity to apply to objects along the Y axis

"},{"title":"Settings.setInputWASDEmulateDirection","link":"setInputWASDEmulateDirection","description":"

Set if true the WASD keys are also routed to the direction keys

"},{"title":"Settings.setMedalDisplayIconSize","link":"setMedalDisplayIconSize","description":"

Set size of icon in medal display

"},{"title":"Settings.setMedalDisplaySize","link":"setMedalDisplaySize","description":"

Set size of medal display

"},{"title":"Settings.setMedalDisplaySlideTime","link":"setMedalDisplaySlideTime","description":"

Set how quickly to slide on/off medals in seconds

"},{"title":"Settings.setMedalDisplayTime","link":"setMedalDisplayTime","description":"

Set how long to show medals for in seconds

"},{"title":"Settings.setMedalsPreventUnlock","link":"setMedalsPreventUnlock","description":"

Set to stop medals from being unlockable

"},{"title":"Settings.setObjectDefaultAngleDamping","link":"setObjectDefaultAngleDamping","description":"

Set how much to slow angular velocity each frame

"},{"title":"Settings.setObjectDefaultDamping","link":"setObjectDefaultDamping","description":"

Set how much to slow velocity by each frame

"},{"title":"Settings.setObjectDefaultElasticity","link":"setObjectDefaultElasticity","description":"

Set how much to bounce when a collision occur

"},{"title":"Settings.setObjectDefaultFriction","link":"setObjectDefaultFriction","description":"

Set how much to slow when touching

"},{"title":"Settings.setObjectDefaultMass","link":"setObjectDefaultMass","description":"

Set default object mass for collison calcuations

"},{"title":"Settings.setObjectMaxSpeed","link":"setObjectMaxSpeed","description":"

Set max speed to avoid fast objects missing collisions

"},{"title":"Settings.setParticleEmitRateScale","link":"setParticleEmitRateScale","description":"

Set to scales emit rate of particles

"},{"title":"Settings.setShowSplashScreen","link":"setShowSplashScreen","description":"

Set if the LittleJS splash screen be shown on startup

"},{"title":"Settings.setSoundDefaultRange","link":"setSoundDefaultRange","description":"

Set default range where sound no longer plays

"},{"title":"Settings.setSoundDefaultTaper","link":"setSoundDefaultTaper","description":"

Set default range percent to start tapering off sound

"},{"title":"Settings.setSoundEnable","link":"setSoundEnable","description":"

Set to disable all audio code

"},{"title":"Settings.setSoundVolume","link":"setSoundVolume","description":"

Set volume scale to apply to all sound, music and speech

"},{"title":"Settings.setTileFixBleedScale","link":"setTileFixBleedScale","description":"

Set to prevent tile bleeding from neighbors in pixels

"},{"title":"Settings.setTileSizeDefault","link":"setTileSizeDefault","description":"

Set default size of tiles in pixels

"},{"title":"Settings.setTouchGamepadAlpha","link":"setTouchGamepadAlpha","description":"

Set transparency of touch gamepad overlay

"},{"title":"Settings.setTouchGamepadAnalog","link":"setTouchGamepadAnalog","description":"

Set if touch gamepad should be analog stick or 8 way dpad

"},{"title":"Settings.setTouchGamepadEnable","link":"setTouchGamepadEnable","description":"

Set if touch gamepad should appear on mobile devices

"},{"title":"Settings.setTouchGamepadSize","link":"setTouchGamepadSize","description":"

Set size of virutal gamepad for touch devices in pixels

"},{"title":"Settings.setVibrateEnable","link":"setVibrateEnable","description":"

Set to allow vibration hardware if it exists

"},{"title":"Settings.showSplashScreen","link":"showSplashScreen","description":"

Enable to show the LittleJS splash screen be shown on startup

"},{"title":"Settings.soundDefaultRange","link":"soundDefaultRange","description":"

Default range where sound no longer plays

"},{"title":"Settings.soundDefaultTaper","link":"soundDefaultTaper","description":"

Default range percent to start tapering off sound (0-1)

"},{"title":"Settings.soundEnable","link":"soundEnable","description":"

All audio code can be disabled and removed from build

"},{"title":"Settings.soundVolume","link":"soundVolume","description":"

Volume scale to apply to all sound, music and speech

"},{"title":"Settings.tileFixBleedScale","link":"tileFixBleedScale","description":"

How many pixels smaller to draw tiles to prevent bleeding from neighbors

"},{"title":"Settings.tileSizeDefault","link":"tileSizeDefault","description":"

Default size of tiles in pixels

"},{"title":"Settings.touchGamepadAlpha","link":"touchGamepadAlpha","description":"

Transparency of touch gamepad overlay

"},{"title":"Settings.touchGamepadAnalog","link":"touchGamepadAnalog","description":"

True if touch gamepad should be analog stick or false to use if 8 way dpad

"},{"title":"Settings.touchGamepadEnable","link":"touchGamepadEnable","description":"

True if touch gamepad should appear on mobile devices

\n"},{"title":"Settings.touchGamepadSize","link":"touchGamepadSize","description":"

Size of virutal gamepad for touch devices in pixels

"},{"title":"Settings.vibrateEnable","link":"vibrateEnable","description":"

Allow vibration hardware if it exists

"},{"title":"Sound","link":"Sound","description":"

Create a sound object and cache the zzfx samples for later use

"},{"title":"Sound#getDuration","link":"getDuration","description":"

Get how long this sound is in seconds

"},{"title":"Sound#getSource","link":"getSource","description":"

Get source of most recent instance of this sound that was played

"},{"title":"Sound#isLoading","link":"isLoading","description":"

Check if sound is loading, for sounds fetched from a url

"},{"title":"Sound#play","link":"play","description":"

Play the sound

"},{"title":"Sound#playNote","link":"playNote","description":"

Play the sound as a note with a semitone offset

"},{"title":"Sound#randomness","link":"randomness"},{"title":"Sound#range","link":"range"},{"title":"Sound#stop","link":"stop","description":"

Stop the last instance of this sound that was played

"},{"title":"Sound#taper","link":"taper"},{"title":"SoundWave","link":"SoundWave","description":"

Create a sound object and cache the wave file for later use

"},{"title":"TextureInfo","link":"TextureInfo","description":"

Create a TextureInfo, called automatically by the engine

"},{"title":"TextureInfo#fixBleedSize","link":"fixBleedSize"},{"title":"TextureInfo#glTexture","link":"glTexture"},{"title":"TextureInfo#image","link":"image"},{"title":"TextureInfo#size","link":"size"},{"title":"TileCollision","link":"TileCollision","description":"

LittleJS Tile Layer System

\n"},{"title":"TileCollision.getTileCollisionData","link":"getTileCollisionData","description":"

Get tile collision data

"},{"title":"TileCollision.initTileCollision","link":"initTileCollision","description":"

Clear and initialize tile collision

"},{"title":"TileCollision.setTileCollisionData","link":"setTileCollisionData","description":"

Set tile collision data

"},{"title":"TileCollision.tileCollision","link":"tileCollision","description":"

The tile collision layer array, use setTileCollisionData and getTileCollisionData to access

"},{"title":"TileCollision.tileCollisionRaycast","link":"tileCollisionRaycast","description":"

Return the center of tile if any that is hit (does not return the exact intersection)

"},{"title":"TileCollision.tileCollisionSize","link":"tileCollisionSize","description":"

Size of the tile collision layer

"},{"title":"TileCollision.tileCollisionTest","link":"tileCollisionTest","description":"

Check if collision with another object should occur

"},{"title":"TileInfo","link":"TileInfo","description":"

Create a tile info object

"},{"title":"TileInfo#getTextureInfo","link":"getTextureInfo","description":"

Returns the texture info for this tile

"},{"title":"TileInfo#offset","link":"offset","description":"

Returns an offset copy of this tile, useful for animation

"},{"title":"TileInfo#pos","link":"pos"},{"title":"TileInfo#size","link":"size"},{"title":"TileInfo#textureIndex","link":"textureIndex"},{"title":"TileLayer","link":"TileLayer","description":"

Create a tile layer object

"},{"title":"TileLayer#canvas","link":"canvas"},{"title":"TileLayer#context","link":"context"},{"title":"TileLayer#drawCanvas2D","link":"drawCanvas2D","description":"

Draw directly to the 2D canvas in world space (bipass webgl)

"},{"title":"TileLayer#drawRect","link":"drawRect","description":"

Draw a rectangle directly onto the layer canvas in world space

"},{"title":"TileLayer#drawTile","link":"drawTile","description":"

Draw a tile directly onto the layer canvas in world space

"},{"title":"TileLayer#drawTileData","link":"drawTileData","description":"

Draw the tile at a given position in the tile grid\nThis can be used to clear out tiles when they are destroyed\nTiles can also be redrawn if isinde a redrawStart/End block

"},{"title":"TileLayer#getData","link":"getData","description":"

Get data at a given position in the array

"},{"title":"TileLayer#isOverlay","link":"isOverlay"},{"title":"TileLayer#redraw","link":"redraw","description":"

Draw all the tile data to an offscreen canvas

\n"},{"title":"TileLayer#redrawEnd","link":"redrawEnd","description":"

Call to end the redraw process

"},{"title":"TileLayer#redrawStart","link":"redrawStart","description":"

Call to start the redraw process

\n"},{"title":"TileLayer#savedRenderSettings","link":"savedRenderSettings"},{"title":"TileLayer#scale","link":"scale"},{"title":"TileLayer#setData","link":"setData","description":"

Set data at a given position in the array

"},{"title":"TileLayerData","link":"TileLayerData","description":"

Create a tile layer data object, one for each tile in a TileLayer

"},{"title":"TileLayerData#clear","link":"clear","description":"

Set this tile to clear, it will not be rendered

"},{"title":"TileLayerData#color","link":"color"},{"title":"TileLayerData#direction","link":"direction"},{"title":"TileLayerData#mirror","link":"mirror"},{"title":"TileLayerData#tile","link":"tile"},{"title":"Timer","link":"Timer","description":"

Create a timer object set time passed in

"},{"title":"Timer#active","link":"active","description":"

Returns true if set and has not elapsed

"},{"title":"Timer#elapsed","link":"elapsed","description":"

Returns true if set and elapsed

"},{"title":"Timer#get","link":"get","description":"

Get how long since elapsed, returns 0 if not set (returns negative if currently active)

"},{"title":"Timer#getPercent","link":"getPercent","description":"

Get percentage elapsed based on time it was set to, returns 0 if not set

"},{"title":"Timer#isSet","link":"isSet","description":"

Returns true if set

"},{"title":"Timer#set","link":"set","description":"

Set the timer with seconds passed in

"},{"title":"Timer#toString","link":"toString","description":"

Returns this timer expressed as a string

"},{"title":"Timer#unset","link":"unset","description":"

Unset the timer

"},{"title":"Timer#valueOf","link":"valueOf","description":"

Get how long since elapsed, returns 0 if not set (returns negative if currently active)

"},{"title":"Utilities","link":"Utilities","description":"

LittleJS Utility Classes and Functions

\n"},{"title":"Utilities.PI","link":"PI","description":"

A shortcut to get Math.PI

"},{"title":"Utilities.abs","link":"abs","description":"

Returns absoulte value of value passed in

"},{"title":"Utilities.clamp","link":"clamp","description":"

Clamps the value beween max and min

"},{"title":"Utilities.distanceAngle","link":"distanceAngle","description":"

Returns signed wrapped distance between the two angles passed in

"},{"title":"Utilities.distanceWrap","link":"distanceWrap","description":"

Returns signed wrapped distance between the two values passed in

"},{"title":"Utilities.formatTime","link":"formatTime","description":"

Formats seconds to mm:ss style for display purposes

"},{"title":"Utilities.hsl","link":"hsl","description":"

Create a color object with HSLA values, white by default

"},{"title":"Utilities.isColor","link":"isColor","description":"

Check if object is a valid Color

"},{"title":"Utilities.isOverlapping","link":"isOverlapping","description":"

Returns true if two axis aligned bounding boxes are overlapping

"},{"title":"Utilities.isVector2","link":"isVector2","description":"

Check if object is a valid Vector2

"},{"title":"Utilities.lerp","link":"lerp","description":"

Linearly interpolates between values passed in using percent

"},{"title":"Utilities.lerpAngle","link":"lerpAngle","description":"

Linearly interpolates between the angles passed in with wrappping

"},{"title":"Utilities.lerpWrap","link":"lerpWrap","description":"

Linearly interpolates between values passed in with wrappping

"},{"title":"Utilities.max","link":"max","description":"

Returns highest of two values passed in

"},{"title":"Utilities.min","link":"min","description":"

Returns lowest of two values passed in

"},{"title":"Utilities.mod","link":"mod","description":"

Returns first parm modulo the second param, but adjusted so negative numbers work as expected

"},{"title":"Utilities.nearestPowerOfTwo","link":"nearestPowerOfTwo","description":"

Returns the nearest power of two not less then the value

"},{"title":"Utilities.percent","link":"percent","description":"

Returns what percentage the value is between valueA and valueB

"},{"title":"Utilities.rgb","link":"rgb","description":"

Create a color object with RGBA values, white by default

"},{"title":"Utilities.sign","link":"sign","description":"

Returns the sign of value passed in (also returns 1 if 0)

"},{"title":"Utilities.smoothStep","link":"smoothStep","description":"

Applies smoothstep function to the percentage value

"},{"title":"Utilities.vec2","link":"vec2","description":"

Create a 2d vector, can take another Vector2 to copy, 2 scalars, or 1 scalar

"},{"title":"Utilities.wave","link":"wave","description":"

Returns an oscillating wave between 0 and amplitude with frequency of 1 Hz by default

"},{"title":"Vector2","link":"Vector2","description":"

Create a 2D vector with the x and y passed in, can also be created with vec2()

"},{"title":"Vector2#add","link":"add","description":"

Returns a copy of this vector plus the vector passed in

"},{"title":"Vector2#angle","link":"angle","description":"

Returns the angle of this vector, up is angle 0

"},{"title":"Vector2#area","link":"area","description":"

Returns the area this vector covers as a rectangle

"},{"title":"Vector2#arrayCheck","link":"arrayCheck","description":"

Returns true if this vector is within the bounds of an array size passed in

"},{"title":"Vector2#clampLength","link":"clampLength","description":"

Returns a new vector clamped to length passed in

"},{"title":"Vector2#copy","link":"copy","description":"

Returns a new vector that is a copy of this

"},{"title":"Vector2#cross","link":"cross","description":"

Returns the cross product of this and the vector passed in

"},{"title":"Vector2#direction","link":"direction","description":"

Returns the integer direction of this vector, corrosponding to multiples of 90 degree rotation (0-3)

"},{"title":"Vector2#distance","link":"distance","description":"

Returns the distance from this vector to vector passed in

"},{"title":"Vector2#distanceSquared","link":"distanceSquared","description":"

Returns the distance squared from this vector to vector passed in

"},{"title":"Vector2#divide","link":"divide","description":"

Returns a copy of this vector divided by the vector passed in

"},{"title":"Vector2#dot","link":"dot","description":"

Returns the dot product of this and the vector passed in

"},{"title":"Vector2#floor","link":"floor","description":"

Returns a copy of this vector with each axis floored

"},{"title":"Vector2#invert","link":"invert","description":"

Returns a copy of this vector that has been inverted

"},{"title":"Vector2#length","link":"length","description":"

Returns the length of this vector

"},{"title":"Vector2#lengthSquared","link":"lengthSquared","description":"

Returns the length of this vector squared

"},{"title":"Vector2#lerp","link":"lerp","description":"

Returns a new vector that is p percent between this and the vector passed in

"},{"title":"Vector2#multiply","link":"multiply","description":"

Returns a copy of this vector times the vector passed in

"},{"title":"Vector2#normalize","link":"normalize","description":"

Returns a new vector in same direction as this one with the length passed in

"},{"title":"Vector2#rotate","link":"rotate","description":"

Returns copy of this vector rotated by the angle passed in

"},{"title":"Vector2#scale","link":"scale","description":"

Returns a copy of this vector scaled by the vector passed in

"},{"title":"Vector2#setAngle","link":"setAngle","description":"

Sets this vector with angle and length passed in

"},{"title":"Vector2#setDirection","link":"setDirection","description":"

Set the integer direction of this vector, corrosponding to multiples of 90 degree rotation (0-3)

"},{"title":"Vector2#subtract","link":"subtract","description":"

Returns a copy of this vector minus the vector passed in

"},{"title":"Vector2#toString","link":"toString","description":"

Returns this vector expressed as a string

"},{"title":"Vector2#x","link":"x"},{"title":"Vector2#y","link":"y"},{"title":"WebGL","link":"WebGL","description":"

LittleJS WebGL Interface

\n"},{"title":"WebGL.glCanvas","link":"glCanvas","description":"

The WebGL canvas which appears above the main canvas and below the overlay canvas

"},{"title":"WebGL.glCompileShader","link":"glCompileShader","description":"

Compile WebGL shader of the given type, will throw errors if in debug mode

"},{"title":"WebGL.glContext","link":"glContext","description":"

2d context for glCanvas

"},{"title":"WebGL.glCopyToContext","link":"glCopyToContext","description":"

Draw any sprites still in the buffer, copy to main canvas and clear

"},{"title":"WebGL.glCreateProgram","link":"glCreateProgram","description":"

Create WebGL program with given shaders

"},{"title":"WebGL.glCreateTexture","link":"glCreateTexture","description":"

Create WebGL texture from an image and init the texture settings

"},{"title":"WebGL.glDraw","link":"glDraw","description":"

Add a sprite to the gl draw list, used by all gl draw functions

"},{"title":"WebGL.glFlush","link":"glFlush","description":"

Draw all sprites and clear out the buffer, called automatically by the system whenever necessary

"},{"title":"WebGL.glInitPostProcess","link":"glInitPostProcess","description":"

Set up a post processing shader

"},{"title":"WebGL.glSetTexture","link":"glSetTexture","description":"

Set the WebGl texture, called automatically if using multiple textures

\n"}]} \ No newline at end of file +{"list":[{"title":"Audio","link":"Audio","description":"

LittleJS Audio System

\n"},{"title":"Audio.audioContext","link":"audioContext","description":"

Audio context used by the engine

"},{"title":"Audio.audioSuspended","link":"audioSuspended","description":"

Keep track if audio was suspended when last sound was played

"},{"title":"Audio.getNoteFrequency","link":"getNoteFrequency","description":"

Get frequency of a note on a musical scale

"},{"title":"Audio.playAudioFile","link":"playAudioFile","description":"

Play an mp3, ogg, or wav audio from a local file or url

"},{"title":"Audio.playSamples","link":"playSamples","description":"

Play cached audio samples with given settings

"},{"title":"Audio.speak","link":"speak","description":"

Speak text with passed in settings

"},{"title":"Audio.speakStop","link":"speakStop","description":"

Stop all queued speech

"},{"title":"Audio.zzfx","link":"zzfx","description":"

Generate and play a ZzFX sound

\n

Create sounds using the ZzFX Sound Designer.

"},{"title":"Audio.zzfxG","link":"zzfxG","description":"

Generate samples for a ZzFX sound

"},{"title":"Audio.zzfxM","link":"zzfxM","description":"

Generate samples for a ZzFM song with given parameters

"},{"title":"Audio.zzfxR","link":"zzfxR","description":"

Sample rate used for all ZzFX sounds

"},{"title":"Color","link":"Color","description":"

Create a color with the rgba components passed in, white by default

"},{"title":"Color#HSLA","link":"HSLA","description":"

Returns this color expressed in hsla format

"},{"title":"Color#a","link":"a"},{"title":"Color#add","link":"add","description":"

Returns a copy of this color plus the color passed in

"},{"title":"Color#b","link":"b"},{"title":"Color#clamp","link":"clamp","description":"

Returns a copy of this color clamped to the valid range between 0 and 1

"},{"title":"Color#copy","link":"copy","description":"

Returns a new color that is a copy of this

"},{"title":"Color#divide","link":"divide","description":"

Returns a copy of this color divided by the color passed in

"},{"title":"Color#g","link":"g"},{"title":"Color#lerp","link":"lerp","description":"

Returns a new color that is p percent between this and the color passed in

"},{"title":"Color#multiply","link":"multiply","description":"

Returns a copy of this color times the color passed in

"},{"title":"Color#mutate","link":"mutate","description":"

Returns a new color that has each component randomly adjusted

"},{"title":"Color#r","link":"r"},{"title":"Color#rgbaInt","link":"rgbaInt","description":"

Returns this color expressed as 32 bit RGBA value

"},{"title":"Color#scale","link":"scale","description":"

Returns a copy of this color scaled by the value passed in, alpha can be scaled separately

"},{"title":"Color#setHSLA","link":"setHSLA","description":"

Sets this color given a hue, saturation, lightness, and alpha

"},{"title":"Color#setHex","link":"setHex","description":"

Set this color from a hex code

"},{"title":"Color#subtract","link":"subtract","description":"

Returns a copy of this color minus the color passed in

"},{"title":"Color#toString","link":"toString","description":"

Returns this color expressed as a hex color code

"},{"title":"Debug","link":"Debug","description":"

LittleJS Debug System

\n"},{"title":"Debug.ASSERT","link":"ASSERT","description":"

Asserts if the expression is false, does not do anything in release builds

"},{"title":"Debug.debug","link":"debug","description":"

True if debug is enabled

"},{"title":"Debug.debugAABB","link":"debugAABB","description":"

Draw a debug axis aligned bounding box in world space

"},{"title":"Debug.debugCircle","link":"debugCircle","description":"

Draw a debug circle in world space

"},{"title":"Debug.debugClear","link":"debugClear","description":"

Clear all debug primitives in the list

"},{"title":"Debug.debugKey","link":"debugKey","description":"

Key code used to toggle debug mode, Esc by default

"},{"title":"Debug.debugLine","link":"debugLine","description":"

Draw a debug line in world space

"},{"title":"Debug.debugOverlay","link":"debugOverlay","description":"

True if the debug overlay is active, always false in release builds

"},{"title":"Debug.debugPoint","link":"debugPoint","description":"

Draw a debug point in world space

"},{"title":"Debug.debugPointSize","link":"debugPointSize","description":"

Size to render debug points by default

"},{"title":"Debug.debugRect","link":"debugRect","description":"

Draw a debug rectangle in world space

"},{"title":"Debug.debugSaveCanvas","link":"debugSaveCanvas","description":"

Save a canvas to disk

"},{"title":"Debug.debugSaveDataURL","link":"debugSaveDataURL","description":"

Save a data url to disk

"},{"title":"Debug.debugSaveText","link":"debugSaveText","description":"

Save a text file to disk

"},{"title":"Debug.debugText","link":"debugText","description":"

Draw a debug axis aligned bounding box in world space

"},{"title":"Debug.enableAsserts","link":"enableAsserts","description":"

True if asserts are enaled

"},{"title":"Debug.setDebugKey","link":"setDebugKey","description":"

Set key code used to toggle debug mode, Esc by default

"},{"title":"Debug.setShowWatermark","link":"setShowWatermark","description":"

Set if watermark with FPS should be shown

"},{"title":"Debug.showWatermark","link":"showWatermark","description":"

True if watermark with FPS should be shown, false in release builds

"},{"title":"Draw","link":"Draw","description":"

LittleJS Drawing System

\n\n

LittleJS uses a hybrid rendering solution with the best of both Canvas2D and WebGL.\nThere are 3 canvas/contexts available to draw to...\nmainCanvas - 2D background canvas, non WebGL stuff like tile layers are drawn here.\nglCanvas - Used by the accelerated WebGL batch rendering system.\noverlayCanvas - Another 2D canvas that appears on top of the other 2 canvases.

\n

The WebGL rendering system is very fast with some caveats...

\n\n

The LittleJS rendering solution is intentionally simple, feel free to adjust it for your needs!

"},{"title":"Draw.drawCanvas2D","link":"drawCanvas2D","description":"

Draw directly to a 2d canvas context in world space

"},{"title":"Draw.drawLine","link":"drawLine","description":"

Draw colored line between two points

"},{"title":"Draw.drawRect","link":"drawRect","description":"

Draw colored rect centered on pos

"},{"title":"Draw.drawText","link":"drawText","description":"

Draw text on overlay canvas in world space\nAutomatically splits new lines into rows

"},{"title":"Draw.drawTextScreen","link":"drawTextScreen","description":"

Draw text on overlay canvas in screen space\nAutomatically splits new lines into rows

"},{"title":"Draw.drawTile","link":"drawTile","description":"

Draw textured tile centered in world space, with color applied if using WebGL

"},{"title":"Draw.getCameraSize","link":"getCameraSize","description":"

Get the camera's visible area in world space

"},{"title":"Draw.isFullscreen","link":"isFullscreen","description":"

Returns true if fullscreen mode is active

"},{"title":"Draw.mainCanvas","link":"mainCanvas","description":"

The primary 2D canvas visible to the user

"},{"title":"Draw.mainCanvasSize","link":"mainCanvasSize","description":"

The size of the main canvas (and other secondary canvases)

"},{"title":"Draw.mainContext","link":"mainContext","description":"

2d context for mainCanvas

"},{"title":"Draw.overlayCanvas","link":"overlayCanvas","description":"

A canvas that appears on top of everything the same size as mainCanvas

"},{"title":"Draw.overlayContext","link":"overlayContext","description":"

2d context for overlayCanvas

"},{"title":"Draw.screenToWorld","link":"screenToWorld","description":"

Convert from screen to world space coordinates

"},{"title":"Draw.setBlendMode","link":"setBlendMode","description":"

Enable normal or additive blend mode

"},{"title":"Draw.textureInfos","link":"textureInfos","description":"

Array containing texture info for batch rendering system

"},{"title":"Draw.tile","link":"tile","description":"

Create a tile info object

\n"},{"title":"Draw.toggleFullscreen","link":"toggleFullscreen","description":"

Toggle fullsceen mode

"},{"title":"Draw.worldToScreen","link":"worldToScreen","description":"

Convert from world to screen space coordinates

"},{"title":"Engine","link":"Engine","description":"

LittleJS - The Tiny Fast JavaScript Game Engine\nMIT License - Copyright 2021 Frank Force

\n

Engine Features

\n"},{"title":"Engine.engineInit","link":"engineInit","description":"

Startup LittleJS engine with your callback functions

"},{"title":"Engine.engineName","link":"engineName","description":"

Name of engine

"},{"title":"Engine.engineObjects","link":"engineObjects","description":"

Array containing all engine objects

"},{"title":"Engine.engineObjectsCallback","link":"engineObjectsCallback","description":"

Triggers a callback for each object within a given area

"},{"title":"Engine.engineObjectsCollide","link":"engineObjectsCollide","description":"

Array with only objects set to collide with other objects this frame (for optimization)

"},{"title":"Engine.engineObjectsDestroy","link":"engineObjectsDestroy","description":"

Destroy and remove all objects

"},{"title":"Engine.engineObjectsUpdate","link":"engineObjectsUpdate","description":"

Update each engine object, remove destroyed objects, and update time

"},{"title":"Engine.engineVersion","link":"engineVersion","description":"

Version of engine

"},{"title":"Engine.frame","link":"frame","description":"

Current update frame, used to calculate time

"},{"title":"Engine.frameRate","link":"frameRate","description":"

Frames per second to update

"},{"title":"Engine.paused","link":"paused","description":"

Is the game paused? Causes time and objects to not be updated

"},{"title":"Engine.setPaused","link":"setPaused","description":"

Set if game is paused

"},{"title":"Engine.time","link":"time","description":"

Current engine time since start in seconds

"},{"title":"Engine.timeDelta","link":"timeDelta","description":"

How many seconds each frame lasts, engine uses a fixed time step

"},{"title":"Engine.timeReal","link":"timeReal","description":"

Actual clock time since start in seconds (not affected by pause or frame rate clamping)

"},{"title":"EngineObject","link":"EngineObject","description":"

Create an engine object and adds it to the list of objects

"},{"title":"EngineObject#addChild","link":"addChild","description":"

Attaches a child to this with a given local transform

"},{"title":"EngineObject#additiveColor","link":"additiveColor"},{"title":"EngineObject#angle","link":"angle"},{"title":"EngineObject#angleDamping","link":"angleDamping"},{"title":"EngineObject#angleVelocity","link":"angleVelocity"},{"title":"EngineObject#applyAcceleration","link":"applyAcceleration","description":"

Apply acceleration to this object (adjust velocity, not affected by mass)

"},{"title":"EngineObject#applyForce","link":"applyForce","description":"

Apply force to this object (adjust velocity, affected by mass)

"},{"title":"EngineObject#children","link":"children"},{"title":"EngineObject#collideSolidObjects","link":"collideSolidObjects"},{"title":"EngineObject#collideTiles","link":"collideTiles"},{"title":"EngineObject#collideWithObject","link":"collideWithObject","description":"

Called to check if a object collision should be resolved

"},{"title":"EngineObject#collideWithTile","link":"collideWithTile","description":"

Called to check if a tile collision should be resolved

"},{"title":"EngineObject#collideWithTileRaycast","link":"collideWithTileRaycast","description":"

Called to check if a tile raycast hit

"},{"title":"EngineObject#color","link":"color"},{"title":"EngineObject#damping","link":"damping"},{"title":"EngineObject#destroy","link":"destroy","description":"

Destroy this object, destroy it's children, detach it's parent, and mark it for removal

"},{"title":"EngineObject#drawSize","link":"drawSize"},{"title":"EngineObject#elasticity","link":"elasticity"},{"title":"EngineObject#friction","link":"friction"},{"title":"EngineObject#getAliveTime","link":"getAliveTime","description":"

How long since the object was created

"},{"title":"EngineObject#getMirrorSign","link":"getMirrorSign","description":"

Get the direction of the mirror

"},{"title":"EngineObject#gravityScale","link":"gravityScale"},{"title":"EngineObject#isSolid","link":"isSolid"},{"title":"EngineObject#localAngle","link":"localAngle"},{"title":"EngineObject#localPos","link":"localPos"},{"title":"EngineObject#mass","link":"mass"},{"title":"EngineObject#mirror","link":"mirror"},{"title":"EngineObject#parent","link":"parent"},{"title":"EngineObject#pos","link":"pos"},{"title":"EngineObject#removeChild","link":"removeChild","description":"

Removes a child from this one

"},{"title":"EngineObject#render","link":"render","description":"

Render the object, draws a tile by default, automatically called each frame, sorted by renderOrder

"},{"title":"EngineObject#renderOrder","link":"renderOrder"},{"title":"EngineObject#setCollision","link":"setCollision","description":"

Set how this object collides

"},{"title":"EngineObject#size","link":"size"},{"title":"EngineObject#spawnTime","link":"spawnTime"},{"title":"EngineObject#tileInfo","link":"tileInfo"},{"title":"EngineObject#toString","link":"toString","description":"

Returns string containg info about this object for debugging

"},{"title":"EngineObject#update","link":"update","description":"

Update the object transform and physics, called automatically by engine once each frame

"},{"title":"EngineObject#velocity","link":"velocity"},{"title":"FontImage","link":"FontImage","description":"

Create an image font

"},{"title":"FontImage#drawText","link":"drawText","description":"

Draw text in world space using the image font

"},{"title":"FontImage#drawTextScreen","link":"drawTextScreen","description":"

Draw text in screen space using the image font

"},{"title":"Input","link":"Input","description":"

LittleJS Input System

\n"},{"title":"Input.clearInput","link":"clearInput","description":"

Clears all input

"},{"title":"Input.gamepadIsDown","link":"gamepadIsDown","description":"

Returns true if gamepad button is down

"},{"title":"Input.gamepadStick","link":"gamepadStick","description":"

Returns gamepad stick value

"},{"title":"Input.gamepadWasPressed","link":"gamepadWasPressed","description":"

Returns true if gamepad button was pressed

"},{"title":"Input.gamepadWasReleased","link":"gamepadWasReleased","description":"

Returns true if gamepad button was released

"},{"title":"Input.isTouchDevice","link":"isTouchDevice","description":"

True if a touch device has been detected

"},{"title":"Input.isUsingGamepad","link":"isUsingGamepad","description":"

Returns true if user is using gamepad (has more recently pressed a gamepad button)

"},{"title":"Input.keyIsDown","link":"keyIsDown","description":"

Returns true if device key is down

"},{"title":"Input.keyWasPressed","link":"keyWasPressed","description":"

Returns true if device key was pressed this frame

"},{"title":"Input.keyWasReleased","link":"keyWasReleased","description":"

Returns true if device key was released this frame

"},{"title":"Input.mouseIsDown","link":"mouseIsDown","description":"

Returns true if mouse button is down

"},{"title":"Input.mousePos","link":"mousePos","description":"

Mouse pos in world space

"},{"title":"Input.mousePosScreen","link":"mousePosScreen","description":"

Mouse pos in screen space

"},{"title":"Input.mouseWasPressed","link":"mouseWasPressed","description":"

Returns true if mouse button was pressed

"},{"title":"Input.mouseWasReleased","link":"mouseWasReleased","description":"

Returns true if mouse button was released

"},{"title":"Input.mouseWheel","link":"mouseWheel","description":"

Mouse wheel delta this frame

"},{"title":"Input.preventDefaultInput","link":"preventDefaultInput","description":"

Prevents input continuing to the default browser handling (false by default)

"},{"title":"Input.vibrate","link":"vibrate","description":"

Pulse the vibration hardware if it exists

"},{"title":"Input.vibrateStop","link":"vibrateStop","description":"

Cancel any ongoing vibration

"},{"title":"Medal","link":"Medal","description":"

Create a medal object and adds it to the list of medals

"},{"title":"Medal#render","link":"render","description":"

Render a medal

"},{"title":"Medal#renderIcon","link":"renderIcon","description":"

Render the icon for a medal

"},{"title":"Medal#unlock","link":"unlock","description":"

Unlocks a medal if not already unlocked

"},{"title":"Medals","link":"Medals","description":"

LittleJS Medal System

\n"},{"title":"Medals.medals","link":"medals","description":"

List of all medals

"},{"title":"Medals.medalsInit","link":"medalsInit","description":"

Initialize medals with a save name used for storage

\n"},{"title":"Medals.newgroundsInit","link":"newgroundsInit","description":"

This can used to enable Newgrounds functionality

"},{"title":"Music","link":"Music","description":"

Create a music object and cache the zzfx music samples for later use

"},{"title":"Music#playMusic","link":"playMusic","description":"

Play the music

"},{"title":"Newgrounds","link":"Newgrounds","description":"

Create a newgrounds object

"},{"title":"Newgrounds#call","link":"call","description":"

Send a message to call a component of the Newgrounds API

"},{"title":"Newgrounds#getScores","link":"getScores","description":"

Get scores from a scoreboard

"},{"title":"Newgrounds#logView","link":"logView","description":"

Send message to log a view

"},{"title":"Newgrounds#postScore","link":"postScore","description":"

Send message to post score

"},{"title":"Newgrounds#unlockMedal","link":"unlockMedal","description":"

Send message to unlock a medal by id

"},{"title":"Particle","link":"Particle","description":"

Create a particle with the given shis.colorStart = undefined;ettings

"},{"title":"Particle#additive","link":"additive"},{"title":"Particle#colorEndDelta","link":"colorEndDelta"},{"title":"Particle#colorStart","link":"colorStart"},{"title":"Particle#destroyCallback","link":"destroyCallback"},{"title":"Particle#fadeRate","link":"fadeRate"},{"title":"Particle#lifeTime","link":"lifeTime"},{"title":"Particle#localSpaceEmitter","link":"localSpaceEmitter"},{"title":"Particle#render","link":"render","description":"

Render the particle, automatically called each frame, sorted by renderOrder

"},{"title":"Particle#sizeEndDelta","link":"sizeEndDelta"},{"title":"Particle#sizeStart","link":"sizeStart"},{"title":"Particle#trailScale","link":"trailScale"},{"title":"ParticleEmitter","link":"ParticleEmitter","description":"

Create a particle system with the given settings

"},{"title":"ParticleEmitter#additive","link":"additive"},{"title":"ParticleEmitter#angleDamping","link":"angleDamping"},{"title":"ParticleEmitter#angleSpeed","link":"angleSpeed"},{"title":"ParticleEmitter#collideTiles","link":"collideTiles"},{"title":"ParticleEmitter#colorEndA","link":"colorEndA"},{"title":"ParticleEmitter#colorEndB","link":"colorEndB"},{"title":"ParticleEmitter#colorStartA","link":"colorStartA"},{"title":"ParticleEmitter#colorStartB","link":"colorStartB"},{"title":"ParticleEmitter#damping","link":"damping"},{"title":"ParticleEmitter#emitConeAngle","link":"emitConeAngle"},{"title":"ParticleEmitter#emitParticle","link":"emitParticle","description":"

Spawn one particle

"},{"title":"ParticleEmitter#emitRate","link":"emitRate"},{"title":"ParticleEmitter#emitSize","link":"emitSize"},{"title":"ParticleEmitter#emitTime","link":"emitTime"},{"title":"ParticleEmitter#emitTimeBuffer","link":"emitTimeBuffer"},{"title":"ParticleEmitter#fadeRate","link":"fadeRate"},{"title":"ParticleEmitter#gravityScale","link":"gravityScale"},{"title":"ParticleEmitter#localSpace","link":"localSpace"},{"title":"ParticleEmitter#particleConeAngle","link":"particleConeAngle"},{"title":"ParticleEmitter#particleCreateCallback","link":"particleCreateCallback"},{"title":"ParticleEmitter#particleDestroyCallback","link":"particleDestroyCallback"},{"title":"ParticleEmitter#particleTime","link":"particleTime"},{"title":"ParticleEmitter#randomColorLinear","link":"randomColorLinear"},{"title":"ParticleEmitter#randomness","link":"randomness"},{"title":"ParticleEmitter#sizeEnd","link":"sizeEnd"},{"title":"ParticleEmitter#sizeStart","link":"sizeStart"},{"title":"ParticleEmitter#speed","link":"speed"},{"title":"ParticleEmitter#trailScale","link":"trailScale"},{"title":"ParticleEmitter#update","link":"update","description":"

Update the emitter to spawn particles, called automatically by engine once each frame

"},{"title":"Random","link":"Random","description":"

Random global functions

"},{"title":"Random.rand","link":"rand","description":"

Returns a random value between the two values passed in

"},{"title":"Random.randColor","link":"randColor","description":"

Returns a random color between the two passed in colors, combine components if linear

"},{"title":"Random.randInCircle","link":"randInCircle","description":"

Returns a random Vector2 within a circular shape

"},{"title":"Random.randInt","link":"randInt","description":"

Returns a floored random value the two values passed in

"},{"title":"Random.randSign","link":"randSign","description":"

Randomly returns either -1 or 1

"},{"title":"Random.randVector","link":"randVector","description":"

Returns a random Vector2 with the passed in length

"},{"title":"RandomGenerator","link":"RandomGenerator","description":"

Create a random number generator with the seed passed in

"},{"title":"RandomGenerator#float","link":"float","description":"

Returns a seeded random value between the two values passed in

"},{"title":"RandomGenerator#int","link":"int","description":"

Returns a floored seeded random value the two values passed in

"},{"title":"RandomGenerator#seed","link":"seed"},{"title":"RandomGenerator#sign","link":"sign","description":"

Randomly returns either -1 or 1 deterministically

"},{"title":"Settings","link":"Settings","description":"

LittleJS Engine Settings

\n"},{"title":"Settings.cameraPos","link":"cameraPos","description":"

Position of camera in world space

"},{"title":"Settings.cameraScale","link":"cameraScale","description":"

Scale of camera in world space

"},{"title":"Settings.canvasFixedSize","link":"canvasFixedSize","description":"

Fixed size of the canvas, if enabled canvas size never changes

\n"},{"title":"Settings.canvasMaxSize","link":"canvasMaxSize","description":"

The max size of the canvas, centered if window is larger

"},{"title":"Settings.canvasPixelated","link":"canvasPixelated","description":"

Disables filtering for crisper pixel art if true

"},{"title":"Settings.enablePhysicsSolver","link":"enablePhysicsSolver","description":"

Enable physics solver for collisions between objects

"},{"title":"Settings.fontDefault","link":"fontDefault","description":"

Default font used for text rendering

"},{"title":"Settings.gamepadDirectionEmulateStick","link":"gamepadDirectionEmulateStick","description":"

If true, the dpad input is also routed to the left analog stick (for better accessability)

"},{"title":"Settings.gamepadsEnable","link":"gamepadsEnable","description":"

Should gamepads be allowed

"},{"title":"Settings.glEnable","link":"glEnable","description":"

Enable webgl rendering, webgl can be disabled and removed from build (with some features disabled)

"},{"title":"Settings.glOverlay","link":"glOverlay","description":"

Fixes slow rendering in some browsers by not compositing the WebGL canvas

"},{"title":"Settings.gravity","link":"gravity","description":"

How much gravity to apply to objects along the Y axis, negative is down

"},{"title":"Settings.inputWASDEmulateDirection","link":"inputWASDEmulateDirection","description":"

If true the WASD keys are also routed to the direction keys (for better accessability)

"},{"title":"Settings.medalDisplayIconSize","link":"medalDisplayIconSize","description":"

Size of icon in medal display

"},{"title":"Settings.medalDisplaySize","link":"medalDisplaySize","description":"

Size of medal display

"},{"title":"Settings.medalDisplaySlideTime","link":"medalDisplaySlideTime","description":"

How quickly to slide on/off medals in seconds

"},{"title":"Settings.medalDisplayTime","link":"medalDisplayTime","description":"

How long to show medals for in seconds

"},{"title":"Settings.medalsPreventUnlock","link":"medalsPreventUnlock","description":"

Set to stop medals from being unlockable (like if cheats are enabled)

"},{"title":"Settings.objectDefaultAngleDamping","link":"objectDefaultAngleDamping","description":"

How much to slow angular velocity each frame (0-1)

"},{"title":"Settings.objectDefaultDamping","link":"objectDefaultDamping","description":"

How much to slow velocity by each frame (0-1)

"},{"title":"Settings.objectDefaultElasticity","link":"objectDefaultElasticity","description":"

How much to bounce when a collision occurs (0-1)

"},{"title":"Settings.objectDefaultFriction","link":"objectDefaultFriction","description":"

How much to slow when touching (0-1)

"},{"title":"Settings.objectDefaultMass","link":"objectDefaultMass","description":"

Default object mass for collision calcuations (how heavy objects are)

"},{"title":"Settings.objectMaxSpeed","link":"objectMaxSpeed","description":"

Clamp max speed to avoid fast objects missing collisions

"},{"title":"Settings.particleEmitRateScale","link":"particleEmitRateScale","description":"

Scales emit rate of particles, useful for low graphics mode (0 disables particle emitters)

"},{"title":"Settings.setCameraPos","link":"setCameraPos","description":"

Set position of camera in world space

"},{"title":"Settings.setCameraScale","link":"setCameraScale","description":"

Set scale of camera in world space

"},{"title":"Settings.setCanvasFixedSize","link":"setCanvasFixedSize","description":"

Set fixed size of the canvas

"},{"title":"Settings.setCanvasMaxSize","link":"setCanvasMaxSize","description":"

Set max size of the canvas

"},{"title":"Settings.setCanvasPixelated","link":"setCanvasPixelated","description":"

Disables anti aliasing for pixel art if true

"},{"title":"Settings.setEnablePhysicsSolver","link":"setEnablePhysicsSolver","description":"

Set if collisions between objects are enabled

"},{"title":"Settings.setFontDefault","link":"setFontDefault","description":"

Set default font used for text rendering

"},{"title":"Settings.setGamepadDirectionEmulateStick","link":"setGamepadDirectionEmulateStick","description":"

Set if the dpad input is also routed to the left analog stick

"},{"title":"Settings.setGamepadsEnable","link":"setGamepadsEnable","description":"

Set if gamepads are enabled

"},{"title":"Settings.setGlEnable","link":"setGlEnable","description":"

Set if webgl rendering is enabled

"},{"title":"Settings.setGlOverlay","link":"setGlOverlay","description":"

Set to not composite the WebGL canvas

"},{"title":"Settings.setGravity","link":"setGravity","description":"

Set how much gravity to apply to objects along the Y axis

"},{"title":"Settings.setInputWASDEmulateDirection","link":"setInputWASDEmulateDirection","description":"

Set if true the WASD keys are also routed to the direction keys

"},{"title":"Settings.setMedalDisplayIconSize","link":"setMedalDisplayIconSize","description":"

Set size of icon in medal display

"},{"title":"Settings.setMedalDisplaySize","link":"setMedalDisplaySize","description":"

Set size of medal display

"},{"title":"Settings.setMedalDisplaySlideTime","link":"setMedalDisplaySlideTime","description":"

Set how quickly to slide on/off medals in seconds

"},{"title":"Settings.setMedalDisplayTime","link":"setMedalDisplayTime","description":"

Set how long to show medals for in seconds

"},{"title":"Settings.setMedalsPreventUnlock","link":"setMedalsPreventUnlock","description":"

Set to stop medals from being unlockable

"},{"title":"Settings.setObjectDefaultAngleDamping","link":"setObjectDefaultAngleDamping","description":"

Set how much to slow angular velocity each frame

"},{"title":"Settings.setObjectDefaultDamping","link":"setObjectDefaultDamping","description":"

Set how much to slow velocity by each frame

"},{"title":"Settings.setObjectDefaultElasticity","link":"setObjectDefaultElasticity","description":"

Set how much to bounce when a collision occur

"},{"title":"Settings.setObjectDefaultFriction","link":"setObjectDefaultFriction","description":"

Set how much to slow when touching

"},{"title":"Settings.setObjectDefaultMass","link":"setObjectDefaultMass","description":"

Set default object mass for collison calcuations

"},{"title":"Settings.setObjectMaxSpeed","link":"setObjectMaxSpeed","description":"

Set max speed to avoid fast objects missing collisions

"},{"title":"Settings.setParticleEmitRateScale","link":"setParticleEmitRateScale","description":"

Set to scales emit rate of particles

"},{"title":"Settings.setShowSplashScreen","link":"setShowSplashScreen","description":"

Set if the LittleJS splash screen be shown on startup

"},{"title":"Settings.setSoundDefaultRange","link":"setSoundDefaultRange","description":"

Set default range where sound no longer plays

"},{"title":"Settings.setSoundDefaultTaper","link":"setSoundDefaultTaper","description":"

Set default range percent to start tapering off sound

"},{"title":"Settings.setSoundEnable","link":"setSoundEnable","description":"

Set to disable all audio code

"},{"title":"Settings.setSoundVolume","link":"setSoundVolume","description":"

Set volume scale to apply to all sound, music and speech

"},{"title":"Settings.setTileFixBleedScale","link":"setTileFixBleedScale","description":"

Set to prevent tile bleeding from neighbors in pixels

"},{"title":"Settings.setTileSizeDefault","link":"setTileSizeDefault","description":"

Set default size of tiles in pixels

"},{"title":"Settings.setTouchGamepadAlpha","link":"setTouchGamepadAlpha","description":"

Set transparency of touch gamepad overlay

"},{"title":"Settings.setTouchGamepadAnalog","link":"setTouchGamepadAnalog","description":"

Set if touch gamepad should be analog stick or 8 way dpad

"},{"title":"Settings.setTouchGamepadEnable","link":"setTouchGamepadEnable","description":"

Set if touch gamepad should appear on mobile devices

"},{"title":"Settings.setTouchGamepadSize","link":"setTouchGamepadSize","description":"

Set size of virutal gamepad for touch devices in pixels

"},{"title":"Settings.setVibrateEnable","link":"setVibrateEnable","description":"

Set to allow vibration hardware if it exists

"},{"title":"Settings.showSplashScreen","link":"showSplashScreen","description":"

Enable to show the LittleJS splash screen be shown on startup

"},{"title":"Settings.soundDefaultRange","link":"soundDefaultRange","description":"

Default range where sound no longer plays

"},{"title":"Settings.soundDefaultTaper","link":"soundDefaultTaper","description":"

Default range percent to start tapering off sound (0-1)

"},{"title":"Settings.soundEnable","link":"soundEnable","description":"

All audio code can be disabled and removed from build

"},{"title":"Settings.soundVolume","link":"soundVolume","description":"

Volume scale to apply to all sound, music and speech

"},{"title":"Settings.tileFixBleedScale","link":"tileFixBleedScale","description":"

How many pixels smaller to draw tiles to prevent bleeding from neighbors

"},{"title":"Settings.tileSizeDefault","link":"tileSizeDefault","description":"

Default size of tiles in pixels

"},{"title":"Settings.touchGamepadAlpha","link":"touchGamepadAlpha","description":"

Transparency of touch gamepad overlay

"},{"title":"Settings.touchGamepadAnalog","link":"touchGamepadAnalog","description":"

True if touch gamepad should be analog stick or false to use if 8 way dpad

"},{"title":"Settings.touchGamepadEnable","link":"touchGamepadEnable","description":"

True if touch gamepad should appear on mobile devices

\n"},{"title":"Settings.touchGamepadSize","link":"touchGamepadSize","description":"

Size of virtual gamepad for touch devices in pixels

"},{"title":"Settings.vibrateEnable","link":"vibrateEnable","description":"

Allow vibration hardware if it exists

"},{"title":"Sound","link":"Sound","description":"

Create a sound object and cache the zzfx samples for later use

"},{"title":"Sound#getDuration","link":"getDuration","description":"

Get how long this sound is in seconds

"},{"title":"Sound#getSource","link":"getSource","description":"

Get source of most recent instance of this sound that was played

"},{"title":"Sound#isLoading","link":"isLoading","description":"

Check if sound is loading, for sounds fetched from a url

"},{"title":"Sound#play","link":"play","description":"

Play the sound

"},{"title":"Sound#playNote","link":"playNote","description":"

Play the sound as a note with a semitone offset

"},{"title":"Sound#randomness","link":"randomness"},{"title":"Sound#range","link":"range"},{"title":"Sound#stop","link":"stop","description":"

Stop the last instance of this sound that was played

"},{"title":"Sound#taper","link":"taper"},{"title":"SoundWave","link":"SoundWave","description":"

Create a sound object and cache the wave file for later use

"},{"title":"TextureInfo","link":"TextureInfo","description":"

Create a TextureInfo, called automatically by the engine

"},{"title":"TextureInfo#fixBleedSize","link":"fixBleedSize"},{"title":"TextureInfo#glTexture","link":"glTexture"},{"title":"TextureInfo#image","link":"image"},{"title":"TextureInfo#size","link":"size"},{"title":"TileCollision","link":"TileCollision","description":"

LittleJS Tile Layer System

\n"},{"title":"TileCollision.getTileCollisionData","link":"getTileCollisionData","description":"

Get tile collision data

"},{"title":"TileCollision.initTileCollision","link":"initTileCollision","description":"

Clear and initialize tile collision

"},{"title":"TileCollision.setTileCollisionData","link":"setTileCollisionData","description":"

Set tile collision data

"},{"title":"TileCollision.tileCollision","link":"tileCollision","description":"

The tile collision layer array, use setTileCollisionData and getTileCollisionData to access

"},{"title":"TileCollision.tileCollisionRaycast","link":"tileCollisionRaycast","description":"

Return the center of tile if any that is hit (does not return the exact intersection)

"},{"title":"TileCollision.tileCollisionSize","link":"tileCollisionSize","description":"

Size of the tile collision layer

"},{"title":"TileCollision.tileCollisionTest","link":"tileCollisionTest","description":"

Check if collision with another object should occur

"},{"title":"TileInfo","link":"TileInfo","description":"

Create a tile info object

"},{"title":"TileInfo#frame","link":"frame","description":"

Returns a copy of this tile offset by a number of animation frames

"},{"title":"TileInfo#getTextureInfo","link":"getTextureInfo","description":"

Returns the texture info for this tile

"},{"title":"TileInfo#offset","link":"offset","description":"

Returns a copy of this tile offset by a vector

"},{"title":"TileInfo#pos","link":"pos"},{"title":"TileInfo#size","link":"size"},{"title":"TileInfo#textureIndex","link":"textureIndex"},{"title":"TileLayer","link":"TileLayer","description":"

Create a tile layer object

"},{"title":"TileLayer#canvas","link":"canvas"},{"title":"TileLayer#context","link":"context"},{"title":"TileLayer#drawCanvas2D","link":"drawCanvas2D","description":"

Draw directly to the 2D canvas in world space (bipass webgl)

"},{"title":"TileLayer#drawRect","link":"drawRect","description":"

Draw a rectangle directly onto the layer canvas in world space

"},{"title":"TileLayer#drawTile","link":"drawTile","description":"

Draw a tile directly onto the layer canvas in world space

"},{"title":"TileLayer#drawTileData","link":"drawTileData","description":"

Draw the tile at a given position in the tile grid\nThis can be used to clear out tiles when they are destroyed\nTiles can also be redrawn if isinde a redrawStart/End block

"},{"title":"TileLayer#getData","link":"getData","description":"

Get data at a given position in the array

"},{"title":"TileLayer#isOverlay","link":"isOverlay"},{"title":"TileLayer#redraw","link":"redraw","description":"

Draw all the tile data to an offscreen canvas

\n"},{"title":"TileLayer#redrawEnd","link":"redrawEnd","description":"

Call to end the redraw process

"},{"title":"TileLayer#redrawStart","link":"redrawStart","description":"

Call to start the redraw process

\n"},{"title":"TileLayer#savedRenderSettings","link":"savedRenderSettings"},{"title":"TileLayer#scale","link":"scale"},{"title":"TileLayer#setData","link":"setData","description":"

Set data at a given position in the array

"},{"title":"TileLayerData","link":"TileLayerData","description":"

Create a tile layer data object, one for each tile in a TileLayer

"},{"title":"TileLayerData#clear","link":"clear","description":"

Set this tile to clear, it will not be rendered

"},{"title":"TileLayerData#color","link":"color"},{"title":"TileLayerData#direction","link":"direction"},{"title":"TileLayerData#mirror","link":"mirror"},{"title":"TileLayerData#tile","link":"tile"},{"title":"Timer","link":"Timer","description":"

Create a timer object set time passed in

"},{"title":"Timer#active","link":"active","description":"

Returns true if set and has not elapsed

"},{"title":"Timer#elapsed","link":"elapsed","description":"

Returns true if set and elapsed

"},{"title":"Timer#get","link":"get","description":"

Get how long since elapsed, returns 0 if not set (returns negative if currently active)

"},{"title":"Timer#getPercent","link":"getPercent","description":"

Get percentage elapsed based on time it was set to, returns 0 if not set

"},{"title":"Timer#isSet","link":"isSet","description":"

Returns true if set

"},{"title":"Timer#set","link":"set","description":"

Set the timer with seconds passed in

"},{"title":"Timer#toString","link":"toString","description":"

Returns this timer expressed as a string

"},{"title":"Timer#unset","link":"unset","description":"

Unset the timer

"},{"title":"Timer#valueOf","link":"valueOf","description":"

Get how long since elapsed, returns 0 if not set (returns negative if currently active)

"},{"title":"Utilities","link":"Utilities","description":"

LittleJS Utility Classes and Functions

\n"},{"title":"Utilities.PI","link":"PI","description":"

A shortcut to get Math.PI

"},{"title":"Utilities.abs","link":"abs","description":"

Returns absoulte value of value passed in

"},{"title":"Utilities.clamp","link":"clamp","description":"

Clamps the value beween max and min

"},{"title":"Utilities.distanceAngle","link":"distanceAngle","description":"

Returns signed wrapped distance between the two angles passed in

"},{"title":"Utilities.distanceWrap","link":"distanceWrap","description":"

Returns signed wrapped distance between the two values passed in

"},{"title":"Utilities.formatTime","link":"formatTime","description":"

Formats seconds to mm:ss style for display purposes

"},{"title":"Utilities.hsl","link":"hsl","description":"

Create a color object with HSLA values, white by default

"},{"title":"Utilities.isColor","link":"isColor","description":"

Check if object is a valid Color

"},{"title":"Utilities.isOverlapping","link":"isOverlapping","description":"

Returns true if two axis aligned bounding boxes are overlapping

"},{"title":"Utilities.isVector2","link":"isVector2","description":"

Check if object is a valid Vector2

"},{"title":"Utilities.lerp","link":"lerp","description":"

Linearly interpolates between values passed in using percent

"},{"title":"Utilities.lerpAngle","link":"lerpAngle","description":"

Linearly interpolates between the angles passed in with wrapping

"},{"title":"Utilities.lerpWrap","link":"lerpWrap","description":"

Linearly interpolates between values passed in with wrapping

"},{"title":"Utilities.max","link":"max","description":"

Returns highest of two values passed in

"},{"title":"Utilities.min","link":"min","description":"

Returns lowest of two values passed in

"},{"title":"Utilities.mod","link":"mod","description":"

Returns first parm modulo the second param, but adjusted so negative numbers work as expected

"},{"title":"Utilities.nearestPowerOfTwo","link":"nearestPowerOfTwo","description":"

Returns the nearest power of two not less then the value

"},{"title":"Utilities.percent","link":"percent","description":"

Returns what percentage the value is between valueA and valueB

"},{"title":"Utilities.rgb","link":"rgb","description":"

Create a color object with RGBA values, white by default

"},{"title":"Utilities.sign","link":"sign","description":"

Returns the sign of value passed in

"},{"title":"Utilities.smoothStep","link":"smoothStep","description":"

Applies smoothstep function to the percentage value

"},{"title":"Utilities.vec2","link":"vec2","description":"

Create a 2d vector, can take another Vector2 to copy, 2 scalars, or 1 scalar

"},{"title":"Utilities.wave","link":"wave","description":"

Returns an oscillating wave between 0 and amplitude with frequency of 1 Hz by default

"},{"title":"Vector2","link":"Vector2","description":"

Create a 2D vector with the x and y passed in, can also be created with vec2()

"},{"title":"Vector2#add","link":"add","description":"

Returns a copy of this vector plus the vector passed in

"},{"title":"Vector2#angle","link":"angle","description":"

Returns the angle of this vector, up is angle 0

"},{"title":"Vector2#area","link":"area","description":"

Returns the area this vector covers as a rectangle

"},{"title":"Vector2#arrayCheck","link":"arrayCheck","description":"

Returns true if this vector is within the bounds of an array size passed in

"},{"title":"Vector2#clampLength","link":"clampLength","description":"

Returns a new vector clamped to length passed in

"},{"title":"Vector2#copy","link":"copy","description":"

Returns a new vector that is a copy of this

"},{"title":"Vector2#cross","link":"cross","description":"

Returns the cross product of this and the vector passed in

"},{"title":"Vector2#direction","link":"direction","description":"

Returns the integer direction of this vector, corrosponding to multiples of 90 degree rotation (0-3)

"},{"title":"Vector2#distance","link":"distance","description":"

Returns the distance from this vector to vector passed in

"},{"title":"Vector2#distanceSquared","link":"distanceSquared","description":"

Returns the distance squared from this vector to vector passed in

"},{"title":"Vector2#divide","link":"divide","description":"

Returns a copy of this vector divided by the vector passed in

"},{"title":"Vector2#dot","link":"dot","description":"

Returns the dot product of this and the vector passed in

"},{"title":"Vector2#floor","link":"floor","description":"

Returns a copy of this vector with each axis floored

"},{"title":"Vector2#invert","link":"invert","description":"

Returns a copy of this vector that has been inverted

"},{"title":"Vector2#length","link":"length","description":"

Returns the length of this vector

"},{"title":"Vector2#lengthSquared","link":"lengthSquared","description":"

Returns the length of this vector squared

"},{"title":"Vector2#lerp","link":"lerp","description":"

Returns a new vector that is p percent between this and the vector passed in

"},{"title":"Vector2#multiply","link":"multiply","description":"

Returns a copy of this vector times the vector passed in

"},{"title":"Vector2#normalize","link":"normalize","description":"

Returns a new vector in same direction as this one with the length passed in

"},{"title":"Vector2#rotate","link":"rotate","description":"

Returns copy of this vector rotated by the angle passed in

"},{"title":"Vector2#scale","link":"scale","description":"

Returns a copy of this vector scaled by the vector passed in

"},{"title":"Vector2#setAngle","link":"setAngle","description":"

Sets this vector with angle and length passed in

"},{"title":"Vector2#setDirection","link":"setDirection","description":"

Set the integer direction of this vector, corrosponding to multiples of 90 degree rotation (0-3)

"},{"title":"Vector2#subtract","link":"subtract","description":"

Returns a copy of this vector minus the vector passed in

"},{"title":"Vector2#toString","link":"toString","description":"

Returns this vector expressed as a string

"},{"title":"Vector2#x","link":"x"},{"title":"Vector2#y","link":"y"},{"title":"WebGL","link":"WebGL","description":"

LittleJS WebGL Interface

\n"},{"title":"WebGL.glCanvas","link":"glCanvas","description":"

The WebGL canvas which appears above the main canvas and below the overlay canvas

"},{"title":"WebGL.glCompileShader","link":"glCompileShader","description":"

Compile WebGL shader of the given type, will throw errors if in debug mode

"},{"title":"WebGL.glContext","link":"glContext","description":"

2d context for glCanvas

"},{"title":"WebGL.glCopyToContext","link":"glCopyToContext","description":"

Draw any sprites still in the buffer, copy to main canvas and clear

"},{"title":"WebGL.glCreateProgram","link":"glCreateProgram","description":"

Create WebGL program with given shaders

"},{"title":"WebGL.glCreateTexture","link":"glCreateTexture","description":"

Create WebGL texture from an image and init the texture settings

"},{"title":"WebGL.glDraw","link":"glDraw","description":"

Add a sprite to the gl draw list, used by all gl draw functions

"},{"title":"WebGL.glFlush","link":"glFlush","description":"

Draw all sprites and clear out the buffer, called automatically by the system whenever necessary

"},{"title":"WebGL.glInitPostProcess","link":"glInitPostProcess","description":"

Set up a post processing shader

"},{"title":"WebGL.glSetTexture","link":"glSetTexture","description":"

Set the WebGl texture, called automatically if using multiple textures

\n"}]} \ No newline at end of file diff --git a/docs/engine.js.html b/docs/engine.js.html index 37e3a4ed..0093120d 100644 --- a/docs/engine.js.html +++ b/docs/engine.js.html @@ -1,7 +1,7 @@ Source: engine.js
On this page

engine.js

/** 
- * LittleJS - The Tiny JavaScript Game Engine That Can!
+ * LittleJS - The Tiny Fast JavaScript Game Engine
  * MIT License - Copyright 2021 Frank Force
  * 
  * Engine Features
@@ -32,9 +32,9 @@
  *  @type {String}
  *  @default
  *  @memberof Engine */
-const engineVersion = '1.9.2';
+const engineVersion = '1.9.4';
 
-/** Frames per second to update objects
+/** Frames per second to update
  *  @type {Number}
  *  @default
  *  @memberof Engine */
@@ -51,7 +51,7 @@
  *  @memberof Engine */
 let engineObjects = [];
 
-/** Array containing only objects that are set to collide with other objects this frame (for optimization)
+/** Array with only objects set to collide with other objects this frame (for optimization)
  *  @type {Array}
  *  @memberof Engine */
 let engineObjectsCollide = [];
@@ -61,7 +61,7 @@
  *  @memberof Engine */
 let frame = 0;
 
-/** Current engine time since start in seconds, derived from frame
+/** Current engine time since start in seconds
  *  @type {Number}
  *  @memberof Engine */
 let time = 0;
@@ -87,12 +87,12 @@
 
 ///////////////////////////////////////////////////////////////////////////////
 
-/** Start up LittleJS engine with your callback functions
- *  @param {Function} gameInit        - Called once after the engine starts up, setup the game
- *  @param {Function} gameUpdate      - Called every frame at 60 frames per second, handle input and update the game state
- *  @param {Function} gameUpdatePost  - Called after physics and objects are updated, setup camera and prepare for render
- *  @param {Function} gameRender      - Called before objects are rendered, draw any background effects that appear behind objects
- *  @param {Function} gameRenderPost  - Called after objects are rendered, draw effects or hud that appear above all objects
+/** Startup LittleJS engine with your callback functions
+ *  @param {Function} gameInit       - Called once after the engine starts up, setup the game
+ *  @param {Function} gameUpdate     - Called every frame at 60 frames per second, handle input and update the game state
+ *  @param {Function} gameUpdatePost - Called after physics and objects are updated, setup camera and prepare for render
+ *  @param {Function} gameRender     - Called before objects are rendered, draw any background effects that appear behind objects
+ *  @param {Function} gameRenderPost - Called after objects are rendered, draw effects or hud that appear above all objects
  *  @param {Array} [imageSources=['tiles.png']] - Image to load
  *  @memberof Engine */
 function engineInit(gameInit, gameUpdate, gameUpdatePost, gameRender, gameRenderPost, imageSources=['tiles.png'])
@@ -114,33 +114,8 @@
         timeReal += frameTimeDeltaMS / 1e3;
         frameTimeBufferMS += paused ? 0 : frameTimeDeltaMS;
         if (!debugSpeedUp)
-            frameTimeBufferMS = min(frameTimeBufferMS, 50); // clamp incase of slow framerate
-
-        if (canvasFixedSize.x)
-        {
-            // clear canvas and set fixed size
-            mainCanvas.width  = canvasFixedSize.x;
-            mainCanvas.height = canvasFixedSize.y;
-            
-            // fit to window by adding space on top or bottom if necessary
-            const aspect = innerWidth / innerHeight;
-            const fixedAspect = mainCanvas.width / mainCanvas.height;
-            (glCanvas||mainCanvas).style.width = mainCanvas.style.width = overlayCanvas.style.width  = aspect < fixedAspect ? '100%' : '';
-            (glCanvas||mainCanvas).style.height = mainCanvas.style.height = overlayCanvas.style.height = aspect < fixedAspect ? '' : '100%';
-        }
-        else
-        {
-            // clear canvas and set size to same as window
-            mainCanvas.width  = min(innerWidth,  canvasMaxSize.x);
-            mainCanvas.height = min(innerHeight, canvasMaxSize.y);
-        }
-        
-        // clear overlay canvas and set size
-        overlayCanvas.width  = mainCanvas.width;
-        overlayCanvas.height = mainCanvas.height;
-
-        // save canvas size
-        mainCanvasSize = vec2(mainCanvas.width, mainCanvas.height);
+            frameTimeBufferMS = min(frameTimeBufferMS, 50); // clamp in case of slow framerate
+        updateCanvas();
 
         if (paused)
         {
@@ -214,6 +189,35 @@
         requestAnimationFrame(engineUpdate);
     }
 
+    function updateCanvas()
+    {
+        if (canvasFixedSize.x)
+        {
+            // clear canvas and set fixed size
+            mainCanvas.width  = canvasFixedSize.x;
+            mainCanvas.height = canvasFixedSize.y;
+            
+            // fit to window by adding space on top or bottom if necessary
+            const aspect = innerWidth / innerHeight;
+            const fixedAspect = mainCanvas.width / mainCanvas.height;
+            (glCanvas||mainCanvas).style.width = mainCanvas.style.width = overlayCanvas.style.width  = aspect < fixedAspect ? '100%' : '';
+            (glCanvas||mainCanvas).style.height = mainCanvas.style.height = overlayCanvas.style.height = aspect < fixedAspect ? '' : '100%';
+        }
+        else
+        {
+            // clear canvas and set size to same as window
+            mainCanvas.width  = min(innerWidth,  canvasMaxSize.x);
+            mainCanvas.height = min(innerHeight, canvasMaxSize.y);
+        }
+        
+        // clear overlay canvas and set size
+        overlayCanvas.width  = mainCanvas.width;
+        overlayCanvas.height = mainCanvas.height;
+
+        // save canvas size
+        mainCanvasSize = vec2(mainCanvas.width, mainCanvas.height);
+    }
+
     // setup html
      const styleBody = 
         'margin:0;overflow:hidden;' + // fill the window
@@ -238,6 +242,7 @@
     const styleCanvas = 'position:absolute;' +             // position
         'top:50%;left:50%;transform:translate(-50%,-50%)'; // center
     (glCanvas||mainCanvas).style.cssText = mainCanvas.style.cssText = overlayCanvas.style.cssText = styleCanvas;
+    updateCanvas();
     
     // create promises for loading images
     const promises = imageSources.map((src, textureIndex)=>
@@ -434,9 +439,9 @@
 
     // big stack
     rect(50,20,10,-10,color(0,1));
-    rect(50,20,6,-10,color(0,2));
-    rect(50,20,3,-10,color(0,3));
-    rect(50,10,10,10);
+    rect(50,20,6.5,-10,color(0,2));
+    rect(50,20,3.5,-10,color(0,3));
+    rect(50,20,10,-10);
     circle(55,2,11.4,.5,PI-.5,color(3,3));
     circle(55,2,11.4,.5,PI/2,color(3,2),1);
     circle(55,2,11.4,.5,PI-.5);
@@ -455,7 +460,7 @@
 
     // engine outline
     circle(36,30,10,PI/2,PI*3/2);
-    circle(47,30,10,PI/2,PI*3/2);
+    circle(48,30,10,PI/2,PI*3/2);
     circle(60,30,10);
     line(36,20,60,20);
 
diff --git a/docs/engineAudio.js.html b/docs/engineAudio.js.html
index 9b733796..3826c424 100644
--- a/docs/engineAudio.js.html
+++ b/docs/engineAudio.js.html
@@ -14,7 +14,7 @@
 'use strict';
 
 /** 
- * Sound Object - Stores a zzfx sound for later use and can be played positionally
+ * Sound Object - Stores a sound for later use and can be played positionally
  * 
  * <a href=https://killedbyapixel.github.io/ZzFX/>Create sounds using the ZzFX Sound Designer.</a>
  * @example
@@ -29,7 +29,7 @@
     /** Create a sound object and cache the zzfx samples for later use
      *  @param {Array}  zzfxSound - Array of zzfx parameters, ex. [.5,.5]
      *  @param {Number} [range=soundDefaultRange] - World space max range of sound, will not play if camera is farther away
-     *  @param {Number} [taper=soundDefaultTaper] - At what percentage of range should it start tapering off
+     *  @param {Number} [taper=soundDefaultTaper] - At what percentage of range should it start tapering
      */
     constructor(zzfxSound, range=soundDefaultRange, taper=soundDefaultTaper)
     {
@@ -180,7 +180,7 @@
  *                 1, 0, 9, 1    // channel notes
  *             ], 
  *             [                 // channel 1
- *                 0, 1,         // instrument 1, right speaker
+ *                 0, 1,         // instrument 0, right speaker
  *                 0, 12, 17, -1 // channel notes
  *             ]
  *         ],
@@ -209,24 +209,24 @@
 
     /** Play the music
      *  @param {Number}  [volume=1] - How much to scale volume by
-     *  @param {Boolean} [loop=1] - True if the music should loop
+     *  @param {Boolean} [loop] - True if the music should loop
      *  @return {AudioBufferSourceNode} - The audio source node
      */
-    playMusic(volume, loop = false)
+    playMusic(volume, loop=false)
     { return super.play(undefined, volume, 1, 1, loop); }
 }
 
 /** Play an mp3, ogg, or wav audio from a local file or url
- *  @param {String}  url - Location of sound file to play
+ *  @param {String}  filename - Location of sound file to play
  *  @param {Number}  [volume] - How much to scale volume by
  *  @param {Boolean} [loop] - True if the music should loop
  *  @return {HTMLAudioElement} - The audio element for this sound
  *  @memberof Audio */
-function playAudioFile(url, volume=1, loop=false)
+function playAudioFile(filename, volume=1, loop=false)
 {
     if (!soundEnable) return;
 
-    const audio = new Audio(url);
+    const audio = new Audio(filename);
     audio.volume = soundVolume * volume;
     audio.loop = loop;
     audio.play();
@@ -278,6 +278,11 @@
  *  @memberof Audio */
 let audioContext = new AudioContext;
 
+/** Keep track if audio was suspended when last sound was played
+ *  @type {Boolean}
+ *  @memberof Audio */
+let audioSuspended = false;
+
 /** Play cached audio samples with given settings
  *  @param {Array}   sampleChannels - Array of arrays of samples to play (for stereo playback)
  *  @param {Number}  [volume] - How much to scale volume by
@@ -292,11 +297,15 @@
     if (!soundEnable) return;
 
     // prevent sounds from building up if they can't be played
-    if (audioContext.state != 'running')
+    const audioWasSuspended = audioSuspended;
+    if (audioSuspended = audioContext.state != 'running')
     {
         // fix stalled audio
         audioContext.resume();
-        return;
+
+        // prevent suspended sounds from building up
+        if (audioWasSuspended)
+            return;
     }
 
     // create buffer and source
diff --git a/docs/engineDebug.js.html b/docs/engineDebug.js.html
index 0827d561..10f551f5 100644
--- a/docs/engineDebug.js.html
+++ b/docs/engineDebug.js.html
@@ -54,7 +54,7 @@
 ///////////////////////////////////////////////////////////////////////////////
 // Debug helper functions
 
-/** Asserts if the experssion is false, does not do anything in release builds
+/** Asserts if the expression is false, does not do anything in release builds
  *  @param {Boolean} assert
  *  @param {Object} [output]
  *  @memberof Debug */
@@ -262,6 +262,10 @@
     {
         const saveContext = mainContext;
         mainContext = overlayContext;
+        
+        // draw red rectangle around screen
+        const cameraSize = getCameraSize();
+        debugRect(cameraPos, cameraSize.subtract(vec2(.1)), '#f008');
 
         // mouse pick
         let bestDistance = Infinity, bestObject;
diff --git a/docs/engineDraw.js.html b/docs/engineDraw.js.html
index 9d3d2b79..5e073355 100644
--- a/docs/engineDraw.js.html
+++ b/docs/engineDraw.js.html
@@ -87,13 +87,9 @@
     if (typeof pos === 'number')
     {
         const textureInfo = textureInfos[textureIndex];
-        if (textureInfo)
-        {
-            const cols = textureInfo.size.x / size.x |0;
-            pos = vec2((pos%cols)*size.x, (pos/cols|0)*size.y);
-        }
-        else
-            pos = vec2();
+        ASSERT(textureInfo, 'Texture not loaded');
+        const cols = textureInfo.size.x / size.x |0;
+        pos = vec2((pos%cols)*size.x, (pos/cols|0)*size.y);
     }
 
     // return a tile info object
@@ -120,13 +116,23 @@
         this.textureIndex = textureIndex;
     }
 
-    /** Returns an offset copy of this tile, useful for animation
+    /** Returns a copy of this tile offset by a vector
     *  @param {Vector2} offset - Offset to apply in pixels
     *  @return {TileInfo}
     */
     offset(offset)
     { return new TileInfo(this.pos.add(offset), this.size, this.textureIndex); }
 
+    /** Returns a copy of this tile offset by a number of animation frames
+    *  @param {Number} frame - Offset to apply in animation frames
+    *  @return {TileInfo}
+    */
+    frame(frame)
+    {
+        ASSERT(typeof frame == 'number');
+        return this.offset(vec2(frame*this.size.x, 0));
+    }
+
     /** Returns the texture info for this tile
     *  @return {TextureInfo}
     */
@@ -182,6 +188,11 @@
     );
 }
 
+/** Get the camera's visible area in world space
+ *  @return {Vector2}
+ *  @memberof Draw */
+function getCameraSize() { return mainCanvasSize.scale(1/cameraScale); }
+
 /** Draw textured tile centered in world space, with color applied if using WebGL
  *  @param {Vector2} pos                        - Center of the tile in world space
  *  @param {Vector2} [size=(1,1)]               - Size of the tile in world space
@@ -272,21 +283,6 @@
     drawTile(pos, size, undefined, color, angle, false, undefined, useWebGL, screenSpace, context); 
 }
 
-/** Draw colored polygon using passed in points
- *  @param {Array}   points - Array of Vector2 points
- *  @param {Color}   [color=(1,1,1,1)]
- *  @param {Boolean} [screenSpace=false]
- *  @param {CanvasRenderingContext2D} [context=mainContext]
- *  @memberof Draw */
-function drawPoly(points, color=new Color, screenSpace, context=mainContext)
-{
-    context.fillStyle = color.toString();
-    context.beginPath();
-    for (const point of screenSpace ? points : points.map(worldToScreen))
-        context.lineTo(point.x, point.y);
-    context.fill();
-}
-
 /** Draw colored line between two points
  *  @param {Vector2} posA
  *  @param {Vector2} posB
diff --git a/docs/engineInput.js.html b/docs/engineInput.js.html
index b306f2d7..cf78202b 100644
--- a/docs/engineInput.js.html
+++ b/docs/engineInput.js.html
@@ -213,9 +213,21 @@
 ///////////////////////////////////////////////////////////////////////////////
 // Gamepad input
 
+// gamepad internal variables
 const stickData = [];
+
+// gamepads are updated by engine every frame automatically
 function gamepadsUpdate()
 {
+    const applyDeadZones = (v)=>
+    {
+        const min=.3, max=.8;
+        const deadZone = (v)=> 
+            v >  min ?  percent( v, min, max) : 
+            v < -min ? -percent(-v, min, max) : 0;
+        return vec2(deadZone(v.x), deadZone(-v.y)).clampLength();
+    }
+
     // update touch gamepad if enabled
     if (touchGamepadEnable && isTouchDevice)
     {
@@ -227,7 +239,16 @@
         {
             // read virtual analog stick
             const sticks = stickData[0] || (stickData[0] = []);
-            sticks[0] = vec2(touchGamepadStick.x, -touchGamepadStick.y); // flip vertical
+            sticks[0] = vec2();
+            if (touchGamepadAnalog)
+                sticks[0] = applyDeadZones(touchGamepadStick);
+            else if (touchGamepadStick.lengthSquared() > .3)
+            {
+                // convert to 8 way dpad
+                sticks[0].x = Math.round(touchGamepadStick.x);
+                sticks[0].y = -Math.round(touchGamepadStick.y);
+                sticks[0] = sticks[0].clampLength();
+            }
 
             // read virtual gamepad buttons
             const data = inputData[1] || (inputData[1] = []);
@@ -239,7 +260,12 @@
         }
     }
 
-    if (!gamepadsEnable || !navigator || !navigator.getGamepads || !document.hasFocus() && !debug)
+    // return if gamepads are disabled or not supported
+    if (!gamepadsEnable || !navigator || !navigator.getGamepads)
+        return;
+
+    // only poll gamepads when focused or in debug mode
+    if (!debug && !document.hasFocus())
         return;
 
     // poll gamepads
@@ -253,14 +279,9 @@
 
         if (gamepad)
         {
-            // read clamp dead zone of analog sticks
-            const deadZone = .3, deadZoneMax = .8, applyDeadZone = (v)=> 
-                v >  deadZone ?  percent( v, deadZone, deadZoneMax) : 
-                v < -deadZone ? -percent(-v, deadZone, deadZoneMax) : 0;
-
             // read analog sticks
             for (let j = 0; j < gamepad.axes.length-1; j+=2)
-                sticks[j>>1] = vec2(applyDeadZone(gamepad.axes[j]), applyDeadZone(-gamepad.axes[j+1])).clampLength();
+                sticks[j>>1] = applyDeadZones(vec2(gamepad.axes[j],gamepad.axes[j+1]));
             
             // read buttons
             for (let j = gamepad.buttons.length; j--;)
@@ -359,7 +380,7 @@
     touchGamepadStick = vec2();
 
     const touchHandler = ontouchstart;
-    ontouchstart = ontouchmove = ontouchend = (e)=> 
+    ontouchstart = ontouchmove = ontouchend = (e)=>
     {
         // clear touch gamepad input
         touchGamepadStick = vec2();
@@ -389,14 +410,7 @@
             if (touchPos.distance(stickCenter) < touchGamepadSize)
             {
                 // virtual analog stick
-                if (touchGamepadAnalog)
-                    touchGamepadStick = touchPos.subtract(stickCenter).scale(2/touchGamepadSize).clampLength();
-                else
-                {
-                    // 8 way dpad
-                    const angle = touchPos.subtract(stickCenter).angle();
-                    touchGamepadStick.setAngle((angle * 4 / PI + 8.5 | 0) * PI / 4);
-                }
+                touchGamepadStick = touchPos.subtract(stickCenter).scale(2/touchGamepadSize).clampLength();
             }
             else if (touchPos.distance(buttonCenter) < touchGamepadSize)
             {
diff --git a/docs/engineMedals.js.html b/docs/engineMedals.js.html
index 20a9321e..753926c5 100644
--- a/docs/engineMedals.js.html
+++ b/docs/engineMedals.js.html
@@ -272,7 +272,7 @@
         }
 
         // build the input object
-        const input = 
+        const input =
         {
             'app_id':     this.app_id,
             'session_id': this.session_id,
diff --git a/docs/engineObject.js.html b/docs/engineObject.js.html
index 39ae6ce1..e8a3a246 100644
--- a/docs/engineObject.js.html
+++ b/docs/engineObject.js.html
@@ -12,7 +12,7 @@
  * - Automatically adds self to object list
  * - Will be updated and rendered each frame
  * - Renders as a sprite from a tilesheet by default
- * - Can have color and addtive color applied
+ * - Can have color and additive color applied
  * - 2D Physics and collision system
  * - Sorted by renderOrder
  * - Objects can have children attached
@@ -291,7 +291,7 @@
     }
     
     /** Destroy this object, destroy it's children, detach it's parent, and mark it for removal */
-    destroy()             
+    destroy()
     { 
         if (this.destroyed)
             return;
diff --git a/docs/engineParticles.js.html b/docs/engineParticles.js.html
index e57a3fbb..cc424413 100644
--- a/docs/engineParticles.js.html
+++ b/docs/engineParticles.js.html
@@ -204,16 +204,17 @@
         
         // build particle
         const particle = new Particle(pos, this.tileInfo, angle, colorStart, colorEnd, particleTime, sizeStart, sizeEnd, this.fadeRate, this.additive,  this.trailScale, this.localSpace && this, this.particleDestroyCallback);
-        particle.velocity     = vec2().setAngle(velocityAngle, speed);
-        particle.fadeRate     = this.fadeRate;
-        particle.damping      = this.damping;
-        particle.angleDamping = this.angleDamping;
-        particle.elasticity   = this.elasticity;
-        particle.friction     = this.friction;
-        particle.gravityScale = this.gravityScale;
-        particle.collideTiles = this.collideTiles;
-        particle.renderOrder  = this.renderOrder;
-        particle.mirror       = !!randInt(2);
+        particle.velocity      = vec2().setAngle(velocityAngle, speed);
+        particle.angleVelocity = angleSpeed;
+        particle.fadeRate      = this.fadeRate;
+        particle.damping       = this.damping;
+        particle.angleDamping  = this.angleDamping;
+        particle.elasticity    = this.elasticity;
+        particle.friction      = this.friction;
+        particle.gravityScale  = this.gravityScale;
+        particle.collideTiles  = this.collideTiles;
+        particle.renderOrder   = this.renderOrder;
+        particle.mirror        = !!randInt(2);
 
         // call particle create callaback
         this.particleCreateCallback && this.particleCreateCallback(particle);
diff --git a/docs/engineSettings.js.html b/docs/engineSettings.js.html
index 10cceb09..35513378 100644
--- a/docs/engineSettings.js.html
+++ b/docs/engineSettings.js.html
@@ -85,7 +85,7 @@
  *  @type {Number}
  *  @default
  *  @memberof Settings */
-let tileFixBleedScale = .3;
+let tileFixBleedScale = .1;
 
 ///////////////////////////////////////////////////////////////////////////////
 // Object settings
@@ -96,7 +96,7 @@
  *  @memberof Settings */
 let enablePhysicsSolver = true;
 
-/** Default object mass for collison calcuations (how heavy objects are)
+/** Default object mass for collision calcuations (how heavy objects are)
  *  @type {Number}
  *  @default
  *  @memberof Settings */
@@ -179,7 +179,7 @@
  *  @memberof Settings */
 let touchGamepadAnalog = true;
 
-/** Size of virutal gamepad for touch devices in pixels
+/** Size of virtual gamepad for touch devices in pixels
  *  @type {Number}
  *  @default
  *  @memberof Settings */
diff --git a/docs/engineTileLayer.js.html b/docs/engineTileLayer.js.html
index 0dc3d2eb..b06df0e4 100644
--- a/docs/engineTileLayer.js.html
+++ b/docs/engineTileLayer.js.html
@@ -3,7 +3,7 @@
     
On this page

engineTileLayer.js

/** 
  * LittleJS Tile Layer System
  * - Caches arrays of tiles to off screen canvas for fast rendering
- * - Unlimted numbers of layers, allocates canvases as needed
+ * - Unlimited numbers of layers, allocates canvases as needed
  * - Interfaces with EngineObject for collision
  * - Collision layer is separate from visible layers
  * - It is recommended to have a visible layer that matches the collision
@@ -55,7 +55,7 @@
 
 /** Check if collision with another object should occur
  *  @param {Vector2}      pos
- *  @param {Vector2}      [size=(1,1)]
+ *  @param {Vector2}      [size=(0,0)]
  *  @param {EngineObject} [object]
  *  @return {Boolean}
  *  @memberof TileCollision */
diff --git a/docs/engineUtilities.js.html b/docs/engineUtilities.js.html
index 74218da2..3f1c2363 100644
--- a/docs/engineUtilities.js.html
+++ b/docs/engineUtilities.js.html
@@ -38,7 +38,7 @@
  *  @memberof Utilities */
 function max(valueA, valueB) { return Math.max(valueA, valueB); }
 
-/** Returns the sign of value passed in (also returns 1 if 0)
+/** Returns the sign of value passed in
  *  @param {Number} value
  *  @return {Number}
  *  @memberof Utilities */
@@ -85,7 +85,7 @@
 function distanceWrap(valueA, valueB, wrapSize=1)
 { const d = (valueA - valueB) % wrapSize; return d*2 % wrapSize - d; }
 
-/** Linearly interpolates between values passed in with wrappping
+/** Linearly interpolates between values passed in with wrapping
  *  @param {Number} percent
  *  @param {Number} valueA
  *  @param {Number} valueB
@@ -102,7 +102,7 @@
  *  @memberof Utilities */
 function distanceAngle(angleA, angleB) { return distanceWrap(angleA, angleB, 2*PI); }
 
-/** Linearly interpolates between the angles passed in with wrappping
+/** Linearly interpolates between the angles passed in with wrapping
  *  @param {Number} percent
  *  @param {Number} angleA
  *  @param {Number} angleB
@@ -632,7 +632,7 @@
 
     /** Returns this color expressed in hsla format
      * @return {Array} */
-    getHSLA()
+    HSLA()
     {
         const r = clamp(this.r);
         const g = clamp(this.g);
diff --git a/docs/engineWebGL.js.html b/docs/engineWebGL.js.html
index f340ebf0..299d3e5b 100644
--- a/docs/engineWebGL.js.html
+++ b/docs/engineWebGL.js.html
@@ -195,8 +195,6 @@
     const filter = canvasPixelated ? gl_NEAREST : gl_LINEAR;
     glContext.texParameteri(gl_TEXTURE_2D, gl_TEXTURE_MIN_FILTER, filter);
     glContext.texParameteri(gl_TEXTURE_2D, gl_TEXTURE_MAG_FILTER, filter);
-    glContext.texParameteri(gl_TEXTURE_2D, gl_TEXTURE_WRAP_S, gl_CLAMP_TO_EDGE);
-    glContext.texParameteri(gl_TEXTURE_2D, gl_TEXTURE_WRAP_T, gl_CLAMP_TO_EDGE);
 
     return texture;
 }
@@ -274,7 +272,7 @@
 ///////////////////////////////////////////////////////////////////////////////
 // post processing - can be enabled to pass other canvases through a final shader
 
-let glPostShader, glPostArrayBuffer, glPostTexture, glPostIncludeOverlay;
+let glPostShader, glPostTexture, glPostIncludeOverlay;
 
 /** Set up a post processing shader
  *  @param {String} shaderCode
@@ -310,7 +308,6 @@
     );
 
     // create buffer and texture
-    glPostArrayBuffer = glContext.createBuffer();
     glPostTexture = glCreateTexture(undefined);
     glPostIncludeOverlay = includeOverlay;
 
@@ -382,10 +379,7 @@
 gl_LINEAR = 9729,
 gl_TEXTURE_MAG_FILTER = 10240,
 gl_TEXTURE_MIN_FILTER = 10241,
-gl_TEXTURE_WRAP_S = 10242,
-gl_TEXTURE_WRAP_T = 10243,
 gl_COLOR_BUFFER_BIT = 16384,
-gl_CLAMP_TO_EDGE = 33071,
 gl_TEXTURE0 = 33984,
 gl_ARRAY_BUFFER = 34962,
 gl_STATIC_DRAW = 35044,
diff --git a/docs/examples/logo.png b/docs/examples/logo.png
index 3db7bca75890782aa2ac599f6d0a69e79d9007e3..23a9938ca8ff96c85fb49141dab9afe02ab96d83 100644
GIT binary patch
literal 15636
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

diff --git a/docs/examples/screenshot.jpg b/docs/examples/screenshot.jpg
index b9c99556301992e42a40bf6d4b0e80ccf2b350be..ac94e90d46f83f944d102b28c56b84c625dbf78c 100644
GIT binary patch
literal 151932
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	rGKO&JiJIw`BzMGaFKF+m=z;XrH{;
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%0Dl6
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

literal 158756
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
z
zDROnRZMDbD&eXU)|QaY-{-ruf7ixA>p9AJ%Ck_MR+g{qtzg(U-a7TUQLPG
zl8Wu)IL{RB8-LEY>YWBxVL#sHm>Ih%`LE;82RZ8Dr;9I!U#oYF5Uc-p*GMMt!T+>F
z3>;Br+s)JUvBojNAIVU_G%0IddYVKsVjsedZy4EUWK$VXjcr}z3>b;6+Z)k#HLEfp
z#I$hoEBq)i)tKdm`wQ@3^?aWhSpFjcrkYKMNe!T9`P^*{OQ?&yH(l2O{_*y9>&SEH@&^@v*ZEHsMN)n3ee7d}T$t
zTH0F;+($S;x;3>6*5o7BX^otlJT&^Q^wD$@XEDRcjdsaKb{6n4U;Qas>e@$D9I-L@
zDib|Bez~=~qykEkRjdM!W0g1$ke-rCIF2f791=YA2@I|v{RFv9>!Y|Y4Jz96ZA>Uu
zG|~htTj^iSG^}Tq=6|fqs7S`o%qm^CvFPL0q8vYAeSF{x9Y?any98+pZ<33WLty{>0R>gD)t1aMV{sP2EHB`Lci_79U
z-FCCAyWKd&M$cUkT|Tu8a(G5vJVq%aQ`h?ElbeqVjO&9p1!f)!KW7wu#5?`Y&6y}=
zu86lji84ml-g_gZlBWB5V_8x^*b|gUSjFlNng|2l({ZKX2!7h{o6xsRdp@k0-aGMa?Zuay1Z*R1s5jn
zVm#F8r^}_3)y!b3)RFkNR!iA`7+p<0px%OCujwc-5YfgBJaAfAbe)I8-X94BSo%D~e<5-qC%9_;X2
zvOok~D*8evFMHbUV%W2ZxC8Y!uxU$35M?v1Ztu)ez7~pE>_Alp?e|}o|KzW9a#FggtO_J<
z-1M@2K@Wx*uJnTMpw9h*{wE3l}
zFY$egQs56ydfXUfwWM@1L<+}KdftFXnJ?uk3ty%j^4MCbDwkk$nVy)Qs25_8Gm2a^
zn;os)Bk@j=)--|)zR#U4kI!cDk9jeGH@c$1-R5;Ct*wpB>-KP}#c|WjwRc$dKWN@&
z?cfc#j2Mh}+!6AbU1t1nNo@Hi;w{>4^Te2tP(>Qhgh(iOVB#k#c9QebMYlB~nv64-H@0m;mo+WInCnh=
ze3P0Xx*~2)Jd04=UVeH<)aE~4Osk-lsRu|lzgR12mO8_({rDz3nVQ8JZ
zyc3*e$(0GeR_V2kL1kAY(ivC3pWtZ!D69z;{C*8^yZ`kUP?dKYjE2^6AZM?5WiS^&
z=;!{qehxYd&H05l6N}n&Q3%nb%z?4Ih;^#6Wjob|><)5S6gFL~Q#j7LK5f{vc*-5>
znJ|@){d8ctgY%|qai$3;i#4P~FD}p2XgtlHTl<}Y>7-w@k!+KH?3DY^viyun*LkxvO@1g9}c*DISwq?w@_B5qRI~O2}j1>o2ff
zp)lC45E23&9vT)B0_tBxA(-SJ9SRN1?+->4Vt^5a{{RZrTtjv#*i}qYug!|Zp+lP}
zIf8H82Iu}o6hcA#izpo2To*7$OqoYP=f@u0*zKg7vHwYM>`%U>YK*AoAo(2P5e(+^T<$
zWj0C>kzuOYTm3QXm6?z%96PQ^s)%Q8)-Aeyc#x-$aM>$VMc2?YOp&LQF4aIrggmqF
zi|(Hv4vwu6p!q5cXM2O+a4s|ab*d{l*ITz?VUK#qurr2RdO^u{v~+0&=}U~F^PWI?
z%g|HeiJ}_~p(T}-{oAqEna?oQ>}uhbo9Q5AqmKuG{d4IC%E{d)-5z|2AR4Sj@dzpKf&o_=*OV^
z%|g93w=y_b1zpjl3J2w+i~5h$%q{Uu_*VrJ1W3v$h!Hf3+#62uQiN#O?a%bwUlld}
zG3*`@m6<{#g2r4ZlY$t57!hTVQa5hkE9U)XN&E9Xy~O=dD;AFg*oXKXzgzLR=K6ud
zCy87czhQCbt77zV-KNZ^i`l3et8Q1#1U%nRt8UGsn(*aV9GfX0Et{bw4kO+gT*_59
z0j`MRL!u;045j_GM7Z+0IryJ+!c14W0C?`W?$(3^l|9!xHGdgTTeib>728;z(A;5i
z07{o9PEtCC{|r7EeccH44D7+u2VHITQ+XUE5b87BkYP-_1V@?E#I@PnU$d*IXBH)@GZ
zB5XTlhR@iHCrJmYo}O!QeJmDx@LOfyl75P31|4a14Uqn<8n+@
zE|*m0%6vbYKVu=R?_qA@Ml~~@X$S&+V7^mnXPoJ0u{>ue}
zbvDl&nr0p^wfK6!F8XK?pK!@*Xcaw?Dug5&W)k$iaca1f_LK@;iDw&i{6-<=QH#6V
z?9})a`qsfbPP7a<7P#B5Gm1L3jg;g_!Y>B4v^DndeJ>cl#D5gkJhsr_Erzz!R`0)G
zLJ63uQG-|IrU^W*^cSK4KTcID#T410)Ln}>sSQIo4>IgUm4}AXf;%BXCVSKAR~;bC`3Iq%D}{W8u@Tvonte0ui~xYDe`MJt0C(-;jkfyLubf}ONuo^d!8SSnYxyT
zXg(<3oswP9s)*&>o18t4hsJvrBMacl=NMKPv@g2aULoKp5a~L|%6Ii?mLgL}h}9!di6cg!FhD0_v%DuZ@$I
znFfNrcs=Q1Xm@x5z_{zbp^5nJn_n}fqONH
zlOd<#1CrIPy_D0=@Q1Zc@I*6wg?4yTzTHzE*kLA{ZHo&1qiAE6{r3w%?P_WVWPILl
z>{wYCHDd51P%uZK@Fg-(vnG6sZxtQ&Kr*W$18yRjnJe)hGLvp>k>eq!O7Dqfd%wAf
zr7QjkM%I_wMvqUc(XDtA8yW9~ye)|xhaMw94Ob@6nyJ!Im%kXIlMg8C1Az@@Ch9fm
z`XALYz6lo>z?D9cXf&?yIBGF)U!clq+Y`z_a8o<@;&-Fu4)e|T-%E-k;8SoGUNwhP
zkC|*XBVc3Sj@EWT&6{z`x%JwMDeegr!MDV}rST@7HUPqGx-@+x@pkgaSEhW(1(D_l
zLcpS#D#?-ipyt*6|ETl^YvnZLVuFWrEW=O3CRLEZ^f!lO2N-l#@lqOi2f{XUXtOG5$`d@2wC&37xjro`cwNwU0GYd#F;tV&>blBz__3%N
z7a{I9WSr4Nn!FVhed^1C?IIIjhcW_jYd57bhY_r`cXi%^SLVyMV@UtV!nfLbjwX}9
zzOGA_Pk#XeZtRj4(c|c;orJ`@=&6*SrN2aDFfVV5kMTkssPGlKiynncNfVH*A3t)H
zxx+fHlMq`)_zkZl`o2+fP3=3(Mz)sV*Jc-6g9qR6cMxErZBZ
zlbAb20-5v`m76wOHO}sah+TQ!q{l~aB`Qk(lG$rpRI}CNEAT?JqTF+&CRJmM2V_58%=+P7MJiLFO%fyXjVHMu}74&YDEh5
z^*gVQ7Q{dI0BL^Dzkv3?0RQr#l5+27fe$It+Y_r{H!K%~Lub0iVv6jq^|yy^@YQ6E
zf@zWVxIsVa(GCJ9O@vKlNkrW&(R=D2xP*5Lf|>^
zm^y#!wtJRDsl^MW!$(+=1XhkRpmUYs#T~uZC_wA0KFJiF04Xj92Tpk|t@Y5xfVbkD
zZ#3!slG-L*zB|EnMb}B{mYY^L0?FB-=20GY)ITX7iHqP7m2)n+ubQE$hd^2t08^b`
z9<17ol1tTaq_%zbnEvG@2Q^(2&TG@1{Z(X%?);?aqSzKTKFV|-VisF8ZkW7KL;^6#
z@QYd+q44Ano0~Sf3p2y2?=|54y!}oLZ?I?+Mn`AnzvYPxjQEU|tR^N4y@?0L^i`fp
z<9cnC3^gU8Ob80lo^nd+dKYH~p-kw$3D8+zUzB|tYH}}FmR>P5LQs?iaZ!g8aPd@N
z?d7S*aw}Lh!sD%rYS@9L!Tcjsk!*D3j~dec<`<46PqJyDg)rVfFYqtQ(YNsZG%i9Z
z@wnkNn1$+3BtI6kZx6T$sar^5w#;l|YWefush!a`;i2v!<5m9&kB9>%Y*&mv=%zC1
zrupXzlz(=^G_>|KZTD&$uzCo(P?auPv+_3}OHAhR8jvbWHhMZ?PIx=
zR6+c-#finOX5jDsJK)!;e{RG|A{@?l%6t`h^V7D+T)RZABCXWr<>f_EVTX?EX|Q6f
z7MQSNoTzcgBV1sIr*B=H?jed-Y$EkKA4sdIOQJ=CCN{#m_V1&>KG5}GquYzbk
z(Pk?!^yoBHH0Oh$w<7p@TnVnK67G*Q`7wl|pB0O*z4wCMnbg)8
zJFK_cJR$QM3_CGoSGkz?c(k;Pv?dKD@hdRU;uOy7+=MK*((T$G>&>~tTS~xrox49L
zHI9Zq|C87f;R^#CK_Jepj=*0)%?b-Rm8j4L<2lE7Y7wfww}386mF7PaphnshBFrMh
zr7QXV(>yW2qURy+GC}$9J2W&TBq9PHBkevnqzM{k;A)dk?)ZW~WoAVXy;%^r6mSyQ
z6dTFGh$Azz+jEK3*4c_X9-}b)9A<%`3k$2U@Oq(`>8jZq5g}Z|k&^>0YoTR&e$xiSui@EoYwSF%0EM&q5N;
zA2mV!%`g2B(O2MQq~PXC!OS}$aSA>XRd!&<8Y!Hg4wem00v*lMCS07HAa8DCe$Yqx
z(=IXv!{9a-<*>J!pp55#ynxI#>K4`NACEF27vD)Hvzi*=Ray~d#9-XGsNXwykXwQr)~}VxY;uuU)au?+YFga%
zpWAFOM1$|5Bt?U36k}Og!ROOr0NnG09$66^nKVEbfLSmew%br$^{491H3yp={u-?6
zV$mMKWIaVIo`ib;{z5Gd|Dn&DS}(j_MUkUic+?o2ilICpnm}4D0zRg~57^k?7=+VwGqIij8@^=(%V`CSVwTemz9{S9Y0BK$n$QpPqp^iJoj_2Ixhj1s
zIQx%xy2dnEGEEQulg?~#SHx)y0uyO_ejs6*POw+r|8kbE=Kc9fb|WRa_(Xc0
zAN1d_|CQ@7=#`50RBW@a*GL+dAL-*c4+*go16r;vRAjy;w>kI
z)l$Ync2%&YXdznDG;Gp-8Q*O6l_t1nI_+s;9G0hUr`$UIY*uPs)lTb|wkv!6TD1fG
zz=|7sG_axu5&{w$4g&1{!vqB;f)Z0TMRP5>CJRXct8H#}Sw&U;RnkBJAVko>R(JSC
z_wNHCG7F(>#%iA)O=0mAtRYe>rSInyO@4>ZaBiN`Qwg3^3mT_>0hXys6+p(fsiM^qPj
zm5n$?$*lk6hxCL_K$EC7d!!Nooikvo&M*z?srI6e1YFm}Z%Jsb8Q90RWzZv`dxq)1
z7unjgYe{z}5)q4H%xJ5-S?)03`wc;3B(!X#C2yNetzc~_nd^n=!qrsL|8!Sl#4>S>
zL7Yp%%D}Jcgx=GrNw~Gnr;L>&^0uwJ({Jdqt*n6Hp8c849iNHLK_javU|yxD>B*hq
zwP>+yuHPKP21T3-fAAaw*jkOSri5We1p!O~l(*k7W(o=*L1MVH6l84~*fc@^scH^UvUMqqU
z4Qdj25^295cBQ_eXKaK{-i=VS;$az9L@IBOz0w80Ku9za+xl1Bguwttpirm+~fT-HPfTP~#55x$=JJBt6;2>8(v{jMk4A@{;V(|Q!3mP@+
z881UFs+a7ONmiNho@R2pN8fQ*wkC3xjL-wpeLM_Db+Xqh1q!@Tc_9kpbl6*PxeJ_(
zaOxy|cL&#NM*pIluYHZ25{{db)dpQn{|M6WEefWy2gB(ZO-N_DzAq>3FxCuY?pmEC
zE%NN~rYKuRS4dl*n{f14t?3Y#W77+<-83kA?gBqB<#x4c@FCAZFqEy&{5v3z&s}}$
z&}A;@ggvZ$bhTy)!5XGHx?Iq-o^Z88)4gnqLlBuy@Dd@*fjEM;UudsKvKAXcAQaP5
zyY@Y`p>S9tcbH?wy5&Z2F6h|q7x*+IT<(X<*L1Y(6Sj)<2*6X`1a~pgle3wHjGOA>
zNHrbfx{vbAA%=b98Y^&I7a^w=1wvF1Rk-uf-myeIfvKRQ^P~gv>H=RWSeRakw_F6m
zBMXyxX1_^17J{*7eynw9T5VjUr9w=_E7n#S{Gfqze_SvAtANmmbmqurB3@BYNx&Q{
zpe(v6wn(PG4C{CwaVlPvw(j{0)ke?z7k;wYT>Wtwlx=L(6~Jh)Q
z^grrR7>>_1;XuuARp%109X_An+H)NT4B|_MLl(Vh+1ohD25*KwMLRJidLO(ki8D3k
zgaJ2QIvjk+Yv*7r3!@|HaEFC@Uy9fo3?X;2!&=LH8OEnFSUA5yVX`??4Twj^71fN9
zrlT#AzBEPA+gmY0>ugBE>N$nD7r~f1vl^%6(i@2h3R%Bl&`DlULNlFs319_lLDVdX
zsF>rSsDY=Y&}%%{zU6US3kju$kyQ^sL2yh2JU|~fpZI;3_CnHDmd%pNaRB!@t@`@T
zV7=?5z8_Ev86RKeU?gzI&=};9RllA?)OC1xUn!yA4J=RSbT66#yIv%_Xk`eNODmL@
zNkQ=m>LbQ`@T?v}d%7OM%gDZBnx=@qC1XZd1s)$};zXl6^RwDN*bUh~b}$N|wP4U}
zn=_;$Lm73hM0x8FGKsBXWXbJe<)g_q0RxAe4!41_h&O#6h=y<_P?JEpl$uaVv@;lN
zEWK?-E7f(>~s`VhoCgJ!n=?OQkH`?$_UyoK=`sjo)Z9
zf#r3nS~1^PZiU6Fgp=t+b)%r|?EtaHRXK)`)w|#|=)srmV6_2hq`M^N)6GK=x{TK1
z@eNzXZ$l345i8}Y>tC1e9L90=x_<%CP6tpy|=^SoaDNBCv+
z^R)u#pECC>^f;@0%qOYo?Bhym*3XCWN-`7_KxtFad+RB1g#y^@{73pb=$(h?!(GV^
zqCus{F?SCs(FgcbY`sDJqXA$jWn1
zA2Z@dm|sR<@;nxwjniq1q2_6ve23dL;E0B+i!+=o%e*{${6HEW=Y;`gC<{Uif7V>H
zxSSsicWAp0N|qoRT6t%exFpU-$rfXuKR4Yb?E9W0S)H6mswjZkngbi49aYA1u!^~M
zylaYyDehiGb{=|>Ex)6!^_rX{;UNj+5m7J`o=UiTHeZKRro+6X}@;kh7%#I&doMZNY*UG%Zy5=j6ID{Hn
z3L0R65)?c$RvDUd)#+A>6%xLYN!B|wY8FhBVOn0&V9aQm3a~_yEmVL)7)$QGL6z$U$ZkT1B-GczR6$*T}XD75E%tnuFp^hG@NKP2e2K(;KT!sJ4$N8
z5pO9tN%dbM#4|=RUSurUQwJZNAbC6MIv)~p#-)AgYv8ml0vf-t_y&K4UQLDNcnKOh
z_ct~}4<3o_J1td^#(gv8l3L!QN62LVQTo&vMHUb5@h#k_`2!Wne=#uSYQ#}=JhsYu
z;=Ck@SGUKp4Bk>qTQ#-~y{x>90O9Vlo;#_p>^9Xon}7p(1J*{(5cK`2y5&2h6QY4w
zmo7opTjRyn1j8v}d{JziGh+&u|6~ciX~ILm+5$goe!X3&C5%dU*+jehTQK<
zfhd?2p|9z2o(5ai4$D&gKO>;M!-LYu^j-~>;xrkk-zi6v=WC{g
zgkI-(^7U291DjMXg53}0HnyQYbvUA5-pN1)Y5B)T(v$BtG|PHCekw9+S&O`(G8#$!
z;f;7UKK&cROOfT=Vn|W!4Wp#au3AoB7&w(5dbrmi!HvUJ2xAat(NYsdL&pFQ7#u{I
zed_lCTSN+HjVqy^vd0@iNB(~Ih&Qgeup*RnWL>4ad5mh-dV%YN3^gMY-atUloavN_
z?Fdt`kyCK$Pf!FVB}L4Jq=s3eVQ&{UU2~(2C~L3ypmP=RR(->_RkPh%j2q
zmJ*3o1dQsb);ktbi=log)4GMto{aZAyem^Ws0C99dwU{dT~_E2>u0QVCz>O4U=KFN
zQjQLlwjT+5mJXbAs9&xwx@svtzH0{V_9g5qg%#Y4g`ul>3{A#p)*5KY&9~X`u@6kv
zAoz7BjMYKCn+CW-Z_}y_0{tMDlHK0*)XqOu^0wMlOn!~R;0@=f!M=~s8|CoK5>~}_
zX}fm6&(KDB`8`d+y|aU=C??fCrR9I7iL6O55dI=vO)Fh9(x)^_yZgKUKBK?a=6H^5
zMD1};*OB|6{+9a}{LsTC)6p_w(k(Z-``BbD{XSNx_8~2Txvj!o2f_`sPBX!gkWxz_
zerMTzqVr(DuFSQDHEc`8gi1ei6%>C%MQItkidX&c4?V5)`dd6A2*tan;BzQy^IpwL
zsD^rx>v!i+5vE2IW+@6cI_!{sG{s&ZLHh~7i|h@-kSxqvi$5E>30kmUd)8bF3maj8
z;a4=aeeJBFCu%r!dahToU@b${K)-<$CFH=Jim}8#)n$I>LgoqmvgRi!Gx==n$sU+{
z)F@VJt`zh|P3>xqet}`A7VUnt69B|DBFzp@1p+z|Manj`c=9Cb2#7fZ&g>K6zOkDf
ze^u3OGmZ2o6<25^Sh0Qp99&e*UqI-XC2|-v5dt?AtV=V-5K)E>Wh}uMk2`jQWg!9<
z7Ryx0IgITY3Rp8#6B+P2YWA2YRNU&Tz`RR{TF{Q64M*@!nPO68;Buqd8)}g|srdiU
z^cGNYG)>#^;%*5RTmo5Sad&qJ?(XjHPH+fLfZ(>cySux)ySwG*exL8}o-@1C-P33G
zY;{d_$yJ4my@ppS)7zGx{LXe)YCOfhhq3diTz|gIM18H)ekbd9s|(vQ*RVPmV6Cf6
za4uoZ(Ul!;HM48#qCCxA+IrlzonFnhlzR_+NcZMbgWecMT?Qk4>^j$bu4
zwr!&Wk<^!L9U!R24$0vOcuM}?Zs|&FyMd~|3q}{hu!a*BzkXIw^<4mV9?jpe!T(xT
zx2&&XCJ17PtKl@emYMr@2W95O8O}$%r%YlT?BGF5U)-*AI2b0gcS35)QehrvAilQOFlitS1Ry4Z4olQ>VbQD
zBg>}Y^8+KT3V0m|9`)yycQG51_VLSULcGfePEqQR*{P4hsB4;$&dsr$jRhB7
zqJa!6V=FVV>++^|7rqvs`kf)EjNkh$rBi7flpkYBe|egGr3I@nhP|iJmFe2)R%89H
zmFu|up0tu4=-oWJce35ca{qeEtUT=(%bDybC`BX{a9iRWuK7~1QK3!uyZx;8w8W(`
zBwEK_j4TKT$-!m?53S{;#~j)))(BmB0&-?a`TUFOpCTMvH~LddyuTdK0~}l&Jo`{J
zbc_5R5e{B?@1mGXHE>F;c?VbjXO4JGv720
zP)kaU>B!DKrT6|ykSUE-YWowlvQBv+#`FAH5O
z=fe_FwNPV6Ygi!n%6vf!^Qpm4WA7QVALh5{XnouCdBS!c#6JR$*`D1
z=K!BJTQp_r6BSH1&OkOG*5mK*PMDj2DQ4SM90)PV7{NB2i}~{pP%Q=D9G0al`zu%e
z-1ft;!X#}@ncMi)iE-U^0eRChp(h#XHGBYs}viiF@~`-}6)IrsL~W$2krxm&_#Sn=mXi#Y_N
z!sh{0ZE=P@8gQwTQQP-LCekmLBqc9mSwiM)F=IT@>-ikpCzjsN*j@Wm`~Kbw3~&NY
zy2e`OnoJ9v$s9U`8zydpm?QEXgt#%tiq&CCoGUs9lauE1O0MfEx(*O@mAIXKqt-O;
z;SF|C2V6P^NtNnd;uUA!^=N8+lP0CYn(Mm@Tqrd0toFR)^ROO0+&CNybgEi{<3|`G
z?UUBTyrj;Zo}tp%f#CH~kQS)@T^~kjmi5!=OeVv7E4qrL5~s@H>$INV>IYF{f6oCP
zBlpCe2o!Y_q!IzR8cxpr5^0MXv$W!Zc?)u?AldrrV&lF==*PAIE?(K=HeO^pW_bgF
zjuYqUXe->1t@gaXJKZI}AAnA%-ifv~AFsWe=qIw6WS%-fouEG>MSjn$k>*&LXka`-
zDju078QZxMz6WYh`W0bH;2)a9eZaecc^mvjs8@GLtF27wZS|xg(&b;#C)A$NwR%!9
z3=Y#8Qa^DUCq1+zj%iQv#_h-d-c^N`9g3P9km-iGu3dTR=00&36Hgx^)*ue%m(&^g
zb(hM-CdW234{|9ccFkU4cWU-jX^cYB@eMg!O{H6V-FJ5rZAFO`{qi^!&V-F%;w}66
z?!`2(*`Jf5s`^2W?@xEmR|f4OF8bx!!#_32X}>R~W-k6%Pt^c)=0w>=3=0>7!A>PWkQ-zL>RJ&~R;9;zNPj7-eK2@S1
zDsNT*FgM!M^Ee^eu_Hc5vN9=_VAwq)&p~fLNNb%0=!|=hhs08*^
z3EAo*VOOkn3H*jAM^vq1h94yVo6_ZJzAn#;>7Xs``lZK$tE%JX;%H?yOzQHF7)Bb8
z9ua~S9imo7(_Iq;Vj{{+X6fMtZ)(RqMoa(?3sJ_rgX4IYEChX?z@)jgdw(AKcUeS%
zeOW896^p2Imu&Iqa~_pnEpwr+)MD4kMm02K<-OrpTT^D+065YFW@TgjlVi24q(Id=
zgRbF-9)^Zu!PxxvYV9Ns3B+Z?V|u<%{sga%!vXw(5(!l@dy^F9)Nc!76_#7;9{Qu5
zllRT#C6HAc{+mO{ipFp4`-72nc*AvF{r)l-$CLJgW&+mH=kd%oc#qi4@XzODJDCWl
z1{KWD>s_EMvN^6dZF2fBi{h_$Hafsg);DRQ9B`U@%&`WxW;@-T0{F!?S^_sjK{Uh~
z(XrK6#uvG%h3Tl38j7g~;>r%FnuL^psLY&2D+suD
zXrVtG)K%X`Su>HL>W~E_YJlCICzNGZl?X~G-4fhysJE3Zm-MYZ(RLh&F0o>do#z~A
zRkhI_;S~aBqKamK^mKE+^>jc6$CRg}B{?f%&f#5CIyiZ`H>UFdqW~y|9rLD>%L6e=
z;FfU9!><9P@?aaA7=iJq2^vufgef@2)h||i-6-qPnk}X&O<3YqkPPjV*P;S2*${0R
z?-bXjUOiD%UIkskF^O5Vp3nri@3Q;;1%)eMigA(#tbYKAQ@?{Ohz=AUK}B+mkO|MrJXK@W+H~_db2qA1$zO$@^feiS)opq_+ZNjuy2#k4n`kBlv$Y8tG
zA0`nBEk4SY8pIqR(RBR-J+s(HzvLUcUJcQ{!_kj<=yaB^VUWf2umxw)pPB#6$ty%G
z{#vA}mGxnEH1O42(uCYx{^9*%e68m`XG1$b*tn7ilLQkqQYFE*OZB`~+Rdf%UQ1i1
z3771>V5M~GiT=*Qvt9{N3ARy{JZY{
zWsnEE$?iS$dnII$>*f!0-tft{PsXF#g2SLlu8%hk61@TAnJCOz8&=H+9viY#yW3Mn
z*v4}?xxQd^+dB#M+yqd6L!{5#v{oAnEh}9t*M<@k-U900GrWpI8_r)B_|xXwnR6y)
zQ5CjfvP+fqQ6H30yKq1m{a`y9ySef@)
zmfG;(NT61;^oKhf=k~@@WhL^n?@Y@?U@{~Qvc(%e&RZKgT-B3G9*9g(wm`yH
z*lvn(8;DFRrg1Ix9#@gUh6!e0^hm!(VJQSwq(dN1Tr(aN1C-X2p}1qAuMsN-gV{b=
zl3{u8FNkdqy|Q76X#WKZOB>$I&O2(?s-^xo3;i*zhyjK|g-BuzEyHH&nt1u&<5Rl-
z3FsKqy<;Zf*wz~T&35_SL(dTZt_4_g9s>QKE&I=m%8C(-!hhAX#IDjh
z+pIw@R;EUV1iZ|2Yt74gOGN@e1Hs1B6}7DDblY*~s3|2(3ym<`{50+9%%{s8xPn_UC;mBQ7h%jzk|e^Ke5%(l|dx$l9@{`?e}EwFND5sc~H5
zSgmJ^iT(%dyeWZBw-jYup80%WvML?dQHfqRzUb|%Pi`9o=xlaxnDjnCm`9;F-M7a<
z@6LF+&{S30tjnFCIlNzM$u9c+v5#tlf6{mgz13J&|9puQRlIfV;QoC474CbEJXx}6
zByMVE#)m=Vae4#N@Kn)zkczBJ}lgj&`|^)ewAQBf}bC5)P313%$+
zcbC~HR9(%lr+!ESN1j
z?fxKdovGZ{X&8eXHOXgw$;hIIvhgh&E4(I?z7=YS1uDTyqGSAS0d%C5b5w(;agwBf
zl~b!jEdc_P&9`^6H@w_yqaPVTQ>^Ipl(qCE^KgfKN0PE;&k*wKJb9dvsA9KFVCCXJ
zr~61nCRPdipm~+Z`d67H@&}(C6epA9v@t;&Gk*S(eI&Xt*jPDIBYcZNjFvhjb!Nl~
zIhvyU=_X2@!;ajBV;v2<9o_mMDNdtBlWy(JM5b_AB&ZqlPXypML5}2p`W;BLR=*OH
z)`GpT@-3Ch8yvY7D|>nFt;!ony`ith0d%
z4mUl4v
zmo!%k^F99?`8L8r#a=$$IJyBs%ga$BC#md1a$Fa)XhI5#W%U8yY3zE?q#j7vi+b$w
zu1|69k)T_X0!jIAaYkhOpSwg$)K5bag;iFF!!b%4`c3X`DQP8(+W13~&a&pykv=-%
z#5&3=jZpA?^}u)N>9%P56BXo7opA~YjvvHxF$!Ko1ye;aQ;6o<4kYd^I$bOWOhm4h
zKYjDhaM#$cVZU`It}R@iUfxJa(xb{2_W()jarta@&LF*vPBECWZ&A<$7j)@ou+vl(
zHz_$t*i%kuN|rrXj_%WR@L}9Ju$A@wcX3>XgN*elPS_xFFVq$8=>%d+jMTer_hC{pXqb@7wPlW&sxCGmhugeWmGE10FS%H
zPbjR*<$d4?u*3T;*B;WCu~Jga!u3k+1S&b>lrN4kk3Icy!@y=zig+)Z4lG`@@+pz<
z$05;EwY*#d6LIYwp8O-h2Vj2ltu64dAFs$0jRawfm|NQ%u3MW9uM&;(3#>>drJ27huzHYiE5YT
zlZi4$c4l)(4=7;{Xq)1dG2km5R;$TP#D^>&OlcclrQ*5iYK^tcS;r>S5)fd
z10X9$pJC)zwZq^>tlATZ_vU|}W@W|EApJy@6rAo^;5er$Q_A#&$EynyS
z5w=e)WtWso%W5S5`f{)vu25x
z9d)LQmTuHWKB}B-EKVdtB2`|MUF&@qE^Il&;rSy?MtNO_p+tS;(TXTexz4>m`n@Aq
zdmbViQ0kEXDoBf7?Y2>R86H0dXl^aw)A5DEr%+(Z^&Uc`7n*4(w8z5T!(&V;&+lU;
z6_?+>LbT_OE^(Xu`1zk1kDF|O`Bh*MWZX5};zrZ7VdJ1Up^XP`4fN2i-hk*ab*P?B
zC2{4M>(PgIiEdrCpCig1pbier#92HC)GKbPlZKdK{1kEFz^pfzY_L}$PfyHXM=C!g
zrkm9wq=SdZV_kk!Y(TEm+@O%qu$18_l8!v_tZF*khldb~7v-xW>;`D&;@bD1?f@z7
znzGe~i{W>g)hCndR7~Yzb)rU;fNiK)X%(=I(XS=0Q;GuE>$?sBq22-JSiY$|b7Dzn
zJE&UrQ}j_I7g-rZ2wg@Xdxz9G?D*?}f-6q$YA9XS;taeX4BqB}ZjiS=Mc@(+)a)Sy
z-MK7-Kw&~qn)(t$|H1BF-CGu=0QGFvB3)06BEBr~*YD@Qek0igUL5ajM}REr*(zPU
zdF=w}01$PvI>%umP+Xezr&}lx0wCQ0NdI3m6yy-1FevRj2%>W7ML))B57D{slJo&O
z9>RqeYIYu{8*fO)BJ-i&)(HX}HheGAByiHr=nyGlx&Lc9{P0)bW=Zp$`M$sumo#>KW_Yd0$$ukxFn!xqXekF-2H{ADuJG*;S--wS-+_?fo39v;{Tx6@)_;Vt0#}Q^@^dtE*AE?044h+8y?uikO{0{GR426k*n&PB4a0
zfPyz*9
zdr-z+YiEbaCXG|u;{mFqooM9&UceN+_<|z%Zvyyvq)h;qw{{`YgYgjBCB5hsG|;~}
zdWu!v=ze*MjJPPhSjLchdi?k-i^ALgDNG6dg5&U8PNA*1OgTjwFWKwhYYOtHE8N)V
zIN?R1^76Aku}N4(?vpP};K@H(REzQcDN!5NC?`OT*W79*qoX-tKFa&;On5#(xmHNx
z3Cf&IQr#sa`M!E5q6XSarHT}i-5Zt`OoN(KR0dFm5~Y59iWB{W{zi+p+s8Q=ni&Dn
zxUPDSDx(uEfACc=SoD~^O6Nufj94)`VX3SRT)u>acUPPsb>mXL+k=GKkO0)wxmcbn
zj;GEI!yv*WXMK<$ph?3q(SU;}cqFWDIleZZMMe2Ig;SY>kwBNcSH{G4X#P@OdV8w)
zAjqJnL@Z>^0X;Tn#HBhI8L>jc+EZ4zwb7ne-?kKMDkpNR!WYTwqy%z>#o`*B)Y%rI
z*m?qvpj*G|8y*wV*x-oS{nwZ9cafG8u;H_}Z|w&PHZYcAn=sG5e1nDGD;;>MMVf+g
z)ue8&)Y>*C1v-d4kHxX1PkP(RZLej|!{%Cr+EkOhFfAu^dP!qX8qs#0j+HED_g*%x
zI#{8HD?{9OJET%xI^;~;8^510XrcL?;+Oz2b<=0^ouFS}!d22Au?#1}IgJfMbd3h7
z^>z$67gMEO*0AaqD;cxzYZ2V$(Kw)Ro&i*H}03d(2<&hB_%sQ5De-mxl)O
z;~$_?GD#Baro&6>wwA_b1ig5CCIhC*ha$RWQOnZgkMJqhPL0)%5o5gJnY<9#olzQX
zp3xPy4#)1yLo6!>E1-$x``q|vO6^ok+qi;DxUP!dI(yaUu0rJp*Fn%X1nkinK3hgC
zU#?vUbX7KPMj}jz@~O)0>V{3@vOByB5h|5_JA6q>CH@ipcPu25t4?f?)|Y}YV^CM<
zS%8tj11o8M#UA^cb*Nf>_SzRAWf-Yuv%*3glH4>j{Rx#y^gMW4IcKuG;oxyfnE`wx
zp#r*|R-98D8;FPo@ZP%^l-E3Cb!VM5s1AZb4TjYh%^wA-W}qYIF0)xyM(eKGBRRfn
zT6!nr5mqri0;qU@kA@C{vnj>&-1C926ZlewYRP-(9z5V`pn()Z(AS7reL>#muTU|n
zeGOk6c4I=UnwM%mScunU7M=`+rY}@~%g?s4@`TR07djon7)Zd_UhtHJ5zmo~Q?ZuF
zrjj})LtaQ>V7cmE)XS8qyl{CBV+bJ9BmUI+1^KfSqw5E+C)b*YK98M&CMvI~&v0zQ
zo(T$4{uKE-0NJ3jnD0_tUEEwcB?DAP4Pxt@1mr!n9#RKnZeKn#5_gMXJ)I^>J8$`H?&_dW@Z(lvLu045VEb-8QLqYCI&#zJ?8WvS0261!R#3czrNA`<@zgb_d)ex@mKt>QEK@)5w*h~6m**X8h+s_
zp774Q$6sl6-5HEV)DUlIB5z_QdjIUsz`<)Y7UjcK)izg3u)!>x>L!qdfTJDmq9<-M
z((h6?D$h4DmX^CMDkVH{8e0CBv5lKKR}l#@^{RqSwizHApd2zfPe8x>p&?KsI06gW1lAq$
zSOZVvLViCY))a4@!|0!VmF~YH`~43PQ&p-%rCvbmL5c=qbYXd$EUPzFDmubJ*SQbf
zZ?p3v&E6HCt@8~%v8#XF?HOU5lR;wtT1E$~b-T&i$2vt6+pZ^p3J6papbZJLoo*k}
zBp6XYtI4|3X8#5ctk#D*yYKc09~HwtZ4*|h`yE_j04qp}Db&FLm1NUH?Qg9Rq$Qzp
zoUzztG<#Hk^p7qPUzK8OAfbrb)vt7Xf#WKhJ(1wuju4Qn4n_lr|1EttR#
zr`ZOC-_O0s2r^0OPR2x}#Vb}>*9}(;?P~wpRuD|(B^IUXe#${Miz6-V(ChQ`
zcPvdVLUdwmCh=S~8hqh{3N1!tFBs9^qwjPFq#I2tua;L4Bga<8O_7DR*Yq
zA$MG3CJJc5RWvv8;?3g%ro){Bd=Nh!;|RGp^xC?2v?8Hq@Y;aw1S17Pa-r4qZ`8xT
z9{Bt@PpDu}n6cPRG<4NtG-2O6futdoY|fF=Jq-%69{$*M5A@eS)uZ+!4U?L@Oz#5d
zsdeMTREtH%ZcUU0Mn=3cR!eCV@_M{EN{n7klt;`J+s}elYC4hbJV0f;rtCyCNc@;@219+6kL~0D@O`b-BaCpL@IKlA3#{$tv_ae&Vko-yxK=I^GK`
zub&Xi6mg+o*S^_)@c$<**UAy0?mbS`n~q$BW)iMn@_D2xxn_>=8vL=rQSttSZLUI^
zI=sZOc|Lq>6WFz?y1D&TPz#GRxq&cRyU8GU2jXkJ1mV}*A70YRUfJIIX$VD6e=bNp
zv5lur4U>7DR*(BMgX|==N}X|C2M
zCh`6!FQ49183oIoZ56IMF#iCxx&BuC%epuYFSpQG3ayUMLJd`x=Q@q_O$17R+kmsm
zNM)XVAgQ;b&a&a`4*FLRGp7Eqo`-^c_4Ip0mDH~ILke)O~i`5
z#>b$vEyOG)<1rbjcf7Ne`b<&v{uHFy3D!$>45C;3xVDY43;F2Z_OiXc55eDlMpM^n
z-MYW;W9}|T(o6k)QS9#VGP-h3ueX!{sQ~t2=gegf<3H22w_<${VV9`sojt^AY16rk
zEt?%`U-uk)#;pO^DX)2&yRxQ4s6n4(0Ki?elsSa}Wj2y{4pJ1z>U~0`)Ceiejz;vj
zY>RzY!F!vSd{`Ge(528*N@KxL7!;J%Sn8ib-~FWzL8apAFFKa3m3$QDAWe9?MFSo8
z$VLk9He4qy8!W8`QY0AcTrdv0EEq%f=Xmejy8*3cWmx45eJx$vOBs~sQlh2G?f$_*
zvYl#=t!aOM5|Z9t^Ww4$ZN94_$>jHBls+CBF$&(P0DLZ}V-zTwZ-PVAGx9WOwt`|w
zmN~9Gh*Z^i+43BM+_Bwf>)t+pO0K;=CI>$`#yXOLdN;(TD}pkJ-BR5|2O=}c2GIe}
zG){)SZ)9OjiiXPtoGh>Z$91igx;9`(HPV?QaAxI|^Lz{ydj{-+d1~icYMGeQGXm;n
zn&~cBp=7>nBYJk!J7la-z
zstf)BOp|qRg>2w&>b=g1Fc)z=0v|ZWJ7v3u+fZ{EoLl~Zh>rcO~?09_$_t`??EGtFKhTKb2n?P)1y&iS|Eatt-TTU
zfp;T0dzX1BuJuoUX?xLnI8;A-mXd?^@i}EThf@Z1-ikHXP{TpR=L4YaOhxNdze5z_
zx%yN{=1#zrwTP+9`yxOG6E?&t(y7nyE=&zE`YvgZ=rSE!yuOTCx2OQ*{50?UbLgxJAmZJd_aDG)_ft(H
zu}Ae%z-b1}t`q2sx&Bemwyo-R7oD2!x|uK1Jvuj6c*-^Ia11$@BcpOTqh(3v!g0Vl
zpOk($L($UWWi&bhqmM-@9d+zbbWB~N<2V~Dv7Q95odn1YJ1fEaLfrp-v89?
z@#IA-J^VU^Z);G?udt9;YIzmvH?i9&_+t^R>%-l*UDYjJnF#J;T>LA6$I>oRPSYIi
z>79*4z;<{|#f0ss+fJ@*M7}wh4><jYaD|Nd`OipeBalD9F_xzdPlp|4PC_QF=
zh?$#pPFrwKWedA($W`b%!M}^q%6h!h?JB@*NvCCp$(D&9q8br)}mmFg1AbwEcmLGRppg6#{rwnpeS*
z4*8-GTSqEZt8Viu*xrg1+vi+*Wc20_mZk5Ya5sF^J8X$s)j6};$K;{G`xH?mA@&dV
zAr~L0)cG_%7Zd|Ta&upHZD4$fAnQiuTfo$%Z99AzCY-=$)*A(=O0*SuT+N&Azd%)K
ztwXiDRG`D$C+6Qv7mSQ;`(kV87$T?J!(Ens${^Z|<=g!2O_o4WdJ`vkaZ>vPjmbs)q|C1<4Nq#3cKI=04VEDIS{=?%}T
zm^vJL*^e3HE$qF{8#3~cR|i@=DW;6z8=}7@t5BgoZy-;07<8J!wm$@iY4E>MNq=pM
z7b^g3)a!!L+?OUJ;)o#`bM=gXNC*vlR8Sn4O7EmFOIi
zpKKo?u@wi{{*u}oJmAh~!|aHeO$kwQS27fe?dNbBhYEX2!ec#As_WAFoT+AADF*Z^
zE9pRLIazgl&V!(Y@scA*jyn
z&3;M`Cd(@=t)yXA)=z@5H19Ge008X05rU_=Gq6G}kr&=JYZKKQ@rA8S3DXs6(109gl0jjq;{bbt1Ll34wmeE{8&M(zak
zm`(PwR%pMI>}eSu4PMvx_Jy`b>ddXdw!1)-#@-cUW2(RO8U_VbqniiP$jqLV^P{CH
zF^p*f&Z=si8a=6%WsRWAo2@cM59Fv!41{D~h-5?(8bzzl<^d?9}3dbpBW>H@>?aqB%~w8t0&PebYKx
zuvO8-3HBnyyzO>-x}EN(8!bu*k4qHRWLZJdrK<1tR54ea5W;bhMy+P-rE8d&+xGncMqj3IW3?a2BJwg{EvRvMu!x*@=
z&Y{!80>_EnHA4b3b(PmJ+>DU6zR{FT8y!j$2)lH0)eXI?9|;k1+doI6&-FC{8`cbb
zbIl6R94!*mV_(i#b4cdmoMXR#i^FYa%>lg5qBt0GFjXeennx&leu9}eU~@tld{Sh{
ztXB6n#!$F&pGMA4KHm@cH1r{@Dwmwd9SBY}N!G?B4`Z5#L^TZjD#G!ZgO$;M7tktzY#l#w54M0Fhwsoh9mlq!2aiEZiFW1ppf24$@c1ly(W
z{LweF_459wDprxz{QeNeJ!G?4*6SfNoBU#V
z&>%3u^LD7^Fy!Oeog=-dt>V2M;@Av!BNp}YGGyw>>^vKXAdG!5RfWTOI3O`@8n$gW
z5R=?`vc!zV^BTlB3%n32cNa2vMDr;rjn#Z$Vi7CK?sV0(b+UkP5zkG`C^28MFLlYFN+?)RAwqtd|Wj3{T
zO|`wlF*?0$k=VmUCySo2k{NiD$#(zCB+sLA%+;9v=02ppmI2{@a;n
z{~^`9)yCGeXG{98o4vL$bOzn=0$*R)*euy%EF&bivYew;T^1=tp*GYW5^^_*Uf0wRz(2=@k*uPK6$2-0=x2MpxX+2A;3)3R%gO+u|OwU8%4k@?>$
z(VWeHD5ZtN(D0?Wu0Vu9be9)MxjTO1BiYQ{Ch1RdC{olYU3*SG@hBnR^Ci%onNiAW
zI8-oit4
zFw#VoR4aY~r=y~kGNM@)Jb$}SmsXq6>t>}rPc|N9daWutA^2x(sIJ2)+%ji_is=vn^137Uk-r
z%|%@^+C~jxJ?zLC^Gh+qDvWfnT2GY#6y}#GMs|dxAOV`Ns_GovoqG6REWeU5T9uA|
z-vg#bU0L1KA~U*0#1bR{zP6Z{4x+Gdq!D5AdMekgG)2*FBsoeU(%E0rq*a{Mditv;
z7-U>Ya(;%w$QR@|tRH{ETHdw<1DEd%^?!P0h}t7#L3^M!mhfY1ZRD%!HV(W@K2h$(
zPwm6O=q3bH_3H2s8Ryudxn~Z0IUEBT4R>CgcNjs37uv%C#>g5|Q;0kR9d%CCoJ|FVd_;`^0;N
zDX4JE`w-fMvWq7GOqWj+zr;M*C9H0SXk`kfUz#1%#Lpcbcf#|BAPdS`Z7)MY@oY6>
zppLuep$?;B!^QK;U9?vyp4l;Va&p?jXTV`#j3#p@RY;}CB)_8kFQo&geT`IwTcf}E
zjfmhqx_1i8vhu|no!kaJqhlEAh)(*xax0=&DGtMOE>96;lnmlwWz``6bsush@BsKn
zK2*pJo^L!y%^4!|L*ide>>|4+S(&M49HFt9Bwbpv&1a3!uq|=~M0!ednw{TM^I*PZ
zi0Bu8;Y0*X!;su^LSzh}%BGLQo<@7jZAth-u<~F-Li+^Y?|>KiEfZ;SD3nr2$v++7
z8M@s|Af=3ukWyshFf+D{vf?ePg`xczZ~dyv9X$h
zUb+Xm5wofO2=u!)m0sN$swPL48KeTM1r8Np<+FRZo&|H~1RYw_lIC|E8ywt(*~>tV
z2(;rIWuGrqe#h80HYs}UZ(15I&He??({y;`3752<7RrVD;fAdXANJTSE%FBrYND2|
z7F?vMb?VFREtH>W24osa@VennMh1u5dzZl1pKhDKfiK)c<(|huI
zCM<H`ehS{K$?&6Cr7vvw+vUiQ^
zt9GK-ZfGeYP>QjLlco37a^B%*$}3Wmz$(bE>d&Y3<0taWOO?Yd&Mx+ps178sWtz|6
zC9;+5w!(nkMW0LWjmC+m!y(jh37DI)W`}a8`1_>o`5z!@ex`%|KV9H&^pSAj6Bs64
z&&X4Z%}4N6j=tj@&EdU(zVStv#Cn6xwU5hg;!Uc`Q%(=K*5;<+eGS>|mGRMJjWc>T
z(T86-OFwp!{u#wgzw?oB89(R;Z2Hl7&atW2DdA7Q`Qm`|asQsZ5xw{Bz*AgB@DCv2
z5;?&y!_I2@50HW3oql~=tO{t0(W?W~d57IknthOQFsW*r&A^@O$%rr!?*4d+`LX)^
zvp(Z6-wDX~L3%-4$C=!WbB&tlz1e7SvDxR!cUgzz&LO^#`wsx_e-_{1w=fvi{%FeL
zdwj^mYwY}qUR8Hzb>4STpzfE!NnEhGUtIlKbWVhmxB08Vcjx^_ozGK}eXJeE!#}`k
zn@r>J-(NpCxITW-KOX(i~;q#XN>-^ux
z3%%LNvYp>m+uPXJKjocGgJ@2Ebv~{rOi(D&)sD|*&ia3HOdz+X@h+FCuX+l{amvSv}=Yn2OKfZKS2F-k@2~Dy+0(WeP0C+k1Hd1TE%bgAAtYAoBvmb
zDzW@Q!E3(s|GT{9hyL%&hsM*SLAu(!yjJp>N)qu9|It6d=Kn^#KmG%}Y);##j3d>F
ztA%jvq3gZ){jcl)KffA3)9+|PLse_SgSJmGw_fs{s_jz{2Fw_`vc}vvBAXHX661gZ
zou8QqzNSuIc~lMF7IiB_^z*x-`Z^wdiSo6an;;vD;WUiYDtG@iBIrB;EN)T!_4ihj
z4wC&|^NP)#p9Z-5+x~IMv*d&SgWM6EhXyotNGg)KBO0_D~jKH<||=0_o77QX
zx>2RiJ_>dXh{beuzt_VOn(Y5qcFvG!J0v~+D=Ot_Qg&$`9`1%4|JU_-+Qu-z5XLX!N}F
z;fi9!{GBWl(dp^vgNr{Vb~lf7WyX+5PJ41U@4qHM!L>hat%bhMAxq5S{QnOBhbPKp
zr%;VIXFo#XLGkOUa5zEoVON`<|CL>W1A=)-)mAX5J$==j*UN%m4Hdoh
zdZ;h5i|1P=F&L~8euiP--yqghj~jH@DoOy&)io+ozAa?5tt+t1rpB$9zYi%#sj%%<39YV&Q88OV2iA156XWy)kW{is8AWo8D-i^^ne+bv
zV*ddoUwg=YFDcV#GHp%c=PI_@AgCM`b=B0u$!l3oknF=FqDn8W_Pv0*kr^VOxx$;g
zyQ*m=&v=!VJ-vyCZ4lVoXtqQ+F#|C13%FR`ak+9sB8OZm6Rv)M$jIfZ<#9>jXEb)X
zGaCg3uPC~sC#kkDBAld5?#kk9iB0K+GJ&=%S@2P_#9
zgcX*npj}1jdLR%k0y{`Lv{OPvp4AY{2LCi%Wmrh0t@}p8bQwlA)x&IVHGe3#t{7^c
zX;0`b2mhC3am3?|P0RY;+mAnNk}>#Xhe}Iz$sA6GZKw7xT9y{PAXoe^zS4Fnh;7{B
zKZuPC5sA?C*eDSmQeSjke{eQ132B7TIKJP0V^zx!n3tb|8Dog{_$3H!W!J-M*o}b|
z&}{QEX0*fNXmhzX0NR$4o`ef#v`N1Xq@{nc&^6SqBg8JNi1
zM~xf}`>jtriAKs^=c!CpQY2=|8jcme2d$V`slOPv>?s2uGEO~{(h=&XoY>P6!HR!j
zPbCq?!K3%2!AaKWEDR+2OtBaC1Z0Yz!BpF|4Ta{_8?@RRJk6+UfJ&pZMWS12k?DAm
z`M^SDgxgATQFS`LmlAwte!QiI|422F-o$kMnf~c@=0xtk(hrgw1Vdwq1GR6|I=VUN
zM|xdp(ORT8DEN_~kQ-MxnJQ&gIJ*OCt#`pQF&#c(he1p!EzN=!C%PGHcnFR9A4F>|
zrW*{xeo>C&5P3pV)md*
z8XqqRnTXryel4Psl)ge`i=<;mNZJJGA~*D)-;&$ZriNTrC@O<=1YBp19qBku#dGG*
z{;I@9GsMynAyE*IFwhp@V1o&<92o!J_+8QtVXimM@U%;1=ap_nwc^u(t-US2H1sSK
z^)g;@voLZz&4~Uq_t7^CdUd~SoCs$&7Nw1J>5Fz1L-kZJM414~FV@v7M>D+Ad+a+O
zjsSOm7=Xj}sU8~3?N1h?alBvbPT>c^S-PIk3y2(;xPZveZ7NrocjLNReOf9iOk6>t
zRMNeyFitJ6IV{c{4z3{}wtT}v0H8iF!mWi@_%q1pw*xw8Wd!UntqznZN1V1T4~pzg
z;83OmAOZ!%B0NRO#8T^Eps~+%_E?U%RNrdH>G0NWX&`LYd5AfX_(I^Zr)`lO#`Kyn
z0z*8s4?K#}|97B>hi}moxjPAEKpwz^8LBMT=^H-?VfF9Ovx+)lh)owaT8mCmBx{%{
z@^9qx)wnMFX%WeH-j*R_NcR@RCs3QFwIA`ZsJ>O@#qa{}C~tiJZe&K~DzFdur$c8g
zTUIjfGYCQeL#f4h381_zP6JFlkPBQ&GKa@&P~kxKgt9mK2dF_UOG&52aEz;A0;Vn{
zTEHEI8lJ@$DC-l7(`l2)!;b#u*&XoNJ%+;u*rKXlRpKMFJLZ>f
z@5tPwN!BbE5q@6$?SD5WFU@H6W`%ZTnO~RR&psZ=7o+P1$X~b1eslo<;l4g7jpP4s
z*kiR0Gdy8$eK>#4->JzX!^ZbyfzK%XnjSWNj-{xNhyUh_(#{&pECC1JwoVVUtO+(e8<8iu=xnP;6!Qsp)O^S2AH~X+p6~Yr7d>d1JHVHQjo!Eu9e6pKrdu
z2j-pg?y((H!o7m%k(=F9nwYLe|No1aa>;K?&fQPJd+oS+s(l3|{{Vbwvp=r?SIPYn
z-uIufZr*-+`2J|?{L+|rW_HW`oc1;*j6x-F)aQe7_jBj)+Ucpu6?gFC`~Rw55#!_k
z$JaMUN7lUScF?hHPV9+oOl;e>CdtIMZQHhOo0DXcOq_|6x&8gVyUsf2u61tz(Y>m=
zs=9W+yK29x=Se&Cp1S2fehx8Q5{fnS8@oY8OD#t3?nB=-h`44N27OO%KXFGBNW|^9v@7%bES1S-<;?Y$ZU6b
zx-cS9T31Igktar_QDSAw;eJrE$ea}lZt2HcqD@}?ET*VtE!9k
zVCD}5&o9<>uWo7?c>YbD@j-$PshJ)ycCf`|%Ga|7`4YGmmsL-SBAia58UBK`KuFD2
zovon-lZemP2tt3&?n%pv4e7Dc#8#0c`ajw^~x{6fg4T8vRs(Bk+
z`uIU6NVb)nUZ9%F(&Hk;wfbnJ44$y=jpq3=dz)-&riJTq0?MHSX`mVraq8{mFtI`
zH|Q}IP4S2BA9d?AZ;&vQQhyT~rb?Y0vrZdBaF^)$j7vlKrF)*&pw4n?(f57x&K|8LcBgiBcNa>noctV4`H+^{j?*Mj+RFMl8t
z7Pma8`yxmo1b+Ps*d5;&3~9#}^=9;Lll?kwh6>pK+7o_PFf)BM)fJsCynao(@d{En
zZVGHFAqo<%z&%K1b-|U(Dz}KNCJrw6P%AERaHuT5jB3;`VFCULoCt#%}@sp}tf|QVQe$(vV}^8!J`jT3usFVpiQA
zMRLee+fnnBCeqIW)jq@GjK;Pet_Sm6x%&AiO8SlnR>{+8nc5pQHxLPt46&aca23y%
zKXBjOc<$6`SYwLH^Usz11^B^lgLCWkJpjOB!wWo3S|`Mv6}cUTTO+|2+f%#*sBeiwpF-j#&iWFXOT#SrayNRKxRzxxNz(tsIHM
zz}po$)ZhHcg?$Stq+1#0%B_d}xfWLV%!c(_@jNh(8lW^5viIZchSanfqek5q&bR04
z5Yn)_8+?z14|H#Cqa=f&Llv-6`$7QA{10NMK{RsMbgJ2?gU<7449D?YA;q0evR;xW
zH^L>SXZ$12+3q(1cYNyfLqf!b!6s#ovvt~Fx6^+>Y11KIlYde!z;=1X3O5nX$u!BO
zey3c}t!h-)Y3Voin0bv}bs~~4$0qpOGR^+qN@E_D5VP6D9%ETiBM1&y-WEdbsWe92
z4rh?j_rHAffk$g+UTuGZ3;M_HlRv}EjeOqgnpzXXFb^TZ(G$qMkf}a{K@wXT!=pdL{M(Z(uio<-O91hm@M-6s0mPSeB8AVo{bHBg@c!@@
zz%Mu_XOMBKWnW>obOSOciQ(jUq#OW7(0z);!jU^FDRu^^@_nOl4i&0uUKYwN>r#MpJVE6
zg(aHo+?gdtoG(qx7ugbYqQ6bxv*^heVMCG9^wgdp1ZQmMfF3Hzur}8*lo%E|r7kuv
z#}HAF>ySyQL*nvxM2!_AN>7;$UI*5@w5CG1-m04iHYd^4V2magu&Cg1esgr`l@Ct9Y+vkOlR%yW+lTwAUpS*~
zclb+OBK$*ZQb`;Ip88K^J+zxR4T&al%upjD|(%lw+-
zUY$=pK~2oMXDwjBEfG$2AqeD}A~n0@AXdsv;jZ{baVqVcm9AfkQmTlgo2sj{U?4(o
zs>~&JaPt_OZok;&xJx)Mq$&cY;~nmDHbWvYLmWBX>ngxE&aq-^4YTY$xFywYK8kZ)
zJaObf2KNCZ+O{zRDb^
zz;`Qjhrz>Ou%7$i@F}{!0e?*(EmuM1PiV5Pt3n6-P40;%fXjCh)-`xZr2p
z$535oOH&+tQjtJX!@ITl3Qq^i0VOR8aIA5jS$JS7hI_y^hBMs-ZTR&aX2a}heLAI*SZdyKM-hv
zca(S_G-~m<`gJB!c65L+~f2lo-^@oV7$yk{sxA
zKiplM?rdBzky>VqZly!ieus=e)6(bdYH}I1DowKW8vlk##o>+|X=)a!8$u06bI?Kb8p8DXR@RSepz}DwSz_l!BItEhKge+y@4H(`LtDWB$POSguIc6dSIpC3V7Flu3xzcK%5Lz<&c^x=Cu&bf!
z^%P~_;TQ77E;hx{jY>)sw{^b3@IB~2HW>zK1j=i}`FOMutPb?qH
z7(nV{t&u)}H<+fufxR60p&_Ooyjk8YElc+d&ET4ONRj25whw<-)qX@tI#9b3_UPkfeMzlG7@yYv2`Ztvakz;MTp
zW00xh{5BQ%MvFi}0KlqNJm0Bk5NcHh9E}v^b3POa5E1mx2rWYhr^1vHd~5Nvp7e+s
z3!)5|X-Yn{=|zHHF_Is{^mbJdUi#wC?keA0%>Y^%o7(&ZAqY)M)^L?EE=FHcu}krH
zVXfiTDO|;vqPC(`C
z4TEV2a;Mdxmktc2f0^HkA>n)2;JTOIM7`4(GuGol7SKJ2KdUVbeAu|H3jL%CpSs$i
z>UO=cyCAl@>S0~}$U}HrxD#BzWKBJFn%8F-Q=j!kkV(FSB4jkEfMsK0_g^qzQMuluhYV
zFdje&m7Zx)5y5YD_Tu`f77vae(HMurtLSf}g@hI)H4@=;hq>Sp+z$^jgskAFR(Pi|
z$aYwRjML?*|6Z8S@_P-4Di4xcx{AOn-aV0zGP
zk=Quua0Hl7Gamok`v%=~Bsl@`Aa=-~S=)GLcv5nFPO8`)pzguSC_k=DGzri93tS8e
z5Ltthd6$Hj57{u$MoEv2<~W)BOBR(JNTA+581LmI+BN?3BJtkEv3FAWF}rU5wWcDC
zLHUVMJHvT}jz_D3`f6&(1eee024MGvkGTdS7>$ifn8+-GS|%PGE3>3z1LLj@l9VV*3~Rq7f1qe2W1#I=
zcuD6K7Tck0|5P&W0Lds*fB~?CJ@19n+3?&Z8C6x<;^{#OBVr&JFviM#a?`V~
z8r$X}IrOhK=1^Qx%}y0-{sV`YQi7qZtP0WTkF^)>(P=fikYH!_3s+xF^o?0A@fm?+
zPkD0c9E*w^P={=P{)}M2(Cn7TB7^~rl-MR(&DBaqz5)lF;o*qPO4v?nw4x89q0f{d
znUtYS9RHd)QQU}7+z3#MgpI#?{pvpp&8Ch$L6;jNGJeuzt^EBL(8T)f-$n|Uq+9^D
z`EzVotY3-b9X~PLzSqE0hU>`Pm8X<09KF#H@zar>6&agq)ihryj2j=
zav{JHOmck}p25-QpV)YncgedP26!Ig#abOHgmIYjJ0nIb*IXtiNetSK2UxoDyhx)m
zbGi^6nxUc)wyec?gk}*QF;CV2V@pm8ebA9YO}Ry!c+?{G9+_nQeLFP_Jz@kFCljOD
z$WVrpiSylwt}b^P7ANsOycT$?{p%QENT_Sok1hDTZG|Va9X{=5fUX{C=D8*3sf_to
zTkSPN+5IbSHr$v3ud}?y7fLn*QiO%4We4)9?9hAZmjCQI_u*Z#54~3a
zP#_X|N}PZr7A%XYuHIADEQr2I9C3*}Y~K$9&)yDdrr_mE)gy?$n-}p-$XrJ)zUA@`
z#v@L4@r!avKts{<%Icl(Q%!V+L-5XEcd5}xp+C-M!ki`k{a!7VZuY**w|O%)s!h$dSHZ?3Pbo`u%HQQ;88VuVH~&}Oz~Xnks&O9LS&b@hmSppz^SgG450uV}sO52wKS!{yc(^&@j=d)sVSEEBsld+QwVZ*x{I%EB>_b
zj?3rNZt_ct)2JRK>xATooFoYN(&ybsn(LJ611~&$&t9CNF|9NuLqXe{&x?<}={uc_
zl2&@p6pEVsS|65UcyB
zWF{7)lVbWr!3G)!MvFFA*>d^#wpHwpNtg)quN~|qn(y!W18IzQk%1|x`T6f8So)H7
zKClvi+38f&t$m|X7H6fD4RJ8*DS97%zv}}>?fE0!4iU($wqwS9rRLK~geM|7*>#cT
zd{-CN6;*h`BY2AQ>B(tB>aIHK8`Z`tFw|cxa(AO?+!GHnAie(n-?zw9f)52Qf#|+G
zsykWPs}xywhY0GPz2Y}c1zek+t+H_cAA6P7cOOj)C09Ah!w?wFe^gwa=Resnu^Iu!
z7mwMzgjJmU9fklP9;#fEo;NI#G%w1|xBUvbg-cF6Af
z*DnaSGED*8xd;6i$+tf`;m8j;61vU^8N+&ATA;0njS2Qth=^j?M*mP#R6c-{!IU2c
zLn9(~$~Jf>FIzJpNs1oGY`z-9t9(%56I<-$mK|_)3co>~ymsVeGmhz0Tt;7vE~?}^
zhtN(GVl8;X7p+d$DW^<7=~rCtplGZfz{5^BNL8busOiXqS4*VUSf%2zLFhAq_oxnT
zeD6v4wP+NjI|Wjb(JBn3qw^^orlY&JNF{+>;ao0x$OdoEx`ahM=d~y6_Q=Cu&L4H|
zb!A~)%Lx5YOR0Cz8e=7kPxH^AL$H2MnW+`*_s(PVWUwR^`vrBeHf-*r6W?(Vs;d({oDiYKKn@;_5?1BkeLbhRO9j?fxJLeNN;1
zJ4o#WQmGdh-=-yX@kbSJcc{@cC4N=K8gPRu+MXX6?iOy>l?ygN_B!_r0j#E2SwE?N
zBCk}C{w72}vRL;jYjPdl5Gr%0L~jC^R^B**A^Tg(g5&ky#2W$t7|^0a3#BHnFy|1#
zvgC02DCjR_8A9NjHzk)pSfJxgepXf8@lgW{6olugDxO6F$q~k`Mq&Uwe@9|qnb;nD
zf2ymM0=rv`DCm>W%+X$MFH~24sJ&+k_MdB5#T)EFHM&HtpfL6G56;M
z3B202AmSy>6`NK8tprs>{H{^OX_0xTt*mC@Z+fQD<9alOgN<*L)=BJgBCE<`2o+%Q
z@R;*qz>6I{b0B_Tl-<|_$->D16F8|~3V^-x;>c~0F`p11Qv5VtSv*4B7Ujh*}LPfVjQqPyngNYoK;ymy}v1?;ipqQs}TL_YF%y=sW>A1jOzqcv7d?
z*XCqP#3|Oiz#8ou4#Uf(#31!82>~LXm;3Hfi_K#i%MFD@#wcO3ro8|0(o*M{&uTW!u5NyD)6W
zIQIQ`#5G$Q*}wg}&tXxp^k@Ml!)kl#InNYS3S7wI=M8&iyR*>8L#2-u
zH}p-eytB|A$=sXs=J%@V@MpjA-j
z53Xm4IIdXi>6s!o&d>9+<{q!S0SsBWiHG9^SFrO$J1p{rN+EJah;{(RJXkQH_FTvO$V!e(`S6GiKcIzaYT(N^3
z!^=+VQ`-QFwNhA>1nNUdlssfW<>1-Z#PkGH5Z9-wo&4=JgTx=y95Dw^I&qQf+%g8?
zl3|jAG^YOc8-sTM@7NFhg>TkB>7NZ{*c
zNKi=AHS6q6D%EQ?1!C@m+MBTPg9oG*NZ0&H!CKl0bgijfm;y_TeU;hAN*;+%s>kpA
z9>}gf$NW6Wi6g0HXI}zu|J_@-WG-<>#^@{lC3Nn1@@W^8{_)fh6N}*=$>Zvuy0@6V
zvzKt2U{3XXwwlF!`X6>7`dT@Gu`(m;-w*%OlGz;B4}|&5=_dw#1R2_n?~J`K6aX}i
z&%_iq@ut^zzmSAm=$$Xzk5uoXz#e-#^%HTXxK#LNv2wheM8u<)2J5L;>x+QHEHD5D
zS3qyKIi-b;zdEVI?g8>Mr&gvhFw*UVnE(i>m7{dD-*Tqb%h{boPq!8
zTav44YH-dE9C;NfAl4Fu8zQ&|km>X&Ba}_LVDJTFqDNRw1V)1&o1*msxvumOKZwxGu`izDYQd|
z)D*30AsQPQGu*PMlm2BI<1dm%i1Zf-4<`BF&kZ0Y&6~$u+okL%Oj4X!bb7v(?41Ey
zn#wx}AEN*ou)(FXH?^~7T!Yz!P%$Kj`uG3DYG>b>c}_;~gcem5ev`k!=*Rw^0-CnE
z@e@Q>aU#HDEb26}FctKxm66A&x`xEJTMxl5a5C`*#X*iYh_YccOz5*x@}@y8fvIQR
zAYbkn{%G6iC{XIdjDl&xRrv|!tFrK8+^ioWfi;3UFP8BqHtqPXA7y-Ze9{~kibS=;
zSR?#@T#Co<0BS?%61Wi?D_I?IFl7k;R;4A=M-iJHlKnXSiocT?@gU7M*xt1{wFt++wgx@7Rg+NoHpB9GC6}1y^W?g
zq=XkSf;ZGIBw(SHu#c}ms#WK3MotK7@d1VW?zqL-CZ+0E?q9&#KKG~T4mM;1m5zE+
z@I07Yv(S#Dc#bOgr#^SoZr_xr^^%O-S&)@a1H(Pjce{pYu3PCt=Q#d)>2lf8@C~9x
zsuF}9ZS{ro_Pmx2g4Ts8rdCe}xcw59gGz
zN2VG^ZR-+7*=w@@Nvtc8HDT#;e8?CjF9_;{y>4MjEr3&DFNK*eV@FA-DogWmo`%{)
zYA}&hPmc<`Q?9)PrfxA%G!OXjL1oZ`Y*eo2(P*NTl$I);$$K@Foe%K#)OPl$)yi$!
z;GJ0kcH`9s_%L9UvNUGN(lJcw;v}1%mDw&cOM#5r)V@^F1U^Kq=it??J{=aJrXnvB
zVunq>V4GXiv3?5;0sCOPf}qqT&$AmZ
z;^&v1zks^Wp(cvU50#x)AEHZ8e2d<<=fD)Ok6nH>Hq+UbHmMhgP~Ck4tD`L(o4t8C
z-DX`>;gEpn8o)+mV9G&UkJG58Ip|8*0Efw(X~a@Hr8e{37+!tG-f9xE^-AX<^&@3{
zr4wbv1|zjiPIjZsR~D8YON+h~rWYO){d?JCh5WGZu+udA`62_eZu-k!2jSXv7Z_|d
zj$OM}?MfeQXaG0v3p&2g2&S7>c}Iv|nogi6^W-BIG!GZt&g?YNG@8JfOO_h_mOj`=
zS2cI&=}As@kA9iCg}M3ATIZ{>f!43ypWv4){$?6t&?QHQGohH9Iary-^K{`mWySqu
zlRms0VE<}&eNdUB+ie6cX76+3?#-q)f18j$S&czZG_)t!`q^GUb$
zSM-4hLqd$cTw4gT7&@KH<7P{e^Jfq6XSs1a7?2UvYF0K3MzVh>XXug~IGsxw>a;t|
zHcK@B#J=9^+w|L8WPsy=295Y=h=C8KP7UG3rfo2gL@D7OW|mgOzA!cj`mxJ6hkI%z
zS-PfVMiRO|1?OQ-AN+wPvR%1bunZ5aK1ri7pP
zP|u3};8RkMwUhifK%c68yFu%LT9-`p2OeG}@H+fNJ!VViZ5Uwy!ak={=qbU%p_%)l
z=F|B=9Usq$3CVaXD2w#CqC1m`mjFa(CQ%}U7$AD6WjvyzS(9IxN!U9}NP$4MFM9ar
zyB{3zw|nqfpSlc=+R$cVgKT|^A^oZI*>;CxNxZtE_MEZyXpm4hmZh2xJbjB}30dg@
zR;w|=H+5ooBAfII;S_8_|AJd_%xn=C3QN_qCXMa{g*6jVOfLdrs4ZJ>vK65SY(2DM
z2a^WWYBR=JnF9SkV6={#^Jb0o2H3Ra?)SdzU>d?eVDjYCYlt*2@;mTw_O5(efdnuU
zcvjX%PGXa;9{H7s
zMWRW&gHY`UTv9}JHL-KnNiA|nI~aCoYl2&fmJ3sz)e`_LnuxPvl=NPxU}(Zrn(8m$
zR6oaonFLA0L}kJ{!|zOQqxmOdK?J6s4p)zs-%&|yVrv~uW)v5a(mdZ4-{ddO=0jHR
zob-BJE4N|wHD4ts?W$4=k6q=giLID(R&{=L?V@1oTqBzlZYJk>@kOkc5=5DCEJhVt
zT6~9gnpDJd;KJ)w;ZKQD8wmlqBh};rsh<`4Ek^2m{v_yR78`*;Xe$taFq^}PIR7mFO0?R@lxXe+FW`PN0FzAk0Q
zm`1d44HEO6(~en@7#QuUy%1En1_icUrq$8|n)JrsXe|3rBdre7Lus4G$M?lo5_Odu
zfsA_sDbV(DL8@DuVF8r-0mA8CP5KjhBk+;56|$MZYrq^Q)zN#7o7<>;m|LWHkw;pi
zEXpo&V8C#8hQuG+ZkzBJAc3y-sYV&KH_b(|oN4(Db!ru`&Zuhefm|KK&Wi(wuXLBK
zD`uFRjkUB-y*hL1vmrp_VtTHmdF77B5(HrO?i9H`62Ul8uq(9J__dGB@XO0DJRn88
z_Yf~{)Izf>%%RNpbuOS{tGX^Cxy<4uSJ+=bM+Y%a%$Bf(@=r3`H}3Yt!A>{AnjZoh
zj84;)#%$k8wg+aMWoqJq=qTi0cQkS_$|6?n-7n+XYC(^#-xG_vm6Zd5>&IJfn!WQ=
zX9s!$ZVsQhQTR~hMh=Y*7gGA{^@9EONGD~I6b%HzVq{Z@jHLo|zj(^-;DS{2c+(z#(f60fQ9Aspjzj|+
z&VB2R>Z|%xpA|K0uB>8*!qsBp?hH8&F8tX}1*r{OE3>Rc-SF7YuC61rK{6V~8{N|2)M$ms9GmWDyJF6l*hlbR=_t2MorJK*
zuJJfyxcLR`Na5>BGS79_zE!Q4EU3Um9OXI>6v`Lbj}^BmP!!HAFIl4da8+kdleUF$
z+?mvyG5?@c)r3^(-^(I)sl~!N>Q-gm_vVz5*i7rkAs^q<=Ul{R`;B9cx1@lYp`oIe
z4MmX*845T=Vu!Cp{VH1WI=O=()Q&edbq3*v>0sXG)6KR~W@9w$?!}eS*dA_=5PxbjjStByNn6I()Y2JiK)VF!a5?IRTr7*I82Eokxz)
z!a2wGz|u}_#gR1-T5DeK{cB$VFArb*nR~oOq|U>vzsFQ=F?Tyl{idm3SQPgD4o4xN77
zn6r_#bALe|)N!%0_x%X_!L;d+g?!>Hk_7&1KdZ#yxmvJB#WYkn9JDFhN60wSbB{Qc|Ox9$k^M%M503fmG%t9ZTRO*Th1tnYSid*VbK#KLv^MF>6I#
zWrKXL^QYrJTaT+f#0Q3&M<>%@WD2Y6eK!Y;@AxyA>|dBD3q$X>dhIIEIq+
zp}8-OLY7b;?5vB%0SS{GPS6q3r0|Tli_d}mg#kcsqZoBOw9AGcX~zWCVC)cp?sn$k
zA`wb6O?8)Up~9`kw|tM|v?1C6fSy^Z0d~LWVsYW(StP3s4H5SxRcM<&|{0fr_ycG96r!=&A)*D
z%PPOMC&u4evZv8cgZx!Fr@nxG3;-Bd=WZT82>qXBXZ3W@zS%j|#m{Z4Ua}NLpGNC@
z67wun!eDqCUXCgAPeW*Dj3P2V=FyWL$%`&{;Ich<9+PVQLe68Zq`m=^O8xpD$i|UW
z(fDq~VrrEEr?IYsIf6FH4=It^Hm>ZV0i`z)u&VKiY`s8E@PIAmaL3;ZEU0slU~@;zvmqBC%O+x+ejr?0(x4jD5t#8Dvdc
z6mk{LRas&2c;^iwjKp6Ur{HjKBSYK-Z)HHiA4fQ@*Lbj2%}dD0BKd`mQmT@g>Eu%~
zFy0aT({4+o={~KIGq+u6-$KNnSnvYYypXoB1>u(&eYO=!-QNqG$bT7Asv~gg-l`qK
zWrPr}tvMm$1#KSZH6&PzjmM4?k~TUf6W*?xRJT4%yZJ#{EFcOBv}gN}45vCE!}T#hmPK*CdiGww%U{FfiS>_#)Gj
zBWtZH8Tu8MS4=;VpFq3_CE0W?NF>*dUAfP+u%l3ag)Q1Ba*dvJ8+s-}L{(%XgL~9V
zCb%jg=9tY@Tsax|r-%XgD`0lMN5Kf{QjLehcb!`&NLRHv7Vmb!{1HwT352kYz5Y_n&iBmvA
zLBql=^T2_SqM_q|xXwXs|KU16DI)s`io}_bL<>G$9tirKez}#25gKFZLLeE`0qbF#
zR}99ZP%of>vz-$*sfMd;Y|uhTFv07Py|t@o(yRI8>QxRY#X=?qi0+L$mArDsI8wJFSa(-h>Ico31K`
zg=w+zdPaq}F#aR7swFDpc}c0gQe(A0+Nyf}DJvR0(rG~CQrp+SSofVb@mPIRUirLE
zk28sZq!l0Ahk5y;@23RAAC=m_fcP!xO|s3*)jnBJ9Xb!i%Og9hbW46~$D!JSxX!N5
zH%H_29v7Gt3brsxH#%M6PMq`66e}ydzqo)^YD;3)oYq$5#|r2gxT~a4#W3B}2sz+siuPUkErU=1
zpnn5DT8?B^wOj~WYeoKYt(|xPN^D6O3`;pNg2Cq7x2DAD_A-8|FranClbCm71V!uE$3baU14|;)+w?>oSIZ^=Yqd
zvjd@9&76-E7H1JbOP=COR{nB6W8&DXE}@NOzVoU|z%kcm0Ul_`{S=#Klhm%VWdTD9
za8V=_pU_zz331K==q7=;TNeL|nh#Xarp7GJX5g`Qq;m%IL}})?st*q}I8vJN{pD<<
z$EAZt&8{k>PUa)A>$Tgkb*Qv0+B_@_!cdi^U4xOwY2UcaOSfywW>Rg(s`SLD7^w#9
zY@}nE%q62M$L%9@OMg3jg>7#a?;wV}CqO82A;&5D{x`!z$#(cFtE*T1(luCh#@E_s
zu?mK29F_|06NLFOb+#%Q={5RKX4-SLoplUJ9DcNwyq_0L!(75ORGzNQ-9w_Hij5>K0}snw$A-hB?k_oY3eFM8uF_0GQg
zR^9%QM*s@1ItWt!*xRMft-9Q@e6n4+{@q+vE-|KX_}j~46Hh_g`_r0`!y8!*pwCRf
zWo9mw88o{X&M2M;wk`vzHHBQ&!Y+>rlE
zvvgPWY1iV%&v!|FF>IOUBJOUc;%)#9Lrpi_?H+es+8|3zJ_E(3Qf9Wq09&c+#y#}1
z(mx|=2B%wE$=yHg@y4;9s0kt3PDQeB4~Qd|o-J8SlQdtG{2V@SB-4P+2Vp9d)AK~S
zZQLX9L9?FF{r38d_GM#I%rz6by%I1-3g*db>iAvkAKk&L+6lDAU;E*d!+A`Q@?{MH
z`l9tKLHeIZsd6wHS31Xx9SDbt1K=?XpW1JdtWjdammso$p2Z1^pF3|TMGfOO-VbZC
z(n6e;HP{!&e5f%D^XXN1DMii$d>2pZ7LvXNaEHODy$!Ya!Q)g~Zx)+nQH!0t;}F{R
z!5YhmcqVv+MkM0O#!5qCr=&{csfw97BMwfv)}4kh74@C*sW0
zU6iJxt)lZQa-pzCG?a?sWYPqWPDpddfQcK^M~N012VWFF|n3#enI2vCF}xmIW-K8-O+Fe*t_LE
z1$J=(RB1g3=#G^B7-XCt>2ghd30lZlA@0a2p_5=5r6AkqG6|*HmR7|mnImEjbs&tf
z5cD|0x|HH-O{VcTKkJ4xAmjQhek#MYi~o0`&nI
z4UI*&wadI1B7(M@a*GQ>Guei0wJRQGFIBcX;&8L;jmJnx_=fC>fGiEaun)_~olyxM
zq@tuRN_H?(dx#UZ97XVKp$g=Z@K!8U6o7poacDa`XgYiq$s~?OB9=HK(zAD#&$Z@N
zQV&8ZJl5XToXiDWpH70^I%ip0ZnQM_=P{9~o3K0;ky2&)^3ry8(sT+2=J1DX#lgCU
zB(cYlHlxdN;2WuOe2bouljn|Bk3XiPlE1X5qmB0)y~sUJ)IH<_osD-pY-_r3b2}rXfc=e
zP)gMA8GT5@VDw?g9Z$QsIcl#_gOMa;R7`sFsZ~NGe{xXYf{3(c5bdj`C-0cNS5K*m
zdO6&`MJ}WP3U8p2I*>VXwU)dGwXL(NEPK|x%hp+fNOxJknK^VtB<5gXcV4g;@dW*$
z-=LtD3&L~RJ~Z6SnZ_>g$Xr@C$v)}wq|GmK4IC@}Td?V_yn`?XQB
z^JcDr--H!Q;I4UyxcYV!XXViW_vn*9m4{pHutq?Ns4w~B_gCd)8t!x-Qi;`#P#g;G
zqOFG2_99x+i$-7Dyf9;U0Vjz7(z?{7-0yv;M&c<|0c)68O<}k{&VPgr;zE|jg5QMT
z?8C3*I5U5xlLlWr+9gM5(9<)uKMM+<<0>oF}>G~sco7GbjYFNyf
zWkgom6Q|QpcTI1u7IK&}jXpEl;7>jGwAs_kXdq79v2Lj(1W3|W38R3Nm(%UKCHt<|
zM64w@lEer%11O~Fj7`kRaWb{p=H}aDgha~A3+}rPM}FCoc11PTEt)nGG#gqG1~nKm
z-N_eGgZ3Oyk5IE}8NS9u-#l#>&%%iD653&<@FCyL*TRgw#(xYlB)>~PNI>AlrcGsw
zZj_VPC0~>svV$ksM5z`<9pmT%$%8#64MRfV&DE&a_!=P65y{ASpH$B)Vk}!0m%&DA
zc)V&y#QOd?_PKBU3CPxUH*)flzF2-KZD56Rf1_<(Sg=
zz@^~tnrx8`EgtGGd*207b|a(@mm#9G(}y@qaB0@2Oz}#QcI`A$>)VO
z)a>k>@v<92ToBkHJHKEHJP6A3rK>rAM?52ffI({bT*D?%8*_Zh)P&iRqx8;`oqUQi
zO&7U9IoMtI0%i`7EnmxV@S9Y!f1+-UmCxq&5s#gR&&lzmAuMcm$@HBXL8e!fBBoAt
zg6{15`dvQb0NY*^^*UZ5``9L^Av5#MJQlkXASSwO+5wE25>t$YZ=4{4SOn5-)!tk-
z{oP5d1YK+`*9Cnsq35O13KuVv{8Mg~d7Q_QC2wb#5g1LBokmagY4)DZEaT?;#`H_W
z3l#^DdrGxdCF{gTRFMp^g^#>JBa1tZYi-)zSqO+{%jLg-r+`zT)3wL^nRLQbmp&W$
zG28etszZpyf2>R~#&nEHM(NX``{l<#*Qx;qwLaWhiNjt=9Bz)0$;?VSKAp1-no!K$
z6JYi$77(reYtFe-9H$@7wMUA936KD}-|CDr!G>;k)@2q}dVFxX$BM4(1>8tLusrpX
zuq(^&_uj?xXabcu2y%>M1)>Q+7$Cu3>5QLatW75)z1rS}n<{Gqb)-_*SHHP)iDoK}
z(Qj7irt!$j+Xe%SkdSKObf%O)zMh)Z;gry%kRtTawpZS8ojjW$D#8NViy*TYpg~e-TMV?|SHmhglp#%hqHbOQzGdiDjFH
z+s~|4547j%rOCCezJUkd#xthnWF6PNy(#9}22j7pXo@#pKPWW&lBw$SJjYeX?!L@_
z!u#UY!U!+5V)$ecG|_px9*5)N33)(aN;EKnXVuffSW=K$_6IhnR`N*8XGMEvX5Ul@
zW!2sBSv(gOp5%EMsxs_FwhY*&^<;aT!5oG&A!Q)(T&=>fNDcRlq)HPQRYAHU
zhxOIF)8#oiOoNff^wc|5l2?Py{DqgsG^CO=0pbdXq|i}!1cPpQFbEH2vD$Cey5=vS
z=w*`yYU;PmC8XChBnCasW4T=c4ALQha%Q^4sS97hI5B~r15y`+|ju2&sUYqz=1x6{ZOdIn-XC3f^7a`+1u=RdS<((1Ct
za&CD<^W$}Wo8SH3|5F=rtB-}@{Qe=#Inr&G1TL00wu^1cSW+s+&5Sq_!O>$0)75Q4=_s-RjV(yFo2
z!G|Vw@heb)e>eUG*%Ci|7ujh`I#Z_g_d;Ct?yxGdTv3CsixKx&@+pzhujGO<{?Kbl
zw8gL2>j|xN-|}HUk#fc+jz2LA58Tr+@gcduV;3ykka^}T?c6n~D?5kGTkp%fJAwN{
zdJHRk@;XWH%@>?@uKqTCMimj;WZvaH)07TUz_2nKV;dC1zyy|SNGjRV&UpTUKgxB4p8HqJ1*aK7orG+
zHrb)7{jrn7$=|#X=F{yFlxmEWQ6o5bo%SX;l%QO?6KM~u(&YZ#?eW$BI+U;iPeZ6kH^B#A0f!dJ#}Odl|L5d{iv
zgJF0;cMZMMIMNw*U`(2op(kuS$@Mq{wVWI57uff8y$52tVKB96qKppfjn%!?uFU_I
z@n%ixe(nd%$5NOFHFl8_azvqF9rkZ%7f6J;Uw0TIwBMwlN{Ll;Y7?T35SPb9{yf)`
zQC+=y-YDB^ShTctbB7mlpg^?W)yz(tRVz$+$?J*IvLHQ$vLy26mwCs5=;5EcsWrRA
zC}q?b-97`~V5{ZC$q^O2(!@`=@asvg@{sv?y$KK~1lET%W=N{h@xu3Ht=mp%XHXfz
z%Y>^n9)u(^`TB=>D|9e23d(mLV0H44*yTx@W6I
zFZy$vH(1~1p&=}wvx*|?+7B^UEx2W(U1jld7H>U;*ks!P&)}Jo;tayhE{YY{uWB|*
z5ajXsdiEm=?H0UV0$y<~#8!I>%H&)78H7w`oQviHtc%>6qO>vl&WB`4#5hN+T-2RP
zhjD9Adz4{`!w(K3w(lsa?fUWBA6ocxaoL44mc1`7n0pQ4m_Op38M+lUMy437NP2_}
zEy0U!3?hO8o^Tcz)SB@yyDVj9ZmA4m#JC%!^$uZjE#B(2DiBN>l9YfL=-*)^csQ65
z1ozJQcfMa@X6*xZB4U2eK-Ci&f+EjqcpB#=BI}E&frVG$R~37p(`17;uouAcVi!B5
z*^tzj0-G?hvGztVrxD3uo8JBUe(27BM`cplTb!#bOG`;T{9^;FmD
zMWut^BBa+;INFcMRESz025Anp*yIgP{2_8>L(r`XFDr#8lQRqJ`$EX55xoXyFV?%`ZCQNB8seRd?BE1wI|}t)R|Xbcl3#Dw
zS%*G~T4$O&-`~ke8J(l9W_Mk2I`VLBEw5I|?{PY6GR*;>Q7)lt^S+fjDW=3-3V;QW
z@zoe(gCMi|cic|YUgTbkZt
z!utjN3nYp8?(0cc_fc+<);q#oe*#Qer4^}?S)FXTn1X5Ozuk-+;dO&vCFgHvowVN4
z3;+BR$m6Y(#}ovS#s!OcFEe(AUE=8C35bgtTW>%733uCK2Lkc{XeX*D8ma`F)$fS~_}J%QpJ4nAF5v0Mm|*mQd~F
z@88j99O)M4?J@s2Lr_1>{ccRHFn7cUZOlv9hZJjAh=u*m~
zR{t0Q#$wqM887HylBdT>UyH>ChOTcxT9@-4M_tZd?B^W2f5iz%?8ys9BH0^>8#XK4
zK=X)DtUH1&JP!q{B2DF4bw`(b^o17LlfI8-DHD}AGd^(xCt2rOD#M!`_w(phGEl9&*kSQd>;K7RTp0{r
zO7~~#+GI2>C+$5{$;3iS4dXrjJA#9gRSGTKZ7|}U2T{}j-3hA)$N9MWT5nCLL^UVZ
z_ROT{ZkZc)`YsSBaA
z;!ZhPjy~+XDA+i@NTF#WkqB)pr8A8{uB8b4TLne`4*6q?djq?Y$oIVzdvW$}HOX9p
zldap#`cpe9e3U#7)w^AnuU<+vv#0;)fGAR&T9mOx|ltf4DiXz3y#xf{3X)#
zQIY8!@8~lV;ER<}w>QZ8T3aKrz2lRL8tCiqLnhk5Q)aMx?)$?EK!*nNHd~{DLb@jKfpn?0qb!DI-wFcb|hOf1_AJg@Dcwt-W~D1Vah=l!hsVc
zQx|P=K}DZ>iEv}K4Mep9#Z``%iXUFfFf5SPh@;}XcPgqC{e*Ojb4t4?X_hzFc5;DK
zuI0gZQ-5MPKQJuiSd95p!1Z9q=xJnq2;ss{C_#)Kq!R6AJsy)1P`gy
zP1dI*EJ`VFJ2yKg83xm4gi$yXb-3zp_$qBW4q3gv8a*)uzXze(IG2PQQWu-Ky0K|%N%=tG))xQ2#P
zm1zm{oD11q11CmaAgL>!%%7oHjTL*n=UNy(mKtNVJQz9Q)>GWxmTRZihKR4rDqa}E
z%%gdW{qX3I7n?S1rZXaRD9()?K9YLtMW$KP)s!cloWqEOZmwqRjzR}OG|H`01^c_!
z2LSFrOaEIpzye6=jD(l0kA&20hf<$*q_CQww)(J|k1YAH7>+DC-x`jj)ZH2mY4%#f
zB=B`{Gw)@!zr3>QKAmbTK$2Ah9kxF(tPXbnmoBtO3b=*r0K3l;2?*?@Z5L^2+L6QC
zdW}sgjcVyvrcHW4(E7pd-)qg^wh1X53;huX@4_(Gw0Y9&m_8;P^9kagN
zo_aUeJzB0kRLXpP2!yo@KzP6T%5oF?pToZWYXpwth-Woi0VCIn!~Nf}zXLh=vvP^t
ziES$oKrN;#&HIpw(rLfa&r#F+Iq>nKLJ*64hgLRRrAiqHPG&}2>V~ItdwcNRs**yw
zIi=Ooa7zg37jztL3s67K0I@WIXW{Fn!{*N(Rc3se@CnURJ;ogim0@*5+Rua&q$(71
zHKZ-)f9mML=$%GN-!jcg+SpcUwQYf;JEyf5T{*hSRB@|$<&m`4?sLc9?dz#%
zW*0BV9W-ZyI-bC`buIr1?bCmEiNDRbBc=@LzjgS}y8l16U@Y_8Np&?cciC?ANSE)4
z$>QRk%T!mHga9@vE_mxu9vs>veI3ojV>Au6(xVwa(vLXM5DhhNI%ZTjn&$2@eZE}N
zHgFl10N*Tvc_8y3#@nxYIk)Pw0rI??O$oNqU$0cPA}4uK->iGo&j^D@DpM^CbUqSc
z-KGpe?`;N3ybrfEi2d5Ls4!;ZL`oaMQ7pcEp_TTixz4T2Hub~oLs7m5BG1$G*z|Og
zTPf(zg*dOX{`=v$M?POxG*RyL-`uu3)rCBSBcafB=x)m&;}omlDF13I(@on}@aY;7
z!*lnhz49GeXi*aPaTn5C^5Z;vuGme18d+95HBM{q!W<(MCFGpB<(EOY@ThRFB}0jT
zD=M5FvpD<~BLMIE8-OceZbCo4|AQTQfkz{GcZ(n`Lb&pH}4)D_)rd#o@8jT*{RmCvF!
zd<7kv4cK&aJsJu=()13(T`P`;qicjlheYJr
z-N*I)Rw-sj?ec>mS}Sz$LX2#b>gNDx5^;*IyhqL79tDa-lEc_RB3eFD>)TP;AXs7g
zCPj8~y%=+?P(yaU%9Yro-w~@{Ipn11`97Tt+D1b06{qaW<&!D1Oc}LKe&;iRK(TZblW~h`&)U8_f&xq}AwV~nXnj>hY?gH-jtk0Sd;eAz`FvD1
zC+BB|hf1UUc$;HWLaTww1?xIWdvDdS`C#V5C|sasNe3^uT3`rps5%SZ_Y((^J>CDTcYL
ztcay)`%E;MTPIRZUE9PtC-0n|`nfk>ZpQn>t>fpM_zU{zdF+eIuN_fIgqY@uM|2Bs
zA3gBLp7I)*RRSG}J!-pq2Nga_H-91T3$3T$-&p74el)X{_3XUTV(&-X>j8qYU7iP6
z>Jzbl?Y*ShdWm~O85I9KgxlW)+Or0A1FCwbH7ln;%L&>|E1pABMfYOnB;A!O6KG}~
zY?NJH7Ys3tDW>+%`|*jB2B(iSemKGr;i9ms0|l4gujT)26FP*9BY2K~d-)%FHcQ_x
zZsqx79WvTXnwR}A9;kZ>X&8gcvSI=6!-hrULd?GMd&^IO3P4R?!h|y%R3~R<=eXkNk^0HkYvOoR@ks4{q=h=0>6aPiO^TM(Sk~_6&
zvTe5d{r?a-qlJWY3;zBWsd@SyL^nzi|3!G^k*={6
zVyiR2&
z;nM&$M_R2^KRl=IU}NO&=&aqS3OnR>`~c83#&tuQrHV6!YkeDN5$>tks(+m#mb?op
zaatiLlwuAtiIaEuR_=k{GP*nE9blP-r(YfYk!J?cA_cmTm>{?%iP0kEBT%lvw0iSe
zaR9YEkejzdftdV~E-A3w0D7;y|AdtLlRiq1^^`z#!{sEV;Z3b|9H-^`P5(C%^(Yvr
zd{tW=F(p$p`A=lyv15v7{XbybI&3mD%ON+W=
zm^NKG>xWV%mk8|Z%>qKCj?FxSx@z3SGH*9p@{U=)l}xUmd>6eEI*{Fh9Z`0aPqFQ8
zRwt@r3yB#s5OU`rGA^uCJ{Y_X#tw~H%jmNR(=_Ti+3-{!7~_i7-pB9fm)z6>+H5><7X1&JGA&)FkIKm`<@)Y~;#!5|RxGZKIA>2sM=er}2hFMn
z4l|QR_!02J9>$Bf@nf{qwz#W(E`_82L0!I;y+@&-WZGV}T
zZL3N_t&w-ds-zoaX_^#f>rOGT!*Oje
zq{ULN*Zm4FH+UNg-M5>yk)Tr3iEV^LmW;>qR8;IF6n5rgJ@28wl2$wK+AiX<_>?f)
z(c~a?C8T6*kvz?g74Rm{z02m#%MM}(qSQ3&U%Q`$!z^$`3!LAv;S$1F6uWauX{SZx
z$))@DJJEkO&kwbf-pVRG8(~M;;sf(;FD~?YE>*6SS665WXZB+URW9T^9nY%o=~l}I#kLu<(&P@ZhCd01ZM*&#P}78L
zd&HBc&kt8SSZuhA${NZDfpPF!K$UJQ@x~+KpX{B|u36*3-(un5q^3PA%o=WYs>o{N}
zOLORqBVU1o_x`m11;sB+zRvTYC2sW=uKp<^bnFBvY3N0gV&G-Q!mx`G-50paB@J2!
zycTryjEnTs68zqpkrC~TL@{f~^th&QYMv+WIpFRBXsP#}Gg4A6-vP8(cj;pUQs#t
zlcmURo}S#@3We2q<1C(f%e3-)AedF}zOr=moySAuXC&;))4|9H12Dye^u;=%-$pCQ
zIk8aLQhJDk)$#Wb^bdS>$R@wC_kkNLy~U7IQX&UG3dkw$y{7sfXB^CIyJRaxjQa_{
zZDuDEH1;?YO^Wt-9^d)-kU5lah5w0pjn%^ymRYh|L@C11KO4LK1+r%?eXy)hmvERg
zHwlQ2xEOGue}`&oOQf%<6;WU4=}7PC8#jSeXWz&Jk5y^zx{plL>vjn!FT(SQT@2D=ahX?A^zrvY
zkG6x;J^9)cyy;od*qejger>PEuZ3V~)XCM&Z8Lue>u1%iUEO|579?%6DO#5U)7ptZ
zEvb%cJYZBcA?|}krQ&j$4};84GGAQalThp^r2=2Gp;dBDu?S|USin^NCMcMPPi`R`LSaYKsSu<`hj=fn;&@L|94hFSU7)vss%UvhI
zLit*)FBA4YU<>bw)tiKwtc~pdKlbZT?zb6BSJv;Og+GU63B>1fluzSG0dgf%()Ft-
z5k{$O>-#I&dJ}k#AA2arZu_tvBb~Qx(k=M6B#xMUt)7)VrcSKkw!VA)?ngWW=3n4n
zAo!{^?j3d`L{Jmsbbmh{q8K8|#n7yPeznYT-qq?Vf%&6s{7jycp*oE3gti!B%Al6H
zBDtbTuq8d~-@pu$N@RtMy0T=@JpVlY?LX-CT&c$KOMhZw>qClMGY~4tq<;8^&-JLs
z&%;XqQW*HNK2$d6_@%&!K!0ju3N%b`!vWQwFtEL*{L^C7qa!|Oc*bbUsi11Gv&!(>^g?SQJl3Q$I
zkMsOjMEJwH@U%rl+(7{UM{JuoW2UnshP5w{Auh$Qx!E)Ye?D^1M~N)Kg;KaI#Jn?
zWm0BkKk=&Jt-BdrgW(O?XL
zTX2AHgQGQiwT0QyWoWzR`PT5q`Cxp3r=o-F*f0hbjR6W1qWkm#$XM==$e_VdNvj?e
zMG6ZP%~4xmqz0BA9?=?8C8ZWt6^`u3G6udMrc^()=$K1m8LXlxS+3d8=wD*EQAO98
zr^-?jC*1M!H%gHh9qVze_3^7aZ1jigzsm?(JV>rn$1jjOk$(A^VHM@_5@fC&S((hk
zd(o12E4%fJRq6cr$qW2OW$
z4Mn9n>}*-&t##31q`kr>1ob95Fa4DkumD
z>umW2-33Wj=O-(m_{%h_s~He@0LaCJsgP19cOLmf!PR0SU0VZJM&=rax0z~lf;Cz0
zlYyyKfwS?>MyJ5Rb{GMjg0SwofhNQh4}(WUWLElVWv6!GO&2eVUR^Cz6vuby-g~}o
zUN{eQQrvm#0zBRHuBW1opje8`n3{3r1uHegG3C&B)YHjWyXoR|Y-Mz_
zPv9jBMR+PPPQ;^B*@!uEJxlo>c^bJ^#Ii5ZjN;9%67Xv)jE)p&TqUR@%zRTgT<~YK
z?bC|vg=jRs(ru53}_s^40Qkk&Jn1nlXp?)T!cRGdSXn
zXb~On-tT`o+UxT1OU?Mg!VWksBSD)jY0Tf-?&h?g9rAUHO#70eSl~)|Sq5ROI;viC
zonRgs!)Q1n03AuUIRq-Y-?|f7VOq5J4aUeYKp&57C1_QCa*L`A7_aqXzwgndUCzOQ
z?h^`;)aR5T)i!V_V1E=jeUq!1l3*~N!7N-X+6?$J1=pQbT+GX1>AemvC4Aur{mS3+a8MO|dgt%Hk)<+ynmCERKHMwz8Rl
z!2O$rSEa_^fFGhf&lZmupy&PJTFpc^oVUm*qNrb)jO%TfMMvAMAwv^$W_Tr`hzkHD
z4+YY)?I>gM39;Ep0_jKtG4yjhYzC;j}4AoqcF=YX@C^4RB4P3XmoOjJ;
zcZB&gH?7K4G#&_63^}8+RK1^41v6AVnS;}YBqwc%+E)*v%s^%|br&#n+~RFNo<)5B
zh_g&QQM2oKz2Si-{3>EQ2DHrCe8E5fyYaTQSP8tb9{uA*!a3i0WqpX@FjNHudFVY=
z^&wT|S<6#!p9+akitZo)8t;GePH*;9x)FhZ|I
zokr1ms|=tmxBUkEyy<#iC}0WJqOL$Sy+=RqlhycDZyeJc-|I*?r-hg4BVX#gpW4A5
zq%k+TE{tN`O=Ob+|50mIeD8hGbvr}gtCT&CMNqFuzzyz>z5j3NBx$=ZQP_1(GLwUCjocLOQfrm!O;_5aV
zA;5(xc2XQP2=XTtwlG1}Q
z%29U4Vroh9IEcFnXJZBt>Xs{NX}8o_O=ZHTkrv;*VlhBF=2d!rD>wPE=fOBnsUU$M
zSGoCBqS!r5WI`>sMy%@aH4i~7rHnCl*}8tBHgnk+{2U{hA&%=8w+pjsaoGixojbX8
zL=Lu`Wv49=0=-chgL*F>SMxmh$O-~yo6!<5(0wXtNr|x!3a%jFh|&qHD6fSjUeNSo
z3g<2%J=M&}82DvS8wFi8j3b_@!`L2vJ(P~t7aV#1`lF8?Zh-k|&5Tq&
zE-~Zj%szubT7y7X4K{l(srp|deFV;F8`}uPlsI4Qy65mV%K4{0v(eE{gh#(Cf_OKZ
z=DR$bbU}?2<`~KM(4`6(;jx8DHq8;97Feedu-4f}I2nhhNAoj=j*OCswPBjGd)Krm
zuBhmANu;5-8v=^xQ2zKR|AtoKP0
z_rJ~eh12sjY|S2mkQH&1M&HjuRp#l4#5D5=t=z~>LOz~_nDUU~MRX=>8c?a!E@w)P{uvsys%G0$_qX+J~
z#pdG2r0ymfgKIW#vXww%W$r>lu@`Uokx1J^=zDbJqNaI9LgufUEu}9^m~Tt-6=TzS
z6#PG7t`%t1+r28H*TnYC^R86E<2L{{8T=;h(9rlZtl4(wf#yxGC)vV7JTF~DD+MOI
zQ5+!^;vdX6bFyg2M?$y^cU#a$}!-IM*oP=CwTI=u=Xvf8djolXv>(287
zm$wEdWD5(Q_3aR1xM&?qyyL=IVe7YHW~{SL`>%~GFiO%P*6oi6$DfLD^$g!>ZtURe
z;%K~Q5@?;+30QK5HayE>9ulQZ{lUMRvio=zA(yiYJkgFp2a0EgRFL9TAgUXbPp?{3
zm>mQQ*jBR`M55hx4RZf_&sWx;`vDL%HegdXvRZxw+$9sfAfOvpipJ#rQye1@5B7|>3P%&kWy-WC9
zv1X>HUX8=mCO4;ylo4enmnlfA6Os`W>;&%FfW5*MlmeX;6!6zYBCq-HdsmMg?lJSp
zu|=5;*J$>rfj?U0;S%rpPj|P|ML-T#Z1Yqs-y?vXM6u}Fa-_jDx+GCR+!I2i<85_^9Wt9YQJ^0{5D(`ZO~P-+Rs!n1G!TkeWhxsZn`?2
zB-53@+B6?%WVK}XKaXU!%X
zHkY!(c3yLK)Wa<;*OX5FhWQFw{$zX7Kzq^y2-_Nyb*A)ff&u&37?DXrP)A$oZ1l6?xGT(3kY+d-KW}D>>fRY-!
zWa#UfF99bPVeB4pe0OXI#tu)~_p$8U<|j<_ou+N!Hg$d@S4^{pZLjmlGA2KvG-Iyz
zU9y#X^mH^muP*m*W##L+G>zPHxeOm|JSIT9F(^6G`WAXmAY6g9tim5MRK
zy7Z@@2nt&6#Jb}msFKVdabUrJQN`VJ8d0Sna!t0Rs@-c&eAIf57#0uVGeS~UNV|jy
z%L$QBw6V2`wOpS_<*A57a~^J{6!Sh3Zg`f7u@%pbP>7)^BC&J1EuNqFo>E5#Y>ajw
zG;&@o&@*g7UPnLXTPy?l%0u@l_sFe~`Lzxi<*L=#x%t{;NP(naL7?_)uU|9gwxa~5
zW?F4Uti_37!3|6oF|kkDP-+S_(^P^PVWGA`J7ZK;({N_0P%FS)1p7I^>WdB&Fwqgw
z$s4acZ=99Tu0LI6COEBP48vPqW7dSV&)%|;ochXA(ntrJ`W?a-zDS1oAKa%#Sk%^t
zO{r`@$?rwrK#2;)OlvT|Khy^YA|5cWg!!}#F7sb)_sx+Cy%kaeb7y7TK064cU37)j
zRxo_Xp%8@kTe%Y+dkR(-)Oi^im3^E@)xTu^UbdsecZ)HLyH(F+`w8(1YUaa&*T89<
z4>m(pdD50V3Z*iFXgI%bI8~3|q|lpmelWL@<$ga@?vLz#sX|&w80Ge;6vm71idjat
zXr7fXXpb`R{QG(!+jK3(2T)MkK#?=MCCz>>ftj0v9U<=*V%NFuuQpjiRAQQmW1FrG(5=yOedvAfvs3xm%$KZ3R`|K3j_}`?0=Ci^-j!
zBLC^>LLPri0F(VFn@WX)P#XRF=L45-x$4Ydn=4&+FSnq3Yc*z0$oOeA->Grwx2pMy
z$B&)p#h3J0nxYCwnrdw=;k6l?6Pz03|Y2#}!
zf+98)H~w;F;BBEm-PYK8kG}z5XPnXGyk=e}3Ii66x!CW2Z9ipW^hW~UGnO%&8qbIa
zIBdaN*H~*dbI76F_XQzRybT`a@j69eAOyB5IuyKxDq1d*wpQK0(HaX+!XQw1asc)?8|U9r|)}ISvNhv}wzoJ2(^>wqN9+G>{xZ
z24H6$oaCISe&AVs0pF*!4{?a>0v$#r0tV#2U20m{B!a%A=NbcyJHT4(a0HFOg1K^*
zo2GpRW~vp3hb)+L#j=W*gT7bn&|)=hS6iCqi`}+c5-~RpXcQBHBD^em<@dLmCVi;i
zLvNS{JUdk(el)nax02Sc*@QkDaTm&^#%Vd)_@wy+ct)Wo=)o0skvq6F`yinUWa_Hm
z;q`dryDY19Ls=^WYr-1u-+;`Lj)K@w4rUNKOxcC3Ht%~NKAHua^aW$k2zz9a^uwnO
z`qRje&<@IS%$SW=c(a9dh(MvQ6kP2jn3Z^z=9)qhsiqwT_NrH>Dwsv~RNK+^eMP8w8eRR)
z2%pz$Q}mV&M%R;JD%B54CI3;SMcaws}R;QOMk`|QY%Rrf-$3Ce1&4B>gbB9`oN6
ze`J3?KQ&%LVQH*{P$Arb`JR1QzO!sOMJ2n2LL$RJ;feg39+SZ(r9JVs+vFSzaNEa%
zMyhYNqTnq;X$^5o(G%pBWg%Ag8eMdTn0_@&>`O^}KXnwTuoFcz=O{mceES$8<+J{~
zU?C?VzF%nO&mJ2!-S`J+AC)r?fU@8a_(gbU0J@zH?m2a2QOREsRV4^
zy#5B*XO2T=YKJeufgUrhs!=AX+q53fHTlKt`l}ec&Ez~IPxAx3E_dNz5xO{st^gkD
z8>Hf5(2WG4Clmh$q?`$Z?!USaQ0#=%W?qP{>)7lYM+iaYbgnYT6*ay5o`}H()#wI(
zst~m%J|WQ?^AI(lIotAm`=Q&3nQ4&EnQWQ(Vnb6ayK4{|zC@)EFQ_S|lG1sG4TJn8
z+W9lzAZX}axb8_RP36g&@Lrq^B@;}WpUDNDo)2-h-O#kNsWG>idLk
znzq$+o5@Lxg;(eSTPBd#zRk}x&16-?74nm+KD_94Yo<%T~k>
zobdJoUYY=KzC8?~S#?6CX3p-?xI*@&rP0!9&~niC2ArLP&wjv=wRAZ?{Q;)tpya}u
zk6U64R*uwS3AsWpVD8WIyFM}_Z~Z9jFpheTyS~gmS>X5l1_ZffDd*$GEpr5wtUJj~
z6dZYNa3ld3BIh653nMoVb7SMV#xza>HW7gScM}rNT74hhFEmki%excqLM@=z8p_=~
zL#Y_qrW|Juq3_zX$~JX?AMjF^pEIA%;jB_slG-R{oIbUrP#fJ1YCBp0F
z9SX;dgFfEY{a)>r#&@#jq{+$~ihBI%NeO8(q?;;uB4JxGJcg@lPhTxo(rsJ;=-9%m
zJj%()V55})?@BXmPj$MDjDK0fn(RDKqnK@}_A84Ov=0%BuzPr5-R~OtXdjk;s@u0p
zg(gR~Hul=JYMuRLbkv(%YtRDM$W<^Se1J0GsGx8CK#fxJ)@Hq(Gs2SI4pekUJa_28
zfL%q&{Asv#1j;p8xCk*lWW8gbKqo5ho{F7oH?v2LXLih6`KIrKd5*PoQn!vB@w*
zA`r{{Wkc8VJa<1FjbcaoINHsnLI**+$P_Z78M#@^*S$IoO|-&EVco-pls0QG74|OI
zlffHG{Z~vVOt#qtpc4C`x%W#raa%jh{rZ(Y9XgFde&%wGrbnQ%1&l*Xs#Z>Aqck<3
zz8tT7MU1%SiUGe?C3$TNZmL;fJvg$mHVbv_ondms_q?>$E=i(+Mbh7ZK>YTX<=3uW
zGaX;+T!+x5lEhgQ8|V*X8-_RSoVf15!7i}RoBD*n{Er%+0_nT)^6;NjPt1GoQXXUQ
zzAS_owc^!^r;E}zL6jV6aYbiS-a_G>v~%v?r3X8N!v{g>Sy15DX(^Sm;B+++D&kUJ
zF<&Kf#p~q&E<6F&OSW^nUc50VZ#f%p(YrO=44W@t|7h$!3ghFG8}&#!{tw`9M$i@tej
zNrZtl#3PY;{$dfmlGLvCOSS_U1J_7l`wQ_A9ZqpHz)pP{UcXVYxJcMIWX}J|v1IjN
z%Q#CXXr|CdHW{XCRE`WD7-Qvjwaf_<6iIvCpqJ$x^*!bDSR$3R??=LrHM
zmxuYc#kST=em_}E)7w1du4)7Ah6Gf1WUR@-&lsHtH`SO$`A^;bnEEN>EipWBkI|hH
z++X6-olglPNX1MY=kBe^EJZroxg3FO1+{d6B+)Q>dM!nJsVNotF+=K4(0rb1b4a$3
zSw`kC+d!6X$s?X8h;$uXC%7c)iRnS@G}&)4MNtJdbE~qj8dZ}Ur3nn0lW^bmiv<^0
zfCq)p2^$}KWIliT0-+#X;%=-$Y-AK7(qkYRIGIN3ad1bx&WNEo1yzRe42@{Bw5XMC
zmJcHP1&6*BCr(B0kz+*nR$8wh*KvR^t(Q@Jy=2%sjro`@CE7riKv(BS
zKveYoCL8hW{2IfouILl_fjsd~;mFTcly{nyabg%*i0V*cP16_SUE7{*PmM305IJA@
zuW~lm9oyv&=4ChgY{{)&W**#cg6@!sYbp()ttXy?S!W1OVJWs208p
z8N3wc`lYk*$k*h;b3Sp4pofckye(N9C`*0TQz%}!+F+{w2Ht_po;7MrdNcI$%b2u<
zcvl~fe--U+qxdeoDBewu61lY<6G-Nx&fvub9@<86B1F6Bfw-pbS<^!n*paBv-M)4@D*V1bNB(C);piu;{qF|k`!}G&
z`8VMF>B(bh`8R;7P$V$BUum260&5dbHF6&Eyx%>0Sf4i@1;bZeHwI;9zCRs+B@&+9
zFMEO1CxvinWiM+->Nz}cF1!N0@0!gw?R)UyD%ETD)93{F;O^?_;pG_zYFN&O^d6_+
zVLai0Un%2A*oi&>YmD4z=;PtD?yZ8QKdb$;x~#w_lxO~qRdhK~fi((QYg;06l)m|=
zHv>7F@F(`fz5!JeQ^%W_Q!2)#Q_|F26V?1BpuV%WA=5*>8ktfkH6DG`GZa&G%2xO;vLY$}*4YfdGEy
zYQ7V{xa~>#23)}#@Ijwa+|AOXka7^CR%*WN7v!dd;g^&e7=mJ65u?>v^fT?ZZx
z#lI_-TgI~$bGaDd9|oBx4_JA&9Xejeq6@w?SwrtkcYLh!C0h{>9D&E@hpohvE@zOj
zcd0S|`aV5XEyb0~l@ut{?!;ihf-KjAHqsk2#P+eystSgkm2{wUc}W?c^a3`9*J{K$
zIp=5g@a3@LVgt^D+TWl&hFu7jxGy18jC57Y3)b85ckO{j+hVr`
z-nuRaJji$-4}2#0DPfqW(06R&P{kCBTokMhqzeZIbTl+e4V>6y**bjhrd{g`Gntr~
zYk!bdiwC&>3j)*J)@ClfKc~l&UF!>CwVu1%r2GNeE@SBQeM%Sa6sMHYp2#ciG7%CF
z1&hV@_%Z0D%ze8eDl?6|=6w%zt}-ph-^I6K&`)|P1`oTEDY&o*!=skG;P^g7xhE)SD%TN$%JQl>sp;a;KaBtaEl^mK0B?CXR=JZ3qkFv1&MCHMKR_k4$A#@0b5qnd|
z0&e*I2k~7zcY{XZ=Op}E&cU3
zL8!_kyOhl8XGPU6A>KGv%oZ0>M0baJzx2}$izmn&ZDHj?_gZ6(nCao*{DgVGVk$oe
zk^Y;B_PH_Z(N%96!f^(%(WW?R+&d7IGT^90^l(1y?Fylv3>9oUs51NMXRLT*VcF&!A%_84G44YgUPAFl5bSb^}`ke&5d*_`5tRd&EzN{f5TfQttC|kae
z!tF^%Pew6(_vmp9$Q2WA&ffMu*a%8%R_vD3&|+BZaKeDM3e2KhF}Wd)g~sJL|C1zo
zR-B19Eg^_!_)&+0N)aX$dCdoA)e($e$klw-IO78)>dq>}wu1Q(*8K!-7%R8|f^m1P
zw)TLU{ZNsM9t^t&B{1#N&)3U<_QVcZ?zQ7x=giSFOBaFf-Wd*X+cP(d;+RoOFr~4d
z*YdoTn69&Qjs)woUCT&gbK~w3UUq*2yhPR&L8s_8vB4>p9M>37`XB%RPaf^W$Ac^x
zIbP=5M>E^(pX75`8ny%aK<1b!Ev*O}7xGvkQir^X6pf(LrTNA@IV&D*0&-e&L~+PO
z7Looiyy2;yWfv%4QX!+6*AtdXK1)kJ!adik2RQ=7F9(*_N_$Yc)I$d4`pX2u9wFi3
zY!UBoL=YCQ{F(XvHWK^wPLt>10`?v)Lu3a`2})FECp@uIpo2AxeKO%0n#P2{mM|Km
z^>inFOWjlW_$w87Gr5d4STYQI);S-v!x^a4fGtWz2SQNL-y7mqCd13@uHE=u1nWzS
zYNu`QGJq2nQYyoARVOVmNp>nl`NqyW23h10&p9YPhgX%yXvpa)Wh9_zhO*>`$}5Yq
zJGk%|q3YWGEgPTRT5UO$B%u-VjbF*DL3ZA;{MrVSS6^cE=W+&2CKAm_G=umsC)w~~
ziTyUVSSujjGb1QlM_K4|6mhCL8eFb*9*}Mv*oT+p#xR?s+4YS-`8X6^;jzwFQXxWu
zvhL&U%8{bpq-
zp`p=7oP9r}D;&mS;Q%NrwJTvqbjMFjCt`KuD-pIvJ1C#^g*caH)^FVnCu;n7_zuwr
zyS$cOa2}+;6>i*Mb=slKwY%2L-;pI$w`-NEAC197=uue%Mzm}LVhcr6QKV~ewfoPy
zu1_st(v!h}!r|5mU=R`L;WQ#pr00WJ%jxcYL{yhA1>n;?z`EPv8Oj%HGf1i6d7|k*
z7&Tq3Ja$W{$ozOhaTz=?3DdTwn35&LD(G$KnUJEzRZF}W?632h@f%Pqax{tpzoVh7
zfj<0!eF_si0lGJIPbXUbYa=h^xMeIxuq-(+AVjofbpxzXCRv63?;-8^!N9Bl)?`5jR+SzUe
zg}hGv-{?OHk^*7dZ_5Qq8IZkdS7X?$xX60kKNQ?7RJ4)stLXLzH|i#(d`HjNKp!gM
z4NrEQ+PD?fQ}MRxfv8`aSyx3B(B|=03d=N*nd^O=-?E^v-gq?O5*frVHky^3&(op{
zE$QgmJ@#FMCh5T*$5kDU`gMZ0mWU4uY#KqyD^3z=`D})Q>S(h)1wYY`N$rbqpeFFk
z%X0EEEAvxFH?L>>tU?^(+Fh
zM#X1t{?1P~l=JZv9SL%LGIY&@0f%fT40E|twy0@g`VT-DSQQg@A+etAw7R$ydt!mt
zaVTM{6PNo`@MmUE(4C+@2E~_a8RX%+x67YQ=&h$Mwg=(@CLRbyemWrj9;XVuSCM}n
z(!ES*bdNig!qCth00oUxz-}`G}r{
z2h}ny^NaQM@jQt&#VwA67otzm7hjT9`1LbYqT6@6lz4S<{`o7o^0yQtT+nw5X<+VL
z)p7Rd;>?3YN$o$6yq)m5`agQQ@^C1-H*8lUOEE+CFVSYpzDIV6#u^#RSTiApWEUZX
zzOrYGC1YujsBB{rMVc{;ean)4#!QTT==)7y-}SrhbN)H+^`7N9?>X0Vo%`I+dqTRs
zoe`KC;(+Y1PST&<}
zYZl&c28qujhocE(J>OjkWjb$uu8YsRwXtgqx#{?SrB@;E`u47!C~4GN8;amZZC$vz
zX!Wx95tDs!_u31TRe_2L&ILFgvW;{(wyuk<9J^+#ogB(*75d$1tv&VMH~yjv4Bteh
zW%^I>?7NtwtrCqs_@1wJzs>Tg)|0JXmCaFa{|s|G4M~h9tm*k~Bb7BQZbE{uy*l`R
z$yMjP2uxPzs)9VXIZ|1;+o|u~?dn%rL-_}N1
z(nB61t&a^~UyZcW2q~W?C-teu3&-+W{w%*eC#%t(!BD0s<;2$vGlz`)c-lkCNUk($
zU41^E#FUqQ2b52n-_}8k1}g
zr#R=fQLKHv_G{8U!p*I_cN?`%oeZQ#5ngvh
z4(;i-(-A}DFyFO34QFw^p)u38?dUOR5INh~#o)mC0Bi?b@lp%39UJ`-9eVfb}Fw#Sj<`j{xf
zCDXNKguj;H8%!uJ(sd%=RKfv+HdOKEt7mtn8xrdGk`d-Rt?i~pRQSX+Z3XRh363Ac
zt*jv~lbb~+?Qu8a$V8Amn0|U2lc0yU7<{6
zT=$#UXG3E8DS|UH1-7rFTVVh;VOAb~P4x&J)nDV+*!#%h#B@bqQ~>k0rUrQx(&eV?
zQ(ciTjy@=dzZUkzK(zH39SQqIV9;is+a4WM%{B~GukL_kJ-th#gj+X^ASq};#?9}_T)?TSIFG-#EKPB*GVWyN+e#a^@AtbaEk&XEH3Fn%?tam;&R
zo-XDhDwg?5lAV*+A?ma&Ds;%qZu`_B<@O}*a-yT7V}I7ABO|qQB>>iE!J;f6#m)i0
z``hCE{Dbz{JDT@*dfMrM(Gn%A75*7liOq~raukYWXm*={h3|xQxosr=yi6h7b!asA
z&qa5g4*<3%6%f^%*di@*Sb@5R6H|>J*nN#ms3a}(f$sjY5;@W-rsP}lJd46(7D+H@
z#q0-(D)3uQzN=Y47yXeFVbxE@0>$%aT9*b5LoZg9DV0wr`)V?x521-Ll|sD6INW-r
z@qqj*>RNH1ckS>1Q_t4K(fc?#rad9vVN=I63&O~KE;XJ@nmM*J(7t#iTvdIvmi9W-$F<@(~?yA2R5d*8R-MN
zX_M@?`bItZk}G_eGf`UwbqnJ&o}m<(;Tv-IJ$Qsj1j+C_)u}f}KQ9ZPFn~o81`gsfKlJDO>C~of5HkG?P_6xQ~%)SS=>_k|K6pYxjP5
z9f}hxbWRt8oqV2Iy?x3d^;H>sRwbkEE>!OHqfwcB{3$~pNpDT^2KPFg5)=%aUa^fk
zITB4s{hgibJSxIj1q9LPE_^7|Egjt(6Wi3ge;e62l@?MHxC~}a
zhorUE0Hao_<^(wIrCkC@2F_%C27uH&uD^!I3M2NL64^e5U(cG%#IW>T9*JH>#t<00
zdLiUzV(y;3;n%{=Nb_`JXXx4)4|`8*?hAvfN3MUX*UYKA8aX$GiAXeHHNwcgWl_4w
z+7)iLRZKz5s^)s0NaOryrXkV??!CkKJBh=
z7j{a;v^w*F4~M#(wj-|zzPhVW|)
zIgZC%r>c4~fq9@*2b|lic|AhKrh6ifO4&fZbIqW@)%-jH13MU3P?eTrT3@
z?^X?W!Rs96g_&xWyWDK6MajMEXZ@Ve>m+{X18hiUx~%p+Bw$QLs?xu2GPFhf-;2LZ7dQN8sy4j}@?rP~&*29qm2nMw
z(=_Tqn}likW~8a-pl&f?lt#wfq4o?F5AxJxpCWNkDpWwXK7Xv8bFfrDAtR_N&7SjI
zt}&ab`HryxWCiAk-A$Zw@L!o!-Vhp{t*!;@n&L`dJ2*J3&JmxrcnJtdkJahyJZ8Pl
znH{dmBmSq$dh5tALz2Mgi$P?|x-QP0(PcdnGOT-tvR8OaeQ4)cK(FP_@ij8K^TASn`C7ZGxHHJ2&-)=Kmy4@4V9bM-x~p6kwfXi2q&j
zZ#>Bv`4MSl+N9s-m1oAXZp$D;rSZdDD5)3cPkd^^^*&ak<;%LW00EPJXG+URom^ak
z<<f9_vGW@AufcEUU@D8KupyKCf0JE?D;CFs5A?-}a;r=J)c<{re
z%18re$}Bb2iRSk9!suwYE4-D47%S3zjO>f|Gkk;x8OITQ{s6B9TWPkDRLrVL6
z5MY!$JQuMkas@4St7+5N_|4^bjQkFXr~I|9qaPHXCA7tO!
z(VQPryP}QHNzkQkB$L5zXKIf`;{7&U*4YasRO-v)TT<PRT=MGaJBg8<&RCJ{SPn`8=qfrE`o3Vuq_(e7Elm2B|sh=<>WgTU6D%JOy4B
zG}Ujp@u@fiqnt+Ky{lwxa=AS04DKxB_f<ElHAvioalztNix663;Qc`3#|jFI?^HRM4Y658?AqwcU9YiFiz#9+$2q?tvw9^x%K?^$J#zU{G91eX#8
z1_%dBKqy*s(I__!7gjYo0uSAJsww51k&gp+@e6T7$^HhW?De>;1v3!{U;uo%Fw_TgKnP3
z(vV;(pC^;>7nCQTg~<;1T!v&7bsiTaQhMgg2cVg-rGNh4!nR*`3zmOY896lAWJp)f
a3WHyTD-CA|usU|Kbu0oHhaWTlO#BaLemUv@