Example #1
0
 public function checkCombat($time)
 {
     //		if($this->checkingCombat){return;}
     //		else{$this->checkingCombat = 1;}
     global $db, $game, $ui;
     $db->query('start transaction');
     $this->getQueue('combat');
     $ok = 1;
     foreach ($this->queue['combat'] as $combat) {
         $combat['end'] = $combat['start'] + floor($combat['duration'] * 60);
         if ($combat['end'] <= $time) {
             $otherNode = new node();
             if ($combat['sender'] == $this->data['id']) {
                 $nodes = array('attacker' => 'this', 'defender' => 'otherNode');
                 $status = $otherNode->get('id', $combat['recipient']);
             } else {
                 $nodes = array('attacker' => 'otherNode', 'defender' => 'this');
                 $status = $otherNode->get('id', $combat['sender']);
             }
             if (!$combat['stage']) {
                 if ($status == 'done') {
                     $data = array();
                     $data['input']['attacker']['focus'] = $combat['focus'];
                     $data['input']['attacker']['faction'] = ${$nodes}['attacker']->data['faction'];
                     $otherResult = $db->query('select * from combat_units where combat="' . $combat['id'] . '"');
                     while ($group = db::fetch($otherResult)) {
                         $data['input']['attacker']['groups'][] = array('unitId' => $group['id'], 'quantity' => $group['value']);
                     }
                     $data['input']['defender']['focus'] = ${$nodes}['defender']->data['focus'];
                     $data['input']['defender']['faction'] = ${$nodes}['defender']->data['faction'];
                     $otherNode->getUnits();
                     foreach (${$nodes}['defender']->units as $group) {
                         $data['input']['defender']['groups'][] = array('unitId' => $group['id'], 'quantity' => $group['value']);
                     }
                     $data = node::doCombat($data);
                     $captureNode = true;
                     ${$nodes}['defender']->getResources();
                     foreach ($data['output']['defender']['groups'] as $key => $group) {
                         $db->query('update units set value="' . $group['quantity'] . '" where node="' . ${$nodes}['defender']->data['id'] . '" and id="' . $group['unitId'] . '"');
                         if ($db->affected_rows() == -1) {
                             $ok = 0;
                         }
                         $lostCount = $data['input']['defender']['groups'][$key]['quantity'] - $group['quantity'];
                         if ($lostCount > 0) {
                             $upkeepResource = $game['units'][${$nodes}['defender']->data['faction']][$group['unitId']]['upkeepResource'];
                             $upkeep = $game['units'][${$nodes}['defender']->data['faction']][$group['unitId']]['upkeep'];
                             ${$nodes}['defender']->resources[$upkeepResource]['value'] += $upkeep * $lostCount;
                             $db->query('update resources set value="' . ${$nodes}['defender']->resources[$upkeepResource]['value'] . '" where node="' . ${$nodes}['defender']->data['id'] . '" and id="' . $upkeepResource . '"');
                             if ($db->affected_rows() == -1) {
                                 $ok = 0;
                             }
                         }
                         if ($group['quantity']) {
                             $captureNode = false;
                         }
                     }
                     foreach ($data['output']['attacker']['groups'] as $key => $group) {
                         $db->query('update combat_units set value="' . $group['quantity'] . '" where combat="' . $combat['id'] . '" and id="' . $group['unitId'] . '"');
                         if ($db->affected_rows() == -1) {
                             $ok = 0;
                         }
                     }
                     $start = strftime('%Y-%m-%d %H:%M:%S', $combat['end']);
                     $db->query('update combat set stage=1, start="' . $start . '" where id="' . $combat['id'] . '"');
                     if ($db->affected_rows() == -1) {
                         $ok = 0;
                     }
                     if ($captureNode) {
                         $db->query('update nodes set user="******" where id="' . ${$nodes}['defender']->data['id'] . '"');
                         if ($db->affected_rows() == -1) {
                             $ok = 0;
                         }
                     }
                     //send reports; to be ported to an addon (remember to remove global "$ui")
                     if ($data['output']['attacker']['winner']) {
                         $attackerOutcome = $ui['won'];
                     } else {
                         $attackerOutcome = $ui['lost'];
                     }
                     if ($data['output']['defender']['winner']) {
                         $defenderOutcome = $ui['won'];
                     } else {
                         $defenderOutcome = $ui['lost'];
                     }
                     $msgBody = '<div style="text-align: center;">';
                     foreach ($data['output']['attacker']['groups'] as $key => $group) {
                         $msgBody .= '<div class="cell"><div class="unitBlock"><img class="unitBlock" src="templates/default/images/units/' . ${$nodes}['attacker']->data['faction'] . '/' . $group['unitId'] . '.png"></div><div class="unitBlock">' . $data['input']['attacker']['groups'][$key]['quantity'] . '</div><div class="unitBlock">' . $group['quantity'] . '</div></div>';
                     }
                     $msgBody .= '</div><div style="text-align: center;">' . $attackerOutcome . '</div><div style="text-align: center;">-----</div><div style="text-align: center;">' . $defenderOutcome . '</div><div style="text-align: center;">';
                     foreach ($data['output']['defender']['groups'] as $key => $group) {
                         if ($data['input']['defender']['groups'][$key]['quantity']) {
                             $msgBody .= '<div class="cell"><div class="unitBlock">' . $group['quantity'] . '</div><div class="unitBlock">' . $data['input']['defender']['groups'][$key]['quantity'] . '</div><div class="unitBlock"><img class="unitBlock" src="templates/default/images/units/' . ${$nodes}['defender']->data['faction'] . '/' . $group['unitId'] . '.png"></div></div>';
                         }
                     }
                     $msgBody .= '</div>';
                     $msgBody = $db->real_escape_string($msgBody);
                     $attackerUser = new user();
                     if ($attackerUser->get('id', ${$nodes}['attacker']->data['user']) == 'done') {
                         $attackerUser->getPreferences('name');
                         if ($attackerUser->preferences['combatReports']) {
                             $msg = new message();
                             $msg->data['sender'] = $attackerUser->data['name'];
                             $msg->data['recipient'] = $attackerUser->data['name'];
                             $msg->data['subject'] = $ui['combatReport'] . ' - ' . ${$nodes}['defender']->data['name'];
                             $msg->data['body'] = $msgBody;
                             $msg->data['viewed'] = 0;
                             $msg->add();
                         }
                     }
                     $defenderUser = new user();
                     if ($defenderUser->get('id', ${$nodes}['defender']->data['user']) == 'done') {
                         $defenderUser->getPreferences('name');
                         if ($defenderUser->preferences['combatReports']) {
                             $msg = new message();
                             $msg->data['sender'] = $defenderUser->data['name'];
                             $msg->data['recipient'] = $defenderUser->data['name'];
                             $msg->data['subject'] = $ui['combatReport'] . ' - ' . ${$nodes}['defender']->data['name'];
                             $msg->data['body'] = $msgBody;
                             $msg->data['viewed'] = 0;
                             $msg->add();
                         }
                     }
                     //\send reports
                 }
             } else {
                 ${$nodes}['attacker']->getResources();
                 $result = $db->query('select * from combat_units where combat="' . $combat['id'] . '"');
                 while ($group = db::fetch($result)) {
                     $db->query('update units set value="' . $group['value'] . '" where node="' . $combat['sender'] . '" and id="' . $group['id'] . '"');
                     if ($db->affected_rows() == -1) {
                         $ok = 0;
                     }
                     $upkeepResource = $game['units'][${$nodes}['attacker']->data['faction']][$group['id']]['upkeepResource'];
                     $upkeep = $game['units'][${$nodes}['attacker']->data['faction']][$group['id']]['upkeep'];
                     $this->resources[$upkeepResource]['value'] -= $upkeep * $group['value'];
                     $db->query('update resources set value="' . ${$nodes}['attacker']->resources[$upkeepResource]['value'] . '" where node="' . ${$nodes}['attacker']->data['id'] . '" and id="' . $upkeepResource . '"');
                     if ($db->affected_rows() == -1) {
                         $ok = 0;
                     }
                 }
                 $db->query('delete from combat_units where combat="' . $combat['id'] . '"');
                 if ($db->affected_rows() == -1) {
                     $ok = 0;
                 }
                 $db->query('delete from combat where id="' . $combat['id'] . '"');
                 if ($db->affected_rows() == -1) {
                     $ok = 0;
                 }
             }
         }
     }
     if ($ok) {
         $db->query('commit');
     } else {
         $db->query('rollback');
     }
 }