ブラウザ三国志領地マップ作成支援ツールを作ってみた

2010/06/30追記:奇行百出 Lv6 の范増さんから、ぽちがマップサイズを間違えている事を教えていただいて訂正しました。このまま間違えっぱなしだともっと恥ずかしい事になっていました。ありがとうございます。

ブラウザゲームのブラウザ三国志にハマったぽちですけども、遊んでるうちに少し不便な事に気が付きました。ブラウザ三国志では、地図は本拠地最寄りの 21 x 21マスまでだけしか表示されず、1200 x 1200マス 1201 x 1201マスの全マップを概観する事は出来ません。これでは遠くの位置関係をぱっと把握するのが難しくて、遠くへ援軍を出したり遠征したりするのにイメージしづらかったりします。

そこでブラウザ三国志のマップ全体を概観して、領地の分布図を作る為の支援ツールを作ってみました。

機能

ブラウザ三国志の君主のプロフィールページには国情報として領地の座標が記されています。このツールはそれをコピペしたテキストファイルを入力元に、画像ファイルへ 1200 x 1200 1201 x 1201png形式で領地分布図を出力します。

動かすのに必要ないろいろ

このツールでは描画に 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 になります。

コード

  • sangmap.pl
#!/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

戻る


Last updated : 2011/03/27
Author : 犬山ぽち丸 / INUYAMA Pochimaru / Pochimaru Inuyama
E-mail : pochi@hoshinoumi.net
Key ID : 4A1B5E85
Key fingerprint : 4605 4D40 6154 20C1 5592 3E54 5A37 FEE9 4A1B 5E85

正当な XHTML 1.1 です 正当な CSS です