public function gerarNovoDuelo($params) { $this->uses('Hero'); $rand = rand(0, 1); $mode = 0; $oficial = 1; switch ($mode) { case 0: //Sem Restrição $heroId1 = (int) Hero::select('id', array(), 'rand()', NULL, 1)[0]['id']; $heroId2 = (int) Hero::select('id', array(), 'rand()', NULL, 1)[0]['id']; break; case 1: //Sentinel x Scourge $heroId1 = (int) Hero::select('id', array('filiacao' => $rand ? 'SENTINEL' : 'SCOURGE'), 'rand()', NULL, 1)[0]['id']; $heroId2 = (int) Hero::select('id', array('filiacao' => $rand ? 'SCOURGE' : 'SENTINEL'), 'rand()', NULL, 1)[0]['id']; break; case 2: //Sentinel x Scourge | para apenas os que não jogaram X vezes como jogador/oponente | X = 1 $count = (int) Hero::nativeQuery("SELECT count(*) as n FROM hero WHERE id NOT IN (SELECT jogador FROM duelo" . ($oficial === NULL ? "" : " WHERE oficial = {$oficial}") . ") AND id NOT IN (SELECT oponente FROM duelo" . ($oficial === NULL ? "" : " WHERE oficial = {$oficial}") . ")")[0]->n; if ($count < 2) { return json_encode(NULL); } $heroId1 = Hero::nativeQuery("SELECT id FROM hero WHERE filiacao = '" . ($rand ? 'SENTINEL' : 'SCOURGE') . "' AND (id NOT IN (SELECT jogador FROM duelo" . ($oficial === NULL ? "" : " WHERE oficial = {$oficial}") . ") AND id NOT IN (SELECT oponente FROM duelo" . ($oficial === NULL ? "" : " WHERE oficial = {$oficial}") . ")) ORDER BY rand() LIMIT 1"); $heroId2 = Hero::nativeQuery("SELECT id FROM hero WHERE filiacao = '" . ($rand ? 'SCOURGE' : 'SENTINEL') . "' AND (id NOT IN (SELECT jogador FROM duelo" . ($oficial === NULL ? "" : " WHERE oficial = {$oficial}") . ") AND id NOT IN (SELECT oponente FROM duelo" . ($oficial === NULL ? "" : " WHERE oficial = {$oficial}") . ")) ORDER BY rand() LIMIT 1"); $heroId1 = $heroId1 ? (int) $heroId1[0]->id : NULL; $heroId2 = $heroId2 ? (int) $heroId2[0]->id : NULL; break; case 3: // para apenas os que jogaram X vezes como jogador/oponente | X = 1 $count = (int) Hero::nativeQuery("SELECT count(*) as n FROM hero WHERE id NOT IN (SELECT jogador FROM duelo" . ($oficial === NULL ? "" : " WHERE oficial = {$oficial}") . ") AND id NOT IN (SELECT oponente FROM duelo" . ($oficial === NULL ? "" : " WHERE oficial = {$oficial}") . ")")[0]->n; if ($count < 2) { return json_encode(NULL); } $heroId1 = Hero::nativeQuery("SELECT id FROM hero WHERE id NOT IN (SELECT jogador FROM duelo" . ($oficial === NULL ? "" : " WHERE oficial = {$oficial}") . ") AND id NOT IN (SELECT oponente FROM duelo" . ($oficial === NULL ? "" : " WHERE oficial = {$oficial}") . ") ORDER BY rand() LIMIT 1"); $heroId1 = $heroId1 ? (int) $heroId1[0]->id : NULL; $heroId2 = Hero::nativeQuery("SELECT id FROM hero WHERE id NOT IN (SELECT jogador FROM duelo" . ($oficial === NULL ? "" : " WHERE oficial = {$oficial}") . ") AND id NOT IN (SELECT oponente FROM duelo" . ($oficial === NULL ? "" : " WHERE oficial = {$oficial}") . ") AND id <> {$heroId1} ORDER BY rand() LIMIT 1"); $heroId2 = $heroId2 ? (int) $heroId2[0]->id : NULL; break; case 4: // Sentinel x Scourge | para apenas os que jogaram como jogador jogarão como oponente e vice-versa $heroId1 = Hero::nativeQuery("SELECT id FROM hero WHERE filiacao = '" . ($rand ? 'SENTINEL' : 'SCOURGE') . "' AND id NOT IN (SELECT jogador FROM duelo" . ($oficial === NULL ? "" : " WHERE oficial = {$oficial}") . ") ORDER BY rand() LIMIT 1"); $heroId2 = Hero::nativeQuery("SELECT id FROM hero WHERE filiacao = '" . ($rand ? 'SCOURGE' : 'SENTINEL') . "' AND id NOT IN (SELECT oponente FROM duelo" . ($oficial === NULL ? "" : " WHERE oficial = {$oficial}") . ") ORDER BY rand() LIMIT 1"); $heroId1 = $heroId1 ? (int) $heroId1[0]->id : NULL; $heroId2 = $heroId2 ? (int) $heroId2[0]->id : NULL; break; case 5: // para apenas os que jogaram como jogador jogarão como oponente e vice-versa $heroId1 = Hero::nativeQuery("SELECT id FROM hero WHERE id NOT IN (SELECT jogador FROM duelo" . ($oficial === NULL ? "" : " WHERE oficial = {$oficial}") . ") ORDER BY rand() LIMIT 1"); $heroId1 = $heroId1 ? (int) $heroId1[0]->id : NULL; $heroId2 = Hero::nativeQuery("SELECT id FROM hero WHERE id NOT IN (SELECT oponente FROM duelo" . ($oficial === NULL ? "" : " WHERE oficial = {$oficial}") . ") AND id <> {$heroId1} ORDER BY rand() LIMIT 1"); $heroId2 = $heroId2 ? (int) $heroId2[0]->id : NULL; break; case 6: // Sentinel (jogador) x Scourge (oponente) | para apenas os que jogaram como jogador jogarão como oponente e vice-versa $heroId1 = Hero::nativeQuery("SELECT id FROM hero WHERE filiacao = 'SENTINEL' AND id NOT IN (SELECT jogador FROM duelo" . ($oficial === NULL ? "" : " WHERE oficial = {$oficial}") . ") ORDER BY rand() LIMIT 1"); $heroId2 = Hero::nativeQuery("SELECT id FROM hero WHERE filiacao = 'SCOURGE' AND id NOT IN (SELECT oponente FROM duelo" . ($oficial === NULL ? "" : " WHERE oficial = {$oficial}") . ") ORDER BY rand() LIMIT 1"); $heroId1 = $heroId1 ? (int) $heroId1[0]->id : NULL; $heroId2 = $heroId2 ? (int) $heroId2[0]->id : NULL; break; } //$hero1 = Hero::load($heroIds[ rand(0, count($heroIds)-1) ]); //$hero2 = Hero::load($heroIds[ rand(0, count($heroIds)-1) ]); $hero1 = Hero::load($heroId1); $hero2 = Hero::load($heroId2); if (!$hero1 || !$hero2) { return json_encode(NULL); } return json_encode(array($hero1, $hero2)); }