import React , { useEffect , useState , useRef } from 'react' ;
import Modal from 'react-modal'
import { DisplayIcon } from './DEFAULTS' ;
import { ExpandTooltip } from './components/ExpandTooltip' ;
import { SkillTree } from './skilltree/skillTree' ;
//Helper variables for Weapon selector with structure: [weapon_type,weapon,potential,potential_tooltip,weapon_existence_data]
const WEAPON _WEAPONTYPE = 0 ; const WEAPON _WEAPON = 1 ; const WEAPON _POTENTIAL = 2 ; const WEAPON _POTENTIAL _TOOLTIP = 3 ; const WEAPON _EXISTENCE _DATA = 4 ;
/ * *
* Hook that alerts clicks outside of the passed ref
* /
function useOutsideAlerter ( ref , setEdit ) {
useEffect ( ( ) => {
/ * *
* Alert if clicked on outside of element
* /
function handleClickOutside ( event ) {
if ( ref . current && ! ref . current . contains ( event . target ) ) {
setEdit ( false )
}
}
// Bind the event listener
document . addEventListener ( "mousedown" , handleClickOutside ) ;
return ( ) => {
// Unbind the event listener on clean up
document . removeEventListener ( "mousedown" , handleClickOutside ) ;
} ;
} , [ ref , setEdit ] ) ;
}
function EditBox ( p ) {
useEffect ( ( ) => {
var timer1 = setTimeout ( ( ) => {
document . getElementById ( "editBoxInput" ) . focus ( )
document . getElementById ( "editBoxInput" ) . select ( )
} , 100 )
return ( ) => {
clearTimeout ( timer1 ) ;
} ;
} , [ p . edit ] )
return < input id = "editBoxInput" type = { p . type } max = { p . type === "number" ? 20 : undefined } min = { p . type === "number" ? 1 : undefined } onKeyDown = { ( e ) => {
if ( e . key === "Enter" ) { p . setEdit ( false ) }
else if ( e . key === "Escape" ) { p . setEdit ( false ) }
} } maxLength = { p . maxlength ? p . maxlength : 20 } onBlur = { ( ) => { p . setEdit ( false ) } } value = { p . value } onChange = { ( f ) => { f . currentTarget . value . length > 0 ? p . setName ( f . currentTarget . value ) : p . setName ( p . originalName ) } } >
< / i n p u t >
}
function EditBoxInput ( p ) {
const [ edit , setEdit ] = useState ( false )
useEffect ( ( ) => {
if ( p . callback ) {
p . callback ( )
}
} , [ edit , p ] )
return < >
< div className = { edit ? "editBoxActive" : "editBox" } onClick = { ( f ) => { setEdit ( true ) } } >
{ edit ?
< EditBox edit = { edit } maxlength = { p . maxlength } type = { p . type } setEdit = { setEdit } originalName = { p . data } setName = { p . setData } value = { p . data } / >
: < > { p . prefix } { p . data } < / > }
< / d i v >
< / >
}
function PageControlButton ( p ) {
return < li onClick = { ( ) => { p . setCurrentPage ( p . page ) } } className = { ( p . currentPage === p . page ) ? "selected" : "unselected" } > { p . pageName ? p . pageName : p . page } < / l i >
}
function PageControl ( p ) {
var pages = [ ]
for ( var i = 0 ; i < p . pages ; i ++ ) {
pages . push ( < PageControlButton pageName = { p . pageNames ? p . pageNames [ i ] : undefined } currentPage = { p . currentPage } setCurrentPage = { p . setCurrentPage } page = { i + 1 } / > )
}
if ( p . children !== undefined ) {
pages . push ( < li className = "pageControlDetails" > { p . children } < / l i > )
}
//console.log(JSON.stringify(p.children))
return pages . length > 0 && < ul className = "boxmenu" >
{ pages . map ( ( page , i ) => { return < React . Fragment key = { i } > { page } < / R e a c t . F r a g m e n t > } ) }
< / u l >
}
function Class ( p ) {
const CLASSES = p . GetData ( "class" )
const class _obj = CLASSES [ p . name ]
return class _obj ? < > < img alt = "" src = { process . env . PUBLIC _URL + class _obj . icon } / > { class _obj . name } < />:<></ >
}
function ClassSelector ( p ) {
const CLASSES = p . GetData ( "class" )
const wrapperRef = useRef ( null ) ;
useOutsideAlerter ( wrapperRef , p . setEdit ) ;
return < > < div className = "popup2" ref = { wrapperRef } >
Class Selector < hr / >
< div className = "popup" >
{ Object . keys ( CLASSES ) . map ( ( cl , i ) => {
return < button id = { i } className = "rounded" onClick = { ( ) => { p . setClassName ( cl ) ; p . setEdit ( false ) } } > < img alt = "" src = { process . env . PUBLIC _URL + CLASSES [ cl ] . icon } / > < br / > { CLASSES [ cl ] . name } < / b u t t o n >
} ) }
< / d i v >
< / d i v >
< / >
}
function ClassSelectorWindow ( p ) {
return < SelectorWindow title = { ( p . editClass ) ? "Select Sub Class" : "Select Main Class" } modalOpen = { p . modalOpen } setModalOpen = { p . setModalOpen } GetData = { p . GetData }
dataFunction = { ( ) => {
var dat1 = p . GetData ( "class" )
return Object . keys ( dat1 )
}
}
displayFunction = { ( key ) => {
return < li className = "classSelect" onClick = { ( ) => { if ( p . editClass === 0 ) { p . setClassName ( key ) } else { p . setSubClassName ( key ) } ; p . setModalOpen ( false ) } } > < img alt = "" src = { DisplayIcon ( p . GetData ( "class" , key , "icon" ) ) } / > { p . GetData ( "class" , key , "name" ) } < / l i >
} }
/ >
}
function EditableClass ( p ) {
return < > < div className = "editClass" onClick = { ( ) => { p . setClassNameSetter ( p . editClass ) ; p . setClassSelectWindowOpen ( true ) } } > < Class GetData = { p . GetData } name = { p . name } / >
< / d i v >
< / >
}
function PopupWindow ( p ) {
return < Modal isOpen = { p . modalOpen } onRequestClose = { ( ) => { p . setModalOpen ( false ) } } shouldFocusAfterRender = { true } shouldCloseOnOverlayClick = { true } shouldCloseOnEsc = { true } className = "modal" overlayClassName = "modalOverlay" >
< div className = "box boxModal" >
< div className = "boxTitleBar" >
< h1 > { p . title } < / h 1 >
{ p . showCloseButton && < div className = "boxExit" onClick = { ( ) => { p . setModalOpen ( false ) } } > < / d i v > }
< / d i v >
< PageControl pages = { p . pageNames ? p . pageNames . length : 0 } pageNames = { p . pageNames } currentPage = { p . page } setCurrentPage = { p . setPage } / >
{ p . children }
< / d i v >
< / M o d a l >
}
function SelectorWindow ( p ) {
const [ itemList , setItemList ] = useState ( [ ] )
const [ tabPage , setTabPage ] = useState ( 1 )
const [ sortSelector , setSortSelector ] = useState ( p . sortItems ? p . sortItems [ 0 ] : "" )
const [ filter , setFilter ] = useState ( "" )
useEffect ( ( ) => {
if ( p . dataFunction ) {
setItemList ( p . dataFunction ( ) )
}
} , [ p ] )
return < PopupWindow page = { tabPage } setPage = { setTabPage } modalOpen = { p . modalOpen } setModalOpen = { p . setModalOpen } showCloseButton = { true } title = { p . title }
pageNames = { p . pageNames }
filter = { true }
>
{ ( p . sortItems || p . filter ) && < div className = "itemBar" >
< div className = "itemBarSort" >
{ p . sortItems && < select className = "itemBarForm" value = { sortSelector } onChange = { ( f ) => { setSortSelector ( f . currentTarget . value ) } } >
{ p . sortItems . map ( ( item ) => < option value = { item } > { item } < / o p t i o n > ) }
< / s e l e c t > }
< / d i v >
< div className = "itemBarFilter" >
{ p . filter ? < input className = "itemBarForm" type = "text" placeholder = "Filter" value = { filter } onChange = { ( f ) => { setFilter ( f . currentTarget . value ) } } / > : < > < / > }
< / d i v >
< / d i v >
}
< div className = "modalItemListContainer customScrollbar" >
< ul className = "itemlist" >
{ p . filter ? itemList . filter ( ( item ) => p . filterFunction ( tabPage , item ) ) . filter ( ( item ) => p . searchFieldFunction ( filter , item ) ) . sort ( ( a , b ) => p . sortOrderFunction ( sortSelector , a , b ) ) . map ( ( item ) => p . displayFunction ( item ) ) : itemList . map ( ( item ) => p . displayFunction ( item ) ) }
{ p . children }
< / u l >
< / d i v >
< / P o p u p W i n d o w >
}
function GetSpecialWeaponName ( item ) {
return item [ WEAPON _EXISTENCE _DATA ] !== undefined ? ( item [ WEAPON _EXISTENCE _DATA ] . special _name ? . length > 0 ) ? item [ WEAPON _EXISTENCE _DATA ] . special _name : ( item [ WEAPON _WEAPON ] . name + " " + item [ WEAPON _WEAPONTYPE ] . name ) : ""
}
function TestPanel ( p ) {
const [ bpGraphMax , setbpGraphMax ] = useState ( 1000 )
const [ hpGraphMax , sethpGraphMax ] = useState ( 1000 )
const [ ppGraphMax , setppGraphMax ] = useState ( 1000 )
const [ atkGraphMax , setatkGraphMax ] = useState ( 1000 )
const [ defGraphMax , setdefGraphMax ] = useState ( 1000 )
const [ author , setauthor ] = useState ( "Player" )
const [ buildName , setbuildName ] = useState ( "Character" )
const [ className , setClassName ] = useState ( "Hunter" )
const [ subclassName , setSubClassName ] = useState ( "Force" )
const [ level , setLevel ] = useState ( 20 )
const [ secondaryLevel , setsecondaryLevel ] = useState ( 20 )
const [ effectPage , setEffectPage ] = useState ( 1 )
const [ weaponPage , setWeaponPage ] = useState ( 1 )
const [ statPage , setStatPage ] = useState ( 1 )
const [ classSelectWindowOpen , setClassSelectWindowOpen ] = useState ( false )
const [ classSkillTreeWindowOpen , setClassSkillTreeWindowOpen ] = useState ( false )
const [ weaponSelectWindowOpen , setWeaponSelectWindowOpen ] = useState ( false )
const [ armorSelectWindowOpen , setArmorSelectWindowOpen ] = useState ( false )
const [ selectedWeapon , setSelectedWeapon ] = useState ( [ ] )
const [ selectedArmor1 , setSelectedArmor1 ] = useState ( [ ] )
const [ selectedArmor2 , setSelectedArmor2 ] = useState ( [ ] )
const [ selectedArmor3 , setSelectedArmor3 ] = useState ( [ ] )
const [ armorSlotSelection , setArmorSlotSelection ] = useState ( 1 )
const [ skillTreeClass , setSkillTreeClass ] = useState ( Object . keys ( p . GetData ( "class" , '' , '' , true ) ) [ 0 ] )
const [ skillTreeData , setSkillTreeData ] = useState ( [ ] )
const [ skillTreeSkillData , setSkillTreeSkillData ] = useState ( [ ] )
const [ skillTreeLineColor , setSkillTreeLineColor ] = useState ( "" )
const [ skillTreeLineWidth , setSkillTreeLineWidth ] = useState ( 3 )
const [ skillTreeDimensionX , setSkillTreeDimensionX ] = useState ( 6 )
const [ skillTreeDimensionY , setSkillTreeDimensionY ] = useState ( 6 )
const [ skillTreeGridSizeX , setSkillTreeGridSizeX ] = useState ( 171 )
const [ skillTreeGridSizeY , setSkillTreeGridSizeY ] = useState ( 148 )
const [ skillTreeGridPaddingX , setSkillTreeGridPaddingX ] = useState ( 10 )
const [ skillTreeGridPaddingY , setSkillTreeGridPaddingY ] = useState ( 48 )
const [ classNameSetter , setClassNameSetter ] = useState ( 0 )
function rarityCheck ( v ) {
return v !== undefined ? v . rarity !== undefined ? " r" + v . rarity : "" : ""
}
useEffect ( ( ) => {
if ( p . bp > 1000 ) {
setbpGraphMax ( 3000 )
sethpGraphMax ( 3000 )
setppGraphMax ( 3000 )
setatkGraphMax ( 3000 )
setdefGraphMax ( 3000 )
} else {
setbpGraphMax ( 1000 )
sethpGraphMax ( 1000 )
setppGraphMax ( 1000 )
setatkGraphMax ( 1000 )
setdefGraphMax ( 1000 )
}
} , [ p . bp ] )
useEffect ( ( ) => {
setSkillTreeClass ( p . GetData ( "class" , className , 'id' ) )
if ( Object . keys ( p . GetData ( "skill_tree_data" ) ) . length > 1 ) {
for ( var skillTree of p . GetData ( "skill_tree_data" ) ) {
if ( skillTree . class _id === p . GetData ( "class" , className , 'id' ) ) {
var data = skillTree . data . split ( "," )
var skillData = skillTree . skill _data . split ( ";" )
setSkillTreeData ( data )
setSkillTreeSkillData ( skillData )
setSkillTreeLineColor ( skillTree . line _color )
setSkillTreeLineWidth ( skillTree . line _width )
setSkillTreeDimensionX ( data [ 0 ] . length )
setSkillTreeDimensionY ( data . length )
setSkillTreeGridSizeX ( skillTree . gridsizex )
setSkillTreeGridSizeY ( skillTree . gridsizey )
setSkillTreeGridPaddingX ( skillTree . gridpaddingx )
setSkillTreeGridPaddingY ( skillTree . gridpaddingy )
break ;
}
}
}
} , [ className , p . GetData ] )
//console.log(p.GetData("class",p.className,"icon"))
return ( < >
< div className = "main" >
< div className = "containerA" >
< div className = "box basicInfoBox" >
< div className = "boxTitleBar" >
< h1 > Basic Information < / h 1 > < / d i v >
< table className = "basicInfoTable" >
< tbody >
< tr >
< td > Author < / t d >
< td colSpan = "2" > < EditBoxInput setData = { setauthor } data = { author } / > < / t d >
< / t r >
< tr >
< td > Build Name < / t d >
< td colSpan = "2" > < EditBoxInput setData = { setbuildName } data = { buildName } / > < / t d >
< / t r >
< tr >
< td > Class < / t d >
< td >
< EditableClass editClass = { 0 } setClassNameSetter = { setClassNameSetter } GetData = { p . GetData } setClassName = { setClassName } name = { className } setClassSelectWindowOpen = { setClassSelectWindowOpen } > < / E d i t a b l e C l a s s >
< / t d >
< td >
< span className = "ye" > < EditBoxInput prefix = "Lv." setData = { setLevel } data = { level } type = "number" / > < / s p a n >
< / t d >
< / t r >
< tr >
< td onClick = { ( ) => { setClassSkillTreeWindowOpen ( true ) } } > Sub - Class < / t d >
< td >
< EditableClass editClass = { 1 } setClassNameSetter = { setClassNameSetter } GetData = { p . GetData } setClassName = { setSubClassName } name = { subclassName } setClassSelectWindowOpen = { setClassSelectWindowOpen } > < / E d i t a b l e C l a s s >
< / t d >
< td >
< EditBoxInput prefix = "Lv." setData = { setsecondaryLevel } data = { secondaryLevel } type = "number" / >
< / t d >
< / t r >
< / t b o d y >
< / t a b l e >
< / d i v >
< div className = "box" >
< div className = "boxTitleBar" >
< h1 > Current Effects < / h 1 > < / d i v >
< PageControl pages = { 2 } currentPage = { effectPage } setCurrentPage = { setEffectPage } / >
< h3 > Effect Name < / h 3 >
< ul className = "infoBuffs" >
{
effectPage === 1 ? < > < li > Food Boost Effect
< ul >
< li > < img alt = "" src = "https://i.imgur.com/TQ8EBW2.png" / > & ensp ; [ Meat ] Potency + 10.0 % < / l i >
< li > < img alt = "" src = "https://i.imgur.com/TQ8EBW2.png" / > & ensp ; [ Crisp ] Potency to Weak Point + 5.0 % < / l i >
< / u l >
< / l i >
< li > Shifta / Deband
< ul >
< li > < img alt = "" src = "https://i.imgur.com/VIYYNIm.png" / > & ensp ; Potency + 5.0 % < / l i >
< li > < img alt = "" src = "https://i.imgur.com/VIYYNIm.png" / > & ensp ; Damage Resistance + 10.0 % < / l i >
< / u l >
< / l i >
< li > Region Mag Boost
< ul >
< li > < img alt = "" src = "https://i.imgur.com/N6M74Qr.png" / > & ensp ; Potency + 5.0 % < / l i >
< / u l >
< /li></ > : < > < / >
}
< / u l >
< / d i v >
< / d i v >
< div className = "containerB" >
< div className = "box" >
< div className = "boxTitleBar" >
< h1 > Equip < / h 1 > < / d i v >
< div className = "equipPalette" >
< div onClick = { ( ) => { setWeaponSelectWindowOpen ( true ) } } className = "equipPaletteSlot" > < h3 > Weapons < / h 3 > < d i v c l a s s N a m e = { " e q u i p P a l e t t e S l o t W r a p p e r " + r a r i t y C h e c k ( s e l e c t e d W e a p o n [ W E A P O N _ W E A P O N ] ) } > < s p a n > 1 < / s p a n > < i m g a l t = " " c l a s s N a m e = " r 4 " s r c = { D i s p l a y I c o n ( s e l e c t e d W e a p o n [ W E A P O N _ E X I S T E N C E _ D A T A ] ? . i c o n ) } / > < / d i v > < / d i v >
< div onClick = { ( ) => { setArmorSlotSelection ( 1 ) ; setArmorSelectWindowOpen ( true ) } } className = "equipPaletteSlot" > < h3 > Armor 1 < /h3><div className="equipPaletteSlotWrapper"><img alt="" className="r3" src={DisplayIcon(selectedArmor1.icon)} / > < / d i v > < / d i v >
< div onClick = { ( ) => { setArmorSlotSelection ( 2 ) ; setArmorSelectWindowOpen ( true ) } } className = "equipPaletteSlot" > < h3 > Armor 2 < /h3><div className="equipPaletteSlotWrapper"><img alt="" className="r3" src={DisplayIcon(selectedArmor2.icon)} / > < / d i v > < / d i v >
< div onClick = { ( ) => { setArmorSlotSelection ( 3 ) ; setArmorSelectWindowOpen ( true ) } } className = "equipPaletteSlot" > < h3 > Armor 3 < /h3><div className="equipPaletteSlotWrapper"><img alt="" className="r3" src={DisplayIcon(selectedArmor3.icon)} / > < / d i v > < / d i v >
< / d i v >
< / d i v >
< div className = "box" >
< div className = "boxTitleBar" >
< h1 > Equipped Weapon < / h 1 > < / d i v >
< h2 className = "rifle" > { GetSpecialWeaponName ( selectedWeapon ) } + 40 < / h 2 >
< PageControl pages = { 3 } currentPage = { weaponPage } setCurrentPage = { setWeaponPage } > Edit Details < / P a g e C o n t r o l >
{ weaponPage === 1 ?
< >
< div className = "itemDetailsGrid" >
< div className = { "itemDetailsIcon" + rarityCheck ( selectedWeapon [ WEAPON _WEAPON ] ) } > < img alt = "" src = { DisplayIcon ( selectedWeapon [ WEAPON _EXISTENCE _DATA ] ? . icon ) } / > < / d i v >
< div className = "itemDetailsProperties" >
RARITY < br / >
ATTACK < br / >
ELEMENT < br / >
EQUIP CONDITIONS < br / >
NOT TRADABLE
< / d i v >
< div className = "itemDetailsContent" >
POTENTIAL PRESET SKILL
AUGMENT
< / d i v >
< / d i v >
< / >
: weaponPage === 3 ?
< div className = "equipDetails" >
< div className = "equipAugs" >
< h3 > Ability Details < / h 3 >
< ul >
< li > < div className = "equipAugsExpand tooltip" > < img alt = "" src = "./icons/aug_plus.png" / > < span > Potency + 20 % /<br / > Critical Hit Rage + 15 % for 30 seconds after a successful sidestep < / s p a n > < / d i v > < s p a n c l a s s N a m e = " p o t " > D y n a m o U n i t L v . 3 < / s p a n > < / l i >
< li > < div className = "equipAugsExpand tooltip" > < img alt = "" src = "./icons/aug_plus.png" / > < span > Potency + 4 % < / s p a n > < / d i v > < s p a n c l a s s N a m e = " f i x a " > F i x a A t t a c k L v . 3 < / s p a n > < / l i >
< li > < div className = "equipAugsExpand tooltip" > < img alt = "" src = "./icons/aug_plus.png" / > < span > PP + 5 < br / > Ranged Weapon Potency + 2.0 % < / s p a n > < / d i v > < s p a n c l a s s N a m e = " a u g " > P e t t a s S o u l I I < / s p a n > < / l i >
< li > < div className = "equipAugsExpand tooltip" > < img alt = "" src = "./icons/aug_plus.png" / > < span > HP - 10 , Potency + 1.5 % , < br / > Potency Floor Increase + 1.5 % < br / > Damage Resistance - 1.5 % < / s p a n > < / d i v > < s p a n c l a s s N a m e = " a u g " > A l t s S e c r e t a I I < / s p a n > < / l i >
< li > < div className = "equipAugsExpand tooltip" > < img alt = "" src = "./icons/aug_plus.png" / > < span > HP + 10 < br / > Ranged Weapon Potency + 2.0 % < / s p a n > < / d i v > < s p a n c l a s s N a m e = " a u g " > G i g a s P r e c i s i o n I I < / s p a n > < / l i >
< li > < div className = "equipAugsExpand tooltip" > < img alt = "" src = "./icons/aug_plus.png" / > < span > Ranged Weapon Potency + 2.0 % < / s p a n > < / d i v > < s p a n c l a s s N a m e = " a u g " > P r e c i s i o n I I I < / s p a n > < / l i >
< li > < img alt = "" src = "./icons/aug_plus.png" / > < / l i >
< / u l >
< / d i v >
< div className = "pr" >
< h3 > Stat Adjustment < / h 3 >
< ul >
< li > Enhancement Lv . & emsp ; < span > + 35 < / s p a n > < / l i >
< li > Multi - Weapon & emsp ; < span > - < / s p a n > < / l i >
< li > Element & emsp ; < span > - < / s p a n > < / l i >
< / u l >
< / d i v >
< / d i v >
:
< > hi < / >
}
< / d i v >
< div className = "box" >
< div className = "boxTitleBar" >
< h1 > To Do List < / h 1 > < / d i v >
< ul className = "toDoList" >
< li > Finish "Item Details" for Weapons / Armor < / l i >
< li className = "half" > Class Skill Window < / l i >
< li > PA Select Window < / l i >
< li > Food / Buffs Menu < / l i >
< li className = "check" > Get all the fckn icons < / l i >
< / u l >
< / d i v >
< / d i v >
< div className = "containerC" >
< div className = "box" >
< div className = "boxTitleBar" >
< h1 > Basic Stats < / h 1 > < / d i v >
< table className = "statsInfo" >
< tbody >
< tr >
< td > Battle Power < / t d >
< td > { p . bp } < / t d >
< td colSpan = "2" > < div className = "barGraph" > < span className = "barOverlay" style = { { background : "linear-gradient(90deg,transparent 0% " + ( ( p . bp / bpGraphMax ) * 100 ) + "%,black " + ( ( p . bp / bpGraphMax ) * 100 ) + "%)" } } > & nbsp ; < / s p a n > < / d i v > < / t d >
< / t r >
< tr >
< td > HP < / t d >
< td > { p . hp } < / t d >
< td colSpan = "2" > < div className = "barGraph" > < span className = "barOverlay" style = { { background : "linear-gradient(90deg,transparent 0% " + ( ( p . hp / hpGraphMax ) * 100 ) + "%,black " + ( ( p . hp / hpGraphMax ) * 100 ) + "%)" } } > & nbsp ; < / s p a n > < / d i v > < / t d >
< / t r >
< tr >
< td > PP < / t d >
< td > { p . pp } < / t d >
< td colSpan = "2" > < div className = "barGraph" > < span className = "barOverlay" style = { { background : "linear-gradient(90deg,transparent 0% " + ( ( p . pp / ppGraphMax ) * 100 ) + "%,black " + ( ( p . pp / ppGraphMax ) * 100 ) + "%)" } } > & nbsp ; < / s p a n > < / d i v > < / t d >
< / t r >
< tr >
< td > Attack < / t d >
< td > { p . statDisplayAtk } < / t d >
< td colSpan = "2" > < div className = "barGraph" > < span className = "barOverlay" style = { { background : "linear-gradient(90deg,transparent 0% " + ( ( p . statDisplayAtk / atkGraphMax ) * 100 ) + "%,black " + ( ( p . statDisplayAtk / atkGraphMax ) * 100 ) + "%)" } } > & nbsp ; < / s p a n > < / d i v > < / t d >
< / t r >
< tr >
< td > Defense < / t d >
< td > { p . def } < / t d >
< td colSpan = "2" > < div className = "barGraph" > < span className = "barOverlay" style = { { background : "linear-gradient(90deg,transparent 0% " + ( ( p . def / defGraphMax ) * 100 ) + "%,black " + ( ( p . def / defGraphMax ) * 100 ) + "%)" } } > & nbsp ; < / s p a n > < / d i v > < / t d >
< / t r >
< tr >
< td > Weapon Up < / t d >
< td > < img alt = "" src = { process . env . PUBLIC _URL + "/icons/mel.png" } / > < span className = "ye" > & nbsp ; + { ( p . weaponUp1 * 100 ) . toFixed ( 1 ) } % < /span><br / >
< img alt = "" src = { process . env . PUBLIC _URL + "/icons/tec.png" } / > < span className = "ye" > & nbsp ; + { ( p . weaponUp3 * 100 ) . toFixed ( 1 ) } % < / s p a n > < / t d >
< td > < img alt = "" src = { process . env . PUBLIC _URL + "/icons/rng.png" } / > < span className = "ye" > & nbsp ; + { ( p . weaponUp2 * 100 ) . toFixed ( 1 ) } % < / s p a n > < / t d >
< td > & nbsp ; < / t d >
< / t r >
< tr >
< td > Ailment Resist . < / t d >
< td >
< img alt = "" src = { process . env . PUBLIC _URL + "/icons/status/burn.png" } / > { ( p . burnResist * 100 ) . toFixed ( 1 ) } % < br / >
< img alt = "" src = { process . env . PUBLIC _URL + "/icons/status/shock.png" } / > { ( p . shockResist * 100 ) . toFixed ( 1 ) } % < br / >
< img alt = "" src = { process . env . PUBLIC _URL + "/icons/status/panic.png" } / > { ( p . panicResist * 100 ) . toFixed ( 1 ) } % < br / >
< img alt = "" src = { process . env . PUBLIC _URL + "/icons/status/stun.png" } / > { ( p . stunResist * 100 ) . toFixed ( 1 ) } % < br / >
< / t d >
< td >
< img alt = "" src = { process . env . PUBLIC _URL + "/icons/status/freeze.png" } / > { ( p . freezeResist * 100 ) . toFixed ( 1 ) } % < br / >
< img alt = "" src = { process . env . PUBLIC _URL + "/icons/status/blind.png" } / > { ( p . blindResist * 100 ) . toFixed ( 1 ) } % < br / >
< img alt = "" src = { process . env . PUBLIC _URL + "/icons/status/poison.png" } / > { ( p . poisonResist * 100 ) . toFixed ( 1 ) } % < br / >
< / t d >
< td > & nbsp ; < / t d >
< / t r >
< tr >
< td > Damage Resist . < / t d >
< td > { ( p . damageResist * 100 ) . toFixed ( 1 ) } % < / t d >
< td > & nbsp ; < / t d >
< td > & nbsp ; < / t d >
< / t r >
< / t b o d y >
< / t a b l e >
< / d i v >
< div className = "box" >
< div className = "boxTitleBar" >
< h1 > Damage Stats < / h 1 > < / d i v >
< PageControl pages = { 3 } currentPage = { statPage } setCurrentPage = { setStatPage } / >
< table className = "basicInfo" >
< tbody >
{ statPage === 1 ? < >
< tr >
< td > Critical Hit Rate < / t d >
< td > 5 % < / t d >
< / t r >
< tr >
< td > Critical Multiplier < / t d >
< td > 120 % < / t d >
< / t r >
< tr >
< td > Midrange < / t d >
< td > 126 < / t d >
< / t r >
< tr >
< td > Critical < / t d >
< td > 152 < / t d >
< / t r >
< tr >
< td > Effective < / t d >
< td > < span className = "ye" > 127 < / s p a n > < / t d >
< / t r >
< / > : < >
< tr >
< td > Critical Hit Rate < / t d >
< td > - < / t d >
< / t r >
< tr >
< td > Critical Multiplier < / t d >
< td > - < / t d >
< / t r >
< tr >
< td > Midrange < / t d >
< td > - < / t d >
< / t r >
< tr >
< td > Critical < / t d >
< td > - < / t d >
< / t r >
< tr >
< td > Effective < / t d >
< td > < span className = "ye" > - < / s p a n > < / t d >
< / t r >
< / >
}
< / t b o d y >
< / t a b l e >
< / d i v >
< / d i v >
< / d i v >
< ClassSelectorWindow setClassName = { setClassName } editClass = { classNameSetter } setSubClassName = { setSubClassName } modalOpen = { classSelectWindowOpen } setModalOpen = { setClassSelectWindowOpen } GetData = { p . GetData } / >
< Modal isOpen = { classSkillTreeWindowOpen } onRequestClose = { ( ) => { setClassSkillTreeWindowOpen ( false ) } } shouldFocusAfterRender = { true } shouldCloseOnOverlayClick = { true } shouldCloseOnEsc = { true } className = "modalSkillTree" overlayClassName = "modalOverlaySkillTree" >
< div className = "box treeSelectBox" >
< div className = "boxTitleBar" >
< h1 > Class Skill Tree < / h 1 >
< div className = "boxExit" onClick = { ( ) => { setClassSkillTreeWindowOpen ( false ) } } > < / d i v >
< / d i v >
< div className = "treeListContainer customScrollbar" >
< ul className = "treeList" >
{ Object . keys ( p . GetData ( "class" ) ) . map ( ( cl ) => < li className = { className === cl ? "treeListMain" : subclassName === cl ? "treeListSub" : "" } > < img alt = "" src = { p . GetData ( "class" ) [ cl ] . icon } / > { cl } < / l i > ) }
< / u l >
< / d i v >
< / d i v >
< div className = "box skillTreeBox" >
< div className = "boxTitleBar" >
< h1 > Ranger01 < / h 1 >
< div className = "boxExit" onClick = { ( ) => { setClassSkillTreeWindowOpen ( false ) } } > < / d i v >
< / d i v >
< div className = "skillTreeContainer customScrollbar" >
< div style = { { position : "relative" } } >
{ < SkillTree style = { { position : "absolute" } } strokeStyle = { skillTreeLineColor } lineWidth = { skillTreeLineWidth } lineDash = { [ ] }
gridDimensionsX = { skillTreeDimensionX } gridDimensionsY = { skillTreeDimensionY } gridSizeX = { skillTreeGridSizeX } gridSizeY = { skillTreeGridSizeY } gridPaddingX = { skillTreeGridPaddingX } gridPaddingY = { skillTreeGridPaddingY }
skillLines = { skillTreeData }
/ > }
< div className = "skillTreeGrid" >
< div className = "skillActive" style = { { gridArea : "a1" } } > < img className = "skillIcon" alt = "" src = "./icons/class_skills/ra/Blight_Rounds.png" / > < span className = "skillAllocated" > 1 / 5 < / s p a n > < e m c l a s s N a m e = " s k i l l N a m e " > B l i g h t R o u n d s < / e m > < / d i v >
< div className = "skillMaxed" style = { { gridArea : "a2" } } > < span className = "skillTreeReqUnlock" > & nbsp ; < / s p a n > < i m g c l a s s N a m e = " s k i l l I c o n " a l t = " " s r c = " . / i c o n s / c l a s s _ s k i l l s / r a / B l i g h t _ R o u n d s _ R e i n f o r c e . p n g " / > < s p a n c l a s s N a m e = " s k i l l A l l o c a t e d " > 1 / 1 < / s p a n > < e m c l a s s N a m e = " s k i l l N a m e " > B l i g h t R o u n d s R e i n f o r c e < / e m > < / d i v >
< div style = { { gridArea : "b1" } } > < img className = "skillIcon" alt = "" src = "./icons/class_skills/ra/Bad_Condition_Ward.png" / > < span className = "skillAllocated" > 0 / 10 < / s p a n > < e m c l a s s N a m e = " s k i l l N a m e " > B a d C o n d i t i o n W a r d < / e m > < / d i v >
< div style = { { gridArea : "b2" } } > < img className = "skillIcon" alt = "" src = "./icons/class_skills/ra/Spread_Shot.png" / > < span className = "skillAllocated" > 0 / 1 < / s p a n > < e m c l a s s N a m e = " s k i l l N a m e " > S p r e a d S h o t < / e m > < / d i v >
< div className = "skillLocked" style = { { gridArea : "b3" } } > < span className = "skillTreeReqLock" > & nbsp ; < / s p a n > < i m g c l a s s N a m e = " s k i l l I c o n " a l t = " " s r c = " . / i c o n s / c l a s s _ s k i l l s / r a / S p r e a d _ S h o t _ Q u i c k _ G e t a w a y . p n g " / > < s p a n c l a s s N a m e = " s k i l l A l l o c a t e d " > 0 / 1 < / s p a n > < e m c l a s s N a m e = " s k i l l N a m e " > S p r e a d S h o t Q u i c k G e t a w a y < / e m > < / d i v >
< div style = { { gridArea : "c1" } } > < img className = "skillIcon" alt = "" src = "./icons/class_skills/ra/Bad_Condition_Reduction.png" / > < span className = "skillAllocated" > 0 / 10 < / s p a n > < e m c l a s s N a m e = " s k i l l N a m e " > B a d C o n d i t i o n R e d u c t i o n < / e m > < / d i v >
< div style = { { gridArea : "c2" } } > < img className = "skillIcon" alt = "" src = "./icons/class_skills/ra/Rifle_Grenadier.png" / > < span className = "skillAllocated" > 0 / 1 < / s p a n > < e m c l a s s N a m e = " s k i l l N a m e " > R i f l e G r e n a d i e r < / e m > < / d i v >
< div style = { { gridArea : "c3" } } > < img className = "skillIcon" alt = "" src = "./icons/class_skills/ra/Slide_Shot_Advance.png" / > < span className = "skillAllocated" > 0 / 1 < / s p a n > < e m c l a s s N a m e = " s k i l l N a m e " > S l i d e S h o t A d v a n c e < / e m > < / d i v >
< div style = { { gridArea : "d2" } } > < img className = "skillIcon" alt = "" src = "./icons/class_skills/ra/Sticky_Bomb_Quick_Reload.png" / > < span className = "skillAllocated" > 0 / 1 < / s p a n > < e m c l a s s N a m e = " s k i l l N a m e " > S t i c k y B o m b Q u i c k R e l o a d < / e m > < / d i v >
< div style = { { gridArea : "d3" } } > < img className = "skillIcon" alt = "" src = "./icons/class_skills/ra/Launcher_Charge_Grouping.png" / > < span className = "skillAllocated" > 0 / 1 < / s p a n > < e m c l a s s N a m e = " s k i l l N a m e " > L a u n c h e r C h a r g e G r o u p i n g < / e m > < / d i v >
< div style = { { gridArea : "e1" } } > < img className = "skillIcon" alt = "" src = "./icons/class_skills/ra/Slow_Landing_Attack-Ranger.png" / > < span className = "skillAllocated" > 0 / 1 < / s p a n > < e m c l a s s N a m e = " s k i l l N a m e " > S l o w L a n d i n g A t t a c k - R a n g e r < / e m > < / d i v >
< div style = { { gridArea : "f1" } } > < img className = "skillIcon" alt = "" src = "./icons/class_skills/ra/Slow_Landing_Charge-Ranger.png" / > < span className = "skillAllocated" > 0 / 1 < / s p a n > < e m c l a s s N a m e = " s k i l l N a m e " > S l o w L a n d i n g C h a r g e - R a n g e r < / e m > < / d i v >
< div style = { { gridArea : "a5" } } > < img className = "skillIcon" alt = "" src = "./icons/class_skills/ra/Slow_Landing_Charge-Ranger.png" / > < span className = "skillAllocated" > 0 / 1 < / s p a n > < e m c l a s s N a m e = " s k i l l N a m e " > S l o w L a n d i n g C h a r g e - R a n g e r < / e m > < / d i v >
< div style = { { gridArea : "a6" } } > < img className = "skillIcon" alt = "" src = "./icons/class_skills/ra/Slow_Landing_Charge-Ranger.png" / > < span className = "skillAllocated" > 0 / 1 < / s p a n > < e m c l a s s N a m e = " s k i l l N a m e " > S l o w L a n d i n g C h a r g e - R a n g e r < / e m > < / d i v >
< / d i v >
< / d i v >
< / d i v >
< div className = "skillPoints" > Your Skill Points & emsp ; & emsp ; 6 & emsp ; & emsp ; & emsp ; SP & emsp ; & emsp ; & emsp ; & emsp ; 0 < / d i v >
< div className = "skillConfirm" > < span > Confirm < / s p a n > < s p a n > C a n c e l < / s p a n > < / d i v >
< / d i v >
< / M o d a l >
< SelectorWindow title = "Weapon Selection" modalOpen = { weaponSelectWindowOpen } setModalOpen = { setWeaponSelectWindowOpen } GetData = { p . GetData }
pageNames = { [ "All" , "Rifle" , "Launcher" , "Rod" , "Talis" ] }
sortItems = { [ "Standard Sort" , "Rarity" , "Attack" , "Potency" ] }
filter = { true }
dataFunction = { ( ) => {
var dat1 = p . GetData ( "weapon_existence_data" )
return Array . isArray ( dat1 ) ? dat1 . map ( ( weapon _existence _data ) => {
var weapon _type = p . GetData ( "weapon_type" , weapon _existence _data . weapon _type _id , undefined , true )
var weapon = p . GetData ( "weapon" , weapon _existence _data . weapon _id , undefined , true )
var potential = p . GetData ( "potential" , weapon . potential _id , undefined , true )
var potential _all = p . GetData ( "potential_data" )
var potential _tooltip = [ ]
for ( var pot in potential _all ) {
if ( pot . includes ( potential . name ) ) {
potential _tooltip . push ( p . GetData ( "potential_data" , pot ) )
}
}
return [ weapon _type , weapon , potential , potential _tooltip , weapon _existence _data ]
} ) : [ ]
} }
filterFunction = { ( page , item ) => {
switch ( page ) {
case 2 : return item [ WEAPON _WEAPONTYPE ] . name === "Assault Rifle"
case 3 : return item [ WEAPON _WEAPONTYPE ] . name === "Launcher"
case 4 : return item [ WEAPON _WEAPONTYPE ] . name === "Rod"
case 5 : return item [ WEAPON _WEAPONTYPE ] . name === "Talis"
default : return true
}
} }
searchFieldFunction = { ( searchText , item ) => searchText . length > 0 ? ( item [ WEAPON _WEAPON ] . name . toLowerCase ( ) + " " + item [ WEAPON _WEAPONTYPE ] . name . toLowerCase ( ) ) . includes ( searchText . toLowerCase ( ) ) : true }
sortOrderFunction = { ( sort , itemA , itemB ) => {
switch ( sort ) {
case "Rarity" : return itemB [ 1 ] . rarity - itemA [ 1 ] . rarity
case "Attack" : return itemB [ 1 ] . atk - itemA [ 1 ] . atk
default : return 0
}
} }
displayFunction = { ( item ) => {
return < li className = { "itemwep r" + item [ WEAPON _WEAPON ] . rarity } onClick = { ( ) => { setSelectedWeapon ( item ) ; setWeaponSelectWindowOpen ( false ) } } > < div className = "itemWeaponWrapper" > < img className = "itemimg" alt = "" src = { DisplayIcon ( item [ WEAPON _EXISTENCE _DATA ] ? . icon ) } / > < em className = "rifle" > { GetSpecialWeaponName ( item ) } < / e m > < / d i v > < b r / > < s p a n c l a s s N a m e = " a t k " > { i t e m [ W E A P O N _ W E A P O N ] . a t k } < / s p a n > < E x p a n d T o o l t i p i d = { " m o u s e o v e r - t o o l t i p " + i t e m [ W E A P O N _ W E A P O N T Y P E ] . i d + " _ " + i t e m [ W E A P O N _ W E A P O N ] . i d + " _ " + i t e m [ W E A P O N _ P O T E N T I A L ] . i d + " _ " + i t e m [ W E A P O N _ P O T E N T I A L _ T O O L T I P ] . i d } t o o l t i p = { < > { i t e m [ W E A P O N _ P O T E N T I A L _ T O O L T I P ] . m a p ( ( p o t , i ) = > < > { ( i ! = = 0 ) & & < b r / > } { p o t . n a m e } : { p o t . d e s c r i p t i o n ? p o t . d e s c r i p t i o n . s p l i t ( " \ \ n " ) . m a p ( ( i t ) = > < > { i t } < b r / > < / > ) : < > < / > } < / > ) } < / > } >
< span className = "pot" > { item [ WEAPON _POTENTIAL ] . name } < / s p a n >
< / E x p a n d T o o l t i p > < / l i > } }
/ >
< SelectorWindow title = { "Armor Selection - Slot " + armorSlotSelection } modalOpen = { armorSelectWindowOpen } setModalOpen = { setArmorSelectWindowOpen } GetData = { p . GetData }
pageNames = { [ ] }
sortItems = { [ "Standard Sort" , "Rarity" , "HP" , "PP" , "Melee Potency" , "Range Potency" , "Tech Potency" ] }
filter = { true }
dataFunction = { ( ) => {
var dat1 = p . GetData ( "armor" )
return typeof dat1 === "object" && dat1 !== null ? Object . keys ( dat1 ) . map ( ( armor ) => {
return dat1 [ armor ]
} ) : [ ]
} }
filterFunction = { ( page , item ) => true }
searchFieldFunction = { ( searchText , item ) => searchText . length > 0 ? item . name . toLowerCase ( ) . includes ( searchText . toLowerCase ( ) ) : true }
sortOrderFunction = { ( sort , itemA , itemB ) => {
switch ( sort ) {
case "Rarity" : return itemB . rarity - itemA . rarity
case "HP" : return itemB . hp - itemA . hp
case "PP" : return itemB . pp - itemA . pp
case "Melee Potency" : return itemB . mel _dmg - itemA . mel _dmg
case "Range Potency" : return itemB . rng _dmg - itemA . rng _dmg
case "Tech Potency" : return itemB . tec _dmg - itemA . tec _dmg
default : return 0
}
} }
displayFunction = { ( item ) => {
return < li className = { "itemwep r" + item . rarity } onClick = { ( ) => {
switch ( armorSlotSelection ) {
case 1 : setSelectedArmor1 ( item ) ; break ;
case 2 : setSelectedArmor2 ( item ) ; break ;
case 3 : setSelectedArmor3 ( item ) ; break ;
default : setSelectedArmor1 ( item )
}
setArmorSelectWindowOpen ( false ) } } > < div className = "itemWeaponWrapper" > < img className = "itemimg" alt = "" src = { DisplayIcon ( item ? . icon ) } / > < em className = "rifle" > { item . name } < / e m > < / d i v > < b r / > < s p a n c l a s s N a m e = " a t k " > { i t e m . d e f } < / s p a n > < / l i > } }
/ >
< / >
)
}
export default TestPanel ;