} // Now we take the construction of the next unit in the list: $started = 0; $tries = 0; while ($started == 0 && $tries <= 10) { $planet['unittrain_actual']++; if ($planet['unittrain_actual'] > 10) { $planet['unittrain_actual'] = 1; } // Unit in training $t = $planet['unittrainid_' . $planet['unittrain_actual']]; if ($t < 13 && $t >= 0 && $planet['unittrainnumberleft_' . $planet['unittrain_actual']] > 0) { $training_time = $ACTUAL_TICK; // If Unit if ($t < 7) { $training_time += UnitTimeTicksScheduler($t - 1, $planet['research_4'], $planet['user_race']); } else { switch ($t) { // 3 minute break case 10: $training_time++; break; // 27 minutes break // 27 minutes break case 11: $training_time += 9; break; // 54 minutes break // 54 minutes break case 12: $training_time += 18;
function check_academy_status() { // Checks if the training queues of a planet are consistent with the structures of the planet itself. // It's poorly written and with abuse of the continue, but that day I was so that ... $no_academy = false; $no_unit_3 = false; $no_unit_2 = false; $academy_is_working = false; $academy_next_tick = 0; $sql = 'SELECT unittrainid_1, unittrainid_2, unittrainid_3, unittrainid_4, unittrainid_5, unittrainid_6, unittrainid_7, unittrainid_8, unittrainid_9, unittrainid_10, unittrain_actual, unittrainid_nexttime, building_6, research_4 FROM planets WHERE planet_id = ' . $this->move['dest']; if (!($planet_info = $this->db->queryrow($sql))) { $this->log(MV_M_DATABASE, 'Error reading academy queues info of planet <b>' . $this->move['dest'] . '</b>'); } else { $academy_level = $planet_info['building_6']; if ($academy_level == 0) { $no_academy = true; } if ($academy_level < 5) { $no_unit_2 = true; } if ($academy_level < 9) { $no_unit_3 = true; } if ($planet_info['unittrain_actual'] != 0) { $academy_is_working = true; } if ($planet_info['unittrainid_nexttime'] != 0) { $academy_next_tick = $planet_info['unittrainid_nexttime']; } // Can't remember the meaning of this... if ($no_academy) { // No academy at all, so i reset all academy fields. Big overhead but little risks. $sql = 'UPDATE planets SET unittrainid_1 = 0, unittrainnumber_1 = 0, unittrainnumberleft_1 = 0, unittrainendless_1 = 0, unittrainid_2 = 0, unittrainnumber_2 = 0, unittrainnumberleft_2 = 0, unittrainendless_2 = 0, unittrainid_3 = 0, unittrainnumber_3 = 0, unittrainnumberleft_3 = 0, unittrainendless_3 = 0, unittrainid_4 = 0, unittrainnumber_4 = 0, unittrainnumberleft_4 = 0, unittrainendless_4 = 0, unittrainid_5 = 0, unittrainnumber_5 = 0, unittrainnumberleft_5 = 0, unittrainendless_5 = 0, unittrainid_6 = 0, unittrainnumber_6 = 0, unittrainnumberleft_6 = 0, unittrainendless_6 = 0, unittrainid_7 = 0, unittrainnumber_7 = 0, unittrainnumberleft_7 = 0, unittrainendless_7 = 0, unittrainid_8 = 0, unittrainnumber_8 = 0, unittrainnumberleft_8 = 0, unittrainendless_8 = 0, unittrainid_9 = 0, unittrainnumber_9 = 0, unittrainnumberleft_9 = 0, unittrainendless_9 = 0, unittrainid_10 = 0, unittrainnumber_10 = 0, unittrainnumberleft_10 = 0, unittrainendless_10 = 0, unittrain_actual = 0, unittrainid_nexttime = 0, unittrain_error = 0 WHERE planet_id = ' . $this->move['dest']; if (!$this->db->query($sql)) { $this->log(MV_M_DATABASE, 'Error emptying academy working queues of planet <b>' . $this->move['dest'] . '</b>'); } } else { $sqlpart = ''; // Ok, we have to check all the academy slots for ($index = 1; $index < 11; $index++) { if ($planet_info['unittrainid_' . $index] == 0) { continue; } if ($planet_info['unittrainid_' . $index] == 2 && $no_unit_2) { // Gotcha! Get out from the queue! $planet_info['unittrainid_' . $index] = 0; $sqlpart .= 'unittrainid_' . $index . ' = 0, unittrainnumber_' . $index . ' = 0, unittrainnumberleft_' . $index . ' = 0, unittrainendless_' . $index . ' = 0,'; } if ($planet_info['unittrainid_' . $index] == 3 && $no_unit_3) { // Gotcha! Get out from the queue! $planet_info['unittrainid_' . $index] = 0; $sqlpart .= 'unittrainid_' . $index . ' = 0, unittrainnumber_' . $index . ' = 0, unittrainnumberleft_' . $index . ' = 0, unittrainendless_' . $index . ' = 0,'; } } // There is something to remove from the queue? if ($sqlpart != '') { $sql = 'UPDATE planets SET ' . rtrim($sqlpart, ',') . ' WHERE planet_id = ' . $this->move['dest']; if (!$this->db->query($sql)) { $this->log(MV_M_DATABASE, 'Error updating planet <b>' . $this->move['dest'] . '</b> academy queues info'); } } // Check the active slot. If the active slot is now empty, go check for the next working slot and make it active. $active_slot = $planet_info['unittrain_actual']; $tries = 0; while ($academy_is_working && $planet_info['unittrainid_' . $active_slot] == 0) { $tries++; if ($tries > 9) { $academy_is_working = false; $sql = 'UPDATE planets SET unittrain_actual = 0, unittrainid_nexttime = 0, unittrain_error = 0 WHERE planet_id = ' . $this->move['dest']; if (!$this->db->query($sql)) { $this->log(MV_M_DATABASE, 'Error clearing OLD academy active slot of planet <b>' . $this->move['dest'] . '</b>'); } continue; } $active_slot++; if ($active_slot > 10) { $active_slot = 1; } if ($planet_info['unittrainid_' . $active_slot] == 0) { continue; } $academy_next_tick = $this->CURRENT_TICK + UnitTimeTicksScheduler($planet_info['unittrainid_' . $active_slot], $planet_info['research_4'], $this->dest['user_race']); $sql = 'UPDATE planets SET unittrain_actual = ' . $active_slot . ', unittrainid_nexttime = ' . $academy_next_tick . ', unittrain_error = 0 WHERE planet_id = ' . $this->move['dest']; if (!$this->db->query($sql)) { $this->log(MV_M_DATABASE, 'Error updating NEW academy active slot of planet <b>' . $this->move['dest'] . '</b>'); } } } } }