parent
de918c767a
commit
0ee504bf43
@ -1,82 +0,0 @@ |
|||||||
use v5.30; |
|
||||||
|
|
||||||
use HexGrid; |
|
||||||
use Carp; |
|
||||||
use Data::Dumper; |
|
||||||
|
|
||||||
my $grid = HexGrid->new(defaults => { style => { 'stroke-width' => 1, 'stroke' => 'black' }, show_coords => 1 }); |
|
||||||
|
|
||||||
$grid->make_region("Viper's Gate", colour => 'red'); |
|
||||||
my $adderwall = $grid->make_region('Adderwall', colour => 'orange'); |
|
||||||
# $adderwall->make_subregion('Adderwall foothills', colour => 'moccasin'); |
|
||||||
$grid->make_region('Adderwall foothills', colour => 'moccasin'); |
|
||||||
$grid->make_region('Midhills', colour => 'moccasin'); |
|
||||||
# $grid->make_region('Minev', colour => 'green', images => ["forest-tile.png"]); |
|
||||||
$grid->make_region('Minev', colour => 'green'); |
|
||||||
$grid->make_region('Barrowcross', colour => 'darkgreen'); |
|
||||||
$grid->make_region('Shinei Mavet', colour => 'orange'); |
|
||||||
$grid->make_region('Jagged Shinei Mavet', colour => 'orange'); |
|
||||||
$grid->make_region('Shinei Mavet waters', colour => 'lightcyan'); |
|
||||||
# $grid->make_region('Shinei Mavet', colour => 'orange', image => 'mountain.svg'); |
|
||||||
# $grid->make_region('Jagged Shinei Mavet', colour => 'orange', images => ['mountain.svg', 'jagged.svg']); |
|
||||||
# $grid->make_region('Shinei Mavet waters', colour => 'lightcyan', image => 'foo.png'); |
|
||||||
$grid->make_region('Southern Ocean', colour => 'skyblue'); |
|
||||||
$grid->make_region('A volcano', colour => 'orange'); |
|
||||||
$grid->make_region('Buslish Scrubs', colour => 'beige'); |
|
||||||
$grid->make_region('The Blasted Metropolis', colour => 'gray'); |
|
||||||
$grid->make_region('The sprawling grasses', colour => 'beige'); |
|
||||||
$grid->make_region('Something sandy?', colour => 'navajowhite'); |
|
||||||
$grid->make_region('Necromancer', colour => 'orange'); |
|
||||||
$grid->make_region('The Narrow Sea', colour => 'skyblue'); |
|
||||||
$grid->make_region('Naurardhon', colour => 'palegoldenrod'); |
|
||||||
$grid->make_region('The Glades of Leamingbury', colour => 'lightgreen'); |
|
||||||
$grid->make_region('Cape of Lost Causes', colour => 'gray'); |
|
||||||
$grid->make_region('Deadlands', colour => 'black'); |
|
||||||
$grid->make_region('Deadlands', colour => 'black'); |
|
||||||
$grid->make_region('Glade borders', colour => 'mediumaquamarine'); |
|
||||||
$grid->make_region('Thicket', colour => 'darkgreen'); |
|
||||||
$grid->make_region('Random house', colour => 'darkgreen'); |
|
||||||
$grid->make_region('Abbey of Plendor', colour => 'beige'); |
|
||||||
$grid->make_region('Khulanu', opacity => '0', style => { 'stroke-width' => 5, 'stroke' => 'black' }); |
|
||||||
|
|
||||||
my $tiles; |
|
||||||
open $tiles, "$ENV{HOME}/RPG-stuff/WestOfVipers/coordinate-mapping"; |
|
||||||
|
|
||||||
my $region; |
|
||||||
my $region_file; |
|
||||||
start_region(); |
|
||||||
while(my $coords = <$tiles>) |
|
||||||
{ |
|
||||||
if ($coords =~ /^\s*$/) |
|
||||||
{ |
|
||||||
start_region(); |
|
||||||
next; |
|
||||||
} |
|
||||||
print $region_file $coords if $coords; |
|
||||||
} |
|
||||||
close $region_file if $region_file; |
|
||||||
|
|
||||||
sub start_region |
|
||||||
{ |
|
||||||
close $region_file if $region_file; |
|
||||||
$region = <$tiles>; |
|
||||||
chomp($region); |
|
||||||
my $encoded_region = $region; |
|
||||||
$encoded_region =~ s/\W/_/g; |
|
||||||
open $region_file, ">region_files/$encoded_region" || croak "Can't open file for $region: $!"; |
|
||||||
say $region_file "== Style =="; |
|
||||||
foreach my $key (keys %{$grid->{regions}{$region}{defaults}}) |
|
||||||
{ |
|
||||||
next if $key eq 'style'; |
|
||||||
say $region_file "$key: $grid->{regions}{$region}{defaults}{$key}"; |
|
||||||
} |
|
||||||
if(my $css = $grid->{regions}{$region}{defaults}{style}) |
|
||||||
{ |
|
||||||
say $region_file "\n=== CSS ==="; |
|
||||||
foreach my $key (keys %{$grid->{regions}{$region}{defaults}{style}}) |
|
||||||
{ |
|
||||||
say $region_file "$key: $grid->{regions}{$region}{defaults}{style}{$key}"; |
|
||||||
} |
|
||||||
} |
|
||||||
say $region_file "\n== Tiles =="; |
|
||||||
} |
|
@ -1,37 +0,0 @@ |
|||||||
use v5.30; |
|
||||||
|
|
||||||
# use Getopt::Long; |
|
||||||
use SVG; |
|
||||||
|
|
||||||
my $width = 400; |
|
||||||
my $height = 300; |
|
||||||
my $origin_x = 0; |
|
||||||
my $origin_height = 100; |
|
||||||
my $corner_radius = 25; |
|
||||||
my $gap_start = 50; |
|
||||||
my $gap_width = 50; |
|
||||||
|
|
||||||
my $full_height = $height + $origin_height; |
|
||||||
|
|
||||||
my $svg = SVG->new(width => $width, height => $full_height, viewBox => "0 0 $width $full_height"); |
|
||||||
|
|
||||||
my $path_string = "M $gap_start,$height"; |
|
||||||
$path_string .= L($origin_x,$full_height); |
|
||||||
$path_string .= L($gap_start + $gap_width,$height); |
|
||||||
$path_string .= L($width - $corner_radius, $height); |
|
||||||
$path_string .= a($corner_radius, $corner_radius, 0, 0, 0, $corner_radius, -$corner_radius); |
|
||||||
$path_string .= l(0, -($height - 2*$corner_radius)); |
|
||||||
$path_string .= a($corner_radius, $corner_radius, 0, 0, 0, -$corner_radius, -$corner_radius); |
|
||||||
$path_string .= l(-($width - 2*$corner_radius),0); |
|
||||||
$path_string .= a($corner_radius, $corner_radius, 0, 0, 0, -$corner_radius, $corner_radius); |
|
||||||
$path_string .= l(0, ($height - 2*$corner_radius)); |
|
||||||
$path_string .= a($corner_radius, $corner_radius, 0, 0, 0, $corner_radius, $corner_radius); |
|
||||||
|
|
||||||
$path_string .= " Z"; |
|
||||||
my $path = $svg->path(d => $path_string, stroke => 'black', fill => 'white'); |
|
||||||
|
|
||||||
say $svg->render(); |
|
||||||
|
|
||||||
sub L { " L " . join(",", @_); } |
|
||||||
sub l { " l " . join(",", @_); } |
|
||||||
sub a { " a $_[0],$_[1] $_[2] $_[3] $_[4] $_[5],$_[6]"; } |
|
@ -1,127 +0,0 @@ |
|||||||
use v5.30; |
|
||||||
|
|
||||||
use HexGrid; |
|
||||||
use HexGrid::Pin; |
|
||||||
use Data::Dumper; |
|
||||||
|
|
||||||
use Text::Lorem; |
|
||||||
my $lorem = Text::Lorem->new; |
|
||||||
|
|
||||||
# my $adder_pin = new HexGrid::Pin(id => 'mountain-pin', icon => 'mountain.svg', name => 'Adder', description => $lorem->sentences(1)); |
|
||||||
my $grid = HexGrid->new(defaults => { style => { 'stroke-width' => 1, 'stroke' => 'black' }, show_coords => 1 }); |
|
||||||
|
|
||||||
$grid->make_region("Viper's Gate", colour => 'red'); |
|
||||||
# $grid->make_region('Adderwall', colour => 'orange', pins => {n => $adder_pin}); |
|
||||||
my $adderwall = $grid->make_region('Adderwall', colour => 'orange'); |
|
||||||
# $adderwall->make_subregion('Adderwall foothills', colour => 'moccasin'); |
|
||||||
$grid->make_region('Adderwall foothills', colour => 'moccasin'); |
|
||||||
$grid->make_region('Midhills', colour => 'moccasin'); |
|
||||||
# $grid->make_region('Minev', colour => 'green', images => ["forest-tile.png"]); |
|
||||||
$grid->make_region('Minev', colour => 'green'); |
|
||||||
$grid->make_region('Barrowcross', colour => 'darkgreen'); |
|
||||||
$grid->make_region('Shinei Mavet', colour => 'orange'); |
|
||||||
$grid->make_region('Jagged Shinei Mavet', colour => 'orange'); |
|
||||||
$grid->make_region('Shinei Mavet waters', colour => 'lightcyan'); |
|
||||||
# $grid->make_region('Shinei Mavet', colour => 'orange', image => 'mountain.svg'); |
|
||||||
# $grid->make_region('Jagged Shinei Mavet', colour => 'orange', images => ['mountain.svg', 'jagged.svg']); |
|
||||||
# $grid->make_region('Shinei Mavet waters', colour => 'lightcyan', image => 'foo.png'); |
|
||||||
$grid->make_region('Southern Ocean', colour => 'skyblue'); |
|
||||||
$grid->make_region('A volcano', colour => 'orange'); |
|
||||||
$grid->make_region('Buslish Scrubs', colour => 'beige'); |
|
||||||
$grid->make_region('The Blasted Metropolis', colour => 'gray'); |
|
||||||
$grid->make_region('The sprawling grasses', colour => 'beige'); |
|
||||||
$grid->make_region('Something sandy?', colour => 'navajowhite'); |
|
||||||
$grid->make_region('Necromancer', colour => 'orange'); |
|
||||||
$grid->make_region('The Narrow Sea', colour => 'skyblue'); |
|
||||||
$grid->make_region('Naurardhon', colour => 'palegoldenrod'); |
|
||||||
$grid->make_region('The Glades of Leamingbury', colour => 'lightgreen'); |
|
||||||
$grid->make_region('Cape of Lost Causes', colour => 'gray'); |
|
||||||
$grid->make_region('Deadlands', colour => 'black'); |
|
||||||
$grid->make_region('Deadlands', colour => 'black'); |
|
||||||
$grid->make_region('Glade borders', colour => 'mediumaquamarine'); |
|
||||||
$grid->make_region('Thicket', colour => 'darkgreen'); |
|
||||||
$grid->make_region('Random house', colour => 'darkgreen'); |
|
||||||
$grid->make_region('Abbey of Plendor', colour => 'beige'); |
|
||||||
$grid->make_region('Khulanu', opacity => '0', style => { 'stroke-width' => 5, 'stroke' => 'black' }); |
|
||||||
|
|
||||||
my $tiles; |
|
||||||
open $tiles, "$ENV{HOME}/RPG-stuff/WestOfVipers/coordinate-mapping"; |
|
||||||
|
|
||||||
my $region = <$tiles>; |
|
||||||
chomp($region); |
|
||||||
while(my $coords = <$tiles>) |
|
||||||
{ |
|
||||||
if ($coords =~ /^\s*$/) |
|
||||||
{ |
|
||||||
$region = <$tiles>; |
|
||||||
chomp($region); |
|
||||||
next; |
|
||||||
} |
|
||||||
chomp $coords; |
|
||||||
my %settings; |
|
||||||
if($coords =~ /:$/) |
|
||||||
{ |
|
||||||
for(my $line = <$tiles>; $line !~ /^;/; $line = <$tiles>) |
|
||||||
{ |
|
||||||
my($key, $val) = split /:/, $line; |
|
||||||
$settings{$key} = $val; |
|
||||||
} |
|
||||||
chop($coords); |
|
||||||
} |
|
||||||
my ($nw,$sw) = split /,/, $coords; |
|
||||||
my $tile = $grid->{regions}{$region}->make_tile_at($nw, $sw, %settings); |
|
||||||
if($region eq "Necromancer") |
|
||||||
{ |
|
||||||
$tile->pin(new HexGrid::Pin(id => "circle-pin", icon => "foo2.svg", name => "zap", description => scalar $lorem->paragraphs(4), href => 'http://www.tensor.green')); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
close $tiles; |
|
||||||
|
|
||||||
# $grid->get_tile_at(0,0)->pin( |
|
||||||
# $grid->{regions}{"Viper's Gate"}{tiles}{0}{0}->pin( |
|
||||||
# { |
|
||||||
# 'n' => new HexGrid::Pin(icon => "1"), |
|
||||||
# 'se' => new HexGrid::Pin(icon => "2"), |
|
||||||
# 'sw' => new HexGrid::Pin(icon => "3") |
|
||||||
# } |
|
||||||
# ); |
|
||||||
|
|
||||||
# $grid->get_tile_at(0,0)->pin( |
|
||||||
# new HexGrid::Pin(icon => "foo2.svg"), |
|
||||||
# 'se' |
|
||||||
# ); |
|
||||||
# $grid->get_tile_at(0,0)->pin( |
|
||||||
# new HexGrid::Pin(icon => "mountain.svg") |
|
||||||
# ); |
|
||||||
# $grid->get_tile_at(0,0)->pin( |
|
||||||
# new HexGrid::Pin(icon => "foo2.svg") |
|
||||||
# ); |
|
||||||
# $grid->{regions}{"Viper's Gate"}{tiles}{0}{0}->pin( |
|
||||||
# new HexGrid::Pin(icon => "2") |
|
||||||
# ); |
|
||||||
# $grid->{regions}{"Viper's Gate"}{tiles}{0}{0}->pin( |
|
||||||
# new HexGrid::Pin(icon => "3"), |
|
||||||
# 'sw' |
|
||||||
# ); |
|
||||||
|
|
||||||
say "<!DOCTYPE html>"; |
|
||||||
say "<html>\n<body>"; |
|
||||||
say <<EOS; |
|
||||||
<script> |
|
||||||
function clickPin(pinId, containerId) { |
|
||||||
let popup = document.getElementById(pinId + '-popup'); |
|
||||||
popup.style.visibility = popup.style.visibility == 'visible' ? 'hidden' : 'visible'; |
|
||||||
} |
|
||||||
</script> |
|
||||||
EOS |
|
||||||
say $grid->render; |
|
||||||
# $grid->render; |
|
||||||
say "</body>\n</html>"; |
|
||||||
|
|
||||||
sub random_colour |
|
||||||
{ |
|
||||||
my $str = '#'; |
|
||||||
$str .= sprintf('%02X', int(rand(256))) for 1..3; |
|
||||||
return $str; |
|
||||||
} |
|
@ -1,109 +0,0 @@ |
|||||||
use v5.30; |
|
||||||
|
|
||||||
use HexGrid; |
|
||||||
use HexGrid::Pin; |
|
||||||
use MWTemplate; |
|
||||||
use Getopt::Long; |
|
||||||
use File::Find; |
|
||||||
use File::Basename; |
|
||||||
use Carp; |
|
||||||
|
|
||||||
use Data::Dumper; |
|
||||||
$Data::Dumper::Indent = 1; |
|
||||||
|
|
||||||
use feature "signatures"; |
|
||||||
no warnings "experimental::signatures"; |
|
||||||
|
|
||||||
my $template_name = "MapRegion"; |
|
||||||
|
|
||||||
my $border_width = 1; |
|
||||||
my $border_colour = 'black'; |
|
||||||
my $show_coords = 0; |
|
||||||
|
|
||||||
my @region_files; |
|
||||||
my @pin_files; |
|
||||||
my @include_dirs; |
|
||||||
|
|
||||||
GetOptions( |
|
||||||
'border-width=f' => \$border_width, |
|
||||||
'border-colour|border-color=s' => \$border_colour, |
|
||||||
'show-coords|coords!' => \$show_coords, |
|
||||||
'region-file=s' => \@region_files, |
|
||||||
'pin-file=s' => \@pin_files, |
|
||||||
'directory|include-directory=s' => \@include_dirs |
|
||||||
); |
|
||||||
|
|
||||||
my $grid = HexGrid->new(defaults => { |
|
||||||
style => { 'stroke-width' => $border_width, stroke => $border_colour }, |
|
||||||
show_coords => $show_coords }); |
|
||||||
|
|
||||||
@region_files = split(/,/, join(',', @region_files)); |
|
||||||
@pin_files = split(/,/, join(',', @pin_files)); |
|
||||||
@include_dirs = split(/,/, join(',', @include_dirs)); |
|
||||||
|
|
||||||
find(sub |
|
||||||
{ |
|
||||||
push @region_files, $File::Find::name if /\.region$/; |
|
||||||
push @pin_files, $File::Find::name if /\.pin$/; |
|
||||||
}, @include_dirs); |
|
||||||
|
|
||||||
foreach my $file (@region_files) |
|
||||||
{ |
|
||||||
my $name = fileparse($file, qr/\.region/); |
|
||||||
open my $fh, $file || croak "Couldn't open region file $file: $!"; |
|
||||||
my @region_lines = <$fh>; |
|
||||||
close $fh; |
|
||||||
my $tiles_file = $file; |
|
||||||
$tiles_file =~ s/region$/tiles/; |
|
||||||
open my $tfh, $tiles_file || croak "Couldn't open tiles file $tiles_file: $!"; |
|
||||||
my @tiles = <$tfh>; |
|
||||||
close $tfh; |
|
||||||
process_region($grid, $name, (join "", @region_lines), (join "", @tiles)); |
|
||||||
} |
|
||||||
foreach my $file (@pin_files) |
|
||||||
{ |
|
||||||
my $name = fileparse($file, qr/\.pin/); |
|
||||||
open my $fh, $file || croak "Couldn't open pin file $file: $!"; |
|
||||||
my @lines = <$fh>; |
|
||||||
close $fh; |
|
||||||
process_pin($grid, $name, @lines); |
|
||||||
} |
|
||||||
|
|
||||||
say wrap_in_html($grid); |
|
||||||
|
|
||||||
sub process_region($grid, $name, $region_spec, $tiles) |
|
||||||
{ |
|
||||||
my $region = $grid->make_region($name); |
|
||||||
my $parsed_template = MWTemplate::Parse($region_spec, $template_name); |
|
||||||
$region->{defaults}{colour} = $parsed_template->{named_params}{colour}; |
|
||||||
$region->{defaults}{image} = $parsed_template->{named_params}{background}; |
|
||||||
say STDERR Dumper($tiles); |
|
||||||
|
|
||||||
foreach my $coords (split /;/, $tiles) |
|
||||||
{ |
|
||||||
# The below regex is a whitespace forgiving version of /^(-?\d+),(-?\d+)/, an int pair |
|
||||||
do { carp "Skipping bad spec: $coords"; next; } |
|
||||||
unless $coords =~ /^\s*(-?\s*\d+)\s*,\s*(-?\s*\d+)\s*$/; |
|
||||||
$region->make_tile_at($1,$2); |
|
||||||
} |
|
||||||
} |
|
||||||
sub process_pin($file) |
|
||||||
{ |
|
||||||
} |
|
||||||
|
|
||||||
sub wrap_in_html($grid) |
|
||||||
{ |
|
||||||
my $html_builder = "<!DOCTYPE html>"; |
|
||||||
$html_builder .= "\n<html>\n<body>"; |
|
||||||
$html_builder .= "\n" . <<EOS; |
|
||||||
<script> |
|
||||||
function clickPin(pinId, containerId) { |
|
||||||
let popup = document.getElementById(pinId + '-popup'); |
|
||||||
popup.style.visibility = popup.style.visibility == 'visible' ? 'hidden' : 'visible'; |
|
||||||
} |
|
||||||
</script> |
|
||||||
EOS |
|
||||||
$html_builder .= "\n" . $grid->render; |
|
||||||
$html_builder .= "\n</body>\n</html>"; |
|
||||||
return $html_builder; |
|
||||||
} |
|
Loading…
Reference in new issue