Looking good and realistic Pananacakes, gon on ! You will have a long work naming all those towns and villages, no ?
river work may 29.png
I've been extending and refining the rivers I originally got from Wilbur. It's a slow process. So slow...
I dimmed the landscape to make the rivers stand out more. Do they look ok?
(The little hexagons with dots in the middle are dwarfs' villages, in case of wondering. Names are off because I'm reworking them.)
Last edited by Pananacakes; 05-29-2017 at 06:22 AM.
Looking good and realistic Pananacakes, gon on ! You will have a long work naming all those towns and villages, no ?
Thanks! I do have names for them now, but I'm not happy with them all yet. I want to do it better once the rivers are done.
A scale would be very helpful. Any opinion on this will depend on the size of the terrain portrayed.
Here's a suggestion:
1. save a copy of your map in a low quality format or reduced in terms of pixels
2. get the software Google Earth (if you don't have it yet)
3. open it and apply your map on it, as an overlay, maybe at a less than 100% opacity
4. play with it, adjusting its position in comparison to Earth, in terms of size and latitude
5. when happy, use the ruler tool to measure its size so you can add a scale to the map (and tell us how large is this map)
Doing this, you'll also be able to compare your rivers and mountain formations to actual Earth features.
The context is an island with central mountains and relatively steep terrain down to the coast. The island is about 550 km long and has a mean width ~90 km. On the pic I've posted here 9 pixels = 1 km, so the narrowest river that can be shown is ~27 meters wide.
The climate is oceanic. A Japanese island might be a good analogy except I think my island is a bit wetter.
Your map looks really good. Love how you've done the height relief. Good luck with entering all the text
After preliminary work in Photoshop to distribute the villages I wrote a program to place the symbols and names. Each time I use it I tweak it a bit here and there, but here's the basic version (in Python):
from PIL import Image, ImageDraw, ImageFont
import sys
import random
elvish_town_names_file = open('Elven Village Names.txt', 'rb')
elvish_town_names = elvish_town_names_file.readlines()
elvish_town_names_file.close()
random.shuffle(elvish_town_names)
dwarvish_town_names_file = open('Dwarven Village Names.txt', 'rb')
dwarvish_town_names = dwarvish_town_names_file.readlines()
dwarvish_town_names_file.close()
random.shuffle(dwarvish_town_names)
barb_town_names_file = open('Barbarian Village Names.txt', 'rb')
barb_town_names = barb_town_names_file.readlines()
barb_town_names_file.close()
random.shuffle(barb_town_names)
picture = Image.open('d:/settlement dots in.tif', 'r')
width, height = picture.size
pixels = picture.load()
elf_coordinates = []
dwarf_coordinates = []
human_coordinates = []
human_barb_coordinates = []
halforc_barb_coordinates = []
elf_villages = []
dwarf_villages = []
human_villages = []
human_barb_villages = []
halforc_barb_villages = []
e_villages = 0
h_villages = 0
d_villages = 0
hb_villages = 0
ob_villages = 0
for x_coordinate in range(width):
for y_coordinate in range(height):
if pixels[x_coordinate, y_coordinate] == (0, 0, 255):
elf_coordinates.append( (x_coordinate, y_coordinate) )
elif pixels[x_coordinate, y_coordinate] == (255, 255, 0):
dwarf_coordinates.append( (x_coordinate, y_coordinate) )
elif pixels[x_coordinate, y_coordinate] == (0, 255, 0):
human_coordinates.append( (x_coordinate, y_coordinate) )
elif pixels[x_coordinate, y_coordinate] == (255, 128, 0):
human_barb_coordinates.append( (x_coordinate, y_coordinate) )
elif pixels[x_coordinate, y_coordinate] == (255, 0, 0):
halforc_barb_coordinates.append( (x_coordinate, y_coordinate) )
image_field = Image.new('L', (width, height), (255))
label_font = ImageFont.truetype('GentiumPlus-R.ttf', 19)
label_font = ImageFont.truetype('Carta-Pananacakes.ttf', 30)
drawn_image = ImageDraw.Draw(image_field)
for x_y_pair in elf_coordinates:
e_villages += 1
town_id = "E" + str(e_villages)
town_name = elvish_town_names.pop().decode("utf-8")
data = (x_y_pair, town_id, town_name)
elf_villages.append(data)
xc = x_y_pair[0] - 8
yc = x_y_pair[1] - 8
symbol_font = ImageFont.truetype('Carta-Pananacakes.ttf', 30)
drawn_image.text((xc, yc), ";", font=symbol_font, fill=(0))
drawn_image.text((xc + 21, yc - 6), town_name, font=label_font, fill=(16))
for x_y_pair in dwarf_coordinates:
d_villages += 1
town_id = "D" + str(d_villages)
town_name = dwarvish_town_names.pop().decode("utf-8")
data = (x_y_pair, town_id, town_name)
dwarf_villages.append(data)
xc = x_y_pair[0] - 8
yc = x_y_pair[1] - 8
symbol_font = ImageFont.truetype('Carta-Pananacakes.ttf', 2
drawn_image.text((xc, yc), "’", font=symbol_font, fill=(0))
drawn_image.text((xc + 21, yc - 7), town_name, font=label_font, fill=(16))
for x_y_pair in human_coordinates:
h_villages += 1
town_id = "H" + str(h_villages)
town_name = elvish_town_names.pop().decode("utf-8")
data = (x_y_pair, town_id, town_name)
human_villages.append(data)
xc = x_y_pair[0] - 8
yc = x_y_pair[1] - 8
symbol_font = ImageFont.truetype('Carta-Pananacakes.ttf', 30)
drawn_image.text((xc, yc), ":", font=symbol_font, fill=(0))
drawn_image.text((xc + 21, yc - 6), town_name, font=label_font, fill=(16))
for x_y_pair in human_barb_coordinates:
if random.randint(1, 5) < 6:
hb_villages += 1
town_id = "HB" + str(hb_villages)
town_name = barb_town_names.pop().decode("utf-8")
data = (x_y_pair, town_id, town_name)
human_barb_villages.append(data)
xc = x_y_pair[0] - 8
yc = x_y_pair[1] - 8
symbol_font = ImageFont.truetype('Carta-Pananacakes.ttf', 29)
drawn_image.text((xc, yc), "d", font=symbol_font, fill=(0))
drawn_image.text((xc + 22, yc - 1), town_name, font=label_font, fill=(16))
for x_y_pair in halforc_barb_coordinates:
if random.randint(1, 5) < 6:
ob_villages += 1
town_id = "OB" + str(ob_villages)
town_name = barb_town_names.pop().decode("utf-8")
data = (x_y_pair, town_id, town_name)
halforc_barb_villages.append(data)
xc = x_y_pair[0] - 8
yc = x_y_pair[1] - 8
symbol_font = ImageFont.truetype('Carta-Pananacakes.ttf', 29)
drawn_image.text((xc, yc), "D", font=symbol_font, fill=(0))
drawn_image.text((xc + 22, yc - 1), town_name, font=label_font, fill=(16))
settlement_names_file = open("Settlements Data.txt", 'ab')
for d in elf_villages:
data_line = "(" + str(d[0][0]) + "," + str(d[0][1]) + ")" + ", " + d[1] + ", " + d[2] + "\n"
data_line = data_line.encode("utf-8")
settlement_names_file.write(data_line)
for d in dwarf_villages:
data_line = "(" + str(d[0][0]) + "," + str(d[0][1]) + ")" + ", " + d[1] + ", " + d[2] + "\n"
data_line = data_line.encode("utf-8")
settlement_names_file.write(data_line)
for d in human_villages:
data_line = "(" + str(d[0][0]) + "," + str(d[0][1]) + ")" + ", " + d[1] + ", " + d[2] + "\n"
data_line = data_line.encode("utf-8")
settlement_names_file.write(data_line)
for d in human_barb_villages:
data_line = "(" + str(d[0][0]) + "," + str(d[0][1]) + ")" + ", " + d[1] + ", " + d[2] + "\n"
data_line = data_line.encode("utf-8")
settlement_names_file.write(data_line)
for d in halforc_barb_villages:
data_line = "(" + str(d[0][0]) + "," + str(d[0][1]) + ")" + ", " + d[1] + ", " + d[2] + "\n"
data_line = data_line.encode("utf-8")
settlement_names_file.write(data_line)
settlement_names_file.close()
image_field.save('d:/settlements out.tif', "TIFF")
Edit: The forum destroyed my formatting so that code won't run with as is; the whitespace is messed up. I hope you can get the gist of it.
I forgot to mention that to prevent name texts from overlapping each other you can use a thing called quad trees. (https://en.wikipedia.org/wiki/Quadtree - but their usage for labelling like this isn't nearly as complex as that article makes it out to be.) I have a plan for it but haven't implemented it yet. I took a break from language and programming to do these rivers.