chore(deps): introduce `@shared` path alias
authorxangelo <me@xangelo.ca>
Fri, 15 Nov 2024 17:08:07 +0000 (12:08 -0500)
committerxangelo <me@xangelo.ca>
Fri, 15 Nov 2024 17:08:07 +0000 (12:08 -0500)
34 files changed:
package-lock.json
package.json
src/server/admin.ts
src/server/api.ts
src/server/auth.ts
src/server/chat-commands.ts
src/server/dungeon.ts
src/server/equipment.ts
src/server/events.ts
src/server/fight.ts
src/server/inventory.ts
src/server/items.ts
src/server/map.ts
src/server/monster.ts
src/server/player.ts
src/server/shopEquipment.ts
src/server/skills.ts
src/server/socket-event.server.ts
src/server/views/chat.ts
src/server/views/components/stats.ts
src/server/views/dungeons/room.ts
src/server/views/fight.ts
src/server/views/inventory.ts
src/server/views/map.ts
src/server/views/monster-selector.ts
src/server/views/player-bar.ts
src/server/views/profile.ts
src/server/views/repair.ts
src/server/views/skills.ts
src/server/views/stores.ts
src/server/views/travel.ts
src/shared/stats.ts
tsconfig.json
webpack.config.js

index e3c640caaa71bf1663e6bd17d62c8eb5cb2de9ac..840c440a13b067e21aeeb0f3ceb6abd02c9df329 100644 (file)
@@ -49,7 +49,7 @@
         "ts-jest": "^29.1.1",
         "ts-loader": "^9.4.3",
         "ts-node": "^10.9.1",
-        "tsconfig-paths": "^3.14.2",
+        "tsconfig-paths": "^3.15.0",
         "tsconfig-paths-webpack-plugin": "^4.0.1",
         "typescript": "^4.9.5"
       }
       }
     },
     "node_modules/tsconfig-paths": {
-      "version": "3.14.2",
-      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz",
-      "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==",
+      "version": "3.15.0",
+      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
+      "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==",
       "dev": true,
       "dependencies": {
         "@types/json5": "^0.0.29",
       }
     },
     "tsconfig-paths": {
-      "version": "3.14.2",
-      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz",
-      "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==",
+      "version": "3.15.0",
+      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
+      "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==",
       "dev": true,
       "requires": {
         "@types/json5": "^0.0.29",
index f1f0f2ba579fa43b28fd8bdee129dddc411fa1e5..97f74b9b44541cb0258bc6add182e8d7b323db8a 100644 (file)
@@ -12,7 +12,7 @@
     "seed": "npx ts-node ./node_modules/knex/bin/cli.js seed:run",
     "seed:prod": "NODE_ENV=production npm run seed",
     "dev:client": "npx webpack -w",
-    "dev": "npx nodemon src/server/api.ts",
+    "dev": "npx nodemon -r tsconfig-paths/register src/server/api.ts",
     "prepare": "husky install",
     "release": "npx standard-version && npm run copy-changelog",
     "copy-changelog": "cp ./CHANGELOG.md ~/repos/xangelo.ca/static/",
@@ -39,7 +39,7 @@
     "ts-jest": "^29.1.1",
     "ts-loader": "^9.4.3",
     "ts-node": "^10.9.1",
-    "tsconfig-paths": "^3.14.2",
+    "tsconfig-paths": "^3.15.0",
     "tsconfig-paths-webpack-plugin": "^4.0.1",
     "typescript": "^4.9.5"
   },
index e45466d304b47a33466ce9cb24433e00487fc258..f7dbd2eac3b58555e4f1d2b2dfe2b9343f7701b5 100644 (file)
@@ -1,4 +1,4 @@
-import { Permission } from "../shared/player";
+import { Permission } from "@shared/player";
 import { db } from './lib/db';
 
 export async function givePlayerPermission(player_id: string, permission: Permission) {
index 45f7992c568d474a850a198ae9601fdac0248315..e4e27db6f5d8f758a96a67d3fba39c3fa827835d 100644 (file)
@@ -8,15 +8,15 @@ import { rateLimit } from 'express-rate-limit';
 
 import http from 'http';
 import { Server, Socket } from 'socket.io';
-import * as CONSTANT from '../shared/constants';
+import * as CONSTANT from '@shared/constants';
 import { logger } from './lib/logger';
 import { loadPlayer, createPlayer, updatePlayer } from './player';
 import { random, each } from 'lodash';
-import {broadcastMessage} from '../shared/message';
-import { Player } from '../shared/player';
+import {broadcastMessage} from '@shared/message';
+import { Player } from '@shared/player';
 import {createFight, getMonsterList, getMonsterLocation, getRandomMonster, loadMonster, loadMonsterFromFight} from './monster';
 import { addInventoryItem } from './inventory';
-import {FightTrigger, Monster} from '../shared/monsters';
+import {FightTrigger, Monster} from '@shared/monsters';
 import {getShopEquipment } from './shopEquipment';
 import { getAllPaths, getAllServices, getCityDetails, getService, getTravelPlan, getDungeon } from './map';
 import { signup, login, authEndpoint } from './auth';
index 9b4a3a41d38ddfbc2160e881e7cf94f78039b829..1d60a508e37b287ce714935dd27076c6205a152d 100644 (file)
@@ -1,8 +1,8 @@
-import { Player } from 'shared/player';
+import { Player } from '@shared/player';
 import xss from 'xss';
 import bcrypt from 'bcrypt';
 import { loadPlayer } from './player';
-import { Auth } from '../shared/auth';
+import { Auth } from '@shared/auth';
 import { db } from './lib/db';
 import { Request, Response } from 'express';
 
index 527e77e30a1a4636a60d06835d8bb1efa7e84cc1..da43c1c42bf88e2a73f6814d3f33cb03d3bf3189 100644 (file)
@@ -1,6 +1,6 @@
 import { Server, Socket } from 'socket.io';
-import { Player } from '../shared/player';
-import { broadcastMessage } from '../shared/message';
+import { Player } from '@shared/player';
+import { broadcastMessage } from '@shared/message';
 import { renderChatMessage } from './views/chat';
 import { Commands } from './chat-commands/';
 
index 33558a94425433974e16ff0002affaded4bd6059..5bb6652dbf12f859decfaaa23f5a3f412b3654c0 100644 (file)
@@ -1,5 +1,5 @@
-import { Fight } from "shared/monsters";
-import { Dungeon, DungeonRoom, DungeonPlayer, DungeonState, DungeonStateSummaryVists, DungeonStateSummaryFights } from "../shared/dungeon";
+import { Fight } from "@shared/monsters";
+import { Dungeon, DungeonRoom, DungeonPlayer, DungeonState, DungeonStateSummaryVists, DungeonStateSummaryFights } from "@shared/dungeon";
 import { db } from './lib/db';
 import { Request, Response } from 'express';
 import { ErrorAlert } from "./views/alert";
index d1a73bad9e06a9f640eaaecda037e19907bf96b4..994aea5ff9435c8e25f53c7ab153eb25d17fdc6d 100644 (file)
@@ -1,6 +1,6 @@
 import {db} from "./lib/db";
-import {EquippedItemDetails} from "../shared/equipped";
-import {EquipmentSlot, InventoryItem} from "../shared/inventory";
+import {EquippedItemDetails} from "@shared/equipped";
+import {EquipmentSlot, InventoryItem} from "@shared/inventory";
 
 export async function getEquippedItems(playerId: string): Promise<EquippedItemDetails[]> {
   return db.raw<EquippedItemDetails[]>(`
index 7b52951f6103232cf32c26141410a47968e557a7..fcbe00960df074bbcc18716205fa26cbe6b2e453 100644 (file)
@@ -1,6 +1,6 @@
 import { db } from './lib/db';
 import { version } from '../../package.json';
-import { CreatedEvent, Event, EventName } from '../shared/event';
+import { CreatedEvent, Event, EventName } from '@shared/event';
 import { isEqual } from 'lodash';
 import { logger } from './lib/logger';
 import { EVENT_FLUSH_INTERVAL } from '../shared/constants';
index b5a04b0949fe88f1be0d90d4960d25b24e983163..34425f6f092b4effcac18f81989f602f1d2bed97 100644 (file)
@@ -1,4 +1,4 @@
-import { FightRound } from "../shared/fight";
+import { FightRound } from "@shared/fight";
 import {
   clearFight,
   loadMonster,
@@ -23,9 +23,9 @@ import {
   increaseExp,
   updateAp,
 } from "./inventory";
-import { EquippedItemDetails } from "../shared/equipped";
-import { EquipmentSlot, levelFromExp } from "../shared/inventory";
-import { MonsterWithFaction, MonsterForFight, Fight } from "../shared/monsters";
+import { EquippedItemDetails } from "@shared/equipped";
+import { EquipmentSlot, levelFromExp } from "@shared/inventory";
+import { MonsterWithFaction, MonsterForFight, Fight } from "@shared/monsters";
 import { getPlayerSkillsAsObject, updatePlayerSkills } from "./skills";
 import { SkillID, Skills } from "../shared/skills";
 import { Request, Response } from "express";
index 6c8d44acdaaaa6cdb37b3f1fe32930ebfa2278fb..560ad30d3c7590a453d67867adc22a78287e17f1 100644 (file)
@@ -1,7 +1,7 @@
-import {expToLevel, InventoryItem, levelFromExp, ShopEquipment} from "../shared/inventory";
+import {expToLevel, InventoryItem, levelFromExp, ShopEquipment} from "@shared/inventory";
 import { v4 as uuid } from 'uuid';
 import { db} from './lib/db';
-import {EquippedItemDetails} from "../shared/equipped";
+import {EquippedItemDetails} from "@shared/equipped";
 import { unequipItems } from "./equipment";
 
 export type DbReturnInventoryExp = {
index 18119231cd81a2ae9ecb8e001f81630dc4815bb6..fc39bbca7bb5792c256440e966ef22bf1a7b8e25 100644 (file)
@@ -1,5 +1,5 @@
 import { db } from './lib/db';
-import {Item, PlayerItem, ShopItem} from '../shared/items';
+import {Item, PlayerItem, ShopItem} from '@shared/items';
 
 export async function getShopItems(location_id: number): Promise<(ShopItem & Item)[]> {
   const res = await db.raw(`select si.*, i.* from shop_items si
index 6b99a6c8b641d920be8d0d3d41a30cd41101bcff..fb88b0a1626d1a5797346fe26f48f9d080a7f9a9 100644 (file)
@@ -1,6 +1,6 @@
-import { City, Location, LocationWithCity, Path } from "../shared/map";
-import type { Player } from '../shared/player';
-import type { Travel, TravelWithNames } from '../shared/travel';
+import { City, Location, LocationWithCity, Path } from "@shared/map";
+import type { Player } from "@shared/player";
+import type { Travel, TravelWithNames } from "@shared/travel";
 import { db } from './lib/db';
 import { random } from 'lodash';
 
index ced4834e5618e7ec607bf058e510daa5f163722b..c0e66518f4f1dae47b5b99339a7c231598608e9f 100644 (file)
@@ -1,9 +1,9 @@
 import { db } from './lib/db';
-import { Fight, Monster, MonsterWithFaction, MonsterForList, FightTrigger, MonsterVariant, MonsterVariants } from '../shared/monsters';
-import { TimePeriod, TimeManager } from '../shared/time';
-import { LocationWithCity } from '../shared/map';
+import { Fight, Monster, MonsterWithFaction, MonsterForList, FightTrigger, MonsterVariant, MonsterVariants } from '@shared/monsters';
+import { TimePeriod, TimeManager } from '@shared/time';
+import { LocationWithCity } from '@shared/map';
 import { random, sample } from 'lodash';
-import { CHANCE_TO_FIGHT_SPECIAL } from '../shared/constants';
+import { CHANCE_TO_FIGHT_SPECIAL } from '@shared/constants';
 
 const time = new TimeManager();
 
index 82118e19f5f219bbf362f1820294b8e1b0ad60ad..ff55ab15c3aa3a585b1b0dd743138373c3bb11e7 100644 (file)
@@ -1,8 +1,8 @@
 import { db } from './lib/db';
-import {Player, maxHp, maxVigor} from "../shared/player";
+import {Player, maxHp, maxVigor} from "@shared/player";
 import { random } from 'lodash';
-import { Skills } from '../shared/skills';
-import {Profession} from 'shared/profession';
+import { Skills } from '@shared/skills';
+import {Profession} from '@shared/profession';
 import {logger} from './lib/logger';
 
 export async function loadPlayer(authToken: string): Promise<Player> {
index ab28a6c929bd854fe6340c425aa04cf8f169ac20..e9aa2f1a46b0c2af678330a019f93039150613c8 100644 (file)
@@ -1,5 +1,5 @@
 import { db } from './lib/db';
-import {ShopEquipment} from '../shared/inventory';
+import {ShopEquipment} from '@shared/inventory';
 
 export function listShopItems(where: Partial<ShopEquipment>): Promise<ShopEquipment[]> {
   return db.select('*').from<ShopEquipment>('shop_equipment')
index 17ef69caf47ed29390a22a356262be1f43f71030..6ee2e19a81fbaa257d1a89435b51abb6f9ed2f79 100644 (file)
@@ -1,4 +1,4 @@
-import {Skills, Skill, SkillID} from '../shared/skills';
+import {Skills, Skill, SkillID} from '@shared/skills';
 import { db } from './lib/db';
 import { each } from 'lodash';
 
index a2711f00601524c95ec89b80a9dea275bd6c0074..bd7022b962547c423fb71e828adb54c45e9ac6a5 100644 (file)
@@ -1,5 +1,5 @@
 import {Server, Socket} from "socket.io";
-import {Player} from "../shared/player";
+import {Player} from "@shared/player";
 
 export type API = {
   socket: Socket;
index bca4f8cdd9bfed92bff14677991830ad569fe17a..69cc27d0d7c379eaf05c3eaa6d7d516be727dbad 100644 (file)
@@ -1,4 +1,4 @@
-import {Message} from "../../shared/message";
+import {Message} from "@shared/message";
 
 export function renderChatMessage(msg: Message): string {
     return `<div class="chat-message" title="${new Date(parseInt(msg.sentAt))}" id="${msg.id}">
index 2e313fdde0cf804244a55fdf73f9c36f6b9fb986..61c3a1e7116fd3c8cec38cc559d631f8b34ecf6f 100644 (file)
@@ -1,6 +1,6 @@
-import { EquippedItemDetails } from "../../../shared/equipped";
-import { ItemStatBoostAbbr, ShopEquipment } from "../../../shared/inventory";
-import { baseDamage, Player } from "../../../shared/player";
+import { EquippedItemDetails } from "@shared/equipped";
+import { ItemStatBoostAbbr, ShopEquipment } from "@shared/inventory";
+import { baseDamage, Player } from "@shared/player";
 
 export function renderStatBoostWithPlayerIncrease(player: Player, name: ItemStatBoostAbbr, item: ShopEquipment | EquippedItemDetails) {
   const val = item.boosts.damage;
@@ -16,6 +16,6 @@ export function renderStatBoostWithPlayerIncrease(player: Player, name: ItemStat
   const diff = effectiveDamage - val;
 
   // calculate any stat boost from the player
-  return `<span class="requirement-title">${name}</span>: 
-<span class="requirement-value tooltip ${typeof val === 'number' ? (val > 0 ? "success": "error") : ""}" title="${val}(item) + ${diff}(from stats)">${valSign}${effectiveDamage}</span>`;
+  return `<div class="requirement"><span class="requirement-title">${name}</span>: 
+<span class="requirement-value tooltip ${typeof val === 'number' ? (val > 0 ? "success": "error") : ""}" title="${val}(item) + ${diff}(from stats)">${valSign}${effectiveDamage}</span></div>`;
 }
index a4e3552ff257d87bcceea1773c039e798b582227..e257c05c1ba887f5b8746b702ef67dfbc6918c36 100644 (file)
@@ -1,5 +1,5 @@
-import { DUNGEON_TRAVEL_BLOCK } from '../../../shared/constants';
-import { Dungeon, DungeonPlayer, DungeonRewards, DungeonRoom, DungeonState, DungeonStateSummaryVists } from '../../../shared/dungeon';
+import { DUNGEON_TRAVEL_BLOCK } from '@shared/constants';
+import { Dungeon, DungeonPlayer, DungeonRewards, DungeonRoom, DungeonState, DungeonStateSummaryVists } from '@shared/dungeon';
 import { Button, ButtonWithBlock } from '../components/button';
 import { Details, Title } from '../components/city';
 
index 46d962b09ec8dd83ce0f25773e50bf5bd881cd09..b773fba01a766033da5335d1acec98b259c85f0f 100644 (file)
@@ -1,9 +1,10 @@
-import { Dungeon } from "shared/dungeon";
-import { FightRound } from "shared/fight";
-import { LocationWithCity } from "shared/map";
-import { Fight, MonsterForFight } from "../../shared/monsters";
+import { Dungeon } from "@shared/dungeon";
+import { FightRound } from "@shared/fight";
+import { LocationWithCity } from "@shared/map";
+import { Fight, MonsterForFight } from "@shared/monsters";
 import { Button, ButtonWithBlock } from "./components/button";
 import { Details, Title } from "./components/city";
+import { Player } from "@shared/player";
 
 export function renderRoundDetails(roundData: FightRound): string {
   let html: string[] = roundData.roundDetails.map(d => `<div>${d}</div>`);
index 14cf7a28bd23eb607e4e218eb02a9d430ebe75fd..ca9cd470437a4ec3cc2803e89e29de36b96b10ce 100644 (file)
@@ -1,12 +1,12 @@
-import { EquipmentSlot } from "shared/inventory";
-import { EquippedItemDetails } from "../../shared/equipped";
-import { PlayerItem } from "../../shared/items";
+import { EquipmentSlot, meetsRequirements } from "@shared/inventory";
+import { EquippedItemDetails } from "@shared/equipped";
+import { PlayerItem } from "@shared/items";
 import { capitalize } from "lodash";
 import { ProgressBar } from "./components/progress-bar";
-import { Player } from "../../shared/player";
+import { Player } from "@shared/player";
 import { renderStatBoostWithPlayerIncrease } from "./components/stats";
-import { getDurabilityApproximation, expToLevel, levelFromExp } from "../../shared/inventory";
-import { slugify } from "../../shared/utils";
+import { getDurabilityApproximation, expToLevel, levelFromExp } from "@shared/inventory";
+import { slugify } from "@shared/utils";
 
 function icon(icon_name?: string): string {
   const placeholder = 'https://placehold.co/64x64/af936c/6d5f4d';
@@ -79,19 +79,20 @@ function renderRequirement(name: string, val: number | string, currentVal?: numb
   if(currentVal && typeof val === 'number') {
     colorIndicator = currentVal >= val ? 'success' : 'error';
   }
-  return `<span class="requirement-title">${name}</span>: <span class="requirement-value ${colorIndicator}">${val.toLocaleString()}</span>`;
+  return `<div class="requirement"><span class="requirement-title">${name}</span>: <span class="requirement-value ${colorIndicator}">${val.toLocaleString()}</span></div>`;
 }
 
-function renderStatBoost(name: string, val: number | string): string {
+function renderStatBoost(name: string, val: number | string, percent: boolean = false): string {
   let valSign: string = '';
   if(typeof val === 'number') {
     valSign = val > 0 ? '+' : '-';
   }
-  return `<span class="requirement-title">${name}</span>: <span class="requirement-value ${typeof val === 'number' ? (val > 0 ? "success": "error") : ""}">${valSign}${val}</span>`;
+  return `<div class="requirement"><span class="requirement-title">${name}</span>: <span class="requirement-value ${typeof val === 'number' ? (val > 0 ? "success": "error") : ""}">${valSign}${val}${percent ? '%' : ''}</span></div>`;
 }
 
 function renderInventoryItem(player: Player, item: EquippedItemDetails , action: (item: EquippedItemDetails) => string): string {
   const itemLevel = levelFromExp(item.current_exp);
+  const requirements = meetsRequirements(item, player);
   return `<div class="list-item">
     <div class="icon-wrapper">
       <div class="icon ${slugify(getDurabilityApproximation(item))}" style="background-image: url('${icon(item.icon)}')" title="Durability: ${item.currentAp}/${item.maxAp} (${Math.round((item.currentAp / item.maxAp) * 100)}%)">
@@ -101,7 +102,7 @@ function renderInventoryItem(player: Player, item: EquippedItemDetails , action:
       </div>
     </div>
     <div class="details">
-      <div class="name">${item.name}</div>
+      <div class="name">${item.name} <span class="right">${item.profession} (<span class="requirement-hover">REQ</span>)</span></div>
       <div class="stat-mods">
         ${item.boosts.defence ? renderStatBoost('DEF', item.boosts.defence) : ''}
         ${item.boosts.strength ? renderStatBoost('STR', item.boosts.strength) : ''}
@@ -109,7 +110,7 @@ function renderInventoryItem(player: Player, item: EquippedItemDetails , action:
         ${item.boosts.dexterity ? renderStatBoost('DEX', item.boosts.dexterity) : ''}
         ${item.boosts.intelligence ? renderStatBoost('INT', item.boosts.intelligence) : ''}
         ${item.boosts.damage ? renderStatBoostWithPlayerIncrease(player, item.affectedSkills.includes('restoration_magic') ? 'HP' : 'DMG', item) : ''}
-        ${item.boosts.damage_mitigation ? renderStatBoost('MIT', item.boosts.damage_mitigation.toString())+'%' : ''}
+        ${item.boosts.damage_mitigation ? renderStatBoost('MIT', item.boosts.damage_mitigation.toString(), true) : ''}
       </div>
       <div class="requirements" title="Requirements">
         ${item.requirements.level ? renderRequirement('LVL', item.requirements.level): ''}
@@ -117,7 +118,6 @@ function renderInventoryItem(player: Player, item: EquippedItemDetails , action:
         ${item.requirements.constitution ? renderRequirement('CON', item.requirements.constitution): ''}
         ${item.requirements.dexterity ? renderRequirement('DEX', item.requirements.dexterity): ''}
         ${item.requirements.intelligence ? renderRequirement('INT', item.requirements.intelligence): ''}
-        ${renderRequirement('PRF', item.profession)}
       </div>
       ${ProgressBar(item.current_exp - expToLevel(itemLevel), expToLevel(itemLevel + 1) - expToLevel(itemLevel), `exp-${item.item_id}`, {
         startingColor: '#7be67b',
index 0b6f2c255d7bb4175aef53c3281241a72c47cfe2..45975c2a0d197e7493d912549aed605b952e3dfc 100644 (file)
@@ -1,4 +1,4 @@
-import { LocationType, Location, Path, City } from "../../shared/map";
+import { LocationType, Location, Path, City } from "@shared/map";
 
 export async function renderMap(data: { city: City, locations: Location[], paths: Path[]}, closestTown: number): Promise<string> {
 
index 0fc5e5b3afa634e62e2cf415f5b25f619f059ec6..80c51796d18db072a5ed49d16aecceaa861810a8 100644 (file)
@@ -1,6 +1,5 @@
-import { max } from "lodash";
-import { LocationWithCity } from "../../shared/map";
-import { Monster, MonsterForFight } from "../../shared/monsters";
+import { LocationWithCity } from "@shared/map";
+import { Monster, MonsterForFight } from "@shared/monsters";
 import { BackToTown } from "./components/button";
 
 export function renderOnlyMonsterSelector(monsters: Monster[] | MonsterForFight[], activeMonsterId: number = 0, location?: LocationWithCity): string {
index 560a71b47612c4e54d87823de14fec6205d6ba47..aa5679907ccab2792cdf4ec0dce98faec4011a97 100644 (file)
@@ -1,4 +1,4 @@
-import { expToLevel, maxHp, maxVigor, Player } from "../../shared/player";
+import { expToLevel, maxHp, maxVigor, Player } from "@shared/player";
 import { ProgressBar } from "./components/progress-bar";
 
 function displayLoginSignupForm(): string {
index e6a1c0cfca3086fa4258a92591da308c78463bf5..27e2b13bafcda702c273065edee6e3f5644fb2bc 100644 (file)
@@ -1,5 +1,5 @@
-import { EquippedItemDetails } from "../../shared/equipped";
-import { expToLevel, maxHp, maxVigor, Player, StatDef, StatDisplay, totalDefence } from "../../shared/player";
+import { EquippedItemDetails } from "@shared/equipped";
+import { expToLevel, maxHp, maxVigor, Player, StatDef, StatDisplay, totalDefence } from "@shared/player";
 
 function statPointIncreaser(stat: StatDisplay) {
   return `<button class="increase-stat" hx-post="/player/stat/${stat.id}" hx-target="#profile">+</button>`;
index 9ba994b6dee4ddbe5cecba5e995dc96dbc992d99..fafc28dde5aac3a8b23709af9e1ad7ce4557c6c1 100644 (file)
@@ -1,8 +1,8 @@
 import { capitalize } from "lodash";
-import { Player } from "../../shared/player";
-import { repairCost } from "../../shared/inventory";
-import { LocationWithCity } from "../../shared/map";
-import { EquippedItemDetails } from "../../shared/equipped";
+import { Player } from "@shared/player";
+import { repairCost } from "@shared/inventory";
+import { LocationWithCity } from "@shared/map";
+import { EquippedItemDetails } from "@shared/equipped";
 import { ProgressBar } from "./components/progress-bar";
 import * as City from './components/city';
 import { BackToTown } from "./components/button";
@@ -17,7 +17,7 @@ function renderStatBoost(name: string, val: number | string): string {
 
 function renderRequirement(name: string, val: number | string, currentVal?: number): string {
   let colorIndicator = '';
-  if(currentVal) {
+  if(currentVal !== undefined && typeof val === 'number') {
     colorIndicator = currentVal >= val ? 'success' : 'error';
   }
   return `<span class="requirement-title">${name}</span>: <span class="requirement-value ${colorIndicator}">${val.toLocaleString()}</span>`;
index 8b585f221e0d6994a64d3225002f6b3c5394ff96..941767abf4debe3b7abdb5de6fcf295ca24ed7a1 100644 (file)
@@ -1,4 +1,4 @@
-import { Skill, Skills } from "../../shared/skills";
+import { Skill, Skills } from "@shared/skills";
 
 export function renderSkills(skills: Skill[]): string {
   let html = `<table id="skill-list">
index 8147f96f2cb9fadc9d29685e004aff655599de19..29c9709d65ed4276f1d9512a37eaffd44a413367 100644 (file)
@@ -1,9 +1,8 @@
-import { ItemStatBoostAbbr, ShopEquipment } from "../../shared/inventory";
-import { ShopItem, Item } from "../../shared/items";
+import { ItemStatBoostAbbr, ShopEquipment } from "@shared/inventory";
+import { ShopItem, Item } from "@shared/items";
 import { capitalize, merge } from "lodash";
-import { Player } from "../../shared/player";
-import { LocationWithCity } from "shared/map";
-import { ProgressBar } from "./components/progress-bar";
+import { Player } from "@shared/player";
+import { LocationWithCity } from "@shared/map";
 import { BackToTown } from "./components/button";
 import { renderStatBoostWithPlayerIncrease } from "./components/stats";
 
@@ -29,7 +28,7 @@ function renderStatBoost(name: ItemStatBoostAbbr, val: number | string, title?:
   if(typeof val === 'number') {
     valSign = val > 0 ? '+' : '-';
   }
-  return `<span class="requirement-title" title="${title}">${name}</span>: <span class="requirement-value ${typeof val === 'number' ? (val > 0 ? "success": "error") : ""}">${valSign}${val}</span>`;
+  return `<div class="requirement"><span class="requirement-title" title="${title}">${name}</span>: <span class="requirement-value ${typeof val === 'number' ? (val > 0 ? "success": "error") : ""}">${valSign}${val}</span></div>`;
 }
 
 function renderRequirement(name: string, val: number | string, currentVal?: number): string {
@@ -37,7 +36,7 @@ function renderRequirement(name: string, val: number | string, currentVal?: numb
   if (currentVal && typeof val === 'number') {
     colorIndicator = currentVal >= val ? 'success' : 'error';
   }
-  return `<span class="requirement-title">${name}</span>: <span class="requirement-value ${colorIndicator}">${val.toLocaleString()}</span>`;
+  return `<div class="requirement"><span class="requirement-title">${name}</span>: <span class="requirement-value ${colorIndicator}">${val.toLocaleString()}</span></div>`;
 }
 
 function renderShopItem(item: (ShopItem & Item), action: (item: (ShopItem & Item)) => string): string {
@@ -89,8 +88,9 @@ export function renderEquipmentDetails(item: ShopEquipment, player: Player): str
 
 function renderShopEquipment(item: ShopEquipment, action: (item: ShopEquipment) => string, player: Player): string {
     return `<div class="list-item">
-    <div class="store-icon" style="background-image: url('${item.icon ? `/assets/img/icons/equipment/${item.icon}` : 'https://via.placeholder.com/64x64'}')">
-      <div class="store-actions">${action(item)}</div>
+    <div class="icon-wrapper">
+      <div class="icon" style="background-image: url('${item.icon ? `/assets/img/icons/equipment/${item.icon}` : 'https://via.placeholder.com/64x64'}')"></div>
+      <div class="actions">${action(item)}</div>
     </div>
     ${renderEquipmentDetails(item, player)}
     </div>`;
index b5f8256e9b6ad559d43b11bde578af058e1eab17..9fcbb478e7a689049f74b57b89d79ede65f149a7 100644 (file)
@@ -1,4 +1,4 @@
-import { TravelDTO } from "../../shared/map";
+import { TravelDTO } from "@shared/map";
 import { ProgressBar } from './components/progress-bar';
 import { ButtonWithBlock } from './components/button';
 
index 14ae4fd03beabd21ebfd6677c9dd5f5152c9e84e..c060287f19a3f067f183e13d7406efd6da46fe61 100644 (file)
@@ -5,4 +5,4 @@ export enum Stat {
   intelligence = 'intelligence'
 };
 
-export type STAT_ABR = 'STR' | 'CON' | 'DEX' | 'INT';
+export type STAT_ABR = 'STR' | 'CON' | 'DEX' | 'INT';
\ No newline at end of file
index fa4cf87e3095b149436632e588feb6e01935365e..7d2e2b5363507eb68454bac24952c2974ede1377 100644 (file)
@@ -7,12 +7,18 @@
     "removeComments": true,
     "preserveConstEnums": true,
     "sourceMap": true,
-    "baseUrl": "src",
+    "baseUrl": ".",
     "outDir": "dist",
     "emitDecoratorMetadata": true,
     "experimentalDecorators": true,
     "resolveJsonModule": true,
     "typeRoots": ["./src/types"],
+    "paths": {
+      "@shared/*": ["src/shared/*"],
+      "@server/*": ["src/server/*"],
+      "@client/*": ["src/client/*"],
+      "@assets/*": ["public/assets/*"]
+    }
   },
   "include": ["src/server/api.ts"]
 }
index d55a9dc98004d156920bdf545f81eeace63b6d6a..d7a865621ff9b27f5611a91c7826f4b2662032c2 100644 (file)
@@ -29,7 +29,13 @@ module.exports = {
     extensions: [".ts", ".tsx", ".js"],
     plugins: [
       new tsconfigPaths()
-    ]
+    ],
+    alias: {
+      '@shared': path.resolve(__dirname, 'src/shared/'),
+      '@server': path.resolve(__dirname, 'src/server/'),
+      '@client': path.resolve(__dirname, 'src/client/'),
+      '@assets': path.resolve(__dirname, 'public/assets/')
+    }
   },
   output: {
     filename: "bundle.js",
@@ -38,5 +44,5 @@ module.exports = {
   performance: {
     maxEntrypointSize: 512000,
     maxAssetSize: 512000
-  },  
+  },
 };