root/dev/common/class.map.php @ 155

Revision 155, 12.4 KB (checked in by exi, 16 years ago)

Added option to paint systems on maps based on security rating.
Added most violent systems statistic to corp and alliance details.
Some fixes for files with short php tags.
Fixed a bug which prevented sql errors to halt page generation if enabled in config.
Added system details as whole page instead of a js popup for maps.
Battle summaries should now work if the hour of the kill is less than 10.
Removed obsolete stats.php.

Line 
1<?php
2require_once('db.php');
3require_once('globals.php');
4
5class MapView
6{
7    function MapView($mode, $size = 200)
8    {
9        $this->mode_ = $mode;
10        $this->imgwidth_ = $size;
11        $this->imgheight_ = $size;
12        $this->ly_ = 0.4 / 1000000000000000;
13        $this->offset_ = 10;
14
15        $this->sys_colors_[0] = array(200, 20, 48);
16        $this->sys_colors_[1] = array(200, 20, 48);
17        $this->sys_colors_[2] = array(200, 20, 48);
18        $this->sys_colors_[3] = array(241, 176, 48);
19        $this->sys_colors_[4] = array(200, 200, 48);
20        $this->sys_colors_[5] = array(219, 241, 48);
21        $this->sys_colors_[6] = array(103, 241, 62);
22        $this->sys_colors_[7] = array(83, 241, 114);
23        $this->sys_colors_[8] = array(26, 241, 183);
24        $this->sys_colors_[9] = array(99, 241, 255);
25        $this->sys_colors_[10] = array(99, 241, 255);
26
27        $this->linecolor_ = array(75, 75, 75);
28        $this->captioncolor_ = array(110, 110, 110);
29        $this->bgcolor_ = array(30, 30, 30);
30        $this->normalcolor_ = array(81, 103, 146);
31        $this->hlcolor_ = array(200, 200, 200);
32    }
33
34    function setbgcolor($r, $g, $b)
35    {
36        $this->bgcolor_ = array($r, $g, $b);
37    }
38
39    function setlinecolor($r, $g, $b)
40    {
41        $this->linecolor_ = array($r, $g, $b);
42    }
43
44    function setcaptcolor($r, $g, $b)
45    {
46        $this->captioncolor_ = array($r, $g, $b);
47    }
48
49    function setnormalcolor($r, $g, $b)
50    {
51        $this->normalcolor_ = array($r, $g, $b);
52    }
53
54    function sethlcolor($r, $g, $b)
55    {
56        $this->hlcolor_ = array($r, $g, $b);
57    }
58
59    function paintSecurity($bool)
60    {
61        $this->psec_ = $bool;
62    }
63
64    function setOffset($offset)
65    {
66        $this->offset_ = $offset;
67    }
68
69    function showLines($enable)
70    {
71        $this->showlines_ = $enable;
72    }
73
74    function showSysNames($enable)
75    {
76        $this->showsysnames_ = $enable;
77    }
78
79    function colorSystems($enable)
80    {
81        $this->colorsystems_ = $enable;
82    }
83
84    function setRegionID($regionid)
85    {
86        $this->regionid_ = $regionid;
87    }
88
89    function setSystemID($systemid)
90    {
91        $this->systemid_ = $systemid;
92
93        $sql = 'select reg.reg_id, reg.reg_name, con.con_id, con.con_name, sys.sys_name, sys.sys_sec
94                from kb3_regions reg, kb3_constellations con, kb3_systems sys
95               where reg.reg_id = con.con_reg_id
96                 and con.con_id = sys.sys_con_id
97                 and sys.sys_id = '.$this->systemid_;
98
99        $qry = new DBQuery();
100        $qry->execute($sql);
101        $row = $qry->getRow();
102
103        $this->conid_ = $row['con_id'];
104        $this->regionid_ = $row['reg_id'];
105        $this->conname_ = $row['con_name'];
106        $this->regname_ = $row['reg_name'];
107        $this->sysname_ = $row['sys_name'];
108        $this->syssec_ = $row['sys_sec'];
109    }
110
111    function setTitle($title)
112    {
113        $this->title_ = $title;
114    }
115
116    function secColor($img, $security)
117    {
118        if ($this->psec_)
119        {
120            if ($security > 0.05)
121            {
122                $sec_status = round($security * 10);
123                return imagecolorallocate($img, $this->sys_colors_[$sec_status][0],
124                                          $this->sys_colors_[$sec_status][1],
125                                          $this->sys_colors_[$sec_status][2]);
126            }
127        }
128
129        return imagecolorallocate($img, $this->normalcolor_[0], $this->normalcolor_[1], $this->normalcolor_[2]);
130    }
131
132    function generate()
133    {
134        $sql = 'select sys.sys_x, sys.sys_y, sys.sys_z, sys.sys_sec,
135                   sys.sys_id, sys.sys_name, sys.sys_eve_id, sjp.sjp_to, con.con_id,
136                       con.con_name, reg.reg_id, reg.reg_name,
137                       reg.reg_x, reg.reg_z
138                   from kb3_systems sys, kb3_system_jumps sjp,
139                       kb3_constellations con, kb3_regions reg
140                   where con.con_id = sys.sys_con_id
141                   and reg.reg_id = con.con_reg_id
142                   and sjp.sjp_from = sys.sys_eve_id';
143
144        $regioncache = "cache/map/" . $this->regionid_ . "_" . $this->imgwidth_ . ".png";
145        $cached = false;
146
147        if ($this->mode_ == "map")
148        {
149            if (file_exists($regioncache))
150            {
151                header("Content-type: image/png");
152                readfile($regioncache);
153                return;
154            }
155            $caption = $this->regname_;
156        }
157
158        if ($this->mode_ == "region")
159        {
160            $sql .= " and reg.reg_id = " . $this->regionid_;
161            $caption = $this->conname_;
162        }
163
164        if ($this->mode_ == "cons")
165        {
166            $sql .= " and con.con_id = " . $this->conid_;
167            $caption = $this->sysname_ . " (" . roundsec($this->syssec_) . ")";
168        }
169
170        if (!$cached)
171        {
172            $qry = new DBQuery();
173            $qry->execute($sql) or die($qry->getErrorMsg());
174
175            if (!$img) $img = imagecreatetruecolor($this->imgwidth_, $this->imgheight_);
176            $white = imagecolorallocate($img, 255, 255, 255);
177            $red = imagecolorallocate($img, 255, 0, 0);
178            $bgcolor = imagecolorallocate($img, $this->bgcolor_[0], $this->bgcolor_[1], $this->bgcolor_[2]);
179            imagefilledrectangle($img, 0, 0, $this->imgwidth_, $this->imgheight_, $bgcolor);
180
181            $color = $white;
182
183            $fov = 0;
184
185            $i = 0;
186            $minx = 0;
187            $minz = 0;
188            $maxx = 0;
189            $maxz = 0;
190            $mini = 0;
191            $maxi = 0;
192            $pi = 0;
193            $sc = 0;
194            while ($row = $qry->getRow())
195            {
196                $i = $row['sys_eve_id'];
197                if ($i < $mini || $mini == 0)
198                    $mini = $i;
199                if ($i > $maxi || $maxi == 0)
200                    $maxi = $i;
201                $x = $row['sys_x'] * $this->ly_;
202                $z = $row['sys_z'] * $this->ly_;
203
204                if ($x < $minx || $minx == 0)
205                    $minx = $x;
206                if ($x > $maxx || $maxx == 0)
207                    $maxx = $x;
208                if ($z < $minz || $minz == 0)
209                    $minz = $z;
210                if ($z > $maxz || $maxz == 0)
211                    $maxz = $z;
212
213                $sys[$i][0] = $x;
214                $sys[$i][1] = $z;
215                if ($i == $pi || $pi == 0)
216                {
217                    $sys[$i][2][$sc] = $row['sjp_to'];
218                    $sys[$i][3] = $sc++;
219                }
220                else
221                {
222                    $sc = 0;
223                }
224                $sys[$i][4] = $row['sys_id'];
225                $sys[$i][5] = $row['sys_name'];
226                $sys[$i][6] = $row['sys_sec'];
227                $sys[$i][7] = $row['con_id'];
228                $sys[$i][8] = $row['con_name'];
229                $sys[$i][9] = $row['reg_id'];
230                $sys[$i][10] = $row['reg_name'];
231                $pi = $i;
232            }
233            $dx = abs($maxx - $minx);
234            $dz = abs($maxz - $minz);
235            $xscale = 1 / ($dx / ($this->imgwidth_ - ($this->offset_ * 2)));
236            $yscale = 1 / ($dz / ($this->imgheight_ - ($this->offset_ * 2)));
237            if ($_REQUEST['debug'] == 'admovrd')
238            {
239                echo "dx:".$dx." dz:".$dz."<br/> xscale:".$xscale." ".$yscale."<br/>";
240                echo "minx:".$minx." maxx:".$maxx."<br/>";
241                echo "minz:".$minz." maxz:".$maxz."<br/>".$sql."<br/>\n";
242                echo nl2br(print_r($this, 1));
243                echo nl2br(print_r($qry, 1));
244            }
245
246            // draw lines
247            if ($this->showlines_)
248            {
249                $n = $mini;
250                while ($n <= $maxi)
251                {
252                    $px = $this->offset_ + ($sys[$n][0] - $minx) * $xscale;
253                    $py = $this->offset_ + ($sys[$n][1] - $minz) * $yscale;
254
255                    $line_col = imagecolorallocate($img, $this->linecolor_[0], $this->linecolor_[1], $this->linecolor_[2]);
256
257                    for ($m = 0; $m <= $sys[$n][3]; $m++)
258                    {
259                        $sys_to = $sys[$n][2][$m];
260
261                        if ($sys[$sys_to][4] != "")
262                        {
263                            $px_to = $this->offset_ + ($sys[$sys_to][0] - $minx) * $xscale;
264                            $py_to = $this->offset_ + ($sys[$sys_to][1] - $minz) * $yscale;
265
266                            imageline($img, $px, $py, $px_to, $py_to, $line_col);
267                        }
268                    }
269
270                    $n++;
271                }
272            }
273            // draw systems
274            $n = $mini;
275            while ($n <= $maxi)
276            {
277                $px = round($this->offset_ + ($sys[$n][0] - $minx) * $xscale);
278                $py = round($this->offset_ + ($sys[$n][1] - $minz) * $yscale);
279
280                if ($this->mode_ == "map")
281                {
282                    if ($sys[$n][9] == $this->regionid_)
283                        $color = imagecolorallocate($img, $this->hlcolor_[0], $this->hlcolor_[1], $this->hlcolor_[2]);
284                    else
285                        $color = $this->secColor($img, $sys[$n][6]);
286                }
287                if ($this->mode_ == "region")
288                {
289                    if ($sys[$n][7] == $this->conid_)
290                        $color = imagecolorallocate($img, $this->hlcolor_[0], $this->hlcolor_[1], $this->hlcolor_[2]);
291                    else
292                        $color = $this->secColor($img, $sys[$n][6]);
293                }
294                if ($this->mode_ == "cons")
295                {
296                    if ($sys[$n][4] == $this->systemid_)
297                        $color = imagecolorallocate($img, $this->hlcolor_[0], $this->hlcolor_[1], $this->hlcolor_[2]);
298                    else
299                        $color = $this->secColor($img, $sys[$n][6]);
300                }
301
302                if ($this->showsysnames_)
303                {
304                    $tlen = 5 * strlen($sys[$n][5]);
305                    if (($px + $tlen > ($this->imgwidth_ - 20)))
306                        $sx = $px - $tlen;
307                    else
308                        $sx = $px + 5;
309                    if (($py + 5 > ($this->imgheight_ - 20)))
310                        $sy = $py - 5;
311                    else
312                        $sy = $py + 5;
313
314                    imagestring($img, 1, $sx, $sy, $sys[$n][5], $color);
315                    // imagettftext ( $img, 6, 0,
316                    // $sx,
317                    // $sy,
318                    // $color,
319                    // "../fonts/04B_03__.TTF",
320                    // $sys[$n][5] );
321                }
322
323                $ed = $xscale * 0.75;
324                if ($ed > 5)
325                {
326                    $ed = 5;
327                }
328                // bug compat: imagefilledellipse doesnt draw ellipses with 1px size
329                // on some installations
330                if ($ed < 1)
331                {
332                    imagesetpixel($img, $px, $py, $color);
333                }
334                elseif ($ed < 3)
335                {
336                    imagesetpixel($img, $px, $py, $color);
337                    imagesetpixel($img, $px+1, $py, $color);
338                    imagesetpixel($img, $px-1, $py, $color);
339                    imagesetpixel($img, $px, $py-1, $color);
340                    imagesetpixel($img, $px, $py+1, $color);
341                }
342                else
343                {
344                    imagefilledellipse($img, $px, $py, $ed, $ed, $color);
345                }
346
347                $n++;
348            }
349        }
350
351        $captioncolor = imagecolorallocate($img, $this->captioncolor_[0], $this->captioncolor_[1], $this->captioncolor_[2]);
352        if (strlen($this->title_) > 0)
353        {
354            $title = $this->title_ . " " . $caption;
355        }
356        else
357        {
358            $title = $caption;
359        }
360
361        imagestring($img, 1, 2, 2, $title, $captioncolor);
362        // imagettftext ( $img, 6, 0,
363        // 5,
364        // 10,
365        // $captioncolor,
366        // "../fonts/04B_03__.TTF",
367        // $title );
368        if ($this->mode_ == "map" && !$cached)
369        {
370            imagepng($img, $regioncache);
371        }
372        header("Content-type: image/png");
373        imagepng($img);
374    }
375}
376?>
Note: See TracBrowser for help on using the browser.