RSSAmplifier

Blog

Here Dragons Abound

Exploring procedural generation and display of fantasy maps.

heredragonsabound.blogspot.comRSS feed ↗25 posts

Latest posts

Cleanup Time

With the map compass series done (at least for now) I'm going to take a break from dedicated development and spend some time on cleaning up the existing code. I'd like to get to the point where I have a number of styles I can use to generate a map that will almost always produce an acceptable result. There are a few major problems I need to address but most of the problems are fairly minor…

Map Compasses Retrospective

I started the map compasses project with two primary goals. First, to create a procedural map compass generator, and secondly to experiment with sharing my code. Generating map compasses has been on my list since seeing Oleg's version a couple of years ago. Oleg was kind enough to share his code with me, but I decided that the compass roses he generates were not usually suitable for my maps and…

Adding Compasses to Dragons Abound

As I documented in a previous series of posts , I recently wrote a procedural map compass generator. That was partly an experiment in making my code publicly available, so I wrote it as a standalone program separate from Dragons Abound so that it could be more easily used by someone else. (You can play with it here .) Now I'm going to integrate that code back into Dragons Abound . The first step…

Map Compasses (Part 18): Center Ornament

Welcome back to my blog series on implementing procedurally-generated map compasses! Last post I looked at some elaborations of the compass points. This time I want to look at adding a new feature to the compasses -- the center ornament. So far, all the compasses I have generated have been what I've called “two level" compasses. They comprise a back layer of various rings, and a front layer of…

Map Compasses (Part 17): Compass Points and More

Welcome back to my blog series on implementing procedurally-generated map compasses! For the past few posts I've worked on elaborating the “rings" that appear behind the compass points in compasses like these: Now I want to spend a little time on the compass points. There isn't nearly as much variation in compass points as in rings. One common variation is to turn the compass points into some sort…

Map Compasses (Part 16): More Rings

I'm back from watching the NCAA basketball tournament and a Spring Break trip to St. Lucia, so it's time to get back to my blog series on implementing procedurally-generated map compasses! Last time I added scales to the two-part compasses: There's still a lot more potential in the rings, so let's continue to work on those. One of the Suggestions to Explore I wrote last time was to implement some…

Map Compasses (Part 15): Scales

Welcome back to my blog series on implementing procedurally-generated map compasses! Last time I started working on the rules for procedural generation of compasses, and did an initial set of rules for a “two layer" compass. So far I've only implemented one type of compass, with pointers and a circular decoration behind them: I will continue to elaborate on this type of compass by adding some…

Map Compasses (Part 14): Lodestone Loader & First Compasses

Welcome back to my blog series on implementing procedurally-generated map compasses! Last time I completed the implementation of the Lodestone rules engine that is able to read an execute rules like these: <$pi> => `Math.PI`; <start> => <first> [1] | <second> [`99+99`]; <first> => I'm surprised this was selected!; <second> => The value of pi is <$pi>; But entering these rules as a Javascript…

Map Compasses (Part 13): Lodestone

Welcome back to my blog series on implementing procedurally-generated map compasses! In the last posting, I started implementation of Lodestone, a tool to execute procedural generation grammars. So far I have designed the rule language and implemented a parser that outputs a dictionary of rules. In this posting I'll develop the code to execute the rules and create procedural output. First, let me…

Map Compasses (Part 12): An Excursion into Tool Building

Welcome back to my blog series on implementing procedurally-generated map compasses! After implementing the Compass Design Language (CDL) that will be used to draw the compasses, and ruminating last time on procedural generation, I'm now ready to move to implementation of the procedural generation part of map compasses. The procedural generation's output will be descriptions of compasses in CDL,…

Map Compasses (Part 11): Philosophy of Design

Welcome back to my blog series on implementing procedurally-generated map compasses! So far I've implemented a good bit of Compass Design Language (CDL), a parser and an interpreter that can draw compasses like these examples: I'm sure I'll have more work to do on CDL, but for now I want to start work on the procedural generation part of this project. I'll start that implementation in the next…

Map Compasses (Part 10): Triangles, Diamonds and Wavy Compass Points

Welcome back to my blog series on implementing procedurally-generated map compasses! So far I've implemented the language and interpreter for all the capabilities needed to draw compasses like these examples: With the current capabilities, CDL can draw almost half of the compasses in my examples set (in some cases missing a decorative element), so I want to move on to procedural generation soon.…

Map Compasses (Part 9): Vertical Text and Radial Arcs

Happy 2022! Hopefully this year will be better than the last two -- that shouldn't be difficult. Welcome back to my blog series on implementing procedurally-generated map compasses! So far I've implemented the language and interpreter for all the capabilities needed to draw compasses like this example: In the last part I implemented radial labels as in the example above, but I noted that many…

Map Compasses (Part 8): Radial Text

Welcome back to my blog series on procedurally-generated map compasses! I've been implementing the Compass Design Language (CDL) and an interpreter for the language. I've been measuring my progress (on the right) against this compass (on the left): I've made good progress on the graphic elements of the compass, and now I'll tackle the labels. Like the triangles, hash marks and compass points, the…

Map Compasses (Part 7): Compass Points

Welcome back to my blog series on implementing procedurally-generated map compasses! So far I've implemented the language and interpreter for circles, space, and radial lines, circles and triangles, as shown in this demo image below: This time I'm going to tackle compass points. These are the two-sided diamond-shaped elements that typically point out to the points of the compass: Like the lines…

Map Compasses (Part 6): Radial Triangles

Welcome back to my blog series on implementing procedurally-generated map compasses! So far I've implemented the language and interpreter for circles, space, and radial lines and radial circles. Let's see what other capabilities we'll need to draw some compasses: I can already do a surprising amount of this compass. There are only three things left to do: the triangles that mark the 45 degree…

Map Compasses (Part 5): Radial Lines and Circles

Welcome back to my blog series on implementing procedurally-generated map compasses! In the previous post, I write the code for the language commands CIRCLE and SPACE. In this posting, I'm going to work on commands for radial elements. Radial elements are the parts of the compass that repeat at regular intervals in a circle around the center point of the compass. For example, consider this very…

Map Compasses (Part 4): Implementing CIRCLE and SPACE

Welcome back to my blog series on implementing procedurally-generated map compasses! In previous posts, I've started defining the Compass Description Language (CDL), built a parser for the language, and started creating an interpreter to draw the compasses. At the end of the last posting I had prepared the web page for drawing. The next step is to write the code to draw the current language…

Map Compasses (Part 3): A Minimal CDL Interpreter

Welcome back to my blog series on implementing procedurally-generated map compasses! You may recall that by the end of the previous blog post I had a parser in Nearley that could recognize compass descriptions consisting of two commands: CIRCLE and SPACE. Given the description 'SPACE(10) CIRCLE(1.5, "black", "none")' our parser confirms this is legal and returns a parse tree with two items at the…

Map Compasses (Part 2): Compass Design Language & Parsing

Welcome back to my blog series on implementing procedurally-generated map compasses! Last time I looked at a variety of map compasses and saw how they broke down into combinations of pointers and circles and wrote a simple code framework. This time I'm going to talk about the high level design of the code, and start creating a language to describe compasses. I intend to organize the map compass…

Map Compasses (Part 1): Introduction

This posting will start a new series on drawing map compasses. This topic has been on my TODO list since the great Oleg Dolya (aka watawatabou ) did a compass generator about a year ago. Oleg's generator is very good and Oleg was kind enough to share his code with me, so honestly I could probably adapt that code for my own use. But for a few different reasons, I'd like to write my own generator.…

Creating a Pencil Effect in SVG (Part 2)

Quite some time ago, I wrote a post about creating a pencil effect in SVG . It's challenging to do a pencil effect in SVG because SVG is fundamentally a vector graphics format, and pencils are fundamentally not. I ended up applying an SVG filter that added some texture and other effects to create a line that looks at least somewhat like a pencil: At the time, I left it at that and skipped over a…

Haunted Forests

(After a long break to pursue other interests, I've returned to Dragons Abound with some new material. I have at least a few months of postings lined up and we'll see where it goes after that. Special thanks to the folks who reached out to ask if I was okay! I was fine, just off doing other things, but the care you showed meant a lot to me.) The forests I implemented for “Knurden" style maps (…

Knurden Style: Completed Maps (Part 7)

As promised last time, some completed maps. These are 3250x3250 so you will have to click through or download to view full size. (You may use the maps for non-commercial purposes, if you'd like.) This was my primary test map. The city names that lie across islands are difficult to read; I will probably tweak the city label style some to try to address that. I tried a map using the Mediterranean…

Knurden Style: Labels & Etc (Part 6)

In previous postings, I implemented the major portions of Daniel Hasenbro's Knurden map style, the mountains and the forests. I also previously handled the shoreline and the basic colors. There remain a few more elements to implement. One important element is the labeling. The excerpt above shows examples of the important label types. The font used for the labels is one of the IM Fell fonts (DW…