Added and changed types

This commit is contained in:
aronmal 2023-01-12 11:40:29 +01:00
parent b2c72ebb0d
commit a282e35119
Signed by: aronmal
GPG key ID: 816B7707426FC612
2 changed files with 89 additions and 53 deletions

View file

@ -1,6 +1,6 @@
import { useCallback, useEffect, useMemo, useReducer, useState } from 'react'; import { useCallback, useEffect, useMemo, useReducer, useState } from 'react';
import { hitReducer, initlialLastLeftTile, initlialTarget, initlialTargetPreview, initlialTargetPreviewPos, isHit } from '../helpers'; import { hitReducer, initlialLastLeftTile, initlialTarget, initlialTargetPreview, initlialTargetPreviewPos, isHit } from '../helpers';
import { HitType, LastLeftTileType, TargetPreviewPosType, TargetPreviewType, TargetType } from '../interfaces'; import { HitType, LastLeftTileType, TargetListType, TargetModifierType, TargetPreviewPosType, TargetPreviewType, TargetType } from '../interfaces';
import Item from './Item'; import Item from './Item';
import Target from './Target'; import Target from './Target';
@ -13,20 +13,8 @@ function useGameEvent(count: number) {
const [targetPreviewPos, setTargetPreviewPos] = useState<TargetPreviewPosType>(initlialTargetPreviewPos); const [targetPreviewPos, setTargetPreviewPos] = useState<TargetPreviewPosType>(initlialTargetPreviewPos);
const [hits, DispatchHits] = useReducer(hitReducer, [] as HitType[]); const [hits, DispatchHits] = useReducer(hitReducer, [] as HitType[]);
const [mode, setMode] = useState<keyof typeof modes>('none') const [mode, setMode] = useState<keyof typeof modes>('none')
const [targetList, setTargetList] = useState<{ const [targetList, setTargetList] = useState<TargetListType[]>([])
show: boolean, const [targetPreviewList, setTargetPreviewList] = useState<TargetListType[]>([])
x: number,
y: number,
edges: string[],
imply: boolean
}[]>([])
const [targetPreviewList, setTargetPreviewList] = useState<{
show: boolean,
x: number,
y: number,
edges: string[],
imply: boolean
}[]>([])
const modes = useMemo(() => ({ const modes = useMemo(() => ({
none: { xEnable: true, yEnable: true, type: 'none' }, none: { xEnable: true, yEnable: true, type: 'none' },
@ -36,15 +24,24 @@ function useGameEvent(count: number) {
missle: { xEnable: false, yEnable: false, type: 'missle' } missle: { xEnable: false, yEnable: false, type: 'missle' }
}), []) }), [])
function modXY<T>(e: { show: boolean, x: number, y: number }, mod: { x: number, y: number, edges: string[] }) { function modXY<T>(e: TargetType, mod: TargetModifierType) {
return { show: e.show, x: e.x + (mod.x ?? 0), y: e.y + (mod.y ?? 0), edges: mod.edges } const { show, ...pos } = e
const { target, params } = mod
return {
target: {
show,
x: pos.x + (target.x ?? 0),
y: pos.y + (target.y ?? 0)
},
params
}
} }
const isSet = useCallback((x: number, y: number) => targetList.filter(target => x === target.x && y === target.y).length && target.show, [targetList, target]) const isSet = useCallback((x: number, y: number) => targetList.filter(({ target }) => x === target.x && y === target.y).length && target.show, [targetList, target])
const scopeGrid = useMemo(() => { const scopeGrid = useMemo(() => {
const { xEnable, yEnable, type } = modes[mode] const { xEnable, yEnable } = modes[mode]
const matrix: { x: number, y: number, edges: string[] }[][] = [] const matrix: TargetModifierType[][] = []
let y = 0 let y = 0
let x = 0 let x = 0
const yLength = (yEnable ? 2 : 0) const yLength = (yEnable ? 2 : 0)
@ -55,30 +52,34 @@ function useGameEvent(count: number) {
x = i2 + (xEnable ? -1 : 0); x = i2 + (xEnable ? -1 : 0);
(matrix[i] ??= [])[i2] = { (matrix[i] ??= [])[i2] = {
x, target: {
y, x,
edges: [ y,
i2 === 0 ? 'left' : '', },
i2 === xLength ? 'right' : '', params: {
i === 0 ? 'top' : '', edges: [
i === yLength ? 'bottom' : '', i2 === 0 ? 'left' : '',
] i2 === xLength ? 'right' : '',
i === 0 ? 'top' : '',
i === yLength ? 'bottom' : '',
],
imply: false
}
} }
} }
} }
const fields = matrix.reduce((prev, curr) => [...prev, ...curr], []) const fields = matrix.reduce((prev, curr) => [...prev, ...curr], [])
return { fields, type } return fields
}, [modes, mode]) }, [modes, mode])
const Targets = useCallback((targets: { show: boolean, x: number, y: number, edges: string[], imply: boolean }[], preview?: boolean) => { const Targets = useCallback((targets: TargetListType[], preview?: boolean) => {
const { type } = scopeGrid const { type } = modes[mode]
return targets.map(({ edges, imply, ...target }, i) => <Target key={i} props={{ type, preview, edges, imply }} target={target} />) return targets.map(({ target, params }, i) => <Target key={i} props={{ type, preview, ...params }} target={target} />)
}, [scopeGrid]) }, [modes, mode])
useEffect(() => { useEffect(() => {
const { fields } = scopeGrid const result = scopeGrid.map(e => modXY(target, e))
const result = fields.map(e => modXY(target, e)) .filter(({ target: { x, y } }) => {
.filter(({ x, y }) => {
const border = [ const border = [
x < 2, x < 2,
x > count, x > count,
@ -87,10 +88,10 @@ function useGameEvent(count: number) {
].reduce((prev, curr) => prev || curr, false) ].reduce((prev, curr) => prev || curr, false)
return !border return !border
}).map(field => { }).map(field => {
const { x, y } = field const { x, y } = field.target
if (isHit(hits, x, y).length) if (isHit(hits, x, y).length)
return { ...field, imply: true } return Object.assign(field, { imply: true })
return { ...field, imply: false } return field
}) })
setTargetList(e => { setTargetList(e => {
if (JSON.stringify(e) === JSON.stringify(result)) if (JSON.stringify(e) === JSON.stringify(result))
@ -100,9 +101,8 @@ function useGameEvent(count: number) {
}, [scopeGrid, target, count, hits]); }, [scopeGrid, target, count, hits]);
useEffect(() => { useEffect(() => {
const { fields } = scopeGrid const result = scopeGrid.map(e => modXY(targetPreview, e))
const result = fields.map(e => modXY(targetPreview, e)) .filter(({ target: { x, y } }) => {
.filter(({ x, y }) => {
const border = [ const border = [
x < 2, x < 2,
x > count + 1, x > count + 1,
@ -111,10 +111,10 @@ function useGameEvent(count: number) {
].reduce((prev, curr) => prev || curr, false) ].reduce((prev, curr) => prev || curr, false)
return !border return !border
}).map(field => { }).map(field => {
const { x, y } = field const { x, y } = field.target
if (isHit(hits, x, y).length || isSet(x, y)) if (isHit(hits, x, y).length || isSet(x, y))
return { ...field, imply: true } return Object.assign(field, { imply: true })
return { ...field, imply: false } return field
}) })
if (!targetPreviewPos.shouldShow) if (!targetPreviewPos.shouldShow)
return return

View file

@ -1,34 +1,70 @@
export interface LastLeftTileType { export type LastLeftTileType = {
x: number, x: number,
y: number y: number
} }
export interface TargetType { export type TargetType = {
show: boolean, show: boolean,
x: number, x: number,
y: number y: number
}; };
export interface TargetPreviewType { export type TargetPreviewType = {
show: boolean, show: boolean,
x: number, x: number,
y: number y: number
}; };
export interface TargetPreviewPosType { export type TargetPreviewPosType = {
shouldShow: boolean, shouldShow: boolean,
x: number, x: number,
y: number y: number
} }
export interface FieldType { export type TargetListType = {
target: {
show: boolean,
x: number,
y: number,
},
params: {
edges: string[],
imply: boolean
}
}
export type TargetModifierType = {
target: {
x: number,
y: number,
},
params: {
edges: string[],
imply: boolean
}
}
export type FieldType = {
field: string, field: string,
x: number, x: number,
y: number, y: number,
}; };
export interface HitType { export type HitType = {
hit: boolean, hit: boolean,
x: number, x: number,
y: number, y: number,
}; };
interface fireMissle { type: 'fireMissle', payload: { x: number, y: number, hit: boolean } }; type fireMissle = {
interface removeMissle { type: 'removeMissle', payload: { x: number, y: number, hit: boolean } }; type: 'fireMissle',
payload: {
x: number,
y: number,
hit: boolean
}
};
type removeMissle = {
type:
'removeMissle',
payload: {
x: number,
y: number,
hit: boolean
}
};
export type HitDispatchType = fireMissle | removeMissle; export type HitDispatchType = fireMissle | removeMissle;