<!DOCTYPE html>
<html ng-app="nx">

  <head>
    <link data-require="bootstrap-css@*" data-semver="3.1.1" rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" />
    <link data-require="font-awesome@*" data-semver="4.3.0" rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css" />
    <script data-require="angular.js@1.4.0-rc.2" data-semver="1.4.0-rc.2" src="https://code.angularjs.org/1.4.0-rc.2/angular.js"></script>
    <script data-require="ui-bootstrap@*" data-semver="0.13.3" src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/0.13.1/ui-bootstrap.min.js"></script>
    <script data-require="chance@*" data-semver="0.5.3" src="http://chancejs.com/chance.min.js"></script>
    <link rel="stylesheet" href="style.css" />
    <script src="script.js"></script>
  </head>

  <body ng-controller="AppController as vc">
    <div class="container">
      <form name="vc.form" ng-submit="vc.calcCombat()" class="form-horizontal">
        <section>
          <table class="table">
            <thead>
              <tr>
                <th><button type="button" class="btn btn-warning btn-xs" ng-click="vc.reset()">
                    <span class="fa fa-refresh"></span>
                  </button></th>
                <th>num ships</th>
                <th>attack points</th>
                <th>defense points</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td>
                  <h5>Attacking</h5>
                </td>
                <td>
                  <input ng-model="vc.af.num" type="number" min="0" class="form-control" placeholder="#" />
                </td>
                <td>
                  <input ng-model="vc.af.ap" type="number" min="1" class="form-control" placeholder="ap" />
                </td>
                <td>
                  <input ng-model="vc.af.dp" type="number" min="1" class="form-control" placeholder="dp" ng-show="vc.selFunc.dp"/>
                  <span ng-hide="vc.selFunc.dp">n/a</span>
                </td>
              </tr>
              <tr>
                <td>
                  <h5>Defending</h5>
                </td>
                <td>
                  <input ng-model="vc.df.num" type="number" min="0" class="form-control" placeholder="#" />
                </td>
                <td>
                  <input ng-model="vc.df.ap" type="number" min="1" class="form-control" placeholder="ap" />
                </td>
                <td>
                  <input ng-model="vc.df.dp" type="number" min="1" class="form-control" placeholder="dp" ng-show="vc.selFunc.dp" />
                  <span ng-hide="vc.selFunc.dp">n/a</span>
                </td>
              </tr>
              <tr>
                <th colspan="3">
                  <label for="df-strike">Formula: {{vc.selFunc.name}}</label>
                </th>
                <th>
                  <div class="btn-group" dropdown="">
                    <button id="split-button" type="button" class="btn btn-primary" ng-click="vc.calcCombat()">Calculate</button>
                    <button type="button" class="btn btn-info" dropdown-toggle="">
                      <span class="caret"></span>
                      <span class="sr-only">Split button!</span>
                    </button>
                    <ul class="dropdown-menu" role="menu" aria-labelledby="split-button">
                      <li role="menuitem" ng-repeat="li in vc.funcs">
                        <a ng-click="vc.selFunc = li">{{li.name}}</a>
                      </li>
                    </ul>
                  </div>
                </th>
              </tr>
            </tbody>
          </table>
        </section>
      </form>
      
      <pre>{{vc.log}}</pre>
    </div>
  </body>

</html>
/* Styles go here */

#

calcCombat_np = (a, b)->
    while a.num > 0 and b.num > 0
        a.num -= b.ap + 1
        
        if a.num > 0
          b.num -= a.ap

        check a, b
        @report a, b

    [a, b]

calcCombat_fm = (a, b)->
    while a.num > 0 and b.num > 0
        Δa = b.ap * b.num
        Δb = a.ap * a.num

        a.num -= Δa
        b.num -= Δb

        check a, b
        @report a, b

    [a, b] 
 

calcCombat_scm = (a, b)->
    while a.num > 0 and b.num > 0
        [Δa, Δb] = calcSalvo_scm a.num, a.ap, a.dp, b.num, b.ap, b.dp
        a.num += Δa
        b.num += Δb

        check a, b
        @report a, b

calcSalvo_scm = (A, α, y, B, β, z)->
    ΔA = -(β * B - y * A)
    ΔB = -(α * A - z * B)

    # begin mod
    ΔA *= -1 if ΔA > 0
    ΔB *= -1 if ΔB > 0
    # end mod

    [ΔA, ΔB]

check = (a, b)->
    a.num = 0 if a.num < 0
    b.num = 0 if b.num < 0


angular.module 'nx', ['ui.bootstrap'] 
.controller 'AppController', class AppController
  
  funcs: [
    {name:'Triton', func:calcCombat_np, dp:false}
    {name:'Force Multiplier', func:calcCombat_fm, dp:false}
    {name:'Salvo Model', func:calcCombat_scm, dp:true}
  ]
  
  report: (a, b)-> 
    s = "Fleet A has #{a.num} ships left : Fleet B has #{b.num} ships left\n"
    console.log s
    
    @log += s
  
  reset: ->
    @log = ''
    @af = {num: 0, ap: 1, dp: 1 }
    @df = {num: 0, ap: 1, dp: 1 }
  
  constructor: -> 
    @reset()
    @selFunc = @funcs[0]

  calcCombat: ->
    @log = ''
    @selFunc.func.call @, @af, @df