import {PencilFill} from 'react-bootstrap-icons' 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'; import axios from 'axios'; import Helmet from 'react-helmet' import { useLocation,useHistory,useParams,matchPath } from 'react-router' import { ArrowUpShort } from 'react-bootstrap-icons' //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 CLASSES!=="no data"?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,i)=>{p.displayFunction(item)}):itemList.map((item,i)=>{p.displayFunction(item)})} {p.children}
    {p.footer}
    } 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):<>Select Weapon } function ConvertCoordinate(x,y) { return (String.fromCharCode(Number(x)+'a'.charCodeAt(0)))+(y/2+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] if (!tempData[p.page-1][p.boxId]) { tempData[p.page-1][p.boxId]=0 } if (tempData[p.page-1][p.boxId]>0) { 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] if (!tempData[p.page-1][p.boxId]) { tempData[p.page-1][p.boxId]=0 } if (tempData[p.page-1][p.boxId]
    } 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={splitter[0]+"_"+splitter[1]} 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 FoodItem(p) { const {description,dmg_res,editors_choice, hp,hp_recovery,icon,id,name,popularity,potency, pp,pp_consumption,pp_recovery,weak_point_dmg,rarity, food_type} = p.item const {modifyPoints} = p const [points,setPoints] = useState(p.points) const boosts = [ { name:"Damage Resistance", icon:"", val:dmg_res }, { name:"Health", icon:"", val:hp }, { name:"Health Recovery", icon:"", val:hp_recovery }, { name:"Potency", icon:"", val:potency }, { name:"Damage Resistance", icon:"", val:dmg_res }, { name:"PP Boost", icon:"", val:pp }, { name:"PP Consumption Reduction", icon:"", val:pp_consumption }, { name:"PP Recovery", icon:"", val:pp_recovery }, { name:"Weak Point Damage", icon:"", val:weak_point_dmg }] useEffect(()=>{ setPoints(p.points) },[p.points]) return
    {e.stopPropagation();modifyPoints(name,1)}} className={`itemWrapper${points>0?"Active":""} r${rarity}`}>
    {name}
     
    {boosts.filter((val)=>val.val).map((val=>))}
    {e.stopPropagation();modifyPoints(name,-1)}}>- {points} {e.stopPropagation();modifyPoints(name,1)}}>+
    } function FoodPopupWindow(p) { const {GetData,foodPointData,setFoodPointData} = p const MAX_SELECTED=10; const [FOODLIST,setFOODLIST] = useState(Object.keys(GetData("food"))) const [FOODS,setFOODS] = useState(GetData("food")) const FOODCOUNT = Object.keys(foodPointData).reduce((total,food)=>foodPointData[food]+total,0) useEffect(()=>{ setFOODLIST(Object.keys(GetData("food"))) setFOODS(GetData("food")) },[GetData]) function modifyPoints(foodName,add) { var temp = {...foodPointData} var total = FOODCOUNT if (add+total<=10&&add+total>=0) { temp[foodName] = Math.min(Math.max((temp[foodName]??0)+add,0),MAX_SELECTED) setFoodPointData(temp) } } return
    Foods in Recipe
    {FOODCOUNT}
    {p.setFoodMenuWindowOpen(false)}}>Confirm
    {p.setFoodMenuWindowOpen(false);p.setFoodPointData(p.prevFoodPointData)}}>Cancel
    } sortItems={["Standard Sort","Alphabetical","Food Name","Food Type","Popularity"]} filter={true} dataFunction={()=>{ return Object.keys(GetData("food")).map((key)=>GetData("food")[key]) }} filterFunction={(page,item)=>item} searchFieldFunction={(searchText,item)=>searchText.length>0?item.name.trim().toLowerCase().includes(searchText.toLowerCase()):true} sortOrderFunction={(sort,itemA,itemB)=>{ switch (sort) { case "Standard Sort":return itemB.id-itemA.id case "Alphabetical":return itemA.name.localeCompare(itemB.name) case "Food Name":return itemA.name.substr(itemA.name.lastIndexOf(" ")).localeCompare(itemB.name.substr(itemB.name.lastIndexOf(" "))) case "Food Type":return itemA.food_type.localeCompare(itemB.food_type)!==0?itemA.food_type.localeCompare(itemB.food_type):itemA.name.substr(itemA.name.lastIndexOf(" ")).localeCompare(itemB.name.substr(itemB.name.lastIndexOf(" "))) case "Popularity":return itemB.popularity-itemA.popularity default:return 0 } }} displayFunction={(item)=>{ return }} >
    } function TestPanel(p) { let { BUILDID } = useParams() let history = useHistory(); let location = useLocation(); const { GetData,LOGGEDINUSER,LOGGEDINHASH,BACKENDURL,APP_TITLE } = 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 [foodMenuWindowOpen,setFoodMenuWindowOpen] = useState(false) 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 [augmentSelectWindowOpen,setAugmentSelectWindowOpen] = 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([]) const [prevSkillPointData,setPrevSkillPointData] = useState([]) const [prevPoints,setPrevPoints] = useState([]) const [foodPointData,setFoodPointData] = useState({}) const [prevFoodPointData,setPrevFoodPointData] = useState({}) const [BUFFS,setBUFFS] = useState({}) function CalculateBuffs(foodPointData) { const boost_prefixes = { pp_consumption:"Rich", pp_recovery:"Light", weak_point_dmg:"Crisp", hp_recovery:"Robust", } const boost_suffixes = { potency:"Meat", pp:"Fruit", dmg_res:"Vegetable", hp:"Seafood", } var categories= {} Object.keys(GetData("food_mult","0")).filter((key)=>key!=="id"&&key!=="amount").forEach((key)=>{categories[key]={count:0}}) Object.keys(foodPointData).map((key)=>{return {...GetData("food",key),amount:foodPointData[key]}}).forEach((item)=>{ for (var key of Object.keys(item)) { if (key in categories && item[key]) { categories[key].count+=item.amount } } }) var finalObj = {} Object.keys(categories).filter((key)=>categories[key].count>0).forEach((key)=>finalObj[key]={...categories[key],from:boost_prefixes[key]??boost_suffixes[key]}) return finalObj } function SaveData() { var saveObj = { level:level, secondaryLevel:secondaryLevel, weaponBaseName:selectedWeapon[WEAPON_WEAPON]?.name, weaponType:selectedWeapon[WEAPON_WEAPONTYPE]?.name, armor1Name:selectedArmor1?.name, armor2Name:selectedArmor2?.name, armor3Name:selectedArmor3?.name, points:points, skillPointData:skillPointData, foodPointData:foodPointData, } axios.post(BACKENDURL+"/submitBuild",{ id:BUILDID, username:LOGGEDINUSER, pass:LOGGEDINHASH, creator:author, build_name:buildName, class1:className, class2:subclassName, data:JSON.stringify(saveObj),}) .then((data)=>{ const match=matchPath(location.pathname,{ path:p.path, exact:true, strict:false }) history.push(match.path.replace("/:BUILDID","")+"/"+data.data.id) }) } 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{ if (BUILDID) { axios.get(BACKENDURL+"/getBuild?id="+BUILDID) .then((data)=>{ setAuthor(data.data.creator) setbuildName(data.data.build_name) setClassName(GetData("class",data.data.class1,"name",true)) setSubClassName(GetData("class",data.data.class2,"name",true)) var dat = JSON.parse(data.data.data) setLevel(dat.level) setsecondaryLevel(dat.secondaryLevel) setPoints(dat.points) setSkillPointData(dat.skillPointData) setFoodPointData(dat.foodPointData??{}) var dat1=p.GetData("weapon_existence_data") var weapon_type=GetData("weapon_type",dat.weaponType) var weapon=GetData("weapon",dat.weaponBaseName) var potential=GetData("potential",weapon.potential_id,undefined,true) var potential_all=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)) } } var existence_data = Array.isArray(dat1)?dat1.filter((weapon_existence_data)=>weapon_existence_data.weapon_type_id===weapon_type.id&&weapon_existence_data.weapon_id===weapon.id)[0]:undefined //console.log(JSON.stringify([weapon_type,weapon,potential,potential_tooltip,existence_data])) setSelectedWeapon([weapon_type,weapon,potential,potential_tooltip,existence_data]) setSelectedArmor1(GetData("armor",dat.armor1Name)) setSelectedArmor2(GetData("armor",dat.armor2Name)) setSelectedArmor3(GetData("armor",dat.armor3Name)) }) .catch((err)=>{ console.log(err.message) }) } },[BUILDID,GetData,BACKENDURL,p]) useEffect(()=>{ setBUFFS(CalculateBuffs(foodPointData)??[]) },[foodPointData]) //console.log(p.GetData("class",p.className,"icon")) function deepCopySkills(skillData) { var newSkillObj = [] for (var data of skillData) { newSkillObj.push({...data}) } return newSkillObj } return (<> {"Test - "+APP_TITLE+(BUILDID?" Build #"+BUILDID:"")}

    Basic Information

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

    Equip

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

    Weapons

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

    Armor 1

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

    Armor 2

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

    Armor 3

    Equipped Weapon

    {GetSpecialWeaponName(selectedWeapon)}

    Edit

    +40
    Edit Details {weaponPage === 1 ? <>
    {setWeaponSelectWindowOpen(true)}}>

    Edit

    Rarity
    -
    Attack
    282
    Element
    -
    Equip Conditons
    Lv.15 (Current Lv.20)
    {setAugmentSelectWindowOpen(true)}}>

    Edit

    Soulspring Unit Lv.3
    Fixa Attack Lv.3
    Augment
    Precision III
    :weaponPage === 2 ?
    Enhancement Lv.
    Damage Adj.
    Weapon Up
    Ailment Resist.
    Available Classes
    Multi-weapon
    40
    75.0% ~ 100%
    9.9%
    0.0%
    0.0%
    0.0%
    9.9%
    0.0%
    0.0%
    9.9%
    0.0%
    0.0%
    :weaponPage === 3 ?

    Ability Details

    Stat Adjustment

    • Dynamo Unit Lv.3
    • Fixa Attack Lv.3
    • test
    • test
    • test
    • test
    HP +99
    PP +9
    : <>hi2 }

    Current Effects

    {effectPage===1?<>

    Effect Name

    • {setPrevFoodPointData({...foodPointData});setFoodMenuWindowOpen(true)}}>Food Boost Effect
        {Object.keys(BUFFS).length==0&&
      • Add Quick Food
      • } {Object.keys(BUFFS).map((key)=>
      •  [{BUFFS[key].from}] {key} +{BUFFS[key].count}
      • )}
    • Shifta / Deband
      •  Potency +5.0%
      •  Damage Resistance +10.0%
    • Region Mag Boost
      •  Potency +5.0%
    :<> }

    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]}
    {setClassSkillTreeWindowOpen(false)}} className="skillConfirm">
    Confirm
    {setPoints(prevPoints);setSkillPointData(prevSkillPointData);setClassSkillTreeWindowOpen(false)}}>Cancel
    { 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.trim().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,ii)=>{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)=>item.slot===armorSlotSelection} searchFieldFunction={(searchText,item)=>searchText.length>0?item.name.trim().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}
    }} /> {setAugmentSelectWindowOpen(false)}} shouldFocusAfterRender={true} shouldCloseOnOverlayClick={true} shouldCloseOnEsc={true} className="modal" overlayClassName="modalOverlayAugment">

    Equipped Weapon

    {GetSpecialWeaponName(selectedWeapon)}

    Edit

    +40

    Ability Details

    Stat Adjustment

    • Dynamo Unit Lv.3
    • Fixa Attack Lv.3
    • test
    • test
    • test
    • test
    HP +99
    PP +9

    hi

    test
    ) } export default TestPanel;