Skip to content

Commit

Permalink
[assets] added Laser Rifle and Microfuel Cell ammo.
Browse files Browse the repository at this point in the history
  • Loading branch information
rjct committed Jun 25, 2024
1 parent d351921 commit 2add6b8
Show file tree
Hide file tree
Showing 22 changed files with 270 additions and 32 deletions.
Binary file added public/assets/ammo/energy/microfusion_cell/icon.webp
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
3 changes: 2 additions & 1 deletion public/maps/map_shooting_gallery.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
"rotation": 0,
"inventory": {
"main": [
{ "class": "laser_ammo", "name": "microfusion_cell", "quantity": 999 },
{ "class": "firearm_ammo", "name": ".45", "quantity": 2 },
{ "class": "firearm_ammo", "name": "9mm_ball", "quantity": 999 },
{ "class": "firearm_ammo", "name": "9mm_AP", "quantity": 999 },
Expand All @@ -28,7 +29,7 @@
{ "class": "weapon", "name": "throwing_knife" },
{ "class": "weapon", "name": "sniper_rifle" }
],
"leftHand": { "class": "weapon", "name": "frag_grenade" },
"leftHand": { "class": "weapon", "name": "laser_rifle" },
"rightHand": { "class": "weapon", "name": "mp5" }
}
},
Expand Down
44 changes: 40 additions & 4 deletions public/media-assets-manifest.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"image": {
"total": {
"count": 144,
"size": 6676361
"count": 146,
"size": 6678635
},
"files": {
"/assets/UI/cursors/default.png": {
Expand Down Expand Up @@ -119,6 +119,12 @@
"size": 566,
"type": "image"
},
"/assets/ammo/energy/microfusion_cell/icon.webp": {
"path": "/react-isometric-game/assets/ammo/energy/microfusion_cell/icon.webp",
"name": "icon.webp",
"size": 784,
"type": "image"
},
"/assets/bg.webp": {
"path": "/react-isometric-game/assets/bg.webp",
"name": "bg.webp",
Expand Down Expand Up @@ -815,6 +821,12 @@
"size": 718,
"type": "image"
},
"/assets/weapons/firearm/rifle/laser_rifle/icon.webp": {
"path": "/react-isometric-game/assets/weapons/firearm/rifle/laser_rifle/icon.webp",
"name": "icon.webp",
"size": 1490,
"type": "image"
},
"/assets/weapons/firearm/rifle/sniper_rifle/icon.webp": {
"path": "/react-isometric-game/assets/weapons/firearm/rifle/sniper_rifle/icon.webp",
"name": "icon.webp",
Expand Down Expand Up @@ -873,8 +885,8 @@
},
"audio": {
"total": {
"count": 65,
"size": 754594
"count": 69,
"size": 811103
},
"files": {
"/assets/UI/button.m4a": {
Expand Down Expand Up @@ -1129,6 +1141,30 @@
"size": 6061,
"type": "audio"
},
"/assets/weapons/firearm/rifle/laser_rifle/out_of_ammo.m4a": {
"path": "/react-isometric-game/assets/weapons/firearm/rifle/laser_rifle/out_of_ammo.m4a",
"name": "out_of_ammo.m4a",
"size": 16142,
"type": "audio"
},
"/assets/weapons/firearm/rifle/laser_rifle/reload.m4a": {
"path": "/react-isometric-game/assets/weapons/firearm/rifle/laser_rifle/reload.m4a",
"name": "reload.m4a",
"size": 15624,
"type": "audio"
},
"/assets/weapons/firearm/rifle/laser_rifle/shot_single_1.m4a": {
"path": "/react-isometric-game/assets/weapons/firearm/rifle/laser_rifle/shot_single_1.m4a",
"name": "shot_single_1.m4a",
"size": 12251,
"type": "audio"
},
"/assets/weapons/firearm/rifle/laser_rifle/shot_single_2.m4a": {
"path": "/react-isometric-game/assets/weapons/firearm/rifle/laser_rifle/shot_single_2.m4a",
"name": "shot_single_2.m4a",
"size": 12492,
"type": "audio"
},
"/assets/weapons/firearm/rifle/sniper_rifle/out_of_ammo.m4a": {
"path": "/react-isometric-game/assets/weapons/firearm/rifle/sniper_rifle/out_of_ammo.m4a",
"name": "out_of_ammo.m4a",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { NothingSelectedText } from "@src/components/editor/_shared/NothingSelectedText";
import { AmmoDetailsList } from "@src/components/_modals/inventory/_shared/AmmoDetailsList";
import { ItemImage } from "@src/components/_modals/inventory/_shared/ItemImage";
import { WeaponDetailsList } from "@src/components/_modals/inventory/_shared/WeaponDetailsList";
import { NothingSelectedText } from "@src/components/editor/_shared/NothingSelectedText";
import { AmmoDictEntity } from "@src/dict/ammo/ammo";
import { WeaponDictEntity } from "@src/dict/weapon/weapon";
import React from "react";
Expand All @@ -16,6 +16,7 @@ const ItemInfoComponent = (dictEntity: InventoryItemInfoProps["dictEntity"]) =>
return <WeaponDetailsList dictEntity={dictEntity} />;

case "firearm_ammo":
case "laser_ammo":
case "melee_ammo":
case "grenade_ammo":
return <AmmoDetailsList dictEntity={dictEntity} />;
Expand Down
15 changes: 10 additions & 5 deletions src/components/viewport/layers/ammo/Ammo.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
import { SingleUnitAmmo } from "@src/components/viewport/layers/ammo/SingleUnitAmmo";
import { GameLayer } from "@src/components/viewport/_shared/GameLayer";
import { SingleUnitAmmo } from "@src/components/viewport/layers/ammo/SingleUnitAmmo";
import { useGameState } from "@src/hooks/useGameState";
import React from "react";

export const Ammo = () => {
export const Ammo = React.memo(() => {
const { gameState } = useGameState();

const ammoFiredIds = React.useMemo(() => {
return gameState.ammoFiredIds;
}, [gameState.ammoFiredIds.length]);

return (
<GameLayer size={gameState.mapSize} className={"ammo-layer"} isometric={false}>
{Object.values(gameState.ammoFiredIds).map((ammoId) => (
<SingleUnitAmmo key={ammoId} ammo={gameState.getAmmoById(ammoId)} />
{Object.values(ammoFiredIds).map((ammoId) => (
<SingleUnitAmmo key={ammoId} ammoId={ammoId} />
))}
</GameLayer>
);
};
});
26 changes: 12 additions & 14 deletions src/components/viewport/layers/ammo/SingleUnitAmmo.tsx
Original file line number Diff line number Diff line change
@@ -1,19 +1,17 @@
import { constants } from "@src/engine/constants";
import { Ammo } from "@src/engine/weapon/AmmoFactory";
import { useGameState } from "@src/hooks/useGameState";
import React from "react";

export const SingleUnitAmmo = (props: { ammo?: Ammo }) => {
if (!props.ammo) return null;
export const SingleUnitAmmo = (props: { ammoId?: Ammo["id"] }) => {
const { gameState } = useGameState();

const position = props.ammo.position;
const ammo = React.useMemo(() => {
if (!props.ammoId) return null;

return (
<div
className={`ammo ammo_${props.ammo.name}`}
style={{
left: position.screen.x + constants.tileSize.width / 2,
top: position.screen.y + constants.tileSize.height / 2,
transform: `rotateX(60deg) rotateZ(${props.ammo.angle.deg - 45}deg) translateZ(40px)`,
}}
></div>
);
return gameState.getAmmoById(props.ammoId);
}, [props.ammoId]);

if (!ammo) return null;

return <div className={`ammo`} data-name={ammo.name} style={ammo.getDerivedCssProps()}></div>;
};
6 changes: 5 additions & 1 deletion src/dict/ammo/ammo.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import ammo_45 from "@src/dict/ammo/.45/.45";
import ammo_7_62mm from "@src/dict/ammo/7.62mm/7.62mm";
import ammo_9mm from "@src/dict/ammo/9mm/_9mm";
import microfusion_cell from "@src/dict/ammo/energy/microfusion_cell";
import grenade from "@src/dict/ammo/grenade/_grenade";
import melee from "@src/dict/ammo/melee/_melee";
import { VfxLight, VfxType } from "@src/engine/vfx/VfxFactory";
Expand All @@ -9,6 +10,7 @@ export enum weaponAmmoClassNames {
"firearm_ammo" = "Firearm ammo",
"grenade_ammo" = "Grenade ammo",
"melee_ammo" = "Melee ammo",
"laser_ammo" = "Laser ammo",
}
export type WeaponAmmoClass = keyof typeof weaponAmmoClassNames;

Expand All @@ -22,6 +24,8 @@ export type WeaponAmmoType =
| "7.62mm"
| "9mm"
//
| "microfusion_cell"
//
| "molotov_cocktail"
| "frag_grenade"
//
Expand Down Expand Up @@ -76,7 +80,7 @@ export type AmmoDictEntity = {
vfx?: WeaponAmmoVfx;
};

const ammoList = { ...ammo_45, ...ammo_9mm, ...ammo_7_62mm, ...grenade, ...melee };
const ammoList = { ...ammo_45, ...ammo_9mm, ...ammo_7_62mm, ...microfusion_cell, ...grenade, ...melee };

export type AmmoName = Exclude<keyof typeof ammoList, number>;
export default function getAmmoDictList(skipFakeAmmo = false) {
Expand Down
49 changes: 49 additions & 0 deletions src/dict/ammo/energy/microfusion_cell.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import { AmmoDictEntity } from "@src/dict/ammo/ammo";

const ammo_microfusion_cell: { [id: string]: AmmoDictEntity } = {
microfusion_cell: {
name: "microfusion_cell",
class: "laser_ammo",
type: "microfusion_cell",
title: "Microfusion cell",
description: "A medium sized energy production unit. Self-contained fusion plant.",
speed: 50,
damage: 0,
penetration: 0,
magazineSize: 50,
weight: 5,
price: 4,
gfx: {
icon: {
size: { width: 36, height: 51 },
src: "/assets/ammo/energy/microfusion_cell/icon.webp",
},
isometric: {
size: { width: 29, height: 26 },
src: "/assets/ammo/energy/microfusion_cell/iso.webp",
},
},
sfx: {
targetReached: {
src: [
"/assets/weapons/firearm/rico_1.mp3",
"/assets/weapons/firearm/rico_2.mp3",
"/assets/weapons/firearm/rico_3.mp3",
"/assets/weapons/firearm/rico_4.mp3",
"/assets/weapons/firearm/rico_5.mp3",
"/assets/weapons/firearm/rico_6.mp3",
"/assets/weapons/firearm/rico_7.mp3",
],
},
},
vfx: {
targetReached: {
type: ["hit-ground"],
delayBeforeEmitting: 50,
animationDuration: 200,
},
},
},
};

export default ammo_microfusion_cell;
2 changes: 2 additions & 0 deletions src/dict/weapon/firearm/firearm.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import beretta_M92FS from "@src/dict/weapon/firearm/pistol/beretta_M92FS";
import colt_45 from "@src/dict/weapon/firearm/pistol/colt_45";
import laser_rifle from "@src/dict/weapon/firearm/rifle/laser_rifle";
import sniper_rifle from "@src/dict/weapon/firearm/rifle/sniper_rifle";
import mp5 from "@src/dict/weapon/firearm/smg/MP5_H&K";
import { WeaponDictEntity } from "@src/dict/weapon/weapon";
Expand All @@ -11,6 +12,7 @@ export const firearm: { [id: string]: WeaponDictEntity } = {
mp5,
//
sniper_rifle,
laser_rifle,
};

export default firearm;
94 changes: 94 additions & 0 deletions src/dict/weapon/firearm/rifle/laser_rifle.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
import { WeaponDictEntity } from "@src/dict/weapon/weapon";

const laser_rifle: WeaponDictEntity = {
name: "laser_rifle",
class: "firearm",
type: "rifle",
title: "Laser rifle",
description:
"A Wattz 2000 laser rifle. Uses micro fusion cells for more powerful lasers, and an extended barrel for additional range.",
weight: 12,
price: 6000,
damageType: "energy",
ammoCapacity: 12,
requiredStat: {
name: "strength",
value: 5,
},
attackModes: {
shot_single: {
skill: "smallGuns",
ammoType: "microfusion_cell",
actionPointsConsumption: 5,
ammoConsumption: 1,
range: 45,
damage: {
min: 23,
max: 50,
},
removeFromInventoryAfterUse: false,
animationDuration: {
attack: 400,
attackCompleted: 1000,
attackNotAllowed: 1000,
},
},
shot_burst: {
skill: "smallGuns",
ammoType: "microfusion_cell",
actionPointsConsumption: 5,
ammoConsumption: 6,
range: 20,
damage: {
min: 8,
max: 17,
},
removeFromInventoryAfterUse: false,
animationDuration: {
attack: 400,
attackCompleted: 1000,
attackNotAllowed: 1000,
},
},
},
sfx: {
shot_single: {
src: [
"/assets/weapons/firearm/rifle/laser_rifle/shot_single_1.m4a",
"/assets/weapons/firearm/rifle/laser_rifle/shot_single_2.m4a",
],
timeIntervalMs: 400,
},
outOfAmmo: {
src: ["/assets/weapons/firearm/rifle/laser_rifle/out_of_ammo.m4a"],
},
reload: {
src: ["/assets/weapons/firearm/rifle/laser_rifle/reload.m4a"],
},
},
gfx: {
icon: {
size: { width: 128, height: 36 },
src: "/assets/weapons/firearm/rifle/laser_rifle/icon.webp",
},
isometric: {
size: { width: 64, height: 21 },
src: "/assets/weapons/firearm/rifle/laser_rifle/iso.webp",
},
},
vfx: {
shot_single: {
type: ["muzzle-1", "muzzle-2", "muzzle-3"],
animationDuration: 100,
delayBetweenEmitting: 50,
delayBeforeEmitting: 500,
light: {
animationDuration: 50,
color: "#ff0000",
radius: 2,
},
},
},
};

export default laser_rifle;
2 changes: 1 addition & 1 deletion src/dict/weapon/weapon.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ export type WeaponDamage = {
min: number;
max: number;
};
export type WeaponDamageType = "normal" | "explosion" | "fire";
export type WeaponDamageType = "normal" | "explosion" | "fire" | "energy";
export type WeaponAttackMode = keyof typeof weaponAttackModes;

export type WeaponSfxType = WeaponAttackMode | "outOfAmmo" | "reload";
Expand Down
Loading

0 comments on commit 2add6b8

Please sign in to comment.