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:"pot", 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:"atk", 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=>Up))}
    {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}
    Confirm
    Cancel
    }> {FOODLIST.map((key)=>)}
    } 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 [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 [foodPointData,setFoodPointData] = useState({}) 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]) //console.log(p.GetData("class",p.className,"icon")) return (<> {"Test - "+APP_TITLE+(BUILDID?" Build #"+BUILDID:"")}

    Basic Information

    Author
    Build Name
    {setClassSelectWindowOpen(true)}}>Class
    {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

    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)

    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 }

    To Do List

    UI
    Grids. Grids everywhere.
    Finish "Item Details" for Weapons/Armor
    Class Skill Window Mobile View
    Enemy Stats Box
    Food/Buffs Menu
    Get all the fckn icons
    Functionality
    Food/Buffs Menu
    Augments
    Save/Load Build
    fOrMuLaS
    Data
    Skill Trees
    Everything tbh

    Current Effects

    {effectPage===1?<>

    Effect Name

    • {setFoodMenuWindowOpen(true)}}>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%
    :<> }

    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]}
    Confirm
    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.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.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;