<!DOCTYPE html>
<html>

  <head>
    <base href="." />
    <title>angular2 playground</title>
    <link rel="stylesheet" href="https://unpkg.com/clarity-ui/clarity-ui.min.css" />
    <link rel="stylesheet" href="https://unpkg.com/clarity-icons/clarity-icons.min.css" />
    
    <script src="https://unpkg.com/zone.js@0.8.12/dist/zone.js"></script>
    <script src="https://unpkg.com/zone.js/dist/long-stack-trace-zone.js"></script>
    <script src="https://unpkg.com/reflect-metadata@0.1.3/Reflect.js"></script>
    <script src="https://unpkg.com/systemjs@0.19.31/dist/system.js"></script>
    <script src="https://unpkg.com/@webcomponents/custom-elements/custom-elements.min.js"></script>
    <script src="https://unpkg.com/clarity-icons/clarity-icons.min.js"></script>
    <script src="config.js"></script>
    <script>
    System.import('app')
      .catch(console.error.bind(console));
  </script>
  </head>

  <body>
    <my-app>
    loading...
  </my-app>
  </body>

</html>
System.config({
  //use typescript for compilation
  transpiler: 'typescript',
  //typescript compiler options
  typescriptOptions: {
    emitDecoratorMetadata: true
  },
  paths: {
    'npm:': 'https://unpkg.com/'
  },
  //map tells the System loader where to look for things
  map: {
    
    'app': './app',
    'clarity-angular': 'npm:clarity-angular/clarity-angular.umd.js',
    // Angular 
    '@angular/core': 'npm:@angular/core/bundles/core.umd.js',
    '@angular/common': 'npm:@angular/common/bundles/common.umd.js',
    '@angular/compiler': 'npm:@angular/compiler/bundles/compiler.umd.js',
    '@angular/animations': "npm:@angular/animations/bundles/animations.umd.js",
    '@angular/animations/browser': 'npm:@angular/animations/bundles/animations-browser.umd.js',
    '@angular/http': 'npm:@angular/http/bundles/http.umd.js',
    '@angular/forms': 'npm:@angular/forms/bundles/forms.umd.js',
    '@angular/router': 'npm:@angular/router/bundles/router.umd.js',
    '@angular/platform-browser': 'npm:@angular/platform-browser/bundles/platform-browser.umd.js',
    '@angular/platform-browser/animations': 'npm:@angular/platform-browser/bundles/platform-browser-animations.umd.js',
    '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js',
    // Other Libs
    'rxjs': 'npm:rxjs',
    'typescript': 'npm:typescript@2.0.2/lib/typescript.js'
  },
  //packages defines our app package
  packages: {
    app: {
      main: './main.ts',
      defaultExtension: 'ts'
    },
    rxjs: {
      main: 'Rx.js',
      defaultExtension: 'js'
    }
  }
});
//main entry point
import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
import {AppModule} from './app.module';

platformBrowserDynamic().bootstrapModule(AppModule)
<!--
  ~ Copyright (c) 2016 VMware, Inc. All Rights Reserved.
  ~ This software is released under MIT license.
  ~ The full license information can be found in LICENSE in the root directory of this project.
  -->
<clr-main-container>
    <div class="content-container">
      <div class="content-area">
        <h3>L2 Revolution Enhancement Chance Evaluation</h3>
        <hr/>
        <br/>
        <section class="form-block">
          <div class="form-group">
            <label for="aForm_1">My item is</label>
            <span>+<input type="number" [(ngModel)]="startEnh"></span>
          </div>
          <div class="form-group">
            <label for="aForm_1">I want it to become</label>
            <span>+<input type="number" [(ngModel)]="targetEnh"></span>
          </div>
          <div class="form-group">
            <label for="aForm_1">I have</label>
            <span><input type="number" [(ngModel)]="scrollNum"> scrolls</span>
          </div>
        </section>
        <br/>
        <button class="btn btn-primary" (click)="runAll()">Can I do it?</button>
        <div *ngIf="result !== null">Chance for success: {{(result * 100).toFixed(2)}}%</div>
        <div *ngIf="result !== null">(based on {{attempts}} attempts)</div>
      </div>
 
    </div>
    
    
</clr-main-container>
/*
 * Copyright (c) 2016 VMware, Inc. All Rights Reserved.
 * This software is released under MIT license.
 * The full license information can be found in LICENSE in the root directory of this project.
 */
// Angular 
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { BrowserModule } from '@angular/platform-browser';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { FormsModule } from '@angular/forms';
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';

import { ClarityModule } from 'clarity-angular';

import { AppComponent } from './app.component';

@NgModule({
  imports: [
    BrowserModule,
    FormsModule,
    ClarityModule.forRoot(),
    BrowserAnimationsModule
  ],
  declarations: [
    AppComponent
  ],
  bootstrap: [ AppComponent ]
})
export class AppModule {
}
/*
 * Copyright (c) 2016 VMware, Inc. All Rights Reserved.
 * This software is released under MIT license.
 * The full license information can be found in LICENSE in the root directory of this project.
 */
import { Component } from '@angular/core';
import { Router } from '@angular/router';

@Component({
  selector: 'my-app',
  styleUrls: ['app/app.component.css'],
  templateUrl: 'app/app.component.html'
})
export class AppComponent {
  private result = null;
  private attempts = 50000;
  private safeEnhs = [0, 7, 10, 20];
  startEnh = 12;
  private currEnh = this.startEnh;
  targetEnh = 13;
  scrollNum = 30;
  private currScrolls = this.scrollNum;
              //    0   +1 +2 +3  +4  +5  +6  +7  +8   +9  +10  +11  +12  +13 
  private rates = [null, 1, 1, 1, .9, .8, .7, .6, .5, .45, .45, .45, .45, .45,
              // +14  +15  +16  +17  +18  +19  +20  +21  +22  +23
                  .4,  .4,  .4,  .4,  .4, .35, .35, .35, .35, .35,
              // +24  +25  +26  +27  +28  +29  +30
                  .3,  .3,  .3,  .3,  .3, .25, .25];
                  
              //      0   +1 +2 +3 +4 +5 +6 +7 +8 +9 +10  +11  +12  +13 
  private scrolls = [null, 1, 1, 1, 1, 2, 2, 2, 2, 2,  2,   3,   3,   3,
              // +14  +15  +16  +17  +18  +19  +20  +21  +22  +23
                   3,   3,   4,   4,   4,  4,   4,   5,    5,   5,
              // +24  +25  +26  +27  +28  +29  +30
                  5,    5,   6,   6,   6,   6,   6];
  
  canEnhance() {
    return this.currScrolls >= this.scrolls[this.currEnh + 1];
  }
  
  init() {
    this.currEnh = this.startEnh;
    this.currScrolls = this.scrollNum;
  }
  
  tryOnce() {
    this.init();
    while(this.canEnhance()) {
      if (Math.random() <= this.rates[this.currEnh + 1]) {
        this.currEnh++;
      } else if (this.safeEnhs.indexOf(this.currEnh) === -1){
        this.currEnh--;
      }
      if (this.currEnh === this.targetEnh) {
        return true;
      }
      this.currScrolls -= this.scrolls[this.currEnh + 1];
    }
    return false;
  }
  
  runAll() {
    let successes = 0;
    for (let i=0; i<this.attempts; i++) {
       if (this.tryOnce()) {
         successes++;
       }
    }
    this.result = successes / this.attempts;
  }
}
/* Global App Style goes here */

input {
  max-width: 30px;
}