diff --git a/.gitignore b/.gitignore index 97951c3..a78dcbf 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,7 @@ coverage /node_modules /out/vendor -/out/assets/atlas* +/out/assets /out/build.* /graphics/**/*.blend?* /typings/ diff --git a/.vscode/tasks.json b/.vscode/tasks.json deleted file mode 100644 index 7f029d5..0000000 --- a/.vscode/tasks.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "version": "0.1.0", - "command": ".venv/node/bin/npm", - "isShellCommand": true, - "args": [ - "run", - "--silent" - ], - "tasks": [ - { - "taskName": "build", - "isBuildCommand": true, - "isTestCommand": false, - "showOutput": "never", - "problemMatcher": "$tsc" - }, - { - "taskName": "test", - "isBuildCommand": false, - "isTestCommand": true, - "showOutput": "always", - "problemMatcher": "$tsc" - } - ] -} \ No newline at end of file diff --git a/TODO.md b/TODO.md index d2b286c..20a1d8b 100644 --- a/TODO.md +++ b/TODO.md @@ -94,7 +94,8 @@ Common UI Technical --------- -* Pack all images in atlases, and split them by stage +* Remove testing code from optimized build +* Fix alpha being altered in atlases * Pack sounds * Add toggles for shaders, automatically disable them if too slow, and initially disable them on mobile diff --git a/graphics/exported/common/arrow-down.png b/data/stage1/image/common/arrow-down.png similarity index 100% rename from graphics/exported/common/arrow-down.png rename to data/stage1/image/common/arrow-down.png diff --git a/graphics/exported/common/arrow-left.png b/data/stage1/image/common/arrow-left.png similarity index 100% rename from graphics/exported/common/arrow-left.png rename to data/stage1/image/common/arrow-left.png diff --git a/graphics/exported/common/arrow-right.png b/data/stage1/image/common/arrow-right.png similarity index 100% rename from graphics/exported/common/arrow-right.png rename to data/stage1/image/common/arrow-right.png diff --git a/graphics/exported/common/arrow-up.png b/data/stage1/image/common/arrow-up.png similarity index 100% rename from graphics/exported/common/arrow-up.png rename to data/stage1/image/common/arrow-up.png diff --git a/out/assets/images/common/arrow.png b/data/stage1/image/common/arrow.png similarity index 100% rename from out/assets/images/common/arrow.png rename to data/stage1/image/common/arrow.png diff --git a/out/assets/images/common/button-cancel.png b/data/stage1/image/common/button-cancel.png similarity index 100% rename from out/assets/images/common/button-cancel.png rename to data/stage1/image/common/button-cancel.png diff --git a/out/assets/images/common/button-ok.png b/data/stage1/image/common/button-ok.png similarity index 100% rename from out/assets/images/common/button-ok.png rename to data/stage1/image/common/button-ok.png diff --git a/out/assets/images/common/debug.png b/data/stage1/image/common/debug.png similarity index 100% rename from out/assets/images/common/debug.png rename to data/stage1/image/common/debug.png diff --git a/data/stage1/image/common/dialog-close-hover.png b/data/stage1/image/common/dialog-close-hover.png new file mode 100644 index 0000000..29706b7 Binary files /dev/null and b/data/stage1/image/common/dialog-close-hover.png differ diff --git a/data/stage1/image/common/dialog-close.png b/data/stage1/image/common/dialog-close.png new file mode 100644 index 0000000..6e4628e Binary files /dev/null and b/data/stage1/image/common/dialog-close.png differ diff --git a/data/stage1/image/common/dialog-textbutton-hover.png b/data/stage1/image/common/dialog-textbutton-hover.png new file mode 100644 index 0000000..bd5e5c1 Binary files /dev/null and b/data/stage1/image/common/dialog-textbutton-hover.png differ diff --git a/data/stage1/image/common/dialog-textbutton.png b/data/stage1/image/common/dialog-textbutton.png new file mode 100644 index 0000000..b3a1dc8 Binary files /dev/null and b/data/stage1/image/common/dialog-textbutton.png differ diff --git a/out/assets/images/common/dialog.png b/data/stage1/image/common/dialog.png similarity index 100% rename from out/assets/images/common/dialog.png rename to data/stage1/image/common/dialog.png diff --git a/out/assets/images/common/transparent.png b/data/stage1/image/common/transparent.png similarity index 100% rename from out/assets/images/common/transparent.png rename to data/stage1/image/common/transparent.png diff --git a/data/stage1/image/menu/button-hover.png b/data/stage1/image/menu/button-hover.png new file mode 100644 index 0000000..22e53c9 Binary files /dev/null and b/data/stage1/image/menu/button-hover.png differ diff --git a/data/stage1/image/menu/button.png b/data/stage1/image/menu/button.png new file mode 100644 index 0000000..73a6ed0 Binary files /dev/null and b/data/stage1/image/menu/button.png differ diff --git a/out/assets/images/menu/load-bg.png b/data/stage1/image/menu/load-bg.png similarity index 100% rename from out/assets/images/menu/load-bg.png rename to data/stage1/image/menu/load-bg.png diff --git a/out/assets/images/menu/title.png b/data/stage1/image/menu/title.png similarity index 100% rename from out/assets/images/menu/title.png rename to data/stage1/image/menu/title.png diff --git a/out/assets/images/options/background.png b/data/stage1/image/options/background.png similarity index 100% rename from out/assets/images/options/background.png rename to data/stage1/image/options/background.png diff --git a/data/stage1/image/options/button-hover.png b/data/stage1/image/options/button-hover.png new file mode 100644 index 0000000..297c0d9 Binary files /dev/null and b/data/stage1/image/options/button-hover.png differ diff --git a/data/stage1/image/options/button.png b/data/stage1/image/options/button.png new file mode 100644 index 0000000..ad93c55 Binary files /dev/null and b/data/stage1/image/options/button.png differ diff --git a/data/stage1/image/options/option-fullscreen.png b/data/stage1/image/options/option-fullscreen.png new file mode 100644 index 0000000..4d4851d Binary files /dev/null and b/data/stage1/image/options/option-fullscreen.png differ diff --git a/data/stage1/image/options/option-music.png b/data/stage1/image/options/option-music.png new file mode 100644 index 0000000..4b4f98b Binary files /dev/null and b/data/stage1/image/options/option-music.png differ diff --git a/data/stage1/image/options/option-sound.png b/data/stage1/image/options/option-sound.png new file mode 100644 index 0000000..839112b Binary files /dev/null and b/data/stage1/image/options/option-sound.png differ diff --git a/data/stage1/image/options/toggle-hover.png b/data/stage1/image/options/toggle-hover.png new file mode 100644 index 0000000..0e485b1 Binary files /dev/null and b/data/stage1/image/options/toggle-hover.png differ diff --git a/data/stage1/image/options/toggle-on.png b/data/stage1/image/options/toggle-on.png new file mode 100644 index 0000000..c82b94e Binary files /dev/null and b/data/stage1/image/options/toggle-on.png differ diff --git a/data/stage1/image/options/toggle.png b/data/stage1/image/options/toggle.png new file mode 100644 index 0000000..77e8e44 Binary files /dev/null and b/data/stage1/image/options/toggle.png differ diff --git a/graphics/exported/translucent.png b/data/stage1/image/translucent.png similarity index 100% rename from graphics/exported/translucent.png rename to data/stage1/image/translucent.png diff --git a/out/assets/sounds/music/supernatural.mp3 b/data/stage1/sound/music/supernatural.mp3 similarity index 100% rename from out/assets/sounds/music/supernatural.mp3 rename to data/stage1/sound/music/supernatural.mp3 diff --git a/out/assets/sounds/ui/button-click.wav b/data/stage1/sound/ui/button-click.wav similarity index 100% rename from out/assets/sounds/ui/button-click.wav rename to data/stage1/sound/ui/button-click.wav diff --git a/out/assets/sounds/ui/button-down.wav b/data/stage1/sound/ui/button-down.wav similarity index 100% rename from out/assets/sounds/ui/button-down.wav rename to data/stage1/sound/ui/button-down.wav diff --git a/out/assets/sounds/ui/button-up.wav b/data/stage1/sound/ui/button-up.wav similarity index 100% rename from out/assets/sounds/ui/button-up.wav rename to data/stage1/sound/ui/button-up.wav diff --git a/out/assets/sounds/ui/dialog-close.wav b/data/stage1/sound/ui/dialog-close.wav similarity index 100% rename from out/assets/sounds/ui/dialog-close.wav rename to data/stage1/sound/ui/dialog-close.wav diff --git a/out/assets/sounds/ui/dialog-open.wav b/data/stage1/sound/ui/dialog-open.wav similarity index 100% rename from out/assets/sounds/ui/dialog-open.wav rename to data/stage1/sound/ui/dialog-open.wav diff --git a/graphics/exported/action/damageprotector.png b/data/stage2/image/action/damageprotector.png similarity index 100% rename from graphics/exported/action/damageprotector.png rename to data/stage2/image/action/damageprotector.png diff --git a/graphics/exported/action/endturn.png b/data/stage2/image/action/endturn.png similarity index 100% rename from graphics/exported/action/endturn.png rename to data/stage2/image/action/endturn.png diff --git a/graphics/exported/action/forcefield.png b/data/stage2/image/action/forcefield.png similarity index 100% rename from graphics/exported/action/forcefield.png rename to data/stage2/image/action/forcefield.png diff --git a/graphics/exported/action/fractalhull.png b/data/stage2/image/action/fractalhull.png similarity index 100% rename from graphics/exported/action/fractalhull.png rename to data/stage2/image/action/fractalhull.png diff --git a/graphics/exported/action/gatlinggun.png b/data/stage2/image/action/gatlinggun.png similarity index 100% rename from graphics/exported/action/gatlinggun.png rename to data/stage2/image/action/gatlinggun.png diff --git a/graphics/exported/action/gravitshield.png b/data/stage2/image/action/gravitshield.png similarity index 100% rename from graphics/exported/action/gravitshield.png rename to data/stage2/image/action/gravitshield.png diff --git a/graphics/exported/action/hardcoatedhull.png b/data/stage2/image/action/hardcoatedhull.png similarity index 100% rename from graphics/exported/action/hardcoatedhull.png rename to data/stage2/image/action/hardcoatedhull.png diff --git a/graphics/exported/action/invertershield.png b/data/stage2/image/action/invertershield.png similarity index 100% rename from graphics/exported/action/invertershield.png rename to data/stage2/image/action/invertershield.png diff --git a/graphics/exported/action/ionthruster.png b/data/stage2/image/action/ionthruster.png similarity index 100% rename from graphics/exported/action/ionthruster.png rename to data/stage2/image/action/ionthruster.png diff --git a/graphics/exported/action/ironhull.png b/data/stage2/image/action/ironhull.png similarity index 100% rename from graphics/exported/action/ironhull.png rename to data/stage2/image/action/ironhull.png diff --git a/graphics/exported/action/kelvingenerator.png b/data/stage2/image/action/kelvingenerator.png similarity index 100% rename from graphics/exported/action/kelvingenerator.png rename to data/stage2/image/action/kelvingenerator.png diff --git a/graphics/exported/action/move.png b/data/stage2/image/action/move.png similarity index 100% rename from graphics/exported/action/move.png rename to data/stage2/image/action/move.png diff --git a/graphics/exported/action/nuclearreactor.png b/data/stage2/image/action/nuclearreactor.png similarity index 100% rename from graphics/exported/action/nuclearreactor.png rename to data/stage2/image/action/nuclearreactor.png diff --git a/graphics/exported/action/powerdepleter.png b/data/stage2/image/action/powerdepleter.png similarity index 100% rename from graphics/exported/action/powerdepleter.png rename to data/stage2/image/action/powerdepleter.png diff --git a/graphics/exported/action/precisionboost.png b/data/stage2/image/action/precisionboost.png similarity index 100% rename from graphics/exported/action/precisionboost.png rename to data/stage2/image/action/precisionboost.png diff --git a/graphics/exported/action/prokhorovlaser.png b/data/stage2/image/action/prokhorovlaser.png similarity index 100% rename from graphics/exported/action/prokhorovlaser.png rename to data/stage2/image/action/prokhorovlaser.png diff --git a/graphics/exported/action/repairdrone.png b/data/stage2/image/action/repairdrone.png similarity index 100% rename from graphics/exported/action/repairdrone.png rename to data/stage2/image/action/repairdrone.png diff --git a/graphics/exported/action/rocketengine.png b/data/stage2/image/action/rocketengine.png similarity index 100% rename from graphics/exported/action/rocketengine.png rename to data/stage2/image/action/rocketengine.png diff --git a/graphics/exported/action/shieldtransfer.png b/data/stage2/image/action/shieldtransfer.png similarity index 100% rename from graphics/exported/action/shieldtransfer.png rename to data/stage2/image/action/shieldtransfer.png diff --git a/graphics/exported/action/submunitionmissile.png b/data/stage2/image/action/submunitionmissile.png similarity index 100% rename from graphics/exported/action/submunitionmissile.png rename to data/stage2/image/action/submunitionmissile.png diff --git a/graphics/exported/action/voidhawkengine.png b/data/stage2/image/action/voidhawkengine.png similarity index 100% rename from graphics/exported/action/voidhawkengine.png rename to data/stage2/image/action/voidhawkengine.png diff --git a/graphics/exported/attribute/hull_capacity.png b/data/stage2/image/attribute/hull_capacity.png similarity index 100% rename from graphics/exported/attribute/hull_capacity.png rename to data/stage2/image/attribute/hull_capacity.png diff --git a/graphics/exported/attribute/maneuvrability.png b/data/stage2/image/attribute/maneuvrability.png similarity index 100% rename from graphics/exported/attribute/maneuvrability.png rename to data/stage2/image/attribute/maneuvrability.png diff --git a/graphics/exported/attribute/power_capacity.png b/data/stage2/image/attribute/power_capacity.png similarity index 100% rename from graphics/exported/attribute/power_capacity.png rename to data/stage2/image/attribute/power_capacity.png diff --git a/graphics/exported/attribute/precision.png b/data/stage2/image/attribute/precision.png similarity index 100% rename from graphics/exported/attribute/precision.png rename to data/stage2/image/attribute/precision.png diff --git a/graphics/exported/attribute/shield_capacity.png b/data/stage2/image/attribute/shield_capacity.png similarity index 100% rename from graphics/exported/attribute/shield_capacity.png rename to data/stage2/image/attribute/shield_capacity.png diff --git a/out/assets/images/battle/actionbar/actions-background.png b/data/stage2/image/battle/actionbar/actions-background.png similarity index 100% rename from out/assets/images/battle/actionbar/actions-background.png rename to data/stage2/image/battle/actionbar/actions-background.png diff --git a/out/assets/images/battle/actionbar/background.png b/data/stage2/image/battle/actionbar/background.png similarity index 100% rename from out/assets/images/battle/actionbar/background.png rename to data/stage2/image/battle/actionbar/background.png diff --git a/graphics/exported/battle/actionbar/bottom-disabled.png b/data/stage2/image/battle/actionbar/bottom-disabled.png similarity index 100% rename from graphics/exported/battle/actionbar/bottom-disabled.png rename to data/stage2/image/battle/actionbar/bottom-disabled.png diff --git a/graphics/exported/battle/actionbar/bottom-enabled.png b/data/stage2/image/battle/actionbar/bottom-enabled.png similarity index 100% rename from graphics/exported/battle/actionbar/bottom-enabled.png rename to data/stage2/image/battle/actionbar/bottom-enabled.png diff --git a/graphics/exported/battle/actionbar/bottom-targetting.png b/data/stage2/image/battle/actionbar/bottom-targetting.png similarity index 100% rename from graphics/exported/battle/actionbar/bottom-targetting.png rename to data/stage2/image/battle/actionbar/bottom-targetting.png diff --git a/graphics/exported/battle/actionbar/bottom-toggled.png b/data/stage2/image/battle/actionbar/bottom-toggled.png similarity index 100% rename from graphics/exported/battle/actionbar/bottom-toggled.png rename to data/stage2/image/battle/actionbar/bottom-toggled.png diff --git a/data/stage2/image/battle/actionbar/button-menu-hover.png b/data/stage2/image/battle/actionbar/button-menu-hover.png new file mode 100644 index 0000000..3b611b5 Binary files /dev/null and b/data/stage2/image/battle/actionbar/button-menu-hover.png differ diff --git a/data/stage2/image/battle/actionbar/button-menu.png b/data/stage2/image/battle/actionbar/button-menu.png new file mode 100644 index 0000000..5600071 Binary files /dev/null and b/data/stage2/image/battle/actionbar/button-menu.png differ diff --git a/graphics/exported/battle/actionbar/consumption-disabled.png b/data/stage2/image/battle/actionbar/consumption-disabled.png similarity index 100% rename from graphics/exported/battle/actionbar/consumption-disabled.png rename to data/stage2/image/battle/actionbar/consumption-disabled.png diff --git a/graphics/exported/battle/actionbar/consumption-enabled.png b/data/stage2/image/battle/actionbar/consumption-enabled.png similarity index 100% rename from graphics/exported/battle/actionbar/consumption-enabled.png rename to data/stage2/image/battle/actionbar/consumption-enabled.png diff --git a/graphics/exported/battle/actionbar/consumption-targetting.png b/data/stage2/image/battle/actionbar/consumption-targetting.png similarity index 100% rename from graphics/exported/battle/actionbar/consumption-targetting.png rename to data/stage2/image/battle/actionbar/consumption-targetting.png diff --git a/graphics/exported/battle/actionbar/consumption-toggled.png b/data/stage2/image/battle/actionbar/consumption-toggled.png similarity index 100% rename from graphics/exported/battle/actionbar/consumption-toggled.png rename to data/stage2/image/battle/actionbar/consumption-toggled.png diff --git a/graphics/exported/battle/actionbar/cooldown-front.png b/data/stage2/image/battle/actionbar/cooldown-front.png similarity index 100% rename from graphics/exported/battle/actionbar/cooldown-front.png rename to data/stage2/image/battle/actionbar/cooldown-front.png diff --git a/graphics/exported/battle/actionbar/cooldown-one.png b/data/stage2/image/battle/actionbar/cooldown-one.png similarity index 100% rename from graphics/exported/battle/actionbar/cooldown-one.png rename to data/stage2/image/battle/actionbar/cooldown-one.png diff --git a/graphics/exported/battle/actionbar/frame-disabled.png b/data/stage2/image/battle/actionbar/frame-disabled.png similarity index 100% rename from graphics/exported/battle/actionbar/frame-disabled.png rename to data/stage2/image/battle/actionbar/frame-disabled.png diff --git a/graphics/exported/battle/actionbar/frame-enabled.png b/data/stage2/image/battle/actionbar/frame-enabled.png similarity index 100% rename from graphics/exported/battle/actionbar/frame-enabled.png rename to data/stage2/image/battle/actionbar/frame-enabled.png diff --git a/graphics/exported/battle/actionbar/frame-fading.png b/data/stage2/image/battle/actionbar/frame-fading.png similarity index 100% rename from graphics/exported/battle/actionbar/frame-fading.png rename to data/stage2/image/battle/actionbar/frame-fading.png diff --git a/graphics/exported/battle/actionbar/hotkey.png b/data/stage2/image/battle/actionbar/hotkey.png similarity index 100% rename from graphics/exported/battle/actionbar/hotkey.png rename to data/stage2/image/battle/actionbar/hotkey.png diff --git a/graphics/exported/battle/actionbar/power-available.png b/data/stage2/image/battle/actionbar/power-available.png similarity index 100% rename from graphics/exported/battle/actionbar/power-available.png rename to data/stage2/image/battle/actionbar/power-available.png diff --git a/graphics/exported/battle/actionbar/power-background.png b/data/stage2/image/battle/actionbar/power-background.png similarity index 100% rename from graphics/exported/battle/actionbar/power-background.png rename to data/stage2/image/battle/actionbar/power-background.png diff --git a/graphics/exported/battle/actionbar/power-fire.png b/data/stage2/image/battle/actionbar/power-fire.png similarity index 100% rename from graphics/exported/battle/actionbar/power-fire.png rename to data/stage2/image/battle/actionbar/power-fire.png diff --git a/graphics/exported/battle/actionbar/power-generated.png b/data/stage2/image/battle/actionbar/power-generated.png similarity index 100% rename from graphics/exported/battle/actionbar/power-generated.png rename to data/stage2/image/battle/actionbar/power-generated.png diff --git a/graphics/exported/battle/actionbar/power-move.png b/data/stage2/image/battle/actionbar/power-move.png similarity index 100% rename from graphics/exported/battle/actionbar/power-move.png rename to data/stage2/image/battle/actionbar/power-move.png diff --git a/graphics/exported/battle/actionbar/power-used.png b/data/stage2/image/battle/actionbar/power-used.png similarity index 100% rename from graphics/exported/battle/actionbar/power-used.png rename to data/stage2/image/battle/actionbar/power-used.png diff --git a/graphics/exported/battle/actionbar/ship.png b/data/stage2/image/battle/actionbar/ship.png similarity index 100% rename from graphics/exported/battle/actionbar/ship.png rename to data/stage2/image/battle/actionbar/ship.png diff --git a/graphics/exported/battle/actionbar/sticky-disabled.png b/data/stage2/image/battle/actionbar/sticky-disabled.png similarity index 100% rename from graphics/exported/battle/actionbar/sticky-disabled.png rename to data/stage2/image/battle/actionbar/sticky-disabled.png diff --git a/graphics/exported/battle/actionbar/sticky-overheat.png b/data/stage2/image/battle/actionbar/sticky-overheat.png similarity index 100% rename from graphics/exported/battle/actionbar/sticky-overheat.png rename to data/stage2/image/battle/actionbar/sticky-overheat.png diff --git a/graphics/exported/battle/actionbar/sticky-toggled.png b/data/stage2/image/battle/actionbar/sticky-toggled.png similarity index 100% rename from graphics/exported/battle/actionbar/sticky-toggled.png rename to data/stage2/image/battle/actionbar/sticky-toggled.png diff --git a/graphics/exported/battle/actionbar/sticky-untoggled.png b/data/stage2/image/battle/actionbar/sticky-untoggled.png similarity index 100% rename from graphics/exported/battle/actionbar/sticky-untoggled.png rename to data/stage2/image/battle/actionbar/sticky-untoggled.png diff --git a/out/assets/images/battle/arena/background.png b/data/stage2/image/battle/arena/background.png similarity index 100% rename from out/assets/images/battle/arena/background.png rename to data/stage2/image/battle/arena/background.png diff --git a/out/assets/images/battle/background.jpg b/data/stage2/image/battle/background.jpg similarity index 100% rename from out/assets/images/battle/background.jpg rename to data/stage2/image/battle/background.jpg diff --git a/graphics/exported/battle/effects/blast.png b/data/stage2/image/battle/effects/blast.png similarity index 100% rename from graphics/exported/battle/effects/blast.png rename to data/stage2/image/battle/effects/blast.png diff --git a/graphics/exported/battle/effects/bullets.png b/data/stage2/image/battle/effects/bullets.png similarity index 100% rename from graphics/exported/battle/effects/bullets.png rename to data/stage2/image/battle/effects/bullets.png diff --git a/graphics/exported/battle/effects/default.png b/data/stage2/image/battle/effects/default.png similarity index 100% rename from graphics/exported/battle/effects/default.png rename to data/stage2/image/battle/effects/default.png diff --git a/graphics/exported/battle/effects/hot.png b/data/stage2/image/battle/effects/hot.png similarity index 100% rename from graphics/exported/battle/effects/hot.png rename to data/stage2/image/battle/effects/hot.png diff --git a/graphics/exported/battle/effects/laser.png b/data/stage2/image/battle/effects/laser.png similarity index 100% rename from graphics/exported/battle/effects/laser.png rename to data/stage2/image/battle/effects/laser.png diff --git a/graphics/exported/battle/effects/shield-impact.png b/data/stage2/image/battle/effects/shield-impact.png similarity index 100% rename from graphics/exported/battle/effects/shield-impact.png rename to data/stage2/image/battle/effects/shield-impact.png diff --git a/graphics/exported/battle/hud/ship-effect-bad.png b/data/stage2/image/battle/hud/ship-effect-bad.png similarity index 100% rename from graphics/exported/battle/hud/ship-effect-bad.png rename to data/stage2/image/battle/hud/ship-effect-bad.png diff --git a/graphics/exported/battle/hud/ship-effect-good.png b/data/stage2/image/battle/hud/ship-effect-good.png similarity index 100% rename from graphics/exported/battle/hud/ship-effect-good.png rename to data/stage2/image/battle/hud/ship-effect-good.png diff --git a/graphics/exported/battle/hud/ship-enemy-mini.png b/data/stage2/image/battle/hud/ship-enemy-mini.png similarity index 100% rename from graphics/exported/battle/hud/ship-enemy-mini.png rename to data/stage2/image/battle/hud/ship-enemy-mini.png diff --git a/graphics/exported/battle/hud/ship-enemy.png b/data/stage2/image/battle/hud/ship-enemy.png similarity index 100% rename from graphics/exported/battle/hud/ship-enemy.png rename to data/stage2/image/battle/hud/ship-enemy.png diff --git a/graphics/exported/battle/hud/ship-hsp.png b/data/stage2/image/battle/hud/ship-hsp.png similarity index 100% rename from graphics/exported/battle/hud/ship-hsp.png rename to data/stage2/image/battle/hud/ship-hsp.png diff --git a/graphics/exported/battle/hud/ship-hull.png b/data/stage2/image/battle/hud/ship-hull.png similarity index 100% rename from graphics/exported/battle/hud/ship-hull.png rename to data/stage2/image/battle/hud/ship-hull.png diff --git a/graphics/exported/battle/hud/ship-impacted.png b/data/stage2/image/battle/hud/ship-impacted.png similarity index 100% rename from graphics/exported/battle/hud/ship-impacted.png rename to data/stage2/image/battle/hud/ship-impacted.png diff --git a/graphics/exported/battle/hud/ship-own-mini.png b/data/stage2/image/battle/hud/ship-own-mini.png similarity index 100% rename from graphics/exported/battle/hud/ship-own-mini.png rename to data/stage2/image/battle/hud/ship-own-mini.png diff --git a/graphics/exported/battle/hud/ship-own.png b/data/stage2/image/battle/hud/ship-own.png similarity index 100% rename from graphics/exported/battle/hud/ship-own.png rename to data/stage2/image/battle/hud/ship-own.png diff --git a/graphics/exported/battle/hud/ship-play-order.png b/data/stage2/image/battle/hud/ship-play-order.png similarity index 100% rename from graphics/exported/battle/hud/ship-play-order.png rename to data/stage2/image/battle/hud/ship-play-order.png diff --git a/graphics/exported/battle/hud/ship-shield.png b/data/stage2/image/battle/hud/ship-shield.png similarity index 100% rename from graphics/exported/battle/hud/ship-shield.png rename to data/stage2/image/battle/hud/ship-shield.png diff --git a/graphics/exported/battle/hud/ship-stasis.png b/data/stage2/image/battle/hud/ship-stasis.png similarity index 100% rename from graphics/exported/battle/hud/ship-stasis.png rename to data/stage2/image/battle/hud/ship-stasis.png diff --git a/graphics/exported/battle/hud/ship-success-back.png b/data/stage2/image/battle/hud/ship-success-back.png similarity index 100% rename from graphics/exported/battle/hud/ship-success-back.png rename to data/stage2/image/battle/hud/ship-success-back.png diff --git a/graphics/exported/battle/hud/ship-success-fill.png b/data/stage2/image/battle/hud/ship-success-fill.png similarity index 100% rename from graphics/exported/battle/hud/ship-success-fill.png rename to data/stage2/image/battle/hud/ship-success-fill.png diff --git a/graphics/exported/battle/hud/simulator-failed.png b/data/stage2/image/battle/hud/simulator-failed.png similarity index 100% rename from graphics/exported/battle/hud/simulator-failed.png rename to data/stage2/image/battle/hud/simulator-failed.png diff --git a/graphics/exported/battle/hud/simulator-ok.png b/data/stage2/image/battle/hud/simulator-ok.png similarity index 100% rename from graphics/exported/battle/hud/simulator-ok.png rename to data/stage2/image/battle/hud/simulator-ok.png diff --git a/graphics/exported/battle/hud/simulator-power.png b/data/stage2/image/battle/hud/simulator-power.png similarity index 100% rename from graphics/exported/battle/hud/simulator-power.png rename to data/stage2/image/battle/hud/simulator-power.png diff --git a/graphics/exported/battle/hud/simulator-target.png b/data/stage2/image/battle/hud/simulator-target.png similarity index 100% rename from graphics/exported/battle/hud/simulator-target.png rename to data/stage2/image/battle/hud/simulator-target.png diff --git a/graphics/exported/battle/outcome/title-defeat.png b/data/stage2/image/battle/outcome/title-defeat.png similarity index 100% rename from graphics/exported/battle/outcome/title-defeat.png rename to data/stage2/image/battle/outcome/title-defeat.png diff --git a/graphics/exported/battle/outcome/title-victory.png b/data/stage2/image/battle/outcome/title-victory.png similarity index 100% rename from graphics/exported/battle/outcome/title-victory.png rename to data/stage2/image/battle/outcome/title-victory.png diff --git a/out/assets/images/battle/shiplist/background.png b/data/stage2/image/battle/shiplist/background.png similarity index 100% rename from out/assets/images/battle/shiplist/background.png rename to data/stage2/image/battle/shiplist/background.png diff --git a/out/assets/images/battle/shiplist/damage.png b/data/stage2/image/battle/shiplist/damage.png similarity index 100% rename from out/assets/images/battle/shiplist/damage.png rename to data/stage2/image/battle/shiplist/damage.png diff --git a/out/assets/images/battle/shiplist/hover.png b/data/stage2/image/battle/shiplist/hover.png similarity index 100% rename from out/assets/images/battle/shiplist/hover.png rename to data/stage2/image/battle/shiplist/hover.png diff --git a/out/assets/images/battle/shiplist/info-button.png b/data/stage2/image/battle/shiplist/info-button.png similarity index 100% rename from out/assets/images/battle/shiplist/info-button.png rename to data/stage2/image/battle/shiplist/info-button.png diff --git a/out/assets/images/battle/shiplist/item-background.png b/data/stage2/image/battle/shiplist/item-background.png similarity index 100% rename from out/assets/images/battle/shiplist/item-background.png rename to data/stage2/image/battle/shiplist/item-background.png diff --git a/data/stage2/image/battle/splash/message-off.png b/data/stage2/image/battle/splash/message-off.png new file mode 100644 index 0000000..978ec82 Binary files /dev/null and b/data/stage2/image/battle/splash/message-off.png differ diff --git a/data/stage2/image/battle/splash/message-on.png b/data/stage2/image/battle/splash/message-on.png new file mode 100644 index 0000000..3f7ef81 Binary files /dev/null and b/data/stage2/image/battle/splash/message-on.png differ diff --git a/data/stage2/image/battle/splash/moving-part.png b/data/stage2/image/battle/splash/moving-part.png new file mode 100644 index 0000000..3db45b4 Binary files /dev/null and b/data/stage2/image/battle/splash/moving-part.png differ diff --git a/data/stage2/image/battle/splash/shipcard-bottom.png b/data/stage2/image/battle/splash/shipcard-bottom.png new file mode 100644 index 0000000..3c3b1e4 Binary files /dev/null and b/data/stage2/image/battle/splash/shipcard-bottom.png differ diff --git a/data/stage2/image/battle/splash/shipcard-top.png b/data/stage2/image/battle/splash/shipcard-top.png new file mode 100644 index 0000000..4172c9b Binary files /dev/null and b/data/stage2/image/battle/splash/shipcard-top.png differ diff --git a/graphics/exported/battle/tooltip/ship-portrait.png b/data/stage2/image/battle/tooltip/ship-portrait.png similarity index 100% rename from graphics/exported/battle/tooltip/ship-portrait.png rename to data/stage2/image/battle/tooltip/ship-portrait.png diff --git a/graphics/exported/battle/tooltip/ship-value.png b/data/stage2/image/battle/tooltip/ship-value.png similarity index 100% rename from graphics/exported/battle/tooltip/ship-value.png rename to data/stage2/image/battle/tooltip/ship-value.png diff --git a/graphics/exported/character/close-button-hover.png b/data/stage2/image/character/close-button-hover.png similarity index 100% rename from graphics/exported/character/close-button-hover.png rename to data/stage2/image/character/close-button-hover.png diff --git a/graphics/exported/character/close-button.png b/data/stage2/image/character/close-button.png similarity index 100% rename from graphics/exported/character/close-button.png rename to data/stage2/image/character/close-button.png diff --git a/graphics/exported/character/entry.png b/data/stage2/image/character/entry.png similarity index 100% rename from graphics/exported/character/entry.png rename to data/stage2/image/character/entry.png diff --git a/graphics/exported/character/initial.png b/data/stage2/image/character/initial.png similarity index 100% rename from graphics/exported/character/initial.png rename to data/stage2/image/character/initial.png diff --git a/graphics/exported/character/level-display.png b/data/stage2/image/character/level-display.png similarity index 100% rename from graphics/exported/character/level-display.png rename to data/stage2/image/character/level-display.png diff --git a/graphics/exported/character/level-experience.png b/data/stage2/image/character/level-experience.png similarity index 100% rename from graphics/exported/character/level-experience.png rename to data/stage2/image/character/level-experience.png diff --git a/graphics/exported/character/level-separator.png b/data/stage2/image/character/level-separator.png similarity index 100% rename from graphics/exported/character/level-separator.png rename to data/stage2/image/character/level-separator.png diff --git a/graphics/exported/character/level-upgrades.png b/data/stage2/image/character/level-upgrades.png similarity index 100% rename from graphics/exported/character/level-upgrades.png rename to data/stage2/image/character/level-upgrades.png diff --git a/graphics/exported/character/name-button-hover.png b/data/stage2/image/character/name-button-hover.png similarity index 100% rename from graphics/exported/character/name-button-hover.png rename to data/stage2/image/character/name-button-hover.png diff --git a/graphics/exported/character/name-button.png b/data/stage2/image/character/name-button.png similarity index 100% rename from graphics/exported/character/name-button.png rename to data/stage2/image/character/name-button.png diff --git a/graphics/exported/character/name-display.png b/data/stage2/image/character/name-display.png similarity index 100% rename from graphics/exported/character/name-display.png rename to data/stage2/image/character/name-display.png diff --git a/graphics/exported/character/portrait-hover.png b/data/stage2/image/character/portrait-hover.png similarity index 100% rename from graphics/exported/character/portrait-hover.png rename to data/stage2/image/character/portrait-hover.png diff --git a/graphics/exported/character/portrait-on.png b/data/stage2/image/character/portrait-on.png similarity index 100% rename from graphics/exported/character/portrait-on.png rename to data/stage2/image/character/portrait-on.png diff --git a/graphics/exported/character/portrait.png b/data/stage2/image/character/portrait.png similarity index 100% rename from graphics/exported/character/portrait.png rename to data/stage2/image/character/portrait.png diff --git a/out/assets/images/character/sheet.png b/data/stage2/image/character/sheet.png similarity index 100% rename from out/assets/images/character/sheet.png rename to data/stage2/image/character/sheet.png diff --git a/graphics/exported/character/ship-column.png b/data/stage2/image/character/ship-column.png similarity index 100% rename from graphics/exported/character/ship-column.png rename to data/stage2/image/character/ship-column.png diff --git a/graphics/exported/character/ship-description.png b/data/stage2/image/character/ship-description.png similarity index 100% rename from graphics/exported/character/ship-description.png rename to data/stage2/image/character/ship-description.png diff --git a/graphics/exported/character/ship-model.png b/data/stage2/image/character/ship-model.png similarity index 100% rename from graphics/exported/character/ship-model.png rename to data/stage2/image/character/ship-model.png diff --git a/graphics/exported/character/upgrade-hover.png b/data/stage2/image/character/upgrade-hover.png similarity index 100% rename from graphics/exported/character/upgrade-hover.png rename to data/stage2/image/character/upgrade-hover.png diff --git a/graphics/exported/character/upgrade-locked.png b/data/stage2/image/character/upgrade-locked.png similarity index 100% rename from graphics/exported/character/upgrade-locked.png rename to data/stage2/image/character/upgrade-locked.png diff --git a/graphics/exported/character/upgrade-on.png b/data/stage2/image/character/upgrade-on.png similarity index 100% rename from graphics/exported/character/upgrade-on.png rename to data/stage2/image/character/upgrade-on.png diff --git a/graphics/exported/character/upgrade-point.png b/data/stage2/image/character/upgrade-point.png similarity index 100% rename from graphics/exported/character/upgrade-point.png rename to data/stage2/image/character/upgrade-point.png diff --git a/graphics/exported/character/upgrade.png b/data/stage2/image/character/upgrade.png similarity index 100% rename from graphics/exported/character/upgrade.png rename to data/stage2/image/character/upgrade.png diff --git a/graphics/exported/ship/avenger/portrait.png b/data/stage2/image/ship/avenger/portrait.png similarity index 100% rename from graphics/exported/ship/avenger/portrait.png rename to data/stage2/image/ship/avenger/portrait.png diff --git a/graphics/exported/ship/avenger/sprite.png b/data/stage2/image/ship/avenger/sprite.png similarity index 100% rename from graphics/exported/ship/avenger/sprite.png rename to data/stage2/image/ship/avenger/sprite.png diff --git a/graphics/exported/ship/breeze/portrait.png b/data/stage2/image/ship/breeze/portrait.png similarity index 100% rename from graphics/exported/ship/breeze/portrait.png rename to data/stage2/image/ship/breeze/portrait.png diff --git a/graphics/exported/ship/breeze/sprite.png b/data/stage2/image/ship/breeze/sprite.png similarity index 100% rename from graphics/exported/ship/breeze/sprite.png rename to data/stage2/image/ship/breeze/sprite.png diff --git a/graphics/exported/ship/commodore/portrait.png b/data/stage2/image/ship/commodore/portrait.png similarity index 100% rename from graphics/exported/ship/commodore/portrait.png rename to data/stage2/image/ship/commodore/portrait.png diff --git a/graphics/exported/ship/commodore/sprite.png b/data/stage2/image/ship/commodore/sprite.png similarity index 100% rename from graphics/exported/ship/commodore/sprite.png rename to data/stage2/image/ship/commodore/sprite.png diff --git a/graphics/exported/ship/creeper/portrait.png b/data/stage2/image/ship/creeper/portrait.png similarity index 100% rename from graphics/exported/ship/creeper/portrait.png rename to data/stage2/image/ship/creeper/portrait.png diff --git a/graphics/exported/ship/creeper/sprite.png b/data/stage2/image/ship/creeper/sprite.png similarity index 100% rename from graphics/exported/ship/creeper/sprite.png rename to data/stage2/image/ship/creeper/sprite.png diff --git a/graphics/exported/ship/falcon/portrait.png b/data/stage2/image/ship/falcon/portrait.png similarity index 100% rename from graphics/exported/ship/falcon/portrait.png rename to data/stage2/image/ship/falcon/portrait.png diff --git a/graphics/exported/ship/falcon/sprite.png b/data/stage2/image/ship/falcon/sprite.png similarity index 100% rename from graphics/exported/ship/falcon/sprite.png rename to data/stage2/image/ship/falcon/sprite.png diff --git a/graphics/exported/ship/flea/portrait.png b/data/stage2/image/ship/flea/portrait.png similarity index 100% rename from graphics/exported/ship/flea/portrait.png rename to data/stage2/image/ship/flea/portrait.png diff --git a/graphics/exported/ship/flea/sprite.png b/data/stage2/image/ship/flea/sprite.png similarity index 100% rename from graphics/exported/ship/flea/sprite.png rename to data/stage2/image/ship/flea/sprite.png diff --git a/graphics/exported/ship/jumper/portrait.png b/data/stage2/image/ship/jumper/portrait.png similarity index 100% rename from graphics/exported/ship/jumper/portrait.png rename to data/stage2/image/ship/jumper/portrait.png diff --git a/graphics/exported/ship/jumper/sprite.png b/data/stage2/image/ship/jumper/sprite.png similarity index 100% rename from graphics/exported/ship/jumper/sprite.png rename to data/stage2/image/ship/jumper/sprite.png diff --git a/graphics/exported/ship/rhino/portrait.png b/data/stage2/image/ship/rhino/portrait.png similarity index 100% rename from graphics/exported/ship/rhino/portrait.png rename to data/stage2/image/ship/rhino/portrait.png diff --git a/graphics/exported/ship/rhino/sprite.png b/data/stage2/image/ship/rhino/sprite.png similarity index 100% rename from graphics/exported/ship/rhino/sprite.png rename to data/stage2/image/ship/rhino/sprite.png diff --git a/graphics/exported/ship/tomahawk/portrait.png b/data/stage2/image/ship/tomahawk/portrait.png similarity index 100% rename from graphics/exported/ship/tomahawk/portrait.png rename to data/stage2/image/ship/tomahawk/portrait.png diff --git a/graphics/exported/ship/tomahawk/sprite.png b/data/stage2/image/ship/tomahawk/sprite.png similarity index 100% rename from graphics/exported/ship/tomahawk/sprite.png rename to data/stage2/image/ship/tomahawk/sprite.png diff --git a/graphics/exported/ship/trapper/portrait.png b/data/stage2/image/ship/trapper/portrait.png similarity index 100% rename from graphics/exported/ship/trapper/portrait.png rename to data/stage2/image/ship/trapper/portrait.png diff --git a/graphics/exported/ship/trapper/sprite.png b/data/stage2/image/ship/trapper/sprite.png similarity index 100% rename from graphics/exported/ship/trapper/sprite.png rename to data/stage2/image/ship/trapper/sprite.png diff --git a/graphics/exported/ship/xander/portrait.png b/data/stage2/image/ship/xander/portrait.png similarity index 100% rename from graphics/exported/ship/xander/portrait.png rename to data/stage2/image/ship/xander/portrait.png diff --git a/graphics/exported/ship/xander/sprite.png b/data/stage2/image/ship/xander/sprite.png similarity index 100% rename from graphics/exported/ship/xander/sprite.png rename to data/stage2/image/ship/xander/sprite.png diff --git a/out/assets/sounds/battle/drone-activate.wav b/data/stage2/sound/battle/drone-activate.wav similarity index 100% rename from out/assets/sounds/battle/drone-activate.wav rename to data/stage2/sound/battle/drone-activate.wav diff --git a/out/assets/sounds/battle/drone-deploy.wav b/data/stage2/sound/battle/drone-deploy.wav similarity index 100% rename from out/assets/sounds/battle/drone-deploy.wav rename to data/stage2/sound/battle/drone-deploy.wav diff --git a/out/assets/sounds/battle/drone-destroy.wav b/data/stage2/sound/battle/drone-destroy.wav similarity index 100% rename from out/assets/sounds/battle/drone-destroy.wav rename to data/stage2/sound/battle/drone-destroy.wav diff --git a/out/assets/sounds/battle/effect1.wav b/data/stage2/sound/battle/effect1.wav similarity index 100% rename from out/assets/sounds/battle/effect1.wav rename to data/stage2/sound/battle/effect1.wav diff --git a/out/assets/sounds/battle/ship-change.wav b/data/stage2/sound/battle/ship-change.wav similarity index 100% rename from out/assets/sounds/battle/ship-change.wav rename to data/stage2/sound/battle/ship-change.wav diff --git a/out/assets/sounds/battle/weapon-bullets.wav b/data/stage2/sound/battle/weapon-bullets.wav similarity index 100% rename from out/assets/sounds/battle/weapon-bullets.wav rename to data/stage2/sound/battle/weapon-bullets.wav diff --git a/out/assets/sounds/battle/weapon-laser.cpt b/data/stage2/sound/battle/weapon-laser.cpt similarity index 100% rename from out/assets/sounds/battle/weapon-laser.cpt rename to data/stage2/sound/battle/weapon-laser.cpt diff --git a/out/assets/sounds/battle/weapon-laser.wav b/data/stage2/sound/battle/weapon-laser.wav similarity index 100% rename from out/assets/sounds/battle/weapon-laser.wav rename to data/stage2/sound/battle/weapon-laser.wav diff --git a/out/assets/sounds/battle/weapon-missile-explosion.wav b/data/stage2/sound/battle/weapon-missile-explosion.wav similarity index 100% rename from out/assets/sounds/battle/weapon-missile-explosion.wav rename to data/stage2/sound/battle/weapon-missile-explosion.wav diff --git a/out/assets/sounds/battle/weapon-missile-launch.wav b/data/stage2/sound/battle/weapon-missile-launch.wav similarity index 100% rename from out/assets/sounds/battle/weapon-missile-launch.wav rename to data/stage2/sound/battle/weapon-missile-launch.wav diff --git a/out/assets/sounds/music/mechanolith.mp3 b/data/stage2/sound/music/mechanolith.mp3 similarity index 100% rename from out/assets/sounds/music/mechanolith.mp3 rename to data/stage2/sound/music/mechanolith.mp3 diff --git a/out/assets/sounds/ui/drag.wav b/data/stage2/sound/ui/drag.wav similarity index 100% rename from out/assets/sounds/ui/drag.wav rename to data/stage2/sound/ui/drag.wav diff --git a/out/assets/sounds/ui/drop.wav b/data/stage2/sound/ui/drop.wav similarity index 100% rename from out/assets/sounds/ui/drop.wav rename to data/stage2/sound/ui/drop.wav diff --git a/data/stage3/image/map/action-hover.png b/data/stage3/image/map/action-hover.png new file mode 100644 index 0000000..09ff9d2 Binary files /dev/null and b/data/stage3/image/map/action-hover.png differ diff --git a/data/stage3/image/map/action.png b/data/stage3/image/map/action.png new file mode 100644 index 0000000..1f5bd20 Binary files /dev/null and b/data/stage3/image/map/action.png differ diff --git a/out/assets/images/map/boundaries.png b/data/stage3/image/map/boundaries.png similarity index 100% rename from out/assets/images/map/boundaries.png rename to data/stage3/image/map/boundaries.png diff --git a/graphics/exported/map/current-location.png b/data/stage3/image/map/current-location.png similarity index 100% rename from graphics/exported/map/current-location.png rename to data/stage3/image/map/current-location.png diff --git a/graphics/exported/map/location-planet.png b/data/stage3/image/map/location-planet.png similarity index 100% rename from graphics/exported/map/location-planet.png rename to data/stage3/image/map/location-planet.png diff --git a/graphics/exported/map/location-star.png b/data/stage3/image/map/location-star.png similarity index 100% rename from graphics/exported/map/location-star.png rename to data/stage3/image/map/location-star.png diff --git a/graphics/exported/map/location-warp.png b/data/stage3/image/map/location-warp.png similarity index 100% rename from graphics/exported/map/location-warp.png rename to data/stage3/image/map/location-warp.png diff --git a/data/stage3/image/map/mission-action-accept-hover.png b/data/stage3/image/map/mission-action-accept-hover.png new file mode 100644 index 0000000..358e198 Binary files /dev/null and b/data/stage3/image/map/mission-action-accept-hover.png differ diff --git a/data/stage3/image/map/mission-action-accept.png b/data/stage3/image/map/mission-action-accept.png new file mode 100644 index 0000000..9718c6c Binary files /dev/null and b/data/stage3/image/map/mission-action-accept.png differ diff --git a/data/stage3/image/map/mission-action-cancel-hover.png b/data/stage3/image/map/mission-action-cancel-hover.png new file mode 100644 index 0000000..e075af4 Binary files /dev/null and b/data/stage3/image/map/mission-action-cancel-hover.png differ diff --git a/data/stage3/image/map/mission-action-cancel.png b/data/stage3/image/map/mission-action-cancel.png new file mode 100644 index 0000000..28b052c Binary files /dev/null and b/data/stage3/image/map/mission-action-cancel.png differ diff --git a/graphics/exported/map/mission-done.png b/data/stage3/image/map/mission-done.png similarity index 100% rename from graphics/exported/map/mission-done.png rename to data/stage3/image/map/mission-done.png diff --git a/graphics/exported/map/mission-main.png b/data/stage3/image/map/mission-main.png similarity index 100% rename from graphics/exported/map/mission-main.png rename to data/stage3/image/map/mission-main.png diff --git a/graphics/exported/map/mission-standard.png b/data/stage3/image/map/mission-standard.png similarity index 100% rename from graphics/exported/map/mission-standard.png rename to data/stage3/image/map/mission-standard.png diff --git a/graphics/exported/map/mission-warning.png b/data/stage3/image/map/mission-warning.png similarity index 100% rename from graphics/exported/map/mission-warning.png rename to data/stage3/image/map/mission-warning.png diff --git a/out/assets/images/map/name.png b/data/stage3/image/map/name.png similarity index 100% rename from out/assets/images/map/name.png rename to data/stage3/image/map/name.png diff --git a/graphics/exported/map/options-hover.png b/data/stage3/image/map/options-hover.png similarity index 100% rename from graphics/exported/map/options-hover.png rename to data/stage3/image/map/options-hover.png diff --git a/graphics/exported/map/options.png b/data/stage3/image/map/options.png similarity index 100% rename from graphics/exported/map/options.png rename to data/stage3/image/map/options.png diff --git a/out/assets/images/map/orbit.png b/data/stage3/image/map/orbit.png similarity index 100% rename from out/assets/images/map/orbit.png rename to data/stage3/image/map/orbit.png diff --git a/out/assets/images/map/starsystem-background.png b/data/stage3/image/map/starsystem-background.png similarity index 100% rename from out/assets/images/map/starsystem-background.png rename to data/stage3/image/map/starsystem-background.png diff --git a/graphics/exported/map/status-clear.png b/data/stage3/image/map/status-clear.png similarity index 100% rename from graphics/exported/map/status-clear.png rename to data/stage3/image/map/status-clear.png diff --git a/graphics/exported/map/status-dockyard.png b/data/stage3/image/map/status-dockyard.png similarity index 100% rename from graphics/exported/map/status-dockyard.png rename to data/stage3/image/map/status-dockyard.png diff --git a/graphics/exported/map/status-enemy.png b/data/stage3/image/map/status-enemy.png similarity index 100% rename from graphics/exported/map/status-enemy.png rename to data/stage3/image/map/status-enemy.png diff --git a/graphics/exported/map/status-unvisited.png b/data/stage3/image/map/status-unvisited.png similarity index 100% rename from graphics/exported/map/status-unvisited.png rename to data/stage3/image/map/status-unvisited.png diff --git a/out/assets/images/map/subname.png b/data/stage3/image/map/subname.png similarity index 100% rename from out/assets/images/map/subname.png rename to data/stage3/image/map/subname.png diff --git a/graphics/exported/map/zoom-in-hover.png b/data/stage3/image/map/zoom-in-hover.png similarity index 100% rename from graphics/exported/map/zoom-in-hover.png rename to data/stage3/image/map/zoom-in-hover.png diff --git a/graphics/exported/map/zoom-in.png b/data/stage3/image/map/zoom-in.png similarity index 100% rename from graphics/exported/map/zoom-in.png rename to data/stage3/image/map/zoom-in.png diff --git a/graphics/exported/map/zoom-out-hover.png b/data/stage3/image/map/zoom-out-hover.png similarity index 100% rename from graphics/exported/map/zoom-out-hover.png rename to data/stage3/image/map/zoom-out-hover.png diff --git a/graphics/exported/map/zoom-out.png b/data/stage3/image/map/zoom-out.png similarity index 100% rename from graphics/exported/map/zoom-out.png rename to data/stage3/image/map/zoom-out.png diff --git a/out/assets/shaders/map-background.glsl b/data/stage3/shader/map-background.glsl similarity index 100% rename from out/assets/shaders/map-background.glsl rename to data/stage3/shader/map-background.glsl diff --git a/out/assets/sounds/music/division.mp3 b/data/stage3/sound/music/division.mp3 similarity index 100% rename from out/assets/sounds/music/division.mp3 rename to data/stage3/sound/music/division.mp3 diff --git a/out/assets/sounds/music/spring-thaw.mp3 b/data/stage3/sound/music/spring-thaw.mp3 similarity index 100% rename from out/assets/sounds/music/spring-thaw.mp3 rename to data/stage3/sound/music/spring-thaw.mp3 diff --git a/out/assets/images/common/particles.xcf b/graphics/layered/particles.xcf similarity index 100% rename from out/assets/images/common/particles.xcf rename to graphics/layered/particles.xcf diff --git a/graphics/ui/options.svg b/graphics/ui/options.svg index 470c6e9..265fdf3 100644 --- a/graphics/ui/options.svg +++ b/graphics/ui/options.svg @@ -351,11 +351,11 @@ borderopacity="1.0" inkscape:pageopacity="0" inkscape:pageshadow="2" - inkscape:zoom="0.70000001" - inkscape:cx="875.53821" - inkscape:cy="617.34631" + inkscape:zoom="1.4" + inkscape:cx="1069.2736" + inkscape:cy="738.11651" inkscape:document-units="px" - inkscape:current-layer="layer5" + inkscape:current-layer="layer1" showgrid="false" units="px" showborder="true" @@ -472,15 +472,14 @@ inkscape:export-filename="/home/michael/workspace/perso/spacetac/out/assets/images/options/toggle1.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96"> - + + - + + diff --git a/graphics/ui/title.svg b/graphics/ui/title.svg index 6649146..c4b5744 100644 --- a/graphics/ui/title.svg +++ b/graphics/ui/title.svg @@ -12,14 +12,15 @@ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="1920" height="1080" - viewBox="0 0 507.99999 285.75001" + viewBox="0 0 1920 1080" version="1.1" id="svg8" sodipodi:docname="title.svg" inkscape:version="0.92.1 r15371" inkscape:export-filename="/home/michael/workspace/spacetac/out/assets/images/menu/title.png" inkscape:export-xdpi="96" - inkscape:export-ydpi="96"> + inkscape:export-ydpi="96" + enable-background="new"> + d="M 0,0 5,-5 -12.5,0 5,5 Z" + style="fill:#283646;fill-opacity:1;fill-rule:evenodd;stroke:#283646;stroke-width:1.00000003pt;stroke-opacity:1" + transform="matrix(-0.2,0,0,-0.2,-1.2,0)" + inkscape:connector-curvature="0" /> + style="fill:#283646;fill-opacity:1;fill-rule:evenodd;stroke:#283646;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="matrix(0.3,0,0,0.3,-0.69,0)" + inkscape:connector-curvature="0" /> + style="fill:#9bb0c9;fill-opacity:1;fill-rule:evenodd;stroke:#9bb0c9;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="scale(-0.6)" + inkscape:connector-curvature="0" /> + d="M 0,0 5,-5 -12.5,0 5,5 Z" + style="fill:#9bb0c9;fill-opacity:1;fill-rule:evenodd;stroke:#9bb0c9;stroke-width:1.00000003pt;stroke-opacity:1" + transform="matrix(0.8,0,0,0.8,10,0)" + inkscape:connector-curvature="0" /> + gradientTransform="matrix(3.7795277,0,0,3.7795277,22.967702,-22.228707)" /> + height="4.1184998"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + x="818.22357" + y="740.38416" + style="fill:#ff0000;fill-opacity:1;stroke-width:1px" /> SpaceTac + x="464.10834" + y="476.76624" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:213.33335876px;line-height:24.98267937px;font-family:DAGGERSQUARE;-inkscape-font-specification:DAGGERSQUARE;fill:url(#radialGradient5288);fill-opacity:1;stroke:url(#linearGradient5254);stroke-width:3.64724422;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">SpaceTac @@ -505,7 +702,7 @@ y="0" xlink:href="#g7596" id="use7598" - transform="matrix(-1,0,0,1,510.43903,0)" + transform="matrix(-1,0,0,1,1929.2185,0)" width="100%" height="100%" inkscape:export-filename="/home/michael/workspace/perso/spacetac/out/assets/images/menu/title.png" @@ -516,7 +713,7 @@ y="0" xlink:href="#path7585" id="use7600" - transform="translate(75.629323)" + transform="matrix(3.7795277,0,0,3.7795277,285.84312,-31.269639)" width="100%" height="100%" inkscape:export-filename="/home/michael/workspace/perso/spacetac/out/assets/images/menu/title.png" @@ -527,15 +724,15 @@ y="0" xlink:href="#use7600" id="use7603" - transform="translate(0,29.108755)" + transform="translate(0,110.01735)" width="100%" height="100%" inkscape:export-filename="/home/michael/workspace/perso/spacetac/out/assets/images/menu/title.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96" /> @@ -581,18 +778,18 @@ a tactical turn-based RPG + x="821.88324" + y="527.09326" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:DAGGERSQUARE;-inkscape-font-specification:DAGGERSQUARE;letter-spacing:2.69000006px;fill:#8fa5be;fill-opacity:1;stroke-width:1px">a tactical turn-based RPG New game + x="183.24765" + y="747.07294" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:53.33333588px;font-family:DAGGERSQUARE;-inkscape-font-specification:DAGGERSQUARE;fill:#529aee;fill-opacity:1;stroke-width:1px">New game Load game + x="816.1272" + y="748.71356" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:53.33333588px;font-family:DAGGERSQUARE;-inkscape-font-specification:DAGGERSQUARE;fill:#529aee;fill-opacity:1;stroke-width:1px">Load game Quick battle + x="1448.3295" + y="748.71356" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:53.33333588px;font-family:DAGGERSQUARE;-inkscape-font-specification:DAGGERSQUARE;fill:#4b8ad4;fill-opacity:1;stroke-width:1px">Quick battle Load a saved game + x="367.42151" + y="255.34229" + style="font-size:42.66666794px;fill:#ffffff;fill-opacity:1;stroke-width:1px">Load a saved game Enter an invite code + x="360.79651" + y="473.05667" + style="font-size:42.66666794px;fill:#ffffff;fill-opacity:1;stroke-width:1px">Enter an invite code @@ -701,18 +898,19 @@ inkscape:rounded="0" inkscape:randomized="0" d="m 348.01098,69.452232 0,-10.014587 8.67289,5.007294 z" - inkscape:transform-center-x="-1.4454898" - inkscape:transform-center-y="3.6247564e-06" + inkscape:transform-center-x="-5.463256" + inkscape:transform-center-y="1.0903118e-05" inkscape:export-filename="/home/michael/workspace/perso/spacetac/out/assets/images/character/scroll.png" inkscape:export-xdpi="96" - inkscape:export-ydpi="96" /> + inkscape:export-ydpi="96" + transform="scale(3.7795277)" /> @@ -720,16 +918,16 @@ x="0" y="0" xlink:href="#path4777" - inkscape:transform-center-x="1.4454929" - inkscape:transform-center-y="3.6247564e-06" + inkscape:transform-center-x="5.4632299" + inkscape:transform-center-y="1.0903118e-05" id="use6554" width="100%" height="100%" - transform="matrix(-1,0,0,1,586.38849,-6.6582243e-7)" /> + transform="matrix(-1,0,0,1,2216.2716,-2.5164943e-6)" /> + transform="matrix(3.7795277,0,0,3.7795277,-61.149917,-86.453132)"> + transform="matrix(3.7795277,0,0,3.7795277,0,-1.395597e-5)"> + inkscape:export-ydpi="96" + transform="scale(3.7795277)" /> + transform="matrix(3.7795277,0,0,3.7795277,0,2.0000006)"> + inkscape:export-ydpi="96" + transform="scale(3.7795277)"> - + + + versus - + + + - + + + Win diff --git a/out/assets/images/battle/actionbar/button-menu.png b/out/assets/images/battle/actionbar/button-menu.png deleted file mode 100644 index 7c74771..0000000 Binary files a/out/assets/images/battle/actionbar/button-menu.png and /dev/null differ diff --git a/out/assets/images/battle/splash/base.png b/out/assets/images/battle/splash/base.png deleted file mode 100644 index 3cdaa1e..0000000 Binary files a/out/assets/images/battle/splash/base.png and /dev/null differ diff --git a/out/assets/images/battle/splash/shipcard.png b/out/assets/images/battle/splash/shipcard.png deleted file mode 100644 index 12a403a..0000000 Binary files a/out/assets/images/battle/splash/shipcard.png and /dev/null differ diff --git a/out/assets/images/common/dialog-close.png b/out/assets/images/common/dialog-close.png deleted file mode 100644 index 65da8da..0000000 Binary files a/out/assets/images/common/dialog-close.png and /dev/null differ diff --git a/out/assets/images/common/dialog-textbutton.png b/out/assets/images/common/dialog-textbutton.png deleted file mode 100644 index 8d69f86..0000000 Binary files a/out/assets/images/common/dialog-textbutton.png and /dev/null differ diff --git a/out/assets/images/map/action.png b/out/assets/images/map/action.png deleted file mode 100644 index b7ec343..0000000 Binary files a/out/assets/images/map/action.png and /dev/null differ diff --git a/out/assets/images/map/mission-action.png b/out/assets/images/map/mission-action.png deleted file mode 100644 index a4ede33..0000000 Binary files a/out/assets/images/map/mission-action.png and /dev/null differ diff --git a/out/assets/images/menu/button-hover.png b/out/assets/images/menu/button-hover.png deleted file mode 100644 index 9a420f4..0000000 Binary files a/out/assets/images/menu/button-hover.png and /dev/null differ diff --git a/out/assets/images/menu/button.png b/out/assets/images/menu/button.png deleted file mode 100644 index 0a63c9c..0000000 Binary files a/out/assets/images/menu/button.png and /dev/null differ diff --git a/out/assets/images/options/button.png b/out/assets/images/options/button.png deleted file mode 100644 index 4d0c902..0000000 Binary files a/out/assets/images/options/button.png and /dev/null differ diff --git a/out/assets/images/options/options.png b/out/assets/images/options/options.png deleted file mode 100644 index f21d954..0000000 Binary files a/out/assets/images/options/options.png and /dev/null differ diff --git a/out/assets/images/options/toggle.png b/out/assets/images/options/toggle.png deleted file mode 100644 index 48a7d00..0000000 Binary files a/out/assets/images/options/toggle.png and /dev/null differ diff --git a/out/assets/fonts/control-freak.regular.ttf b/out/fonts/control-freak.regular.ttf similarity index 100% rename from out/assets/fonts/control-freak.regular.ttf rename to out/fonts/control-freak.regular.ttf diff --git a/out/assets/fonts/daggersquare.regular.otf b/out/fonts/daggersquare.regular.otf similarity index 100% rename from out/assets/fonts/daggersquare.regular.otf rename to out/fonts/daggersquare.regular.otf diff --git a/out/assets/fonts/fragile-bombers.regular.ttf b/out/fonts/fragile-bombers.regular.ttf similarity index 100% rename from out/assets/fonts/fragile-bombers.regular.ttf rename to out/fonts/fragile-bombers.regular.ttf diff --git a/out/assets/fonts/mysterons-brk.normal.ttf b/out/fonts/mysterons-brk.normal.ttf similarity index 100% rename from out/assets/fonts/mysterons-brk.normal.ttf rename to out/fonts/mysterons-brk.normal.ttf diff --git a/out/assets/fonts/planetium-x.regular.otf b/out/fonts/planetium-x.regular.otf similarity index 100% rename from out/assets/fonts/planetium-x.regular.otf rename to out/fonts/planetium-x.regular.otf diff --git a/out/assets/images/common/particles.png b/out/images/common/particles.png similarity index 100% rename from out/assets/images/common/particles.png rename to out/images/common/particles.png diff --git a/out/assets/images/common/waiting.png b/out/images/common/waiting.png similarity index 100% rename from out/assets/images/common/waiting.png rename to out/images/common/waiting.png diff --git a/out/assets/images/preload/bar-background.png b/out/images/preload/bar-background.png similarity index 100% rename from out/assets/images/preload/bar-background.png rename to out/images/preload/bar-background.png diff --git a/out/assets/images/preload/bar-content.png b/out/images/preload/bar-content.png similarity index 100% rename from out/assets/images/preload/bar-content.png rename to out/images/preload/bar-content.png diff --git a/out/index.html b/out/index.html index b7397b9..743d1ba 100644 --- a/out/index.html +++ b/out/index.html @@ -23,7 +23,7 @@ @font-face { font-family: 'SpaceTac'; - src: url('assets/fonts/daggersquare.regular.otf'); + src: url('fonts/daggersquare.regular.otf'); } body { diff --git a/package-lock.json b/package-lock.json index 5bd8811..3bce92e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,52 +4,6 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@taskr/shell": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@taskr/shell/-/shell-1.1.0.tgz", - "integrity": "sha1-YDV8rNlKQvXFlqpxBUK4eQDcPwY=", - "dev": true, - "requires": { - "execa": "0.7.0" - } - }, - "@taskr/uglify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@taskr/uglify/-/uglify-1.1.0.tgz", - "integrity": "sha1-DIspLj3sr/4KTPQa7HEWEYWbyZg=", - "dev": true, - "requires": { - "uglify-js": "2.8.29" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - } - } - } - }, - "@taskr/watch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@taskr/watch/-/watch-1.1.0.tgz", - "integrity": "sha1-v0RxeM+scfyZslD/RsQK0/lhc9Y=", - "dev": true, - "requires": { - "chokidar": "1.7.0" - } - }, "@types/jasmine": { "version": "2.8.6", "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.8.6.tgz", @@ -305,6 +259,12 @@ "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", "dev": true }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true + }, "array-filter": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", @@ -379,6 +339,12 @@ "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", "dev": true }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, "ast-types": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.2.tgz", @@ -401,6 +367,26 @@ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "dev": true }, + "async-done": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.2.4.tgz", + "integrity": "sha512-mxc+yISkb0vjsuvG3dJCIZXzRWjKndQ9Zo9zNDJ1K2wh9eP0E0oGmOWm+4cFOvW4dA0tGFImTW5tQJHCtn1kIQ==", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0", + "process-nextick-args": "1.0.7", + "stream-exhaust": "1.0.2" + }, + "dependencies": { + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + } + } + }, "async-each": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", @@ -418,6 +404,12 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, + "atob": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz", + "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=", + "dev": true + }, "aws-sign2": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", @@ -480,6 +472,38 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "pascalcase": "0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, "base64-arraybuffer": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", @@ -903,6 +927,31 @@ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", "dev": true }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "1.0.0", + "component-emitter": "1.2.1", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.0", + "to-object-path": "0.3.0", + "union-value": "1.0.0", + "unset-value": "1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, "cached-path-relative": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.1.tgz", @@ -942,6 +991,7 @@ "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", "dev": true, + "optional": true, "requires": { "align-text": "0.1.4", "lazy-cache": "1.0.4" @@ -993,11 +1043,104 @@ "integrity": "sha512-UjgcRlTAhAkLeXmDe2wK7ktwy/tgAqxiSndTIPiFZuIPLZmzHzWMwUIe9h9m/OokypG7snxCDEuwJshGBdPvaw==", "dev": true }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" + }, + "dependencies": { + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, "cliui": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", "dev": true, + "optional": true, "requires": { "center-align": "0.1.3", "right-align": "0.1.3", @@ -1008,16 +1151,11 @@ "version": "0.0.2", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true + "dev": true, + "optional": true } } }, - "clor": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/clor/-/clor-5.2.0.tgz", - "integrity": "sha512-Z+jjxoF4lNUJQtsdz7d9HLz7yP49hnt4CH76AB7DLusHws14gOlVMl/ShtkMPfoFculqejaiQW5EG2Gt5/cCdg==", - "dev": true - }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -1035,6 +1173,31 @@ "urlgrey": "0.4.4" } }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "1.0.0", + "object-visit": "1.0.1" + } + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, "colors": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", @@ -1193,6 +1356,12 @@ "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", "dev": true }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, "core-js": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", @@ -1250,29 +1419,6 @@ "sha.js": "2.4.10" } }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", - "dev": true, - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } - } - } - }, "cryptiles": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", @@ -1377,12 +1523,36 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "1.0.2", + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, "defined": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", @@ -1553,6 +1723,15 @@ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", "dev": true }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "1.4.0" + } + }, "engine.io": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.5.tgz", @@ -1653,8 +1832,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "optional": true + "dev": true }, "escodegen": { "version": "1.9.1", @@ -1732,21 +1910,6 @@ "safe-buffer": "5.1.1" } }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - } - }, "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -2018,6 +2181,15 @@ "mime-types": "2.1.18" } }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "0.2.2" + } + }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -2101,6 +2273,21 @@ "glob": "5.0.15", "mustache": "2.3.0", "optimist": "0.6.1" + }, + "dependencies": { + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + } } }, "generate-function": { @@ -2126,12 +2313,6 @@ "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", "dev": true }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, "get-uri": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.1.tgz", @@ -2147,6 +2328,12 @@ "readable-stream": "2.3.5" } }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -2165,11 +2352,12 @@ } }, "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { + "fs.realpath": "1.0.0", "inflight": "1.0.6", "inherits": "2.0.3", "minimatch": "3.0.4", @@ -2196,6 +2384,362 @@ "is-glob": "2.0.1" } }, + "glob-watcher": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.1.tgz", + "integrity": "sha512-fK92r2COMC199WCyGUblrZKhjra3cyVMDiypDdqg1vsSDmexnbYivK1kNR4QItiNXLKmGlqan469ks67RtNa2g==", + "dev": true, + "requires": { + "async-done": "1.2.4", + "chokidar": "2.0.2", + "just-debounce": "1.0.0", + "object.defaults": "1.1.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "3.1.9", + "normalize-path": "2.1.1" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz", + "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "define-property": "1.0.0", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "kind-of": "6.0.2", + "repeat-element": "1.1.2", + "snapdragon": "0.8.1", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "chokidar": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.2.tgz", + "integrity": "sha512-l32Hw3wqB0L2kGVmSbK/a+xXLDrUEsc84pSgMkmwygHvD7ubRsP/vxxHa5BtB6oix1XLLVCHyYMsckRXxThmZw==", + "dev": true, + "requires": { + "anymatch": "2.0.0", + "async-each": "1.0.1", + "braces": "2.3.1", + "glob-parent": "3.1.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "4.0.0", + "normalize-path": "2.1.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0", + "upath": "1.0.4" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.1", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.1", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + } + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.9.tgz", + "integrity": "sha512-SlIz6sv5UPaAVVFRKodKjCg48EbNoIhgetzfK/Cy0v5U52Z6zB136M8tp0UC9jM53LYbmIRihJszvvqpKkfm9g==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.1", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.1", + "to-regex": "3.0.2" + } + } + } + }, "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", @@ -2310,6 +2854,66 @@ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", "dev": true }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, "hash-base": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", @@ -2597,6 +3201,12 @@ } } }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "dev": true + }, "ip": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ip/-/ip-1.0.1.tgz", @@ -2604,6 +3214,23 @@ "dev": true, "optional": true }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -2634,6 +3261,42 @@ "builtin-modules": "1.1.1" } }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, "is-dotfile": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", @@ -2709,6 +3372,40 @@ "kind-of": "3.2.2" } }, + "is-odd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", + "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", + "dev": true, + "requires": { + "is-number": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, "is-posix-bracket": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", @@ -2746,6 +3443,12 @@ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "dev": true }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, "is-wsl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", @@ -2832,6 +3535,19 @@ "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", "dev": true }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, "resolve": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", @@ -2991,6 +3707,12 @@ } } }, + "just-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", + "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", + "dev": true + }, "karma": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/karma/-/karma-2.0.0.tgz", @@ -3142,7 +3864,8 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true + "dev": true, + "optional": true }, "levn": { "version": "0.3.0", @@ -3306,6 +4029,12 @@ "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", "dev": true }, + "lodash.padend": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", + "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=", + "dev": true + }, "log4js": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/log4js/-/log4js-2.5.3.tgz", @@ -3516,6 +4245,12 @@ } } }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", @@ -3528,6 +4263,15 @@ "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", "dev": true }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "1.0.1" + } + }, "md5.js": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", @@ -3582,6 +4326,30 @@ } } }, + "microargs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/microargs/-/microargs-1.1.0.tgz", + "integrity": "sha1-XsPNi9dzf1fUhVlBMZM+qUMJ+1k=", + "dev": true + }, + "microcli": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/microcli/-/microcli-1.3.1.tgz", + "integrity": "sha512-0MQ0w457h33GuktLJwzA/EmZK9B7QwcG5FqWM+7Ep5XPkFJvT3vZ6XIDaqUXYLpDAqsCSnhTKTWzWiDbXkn8mQ==", + "dev": true, + "requires": { + "lodash": "4.17.4", + "microargs": "1.1.0" + }, + "dependencies": { + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + } + } + }, "micromatch": { "version": "2.3.11", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", @@ -3661,11 +4429,26 @@ "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", "dev": true }, - "mk-dirs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mk-dirs/-/mk-dirs-1.0.0.tgz", - "integrity": "sha1-RO5n+CNBxnYnGOiOheV3iC4fZ/0=", - "dev": true + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "1.0.2", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } }, "mkdirp": { "version": "0.5.1", @@ -3720,12 +4503,6 @@ "on-headers": "1.0.1" } }, - "mri": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.0.tgz", - "integrity": "sha1-XAo/KcjM/7ux7JQdzsCdcfoy82o=", - "dev": true - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -3738,6 +4515,65 @@ "integrity": "sha1-QCj3d4sXcIpImTCm5SrDvKDaQdA=", "dev": true }, + "nanomatch": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", + "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-odd": "2.0.0", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.1", + "to-regex": "3.0.2" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", @@ -3873,15 +4709,6 @@ "remove-trailing-separator": "1.1.0" } }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "2.0.1" - } - }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -3906,6 +4733,117 @@ "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", "dev": true }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "requires": { + "array-each": "1.0.1", + "array-slice": "1.1.0", + "for-own": "1.0.0", + "isobject": "3.0.1" + }, + "dependencies": { + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, "object.omit": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", @@ -3916,6 +4854,29 @@ "is-extendable": "0.1.1" } }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "omelette": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/omelette/-/omelette-0.4.5.tgz", + "integrity": "sha512-b0k9uqwF60u15KmVkneVw96VYRtZu2QCbXUQ26SgdyVUgMBzctzIfhNPKAWl4oqJEKpe52CzBYSS+HIKtiK8sw==", + "dev": true + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -3993,12 +4954,6 @@ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, "pac-proxy-agent": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-1.1.0.tgz", @@ -4123,12 +5078,24 @@ "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", "dev": true }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, "path-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", "dev": true }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, "path-exists": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", @@ -4144,12 +5111,6 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, "path-parse": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", @@ -4294,6 +5255,12 @@ } } }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -4538,6 +5505,15 @@ "set-immediate-shim": "1.0.1" } }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "1.5.0" + } + }, "redent": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", @@ -4588,6 +5564,37 @@ "is-equal-shallow": "0.1.3" } }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, "remap-istanbul": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/remap-istanbul/-/remap-istanbul-0.10.1.tgz", @@ -4734,11 +5741,24 @@ "path-parse": "1.0.5" } }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, "right-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", "dev": true, + "optional": true, "requires": { "align-text": "0.1.4" } @@ -4778,11 +5798,69 @@ "inherits": "2.0.3" } }, + "runjs": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/runjs/-/runjs-4.3.0.tgz", + "integrity": "sha512-TQLLO6bJ5Ht1aEiF002nzdn99HeoaVt7P34nCio1AjKA8zCAgeqHOBVdJAWQ8F3SOlxVbWjina9FRE+3TFsZSg==", + "dev": true, + "requires": { + "chalk": "2.3.0", + "lodash.padend": "4.6.1", + "microcli": "1.3.1", + "omelette": "0.4.5" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "0.1.15" + } + }, "semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", @@ -4833,12 +5911,44 @@ "parseurl": "1.3.2" } }, + "set-getter": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz", + "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=", + "dev": true, + "requires": { + "to-object-path": "0.3.0" + } + }, "set-immediate-shim": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", "dev": true }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, "setprototypeof": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", @@ -4876,21 +5986,6 @@ } } }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, "shell-quote": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", @@ -4903,6 +5998,33 @@ "jsonify": "0.0.0" } }, + "shelljs": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.1.tgz", + "integrity": "sha512-YA/iYtZpzFe5HyWVGrb02FjPxc4EMCfpoU/Phg9fQoyMC72u9598OUBrsU8IrtwAKG0tO8IYaqbaLIw+k3IRGA==", + "dev": true, + "requires": { + "glob": "7.1.2", + "interpret": "1.1.0", + "rechoir": "0.6.2" + }, + "dependencies": { + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + } + } + }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -4935,6 +6057,142 @@ "nodemailer-shared": "1.1.0" } }, + "snapdragon": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.1.tgz", + "integrity": "sha1-4StUh/re0+PeoKyR6UAL91tAE3A=", + "dev": true, + "requires": { + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.1", + "use": "2.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, "sntp": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", @@ -5048,6 +6306,25 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, + "source-map-resolve": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", + "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", + "dev": true, + "requires": { + "atob": "2.0.3", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, "spdx-correct": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", @@ -5089,6 +6366,36 @@ "through": "2.3.8" } }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -5119,6 +6426,84 @@ } } }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "0.2.5", + "object-copy": "0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, "statuses": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", @@ -5154,6 +6539,12 @@ "readable-stream": "2.3.5" } }, + "stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", + "dev": true + }, "stream-http": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.0.tgz", @@ -5234,12 +6625,6 @@ "is-utf8": "0.2.1" } }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, "strip-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", @@ -5282,36 +6667,6 @@ "acorn-node": "1.3.0" } }, - "taskr": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/taskr/-/taskr-1.1.0.tgz", - "integrity": "sha1-TynQrOJvTerppHjqv5qgQy6IRDg=", - "dev": true, - "requires": { - "bluebird": "3.5.1", - "clor": "5.2.0", - "glob": "7.1.2", - "mk-dirs": "1.0.0", - "mri": "1.1.0", - "tinydate": "1.0.0" - }, - "dependencies": { - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - } - } - }, "throttleit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", @@ -5357,12 +6712,6 @@ "dev": true, "optional": true }, - "tinydate": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tinydate/-/tinydate-1.0.0.tgz", - "integrity": "sha1-IPMXVqE5We+MV+wTO6KbWt4ELKw=", - "dev": true - }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -5384,6 +6733,69 @@ "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", "dev": true }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "repeat-string": "1.6.1" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + } + } + }, "tough-cookie": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", @@ -5493,6 +6905,47 @@ "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", "dev": true }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" + }, + "dependencies": { + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" + } + } + } + }, "unix-crypt-td-js": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unix-crypt-td-js/-/unix-crypt-td-js-1.0.0.tgz", @@ -5505,6 +6958,64 @@ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "0.3.1", + "isobject": "3.0.1" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "upath": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.0.4.tgz", + "integrity": "sha512-d4SJySNBXDaQp+DPrziv3xGS6w3d2Xt69FijJr86zMPBy23JEloMCEOUBBzuN7xCtjLCnmB9tI/z7SBCahHBOw==", + "dev": true + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", @@ -5529,6 +7040,100 @@ "integrity": "sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8=", "dev": true }, + "use": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/use/-/use-2.0.2.tgz", + "integrity": "sha1-riig1y+TvyJCKhii43mZMRLeyOg=", + "dev": true, + "requires": { + "define-property": "0.2.5", + "isobject": "3.0.1", + "lazy-cache": "2.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "dev": true, + "requires": { + "set-getter": "0.1.0" + } + } + } + }, "useragent": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", @@ -5679,7 +7284,8 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true + "dev": true, + "optional": true }, "wordwrap": { "version": "0.0.3", @@ -5738,6 +7344,7 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "dev": true, + "optional": true, "requires": { "camelcase": "1.2.1", "cliui": "2.1.0", @@ -5749,7 +7356,8 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true + "dev": true, + "optional": true } } }, diff --git a/package.json b/package.json index abe7d61..09f8e4d 100644 --- a/package.json +++ b/package.json @@ -4,11 +4,11 @@ "description": "A tactical RPG set in space", "main": "out/build.js", "scripts": { - "build": "taskr build", - "test": "taskr test", - "start": "taskr", + "build": "run build", + "test": "run test", + "start": "run continuous", "codecov": "remap-istanbul -i out/coverage/coverage.json -o out/coverage/mapped.json -t json && codecov -f out/coverage/mapped.json", - "deploy": "taskr deploy" + "deploy": "run deploy" }, "repository": { "type": "git", @@ -17,12 +17,12 @@ "author": "Michael Lemaire", "license": "MIT", "devDependencies": { - "@taskr/shell": "^1.1.0", - "@taskr/watch": "^1.1.0", "@types/jasmine": "^2.8.6", "babel-polyfill": "6.26.0", "codecov": "3.0.0", "gamefroot-texture-packer": "Gamefroot/Gamefroot-Texture-Packer.git#f3687111afc94f80ea8f2877c188fb8e2004e8ff", + "glob": "^7.1.2", + "glob-watcher": "^5.0.1", "jasmine": "^2.9.0", "karma": "^2.0.0", "karma-coverage": "1.1.1", @@ -31,7 +31,8 @@ "karma-spec-reporter": "^0.0.32", "live-server": "1.2.0", "remap-istanbul": "^0.10.1", - "taskr": "^1.1.0", + "runjs": "^4.3.0", + "shelljs": "^0.8.1", "typescript": "^2.7.1", "uglify-js": "^3.3.13" }, @@ -40,4 +41,4 @@ "parse": "^1.11.0", "phaser": "2.6.2" } -} \ No newline at end of file +} diff --git a/runfile.js b/runfile.js new file mode 100644 index 0000000..d1f8342 --- /dev/null +++ b/runfile.js @@ -0,0 +1,236 @@ +'use strict'; + +const path = require('path'); +const fs = require('fs'); +const { run } = require('runjs'); +const glob = require('glob'); +const watch = require('glob-watcher'); +const shell = require('shelljs'); +const liveServer = require('live-server'); +const gfPacker = require('gamefroot-texture-packer'); + +String.prototype.rsplit = function (sep, maxsplit) { + var split = this.split(sep); + return maxsplit ? [split.slice(0, -maxsplit).join(sep)].concat(split.slice(-maxsplit)) : split; +} + +/** + * Promise-compatible version of glob + */ +function list(pattern) { + return new Promise((resolve, reject) => { + glob(pattern, (err, files) => (err) ? reject(err) : resolve(files)); + }); +} + +/** + * Asynchronous execution of shell commands + */ +function exec(command) { + return run(command, { async: true }); +} + +/** + * Build app from typescript sources + */ +function ts() { + console.log("Building app..."); + return exec("tsc -p ."); +} + +/** + * Start watching for typescript changes + */ +function watch_ts() { + watch(["./src/**/*.ts"], ts); +} + +/** + * Build an atlas of images for a given stage + */ +function atlas(stage) { + shell.rm('-f', `out/assets/atlas${stage}-*`); + return list(`data/stage${stage}/image/**/*.{png,jpg}`).then(files => { + let opts = { + name: `out/assets/atlas${stage}`, + fullpath: true, + width: 1024, + height: 1024, + square: true, + powerOfTwo: true, + trim: true, + padding: 2 + }; + return new Promise(resolve => gfPacker(files, opts, resolve)); + }).then(() => { + return list(`out/assets/atlas${stage}-*.json`); + }).then(outfiles => { + return Promise.resolve(outfiles.map(file => path.basename(file).replace('.json', ''))) + }); +} + +/** + * Build a single data pack + */ +function pack(stage) { + console.log(`Building pack ${stage}...`); + + let getKey = x => x.replace(/\//g, "-").replace(/\.[a-z0-9]+$/, ''); + + return atlas(stage).then(files => { + return Promise.resolve(files.map(file => { + let fname = path.basename(file); + return { + type: "atlasJSONHash", + key: fname, + atlasURL: `assets/${fname}.json`, + textureURL: `assets/${fname}.png`, + atlasData: null + } + })); + }).then(items => { + return list(`data/stage${stage}/sound/**/*.{mp3,wav}`).then(files => { + return Promise.resolve(items.concat(files.map(file => { + const [name, ext] = file.rsplit('.'); + const key = getKey(name.replace(`data/stage${stage}/sound/`, '')); + shell.cp(file, `out/assets/${key}.${ext}`); + return { + type: "audio", + key: key, + urls: [`assets/${key}.${ext}`], + autoDecode: (ext == 'mp3') + }; + }))); + }); + }).then(items => { + return list(`data/stage${stage}/shader/**/*.glsl`).then(files => { + return Promise.resolve(items.concat(files.map(file => { + const [name, ext] = file.rsplit('.'); + const key = getKey(name.replace(`data/stage${stage}/shader/`, '')); + shell.cp(file, `out/assets/${key}.${ext}`); + return { + type: "shader", + key: key, + url: `assets/${key}.${ext}` + }; + }))); + }); + }).then(items => { + let packdata = {}; + packdata[`stage${stage}`] = items; + return new Promise(resolve => fs.writeFile(`out/assets/pack${stage}.json`, JSON.stringify(packdata), 'utf8', resolve)); + }); +} + +/** + * Build data packs + */ +function data() { + shell.mkdir("-p", "out/assets"); + return Promise.all([1, 2, 3].map(stage => pack(stage))); +} + +/** + * Start watch for data changes + */ +function watch_data() { + watch(["./data/**/*.*"], data); +} + +/** + * Copy the vendors from node_modules to dist directory + */ +function vendors() { + console.log("Copying vendors..."); + shell.rm('-rf', 'out/vendor'); + shell.mkdir('-p', 'out/vendor'); + shell.cp('-R', 'node_modules/phaser/build', 'out/vendor/phaser'); + shell.cp('-R', 'node_modules/parse/dist', 'out/vendor/parse'); + shell.cp('-R', 'node_modules/jasmine-core/lib/jasmine-core', 'out/vendor/jasmine'); + return Promise.resolve(); +} + +/** + * Start watching for vendors changes + */ +function watch_vendors() { + watch(['package.json'], vendors); +} + +/** + * Trigger a single build + */ +function build() { + return Promise.all([ + ts(), + data(), + vendors() + ]); +} + +/** + * Optimize the build for production + */ +function optimize() { + return exec("uglifyjs out/build.js --source-map --output out/build.min.js"); +} + +/** + * Deploy to production + */ +function deploy(task) { + return build().then(optimize).then(() => { + return exec("rsync -avz --delete ./out/ hosting.thunderk.net:/srv/website/spacetac/") + }); +} + +/** + * Run tests in karma, using freshly built app + */ +function test(task) { + return build().then(() => { + return exec("karma start spec/support/karma.conf.js"); + }).then(() => { + return exec("remap-istanbul -i out/coverage/coverage.json -o out/coverage -t html"); + }); +} + +/** + * Serve the app for dev purpose + */ +function serve() { + liveServer.start({ + host: '127.0.0.1', + port: 8012, + root: 'out', + ignore: 'coverage', + wait: 500 + }); + return new Promise(() => null); +} + +/** + * Continuous development server + */ +function continuous() { + return build().then(() => Promise.all([ + serve(), + watch_ts(), + watch_data(), + watch_vendors() + ])); +} + +module.exports = { + ts, + watch_ts, + data, + watch_data, + vendors, + watch_vendors, + build, + test, + deploy, + serve, + continuous +} diff --git a/src/ui/AssetLoading.ts b/src/ui/AssetLoading.ts index 7f1f27c..96cdb00 100644 --- a/src/ui/AssetLoading.ts +++ b/src/ui/AssetLoading.ts @@ -41,89 +41,21 @@ module TK.SpaceTac.UI { if (this.required >= AssetLoadingRange.MENU && AssetLoading.loaded < AssetLoadingRange.MENU) { console.log("Loading menu assets"); + this.load.pack("stage1", "assets/pack1.json"); - this.loadSound("ui/button-down.wav"); - this.loadSound("ui/button-up.wav"); - this.loadSound("ui/button-click.wav"); - this.loadSound("ui/dialog-open.wav"); - this.loadSound("ui/dialog-close.wav"); - - this.loadSheet("options/options.png", 128, 128); - + // TODO pack this.loadSheet("common/particles.png", 32); - this.loadImage("common/transparent.png"); - this.loadImage("common/debug.png"); this.loadAnimation("common/waiting.png", 128, 128, 6); - this.loadImage("common/arrow.png"); - this.loadImage("common/button-ok.png"); - this.loadImage("common/button-cancel.png"); - this.loadImage("common/dialog.png"); - this.loadSheet("common/dialog-textbutton.png", 316, 59); - this.loadSheet("common/dialog-close.png", 92, 82); - - this.loadImage("menu/title.png"); - this.loadImage("menu/button.png"); - this.loadImage("menu/button-hover.png"); - this.loadImage("menu/load-bg.png"); - - this.loadSound("music/supernatural.mp3"); } if (this.required >= AssetLoadingRange.BATTLE && AssetLoading.loaded < AssetLoadingRange.BATTLE) { console.log("Loading battle assets"); - - // TODO automatic range - range(4).forEach(i => this.loadAtlas(i + 1)); - - this.loadImage("options/background.png"); - this.loadSheet("options/button.png", 497, 134); - this.loadSheet("options/toggle.png", 149, 149); - - this.loadSheet("battle/splash/base.png", 853, 210); - this.loadSheet("battle/splash/shipcard.png", 99, 114); - this.loadImage("battle/background.jpg"); - this.loadImage("battle/actionbar/background.png"); - this.loadImage("battle/actionbar/actions-background.png"); - this.loadSheet("battle/actionbar/button-menu.png", 79, 132); - this.loadImage("battle/arena/background.png"); - this.loadImage("battle/shiplist/background.png"); - this.loadImage("battle/shiplist/item-background.png"); - this.loadImage("battle/shiplist/damage.png"); - this.loadImage("battle/shiplist/hover.png"); - this.loadImage("battle/shiplist/info-button.png"); - - this.loadImage("character/sheet.png"); - - this.loadSound("ui/drag.wav"); - this.loadSound("ui/drop.wav"); - - this.loadSound("battle/ship-change.wav"); - this.loadSound("battle/weapon-laser.wav"); - this.loadSound("battle/weapon-bullets.wav"); - this.loadSound("battle/weapon-missile-launch.wav"); - this.loadSound("battle/weapon-missile-explosion.wav"); - this.loadSound("battle/drone-deploy.wav"); - this.loadSound("battle/drone-destroy.wav"); - // this.loadSound("battle/drone-activate.wav"); - - this.loadSound("music/mechanolith.mp3"); + this.load.pack("stage2", "assets/pack2.json"); } if (this.required >= AssetLoadingRange.CAMPAIGN && AssetLoading.loaded < AssetLoadingRange.CAMPAIGN) { console.log("Loading campaign assets"); - - this.loadImage("map/starsystem-background.png"); - this.loadImage("map/name.png"); - this.loadImage("map/subname.png"); - this.loadSheet("map/action.png", 323, 192); - this.loadImage("map/orbit.png"); - this.loadImage("map/boundaries.png"); - this.loadSheet("map/mission-action.png", 192, 56); - - this.loadSound("music/division.mp3"); - this.loadSound("music/spring-thaw.mp3"); - - this.loadShader("map-background.glsl"); + this.load.pack("stage3", "assets/pack3.json"); } this.load.start(); @@ -140,28 +72,12 @@ module TK.SpaceTac.UI { return path.replace(/\//g, "-").replace(/\.[a-z0-9]+$/, ''); } - loadAtlas(index: number) { - this.load.atlasJSONHash(`atlas-${index}`, `assets/atlas-${index}.png`, `assets/atlas-${index}.json`); - } - loadSheet(path: string, frame_width: number, frame_height = frame_width) { - this.load.spritesheet(AssetLoading.getKey(path), "assets/images/" + path, frame_width, frame_height); + this.load.spritesheet(AssetLoading.getKey(path), "images/" + path, frame_width, frame_height); } loadAnimation(path: string, frame_width: number, frame_height = frame_width, count?: number) { - this.load.spritesheet(AssetLoading.getKey(path), "assets/images/" + path, frame_width, frame_height, count); - } - - loadImage(path: string) { - this.load.image(AssetLoading.getKey(path), "assets/images/" + path); - } - - loadSound(path: string) { - this.load.audio(AssetLoading.getKey(path), "assets/sounds/" + path); - } - - loadShader(path: string) { - this.load.shader(AssetLoading.getKey(path), "assets/shaders/" + path); + this.load.spritesheet(AssetLoading.getKey(path), "images/" + path, frame_width, frame_height, count); } } } diff --git a/src/ui/BaseView.ts b/src/ui/BaseView.ts index fa61705..bf04419 100644 --- a/src/ui/BaseView.ts +++ b/src/ui/BaseView.ts @@ -248,15 +248,17 @@ module TK.SpaceTac.UI { if (this.game.cache.checkImageKey(name)) { return { key: name, frame: 0, exists: true }; } else { - let i = 1; - while (this.game.cache.checkImageKey(`atlas-${i}`)) { - let data = this.game.cache.getFrameData(`atlas-${i}`); - let frames = data.getFrames(); - let frame = first(frames, frame => AssetLoading.getKey(frame.name) == `graphics-exported-${name}`); - if (frame) { - return { key: `atlas-${i}`, frame: frame.index, exists: true }; + for (let j = 1; j <= 3; j++) { + let i = 1; + while (this.game.cache.checkImageKey(`atlas${j}-${i}`)) { + let data = this.game.cache.getFrameData(`atlas${j}-${i}`); + let frames = data.getFrames(); + let frame = first(frames, frame => AssetLoading.getKey(frame.name) == `data-stage${j}-image-${name}`); + if (frame) { + return { key: `atlas${j}-${i}`, frame: frame.index, exists: true }; + } + i++; } - i++; } return { key: `-missing-${name}`, frame: 0, exists: false }; } diff --git a/src/ui/Boot.ts b/src/ui/Boot.ts index ab9361d..09e18f0 100644 --- a/src/ui/Boot.ts +++ b/src/ui/Boot.ts @@ -7,8 +7,8 @@ module TK.SpaceTac.UI { export class Boot extends Phaser.State { preload() { if (!(this.game).headless) { - this.load.image("preload-background", "assets/images/preload/bar-background.png"); - this.load.image("preload-bar", "assets/images/preload/bar-content.png"); + this.load.image("preload-background", "images/preload/bar-background.png"); + this.load.image("preload-bar", "images/preload/bar-content.png"); } } diff --git a/src/ui/battle/ActionBar.ts b/src/ui/battle/ActionBar.ts index 958b75b..964ae8d 100644 --- a/src/ui/battle/ActionBar.ts +++ b/src/ui/battle/ActionBar.ts @@ -10,7 +10,7 @@ module TK.SpaceTac.UI { // Power indicator power: Phaser.Group - power_icons: Phaser.Group + power_icons!: Phaser.Group // Indicator of interaction disabled icon_waiting: Phaser.Image @@ -31,23 +31,24 @@ module TK.SpaceTac.UI { battleview.layer_borders.add(this); + let builder = new UIBuilder(battleview, this); + // Background - this.add(new Phaser.Image(this.game, 0, 0, "battle-actionbar-background", 0)); + builder.image("battle-actionbar-background"); // Group for actions - this.actions = this.game.add.group(this, "actions"); - this.actions.position.set(86, 6); - this.actions.add(new Phaser.Image(this.game, 0, 0, "battle-actionbar-actions-background")); + this.actions = builder.group("actions", 86, 6); + builder.in(this.actions).image("battle-actionbar-actions-background"); // Power bar - this.power = this.game.add.group(this, "power"); - this.power.position.set(1468, 0); - this.power.add(battleview.newImage("battle-actionbar-power-background", 0, 6)); - this.power_icons = this.game.add.group(this.power, "power icons"); - this.power_icons.position.set(50, 14); + this.power = builder.group("power", 1468, 0); + builder.in(this.power, builder => { + builder.image("battle-actionbar-power-background", 0, 6); + this.power_icons = builder.group("power icons", 50, 14); + }); // Playing ship - this.add(battleview.newImage("battle-actionbar-ship", 1730, -2)); + builder.image("battle-actionbar-ship", 1730, -2); // Waiting icon this.icon_waiting = new Phaser.Image(this.game, this.width / 2, this.height / 2, "common-waiting", 0); @@ -56,8 +57,7 @@ module TK.SpaceTac.UI { this.add(this.icon_waiting); // Options button - let button = battleview.add.button(0, 0, "battle-actionbar-button-menu", () => battleview.showOptions(), null, 1, 0, 0, 1, this); - battleview.tooltip.bindStaticText(button, "Game options"); + builder.button("battle-actionbar-button-menu", 0, 0, () => battleview.showOptions(), "Game options"); // Log processing battleview.log_processor.register(diff => { diff --git a/src/ui/battle/Arena.ts b/src/ui/battle/Arena.ts index e7eafca..e6d1c79 100644 --- a/src/ui/battle/Arena.ts +++ b/src/ui/battle/Arena.ts @@ -93,7 +93,8 @@ module TK.SpaceTac.UI { setupMouseCapture() { let view = this.view; - var background = new Phaser.Button(view.game, 0, 0, "battle-arena-background"); + let info = view.getImageInfo("battle-arena-background"); + var background = new Phaser.Button(view.game, 0, 0, info.key, undefined, undefined, info.frame, info.frame); background.name = "mouse-capture"; background.scale.set(this.boundaries.width / background.width, this.boundaries.height / background.height); this.mouse_capture = background; diff --git a/src/ui/battle/BattleSplash.ts b/src/ui/battle/BattleSplash.ts index dab3446..872a41d 100644 --- a/src/ui/battle/BattleSplash.ts +++ b/src/ui/battle/BattleSplash.ts @@ -11,50 +11,35 @@ module TK.SpaceTac.UI { constructor(view: BaseView, fleet1: Fleet, fleet2: Fleet) { this.view = view; - this.message = view.game.add.image(view.getMidWidth(), view.getMidHeight(), "battle-splash-base", 0); - this.message.anchor.set(0.5); + let builder = new UIBuilder(view); + + this.message = builder.image("battle-splash-message-off", view.getMidWidth(), view.getMidHeight(), true); this.message.visible = false; - this.player1 = view.game.add.image(0, -70, "battle-splash-base", 2); - this.player1.anchor.set(0.5); + this.player1 = builder.in(this.message).image("battle-splash-moving-part", 0, -70, true); this.player1.visible = false; - this.message.addChild(this.player1); - let player1_name = view.game.add.text(-240, 22, fleet1.name, { font: `bold 22pt SpaceTac`, fill: "#154d13" }); - player1_name.anchor.set(0.5); + let player1_name = builder.in(this.player1).text(fleet1.name, -240, 22, { size: 22, bold: true, color: "#154d13" }); player1_name.angle = -48; - this.player1.addChild(player1_name); fleet1.ships.forEach((ship, index) => { - let ship_card = view.game.add.image(-100 + index * 96, -26, "battle-splash-shipcard", 0); - ship_card.anchor.set(0.5); - let ship_portrait = view.newImage(`ship-${ship.model.code}-portrait`, -2, 2); + let ship_card = builder.in(this.player1).image("battle-splash-shipcard-top", -100 + index * 96, -26, true); + let ship_portrait = builder.in(ship_card).image(`ship-${ship.model.code}-portrait`, -2, 2, true); ship_portrait.scale.set(0.3); - ship_portrait.anchor.set(0.5); - ship_card.addChild(ship_portrait); - this.player1.addChild(ship_card); }); - this.player2 = view.game.add.image(0, 70, "battle-splash-base", 2); - this.player2.anchor.set(0.5); + this.player2 = builder.in(this.message).image("battle-splash-moving-part", 0, 70, true); this.player2.angle = 180; this.player2.visible = false; - this.message.addChild(this.player2); - let player2_name = view.game.add.text(-240, 22, fleet2.name, { font: `bold 22pt SpaceTac`, fill: "#651713" }); - player2_name.anchor.set(0.5); + let player2_name = builder.in(this.player2).text(fleet2.name, -240, 22, { size: 22, bold: true, color: "#651713" }); player2_name.angle = -228; - this.player2.addChild(player2_name); fleet2.ships.forEach((ship, index) => { - let ship_card = view.game.add.image(-104 + index * 96, -32, "battle-splash-shipcard", 1); - ship_card.anchor.set(0.5); - let ship_portrait = view.newImage(`ship-${ship.model.code}-portrait`, -2, -12); - ship_portrait.scale.set(0.3); - ship_portrait.anchor.set(0.5); + let ship_card = builder.in(this.player2).image("battle-splash-shipcard-top", -104 + index * 96, -32, true); ship_card.angle = 180; - ship_card.addChild(ship_portrait); - this.player2.addChild(ship_card); + let ship_portrait = builder.in(ship_card).image(`ship-${ship.model.code}-portrait`, -2, -12, true); + ship_portrait.scale.set(0.3); }); } @@ -75,11 +60,12 @@ module TK.SpaceTac.UI { await anims.addAnimation(this.message.scale, { x: 1, y: 1 }, 300, Phaser.Easing.Bounce.Out); - this.view.timer.schedule(600, () => this.message.frame = 1); - this.view.timer.schedule(630, () => this.message.frame = 0); - this.view.timer.schedule(640, () => this.message.frame = 1); - this.view.timer.schedule(655, () => this.message.frame = 0); - this.view.timer.schedule(680, () => this.message.frame = 1); + let builder = new UIBuilder(this.view); + this.view.timer.schedule(600, () => builder.change(this.message, "battle-splash-message-on")); + this.view.timer.schedule(630, () => builder.change(this.message, "battle-splash-message-off")); + this.view.timer.schedule(640, () => builder.change(this.message, "battle-splash-message-on")); + this.view.timer.schedule(655, () => builder.change(this.message, "battle-splash-message-off")); + this.view.timer.schedule(680, () => builder.change(this.message, "battle-splash-message-on")); this.player1.x = -2000; this.player1.visible = true; diff --git a/src/ui/battle/BattleView.ts b/src/ui/battle/BattleView.ts index a8652ee..869aca7 100644 --- a/src/ui/battle/BattleView.ts +++ b/src/ui/battle/BattleView.ts @@ -96,6 +96,8 @@ module TK.SpaceTac.UI { this.interacting = false; this.log_processor = new LogProcessor(this); + let builder = new UIBuilder(this); + // Add layers this.layer_background = this.getLayer("background"); this.layer_arena = this.getLayer("arena"); @@ -104,8 +106,7 @@ module TK.SpaceTac.UI { this.layer_sheets = this.getLayer("character_sheet"); // Background - this.background = new Phaser.Image(game, 0, 0, "battle-background", 0); - this.layer_background.add(this.background); + this.background = builder.in(this.layer_background).image("battle-background"); // Add arena (local battlefield map) this.arena = new Arena(this, this.layer_arena); diff --git a/src/ui/battle/ShipList.ts b/src/ui/battle/ShipList.ts index dc3f6f0..3d1c522 100644 --- a/src/ui/battle/ShipList.ts +++ b/src/ui/battle/ShipList.ts @@ -40,7 +40,8 @@ module TK.SpaceTac.UI { this.items = []; this.hovered = null; - this.info_button = new Phaser.Button(view.game, 0, 0, "battle-shiplist-info-button"); + let info = view.getImageInfo("battle-shiplist-info-button"); + this.info_button = new Phaser.Button(view.game, 0, 0, info.key, undefined, undefined, info.frame, info.frame); this.view.inputs.setHoverClick(this.info_button, () => tactical_mode.manipulate("shiplist")(true), () => tactical_mode.manipulate("shiplist")(false), diff --git a/src/ui/battle/ShipListItem.ts b/src/ui/battle/ShipListItem.ts index 36cab03..8d41a25 100644 --- a/src/ui/battle/ShipListItem.ts +++ b/src/ui/battle/ShipListItem.ts @@ -21,7 +21,8 @@ module TK.SpaceTac.UI { // Create a ship button for the battle ship list constructor(list: ShipList, x: number, y: number, ship: Ship, owned: boolean, ship_buttons: IShipButton) { - super(list.view.game, x, y, "battle-shiplist-item-background"); + let info = list.view.getImageInfo("battle-shiplist-item-background"); + super(list.view.game, x, y, info.key, undefined, undefined, info.frame, info.frame); this.view = list.view; this.ship = ship; @@ -37,11 +38,11 @@ module TK.SpaceTac.UI { this.portrait.angle = 180; this.addChild(this.portrait); - this.damage_indicator = new Phaser.Image(this.game, 18, 9, "battle-shiplist-damage", 0); + this.damage_indicator = this.view.newImage("battle-shiplist-damage", 18, 9); this.damage_indicator.alpha = 0; this.addChild(this.damage_indicator); - this.hover_indicator = new Phaser.Image(this.game, 17, 8, "battle-shiplist-hover", 0); + this.hover_indicator = this.view.newImage("battle-shiplist-hover", 17, 8); this.hover_indicator.visible = false; this.addChild(this.hover_indicator); diff --git a/src/ui/battle/Targetting.ts b/src/ui/battle/Targetting.ts index 22e3aa2..4859803 100644 --- a/src/ui/battle/Targetting.ts +++ b/src/ui/battle/Targetting.ts @@ -43,7 +43,7 @@ module TK.SpaceTac.UI { // Visual effects this.drawn_info = new Phaser.Graphics(view.game, 0, 0); this.drawn_info.visible = false; - this.move_ghost = new Phaser.Image(view.game, 0, 0, "common-transparent"); + this.move_ghost = view.newImage("common-transparent"); this.move_ghost.anchor.set(0.5, 0.5); this.move_ghost.alpha = 0.8; this.move_ghost.visible = false; diff --git a/src/ui/character/CharacterSheet.ts b/src/ui/character/CharacterSheet.ts index 052dba8..448f4dd 100644 --- a/src/ui/character/CharacterSheet.ts +++ b/src/ui/character/CharacterSheet.ts @@ -41,7 +41,7 @@ module TK.SpaceTac.UI { valuebar_experience: ValueBar constructor(view: BaseView, onclose?: Function) { - super(view.game, 0, 0, "character-sheet"); + super(view.game, 0, 0, view.getImageInfo("character-sheet").key, view.getImageInfo("character-sheet").frame); this.view = view; this.builder = new UIBuilder(view, this).styled({ color: "#e7ebf0", size: 16, shadow: true }); diff --git a/src/ui/common/ParticleBuilder.ts b/src/ui/common/ParticleBuilder.ts index 0d9766b..e7fad9d 100644 --- a/src/ui/common/ParticleBuilder.ts +++ b/src/ui/common/ParticleBuilder.ts @@ -85,7 +85,7 @@ module TK.SpaceTac.UI { */ build(configs: ParticleConfig[]): Phaser.Image { if (configs.length == 0) { - return this.view.game.add.image(0, 0, "common-transparent"); + return this.view.newImage("common-transparent"); } else { let base = configs[0]; let result = base.getImage(this.view.game, 1); diff --git a/src/ui/common/UIComponent.ts b/src/ui/common/UIComponent.ts index 18d3901..43db5c2 100644 --- a/src/ui/common/UIComponent.ts +++ b/src/ui/common/UIComponent.ts @@ -60,7 +60,7 @@ module TK.SpaceTac.UI { this.builder = new UIBuilder(this.view, this.container); if (background_key) { - this.background = this.addInternalChild(new Phaser.Image(this.view.game, 0, 0, background_key)); + this.background = this.builder.image(background_key, 0, 0, false); } else { this.background = null; } @@ -213,20 +213,19 @@ module TK.SpaceTac.UI { /** * Add a button in the component, positioning its center. + * + * DEPRECATED - Use UIBuilder directly */ addButton(x: number, y: number, on_click: Function, background: string, frame_normal = 0, frame_hover = 1, tooltip = ""): Phaser.Button { - let button = new Phaser.Button(this.view.game, x, y, background, on_click, undefined, frame_hover, frame_normal); - UIComponent.setButtonSound(button); - button.anchor.set(0.5, 0.5); - if (tooltip) { - this.view.tooltip.bindStaticText(button, tooltip); - } - this.addInternalChild(button); - return button; + let result = this.builder.button(background, x, y, on_click, tooltip); + result.anchor.set(0.5); + return result; } /** * Add a static text. + * + * DEPRECATED - Use UIBuilder directly */ addText(x: number, y: number, content: string, color = "#ffffff", size = 16, bold = false, center = true, width = 0, vcenter = center): Phaser.Text { return this.builder.text(content, x, y, { color: color, size: size, bold: bold, center: center, width: width, vcenter: vcenter }); @@ -246,6 +245,8 @@ module TK.SpaceTac.UI { /** * Add a static image, from atlases, positioning its center. + * + * DEPRECATED - Use UIBuilder directly */ addImage(x: number, y: number, name: string, scale = 1): Phaser.Image { let result = this.builder.image(name, x, y); @@ -266,41 +267,6 @@ module TK.SpaceTac.UI { return image; } - /** - * Add a 2-states toggle button. - * - * *background* should have three frames (toggled, untoggled and hovered). - * - * Returns a function to force the state of the button. - */ - addToggleButton(x: number, y: number, background: UIImageInfo, content: UIImageInfo | UITextInfo, on_change: (toggled: boolean) => void): (toggled: boolean) => void { - let toggled = false; - let toggle = (state: boolean, broadcast = false) => { - toggled = state; - if (typeof background !== "string") { - image.frame = (toggled ? background.frame : background.frame1) || background.frame || 0; - } - contentobj.alpha = toggled ? 1 : 0.5; - if (broadcast) { - on_change(toggled); - } - }; - - let button = new Phaser.Button(this.container.game, x, y, "common-transparent", () => toggle(!toggled, true)); - UIComponent.setButtonSound(button); - - let image = imageFromInfo(this.game, background); - let contentobj = autoFromInfo(this.game, content); - - button.addChild(image); - button.addChild(contentobj); - this.addInternalChild(button); - - toggle(toggled); - - return toggle; - } - /** * Set the keyboard focus on this component. */ diff --git a/src/ui/common/UITextInput.ts b/src/ui/common/UITextInput.ts index c5c5845..e723cca 100644 --- a/src/ui/common/UITextInput.ts +++ b/src/ui/common/UITextInput.ts @@ -11,7 +11,7 @@ module TK.SpaceTac.UI { constructor(parent: UIComponent, width: number, height: number, maxlength?: number, fontcolor = "#FFFFFF") { super(parent, width, height); - let input_bg = new Phaser.Image(this.game, 0, 0, "common-transparent"); + let input_bg = this.builder.image("common-transparent", 0, 0, false); input_bg.scale.set(width, height); input_bg.inputEnabled = true; input_bg.input.useHandCursor = true; diff --git a/src/ui/map/MapLocationMenu.ts b/src/ui/map/MapLocationMenu.ts index f213abb..933ee00 100644 --- a/src/ui/map/MapLocationMenu.ts +++ b/src/ui/map/MapLocationMenu.ts @@ -16,14 +16,14 @@ module TK.SpaceTac.UI { this.clearContent(); if (title) { - this.addImageF(239, 57, "map-subname"); - this.addText(239, 57, title, "#b8d2f1", 22, false, true); + this.builder.image("map-subname", 239, 57, true); + this.builder.text(title, 239, 57, { color: "#b8d2f1", size: 22 }) } for (let idx = actions.length - 1; idx >= 0; idx--) { let [label, action] = actions[idx]; - this.addButton(172, 48 + idx * 100 + 96, action, "map-action", 0, 1); - this.addText(186, 48 + idx * 100 + 136, label, "#b8d2f1", 20, false, true); + this.builder.button("map-action", 172, 48 + idx * 100 + 96, action).anchor.set(0.5); + this.builder.text(label, 186, 48 + idx * 100 + 136, { color: "#b8d2f1", size: 20 }); } } diff --git a/src/ui/map/MissionsDialog.ts b/src/ui/map/MissionsDialog.ts index 4ce361d..7bc6ff3 100644 --- a/src/ui/map/MissionsDialog.ts +++ b/src/ui/map/MissionsDialog.ts @@ -34,7 +34,7 @@ module TK.SpaceTac.UI { offset += 110; active.forEach(mission => { - this.addMission(offset, mission, 0, () => null); + this.addMission(offset, mission, true, () => null); offset += 110; }); } @@ -45,7 +45,7 @@ module TK.SpaceTac.UI { offset += 110; proposed.forEach(mission => { - this.addMission(offset, mission, 2, () => { + this.addMission(offset, mission, false, () => { this.shop.acceptMission(mission, this.player); this.close(); this.on_change(); @@ -58,7 +58,7 @@ module TK.SpaceTac.UI { /** * Add a mission text */ - addMission(yoffset: number, mission: Mission, button_frame: number, button_callback: Function) { + addMission(yoffset: number, mission: Mission, active: boolean, button_callback: Function) { let title = mission.title; let subtitle = `${capitalize(MissionDifficulty[mission.difficulty])} - Reward: ${mission.getRewardText()}`; @@ -69,7 +69,7 @@ module TK.SpaceTac.UI { if (subtitle) { this.addText(380, yoffset + 22, subtitle, "#d2e1f3", 18, false, false, 620, true); } - this.addButton(1120, yoffset, button_callback, "map-mission-action", button_frame, button_frame + 1); + this.builder.button(active ? "map-mission-action-cancel" : "map-mission-action-accept", 1120, yoffset, button_callback).anchor.set(0.5); } } } \ No newline at end of file diff --git a/src/ui/map/StarSystemDisplay.ts b/src/ui/map/StarSystemDisplay.ts index 283bb5c..7a2fc43 100644 --- a/src/ui/map/StarSystemDisplay.ts +++ b/src/ui/map/StarSystemDisplay.ts @@ -2,6 +2,7 @@ module TK.SpaceTac.UI { // Group to display a star system export class StarSystemDisplay extends Phaser.Image { view: UniverseMapView + builder: UIBuilder circles: Phaser.Group starsystem: Star player: Player @@ -10,9 +11,10 @@ module TK.SpaceTac.UI { label: Phaser.Button constructor(parent: UniverseMapView, starsystem: Star) { - super(parent.game, starsystem.x, starsystem.y, "map-starsystem-background"); + super(parent.game, starsystem.x, starsystem.y, parent.getImageInfo("map-starsystem-background").key, parent.getImageInfo("map-starsystem-background").frame); this.view = parent; + this.builder = new UIBuilder(parent, this); this.anchor.set(0.5, 0.5); @@ -24,10 +26,8 @@ module TK.SpaceTac.UI { this.fleet_display = parent.player_fleet; // Show boundary - this.circles = new Phaser.Group(this.game); - this.addChild(this.circles); - let boundaries = this.game.add.image(0, 0, "map-boundaries", 0, this.circles); - boundaries.anchor.set(0.5); + this.circles = this.builder.group("circles"); + let boundaries = this.builder.in(this.circles).image("map-boundaries", 0, 0, true); boundaries.scale.set(starsystem.radius / (this.scale.x * 256)); // Show locations @@ -67,17 +67,12 @@ module TK.SpaceTac.UI { }); // Show name - this.label = new Phaser.Button(this.game, 0, 460, "map-name"); - this.label.anchor.set(0.5, 0.5); - this.label.input.useHandCursor = false; - let label_content = new Phaser.Text(this.game, 0, 0, this.starsystem.name, { align: "center", font: `32pt SpaceTac`, fill: "#b8d2f1" }); - label_content.anchor.set(0.6, 0.5); - this.label.addChild(label_content); - let label_level = new Phaser.Text(this.game, 243, 30, this.starsystem.level.toString(), { align: "center", font: `24pt SpaceTac`, fill: "#a0a0a0" }); - label_level.anchor.set(0.6, 0.5); - this.label.addChild(label_level); - this.addChild(this.label); - this.view.tooltip.bindStaticText(this.label, `Level ${this.starsystem.level} starsystem`); + this.label = this.builder.button("map-name", 0, 460, undefined, `Level ${this.starsystem.level} starsystem`); + this.label.anchor.set(0.5); + this.builder.in(this.label, builder => { + builder.text(this.starsystem.name, -30, 0, { size: 32, color: "#b8d2f1" }); + builder.text(this.starsystem.level.toString(), 243, 30, { size: 24, color: "#a0a0a0" }); + }); } addImage(x: number, y: number, name: string, onclick: Function | null = null): Phaser.Image { @@ -97,12 +92,9 @@ module TK.SpaceTac.UI { let radius = Math.sqrt(x * x + y * y); let angle = Math.atan2(y, x); - let circle = this.game.add.image(0, 0, "map-orbit", 0, this.circles); - circle.anchor.set(0.5); + let circle = this.builder.in(this.circles).image("map-orbit", 0, 0, true); circle.scale.set(radius / (this.scale.x * 198)); circle.rotation = angle - 0.01; - - this.circles.add(circle); } /** diff --git a/src/ui/menu/MainMenu.ts b/src/ui/menu/MainMenu.ts index 30a2f51..22b8f29 100644 --- a/src/ui/menu/MainMenu.ts +++ b/src/ui/menu/MainMenu.ts @@ -44,23 +44,20 @@ module TK.SpaceTac.UI { }); // Menu buttons - this.button_new_game = this.addButton(322, 674, "New Game", "Start a new campaign in a generated universe", () => this.onNewGame()); - this.button_load_game = this.addButton(960, 674, "Load / Join", "Load a saved game or join a friend", () => this.onLoadGame()); - this.button_quick_battle = this.addButton(1606, 674, "Quick Battle", "Play a single generated battle", () => this.onQuickBattle()); + this.button_new_game = this.addButton(320, 730, "New Game", "Start a new campaign in a generated universe", () => this.onNewGame()); + this.button_load_game = this.addButton(958, 730, "Load / Join", "Load a saved game or join a friend", () => this.onLoadGame()); + this.button_quick_battle = this.addButton(1604, 730, "Quick Battle", "Play a single generated battle", () => this.onQuickBattle()); // Fullscreen button - let button = new Phaser.Button(this.game, this.getWidth(), 0, "options-options", () => this.options.toggleBoolean("fullscreen"), null, 2, 2); + let button = builder.in(this.layer_title).button("options-option-fullscreen", this.getWidth(), 0, () => this.options.toggleBoolean("fullscreen"), "Toggle full-screen"); button.anchor.set(1, 0); - this.tooltip.bindStaticText(button, "Toggle full-screen"); - this.layer_title.add(button); // Title - let title = this.add.image(960, 225, "menu-title", 0, this.layer_title); - title.anchor.set(0.5, 0); + let title = builder.in(this.layer_title).image("menu-title", 274, 187); // Dialogs this.dialog_load_game = new LoadDialog(this); - this.dialog_load_game.setPosition(264, 160); + this.dialog_load_game.setPosition(286, 120); this.dialog_load_game.moveToLayer(this.layer_title); this.dialog_load_game.setVisible(false); @@ -90,31 +87,14 @@ module TK.SpaceTac.UI { } addButton(x: number, y: number, caption: string, tooltip: string, callback: Function): Phaser.Button { - var button = this.add.button(x - 20, y + 20, "menu-button", callback); - button.anchor.set(0.5, 0); - button.input.useHandCursor = true; + let builder = new UIBuilder(this).in(this.layer_title); - UIComponent.setButtonSound(button); + let result = builder.button("menu-button", x, y, callback, tooltip); + result.anchor.set(0.5); - var text = new Phaser.Text(this.game, 0, 76, caption, - { align: "center", font: "bold 40pt SpaceTac", fill: "#529aee" }); - text.anchor.set(0.5, 0.5); - button.addChild(text); + builder.in(result).text(caption, 0, 0, { bold: true, size: 40, color: "#529aee" }); - button.onInputOver.add(() => { - button.loadTexture("menu-button-hover"); - text.fill = "#54b9ff"; - }); - button.onInputOut.add(() => { - button.loadTexture("menu-button"); - text.fill = "#529aee"; - }); - - this.tooltip.bindStaticText(button, tooltip); - - this.layer_title.add(button); - - return button; + return result; } // Called when "New Game" is clicked diff --git a/src/ui/options/OptionsDialog.ts b/src/ui/options/OptionsDialog.ts index 401a95d..31af3a3 100644 --- a/src/ui/options/OptionsDialog.ts +++ b/src/ui/options/OptionsDialog.ts @@ -17,23 +17,37 @@ module TK.SpaceTac.UI { this.clearContent(); this.addCloseButton("common-dialog-close", 1304, 131, 0, 1); - let toggle = this.addToggleButton(415, 381, - { key: "options-toggle", frame: 0, frame1: 1, frame2: 2 }, - { key: "options-options", frame: 0 }, - toggled => options.setNumberValue("mainvolume", toggled ? 1 : 0)); - toggle(options.getNumberValue("mainvolume") > 0); + this.addToggleButton(415, 381, "options-option-sound", "Toggle all sound", + toggled => options.setNumberValue("mainvolume", toggled ? 1 : 0), + options.getNumberValue("mainvolume") > 0 + ); - toggle = this.addToggleButton(this.width / 2, 381, - { key: "options-toggle", frame: 0, frame1: 1, frame2: 2 }, - { key: "options-options", frame: 1 }, - toggled => options.setNumberValue("musicvolume", toggled ? 1 : 0)); - toggle(options.getNumberValue("musicvolume") > 0); + this.addToggleButton(this.width / 2, 381, "options-option-music", "Toggle music", + toggled => options.setNumberValue("musicvolume", toggled ? 1 : 0), + options.getNumberValue("musicvolume") > 0 + ); - toggle = this.addToggleButton(this.width - 415, 381, - { key: "options-toggle", frame: 0, frame1: 1, frame2: 2 }, - { key: "options-options", frame: 2 }, - toggled => options.setBooleanValue("fullscreen", toggled)); - toggle(options.getBooleanValue("fullscreen")); + this.addToggleButton(this.width - 415, 381, "options-option-fullscreen", "Toggle fullscreen", + toggled => options.setBooleanValue("fullscreen", toggled), + options.getBooleanValue("fullscreen") + ); + } + + /** + * Add a toggle button + */ + addToggleButton(x: number, y: number, key: string, tooltip: string, callback: (state: boolean) => boolean, initial: boolean): UIButton { + let button = this.builder.button("options-toggle", x, y, undefined, tooltip, state => { + if (callback(state)) { + return state; + } else { + return !state; + } + }); + button.anchor.set(0.5); + this.builder.in(button).image(key, 0, 0, true); + this.builder.switch(button, initial); + return button; } /** diff --git a/taskfile.js b/taskfile.js deleted file mode 100644 index 49cd07a..0000000 --- a/taskfile.js +++ /dev/null @@ -1,74 +0,0 @@ -const liveServer = require('live-server'); - -function shell(task, cmd) { - return task.source(".").shell(cmd); -} - -module.exports = { - *serve(task) { - liveServer.start({ - host: '127.0.0.1', - port: 8012, - root: 'out', - ignore: 'coverage', - wait: 500 - }); - return new Promise(() => null); - }, - - *vendors(task) { - yield shell(task, "rm -rf out/vendor"); - yield shell(task, "mkdir -p out/vendor"); - yield shell(task, "cp -r node_modules/phaser/build out/vendor/phaser"); - yield shell(task, "cp -r node_modules/parse/dist out/vendor/parse"); - yield shell(task, "cp -r node_modules/jasmine-core/lib/jasmine-core out/vendor/jasmine"); - }, - - *watch_vendors(task) { - yield task.watch("package.json", ["vendors"]); - }, - - *ts(task) { - yield shell(task, "tsc -p ."); - }, - - *watch_ts(task) { - yield task.watch(["src/**/*.ts", "tsconfig.json"], ["ts"]); - }, - - *atlas(task) { - yield shell(task, "rm -f out/assets/atlas*"); - yield shell(task, "find graphics/exported -name '*.png' -print0 | xargs -0 gf-pack --name out/assets/atlas --fullpath --width 1024 --height 1024 --square --powerOfTwo --trim --padding 2"); - }, - - *watch_atlas(task) { - yield task.watch("graphics/exported/**/*.png", ["atlas"]); - }, - - *build(task) { - yield task.parallel(['ts', 'atlas', 'vendors']); - }, - - *optimize(task) { - yield shell(task, "uglifyjs out/build.js --source-map --output out/build.min.js"); - }, - - *deploy(task) { - yield task.serial(['build', 'optimize']); - yield shell(task, "rsync -avz --delete ./out/ hosting.thunderk.net:/srv/website/spacetac/"); - }, - - *karma(task) { - yield shell(task, "karma start spec/support/karma.conf.js"); - }, - - *test(task) { - yield task.serial(['build', 'karma']); - yield shell(task, "remap-istanbul -i out/coverage/coverage.json -o out/coverage -t html"); - }, - - *default(task) { - yield task.start('build'); - yield task.parallel(['serve', 'watch_ts', 'watch_atlas', 'watch_vendors']); - } -}