import React, { useEffect,useState,useRef } from 'react'; import ReactTooltip from 'react-tooltip' //https://wwayne.github.io/react-tooltip/ import Modal from 'react-modal' import { DisplayIcon } from './DEFAULTS'; /** * 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 { 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
  • {p.setCurrentPage(p.page)}} className={(p.currentPage===p.page)?"selected":"unselected"}>{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 ExpandTooltip(p) { return <>{p.children} { const d = document.documentElement; left = Math.min(d.clientWidth - node.clientWidth, left); top = Math.min(d.clientHeight - node.clientHeight, top); left = Math.max(0, left); top = Math.max(0, top); return { top, left } } }>{p.tooltip} } function Class(p) { const CLASSES = p.GetData("class") const class_obj = CLASSES[p.name] return class_obj?<>{class_obj.name}:<> } function ClassSelector(p){ const CLASSES = p.GetData("class") const wrapperRef = useRef(null); useOutsideAlerter(wrapperRef,p.setEdit); return <>
    Class Selector
    {Object.keys(CLASSES).map((cl,i)=>{ return })}
    } function EditableClass(p){ const [edit,setEdit] = useState(false) return <>
    {setEdit(!edit)}}>
    {edit&&} } 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 [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 {(p.sortItems||p.filter)&&
    {p.sortItems&&}
    {p.filter&&{setFilter(f.currentTarget.value)}} />}
    }
      {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))} {p.children}
    } 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 [weaponSelectWindowOpen,setWeaponSelectWindowOpen] = useState(false) const [armorSelectWindowOpen,setArmorSelectWindowOpen] = useState(false) //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; const [selectedWeapon,setSelectedWeapon] = useState([]) const [selectedArmor1,setSelectedArmor1] = useState([]) const [selectedArmor2,setSelectedArmor2] = useState([]) const [selectedArmor3,setSelectedArmor3] = useState([]) const [armorSlotSelection,setArmorSlotSelection] = useState(1) 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]) //console.log(p.GetData("class",p.className,"icon")) return (<>

    Basic Information

    Author
    Build Name
    {setClassSelectWindowOpen(true)}} >Class
    Sub-Class

    Current Effects

    Effect Name

      { effectPage===1?<>
    • 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

    {selectedWeapon[WEAPON_WEAPON]?.name + " " + selectedWeapon[WEAPON_WEAPONTYPE]?.name}+40

    {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

    my things to do

    • Finish "Item Details" for Weapons/Armor
    • Grids. Grids everywhere.
    • Class Skill Window
    • PA Select Window
    • Food/Buffs Menu
    • Get all the fckn icons

    sig's to do list lol

    • Default icon for weapons/armor etc
    • make big picture small times 1000
    • sig make the page thingie i would do it but im big dum

    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 -
    ez pz { 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)}}>
    {item[WEAPON_EXISTENCE_DATA].special_name ?? item[WEAPON_WEAPON].name+" "+item[WEAPON_WEAPONTYPE].name}

    {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; } setArmorSelectWindowOpen(false)}}>
    {item.name}

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