ruzli
4/6/2019 - 9:01 AM

Checks array of defined by user patterns and stops when it found

Checks array of defined by user patterns and stops when it found

var Patterns_array = [ `RGRGRR`, `RRRRRG`, `GRGRGR` ]   //G = Green, R = Red
var PatternToFindTarget = 2
var Target_Analyzer = 3
//*************************** */
var continue_play_after_catch = false
var base_bet = 1
var bet_multiplier = 2
var target = 2
var max_turns = 8
var max_loss = 2000
//*************************** */


var engine = this

class FindPattern {
    constructor (Patterns = [], toFind, analyzer) {
        this.PatternToFind = toFind
        this.skip_bet_amount = 100
        this.skip_target_size = 1.01
        this.debug = true
        this.Patterns = []
        this.history = []
        this.match = 0
        this.rolls = 0
        this.running = true
        this.target_analyzer = analyzer
     
        for (let i = 0; i < Patterns.length; i++) {
            this.Patterns.push(Patterns[ i ])
        }
    }

    Match(check_history, pattern) {
        if (check_history.length < pattern.length) {
            return
        }
        let convert_pattern = this.Convert(pattern)
        for (let i = 0; i < check_history.length; i++) {
            if (check_history[ i ] == convert_pattern[ i ]) {
                this.match++
            } else {
                this.match = 0
            }
        }
        this.UpdateLog()
        if (this.match < convert_pattern.length) {
            return false
        } else {
            return true
        }
    }

    Convert(pattern) {
        let converted = []

        for (let i = 0; i < pattern.length; i++) {
            if (pattern[ i ] == "G") {
                converted.push(1)
            }
            if (pattern[ i ] == "R") {
                converted.push(0)
            }
        }
        return converted
    }

    Update(multiplier) {
        if (multiplier >= this.PatternToFind && multiplier <= this.PatternToFind * this.target_analyzer) {
            this.history.push(1)
        } else {
            this.history.push(0)
        }
        if (this.history.length > this.LongestLength) {
            this.history.shift()
        }
    }
    set Skip_bet_amount(value) {
        this.skip_bet_amount = value
    }
    set Skip_target_size(value) {
        this.skip_target_size = value
    }
    get LongestLength() {
        for (let i = 0; i < this.Patterns.length; i++) {
            if (this.Patterns[ i ].length >= this._longest) {
                this._longest = this.Patterns[ i ].length
            }
        }
        return this._longest
    }
    get History() {
        return this.history
    }

    UpdateLog() {
        engine.clearLog()
        for (let i = 0; i < this.Patterns.length; i++) {
            engine.log(`#${i + 1} Pattern ${this.Patterns[ i ]}`)
            engine.log(this.Convert(this.Patterns[ i ]))
            engine.log(this.history.slice(-this.Patterns[ i ].length))
            if (this.debug) engine.log(`Matches ${this.match}/${this.Patterns[ i ].length}`)
            engine.log(`---------------------------`)
        }
        engine.log(`Roll ${this.rolls}`)
    }

    async Found(pattern = undefined) {
        if (pattern != undefined) {
            engine.log(`${pattern} is Match!`)
        } else {
            engine.log(`Match found!`)
        }
        this.sound_loop(5)
        await this.Terminate()
        //this.running = false
        this.UpdateLog()
    }
    async Terminate(continues = continue_play_after_catch) {
        if (!continues) {
            engine.stop()
        }
    }

    async IteratePatterns() {
        for (let i = 0; i < this.Patterns.length; i++) {
            if (this.Match(this.history.slice(this.history.length - this.Patterns[ i ].length, this.history.length), this.Patterns[ i ]) == true) {
                this.Found(this.Patterns[ i ])
            }
        }
    }

    async sleep(ms = 2000) {
        if (ms != 0) {
            return new Promise(resolve => setTimeout(resolve, ms))
        }
    }

    async sound_loop(sound_number, name) {
        let sound_track = [ `cl_hihat`, `claves`, `conga1`, `cowbell`, `hi_conga`, `hightom`, `rimshot`, `snare`, `tom1` ]
        let url = `https://raw.githubusercontent.com/ruzli/misc/master/`
        let format = `.wav`
        let full_string = url + name + format

        if (name != undefined) {
            full_string = url + name + format
        } else if (sound_number != undefined) {
            full_string = url + sound_track[ sound_number ] + format
        } else {
            engine.log(`Sound not found.`)
        }
        const audio = new Audio(full_string)
        await audio.play()
        return new Promise(resolve => audio.onended = resolve)
    }


    async StartFind() {
        while (this.running) {
            this.rolls++

            const { multiplier } = await engine.bet(this.skip_bet_amount, this.skip_target_size)
            this.Update(multiplier)
            this.UpdateLog()

            this.IteratePatterns()
        }
    }
}

async function startMartingale(base_bet = base_bet, bet_multiplier = bet_multiplier, target_size = target, turns = max_turns, max_loss = max_loss) {
    let turn = 0
    let bet_size = base_bet
    let current_loss = 0
    //patternStart.running = false
    while (true) {
        if (turn >= turns || current_loss >= max_loss) {
            engine.log(current_loss)
            await engine.stop()
        }

        const { multiplier } = await engine.bet(bet_size * 100, target_size)
        if (multiplier >= target_size) {
            turn = 0
            currnet_loss = current_loss - (bet_size * (target_size - 1))
            bet_size = base_bet
        } else {
            turn++
            bet_size *= bet_multiplier
            current_loss = current_loss + bet_size
        }
    }

}

var patternStart = new FindPattern(Patterns_array, PatternToFindTarget, Target_Analyzer)
if (continue_play_after_catch) patternStart.Terminate = async function () { await startMartingale(base_bet, bet_multiplier, target, max_turns, max_loss)}

await patternStart.StartFind()