diff --git a/ABILITY_SCHEMA.md b/ABILITY_SCHEMA.md deleted file mode 100644 index 584da7d..0000000 --- a/ABILITY_SCHEMA.md +++ /dev/null @@ -1,383 +0,0 @@ -# Ability JSON Schema Documentation - -> This document explains the structure of ability definition files used in the system. -> It is intended for **wiki contributors** and **tool developers** alike. - ---- - -## Top-Level Structure - -Every ability file follows this wrapper: - -```json -{ - "abilities": { - "id": "namespace:category/name", - "displayName": "translation.key.for.name", - "description": "translation.key.for.description", - "math": [ ...nodes ] - } -} -``` - -| Field | Type | Required | Description | -|---------------|--------|----------|-------------| -| `id` | string | ✅ | Unique ID in `namespace:category/name` format | -| `displayName` | string | ✅ | i18n translation key for the display name | -| `description` | string | ✅ | i18n translation key for the tooltip/description | -| `math` | array | ✅ | Ordered list of effect nodes (see below) | - ---- - -## The `id` Format - -IDs follow the pattern: `namespace:category/name` - -| Part | Example | Notes | -|-------------|---------------|-------| -| `namespace` | `original` | The mod or source that owns this ability | -| `category` | `fire` | The element, school, or grouping | -| `name` | `fireball` | The specific ability | - -**Examples:** -- `original:fire/fireball` -- `original:ice/frost_bolt` -- `mymod:arcane/void_lance` - ---- - -## Translation Keys - -`displayName` and `description` are **not raw text** — they are keys looked up in a translation file. - -**Convention:** `ability...` - -| Field | Example Key | -|---------------|--------------------------------------| -| `displayName` | `ability.original.fireball.name` | -| `description` | `ability.original.fireball.description` | - ---- - -## Math Nodes - -The `math` array is the heart of an ability. Each node is an object with at minimum: - -```json -{ "id": "unique_node_id", "type": "node_type", ...fields } -``` - -| Field | Type | Required | Description | -|--------|--------|----------|-------------| -| `id` | string | ✅ | Unique name for this node within the ability | -| `type` | string | ✅ | Determines what this node does (see types below) | - ---- - -## Node Types - ---- - -### `base_value` -The foundational damage or healing number, before any modifiers. - -```json -{ - "id": "base_damage", - "type": "base_value", - "amount": 50, - "scaling": { "stat": "spell_power", "multiplier": 1.5 } -} -``` - -| Field | Type | Required | Description | -|--------------------|--------|----------|-------------| -| `amount` | number | ✅ | The flat base value | -| `scaling.stat` | string | ✅ | Which player stat to scale from | -| `scaling.multiplier` | number | ✅ | How much of that stat to add (`stat × multiplier`) | - -> **Formula:** `final = amount + (player[stat] × multiplier)` - ---- - -### `range` -How far the ability can reach and how it travels. - -```json -{ - "id": "cast_range", - "type": "range", - "min": 0, - "max": 30, - "unit": "meters", - "rangeType": "projectile" -} -``` - -| Field | Type | Required | Description | -|-------------|--------|----------|-------------| -| `min` | number | ✅ | Minimum range (use `> 0` for dead zones) | -| `max` | number | ✅ | Maximum range (`null` = unlimited) | -| `unit` | string | ✅ | `"meters"` | -| `rangeType` | string | ✅ | `projectile`, `hitscan`, `melee`, `aura` | - ---- - -### `area_of_effect` -Defines the shape and spread of the ability's impact zone. - -```json -{ - "id": "explosion", - "type": "area_of_effect", - "shape": "sphere", - "radius": 5, - "unit": "meters", - "falloff": "linear" -} -``` - -| Field | Type | Required | Description | -|-----------|--------|----------|-------------| -| `shape` | string | ✅ | `sphere`, `cone`, `cylinder`, `line` | -| `radius` | number | ✅ | Size of the AoE | -| `unit` | string | ✅ | `"meters"` | -| `falloff` | string | ✅ | `none`, `linear`, `quadratic` — how damage drops off at edges | - ---- - -### `damage` -Instant damage dealt. Supports **multiple damage types** in one node via `sources`. - -```json -{ - "id": "instant_damage", - "type": "damage", - "sources": [ - { - "damageType": "fire", - "base_value": 50, - "scaling": { "stat": "spell_power", "multiplier": 1.5 } - }, - { - "damageType": "physical", - "base_value": 15, - "scaling": { "stat": "strength", "multiplier": 0.5 } - } - ] -} -``` - -| Field | Type | Required | Description | -|--------------------------|--------|----------|-------------| -| `sources` | array | ✅ | One entry per damage type | -| `sources[].damageType` | string | ✅ | e.g. `fire`, `physical`, `lightning`, `poison` | -| `sources[].base_value` | number | ✅ | Flat damage for this type | -| `sources[].scaling` | object | ✅ | Same `stat` / `multiplier` structure as `base_value` | - -> **Note:** Multiple sources are applied **independently** — each scales off its own stat. - ---- - -### `damage_over_time` -Repeating damage applied in ticks after the initial hit. - -```json -{ - "id": "burn_dot", - "type": "damage_over_time", - "damageType": "fire", - "damage_per_tick": 10, - "tick_interval_seconds": 1, - "duration_seconds": 5, - "scaling": { "stat": "spell_power", "multiplier": 0.3 }, - "stacks": false -} -``` - -| Field | Type | Required | Description | -|-------------------------|---------|----------|-------------| -| `damageType` | string | ✅ | Damage type per tick | -| `damage_per_tick` | number | ✅ | Flat damage each tick | -| `tick_interval_seconds` | number | ✅ | Seconds between ticks | -| `duration_seconds` | number | ✅ | Total duration | -| `scaling` | object | ✅ | Same `stat` / `multiplier` structure | -| `stacks` | boolean | ✅ | `true` = re-applying adds a new stack; `false` = resets timer | - -> **Total ticks:** `duration_seconds / tick_interval_seconds` - ---- - -### `condition` -A status effect or triggered reaction applied to the target. - -```json -{ - "id": "ignite_debuff", - "type": "condition", - "chance": 0.75, - "duration_seconds": 5, - "effect": "reduce_fire_resistance", - "magnitude": -20 -} -``` - -```json -{ - "id": "explosion_knockback", - "type": "condition", - "chance": 1.0, - "effect": "knockback", - "force": 8, - "direction": "away_from_origin" -} -``` - -| Field | Type | Required | Description | -|--------------------|--------|----------|-------------| -| `chance` | number | ✅ | Probability `0.0`–`1.0` (`1.0` = always) | -| `effect` | string | ✅ | The condition to apply — mapped by the engine | -| `duration_seconds` | number | ❌ | How long the condition lasts (omit for instant effects) | -| `magnitude` | number | ❌ | Numeric modifier for stat-changing effects | -| `force` | number | ❌ | For displacement effects like knockback | -| `direction` | string | ❌ | `away_from_origin`, `toward_origin`, `up` | - -> Multiple `condition` nodes are rolled **independently** per hit. - ---- - -### `meta` -Gameplay configuration — cooldowns, costs, and tags. - -```json -{ - "id": "fireball_meta", - "type": "meta", - "cooldown_seconds": 12, - "mana_cost": 80, - "cast_time_seconds": 1.5, - "tags": ["fire", "aoe", "projectile", "dot"] -} -``` - -| Field | Type | Required | Description | -|----------------------|----------|----------|-------------| -| `cooldown_seconds` | number | ✅ | Recharge time after use | -| `mana_cost` | number | ✅ | Resource cost to cast | -| `cast_time_seconds` | number | ✅ | Time before the ability fires (`0` = instant) | -| `tags` | string[] | ✅ | Used for filtering, synergies, and resistances | - ---- - -## Complete Example — Fireball - -```json -{ - "abilities": { - "id": "original:fire/fireball", - "displayName": "ability.original.fireball.name", - "description": "ability.original.fireball.description", - "math": [ - { - "id": "base_damage", - "type": "base_value", - "amount": 50, - "scaling": { "stat": "spell_power", "multiplier": 1.5 } - }, - { - "id": "cast_range", - "type": "range", - "min": 0, - "max": 30, - "unit": "meters", - "rangeType": "projectile" - }, - { - "id": "explosion", - "type": "area_of_effect", - "shape": "sphere", - "radius": 5, - "unit": "meters", - "falloff": "linear" - }, - { - "id": "instant_damage", - "type": "damage", - "sources": [ - { - "damageType": "fire", - "base_value": 50, - "scaling": { "stat": "spell_power", "multiplier": 1.5 } - }, - { - "damageType": "physical", - "base_value": 15, - "scaling": { "stat": "strength", "multiplier": 0.5 } - } - ] - }, - { - "id": "burn_dot", - "type": "damage_over_time", - "damageType": "fire", - "damage_per_tick": 10, - "tick_interval_seconds": 1, - "duration_seconds": 5, - "scaling": { "stat": "spell_power", "multiplier": 0.3 }, - "stacks": false - }, - { - "id": "ignite_debuff", - "type": "condition", - "chance": 0.75, - "duration_seconds": 5, - "effect": "reduce_fire_resistance", - "magnitude": -20 - }, - { - "id": "explosion_knockback", - "type": "condition", - "chance": 1.0, - "effect": "knockback", - "force": 8, - "direction": "away_from_origin" - }, - { - "id": "fireball_meta", - "type": "meta", - "cooldown_seconds": 12, - "mana_cost": 80, - "cast_time_seconds": 1.5, - "tags": ["fire", "aoe", "projectile", "dot"] - } - ] - } -} -``` - ---- - -## Quick Reference Card - -| Node Type | Purpose | Key Fields | -|-------------------|-------------------------------------|------------| -| `base_value` | Core damage number + stat scaling | `amount`, `scaling` | -| `range` | How far & how the ability travels | `min`, `max`, `rangeType` | -| `area_of_effect` | Shape & spread of impact zone | `shape`, `radius`, `falloff` | -| `damage` | Instant hit damage (multi-type ok) | `sources[]` | -| `damage_over_time`| Tick damage over time | `damage_per_tick`, `tick_interval_seconds`, `duration_seconds`, `stacks` | -| `condition` | Status effects & reactions | `chance`, `effect`, `duration_seconds` | -| `meta` | Cooldown, cost, cast time, tags | `cooldown_seconds`, `mana_cost`, `cast_time_seconds`, `tags` | - ---- - -## Rules & Conventions - -1. Every ability **must** have at least one `meta` node. -2. `id` values must be **unique within the same ability file** — use descriptive names. -3. `displayName` and `description` must be **translation keys**, never raw text. -4. The `math` array is processed **top to bottom** — order matters for dependent effects. -5. `damage` nodes should come **after** any `area_of_effect` nodes that modify their area. -6. A `damage_over_time` node is **separate** from `damage` — both can coexist freely. -7. Multiple `condition` nodes are each rolled independently. -8. `tags` on the `meta` node are used by the engine for resistance checks, talent synergies, and UI filtering. diff --git a/Panel_Admin.md b/Panel_Admin.md deleted file mode 100644 index c12391d..0000000 --- a/Panel_Admin.md +++ /dev/null @@ -1,191 +0,0 @@ -# Admin Panel -## - Items List -### Panel Setup -- Tags (Dynamic) - - Default (all) - - Alloys - - Circuits - - Customizables - - Ingots - - Materials - - Ores - - Personal - - Shop - - Space Ships - - Shields - - Weapons -## - Hostiles List -### Panel Setup -- Tags (Dynamic) - - Default (all) - - Ground Units - - Space Ships -## - Player List -- Tags (Dynamic) - - Default (all) - - Members - - Moderators - - Admins -## - Permissions -### Panel hierarchy -- Roles (Static) - - Edit - - Role Tag - - Role Name - - Permission Nodes - - Chat Font Color - - New - - Role Tag - - Role Name - - Permission Nodes - - Chat Font Color -- Users (Static) - - Edit - - Permission Nodes -# Permission Nodes -### Default Roles -- Members Permission Nodes - - permission.node.player.text.chat - - permission.node.player.text.chat.emote - - permission.node.player.text.chat.message - - permission.node.player.text.chat.message.direct - - permission.node.player.text.color.name - - permission.node.guild.join -- Moderator Permission Nodes - - global.roles.members.* - - permission.node.player.server.ban - - permission.node.player.server.timeout - - permission.node.player.server.unban - - permission.node.player.text.ban - - permission.node.player.text.timeout.["timeinseconds"] - - permission.node.player.text.unban -- Admin Permission Nodes - - global.roles.moderators.* - - permission.node.player.clean.database.all - - permission.node.player.clean.database.item - - permission.node.player.clean.inventory.all - - permission.node.player.clean.inventory.item - - permission.node.player.console - - permission.node.player.give.exp - - permission.node.player.give.item - - permission.node.player.give.skill - - permission.node.player.permission.add.["permission.node.*"] - - permission.node.player.permission.edit.["permission.node.*"] - - permission.node.player.permission.remove.["permission.node.*"] - - permission.node.player.role.add.["permission.node.*"] - - permission.node.player.role.edit - - permission.node.player.role.give - - permission.node.player.role.hierarchy - - permission.node.player.role.new - - permission.node.player.role.remove - - permission.node.player.role.remove.["permission.node.*"] -- Super Admin Permission Nodes (First Person On Server) - - permission.node.player.bypass -### Extra Nodes -- permission.node.tab.*.(allow/deny) -- permission.node.tab.dashboard.(allow/deny) -- permission.node.tab.dungeons.* - - ["permission.node.tab.dungeons.{datapackId}.{dungeonId}.(allow/deny)"] -- permission.node.tab.skills.* - - ["permission.node.tab.skills.{datapackId}.{skillsId}.(allow/deny)"] -- permission.node.tab.inventory.* - - ["permission.node.tab.inventory.{datapackId}.{core_systemId}.(allow/deny)"] -- permission.node.tab.shop.* - - ["permission.node.tab.shop.{datapackId}.{shopId}.(allow/deny)"] -- permission.node.tab.crafting.* - - ["permission.node.tab.crafting.{datapackId}.{craftingId}.(allow/deny)"] -- permission.node.tab.admin.* - - ["permission.node.tab.admin.{datapackId}.{adminId}.(allow/deny)"] -- permission.node.tab.chat.* - - ["permission.node.tab.chat.{datapackId}.{chatId}.(allow/deny)"] -- permission.node.tab.alerts.(allow/deny) -- permission.node.generate.credits.online.*.(allow/deny) -- permission.node.generate.credits.offline.*.(allow/deny) -- permission.node.generate.datacores.online.*.(allow/deny) -- permission.node.generate.datacores.offline.*.(allow/deny) -- permission.node.player.nickname.(allow/deny) -- permission.node.player.text.color.(allow/deny) -- permission.node.player.text.emote.(allow/deny) -### Guild Type Permissions -- guild.roles.* -- permission.node.guild.admin.* -- permission.node.guild.admin.alliance.* -- permission.node.guild.admin.alliance.create -- permission.node.guild.admin.alliance.join -- permission.node.guild.admin.alliance.leave -- permission.node.guild.admin.manage.* -- permission.node.guild.admin.manage.base.* -- permission.node.guild.admin.manage.base.type.* -- permission.node.guild.admin.manage.base.type.booster.* -- permission.node.guild.admin.manage.base.type.booster.{integar} -- permission.node.guild.admin.manage.base.type.mine -- permission.node.guild.admin.manage.base.type.mine.{integar} -- permission.node.guild.admin.manage.base.type.research.* -- permission.node.guild.admin.manage.base.type.research.{{datapackId}.{researchId}} -- permission.node.guild.admin.manage.base.type.storage.* -- permission.node.guild.admin.manage.base.type.storage.{integar} -- permission.node.guild.admin.manage.base.type.storage.{integar}.name -- permission.node.guild.admin.manage.base.type.storage.{integer}.limit.* -- permission.node.guild.admin.manage.base.type.storage.{integar}.limit.add -- permission.node.guild.admin.manage.base.type.storage.{integar}.limit.remove -- permission.node.guild.admin.manage.base.type.storage.{integar}.hidden -- permission.node.guild.admin.manage.message.announcement -- permission.node.guild.admin.manage.message.day -- permission.node.guild.admin.manage.message.recuitement -- permission.node.guild.admin.manage.name -- permission.node.guild.admin.manage.role.* -- permission.node.guild.admin.manage.role.create -- permission.node.guild.admin.manage.role.delete -- permission.node.guild.admin.manage.role.edit.* -- permission.node.guild.admin.manage.role.edit.hierarchy -- permission.node.guild.admin.manage.role.edit.name -- permission.node.guild.admin.manage.role.edit.permission -- permission.node.guild.invite -- permission.node.guild.join -- permission.node.guild.storage.* -- permission.node.guild.storage.add.* -- permission.node.guild.storage.add.{integer} -- permission.node.guild.storage.hidden.{integer} -- permission.node.guild.storage.remove.* -- permission.node.guild.storage.remove.{integer} -- permission.node.guild.text.chat.message.["guild.roles.*"] -### Alliance Type Permissions -- alliance.roles.* -- permission.node.alliance.admin.* -- permission.node.alliance.admin.manage.* -- permission.node.alliance.admin.manage.base.* -- permission.node.alliance.admin.manage.base.type.* -- permission.node.alliance.admin.manage.base.type.booster.* -- permission.node.alliance.admin.manage.base.type.booster.{integar} -- permission.node.alliance.admin.manage.base.type.mine -- permission.node.alliance.admin.manage.base.type.mine.{integar} -- permission.node.alliance.admin.manage.base.type.research.* -- permission.node.alliance.admin.manage.base.type.research.{{datapackId}.{researchId}} -- permission.node.alliance.admin.manage.base.type.storage.* -- permission.node.alliance.admin.manage.base.type.storage.{integar} -- permission.node.alliance.admin.manage.base.type.storage.{integar}.name -- permission.node.alliance.admin.manage.base.type.storage.{integer}.limit.* -- permission.node.alliance.admin.manage.base.type.storage.{integar}.limit.add -- permission.node.alliance.admin.manage.base.type.storage.{integar}.limit.remove -- permission.node.alliance.admin.manage.base.type.storage.{integar}.hidden -- permission.node.alliance.admin.manage.kick -- permission.node.alliance.admin.manage.message.announcement -- permission.node.alliance.admin.manage.message.day -- permission.node.alliance.admin.manage.message.recuitement -- permission.node.alliance.admin.manage.name -- permission.node.alliance.admin.manage.role.* -- permission.node.alliance.admin.manage.role.create -- permission.node.alliance.admin.manage.role.delete -- permission.node.alliance.admin.manage.role.edit.* -- permission.node.alliance.admin.manage.role.edit.hierarchy -- permission.node.alliance.admin.manage.role.edit.name -- permission.node.alliance.admin.manage.role.edit.permission -- permission.node.alliance.invite -- permission.node.alliance.join -- permission.node.alliance.storage.* -- permission.node.alliance.storage.add.* -- permission.node.alliance.storage.add.{integer} -- permission.node.alliance.storage.hidden.{integer} -- permission.node.alliance.storage.remove.* -- permission.node.alliance.storage.remove.{integer} -- permission.node.alliance.text.chat.message.["alliance.roles.*"] \ No newline at end of file diff --git a/Panel_Quests.md b/Panel_Quests.md deleted file mode 100644 index 5117058..0000000 --- a/Panel_Quests.md +++ /dev/null @@ -1,18 +0,0 @@ -# Quests Panel -## Quests new variables -```js -{ - "quests": { - "id": "datapackID:questID", - "displayName": "items.materials.original.quest.quest_name", - "description": "items.materials.original.quest.quest_name.desc", - "repeatable": boolean, - "questType": String, - "requiredDone": [], - "unlockRequirements": [], - "onFinish": [], - "meta": { - } - } -} -``` \ No newline at end of file diff --git a/Panel_Store.md b/Panel_Store.md deleted file mode 100644 index 040334a..0000000 --- a/Panel_Store.md +++ /dev/null @@ -1,20 +0,0 @@ -# Store Panel -## Items new variables -```js -{ - "materials": { - "id": "original:ore_coal", - "texture": "original/assets/textures/materials/ore/coal.png", - "displayName": "items.materials.original.ores.coal", - "description": "items.materials.original.ores.coal.desc", - "meta": { - "storeCategory": "original:materials", - "storeFeaturedDiscountPercentage": 0.5, - "storeFeaturedShowWeight": 10, #Higher number harder for role. - "storePrice": 50, - "storeSellValue": 10, - "storeShowWeight": 10 #Higher number harder for role. - } - } -} -``` \ No newline at end of file diff --git a/api/package.json b/api/package.json deleted file mode 100644 index 68159f2..0000000 --- a/api/package.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "api", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "start": "node ./src/index.js" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "commonjs", - "dependencies": { - "bcryptjs": "^3.0.3", - "cors": "^2.8.6", - "dotenv": "^17.3.1", - "express": "^5.2.1", - "jsonwebtoken": "^9.0.3", - "mongoose": "^9.3.0", - "socket.io": "^4.8.3" - } -} diff --git a/client/.gitignore b/client/.gitignore deleted file mode 100644 index a547bf3..0000000 --- a/client/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/client/README.md b/client/README.md deleted file mode 100644 index 18bc70e..0000000 --- a/client/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# React + Vite - -This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. - -Currently, two official plugins are available: - -- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) (or [oxc](https://oxc.rs) when used in [rolldown-vite](https://vite.dev/guide/rolldown)) for Fast Refresh -- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh - -## React Compiler - -The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). - -## Expanding the ESLint configuration - -If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and [`typescript-eslint`](https://typescript-eslint.io) in your project. diff --git a/client/eslint.config.js b/client/eslint.config.js deleted file mode 100644 index 4fa125d..0000000 --- a/client/eslint.config.js +++ /dev/null @@ -1,29 +0,0 @@ -import js from '@eslint/js' -import globals from 'globals' -import reactHooks from 'eslint-plugin-react-hooks' -import reactRefresh from 'eslint-plugin-react-refresh' -import { defineConfig, globalIgnores } from 'eslint/config' - -export default defineConfig([ - globalIgnores(['dist']), - { - files: ['**/*.{js,jsx}'], - extends: [ - js.configs.recommended, - reactHooks.configs.flat.recommended, - reactRefresh.configs.vite, - ], - languageOptions: { - ecmaVersion: 2020, - globals: globals.browser, - parserOptions: { - ecmaVersion: 'latest', - ecmaFeatures: { jsx: true }, - sourceType: 'module', - }, - }, - rules: { - 'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }], - }, - }, -]) diff --git a/client/index.html b/client/index.html deleted file mode 100644 index 7b685b1..0000000 --- a/client/index.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - Galaxy Strike Online - - - - -
- - - diff --git a/client/package.json b/client/package.json deleted file mode 100644 index 85d51c2..0000000 --- a/client/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "client", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite --host 0.0.0.0", - "build": "vite build", - "lint": "eslint .", - "preview": "vite preview" - }, - "dependencies": { - "axios": "^1.13.6", - "react": "^19.2.0", - "react-dom": "^19.2.0", - "socket.io-client": "^4.8.3" - }, - "devDependencies": { - "@eslint/js": "^9.39.1", - "@types/react": "^19.2.5", - "@types/react-dom": "^19.2.3", - "@vitejs/plugin-react": "^5.1.1", - "eslint": "^9.39.1", - "eslint-plugin-react-hooks": "^7.0.1", - "eslint-plugin-react-refresh": "^0.4.24", - "globals": "^16.5.0", - "vite": "^7.2.4" - } -} diff --git a/client/public/vite.svg b/client/public/vite.svg deleted file mode 100644 index e7b8dfb..0000000 --- a/client/public/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/client/src/App.jsx b/client/src/App.jsx deleted file mode 100644 index 49333b7..0000000 --- a/client/src/App.jsx +++ /dev/null @@ -1,137 +0,0 @@ -import React, { useEffect, useState, useCallback, useRef } from "react"; -import MainMenu from "./views/MainMenu/MainMenu"; -import GameInterface from "./views/GameInterface/GameInterface"; -import LoadingScreen from "./views/LoadingScreen/LoadingScreen.jsx"; -import GameDataManager from "./services/GameDataManager"; -import { useAuth } from "./hooks/useAuth"; -import { useSocket } from "./hooks/useSocket"; - -function App() { - const { isConnected, connectToServer, socket } = useSocket(); - const { user } = useAuth(); - - const [isInGame, setIsInGame] = useState(false); - const [isBooting, setIsBooting] = useState(false); - const [loadingProgress, setLoadingProgress] = useState(0); - const [statusText, setStatusText] = useState(""); - - const hasAttemptedBoot = useRef(false); - - const fetchMetadata = useCallback(async (serverUrl) => { - try { - const response = await fetch(`${serverUrl}/api/game-metadata`); - if (!response.ok) throw new Error("Metadata fetch failed"); - const data = await response.json(); - GameDataManager.initialize(data); - return true; - } catch (err) { - console.error("Metadata Sync Error:", err); - return false; - } - }, []); - - const bootSequence = useCallback( - async (serverUrl, token) => { - if (isBooting) return; - - setIsBooting(true); - setLoadingProgress(10); - setStatusText("Initializing Systems..."); - - try { - setStatusText("Fetching Galactic Database..."); - const success = await fetchMetadata(serverUrl); - if (!success) throw new Error("Initial metadata load failed"); - - setLoadingProgress(60); - - setStatusText("Establishing Neural Link..."); - const socketInstance = connectToServer(serverUrl, token); - - socketInstance.once("session:ready", () => { - setLoadingProgress(100); - setStatusText("Ready to Launch"); - - setTimeout(() => { - setIsInGame(true); - setIsBooting(false); - }, 600); - }); - - socketInstance.once("connect_error", (err) => { - console.error("Socket error:", err); - setStatusText("Neural Link Failed"); - setTimeout(() => setIsBooting(false), 2000); - }); - } catch (err) { - console.error("Boot error:", err); - setStatusText("System Failure"); - setTimeout(() => setIsBooting(false), 2000); - } - }, - [connectToServer, isBooting, fetchMetadata], - ); - - useEffect(() => { - if (!socket || !isConnected) return; - - const handleDataUpdate = async () => { - console.log("🔄 [System] Datapacks changed on server. Synchronizing..."); - - const savedServer = localStorage.getItem("activeServer"); - if (!savedServer) return; - - const { connectUrl } = JSON.parse(savedServer); - const success = await fetchMetadata(connectUrl); - - if (success) { - console.log("✅ [System] Local database updated successfully."); - } - }; - - socket.on("system:data_updated", handleDataUpdate); - - return () => { - socket.off("system:data_updated", handleDataUpdate); - }; - }, [socket, isConnected, fetchMetadata]); - - useEffect(() => { - if (user && !hasAttemptedBoot.current && !isConnected && !isInGame) { - const savedServer = localStorage.getItem("activeServer"); - const token = user?.token; - - if (savedServer && token) { - const server = JSON.parse(savedServer); - hasAttemptedBoot.current = true; - bootSequence(server.connectUrl, token); - } - } - }, [user, isConnected, isInGame, bootSequence]); - - const handleStartGame = () => { - const savedServer = localStorage.getItem("activeServer"); - const token = user?.token; - - if (savedServer && token) { - const server = JSON.parse(savedServer); - bootSequence(server.connectUrl, token); - } - }; - - if (isBooting) { - return ; - } - - return ( -
- {isInGame && isConnected ? ( - setIsInGame(false)} /> - ) : ( - - )} -
- ); -} - -export default App; diff --git a/client/src/assets/react.svg b/client/src/assets/react.svg deleted file mode 100644 index 615e843..0000000 --- a/client/src/assets/react.svg +++ /dev/null @@ -1,4572 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/client/src/components/Console/Console.css b/client/src/components/Console/Console.css deleted file mode 100644 index 5fcb40b..0000000 --- a/client/src/components/Console/Console.css +++ /dev/null @@ -1,86 +0,0 @@ -.game-console-bottom { - position: fixed; - bottom: 0; - left: 0; - width: 100vw; - height: 35vh; /* Займає третину екрана знизу */ - background: rgba(10, 15, 20, 0.95); - border-top: 2px solid #00ffaa; - display: flex; - flex-direction: column; - z-index: 10000; - font-family: "Consolas", "Monaco", monospace; - box-shadow: 0 -5px 20px rgba(0, 0, 0, 0.5); -} - -.console-scroll-area { - flex: 1; - overflow-y: auto; - padding: 10px; - font-size: 13px; - color: #e0e0e0; -} - -.console-line { - margin-bottom: 4px; - border-left: 2px solid transparent; - padding-left: 8px; -} - -.console-line:contains(">") { - color: #00ffaa; -} - -/* Підказки випливають ВГОРУ */ -.console-suggestions-upward { - position: absolute; - bottom: 45px; /* Над полем вводу */ - left: 0; - width: 100%; - background: #151a20; - border-top: 1px solid #333; - display: flex; - flex-wrap: wrap; - gap: 8px; - padding: 8px; - max-height: 100px; - overflow-y: auto; -} - -.suggestion-item { - padding: 3px 10px; - background: #252a30; - color: #888; - font-size: 12px; - border-radius: 4px; -} - -.suggestion-item.selected { - background: #00ffaa; - color: #000; - font-weight: bold; -} - -.console-input-form { - display: flex; - align-items: center; - background: #000; - padding: 5px 15px; - height: 40px; -} - -.console-prompt { - color: #00ffaa; - margin-right: 10px; - font-weight: bold; -} - -.console-input-form input { - flex: 1; - background: transparent; - border: none; - color: #fff; - font-family: inherit; - font-size: 16px; - outline: none; -} diff --git a/client/src/components/Console/Console.jsx b/client/src/components/Console/Console.jsx deleted file mode 100644 index 7b01929..0000000 --- a/client/src/components/Console/Console.jsx +++ /dev/null @@ -1,139 +0,0 @@ -import React, { useState, useEffect, useRef } from "react"; -import "./Console.css"; -import { useSocket } from "../../hooks/useSocket"; -import ConsoleManager from "../../services/ConsoleManager"; -import PlayerManager from "../../services/PlayerManager"; // Імпортуємо менеджер гравців - -const Console = () => { - const { socket } = useSocket(); - const [isOpen, setIsOpen] = useState(false); - const [input, setInput] = useState(""); - const [suggestions, setSuggestions] = useState([]); - const [selectedIndex, setSelectedIndex] = useState(0); - const [logs, setLogs] = useState(ConsoleManager.logs); - - const [playerNames, setPlayerNames] = useState([]); - - const inputRef = useRef(null); - const scrollRef = useRef(null); - - useEffect(() => { - ConsoleManager.init(socket, setLogs); - }, [socket]); - - useEffect(() => { - const updatePlayers = (data) => { - setPlayerNames([...data.online, ...data.offline]); - }; - - const unsubscribe = PlayerManager.subscribe(updatePlayers); - - setPlayerNames([ - ...PlayerManager.onlinePlayers, - ...PlayerManager.offlinePlayers, - ]); - - return () => unsubscribe(); - }, []); - - useEffect(() => { - if (scrollRef.current) { - scrollRef.current.scrollTop = scrollRef.current.scrollHeight; - } - }, [logs]); - - useEffect(() => { - const handleGlobalKeyDown = (e) => { - if (e.key === "F9") { - e.preventDefault(); - setIsOpen((prev) => !prev); - } - }; - window.addEventListener("keydown", handleGlobalKeyDown); - return () => window.removeEventListener("keydown", handleGlobalKeyDown); - }, []); - - useEffect(() => { - setSuggestions(ConsoleManager.getSuggestions(input, playerNames)); - setSelectedIndex(0); - }, [input, playerNames]); - - const handleKeyDown = (e) => { - if (e.key === "Tab" && suggestions.length > 0) { - e.preventDefault(); - const parts = input.split(" "); - parts[parts.length - 1] = suggestions[selectedIndex]; - setInput(parts.join(" ") + (parts.length < 3 ? " " : "")); - } - - if (e.key === "ArrowDown") { - if (suggestions.length > 0) { - setSelectedIndex((prev) => (prev + 1) % suggestions.length); - } else { - const hist = ConsoleManager.getHistory("down"); - if (hist !== null) setInput(hist); - } - } - - if (e.key === "ArrowUp") { - if (suggestions.length > 0) { - setSelectedIndex( - (prev) => (prev - 1 + suggestions.length) % suggestions.length, - ); - } else { - const hist = ConsoleManager.getHistory("up"); - if (hist !== null) setInput(hist); - } - } - - if (e.key === "Escape") setIsOpen(false); - }; - - const handleSubmit = (e) => { - e.preventDefault(); - if (!input.trim()) return; - ConsoleManager.execute(input); - setInput(""); - }; - - if (!isOpen) return null; - - return ( -
-
- {logs.map((line, i) => ( -
- {line} -
- ))} -
- - {suggestions.length > 0 && ( -
- {suggestions.map((s, i) => ( -
- {s} -
- ))} -
- )} - -
- # - setInput(e.target.value)} - placeholder="Type /command..." - /> -
-
- ); -}; - -export default Console; diff --git a/client/src/components/Meteor/MeteorRegion.css b/client/src/components/Meteor/MeteorRegion.css deleted file mode 100644 index 9b2cbe1..0000000 --- a/client/src/components/Meteor/MeteorRegion.css +++ /dev/null @@ -1,53 +0,0 @@ -.meteor-region-wrapper { - position: relative; - width: 100%; - height: 100%; - overflow: hidden; - display: flex; -} - -.meteor-region-content { - flex: 1; - overflow-y: auto; - padding-right: 15px; - scrollbar-width: none; - -ms-overflow-style: none; -} - -.meteor-region-content::-webkit-scrollbar { - display: none; -} - -.meteor-track-local { - position: absolute; - right: 6px; - top: 10px; - bottom: 10px; - width: 1px; - background: rgba(0, 210, 255, 0.1); - pointer-events: none; -} - -.meteor-slider-local { - position: absolute; - top: 0; - left: 50%; - margin-left: -1px; - width: 2px; - height: 60px; - background: linear-gradient(to bottom, transparent, #00d2ff, #fff); - transition: transform 0.1s linear; - will-change: transform; -} - -.meteor-glow-local { - position: absolute; - bottom: 0; - left: 50%; - transform: translateX(-50%); - width: 6px; - height: 6px; - background: #fff; - border-radius: 50%; - box-shadow: 0 0 10px #00d2ff; -} diff --git a/client/src/components/Meteor/MeteorRegion.jsx b/client/src/components/Meteor/MeteorRegion.jsx deleted file mode 100644 index 3e280d0..0000000 --- a/client/src/components/Meteor/MeteorRegion.jsx +++ /dev/null @@ -1,58 +0,0 @@ -import React, { useState, useRef, useEffect, useCallback } from "react"; -import "./MeteorRegion.css"; - -const MeteorRegion = ({ children, className = "", maxHeight }) => { - const [scrollProgress, setScrollProgress] = useState(0); - const [isVisible, setIsVisible] = useState(false); - const containerRef = useRef(null); - - const updateScroll = useCallback(() => { - const el = containerRef.current; - if (!el) return; - - const { scrollTop, scrollHeight, clientHeight } = el; - const progress = scrollTop / (scrollHeight - clientHeight); - - setScrollProgress(isNaN(progress) ? 0 : progress); - setIsVisible(scrollHeight > clientHeight); - }, []); - - useEffect(() => { - const el = containerRef.current; - if (!el) return; - - const resizeObserver = new ResizeObserver(updateScroll); - resizeObserver.observe(el); - el.addEventListener("scroll", updateScroll); - - updateScroll(); - - return () => { - resizeObserver.disconnect(); - el.removeEventListener("scroll", updateScroll); - }; - }, [updateScroll]); - - return ( -
-
- {children} -
- - {isVisible && ( -
-
-
-
-
- )} -
- ); -}; - -export default MeteorRegion; diff --git a/client/src/components/ui/Button.jsx b/client/src/components/ui/Button.jsx deleted file mode 100644 index ac17b2f..0000000 --- a/client/src/components/ui/Button.jsx +++ /dev/null @@ -1,27 +0,0 @@ -import React from "react"; -import "./styles/Button.css"; - -const Button = ({ - children, - variant = "primary", - size = "medium", - icon, - id, - onClick, - className = "", -}) => { - const fullClassName = - `galaxy-button variant-${variant} size-${size} ${className}`.trim(); - - return ( - - ); -}; - -export default Button; diff --git a/client/src/components/ui/Card.jsx b/client/src/components/ui/Card.jsx deleted file mode 100644 index f93fcf5..0000000 --- a/client/src/components/ui/Card.jsx +++ /dev/null @@ -1,14 +0,0 @@ -import React from 'react'; - -const Card = ({ title, children, className = "" }) => { - return ( -
- {title &&

{title}

} -
- {children} -
-
- ); -}; - -export default Card; diff --git a/client/src/components/ui/Input.jsx b/client/src/components/ui/Input.jsx deleted file mode 100644 index f711836..0000000 --- a/client/src/components/ui/Input.jsx +++ /dev/null @@ -1,20 +0,0 @@ - -const Input = ({ label, type = 'text', placeholder, id, ...props }) => { - return ( -
-
- {label && } - - -
-
- ); -}; - -export default Input; diff --git a/client/src/components/ui/styles/Button.css b/client/src/components/ui/styles/Button.css deleted file mode 100644 index 25e45a7..0000000 --- a/client/src/components/ui/styles/Button.css +++ /dev/null @@ -1,116 +0,0 @@ -.galaxy-button { - position: relative; - display: inline-flex; - align-items: center; - justify-content: center; - cursor: pointer; - outline: none; - - border-radius: 10px; - /* Основний фон: глибокий синій з переходом */ - background: linear-gradient(180deg, #0a243d 0%, #051626 100%); - - /* Рамка: світло-блакитна, напівпрозора */ - border: 1px solid rgba(0, 212, 255, 0.4); - border-radius: 2px; - - color: #88eaff; /* Блідо-блакитний текст */ - font-family: "Orbitron", sans-serif; - letter-spacing: 2px; - text-transform: uppercase; - transition: all 0.25s ease; - overflow: hidden; - - /* Тінь для об'єму */ - box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3); -} - -/* Куточки - тепер вони світяться блакитним */ -.galaxy-button::before, -.galaxy-button::after { - content: ""; - position: absolute; - width: 7px; - height: 7px; - border: 2px solid transparent; - transition: all 0.3s ease; - z-index: 2; -} - -.galaxy-button::before { - top: -1px; - left: -1px; - border-top-color: #00d4ff; - border-left-color: #00d4ff; -} - -.galaxy-button::after { - bottom: -1px; - right: -1px; - border-bottom-color: #00d4ff; - border-right-color: #00d4ff; -} - -/* VARIANT: PRIMARY (Яскравий блакитний неон) */ -.variant-primary { - background: linear-gradient(180deg, #0e3a5a 0%, #082336 100%); - border-color: #00d4ff; - color: #00d4ff; - font-weight: 700; -} - -.variant-primary:hover { - background: #114a73; - color: #fff; - /* Ефект підсвічування всієї кнопки */ - box-shadow: - 0 0 20px rgba(0, 212, 255, 0.4), - inset 0 0 10px rgba(0, 212, 255, 0.2); - border-color: #88eaff; -} - -/* VARIANT: SECONDARY (Спокійний синій) */ -.variant-secondary { - background: linear-gradient(180deg, #102a43 0%, #0b1d2e 100%); - border-color: rgba(0, 212, 255, 0.2); - color: rgba(0, 212, 255, 0.6); -} - -.variant-secondary:hover { - background: #163a5d; - border-color: rgba(0, 212, 255, 0.6); - color: #88eaff; -} - -/* SIZES */ -.size-large { - padding: 16px 40px; - font-size: 0.9rem; -} - -.size-medium { - padding: 12px 24px; - font-size: 0.8rem; -} - -/* CONTENT */ -.button-content { - display: flex; - align-items: center; - justify-content: center; - gap: 12px; - z-index: 3; - text-shadow: 0 0 8px rgba(0, 212, 255, 0.5); -} - -.button-icon { - font-size: 1.1em; - filter: drop-shadow(0 0 5px #00d4ff); -} - -/* ACTIVE STATE */ -.galaxy-button:active { - transform: scale(0.96); - filter: brightness(1.3); - background: #1a5c8a; -} diff --git a/client/src/config/api.js b/client/src/config/api.js deleted file mode 100644 index 5d3a7ad..0000000 --- a/client/src/config/api.js +++ /dev/null @@ -1,20 +0,0 @@ -const getActiveServer = () => { - const saved = localStorage.getItem("activeServer"); - if (!saved) return null; - try { - return JSON.parse(saved); - } catch (e) { - return null; - } -}; - -export const getServerUrl = () => { - const server = getActiveServer(); - return server ? server.connectUrl : null; -}; - -export const config = { - get serverUrl() { - return getServerUrl(); - }, -}; diff --git a/client/src/context/AuthContext.jsx b/client/src/context/AuthContext.jsx deleted file mode 100644 index 09fc9f5..0000000 --- a/client/src/context/AuthContext.jsx +++ /dev/null @@ -1,72 +0,0 @@ -import { createContext, useState } from "react"; -import axios from "axios"; - -export const AuthContext = createContext(); - -export const AuthProvider = ({ children }) => { - const API_URL = `${import.meta.env.VITE_API_URL}/api/auth`; - console.log(API_URL); - const [user, setUser] = useState(() => { - const savedUser = localStorage.getItem("user"); - return savedUser ? JSON.parse(savedUser) : null; - }); - - const [loading, setLoading] = useState(false); - - const login = async (email, password) => { - setLoading(true); - try { - const response = await axios.post(`${API_URL}/login`, { - email, - password, - }); - const data = response.data; - - localStorage.setItem("user", JSON.stringify(data)); - setUser(data); - return { success: true }; - } catch (error) { - return { - success: false, - error: error.response?.data?.message || "Login failed", - }; - } finally { - setLoading(false); - } - }; - - const register = async (username, email, password) => { - setLoading(true); - try { - const response = await axios.post(`${API_URL}/register`, { - username, - email, - password, - }); - const data = response.data; - - localStorage.setItem("user", JSON.stringify(data)); - setUser(data); - return { success: true }; - } catch (error) { - return { - success: false, - error: error.response?.data?.message || "Registration failed", - }; - } finally { - setLoading(false); - } - }; - - const logout = () => { - console.log("Logout"); - localStorage.removeItem("user"); - setUser(null); - }; - - return ( - - {children} - - ); -}; diff --git a/client/src/context/SocketContext.jsx b/client/src/context/SocketContext.jsx deleted file mode 100644 index 7771900..0000000 --- a/client/src/context/SocketContext.jsx +++ /dev/null @@ -1,85 +0,0 @@ -import React, { - createContext, - useState, - useCallback, - useRef, - useEffect, -} from "react"; -import { io } from "socket.io-client"; -import PlayerManager from "../services/PlayerManager"; // Імпортуємо менеджер - -export const SocketContext = createContext(null); - -export const SocketProvider = ({ children }) => { - const [socket, setSocket] = useState(null); - const [isConnected, setIsConnected] = useState(false); - - const socketRef = useRef(null); - - const connectToServer = useCallback((url, token) => { - if (socketRef.current?.connected) { - return socketRef.current; - } - - const userInfo = JSON.parse(localStorage.getItem("user")); - const newSocket = io(url.replace("/game-api", ""), { - path: "/socket.io/", - auth: { token, username: userInfo?.username }, - transports: ["websocket"], - reconnectionAttempts: 5, - }); - - newSocket.on("connect", () => { - console.log("✅ Connected with ID:", newSocket.id); - setIsConnected(true); - }); - - newSocket.on("session:ready", (data) => { - PlayerManager.setInitialState(data.onlinePlayers, data.offlinePlayers); - }); - - newSocket.on("player:joined", (data) => { - PlayerManager.handlePlayerJoined(data.username); - }); - - newSocket.on("player:left", (data) => { - PlayerManager.handlePlayerLeft(data.username); - }); - - newSocket.on("disconnect", (reason) => { - setIsConnected(false); - }); - - newSocket.on("connect_error", (err) => { - console.error("⚠️ Connection error:", err.message); - }); - - socketRef.current = newSocket; - setSocket(newSocket); - - return newSocket; - }, []); - - const disconnectFromServer = useCallback(() => { - if (socketRef.current) { - socketRef.current.disconnect(); - socketRef.current = null; - setSocket(null); - setIsConnected(false); - } - }, []); - - useEffect(() => { - return () => { - if (socketRef.current) socketRef.current.disconnect(); - }; - }, []); - - return ( - - {children} - - ); -}; diff --git a/client/src/hooks/useAuth.js b/client/src/hooks/useAuth.js deleted file mode 100644 index 4d623fe..0000000 --- a/client/src/hooks/useAuth.js +++ /dev/null @@ -1,10 +0,0 @@ -import { useContext } from "react"; -import { AuthContext } from "../context/AuthContext"; - -export const useAuth = () => { - const context = useContext(AuthContext); - if (!context) { - throw new Error("useAuth must be used within an AuthProvider"); - } - return context; -}; diff --git a/client/src/hooks/useSocket.js b/client/src/hooks/useSocket.js deleted file mode 100644 index 783b665..0000000 --- a/client/src/hooks/useSocket.js +++ /dev/null @@ -1,12 +0,0 @@ -import { useContext } from "react"; -import { SocketContext } from "../context/SocketContext"; - -export const useSocket = () => { - const context = useContext(SocketContext); - - if (!context) { - throw new Error("useSocket must be used within a SocketProvider"); - } - - return context; -}; diff --git a/client/src/main.jsx b/client/src/main.jsx deleted file mode 100644 index 9c07013..0000000 --- a/client/src/main.jsx +++ /dev/null @@ -1,18 +0,0 @@ -import React from "react"; -import ReactDOM from "react-dom/client"; -import App from "./App"; -import "./styles/components.css"; -import "./styles/tables.css"; -import "./styles/main.css"; -import { AuthProvider } from "./context/AuthContext"; -import { SocketContext, SocketProvider } from "./context/SocketContext"; - -ReactDOM.createRoot(document.getElementById("root")).render( - - - - - - - , -); diff --git a/client/src/services/ConsoleManager.js b/client/src/services/ConsoleManager.js deleted file mode 100644 index 51cd7c4..0000000 --- a/client/src/services/ConsoleManager.js +++ /dev/null @@ -1,101 +0,0 @@ -import GameDataManager from "./GameDataManager"; - -class ConsoleManager { - constructor() { - this.commands = ["/clear", "/give", "/set_exp"]; - this.logs = ["[System] Console Manager Ready. Press F9 to hide."]; - this.history = []; - this.historyIndex = -1; - this.onLogsChange = null; - this.socket = null; - } - - init(socket, onLogsChange) { - this.socket = socket; - this.onLogsChange = onLogsChange; - - if (this.socket) { - this.socket.off("admin:log"); - this.socket.on("admin:log", (msg) => this.addLog(`[Server] ${msg}`)); - } - } - - addLog(line) { - this.logs = [...this.logs.slice(-100), line]; - if (this.onLogsChange) this.onLogsChange(this.logs); - } - - getSuggestions(input, players = []) { - const safePlayers = (players || []).filter((p) => typeof p === "string"); - - const parts = input.split(" "); - if (parts.length === 0) return []; - - const cmd = parts[0].toLowerCase(); - - if (parts.length === 1 && input.startsWith("/")) { - return this.commands.filter((c) => c.startsWith(cmd)); - } - - if (cmd === "/give") { - if (parts.length === 2) { - const search = parts[1].toLowerCase(); - return safePlayers.filter((p) => p.toLowerCase().startsWith(search)); - } - if (parts.length === 3) { - const search = parts[2].toLowerCase(); - const itemIds = Array.from(GameDataManager.items.keys()); - return itemIds - .filter((id) => id.toLowerCase().includes(search)) - .slice(0, 15); - } - } - - if (cmd === "/set_exp") { - if (parts.length === 2) { - const search = parts[1].toLowerCase(); - return safePlayers.filter((p) => p.toLowerCase().startsWith(search)); - } - } - - if (cmd === "/clear" && parts.length === 2) { - const search = parts[1].toLowerCase(); - return safePlayers.filter((p) => p.toLowerCase().startsWith(search)); - } - - return []; - } - execute(input) { - const trimmed = input.trim(); - if (!trimmed) return; - - this.addLog(`> ${trimmed}`); - - if (this.history[0] !== trimmed) { - this.history.unshift(trimmed); - if (this.history.length > 50) this.history.pop(); - } - this.historyIndex = -1; - - if (this.socket) { - this.socket.emit("admin:command", { command: trimmed }); - } - } - - getHistory(direction) { - if (this.history.length === 0) return null; - - if (direction === "up") { - this.historyIndex = Math.min( - this.historyIndex + 1, - this.history.length - 1, - ); - } else { - this.historyIndex = Math.max(this.historyIndex - 1, -1); - } - - return this.historyIndex === -1 ? "" : this.history[this.historyIndex]; - } -} - -export default new ConsoleManager(); diff --git a/client/src/services/GameDataManager.js b/client/src/services/GameDataManager.js deleted file mode 100644 index 76ebee5..0000000 --- a/client/src/services/GameDataManager.js +++ /dev/null @@ -1,239 +0,0 @@ -class GameDataManager { - constructor() { - this.items = new Map(); - this.recipes = new Map(); - this.skills = new Map(); - this.dungeons = new Map(); - this.hostiles = new Map(); - this.rooms = new Map(); - this.quests = new Map(); - this.translations = {}; - this.manifest = {}; - this.currentLang = localStorage.getItem("selected_lang") || "en_US"; - this.isLoaded = false; - } - - initialize(data) { - if (Array.isArray(data.items)) { - data.items.forEach((item) => this.items.set(item.id, item)); - } - if (Array.isArray(data.recipes)) { - data.recipes.forEach((recipe) => this.recipes.set(recipe.id, recipe)); - } - if (Array.isArray(data.dungeons)) { - data.dungeons.forEach((d) => this.dungeons.set(d.id, d)); - } - if (Array.isArray(data.enemies)) { - data.enemies.forEach((e) => this.hostiles.set(e.id, e)); - } - if (Array.isArray(data.skills)) { - data.skills.forEach((s) => this.skills.set(s.id, s)); - } - if (Array.isArray(data.rooms)) { - data.rooms.forEach((r) => this.rooms.set(r.id, r)); - } - if (Array.isArray(data.quests)) { - data.quests.forEach((q) => this.quests.set(q.id, q)); - } - - console.log(this.skills); - if (data.languages) { - this.translations = data.languages; - } - if (data.manifest) { - this.manifest = data.manifest; - } - console.log(this.manifest); - - this.isLoaded = true; - } - getSkillCategories() { - return this._getCategoriesFromManifest("skills"); - } - - getSkillsByCategory(category) { - console.log(this.skills, category, "CATEGORY"); - return Array.from(this.skills.values()) - .filter((skill) => skill.meta.category === category) - .map((skill) => ({ - ...skill, - displayName: this.t(skill.displayName), - description: this.t(skill.description), - })); - } - t(key) { - if (!key) return ""; - const langData = this.translations[this.currentLang]; - if (!langData) return key; - if (langData[key]) return langData[key]; - - if (key.includes(".")) { - const value = key - .split(".") - .reduce((obj, i) => (obj ? obj[i] : null), langData); - if (value) return value; - } - - return key; - } - - getStatName(statPath) { - const fullKey = `stats.category.original.${statPath}`; - return this.t(fullKey); - } - - _getCategoriesFromManifest(section) { - if (!this.manifest[section] || !this.manifest[section].categories) - return []; - - return Object.entries(this.manifest[section].categories).map( - ([id, config]) => ({ - id, - displayName: this.t(config.displayName), - rawConfig: config, - }), - ); - } - - getRecipeCategories() { - return this._getCategoriesFromManifest("recipes"); - } - - getShopCategories() { - return this._getCategoriesFromManifest("shop"); - } - - getSkillCategories() { - return this._getCategoriesFromManifest("skills"); - } - - getRecipesByCategory(category) { - return Array.from(this.recipes.values()) - .filter((recipe) => recipe.type === category) - .map((recipe) => this.getRecipe(recipe.id)) - .filter(Boolean); - } - - _cleanId(id) { - if (!id || typeof id !== "string") return id; - let clean = id.includes(":") ? id.split(":")[1] : id; - if (clean.includes("/")) { - const parts = clean.split("/"); - clean = parts[parts.length - 1]; - } - return clean; - } - - getHostile(id) { - const hostile = this.hostiles.get(id); - - if (!hostile) { - return { - id: id, - displayName: `Unknown Entity (${id})`, - level: 1, - stats: { hp: 100 }, - }; - } - - return { - ...hostile, - displayName: this.t(hostile.displayName), - }; - } - - getEnemy(id) { - return this.getHostile(id); - } - - getItem(id) { - const item = this.items.get(id); - - if (!item) { - return { - id: id, - displayName: id.replace(/_/g, " "), - texture: null, - description: "Data not found", - meta: { rarity: "common" }, - }; - } - return { - ...item, - displayName: this.t(item.displayName), - description: this.t(item.description), - }; - } - - getRecipe(recipeId) { - const recipe = this.recipes.get(recipeId); - if (!recipe) return null; - - const outputData = Object.entries(recipe.output || {})[0]; - const targetItemId = outputData ? outputData[0] : recipe.id; - const resultItem = this.getItem(targetItemId); - - return { - ...recipe, - displayName: resultItem.displayName, - texture: resultItem.texture, - description: resultItem.description, - ingredients: (recipe.inputs || []).map((inputObj) => { - const [itemId, quantity] = Object.entries(inputObj)[0]; - const itemInfo = this.getItem(itemId); - return { - itemId, - quantity, - ...itemInfo, - }; - }), - }; - } - - getDungeon(id) { - const dungeon = this.dungeons.get(id); - if (!dungeon) return null; - return { - ...dungeon, - displayName: this.t(dungeon.displayName), - description: this.t(dungeon.description), - }; - } - - getRoom(id) { - const room = this.rooms.get(id); - if (!room) return null; - return { - ...room, - displayName: this.t(room.displayName), - description: this.t(room.description), - }; - } - - getQuest(id) { - const quest = this.quests.get(id); - if (!quest) return null; - return { - ...quest, - displayName: this.t(quest.displayName), - description: this.t(quest.description), - objectives: (quest.objectives || []).map((obj) => ({ - ...obj, - description: obj.description ? this.t(obj.description) : "", - })), - }; - } - - getAllQuests() { - return Array.from(this.quests.values()).map((q) => this.getQuest(q.id)); - } - - setLanguage(langCode) { - if (this.translations[langCode]) { - this.currentLang = langCode; - } - } -} - -const instance = new GameDataManager(); -export default instance; diff --git a/client/src/services/PlayerManager.js b/client/src/services/PlayerManager.js deleted file mode 100644 index 3f431d9..0000000 --- a/client/src/services/PlayerManager.js +++ /dev/null @@ -1,46 +0,0 @@ -class PlayerManager { - constructor() { - this.onlinePlayers = []; - this.offlinePlayers = []; - this.listeners = new Set(); - } - - setInitialState(online, offline) { - this.onlinePlayers = online || []; - this.offlinePlayers = offline || []; - - this.notify(); - } - - handlePlayerJoined(username) { - if (!this.onlinePlayers.includes(username)) { - this.onlinePlayers.push(username); - this.offlinePlayers = this.offlinePlayers.filter((u) => u !== username); - this.notify(); - } - } - - handlePlayerLeft(username) { - this.onlinePlayers = this.onlinePlayers.filter((u) => u !== username); - if (!this.offlinePlayers.includes(username)) { - this.offlinePlayers.push(username); - } - this.notify(); - } - - subscribe(listener) { - this.listeners.add(listener); - return () => this.listeners.delete(listener); - } - - notify() { - this.listeners.forEach((listener) => - listener({ - online: this.onlinePlayers, - offline: this.offlinePlayers, - }), - ); - } -} - -export default new PlayerManager(); diff --git a/client/src/services/socket.js b/client/src/services/socket.js deleted file mode 100644 index 27007dd..0000000 --- a/client/src/services/socket.js +++ /dev/null @@ -1,10 +0,0 @@ -import { io } from 'socket.io-client'; - -const SOCKET_URL = 'http://localhost:3000'; - -export const socket = io(SOCKET_URL, { - autoConnect: false, - auth: { - token: localStorage.getItem('token') - } -}); diff --git a/client/src/styles/App.css b/client/src/styles/App.css deleted file mode 100644 index 3c2425f..0000000 --- a/client/src/styles/App.css +++ /dev/null @@ -1,324 +0,0 @@ -#root { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - text-align: center; -} - -.logo { - height: 6em; - padding: 1.5em; - will-change: filter; - transition: filter 300ms; -} - -.logo:hover { - filter: drop-shadow(0 0 2em #646cffaa); -} - -.logo.react:hover { - filter: drop-shadow(0 0 2em #61dafbaa); -} - -@keyframes logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} - -@media (prefers-reduced-motion: no-preference) { - a:nth-of-type(2) .logo { - animation: logo-spin infinite 20s linear; - } -} - -.card { - padding: 2em; -} - -.read-the-docs { - color: #888; -} - -.dash-container { - padding: 15px; - position: relative; - overflow-y: auto; - overflow-x: hidden; - height: 100%; - box-sizing: border-box; - scrollbar-gutter: stable; -} - -.dash-scanline { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 2px; - background: rgba(0, 212, 255, 0.05); - animation: scan 6s linear infinite; - pointer-events: none; - z-index: 1; -} - -@keyframes scan { - 0% { - top: 0; - } - 100% { - top: 100%; - } -} - -.dashboard-grid { - display: grid; - grid-template-columns: 1fr; - gap: 15px; - max-width: 1400px; - margin: 0 auto; - position: relative; - z-index: 2; - width: 100%; - box-sizing: border-box; - align-items: start; - overflow: hidden; -} - -.dash-card { - background: rgba(10, 15, 24, 0.95) !important; - border: 1px solid #1a2638 !important; - border-radius: 2px !important; - position: relative; - padding: 20px !important; - box-sizing: border-box; - overflow: hidden; - contain: paint; -} - -.card-tag { - position: absolute; - top: 0; - right: 0; - background: #1a2638; - color: #00d4ff; - font-size: 8px; - padding: 2px 6px; - font-weight: 900; - text-transform: uppercase; - letter-spacing: 1px; -} - -.pilot-info { - display: flex; - flex-direction: column; - gap: 15px; - margin-bottom: 15px; - align-items: flex-start; -} - -.pilot-avatar { - width: 50px; - height: 50px; - background: #05080c; - border: 1px solid #00d4ff; - display: flex; - align-items: center; - justify-content: center; - font-size: 24px; - position: relative; - color: #00d4ff; - flex-shrink: 0; -} - -.level-badge { - position: absolute; - bottom: -3px; - right: -3px; - background: #00d4ff; - color: #000; - font-size: 9px; - padding: 1px 4px; - font-weight: 900; -} - -.pilot-details { - flex: 1; - min-width: 0; - width: 100%; -} - -.pilot-details h3 { - margin: 0 0 5px 0; - font-size: 1rem; - color: #fff; - word-break: break-all; - overflow-wrap: break-word; -} - -.status-online { - font-size: 10px; - color: #4a5d75; - margin: 0; -} - -.exp-bar-container { - margin-top: 10px; -} - -.exp-labels { - display: flex; - justify-content: space-between; - font-size: 9px; - color: #4a5d75; - margin-bottom: 3px; -} - -.exp-track { - height: 3px; - background: #05080c; - border: 1px solid #1a2638; -} - -.exp-fill { - height: 100%; - background: linear-gradient(90deg, #00d4ff, #00ff88); - box-shadow: 0 0 8px rgba(0, 212, 255, 0.4); -} - -.resource-list { - display: flex; - flex-direction: column; - gap: 8px; -} - -.res-item { - display: flex; - align-items: center; - gap: 12px; - padding: 10px; - background: rgba(0, 0, 0, 0.4); - border-left: 2px solid #00d4ff; - position: relative; - contain: paint; -} - -.res-content { - display: flex; - justify-content: space-between; - align-items: center; - flex: 1; -} - -.res-label { - font-size: 9px; - color: #4a5d75; - text-transform: uppercase; -} - -.res-val { - font-size: 1rem; - font-weight: 900; - color: #fff; - font-family: "Space Mono", monospace; - position: relative; - padding-right: 25px; -} - -.credit-plus { - position: absolute; - top: 0; - right: 0; - color: #00ff88; - font-size: 0.8rem; - font-weight: 900; - pointer-events: none; - animation: floatUp 1.2s ease-out forwards; -} - -@keyframes floatUp { - 0% { - transform: translateY(5px); - opacity: 0; - } - 20% { - opacity: 1; - } - 100% { - transform: translateY(-15px); - opacity: 0; - } -} - -.diag-grid { - display: grid; - grid-template-columns: 1fr; - gap: 8px; -} - -.diag-item { - background: rgba(0, 0, 0, 0.2); - padding: 8px 12px; - border: 1px solid #1a2638; - display: flex; - justify-content: space-between; - align-items: center; -} - -.diag-status { - font-size: 10px; - color: #00ff88; - font-weight: bold; -} - -.diag-item.warning { - border-color: rgba(255, 170, 0, 0.5); -} - -.diag-item.warning .diag-status { - color: #ffaa00; -} - -.diag-status.online { - text-shadow: 0 0 5px #00ff88; -} - -@media (min-width: 600px) { - .dashboard-grid { - grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); - gap: 20px; - } - .dash-container { - padding: 20px; - } -} - -@media (min-width: 992px) { - .dashboard-grid { - grid-template-columns: repeat(3, 1fr); - } - .pilot-info { - flex-direction: row; - align-items: center; - } - .pilot-details h3 { - font-size: 1.1rem; - word-break: normal; - } - .diag-grid { - grid-template-columns: 1fr 1fr; - } -} - -*::-webkit-scrollbar { - width: 0px; - background: transparent; -} - -* { - scrollbar-width: none; - -ms-overflow-style: none; -} diff --git a/client/src/styles/components.css b/client/src/styles/components.css deleted file mode 100644 index b7d7d04..0000000 --- a/client/src/styles/components.css +++ /dev/null @@ -1,1780 +0,0 @@ -/* Galaxy Strike Online - Component Styles */ - -/* Health Bars */ -.health-bar { - margin: 1rem 0; - padding: 0.75rem; - border-radius: 8px; - background: rgba(0, 0, 0, 0.3); - border: 1px solid rgba(255, 255, 255, 0.1); -} - -.health-label { - font-size: 0.9rem; - font-weight: 600; - margin-bottom: 0.5rem; - color: #fff; - text-transform: uppercase; - letter-spacing: 1px; -} - -.ship-health .health-label { - color: #4a9eff; -} - -.player-health .health-label { - color: #4ade80; -} - -.ship-health-fill { - background: linear-gradient(90deg, #4a9eff, #00d4ff); - border-radius: 4px; - transition: width 0.3s ease; -} - -.player-health-fill { - background: linear-gradient(90deg, #4ade80, #22c55e); - border-radius: 4px; - transition: width 0.3s ease; -} - -.health-bar span { - display: block; - text-align: center; - margin-top: 0.5rem; - font-size: 0.85rem; - color: rgba(255, 255, 255, 0.8); -} - -/* Progress bars */ -.progress-bar { - width: 100%; - height: 20px; - background: rgba(255, 255, 255, 0.1); - border-radius: 4px; - overflow: hidden; - position: relative; -} - -.progress-fill { - height: 100%; - transition: width 0.3s ease; - min-width: 2px; -} - -/* Ship Stats Display */ -.current-ship-stats { - background: rgba(0, 0, 0, 0.3); - border: 1px solid rgba(255, 255, 255, 0.1); - border-radius: 8px; - padding: 1rem; - margin-bottom: 1rem; -} - -.stat-row { - display: flex; - justify-content: space-between; - align-items: center; - padding: 0.5rem 0; - border-bottom: 1px solid rgba(255, 255, 255, 0.05); -} - -.stat-row:last-child { - border-bottom: none; -} - -.stat-label { - color: #4a9eff; - font-weight: 600; - text-transform: uppercase; - letter-spacing: 1px; - font-size: 0.85rem; -} - -.stat-value { - color: #fff; - font-weight: 700; - font-size: 0.9rem; -} - -/* Buttons */ -.btn { - padding: 0.75rem 1.5rem; - border: none; - border-radius: 8px; - font-family: "Space Mono", monospace; - font-weight: 700; - cursor: pointer; - transition: all 0.3s ease; - text-transform: uppercase; - letter-spacing: 1px; - position: relative; - overflow: hidden; -} - -.btn::before { - content: ""; - position: absolute; - top: 0; - left: -100%; - width: 100%; - height: 100%; - background: linear-gradient( - 90deg, - transparent, - rgba(255, 255, 255, 0.2), - transparent - ); - transition: left 0.5s ease; -} - -.btn:hover::before { - left: 100%; -} - -.btn-primary { - background: var(--gradient-primary); - color: var(--bg-primary); - box-shadow: 0 4px 15px rgba(0, 212, 255, 0.3); -} - -.btn-primary:hover { - transform: translateY(-2px); - box-shadow: 0 6px 20px rgba(0, 212, 255, 0.4); -} - -.btn-secondary { - background: var(--bg-tertiary); - color: var(--text-primary); - border: 1px solid var(--border-color); -} - -.btn-secondary:hover { - border-color: var(--primary-color); - background: var(--hover-bg); -} - -.btn-success { - background: linear-gradient(135deg, #00ff88, #00cc66); - color: var(--bg-primary); - box-shadow: 0 4px 15px rgba(0, 255, 136, 0.3); -} - -.btn-warning { - background: linear-gradient(135deg, #ffaa00, #ff8800); - color: var(--bg-primary); - box-shadow: 0 4px 15px rgba(255, 170, 0, 0.3); -} - -.btn-danger { - background: linear-gradient(135deg, #ff3366, #ff0033); - color: var(--bg-primary); - box-shadow: 0 4px 15px rgba(255, 51, 102, 0.3); -} - -.btn:disabled { - opacity: 0.5; - cursor: not-allowed; - transform: none !important; -} - -/* Modals */ -.modal-overlay { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: rgba(0, 0, 0, 0.8); - display: flex; - align-items: center; - justify-content: center; - z-index: 1000; - backdrop-filter: blur(5px); -} - -.modal { - background: var(--bg-secondary); - border: 1px solid var(--border-color); - border-radius: 16px; - max-width: 600px; - width: 90%; - max-height: 80vh; - overflow-y: auto; - box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5); - animation: modalSlideIn 0.3s ease; -} - -@keyframes modalSlideIn { - from { - opacity: 0; - transform: translateY(-50px) scale(0.9); - } - to { - opacity: 1; - transform: translateY(0) scale(1); - } -} - -.modal-header { - padding: 1.5rem; - border-bottom: 1px solid var(--border-color); - display: flex; - justify-content: space-between; - align-items: center; -} - -.modal-header h3 { - color: var(--primary-color); - font-family: "Orbitron", sans-serif; - font-weight: 700; - text-transform: uppercase; - letter-spacing: 1px; -} - -.modal-close { - background: transparent; - border: none; - color: var(--text-secondary); - font-size: 1.5rem; - cursor: pointer; - transition: all 0.3s ease; - padding: 0.5rem; -} - -.modal-close:hover { - color: var(--error-color); - transform: rotate(90deg); -} - -.modal-body { - padding: 1.5rem; -} - -/* Alert Modal Styles */ -.alert-modal .modal-header h3 { - color: var(--primary-color); -} - -.alert-modal .modal-body { - text-align: center; - padding: 2rem 1.5rem; -} - -.alert-modal .alert-message { - color: var(--text-primary); - font-size: 1rem; - line-height: 1.5; - margin-bottom: 1.5rem; - white-space: pre-line; -} - -.alert-modal .modal-footer { - padding: 0 1.5rem 1.5rem; - text-align: center; -} - -.alert-modal .btn-alert { - background: var(--gradient-primary); - color: white; - border: none; - padding: 0.75rem 2rem; - border-radius: 8px; - font-weight: 600; - cursor: pointer; - transition: all 0.3s ease; - text-transform: uppercase; - letter-spacing: 1px; -} - -.alert-modal .btn-alert:hover { - transform: translateY(-2px); - box-shadow: 0 8px 25px rgba(0, 212, 255, 0.3); -} - -/* Success Alert */ -.alert-modal.success .modal-header h3 { - color: var(--success-color); -} - -.alert-modal.success .btn-alert { - background: var(--success-color); -} - -/* Error Alert */ -.alert-modal.error .modal-header h3 { - color: var(--error-color); -} - -.alert-modal.error .btn-alert { - background: var(--error-color); -} - -/* Warning Alert */ -.alert-modal.warning .modal-header h3 { - color: var(--warning-color); -} - -.alert-modal.warning .btn-alert { - background: var(--warning-color); -} - -/* Confirmation Modal Styles */ -.confirmation-modal .modal-body { - text-align: center; - padding: 2rem 1.5rem; -} - -.confirmation-modal .confirm-message { - color: var(--text-primary); - font-size: 1rem; - line-height: 1.5; - margin-bottom: 1.5rem; - white-space: pre-line; -} - -.confirmation-modal .modal-footer { - padding: 0 1.5rem 1.5rem; - display: flex; - gap: 1rem; - justify-content: center; -} - -.confirmation-modal .btn-confirm { - background: var(--error-color); - color: white; - border: none; - padding: 0.75rem 1.5rem; - border-radius: 8px; - font-weight: 600; - cursor: pointer; - transition: all 0.3s ease; - text-transform: uppercase; - letter-spacing: 1px; -} - -.confirmation-modal .btn-confirm:hover { - transform: translateY(-2px); - box-shadow: 0 8px 25px rgba(255, 51, 102, 0.3); -} - -.confirmation-modal .btn-cancel { - background: var(--bg-tertiary); - color: var(--text-primary); - border: 1px solid var(--border-color); - padding: 0.75rem 1.5rem; - border-radius: 8px; - font-weight: 600; - cursor: pointer; - transition: all 0.3s ease; - text-transform: uppercase; - letter-spacing: 1px; -} - -.confirmation-modal .btn-cancel:hover { - background: var(--hover-bg); - border-color: var(--primary-color); -} - -/* Settings Menu Styles */ -.settings-menu { - max-width: 600px; - margin: 0 auto; -} - -.settings-section { - margin-bottom: 2rem; - padding: 1.5rem; - background: var(--bg-tertiary); - border-radius: 12px; - border: 1px solid var(--border-color); -} - -.settings-section h3 { - color: var(--primary-color); - font-family: "Orbitron", sans-serif; - font-weight: 700; - text-transform: uppercase; - letter-spacing: 1px; - margin-bottom: 1rem; - font-size: 1.2rem; -} - -.settings-section h4 { - color: var(--text-primary); - font-family: "Orbitron", sans-serif; - font-weight: 600; - margin-bottom: 0.5rem; - font-size: 1rem; -} - -.settings-section p { - color: var(--text-secondary); - margin-bottom: 1rem; - line-height: 1.5; -} - -.setting-group { - margin-bottom: 1.5rem; -} - -.setting-group label { - display: block; - color: var(--text-primary); - font-weight: 600; - margin-bottom: 0.5rem; - font-size: 0.9rem; -} - -.setting-select { - width: 100%; - padding: 0.75rem; - background: var(--bg-secondary); - border: 1px solid var(--border-color); - border-radius: 8px; - color: var(--text-primary); - font-size: 0.9rem; - cursor: pointer; - transition: all 0.3s ease; -} - -.setting-select:hover { - border-color: var(--primary-color); - box-shadow: 0 0 0 2px rgba(74, 158, 255, 0.1); -} - -.setting-select:focus { - outline: none; - border-color: var(--primary-color); - box-shadow: 0 0 0 2px rgba(74, 158, 255, 0.2); -} - -.setting-actions { - display: flex; - gap: 1rem; - justify-content: flex-end; - margin-top: 1rem; -} - -.settings-description { - margin-bottom: 1rem; -} - -.reset-options { - display: flex; - flex-direction: column; - gap: 1rem; -} - -.reset-option { - padding: 1rem; - background: var(--bg-secondary); - border-radius: 8px; - border: 1px solid var(--border-color); -} - -.reset-option h4 { - color: var(--warning-color); - margin-bottom: 0.5rem; -} - -.reset-option p { - margin-bottom: 0.5rem; -} - -.reset-option ul { - margin: 0.5rem 0; - padding-left: 1.5rem; - color: var(--text-secondary); - font-size: 0.85rem; -} - -.reset-option li { - margin-bottom: 0.25rem; -} - -/* Progress Bars */ -.progress-bar { - width: 100%; - height: 8px; - background: var(--bg-tertiary); - border-radius: 4px; - overflow: hidden; - position: relative; -} - -.progress-fill { - height: 100%; - background: var(--gradient-primary); - border-radius: 4px; - transition: width 0.3s ease; - position: relative; -} - -.progress-fill::after { - content: ""; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: linear-gradient( - 90deg, - transparent, - rgba(255, 255, 255, 0.3), - transparent - ); - animation: progressShine 2s infinite; -} - -@keyframes progressShine { - 0% { - transform: translateX(-100%); - } - 100% { - transform: translateX(100%); - } -} - -/* Tooltips */ -.tooltip { - position: relative; - cursor: help; -} - -.tooltip::before { - content: attr(data-tooltip); - position: absolute; - bottom: 125%; - left: 50%; - transform: translateX(-50%); - background: var(--bg-tertiary); - color: var(--text-primary); - padding: 0.5rem 1rem; - border-radius: 6px; - border: 1px solid var(--border-color); - font-size: 0.8rem; - white-space: nowrap; - opacity: 0; - pointer-events: none; - transition: opacity 0.3s ease; - z-index: 1000; -} - -.tooltip::after { - content: ""; - position: absolute; - bottom: -5px; - left: 50%; - transform: translateX(-50%); - border-left: 5px solid transparent; - border-right: 5px solid transparent; - border-top: 5px solid var(--border-color); - opacity: 0; - pointer-events: none; - transition: opacity 0.3s ease; -} - -.tooltip:hover::before, -.tooltip:hover::after { - opacity: 1; -} - -/* Notifications */ -.notification { - position: fixed; - top: 20px; - right: 20px; - padding: 1rem 1.5rem; - border-radius: 8px; - border: 1px solid var(--border-color); - background: var(--bg-secondary); - color: var(--text-primary); - box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3); - z-index: 2000; - animation: notificationSlideIn 0.3s ease; - max-width: 300px; -} - -@keyframes notificationSlideIn { - from { - opacity: 0; - transform: translateX(100%); - } - to { - opacity: 1; - transform: translateX(0); - } -} - -.notification.success { - border-color: var(--success-color); - background: linear-gradient( - 135deg, - rgba(0, 255, 136, 0.1), - rgba(0, 204, 102, 0.1) - ); -} - -.notification.warning { - border-color: var(--warning-color); - background: linear-gradient( - 135deg, - rgba(255, 170, 0, 0.1), - rgba(255, 136, 0, 0.1) - ); -} - -.notification.error { - border-color: var(--error-color); - background: linear-gradient( - 135deg, - rgba(255, 51, 102, 0.1), - rgba(255, 0, 51, 0.1) - ); -} - -.notification.info { - border-color: var(--primary-color); - background: linear-gradient( - 135deg, - rgba(0, 212, 255, 0.1), - rgba(0, 153, 204, 0.1) - ); -} - -/* Base Navigation Buttons - Match Quest Tab Style */ -.base-navigation { - display: flex; - gap: 0.5rem; - margin-bottom: 2rem; - justify-content: center; -} - -.base-nav-btn { - padding: 0.75rem 1.5rem; - background: var(--bg-tertiary); - border: 1px solid var(--border-color); - border-radius: 8px; - color: var(--text-secondary); - cursor: pointer; - transition: all 0.3s ease; -} - -.base-nav-btn:hover { - border-color: var(--primary-color); - color: var(--text-primary); -} - -.base-nav-btn.active { - background: var(--gradient-primary); - color: var(--bg-primary); - border-color: transparent; -} - -/* Base Rooms Grid - Smaller to prevent scrolling */ -.base-rooms { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); - gap: 0.75rem; - padding: 0.5rem; -} - -.room-item { - background: var(--bg-tertiary); - border: 1px solid var(--border-color); - border-radius: 8px; - padding: 0.75rem; - cursor: pointer; - transition: all 0.3s ease; - text-align: center; - min-height: 80px; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; -} - -.room-item:hover { - border-color: var(--primary-color); - transform: translateY(-2px); -} - -.room-item i { - font-size: 1.5rem; - margin-bottom: 0.5rem; - color: var(--primary-color); -} - -.room-item h4 { - margin: 0; - color: var(--text-primary); - font-size: 0.8rem; - font-weight: 600; -} - -.room-item p { - margin: 0.25rem 0 0 0; - color: var(--text-secondary); - font-size: 0.7rem; -} - -/* Base Visualization */ -.base-visualization-container { - display: grid; - grid-template-columns: 1fr 300px; - gap: 1rem; - height: calc(100vh - 280px); -} - -#baseCanvas { - background: var(--card-bg); - border: 1px solid var(--border-color); - border-radius: 12px; - width: 100%; - height: 100%; -} - -.base-info-overlay { - display: flex; - flex-direction: column; - gap: 1rem; -} - -.base-stats-overlay { - background: var(--card-bg); - border: 1px solid var(--border-color); - border-radius: 12px; - padding: 1rem; - overflow-y: auto; - max-height: calc(100vh - 320px); -} - -.base-stats-overlay h3 { - margin: 0 0 1rem 0; - color: var(--text-primary); - font-size: 1.1rem; - font-weight: 600; -} - -#baseInfoDisplay { - color: var(--text-secondary); - font-size: 0.9rem; - line-height: 1.4; -} - -/* Loading Progress Indicator */ -.loading-indicator { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 4px; - background: linear-gradient( - 90deg, - var(--primary-color) 0%, - rgba(0, 212, 255, 0.3) 50%, - var(--primary-color) 100% - ); - background-size: 200% 100%; - animation: loading-gradient 2s ease-in-out infinite; - z-index: 10000; - transition: opacity 0.3s ease; -} - -.loading-indicator.hidden { - opacity: 0; - pointer-events: none; -} - -.loading-indicator.complete { - background: linear-gradient(90deg, #4caf50 0%, #45a049 100%); - animation: none; -} - -.loading-indicator.error { - background: linear-gradient(90deg, #f44336 0%, #d32f2f 100%); - animation: none; -} - -@keyframes loading-gradient { - 0% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } - 100% { - background-position: 0% 50%; - } -} - -/* Loading Status Text */ -.loading-status { - position: fixed; - top: 10px; - left: 50%; - transform: translateX(-50%); - background: var(--card-bg); - border: 1px solid var(--border-color); - border-radius: 8px; - padding: 8px 16px; - color: var(--text-primary); - font-size: 0.9rem; - font-weight: 500; - z-index: 10001; - transition: all 0.3s ease; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); -} - -.loading-status.error { - background: linear-gradient(90deg, #f44336 0%, #d32f2f 100%); - color: white; - border-color: #d32f2f; -} - -.loading-status.hidden { - opacity: 0; - transform: translateX(-50%) translateY(-20px); -} - -/* Starbase Bonus Inventory Slots */ -.inventory-slot.starbase-bonus-slot { - border: 2px solid var(--primary-color); - background: rgba(0, 212, 255, 0.1); - position: relative; -} - -.inventory-slot.starbase-bonus-slot::before { - content: "+"; - position: absolute; - top: 2px; - right: 2px; - background: var(--primary-color); - color: white; - width: 12px; - height: 12px; - border-radius: 50%; - font-size: 8px; - display: flex; - align-items: center; - justify-content: center; - font-weight: bold; -} - -/* Starbases Container - Side-by-Side Box Layout */ -.starbases-container { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 1rem; - height: calc(100vh - 320px); /* Adjusted for titles outside boxes */ - max-height: calc(100vh - 320px); - overflow: hidden; /* Prevent container from scrolling */ -} - -.starbase-section { - display: flex; - flex-direction: column; - height: 100%; -} - -.starbase-section h3 { - margin: 0 0 1rem 0; - color: var(--text-primary); - font-size: 1.1rem; - font-weight: 600; - flex-shrink: 0; /* Prevent title from shrinking */ -} - -.starbase-list { - background: var(--card-bg); - border: 1px solid var(--border-color); - border-radius: 12px; - padding: 1rem; - overflow-y: scroll; /* Always show scrollbar */ - flex: 1; - min-height: 0; /* Allow flex item to shrink */ -} - -.starbase-shop { - background: var(--card-bg); - border: 1px solid var(--border-color); - border-radius: 12px; - padding: 1rem; - overflow-y: scroll; /* Always show scrollbar */ - flex: 1; - min-height: 0; /* Allow flex item to shrink */ -} - -.starbase-purchase-list { - overflow-y: scroll; /* Always show scrollbar */ - max-height: calc(100vh - 400px); /* Fixed height to ensure scrolling */ - min-height: 200px; /* Minimum height to show scrollbar */ -} - -/* Add scrollbar styling for purchase list */ -.starbase-purchase-list::-webkit-scrollbar { - width: 8px; -} - -.starbase-purchase-list::-webkit-scrollbar-track { - background: var(--bg-secondary); - border-radius: 4px; -} - -.starbase-purchase-list::-webkit-scrollbar-thumb { - background: var(--primary-color); - border-radius: 4px; -} - -.starbase-purchase-list::-webkit-scrollbar-thumb:hover { - background: var(--primary-color); - opacity: 0.8; -} - -/* Ensure scrollbars are visible */ -.starbase-list::-webkit-scrollbar, -.starbase-shop::-webkit-scrollbar { - width: 8px; -} - -.starbase-list::-webkit-scrollbar-track, -.starbase-shop::-webkit-scrollbar-track { - background: var(--bg-secondary); - border-radius: 4px; -} - -.starbase-list::-webkit-scrollbar-thumb, -.starbase-shop::-webkit-scrollbar-thumb { - background: var(--primary-color); - border-radius: 4px; -} - -.starbase-list::-webkit-scrollbar-thumb:hover, -.starbase-shop::-webkit-scrollbar-thumb:hover { - background: var(--primary-color); - opacity: 0.8; -} - -.starbase-item { - background: var(--bg-tertiary); - border: 1px solid var(--border-color); - border-radius: 8px; - padding: 1rem; - margin-bottom: 0.75rem; - cursor: pointer; - transition: all 0.3s ease; - max-height: 150px; - overflow-y: auto; -} - -.starbase-item:hover { - border-color: var(--primary-color); - transform: translateY(-2px); -} - -.starbase-item h4 { - margin: 0 0 0.5rem 0; - color: var(--text-primary); - font-size: 0.9rem; -} - -.starbase-item p { - margin: 0; - color: var(--text-secondary); - font-size: 0.8rem; -} - -.starbase-item .stats { - margin-top: 0.5rem; - font-size: 0.75rem; - color: var(--text-secondary); -} - -.starbase-item .level { - color: var(--primary-color); - font-weight: 600; -} - -.starbase-item .description { - margin-top: 0.25rem; - line-height: 1.3; - max-height: 60px; - overflow-y: auto; - padding-right: 0.5rem; -} - -/* Base Upgrades Grid Layout */ -.upgrade-list { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); - gap: 1rem; - max-height: 400px; - overflow-y: auto; - padding: 0.5rem; -} - -.upgrade-item { - background: var(--bg-tertiary); - border: 1px solid var(--border-color); - border-radius: 8px; - padding: 1rem; - cursor: pointer; - transition: all 0.3s ease; -} - -.upgrade-item:hover { - border-color: var(--primary-color); - transform: translateY(-2px); -} - -.upgrade-item h4 { - margin: 0 0 0.5rem 0; - color: var(--text-primary); - font-size: 0.9rem; -} - -.upgrade-item p { - margin: 0; - color: var(--text-secondary); - font-size: 0.8rem; -} - -.upgrade-item .cost { - margin-top: 0.5rem; - color: var(--primary-color); - font-weight: 600; - font-size: 0.85rem; -} - -/* Custom Title Bar */ -.title-bar { - position: fixed; - top: 0; - left: 0; - right: 0; - height: 32px; - background: var(--bg-primary); - border-bottom: 1px solid var(--border-color); - display: flex; - justify-content: space-between; - align-items: center; - padding: 0 8px; - z-index: 10000; - -webkit-app-region: drag; - user-select: none; -} - -.title-bar-left { - display: flex; - align-items: center; -} - -.title-bar-title { - font-size: 14px; - font-weight: 600; - color: var(--text-primary); - font-family: "Orbitron", monospace; -} - -.title-bar-right { - display: flex; - gap: 4px; -} - -.title-bar-btn { - width: 24px; - height: 24px; - border: none; - background: transparent; - color: var(--text-primary); - border-radius: 4px; - cursor: pointer; - display: flex; - align-items: center; - justify-content: center; - font-size: 12px; - -webkit-app-region: no-drag; - transition: all 0.2s ease; -} - -.title-bar-btn:hover { - background: var(--bg-secondary); -} - -.title-bar-btn.close-btn:hover { - background: #e74c3c; - color: white; -} - -/* Adjust main content to account for title bar */ -#app { - margin-top: 32px; -} - -/* Fullscreen styles */ -body.fullscreen .title-bar { - display: none; -} - -body.fullscreen #app { - margin-top: 0; -} - -body.fullscreen .game-interface, -body.fullscreen .main-content { - height: 100vh !important; - max-height: 100vh !important; -} - -body.fullscreen .dashboard-grid, -body.fullscreen .dungeons-container, -body.fullscreen .skills-container, -body.fullscreen .base-container, -body.fullscreen .quests-container, -body.fullscreen .inventory-container, -body.fullscreen .shop-container { - height: calc(100vh - 120px) !important; - overflow-y: auto; -} - -/* Inventory Slots - Responsive & Larger */ -.inventory-slot { - width: clamp(160px, 14vw, 280px); - height: clamp(160px, 14vw, 280px); - min-width: 160px; - min-height: 160px; - max-width: 280px; - max-height: 280px; - background: var(--bg-secondary); - border: 1px solid var(--border-color); - border-radius: 8px; - display: flex; - align-items: center; - justify-content: center; - position: relative; -} - -/* Item Cards - Square */ -.item-card { - width: 100%; - height: 100%; - background: var(--bg-tertiary); - border: 1px solid var(--border-color); - border-radius: 8px; - padding: 0.5rem; - cursor: pointer; - transition: all 0.3s ease; - position: relative; - overflow: hidden; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; -} - -.item-card::before { - content: ""; - position: absolute; - top: 0; - left: 0; - right: 0; - height: 2px; - background: var(--gradient-primary); - transform: scaleX(0); - transition: transform 0.3s ease; -} - -.item-card:hover { - border-color: var(--primary-color); - transform: translateY(-2px); - box-shadow: 0 5px 15px rgba(0, 212, 255, 0.2); -} - -.item-card:hover::before { - transform: scaleX(1); -} - -.item-card.common { - border-color: #888; -} - -.item-card.rare { - border-color: #0088ff; - box-shadow: 0 0 10px rgba(0, 136, 255, 0.3); -} - -.item-card.epic { - border-color: #8833ff; - box-shadow: 0 0 15px rgba(136, 51, 255, 0.3); -} - -.item-card.legendary { - border-color: #ff8800; - box-shadow: 0 0 20px rgba(255, 136, 0, 0.3); -} - -/* Item Icon - Centered & Responsive */ -.item-icon { - flex: 1; - display: flex; - align-items: center; - justify-content: center; - margin-bottom: 0.5rem; -} - -.item-icon img, -.item-icon i { - max-width: 50%; - max-height: 50%; - width: 50%; - height: 50%; - min-width: 80px; - min-height: 80px; - max-width: 160px; - max-height: 160px; - object-fit: contain; -} - -/* Item Info - Compact & Responsive */ -.item-info { - text-align: center; - font-size: clamp(0.6rem, 1.5vw, 0.9rem); - line-height: 1; -} - -.item-name { - font-weight: 600; - margin-bottom: 0.2rem; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - max-width: 100%; -} - -.item-rarity { - font-size: clamp(0.5rem, 1.2vw, 0.7rem); - opacity: 0.8; -} - -/* Item Quantity Badge - Responsive */ -.item-quantity { - position: absolute; - top: 4px; - right: 4px; - background: var(--primary-color); - color: white; - font-size: clamp(0.5rem, 1.2vw, 0.7rem); - font-weight: bold; - padding: clamp(2px, 0.5vw, 6px) clamp(4px, 0.8vw, 12px); - border-radius: 6px; - min-width: clamp(20px, 3vw, 32px); - text-align: center; -} - -/* Skill Items */ -.skill-item { - background: var(--bg-tertiary); - border: 1px solid var(--border-color); - border-radius: 8px; - padding: 1.5rem; - cursor: pointer; - transition: all 0.3s ease; -} - -.skill-item:hover { - border-color: var(--primary-color); - transform: translateY(-2px); - box-shadow: 0 5px 15px rgba(0, 212, 255, 0.2); -} - -.skill-item.locked { - opacity: 0.5; - cursor: not-allowed; -} - -.skill-item.locked:hover { - transform: none; - box-shadow: none; - border-color: var(--border-color); -} - -.skill-header { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 0.5rem; -} - -.skill-name { - font-weight: 700; - color: var(--text-primary); -} - -.skill-level { - color: var(--primary-color); - font-weight: 700; -} - -.skill-description { - color: var(--text-secondary); - font-size: 0.9rem; - margin-bottom: 1rem; -} - -.skill-progress { - margin-top: 0.5rem; -} - -/* Quest Items */ -.quest-item { - background: var(--bg-tertiary); - border: 1px solid var(--border-color); - border-radius: 8px; - padding: 1.5rem; - cursor: pointer; - transition: all 0.3s ease; -} - -.quest-item:hover { - border-color: var(--primary-color); - transform: translateY(-2px); - box-shadow: 0 5px 15px rgba(0, 212, 255, 0.2); -} - -.quest-item.completed { - border-color: var(--success-color); - background: linear-gradient( - 135deg, - rgba(0, 255, 136, 0.1), - rgba(0, 204, 102, 0.1) - ); -} - -.quest-header { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 0.5rem; -} - -.quest-title { - font-weight: 700; - color: var(--text-primary); -} - -.quest-reward { - color: var(--warning-color); - font-weight: 700; -} - -.quest-description { - color: var(--text-secondary); - font-size: 0.9rem; - margin-bottom: 1rem; -} - -.quest-progress { - margin-top: 0.5rem; -} - -/* Dungeon Items */ -.dungeon-item { - background: var(--bg-tertiary); - border: 1px solid var(--border-color); - border-radius: 8px; - padding: 1rem; - cursor: pointer; - transition: all 0.3s ease; -} - -.dungeon-item:hover { - border-color: var(--primary-color); - transform: translateY(-2px); - box-shadow: 0 5px 15px rgba(0, 212, 255, 0.2); -} - -.dungeon-item.selected { - border-color: var(--primary-color); - background: rgba(0, 212, 255, 0.2); -} - -.dungeon-name { - font-weight: 700; - color: var(--text-primary); - margin-bottom: 0.25rem; -} - -.dungeon-difficulty { - font-size: 0.8rem; - margin-bottom: 0.25rem; -} - -.dungeon-difficulty.easy { - color: var(--success-color); -} - -.dungeon-difficulty.medium { - color: var(--warning-color); -} - -.dungeon-difficulty.hard { - color: var(--error-color); -} - -.dungeon-rewards { - font-size: 0.8rem; - color: var(--text-secondary); -} - -/* Collapsible Dungeon Sections */ -.dungeon-section { - margin-bottom: 1rem; - border: 1px solid var(--border-color); - border-radius: 8px; - overflow: hidden; - background: var(--bg-secondary); -} - -.difficulty-header.collapsible { - padding: 1rem; - cursor: pointer; - user-select: none; - display: flex; - justify-content: space-between; - align-items: center; - transition: background-color 0.3s ease; - margin: 0; - border: none; - border-radius: 0; -} - -.difficulty-header.collapsible:hover { - background: var(--bg-tertiary); -} - -.header-content { - display: flex; - align-items: center; - gap: 0.5rem; -} - -.header-content i { - font-size: 1.2rem; -} - -.header-content span { - font-weight: 600; - font-size: 1.1rem; -} - -.dungeon-count { - background: rgba(255, 255, 255, 0.2); - padding: 0.2rem 0.5rem; - border-radius: 12px; - font-size: 0.8rem; - font-weight: 600; - min-width: 2rem; - text-align: center; -} - -.collapse-indicator { - transition: transform 0.3s ease; - background: rgba(255, 255, 255, 0.1); - width: 2rem; - height: 2rem; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; -} - -.collapse-indicator i { - font-size: 0.9rem; - color: rgba(255, 255, 255, 0.9); -} - -.difficulty-header.collapsible:hover .collapse-indicator { - background: rgba(255, 255, 255, 0.2); - transform: scale(1.1); -} - -.dungeon-content { - padding: 0 1rem 1rem; - max-height: 2000px; - overflow: hidden; - transition: all 0.3s ease; - opacity: 1; -} - -.dungeon-content.collapsed { - max-height: 0; - padding: 0 1rem; - opacity: 0; -} - -/* Difficulty-specific colors for collapsible headers */ -.difficulty-header.tutorial { - background: linear-gradient(135deg, var(--info-color), #2c5aa0); - color: white; -} - -.difficulty-header.easy { - background: linear-gradient(135deg, var(--success-color), #27ae60); - color: white; -} - -.difficulty-header.medium { - background: linear-gradient(135deg, var(--warning-color), #f39c12); - color: white; -} - -.difficulty-header.hard { - background: linear-gradient(135deg, var(--error-color), #e74c3c); - color: white; -} - -.difficulty-header.extreme { - background: linear-gradient(135deg, #8e44ad, #9b59b6); - color: white; -} - -/* Enhanced Dungeon Items in Collapsible Sections */ -.dungeon-content .dungeon-item { - margin-bottom: 0.75rem; - border-left: 4px solid transparent; - transition: all 0.3s ease; -} - -.dungeon-content .dungeon-item:hover { - border-left-color: var(--primary-color); - transform: translateX(4px); -} - -.dungeon-content .dungeon-item:last-child { - margin-bottom: 0; -} - -/* Shop Items */ -.shop-item { - background: var(--bg-tertiary); - border: 1px solid var(--border-color); - border-radius: 8px; - padding: 1.5rem; - transition: all 0.3s ease; -} - -.shop-item:hover { - border-color: var(--primary-color); - transform: translateY(-2px); - box-shadow: 0 5px 15px rgba(0, 212, 255, 0.2); -} - -.shop-item.purchased { - opacity: 0.5; - cursor: not-allowed; -} - -.shop-item.purchased:hover { - transform: none; - box-shadow: none; - border-color: var(--border-color); -} - -.shop-name { - font-weight: 700; - color: var(--text-primary); - margin-bottom: 0.5rem; -} - -.shop-description { - color: var(--text-secondary); - font-size: 0.9rem; - margin-bottom: 1rem; -} - -.shop-price { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 1rem; -} - -.shop-cost { - color: var(--warning-color); - font-weight: 700; -} - -/* Loading States */ -.loading { - position: relative; - overflow: hidden; -} - -.loading::after { - content: ""; - position: absolute; - top: 0; - left: -100%; - width: 100%; - height: 100%; - background: linear-gradient( - 90deg, - transparent, - rgba(0, 212, 255, 0.2), - transparent - ); - animation: loadingShine 1.5s infinite; -} - -@keyframes loadingShine { - 0% { - left: -100%; - } - 100% { - left: 100%; - } -} - -/* Animations */ -@keyframes pulse { - 0%, - 100% { - opacity: 1; - } - 50% { - opacity: 0.5; - } -} - -@keyframes bounce { - 0%, - 100% { - transform: translateY(0); - } - 50% { - transform: translateY(-10px); - } -} - -@keyframes rotate { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} - -@keyframes glow { - 0%, - 100% { - box-shadow: 0 0 5px rgba(0, 212, 255, 0.5); - } - 50% { - box-shadow: 0 0 20px rgba(0, 212, 255, 0.8); - } -} - -.pulse { - animation: pulse 2s infinite; -} - -.bounce { - animation: bounce 2s infinite; -} - -.rotate { - animation: rotate 2s linear infinite; -} - -.glow { - animation: glow 2s infinite; -} - -/* Utility Classes */ -.text-center { - text-align: center; -} -.text-left { - text-align: left; -} -.text-right { - text-align: right; -} - -.flex { - display: flex; -} -.flex-column { - flex-direction: column; -} -.flex-center { - align-items: center; - justify-content: center; -} -.flex-between { - justify-content: space-between; -} -.flex-wrap { - flex-wrap: wrap; -} - -.mt-1 { - margin-top: 0.5rem; -} -.mt-2 { - margin-top: 1rem; -} -.mt-3 { - margin-top: 1.5rem; -} -.mt-4 { - margin-top: 2rem; -} - -.mb-1 { - margin-bottom: 0.5rem; -} -.mb-2 { - margin-bottom: 1rem; -} -.mb-3 { - margin-bottom: 1.5rem; -} -.mb-4 { - margin-bottom: 2rem; -} - -.ml-1 { - margin-left: 0.5rem; -} -.ml-2 { - margin-left: 1rem; -} -.mr-1 { - margin-right: 0.5rem; -} -.mr-2 { - margin-right: 1rem; -} - -.p-1 { - padding: 0.5rem; -} -.p-2 { - padding: 1rem; -} -.p-3 { - padding: 1.5rem; -} -.p-4 { - padding: 2rem; -} - -.w-full { - width: 100%; -} -.h-full { - height: 100%; -} diff --git a/client/src/styles/index.css b/client/src/styles/index.css deleted file mode 100644 index 4931b60..0000000 --- a/client/src/styles/index.css +++ /dev/null @@ -1,52 +0,0 @@ -:root { - --primary-color: #00d4ff; - --secondary-color: #ff6b35; - --accent-color: #ff00ff; - --bg-primary: #0a0e1a; - --bg-secondary: #151923; - --bg-tertiary: #1e2433; - --text-primary: #ffffff; - --text-secondary: #b8c5d6; - --text-muted: #6b7c93; - --border-color: #2a3241; - --success-color: #00ff88; - --warning-color: #ffaa00; - --error-color: #ff3366; - --card-bg: rgba(30, 36, 51, 0.8); - --hover-bg: rgba(0, 212, 255, 0.1); - --gradient-primary: linear-gradient(135deg, #00d4ff, #0099cc); - --gradient-secondary: linear-gradient(135deg, #ff6b35, #ff4500); -} - -body { - font-family: "Space Mono", monospace; - background: var(--bg-primary); - color: var(--text-primary); - overflow: hidden; - background-image: - radial-gradient( - circle at 20% 50%, - rgba(0, 212, 255, 0.1) 0%, - transparent 50% - ), - radial-gradient( - circle at 80% 80%, - rgba(255, 107, 53, 0.1) 0%, - transparent 50% - ), - radial-gradient( - circle at 40% 20%, - rgba(255, 0, 255, 0.05) 0%, - transparent 50% - ); -} - -*::-webkit-scrollbar { - width: 0px; - background: transparent; -} - -* { - scrollbar-width: none; - -ms-overflow-style: none; -} diff --git a/client/src/styles/main.css b/client/src/styles/main.css deleted file mode 100644 index 718ec87..0000000 --- a/client/src/styles/main.css +++ /dev/null @@ -1,161 +0,0 @@ -/* Galaxy Strike Online - Main Styles */ - -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -:root { - --primary-color: #00d4ff; - --secondary-color: #ff6b35; - --accent-color: #ff00ff; - --bg-primary: #0a0e1a; - --bg-secondary: #151923; - --bg-tertiary: #1e2433; - --text-primary: #ffffff; - --text-secondary: #b8c5d6; - --text-muted: #6b7c93; - --border-color: #2a3241; - --success-color: #00ff88; - --warning-color: #ffaa00; - --error-color: #ff3366; - --card-bg: rgba(30, 36, 51, 0.8); - --hover-bg: rgba(0, 212, 255, 0.1); - --gradient-primary: linear-gradient(135deg, #00d4ff, #0099cc); - --gradient-secondary: linear-gradient(135deg, #ff6b35, #ff4500); -} - -body { - font-family: "Space Mono", monospace; - background: var(--bg-primary); - color: var(--text-primary); - overflow: hidden; - background-image: - radial-gradient( - circle at 20% 50%, - rgba(0, 212, 255, 0.1) 0%, - transparent 50% - ), - radial-gradient( - circle at 80% 80%, - rgba(255, 107, 53, 0.1) 0%, - transparent 50% - ), - radial-gradient( - circle at 40% 20%, - rgba(255, 0, 255, 0.05) 0%, - transparent 50% - ); -} - -@media (max-width: 768px) { - .server-controls { - flex-direction: column; - align-items: stretch; - } - - .server-filters { - justify-content: center; - } - - .server-confirmation { - flex-direction: column; - gap: 20px; - } - - .confirm-actions-left, - .confirm-actions-right { - width: 100%; - max-width: 300px; - } - - .server-details { - flex-direction: column; - gap: 8px; - } -} - -/* Animations */ -@keyframes fadeInUp { - from { - opacity: 0; - transform: translateY(30px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -@keyframes pulse { - 0%, - 100% { - opacity: 1; - } - 50% { - opacity: 0.5; - } -} - -@media (max-width: 768px) { - .dashboard-grid { - grid-template-columns: 1fr; - } - - .dungeons-container { - grid-template-columns: 1fr; - } - - .base-container { - grid-template-columns: 1fr; - } - - .inventory-container { - grid-template-columns: 1fr; - } - - .main-nav { - overflow-x: scroll; - } - - .resources { - flex-direction: column; - gap: 0.5rem; - } - - .resource { - padding: 0.25rem 0.5rem; - font-size: 0.8rem; - } - - .game-title { - font-size: 2rem; - } -} - -@media (max-width: 480px) { - .header-center { - display: none; - } - - .nav-btn span { - display: none; - } - - .nav-btn { - padding: 0.5rem; - width: 100px; - justify-content: center; - } -} - -*::-webkit-scrollbar { - width: 0px; - background: transparent; -} - -* { - scrollbar-width: none; - -ms-overflow-style: none; -} diff --git a/client/src/styles/tables.css b/client/src/styles/tables.css deleted file mode 100644 index 6a0eb84..0000000 --- a/client/src/styles/tables.css +++ /dev/null @@ -1,842 +0,0 @@ -/* Table Styles for Galaxy Strike Online */ - -/* Base Table Styles */ -.dungeon-table, -.skills-table, -.base-rooms-table, -.base-upgrades-table, -.ship-gallery-table, -.starbase-management-table, -.starbase-shop-table, -.quests-table, -.inventory-table, -.shop-table { - width: 100%; - border-collapse: collapse; - background: var(--card-bg); - border-radius: 8px; - overflow: hidden; - box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3); - margin: 10px 0; -} - -.dungeon-table th, -.skills-table th, -.base-rooms-table th, -.base-upgrades-table th, -.ship-gallery-table th, -.starbase-management-table th, -.starbase-shop-table th, -.quests-table th, -.inventory-table th, -.shop-table th { - background: var(--gradient-primary); - color: var(--text-primary); - padding: 12px 15px; - text-align: left; - font-weight: 600; - font-size: 14px; - border-bottom: 2px solid rgba(255, 255, 255, 0.1); -} - -.dungeon-table td, -.skills-table td, -.base-rooms-table td, -.base-upgrades-table td, -.ship-gallery-table td, -.starbase-management-table td, -.starbase-shop-table td, -.quests-table td, -.inventory-table td, -.shop-table td { - padding: 12px 15px; - border-bottom: 1px solid rgba(255, 255, 255, 0.1); - color: #e0e0e0; - font-size: 14px; -} - -.dungeon-table tr:hover, -.skills-table tr:hover, -.base-rooms-table tr:hover, -.base-upgrades-table tr:hover, -.ship-gallery-table tr:hover, -.starbase-management-table tr:hover, -.starbase-shop-table tr:hover, -.quests-table tr:hover, -.inventory-table tr:hover, -.shop-table tr:hover { - background: rgba(102, 126, 234, 0.1); - transition: background 0.3s ease; -} - -/* Dungeon Table Specific */ -.dungeon-table .difficulty-easy { color: #00ff00; } -.dungeon-table .difficulty-medium { color: #ffff00; } -.dungeon-table .difficulty-hard { color: #ff9900; } -.dungeon-table .difficulty-extreme { color: #ff0000; } - -/* Skills Table Specific */ -.skills-table .skill-level { - font-weight: bold; - color: #667eea; -} - -.skills-table .skill-progress { - width: 100px; - height: 8px; - background: rgba(255, 255, 255, 0.1); - border-radius: 4px; - overflow: hidden; -} - -.skills-table .progress-fill { - height: 100%; - background: linear-gradient(90deg, #667eea, #764ba2); - transition: width 0.3s ease; -} - -/* Base Tables Specific */ -.base-rooms-table .room-status-active { color: #00ff00; } -.base-rooms-table .room-status-inactive { color: #ff0000; } -.base-rooms-table .room-status-upgrading { color: #ffff00; } - -.base-upgrades-table .upgrade-level { - font-weight: bold; - color: #667eea; -} - -/* Ship Gallery Grid Specific */ -.ship-grid { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); - gap: 15px; - padding: 20px 0; -} - -.ship-card { - background: var(--card-bg); - border-radius: 12px; - padding: 15px; - border: 2px solid var(--primary-color); - box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3); - transition: all 0.3s ease; - position: relative; - overflow: hidden; - text-align: center; -} - -.ship-card:hover { - transform: translateY(-5px); - border-color: var(--primary-color); - box-shadow: 0 8px 30px rgba(0, 212, 255, 0.4); -} - -.ship-card.active { - border-color: var(--success-color); - box-shadow: 0 8px 30px rgba(0, 255, 136, 0.2); -} - -.ship-card.active::before { - content: "ACTIVE"; - position: absolute; - top: 10px; - right: 10px; - background: var(--gradient-secondary); - color: var(--text-primary); - padding: 4px 8px; - border-radius: 4px; - font-size: 10px; - font-weight: bold; - text-transform: uppercase; - letter-spacing: 0.5px; -} - -.ship-card-header { - display: flex; - flex-direction: column; - align-items: center; - gap: 10px; - margin-bottom: 15px; -} - -.ship-card-image { - width: 80px; - height: 80px; - border-radius: 8px; - object-fit: cover; - border: 2px solid var(--primary-color); - margin: 0 auto; -} - -.ship-card-info { - text-align: center; -} - -.ship-card-rarity { - color: var(--text-secondary); - font-size: 14px; - font-weight: bold; - text-transform: uppercase; - letter-spacing: 0.5px; - padding: 4px 8px; - border-radius: 4px; - background: var(--hover-bg); - border: 1px solid var(--border-color); -} - -.ship-card-rarity.common { - color: #888; - border-color: #888; -} - -.ship-card-rarity.rare { - color: var(--primary-color); - border-color: var(--primary-color); -} - -.ship-card-rarity.epic { - color: var(--accent-color); - border-color: var(--accent-color); -} - -.ship-card-rarity.legendary { - color: var(--warning-color); - border-color: var(--warning-color); -} - -.ship-card-stats { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 8px; - margin-bottom: 15px; -} - -.ship-card-stat { - display: flex; - justify-content: space-between; - align-items: center; - padding: 6px 10px; - background: rgba(255, 255, 255, 0.05); - border-radius: 4px; - border: 1px solid rgba(255, 255, 255, 0.1); -} - -.ship-card-stat .stat-label { - color: var(--text-muted); - font-size: 11px; - text-transform: uppercase; - letter-spacing: 0.5px; -} - -.ship-card-stat .stat-value { - color: var(--text-secondary); - font-weight: bold; - font-size: 12px; -} - -.ship-card-stat .stat-value.health { - color: var(--success-color); -} - -.ship-card-stat .stat-value.attack { - color: var(--warning-color); -} - -.ship-card-stat .stat-value.defense { - color: var(--accent-color); -} - -.ship-card-stat .stat-value.speed { - color: var(--secondary-color); -} - -.ship-card-actions { - display: flex; - gap: 10px; - justify-content: space-between; -} - -.ship-card-actions .btn-action { - flex: 1; - padding: 8px 12px; - border: none; - border-radius: 6px; - cursor: pointer; - font-size: 12px; - font-weight: 600; - transition: all 0.3s ease; - text-transform: uppercase; - text-align: center; -} - -.btn-action.btn-switch { - background: var(--gradient-primary); - color: var(--text-primary); -} - -.btn-action.btn-switch:hover { - background: var(--gradient-secondary); - transform: translateY(-2px); -} - -.btn-action.btn-switch:disabled { - background: var(--text-muted); - cursor: not-allowed; - transform: none; -} - -.btn-action.btn-upgrade { - background: var(--gradient-secondary); - color: var(--text-primary); -} - -.btn-action.btn-upgrade:hover { - background: var(--gradient-primary); - transform: translateY(-2px); -} - -.btn-action.btn-repair { - background: var(--gradient-secondary); - color: var(--text-primary); -} - -.btn-action.btn-repair:hover { - background: var(--gradient-primary); - transform: translateY(-2px); -} - -/* Ship Gallery Layout */ -.ship-layout { - display: flex; - gap: 30px; - margin-top: 20px; -} - -.current-ship-section { - flex: 0 0 400px; - background: var(--card-bg); - border-radius: 8px; - padding: 20px; - box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3); - border: 2px solid var(--primary-color); -} - -.ship-grid-section { - flex: 1; - min-width: 0; /* Prevent flex item from overflowing */ -} - -.ship-grid-section h4 { - color: var(--primary-color); - margin-bottom: 20px; - font-size: 16px; - text-transform: uppercase; - letter-spacing: 1px; -} - -.current-ship-section h4 { - color: var(--primary-color); - margin-bottom: 15px; - font-size: 18px; - text-transform: uppercase; - letter-spacing: 1px; - text-align: center; -} - -/* Current Ship Display */ -.current-ship-display { - display: flex; - flex-direction: column; - align-items: center; - gap: 20px; - text-align: center; -} - -.current-ship-image { - flex-shrink: 0; - order: 1; -} - -.current-ship-image img { - width: 120px; - height: 120px; - object-fit: cover; - border-radius: 8px; - border: 2px solid var(--primary-color); - box-shadow: 0 4px 15px rgba(0, 212, 255, 0.3); -} - -.current-ship-details { - flex: 1; - order: 2; - min-width: 0; - text-align: center; -} - -.current-ship-details h5 { - color: var(--text-primary); - margin-bottom: 15px; - font-size: 20px; - font-weight: bold; - text-align: center; -} - -.current-ship-stats { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 10px; -} - -.ship-stat { - display: flex; - justify-content: space-between; - align-items: center; - padding: 8px 12px; - background: var(--hover-bg); - border-radius: 4px; - border: 1px solid var(--border-color); -} - -.ship-stat .stat-label { - color: var(--text-muted); - font-size: 12px; - text-transform: uppercase; - letter-spacing: 0.5px; -} - -.ship-stat .stat-value { - color: var(--text-secondary); - font-weight: bold; - font-size: 14px; -} - -.ship-stat .stat-value.health { - color: var(--success-color); -} - -.ship-stat .stat-value.attack { - color: var(--warning-color); -} - -.ship-stat .stat-value.defense { - color: var(--accent-color); -} - -.ship-stat .stat-value.speed { - color: var(--secondary-color); -} - -.ship-table-section { - margin-top: 30px; -} - -.ship-table-section h4 { - color: #667eea; - margin-bottom: 15px; - font-size: 16px; - text-transform: uppercase; - letter-spacing: 1px; -} - -/* Responsive Design */ -@media (max-width: 768px) { - .ship-layout { - flex-direction: column; - gap: 20px; - } - - .current-ship-section { - flex: 1; - width: 100%; - } - - .current-ship-display { - flex-direction: row; - align-items: flex-start; - gap: 15px; - } - - .current-ship-image img { - width: 100px; - height: 100px; - } - - .current-ship-stats { - grid-template-columns: 1fr; - } - - .ship-grid { - grid-template-columns: 1fr; - gap: 15px; - padding: 15px 0; - } - - .ship-card { - padding: 15px; - } - - .ship-card-header { - flex-direction: row; - align-items: flex-start; - gap: 12px; - } - - .ship-card-image { - width: 80px; - height: 80px; - } - - .ship-card-stats { - grid-template-columns: 1fr; - gap: 6px; - } - - .ship-card-actions { - flex-direction: column; - gap: 8px; - } - - .ship-card-actions .btn-action { - padding: 10px 12px; - font-size: 11px; - } -} - -@media (max-width: 480px) { - .ship-layout { - gap: 15px; - } - - .current-ship-section { - padding: 15px; - } - - .current-ship-display { - flex-direction: column; - align-items: center; - text-align: center; - gap: 15px; - } - - .current-ship-image { - order: 1; - } - - .current-ship-details { - order: 2; - text-align: center; - } - - .ship-grid { - grid-template-columns: 1fr; - gap: 10px; - padding: 10px 0; - } - - .ship-card { - padding: 12px; - } - - .ship-card-header { - flex-direction: column; - align-items: center; - text-align: center; - gap: 10px; - } - - .ship-card-image { - width: 80px; - height: 80px; - margin: 0 auto; - } - - .ship-card-info { - text-align: center; - } - - .ship-card-name { - font-size: 14px; - } - - .ship-card-class { - font-size: 11px; - } -} - -/* Console Window Styles */ -.console-window { - position: fixed; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - width: 600px; - height: 400px; - background: var(--bg-secondary); - border: 2px solid var(--primary-color); - border-radius: 8px; - box-shadow: 0 8px 30px rgba(0, 0, 0, 0.8); - z-index: 10000; - display: none; - flex-direction: column; - font-family: 'Courier New', monospace; -} - -.console-header { - background: var(--gradient-primary); - color: var(--text-primary); - padding: 10px 15px; - border-radius: 6px 6px 0 0; - display: flex; - justify-content: space-between; - align-items: center; - font-weight: bold; - font-size: 14px; -} - -.console-close { - background: none; - border: none; - color: var(--text-primary); - font-size: 20px; - cursor: pointer; - padding: 0; - width: 24px; - height: 24px; - display: flex; - align-items: center; - justify-content: center; - border-radius: 4px; - transition: background 0.3s ease; -} - -.console-close:hover { - background: rgba(255, 255, 255, 0.2); -} - -.console-content { - flex: 1; - display: flex; - flex-direction: column; - overflow: hidden; -} - -.console-output { - flex: 1; - padding: 15px; - overflow-y: auto; - background: var(--bg-primary); - color: var(--text-primary); - font-size: 12px; - line-height: 1.4; - border-bottom: 1px solid var(--border-color); -} - -.console-output .console-line { - margin-bottom: 5px; - word-wrap: break-word; -} - -.console-output .console-error { - color: var(--error-color); -} - -.console-output .console-success { - color: var(--success-color); -} - -.console-output .console-warning { - color: var(--warning-color); -} - -.console-output .console-info { - color: var(--primary-color); -} - -.console-input-container { - padding: 10px; - background: var(--bg-secondary); -} - -.console-input { - width: 100%; - background: var(--bg-primary); - border: 1px solid var(--border-color); - color: var(--text-primary); - padding: 8px 12px; - font-family: 'Courier New', monospace; - font-size: 12px; - border-radius: 4px; - outline: none; -} - -.console-input:focus { - border-color: var(--primary-color); - box-shadow: 0 0 0 2px rgba(0, 212, 255, 0.2); -} - -/* Starbase Tables Specific */ -.starbase-management-table .starbase-level { - font-weight: bold; - color: #667eea; -} - -.starbase-shop-table .starbase-cost { - font-weight: bold; - color: #ffd700; -} - -/* Quests Table Specific */ -.quests-table .quest-type-main { color: #667eea; } -.quests-table .quest-type-daily { color: #00ff00; } -.quests-table .quest-type-procedural { color: #ff9900; } -.quests-table .quest-type-completed { color: #888888; } -.quests-table .quest-type-failed { color: #ff0000; } - -.quests-table .quest-progress { - width: 100px; - height: 8px; - background: rgba(255, 255, 255, 0.1); - border-radius: 4px; - overflow: hidden; -} - -.quests-table .progress-fill { - height: 100%; - background: linear-gradient(90deg, #00ff00, #00cc00); - transition: width 0.3s ease; -} - -/* Inventory Table Specific */ -.inventory-table .item-rarity-common { color: #888888; } -.inventory-table .item-rarity-uncommon { color: #00ff00; } -.inventory-table .item-rarity-rare { color: #0088ff; } -.inventory-table .item-rarity-epic { color: #8833ff; } -.inventory-table .item-rarity-legendary { color: #ff8800; } - -.inventory-table .item-stats { - font-size: 12px; - color: #cccccc; -} - -/* Shop Table Specific */ -.shop-table .item-price { - font-weight: bold; - color: #ffd700; -} - -.shop-table .item-description { - font-size: 12px; - color: #cccccc; - max-width: 200px; -} - -/* Action Buttons */ -.dungeon-table .btn-action, -.skills-table .btn-action, -.base-rooms-table .btn-action, -.base-upgrades-table .btn-action, -.ship-gallery-table .btn-action, -.starbase-management-table .btn-action, -.starbase-shop-table .btn-action, -.quests-table .btn-action, -.inventory-table .btn-action, -.shop-table .btn-action { - padding: 6px 12px; - border: none; - border-radius: 4px; - cursor: pointer; - font-size: 12px; - font-weight: 600; - transition: all 0.3s ease; - text-transform: uppercase; -} - -.btn-action.btn-primary { - background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); - color: white; -} - -.btn-action.btn-primary:hover { - background: linear-gradient(135deg, #764ba2 0%, #667eea 100%); - transform: translateY(-1px); -} - -.btn-action.btn-secondary { - background: rgba(255, 255, 255, 0.1); - color: white; - border: 1px solid rgba(255, 255, 255, 0.2); -} - -.btn-action.btn-secondary:hover { - background: rgba(255, 255, 255, 0.2); - transform: translateY(-1px); -} - -.btn-action.btn-success { - background: linear-gradient(135deg, #00ff00 0%, #00cc00 100%); - color: white; -} - -.btn-action.btn-success:hover { - background: linear-gradient(135deg, #00cc00 0%, #00ff00 100%); - transform: translateY(-1px); -} - -.btn-action.btn-danger { - background: linear-gradient(135deg, #ff0000 0%, #cc0000 100%); - color: white; -} - -.btn-action.btn-danger:hover { - background: linear-gradient(135deg, #cc0000 0%, #ff0000 100%); - transform: translateY(-1px); -} - -/* Responsive Design */ -@media (max-width: 768px) { - .dungeon-table, - .skills-table, - .base-rooms-table, - .base-upgrades-table, - .ship-gallery-table, - .starbase-management-table, - .starbase-shop-table, - .quests-table, - .inventory-table, - .shop-table { - font-size: 12px; - } - - .dungeon-table th, - .skills-table th, - .base-rooms-table th, - .base-upgrades-table th, - .ship-gallery-table th, - .starbase-management-table th, - .starbase-shop-table th, - .quests-table th, - .inventory-table th, - .shop-table th { - padding: 8px 10px; - font-size: 12px; - } - - .dungeon-table td, - .skills-table td, - .base-rooms-table td, - .base-upgrades-table td, - .ship-gallery-table td, - .starbase-management-table td, - .starbase-shop-table td, - .quests-table td, - .inventory-table td, - .shop-table td { - padding: 8px 10px; - font-size: 12px; - } - - .btn-action { - padding: 4px 8px; - font-size: 10px; - } -} diff --git a/client/src/views/GameHUD.jsx b/client/src/views/GameHUD.jsx deleted file mode 100644 index e69de29..0000000 diff --git a/client/src/views/GameInterface/GameInterface.css b/client/src/views/GameInterface/GameInterface.css deleted file mode 100644 index daaea43..0000000 --- a/client/src/views/GameInterface/GameInterface.css +++ /dev/null @@ -1,33 +0,0 @@ -.game-interface { - width: 100vw; - height: 100vh; - display: flex; - flex-direction: column; -} - -.hidden { - display: none !important; -} - -.main-content { - flex: 1; - overflow: hidden; /* Remove exterior scrollbar */ - padding: 1rem; - background: var(--bg-primary); - height: calc(100vh - 32px); /* Account for custom title bar */ -} - -.tab-content { - display: none; - animation: fadeIn 0.3s ease; -} - -.tab-content.active { - display: block; -} - -@keyframes fadeIn { - from { opacity: 0; transform: translateY(10px); } - to { opacity: 1; transform: translateY(0); } -} - diff --git a/client/src/views/GameInterface/GameInterface.jsx b/client/src/views/GameInterface/GameInterface.jsx deleted file mode 100644 index 75e9e09..0000000 --- a/client/src/views/GameInterface/GameInterface.jsx +++ /dev/null @@ -1,98 +0,0 @@ -import React, { useEffect, useState } from "react"; -import "./GameInterface.css"; -import GameHeader from "./components/GameHeader"; -import Navigation from "./components/Navigation"; -import Console from "../../components/Console/Console.jsx"; - -import DashboardTab from "./tabs/DashboardTab"; -import InventoryTab from "./tabs/InventoryTab"; -import DungeonsTab from "./tabs/DungeonsTab"; -import SkillsTab from "./tabs/SkillsTab"; -import BaseTab from "./tabs/BaseTab"; -import QuestsTab from "./tabs/QuestsTab"; -import ShopTab from "./tabs/ShopTab"; -import CraftingTab from "./tabs/CraftingTab"; -import ChatTab from "./tabs/ChatTab"; -import Notification from "./tabs/NotificationTab.jsx"; -import DungeonScreen from "./components/DungeonScreen"; -import { useSocket } from "../../hooks/useSocket.js"; -import DatapackTab from "./tabs/DatapackTab.jsx"; - -const GameInterface = ({ onExit }) => { - const [activeTab, setActiveTab] = useState("dashboard"); - const [activeDungeonSession, setActiveDungeonSession] = useState(null); - const { socket } = useSocket(); - - useEffect(() => { - if (!socket) return; - - socket.on("dungeon:started", (sessionData) => { - setActiveDungeonSession(sessionData); - }); - - socket.on("dungeon:completed", (results) => { - setActiveDungeonSession(null); - }); - - socket.on("error", (err) => { - alert(`SYSTEM_ERROR: ${err.message}`); - }); - - return () => { - socket.off("dungeon:started"); - socket.off("dungeon:completed"); - socket.off("error"); - }; - }, [socket]); - - const handleStartDungeon = (dungeonId) => { - socket.emit("dungeon:start", { dungeonId }); - }; - - const handleAbortMission = () => { - if ( - window.confirm( - "ARE YOU SURE YOU WANT TO ABORT? Energy will not be refunded.", - ) - ) { - setActiveDungeonSession(null); - } - }; - - if (activeDungeonSession) { - return ( - - ); - } - - const tabs = { - dashboard: , - dungeons: , - skills: , - base: , - quests: , - inventory: , - shop: , - crafting: , - datapack: , - chat: , - notifications: , - }; - - return ( -
- - -
- {tabs[activeTab] || } -
- -
- ); -}; - -export default GameInterface; diff --git a/client/src/views/GameInterface/components/CategorySelector.css b/client/src/views/GameInterface/components/CategorySelector.css deleted file mode 100644 index fde8175..0000000 --- a/client/src/views/GameInterface/components/CategorySelector.css +++ /dev/null @@ -1,54 +0,0 @@ -.category-selector { - display: flex; - gap: 12px; - margin-bottom: 20px; - padding: 10px 5px; - overflow-x: auto; - scrollbar-width: none; - -webkit-overflow-scrolling: touch; -} - -.category-selector::-webkit-scrollbar { - display: none; -} - -.category-btn { - flex: 0 0 auto; - padding: 10px 22px; - background: rgba(255, 255, 255, 0.03); - border: 1px solid rgba(255, 255, 255, 0.1); - border-radius: 6px; - color: #a0a0a0; - font-family: 'Orbitron', sans-serif; - font-size: 0.85rem; - text-transform: uppercase; - letter-spacing: 1px; - white-space: nowrap; - cursor: pointer; - transition: all 0.25s ease; -} - -.category-btn:hover { - background: rgba(0, 204, 255, 0.08); - border-color: #00ccff; - color: #fff; -} - -.category-btn.active { - background: #00ccff; - border-color: #00ccff; - color: #000; - font-weight: 700; - box-shadow: 0 0 15px rgba(0, 204, 255, 0.3); -} - -@media (max-width: 768px) { - .category-selector { - gap: 8px; - } - - .category-btn { - padding: 8px 16px; - font-size: 0.75rem; - } -} diff --git a/client/src/views/GameInterface/components/CategorySelector.jsx b/client/src/views/GameInterface/components/CategorySelector.jsx deleted file mode 100644 index 018caa6..0000000 --- a/client/src/views/GameInterface/components/CategorySelector.jsx +++ /dev/null @@ -1,20 +0,0 @@ -import React from "react"; -import "./CategorySelector.css"; - -const CategorySelector = ({ categories, activeCategory, onCategoryChange }) => { - return ( -
- {categories.map((cat) => ( - - ))} -
- ); -}; - -export default CategorySelector; diff --git a/client/src/views/GameInterface/components/DungeonScreen.css b/client/src/views/GameInterface/components/DungeonScreen.css deleted file mode 100644 index c8d07a0..0000000 --- a/client/src/views/GameInterface/components/DungeonScreen.css +++ /dev/null @@ -1,349 +0,0 @@ -.dungeon-active-screen { - display: flex; - flex-direction: column; - height: 100vh; - background: radial-gradient(circle at center, #0a1118 0%, #05080c 100%); - padding: 30px; - gap: 20px; - font-family: "Space Mono", monospace; - color: #e0e6ed; - box-sizing: border-box; - overflow: hidden; -} - -.dungeon-header { - display: flex; - justify-content: space-between; - align-items: center; - border-bottom: 1px solid rgba(0, 212, 255, 0.3); - padding-bottom: 15px; - flex-shrink: 0; -} - -.turn-progress-container { - width: 200px; - background: rgba(0, 0, 0, 0.5); - padding: 8px; - border-radius: 4px; - border: 1px solid rgba(255, 255, 255, 0.1); -} - -.turn-label { - font-size: 9px; - font-family: "Orbitron", sans-serif; - letter-spacing: 2px; - margin-bottom: 5px; - text-align: center; -} - -.turn-timer-bar { - height: 4px; - background: rgba(255, 255, 255, 0.05); - overflow: hidden; -} - -.turn-timer-fill { - height: 100%; -} -.player-phase .turn-label { - color: #00d2ff; -} -.player-phase .turn-timer-fill { - background: #00d2ff; - box-shadow: 0 0 10px #00d2ff; -} -.enemy-phase .turn-label { - color: #ff4444; -} -.enemy-phase .turn-timer-fill { - background: #ff4444; - box-shadow: 0 0 10px #ff4444; -} - -.battle-arena { - flex: 1; - display: flex; - align-items: center; - justify-content: center; - min-height: 0; -} - -.mobs-grid { - display: flex; - gap: 20px; - flex-wrap: wrap; - justify-content: center; -} - -.enemy-card { - width: 180px; - background: rgba(255, 255, 255, 0.03); - border: 1px solid rgba(255, 255, 255, 0.1); - padding: 20px; - display: flex; - flex-direction: column; - align-items: center; - transition: all 0.3s; - position: relative; -} - -.enemy-card.attacking { - border-color: #ff4444; - transform: scale(1.05); - box-shadow: 0 0 20px rgba(255, 68, 68, 0.4); - z-index: 10; -} - -.enemy-action-progress { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 4px; - background: rgba(255, 0, 0, 0.2); -} - -.inner-progress { - height: 100%; - background: #ff4444; - width: 0%; - animation: enemyCharge 2s linear forwards; -} - -@keyframes enemyCharge { - from { - width: 0%; - } - to { - width: 100%; - } -} - -.enemy-card.targetable:hover { - border-color: #00d2ff; - background: rgba(0, 210, 255, 0.05); - cursor: crosshair; -} - -.enemy-hp-mini { - width: 100%; - height: 4px; - background: #000; - margin-bottom: 15px; -} - -.enemy-hp-mini .fill { - height: 100%; - background: #ff4444; - transition: width 0.3s; -} - -.player-section { - display: grid; - grid-template-columns: 300px 1fr; - gap: 20px; - height: 150px; - flex-shrink: 0; -} - -.player-hp-main { - background: rgba(0, 0, 0, 0.3); - padding: 15px; - border: 1px solid rgba(255, 255, 255, 0.1); - transition: all 0.2s; -} - -.player-hp-main.taking-damage { - animation: playerShake 0.3s infinite; - border-color: #ff4444; -} - -@keyframes playerShake { - 0% { - transform: translate(1px, 1px); - } - 25% { - transform: translate(-2px, -1px); - } - 50% { - transform: translate(-1px, 2px); - } - 75% { - transform: translate(2px, 1px); - } - 100% { - transform: translate(0, 0); - } -} - -.hp-bar-large { - height: 20px; - background: #000; - margin-top: 10px; -} -.hp-bar-large .fill { - height: 100%; - background: linear-gradient(90deg, #ff416c, #ff4b2b); - transition: width 0.4s ease-out; -} - -.combat-log-wrapper { - background: rgba(0, 0, 0, 0.5); - border: 1px solid rgba(0, 212, 255, 0.1); - overflow: hidden; -} -.combat-log { - padding: 15px; - height: 100%; - overflow-y: auto; - font-size: 0.75rem; -} -.log-entry { - margin-bottom: 5px; - color: #a0acba; -} -.log-arrow { - color: #00d2ff; - margin-right: 5px; -} - -.ctrl-btn { - width: 100%; - height: 60px; - background: #00d4ff; - border: none; - font-family: "Orbitron", sans-serif; - font-weight: 900; - cursor: pointer; - clip-path: polygon(10px 0%, 100% 0%, calc(100% - 10px) 100%, 0% 100%); -} - -.enemy-card.defeated { - filter: grayscale(1) brightness(0.4); -} - -.enemy-card.targetable { - cursor: pointer; - pointer-events: all; -} - -.hp-bar-large .fill, -.enemy-hp-mini .fill { - transition: width 0.4s cubic-bezier(0.4, 0, 0.2, 1); -} - -/* Рамка для вибраного моба */ -.enemy-card.selected { - border-color: #00d2ff; - box-shadow: - 0 0 15px rgba(0, 210, 255, 0.4), - inset 0 0 10px rgba(0, 210, 255, 0.2); - transform: translateY(-5px); -} - -.enemy-card.selectable:hover:not(.defeated) { - cursor: crosshair; - border-color: rgba(0, 210, 255, 0.5); -} - -/* Іконка прицілу */ -.target-aim { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - font-size: 40px; - color: rgba(0, 210, 255, 0.3); - pointer-events: none; - z-index: 10; - animation: pulseAim 1.5s infinite; -} - -@keyframes pulseAim { - 0% { - transform: translate(-50%, -50%) scale(1); - opacity: 0.3; - } - 50% { - transform: translate(-50%, -50%) scale(1.1); - opacity: 0.6; - } - 100% { - transform: translate(-50%, -50%) scale(1); - opacity: 0.3; - } -} - -/* Контейнер для логу та кнопки */ -.combat-interface-row { - display: flex; - gap: 15px; - height: 120px; - margin-top: 10px; -} - -.combat-log-wrapper { - flex: 1; -} - -/* Стильна кнопка атаки */ -.btn-execute-combat { - width: 180px; - background: rgba(255, 0, 60, 0.1); - border: 1px solid #ff003c; - color: #ff003c; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - cursor: pointer; - font-family: "Orbitron", sans-serif; - transition: all 0.2s; - position: relative; - overflow: hidden; -} - -.btn-execute-combat:hover:not(.disabled) { - background: #ff003c; - color: #000; - box-shadow: 0 0 20px rgba(255, 0, 60, 0.4); -} - -.btn-execute-combat.disabled { - opacity: 0.3; - border-color: #444; - color: #444; - cursor: not-allowed; - background: transparent; -} - -.btn-glitch-content { - font-size: 1rem; - font-weight: bold; - letter-spacing: 1px; -} - -.btn-sub-text { - font-size: 0.6rem; - margin-top: 4px; - opacity: 0.8; -} - -.mob-stats-display { - display: flex; - gap: 8px; - font-size: 0.65rem; - margin-top: 5px; - color: rgba(255, 255, 255, 0.6); -} - -.player-stats-row { - display: flex; - justify-content: space-between; - margin-top: 10px; - font-size: 0.8rem; - color: #00d2ff; - font-family: "Orbitron", sans-serif; - border-top: 1px solid rgba(0, 210, 255, 0.2); - padding-top: 5px; -} diff --git a/client/src/views/GameInterface/components/DungeonScreen.jsx b/client/src/views/GameInterface/components/DungeonScreen.jsx deleted file mode 100644 index 4656567..0000000 --- a/client/src/views/GameInterface/components/DungeonScreen.jsx +++ /dev/null @@ -1,269 +0,0 @@ -import React, { useState, useEffect, useRef } from "react"; -import GameDataManager from "../../../services/GameDataManager.js"; -import "./DungeonScreen.css"; -import DungeonFinish from "../tabs/components/DungeonFinish.jsx"; - -const DungeonScreen = ({ session, socket }) => { - const [battle, setBattle] = useState(session.battle || null); - const [roomIndex, setRoomIndex] = useState(session.roomIndex); - const [totalRooms, setTotalRooms] = useState(session.totalRooms || 1); - const [timeLeft, setTimeLeft] = useState(10); - const [summary, setSummary] = useState(null); - const [activeAttacker, setActiveAttacker] = useState(null); - const [selectedTarget, setSelectedTarget] = useState(null); - const [log, setLog] = useState([ - "SYSTEM: Neural link established. Scanning sector...", - ]); - - const logEndRef = useRef(null); - const timerRef = useRef(null); - - const addLog = (text) => { - const time = new Date().toLocaleTimeString([], { - hour12: false, - hour: "2-digit", - minute: "2-digit", - second: "2-digit", - }); - setLog((prev) => [...prev, `[${time}] ${text}`]); - }; - - useEffect(() => { - logEndRef.current?.scrollIntoView({ behavior: "smooth" }); - }, [log]); - - useEffect(() => { - if (!battle || battle.isOver || activeAttacker) { - if (timerRef.current) clearInterval(timerRef.current); - return; - } - - const isPlayer = battle.turnOrder[battle.currentTurnIndex] === "player"; - if (!isPlayer) return; - - setTimeLeft(10); - if (timerRef.current) clearInterval(timerRef.current); - - timerRef.current = setInterval(() => { - setTimeLeft((prev) => { - if (prev <= 1) { - handleCombatAction(null); - return 0; - } - return prev - 1; - }); - }, 1000); - - return () => clearInterval(timerRef.current); - }, [battle?.currentTurnIndex, battle?.isOver, activeAttacker]); - - useEffect(() => { - socket.on("dungeon:battle_update", async (data) => { - if (data.log && Array.isArray(data.log)) { - for (const action of data.log) { - if (typeof action === "object" && action.attackerId) { - setActiveAttacker(action.attackerId); - action.messages?.forEach((msg) => addLog(msg)); - - if (action.hpState) { - setBattle((prev) => ({ - ...prev, - player: { ...prev.player, hp: action.hpState.playerHp }, - enemies: prev.enemies.map((e) => { - const s = action.hpState.enemies.find( - (ae) => ae.id === e.instanceId, - ); - return s ? { ...e, hp: s.hp, isDead: s.isDead } : e; - }), - })); - } - await new Promise((r) => setTimeout(r, 1500)); - } else if (typeof action === "string") { - addLog(action); - } - } - } - - setBattle(data.battle); - setActiveAttacker(null); - setSelectedTarget(null); - - if (data.status === "victory") - addLog("MISSION_OBJECTIVE: Threats neutralized."); - if (data.status === "defeat") { - addLog("CRITICAL_ERROR: Bio-sign lost."); - setTimeout(() => window.location.reload(), 3000); - } - }); - - socket.on("dungeon:room_update", (data) => { - setRoomIndex(data.roomIndex); - setTotalRooms(data.totalRooms); - setBattle(data.battle); - addLog(`--- ENTERING SECTOR ${data.roomIndex + 1} ---`); - }); - - socket.on("dungeon:completed", (data) => { - setSummary(data.rewards); - addLog("MISSION_SUCCESS: All objectives secured."); - }); - - return () => { - socket.off("dungeon:battle_update"); - socket.off("dungeon:room_update"); - socket.off("dungeon:completed"); - }; - }, [socket]); - - const handleCombatAction = (targetId = selectedTarget) => { - const isPlayer = battle?.turnOrder[battle?.currentTurnIndex] === "player"; - if (!battle || battle.isOver || activeAttacker || !isPlayer) return; - - socket.emit("dungeon:combat_action", { targetInstanceId: targetId }); - if (!targetId) addLog("Sequence timeout! Skipping..."); - else addLog("Initiating strike sequence..."); - setSelectedTarget(null); - }; - - const handleNextRoom = () => { - socket.emit("dungeon:next_room"); - }; - - const isPlayerTurn = - battle?.turnOrder[battle?.currentTurnIndex] === "player" && - !activeAttacker && - !battle.isOver; - - return ( -
- {summary && ( - window.location.reload()} - /> - )} - -
-
-
- SECTOR {roomIndex + 1} / {totalRooms} -
-
-
-
-
- - {battle && !battle.isOver && ( -
-
- {isPlayerTurn ? "YOUR TURN" : "PROCESSING..."} -
-
-
-
-
- )} -
- -
- {battle ? ( -
- {battle.enemies.map((mob) => ( -
- isPlayerTurn && - !mob.isDead && - setSelectedTarget(mob.instanceId) - } - > -
-
-
-
- -
- {GameDataManager.t(mob.name)} -
- ))} -
- ) : ( -
- -

AREA SECURE

-
- )} -
- -
- {battle && ( -
-
- COMMANDER_INTEGRITY - - {battle.player.hp} / {battle.player.maxHp} - -
-
-
-
-
- )} -
-
- {log.map((entry, i) => ( -
- > {entry} -
- ))} -
-
- {battle && !battle.isOver && ( - - )} -
-
- -
- {((battle?.isOver && battle.player.hp > 0) || !battle) && !summary && ( - - )} -
-
- ); -}; - -export default DungeonScreen; diff --git a/client/src/views/GameInterface/components/GameHeader.css b/client/src/views/GameInterface/components/GameHeader.css deleted file mode 100644 index a16cb76..0000000 --- a/client/src/views/GameInterface/components/GameHeader.css +++ /dev/null @@ -1,110 +0,0 @@ -.game-header { - height: 60px; - background: var(--bg-secondary); - border-bottom: 1px solid var(--border-color); - display: flex; - align-items: center; - justify-content: space-between; - padding: 0 1rem; - backdrop-filter: blur(10px); -} - -.header-left { - display: flex; - align-items: center; - gap: 1rem; -} - -.logo { - font-family: "Orbitron", sans-serif; - font-size: 1.5rem; - font-weight: 900; - color: var(--primary-color); - text-shadow: 0 0 10px rgba(0, 212, 255, 0.5); -} - -.player-info { - display: flex; - flex-direction: column; -} - -.player-name { - font-weight: 700; - color: var(--text-primary); -} - -.player-level { - font-size: 0.8rem; - color: var(--primary-color); -} - -.header-center { - flex: 1; - display: flex; - justify-content: center; -} - -.resources { - display: flex; - gap: 1.5rem; -} - -.resource { - display: flex; - align-items: center; - gap: 0.5rem; - padding: 0.5rem 1rem; - background: var(--bg-tertiary); - border-radius: 20px; - border: 1px solid var(--border-color); - transition: all 0.3s ease; -} - -.resource:hover { - border-color: var(--primary-color); - box-shadow: 0 0 10px rgba(0, 212, 255, 0.3); -} - -.resource i { - color: var(--primary-color); -} - -.header-right { - display: flex; - gap: 0.5rem; -} - -.header-right { - display: flex; - gap: 0.75rem; - align-items: center; -} - -.header-icon-btn { - background: rgba(255, 255, 255, 0.05); - border: 1px solid var(--border-color); - color: var(--text-secondary); - width: 40px; - height: 40px; - border-radius: 4px; - cursor: pointer; - display: flex; - align-items: center; - justify-content: center; - transition: all 0.2s ease; - font-size: 1.1rem; -} - -.header-icon-btn:hover { - background: rgba(0, 212, 255, 0.1); - border-color: var(--primary-color); - color: var(--primary-color); - box-shadow: 0 0 15px rgba(0, 212, 255, 0.2); -} - -.header-icon-btn.exit-btn:hover { - background: rgba(255, 87, 34, 0.1); - border-color: #ff5722; - color: #ff5722; - box-shadow: 0 0 15px rgba(255, 87, 34, 0.2); -} diff --git a/client/src/views/GameInterface/components/GameHeader.jsx b/client/src/views/GameInterface/components/GameHeader.jsx deleted file mode 100644 index 4a2b141..0000000 --- a/client/src/views/GameInterface/components/GameHeader.jsx +++ /dev/null @@ -1,60 +0,0 @@ -import React, { useState } from "react"; -import { useSocket } from "../../../hooks/useSocket"; -import SettingsModal from "./SettingsModal"; -import "./GameHeader.css"; - -const GameHeader = ({ onReturn }) => { - const { disconnectFromServer } = useSocket(); - const [isSettingsOpen, setIsSettingsOpen] = useState(false); - - const handleHomeClick = () => { - localStorage.removeItem("activeServer"); - disconnectFromServer(); - if (onReturn) { - onReturn(); - } - }; - - return ( - <> -
-
-

GSO

-
- Commander - Lv. 1 -
-
-
-
-
- - 100/100 -
-
-
-
- - - -
-
- - {isSettingsOpen && ( - setIsSettingsOpen(false)} /> - )} - - ); -}; - -export default GameHeader; diff --git a/client/src/views/GameInterface/components/Navigation.css b/client/src/views/GameInterface/components/Navigation.css deleted file mode 100644 index 1270fd0..0000000 --- a/client/src/views/GameInterface/components/Navigation.css +++ /dev/null @@ -1,141 +0,0 @@ -.main-nav { - height: 45px; - background: #0a0f18; - border-bottom: 1px solid #1a2638; - display: flex; - align-items: stretch; - padding: 0; - overflow-x: auto; - position: relative; - z-index: 10000; - scrollbar-width: none; -} - -.main-nav::-webkit-scrollbar { - display: none; -} - -.nav-container { - display: flex; - padding: 0 5px; - gap: 2px; -} - -.nav-btn { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - padding: 0 12px; - margin-right: 10px; - background: transparent; - border: none; - color: #4a5d75; - cursor: pointer; - transition: all 0.2s ease; - white-space: nowrap; - position: relative; - font-family: "Orbitron", sans-serif; -} - -.nav-btn-content { - display: flex; - align-items: center; - gap: 6px; -} - -.nav-btn i { - font-size: 0.9rem; -} - -.nav-label { - font-size: 9px; - font-weight: 700; - text-transform: uppercase; - letter-spacing: 0.5px; -} - -.nav-btn.active { - color: #00d4ff; - background: linear-gradient(to bottom, rgba(0, 212, 255, 0.08), transparent); -} - -.nav-active-indicator { - position: absolute; - bottom: 0; - left: 0; - right: 0; - height: 2px; - background: #00d4ff; - box-shadow: 0 0 8px #00d4ff; - transform: scaleX(0); - transition: transform 0.2s ease; -} - -.nav-btn.active .nav-active-indicator { - transform: scaleX(1); -} - -@media (max-width: 768px) { - .main-nav { - height: 42px; - } - - .nav-label { - display: none; - } - - .nav-btn { - padding: 0 18px; - } - - .nav-btn i { - font-size: 1.1rem; - } -} - -.icon-wrapper { - position: relative; - display: flex; - align-items: center; - justify-content: center; -} - -.nav-badge { - position: absolute; - top: -8px; - right: -8px; - background: #ff3e3e; - color: white; - font-size: 10px; - font-weight: bold; - min-width: 16px; - height: 16px; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - padding: 2px; - box-shadow: 0 0 10px rgba(255, 62, 62, 0.5); - border: 1px solid #1a1a1a; - animation: pulse-red 2s infinite; -} - -@keyframes pulse-red { - 0% { - transform: scale(1); - box-shadow: 0 0 0 0 rgba(255, 62, 62, 0.7); - } - 70% { - transform: scale(1.1); - box-shadow: 0 0 0 5px rgba(255, 62, 62, 0); - } - 100% { - transform: scale(1); - box-shadow: 0 0 0 0 rgba(255, 62, 62, 0); - } -} - -.nav-btn.notifications.active i { - color: #ffd700; -} diff --git a/client/src/views/GameInterface/components/Navigation.jsx b/client/src/views/GameInterface/components/Navigation.jsx deleted file mode 100644 index 8513283..0000000 --- a/client/src/views/GameInterface/components/Navigation.jsx +++ /dev/null @@ -1,82 +0,0 @@ -import React, { useState, useEffect } from "react"; -import GameDataManager from "../../../services/GameDataManager.js"; -import { useSocket } from "../../../hooks/useSocket"; -import "./Navigation.css"; - -const Navigation = ({ activeTab, onTabChange }) => { - const { socket } = useSocket(); - const [unreadCount, setUnreadCount] = useState(0); - - const tabs = [ - { id: "dashboard", icon: "fa-tachometer-alt" }, - { id: "dungeons", icon: "fa-dungeon" }, - { id: "skills", icon: "fa-graduation-cap" }, - { id: "quests", icon: "fa-store" }, - { id: "inventory", icon: "fa-archive" }, - { id: "shop", icon: "fa-store" }, - { id: "crafting", icon: "fa-hammer" }, - { id: "datapack", icon: "fa-list-ul" }, - { id: "chat", icon: "fa-comments" }, - { id: "notifications", icon: "fa-bell" }, - ]; - - useEffect(() => { - if (!socket) return; - - const handleNotifyUpdate = (count) => { - setUnreadCount(count); - }; - - socket.on("notifications:unread_count", handleNotifyUpdate); - - socket.on("notification:new", () => { - if (activeTab !== "notifications") { - setUnreadCount((prev) => prev + 1); - } - }); - - return () => { - socket.off("notifications:unread_count", handleNotifyUpdate); - socket.off("notification:new"); - }; - }, [socket, activeTab]); - - const handleTabClick = (id) => { - if (id === "notifications") setUnreadCount(0); - onTabChange(id); - }; - - const getLabel = (id) => { - if (id === "itemlist") return "ITEM_LIST"; - if (id === "chat") return "CHAT"; - if (id === "notifications") return "ALERTS"; - return GameDataManager.t(`category.tabs.original.${id}`); - }; - - return ( - - ); -}; - -export default Navigation; diff --git a/client/src/views/GameInterface/components/SettingsModal.css b/client/src/views/GameInterface/components/SettingsModal.css deleted file mode 100644 index 6dde8a0..0000000 --- a/client/src/views/GameInterface/components/SettingsModal.css +++ /dev/null @@ -1,114 +0,0 @@ -.settings-overlay { - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: rgba(0, 0, 0, 0.85); - backdrop-filter: blur(5px); - display: flex; - align-items: center; - justify-content: center; - z-index: 9999; -} - -.settings-modal { - background: #0a0e14; - border: 1px solid #00ffff44; - width: 350px; - box-shadow: 0 0 30px rgba(0, 255, 255, 0.1); - font-family: "Rajdhani", sans-serif; -} - -.settings-header { - padding: 15px; - border-bottom: 1px solid rgba(0, 255, 255, 0.1); - display: flex; - justify-content: space-between; - align-items: center; - background: rgba(0, 255, 255, 0.03); -} - -.settings-title { - color: #00ffff; - font-weight: bold; - letter-spacing: 2px; - font-size: 14px; -} - -.close-x { - background: none; - border: none; - color: #666; - font-size: 24px; - cursor: pointer; -} - -.settings-body { - padding: 20px; -} - -.section-label { - display: block; - color: #444; - font-size: 11px; - margin-bottom: 10px; - letter-spacing: 1px; -} - -.lang-selector { - display: flex; - flex-direction: column; - gap: 8px; -} - -.lang-option { - background: rgba(255, 255, 255, 0.02); - border: 1px solid rgba(255, 255, 255, 0.05); - color: #ccc; - padding: 12px; - text-align: left; - cursor: pointer; - display: flex; - align-items: center; - transition: all 0.2s; -} - -.lang-option:hover { - background: rgba(0, 255, 255, 0.05); - color: #fff; -} - -.lang-option.active { - border-color: #00ffff; - color: #00ffff; - background: rgba(0, 255, 255, 0.08); -} - -.lang-indicator { - width: 4px; - height: 4px; - background: currentColor; - margin-right: 12px; -} - -.settings-footer { - padding: 15px; - text-align: center; -} - -.btn-confirm { - width: 100%; - background: transparent; - border: 1px solid #00ffff66; - color: #00ffff; - padding: 10px; - cursor: pointer; - text-transform: uppercase; - font-size: 12px; - letter-spacing: 1px; -} - -.btn-confirm:hover { - background: #00ffff11; -} diff --git a/client/src/views/GameInterface/components/SettingsModal.jsx b/client/src/views/GameInterface/components/SettingsModal.jsx deleted file mode 100644 index 4f83707..0000000 --- a/client/src/views/GameInterface/components/SettingsModal.jsx +++ /dev/null @@ -1,58 +0,0 @@ -import React, { useState } from "react"; -import GameDataManager from "../../../services/GameDataManager.js"; -import "./SettingsModal.css"; - -const SettingsModal = ({ onClose }) => { - const [currentLang, setCurrentLang] = useState(GameDataManager.currentLang); - - const languages = [ - { code: "en_US", name: "English" }, - { code: "fr_FR", name: "French" }, - { code: "uk_UA", name: "Ukrainian" }, - ]; - - const handleLanguageChange = (langCode) => { - GameDataManager.setLanguage(langCode); - localStorage.setItem("selected_lang", langCode); - setCurrentLang(langCode); - }; - - return ( -
-
e.stopPropagation()}> -
- SYSTEM_SETTINGS - -
- -
-
- -
- {languages.map((lang) => ( - - ))} -
-
-
- -
- -
-
-
- ); -}; - -export default SettingsModal; diff --git a/client/src/views/GameInterface/tabs/BaseTab.jsx b/client/src/views/GameInterface/tabs/BaseTab.jsx deleted file mode 100644 index 34c0c4f..0000000 --- a/client/src/views/GameInterface/tabs/BaseTab.jsx +++ /dev/null @@ -1,40 +0,0 @@ -import React, { useState } from 'react'; -import "./styles/BaseTab.css" - -const BaseTab = () => { - const [view, setView] = useState('overview'); - - return ( -
-
- - - - -
- - {view === 'overview' && ( -
-
-

Base Information

-
-
Power Usage: 0/100
-
Storage: 1000
-
-
-
- )} - - {view === 'ships' && ( -
-
-

Current Ship: Starter Cruiser

- Ship -
-
- )} -
- ); -}; - -export default BaseTab; diff --git a/client/src/views/GameInterface/tabs/ChatTab.jsx b/client/src/views/GameInterface/tabs/ChatTab.jsx deleted file mode 100644 index bfdeaec..0000000 --- a/client/src/views/GameInterface/tabs/ChatTab.jsx +++ /dev/null @@ -1,310 +0,0 @@ -import React, { useState, useEffect, useRef } from "react"; -import { useSocket } from "../../../hooks/useSocket"; -import "./styles/ChatTab.css"; -import PlayerManager from "../../../services/PlayerManager"; - -const ChatTab = () => { - const { socket } = useSocket(); - const [activeChat, setActiveChat] = useState("global"); - const [searchQuery, setSearchQuery] = useState(""); - const [searchResults, setSearchResults] = useState([]); - const [messages, setMessages] = useState([]); - const [friends, setFriends] = useState([]); - const [inputValue, setInputValue] = useState(""); - const [showSidebar, setShowSidebar] = useState(true); - const [isMobile, setIsMobile] = useState(window.innerWidth <= 768); - const [confirmUnfriend, setConfirmUnfriend] = useState(null); - const [onlineList, setOnlineList] = useState( - PlayerManager.onlinePlayers || [], - ); - - const messagesEndRef = useRef(null); - const activeChatRef = useRef(activeChat); - - useEffect(() => { - activeChatRef.current = activeChat; - }, [activeChat]); - - useEffect(() => { - const handleResize = () => { - const mobile = window.innerWidth <= 768; - setIsMobile(mobile); - if (!mobile) setShowSidebar(true); - }; - window.addEventListener("resize", handleResize); - return () => window.removeEventListener("resize", handleResize); - }, []); - - useEffect(() => { - if (!socket) return; - - socket.emit("friend:get_list"); - - if (activeChat === "global") { - socket.emit("chat:get_global_history"); - } else { - socket.emit("chat:get_private_history", { friendId: activeChat }); - } - }, [socket, activeChat]); - - useEffect(() => { - if (!socket) return; - - const interval = setInterval(() => { - setOnlineList([...PlayerManager.onlinePlayers]); - }, 3000); - - const handleNewMessage = (msg) => { - const currentActive = activeChatRef.current; - const isGlobalMatch = currentActive === "global" && msg.type === "global"; - const isPrivateMatch = - currentActive !== "global" && - msg.type === "private" && - (msg.senderId === currentActive || msg.receiverId === currentActive); - - if (isGlobalMatch || isPrivateMatch) { - setMessages((prev) => { - if (prev.some((m) => m.id === msg.id)) return prev; - return [...prev, msg]; - }); - } - }; - - const handleHistory = (history) => setMessages(history); - const handleSearchResults = (results) => setSearchResults(results); - const handleFriendList = (list) => setFriends(list); - - socket.on("chat:new_message", handleNewMessage); - socket.on("chat:global_history", handleHistory); - socket.on("chat:private_history", handleHistory); - socket.on("player:search_results", handleSearchResults); - socket.on("friend:list", handleFriendList); - - return () => { - clearInterval(interval); - socket.off("chat:new_message", handleNewMessage); - socket.off("chat:global_history", handleHistory); - socket.off("chat:private_history", handleHistory); - socket.off("player:search_results", handleSearchResults); - socket.off("friend:list", handleFriendList); - }; - }, [socket]); - - useEffect(() => { - messagesEndRef.current?.scrollIntoView({ behavior: "smooth" }); - }, [messages]); - - const handleSearch = (e) => { - const query = e.target.value; - setSearchQuery(query); - if (query.length > 1) { - socket.emit("player:search", { query }); - } else { - setSearchResults([]); - } - }; - - const addFriend = (player) => { - socket.emit("friend:add", { friendId: player.id }); - setSearchQuery(""); - setSearchResults([]); - }; - - const removeFriend = () => { - if (confirmUnfriend) { - socket.emit("friend:remove", { friendId: confirmUnfriend.id }); - if (activeChat === confirmUnfriend.id) setActiveChat("global"); - setConfirmUnfriend(null); - } - }; - - const sendMessage = () => { - if (!inputValue.trim() || !socket) return; - socket.emit("chat:send_message", { - content: inputValue, - type: activeChat === "global" ? "global" : "private", - receiverId: activeChat === "global" ? null : activeChat, - }); - setInputValue(""); - }; - - const selectChat = (id) => { - setActiveChat(id); - if (isMobile) setShowSidebar(false); - }; - - const getChatName = () => { - if (activeChat === "global") return "GLOBAL_SYSTEM_CHAT"; - const friend = friends.find((f) => f.id === activeChat); - return friend ? friend.username : "UNKNOWN_PILOT"; - }; - - const isFriendOnline = (username) => { - return onlineList.includes(username); - }; - - return ( -
- {confirmUnfriend && ( -
-
-

TERMINATE_CONTACT

-

- Are you sure you want to remove {confirmUnfriend.username} from - your contacts? -

-
- - -
-
-
- )} - - - -
-
- {isMobile && ( - - )} -
- -

{getChatName()}

-
-
- -
- {messages.length === 0 && ( -
- - NO_LOGS_FOUND. SECURE_LINE_READY... - -
- )} - {messages.map((msg, index) => ( -
- - [ - {new Date(msg.createdAt).toLocaleTimeString([], { - hour: "2-digit", - minute: "2-digit", - })} - ] - - {msg.senderName}: - {msg.content} -
- ))} -
-
- -
- setInputValue(e.target.value)} - onKeyDown={(e) => e.key === "Enter" && sendMessage()} - /> - -
-
-
- ); -}; - -export default ChatTab; diff --git a/client/src/views/GameInterface/tabs/CraftingTab.jsx b/client/src/views/GameInterface/tabs/CraftingTab.jsx deleted file mode 100644 index 23544f0..0000000 --- a/client/src/views/GameInterface/tabs/CraftingTab.jsx +++ /dev/null @@ -1,204 +0,0 @@ -import React, { useState, useEffect } from "react"; -import { useSocket } from "../../../hooks/useSocket"; -import GameDataManager from "../../../services/GameDataManager"; -import "./styles/CraftingTab.css"; -import CategorySelector from "../components/CategorySelector"; -import CraftModal from "./components/CraftModal"; -import { config } from "../../../config/api"; -import MeteorRegion from "../../../components/Meteor/MeteorRegion.jsx"; - -const CraftingTab = () => { - const { socket } = useSocket(); - - const [categories, setCategories] = useState([]); - const [recipes, setRecipes] = useState([]); - const [userInventory, setUserInventory] = useState([]); - const [activeCategory, setActiveCategory] = useState(""); - const [selectedRecipe, setSelectedRecipe] = useState(null); - const [activeCraft, setActiveCraft] = useState(null); - - useEffect(() => { - const manifestCategories = GameDataManager.getRecipeCategories(); - setCategories(manifestCategories); - if (manifestCategories.length > 0 && !activeCategory) { - setActiveCategory(manifestCategories[0].id); - } - }, []); - - useEffect(() => { - if (activeCategory) { - const filteredRecipes = - GameDataManager.getRecipesByCategory(activeCategory); - setRecipes(filteredRecipes); - } - }, [activeCategory]); - - useEffect(() => { - if (!socket) return; - - socket.emit("player:get_inventory"); - socket.emit("player:check_active_craft"); - - const handleInventory = (data) => setUserInventory(data); - - const handleCraftStarted = (data) => { - const recipeData = GameDataManager.getRecipe(data.recipeId); - const now = Date.now(); - const diff = (data.finishAt - now) / 1000; - - if (diff <= 0) { - setActiveCraft(null); - return; - } - - setActiveCraft({ - recipeId: data.recipeId, - name: recipeData?.displayName || data.recipeId, - finishAt: data.finishAt, - totalTime: data.totalTime || recipeData?.time_seconds || diff, - timeLeft: Math.max(0, Math.ceil(diff)), - }); - - if (recipeData) { - setSelectedRecipe(recipeData); - } - }; - - const handleCraftSuccess = () => { - setActiveCraft(null); - setSelectedRecipe(null); - socket.emit("player:get_inventory"); - }; - - socket.on("player:inventory_data", handleInventory); - socket.on("player:craft_started", handleCraftStarted); - socket.on("player:craft_success", handleCraftSuccess); - - return () => { - socket.off("player:inventory_data", handleInventory); - socket.off("player:craft_started", handleCraftStarted); - socket.off("player:craft_success", handleCraftSuccess); - }; - }, [socket]); - - useEffect(() => { - if (!activeCraft) return; - - const timer = setInterval(() => { - const now = Date.now(); - const diff = Math.max(0, Math.ceil((activeCraft.finishAt - now) / 1000)); - - if (diff <= 0) { - clearInterval(timer); - setActiveCraft(null); - } else { - setActiveCraft((prev) => (prev ? { ...prev, timeLeft: diff } : null)); - } - }, 1000); - - return () => clearInterval(timer); - }, [activeCraft?.finishAt]); - - const getOwnedAmount = (itemId) => { - const item = userInventory.find((i) => (i.itemId || i.id) === itemId); - return item ? item.quantity : 0; - }; - - const handleStartCrafting = (recipe) => { - if (activeCraft) return; - socket.emit("player:craft_item", { recipeId: recipe.id }); - }; - - return ( -
- - {activeCraft && ( -
-
- - Assembling:{" "} - {activeCraft.name} - - {activeCraft.timeLeft}s -
-
-
-
-
- )} - -
-

- Fabrication Unit -

-
- - - -
- {recipes.map((recipe) => { - const isThisRecipeCrafting = activeCraft?.recipeId === recipe.id; - const canCraft = recipe.ingredients.every( - (ing) => getOwnedAmount(ing.itemId) >= ing.quantity, - ); - - return ( -
setSelectedRecipe(recipe)} - > -
- {recipe.texture ? ( - {recipe.displayName} - ) : ( -
{recipe.displayName[0]}
- )} -
-
- {recipe.displayName} -
- - {recipe.time_seconds}s - -
-
- {isThisRecipeCrafting && ( -
- -
- )} -
- ); - })} -
-
- - !activeCraft && setSelectedRecipe(null)} - onStartCraft={handleStartCrafting} - activeCraft={activeCraft} - getOwnedAmount={getOwnedAmount} - /> -
- ); -}; - -export default CraftingTab; diff --git a/client/src/views/GameInterface/tabs/DashboardTab.jsx b/client/src/views/GameInterface/tabs/DashboardTab.jsx deleted file mode 100644 index 235a7d5..0000000 --- a/client/src/views/GameInterface/tabs/DashboardTab.jsx +++ /dev/null @@ -1,154 +0,0 @@ -import React, { useEffect, useState } from "react"; -import Card from "../../../components/ui/Card"; -import { useSocket } from "../../../hooks/useSocket"; -import playerManager from "../../../services/PlayerManager"; -import "./styles/DashboardTab.css"; - -const DashboardTab = () => { - const { socket, isConnected } = useSocket(); - const [playerData, setPlayerData] = useState(null); - const [earnedPopup, setEarnedPopup] = useState(false); - const [credits, setCredits] = useState(0); - const [onlineCount, setOnlineCount] = useState( - playerManager.onlinePlayers.length, - ); - - const savedUser = JSON.parse(localStorage.getItem("user")); - const localUsername = savedUser?.username || "Unknown Pilot"; - - useEffect(() => { - const unsubscribe = playerManager.subscribe(({ online }) => { - setOnlineCount(online.length); - }); - - if (!socket) return; - - socket.emit("player:get_dashboard"); - - const handleData = (data) => { - setPlayerData(data); - setCredits(data.credits); - }; - - const handleCreditsUpdate = ({ totalCredits }) => { - setCredits(totalCredits); - setEarnedPopup(true); - setTimeout(() => setEarnedPopup(false), 2000); - }; - - const handleOfflineReport = () => { - socket.emit("player:get_dashboard"); - }; - - socket.on("player:dashboard_data", handleData); - socket.on("player:credits_update", handleCreditsUpdate); - socket.on("player:offline_report", handleOfflineReport); - - return () => { - unsubscribe(); - socket.off("player:dashboard_data", handleData); - socket.off("player:credits_update", handleCreditsUpdate); - socket.off("player:offline_report", handleOfflineReport); - }; - }, [socket]); - - const stats = playerData || { experience: 0, level: 1 }; - const nextLevelExp = 1000; - const expProgress = Math.min((stats.experience / nextLevelExp) * 100, 100); - - return ( -
-
- -
- -
ID_RECOGNITION
-
-
- -
{stats.level}
-
-
-

{localUsername}

-

RANK: VETERAN

-
-
-
-
- EXP: {stats.experience} - NEXT: {nextLevelExp} -
-
-
-
-
-
- - -
FINANCIAL_DATA
-

VALUABLES

-
-
- -
- CREDITS - - {credits.toLocaleString()} - {earnedPopup && +1} - -
-
-
- -
- DATA_CORES - - {Math.floor(stats.experience / 10)} - -
-
-
-
- - -
SYSTEM_DIAGNOSTICS
-

SHIPS_LOG

-
-
- ENGINE - OPTIMAL -
-
- SHIELDS - 100% -
-
- CARGO - NEAR_FULL -
-
- NET - - {isConnected ? ( - - - LIVE: {onlineCount} - - ) : ( - "DISCONNECTED" - )} - -
-
-
-
-
- ); -}; - -export default DashboardTab; diff --git a/client/src/views/GameInterface/tabs/DatapackTab.jsx b/client/src/views/GameInterface/tabs/DatapackTab.jsx deleted file mode 100644 index ee0aa5f..0000000 --- a/client/src/views/GameInterface/tabs/DatapackTab.jsx +++ /dev/null @@ -1,157 +0,0 @@ -import React, { useState, useEffect } from "react"; -import GameDataManager from "../../../services/GameDataManager"; -import MeteorRegion from "../../../components/Meteor/MeteorRegion.jsx"; -import { config } from "../../../config/api"; -import DatapackDetailsModal from "./components/DatapackDetailsModal"; -import "./styles/DatapackTab.css"; - -const DatapackTab = () => { - const [activeSection, setActiveSection] = useState("items"); - const [searchQuery, setSearchQuery] = useState(""); - const [displayList, setDisplayList] = useState([]); - const [selectedItem, setSelectedItem] = useState(null); - - const sections = [ - { id: "items", label: "Items", icon: "fa-box" }, - { id: "hostiles", label: "Hostiles", icon: "fa-biohazard" }, - { id: "dungeons", label: "Dungeons", icon: "fa-dungeon" }, - { id: "recipes", label: "Recipes", icon: "fa-scroll" }, - ]; - - useEffect(() => { - let data = []; - switch (activeSection) { - case "items": - data = Array.from(GameDataManager.items.values()).map((i) => - GameDataManager.getItem(i.id), - ); - break; - case "hostiles": - data = Array.from(GameDataManager.hostiles.values()).map((h) => - GameDataManager.getHostile(h.id), - ); - break; - case "dungeons": - data = Array.from(GameDataManager.dungeons.values()).map((d) => - GameDataManager.getDungeon(d.id), - ); - break; - case "recipes": - data = Array.from(GameDataManager.recipes.values()).map((r) => - GameDataManager.getRecipe(r.id), - ); - break; - default: - data = []; - } - - if (searchQuery) { - const query = searchQuery.toLowerCase(); - data = data.filter( - (item) => - item.displayName?.toLowerCase().includes(query) || - item.id?.toLowerCase().includes(query), - ); - } - setDisplayList(data); - }, [activeSection, searchQuery]); - - return ( -
- -
-
- {sections.map((s) => ( - - ))} -
- -
- - setSearchQuery(e.target.value)} - /> -
-
- -
-
- {displayList.map((item) => ( -
- setSelectedItem({ ...item, sectionType: activeSection }) - } - > -
- {item.texture ? ( - - ) : ( -
- {item.displayName?.[0] || "?"} -
- )} -
- -
- {item.displayName} - {item.id} - - {activeSection === "hostiles" && - item.loot && - item.loot.length > 0 && ( -
- {item.loot.map((lootEntry, idx) => { - const lootData = GameDataManager.getItem( - lootEntry.id, - ); - return ( -
- - - {lootData?.displayName || - lootEntry.id.split(":").pop()} - -
- ); - })} -
- )} -
-
- ))} -
-
-
- {selectedItem && ( - setSelectedItem(null)} - /> - )} -
- ); -}; - -export default DatapackTab; diff --git a/client/src/views/GameInterface/tabs/DungeonsTab.jsx b/client/src/views/GameInterface/tabs/DungeonsTab.jsx deleted file mode 100644 index 1cb340b..0000000 --- a/client/src/views/GameInterface/tabs/DungeonsTab.jsx +++ /dev/null @@ -1,144 +0,0 @@ -import React, { useState, useEffect } from "react"; -import GameDataManager from "../../../services/GameDataManager.js"; -import "./styles/DungeonsTab.css"; - -const DungeonsTab = ({ startDungeon }) => { - const [dungeons, setDungeons] = useState([]); - const [selectedDungeon, setSelectedDungeon] = useState(null); - const [showSelector, setShowSelector] = useState(true); - - useEffect(() => { - const allKeys = Array.from(GameDataManager.dungeons.keys()); - const uniqueDungeons = Array.from(new Set(allKeys)) - .map((id) => GameDataManager.getDungeon(id)) - .filter( - (d, index, self) => d && self.findIndex((t) => t.id === d.id) === index, - ); - - setDungeons(uniqueDungeons); - if (uniqueDungeons.length > 0 && !selectedDungeon) { - setSelectedDungeon(uniqueDungeons[0]); - } - }, []); - - const handleSelectDungeon = (id) => { - const translatedDungeon = GameDataManager.getDungeon(id); - setSelectedDungeon(translatedDungeon); - if (window.innerWidth <= 768) { - setShowSelector(false); - } - }; - - return ( -
-
-
-
-

AVAILABLE_MISSIONS

-
-
- -
- {dungeons.map((dungeon) => ( -
handleSelectDungeon(dungeon.id)} - > -
-
- {dungeon.displayName} - {dungeon.energyCost} EN -
-
- ))} -
-
- -
- {selectedDungeon ? ( -
-
- -
-
MISSION_BRIEFING
-

- {selectedDungeon.displayName} -

-
-
-
- -
-
-

- {selectedDungeon.description || - "No tactical briefing available for this sector."} -

-
- -
-
- -

EXPECTED_REWARDS:

-
- -
- {selectedDungeon.lootTable?.map((loot, idx) => { - const item = GameDataManager.getItem(loot.itemId); - const rarity = item?.meta?.rarity || "common"; - - return ( -
-
- {item?.texture ? ( - {item.displayName} - ) : ( - - )} -
-
- - {item?.displayName || loot.itemId} - - - {loot.chance}% ACQUISITION - -
-
- ); - })} -
-
- -
- -
-
-
- ) : ( -
-
-

WAITING_FOR_COORDINATES...

-
- )} -
-
-
- ); -}; - -export default DungeonsTab; diff --git a/client/src/views/GameInterface/tabs/InventoryTab.jsx b/client/src/views/GameInterface/tabs/InventoryTab.jsx deleted file mode 100644 index e4df088..0000000 --- a/client/src/views/GameInterface/tabs/InventoryTab.jsx +++ /dev/null @@ -1,231 +0,0 @@ -import React, { useState, useEffect, useRef } from "react"; -import ReactDOM from "react-dom"; -import { useSocket } from "../../../hooks/useSocket"; -import GameDataManager from "../../../services/GameDataManager.js"; -import ItemModal from "./components/ItemModal"; -import "./styles/InventoryTab.css"; -import { getServerUrl } from "../../../config/api.js"; -import MeteorRegion from "../../../components/Meteor/MeteorRegion.jsx"; - -const InventoryTab = () => { - const { socket } = useSocket(); - const [items, setItems] = useState([]); - const [equipment, setEquipment] = useState({}); - const [selectedItem, setSelectedItem] = useState(null); - const [showModal, setShowModal] = useState(false); - - const CONNECT_URL = getServerUrl(); - const ASSET_BASE_URL = `${CONNECT_URL}/static/`; - - const manifest = GameDataManager.manifest || {}; - const coreSystems = manifest.core_systems?.categories || {}; - - const getFullTextureUrl = (path) => { - if (!path) return "/assets/no-image.png"; - if (path.startsWith("http")) return path; - return `${ASSET_BASE_URL}${path}`; - }; - - const enrichItemData = (serverItem, currentSlot = null) => { - if (!serverItem || (!serverItem.itemId && !serverItem.id)) return null; - const id = serverItem.itemId || serverItem.id; - const staticData = GameDataManager.getItem(id); - return { - ...serverItem, - ...staticData, - id: id, - textureUrl: getFullTextureUrl(staticData?.texture), - canEquip: !!staticData?.meta?.equipmentSlot, - rarity: staticData?.meta?.rarity || "common", - currentSlot: currentSlot, - }; - }; - - useEffect(() => { - if (!socket) return; - - const refreshData = () => { - socket.emit("player:get_inventory"); - socket.emit("player:get_equipment"); - }; - - refreshData(); - - const handleInventory = (rawItems) => { - setItems(rawItems.map((item) => enrichItemData(item)).filter(Boolean)); - }; - - const handleEquipment = (rawEquip) => { - const mapped = {}; - Object.keys(rawEquip).forEach((slot) => { - if (rawEquip[slot]) { - mapped[slot] = enrichItemData({ itemId: rawEquip[slot] }, slot); - } - }); - setEquipment(mapped); - }; - - socket.on("player:inventory_data", handleInventory); - socket.on("player:equipment_data", handleEquipment); - socket.on("player:item_equipped", refreshData); - socket.on("player:item_unequipped", refreshData); - - return () => { - socket.off("player:inventory_data", handleInventory); - socket.off("player:equipment_data", handleEquipment); - socket.off("player:item_equipped", refreshData); - socket.off("player:item_unequipped", refreshData); - }; - }, [socket]); - - const equipItem = (item) => { - const slot = item.meta?.equipmentSlot; - if (slot) socket.emit("player:equip_item", { itemId: item.id, slot }); - }; - - const unequipItem = (slot) => { - socket.emit("player:unequip_item", { slot }); - }; - - const equipmentSlots = { - personal: Object.keys(coreSystems) - .filter( - (k) => - k.startsWith("original:personal_") && - !k.includes("accessory") && - k !== "original:personal_weapons", - ) - .map((k) => ({ - id: k, - label: GameDataManager.t(coreSystems[k].displayName), - })), - weapons: Object.keys(coreSystems) - .filter((k) => k === "original:personal_weapons") - .map((k) => ({ - id: k, - label: GameDataManager.t(coreSystems[k].displayName), - })), - accessories: Object.keys(coreSystems) - .filter((k) => k.includes("personal_accessory")) - .map((k) => ({ - id: k, - label: GameDataManager.t(coreSystems[k].displayName), - })), - ship: Object.keys(coreSystems) - .filter((k) => k.startsWith("original:ship_")) - .map((k) => ({ - id: k, - label: GameDataManager.t(coreSystems[k].displayName), - })), - }; - - const renderSlotGroup = (title, groupSlots) => ( -
-
{title}
-
- {groupSlots.map((slot) => ( -
- equipment[slot.id] && - (setSelectedItem(equipment[slot.id]), setShowModal(true)) - } - > - {slot.label} -
- {equipment[slot.id] ? ( - - ) : ( - + - )} -
-
- ))} -
-
- ); - - return ( -
-
-
- - {renderSlotGroup("SUIT_GEAR", equipmentSlots.personal)} - {renderSlotGroup("WEAPONRY", equipmentSlots.weapons)} - {renderSlotGroup("ACCESSORIES", equipmentSlots.accessories)} -
- {renderSlotGroup("SHIP_MODULES", equipmentSlots.ship)} - -
- -
- -
- {items.map((item, idx) => { - const isEquipped = Object.values(equipment).some( - (e) => e?.id === item.id, - ); - return ( -
{ - setSelectedItem(item); - setShowModal(true); - }} - > - - {isEquipped &&
E
} - {item.quantity > 1 && ( - {item.quantity} - )} -
- ); - })} -
-
-
-
- - {showModal && - selectedItem && - ReactDOM.createPortal( - e?.id === selectedItem.id) - } - onClose={() => { - setShowModal(false); - setSelectedItem(null); - }} - onEquip={equipItem} - onUnequip={(slot) => { - const actualSlot = - slot || - Object.keys(equipment).find( - (k) => equipment[k].id === selectedItem.id, - ); - unequipItem(actualSlot); - }} - formatStatName={(n) => GameDataManager.getStatName(n).toUpperCase()} - getStatIcon={(n) => GameDataManager.getStatIcon?.(n)} - />, - document.body, - )} -
- ); -}; - -export default InventoryTab; diff --git a/client/src/views/GameInterface/tabs/NotificationTab.jsx b/client/src/views/GameInterface/tabs/NotificationTab.jsx deleted file mode 100644 index 891a5e0..0000000 --- a/client/src/views/GameInterface/tabs/NotificationTab.jsx +++ /dev/null @@ -1,116 +0,0 @@ -import React, { useState, useEffect } from "react"; -import { useSocket } from "../../../hooks/useSocket"; -import "./styles/NotificationsTab.css"; - -const NotificationsTab = () => { - const { socket } = useSocket(); - const [notifications, setNotifications] = useState([]); - - useEffect(() => { - if (!socket) return; - - socket.emit("notifications:get_all"); - - const handleNewNotify = (notify) => { - setNotifications((prev) => [notify, ...prev]); - }; - - const handleInitialNotify = (data) => { - setNotifications(data); - }; - - socket.on("notification:new", handleNewNotify); - socket.on("notifications:list", handleInitialNotify); - - return () => { - socket.off("notification:new", handleNewNotify); - socket.off("notifications:list", handleInitialNotify); - }; - }, [socket]); - - const handleAction = (id, action, data) => { - if (action === "accept_friend") { - socket.emit("friend:accept", { id, friendId: data.fromId }); - socket.emit("notification:read", { id }); - } else if (action === "dismiss") { - socket.emit("notification:dismiss", { id }); - } else { - socket.emit("notification:read", { id }); - } - - setNotifications((prev) => prev.filter((n) => n.id !== id)); - }; - - const getIcon = (type) => { - switch (type) { - case "friend_request": - return "fas fa-user-plus"; - case "crafting": - return "fas fa-hammer"; - case "system": - return "fas fa-robot"; - case "item_received": - return "fas fa-box-open"; - case "inventory_clear": - return "fas fa-trash-alt"; - default: - return "fas fa-bell"; - } - }; - - return ( -
-
-
SYSTEM_ALERTS
-

NOTIFICATIONS

-
- -
- {notifications.length === 0 && ( -
- - NO_ACTIVE_ALERTS_FOUND -
- )} - - {notifications.map((n) => ( -
-
- -
-
-
-

{n.title}

- - {new Date(n.createdAt).toLocaleTimeString([], { - hour: "2-digit", - minute: "2-digit", - })} - -
-

{n.message}

-
-
- {n.type === "friend_request" && ( - - )} - -
-
- ))} -
-
- ); -}; - -export default NotificationsTab; diff --git a/client/src/views/GameInterface/tabs/QuestsTab.jsx b/client/src/views/GameInterface/tabs/QuestsTab.jsx deleted file mode 100644 index 39a5390..0000000 --- a/client/src/views/GameInterface/tabs/QuestsTab.jsx +++ /dev/null @@ -1,172 +0,0 @@ -import React, { useEffect, useState, useMemo } from "react"; -import Card from "../../../components/ui/Card"; -import { useSocket } from "../../../hooks/useSocket"; -import gameDataManager from "../../../services/GameDataManager"; -import "./styles/QuestsTab.css"; - -const QuestsTab = () => { - const { socket } = useSocket(); - const [quests, setQuests] = useState([]); - const [loading, setLoading] = useState(true); - const [activeTab, setActiveTab] = useState("ACTIVE"); - - useEffect(() => { - if (!socket) return; - - socket.emit("quest:get_list"); - - const localize = (q) => { - const staticData = gameDataManager.getQuest(q.id); - return { - ...q, - displayName: staticData?.displayName || q.id, - description: staticData?.description || "", - objectives: q.objectives.map((obj, idx) => ({ - ...obj, - description: staticData?.objectives[idx]?.description || obj.type, - })), - }; - }; - - const handleQuestData = (data) => { - const uniqueQuests = new Map(); - data.forEach((q) => { - uniqueQuests.set(q.id, localize(q)); - }); - - setQuests(Array.from(uniqueQuests.values())); - setLoading(false); - }; - - const handleQuestUpdate = (updatedQuest) => { - setQuests((prev) => { - const localized = localize(updatedQuest); - const questMap = new Map(prev.map((q) => [q.id, q])); - questMap.set(localized.id, localized); - return Array.from(questMap.values()); - }); - }; - - socket.on("quest:list_data", handleQuestData); - socket.on("quest:update", handleQuestUpdate); - - return () => { - socket.off("quest:list_data", handleQuestData); - socket.off("quest:update", handleQuestUpdate); - }; - }, [socket]); - - const filteredQuests = useMemo(() => { - return quests.filter((q) => - activeTab === "ACTIVE" - ? q.status === "active" || q.status === "ready" - : q.status === "completed", - ); - }, [quests, activeTab]); - - const renderObjective = (obj, index) => { - const progress = Math.min( - (obj.currentAmount / obj.requiredAmount) * 100, - 100, - ); - return ( -
-
- {obj.description || obj.type} - - {obj.currentAmount} / {obj.requiredAmount} - -
-
-
-
-
- ); - }; - - return ( -
-
-
-

- MISSION_LOG -

-
- - -
-
-
- {loading ? ( -
SCANNING_NEURAL_NETWORK...
- ) : ( -
- {filteredQuests.length > 0 ? ( - filteredQuests.map((quest) => ( - -
{quest.category || "MISSION"}
-
-

{quest.displayName}

-

{quest.description}

-
-
-
OBJECTIVES
- {quest.objectives.map((obj, idx) => - renderObjective(obj, idx), - )} -
-
-
REWARDS
-
- {quest.rewards?.credits > 0 && ( - - +{quest.rewards.credits} CR - - )} - {quest.rewards?.xp > 0 && ( - - +{quest.rewards.xp} XP - - )} -
-
- {quest.status === "ready" && ( - - )} - {quest.status === "completed" && ( -
MISSION_ACCOMPLISHED
- )} -
- )) - ) : ( -
-

NO_{activeTab}_SIGNALS_FOUND

-
- )} -
- )} -
- ); -}; - -export default QuestsTab; diff --git a/client/src/views/GameInterface/tabs/ShopTab.jsx b/client/src/views/GameInterface/tabs/ShopTab.jsx deleted file mode 100644 index 041f623..0000000 --- a/client/src/views/GameInterface/tabs/ShopTab.jsx +++ /dev/null @@ -1,46 +0,0 @@ -import React, { useState } from 'react'; -import CategorySelector from "../components/CategorySelector"; // Імпортуємо твій новий компонент -import "./styles/ShopTab.css"; - -const ShopTab = () => { - const [category, setCategory] = useState('ships'); - const categories = ['Featured', 'ships', 'weapons', 'armors', 'cosmetics', 'materials']; - - return ( -
-
- -
- {/* Використовуємо універсальний компонент замість ручного мапінгу */} - - -
-
- - 10 -
-
- - 1,000 -
-
-
- -
-
-
-

Browsing {category}...

- {/* Тут буде логіка відображення товарів */} -
-
-
-
-
- ); -}; - -export default ShopTab; diff --git a/client/src/views/GameInterface/tabs/SkillsTab.jsx b/client/src/views/GameInterface/tabs/SkillsTab.jsx deleted file mode 100644 index 3a197a5..0000000 --- a/client/src/views/GameInterface/tabs/SkillsTab.jsx +++ /dev/null @@ -1,115 +0,0 @@ -import React, { useState, useEffect } from "react"; -import { useSocket } from "../../../hooks/useSocket"; -import GameDataManager from "../../../services/GameDataManager"; -import "./styles/SkillsTab.css"; -import CategorySelector from "../components/CategorySelector"; -import MeteorRegion from "../../../components/Meteor/MeteorRegion.jsx"; -import { SkillCard } from "./components/SkillsCard.jsx"; - -const SkillsTab = () => { - const { socket } = useSocket(); - - const [categories, setCategories] = useState([]); - const [activeCategory, setActiveCategory] = useState(""); - const [skills, setSkills] = useState([]); - const [playerSkills, setPlayerSkills] = useState({}); - const [skillPoints, setSkillPoints] = useState(0); - - useEffect(() => { - const manifestCategories = GameDataManager.getSkillCategories(); - setCategories(manifestCategories); - - if (manifestCategories.length > 0) { - setActiveCategory(manifestCategories[0].id); - } - }, []); - - useEffect(() => { - if (activeCategory) { - const filtered = GameDataManager.getSkillsByCategory(activeCategory); - setSkills(filtered); - } - }, [activeCategory]); - - useEffect(() => { - if (!socket) return; - - socket.emit("player:get_skill_points"); - socket.emit("player:get_skills"); - - const handleSkillPoints = (data) => setSkillPoints(data.points || 0); - const handleSkillsData = (data) => setPlayerSkills(data.skills || {}); - - socket.on("player:skill_points_data", handleSkillPoints); - socket.on("player:skills_data", handleSkillsData); - - return () => { - socket.off("player:skill_points_data", handleSkillPoints); - socket.off("player:skills_data", handleSkillsData); - }; - }, [socket]); - - const handleUpgrade = (skillId) => { - socket.emit("player:upgrade_skill", { skillId }); - }; - - return ( -
- -
-
-

- Neural Core -

-
- Uplink Points: - {skillPoints} -
-
-
- - - -
- {skills.length > 0 ? ( - skills.map((skill) => { - const progress = playerSkills[skill.id] || { - level: 0, - experience: 0, - }; - const maxLv = skill.meta?.topLevel || 10; - - const cost = progress.level === 0 ? 2 : 1; - - return ( - = cost} - onUpgrade={() => handleUpgrade(skill.id)} - /> - ); - }) - ) : ( -
- -

No active modules found in this sector.

-
- )} -
-
-
- ); -}; - -export default SkillsTab; diff --git a/client/src/views/GameInterface/tabs/components/CraftModal.css b/client/src/views/GameInterface/tabs/components/CraftModal.css deleted file mode 100644 index afee4f2..0000000 --- a/client/src/views/GameInterface/tabs/components/CraftModal.css +++ /dev/null @@ -1,198 +0,0 @@ -.craft-modal-overlay { - position: fixed; - top: 0; - left: 0; - width: 100vw; - height: 100vh; - background: rgba(0, 0, 0, 0.85); - display: flex; - justify-content: center; - align-items: center; - z-index: 9999; - backdrop-filter: blur(6px); -} - -.craft-modal { - background: #0f1115; - border: 1px solid rgba(0, 210, 255, 0.3); - width: 90%; - max-width: 400px; /* Трохи вужча для компактності */ - border-radius: 12px; - position: relative; - padding: 20px; - box-shadow: 0 15px 40px rgba(0, 0, 0, 0.9); - animation: modalSlideUp 0.3s ease-out; - color: #fff; -} - -/* Header Section */ -.modal-header-compact { - display: flex; - align-items: center; - gap: 15px; - margin-bottom: 18px; -} - -.item-icon-box { - width: 70px; - height: 70px; - background: rgba(0, 0, 0, 0.5); - border: 1px solid rgba(0, 210, 255, 0.4); - border-radius: 8px; - display: flex; - align-items: center; - justify-content: center; - position: relative; - box-shadow: inset 0 0 10px rgba(0, 210, 255, 0.1); -} - -.item-icon-box img { - width: 50px; - height: 50px; - object-fit: contain; -} - -.item-info-title h3 { - margin: 0; - font-family: "Orbitron", sans-serif; - font-size: 1.1rem; - color: #00d2ff; - text-transform: uppercase; -} - -.item-tag { - font-size: 0.65rem; - color: #888; - letter-spacing: 1px; -} - -/* Sections */ -.details-section { - margin-bottom: 15px; -} - -.section-label { - font-size: 0.75rem; - text-transform: uppercase; - color: #00d2ff; - margin-bottom: 8px; - opacity: 0.8; - display: block; -} - -.description-text { - font-size: 0.85rem; - color: #aaa; - font-style: italic; - line-height: 1.4; -} - -/* Resource List */ -.res-container { - background: rgba(0, 0, 0, 0.3); - border-radius: 8px; - padding: 10px; - border: 1px solid rgba(255, 255, 255, 0.05); -} - -.res-row { - display: flex; - justify-content: space-between; - align-items: center; - padding: 6px 0; - border-bottom: 1px solid rgba(255, 255, 255, 0.03); -} - -.res-row:last-child { - border-bottom: none; -} - -.res-name { - font-size: 0.9rem; - color: #ccc; - display: flex; - align-items: center; - gap: 8px; -} - -.res-amount { - font-family: "Courier New", monospace; - font-size: 0.9rem; -} - -.val-bad { - color: #ff4444; -} -.val-good { - color: #00ff88; -} - -/* Progress & Outcome */ -.outcome-bar { - display: flex; - justify-content: space-between; - font-size: 0.85rem; - margin-top: 10px; - color: #888; -} - -.outcome-bar strong { - color: #fff; -} - -/* Buttons */ -.btn-craft-action { - width: 100%; - padding: 12px; - margin-top: 20px; - font-family: "Orbitron", sans-serif; - font-size: 0.8rem; - cursor: pointer; - transition: all 0.2s; - border-radius: 4px; - text-transform: uppercase; -} - -.btn-primary-craft { - background: rgba(0, 210, 255, 0.1); - border: 1px solid #00d2ff; - color: #00d2ff; -} - -.btn-primary-craft:hover:not(:disabled) { - background: #00d2ff; - color: #000; - box-shadow: 0 0 15px rgba(0, 210, 255, 0.3); -} - -.btn-primary-craft:disabled { - border-color: #444; - color: #444; - cursor: not-allowed; -} - -.close-btn-top { - position: absolute; - top: 12px; - right: 12px; - background: none; - border: none; - color: #555; - font-size: 20px; - cursor: pointer; -} - -.close-btn-top:hover { - color: #fff; -} - -@keyframes modalSlideUp { - from { - transform: translateY(15px); - opacity: 0; - } - to { - transform: translateY(0); - opacity: 1; - } -} diff --git a/client/src/views/GameInterface/tabs/components/CraftModal.jsx b/client/src/views/GameInterface/tabs/components/CraftModal.jsx deleted file mode 100644 index 91258cf..0000000 --- a/client/src/views/GameInterface/tabs/components/CraftModal.jsx +++ /dev/null @@ -1,163 +0,0 @@ -import React from "react"; -import "./CraftModal.css"; -import { getServerUrl } from "../../../../config/api"; - -const CraftModal = ({ - recipe, - onClose, - onStartCraft, - activeCraft, - getOwnedAmount, -}) => { - if (!recipe) return null; - - const CONNECT_URL = getServerUrl(); - const ASSET_BASE_URL = `${CONNECT_URL}/static/`; - - const getFullTextureUrl = (path) => { - if (!path) return "/assets/no-image.png"; - return path.startsWith("http") ? path : `${ASSET_BASE_URL}${path}`; - }; - - const isBusy = !!activeCraft; - const outputQty = Object.values(recipe.output || {})[0] || 1; - const canAfford = recipe.ingredients?.every( - (ing) => getOwnedAmount(ing.itemId) >= ing.quantity, - ); - - return ( -
-
e.stopPropagation()}> - - - {/* Header: Icon + Title */} -
-
- {recipe.displayName} -
- x{outputQty} -
-
-
- PROTOTYPE_UNIT -

{recipe.displayName}

-
-
- - {/* Description */} -
-

- {recipe.description || - "Advanced composite material for high-tier construction."} -

-
- - {/* Resources */} -
- Required Materials -
- {recipe.ingredients?.map((ing) => { - const owned = getOwnedAmount(ing.itemId); - const hasEnough = owned >= ing.quantity; - return ( -
- - - {ing.displayName} - - - {owned} / {ing.quantity} - -
- ); - })} -
-
- - {/* Outcome Info */} -
- - Production Time: {recipe.time_seconds}s - -
- - {/* Action Button */} -
- {activeCraft && activeCraft.recipeId === recipe.id ? ( -
-
- Constructing... {activeCraft.timeLeft}s -
-
-
-
-
- ) : ( - - )} -
-
-
- ); -}; - -export default CraftModal; diff --git a/client/src/views/GameInterface/tabs/components/DatapackDetailsModal.css b/client/src/views/GameInterface/tabs/components/DatapackDetailsModal.css deleted file mode 100644 index 3259bc6..0000000 --- a/client/src/views/GameInterface/tabs/components/DatapackDetailsModal.css +++ /dev/null @@ -1,152 +0,0 @@ -.datapack-modal-content { - background: #0f1115; - border: 1px solid var(--border-color); - width: 90%; - max-width: 450px; - border-radius: 12px; - position: relative; - padding: 25px; - box-shadow: 0 20px 50px rgba(0, 0, 0, 0.8); - animation: modalSlideUp 0.3s ease-out; -} - -.modal-headerr { - display: flex; - align-items: center; - gap: 20px; - justify-content: left; - margin-bottom: 20px; - padding-bottom: 15px; - border-bottom: 1px solid rgba(255, 255, 255, 0.05); -} - -.modal-icon-big { - width: 80px; - height: 80px; - background: rgba(0, 0, 0, 0.4); - border: 1px solid var(--border-color); - border-radius: 8px; - display: flex; - align-items: center; - justify-content: center; -} - -.modal-icon-big img { - width: 60px; -} - -.modal-title-group h3 { - margin: 0; - font-family: "Orbitron", sans-serif; - color: var(--primary-color); - font-size: 1.3rem; -} - -.modal-raw-id { - font-size: 0.75rem; - color: var(--text-secondary); - opacity: 0.6; -} - -.details-description { - font-size: 0.9rem; - line-height: 1.5; - color: #ccc; - margin-bottom: 20px; - font-style: italic; -} - -.details-section h4 { - font-size: 0.8rem; - text-transform: uppercase; - color: var(--text-secondary); - letter-spacing: 1px; - margin-bottom: 10px; - border-left: 3px solid var(--primary-color); - padding-left: 10px; -} - -.stat-row { - display: flex; - justify-content: space-between; - padding: 6px 0; - border-bottom: 1px solid rgba(255, 255, 255, 0.03); -} - -.stat-label { - color: #888; - font-size: 0.85rem; -} -.stat-value { - color: #fff; - font-family: monospace; -} - -@keyframes modalSlideUp { - from { - transform: translateY(20px); - opacity: 0; - } - to { - transform: translateY(0); - opacity: 1; - } -} - -.loot-list-full { - display: flex; - flex-direction: column; - gap: 10px; - background: rgba(0, 0, 0, 0.2); - padding: 12px; - border-radius: 8px; -} - -.loot-detail-item { - display: flex; - align-items: center; - gap: 12px; - padding: 8px; - border-bottom: 1px solid rgba(255, 255, 255, 0.05); -} - -.loot-detail-item:last-child { - border-bottom: none; -} - -.loot-item-icon { - width: 40px; - height: 40px; - background: rgba(255, 255, 255, 0.05); - border-radius: 6px; - display: flex; - align-items: center; - justify-content: center; -} - -.loot-item-icon img { - width: 32px; - height: 32px; - object-fit: contain; -} - -.loot-item-info { - display: flex; - flex-direction: column; -} - -.loot-item-name { - font-weight: 600; - color: #fff; - font-size: 14px; -} - -.loot-item-meta { - font-size: 12px; - color: #aaa; -} - -.fallback-mini { - color: #444; - font-weight: bold; -} diff --git a/client/src/views/GameInterface/tabs/components/DatapackDetailsModal.jsx b/client/src/views/GameInterface/tabs/components/DatapackDetailsModal.jsx deleted file mode 100644 index 182341e..0000000 --- a/client/src/views/GameInterface/tabs/components/DatapackDetailsModal.jsx +++ /dev/null @@ -1,130 +0,0 @@ -import React from "react"; -import GameDataManager from "../../../../services/GameDataManager"; -import { config } from "../../../../config/api"; -import "./DatapackDetailsModal.css"; - -const DatapackDetailsModal = ({ data, onClose }) => { - if (!data) return null; - - const renderStats = () => { - if (!data.stats) return null; - return ( -
- {Object.entries(data.stats).map(([key, value]) => ( -
- - {GameDataManager.getStatName(key) || key}: - - {value} -
- ))} -
- ); - }; - - const renderLoot = () => { - if (!data.loot || data.loot.length === 0) return null; - - return ( -
-

Loot Table

-
- {data.loot.map((entry, idx) => { - const itemInfo = GameDataManager.getItem(entry.id); - const countDisplay = - typeof entry.count === "object" - ? `${entry.count.min}-${entry.count.max}` - : entry.count; - - return ( -
-
- {itemInfo?.texture ? ( - {itemInfo.displayName} - ) : ( -
?
- )} -
-
- - {itemInfo?.displayName || entry.id} - - - {Math.round(entry.chance * 100)}% chance • Amount:{" "} - {countDisplay} - -
-
- ); - })} -
-
- ); - }; - - return ( -
-
e.stopPropagation()} - > - - -
-
- {data.texture ? ( - - ) : ( -
{data.displayName?.[0]}
- )} -
-
-

{data.displayName}

- {data.id} -
-
- -
- {data.description && ( -

{data.description}

- )} - -
-

Properties & Stats

- {renderStats()} - - {data.sectionType === "hostiles" && data.level && ( -
- Base Level: - {data.level} -
- )} -
- - {data.sectionType === "hostiles" && renderLoot()} - - {data.ingredients && ( -
-

Recipe Requirements

-
- {data.ingredients.map((ing, idx) => ( -
- {ing.displayName} - x{ing.quantity} -
- ))} -
-
- )} -
-
-
- ); -}; - -export default DatapackDetailsModal; diff --git a/client/src/views/GameInterface/tabs/components/DungeonFinish.css b/client/src/views/GameInterface/tabs/components/DungeonFinish.css deleted file mode 100644 index 2e5855a..0000000 --- a/client/src/views/GameInterface/tabs/components/DungeonFinish.css +++ /dev/null @@ -1,187 +0,0 @@ -.dungeon-summary-overlay { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: rgba(2, 5, 8, 0.95); - display: flex; - align-items: center; - justify-content: center; - z-index: 9999; - backdrop-filter: blur(8px); -} - -.summary-card { - width: 490px; - background: #0a0f18; - border: 1px solid #00d4ff; - padding: 40px; - position: relative; - box-shadow: 0 0 50px rgba(0, 212, 255, 0.15); -} - -.summary-title { - color: #00d4ff; - font-family: "Orbitron", sans-serif; - letter-spacing: 4px; - margin-bottom: 5px; - font-size: 1.5rem; -} - -.summary-line { - height: 2px; - background: linear-gradient(90deg, #00d4ff, transparent); - margin-bottom: 30px; -} - -.reward-stats { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 20px; - margin-bottom: 30px; -} - -.stat-box { - background: rgba(26, 38, 56, 0.3); - padding: 15px; - border-left: 3px solid #00d4ff; - display: flex; - flex-direction: column; -} - -.stat-label { - font-size: 10px; - color: #4a5d75; - margin-bottom: 5px; -} - -.stat-value { - font-size: 1.2rem; - font-weight: bold; -} - -.loot-grid { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(70px, 1fr)); - gap: 15px; - margin-top: 15px; - max-height: 250px; - overflow-y: auto; - padding-right: 5px; -} - -.loot-item-slot { - width: 70px; - height: 70px; - background: #05080c; - border: 1px solid #1a2638; - display: flex; - align-items: center; - justify-content: center; - position: relative; -} - -.loot-img-container img { - max-width: 80%; - max-height: 80%; -} - -.loot-qty { - position: absolute; - bottom: 2px; - right: 5px; - font-size: 11px; - color: #00d4ff; - font-weight: bold; - text-shadow: 1px 1px 2px #000; -} - -.summary-btn { - margin-top: 40px; - width: 100%; - padding: 15px; - background: transparent; - border: 1px solid #00d4ff; - color: #00d4ff; - font-family: "Orbitron", sans-serif; - cursor: pointer; - transition: all 0.3s ease; - text-transform: uppercase; - letter-spacing: 2px; -} - -.summary-btn:hover { - background: rgba(0, 212, 255, 0.1); - box-shadow: inset 0 0 15px rgba(0, 212, 255, 0.3); -} - -@media screen and (max-width: 768px) { - .dungeon-summary-overlay { - padding: 15px; - } - - .summary-card { - width: 100%; - max-width: 400px; - padding: 25px 20px; - box-sizing: border-box; - } - - .summary-title { - font-size: 1.1rem; - letter-spacing: 2px; - text-align: center; - } - - .summary-line { - margin-bottom: 20px; - } - - .reward-stats { - grid-template-columns: 1fr; - gap: 10px; - margin-bottom: 20px; - } - - .stat-box { - padding: 10px; - } - - .stat-value { - font-size: 1rem; - } - - .loot-grid { - grid-template-columns: repeat(auto-fill, minmax(60px, 1fr)); - gap: 10px; - max-height: 200px; - } - - .loot-item-slot { - width: 60px; - height: 60px; - } - - .summary-btn { - margin-top: 25px; - padding: 12px; - font-size: 0.8rem; - letter-spacing: 1px; - } -} - -@media screen and (max-width: 380px) { - .summary-card { - padding: 20px 15px; - } - - .loot-grid { - grid-template-columns: repeat(4, 1fr); - } - - .loot-item-slot { - width: 55px; - height: 55px; - } -} diff --git a/client/src/views/GameInterface/tabs/components/DungeonFinish.jsx b/client/src/views/GameInterface/tabs/components/DungeonFinish.jsx deleted file mode 100644 index 03a6aa4..0000000 --- a/client/src/views/GameInterface/tabs/components/DungeonFinish.jsx +++ /dev/null @@ -1,74 +0,0 @@ -import React from "react"; -import GameDataManager from "../../../../services/GameDataManager.js"; -import { getServerUrl } from "../../../../config/api.js"; -import "./DungeonFinish.css"; -const DungeonFinish = ({ rewards, onExit }) => { - const CONNECT_URL = getServerUrl(); - const ASSET_BASE_URL = `${CONNECT_URL}/static/`; - - const getFullTextureUrl = (path) => { - if (!path) return "/assets/no-image.png"; - if (path.startsWith("http")) return path; - return `${ASSET_BASE_URL}${path}`; - }; - - return ( -
-
-
-
-

- MISSION_ACCOMPLISHED -

-
-
-
- -
-
-
- EXPERIENCE_DATA - +{rewards.xp || 0} XP -
-
- CREDITS_TRANSFER - - +{rewards.credits || 0} CR - -
-
- -
-

ASSETS_RECOVERED

-
- {rewards.items && rewards.items.length > 0 ? ( - rewards.items.map((item, idx) => { - const itemData = GameDataManager.getItem(item.id); - const textureUrl = getFullTextureUrl(itemData?.texture); - - return ( -
-
- -
- x{item.count} -
-
- ); - }) - ) : ( -
NO_RESOURCES_FOUND
- )} -
-
-
- - -
-
- ); -}; - -export default DungeonFinish; diff --git a/client/src/views/GameInterface/tabs/components/ItemModal.css b/client/src/views/GameInterface/tabs/components/ItemModal.css deleted file mode 100644 index ed83873..0000000 --- a/client/src/views/GameInterface/tabs/components/ItemModal.css +++ /dev/null @@ -1,214 +0,0 @@ -.modal-overlay { - position: fixed; - top: 0; - left: 0; - width: 100vw; - height: 100vh; - background: rgba(0, 0, 0, 0.85); - display: flex; - justify-content: center; - align-items: center; - z-index: 9999; - backdrop-filter: blur(4px); -} - -.datapack-modal-content { - background: #0f1115; - border: 1px solid rgba(0, 210, 255, 0.3); - width: 90%; - max-width: 450px; - border-radius: 12px; - position: relative; - padding: 25px; - box-shadow: 0 20px 50px rgba(0, 0, 0, 0.8); - animation: modalSlideUp 0.3s ease-out; - color: #fff; -} - -.modal-header { - display: flex; - align-items: center; - gap: 20px; - margin-bottom: 20px; - padding-bottom: 15px; - border-bottom: 1px solid rgba(255, 255, 255, 0.05); -} - -.modal-icon-big { - width: 80px; - height: 80px; - background: rgba(0, 0, 0, 0.4); - border: 1px solid rgba(255, 255, 255, 0.1); - border-radius: 8px; - display: flex; - align-items: center; - justify-content: center; - flex-shrink: 0; -} - -.modal-icon-big img { - width: 60px; - height: 60px; - object-fit: contain; -} - -.modal-icon-big.common { - border-color: #888; -} -.modal-icon-big.rare { - border-color: #0070dd; - box-shadow: inset 0 0 10px rgba(0, 112, 221, 0.2); -} -.modal-icon-big.epic { - border-color: #a335ee; - box-shadow: inset 0 0 10px rgba(163, 53, 238, 0.2); -} -.modal-icon-big.legendary { - border-color: #ff8000; - box-shadow: inset 0 0 10px rgba(255, 128, 0, 0.2); -} - -.modal-title-group h3 { - margin: 0; - font-family: "Orbitron", sans-serif; - font-size: 1.3rem; - text-transform: uppercase; -} - -.modal-title-group h3.common { - color: #fff; -} -.modal-title-group h3.rare { - color: #00d2ff; -} -.modal-title-group h3.epic { - color: #a335ee; -} -.modal-title-group h3.legendary { - color: #ff8000; -} - -.modal-raw-id { - font-size: 0.7rem; - color: #888; - margin-top: 4px; - font-family: monospace; -} - -.details-description { - font-size: 0.9rem; - line-height: 1.5; - color: #aaa; - margin-bottom: 20px; - font-style: italic; -} - -.details-section h4 { - font-size: 0.8rem; - text-transform: uppercase; - color: #00d2ff; - letter-spacing: 1px; - margin-bottom: 10px; - border-left: 3px solid #00d2ff; - padding-left: 10px; -} - -.item-stats-container { - background: rgba(0, 0, 0, 0.2); - padding: 10px; - border-radius: 8px; -} - -.stat-row { - display: flex; - justify-content: space-between; - padding: 8px 0; - border-bottom: 1px solid rgba(255, 255, 255, 0.03); -} - -.stat-row:last-child { - border-bottom: none; -} - -.stat-label { - color: #888; - font-size: 0.85rem; - display: flex; - align-items: center; - gap: 8px; -} - -.stat-value { - color: #00ff88; - font-family: monospace; - font-weight: bold; -} - -.btn-equip { - width: 100%; - padding: 12px; - background: rgba(0, 210, 255, 0.05); - border: 1px solid #00d2ff; - color: #00d2ff; - cursor: pointer; - font-family: "Orbitron", sans-serif; - font-size: 0.8rem; - transition: all 0.2s; -} - -.btn-equip:hover { - background: #00d2ff; - color: #000; -} - -.btn-equip.unequip { - border-color: #ff4444; - color: #ff4444; - background: rgba(255, 68, 68, 0.05); -} - -.btn-equip.unequip:hover { - background: #ff4444; - color: #fff; -} - -.modal-close { - position: absolute; - top: 15px; - right: 15px; - background: none; - border: none; - color: #444; - font-size: 24px; - cursor: pointer; -} - -@keyframes modalSlideUp { - from { - transform: translateY(20px); - opacity: 0; - } - to { - transform: translateY(0); - opacity: 1; - } -} - -.item-qty-tag { - position: absolute; - bottom: -5px; - right: -5px; - background: #00d2ff; - color: #000; - padding: 2px 6px; - font-size: 11px; - font-weight: bold; - border-radius: 3px; - font-family: monospace; - box-shadow: 0 0 10px rgba(0, 210, 255, 0.5); -} - -.btn-equip { - letter-spacing: 2px; - font-weight: 600; -} diff --git a/client/src/views/GameInterface/tabs/components/ItemModal.jsx b/client/src/views/GameInterface/tabs/components/ItemModal.jsx deleted file mode 100644 index a72dd08..0000000 --- a/client/src/views/GameInterface/tabs/components/ItemModal.jsx +++ /dev/null @@ -1,120 +0,0 @@ -import React, { useEffect } from "react"; -import "./ItemModal.css"; -import { getServerUrl } from "../../../../config/api"; - -const ItemModal = ({ - item, - onClose, - onEquip, - onUnequip, - isEquipped, - getStatIcon, - formatStatName, -}) => { - useEffect(() => { - const handleKeyDown = (event) => { - if (event.keyCode === 69) { - if (isEquipped) { - onUnequip(item.currentSlot); - } else if (item && item.canEquip) { - onEquip(item); - } - onClose(); - } - }; - - window.addEventListener("keydown", handleKeyDown); - - return () => { - window.removeEventListener("keydown", handleKeyDown); - }; - }, [item, isEquipped, onEquip, onUnequip, onClose]); - - if (!item) return null; - - const CONNECT_URL = getServerUrl(); - const ASSET_BASE_URL = `${CONNECT_URL}/static/`; - - const getFullTextureUrl = (path) => { - if (!path) return "/assets/no-image.png"; - if (path.startsWith("http")) return path; - return `${ASSET_BASE_URL}${path}`; - }; - - return ( -
-
e.stopPropagation()} - > - - -
-
- {item.displayName} -
-
-

{item.displayName || item.name}

-
- {item.rarity?.toUpperCase()} SYSTEM_ID: {item.id} -
-
-
- -
-

{item.description}

-
- -
-

- Technical Specs -

-
- {item.stats && - Object.entries(item.stats).map(([statName, value]) => ( -
- - {" "} - {formatStatName - ? formatStatName(statName) - : statName.toUpperCase()} - - +{value} -
- ))} -
-
- -
- {isEquipped ? ( - - ) : ( - item.canEquip && ( - - ) - )} -
-
-
- ); -}; - -export default ItemModal; diff --git a/client/src/views/GameInterface/tabs/components/SkillsCard.css b/client/src/views/GameInterface/tabs/components/SkillsCard.css deleted file mode 100644 index 7ef375c..0000000 --- a/client/src/views/GameInterface/tabs/components/SkillsCard.css +++ /dev/null @@ -1,175 +0,0 @@ -.skill-item-card { - background: rgba(10, 15, 24, 0.95); - border: 1px solid #1a2638; - border-radius: 2px; - padding: 15px; - display: flex; - flex-direction: column; - gap: 12px; - position: relative; - transition: all 0.3s ease; - overflow: hidden; -} - -.skill-item-card:hover { - border-color: #00d4ff; - box-shadow: 0 0 15px rgba(0, 212, 255, 0.1); -} - -.skill-item-card.locked { - border-style: dashed; - opacity: 0.8; -} - -.skill-item-card.locked .skill-icon-wrapper { - color: #4a5d75; - border-color: #1a2638; -} - -.skill-item-card.mastered { - border-color: #00ff88; -} - -.skill-card-header { - display: flex; - align-items: center; - gap: 12px; -} - -.skill-icon-wrapper { - width: 40px; - height: 40px; - background: #05080c; - border: 1px solid #00d4ff; - display: flex; - align-items: center; - justify-content: center; - font-size: 18px; - color: #00d4ff; - flex-shrink: 0; -} - -.skill-title-block { - flex: 1; -} - -.skill-name { - font-size: 0.9rem; - font-weight: 900; - color: #fff; - text-transform: uppercase; - letter-spacing: 0.5px; - margin-bottom: 2px; -} - -.skill-level-tag { - font-size: 10px; - color: #4a5d75; - font-family: "Space Mono", monospace; -} - -.mastered .skill-level-tag { - color: #00ff88; -} - -.skill-desc { - font-size: 11px; - color: #a0aec0; - line-height: 1.4; - margin: 0; - min-height: 32px; -} - -.skill-progress-section { - margin-top: 5px; -} - -.progress-info { - display: flex; - justify-content: space-between; - font-size: 9px; - color: #4a5d75; - margin-bottom: 4px; - text-transform: uppercase; -} - -.skill-progress-bar { - height: 4px; - background: #05080c; - border: 1px solid #1a2638; - position: relative; -} - -.skill-progress-bar .fill { - height: 100%; - background: linear-gradient(90deg, #00d4ff, #00ff88); - transition: width 0.4s cubic-bezier(0.4, 0, 0.2, 1); -} - -.skill-card-actions { - margin-top: auto; - padding-top: 10px; -} - -.btn-skill-unlock, -.btn-skill-upgrade { - width: 100%; - background: transparent; - border: 1px solid #00d4ff; - color: #00d4ff; - padding: 8px; - font-size: 10px; - font-weight: 900; - text-transform: uppercase; - cursor: pointer; - transition: all 0.2s ease; - font-family: "Space Mono", monospace; -} - -.btn-skill-unlock:hover:not(:disabled), -.btn-skill-upgrade:hover:not(:disabled) { - background: rgba(0, 212, 255, 0.1); - box-shadow: 0 0 10px rgba(0, 212, 255, 0.2); -} - -.btn-skill-unlock { - border-color: #ffaa00; - color: #ffaa00; -} - -.btn-skill-unlock:hover:not(:disabled) { - background: rgba(255, 170, 0, 0.1); - box-shadow: 0 0 10px rgba(255, 170, 0, 0.2); -} - -.btn-skill-unlock:disabled, -.btn-skill-upgrade:disabled { - border-color: #1a2638; - color: #4a5d75; - cursor: not-allowed; - opacity: 0.5; -} - -.mastery-label { - text-align: center; - font-size: 10px; - color: #00ff88; - font-weight: 900; - padding: 8px; - border: 1px solid rgba(0, 255, 136, 0.2); - background: rgba(0, 255, 136, 0.05); -} - -.lock-requirement { - position: absolute; - bottom: 0; - left: 0; - width: 100%; - background: rgba(255, 68, 68, 0.1); - color: #ff4444; - font-size: 8px; - text-align: center; - padding: 2px 0; - text-transform: uppercase; - font-weight: 900; -} diff --git a/client/src/views/GameInterface/tabs/components/SkillsCard.jsx b/client/src/views/GameInterface/tabs/components/SkillsCard.jsx deleted file mode 100644 index 54fdbf1..0000000 --- a/client/src/views/GameInterface/tabs/components/SkillsCard.jsx +++ /dev/null @@ -1,76 +0,0 @@ -import "./SkillsCard.css"; - -export const SkillCard = ({ - skill, - level, - maxLevel, - experience, - onUpgrade, - canAfford, -}) => { - const isLocked = level === 0; - const isMaxLevel = level >= maxLevel; - - const expToNext = Math.floor(100 * Math.pow(1.5, level)); - const progressPercent = Math.min(100, (experience / expToNext) * 100); - - return ( -
-
-
- {/* Іконка може бути в meta або за дефолтом */} - -
-
-
{skill.displayName}
-
- {isMaxLevel ? "MAXED" : `RANK ${level}/${maxLevel}`} -
-
-
- -

{skill.description}

- - {!isMaxLevel && !isLocked && ( -
-
- Neural Sync - - {Math.floor(experience)} / {expToNext} - -
-
-
-
-
- )} - -
- {isLocked ? ( - - ) : isMaxLevel ? ( -
MODULE FULLY OPTIMIZED
- ) : ( - - )} -
-
- ); -}; diff --git a/client/src/views/GameInterface/tabs/styles/BaseTab.css b/client/src/views/GameInterface/tabs/styles/BaseTab.css deleted file mode 100644 index e69de29..0000000 diff --git a/client/src/views/GameInterface/tabs/styles/ChatTab.css b/client/src/views/GameInterface/tabs/styles/ChatTab.css deleted file mode 100644 index f8ee1aa..0000000 --- a/client/src/views/GameInterface/tabs/styles/ChatTab.css +++ /dev/null @@ -1,447 +0,0 @@ -.chat-container { - display: flex; - height: 100%; - background: rgba(5, 8, 12, 0.9); - border: 1px solid var(--border-color); - overflow: hidden; - position: relative; -} - -.chat-sidebar { - width: 300px; - border-right: 1px solid var(--border-color); - display: flex; - flex-direction: column; - transition: all 0.3s ease; - z-index: 2; - background: rgba(10, 15, 24, 0.6); -} - -.chat-main { - flex: 1; - display: flex; - flex-direction: column; - background: rgba(0, 0, 0, 0.2); - position: relative; -} - -/* SEARCH SECTION */ -.search-section { - padding: 20px 15px 15px; - border-bottom: 1px solid var(--border-color); - position: relative; - z-index: 10; -} - -.search-input-wrapper { - display: flex; - gap: 5px; - margin-top: 10px; -} - -.search-input-wrapper input { - flex: 1; - background: #05080c; - border: 1px solid var(--border-color); - color: #fff; - padding: 8px; - font-size: 12px; - font-family: "Geologica", sans-serif; -} - -.search-results-dropdown { - position: absolute; - top: 100%; - left: 15px; - right: 15px; - background: #0a0f18; - border: 1px solid var(--primary-color); - border-top: none; - max-height: 200px; - overflow-y: auto; - box-shadow: 0 5px 15px rgba(0, 0, 0, 0.8); -} - -.search-result-item { - padding: 10px; - display: flex; - justify-content: space-between; - align-items: center; - cursor: pointer; - font-size: 12px; - border-bottom: 1px solid rgba(255, 255, 255, 0.05); -} - -.search-result-item:hover { - background: rgba(0, 212, 255, 0.1); -} - -/* CHAT LIST & ITEMS */ -.chats-list { - flex: 1; - overflow-y: auto; -} - -.friends-section-label { - padding: 20px 15px 10px; - display: flex; - align-items: center; - gap: 10px; - opacity: 0.4; -} - -.label-text { - font-size: 10px; - letter-spacing: 2px; - font-weight: bold; -} - -.label-line { - flex: 1; - height: 1px; - background: var(--border-color); -} - -.chat-item { - padding: 12px 15px; - display: flex; - align-items: center; - justify-content: space-between; - cursor: pointer; - border-bottom: 1px solid rgba(255, 255, 255, 0.02); - transition: all 0.2s; -} - -.chat-item:hover { - background: rgba(255, 255, 255, 0.03); -} - -.chat-item.active { - background: rgba(0, 212, 255, 0.1); - box-shadow: inset 4px 0 0 var(--primary-color); -} - -.chat-item-main { - display: flex; - align-items: center; - gap: 12px; - flex: 1; -} - -.status-dot { - width: 8px; - height: 8px; - border-radius: 50%; - flex-shrink: 0; -} - -.status-dot.online { - background: #00ff88; - box-shadow: 0 0 5px #00ff88; -} - -.status-dot.offline { - background: #444; -} - -.unfriend-btn { - background: transparent; - border: none; - color: rgba(255, 255, 255, 0.2); - padding: 8px; - cursor: pointer; - transition: all 0.2s; - opacity: 0; -} - -.chat-item:hover .unfriend-btn { - opacity: 1; -} - -.unfriend-btn:hover { - color: #ff3e3e; - text-shadow: 0 0 8px rgba(255, 62, 62, 0.4); -} - -/* CHAT MAIN AREA */ -.chat-header { - padding: 15px; - display: flex; - align-items: center; - border-bottom: 1px solid var(--border-color); - background: rgba(10, 15, 24, 0.8); -} - -.active-chat-info { - display: flex; - align-items: center; - gap: 10px; -} - -.active-chat-info i { - color: var(--primary-color); -} - -.chat-messages { - flex: 1; - padding: 15px; - overflow-y: auto; - display: flex; - flex-direction: column; - gap: 8px; -} - -.message { - font-size: 13px; - line-height: 1.4; - min-height: min-content; - padding: 4px 0; - display: block; -} - -.msg-time { - color: rgba(255, 255, 255, 0.3); - margin-right: 8px; - font-family: monospace; -} - -.msg-author { - color: var(--primary-color); - font-weight: bold; - margin-right: 8px; -} - -.message.system .msg-author { - color: #ff3e3e; -} - -.message.system .msg-text { - color: #888; - word-break: break-all; - overflow-wrap: anywhere; - display: inline-block; - font-style: italic; - white-space: pre-wrap; - max-width: 100%; -} - -.chat-input-area { - padding: 15px; - background: #05080c; - display: flex; - gap: 10px; - border-top: 1px solid var(--border-color); -} - -.chat-input-area input { - flex: 1; - background: rgba(255, 255, 255, 0.05); - border: 1px solid var(--border-color); - color: #fff; - padding: 10px 15px; - outline: none; -} - -.send-btn { - background: transparent; - border: 1px solid var(--primary-color); - color: var(--primary-color); - padding: 0 20px; - cursor: pointer; - transition: all 0.2s; -} - -.send-btn:hover { - background: var(--primary-color); - color: #000; -} - -/* MODAL STYLES */ -.modal-overlay { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: rgba(0, 0, 0, 0.85); - display: flex; - align-items: center; - justify-content: center; - z-index: 100; - backdrop-filter: blur(4px); -} - -.modal-content { - background: #0a0f18; - border: 1px solid #ff3e3e; - padding: 25px; - width: 90%; - max-width: 350px; - text-align: center; - box-shadow: 0 0 30px rgba(255, 62, 62, 0.15); -} - -.modal-content h3 { - color: #ff3e3e; - margin-bottom: 15px; - font-size: 14px; - letter-spacing: 2px; -} - -.modal-content p { - color: #aaa; - font-size: 13px; - margin-bottom: 25px; -} - -.modal-actions { - display: flex; - gap: 10px; -} - -.confirm-btn, -.cancel-btn { - flex: 1; - padding: 10px; - font-size: 11px; - font-weight: bold; - cursor: pointer; - transition: all 0.2s; -} - -.confirm-btn { - background: rgba(255, 62, 62, 0.1); - border: 1px solid #ff3e3e; - color: #ff3e3e; -} - -.confirm-btn:hover { - background: #ff3e3e; - color: #fff; -} - -.cancel-btn { - background: rgba(255, 255, 255, 0.05); - border: 1px solid var(--border-color); - color: #fff; -} - -/* MOBILE RESPONSIVENESS */ -@media (max-width: 768px) { - .chat-sidebar { - width: 100%; - position: absolute; - height: 100%; - background: #0a0f18; - } - - .chat-sidebar.hidden { - transform: translateX(-100%); - } - - .chat-main { - width: 100%; - position: absolute; - height: 100%; - z-index: 1; - } - - .chat-main.hidden { - transform: translateX(100%); - } - - .back-btn { - background: transparent; - border: none; - color: var(--primary-color); - font-size: 1.2rem; - padding: 0 15px 0 0; - cursor: pointer; - } -} - -/* Контейнер елемента списку */ -.chat-item { - padding: 12px 15px; - display: flex; - align-items: center; - justify-content: space-between; - cursor: pointer; - border-bottom: 1px solid rgba(255, 255, 255, 0.02); - transition: all 0.2s; -} - -.chat-item:hover { - background: rgba(255, 255, 255, 0.03); -} - -.chat-item.active { - background: rgba(0, 212, 255, 0.1); - box-shadow: inset 4px 0 0 var(--primary-color); -} - -.chat-item-main { - display: flex; - align-items: center; - gap: 12px; - flex: 1; -} - -.unfriend-btn { - background: transparent; - border: none; - color: rgba(255, 255, 255, 0.3); - padding: 8px; - cursor: pointer; - transition: all 0.2s; - opacity: 0; -} - -@media (min-width: 769px) { - .chat-item:hover .unfriend-btn { - opacity: 1; - } -} - -@media (max-width: 768px) { - .unfriend-btn { - opacity: 1; - color: rgba(255, 255, 255, 0.5); - padding: 12px; - } - - .chat-item { - padding: 15px; - } -} - -.unfriend-btn:hover { - color: #ff3e3e; - text-shadow: 0 0 8px rgba(255, 62, 62, 0.4); -} - -.message { - font-size: 13px; - line-height: 1.4; - min-height: min-content; - padding: 4px 0; - display: block; - word-wrap: break-word; -} - -.msg-text { - color: #fff; - word-break: break-all; - overflow-wrap: anywhere; - white-space: pre-wrap; - display: inline; -} - -.message.system .msg-author { - color: #ff3e3e; -} - -.message.system .msg-text { - color: #888; - font-style: italic; -} diff --git a/client/src/views/GameInterface/tabs/styles/CraftingTab.css b/client/src/views/GameInterface/tabs/styles/CraftingTab.css deleted file mode 100644 index 0244106..0000000 --- a/client/src/views/GameInterface/tabs/styles/CraftingTab.css +++ /dev/null @@ -1,145 +0,0 @@ -.crafting-container { - padding: 20px; - height: 100%; - display: flex; - flex-direction: column; -} - -.crafting-header { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 20px; -} - -.crafting-header h2 { - font-size: 1.2rem; -} - -.crafting-grid { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); - gap: 15px; - margin-top: 20px; -} - -.recipe-card { - background: var(--bg-secondary); - border: 1px solid var(--border-color); - padding: 15px; - border-radius: 8px; - text-align: center; - cursor: pointer; - transition: all 0.2s ease; - display: flex; - flex-direction: column; - align-items: center; - gap: 8px; -} - -.recipe-card:hover { - transform: translateY(-5px); - border-color: var(--primary-color); - box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3); -} - -.recipe-icon img { - max-width: 50px; - height: auto; -} - -.recipe-name { - font-size: 0.85rem; - line-height: 1.2; - color: #fff; - font-weight: 500; -} - -.badge-time { - font-size: 0.75rem; - color: var(--text-secondary); -} - -.crafting-categories { - display: flex; - gap: 10px; - margin-bottom: 15px; - padding: 5px 0; - overflow-x: auto; - scrollbar-width: none; - -webkit-overflow-scrolling: touch; -} - -.crafting-categories::-webkit-scrollbar { - display: none; -} - -.crafting-cat-btn { - flex: 0 0 auto; - padding: 8px 16px; - background: rgba(255, 255, 255, 0.03); - border: 1px solid var(--border-color); - border-radius: 4px; - color: var(--text-secondary); - font-family: "Orbitron", sans-serif; - font-size: 0.75rem; - text-transform: uppercase; - letter-spacing: 0.5px; - white-space: nowrap; - cursor: pointer; - transition: all 0.2s ease; -} - -.crafting-cat-btn.active { - background: var(--primary-color); - border-color: var(--primary-color); - color: #000; - font-weight: 700; -} - -@media (max-width: 600px) { - .crafting-container { - padding: 12px; - } - - .crafting-header { - margin-bottom: 12px; - } - - .crafting-header h2 { - font-size: 1rem; - } - - .crafting-grid { - grid-template-columns: repeat(2, 1fr); - gap: 8px; - margin-top: 10px; - } - - .recipe-card { - padding: 10px; - gap: 6px; - } - - .recipe-icon img { - max-width: 40px; - } - - .recipe-name { - font-size: 0.75rem; - } - - .crafting-cat-btn { - padding: 6px 12px; - font-size: 0.7rem; - } -} - -.tab-content.active { - height: 100%; - overflow: hidden; -} - -.meteor-region-content { - width: 100%; -} diff --git a/client/src/views/GameInterface/tabs/styles/DashboardTab.css b/client/src/views/GameInterface/tabs/styles/DashboardTab.css deleted file mode 100644 index 39c7916..0000000 --- a/client/src/views/GameInterface/tabs/styles/DashboardTab.css +++ /dev/null @@ -1,272 +0,0 @@ -.dash-container { - padding: 15px; - position: relative; - overflow-y: auto; - overflow-x: hidden; - height: 100%; - box-sizing: border-box; - scrollbar-gutter: stable; -} - -.dash-scanline { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 2px; - background: rgba(0, 212, 255, 0.05); - animation: scan 6s linear infinite; - pointer-events: none; - z-index: 1; -} - -@keyframes scan { - 0% { - top: 0; - } - 100% { - top: 100%; - } -} - -.dashboard-grid { - display: grid; - grid-template-columns: 1fr; - gap: 15px; - max-width: 1400px; - margin: 0 auto; - position: relative; - z-index: 2; - width: 100%; - box-sizing: border-box; - align-items: start; -} - -.dash-card { - background: rgba(10, 15, 24, 0.95) !important; - border: 1px solid #1a2638 !important; - border-radius: 2px !important; - position: relative; - padding: 20px !important; - box-sizing: border-box; - overflow: hidden; - contain: paint; -} - -.card-tag { - position: absolute; - top: 0; - right: 0; - background: #1a2638; - color: #00d4ff; - font-size: 8px; - padding: 2px 6px; - font-weight: 900; - text-transform: uppercase; - letter-spacing: 1px; -} - -.pilot-info { - display: flex; - flex-direction: column; - gap: 15px; - margin-bottom: 15px; - align-items: flex-start; -} - -.pilot-avatar { - width: 50px; - height: 50px; - background: #05080c; - border: 1px solid #00d4ff; - display: flex; - align-items: center; - justify-content: center; - font-size: 24px; - position: relative; - color: #00d4ff; - flex-shrink: 0; -} - -.level-badge { - position: absolute; - bottom: -3px; - right: -3px; - background: #00d4ff; - color: #000; - font-size: 9px; - padding: 1px 4px; - font-weight: 900; -} - -.pilot-details { - flex: 1; - min-width: 0; - width: 100%; -} - -.pilot-details h3 { - margin: 0 0 5px 0; - font-size: 1rem; - color: #fff; - word-break: break-all; -} - -.status-online { - font-size: 10px; - color: #4a5d75; - margin: 0; -} - -.exp-bar-container { - margin-top: 10px; -} - -.exp-labels { - display: flex; - justify-content: space-between; - font-size: 9px; - color: #4a5d75; - margin-bottom: 3px; -} - -.exp-track { - height: 3px; - background: #05080c; - border: 1px solid #1a2638; -} - -.exp-fill { - height: 100%; - background: linear-gradient(90deg, #00d4ff, #00ff88); -} - -.resource-list { - display: flex; - flex-direction: column; - gap: 8px; -} - -.res-item { - display: flex; - align-items: center; - gap: 12px; - padding: 10px; - background: rgba(0, 0, 0, 0.4); - border-left: 2px solid #00d4ff; - position: relative; - contain: paint; -} - -.res-content { - display: flex; - justify-content: space-between; - align-items: center; - flex: 1; -} - -.res-val { - font-size: 1rem; - font-weight: 900; - color: #fff; - font-family: "Space Mono", monospace; - position: relative; - padding-right: 20px; -} - -.credit-plus { - position: absolute; - top: 0; - right: 0; - color: #00ff88; - font-size: 0.8rem; - font-weight: 900; - pointer-events: none; - animation: floatUp 1.2s ease-out forwards; -} - -@keyframes floatUp { - 0% { - transform: translateY(5px); - opacity: 0; - } - 20% { - opacity: 1; - } - 100% { - transform: translateY(-15px); - opacity: 0; - } -} - -.diag-grid { - display: grid; - grid-template-columns: 1fr; - gap: 8px; -} - -.diag-item { - background: rgba(0, 0, 0, 0.2); - padding: 8px 12px; - border: 1px solid #1a2638; - display: flex; - justify-content: space-between; - align-items: center; -} - -.diag-status.online { - color: #00ff88; - display: flex; - align-items: center; - gap: 8px; - text-shadow: 0 0 8px rgba(0, 255, 136, 0.4); -} - -.online-info { - display: flex; - align-items: center; - gap: 8px; -} - -.online-dot { - width: 6px; - height: 6px; - background-color: #00ff88; - border-radius: 50%; - display: inline-block; - animation: pulse 2s infinite; -} - -@keyframes pulse { - 0% { - opacity: 1; - transform: scale(1); - } - 50% { - opacity: 0.4; - transform: scale(1.2); - } - 100% { - opacity: 1; - transform: scale(1); - } -} - -@media (min-width: 600px) { - .dashboard-grid { - grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); - gap: 20px; - } -} - -@media (min-width: 992px) { - .dashboard-grid { - grid-template-columns: repeat(3, 1fr); - } - .pilot-info { - flex-direction: row; - } - .diag-grid { - grid-template-columns: 1fr 1fr; - } -} diff --git a/client/src/views/GameInterface/tabs/styles/DatapackTab.css b/client/src/views/GameInterface/tabs/styles/DatapackTab.css deleted file mode 100644 index dc12b54..0000000 --- a/client/src/views/GameInterface/tabs/styles/DatapackTab.css +++ /dev/null @@ -1,153 +0,0 @@ -.datapack-tab-wrapper { - display: flex; - flex-direction: column; - height: 100%; -} - -.datapack-controls { - padding: 15px 20px; - background: rgba(0, 0, 0, 0.2); - border-bottom: 1px solid var(--border-color); -} - -.section-selector { - display: flex; - gap: 10px; - margin-bottom: 15px; - overflow-x: auto; - scrollbar-width: none; -} - -.section-btn { - flex: 1; - display: flex; - flex-direction: column; - align-items: center; - gap: 5px; - padding: 10px; - background: var(--bg-secondary); - border: 1px solid var(--border-color); - border-radius: 6px; - color: var(--text-secondary); - cursor: pointer; - transition: all 0.2s; - min-width: 80px; -} - -.section-btn i { - font-size: 1.1rem; -} -.section-btn span { - font-size: 0.75rem; - font-family: "Orbitron", sans-serif; -} - -.section-btn.active { - background: rgba(var(--primary-rgb), 0.1); - border-color: var(--primary-color); - color: var(--primary-color); -} - -.search-bar { - position: relative; - width: 100%; -} - -.search-bar i { - position: absolute; - left: 12px; - top: 50%; - transform: translateY(-50%); - color: var(--text-secondary); -} - -.search-bar input { - width: 100%; - padding: 10px 10px 10px 35px; - background: #0a0a0c; - border: 1px solid var(--border-color); - border-radius: 4px; - color: #fff; - font-size: 0.9rem; -} - -.datapack-content { - flex: 1; - padding: 20px; -} - -.datapack-grid { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); - gap: 12px; - padding-bottom: 30px; -} - -.datapack-card { - display: flex; - align-items: center; - gap: 15px; - padding: 12px; - background: var(--bg-secondary); - border: 1px solid var(--border-color); - border-radius: 8px; -} - -.card-icon { - width: 48px; - height: 48px; - display: flex; - align-items: center; - justify-content: center; - background: rgba(0, 0, 0, 0.3); - border-radius: 4px; -} - -.card-icon img { - max-width: 32px; -} - -.card-info { - display: flex; - flex-direction: column; - overflow: hidden; -} - -.card-name { - color: #fff; - font-size: 0.9rem; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -.card-id { - font-size: 0.7rem; - color: var(--text-secondary); - font-family: monospace; -} - -.card-meta { - font-size: 0.7rem; - color: var(--primary-color); - margin-top: 4px; -} - -@media (max-width: 600px) { - .datapack-grid { - grid-template-columns: 1fr; - gap: 8px; - } - - .datapack-controls { - padding: 10px; - } - - .section-btn { - padding: 8px 5px; - } - - .section-btn span { - font-size: 0.65rem; - } -} diff --git a/client/src/views/GameInterface/tabs/styles/DungeonsTab.css b/client/src/views/GameInterface/tabs/styles/DungeonsTab.css deleted file mode 100644 index 18419d0..0000000 --- a/client/src/views/GameInterface/tabs/styles/DungeonsTab.css +++ /dev/null @@ -1,370 +0,0 @@ -#dungeons-tab { - height: 100%; - background: #05080c; - overflow: hidden; -} - -.dungeons-container { - display: grid; - grid-template-columns: 300px 1fr; - height: 100%; - background: rgba(10, 15, 24, 0.9); - border-top: 1px solid rgba(0, 212, 255, 0.2); -} - -.dungeon-selector { - border-right: 1px solid rgba(0, 212, 255, 0.1); - display: flex; - flex-direction: column; - background: rgba(0, 0, 0, 0.2); -} - -.selector-header { - padding: 20px 15px; -} - -.terminal-text { - font-family: "Space Mono", monospace; - color: #00d4ff; - font-size: 1rem; - letter-spacing: 2px; - margin: 0; -} - -.header-line-decor { - height: 2px; - width: 50px; - background: #00d4ff; - margin-top: 5px; - box-shadow: 0 0 10px #00d4ff; -} - -.dungeon-list { - flex: 1; - overflow-y: auto; - padding: 0 10px 20px 10px; -} - -.dungeon-summary-card { - position: relative; - padding: 15px; - margin-bottom: 5px; - background: rgba(255, 255, 255, 0.02); - cursor: pointer; - transition: all 0.2s ease; - border: 1px solid transparent; -} - -.dungeon-summary-card:hover { - background: rgba(0, 212, 255, 0.05); - border-color: rgba(0, 212, 255, 0.1); -} - -.dungeon-summary-card.active { - background: rgba(0, 212, 255, 0.1); - border-color: rgba(0, 212, 255, 0.3); -} - -.card-selection-indicator { - position: absolute; - left: 0; - top: 0; - bottom: 0; - width: 0; - background: #00d4ff; - transition: 0.2s; -} - -.active .card-selection-indicator { - width: 4px; - box-shadow: 0 0 15px #00d4ff; -} - -.dungeon-brief .name { - display: block; - font-family: "Orbitron", sans-serif; - font-size: 0.9rem; - color: #fff; - text-transform: uppercase; -} - -.dungeon-brief .energy-cost { - font-size: 0.75rem; - color: #00d4ff; - font-family: "Space Mono", monospace; -} - -.dungeon-view { - padding: 20px; - display: flex; - flex-direction: column; - overflow: hidden; -} - -.dungeon-details-v2 { - background: rgba(0, 15, 25, 0.5); - border: 1px solid rgba(0, 212, 255, 0.1); - height: 100%; - display: flex; - flex-direction: column; - position: relative; -} - -.details-header-scan { - padding: 20px; - border-bottom: 1px solid rgba(0, 212, 255, 0.1); - background: rgba(0, 212, 255, 0.03); - position: relative; - overflow: hidden; - display: flex; - align-items: center; - gap: 15px; -} - -.back-to-list { - display: none; - background: none; - border: 1px solid #00d4ff; - color: #00d4ff; - padding: 8px 12px; - cursor: pointer; -} - -.scanline-horizontal { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 1px; - background: rgba(0, 212, 255, 0.2); - animation: scan_move 4s linear infinite; -} - -@keyframes scan_move { - 0% { - top: 0; - } - 100% { - top: 100%; - } -} - -.mission-type-label { - font-size: 0.7rem; - color: #4a5d75; - letter-spacing: 1px; -} - -.mission-title { - margin: 5px 0 0 0; - font-size: 1.8rem; - color: #fff; - font-family: "Orbitron", sans-serif; - text-transform: uppercase; -} - -.details-body { - flex: 1; - overflow-y: auto; - padding: 20px; -} - -.description-box { - background: rgba(0, 0, 0, 0.3); - padding: 15px; - border-left: 2px solid #00d4ff; - margin-bottom: 25px; -} - -.description-text { - margin: 0; - color: #a0acba; - font-size: 0.9rem; - line-height: 1.6; -} - -.section-header { - display: flex; - align-items: center; - gap: 10px; - color: #00d4ff; - margin-bottom: 15px; -} - -.section-header h4 { - margin: 0; - font-size: 0.9rem; - letter-spacing: 1px; -} - -.rewards-grid { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); - gap: 10px; -} - -.reward-entry { - display: flex; - align-items: center; - padding: 10px; - background: rgba(0, 0, 0, 0.4); - border: 1px solid rgba(255, 255, 255, 0.05); - border-left-width: 4px; -} - -.reward-icon-container { - width: 36px; - height: 36px; - background: #0a0f18; - border: 1px solid rgba(0, 212, 255, 0.2); - display: flex; - align-items: center; - justify-content: center; - margin-right: 12px; - flex-shrink: 0; -} - -.reward-icon-container img { - width: 80%; - height: 80%; - object-fit: contain; -} - -.reward-text { - display: flex; - flex-direction: column; - overflow: hidden; -} - -.reward-name { - font-size: 0.75rem; - color: #fff; - text-transform: uppercase; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -.reward-chance { - font-size: 0.65rem; - color: #00ff88; - font-family: "Space Mono", monospace; -} - -.reward-entry.common { - border-left-color: #4a5d75; -} -.reward-entry.uncommon { - border-left-color: #00ff88; -} -.reward-entry.rare { - border-left-color: #00d4ff; -} -.reward-entry.epic { - border-left-color: #a335ee; -} -.reward-entry.legendary { - border-left-color: #ffaa00; -} - -.initiate-deployment-btn { - width: 100%; - padding: 18px; - background: #00d4ff; - border: none; - color: #000; - font-family: "Orbitron", sans-serif; - font-weight: 900; - font-size: 1rem; - cursor: pointer; - display: flex; - justify-content: space-between; - align-items: center; - transition: 0.3s; - clip-path: polygon(0 0, 100% 0, 100% 70%, 95% 100%, 0 100%); -} - -.initiate-deployment-btn:hover { - background: #fff; - box-shadow: 0 0 20px rgba(0, 212, 255, 0.4); -} - -.dungeon-placeholder { - height: 100%; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - color: #4a5d75; -} - -.radar-scanner { - width: 80px; - height: 80px; - border: 2px solid rgba(0, 212, 255, 0.2); - border-radius: 50%; - position: relative; - margin-bottom: 20px; -} - -.radar-scanner::after { - content: ""; - position: absolute; - top: 50%; - left: 50%; - width: 50%; - height: 2px; - background: #00d4ff; - transform-origin: left center; - animation: radar_rotate 2s linear infinite; -} - -@keyframes radar_rotate { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} - -@media screen and (max-width: 768px) { - .dungeons-container { - grid-template-columns: 1fr; - } - - .dungeons-container.view-active .dungeon-selector { - display: none; - } - - .dungeons-container:not(.view-active) .dungeon-view { - display: none; - } - - .back-to-list { - display: block; - } - - .mission-title { - font-size: 1.3rem; - } - - .dungeon-view { - padding: 10px; - } - - .rewards-grid { - grid-template-columns: 1fr; - } -} - -.custom-scroll::-webkit-scrollbar { - width: 4px; -} -.custom-scroll::-webkit-scrollbar-track { - background: rgba(0, 0, 0, 0.1); -} -.custom-scroll::-webkit-scrollbar-thumb { - background: #1a2638; - border-radius: 4px; -} diff --git a/client/src/views/GameInterface/tabs/styles/InventoryTab.css b/client/src/views/GameInterface/tabs/styles/InventoryTab.css deleted file mode 100644 index eb07ac6..0000000 --- a/client/src/views/GameInterface/tabs/styles/InventoryTab.css +++ /dev/null @@ -1,273 +0,0 @@ -.inv-adaptive-container { - display: flex; - flex-direction: column; - gap: 10px; - padding: 15px; - height: calc(100vh - 140px); - font-family: "Orbitron", sans-serif; - color: #e0e6ed; - overflow: hidden; -} - -.inv-header-compact { - display: flex; - justify-content: space-between; - align-items: center; - border-bottom: 1px solid #1a2638; - padding-bottom: 10px; - margin-bottom: 5px; - flex-shrink: 0; -} - -.inv-logo { - font-size: 1.1rem; - color: #00d4ff; - letter-spacing: 3px; - margin: 0; -} - -.inv-stats-bar { - font-size: 11px; - color: #4a5d75; -} - -.text-cyan { - color: #00d4ff; - font-weight: bold; -} - -.inv-layout-wrapper { - display: flex; - flex-direction: row; - gap: 20px; - flex: 1; - min-height: 0; -} - -.inv-panel { - background: rgba(10, 15, 24, 0.85); - border: 1px solid #1a2638; - display: flex; - flex-direction: column; - box-shadow: inset 0 0 20px rgba(0, 0, 0, 0.5); - min-height: 0; -} - -.panel-label { - background: #1a2638; - color: #00d4ff; - font-size: 10px; - padding: 5px 12px; - letter-spacing: 2px; - font-weight: 800; - border-bottom: 1px solid #1a2638; - flex-shrink: 0; -} - -.loadout { - width: 240px; - flex-shrink: 0; - overflow-y: auto; -} - -.loadout::-webkit-scrollbar, -.cargo-grid-v2::-webkit-scrollbar { - width: 4px; -} - -.loadout::-webkit-scrollbar-thumb, -.cargo-grid-v2::-webkit-scrollbar-thumb { - background: #1a2638; - border-radius: 2px; -} - -.loadout::-webkit-scrollbar-thumb:hover, -.cargo-grid-v2::-webkit-scrollbar-thumb:hover { - background: #00d4ff; -} - -.equip-list-compact { - padding: 10px; - display: flex; - flex-direction: column; - gap: 8px; -} - -.equip-group { - margin-bottom: 15px; -} - -.group-label { - font-size: 10px; - color: #4a5d75; - margin-bottom: 5px; - padding-left: 5px; - text-transform: uppercase; -} - -.equip-row-mini { - display: flex; - justify-content: space-between; - align-items: center; - padding: 6px 10px; - background: rgba(255, 255, 255, 0.02); - border: 1px solid rgba(26, 38, 56, 0.8); - transition: 0.2s; - cursor: pointer; -} - -.equip-row-mini:hover { - border-color: #00d4ff; - background: rgba(0, 212, 255, 0.05); -} - -.slot-name-tiny { - font-size: 9px; - color: #4a5d75; - max-width: 140px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.equip-box-mini { - width: 32px; - height: 32px; - background: #000; - border: 1px solid #1a2638; - display: flex; - align-items: center; - justify-content: center; - color: #00d4ff; - font-size: 0.9rem; - flex-shrink: 0; -} - -.cargo { - flex: 1; - min-width: 0; -} - -.cargo-grid-v2 { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(60px, 1fr)); - gap: 8px; - padding: 15px; - overflow-y: auto; - flex: 1; -} - -.item-slot { - width: 60px; - height: 60px; - background: rgba(5, 8, 12, 0.9); - border: 1px solid #1a2638; - display: flex; - align-items: center; - justify-content: center; - position: relative; - cursor: pointer; - transition: 0.2s; - overflow: hidden; -} - -.item-img-grid, -.item-img-mini { - max-width: 90%; - max-height: 90%; - object-fit: contain; -} - -.item-slot:hover { - border-color: #00d4ff; - background: rgba(0, 212, 255, 0.1); -} - -.item-slot.active { - border-color: #00d4ff; - box-shadow: inset 0 0 10px rgba(0, 212, 255, 0.3); -} - -.separator { - height: 1px; - background: #1a2638; - margin: 10px 5px; -} - -@media (max-width: 768px) { - .inv-adaptive-container { - height: auto; - overflow-y: visible; - } - - .inv-layout-wrapper { - flex-direction: column; - height: auto; - } - - .loadout { - width: 100%; - max-height: 300px; - } - - .cargo { - height: 400px; - } -} - -.item-slot.equipped-in-storage { - border: 2px solid #00d2ff; - box-shadow: inset 0 0 10px rgba(0, 210, 255, 0.3); - opacity: 0.8; -} - -.equipped-tag { - position: absolute; - top: -5px; - right: -5px; - background: #00d2ff; - color: #000; - font-size: 10px; - font-weight: bold; - padding: 2px 5px; - border-radius: 3px; - z-index: 2; -} - -.qty-label { - position: absolute; - bottom: 2px; - right: 4px; - font-size: 11px; - font-weight: 800; - color: #fff; - text-shadow: - 1px 1px 0 #000, - -1px -1px 0 #000, - 1px -1px 0 #000, - -1px 1px 0 #000, - 0 0 5px rgba(0, 0, 0, 0.8); - pointer-events: none; - z-index: 3; -} - -.item-slot { - width: 60px; - height: 60px; - background: rgba(5, 8, 12, 0.9); - border: 1px solid #1a2638; - display: flex; - align-items: center; - justify-content: center; - position: relative; - cursor: pointer; - transition: 0.2s; - overflow: visible; -} - -.item-img-grid { - max-width: 80%; - max-height: 80%; - object-fit: contain; - pointer-events: none; -} diff --git a/client/src/views/GameInterface/tabs/styles/NotificationsTab.css b/client/src/views/GameInterface/tabs/styles/NotificationsTab.css deleted file mode 100644 index dbb4c99..0000000 --- a/client/src/views/GameInterface/tabs/styles/NotificationsTab.css +++ /dev/null @@ -1,148 +0,0 @@ -.notifications-container { - padding: 20px; - height: 100%; - display: flex; - flex-direction: column; - background: rgba(10, 15, 24, 0.6); -} - -.notifications-header { - margin-bottom: 20px; -} - -.notifications-header h2 { - font-family: "Orbitron", sans-serif; - color: #fff; - letter-spacing: 2px; - margin-top: 5px; -} - -.notifications-list { - display: flex; - flex-direction: column; - gap: 10px; - overflow-y: auto; - padding-right: 5px; -} - -.no-notifications { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - gap: 15px; - padding: 100px 0; - color: #4a5d75; - font-family: "Orbitron", sans-serif; - font-size: 12px; -} - -.no-notifications i { - font-size: 2rem; - opacity: 0.3; -} - -.notify-card { - display: flex; - align-items: center; - background: rgba(26, 38, 56, 0.5); - border-left: 3px solid #00d4ff; - padding: 15px; - gap: 15px; - backdrop-filter: blur(5px); - border-radius: 0 4px 4px 0; - animation: notify-slide-in 0.3s ease-out; -} - -.notify-card.friend_request { - border-left-color: #00ff88; -} -.notify-card.crafting { - border-left-color: #ffd700; -} -.notify-card.system { - border-left-color: #ff3e3e; -} - -.notify-icon { - width: 35px; - height: 35px; - display: flex; - align-items: center; - justify-content: center; - background: rgba(0, 0, 0, 0.3); - border-radius: 50%; - color: #fff; -} - -.notify-content { - flex: 1; -} - -.notify-title-row { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 4px; -} - -.notify-content h4 { - margin: 0; - font-family: "Orbitron", sans-serif; - font-size: 12px; - color: #fff; -} - -.notify-time { - font-size: 10px; - color: #4a5d75; -} - -.notify-content p { - margin: 0; - font-size: 13px; - color: #a0aec0; -} - -.notify-actions { - display: flex; - gap: 8px; -} - -.action-btn { - background: rgba(255, 255, 255, 0.05); - border: 1px solid rgba(255, 255, 255, 0.1); - color: #fff; - padding: 6px 12px; - cursor: pointer; - font-family: "Orbitron", sans-serif; - font-size: 10px; - transition: all 0.2s; -} - -.action-btn.accept { - background: #00ff88; - color: #000; - border: none; - font-weight: bold; -} - -.action-btn.dismiss { - width: 28px; - padding: 6px 0; -} - -.action-btn:hover { - filter: brightness(1.2); -} - -@keyframes notify-slide-in { - from { - opacity: 0; - transform: translateX(30px); - } - to { - opacity: 1; - transform: translateX(0); - } -} diff --git a/client/src/views/GameInterface/tabs/styles/QuestsTab.css b/client/src/views/GameInterface/tabs/styles/QuestsTab.css deleted file mode 100644 index dc58254..0000000 --- a/client/src/views/GameInterface/tabs/styles/QuestsTab.css +++ /dev/null @@ -1,211 +0,0 @@ -.quests-container { - padding: 15px; - position: relative; - overflow-y: auto; - height: 100%; - box-sizing: border-box; -} - -.quests-header { - margin-bottom: 25px; - border-left: 3px solid #00d4ff; - padding-left: 15px; -} - -.glitch-text { - font-size: 1.2rem; - letter-spacing: 2px; - color: #fff; - text-transform: uppercase; - margin: 0; - font-weight: 900; -} - -.header-line { - height: 1px; - background: linear-gradient(90deg, #00d4ff, transparent); - margin-top: 5px; - width: 200px; -} - -.quests-grid { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); - gap: 15px; - position: relative; - z-index: 2; -} - -.quest-card { - background: rgba(10, 15, 24, 0.95) !important; - border: 1px solid #1a2638 !important; - border-radius: 2px !important; - padding: 20px !important; - transition: border-color 0.3s ease; -} - -/* Стан готовності - міняємо бордер на Cyan замість фіолетового */ -.quest-card.ready { - border-color: #00ff88 !important; /* Зеленуватий акцент для готових квестів */ - box-shadow: inset 0 0 10px rgba(0, 255, 136, 0.05); -} - -.quest-main h3 { - margin: 0 0 10px 0; - font-size: 1rem; - color: #00d4ff; - text-transform: uppercase; -} - -.quest-description { - font-size: 11px; - color: #4a5d75; - line-height: 1.4; - margin-bottom: 15px; -} - -.section-label { - font-size: 8px; - color: #4a5d75; - margin: 15px 0 8px 0; - letter-spacing: 1px; - font-weight: 900; - text-transform: uppercase; -} - -.objective-item { - margin-bottom: 12px; -} - -.objective-info { - display: flex; - justify-content: space-between; - font-size: 10px; - margin-bottom: 4px; - color: #fff; -} - -.objective-progress-track { - height: 3px; - background: #05080c; - border: 1px solid #1a2638; -} - -.objective-progress-fill { - height: 100%; - background: #00d4ff; - box-shadow: 0 0 5px rgba(0, 212, 255, 0.3); - transition: width 0.5s ease; -} - -.rewards-row { - display: flex; - flex-wrap: wrap; - gap: 6px; -} - -.reward-pill { - padding: 4px 8px; - background: rgba(0, 0, 0, 0.4); - border-left: 2px solid #00d4ff; - font-size: 10px; - color: #fff; - font-family: "Space Mono", monospace; -} - -.reward-pill.credits { - border-left-color: #00ff88; - color: #00ff88; -} - -.reward-pill.xp { - border-left-color: #00d4ff; -} - -.claim-btn { - width: 100%; - margin-top: 20px; - background: #00ff88; - border: none; - color: #000; - padding: 10px; - cursor: pointer; - font-size: 10px; - font-weight: 900; - text-transform: uppercase; - letter-spacing: 2px; - transition: all 0.2s; -} - -.claim-btn:hover { - background: #00cc6e; - transform: translateY(-1px); - box-shadow: 0 4px 12px rgba(0, 255, 136, 0.2); -} - -.no-quests { - grid-column: 1 / -1; - text-align: center; - padding: 40px; - color: #4a5d75; - border: 1px dashed #1a2638; -} - -.no-quests i { - font-size: 2rem; - margin-bottom: 10px; - display: block; -} - -.quest-tabs-nav { - display: flex; - gap: 20px; - margin-top: 15px; -} - -.nav-btn { - background: transparent; - border: none; - color: #4a5d75; - font-family: "Space Mono", monospace; - font-size: 10px; - font-weight: 900; - letter-spacing: 1px; - cursor: pointer; - padding: 5px 0; - position: relative; - transition: color 0.3s; - text-transform: uppercase; -} - -.nav-btn.active { - color: #00d4ff; -} - -.nav-btn.active::after { - content: ""; - position: absolute; - bottom: 0; - left: 0; - width: 100%; - height: 2px; - background: #00d4ff; - box-shadow: 0 0 8px #00d4ff; -} - -.completed-stamp { - margin-top: 20px; - padding: 10px; - border: 1px solid #00ff88; - color: #00ff88; - text-align: center; - font-size: 10px; - font-weight: 900; - letter-spacing: 2px; - background: rgba(0, 255, 136, 0.05); -} - -.quest-card.completed { - opacity: 0.7; - border-color: #1a2638 !important; -} diff --git a/client/src/views/GameInterface/tabs/styles/ShopTab.css b/client/src/views/GameInterface/tabs/styles/ShopTab.css deleted file mode 100644 index e1ea1f5..0000000 --- a/client/src/views/GameInterface/tabs/styles/ShopTab.css +++ /dev/null @@ -1,42 +0,0 @@ -.shop-container { - max-width: 1200px; - margin: 0 auto; - max-height: calc(100vh - 232px); /* Adjusted for title bar and padding */ - overflow-y: auto; - padding: 0.5rem; -} - -.shop-categories { - display: flex; - gap: 0.5rem; - margin-bottom: 2rem; - justify-content: center; -} - -.shop-cat-btn { - padding: 0.75rem 1.5rem; - background: var(--bg-tertiary); - border: 1px solid var(--border-color); - border-radius: 8px; - color: var(--text-secondary); - cursor: pointer; - transition: all 0.3s ease; -} - -.shop-cat-btn:hover { - border-color: var(--primary-color); - color: var(--text-primary); -} - -.shop-cat-btn.active { - background: var(--gradient-primary); - color: var(--bg-primary); - border-color: transparent; -} - -.shop-items { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); - gap: 1rem; -} - diff --git a/client/src/views/GameInterface/tabs/styles/SkillsTab.css b/client/src/views/GameInterface/tabs/styles/SkillsTab.css deleted file mode 100644 index 4f199b2..0000000 --- a/client/src/views/GameInterface/tabs/styles/SkillsTab.css +++ /dev/null @@ -1,133 +0,0 @@ -.skills-container { - display: flex; - flex-direction: column; - height: 100%; - padding: 20px; - box-sizing: border-box; - position: relative; - overflow: hidden; -} - -.skills-header { - margin-bottom: 20px; - padding-bottom: 15px; - border-bottom: 1px solid rgba(0, 212, 255, 0.1); -} - -.header-main { - display: flex; - justify-content: space-between; - align-items: center; -} - -.header-main h2 { - margin: 0; - font-size: 1.2rem; - color: #fff; - text-transform: uppercase; - letter-spacing: 2px; - display: flex; - align-items: center; - gap: 10px; -} - -.header-main h2 i { - color: #00d4ff; - text-shadow: 0 0 10px rgba(0, 212, 255, 0.5); -} - -.skill-points-badge { - background: rgba(0, 212, 255, 0.1); - border: 1px solid #00d4ff; - padding: 5px 15px; - display: flex; - align-items: center; - gap: 10px; -} - -.skill-points-badge .label { - font-size: 9px; - color: #4a5d75; - text-transform: uppercase; - font-weight: 900; -} - -.skill-points-badge .value { - font-size: 1.1rem; - color: #fff; - font-family: "Space Mono", monospace; - font-weight: 900; -} - -.skills-grid { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); - gap: 15px; - overflow-y: auto; - padding-right: 10px; - flex: 1; -} - -.custom-scroll::-webkit-scrollbar { - width: 4px; -} - -.custom-scroll::-webkit-scrollbar-track { - background: rgba(5, 8, 12, 0.5); -} - -.custom-scroll::-webkit-scrollbar-thumb { - background: #1a2638; - border-radius: 2px; -} - -.custom-scroll::-webkit-scrollbar-thumb:hover { - background: #00d4ff; -} - -.empty-category { - grid-column: 1 / -1; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - padding: 60px; - color: #4a5d75; - text-align: center; - border: 1px dashed #1a2638; - background: rgba(0, 0, 0, 0.2); -} - -.empty-category i { - font-size: 2rem; - margin-bottom: 15px; - opacity: 0.5; -} - -.empty-category p { - font-family: "Space Mono", monospace; - font-size: 12px; - text-transform: uppercase; -} - -@media (max-width: 600px) { - .skills-container { - padding: 10px; - } - - .header-main { - flex-direction: column; - align-items: flex-start; - gap: 10px; - } - - .skill-points-badge { - width: 100%; - justify-content: space-between; - box-sizing: border-box; - } - - .skills-grid { - grid-template-columns: 1fr; - } -} diff --git a/client/src/views/LoadingScreen.jsx b/client/src/views/LoadingScreen.jsx deleted file mode 100644 index e69de29..0000000 diff --git a/client/src/views/LoadingScreen/LoadingScreen.css b/client/src/views/LoadingScreen/LoadingScreen.css deleted file mode 100644 index f1df716..0000000 --- a/client/src/views/LoadingScreen/LoadingScreen.css +++ /dev/null @@ -1,60 +0,0 @@ -.loading-screen { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: var(--bg-primary); - display: flex; - align-items: center; - justify-content: center; - z-index: 9999; - transition: opacity 0.5s ease; -} - -.loading-content { - text-align: center; - max-width: 400px; -} - -.game-title { - font-family: 'Orbitron', sans-serif; - font-size: 3rem; - font-weight: 900; - background: var(--gradient-primary); - -webkit-background-clip: text; - background-clip: text; - -webkit-text-fill-color: transparent; - margin-bottom: 2rem; - text-transform: uppercase; - letter-spacing: 3px; -} - -.loading-bar { - width: 100%; - height: 4px; - background: var(--bg-tertiary); - border-radius: 2px; - overflow: hidden; - margin-bottom: 1rem; -} - -.loading-progress { - height: 100%; - background: var(--gradient-primary); - width: 0%; - transition: width 0.3s ease; - animation: loading-pulse 2s infinite; -} - -@keyframes loading-pulse { - 0%, 100% { opacity: 1; } - 50% { opacity: 0.7; } -} - -.loading-text { - color: var(--text-secondary); - font-size: 0.9rem; -} - - diff --git a/client/src/views/LoadingScreen/LoadingScreen.jsx b/client/src/views/LoadingScreen/LoadingScreen.jsx deleted file mode 100644 index f797be6..0000000 --- a/client/src/views/LoadingScreen/LoadingScreen.jsx +++ /dev/null @@ -1,26 +0,0 @@ -import React, { useState, useEffect } from "react"; -import "./LoadingScreen.css"; - -const LoadingScreen = ({ - progress = 0, - statusText = "Initializing Universe...", -}) => { - return ( -
-
-

GALAXY STRIKE ONLINE

- -
-
-
- -

{statusText}

-
-
- ); -}; - -export default LoadingScreen; diff --git a/client/src/views/MainMenu/MainMenu.css b/client/src/views/MainMenu/MainMenu.css deleted file mode 100644 index 543133a..0000000 --- a/client/src/views/MainMenu/MainMenu.css +++ /dev/null @@ -1,141 +0,0 @@ -.main-menu { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: var(--bg-primary); - display: flex; - align-items: center; - justify-content: center; - background-image: - radial-gradient( - circle at 20% 50%, - rgba(0, 212, 255, 0.1) 0%, - transparent 50% - ), - radial-gradient( - circle at 80% 80%, - rgba(255, 107, 53, 0.1) 0%, - transparent 50% - ), - radial-gradient( - circle at 40% 20%, - rgba(255, 0, 255, 0.05) 0%, - transparent 50% - ); -} - -.menu-container { - width: 90%; - max-width: 800px; - background: var(--card-bg); - border-radius: 20px; - border: 1px solid var(--border-color); - box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5); - backdrop-filter: blur(10px); - overflow: hidden; -} - -.menu-header { - text-align: center; - padding: 40px 20px 20px; - position: relative; -} - -.menu-title { - font-family: "Orbitron", sans-serif; - font-size: 3rem; - font-weight: 900; - color: var(--text-primary); - text-transform: uppercase; - letter-spacing: 3px; - margin-bottom: 10px; - text-shadow: 0 0 20px rgba(0, 212, 255, 0.5); -} - -@media screen and (max-width: 500px) { - .menu-title { - font-size: 24px; - } -} - -.menu-subtitle { - font-size: 1.2rem; - color: var(--text-secondary); - font-weight: 400; - opacity: 0.9; -} - -.menu-content { - padding: 30px; -} - -.menu-section { - animation: fadeInUp 0.5s ease-out; -} - -.section-title { - font-family: "Orbitron", sans-serif; - font-size: 1.8rem; - color: var(--primary-color); - text-align: center; - margin-bottom: 30px; - text-transform: uppercase; - letter-spacing: 2px; -} - -/*footer*/ -.menu-footer { - padding: 20px 30px; - background: var(--bg-secondary); - border-top: 1px solid var(--border-color); - display: flex; - justify-content: space-between; - align-items: center; -} - -.version-text { - color: var(--text-muted); - font-size: 0.9rem; -} - -.footer-links { - display: flex; - gap: 20px; -} - -.link-btn { - background: none; - border: none; - color: var(--text-muted); - cursor: pointer; - font-size: 0.9rem; - transition: color 0.3s ease; -} - -.link-btn:hover { - color: var(--primary-color); -} - -/* Login Section */ -.login-options { - display: flex; - flex-direction: column; - gap: 20px; - margin-bottom: 20px; -} - -.btn-large { - padding: 20px 40px; - font-size: 1.2rem; - font-weight: 600; - border-radius: 12px; - transition: all 0.3s ease; - gap: 10px; - width: auto; -} - -.btn-large i { - font-size: 1.4rem; -} diff --git a/client/src/views/MainMenu/MainMenu.jsx b/client/src/views/MainMenu/MainMenu.jsx deleted file mode 100644 index 814f6f3..0000000 --- a/client/src/views/MainMenu/MainMenu.jsx +++ /dev/null @@ -1,65 +0,0 @@ -import React, { useEffect, useState } from "react"; -import LoginSection from "./sections/LoginSection"; -import ServerSection from "./sections/ServerSection"; -import OptionsSection from "./sections/OptionsSection"; -import "./MainMenu.css"; -import { useAuth } from "../../hooks/useAuth"; - -const MainMenu = ({ onStartGame }) => { - const [menuView, setMenuView] = useState("LOGIN"); - const [selectedServer, setSelectedServer] = useState(null); - const { user, logout } = useAuth(); - - useEffect(() => { - if (user) { - setMenuView("SERVERS"); - } else { - setMenuView("LOGIN"); - setSelectedServer(null); - } - }, [user]); - - return ( - - ); -}; - -export default MainMenu; diff --git a/client/src/views/MainMenu/sections/LoginSection.css b/client/src/views/MainMenu/sections/LoginSection.css deleted file mode 100644 index 1f585e2..0000000 --- a/client/src/views/MainMenu/sections/LoginSection.css +++ /dev/null @@ -1,56 +0,0 @@ -.login-form { - display: flex; - flex-direction: column; - gap: 20px; - margin-bottom: 20px; -} - -.form-group { - display: flex; - flex-direction: column; - gap: 8px; -} - -.form-group label { - color: var(--text-secondary); - font-size: 0.9rem; - font-weight: 600; - text-transform: uppercase; - letter-spacing: 1px; -} - -.form-input { - background: var(--bg-tertiary); - border: 2px solid var(--border-color); - border-radius: 8px; - padding: 12px 16px; - color: var(--text-primary); - font-family: "Space Mono", monospace; - font-size: 1rem; - transition: all 0.3s ease; -} - -.form-input:focus { - outline: none; - border-color: var(--primary-color); - box-shadow: 0 0 10px rgba(0, 212, 255, 0.3); -} - -.form-input::placeholder { - color: var(--text-muted); -} -.access-title { - font-size: 30px; - padding-bottom: 10px; - color: var(--primary-color); - text-align: center; -} -@media screen and (max-width: 500px) { - .section-title { - font-size: 12px; - } - - .access-title { - font-size: 20px; - } -} diff --git a/client/src/views/MainMenu/sections/LoginSection.jsx b/client/src/views/MainMenu/sections/LoginSection.jsx deleted file mode 100644 index 0bfa3f0..0000000 --- a/client/src/views/MainMenu/sections/LoginSection.jsx +++ /dev/null @@ -1,140 +0,0 @@ -import React, { useState } from "react"; -import Button from "../../../components/ui/Button"; -import Input from "../../../components/ui/Input"; -import "./LoginSection.css"; -import { useAuth } from "../../../hooks/useAuth.js"; - -const LoginSection = () => { - const { login, register, user } = useAuth(); - - const [formData, setFormData] = useState({ - username: "", - email: "", - password: "", - }); - const [error, setError] = useState(null); - const [loading, setLoading] = useState(false); - - const handleChange = (e) => { - const { name, value } = e.target; - setFormData((prev) => ({ - ...prev, - [name]: value, - })); - }; - - const handleLogin = async () => { - setLoading(true); - setError(null); - const result = await login(formData.email, formData.password); - if (!result?.success) { - setError(result?.error || "Failed to login"); - } - setLoading(false); - }; - - const handleRegister = async () => { - if (!formData.username) { - setError("Username is required for registration"); - return; - } - setLoading(true); - setError(null); - const result = await register( - formData.username, - formData.email, - formData.password, - ); - if (!result?.success) { - setError(result?.error || "Failed to register"); - } - setLoading(false); - }; - - if (user) { - return ( -
-

Welcome, {user.username}!

-

You are now connected to the API.

- -
- ); - } - - return ( -
-

Account Access

- -
- {error && ( -
- {error} -
- )} - - - - - - - -
- - - -
-
- -
-

- Connect to the live server to - play -

-
-
- ); -}; - -export default LoginSection; diff --git a/client/src/views/MainMenu/sections/OptionsSection.css b/client/src/views/MainMenu/sections/OptionsSection.css deleted file mode 100644 index 0f434f8..0000000 --- a/client/src/views/MainMenu/sections/OptionsSection.css +++ /dev/null @@ -1,136 +0,0 @@ -/* Базова сітка та контейнери */ -.options-grid { - display: flex; - justify-content: space-between; - gap: 30px; - margin-bottom: 30px; - align-items: stretch; -} - -.options-left, -.options-right { - display: flex; - flex-direction: column; - gap: 15px; - min-width: 220px; -} - -.options-left { - justify-content: flex-end; /* Кнопка Back буде знизу зліва */ -} - -.options-right { - justify-content: flex-end; /* Кнопка Continue буде знизу справа */ -} - -.options-center { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - flex: 1; - min-width: 320px; -} - -/* Картка сервера (Центр) */ -.save-info-display { - background: rgba(0, 212, 255, 0.05); - border: 1px solid rgba(0, 212, 255, 0.3); - box-shadow: 0 0 20px rgba(0, 212, 255, 0.1); - border-radius: 12px; - padding: 25px; - text-align: center; - width: 100%; - position: relative; - overflow: hidden; -} - -/* Ефект "Скляної панелі" для заголовка */ -.save-info-title { - color: #00d4ff; - margin-bottom: 20px; - font-size: 1.1em; - text-transform: uppercase; - letter-spacing: 2px; - font-weight: 800; - border-bottom: 1px solid rgba(0, 212, 255, 0.2); - padding-bottom: 10px; -} - -/* Текстові блоки всередині картки */ -.server-status-text { - font-size: 0.8em; - text-transform: uppercase; - color: rgba(255, 255, 255, 0.5); - margin-bottom: 4px; -} - -.server-highlight { - font-size: 1.8em; - font-weight: 900; - color: #ffffff; - text-shadow: 0 0 15px rgba(0, 212, 255, 0.6); - margin-bottom: 8px; -} - -.server-url { - font-family: "Share Tech Mono", monospace; - color: #00d4ff; - font-size: 0.85em; - background: rgba(0, 0, 0, 0.3); - padding: 4px 10px; - border-radius: 4px; - display: inline-block; -} - -/* Блок опису та регіону */ -.server-extra-info { - margin-top: 20px; - padding-top: 15px; - border-top: 1px dashed rgba(255, 255, 255, 0.1); -} - -.region-tag { - color: #ff9d00; /* Колір для акценту на регіоні */ - font-weight: bold; - font-size: 0.9em; -} - -.server-description-text { - color: rgba(255, 255, 255, 0.8); - font-size: 0.95em; - line-height: 1.5; - margin-top: 8px; - font-style: italic; -} - -/* Кнопки */ -.options-btn { - height: 40px; - font-size: 12px; - margin: 5px; - transition: all 0.3s ease; -} - -/* Адаптивність */ -@media (max-width: 768px) { - .options-grid { - flex-direction: column; - align-items: center; - } - - .options-btn { - width: 100%; - } - - .options-center { - order: -1; - width: 100%; - } - - .options-left, - .options-right { - width: 100%; - align-items: center; - } -} diff --git a/client/src/views/MainMenu/sections/OptionsSection.jsx b/client/src/views/MainMenu/sections/OptionsSection.jsx deleted file mode 100644 index a9e36d0..0000000 --- a/client/src/views/MainMenu/sections/OptionsSection.jsx +++ /dev/null @@ -1,76 +0,0 @@ -import React, { useEffect } from "react"; -import Button from "../../../components/ui/Button"; -import "./OptionsSection.css"; - -const OptionsSection = ({ server, onBack, onContinue }) => { - const handleContinue = () => { - const authData = JSON.parse(localStorage.getItem("user")); - const token = authData?.token; - - if (!token || !server?.connectUrl) return; - - localStorage.setItem("activeServer", JSON.stringify(server)); - onContinue(server, token); - }; - - useEffect(() => { - console.log(server); - }, []); - return ( -
-

- {server?.serverName || "Game Options"} -

- -
-
- {server?.isOfficial ? ( -
- Official -
- ) : ( -
- Modded -
- )} - - {server?.region && ( - - {server.region} - - )} -
- - {server?.description && ( -
-

{server.description}

-
- )} -
- -
- - - -
-
- ); -}; - -export default OptionsSection; diff --git a/client/src/views/MainMenu/sections/ServerConfirmSection.jsx b/client/src/views/MainMenu/sections/ServerConfirmSection.jsx deleted file mode 100644 index 60d0ab6..0000000 --- a/client/src/views/MainMenu/sections/ServerConfirmSection.jsx +++ /dev/null @@ -1,49 +0,0 @@ -import Button from '../../../components/ui/Button'; -import "./ServerConfirmationSection.css"; - -const ServerConfirmSection = ({ serverData, onBack, onJoin }) => { - const server = serverData || { - name: "Server Name", - type: "Public", - region: "US East", - players: "0/10", - owner: "Unknown" - }; - - return ( -
-

Server Selected

- -
-
- -
- -
-
-

{server.name}

-
-

Type: {server.type}

-

Region: {server.region}

-

Players: {server.players}

-

Owner: {server.owner}

-
-
-
- -
- - -
-
-
- ); -}; - -export default ServerConfirmSection; diff --git a/client/src/views/MainMenu/sections/ServerConfirmationSection.css b/client/src/views/MainMenu/sections/ServerConfirmationSection.css deleted file mode 100644 index 47006c9..0000000 --- a/client/src/views/MainMenu/sections/ServerConfirmationSection.css +++ /dev/null @@ -1,59 +0,0 @@ -.server-confirmation { - display: flex; - justify-content: space-between; - align-items: center; - gap: 30px; - margin-bottom: 30px; -} - -.server-preview { - background: var(--bg-tertiary); - border: 2px solid var(--primary-color); - border-radius: 15px; - padding: 25px; - text-align: center; - min-width: 300px; - box-shadow: 0 10px 30px rgba(0, 212, 255, 0.2); -} - -.server-preview h3 { - color: var(--primary-color); - font-size: 1.4rem; - font-weight: 700; - margin-bottom: 15px; - text-transform: uppercase; - letter-spacing: 1px; -} - -.server-details { - color: var(--text-secondary); - font-size: 0.9rem; - line-height: 1.6; -} - -.server-info { - margin: 8px 0; - display: flex; - justify-content: space-between; - align-items: center; -} - -.server-info span { - font-weight: 600; - color: var(--text-primary); -} - -.confirm-actions-left, .confirm-actions-right { - display: flex; - flex-direction: column; - gap: 15px; - min-width: 200px; -} - -.selected-server-info-center { - flex: 1; - display: flex; - justify-content: center; - align-items: center; -} - diff --git a/client/src/views/MainMenu/sections/ServerSection.css b/client/src/views/MainMenu/sections/ServerSection.css deleted file mode 100644 index 70b48b2..0000000 --- a/client/src/views/MainMenu/sections/ServerSection.css +++ /dev/null @@ -1,265 +0,0 @@ -.server-controls { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 20px; - flex-wrap: wrap; - gap: 15px; -} - -.server-filters { - display: flex; - gap: 10px; -} - -.filter-select { - background: var(--bg-tertiary); - border: 1px solid var(--border-color); - border-radius: 2px; - padding: 8px 12px; - color: var(--text-primary); - font-family: "Orbitron", sans-serif; - font-size: 0.8rem; - cursor: pointer; - text-transform: uppercase; -} - -.filter-select:focus { - outline: none; - border-color: var(--primary-color); -} - -.server-list { - max-height: calc(100vh - 350px); - overflow-y: auto; - margin-bottom: 20px; - border: 1px solid var(--border-color); - border-radius: 4px; - background: rgba(0, 0, 0, 0.2); - padding: 10px; -} - -.server-card { - display: flex; - justify-content: space-between; - align-items: center; - background: var(--bg-secondary); - padding: 12px 20px; - margin-bottom: 8px; - border-radius: 2px; - border: 1px solid var(--border-color); - position: relative; -} - -.server-card::before { - content: ""; - position: absolute; - left: 0; - top: 0; - bottom: 0; - width: 3px; - background: var(--primary-color); - box-shadow: 0 0 10px var(--primary-color); - opacity: 0.6; -} - -.server-card:hover { - background: var(--bg-tertiary); - border-color: var(--primary-color); -} - -.server-card:hover::before { - opacity: 1; -} - -.server-info { - display: flex; - align-items: center; - flex: 1; -} - -.server-name { - font-family: "Orbitron", sans-serif; - font-size: 1.1rem; - font-weight: 700; - color: var(--primary-color); - margin-right: 20px; - text-transform: uppercase; - letter-spacing: 1px; -} - -.server-players { - font-family: "Space Mono", monospace; - font-size: 0.85rem; - color: var(--text-secondary); - background: rgba(0, 0, 0, 0.3); - padding: 2px 8px; - border-radius: 4px; - max-width: 100px; -} - -.status-indicator.online { - width: 10px; - height: 10px; - background: var(--success-color); - border-radius: 50%; - box-shadow: 0 0 10px var(--success-color); - margin-right: 15px; - animation: status-pulse 2s infinite ease-in-out; -} - -@keyframes status-pulse { - 0%, - 100% { - opacity: 0.7; - transform: scale(1); - } - 50% { - opacity: 1; - transform: scale(1.15); - } -} - -.server-section-title { - font-family: "Orbitron", sans-serif; - font-size: 1.5rem; - margin-bottom: 20px; - text-align: center; - color: var(--primary-color); - text-transform: uppercase; - letter-spacing: 4px; -} - -.server-loading, -.server-empty { - text-align: center; - padding: 40px; - color: var(--text-muted); - font-family: "Orbitron", sans-serif; -} - -.server-loading i { - font-size: 2rem; - margin-bottom: 10px; - color: var(--primary-color); -} - -/* Кнопки */ -.server-actions { - display: flex; - justify-content: center; - margin-top: 20px; -} - -.galaxy-button { - height: 35px; - min-width: 120px; -} -.search-wrapper { - position: relative; - flex: 1; - min-width: 200px; -} - -.search-icon { - position: absolute; - left: 12px; - top: 50%; - transform: translateY(-50%); - color: var(--primary-color); - opacity: 0.6; -} - -.server-search-input { - width: 100%; - background: var(--bg-tertiary); - border: 1px solid var(--border-color); - border-radius: 2px; - padding: 10px 12px 10px 35px; - color: var(--text-primary); - font-family: "Orbitron", sans-serif; - font-size: 0.85rem; - transition: all 0.3s ease; -} - -.server-search-input:focus { - outline: none; - border-color: var(--primary-color); - box-shadow: 0 0 10px rgba(0, 212, 255, 0.2); -} - -.control-group { - display: flex; - gap: 10px; - align-items: center; -} - -.server-details-text { - display: flex; - flex-direction: column; -} -@media screen and (max-width: 600px) { - .server-card { - flex-direction: column; - text-align: center; - - button { - font-size: 12px; - } - } - - .server-info { - flex-direction: column; - gap: 10px; - } - - .server-name { - margin-right: 0; - font-size: 12px; - } - - .status-indicator.online { - margin-right: 0; - margin-bottom: 5px; - } -} - -.status-indicator { - width: 10px; - height: 10px; - border-radius: 50%; - margin-right: 15px; -} - -.status-indicator.online { - background: var(--success-color); - box-shadow: 0 0 10px var(--success-color); - animation: status-pulse 2s infinite ease-in-out; -} - -.status-indicator.offline { - background: #555; - box-shadow: none; - animation: none; - opacity: 0.5; -} - -@keyframes status-pulse { - 0%, - 100% { - opacity: 0.7; - transform: scale(1); - } - 50% { - opacity: 1; - transform: scale(1.15); - } -} - -@media screen and (max-width: 600px) { - .status-indicator.online, - .status-indicator.offline { - margin-right: 0; - margin-bottom: 5px; - } -} diff --git a/client/src/views/MainMenu/sections/ServerSection.jsx b/client/src/views/MainMenu/sections/ServerSection.jsx deleted file mode 100644 index d719c8d..0000000 --- a/client/src/views/MainMenu/sections/ServerSection.jsx +++ /dev/null @@ -1,152 +0,0 @@ -import React, { useState, useEffect } from "react"; -import axios from "axios"; -import Button from "../../../components/ui/Button"; -import "./ServerSection.css"; - -const ServerSection = ({ onBack, onSelect }) => { - const [servers, setServers] = useState([]); - const [loading, setLoading] = useState(false); - const [joiningId, setJoiningId] = useState(null); - const [searchTerm, setSearchTerm] = useState(""); - - const fetchServers = async () => { - setLoading(true); - const startTime = Date.now(); - const API_URL = import.meta.env.VITE_API_URL; - try { - const response = await axios.get(`${API_URL}/api/servers/list`); - - const elapsedTime = Date.now() - startTime; - const remainingTime = Math.max(0, 2000 - elapsedTime); - await new Promise((resolve) => setTimeout(resolve, remainingTime)); - setServers(response.data); - } catch (error) { - console.error("Error fetching servers:", error); - } finally { - setLoading(false); - } - }; - - const handleJoinServer = async (server) => { - setJoiningId(server._id); - const API_URL = import.meta.env.VITE_API_URL; - try { - const token = JSON.parse(localStorage.getItem("user")).token; - - const response = await axios.post( - `${API_URL}/api/servers/join`, - - { serverId: server._id }, - - { headers: { Authorization: `Bearer ${token}` } }, - ); - - if (response.data.success) { - console.log(response.data); - - onSelect(response.data); - } - } catch (error) { - console.error("Join request failed:", error); - } finally { - setJoiningId(null); - } - }; - - useEffect(() => { - fetchServers(); - }, []); - - const filteredServers = servers.filter((server) => - searchTerm.length > 0 - ? server.name?.toLowerCase().includes(searchTerm.toLowerCase()) - : true, - ); - - return ( -
-

Galaxy Browser

- -
-
- - setSearchTerm(e.target.value)} - /> -
- -
- - -
- -
-
-
- -
- {loading ? ( -
- -

Synchronizing with Star-Net...

-
- ) : filteredServers.length > 0 ? ( - filteredServers.map((server) => ( -
-
-
-
- {server.name} - - {server.playersOnline || 0} / {server.maxPlayers || 100} - -
-
- -
- )) - ) : ( -
- -

- {searchTerm - ? "No sectors match your search." - : "No active universes found."} -

-
- )} -
- -
- -
-
- ); -}; - -export default ServerSection; diff --git a/client/vite.config.js b/client/vite.config.js deleted file mode 100644 index 8b0f57b..0000000 --- a/client/vite.config.js +++ /dev/null @@ -1,7 +0,0 @@ -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' - -// https://vite.dev/config/ -export default defineConfig({ - plugins: [react()], -}) diff --git a/datapack-documentation/Dungeons.md b/datapack-documentation/Dungeons.md deleted file mode 100644 index 12edb6c..0000000 --- a/datapack-documentation/Dungeons.md +++ /dev/null @@ -1,98 +0,0 @@ -### Dungeon Datapack Documentation - -### Dungeon Configuration - -**Path:** `datapacks/[namespace]/dungeons/[path]/dungeon.json` - -```json -{ - "dungeon": { - "id": "Unique system ID (namespace:path/name)", - "displayName": "Translation key for the dungeon name", - "description": "Translation key for the atmospheric location description", - "meta": { - "energyCost": "Amount of energy required for entry", - "repeatable": "Boolean (true/false): whether the dungeon can be replayed", - "raid": "Whether this dungeon is designed for a group of players" - }, - "rooms": [ - { "id": "Reference to a specific Room ID from the available rooms pool" } - ] - } -} -``` - -### Room Configuration - -**Path:** `datapacks/[namespace]/rooms/[path]/room.json` - -```json -{ - "room": { - "id": "Unique system ID (namespace:path/name)", - "displayName": "Translation key for the UI display name", - "description": "Translation key for the atmospheric flavor text shown upon entry", - "hostiles": [ - "Array of Enemy IDs to spawn in this room (e.g., ['id1', 'id2'])" - ], - "gainXp": "Fixed amount of experience awarded for clearing the room", - "credits": "Fixed amount of currency guaranteed to drop", - "loot": [], - "meta": { - "isBossRoom": "Boolean: whether to trigger boss-fight logic" - } - } -} -``` - -### Hostile Configuration - -Path: datapacks/[namespace]/enemies/hostiles/[path]/enemy.json - -```json -{ - "hostile": { - "id": "Unique system ID (namespace:path/name)", - "displayName": "Translation key for the enemy's name", - "stats": { - "health": "Numerical HP value", - "defense": "Numerical defense value", - "damage": "Numerical base damage value", - "critical.chance": "Critical hit chance", - "attack.rate": "Attack speed (seconds)" - }, - "loot": [], - "meta": {} - } -} -``` - -### Loot System Specification - -This structure is used to define item drops within **Rooms** (on completion) or from **Hostiles** (on death). - -```json -{ - "loot": [ - { - "id": "Unique Item ID (namespace:items/item_name)", - "chance": "Probability of dropping, from 0.0 (0%) to 1.0 (100%)", - "count": { - "min": "Minimum number of items to drop if the chance succeeds", - "max": "Maximum number of items to drop if the chance succeeds" - } - }, - { - "id": "Unique Item ID", - "chance": "Probability of dropping", - "count": "Fixed integer value if the item amount is always constant" - } - ] -} -``` - -### Project Examples Reference - -- **Dungeon Example:** [crystal_mine](example/datapack/ex/data/dungeons/caverns/crystal_mine.json) -- **Room Examples:** \* [crystal_hallway](example/datapack/ex/data/enemies/rooms/caverns/crystal_hallway.json) -- **Hostile Example:** [crystal_guardian](example/datapack/ex/data/enemies/hostiles/caverns/crystal_guardian.json) diff --git a/datapack-documentation/example/datapack/ex/data/dungeons/caverns/crystal_mine.json b/datapack-documentation/example/datapack/ex/data/dungeons/caverns/crystal_mine.json deleted file mode 100644 index 3522f1c..0000000 --- a/datapack-documentation/example/datapack/ex/data/dungeons/caverns/crystal_mine.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "dungeon": { - "id": "original:caverns/crystal_mine", - "displayName": "dungeons.original.caverns.crystal_mine.name", - "description": "dungeons.original.caverns.crystal_mine.desc", - "meta": { - "energyCost": 15, - "repeatable": true, - "raid": false - }, - "rooms": [ - { "id": "original:caverns/crystal_hallway" }, - { "id": "original:caverns/crystal_hallway" }, - { "id": "original:caverns/core_vault" } - ] - } -} diff --git a/datapack-documentation/example/datapack/ex/data/enemies/hostiles/caverns/crystal_guardian.json b/datapack-documentation/example/datapack/ex/data/enemies/hostiles/caverns/crystal_guardian.json deleted file mode 100644 index 5c98d00..0000000 --- a/datapack-documentation/example/datapack/ex/data/enemies/hostiles/caverns/crystal_guardian.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "hostile": { - "id": "original:caverns/crystal_guardian", - "displayName": "enemies.original.caverns.crystal_guardian.name", - "stats": { - "health": 120, - "defense": 0.25, - "damage": 18.0, - "critical,chance": 0.15, - "attack.rate": 2.5 - }, - "loot": [ - { - "id": "original:ore_coal", - "chance": 0.8, - "count": { "min": 2, "max": 5 } - }, - { - "id": "original:ore_copper", - "chance": 0.6, - "count": { "min": 1, "max": 3 } - }, - { - "id": "original:crystal_flux_core", - "chance": 0.15, - "count": 1 - }, - { - "id": "original:crystal_dimentional", - "chance": 0.02, - "count": 1 - } - ], - "meta": {} - } -} diff --git a/datapack-documentation/example/datapack/ex/data/enemies/rooms/caverns/core_vault.json b/datapack-documentation/example/datapack/ex/data/enemies/rooms/caverns/core_vault.json deleted file mode 100644 index 73e7a4a..0000000 --- a/datapack-documentation/example/datapack/ex/data/enemies/rooms/caverns/core_vault.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "room": { - "id": "original:caverns/core_vault", - "displayName": "rooms.original.caverns.core_vault.name", - "description": "rooms.original.caverns.core_vault.desc", - "hostiles": [ - "original:caverns/crystal_guardian", - "original:pirate/boarding_drone" - ], - "gainXp": 120, - "credits": 850, - "loot": [ - { - "id": "original:crystal_flux_core", - "chance": 0.5, - "count": 1 - }, - { - "id": "original:ore_copper", - "chance": 1.0, - "count": { "min": 5, "max": 10 } - } - ], - "meta": { - "isBossRoom": true - } - } -} diff --git a/datapack-documentation/example/datapack/ex/data/enemies/rooms/caverns/crystal_hallway.json b/datapack-documentation/example/datapack/ex/data/enemies/rooms/caverns/crystal_hallway.json deleted file mode 100644 index 47c81cd..0000000 --- a/datapack-documentation/example/datapack/ex/data/enemies/rooms/caverns/crystal_hallway.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "room": { - "id": "original:caverns/crystal_hallway", - "displayName": "rooms.original.caverns.crystal_hallway.name", - "description": "rooms.original.caverns.crystal_hallway.desc", - "hostiles": [ - "original:pirate/boarding_drone", - "original:pirate/boarding_drone" - ], - "gainXp": 45, - "credits": 250, - "loot": [ - { - "id": "original:ore_coal", - "chance": 1.0, - "count": { "min": 3, "max": 6 } - } - ], - "meta": { - "isBossRoom": false - } - } -} diff --git a/game-server/datapacks/core/assets/audio/.gitkeep b/game-server/datapacks/core/assets/audio/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/game-server/datapacks/core/assets/audio/GSO-Button Sound.wav b/game-server/datapacks/core/assets/audio/GSO-Button Sound.wav deleted file mode 100644 index 20b3381..0000000 Binary files a/game-server/datapacks/core/assets/audio/GSO-Button Sound.wav and /dev/null differ diff --git a/game-server/datapacks/core/assets/audio/GSO-Button Sound.webm b/game-server/datapacks/core/assets/audio/GSO-Button Sound.webm deleted file mode 100644 index 8229a15..0000000 Binary files a/game-server/datapacks/core/assets/audio/GSO-Button Sound.webm and /dev/null differ diff --git a/game-server/datapacks/core/assets/audio/GSO-Space ship Engine Idle.mp4 b/game-server/datapacks/core/assets/audio/GSO-Space ship Engine Idle.mp4 deleted file mode 100644 index 9ce3c2d..0000000 Binary files a/game-server/datapacks/core/assets/audio/GSO-Space ship Engine Idle.mp4 and /dev/null differ diff --git a/game-server/datapacks/core/assets/audio/GSO-Space ship Engine Idle.webm b/game-server/datapacks/core/assets/audio/GSO-Space ship Engine Idle.webm deleted file mode 100644 index 483bc61..0000000 Binary files a/game-server/datapacks/core/assets/audio/GSO-Space ship Engine Idle.webm and /dev/null differ diff --git a/game-server/datapacks/core/assets/languages/en_US.json b/game-server/datapacks/core/assets/languages/en_US.json deleted file mode 100644 index 1264097..0000000 --- a/game-server/datapacks/core/assets/languages/en_US.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "_comment_Admin": "", - "admin.category.core.dungeon_list": "Dungeon list", - "admin.category.core.hostile_list": "Hostile list", - "admin.category.core.item_list": "Item list", - "admin.category.core.player_list": "Player list", - "admin.category.core.item_list.all": "All", - "admin.category.core.hostile_list.all": "All", - "admin.category.core.player_list.all": "All", - "_comment_Stats": "", - "stats.category.core.attack.base": "Attack", - "stats.category.core.attack.chance": "Attack Chance", - "stats.category.core.attack.rate": "Attack Rate", - "stats.category.core.defence.base": "Defence", - "stats.category.core.defence.chance": "Defence Chance", - "stats.category.core.defence.rate": "Defence Rate", - "stats.category.core.health": "Health", - "stats.category.core.penetration.base": "Penetration", - "stats.category.core.penetration.chance": "Penetration Chance", - "stats.category.core.penetration.rate": "Penetration Rate", - "stats.category.core.reflect.base": "Reflect", - "stats.category.core.reflect.chance": "Reflection Chance", - "stats.category.core.reflect.rate": "Reflection Rate", - "stats.category.core.resistance.base": "Resistance", - "stats.category.core.resistance.cold": "Cold Resistance", - "stats.category.core.resistance.gamma": "Gamma Resistance", - "stats.category.core.resistance.heat": "Heat Resistance", - "stats.category.core.resistance.ion": "Ion Resistance", - "stats.category.core.resistance.physical": "Physical Resistance", - "stats.category.core.resistance.plasma": "Plasma Resistance", - "_comment_Tabs": "", - "category.tabs.core.crafting": "Crafting", - "category.tabs.core.dashboard": "Dashboard", - "category.tabs.core.datapack": "Datapack", - "category.tabs.core.dungeons": "Dungeons", - "category.tabs.core.inventory": "Inventory", - "category.tabs.core.quest": "Quests", - "category.tabs.core.shop": "Shop", - "category.tabs.core.skills": "Skills" -} - diff --git a/game-server/datapacks/core/assets/textures/.gitkeep b/game-server/datapacks/core/assets/textures/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/game-server/datapacks/core/manifest.json b/game-server/datapacks/core/manifest.json deleted file mode 100644 index 23b8e2e..0000000 --- a/game-server/datapacks/core/manifest.json +++ /dev/null @@ -1,102 +0,0 @@ -{ - "name": "core", - "version": "0.0.1", - "admin_dungeon_list": { - "categories": { - "dungeon:all": { - "displayName": "admin.category.core.dungeon_list.all" - } - } - }, - "admin_hostiles_list": { - "categories": { - "core:all": { - "displayName": "admin.category.core.hostile_list.all" - } - } - }, - "admin_item_list": { - "categories": { - "core:all": { - "displayName": "admin.category.core.item_list.all" - } - } - }, - "admin_panel": { - "categories": { - "core:admin_dungeon_list": { - "displayName": "admin.category.core.dungeon_list" - }, - "core:admin_hostiles_list": { - "displayName": "admin.category.core.hostile_list" - }, - "core:admin_item_list": { - "displayName": "admin.category.core.item_list" - }, - "core:admin_player_list": { - "displayName": "admin.category.core.player_list" - } - } - }, - "admin_player_list": { - "categories": { - "core:all": { - "displayName": "admin.category.core.player_list.all" - } - } - }, - "core_systems": { - "categories": { - } - }, - "dashboard": { - "categories": { - "core:dashboard_id":{ - "displayName": "dashboard.category.core.dashboard_id" - }, - "core:dashboard_finance":{ - "displayName": "dashboard.category.core.dashboard_finance" - }, - "core:dashboard_system":{ - "displayName": "dashboard.category.core.dashboard_system" - } - } - }, - "dashboard_finance": { - "categories": { - } - }, - "dashboard_id": { - "categories": { - "core:rank":{ - "displayName": "dashboard.category.core.id_rank" - }, - "core:experiance":{ - "displayName": "dashboard.category.core.id_exeriance" - } - } - }, - "dashboard_system": { - "categories": { - "core:server_status":{ - "displayName": "dashboard.category.core.server_status" - } - } - }, - "quests": { - "categories": { - } - }, - "recipes": { - "categories": { - } - }, - "shop": { - "categories": { - } - }, - "skills": { - "categories": { - } - } -} diff --git a/game-server/datapacks/original/assets/languages/en_US.json b/game-server/datapacks/original/assets/languages/en_US.json deleted file mode 100644 index 407a599..0000000 --- a/game-server/datapacks/original/assets/languages/en_US.json +++ /dev/null @@ -1,298 +0,0 @@ -{ -"_comment_Admin" : "", - "admin.category.original.hostile_list" : "Hostile List", - "admin.category.original.item_list" : "Item List", - "admin.category.original.player_list" : "Player List", - "admin.category.original.item_list.all" : "All", - "admin.category.original.item_list.alloys" : "Alloys", - "admin.category.original.item_list.circuits" : "Circuits", - "admin.category.original.item_list.customizables" : "Customizables", - "admin.category.original.item_list.ingots" : "Ingots", - "admin.category.original.item_list.maerials" : "Materials", - "admin.category.original.item_list.ores" : "Ores", - "admin.category.original.item_list.personal" : "Personal", - "admin.category.original.item_list.ships" : "Ships", - "admin.category.original.item_list.shields" : "Shields", - "admin.category.original.item_list.weapons" : "Weapons", - "admin.category.original.hostile_list.all" : "All", - "admin.category.original.hostile_list.ground" : "Ground Units", - "admin.category.original.hostile_list.ships" : "Ships", - "admin.category.original.player_list.all" : "All", - "admin.category.original.player_list.members" : "Members", - "admin.category.original.player_list.moderators" : "Moderators", - "admin.category.original.player_list.admins" : "Admins", -"_comment_Core_Systems" : "", - "core_systems.category.original.person.backpack" : "Personal Backpack", - "core_systems.category.original.person.helmet" : "Personal Helmet", - "core_systems.category.original.person.suit" : "Personal Suit", - "core_systems.category.original.person.gloves" : "Personal Gloves", - "core_systems.category.original.person.boots" : "Personal Boots", - "core_systems.category.original.person.accessory_1" : "Personal Accessory 1", - "core_systems.category.original.person.accessory_2" : "Personal Accessory 2", - "core_systems.category.original.person.accessory_3" : "Personal Accessory 3", - "core_systems.category.original.person.accessory_4" : "Personal Accessory 4", - "core_systems.category.original.person.weapon" : "Personal Weapon", - "core_systems.category.original.ship.hull" : "Ship Hull", - "core_systems.category.original.ship.shields" : "Ship Shield", - "core_systems.category.original.ship.engines" : "Ship Engine", - "core_systems.category.original.ship.weapon_1" : "Ship Weapon 1", - "core_systems.category.original.ship.weapon_2" : "Ship Weapon 2", - "core_systems.category.original.ship.thruster_1" : "Ship Thruster 1", - "core_systems.category.original.ship.thruster_2" : "Ship Thruster 2", - "core_systems.category.original.ship.thruster_3" : "Ship Thruster 3", - "core_systems.category.original.ship.thruster_4" : "Ship Thruster 4", -"_comment_Dungeons" : "", - "dungeons.original.pirate.pirates_outpost" : "Pirate Outpost", - "dungeons.original.pirate.pirates_outpost.desc" : "A hidden supply station belonging to the Black Mark syndicate.", - "dungeons.original.tutorial.tutorial" : "Tutorial", - "dungeons.original.tutorial.tutorial.desc" : "A one time dungeon.", - "dungeons.original.Kaleidoscope" : "Kaleidoscope", - "dungeons.original.Kaleidoscope.desc" : "hope you got lots of diffrent resistances...", -"_comment_Enemies" : "", - "enemies.original.creatures.pirate.black_mark_heavy_cruiser" : "Black Mark Heavy Cruiser", - "enemies.original.pirate.black_mark_heavy_cruiser" : "Raider Frigate", - "enemies.original.pirate.raider_frigate" : "Snacher Clipper", - "enemies.original.pirate.corvid_corvette" : "Corvid Corvette", - "enemies.original.pirate.snacher_clipper" : "Scout Drone", - "enemies.original.tutorial.tutorial_hostile" : "Tutorial hostile", - "enemies.original.tutorial.tutorial_boss_hostile" : "Tutorial Boss", - "enemies.original.pirate.scout_drone" : "scout drone", - "enemies.original.creatures.gamma_fiend" : "mutant", - "enemies.original.creatures.gamma_fiend.desc" : "the radiation sickens you", - "enemies.original.creatures.fire_fiend" : "fire fiend", - "enemies.original.creatures.fire_fiend.desc" : "Hot HOT HOT!", - "enemies.original.anomalies.electrical_anomaly" : "Electrical Anomaly", - "enemies.original.anomalies.electrical_anomaly.desc" : "a ball of angry lightning", - "enemies.original.creatures.not_a_giant_rat" : "Mouse XL", - "enemies.original.creatures.not_a_giant_rat.desc" : "No, not a giant rat, stop asking", - "enemies.original.anomalies.plasma_anomaly" : "Plasma Anomaly", - "enemies.original.anomalies.plasma_anomaly.desc" : "an angry ball of plasma", - "enemies.original.creatures.frost_fiend" : "woolly wambler", - "enemies.original.creatures.frost_fiend.desc" : "beware its ice spikes", - "enemies.original.pirate.scout_drone.desc" : "a scout ahead of its group", - "enemies.original.pirate.snacher_clipper.desc" : "Fast and hard to hit. Built to run blockades and transport VIPs", - "enemies.original.pirate.raider_frigate.desc" : "Perfect for raiding under defended colonies and stations", - "enemies.original.pirate.black_mark_heavy_cruiser.desc" : "what passes as a typical pirate lord cammand ship", - "enemies.original.pirate.corvid_corvette.desc" : "stealthy and uses hard to resist plasma attacks", -"_comment_Equipment_Personal" : "", - "items.materials.original.personal.accessory.basic_personal_accessory" : "Personal accessory", - "items.materials.original.personal.accessory.basic_personal_accessory.desc" : "Test accessory", - "items.materials.original.personal.backpack.basic_personal_backpack" : "Personal backpack", - "items.materials.original.personal.backpack.basic_personal_backpack.desc" : "Test backpack", - "items.materials.original.personal.armor.boots.basic_personal_boots" : "Personal boots", - "items.materials.original.personal.armor.boots.basic_personal_boots.desc" : "Test boots", - "items.materials.original.personal.armor.gloves.basic_personal_gloves" : "Personal gloves", - "items.materials.original.personal.armor.gloves.basic_personal_gloves.desc" : "Test gloves", - "items.materials.original.personal.suit.basic_personal_suit" : "Personal suit", - "items.materials.original.personal.suit.basic_personal_suit.desc" : "Test suit", - "items.materials.original.personal.weapon.basic_personal_weapon" : "Personal weapon", - "items.materials.original.personal.weapon.basic_personal_weapon.desc" : "Test weapon", - "items.materials.original.personal.backpack.personal_shield" : "Personal Shield", - "items.materials.original.personal.backpack.personal_shield.desc" : "Provides a lot of protection but lacks sufficent storage space", -"_comment_Equipment_Ship" : "", - "items.materials.original.ship.engine.basic_ship_engines" : "Ship engines", - "items.materials.original.ship.engine.basic_ship_engines.desc" : "Test engines", - "items.materials.original.ship.engine.rtg" : "RTG", - "items.materials.original.ship.engine.rtg.desc" : "very baisic and low power genarator with a long track record of reliability", - "items.materials.original.ship.engine.gen1_fission_reactor" : "Gen 1 nuclear reactor", - "items.materials.original.ship.engine.gen1_fission_reactor.desc" : "A boiling water reactor. Little more than a pile of glowing rocks in some hot water", - "items.materials.original.ship.engine.gen2_fission_reactor" : "Gen 2 nuclear reactor", - "items.materials.original.ship.engine.gen2_fission_reactor.desc" : "A Gas cooled reactor. Uses CO2 as a coolant allowing it to run hotter and at higher pressures and be much more power dense. The high power density and pressures comes at a price of reliability", - "items.materials.original.ship.engine.gen3_fission_reactor" : "Gen 3 nuclear reactor", - "items.materials.original.ship.engine.gen3_fission_reactor.desc" : "A Molten salt reactor. The pinical of fission power. Uses molten salt as its coolant allowing for very high temperatures and low pressures. Safer than most reactors", - "items.materials.original.ship.plating.basic_plating" : "Ship plating", - "items.materials.original.ship.plating.basic_plating.desc" : "Better at stopping sing large hits", - "items.materials.original.ship.plating.heavy_plating" : "Heavy Plating", - "items.materials.original.ship.plating.heavy_plating.desc" : "Strong plating capable of resisting high damage impacts", - "items.materials.original.ship.plating.reflective_plating" : "Reflective plating", - "items.materials.original.ship.plating.reflective_plating.desc" : "About as strong as heavy plating but reflects damage back at attackers", - "items.materials.original.ship.shields.basic_shield" : "Ship shield", - "items.materials.original.ship.shields.basic_shield.desc" : "Better at stopping many smaller hits. Weak to ion damage", - "items.materials.original.ship.shields.heavy_shield" : "Heavy shield", - "items.materials.original.ship.shields.heavy_shield.desc" : "A high capacity shild for dealing with lots of inbond threats", - "items.materials.original.ship.shields.reflecter_shield" : "Reflecter Shields", - "items.materials.original.ship.shields.reflecter_shield.desc" : "About as strong as heavy shields but reflects a lot of damage back at the attacker", - "items.materials.original.ship.thruster.basic_ship_thruster" : "Ship thruster", - "items.materials.original.ship.thruster.basic_ship_thruster.desc" : "Test thruster", - "items.materials.original.ship.thruster.big_ship_thruster" : "Big ship thruster", - "items.materials.original.ship.thruster.big_ship_thruster.desc" : "Used as a main drive for a ship", - "items.materials.original.ship.weapon.basic_ship_weapon" : "Ship weapon", - "items.materials.original.ship.weapon.basic_ship_weapon.desc" : "Test weapon", - "items.materials.original.ship.weapon.unstable_partical_cannon" : "Unstable partical cannon", - "items.materials.original.ship.weapon.unstable_partical_cannon.desc" : "Does a lot of damage in a small space but to power it requires a lot of changes to the ships internals making it more prone to damage", - "items.materials.original.ship.weapon.serpent_missiles" : "Serpent Missiles", - "items.materials.original.ship.weapon.serpent_missiles.desc" : "Missiles do more damage for their tier but prone to magazine detonations", -"_comment_Materials" : "", - "items.materials.original.bio.bio_pulp" : "Bio pulp", - "items.materials.original.bio.bio_pulp.desc" : "A pile of biological material.", - "items.materials.original.alloys.steel" : "Steel ingot", - "items.materials.original.alloys.steel.desc" : "A steel ingot.", - "items.materials.original.alloys.titanium_weave" : "Titanium weave", - "items.materials.original.alloys.titanium_weave.desc" : "used where flexibility does not compromise strength", - "items.materials.original.alloys.void_steel" : "Void steel", - "items.materials.original.alloys.void_steel.desc" : "Steel that is very strong and increadably light absorbent", - "items.materials.original.alloys.chronotanium" : "Chronotanium ingot", - "items.materials.original.alloys.chronotanium.desc" : "A chronite-titianium alloy for strong and energetic applications", - "items.materials.original.alloys.neutronium_composite" : "Neutronium composite", - "items.materials.original.alloys.neutronium_composite.desc" : "A compostite of neutronium of", - "items.materials.original.alloys.superconductor" : "Superconductor", - "items.materials.original.alloys.superconductor.desc" : "A material with no resistance and expells all magnetic fields very usefull in high energy compnents", - "items.materials.original.circuits.basic" : "Basic Circuit", - "items.materials.original.circuits.basic.desc" : "Basic electronics used in simple electromecanical systems. Probably made in someone's shed. Rated for common Tier systems.", - "items.materials.original.circuits.advanced" : "Advanced Circuit", - "items.materials.original.circuits.advanced.desc" : "Advanced electronics used in electromecanical systems, featuring transistors for compact switching. Made with industrial Machines. Rated for uncommon Tier systems.", - "items.materials.original.circuits.processing_unit" : "Processing unit", - "items.materials.original.circuits.processing_unit.desc" : "Highly Advanced electronics used in demanding systems, featuring Integrated circuts replacing entire boards. Made with precision UV lithography machines. Rated for Rare Tier systems.", - "items.materials.original.circuits.quantum_processor" : "Quantum Processor", - "items.materials.original.circuits.quantum_processor.desc" : "Increadably electronics used in complex systems, featuring quantum cores for unparalleled parallel computation. Made with . Rated for Epic Tier systems.", - "items.materials.original.circuits.ai_core" : "Ai Core", - "items.materials.original.circuits.ai_core.desc" : "A semi sapient general intelligence, featuring advanced reasoning skills and simulated simulations, it will never truly know if it is in another simulation. Made under incudulus supervison and adhears to strict laws. Warrrenty void if not reset every terran standerd season.", - "items.materials.original.crystal.flux" : "Flux crystal", - "items.materials.original.crystal.flux.desc" : "A crystal whose properties are in constant flux. Commenly used in high power electrical aplications", - "items.materials.original.crystal.flux_core" : "Flux Core", - "items.materials.original.crystal.flux_core.desc" : "The crystal tamed can nhow be used in more demanding applications", - "items.materials.original.crystal.void" : "Void crystal", - "items.materials.original.crystal.void.desc" : "A crystal that seems to sap the very light from the room. Commenly used in armor and stealth applications", - "items.materials.original.crystal.dimentional" : "Dimentional crystal", - "items.materials.original.crystal.dimentional.desc" : "reality warps at its edges, imagine the possibilities", - "items.materials.original.crystal.neutronium" : "Neutronium", - "items.materials.original.crystal.neutronium.desc" : "A hyper dense piece of along dead star", - "items.materials.original.ingots.aluminum" : "Aluminum ingot", - "items.materials.original.ingots.aluminum.desc" : "An aluminum ingot.", - "items.materials.original.ingots.carbon" : "carbon ingot", - "items.materials.original.ingots.carbon.desc" : "A carbon ingot.", - "items.materials.original.ingots.chronite" : "Chronite Ingot", - "items.materials.original.ingots.chronite.desc" : "A chronite ingot.", - "items.materials.original.ingots.copper" : "Copper ingot", - "items.materials.original.ingots.copper.desc" : "A copper ingot.", - "items.materials.original.ingots.gold" : "Gold ingot", - "items.materials.original.ingots.gold.desc" : "A gold ingot.", - "items.materials.original.ingots.iron" : "Iron Ingot", - "items.materials.original.ingots.iron.desc" : "A iron ingot.", - "items.materials.original.ingots.titanium" : "Titanium ingot", - "items.materials.original.ingots.titanium.desc" : "A titanium ingot.", - "items.materials.original.ingots.tungsten" : "Tungsten ingot", - "items.materials.original.ingots.tungsten.desc" : "A tungsten ingot.", - "items.materials.original.ores.bauxite" : "Bauxite ore", - "items.materials.original.ores.bauxite.desc" : "A pile of bauxite ore.", - "items.materials.original.ores.chronite" : "Chronium ore", - "items.materials.original.ores.chronite.desc" : "A pile of chronium ore.", - "items.materials.original.ores.coal" : "Coal ore", - "items.materials.original.ores.coal.desc" : "A pile of coal ore.", - "items.materials.original.ores.copper" : "Copper ore", - "items.materials.original.ores.copper.desc" : "A pile of copper ore.", - "items.materials.original.ores.gold" : "Gold ore", - "items.materials.original.ores.gold.desc" : "A pile of gold ore.", - "items.materials.original.ores.ilunite" : "Ilunite ore", - "items.materials.original.ores.ilunite.desc" : "A pile of ilunite ore.", - "items.materials.original.ores.iron" : "Iron ore", - "items.materials.original.ores.iron.desc" : "A pile of iron ore.", - "items.materials.original.ores.wolframite" : "Wolframite ore", - "items.materials.original.ores.wolframite.desc" : "A pile of wolframite ore.", - "items.materials.original.plating.basic_ship_plating" : "Ship plating", - "items.materials.original.plating.basic_ship_plating.desc" : "Just basic ship plating.", -"_comment_Quests" : "", - "quests.category.original.story" : "Story", - "quests.category.original.daily" : "Daily", - "quests.category.original.weekly" : "Weekly", - "quests.category.original.monthly" : "Monthly", - "quests.category.original.seasonal" : "Seasons", - "quests.original.tutorial.starter_kit" : "Starter Kit: Neural Link", - "quests.tutorial.slay_boss.name" : "Trial by Fire", - "quests.tutorial.slay_boss.desc" : "Prove your combat capabilities by neutralizing the Tutorial Boss unit.", - "quests.tutorial.slay_boss.obj1" : "Defeat the Tutorial Boss", - "Welcome, Commander. Your neural link is active. Initial equipment has been authorized." : "", -"_comment_Recipes" : "", - "recipes.category.original.alloys" : "Alloys", - "recipes.category.original.circuits" : "Circuits", - "recipes.category.original.crystals" : "Crystals", - "recipes.category.original.food" : "Food", - "recipes.category.original.forging" : "Forging", - "recipes.category.original.hull_sections" : "Hull Sections", - "recipes.category.original.hulls" : "Hulls", - "recipes.category.original.organics" : "Organics", - "recipes.category.original.spacesuit_parts" : "Spacesuit Parts", -"_comment_Shop" : "", - "shop.category.original.consumables" : "Consumables", - "shop.category.original.defence" : "Defence", - "shop.category.original.featured" : "Featured", - "shop.category.original.materials" : "Materials", - "shop.category.original.premium" : "Premium", - "shop.category.original.ships" : "Ships", - "shop.category.original.weapons" : "Weapons", - "shop.category.original.personal.equipment" : "Personal Equipment", - "shop.category.original.ship.equipment" : "Ship Equipment", -"_comment_Skills" : "", - "skills.category.original.combat" : "Combat", - "skills.category.original.combat.weapon_effiency" : "Weapon Effiency", - "skills.category.original.combat.weapon_effiency.desc" : "Let's get those weapons better!", - "skills.category.original.crafting" : "Crafting", - "skills.category.original.crafting.blacksmithing" : "Blacksmithing", - "skills.category.original.crafting.blacksmithing.desc" : "To forge the basics.", - "skills.category.original.crafting.alloying" : "Alloying", - "skills.category.original.crafting.alloying.desc" : "Lets start alloy making.", - "skills.category.original.science" : "Science", - "skills.category.original.science.alien_technology" : "Alien Technology", - "skills.category.original.science.alien_technology.desc" : "Unknown Mysterious Tech", - "skills.category.original.science.biology_engineering" : "Biology Engineering", - "skills.category.original.science.biology_engineering.desc" : "Maybe we will unlock bio-tech?", - "skills.category.original.crafting.ship_manufacturing" : "Ship Manufacturing", - "skills.category.original.crafting.ship_manufacturing.desc" : "To build a ship to sail the stars", - "skills.category.original.crafting.high_energetics" : "High Energetics", - "skills.category.original.crafting.high_energetics.desc" : "Learn how to make and manage reactors and energy weapons", - "skills.category.original.combat.engine_effiency" : "", - "skills.category.original.combat.engine_effiency.desc" : "", - "skills.category.original.combat.shield_effiency" : "", - "skills.category.original.combat.shield_effiency.desc" : "", - "skills.category.original.combat.thruster_effiency" : "", - "skills.category.original.combat.thruster_effiency.desc" : "", - "skills.category.original.crafting.circuit_assembly" : "", - "skills.category.original.crafting.circuit_assembly.desc" : "", - "skills.category.original.crafting.forging" : "", - "skills.category.original.crafting.forging.desc" : "", -"_comment_Stats" : "", - "stats.category.original.attack.base" : "Attack", - "stats.category.original.attack.chance" : "Attack Chance", - "stats.category.original.attack.rate" : "Attack Rate", - "stats.category.original.defence.base" : "Defence", - "stats.category.original.defence.chance" : "Defence Chance", - "stats.category.original.defence.rate" : "Defence Rate", - "stats.category.original.health" : "Health", - "stats.category.original.penetration.base" : "Penetration", - "stats.category.original.penetration.chance" : "Penetration Chance", - "stats.category.original.penetration.rate" : "Penetration Rate", - "stats.category.original.reflect.base" : "Reflect", - "stats.category.original.reflect.chance" : "Reflection Chance", - "stats.category.original.reflect.rating" : "Reflection Rating", - "stats.category.original.resistance.base" : "Resistance", - "stats.category.original.resistance.cold" : "Cold Resistance", - "stats.category.original.resistance.gamma" : "Gamma Resistance", - "stats.category.original.resistance.heat" : "Heat Resistance", - "stats.category.original.resistance.ion" : "Ion Resistance", - "stats.category.original.resistance.physical" : "Physical Resistance", - "stats.category.original.resistance.plasma" : "Plasma Resistance", -"_comment_Tabs" : "", - "category.tabs.original.crafting" : "Crafting", - "category.tabs.original.dashboard" : "Dashboard", - "category.tabs.original.datapack" : "Debug Tab", - "category.tabs.original.dungeons" : "Dungeons", - "category.tabs.original.inventory" : "Inventory", - "category.tabs.original.shop" : "Shop", - "category.tabs.original.skills" : "Skills", - "category.tabs.original.quests" : "Quests", -"_comment_Rooms" : "", - "rooms.original.pirates.pirate_supply_bay" : "", - "rooms.original.pirates.pirate_supply_bay.desc" : "", - "rooms.original.tutorial.tutorial_boss_room.name" : "", - "rooms.original.tutorial.tutorial_boss_room.desc" : "", - "rooms.original.tutorial.tutorial_enemy_room.name" : "", - "rooms.original.tutorial.tutorial_enemy_room.desc" : "", - "rooms.original.tutorial.tutorial_loot_room.name" : "", - "rooms.original.tutorial.tutorial_loot_room.desc" : "", - "rooms.original.themed.broken_reactor" : "", - "rooms.original.themed.broken_reactor.desc" : "", - "rooms.original.themed.the_rat_one" : "", - "rooms.original.themed.the_rat_one.desc" : "", - "rooms.original.themed.cold" : "", - "rooms.original.themed.cold.desc" : "" -} \ No newline at end of file diff --git a/game-server/datapacks/original/assets/languages/fr_FR.json b/game-server/datapacks/original/assets/languages/fr_FR.json deleted file mode 100644 index 8787d3a..0000000 --- a/game-server/datapacks/original/assets/languages/fr_FR.json +++ /dev/null @@ -1,189 +0,0 @@ -{ -"_comment_Admin" : "", - "admin.category.original.hostile_list" : "Hostile List", - "admin.category.original.item_list" : "Item List", - "admin.category.original.player_list" : "Player List", - "admin.category.original.item_list.all" : "All", - "admin.category.original.item_list.alloys" : "Alloys", - "admin.category.original.item_list.circuits" : "Circuits", - "admin.category.original.item_list.customizables" : "Customizables", - "admin.category.original.item_list.ingots" : "Ingots", - "admin.category.original.item_list.maerials" : "Materials", - "admin.category.original.item_list.ores" : "Ores", - "admin.category.original.item_list.personal" : "Personal", - "admin.category.original.item_list.ships" : "Ships", - "admin.category.original.item_list.shields" : "Shields", - "admin.category.original.item_list.weapons" : "Weapons", - "admin.category.original.hostile_list.all" : "All", - "admin.category.original.hostile_list.ground" : "Ground Units", - "admin.category.original.hostile_list.ships" : "Ships", - "admin.category.original.player_list.all" : "All", - "admin.category.original.player_list.members" : "Members", - "admin.category.original.player_list.moderators" : "Moderators", - "admin.category.original.player_list.admins" : "Admins", -"_comment_Core_Systems" : "", - "core_systems.category.original.person.helmet" : "Personal Helmet", - "core_systems.category.original.person.suit" : "Personal Suit", - "core_systems.category.original.person.gloves" : "Personal Gloves", - "core_systems.category.original.person.boots" : "Personal Boots", - "core_systems.category.original.person.accessory_1" : "Personal Accessory 1", - "core_systems.category.original.person.accessory_2" : "Personal Accessory 2", - "core_systems.category.original.person.accessory_3" : "Personal Accessory 3", - "core_systems.category.original.person.accessory_4" : "Personal Accessory 4", - "core_systems.category.original.person.weapon" : "Personal Weapon", - "core_systems.category.original.ship.hull" : "Ship Hull", - "core_systems.category.original.ship.shields" : "Ship Shield", - "core_systems.category.original.ship.engines" : "Ship Engine", - "core_systems.category.original.ship.weapon_1" : "Ship Weapon 1", - "core_systems.category.original.ship.weapon_2" : "Ship Weapon 2", - "core_systems.category.original.ship.thruster_1" : "Ship Thruster 1", - "core_systems.category.original.ship.thruster_2" : "Ship Thruster 2", - "core_systems.category.original.ship.thruster_3" : "Ship Thruster 3", - "core_systems.category.original.ship.thruster_4" : "Ship Thruster 4", -"_comment_Dungeons": "", - "dungeons.original.pirate.pirates_outpost": "Avant-Poste Pirate", - "dungeons.original.pirate.pirates_outpost.desc": "Une station de ravitaillement caché appartenant au syndicat de la Marque Noire.", - "dungeons.original.tutorial.tutorial": "Tutoriel", - "dungeons.original.tutorial.tutorial.desc": "Un donjon unique.", -"_comment_Enemies": "", - "enemies.original.pirate.black_mark_heavy_cruiser": "Croiseur Lourd Marque Noire", - "enemies.original.pirate.raider_frigate": "Frégate d'Assaillant", - "enemies.original.pirate.snacher_clipper": "Snacher Clipper", - "enemies.original.pirate.corvid_corvette": "Corvid Corvette", - "enemies.original.pirate.scout_drone": "Drone d'espionnage", - "enemies.original.tutorial.tutorial_hostile": "Tutoriel hostile", - "enemies.original.tutorial.tutorial_boss_hostile": "Maître tutoriel", -"_comment_Equipment": "", - "items.materials.original.backpack_basic": "Sac à dos basique", - "items.materials.original.backpack_basic.desc": "Les bases des costumes.", - "items.materials.original.backpack_advanced": "Sac à dos Avancé", - "items.materials.original.backpack_advanced.desc": "Essayer un meilleur costume.", - "items.materials.original.backpack_elite": "Sac à dos d'élite", - "items.materials.original.backpack_elite.desc": "Maintenant, le meilleur que le monde ait à offrir.", -"_comment_Materials": "", - "items.materials.original.bio.bio_pulp": "Pulpe de biographie", - "items.materials.original.bio.bio_pulp.desc": "Une pile de matériel biologique.", - "items.materials.original.alloys.steel": "Lingot d'Acier", - "items.materials.original.alloys.steel.desc": "Un lingot d'acier.", - "items.materials.original.alloys.titanium_weave" : "titianium weave", - "items.materials.original.alloys.titanium_weave.desc" : "used where flexibility does not compromise strength", - "items.materials.original.alloys.neutronium_composite" :"Neutronium composite", - "items.materials.original.alloys.neutronium_composite.desc" :"A compostite of neutronium of", - "items.materials.original.alloys.superconductor" : "Superconductor", - "items.materials.original.alloys.superconductor.desc" : "A material with no resistance and expells all magnetic fields very usefull in high energy compnents", - "items.materials.original.alloys.chronotanium" :"Chronotanium", - "items.materials.original.alloys.chronotanium.desc" :"A chronite-titianium alloy for strong and energetic applications", - "items.materials.original.circuits.basic" : "Basic Circuit", - "items.materials.original.circuits.basic.desc" : "Basic electronics used in simple electromecanical systems. Probably made in someone's shed. Rated for common Tier systems.", - "items.materials.original.circuits.advanced" : "Advanced Circuit", - "items.materials.original.circuits.advanced.desc" : "Advanced electronics used in electromecanical systems, featuring transistors for compact switching. Made with industrial Machines. Rated for uncommon Tier systems.", - "items.materials.original.circuits.processing_unit" : "Processing unit", - "items.materials.original.circuits.processing_unit.desc" : "Highly Advanced electronics used in demanding systems, featuring Integrated circuts replacing entire boards. Made with precision UV lithography machines. Rated for Rare Tier systems.", - "items.materials.original.circuits.quantum_processor" : "Quantum Processor", - "items.materials.original.circuits.quantum_processor.desc" : "Increadably electronics used in complex systems, featuring quantum cores for unparalleled parallel computation. Made with . Rated for Epic Tier systems.", - "items.materials.original.circuits.ai_core" : "Ai Core", - "items.materials.original.circuits.ai_core.desc" : "A semi sapient general intelligence, featuring advanced reasoning skills and simulated simulations, it will never truly know if it is in another simulation. Made under incudulus supervison and adhears to strict laws. Warrrenty void if not reset every terran standerd season.", - "items.materials.original.crystal.flux" :"Flux crystal", - "items.materials.original.crystal.flux.desc" :"A crystal whose properties are in constant flux. Commenly used in high power electrical aplications", - "items.materials.original.crystal.flux_core" : "Flux Core", - "items.materials.original.crystal.flux_core.desc" : "The crystal tamed can nhow be used in more demanding applications", - "items.materials.original.crystal.void" :"Void crystal", - "items.materials.original.crystal.void.desc" :"A crystal that seems to sap the very light from the room. Commenly used in armor and stealth applications", - "items.materials.original.crystal.dimentional" : "Dimentonal crystal", - "items.materials.original.crystal.dimentional.desc" : "reality warps at its edges, imagine the possibilities", - "items.materials.original.crystal.neutronium" :"Neutronium", - "items.materials.original.crystal.neutronium.desc" :"A hyper dense piece of along dead star", - "items.materials.original.ingots.aluminum": "Lingot d'aluminium", - "items.materials.original.ingots.aluminum.desc": "Un lingot d'aluminium", - "items.materials.original.ingots.chronite": "Lingot chronite", - "items.materials.original.ingots.chronite.desc": "Un lingot de chronite.", - "items.materials.original.ingots.copper": "Lingot de cuivre", - "items.materials.original.ingots.copper.desc": "Un lingot de cuivre.", - "items.materials.original.ingots.gold": "Lingot d'or", - "items.materials.original.ingots.gold.desc": "Un lingot d'or.", - "items.materials.original.ingots.iron": "Lingot d'acier", - "items.materials.original.ingots.iron.desc": "Un lingot de fer.", - "items.materials.original.ingots.titanium": "Lingot de titane", - "items.materials.original.ingots.titanium.desc": "Un lingot de titane", - "items.materials.original.ingots.tungsten": "Lingot de tungstène", - "items.materials.original.ingots.tungsten.desc": "Un lingot de tungstène", - "items.materials.original.ores.bauxite": "Minerai de Bauxite", - "items.materials.original.ores.bauxite.desc": "Une pile de minerai de bauxite.", - "items.materials.original.ores.chronite": "Minerai de Chronium", - "items.materials.original.ores.chronite.desc": "Une pile de minerai de chronium.", - "items.materials.original.ores.coal": "Minerai de Charbon", - "items.materials.original.ores.coal.desc": "Une pile de minerai de charbon.", - "items.materials.original.ores.copper": "Minerai de cuivre", - "items.materials.original.ores.copper.desc": "Une pile de minerai de cuivre.", - "items.materials.original.ores.gold": "Minerai d'or", - "items.materials.original.ores.gold.desc": "Une pile de minerai d'or.", - "items.materials.original.ores.ilunite": "Minerai d'Ilménite", - "items.materials.original.ores.ilunite.desc": "Une pile de minerai d'ilménite.", - "items.materials.original.ores.iron": "Minerai de fer", - "items.materials.original.ores.iron.desc": "Une pile de minerai de fer.", - "items.materials.original.ores.wolframite": "Minerai de Louframite", - "items.materials.original.ores.wolframite.desc": "Une pile de minerai de louframite.", - "items.materials.original.plating.basic_ship_plating": "Plaque de Navire", - "items.materials.original.plating.basic_ship_plating.desc": "Juste l'assiette de base du navire.", -"_comment_Recipes": "", - "recipes.category.original.alloys": "Alliages", - "recipes.category.original.circuits": "Circuits", - "recipes.category.original.crystals" : "Crystals", - "recipes.category.original.food": "Nourriture", - "recipes.category.original.forging": "Forge", - "recipes.category.original.hull_sections": "Sections de coque", - "recipes.category.original.hulls": "Coques", - "recipes.category.original.organics": "Organismes", - "recipes.category.original.spacesuit_parts": "Pièces spatiales", -"_comment_Shop" : "", - "shop.category.original.consumables" : "Consumables", - "shop.category.original.defence" : "Defence", - "shop.category.original.featured" : "Featured", - "shop.category.original.materials" : "Materials", - "shop.category.original.premium" : "Premium", - "shop.category.original.ships" : "Ships", - "shop.category.original.weapons" : "Weapons", -"_comment_Skills": "", - "skills.category.original.combat": "Guerre", - "skills.category.original.combat.weapon_effiency": "Efficacité de l'arme", - "skills.category.original.combat.weapon_effiency.desc": "Améliorons ces armes !", - "skills.category.original.crafting": "Fabriquer", - "skills.category.original.crafting.blacksmithing": "Forge", - "skills.category.original.crafting.blacksmithing.desc": "Pour forger les bases.", - "skills.category.original.crafting.alloying": "Alliage", - "skills.category.original.crafting.alloying.desc": "Commençons à fabriquer des alliages.", - "skills.category.original.science": "Sciences", - "skills.category.original.science.alien_technology": "Technologies extraterrestres", - "skills.category.original.science.alien_technology.desc": "Technique Mystérieuse Inconnue", - "skills.category.original.science.biology_engineering": "Ingénierie de la Biologie", - "skills.category.original.science.biology_engineering.desc": "Peut-être débloquons-nous la biotechnologie ?", -"_comment_Stats": "", - "stats.category.original.attack.base": "Attaque", - "stats.category.original.attack.chance": "Chances d'Attaque", - "stats.category.original.attack.rating": "Classement d'Attaque", - "stats.category.original.defence.base": "Défense", - "stats.category.original.defence.chance": "Chance de défense", - "stats.category.original.defence.rating": "Classement de défense", - "stats.category.original.health": "Vie", - "stats.category.original.penetration.base": "Pénétration", - "stats.category.original.penetration.chance": "Chance de pénétration", - "stats.category.original.penetration.rating": "Évaluation de pénétration", - "stats.category.original.reflect.base": "Reflet", - "stats.category.original.reflect.chance": "Chance de réflexion", - "stats.category.original.reflect.rating": "Évaluation de réflexion", - "stats.category.original.resistance.base": "résistance", - "stats.category.original.resistance.cold": "Résistance au froid", - "stats.category.original.resistance.gamma": "Résistance au gamma", - "stats.category.original.resistance.heat": "Résistance à la chaleur", - "stats.category.original.resistance.ion": "Résistance à l'ion", - "stats.category.original.resistance.physical": "Résistance physique", - "stats.category.original.resistance.plasma": "Résistance au plasma", -"_comment_Tabs": "", - "category.tabs.original.admin_panel" : "Admin", - "category.tabs.original.crafting": "Fabriquer", - "category.tabs.original.dashboard": "Tableaux de bord", - "category.tabs.original.dungeons": "Les donjons", - "category.tabs.original.inventory": "Inventaire", - "category.tabs.original.shop": "Boutique", - "category.tabs.original.skills": "Possibilité" -} \ No newline at end of file diff --git a/game-server/datapacks/original/assets/languages/uk_UA.json b/game-server/datapacks/original/assets/languages/uk_UA.json deleted file mode 100644 index f5a23e0..0000000 --- a/game-server/datapacks/original/assets/languages/uk_UA.json +++ /dev/null @@ -1,189 +0,0 @@ -{ -"_comment_Admin" : "", - "admin.category.original.hostile_list" : "Hostile List", - "admin.category.original.item_list" : "Item List", - "admin.category.original.player_list" : "Player List", - "admin.category.original.item_list.all" : "All", - "admin.category.original.item_list.alloys" : "Alloys", - "admin.category.original.item_list.circuits" : "Circuits", - "admin.category.original.item_list.customizables" : "Customizables", - "admin.category.original.item_list.ingots" : "Ingots", - "admin.category.original.item_list.maerials" : "Materials", - "admin.category.original.item_list.ores" : "Ores", - "admin.category.original.item_list.personal" : "Personal", - "admin.category.original.item_list.ships" : "Ships", - "admin.category.original.item_list.shields" : "Shields", - "admin.category.original.item_list.weapons" : "Weapons", - "admin.category.original.hostile_list.all" : "All", - "admin.category.original.hostile_list.ground" : "Ground Units", - "admin.category.original.hostile_list.ships" : "Ships", - "admin.category.original.player_list.all" : "All", - "admin.category.original.player_list.members" : "Members", - "admin.category.original.player_list.moderators" : "Moderators", - "admin.category.original.player_list.admins" : "Admins", -"_comment_Core_Systems" : "", - "core_systems.category.original.person.helmet" : "Personal Helmet", - "core_systems.category.original.person.suit" : "Personal Suit", - "core_systems.category.original.person.gloves" : "Personal Gloves", - "core_systems.category.original.person.boots" : "Personal Boots", - "core_systems.category.original.person.accessory_1" : "Personal Accessory 1", - "core_systems.category.original.person.accessory_2" : "Personal Accessory 2", - "core_systems.category.original.person.accessory_3" : "Personal Accessory 3", - "core_systems.category.original.person.accessory_4" : "Personal Accessory 4", - "core_systems.category.original.person.weapon" : "Personal Weapon", - "core_systems.category.original.ship.hull" : "Ship Hull", - "core_systems.category.original.ship.shields" : "Ship Shield", - "core_systems.category.original.ship.engines" : "Ship Engine", - "core_systems.category.original.ship.weapon_1" : "Ship Weapon 1", - "core_systems.category.original.ship.weapon_2" : "Ship Weapon 2", - "core_systems.category.original.ship.thruster_1" : "Ship Thruster 1", - "core_systems.category.original.ship.thruster_2" : "Ship Thruster 2", - "core_systems.category.original.ship.thruster_3" : "Ship Thruster 3", - "core_systems.category.original.ship.thruster_4" : "Ship Thruster 4", -"_comment_Dungeons": "", - "dungeons.original.pirate.pirates_outpost": "Аванпост піратів", - "dungeons.original.pirate.pirates_outpost.desc": "Прихована станція постачання, що належить синдикату «Чорна Мітка».", - "dungeons.original.tutorial.tutorial": "Навчання", - "dungeons.original.tutorial.tutorial.desc": "Одноразове підземелля для освоєння азів.", -"_comment_Enemies": "", - "enemies.original.pirate.black_mark_heavy_cruiser": "Важкий крейсер «Чорної Мітки»", - "enemies.original.pirate.raider_frigate": "Фрегат рейдерів", - "enemies.original.pirate.snacher_clipper": "Snacher Clipper", - "enemies.original.pirate.corvid_corvette": "Corvid Corvette", - "enemies.original.pirate.scout_drone": "Дрон-розвідник", - "enemies.original.tutorial.tutorial_hostile": "Тренувальний ворог", - "enemies.original.tutorial.tutorial_boss_hostile": "Бос навчання", -"_comment_Equipment": "", - "items.materials.original.backpack_basic": "Базовий рюкзак", - "items.materials.original.backpack_basic.desc": "Основа вашого спорядження.", - "items.materials.original.backpack_advanced": "Покращений рюкзак", - "items.materials.original.backpack_advanced.desc": "Спроба використати більш досконалий костюм.", - "items.materials.original.backpack_elite": "Елітний рюкзак", - "items.materials.original.backpack_elite.desc": "Найкраще, що може запропонувати світ.", -"_comment_Materials": "", - "items.materials.original.bio.bio_pulp": "Біомаса", - "items.materials.original.bio.bio_pulp.desc": "Купа біологічного матеріалу.", - "items.materials.original.alloys.steel": "Сталевий злиток", - "items.materials.original.alloys.steel.desc": "Злиток високоміцної сталі.", - "items.materials.original.alloys.titanium_weave" : "titianium weave", - "items.materials.original.alloys.titanium_weave.desc" : "used where flexibility does not compromise strength", - "items.materials.original.alloys.neutronium_composite" :"Neutronium composite", - "items.materials.original.alloys.neutronium_composite.desc" :"A compostite of neutronium of", - "items.materials.original.alloys.superconductor" : "Superconductor", - "items.materials.original.alloys.superconductor.desc" : "A material with no resistance and expells all magnetic fields very usefull in high energy compnents", - "items.materials.original.alloys.chronotanium.desc" :"A chronite-titianium alloy for strong and energetic applications", - "items.materials.original.alloys.chronotanium" :"Chronotanium", - "items.materials.original.circuits.basic" : "Basic Circuit", - "items.materials.original.circuits.basic.desc" : "Basic electronics used in simple electromecanical systems. Probably made in someone's shed. Rated for common Tier systems.", - "items.materials.original.circuits.advanced" : "Advanced Circuit", - "items.materials.original.circuits.advanced.desc" : "Advanced electronics used in electromecanical systems, featuring transistors for compact switching. Made with industrial Machines. Rated for uncommon Tier systems.", - "items.materials.original.circuits.processing_unit" : "Processing unit", - "items.materials.original.circuits.processing_unit.desc" : "Highly Advanced electronics used in demanding systems, featuring Integrated circuts replacing entire boards. Made with precision UV lithography machines. Rated for Rare Tier systems.", - "items.materials.original.circuits.quantum_processor" : "Quantum Processor", - "items.materials.original.circuits.quantum_processor.desc" : "Increadably electronics used in complex systems, featuring quantum cores for unparalleled parallel computation. Made with . Rated for Epic Tier systems.", - "items.materials.original.circuits.ai_core" : "Ai Core", - "items.materials.original.circuits.ai_core.desc" : "A semi sapient general intelligence, featuring advanced reasoning skills and simulated simulations, it will never truly know if it is in another simulation. Made under incudulus supervison and adhears to strict laws. Warrrenty void if not reset every terran standerd season.", - "items.materials.original.crystal.flux" :"Flux crystal", - "items.materials.original.crystal.flux.desc" :"A crystal whose properties are in constant flux. Commenly used in high power electrical aplications", - "items.materials.original.crystal.flux_core" : "Flux Core", - "items.materials.original.crystal.flux_core.desc" : "The crystal tamed can nhow be used in more demanding applications", - "items.materials.original.crystal.void" :"Void crystal", - "items.materials.original.crystal.void.desc" :"A crystal that seems to sap the very light from the room. Commenly used in armor and stealth applications", - "items.materials.original.crystal.dimentional" : "Dimentonal crystal", - "items.materials.original.crystal.dimentional.desc" : "reality warps at its edges, imagine the possibilities", - "items.materials.original.crystal.neutronium" :"Neutronium", - "items.materials.original.crystal.neutronium.desc" :"A hyper dense piece of along dead star", - "items.materials.original.ingots.aluminum": "Алюмінієвий злиток", - "items.materials.original.ingots.aluminum.desc": "Легкий алюмінієвий злиток.", - "items.materials.original.ingots.chronite": "Хронітовий злиток", - "items.materials.original.ingots.chronite.desc": "Злиток рідкісного хроніту.", - "items.materials.original.ingots.copper": "Мідний злиток", - "items.materials.original.ingots.copper.desc": "Злиток чистої міді.", - "items.materials.original.ingots.gold": "Золотий злиток", - "items.materials.original.ingots.gold.desc": "Злиток щирого золота.", - "items.materials.original.ingots.iron": "Залізний злиток", - "items.materials.original.ingots.iron.desc": "Злиток переплавленого заліза.", - "items.materials.original.ingots.titanium": "Титановий злиток", - "items.materials.original.ingots.titanium.desc": "Надміцний титановий злиток.", - "items.materials.original.ingots.tungsten": "Вольфрамовий злиток", - "items.materials.original.ingots.tungsten.desc": "Тугоплавкий вольфрамовий злиток.", - "items.materials.original.ores.bauxite": "Бокситова руда", - "items.materials.original.ores.bauxite.desc": "Купа бокситової руди.", - "items.materials.original.ores.chronite": "Хромова руда", - "items.materials.original.ores.chronite.desc": "Купа хромової руди.", - "items.materials.original.ores.coal": "Вугілля", - "items.materials.original.ores.coal.desc": "Купа викопного вугілля.", - "items.materials.original.ores.copper": "Мідна руда", - "items.materials.original.ores.copper.desc": "Купа мідної руди.", - "items.materials.original.ores.gold": "Золота руда", - "items.materials.original.ores.gold.desc": "Купа золотоносної руди.", - "items.materials.original.ores.ilunite": "Ільменітова руда", - "items.materials.original.ores.ilunite.desc": "Купа ільменітової руди.", - "items.materials.original.ores.iron": "Залізна руда", - "items.materials.original.ores.iron.desc": "Купа залізної руди.", - "items.materials.original.ores.wolframite": "Вольфрамова руда", - "items.materials.original.ores.wolframite.desc": "Купа вольфрамової руди.", - "items.materials.original.plating.basic_ship_plating": "Корабельна обшивка", - "items.materials.original.plating.basic_ship_plating.desc": "Звичайна базова обшивка для суден.", -"_comment_Recipes": "", - "recipes.category.original.alloys": "Сплави", - "recipes.category.original.circuits": "Схеми", - "recipes.category.original.crystals" : "Crystals", - "recipes.category.original.food": "Їжа", - "recipes.category.original.forging": "Кування", - "recipes.category.original.hull_sections": "Секції корпусу", - "recipes.category.original.hulls": "Корпуси", - "recipes.category.original.organics": "Органіка", - "recipes.category.original.spacesuit_parts": "Деталі скафандра", -"_comment_Shop": "", - "shop.category.original.consumables" : "Consumables", - "shop.category.original.defence" : "Defence", - "shop.category.original.featured" : "Featured", - "shop.category.original.materials": "Матеріали", - "shop.category.original.premium" : "Premium", - "shop.category.original.ships" : "Ships", - "shop.category.original.weapons" : "Weapons", -"_comment_Skills": "", - "skills.category.original.combat": "Бойові навички", - "skills.category.original.combat.weapon_effiency": "Ефективність зброї", - "skills.category.original.combat.weapon_effiency.desc": "Час зробити наші гармати смертоноснішими!", - "skills.category.original.crafting": "Ремесло", - "skills.category.original.crafting.blacksmithing": "Ковальство", - "skills.category.original.crafting.blacksmithing.desc": "Виготовлення базових металевих виробів.", - "skills.category.original.crafting.alloying": "Створення сплавів", - "skills.category.original.crafting.alloying.desc": "Мистецтво поєднання металів.", - "skills.category.original.science": "Наука", - "skills.category.original.science.alien_technology": "Інопланетні технології", - "skills.category.original.science.alien_technology.desc": "Вивчення невідомих таємничих технологій.", - "skills.category.original.science.biology_engineering": "Біоінженерія", - "skills.category.original.science.biology_engineering.desc": "Можливо, нам вдасться розблокувати біотехнології?", -"_comment_Stats": "", - "stats.category.original.attack.base": "Атака", - "stats.category.original.attack.chance": "Шанс атаки", - "stats.category.original.attack.rating": "Рейтинг атаки", - "stats.category.original.defence.base": "Захист", - "stats.category.original.defence.chance": "Шанс захисту", - "stats.category.original.defence.rating": "Рейтинг захисту", - "stats.category.original.health": "Здоров'я", - "stats.category.original.penetration.base": "Пробиття", - "stats.category.original.penetration.chance": "Шанс пробиття", - "stats.category.original.penetration.rating": "Рейтинг пробиття", - "stats.category.original.reflect.base": "Відбиття", - "stats.category.original.reflect.chance": "Шанс відбиття", - "stats.category.original.reflect.rating": "Рейтинг відбиття", - "stats.category.original.resistance.base": "Опір", - "stats.category.original.resistance.cold": "Опір холоду", - "stats.category.original.resistance.gamma": "Гамма-резист", - "stats.category.original.resistance.heat": "Опір теплу", - "stats.category.original.resistance.ion": "Іонний опір", - "stats.category.original.resistance.physical": "Фізичний опір", - "stats.category.original.resistance.plasma": "Плазмовий опір", -"_comment_Tabs": "", - "category.tabs.original.admin_panel" : "Admin", - "category.tabs.original.crafting": "Крафт", - "category.tabs.original.dashboard": "Головна", - "category.tabs.original.dungeons": "Підземелля", - "category.tabs.original.inventory": "Інвентар", - "category.tabs.original.shop": "Магазин", - "category.tabs.original.skills": "Навички" -} diff --git a/game-server/datapacks/original/assets/textures/materials/alloy/chronotanium.png b/game-server/datapacks/original/assets/textures/materials/alloy/chronotanium.png deleted file mode 100644 index 8948848..0000000 Binary files a/game-server/datapacks/original/assets/textures/materials/alloy/chronotanium.png and /dev/null differ diff --git a/game-server/datapacks/original/assets/textures/materials/alloy/neutroniumcomposite.png b/game-server/datapacks/original/assets/textures/materials/alloy/neutroniumcomposite.png deleted file mode 100644 index abc9ff2..0000000 Binary files a/game-server/datapacks/original/assets/textures/materials/alloy/neutroniumcomposite.png and /dev/null differ diff --git a/game-server/datapacks/original/assets/textures/materials/alloy/steel.png b/game-server/datapacks/original/assets/textures/materials/alloy/steel.png deleted file mode 100644 index 831acf0..0000000 Binary files a/game-server/datapacks/original/assets/textures/materials/alloy/steel.png and /dev/null differ diff --git a/game-server/datapacks/original/assets/textures/materials/alloy/superconductorflux.png b/game-server/datapacks/original/assets/textures/materials/alloy/superconductorflux.png deleted file mode 100644 index f55807d..0000000 Binary files a/game-server/datapacks/original/assets/textures/materials/alloy/superconductorflux.png and /dev/null differ diff --git a/game-server/datapacks/original/assets/textures/materials/alloy/titaniumweave.png b/game-server/datapacks/original/assets/textures/materials/alloy/titaniumweave.png deleted file mode 100644 index 1f56f91..0000000 Binary files a/game-server/datapacks/original/assets/textures/materials/alloy/titaniumweave.png and /dev/null differ diff --git a/game-server/datapacks/original/assets/textures/materials/alloy/voidsteel.png b/game-server/datapacks/original/assets/textures/materials/alloy/voidsteel.png deleted file mode 100644 index 7b590b5..0000000 Binary files a/game-server/datapacks/original/assets/textures/materials/alloy/voidsteel.png and /dev/null differ diff --git a/game-server/datapacks/original/assets/textures/materials/circuits/advanced_circuit.png b/game-server/datapacks/original/assets/textures/materials/circuits/advanced_circuit.png deleted file mode 100644 index d006bee..0000000 Binary files a/game-server/datapacks/original/assets/textures/materials/circuits/advanced_circuit.png and /dev/null differ diff --git a/game-server/datapacks/original/assets/textures/materials/circuits/ai_core.gif b/game-server/datapacks/original/assets/textures/materials/circuits/ai_core.gif deleted file mode 100644 index ce8fa0c..0000000 Binary files a/game-server/datapacks/original/assets/textures/materials/circuits/ai_core.gif and /dev/null differ diff --git a/game-server/datapacks/original/assets/textures/materials/circuits/basic_circuit.png b/game-server/datapacks/original/assets/textures/materials/circuits/basic_circuit.png deleted file mode 100644 index 09baeaf..0000000 Binary files a/game-server/datapacks/original/assets/textures/materials/circuits/basic_circuit.png and /dev/null differ diff --git a/game-server/datapacks/original/assets/textures/materials/circuits/processing_unit.png b/game-server/datapacks/original/assets/textures/materials/circuits/processing_unit.png deleted file mode 100644 index 4931435..0000000 Binary files a/game-server/datapacks/original/assets/textures/materials/circuits/processing_unit.png and /dev/null differ diff --git a/game-server/datapacks/original/assets/textures/materials/circuits/quantum_processor.png b/game-server/datapacks/original/assets/textures/materials/circuits/quantum_processor.png deleted file mode 100644 index 1a8b199..0000000 Binary files a/game-server/datapacks/original/assets/textures/materials/circuits/quantum_processor.png and /dev/null differ diff --git a/game-server/datapacks/original/assets/textures/materials/crystal/dimentionalcrystal.gif b/game-server/datapacks/original/assets/textures/materials/crystal/dimentionalcrystal.gif deleted file mode 100644 index 9dfcbb5..0000000 Binary files a/game-server/datapacks/original/assets/textures/materials/crystal/dimentionalcrystal.gif and /dev/null differ diff --git a/game-server/datapacks/original/assets/textures/materials/crystal/fluxcore.gif b/game-server/datapacks/original/assets/textures/materials/crystal/fluxcore.gif deleted file mode 100644 index c858c7b..0000000 Binary files a/game-server/datapacks/original/assets/textures/materials/crystal/fluxcore.gif and /dev/null differ diff --git a/game-server/datapacks/original/assets/textures/materials/crystal/fluxcrystal.png b/game-server/datapacks/original/assets/textures/materials/crystal/fluxcrystal.png deleted file mode 100644 index 4a4cf9a..0000000 Binary files a/game-server/datapacks/original/assets/textures/materials/crystal/fluxcrystal.png and /dev/null differ diff --git a/game-server/datapacks/original/assets/textures/materials/crystal/neutronium.png b/game-server/datapacks/original/assets/textures/materials/crystal/neutronium.png deleted file mode 100644 index 0c10a14..0000000 Binary files a/game-server/datapacks/original/assets/textures/materials/crystal/neutronium.png and /dev/null differ diff --git a/game-server/datapacks/original/assets/textures/materials/crystal/voidcrystal.png b/game-server/datapacks/original/assets/textures/materials/crystal/voidcrystal.png deleted file mode 100644 index 3b1b160..0000000 Binary files a/game-server/datapacks/original/assets/textures/materials/crystal/voidcrystal.png and /dev/null differ diff --git a/game-server/datapacks/original/assets/textures/materials/ingot/aluminum.png b/game-server/datapacks/original/assets/textures/materials/ingot/aluminum.png deleted file mode 100644 index cdf5ec5..0000000 Binary files a/game-server/datapacks/original/assets/textures/materials/ingot/aluminum.png and /dev/null differ diff --git a/game-server/datapacks/original/assets/textures/materials/ingot/carbon.png b/game-server/datapacks/original/assets/textures/materials/ingot/carbon.png deleted file mode 100644 index d4f0ada..0000000 Binary files a/game-server/datapacks/original/assets/textures/materials/ingot/carbon.png and /dev/null differ diff --git a/game-server/datapacks/original/assets/textures/materials/ingot/chronite.png b/game-server/datapacks/original/assets/textures/materials/ingot/chronite.png deleted file mode 100644 index ef66bcc..0000000 Binary files a/game-server/datapacks/original/assets/textures/materials/ingot/chronite.png and /dev/null differ diff --git a/game-server/datapacks/original/assets/textures/materials/ingot/copper.png b/game-server/datapacks/original/assets/textures/materials/ingot/copper.png deleted file mode 100644 index eddc09d..0000000 Binary files a/game-server/datapacks/original/assets/textures/materials/ingot/copper.png and /dev/null differ diff --git a/game-server/datapacks/original/assets/textures/materials/ingot/gold.png b/game-server/datapacks/original/assets/textures/materials/ingot/gold.png deleted file mode 100644 index e0f71b6..0000000 Binary files a/game-server/datapacks/original/assets/textures/materials/ingot/gold.png and /dev/null differ diff --git a/game-server/datapacks/original/assets/textures/materials/ingot/iron.png b/game-server/datapacks/original/assets/textures/materials/ingot/iron.png deleted file mode 100644 index 9e755db..0000000 Binary files a/game-server/datapacks/original/assets/textures/materials/ingot/iron.png and /dev/null differ diff --git a/game-server/datapacks/original/assets/textures/materials/ingot/titanium.png b/game-server/datapacks/original/assets/textures/materials/ingot/titanium.png deleted file mode 100644 index 8ad579c..0000000 Binary files a/game-server/datapacks/original/assets/textures/materials/ingot/titanium.png and /dev/null differ diff --git a/game-server/datapacks/original/assets/textures/materials/ingot/tungsten.png b/game-server/datapacks/original/assets/textures/materials/ingot/tungsten.png deleted file mode 100644 index e42d6aa..0000000 Binary files a/game-server/datapacks/original/assets/textures/materials/ingot/tungsten.png and /dev/null differ diff --git a/game-server/datapacks/original/assets/textures/materials/ore/bauxite.png b/game-server/datapacks/original/assets/textures/materials/ore/bauxite.png deleted file mode 100644 index fdd34ec..0000000 Binary files a/game-server/datapacks/original/assets/textures/materials/ore/bauxite.png and /dev/null differ diff --git a/game-server/datapacks/original/assets/textures/materials/ore/chronite.png b/game-server/datapacks/original/assets/textures/materials/ore/chronite.png deleted file mode 100644 index a4c6125..0000000 Binary files a/game-server/datapacks/original/assets/textures/materials/ore/chronite.png and /dev/null differ diff --git a/game-server/datapacks/original/assets/textures/materials/ore/coal.png b/game-server/datapacks/original/assets/textures/materials/ore/coal.png deleted file mode 100644 index 927911f..0000000 Binary files a/game-server/datapacks/original/assets/textures/materials/ore/coal.png and /dev/null differ diff --git a/game-server/datapacks/original/assets/textures/materials/ore/copper.png b/game-server/datapacks/original/assets/textures/materials/ore/copper.png deleted file mode 100644 index e52b10b..0000000 Binary files a/game-server/datapacks/original/assets/textures/materials/ore/copper.png and /dev/null differ diff --git a/game-server/datapacks/original/assets/textures/materials/ore/gold.png b/game-server/datapacks/original/assets/textures/materials/ore/gold.png deleted file mode 100644 index 6b5a20d..0000000 Binary files a/game-server/datapacks/original/assets/textures/materials/ore/gold.png and /dev/null differ diff --git a/game-server/datapacks/original/assets/textures/materials/ore/ilmenite.png b/game-server/datapacks/original/assets/textures/materials/ore/ilmenite.png deleted file mode 100644 index c81b190..0000000 Binary files a/game-server/datapacks/original/assets/textures/materials/ore/ilmenite.png and /dev/null differ diff --git a/game-server/datapacks/original/assets/textures/materials/ore/iron.png b/game-server/datapacks/original/assets/textures/materials/ore/iron.png deleted file mode 100644 index 7c851d5..0000000 Binary files a/game-server/datapacks/original/assets/textures/materials/ore/iron.png and /dev/null differ diff --git a/game-server/datapacks/original/assets/textures/materials/ore/lead.png b/game-server/datapacks/original/assets/textures/materials/ore/lead.png deleted file mode 100644 index 52dddcf..0000000 Binary files a/game-server/datapacks/original/assets/textures/materials/ore/lead.png and /dev/null differ diff --git a/game-server/datapacks/original/assets/textures/materials/ore/silicon.png b/game-server/datapacks/original/assets/textures/materials/ore/silicon.png deleted file mode 100644 index 767aeb8..0000000 Binary files a/game-server/datapacks/original/assets/textures/materials/ore/silicon.png and /dev/null differ diff --git a/game-server/datapacks/original/assets/textures/materials/ore/uranium.png b/game-server/datapacks/original/assets/textures/materials/ore/uranium.png deleted file mode 100644 index 80105f1..0000000 Binary files a/game-server/datapacks/original/assets/textures/materials/ore/uranium.png and /dev/null differ diff --git a/game-server/datapacks/original/assets/textures/materials/ore/wolframite.png b/game-server/datapacks/original/assets/textures/materials/ore/wolframite.png deleted file mode 100644 index 74ed6e8..0000000 Binary files a/game-server/datapacks/original/assets/textures/materials/ore/wolframite.png and /dev/null differ diff --git a/game-server/datapacks/original/data/dungeons/pirates/pirates_outpost.json b/game-server/datapacks/original/data/dungeons/pirates/pirates_outpost.json deleted file mode 100644 index 7c25433..0000000 --- a/game-server/datapacks/original/data/dungeons/pirates/pirates_outpost.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "dungeon": { - "id": "original:pirate/pirate_outpost", - "displayName": "dungeons.original.pirate.pirates_outpost", - "description": "dungeons.original.pirate.pirates_outpost.desc", - "meta": { - "energyCost": 10, - "repeatable": true, - "missionArea":"ground", - "raid": false, "_comment_1":"Future raid type picking, when you can have friends in the dugeon to help you.", - "missionAllowed": [], "_comment_2":"Future ground type picking, when ground classes are started" - }, - "rooms": [ - { "id": "original:pirate/pirate_patrol_room" }, - { "id": "original:pirate/pirate_supply_bay" }, - { "id": "original:pirate/pirate_ambush_zone" }, - { "id": "original:pirate/pirate_boss_bridge" } - ] - } -} diff --git a/game-server/datapacks/original/data/dungeons/themed/kaleidoscope.json b/game-server/datapacks/original/data/dungeons/themed/kaleidoscope.json deleted file mode 100644 index 5be6251..0000000 --- a/game-server/datapacks/original/data/dungeons/themed/kaleidoscope.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "dungeon": { - "id": "original:Kaleidoscope", - "displayName": "dungeons.original.Kaleidoscope", - "description": "dungeons.original.Kaleidoscope.desc", - "meta": { - "energyCost": 0, - "repeatable": true, - "raid": false - }, - "rooms": [ - { - "id": "original:themed/the_rat_one" - }, - { - "id": "original:themed/cold" - }, - { - "id": "original:themed/heat_anomaly" - }, - { - "id": "original:themed/broken_reactor" - } - ] - } -} - diff --git a/game-server/datapacks/original/data/dungeons/tutorial/tutorial.json b/game-server/datapacks/original/data/dungeons/tutorial/tutorial.json deleted file mode 100644 index 4e81896..0000000 --- a/game-server/datapacks/original/data/dungeons/tutorial/tutorial.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "dungeon": { - "id": "original:tutorial/tutorial_dungeon", - "displayName": "dungeons.original.tutorial.tutorial", - "description": "dungeons.original.tutorial.tutorial.desc", - "meta": { - "energyCost": 0, - "repeatable": false, - "missionArea": "space", - "raid": false, - "_comment_1": "Future raid type picking, when you can have friends in the dugeon to help you.", - "missionAllowed": [], - "_comment_2": "Future ship type picking, when ship classes are started" - }, - "rooms": [ - { "id": "original:tutorial/tutorial_enemy_room" }, - { "id": "original:tutorial/tutorial_loot_room" }, - { "id": "original:tutorial/tutorial_boss_room" } - ] - } -} diff --git a/game-server/datapacks/original/data/enemies/hostiles/anomalies/electrical_anomaly.json b/game-server/datapacks/original/data/enemies/hostiles/anomalies/electrical_anomaly.json deleted file mode 100644 index 5d80a0c..0000000 --- a/game-server/datapacks/original/data/enemies/hostiles/anomalies/electrical_anomaly.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "hostile": { - "id": "original:anomalies/electrical_anomaly", - "displayName": "enemies.original.anomalies.electrical_anomaly", - "description": "enemies.original.anomalies.electrical_anomaly.desc", - "texture": "mypack/assets/textures/enemies/pirates/raider_frigate.png", - "stats": { - "health": 150, - "defense": 2, - "critical.chance": 0.15, - "attack.rate": 1, - "damage.base": 0, - "damage.cold": 0, - "damage.gamma": 0, - "damage.heat": 0, - "damage.ion": 6, - "damage.physical": 0, - "damage.plasma": 0, - "resistance.base": 0, - "resistance.cold": 0, - "resistance.gamma": 0, - "resistance.heat": 0, - "resistance.ion": 0.5, - "resistance.physical": -0.5, - "resistance.plasma": 0 - }, - "loot": [ - { - "id": "original:ore_copper", - "chance": 1, - "count": { - "min": 1, - "max": 3 - } - }, - { - "id": "original:ore_gold", - "chance": 0.7000000000000001, - "count": { - "min": 1, - "max": 1 - } - }, - { - "id": "original:crystal_flux", - "chance": 1, - "count": { - "min": 0, - "max": 2 - } - } - ], - "meta": {} - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/enemies/hostiles/anomalies/plasma_anomaly.json b/game-server/datapacks/original/data/enemies/hostiles/anomalies/plasma_anomaly.json deleted file mode 100644 index 846aa68..0000000 --- a/game-server/datapacks/original/data/enemies/hostiles/anomalies/plasma_anomaly.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "hostile": { - "id": "original:anomalies/plasma_anomaly", - "displayName": "enemies.original.anomalies.plasma_anomaly", - "description": "enemies.original.anomalies.plasma_anomaly.desc", - "texture": "mypack/assets/textures/enemies/pirates/raider_frigate.png", - "stats": { - "health": 150, - "defense": 2, - "critical.chance": 0.15, - "attack.rate": 1, - "damage.base": 0, - "damage.cold": 0, - "damage.gamma": 0, - "damage.heat": 0, - "damage.ion": 0, - "damage.physical": 0, - "damage.plasma": 6, - "resistance.base": 0, - "resistance.cold": -0.5, - "resistance.gamma": 0.25, - "resistance.heat": 0.25, - "resistance.ion": 0, - "resistance.physical": 0, - "resistance.plasma": 0.5 - }, - "loot": [ - { - "id": "original:crystal_flux", - "chance": 1, - "count": { - "min": 1, - "max": 2 - } - }, - { - "id": "original:crystal_flux_core", - "chance": 0.1, - "count": { - "min": 1, - "max": 1 - } - } - ], - "meta": {} - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/enemies/hostiles/creatures/fire_fiend.json b/game-server/datapacks/original/data/enemies/hostiles/creatures/fire_fiend.json deleted file mode 100644 index bb01bf0..0000000 --- a/game-server/datapacks/original/data/enemies/hostiles/creatures/fire_fiend.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "hostile": { - "id": "original:creatures/fire_fiend", - "displayName": "enemies.original.creatures.fire_fiend", - "description": "enemies.original.creatures.fire_fiend.desc", - "texture": "mypack/assets/textures/enemies/pirates/raider_frigate.png", - "stats": { - "health": 150, - "defense": 2, - "critical.chance": 0.15, - "attack.rate": 1, - "damage.base": 0, - "damage.cold": 0, - "damage.gamma": 0, - "damage.heat": 6, - "damage.ion": 0, - "damage.physical": 0, - "damage.plasma": 0, - "resistance.base": 0, - "resistance.cold": -0.5, - "resistance.gamma": 0, - "resistance.heat": 0.5, - "resistance.ion": 0, - "resistance.physical": 0, - "resistance.plasma": 0 - }, - "loot": [ - { - "id": "original:ore_coal", - "chance": 1, - "count": { - "min": 1, - "max": 10 - } - }, - { - "id": "original:ingot_carbon", - "chance": 0.25, - "count": { - "min": 1, - "max": 1 - } - } - ], - "meta": {} - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/enemies/hostiles/creatures/frost_fiend.json b/game-server/datapacks/original/data/enemies/hostiles/creatures/frost_fiend.json deleted file mode 100644 index bc98ddd..0000000 --- a/game-server/datapacks/original/data/enemies/hostiles/creatures/frost_fiend.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "hostile": { - "id": "original:creatures/frost_fiend", - "displayName": "enemies.original.creatures.frost_fiend", - "description": "enemies.original.creatures.frost_fiend.desc", - "texture": "mypack/assets/textures/enemies/pirates/raider_frigate.png", - "stats": { - "health": 150, - "defense": 2, - "critical.chance": 0.15, - "attack.rate": 1, - "damage.base": 0, - "damage.cold": 6, - "damage.gamma": 0, - "damage.heat": 0, - "damage.ion": 0, - "damage.physical": 0, - "damage.plasma": 0, - "resistance.base": 0, - "resistance.cold": 0.5, - "resistance.gamma": 0, - "resistance.heat": -0.5, - "resistance.ion": 0, - "resistance.physical": 0, - "resistance.plasma": -0.25 - }, - "loot": [ - { - "id": "original:ore_copper", - "chance": 1, - "count": { - "min": 1, - "max": 3 - } - }, - { - "id": "original:ore_ilunite", - "chance": 0.5, - "count": { - "min": 1, - "max": 1 - } - } - ], - "meta": {} - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/enemies/hostiles/creatures/gamma_fiend.json b/game-server/datapacks/original/data/enemies/hostiles/creatures/gamma_fiend.json deleted file mode 100644 index c7f911d..0000000 --- a/game-server/datapacks/original/data/enemies/hostiles/creatures/gamma_fiend.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "hostile": { - "id": "original:creatures/gamma_fiend", - "displayName": "enemies.original.creatures.gamma_fiend", - "description": "enemies.original.creatures.gamma_fiend.desc", - "texture": "mypack/assets/textures/enemies/pirates/raider_frigate.png", - "stats": { - "health": 150, - "defense": 2, - "critical.chance": 0.15, - "attack.rate": 1, - "damage.base": 0, - "damage.cold": 0, - "damage.gamma": 6, - "damage.heat": 0, - "damage.ion": 0, - "damage.physical": 0, - "damage.plasma": 0, - "resistance.base": 0, - "resistance.cold": 0, - "resistance.gamma": 0.5, - "resistance.heat": -0.25, - "resistance.ion": 0, - "resistance.physical": -0.25, - "resistance.plasma": 0 - }, - "loot": [ - { - "id": "original:crystal_void", - "chance": 0.75, - "count": { - "min": 1, - "max": 2 - } - }, - { - "id": "original:crystal_flux", - "chance": 0.25, - "count": { - "min": 1, - "max": 1 - } - } - ], - "meta": {} - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/enemies/hostiles/creatures/not_a_giant_rat.json b/game-server/datapacks/original/data/enemies/hostiles/creatures/not_a_giant_rat.json deleted file mode 100644 index e272d01..0000000 --- a/game-server/datapacks/original/data/enemies/hostiles/creatures/not_a_giant_rat.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "hostile": { - "id": "original:creatures/not_a_giant_rat", - "displayName": "enemies.original.creatures.not_a_giant_rat", - "description": "enemies.original.creatures.not_a_giant_rat.desc", - "texture": "mypack/assets/textures/enemies/pirates/raider_frigate.png", - "stats": { - "health": 150, - "defense": 2, - "critical.chance": 0.15, - "attack.rate": 1, - "damage.base": 0, - "damage.cold": 0, - "damage.gamma": 0, - "damage.heat": 0, - "damage.ion": 0, - "damage.physical": 6, - "damage.plasma": 0, - "resistance.base": 0, - "resistance.cold": 0, - "resistance.gamma": 0.25, - "resistance.heat": -0.5, - "resistance.ion": 0, - "resistance.physical": 0.5, - "resistance.plasma": 0 - }, - "loot": [ - { - "id": "original:ore_iron", - "chance": 1, - "count": { - "min": 0, - "max": 3 - } - }, - { - "id": "original:ore_copper", - "chance": 1, - "count": { - "min": 0, - "max": 3 - } - } - ], - "meta": {} - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/enemies/hostiles/pirates/black_mark_cruiser.json b/game-server/datapacks/original/data/enemies/hostiles/pirates/black_mark_cruiser.json deleted file mode 100644 index bc82500..0000000 --- a/game-server/datapacks/original/data/enemies/hostiles/pirates/black_mark_cruiser.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "hostile": { - "id": "original:pirates/black_mark_cruiser", - "displayName": "enemies.original.pirate.black_mark_heavy_cruiser", - "description": "enemies.original.pirate.black_mark_heavy_cruiser.desc", - "texture": "original/assets/textures/enemies/pirates/black_mark_cruiser.png", - "stats": { - "health": 850, - "defense": 5, - "critical.chance": 0.15, - "attack.rate": 0.6, - "damage.base": 8, - "damage.cold": 0, - "damage.gamma": 0, - "damage.heat": 0, - "damage.ion": 0, - "damage.physical": 10, - "damage.plasma": 0, - "resistance.base": 0.1, - "resistance.cold": 0, - "resistance.gamma": 0, - "resistance.heat": 0, - "resistance.ion": 0, - "resistance.physical": 0, - "resistance.plasma": 0 - }, - "loot": [ - { - "id": "original:circuit_basic", - "chance": 1, - "count": { - "min": 1, - "max": 2 - } - }, - { - "id": "original:ore_wolframite", - "chance": 0.1, - "count": { - "min": 1, - "max": 1 - } - }, - { - "id": "original:ore_ilunite", - "chance": 0.1, - "count": { - "min": 1, - "max": 1 - } - }, - { - "id": "original:ingot_gold", - "chance": 0.5, - "count": { - "min": 1, - "max": 2 - } - }, - { - "id": "original:ore_gold", - "chance": 1, - "count": { - "min": 1, - "max": 2 - } - } - ], - "meta": {} - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/enemies/hostiles/pirates/corvid_corvette.json b/game-server/datapacks/original/data/enemies/hostiles/pirates/corvid_corvette.json deleted file mode 100644 index beca6fd..0000000 --- a/game-server/datapacks/original/data/enemies/hostiles/pirates/corvid_corvette.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "hostile": { - "id": "original:pirates/corvid_corvette", - "displayName": "enemies.original.pirate.corvid_corvette", - "description": "enemies.original.pirate.corvid_corvette.desc", - "texture": "original/assets/textures/enemies/pirates/corvid_corvette.png", - "stats": { - "health": 100, - "defense": 1, - "critical.chance": 0.1, - "attack.rate": 1, - "damage.base": 2, - "damage.cold": 0, - "damage.gamma": 0, - "damage.heat": 0, - "damage.ion": 0, - "damage.physical": 0, - "damage.plasma": 6, - "resistance.base": 0.2, - "resistance.cold": 0, - "resistance.gamma": 0, - "resistance.heat": 0, - "resistance.ion": 0.1, - "resistance.physical": 0, - "resistance.plasma": 0.1 - }, - "loot": [], - "meta": {} - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/enemies/hostiles/pirates/raider_frigate.json b/game-server/datapacks/original/data/enemies/hostiles/pirates/raider_frigate.json deleted file mode 100644 index eb3b069..0000000 --- a/game-server/datapacks/original/data/enemies/hostiles/pirates/raider_frigate.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "hostile": { - "id": "original:pirates/raider_frigate", - "displayName": "enemies.original.pirate.raider_frigate", - "description": "enemies.original.pirate.raider_frigate.desc", - "texture": "original/assets/textures/enemies/pirates/raider_frigate.png", - "stats": { - "health": 210, - "defense": 1.5, - "critical.chance": 0.2, - "attack.rate": 1, - "damage.base": 0, - "damage.cold": 0, - "damage.gamma": 0, - "damage.heat": 0, - "damage.ion": 0, - "damage.physical": 8, - "damage.plasma": 0, - "resistance.base": 0, - "resistance.cold": 0, - "resistance.gamma": 0, - "resistance.heat": 0, - "resistance.ion": 0, - "resistance.physical": 0, - "resistance.plasma": 0 - }, - "loot": [ - { - "id": "original:ore_iron", - "chance": 1, - "count": { - "min": 1, - "max": 2 - } - }, - { - "id": "original:circuit_basic", - "chance": 0.5, - "count": { - "min": 1, - "max": 1 - } - } - ], - "meta": {} - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/enemies/hostiles/pirates/scout_drone.json b/game-server/datapacks/original/data/enemies/hostiles/pirates/scout_drone.json deleted file mode 100644 index 98cc297..0000000 --- a/game-server/datapacks/original/data/enemies/hostiles/pirates/scout_drone.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "hostile": { - "id": "original:pirates/scout_drone", - "displayName": "enemies.original.pirate.scout_drone", - "description": "enemies.original.pirate.scout_drone.desc", - "texture": "original/assets/textures/enemies/pirates/scout_drone.png", - "stats": { - "health": 25, - "defense": 0, - "critical.chance": 0.1, - "attack.rate": 1, - "damage.base": 1, - "damage.cold": 0, - "damage.gamma": 0, - "damage.heat": 0, - "damage.ion": 2, - "damage.physical": 0, - "damage.plasma": 0, - "resistance.base": 0, - "resistance.cold": 0, - "resistance.gamma": 0, - "resistance.heat": 0, - "resistance.ion": 0, - "resistance.physical": 0, - "resistance.plasma": 0 - }, - "loot": [ - { - "id": "original:ore_iron", - "chance": 0.5, - "count": { - "min": 1, - "max": 1 - } - } - ], - "meta": {} - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/enemies/hostiles/pirates/snacher_clipper.json b/game-server/datapacks/original/data/enemies/hostiles/pirates/snacher_clipper.json deleted file mode 100644 index f62c80d..0000000 --- a/game-server/datapacks/original/data/enemies/hostiles/pirates/snacher_clipper.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "hostile": { - "id": "original:pirates/snacher_clipper", - "displayName": "enemies.original.pirate.snacher_clipper", - "description": "enemies.original.pirate.snacher_clipper.desc", - "texture": "original/assets/textures/enemies/pirates/snacher_clipper.png", - "stats": { - "health": 100, - "defense": 5, - "critical.chance": 0.5, - "attack.rate": 3, - "damage.base": 0, - "damage.cold": 0, - "damage.gamma": 0, - "damage.heat": 0, - "damage.ion": 0, - "damage.physical": 5, - "damage.plasma": 0, - "resistance.base": 0, - "resistance.cold": 0, - "resistance.gamma": 0, - "resistance.heat": -0.1, - "resistance.ion": -0.25, - "resistance.physical": 0, - "resistance.plasma": 0 - }, - "loot": [ - { - "id": "original:Big_ship_thruster", - "chance": 0.25, - "count": { - "min": 1, - "max": 1 - } - }, - { - "id": "original:ore_copper", - "chance": 1, - "count": { - "min": 1, - "max": 2 - } - } - ], - "meta": {} - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/enemies/hostiles/tutorial/tutorial_boss_hostile.json b/game-server/datapacks/original/data/enemies/hostiles/tutorial/tutorial_boss_hostile.json deleted file mode 100644 index c19ec9c..0000000 --- a/game-server/datapacks/original/data/enemies/hostiles/tutorial/tutorial_boss_hostile.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "hostile": { - "id": "original:tutorial/tutorial_boss_hostile", - "displayName": "enemies.original.tutorial.tutorial_boss_hostile", - "stats": { - "health": 60, - "defense": 1.3, - "damage": 4, - "critical.chance": 0.3, - "attack.rate": 2 - }, - "loot": [ - { - "id": "original:ore_coal", - "chance": 1.0, - "count": 50 - }, - { - "id": "original:ore_copper", - "chance": 1.0, - "count": 20 - } - ], - "meta": {} - } -} diff --git a/game-server/datapacks/original/data/enemies/hostiles/tutorial/tutorial_hostile.json b/game-server/datapacks/original/data/enemies/hostiles/tutorial/tutorial_hostile.json deleted file mode 100644 index 911c1ef..0000000 --- a/game-server/datapacks/original/data/enemies/hostiles/tutorial/tutorial_hostile.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "hostile": { - "id": "original:tutorial/tutorial_hostile", - "displayName": "enemies.original.tutorial.tutorial_hostile", - "stats": { - "health": 30, - "defense": 0.0, - "damage": 2, - "critical.chance": 0.0, - "attack.rate": 1 - }, - "loot": [ - { - "id": "original:ingot_iron", - "chance": 0.8, - "count": { - "min": 1, - "max": 2 - } - } - ], - "meta": {} - } -} diff --git a/game-server/datapacks/original/data/enemies/rooms/pirates/pirate_ambush_zone.json b/game-server/datapacks/original/data/enemies/rooms/pirates/pirate_ambush_zone.json deleted file mode 100644 index e020d8a..0000000 --- a/game-server/datapacks/original/data/enemies/rooms/pirates/pirate_ambush_zone.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "rooms": { - "id": "original:pirate/pirate_ambush_zone", - "hostiles": [ - "original:pirates/scout_drone", - "original:pirates/raider_frigate", - "original:pirates/raider_frigate" - ], - "gainXp": 25, - "credits": 400 - } -} diff --git a/game-server/datapacks/original/data/enemies/rooms/pirates/pirate_boss_bridge.json b/game-server/datapacks/original/data/enemies/rooms/pirates/pirate_boss_bridge.json deleted file mode 100644 index 2c9e294..0000000 --- a/game-server/datapacks/original/data/enemies/rooms/pirates/pirate_boss_bridge.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "rooms": { - "id": "original:pirate/pirate_boss_bridge", - "hostiles": ["original:pirates/black_mark_cruiser"], - "gainXp": 100, - "credits": 2500 - } -} diff --git a/game-server/datapacks/original/data/enemies/rooms/pirates/pirate_patrol_room.json b/game-server/datapacks/original/data/enemies/rooms/pirates/pirate_patrol_room.json deleted file mode 100644 index cda0c2e..0000000 --- a/game-server/datapacks/original/data/enemies/rooms/pirates/pirate_patrol_room.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "rooms": { - "id": "original:pirate/pirate_patrol_room", - "hostiles": [ - "original:pirates/scout_drone", - "original:pirates/scout_drone" - ], - "gainXp": 8, - "credits": 120 - } -} diff --git a/game-server/datapacks/original/data/enemies/rooms/pirates/pirate_supply_bay.json b/game-server/datapacks/original/data/enemies/rooms/pirates/pirate_supply_bay.json deleted file mode 100644 index 6171c9e..0000000 --- a/game-server/datapacks/original/data/enemies/rooms/pirates/pirate_supply_bay.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "rooms": { - "id": "original:pirate/pirate_supply_bay", - "hostiles": [], - "gainXp": 5, - "credits": 800, - "description": "You found a hidden cargo container filled with stolen tech." - } -} diff --git a/game-server/datapacks/original/data/enemies/rooms/themed/broken_reactor.json b/game-server/datapacks/original/data/enemies/rooms/themed/broken_reactor.json deleted file mode 100644 index bf576d2..0000000 --- a/game-server/datapacks/original/data/enemies/rooms/themed/broken_reactor.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "rooms": { - "id": "original:themed/broken_reactor", - "displayName": "rooms.original.themed.broken_reactor", - "description": "rooms.original.themed.broken_reactor.desc", - "hostiles": [ - "original:anomalies/electrical_anomaly", - "original:creatures/gamma_fiend", - "original:anomalies/electrical_anomaly", - "original:creatures/gamma_fiend" - ], - "gainXp": 145, - "credits": 1000, - "loot": [ - { - "id": "original:rtg", - "chance": 0.66, - "count": { - "min": 1, - "max": 1 - } - }, - { - "id": "original:gen2_fission_reactor", - "chance": 0.33, - "count": { - "min": 1, - "max": 1 - } - }, - { - "id": "original:alloy_superconductor", - "chance": 0.2, - "count": { - "min": 1, - "max": 1 - } - } - ], - "meta": { - "isBossRoom": true - } - } -} - diff --git a/game-server/datapacks/original/data/enemies/rooms/themed/cold.json b/game-server/datapacks/original/data/enemies/rooms/themed/cold.json deleted file mode 100644 index abd14aa..0000000 --- a/game-server/datapacks/original/data/enemies/rooms/themed/cold.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "rooms": { - "id": "original:themed/cold", - "displayName": "rooms.original.themed.cold", - "description": "rooms.original.themed.cold.desc", - "hostiles": [ - "original:creatures/frost_fiend", - "original:creatures/frost_fiend" - ], - "gainXp": 69, - "credits": 420, - "loot": [], - "meta": { - "isBossRoom": false - } - } -} - diff --git a/game-server/datapacks/original/data/enemies/rooms/themed/heat_anomaly.json b/game-server/datapacks/original/data/enemies/rooms/themed/heat_anomaly.json deleted file mode 100644 index 6178172..0000000 --- a/game-server/datapacks/original/data/enemies/rooms/themed/heat_anomaly.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "rooms": { - "id": "original:themed/heat_anomaly", - "displayName": "rooms.original.themed.heat_anomaly", - "description": "rooms.original.themed.heat_anomaly.desc", - "hostiles": [ - "original:anomalies/plasma_anomaly", - "original:creatures/fire_fiend", - "original:creatures/fire_fiend" - ], - "gainXp": 25, - "credits": 400, - "loot": [], - "meta": { - "isBossRoom": false - } - } -} - diff --git a/game-server/datapacks/original/data/enemies/rooms/themed/the_rat_one.json b/game-server/datapacks/original/data/enemies/rooms/themed/the_rat_one.json deleted file mode 100644 index aa5ae94..0000000 --- a/game-server/datapacks/original/data/enemies/rooms/themed/the_rat_one.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "rooms": { - "id": "original:themed/the_rat_one", - "displayName": "rooms.original.themed.the_rat_one", - "description": "rooms.original.themed.the_rat_one.desc", - "hostiles": [ - "original:creatures/not_a_giant_rat", - "original:creatures/not_a_giant_rat", - "original:creatures/not_a_giant_rat" - ], - "gainXp": 69, - "credits": 420, - "loot": [ - { - "id": "original:crystal_void", - "chance": 1, - "count": { - "min": 0, - "max": 1 - } - } - ], - "meta": { - "isBossRoom": false - } - } -} - diff --git a/game-server/datapacks/original/data/enemies/rooms/tutorial/tutorial_boss.json b/game-server/datapacks/original/data/enemies/rooms/tutorial/tutorial_boss.json deleted file mode 100644 index dcb1b2d..0000000 --- a/game-server/datapacks/original/data/enemies/rooms/tutorial/tutorial_boss.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "rooms": { - "id": "original:tutorial/tutorial_boss_room", - "displayName": "rooms.original.tutorial.tutorial_boss_room.name", - "description": "rooms.original.tutorial.tutorial_boss_room.desc", - "hostiles": ["original:tutorial/tutorial_boss_hostile"], - "gainXp": 4, - "credits": 200, - "loot": [], - "meta": { - "isBossRoom": true - } - } -} diff --git a/game-server/datapacks/original/data/enemies/rooms/tutorial/tutorial_enemy_room.json b/game-server/datapacks/original/data/enemies/rooms/tutorial/tutorial_enemy_room.json deleted file mode 100644 index af8b759..0000000 --- a/game-server/datapacks/original/data/enemies/rooms/tutorial/tutorial_enemy_room.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "rooms": { - "id": "original:tutorial/tutorial_enemy_room", - "displayName": "rooms.original.tutorial.tutorial_enemy_room.name", - "description": "rooms.original.tutorial.tutorial_enemy_room.desc", - "hostiles": [ - "original:tutorial/tutorial_hostile", - "original:tutorial/tutorial_hostile" - ], - "gainXp": 3, - "credits": 30, - "loot": [], - "meta": { - "isBossRoom": false - } - } -} diff --git a/game-server/datapacks/original/data/enemies/rooms/tutorial/tutorial_loot_room.json b/game-server/datapacks/original/data/enemies/rooms/tutorial/tutorial_loot_room.json deleted file mode 100644 index 6a7812b..0000000 --- a/game-server/datapacks/original/data/enemies/rooms/tutorial/tutorial_loot_room.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "rooms": { - "id": "original:tutorial/tutorial_loot_room", - "displayName": "rooms.original.tutorial.tutorial_loot_room.name", - "description": "rooms.original.tutorial.tutorial_loot_room.desc", - "hostiles": [], - "gainXp": 0, - "credits": 0, - "loot": [ - { - "id": "original:bio_pulp", - "chance": 1.0, - "count": 1 - } - ], - "meta": { - "isBossRoom": false - } - } -} diff --git a/game-server/datapacks/original/data/items/equipment/personal/accessory/basic_accessory.json b/game-server/datapacks/original/data/items/equipment/personal/accessory/basic_accessory.json deleted file mode 100644 index 4f4667b..0000000 --- a/game-server/datapacks/original/data/items/equipment/personal/accessory/basic_accessory.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "plating": { - "id": "original:basic_personal_accessory", - "displayName": "items.materials.original.personal.accessory.basic_personal_accessory", - "description": "items.materials.original.personal.accessory.basic_personal_accessory.desc", - "texture": "original/assets/textures/equipement/personal/accessory/basic_accessory.png", - "stats": { - "health": 2.25 - }, - "meta": { - "rarity": "common", - "equipmentSlot": [ - "original:personal_accessory_1", - "original:personal_accessory_2", - "original:personal_accessory_3", - "original:personal_accessory_4" - ], - "storeCategory": "original:personal_equipment", - "dungeon": "ground" - } - } -} diff --git a/game-server/datapacks/original/data/items/equipment/personal/backpack/basic_backpack.json b/game-server/datapacks/original/data/items/equipment/personal/backpack/basic_backpack.json deleted file mode 100644 index ef64db6..0000000 --- a/game-server/datapacks/original/data/items/equipment/personal/backpack/basic_backpack.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "armour": { - "id": "original:basic_personal_backpack", - "displayName": "items.materials.original.personal.backpack.basic_personal_backpack", - "description": "items.materials.original.personal.backpack.basic_personal_backpack.desc", - "texture": "original/assets/textures/equipement/personal/backpacks/backpack_basic.png", - "stats": { - "health": 20, - "carry.capacity": 10, - "resistance.base": 0.125, - "defence.rating": 0.125 - }, - "meta": { - "rarity": "common", - "equipmentSlot": "original:personal_backpack", - "storeCategory": "original:personal_equipment", - "dungeon": "ground" - } - } -} diff --git a/game-server/datapacks/original/data/items/equipment/personal/backpack/personal_shield.json b/game-server/datapacks/original/data/items/equipment/personal/backpack/personal_shield.json deleted file mode 100644 index da8d3bb..0000000 --- a/game-server/datapacks/original/data/items/equipment/personal/backpack/personal_shield.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "plating": { - "id": "original:personal_shield", - "displayName": "items.materials.original.personal.backpack.personal_shield", - "description": "items.materials.original.personal.backpack.personal_shield.desc", - "texture": "original/assets/textures/equipement/personal/backpacks/personal_shield.png", - "stats": { - "health": 35, - "reflect.chance": 0.1, - "resistance.base": 0.1 - }, - "meta": { - "rarity": "uncommon", - "equipmentSlot": "original:personal_backpack", - "storeCategory": "original:personal_equipment", - "dungeon": "ground" - } - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/items/equipment/personal/boots/basic_boots.json b/game-server/datapacks/original/data/items/equipment/personal/boots/basic_boots.json deleted file mode 100644 index 5de8a6f..0000000 --- a/game-server/datapacks/original/data/items/equipment/personal/boots/basic_boots.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "plating": { - "id": "original:basic_personal_boots", - "displayName": "items.materials.original.personal.armor.boots.basic_personal_boots", - "description": "items.materials.original.personal.armor.boots.basic_personal_boots.desc", - "texture": "original/assets/textures/equipment/personal/armor/boots/basic_boots.png", - "stats": { - "health": 5, - "resistance.base": 0.1, - "defence.rating": 1.3, - "reflect.chance": 0.1 - }, - "meta": { - "rarity": "common", - "equipmentSlot": "original:personal_boots", - "storeCategory": "original:personal", - "dungeon": "ground" - } - } -} diff --git a/game-server/datapacks/original/data/items/equipment/personal/gloves/basic_gloves.json b/game-server/datapacks/original/data/items/equipment/personal/gloves/basic_gloves.json deleted file mode 100644 index 0ee305b..0000000 --- a/game-server/datapacks/original/data/items/equipment/personal/gloves/basic_gloves.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "plating": { - "id": "original:basic_personal_gloves", - "displayName": "items.materials.original.personal.armor.gloves.basic_personal_gloves", - "description": "items.materials.original.personal.armor.gloves.basic_personal_gloves.desc", - "texture": "original/assets/textures/equipment/personal/armor/gloves/basic_gloves.png", - "stats": { - "health": 5, - "resistance.base": 0.1, - "defence.rating": 1.3, - "reflect.chance": 0.1 - }, - "meta": { - "rarity": "common", - "equipmentSlot": "original:personal_gloves", - "storeCategory": "original:personal", - "dungeon": "ground" - } - } -} diff --git a/game-server/datapacks/original/data/items/equipment/personal/suit/basic_suit.json b/game-server/datapacks/original/data/items/equipment/personal/suit/basic_suit.json deleted file mode 100644 index f03afab..0000000 --- a/game-server/datapacks/original/data/items/equipment/personal/suit/basic_suit.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "plating": { - "id": "original:basic_personal_suit", - "displayName": "items.materials.original.personal.suit.basic_personal_suit", - "description": "items.materials.original.personal.suit.basic_personal_suit.desc", - "texture": "original/assets/textures/equipment/personal/armor/suit/basic_suit.png", - "stats": { - "health": 15, - "resistance.base": 0.125, - "defence.rating": 0.9, - "reflect.chance": 0.0125 - }, - "meta": { - "rarity": "common", - "equipmentSlot": "original:personal_suit", - "storeCategory": "original:personal", - "dungeon": "ground" - } - } -} diff --git a/game-server/datapacks/original/data/items/equipment/personal/weapons/basic_weapon.json b/game-server/datapacks/original/data/items/equipment/personal/weapons/basic_weapon.json deleted file mode 100644 index 4c8f569..0000000 --- a/game-server/datapacks/original/data/items/equipment/personal/weapons/basic_weapon.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "weapons": { - "id": "original:basic_personal_weapon", - "displayName": "items.materials.original.personal.weapon.basic_personal_weapon", - "description": "items.materials.original.personal.weapon.basic_personal_weapon.desc", - "texture": "original/assets/textures/equipment/personal/weapon/basic_weapon.png", - "stats": { - "attack.base": 20 - }, - "meta": { - "rarity": "common", - "equipmentSlot": "original:personal_weapons", - "storeCategory": "original:personal", - "dungeon": "ground" - } - } -} diff --git a/game-server/datapacks/original/data/items/equipment/ship/engines/basic_ship_engines.json b/game-server/datapacks/original/data/items/equipment/ship/engines/basic_ship_engines.json deleted file mode 100644 index 4cecb74..0000000 --- a/game-server/datapacks/original/data/items/equipment/ship/engines/basic_ship_engines.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "plating": { - "id": "original:basic_ship_engines", - "displayName": "items.materials.original.ship.engine.basic_ship_engines", - "description": "items.materials.original.ship.engine.basic_ship_engines.desc", - "texture": "original/assets/textures/equipement/ship/engines/basic_ship_enignes.png", - "stats": { - "health": 20, - "power": 10 - }, - "meta": { - "rarity": "common", - "equipmentSlot": "original:ship_engines", - "storeCategory": "original:ship_equipment", - "dungeon": "space" - } - } -} diff --git a/game-server/datapacks/original/data/items/equipment/ship/engines/gen1_fission_reactor.json b/game-server/datapacks/original/data/items/equipment/ship/engines/gen1_fission_reactor.json deleted file mode 100644 index 0febc10..0000000 --- a/game-server/datapacks/original/data/items/equipment/ship/engines/gen1_fission_reactor.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "plating": { - "id": "original:gen1_fission_reactor", - "displayName": "items.materials.original.ship.engine.gen1_fission_reactor", - "description": "items.materials.original.ship.engine.gen1_fission_reactor.desc", - "texture": "original/assets/textures/equipement/ship/engines/gen1_fission_reactor.png", - "stats": { - "health": 30, - "power": 30 - - }, - "meta": { - "rarity": "common", - "equipmentSlot": "original:ship_engines", - "storeCategory": "original:ship_equipment", - "dungeon": "space" - } - } -} diff --git a/game-server/datapacks/original/data/items/equipment/ship/engines/gen2_fission_reactor.json b/game-server/datapacks/original/data/items/equipment/ship/engines/gen2_fission_reactor.json deleted file mode 100644 index e6d40ca..0000000 --- a/game-server/datapacks/original/data/items/equipment/ship/engines/gen2_fission_reactor.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "plating": { - "id": "original:gen2_fission_reactor", - "displayName": "items.materials.original.ship.engine.gen2_fission_reactor", - "description": "items.materials.original.ship.engine.gen2_fission_reactor.desc", - "texture": "original/assets/textures/equipement/ship/engines/gen2_fission_reactor.png", - "stats": { - "health": 30, - "power": 50, - "defence.rating": -0.1, - "resistance.base": -0.1 - }, - "meta": { - "rarity": "uncommon", - "equipmentSlot": "original:ship_engines", - "storeCategory": "original:ship_equipment", - "dungeon": "space" - } - } -} diff --git a/game-server/datapacks/original/data/items/equipment/ship/engines/gen3_fission_reactor.json b/game-server/datapacks/original/data/items/equipment/ship/engines/gen3_fission_reactor.json deleted file mode 100644 index 682b58d..0000000 --- a/game-server/datapacks/original/data/items/equipment/ship/engines/gen3_fission_reactor.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "plating": { - "id": "original:gen3_fission_reactor", - "displayName": "items.materials.original.ship.engine.gen3_fission_reactor", - "description": "items.materials.original.ship.engine.gen3_fission_reactor.desc", - "texture": "original/assets/textures/equipement/ship/engines/gen3_fission_reactor.png", - "stats": { - "health": 40, - "power": 60, - "defence.rating": 0.1, - "resistance.base": 0.05 - }, - "meta": { - "rarity": "rare", - "equipmentSlot": "original:ship_engines", - "storeCategory": "original:ship_equipment", - "dungeon": "space" - } - } -} diff --git a/game-server/datapacks/original/data/items/equipment/ship/engines/rtg.json b/game-server/datapacks/original/data/items/equipment/ship/engines/rtg.json deleted file mode 100644 index 58e2f11..0000000 --- a/game-server/datapacks/original/data/items/equipment/ship/engines/rtg.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "plating": { - "id": "original:rtg", - "displayName": "items.materials.original.ship.engine.rtg", - "description": "items.materials.original.ship.engine.rtg.desc", - "texture": "original/assets/textures/equipement/ship/engines/rtg.png", - "stats": { - "health": 40, - "power": 10, - "defence.rating": 0.05, - "resistance.base": 0.2 - }, - "meta": { - "rarity": "common", - "equipmentSlot": "original:ship_engines", - "storeCategory": "original:ship_equipment", - "dungeon": "space" - } - } -} diff --git a/game-server/datapacks/original/data/items/equipment/ship/hulls/basic_plating.json b/game-server/datapacks/original/data/items/equipment/ship/hulls/basic_plating.json deleted file mode 100644 index f4c41c8..0000000 --- a/game-server/datapacks/original/data/items/equipment/ship/hulls/basic_plating.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "plating": { - "id": "original:basic_plating", - "displayName": "items.materials.original.ship.plating.basic_plating", - "description": "items.materials.original.ship.plating.basic_plating.desc", - "texture": "original/assets/textures/equipment/ship/hull/basic_plating.png", - "stats": { - "defence.base": 3, - "health": 10, - "reflect.chance": 0, - "resistance.base": 0.2 - }, - "meta": { - "rarity": "common", - "equipmentSlot": "original:ship_hull", - "storeCategory": "original:ship_equipment", - "dungeon": "space", - "storePrice": 100, - "storeSellValue": 25, - "storeShowWeight": 10, - "storeFeaturedDiscountPercentage": 0, - "storeFeaturedShowWeight": 10 - } - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/items/equipment/ship/hulls/heavy_plating.json b/game-server/datapacks/original/data/items/equipment/ship/hulls/heavy_plating.json deleted file mode 100644 index e0c1081..0000000 --- a/game-server/datapacks/original/data/items/equipment/ship/hulls/heavy_plating.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "plating": { - "id": "original:heavy_plating", - "displayName": "items.materials.original.ship.plating.heavy_plating", - "description": "items.materials.original.ship.plating.heavy_plating.desc", - "texture": "original/assets/textures/equipment/ship/hull/heavy_plating.png", - "stats": { - "defence.base": 6, - "defence.chance": 0.1, - "health": 30, - "resistance.base": 0.3, - "resistance.ion": 0.2 - }, - "meta": { - "rarity": "uncommon", - "equipmentSlot": "original:ship_hull", - "storeCategory": "original:ship_equipment", - "dungeon": "space", - "storePrice": 100, - "storeSellValue": 25, - "storeShowWeight": 10, - "storeFeaturedDiscountPercentage": 0, - "storeFeaturedShowWeight": 10 - } - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/items/equipment/ship/hulls/reflective_plating.json b/game-server/datapacks/original/data/items/equipment/ship/hulls/reflective_plating.json deleted file mode 100644 index afdc1d1..0000000 --- a/game-server/datapacks/original/data/items/equipment/ship/hulls/reflective_plating.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "plating": { - "id": "original:reflective_plating", - "displayName": "items.materials.original.ship.plating.reflective_plating", - "description": "items.materials.original.ship.plating.reflective_plating.desc", - "texture": "original/assets/textures/equipment/ship/hull/reflective_plating.png", - "stats": { - "defence.base": 6, - "defence.chance": 0.1, - "health": 30, - "reflect.base": 1, - "reflect.chance": 0.25, - "reflect.rate": 0.25, - "resistance.base": 0.2 - }, - "meta": { - "rarity": "rare", - "equipmentSlot": "original:ship_hull", - "storeCategory": "original:ship_equipment", - "dungeon": "space", - "storePrice": 100, - "storeSellValue": 25, - "storeShowWeight": 10, - "storeFeaturedDiscountPercentage": 0, - "storeFeaturedShowWeight": 10 - } - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/items/equipment/ship/hulls/resistive_plating.json b/game-server/datapacks/original/data/items/equipment/ship/hulls/resistive_plating.json deleted file mode 100644 index e33ea03..0000000 --- a/game-server/datapacks/original/data/items/equipment/ship/hulls/resistive_plating.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "plating": { - "id": "original:resistive_plating", - "displayName": "items.materials.original.ship.plating.heavy_plating", - "description": "items.materials.original.ship.plating.heavy_plating.desc", - "texture": "original/assets/textures/equipment/ship/hull/resistive_plating.png", - "stats": { - "defence.base": 6, - "health": 30, - "resistance.base": 0.3, - "resistance.cold": 0.3, - "resistance.gamma": 0.3, - "resistance.heat": 0.3, - "resistance.ion": 0.5, - "resistance.physical": 0.3, - "resistance.plasma": 0.3 - }, - "meta": { - "rarity": "rare", - "equipmentSlot": "original:ship_hull", - "storeCategory": "original:ship_equipment", - "dungeon": "space", - "storePrice": 100, - "storeSellValue": 25, - "storeShowWeight": 10, - "storeFeaturedDiscountPercentage": 0, - "storeFeaturedShowWeight": 10 - } - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/items/equipment/ship/shields/basic_shield.json b/game-server/datapacks/original/data/items/equipment/ship/shields/basic_shield.json deleted file mode 100644 index 065d0ac..0000000 --- a/game-server/datapacks/original/data/items/equipment/ship/shields/basic_shield.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "plating": { - "id": "original:basic_shield", - "displayName": "items.materials.original.ship.shields.basic_shield", - "description": "items.materials.original.ship.shields.basic_shield.desc", - "texture": "original/assets/textures/equipment/ship/shields/basic_shield.png", - "stats": { - "defence.rate": 2, - "health": 25, - "reflect.base": 1, - "reflect.chance": 0.1, - "reflect.rate": 0.5, - "resistance.base": 0, - "resistance.ion": -0.5 - }, - "meta": { - "rarity": "common", - "equipmentSlot": "original:ship_shields", - "storeCategory": "original:ship_equipment", - "dungeon": "space", - "storePrice": 100, - "storeSellValue": 25, - "storeShowWeight": 10, - "storeFeaturedDiscountPercentage": 0, - "storeFeaturedShowWeight": 10 - } - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/items/equipment/ship/shields/heavy_shield.json b/game-server/datapacks/original/data/items/equipment/ship/shields/heavy_shield.json deleted file mode 100644 index 3d17df8..0000000 --- a/game-server/datapacks/original/data/items/equipment/ship/shields/heavy_shield.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "plating": { - "id": "original:heavy_shield", - "displayName": "items.materials.original.ship.shields.heavy_shield", - "description": "items.materials.original.ship.shields.heavy_shield.desc", - "texture": "original/assets/textures/equipment/ship/shields/heavy_shield.png", - "stats": { - "defence.rate": 5, - "health": 75, - "reflect.base": 1, - "reflect.chance": 0.15, - "reflect.rate": 1, - "resistance.base": 0.1, - "resistance.ion": -0.5 - }, - "meta": { - "rarity": "uncommon", - "equipmentSlot": "original:ship_shields", - "storeCategory": "original:ship_equipment", - "dungeon": "space", - "storePrice": 100, - "storeSellValue": 25, - "storeShowWeight": 10, - "storeFeaturedDiscountPercentage": 0, - "storeFeaturedShowWeight": 10 - } - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/items/equipment/ship/shields/reflecter_shield.json b/game-server/datapacks/original/data/items/equipment/ship/shields/reflecter_shield.json deleted file mode 100644 index 49c3fbc..0000000 --- a/game-server/datapacks/original/data/items/equipment/ship/shields/reflecter_shield.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "plating": { - "id": "original:reflecter_shield", - "displayName": "items.materials.original.ship.shields.reflecter_shield", - "description": "items.materials.original.ship.shields.reflecter_shield.desc", - "texture": "original/assets/textures/equipment/ship/shields/reflecter_shield.png", - "stats": { - "defence.chance": 0.15, - "defence.rate": 4, - "health": 70, - "reflect.base": 3, - "reflect.chance": 0.5, - "reflect.rate": 1.5, - "resistance.base": 0.1, - "resistance.ion": -0.5 - }, - "meta": { - "rarity": "rare", - "equipmentSlot": "original:ship_shields", - "storeCategory": "original:ship_equipment", - "dungeon": "space", - "storePrice": 100, - "storeSellValue": 25, - "storeShowWeight": 10, - "storeFeaturedDiscountPercentage": 0, - "storeFeaturedShowWeight": 10 - } - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/items/equipment/ship/thrusters/basic_ship_thrusters.json b/game-server/datapacks/original/data/items/equipment/ship/thrusters/basic_ship_thrusters.json deleted file mode 100644 index 6b4094e..0000000 --- a/game-server/datapacks/original/data/items/equipment/ship/thrusters/basic_ship_thrusters.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "plating": { - "id": "original:basic_ship_thruster", - "displayName": "items.materials.original.ship.thruster.basic_ship_thruster", - "description": "items.materials.original.ship.thruster.basic_ship_thruster.desc", - "texture": "original/assets/textures/equipement/ship/thrusters/basic_ship_thruster.png", - "stats": { - "health": 15, - "defence.rating": 0.125, - "speed": 12.5 - }, - "meta": { - "rarity": "common", - "equipmentSlot": [ - "original:ship_thruster_1", - "original:ship_thruster_2", - "original:ship_thruster_3", - "original:ship_thruster_4" - ], - "storeCategory": "original:ship_equipment", - "dungeon": "space" - } - } -} diff --git a/game-server/datapacks/original/data/items/equipment/ship/thrusters/big_ship_thruster.json b/game-server/datapacks/original/data/items/equipment/ship/thrusters/big_ship_thruster.json deleted file mode 100644 index a44b106..0000000 --- a/game-server/datapacks/original/data/items/equipment/ship/thrusters/big_ship_thruster.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "plating": { - "id": "original:Big_ship_thruster", - "displayName": "items.materials.original.ship.thruster.big_ship_thruster", - "description": "items.materials.original.ship.thruster.big_ship_thruster.desc", - "texture": "original/assets/textures/equipment/ship/thruster/Big_ship_thruster.png", - "stats": { - "defence.chance": 0.1, - "health": 35 - }, - "meta": { - "rarity": "uncommon", - "equipmentSlot": [ - "original:ship_thruster_1", - "original:ship_thruster_2", - "original:ship_thruster_3", - "original:ship_thruster_4" - ], - "storeCategory": "original:ship_equipment", - "dungeon": "space", - "storePrice": 100, - "storeSellValue": 25, - "storeShowWeight": 10, - "storeFeaturedDiscountPercentage": 0, - "storeFeaturedShowWeight": 10 - } - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/items/equipment/ship/thrusters/big_ship_thrusters.json b/game-server/datapacks/original/data/items/equipment/ship/thrusters/big_ship_thrusters.json deleted file mode 100644 index 35a37c3..0000000 --- a/game-server/datapacks/original/data/items/equipment/ship/thrusters/big_ship_thrusters.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "plating": { - "id": "original:Big_ship_thruster", - "displayName": "items.materials.original.ship.thruster.big_ship_thruster", - "description": "items.materials.original.ship.thruster.big_ship_thruster.desc", - "texture": "original/assets/textures/equipement/ship/thrusters/big_ship_thruster.png", - "stats": { - "health": 35, - "defence.rating": 0.1, - "speed": 22.5 - }, - "meta": { - "rarity": "uncommon", - "equipmentSlot": [ - "original:ship_thruster_1", - "original:ship_thruster_2" - ], - "storeCategory": "original:ship_equipment", - "dungeon": "space" - } - } -} diff --git a/game-server/datapacks/original/data/items/equipment/ship/weapons/basic_ship_weapon.json b/game-server/datapacks/original/data/items/equipment/ship/weapons/basic_ship_weapon.json deleted file mode 100644 index 69f56fe..0000000 --- a/game-server/datapacks/original/data/items/equipment/ship/weapons/basic_ship_weapon.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "plating": { - "id": "original:basic_ship_weapon", - "displayName": "items.materials.original.ship.weapon.basic_ship_weapon", - "description": "items.materials.original.ship.weapon.basic_ship_weapon.desc", - "texture": "original/assets/textures/equipement/ship/weapon/basic_ship_weapon.png", - "stats": { - "attack.base": 7.5, - "health": 5 - }, - "meta": { - "rarity": "common", - "equipmentSlot": [ - "original:ship_weapon_1", - "original:ship_weapon_2" - ], - "storeCategory": "original:ship_equipment", - "dungeon": "space", - "storePrice": 100, - "storeSellValue": 25, - "storeShowWeight": 10, - "storeFeaturedDiscountPercentage": 0, - "storeFeaturedShowWeight": 10 - } - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/items/equipment/ship/weapons/serpent_missiles.json b/game-server/datapacks/original/data/items/equipment/ship/weapons/serpent_missiles.json deleted file mode 100644 index bd31817..0000000 --- a/game-server/datapacks/original/data/items/equipment/ship/weapons/serpent_missiles.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "plating": { - "id": "original:serpent_missiles", - "displayName": "items.materials.original.ship.weapon.serpent_missiles", - "description": "items.materials.original.ship.weapon.serpent_missiles.desc", - "texture": "original/assets/textures/equipement/ship/weapon/serpent_missiles.png", - "stats": { - "attack.base": 10, - "health": 5, - "resistance.base": -0.1 - }, - "meta": { - "rarity": "uncommon", - "equipmentSlot": [ - "original:ship_weapon_1", - "original:ship_weapon_2" - ], - "storeCategory": "original:ship_equipment", - "dungeon": "space", - "storePrice": 100, - "storeSellValue": 25, - "storeShowWeight": 10, - "storeFeaturedDiscountPercentage": 0, - "storeFeaturedShowWeight": 10 - } - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/items/equipment/ship/weapons/unstable_partical_cannon.json b/game-server/datapacks/original/data/items/equipment/ship/weapons/unstable_partical_cannon.json deleted file mode 100644 index c659b11..0000000 --- a/game-server/datapacks/original/data/items/equipment/ship/weapons/unstable_partical_cannon.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "plating": { - "id": "original:unstable_partical_cannon", - "displayName": "items.materials.original.ship.weapon.unstable_partical_cannon", - "description": "items.materials.original.ship.weapon.unstable_partical_cannon.desc", - "texture": "original/assets/textures/equipement/ship/weapon/unstable_partical_cannon.png", - "stats": { - "attack.base": 30, - "health": 5, - "defence.rating": -0.20, - "resistance.base": -0.20 - }, - "meta": { - "rarity": "rare", - "equipmentSlot": [ - "original:ship_weapon_1", - "original:ship_weapon_2" - ], - "storeCategory": "original:ship_equipment", - "dungeon": "space" - } - } -} diff --git a/game-server/datapacks/original/data/items/materials/alloys/chronotanium.json b/game-server/datapacks/original/data/items/materials/alloys/chronotanium.json deleted file mode 100644 index ac0b9f4..0000000 --- a/game-server/datapacks/original/data/items/materials/alloys/chronotanium.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "materials": { - "id": "original:alloy_chronotanium", - "texture": "original/assets/textures/materials/alloy/chronotanium.png", - "displayName": "items.materials.original.alloys.chronotanium", - "description": "items.materials.original.alloys.chronotanium.desc", - "meta": { - "storeCategory": "original:materials" - } - } -} diff --git a/game-server/datapacks/original/data/items/materials/alloys/neutronium_composite.json b/game-server/datapacks/original/data/items/materials/alloys/neutronium_composite.json deleted file mode 100644 index 0a5369c..0000000 --- a/game-server/datapacks/original/data/items/materials/alloys/neutronium_composite.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "materials": { - "id": "original:alloy_neutronium_composite", - "texture": "original/assets/textures/materials/alloy/neutroniumcomposite.png", - "displayName": "items.materials.original.alloys.neutronium_composite", - "description": "items.materials.original.alloys.neutronium_composite.desc", - "meta": { - "storeCategory": "original:materials" - } - } -} diff --git a/game-server/datapacks/original/data/items/materials/alloys/steel.json b/game-server/datapacks/original/data/items/materials/alloys/steel.json deleted file mode 100644 index 3dc0a59..0000000 --- a/game-server/datapacks/original/data/items/materials/alloys/steel.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "materials": { - "id": "original:alloy_steel", - "texture": "original/assets/textures/materials/alloy/steel.png", - "displayName": "items.materials.original.alloys.steel", - "description": "items.materials.original.alloys.steel.desc", - "meta": { - "storeCategory": "original:materials" - } - } -} diff --git a/game-server/datapacks/original/data/items/materials/alloys/superconductor.json b/game-server/datapacks/original/data/items/materials/alloys/superconductor.json deleted file mode 100644 index cf0fa3a..0000000 --- a/game-server/datapacks/original/data/items/materials/alloys/superconductor.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "materials": { - "id": "original:alloy_superconductor", - "texture": "original/assets/textures/materials/alloy/superconductorflux.png", - "displayName": "items.materials.original.alloys.superconductor", - "description": "items.materials.original.alloys.superconductor.desc", - "meta": { - "storeCategory": "original:materials" - } - } -} diff --git a/game-server/datapacks/original/data/items/materials/alloys/titanium_weave.json b/game-server/datapacks/original/data/items/materials/alloys/titanium_weave.json deleted file mode 100644 index 7584d8f..0000000 --- a/game-server/datapacks/original/data/items/materials/alloys/titanium_weave.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "materials": { - "id": "original:alloy_titanium_weave", - "texture": "original/assets/textures/materials/alloy/titaniumweave.png", - "displayName": "items.materials.original.alloys.titanium_weave", - "description": "items.materials.original.alloys.titanium_weave.desc", - "meta": { - "storeCategory": "original:materials" - } - } -} diff --git a/game-server/datapacks/original/data/items/materials/alloys/void_steel.json b/game-server/datapacks/original/data/items/materials/alloys/void_steel.json deleted file mode 100644 index b277384..0000000 --- a/game-server/datapacks/original/data/items/materials/alloys/void_steel.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "materials": { - "id": "original:alloy_void_steel", - "texture": "original/assets/textures/materials/alloy/voidsteel.png", - "displayName": "items.materials.original.alloys.void_steel", - "description": "items.materials.original.alloys.void_steel.desc", - "meta": { - "storeCategory": "original:materials" - } - } -} diff --git a/game-server/datapacks/original/data/items/materials/bio/bio_pulp.json b/game-server/datapacks/original/data/items/materials/bio/bio_pulp.json deleted file mode 100644 index 28759d7..0000000 --- a/game-server/datapacks/original/data/items/materials/bio/bio_pulp.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "materials": { - "id": "original:bio_pulp", - "texture": "original/assets/textures/materials/bio/bio_pulp.png", - "displayName": "items.materials.original.bio.bio_pulp", - "description": "items.materials.original.bio.bio_pulp.desc", - "meta": { - "storeCategory": "original:materials" - } - } -} diff --git a/game-server/datapacks/original/data/items/materials/circuits/advanced_circuit.json b/game-server/datapacks/original/data/items/materials/circuits/advanced_circuit.json deleted file mode 100644 index 5209ec7..0000000 --- a/game-server/datapacks/original/data/items/materials/circuits/advanced_circuit.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "materials": { - "id": "original:circuit_advanced", - "texture": "original/assets/textures/materials/circuits/advanced_circuit.png", - "displayName": "items.materials.original.circuits.advanced", - "description": "items.materials.original.circuits.advanced.desc", - "meta": { - "storeCategory": "original:materials", - "storePrice": 50, - "storeSellValue": 10, - "storeShowWeight": 10, - "storeFeaturedDiscountPercentage": 0, - "storeFeaturedShowWeight": 10 - } - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/items/materials/circuits/ai_core.json b/game-server/datapacks/original/data/items/materials/circuits/ai_core.json deleted file mode 100644 index 1010f84..0000000 --- a/game-server/datapacks/original/data/items/materials/circuits/ai_core.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "materials": { - "id": "original:circuit_ai_core", - "texture": "original/assets/textures/materials/circuits/ai_core.gif", - "displayName": "items.materials.original.circuits.ai_core", - "description": "items.materials.original.circuits.ai_core.desc", - "meta": { - "storeCategory": "original:materials", - "storePrice": 50, - "storeSellValue": 10, - "storeShowWeight": 10, - "storeFeaturedDiscountPercentage": 0, - "storeFeaturedShowWeight": 10 - } - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/items/materials/circuits/basic_circuit.json b/game-server/datapacks/original/data/items/materials/circuits/basic_circuit.json deleted file mode 100644 index a03d810..0000000 --- a/game-server/datapacks/original/data/items/materials/circuits/basic_circuit.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "materials": { - "id": "original:circuit_basic", - "texture": "original/assets/textures/materials/circuits/basic_circuit.png", - "displayName": "items.materials.original.circuits.basic", - "description": "items.materials.original.circuits.basic.desc", - "meta": { - "storeCategory": "original:materials", - "storePrice": 50, - "storeSellValue": 10, - "storeShowWeight": 10, - "storeFeaturedDiscountPercentage": 0, - "storeFeaturedShowWeight": 10 - } - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/items/materials/circuits/processing_unit.json b/game-server/datapacks/original/data/items/materials/circuits/processing_unit.json deleted file mode 100644 index d4ab629..0000000 --- a/game-server/datapacks/original/data/items/materials/circuits/processing_unit.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "materials": { - "id": "original:circuit_processing_unit", - "texture": "original/assets/textures/materials/circuits/processing_unit.png", - "displayName": "items.materials.original.circuits.processing_unit", - "description": "items.materials.original.circuits.processing_unit.desc", - "meta": { - "storeCategory": "original:materials", - "storePrice": 50, - "storeSellValue": 10, - "storeShowWeight": 10, - "storeFeaturedDiscountPercentage": 0, - "storeFeaturedShowWeight": 10 - } - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/items/materials/circuits/quantum_processor.json b/game-server/datapacks/original/data/items/materials/circuits/quantum_processor.json deleted file mode 100644 index a3e7377..0000000 --- a/game-server/datapacks/original/data/items/materials/circuits/quantum_processor.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "materials": { - "id": "original:circuit_quantum_processor", - "texture": "original/assets/textures/materials/circuits/quantum_processor.png", - "displayName": "items.materials.original.circuits.quantum_processor", - "description": "items.materials.original.circuits.quantum_processor.desc", - "meta": { - "storeCategory": "original:materials", - "storePrice": 50, - "storeSellValue": 10, - "storeShowWeight": 10, - "storeFeaturedDiscountPercentage": 0, - "storeFeaturedShowWeight": 10 - } - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/items/materials/crystals/core_flux.json b/game-server/datapacks/original/data/items/materials/crystals/core_flux.json deleted file mode 100644 index b3b2cf2..0000000 --- a/game-server/datapacks/original/data/items/materials/crystals/core_flux.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "materials": { - "id": "original:crystal_flux_core", - "texture": "original/assets/textures/materials/crystal/fluxcore.gif", - "displayName": "items.materials.original.crystal.flux_core", - "description": "items.materials.original.crystal.flux_core.desc", - "meta": { - "storeCategory": "original:materials" - } - } -} diff --git a/game-server/datapacks/original/data/items/materials/crystals/crystal_dimentional.json b/game-server/datapacks/original/data/items/materials/crystals/crystal_dimentional.json deleted file mode 100644 index a0b84eb..0000000 --- a/game-server/datapacks/original/data/items/materials/crystals/crystal_dimentional.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "materials": { - "id": "original:crystal_dimentional", - "texture": "original/assets/textures/materials/crystal/dimentionalcrystal.gif", - "displayName": "items.materials.original.crystal.dimentional", - "description": "items.materials.original.crystal.dimentional.desc", - "meta": { - "storeCategory": "original:materials" - } - } -} diff --git a/game-server/datapacks/original/data/items/materials/crystals/crystal_flux.json b/game-server/datapacks/original/data/items/materials/crystals/crystal_flux.json deleted file mode 100644 index 504f1b2..0000000 --- a/game-server/datapacks/original/data/items/materials/crystals/crystal_flux.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "materials": { - "id": "original:crystal_flux", - "texture": "original/assets/textures/materials/crystal/fluxcrystal.png", - "displayName": "items.materials.original.crystal.flux", - "description": "items.materials.original.crystal.flux.desc", - "meta": { - "storeCategory": "original:materials" - } - } -} diff --git a/game-server/datapacks/original/data/items/materials/crystals/crystal_void.json b/game-server/datapacks/original/data/items/materials/crystals/crystal_void.json deleted file mode 100644 index 782553d..0000000 --- a/game-server/datapacks/original/data/items/materials/crystals/crystal_void.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "materials": { - "id": "original:crystal_void", - "texture": "original/assets/textures/materials/crystal/voidcrystal.png", - "displayName": "items.materials.original.crystal.void", - "description": "items.materials.original.crystal.void.desc", - "meta": { - "storeCategory": "original:materials" - } - } -} diff --git a/game-server/datapacks/original/data/items/materials/crystals/neutronium.json b/game-server/datapacks/original/data/items/materials/crystals/neutronium.json deleted file mode 100644 index 4b51eb2..0000000 --- a/game-server/datapacks/original/data/items/materials/crystals/neutronium.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "materials": { - "id": "original:crystal_neutronium", - "texture": "original/assets/textures/materials/crystal/neutronium.png", - "displayName": "items.materials.original.crystal.neutronium", - "description": "items.materials.original.crystal.neutronium.desc", - "meta": { - "storeCategory": "original:materials" - } - } -} diff --git a/game-server/datapacks/original/data/items/materials/ingots/aluminum.json b/game-server/datapacks/original/data/items/materials/ingots/aluminum.json deleted file mode 100644 index c8cbcce..0000000 --- a/game-server/datapacks/original/data/items/materials/ingots/aluminum.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "materials": { - "id": "original:ingot_aluminum", - "texture": "original/assets/textures/materials/ingot/aluminum.png", - "displayName": "items.materials.original.ingots.aluminum", - "description": "items.materials.original.ingots.aluminum.desc", - "meta": { - "storeCategory": "original:materials" - } - } -} diff --git a/game-server/datapacks/original/data/items/materials/ingots/carbon.json b/game-server/datapacks/original/data/items/materials/ingots/carbon.json deleted file mode 100644 index 26cc59e..0000000 --- a/game-server/datapacks/original/data/items/materials/ingots/carbon.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "materials": { - "id": "original:ingot_carbon", - "texture": "original/assets/textures/materials/ingot/carbon.png", - "displayName": "items.materials.original.ingots.carbon", - "description": "items.materials.original.ingots.carbon.desc", - "meta": { - "storeCategory": "original:materials" - } - } -} diff --git a/game-server/datapacks/original/data/items/materials/ingots/chronite.json b/game-server/datapacks/original/data/items/materials/ingots/chronite.json deleted file mode 100644 index ae151f7..0000000 --- a/game-server/datapacks/original/data/items/materials/ingots/chronite.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "materials": { - "id": "original:ingot_chronite", - "texture": "original/assets/textures/materials/ingot/chronite.png", - "displayName": "items.materials.original.ingots.chronite", - "description": "items.materials.original.ingots.chronite.desc", - "meta": { - "storeCategory": "original:materials" - } - } -} diff --git a/game-server/datapacks/original/data/items/materials/ingots/copper.json b/game-server/datapacks/original/data/items/materials/ingots/copper.json deleted file mode 100644 index ecd22ad..0000000 --- a/game-server/datapacks/original/data/items/materials/ingots/copper.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "materials": { - "id": "original:ingot_copper", - "texture": "original/assets/textures/materials/ingot/copper.png", - "displayName": "items.materials.original.ingots.copper", - "description": "items.materials.original.ingots.copper.desc", - "meta": { - "storeCategory": "original:materials" - } - } -} diff --git a/game-server/datapacks/original/data/items/materials/ingots/gold.json b/game-server/datapacks/original/data/items/materials/ingots/gold.json deleted file mode 100644 index 417b2d1..0000000 --- a/game-server/datapacks/original/data/items/materials/ingots/gold.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "materials": { - "id": "original:ingot_gold", - "texture": "original/assets/textures/materials/ingot/gold.png", - "displayName": "items.materials.original.ingots.gold", - "description": "items.materials.original.ingots.gold.desc", - "meta": { - "storeCategory": "original:materials" - } - } -} diff --git a/game-server/datapacks/original/data/items/materials/ingots/iron.json b/game-server/datapacks/original/data/items/materials/ingots/iron.json deleted file mode 100644 index 3f8adf0..0000000 --- a/game-server/datapacks/original/data/items/materials/ingots/iron.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "materials": { - "id": "original:ingot_iron", - "texture": "original/assets/textures/materials/ingot/iron.png", - "displayName": "items.materials.original.ingots.iron", - "description": "items.materials.original.ingots.iron.desc", - "meta": { - "storeCategory": "original:materials" - } - } -} diff --git a/game-server/datapacks/original/data/items/materials/ingots/titanium.json b/game-server/datapacks/original/data/items/materials/ingots/titanium.json deleted file mode 100644 index 1dc59ea..0000000 --- a/game-server/datapacks/original/data/items/materials/ingots/titanium.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "materials": { - "id": "original:ingot_titanium", - "texture": "original/assets/textures/materials/ingot/titanium.png", - "displayName": "items.materials.original.ingots.titanium", - "description": "items.materials.original.ingots.titanium.desc", - "meta": { - "storeCategory": "original:materials" - } - } -} diff --git a/game-server/datapacks/original/data/items/materials/ingots/tungsten.json b/game-server/datapacks/original/data/items/materials/ingots/tungsten.json deleted file mode 100644 index cbf4183..0000000 --- a/game-server/datapacks/original/data/items/materials/ingots/tungsten.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "materials": { - "id": "original:ingot_tungsten", - "texture": "original/assets/textures/materials/ingot/tungsten.png", - "displayName": "items.materials.original.ingots.tungsten", - "description": "items.materials.original.ingots.tungsten.desc", - "meta": { - "storeCategory": "original:materials" - } - } -} diff --git a/game-server/datapacks/original/data/items/materials/ores/bauxite.json b/game-server/datapacks/original/data/items/materials/ores/bauxite.json deleted file mode 100644 index 7c95cd8..0000000 --- a/game-server/datapacks/original/data/items/materials/ores/bauxite.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "materials": { - "id": "original:ore_bauxite", - "texture": "original/assets/textures/materials/ore/bauxite.png", - "displayName": "items.materials.original.ores.bauxite", - "description": "items.materials.original.ores.bauxite.desc", - "meta": { - "storeCategory": "original:materials" - } - } -} diff --git a/game-server/datapacks/original/data/items/materials/ores/chronite.json b/game-server/datapacks/original/data/items/materials/ores/chronite.json deleted file mode 100644 index 1ddd25b..0000000 --- a/game-server/datapacks/original/data/items/materials/ores/chronite.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "materials": { - "id": "original:ore_chronite", - "texture": "original/assets/textures/materials/ore/chronite.png", - "displayName": "items.materials.original.ores.chronite", - "description": "items.materials.original.ores.chronite.desc", - "meta": { - "storeCategory": "original:materials" - } - } -} diff --git a/game-server/datapacks/original/data/items/materials/ores/coal.json b/game-server/datapacks/original/data/items/materials/ores/coal.json deleted file mode 100644 index caa4e1c..0000000 --- a/game-server/datapacks/original/data/items/materials/ores/coal.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "materials": { - "id": "original:ore_coal", - "texture": "original/assets/textures/materials/ore/coal.png", - "displayName": "items.materials.original.ores.coal", - "description": "items.materials.original.ores.coal.desc", - "meta": { - "storeCategory": "original:materials" - } - } -} diff --git a/game-server/datapacks/original/data/items/materials/ores/copper.json b/game-server/datapacks/original/data/items/materials/ores/copper.json deleted file mode 100644 index 78803af..0000000 --- a/game-server/datapacks/original/data/items/materials/ores/copper.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "materials": { - "id": "original:ore_copper", - "texture": "original/assets/textures/materials/ore/copper.png", - "displayName": "items.materials.original.ores.copper", - "description": "items.materials.original.ores.copper.desc", - "meta": { - "storeCategory": "original:materials" - } - } -} diff --git a/game-server/datapacks/original/data/items/materials/ores/gold.json b/game-server/datapacks/original/data/items/materials/ores/gold.json deleted file mode 100644 index 95746ca..0000000 --- a/game-server/datapacks/original/data/items/materials/ores/gold.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "materials": { - "id": "original:ore_gold", - "texture": "original/assets/textures/materials/ore/gold.png", - "displayName": "items.materials.original.ores.gold", - "description": "items.materials.original.ores.gold.desc", - "meta": { - "storeCategory": "original:materials" - } - } -} diff --git a/game-server/datapacks/original/data/items/materials/ores/ilunite.json b/game-server/datapacks/original/data/items/materials/ores/ilunite.json deleted file mode 100644 index 5a2ae44..0000000 --- a/game-server/datapacks/original/data/items/materials/ores/ilunite.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "materials": { - "id": "original:ore_ilunite", - "texture": "original/assets/textures/materials/ore/ilunite.png", - "displayName": "items.materials.original.ores.ilunite", - "description": "items.materials.original.ores.ilunite.desc", - "meta": { - "storeCategory": "original:materials" - } - } -} diff --git a/game-server/datapacks/original/data/items/materials/ores/iron.json b/game-server/datapacks/original/data/items/materials/ores/iron.json deleted file mode 100644 index d423bd2..0000000 --- a/game-server/datapacks/original/data/items/materials/ores/iron.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "materials": { - "id": "original:ore_iron", - "texture": "original/assets/textures/materials/ore/iron.png", - "displayName": "items.materials.original.ores.iron", - "description": "items.materials.original.ores.iron.desc", - "meta": { - "storeCategory": "original:materials" - } - } -} diff --git a/game-server/datapacks/original/data/items/materials/ores/wolframite.json b/game-server/datapacks/original/data/items/materials/ores/wolframite.json deleted file mode 100644 index 2a465a3..0000000 --- a/game-server/datapacks/original/data/items/materials/ores/wolframite.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "materials": { - "id": "original:ore_wolframite", - "texture": "original/assets/textures/materials/ore/wolframite.png", - "displayName": "items.materials.original.ores.wolframite", - "description": "items.materials.original.ores.wolframite.desc", - "meta": { - "storeCategory": "original:materials" - } - } -} diff --git a/game-server/datapacks/original/data/quests/starter_kit.json b/game-server/datapacks/original/data/quests/starter_kit.json deleted file mode 100644 index 55133af..0000000 --- a/game-server/datapacks/original/data/quests/starter_kit.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "quest": { - "id": "original:tutorial/starter_kit", - "displayName": "quests.original.tutorial.starter_kit", - "description": "Welcome, Commander. Your neural link is active. Initial equipment has been authorized.", - "category": "STORY", - "minLevel": 1, - - "objectives": [ - { - "type": "LOGIN", - "requiredAmount": 1, - "currentAmount": 0, - "description": "Initialize system uplink" - } - ], - - "rewards": { - "xp": 50, - "credits": 500, - "items": [ - { - "id": "original:basic_personal_accessory", - "count": 1 - }, - { - "id": "original:basic_personal_backpack", - "count": 1 - }, - { - "id": "original:basic_personal_boots", - "count": 1 - }, - { - "id": "original:basic_personal_gloves", - "count": 1 - }, - { - "id": "original:basic_personal_suit", - "count": 1 - }, - { - "id": "original:basic_personal_weapon", - "count": 1 - } - ] - }, - - "meta": { - "autoAccept": true, - "autoComplete": false, - "priority": 100 - } - } -} diff --git a/game-server/datapacks/original/data/quests/tutorial_boss.json b/game-server/datapacks/original/data/quests/tutorial_boss.json deleted file mode 100644 index c77016f..0000000 --- a/game-server/datapacks/original/data/quests/tutorial_boss.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "quest": { - "id": "original:tutorial/slay_tutorial_boss", - "displayName": "quests.tutorial.slay_boss.name", - "description": "quests.tutorial.slay_boss.desc", - "category": "STORY", - "meta": { - "autoAccept": true, - "priority": 10 - }, - "objectives": [ - { - "type": "KILL_ENEMY", - "targetId": "original:tutorial/tutorial_boss_hostile", - "requiredAmount": 1, - "description": "quests.tutorial.slay_boss.obj1" - } - ], - "rewards": { - "credits": 500, - "xp": 1000, - "items": [ - { - "id": "original:materials/data_core", - "count": 1 - } - ] - } - } -} diff --git a/game-server/datapacks/original/data/recipes/Crystals/dimentional_crystal.json b/game-server/datapacks/original/data/recipes/Crystals/dimentional_crystal.json deleted file mode 100644 index 1be19c3..0000000 --- a/game-server/datapacks/original/data/recipes/Crystals/dimentional_crystal.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "recipe": { - "inputs": [ - { "original:alloy_neutronium_composite": 1 }, - { "original:crystal_flux": 1 }, - { "original:crystal_void": 1 } - ], - "output": { - "original:crystal_dimentional": 2 - }, - "time_seconds": 1200, - "requires": { - "original:alloying": 10 - } - }, - "craft": { - "type": "original:crystal", - "id": "original:crystal_dimentional" - } -} diff --git a/game-server/datapacks/original/data/recipes/Crystals/flux_core.json b/game-server/datapacks/original/data/recipes/Crystals/flux_core.json deleted file mode 100644 index 0741c34..0000000 --- a/game-server/datapacks/original/data/recipes/Crystals/flux_core.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "recipe": { - "inputs": [ - { "original:ingot_steel": 2 }, - { "original:crystal_flux": 2 }, - { "original:ingot_chronite": 1 } - ], - "output": { - "original:crystal_flux_core": 1 - }, - "time_seconds": 1200, - "requires": { - "original:alloying": 6 - } - }, - "craft": { - "type": "original:crystal", - "id": "original:crystal_flux_core" - } -} diff --git a/game-server/datapacks/original/data/recipes/alloys/chronotanium.json b/game-server/datapacks/original/data/recipes/alloys/chronotanium.json deleted file mode 100644 index aed84b4..0000000 --- a/game-server/datapacks/original/data/recipes/alloys/chronotanium.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "recipe": { - "inputs": [ - { "original:ingot_titanium": 2 }, - { "original:ingot_chronite": 1 }, - { "original:ingot_aluminum": 1 } - ], - "output": { - "original:alloy_chronotanium": 1 - }, - "time_seconds": 1200, - "requires": { - "original:alloying": 8 - } - }, - "craft": { - "type": "original:alloys", - "id": "original:alloy_chronotanium" - } -} diff --git a/game-server/datapacks/original/data/recipes/alloys/neutronium_composite.json b/game-server/datapacks/original/data/recipes/alloys/neutronium_composite.json deleted file mode 100644 index c5768c5..0000000 --- a/game-server/datapacks/original/data/recipes/alloys/neutronium_composite.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "recipe": { - "inputs": [ - { "original:crystal_neutronium": 1 }, - { "original:alloy_titanium_weave": 1 } - ], - "output": { - "original:alloy_neutronium_composite": 1 - }, - "time_seconds": 1200, - "requires": { - "original:alloying": 8 - } - }, - "craft": { - "type": "original:alloys", - "id": "original:alloy_neutronium_composite" - } -} diff --git a/game-server/datapacks/original/data/recipes/alloys/steel.json b/game-server/datapacks/original/data/recipes/alloys/steel.json deleted file mode 100644 index e06e283..0000000 --- a/game-server/datapacks/original/data/recipes/alloys/steel.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "recipe": { - "inputs": [ - { "original:ingot_iron": 2 }, - { "original:ore_coal": 5 } - ], - "output": { - "original:alloy_steel": 1 - }, - "time_seconds": 10, - "requires": { - "original:alloying": 1 - } - }, - "craft": { - "type": "original:alloys", - "id": "original:alloy_steel" - } -} diff --git a/game-server/datapacks/original/data/recipes/alloys/superconductor.json b/game-server/datapacks/original/data/recipes/alloys/superconductor.json deleted file mode 100644 index a803ed7..0000000 --- a/game-server/datapacks/original/data/recipes/alloys/superconductor.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "recipe": { - "inputs": [ - { "original:ingot_gold": 1 }, - { "original:ingot_copper": 3 }, - { "original:crystal_flux": 1 } - ], - "output": { - "original:alloy_superconductor": 1 - }, - "time_seconds": 200, - "requires": { - "original:alloying": 1 - } - }, - "craft": { - "type": "original:alloys", - "id": "original:alloy_superconductor" - } -} diff --git a/game-server/datapacks/original/data/recipes/alloys/titanium_weave.json b/game-server/datapacks/original/data/recipes/alloys/titanium_weave.json deleted file mode 100644 index 5e70494..0000000 --- a/game-server/datapacks/original/data/recipes/alloys/titanium_weave.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "recipe": { - "inputs": [ - { "original:ingot_titanium": 1 }, - { "original:ingot_carbon": 5 } - ], - "output": { - "original:alloy_titanium_weave": 1 - }, - "time_seconds": 300, - "requires": { - "original:alloying": 4 - } - }, - "craft": { - "type": "original:alloys", - "id": "original:alloy_titanium_weave" - } -} diff --git a/game-server/datapacks/original/data/recipes/alloys/void_steel.json b/game-server/datapacks/original/data/recipes/alloys/void_steel.json deleted file mode 100644 index b701a7a..0000000 --- a/game-server/datapacks/original/data/recipes/alloys/void_steel.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "recipe": { - "inputs": [ - { "original:alloy_steel": 2 }, - { "original:crystal_void": 1 } - ], - "output": { - "original:alloy_void_steel": 2 - }, - "time_seconds": 100, - "requires": { - "original:alloying": 3 - } - }, - "craft": { - "type": "original:alloys", - "id": "original:alloy_void_steel" - } -} diff --git a/game-server/datapacks/original/data/recipes/circuits/advanced_circuit.json b/game-server/datapacks/original/data/recipes/circuits/advanced_circuit.json deleted file mode 100644 index e60cce8..0000000 --- a/game-server/datapacks/original/data/recipes/circuits/advanced_circuit.json +++ /dev/null @@ -1,21 +0,0 @@ - -{ - "recipe": { - "inputs": [ - {"original:circuit_basic": 2}, - {"original:ingot_gold": 1}, - {"original:ingot_carbon": 2} - ], - "output": { - "original:circuit_advanced": 1 - }, - "time_seconds": 20, - "requires": { - "original:circuit_assembly": 2 - } - }, - "craft": { - "type": "original:circuits", - "id": "original:circuit_advanced" - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/recipes/circuits/ai_core.json b/game-server/datapacks/original/data/recipes/circuits/ai_core.json deleted file mode 100644 index 715267e..0000000 --- a/game-server/datapacks/original/data/recipes/circuits/ai_core.json +++ /dev/null @@ -1,20 +0,0 @@ - -{ - "recipe": { - "inputs": [ - {"original:circuit_quantum_processor": 2}, - {"original:dimentional_crystal": 1} - ], - "output": { - "original:circuit_ai_core": 1 - }, - "time_seconds": 1200, - "requires": { - "original:circuit_assembly": 8 - } - }, - "craft": { - "type": "original:circuits", - "id": "original:circuit_ai_core" - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/recipes/circuits/basic_circuit.json b/game-server/datapacks/original/data/recipes/circuits/basic_circuit.json deleted file mode 100644 index edf4093..0000000 --- a/game-server/datapacks/original/data/recipes/circuits/basic_circuit.json +++ /dev/null @@ -1,20 +0,0 @@ - -{ - "recipe": { - "inputs": [ - {"original:ingot_copper": 1 }, - {"original:ingot_iron": 1 } - ], - "output": { - "original:circuit_basic": 1 - }, - "time_seconds": 10, - "requires": { - "original:circuit_assembly": 1 - } - }, - "craft": { - "type": "original:circuits", - "id": "original:circuit_basic" - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/recipes/circuits/processing_circuit.json b/game-server/datapacks/original/data/recipes/circuits/processing_circuit.json deleted file mode 100644 index 3ca7358..0000000 --- a/game-server/datapacks/original/data/recipes/circuits/processing_circuit.json +++ /dev/null @@ -1,21 +0,0 @@ - -{ - "recipe": { - "inputs": [ - {"original:circuit_advanced": 1}, - {"original:flux_crystal": 1}, - {"original:ingot_gold": 2} - ], - "output": { - "original:circuit_processing_unit": 1 - }, - "time_seconds": 60, - "requires": { - "original:circuit_assembly": 4 - } - }, - "craft": { - "type": "original:circuits", - "id": "original:circuit_processing_unit" - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/recipes/circuits/quantum_processor.json b/game-server/datapacks/original/data/recipes/circuits/quantum_processor.json deleted file mode 100644 index cd76d37..0000000 --- a/game-server/datapacks/original/data/recipes/circuits/quantum_processor.json +++ /dev/null @@ -1,21 +0,0 @@ - -{ - "recipe": { - "inputs": [ - {"original:circuit_processing_unit": 1}, - {"original:flux_core": 1}, - {"original:superconductor": 2} - ], - "output": { - "original:circuit_quantum_processor": 1 - }, - "time_seconds": 120, - "requires": { - "original:circuit_assembly": 6 - } - }, - "craft": { - "type": "original:circuits", - "id": "original:circuit_processing" - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/recipes/ingots/aluminum.json b/game-server/datapacks/original/data/recipes/ingots/aluminum.json deleted file mode 100644 index 809e5be..0000000 --- a/game-server/datapacks/original/data/recipes/ingots/aluminum.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "recipe": { - "inputs": [ - { "original:ore_bauxite": 1 }, - { "original:ore_coal": 2 } - ], - "output": { - "original:ingot_aluminum": 1 - }, - "time_seconds": 180, - "requires": { - "original:forging": 2 - } - }, - "craft": { - "type": "original:forging", - "id": "original:ingot_aluminum" - } -} diff --git a/game-server/datapacks/original/data/recipes/ingots/carbon.json b/game-server/datapacks/original/data/recipes/ingots/carbon.json deleted file mode 100644 index e898ff9..0000000 --- a/game-server/datapacks/original/data/recipes/ingots/carbon.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "recipe": { - "inputs": [ - { "original:ore_coal": 5 } - ], - "output": { - "original:ingot_carbon": 1 - }, - "time_seconds": 30, - "requires": { - "original:forging": 2 - } - }, - "craft": { - "type": "original:forging", - "id": "original:ingot_carbon" - } -} diff --git a/game-server/datapacks/original/data/recipes/ingots/chronite.json b/game-server/datapacks/original/data/recipes/ingots/chronite.json deleted file mode 100644 index d4749ed..0000000 --- a/game-server/datapacks/original/data/recipes/ingots/chronite.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "recipe": { - "inputs": [ - { "original:ore_chronite": 1 }, - { "original:ore_coal": 10 } - ], - "output": { - "original:ingot_chronite": 1 - }, - "time_seconds": 1200, - "requires": { - "original:forging": 6 - } - }, - "craft": { - "type": "original:forging", - "id": "original:ingot_chronite" - } -} diff --git a/game-server/datapacks/original/data/recipes/ingots/copper.json b/game-server/datapacks/original/data/recipes/ingots/copper.json deleted file mode 100644 index 2f1a286..0000000 --- a/game-server/datapacks/original/data/recipes/ingots/copper.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "recipe": { - "inputs": [ - { "original:ore_copper": 1 }, - { "original:ore_coal": 1 } - ], - "output": { - "original:ingot_copper": 1 - }, - "time_seconds": 5, - "requires": { - "original:forging": 0 - } - }, - "craft": { - "type": "original:forging", - "id": "original:ingot_copper" - } -} diff --git a/game-server/datapacks/original/data/recipes/ingots/gold.json b/game-server/datapacks/original/data/recipes/ingots/gold.json deleted file mode 100644 index df0bebb..0000000 --- a/game-server/datapacks/original/data/recipes/ingots/gold.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "recipe": { - "inputs": [ - { "original:ore_gold": 1 }, - { "original:ore_coal": 2 } - ], - "output": { - "original:ingot_gold": 1 - }, - "time_seconds": 30, - "requires": { - "original:forging": 0 - } - }, - "craft": { - "type": "original:forging", - "id": "original:ingot_gold" - } -} diff --git a/game-server/datapacks/original/data/recipes/ingots/iron.json b/game-server/datapacks/original/data/recipes/ingots/iron.json deleted file mode 100644 index 6738f62..0000000 --- a/game-server/datapacks/original/data/recipes/ingots/iron.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "recipe": { - "inputs": [ - { "original:ore_iron": 1 }, - { "original:ore_coal": 2 } - ], - "output": { - "original:ingot_iron": 1 - }, - "time_seconds": 5, - "requires": { - "original:forging": 0 - } - }, - "craft": { - "type": "original:forging", - "id": "original:ingot_iron" - } -} diff --git a/game-server/datapacks/original/data/recipes/ingots/titanium.json b/game-server/datapacks/original/data/recipes/ingots/titanium.json deleted file mode 100644 index 82aca6a..0000000 --- a/game-server/datapacks/original/data/recipes/ingots/titanium.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "recipe": { - "inputs": [ - { "original:ore_ilmenite": 1 }, - { "original:ore_coal": 10 } - ], - "output": { - "original:ingot_titanium": 1 - }, - "time_seconds": 300, - "requires": { - "original:forging": 4 - } - }, - "craft": { - "type": "original:forging", - "id": "original:ingot_titanium" - } -} diff --git a/game-server/datapacks/original/data/recipes/ingots/tungsten.json b/game-server/datapacks/original/data/recipes/ingots/tungsten.json deleted file mode 100644 index ed9cccb..0000000 --- a/game-server/datapacks/original/data/recipes/ingots/tungsten.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "recipe": { - "inputs": [ - { "original:ore_wolframite": 1 }, - { "original:ore_coal": 10 } - ], - "output": { - "original:ingot_tungsten": 1 - }, - "time_seconds": 600, - "requires": { - "original:forging": 5 - } - }, - "craft": { - "type": "original:forging", - "id": "original:ingot_tungsten" - } -} diff --git a/game-server/datapacks/original/data/recipes/ship_equipment/basic_shield.json b/game-server/datapacks/original/data/recipes/ship_equipment/basic_shield.json deleted file mode 100644 index f5d0e18..0000000 --- a/game-server/datapacks/original/data/recipes/ship_equipment/basic_shield.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "recipe": { - "inputs": [ - { - "original:crystal_flux": 2 - }, - { - "original:ingot_iron": 1 - }, - { - "original:circuit_basic": 2 - }, - { - "original:ingot_carbon": 2 - }, - { - "original:ingot_copper": 1 - } - ], - "output": { - "original:basic_shield": 1 - }, - "time_seconds": 60, - "requires": { - "original:high_energetics": 2 - } - }, - "craft": { - "type": "original:ship_equipment", - "id": "original:basic_shield" - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/recipes/ship_equipment/gen1_fission_reactor.json b/game-server/datapacks/original/data/recipes/ship_equipment/gen1_fission_reactor.json deleted file mode 100644 index 134b44d..0000000 --- a/game-server/datapacks/original/data/recipes/ship_equipment/gen1_fission_reactor.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "recipe": { - "inputs": [ - { - "original:crystal_flux": 2 - }, - { - "original:alloy_steel": 5 - }, - { - "original:circuit_basic": 2 - }, - { - "original:ingot_copper": 5 - }, - { - "original:ingot_carbon": 2 - } - ], - "output": { - "original:gen1_fission_reactor": 1 - }, - "time_seconds": 60, - "requires": { - "original:high_energetics": 2 - } - }, - "craft": { - "type": "original:ship_equipment", - "id": "original:gen1_fission_reactor" - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/recipes/ship_equipment/gen2_fission_reactor.json b/game-server/datapacks/original/data/recipes/ship_equipment/gen2_fission_reactor.json deleted file mode 100644 index f493978..0000000 --- a/game-server/datapacks/original/data/recipes/ship_equipment/gen2_fission_reactor.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "recipe": { - "inputs": [ - { - "original:crystal_flux": 5 - }, - { - "original:alloy_steel": 6 - }, - { - "original:circuit_advanced": 3 - }, - { - "original:ingot_aluminum": 1 - }, - { - "original:ingot_copper": 5 - }, - { - "original:ingot_gold": 3 - }, - { - "original:ingot_carbon": 5 - } - ], - "output": { - "original:gen2_fission_reactor": 1 - }, - "time_seconds": 60, - "requires": { - "original:high_energetics": 3 - } - }, - "craft": { - "type": "original:ship_equipment", - "id": "original:gen2_fission_reactor" - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/recipes/ship_equipment/heavy_shield.json b/game-server/datapacks/original/data/recipes/ship_equipment/heavy_shield.json deleted file mode 100644 index f5f6b3a..0000000 --- a/game-server/datapacks/original/data/recipes/ship_equipment/heavy_shield.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "recipe": { - "inputs": [ - { - "original:crystal_flux": 2 - }, - { - "original:alloy_steel": 1 - }, - { - "original:circuit_advanced": 2 - }, - { - "original:ingot_gold": 1 - }, - { - "original:ingot_carbon": 2 - } - ], - "output": { - "original:heavy_shield": 1 - }, - "time_seconds": 60, - "requires": { - "original:high_energetics": 2 - } - }, - "craft": { - "type": "original:ship_equipment", - "id": "original:heavy_shield" - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/recipes/ship_equipment/manifest.json b/game-server/datapacks/original/data/recipes/ship_equipment/manifest.json deleted file mode 100644 index 4dd5b14..0000000 --- a/game-server/datapacks/original/data/recipes/ship_equipment/manifest.json +++ /dev/null @@ -1,226 +0,0 @@ -{ - "name": "original", - "version": "0.0.2", - "admin_item_list": { - "categories": { - "original:alloys": { - "displayName": "admin.category.original.item_list.alloys" - }, - "original:circuits": { - "displayName": "admin.category.original.item_list.circuits" - }, - "original:customizables": { - "displayName": "admin.category.original.item_list.customizables" - }, - "original:ingots": { - "displayName": "admin.category.original.item_list.ingots" - }, - "original:materials": { - "displayName": "admin.category.original.item_list.materials" - }, - "original:ores": { - "displayName": "admin.category.original.item_list.ores" - }, - "original:personal": { - "displayName": "admin.category.original.item_list.personal" - }, - "original:ships": { - "displayName": "admin.category.original.item_list.ships" - }, - "original:shields": { - "displayName": "admin.category.original.item_list.shields" - }, - "original:weapons": { - "displayName": "admin.category.original.item_list.weapons" - } - } - }, - "admin_hostiles_list": { - "categories": { - "original:ground": { - "displayName": "admin.category.original.hostile_list.ground" - }, - "original:ships": { - "displayName": "admin.category.original.hostile_list.ships" - } - } - }, - "admin_player_list": { - "categories": { - "original:members": { - "displayName": "admin.category.original.player_list.members" - }, - "original:moderators": { - "displayName": "admin.category.original.player_list.moderators" - }, - "original:admins": { - "displayName": "admin.category.original.player_list.admins" - } - } - }, - "admin_role": { - "categories": { - "original:members": { - "displayName": "admin.category.original.player_list.members" - }, - "original:moderators": { - "displayName": "admin.category.original.player_list.moderators" - }, - "original:admins": { - "displayName": "admin.category.original.player_list.admins" - } - } - }, - "core_systems": { - "categories": { - "original:personal_helmet": { - "displayName": "core_systems.category.original.person.helmet" - }, - "original:personal_suit": { - "displayName": "core_systems.category.original.person.suit" - }, - "original:personal_gloves": { - "displayName": "core_systems.category.original.person.gloves" - }, - "original:personal_backpack": { - "displayName": "core_systems.category.original.person.backpack" - }, - "original:personal_boots": { - "displayName": "core_systems.category.original.person.boots" - }, - "original:personal_accessory_1": { - "displayName": "core_systems.category.original.person.accessory_1" - }, - "original:personal_accessory_2": { - "displayName": "core_systems.category.original.person.accessory_2" - }, - "original:personal_accessory_3": { - "displayName": "core_systems.category.original.person.accessory_3" - }, - "original:personal_accessory_4": { - "displayName": "core_systems.category.original.person.accessory_4" - }, - "original:personal_weapons": { - "displayName": "core_systems.category.original.person.weapons" - }, - "original:ship_hull": { - "displayName": "core_systems.category.original.ship.hull" - }, - "original:ship_shields": { - "displayName": "core_systems.category.original.ship.shields" - }, - "original:ship_engines": { - "displayName": "core_systems.category.original.ship.engines" - }, - "original:ship_weapon_1": { - "displayName": "core_systems.category.original.ship.weapon_1" - }, - "original:ship_weapon_2": { - "displayName": "core_systems.category.original.ship.weapon_2" - }, - "original:ship_thruster_1": { - "displayName": "core_systems.category.original.ship.thruster_1" - }, - "original:ship_thruster_2": { - "displayName": "core_systems.category.original.ship.thruster_2" - }, - "original:ship_thruster_3": { - "displayName": "core_systems.category.original.ship.thruster_3" - }, - "original:ship_thruster_4": { - "displayName": "core_systems.category.original.ship.thruster_4" - } - } - }, - "quests": { - "categories": { - "original:story": { - "displayName": "quests.category.original.story" - }, - "original:daily": { - "displayName": "quests.category.original.daily" - }, - "original:weekly": { - "displayName": "quests.category.original.weekly" - }, - "original:monthly": { - "displayName": "quests.category.original.monthly" - }, - "original:seasonal": { - "displayName": "quests.category.original.seasonal" - } - } - }, - "recipes": { - "categories": { - "original:alloys": { - "displayName": "recipes.category.original.alloys" - }, - "original:circuits": { - "displayName": "recipes.category.original.circuits" - }, - "original:crystals": { - "displayName": "recipes.category.original.crystals" - }, - "original:food": { - "displayName": "recipes.category.original.food" - }, - "original:forging": { - "displayName": "recipes.category.original.forging" - }, - "original:hull_sections": { - "displayName": "recipes.category.original.hull_sections" - }, - "original:hulls": { - "displayName": "recipes.category.original.hulls" - }, - "original:organics": { - "displayName": "recipes.category.original.organics" - }, - "original:personal_equipment": { - "displayName": "recipes.category.original.personal_equipment" - }, - "original:ship_equipment": { - "displayName": "recipes.category.original.ship_equipment" - } - } - }, - "shop": { - "categories": { - "original:featured": { - "displayName": "shop.category.original.featured" - }, - "original:ships": { - "displayName": "shop.category.original.ships" - }, - "original:personal_equipment": { - "displayName": "shop.category.original.personal_equipment" - }, - "original:ship_equipment": { - "displayName": "shop.category.original.ship_equipment" - }, - "original:consumables": { - "displayName": "shop.category.original.consumables" - }, - "original:materials": { - "displayName": "shop.category.original.materials" - }, - "original:premium": { - "displayName": "shop.category.original.premium" - } - } - }, - "skills": { - "categories": { - "original:combat": { - "displayName": "skills.category.original.combat" - }, - "original:crafting": { - "displayName": "skills.category.original.crafting" - }, - "original:science": { - "displayName": "skills.category.original.science" - } - } - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/skills/combat/engine_effiency.json b/game-server/datapacks/original/data/skills/combat/engine_effiency.json deleted file mode 100644 index d036020..0000000 --- a/game-server/datapacks/original/data/skills/combat/engine_effiency.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "skills": { - "id": "original:engine_effiency", - "displayName": "skills.category.original.combat.engine_effiency", - "description": "skills.category.original.combat.engine_effiency.desc", - "meta": { - "category": "original:combat", - "topLevel": 10, - "math": { - "start": 500, - "progressionCurve": 1.7 - } - } - } -} diff --git a/game-server/datapacks/original/data/skills/combat/shield_effiency.json b/game-server/datapacks/original/data/skills/combat/shield_effiency.json deleted file mode 100644 index 1627747..0000000 --- a/game-server/datapacks/original/data/skills/combat/shield_effiency.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "skills": { - "id": "original:shield_effiency", - "displayName": "skills.category.original.combat.shield_effiency", - "description": "skills.category.original.combat.shield_effiency.desc", - "meta": { - "category": "original:combat", - "topLevel": 10, - "math": { - "start": 500, - "progressionCurve": 1.7 - } - } - } -} diff --git a/game-server/datapacks/original/data/skills/combat/thruster_speed.json b/game-server/datapacks/original/data/skills/combat/thruster_speed.json deleted file mode 100644 index 9ae9427..0000000 --- a/game-server/datapacks/original/data/skills/combat/thruster_speed.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "skills": { - "id": "original:thruster_effiency", - "displayName": "skills.category.original.combat.thruster_effiency", - "description": "skills.category.original.combat.thruster_effiency.desc", - "meta": { - "category": "original:combat", - "topLevel": 10, - "math": { - "start": 500, - "progressionCurve": 1.7 - } - } - } -} diff --git a/game-server/datapacks/original/data/skills/combat/weapon_effiency.json b/game-server/datapacks/original/data/skills/combat/weapon_effiency.json deleted file mode 100644 index e9c985f..0000000 --- a/game-server/datapacks/original/data/skills/combat/weapon_effiency.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "skills": { - "id": "original:weapon_effiency", - "displayName": "skills.category.original.combat.weapon_effiency", - "description": "skills.category.original.combat.weapon_effiency.desc", - "meta": { - "category": "original:combat", - "topLevel": 10, - "math": { - "start": 500, - "progressionCurve": 1.7 - } - } - } -} diff --git a/game-server/datapacks/original/data/skills/crafting/alloying.json b/game-server/datapacks/original/data/skills/crafting/alloying.json deleted file mode 100644 index 041a31d..0000000 --- a/game-server/datapacks/original/data/skills/crafting/alloying.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "skills": { - "id": "original:alloying", - "displayName": "skills.category.original.crafting.alloying", - "description": "skills.category.original.crafting.alloying.desc", - "meta": { - "category": "crafting", - "topLevel": 10, - "math": { - "start": 500, - "progressionCurve": 1.7 - } - } - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/skills/crafting/circuit_assembly.json b/game-server/datapacks/original/data/skills/crafting/circuit_assembly.json deleted file mode 100644 index 51f00c5..0000000 --- a/game-server/datapacks/original/data/skills/crafting/circuit_assembly.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "skills": { - "id": "original:circuit_assembly", - "displayName": "skills.category.original.crafting.circuit_assembly", - "description": "skills.category.original.crafting.circuit_assembly.desc", - "meta": { - "category": "crafting", - "topLevel": 10, - "math": { - "start": 500, - "progressionCurve": 1.7 - } - } - } -} diff --git a/game-server/datapacks/original/data/skills/crafting/forging.json b/game-server/datapacks/original/data/skills/crafting/forging.json deleted file mode 100644 index 18605f8..0000000 --- a/game-server/datapacks/original/data/skills/crafting/forging.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "skills": { - "id": "original:forging", - "displayName": "skills.category.original.crafting.forging", - "description": "skills.category.original.crafting.forging.desc", - "meta": { - "category": "crafting", - "topLevel": 10, - "math": { - "start": 500, - "progressionCurve": 1.7 - } - } - } -} diff --git a/game-server/datapacks/original/data/skills/crafting/high_energetics.json b/game-server/datapacks/original/data/skills/crafting/high_energetics.json deleted file mode 100644 index 4e62213..0000000 --- a/game-server/datapacks/original/data/skills/crafting/high_energetics.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "skills": { - "id": "original:high_energetics", - "displayName": "skills.category.original.crafting.high_energetics", - "description": "skills.category.original.crafting.high_energetics.desc", - "meta": { - "category": "crafting", - "topLevel": 10, - "math": { - "start": 500, - "progressionCurve": 1.7 - } - } - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/skills/crafting/ship_manufacturing.json b/game-server/datapacks/original/data/skills/crafting/ship_manufacturing.json deleted file mode 100644 index 601fe32..0000000 --- a/game-server/datapacks/original/data/skills/crafting/ship_manufacturing.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "skills": { - "id": "original:ship_manufacturing", - "displayName": "skills.category.original.crafting.ship_manufacturing", - "description": "skills.category.original.crafting.ship_manufacturing.desc", - "meta": { - "category": "crafting", - "topLevel": 10, - "math": { - "start": 500, - "progressionCurve": 1.7 - } - } - } -} \ No newline at end of file diff --git a/game-server/datapacks/original/data/skills/science/alien_technology.json b/game-server/datapacks/original/data/skills/science/alien_technology.json deleted file mode 100644 index d4fd2a8..0000000 --- a/game-server/datapacks/original/data/skills/science/alien_technology.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "skills": { - "id": "original:alien_technology", - "displayName": "skills.category.original.science.alien_technology", - "description": "skills.category.original.science.alien_technology.desc", - "meta": { - "category": "science", - "topLevel": 10, - "math": { - "start": 500, - "progressionCurve": 1.7 - } - } - } -} diff --git a/game-server/datapacks/original/data/skills/science/biology_engineering.json b/game-server/datapacks/original/data/skills/science/biology_engineering.json deleted file mode 100644 index ae23983..0000000 --- a/game-server/datapacks/original/data/skills/science/biology_engineering.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "skills": { - "id": "original:biology_engineering", - "displayName": "skills.category.original.science.biology_engineering", - "description": "skills.category.original.science.biology_engineering.desc", - "meta": { - "category": "science", - "topLevel": 10, - "math": { - "start": 500, - "progressionCurve": 1.7 - } - } - } -} diff --git a/game-server/datapacks/original/manifest.json b/game-server/datapacks/original/manifest.json deleted file mode 100644 index 4dd5b14..0000000 --- a/game-server/datapacks/original/manifest.json +++ /dev/null @@ -1,226 +0,0 @@ -{ - "name": "original", - "version": "0.0.2", - "admin_item_list": { - "categories": { - "original:alloys": { - "displayName": "admin.category.original.item_list.alloys" - }, - "original:circuits": { - "displayName": "admin.category.original.item_list.circuits" - }, - "original:customizables": { - "displayName": "admin.category.original.item_list.customizables" - }, - "original:ingots": { - "displayName": "admin.category.original.item_list.ingots" - }, - "original:materials": { - "displayName": "admin.category.original.item_list.materials" - }, - "original:ores": { - "displayName": "admin.category.original.item_list.ores" - }, - "original:personal": { - "displayName": "admin.category.original.item_list.personal" - }, - "original:ships": { - "displayName": "admin.category.original.item_list.ships" - }, - "original:shields": { - "displayName": "admin.category.original.item_list.shields" - }, - "original:weapons": { - "displayName": "admin.category.original.item_list.weapons" - } - } - }, - "admin_hostiles_list": { - "categories": { - "original:ground": { - "displayName": "admin.category.original.hostile_list.ground" - }, - "original:ships": { - "displayName": "admin.category.original.hostile_list.ships" - } - } - }, - "admin_player_list": { - "categories": { - "original:members": { - "displayName": "admin.category.original.player_list.members" - }, - "original:moderators": { - "displayName": "admin.category.original.player_list.moderators" - }, - "original:admins": { - "displayName": "admin.category.original.player_list.admins" - } - } - }, - "admin_role": { - "categories": { - "original:members": { - "displayName": "admin.category.original.player_list.members" - }, - "original:moderators": { - "displayName": "admin.category.original.player_list.moderators" - }, - "original:admins": { - "displayName": "admin.category.original.player_list.admins" - } - } - }, - "core_systems": { - "categories": { - "original:personal_helmet": { - "displayName": "core_systems.category.original.person.helmet" - }, - "original:personal_suit": { - "displayName": "core_systems.category.original.person.suit" - }, - "original:personal_gloves": { - "displayName": "core_systems.category.original.person.gloves" - }, - "original:personal_backpack": { - "displayName": "core_systems.category.original.person.backpack" - }, - "original:personal_boots": { - "displayName": "core_systems.category.original.person.boots" - }, - "original:personal_accessory_1": { - "displayName": "core_systems.category.original.person.accessory_1" - }, - "original:personal_accessory_2": { - "displayName": "core_systems.category.original.person.accessory_2" - }, - "original:personal_accessory_3": { - "displayName": "core_systems.category.original.person.accessory_3" - }, - "original:personal_accessory_4": { - "displayName": "core_systems.category.original.person.accessory_4" - }, - "original:personal_weapons": { - "displayName": "core_systems.category.original.person.weapons" - }, - "original:ship_hull": { - "displayName": "core_systems.category.original.ship.hull" - }, - "original:ship_shields": { - "displayName": "core_systems.category.original.ship.shields" - }, - "original:ship_engines": { - "displayName": "core_systems.category.original.ship.engines" - }, - "original:ship_weapon_1": { - "displayName": "core_systems.category.original.ship.weapon_1" - }, - "original:ship_weapon_2": { - "displayName": "core_systems.category.original.ship.weapon_2" - }, - "original:ship_thruster_1": { - "displayName": "core_systems.category.original.ship.thruster_1" - }, - "original:ship_thruster_2": { - "displayName": "core_systems.category.original.ship.thruster_2" - }, - "original:ship_thruster_3": { - "displayName": "core_systems.category.original.ship.thruster_3" - }, - "original:ship_thruster_4": { - "displayName": "core_systems.category.original.ship.thruster_4" - } - } - }, - "quests": { - "categories": { - "original:story": { - "displayName": "quests.category.original.story" - }, - "original:daily": { - "displayName": "quests.category.original.daily" - }, - "original:weekly": { - "displayName": "quests.category.original.weekly" - }, - "original:monthly": { - "displayName": "quests.category.original.monthly" - }, - "original:seasonal": { - "displayName": "quests.category.original.seasonal" - } - } - }, - "recipes": { - "categories": { - "original:alloys": { - "displayName": "recipes.category.original.alloys" - }, - "original:circuits": { - "displayName": "recipes.category.original.circuits" - }, - "original:crystals": { - "displayName": "recipes.category.original.crystals" - }, - "original:food": { - "displayName": "recipes.category.original.food" - }, - "original:forging": { - "displayName": "recipes.category.original.forging" - }, - "original:hull_sections": { - "displayName": "recipes.category.original.hull_sections" - }, - "original:hulls": { - "displayName": "recipes.category.original.hulls" - }, - "original:organics": { - "displayName": "recipes.category.original.organics" - }, - "original:personal_equipment": { - "displayName": "recipes.category.original.personal_equipment" - }, - "original:ship_equipment": { - "displayName": "recipes.category.original.ship_equipment" - } - } - }, - "shop": { - "categories": { - "original:featured": { - "displayName": "shop.category.original.featured" - }, - "original:ships": { - "displayName": "shop.category.original.ships" - }, - "original:personal_equipment": { - "displayName": "shop.category.original.personal_equipment" - }, - "original:ship_equipment": { - "displayName": "shop.category.original.ship_equipment" - }, - "original:consumables": { - "displayName": "shop.category.original.consumables" - }, - "original:materials": { - "displayName": "shop.category.original.materials" - }, - "original:premium": { - "displayName": "shop.category.original.premium" - } - } - }, - "skills": { - "categories": { - "original:combat": { - "displayName": "skills.category.original.combat" - }, - "original:crafting": { - "displayName": "skills.category.original.crafting" - }, - "original:science": { - "displayName": "skills.category.original.science" - } - } - } -} \ No newline at end of file diff --git a/game-server/package.json b/game-server/package.json deleted file mode 100644 index 0b55fcd..0000000 --- a/game-server/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "game-server", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "start": "node ./src/index.js" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "commonjs", - "dependencies": { - "axios": "^1.13.6", - "chokidar": "^5.0.0", - "cors": "^2.8.6", - "dotenv": "^17.3.1", - "express": "^5.2.1", - "jsonwebtoken": "^9.0.3", - "pg": "^8.20.0", - "sequelize": "^6.37.8", - "socket.io": "^4.8.3", - "sqlite3": "^6.0.1" - }, - "devDependencies": { - "concurrently": "^9.2.1" - } -} diff --git a/game-server/src/config/config.js b/game-server/src/config/config.js deleted file mode 100644 index d946a57..0000000 --- a/game-server/src/config/config.js +++ /dev/null @@ -1,14 +0,0 @@ -require("dotenv").config(); - -const config = { - port: process.env.PORT || 4000, - apiBaseUrl: process.env.API_SERVER_URL, - serverName: process.env.SERVER_NAME, - serverSecret: process.env.SERVER_SECRET, - serverDescription: process.env.DESCRIPTION, - serverRegion: process.env.REGION, - dbUri: process.env.DB_URI || "local", - host: process.env.HOST, -}; - -module.exports = config; diff --git a/game-server/src/config/db.js b/game-server/src/config/db.js deleted file mode 100644 index 294bcda..0000000 --- a/game-server/src/config/db.js +++ /dev/null @@ -1,49 +0,0 @@ -const { Sequelize } = require("sequelize"); -const config = require("./config"); // Шлях до твого файлу з конфігом - -const isLocal = config.dbUri === "local"; - -const sequelize = isLocal - ? new Sequelize({ - dialect: "sqlite", - storage: "./database.sqlite", - logging: false, - dialectOptions: { timeout: 20000 }, - pool: { max: 1, min: 1, idle: 10000, acquire: 30000 }, - }) - : new Sequelize(config.dbUri, { - dialect: "postgres", - logging: false, - dialectOptions: { - ssl: { - require: true, - rejectUnauthorized: false, - }, - }, - pool: { max: 5, min: 0, idle: 10000, acquire: 30000 }, - }); - -sequelize.initDatabase = async () => { - try { - await sequelize.authenticate(); - - if (isLocal) { - await sequelize.query("PRAGMA journal_mode=WAL;"); - await sequelize.query("PRAGMA foreign_keys = OFF;"); - } - - await sequelize.sync(); - - if (isLocal) { - await sequelize.query("PRAGMA foreign_keys = ON;"); - } - - console.log(`✅ Database connected (${isLocal ? "SQLite" : "Postgres"})`); - return true; - } catch (error) { - console.error("❌ Database Init Error:", error); - throw error; - } -}; - -module.exports = sequelize; diff --git a/game-server/src/game/AdminManager.js b/game-server/src/game/AdminManager.js deleted file mode 100644 index 452112d..0000000 --- a/game-server/src/game/AdminManager.js +++ /dev/null @@ -1,91 +0,0 @@ -const { Player, Inventory } = require("../models"); -const DatapackLoader = require("../game/DatapackLoader"); -const notificationManager = require("./NotificationManager"); - -class AdminManager { - constructor() { - this.io = null; - } - - init(io) { - this.io = io; - } - - async giveItem(targetName, itemId, amount) { - const targetPlayer = await Player.findOne({ - where: { username: targetName }, - }); - if (!targetPlayer) throw new Error(`Player '${targetName}' not found.`); - - const itemData = DatapackLoader.getItem(itemId); - if (!itemData) throw new Error(`Item ID '${itemId}' does not exist.`); - - const [inventoryItem, created] = await Inventory.findOrCreate({ - where: { playerId: targetPlayer.id, itemId: itemId }, - defaults: { quantity: amount }, - }); - - if (!created) { - await inventoryItem.increment("quantity", { by: amount }); - } - - await notificationManager.send({ - playerId: targetPlayer.id, - type: "item_received", - title: "Items Received", - message: `Admin granted you ${amount}x ${itemData.name || itemId}.`, - data: { itemId, amount }, - priority: "normal", - }); - - this._updatePlayerInventory(targetPlayer.id); - return { targetName, itemId, amount }; - } - - async clearInventory(targetName) { - const targetPlayer = await Player.findOne({ - where: { username: targetName }, - }); - if (!targetPlayer) throw new Error(`Player '${targetName}' not found.`); - - await Inventory.destroy({ where: { playerId: targetPlayer.id } }); - - await notificationManager.send({ - playerId: targetPlayer.id, - type: "inventory_clear", - title: "Inventory Wiped", - message: "Your inventory has been cleared by an administrator.", - priority: "high", - }); - - this._updatePlayerInventory(targetPlayer.id, true); - return targetName; - } - - async reloadData() { - DatapackLoader.loadAll(); - if (this.io) { - this.io.emit("admin:log", "System: Datapacks reloaded by admin."); - } - } - - async _updatePlayerInventory(playerId, isEmpty = false) { - if (!this.io) return; - - const targetSocket = [...this.io.sockets.sockets.values()].find( - (s) => s.user?.id === playerId, - ); - - if (targetSocket) { - const items = isEmpty - ? [] - : await Inventory.findAll({ - where: { playerId }, - attributes: ["itemId", "quantity"], - }); - targetSocket.emit("player:inventory_data", items); - } - } -} - -module.exports = new AdminManager(); diff --git a/game-server/src/game/ChatManager.js b/game-server/src/game/ChatManager.js deleted file mode 100644 index 7e168e9..0000000 --- a/game-server/src/game/ChatManager.js +++ /dev/null @@ -1,94 +0,0 @@ -const Player = require("../models/Player"); -const { Op } = require("sequelize"); -const Message = require("../models/Message.js"); - -class ChatManager { - async getGlobalHistory(limit = 50) { - try { - return await Message.findAll({ - where: { type: "global" }, - limit, - order: [["createdAt", "ASC"]], - include: [ - { - model: Player, - as: "sender", - attributes: ["username"], - }, - ], - }); - } catch (error) { - console.error("History Error:", error); - return []; - } - } - - async saveMessage({ content, type, senderId, receiverId = null }) { - try { - const newMessage = await Message.create({ - content, - type, - senderId, - receiverId, - }); - const sender = await Player.findByPk(senderId, { - attributes: ["username"], - }); - - return { - id: newMessage.id, - content: newMessage.content, - type: newMessage.type, - senderId: newMessage.senderId, - senderName: sender ? sender.username : "Unknown", - receiverId: newMessage.receiverId, - createdAt: newMessage.createdAt, - }; - } catch (error) { - console.error("Save Message Error:", error); - throw error; - } - } - async getPrivateHistory(myId, friendId, limit = 50) { - try { - return await Message.findAll({ - where: { - type: "private", - [Op.or]: [ - { senderId: myId, receiverId: friendId }, - { senderId: friendId, receiverId: myId }, - ], - }, - limit, - order: [["createdAt", "ASC"]], - include: [ - { - model: Player, - as: "sender", - attributes: ["username"], - }, - ], - }); - } catch (error) { - console.error("Private History Error:", error); - return []; - } - } - async searchPlayers(query, excludeId) { - try { - return await Player.findAll({ - where: { - username: { [Op.like]: `%${query}%` }, - id: { [Op.ne]: excludeId }, - }, - attributes: ["id", "username", "level"], - limit: 10, - }); - } catch (error) { - console.error("Search Error:", error); - return []; - } - } -} - -module.exports = new ChatManager(); diff --git a/game-server/src/game/CombatService.js b/game-server/src/game/CombatService.js deleted file mode 100644 index 5b37840..0000000 --- a/game-server/src/game/CombatService.js +++ /dev/null @@ -1,115 +0,0 @@ -const DatapackLoader = require("./DatapackLoader"); - -class CombatService { - initializeBattle(player, hostiles) { - const equipmentStats = this.calculateEquipmentStats(player.equipment); - - const playerMaxHp = 100 + (equipmentStats.health || 0); - const playerAtk = 25 + (equipmentStats.attack || 0); - const playerDef = equipmentStats.defence || 0; - const playerRes = equipmentStats.resistance || 0; - - const battle = { - player: { - id: player.id, - name: player.username || "Commander", - hp: playerMaxHp, - maxHp: playerMaxHp, - atk: playerAtk, - def: playerDef, - res: playerRes, - stats: equipmentStats, - }, - enemies: hostiles.map((h, index) => { - const hHp = h.stats?.health || 50; - return { - ...h, - instanceId: `mob_${index}`, - id: h.id, - name: h.displayName || h.name || `Hostile ${index + 1}`, - hp: hHp, - maxHp: hHp, - atk: h.stats?.attack || 10, - def: h.stats?.defence || 0, - res: h.stats?.resistance || 0, - isDead: false, - rewardGiven: false, - gainXp: h.gainXp || 0, - credits: h.credits || 0, - loot: h.loot || [], - }; - }), - turnOrder: ["player", ...hostiles.map((_, i) => `mob_${i}`)], - currentTurnIndex: 0, - turnStartTime: Date.now(), - isOver: false, - }; - - return battle; - } - - calculateEquipmentStats(equipment) { - const totals = { health: 0, attack: 0, defence: 0, resistance: 0 }; - if (!equipment) return totals; - - Object.values(equipment).forEach((itemId) => { - if (!itemId) return; - const itemData = DatapackLoader.getItem(itemId); - if (itemData && itemData.stats) { - Object.entries(itemData.stats).forEach(([key, value]) => { - const lowerKey = key.toLowerCase(); - if (lowerKey.includes("health") || lowerKey === "hp") - totals.health += value; - else if (lowerKey.includes("attack") || lowerKey.includes("atk")) - totals.attack += value; - else if (lowerKey.includes("def")) totals.defence += value; - else if (lowerKey.includes("res")) totals.resistance += value; - }); - } - }); - return totals; - } - - handleAttack(battle, targetInstanceId) { - const attackerId = battle.turnOrder[battle.currentTurnIndex]; - const log = []; - - if (attackerId === "player") { - const target = battle.enemies.find( - (e) => e.instanceId === targetInstanceId, - ); - if (target && !target.isDead) { - const dmg = Math.max( - 1, - Math.round(battle.player.atk - target.def * 0.5), - ); - target.hp = Math.max(0, target.hp - dmg); - log.push(`Commander dealt ${dmg} damage to ${target.name}`); - if (target.hp === 0) { - target.isDead = true; - log.push(`${target.name} neutralized.`); - } - } - } else { - const enemy = battle.enemies.find((e) => e.instanceId === attackerId); - if (enemy && !enemy.isDead && battle.player.hp > 0) { - const dmg = Math.max( - 1, - Math.round(enemy.atk - battle.player.def * 0.5), - ); - battle.player.hp = Math.max(0, battle.player.hp - dmg); - log.push(`${enemy.name} deals ${dmg} damage to Commander`); - if (battle.player.hp === 0) battle.isOver = true; - } - } - return log; - } - - handleSkip(battle) { - return [ - `Sequence timeout: ${battle.turnOrder[battle.currentTurnIndex]} skipped turn.`, - ]; - } -} - -module.exports = new CombatService(); diff --git a/game-server/src/game/CraftManager.js b/game-server/src/game/CraftManager.js deleted file mode 100644 index 2364a5c..0000000 --- a/game-server/src/game/CraftManager.js +++ /dev/null @@ -1,71 +0,0 @@ -const datapackLoader = require("../game/DatapackLoader"); -const { Inventory } = require("../models"); - -class CraftManager { - constructor() { - this.activeCrafts = new Map(); - } - - async startCraft(userId, recipeId, socket) { - if (this.activeCrafts.has(userId)) return { error: "Already crafting" }; - - const recipe = datapackLoader.getRecipe(recipeId); - if (!recipe) return { error: "Recipe not found" }; - - const craftTimeMs = (recipe.time_seconds || 0) * 1000; - const finishAt = Date.now() + craftTimeMs; - - const craftData = { - recipeId, - finishAt, - totalTime: recipe.time_seconds, - timer: setTimeout( - () => this.completeCraft(userId, recipeId, socket), - craftTimeMs, - ), - }; - - this.activeCrafts.set(userId, craftData); - return { recipeId, finishAt, totalTime: recipe.time_seconds }; - } - - async completeCraft(userId, recipeId, socket) { - try { - const recipe = datapackLoader.getRecipe(recipeId); - const outputItemId = Object.keys(recipe.output)[0]; - const outputQuantity = recipe.output[outputItemId]; - - const [newItem, created] = await Inventory.findOrCreate({ - where: { playerId: userId, itemId: outputItemId }, - defaults: { quantity: outputQuantity }, - }); - - if (!created) { - await newItem.increment("quantity", { by: outputQuantity }); - } - - this.activeCrafts.delete(userId); - - if (socket && socket.connected) { - socket.emit("player:craft_success", { recipeId }); - socket.emit("player:get_inventory"); - } - } catch (err) { - console.error("Complete craft error:", err); - } - } - - getExistingCraft(userId) { - const craft = this.activeCrafts.get(userId); - if (craft && craft.finishAt > Date.now()) { - return { - recipeId: craft.recipeId, - finishAt: craft.finishAt, - totalTime: craft.totalTime, - }; - } - return null; - } -} - -module.exports = new CraftManager(); diff --git a/game-server/src/game/DatapackLoader.js b/game-server/src/game/DatapackLoader.js deleted file mode 100644 index ffb1eec..0000000 --- a/game-server/src/game/DatapackLoader.js +++ /dev/null @@ -1,233 +0,0 @@ -const fs = require("fs"); -const path = require("path"); -const chokidar = require("chokidar"); - -class DatapackLoader { - constructor() { - this.registry = { - items: new Map(), - recipes: new Map(), - skills: new Map(), - dungeons: new Map(), - enemies: new Map(), - rooms: new Map(), - quests: new Map(), - languages: new Map(), - manifest: {}, - }; - this.rootPath = null; - } - - init(datapacksRoot, io = null) { - this.rootPath = datapacksRoot || path.join(__dirname, "../../datapacks"); - if (!fs.existsSync(this.rootPath)) return; - this.loadAll(); - if (io) this.watch(io); - } - - deepMerge(target, source) { - for (const key in source) { - if (source[key] instanceof Object && key in target) { - Object.assign(source[key], this.deepMerge(target[key], source[key])); - } - } - Object.assign(target || {}, source); - return target; - } - - loadAll() { - Object.values(this.registry).forEach((val) => { - if (val instanceof Map) val.clear(); - }); - this.registry.manifest = {}; - let manifestCount = 0; - - const packs = fs - .readdirSync(this.rootPath, { withFileTypes: true }) - .filter((d) => d.isDirectory()) - .map((d) => d.name) - .sort((a, b) => (a === "original" ? -1 : 1)); - - packs.forEach((packName) => { - const packPath = path.join(this.rootPath, packName); - const dataPath = path.join(packPath, "data"); - const langPath = path.join(packPath, "assets/languages"); - const manifestPath = path.join(packPath, "manifest.json"); - - if (fs.existsSync(manifestPath)) { - try { - const manifestContent = JSON.parse( - fs.readFileSync(manifestPath, "utf8"), - ); - this.deepMerge(this.registry.manifest, manifestContent); - manifestCount++; - } catch (err) { - console.error(`❌ Manifest Error [${packName}]:`, err.message); - } - } - - if (fs.existsSync(dataPath)) this.loadRecursive(dataPath, packName); - if (fs.existsSync(langPath)) this.loadLanguages(langPath); - }); - - console.log( - `🚀 Registry Ready: ${this.registry.items.size} Items, ${this.registry.dungeons.size} Dungeons, ${this.registry.quests.size} Quests, ${this.registry.languages.size} Langs, ${manifestCount} Manifests ${this.registry.rooms.size} Rooms`, - ); - } - - getRecipe(id) { - return this.registry.recipes.get(id); - } - - getRecipesByCategory(category) { - const allRecipes = Array.from(this.registry.recipes.values()); - return allRecipes.filter((r) => r.category === category); - } - - getRecipeCategories() { - const allRecipes = Array.from(this.registry.recipes.values()); - const categories = new Set( - allRecipes.map((r) => r.category).filter(Boolean), - ); - return Array.from(categories); - } - - loadLanguages(langPath) { - try { - const files = fs.readdirSync(langPath).filter((f) => f.endsWith(".json")); - files.forEach((file) => { - const langCode = path.basename(file, ".json"); - const fullPath = path.join(langPath, file); - const newContent = JSON.parse(fs.readFileSync(fullPath, "utf8")); - - if (!this.registry.languages.has(langCode)) { - this.registry.languages.set(langCode, {}); - } - - const currentDict = this.registry.languages.get(langCode); - this.deepMerge(currentDict, newContent); - }); - } catch (err) { - console.error(`❌ Language Load Error:`, err.message); - } - } - - watch(io) { - const watcher = chokidar.watch(this.rootPath, { - persistent: true, - ignoreInitial: true, - }); - watcher.on("all", (event, filePath) => { - if (filePath.endsWith(".json")) { - console.log(`🔄 Datapack change detected: ${path.basename(filePath)}`); - this.loadAll(); - io.emit( - "admin:log", - `System: Datapacks reloaded (${path.basename(filePath)})`, - ); - io.emit("system:data_updated", this.getStaticData()); - } - }); - } - - loadRecursive(dirPath, packName) { - const entries = fs.readdirSync(dirPath, { withFileTypes: true }); - for (const entry of entries) { - const fullPath = path.join(dirPath, entry.name); - if (entry.isDirectory()) { - this.loadRecursive(fullPath, packName); - } else if (entry.isFile() && entry.name.endsWith(".json")) { - this.parseFile(fullPath, packName); - } - } - } - - parseFile(filePath, packName) { - try { - const fileContent = fs.readFileSync(filePath, "utf8"); - const json = JSON.parse(fileContent); - const typeKey = Object.keys(json)[0]; - const data = json[typeKey]; - if (!data) return; - - const fullId = `${data.id}`; - - switch (typeKey) { - case "armour": - case "plating": - case "materials": - case "weapons": - data.type = typeKey; - this.registry.items.set(fullId, data); - break; - case "recipe": - const recipeId = json.craft?.id || data.id; - this.registry.recipes.set(recipeId, { ...json.craft, ...data }); - break; - case "skills": - this.registry.skills.set(fullId, data); - break; - case "dungeon": - this.registry.dungeons.set(fullId, data); - break; - case "hostile": - this.registry.enemies.set(fullId, data); - break; - case "rooms": - this.registry.rooms.set(fullId, data); - break; - case "quest": - this.registry.quests.set(fullId, data); - break; - } - } catch (err) { - console.error(`❌ Parse Error [${filePath}]:`, err.message); - } - } - - getItem(id) { - return this.registry.items.get(id); - } - - getEnemy(id) { - return this.registry.enemies.get(id); - } - - getDungeon(id) { - return this.registry.dungeons.get(id); - } - - getRoom(id) { - return this.registry.rooms.get(id); - } - - getQuest(id) { - return this.registry.quests.get(id); - } - - getAutoStartQuests() { - return Array.from(this.registry.quests.values()).filter( - (q) => q.meta?.autoAccept, - ); - } - - getRecipes() { - return Array.from(this.registry.recipes.values()); - } - - getStaticData() { - return { - items: Array.from(this.registry.items.values()), - recipes: Array.from(this.registry.recipes.values()), - skills: Array.from(this.registry.skills.values()), - dungeons: Array.from(this.registry.dungeons.values()), - enemies: Array.from(this.registry.enemies.values()), - rooms: Array.from(this.registry.rooms.values()), - quests: Array.from(this.registry.quests.values()), - languages: Object.fromEntries(this.registry.languages), - manifest: this.registry.manifest, - }; - } -} - -module.exports = new DatapackLoader(); diff --git a/game-server/src/game/DungeonManager.js b/game-server/src/game/DungeonManager.js deleted file mode 100644 index e9e6226..0000000 --- a/game-server/src/game/DungeonManager.js +++ /dev/null @@ -1,224 +0,0 @@ -const DatapackLoaderRef = require("./DatapackLoader"); -const CombatServiceRef = require("./CombatService"); -const QuestsManager = require("./QuestsManager"); -const { Player } = require("../models"); - -class DungeonManager { - constructor() { - this.activeSessions = new Map(); - } - - async startDungeon(playerId, dungeonId) { - const dungeon = DatapackLoaderRef.getDungeon(dungeonId); - if (!dungeon || !dungeon.rooms?.length) return null; - - const player = await Player.findByPk(playerId); - const session = { - playerId, - dungeonId, - currentRoomIndex: 0, - isFinished: false, - battle: null, - rewards: { xp: 0, credits: 0, items: [] }, - }; - - this.activeSessions.set(playerId, session); - return this.initRoom(playerId, player); - } - - async initRoom(playerId, playerInstance = null) { - const session = this.activeSessions.get(playerId); - if (!session) return null; - const roomData = this.getCurrentRoomData(playerId); - const player = playerInstance || (await Player.findByPk(playerId)); - - if (roomData.hostiles.length > 0) { - session.battle = CombatServiceRef.initializeBattle( - player, - roomData.hostiles, - ); - } else { - session.battle = null; - } - return { ...roomData, battle: session.battle }; - } - - getCurrentRoomData(playerId) { - const session = this.activeSessions.get(playerId); - const dungeon = DatapackLoaderRef.getDungeon(session.dungeonId); - const roomRef = dungeon.rooms[session.currentRoomIndex]; - const rawRoom = DatapackLoaderRef.getRoom(roomRef.id); - const hostiles = (rawRoom.hostiles || []) - .map((hId) => DatapackLoaderRef.getEnemy(hId)) - .filter(Boolean); - - return { - roomIndex: session.currentRoomIndex, - totalRooms: dungeon.rooms.length, - config: rawRoom, - hostiles, - }; - } - - processCombatAction(playerId, targetInstanceId, socket = null) { - const session = this.activeSessions.get(playerId); - if (!session || !session.battle || session.battle.isOver) return null; - - const battle = session.battle; - if (battle.turnOrder[battle.currentTurnIndex] !== "player") return null; - - let logMessages; - if (!targetInstanceId) { - logMessages = CombatServiceRef.handleSkip(battle); - } else { - logMessages = CombatServiceRef.handleAttack(battle, targetInstanceId); - } - - const playerAction = { - attackerId: "player", - messages: logMessages, - hpState: this._captureHpState(battle), - }; - - return this._afterAction(session, [playerAction], socket); - } - - _captureHpState(battle) { - return { - playerHp: battle.player.hp, - enemies: battle.enemies.map((e) => ({ - id: e.instanceId, - hp: e.hp, - isDead: e.isDead, - })), - }; - } - - _afterAction(session, actionLogs, socket) { - const battle = session.battle; - - battle.enemies.forEach((enemy) => { - if (enemy.isDead && !enemy.rewardGiven) { - enemy.rewardGiven = true; - session.rewards.xp += enemy.gainXp || 0; - session.rewards.credits += enemy.credits || 0; - - if (enemy.loot && Array.isArray(enemy.loot)) { - const lootMessages = this._distributeLoot(session, enemy.loot); - actionLogs.push(...lootMessages); - } - - QuestsManager.trackProgress( - session.playerId, - "KILL_ENEMY", - enemy.id, - 1, - socket, - ); - } - }); - - const allEnemiesDead = battle.enemies.every((e) => e.isDead); - - if (allEnemiesDead) { - battle.isOver = true; - const roomConfig = this.getCurrentRoomData(session.playerId).config; - if (roomConfig && !roomConfig.rewardGiven) { - roomConfig.rewardGiven = true; - session.rewards.xp += roomConfig.gainXp || 0; - session.rewards.credits += roomConfig.credits || 0; - if (roomConfig.loot) this._distributeLoot(session, roomConfig.loot); - } - return { battle, log: actionLogs, status: "victory" }; - } - - if (battle.player.hp <= 0) { - battle.isOver = true; - return { battle, log: actionLogs, status: "defeat" }; - } - - return this._nextTurn(session, actionLogs); - } - - _distributeLoot(session, lootTable) { - const rewardsLog = []; - lootTable.forEach((item) => { - if (Math.random() <= (item.chance || 1)) { - let finalCount = 0; - if (typeof item.count === "object" && item.count !== null) { - const min = item.count.min || 0; - const max = item.count.max || 1; - finalCount = Math.floor(Math.random() * (max - min + 1)) + min; - } else { - finalCount = Number(item.count) || 1; - } - - if (finalCount > 0) { - const existing = session.rewards.items.find((i) => i.id === item.id); - if (existing) { - existing.count += finalCount; - } else { - session.rewards.items.push({ id: item.id, count: finalCount }); - } - const shortName = item.id.split(":").pop().replace("_", " "); - rewardsLog.push( - `RECOVERED: ${finalCount}x ${shortName.toUpperCase()}`, - ); - } - } - }); - return rewardsLog; - } - - _nextTurn(session, accumulatedLogs = []) { - const battle = session.battle; - battle.currentTurnIndex = - (battle.currentTurnIndex + 1) % battle.turnOrder.length; - battle.turnStartTime = Date.now(); - - const currentId = battle.turnOrder[battle.currentTurnIndex]; - if (currentId === "player") return { battle, log: accumulatedLogs }; - - const enemy = battle.enemies.find((e) => e.instanceId === currentId); - if (!enemy || enemy.isDead) return this._nextTurn(session, accumulatedLogs); - - const enemyMessages = CombatServiceRef.handleAttack(battle, null); - accumulatedLogs.push({ - attackerId: currentId, - messages: enemyMessages, - hpState: this._captureHpState(battle), - }); - - if (battle.player.hp <= 0 || battle.enemies.every((e) => e.isDead)) { - return this._afterAction(session, accumulatedLogs); - } - - return this._nextTurn(session, accumulatedLogs); - } - - async moveToNextRoom(playerId) { - const session = this.activeSessions.get(playerId); - if (!session) return { error: "Session not found" }; - - if (session.isFinished) { - return { status: "completed", rewards: session.rewards }; - } - - const dungeon = DatapackLoaderRef.getDungeon(session.dungeonId); - - if (session.currentRoomIndex < dungeon.rooms.length - 1) { - session.currentRoomIndex++; - const newRoomData = await this.initRoom(playerId); - return { status: "next_room", ...newRoomData }; - } else { - session.isFinished = true; - return { status: "completed", rewards: session.rewards }; - } - } - - leaveDungeon(playerId) { - this.activeSessions.delete(playerId); - } -} - -module.exports = new DungeonManager(); diff --git a/game-server/src/game/EconomyService.js b/game-server/src/game/EconomyService.js deleted file mode 100644 index d2d4adb..0000000 --- a/game-server/src/game/EconomyService.js +++ /dev/null @@ -1,71 +0,0 @@ -const Player = require("../models/Player"); -const { Op } = require("sequelize"); - -class EconomyService { - constructor() { - this.onlinePlayers = new Set(); - } - - init(io) { - setInterval(async () => { - if (this.onlinePlayers.size === 0) return; - - const ids = Array.from(this.onlinePlayers); - try { - await Player.increment("credits", { - by: 1, - where: { id: { [Op.in]: ids } }, - }); - - await Player.update( - { lastCreditUpdate: new Date() }, - { where: { id: { [Op.in]: ids } } }, - ); - - const updatedPlayers = await Player.findAll({ - where: { id: { [Op.in]: ids } }, - attributes: ["id", "credits"], - }); - - updatedPlayers.forEach((p) => { - const targetSocket = Array.from(io.sockets.sockets.values()).find( - (s) => s.playerId === p.id, - ); - - if (targetSocket) { - targetSocket.emit("player:credits_update", { - totalCredits: p.credits, - }); - } - }); - } catch (err) { - console.error("Economy online error:", err); - } - }, 10000); - } - - addPlayer(id) { - this.onlinePlayers.add(id); - } - removePlayer(id) { - this.onlinePlayers.delete(id); - } - - async handleOfflineEarnings(player) { - const now = new Date(); - const lastUpdate = new Date(player.lastCreditUpdate || player.updatedAt); - const secondsPassed = Math.floor((now - lastUpdate) / 1000); - - const offlineCredits = Math.floor(secondsPassed / 20); - - if (offlineCredits > 0) { - await player.increment("credits", { by: offlineCredits }); - await player.reload(); - await player.update({ lastCreditUpdate: now }); - return offlineCredits; - } - return 0; - } -} - -module.exports = new EconomyService(); diff --git a/game-server/src/game/InventoryManager.js b/game-server/src/game/InventoryManager.js deleted file mode 100644 index 5fa74cb..0000000 --- a/game-server/src/game/InventoryManager.js +++ /dev/null @@ -1,58 +0,0 @@ -const { Player, Inventory } = require("../models"); -const DatapackLoader = require("./DatapackLoader"); - -class InventoryManager { - async getInventory(playerId) { - return await Inventory.findAll({ - where: { playerId }, - attributes: ["itemId", "quantity"], - }); - } - - async getEquipment(playerId) { - const player = await Player.findByPk(playerId); - return player ? player.equipment : {}; - } - - async equipItem(playerId, itemId, slot) { - const hasItem = await Inventory.findOne({ where: { playerId, itemId } }); - if (!hasItem) throw new Error("ITEM_NOT_FOUND"); - - const itemInfo = DatapackLoader.getItem(itemId); - if (!itemInfo) throw new Error("INVALID_ITEM_DATA"); - - const allowedSlot = itemInfo.meta?.equipmentSlot; - if (allowedSlot !== slot) { - throw new Error("INVALID_SLOT_FOR_ITEM"); - } - - const player = await Player.findByPk(playerId); - if (!player) throw new Error("PLAYER_NOT_FOUND"); - - const currentEquip = player.equipment; - currentEquip[slot] = itemId; - - player.equipment = currentEquip; - player.changed("equipment", true); - await player.save(); - - return itemInfo; - } - - async unequipItem(playerId, slot) { - const player = await Player.findByPk(playerId); - if (!player) throw new Error("PLAYER_NOT_FOUND"); - - const currentEquip = player.equipment; - if (currentEquip[slot]) { - delete currentEquip[slot]; - player.equipment = currentEquip; - player.changed("equipment", true); - await player.save(); - } - - return true; - } -} - -module.exports = new InventoryManager(); diff --git a/game-server/src/game/NotificationManager.js b/game-server/src/game/NotificationManager.js deleted file mode 100644 index 9a97e09..0000000 --- a/game-server/src/game/NotificationManager.js +++ /dev/null @@ -1,94 +0,0 @@ -const Notification = require("../models/Notification"); - -class NotificationManager { - constructor() { - this.io = null; - } - - init(io) { - this.io = io; - console.log("[NotificationManager] Initialized with Socket.io"); - } - - async send({ - playerId, - type = "info", - title, - message, - data = {}, - priority = "normal", - }) { - try { - const notification = await Notification.create({ - playerId, - type, - title, - message, - data, - priority, - isRead: false, - }); - - const targetSocket = this._getSocketByPlayerId(playerId); - - if (targetSocket) { - targetSocket.emit("notification:new", notification); - - const unreadCount = await this.getUnreadCount(playerId); - targetSocket.emit("notifications:unread_count", unreadCount); - } - - return notification; - } catch (error) { - console.error( - `[NotificationManager] Error sending to ${playerId}:`, - error, - ); - } - } - - _getSocketByPlayerId(playerId) { - if (!this.io) return null; - return [...this.io.sockets.sockets.values()].find( - (s) => s.user?.id === playerId, - ); - } - async getPlayerHistory(playerId, limit = 50) { - return await Notification.findAll({ - where: { playerId }, - order: [["createdAt", "DESC"]], - limit, - }); - } - - async getUnreadCount(playerId) { - return await Notification.count({ - where: { playerId, isRead: false }, - }); - } - - async markAsRead(notificationId, playerId) { - await Notification.update( - { isRead: true }, - { where: { id: notificationId, playerId } }, - ); - return await this.getUnreadCount(playerId); - } - - async markAllAsRead(playerId) { - await Notification.update( - { isRead: true }, - { where: { playerId, isRead: false } }, - ); - return 0; - } - - async delete(notificationId, playerId) { - await Notification.destroy({ - where: { id: notificationId, playerId }, - }); - return await this.getUnreadCount(playerId); - } -} - -module.exports = new NotificationManager(); diff --git a/game-server/src/game/QuestsManager.js b/game-server/src/game/QuestsManager.js deleted file mode 100644 index b5f2909..0000000 --- a/game-server/src/game/QuestsManager.js +++ /dev/null @@ -1,163 +0,0 @@ -const DatapackLoader = require("./DatapackLoader"); -const { PlayerQuest, Player, Inventory, sequelize } = require("../models"); - -class QuestsManager { - async onPlayerLogin(playerId, socket = null) { - try { - await this.checkAutoQuests(playerId, socket); - await this.trackProgress(playerId, "LOGIN", null, 1, socket); - } catch (err) { - console.error(err); - } - } - - async checkAutoQuests(playerId, socket = null) { - const allQuests = Array.from(DatapackLoader.registry.quests); - const player = await Player.findByPk(playerId); - - for (const quest of allQuests) { - if (quest.meta?.autoAccept && player.level >= (quest.minLevel || 0)) { - const [pq, created] = await PlayerQuest.findOrCreate({ - where: { playerId, questId: quest.id }, - defaults: { - status: "active", - progress: quest.objectives.map((obj) => ({ - ...obj, - currentAmount: 0, - })), - }, - }); - - if (created && socket) { - socket.emit("quest:new", { - id: pq.questId, - status: pq.status, - objectives: pq.progress, - }); - } - } - } - } - - async trackProgress(playerId, type, targetId, amount = 1, socket = null) { - try { - const activeQuests = await PlayerQuest.findAll({ - where: { playerId, status: "active" }, - }); - - for (const pq of activeQuests) { - const staticData = DatapackLoader.getQuest(pq.questId); - if (!staticData) continue; - - let isChanged = false; - const currentProgress = pq.progress; - - const updatedProgress = currentProgress.map((obj) => { - if ( - obj.type === type && - (obj.targetId === targetId || type === "LOGIN") - ) { - if (obj.currentAmount < obj.requiredAmount) { - obj.currentAmount = Math.min( - obj.currentAmount + amount, - obj.requiredAmount, - ); - isChanged = true; - } - } - return obj; - }); - - if (isChanged) { - const isReady = updatedProgress.every( - (obj) => obj.currentAmount >= obj.requiredAmount, - ); - - await pq.update({ - progress: updatedProgress, - status: isReady ? "ready" : "active", - }); - - if (socket) { - socket.emit("quest:update", { - id: pq.questId, - status: isReady ? "ready" : "active", - objectives: updatedProgress, - }); - } - - if (isReady && staticData.meta?.autoComplete) { - await this.claimRewards(playerId, pq.questId); - } - } - } - } catch (err) { - console.error(err); - } - } - - async claimRewards(playerId, questId) { - const t = await sequelize.transaction(); - - try { - const pq = await PlayerQuest.findOne({ - where: { playerId, questId, status: "ready" }, - transaction: t, - lock: t.LOCK.UPDATE, - }); - - if (!pq) { - await t.rollback(); - throw new Error("QUEST_NOT_READY_OR_CLAIMED"); - } - - const staticData = DatapackLoader.getQuest(questId); - const player = await Player.findByPk(playerId, { transaction: t }); - const rewards = staticData.rewards; - - await pq.update({ status: "completed" }, { transaction: t }); - - if (rewards.credits) { - await player.increment("credits", { - by: rewards.credits, - transaction: t, - }); - } - - if (rewards.xp) { - await player.increment("experience", { - by: rewards.xp, - transaction: t, - }); - } - - if (rewards.items?.length > 0) { - for (const item of rewards.items) { - const [invItem] = await Inventory.findOrCreate({ - where: { playerId, itemId: item.id }, - defaults: { quantity: 0 }, - transaction: t, - }); - await invItem.increment("quantity", { - by: item.count, - transaction: t, - }); - } - } - - await t.commit(); - const updatedPlayer = await player.reload(); - - return { - success: true, - rewards, - newTotalCredits: updatedPlayer.credits, - }; - } catch (err) { - if (t) await t.rollback(); - throw err; - } - } -} - -module.exports = new QuestsManager(); diff --git a/game-server/src/game/SessionManager.js b/game-server/src/game/SessionManager.js deleted file mode 100644 index 9ed8b67..0000000 --- a/game-server/src/game/SessionManager.js +++ /dev/null @@ -1,71 +0,0 @@ -class SessionManager { - constructor() { - this.sessions = new Map(); - } - - addPlayer(socketId, playerRaw) { - this.sessions.set(socketId, { - id: playerRaw.id, - username: playerRaw.username, - level: playerRaw.level, - energy: playerRaw.energy, - maxEnergy: playerRaw.maxEnergy, - status: "docked", - currentLocation: "Home_Base", - scene: "world", - sceneData: null, - joinedAt: Date.now(), - equipment: playerRaw.equipment || {}, - }); - } - - updateEquipment(socketId, slot, itemId) { - const session = this.sessions.get(socketId); - if (session) { - if (itemId === null) { - delete session.equipment[slot]; - } else { - session.equipment[slot] = itemId; - } - } - } - - setPlayerScene(socketId, sceneName, data = null) { - const session = this.sessions.get(socketId); - if (session) { - session.scene = sceneName; - session.sceneData = data; - session.status = sceneName === "dungeon" ? "in_mission" : "active"; - } - } - - getPlayerSession(socketId) { - return this.sessions.get(socketId); - } - - updateStatus(socketId, newStatus, location = null) { - const session = this.sessions.get(socketId); - if (session) { - session.status = newStatus; - if (location) session.currentLocation = location; - } - } - - removePlayer(socketId) { - this.sessions.delete(socketId); - } - - getPlayer(socketId) { - return this.sessions.get(socketId); - } - - getPlayerByUserId(userId) { - return Array.from(this.sessions.values()).find((s) => s.id === userId); - } - - getAllOnline() { - return Array.from(this.sessions.values()); - } -} - -module.exports = new SessionManager(); diff --git a/game-server/src/game/SocialManager.js b/game-server/src/game/SocialManager.js deleted file mode 100644 index a5e718a..0000000 --- a/game-server/src/game/SocialManager.js +++ /dev/null @@ -1,95 +0,0 @@ -const { Player, Friend } = require("../models"); -const notificationManager = require("./NotificationManager"); -const { Op } = require("sequelize"); - -class SocialManager { - constructor() { - this.io = null; - } - - init(io) { - this.io = io; - } - - async searchPlayers(query, excludeId) { - return await Player.findAll({ - where: { - username: { [Op.like]: `%${query}%` }, - id: { [Op.ne]: excludeId }, - }, - limit: 5, - attributes: ["id", "username", "level"], - }); - } - async removeFriend(myId, friendId) { - await Friend.destroy({ - where: { - [Op.or]: [ - { playerId: myId, friendId: friendId }, - { playerId: friendId, friendId: myId }, - ], - }, - }); - - await this.broadcastFriendListUpdate(myId); - await this.broadcastFriendListUpdate(friendId); - } - async sendFriendRequest(sender, targetId) { - await notificationManager.send({ - playerId: targetId, - type: "friend_request", - title: "NEW FRIEND REQUEST", - message: `${sender.username} wants to add you as a friend.`, - data: { fromId: sender.id }, - priority: "normal", - }); - } - - async acceptFriendRequest(myId, friendId, notificationId) { - const exists = await Friend.findOne({ - where: { playerId: myId, friendId: friendId }, - }); - - if (!exists) { - await Friend.bulkCreate([ - { playerId: myId, friendId: friendId }, - { playerId: friendId, friendId: myId }, - ]); - await notificationManager.delete(notificationId, myId); - - await this.broadcastFriendListUpdate(myId); - await this.broadcastFriendListUpdate(friendId); - - return true; - } - return false; - } - - async getFriendList(playerId) { - const player = await Player.findByPk(playerId, { - include: [ - { - model: Player, - as: "Friends", - attributes: ["id", "username", "level"], - }, - ], - }); - return player?.Friends || []; - } - - async broadcastFriendListUpdate(playerId) { - if (!this.io) return; - - const list = await this.getFriendList(playerId); - const targetSocket = [...this.io.sockets.sockets.values()].find( - (s) => s.user?.id === playerId, - ); - - if (targetSocket) { - targetSocket.emit("friend:list", list); - } - } -} - -module.exports = new SocialManager(); diff --git a/game-server/src/index.js b/game-server/src/index.js deleted file mode 100644 index da54b17..0000000 --- a/game-server/src/index.js +++ /dev/null @@ -1,97 +0,0 @@ -const express = require("express"); -const cors = require("cors"); -const axios = require("axios"); -const config = require("./config/config.js"); -const initSockets = require("./sockets/socket.js"); -const { Server } = require("socket.io"); -const http = require("http"); -const sequelize = require("./config/db.js"); -const DatapackLoader = require("./game/DatapackLoader.js"); -const path = require("path"); -const app = express(); -const economyService = require("./game/EconomyService.js"); -const NotificationManager = require("./game/NotificationManager.js"); -const AdminManager = require("./game/AdminManager.js"); -const SocialManager = require("./game/SocialManager.js"); - -app.use( - cors({ - origin: "*", - methods: ["GET", "POST"], - credentials: true, - }), -); -app.use("/static", express.static(path.join(__dirname, "../datapacks"))); -app.use(express.json()); - -const server = http.createServer(app); - -const io = new Server(server, { - cors: { - origin: "*", - methods: ["GET", "POST"], - credentials: true, - }, - transports: ["websocket", "polling"], - allowEIO3: true, -}); - -app.get("/api/game-metadata", (req, res) => { - try { - const gameData = DatapackLoader.getStaticData(); - res.json(gameData); - } catch (error) { - res.status(500).json({ error: "Failed to load game metadata" }); - } -}); - -app.get("/status", (req, res) => { - res.json({ status: "online", players: io.engine.clientsCount }); -}); - -const registerInApi = async () => { - try { - await axios.post(`${config.apiBaseUrl}/servers/register`, { - name: config.serverName, - url: config.host, - secret: config.serverSecret, - isModded: false, - description: config.serverDescription, - region: config.serverRegion, - }); - } catch (error) { - console.log(`Error: API server not found at ${config.apiBaseUrl}`); - console.log("Please configure API_SERVER_URL= in your .env file"); - process.exit(1); - } -}; - -const HEARTBEAT_INTERVAL = 1000; -const sendHeartbeat = async () => { - try { - await axios.post(`${config.apiBaseUrl}/servers/heartbeat`, { - name: config.serverName, - secret: config.serverSecret, - playersOnline: io.engine.clientsCount, - }); - } catch (error) {} -}; - -server.listen(config.port, async () => { - try { - const datapacksPath = path.join(__dirname, "../datapacks"); - DatapackLoader.init(datapacksPath, io); - await sequelize.initDatabase(); - initSockets(io); - NotificationManager.init(io); - AdminManager.init(io); - economyService.init(io); - SocialManager.init(io); - await registerInApi(); - setInterval(sendHeartbeat, HEARTBEAT_INTERVAL); - console.log(`Server running on ${config.host}. PORT: ${config.port}`); - } catch (error) { - console.log(error); - process.exit(1); - } -}); diff --git a/game-server/src/models/Friend.js b/game-server/src/models/Friend.js deleted file mode 100644 index c4a698b..0000000 --- a/game-server/src/models/Friend.js +++ /dev/null @@ -1,16 +0,0 @@ -const { DataTypes } = require("sequelize"); -const sequelize = require("../config/db"); - -const Friend = sequelize.define("Friend", { - id: { - type: DataTypes.UUID, - defaultValue: DataTypes.UUIDV4, - primaryKey: true, - }, - status: { - type: DataTypes.ENUM("pending", "accepted"), - defaultValue: "pending", - }, -}); - -module.exports = Friend; diff --git a/game-server/src/models/Inventory.js b/game-server/src/models/Inventory.js deleted file mode 100644 index 9eca928..0000000 --- a/game-server/src/models/Inventory.js +++ /dev/null @@ -1,28 +0,0 @@ -const { DataTypes } = require("sequelize"); -const sequelize = require("../config/db"); - -const Inventory = sequelize.define( - "Inventory", - { - id: { - type: DataTypes.INTEGER, - primaryKey: true, - autoIncrement: true, - }, - playerId: { - type: DataTypes.STRING, - allowNull: false, - }, - itemId: { - type: DataTypes.STRING, - allowNull: false, - }, - quantity: { - type: DataTypes.INTEGER, - defaultValue: 1, - }, - }, - { timestamps: false, tableName: "inventory" }, -); - -module.exports = Inventory; diff --git a/game-server/src/models/Item.js b/game-server/src/models/Item.js deleted file mode 100644 index cabfc89..0000000 --- a/game-server/src/models/Item.js +++ /dev/null @@ -1,26 +0,0 @@ -const { DataTypes } = require("sequelize"); -const sequelize = require("../config/db"); - -const Item = sequelize.define( - "Item", - { - id: { - type: DataTypes.STRING, - primaryKey: true, - }, - name: { - type: DataTypes.STRING, - allowNull: false, - }, - texturePath: { - type: DataTypes.STRING, - }, - rarity: { - type: DataTypes.STRING, - defaultValue: "common", - }, - }, - { tableName: "items" }, -); - -module.exports = Item; diff --git a/game-server/src/models/Message.js b/game-server/src/models/Message.js deleted file mode 100644 index e205621..0000000 --- a/game-server/src/models/Message.js +++ /dev/null @@ -1,23 +0,0 @@ -const { DataTypes } = require("sequelize"); -const sequelize = require("../config/db"); - -const Message = sequelize.define("Message", { - content: { - type: DataTypes.TEXT, - allowNull: false, - }, - type: { - type: DataTypes.ENUM("global", "private"), - defaultValue: "global", - }, - senderId: { - type: DataTypes.STRING, - allowNull: false, - }, - receiverId: { - type: DataTypes.STRING, - allowNull: true, - }, -}); - -module.exports = Message; diff --git a/game-server/src/models/Notification.js b/game-server/src/models/Notification.js deleted file mode 100644 index 47e1ba9..0000000 --- a/game-server/src/models/Notification.js +++ /dev/null @@ -1,29 +0,0 @@ -const { DataTypes } = require("sequelize"); -const sequelize = require("../config/db"); - -const Notification = sequelize.define("Notification", { - playerId: { - type: DataTypes.STRING, - allowNull: false, - }, - type: { - type: DataTypes.ENUM("friend_request", "crafting", "system", "trade"), - allowNull: false, - }, - title: { - type: DataTypes.STRING, - allowNull: false, - }, - message: { - type: DataTypes.TEXT, - }, - data: { - type: DataTypes.JSON, - }, - isRead: { - type: DataTypes.BOOLEAN, - defaultValue: false, - }, -}); - -module.exports = Notification; diff --git a/game-server/src/models/Player.js b/game-server/src/models/Player.js deleted file mode 100644 index 3a0d908..0000000 --- a/game-server/src/models/Player.js +++ /dev/null @@ -1,58 +0,0 @@ -const { DataTypes } = require("sequelize"); -const sequelize = require("../config/db"); - -const Player = sequelize.define("Player", { - id: { - type: DataTypes.STRING, - primaryKey: true, - }, - username: { - type: DataTypes.STRING, - allowNull: false, - }, - level: { - type: DataTypes.INTEGER, - defaultValue: 1, - }, - experience: { - type: DataTypes.INTEGER, - defaultValue: 0, - }, - credits: { - type: DataTypes.INTEGER, - defaultValue: 500, - }, - lastCreditUpdate: { - type: DataTypes.DATE, - defaultValue: DataTypes.NOW, - }, - energy: { - type: DataTypes.INTEGER, - defaultValue: 100, - }, - maxEnergy: { - type: DataTypes.INTEGER, - defaultValue: 100, - }, - lastEnergyRegen: { - type: DataTypes.DATE, - defaultValue: DataTypes.NOW, - }, - lastLogin: { - type: DataTypes.DATE, - defaultValue: DataTypes.NOW, - }, - equipment: { - type: DataTypes.TEXT, - defaultValue: "{}", - get() { - const val = this.getDataValue("equipment"); - return val ? JSON.parse(val) : {}; - }, - set(val) { - this.setDataValue("equipment", JSON.stringify(val)); - }, - }, -}); - -module.exports = Player; diff --git a/game-server/src/models/PlayerQuest.js b/game-server/src/models/PlayerQuest.js deleted file mode 100644 index 27e1b91..0000000 --- a/game-server/src/models/PlayerQuest.js +++ /dev/null @@ -1,41 +0,0 @@ -const { DataTypes } = require("sequelize"); -const sequelize = require("../config/db"); - -const PlayerQuest = sequelize.define( - "PlayerQuest", - { - id: { - type: DataTypes.INTEGER, - primaryKey: true, - autoIncrement: true, - }, - playerId: { - type: DataTypes.STRING, - allowNull: false, - }, - questId: { - type: DataTypes.STRING, - allowNull: false, - }, - status: { - type: DataTypes.ENUM("active", "ready", "completed"), - defaultValue: "active", - }, - progress: { - type: DataTypes.JSON, - defaultValue: [], - }, - }, - { - timestamps: true, - tableName: "player_quests", - indexes: [ - { - unique: true, - fields: ["playerId", "questId"], - }, - ], - }, -); - -module.exports = PlayerQuest; diff --git a/game-server/src/models/SubItems.js b/game-server/src/models/SubItems.js deleted file mode 100644 index 4b2c9d2..0000000 --- a/game-server/src/models/SubItems.js +++ /dev/null @@ -1,61 +0,0 @@ -const { DataTypes } = require("sequelize"); -const sequelize = require("../config/db"); -const Item = require("./Item"); - -const Weapon = sequelize.define( - "Weapon", - { - itemId: { - type: DataTypes.STRING, - primaryKey: true, - references: { model: Item, key: "id" }, - }, - damage: { type: DataTypes.INTEGER }, - criticalChance: { type: DataTypes.FLOAT }, - attackRate: { type: DataTypes.INTEGER }, - }, - { timestamps: false }, -); - -const Armour = sequelize.define( - "Armour", - { - itemId: { - type: DataTypes.STRING, - primaryKey: true, - references: { model: Item, key: "id" }, - }, - health: { type: DataTypes.INTEGER }, - resistance: { type: DataTypes.FLOAT }, - defenceRating: { type: DataTypes.INTEGER }, - reflectChance: { type: DataTypes.FLOAT }, - category: { - type: DataTypes.ENUM( - "BACKPACK", - "BODY", - "BOOTS", - "HANDS", - "HELMET", - "PANTS", - ), - }, - }, - { timestamps: false }, -); - -const Material = sequelize.define( - "Material", - { - itemId: { - type: DataTypes.STRING, - primaryKey: true, - references: { model: Item, key: "id" }, - }, - category: { - type: DataTypes.ENUM("ELECTRONICS", "BIO", "CHEMICAL"), - }, - }, - { timestamps: false }, -); - -module.exports = { Weapon, Armour, Material }; diff --git a/game-server/src/models/associations.js b/game-server/src/models/associations.js deleted file mode 100644 index a5addd5..0000000 --- a/game-server/src/models/associations.js +++ /dev/null @@ -1,27 +0,0 @@ -const Player = require("./Player"); -const Message = require("./Message.js"); -const Friend = require("./Friend"); -const setupAssociations = () => { - Message.belongsTo(Player, { - as: "sender", - foreignKey: "senderId", - }); - - Message.belongsTo(Player, { - as: "receiver", - foreignKey: "receiverId", - }); - - Player.hasMany(Message, { - foreignKey: "senderId", - }); - - Player.belongsToMany(Player, { - through: Friend, - as: "Friends", - foreignKey: "playerId", - otherKey: "friendId", - }); -}; - -module.exports = setupAssociations; diff --git a/game-server/src/models/index.js b/game-server/src/models/index.js deleted file mode 100644 index 8d26a81..0000000 --- a/game-server/src/models/index.js +++ /dev/null @@ -1,24 +0,0 @@ -const sequelize = require("../config/db"); -const Player = require("./Player"); -const Inventory = require("./Inventory"); -const setupAssociations = require("./associations"); -const Notification = require("./Notification"); -const Friend = require("./Friend.js"); -const PlayerQuest = require("./PlayerQuest.js"); - -Player.hasMany(Inventory, { foreignKey: "playerId", as: "inventory" }); -Inventory.belongsTo(Player, { foreignKey: "playerId" }); - -Player.hasMany(PlayerQuest, { foreignKey: "playerId", as: "quests" }); -PlayerQuest.belongsTo(Player, { foreignKey: "playerId" }); - -setupAssociations(); - -module.exports = { - sequelize, - Player, - Inventory, - Notification, - Friend, - PlayerQuest, -}; diff --git a/game-server/src/sockets/handlers/adminHandler.js b/game-server/src/sockets/handlers/adminHandler.js deleted file mode 100644 index 9ab1fbe..0000000 --- a/game-server/src/sockets/handlers/adminHandler.js +++ /dev/null @@ -1,56 +0,0 @@ -const adminManager = require("../../game/AdminManager"); - -module.exports = (io, socket) => { - if (!adminManager.io) adminManager.init(io); - - const handleAdminCommand = async ({ command }) => { - const args = command.trim().split(/\s+/); - const cmd = args[0].toLowerCase(); - - try { - switch (cmd) { - case "/give": { - const [_, targetName, itemId, amountStr] = args; - const amount = parseInt(amountStr) || 1; - - if (!targetName || !itemId) { - throw new Error("Usage: /give [player] [item] [amount]"); - } - - const result = await adminManager.giveItem( - targetName, - itemId, - amount, - ); - socket.emit( - "admin:log", - `Successfully gave ${result.amount}x [${result.itemId}] to ${result.targetName}.`, - ); - break; - } - - case "/clear": { - const [_, targetName] = args; - if (!targetName) throw new Error("Usage: /clear [player]"); - - const target = await adminManager.clearInventory(targetName); - socket.emit("admin:log", `Inventory for ${target} has been wiped.`); - break; - } - - case "/reload_data": { - socket.emit("admin:log", "Reloading all datapacks..."); - await adminManager.reloadData(); - break; - } - - default: - socket.emit("admin:log", `Unknown admin command: ${cmd}`); - } - } catch (err) { - socket.emit("admin:log", `Error: ${err.message}`); - } - }; - - socket.on("admin:command", handleAdminCommand); -}; diff --git a/game-server/src/sockets/handlers/chatHandler.js b/game-server/src/sockets/handlers/chatHandler.js deleted file mode 100644 index 6ceffda..0000000 --- a/game-server/src/sockets/handlers/chatHandler.js +++ /dev/null @@ -1,81 +0,0 @@ -const chatManager = require("../../game/ChatManager"); - -module.exports = (io, socket) => { - socket.on("chat:get_global_history", async () => { - const history = await chatManager.getGlobalHistory(); - const formattedHistory = history.map((m) => ({ - id: m.id, - content: m.content, - senderName: m.sender?.username || "Unknown", - senderId: m.senderId, - createdAt: m.createdAt, - type: m.type, - })); - socket.emit("chat:global_history", formattedHistory); - }); - socket.on("chat:get_global_history", async () => { - const history = await chatManager.getGlobalHistory(); - - const formattedHistory = history.map((m) => ({ - id: m.id, - content: m.content, - senderName: m.sender?.username || "Unknown", - senderId: m.senderId, - createdAt: m.createdAt, - type: m.type, - })); - - socket.emit("chat:global_history", formattedHistory); - }); - - socket.on("chat:send_message", async (payload) => { - try { - const senderId = socket.user?.id; - if (!senderId) return; - - const messageData = await chatManager.saveMessage({ - content: payload.content, - type: payload.type || "global", - senderId: senderId, - receiverId: payload.receiverId, - }); - - if (messageData.type === "global") { - io.emit("chat:new_message", messageData); - } else { - socket - .to(`user_${payload.receiverId}`) - .emit("chat:new_message", messageData); - socket.emit("chat:new_message", messageData); - } - } catch (err) { - console.error(err); - socket.emit("error", { message: "CHAT_SEND_ERROR" }); - } - }); - - socket.on("chat:get_private_history", async ({ friendId }) => { - const myId = socket.user?.id; - - if (!myId || !friendId) return; - - const history = await chatManager.getPrivateHistory(myId, friendId); - const formattedHistory = history.map((m) => ({ - id: m.id, - content: m.content, - senderName: m.sender?.username || "Unknown", - senderId: m.senderId, - receiverId: m.receiverId, - createdAt: m.createdAt, - type: m.type, - })); - socket.emit("chat:private_history", formattedHistory); - }); - socket.on("player:search", async ({ query }) => { - const senderId = socket.user?.id; - if (!query || !senderId) return; - - const results = await chatManager.searchPlayers(query, senderId); - socket.emit("player:search_results", results); - }); -}; diff --git a/game-server/src/sockets/handlers/connectionHandler.js b/game-server/src/sockets/handlers/connectionHandler.js deleted file mode 100644 index 32dba92..0000000 --- a/game-server/src/sockets/handlers/connectionHandler.js +++ /dev/null @@ -1,97 +0,0 @@ -const { Op } = require("sequelize"); -const Player = require("../../models/Player"); -const sessionManager = require("../../game/SessionManager"); -const economyService = require("../../game/EconomyService.js"); -const QuestsManager = require("../../game/QuestsManager"); - -module.exports = async (io, socket) => { - const userId = socket.user?.id; - const username = socket.user?.username; - const sid = socket.id.substring(0, 5); - - if (!userId) { - return socket.disconnect(); - } - - try { - let player = await Player.findByPk(userId); - - if (!player) { - try { - player = await Player.create({ - id: userId, - username: username, - }); - } catch (createErr) { - player = await Player.findByPk(userId); - } - } - - await QuestsManager.onPlayerLogin(userId, socket); - await player.reload(); - - const offlineCredits = await economyService.handleOfflineEarnings(player); - - socket.playerId = userId; - socket.join("online_room"); - economyService.addPlayer(userId); - - const playerRaw = player.get({ plain: true }); - sessionManager.addPlayer(socket.id, playerRaw); - - const onlinePlayersData = sessionManager.getAllOnline(); - const onlineUsernames = onlinePlayersData.map((p) => p.username); - const onlineIds = onlinePlayersData.map((p) => p.id); - - const offlinePlayersModels = await Player.findAll({ - where: { - id: { [Op.notIn]: onlineIds }, - }, - attributes: ["username"], - raw: true, - }); - - const offlineUsernames = offlinePlayersModels.map((p) => p.username); - - socket.emit("session:ready", { - player: { - id: playerRaw.id, - username: playerRaw.username, - level: playerRaw.level, - credits: playerRaw.credits, - experience: playerRaw.experience, - }, - offlineEarned: offlineCredits, - onlinePlayers: onlineUsernames, - offlinePlayers: offlineUsernames, - }); - - socket.broadcast.emit("player:joined", { username: playerRaw.username }); - socket.join(`user_${socket.user.id}`); - - socket.on("player:get_dashboard", async () => { - try { - const p = await Player.findByPk(userId); - if (p) socket.emit("player:dashboard_data", p.toJSON()); - } catch (err) { - console.error(`❌ [${sid}] Dashboard error:`, err.message); - } - }); - - socket.on("disconnect", async () => { - try { - await Player.update( - { lastCreditUpdate: new Date() }, - { where: { id: userId } }, - ); - } catch (e) {} - - economyService.removePlayer(userId); - sessionManager.removePlayer(socket.id); - socket.broadcast.emit("player:left", { username: playerRaw.username }); - }); - } catch (err) { - console.error(`❌ [${sid}] Connection Error:`, err.message); - socket.disconnect(); - } -}; diff --git a/game-server/src/sockets/handlers/craftingHandler.js b/game-server/src/sockets/handlers/craftingHandler.js deleted file mode 100644 index 5582ca3..0000000 --- a/game-server/src/sockets/handlers/craftingHandler.js +++ /dev/null @@ -1,89 +0,0 @@ -const datapackLoader = require("../../game/DatapackLoader"); -const { Inventory } = require("../../models"); -const craftManager = require("../../game/CraftManager"); - -module.exports = (io, socket) => { - const userId = socket.user?.id; - - const sendStatus = () => { - const existing = craftManager.getExistingCraft(userId); - if (existing) { - socket.emit("player:craft_started", existing); - } - }; - - socket.on("player:check_active_craft", () => { - sendStatus(); - }); - - socket.on("player:get_recipe_categories", () => { - try { - const categories = datapackLoader.getRecipeCategories(); - socket.emit("player:recipe_categories_data", categories); - } catch (err) { - console.error(err.message); - } - }); - - socket.on("player:get_recipes", ({ category }) => { - try { - if (!category) return; - const rawRecipes = datapackLoader.getRecipesByCategory(category); - const recipeIds = rawRecipes.map((r) => r.id); - socket.emit("player:recipes_data", { category, recipeIds }); - } catch (err) { - console.error(err.message); - } - }); - - socket.on("player:craft_item", async ({ recipeId }) => { - try { - if (craftManager.getExistingCraft(userId)) { - return socket.emit("error", { message: "Already crafting" }); - } - - const recipe = datapackLoader.getRecipe(recipeId); - if (!recipe) return socket.emit("error", { message: "Recipe not found" }); - - for (const ing of recipe.inputs) { - const itemId = Object.keys(ing)[0]; - const quantity = ing[itemId]; - const invItem = await Inventory.findOne({ - where: { playerId: userId, itemId: itemId }, - }); - - if (!invItem || invItem.quantity < quantity) { - return socket.emit("error", { message: `Not enough resources` }); - } - } - - for (const ing of recipe.inputs) { - const itemId = Object.keys(ing)[0]; - const quantity = ing[itemId]; - const invItem = await Inventory.findOne({ - where: { playerId: userId, itemId: itemId }, - }); - - if (invItem.quantity === quantity) { - await invItem.destroy(); - } else { - await invItem.decrement("quantity", { by: quantity }); - } - } - - const result = await craftManager.startCraft(userId, recipeId, socket); - - if (result.error) { - return socket.emit("error", { message: result.error }); - } - - socket.emit("player:craft_started", result); - socket.emit("player:get_inventory"); - } catch (err) { - console.error(err.message); - socket.emit("error", { message: "Internal Crafting Error" }); - } - }); - - sendStatus(); -}; diff --git a/game-server/src/sockets/handlers/dungeonHandler.js b/game-server/src/sockets/handlers/dungeonHandler.js deleted file mode 100644 index 6126d75..0000000 --- a/game-server/src/sockets/handlers/dungeonHandler.js +++ /dev/null @@ -1,121 +0,0 @@ -const { Player, Inventory } = require("../../models"); -const DatapackLoader = require("../../game/DatapackLoader"); -const dungeonManager = require("../../game/DungeonManager"); - -module.exports = (io, socket) => { - const userId = socket.user?.id; - - socket.on("dungeon:start", async ({ dungeonId }) => { - try { - if (!userId) return; - const dungeon = DatapackLoader.getDungeon(dungeonId); - const player = await Player.findByPk(userId); - const energyCost = dungeon?.meta?.energyCost || 0; - - if (!dungeon) - return socket.emit("error", { message: "Dungeon not found" }); - if (player.energy < energyCost) - return socket.emit("error", { message: "Insufficient energy" }); - - await player.decrement("energy", { by: energyCost }); - const startData = await dungeonManager.startDungeon(userId, dungeonId); - socket.emit("dungeon:started", { - dungeonId: dungeon.id, - room: startData.config, - hostiles: startData.hostiles, - battle: startData.battle, - roomIndex: startData.roomIndex, - totalRooms: startData.totalRooms, - remainingEnergy: player.energy - energyCost, - }); - } catch (err) { - console.log(err); - socket.emit("error", { message: "Deployment failure" }); - } - }); - - socket.on("dungeon:combat_action", async ({ targetInstanceId }) => { - try { - if (!userId) return; - const result = dungeonManager.processCombatAction( - userId, - targetInstanceId, - ); - if (!result) return; - - socket.emit("dungeon:battle_update", { - battle: result.battle, - log: result.log, - status: result.status, - }); - - if (result.status === "defeat") { - dungeonManager.leaveDungeon(userId); - socket.emit("dungeon:failed", { message: "Neural link severed." }); - } - } catch (err) { - socket.emit("error", { message: "Synchronization error" }); - } - }); - - socket.on("dungeon:next_room", async () => { - try { - if (!userId) return; - const nextRoom = await dungeonManager.moveToNextRoom(userId); - if (!nextRoom) - return socket.emit("error", { message: "Navigation error" }); - - if (nextRoom.status === "completed") { - await finalizeDungeon(socket, nextRoom.rewards); - } else { - socket.emit("dungeon:room_update", nextRoom); - } - } catch (err) { - socket.emit("error", { message: "Navigation error" }); - } - }); - - socket.on("dungeon:leave", () => { - if (userId) dungeonManager.leaveDungeon(userId); - }); -}; - -async function finalizeDungeon(socket, sessionRewards) { - const userId = socket.user.id; - try { - const player = await Player.findByPk(userId); - - if (sessionRewards.credits > 0) - await player.increment("credits", { by: sessionRewards.credits }); - if (sessionRewards.xp > 0) - await player.increment("experience", { by: sessionRewards.xp }); - - if (sessionRewards.items.length > 0) { - const consolidated = sessionRewards.items.reduce((acc, curr) => { - acc[curr.id] = (acc[curr.id] || 0) + curr.count; - return acc; - }, {}); - - for (const [itemId, totalCount] of Object.entries(consolidated)) { - const [invItem] = await Inventory.findOrCreate({ - where: { playerId: userId, itemId: itemId }, - defaults: { quantity: 0 }, - }); - await invItem.increment("quantity", { by: totalCount }); - } - - // Оновлюємо масив для фронтенда, щоб не було дублікатів у списку - sessionRewards.items = Object.entries(consolidated).map( - ([id, count]) => ({ id, count }), - ); - } - - console.log("FINAL REWARDS SAVED:", sessionRewards); - socket.emit("dungeon:completed", { rewards: sessionRewards }); - } catch (err) { - console.error(err); - socket.emit("error", { message: "Failed to save rewards" }); - } finally { - dungeonManager.leaveDungeon(userId); - } -} diff --git a/game-server/src/sockets/handlers/inventoryHandler.js b/game-server/src/sockets/handlers/inventoryHandler.js deleted file mode 100644 index 1c4fc0f..0000000 --- a/game-server/src/sockets/handlers/inventoryHandler.js +++ /dev/null @@ -1,47 +0,0 @@ -const inventoryManager = require("../../game/InventoryManager"); -const sessionManager = require("../../game/SessionManager"); - -module.exports = (io, socket) => { - const userId = socket.user?.id; - if (!userId) return; - - socket.on("player:get_inventory", async () => { - const items = await inventoryManager.getInventory(userId); - socket.emit("player:inventory_data", items); - }); - - socket.on("player:get_equipment", async () => { - const equipment = await inventoryManager.getEquipment(userId); - socket.emit("player:equipment_data", equipment); - }); - - socket.on("player:equip_item", async ({ itemId, slot }) => { - try { - const itemInfo = await inventoryManager.equipItem(userId, itemId, slot); - sessionManager.updateEquipment(socket.id, slot, itemId); - socket.emit("player:item_equipped", { slot, itemId }); - socket.broadcast.emit("player:visible_changed", { - playerId: userId, - slot, - texturePath: itemInfo.texture, - }); - } catch (err) { - socket.emit("error", { message: err.message }); - } - }); - - socket.on("player:unequip_item", async ({ slot }) => { - try { - await inventoryManager.unequipItem(userId, slot); - sessionManager.updateEquipment(socket.id, slot, null); - socket.emit("player:item_unequipped", { slot }); - socket.broadcast.emit("player:visible_changed", { - playerId: userId, - slot, - texturePath: null, - }); - } catch (err) { - socket.emit("error", { message: "UNEQUIP_FAILED" }); - } - }); -}; diff --git a/game-server/src/sockets/handlers/notificationHandler.js b/game-server/src/sockets/handlers/notificationHandler.js deleted file mode 100644 index d1d190f..0000000 --- a/game-server/src/sockets/handlers/notificationHandler.js +++ /dev/null @@ -1,51 +0,0 @@ -const Notification = require("../../models/Notification"); - -module.exports = (io, socket) => { - socket.on("notifications:get_all", async () => { - try { - const list = await Notification.findAll({ - where: { playerId: socket.user.id }, - order: [["createdAt", "DESC"]], - limit: 50, - }); - - socket.emit("notifications:list", list); - - const unreadCount = list.filter((n) => !n.isRead).length; - socket.emit("notifications:unread_count", unreadCount); - } catch (e) { - console.error("Fetch notifications error:", e); - } - }); - - socket.on("notification:read", async ({ id }) => { - try { - await Notification.update( - { isRead: true }, - { where: { id, playerId: socket.user.id } }, - ); - - const unreadCount = await Notification.count({ - where: { playerId: socket.user.id, isRead: false }, - }); - socket.emit("notifications:unread_count", unreadCount); - } catch (e) { - console.error("Read notification error:", e); - } - }); - - socket.on("notification:dismiss", async ({ id }) => { - try { - await Notification.destroy({ - where: { id, playerId: socket.user.id }, - }); - - const unreadCount = await Notification.count({ - where: { playerId: socket.user.id, isRead: false }, - }); - socket.emit("notifications:unread_count", unreadCount); - } catch (e) { - console.error("Dismiss notification error:", e); - } - }); -}; diff --git a/game-server/src/sockets/handlers/questsHandler.js b/game-server/src/sockets/handlers/questsHandler.js deleted file mode 100644 index e57fc46..0000000 --- a/game-server/src/sockets/handlers/questsHandler.js +++ /dev/null @@ -1,89 +0,0 @@ -const questsManager = require("../../game/QuestsManager"); -const DatapackLoader = require("../../game/DatapackLoader"); -const { PlayerQuest } = require("../../models"); - -module.exports = (io, socket) => { - const playerId = socket.user?.id; - - socket.on("quest:get_list", async () => { - if (!playerId) return; - - try { - const autoQuests = DatapackLoader.getAutoStartQuests(); - const existingQuests = await PlayerQuest.findAll({ - where: { playerId }, - attributes: ["questId"], - raw: true, - }); - - const existingIds = existingQuests.map((q) => q.questId); - const missingQuests = autoQuests.filter( - (aq) => !existingIds.includes(aq.id), - ); - - if (missingQuests.length > 0) { - const toCreate = missingQuests.map((aq) => ({ - playerId, - questId: aq.id, - status: "active", - progress: aq.objectives.map((obj) => ({ ...obj, currentAmount: 0 })), - })); - - await PlayerQuest.bulkCreate(toCreate, { ignoreDuplicates: true }); - } - - const all = await PlayerQuest.findAll({ - where: { playerId }, - order: [["updatedAt", "DESC"]], - }); - - socket.emit( - "quest:list_data", - all.map((q) => ({ - id: q.questId, - status: q.status, - objectives: q.progress, - rewards: DatapackLoader.getQuest(q.questId)?.rewards, - })), - ); - } catch (err) { - console.error("Quest sync error:", err); - } - }); - - socket.on("quest:claim_reward", async ({ questId }) => { - try { - const result = await questsManager.claimRewards(playerId, questId); - - socket.emit("player:credits_update", { - totalCredits: result.newTotalCredits, - }); - - socket.emit("quest:reward_claimed", { - questId, - rewards: result.rewards, - }); - - const all = await PlayerQuest.findAll({ - where: { playerId }, - order: [["updatedAt", "DESC"]], - }); - - socket.emit( - "quest:list_data", - all.map((q) => ({ - id: q.questId, - status: q.status, - objectives: q.progress, - rewards: DatapackLoader.getQuest(q.questId)?.rewards, - })), - ); - } catch (err) { - const msg = - err.message === "QUEST_NOT_READY_OR_CLAIMED" - ? "Reward already claimed or objective not met." - : "Failed to claim reward."; - socket.emit("error", { message: msg }); - } - }); -}; diff --git a/game-server/src/sockets/handlers/socialHandler.js b/game-server/src/sockets/handlers/socialHandler.js deleted file mode 100644 index f0eca54..0000000 --- a/game-server/src/sockets/handlers/socialHandler.js +++ /dev/null @@ -1,48 +0,0 @@ -const socialManager = require("../../game/SocialManager"); - -module.exports = (io, socket) => { - if (!socialManager.io) socialManager.init(io); - - socket.on("player:search", async ({ query }) => { - try { - const players = await socialManager.searchPlayers(query, socket.user.id); - socket.emit("player:search_results", players); - } catch (e) { - console.error(e); - } - }); - - socket.on("friend:add", async ({ friendId }) => { - try { - await socialManager.sendFriendRequest(socket.user, friendId); - } catch (e) { - socket.emit("error", { message: "FAILED_TO_SEND_REQUEST" }); - } - }); - - socket.on("friend:remove", async ({ friendId }) => { - try { - await socialManager.removeFriend(socket.user.id, friendId); - } catch (e) { - console.error(e); - socket.emit("error", { message: "FAILED_TO_REMOVE_FRIEND" }); - } - }); - socket.on("friend:accept", async ({ friendId, id }) => { - try { - await socialManager.acceptFriendRequest(socket.user.id, friendId, id); - } catch (e) { - console.error(e); - socket.emit("error", { message: "FAILED_TO_ACCEPT_FRIEND" }); - } - }); - - socket.on("friend:get_list", async () => { - try { - const list = await socialManager.getFriendList(socket.user.id); - socket.emit("friend:list", list); - } catch (e) { - console.error(e); - } - }); -}; diff --git a/game-server/src/sockets/middleware/authMiddleware.js b/game-server/src/sockets/middleware/authMiddleware.js deleted file mode 100644 index bc55c6e..0000000 --- a/game-server/src/sockets/middleware/authMiddleware.js +++ /dev/null @@ -1,20 +0,0 @@ -const jwt = require("jsonwebtoken"); - -const socketAuth = (socket, next) => { - const token = socket.handshake.auth.token; - const username = socket.handshake.auth.username; - - if (!token || !username) { - return next(new Error("Authentication error: No token provided")); - } - - try { - const decoded = jwt.verify(token, process.env.JWT_SECRET || "secret_key"); - socket.user = { username, ...decoded }; - next(); - } catch (err) { - next(new Error("Authentication error: Invalid token")); - } -}; - -module.exports = socketAuth; diff --git a/game-server/src/sockets/socket.js b/game-server/src/sockets/socket.js deleted file mode 100644 index df6804b..0000000 --- a/game-server/src/sockets/socket.js +++ /dev/null @@ -1,28 +0,0 @@ -const socketAuth = require("./middleware/authMiddleware"); -const connectionHandler = require("./handlers/connectionHandler"); -const inventoryHandler = require("./handlers/inventoryHandler"); -const craftingHandler = require("./handlers/craftingHandler"); -const adminHandler = require("./handlers/adminHandler"); -const dungeonHandler = require("./handlers/dungeonHandler"); -const chatHandler = require("./handlers/chatHandler"); -const notificationHandler = require("./handlers/notificationHandler"); -const socialHandler = require("./handlers/socialHandler"); -const questsHandler = require("./handlers/questsHandler"); - -const initSockets = (io) => { - io.use(socketAuth); - - io.on("connection", (socket) => { - connectionHandler(io, socket); - inventoryHandler(io, socket); - craftingHandler(io, socket); - adminHandler(io, socket); - dungeonHandler(io, socket); - chatHandler(io, socket); - socialHandler(io, socket); - notificationHandler(io, socket); - questsHandler(io, socket); - }); -}; - -module.exports = initSockets; diff --git a/package.json b/package.json index f075989..68159f2 100644 --- a/package.json +++ b/package.json @@ -1,19 +1,23 @@ { - "name": "gso-project-manager", + "name": "api", "version": "1.0.0", + "description": "", + "main": "index.js", "scripts": { - "install-all": "cd api && npm install && cd ../game-server && npm install && cd ../client && npm install", - "dev": "npx concurrently \"npm run dev-api\" \"npm run dev-server\" \"npm run dev-client\"", - "dev-api": "cd api && npm run start", - "dev-server": "cd game-server && npm run start", - "dev-server-extras": "npx concurrently \"npm run dev-server-extra-proxima-centauri\" \"npm run dev-server-extra-ran\" \"npm run dev-server-extra-sol\" \"npm run dev-server-extra-tau-ceti\"", - "dev-server-extra-proxima-centauri": "cd game-server-proxima-centauri && npm run start", - "dev-server-extra-ran": "cd game-server-ran && npm run start", - "dev-server-extra-sol": "cd game-server-sol && npm run start", - "dev-server-extra-tau-ceti": "cd game-server-tau-ceti && npm run start", - "dev-client": "cd client && npm run dev" + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node ./src/index.js" }, + "keywords": [], + "author": "", + "license": "ISC", + "type": "commonjs", "dependencies": { - "concurrently": "^8.2.2" + "bcryptjs": "^3.0.3", + "cors": "^2.8.6", + "dotenv": "^17.3.1", + "express": "^5.2.1", + "jsonwebtoken": "^9.0.3", + "mongoose": "^9.3.0", + "socket.io": "^4.8.3" } } diff --git a/readme.md b/readme.md deleted file mode 100644 index 49a5cf5..0000000 --- a/readme.md +++ /dev/null @@ -1,50 +0,0 @@ -# GSO Project - -Multiplayer space-themed game built with React, Socket.io. - -## ⚠️ Requirements - -- **Node.js**: Version **22.x** or higher is strictly required (recommended for ESM support and optimal performance). -- **npm**: Included with Node.js. - -> **Note**: You can check your currently installed version by running `node -v` in your terminal. - -## 🚀 Getting Started - -### 1. Unified Dependencies Installation - -To automatically install all dependencies in the correct sub-projects (`api`, `game-server`, `client`) at once, run: - -### 1. API Server (api/.env) - -```env -MONGODB_URI=mongodb://localhost:27017 -PORT=PORT -GAME_SERVER_SECRET=game_server_pass_123 -JWT_SECRET=secret_123 -``` - -### 2. GameServer (game-server/.env) - -```env -PORT=5003 -HOST=http://localhost:5003 -API_SERVER_URL=http://localhost:3000/api -SERVER_NAME=Alpha-Centauri-3 -SERVER_SECRET=game_server_pass_123 -JWT_SECRET=secret_123 -DESCRIPTION="Welcome to Alpha-Centauri-3, a high-tech frontier station drifting on the edge of the known galaxy." -REGION=UK -channel_binding=require -``` - -### 3. Client (client/.env) - -```env -VITE_API_URL=http://localhost:3000/api -``` - -```bash -npm run install-all -npm run dev -``` diff --git a/api/src/config/config.js b/src/config/config.js similarity index 100% rename from api/src/config/config.js rename to src/config/config.js diff --git a/api/src/controllers/authController.js b/src/controllers/authController.js similarity index 100% rename from api/src/controllers/authController.js rename to src/controllers/authController.js diff --git a/api/src/controllers/serverController.js b/src/controllers/serverController.js similarity index 100% rename from api/src/controllers/serverController.js rename to src/controllers/serverController.js diff --git a/api/src/db/db.js b/src/db/db.js similarity index 100% rename from api/src/db/db.js rename to src/db/db.js diff --git a/api/src/index.js b/src/index.js similarity index 100% rename from api/src/index.js rename to src/index.js diff --git a/api/src/middleware/authMiddleware.js b/src/middleware/authMiddleware.js similarity index 100% rename from api/src/middleware/authMiddleware.js rename to src/middleware/authMiddleware.js diff --git a/api/src/models/GameServer.js b/src/models/GameServer.js similarity index 100% rename from api/src/models/GameServer.js rename to src/models/GameServer.js diff --git a/api/src/models/User.js b/src/models/User.js similarity index 100% rename from api/src/models/User.js rename to src/models/User.js diff --git a/api/src/routes/authRoutes.js b/src/routes/authRoutes.js similarity index 100% rename from api/src/routes/authRoutes.js rename to src/routes/authRoutes.js diff --git a/api/src/routes/serverRoutes.js b/src/routes/serverRoutes.js similarity index 100% rename from api/src/routes/serverRoutes.js rename to src/routes/serverRoutes.js diff --git a/api/src/routes/userRoutes.js b/src/routes/userRoutes.js similarity index 100% rename from api/src/routes/userRoutes.js rename to src/routes/userRoutes.js diff --git a/api/src/services/authService.js b/src/services/authService.js similarity index 100% rename from api/src/services/authService.js rename to src/services/authService.js diff --git a/api/src/services/serverService.js b/src/services/serverService.js similarity index 100% rename from api/src/services/serverService.js rename to src/services/serverService.js diff --git a/test/assets/languages/en_us.json b/test/assets/languages/en_us.json deleted file mode 100644 index 3408664..0000000 --- a/test/assets/languages/en_us.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "_comment_Dungeons": "", - "dungeons.test.pirates_outpost": "Test Pirate Outpost", - "dungeons.test.pirates_outpost.desc": "A hidden supply station belonging to the Black Mark syndicate.", - - "_comment_Enemies": "", - "enemies.test.black_mark_heavy_cruiser": "Test Black Mark Heavy Cruiser", - "enemies.test.raider_frigate": "Test Raider Frigate", - "enemies.test.scout_drone": "Test Scout Drone", - - "_comment_Equipment": "", - "items.materials.test.backpack_basic": "Test Basic Backpack", - "items.materials.test.backpack_basic.desc": "Test Just description.", - - "_comment_Materials": "", - "items.materials.test.bio_pulp": "Test Bio Pulp", - "items.materials.test.bio_pulp.desc": "Test Description.", - "items.materials.test.ship_plating": "Test Ship Plating", - "items.materials.test.ship_plating.desc": "Test Just description.", - - "_comment_Recipes": "", - "recipes.category.test.alloys": "Test Alloys", - "recipes.category.test.circuits": "Test Circuits", - "recipes.category.test.food": "Test Food", - "recipes.category.test.hull_sections": "Test Hull Sections", - "recipes.category.test.hulls": "Test Hulls", - "recipes.category.test.organics": "Test Organics", - "recipes.category.test.smelting": "Test Smelting", - "recipes.category.test.spacesuit_parts": "Test Spacesuit Parts", - - "_comment_Shop": "", - "shop.category.test.bio": "Test Bio", - - "_comment_Skills": "", - "skills.category.test.combat": "Test Combat", - "skills.category.test.crafting": "Test Crafting", - "skills.category.test.crafting.alien_tech": "Test Alien Tech", - "skills.category.test.crafting.alien_tech.desc": "Test Unknown Mysterious Tech", - "skills.category.test.science": "Test Science" -} - diff --git a/test/assets/textures/armour/backpack/backpack_basic.png b/test/assets/textures/armour/backpack/backpack_basic.png deleted file mode 100644 index 154d725..0000000 Binary files a/test/assets/textures/armour/backpack/backpack_basic.png and /dev/null differ diff --git a/test/assets/textures/hullPlating/ship/ship_plating.png b/test/assets/textures/hullPlating/ship/ship_plating.png deleted file mode 100644 index 6b57949..0000000 Binary files a/test/assets/textures/hullPlating/ship/ship_plating.png and /dev/null differ diff --git a/test/assets/textures/materials/bio/bio_pulp.png b/test/assets/textures/materials/bio/bio_pulp.png deleted file mode 100644 index 264ac22..0000000 Binary files a/test/assets/textures/materials/bio/bio_pulp.png and /dev/null differ diff --git a/test/data/dungeons/pirates/pirates_outpost.json b/test/data/dungeons/pirates/pirates_outpost.json deleted file mode 100644 index 24f3c7e..0000000 --- a/test/data/dungeons/pirates/pirates_outpost.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "dungeon": { - "id": "test:pirate/pirate_outpost", - "displayName": "dungeons.test.pirates_outpost", - "description": "dungeons.test.pirates_outpost.desc", - "energyCost": 10, - "repeatable": true, - "rooms": [ - { "id": "test:pirate/pirate_patrol_room" }, - { "id": "test:pirate/pirate_supply_bay" }, - { "id": "test:pirate/pirate_ambush_zone" }, - { "id": "original:pirate/pirate_patrol_room" }, - { "id": "original:pirate/pirate_supply_bay" }, - { "id": "original:pirate/pirate_ambush_zone" }, - { "id": "test:pirate/pirate_boss_bridge" } - ] - } -} diff --git a/test/data/enemies/hostiles/pirates/black_mark_cruiser.json b/test/data/enemies/hostiles/pirates/black_mark_cruiser.json deleted file mode 100644 index 1decf0f..0000000 --- a/test/data/enemies/hostiles/pirates/black_mark_cruiser.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "hostile": { - "id": "test:pirates/black_mark_cruiser", - "displayName": "enemies.test.black_mark_heavy_cruiserr", - "meta": { - "health": 1050, - "defense": 5.0, - "damage": 18.0, - "criticalChance": 0.15, - "attackRate": 0.6 - } - } -} diff --git a/test/data/enemies/hostiles/pirates/raider_frigate.json b/test/data/enemies/hostiles/pirates/raider_frigate.json deleted file mode 100644 index c3fd768..0000000 --- a/test/data/enemies/hostiles/pirates/raider_frigate.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "hostile": { - "id": "test:pirates/raider_frigate", - "displayName": "enemies.test.raider_frigate", - "meta": { - "health": 100, - "defense": 1.5, - "damage": 6.5, - "criticalChance": 0.2, - "attackRate": 1.0 - } - } -} diff --git a/test/data/enemies/hostiles/pirates/scout_drone.json b/test/data/enemies/hostiles/pirates/scout_drone.json deleted file mode 100644 index 3575ab1..0000000 --- a/test/data/enemies/hostiles/pirates/scout_drone.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "hostile": { - "id": "test:pirates/scout_drone", - "displayName": "enemies.test.scout_drone", - "meta": { - "health": 50, - "defense": 0.2, - "damage": 1.8, - "criticalChance": 0.1, - "attackRate": 3.0 - } - } -} diff --git a/test/data/enemies/rooms/pirates/pirate_ambush_zone.json b/test/data/enemies/rooms/pirates/pirate_ambush_zone.json deleted file mode 100644 index 72b7126..0000000 --- a/test/data/enemies/rooms/pirates/pirate_ambush_zone.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "rooms": { - "id": "test:pirate_ambush_zone", - "hostiles": [ - "original:pirates/scout_drone", - "test:pirates/raider_frigate", - "original:pirates/raider_frigate" - ], - "gainXp": 25, - "credits": 400 - } -} diff --git a/test/data/enemies/rooms/pirates/pirate_boss_bridge.json b/test/data/enemies/rooms/pirates/pirate_boss_bridge.json deleted file mode 100644 index 54c053b..0000000 --- a/test/data/enemies/rooms/pirates/pirate_boss_bridge.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "rooms": { - "id": "test:pirate_boss_bridge", - "hostiles": ["test:pirates/black_mark_cruiser"], - "gainXp": 100, - "credits": 2500 - } -} diff --git a/test/data/enemies/rooms/pirates/pirate_patrol_room.json b/test/data/enemies/rooms/pirates/pirate_patrol_room.json deleted file mode 100644 index d60b9c2..0000000 --- a/test/data/enemies/rooms/pirates/pirate_patrol_room.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "rooms": { - "id": "test:pirate_patrol_room", - "hostiles": [ - "original:pirates/scout_drone", - "original:pirates/scout_drone" - ], - "gainXp": 8, - "credits": 120 - } -} diff --git a/test/data/enemies/rooms/pirates/pirate_supply_bay.json b/test/data/enemies/rooms/pirates/pirate_supply_bay.json deleted file mode 100644 index a8f1122..0000000 --- a/test/data/enemies/rooms/pirates/pirate_supply_bay.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "rooms": { - "id": "test:pirate_supply_bay", - "hostiles": [], - "gainXp": 5, - "credits": 800, - "description": "You found a hidden cargo container filled with stolen tech." - } -} diff --git a/test/data/items/armour/backpack/backpack_basic.json b/test/data/items/armour/backpack/backpack_basic.json deleted file mode 100644 index 0ff1e40..0000000 --- a/test/data/items/armour/backpack/backpack_basic.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "armour": { - "id": "test:backpack_basic", - "displayName": "items.materials.test.backpack_basic", - "description": "items.materials.test.backpack_basic.desc", - "texture": "test/assets/textures/armour/backpack/backpack_basic.png", - "stats": { - "health": 190, - "resistance": 0.6, - "defenceRating": 0.5, - "reflectChance": 0.7 - }, - "meta": { - "rarity": "common", - "equipmentSlot": "test:accessory", - "storeCategory": "test:bag" - } - } -} diff --git a/test/data/items/hullPlating/ship/ship_plating.json b/test/data/items/hullPlating/ship/ship_plating.json deleted file mode 100644 index 76d7197..0000000 --- a/test/data/items/hullPlating/ship/ship_plating.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "plating": { - "id": "test:ship_plating", - "displayName": "items.materials.test.ship_plating", - "description": "items.materials.test.ship_plating.desc", - "texture": "test/assets/textures/hullPlating/ship/ship_plating.png", - "stats": { - "health": 50, - "resistance": 0.6, - "defenceRating": 2.3, - "reflectChance": 5.3 - }, - "meta": { - "rarity": "common", - "equipmentSlot": "test:shipHull", - "storeCategory": "test:shipHull" - } - } -} diff --git a/test/data/items/materials/bio/bio_pulp.json b/test/data/items/materials/bio/bio_pulp.json deleted file mode 100644 index 84e7ce3..0000000 --- a/test/data/items/materials/bio/bio_pulp.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "materials": { - "id": "test:bio_pulp", - "texture": "test/assets/textures/materials/bio/bio_pulp.png", - "displayName": "items.materials.test.bio_pulp", - "description": "items.materials.test.bio_pulp.desc", - "meta": { - "storeCategory": "test:bio" - } - } -} diff --git a/test/data/recipes/alloys/ablative_plating.json b/test/data/recipes/alloys/ablative_plating.json deleted file mode 100644 index f38ab04..0000000 --- a/test/data/recipes/alloys/ablative_plating.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "recipe": { - "id": "test:alloys_ablative_plating", - "displayName": "Ablative Plating", - "inputs": [ - { "original:ceramic_composite": 1 }, - { "original:carbon_ingot": 1 } - ], - "output": { - "original:ablative_plating": 1 - }, - "time_seconds": 40, - "requires": { - "original:alien_tech": 2 - } - }, - "craft": { - "type": "test:alloys", - "id": "alloys:alloys_ablative_plating" - } -} diff --git a/test/data/skills/crafting/alien_tech.json b/test/data/skills/crafting/alien_tech.json deleted file mode 100644 index 1b17b96..0000000 --- a/test/data/skills/crafting/alien_tech.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "skills": { - "id": "test:alien_tech", - "displayName": "skills.category.test.crafting.alien_tech", - "description": "skills.category.test.crafting.alien_tech.desc", - "meta": { - "category": "crafting", - "topLevel": 10, - "math": { - "start": 500, - "input": 1.7 - } - } - } -} diff --git a/test/manifest.json b/test/manifest.json deleted file mode 100644 index 13d0c20..0000000 --- a/test/manifest.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "test", - "version": "0.0.1", - "recipes": { - "categories": { - "test:alloys": { - "displayName": "recipes.category.test.alloys" - }, - "test:circuits": { - "displayName": "recipes.category.test.circuits" - }, - "test:food": { - "displayName": "recipes.category.test.food" - }, - "test:hull_sections": { - "displayName": "recipes.category.test.hull_sections" - }, - "test:hulls": { - "displayName": "recipes.category.test.hulls" - }, - "test:organics": { - "displayName": "recipes.category.test.organics" - }, - "test:smelting": { - "displayName": "recipes.category.test.smelting" - }, - "test:spacesuit_parts": { - "displayName": "recipes.category.test.spacesuit_parts" - } - } - }, - "shop": { - "categories": { - "test:bio": { - "displayName": "shop.category.test.bio" - } - } - }, - "skills": { - "categories": { - "test:combat": { - "displayName": "skills.category.test.combat" - }, - "test:crafting": { - "displayName": "skills.category.test.crafting" - }, - "test:science": { - "displayName": "skills.category.test.science" - } - } - } -}