diff --git a/index.cjsx b/index.cjsx index 708ead4..a96332f 100644 --- a/index.cjsx +++ b/index.cjsx @@ -1,36 +1,74 @@ -{ROOT, React, ReactBootstrap, FontAwesome, resolveTime, notify} = window -{Table, Label} = ReactBootstrap +{ROOT, React, ReactBootstrap, FontAwesome, resolveTime, notify, config} = window +{Grid, Col, Table, Label, Tabs, Tab, Input} = ReactBootstrap {relative, join} = require 'path-extra' -AkashiTime = delayTime = 30 -firstAccount = 20 * 60 + delayTime + AkashiTime +delayTime = 10 +firstAccount = 20 * 60 + delayTime workShip = 19 repairItem = 86 initNotified = [false, false, false, false] -initFleets = [ +initStateFleets = [ inRepair: false name: '' ships: [] startTime: -1 - span: -1 + repairCondition: [0, 0, 0, 0, 0, 0] + akashiCapacity: 0 , inRepair: false name: '' ships: [] startTime: -1 - span: -1 + repairCondition: [0, 0, 0, 0, 0, 0] + akashiCapacity: 0 , inRepair: false name: '' ships: [] startTime: -1 - span: -1 + repairCondition: [0, 0, 0, 0, 0, 0] + akashiCapacity: 0 , inRepair: false name: '' ships: [] startTime: -1 - span: -1 + repairCondition: [0, 0, 0, 0, 0, 0] + akashiCapacity: 0 +] + +initFleets = [ + span: 0 + efficiency: 0 + maxEfficiency: -1 + maxTime: -1 + spentNode: null + efficiencyNode: null + suggestionNode: null + , + span: 0 + efficiency: 0 + maxEfficiency: -1 + maxTime: -1 + spentNode: null + efficiencyNode: null + suggestionNode: null + , + span: 0 + efficiency: 0 + maxEfficiency: -1 + maxTime: -1 + spentNode: null + efficiencyNode: null + suggestionNode: null + , + span: 0 + efficiency: 0 + maxEfficiency: -1 + maxTime: -1 + spentNode: null + efficiencyNode: null + suggestionNode: null ] module.exports = @@ -42,9 +80,11 @@ module.exports = description: '泊地修理' version: '制杖版' reactClass: React.createClass + fleets: Object.clone initFleets getInitialState: -> notified: Object.clone initNotified - fleets: Object.clone initFleets + fleets: Object.clone initStateFleets + checkTime: config.get 'plugin.Repair.checkTime', 5 compareFleet: (fleetA, fleetB) -> if fleetA? and fleetB? and fleetA.ships.length == fleetB.ships.length for ship ,idx in fleetA.ships @@ -68,6 +108,29 @@ module.exports = if not (fleet[i] in window._ndocks) return true return false + calculateRepairCondition: (fleet) -> + {_slotitems, _ships, $ships} = window + if fleet[0] isnt -1 and $ships[_ships[fleet[0]].api_ship_id].api_stype is workShip and (_ships[fleet[0]].api_nowhp * 4 // _ships[fleet[0]].api_maxhp) > 2 + akashiCapacity = 1 + for itemId in _ships[fleet[0]].api_slot #TODO, correct name + continue if itemId == -1 + if _slotitems[itemId].api_slotitem_id is repairItem + akashiCapacity += 1 + repairCondition = [0, 0, 0, 0, 0, 0] + for i in [1 .. 5] + if i <= akashiCapacity + if fleet[i] isnt -1 + if _ships[fleet[i]].api_nowhp isnt _ships[fleet[i]].api_maxhp + if (_ships[fleet[i]].api_nowhp * 2 > _ships[fleet[i]].api_maxhp) ## + if not (fleet[i] in window._ndocks) + repairCondition[i] = 1 + ret = + repairCondition: repairCondition + akashiCapacity: akashiCapacity + handleSetCheckTime: (e) -> + config.set 'plugin.Repair.checkTime', @refs.checkTime.getValue() + @setState + checkTime: @refs.checkTime.getValue() handleResponse: (e) -> {method, path, body, postBody} = e.detail {_ships, _decks} = window @@ -83,61 +146,154 @@ module.exports = name: deck.api_name ships: [] startTime: nowTime - span: -1 + repairCondition: [0, 0, 0, 0, 0, 0] + akashiCapacity: 0 if _inRepair for ship_id in deck.api_ship when ship_id isnt -1 ship = id: ship_id hp: _ships[ship_id].api_nowhp + maxHp: _ships[ship_id].api_maxhp + repairTime: _ships[ship_id].api_ndock_time // 1000 fleets[i].ships.push ship + {repairCondition, akashiCapacity} = @calculateRepairCondition deck.api_ship + fleets[i].repairCondition = repairCondition + fleets[i].akashiCapacity = akashiCapacity # console.log fleets # console.log @state.fleets for i in [0..3] when @state.fleets[i].inRepair if @compareFleet(fleets[i], @state.fleets[i]) fleets[i].startTime = @state.fleets[i].startTime - fleets[i].span = (nowTime - @state.fleets[i].startTime) // 1000 notified[i] = @state.notified[i] @setState fleets: fleets notified: notified + calculateEfficency: (elapse, fleetIndex) -> + elapse -= delayTime + fleet = @state.fleets[fleetIndex] + if fleet.inRepair + if elapse < 20 * 60 + 0 + else + timeSum = 0 + for ship, idx in fleet.ships + if ship.repairTime isnt 0 and fleet.repairCondition[idx] is 1 + timeSum += Math.min(ship.maxHp - ship.hp, Math.max(1, (ship.maxHp - ship.hp) * elapse // ship.repairTime)) * ship.repairTime / (ship.maxHp - ship.hp) + (timeSum * 1000 // (fleet.akashiCapacity * elapse)) / 10 + else + 0 + bindNode: -> + for i in [0..3] when @state.fleets[i].inRepair + @fleets[i].spentNode = document.querySelector("#repair-table-row#{i}-spent") + @fleets[i].efficiencyNode = document.querySelector("#repair-table-row#{i}-efficiency") + @fleets[i].suggestionNode = document.querySelector("#repair-table-row#{i}-suggestion") + initFleetsArg: -> + nowTime = (new Date).getTime() + for i in [0..3] when @state.fleets[i].inRepair + @fleets[i].span = (nowTime - @state.fleets[i].startTime) // 1000 + @fleets[i].efficiency = @calculateEfficency @fleets[i].span, i + startTime = Math.max(firstAccount, @fleets[i].span) + endTime = startTime + @state.checkTime * 60 + timeCheckList = [startTime] + for ship in @state.fleets[i].ships when ship.maxHp isnt ship.hp + step = Math.ceil(ship.repairTime / ( ship.maxHp - ship.hp)) + idx = 1 + while (step * idx + delayTime) < endTime + if (step * idx + delayTime) > startTime + timeCheckList.push step * idx + delayTime + idx++ + @fleets[i].maxEfficiency = -1 + @fleets[i].maxTime = 0 + for elapsedTime in timeCheckList + tmp = @calculateEfficency elapsedTime, i + if tmp > @fleets[i].maxEfficiency + @fleets[i].maxEfficiency = tmp + @fleets[i].maxTime = elapsedTime componentDidMount: -> window.addEventListener 'game.response', @handleResponse setInterval @updateCount, 1000 + @bindNode() + @initFleetsArg() componentWillUnmount: -> window.removeEventListener 'game.response', @handleResponse clearInterval @updateCount, 1000 + componentDidUpdate: -> + @bindNode() + @initFleetsArg() updateCount: -> - {notified, fleets} = @state nowTime = (new Date).getTime() + {notified, fleets} = @state for fleet, i in fleets when fleet.inRepair - fleet.span = (nowTime - fleet.startTime) // 1000 + @fleets[i].span = (nowTime - @state.fleets[i].startTime) // 1000 + if @fleets[i].span > @fleets[i].maxTime + delayTime + @initFleetsArg() + @fleets[i].spentNode?.innerHTML = resolveTime @fleets[i].span + @fleets[i].efficiencyNode?.innerHTML = "#{@calculateEfficency @fleets[i].span, i}%" + @fleets[i].suggestionNode?.innerHTML = resolveTime Math.max(0, @fleets[i].maxTime - @fleets[i].span) # console.log fleets - if fleet.span > firstAccount and !notified[i] + if @fleets[i].span > firstAccount and !notified[i] window.notify "#{fleet.name} 第一次结算可能", type: 'repair' icon: join(ROOT, 'assets', 'img', 'operation', 'repair.png') notified[i] = true - @setState - fleets: fleets - notified: notified + @setState + fleets: fleets + notified: notified render: ->
- - - { - for i in [0..3] - - - - - } - -
{@state.fleets[i].name} - { - if @state.fleets[i].inRepair - - else - - } -
+ + + + + + + + + + + + + { + for i in [0..3] + + + + + + + } + +
舰队名已修理修理效率建议刷新
{@state.fleets[i].name} + { + if @state.fleets[i].inRepair + + else + + } + + { + if @state.fleets[i].inRepair + + else + + } + + { + if @state.fleets[i].inRepair + + else + + } +
+ + +
+ 查找之后 +
+ +
+ min修理效率最高的时间点 +
+ +