chore: initial deploy — SLA Industries Foundry VTT
This commit is contained in:
@@ -0,0 +1,5 @@
|
||||
node_modules/
|
||||
.DS_Store
|
||||
._*
|
||||
*.swp
|
||||
worlds/
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"QBM.SceneButton": "Quick Battle Map",
|
||||
"QBM.MenuName": "Quick Battle Map Builder",
|
||||
"QBM.MenuHint": "Create a quick scene with terrain, grid coordinates, and procedural building or dungeon generation.",
|
||||
"QBM.AppTitle": "Quick Battle Map Builder",
|
||||
"QBM.ToolbarGroup": "Battle Map",
|
||||
"QBM.ToolbarOpen": "Open Quick Battle Map Builder"
|
||||
}
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"id": "quick-battlemap-builder",
|
||||
"title": "Quick Battle Map Builder",
|
||||
"description": "Create quick procedural battlemaps with square or hex grids, terrain backgrounds, random buildings, random dungeons, walls, doors, and windows.",
|
||||
"version": "0.3.0",
|
||||
"compatibility": {
|
||||
"minimum": "13",
|
||||
"verified": "13.350",
|
||||
"maximum": "13"
|
||||
},
|
||||
"authors": [
|
||||
{
|
||||
"name": "Tim Evans",
|
||||
"flags": {}
|
||||
}
|
||||
],
|
||||
"esmodules": [
|
||||
"module/quick-battlemap-builder.mjs"
|
||||
],
|
||||
"styles": [
|
||||
"styles/quick-battlemap-builder.css"
|
||||
],
|
||||
"languages": [
|
||||
{
|
||||
"lang": "en",
|
||||
"name": "English",
|
||||
"path": "lang/en.json",
|
||||
"flags": {}
|
||||
}
|
||||
],
|
||||
"manifest": "https://raw.githubusercontent.com/slaguru666/quick-battlemap-builder/main/module.json",
|
||||
"download": "https://github.com/slaguru666/quick-battlemap-builder/releases/latest/download/quick-battlemap-builder.zip"
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,146 @@
|
||||
.quick-battlemap-builder .window-content,
|
||||
.qbm-app {
|
||||
background: linear-gradient(180deg, #10161c 0%, #17212a 100%);
|
||||
color: #edf1f4;
|
||||
}
|
||||
|
||||
.qbm-app {
|
||||
display: grid;
|
||||
gap: 14px;
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
.qbm-section {
|
||||
background: rgba(255, 255, 255, 0.06);
|
||||
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||
border-radius: 12px;
|
||||
padding: 12px;
|
||||
}
|
||||
|
||||
.qbm-section h2 {
|
||||
margin: 0 0 10px;
|
||||
font-size: 1.05rem;
|
||||
letter-spacing: 0.04em;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.qbm-grid {
|
||||
display: grid;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.qbm-grid-2 {
|
||||
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||||
}
|
||||
|
||||
.qbm-grid label,
|
||||
.qbm-checks label {
|
||||
display: grid;
|
||||
gap: 4px;
|
||||
}
|
||||
|
||||
.qbm-grid label span {
|
||||
font-size: 0.85rem;
|
||||
color: rgba(237, 241, 244, 0.82);
|
||||
}
|
||||
|
||||
.qbm-grid input,
|
||||
.qbm-grid select {
|
||||
width: 100%;
|
||||
color: #f8fafc;
|
||||
background: rgba(8, 12, 17, 0.88);
|
||||
border: 1px solid rgba(255, 255, 255, 0.16);
|
||||
border-radius: 8px;
|
||||
padding: 6px 8px;
|
||||
}
|
||||
|
||||
.qbm-checks {
|
||||
display: grid;
|
||||
gap: 6px;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.qbm-checks input {
|
||||
margin-right: 6px;
|
||||
}
|
||||
|
||||
.qbm-actions {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 8px;
|
||||
margin-top: 12px;
|
||||
}
|
||||
|
||||
.qbm-actions button {
|
||||
color: #f8fafc;
|
||||
background: linear-gradient(180deg, #29455a 0%, #1c2f3e 100%);
|
||||
border: 1px solid rgba(255, 255, 255, 0.14);
|
||||
border-radius: 10px;
|
||||
padding: 8px 12px;
|
||||
}
|
||||
|
||||
.qbm-actions button:hover,
|
||||
.qbm-actions button:focus {
|
||||
box-shadow: 0 0 0 1px rgba(240, 194, 75, 0.45);
|
||||
}
|
||||
|
||||
.qbm-note {
|
||||
margin: 10px 0 0;
|
||||
font-size: 0.83rem;
|
||||
color: rgba(237, 241, 244, 0.78);
|
||||
}
|
||||
|
||||
.qbm-note-block {
|
||||
display: grid;
|
||||
gap: 4px;
|
||||
align-content: start;
|
||||
padding: 10px 12px;
|
||||
border-radius: 10px;
|
||||
background: rgba(255, 255, 255, 0.05);
|
||||
}
|
||||
|
||||
.qbm-note-block strong {
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
.qbm-note-block span {
|
||||
font-size: 0.82rem;
|
||||
line-height: 1.35;
|
||||
color: rgba(237, 241, 244, 0.8);
|
||||
}
|
||||
|
||||
.qbm-preset-list {
|
||||
display: grid;
|
||||
gap: 8px;
|
||||
grid-template-columns: repeat(3, minmax(0, 1fr));
|
||||
}
|
||||
|
||||
.qbm-preset-card {
|
||||
display: grid;
|
||||
gap: 4px;
|
||||
background: rgba(255, 255, 255, 0.05);
|
||||
border-radius: 10px;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.qbm-preset-card strong {
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
.qbm-preset-card span {
|
||||
font-size: 0.8rem;
|
||||
color: rgba(237, 241, 244, 0.78);
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
.qbm-scene-directory-actions {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 6px;
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
.qbm-scene-directory-actions button {
|
||||
flex: 1 1 auto;
|
||||
min-width: 160px;
|
||||
}
|
||||
@@ -0,0 +1,159 @@
|
||||
<form class="qbm-app">
|
||||
<section class="qbm-section">
|
||||
<h2>New Scene</h2>
|
||||
<div class="qbm-grid qbm-grid-2">
|
||||
<label>
|
||||
<span>Scene Name</span>
|
||||
<input type="text" name="sceneName" value="{{defaults.sceneName}}" />
|
||||
</label>
|
||||
<label>
|
||||
<span>Scene Folder</span>
|
||||
<input type="text" name="sceneFolder" value="{{defaults.sceneFolder}}" />
|
||||
</label>
|
||||
<label>
|
||||
<span>Grid Layout</span>
|
||||
<select name="gridPreset">
|
||||
{{#each gridOptions as |option|}}
|
||||
<option value="{{option.value}}" {{#if option.selected}}selected{{/if}}>{{option.label}}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
</label>
|
||||
<label>
|
||||
<span>Terrain</span>
|
||||
<select name="terrain">
|
||||
{{#each terrainOptions as |option|}}
|
||||
<option value="{{option.value}}" {{#if option.selected}}selected{{/if}}>{{option.label}}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
</label>
|
||||
<label>
|
||||
<span>Generator</span>
|
||||
<select name="generatorType">
|
||||
{{#each generatorOptions as |option|}}
|
||||
<option value="{{option.value}}" {{#if option.selected}}selected{{/if}}>{{option.label}}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
</label>
|
||||
<label>
|
||||
<span>Columns</span>
|
||||
<input type="number" name="columns" min="4" max="80" value="{{defaults.columns}}" />
|
||||
</label>
|
||||
<label>
|
||||
<span>Rows</span>
|
||||
<input type="number" name="rows" min="4" max="80" value="{{defaults.rows}}" />
|
||||
</label>
|
||||
<label>
|
||||
<span>Grid Size (px)</span>
|
||||
<input type="number" name="gridSize" min="40" max="256" step="10" value="{{defaults.gridSize}}" />
|
||||
</label>
|
||||
<label>
|
||||
<span>Distance per Cell</span>
|
||||
<input type="number" name="distance" min="1" max="100" step="1" value="{{defaults.distance}}" />
|
||||
</label>
|
||||
<label>
|
||||
<span>Units</span>
|
||||
<input type="text" name="units" value="{{defaults.units}}" />
|
||||
</label>
|
||||
<label>
|
||||
<span>Coordinate Labels</span>
|
||||
<select name="coordinates">
|
||||
{{#each coordinateOptions as |option|}}
|
||||
<option value="{{option.value}}" {{#if option.selected}}selected{{/if}}>{{option.label}}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
</label>
|
||||
<label>
|
||||
<span>Room Count</span>
|
||||
<input type="number" name="generatorRooms" min="3" max="20" value="{{defaults.generatorRooms}}" />
|
||||
</label>
|
||||
</div>
|
||||
<div class="qbm-checks">
|
||||
<label><input type="checkbox" name="activateScene" {{#if defaults.activateScene}}checked{{/if}} /> Activate and view scene</label>
|
||||
<label><input type="checkbox" name="applyOutlineOnCreate" {{#if defaults.applyOutlineOnCreate}}checked{{/if}} /> Generate a layout when creating the scene</label>
|
||||
<label><input type="checkbox" name="addBorderWalls" {{#if defaults.addBorderWalls}}checked{{/if}} /> Add border walls</label>
|
||||
<label><input type="checkbox" name="enableTokenVision" {{#if defaults.enableTokenVision}}checked{{/if}} /> Enable token vision</label>
|
||||
</div>
|
||||
<div class="qbm-actions">
|
||||
<button type="button" class="qbm-create-scene"><i class="fas fa-map"></i> Create Generated Scene</button>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="qbm-section">
|
||||
<h2>Layout Generator</h2>
|
||||
<div class="qbm-grid qbm-grid-2">
|
||||
<label>
|
||||
<span>Target Scene</span>
|
||||
<select name="sceneId">
|
||||
{{#each sceneOptions as |option|}}
|
||||
<option value="{{option.value}}" {{#if option.selected}}selected{{/if}}>{{option.label}}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
</label>
|
||||
<label>
|
||||
<span>Start X (cells)</span>
|
||||
<input type="number" name="startX" min="0" max="200" value="{{defaults.startX}}" />
|
||||
</label>
|
||||
<label>
|
||||
<span>Start Y (cells)</span>
|
||||
<input type="number" name="startY" min="0" max="200" value="{{defaults.startY}}" />
|
||||
</label>
|
||||
<label>
|
||||
<span>Width (cells)</span>
|
||||
<input type="number" name="stampWidth" min="1" max="200" value="{{defaults.stampWidth}}" />
|
||||
</label>
|
||||
<label>
|
||||
<span>Height (cells)</span>
|
||||
<input type="number" name="stampHeight" min="1" max="200" value="{{defaults.stampHeight}}" />
|
||||
</label>
|
||||
<label>
|
||||
<span>Quick Stamp</span>
|
||||
<select name="stampType">
|
||||
{{#each stampOptions as |option|}}
|
||||
<option value="{{option.value}}" {{#if option.selected}}selected{{/if}}>{{option.label}}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
</label>
|
||||
</div>
|
||||
<div class="qbm-actions">
|
||||
<button type="button" class="qbm-generate-layout"><i class="fas fa-wand-magic-sparkles"></i> Generate On Target Scene</button>
|
||||
<button type="button" class="qbm-add-stamp"><i class="fas fa-draw-polygon"></i> Add Wall Stamp</button>
|
||||
<button type="button" class="qbm-add-perimeter"><i class="fas fa-border-all"></i> Add Scene Border</button>
|
||||
<button type="button" class="qbm-clear-generated"><i class="fas fa-eraser"></i> Remove Generated Geometry</button>
|
||||
</div>
|
||||
<p class="qbm-note">Use this for random buildings with rooms, doors, and windows, or dungeons with rooms, corridors, and door openings. Quick Stamps remain as simple manual tools.</p>
|
||||
</section>
|
||||
|
||||
<section class="qbm-section">
|
||||
<h2>Legacy Manual Shapes</h2>
|
||||
<div class="qbm-grid qbm-grid-2">
|
||||
<label>
|
||||
<span>Outline Preset</span>
|
||||
<select name="outlineType">
|
||||
{{#each outlineOptions as |option|}}
|
||||
<option value="{{option.value}}" {{#if option.selected}}selected{{/if}}>{{option.label}}</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
</label>
|
||||
<div class="qbm-note-block">
|
||||
<strong>Quick Use</strong>
|
||||
<span>These add a visible outline drawing and matching walls together, so buildings and dungeon shells are immediately playable.</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="qbm-actions">
|
||||
<button type="button" class="qbm-add-outline"><i class="fas fa-city"></i> Add Outline + Walls</button>
|
||||
</div>
|
||||
<p class="qbm-note">These older shell presets stay here as a fallback. The new generator above is the recommended path for buildings and dungeons.</p>
|
||||
</section>
|
||||
|
||||
<section class="qbm-section">
|
||||
<h2>Presets</h2>
|
||||
<div class="qbm-preset-list">
|
||||
{{#each presetNotes as |note|}}
|
||||
<div class="qbm-preset-card">
|
||||
<strong>{{note.title}}</strong>
|
||||
<span>{{note.copy}}</span>
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
</section>
|
||||
</form>
|
||||
Reference in New Issue
Block a user