{"action":"created","comment":{"url":"https://api.github.com/repos/xivanalysis/xivanalysis/pulls/comments/207351044","pull_request_review_id":142948087,"id":207351044,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIwNzM1MTA0NA==","diff_hunk":"@@ -0,0 +1,599 @@\n+import React, {Fragment} from 'react'\n+\n+import {ActionLink} from 'components/ui/DbLink'\n+import ACTIONS from 'data/ACTIONS'\n+import STATUSES from 'data/STATUSES'\n+import Module from 'parser/core/Module'\n+import {Suggestion, SEVERITY} from 'parser/core/modules/Suggestions'\n+import {Rule, Requirement} from 'parser/core/modules/Checklist'\n+import {Accordion, Message} from 'semantic-ui-react'\n+\n+// -----\n+// UI stuff\n+// -----\n+const DARK_ARTS_MANA_POTENCY = 140\n+const DARK_ARTS_MANA_COST = 2400\n+const BLOODSPILLER_BLOOD_POTENCY = 135\n+const BLOODSPILLER_BLOOD_COST = 50\n+\n+// -----\n+// Simulator fun time\n+// ------\n+// -----\n+// Meters\n+// ------\n+\n+//const MAX_BLOOD = 100\n+const MAX_MANA = 9480\n+const MAX_BLOOD = 100\n+const MANA_PER_OUT_OF_COMBAT_TICK = 568 // DA should be used at least 2 ticks pre pull\n+//const DARKSIDE_MANA_COST = 600\n+\n+const BLOOD_PRICE_BLOOD_DAMAGE_TRIGGERED_BLOOD_AMOUNT = 1\n+const BLOOD_PRICE_BLOOD_DAMAGE_TRIGGERED_MANA_AMOUNT = 120\n+const BLOOD_PRICE_BLOOD_PASSIVE_RATE = 3000\n+const BLOOD_PRICE_BLOOD_PASSIVE_AMOUNT = 4\n+const BLOOD_PRICE_MAX_DURATION = 15000\n+\n+const RESOURCE_STATUS_EFFECTS = [\n+\t{id: STATUSES.ANOTHER_VICTIM.id,\n+\t\tduration: 15000,\n+\t\ttype: 'debuff',\n+\t\texpire_mana: MAX_MANA * 0.2,\n+\t\texpire_blood: 0,\n+\t\tactivate_mana: MAX_MANA * 0.3,\n+\t\tactivate_blood: 0,\n+\t},\n+\t{id: STATUSES.BLACKEST_NIGHT.id,\n+\t\tduration: 7000,\n+\t\ttype: 'buff',\n+\t\texpire_mana: 0,\n+\t\texpire_blood: 0,\n+\t\tactivate_mana: 0,\n+\t\tactivate_blood: 50,\n+\t},\n+]\n+\n+const MANA_MODIFIERS = [\n+\t// generators\n+\t{id: ACTIONS.DELIRIUM.id, value: 2400},\n+\t// spenders\n+\t{id: ACTIONS.DARKSIDE.id, value: -600},\n+\t{id: ACTIONS.DARK_ARTS.id, value: -2400},\n+\t{id: ACTIONS.DARK_PASSENGER.id, value: -2400},\n+\t{id: ACTIONS.THE_BLACKEST_NIGHT.id, value: -2400},\n+\t{id: ACTIONS.ABYSSAL_DRAIN.id, value: -1320},\n+\t{id: ACTIONS.UNLEASH.id, value: -1080},\n+\t{id: ACTIONS.UNMEND.id, value: -480},\n+\t{id: ACTIONS.GRIT.id, value: -1200},\n+\t{id: ACTIONS.DARKSIDE.id, value: -600},\n+]\n+\n+const BLOOD_MODIFIERS = [\n+\t// spenders\n+\t{id: ACTIONS.BLOODSPILLER.id, value: -50},\n+\t{id: ACTIONS.QUIETUS.id, value: -50},\n+\t{id: ACTIONS.DELIRIUM.id, value: -50},\n+]\n+\n+//aoe abilities that generate resource on hits\n+/* taken out for now, as the raw damage events work just fine.\n+const AOE_GENERATORS = [\n+\t{id: ACTIONS.SALTED_EARTH.id, mana: 0, blood: 1},\n+\t{id: ACTIONS.QUIETUS.id, mana: 120, blood: 0},\n+]\n+*/\n+\n+// Actions that generate blood and mana under blood weapon (Physical Damage actions - 3 blood, 480mp).\n+// redundant, but this keeps consistency with the other mappings\n+const BLOOD_WEAPON_GENERATORS = [\n+\t// Auto\n+\t{id: ACTIONS.ATTACK.id, mana: 480, blood: 3},\n+\t// Combo GCDs\n+\t{id: ACTIONS.HARD_SLASH.id, mana: 480, blood: 3},\n+\t{id: ACTIONS.SYPHON_STRIKE.id, mana: 480, blood: 3},\n+\t{id: ACTIONS.SOULEATER.id, mana: 480, blood: 3},\n+\t{id: ACTIONS.SPINNING_SLASH.id, mana: 480, blood: 3},\n+\t{id: ACTIONS.POWER_SLASH.id, mana: 480, blood: 3},\n+\t// other GCDs\n+\t{id: ACTIONS.BLOODSPILLER.id, mana: 480, blood: 3},\n+\t{id: ACTIONS.QUIETUS.id, mana: 480, blood: 3},\n+\t// oGCDs\n+\t{id: ACTIONS.PLUNGE.id, mana: 480, blood: 3},\n+\t{id: ACTIONS.CARVE_AND_SPIT.id, mana: 480, blood: 3},\n+]\n+\n+// Actions that generate resources in GCD combo\n+const COMBO_GENERATORS = [\n+\t{id: ACTIONS.SOULEATER.id, mana: 0, blood: 10},\n+\t{id: ACTIONS.SYPHON_STRIKE.id, mana: 1200, blood: 0},\n+]\n+// Combo actions that generate bonus resource if grit is active\n+const COMBO_GRIT_GENERATORS = [\n+\t{id: ACTIONS.SYPHON_STRIKE.id, mana: 1200, blood: 0},\n+]\n+\n+export default class Resources extends Module {\n+\tstatic handle = 'resourcesim'\n+\tstatic title = 'Resource Analyzer'\n+\tstatic dependencies = [\n+\t\t'library',\n+\t\t'buffs',\n+\t\t'gcds',\n+\t\t'suggestions',\n+\t\t'checklist',\n+\t\t'downtime',\n+\t]\n+\n+\t// -----\n+\t// Resource utilities\n+\t// -----\n+\t_totalGainedMana = 0\n+\t_totalSpentMana = 0\n+\t_totalDroppedMana = 0\n+\t_currentMana = 0\n+\t_wastedMana = 0\n+\t_totalGainedBlood = 0\n+\t_totalSpentBlood = 0\n+\t_totalDroppedBlood = 0\n+\t_currentBlood = 0\n+\t_wastedBlood = 0\n+\t// tracker stacks\n+\t_mana_total_modifiers = []\n+\t_blood_total_modifiers = []\n+\t// -----\n+\t// Parser Stats\n+\t// -----\n+\t_firstDamageEvent = true\n+\t_bloodPriceStartTime = undefined\n+\t_darksideRemoveTimestamp = undefined\n+\t// -----\n+\t// Evaluation units\n+\t// -----\n+\t_darkArtsOpener = undefined\n+\t_droppedTBNs = 0\n+\t_noDACarve = 0\n+\t//timestamps for TBN and sole\n+\t_resourceBuffTimestamps = {}\n+\n+\tconstructor(...args) {\n+\t\tsuper(...args)\n+\t\tthis.addHook('cast', {by: 'player'}, this._onCast)\n+\t\t//if aoe damage events ever replace the single damage events, blood weapon gain will have to be tracked here\n+\t\t//this.addHook('aoedamage', {by: 'player', abilityId: [ACTIONS.QUIETUS, ACTIONS.SALTED_EARTH]}, this._onAoEDamageDealt)\n+\t\tthis.addHook('damage', {by: 'player'}, this._onDamageDealt)\n+\t\tthis.addHook('damage', {to: 'player'}, this._onDamageTaken)\n+\t\tthis.addHook('applybuff', {by: 'player', abilityId: STATUSES.DARKSIDE.id}, this._darksideApply)\n+\t\tthis.addHook('removebuff', {by: 'player', abilityId: STATUSES.DARKSIDE.id}, this._darksideRemove)\n+\t\tthis.addHook('applybuff', {by: 'player', abilityId: STATUSES.BLOOD_PRICE.id}, this._bloodPriceStart)\n+\t\tthis.addHook('removebuff', {by: 'player', abilityId: STATUSES.BLOOD_PRICE.id}, this._bloodPriceEnd)\n+\t\tthis.addHook(['applybuff', 'applydebuff'], {by: 'player', abilityId: RESOURCE_STATUS_EFFECTS.map(entry => entry.id)}, this._onApplyResourceStatuses)\n+\t\tthis.addHook(['removebuff', 'removedebuff'], {by: 'player', abilityId: RESOURCE_STATUS_EFFECTS.map(entry => entry.id)}, this._onRemoveResourceStatuses)\n+\t\tthis.addHook('death', {by: 'player'}, this._onDeath)\n+\t\tthis.addHook('complete', this._onComplete)\n+\t\t//should be spending full mana + 2 out of combat ticks, so just give that much mana to start\n+\t\tthis.modifyMana(undefined, MAX_MANA + (MANA_PER_OUT_OF_COMBAT_TICK * 2))\n+\t}\n+\n+\t// -----\n+\t// Resource Utility Methods\n+\t// -----\n+\n+\tmodifyMana(ability, value) {\n+\t\tif (value !== 0) {\n+\t\t\tif (value > 0) {\n+\t\t\t\tthis._totalGainedMana += value\n+\t\t\t} else {\n+\t\t\t\tthis._totalSpentMana += value\n+\t\t\t}\n+\t\t\tconst currentManaSnapshot = this._currentMana\n+\t\t\tconst vals = this._bindToCeiling(currentManaSnapshot, value, MAX_MANA)\n+\t\t\tthis._wastedMana += vals.waste\n+\t\t\tthis._currentMana = vals.result\n+\t\t\tif (ability !== undefined) {\n+\t\t\t\tthis._mana_total_modifiers.push({ability: ability, value: value})\n+\t\t\t} else {\n+\t\t\t\tthis._mana_total_modifiers.push({ability: undefined, value: value})\n+\t\t\t}\n+\t\t}\n+\t}\n+\n+\tmodifyBlood(ability, value) {\n+\t\tif (value !== 0) {\n+\t\t\tif (value > 0) {\n+\t\t\t\tthis._totalGainedBlood += value\n+\t\t\t} else {\n+\t\t\t\tthis._totalSpentBlood += value\n+\t\t\t}\n+\t\t\tconst currentBloodSnapshot = this._currentBlood\n+\t\t\tconst vals = this._bindToCeiling(currentBloodSnapshot, value, MAX_BLOOD)\n+\t\t\tthis._wastedBlood += vals.waste\n+\t\t\tthis._currentBlood = vals.result\n+\t\t\tif (ability !== undefined) {\n+\t\t\t\tthis._blood_total_modifiers.push({ability: ability, value: value})\n+\t\t\t}\n+\t\t}\n+\t}\n+\n+\tdumpResources() {\n+\t\tthis._wastedMana += this._currentMana\n+\t\tthis._wastedBlood += this._currentBlood\n+\t\tthis._totalDroppedMana += this._currentMana\n+\t\tthis._totalDroppedBlood += this._currentBlood\n+\t\tthis._currentMana = 0\n+\t\tthis._currentBlood = 0\n+\t}\n+\n+\t// noinspection JSMethodCanBeStatic\n+\t_bindToCeiling(op1, op2, ceiling) {\n+\t\treturn {waste: op1 + op2 > ceiling ? (op1 + op2 - ceiling) : 0, result: op1 + op2 > ceiling ? ceiling : (op1 + op2)}\n+\t}\n+\n+\t// -----\n+\t// simulator util\n+\t// ------\n+\n+\t_onDeath() {\n+\t\tthis.dumpResources()\n+\t}\n+\n+\t_onCast(event) {\n+\t\tconst abilityId = event.ability.guid\n+\t\tif (MANA_MODIFIERS.some(entry => entry.id === abilityId)) {\n+\t\t\tthis.modifyMana(event.ability, MANA_MODIFIERS.find(entry => entry.id === abilityId).value)\n+\t\t}\n+\t\tif (BLOOD_MODIFIERS.some(entry => entry.id === abilityId)) {\n+\t\t\tthis.modifyBlood(event.ability, BLOOD_MODIFIERS.find(entry => entry.id === abilityId).value)\n+\t\t}\n+\t\tif (this.gcds.inGCDCombo()) {\n+\t\t\tif (COMBO_GENERATORS.some(entry => entry.id === abilityId)) {\n+\t\t\t\tconst entry = COMBO_GENERATORS.find(entry => entry.id === abilityId)\n+\t\t\t\tthis.modifyMana(event.ability, entry.mana)\n+\t\t\t\tthis.modifyBlood(event.ability, entry.blood)\n+\t\t\t}\n+\t\t\tif (this.buffs.gritActive()) {\n+\t\t\t\tif (COMBO_GRIT_GENERATORS.some(entry => entry.id === abilityId)) {\n+\t\t\t\t\tconst entry = COMBO_GRIT_GENERATORS.find(entry => entry.id === abilityId)\n+\t\t\t\t\tthis.modifyMana(event.ability, entry.mana)\n+\t\t\t\t\tthis.modifyBlood(event.ability, entry.blood)\n+\t\t\t\t}\n+\t\t\t}\n+\t\t}\n+\t\t//one off case for checking for DA-less carve n spit, which we can then make a suggestion for because this is really bad\n+\t\tif (ACTIONS.CARVE_AND_SPIT.id === abilityId && !this.buffs.darkArtsActive()) {\n+\t\t\t//great why are we here\n+\t\t\tthis._noDACarve += 1\n+\t\t\tthis.modifyMana(event.ability, 1200)\n+\t\t}\n+\t}\n+\n+\t_onApplyResourceStatuses(event) {\n+\t\t//safety net, since we're getting buffs and debuffs\n+\t\tconst abilityId = event.ability.guid\n+\t\tif (RESOURCE_STATUS_EFFECTS.some(entry => entry.id === abilityId)) {\n+\t\t\tthis._resourceBuffTimestamps[abilityId] = event.timestamp\n+\t\t}\n+\t}\n+\n+\t_onRemoveResourceStatuses(event) {\n+\t\t//safety net, since we're getting buffs and debuffs\n+\t\tconst abilityId = event.ability.guid\n+\t\tif (RESOURCE_STATUS_EFFECTS.some(entry => entry.id === abilityId)) {\n+\t\t\tconst entry = RESOURCE_STATUS_EFFECTS.find(entry => entry.id === abilityId)\n+\t\t\tconst applicationTime = this._resourceBuffTimestamps[abilityId]\n+\t\t\tif (event.timestamp - applicationTime < entry.duration) {\n+\t\t\t\t//popped\n+\t\t\t\tthis.modifyBlood(event.ability, entry.activate_blood)\n+\t\t\t\tthis.modifyMana(event.ability, entry.activate_mana)\n+\t\t\t} else {\n+\t\t\t\t//expired\n+\t\t\t\tthis.modifyBlood(event.ability, entry.expire_blood)\n+\t\t\t\tthis.modifyMana(event.ability, entry.expire_mana)\n+\t\t\t\t//special handling for TBN since it's basically throwing away damage\n+\t\t\t\tif (abilityId === STATUSES.BLACKEST_NIGHT) {\n+\t\t\t\t\tthis._droppedTBNs += 1\n+\t\t\t\t}\n+\t\t\t}\n+\t\t}\n+\n+\t}\n+\n+\t// ----\n+\n+\t_darksideApply(event) {\n+\t\tif (this._darksideRemoveTimestamp !== undefined) {\n+\t\t\t//give mana ticks for how long they had it down for\n+\t\t\t//using 2% of max mana per tick\n+\t\t\tconst ticks = Math.floor((event.timestamp - this._darksideRemoveTimestamp) / 3000)\n+\t\t\tthis.modifyMana(undefined, ticks * Math.floor(MAX_MANA * 0.02))\n+\t\t\t//reset darkside in case something breaks\n+\t\t\tthis._darksideRemoveTimestamp = undefined\n+\t\t}\n+\t}\n+\n+\t_darksideRemove(event) {\n+\t\tthis._darksideRemoveTimestamp = event.timestamp\n+\t}\n+\n+\t_bloodPriceStart(event) {\n+\t\tthis._bloodPriceStartTime = event.timestamp\n+\t}\n+\n+\t_bloodPriceEnd(event) {\n+\t\t//if we didn't see the start event, we just have to assume a full duration gain\n+\t\tlet ticks = (BLOOD_PRICE_MAX_DURATION / BLOOD_PRICE_BLOOD_PASSIVE_RATE) * BLOOD_PRICE_BLOOD_PASSIVE_AMOUNT\n+\t\tif (this._bloodPriceStartTime !== undefined) {\n+\t\t\tticks = Math.round((event.timestamp - this._bloodPriceStartTime) / BLOOD_PRICE_BLOOD_PASSIVE_RATE) * BLOOD_PRICE_BLOOD_PASSIVE_AMOUNT\n+\t\t}\n+\t\tthis.modifyBlood(ACTIONS.BLOOD_PRICE, BLOOD_PRICE_BLOOD_PASSIVE_AMOUNT * ticks)\n+\t}\n+\n+\t//this.correctMana(event.sourceResources.mp)\n+\t_onDamageDealt(event) {\n+\t\t// check if it's the first damage event\n+\t\tif (this._firstDamageEvent) {\n+\t\t\t// check if mana is missing or not, if so then DA opener was used\n+\t\t\tthis._darkArtsOpener = (event.sourceResources.mp !== event.sourceResources.maxMP)\n+\t\t}\n+\t\tthis._firstDamageEvent = false\n+\t\t// blood weapon outgoing damage\n+\t\tconst abilityId = event.ability.guid\n+\t\tif (this.buffs.bloodWeaponActive() && BLOOD_WEAPON_GENERATORS.some(entry => entry.id === abilityId)) {\n+\t\t\tconst entry = BLOOD_WEAPON_GENERATORS.find(entry => entry.id === abilityId)\n+\t\t\tthis.modifyMana(ACTIONS.BLOOD_WEAPON, entry.mana)\n+\t\t\tthis.modifyBlood(ACTIONS.BLOOD_WEAPON, entry.blood)\n+\t\t}\n+\t}\n+\n+\t_onDamageTaken() { //event) {\n+\t\t// blood price incoming damage\n+\t\tif (this.buffs.bloodPriceActive()) {\n+\t\t\tthis.modifyBlood(ACTIONS.BLOOD_PRICE, BLOOD_PRICE_BLOOD_DAMAGE_TRIGGERED_BLOOD_AMOUNT)\n+\t\t\tthis.modifyMana(ACTIONS.BLOOD_PRICE, BLOOD_PRICE_BLOOD_DAMAGE_TRIGGERED_MANA_AMOUNT)\n+\t\t}\n+\t}\n+\n+\t// -----\n+\t// ui\n+\t// -----\n+\n+\t_onComplete() {\n+\t\t//dump unused resources\n+\t\tthis.dumpResources()\n+\t\t// UI\n+\t\tthis.checklist.add(new Rule({\n+\t\t\tname: 'Mana Utilization',\n+\t\t\tdescription: <Fragment>Capping on mana or dying is a potency loss of about {DARK_ARTS_MANA_POTENCY} per {DARK_ARTS_MANA_COST\n+\t\t\t} mana for each wasted <ActionLink {...ACTIONS.DARK_ARTS}/>.  It's better to clip and use the mana than to cap.</Fragment>,\n+\t\t\trequirements: [\n+\t\t\t\tnew Requirement({\n+\t\t\t\t\tname: 'Mana Utilization',\n+\t\t\t\t\tpercent: ((Math.abs(this._totalSpentMana) / (this._totalGainedMana)) * 100),\n+\t\t\t\t}),\n+\t\t\t],\n+\t\t}))\n+\t\tthis.checklist.add(new Rule({\n+\t\t\tname: 'Blood Utilization',\n+\t\t\tdescription: <Fragment>Capping on blood is a potency loss of about {BLOODSPILLER_BLOOD_POTENCY\n+\t\t\t} per {BLOODSPILLER_BLOOD_COST} blood.  Some cases of blood cap loss are unavoidable due to <ActionLink {...ACTIONS.THE_BLACKEST_NIGHT}/> usage.  Remember that <ActionLink {...ACTIONS.BLOODSPILLER}\n+\t\t\t/> does not reset your <ActionLink {...ACTIONS.SOULEATER}/>combo, consumes <ActionLink {...ACTIONS.DARK_ARTS}/>, and bypasses the major potency penalty from <ActionLink {...ACTIONS.GRIT}/>.</Fragment>,\n+\t\t\trequirements: [\n+\t\t\t\tnew Requirement({\n+\t\t\t\t\tname: 'Blood Utilization',\n+\t\t\t\t\tpercent: ((Math.abs(this._totalSpentBlood) / (this._totalGainedBlood)) * 100),\n+\t\t\t\t}),\n+\t\t\t],\n+\t\t}))\n+\t\tif (!this._darkArtsOpener) {\n+\t\t\tthis.suggestions.add(new Suggestion({\n+\t\t\t\ticon: ACTIONS.DARK_ARTS.icon,\n+\t\t\t\tcontent: <Fragment>\n+\t\t\t\t\tMissing a <ActionLink {...ACTIONS.DARK_ARTS}/> pre-pull for use during the opener is a large potency and enmity loss.  Using DA at around 6-7 seconds before pull gives ample time to use it as well as gain two pre-fight mana ticks.\n+\t\t\t\t</Fragment>,\n+\t\t\t\tseverity: SEVERITY.MAJOR,\n+\t\t\t\twhy: <Fragment>\n+\t\t\t\t\tMana was logged at 100% when the fight started, which implies that a <ActionLink {...ACTIONS.DARK_ARTS}/> was not used pre-pull.  Ignore this if mana was at 100% for some other reason.\n+\t\t\t\t</Fragment>,\n+\t\t\t}))\n+\t\t}\n+\t\tif (this._droppedTBNs > 0) {\n+\t\t\tthis.suggestions.add(new Suggestion({\n+\t\t\t\ticon: ACTIONS.THE_BLACKEST_NIGHT.icon,\n+\t\t\t\tcontent: <Fragment>\n+\t\t\t\t\tOne or more <ActionLink {...ACTIONS.THE_BLACKEST_NIGHT}/> applications did not pop, and thus did not generate blood.  This equates to throwing away the mana you could have spent on a <ActionLink {...ACTIONS.DARK_ARTS}/>.\n+\t\t\t\t</Fragment>,\n+\t\t\t\tseverity: SEVERITY.MAJOR,\n+\t\t\t\twhy: <Fragment>\n+\t\t\t\t\tYou missed out on {this._droppedTBNs * 50} blood ({BLOODSPILLER_BLOOD_POTENCY} potency) or {this._droppedTBNs * 140} potency of Dark Arts buffs.\n+\t\t\t\t</Fragment>,\n+\t\t\t}))\n+\t\t}\n+\t\tif (this._noDACarve > 0) {\n+\t\t\tthis.suggestions.add(new Suggestion({\n+\t\t\t\ticon: ACTIONS.CARVE_AND_SPIT.icon,\n+\t\t\t\tcontent: <Fragment>\n+\t\t\t\t\tOne or more <ActionLink {...ACTIONS.CARVE_AND_SPIT}/> was used without <ActionLink {...ACTIONS.DARK_ARTS}/>\n+\t\t\t\t\t.  Even though this generates the same amount of mana as <ActionLink {...ACTIONS.SYPHON_STRIKE}/>, it loses out on 300 potency, a massive part of your damage as a DRK.\n+\t\t\t\t</Fragment>,\n+\t\t\t\tseverity: SEVERITY.MAJOR,\n+\t\t\t\twhy: <Fragment>\n+\t\t\t\t\tYou missed out on {this._noDACarve * 350} potency due to {this._noDACarve} due to no buff carves.","path":"src/parser/jobs/drk/ResourceSimulator.js","position":420,"original_position":420,"commit_id":"ab26e37ed6d52e65d201b5fa418b51b06dafd319","original_commit_id":"ab26e37ed6d52e65d201b5fa418b51b06dafd319","user":{"login":"Xslare","id":4662007,"node_id":"MDQ6VXNlcjQ2NjIwMDc=","avatar_url":"https://avatars1.githubusercontent.com/u/4662007?v=4","gravatar_id":"","url":"https://api.github.com/users/Xslare","html_url":"https://github.com/Xslare","followers_url":"https://api.github.com/users/Xslare/followers","following_url":"https://api.github.com/users/Xslare/following{/other_user}","gists_url":"https://api.github.com/users/Xslare/gists{/gist_id}","starred_url":"https://api.github.com/users/Xslare/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Xslare/subscriptions","organizations_url":"https://api.github.com/users/Xslare/orgs","repos_url":"https://api.github.com/users/Xslare/repos","events_url":"https://api.github.com/users/Xslare/events{/privacy}","received_events_url":"https://api.github.com/users/Xslare/received_events","type":"User","site_admin":false},"body":"100 gets upgraded to 450; 350 difference. getting cleaned up","created_at":"2018-08-02T19:47:33Z","updated_at":"2018-08-02T19:47:33Z","html_url":"https://github.com/xivanalysis/xivanalysis/pull/118#discussion_r207351044","pull_request_url":"https://api.github.com/repos/xivanalysis/xivanalysis/pulls/118","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/xivanalysis/xivanalysis/pulls/comments/207351044"},"html":{"href":"https://github.com/xivanalysis/xivanalysis/pull/118#discussion_r207351044"},"pull_request":{"href":"https://api.github.com/repos/xivanalysis/xivanalysis/pulls/118"}},"in_reply_to_id":207340281},"pull_request":{"url":"https://api.github.com/repos/xivanalysis/xivanalysis/pulls/118","id":205604508,"node_id":"MDExOlB1bGxSZXF1ZXN0MjA1NjA0NTA4","html_url":"https://github.com/xivanalysis/xivanalysis/pull/118","diff_url":"https://github.com/xivanalysis/xivanalysis/pull/118.diff","patch_url":"https://github.com/xivanalysis/xivanalysis/pull/118.patch","issue_url":"https://api.github.com/repos/xivanalysis/xivanalysis/issues/118","number":118,"state":"open","locked":false,"title":"DRK","user":{"login":"Xslare","id":4662007,"node_id":"MDQ6VXNlcjQ2NjIwMDc=","avatar_url":"https://avatars1.githubusercontent.com/u/4662007?v=4","gravatar_id":"","url":"https://api.github.com/users/Xslare","html_url":"https://github.com/Xslare","followers_url":"https://api.github.com/users/Xslare/followers","following_url":"https://api.github.com/users/Xslare/following{/other_user}","gists_url":"https://api.github.com/users/Xslare/gists{/gist_id}","starred_url":"https://api.github.com/users/Xslare/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Xslare/subscriptions","organizations_url":"https://api.github.com/users/Xslare/orgs","repos_url":"https://api.github.com/users/Xslare/repos","events_url":"https://api.github.com/users/Xslare/events{/privacy}","received_events_url":"https://api.github.com/users/Xslare/received_events","type":"User","site_admin":false},"body":"have fun","created_at":"2018-08-02T02:49:46Z","updated_at":"2018-08-02T19:47:33Z","closed_at":null,"merged_at":null,"merge_commit_sha":"1e0f133a24f8e50c71a021f83e90976651e40501","assignee":null,"assignees":[],"requested_reviewers":[{"login":"ackwell","id":534235,"node_id":"MDQ6VXNlcjUzNDIzNQ==","avatar_url":"https://avatars3.githubusercontent.com/u/534235?v=4","gravatar_id":"","url":"https://api.github.com/users/ackwell","html_url":"https://github.com/ackwell","followers_url":"https://api.github.com/users/ackwell/followers","following_url":"https://api.github.com/users/ackwell/following{/other_user}","gists_url":"https://api.github.com/users/ackwell/gists{/gist_id}","starred_url":"https://api.github.com/users/ackwell/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ackwell/subscriptions","organizations_url":"https://api.github.com/users/ackwell/orgs","repos_url":"https://api.github.com/users/ackwell/repos","events_url":"https://api.github.com/users/ackwell/events{/privacy}","received_events_url":"https://api.github.com/users/ackwell/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/xivanalysis/xivanalysis/pulls/118/commits","review_comments_url":"https://api.github.com/repos/xivanalysis/xivanalysis/pulls/118/comments","review_comment_url":"https://api.github.com/repos/xivanalysis/xivanalysis/pulls/comments{/number}","comments_url":"https://api.github.com/repos/xivanalysis/xivanalysis/issues/118/comments","statuses_url":"https://api.github.com/repos/xivanalysis/xivanalysis/statuses/ab26e37ed6d52e65d201b5fa418b51b06dafd319","head":{"label":"Xslare:feature/drk","ref":"feature/drk","sha":"ab26e37ed6d52e65d201b5fa418b51b06dafd319","user":{"login":"Xslare","id":4662007,"node_id":"MDQ6VXNlcjQ2NjIwMDc=","avatar_url":"https://avatars1.githubusercontent.com/u/4662007?v=4","gravatar_id":"","url":"https://api.github.com/users/Xslare","html_url":"https://github.com/Xslare","followers_url":"https://api.github.com/users/Xslare/followers","following_url":"https://api.github.com/users/Xslare/following{/other_user}","gists_url":"https://api.github.com/users/Xslare/gists{/gist_id}","starred_url":"https://api.github.com/users/Xslare/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Xslare/subscriptions","organizations_url":"https://api.github.com/users/Xslare/orgs","repos_url":"https://api.github.com/users/Xslare/repos","events_url":"https://api.github.com/users/Xslare/events{/privacy}","received_events_url":"https://api.github.com/users/Xslare/received_events","type":"User","site_admin":false},"repo":{"id":141903214,"node_id":"MDEwOlJlcG9zaXRvcnkxNDE5MDMyMTQ=","name":"xivanalysis","full_name":"Xslare/xivanalysis","owner":{"login":"Xslare","id":4662007,"node_id":"MDQ6VXNlcjQ2NjIwMDc=","avatar_url":"https://avatars1.githubusercontent.com/u/4662007?v=4","gravatar_id":"","url":"https://api.github.com/users/Xslare","html_url":"https://github.com/Xslare","followers_url":"https://api.github.com/users/Xslare/followers","following_url":"https://api.github.com/users/Xslare/following{/other_user}","gists_url":"https://api.github.com/users/Xslare/gists{/gist_id}","starred_url":"https://api.github.com/users/Xslare/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Xslare/subscriptions","organizations_url":"https://api.github.com/users/Xslare/orgs","repos_url":"https://api.github.com/users/Xslare/repos","events_url":"https://api.github.com/users/Xslare/events{/privacy}","received_events_url":"https://api.github.com/users/Xslare/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/Xslare/xivanalysis","description":"Automated performance analysis and suggestion platform for Final Fantasy XIV: Stormblood.","fork":true,"url":"https://api.github.com/repos/Xslare/xivanalysis","forks_url":"https://api.github.com/repos/Xslare/xivanalysis/forks","keys_url":"https://api.github.com/repos/Xslare/xivanalysis/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Xslare/xivanalysis/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Xslare/xivanalysis/teams","hooks_url":"https://api.github.com/repos/Xslare/xivanalysis/hooks","issue_events_url":"https://api.github.com/repos/Xslare/xivanalysis/issues/events{/number}","events_url":"https://api.github.com/repos/Xslare/xivanalysis/events","assignees_url":"https://api.github.com/repos/Xslare/xivanalysis/assignees{/user}","branches_url":"https://api.github.com/repos/Xslare/xivanalysis/branches{/branch}","tags_url":"https://api.github.com/repos/Xslare/xivanalysis/tags","blobs_url":"https://api.github.com/repos/Xslare/xivanalysis/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Xslare/xivanalysis/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Xslare/xivanalysis/git/refs{/sha}","trees_url":"https://api.github.com/repos/Xslare/xivanalysis/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Xslare/xivanalysis/statuses/{sha}","languages_url":"https://api.github.com/repos/Xslare/xivanalysis/languages","stargazers_url":"https://api.github.com/repos/Xslare/xivanalysis/stargazers","contributors_url":"https://api.github.com/repos/Xslare/xivanalysis/contributors","subscribers_url":"https://api.github.com/repos/Xslare/xivanalysis/subscribers","subscription_url":"https://api.github.com/repos/Xslare/xivanalysis/subscription","commits_url":"https://api.github.com/repos/Xslare/xivanalysis/commits{/sha}","git_commits_url":"https://api.github.com/repos/Xslare/xivanalysis/git/commits{/sha}","comments_url":"https://api.github.com/repos/Xslare/xivanalysis/comments{/number}","issue_comment_url":"https://api.github.com/repos/Xslare/xivanalysis/issues/comments{/number}","contents_url":"https://api.github.com/repos/Xslare/xivanalysis/contents/{+path}","compare_url":"https://api.github.com/repos/Xslare/xivanalysis/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Xslare/xivanalysis/merges","archive_url":"https://api.github.com/repos/Xslare/xivanalysis/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Xslare/xivanalysis/downloads","issues_url":"https://api.github.com/repos/Xslare/xivanalysis/issues{/number}","pulls_url":"https://api.github.com/repos/Xslare/xivanalysis/pulls{/number}","milestones_url":"https://api.github.com/repos/Xslare/xivanalysis/milestones{/number}","notifications_url":"https://api.github.com/repos/Xslare/xivanalysis/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Xslare/xivanalysis/labels{/name}","releases_url":"https://api.github.com/repos/Xslare/xivanalysis/releases{/id}","deployments_url":"https://api.github.com/repos/Xslare/xivanalysis/deployments","created_at":"2018-07-22T14:33:54Z","updated_at":"2018-08-02T10:59:47Z","pushed_at":"2018-08-02T10:59:46Z","git_url":"git://github.com/Xslare/xivanalysis.git","ssh_url":"git@github.com:Xslare/xivanalysis.git","clone_url":"https://github.com/Xslare/xivanalysis.git","svn_url":"https://github.com/Xslare/xivanalysis","homepage":"https://xivanalysis.com","size":2586,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"xivanalysis:master","ref":"master","sha":"c497d0b1bd0f066579c13853a141dfa48d01323e","user":{"login":"xivanalysis","id":39235942,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM5MjM1OTQy","avatar_url":"https://avatars0.githubusercontent.com/u/39235942?v=4","gravatar_id":"","url":"https://api.github.com/users/xivanalysis","html_url":"https://github.com/xivanalysis","followers_url":"https://api.github.com/users/xivanalysis/followers","following_url":"https://api.github.com/users/xivanalysis/following{/other_user}","gists_url":"https://api.github.com/users/xivanalysis/gists{/gist_id}","starred_url":"https://api.github.com/users/xivanalysis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xivanalysis/subscriptions","organizations_url":"https://api.github.com/users/xivanalysis/orgs","repos_url":"https://api.github.com/users/xivanalysis/repos","events_url":"https://api.github.com/users/xivanalysis/events{/privacy}","received_events_url":"https://api.github.com/users/xivanalysis/received_events","type":"Organization","site_admin":false},"repo":{"id":132010919,"node_id":"MDEwOlJlcG9zaXRvcnkxMzIwMTA5MTk=","name":"xivanalysis","full_name":"xivanalysis/xivanalysis","owner":{"login":"xivanalysis","id":39235942,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM5MjM1OTQy","avatar_url":"https://avatars0.githubusercontent.com/u/39235942?v=4","gravatar_id":"","url":"https://api.github.com/users/xivanalysis","html_url":"https://github.com/xivanalysis","followers_url":"https://api.github.com/users/xivanalysis/followers","following_url":"https://api.github.com/users/xivanalysis/following{/other_user}","gists_url":"https://api.github.com/users/xivanalysis/gists{/gist_id}","starred_url":"https://api.github.com/users/xivanalysis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xivanalysis/subscriptions","organizations_url":"https://api.github.com/users/xivanalysis/orgs","repos_url":"https://api.github.com/users/xivanalysis/repos","events_url":"https://api.github.com/users/xivanalysis/events{/privacy}","received_events_url":"https://api.github.com/users/xivanalysis/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/xivanalysis/xivanalysis","description":"Automated performance analysis and suggestion platform for Final Fantasy XIV: Stormblood.","fork":false,"url":"https://api.github.com/repos/xivanalysis/xivanalysis","forks_url":"https://api.github.com/repos/xivanalysis/xivanalysis/forks","keys_url":"https://api.github.com/repos/xivanalysis/xivanalysis/keys{/key_id}","collaborators_url":"https://api.github.com/repos/xivanalysis/xivanalysis/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/xivanalysis/xivanalysis/teams","hooks_url":"https://api.github.com/repos/xivanalysis/xivanalysis/hooks","issue_events_url":"https://api.github.com/repos/xivanalysis/xivanalysis/issues/events{/number}","events_url":"https://api.github.com/repos/xivanalysis/xivanalysis/events","assignees_url":"https://api.github.com/repos/xivanalysis/xivanalysis/assignees{/user}","branches_url":"https://api.github.com/repos/xivanalysis/xivanalysis/branches{/branch}","tags_url":"https://api.github.com/repos/xivanalysis/xivanalysis/tags","blobs_url":"https://api.github.com/repos/xivanalysis/xivanalysis/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/xivanalysis/xivanalysis/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/xivanalysis/xivanalysis/git/refs{/sha}","trees_url":"https://api.github.com/repos/xivanalysis/xivanalysis/git/trees{/sha}","statuses_url":"https://api.github.com/repos/xivanalysis/xivanalysis/statuses/{sha}","languages_url":"https://api.github.com/repos/xivanalysis/xivanalysis/languages","stargazers_url":"https://api.github.com/repos/xivanalysis/xivanalysis/stargazers","contributors_url":"https://api.github.com/repos/xivanalysis/xivanalysis/contributors","subscribers_url":"https://api.github.com/repos/xivanalysis/xivanalysis/subscribers","subscription_url":"https://api.github.com/repos/xivanalysis/xivanalysis/subscription","commits_url":"https://api.github.com/repos/xivanalysis/xivanalysis/commits{/sha}","git_commits_url":"https://api.github.com/repos/xivanalysis/xivanalysis/git/commits{/sha}","comments_url":"https://api.github.com/repos/xivanalysis/xivanalysis/comments{/number}","issue_comment_url":"https://api.github.com/repos/xivanalysis/xivanalysis/issues/comments{/number}","contents_url":"https://api.github.com/repos/xivanalysis/xivanalysis/contents/{+path}","compare_url":"https://api.github.com/repos/xivanalysis/xivanalysis/compare/{base}...{head}","merges_url":"https://api.github.com/repos/xivanalysis/xivanalysis/merges","archive_url":"https://api.github.com/repos/xivanalysis/xivanalysis/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/xivanalysis/xivanalysis/downloads","issues_url":"https://api.github.com/repos/xivanalysis/xivanalysis/issues{/number}","pulls_url":"https://api.github.com/repos/xivanalysis/xivanalysis/pulls{/number}","milestones_url":"https://api.github.com/repos/xivanalysis/xivanalysis/milestones{/number}","notifications_url":"https://api.github.com/repos/xivanalysis/xivanalysis/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/xivanalysis/xivanalysis/labels{/name}","releases_url":"https://api.github.com/repos/xivanalysis/xivanalysis/releases{/id}","deployments_url":"https://api.github.com/repos/xivanalysis/xivanalysis/deployments","created_at":"2018-05-03T14:56:32Z","updated_at":"2018-08-02T14:51:28Z","pushed_at":"2018-08-02T14:51:24Z","git_url":"git://github.com/xivanalysis/xivanalysis.git","ssh_url":"git@github.com:xivanalysis/xivanalysis.git","clone_url":"https://github.com/xivanalysis/xivanalysis.git","svn_url":"https://github.com/xivanalysis/xivanalysis","homepage":"https://xivanalysis.com","size":2721,"stargazers_count":22,"watchers_count":22,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":33,"mirror_url":null,"archived":false,"open_issues_count":19,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":33,"open_issues":19,"watchers":22,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/xivanalysis/xivanalysis/pulls/118"},"html":{"href":"https://github.com/xivanalysis/xivanalysis/pull/118"},"issue":{"href":"https://api.github.com/repos/xivanalysis/xivanalysis/issues/118"},"comments":{"href":"https://api.github.com/repos/xivanalysis/xivanalysis/issues/118/comments"},"review_comments":{"href":"https://api.github.com/repos/xivanalysis/xivanalysis/pulls/118/comments"},"review_comment":{"href":"https://api.github.com/repos/xivanalysis/xivanalysis/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/xivanalysis/xivanalysis/pulls/118/commits"},"statuses":{"href":"https://api.github.com/repos/xivanalysis/xivanalysis/statuses/ab26e37ed6d52e65d201b5fa418b51b06dafd319"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"Xslare"}}