File Coverage

script/traveller
Criterion Covered Total %
statement 34 39 87.1
branch 0 4 0.0
condition n/a
subroutine 12 13 92.3
pod n/a
total 46 56 82.1


line stmt bran cond sub pod time code
1             #!/usr/bin/perl
2             # Copyright (C) 2009-2021 Alex Schroeder
3             # Copyright (C) 2020 Christian Carey
4             #
5             # This program is free software: you can redistribute it and/or modify it under
6             # the terms of the GNU General Public License as published by the Free Software
7             # Foundation, either version 3 of the License, or (at your option) any later
8             # version.
9             #
10             # This program is distributed in the hope that it will be useful, but WITHOUT
11             # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12             # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
13             #
14             # You should have received a copy of the GNU General Public License along with
15             # this program. If not, see .
16              
17             # Use the library matching the installation location of the script being called.
18 2     2   1116182 use FindBin;
  2         1973  
  2         109  
19 2     2   744 use lib "$FindBin::Bin/../lib";
  2         1104  
  2         14  
20              
21             package Traveller;
22 2     2   960 use Traveller::Subsector;
  2         5  
  2         11  
23 2     2   784 use Traveller::Mapper::Classic::MPTS;
  2         7  
  2         18  
24 2     2   122 use Traveller::Mapper::Classic;
  2         3  
  2         14  
25 2     2   54 use Traveller::Mapper;
  2         4  
  2         8  
26 2     2   52 use Traveller::Util qw(flush);
  2         4  
  2         95  
27 2     2   9 use Modern::Perl;
  2         2  
  2         20  
28 2     2   1972 use Mojolicious::Lite;
  2         670899  
  2         32  
29 2     2   92937 use POSIX qw(INT_MAX);
  2         6  
  2         21  
30 2     2   224 use utf8;
  2         4  
  2         10  
31              
32             get '/' => sub {
33             my $c = shift;
34             $c->redirect_to('main');
35             };
36              
37             get '/random' => sub {
38             my $c = shift;
39             my $id = int(rand(INT_MAX));
40             $c->redirect_to($c->url_for('uwp', size => 'subsector', rules => 'mgp', id => $id));
41             };
42              
43             get '/random/:size' => [size => ['subsector', 'sector']] => sub {
44             my $c = shift;
45             my $size = $c->param('size');
46             my $id = int(rand(INT_MAX));
47             $c->redirect_to($c->url_for('uwp', size => $size, rules => 'mgp', id => $id));
48             };
49              
50             get '/random/:size/:rules' => [size => ['subsector', 'sector']] => sub {
51             my $c = shift;
52             my $size = $c->param('size');
53             my $rules = $c->param('rules');
54             my $density = $c->param('density');
55             my $id = int(rand(INT_MAX));
56             $c->redirect_to($c->url_for('uwp', size => $size, rules => $rules, id => $id)->query(density => $density));
57             } => 'random';
58              
59             get '/:id' => [id => qr/\d+/] => sub {
60             my $c = shift;
61             my $id = $c->param('id');
62             $c->redirect_to($c->url_for('uwp', size => 'subsector', rules => 'mgp', id => $id));
63             };
64              
65             get '/uwp/:id' => [id => qr/\d+/] => sub {
66             my $c = shift;
67             my $id = $c->param('id');
68             $c->redirect_to($c->url_for('uwp', size => 'subsector', rules => 'mgp', id => $id));
69             };
70              
71             get '/uwp/:size/:id' => [size => ['subsector', 'sector']] => [id => qr/\d+/] => sub {
72             my $c = shift;
73             my $size = $c->param('size');
74             my $id = $c->param('id');
75             $c->redirect_to($c->url_for('uwp', size => $size, rules => 'mgp', id => $id));
76             };
77              
78             get '/uwp/:size/:rules/:id' => [size => ['subsector', 'sector']] => [id => qr/\d+/] => sub {
79             my $c = shift;
80             my $size = $c->param('size');
81             my $rules = $c->param('rules');
82             my $id = $c->param('id');
83             my $density = $c->param('density') || 50;
84             srand($id);
85             if ($size eq 'sector') {
86             my $uwp = subsector()->init(32, 40, $rules, $density/100)->str;
87             $c->render(template => 'uwp-sector', id => $id, rules => $rules, uwp => $uwp, density => $density);
88             } else {
89             my $uwp = subsector()->init(8, 10, $rules, $density/100)->str;
90             $c->render(template => 'uwp', id => $id, rules => $rules, uwp => $uwp, density => $density);
91             }
92             flush();
93             } => 'uwp';
94              
95             any '/edit' => sub {
96             my $c = shift;
97             my $uwp = $c->param('map');
98             $c->render(template => 'edit', uwp => Traveller::Mapper::example(), size => 'subsector', rules => 'mgp', id => '');
99             } => 'main';
100              
101             get '/edit/:id' => [id => qr/\d+/] => sub {
102             my $c = shift;
103             my $id = $c->param('id');
104             $c->redirect_to($c->url_for('edit', size => 'subsector', rules => 'mgp', id => $id));
105             };
106              
107             get '/edit/:size/:id' => [size => ['subsector', 'sector']] => [id => qr/\d+/] => sub {
108             my $c = shift;
109             my $size = $c->param('size');
110             my $id = $c->param('id');
111             $c->redirect_to($c->url_for('edit', size => $size, rules => 'mgp', id => $id));
112             };
113              
114             get '/edit/:size/:rules/:id' => [size => ['subsector', 'sector']] => [id => qr/\d+/] => sub {
115             my $c = shift;
116             my $size = $c->param('size');
117             my $rules = $c->param('rules');
118             my $id = $c->param('id');
119             my $density = $c->param('density');
120             srand($id);
121             if ($size eq 'sector') {
122             my $uwp = subsector()->init(32, 40, $rules, $density)->str;
123             $c->render(template => 'edit-sector', id => $id, rules => $rules, uwp => $uwp);
124             } else {
125             my $uwp = subsector()->init(8, 10, $rules, $density)->str;
126             $c->render(template => 'edit', id => $id, rules => $rules, uwp => $uwp);
127             }
128             flush();
129             } => 'edit';
130              
131             # → see any '/map' below!
132             # get '/map' => sub {
133             # my $c = shift;
134             # $c->render(template => 'map_all', uwp => Traveller::Mapper::example(), size => 'subsector', rules => 'mgp');
135             # };
136              
137             get '/map/:id' => [id => qr/\d+/] => sub {
138             my $c = shift;
139             my $id = $c->param('id');
140             $c->redirect_to($c->url_for('map_all', size => 'subsector', rules => 'mgp', id => $id));
141             };
142              
143             get '/map/:size/:id' => [size => ['subsector', 'sector']] => [id => qr/\d+/] => sub {
144             my $c = shift;
145             my $size = $c->param('size');
146             my $id = $c->param('id');
147             $c->redirect_to($c->url_for('map_all', size => $size, rules => 'mgp', id => $id));
148             };
149              
150             get '/map/:size/:rules/:id' => [size => ['subsector', 'sector']] => [id => qr/\d+/] => sub {
151             my $c = shift;
152             my $size = $c->param('size');
153             my $rules = $c->param('rules');
154             my $id = $c->param('id');
155             my $wiki = $c->param('wiki');
156             my $density = $c->param('density') || 50;
157             srand($id);
158             my $map = mapper($rules);
159             my $uwp;
160             if ($size eq 'sector') {
161             $uwp = subsector()->init(32, 40, $rules, $density/100)->str;
162             } else {
163             $uwp = subsector()->init(8, 10, $rules, $density/100)->str;
164             }
165             my $url = $c->url_for('uwp', size => $size, rules => $rules, id => $id);
166             $url = $url->query(density => $density) if $density and $density != 50;
167             $map->initialize($uwp, $wiki, $url);
168             $map->communications();
169             $map->trade();
170             flush();
171             $c->render(text => $map->svg, format => 'svg');
172             } => 'map_all';
173              
174             any '/map' => sub {
175             my $c = shift;
176             my $wiki = $c->param('wiki');
177             my $trade = $c->param('trade');
178             my $uwp = $c->param('map') || Traveller::Mapper::example();
179             my $size = $c->param('size') || 'subsector';
180             my $rules = $c->param('rules') || 'mgp';
181             my $source;
182             if (!$uwp) {
183             my $id = int(rand(INT_MAX));
184             srand($id);
185             $uwp = subsector()->init(8, 10, $rules)->str;
186             $source = $c->url_for('uwp', id => $id);
187             }
188             my $map = mapper($rules);
189             $map->initialize($uwp, $wiki, $source);
190             $map->communications();
191             $map->trade();
192             flush();
193             if ($trade) {
194             $c->render(text => $map->text, format => 'txt');
195             } else {
196             $c->render(text => $map->svg, format => 'svg');
197             }
198             } => 'map';
199              
200             get '/help' => sub {
201             my $c = shift;
202             my $classic = $c->param('classic');
203             my $mpts = $c->param('mpts');
204             $c->render(classic => $classic, mpts => $mpts);
205             };
206              
207             sub subsector {
208 1     1   12 return Traveller::Subsector->new;
209             }
210              
211             sub mapper {
212 0     0     my $rules = shift;
213 0 0         if ($rules eq 'mpts') {
    0          
214 0           return Traveller::Mapper::Classic::MPTS->new;
215             } elsif ($rules eq 'ct') {
216 0           return Traveller::Mapper::Classic->new;
217             } else {
218 0           return Traveller::Mapper->new;
219             }
220             }
221              
222             app->start;
223              
224             __DATA__