diff --git a/hwe/func_npc.php b/hwe/func_npc.php index 051aa722..236dbb00 100644 --- a/hwe/func_npc.php +++ b/hwe/func_npc.php @@ -309,12 +309,11 @@ function processAI($no) { //재야인경우 if($general['npc'] == 5 && $general['level'] == 0) { // 오랑캐는 바로 임관 - $query = "select nation from general where level=12 and npc=5 and nation not in (0{$general['nations']}0) order by rand() limit 0,1"; - $result = MYDB_query($query, $connect) or Error("processAI06 ".MYDB_error($connect),""); - $rulerCount = MYDB_num_rows($result); - if($rulerCount > 0) { - $ruler = MYDB_fetch_array($result); - $command = EncodeCommand(0, 0, $ruler['nation'], 25); //임관 + + $rulerNation = $db->queryFirstField('SELECT nation FROM general WHERE `level`=12 AND npc=5 and nation not in %li ORDER BY RAND() limit 1', Json::decode($general['nations'])); + + if($ruler) { + $command = EncodeCommand(0, 0, $rulerNation, 25); //임관 } else { $command = EncodeCommand(0, 0, 0, 42); //견문 } @@ -328,7 +327,7 @@ function processAI($no) { $available = true; - if($admin['startyear']+3 > $admin['year']){ + if($admin['startyear']+2 > $admin['year']){ //초기 임관 기간에서는 국가가 적을수록 임관 시도가 적음 $nationCnt = $db->queryFirstField('SELECT count(nation) FROM nation'); if(Util::randBool(1/$nationCnt)){ @@ -346,10 +345,10 @@ function processAI($no) { } break; case 2: case 3: //거병이나 견문 40% - // 초반이면서 능력이 좋은놈 위주로 1.5%확률로 거병 (300명 재야시 2년간 약 15개 거병 예상) - $prop = rand() % 100; + // 초반이면서 능력이 좋은놈 위주로 1.5%확률로 거병 + $prop = Util::randF() * (GameConst::$defaultStatNPCMax + GameConst::$chiefStatMin) * 2 / 3; $ratio = Util::round(($general['leader'] + $general['power'] + $general['intel']) / 3); - if($admin['startyear']+2 > $admin['year'] && $prop < $ratio && rand()%200 < 3 && $general['makelimit'] == 0) { + if($admin['startyear']+2 > $admin['year'] && $prop < $ratio && Util::randBool(0.01) && $general['makelimit'] == 0) { //거병 $command = EncodeCommand(0, 0, 0, 55); } else { diff --git a/hwe/func_process_personnel.php b/hwe/func_process_personnel.php index 19ee0c49..5bb7f075 100644 --- a/hwe/func_process_personnel.php +++ b/hwe/func_process_personnel.php @@ -78,12 +78,14 @@ function process_25(&$general) { $nation = null; + $joinedNations = Json::decode($general['nations']); + // 랜덤임관인 경우 if($general['npc'] > 2 && $where >= 98 && ($admin['scenario'] == 0 || $admin['scenario'] >= 20 || !$admin['fiction'])){ //'사실' 모드에서는 '성향'에 우선을 두되, 장수수, 랜덤에 비중을 둠 $nations = $db->query( - 'SELECT nation.`name` as `name`,nation.nation as nation,scout,nation.`level` as `level`,gennum,`affinity` FROM nation join general on general.nation = nation.nation and general.level = 12 WHERE nation.nation not in %s and gennum < %i and scout = 0', - '0'.$general['nations'].'0', + 'SELECT nation.`name` as `name`,nation.nation as nation,scout,nation.`level` as `level`,gennum,`affinity` FROM nation join general on general.nation = nation.nation and general.level = 12 WHERE nation.nation not in %li and gennum < %i and scout = 0', + $joinedNations, ($admin['year'] < $admin['startyear']+3)?GameConst::$initialNationGenLimit:GameConst::$defaultMaxGeneral ); shuffle($nations); @@ -115,8 +117,8 @@ function process_25(&$general) { else if($where >= 98) { //랜임 $nations = $db->query( - 'SELECT nation.`name` as `name`,nation.nation as nation,scout,nation.`level` as `level`,gennum,`injury` FROM nation join general on general.nation = nation.nation and general.level = 12 WHERE nation.nation not in %s and gennum < %i and scout = 0', - '0'.$general['nations'].'0', + 'SELECT nation.`name` as `name`,nation.nation as nation,scout,nation.`level` as `level`,gennum,`injury` FROM nation join general on general.nation = nation.nation and general.level = 12 WHERE nation.nation not in %li and gennum < %i and scout = 0', + $joinedNations, ($admin['year'] < $admin['startyear']+3)?GameConst::$initialNationGenLimit:GameConst::$defaultMaxGeneral ); shuffle($nations); @@ -133,7 +135,7 @@ function process_25(&$general) { } $score = 1; - if($admin['startyear']+3 > $admin['year']){ + if($admin['startyear']+3 > $admin['year'] && $general['npc'] > 2){ $score *= sqrt((100-$testNation['injury'])/100); } @@ -168,7 +170,7 @@ function process_25(&$general) { $log[] = "●{$admin['month']}월:현재 {$nation['name']}{$josaUn} 임관이 금지되어 있습니다. 임관 실패."; } elseif($general['makelimit'] > 0 && $general['npc'] < 5) { $log[] = "●{$admin['month']}월:재야가 된지 12턴이 지나야 합니다. 임관 실패. <1>$date"; - } elseif(strpos($general['nations'], ",{$nation['nation']},") > 0) { + } elseif(in_array($nation['nation'], $joinedNations)) { $log[] = "●{$admin['month']}월:이미 임관했었던 국가입니다. 임관 실패. <1>$date"; } else { $josaYi = JosaUtil::pick($general['name'], '이'); @@ -195,15 +197,23 @@ function process_25(&$general) { $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); $king = MYDB_fetch_array($result); + // NPC초반시 임관기록 추가 안함 if($general['npc'] > 1 && $admin['year'] < $admin['startyear']+3) { } else { - $general['nations'] .= "{$nation['nation']},"; + $joinedNations[] = $nation['nation']; } // 국적 바꾸고 등급 일반으로 // 명성 상승 - $query = "update general set resturn='SUCCESS',nation='{$nation['nation']}',nations='{$general['nations']}',level='1',experience=experience+'$exp',city='{$king['city']}',belong=1 where no='{$general['no']}'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); + $db->update('general', [ + 'resturn'=>'SUCCESS', + 'nation'=>$nation['nation'], + 'nations'=>Json::encode($joinedNations), + 'level'=>1, + 'experience'=>$db->sqleval('experience + %i', $exp), + 'city'=>$king['city'], + 'belong'=>1 + ], 'no=%i', $general['no']); //국가 기술력 그대로 $query = "select no from general where nation='{$nation['nation']}'"; diff --git a/hwe/processing.php b/hwe/processing.php index 4e2bae73..f68592ab 100644 --- a/hwe/processing.php +++ b/hwe/processing.php @@ -967,6 +967,8 @@ function command_25($turn, $command) { $result = MYDB_query($query, $connect) or Error("command_27 ".MYDB_error($connect),""); $me = MYDB_fetch_array($result); + $joinedNations = Json::decode($me['nations']); + $query = "select nation,name,color,scout,scoutmsg,sabotagelimit,gennum from nation order by gennum"; $result = MYDB_query($query, $connect) or Error("aaa_processing.php ".MYDB_error($connect),""); $count = MYDB_num_rows($result); @@ -1001,7 +1003,7 @@ function command_25($turn, $command) { } elseif($nation['scout'] == 1) { echo " "; - } elseif(strpos($me['nations'], ",{$nation['nation']},") > 0) { + } elseif(in_array($nation['nation'], $joinedNations)) { /* echo " "; diff --git a/hwe/sammo/Engine/Personnel.php b/hwe/sammo/Engine/Personnel.php index a3b588c0..790ceab2 100644 --- a/hwe/sammo/Engine/Personnel.php +++ b/hwe/sammo/Engine/Personnel.php @@ -71,7 +71,7 @@ class Personnel{ return [ScoutMessage::DECLINED, '군주는 등용장을 수락할 수 없습니다.']; } - if(strpos($general['nations'], ",{$this->nation['nation']},") !== false){ + if(in_array($this->nation['nation'], Json::decode($general['nations']))){ return [ScoutMessage::DECLINED, '이미 임관했었던 국가입니다.']; } @@ -119,13 +119,16 @@ class Personnel{ $originalNationGeneralCnt = GameConst::$initialNationGenLimit; } + $joinedNations = Json::decode($general['nations']); + $joinedNations[] = $this->nation['nation']; + // 국가 변경, 도시 변경, 일반으로, 수도로 $setValues = [ 'belong'=>1, 'level'=>1, 'nation'=>$this->nation['nation'], 'city'=>$this->nation['capital'], - 'nations'=>$db->sqleval('CONCAT(nations, %s)', "{$this->nation['nation']},"), + 'nations'=>Json::encode($joinedNations), 'troop'=>0, ]; diff --git a/hwe/sql/schema.sql b/hwe/sql/schema.sql index 002a84bb..4c6b34e9 100644 --- a/hwe/sql/schema.sql +++ b/hwe/sql/schema.sql @@ -23,7 +23,7 @@ CREATE TABLE `general` ( `name` CHAR(32) NOT NULL COLLATE 'utf8mb4_bin', `name2` CHAR(32) NULL DEFAULT NULL COLLATE 'utf8mb4_bin', `nation` INT(6) NULL DEFAULT '0', - `nations` CHAR(64) NULL DEFAULT ',0,', + `nations` VARCHAR(64) NOT NULL DEFAULT '[0]', `city` INT(6) NULL DEFAULT '3', `troop` INT(6) NULL DEFAULT '0', `leader` INT(3) NULL DEFAULT '50',