File Coverage

File:blib/lib/Language/Homespring/Salmon.pm
Coverage:94.7%

linestmtbrancondsubtimecode
1package Language::Homespring::Salmon;
2
3$VERSION = 0.02;
4
5
4
4
4
17
10
18
use warnings;
6
4
4
4
25
7
17
use strict;
7
8my $salmon_count = 0;
9
10sub new {
11
187
432
        my $class = shift;
12
187
593
        my $self = bless {}, $class;
13
14
187
415
        my $options = shift;
15
187
615
        $self->{interp} = $options->{interp};
16
187
1092
        $self->{value} = $options->{value} || 'homeless';
17
187
1002
        $self->{upstream} = $options->{upstream} || 0;
18
187
957
        $self->{mature} = $options->{mature} || 0;
19
187
579
        $self->{location} = $options->{location};
20
187
462
        $self->{time_in_river} = 0;
21
187
489
        $self->{uid} = ++$salmon_count;
22
23        #print "Creating salmon : ".$self->debug()."\n";
24
25
187
522
        return $self;
26}
27
28sub move {
29
338
828
        my ($self) = @_;
30
338
657
        my ($node_to_pass, $river_target);
31
32
338
996
        if ($self->{upstream}){
33
90
276
                $node_to_pass = $self->{location}->{up_node};
34
90
166
                $river_target = undef;
35
90
245
                if ($node_to_pass){
36
90
90
141
271
                        my $count = scalar(@{$node_to_pass->{rivers_up}});
37
90
264
                        if ($count){
38
11
11
21
40
                                $river_target = @{$node_to_pass->{rivers_up}}[0];
39                        }
40                }
41        }else{
42
248
772
                $node_to_pass = $self->{location}->{down_node};
43
248
632
                $river_target = $node_to_pass->{river_down};
44        }
45
46
338
764
        $self->{time_in_river}++;
47
48        ##
49        ## see if we can pass the next node
50        ##
51
52
338
818
        my $node_name = $node_to_pass->{node_name};
53
54
338
1907
        return if (($node_to_pass->{node_name} eq 'shallows') && ($self->{mature}) && ($self->{time_in_river} == 1));
55
335
1839
        return if (($node_to_pass->{node_name} eq 'rapids') && (!$self->{mature}) && ($self->{time_in_river} == 1));
56
57
332
1508
        return if (($node_to_pass->{node_name} eq 'net') && ($self->{mature}));
58
326
1461
        return if (($node_to_pass->{node_name} eq 'current') && (!$self->{mature}));
59
60
323
1538
        if (($node_to_pass->{node_name} eq 'bear') && ($self->{mature})){
61
19
54
                $self->kill();
62
19
83
                return;
63        }
64
65
304
1354
        if (($node_to_pass->{node_name} eq 'young bear') && ($self->{mature})){
66
4
15
                if ($node_to_pass->every_other()){
67
2
6
                        $self->kill();
68
2
9
                        return;
69                }
70        }
71
72
302
1358
        if (($node_to_pass->{node_name} eq 'bird') && (!$self->{mature})){
73
2
5
                $self->kill();
74
2
7
                return;
75        }
76
77
300
1413
        if (($node_to_pass->{node_name} eq 'force field') && ($node_to_pass->{power})){
78
15
45
                if ($self->{upstream}){
79
5
15
                        $self->spawn($node_to_pass);
80                }else{
81
10
38
                        return;
82                }
83        }
84
85        ##
86        ## do we have a new river to swim into?
87        ##
88
89
290
730
        if (defined($river_target)){
90
91
147
358
                $self->{location} = $river_target;
92
147
720
                $self->{time_in_river} = 0;
93
94        }else{
95
96                # if there's nowhere to go,
97                # either spawn or print
98
99
143
431
                if ($self->{upstream}){
100
79
233
                        $self->spawn($node_to_pass);
101                }else{
102
64
177
                        $self->output();
103                }
104        }
105
106}
107
108sub spawn {
109
84
220
        my ($self, $spring) = @_;
110
111        #print "spawning in river ".$self->{location}->{uid}." from node ".$spring->debug()."\n";
112
113
84
332
        my $value = ($spring->{spring})?$spring->{node_name}:'nameless';
114
84
655
        my $new_salmon = new Language::Homespring::Salmon({
115                'interp' => $self->{interp},
116                'value' => $value,
117                'upstream' => 0,
118                'mature' => 0,
119                'location' => $self->{location},
120        });
121
84
84
207
332
        push @{$self->{interp}->{new_salmon}}, $new_salmon;
122
84
214
        $self->{upstream} = 0;
123
84
428
        $self->{mature} = 1;
124}
125
126sub output {
127
64
159
        my ($self) = @_;
128
64
243
        $self->{interp}->{output} .= $self->{value};
129
64
169
        $self->kill();
130}
131
132sub kill {
133
87
203
        my ($self) = @_;
134
87
217
        $self->{value} = 'DEAD';
135
87
87
140
546
        push @{$self->{interp}->{dead_salmon}}, $_;
136}
137
138sub debug {
139
0
        my ($self) = @_;
140
141
0
        return "salmon $self->{uid} in river ".$self->{location}->{uid}." ("
142                .(($self->{mature})?'mature':'young')
143                .") swimming "
144                .(($self->{upstream})?'upsteam':'downstream')
145                ."\n";
146
147}
148
1491;
150