/** * Make current controlled soldier attack an ennemy soldier * * @param int $soldierId Id of the soldier to attack */ public function attackSoldier($soldierId) { $this->_db->beginTransaction(); try { $attackAp = $this->_ruleset->get('soldier.apPerAttack'); $personna = $this->_db->fetchFirstRequest('getPersonnaSoldier', array(':id' => $this->_data['ID'])); if (empty($personna)) { $this->_messenger->add('error', $this->_lang->get('noPersonna')); } else { if (empty($personna['soldier_id'])) { $this->_messenger->add('error', $this->_lang->get('notASoldier')); } else { if ($personna['AP'] < $attackAp || $personna['soldier_ap'] < $attackAp) { $this->_messenger->add('error', sprintf($this->_lang->get('notEnoughAP'), $personna['AP'] . ' - ' . $personna['soldier_ap'], $attackAp)); } else { $target = new Soldier($soldierId, $this->_DI); if (empty($target->ID)) { $this->_messenger->add('error', $this->_lang->get('soldierNotFound')); } else { if ($personna['battlefield_id'] != $target->battlefield_id || abs($personna['X'] - $target->X) > 1 || abs($personna['Y'] - $target->Y) > 1) { $this->_messenger->add('error', $this->_lang->get('targetTooFar')); } else { if ($personna['hive_id'] == $target->hive_id) { $this->_messenger->add('error', $this->_lang->get('invalidTarget')); } else { $damages = $this->_ruleset->get('soldier.damages'); $killed = $target->receiveDamage($damages); $this->_db->executeRequest('soldierUseAP', array(':id' => $personna['soldier_id'], ':ap' => $attackAp)); $this->_db->executeRequest('personnaUseAP', array(':id' => $this->_data['ID'], ':ap' => $attackAp)); // Create log $this->_db->executeRequest('attackSoldierLog', array(':user_id' => $this->_data['user_id'], ':battlefield_id' => $personna['battlefield_id'], ':by_id' => $personna['soldier_id'], ':by_X' => $personna['X'], ':by_Y' => $personna['Y'], ':target_id' => $soldierId, ':target_X' => $target->X, ':target_Y' => $target->Y, ':damages' => $damages, ':kill' => $killed)); } } } } } } } catch (Exception $e) { $this->_db->rollBack(); throw $e; } $this->_db->commit(); }