root/sovereignty/gen_map.php5 @ 461

Revision 249, 32.3 KB (checked in by exi, 13 years ago)

Patched the area linker to use proper start/end counts and therefore fix that issue in the Goonswarm area.
Sovereignty changes in station systems now have a border around the entry in the legend.

Line 
1<?php
2/*
3*
4* Rendering-Options:
5nn = no npc influence (disables dn)
6na = no influence computation (fast, includes nn+oa, disables ds)
7
8dn = display npc influence
9ds = display alliance bounding box
10dj = display jove regions
11
12or = omit region names
13oa = omit alliance names
14oj = omit jumplines
15oe = omit empire
16*/
17include('evedb.php');
18
19set_time_limit(390);
20error_reporting(E_ALL ^ E_NOTICE);
21
22$date1 = '2007-06-28';
23$date2 = '2007-08-15';
24
25define('JOB_UPDATE', true);
26$copt = false;
27$edb->query('select * from maprendertarget where status=1');
28if ($edb->num_rows() != 0)
29{
30    // job running!
31    return;
32}
33$edb->query('select id, date1, date2, options from maprendertarget where status=0 order by prio desc, added desc');
34if ($edb->num_rows() == 0)
35{
36    //echo 'No Job to do';
37    return;
38}
39$row = $edb->fetch_array();
40if (JOB_UPDATE)
41{
42    $edb->query('update maprendertarget set status=1 where id='.$row['id']);
43}
44$job_id = $row['id'];
45if ($row['options'])
46{
47    $copt = array();
48    $tmp = explode(',', $row['options']);
49    foreach ($tmp as $option)
50    {
51       $copt[$option] = $option;
52    }
53    ksort($copt);
54}
55
56$date1 = $row['date1'];
57$date2 = $row['date2'];
58
59$opt['width'] = 1800;
60$opt['height'] = 2048;
61$opt['x'] = 165; // shift all systems to the right
62$opt['y'] = -5; // downshift
63
64$opt['font'] = 'arial.ttf'; // the used font
65$opt['ally_font'] = 'arial.ttf'; // the used font for alliances
66$opt['sov_font'] = 'refsan.ttf'; // the used font for sov changes
67
68$opt['maxrange'] = 450; // max influence range in px
69$opt['influence'] = 10; // influence per system
70$opt['inf_mod_station'] = 6; // multiplicate influence for stations
71$opt['inf_mod_constcap'] = 2; // multiplier for constellation capital
72$opt['inf_mod_constsov'] = 1.2; // 20% more influence for sov3
73$opt['inf_decay'] = 0.35; // multi for decaying influence over jumps
74$opt['sensitivity'] = 500;
75$opt['validInf'] = 0.03; //  0.023 pixel needs at least that much influence to be drawn
76
77$opt['jumplineAlpha'] = 98; // adjusts the alpha of all jumplines
78$opt['regionAlpha'] = 0x30;
79$opt['regionSize'] = 10; // textsize of the region names
80$opt['sovSize'] = 8; // textsize of the sovchanges
81$opt['exludeConstID'] = "'A821-A','UUA-F4','J7HZ-F'"; // do not draw jove regions, empty string to display again
82
83if (isset($copt['dj']))
84{
85    $opt['exludeConstID'] = "";
86}
87if (isset($copt['ne']))
88{
89    $opt['exludeConstID'] .= "'Derelik','The Forge','Great Wildlands','Curse','Venal','Lonetrek','Tash-Murkon',"
90                             ."'Stain','Molden Heath','Heimatar','Sinq Laison','The Citadel','Devoid','Everyshore',"
91                             ."'The Bleak Lands','Syndicate','Metropolis','Domain','Solitude','Placid','Khanid',"
92                             ."'Kador','Aridia','Outer Ring','Essence','Kor-Azor','Genesis','Verge Vendor'";
93}
94if ($opt['exludeConstID'] == "")
95{
96    $opt['exludeConstID'] = '';
97}
98
99// internals
100$image = imagecreatetruecolor($opt['width'], $opt['height']);
101$col = imagecolorallocate($image, 0, 0, 255);
102$pScale = 4.8445284569785E17/(($opt['height']-20)/2.15);
103$alliances = array();
104$systems = $systems_id = array();
105$jumps = array();
106define('STATION', 'outpost'); // change when fixed in db
107
108function watch ($text, $time = 0)
109{
110    if ($time)
111    {
112        $starttime = $time;
113    }
114    else
115    {
116        global $starttime;
117    }
118    list($msec, $sec) = explode(" ", $starttime);
119    $starttime = microtime();
120    list($msec2, $sec2) = explode(" ", $starttime);
121    $time = round(($msec2 + $sec2 - $sec - $msec)*1000, 2);
122    //echo "TIME: needed $time ms for '$text'\n";
123    //flush();
124}
125
126// save startup time
127$starttime = microtime();
128$mtime = explode(" ",microtime());
129$starttimeb = $mtime[1] + $mtime[0];
130watch('startup');
131
132function getColor()
133{
134    global $alliances;
135
136    $done = false;
137    $t = explode(' ', microtime());
138
139    srand($t[0]*100000000);
140    while (!$done)
141    {
142        $r = rand(0, 255);
143        $g = rand(0, 255);
144        $b = rand(0, 255);
145        if ($r+$g+$b > 256 && $r+$g+$b < 512)
146        {
147            $done = true;
148        }
149    }
150
151    return array('r' => $r, 'g' => $g, 'b' => $b);
152}
153
154// load alliances
155$t1 = $edb->query('SELECT distinct alliances.allianceID, name, allianceColor
156             FROM alliances
157             inner join mapsovereignty on alliances.allianceID = mapsovereignty.allianceID
158             left join mapalliancecolors on alliances.allianceID = mapalliancecolors.allianceID
159             where mapsovereignty.date >= '."'$date1' and mapsovereignty.date <= '$date2'");
160$i = -1;
161$allianceIDtoA = array();
162while ($row = $edb->fetch_array($t1))
163{
164    $r = (int)base_convert(substr($row['allianceColor'], 0, 2), 16, 10);
165    $g = (int)base_convert(substr($row['allianceColor'], 2, 2), 16, 10);
166    $b = (int)base_convert(substr($row['allianceColor'], 4, 2), 16, 10);
167    if ($row['allianceColor'])
168    {
169        $color = array('r' => $r, 'g' => $g, 'b' => $b);
170    }
171    else
172    {
173        $color = getColor();
174        $col = base_convert($color['r'], 10, 16).base_convert($color['g'], 10, 16).base_convert($color['b'], 10, 16);
175        $edb->query('INSERT INTO mapalliancecolors (allianceID, allianceColor) VALUE ('.$row['allianceID'].',\''.$col.'\')');
176    }
177    $alliances[++$i] = array('name' => $row['name'], 'color' => $color, 'segments' => array());
178    $allianceIDtoA[$row['allianceID']] = $i;
179}
180
181// load solar systems
182$query = 'SELECT a.x, a.z, a.solarSystemID, d.allianceID, a.constellationID, a.regionID, b.solarSystemID as outpost, regionName, d.factionID, d.sovereigntyLevel
183             FROM mapsolarsystems a
184             inner join mapsovereignty d on a.solarSystemID = d.solarSystemID and `date` = \''.$date2.'\'
185             left join mapregions c on a.regionID = c.regionID
186             left join mapoutposts b on a.solarSystemID = b.solarSystemID and b.added < \''.$date1.'\'
187             where regionName not in ('.$opt['exludeConstID'].')';
188$edb->query($query);
189while ($row = $edb->fetch_array())
190{
191    $x = intval($row['x']/$pScale + $opt['width']/2 + $opt['x']);
192    $y = intval($row['z']/$pScale + $opt['height']/2 + $opt['y']);
193    unset($row['z']);
194    $row['y'] = $y;
195    $row['x'] = $x;
196
197    if ($row['factionID'])
198    {
199        $row['allianceID'] = 0;
200    }
201
202    $row['influence'] = array();
203    $systems[$y][$x] = $row;
204    $systems_id[$row['solarSystemID']] = &$systems[$y][$x];//$row;//
205}
206
207// load jumps
208$edb->query('SELECT fromSolarSystemID, toSolarSystemID FROM mapsolarsystemjumps');
209while ($row = $edb->fetch_array())
210{
211    if ($systems_id[$row['fromSolarSystemID']] && $systems_id[$row['toSolarSystemID']])
212    {
213        $jumps[$row['fromSolarSystemID']][] = $row['toSolarSystemID'];
214    }
215}
216
217// calculate influence
218// this function iterates recursively through the jumpgates
219function addInfluence($id, $value, $alliance, $level, $done)
220{
221    if ($level >= 4)
222    {
223        return;
224    }
225    global $systems_id, $jumps, $opt;
226
227    $systems_id[$id]['influence'][$alliance] += $value;
228
229    if (is_array($jumps[$id]) && $level <= 3)
230    {
231        foreach ($jumps[$id] as $to)
232        {
233            if (in_array($to, $done))
234            {
235                continue;
236            }
237            $done[] = $to;
238            if ($systems_id[$to]['factionID'] == 0)
239            {
240                addInfluence($to, $value*$opt['inf_decay'], $alliance, $level+1, $done);
241            }
242        }
243    }
244}
245
246foreach ($systems_id as $id => $system)
247{
248    $influence = $opt['influence'];
249    $level = 2;
250
251    if ($system[STATION])
252    {
253        $influence *= $opt['inf_mod_station'];
254        $level = 1;
255    }
256    if ($system['sovereigntyLevel'] == 4)
257    {
258        $influence *= $opt['inf_mod_constcap'];
259        $level = 0;
260    }
261    elseif ($system['sovereigntyLevel'] == 3)
262    {
263        $influence *= $opt['inf_mod_constsov'];
264    }
265
266    if ($system['allianceID'] != 0)
267    {
268        addInfluence($id, $influence, $allianceIDtoA[$system['allianceID']], $level, array());
269    }
270}
271
272// load npc data
273if (!isset($copt['nn']))
274{
275    $edb->query('SELECT solarSystemID, influence FROM mapinfluenceinject');
276    if (isset($copt['dn']))
277    {
278        $alliances[] = array('name' => 'NPC', 'segments' => array(), 'color' => array('r' => 50, 'g' => 255, 'b' => 50));
279    }
280    else
281    {
282        $alliances[] = array('npc' => true);
283    }
284
285    $ak = array_keys($alliances);
286    $npc_id = array_pop($ak);
287    while ($row = $edb->fetch_array())
288    {
289        if (!isset($systems_id[$row['solarSystemID']]))
290        {
291            continue;
292        }
293
294        $s = &$systems_id[$row['solarSystemID']];
295
296        //imagefilledellipse($image, $s['x'], $s['y'], 5, 5, $color);
297        addInfluence($row['solarSystemID'], $row['influence'], $npc_id, 3, array());
298    }
299}
300watch('loading');
301
302// opne the textfile to the c program and dump our config
303$fp = fopen('evemap_systems.data', 'w');
304fwrite($fp, 'c '.$opt['height'].' '.$opt['width'].' '.$opt['maxrange'].' '.$opt['sensitivity'].' '.$opt['validInf'].' '.(count($alliances)+1)."\r\n");
305
306if ($npc_id)
307{
308    $blindinfluence = array(1883 => 565,
309                            1778 => 621,
310                            1830 => 588,
311                            1922 => 552,
312                            1458 => 622,
313                            1699 => 622,
314                            1250 => 285,
315                            1954 => 510);
316    foreach ($blindinfluence as $y => $x)
317    {
318        $systems[$y] = array($x => array('influence' => array($npc_id => 50)));
319    }
320}
321
322// dump all systems with influence to the textfile
323// important: sort by y+x so the C loops can exit early
324foreach ($systems as $y => $arr)
325{
326    ksort($systems[$y]);
327}
328ksort($systems);
329
330$systems_sov = array();
331foreach ($systems as $y => $arr)
332{
333    foreach ($arr as $x => $system)
334    {
335        if (count($system['influence']))
336        {
337            $systems_sov[$y][$x] = &$systems[$y][$x];
338
339            fwrite($fp, 's '.$x.' '.$y."\r\n");
340            foreach ($system['influence'] as $all => $val)
341            {
342                fwrite($fp, 'i '.$all.' '.$val." \r\n");
343            }
344        }
345    }
346}
347fclose($fp);
348
349// remove the blind influence again
350if ($npc_id)
351{
352    foreach ($blindinfluence as $y => $x)
353    {
354        unset($systems[$y][$x]);
355        unset($systems_sov[$y][$x]);
356        if (count($systems[$y]) == 0)
357        {
358            unset($systems[$y]);
359            unset($systems_sov[$y]);
360        }
361    }
362}
363
364function paintRow($y)
365{
366    global $image, $alliances, $curBorder, $curRow, $prevRow, $opt, $nameStack, $segID, $segGID;
367
368    $curA = -1;
369    $segments = array();
370    foreach ($prevRow as $x => $last)
371    {
372        if ($y > 0)
373        {
374            if (!isset($prevRow[$x+1][0]) || !isset($prevRow[$x-1][0]))
375            {
376                $curA = -2;
377            }
378            if ($curA != $last[0])
379            {
380                if ($curA != -1)
381                {
382                    $curSegment['end'] = $lastx;
383                    $segments[] = $curSegment;
384                }
385                $curSegment['id'] = ++$segID;
386                $curSegment['start'] = $x;
387                $curSegment['x'] = 0;
388                $curSegment['y'] = 0;
389                $curSegment['count'] = 0;
390                $curSegment['alliance'] = $last[0];
391                $curSegment['lasty'] = $y;
392                $curSegment['Tcount'] = 0;
393                $curA = $last[0];
394            }
395
396            // use the influence to drag the nametag to the main source of power
397            $curSegment['x'] += $x*$last[1];
398            $curSegment['y'] += $y*$last[1];
399            $curSegment['count'] += $last[1];
400            $curSegment['Tcount']++;
401
402            if (!isset($alliances[$last[0]]['npc']))
403            {
404                $border = ($x == 0 || $x == $opt['width']-1 || $last[0] != $curRow[$x][0] || $curBorder[$x] || $last[0] != $prevRow[$x-1][0] || $last[0] != $prevRow[$x+1][0]);
405
406                $alpha = min(190, intval(log(log($prevRow[$x][1]+1)+1)*700));
407
408                if ($border)
409                {
410                    $alpha = min(max(100, intval(log(log($prevRow[$x][1]+1)+1)*700)), 255);
411                }
412                $a = &$alliances[$last[0]]['color'];
413                $alpha = intval(abs($alpha-255)/2);
414                $color = imagecolorallocatealpha($image, $a['r'], $a['g'], $a['b'], $alpha);
415
416                imagesetpixel($image, $x, $y, $color);
417            }
418        }
419        $lastx = $x;
420        $curBorder[$x] = ($y == 0 || $prevRow[$x][0] != $curRow[$x][0]);
421    }
422    $curSegment['end'] = $x;
423    $segments[] = $curSegment;
424
425    foreach ($segments as $curSegment)
426    {
427        $alliance = $curSegment['alliance'];
428        if (isset($alliances[$alliance]['npc']) || $curSegment['alliance'] == null)
429        {
430            continue;
431        }
432
433        $validSegs = array();
434        foreach ($alliances[$alliance]['segments'] as $id => $segment)
435        {
436            // make sure we dont connect bubbles on the same x when they're spread apart
437            if ($curSegment['lasty'] - $segment['lasty'] > 2)
438            {
439                continue;
440            }
441
442            if (($segment['lstart']-10 < $curSegment['start']) && ($segment['lend']+10 > $curSegment['end']))
443            {
444                // the current segment fits into this from the alliance
445                $validSegs[] = $id;
446            }
447            elseif (($segment['lstart']+10 > $curSegment['start']) && ($segment['lend']-10 < $curSegment['end']))
448            {
449                // the alliance segment fits into the current one
450                $validSegs[] = $id;
451            }
452        }
453
454        if (count($validSegs) > 1)
455        {
456            // get the biggest chunk and set the id to that parent
457            $max = 0;
458            foreach ($validSegs as $id)
459            {
460                if ($alliances[$alliance]['segments'][$id]['count'] > $max)
461                {
462                    $max = $alliances[$alliance]['segments'][$id]['count'];
463                    $maxid = $id;
464                }
465            }
466
467            foreach ($validSegs as $id)
468            {
469                // set all ids to the same value so they are merged
470                $alliances[$alliance]['segments'][$id]['id'] = $maxid;
471             }
472             $curSegment['id'] = $maxid;
473             $alliances[$alliance]['segments'][] = $curSegment;
474        }
475        // we got one matching segment
476        elseif (count($validSegs) == 1)
477        {
478            $curSegment['id'] = $validSegs[0];
479            $alliances[$alliance]['segments'][] = $curSegment;
480        }
481        // new segment
482        else
483        {
484            $curSegment['id'] = ++$segGID;
485            $alliances[$alliance]['segments'][] = $curSegment;
486        }
487
488        // set start x for this line/segment
489        if (!isset($alliances[$alliance]['lasty'][$y][$curSegment['id']]))
490        {
491            $alliances[$alliance]['lasty'][$y][$curSegment['id']] = $curSegment['start'];
492        }
493        $alliances[$alliance]['lasty'][$y][$curSegment['id']] = min($alliances[$alliance]['lasty'][$y][$curSegment['id']], $curSegment['start']);
494        if (!isset($alliances[$alliance]['lastyend'][$y][$curSegment['id']]))
495        {
496            $alliances[$alliance]['lastyend'][$y][$curSegment['id']] = $curSegment['end'];
497        }
498        $alliances[$alliance]['lastyend'][$y][$curSegment['id']] = max($alliances[$alliance]['lastyend'][$y][$curSegment['id']], $curSegment['end']);
499    }
500
501    // compact all segments with the same id
502    foreach ($segments as $curSegment)
503    {
504        $alliance = $curSegment['alliance'];
505        if ($alliance == null)
506        {
507            continue;
508        }
509        if (isset($alliances[$alliance]['npc']))
510        {
511            continue;
512        }
513
514        $array = array();
515        foreach ($alliances[$alliance]['segments'] as $segment)
516        {
517            $array[$segment['id']]['id'] = $segment['id'];
518            $array[$segment['id']]['x'] += $segment['x'];
519            $array[$segment['id']]['y'] += $segment['y'];
520            $array[$segment['id']]['count'] += $segment['count'];
521            $array[$segment['id']]['Tcount'] += $segment['Tcount'];
522            $array[$segment['id']]['lend'] = $alliances[$alliance]['lastyend'][$y][$segment['id']];
523            $array[$segment['id']]['lstart'] = $alliances[$alliance]['lasty'][$y][$segment['id']];
524
525            if (!isset($segment['firsty']))
526            {
527                $segment['firsty'] = $segment['lasty'];
528            }
529            if (!$segment['lstart'])
530            {
531                $segment['lstart'] = $segment['start'];
532            }
533            if (!$segment['lend'])
534            {
535                $segment['lend'] = $segment['end'];
536            }
537            if (isset($array[$segment['id']]['start']))
538            {
539                $array[$segment['id']]['lasty'] = max($segment['lasty'], $array[$segment['id']]['lasty']);
540                $array[$segment['id']]['start'] = min($segment['start'], $array[$segment['id']]['start']);
541                $array[$segment['id']]['end'] = max($segment['end'], $array[$segment['id']]['end']);
542                $array[$segment['id']]['firsty'] = min($segment['firsty'], $array[$segment['id']]['firsty']);
543                #echo 'segstrt::'.$segment['start'].' def::'.$array[$segment['id']]['lstart']."\n";
544            }
545            else
546            {
547                $array[$segment['id']]['lasty'] = $segment['lasty'];
548                $array[$segment['id']]['firsty'] = $segment['firsty'];
549                $array[$segment['id']]['start'] = $segment['start'];
550                $array[$segment['id']]['end'] = $segment['end'];
551            }
552        }
553        $alliances[$alliance]['segments'] = $array;
554    }
555}
556
557// now the fun part, execute the helper program
558// and read its output, it will dump every pixel in the format
559// 'x,y,alliID,infValue' to stdout
560$curRow = $prevRow = $curBorder = array();
561if (!isset($copt['na']))
562{
563    if (file_exists('evemap'))
564    {
565        $p = popen('./evemap', 'r');
566    }
567    else
568    {
569        $p = popen('evemap.exe', 'r');
570    }
571}
572if (is_resource($p))
573{
574    $lasty = 0;
575    while ($line = fgets($p))
576    {
577        $tmp = explode(',', trim($line));
578
579        // gather full rows
580        if ($lasty != $tmp[1])
581        {
582            $prevRow = $curRow;
583            paintRow($lasty);
584
585            $curRow = array();
586            $lasty = $tmp[1];
587        }
588        $curRow[$tmp[0]] = array($tmp[2], $tmp[3]);
589    }
590
591    // process last row
592    $prevRow = $curRow;
593    paintRow($tmp[1]);
594}
595else
596{
597    //echo 'ERROR: could not start the helper program<br>';
598}
599
600watch('processing sovdata');
601
602// draw all jumps
603$color = array();
604$color['sys'] = imagecolorallocatealpha($image, 0, 0, 255, $opt['jumplineAlpha']);
605$color['con'] = imagecolorallocatealpha($image, 255, 0, 0, $opt['jumplineAlpha']);
606$color['reg'] = imagecolorallocatealpha($image, 255, 0, 255, $opt['jumplineAlpha']);
607foreach ($jumps as $from => $array)
608{
609    if (isset($copt['oj']))
610    {
611        break;
612    }
613    foreach ($array as $to)
614    {
615        if ($systems_id[$from]['constellationID'] == $systems_id[$to]['constellationID'])
616        {
617            $col = 'sys';
618        }
619        elseif ($systems_id[$from]['regionID'] == $systems_id[$to]['regionID'])
620        {
621            $col = 'con';
622        }
623        else
624        {
625            $col = 'reg';
626        }
627
628        imageline($image, $systems_id[$from]['x'], $systems_id[$from]['y'], $systems_id[$to]['x'], $systems_id[$to]['y'], $color[$col]);
629    }
630}
631
632// draw systems
633$white = imagecolorallocatealpha($image, 255, 255, 255, 20);
634$black_trans = imagecolorallocatealpha($image, 0, 0, 0, 35);
635foreach ($systems_id as $id => $system)
636{
637    if ($system['allianceID'])
638    {
639        $a = &$alliances[$allianceIDtoA[$system['allianceID']]]['color'];
640        $color = imagecolorallocate($image, $a['r'], $a['g'], $a['b']);
641    }
642    else
643    {
644        $color = imagecolorallocate($image, 0xB0, 0xB0, 0xFF);
645    }
646
647    if ($system[STATION] && $system['sovereigntyLevel'] == '4')
648    {
649        imagesetstyle($image, array($color, $color, $color, $black_trans, $black_trans));
650        imageellipse($image, $system['x'], $system['y']-1, 40, 40, IMG_COLOR_STYLED);
651    }
652    if ($system[STATION])
653    {
654        imagefilledellipse($image, $system['x']-1, $system['y']-1, 2, 1, $color);
655        imagerectangle($image, $system['x']-2, $system['y']-3, $system['x']+2, $system['y']+1, $color);
656    }
657    elseif ($system['allianceID'])
658    {
659        imagefilledellipse($image, $system['x'], $system['y'], 4, 3, $color);
660        //imagesetpixel($image, $system['x'], $system['y'], $white);
661    }
662    else
663    {
664        imagesetpixel($image, $system['x']-1, $system['y'], $color);
665        imagesetpixel($image, $system['x'], $system['y'], $color);
666    }
667}
668
669include('label.php');
670$label = new labelmanager();
671if (!isset($copt['or']))
672{
673    // draw region names
674    $color = imagecolorallocatealpha($image, 0xff, 0xff, 0xff, $opt['regionAlpha']);
675    $edb->query('SELECT r.x, r.z, r.regionName FROM mapsolarsystems s LEFT JOIN mapregions r ON r.regionID=s.regionID where regionName not in ('.$opt['exludeConstID'].') GROUP BY r.regionID');
676    while ($row = $edb->fetch_array())
677    {
678        $x = $row['x']/$pScale + $opt['width']/2 + $opt['x'];
679        $y = $row['z']/$pScale + $opt['height']/2 + $opt['y'];
680
681        // x,y,text,size,font,color,type
682        $label->add($x, $y, $row['regionName'], $opt['regionSize'], $opt['font'], $color, 'region');
683    }
684}
685
686// helper function, prints the bounding box
687// of each segment belonging to that alliance
688function printSegments($alliance)
689{
690    global $image, $opt;
691    #$red = imagecolorallocate($image, 255, 0, 0);
692    foreach ($alliance['segments'] as $segment)
693    {
694        $a = &$alliance['color'];
695        $color = imagecolorallocate($image, $a['r'], $a['g'], $a['b']);
696        $x = round($segment['x']/$segment['count']);
697        $y = round($segment['y']/$segment['count']);
698        #imagefilledellipse($image, $x, $y, 10, 10, $color);
699        #imagefilledellipse($image, $x, $y, 4, 4, $red);
700        imagerectangle($image, $segment['start'], $segment['firsty'], $segment['end'], $segment['lasty'], $color);
701        imagettftext($image, 10, 0, $segment['start'], $segment['firsty'], $color, $opt['sov_font'], $segment['id']);
702    }
703}
704
705function mapLegendHeader($x, $y)
706{
707    global $image, $opt;
708
709    $white = imagecolorallocate($image, 255, 255, 255);
710    imagettftext($image, $opt['sovSize'], 0, $x+10, $y, $white, $opt['sov_font'], 'Sov. Lost');
711    $bbox = imagettfbbox($opt['sovSize'], 0, $opt['sov_font'], 'Sov. Lost');
712    $sovGstart = ceil($bbox[4]*4.1+$x+5);
713
714    imagettftext($image, $opt['sovSize'], 0, $sovGstart, $y, $white, $opt['sov_font'], 'Sov. Gain');
715    #$bbox = imagettfbbox($opt['sovSize'], 0, $opt['sov_font'], 'Sov. Gain');
716    $sovSstart = ceil($bbox[4]*4+$sovGstart);
717
718    imagettftext($image, $opt['sovSize'], 0, $sovSstart, $y, $white, $opt['sov_font'], 'System');
719    $bbox = imagettfbbox($opt['sovSize'], 0, $opt['sov_font'], 'System');
720    $sovRstart = ceil($bbox[4]*1.05+8+$sovSstart);
721
722    imagettftext($image, $opt['sovSize'], 0, $sovRstart, $y, $white, $opt['sov_font'], 'Region');
723    $bbox = imagettfbbox($opt['sovSize'], 0, $opt['sov_font'], 'Region');
724
725    $opt['legendLayout']['sovGstart'] = $sovGstart;
726    $opt['legendLayout']['sovSstart'] = $sovSstart;
727    $opt['legendLayout']['sovRstart'] = $sovRstart;
728
729    // draw the grid
730    imageline($image, $x, $y+2, $bbox[4]+$sovRstart, $y+2, $white);
731    imageline($image, $x+7, $y-10, $x+7, $y, $white);
732    imageline($image, $sovGstart-3, $y-10, $sovGstart-3, $y, $white);
733    imageline($image, $sovSstart-3, $y-10, $sovSstart-3, $y, $white);
734    imageline($image, $sovRstart-3, $y-10, $sovRstart-3, $y, $white);
735}
736
737function mapLegendEntry($x, $y, $row)
738{
739    global $image, $alliances, $allianceIDtoA, $opt, $systems_id;
740
741    extract($opt['legendLayout']);
742    $white = imagecolorallocate($image, 255, 255, 255);
743
744    if ($row['toAlliance'] == 0)
745    {
746        $toc = imagecolorallocate($image, 80, 80, 80);
747    }
748    else
749    {
750        $a = &$alliances[$allianceIDtoA[$row['toAlliance']]]['color'];
751        $toc = imagecolorallocate($image, $a['r'], $a['g'], $a['b']);
752    }
753
754    // normal system change, print the icon and a circle around the system on the map
755    if ($systems_id[$row['solarSystemID']]['outpost'] == null)
756    {
757        $a = &$alliances[$allianceIDtoA[$row['fromAlliance']]]['color'];
758        $color = imagecolorallocate($image, $a['r'], $a['g'], $a['b']);
759        imageellipse($image, $systems_id[$row['solarSystemID']]['x'], $systems_id[$row['solarSystemID']]['y'], 7, 7, $color);
760
761        imagefilledellipse($image, $x, $y-5, 4, 3, $toc);
762    }
763    else
764    {
765        // this is an outpost change, print the outpost icon
766        imagefilledellipse($image, $x-1, $y-1-5, 2, 1, $toc);
767        imagerectangle($image, $x-2, $y-3-5, $x+2, $y+1-5, $toc);
768
769        $a = &$alliances[$allianceIDtoA[$row['fromAlliance']]]['color'];
770        $color = imagecolorallocate($image, $a['r'], $a['g'], $a['b']);
771        imageellipse($image, $systems_id[$row['solarSystemID']]['x'], $systems_id[$row['solarSystemID']]['y']-1, 9, 9, $color);
772
773        // depending on the change
774        // display the box around it in the appropiate color
775        if ($row['toAlliance'] == 0)
776        {
777            $a = &$alliances[$allianceIDtoA[$row['fromAlliance']]]['color'];
778            $color = imagecolorallocatealpha($image, $a['r'], $a['g'], $a['b'], 20);
779            imagerectangle($image, $x-7, $y-15, $sovRstart+80, $y, $color);
780        }
781        elseif ($row['fromAlliance'] == 0)
782        {
783            $a = &$alliances[$allianceIDtoA[$row['toAlliance']]]['color'];
784            $color = imagecolorallocatealpha($image, $a['r'], $a['g'], $a['b'], 20);
785            imagerectangle($image, $x-7, $y-13, $sovRstart+80, $y+2, $color);
786        }
787        else
788        {
789            $a = &$alliances[$allianceIDtoA[$row['fromAlliance']]]['color'];
790            $color1 = imagecolorallocatealpha($image, $a['r'], $a['g'], $a['b'], 20);
791            $a = &$alliances[$allianceIDtoA[$row['toAlliance']]]['color'];
792            $color2 = imagecolorallocatealpha($image, $a['r'], $a['g'], $a['b'], 20);
793
794            imagesetstyle($image, array($color1, $color1, $color2, $color2, $color2));
795            imagerectangle($image, $x-7, $y-13, $sovRstart+80, $y+2, IMG_COLOR_STYLED);
796        }
797    }
798
799    $a = &$alliances[$allianceIDtoA[$row['fromAlliance']]]['color'];
800    $color = imagecolorallocate($image, $a['r'], $a['g'], $a['b']);
801    imagettftext($image, $opt['sovSize'], 0, $x+10, $y, $color, $opt['sov_font'], $alliances[$allianceIDtoA[$row['fromAlliance']]]['name']);
802
803    $a = &$alliances[$allianceIDtoA[$row['toAlliance']]]['color'];
804    $color = imagecolorallocate($image, $a['r'], $a['g'], $a['b']);
805    imagettftext($image, $opt['sovSize'], 0, $sovGstart, $y, $color, $opt['sov_font'], $alliances[$allianceIDtoA[$row['toAlliance']]]['name']);
806
807    $color = imagecolorallocate($image, 90, 90, 220);
808    imagettftext($image, $opt['sovSize'], 0, $sovSstart, $y, $color, $opt['sov_font'], $row['solarSystemName']);
809    imagettftext($image, $opt['sovSize'], 0, $sovRstart, $y, $white, $opt['sov_font'], $systems_id[$row['solarSystemID']]['regionName']);
810
811    imageline($image, $x+7, $y-15, $x+7, $y, $white);
812    imageline($image, $sovGstart-3, $y-15, $sovGstart-3, $y, $white);
813    imageline($image, $sovSstart-3, $y-15, $sovSstart-3, $y, $white);
814    imageline($image, $sovRstart-3, $y-15, $sovRstart-3, $y, $white);
815}
816
817
818$changeStack = array();
819$query = "SELECT m1.solarSystemID, m1.solarSystemName, m1.allianceID as fromAlliance, m2.allianceID as toAlliance
820            FROM `mapsovereignty` m1
821            left join `mapsovereignty` m2 using (solarSystemID)
822            left join mapsolarsystems using (solarSystemID)
823            WHERE m1.date='$date1' and m2.date='$date2'
824            and (m1.allianceID != m2.allianceID)
825            and m1.factionID = 0 order by regionID asc, m1.allianceID asc";
826$edb->query($query);
827$i = 0;
828while ($row = $edb->fetch_array())
829{
830    if (isset($systems_id[$row['solarSystemID']]))
831    {
832        if ($systems_id[$row['solarSystemID']]['outpost'] != null)
833        {
834            $outposts++;
835        }
836        $changeStack[] = $row;
837    }
838}
839$changes = count($changeStack);
840$filter = false;
841
842if ($changes > 42)
843{
844    $changes = $outposts;
845    $filter = true;
846}
847
848if ($changes <= 10)
849{
850    $num1 = $changes;
851    $num2 = 0;
852}
853elseif ($changes <= 30)
854{
855    $num1 = 0;
856    $num2 = $changes;
857}
858else
859{
860    $num1 = 13;
861    $num2 = 42;
862}
863
864if ($num1)
865{
866    $y = 75;
867    mapLegendHeader(5, $y);
868}
869
870
871$cnt = 0;
872$x = $prevx = 5;
873while ($row = array_shift($changeStack))
874{
875
876    // display only outpost changes when there are more than 50 entries
877    if ($filter)
878    {
879        if ($systems_id[$row['solarSystemID']]['outpost'] == null)
880        {
881            $a = &$alliances[$allianceIDtoA[$row['fromAlliance']]]['color'];
882
883            if ($a == null)
884            {
885                $a = array('r' => 180, 'g' => 180, 'b' => 180);
886            }
887            $color = imagecolorallocate($image, $a['r'], $a['g'], $a['b']);
888            imageellipse($image, $systems_id[$row['solarSystemID']]['x'], $systems_id[$row['solarSystemID']]['y'], 7, 7, $color);
889            $i++;
890            continue;
891        }
892    }
893
894    if ($cnt > $num1 || $num1 == 0)
895    {
896        if ($x == $prevx)
897        {
898            $x = 1280;
899            $y = 15;
900            mapLegendHeader($x, $y);
901        }
902    }
903    if ($cnt > $num2 && $num2 != 0)
904    {
905        // dont draw more
906        $i++;
907        continue;
908    }
909
910    $y += 15;
911    $cnt++;
912    mapLegendEntry($x, $y, $row);
913}
914
915if ($i)
916{
917    // print lala
918    imagettftext($image, $opt['sovSize'], 0, $x+10, $y+15, $white, $opt['sov_font'], "There are $i more Sovereignity changes");
919}
920
921
922// print alliance names
923$black = imagecolorallocate($image, 0, 0, 0);
924foreach ($alliances as $id => $alliance)
925{
926    if (!isset($alliance['segments']))
927    {
928        continue;
929    }
930    if (isset($alliance['npc']))
931    {
932        continue;
933    }
934
935    if (isset($copt['ds']))
936    {
937        printSegments($alliances[$id]);
938    }
939
940    if (isset($copt['oa']))
941    {
942        continue;
943    }
944
945    foreach ($alliance['segments'] as $data)
946    {
947        $x = intval($data['x'] / $data['count']);
948        $y = intval($data['y'] / $data['count']);
949
950        //echo $x.'-'.$y.' '. $alliance['name']."\n";
951        $size = intval(sqrt($data['Tcount'])/30 + 8);
952        $a = &$alliance['color'];
953        $color = imagecolorallocate($image, $a['r'], $a['g'], $a['b']);
954
955        // x,y,text,size,font,color,type
956        $label->add($x, $y, $alliance['name'], $size, $opt['ally_font'], $color, 'alliance');
957    }
958}
959
960// draw all labels
961//var_export($label);
962$label->draw($image);
963
964// created by
965$color = imagecolorallocate($image, 150, 150, 150);
966imagettftext($image, 12, 0, 5, 22, $color, $opt['font'], 'Based on the Sovereignty Map of Paladin Vent');
967imagettftext($image, 12, 0, 5, 40, $color, $opt['font'], 'brought to you by EVE-Dev');
968imagettftext($image, 12, 0, 5, 58, $color, $opt['font'], 'Sovereignty data from '.$date1.' to '.$date2);
969
970$red = imagecolorallocate($image, 255, 0, 0);
971$mtime = explode(" ",microtime());
972$endtimeb = $mtime[1] + $mtime[0];
973$totaltime = round(($endtimeb - $starttimeb), 2);
974imagestring($image, 3, $opt['width'] - 200, $opt['height'] - 30 , "Generated in: {$totaltime}s" , $red);
975
976unset($alliances);
977unset($systems_id);
978unset($systems);
979unset($jumps);
980unset($systems_sov);
981unset($allianceIDtoA);
982
983if (JOB_UPDATE)
984{
985    $edb->query('update maprendertarget set status=2 where id='.$job_id);
986}
987
988// output
989if ($copt)
990{
991    imagepng($image, 'maps/influence_'.$date1.'_'.$date2.'_'.join('', $copt).'.png');
992    imageinterlace($image, 1);
993    imagejpeg($image, 'maps/influence_'.$date1.'_'.$date2.'_'.join('', $copt).'.jpg', 95);
994}
995else
996{
997    imagepng($image, 'maps/influence_'.$date1.'_'.$date2.'.png');
998    imageinterlace($image, 1);
999    imagejpeg($image, 'maps/influence_'.$date1.'_'.$date2.'.jpg', 95);
1000}
1001
1002watch('shutdown');
1003?>
Note: See TracBrowser for help on using the browser.