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…
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…
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…
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…
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…
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…
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…
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…
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…
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,…
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…
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.…
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…
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…
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…
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…
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…
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…
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…
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…
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.…
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…
(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 (…
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…
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…