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);
}