Make the tree copse its own thing, and not a building

This commit is contained in:
Catalin Constantin Mititiuc 2025-06-16 22:41:32 -07:00
parent 448ec8dd3a
commit 01588d7fe7
3 changed files with 358 additions and 339 deletions

View File

@ -0,0 +1,325 @@
polygon {
fill: inherit;
stroke: inherit;
stroke-width: 0.25px;
}
svg {
border: 1px solid slategray;
fill: none;
}
text {
font-size: 4px;
text-anchor: middle;
user-select: none;
font-family: sans-serif;
fill: black;
/* display: none; */
}
use[href="#hex"] {
stroke: #666;
/* fill: wheat; */
fill: navajowhite;
/* fill: url(#asterisk); */
}
.building .doors {
display: inline;
fill: none;
fill-opacity: 1;
stroke: #ff9900;
stroke-width: 2.5;
stroke-linecap: square;
stroke-dasharray: none;
stroke-opacity: 1;
}
.building .floor,
.terrain .floor {
opacity: 1;
fill: #ffffff;
fill-opacity: 0.5;
stroke: none;
}
.building .inner-wall {
fill: none;
stroke: #ffffff;
stroke-width: 1;
stroke-linecap: square;
}
.building .outer-wall {
fill: none;
stroke: #000000;
stroke-width: 2;
stroke-linecap: square;
}
.view-elevation-roof .doors,
.view-elevation-roof .inner-wall,
.view-elevation-roof .outer-wall {
display: none;
}
/* [class^="elevation"] {
display: none;
}
[class="elevation-0"] {
display: inline;
} */
.elevation-basement {
fill: lightgray;
display: none;
}
.elevation-0 use[href="#hex"] {
/* fill: green; */
}
.elevation-1,
.elevation-2 {
display: inline;
}
.elevation-1 use[href="#hex"] {
fill: lightblue;
}
.elevation-2 use[href="#hex"] {
fill: lightpink;
}
.building .elevation-1 {
fill: lightblue;
}
.elevation-roof {
display: none;
}
.building .elevation-basement use {
fill: lightgray;
}
.building .elevation-0 use {
fill: white;
}
.building .elevation-1 use {
fill: lightblue;
}
.building .elevation-2 use {
fill: lightgreen;
}
.building .elevation-3 use {
fill: lightpink;
}
.view-elevation-roof .floor {
fill: darkgray;
}
.building .elevation-1 {
display: none;
}
.building > * {
display: none;
}
[data-view-elevation="-1"] [class^="elevation"] {
display: none;
}
[data-view-elevation="-1"] .building > * {
display: none;
}
[data-view-elevation="-1"] .building > .elevation-basement,
[data-view-elevation="-1"] .building > .elevation-basement ~ .structure {
display: inline;
}
[data-view-elevation="0"] .building .elevation-0,
[data-view-elevation="0"] .building .elevation-0 ~ .structure {
display: inline;
}
[data-view-elevation="1"] .building .elevation-1,
[data-view-elevation="1"] .building .elevation-1 ~ .structure {
display: inline;
}
[data-view-elevation="1"] .building .elevation-1 + .structure [class*='wall'] {
display: none;
}
[data-view-elevation="1"] .building .elevation-1 + .structure .floor {
fill: gray;
}
[data-view-elevation="2"] .building .elevation-2,
[data-view-elevation="2"] .building .elevation-2 ~ .structure {
display: inline;
}
[data-view-elevation="2"] .building .elevation-2 + .structure [class*='wall'] {
display: none;
}
[data-view-elevation="2"] .building .elevation-2 + .structure .floor {
fill: gray;
}
[data-view-elevation="3"] .building .elevation-3,
[data-view-elevation="3"] .building .elevation-3 ~ .structure {
display: inline;
}
[data-view-elevation="3"] .building .elevation-3 + .structure [class*='wall'] {
display: none;
}
[data-view-elevation="3"] .building .elevation-3 + .structure .floor {
fill: gray;
}
[data-view-elevation="0"] .elevation-0 {
display: inline;
}
[data-view-elevation="1"] > .elevation-0,
[data-view-elevation="1"] > .elevation-1 {
display: inline;
}
[data-view-elevation="1"] .building .elevation-1 {
display: inline;
}
.view-elevation-0 .elevation-0 {
display: inline;
}
.view-elevation-1 .elevation-0 {
display: inline;
}
.view-elevation-1 .elevation-1 {
display: inline;
}
.view-elevation-1 .building .elevation-0 {
display: none;
}
.view-elevation-1 .building .elevation-1 {
/* display: none; */
}
.view-elevation-roof .elevation-roof {
display: inline;
}
.view-elevation-basement [class^="elevation"] {
display: none;
}
.view-elevation-basement .elevation-basement {
display: inline;
}
.view-elevation-basement .doors {
display: none;
}
.building [class*="elevation"] use {
/* fill-opacity: 0.33; */
stroke: black;
}
.building {
/* display: none; */
/* opacity: 0.2 */
}
#tree .trunk {
fill: brown;
}
#tree .branches {
fill: rgb(141, 202, 141);
stroke: green;
}
#bush {
fill: rgb(141, 202, 141);
stroke: green;
stroke-width: 0.5px;
transform: scale(0.9);
}
.select-elevation {
position: fixed;
right: 0;
top: 50%;
margin-right: 10px;
background-color: #FFFFFF99;
border: 1px solid gray;
padding: 2px;
font-family: sans-serif;
font-size: 10pt;
}
.select-elevation label {
display: block;
margin: 2px 0;
text-align: center;
border: 1px solid transparent;
user-select: none;
}
.select-elevation input {
display: none;
}
input:checked+label {
border: 1px solid salmon;
border-radius: 3px;
background-color: #cdd9e9;
}
[class^="part"] use {
fill-opacity: 0.75;
}
.part-1 use {
fill: lightseagreen;
}
.part-2 use {
fill: lightyellow;
}
.part-3 use {
fill: lightblue;
}
.part-4 use {
fill: lightsteelblue;
}
.part-5 use {
fill: lightsalmon;
}
.part-6 use {
fill: lightgreen;
}

View File

@ -2,332 +2,7 @@
<html> <html>
<head> <head>
<style> <link rel="stylesheet" href="assets/css/radial.css">
polygon {
fill: inherit;
stroke: inherit;
stroke-width: 0.25px;
}
svg {
border: 1px solid slategray;
fill: none;
}
text {
font-size: 4px;
text-anchor: middle;
user-select: none;
font-family: sans-serif;
fill: black;
/* display: none; */
}
use[href="#hex"] {
stroke: #666;
/* fill: wheat; */
fill: navajowhite;
/* fill: url(#asterisk); */
}
.building .doors {
display: inline;
fill: none;
fill-opacity: 1;
stroke: #ff9900;
stroke-width: 2.5;
stroke-linecap: square;
stroke-dasharray: none;
stroke-opacity: 1;
}
.building .floor {
opacity: 1;
fill: #ffffff;
fill-opacity: 0.5;
stroke: none;
}
.building .inner-wall {
fill: none;
stroke: #ffffff;
stroke-width: 1;
stroke-linecap: square;
}
.building .outer-wall {
fill: none;
stroke: #000000;
stroke-width: 2;
stroke-linecap: square;
}
.view-elevation-roof .doors,
.view-elevation-roof .inner-wall,
.view-elevation-roof .outer-wall {
display: none;
}
/* [class^="elevation"] {
display: none;
}
[class="elevation-0"] {
display: inline;
} */
.elevation-basement {
fill: lightgray;
display: none;
}
.elevation-0 use[href="#hex"] {
/* fill: green; */
}
.elevation-1,
.elevation-2 {
display: inline;
}
.elevation-1 use[href="#hex"] {
fill: lightblue;
}
.elevation-2 use[href="#hex"] {
fill: lightpink;
}
.building .elevation-1 {
fill: lightblue;
}
.elevation-roof {
display: none;
}
.building .elevation-basement use {
fill: lightgray;
}
.building .elevation-0 use {
fill: white;
}
.building .elevation-1 use {
fill: lightblue;
}
.building .elevation-2 use {
fill: lightgreen;
}
.building .elevation-3 use {
fill: lightpink;
}
.view-elevation-roof .floor {
fill: darkgray;
}
.building .elevation-1 {
display: none;
}
.building > * {
display: none;
}
[data-view-elevation="-1"] [class^="elevation"] {
display: none;
}
[data-view-elevation="-1"] .building > * {
display: none;
}
[data-view-elevation="-1"] .building > .elevation-basement,
[data-view-elevation="-1"] .building > .elevation-basement ~ .structure {
display: inline;
}
[data-view-elevation="0"] .building .elevation-0,
[data-view-elevation="0"] .building .elevation-0 ~ .structure {
display: inline;
}
[data-view-elevation="1"] .building .elevation-1,
[data-view-elevation="1"] .building .elevation-1 ~ .structure {
display: inline;
}
[data-view-elevation="1"] .building .elevation-1 + .structure [class*='wall'] {
display: none;
}
[data-view-elevation="1"] .building .elevation-1 + .structure .floor {
fill: gray;
}
[data-view-elevation="2"] .building .elevation-2,
[data-view-elevation="2"] .building .elevation-2 ~ .structure {
display: inline;
}
[data-view-elevation="2"] .building .elevation-2 + .structure [class*='wall'] {
display: none;
}
[data-view-elevation="2"] .building .elevation-2 + .structure .floor {
fill: gray;
}
[data-view-elevation="3"] .building .elevation-3,
[data-view-elevation="3"] .building .elevation-3 ~ .structure {
display: inline;
}
[data-view-elevation="3"] .building .elevation-3 + .structure [class*='wall'] {
display: none;
}
[data-view-elevation="3"] .building .elevation-3 + .structure .floor {
fill: gray;
}
[data-view-elevation="0"] .elevation-0 {
display: inline;
}
[data-view-elevation="1"] > .elevation-0,
[data-view-elevation="1"] > .elevation-1 {
display: inline;
}
[data-view-elevation="1"] .building .elevation-1 {
display: inline;
}
.view-elevation-0 .elevation-0 {
display: inline;
}
.view-elevation-1 .elevation-0 {
display: inline;
}
.view-elevation-1 .elevation-1 {
display: inline;
}
.view-elevation-1 .building .elevation-0 {
display: none;
}
.view-elevation-1 .building .elevation-1 {
/* display: none; */
}
.view-elevation-roof .elevation-roof {
display: inline;
}
.view-elevation-basement [class^="elevation"] {
display: none;
}
.view-elevation-basement .elevation-basement {
display: inline;
}
.view-elevation-basement .doors {
display: none;
}
.building [class*="elevation"] use {
/* fill-opacity: 0.33; */
stroke: black;
}
.building {
/* display: none; */
/* opacity: 0.2 */
}
#tree .trunk {
fill: brown;
}
#tree .branches {
fill: rgb(141, 202, 141);
stroke: green;
}
#bush {
fill: rgb(141, 202, 141);
stroke: green;
stroke-width: 0.5px;
transform: scale(0.9);
}
.select-elevation {
position: fixed;
right: 0;
top: 50%;
margin-right: 10px;
background-color: #FFFFFF99;
border: 1px solid gray;
padding: 2px;
font-family: sans-serif;
font-size: 10pt;
}
.select-elevation label {
display: block;
margin: 2px 0;
text-align: center;
border: 1px solid transparent;
user-select: none;
}
.select-elevation input {
display: none;
}
input:checked+label {
border: 1px solid salmon;
border-radius: 3px;
background-color: #cdd9e9;
}
[class^="part"] use {
fill-opacity: 0.75;
}
.part-1 use {
fill: lightseagreen;
}
.part-2 use {
fill: lightyellow;
}
.part-3 use {
fill: lightblue;
}
.part-4 use {
fill: lightsteelblue;
}
.part-5 use {
fill: lightsalmon;
}
.part-6 use {
fill: lightgreen;
}
</style>
</head> </head>
<body> <body>
@ -419,7 +94,7 @@
d="m -90.93,-112.5 h 51.96 l 8.66,15 h 95.26 l 8.66,-15 h 43.3 v 15 l -25.98,45 v 60 h 34.64 v 75 h -43.3 v -30 H 12.99 l -25.98,45 h -103.92 v -90 h 25.98 z m 77.94,30 v 15 h 69.28 v -15 m -86.6,37.5 v 7.5 m 0,-60 V -75 M 73.61,-112.5 V -75 M -90.93,-37.5 H 90.93 m 0,45 H -90.93 m 173.2,45 v -15 h 43.3 m -112.58,0 h -43.3 v 60 m 43.3,-45 v -45 m -69.28,30 h -60.62 m 60.62,30 h -60.62 m 60.62,-60 v 90" /> d="m -90.93,-112.5 h 51.96 l 8.66,15 h 95.26 l 8.66,-15 h 43.3 v 15 l -25.98,45 v 60 h 34.64 v 75 h -43.3 v -30 H 12.99 l -25.98,45 h -103.92 v -90 h 25.98 z m 77.94,30 v 15 h 69.28 v -15 m -86.6,37.5 v 7.5 m 0,-60 V -75 M 73.61,-112.5 V -75 M -90.93,-37.5 H 90.93 m 0,45 H -90.93 m 173.2,45 v -15 h 43.3 m -112.58,0 h -43.3 v 60 m 43.3,-45 v -45 m -69.28,30 h -60.62 m 60.62,30 h -60.62 m 60.62,-60 v 90" />
</g> </g>
<g id="terrain"> <g id="terrain" class="terrain">
<rect id="terrain-floor" class="floor" x="-52.75" y="-68" width="105.5" height="136" id="rect3415" /> <rect id="terrain-floor" class="floor" x="-52.75" y="-68" width="105.5" height="136" id="rect3415" />
<g id="terrain-trees"> <g id="terrain-trees">
<use href="#tree" transform="translate(-27,-45.25)" /> <use href="#tree" transform="translate(-27,-45.25)" />

View File

@ -364,9 +364,10 @@ let mapsheet1 = {
grid: new Map(buildingHexes.bld6), grid: new Map(buildingHexes.bld6),
position: rotate180({ q: -13, r: 7, s: 6 }) position: rotate180({ q: -13, r: 7, s: 6 })
}, },
],
features: [
{ {
type: 'terrain', type: 'terrain',
elevationLevels: range(0, 0),
grid: generateRadialCoords( grid: generateRadialCoords(
new Map(), new Map(),
{ q: 0, r: 0, s: 0 }, { q: 0, r: 0, s: 0 },
@ -503,16 +504,8 @@ function rotate180(coords) {
}; };
} }
function drawMapsheet(gameboard, { id, grid, buildings }, { q: pq, r: pr, s: ps }) { function drawBuildings(mapsheet, container, { q: pq, r: pr, s: ps }) {
const container = document.createElementNS(xmlns, 'g'); return mapsheet.buildings.reduce((acc, building) => {
container.id = id;
gameboard.appendChild(container);
const gridContainer = document.createElementNS(xmlns, 'g');
gridContainer.classList.add('elevation-0');
container.appendChild(gridContainer);
const buildingHexes = buildings.reduce((acc, building) => {
const buildingContainer = document.createElementNS(xmlns, 'g'); const buildingContainer = document.createElementNS(xmlns, 'g');
buildingContainer.classList.add(`building`); buildingContainer.classList.add(`building`);
buildingContainer.classList.add(building.type); buildingContainer.classList.add(building.type);
@ -549,12 +542,38 @@ function drawMapsheet(gameboard, { id, grid, buildings }, { q: pq, r: pr, s: ps
return acc; return acc;
}, new Map()); }, new Map());
}
grid = translateCoords(grid, ({ q, r, s }) => ({ q: q + pq, r: r + pr, s: s + ps })); function drawMapsheet(gameboard, mapsheet, position) {
const container = document.createElementNS(xmlns, 'g');
container.id = mapsheet.id;
gameboard.appendChild(container);
const gridContainer = document.createElementNS(xmlns, 'g');
gridContainer.classList.add('elevation-0');
container.appendChild(gridContainer);
const buildingHexes = drawBuildings(mapsheet, container, position);
const grid = translateCoords(mapsheet.grid, ({ q, r, s }) =>
({ q: q + position.q, r: r + position.r, s: s + position.s })
);
for ([coords, v] of buildingHexes) grid.delete(coords); for ([coords, v] of buildingHexes) grid.delete(coords);
drawHexes(gridContainer, grid, true); drawHexes(gridContainer, grid, true);
(mapsheet.features || []).forEach(feature => {
const origin = feature.position({ q: 0, r: 0, s: 0 });
const { x, y } = radialToScreenCoords({ q: origin.q + position.q, r: origin.r + position.r, s: origin.s + position.s });
const use = document.createElementNS(xmlns, 'use');
use.setAttributeNS(null, 'href', `#${feature.type}`);
use.setAttributeNS(null, 'x', x);
use.setAttributeNS(null, 'y', y);
gridContainer.appendChild(use);
});
return new Map([...grid, ...buildingHexes]); return new Map([...grid, ...buildingHexes]);
// return { id, grid, buildings }; // return { id, grid, buildings };
} }