Back to Browser Side Quest
SOURCE / PINNED RELEASE

Made of little things.

Browser Side Quest

Release
b9d42f5768e4…
Author-recorded commit
c267690145fa…
License
LICENSE
Author’s source reference
nostr://npub1ye5ptcxfyyxl5vjvdjar2ua3f0hynkjzpx552mu5snj3qmx5pzjscpknpr/wss%3A%2F%2Fgit.shakespeare.diy%2F/browser-side-quest

Archive hash verified: 6d4b90b8a5f328f7…. The source-to-build association is the author’s claim; it has not been independently rebuilt.

src/shared/properties.ts
// Port of BrowserQuest server/js/properties.js (MPL-2.0). Stats and drop tables unchanged.
import { getArmorRank, getKindAsString, getWeaponRank, isMob } from './gametypes.js';

export interface MobProperties {
  /** Cumulative-percentage drop table, iterated in declaration order. */
  drops: Record<string, number>;
  hp: number;
  armor: number;
  weapon: number;
}

export const Properties: Record<string, MobProperties> = {
  rat: { drops: { flask: 40, burger: 10, firepotion: 5 }, hp: 25, armor: 1, weapon: 1 },
  skeleton: {
    drops: { flask: 40, mailarmor: 10, axe: 20, firepotion: 5 },
    hp: 110,
    armor: 2,
    weapon: 2,
  },
  goblin: {
    drops: { flask: 50, leatherarmor: 20, axe: 10, firepotion: 5 },
    hp: 90,
    armor: 2,
    weapon: 1,
  },
  ogre: {
    drops: { burger: 10, flask: 50, platearmor: 20, morningstar: 20, firepotion: 5 },
    hp: 200,
    armor: 3,
    weapon: 2,
  },
  spectre: {
    drops: { flask: 30, redarmor: 40, redsword: 30, firepotion: 5 },
    hp: 250,
    armor: 2,
    weapon: 4,
  },
  deathknight: { drops: { burger: 95, firepotion: 5 }, hp: 250, armor: 3, weapon: 3 },
  crab: {
    drops: { flask: 50, axe: 20, leatherarmor: 10, firepotion: 5 },
    hp: 60,
    armor: 2,
    weapon: 1,
  },
  snake: {
    drops: { flask: 50, mailarmor: 10, morningstar: 10, firepotion: 5 },
    hp: 150,
    armor: 3,
    weapon: 2,
  },
  skeleton2: {
    drops: { flask: 60, platearmor: 15, bluesword: 15, firepotion: 5 },
    hp: 200,
    armor: 3,
    weapon: 3,
  },
  eye: {
    drops: { flask: 50, redarmor: 20, redsword: 10, firepotion: 5 },
    hp: 200,
    armor: 3,
    weapon: 3,
  },
  bat: { drops: { flask: 50, axe: 10, firepotion: 5 }, hp: 80, armor: 2, weapon: 1 },
  wizard: { drops: { flask: 50, platearmor: 20, firepotion: 5 }, hp: 100, armor: 2, weapon: 6 },
  boss: { drops: { goldensword: 100 }, hp: 700, armor: 6, weapon: 7 },
};

function mobProps(kind: number): MobProperties {
  const props = Properties[getKindAsString(kind) ?? ''];
  if (!props) throw new Error(`No properties for kind ${kind}`);
  return props;
}

export function getArmorLevel(kind: number): number {
  return isMob(kind) ? mobProps(kind).armor : getArmorRank(kind) + 1;
}

export function getWeaponLevel(kind: number): number {
  return isMob(kind) ? mobProps(kind).weapon : getWeaponRank(kind) + 1;
}

export function getHitPoints(kind: number): number {
  return mobProps(kind).hp;
}