UNPKG

slot-machine-gen

Version:

Create an extremely biased, web-based slot machine game.

196 lines (135 loc) 6.69 kB
# Slot Machine Generator [![npm version](https://badge.fury.io/js/slot-machine-gen.svg)](https://badge.fury.io/js/slot-machine-gen) [![](https://img.shields.io/npm/dm/slot-machine-gen)](https://www.npmjs.com/package/slot-machine-gen) [![Install size](https://packagephobia.com/badge?p=slot-machine-gen)](https://packagephobia.com/result?p=slot-machine-gen) [![](https://img.shields.io/github/v/release/nuxy/slot-machine-gen)](https://github.com/nuxy/slot-machine-gen/releases) [![NO AI](https://raw.githubusercontent.com/nuxy/no-ai-badge/master/badge.svg)](https://github.com/nuxy/no-ai-badge) Create an extremely biased, web-based slot machine game. ![Preview](https://raw.githubusercontent.com/nuxy/slot-machine-gen/master/package.gif) ## Features - Faux-panoramic reel animations (**3D cylinder**, without `<canvas>`) - Support for single/multi-line reels and pay-lines. - Pseudo-random selections by configured weight. - Configurable RNG (to make it less biased) - Configurable sound clips for reel animations. - Easy to set-up and customize. **No dependencies**. Checkout the [demo](https://nuxy.github.io/slot-machine-gen) for examples of use. ## Dependencies - [Node.js](https://nodejs.org) ## Installation Install the package into your project using [NPM](https://npmjs.com), or download the [sources](https://github.com/nuxy/slot-machine-gen/archive/master.zip). $ npm install slot-machine-gen ### Alternative To add to an existing [React](https://reactjs.org) or [Vue](https://vuejs.org) project you can install this package using [YARN](https://yarnpkg.com). #### React $ yarn add react-slot-machine-gen #### Vue $ yarn add vue-slot-machine-gen ## Usage There are two ways you can use this package. One is by including the JavaScript/CSS sources directly. The other is by importing the module into your component. ### Script include After you [build the distribution sources](#cli-options) the set-up is fairly simple.. ```html <script type="text/javascript" src="path/to/slot-machine.min.js"></script> <link rel="stylesheet" href="path/to/slot-machine.min.css" media="all" /> <script type="text/javascript"> slotMachine(container, reels, callback, options); </script> ``` ### Module import If your using a modern framework like [Aurelia](https://aurelia.io), [Angular](https://angular.io), [React](https://reactjs.org), or [Vue](https://vuejs.org) ```javascript import SlotMachine from 'slot-machine-gen'; import 'slot-machine-gen/dist/slot-machine.css'; const slotMachine = new SlotMachine(container, reels, callback, options); ``` ### HTML markup ```html <div id="slot-machine" class="slot-machine"></div> ``` ## Reels configuration Outside of a reel image source, `symbols` must contain the following: | Key | Description | Type | |----------|---------------------------------------------------------|--------| | title | Name of the strip symbol | String | | position | Symbol center (in pixels) calculated from the strip top | Number | | weight | Selection weight (>1 increases odds) | Number | ### Example ```javascript const reels = [ { imageSrc: 'path/to/image.png', symbols: [ { title: 'cherry', position: 100, weight: 2 }, { title: 'plum', position: 300, weight: 6 }, { title: 'orange', position: 500, weight: 5 }, { title: 'bell', position: 700, weight: 1 }, { title: 'cherry', position: 900, weight: 3 }, { title: 'plum', position: 1100, weight: 5 } } }, // add more reels ... ] ``` ## Methods ```javascript slotMachine.play(); ``` ## Game options Customization and overriding defaults can be done using the following options: | Option | Description | Type | Default | |------------|----------------------------------------------------|-----------|---------------| | reelHeight | Reel background image height (in pixels) | Number | 1320 | | reelWidth | Reel background image width. | Number | 200 | | reelOffset | Reel background image vertical offset. | Number | 20 | | slotYAxis | Slot vertical axis rotation (in degrees). | Number | 0 | | animSpeed | Slot animation speed (in milliseconds) | Number | 1000 | | click2Spin | Add event to display to spin reels | Boolean | true | | rngFunc | Custom RNG between 0 (inclusive) and 1 (exclusive) | Function | `Math.random()` | | sounds | Audio clip URLs for reels animation events | Object | `{reelsBegin, reelsEnd}` | ## Callback This method returns an array of selected [reel symbols](#reels-configuration) that can be used to compute scoring, show animations, handle client interactions, etc.. ```javascript const callback = function(symbols) { if (symbols[0].title === 'cherry' && symbols[1].title === 'cherry' && symbols[2].title === 'cherry') { window.alert("You're a winner!"); } }; ``` ## Customizing symbols Creating a custom strip is fairly easy. What is most important is that each symbol, whether an image or blank space, contains a vertical `position` that can be measured by calculating the symbol center (in pixels) from the strip top. A [Photoshop example](https://raw.githubusercontent.com/nuxy/slot-machine-gen/master/images/reel-strip.psd) has been provided with this package for reference. ## Developers ### CLI options Run [ESLint](https://eslint.org) on project sources: $ npm run lint Transpile ES6 sources (using [Babel](https://babeljs.io)) and minify to a distribution: $ npm run build ## Contributions If you fix a bug, or have a code you want to contribute, please send a pull-request with your changes. (Note: Before committing your code please ensure that you are following the [Node.js style guide](https://github.com/felixge/node-style-guide)) ## Versioning This package is maintained under the [Semantic Versioning](https://semver.org) guidelines. ## License and Warranty This package is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. _slot-machine-gen_ is provided under the terms of the [MIT license](http://www.opensource.org/licenses/mit-license.php) ## Author [Marc S. Brooks](https://github.com/nuxy)