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修理效率最高的时间点
+
+
+