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 ReactPlaceholder from 'react-placeholder';
import "react-placeholder/lib/reactPlaceholder.css";
import { useLocation,useHistory,useParams,matchPath } from 'react-router'
//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&&
{pages.map((page,i)=>{return {page}})}
}
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.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 FOODCOUNT = Object.keys(foodPointData).reduce((total,food)=>foodPointData[food]+total,0)
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 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(()=>{
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
}
setBUFFS(CalculateBuffs(foodPointData)??[])
},[foodPointData,GetData])
//console.log(p.GetData("class",p.className,"icon"))
function deepCopySkills(skillData) {
var newSkillObj = []
for (var data of skillData) {
newSkillObj.push({...data})
}
return newSkillObj
}
return (<>
{`${buildName} by ${author} - ${APP_TITLE}`}
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 Details
{weaponPage === 1 ?
<>
{setWeaponSelectWindowOpen(true)}}>
})
Rarity
Attack
282
Element
-
Equip Conditons
Lv.15 (Current Lv.20)
{setAugmentSelectWindowOpen(true)}}>
Edit
Soulspring Unit Lv.3
Fixa Attack Lv.3
>
: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
:
<>hi2>
}
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].name}
<>{item[WEAPON_POTENTIAL_TOOLTIP].map((pot,i)=>{(i!==0)&&
}{pot.name}: {pot.description?pot.description.split("\\n").map((it,ii)=>{it}
):})}>
}}
/>
{
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)}
Ability Details
Stat Adjustment
- Dynamo Unit Lv.3
- Fixa Attack Lv.3
- test
- test
- test
- test
>
)
}
export default TestPanel;