root/dev/common/kill_related.php @ 186

Revision 186, 10.6 KB (checked in by exi, 14 years ago)

Last minute changes to kill_related.php, targets should now be added after destruction if they kill something with their new ship.

Line 
1<?php
2require_once("class.page.php");
3require_once("class.corp.php");
4require_once("class.alliance.php");
5require_once("class.killlist.php");
6require_once("class.killlisttable.php");
7require_once("class.killsummarytable.php");
8require_once("class.box.php");
9
10if (!$kll_id = intval($_GET['kll_id']))
11{
12    echo 'No valid kill id specified';
13    exit;
14}
15
16$page = new Page("Related kills & losses");
17
18// this is a fast query to get the system and timestamp
19$rqry = new DBQuery();
20$rsql = 'SELECT kll_timestamp, kll_system_id from kb3_kills where kll_id = '.$kll_id;
21$rqry->execute($rsql);
22$rrow = $rqry->getRow();
23$system = new SolarSystem($rrow['kll_system_id']);
24
25// now we get all kills in that system for +-12 hours
26$query = 'SELECT kll.kll_timestamp AS ts FROM kb3_kills kll WHERE kll.kll_system_id='.$rrow['kll_system_id'].'
27            AND kll.kll_timestamp <= date_add( \''.$rrow['kll_timestamp'].'\', INTERVAL \'12\' HOUR )
28            AND kll.kll_timestamp >= date_sub( \''.$rrow['kll_timestamp'].'\', INTERVAL \'12\' HOUR )
29            ORDER BY kll.kll_timestamp ASC';
30$qry = new DBQuery();
31$qry->execute($query);
32$ts = array();
33while ($row = $qry->getRow())
34{
35    $time = strtotime($row['ts']);
36    $ts[intval(date('H', $time))][] = $row['ts'];
37}
38
39// this tricky thing looks for gaps of more than 1 hour and creates an intersection
40$baseh = date('H', strtotime($rrow['kll_timestamp']));
41$maxc = count($ts);
42$times = array();
43for ($i = 0; $i < $maxc; $i++)
44{
45    $h = ($baseh+$i) % 24;
46    if (!isset($ts[$h]))
47    {
48        break;
49    }
50    foreach ($ts[$h] as $timestamp)
51    {
52        $times[] = $timestamp;
53    }
54}
55for ($i = 0; $i < $maxc; $i++)
56{
57    $h = ($baseh-$i) % 24;
58    if ($h < 0)
59    {
60        $h += 24;
61    }
62    if (!isset($ts[$h]))
63    {
64        break;
65    }
66    foreach ($ts[$h] as $timestamp)
67    {
68        $times[] = $timestamp;
69    }
70}
71unset($ts);
72asort($times);
73
74// we got 2 resulting timestamps
75$firstts = array_shift($times);
76$lastts = array_pop($times);
77
78$kslist = new KillList();
79$kslist->setOrdered(true);
80$kslist->addSystem($system);
81$kslist->setStartDate($firstts);
82$kslist->setEndDate($lastts);
83if (CORP_ID)
84    $kslist->addInvolvedCorp(new Corporation(CORP_ID));
85if (ALLIANCE_ID)
86    $kslist->addInvolvedAlliance(new Alliance(ALLIANCE_ID));
87
88$lslist = new KillList();
89$lslist->setOrdered(true);
90$lslist->addSystem($system);
91$lslist->setStartDate($firstts);
92$lslist->setEndDate($lastts);
93if (CORP_ID)
94    $lslist->addVictimCorp(new Corporation(CORP_ID));
95if (ALLIANCE_ID)
96    $lslist->addVictimAlliance(new Alliance(ALLIANCE_ID));
97
98$summarytable = new KillSummaryTable($kslist, $lslist);
99$summarytable->setBreak(6);
100$html .= $summarytable->generate();
101
102$klist = new KillList();
103$klist->setOrdered(true);
104$klist->addSystem($system);
105$klist->setStartDate($firstts);
106$klist->setEndDate($lastts);
107if (CORP_ID)
108    $klist->addInvolvedCorp(new Corporation(CORP_ID));
109if (ALLIANCE_ID)
110    $klist->addInvolvedAlliance(new Alliance(ALLIANCE_ID));
111
112$llist = new KillList();
113$llist->setOrdered(true);
114$llist->addSystem($system);
115$llist->setStartDate($firstts);
116$llist->setEndDate($lastts);
117if (CORP_ID)
118    $llist->addVictimCorp(new Corporation(CORP_ID));
119if (ALLIANCE_ID)
120    $llist->addVictimAlliance(new Alliance(ALLIANCE_ID));
121
122if ($_GET['scl_id'])
123{
124    $klist->addVictimShipClass(new ShipClass($_GET['scl_id']));
125    $llist->addVictimShipClass(new ShipClass($_GET['scl_id']));
126}
127
128function handle_involved($kill, $side)
129{
130    global $pilots;
131    $qry = new DBQuery();
132    $sql = "select ind_plt_id, ind_crp_id, ind_all_id, ind_sec_status,
133            ind_shp_id, ind_wep_id
134            from kb3_inv_detail
135            where ind_kll_id = ".$kill->getID()."
136            order by ind_order";
137
138    $qry->execute($sql);
139    while ($row = $qry->getRow())
140    {
141        $ship = new Ship($row['ind_shp_id']);
142        $shipc = $ship->getClass();
143
144        // dont set pods as ships for pilots we already have
145        if (isset($pilots[$side][$row['ind_plt_id']]))
146        {
147            if ($shipc->getID() == 18 || $shipc->getID() == 2)
148            {
149                continue;
150            }
151        }
152        $weapon = new Item($row['ind_wep_id']);
153        $pilot = new Pilot($row['ind_plt_id']);
154        $corp = new Corporation($row['ind_crp_id']);
155        $alliance = new Alliance($row['ind_all_id']);
156
157        // search for ships with the same id
158        if (isset($pilots[$side][$row['ind_plt_id']]))
159        {
160            foreach ($pilots[$side][$row['ind_plt_id']] as $id => $_ship)
161            {
162                if ($ship->getID() == $_ship['sid'])
163                {
164                    // we already got that pilot in this ship, continue
165                    continue 2;
166                }
167            }
168        }
169        $pilots[$side][$row['ind_plt_id']][] = array('name' => $pilot->getName(), 'sid' => $ship->getID(),
170               'spic' => $ship->getImage(32), 'aid' => $row['ind_all_id'], 'ts' => strtotime($kill->getTimeStamp()),
171               'corp' => $corp->getName(), 'alliance' => $alliance->getName(), 'scl' => $shipc->getPoints(),
172               'ship' => $ship->getName(), 'weapon' => $weapon->getName(), 'cid' => $row['ind_crp_id']);
173    }
174}
175
176function handle_destroyed($kill, $side)
177{
178    global $destroyed, $pilots;
179
180    $destroyed[$kill->getID()] = $kill->getVictimID();
181
182    $ship = new Ship();
183    $ship->lookup($kill->getVictimShipName());
184    $shipc = $ship->getClass();
185
186    $ts = strtotime($kill->getTimeStamp());
187
188    // mark the pilot as podded
189    if ($shipc->getID() == 18 || $shipc->getID() == 2)
190    {
191        // increase the timestamp of a podkill by 1 so its for sure after the shipkill
192        $ts++;
193        global $pods;
194        $pods[$kill->getID()] = $kill->getVictimID();
195
196        // return when we've added him already
197        if (isset($pilots[$side][$kill->getVictimId()]))
198        {
199            #return;
200        }
201    }
202
203    // search for ships with the same id
204    if (isset($pilots[$side][$kill->getVictimId()]))
205    {
206        foreach ($pilots[$side][$kill->getVictimId()] as $id => $_ship)
207        {
208            if ($ship->getID() == $_ship['sid'])
209            {
210                $pilots[$side][$kill->getVictimId()][$id]['destroyed'] = true;
211                return;
212            }
213        }
214    }
215
216    $pilots[$side][$kill->getVictimId()][] = array('name' => $kill->getVictimName(), 'kll_id' => $kill->getID(),
217           'spic' => $ship->getImage(32), 'scl' => $shipc->getPoints(), 'destroyed' => true,
218           'corp' => $kill->getVictimCorpName(), 'alliance' => $kill->getVictimAllianceName(), 'aid' => $kill->getVictimAllianceID(),
219           'ship' => $kill->getVictimShipname(), 'sid' => $ship->getID(), 'cid' => $kill->getVictimCorpID(), 'ts' => $ts);
220}
221
222$destroyed = $pods = array();
223$pilots = array('a' => array(), 'e' => array());
224$kslist->rewind();
225while ($kill = $kslist->getKill())
226{
227    handle_involved($kill, 'a');
228    handle_destroyed($kill, 'e');
229}
230$lslist->rewind();
231while ($kill = $lslist->getKill())
232{
233    handle_involved($kill, 'e');
234    handle_destroyed($kill, 'a');
235}
236function cmp_func($a, $b)
237{
238    // select the biggest fish of that pilot
239    $t_scl = 0;
240    foreach ($a as $i => $ai)
241    {
242        if ($ai['scl'] > $t_scl)
243        {
244            $t_scl = $ai['scl'];
245            $cur_i = $i;
246        }
247    }
248    $a = $a[$cur_i];
249
250    $t_scl = 0;
251    foreach ($b as $i => $bi)
252    {
253        if ($bi['scl'] > $t_scl)
254        {
255            $t_scl = $bi['scl'];
256            $cur_i = $i;
257        }
258    }
259    $b = $b[$cur_i];
260
261    if ($a['scl'] > $b['scl'])
262    {
263        return -1;
264    }
265    // sort after points, shipname, pilotname
266    elseif ($a['scl'] == $b['scl'])
267    {
268        if ($a['ship'] == $b['ship'])
269        {
270            if ($a['name'] > $b['name'])
271            {
272                return 1;
273            }
274            return -1;
275        }
276        elseif ($a['ship'] > $b['ship'])
277        {
278            return 1;
279        }
280        return -1;
281    }
282    return 1;
283}
284
285function is_destroyed($pilot)
286{
287    global $destroyed;
288
289    if ($result = array_search((string)$pilot, $destroyed))
290    {
291        global $smarty;
292
293        $smarty->assign('kll_id', $result);
294        return true;
295    }
296    return false;
297}
298
299function podded($pilot)
300{
301    global $pods;
302
303    if ($result = array_search((string)$pilot, $pods))
304    {
305        global $smarty;
306
307        $smarty->assign('pod_kll_id', $result);
308        return true;
309    }
310    return false;
311}
312
313function cmp_ts_func($a, $b)
314{
315    if ($a['ts'] < $b['ts'])
316    {
317        return -1;
318    }
319    return 1;
320}
321
322// sort pilot ships, order pods after ships
323foreach ($pilots as $side => $pilot)
324{
325    foreach ($pilot as $id => $kll)
326    {
327        uasort($pilots[$side][$id], 'cmp_ts_func');
328    }
329}
330
331// sort arrays, ships with high points first
332uasort($pilots['a'], 'cmp_func');
333uasort($pilots['e'], 'cmp_func');
334
335// now get the pods out and mark the ships the've flown as podded
336foreach ($pilots as $side => $pilot)
337{
338    foreach ($pilot as $id => $kll)
339    {
340        $max = count($kll);
341        for ($i = 0; $i < $max; $i++)
342        {
343            if ($kll[$i]['ship'] == 'Capsule')
344            {
345                if (isset($kll[$i-1]['sid']))
346                {
347                    $pilots[$side][$id][$i-1]['podded'] = true;
348                    $pilots[$side][$id][$i-1]['podid'] = $kll[$i]['kll_id'];
349                    unset($pilots[$side][$id][$i]);
350                }
351            }
352        }
353    }
354}
355
356$smarty->assign_by_ref('pilots_a', $pilots['a']);
357$smarty->assign_by_ref('pilots_e', $pilots['e']);
358
359$pod = new Ship(6);
360$smarty->assign('podpic', $pod->getImage(32));
361$smarty->assign('friendlycnt', count($pilots['a']));
362$smarty->assign('hostilecnt', count($pilots['e']));
363$smarty->assign('system', $system->getName());
364$smarty->assign('firstts', $firstts);
365$smarty->assign('lastts', $lastts);
366
367$html .= $smarty->fetch(get_tpl('battle_overview'));
368
369$html .= "<div class=kb-kills-header>Related kills</div>";
370
371$ktable = new KillListTable($klist);
372$html .= $ktable->generate();
373
374$html .= "<div class=kb-losses-header>Related losses</div>";
375
376$ltable = new KillListTable($llist);
377$html .= $ltable->generate();
378
379$menubox = new Box("Menu");
380$menubox->setIcon("menu-item.gif");
381$menubox->addOption("caption", "View");
382$menubox->addOption("link", "Kills & losses", "?a=kill_related&kll_id=".$_GET['kll_id']);
383$page->addContext($menubox->generate());
384
385$page->setContent($html);
386$page->generate();
387?>
Note: See TracBrowser for help on using the browser.