Benutzer:Count Ypsilon/Skript:mapcolor.pl

aus FreewarWiki, der Referenz für Freewar
Zur Navigation springen Zur Suche springen

Dieses Perl-Skript erzeugt aus einer NPC-Liste (Benutzer:Count Ypsilon/Skript:npclist.pl) und einer Kartenfeld-Liste (Benutzer:Count Ypsilon/Skript:maplist.pl) eine Liste, die jedem Kartenfeld einen Farbcode zuordnet, der von der Stärke der vorhandenen NPCs abhängig ist.

#!/usr/bin/perl

# NPC-Liste einlesen
# Format: 
# NPC-Name,Angriff,LP,XP,GM

sub trim{
 my $s = shift;
 $s =~ s/^\s+|\s+$//g;
 return $s;
}

open(NPC, "npclist.out");

while(<NPC>)
{
    chomp;
    my ($name, $atk, $lp, $xp, $gm) = split(/;/);
    $name = trim($name);
    $npc{$name}->{"atk"}=$atk;
    $npc{$name}->{"lp"}=$lp;
    $npc{$name}->{"xp"}=$xp;
    $npc{$name}->{"gm"}=$gm;
# print "name=$name, atk=$atk, lp=$lp, xp=$xp, gm=$gm\n";    
}
close(NPC);

# Liste der Kartenfelder einlesen
# Format:
# Gebietsname,X,Y,NPC-Name

open(MAP, "maplist.out");
while(<MAP>)
{
    chomp;
    my ($mapname, $begehbar, $x, $y, $npcname) = split(/;/);

    $npcname = trim($npcname);
    $fieldused->{$x}->{$y} = 1;
    # es folgt eine Bastelheuristik, die die in der Kartenliste
    # auftretenden NPC-Namen mit denen aus der NPC-Liste in Ein-
    # klang bringt (Worttrennung entfernen usw.)
    $tmpname = $npcname;
    

    if (!defined($npc{$tmpname}))
    {
        $tmpname =~ s/- //g;
        if (!defined($npc{$tmpname}))
        {
            $tmpname = $npcname;
            $tmpname =~ s/- /-/g;
            if (!defined($npc{$tmpname}))
            {
                $tmpname = ucfirst($npcname);
                $tmpname =~ s/- //g;
                if (!defined($npc{$tmpname}))
                {
                    $tmpname = ucfirst($npcname);
                    $tmpname =~ s/- /-/g;
                }
            }
        }
    }
    if (!defined($npc{$tmpname}))
    {
        # evtl. Warnung ausgeben
        printf STDERR "$tmpname nicht definiert\n" unless $tmpname eq "";
    }
    else
    {
        # Ausgabe: X,Y,Farbcode
        printf "$x,$y,%d\n", npclass($npc{$tmpname});
    }
}

# NPCs in eine Klasse von 1 (schwach) bis 9 (stark) einordnen.
# Geschieht hier einfach durch eine Betrachtung des Produkts
# aus LP und A.
sub npclass
{
    my ($npc)=@_;
    my $i = $npc->{"lp"}*$npc->{"atk"};
    return 1 if ($i<8);
    return 2 if ($i<18); 
    return 3 if ($i<31);
    return 4 if ($i<51); 
    return 5 if ($i<201);
    return 6 if ($i<2001); 
    return 7 if ($i<10001); 
    return 8 if ($i<100001);
    return 9;
}