From 3cf1cf7ea810294cfe5ba62f87a38e3492ef9948 Mon Sep 17 00:00:00 2001 From: Nick Kosarev Date: Mon, 8 Apr 2024 12:04:54 +0200 Subject: [PATCH] new code from stream! --- .dependency-cruiser.js | 393 +++++++++++++++++++++ .github/workflows/test.yml | 1 + EVENTS.md | 9 + README.md | 6 +- apps/api/src/bot/bot.controller.ts | 3 +- apps/api/src/bot/bot.service.ts | 14 +- apps/api/src/config.ts | 6 +- apps/api/src/db.repository.ts | 7 + apps/api/src/db/db.repository.ts | 11 +- apps/api/src/game/game.ts | 75 ++-- apps/api/src/game/objects/flag.ts | 8 +- apps/api/src/game/objects/player.ts | 37 +- apps/api/src/game/objects/stone.ts | 34 +- apps/api/src/game/objects/tree.ts | 50 +-- apps/api/src/index.ts | 12 +- apps/client/public/discord.png | Bin 0 -> 89808 bytes apps/client/src/components/tip.tsx | 14 - apps/client/src/components/top.tsx | 34 +- apps/client/src/hooks/useTopCoinsPlayer.ts | 29 ++ apps/client/src/layers/interface.tsx | 14 +- apps/client/tailwind.config.ts | 1 - bun.lockb | Bin 86979 -> 111144 bytes package.json | 10 +- packages/api-sdk/src/index.ts | 1 - packages/api-sdk/src/lib/client.ts | 9 + packages/api-sdk/src/lib/types.ts | 2 +- 26 files changed, 642 insertions(+), 138 deletions(-) create mode 100644 .dependency-cruiser.js create mode 100644 apps/client/public/discord.png delete mode 100644 apps/client/src/components/tip.tsx create mode 100644 apps/client/src/hooks/useTopCoinsPlayer.ts delete mode 100644 apps/client/tailwind.config.ts diff --git a/.dependency-cruiser.js b/.dependency-cruiser.js new file mode 100644 index 00000000..e0c16c43 --- /dev/null +++ b/.dependency-cruiser.js @@ -0,0 +1,393 @@ +/** @type {import('dependency-cruiser').IConfiguration} */ +module.exports = { + forbidden: [ + { + name: 'no-circular', + severity: 'warn', + comment: + 'This dependency is part of a circular relationship. You might want to revise ' + + 'your solution (i.e. use dependency inversion, make sure the modules have a single responsibility) ', + from: {}, + to: { + circular: true + } + }, + { + name: 'no-orphans', + comment: + "This is an orphan module - it's likely not used (anymore?). Either use it or " + + "remove it. If it's logical this module is an orphan (i.e. it's a config file), " + + "add an exception for it in your dependency-cruiser configuration. By default " + + "this rule does not scrutinize dot-files (e.g. .eslintrc.js), TypeScript declaration " + + "files (.d.ts), tsconfig.json and some of the babel and webpack configs.", + severity: 'warn', + from: { + orphan: true, + pathNot: [ + '(^|/)[.][^/]+[.](?:js|cjs|mjs|ts|cts|mts|json)$', // dot files + '[.]d[.]ts$', // TypeScript declaration files + '(^|/)tsconfig[.]json$', // TypeScript config + '(^|/)(?:babel|webpack)[.]config[.](?:js|cjs|mjs|ts|cts|mts|json)$' // other configs + ] + }, + to: {}, + }, + { + name: 'no-deprecated-core', + comment: + 'A module depends on a node core module that has been deprecated. Find an alternative - these are ' + + "bound to exist - node doesn't deprecate lightly.", + severity: 'warn', + from: {}, + to: { + dependencyTypes: [ + 'core' + ], + path: [ + '^v8/tools/codemap$', + '^v8/tools/consarray$', + '^v8/tools/csvparser$', + '^v8/tools/logreader$', + '^v8/tools/profile_view$', + '^v8/tools/profile$', + '^v8/tools/SourceMap$', + '^v8/tools/splaytree$', + '^v8/tools/tickprocessor-driver$', + '^v8/tools/tickprocessor$', + '^node-inspect/lib/_inspect$', + '^node-inspect/lib/internal/inspect_client$', + '^node-inspect/lib/internal/inspect_repl$', + '^async_hooks$', + '^punycode$', + '^domain$', + '^constants$', + '^sys$', + '^_linklist$', + '^_stream_wrap$' + ], + } + }, + { + name: 'not-to-deprecated', + comment: + 'This module uses a (version of an) npm module that has been deprecated. Either upgrade to a later ' + + 'version of that module, or find an alternative. Deprecated modules are a security risk.', + severity: 'warn', + from: {}, + to: { + dependencyTypes: [ + 'deprecated' + ] + } + }, + { + name: 'no-non-package-json', + severity: 'error', + comment: + "This module depends on an npm package that isn't in the 'dependencies' section of your package.json. " + + "That's problematic as the package either (1) won't be available on live (2 - worse) will be " + + "available on live with an non-guaranteed version. Fix it by adding the package to the dependencies " + + "in your package.json.", + from: {}, + to: { + dependencyTypes: [ + 'npm-no-pkg', + 'npm-unknown' + ] + } + }, + { + name: 'not-to-unresolvable', + comment: + "This module depends on a module that cannot be found ('resolved to disk'). If it's an npm " + + 'module: add it to your package.json. In all other cases you likely already know what to do.', + severity: 'error', + from: {}, + to: { + couldNotResolve: true + } + }, + { + name: 'no-duplicate-dep-types', + comment: + "Likely this module depends on an external ('npm') package that occurs more than once " + + "in your package.json i.e. bot as a devDependencies and in dependencies. This will cause " + + "maintenance problems later on.", + severity: 'warn', + from: {}, + to: { + moreThanOneDependencyType: true, + // as it's pretty common to have a type import be a type only import + // _and_ (e.g.) a devDependency - don't consider type-only dependency + // types for this rule + dependencyTypesNot: ["type-only"] + } + }, + + /* rules you might want to tweak for your specific situation: */ + + { + name: 'not-to-spec', + comment: + 'This module depends on a spec (test) file. The sole responsibility of a spec file is to test code. ' + + "If there's something in a spec that's of use to other modules, it doesn't have that single " + + 'responsibility anymore. Factor it out into (e.g.) a separate utility/ helper or a mock.', + severity: 'error', + from: {}, + to: { + path: '[.](?:spec|test)[.](?:js|mjs|cjs|jsx|ts|mts|cts|tsx|ls|coffee|litcoffee|coffee[.]md)$' + } + }, + { + name: 'not-to-dev-dep', + severity: 'error', + comment: + "This module depends on an npm package from the 'devDependencies' section of your " + + 'package.json. It looks like something that ships to production, though. To prevent problems ' + + "with npm packages that aren't there on production declare it (only!) in the 'dependencies'" + + 'section of your package.json. If this module is development only - add it to the ' + + 'from.pathNot re of the not-to-dev-dep rule in the dependency-cruiser configuration', + from: { + path: '^(packages)', + pathNot: '[.](?:spec|test)[.](?:js|mjs|cjs|jsx|ts|mts|cts|tsx|ls|coffee|litcoffee|coffee[.]md)$' + }, + to: { + dependencyTypes: [ + 'npm-dev', + ], + // type only dependencies are not a problem as they don't end up in the + // production code or are ignored by the runtime. + dependencyTypesNot: [ + 'type-only' + ], + pathNot: [ + 'node_modules/@types/' + ] + } + }, + { + name: 'optional-deps-used', + severity: 'info', + comment: + "This module depends on an npm package that is declared as an optional dependency " + + "in your package.json. As this makes sense in limited situations only, it's flagged here. " + + "If you're using an optional dependency here by design - add an exception to your" + + "dependency-cruiser configuration.", + from: {}, + to: { + dependencyTypes: [ + 'npm-optional' + ] + } + }, + { + name: 'peer-deps-used', + comment: + "This module depends on an npm package that is declared as a peer dependency " + + "in your package.json. This makes sense if your package is e.g. a plugin, but in " + + "other cases - maybe not so much. If the use of a peer dependency is intentional " + + "add an exception to your dependency-cruiser configuration.", + severity: 'warn', + from: {}, + to: { + dependencyTypes: [ + 'npm-peer' + ] + } + } + ], + options: { + + /* Which modules not to follow further when encountered */ + doNotFollow: { + /* path: an array of regular expressions in strings to match against */ + path: ['node_modules'] + }, + + /* Which modules to exclude */ + // exclude : { + // /* path: an array of regular expressions in strings to match against */ + // path: '', + // }, + + /* Which modules to exclusively include (array of regular expressions in strings) + dependency-cruiser will skip everything not matching this pattern + */ + // includeOnly : [''], + + /* dependency-cruiser will include modules matching against the focus + regular expression in its output, as well as their direct neighbours + (dependencies and dependents) + */ + // focus : '', + + /* List of module systems to cruise. + When left out dependency-cruiser will fall back to the list of _all_ + module systems it knows of. It's the default because it's the safe option + It might come at a performance penalty, though. + moduleSystems: ['amd', 'cjs', 'es6', 'tsd'] + + As in practice only commonjs ('cjs') and ecmascript modules ('es6') + are widely used, you can limit the moduleSystems to those. + */ + + // moduleSystems: ['cjs', 'es6'], + + /* prefix for links in html and svg output (e.g. 'https://github.com/you/yourrepo/blob/develop/' + to open it on your online repo or `vscode://file/${process.cwd()}/` to + open it in visual studio code), + */ + // prefix: `vscode://file/${process.cwd()}/`, + + /* false (the default): ignore dependencies that only exist before typescript-to-javascript compilation + true: also detect dependencies that only exist before typescript-to-javascript compilation + "specify": for each dependency identify whether it only exists before compilation or also after + */ + tsPreCompilationDeps: true, + + /* list of extensions to scan that aren't javascript or compile-to-javascript. + Empty by default. Only put extensions in here that you want to take into + account that are _not_ parsable. + */ + // extraExtensionsToScan: [".json", ".jpg", ".png", ".svg", ".webp"], + + /* if true combines the package.jsons found from the module up to the base + folder the cruise is initiated from. Useful for how (some) mono-repos + manage dependencies & dependency definitions. + */ + combinedDependencies: true, + + /* if true leave symlinks untouched, otherwise use the realpath */ + // preserveSymlinks: false, + + /* TypeScript project file ('tsconfig.json') to use for + (1) compilation and + (2) resolution (e.g. with the paths property) + + The (optional) fileName attribute specifies which file to take (relative to + dependency-cruiser's current working directory). When not provided + defaults to './tsconfig.json'. + */ + tsConfig: { + fileName: 'tsconfig.base.json' + }, + + /* Webpack configuration to use to get resolve options from. + + The (optional) fileName attribute specifies which file to take (relative + to dependency-cruiser's current working directory. When not provided defaults + to './webpack.conf.js'. + + The (optional) `env` and `arguments` attributes contain the parameters to be passed if + your webpack config is a function and takes them (see webpack documentation + for details) + */ + // webpackConfig: { + // fileName: 'webpack.config.js', + // env: {}, + // arguments: {} + // }, + + /* Babel config ('.babelrc', '.babelrc.json', '.babelrc.json5', ...) to use + for compilation (and whatever other naughty things babel plugins do to + source code). + */ + // babelConfig: { + // fileName: '.babelrc', + // }, + + /* List of strings you have in use in addition to cjs/ es6 requires + & imports to declare module dependencies. Use this e.g. if you've + re-declared require, use a require-wrapper or use window.require as + a hack. + */ + // exoticRequireStrings: [], + + /* options to pass on to enhanced-resolve, the package dependency-cruiser + uses to resolve module references to disk. The values below should be + suitable for most situations + + If you use webpack: you can also set these in webpack.conf.js. The set + there will override the ones specified here. + */ + enhancedResolveOptions: { + /* What to consider as an 'exports' field in package.jsons */ + exportsFields: ["exports"], + /* List of conditions to check for in the exports field. + Only works when the 'exportsFields' array is non-empty. + */ + conditionNames: ["import", "require", "node", "default", "types"], + /* + The extensions, by default are the same as the ones dependency-cruiser + can access (run `npx depcruise --info` to see which ones that are in + _your_ environment. If that list is larger than you need you can pass + the extensions you actually use (e.g. [".js", ".jsx"]). This can speed + up the most expensive step in dependency cruising (module resolution) + quite a bit. + */ + // extensions: [".js", ".jsx", ".ts", ".tsx", ".d.ts"], + /* What to consider a 'main' field in package.json */ + + // if you migrate to ESM (or are in an ESM environment already) you will want to + // have "module" in the list of mainFields, like so: + // mainFields: ["module", "main", "types", "typings"], + mainFields: ["main", "types", "typings"], + /* + A list of alias fields in package.jsons + See [this specification](https://github.com/defunctzombie/package-browser-field-spec) and + the [resolve.alias](https://webpack.js.org/configuration/resolve/#resolvealiasfields) + documentation in the webpack docs. + + Defaults to an empty array (don't use any alias fields). + */ + // aliasFields: ["browser"], + }, + reporterOptions: { + dot: { + /* pattern of modules that can be consolidated in the detailed + graphical dependency graph. The default pattern in this configuration + collapses everything in node_modules to one folder deep so you see + the external modules, but not the innards your app depends upon. + */ + collapsePattern: 'node_modules/(?:@[^/]+/[^/]+|[^/]+)', + + /* Options to tweak the appearance of your graph.See + https://github.com/sverweij/dependency-cruiser/blob/main/doc/options-reference.md#reporteroptions + for details and some examples. If you don't specify a theme + don't worry - dependency-cruiser will fall back to the default one. + */ + // theme: { + // graph: { + // /* splines: "ortho" will give you straight lines at the expense of + // being slow to render on big graphs + // splines: "true" will give you bezier curves which are faster + // but might not look as nice + // */ + // splines: "true" + // }, + // } + }, + archi: { + /* pattern of modules that can be consolidated in the high level + graphical dependency graph. If you use the high level graphical + dependency graph reporter (`archi`) you probably want to tweak + this collapsePattern to your situation. + */ + collapsePattern: '^(?:packages|src|lib(s?)|app(s?)|bin|test(s?)|spec(s?))/[^/]+|node_modules/(?:@[^/]+/[^/]+|[^/]+)', + + /* Options to tweak the appearance of your graph.See + https://github.com/sverweij/dependency-cruiser/blob/main/doc/options-reference.md#reporteroptions + for details and some examples. If you don't specify a theme + for 'archi' dependency-cruiser will use the one specified in the + dot section above and otherwise use the default one. + */ + // theme: { + // }, + }, + "text": { + "highlightFocused": true + }, + } + } +}; +// generated: dependency-cruiser@16.3.0 on 2024-04-08T09:50:19.700Z diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 1c39c1e3..d26b447f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -19,3 +19,4 @@ jobs: run: | npm i npm run lint + npm run lint:deps diff --git a/EVENTS.md b/EVENTS.md index 35eb57b7..ef582917 100644 --- a/EVENTS.md +++ b/EVENTS.md @@ -1,3 +1,12 @@ +## 2024-04-07 + +- Первый донат от sava5621! +- Титулы: Богач, Филантроп +- Новые команды: помощь, донат +- Провели первый стресс тест - все лагает. Решили что клиентскую часть будем переделывать на Canvas +- Генерация деревьев и камней на всей области +- Уходим от идеи рогалика, будем делать tower defence + ## 2024-04-06 - Skills работают (как раньше), но теперь с рандом шансом diff --git a/README.md b/README.md index e71362b1..f719d2a4 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # [Twitch Chat Game] Royal Madness 👑 👉 Building and playing it live: https://www.twitch.tv/hmbanan666 +👉 Our community: https://discord.gg/B6etUajrGZ 🤔 Imagine an open world where your Hero can: @@ -17,9 +18,8 @@ Let's build a similar world together! - [Front] Web client for the game made with **Typescript**, **React** - simple graphics, top view camera - - movements with mouse clicks (or finger taps) - - some interface, menu, inventory slots... -- [Back] Server on **Node.js**, where will be a storage for progress of all Heroes + - interface, menu, inventory slots... +- [Back] Server on **Bun**, where will be a storage for progress of all Heroes ## Why? diff --git a/apps/api/src/bot/bot.controller.ts b/apps/api/src/bot/bot.controller.ts index ab11c32f..b66e85d8 100644 --- a/apps/api/src/bot/bot.controller.ts +++ b/apps/api/src/bot/bot.controller.ts @@ -55,8 +55,9 @@ export class BotController { commands: this.prepareBotCommands(), }); - bot.onRaid(({ broadcasterName, userName }) => { + bot.onRaid(({ broadcasterName, userName, userId, viewerCount }) => { void bot.say(broadcasterName, `@${userName} устроил рейд!`); + void this.service.reactOnRaid({ userName, userId, viewerCount }); }); bot.onSub(({ broadcasterName, userName }) => { void bot.say( diff --git a/apps/api/src/bot/bot.service.ts b/apps/api/src/bot/bot.service.ts index 86623143..1aabdd19 100644 --- a/apps/api/src/bot/bot.service.ts +++ b/apps/api/src/bot/bot.service.ts @@ -21,7 +21,7 @@ export class BotService { console.log("рубить", userId, userName, params); const player = await this.game.findOrCreatePlayer(userId, userName); - if (player.state !== "IDLE") { + if (player.state === "CHOPPING") { void reply(`${userName}, ты пока занят(а).`); return; } @@ -42,7 +42,7 @@ export class BotService { console.log("добывать", userId, userName, params); const player = await this.game.findOrCreatePlayer(userId, userName); - if (player.state !== "IDLE") { + if (player.state === "MINING") { void reply(`${userName}, ты пока занят(а).`); return; } @@ -276,4 +276,14 @@ export class BotService { }, ); } + + public async reactOnRaid({ + userName, + userId, + viewerCount, + }: { userName: string; userId: string; viewerCount: number }) { + console.log("raid!", userName, userId, viewerCount); + + await this.game.findOrCreatePlayer(userId, userName); + } } diff --git a/apps/api/src/config.ts b/apps/api/src/config.ts index 0652768a..73e412e0 100644 --- a/apps/api/src/config.ts +++ b/apps/api/src/config.ts @@ -1,8 +1,8 @@ export const MIN_X = 20; -export const MAX_X = 1300; +export const MAX_X = 2520; -export const MIN_Y = 20; -export const MAX_Y = 1200; +export const MIN_Y = 120; +export const MAX_Y = 1190; export const DONATE_URL = "https://www.donationalerts.com/r/hmbanan666"; export const DISCORD_SERVER_INVITE_URL = "https://discord.gg/B6etUajrGZ"; diff --git a/apps/api/src/db.repository.ts b/apps/api/src/db.repository.ts index fec9763f..8e65f5e5 100644 --- a/apps/api/src/db.repository.ts +++ b/apps/api/src/db.repository.ts @@ -9,6 +9,13 @@ export function findTopByReputationPlayers() { }); } +export function findTopByCoinsPlayers() { + return db.player.findMany({ + orderBy: { coins: "desc" }, + take: 10, + }); +} + export function createCommand(dto: { playerId: string; command: string; diff --git a/apps/api/src/db/db.repository.ts b/apps/api/src/db/db.repository.ts index ca8e3e0f..a0a56fa7 100644 --- a/apps/api/src/db/db.repository.ts +++ b/apps/api/src/db/db.repository.ts @@ -15,7 +15,14 @@ export class DBRepository { return this.db.stone.findMany(); } - findPlayers() { - return this.db.player.findMany(); + findActivePlayers() { + const milliseconds = 20 * 60 * 1000; + const gte = new Date(new Date().getTime() - milliseconds); + + return this.db.player.findMany({ + where: { + lastActionAt: { gte }, + }, + }); } } diff --git a/apps/api/src/game/game.ts b/apps/api/src/game/game.ts index 725f8ae4..e91d58bd 100644 --- a/apps/api/src/game/game.ts +++ b/apps/api/src/game/game.ts @@ -13,17 +13,15 @@ export class Game { public flags: Flag[] = []; public async init() { - // this.players = await this.initPlayers(); - this.trees = await this.initTrees(); - this.stones = await this.initStones(); - this.rabbits = this.initRabbits(4); - this.wolfs = this.initWolfs(2); - this.flags = this.initFlags(8); + this.players = await this.initPlayers(); + this.trees = await this.initTrees(20); + this.stones = this.initStones(10); + this.rabbits = this.initRabbits(10); + this.wolfs = this.initWolfs(10); + this.flags = this.initFlags(10); } public async play() { - // const activePlayers = [this.players[0], this.players[1]]; - return setInterval(() => { for (const tree of this.trees) { tree.live(); @@ -31,6 +29,13 @@ export class Game { for (const stone of this.stones) { stone.live(); + if (stone.state === "DESTROYED") { + const random = getRandomInRange(1, 1000); + if (random <= 1) { + const index = this.stones.findIndex((s) => s.id === stone.id); + this.stones.splice(index, 1); + } + } } for (const rabbit of this.rabbits) { @@ -62,40 +67,33 @@ export class Game { } for (const player of this.players) { - // if (player.state === "IDLE") { - // const random = getRandomInRange(1, 100); - // if (random <= 1) { - // const randObj = this.getRandomTree(); - // if (!randObj) { - // return; - // } - // randObj.isReserved = true; - // player.setTarget(randObj); - // } - // } + if (player.state === "IDLE") { + const random = getRandomInRange(1, 1000); + if (random <= 1) { + const randObj = this.getRandomFlag(); + if (!randObj) { + return; + } + player.setTarget(randObj); + } + } player.live(); } }, 25); } - private async initTrees() { + private async initTrees(count: number) { const trees = []; - const treesFromDb = await repository.findTrees(); - for (const tree of treesFromDb) { - const treeInstance = new Tree(tree.id); - await treeInstance.readFromDB(); - trees.push(treeInstance); + for (let i = 0; i < count; i++) { + trees.push(new Tree()); } return trees; } - private async initStones() { + private initStones(count: number) { const stones = []; - const stonesFromDb = await repository.findStones(); - for (const stone of stonesFromDb) { - const instance = new Stone(stone.id); - await instance.readFromDB(); - stones.push(instance); + for (let i = 0; i < count; i++) { + stones.push(new Stone()); } return stones; } @@ -110,7 +108,7 @@ export class Game { private async initPlayers() { const players = []; - const playersFromDb = await repository.findPlayers(); + const playersFromDb = await repository.findActivePlayers(); for (const player of playersFromDb) { const instance = await this.initPlayer(player.id); players.push(instance); @@ -135,7 +133,8 @@ export class Game { } private initFlags(count: number) { - const flags = []; + const outsideFlag = new Flag(-100, 600); + const flags = [outsideFlag]; for (let i = 0; i < count; i++) { flags.push(new Flag()); } @@ -144,7 +143,7 @@ export class Game { getRandomTree() { const onlyReadyToChop = this.trees.filter( - (tree) => tree.isReadyToChop && !tree.isReserved, + (tree) => !tree.isReserved && tree.state !== "DESTROYED", ); return onlyReadyToChop.length ? onlyReadyToChop[getRandomInRange(0, onlyReadyToChop.length - 1)] @@ -152,8 +151,11 @@ export class Game { } getRandomStone() { - return this.stones.length - ? this.stones[getRandomInRange(0, this.stones.length - 1)] + const onlyAvailable = this.stones.filter( + (stone) => stone.state !== "DESTROYED" && !stone.isReserved, + ); + return onlyAvailable.length + ? onlyAvailable[getRandomInRange(0, onlyAvailable.length - 1)] : undefined; } @@ -182,7 +184,6 @@ export class Game { if (!randObj) { return false; } - randObj.isReserved = true; player.setTarget(randObj); return true; } diff --git a/apps/api/src/game/objects/flag.ts b/apps/api/src/game/objects/flag.ts index b522f4a9..bb6c1ca7 100644 --- a/apps/api/src/game/objects/flag.ts +++ b/apps/api/src/game/objects/flag.ts @@ -6,12 +6,12 @@ import { GameObject } from "./game-object"; export class Flag extends GameObject { public readonly entity = "FLAG"; - constructor() { + constructor(x?: number, y?: number) { const id = createId(); - const x = getRandomInRange(MIN_X, MAX_X); - const y = getRandomInRange(MIN_Y, MAX_Y); + const finalX = x ?? getRandomInRange(MIN_X, MAX_X); + const finalY = y ?? getRandomInRange(MIN_Y, MAX_Y); - super(id, x, y); + super(id, finalX, finalY); console.log("Creating new flag!"); } diff --git a/apps/api/src/game/objects/player.ts b/apps/api/src/game/objects/player.ts index 1f85f24f..73a9dd2f 100644 --- a/apps/api/src/game/objects/player.ts +++ b/apps/api/src/game/objects/player.ts @@ -36,12 +36,6 @@ export class Player extends GameObject implements GameObjectPlayer { live() { if (this.state === "IDLE") { - // const random = getRandomInRange(1, 50); - // if (random <= 1) { - // this.setRandomTarget(200); - // this.state = "MOVING"; - // } - this.sendMessage(); return; } @@ -51,11 +45,11 @@ export class Player extends GameObject implements GameObjectPlayer { if (!isMoving && this.target) { if (this.target instanceof Tree) { - void this.startChopping(this.target); + void this.startChopping(); return; } if (this.target instanceof Stone) { - void this.startMining(this.target); + void this.startMining(); return; } } @@ -85,6 +79,8 @@ export class Player extends GameObject implements GameObjectPlayer { } } + this.target.chop(); + if (this.target.health <= 0) { this.stopChopping(this.target); } @@ -117,6 +113,8 @@ export class Player extends GameObject implements GameObjectPlayer { } } + this.target.mine(); + if (this.target.health <= 0) { this.stopMining(this.target); } @@ -127,17 +125,17 @@ export class Player extends GameObject implements GameObjectPlayer { } } - async startChopping(tree: Tree) { + async startChopping() { this.state = "CHOPPING"; this.direction = "RIGHT"; - tree.state = "CHOPPING"; const skill = this.skills.find((skill) => skill.type === "WOODSMAN"); if (!skill) { - // Create await Skill.createInDB(this.id, "WOODSMAN"); await this.initSkills(); } + + await this.updateInDB(); } stopChopping(tree: Tree) { @@ -148,17 +146,17 @@ export class Player extends GameObject implements GameObjectPlayer { } } - async startMining(stone: Stone) { + async startMining() { this.state = "MINING"; this.direction = "RIGHT"; - stone.state = "MINING"; const skill = this.skills.find((skill) => skill.type === "MINER"); if (!skill) { - // Create await Skill.createInDB(this.id, "MINER"); await this.initSkills(); } + + await this.updateInDB(); } stopMining(stone: Stone) { @@ -219,6 +217,17 @@ export class Player extends GameObject implements GameObjectPlayer { this.inventoryId = player.inventoryId; } + public updateInDB() { + return db.player.update({ + where: { id: this.id }, + data: { + x: this.x, + y: this.y, + lastActionAt: new Date(), + }, + }); + } + public static createInDB({ twitchId, userName, diff --git a/apps/api/src/game/objects/stone.ts b/apps/api/src/game/objects/stone.ts index 52a3d974..76512197 100644 --- a/apps/api/src/game/objects/stone.ts +++ b/apps/api/src/game/objects/stone.ts @@ -9,8 +9,9 @@ export class Stone extends GameObject implements GameObjectStone { public readonly entity = "STONE"; public type: GameObjectStone["type"] = "1"; public resource = 0; - public size = 0; + public size = 100; public health = 100; + public isReserved = false; constructor(id?: string) { const objectId = id ?? createId(); @@ -21,6 +22,7 @@ export class Stone extends GameObject implements GameObjectStone { super(objectId, x, y); this.state = "IDLE"; + this.resource = getRandomInRange(1, 5); console.log(`Created stone ${objectId}!`); } @@ -32,26 +34,36 @@ export class Stone extends GameObject implements GameObjectStone { } if (this.state === "MINING") { - this.mining(); + if (this.health <= 0) { + this.setAsMined(); + } + + const random = getRandomInRange(1, 20); + if (random <= 1 && this.health > 0) { + this.state = "IDLE"; + this.isReserved = false; + } + this.sendMessage(); return; } - } - mining() { - if (this.health <= 0) { - this.setAsMined(); + if (this.state === "DESTROYED") { + this.sendMessage(); return; } + } + + mine() { + this.state = "MINING"; + this.isReserved = true; this.health -= 0.08; } setAsMined() { - this.resource = getRandomInRange(1, 5); - this.size = 100; - this.health = 100; - this.state = "IDLE"; - void this.updateInDB(); + this.size = 0; + this.health = 0; + this.state = "DESTROYED"; } public async readFromDB() { diff --git a/apps/api/src/game/objects/tree.ts b/apps/api/src/game/objects/tree.ts index e1fa7530..b5747391 100644 --- a/apps/api/src/game/objects/tree.ts +++ b/apps/api/src/game/objects/tree.ts @@ -12,7 +12,7 @@ export class Tree extends GameObject implements GameObjectTree { public readonly entity = "TREE"; public type: GameObjectTree["type"] = "1"; public resource = 0; - public size = 0; + public size = 100; public health = 100; public isReadyToChop = false; public isReserved = false; @@ -26,19 +26,35 @@ export class Tree extends GameObject implements GameObjectTree { super(objectId, x, y); this.state = "IDLE"; + this.resource = getRandomInRange(1, 5); + this.type = this.getNewTreeType(); console.log(`Created tree ${objectId}!`); } live() { if (this.state === "IDLE") { - this.grow(); + // this.grow(); this.sendMessage(); return; } if (this.state === "CHOPPING") { - this.chopping(); + if (this.health <= 0) { + this.setAsChopped(); + } + + const random = getRandomInRange(1, 20); + if (random <= 1 && this.health > 0) { + this.state = "IDLE"; + this.isReserved = false; + } + + this.sendMessage(); + return; + } + + if (this.state === "DESTROYED") { this.sendMessage(); return; } @@ -55,32 +71,22 @@ export class Tree extends GameObject implements GameObjectTree { this.size += 0.01; } - chopping() { - if (this.health <= 0) { - this.setAsChopped(); - return; - } + public chop() { + this.state = "CHOPPING"; + this.isReserved = true; this.health -= 0.08; } setAsChopped() { - this.resource = getRandomInRange(1, 5); this.size = 0; - this.health = 100; - this.isReadyToChop = false; - this.isReserved = false; - this.state = "IDLE"; - this.type = this.getNewTreeType(this.type); - void this.updateInDB(); + this.health = 0; + this.state = "DESTROYED"; } - getNewTreeType(typeNow: GameObjectTreeType): GameObjectTreeType { - const typeAsNumber = Number(typeNow); - // 1, 2 or 3 - if (typeAsNumber === 3) { - return "1"; - } - return String(typeAsNumber + 1) as GameObjectTreeType; + getNewTreeType(): GameObjectTreeType { + const types: GameObjectTreeType[] = ["1", "2", "3"]; + const index = getRandomInRange(0, types.length - 1); + return types[index]; } public async readFromDB() { diff --git a/apps/api/src/index.ts b/apps/api/src/index.ts index 8ee59097..5b70c0f3 100644 --- a/apps/api/src/index.ts +++ b/apps/api/src/index.ts @@ -1,7 +1,11 @@ import { Hono } from "hono"; import { cors } from "hono/cors"; import { BotController } from "./bot/bot.controller"; -import { findTopByReputationPlayers, findVillage } from "./db.repository"; +import { + findTopByCoinsPlayers, + findTopByReputationPlayers, + findVillage, +} from "./db.repository"; import { Game } from "./game/game"; const app = new Hono(); @@ -14,6 +18,12 @@ app.get("/players/top", async (c) => { return c.json(players); }); +app.get("/players/coins", async (c) => { + const players = await findTopByCoinsPlayers(); + + return c.json(players); +}); + app.get("/village", async (c) => { const village = await findVillage(); diff --git a/apps/client/public/discord.png b/apps/client/public/discord.png new file mode 100644 index 0000000000000000000000000000000000000000..53ab59efc8422177b75788995e4afdf3661284e4 GIT binary patch literal 89808 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%0DYPohut_{@?XPN|c5 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 { - return ( -
- {message} -
- ); -}; diff --git a/apps/client/src/components/top.tsx b/apps/client/src/components/top.tsx index ce6d2851..06dc0b37 100644 --- a/apps/client/src/components/top.tsx +++ b/apps/client/src/components/top.tsx @@ -1,21 +1,38 @@ +import { useTopCoinsPlayers } from "../hooks/useTopCoinsPlayer.ts"; import { useTopPlayers } from "../hooks/useTopPlayers"; import { PlayerFullBody } from "./player-full-body"; export const TopBlock = () => { const players = useTopPlayers(); + const richPlayers = useTopCoinsPlayers(); - const showTopPlayers = players?.map((player) => { + const showRichPlayers = richPlayers?.slice(0, 1).map((player) => { return (
+
+ +
+

{player.userName}

+

Богач! {player.coins} монет

+
+ ); + }); + + const showTopPlayers = players?.map((player, index) => { + return ( +

{player.userName}

- {player.reputation} реп. + {index === 0 && "Филантроп!"} {player.reputation} реп.

); @@ -23,11 +40,14 @@ export const TopBlock = () => { return (
-
-
- Топ поддержавших деревню +
+
+ Топ игроков +
+
+ {showRichPlayers} + {showTopPlayers}
-
{showTopPlayers}
); diff --git a/apps/client/src/hooks/useTopCoinsPlayer.ts b/apps/client/src/hooks/useTopCoinsPlayer.ts new file mode 100644 index 00000000..87f2a70a --- /dev/null +++ b/apps/client/src/hooks/useTopCoinsPlayer.ts @@ -0,0 +1,29 @@ +import { useEffect, useState } from "react"; +import { + type Player, + getTopByCoinsPlayers, +} from "../../../../packages/api-sdk/src"; + +export const useTopCoinsPlayers = () => { + const [players, setPlayers] = useState([]); + + useEffect(() => { + getTopByCoinsPlayers().then((res) => { + if (!res) return; + + setPlayers(res); + }); + + const reload = setInterval(() => { + getTopByCoinsPlayers().then((res) => { + if (!res) return; + + setPlayers(res); + }); + }, 10000); + + return () => clearInterval(reload); + }, []); + + return players; +}; diff --git a/apps/client/src/layers/interface.tsx b/apps/client/src/layers/interface.tsx index 4e32eedf..eb0e9177 100644 --- a/apps/client/src/layers/interface.tsx +++ b/apps/client/src/layers/interface.tsx @@ -1,7 +1,6 @@ import { useEffect, useState } from "react"; import { Background } from "../components/background"; import { DealerBlock } from "../components/dealer"; -import { Tip } from "../components/tip"; import { TopBlock } from "../components/top"; import { Village } from "../components/village"; @@ -27,21 +26,17 @@ export const InterfaceLayer = () => {
- - -

- Есть идеи? Наше комьюнити: -

-

- discord.gg/B6etUajrGZ + Есть идеи? Наш Discord сервер:

+

Пиши команды в чат:

+

!помощь

!рубить

!добывать

@@ -50,8 +45,7 @@ export const InterfaceLayer = () => {

!продать <название>

- -

В разработке:

+

!донат

diff --git a/apps/client/tailwind.config.ts b/apps/client/tailwind.config.ts deleted file mode 100644 index 1e5ee0b5..00000000 --- a/apps/client/tailwind.config.ts +++ /dev/null @@ -1 +0,0 @@ -// Temp file, for classes autocomplete diff --git a/bun.lockb b/bun.lockb index 0c297410035e6ddf1d0e0671ee9f231890cf513d..4744b29abdce3e80d223170e8229e28b04365dbf 100644 GIT binary patch delta 28862 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 G2LBJdzj#jo delta 14575 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 IXI^#x9~UALxc~qF diff --git a/package.json b/package.json index 6d5983da..f67e6b57 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "description": "Royal Madness: Twitch Chat Game", "scripts": { "lint": "npx @biomejs/biome check --apply ./apps", + "lint:deps": "npx depcruise apps", "db:start": "docker compose up", "db:edit": "prisma studio", "api:start": "bun run --hot apps/api/src/index.ts" @@ -25,11 +26,11 @@ "homepage": "https://github.com/hmbanan666/royal-madness-twitch-game#readme", "dependencies": { "@paralleldrive/cuid2": "2.2.2", - "@prisma/client": "5.12.0", + "@prisma/client": "5.12.1", "@twurple/auth": "7.1.0", "@twurple/chat": "7.1.0", "@twurple/easy-bot": "7.1.0", - "hono": "4.1.4", + "hono": "4.2.2", "howler": "2.2.4", "react": "18.2.0", "react-dom": "18.2.0", @@ -44,9 +45,10 @@ "@types/react": "18.2.74", "@types/react-dom": "18.2.23", "@vitejs/plugin-react": "4.2.1", - "prisma": "5.12.0", + "dependency-cruiser": "16.3.0", + "prisma": "5.12.1", "tailwindcss": "4.0.0-alpha.13", - "typescript": "5.4.3", + "typescript": "5.4.4", "vite": "5.2.8" } } diff --git a/packages/api-sdk/src/index.ts b/packages/api-sdk/src/index.ts index 46204662..520786c2 100644 --- a/packages/api-sdk/src/index.ts +++ b/packages/api-sdk/src/index.ts @@ -1,4 +1,3 @@ export * from "./lib/types"; export * from "./lib/client"; -export * from "./lib/websocket" export * from './lib/message-controller' diff --git a/packages/api-sdk/src/lib/client.ts b/packages/api-sdk/src/lib/client.ts index 51cd4718..27c65865 100644 --- a/packages/api-sdk/src/lib/client.ts +++ b/packages/api-sdk/src/lib/client.ts @@ -20,3 +20,12 @@ export async function getTopByReputationPlayers() { return null; } } + +export async function getTopByCoinsPlayers() { + try { + const res = await fetch("http://localhost:4001/players/coins"); + return (await res.json()) as Player[]; + } catch (err) { + return null; + } +} diff --git a/packages/api-sdk/src/lib/types.ts b/packages/api-sdk/src/lib/types.ts index 2e594d97..893fe637 100644 --- a/packages/api-sdk/src/lib/types.ts +++ b/packages/api-sdk/src/lib/types.ts @@ -103,7 +103,7 @@ export interface GameObject { id: string; x: number; y: number; - state: "MOVING" | "IDLE" | "CHOPPING" | "MINING"; + state: "MOVING" | "IDLE" | "CHOPPING" | "MINING" | "DESTROYED"; direction: "LEFT" | "RIGHT"; entity: GameObjectEntity; }