import React, { useEffect,useState } 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; function EditBox(p) { useEffect(()=>{ var timer1 = setTimeout(()=>{ document.getElementById("editBoxInput").focus() document.getElementById("editBoxInput").select() },100) return () => { clearTimeout(timer1); }; },[p.edit]) return { 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)}}> } function EditBoxInput(p) { const [edit,setEdit] = useState(false) useEffect(()=>{ if (p.callback) { p.callback() } },[edit,p]) return <>
{setEdit(true)}}> {edit? :<>{p.prefix}{p.data}}
} function PageControlButton(p) { return
  • {if (p.onPageChange) {p.onPageChange(p.pageName)} p.setCurrentPage(p.page)}} className={(p.currentPage===p.page)?"selected":"unselected"}>{p.pageDisplay?p.pageDisplay[p.page-1]:p.pageName?p.pageName:p.page}
  • } function PageControl(p) { var pages = [] for (var i=0;i) } if (p.children!==undefined) { pages.push(
  • {p.children}
  • ) } //console.log(JSON.stringify(p.children)) return pages.length>0&& } function Class(p) { const CLASSES = p.GetData("class") const class_obj = CLASSES[p.name] return class_obj?<>{class_obj.name}:<> } function EditableClass(p){ return <>
    {p.setClassNameSetter(p.editClass);p.setClassSelectWindowOpen(true)}}>
    } function PopupWindow(p) { return {p.setModalOpen(false)}} shouldFocusAfterRender={true} shouldCloseOnOverlayClick={true} shouldCloseOnEsc={true} className="modal" overlayClassName="modalOverlay">

    {p.title}

    {p.showCloseButton&&
    {p.setModalOpen(false)}}>
    }
    {p.children}
    } function SelectorWindow(p) { const { onModalOpen } = 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]) useEffect(()=>{ if (onModalOpen) { onModalOpen(setTabPage) } },[onModalOpen]) return {(p.sortItems||p.filter)&&
    {p.sortItems&&}
    {p.filter?{setFilter(f.currentTarget.value)}} />:<>}
    }
      {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}
    } function LeftButton(p){ return } function RightButton(p){ return } function ClassSelectorWindow(p) { const [title,setTitle] = useState("Select Main Class") useEffect(()=>{ setTitle((p.editClass)?"Select Sub Class":"Select Main Class") },[p.editClass]) return { if (page==="Main Class") { p.setEditClass(0) } else { p.setEditClass(1) } }} onModalOpen={(pageSetter)=>{ pageSetter((p.editClass)?2:1) }} dataFunction={() => { var dat1 = p.GetData("class") return Object.keys(dat1) } } displayFunction={(key) => { return
  • {if (p.editClass===0){p.setClassName(key);p.setSubClassName(p.subClass===key?p.class:p.subClass)}else{p.setSubClassName(key);p.setClassName(p.class===key?p.subClass:p.class)}; p.setModalOpen(false) }}> {p.GetData("class", key, "name")}
  • }} /> } 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 ConvertCoordinate(x,y) { return (String.fromCharCode(Number(x)+'a'.charCodeAt(0)))+(y+1); } function SkillBox(p) { return
    {(p.skillPointData[p.page-1][p.boxId]?p.skillPointData[p.page-1][p.boxId]:0)+"/"+p.maxPoints}{typeof p.GetData("class_skill",p.skill[2],"name",true)==="string"&&p.GetData("class_skill",p.skill[2],"name",true)}
    { var temp=[...p.points] var tempData=[...p.skillPointData] while (tempData[p.page-1].length0) { temp[p.page-1]-=1 tempData[p.page-1][p.boxId]-=1 p.setPoints(temp) p.setSkillPointData(tempData) }}}/> { var temp=[...p.points] var tempData=[...p.skillPointData] while (tempData[p.page-1].length
    } function SkillTreeBoxes(p) { function GetHighestLevel(skill) { var skillInfo = Object.keys(p.GetData("class_skill_data")) var highestLevel = 0 for (var i=0;ihighestLevel) { highestLevel=skillData.level } } return highestLevel } function isLocked(skill) { return false } return <> {p.skillTreeSkillData&&p.skillTreeSkillData.map((skill,i)=>{ var splitter = skill.split(",") return splitter[0]!==""&&splitter[1]!==""&&splitter[2]!==""&&0?"skillActive":""} boxId={i} skillPointData={p.skillPointData} setSkillPointData={p.setSkillPointData} page={p.page} cl={p.cl} maxPoints={GetHighestLevel(splitter[2])} points={p.points} setPoints={p.setPoints} GetData={p.GetData} skill={splitter.map((numb)=>Number(numb))}/> })} } function SkillTreeContainer(p){ const { GetData } = p 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 [halflineheight,setHalfLineHeight] = useState(60) useEffect(()=>{ if (Object.keys(GetData("skill_tree_data")).length>1) { for (var skillTree of GetData("skill_tree_data")) { if (skillTree.class_id===GetData("class",p.cl,'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) setHalfLineHeight(skillTree.halflineheight) break; } } } },[p.cl,GetData]) return
    {}
    } function TestPanel(p) { const { GetData } = 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("Ranger") 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 [treePage,setTreePage] = useState(1) 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 [classNameSetter,setClassNameSetter] = useState(0) const [points,setPoints] = useState([]) const [skillPointData,setSkillPointData] = useState([]) 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(()=>{ var keys = Object.keys(GetData("class")) var pointsArr = [] var pointsDataArr = [] for (var i=0;i

    Basic Information

    Author
    Build Name
    {setClassSelectWindowOpen(true)}}>Class
    {setClassSkillTreeWindowOpen(true)}}>Sub-Class
    Battle Power {p.bp}
     
    HP {p.hp}
     
    PP {p.pp}
     
    Attack {p.statDisplayAtk}
     
    Defense {p.def}
     
    Weapon Up  +{(p.weaponUp1*100).toFixed(1)}%
     +{(p.weaponUp3*100).toFixed(1)}%
     +{(p.weaponUp2*100).toFixed(1)}%  
    Ailment Resist. {(p.burnResist*100).toFixed(1)}%
    {(p.shockResist*100).toFixed(1)}%
    {(p.panicResist*100).toFixed(1)}%
    {(p.stunResist*100).toFixed(1)}%
    {(p.freezeResist*100).toFixed(1)}%
    {(p.blindResist*100).toFixed(1)}%
    {(p.poisonResist*100).toFixed(1)}%
     
    Damage Resist. {(p.damageResist*100).toFixed(1)}%    

    Current Effects

    {effectPage===1?<>

    Effect Name

    • Food Boost Effect
      •  [Meat] Potency +10.0%
      •  [Crisp] Potency to Weak Point +5.0%
    • Shifta / Deband
      •  Potency +5.0%
      •  Damage Resistance +10.0%
    • Region Mag Boost
      •  Potency +5.0%
    :<> }

    Equip

    {setWeaponSelectWindowOpen(true)}} className="equipPaletteSlot">

    Weapons

    1
    {setArmorSlotSelection(1);setArmorSelectWindowOpen(true)}} className="equipPaletteSlot">

    Armor 1

    {setArmorSlotSelection(2);setArmorSelectWindowOpen(true)}} className="equipPaletteSlot">

    Armor 2

    {setArmorSlotSelection(3);setArmorSelectWindowOpen(true)}} className="equipPaletteSlot">

    Armor 3

    Equipped Weapon

    {GetSpecialWeaponName(selectedWeapon)}+40

    Edit Details {weaponPage === 1 ? <>
    RARITY
    ATTACK
    ELEMENT
    EQUIP CONDITIONS
    NOT TRADABLE
    POTENTIAL PRESET SKILL AUGMENT
    :weaponPage === 3 ?

    Ability Details

    • Potency +20%/
      Critical Hit Rage +15% for 30 seconds after a successful sidestep
      Dynamo Unit Lv.3
    • Potency +4%
      Fixa Attack Lv.3
    • PP +5
      Ranged Weapon Potency +2.0%
      Pettas Soul II
    • HP -10, Potency +1.5%,
      Potency Floor Increase +1.5%
      Damage Resistance -1.5%
      Alts Secreta II
    • HP +10
      Ranged Weapon Potency +2.0%
      Gigas Precision II
    • Ranged Weapon Potency +2.0%
      Precision III

    Stat Adjustment

    • Enhancement Lv. +35
    • Multi-Weapon -
    • Element -
    : <>hi }

    To Do List

    UI
    Grids. Grids everywhere.
    Finish "Item Details" for Weapons/Armor
    Class Skill Window
    PA Selector
    Food/Buffs Menu
    Get all the fckn icons
    Functionality
    Food/Buffs Menu
    PA Selector
    Data
    PA Selector

    Basic Stats

    Battle Power {p.bp}
     
    HP {p.hp}
     
    PP {p.pp}
     
    Attack {p.statDisplayAtk}
     
    Defense {p.def}
     
    Weapon Up  +{(p.weaponUp1*100).toFixed(1)}%
     +{(p.weaponUp3*100).toFixed(1)}%
     +{(p.weaponUp2*100).toFixed(1)}%  
    Ailment Resist. {(p.burnResist*100).toFixed(1)}%
    {(p.shockResist*100).toFixed(1)}%
    {(p.panicResist*100).toFixed(1)}%
    {(p.stunResist*100).toFixed(1)}%
    {(p.freezeResist*100).toFixed(1)}%
    {(p.blindResist*100).toFixed(1)}%
    {(p.poisonResist*100).toFixed(1)}%
     
    Damage Resist. {(p.damageResist*100).toFixed(1)}%    

    Damage Stats

    {statPage===1?<> :<> }
    Critical Hit Rate 5%
    Critical Multiplier 120%
    Midrange 126
    Critical 152
    Effective 127
    Critical Hit Rate -
    Critical Multiplier -
    Midrange -
    Critical -
    Effective -
    { setClassSkillTreeWindowOpen(false) }} shouldFocusAfterRender={true} shouldCloseOnOverlayClick={true} shouldCloseOnEsc={true} className="modal" overlayClassName="modalOverlay">

    Class Skill Tree

    { setClassSkillTreeWindowOpen(false) }}>
    cl)} pageDisplay={Object.keys(p.GetData("class")).map((cl)=><> {cl})} currentPage={treePage} setCurrentPage={setTreePage} />
    Your Skill Points{20-points[treePage-1]}
    SP{points[treePage-1]}
    ConfirmCancel
    { 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
  • {setSelectedWeapon(item);setWeaponSelectWindowOpen(false)}}>
    {GetSpecialWeaponName(item)}

    {item[WEAPON_WEAPON].atk} {item[WEAPON_POTENTIAL_TOOLTIP].map((pot,i)=><>{(i!==0)&&
    }{pot.name}: {pot.description?pot.description.split("\\n").map((it)=><>{it}
    ):<>})}}> {item[WEAPON_POTENTIAL].name}
  • }} /> { 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
  • { switch(armorSlotSelection) { case 1:setSelectedArmor1(item);break; case 2:setSelectedArmor2(item);break; case 3:setSelectedArmor3(item);break; default:setSelectedArmor1(item) } setArmorSelectWindowOpen(false)}}>
    {item.name}

    {item.def}
  • }} /> ) } export default TestPanel;