import React, { useEffect, useState } from "react";
import { ComputedState, PlayerSaveState, PointNodeRef, ResourceType, WorldGenState } from "../data/GameState";
import { HashSet } from "../lib/util/data_structures/hash";
import { canAllocate } from "../game/Neighbors";
import { computeQuestEfficiencyPercent } from "../game/EfficiencyCalculator";
type Props = {
selectedPointNode?: PointNodeRef
allocatedPointNodeSet: HashSet<PointNodeRef>,
worldGen: WorldGenState,
playerSave: PlayerSaveState,
computed: ComputedState
}
export function DebugTab({
selectedPointNode,
playerSave,
worldGen,
computed
}: Props) {
const { allocatedPointNodeSet} = playerSave;
let [b64PlayerSaveString, setB64PlayerSaveString] = useState<string>('');
const [history, setHistory] = useState<PointNodeRef[]>([]);
useEffect(() => {
if (!selectedPointNode) return;
setHistory((history) => [...history, selectedPointNode]);
}, [selectedPointNode]);
if (!selectedPointNode) {
return (<> </>)
}
const pointNodeGen = worldGen.zLevels[selectedPointNode.z]!.chunks.get(selectedPointNode.chunkCoord)!.pointNodes.get(selectedPointNode.pointNodeCoord)!
const isAllocated = (allocatedPointNodeSet.contains(selectedPointNode));
const canBeAllocated: string = canAllocate(selectedPointNode, worldGen, allocatedPointNodeSet, playerSave.activeQuest !== undefined);
let nodeDescription: string = "Nothing (empty node)";
if (pointNodeGen.resourceType !== ResourceType.Nothing) {
nodeDescription = `${pointNodeGen.resourceAmount} ${pointNodeGen.resourceModifier} ${pointNodeGen.resourceType}`
}
return (
<>
<h3>Player resources</h3>
{JSON.stringify(computed.playerResourceAmounts)}
<h3>Export to string</h3>
<div>
<button onClick={() => {
// window.alert(btoa(JSON.stringify(playerSave)));
setB64PlayerSaveString(btoa(JSON.stringify(playerSave, undefined, 2)));
}}>
export to base64 {' '}
</button></div>
<div>{b64PlayerSaveString}</div>
<h3>Current Node</h3>
<div>
Z={selectedPointNode.z}
</div>
<div>
Chunk={selectedPointNode.chunkCoord.x},{selectedPointNode.chunkCoord.y}
</div>
<div>
Node={selectedPointNode.pointNodeCoord.x},{selectedPointNode.pointNodeCoord.y}
</div>
<br></br>
<div>Allocated? <br />{isAllocated ? "yes" : "no"} </div>
<br></br>
<div>Can be allocated? <br />{canBeAllocated} </div>
<br></br>
<div> Stats: </div>
<div> {nodeDescription} </div>
<h3>efficiency percent</h3>
{
computeQuestEfficiencyPercent(playerSave)
}
<h3>Quest progress history</h3>
{
playerSave.questProgressHistory.length === 0 ? (<> empty </>) :
playerSave.questProgressHistory.map((num, i) => {
return (
<div key={i}>
i={i}, quest progress={num}
</div>
)
})
}
<h3>Previous</h3>
{history
.slice(0, -1)
.map((pointNodeRef: PointNodeRef, i) => {
return (
<div key={i}>
<div>
Z={pointNodeRef.z} { }
Chunk={pointNodeRef.chunkCoord.x},{pointNodeRef.chunkCoord.y} { }
Node={pointNodeRef.pointNodeCoord.x},{pointNodeRef.pointNodeCoord.y}
</div>
</div>
);
})
.reverse()}
</>
);
}