File Coverage

File:blib/lib/Language/Homespring/Node.pm
Coverage:68.1%

linestmtbrancondsubtimecode
1package Language::Homespring::Node;
2
3$VERSION = 0.02;
4
5
4
4
4
18
10
22
use warnings;
6
4
4
4
25
7
21
use strict;
7
8my $node_count = 0;
9
10sub new {
11
121
285
        my $class = shift;
12
121
375
        my $self = bless {}, $class;
13
14
121
266
        my $options = shift;
15
121
399
        $self->{interp} = $options->{interp};
16
121
599
        $self->{parent_node} = $options->{parent_node} || undef;
17
121
524
        $self->{node_name} = $options->{node_name} || '';
18
121
376
        $self->{child_nodes} = [];
19
121
336
        $self->{rivers_up} = [];
20
121
316
        $self->{river_down} = undef;
21
121
291
        $self->{power} = 0;
22
121
340
        $self->{water} = 0;
23
121
301
        $self->{destroyed} = 0;
24
121
309
        $self->{spring} = $self->_is_spring();
25
121
336
        $self->{uid} = ++$node_count;
26
121
301
        $self->{depth} = 0;
27
121
416
        $self->{node_name_safe} = $self->_make_safe($options->{node_name});
28
121
321
        $self->{toggle} = 0;
29
30        # easier to deal with lowercase commands :)
31
121
589
        $self->{node_name} = lc($self->{node_name}) if (!$self->{spring});
32
33
121
368
        return $self;
34}
35
36sub add_child {
37
95
256
        my ($self, $child) = @_;
38
95
95
148
379
        push @{$self->{child_nodes}}, $child;
39}
40
41sub get_salmon {
42
0
0
        my ($self) = @_;
43
0
0
        my @out;
44
0
0
0
0
        for (@{$self->{interp}->{salmon}}){
45
0
0
                if ($_->{location} eq $self){
46
0
0
                        push @out, $_;
47                }
48        }
49
0
0
        return @out;
50}
51
52sub get_depth {
53
0
0
        my ($self) = @_;
54
55
0
0
        if (!$self->{depth}){
56
0
0
0
0
                if (scalar(@{$self->{child_nodes}})){
57
0
0
0
0
                        for (@{$self->{child_nodes}}){
58
0
0
                                $self->{depth} += $_->get_depth();
59                        }
60                }else{
61
0
0
                        $self->{depth} = 2;
62                }
63        }
64
65
0
0
        return $self->{depth};
66}
67
68sub _is_spring {
69
121
311
        my ($self) = @_;
70
71
121
1847
        my @keywords = (
72'powers',
73'hydro power',
74'power invert',
75'marshy',
76'shallows',
77'rapids',
78'bear',
79'young bear',
80'bird',
81'upstream killing device',
82'net',
83'current',
84'insulated',
85'force field',
86'bridge',
87'waterfall',
88'evaporates',
89'pump',
90'fear',
91'lock',
92'inverse lock',
93'narrows',
94'sense',
95'switch',
96'upstream sense',
97'downstream sense',
98'range sense',
99'range switch',
100'young sense',
101'young switch',
102'young range sense',
103'young range switch',
104'youth fountain',
105'time',
106'reverse up',
107'reverse down',
108'force up',
109'force down',
110'hatchery',
111'snowmelt',
112'append down',
113'append up',
114'clone',
115'universe',
116'oblivion',
117'spawn',
118'split',
119        );
120
121
121
324
        for (@keywords){
122
2991
13733
                return 0 if (lc $_ eq lc $self->{node_name});
123        }
124
30
152
        return 1;
125}
126
127sub _make_safe {
128
121
325
        my ($self, $name) = @_;
129
130
121
338
        if ($name){
131
121
284
                $name =~ s/\n/\\n/g;
132        }
133
134
121
388
        return $name;
135}
136
137sub add_river_up {
138
95
262
        my ($self, $river) = @_;
139
95
95
147
366
        push @{$self->{rivers_up}}, $river;
140}
141
142sub add_river_down {
143
95
246
        my ($self, $river) = @_;
144
95
300
        $self->{river_down} = $river;
145}
146
147sub debug {
148
0
0
        my ($self) = @_;
149
0
0
        return "node $self->{uid} ($self->{node_name_safe})";
150}
151
152sub every_other {
153
4
9
        my ($self) = @_;
154
4
13
        $self->{toggle} = !$self->{toggle};
155
4
19
        return $self->{toggle};
156}
157
1581;
159