feat: Q+D tools
This commit is contained in:
parent
ce1b09cf5a
commit
fb4959916a
|
@ -117,6 +117,10 @@ export default class Engine {
|
||||||
qty: 10,
|
qty: 10,
|
||||||
source: '/assets/potion',
|
source: '/assets/potion',
|
||||||
},
|
},
|
||||||
|
4: {
|
||||||
|
qty: 1,
|
||||||
|
source: '/assets/hoe',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Health: {health: 100},
|
Health: {health: 100},
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import {Container} from '@pixi/react';
|
import {Container} from '@pixi/react';
|
||||||
import {useState} from 'react';
|
import {useEffect, useState} from 'react';
|
||||||
|
|
||||||
import {RESOLUTION} from '@/constants.js';
|
import {RESOLUTION} from '@/constants.js';
|
||||||
import {useEcs} from '@/context/ecs.js';
|
import {useEcs} from '@/context/ecs.js';
|
||||||
|
@ -10,14 +10,35 @@ import Entities from './entities.jsx';
|
||||||
import TargetingGhost from './targeting-ghost.jsx';
|
import TargetingGhost from './targeting-ghost.jsx';
|
||||||
import TileLayer from './tile-layer.jsx';
|
import TileLayer from './tile-layer.jsx';
|
||||||
|
|
||||||
|
function isEntityHoldingTool(entity) {
|
||||||
|
const {Inventory, Wielder} = entity;
|
||||||
|
const item = Inventory.item(Wielder.activeSlot + 1);
|
||||||
|
return !!item && [
|
||||||
|
'/assets/hoe',
|
||||||
|
].includes(item.source);
|
||||||
|
}
|
||||||
|
|
||||||
export default function EcsComponent() {
|
export default function EcsComponent() {
|
||||||
const [ecs] = useEcs();
|
const [ecs] = useEcs();
|
||||||
const [entities, setEntities] = useState({});
|
const [entities, setEntities] = useState({});
|
||||||
|
const [isTool, setIsTool] = useState(false);
|
||||||
const [mainEntity] = useMainEntity();
|
const [mainEntity] = useMainEntity();
|
||||||
|
useEffect(() => {
|
||||||
|
if (mainEntity) {
|
||||||
|
setIsTool(isEntityHoldingTool(ecs.get(mainEntity)));
|
||||||
|
}
|
||||||
|
}, [ecs, mainEntity]);
|
||||||
usePacket('Tick', (payload) => {
|
usePacket('Tick', (payload) => {
|
||||||
if (0 === Object.keys(payload.ecs).length) {
|
if (0 === Object.keys(payload.ecs).length) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (
|
||||||
|
mainEntity
|
||||||
|
&& payload.ecs[mainEntity]
|
||||||
|
&& (payload.ecs[mainEntity].Inventory || payload.ecs[mainEntity].Wielder)
|
||||||
|
) {
|
||||||
|
setIsTool(isEntityHoldingTool(ecs.get(mainEntity)));
|
||||||
|
}
|
||||||
const updatedEntities = {...entities};
|
const updatedEntities = {...entities};
|
||||||
for (const id in payload.ecs) {
|
for (const id in payload.ecs) {
|
||||||
if (false === payload.ecs[id]) {
|
if (false === payload.ecs[id]) {
|
||||||
|
@ -28,7 +49,7 @@ export default function EcsComponent() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
setEntities(updatedEntities);
|
setEntities(updatedEntities);
|
||||||
}, [entities, mainEntity]);
|
}, [ecs, entities, mainEntity]);
|
||||||
if (!mainEntity) {
|
if (!mainEntity) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -50,12 +71,14 @@ export default function EcsComponent() {
|
||||||
x={-cx}
|
x={-cx}
|
||||||
y={-cy}
|
y={-cy}
|
||||||
/>
|
/>
|
||||||
<TargetingGhost
|
{isTool && (
|
||||||
px={Position.x}
|
<TargetingGhost
|
||||||
py={Position.y}
|
px={Position.x}
|
||||||
cx={cx}
|
py={Position.y}
|
||||||
cy={cy}
|
cx={cx}
|
||||||
/>
|
cy={cy}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
</Container>
|
</Container>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,12 +6,19 @@ import Sprite from './sprite.jsx';
|
||||||
function Crosshair({x, y}) {
|
function Crosshair({x, y}) {
|
||||||
const draw = useCallback((g) => {
|
const draw = useCallback((g) => {
|
||||||
g.clear();
|
g.clear();
|
||||||
g.lineStyle(1, 0xffff00);
|
g.lineStyle(1, 0x000000);
|
||||||
g.moveTo(-5, 0);
|
g.moveTo(-5, 0);
|
||||||
g.lineTo(5, 0);
|
g.lineTo(5, 0);
|
||||||
g.moveTo(0, -5);
|
g.moveTo(0, -5);
|
||||||
g.lineTo(0, 5);
|
g.lineTo(0, 5);
|
||||||
g.lineStyle(1, 0xffffff);
|
g.lineStyle(0.5, 0xffffff);
|
||||||
|
g.moveTo(-5, 0);
|
||||||
|
g.lineTo(5, 0);
|
||||||
|
g.moveTo(0, -5);
|
||||||
|
g.lineTo(0, 5);
|
||||||
|
g.lineStyle(1, 0x000000);
|
||||||
|
g.drawCircle(0, 0, 3);
|
||||||
|
g.lineStyle(0.5, 0xffffff);
|
||||||
g.drawCircle(0, 0, 3);
|
g.drawCircle(0, 0, 3);
|
||||||
}, []);
|
}, []);
|
||||||
return (
|
return (
|
||||||
|
|
|
@ -7,18 +7,18 @@ import {Sprite} from '@pixi/sprite';
|
||||||
import {useEffect, useState} from 'react';
|
import {useEffect, useState} from 'react';
|
||||||
|
|
||||||
const tileSize = {x: 16, y: 16};
|
const tileSize = {x: 16, y: 16};
|
||||||
const radius = 11;
|
const radius = 17;
|
||||||
|
|
||||||
function makeFade(renderer) {
|
function makeFade(renderer) {
|
||||||
const fade = new Graphics();
|
const fade = new Graphics();
|
||||||
fade.beginFill(0xffffff);
|
fade.beginFill(0xffffff);
|
||||||
fade.alpha = 0.35;
|
fade.alpha = 0.4;
|
||||||
fade.drawCircle(
|
fade.drawCircle(
|
||||||
tileSize.x * (radius / 2),
|
tileSize.x * (radius / 2),
|
||||||
tileSize.y * (radius / 2),
|
tileSize.y * (radius / 2),
|
||||||
((tileSize.x + tileSize.y) / 2) * (radius * 0.35),
|
((tileSize.x + tileSize.y) / 2) * (radius * 0.35),
|
||||||
)
|
)
|
||||||
fade.filters = [new BlurFilter(((tileSize.x + tileSize.y) / 2) * 1.25)];
|
fade.filters = [new BlurFilter(((tileSize.x + tileSize.y) / 2) * 2.5)];
|
||||||
const renderTexture = RenderTexture.create({
|
const renderTexture = RenderTexture.create({
|
||||||
width: tileSize.x * radius,
|
width: tileSize.x * radius,
|
||||||
height: tileSize.y * radius,
|
height: tileSize.y * radius,
|
||||||
|
|
BIN
public/assets/hoe/icon.png
Normal file
BIN
public/assets/hoe/icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 247 B |
Binary file not shown.
Before Width: | Height: | Size: 3.2 KiB |
Loading…
Reference in New Issue
Block a user