File Coverage

blib/lib/Empyrion/Blueprint.pm
Criterion Covered Total %
statement 23 42 54.7
branch 2 14 14.2
condition n/a
subroutine 8 16 50.0
pod 0 13 0.0
total 33 85 38.8


line stmt bran cond sub pod time code
1             package Empyrion::Blueprint;
2             our $AUTHORITY = 'cpan:GETTY';
3             # ABSTRACT: Class representing an Empyrion blueprint
4             $Empyrion::Blueprint::VERSION = '0.003';
5 2     2   14581 use Empyrion::Base;
  2         5  
  2         9  
6              
7             has bytes => (
8             is => 'ro',
9             required => 1,
10             );
11              
12             around BUILDARGS => sub {
13             my ( $orig, $class, @args ) = @_;
14            
15             if (scalar @args % 2) {
16             my $filename = shift @args;
17             my $bytes = path($filename)->slurp_raw;
18             push @args, bytes => $bytes;
19             }
20              
21             return $class->$orig(@args);
22             };
23              
24             has data => (
25             is => 'lazy',
26             clearer => 'reset_data',
27             );
28              
29             sub _build_data {
30 5     5   294 my ( $self ) = @_;
31 5         4 my %data;
32 5         394 my @ba = map { ord($_) } split(//, $self->bytes);
  5435         3516  
33 5         252 $data{type} = $ba[0x08];
34 5         6 $data{height} = $ba[0x0D];
35 5         6 $data{width} = $ba[0x09];
36 5         5 $data{depth} = $ba[0x11];
37 5         5 $data{remove_terrain} = $ba[0x21];
38 5         5 $data{spawn_group_length} = $ba[0x64];
39 5 100       12 $data{spawn_group} = join('',map { chr($_) } @ba[0x65 .. (0x64+$data{spawn_group_length})]) if $data{spawn_group_length};
  8         10  
40 5         27 $data{z_position} = unpack("l",pack("C*",@ba[0x2B .. 0x2E]));
41 5         108 return \%data;
42             }
43              
44 5     5 0 217 sub type { shift->data->{type} }
45 5     5 0 91 sub height { shift->data->{height} }
46 5     5 0 1257 sub width { shift->data->{width} }
47 5     5 0 1248 sub depth { shift->data->{depth} }
48 5     5 0 1238 sub remove_terrain { shift->data->{remove_terrain} }
49 0     0 0 0 sub spawn_group_length { shift->data->{spawn_group_length} }
50 0     0 0 0 sub spawn_group { shift->data->{spawn_group} }
51 5     5 0 1239 sub z_position { shift->data->{z_position} }
52              
53             sub type_name {
54 0     0 0   my ( $self ) = @_;
55 0 0         return $self->type == 16 ? 'Hover Vessel'
    0          
    0          
    0          
56             : $self->type == 8 ? 'Capital Vessel'
57             : $self->type == 4 ? 'Small Vessel'
58             : $self->type == 2 ? 'Base'
59             : 'Unknown Type '.$self->type;
60             }
61              
62             sub _replace {
63 0     0     my ( $self, $from, $length, $new ) = @_;
64 0           substr($self->bytes,$from,$length,$new);
65 0           $self->reset_data;
66 0           return $self;
67             }
68              
69             sub set_spawn_group {
70 0     0 0   my ( $self, $name ) = @_;
71 0 0         $name = "" unless defined $name;
72 0           return $self->_replace(0x64,$self->spawn_group_length+1,chr(length($name)).$name);
73             }
74              
75             sub set_remove_terrain {
76 0     0 0   my ( $self, $remove_terrain ) = @_;
77 0 0         return $self->_replace(0x21,1,chr($remove_terrain ? 1 : 0));
78             }
79              
80             sub set_z_position {
81 0     0 0   my ( $self, $z_position ) = @_;
82 0           return $self->_replace(0x2B,4,pack("l",$z_position));
83             }
84              
85             sub save {
86 0     0 0   my ( $self, $filename ) = @_;
87 0           my $path = path($filename);
88 0           $path->spew_raw($self->bytes);
89 0           return $path;
90             }
91              
92             1;
93              
94             __END__