pieces/agents/trees.js

import { Registry } from "../../core/registry.js";
import { ORGANIC, PENETRABLE } from "../../core/flags.js";
import {
  BURNTWOOD,
  BUSHES,
  DARKGREEN,
  DARKOLIVEGREEN,
  FOREST,
  GRASS,
  SADDLEBROWN,
} from "../../core/color.js";
import { Symbol } from "../../core/symbol.js";
import { TypeOnlySerializer } from "../../core/serializer.js";
import { ImmobileAgent } from "./creatures.js";

// ── Tree base ─────────────────────────────────────────────────────────────────

class Tree extends ImmobileAgent {
  constructor(name, symbol) {
    super(name, ORGANIC, symbol);
    this.isTree = true;
  }
}

// ── Tree variants ─────────────────────────────────────────────────────────────

class Alder extends Tree {
  constructor() {
    super("Alder Tree", Symbol.of("ϒ", FOREST));
  }
  static SERIALIZER = new (class extends TypeOnlySerializer {
    constructor() {
      super("Alder");
    }
    create(_args) {
      return new Alder();
    }
    tag() {
      return "Trees";
    }
  })();
}

class Cactus extends Tree {
  constructor() {
    super("Cactus", Symbol.of("ψ", DARKOLIVEGREEN));
  }
  static SERIALIZER = new (class extends TypeOnlySerializer {
    constructor() {
      super("Cactus");
    }
    create(_args) {
      return new Cactus();
    }
    tag() {
      return "Trees";
    }
  })();
}

class Cypress extends Tree {
  constructor() {
    super("Cypress Tree", Symbol.of("ϒ", GRASS));
  }
  static SERIALIZER = new (class extends TypeOnlySerializer {
    constructor() {
      super("Cypress");
    }
    create(_args) {
      return new Cypress();
    }
    tag() {
      return "Trees";
    }
  })();
}

class Elm extends Tree {
  constructor() {
    super("Elm Tree", Symbol.of("♣", BUSHES));
  }
  static SERIALIZER = new (class extends TypeOnlySerializer {
    constructor() {
      super("Elm");
    }
    create(_args) {
      return new Elm();
    }
    tag() {
      return "Trees";
    }
  })();
}

class Fir extends Tree {
  constructor() {
    super("Fir Tree", Symbol.of("♠", FOREST));
  }
  static SERIALIZER = new (class extends TypeOnlySerializer {
    constructor() {
      super("Fir");
    }
    create(_args) {
      return new Fir();
    }
    tag() {
      return "Trees";
    }
  })();
}

class Hemlock extends Tree {
  constructor() {
    super("Hemlock Tree", Symbol.of("♠", BUSHES));
  }
  static SERIALIZER = new (class extends TypeOnlySerializer {
    constructor() {
      super("Hemlock");
    }
    create(_args) {
      return new Hemlock();
    }
    tag() {
      return "Trees";
    }
  })();
}

class Maple extends Tree {
  constructor() {
    super("Maple Tree", Symbol.of("♣", GRASS));
  }
  static SERIALIZER = new (class extends TypeOnlySerializer {
    constructor() {
      super("Maple");
    }
    create(_args) {
      return new Maple();
    }
    tag() {
      return "Trees";
    }
  })();
}

class Oak extends Tree {
  constructor() {
    super("Oak Tree", Symbol.of("♣", FOREST));
  }
  static SERIALIZER = new (class extends TypeOnlySerializer {
    constructor() {
      super("Oak");
    }
    create(_args) {
      return new Oak();
    }
    tag() {
      return "Trees";
    }
  })();
}

class Spruce extends Tree {
  constructor() {
    super("Spruce Tree", Symbol.of("♠", GRASS));
  }
  static SERIALIZER = new (class extends TypeOnlySerializer {
    constructor() {
      super("Spruce");
    }
    create(_args) {
      return new Spruce();
    }
    tag() {
      return "Trees";
    }
  })();
}

class Willow extends Tree {
  constructor() {
    super("Willow Tree", Symbol.of("ϒ", BUSHES));
  }
  static SERIALIZER = new (class extends TypeOnlySerializer {
    constructor() {
      super("Willow");
    }
    create(_args) {
      return new Willow();
    }
    tag() {
      return "Trees";
    }
  })();
}

/** Stump — organic + penetrable (items can land on it) */
class Stump extends ImmobileAgent {
  constructor() {
    super(
      "Stump",
      ORGANIC | PENETRABLE,
      Symbol.of("╨", SADDLEBROWN, null, BURNTWOOD, null),
    );
    this.isTree = true;
  }
  static SERIALIZER = new (class extends TypeOnlySerializer {
    constructor() {
      super("Stump");
    }
    create(_args) {
      return new Stump();
    }
    tag() {
      return "Trees";
    }
  })();
}

// ── Registry ──────────────────────────────────────────────────────────────────

export function registerTrees() {
  Registry.register("Alder", Alder.SERIALIZER);
  Registry.register("Cactus", Cactus.SERIALIZER);
  Registry.register("Cypress", Cypress.SERIALIZER);
  Registry.register("Elm", Elm.SERIALIZER);
  Registry.register("Fir", Fir.SERIALIZER);
  Registry.register("Hemlock", Hemlock.SERIALIZER);
  Registry.register("Maple", Maple.SERIALIZER);
  Registry.register("Oak", Oak.SERIALIZER);
  Registry.register("Spruce", Spruce.SERIALIZER);
  Registry.register("Willow", Willow.SERIALIZER);
  Registry.register("Stump", Stump.SERIALIZER);
}