mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-24 20:19:49 +02:00
feat: tracks
This commit is contained in:
1 parent
2b37e08f19
commit
1eaa276b76
12 files changed
+69
-35
No files matched your search
@@ -689,7 +689,7 @@ export async function definitions(production: boolean) {
|
|||||||
modelDefinitions[tankId].turrets[turretId].guns[gunId] = {
|
modelDefinitions[tankId].turrets[turretId].guns[gunId] = {
|
||||||
armor: gunArmor,
|
armor: gunArmor,
|
||||||
model: gunModel,
|
model: gunModel,
|
||||||
barrelThickness:
|
thickness:
|
||||||
turretGunEntry.armor.gun === undefined
|
turretGunEntry.armor.gun === undefined
|
||||||
? 0
|
? 0
|
||||||
: typeof turretGunEntry.armor.gun === 'number'
|
: typeof turretGunEntry.armor.gun === 'number'
|
||||||
|
|||||||
@@ -105,6 +105,7 @@ export function AntagonistBar() {
|
|||||||
mutateDuel((draft) => {
|
mutateDuel((draft) => {
|
||||||
draft.antagonist!.tank = tank;
|
draft.antagonist!.tank = tank;
|
||||||
draft.antagonist!.engine = tank.engines.at(-1)!;
|
draft.antagonist!.engine = tank.engines.at(-1)!;
|
||||||
|
draft.antagonist!.track = tank.tracks.at(-1)!;
|
||||||
draft.antagonist!.turret = tank.turrets.at(-1)!;
|
draft.antagonist!.turret = tank.turrets.at(-1)!;
|
||||||
draft.antagonist!.gun =
|
draft.antagonist!.gun =
|
||||||
draft.antagonist!.turret.guns.at(-1)!;
|
draft.antagonist!.turret.guns.at(-1)!;
|
||||||
|
|||||||
@@ -80,6 +80,28 @@ export function Modules() {
|
|||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
</Flex>
|
</Flex>
|
||||||
|
|
||||||
|
<Flex>
|
||||||
|
{protagonist.tank.tracks.map((track, index) => {
|
||||||
|
return (
|
||||||
|
<ModuleButton
|
||||||
|
key={track.id}
|
||||||
|
type="module"
|
||||||
|
module="chassis"
|
||||||
|
discriminator={TIER_ROMAN_NUMERALS[track.tier]}
|
||||||
|
selected={protagonist.engine.id === track.id}
|
||||||
|
first={index === 0}
|
||||||
|
last={index === protagonist.tank.engines.length - 1}
|
||||||
|
rowChild
|
||||||
|
onClick={() => {
|
||||||
|
mutateDuel((draft) => {
|
||||||
|
draft.protagonist!.track = track;
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</Flex>
|
||||||
</Flex>
|
</Flex>
|
||||||
</ConfigurationChildWrapper>
|
</ConfigurationChildWrapper>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -24,6 +24,8 @@ export function Controls() {
|
|||||||
const antagonist = useDuel((state) => state.antagonist!);
|
const antagonist = useDuel((state) => state.antagonist!);
|
||||||
const protagonistModelDefinition =
|
const protagonistModelDefinition =
|
||||||
awaitedModelDefinitions[protagonist.tank.id];
|
awaitedModelDefinitions[protagonist.tank.id];
|
||||||
|
const protagonistTrackModelDefinition =
|
||||||
|
awaitedModelDefinitions[protagonist.tank.id].tracks[protagonist.track.id];
|
||||||
const antagonistModelDefinition = awaitedModelDefinitions[antagonist.tank.id];
|
const antagonistModelDefinition = awaitedModelDefinitions[antagonist.tank.id];
|
||||||
const protagonistTurretModelDefinition =
|
const protagonistTurretModelDefinition =
|
||||||
protagonistModelDefinition.turrets[protagonist.turret.id];
|
protagonistModelDefinition.turrets[protagonist.turret.id];
|
||||||
@@ -32,9 +34,9 @@ export function Controls() {
|
|||||||
const protagonistGunModelDefinition =
|
const protagonistGunModelDefinition =
|
||||||
protagonistTurretModelDefinition.guns[protagonist.gun.id];
|
protagonistTurretModelDefinition.guns[protagonist.gun.id];
|
||||||
const protagonistHullOrigin = new Vector3(
|
const protagonistHullOrigin = new Vector3(
|
||||||
protagonistModelDefinition.hullOrigin[0],
|
protagonistTrackModelDefinition.origin[0],
|
||||||
protagonistModelDefinition.hullOrigin[1],
|
protagonistTrackModelDefinition.origin[1],
|
||||||
-protagonistModelDefinition.hullOrigin[2],
|
-protagonistTrackModelDefinition.origin[2],
|
||||||
);
|
);
|
||||||
const protagonistTurretOrigin = new Vector3(
|
const protagonistTurretOrigin = new Vector3(
|
||||||
protagonistModelDefinition.turretOrigin[0],
|
protagonistModelDefinition.turretOrigin[0],
|
||||||
@@ -47,7 +49,7 @@ export function Controls() {
|
|||||||
-protagonistTurretModelDefinition.gunOrigin[2],
|
-protagonistTurretModelDefinition.gunOrigin[2],
|
||||||
);
|
);
|
||||||
const antagonistGunHeight =
|
const antagonistGunHeight =
|
||||||
antagonistModelDefinition.hullOrigin[1] +
|
protagonistTrackModelDefinition.origin[1] +
|
||||||
antagonistModelDefinition.turretOrigin[1] +
|
antagonistModelDefinition.turretOrigin[1] +
|
||||||
antagonistTurretModelDefinition.gunOrigin[1];
|
antagonistTurretModelDefinition.gunOrigin[1];
|
||||||
|
|
||||||
|
|||||||
+9
-8
@@ -24,9 +24,9 @@ export function ArmorHighlighting() {
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const hullOrigin = new Vector3(
|
const hullOrigin = new Vector3(
|
||||||
tankModelDefinition.hullOrigin[0],
|
trackModelDefinition.origin[0],
|
||||||
tankModelDefinition.hullOrigin[1],
|
trackModelDefinition.origin[1],
|
||||||
-tankModelDefinition.hullOrigin[2],
|
-trackModelDefinition.origin[2],
|
||||||
).applyAxisAngle(I_HAT, Math.PI / 2);
|
).applyAxisAngle(I_HAT, Math.PI / 2);
|
||||||
const turretOrigin = new Vector3(
|
const turretOrigin = new Vector3(
|
||||||
tankModelDefinition.turretOrigin[0],
|
tankModelDefinition.turretOrigin[0],
|
||||||
@@ -103,13 +103,14 @@ export function ArmorHighlighting() {
|
|||||||
const armorGltf = useArmor(protagonist.tank.id);
|
const armorGltf = useArmor(protagonist.tank.id);
|
||||||
const armorNodes = Object.values(armorGltf.nodes);
|
const armorNodes = Object.values(armorGltf.nodes);
|
||||||
const tankModelDefinition = modelDefinitions[protagonist.tank.id];
|
const tankModelDefinition = modelDefinitions[protagonist.tank.id];
|
||||||
|
const trackModelDefinition = tankModelDefinition.tracks[protagonist.track.id];
|
||||||
const turretModelDefinition =
|
const turretModelDefinition =
|
||||||
tankModelDefinition.turrets[protagonist.turret.id];
|
tankModelDefinition.turrets[protagonist.turret.id];
|
||||||
const gunModelDefinition = turretModelDefinition.guns[protagonist.gun.id];
|
const gunModelDefinition = turretModelDefinition.guns[protagonist.gun.id];
|
||||||
const hullOrigin = new Vector3(
|
const hullOrigin = new Vector3(
|
||||||
tankModelDefinition.hullOrigin[0],
|
trackModelDefinition.origin[0],
|
||||||
tankModelDefinition.hullOrigin[1],
|
trackModelDefinition.origin[1],
|
||||||
-tankModelDefinition.hullOrigin[2],
|
-trackModelDefinition.origin[2],
|
||||||
);
|
);
|
||||||
const turretOrigin = new Vector3(
|
const turretOrigin = new Vector3(
|
||||||
tankModelDefinition.turretOrigin[0],
|
tankModelDefinition.turretOrigin[0],
|
||||||
@@ -122,8 +123,8 @@ export function ArmorHighlighting() {
|
|||||||
-turretModelDefinition.gunOrigin[2],
|
-turretModelDefinition.gunOrigin[2],
|
||||||
).applyAxisAngle(I_HAT, Math.PI / 2);
|
).applyAxisAngle(I_HAT, Math.PI / 2);
|
||||||
const maxThickness = Math.max(
|
const maxThickness = Math.max(
|
||||||
tankModelDefinition.trackThickness,
|
trackModelDefinition.thickness,
|
||||||
gunModelDefinition.barrelThickness,
|
gunModelDefinition.thickness,
|
||||||
...armorNodes
|
...armorNodes
|
||||||
.map((node) => {
|
.map((node) => {
|
||||||
const armorId = nameToArmorId(node.name);
|
const armorId = nameToArmorId(node.name);
|
||||||
|
|||||||
+12
-10
@@ -37,9 +37,9 @@ export const ExternalModuleMask = memo<ExternalModuleMaskProps>(
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const hullOrigin = new Vector3(
|
const hullOrigin = new Vector3(
|
||||||
tankModelDefinition.hullOrigin[0],
|
trackModelDefinition.origin[0],
|
||||||
tankModelDefinition.hullOrigin[1],
|
trackModelDefinition.origin[1],
|
||||||
-tankModelDefinition.hullOrigin[2],
|
-trackModelDefinition.origin[2],
|
||||||
).applyAxisAngle(I_HAT, Math.PI / 2);
|
).applyAxisAngle(I_HAT, Math.PI / 2);
|
||||||
const turretOrigin = new Vector3(
|
const turretOrigin = new Vector3(
|
||||||
tankModelDefinition.turretOrigin[0],
|
tankModelDefinition.turretOrigin[0],
|
||||||
@@ -127,12 +127,14 @@ export const ExternalModuleMask = memo<ExternalModuleMaskProps>(
|
|||||||
const armorNodes = Object.values(armorGltf.nodes);
|
const armorNodes = Object.values(armorGltf.nodes);
|
||||||
const modelNodes = Object.values(modelGltf.nodes);
|
const modelNodes = Object.values(modelGltf.nodes);
|
||||||
const tankModelDefinition = modelDefinitions[protagonist.tank.id];
|
const tankModelDefinition = modelDefinitions[protagonist.tank.id];
|
||||||
|
const trackModelDefinition =
|
||||||
|
tankModelDefinition.tracks[protagonist.track.id];
|
||||||
const turretModelDefinition =
|
const turretModelDefinition =
|
||||||
tankModelDefinition.turrets[protagonist.turret.id];
|
tankModelDefinition.turrets[protagonist.turret.id];
|
||||||
const gunModelDefinition = turretModelDefinition.guns[protagonist.gun.id];
|
const gunModelDefinition = turretModelDefinition.guns[protagonist.gun.id];
|
||||||
const maxThickness = Math.max(
|
const maxThickness = Math.max(
|
||||||
tankModelDefinition.trackThickness,
|
trackModelDefinition.thickness,
|
||||||
gunModelDefinition.barrelThickness,
|
gunModelDefinition.thickness,
|
||||||
...armorNodes
|
...armorNodes
|
||||||
.map((node) => {
|
.map((node) => {
|
||||||
const armorId = nameToArmorId(node.name);
|
const armorId = nameToArmorId(node.name);
|
||||||
@@ -141,9 +143,9 @@ export const ExternalModuleMask = memo<ExternalModuleMaskProps>(
|
|||||||
.filter(Boolean),
|
.filter(Boolean),
|
||||||
);
|
);
|
||||||
const hullOrigin = new Vector3(
|
const hullOrigin = new Vector3(
|
||||||
tankModelDefinition.hullOrigin[0],
|
trackModelDefinition.origin[0],
|
||||||
tankModelDefinition.hullOrigin[1],
|
trackModelDefinition.origin[1],
|
||||||
-tankModelDefinition.hullOrigin[2],
|
-trackModelDefinition.origin[2],
|
||||||
).applyAxisAngle(I_HAT, Math.PI / 2);
|
).applyAxisAngle(I_HAT, Math.PI / 2);
|
||||||
const turretOrigin = new Vector3(
|
const turretOrigin = new Vector3(
|
||||||
tankModelDefinition.turretOrigin[0],
|
tankModelDefinition.turretOrigin[0],
|
||||||
@@ -196,7 +198,7 @@ export const ExternalModuleMask = memo<ExternalModuleMaskProps>(
|
|||||||
<ArmorMeshExternalModuleMask
|
<ArmorMeshExternalModuleMask
|
||||||
ornamental={ornamental}
|
ornamental={ornamental}
|
||||||
maxThickness={maxThickness}
|
maxThickness={maxThickness}
|
||||||
thickness={tankModelDefinition.trackThickness}
|
thickness={trackModelDefinition.thickness}
|
||||||
key={node.uuid}
|
key={node.uuid}
|
||||||
geometry={(node as Mesh).geometry}
|
geometry={(node as Mesh).geometry}
|
||||||
/>
|
/>
|
||||||
@@ -267,7 +269,7 @@ export const ExternalModuleMask = memo<ExternalModuleMaskProps>(
|
|||||||
<ArmorMeshExternalModuleMask
|
<ArmorMeshExternalModuleMask
|
||||||
ornamental={ornamental}
|
ornamental={ornamental}
|
||||||
maxThickness={maxThickness}
|
maxThickness={maxThickness}
|
||||||
thickness={gunModelDefinition.barrelThickness}
|
thickness={gunModelDefinition.thickness}
|
||||||
key={node.uuid}
|
key={node.uuid}
|
||||||
geometry={(node as Mesh).geometry}
|
geometry={(node as Mesh).geometry}
|
||||||
/>
|
/>
|
||||||
|
|||||||
+10
-8
@@ -43,9 +43,9 @@ export const SpacedArmorDepth = memo<SpacedArmorDepthProps>(
|
|||||||
if (!modelDefinitions) return;
|
if (!modelDefinitions) return;
|
||||||
|
|
||||||
const hullOrigin = new Vector3(
|
const hullOrigin = new Vector3(
|
||||||
tankModelDefinition.hullOrigin[0],
|
trackModelDefinition.origin[0],
|
||||||
tankModelDefinition.hullOrigin[1],
|
trackModelDefinition.origin[1],
|
||||||
-tankModelDefinition.hullOrigin[2],
|
-trackModelDefinition.origin[2],
|
||||||
).applyAxisAngle(I_HAT, Math.PI / 2);
|
).applyAxisAngle(I_HAT, Math.PI / 2);
|
||||||
const turretOrigin = new Vector3(
|
const turretOrigin = new Vector3(
|
||||||
tankModelDefinition.turretOrigin[0],
|
tankModelDefinition.turretOrigin[0],
|
||||||
@@ -133,12 +133,14 @@ export const SpacedArmorDepth = memo<SpacedArmorDepthProps>(
|
|||||||
const armorNodes = Object.values(armorGltf.nodes);
|
const armorNodes = Object.values(armorGltf.nodes);
|
||||||
const modelNodes = Object.values(modelGltf.nodes);
|
const modelNodes = Object.values(modelGltf.nodes);
|
||||||
const tankModelDefinition = modelDefinitions[protagonist.tank.id];
|
const tankModelDefinition = modelDefinitions[protagonist.tank.id];
|
||||||
|
const trackModelDefinition =
|
||||||
|
tankModelDefinition.tracks[protagonist.track.id];
|
||||||
const turretModelDefinition =
|
const turretModelDefinition =
|
||||||
tankModelDefinition.turrets[protagonist.turret.id];
|
tankModelDefinition.turrets[protagonist.turret.id];
|
||||||
const gunModelDefinition = turretModelDefinition.guns[protagonist.gun.id];
|
const gunModelDefinition = turretModelDefinition.guns[protagonist.gun.id];
|
||||||
const maxThickness = Math.max(
|
const maxThickness = Math.max(
|
||||||
tankModelDefinition.trackThickness,
|
trackModelDefinition.thickness,
|
||||||
gunModelDefinition.barrelThickness,
|
gunModelDefinition.thickness,
|
||||||
...armorNodes
|
...armorNodes
|
||||||
.map((node) => {
|
.map((node) => {
|
||||||
const armorId = nameToArmorId(node.name);
|
const armorId = nameToArmorId(node.name);
|
||||||
@@ -147,9 +149,9 @@ export const SpacedArmorDepth = memo<SpacedArmorDepthProps>(
|
|||||||
.filter(Boolean),
|
.filter(Boolean),
|
||||||
);
|
);
|
||||||
const hullOrigin = new Vector3(
|
const hullOrigin = new Vector3(
|
||||||
tankModelDefinition.hullOrigin[0],
|
trackModelDefinition.origin[0],
|
||||||
tankModelDefinition.hullOrigin[1],
|
trackModelDefinition.origin[1],
|
||||||
-tankModelDefinition.hullOrigin[2],
|
-trackModelDefinition.origin[2],
|
||||||
).applyAxisAngle(I_HAT, Math.PI / 2);
|
).applyAxisAngle(I_HAT, Math.PI / 2);
|
||||||
const turretOrigin = new Vector3(
|
const turretOrigin = new Vector3(
|
||||||
tankModelDefinition.turretOrigin[0],
|
tankModelDefinition.turretOrigin[0],
|
||||||
|
|||||||
@@ -49,9 +49,9 @@ export const TankModel = memo(() => {
|
|||||||
if (!awaitedModelDefinitions) return;
|
if (!awaitedModelDefinitions) return;
|
||||||
|
|
||||||
const hullOrigin = new Vector3(
|
const hullOrigin = new Vector3(
|
||||||
tankModelDefinition.hullOrigin[0],
|
trackModelDefinition.origin[0],
|
||||||
tankModelDefinition.hullOrigin[1],
|
trackModelDefinition.origin[1],
|
||||||
-tankModelDefinition.hullOrigin[2],
|
-trackModelDefinition.origin[2],
|
||||||
).applyAxisAngle(I_HAT, Math.PI / 2);
|
).applyAxisAngle(I_HAT, Math.PI / 2);
|
||||||
const turretOrigin = new Vector3(
|
const turretOrigin = new Vector3(
|
||||||
tankModelDefinition.turretOrigin[0],
|
tankModelDefinition.turretOrigin[0],
|
||||||
@@ -122,6 +122,7 @@ export const TankModel = memo(() => {
|
|||||||
if (!awaitedModelDefinitions) return;
|
if (!awaitedModelDefinitions) return;
|
||||||
|
|
||||||
const tankModelDefinition = awaitedModelDefinitions[protagonist.tank.id];
|
const tankModelDefinition = awaitedModelDefinitions[protagonist.tank.id];
|
||||||
|
const trackModelDefinition = tankModelDefinition.tracks[protagonist.track.id];
|
||||||
const turretModelDefinition =
|
const turretModelDefinition =
|
||||||
tankModelDefinition.turrets[protagonist.turret.id];
|
tankModelDefinition.turrets[protagonist.turret.id];
|
||||||
const gunModelDefinition = turretModelDefinition.guns[protagonist.gun.id];
|
const gunModelDefinition = turretModelDefinition.guns[protagonist.gun.id];
|
||||||
|
|||||||
@@ -62,6 +62,7 @@ export function Title() {
|
|||||||
mutateDuel((draft) => {
|
mutateDuel((draft) => {
|
||||||
draft.protagonist!.tank = tank;
|
draft.protagonist!.tank = tank;
|
||||||
draft.protagonist!.engine = tank.engines.at(-1)!;
|
draft.protagonist!.engine = tank.engines.at(-1)!;
|
||||||
|
draft.protagonist!.track = tank.tracks.at(-1)!;
|
||||||
draft.protagonist!.turret = tank.turrets.at(-1)!;
|
draft.protagonist!.turret = tank.turrets.at(-1)!;
|
||||||
draft.protagonist!.gun =
|
draft.protagonist!.gun =
|
||||||
draft.protagonist!.turret.guns.at(-1)!;
|
draft.protagonist!.turret.guns.at(-1)!;
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ export default function Page({ params }: { params: { id: string } }) {
|
|||||||
gun: awaitedTankDefinitions[id].turrets.at(-1)!.guns.at(-1)!,
|
gun: awaitedTankDefinitions[id].turrets.at(-1)!.guns.at(-1)!,
|
||||||
shell: awaitedTankDefinitions[id].turrets.at(-1)!.guns.at(-1)!
|
shell: awaitedTankDefinitions[id].turrets.at(-1)!.guns.at(-1)!
|
||||||
.shells[0],
|
.shells[0],
|
||||||
|
track: awaitedTankDefinitions[id].tracks.at(-1)!,
|
||||||
};
|
};
|
||||||
draft.antagonist = { ...draft.protagonist };
|
draft.antagonist = { ...draft.protagonist };
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ export interface YawLimits {
|
|||||||
}
|
}
|
||||||
interface GunModelDefinition {
|
interface GunModelDefinition {
|
||||||
armor: ModelArmor;
|
armor: ModelArmor;
|
||||||
barrelThickness: number;
|
thickness: number;
|
||||||
model: number;
|
model: number;
|
||||||
pitch: PitchLimits;
|
pitch: PitchLimits;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ export interface TankDefinition {
|
|||||||
}
|
}
|
||||||
export interface TrackDefinition {
|
export interface TrackDefinition {
|
||||||
id: number;
|
id: number;
|
||||||
|
tier: Tier;
|
||||||
weight: number;
|
weight: number;
|
||||||
traverseSpeed: number;
|
traverseSpeed: number;
|
||||||
dispersion: {
|
dispersion: {
|
||||||
|
|||||||
Reference in new issue
Block a user