2010/06/30追記:奇行百出 Lv6 の范増さんから、ぽちがマップサイズを間違えている事を教えていただいて訂正しました。このまま間違えっぱなしだともっと恥ずかしい事になっていました。ありがとうございます。
ブラウザゲームのブラウザ三国志にハマったぽちですけども、遊んでるうちに少し不便な事に気が付きました。ブラウザ三国志では、地図は本拠地最寄りの 21 x 21マスまでだけしか表示されず、1200 x 1200マス 1201 x 1201マスの全マップを概観する事は出来ません。これでは遠くの位置関係をぱっと把握するのが難しくて、遠くへ援軍を出したり遠征したりするのにイメージしづらかったりします。
そこでブラウザ三国志のマップ全体を概観して、領地の分布図を作る為の支援ツールを作ってみました。
ブラウザ三国志の君主のプロフィールページには国情報として領地の座標が記されています。このツールはそれをコピペしたテキストファイルを入力元に、画像ファイルへ 1200 x 1200 1201 x 1201 の png形式で領地分布図を出力します。
このツールでは描画に cairo というライブラリを cairo-perl という Perlバインディングを通して使っています。debian squeeze では、
$ sudo apt-get install libcairo-perl
と cairo-perl をインストールしてやれば、依存関係のある cairo も一緒にインストールされます。
sangmap.pl に実行権限を与えた後で、君主のプロフィールページの国情報をコピペしたテキストファイルを入力元として用意し、
$ ./sangmap.pl -c [16進カラーコード] -o [出力先ファイル名] [入力元ファイル名] $ ./sangmap.pl -c 0000ff -o image_file.png sources.txt
カラーコードと出力先ファイル名は省略出来ます。
$ ./sangmap.pl sources.txt
この場合ドットの色はデフォルト値の青になり、出力先ファイル名は、入力元ファイル名.png になります。
#!/usr/bin/env perl
use strict;
use warnings;
use Getopt::Std;
use Cairo;
my %opts;
my (@x, @y);
my ($r, $g, $b, $file_name);
my $usage = "Usage: $0 [-c hex color code] [-o outfile] [infile]\n";
getopts("c:ho:" => \%opts);
if ($opts{'c'}){
my $str = $opts{'c'};
if ($str =~ /([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})/){
$r = (hex $1) / 255;
$g = (hex $2) / 255;
$b = (hex $3) / 255;
}
} else {
$r = 0; $g = 0; $b = 1;
}
if ($opts{'o'}){
$file_name = $opts{'o'};
} elsif (@ARGV){
$file_name = "$ARGV[0].png";
} elsif ($opts{'h'}){
die $usage;
} else {
die $usage;
}
while (<>){
if (/(\t\-?\d+)\,(\-?\d+)/){
my $x = $1 + 600;
my $y;
if ($2 < 0){
$y = -$2 + 600;
} else {
$y = 600 - $2;
}
push @x, $x;
push @y, $y;
}
}
my $surface = Cairo::ImageSurface->create('argb32', 1201, 1201);
my $cr = Cairo::Context->create($surface);
while (@x){
my $out_x = shift @x;
my $out_y = shift @y;
$cr->rectangle($out_x, $out_y, 1, 1);
$cr->set_source_rgb($r, $g, $b);
$cr->fill;
}
$cr->show_page;
$surface->write_to_png("$file_name");
# Copyright (c) 2010, 犬山ぽち丸
# このコードは、Perl自体と同じライセンスで配布します。
# Copyright (c) 2010, Pochimaru Inuyama. All rights reserved.
# This code is distributed under the same terms as Perl itself.
動作確認環境 : Perl 5.10.1 on Debian GNU/Linux 6.0 squeeze