diff --git a/hwe/b_genList.php b/hwe/b_genList.php index a28b48b3..7e9a2c34 100644 --- a/hwe/b_genList.php +++ b/hwe/b_genList.php @@ -86,7 +86,7 @@ $templates = new \League\Plates\Engine('templates'); queryAllLists('SELECT troop, name FROM troop WHERE nation=%i', $me['nation']) as [$troopID, $tName]){ +foreach($db->queryAllLists('SELECT troop_leader, name FROM troop WHERE nation=%i', $me['nation']) as [$troopID, $tName]){ $troopName[$troopID] = $tName; } @@ -99,7 +99,7 @@ switch ($type) { case 5: $orderSQL = "order by crew desc"; break; case 6: $orderSQL = "order by killturn"; break; case 7: $orderSQL = "order by turntime"; break; - case 8: $orderSQL = "order by troop desc"; break; + case 8: $orderSQL = "order by troop_leader desc"; break; } $generals = $db->query( diff --git a/hwe/b_troop.php b/hwe/b_troop.php index b314a6ef..855d192e 100644 --- a/hwe/b_troop.php +++ b/hwe/b_troop.php @@ -14,11 +14,9 @@ increaseRefresh("부대편성", 1); $me = $db->queryFirstRow('SELECT no,nation,troop FROM general WHERE owner=%i', $userID); $troops = []; -foreach($db->query('SELECT troop,name,no FROM troop WHERE nation = %i', $me['nation']) as $rawTroop){ - $troops[$rawTroop['troop']] = [ - 'troop'=>$rawTroop['troop'], +foreach($db->query('SELECT troop_leader,name FROM troop WHERE nation = %i', $me['nation']) as $rawTroop){ + $troops[$rawTroop['troop_leader']] = [ 'name'=>$rawTroop['name'], - 'no'=>$rawTroop['no'], 'users'=>[] ]; } @@ -41,7 +39,7 @@ foreach($db->query( if($troops){ $troopLeaders = $db->query( 'SELECT no,name,picture,imgsvr,turntime,city,troop FROM general WHERE no IN %li', - array_column($troops, 'no') + array_keys($troops) ); foreach($db->queryAllLists( @@ -147,7 +145,7 @@ foreach ($troops as $troopNo=>$troop) { - '> +
】 ");background-size:64px;'>  diff --git a/hwe/c_myBossInfo.php b/hwe/c_myBossInfo.php index 13e94edd..57251af6 100644 --- a/hwe/c_myBossInfo.php +++ b/hwe/c_myBossInfo.php @@ -163,22 +163,19 @@ if($btn == "추방") { ], 'no=%i', $general['no']); } } - // 부대 처리 - $query = "select no from troop where troop='{$general['troop']}'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $troop = MYDB_fetch_array($result); //부대장일 경우 - if($troop['no'] == $general['no']) { + if($general['troop'] == $general['no']){ // 모두 탈퇴 - $query = "update general set troop='0' where troop='{$general['troop']}'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - // 부대 삭제 - $query = "delete from troop where troop='{$general['troop']}'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - } else { - $query = "update general set troop='0' where no='{$general['no']}'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); + $db->update('general', [ + 'troop'=>0, + ], 'troop = %i', $general['no']); + $db->delete('troop', 'troop_leader=%i', $general['no']); + } + else { + $db->update('general', [ + 'troop'=>0, + ], 'no=%i', $general['no']); } // 도시관직해제 diff --git a/hwe/c_troop.php b/hwe/c_troop.php index 07fa5d1a..bfee5ed1 100644 --- a/hwe/c_troop.php +++ b/hwe/c_troop.php @@ -24,43 +24,39 @@ if($name && mb_strwidth($name) > 18){ $name = trim($name); if($btn == "부 대 창 설" && $name != "" && $me['troop'] == 0) { - $db->insert('troop',[ + $db->insertIgnore('troop',[ + 'troop_leader'=>$me['no'], 'name'=>$name, 'nation'=>$me['nation'], - 'no'=>$me['no'] ]); - $troopID = $db->insertId(); $db->update('general', [ - 'troop'=>$troopID + 'troop'=>$me['no'], ], 'no=%i',$me['no']); } elseif($btn == "부 대 변 경" && $name != "") { $db->update('troop', [ 'name'=>$name - ], 'no=%i',$me['no']); + ], 'troop_leader=%i',$me['no']); } elseif($btn == "부 대 추 방" && $gen != 0) { $db->update('general', [ 'troop'=>0 - ], 'no=%i AND troop=(SELECT troop FROM troop WHERE no = %i)', $gen, $me['no']); + ], 'no=%i AND troop= %i', $gen, $me['no']); } elseif($btn == "부 대 가 입" && $troop != 0) { - $troopLeader = $db->queryFirstField('SELECT `no` FROM troop WHERE troop=%i', $troop); - $troopLeaderNation = $db->queryFirstField('SELECT `nation` FROM `general` WHERE `no`=%i AND `nation`=%i', $troopLeader, $me['nation']); + $troopLeaderNation = $db->queryFirstField('SELECT `nation` FROM `general` WHERE `no`=%i AND `troop`=%i AND `nation`=%i', $troop, $troop, $me['nation']); if($troopLeaderNation){ $db->update('general', [ 'troop'=>$troop ], 'no=%i', $me['no']); } } elseif($btn == "부 대 탈 퇴") { - $troopLeader = $db->queryFirstField('SELECT `no` FROM troop WHERE troop=%i', $me['troop']); - //부대장일 경우 - if($troopLeader == $me['no']) { + if($me['troop'] == $me['no']) { // 모두 탈퇴 $db->update('general', [ 'troop'=>0 ], 'troop=%i',$me['troop']); // 부대 삭제 - $db->delete('troop', 'troop=%i', $me['troop']); + $db->delete('troop', 'troop_leader=%i', $me['troop']); } else { $db->update('general', [ 'troop'=>0 diff --git a/hwe/func.php b/hwe/func.php index eba275fd..39336fb3 100644 --- a/hwe/func.php +++ b/hwe/func.php @@ -654,7 +654,7 @@ function generalInfo($no) { $lbonus = ""; } - $troop = getTroop($general['troop']); + $troopName = getTroopName($general['troop'])??'-'; $level = getLevel($general['level'], $nation['level']); if($general['level'] == 2) { @@ -723,7 +723,6 @@ function generalInfo($no) { default: $train = "{$general['train']}"; break; } - if($general['troop'] == 0) { $troop['name'] = "-"; } if($general['mode'] == 2) { $general['mode'] = "수비 함(훈사80)"; } elseif($general['mode'] == 1) { $general['mode'] = "수비 함(훈사60)"; } else { $general['mode'] = "수비 안함"; } @@ -797,7 +796,7 @@ function generalInfo($no) { 부대 - {$troop['name']} + {$troopName} 벌점 ".getConnect($general['connect'])." {$general['connect']}({$general['con']}) @@ -1885,15 +1884,13 @@ function getMe() { return $me; } -function getTroop($troop) { +function getTroopName(int $troopLeader):?string { + if($troopLeader == 0){ + return null; + } $db = DB::db(); - $connect=$db->get(); - $query = "select * from troop where troop='$troop'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $troop = MYDB_fetch_array($result); - - return $troop; + return $db->queryFirstField('SELECT `name` FROM troop WHERE troop_leader = %i', $troopLeader); } function getCity($city, $sel="*") { diff --git a/hwe/func_gamerule.php b/hwe/func_gamerule.php index 4b28301d..8755cbff 100644 --- a/hwe/func_gamerule.php +++ b/hwe/func_gamerule.php @@ -983,13 +983,12 @@ function updateNationState() { $npcID = $npcObj->generalID; $db->insert('troop', [ + 'troop_leader'=>$npcID, 'name'=>$npcObj->realName, 'nation'=>$nation['nation'], - 'no'=>$npcID ]); - $troopID = $db->insertId(); $db->update('general', [ - 'troop'=>$troopID + 'troop'=>$npcID ], 'no=%i', $npcID); //TODO: 5턴간 집합턴 입력 diff --git a/hwe/sammo/Command/General/che_집합.php b/hwe/sammo/Command/General/che_집합.php index 7a459f50..8ca8beb2 100644 --- a/hwe/sammo/Command/General/che_집합.php +++ b/hwe/sammo/Command/General/che_집합.php @@ -74,8 +74,8 @@ class che_집합 extends Command\GeneralCommand{ $cityName = $this->city['name']; $josaRo = JosaUtil::pick($cityName, '로'); - $troopID = $general->getVar('troop'); - $troopName = $db->queryFirstField('SELECT name FROM troop WHERE troop = %i', $troopID); + $troopID = $general->getID(); + $troopName = $db->queryFirstField('SELECT name FROM troop WHERE troop_leader = %i', $troopID); $logger = $general->getLogger(); @@ -88,7 +88,6 @@ class che_집합 extends Command\GeneralCommand{ ], 'no IN %li', $generalList); } foreach($generalList as $targetGeneralID){ - $targetGeneral = General::createGeneralObjFromDB($targetGeneralID, [], 1); $targetLogger = new ActionLogger($targetGeneralID, $general->getNationID(), $env['year'], $env['month']); $targetLogger->pushGeneralActionLog("{$troopName}의 부대원들은 {$cityName}{$josaRo} 집합되었습니다.", ActionLogger::PLAIN); $targetLogger->flush(); diff --git a/hwe/sammo/Constraint/MustBeTroopLeader.php b/hwe/sammo/Constraint/MustBeTroopLeader.php index c2a5abc7..055f04cd 100644 --- a/hwe/sammo/Constraint/MustBeTroopLeader.php +++ b/hwe/sammo/Constraint/MustBeTroopLeader.php @@ -24,11 +24,7 @@ class MustBeTroopLeader extends Constraint{ $this->checkInputValues(); $this->tested = true; - //XXX: 부대장인지 알 수가 없음 - $db = DB::db(); - $troopLeader = $db->queryFirstField('SELECT no FROM troop WHERE troop = %i', $this->general['troop']); - - if($troopLeader == $this->general['no']){ + if($this->general['no'] == $this->general['troop']){ return true; } diff --git a/hwe/sammo/Constraint/ReqTroopMembers.php b/hwe/sammo/Constraint/ReqTroopMembers.php index 64319ac6..c8495974 100644 --- a/hwe/sammo/Constraint/ReqTroopMembers.php +++ b/hwe/sammo/Constraint/ReqTroopMembers.php @@ -25,7 +25,7 @@ class ReqTroopMembers extends Constraint{ $db = DB::db(); //NOTE:이 경우에 DB를 사용하지 않을 수 있는가? - $troopMember = $db->queryFirstField('SELECT no FROM troop WHERE troop = %i AND no != %i LIMIT 1', $this->general['troop'], $this->general['no']); + $troopMember = $db->queryFirstField('SELECT no FROM general WHERE troop = %i AND no != %i LIMIT 1', $this->general['troop'], $this->general['troop']); if($troopMember !== null){ return true; diff --git a/hwe/sammo/Engine/Personnel.php b/hwe/sammo/Engine/Personnel.php index 2251a3c1..ef7c3f25 100644 --- a/hwe/sammo/Engine/Personnel.php +++ b/hwe/sammo/Engine/Personnel.php @@ -92,13 +92,7 @@ class Personnel{ return [$result, $reason]; } - $isTroopLeader = false; - if($general['troop']){ - $troopLeader = $db->queryFirstField('SELECT `no` FROM troop WHERE troop = %i', $general['troop']); - if($troopLeader == $generalID){ - $isTroopLeader = true; - } - } + $isTroopLeader = ($generalID == $general['troop']); $joinedNations = Json::decode($general['nations']); $joinedNations[] = $this->nation['nation']; @@ -183,9 +177,9 @@ class Personnel{ // 모두 탈퇴 $db->update('general', [ 'troop'=>0, - ], 'troop=%i', $general['troop']); + ], 'troop_leader=%i', $generalID); // 부대 삭제 - $db->delete('troop', 'troop=%i', $general['troop']); + $db->delete('troop', 'troop_leader=%i', $generalID); } return [ScoutMessage::ACCEPTED, '']; diff --git a/hwe/sammo/General.php b/hwe/sammo/General.php index 8f70374f..a30f12c9 100644 --- a/hwe/sammo/General.php +++ b/hwe/sammo/General.php @@ -265,17 +265,15 @@ class General implements iAction{ ], 'gen3=%i', $generalID); // 부대 처리 - $troopID = $this->getVar('troop'); - $troopLeaderID = $db->queryFirstField('SELECT `no` FROM troop WHERE troop=%i', $troopID); + $troopLeaderID = $this->getVar('troop'); if($troopLeaderID == $generalID){ //부대장일 경우 // 모두 탈퇴 $db->update('general', [ 'troop'=>0 - ], 'troop=%i', $troopID); - + ], 'troop_leader=%i', $troopLeaderID); // 부대 삭제 - $db->delete('troop', 'troop=%i', $troopID); + $db->delete('troop', 'troop_leader=%i', $troopLeaderID); } $dyingMessage = new TextDecoration\DyingMessage($this->getName(), $this->getVar('npc')); diff --git a/hwe/sql/schema.sql b/hwe/sql/schema.sql index 8f65f2b5..690b3b81 100644 --- a/hwe/sql/schema.sql +++ b/hwe/sql/schema.sql @@ -286,14 +286,12 @@ CREATE TABLE `city` ( ## 부대 테이블 ########################################################################### -create table troop ( - troop int(6) not null auto_increment, - name char(64) not null, - nation int(6) not null, - no int(6) not null, - - PRIMARY KEY (troop) -) ENGINE=INNODB DEFAULT CHARSET=utf8mb4; +CREATE TABLE `troop` ( + `troop_leader` INT(6) NOT NULL, + `nation` INT(6) NOT NULL, + `name` VARCHAR(50) NOT NULL, + PRIMARY KEY (`troop_leader`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4; ########################################################################## ## 락 테이블