From 76ac6cf5b54640c1e5c8c72aa3662083de375ba6 Mon Sep 17 00:00:00 2001 From: hide_d Date: Mon, 4 May 2020 19:51:11 +0900 Subject: [PATCH] =?UTF-8?q?=EC=BB=A4=EB=A7=A8=EB=93=9C=20=EC=9C=A0?= =?UTF-8?q?=ED=9A=A8=EC=84=B1=EC=9D=84=202=EA=B0=9C=EC=97=90=EC=84=9C=203?= =?UTF-8?q?=EA=B0=9C=EA=B5=AC=EC=84=B1=EC=9C=BC=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- f_config/config.php | 108 ++-- f_install/j_create_admin.php | 59 +-- f_install/j_install_status.php | 25 +- f_install/j_setup_db.php | 202 ++++---- f_install/j_update_js_css_path.php | 85 ++-- f_install/templates/RootDB.orig.php | 4 +- f_install/templates/ServConfig.orig.php | 27 +- hwe/_119.php | 19 +- hwe/_119_b.php | 171 +++---- hwe/_admin1.php | 19 +- hwe/_admin2.php | 231 ++++----- hwe/_admin2_submit.php | 231 +++++---- hwe/_admin4.php | 228 ++++----- hwe/_admin4_submit.php | 30 +- hwe/_admin5.php | 465 ++++++++++-------- hwe/_admin5_submit.php | 27 +- hwe/_admin6.php | 162 +++--- hwe/_admin7.php | 234 ++++----- hwe/_admin8.php | 19 +- hwe/_admin_force_rehall.php | 11 +- hwe/b_processing.php | 7 +- hwe/func.php | 14 +- hwe/func_command.php | 16 +- hwe/func_gamerule.php | 2 +- hwe/func_message.php | 3 +- hwe/func_template.php | 202 +++++--- hwe/sammo/ActionLogger.php | 168 ++++--- hwe/sammo/Command/BaseCommand.php | 226 +++++---- hwe/sammo/Command/General/che_NPC능동.php | 10 +- hwe/sammo/Command/General/che_강행.php | 118 +++-- hwe/sammo/Command/General/che_거병.php | 7 +- hwe/sammo/Command/General/che_건국.php | 165 ++++--- hwe/sammo/Command/General/che_견문.php | 7 +- hwe/sammo/Command/General/che_군량매매.php | 22 +- hwe/sammo/Command/General/che_귀환.php | 7 +- hwe/sammo/Command/General/che_기술연구.php | 7 +- hwe/sammo/Command/General/che_단련.php | 7 +- hwe/sammo/Command/General/che_등용.php | 32 +- hwe/sammo/Command/General/che_등용수락.php | 18 +- hwe/sammo/Command/General/che_랜덤임관.php | 10 +- hwe/sammo/Command/General/che_모반시도.php | 7 +- hwe/sammo/Command/General/che_물자조달.php | 7 +- hwe/sammo/Command/General/che_방랑.php | 4 +- hwe/sammo/Command/General/che_사기진작.php | 4 +- hwe/sammo/Command/General/che_상업투자.php | 4 +- hwe/sammo/Command/General/che_선양.php | 102 ++-- hwe/sammo/Command/General/che_소집해제.php | 4 +- hwe/sammo/Command/General/che_숙련전환.php | 137 +++--- hwe/sammo/Command/General/che_요양.php | 4 +- hwe/sammo/Command/General/che_이동.php | 113 +++-- hwe/sammo/Command/General/che_인재탐색.php | 6 +- hwe/sammo/Command/General/che_임관.php | 31 +- hwe/sammo/Command/General/che_장비매매.php | 22 +- hwe/sammo/Command/General/che_전투태세.php | 4 +- hwe/sammo/Command/General/che_정착장려.php | 4 +- hwe/sammo/Command/General/che_주민선정.php | 4 +- hwe/sammo/Command/General/che_증여.php | 159 +++--- hwe/sammo/Command/General/che_집합.php | 4 +- hwe/sammo/Command/General/che_징병.php | 345 ++++++------- hwe/sammo/Command/General/che_첩보.php | 143 +++--- hwe/sammo/Command/General/che_출병.php | 154 +++--- hwe/sammo/Command/General/che_하야.php | 4 +- hwe/sammo/Command/General/che_해산.php | 4 +- hwe/sammo/Command/General/che_헌납.php | 112 +++-- hwe/sammo/Command/General/che_화계.php | 177 ++++--- hwe/sammo/Command/General/che_훈련.php | 4 +- hwe/sammo/Command/General/휴식.php | 6 +- hwe/sammo/Command/Nation/che_감축.php | 11 +- hwe/sammo/Command/Nation/che_급습.php | 131 ++--- hwe/sammo/Command/Nation/che_몰수.php | 166 ++++--- hwe/sammo/Command/Nation/che_물자원조.php | 18 +- hwe/sammo/Command/Nation/che_발령.php | 20 +- hwe/sammo/Command/Nation/che_백성동원.php | 18 +- hwe/sammo/Command/Nation/che_불가침수락.php | 129 ++--- hwe/sammo/Command/Nation/che_불가침제의.php | 172 ++++--- .../Command/Nation/che_불가침파기수락.php | 105 ++-- .../Command/Nation/che_불가침파기제의.php | 16 +- hwe/sammo/Command/Nation/che_선전포고.php | 138 +++--- hwe/sammo/Command/Nation/che_수몰.php | 16 +- hwe/sammo/Command/Nation/che_의병모집.php | 5 +- hwe/sammo/Command/Nation/che_이호경식.php | 128 ++--- hwe/sammo/Command/Nation/che_종전수락.php | 104 ++-- hwe/sammo/Command/Nation/che_종전제의.php | 16 +- hwe/sammo/Command/Nation/che_증축.php | 11 +- hwe/sammo/Command/Nation/che_천도.php | 129 +++-- hwe/sammo/Command/Nation/che_초토화.php | 17 +- hwe/sammo/Command/Nation/che_포상.php | 169 ++++--- hwe/sammo/Command/Nation/che_피장파장.php | 16 +- hwe/sammo/Command/Nation/che_필사즉생.php | 5 +- hwe/sammo/Command/Nation/che_허보.php | 108 ++-- hwe/sammo/Command/Nation/휴식.php | 2 +- hwe/sammo/DiplomaticMessage.php | 6 +- hwe/sammo/GeneralAI.php | 124 ++--- hwe/sammo/ScoutMessage.php | 2 +- hwe/sammo/TurnExecutionHelper.php | 6 +- index.php | 358 +++++++------- j_login.php | 148 +++--- j_updateServer.php | 171 ++++--- showErrorLog.php | 93 ++-- src/sammo/JosaUtil.php | 12 +- 100 files changed, 4124 insertions(+), 3420 deletions(-) diff --git a/f_config/config.php b/f_config/config.php index ebcf9521..bd6edd1e 100644 --- a/f_config/config.php +++ b/f_config/config.php @@ -1,55 +1,56 @@ isLoggedIn(true)){ - $owner .= '('.$session->getUserID().','.$session->userName.')'; + if ($session->isLoggedIn(true)) { + $owner .= '(' . $session->getUserID() . ',' . $session->userName . ')'; } $fdb->insert('err_log', [ - 'date'=>$date, - 'err'=>$err, - 'errstr'=>$errstr, - 'errpath'=>$errpath, - 'trace'=>Json::encode($trace), - 'webuser'=>$owner + 'date' => $date, + 'err' => $err, + 'errstr' => $errstr, + 'errpath' => $errpath, + 'trace' => Json::encode($trace), + 'webuser' => $owner ]); } -function logErrorByCustomHandler(int $errno, string $errstr, string $errfile, int $errline, array $errcontext){ +function logErrorByCustomHandler(int $errno, string $errstr, string $errfile, int $errline, array $errcontext) +{ if (!(error_reporting() & $errno)) { // This error code is not included in error_reporting, so let it fall // through to the standard PHP error handler return false; } - + $e = new \Exception(); logError( getFriendlyErrorType($errno), $errstr, - $errfile.':'.$errline, + $errfile . ':' . $errline, getExceptionTraceAsString($e) ); } set_error_handler("\sammo\logErrorByCustomHandler"); -function logExceptionByCustomHandler(\Throwable $e){ - +function logExceptionByCustomHandler(\Throwable $e) +{ + logError( get_class($e), $e->getMessage(), - $e->getFile().':'.$e->getLine(), + $e->getFile() . ':' . $e->getLine(), getExceptionTraceAsString($e) ); - + echo $e->getTraceAsString(); throw $e; } -set_exception_handler('\\sammo\\logExceptionByCustomHandler'); \ No newline at end of file +set_exception_handler('\\sammo\\logExceptionByCustomHandler'); diff --git a/f_install/j_create_admin.php b/f_install/j_create_admin.php index 4e50fcc3..bfabd179 100644 --- a/f_install/j_create_admin.php +++ b/f_install/j_create_admin.php @@ -1,7 +1,8 @@ false, - 'reason'=>'입력값이 설정되지 않았습니다.' + 'result' => false, + 'reason' => '입력값이 설정되지 않았습니다.' ]); } -if(strlen((string)$password)!=128){ +if (strlen((string) $password) != 128) { Json::die([ - 'result'=>false, - 'reason'=>'올바르지 않은 비밀번호 해시 포맷입니다.' + 'result' => false, + 'reason' => '올바르지 않은 비밀번호 해시 포맷입니다.' ]); } -if(!class_exists('\\sammo\\RootDB')){ +if (!class_exists('\\sammo\\RootDB')) { Json::die([ - 'result'=>false, - 'reason'=>'DB 설정이 완료되지 않았습니다.' + 'result' => false, + 'reason' => 'DB 설정이 완료되지 않았습니다.' ]); } @@ -37,10 +38,10 @@ $rootDB = RootDB::db(); $rootDB->query('LOCK TABLES member WRITE, member_log WRITE'); $memberCnt = $rootDB->queryFirstField('SELECT count(`NO`) from member'); -if($memberCnt > 0){ +if ($memberCnt > 0) { Json::die([ - 'result'=>'false', - 'reason'=>'이미 계정이 생성되어 있습니다' + 'result' => 'false', + 'reason' => '이미 계정이 생성되어 있습니다' ]); } @@ -48,32 +49,32 @@ $userSalt = bin2hex(random_bytes(8)); $finalPassword = Util::hashPassword($userSalt, $password); $nowDate = TimeUtil::now(); -$rootDB->insert('member',[ +$rootDB->insert('member', [ 'oauth_type' => 'NONE', 'id' => $username, 'email' => null, - 'token_valid_until'=>'2999-01-01 00:00:00', + 'token_valid_until' => '2999-01-01 00:00:00', 'pw' => $finalPassword, 'salt' => $userSalt, - 'grade'=> 6, - 'name'=>$nickname, - 'reg_date'=>$nowDate + 'grade' => 6, + 'name' => $nickname, + 'reg_date' => $nowDate ]); $userID = $rootDB->insertId(); $rootDB->insert('member_log', [ - 'member_no'=>$userID, - 'date'=>$nowDate, - 'action_type'=>'reg', - 'action'=>Json::encode([ - 'type'=>'none', - 'aux'=>'admin', - 'id'=>$username, - 'name'=>$nickname + 'member_no' => $userID, + 'date' => $nowDate, + 'action_type' => 'reg', + 'action' => Json::encode([ + 'type' => 'none', + 'aux' => 'admin', + 'id' => $username, + 'name' => $nickname ]) ]); Json::die([ - 'result'=>true, - 'reason'=>'success' -]); \ No newline at end of file + 'result' => true, + 'reason' => 'success' +]); diff --git a/f_install/j_install_status.php b/f_install/j_install_status.php index a8182f38..a03d7311 100644 --- a/f_install/j_install_status.php +++ b/f_install/j_install_status.php @@ -1,38 +1,39 @@ 'config' + 'step' => 'config' ]); } $rootDB = RootDB::db(); $rootDB->throw_exception_on_nonsql_error = false; -$rootDB->nonsql_error_handler = function($params){ +$rootDB->nonsql_error_handler = function ($params) { Json::die([ - 'step'=>'conn_fail' + 'step' => 'conn_fail' ]); }; -$rootDB->error_handler = function($params){ +$rootDB->error_handler = function ($params) { Json::die([ - 'step'=>'sql_fail' + 'step' => 'sql_fail' ]); }; $memberCnt = $rootDB->queryFirstField('SELECT count(`NO`) from member'); -if($memberCnt == 0){ +if ($memberCnt == 0) { Json::die([ - 'step'=>'admin', - 'globalSalt'=>RootDB::getGlobalSalt() + 'step' => 'admin', + 'globalSalt' => RootDB::getGlobalSalt() ]); } Json::die([ - 'step'=>'done' -]); \ No newline at end of file + 'step' => 'done' +]); diff --git a/f_install/j_setup_db.php b/f_install/j_setup_db.php index 8185bb64..465da5f2 100644 --- a/f_install/j_setup_db.php +++ b/f_install/j_setup_db.php @@ -1,7 +1,8 @@ false, - 'reason'=>'입력 값이 올바르지 않습니다' + 'result' => false, + 'reason' => '입력 값이 올바르지 않습니다' ]); } if (!filter_var($servHost, FILTER_VALIDATE_URL)) { Json::die([ - 'result'=>false, - 'reason'=>'접속 경로가 올바르지 않습니다.' + 'result' => false, + 'reason' => '접속 경로가 올바르지 않습니다.' ]); } -if (file_exists(ROOT.'/d_setting/RootDB.php') && is_dir(ROOT.'/d_setting/RootDB.php')) { +if (file_exists(ROOT . '/d_setting/RootDB.php') && is_dir(ROOT . '/d_setting/RootDB.php')) { Json::die([ - 'result'=>false, - 'reason'=>'d_setting/RootDB.php 가 디렉토리입니다' + 'result' => false, + 'reason' => 'd_setting/RootDB.php 가 디렉토리입니다' ]); } if (class_exists('\\sammo\\RootDB')) { Json::die([ - 'result'=>false, - 'reason'=>'이미 RootDB.php 파일이 있습니다' + 'result' => false, + 'reason' => '이미 RootDB.php 파일이 있습니다' ]); } //파일 권한 검사 if (file_exists(AppConf::getUserIconPathFS()) && !is_dir(AppConf::getUserIconPathFS())) { Json::die([ - 'result'=>false, - 'reason'=>AppConf::$userIconPath.' 이 디렉토리가 아닙니다' + 'result' => false, + 'reason' => AppConf::$userIconPath . ' 이 디렉토리가 아닙니다' ]); } -if (file_exists(ROOT.'/d_log') && !is_dir(ROOT.'/d_log')) { +if (file_exists(ROOT . '/d_log') && !is_dir(ROOT . '/d_log')) { Json::die([ - 'result'=>false, - 'reason'=>'d_log 가 디렉토리가 아닙니다' + 'result' => false, + 'reason' => 'd_log 가 디렉토리가 아닙니다' ]); } -if (file_exists(ROOT.'/d_shared') && !is_dir(ROOT.'/d_shared')) { +if (file_exists(ROOT . '/d_shared') && !is_dir(ROOT . '/d_shared')) { Json::die([ - 'result'=>false, - 'reason'=>'d_shared 가 디렉토리가 아닙니다' + 'result' => false, + 'reason' => 'd_shared 가 디렉토리가 아닙니다' ]); } -if (file_exists(ROOT.'/d_setting') && !is_dir(ROOT.'/d_setting')) { +if (file_exists(ROOT . '/d_setting') && !is_dir(ROOT . '/d_setting')) { Json::die([ - 'result'=>false, - 'reason'=>'d_shared 가 디렉토리가 아닙니다' + 'result' => false, + 'reason' => 'd_shared 가 디렉토리가 아닙니다' ]); } -if (!file_exists(ROOT.'/d_log') - || !file_exists(ROOT.'/d_shared') - || !file_exists(ROOT.'/d_setting') +if ( + !file_exists(ROOT . '/d_log') + || !file_exists(ROOT . '/d_shared') + || !file_exists(ROOT . '/d_setting') || !file_exists(AppConf::getUserIconPathFS()) ) { if (!is_writable(ROOT)) { Json::die([ - 'result'=>false, - 'reason'=>'하위 디렉토리 생성 권한이 없습니다' + 'result' => false, + 'reason' => '하위 디렉토리 생성 권한이 없습니다' ]); } @@ -91,56 +93,56 @@ if (!file_exists(ROOT.'/d_log') mkdir(AppConf::getUserIconPathFS()); } - if (!file_exists(ROOT.'/d_log')) { - mkdir(ROOT.'/d_log'); + if (!file_exists(ROOT . '/d_log')) { + mkdir(ROOT . '/d_log'); } - if (!file_exists(ROOT.'/d_setting')) { - mkdir(ROOT.'/d_setting'); + if (!file_exists(ROOT . '/d_setting')) { + mkdir(ROOT . '/d_setting'); } - if (!file_exists(ROOT.'/d_shared')) { - mkdir(ROOT.'/d_shared'); + if (!file_exists(ROOT . '/d_shared')) { + mkdir(ROOT . '/d_shared'); } } if (!is_writable(AppConf::getUserIconPathFS())) { Json::die([ - 'result'=>false, - 'reason'=>AppConf::$userIconPath.' 디렉토리의 쓰기 권한이 없습니다' + 'result' => false, + 'reason' => AppConf::$userIconPath . ' 디렉토리의 쓰기 권한이 없습니다' ]); } -if (!is_writable(ROOT.'/d_log')) { +if (!is_writable(ROOT . '/d_log')) { Json::die([ - 'result'=>false, - 'reason'=>'d_log 디렉토리의 쓰기 권한이 없습니다' + 'result' => false, + 'reason' => 'd_log 디렉토리의 쓰기 권한이 없습니다' ]); } -if (!is_writable(ROOT.'/d_shared')) { +if (!is_writable(ROOT . '/d_shared')) { Json::die([ - 'result'=>false, - 'reason'=>'d_shared 디렉토리의 쓰기 권한이 없습니다' + 'result' => false, + 'reason' => 'd_shared 디렉토리의 쓰기 권한이 없습니다' ]); } -if (!is_writable(ROOT.'/d_setting')) { +if (!is_writable(ROOT . '/d_setting')) { Json::die([ - 'result'=>false, - 'reason'=>'d_setting 디렉토리의 쓰기 권한이 없습니다.' + 'result' => false, + 'reason' => 'd_setting 디렉토리의 쓰기 권한이 없습니다.' ]); } -if (!file_exists(ROOT.'/d_log/.htaccess')) { - @file_put_contents(ROOT.'/d_log/.htaccess', 'Deny from all'); +if (!file_exists(ROOT . '/d_log/.htaccess')) { + @file_put_contents(ROOT . '/d_log/.htaccess', 'Deny from all'); } -if (!file_exists(ROOT.'/d_setting/.htaccess')) { - @file_put_contents(ROOT.'/d_setting/.htaccess', 'Deny from all'); +if (!file_exists(ROOT . '/d_setting/.htaccess')) { + @file_put_contents(ROOT . '/d_setting/.htaccess', 'Deny from all'); } //DB 접근 권한 검사 @@ -151,21 +153,21 @@ $rootDB->connect_options[MYSQLI_OPT_INT_AND_FLOAT_NATIVE] = true; $rootDB->throw_exception_on_nonsql_error = false; $rootDB->nonsql_error_handler = function ($params) { Json::die([ - 'result'=>false, - 'reason'=>'DB 접속에 실패했습니다.' + 'result' => false, + 'reason' => 'DB 접속에 실패했습니다.' ]); }; $rootDB->error_handler = function ($params) { Json::die([ - 'result'=>false, - 'reason'=>'SQL을 제대로 실행하지 못했습니다. DB상태를 확인해 주세요.' + 'result' => false, + 'reason' => 'SQL을 제대로 실행하지 못했습니다. DB상태를 확인해 주세요.' ]); }; $mysqli_obj = $rootDB->get(); //로그인에 실패할 경우 자동으로 dbConnFail()이 실행됨. -if ($mysqli_obj->multi_query(file_get_contents(__DIR__.'/sql/common_schema.sql'))) { +if ($mysqli_obj->multi_query(file_get_contents(__DIR__ . '/sql/common_schema.sql'))) { while (true) { if (!$mysqli_obj->more_results()) { break; @@ -191,113 +193,113 @@ $globalSalt = bin2hex(random_bytes(16)); $sharedIconPath = WebUtil::resolveRelativePath($sharedIconPath, $servHost); $gameImagePath = WebUtil::resolveRelativePath($gameImagePath, $servHost); -$imageRequestPath = WebUtil::resolveRelativePath($gameImagePath.'/../hook/git_pull.php', $servHost); -$imageKeyInstallPath = WebUtil::resolveRelativePath($gameImagePath.'/../hook/InstallKey.php', $servHost); +$imageRequestPath = WebUtil::resolveRelativePath($gameImagePath . '/../hook/git_pull.php', $servHost); +$imageKeyInstallPath = WebUtil::resolveRelativePath($gameImagePath . '/../hook/InstallKey.php', $servHost); $result = Util::generateFileUsingSimpleTemplate( - __DIR__.'/templates/ServConfig.orig.php', - ROOT.'/d_setting/ServConfig.php', + __DIR__ . '/templates/ServConfig.orig.php', + ROOT . '/d_setting/ServConfig.php', [ - 'serverBasePath'=>$servHost, - 'sharedIconPath'=>$sharedIconPath, - 'gameImagePath'=>$gameImagePath, - 'imageRequestPath'=>$imageRequestPath, - 'imageRequestKey'=>$imageRequestKey + 'serverBasePath' => $servHost, + 'sharedIconPath' => $sharedIconPath, + 'gameImagePath' => $gameImagePath, + 'imageRequestPath' => $imageRequestPath, + 'imageRequestKey' => $imageRequestKey ], true ); -if($imageRequestKey){ - @file_get_contents($imageKeyInstallPath.'?key='.$imageRequestKey); +if ($imageRequestKey) { + @file_get_contents($imageKeyInstallPath . '?key=' . $imageRequestKey); } if ($result !== true) { Json::die([ - 'result'=>false, - 'reason'=>$result + 'result' => false, + 'reason' => $result ]); } $result = Util::generateFileUsingSimpleTemplate( - __DIR__.'/templates/common_path.orig.js', - ROOT.'/d_shared/common_path.js', + __DIR__ . '/templates/common_path.orig.js', + ROOT . '/d_shared/common_path.js', [ - 'serverBasePath'=>$servHost, - 'sharedIconPath'=>$sharedIconPath, - 'gameImagePath'=>$gameImagePath + 'serverBasePath' => $servHost, + 'sharedIconPath' => $sharedIconPath, + 'gameImagePath' => $gameImagePath ], true ); $result = Util::generateFileUsingSimpleTemplate( - __DIR__.'/templates/menu.orig.json', - ROOT.'/d_shared/menu.json', + __DIR__ . '/templates/menu.orig.json', + ROOT . '/d_shared/menu.json', [], true ); if ($result !== true) { Json::die([ - 'result'=>false, - 'reason'=>$result + 'result' => false, + 'reason' => $result ]); } $result = Util::generateFileUsingSimpleTemplate( - __DIR__.'/templates/common.orig.css', - ROOT.'/d_shared/common.css', + __DIR__ . '/templates/common.orig.css', + ROOT . '/d_shared/common.css', [ - 'serverBasePath'=>$servHost, - 'sharedIconPath'=>$sharedIconPath, - 'gameImagePath'=>$gameImagePath + 'serverBasePath' => $servHost, + 'sharedIconPath' => $sharedIconPath, + 'gameImagePath' => $gameImagePath ], true ); if ($result !== true) { Json::die([ - 'result'=>false, - 'reason'=>$result + 'result' => false, + 'reason' => $result ]); } $result = Util::generateFileUsingSimpleTemplate( - __DIR__.'/templates/RootDB.orig.php', - ROOT.'/d_setting/RootDB.php', + __DIR__ . '/templates/RootDB.orig.php', + ROOT . '/d_setting/RootDB.php', [ - 'host'=>$host, - 'user'=>$username, - 'password'=>$password, - 'dbName'=>$dbName, - 'port'=>$port, - 'globalSalt'=>$globalSalt, + 'host' => $host, + 'user' => $username, + 'password' => $password, + 'dbName' => $dbName, + 'port' => $port, + 'globalSalt' => $globalSalt, ] ); -$kakaoRedirectURI = WebUtil::resolveRelativePath('oauth_kakao/oauth.php', $servHost.'/'); +$kakaoRedirectURI = WebUtil::resolveRelativePath('oauth_kakao/oauth.php', $servHost . '/'); Util::generateFileUsingSimpleTemplate( - __DIR__.'/templates/KakaoKey.orig.php', - ROOT.'/d_setting/KakaoKey.php', + __DIR__ . '/templates/KakaoKey.orig.php', + ROOT . '/d_setting/KakaoKey.php', [ - 'REST_API_KEY'=>$kakaoRESTKey, - 'ADMIN_KEY'=>$kakaoAdminKey, - 'REDIRECT_URI'=>$kakaoRedirectURI + 'REST_API_KEY' => $kakaoRESTKey, + 'ADMIN_KEY' => $kakaoAdminKey, + 'REDIRECT_URI' => $kakaoRedirectURI ], true ); if ($result !== true) { Json::die([ - 'result'=>false, - 'reason'=>$result + 'result' => false, + 'reason' => $result ]); } Json::die([ - 'result'=>true, - 'reason'=>'success', - 'globalSalt'=>$globalSalt + 'result' => true, + 'reason' => 'success', + 'globalSalt' => $globalSalt ]); diff --git a/f_install/j_update_js_css_path.php b/f_install/j_update_js_css_path.php index 5b5f215a..56802714 100644 --- a/f_install/j_update_js_css_path.php +++ b/f_install/j_update_js_css_path.php @@ -1,13 +1,14 @@ setReadOnly(); -if($session->userGrade < 6){ +if ($session->userGrade < 6) { Json::die([ - 'result'=>false, - 'reason'=>'관리자 아님' + 'result' => false, + 'reason' => '관리자 아님' ]); } @@ -15,11 +16,11 @@ $servHost = Util::getReq('serv_host'); $sharedIconPath = Util::getReq('shared_icon_path'); $gameImagePath = Util::getReq('game_image_path'); -if($servHost){ - if(!$sharedIconPath || $gameImagePath){ +if ($servHost) { + if (!$sharedIconPath || $gameImagePath) { Json::die([ - 'result'=>false, - 'reason'=>'serv_host가 지정된 경우, sharedIconPath와 gameImagePath가 모두 지정되어야합니다.' + 'result' => false, + 'reason' => 'serv_host가 지정된 경우, sharedIconPath와 gameImagePath가 모두 지정되어야합니다.' ]); } @@ -27,58 +28,54 @@ if($servHost){ $gameImagePath = WebUtil::resolveRelativePath($gameImagePath, $servHost); $result = Util::generateFileUsingSimpleTemplate( - __DIR__.'/templates/ServConfig.orig.php', - ROOT.'/d_setting/ServConfig.php', + __DIR__ . '/templates/ServConfig.orig.php', + ROOT . '/d_setting/ServConfig.php', [ - 'serverBasePath'=>$servHost, - 'sharedIconPath'=>$sharedIconPath, - 'gameImagePath'=>$gameImagePath + 'serverBasePath' => $servHost, + 'sharedIconPath' => $sharedIconPath, + 'gameImagePath' => $gameImagePath ], true ); if ($result !== true) { Json::die([ - 'result'=>false, - 'reason'=>$result + 'result' => false, + 'reason' => $result ]); } -} -else if($sharedIconPath || $gameImagePath){ +} else if ($sharedIconPath || $gameImagePath) { $servHost = ServConfig::$serverWebPath; - if($sharedIconPath){ + if ($sharedIconPath) { $sharedIconPath = WebUtil::resolveRelativePath($sharedIconPath, $servHost); - } - else{ + } else { $sharedIconPath = ServConfig::$sharedIconPath; } - if($gameImagePath){ + if ($gameImagePath) { $gameImagePath = WebUtil::resolveRelativePath($gameImagePath, $servHost); - } - else{ + } else { $gameImagePath = ServConfig::$gameImagePath; } $result = Util::generateFileUsingSimpleTemplate( - __DIR__.'/templates/ServConfig.orig.php', - ROOT.'/d_setting/ServConfig.php', + __DIR__ . '/templates/ServConfig.orig.php', + ROOT . '/d_setting/ServConfig.php', [ - 'serverBasePath'=>$servHost, - 'sharedIconPath'=>$sharedIconPath, - 'gameImagePath'=>$gameImagePath + 'serverBasePath' => $servHost, + 'sharedIconPath' => $sharedIconPath, + 'gameImagePath' => $gameImagePath ], true ); if ($result !== true) { Json::die([ - 'result'=>false, - 'reason'=>$result + 'result' => false, + 'reason' => $result ]); } -} -else{ +} else { $servHost = ServConfig::$serverWebPath; $sharedIconPath = ServConfig::$sharedIconPath; $gameImagePath = ServConfig::$gameImagePath; @@ -87,31 +84,31 @@ else{ $result = Util::generateFileUsingSimpleTemplate( - __DIR__.'/templates/common_path.orig.js', - ROOT.'/d_shared/common_path.js', + __DIR__ . '/templates/common_path.orig.js', + ROOT . '/d_shared/common_path.js', [ - 'serverBasePath'=>$servHost, - 'sharedIconPath'=>$sharedIconPath, - 'gameImagePath'=>$gameImagePath + 'serverBasePath' => $servHost, + 'sharedIconPath' => $sharedIconPath, + 'gameImagePath' => $gameImagePath ], true ); $result = Util::generateFileUsingSimpleTemplate( - __DIR__.'/templates/common.orig.css', - ROOT.'/d_shared/common.css', + __DIR__ . '/templates/common.orig.css', + ROOT . '/d_shared/common.css', [ - 'serverBasePath'=>$servHost, - 'sharedIconPath'=>$sharedIconPath, - 'gameImagePath'=>$gameImagePath + 'serverBasePath' => $servHost, + 'sharedIconPath' => $sharedIconPath, + 'gameImagePath' => $gameImagePath ], true ); if ($result !== true) { Json::die([ - 'result'=>false, - 'reason'=>$result + 'result' => false, + 'reason' => $result ]); } diff --git a/f_install/templates/RootDB.orig.php b/f_install/templates/RootDB.orig.php index f41fbd15..1d6f74ce 100644 --- a/f_install/templates/RootDB.orig.php +++ b/f_install/templates/RootDB.orig.php @@ -1,4 +1,5 @@ connect_options[MYSQLI_OPT_INT_AND_FLOAT_NATIVE] = true; - self::$uDB->error_handler= function(){}; + self::$uDB->error_handler = function () { + }; self::$uDB->throw_exception_on_error = true; self::$uDB->throw_exception_on_nonsql_error = true; } diff --git a/f_install/templates/ServConfig.orig.php b/f_install/templates/ServConfig.orig.php index ef6c7aa3..304f9bbb 100644 --- a/f_install/templates/ServConfig.orig.php +++ b/f_install/templates/ServConfig.orig.php @@ -1,4 +1,5 @@ setReadOnly(); if($session->userGrade < 4) { -?> - - - -관리메뉴 - - - - - - - -관리자가 아닙니다.
- - - -setReadOnly(); -if($session->userGrade < 4){ +if ($session->userGrade < 4) { header('location:_119.php'); die(); } @@ -16,7 +17,7 @@ $v->rule('integer', [ 'minute', 'minutes2' ]); -if(!$v->validate()){ +if (!$v->validate()) { Error($v->errorStr()); } @@ -26,92 +27,92 @@ $minute2 = Util::getReq('minute2', 'int'); $db = DB::db(); $gameStor = KVStorage::getStorage($db, 'game_env'); -switch($btn) { -case "분당김": - $locked = false; - for($i = 0; $i < 10; $i++){ - if(tryLock()){ - $locked = true; - break; +switch ($btn) { + case "분당김": + $locked = false; + for ($i = 0; $i < 10; $i++) { + if (tryLock()) { + $locked = true; + break; + } + usleep(500000); } - usleep(500000); - } - - $gameStor->cacheValues(['turntime', 'starttime', 'tnmt_time']); - $turntime = (new \DateTimeImmutable($gameStor->turntime))->sub(new \DateInterval("PT{$minute}M")); - $starttime = (new \DateTimeImmutable($gameStor->starttime))->sub(new \DateInterval("PT{$minute}M")); - $tnmt_time = (new \DateTimeImmutable($gameStor->tnmt_time))->sub(new \DateInterval("PT{$minute}M")); - $gameStor->turntime = $turntime->format('Y-m-d H:i:s.u'); - $gameStor->starttime = $starttime->format('Y-m-d H:i:s'); - $gameStor->tnmt_time = $tnmt_time->format('Y-m-d H:i:s'); + $gameStor->cacheValues(['turntime', 'starttime', 'tnmt_time']); + $turntime = (new \DateTimeImmutable($gameStor->turntime))->sub(new \DateInterval("PT{$minute}M")); + $starttime = (new \DateTimeImmutable($gameStor->starttime))->sub(new \DateInterval("PT{$minute}M")); + $tnmt_time = (new \DateTimeImmutable($gameStor->tnmt_time))->sub(new \DateInterval("PT{$minute}M")); - $db->update('general', [ - 'turntime'=>$db->sqleval('DATE_SUB(turntime, INTERVAL %i MINUTE)', $minute) - ], true); - $db->update('auction', [ - 'expire'=>$db->sqleval('DATE_SUB(expire, INTERVAL %i MINUTE)', $minute) - ], true); - if($locked){ + $gameStor->turntime = $turntime->format('Y-m-d H:i:s.u'); + $gameStor->starttime = $starttime->format('Y-m-d H:i:s'); + $gameStor->tnmt_time = $tnmt_time->format('Y-m-d H:i:s'); + + $db->update('general', [ + 'turntime' => $db->sqleval('DATE_SUB(turntime, INTERVAL %i MINUTE)', $minute) + ], true); + $db->update('auction', [ + 'expire' => $db->sqleval('DATE_SUB(expire, INTERVAL %i MINUTE)', $minute) + ], true); + if ($locked) { + unlock(); + } + break; + case "분지연": + $locked = false; + for ($i = 0; $i < 5; $i++) { + if (tryLock()) { + $locked = true; + break; + } + usleep(500000); + } + $gameStor->cacheValues(['turntime', 'starttime', 'tnmt_time']); + $turntime = (new \DateTimeImmutable($gameStor->turntime))->add(new \DateInterval("PT{$minute}M")); + $starttime = (new \DateTimeImmutable($gameStor->starttime))->add(new \DateInterval("PT{$minute}M")); + $tnmt_time = (new \DateTimeImmutable($gameStor->tnmt_time))->add(new \DateInterval("PT{$minute}M")); + + $gameStor->turntime = $turntime->format('Y-m-d H:i:s.u'); + $gameStor->starttime = $starttime->format('Y-m-d H:i:s'); + $gameStor->tnmt_time = $tnmt_time->format('Y-m-d H:i:s'); + + $db->update('general', [ + 'turntime' => $db->sqleval('DATE_ADD(turntime, INTERVAL %i MINUTE)', $minute) + ], true); + $db->update('auction', [ + 'expire' => $db->sqleval('DATE_ADD(expire, INTERVAL %i MINUTE)', $minute) + ], true); + if ($locked) { + unlock(); + } + break; + case "토너분당김": + $tnmt_time = new \DateTime($gameStor->tnmt_time); + $tnmt_time->sub(new \DateInterval("PT{$minute2}M")); + $gameStor->tnmt_time = $tnmt_time->format('Y-m-d H:i:s'); + break; + case "토너분지연": + $tnmt_time = new \DateTimeImmutable($gameStor->tnmt_time); + $tnmt_time->add(new \DateInterval("PT{$minute2}M")); + $gameStor->tnmt_time = $tnmt_time->format('Y-m-d H:i:s'); + break; + case "금지급": + processGoldIncome(); + break; + case "쌀지급": + processRiceIncome(); + break; + case "락걸기": + for ($i = 0; $i < 10; $i++) { + if (tryLock()) { + $locked = true; + break; + } + usleep(500000); + } + break; + case "락풀기": unlock(); - } - break; -case "분지연": - $locked = false; - for($i = 0; $i < 5; $i++){ - if(tryLock()){ - $locked = true; - break; - } - usleep(500000); - } - $gameStor->cacheValues(['turntime', 'starttime', 'tnmt_time']); - $turntime = (new \DateTimeImmutable($gameStor->turntime))->add(new \DateInterval("PT{$minute}M")); - $starttime = (new \DateTimeImmutable($gameStor->starttime))->add(new \DateInterval("PT{$minute}M")); - $tnmt_time = (new \DateTimeImmutable($gameStor->tnmt_time))->add(new \DateInterval("PT{$minute}M")); - - $gameStor->turntime = $turntime->format('Y-m-d H:i:s.u'); - $gameStor->starttime = $starttime->format('Y-m-d H:i:s'); - $gameStor->tnmt_time = $tnmt_time->format('Y-m-d H:i:s'); - - $db->update('general', [ - 'turntime'=>$db->sqleval('DATE_ADD(turntime, INTERVAL %i MINUTE)', $minute) - ], true); - $db->update('auction', [ - 'expire'=>$db->sqleval('DATE_ADD(expire, INTERVAL %i MINUTE)', $minute) - ], true); - if($locked){ - unlock(); - } - break; -case "토너분당김": - $tnmt_time = new \DateTime($gameStor->tnmt_time); - $tnmt_time->sub(new \DateInterval("PT{$minute2}M")); - $gameStor->tnmt_time = $tnmt_time->format('Y-m-d H:i:s'); - break; -case "토너분지연": - $tnmt_time = new \DateTimeImmutable($gameStor->tnmt_time); - $tnmt_time->add(new \DateInterval("PT{$minute2}M")); - $gameStor->tnmt_time = $tnmt_time->format('Y-m-d H:i:s'); - break; -case "금지급": - processGoldIncome(); - break; -case "쌀지급": - processRiceIncome(); - break; -case "락걸기": - for($i = 0; $i < 10; $i++){ - if(tryLock()){ - $locked = true; - break; - } - usleep(500000); - } - break; -case "락풀기": - unlock(); - break; + break; } -header('Location:_119.php', true, 303); \ No newline at end of file +header('Location:_119.php', true, 303); diff --git a/hwe/_admin1.php b/hwe/_admin1.php index 44df5342..ddaae6f6 100644 --- a/hwe/_admin1.php +++ b/hwe/_admin1.php @@ -7,24 +7,7 @@ include "func.php"; $session = Session::requireGameLogin()->setReadOnly(); if($session->userGrade < 5) { -?> - - - -관리메뉴 - - - - - - - -관리자가 아닙니다.
- - - -setReadOnly(); -if($session->userGrade < 5) { -?> - - - -관리메뉴 - - - - - - - -관리자가 아닙니다.
- - - -userGrade < 5) { + die(requireAdminPermissionHTML()); } $db = DB::db(); @@ -32,115 +16,132 @@ $db = DB::db(); ?> + -회원관리 - - - - - + 회원관리 + + + + + + - - -
회 원 관 리
-
- - - - - -
접속제한
- - - - + + +
회원선택

NPC
NPC유저
접속제한
블럭회원
- +
회 원 관 리
+ + + + + + +
접속제한
+ + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
회원선택

+ NPC
+ NPC유저
+ 접속제한
블럭회원 +
+ "; -$generalList = $db->query('SELECT `no`, `name`, npc, `block` FROM general ORDER BY npc, binary(`name`)'); + $generalList = $db->query('SELECT `no`, `name`, npc, `block` FROM general ORDER BY npc, binary(`name`)'); -foreach($generalList as $general){ - $style = "style=;"; - if($general['block'] > 0) { $style .= "background-color:red;"; } - if($general['npc'] >= 2) { $style .= "color:cyan;"; } - elseif($general['npc'] == 1) { $style .= "color:skyblue;"; } + foreach ($generalList as $general) { + $style = "style=;"; + if ($general['block'] > 0) { + $style .= "background-color:red;"; + } + if ($general['npc'] >= 2) { + $style .= "color:cyan;"; + } elseif ($general['npc'] == 1) { + $style .= "color:skyblue;"; + } - echo " + echo " "; -} + } -echo " + echo " 아이템 지급 - - - - -
블럭 -
- 1단계:발언권, 2단계:턴블럭 -
강제 사망
이벤트
이벤트2
접속제한
턴 시각 설정
명령 설정
메세지 전달
-
- - - -
+ } + ?> + + + + + + + + + 블럭 + +
+ 1단계:발언권, 2단계:턴블럭 + + + + 강제 사망 + + + + 이벤트 + + + + 이벤트2 + + + + 접속제한 + + + + 턴 시각 설정 + + + + 명령 설정 + + + + 메세지 전달 + + + + + + + + + + + +
- + + \ No newline at end of file diff --git a/hwe/_admin2_submit.php b/hwe/_admin2_submit.php index 2b34aaff..86c8df65 100644 --- a/hwe/_admin2_submit.php +++ b/hwe/_admin2_submit.php @@ -1,4 +1,5 @@ loginGame()->setReadOnly(); -if($session->userGrade < 5) { +if ($session->userGrade < 5) { header('location:_admin2.php'); } $generalID = $session->generalID; -if(!$generalID){ +if (!$generalID) { header('location:_admin2.php'); die(); } @@ -29,331 +30,323 @@ $src = MessageTarget::buildQuick($session->generalID); $genObjList = []; $env = []; -if($genlist){ +if ($genlist) { $genObjList = General::createGeneralObjListFromDB($genlist); $env = $gameStor->cacheAll(); } -switch($btn) { +switch ($btn) { case "전체 접속허용": $db->update('general', [ - 'con'=>0 + 'con' => 0 ], true); break; case "전체 접속제한": $db->update('general', [ - 'con'=>1000 + 'con' => 1000 ], true); break; case "블럭 해제": $db->update('general', [ - 'block'=>0 + 'block' => 0 ], '`no` IN %li', $genlist); DB::db()->query('update general set block=0 where no IN %li', $genlist); break; case "1단계 블럭": $date = TimeUtil::now(); $db->update('general', [ - 'block'=>1, - 'killturn'=>24 + 'block' => 1, + 'killturn' => 24 ], '`no` IN %li', $genlist); $uid = $db->queryFirstColumn('SELECT `owner` FROM general WHERE `no` IN %li', $genlist); - RootDB::db()->update('member',[ - 'block_num'=>$db->sqleval('block_num+1'), - 'block_date'=>$date + RootDB::db()->update('member', [ + 'block_num' => $db->sqleval('block_num+1'), + 'block_date' => $date ], 'id IN %li', $uid); break; case "2단계 블럭": $date = TimeUtil::now(); $db->update('general', [ - 'gold'=>0, - 'rice'=>0, - 'block'=>2, - 'killturn'=>24 + 'gold' => 0, + 'rice' => 0, + 'block' => 2, + 'killturn' => 24 ], '`no` IN %li', $genlist); $uid = $db->queryFirstColumn('select owner from general where no IN %li', $genlist); - RootDB::db()->update('member',[ - 'block_num'=>$db->sqleval('block_num+1'), - 'block_date'=>$date + RootDB::db()->update('member', [ + 'block_num' => $db->sqleval('block_num+1'), + 'block_date' => $date ], 'id IN %li', $uid); break; case "3단계 블럭": $date = TimeUtil::now(); $db->update('general', [ - 'gold'=>0, - 'rice'=>0, - 'block'=>3, - 'killturn'=>24 + 'gold' => 0, + 'rice' => 0, + 'block' => 3, + 'killturn' => 24 ], '`no` IN %li', $genlist); $uid = $db->queryFirstColumn('SELECT `owner` from general where no IN %li', $genlist); - RootDB::db()->update('member',[ - 'block_num'=>$db->sqleval('block_num+1'), - 'block_date'=>$date + RootDB::db()->update('member', [ + 'block_num' => $db->sqleval('block_num+1'), + 'block_date' => $date ], 'id IN %li', $uid); break; case "무한삭턴": $db->update('general', [ - 'killturn'=>8000 + 'killturn' => 8000 ], '`no` IN %li', $genlist); break; case "강제 사망": $date = TimeUtil::now(true); $db->update('general', [ - 'killturn'=>0, - 'turntime'=>$date, + 'killturn' => 0, + 'turntime' => $date, ], '`no` IN %li', $genlist); $db->update('general_turn', [ - 'action'=>'휴식', - 'arg'=>'{}', - 'brief'=>'휴식', + 'action' => '휴식', + 'arg' => '{}', + 'brief' => '휴식', ], 'general_id IN %li AND turn_idx = 0', $genlist); break; case "특기 부여": [$year, $month] = $gameStor->getValuesAsArray(['year', 'month']); $text = "특기 부여!"; - foreach($db->query("SELECT `no`,leadership,strength,intel,dex1,dex2,dex3,dex4,dex5 FROM general WHERE `no` IN %li", $genlist) as $general){ + foreach ($db->query("SELECT `no`,leadership,strength,intel,dex1,dex2,dex3,dex4,dex5 FROM general WHERE `no` IN %li", $genlist) as $general) { $msg = new Message(Message::MSGTYPE_PRIVATE, $src, MessageTarget::buildQuick($general['no']), $text, new \DateTime(), new \DateTime('9999-12-31'), []); $msg->send(true); $specialWar = SpecialityHelper::pickSpecialWar($general); $db->update('general', [ - 'specage2'=>$db->sqleval('age'), - 'special2'=>$specialWar + 'specage2' => $db->sqleval('age'), + 'special2' => $specialWar ], 'no=%i', $general['no']); $specialWarName = buildGeneralSpecialWarClass($specialWar)->getName(); $josaUl = JosaUtil::pick($specialWarName, '을'); pushGeneralHistory($general['no'], ["●{$year}년 {$month}월:특기 【{$specialWarName}】{$josaUl} 습득"]); pushGenLog($general['no'], ["●특기 【{$specialWarName}】{$josaUl} 익혔습니다!"]); } - + break; case "경험치1000": - $text = $btn." 지급!"; - foreach($genlist as $generalID){ + $text = $btn . " 지급!"; + foreach ($genlist as $generalID) { $msg = new Message(Message::MSGTYPE_PRIVATE, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []); $msg->send(true); } - $db->update('general',[ - 'experience'=>$db->sqleval('experience+1000') + $db->update('general', [ + 'experience' => $db->sqleval('experience+1000') ], '`no` IN %li', $genlist); break; case "공헌치1000": - $text = $btn." 지급!"; - foreach($genlist as $generalID){ + $text = $btn . " 지급!"; + foreach ($genlist as $generalID) { $msg = new Message(Message::MSGTYPE_PRIVATE, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []); $msg->send(true); } - $db->update('general',[ - 'dedication'=>$db->sqleval('dedication+1000') + $db->update('general', [ + 'dedication' => $db->sqleval('dedication+1000') ], '`no` IN %li', $genlist); break; case "보숙10000": $text = "보병숙련도+10000 지급!"; - foreach($genlist as $generalID){ + foreach ($genlist as $generalID) { $msg = new Message(Message::MSGTYPE_PRIVATE, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []); $msg->send(true); } - $db->update('general',[ - 'dex1'=>$db->sqleval('dex1+10000') + $db->update('general', [ + 'dex1' => $db->sqleval('dex1+10000') ], '`no` IN %li', $genlist); break; case "궁숙10000": $text = "궁병숙련도+10000 지급!"; - foreach($genlist as $generalID){ + foreach ($genlist as $generalID) { $msg = new Message(Message::MSGTYPE_PRIVATE, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []); $msg->send(true); } - $db->update('general',[ - 'dex2'=>$db->sqleval('dex2+10000') + $db->update('general', [ + 'dex2' => $db->sqleval('dex2+10000') ], '`no` IN %li', $genlist); break; case "기숙10000": $src = MessageTarget::buildQuick($session->generalID); $text = "기병숙련도+10000 지급!"; - foreach($genlist as $generalID){ + foreach ($genlist as $generalID) { $msg = new Message(Message::MSGTYPE_PRIVATE, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []); $msg->send(true); } - $db->update('general',[ - 'dex3'=>$db->sqleval('dex3+10000') + $db->update('general', [ + 'dex3' => $db->sqleval('dex3+10000') ], '`no` IN %li', $genlist); break; case "귀숙10000": $src = MessageTarget::buildQuick($session->generalID); $text = "귀병숙련도+10000 지급!"; - foreach($genlist as $generalID){ + foreach ($genlist as $generalID) { $msg = new Message(Message::MSGTYPE_PRIVATE, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []); $msg->send(true); } - $db->update('general',[ - 'dex4'=>$db->sqleval('dex4+10000') + $db->update('general', [ + 'dex4' => $db->sqleval('dex4+10000') ], '`no` IN %li', $genlist); break; case "차숙10000": $src = MessageTarget::buildQuick($session->generalID); $text = "차병숙련도+10000 지급!"; - foreach($genlist as $generalID){ + foreach ($genlist as $generalID) { $msg = new Message(Message::MSGTYPE_PRIVATE, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []); $msg->send(true); } - $db->update('general',[ - 'dex5'=>$db->sqleval('dex5+10000') + $db->update('general', [ + 'dex5' => $db->sqleval('dex5+10000') ], '`no` IN %li', $genlist); break; case "접속 허용": - $db->update('general',[ - 'con'=>0 + $db->update('general', [ + 'con' => 0 ], '`no` IN %li', $genlist); break; case "접속 제한": - $db->update('general',[ - 'con'=>1000 + $db->update('general', [ + 'con' => 1000 ], '`no` IN %li', $genlist); break; case "메세지 전달": - $text = $msg??''; - foreach($genlist as $generalID){ + $text = $msg ?? ''; + foreach ($genlist as $generalID) { $msg = new Message(Message::MSGTYPE_PRIVATE, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []); $msg->send(true); } break; case "무기지급": - if($item == 'None') { + if ($item == 'None') { $text = "무기 회수!"; - } - else { - $text = getItemName($item)." 지급!"; + } else { + $text = getItemName($item) . " 지급!"; } - foreach($genlist as $generalID){ + foreach ($genlist as $generalID) { $msg = new Message(Message::MSGTYPE_PRIVATE, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []); $msg->send(true); } - if($item === 'None'){ + if ($item === 'None') { $db->update('general', [ - 'weapon'=>'None' + 'weapon' => 'None' ], '`no` IN %li', $genlist); - } - else{ + } else { $db->update('general', [ - 'weapon'=>$item + 'weapon' => $item ], '`no` IN %li', $genlist, $item); } break; case "책지급": - if($item == 'None') { + if ($item == 'None') { $text = "책 회수!"; - } - else { - $text = getItemName($item)." 지급!"; + } else { + $text = getItemName($item) . " 지급!"; } - foreach($genlist as $generalID){ + foreach ($genlist as $generalID) { $msg = new Message(Message::MSGTYPE_PRIVATE, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []); $msg->send(true); } - if($item == 'None'){ + if ($item == 'None') { $db->update('general', [ - 'book'=>'None' + 'book' => 'None' ], '`no` IN %li', $genlist); - } - else{ + } else { $db->update('general', [ - 'book'=>$item + 'book' => $item ], '`no` IN %li', $genlist); } break; case "말지급": - if($item == 'None') { + if ($item == 'None') { $text = "말 회수!"; - } - else { - $text = getItemName($item)." 지급!"; + } else { + $text = getItemName($item) . " 지급!"; } - foreach($genlist as $generalID){ + foreach ($genlist as $generalID) { $msg = new Message(Message::MSGTYPE_PRIVATE, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []); $msg->send(true); } - if($item == 'None'){ + if ($item == 'None') { $db->update('general', [ - 'horse'=>'None' + 'horse' => 'None' ], '`no` IN %li', $genlist); - } - else{ + } else { $db->update('general', [ - 'horse'=>$item + 'horse' => $item ], '`no` IN %li', $genlist); } break; case "도구지급": - if($item == 'None') { + if ($item == 'None') { $text = "특수도구 회수!"; - } - else { - $text = getItemName($item)." 지급!"; + } else { + $text = getItemName($item) . " 지급!"; } - foreach($genlist as $generalID){ + foreach ($genlist as $generalID) { $msg = new Message(Message::MSGTYPE_PRIVATE, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []); $msg->send(true); } - if($item == 'None'){ + if ($item == 'None') { $db->update('general', [ - 'item'=>'None' + 'item' => 'None' ], '`no` IN %li', $genlist); - } - else{ + } else { $db->update('general', [ - 'item'=>$item + 'item' => $item ], '`no` IN %li AND item < %i', $genlist, $item); } break; case "하야입력": $db->update('general_turn', [ - 'action'=>'che_하야', - 'arg'=>'{}', - 'brief'=>'하야', + 'action' => 'che_하야', + 'arg' => '{}', + 'brief' => '하야', ], 'general_id IN %li AND turn_idx = 0', $genlist); break; case "방랑해산": $db->update('general_turn', [ - 'action'=>'che_방랑', - 'arg'=>'{}', - 'brief'=>'방랑', + 'action' => 'che_방랑', + 'arg' => '{}', + 'brief' => '방랑', ], 'general_id IN %li AND turn_idx = 0', $genlist); $db->update('general_turn', [ - 'action'=>'che_해산', - 'arg'=>'{}', - 'brief'=>'해산', + 'action' => 'che_해산', + 'arg' => '{}', + 'brief' => '해산', ], 'general_id IN %li AND turn_idx = 1', $genlist); break; case "00턴": $turnterm = $gameStor->turnterm; - foreach($genlist as $generalID){ + foreach ($genlist as $generalID) { $turntime = getRandTurn($turnterm); $cutTurn = cutTurn($turntime, $turnterm); $db->update('general', [ - 'turntime'=>$cutTurn + 'turntime' => $cutTurn ], '`no` IN %li', $genlist); } break; case "랜덤턴": - foreach($genlist as $generalID){ + foreach ($genlist as $generalID) { $turntime = getRandTurn($turnterm); $db->update('general', [ - 'turntime'=>$turntime + 'turntime' => $turntime ], '`no` IN %li', $genlist); } break; } -header('location:_admin2.php'); \ No newline at end of file +header('location:_admin2.php'); diff --git a/hwe/_admin4.php b/hwe/_admin4.php index aff41ebd..880b65fa 100644 --- a/hwe/_admin4.php +++ b/hwe/_admin4.php @@ -1,4 +1,5 @@ setReadOnly(); -if($session->userGrade < 5) { -?> - - - -관리메뉴 - - - - - - - -관리자가 아닙니다.
- - - -userGrade < 5) { + die(requireAdminPermissionHTML()); } $db = DB::db(); $gameStor = KVStorage::getStorage($db, 'game_env'); -$connect=$db->get(); +$connect = $db->get(); $conlimit = $gameStor->conlimit; ?> - -멀티관리 - - - - - - - - - -
멀 티 관 리
-
- - - - +
회원선택

NPC
NPC유저
접속제한
블럭회원
- + 멀티관리 + + + + + + + + + + + + +
멀 티 관 리
+ + + + + - - - - - - - - - - - -
회원선택

+ NPC
+ NPC유저
+ 접속제한
블럭회원 +
+ "; -foreach($db->query('SELECT no,name,npc,block,con from general where ip!=\'\' order by npc,ip') as $general){ - $style = "style=;"; - if($general['block'] > 0) { $style .= "background-color:red;"; } - if($general['npc'] >= 2) { $style .= "color:cyan;"; } - elseif($general['npc'] == 1) { $style .= "color:skyblue;"; } - if($general['con'] > $conlimit) { $style .= "color:red;"; } + foreach ($db->query('SELECT no,name,npc,block,con from general where ip!=\'\' order by npc,ip') as $general) { + $style = "style=;"; + if ($general['block'] > 0) { + $style .= "background-color:red;"; + } + if ($general['npc'] >= 2) { + $style .= "color:cyan;"; + } elseif ($general['npc'] == 1) { + $style .= "color:skyblue;"; + } + if ($general['con'] > $conlimit) { + $style .= "color:red;"; + } - echo " + echo " "; -} + } -echo " + echo " "; -?> - 블럭 -
- 1단계:발언권, 2단계:턴블럭 -
강제 사망
메세지 전달
- - - - - - - - -1"; -$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); -$ipCount = MYDB_num_rows($result); -$genName = ""; -$genDate = ""; -$genIP = ""; -$genID = ""; -for($i=0; $i < $ipCount; $i++) { - $ip = MYDB_fetch_array($result); + ?> + + + + + + + + + + + + +
장수명최근로그인IPID
블럭 +
+ 1단계:발언권, 2단계:턴블럭 +
강제 사망
메세지 전달
+ + + + + + + + + 1"; + $result = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), ""); + $ipCount = MYDB_num_rows($result); + $genName = ""; + $genDate = ""; + $genIP = ""; + $genID = ""; + for ($i = 0; $i < $ipCount; $i++) { + $ip = MYDB_fetch_array($result); - $query = "select name,ip,lastconnect,owner,block from general where ip like '{$ip['ip2']}%' and npc<2 order by ip"; - $genResult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $genCount = MYDB_num_rows($genResult); - for($k=0; $k < $genCount; $k++) { - $gen = MYDB_fetch_array($genResult); - if($gen['block'] > 0) $genName .= "{$gen['name']}
"; - else $genName .= $gen['name']."
"; - $genDate .= $gen['lastconnect']."
"; - $genIP .= $gen['ip']."
"; - $genID .= $gen['owner']."
"; - } - $genName .= "
"; - $genDate .= "
"; - $genIP .= "
"; - $genID .= "
"; -} -echo " + $query = "select name,ip,lastconnect,owner,block from general where ip like '{$ip['ip2']}%' and npc<2 order by ip"; + $genResult = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), ""); + $genCount = MYDB_num_rows($genResult); + for ($k = 0; $k < $genCount; $k++) { + $gen = MYDB_fetch_array($genResult); + if ($gen['block'] > 0) $genName .= "{$gen['name']}
"; + else $genName .= $gen['name'] . "
"; + $genDate .= $gen['lastconnect'] . "
"; + $genIP .= $gen['ip'] . "
"; + $genID .= $gen['owner'] . "
"; + } + $genName .= "
"; + $genDate .= "
"; + $genIP .= "
"; + $genID .= "
"; + } + echo " "; -?> - -
장수명최근로그인IPID
$genName $genDate $genIP $genID
- - - - - -
+ ?> +
+ + + + + + + + + +
- + + \ No newline at end of file diff --git a/hwe/_admin4_submit.php b/hwe/_admin4_submit.php index 4dd2468b..beaceed1 100644 --- a/hwe/_admin4_submit.php +++ b/hwe/_admin4_submit.php @@ -1,4 +1,5 @@ setReadOnly(); -if($session->userGrade < 5) { +if ($session->userGrade < 5) { header('location:_admin4.php'); die(); } $btn = Util::getReq('btn'); $genlist = Util::getReq('genlist', 'array_int'); -$msg = Util::getReq('msg','string', '메시지'); +$msg = Util::getReq('msg', 'string', '메시지'); $db = DB::db(); //NOTE: 왜 기능이 admin2와 admin4가 같이 있는가? //NOTE: 왜 블럭 시 admin4에선 금쌀을 없애지 않는가? -switch($btn) { +switch ($btn) { case "블럭 해제": DB::db()->query('update general set block=0 where no IN %li', $genlist); break; case "1단계 블럭": $date = TimeUtil::now(); $db = DB::db(); - $db->query('update general set block=1,killturn=24 where no IN %li',$genlist); + $db->query('update general set block=1,killturn=24 where no IN %li', $genlist); //FIXME: subquery로 하는게 더 빠를 듯. $uid = $db->queryFirstColumn('select owner from general where no IN %li', $genlist); RootDB::db()->query('update member set block_num=block_num+1,block_date=%s where id IN %ls', $date, $uid); @@ -34,36 +35,36 @@ switch($btn) { case "2단계 블럭": $date = TimeUtil::now(); $db = DB::db(); - $db->query('update general set block=2,killturn=24 where no IN %li',$genlist); + $db->query('update general set block=2,killturn=24 where no IN %li', $genlist); $uid = $db->queryFirstColumn('select owner from general where no IN %li', $genlist); RootDB::db()->query('update member set block_num=block_num+1,block_date=%s where id IN %ls', $date, $uid); break; case "3단계 블럭": $date = TimeUtil::now(); $db = DB::db(); - $db->query('update general set block=3,killturn=24 where no IN %li',$genlist); + $db->query('update general set block=3,killturn=24 where no IN %li', $genlist); $uid = $db->queryFirstColumn('select owner from general where no IN %li', $genlist); RootDB::db()->query('update member set block_num=block_num+1,block_date=%s where id IN %ls', $date, $uid); break; case "무한삭턴": - DB::db()->query('update general set killturn=8000 where no IN %li',$genlist); + DB::db()->query('update general set killturn=8000 where no IN %li', $genlist); break; case "강제 사망": $date = TimeUtil::now(true); $db->update('general', [ - 'killturn'=>0, - 'turntime'=>$date, + 'killturn' => 0, + 'turntime' => $date, ], '`no` IN %li', $genlist); $db->update('general_turn', [ - 'action'=>'휴식', - 'arg'=>'{}', - 'brief'=>'휴식' + 'action' => '휴식', + 'arg' => '{}', + 'brief' => '휴식' ], 'general_id IN %li AND turn_idx = 0', $genlist); break; case "메세지 전달": $date = TimeUtil::now(); $src = MessageTarget::buildQuick($session->generalID); - for($i=0; $i < count($genlist); $i++) { + for ($i = 0; $i < count($genlist); $i++) { $msgObj = new Message( Message::MSGTYPE_PRIVATE, $src, @@ -73,7 +74,7 @@ switch($btn) { new \DateTime('9999-12-31'), [] ); - if($msgObj){ + if ($msgObj) { $msgObj->send(true); } } @@ -81,4 +82,3 @@ switch($btn) { } header('location:_admin4.php'); - diff --git a/hwe/_admin5.php b/hwe/_admin5.php index c4b7d983..c1a9a812 100644 --- a/hwe/_admin5.php +++ b/hwe/_admin5.php @@ -1,4 +1,5 @@ 17){ +if ($type < 0 || $type > 17) { $type = 0; } -if($type2 < 0 || $type2 > 6){ +if ($type2 < 0 || $type2 > 6) { $type2 = 0; } //로그인 검사 $session = Session::requireGameLogin()->setReadOnly(); -if($session->userGrade < 5) { -?> - - - -관리메뉴 - - - - - - - -관리자가 아닙니다.
- - - -userGrade < 5) { + die(requireAdminPermissionHTML()); } $db = DB::db(); -$connect=$db->get(); +$connect = $db->get(); $sel = []; $sel2 = []; @@ -49,105 +33,111 @@ $sel2[$type2] = "selected"; ?> + -일제정보 - - - - - + 일제정보 + + + + + + - - - + + + + -
일 제 정 보
-
정렬순서 : - - - -
-
-
일 제 정 보
+ 정렬순서 : + + + + +
+ - -
-
+ } + ?> + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + @@ -245,77 +271,112 @@ for($i=0; $i < $nationCount; $i++) { - + - + "; -} + } -?> -
국명접률단접국력장수속령기술전략국고병량평금평쌀평통평무평지평Lv보숙궁숙기숙귀숙차숙총병인구인구율농업상업치안성벽수비국명
국명접률단접국력장수속령기술전략국고병량평금평쌀평통평무평지평Lv보숙궁숙기숙귀숙차숙총병인구인구율농업상업치안성벽수비국명
{$nation['name']}{$nation['name']}  {$nation['connect']}   {$nation['con']}   {$nation['power']}   {$gen['cnt']}   {$city['cnt']}  ".sprintf('%.1f',$nation['tech'])."  " . sprintf('%.1f', $nation['tech']) . "   {$nation['strategic_cmd_limit']}   {$nation['gold']}   {$nation['rice']}  {$nation['dex5']}   {$gen['crew']}/{$gen['leadership']}00   {$city['pop']}/{$city['pop_max']}  ".sprintf('%.1f',$city['pop']/Util::valueFit($city['pop_max'],1)*100)."%  " . sprintf('%.1f', $city['pop'] / Util::valueFit($city['pop_max'], 1) * 100) . "%   {$city['agri']}%   {$city['comm']}%   {$city['secu']}%   {$city['wall']}%   {$city['def']}% {$nation['name']}{$nation['name']}
- - -
+ ?> + + + + + +
- - - - - - -국력(국력,장수수,도시수,인구/100,최대인구/100,국가자원/100,장수자원/100,능력치,숙련/1000,경험공헌/100)"; break; -case 1: echo ""; break; -case 2: echo ""; break; -case 3: echo ""; break; -case 4: echo ""; break; -case 5: echo ""; break; -case 6: echo ""; break; -} -?> - - + + + + + + 국력(국력,장수수,도시수,인구/100,최대인구/100,국가자원/100,장수자원/100,능력치,숙련/1000,경험공헌/100)"; + break; + case 1: + echo ""; + break; + case 2: + echo ""; + break; + case 3: + echo ""; + break; + case 4: + echo ""; + break; + case 5: + echo ""; + break; + case 6: + echo ""; + break; + } + ?> + + "; - switch($type2) { - default: - case 0: echo ""; break; - case 1: echo ""; break; - case 2: echo ""; break; - case 3: echo ""; break; - case 4: echo ""; break; - case 5: echo ""; break; - case 6: echo ""; break; - } - - echo " + switch ($type2) { + default: + case 0: + echo ""; + break; + case 1: + echo ""; + break; + case 2: + echo ""; + break; + case 3: + echo ""; + break; + case 4: + echo ""; + break; + case 5: + echo ""; + break; + case 6: + echo ""; + break; + } + + echo " "; -} -?> -
국가수장수수국가별성향국가성향장수성격장수특기병종수기타
국가수장수수국가별성향국가성향장수성격장수특기병종수기타
{$stat['year']} {$stat['month']} {$stat['nation_count']} {$stat['gen_count']}{$stat['power_hist']}{$stat['nation_name']}{$stat['nation_hist']}{$stat['personal_hist']}{$stat['special_hist']}{$stat['crewtype']}{$stat['etc']}{$stat['power_hist']}{$stat['nation_name']}{$stat['nation_hist']}{$stat['personal_hist']}{$stat['special_hist']}{$stat['crewtype']}{$stat['etc']}
+ } + ?> + - - - -
+ + + + + + + +
- + + \ No newline at end of file diff --git a/hwe/_admin5_submit.php b/hwe/_admin5_submit.php index 1504c99d..7371c7e8 100644 --- a/hwe/_admin5_submit.php +++ b/hwe/_admin5_submit.php @@ -1,4 +1,5 @@ setReadOnly(); $userID = Session::getUserID(); -if($session->userGrade < 5) { +if ($session->userGrade < 5) { header('location:_admin5.php'); die(); } $db = DB::db(); -switch($btn) { +switch ($btn) { case "국가변경": $oldNation = $db->queryFirstField('SELECT nation FROM general WHERE owner=%i', $userID); - if($nation == 0) { + if ($nation == 0) { $db->update('general', [ - 'nation'=>0, - 'officer_level'=>0, - 'officer_city'=>0 + 'nation' => 0, + 'officer_level' => 0, + 'officer_city' => 0 ], 'owner=%i', $userID); } else { $db->update('general', [ - 'nation'=>$nation, - 'officer_level'=>1, - 'officer_city'=>0 + 'nation' => $nation, + 'officer_level' => 1, + 'officer_city' => 0 ], 'owner=%i', $userID); $db->update('nation', [ - 'gennum'=>$db->sqleval('gennum + 1') + 'gennum' => $db->sqleval('gennum + 1') ], 'nation=%i', $oldNation); } - if($oldNation != 0){ + if ($oldNation != 0) { $db->update('nation', [ - 'gennum'=>$db->sqleval('gennum - 1') + 'gennum' => $db->sqleval('gennum - 1') ], 'nation=%i', $oldNation); } break; } header('location:_admin5.php'); - - diff --git a/hwe/_admin6.php b/hwe/_admin6.php index 9228732d..52c9889d 100644 --- a/hwe/_admin6.php +++ b/hwe/_admin6.php @@ -1,110 +1,116 @@ 4){ +if ($type < 0 || $type > 4) { $type = 0; } //로그인 검사 $session = Session::requireGameLogin()->setReadOnly(); -if($session->userGrade < 5) { -?> - - - -관리메뉴 - - - - - - - -관리자가 아닙니다.
- - - -userGrade < 5) { + die(requireAdminPermissionHTML()); } $db = DB::db(); -$connect=$db->get(); +$connect = $db->get(); $sel[$type] = "selected"; ?> - -접속정보 - - - - - - - - - - -
접 속 정 보
정렬순서 : - -
-
- - - - - - - - - - - - + 접속정보 + + + + + + + + +
장수명접속률시작연령연령총갱신갱신/턴총로그인갱신/로그인
+ + + + + + +
접 속 정 보
+
정렬순서 : + +
+
+ + + + + + + + + + + + - - + + - + "; -} + } -?> -
장수명접속률시작연령연령총갱신갱신/턴총로그인갱신/로그인
{$gen['name']} {$gen['connect']} {$gen['startage']} {$gen['age']}".round($gen['refcnt']/2, 1)."".round($gen['ref']/2,1)."" . round($gen['refcnt'] / 2, 1) . "" . round($gen['ref'] / 2, 1) . " {$gen['logcnt']}".round($gen['log']/2,1)."" . round($gen['log'] / 2, 1) . "
- - - -
+ ?> + + + + + + + + +
- + + \ No newline at end of file diff --git a/hwe/_admin7.php b/hwe/_admin7.php index c2f679ed..b4aaa2c8 100644 --- a/hwe/_admin7.php +++ b/hwe/_admin7.php @@ -1,4 +1,5 @@ None, 1=>AdditionalColumn, 2=>rankVal, 3=>aux), $comp $queryMap = [ - 'turntime' => ['최근턴', 0, function($lhs, $rhs){ - return -($lhs['turntime']<=>$rhs['turntime']); + 'turntime' => ['최근턴', 0, function ($lhs, $rhs) { + return - ($lhs['turntime'] <=> $rhs['turntime']); }], - 'recent_war' => ['최근전투', 1, function($lhs, $rhs){ - return -($lhs['recent_war']<=>$rhs['recent_war']); + 'recent_war' => ['최근전투', 1, function ($lhs, $rhs) { + return - ($lhs['recent_war'] <=> $rhs['recent_war']); }], - 'name' => ['장수명', 0, function($lhs, $rhs){ - if($lhs['npc'] !== $rhs['npc']){ - return $lhs['npc']<=>$rhs['npc']; + 'name' => ['장수명', 0, function ($lhs, $rhs) { + if ($lhs['npc'] !== $rhs['npc']) { + return $lhs['npc'] <=> $rhs['npc']; } - return $lhs['name']<=>$rhs['name']; + return $lhs['name'] <=> $rhs['name']; }], - 'warnum' => ['전투수', 2, function($lhs, $rhs){ - return -($lhs['warnum']<=>$rhs['warnum']); + 'warnum' => ['전투수', 2, function ($lhs, $rhs) { + return - ($lhs['warnum'] <=> $rhs['warnum']); }] ]; -if($reqQueryType === null || !key_exists($reqQueryType, $queryMap)){ +if ($reqQueryType === null || !key_exists($reqQueryType, $queryMap)) { $reqQueryType = Util::array_first_key($queryMap); } //로그인 검사 $session = Session::requireGameLogin()->setReadOnly(); -if($session->userGrade < 5) { -?> - - - -관리메뉴 - - - - - - - -관리자가 아닙니다.
- - - -userGrade < 5) { + die(requireAdminPermissionHTML()); } $db = DB::db(); -if($btn == '정렬하기') { +if ($btn == '정렬하기') { $gen = 0; } [$queryTypeText, $reqArgType, $comp] = $queryMap[$reqQueryType]; -if($reqArgType===0){ +if ($reqArgType === 0) { $generalBasicList = $db->query('SELECT no, name, nation, npc, turntime FROM general'); -} -else if($reqArgType===1){ +} else if ($reqArgType === 1) { $generalBasicList = $db->query('SELECT no, name, nation, npc, turntime, %b FROM general', $reqQueryType); -} -else if($reqArgType===2){ - $generalBasicList = $db->query('SELECT no, name, nation, npc, turntime, value as %b +} else if ($reqArgType === 2) { + $generalBasicList = $db->query( + 'SELECT no, name, nation, npc, turntime, value as %b FROM general LEFT JOIN rank_data ON general.no = rank_data.general_id - WHERE rank_data.type = %s', - $reqQueryType, $reqQueryType + WHERE rank_data.type = %s', + $reqQueryType, + $reqQueryType ); -} -else if($reqArgType===3){ - $generalBasicList = array_map(function($arr){ +} else if ($reqArgType === 3) { + $generalBasicList = array_map(function ($arr) { $arr['aux'] = Json::decode($arr['aux']); return $arr; }, $db->query('SELECT no, name, nation, npc, turntime, aux FROM general')); -} -else{ +} else { throw new \sammo\MustNotBeReachedException(); } usort($generalBasicList, $comp); -if(!$gen){ +if (!$gen) { $gen = $generalBasicList[0]['no']; } @@ -97,76 +79,100 @@ $generalObj = General::createGeneralObjFromDB($gen); ?> + -로그정보 - - - - - + 로그정보 + + + + + + - - - -
로 그 정 보
-
- 정렬순서 : - - - 대상장수 : - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - -
장 수 정 보-
- -   -
개인 기록전투 기록
- - - -
장수 열전전투 결과
- - - -
- - - -
+ + + + + + + +
로 그 정 보
+
+ 정렬순서 : + + + 대상장수 : + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ 장 수 정 보 + + - +
+ +   +
+ 개인 기록 + + 전투 기록 +
+ + + +
+ 장수 열전 + + 전투 결과 +
+ + + +
+ + + + + + + +
- + + \ No newline at end of file diff --git a/hwe/_admin8.php b/hwe/_admin8.php index 67aa0768..c1bb570d 100644 --- a/hwe/_admin8.php +++ b/hwe/_admin8.php @@ -12,24 +12,7 @@ $type = 0; $session = Session::requireGameLogin()->setReadOnly(); if ($session->userGrade < 5) { -?> - - - -관리메뉴 - - - - - - - -관리자가 아닙니다.
- - - -setReadOnly(); -if($session->userGrade < 5) { +if ($session->userGrade < 5) { die('권한 부족'); } $db = DB::db(); $gameStor = KVStorage::getStorage($db, 'game_env'); -if(!$gameStor->isunited){ +if (!$gameStor->isunited) { die('아직 천통하지 않았습니다'); } -foreach($db->queryFirstColumn( +foreach ($db->queryFirstColumn( 'SELECT no FROM general WHERE npc != 0 and age >= %i', GameConst::$retirementYear -) as $generalNo){ +) as $generalNo) { CheckHall($generalNo); -} \ No newline at end of file +} diff --git a/hwe/b_processing.php b/hwe/b_processing.php index edb86c5e..27ee250e 100644 --- a/hwe/b_processing.php +++ b/hwe/b_processing.php @@ -9,7 +9,8 @@ $commandType = Util::getReq('command', 'string'); $turnList = array_map('intval', explode('_', Util::getReq('turnList', 'string', '0'))); $isChiefTurn = Util::getReq('is_chief', 'bool', false); -function die_redirect(){ +function die_redirect() +{ global $isChiefTurn; if(!$isChiefTurn){ header('location:index.php', true, 303); @@ -59,9 +60,9 @@ if($commandObj->isArgValid()){ die_redirect(); } -/*if(!$commandObj->isReservable()){ +if(!$commandObj->hasPermissionToReserve()){ die_redirect(); -}*/ +} $jsList = $commandObj->getJSFiles(); $cssList = $commandObj->getCSSFiles(); diff --git a/hwe/func.php b/hwe/func.php index 3c021f42..58bf2ba8 100644 --- a/hwe/func.php +++ b/hwe/func.php @@ -75,14 +75,16 @@ function getNationStaticInfo($nationID, $forceRefresh=false) /** * getNationStaticInfo() 함수의 국가 캐시를 초기화 */ -function refreshNationStaticInfo(){ +function refreshNationStaticInfo() +{ getNationStaticInfo(null, true); } /** * getNationStaticInfo(-1) 의 단축형 */ -function getAllNationStaticInfo(){ +function getAllNationStaticInfo() +{ return getNationStaticInfo(-1); } @@ -447,10 +449,10 @@ function printCommandTable(General $generalObj) { } ?> +>getCommandDetailTitle()?>hasMinConditionMet()?'':'(불가)'?> +>getCommandDetailTitle()?>hasMinConditionMet()?'':'(불가)'?> isReservable()){ + if(!$commandObj->hasPermissionToReserve()){ return [ 'result'=>false, - 'reason'=>'예약 불가능한 커맨드 :'.$commandObj->testReservable(), - 'test'=>'isReservable', + 'reason'=>'예약 불가능한 커맨드 :'.$commandObj->testPermissionToReserve(), + 'test'=>'hasPermissionToReserve', 'target'=>'command' ]; } @@ -408,18 +408,14 @@ function setNationCommand(int $generalID, array $turnList, string $command, ?arr ]; } - if(!$commandObj->isReservable()){ + if(!$commandObj->hasPermissionToReserve()){ return [ 'result'=>false, - 'reason'=>'예약 불가능한 커맨드 :'.$commandObj->testReservable(), - 'test'=>'isReservable', + 'reason'=>'예약 불가능한 커맨드 :'.$commandObj->testPermissionToReserve(), + 'test'=>'hasPermissionToReserve', 'target'=>'command' ]; } - //TODO: Reservable은 '정말로 입력 불가'이고, '입력은 가능하지만 실행은 안될 것 같은' 군을 하나더 추가해야함 - // Runnable은 Arg를 모두 받아서 처리해야 하는 것이고, Arg를 받지 않아도 안될 것 같지만 입력 자체는 가능할 것 같은 커맨드. - - $brief = $commandObj->getBrief(); _setNationCommand($commandObj, $turnList); return [ diff --git a/hwe/func_gamerule.php b/hwe/func_gamerule.php index 2b5b8df9..5598bf6f 100644 --- a/hwe/func_gamerule.php +++ b/hwe/func_gamerule.php @@ -497,7 +497,7 @@ function checkWander() { foreach(General::createGeneralObjListFromDB($wanderers) as $wanderer){ $wanderCmd = buildGeneralCommandClass('che_해산', $wanderer, $admin); - if($wanderCmd->isRunnable()){ + if($wanderCmd->hasFullConditionMet()){ $logger = $wanderer->getLogger(); $logger->pushGeneralActionLog('초반 제한후 방랑군은 자동 해산됩니다.', ActionLogger::PLAIN); $wanderCmd->run(); diff --git a/hwe/func_message.php b/hwe/func_message.php index 40e28b4a..8a955aed 100644 --- a/hwe/func_message.php +++ b/hwe/func_message.php @@ -1,7 +1,8 @@ + + -function turnTable() { + + 관리메뉴 + + + + + + + + + 관리자가 아닙니다.
+ + + + +1턴"; - foreach(Util::range(1, GameConst::$maxTurn) as $turnIdx){ + foreach (Util::range(1, GameConst::$maxTurn) as $turnIdx) { $turnText = $turnIdx + 1; $turnList[] = ""; } @@ -32,81 +63,86 @@ function turnTable() { "; } -function chiefTurnTable() { -$turnList = []; -$turnList[] = ""; -foreach(Util::range(1, GameConst::$maxChiefTurn) as $turnIdx){ - $turnText = $turnIdx + 1; - $turnList[] = ""; -} +function chiefTurnTable() +{ + $turnList = []; + $turnList[] = ""; + foreach (Util::range(1, GameConst::$maxChiefTurn) as $turnIdx) { + $turnText = $turnIdx + 1; + $turnList[] = ""; + } -$turnText = join("\n", $turnList); + $turnText = join("\n", $turnList); -return " + return " "; } -function displayiActionObjInfo(?iAction $action){ - if($action === null){ +function displayiActionObjInfo(?iAction $action) +{ + if ($action === null) { $info = ''; $text = '-'; - } - else{ + } else { $info = $action->getInfo(); $text = $action->getName(); } - $templates = new \League\Plates\Engine(__DIR__.'/templates'); + $templates = new \League\Plates\Engine(__DIR__ . '/templates'); return $templates->render('tooltip', [ - 'text'=>$text, - 'info'=>$info, + 'text' => $text, + 'info' => $info, ]); } -function displayCharInfo(string $type):string{ +function displayCharInfo(string $type): string +{ $class = buildPersonalityClass($type); $info = $class->getInfo(); $text = $class->getName(); - $templates = new \League\Plates\Engine(__DIR__.'/templates'); + $templates = new \League\Plates\Engine(__DIR__ . '/templates'); return $templates->render('tooltip', [ - 'text'=>$text, - 'info'=>$info, + 'text' => $text, + 'info' => $info, ]); } -function displaySpecialWarInfo(?string $type):string{ +function displaySpecialWarInfo(?string $type): string +{ $class = buildGeneralSpecialWarClass($type); $info = $class->getInfo(); $name = $class->getName(); - $templates = new \League\Plates\Engine(__DIR__.'/templates'); + $templates = new \League\Plates\Engine(__DIR__ . '/templates'); return $templates->render('tooltip', [ - 'text'=>$name, - 'info'=>$info, + 'text' => $name, + 'info' => $info, ]); } -function displaySpecialDomesticInfo(?string $type):string{ +function displaySpecialDomesticInfo(?string $type): string +{ $class = buildGeneralSpecialDomesticClass($type); $info = $class->getInfo(); $name = $class->getName(); - $templates = new \League\Plates\Engine(__DIR__.'/templates'); + $templates = new \League\Plates\Engine(__DIR__ . '/templates'); return $templates->render('tooltip', [ - 'text'=>$name, - 'info'=>$info, + 'text' => $name, + 'info' => $info, ]); } -function allButton(bool $seizeNPCMode) { - if($seizeNPCMode) { +function allButton(bool $seizeNPCMode) +{ + if ($seizeNPCMode) { $site = "a_npcList.php"; $call = "빙의일람"; } else { @@ -114,13 +150,12 @@ function allButton(bool $seizeNPCMode) { $call = "설문조사"; } - if(\file_exists(__DIR__."/d_setting/templates/allButton.php")){ - $templates = new \League\Plates\Engine(__DIR__.'/d_setting/templates'); + if (\file_exists(__DIR__ . "/d_setting/templates/allButton.php")) { + $templates = new \League\Plates\Engine(__DIR__ . '/d_setting/templates'); + } else { + $templates = new \League\Plates\Engine(__DIR__ . '/templates'); } - else{ - $templates = new \League\Plates\Engine(__DIR__.'/templates'); - } - + return $templates->render('allButton', [ 'call' => $call, @@ -129,104 +164,107 @@ function allButton(bool $seizeNPCMode) { } -function commandButton() { +function commandButton() +{ $session = Session::getInstance(); $userID = Session::getUserID(); - if(!$session->isGameLoggedIn()){ + if (!$session->isGameLoggedIn()) { return ''; } - + $db = DB::db(); $me = $db->queryFirstRow("select no,nation,officer_level,belong,permission,penalty from general where owner=%i", $userID); - $nation = $db->queryFirstRow("select nation,level,color,secretlimit from nation where nation=%i",$me['nation'])??[ - 'nation'=>0, - 'level'=>0, - 'secretlimit'=>99, - 'color'=>'#000000' + $nation = $db->queryFirstRow("select nation,level,color,secretlimit from nation where nation=%i", $me['nation']) ?? [ + 'nation' => 0, + 'level' => 0, + 'secretlimit' => 99, + 'color' => '#000000' ]; - $bgColor = Util::array_get($nation['color'])?:'#000000'; + $bgColor = Util::array_get($nation['color']) ?: '#000000'; $fgColor = newColor($bgColor); - $templates = new \League\Plates\Engine(__DIR__.'/templates'); + $templates = new \League\Plates\Engine(__DIR__ . '/templates'); $showSecret = false; $permission = checkSecretPermission($me); - if($permission >= 1){ + if ($permission >= 1) { $showSecret = true; - } - else if($me['officer_level']== 0){ + } else if ($me['officer_level'] == 0) { $showSecret = false; } - + return $templates->render('commandButton', [ - 'bgColor'=>$bgColor, - 'fgColor'=>$fgColor, - 'meLevel'=>$me['officer_level'], - 'nationLevel'=>$nation['level'], - 'showSecret'=>$showSecret, - 'permission'=>$permission, + 'bgColor' => $bgColor, + 'fgColor' => $fgColor, + 'meLevel' => $me['officer_level'], + 'nationLevel' => $nation['level'], + 'showSecret' => $showSecret, + 'permission' => $permission, ]); } -function formatWounded(int $value, int $wound): string{ - if($wound == 0){ +function formatWounded(int $value, int $wound): string +{ + if ($wound == 0) { return "$value"; } $woundedValue = intdiv($value * (100 - $wound), 100); return "$woundedValue"; } -function formatDefenceTrain(int $value): string{ - if($value === 999){ +function formatDefenceTrain(int $value): string +{ + if ($value === 999) { return "×"; - } - else if($value >= 80){ + } else if ($value >= 80) { return "◎"; - } - else{ + } else { return "○"; } } -function formatLeadershipBonus(int $value): string{ - if($value == 0){ +function formatLeadershipBonus(int $value): string +{ + if ($value == 0) { return ''; } return "+{$value}"; } -function formatName(string $name, int $npc): string{ - if($npc==1){ +function formatName(string $name, int $npc): string +{ + if ($npc == 1) { $name = "$name"; - } - else if($npc>1){ + } else if ($npc > 1) { $name = "$name"; } return $name; } -function getMapHtml(?string $mapTheme=null){ - $templates = new \League\Plates\Engine(__DIR__.'/templates'); +function getMapHtml(?string $mapTheme = null) +{ + $templates = new \League\Plates\Engine(__DIR__ . '/templates'); - if($mapTheme === null){ + if ($mapTheme === null) { $db = DB::db(); $gameStor = KVStorage::getStorage($db, 'game_env'); - $mapTheme = $gameStor->map_theme??'che'; + $mapTheme = $gameStor->map_theme ?? 'che'; } return $templates->render('map', [ - 'mapTheme'=>$mapTheme + 'mapTheme' => $mapTheme ]); } -function getInvitationList(array $nationList){ - $templates = new \League\Plates\Engine(__DIR__.'/templates'); +function getInvitationList(array $nationList) +{ + $templates = new \League\Plates\Engine(__DIR__ . '/templates'); - foreach($nationList as &$nation){ + foreach ($nationList as &$nation) { $nation['textColor'] = newColor($nation['color']); } return $templates->render('invitationList', [ - 'nationList'=>$nationList + 'nationList' => $nationList ]); -} \ No newline at end of file +} diff --git a/hwe/sammo/ActionLogger.php b/hwe/sammo/ActionLogger.php index 3ab44a72..e646f9b7 100644 --- a/hwe/sammo/ActionLogger.php +++ b/hwe/sammo/ActionLogger.php @@ -2,7 +2,8 @@ namespace sammo; -class ActionLogger{ +class ActionLogger +{ //TODO: global을 따로 뗴어내고, 장수 Logger를 상속해서 받는 형식으로. protected $generalID; protected $nationID; @@ -10,7 +11,7 @@ class ActionLogger{ protected $year = null; protected $month = null; - + protected $generalHistoryLog = []; protected $generalActionLog = []; protected $generalBattleResultLog = []; @@ -37,7 +38,8 @@ class ActionLogger{ /** ★{$year}년 {$month}월: */ const NOTICE_YEAR_MONTH = 8; - public function __construct(int $generalID, int $nationID, int $year, int $month, bool $autoFlush = true){ + public function __construct(int $generalID, int $nationID, int $year, int $month, bool $autoFlush = true) + { $this->generalID = $generalID; $this->nationID = $nationID; $this->year = $year; @@ -45,23 +47,25 @@ class ActionLogger{ $this->autoFlush = $autoFlush; } - public function __destruct(){ - if($this->autoFlush){ + public function __destruct() + { + if ($this->autoFlush) { $this->flush(); } } - public function rollback(){ + public function rollback() + { $backup = [ - 'generalHistoryLog'=>$this->generalHistoryLog, - 'generalActionLog'=>$this->generalActionLog, - 'generalBattleResultLog'=>$this->generalBattleResultLog, - 'generalBattleDetailLog'=>$this->generalBattleDetailLog, - 'nationalHistoryLog'=>$this->nationalHistoryLog, - 'globalHistoryLog'=>$this->globalHistoryLog, - 'globalActionLog'=>$this->globalActionLog, + 'generalHistoryLog' => $this->generalHistoryLog, + 'generalActionLog' => $this->generalActionLog, + 'generalBattleResultLog' => $this->generalBattleResultLog, + 'generalBattleDetailLog' => $this->generalBattleDetailLog, + 'nationalHistoryLog' => $this->nationalHistoryLog, + 'globalHistoryLog' => $this->globalHistoryLog, + 'globalActionLog' => $this->globalActionLog, ]; - + $this->generalHistoryLog = []; $this->generalActionLog = []; $this->generalBattleResultLog = []; @@ -73,50 +77,52 @@ class ActionLogger{ return $backup; } - public function flush(){ - if($this->generalHistoryLog && $this->generalID){ + public function flush() + { + if ($this->generalHistoryLog && $this->generalID) { pushGeneralHistory($this->generalID, $this->generalHistoryLog, $this->year, $this->month); $this->generalHistoryLog = []; } - if($this->generalActionLog && $this->generalID){ + if ($this->generalActionLog && $this->generalID) { pushGenLog($this->generalID, $this->generalActionLog, $this->year, $this->month); $this->generalActionLog = []; } - if($this->generalBattleResultLog && $this->generalID){ + if ($this->generalBattleResultLog && $this->generalID) { pushBatRes($this->generalID, $this->generalBattleResultLog, $this->year, $this->month); $this->generalBattleResultLog = []; } - if($this->generalBattleDetailLog && $this->generalID){ + if ($this->generalBattleDetailLog && $this->generalID) { pushBatLog($this->generalID, $this->generalBattleDetailLog, $this->year, $this->month); $this->generalBattleDetailLog = []; } - if($this->nationID && $this->nationalHistoryLog){ + if ($this->nationID && $this->nationalHistoryLog) { pushNationHistory($this->nationID, $this->nationalHistoryLog, $this->year, $this->month); $this->nationalHistoryLog = []; } - if($this->globalHistoryLog){ + if ($this->globalHistoryLog) { pushWorldHistory($this->globalHistoryLog, $this->year, $this->month); $this->globalHistoryLog = []; } - if($this->globalActionLog){ + if ($this->globalActionLog) { pushGeneralPublicRecord($this->globalActionLog, $this->year, $this->month); $this->globalActionLog = []; } } - public function pushGeneralHistoryLog($text, int $formatType = self::YEAR_MONTH){ - if(!$text){ + public function pushGeneralHistoryLog($text, int $formatType = self::YEAR_MONTH) + { + if (!$text) { return; } - if(is_array($text)){ - foreach($text as $textItem){ + if (is_array($text)) { + foreach ($text as $textItem) { $this->pushGeneralHistoryLog($textItem); } return; @@ -126,12 +132,13 @@ class ActionLogger{ $this->generalHistoryLog[] = $text; } - public function pushGeneralActionLog($text, int $formatType = self::MONTH){ - if(!$text){ + public function pushGeneralActionLog($text, int $formatType = self::MONTH) + { + if (!$text) { return; } - if(is_array($text)){ - foreach($text as $textItem){ + if (is_array($text)) { + foreach ($text as $textItem) { $this->pushGeneralActionLog($textItem); } return; @@ -141,12 +148,13 @@ class ActionLogger{ $this->generalActionLog[] = $text; } - public function pushGeneralBattleResultLog($text, int $formatType = self::RAWTEXT){ - if(!$text){ + public function pushGeneralBattleResultLog($text, int $formatType = self::RAWTEXT) + { + if (!$text) { return; } - if(is_array($text)){ - foreach($text as $textItem){ + if (is_array($text)) { + foreach ($text as $textItem) { $this->pushGeneralBattleResultLog($textItem); } return; @@ -156,12 +164,13 @@ class ActionLogger{ $this->generalBattleResultLog[] = $text; } - public function pushGeneralBattleDetailLog($text, int $formatType = self::PLAIN){ - if(!$text){ + public function pushGeneralBattleDetailLog($text, int $formatType = self::PLAIN) + { + if (!$text) { return; } - if(is_array($text)){ - foreach($text as $textItem){ + if (is_array($text)) { + foreach ($text as $textItem) { $this->pushGeneralBattleDetailLog($textItem); } return; @@ -171,12 +180,13 @@ class ActionLogger{ $this->generalBattleDetailLog[] = $text; } - public function pushNationalHistoryLog($text, int $formatType = self::YEAR_MONTH){ - if(!$text){ + public function pushNationalHistoryLog($text, int $formatType = self::YEAR_MONTH) + { + if (!$text) { return; } - if(is_array($text)){ - foreach($text as $textItem){ + if (is_array($text)) { + foreach ($text as $textItem) { $this->pushNationalHistoryLog($textItem); } return; @@ -186,12 +196,13 @@ class ActionLogger{ $this->nationalHistoryLog[] = $text; } - public function pushGlobalActionLog($text, int $formatType = self::MONTH){ - if(!$text){ + public function pushGlobalActionLog($text, int $formatType = self::MONTH) + { + if (!$text) { return; } - if(is_array($text)){ - foreach($text as $textItem){ + if (is_array($text)) { + foreach ($text as $textItem) { $this->pushGlobalActionLog($textItem); } return; @@ -201,12 +212,13 @@ class ActionLogger{ $this->globalActionLog[] = $text; } - public function pushGlobalHistoryLog($text, int $formatType = self::YEAR_MONTH){ - if(!$text){ + public function pushGlobalHistoryLog($text, int $formatType = self::YEAR_MONTH) + { + if (!$text) { return; } - if(is_array($text)){ - foreach($text as $textItem){ + if (is_array($text)) { + foreach ($text as $textItem) { $this->pushGlobalHistoryLog($textItem); } return; @@ -216,55 +228,56 @@ class ActionLogger{ $this->globalHistoryLog[] = $text; } - public function formatText(string $text, int $formatType):string{ - if($formatType === self::RAWTEXT){ + public function formatText(string $text, int $formatType): string + { + if ($formatType === self::RAWTEXT) { return $text; } - if($formatType === self::PLAIN){ + if ($formatType === self::PLAIN) { return "●{$text}"; } - if($formatType === self::YEAR_MONTH){ + if ($formatType === self::YEAR_MONTH) { return "●{$this->year}년 {$this->month}월:{$text}"; } - if($formatType === self::YEAR){ + if ($formatType === self::YEAR) { return "●{$this->year}년:{$text}"; } - if($formatType === self::MONTH){ + if ($formatType === self::MONTH) { return "●{$this->month}월:{$text}"; } - if($formatType === self::EVENT_PLAIN){ + if ($formatType === self::EVENT_PLAIN) { return "◆{$text}"; } - if($formatType === self::EVENT_YEAR_MONTH){ + if ($formatType === self::EVENT_YEAR_MONTH) { return "◆{$this->year}년 {$this->month}월:{$text}"; } - if($formatType === self::NOTICE){ + if ($formatType === self::NOTICE) { return "★{$text}"; } - if($formatType === self::NOTICE_YEAR_MONTH){ + if ($formatType === self::NOTICE_YEAR_MONTH) { return "★{$this->year}년 {$this->month}월:{$text}"; } - + return $text; } public function pushBattleResultTemplate( WarUnit $me, WarUnit $oppose - ){ - if($me instanceof WarUnitCity){ + ) { + if ($me instanceof WarUnitCity) { return; } - $templates = new \League\Plates\Engine(__DIR__.'/../templates'); + $templates = new \League\Plates\Engine(__DIR__ . '/../templates'); $render_me = [ 'crewtype' => $me->getCrewTypeShortName(), @@ -280,24 +293,22 @@ class ActionLogger{ 'killed_crew' => -$oppose->getDeadCurrentBattle() ]; - if(!$me->isAttacker()){ + if (!$me->isAttacker()) { $warType = 'defense'; $warTypeStr = '←'; - } - else if($oppose instanceof WarUnitCity){ + } else if ($oppose instanceof WarUnitCity) { $warType = 'siege'; $warTypeStr = '→'; - } - else{ + } else { $warType = 'attack'; $warTypeStr = '→'; } - $res = str_replace(["\r\n", "\r", "\n"], '', $templates->render('small_war_log',[ - 'year'=>$this->year, - 'month'=>$this->month, - 'war_type'=>$warType, - 'war_type_str'=>$warTypeStr, + $res = str_replace(["\r\n", "\r", "\n"], '', $templates->render('small_war_log', [ + 'year' => $this->year, + 'month' => $this->month, + 'war_type' => $warType, + 'war_type_str' => $warTypeStr, 'me' => $render_me, 'you' => $render_oppose, ])); @@ -307,12 +318,13 @@ class ActionLogger{ $this->pushGeneralActionLog($res, self::EVENT_YEAR_MONTH); } - public function getYear():int{ + public function getYear(): int + { return $this->year; } - public function getMonth():int{ + public function getMonth(): int + { return $this->month; } - -} \ No newline at end of file +} diff --git a/hwe/sammo/Command/BaseCommand.php b/hwe/sammo/Command/BaseCommand.php index fcca1f4a..007c2f8a 100644 --- a/hwe/sammo/Command/BaseCommand.php +++ b/hwe/sammo/Command/BaseCommand.php @@ -5,7 +5,8 @@ use \sammo\{ Util, JosaUtil, DB, General, GameConst, ActionLogger, - LastTurn + LastTurn, + NotInheritedMethodException }; use function \sammo\getNationStaticInfo; @@ -33,16 +34,19 @@ abstract class BaseCommand{ protected $destCity = null; protected $destNation = null; - protected $runnable = null; - protected $reservable = null; + protected $cachedPermissionToReserve = false; + protected $cachedMinConditionMet = false; + protected $cachedFullConditionMet = false; protected $isArgValid=false; - protected $reasonNotRunnable = null; - protected $reasonNotReservable = null; + protected $reasonNotFullConditionMet = null; + protected $reasonNotMinConditionMet = null; + protected $reasonNoPermissionToReserve = null; - protected $runnableConstraints = null; - protected $reservableConstraints = null; + protected $fullConditionConstraints = null; + protected $minConditionConstraints = null; + protected $permissionConstraints = null; protected $logger; @@ -63,57 +67,48 @@ abstract class BaseCommand{ $this->logger = $generalObj->getLogger(); $this->env = $env; $this->arg = $arg; - if (!$this->argTest()) { - return; - } - $this->isArgValid = true; - $this->init(); + + $this->init(); + if ($this->argTest()) { + $this->isArgValid = true; + if(static::$reqArg){ + $this->initWithArg(); + } + } + else{ + $this->isArgValid = false; + } } protected function resetTestCache():void{ - $this->runnable = null; - $this->reservable = null; + $this->cachedFullConditionMet = false; + $this->cachedMinConditionMet = false; + $this->cachedPermissionToReserve = false; - $this->reasonNotRunnable = null; - $this->reasonNotReservable = null; + $this->reasonNotFullConditionMet = null; + $this->reasonNotMinConditionMet = null; + $this->reasonNoPermissionToReserve = null; } - protected function setCity(?array $args=null){ + protected function setCity(){ $this->resetTestCache(); $db = DB::db(); - if($args === null){ - $this->city = $this->generalObj->getRawCity(); - if($this->city){ - return; - } - $this->city = $db->queryFirstRow('SELECT * FROM city WHERE city=%i', $this->generalObj->getVar('city')); - $this->generalObj->setRawCity($this->city); - return; - } - $this->city = $this->generalObj->getRawCity(); - $hasArgs = true; - foreach($args as $arg){ - if(!key_exists($arg, $this->city)){ - $hasArgs = false; - break; - } - } - if($hasArgs){ + if($this->city){ return; } - - $this->city = $db->queryFirstRow('SELECT %l FROM city WHERE city=%i', Util::formatListOfBackticks($args), $this->generalObj->getVar('city')); - if($this->generalObj->getRawCity() === null){ - $this->generalObj->setRawCity($this->city); - } + $this->city = $db->queryFirstRow('SELECT * FROM city WHERE city=%i', $this->generalObj->getVar('city')); + $this->generalObj->setRawCity($this->city); + return; } protected function setNation(?array $args = null){ $this->resetTestCache(); if($args === null){ - $this->nation = $this->generalObj->getStaticNation(); + if(!$this->nation){ + $this->nation = $this->generalObj->getStaticNation(); + } return; } @@ -143,7 +138,18 @@ abstract class BaseCommand{ 'gennum'=>1 ]; - + if($this->nation && $this->nation['nation'] === $nationID){ + $allArgExists = true; + foreach($args as $arg){ + if(!key_exists($arg, $this->nation)){ + $allArgExists = false; + break; + } + } + if($allArgExists){ + return; + } + } $db = DB::db(); $nation = $db->queryFirstRow('SELECT %l FROM nation WHERE nation=%i', Util::formatListOfBackticks($args), $nationID); @@ -153,7 +159,14 @@ abstract class BaseCommand{ $nation[$arg] = $defaultValues[$arg]; } } - $this->nation = $nation; + + if($this->nation){ + //NOTE: 이 순서 맞다! https://www.php.net/manual/en/language.operators.array.php + $this->nation = $nation + $this->nation; + } + else{ + $this->nation = $nation; + } } protected function setDestGeneral(General $destGeneralObj){ @@ -161,19 +174,19 @@ abstract class BaseCommand{ $this->destGeneralObj = $destGeneralObj; } - protected function setDestCity(int $cityNo, ?array $args){ + protected function setDestCity(int $cityNo, bool $onlyName=false){ $this->resetTestCache(); $db = DB::db(); - if($args === []){ + if($onlyName){ $cityObj = \sammo\CityConst::byID($cityNo); - $this->destCity = ['city'=>$cityNo, 'name'=>$cityObj->name]; + $this->destCity = [ + 'city'=>$cityNo, + 'name'=>$cityObj->name, + 'region'=>$cityObj->region, + ]; return; } - if($args === null){ - $this->destCity = $db->queryFirstRow('SELECT * FROM city WHERE city=%i', $cityNo); - return; - } - $this->destCity = $db->queryFirstRow('SELECT %l FROM city WHERE city=%i', Util::formatListOfBackticks($args), $cityNo); + $this->destCity = $db->queryFirstRow('SELECT * FROM city WHERE city=%i', $cityNo); } protected function setDestNation(int $nationID, ?array $args = null){ @@ -208,6 +221,11 @@ abstract class BaseCommand{ } abstract protected function init(); + protected function initWithArg(){ + if(static::$reqArg){ + throw new NotInheritedMethodException(); + } + } abstract protected function argTest():bool; public function getArg():?array{ @@ -253,13 +271,19 @@ abstract class BaseCommand{ return $this->logger; } - public function testReservable():?string{ - if($this->reservableConstraints === null){ + public function testPermissionToReserve():?string{ + if(!$this->isArgValid()){ + $this->reasonNoPermissionToReserve = '인자가 올바르지 않습니다.'; + $this->cachedPermissionToReserve = true; + return $this->reasonNoPermissionToReserve; + } + + if($this->permissionConstraints === null){ return null; } - if($this->reasonNotReservable){ - return $this->reasonNotReservable; + if($this->reasonNoPermissionToReserve){ + return $this->reasonNoPermissionToReserve; } $this->generalObj->unpackAux(); @@ -274,27 +298,29 @@ abstract class BaseCommand{ 'destNation'=>$this->destNation, ]; - [$this->reasonConstraint, $this->reasonNotReservable] = Constraint::testAll($this->reservableConstraints??[], $constraintInput, $this->env); - $this->reservable = $this->reasonNotReservable === null; - return $this->reasonNotReservable; + [$this->reasonConstraint, $this->reasonNoPermissionToReserve] = Constraint::testAll($this->permissionConstraints??[], $constraintInput, $this->env); + $this->cachedPermissionToReserve = true; + return $this->reasonNoPermissionToReserve; } public function canDisplay():bool{ - return true; + return $this->hasPermissionToReserve(); } - public function testRunnable():?string{ - if(!$this->isArgValid()){ - $this->reasonNotReservable = '인자가 올바르지 않습니다.'; - $this->reservable = false; - return $this->reasonNotReservable; - } - if($this->runnableConstraints === null){ - throw new \InvalidArgumentException('runnableConstraits가 제대로 설정되지 않았습니다'); + public function testMinConditionMet():?string{ + if(!static::$reqArg){ + if($this->minConditionConstraints){ + throw new \LogicException('reqArg==false인데 minCondition이 설정됨'); + } + return $this->testFullConditionMet(); } - if($this->reasonNotRunnable){ - return $this->reasonNotRunnable; + if($this->minConditionConstraints === null){ + throw new \InvalidArgumentException('minConditionConstraints가 제대로 설정되지 않았습니다'); + } + + if($this->cachedMinConditionMet){ + return $this->reasonNotMinConditionMet; } $this->generalObj->unpackAux(); @@ -309,9 +335,42 @@ abstract class BaseCommand{ 'destNation'=>$this->destNation, ]; - [$this->reasonConstraint, $this->reasonNotRunnable] = Constraint::testAll($this->runnableConstraints??[], $constraintInput, $this->env); - $this->runnable = $this->reasonNotRunnable === null; - return $this->reasonNotRunnable; + [$this->reasonConstraint, $this->reasonNotMinConditionMet] = Constraint::testAll($this->minConditionConstraints??[], $constraintInput, $this->env); + $this->cachedMinConditionMet = true; + return $this->reasonNotMinConditionMet; + + } + + public function testFullConditionMet():?string{ + if(!$this->isArgValid()){ + $this->reasonNotFullConditionMet = '인자가 올바르지 않습니다.'; + $this->cachedFullConditionMet = true; + return $this->reasonNotFullConditionMet; + } + + if($this->fullConditionConstraints === null){ + throw new \InvalidArgumentException('fullConditionConstraints가 제대로 설정되지 않았습니다'); + } + + if($this->cachedFullConditionMet){ + return $this->reasonNotFullConditionMet; + } + + $this->generalObj->unpackAux(); + $constraintInput = [ + 'general'=>$this->generalObj->getRaw(), + 'city'=>$this->city, + 'nation'=>$this->nation, + 'cmd_arg'=>$this->arg, + + 'destGeneral'=>$this->destGeneralObj?$this->destGeneralObj->getRaw():null, + 'destCity'=>$this->destCity, + 'destNation'=>$this->destNation, + ]; + + [$this->reasonConstraint, $this->reasonNotFullConditionMet] = Constraint::testAll($this->fullConditionConstraints??[], $constraintInput, $this->env); + $this->cachedFullConditionMet = true; + return $this->reasonNotFullConditionMet; } @@ -350,30 +409,25 @@ abstract class BaseCommand{ return true; } - public function isReservable():bool{ - if($this->reservable !== null){ - return $this->reservable; - } - - $this->reservable = $this->testReservable() === null; - return $this->reservable; + public function hasPermissionToReserve():bool{ + return $this->testPermissionToReserve() === null; } public function isArgValid():bool{ return $this->isArgValid; } - public function isRunnable():bool { - if($this->runnable !== null){ - return $this->runnable; - } - - return $this->testRunnable() === null; + public function hasMinConditionMet():bool { + return $this->testMinConditionMet() === null; + } + + public function hasFullConditionMet():bool { + return $this->testFullConditionMet() === null; } public function getFailString():string{ $commandName = $this->getName(); - $failReason = $this->testRunnable(); + $failReason = $this->testFullConditionMet(); if($failReason === null){ throw new \RuntimeException('실행 가능한 커맨드에 대해 실패 이유를 수집'); } diff --git a/hwe/sammo/Command/General/che_NPC능동.php b/hwe/sammo/Command/General/che_NPC능동.php index ded2959a..3a2db37a 100644 --- a/hwe/sammo/Command/General/che_NPC능동.php +++ b/hwe/sammo/Command/General/che_NPC능동.php @@ -48,11 +48,11 @@ class che_NPC능동 extends Command\GeneralCommand{ $this->setNation(); - $this->reservableConstraints=[ + $this->permissionConstraints=[ ConstraintHelper::MustBeNPC() ]; - $this->runnableConstraints=[ + $this->fullConditionConstraints=[ ]; @@ -70,12 +70,8 @@ class che_NPC능동 extends Command\GeneralCommand{ return 0; } - public function canDisplay():bool{ - return false; - } - public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/General/che_강행.php b/hwe/sammo/Command/General/che_강행.php index 0ef7a30b..a17cb3e4 100644 --- a/hwe/sammo/Command/General/che_강행.php +++ b/hwe/sammo/Command/General/che_강행.php @@ -1,17 +1,21 @@ arg === null){ + protected function argTest(): bool + { + if ($this->arg === null) { return false; } - if(!key_exists('destCityID', $this->arg)){ + if (!key_exists('destCityID', $this->arg)) { return false; } - if(!key_exists($this->arg['destCityID'], CityConst::all())){ + if (!key_exists($this->arg['destCityID'], CityConst::all())) { return false; } $this->arg = [ - 'destCityID'=>$this->arg['destCityID'] + 'destCityID' => $this->arg['destCityID'] ]; return true; } - protected function init(){ - - $general = $this->generalObj; - + protected function init() + { $this->setCity(); $this->setNation(); - $this->setDestCity($this->arg['destCityID'], []); + + $this->minConditionConstraints = []; + } + + protected function initWithArg() + { + $this->setDestCity($this->arg['destCityID'], true); [$reqGold, $reqRice] = $this->getCost(); - - $this->runnableConstraints=[ - ConstraintHelper::NotSameDestCity(), + + $this->fullConditionConstraints = [ + ConstraintHelper::NotSameDestCity(), ConstraintHelper::NearCity(3), ConstraintHelper::ReqGeneralGold($reqGold), ConstraintHelper::ReqGeneralRice($reqRice), ]; } - public function getCommandDetailTitle():string{ + public function getCommandDetailTitle(): string + { $name = $this->getName(); [$reqGold, $reqRice] = $this->getCost(); $title = "{$name}(통솔경험"; - if($reqGold > 0){ + if ($reqGold > 0) { $title .= ", 자금{$reqGold}"; } - if($reqRice > 0){ + if ($reqRice > 0) { $title .= ", 군량{$reqRice}"; } $title .= ', 병력,훈련,사기↓)'; return $title; } - - public function getCost():array{ + + public function getCost(): array + { $env = $this->env; return [$env['develcost'] * 5, 0]; } - - public function getPreReqTurn():int{ + + public function getPreReqTurn(): int + { return 0; } - public function getPostReqTurn():int{ + public function getPostReqTurn(): int + { return 0; } - public function getBrief():string{ + public function getBrief(): string + { $commandName = $this->getName(); $destCityName = CityConst::byID($this->arg['destCityID'])->name; $josaRo = JosaUtil::pick($destCityName, '로'); return "【{$destCityName}】{$josaRo} {$commandName}"; } - public function getFailString():string{ + public function getFailString(): string + { $commandName = $this->getName(); - $failReason = $this->testRunnable(); - if($failReason === null){ + $failReason = $this->testFullConditionMet(); + if ($failReason === null) { throw new \RuntimeException('실행 가능한 커맨드에 대해 실패 이유를 수집'); } $destCityName = CityConst::byID($this->arg['destCityID'])->name; @@ -106,8 +122,9 @@ class che_강행 extends Command\GeneralCommand{ return "{$failReason} {$destCityName}{$josaRo} {$commandName} 실패."; } - public function run():bool{ - if(!$this->isRunnable()){ + public function run(): bool + { + if (!$this->hasFullConditionMet()) { throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } @@ -128,16 +145,16 @@ class che_강행 extends Command\GeneralCommand{ $exp = 100; $general->setVar('city', $destCityID); - if($general->getVar('officer_level') == 12 && $this->nation['level'] == 0){ - + if ($general->getVar('officer_level') == 12 && $this->nation['level'] == 0) { + $generalList = $db->queryFirstColumn('SELECT no FROM general WHERE nation=%i AND no!=%i', $general->getNationID(), $general->getID()); - if($generalList){ + if ($generalList) { $db->update('general', [ - 'city'=>$destCityID + 'city' => $destCityID ], 'no IN %li and nation=%i', $generalList, $general->getNationID()); } - foreach($generalList as $targetGeneralID){ + foreach ($generalList as $targetGeneralID) { $targetLogger = new ActionLogger($targetGeneralID, $general->getNationID(), $env['year'], $env['month']); $targetLogger->pushGeneralActionLog("방랑군 세력이 {$destCityName}{$josaRo} 강행했습니다.", ActionLogger::PLAIN); $targetLogger->flush(); @@ -153,7 +170,6 @@ class che_강행 extends Command\GeneralCommand{ $general->applyDB($db); return true; - } public function getJSFiles(): array @@ -170,19 +186,17 @@ class che_강행 extends Command\GeneralCommand{ ob_start(); ?> -
-선택된 도시로 강행합니다.
-최대 3칸내 도시로만 강행이 가능합니다.
-목록을 선택하거나 도시를 클릭하세요.
- =>
-
-
- +
+ 선택된 도시로 강행합니다.
+ 최대 3칸내 도시로만 강행이 가능합니다.
+ 목록을 선택하거나 도시를 클릭하세요.
+ =>
+
+
+ generalObj; $env = $this->env; @@ -40,7 +41,7 @@ class che_거병 extends Command\GeneralCommand{ $relYear = $env['year'] - $env['startyear']; - $this->runnableConstraints=[ + $this->fullConditionConstraints=[ ConstraintHelper::BeNeutral(), ConstraintHelper::BeOpeningPart($relYear+1), ConstraintHelper::AllowJoinAction(), @@ -60,7 +61,7 @@ class che_거병 extends Command\GeneralCommand{ } public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/General/che_건국.php b/hwe/sammo/Command/General/che_건국.php index ba8ee71e..f3d28208 100644 --- a/hwe/sammo/Command/General/che_건국.php +++ b/hwe/sammo/Command/General/che_건국.php @@ -1,17 +1,21 @@ arg === null){ + protected function argTest(): bool + { + if ($this->arg === null) { return false; } - $nationName = $this->arg['nationName']??null; - $nationType = $this->arg['nationType']??null; - $colorType = $this->arg['colorType']??null; + $nationName = $this->arg['nationName'] ?? null; + $nationType = $this->arg['nationType'] ?? null; + $colorType = $this->arg['colorType'] ?? null; - if($nationName === null || $nationType === null || $colorType === null){ + if ($nationName === null || $nationType === null || $colorType === null) { return false; } - if(!is_string($nationName) || !is_string($nationType) || !is_int($colorType)){ + if (!is_string($nationName) || !is_string($nationType) || !is_int($colorType)) { return false; } - if(mb_strwidth($nationName) > 18 || $nationName == ''){ + if (mb_strwidth($nationName) > 18 || $nationName == '') { return false; } - if(!key_exists($colorType, GetNationColors())){ + if (!key_exists($colorType, GetNationColors())) { return false; } - try{ + try { $nationTypeClass = buildNationTypeClass($nationType); - } - catch(\InvalidArgumentException $e){ + } catch (\InvalidArgumentException $e) { return false; } - + $this->arg = [ - 'nationName'=>$nationName, - 'nationType'=>$nationType, - 'colorType'=>$colorType + 'nationName' => $nationName, + 'nationType' => $nationType, + 'colorType' => $colorType ]; return true; } - protected function init(){ - - $general = $this->generalObj; + protected function init() + { $env = $this->env; - $nationName = $this->arg['nationName']; - $nationType = $this->arg['nationType']; - $colorType = $this->arg['colorType']; - $this->setCity(); $this->setNation(['gennum']); $relYear = $env['year'] - $env['startyear']; - - $this->runnableConstraints=[ + + $this->minConditionConstraints = [ + ConstraintHelper::BeOpeningPart($relYear + 1), + ConstraintHelper::ReqNationValue('level', '국가규모', '==', 0, '정식 국가가 아니어야합니다.') + ]; + } + + protected function initWithArg() + { + $env = $this->env; + $relYear = $env['year'] - $env['startyear']; + + $nationName = $this->arg['nationName']; + $nationType = $this->arg['nationType']; + $colorType = $this->arg['colorType']; + + $this->fullConditionConstraints = [ ConstraintHelper::BeLord(), ConstraintHelper::WanderingNation(), ConstraintHelper::ReqNationValue('gennum', '수하 장수', '>=', 2), - ConstraintHelper::BeOpeningPart($relYear+1), + ConstraintHelper::BeOpeningPart($relYear + 1), ConstraintHelper::CheckNationNameDuplicate($nationName), ConstraintHelper::AllowJoinAction(), ConstraintHelper::ConstructableCity(), @@ -101,20 +116,24 @@ class che_건국 extends Command\GeneralCommand{ return "【{$nationName}】{$josaUl} 건국"; } - public function getCost():array{ + public function getCost(): array + { return [0, 0]; } - - public function getPreReqTurn():int{ + + public function getPreReqTurn(): int + { return 0; } - public function getPostReqTurn():int{ + public function getPostReqTurn(): int + { return 0; } - public function run():bool{ - if(!$this->isRunnable()){ + public function run(): bool + { + if (!$this->hasFullConditionMet()) { throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } @@ -155,16 +174,16 @@ class che_건국 extends Command\GeneralCommand{ $general->addDedication($ded); $db->update('city', [ - 'nation'=>$general->getNationID(), - 'conflict'=>'{}' + 'nation' => $general->getNationID(), + 'conflict' => '{}' ], 'city=%i', $general->getCityID()); $db->update('nation', [ - 'name'=>$nationName, - 'color'=>$colorType, - 'level'=>1, - 'type'=>$nationType, - 'capital'=>$general->getCityID() + 'name' => $nationName, + 'color' => $colorType, + 'level' => 1, + 'type' => $nationType, + 'capital' => $general->getCityID() ], 'nation=%i', $general->getNationID()); refreshNationStaticInfo(); @@ -180,7 +199,7 @@ class che_건국 extends Command\GeneralCommand{ public function getForm(): string { - if(count(getAllNationStaticInfo()) >= $this->env['maxnation']){ + if (count(getAllNationStaticInfo()) >= $this->env['maxnation']) { return '더 이상 건국은 불가능합니다.'; } @@ -213,44 +232,44 @@ class che_건국 extends Command\GeneralCommand{ } } */ - + ob_start(); ?> -현재 도시에서 나라를 세웁니다. 중, 소도시에서만 가능합니다.
+ 현재 도시에서 나라를 세웁니다. 중, 소도시에서만 가능합니다.
-getName(), $nationClass::$pros, $nationClass::$cons]; -?> - - - :
- -
-국명 : -색깔 : + 색깔 : -성향 : + 성향 : - + getName(); + ?> + + + + generalObj; - $this->runnableConstraints=[ + $this->fullConditionConstraints=[ ]; } @@ -55,7 +56,7 @@ class che_견문 extends Command\GeneralCommand{ } public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/General/che_군량매매.php b/hwe/sammo/Command/General/che_군량매매.php index e9769caf..ba28e57e 100644 --- a/hwe/sammo/Command/General/che_군량매매.php +++ b/hwe/sammo/Command/General/che_군량매매.php @@ -56,24 +56,36 @@ class che_군량매매 extends Command\GeneralCommand{ return "군량 {$this->arg['amount']}을 {$buyRiceText}"; } - protected function init(){ + protected function init() + { $general = $this->generalObj; $this->setCity(); $this->setNation(); + + $this->minConditionConstraints=[ + ConstraintHelper::ReqCityTrader($general->getVar('npc')), + ConstraintHelper::OccupiedCity(true), + ConstraintHelper::SuppliedCity(), + ]; + } + + protected function initWithArg() + { + $general = $this->generalObj; - $this->runnableConstraints=[ + $this->fullConditionConstraints=[ ConstraintHelper::ReqCityTrader($general->getVar('npc')), ConstraintHelper::OccupiedCity(true), ConstraintHelper::SuppliedCity(), ]; if($this->arg['buyRice']){ - $this->runnableConstraints[] = ConstraintHelper::ReqGeneralGold(1); + $this->fullConditionConstraints[] = ConstraintHelper::ReqGeneralGold(1); } else{ - $this->runnableConstraints[] = ConstraintHelper::ReqGeneralRice(1); + $this->fullConditionConstraints[] = ConstraintHelper::ReqGeneralRice(1); } } @@ -90,7 +102,7 @@ class che_군량매매 extends Command\GeneralCommand{ } public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/General/che_귀환.php b/hwe/sammo/Command/General/che_귀환.php index 41f63742..9d772d68 100644 --- a/hwe/sammo/Command/General/che_귀환.php +++ b/hwe/sammo/Command/General/che_귀환.php @@ -30,7 +30,8 @@ class che_귀환 extends Command\GeneralCommand{ return true; } - protected function init(){ + protected function init() + { $general = $this->generalObj; @@ -39,7 +40,7 @@ class che_귀환 extends Command\GeneralCommand{ [$reqGold, $reqRice] = $this->getCost(); - $this->runnableConstraints=[ + $this->fullConditionConstraints=[ ConstraintHelper::NotBeNeutral(), ConstraintHelper::NotWanderingNation(), ConstraintHelper::NotCapital(true), @@ -64,7 +65,7 @@ class che_귀환 extends Command\GeneralCommand{ } public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/General/che_기술연구.php b/hwe/sammo/Command/General/che_기술연구.php index 00d23c50..50d70d52 100644 --- a/hwe/sammo/Command/General/che_기술연구.php +++ b/hwe/sammo/Command/General/che_기술연구.php @@ -31,7 +31,8 @@ class che_기술연구 extends che_상업투자{ return true; } - protected function init(){ + protected function init() + { $general = $this->generalObj; @@ -40,7 +41,7 @@ class che_기술연구 extends che_상업투자{ [$reqGold, $reqRice] = $this->getCost(); - $this->runnableConstraints=[ + $this->fullConditionConstraints=[ ConstraintHelper::NotBeNeutral(), ConstraintHelper::NotWanderingNation(), ConstraintHelper::OccupiedCity(), @@ -53,7 +54,7 @@ class che_기술연구 extends che_상업투자{ } public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/General/che_단련.php b/hwe/sammo/Command/General/che_단련.php index 067dde9f..39770f86 100644 --- a/hwe/sammo/Command/General/che_단련.php +++ b/hwe/sammo/Command/General/che_단련.php @@ -28,7 +28,8 @@ class che_단련 extends Command\GeneralCommand{ return true; } - protected function init(){ + protected function init() + { $general = $this->generalObj; @@ -37,7 +38,7 @@ class che_단련 extends Command\GeneralCommand{ [$reqGold, $reqRice] = $this->getCost(); - $this->runnableConstraints=[ + $this->fullConditionConstraints=[ ConstraintHelper::NotBeNeutral(), ConstraintHelper::ReqGeneralCrew(), ConstraintHelper::ReqGeneralValue('train', '훈련', '>=', GameConst::$defaultTrainLow), @@ -77,7 +78,7 @@ class che_단련 extends Command\GeneralCommand{ } public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/General/che_등용.php b/hwe/sammo/Command/General/che_등용.php index 29d5c9ad..9df12314 100644 --- a/hwe/sammo/Command/General/che_등용.php +++ b/hwe/sammo/Command/General/che_등용.php @@ -53,21 +53,39 @@ class che_등용 extends Command\GeneralCommand{ return true; } - protected function init(){ + protected function init() + { $general = $this->generalObj; $this->setCity(); $this->setNation(['gennum', 'scout']); + $relYear = $this->env['year'] - $this->env['startyear']; + + $this->permissionConstraints=[ + ConstraintHelper::ReqEnvValue('join_mode', '!=', 'onlyRandom', '랜덤 임관만 가능합니다'), + ]; + + $this->minConditionConstraints=[ + ConstraintHelper::ReqEnvValue('join_mode', '!=', 'onlyRandom', '랜덤 임관만 가능합니다'), + ConstraintHelper::NotBeNeutral(), + ConstraintHelper::NotOpeningPart($relYear), + ConstraintHelper::OccupiedCity(), + ConstraintHelper::SuppliedCity(), + ]; + } + + protected function initWithArg() + { $destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], ['nation'], 0); $this->setDestGeneral($destGeneral); [$reqGold, $reqRice] = $this->getCost(); $relYear = $this->env['year'] - $this->env['startyear']; - - $this->runnableConstraints=[ - ConstraintHelper::ReqEnvValue('join_mode', '==', 'onlyRandom', '랜덤 임관만 가능합니다'), + + $this->fullConditionConstraints=[ + ConstraintHelper::ReqEnvValue('join_mode', '!=', 'onlyRandom', '랜덤 임관만 가능합니다'), ConstraintHelper::NotBeNeutral(), ConstraintHelper::NotOpeningPart($relYear), ConstraintHelper::OccupiedCity(), @@ -77,9 +95,9 @@ class che_등용 extends Command\GeneralCommand{ ConstraintHelper::ReqGeneralGold($reqGold), ConstraintHelper::ReqGeneralRice($reqRice), ]; - + if($this->destGeneralObj->getVar('officer_level') == 12){ - $this->runnableConstraints[] = ConstraintHelper::AlwaysFail('군주에게는 등용장을 보낼 수 없습니다.'); + $this->fullConditionConstraints[] = ConstraintHelper::AlwaysFail('군주에게는 등용장을 보낼 수 없습니다.'); } } @@ -113,7 +131,7 @@ class che_등용 extends Command\GeneralCommand{ } public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/General/che_등용수락.php b/hwe/sammo/Command/General/che_등용수락.php index da6e2e35..7e7c668f 100644 --- a/hwe/sammo/Command/General/che_등용수락.php +++ b/hwe/sammo/Command/General/che_등용수락.php @@ -70,22 +70,26 @@ class che_등용수락 extends Command\GeneralCommand{ return true; } - protected function init(){ + protected function init() + { $general = $this->generalObj; $this->setNation(['gennum', 'scout']); + $this->permissionConstraints = [ + ConstraintHelper::AlwaysFail('예약 불가능 커맨드') + ]; + } + + protected function initWithArg() + { $destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], ['nation'], 0); $this->setDestGeneral($destGeneral); $this->setDestNation($this->arg['destNationID'], ['gennum', 'scout']); $relYear = $this->env['year'] - $this->env['startyear']; - $this->reservableConstraints = [ - ConstraintHelper::AlwaysFail('예약 불가능 커맨드') - ]; - - $this->runnableConstraints=[ + $this->fullConditionConstraints=[ ConstraintHelper::ReqEnvValue('join_mode', '==', 'onlyRandom', '랜덤 임관만 가능합니다'), ConstraintHelper::NotOpeningPart($relYear), ConstraintHelper::ExistsDestNation(), @@ -109,7 +113,7 @@ class che_등용수락 extends Command\GeneralCommand{ } public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/General/che_랜덤임관.php b/hwe/sammo/Command/General/che_랜덤임관.php index a6c2610a..b36b6588 100644 --- a/hwe/sammo/Command/General/che_랜덤임관.php +++ b/hwe/sammo/Command/General/che_랜덤임관.php @@ -26,7 +26,6 @@ use sammo\MustNotBeReachedException; class che_랜덤임관 extends Command\GeneralCommand{ static protected $actionName = '랜덤임관'; - static public $reqArg = false; protected function argTest():bool{ $this->arg = null; @@ -61,7 +60,8 @@ class che_랜덤임관 extends Command\GeneralCommand{ return true;*/ } - protected function init(){ + protected function init() + { $general = $this->generalObj; $env = $this->env; @@ -71,14 +71,14 @@ class che_랜덤임관 extends Command\GeneralCommand{ $relYear = $env['year'] - $env['startyear']; - $this->runnableConstraints=[ + $this->fullConditionConstraints=[ ConstraintHelper::BeNeutral(), ConstraintHelper::AllowJoinAction(), ]; /* if($this->arg['destNationIDList']??false){ - $this->runnableConstraints[] = ConstraintHelper::ExistsAllowJoinNation($relYear, $this->arg['destNationIDList']); + $this->fullConditionConstraints[] = ConstraintHelper::ExistsAllowJoinNation($relYear, $this->arg['destNationIDList']); } */ } @@ -96,7 +96,7 @@ class che_랜덤임관 extends Command\GeneralCommand{ } public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/General/che_모반시도.php b/hwe/sammo/Command/General/che_모반시도.php index 092d2924..5c04bb3b 100644 --- a/hwe/sammo/Command/General/che_모반시도.php +++ b/hwe/sammo/Command/General/che_모반시도.php @@ -29,14 +29,15 @@ class che_모반시도 extends Command\GeneralCommand{ return true; } - protected function init(){ + protected function init() + { $general = $this->generalObj; $this->setCity(); $this->setNation(); - $this->runnableConstraints=[ + $this->fullConditionConstraints=[ ConstraintHelper::NotBeNeutral(), ConstraintHelper::BeChief(), ConstraintHelper::OccupiedCity(), @@ -59,7 +60,7 @@ class che_모반시도 extends Command\GeneralCommand{ } public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/General/che_물자조달.php b/hwe/sammo/Command/General/che_물자조달.php index 117a1a75..0c6472c5 100644 --- a/hwe/sammo/Command/General/che_물자조달.php +++ b/hwe/sammo/Command/General/che_물자조달.php @@ -30,14 +30,15 @@ class che_물자조달 extends Command\GeneralCommand{ return true; } - protected function init(){ + protected function init() + { $general = $this->generalObj; $this->setCity(); $this->setNation(); - $this->runnableConstraints=[ + $this->fullConditionConstraints=[ ConstraintHelper::NotBeNeutral(), ConstraintHelper::NotWanderingNation(), ConstraintHelper::OccupiedCity(), @@ -63,7 +64,7 @@ class che_물자조달 extends Command\GeneralCommand{ } public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/General/che_방랑.php b/hwe/sammo/Command/General/che_방랑.php index 848448ec..9e75e811 100644 --- a/hwe/sammo/Command/General/che_방랑.php +++ b/hwe/sammo/Command/General/che_방랑.php @@ -40,7 +40,7 @@ class che_방랑 extends Command\GeneralCommand{ $relYear = $env['year'] - $env['startyear']; - $this->runnableConstraints=[ + $this->fullConditionConstraints=[ ConstraintHelper::BeLord(), ConstraintHelper::NotWanderingNation(), ConstraintHelper::NotOpeningPart($relYear), @@ -63,7 +63,7 @@ class che_방랑 extends Command\GeneralCommand{ } public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/General/che_사기진작.php b/hwe/sammo/Command/General/che_사기진작.php index 12742e64..f9d7f425 100644 --- a/hwe/sammo/Command/General/che_사기진작.php +++ b/hwe/sammo/Command/General/che_사기진작.php @@ -36,7 +36,7 @@ class che_사기진작 extends Command\GeneralCommand{ [$reqGold, $reqRice] = $this->getCost(); - $this->runnableConstraints=[ + $this->fullConditionConstraints=[ ConstraintHelper::NotBeNeutral(), ConstraintHelper::NotWanderingNation(), ConstraintHelper::OccupiedCity(), @@ -69,7 +69,7 @@ class che_사기진작 extends Command\GeneralCommand{ } public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/General/che_상업투자.php b/hwe/sammo/Command/General/che_상업투자.php index 8c2e9d70..965c4b3b 100644 --- a/hwe/sammo/Command/General/che_상업투자.php +++ b/hwe/sammo/Command/General/che_상업투자.php @@ -45,7 +45,7 @@ class che_상업투자 extends Command\GeneralCommand{ [$reqGold, $reqRice] = $this->getCost(); - $this->runnableConstraints=[ + $this->fullConditionConstraints=[ ConstraintHelper::NotBeNeutral(), ConstraintHelper::NotWanderingNation(), ConstraintHelper::OccupiedCity(), @@ -128,7 +128,7 @@ class che_상업투자 extends Command\GeneralCommand{ } public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/General/che_선양.php b/hwe/sammo/Command/General/che_선양.php index f0bae142..2476076d 100644 --- a/hwe/sammo/Command/General/che_선양.php +++ b/hwe/sammo/Command/General/che_선양.php @@ -1,9 +1,13 @@ arg === null){ + protected function argTest(): bool + { + if ($this->arg === null) { return false; } //NOTE: 사망 직전에 '선양' 턴을 넣을 수 있으므로, 존재하지 않는 장수여도 argTest에서 바로 탈락시키지 않음 - if(!key_exists('destGeneralID', $this->arg)){ + if (!key_exists('destGeneralID', $this->arg)) { return false; } $destGeneralID = $this->arg['destGeneralID']; - if(!is_int($destGeneralID)){ + if (!is_int($destGeneralID)) { return false; } - if($destGeneralID <= 0){ + if ($destGeneralID <= 0) { return false; } - if($destGeneralID == $this->generalObj->getID()){ + if ($destGeneralID == $this->generalObj->getID()) { return false; } $this->arg = [ - 'destGeneralID'=>$destGeneralID + 'destGeneralID' => $destGeneralID ]; return true; } - protected function init(){ + protected function init() + { $general = $this->generalObj; $this->setNation(); + $this->minConditionConstraints = [ + ConstraintHelper::BeLord() + ]; + } + + protected function initWithArg() + { $destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], ['gold', 'nation'], 1); $this->setDestGeneral($destGeneral); - - $this->runnableConstraints=[ - ConstraintHelper::BeLord(), + + $this->fullConditionConstraints = [ + ConstraintHelper::BeLord(), ConstraintHelper::ExistsDestGeneral(), ConstraintHelper::FriendlyDestGeneral(), ConstraintHelper::DisallowDiplomacyStatus( @@ -70,15 +84,18 @@ class che_선양 extends Command\GeneralCommand{ ]; } - public function getCost():array{ + public function getCost(): array + { return [0, 0]; } - - public function getPreReqTurn():int{ + + public function getPreReqTurn(): int + { return 0; } - public function getPostReqTurn():int{ + public function getPostReqTurn(): int + { return 0; } @@ -89,8 +106,9 @@ class che_선양 extends Command\GeneralCommand{ return "【{$destGeneralName}】에게 {$name}"; } - public function run():bool{ - if(!$this->isRunnable()){ + public function run(): bool + { + if (!$this->hasFullConditionMet()) { throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } @@ -105,7 +123,7 @@ class che_선양 extends Command\GeneralCommand{ $destGeneralName = $destGeneral->getName(); $nationName = $this->nation['name']; - + $logger = $general->getLogger(); $destLogger = $destGeneral->getLogger(); @@ -138,26 +156,26 @@ class che_선양 extends Command\GeneralCommand{ //TODO: 암행부처럼 보여야... $db = DB::db(); - $destRawGenerals = $db->query('SELECT no,name,officer_level,npc FROM general WHERE nation != 0 AND nation = %i AND no != %i ORDER BY npc,binary(name)',$this->generalObj->getNationID(), $this->generalObj->getID()); + $destRawGenerals = $db->query('SELECT no,name,officer_level,npc FROM general WHERE nation != 0 AND nation = %i AND no != %i ORDER BY npc,binary(name)', $this->generalObj->getNationID(), $this->generalObj->getID()); ob_start(); ?> -군주의 자리를 다른 장수에게 물려줍니다.
-장수를 선택하세요.
-
+ 군주의 자리를 다른 장수에게 물려줍니다.
+ 장수를 선택하세요.
+
setCity(); $this->setNation(); - $this->runnableConstraints=[ + $this->fullConditionConstraints=[ ConstraintHelper::ReqGeneralCrew(), ]; @@ -58,7 +58,7 @@ class che_소집해제 extends Command\GeneralCommand{ } public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/General/che_숙련전환.php b/hwe/sammo/Command/General/che_숙련전환.php index a9ad4278..19796c9b 100644 --- a/hwe/sammo/Command/General/che_숙련전환.php +++ b/hwe/sammo/Command/General/che_숙련전환.php @@ -1,18 +1,24 @@ arg === null){ + + protected function argTest(): bool + { + if ($this->arg === null) { return false; } - if(!key_exists('srcArmType', $this->arg)){ + if (!key_exists('srcArmType', $this->arg)) { return false; } - if(!key_exists('destArmType', $this->arg)){ + if (!key_exists('destArmType', $this->arg)) { return false; } $srcArmType = $this->arg['srcArmType']; $destArmType = $this->arg['destArmType']; - if(!is_int($srcArmType)){ + if (!is_int($srcArmType)) { return false; } - if(!key_exists($srcArmType, GameUnitConst::allType())){ + if (!key_exists($srcArmType, GameUnitConst::allType())) { return false; } - if(!is_int($destArmType)){ + if (!is_int($destArmType)) { return false; } - if(!key_exists($destArmType, GameUnitConst::allType())){ + if (!key_exists($destArmType, GameUnitConst::allType())) { return false; } - if($srcArmType === $destArmType){ + if ($srcArmType === $destArmType) { return false; } $this->arg = [ - 'srcArmType'=>$srcArmType, - 'destArmType'=>$destArmType + 'srcArmType' => $srcArmType, + 'destArmType' => $destArmType ]; return true; } - protected function init(){ + protected function init() + { $general = $this->generalObj; $this->setCity(); $this->setNation(); + + [$reqGold, $reqRice] = $this->getCost(); + + $this->minConditionConstraints = [ + ConstraintHelper::NotBeNeutral(), + ConstraintHelper::OccupiedCity(), + ConstraintHelper::ReqGeneralGold($reqGold), + ConstraintHelper::ReqGeneralRice($reqRice), + ]; + } + + protected function initWithArg() + { $this->srcArmType = $this->arg['srcArmType']; $this->srcArmTypeName = GameUnitConst::allType()[$this->srcArmType]; $this->destArmType = $this->arg['destArmType']; $this->destArmTypeName = GameUnitConst::allType()[$this->destArmType]; - [$reqGold, $reqRice] = $this->getCost(); - - $this->runnableConstraints=[ - ConstraintHelper::NotBeNeutral(), + + $this->fullConditionConstraints = [ + ConstraintHelper::NotBeNeutral(), ConstraintHelper::OccupiedCity(), ConstraintHelper::ReqGeneralGold($reqGold), ConstraintHelper::ReqGeneralRice($reqRice), ]; - } - public function getBrief():string{ + public function getBrief(): string + { return "【{$this->srcArmTypeName}】숙련을 【{$this->destArmTypeName}】숙련으로 전환"; - } - public function getCommandDetailTitle():string{ + public function getCommandDetailTitle(): string + { $name = $this->getName(); [$reqGold, $reqRice] = $this->getCost(); $title = "{$name}(통솔경험"; - if($reqGold > 0){ + if ($reqGold > 0) { $title .= ", 자금{$reqGold}"; } - if($reqRice > 0){ + if ($reqRice > 0) { $title .= ", 군량{$reqRice}"; } $title .= ')'; return $title; } - public function getCost():array{ + public function getCost(): array + { $env = $this->env; return [$env['develcost'], $env['develcost']]; } - - public function getPreReqTurn():int{ + + public function getPreReqTurn(): int + { return 0; } - public function getPostReqTurn():int{ + public function getPostReqTurn(): int + { return 0; } - public function run():bool{ - if(!$this->isRunnable()){ + public function run(): bool + { + if (!$this->hasFullConditionMet()) { throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } @@ -143,14 +168,14 @@ class che_숙련전환 extends Command\GeneralCommand{ $logger = $general->getLogger(); - $srcDex = $general->getVar('dex'.$this->srcArmType); + $srcDex = $general->getVar('dex' . $this->srcArmType); $cutDex = Util::toInt($srcDex * 0.3); $cutDexText = number_format($cutDex); $addDex = Util::toInt($cutDex * 2 / 3); $addDexText = number_format($addDex); - $general->increaseVar('dex'.$this->srcArmType, -$cutDex); - $general->increaseVar('dex'.$this->destArmType, $addDex); + $general->increaseVar('dex' . $this->srcArmType, -$cutDex); + $general->increaseVar('dex' . $this->destArmType, $addDex); $josaUl = JosaUtil::pick($cutDex, '을'); $josaRo = JosaUtil::pick($addDex, '로'); @@ -170,17 +195,17 @@ class che_숙련전환 extends Command\GeneralCommand{ return true; } - + public function getForm(): string { $db = DB::db(); $general = $this->generalObj; - + $dexSrcTexts = []; $dexDestTexts = []; - foreach(GameUnitConst::allType() as $armType => $armName){ - $dexVal = $general->getVar('dex'.$armType); + foreach (GameUnitConst::allType() as $armType => $armName) { + $dexVal = $general->getVar('dex' . $armType); $dexValText = number_format($dexVal); $cutDex = Util::toInt($dexVal * 0.3); $addDex = Util::toInt($cutDex * 2 / 3); @@ -195,23 +220,23 @@ class che_숙련전환 extends Command\GeneralCommand{ ob_start(); ?> -본인의 특정 병종 숙련을 30% 줄이고, 줄어든 숙련 중 2/3(20%p)를 다른 병종 숙련으로 전환합니다.
+ 본인의 특정 병종 숙련을 30% 줄이고, 줄어든 숙련 중 2/3(20%p)를 다른 병종 숙련으로 전환합니다.
- - 숙련을 + + 숙련을 - - 숙련으로
+ + 숙련으로
setNation(); - $this->runnableConstraints=[ + $this->fullConditionConstraints=[ ]; } @@ -52,7 +52,7 @@ class che_요양 extends Command\GeneralCommand{ } public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/General/che_이동.php b/hwe/sammo/Command/General/che_이동.php index bd1300ed..e105a15e 100644 --- a/hwe/sammo/Command/General/che_이동.php +++ b/hwe/sammo/Command/General/che_이동.php @@ -1,17 +1,21 @@ arg === null){ + protected function argTest(): bool + { + if ($this->arg === null) { return false; } - if(!key_exists('destCityID', $this->arg)){ + if (!key_exists('destCityID', $this->arg)) { return false; } - if(!key_exists($this->arg['destCityID'], CityConst::all())){ + if (!key_exists($this->arg['destCityID'], CityConst::all())) { return false; } $this->arg = [ - 'destCityID'=>$this->arg['destCityID'] + 'destCityID' => $this->arg['destCityID'] ]; return true; } - protected function init(){ + protected function init() + { $general = $this->generalObj; $this->setCity(); $this->setNation(); - $this->setDestCity($this->arg['destCityID'], []); + [$reqGold, $reqRice] = $this->getCost(); - - $this->runnableConstraints=[ - ConstraintHelper::NotSameDestCity(), + + $this->minConditionConstraints = [ + ConstraintHelper::ReqGeneralGold($reqGold), + ConstraintHelper::ReqGeneralRice($reqRice), + ]; + } + + protected function initWithArg() + { + $this->setDestCity($this->arg['destCityID'], true); + + [$reqGold, $reqRice] = $this->getCost(); + $this->fullConditionConstraints = [ + ConstraintHelper::NotSameDestCity(), ConstraintHelper::NearCity(1), ConstraintHelper::ReqGeneralGold($reqGold), ConstraintHelper::ReqGeneralRice($reqRice), ]; } - public function getCommandDetailTitle():string{ + public function getCommandDetailTitle(): string + { $name = $this->getName(); [$reqGold, $reqRice] = $this->getCost(); $title = "{$name}(통솔경험"; - if($reqGold > 0){ + if ($reqGold > 0) { $title .= ", 자금{$reqGold}"; } - if($reqRice > 0){ + if ($reqRice > 0) { $title .= ", 군량{$reqRice}"; } $title .= ', 사기↓)'; return $title; } - public function getCost():array{ + public function getCost(): array + { $env = $this->env; return [$env['develcost'], 0]; } - - public function getPreReqTurn():int{ + + public function getPreReqTurn(): int + { return 0; } - public function getPostReqTurn():int{ + public function getPostReqTurn(): int + { return 0; } - public function getBrief():string{ + public function getBrief(): string + { $commandName = $this->getName(); $destCityName = CityConst::byID($this->arg['destCityID'])->name; $josaRo = JosaUtil::pick($destCityName, '로'); return "【{$destCityName}】{$josaRo} {$commandName}"; } - public function getFailString():string{ + public function getFailString(): string + { $commandName = $this->getName(); - $failReason = $this->testRunnable(); - if($failReason === null){ + $failReason = $this->testFullConditionMet(); + if ($failReason === null) { throw new \RuntimeException('실행 가능한 커맨드에 대해 실패 이유를 수집'); } $destCityName = CityConst::byID($this->arg['destCityID'])->name; @@ -106,8 +130,9 @@ class che_이동 extends Command\GeneralCommand{ return "{$failReason} {$destCityName}{$josaRo} {$commandName} 실패."; } - public function run():bool{ - if(!$this->isRunnable()){ + public function run(): bool + { + if (!$this->hasFullConditionMet()) { throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } @@ -129,14 +154,14 @@ class che_이동 extends Command\GeneralCommand{ $general->setVar('city', $destCityID); - if($general->getVar('officer_level') == 12 && $this->nation['level'] == 0){ + if ($general->getVar('officer_level') == 12 && $this->nation['level'] == 0) { $generalList = $db->queryFirstColumn('SELECT no FROM general WHERE nation=%i AND no!=%i', $general->getNationID(), $general->getID()); - if($generalList){ + if ($generalList) { $db->update('general', [ - 'city'=>$destCityID + 'city' => $destCityID ], 'no IN %li', $generalList); } - foreach($generalList as $targetGeneralID){ + foreach ($generalList as $targetGeneralID) { $targetLogger = new ActionLogger($targetGeneralID, $general->getNationID(), $env['year'], $env['month']); $targetLogger->pushGeneralActionLog("방랑군 세력이 {$destCityName}{$josaRo} 이동했습니다.", ActionLogger::PLAIN); $targetLogger->flush(); @@ -168,17 +193,17 @@ class che_이동 extends Command\GeneralCommand{ ob_start(); ?> -
-선택된 도시로 이동합니다.
-인접 도시로만 이동이 가능합니다.
-목록을 선택하거나 도시를 클릭하세요.
- =>
-
-
- +
+ 선택된 도시로 이동합니다.
+ 인접 도시로만 이동이 가능합니다.
+ 목록을 선택하거나 도시를 클릭하세요.
+ =>
+
+
+ getCost(); - $this->runnableConstraints=[ + $this->fullConditionConstraints=[ ConstraintHelper::NotBeNeutral(), ConstraintHelper::NotWanderingNation(), ConstraintHelper::ReqGeneralGold($reqGold), @@ -51,7 +51,7 @@ class che_인재탐색 extends Command\GeneralCommand{ if($this->nation['nation'] != 0 && $relYear < 3 && $this->nation['gennum'] >= GameConst::$initialNationGenLimit){ $nationName = $this->nation['name']; $josaUn = JosaUtil::pick($nationName, '은'); - $this->runnableConstraints[] = ConstraintHelper::AlwaysFail("현재 {$nationName}{$josaUn} 탐색이 제한되고 있습니다."); + $this->fullConditionConstraints[] = ConstraintHelper::AlwaysFail("현재 {$nationName}{$josaUn} 탐색이 제한되고 있습니다."); } } @@ -84,7 +84,7 @@ class che_인재탐색 extends Command\GeneralCommand{ } public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/General/che_임관.php b/hwe/sammo/Command/General/che_임관.php index d9934e4b..04edccad 100644 --- a/hwe/sammo/Command/General/che_임관.php +++ b/hwe/sammo/Command/General/che_임관.php @@ -82,6 +82,22 @@ class che_임관 extends Command\GeneralCommand{ $this->setCity(); $this->setNation(); + $relYear = $env['year'] - $env['startyear']; + + $this->permissionConstraints=[ + ConstraintHelper::ReqEnvValue('join_mode', '!=', 'onlyRandom', '랜덤 임관만 가능합니다') + ]; + + $this->minConditionConstraints=[ + ConstraintHelper::ReqEnvValue('join_mode', '!=', 'onlyRandom', '랜덤 임관만 가능합니다'), + ConstraintHelper::BeNeutral(), + ConstraintHelper::AllowJoinAction() + ]; + + } + + protected function initWithArg() + { $destGeneralID = $this->arg['destGeneralID']??null; $destNationID = $this->arg['destNationID']??null; if($destGeneralID !== null){ @@ -92,13 +108,9 @@ class che_임관 extends Command\GeneralCommand{ $this->setDestNation($destNationID, ['gennum', 'scout']); } + $env = $this->env; $relYear = $env['year'] - $env['startyear']; - - $this->reservableConstraints=[ - ConstraintHelper::ReqEnvValue('join_mode', '!=', 'onlyRandom', '랜덤 임관만 가능합니다') - ]; - - $this->runnableConstraints=[ + $this->fullConditionConstraints=[ ConstraintHelper::ReqEnvValue('join_mode', '!=', 'onlyRandom', '랜덤 임관만 가능합니다'), ConstraintHelper::BeNeutral(), ConstraintHelper::ExistsDestNation(), @@ -107,11 +119,6 @@ class che_임관 extends Command\GeneralCommand{ ]; } - public function canDisplay(): bool - { - return ($this->env['join_mode']??'') != 'onlyRandom'; - } - public function getCost():array{ return [0, 0]; } @@ -132,7 +139,7 @@ class che_임관 extends Command\GeneralCommand{ } public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/General/che_장비매매.php b/hwe/sammo/Command/General/che_장비매매.php index c34c037d..ab8fda8e 100644 --- a/hwe/sammo/Command/General/che_장비매매.php +++ b/hwe/sammo/Command/General/che_장비매매.php @@ -63,14 +63,23 @@ class che_장비매매 extends Command\GeneralCommand{ $this->setCity(); $this->setNation(); + $this->minConditionConstraints=[ + ConstraintHelper::ReqCityTrader($general->getVar('npc')), + ]; + } + + protected function initWithArg() + { + $general = $this->generalObj; + $itemType = $this->arg['itemType']; $itemTypeName = static::$itemMap[$itemType]; $itemCode = $this->arg['itemCode']; $itemClass = buildItemClass($itemCode); [$reqGold, $reqRice] = $this->getCost(); - - $this->runnableConstraints=[ + + $this->fullConditionConstraints=[ ConstraintHelper::ReqCityTrader($general->getVar('npc')), ConstraintHelper::ReqCityCapacity('secu', '치안 수치', $itemClass->getReqSecu()), ConstraintHelper::ReqGeneralGold($reqGold), @@ -78,15 +87,14 @@ class che_장비매매 extends Command\GeneralCommand{ ]; if($itemCode === 'None'){ - $this->runnableConstraints[] = ConstraintHelper::ReqGeneralValue($itemType, $itemTypeName, '!=', 'None'); + $this->fullConditionConstraints[] = ConstraintHelper::ReqGeneralValue($itemType, $itemTypeName, '!=', 'None'); } else if($itemCode == $general->getVar($itemType)){ - $this->runnableConstraints[] = ConstraintHelper::AlwaysFail('이미 가지고 있습니다.'); + $this->fullConditionConstraints[] = ConstraintHelper::AlwaysFail('이미 가지고 있습니다.'); } else if($itemType != 'item' && !buildItemClass($general->getVar($itemType))->isBuyable()){ - $this->runnableConstraints[] = ConstraintHelper::AlwaysFail('이미 진귀한 것을 가지고 있습니다.'); + $this->fullConditionConstraints[] = ConstraintHelper::AlwaysFail('이미 진귀한 것을 가지고 있습니다.'); } - } public function getCost():array{ @@ -128,7 +136,7 @@ class che_장비매매 extends Command\GeneralCommand{ } public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/General/che_전투태세.php b/hwe/sammo/Command/General/che_전투태세.php index 9458505d..f6fbd890 100644 --- a/hwe/sammo/Command/General/che_전투태세.php +++ b/hwe/sammo/Command/General/che_전투태세.php @@ -37,7 +37,7 @@ class che_전투태세 extends Command\GeneralCommand{ [$reqGold, $reqRice] = $this->getCost(); - $this->runnableConstraints=[ + $this->fullConditionConstraints=[ ConstraintHelper::NotBeNeutral(), ConstraintHelper::NotWanderingNation(), ConstraintHelper::OccupiedCity(), @@ -65,7 +65,7 @@ class che_전투태세 extends Command\GeneralCommand{ } public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/General/che_정착장려.php b/hwe/sammo/Command/General/che_정착장려.php index f35f9977..b3eeb25a 100644 --- a/hwe/sammo/Command/General/che_정착장려.php +++ b/hwe/sammo/Command/General/che_정착장려.php @@ -44,7 +44,7 @@ class che_정착장려 extends Command\GeneralCommand{ [$reqGold, $reqRice] = $this->getCost(); - $this->runnableConstraints=[ + $this->fullConditionConstraints=[ ConstraintHelper::NotBeNeutral(), ConstraintHelper::NotWanderingNation(), ConstraintHelper::OccupiedCity(), @@ -118,7 +118,7 @@ class che_정착장려 extends Command\GeneralCommand{ } public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/General/che_주민선정.php b/hwe/sammo/Command/General/che_주민선정.php index 7373a82d..988f8f4c 100644 --- a/hwe/sammo/Command/General/che_주민선정.php +++ b/hwe/sammo/Command/General/che_주민선정.php @@ -44,7 +44,7 @@ class che_주민선정 extends Command\GeneralCommand{ [$reqGold, $reqRice] = $this->getCost(); - $this->runnableConstraints=[ + $this->fullConditionConstraints=[ ConstraintHelper::NotBeNeutral(), ConstraintHelper::NotWanderingNation(), ConstraintHelper::OccupiedCity(), @@ -119,7 +119,7 @@ class che_주민선정 extends Command\GeneralCommand{ } public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/General/che_증여.php b/hwe/sammo/Command/General/che_증여.php index c078eb5a..d6744aa8 100644 --- a/hwe/sammo/Command/General/che_증여.php +++ b/hwe/sammo/Command/General/che_증여.php @@ -1,9 +1,13 @@ arg === null){ + protected function argTest(): bool + { + if ($this->arg === null) { return false; } //NOTE: 사망 직전에 '증여' 턴을 넣을 수 있으므로, 존재하지 않는 장수여도 argTest에서 바로 탈락시키지 않음 - if(!key_exists('isGold', $this->arg)){ + if (!key_exists('isGold', $this->arg)) { return false; } - if(!key_exists('amount', $this->arg)){ + if (!key_exists('amount', $this->arg)) { return false; } - if(!key_exists('destGeneralID', $this->arg)){ + if (!key_exists('destGeneralID', $this->arg)) { return false; } $isGold = $this->arg['isGold']; $amount = $this->arg['amount']; $destGeneralID = $this->arg['destGeneralID']; - if(!is_numeric($amount)){ + if (!is_numeric($amount)) { return false; } $amount = Util::round($amount, -2); $amount = Util::valueFit($amount, 100, GameConst::$maxResourceActionAmount); - if($amount <= 0){ + if ($amount <= 0) { return false; } - if(!is_bool($isGold)){ + if (!is_bool($isGold)) { return false; } - if(!is_int($destGeneralID)){ + if (!is_int($destGeneralID)) { return false; } - if($destGeneralID <= 0){ + if ($destGeneralID <= 0) { return false; } - if($destGeneralID == $this->generalObj->getID()){ + if ($destGeneralID == $this->generalObj->getID()) { return false; } $this->arg = [ - 'isGold'=>$isGold, - 'amount'=>$amount, - 'destGeneralID'=>$destGeneralID + 'isGold' => $isGold, + 'amount' => $amount, + 'destGeneralID' => $destGeneralID ]; return true; } - protected function init(){ + protected function init() + { $general = $this->generalObj; $this->setCity(); $this->setNation(); + $this->minConditionConstraints = [ + ConstraintHelper::NotBeNeutral(), + ConstraintHelper::OccupiedCity(), + ConstraintHelper::SuppliedCity(), + ]; + } + + protected function initWithArg() + { $destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], ['gold', 'rice', 'nation'], 1); $this->setDestGeneral($destGeneral); - - $this->runnableConstraints=[ - ConstraintHelper::NotBeNeutral(), + + $this->fullConditionConstraints = [ + ConstraintHelper::NotBeNeutral(), ConstraintHelper::OccupiedCity(), ConstraintHelper::SuppliedCity(), ConstraintHelper::ExistsDestGeneral(), ConstraintHelper::FriendlyDestGeneral() ]; - if($this->arg['isGold']){ - $this->runnableConstraints[] = ConstraintHelper::ReqGeneralGold(GameConst::$generalMinimumGold); + if ($this->arg['isGold']) { + $this->fullConditionConstraints[] = ConstraintHelper::ReqGeneralGold(GameConst::$generalMinimumGold); + } else { + $this->fullConditionConstraints[] = ConstraintHelper::ReqGeneralRice(GameConst::$generalMinimumRice); } - else{ - $this->runnableConstraints[] = ConstraintHelper::ReqGeneralRice(GameConst::$generalMinimumRice); - } - } - public function getCommandDetailTitle():string{ + public function getCommandDetailTitle(): string + { $name = $this->getName(); return "{$name}(통솔경험)"; } - public function getCost():array{ + public function getCost(): array + { return [0, 0]; } - - public function getPreReqTurn():int{ + + public function getPreReqTurn(): int + { return 0; } - public function getPostReqTurn():int{ + public function getPostReqTurn(): int + { return 0; } public function getBrief(): string { $destGeneralName = $this->destGeneralObj->getName(); - $resText = $this->arg['isGold']?'금':'쌀'; + $resText = $this->arg['isGold'] ? '금' : '쌀'; $name = $this->getName(); return "【{$destGeneralName}】에게 {$resText} {$this->arg['amount']}을 {$name}"; } - public function run():bool{ - if(!$this->isRunnable()){ + public function run(): bool + { + if (!$this->hasFullConditionMet()) { throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } @@ -134,13 +153,13 @@ class che_증여 extends Command\GeneralCommand{ $isGold = $this->arg['isGold']; $amount = $this->arg['amount']; - $resKey = $isGold?'gold':'rice'; - $resName = $isGold?'금':'쌀'; + $resKey = $isGold ? 'gold' : 'rice'; + $resName = $isGold ? '금' : '쌀'; $destGeneral = $this->destGeneralObj; - - $amount = Util::valueFit($amount, 0, $general->getVar($resKey) - ($isGold?GameConst::$generalMinimumGold:GameConst::$generalMinimumRice)); + + $amount = Util::valueFit($amount, 0, $general->getVar($resKey) - ($isGold ? GameConst::$generalMinimumGold : GameConst::$generalMinimumRice)); $amountText = number_format($amount, 0); - + $logger = $general->getLogger(); $destGeneral->increaseVarWithLimit($resKey, $amount); @@ -169,35 +188,35 @@ class che_증여 extends Command\GeneralCommand{ //TODO: 암행부처럼 보여야... $db = DB::db(); - $destRawGenerals = $db->query('SELECT no,name,officer_level,npc,gold,rice FROM general WHERE nation != 0 AND nation = %i AND no != %i ORDER BY npc,binary(name)',$this->generalObj->getNationID(), $this->generalObj->getID()); + $destRawGenerals = $db->query('SELECT no,name,officer_level,npc,gold,rice FROM general WHERE nation != 0 AND nation = %i AND no != %i ORDER BY npc,binary(name)', $this->generalObj->getNationID(), $this->generalObj->getID()); ob_start(); ?> -자신의 자금이나 군량을 다른 장수에게 증여합니다.
-장수를 선택하세요.
- - -
+ 자신의 자금이나 군량을 다른 장수에게 증여합니다.
+ 장수를 선택하세요.
+ + +
getCost(); - $this->runnableConstraints=[ + $this->fullConditionConstraints=[ ConstraintHelper::NotBeNeutral(), ConstraintHelper::OccupiedCity(), ConstraintHelper::SuppliedCity(), @@ -65,7 +65,7 @@ class che_집합 extends Command\GeneralCommand{ } public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/General/che_징병.php b/hwe/sammo/Command/General/che_징병.php index 31913a39..36eca4ab 100644 --- a/hwe/sammo/Command/General/che_징병.php +++ b/hwe/sammo/Command/General/che_징병.php @@ -1,18 +1,24 @@ arg === null){ + protected function argTest(): bool + { + if ($this->arg === null) { return false; } - if(!key_exists('crewType', $this->arg)){ + if (!key_exists('crewType', $this->arg)) { return false; } - if(!key_exists('amount', $this->arg)){ + if (!key_exists('amount', $this->arg)) { return false; } $crewType = $this->arg['crewType']; $amount = $this->arg['amount']; - if(!is_int($crewType)){ + if (!is_int($crewType)) { return false; } - if(!is_numeric($amount)){ + if (!is_numeric($amount)) { return false; } - $amount = (int)$amount; + $amount = (int) $amount; - if(GameUnitConst::byID($crewType) === null){ + if (GameUnitConst::byID($crewType) === null) { return false; } - if($amount < 0){ + if ($amount < 0) { return false; } $this->arg = [ - 'crewType'=>$crewType, - 'amount'=>$amount + 'crewType' => $crewType, + 'amount' => $amount ]; return true; } - protected function init(){ - $general = $this->generalObj; - + protected function init() + { $this->setCity(); $this->setNation(['tech']); + $this->minConditionConstraints = [ + ConstraintHelper::NotBeNeutral(), + ConstraintHelper::OccupiedCity(), + ConstraintHelper::ReqCityCapacity('pop', '주민', GameConst::$minAvailableRecruitPop + 100), + ConstraintHelper::ReqCityTrust(20), + ]; + } + + protected function initWithArg() + { + $general = $this->generalObj; + $leadership = $general->getLeadership(false); $currCrewType = $general->getCrewTypeObj(); $maxCrew = $leadership * 100; $reqCrewType = GameUnitConst::byID($this->arg['crewType']); - if($reqCrewType->id == $currCrewType->id){ + if ($reqCrewType->id == $currCrewType->id) { $maxCrew -= $general->getVar('crew'); } $this->maxCrew = Util::valueFit($this->arg['amount'], 100, $maxCrew); @@ -100,9 +119,9 @@ class che_징병 extends Command\GeneralCommand{ $this->currCrewType = $currCrewType; [$reqGold, $reqRice] = $this->getCost(); - - $this->runnableConstraints=[ - ConstraintHelper::NotBeNeutral(), + + $this->fullConditionConstraints = [ + ConstraintHelper::NotBeNeutral(), ConstraintHelper::OccupiedCity(), ConstraintHelper::ReqCityCapacity('pop', '주민', GameConst::$minAvailableRecruitPop + $reqCrew), ConstraintHelper::ReqCityTrust(20), @@ -111,26 +130,28 @@ class che_징병 extends Command\GeneralCommand{ ConstraintHelper::ReqGeneralCrewMargin($reqCrewType->id), ConstraintHelper::AvailableRecruitCrewType($reqCrewType->id) ]; - } - public function getBrief():string{ + public function getBrief(): string + { $crewTypeName = $this->reqCrewType->name; $amount = $this->reqCrew; $commandName = static::getName(); return "【{$crewTypeName}】 {$amount}명 {$commandName}"; } - public function getCommandDetailTitle():string{ + public function getCommandDetailTitle(): string + { return "{$this->getName()}(통솔경험)"; } - public function getCost():array{ - if(!$this->isArgValid){ + public function getCost(): array + { + if (!$this->isArgValid) { return [0, 0]; } $reqGold = $this->reqCrewType->costWithTech($this->nation['tech'], $this->maxCrew); - $reqGold = $this->generalObj->onCalcDomestic('징병', 'cost', $reqGold, ['armType'=>$this->reqCrewType->armType]); + $reqGold = $this->generalObj->onCalcDomestic('징병', 'cost', $reqGold, ['armType' => $this->reqCrewType->armType]); $reqGold *= static::$costOffset; $reqRice = $this->maxCrew / 100; @@ -138,17 +159,20 @@ class che_징병 extends Command\GeneralCommand{ $reqRice = Util::round($reqRice); return [$reqGold, $reqRice]; } - - public function getPreReqTurn():int{ + + public function getPreReqTurn(): int + { return 0; } - public function getPostReqTurn():int{ + public function getPostReqTurn(): int + { return 0; } - public function run():bool{ - if(!$this->isRunnable()){ + public function run(): bool + { + if (!$this->hasFullConditionMet()) { throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } @@ -168,7 +192,7 @@ class che_징병 extends Command\GeneralCommand{ $logger = $general->getLogger(); - if($reqCrewType->id == $currCrewType->id && $currCrew > 0){ + if ($reqCrewType->id == $currCrewType->id && $currCrew > 0) { $logger->pushGeneralActionLog("{$crewTypeName} {$reqCrewText}명을 추가{$this->getName()}했습니다. <1>$date"); $train = ($currCrew * $general->getVar('train') + $reqCrew * static::$defaultTrain) / ($currCrew + $reqCrew); $atmos = ($currCrew * $general->getVar('atmos') + $reqCrew * static::$defaultAtmos) / ($currCrew + $reqCrew); @@ -176,8 +200,7 @@ class che_징병 extends Command\GeneralCommand{ $general->increaseVar('crew', $reqCrew); $general->setVar('train', $train); $general->setVar('atmos', $atmos); - } - else{ + } else { $logger->pushGeneralActionLog("{$crewTypeName} {$reqCrewText}명을 {$this->getName()}했습니다. <1>$date"); $general->setVar('crewtype', $reqCrewType->id); $general->setVar('crew', $reqCrew); @@ -188,10 +211,10 @@ class che_징병 extends Command\GeneralCommand{ $newTrust = Util::valueFit($this->city['trust'] - ($reqCrew / $this->city['pop']) / static::$costOffset * 100, 0); $db->update('city', [ - 'trust'=>$newTrust, - 'pop'=>$this->city['pop'] - $reqCrew + 'trust' => $newTrust, + 'pop' => $this->city['pop'] - $reqCrew ], 'city=%i', $general->getCityID()); - + $exp = Util::round($reqCrew / 100); $ded = Util::round($reqCrew / 100); @@ -219,7 +242,7 @@ class che_징병 extends Command\GeneralCommand{ 'js/recruitCrewForm.js' ]; } - + public function getForm(): string { $db = DB::db(); @@ -227,74 +250,72 @@ class che_징병 extends Command\GeneralCommand{ $general = $this->generalObj; [$nationLevel, $tech] = $db->queryFirstList('SELECT level,tech FROM nation WHERE nation=%i', $general->getNationID()); - if(!$nationLevel){ + if (!$nationLevel) { $nationLevel = 0; } - - if(!$tech){ + + if (!$tech) { $tech = 0; } - + $ownCities = []; $ownRegions = []; $year = $this->env['year']; $startyear = $this->env['startyear']; - + $relativeYear = $year - $startyear; - - foreach(DB::db()->query('SELECT city, region from city where nation = %i', $general->getNationID()) as $city){ + + foreach (DB::db()->query('SELECT city, region from city where nation = %i', $general->getNationID()) as $city) { $ownCities[$city['city']] = 1; $ownRegions[$city['region']] = 1; } - + $leadership = $general->getLeadership(); $fullLeadership = $general->getLeadership(false); $abil = getTechAbil($tech); - + $armTypes = []; - - foreach(GameUnitConst::allType() as $armType => $armName){ + + foreach (GameUnitConst::allType() as $armType => $armName) { $armTypeCrews = []; - - foreach(GameUnitConst::byType($armType) as $unit){ + + foreach (GameUnitConst::byType($armType) as $unit) { $crewObj = new \stdClass; $crewObj->showDefault = 'true'; $crewObj->id = $unit->id; - if($unit->reqTech == 0){ + if ($unit->reqTech == 0) { $crewObj->bgcolor = 'green'; - } - else{ + } else { $crewObj->bgcolor = 'limegreen'; } - if(!$unit->isValid($ownCities, $ownRegions, $relativeYear, $tech)){ + if (!$unit->isValid($ownCities, $ownRegions, $relativeYear, $tech)) { $crewObj->showDefault = 'false'; $crewObj->bgcolor = 'red'; } - - $crewObj->baseRice = $general->onCalcDomestic($this->getName(), 'rice', $unit->riceWithTech($tech), ['armType'=>$unit->armType]); - $crewObj->baseCost = $general->onCalcDomestic($this->getName(), 'cost', $unit->costWithTech($tech), ['armType'=>$unit->armType]); - + + $crewObj->baseRice = $general->onCalcDomestic($this->getName(), 'rice', $unit->riceWithTech($tech), ['armType' => $unit->armType]); + $crewObj->baseCost = $general->onCalcDomestic($this->getName(), 'cost', $unit->costWithTech($tech), ['armType' => $unit->armType]); + $crewObj->name = $unit->name; $crewObj->attack = $unit->attack + $abil; $crewObj->defence = $unit->defence + $abil; $crewObj->speed = $unit->speed; $crewObj->avoid = $unit->avoid; - if($this->env['show_img_level'] < 2) { - $crewObj->img = ServConfig::$sharedIconPath."/default.jpg"; + if ($this->env['show_img_level'] < 2) { + $crewObj->img = ServConfig::$sharedIconPath . "/default.jpg"; + } else { + $crewObj->img = ServConfig::$gameImagePath . "/crewtype" . $unit->id . ".png"; } - else{ - $crewObj->img = ServConfig::$gameImagePath."/crewtype".$unit->id.".png"; - } - + $crewObj->baseRiceShort = round($crewObj->baseRice, 1); $crewObj->baseCostShort = round($crewObj->baseCost, 1); - + $crewObj->info = join('
', $unit->info); - - + + $armTypeCrews[] = $crewObj; } $armTypes[] = [$armName, $armTypeCrews]; @@ -310,100 +331,90 @@ class che_징병 extends Command\GeneralCommand{ ob_start(); ?> -병사를 모집합니다. - -훈련과 사기치는 낮지만 가격이 저렴합니다.
- -훈련과 사기치는 높지만 자금이 많이 듭니다. - -가능한 수보다 많게 입력하면 가능한 최대 병사를 모집합니다.
-이미 병사가 있는 경우 추가되며, 병종이 다를경우는 기존의 병사는 소집해제됩니다.
-현재 가능한 병종은 녹색으로 표시되며,
-현재 가능한 특수병종은 초록색으로 표시됩니다.
+ 병사를 모집합니다. + + 훈련과 사기치는 낮지만 가격이 저렴합니다.
+ + 훈련과 사기치는 높지만 자금이 많이 듭니다. + + 가능한 수보다 많게 입력하면 가능한 최대 병사를 모집합니다.
+ 이미 병사가 있는 경우 추가되며, 병종이 다를경우는 기존의 병사는 소집해제됩니다.
+ 현재 가능한 병종은 녹색으로 표시되며,
+ 현재 가능한 특수병종은 초록색으로 표시됩니다.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
불가능한 병종 표시
- -
모병은 가격 2배의 자금이 소요됩니다.
- -
- 현재 기술력 : - 현재 통솔 : - 현재 병종 : name?> - 현재 병사 : - 현재 자금 : -
사진병종공격방어기동회피가격군량병사수행동특징
계열
name?>attack?>defence?>speed?>avoid?>baseCostShort?>baseRiceShort?> -
- 00명 - 원 - -
info?>
- - - - + + + +
불가능한 병종 표시
+ +
모병은 가격 2배의 자금이 소요됩니다.
+ + + + + + 현재 기술력 : + 현재 통솔 : + 현재 병종 : name ?> + 현재 병사 : + 현재 자금 : + + + + 사진 + 병종 + 공격 + 방어 + 기동 + 회피 + 가격 + 군량 + 병사수 + 행동 + 특징 + + + + + + 계열 + + + + + name ?> + attack ?> + defence ?> + speed ?> + avoid ?> + baseCostShort ?> + baseRiceShort ?> + +
+ 00명 + 원 + + + + info ?> + + + + + + + + + arg === null){ + protected function argTest(): bool + { + if ($this->arg === null) { return false; } - if(!key_exists('destCityID', $this->arg)){ + if (!key_exists('destCityID', $this->arg)) { return false; } - if(!key_exists($this->arg['destCityID'], CityConst::all())){ + if (!key_exists($this->arg['destCityID'], CityConst::all())) { return false; } $this->arg = [ - 'destCityID'=>$this->arg['destCityID'] + 'destCityID' => $this->arg['destCityID'] ]; return true; } - protected function init(){ + protected function init() + { $general = $this->generalObj; $this->setCity(); $this->setNation(['tech']); - $this->setDestCity($this->arg['destCityID'], null); - $this->setDestNation($this->destCity['nation'], ['tech']); [$reqGold, $reqRice] = $this->getCost(); - - $this->runnableConstraints=[ + + $this->minConditionConstraints = [ ConstraintHelper::NotOccupiedDestCity(), ConstraintHelper::ReqGeneralGold($reqGold), ConstraintHelper::ReqGeneralRice($reqRice), ]; } - public function getBrief():string{ + protected function initWithArg() + { + $this->setDestCity($this->arg['destCityID']); + $this->setDestNation($this->destCity['nation'], ['tech']); + + [$reqGold, $reqRice] = $this->getCost(); + + $this->fullConditionConstraints = [ + ConstraintHelper::NotOccupiedDestCity(), + ConstraintHelper::ReqGeneralGold($reqGold), + ConstraintHelper::ReqGeneralRice($reqRice), + ]; + } + + public function getBrief(): string + { $cityName = $this->destCity['name']; return "【{$cityName}】에 {$this->getName()} 실행"; } - public function getCommandDetailTitle():string{ + public function getCommandDetailTitle(): string + { $name = $this->getName(); [$reqGold, $reqRice] = $this->getCost(); $title = "{$name}(통솔경험"; - if($reqGold > 0){ + if ($reqGold > 0) { $title .= ", 자금{$reqGold}"; } - if($reqRice > 0){ + if ($reqRice > 0) { $title .= ", 군량{$reqRice}"; } $title .= ')'; return $title; } - public function getCost():array{ + public function getCost(): array + { $env = $this->env; return [$env['develcost'], $env['develcost']]; } - - public function getPreReqTurn():int{ + + public function getPreReqTurn(): int + { return 0; } - public function getPostReqTurn():int{ + public function getPostReqTurn(): int + { return 0; } - public function getFailString():string{ + public function getFailString(): string + { $commandName = $this->getName(); - $failReason = $this->testRunnable(); - if($failReason === null){ + $failReason = $this->testFullConditionMet(); + if ($failReason === null) { throw new \RuntimeException('실행 가능한 커맨드에 대해 실패 이유를 수집'); } $destCityName = CityConst::byID($this->arg['destCityID'])->name; return "{$failReason} {$destCityName}에 {$commandName} 실패."; } - public function run():bool{ - if(!$this->isRunnable()){ + public function run(): bool + { + if (!$this->hasFullConditionMet()) { throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } @@ -124,13 +150,13 @@ class che_첩보 extends Command\GeneralCommand{ $logger = $general->getLogger(); - $dist = searchDistance($general->getCityID(), 2, false)[$destCityID]??3; + $dist = searchDistance($general->getCityID(), 2, false)[$destCityID] ?? 3; $destCityGeneralList = $db->query('SELECT crew, crewtype FROM general WHERE city = %i AND nation = %i', $destCityID, $destNationID); $totalCrew = Util::arraySum($destCityGeneralList, 'crew'); $totalGenCnt = count($destCityGeneralList); $byCrewType = Util::arrayGroupBy($destCityGeneralList, 'crewtype'); - + $popText = number_format($destCity['pop']); $trustText = number_format($destCity['trust'], 1); $agriText = number_format($destCity['agri']); @@ -143,50 +169,43 @@ class che_첩보 extends Command\GeneralCommand{ $cityDevel = "【첩보】농업:{$agriText}, 상업:{$commText}, 치안:{$secuText}, 수비:{$defText}, 성벽:{$wallText}"; $logger->pushGeneralActionLog("누군가가 {$destCityName}{$josaUl} 살피는 것 같습니다."); - if($dist < 1){ + if ($dist < 1) { $logger->pushGeneralActionLog("{$destCityName}의 정보를 많이 얻었습니다. <1>$date"); $logger->pushGeneralActionLog($cityBrief, ActionLogger::RAWTEXT); $logger->pushGeneralActionLog($cityDevel, ActionLogger::RAWTEXT); - $logger->pushGeneralActionLog('【병종】 '. join(' ', Util::mapWithKey(function($crewType, $value){ + $logger->pushGeneralActionLog('【병종】 ' . join(' ', Util::mapWithKey(function ($crewType, $value) { $crewTypeText = mb_substr(GameUnitConst::byID($crewType)->name, 0, 2); $cnt = count($value); return "{$crewTypeText}:{$cnt}"; }, $destCityGeneralList)), ActionLogger::RAWTEXT); - if($this->destNation['nation'] && $general->getNationID()){ + if ($this->destNation['nation'] && $general->getNationID()) { $techDiff = floor($this->destNation['tech']) - floor($this->nation['tech']); - if($techDiff >= 1000){ + if ($techDiff >= 1000) { $techText = '↑압도'; - } - else if($techDiff >= 250){ + } else if ($techDiff >= 250) { $techText = '▲우위'; - } - else if($techDiff >= -250){ + } else if ($techDiff >= -250) { $techText = '↕대등'; - } - else if($techDiff >= -1000){ + } else if ($techDiff >= -1000) { $techText = '▼열위'; - } - else{ + } else { $techText = '↓미미'; } $logger->pushGeneralActionLog("【{$this->destNation['name']}】아국대비기술:{$techText}"); } - - } - else if($dist == 2){ + } else if ($dist == 2) { $logger->pushGeneralActionLog("{$destCityName}의 정보를 어느 정도 얻었습니다. <1>$date"); $logger->pushGeneralActionLog($cityBrief, ActionLogger::RAWTEXT); $logger->pushGeneralActionLog($cityDevel, ActionLogger::RAWTEXT); - } - else{ + } else { $logger->pushGeneralActionLog("{$destCityName}의 소문만 들을 수 있었습니다. <1>$date"); $logger->pushGeneralActionLog($cityBrief, ActionLogger::RAWTEXT); } $exp = Util::randRangeInt(1, 100); $ded = Util::randRangeInt(1, 70); - + [$reqGold, $reqRice] = $this->getCost(); $general->increaseVarWithLimit('gold', -$reqGold, 0); $general->increaseVarWithLimit('rice', -$reqRice, 0); @@ -212,19 +231,17 @@ class che_첩보 extends Command\GeneralCommand{ $currentCityID = $this->generalObj->getCityID(); ob_start(); ?> -
-선택된 도시에 첩보를 실행합니다.
-인접도시일 경우 많은 정보를 얻을 수 있습니다.
-목록을 선택하거나 도시를 클릭하세요.
-
-
-
- +
+ 선택된 도시에 첩보를 실행합니다.
+ 인접도시일 경우 많은 정보를 얻을 수 있습니다.
+ 목록을 선택하거나 도시를 클릭하세요.
+
+
+
+ arg === null){ + protected function argTest(): bool + { + if ($this->arg === null) { return false; } - if(!key_exists('destCityID', $this->arg)){ + if (!key_exists('destCityID', $this->arg)) { return false; } - if(!key_exists($this->arg['destCityID'], CityConst::all())){ + if (!key_exists($this->arg['destCityID'], CityConst::all())) { return false; } $this->arg = [ - 'destCityID'=>$this->arg['destCityID'] + 'destCityID' => $this->arg['destCityID'] ]; return true; } - protected function init(){ + protected function init() + { $general = $this->generalObj; $this->setCity(); $this->setNation(['war', 'gennum', 'tech', 'gold', 'rice', 'color', 'type', 'level', 'capital']); - $this->setDestCity($this->arg['destCityID'], null); [$reqGold, $reqRice] = $this->getCost(); $relYear = $this->env['year'] - $this->env['startyear']; + + $this->minConditionConstraints = [ + ConstraintHelper::NotOpeningPart($relYear+1), + ConstraintHelper::NotBeNeutral(), + ConstraintHelper::OccupiedCity(), + ConstraintHelper::ReqGeneralCrew(), + ConstraintHelper::ReqGeneralRice($reqRice), + ]; + - $this->runnableConstraints=[ + } + + protected function initWithArg() + { + $this->setDestCity($this->arg['destCityID']); + + [$reqGold, $reqRice] = $this->getCost(); + $relYear = $this->env['year'] - $this->env['startyear']; + + $this->fullConditionConstraints = [ ConstraintHelper::NotOpeningPart($relYear), ConstraintHelper::NotSameDestCity(), ConstraintHelper::NotBeNeutral(), @@ -65,36 +89,42 @@ class che_출병 extends Command\GeneralCommand{ ]; } - public function getCommandDetailTitle():string{ + public function getCommandDetailTitle(): string + { $name = $this->getName(); //[$reqGold, $reqRice] = $this->getCost(); return "{$name}(통솔경험, 병종숙련, 군량↓)"; } - public function getCost():array{ - return [0, Util::round($this->generalObj->getVar('crew')/100)]; + public function getCost(): array + { + return [0, Util::round($this->generalObj->getVar('crew') / 100)]; } - - public function getPreReqTurn():int{ + + public function getPreReqTurn(): int + { return 0; } - public function getPostReqTurn():int{ + public function getPostReqTurn(): int + { return 0; } - public function getBrief():string{ + public function getBrief(): string + { $commandName = $this->getName(); $destCityName = CityConst::byID($this->arg['destCityID'])->name; $josaRo = JosaUtil::pick($destCityName, '로'); return "【{$destCityName}】{$josaRo} {$commandName}"; } - public function getFailString():string{ + public function getFailString(): string + { $commandName = $this->getName(); - $failReason = $this->testRunnable(); - if($failReason === null){ + $failReason = $this->testFullConditionMet(); + if ($failReason === null) { throw new \RuntimeException('실행 가능한 커맨드에 대해 실패 이유를 수집'); } $destCityName = CityConst::byID($this->arg['destCityID'])->name; @@ -102,8 +132,9 @@ class che_출병 extends Command\GeneralCommand{ return "{$failReason} {$destCityName}{$josaRo} {$commandName} 실패."; } - public function run():bool{ - if(!$this->isRunnable()){ + public function run(): bool + { + if (!$this->hasFullConditionMet()) { throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } @@ -117,10 +148,10 @@ class che_출병 extends Command\GeneralCommand{ $attackerCityID = $general->getCityID(); - + $finalTargetCityID = $this->destCity['city']; $finalTargetCityName = $this->destCity['name']; - + $logger = $general->getLogger(); @@ -136,62 +167,61 @@ class che_출병 extends Command\GeneralCommand{ do { //1: 최단 거리 도시 중 공격 대상이 있는가 확인 //2: 최단 거리 + 1 도시 중 공격 대상이 있는가 확인 - foreach($distanceList as $dist => $distCitiesInfo){ - if($dist > $minDist + 1){ + foreach ($distanceList as $dist => $distCitiesInfo) { + if ($dist > $minDist + 1) { break; } $currDist = $dist; - foreach($distCitiesInfo as [$distCityID, $distCityNation]){ - if($distCityNation !== $attackerNationID){ + foreach ($distCitiesInfo as [$distCityID, $distCityNation]) { + if ($distCityNation !== $attackerNationID) { $candidateCities[] = $distCityID; } } - if($candidateCities){ + if ($candidateCities) { break 2; } } //3: 최단 거리 도시 중 아군 도시 선택 - foreach($distanceList[$minDist] as [$distCityID, $distCityNation]){ - if($distCityNation === $attackerNationID){ + foreach ($distanceList[$minDist] as [$distCityID, $distCityNation]) { + if ($distCityNation === $attackerNationID) { $candidateCities[] = $distCityID; } } - }while(false); - - $defenderCityID = (int)Util::choiceRandom($candidateCities); + } while (false); + + $defenderCityID = (int) Util::choiceRandom($candidateCities); $defenderCityName = $this->destCity['name']; - $this->setDestCity($defenderCityID, null); + $this->setDestCity($defenderCityID); $josaRo = JosaUtil::pick($defenderCityName, '로'); - if($attackerNationID == $defenderNationID){ - $logger->pushGeneralActionLog("본국입니다. {$defenderCityName}{$josaRo} 으로 이동합니다. <1>$date"); - $this->alternative = new che_이동($general, $this->env, ['destCityID'=>$defenderCityID]); + if ($attackerNationID == $defenderNationID) { + $logger->pushGeneralActionLog("본국입니다. {$defenderCityName}{$josaRo} 으로 이동합니다. <1>$date"); + $this->alternative = new che_이동($general, $this->env, ['destCityID' => $defenderCityID]); return false; } - if($finalTargetCityID !== $defenderCityID){ + if ($finalTargetCityID !== $defenderCityID) { $josaRo = JosaUtil::pick($finalTargetCityName, '로'); $josaUl = JosaUtil::pick($defenderCityName, '을'); - if($minDist == $currDist){ + if ($minDist == $currDist) { $logger->pushGeneralActionLog("{$finalTargetCityName}{$josaRo} 가기 위해 {$defenderCityName}{$josaUl} 거쳐야 합니다. <1>$date"); - } - else{ + } else { $logger->pushGeneralActionLog("{$finalTargetCityName}{$josaRo} 가는 도중 {$defenderCityName}{$josaUl} 거치기로 합니다. <1>$date"); } } $db->update('city', [ - 'state'=>43, - 'term'=>3 + 'state' => 43, + 'term' => 3 ], 'city=%i', $defenderCityID); $this->destCity['state'] = 43; $this->destCity['term'] = 3; - $general->addDex($general->getCrewTypeObj(), $general->getVar('crew')/100); - + $general->addDex($general->getCrewTypeObj(), $general->getVar('crew') / 100); + $general->setResultTurn(new LastTurn(static::getName(), $this->arg)); $general->applyDB($db); @@ -200,7 +230,7 @@ class che_출병 extends Command\GeneralCommand{ tryUniqueItemLottery($general); $general->applyDB($db); - + return true; } @@ -216,17 +246,15 @@ class che_출병 extends Command\GeneralCommand{ $srcCityName = \sammo\CityConst::byID($this->generalObj->getCityID())->name; ob_start(); ?> -
-선택된 도시를 향해 침공을 합니다.
-침공 경로에 적군의 도시가 있다면 전투를 벌입니다.
-목록을 선택하거나 도시를 클릭하세요.
- =>
-
+
+ 선택된 도시를 향해 침공을 합니다.
+ 침공 경로에 적군의 도시가 있다면 전투를 벌입니다.
+ 목록을 선택하거나 도시를 클릭하세요.
+ =>
+
runnableConstraints=[ + $this->fullConditionConstraints=[ ConstraintHelper::NotBeNeutral(), ConstraintHelper::NotOpeningPart($relYear), ConstraintHelper::NotLord(), @@ -58,7 +58,7 @@ class che_하야 extends Command\GeneralCommand{ } public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/General/che_해산.php b/hwe/sammo/Command/General/che_해산.php index 30649a33..b7eb8b63 100644 --- a/hwe/sammo/Command/General/che_해산.php +++ b/hwe/sammo/Command/General/che_해산.php @@ -40,7 +40,7 @@ class che_해산 extends Command\GeneralCommand{ $this->setCity(); $this->setNation(['gennum']); - $this->runnableConstraints=[ + $this->fullConditionConstraints=[ ConstraintHelper::BeLord(), ConstraintHelper::WanderingNation(), ]; @@ -59,7 +59,7 @@ class che_해산 extends Command\GeneralCommand{ } public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/General/che_헌납.php b/hwe/sammo/Command/General/che_헌납.php index a56a39b8..cecd4e20 100644 --- a/hwe/sammo/Command/General/che_헌납.php +++ b/hwe/sammo/Command/General/che_헌납.php @@ -1,9 +1,12 @@ arg === null){ + protected function argTest(): bool + { + if ($this->arg === null) { return false; } - if(!key_exists('isGold', $this->arg)){ + if (!key_exists('isGold', $this->arg)) { return false; } - if(!key_exists('amount', $this->arg)){ + if (!key_exists('amount', $this->arg)) { return false; } $isGold = $this->arg['isGold']; $amount = $this->arg['amount']; - if(!is_numeric($amount)){ + if (!is_numeric($amount)) { return false; } $amount = Util::round($amount, -2); $amount = Util::valueFit($amount, 100, GameConst::$maxResourceActionAmount); - if(!is_bool($isGold)){ + if (!is_bool($isGold)) { return false; } $this->arg = [ - 'isGold'=>$isGold, - 'amount'=>$amount + 'isGold' => $isGold, + 'amount' => $amount ]; return true; } - protected function init(){ + protected function init() + { $general = $this->generalObj; $this->setCity(); $this->setNation(); - - $this->runnableConstraints=[ - ConstraintHelper::NotBeNeutral(), + + $this->minConditionConstraints = [ + ConstraintHelper::NotBeNeutral(), ConstraintHelper::OccupiedCity(), ConstraintHelper::SuppliedCity(), ]; - if($this->arg['isGold']){ - $this->runnableConstraints[] = ConstraintHelper::ReqGeneralGold(GameConst::$generalMinimumGold); - } - else{ - $this->runnableConstraints[] = ConstraintHelper::ReqGeneralRice(GameConst::$generalMinimumRice); - } + } + protected function initWithArg() + { + $this->fullConditionConstraints = [ + ConstraintHelper::NotBeNeutral(), + ConstraintHelper::OccupiedCity(), + ConstraintHelper::SuppliedCity(), + ]; + if ($this->arg['isGold']) { + $this->fullConditionConstraints[] = ConstraintHelper::ReqGeneralGold(GameConst::$generalMinimumGold); + } else { + $this->fullConditionConstraints[] = ConstraintHelper::ReqGeneralRice(GameConst::$generalMinimumRice); + } } public function getBrief(): string { - $resText = $this->arg['isGold']?'금':'쌀'; + $resText = $this->arg['isGold'] ? '금' : '쌀'; $name = $this->getName(); return "{$resText} {$this->arg['amount']}을 {$name}"; } - public function getCommandDetailTitle():string{ + public function getCommandDetailTitle(): string + { $name = $this->getName(); return "{$name}(통솔경험)"; } - public function getCost():array{ + public function getCost(): array + { return [0, 0]; } - - public function getPreReqTurn():int{ + + public function getPreReqTurn(): int + { return 0; } - public function getPostReqTurn():int{ + public function getPostReqTurn(): int + { return 0; } - public function run():bool{ - if(!$this->isRunnable()){ + public function run(): bool + { + if (!$this->hasFullConditionMet()) { throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } @@ -110,16 +128,16 @@ class che_헌납 extends Command\GeneralCommand{ $isGold = $this->arg['isGold']; $amount = $this->arg['amount']; - $resKey = $isGold?'gold':'rice'; - $resName = $isGold?'금':'쌀'; + $resKey = $isGold ? 'gold' : 'rice'; + $resName = $isGold ? '금' : '쌀'; $amount = Util::valueFit($amount, 0, $general->getVar($resKey)); $amountText = number_format($amount, 0); - + $logger = $general->getLogger(); $db->update('nation', [ - $resKey=>$db->sqleval('%b + %i', $resKey, $amount) + $resKey => $db->sqleval('%b + %i', $resKey, $amount) ], 'nation=%i', $general->getNationID()); $general->increaseVarWithLimit($resKey, -$amount, 0); @@ -144,17 +162,17 @@ class che_헌납 extends Command\GeneralCommand{ { ob_start(); ?> -자신의 자금이나 군량을 국가 재산으로 헌납합니다.
- -
+ 자신의 자금이나 군량을 국가 재산으로 헌납합니다.
+ +
arg === null){ + protected function argTest(): bool + { + if ($this->arg === null) { return false; } - if(!key_exists('destCityID', $this->arg)){ + if (!key_exists('destCityID', $this->arg)) { return false; } - if(!key_exists($this->arg['destCityID'], CityConst::all())){ + if (!key_exists($this->arg['destCityID'], CityConst::all())) { return false; } $this->arg = [ - 'destCityID'=>$this->arg['destCityID'] + 'destCityID' => $this->arg['destCityID'] ]; return true; } - protected function calcSabotageAttackProb():float{ + protected function calcSabotageAttackProb(): float + { $statType = static::$statType; $general = $this->generalObj; $nation = $this->nation; - if($statType === 'leadership'){ + if ($statType === 'leadership') { $genScore = $general->getLeadership(); - } - else if($statType === 'strength'){ + } else if ($statType === 'strength') { $genScore = $general->getStrength(); - } - else if($statType === 'intel'){ + } else if ($statType === 'intel') { $genScore = $general->getIntel(); - } - else{ + } else { throw new \sammo\MustNotBeReachedException(); } @@ -68,29 +72,27 @@ class che_화계 extends Command\GeneralCommand{ return $prob; } - protected function calcSabotageDefenceProb(array $destCityGeneralList):float{ + protected function calcSabotageDefenceProb(array $destCityGeneralList): float + { $statType = static::$statType; $destCity = $this->destCity; $destNation = $this->destNation; $destNationID = $destNation['nation']; $maxGenScore = 0; - foreach($destCityGeneralList as $destGeneral){ + foreach ($destCityGeneralList as $destGeneral) { /** @var General $destGeneral */ - if($destGeneral->getNationID() != $destNationID){ + if ($destGeneral->getNationID() != $destNationID) { continue; } - if($statType === 'leadership'){ + if ($statType === 'leadership') { $genScore = $destGeneral->getLeadership(); - } - else if($statType === 'strength'){ + } else if ($statType === 'strength') { $genScore = $destGeneral->getStrength(); - } - else if($statType === 'intel'){ + } else if ($statType === 'intel') { $genScore = $destGeneral->getIntel(); - } - else{ + } else { throw new \sammo\MustNotBeReachedException(); } $maxGenScore = max($maxGenScore, $genScore); @@ -103,17 +105,35 @@ class che_화계 extends Command\GeneralCommand{ return $prob; } - protected function init(){ + protected function init() + { $general = $this->generalObj; $this->setCity(); - $this->setDestCity($this->arg['destCityID'], null); //xxx: 이대로라면 메인 페이지 갱신시마다 DB query를 하게 된다. + + + [$reqGold, $reqRice] = $this->getCost(); + + $this->minConditionConstraints = [ + ConstraintHelper::NotBeNeutral(), + ConstraintHelper::OccupiedCity(), + ConstraintHelper::SuppliedCity(), + ConstraintHelper::ReqGeneralGold($reqGold), + ConstraintHelper::ReqGeneralRice($reqRice), + ]; + + + } + + protected function initWithArg() + { + $this->setDestCity($this->arg['destCityID']); $this->setDestNation($this->destCity['nation']); [$reqGold, $reqRice] = $this->getCost(); - - $this->runnableConstraints=[ + + $this->fullConditionConstraints = [ ConstraintHelper::NotBeNeutral(), ConstraintHelper::OccupiedCity(), ConstraintHelper::SuppliedCity(), @@ -128,58 +148,65 @@ class che_화계 extends Command\GeneralCommand{ ]; } - public function getCommandDetailTitle():string{ + public function getCommandDetailTitle(): string + { $name = $this->getName(); $statTypeBase = [ - 'leadership'=>'통솔경험', - 'strength'=>'무력경험', - 'intel'=>'지력경험', + 'leadership' => '통솔경험', + 'strength' => '무력경험', + 'intel' => '지력경험', ]; $statType = $statTypeBase[static::$statType]; [$reqGold, $reqRice] = $this->getCost(); $title = "{$name}({$statType}"; - if($reqGold > 0){ + if ($reqGold > 0) { $title .= ", 자금{$reqGold}"; } - if($reqRice > 0){ + if ($reqRice > 0) { $title .= ", 군량{$reqRice}"; } $title .= ')'; return $title; } - public function getCost():array{ + public function getCost(): array + { $env = $this->env; $cost = $env['develcost'] * 5; return [$cost, $cost]; } - - public function getPreReqTurn():int{ + + public function getPreReqTurn(): int + { return 0; } - public function getPostReqTurn():int{ + public function getPostReqTurn(): int + { return 0; } - public function getBrief():string{ + public function getBrief(): string + { $commandName = $this->getName(); $destCityName = CityConst::byID($this->arg['destCityID'])->name; return "【{$destCityName}】에 {$commandName}실행"; } - public function getFailString():string{ + public function getFailString(): string + { $commandName = $this->getName(); - $failReason = $this->testRunnable(); - if($failReason === null){ + $failReason = $this->testFullConditionMet(); + if ($failReason === null) { throw new \RuntimeException('실행 가능한 커맨드에 대해 실패 이유를 수집'); } $destCityName = CityConst::byID($this->arg['destCityID'])->name; return "{$failReason} {$destCityName}에 {$commandName} 실패."; } - protected function affectDestCity(int $injuryCount){ + protected function affectDestCity(int $injuryCount) + { $general = $this->generalObj; $date = $general->getTurnTime($general::TURNTIME_HM); @@ -198,9 +225,9 @@ class che_화계 extends Command\GeneralCommand{ $destCity['comm'] -= $commAmount; DB::db()->update('city', [ - 'state'=>32, - 'agri'=>$destCity['agri'], - 'comm'=>$destCity['comm'] + 'state' => 32, + 'agri' => $destCity['agri'], + 'comm' => $destCity['comm'] ], 'city=%i', $destCityID); $agriAmountText = number_format($agriAmount); @@ -217,8 +244,9 @@ class che_화계 extends Command\GeneralCommand{ ); } - public function run():bool{ - if(!$this->isRunnable()){ + public function run(): bool + { + if (!$this->hasFullConditionMet()) { throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } @@ -239,13 +267,13 @@ class che_화계 extends Command\GeneralCommand{ $logger = $general->getLogger(); - $dist = searchDistance($general->getCityID(), 5, false)[$destCityID]??99; + $dist = searchDistance($general->getCityID(), 5, false)[$destCityID] ?? 99; $destCityGeneralList = []; - + $cityGeneralID = $db->queryFirstColumn('SELECT no FROM general WHERE city = %i AND nation = %i', $destCityID, $destNationID); $destCityGeneralList = General::createGeneralObjListFromDB($cityGeneralID, ['name', 'city', 'nation', 'officer_level', 'leadership', 'horse', 'strength', 'weapon', 'intel', 'book', 'item', 'last_turn', 'injury', 'special', 'special2', 'injury', 'crew', 'atmos', 'train'], 2); - foreach($destCityGeneralList as &$destCityGeneral){ + foreach ($destCityGeneralList as &$destCityGeneral) { $destCityGeneral->setRawCity($this->destCity); unset($destCityGeneral); } @@ -255,7 +283,7 @@ class che_화계 extends Command\GeneralCommand{ $prob = GameConst::$sabotageDefaultProb + $this->calcSabotageAttackProb() - $this->calcSabotageDefenceProb($destCityGeneralList); $prob /= $dist; - if(!Util::randBool($prob)){ + if (!Util::randBool($prob)) { $josaYi = JosaUtil::pick($commandName, '이'); $logger->pushGeneralActionLog("{$destCityName}에 {$commandName}{$josaYi} 실패했습니다. <1>$date"); @@ -267,7 +295,7 @@ class che_화계 extends Command\GeneralCommand{ $general->increaseVarWithLimit('rice', -$reqRice, 0); $general->addExperience($exp); $general->addDedication($ded); - $general->increaseVar($statType.'_exp', 1); + $general->increaseVar($statType . '_exp', 1); $general->setResultTurn(new LastTurn(static::getName(), $this->arg)); $general->checkStatChange(); @@ -275,17 +303,16 @@ class che_화계 extends Command\GeneralCommand{ return false; } - if(static::$injuryGeneral){ + if (static::$injuryGeneral) { $injuryCount = \sammo\SabotageInjury($destCityGeneralList, '계략'); - } - else{ + } else { $injuryCount = 0; } $this->affectDestCity($injuryCount); $itemObj = $general->getItem(); - if($itemObj->isConsumableNow('GeneralCommand', '계략') && $itemObj->isConsumableNow('GeneralCommand', '계략')){ + if ($itemObj->isConsumableNow('GeneralCommand', '계략') && $itemObj->isConsumableNow('GeneralCommand', '계략')) { $itemName = $itemObj->getName(); $itemRawName = $itemObj->getRawName(); $josaUl = JosaUtil::pick($itemRawName, '을'); @@ -295,13 +322,13 @@ class che_화계 extends Command\GeneralCommand{ $exp = Util::randRangeInt(201, 300); $ded = Util::randRangeInt(141, 210); - + [$reqGold, $reqRice] = $this->getCost(); $general->increaseVarWithLimit('gold', -$reqGold, 0); $general->increaseVarWithLimit('rice', -$reqRice, 0); $general->addExperience($exp); $general->addDedication($ded); - $general->increaseVar($statType.'_exp', 1); + $general->increaseVar($statType . '_exp', 1); $general->increaseRankVar('firenum', 1); $general->setResultTurn(new LastTurn(static::getName(), $this->arg)); $general->checkStatChange(); @@ -325,18 +352,16 @@ class che_화계 extends Command\GeneralCommand{ ob_start(); ?> -
-선택된 도시에 실행합니다.
-목록을 선택하거나 도시를 클릭하세요.
-
-
-
- +
+ 선택된 도시에 실행합니다.
+ 목록을 선택하거나 도시를 클릭하세요.
+
+
+
+ setCity(); $this->setNation(); - $this->runnableConstraints=[ + $this->fullConditionConstraints=[ ConstraintHelper::NotBeNeutral(), ConstraintHelper::NotWanderingNation(), ConstraintHelper::OccupiedCity(), @@ -73,7 +73,7 @@ class che_훈련 extends Command\GeneralCommand{ } public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/General/휴식.php b/hwe/sammo/Command/General/휴식.php index 2c07e0c6..68f7b97d 100644 --- a/hwe/sammo/Command/General/휴식.php +++ b/hwe/sammo/Command/General/휴식.php @@ -14,8 +14,10 @@ class 휴식 extends Command\GeneralCommand{ return true; } - protected function init(){ - $this->runnableConstraints=[]; + protected function init() + { + $this->minConditionConstraints=[]; + $this->fullConditionConstraints=[]; } public function getCost():array{ diff --git a/hwe/sammo/Command/Nation/che_감축.php b/hwe/sammo/Command/Nation/che_감축.php index 73f991b7..41e03a59 100644 --- a/hwe/sammo/Command/Nation/che_감축.php +++ b/hwe/sammo/Command/Nation/che_감축.php @@ -29,7 +29,6 @@ use sammo\Event\Action; class che_감축 extends Command\NationCommand{ static protected $actionName = '감축'; - static public $reqArg = false; protected function argTest():bool{ $this->arg = []; @@ -43,10 +42,10 @@ class che_감축 extends Command\NationCommand{ $env = $this->env; if($general->getNationID()===0){ - $this->reservableConstraints=[ + $this->permissionConstraints=[ ConstraintHelper::NotBeNeutral(), ]; - $this->runnableConstraints=[ + $this->fullConditionConstraints=[ ConstraintHelper::NotBeNeutral(), ]; return; @@ -54,13 +53,13 @@ class che_감축 extends Command\NationCommand{ $this->setCity(); $this->setNation(['gold', 'rice', 'capset', 'capital']); - $this->setDestCity($this->nation['capital'], null); + $this->setDestCity($this->nation['capital']); [$reqGold, $reqRice] = $this->getCost(); $origCityLevel = CityConst::byID($this->nation['capital'])->level; - $this->runnableConstraints=[ + $this->fullConditionConstraints=[ ConstraintHelper::OccupiedCity(), ConstraintHelper::BeChief(), ConstraintHelper::SuppliedCity(), @@ -136,7 +135,7 @@ class che_감축 extends Command\NationCommand{ } public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/Nation/che_급습.php b/hwe/sammo/Command/Nation/che_급습.php index f9f22e5e..918b872a 100644 --- a/hwe/sammo/Command/Nation/che_급습.php +++ b/hwe/sammo/Command/Nation/che_급습.php @@ -1,20 +1,25 @@ arg === null){ + protected function argTest(): bool + { + if ($this->arg === null) { return false; } //NOTE: 멸망 직전에 턴을 넣을 수 있으므로, 존재하지 않는 국가여도 argTest에서 바로 탈락시키지 않음 - if(!key_exists('destNationID', $this->arg)){ + if (!key_exists('destNationID', $this->arg)) { return false; } $destNationID = $this->arg['destNationID']; - if(!is_int($destNationID)){ + if (!is_int($destNationID)) { return false; } - if($destNationID < 1){ + if ($destNationID < 1) { return false; } $this->arg = [ - 'destNationID'=>$destNationID + 'destNationID' => $destNationID ]; return true; } - protected function init(){ + protected function init() + { $general = $this->generalObj; $env = $this->env; @@ -59,54 +67,71 @@ class che_급습 extends Command\NationCommand{ $this->setCity(); $this->setNation(['strategic_cmd_limit']); + + + $this->minConditionConstraints = [ + ConstraintHelper::OccupiedCity(), + ConstraintHelper::BeChief(), + ConstraintHelper::AvailableStrategicCommand(), + ]; + } + + protected function initWithArg() + { $this->setDestNation($this->arg['destNationID'], null); - - $this->runnableConstraints=[ + + $this->fullConditionConstraints = [ ConstraintHelper::OccupiedCity(), ConstraintHelper::BeChief(), ConstraintHelper::ExistsDestNation(), ConstraintHelper::AllowDiplomacyWithTerm( - 1, 12, + 1, + 12, '선포 12개월 이상인 상대국에만 가능합니다.' ), ConstraintHelper::AvailableStrategicCommand(), ]; - } - public function getCommandDetailTitle():string{ + public function getCommandDetailTitle(): string + { $name = $this->getName(); - $reqTurn = $this->getPreReqTurn()+1; + $reqTurn = $this->getPreReqTurn() + 1; $postReqTurn = $this->getPostReqTurn(); return "{$name}/{$reqTurn}턴(전략$postReqTurn)"; } - public function getCost():array{ + public function getCost(): array + { return [0, 0]; } - - public function getPreReqTurn():int{ + + public function getPreReqTurn(): int + { return 0; } - public function getPostReqTurn():int{ + public function getPostReqTurn(): int + { $genCount = Util::valueFit($this->nation['gennum'], GameConst::$initialNationGenLimit); - $nextTerm = Util::round(sqrt($genCount*16)*10); + $nextTerm = Util::round(sqrt($genCount * 16) * 10); $nextTerm = $this->generalObj->onCalcStrategic($this->getName(), 'delay', $nextTerm); return $nextTerm; } - public function getBrief():string{ + public function getBrief(): string + { $commandName = $this->getName(); $destNationName = getNationStaticInfo($this->arg['destNationID'])['name']; return "【{$destNationName}】에 {$commandName}"; } - public function run():bool{ - if(!$this->isRunnable()){ + public function run(): bool + { + if (!$this->hasFullConditionMet()) { throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } @@ -144,7 +169,7 @@ class che_급습 extends Command\NationCommand{ $broadcastMessage = "{$generalName}{$josaYi} {$destNationName}{$commandName}{$josaUl} 발동하였습니다."; $nationGeneralList = $db->queryFirstColumn('SELECT no FROM general WHERE nation=%i AND no != %i', $nationID, $generalID); - foreach($nationGeneralList as $nationGeneralID){ + foreach ($nationGeneralList as $nationGeneralID) { $nationGeneralLogger = new ActionLogger($nationGeneralID, $nationID, $year, $month); $nationGeneralLogger->pushGeneralActionLog($broadcastMessage, ActionLogger::PLAIN); $nationGeneralLogger->flush(); @@ -155,7 +180,7 @@ class che_급습 extends Command\NationCommand{ $broadcastMessage = "아국에 {$commandName}{$josaYiCommand} 발동되었습니다."; $destNationGeneralList = $db->queryFirstColumn('SELECT no FROM general WHERE nation=%i AND no != %i', $nationID, $generalID); - foreach($destNationGeneralList as $destNationGeneralID){ + foreach ($destNationGeneralList as $destNationGeneralID) { $destNationGeneralLogger = new ActionLogger($destNationGeneralID, $destNationID, $year, $month); $destNationGeneralLogger->pushGeneralActionLog($broadcastMessage, ActionLogger::PLAIN); $destNationGeneralLogger->flush(); @@ -166,12 +191,12 @@ class che_급습 extends Command\NationCommand{ $destNationLogger->flush(); $logger->pushNationalHistoryLog("{$generalName}{$josaYi} {$destNationName}{$commandName}{$josaUl} 발동"); - + $db->update('nation', [ 'strategic_cmd_limit' => $this->getPostReqTurn() ], 'nation=%i', $nationID); $db->update('diplomacy', [ - 'term'=>$db->sqleval('`term` - %i', 3), + 'term' => $db->sqleval('`term` - %i', 3), ], '(me = %i AND you = %i) OR (you = %i AND me = %i)', $nationID, $destNationID, $nationID, $destNationID); $general->applyDB($db); @@ -192,39 +217,35 @@ class che_급습 extends Command\NationCommand{ $nationID = $generalObj->getNationID(); $nationList = []; $testTurn = new LastTurn($this->getName(), null, $this->getPreReqTurn()); - foreach(getAllNationStaticInfo() as $destNation){ - if($destNation['nation'] == $nationID){ + foreach (getAllNationStaticInfo() as $destNation) { + if ($destNation['nation'] == $nationID) { continue; } - $testTurn->setArg(['destNationID'=>$destNation['nation']]); - $testCommand = new static($generalObj, $this->env, $testTurn, ['destNationID'=>$destNation['nation']]); - if($testCommand->isRunnable()){ + $testTurn->setArg(['destNationID' => $destNation['nation']]); + $testCommand = new static($generalObj, $this->env, $testTurn, ['destNationID' => $destNation['nation']]); + if ($testCommand->hasFullConditionMet()) { $destNation['availableCommand'] = true; - } - else{ + } else { $destNation['availableCommand'] = false; } $nationList[] = $destNation; } - ob_start(); + ob_start(); ?> -
-선택된 국가에 급습을 발동합니다.
-선포, 전쟁중인 상대국에만 가능합니다.
-상대 국가를 목록에서 선택하세요.
-배경색은 현재 급습 불가능 국가는 붉은색으로 표시됩니다.
- -
+ 선택된 국가에 급습을 발동합니다.
+ 선포, 전쟁중인 상대국에만 가능합니다.
+ 상대 국가를 목록에서 선택하세요.
+ 배경색은 현재 급습 불가능 국가는 붉은색으로 표시됩니다.
+ + arg === null){ + protected function argTest(): bool + { + if ($this->arg === null) { return false; } //NOTE: 사망 직전에 턴을 넣을 수 있으므로, 존재하지 않는 장수여도 argTest에서 바로 탈락시키지 않음 - if(!key_exists('isGold', $this->arg)){ + if (!key_exists('isGold', $this->arg)) { return false; } - if(!key_exists('amount', $this->arg)){ + if (!key_exists('amount', $this->arg)) { return false; } - if(!key_exists('destGeneralID', $this->arg)){ + if (!key_exists('destGeneralID', $this->arg)) { return false; } $isGold = $this->arg['isGold']; $amount = $this->arg['amount']; $destGeneralID = $this->arg['destGeneralID']; - if(!is_numeric($amount)){ + if (!is_numeric($amount)) { return false; } $amount = Util::round($amount, -2); $amount = Util::valueFit($amount, 100, GameConst::$maxResourceActionAmount); - if($amount <= 0){ + if ($amount <= 0) { return false; } - if(!is_bool($isGold)){ + if (!is_bool($isGold)) { return false; } - if(!is_int($destGeneralID)){ + if (!is_int($destGeneralID)) { return false; } - if($destGeneralID <= 0){ + if ($destGeneralID <= 0) { return false; } - if($destGeneralID == $this->generalObj->getID()){ + if ($destGeneralID == $this->generalObj->getID()) { return false; } $this->arg = [ - 'isGold'=>$isGold, - 'amount'=>$amount, - 'destGeneralID'=>$destGeneralID + 'isGold' => $isGold, + 'amount' => $amount, + 'destGeneralID' => $destGeneralID ]; return true; } - protected function init(){ + protected function init() + { $general = $this->generalObj; $env = $this->env; @@ -80,13 +87,27 @@ class che_몰수 extends Command\NationCommand{ $this->setCity(); $this->setNation(['gold', 'rice']); + $relYear = $env['year'] - $env['startyear']; + + $this->minConditionConstraints = [ + ConstraintHelper::NotBeNeutral(), + ConstraintHelper::OccupiedCity(), + ConstraintHelper::BeChief(), + ConstraintHelper::NotOpeningPart($relYear), + ConstraintHelper::SuppliedCity(), + ]; + } + + protected function initWithArg() + { $destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], ['gold', 'rice', 'npc', 'nation', 'imgsvr', 'picture'], 1); $this->setDestGeneral($destGeneral); + $env = $this->env; $relYear = $env['year'] - $env['startyear']; - - $this->runnableConstraints=[ - ConstraintHelper::NotBeNeutral(), + + $this->fullConditionConstraints = [ + ConstraintHelper::NotBeNeutral(), ConstraintHelper::OccupiedCity(), ConstraintHelper::BeChief(), ConstraintHelper::NotOpeningPart($relYear), @@ -95,32 +116,37 @@ class che_몰수 extends Command\NationCommand{ ConstraintHelper::FriendlyDestGeneral() ]; } - - public function getCost():array{ + + public function getCost(): array + { return [0, 0]; } - - public function getPreReqTurn():int{ + + public function getPreReqTurn(): int + { return 0; } - public function getPostReqTurn():int{ + public function getPostReqTurn(): int + { return 0; } - public function getBrief():string{ + public function getBrief(): string + { $isGold = $this->arg['isGold']; $amount = $this->arg['amount']; $amountText = number_format($amount, 0); - $resName = $isGold?'금':'쌀'; + $resName = $isGold ? '금' : '쌀'; $destGeneral = $this->destGeneralObj; $commandName = $this->getName(); return "【{$destGeneral->getName()}】 {$resName} $amountText {$commandName}"; } - public function run():bool{ - if(!$this->isRunnable()){ + public function run(): bool + { + if (!$this->hasFullConditionMet()) { throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } @@ -134,10 +160,10 @@ class che_몰수 extends Command\NationCommand{ $isGold = $this->arg['isGold']; $amount = $this->arg['amount']; - $resKey = $isGold?'gold':'rice'; - $resName = $isGold?'금':'쌀'; + $resKey = $isGold ? 'gold' : 'rice'; + $resName = $isGold ? '금' : '쌀'; $destGeneral = $this->destGeneralObj; - + $amount = Util::valueFit( $amount, 0, @@ -145,17 +171,17 @@ class che_몰수 extends Command\NationCommand{ ); $amountText = number_format($amount, 0); - if($destGeneral->getVar('npc') >= 2 && Util::randBool(0.01)){ + if ($destGeneral->getVar('npc') >= 2 && Util::randBool(0.01)) { $npcTexts = [ '몰수를 하다니... 이것이 윗사람이 할 짓이란 말입니까...', '사유재산까지 몰수해가면서 이 나라가 잘 될거라 믿습니까? 정말 이해할 수가 없군요...', '내 돈 내놔라! 내 돈! 몰수가 왠 말이냐!', '몰수해간 내 자금... 언젠가 몰래 다시 빼내올 것이다...', - '몰수로 인한 사기 저하는 몰수로 얻은 물자보다 더 손해란걸 모른단 말인가!' + '몰수로 인한 사기 저하는 몰수로 얻은 물자보다 더 손해란걸 모른단 말인가!' ]; $text = Util::choiceRandom($npcTexts); $src = new MessageTarget( - $destGeneral->getID(), + $destGeneral->getID(), $destGeneral->getName(), $nationID, $nation['name'], @@ -163,7 +189,7 @@ class che_몰수 extends Command\NationCommand{ GetImageURL($destGeneral->getVar('imgsvr'), $destGeneral->getVar('picture')) ); $msg = new Message( - Message::MSGTYPE_PUBLIC, + Message::MSGTYPE_PUBLIC, $src, $src, $text, @@ -173,12 +199,12 @@ class che_몰수 extends Command\NationCommand{ ); $msg->send(); } - + $logger = $general->getLogger(); $destGeneral->increaseVarWithLimit($resKey, -$amount, 0); $db->update('nation', [ - $resKey=>$db->sqleval('%b + %i', $resKey, $amount) + $resKey => $db->sqleval('%b + %i', $resKey, $amount) ], 'nation=%i', $nationID); $destGeneral->getLogger()->pushGeneralActionLog("{$resName} {$amountText}을 몰수 당했습니다.", ActionLogger::PLAIN); @@ -196,48 +222,48 @@ class che_몰수 extends Command\NationCommand{ //TODO: 암행부처럼 보여야... $db = DB::db(); - $destRawGenerals = $db->query('SELECT no,name,officer_level,npc,gold,rice FROM general WHERE nation = %i AND no != %i ORDER BY npc,binary(name)',$this->generalObj->getNationID(), $this->generalObj->getID()); + $destRawGenerals = $db->query('SELECT no,name,officer_level,npc,gold,rice FROM general WHERE nation = %i AND no != %i ORDER BY npc,binary(name)', $this->generalObj->getNationID(), $this->generalObj->getID()); $destGeneralList = []; - foreach($destRawGenerals as $destGeneral){ + foreach ($destRawGenerals as $destGeneral) { $nameColor = \sammo\getNameColor($destGeneral['npc']); - if($nameColor){ + if ($nameColor) { $nameColor = " style='color:{$nameColor}'"; } $name = $destGeneral['name']; - if($destGeneral['officer_level'] >= 5){ + if ($destGeneral['officer_level'] >= 5) { $name = "*{$name}*"; } $destGeneralList[] = [ - 'no'=>$destGeneral['no'], - 'color'=>$nameColor, - 'name'=>$name, - 'gold'=>$destGeneral['gold'], - 'rice'=>$destGeneral['rice'] + 'no' => $destGeneral['no'], + 'color' => $nameColor, + 'name' => $name, + 'gold' => $destGeneral['gold'], + 'rice' => $destGeneral['rice'] ]; } ob_start(); ?> -장수의 자금이나 군량을 몰수합니다.
-몰수한것은 국가재산으로 귀속됩니다.
- - - -
-
+ 장수의 자금이나 군량을 몰수합니다.
+ 몰수한것은 국가재산으로 귀속됩니다.
+ + + +
+
setCity(); $this->setNation(['gold', 'rice', 'surlimit']); + $this->minConditionConstraints=[ + ConstraintHelper::OccupiedCity(), + ConstraintHelper::BeChief(), + ConstraintHelper::SuppliedCity(), + ConstraintHelper::ReqNationValue('surlimit', '외교제한', '==', 0, '외교제한중입니다.'), + ]; + } + + protected function initWithArg() + { $destNationID = $this->arg['destNationID']; $this->setDestNation($destNationID, ['gold', 'rice', 'surlimit']); @@ -87,13 +97,13 @@ class che_물자원조 extends Command\NationCommand{ $limit = $this->nation['level'] * GameConst::$coefAidAmount; if($goldAmount > $limit || $riceAmount > $limit){ - $this->runnableConstraints[ + $this->fullConditionConstraints[ ConstraintHelper::AlwaysFail('작위 제한량 이상은 보낼 수 없습니다.') ]; return; } - - $this->runnableConstraints=[ + + $this->fullConditionConstraints=[ ConstraintHelper::ExistsDestNation(), ConstraintHelper::OccupiedCity(), ConstraintHelper::BeChief(), @@ -128,7 +138,7 @@ class che_물자원조 extends Command\NationCommand{ public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/Nation/che_발령.php b/hwe/sammo/Command/Nation/che_발령.php index 31aa0481..c496c8be 100644 --- a/hwe/sammo/Command/Nation/che_발령.php +++ b/hwe/sammo/Command/Nation/che_발령.php @@ -59,13 +59,23 @@ class che_발령 extends Command\NationCommand{ $this->setCity(); $this->setNation(); + + $this->minConditionConstraints=[ + ConstraintHelper::BeChief(), + ConstraintHelper::NotBeNeutral(), + ConstraintHelper::OccupiedCity(), + ConstraintHelper::SuppliedCity(), + ]; + } - $this->setDestCity($this->arg['destCityID'], null); + protected function initWithArg() + { + $this->setDestCity($this->arg['destCityID']); $destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], null, 1); $this->setDestGeneral($destGeneral); - - $this->runnableConstraints=[ + + $this->fullConditionConstraints=[ ConstraintHelper::BeChief(), ConstraintHelper::NotBeNeutral(), ConstraintHelper::OccupiedCity(), @@ -79,7 +89,7 @@ class che_발령 extends Command\NationCommand{ public function getFailString():string{ $commandName = $this->getName(); - $failReason = $this->testRunnable(); + $failReason = $this->testFullConditionMet(); if($failReason === null){ throw new \RuntimeException('실행 가능한 커맨드에 대해 실패 이유를 수집'); } @@ -109,7 +119,7 @@ class che_발령 extends Command\NationCommand{ public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/Nation/che_백성동원.php b/hwe/sammo/Command/Nation/che_백성동원.php index dea4ba87..628b6ae9 100644 --- a/hwe/sammo/Command/Nation/che_백성동원.php +++ b/hwe/sammo/Command/Nation/che_백성동원.php @@ -56,10 +56,20 @@ class che_백성동원 extends Command\NationCommand{ $this->setCity(); $this->setNation(['strategic_cmd_limit']); - $this->setDestCity($this->arg['destCityID'], null); - $this->setDestNation($this->destCity['nation']); - $this->runnableConstraints=[ + $this->minConditionConstraints=[ + ConstraintHelper::OccupiedCity(), + ConstraintHelper::BeChief(), + ConstraintHelper::AvailableStrategicCommand() + ]; + } + + protected function initWithArg() + { + $this->setDestCity($this->arg['destCityID']); + $this->setDestNation($this->destCity['nation']); + + $this->fullConditionConstraints=[ ConstraintHelper::OccupiedCity(), ConstraintHelper::BeChief(), ConstraintHelper::AllowDiplomacyStatus($this->generalObj->getNationID(), [ @@ -101,7 +111,7 @@ class che_백성동원 extends Command\NationCommand{ } public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/Nation/che_불가침수락.php b/hwe/sammo/Command/Nation/che_불가침수락.php index d57ce0bd..85500836 100644 --- a/hwe/sammo/Command/Nation/che_불가침수락.php +++ b/hwe/sammo/Command/Nation/che_불가침수락.php @@ -1,9 +1,13 @@ arg === null){ + protected function argTest(): bool + { + if ($this->arg === null) { return false; } - if(!key_exists('destNationID', $this->arg)){ + if (!key_exists('destNationID', $this->arg)) { return false; } $destNationID = $this->arg['destNationID']; - if(!is_int($destNationID)){ + if (!is_int($destNationID)) { return false; } - if($destNationID < 1){ + if ($destNationID < 1) { return false; } - if(!key_exists('destGeneralID', $this->arg)){ + if (!key_exists('destGeneralID', $this->arg)) { return false; } $destGeneralID = $this->arg['destGeneralID']; - if(!is_int($destGeneralID)){ + if (!is_int($destGeneralID)) { return false; } - if($destGeneralID <= 0){ + if ($destGeneralID <= 0) { return false; } - if($destGeneralID == $this->generalObj->getID()){ + if ($destGeneralID == $this->generalObj->getID()) { return false; } - if(!key_exists('year', $this->arg) || !key_exists('month', $this->arg) ){ + if (!key_exists('year', $this->arg) || !key_exists('month', $this->arg)) { return false; } $year = $this->arg['year']; $month = $this->arg['month']; - if(!is_int($year) || !is_int($month)){ + if (!is_int($year) || !is_int($month)) { return false; } - if($month < 1 || 12 < $month){ + if ($month < 1 || 12 < $month) { return false; } - if($year < $this->env['startyear']){ + if ($year < $this->env['startyear']) { return false; } $this->arg = [ - 'destNationID'=>$destNationID, - 'destGeneralID'=>$destGeneralID, - 'year'=>$year, - 'month'=>$month, + 'destNationID' => $destNationID, + 'destGeneralID' => $destGeneralID, + 'year' => $year, + 'month' => $month, ]; return true; } - protected function init(){ + protected function init() + { $general = $this->generalObj; - $env = $this->env; - $relYear = $env['year'] - $env['startyear']; - $this->setCity(); $this->setNation(); + $this->permissionConstraints = [ + ConstraintHelper::AlwaysFail('예약 불가능 커맨드') + ]; + } + + protected function initWithArg() + { + $env = $this->env; + $relYear = $env['year'] - $env['startyear']; + $destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], [], 1); $this->setDestGeneral($destGeneral); $this->setDestNation($this->arg['destNationID']); @@ -104,24 +118,20 @@ class che_불가침수락 extends Command\NationCommand{ $month = $this->arg['month']; $currentMonth = $env['year'] * 12 + $env['month'] - 1; - $reqMonth = $year *12 + $month - 1; + $reqMonth = $year * 12 + $month - 1; $nationID = $this->nation['nation']; - $this->reservableConstraints = [ - ConstraintHelper::AlwaysFail('예약 불가능 커맨드') - ]; - if ($reqMonth <= $currentMonth) { - $this->runnableConstraints = [ + $this->fullConditionConstraints = [ ConstraintHelper::AlwaysFail('이미 기한이 지났습니다.') ]; return; - } + } - $this->runnableConstraints=[ + $this->fullConditionConstraints = [ ConstraintHelper::BeChief(), - ConstraintHelper::NotBeNeutral(), + ConstraintHelper::NotBeNeutral(), ConstraintHelper::OccupiedCity(), ConstraintHelper::SuppliedCity(), ConstraintHelper::ExistsDestNation(), @@ -136,22 +146,25 @@ class che_불가침수락 extends Command\NationCommand{ 6 => '아국과 외교 진행중입니다.', ]), ]; - } - public function getCost():array{ + public function getCost(): array + { return [0, 0]; } - - public function getPreReqTurn():int{ + + public function getPreReqTurn(): int + { return 0; } - public function getPostReqTurn():int{ + public function getPostReqTurn(): int + { return 0; } - public function getBrief():string{ + public function getBrief(): string + { $commandName = $this->getName(); $destNationName = getNationStaticInfo($this->arg['destNationID'])['name']; $year = $this->arg['year']; @@ -159,8 +172,9 @@ class che_불가침수락 extends Command\NationCommand{ return "{$year}년 {$month}월까지 불가침 합의"; } - public function run():bool{ - if(!$this->isRunnable()){ + public function run(): bool + { + if (!$this->hasFullConditionMet()) { throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } @@ -182,17 +196,22 @@ class che_불가침수락 extends Command\NationCommand{ $logger = $general->getLogger(); $destLogger = $this->destGeneralObj->getLogger(); - - $currentMonth = $env['year'] * 12 + $env['month'] - 1; - $reqMonth = $year *12 + $month - 1; - $db->update('diplomacy',[ - 'state'=>7, - 'term'=>$reqMonth - $currentMonth - ], - '(me=%i AND you=%i) OR (you=%i AND me=%i)', - $nationID, $destNationID, - $nationID, $destNationID); + $currentMonth = $env['year'] * 12 + $env['month'] - 1; + $reqMonth = $year * 12 + $month - 1; + + $db->update( + 'diplomacy', + [ + 'state' => 7, + 'term' => $reqMonth - $currentMonth + ], + '(me=%i AND you=%i) OR (you=%i AND me=%i)', + $nationID, + $destNationID, + $nationID, + $destNationID + ); $josaWa = JosaUtil::pick($destNationName, '와'); $logger->pushGeneralActionLog("{$destNationName}{$josaWa} $year년 {$month}월까지 불가침에 성공했습니다.", ActionLogger::PLAIN); @@ -208,4 +227,4 @@ class che_불가침수락 extends Command\NationCommand{ return true; } -} \ No newline at end of file +} diff --git a/hwe/sammo/Command/Nation/che_불가침제의.php b/hwe/sammo/Command/Nation/che_불가침제의.php index 1fa6cc22..039ce590 100644 --- a/hwe/sammo/Command/Nation/che_불가침제의.php +++ b/hwe/sammo/Command/Nation/che_불가침제의.php @@ -1,9 +1,13 @@ arg === null){ + protected function argTest(): bool + { + if ($this->arg === null) { return false; } //NOTE: 멸망 직전에 턴을 넣을 수 있으므로, 존재하지 않는 국가여도 argTest에서 바로 탈락시키지 않음 - if(!key_exists('destNationID', $this->arg)){ + if (!key_exists('destNationID', $this->arg)) { return false; } $destNationID = $this->arg['destNationID']; - if(!is_int($destNationID)){ + if (!is_int($destNationID)) { return false; } - if($destNationID < 1){ + if ($destNationID < 1) { return false; } - if(!key_exists('year', $this->arg) || !key_exists('month', $this->arg) ){ + if (!key_exists('year', $this->arg) || !key_exists('month', $this->arg)) { return false; } $year = $this->arg['year']; $month = $this->arg['month']; - if(!is_int($year) || !is_int($month)){ + if (!is_int($year) || !is_int($month)) { return false; } - if($month < 1 || 12 < $month){ + if ($month < 1 || 12 < $month) { return false; } - if($year < $this->env['startyear']){ + if ($year < $this->env['startyear']) { return false; } $this->arg = [ - 'destNationID'=>$destNationID, - 'year'=>$year, - 'month'=>$month, + 'destNationID' => $destNationID, + 'year' => $year, + 'month' => $month, ]; return true; } - protected function init(){ + protected function init() + { $general = $this->generalObj; - $env = $this->env; - $relYear = $env['year'] - $env['startyear']; + $this->setCity(); $this->setNation(); + $this->minConditionConstraints = [ + ConstraintHelper::BeChief(), + ConstraintHelper::NotBeNeutral(), + ]; + } + + protected function initWithArg() + { $this->setDestNation($this->arg['destNationID'], null); //NOTE: 개월에서 기한으로 바뀜 $year = $this->arg['year']; $month = $this->arg['month']; + $env = $this->env; + + $relYear = $env['year'] - $env['startyear']; $currentMonth = $env['year'] * 12 + $env['month'] - 1; - $reqMonth = $year *12 + $month - 1; + $reqMonth = $year * 12 + $month - 1; $nationID = $this->nation['nation']; if ($reqMonth < $currentMonth + 12) { - $this->reservableConstraints = [ + $this->permissionConstraints = [ ConstraintHelper::AlwaysFail('기한은 1년 이상이어야 합니다.') ]; - $this->runnableConstraints = [ + $this->fullConditionConstraints = [ ConstraintHelper::AlwaysFail('기한은 1년 이상이어야 합니다.') ]; return; - } + } - $this->runnableConstraints=[ + $this->fullConditionConstraints = [ ConstraintHelper::BeChief(), - ConstraintHelper::NotBeNeutral(), + ConstraintHelper::NotBeNeutral(), ConstraintHelper::ExistsDestNation(), ConstraintHelper::DisallowDiplomacyBetweenStatus([ 0 => '아국과 이미 교전중입니다.', @@ -115,22 +132,25 @@ class che_불가침제의 extends Command\NationCommand{ 6 => '아국과 외교 진행중입니다.', ]), ]; - } - public function getCost():array{ + public function getCost(): array + { return [0, 0]; } - - public function getPreReqTurn():int{ + + public function getPreReqTurn(): int + { return 0; } - public function getPostReqTurn():int{ + public function getPostReqTurn(): int + { return 0; } - public function getBrief():string{ + public function getBrief(): string + { $commandName = $this->getName(); $destNationName = getNationStaticInfo($this->arg['destNationID'])['name']; $year = $this->arg['year']; @@ -139,8 +159,9 @@ class che_불가침제의 extends Command\NationCommand{ } - public function run():bool{ - if(!$this->isRunnable()){ + public function run(): bool + { + if (!$this->hasFullConditionMet()) { throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } @@ -169,7 +190,7 @@ class che_불가침제의 extends Command\NationCommand{ // 상대에게 발송 $src = new MessageTarget( - $general->getID(), + $general->getID(), $general->getName(), $nationID, $nationName, @@ -186,7 +207,7 @@ class che_불가침제의 extends Command\NationCommand{ $now = new \DateTime($date); $validUntil = new \DateTime($date); - $validMinutes = max(30, $env['turnterm']*3); + $validMinutes = max(30, $env['turnterm'] * 3); $validUntil->add(new \DateInterval("PT{$validMinutes}M")); $josaWa = JosaUtil::pick($nationName, '와'); @@ -199,9 +220,9 @@ class che_불가침제의 extends Command\NationCommand{ $now, $validUntil, [ - 'action'=>DiplomaticMessage::TYPE_NO_AGGRESSION, - 'year'=>$year, - 'month'=>$month, + 'action' => DiplomaticMessage::TYPE_NO_AGGRESSION, + 'year' => $year, + 'month' => $month, ] ); $msg->send(); @@ -224,7 +245,7 @@ class che_불가침제의 extends Command\NationCommand{ { $generalObj = $this->generalObj; $nationID = $generalObj->getNationID(); - + $db = DB::db(); $currYear = $this->env['year']; @@ -235,57 +256,52 @@ class che_불가침제의 extends Command\NationCommand{ ); $nationList = []; - foreach(getAllNationStaticInfo() as $destNation){ - if($destNation['nation'] == $nationID){ + foreach (getAllNationStaticInfo() as $destNation) { + if ($destNation['nation'] == $nationID) { continue; } $testCommand = new static($generalObj, $this->env, $this->getLastTurn(), [ - 'destNationID'=>$destNation['nation'], - 'year'=>$currYear+1, - 'month'=>12 + 'destNationID' => $destNation['nation'], + 'year' => $currYear + 1, + 'month' => 12 ]); - if(!$testCommand->isRunnable()){ + if (!$testCommand->hasFullConditionMet()) { $destNation['cssBgColor'] = 'background-color:red;'; - } - else if($diplomacyStatus[$destNation['nation']]['state'] == 7){ + } else if ($diplomacyStatus[$destNation['nation']]['state'] == 7) { $destNation['cssBgColor'] = 'background-color:blue;'; - } - else{ + } else { $destNation['cssBgColor'] = ''; } $nationList[] = $destNation; } - ob_start(); + ob_start(); ?> -
-타국에게 불가침을 제의합니다.
-제의할 국가를 목록에서 선택하세요.
-불가침 기한 다음 달부터 선포 가능합니다.
-배경색은 현재 제의가 불가능한 국가는 붉은색, 현재 불가침중인 국가는 푸른색으로 표시됩니다.
-
-에게 -년 -월까지 - +
+ 타국에게 불가침을 제의합니다.
+ 제의할 국가를 목록에서 선택하세요.
+ 불가침 기한 다음 달부터 선포 가능합니다.
+ 배경색은 현재 제의가 불가능한 국가는 붉은색, 현재 불가침중인 국가는 푸른색으로 표시됩니다.
+
+ 에게 + 년 + 월까지 + arg === null){ + protected function argTest(): bool + { + if ($this->arg === null) { return false; } - if(!key_exists('destNationID', $this->arg)){ + if (!key_exists('destNationID', $this->arg)) { return false; } $destNationID = $this->arg['destNationID']; - if(!is_int($destNationID)){ + if (!is_int($destNationID)) { return false; } - if($destNationID < 1){ + if ($destNationID < 1) { return false; } - if(!key_exists('destGeneralID', $this->arg)){ + if (!key_exists('destGeneralID', $this->arg)) { return false; } $destGeneralID = $this->arg['destGeneralID']; - if(!is_int($destGeneralID)){ + if (!is_int($destGeneralID)) { return false; } - if($destGeneralID <= 0){ + if ($destGeneralID <= 0) { return false; } - if($destGeneralID == $this->generalObj->getID()){ + if ($destGeneralID == $this->generalObj->getID()) { return false; } $this->arg = [ - 'destNationID'=>$destNationID, - 'destGeneralID'=>$destGeneralID, + 'destNationID' => $destNationID, + 'destGeneralID' => $destGeneralID, ]; return true; } - protected function init(){ - $general = $this->generalObj; - - $env = $this->env; - $relYear = $env['year'] - $env['startyear']; - + protected function init() + { $this->setCity(); $this->setNation(); + $this->permissionConstraints = [ + ConstraintHelper::AlwaysFail('예약 불가능 커맨드') + ]; + } + + protected function initWithArg() + { $destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], [], 1); $this->setDestGeneral($destGeneral); $this->setDestNation($this->arg['destNationID']); - $nationID = $this->nation['nation']; - $this->reservableConstraints = [ - ConstraintHelper::AlwaysFail('예약 불가능 커맨드') - ]; - - $this->runnableConstraints=[ + $this->fullConditionConstraints = [ ConstraintHelper::BeChief(), - ConstraintHelper::NotBeNeutral(), + ConstraintHelper::NotBeNeutral(), ConstraintHelper::ExistsDestNation(), ConstraintHelper::ExistsDestGeneral(), ConstraintHelper::ReqDestNationValue('nation', '소속', '==', $this->destGeneralObj->getNationID(), '제의 장수가 국가 소속이 아닙니다'), @@ -97,29 +101,33 @@ class che_불가침파기수락 extends Command\NationCommand{ '불가침 중인 상대국에게만 가능합니다.' ), ]; - } - public function getCost():array{ + public function getCost(): array + { return [0, 0]; } - - public function getPreReqTurn():int{ + + public function getPreReqTurn(): int + { return 0; } - public function getPostReqTurn():int{ + public function getPostReqTurn(): int + { return 0; } - public function getBrief():string{ + public function getBrief(): string + { $commandName = $this->getName(); $destNationName = getNationStaticInfo($this->arg['destNationID'])['name']; return "{$destNationName}국과 불가침 파기 합의"; } - public function run():bool{ - if(!$this->isRunnable()){ + public function run(): bool + { + if (!$this->hasFullConditionMet()) { throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } @@ -140,13 +148,18 @@ class che_불가침파기수락 extends Command\NationCommand{ $logger = $general->getLogger(); $destLogger = $this->destGeneralObj->getLogger(); - $db->update('diplomacy',[ - 'state'=>2, - 'term'=>0 - ], - '(me=%i AND you=%i) OR (you=%i AND me=%i)', - $nationID, $destNationID, - $nationID, $destNationID); + $db->update( + 'diplomacy', + [ + 'state' => 2, + 'term' => 0 + ], + '(me=%i AND you=%i) OR (you=%i AND me=%i)', + $nationID, + $destNationID, + $nationID, + $destNationID + ); $josaYiGeneral = JosaUtil::pick($generalName, '이'); $josaYiNation = JosaUtil::pick($nationName, '이'); @@ -168,4 +181,4 @@ class che_불가침파기수락 extends Command\NationCommand{ return true; } -} \ No newline at end of file +} diff --git a/hwe/sammo/Command/Nation/che_불가침파기제의.php b/hwe/sammo/Command/Nation/che_불가침파기제의.php index 6a8e3105..7cf511d1 100644 --- a/hwe/sammo/Command/Nation/che_불가침파기제의.php +++ b/hwe/sammo/Command/Nation/che_불가침파기제의.php @@ -60,9 +60,21 @@ class che_불가침파기제의 extends Command\NationCommand{ $this->setCity(); $this->setNation(); + + + $this->minConditionConstraints=[ + ConstraintHelper::BeChief(), + ConstraintHelper::NotBeNeutral(), + ConstraintHelper::OccupiedCity(), + ConstraintHelper::SuppliedCity(), + ]; + } + + protected function initWithArg() + { $this->setDestNation($this->arg['destNationID'], null); - $this->runnableConstraints=[ + $this->fullConditionConstraints=[ ConstraintHelper::BeChief(), ConstraintHelper::NotBeNeutral(), ConstraintHelper::OccupiedCity(), @@ -96,7 +108,7 @@ class che_불가침파기제의 extends Command\NationCommand{ public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/Nation/che_선전포고.php b/hwe/sammo/Command/Nation/che_선전포고.php index 2d9bbd2e..8ac468b3 100644 --- a/hwe/sammo/Command/Nation/che_선전포고.php +++ b/hwe/sammo/Command/Nation/che_선전포고.php @@ -1,20 +1,25 @@ arg === null){ + protected function argTest(): bool + { + if ($this->arg === null) { return false; } //NOTE: 멸망 직전에 턴을 넣을 수 있으므로, 존재하지 않는 국가여도 argTest에서 바로 탈락시키지 않음 - if(!key_exists('destNationID', $this->arg)){ + if (!key_exists('destNationID', $this->arg)) { return false; } $destNationID = $this->arg['destNationID']; - if(!is_int($destNationID)){ + if (!is_int($destNationID)) { return false; } - if($destNationID < 1){ + if ($destNationID < 1) { return false; } $this->arg = [ - 'destNationID'=>$destNationID + 'destNationID' => $destNationID ]; return true; } - protected function init(){ + protected function init() + { $general = $this->generalObj; $env = $this->env; - $relYear = $env['year'] - $env['startyear']; + $this->setCity(); $this->setNation(); - $this->setDestNation($this->arg['destNationID'], null); - - if($relYear < 3 - 2){ - $this->runnableConstraints = [ - ConstraintHelper::AlwaysFail('초반제한 해제 2년전부터 가능합니다.') - ]; - return; - } - - $this->runnableConstraints=[ + $startYear = $this->env['startyear']; + $this->minConditionConstraints = [ ConstraintHelper::BeChief(), - ConstraintHelper::NotBeNeutral(), + ConstraintHelper::NotBeNeutral(), ConstraintHelper::OccupiedCity(), ConstraintHelper::SuppliedCity(), + ConstraintHelper::ReqEnvValue('year', '>=', $startYear + 1, '초반제한 해제 2년전부터 가능합니다.'), + ]; + } + + protected function initWithArg() + { + $startYear = $this->env['startyear']; + + $this->setDestNation($this->arg['destNationID'], null); + + $this->fullConditionConstraints = [ + ConstraintHelper::BeChief(), + ConstraintHelper::NotBeNeutral(), + ConstraintHelper::OccupiedCity(), + ConstraintHelper::SuppliedCity(), + ConstraintHelper::ReqEnvValue('year', '>=', $startYear + 1, '초반제한 해제 2년전부터 가능합니다.'), ConstraintHelper::ExistsDestNation(), ConstraintHelper::NearNation(), ConstraintHelper::DisallowDiplomacyBetweenStatus([ @@ -86,30 +102,34 @@ class che_선전포고 extends Command\NationCommand{ 5 => '상대국이 외교 진행중입니다.' ]), ]; - } - public function getCost():array{ + public function getCost(): array + { return [0, 0]; } - - public function getPreReqTurn():int{ + + public function getPreReqTurn(): int + { return 0; } - public function getPostReqTurn():int{ + public function getPostReqTurn(): int + { return 0; } - public function getBrief():string{ + public function getBrief(): string + { $commandName = $this->getName(); $destNationName = getNationStaticInfo($this->arg['destNationID'])['name']; return "【{$destNationName}】에 {$commandName}"; } - public function run():bool{ - if(!$this->isRunnable()){ + public function run(): bool + { + if (!$this->hasFullConditionMet()) { throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } @@ -143,15 +163,15 @@ class che_선전포고 extends Command\NationCommand{ $logger->pushGlobalHistoryLog("【선포】{$nationName}{$josaYiNation} {$destNationName}에 선전 포고 하였습니다."); $db->update('diplomacy', [ - 'state'=>1, - 'term'=>24 + 'state' => 1, + 'term' => 24 ], '(me=%i AND you=%i) OR (me=%i AND you=%i)', $nationID, $destNationID, $destNationID, $nationID); //국메로 저장 $text = "【외교】{$env['year']}년 {$env['month']}월:{$nationName}에서 {$destNationName}에 선전포고"; $src = new MessageTarget( - $general->getID(), + $general->getID(), $general->getName(), $nationID, $nationName, @@ -166,7 +186,7 @@ class che_선전포고 extends Command\NationCommand{ $destNation['color'] ); $msg = new Message( - Message::MSGTYPE_NATIONAL, + Message::MSGTYPE_NATIONAL, $src, $dest, $text, @@ -197,40 +217,36 @@ class che_선전포고 extends Command\NationCommand{ $startYear = $this->env['startyear']; $availableYear = $startYear + 1; $nationList = []; - foreach(getAllNationStaticInfo() as $destNation){ - if($destNation['nation'] == $nationID){ + foreach (getAllNationStaticInfo() as $destNation) { + if ($destNation['nation'] == $nationID) { continue; } - $testCommand = new static($generalObj, $this->env, $this->getLastTurn(), ['destNationID'=>$destNation['nation']]); - if($testCommand->isRunnable()){ + $testCommand = new static($generalObj, $this->env, $this->getLastTurn(), ['destNationID' => $destNation['nation']]); + if ($testCommand->hasFullConditionMet()) { $destNation['availableWar'] = true; - } - else{ + } else { $destNation['availableWar'] = false; } $nationList[] = $destNation; } - ob_start(); + ob_start(); ?> -
-타국에게 선전 포고합니다.
-선전 포고할 국가를 목록에서 선택하세요.
-고립되지 않은 아국 도시에서 인접한 국가에 선포 가능합니다.
-초반제한 해제 2년전부터 선포가 가능합니다. (년 1월부터 가능)
-현재 선포가 불가능한 국가는 배경색이 붉은색으로 표시됩니다.
- - +
+ 타국에게 선전 포고합니다.
+ 선전 포고할 국가를 목록에서 선택하세요.
+ 고립되지 않은 아국 도시에서 인접한 국가에 선포 가능합니다.
+ 초반제한 해제 2년전부터 선포가 가능합니다. (년 1월부터 가능)
+ 현재 선포가 불가능한 국가는 배경색이 붉은색으로 표시됩니다.
+ + setCity(); $this->setNation(['strategic_cmd_limit']); - $this->setDestCity($this->arg['destCityID'], null); + + $this->minConditionConstraints=[ + ConstraintHelper::OccupiedCity(), + ConstraintHelper::BeChief(), + ConstraintHelper::AvailableStrategicCommand(), + ]; + } + + protected function initWithArg() + { + $this->setDestCity($this->arg['destCityID']); $this->setDestNation($this->destCity['nation']); - $this->runnableConstraints=[ + $this->fullConditionConstraints=[ ConstraintHelper::OccupiedCity(), ConstraintHelper::BeChief(), ConstraintHelper::NotNeutralDestCity(), @@ -101,7 +111,7 @@ class che_수몰 extends Command\NationCommand{ } public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/Nation/che_의병모집.php b/hwe/sammo/Command/Nation/che_의병모집.php index f38409c5..ef51c608 100644 --- a/hwe/sammo/Command/Nation/che_의병모집.php +++ b/hwe/sammo/Command/Nation/che_의병모집.php @@ -25,7 +25,6 @@ use \sammo\Constraint\ConstraintHelper; class che_의병모집 extends Command\NationCommand{ static protected $actionName = '의병모집'; - static public $reqArg = false; protected function argTest():bool{ $this->arg = null; @@ -41,7 +40,7 @@ class che_의병모집 extends Command\NationCommand{ $env = $this->env; $relYear = $env['year'] - $env['startyear']; - $this->runnableConstraints=[ + $this->fullConditionConstraints=[ ConstraintHelper::BeChief(), ConstraintHelper::NotBeNeutral(), ConstraintHelper::OccupiedCity(), @@ -75,7 +74,7 @@ class che_의병모집 extends Command\NationCommand{ } public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/Nation/che_이호경식.php b/hwe/sammo/Command/Nation/che_이호경식.php index cf8bd689..68e6fc61 100644 --- a/hwe/sammo/Command/Nation/che_이호경식.php +++ b/hwe/sammo/Command/Nation/che_이호경식.php @@ -1,20 +1,25 @@ arg === null){ + protected function argTest(): bool + { + if ($this->arg === null) { return false; } //NOTE: 멸망 직전에 턴을 넣을 수 있으므로, 존재하지 않는 국가여도 argTest에서 바로 탈락시키지 않음 - if(!key_exists('destNationID', $this->arg)){ + if (!key_exists('destNationID', $this->arg)) { return false; } $destNationID = $this->arg['destNationID']; - if(!is_int($destNationID)){ + if (!is_int($destNationID)) { return false; } - if($destNationID < 1){ + if ($destNationID < 1) { return false; } $this->arg = [ - 'destNationID'=>$destNationID + 'destNationID' => $destNationID ]; return true; } - protected function init(){ + protected function init() + { $general = $this->generalObj; $env = $this->env; @@ -59,9 +67,18 @@ class che_이호경식 extends Command\NationCommand{ $this->setCity(); $this->setNation(['strategic_cmd_limit']); + $this->minConditionConstraints = [ + ConstraintHelper::OccupiedCity(), + ConstraintHelper::BeChief(), + ConstraintHelper::AvailableStrategicCommand(), + ]; + } + + protected function initWithArg() + { $this->setDestNation($this->arg['destNationID'], null); - - $this->runnableConstraints=[ + + $this->fullConditionConstraints = [ ConstraintHelper::OccupiedCity(), ConstraintHelper::BeChief(), ConstraintHelper::ExistsDestNation(), @@ -71,42 +88,47 @@ class che_이호경식 extends Command\NationCommand{ ), ConstraintHelper::AvailableStrategicCommand(), ]; - } - public function getCommandDetailTitle():string{ + public function getCommandDetailTitle(): string + { $name = $this->getName(); - $reqTurn = $this->getPreReqTurn()+1; + $reqTurn = $this->getPreReqTurn() + 1; $postReqTurn = $this->getPostReqTurn(); return "{$name}/{$reqTurn}턴(전략$postReqTurn)"; } - public function getCost():array{ + public function getCost(): array + { return [0, 0]; } - - public function getPreReqTurn():int{ + + public function getPreReqTurn(): int + { return 0; } - public function getPostReqTurn():int{ + public function getPostReqTurn(): int + { $genCount = Util::valueFit($this->nation['gennum'], GameConst::$initialNationGenLimit); - $nextTerm = Util::round(sqrt($genCount*16)*10); + $nextTerm = Util::round(sqrt($genCount * 16) * 10); $nextTerm = $this->generalObj->onCalcStrategic($this->getName(), 'delay', $nextTerm); return $nextTerm; } - public function getBrief():string{ + public function getBrief(): string + { $commandName = $this->getName(); $destNationName = getNationStaticInfo($this->arg['destNationID'])['name']; return "【{$destNationName}】에 {$commandName}"; } - public function run():bool{ - if(!$this->isRunnable()){ + public function run(): bool + { + if (!$this->hasFullConditionMet()) { throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } @@ -144,7 +166,7 @@ class che_이호경식 extends Command\NationCommand{ $broadcastMessage = "{$generalName}{$josaYi} {$destNationName}{$commandName}{$josaUl} 발동하였습니다."; $nationGeneralList = $db->queryFirstColumn('SELECT no FROM general WHERE nation=%i AND no != %i', $nationID, $generalID); - foreach($nationGeneralList as $nationGeneralID){ + foreach ($nationGeneralList as $nationGeneralID) { $nationGeneralLogger = new ActionLogger($nationGeneralID, $nationID, $year, $month); $nationGeneralLogger->pushGeneralActionLog($broadcastMessage, ActionLogger::PLAIN); $nationGeneralLogger->flush(); @@ -155,7 +177,7 @@ class che_이호경식 extends Command\NationCommand{ $broadcastMessage = "아국에 {$commandName}{$josaYiCommand} 발동되었습니다."; $destNationGeneralList = $db->queryFirstColumn('SELECT no FROM general WHERE nation=%i AND no != %i', $nationID, $generalID); - foreach($destNationGeneralList as $destNationGeneralID){ + foreach ($destNationGeneralList as $destNationGeneralID) { $destNationGeneralLogger = new ActionLogger($destNationGeneralID, $destNationID, $year, $month); $destNationGeneralLogger->pushGeneralActionLog($broadcastMessage, ActionLogger::PLAIN); $destNationGeneralLogger->flush(); @@ -166,13 +188,13 @@ class che_이호경식 extends Command\NationCommand{ $destNationLogger->flush(); $logger->pushNationalHistoryLog("{$generalName}{$josaYi} {$destNationName}{$commandName}{$josaUl} 발동"); - + $db->update('nation', [ 'strategic_cmd_limit' => $this->getPostReqTurn() ], 'nation=%i', $nationID); $db->update('diplomacy', [ - 'term'=>$db->sqleval('IF(`state`=0, %i, `term`+ %i)', 3, 3), - 'state'=>1, + 'term' => $db->sqleval('IF(`state`=0, %i, `term`+ %i)', 3, 3), + 'state' => 1, ], '(me = %i AND you = %i) OR (you = %i AND me = %i)', $nationID, $destNationID, $nationID, $destNationID); $general->applyDB($db); @@ -193,39 +215,35 @@ class che_이호경식 extends Command\NationCommand{ $nationID = $generalObj->getNationID(); $nationList = []; $testTurn = new LastTurn($this->getName(), null, $this->getPreReqTurn()); - foreach(getAllNationStaticInfo() as $destNation){ - if($destNation['nation'] == $nationID){ + foreach (getAllNationStaticInfo() as $destNation) { + if ($destNation['nation'] == $nationID) { continue; } - $testTurn->setArg(['destNationID'=>$destNation['nation']]); - $testCommand = new static($generalObj, $this->env, $testTurn, ['destNationID'=>$destNation['nation']]); - if($testCommand->isRunnable()){ + $testTurn->setArg(['destNationID' => $destNation['nation']]); + $testCommand = new static($generalObj, $this->env, $testTurn, ['destNationID' => $destNation['nation']]); + if ($testCommand->hasFullConditionMet()) { $destNation['availableCommand'] = true; - } - else{ + } else { $destNation['availableCommand'] = false; } $nationList[] = $destNation; } - ob_start(); + ob_start(); ?> -
-선택된 국가에 이호경식을 발동합니다.
-선포, 전쟁중인 상대국에만 가능합니다.
-상대 국가를 목록에서 선택하세요.
-배경색은 현재 이호경식 불가능 국가는 붉은색으로 표시됩니다.
- -
+ 선택된 국가에 이호경식을 발동합니다.
+ 선포, 전쟁중인 상대국에만 가능합니다.
+ 상대 국가를 목록에서 선택하세요.
+ 배경색은 현재 이호경식 불가능 국가는 붉은색으로 표시됩니다.
+ + arg === null){ + protected function argTest(): bool + { + if ($this->arg === null) { return false; } - if(!key_exists('destNationID', $this->arg)){ + if (!key_exists('destNationID', $this->arg)) { return false; } $destNationID = $this->arg['destNationID']; - if(!is_int($destNationID)){ + if (!is_int($destNationID)) { return false; } - if($destNationID < 1){ + if ($destNationID < 1) { return false; } - if(!key_exists('destGeneralID', $this->arg)){ + if (!key_exists('destGeneralID', $this->arg)) { return false; } $destGeneralID = $this->arg['destGeneralID']; - if(!is_int($destGeneralID)){ + if (!is_int($destGeneralID)) { return false; } - if($destGeneralID <= 0){ + if ($destGeneralID <= 0) { return false; } - if($destGeneralID == $this->generalObj->getID()){ + if ($destGeneralID == $this->generalObj->getID()) { return false; } $this->arg = [ - 'destNationID'=>$destNationID, - 'destGeneralID'=>$destGeneralID, + 'destNationID' => $destNationID, + 'destGeneralID' => $destGeneralID, ]; return true; } - protected function init(){ + protected function init() + { $general = $this->generalObj; $env = $this->env; @@ -76,19 +83,23 @@ class che_종전수락 extends Command\NationCommand{ $this->setCity(); $this->setNation(); + + $nationID = $this->nation['nation']; + + $this->permissionConstraints = [ + ConstraintHelper::AlwaysFail('예약 불가능 커맨드') + ]; + } + + protected function initWithArg() + { $destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], [], 1); $this->setDestGeneral($destGeneral); $this->setDestNation($this->arg['destNationID']); - $nationID = $this->nation['nation']; - - $this->reservableConstraints = [ - ConstraintHelper::AlwaysFail('예약 불가능 커맨드') - ]; - - $this->runnableConstraints=[ + $this->fullConditionConstraints = [ ConstraintHelper::BeChief(), - ConstraintHelper::NotBeNeutral(), + ConstraintHelper::NotBeNeutral(), ConstraintHelper::ExistsDestNation(), ConstraintHelper::ExistsDestGeneral(), ConstraintHelper::ReqDestNationValue('nation', '소속', '==', $this->destGeneralObj->getNationID(), '제의 장수가 국가 소속이 아닙니다'), @@ -97,29 +108,33 @@ class che_종전수락 extends Command\NationCommand{ '상대국과 선포, 전쟁중이지 않습니다.' ), ]; - } - public function getCost():array{ + public function getCost(): array + { return [0, 0]; } - - public function getPreReqTurn():int{ + + public function getPreReqTurn(): int + { return 0; } - public function getPostReqTurn():int{ + public function getPostReqTurn(): int + { return 0; } - public function getBrief():string{ + public function getBrief(): string + { $commandName = $this->getName(); $destNationName = getNationStaticInfo($this->arg['destNationID'])['name']; return "{$destNationName}국과 종전 합의"; } - public function run():bool{ - if(!$this->isRunnable()){ + public function run(): bool + { + if (!$this->hasFullConditionMet()) { throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } @@ -140,13 +155,18 @@ class che_종전수락 extends Command\NationCommand{ $logger = $general->getLogger(); $destLogger = $this->destGeneralObj->getLogger(); - $db->update('diplomacy',[ - 'state'=>2, - 'term'=>0 - ], - '(me=%i AND you=%i) OR (you=%i AND me=%i)', - $nationID, $destNationID, - $nationID, $destNationID); + $db->update( + 'diplomacy', + [ + 'state' => 2, + 'term' => 0 + ], + '(me=%i AND you=%i) OR (you=%i AND me=%i)', + $nationID, + $destNationID, + $nationID, + $destNationID + ); $josaYiGeneral = JosaUtil::pick($generalName, '이'); $josaYiNation = JosaUtil::pick($nationName, '이'); @@ -168,4 +188,4 @@ class che_종전수락 extends Command\NationCommand{ return true; } -} \ No newline at end of file +} diff --git a/hwe/sammo/Command/Nation/che_종전제의.php b/hwe/sammo/Command/Nation/che_종전제의.php index f39fd018..244822ac 100644 --- a/hwe/sammo/Command/Nation/che_종전제의.php +++ b/hwe/sammo/Command/Nation/che_종전제의.php @@ -60,9 +60,20 @@ class che_종전제의 extends Command\NationCommand{ $this->setCity(); $this->setNation(); + + $this->minConditionConstraints=[ + ConstraintHelper::BeChief(), + ConstraintHelper::NotBeNeutral(), + ConstraintHelper::OccupiedCity(), + ConstraintHelper::SuppliedCity(), + ]; + } + + protected function initWithArg() + { $this->setDestNation($this->arg['destNationID'], null); - $this->runnableConstraints=[ + $this->fullConditionConstraints=[ ConstraintHelper::BeChief(), ConstraintHelper::NotBeNeutral(), ConstraintHelper::OccupiedCity(), @@ -73,7 +84,6 @@ class che_종전제의 extends Command\NationCommand{ '선포, 전쟁중인 상대국에게만 가능합니다.' ), ]; - } public function getCost():array{ @@ -96,7 +106,7 @@ class che_종전제의 extends Command\NationCommand{ public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/Nation/che_증축.php b/hwe/sammo/Command/Nation/che_증축.php index e4b964f6..0a1d226a 100644 --- a/hwe/sammo/Command/Nation/che_증축.php +++ b/hwe/sammo/Command/Nation/che_증축.php @@ -28,7 +28,6 @@ use sammo\Event\Action; class che_증축 extends Command\NationCommand{ static protected $actionName = '증축'; - static public $reqArg = false; protected function argTest():bool{ $this->arg = []; @@ -42,10 +41,10 @@ class che_증축 extends Command\NationCommand{ $env = $this->env; if($general->getNationID()===0){ - $this->reservableConstraints=[ + $this->permissionConstraints=[ ConstraintHelper::NotBeNeutral(), ]; - $this->runnableConstraints=[ + $this->fullConditionConstraints=[ ConstraintHelper::NotBeNeutral(), ]; return; @@ -53,11 +52,11 @@ class che_증축 extends Command\NationCommand{ $this->setCity(); $this->setNation(['gold', 'rice', 'capset', 'capital']); - $this->setDestCity($this->nation['capital'], null); + $this->setDestCity($this->nation['capital']); [$reqGold, $reqRice] = $this->getCost(); - $this->runnableConstraints=[ + $this->fullConditionConstraints=[ ConstraintHelper::OccupiedCity(), ConstraintHelper::BeChief(), ConstraintHelper::SuppliedCity(), @@ -135,7 +134,7 @@ class che_증축 extends Command\NationCommand{ } public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/Nation/che_천도.php b/hwe/sammo/Command/Nation/che_천도.php index 14abde98..396e1957 100644 --- a/hwe/sammo/Command/Nation/che_천도.php +++ b/hwe/sammo/Command/Nation/che_천도.php @@ -1,9 +1,13 @@ arg === null){ + protected function argTest(): bool + { + if ($this->arg === null) { return false; } - if(!key_exists('destCityID', $this->arg)){ + if (!key_exists('destCityID', $this->arg)) { return false; } - if(CityConst::byID($this->arg['destCityID']) === null){ + if (CityConst::byID($this->arg['destCityID']) === null) { return false; } $destCityID = $this->arg['destCityID']; $this->arg = [ - 'destCityID'=>$destCityID, + 'destCityID' => $destCityID, ]; return true; } - protected function init(){ + protected function init() + { $general = $this->generalObj; $env = $this->env; $this->setCity(); $this->setNation(['capset', 'gold', 'rice', 'capital']); - $this->setDestCity($this->arg['destCityID'], null); - + + $this->minConditionConstraints = [ + ConstraintHelper::OccupiedCity(), + ConstraintHelper::BeChief(), + ConstraintHelper::SuppliedCity(), + ]; + } + + protected function initWithArg() + { + $this->setDestCity($this->arg['destCityID']); + [$reqGold, $reqRice] = $this->getCost(); - if($this->getDistance() === null){ - $this->runnableConstraints[ - ConstraintHelper::AlwaysFail('천도 대상으로 도달할 방법이 없습니다.') - ]; + if ($this->getDistance() === null) { + $this->fullConditionConstraints[ConstraintHelper::AlwaysFail('천도 대상으로 도달할 방법이 없습니다.')]; return; } - $this->runnableConstraints=[ + $this->fullConditionConstraints = [ ConstraintHelper::OccupiedCity(), ConstraintHelper::OccupiedDestCity(), ConstraintHelper::BeChief(), ConstraintHelper::SuppliedCity(), ConstraintHelper::SuppliedDestCity(), ConstraintHelper::ReqNationValue('capital', '수도', '!=', $this->destCity['city'], '이미 수도입니다.'), - ConstraintHelper::ReqNationGold(GameConst::$basegold+$reqGold), - ConstraintHelper::ReqNationRice(GameConst::$baserice+$reqRice), + ConstraintHelper::ReqNationGold(GameConst::$basegold + $reqGold), + ConstraintHelper::ReqNationRice(GameConst::$baserice + $reqRice), ]; } - public function getCommandDetailTitle():string{ + public function getCommandDetailTitle(): string + { $name = $this->getName(); $amount = number_format($this->env['develcost'] * 5); return "{$name}/1+거리×2턴(금쌀 {$amount}×2^거리)"; } - - public function getCost():array{ + + public function getCost(): array + { $amount = $this->env['develcost'] * 5; - $amount *= 2**$this->getDistance()??50; - + $amount *= 2 ** $this->getDistance() ?? 50; + return [$amount, $amount]; } - private function getDistance():?int{ - if($this->cachedDist !== null){ + private function getDistance(): ?int + { + if ($this->cachedDist !== null) { return $this->cachedDist; } $srcCityID = $this->nation['capital']; $destCityID = $this->arg['destCityID']; $nationID = $this->nation['nation']; - $distance = \sammo\calcCityDistance($srcCityID, $destCityID, [$nationID])??50; + $distance = \sammo\calcCityDistance($srcCityID, $destCityID, [$nationID]) ?? 50; $this->cachedDist = $distance; - + return $distance; } - - public function getPreReqTurn():int{ - return $this->getDistance()*2; + + public function getPreReqTurn(): int + { + return $this->getDistance() * 2; } - public function getPostReqTurn():int{ + public function getPostReqTurn(): int + { return 0; } - public function addTermStack():bool{ + public function addTermStack(): bool + { $lastTurn = $this->getLastTurn(); $commandName = $this->getName(); @@ -126,7 +147,7 @@ class che_천도 extends Command\NationCommand{ $nationID = $general->getNationID(); $nationStor->setValue("last천도Trial_{$nationID}", [$general->getVar('officer_level'), $general->getTurnTime()]); - if($lastTurn->getCommand() != $commandName || $lastTurn->getArg() !== $this->arg){ + if ($lastTurn->getCommand() != $commandName || $lastTurn->getArg() !== $this->arg) { $this->setResultTurn(new LastTurn( $commandName, $this->arg, @@ -136,7 +157,7 @@ class che_천도 extends Command\NationCommand{ return false; } - if($lastTurn->getSeq() < $this->nation['capset']){ + if ($lastTurn->getSeq() < $this->nation['capset']) { //NOTE: 최근에 천도, 증축이 일어났으면 리셋됨 $this->setResultTurn(new LastTurn( $commandName, @@ -147,7 +168,7 @@ class che_천도 extends Command\NationCommand{ return false; } - if($lastTurn->getTerm() < $this->getPreReqTurn()){ + if ($lastTurn->getTerm() < $this->getPreReqTurn()) { $this->setResultTurn(new LastTurn( $commandName, $this->arg, @@ -160,15 +181,17 @@ class che_천도 extends Command\NationCommand{ return true; } - public function getBrief():string{ + public function getBrief(): string + { $commandName = $this->getName(); $destCityName = CityConst::byID($this->arg['destCityID'])->name; $josaRo = JosaUtil::pick($destCityName, '로'); return "【{$destCityName}】{$josaRo} {$commandName}"; } - public function run():bool{ - if(!$this->isRunnable()){ + public function run(): bool + { + if (!$this->hasFullConditionMet()) { throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } @@ -192,7 +215,7 @@ class che_천도 extends Command\NationCommand{ $josaRo = JosaUtil::pick($destCityName, '로'); $logger = $general->getLogger(); - + $general->addExperience(5 * ($this->getPreReqTurn() + 1)); $general->addDedication(5 * ($this->getPreReqTurn() + 1)); @@ -204,7 +227,7 @@ class che_천도 extends Command\NationCommand{ 'capital' => $destCityID, 'capset' => $db->sqleval('capset + 1'), ], 'nation=%i', $nationID); - + $logger->pushGeneralActionLog("{$destCityName}{$josaRo} 천도했습니다. <1>$date"); $logger->pushGeneralHistoryLog("{$destCityName}{$josaRo} 천도명령"); $logger->pushNationalHistoryLog("{$generalName}{$josaYi} {$destCityName}{$josaRo} 천도 명령"); @@ -228,15 +251,15 @@ class che_천도 extends Command\NationCommand{ { ob_start(); ?> -
-선택된 도시로 천도합니다.
-현재 수도에서 연결된 도시만 가능하며, 1+2×거리만큼의 턴이 필요합니다.
-목록을 선택하거나 도시를 클릭하세요.
-
-
+
+ 선택된 도시로 천도합니다.
+ 현재 수도에서 연결된 도시만 가능하며, 1+2×거리만큼의 턴이 필요합니다.
+ 목록을 선택하거나 도시를 클릭하세요.
+
+
setCity(); $this->setNation(['surlimit', 'gold', 'rice', 'capital']); - $this->setDestCity($this->arg['destCityID'], null); - $this->runnableConstraints=[ + $this->minConditionConstraints=[ + ConstraintHelper::OccupiedCity(), + ConstraintHelper::BeChief(), + ConstraintHelper::SuppliedCity(), + ConstraintHelper::ReqNationValue('surlimit', '제한 턴', '==', 0, '외교제한 턴이 남아있습니다.'), + ]; + } + + protected function initWithArg() + { + $this->setDestCity($this->arg['destCityID']); + + $this->fullConditionConstraints=[ ConstraintHelper::OccupiedCity(), ConstraintHelper::OccupiedDestCity(), ConstraintHelper::BeChief(), @@ -102,7 +113,7 @@ class che_초토화 extends Command\NationCommand{ } public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/Nation/che_포상.php b/hwe/sammo/Command/Nation/che_포상.php index d66bf8e8..9321553a 100644 --- a/hwe/sammo/Command/Nation/che_포상.php +++ b/hwe/sammo/Command/Nation/che_포상.php @@ -1,9 +1,13 @@ arg === null){ + protected function argTest(): bool + { + if ($this->arg === null) { return false; } //NOTE: 사망 직전에 '포상' 턴을 넣을 수 있으므로, 존재하지 않는 장수여도 argTest에서 바로 탈락시키지 않음 - if(!key_exists('isGold', $this->arg)){ + if (!key_exists('isGold', $this->arg)) { return false; } - if(!key_exists('amount', $this->arg)){ + if (!key_exists('amount', $this->arg)) { return false; } - if(!key_exists('destGeneralID', $this->arg)){ + if (!key_exists('destGeneralID', $this->arg)) { return false; } $isGold = $this->arg['isGold']; $amount = $this->arg['amount']; $destGeneralID = $this->arg['destGeneralID']; - if(!is_numeric($amount)){ + if (!is_numeric($amount)) { return false; } $amount = Util::round($amount, -2); $amount = Util::valueFit($amount, 100, GameConst::$maxResourceActionAmount); - if($amount <= 0){ + if ($amount <= 0) { return false; } - if(!is_bool($isGold)){ + if (!is_bool($isGold)) { return false; } - if(!is_int($destGeneralID)){ + if (!is_int($destGeneralID)) { return false; } - if($destGeneralID <= 0){ + if ($destGeneralID <= 0) { return false; } - if($destGeneralID == $this->generalObj->getID()){ + if ($destGeneralID == $this->generalObj->getID()) { return false; } $this->arg = [ - 'isGold'=>$isGold, - 'amount'=>$amount, - 'destGeneralID'=>$destGeneralID + 'isGold' => $isGold, + 'amount' => $amount, + 'destGeneralID' => $destGeneralID ]; return true; } - protected function init(){ + protected function init() + { $general = $this->generalObj; $this->setCity(); $this->setNation(['gold', 'rice']); + $this->minConditionConstraints = [ + ConstraintHelper::NotBeNeutral(), + ConstraintHelper::OccupiedCity(), + ConstraintHelper::BeChief(), + ConstraintHelper::SuppliedCity(), + ]; + } + + protected function initWithArg() + { $destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], ['gold', 'rice', 'nation'], 1); $this->setDestGeneral($destGeneral); - - $this->runnableConstraints=[ - ConstraintHelper::NotBeNeutral(), + + $this->fullConditionConstraints = [ + ConstraintHelper::NotBeNeutral(), ConstraintHelper::OccupiedCity(), ConstraintHelper::BeChief(), ConstraintHelper::SuppliedCity(), ConstraintHelper::ExistsDestGeneral(), ConstraintHelper::FriendlyDestGeneral() ]; - if($this->arg['isGold']){ - $this->runnableConstraints[] = ConstraintHelper::ReqNationGold(1+GameConst::$basegold); - } - else{ - $this->runnableConstraints[] = ConstraintHelper::ReqNationRice(1+GameConst::$baserice); + if ($this->arg['isGold']) { + $this->fullConditionConstraints[] = ConstraintHelper::ReqNationGold(1 + GameConst::$basegold); + } else { + $this->fullConditionConstraints[] = ConstraintHelper::ReqNationRice(1 + GameConst::$baserice); } } - - public function getCost():array{ + + public function getCost(): array + { return [0, 0]; } - - public function getPreReqTurn():int{ + + public function getPreReqTurn(): int + { return 0; } - public function getPostReqTurn():int{ + public function getPostReqTurn(): int + { return 0; } - public function getBrief():string{ + public function getBrief(): string + { $isGold = $this->arg['isGold']; $amount = $this->arg['amount']; $amountText = number_format($amount, 0); - $resName = $isGold?'금':'쌀'; + $resName = $isGold ? '금' : '쌀'; $destGeneral = $this->destGeneralObj; $commandName = $this->getName(); return "【{$destGeneral->getName()}】 {$resName} $amountText {$commandName}"; } - public function run():bool{ - if(!$this->isRunnable()){ + public function run(): bool + { + if (!$this->hasFullConditionMet()) { throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } @@ -132,22 +153,22 @@ class che_포상 extends Command\NationCommand{ $isGold = $this->arg['isGold']; $amount = $this->arg['amount']; - $resKey = $isGold?'gold':'rice'; - $resName = $isGold?'금':'쌀'; + $resKey = $isGold ? 'gold' : 'rice'; + $resName = $isGold ? '금' : '쌀'; $destGeneral = $this->destGeneralObj; - + $amount = Util::valueFit( - $amount, - 0, - $nation[$resKey] - ($isGold?GameConst::$basegold:GameConst::$baserice) + $amount, + 0, + $nation[$resKey] - ($isGold ? GameConst::$basegold : GameConst::$baserice) ); $amountText = number_format($amount, 0); - + $logger = $general->getLogger(); $destGeneral->increaseVar($resKey, $amount); $db->update('nation', [ - $resKey=>$db->sqleval('%b - %i', $resKey, $amount) + $resKey => $db->sqleval('%b - %i', $resKey, $amount) ], 'nation=%i', $nationID); $destGeneral->getLogger()->pushGeneralActionLog("{$resName} {$amountText}을 포상으로 받았습니다.", ActionLogger::PLAIN); @@ -160,53 +181,53 @@ class che_포상 extends Command\NationCommand{ return true; } - + public function getForm(): string { //TODO: 암행부처럼 보여야... $db = DB::db(); - $destRawGenerals = $db->query('SELECT no,name,officer_level,npc,gold,rice FROM general WHERE nation = %i AND no != %i ORDER BY npc,binary(name)',$this->generalObj->getNationID(), $this->generalObj->getID()); + $destRawGenerals = $db->query('SELECT no,name,officer_level,npc,gold,rice FROM general WHERE nation = %i AND no != %i ORDER BY npc,binary(name)', $this->generalObj->getNationID(), $this->generalObj->getID()); $destGeneralList = []; - foreach($destRawGenerals as $destGeneral){ + foreach ($destRawGenerals as $destGeneral) { $nameColor = \sammo\getNameColor($destGeneral['npc']); - if($nameColor){ + if ($nameColor) { $nameColor = " style='color:{$nameColor}'"; } $name = $destGeneral['name']; - if($destGeneral['officer_level'] >= 5){ + if ($destGeneral['officer_level'] >= 5) { $name = "*{$name}*"; } $destGeneralList[] = [ - 'no'=>$destGeneral['no'], - 'color'=>$nameColor, - 'name'=>$name, - 'gold'=>$destGeneral['gold'], - 'rice'=>$destGeneral['rice'] + 'no' => $destGeneral['no'], + 'color' => $nameColor, + 'name' => $name, + 'gold' => $destGeneral['gold'], + 'rice' => $destGeneral['rice'] ]; } ob_start(); ?> -국고로 장수에게 자금이나 군량을 지급합니다.
- - - -
-
+ 국고로 장수에게 자금이나 군량을 지급합니다.
+ + + +
+
setCity(); $this->setNation(['strategic_cmd_limit']); + $this->minConditionConstraints=[ + ConstraintHelper::OccupiedCity(), + ConstraintHelper::BeChief(), + ConstraintHelper::AvailableStrategicCommand(), + ]; + } + + protected function initWithArg() + { $this->setDestNation($this->arg['destNationID'], null); - $this->runnableConstraints=[ + $this->fullConditionConstraints=[ ConstraintHelper::OccupiedCity(), ConstraintHelper::BeChief(), ConstraintHelper::ExistsDestNation(), @@ -72,7 +81,6 @@ class che_피장파장 extends Command\NationCommand{ ), ConstraintHelper::AvailableStrategicCommand(), ]; - } public function getCommandDetailTitle():string{ @@ -107,7 +115,7 @@ class che_피장파장 extends Command\NationCommand{ public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } @@ -200,7 +208,7 @@ class che_피장파장 extends Command\NationCommand{ $testTurn->setArg(['destNationID'=>$destNation['nation']]); $testCommand = new static($generalObj, $this->env, $testTurn, ['destNationID'=>$destNation['nation']]); - if($testCommand->isRunnable()){ + if($testCommand->hasFullConditionMet()){ $destNation['availableCommand'] = true; } else{ diff --git a/hwe/sammo/Command/Nation/che_필사즉생.php b/hwe/sammo/Command/Nation/che_필사즉생.php index f8f1c237..af835d13 100644 --- a/hwe/sammo/Command/Nation/che_필사즉생.php +++ b/hwe/sammo/Command/Nation/che_필사즉생.php @@ -26,7 +26,6 @@ use sammo\Event\Action; class che_필사즉생 extends Command\NationCommand{ static protected $actionName = '필사즉생'; - static public $reqArg = false; protected function argTest():bool{ $this->arg = []; @@ -42,7 +41,7 @@ class che_필사즉생 extends Command\NationCommand{ $this->setCity(); $this->setNation(['strategic_cmd_limit']); - $this->runnableConstraints=[ + $this->fullConditionConstraints=[ ConstraintHelper::OccupiedCity(), ConstraintHelper::BeChief(), ConstraintHelper::AllowDiplomacyStatus($this->generalObj->getNationID(), [ @@ -77,7 +76,7 @@ class che_필사즉생 extends Command\NationCommand{ } public function run():bool{ - if(!$this->isRunnable()){ + if(!$this->hasFullConditionMet()){ throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } diff --git a/hwe/sammo/Command/Nation/che_허보.php b/hwe/sammo/Command/Nation/che_허보.php index 4a0cf8b8..fc881548 100644 --- a/hwe/sammo/Command/Nation/che_허보.php +++ b/hwe/sammo/Command/Nation/che_허보.php @@ -1,9 +1,13 @@ arg === null){ + protected function argTest(): bool + { + if ($this->arg === null) { return false; } - if(!key_exists('destCityID', $this->arg)){ + if (!key_exists('destCityID', $this->arg)) { return false; } - if(CityConst::byID($this->arg['destCityID']) === null){ + if (CityConst::byID($this->arg['destCityID']) === null) { return false; } $destCityID = $this->arg['destCityID']; $this->arg = [ - 'destCityID'=>$destCityID, + 'destCityID' => $destCityID, ]; return true; } - protected function init(){ + protected function init() + { $general = $this->generalObj; $env = $this->env; $this->setCity(); $this->setNation(['strategic_cmd_limit']); - $this->setDestCity($this->arg['destCityID'], null); - $this->setDestNation($this->destCity['nation']); - $this->runnableConstraints=[ + $this->minConditionConstraints = [ + ConstraintHelper::OccupiedCity(), + ConstraintHelper::BeChief(), + ConstraintHelper::AvailableStrategicCommand(), + ]; + } + + protected function initWithArg() + { + $this->setDestCity($this->arg['destCityID']); + $this->setDestNation($this->destCity['nation']); + + $this->fullConditionConstraints = [ ConstraintHelper::OccupiedCity(), ConstraintHelper::BeChief(), ConstraintHelper::NotNeutralDestCity(), @@ -72,38 +89,44 @@ class che_허보 extends Command\NationCommand{ ]; } - public function getCommandDetailTitle():string{ + public function getCommandDetailTitle(): string + { $name = $this->getName(); - $reqTurn = $this->getPreReqTurn()+1; + $reqTurn = $this->getPreReqTurn() + 1; $postReqTurn = $this->getPostReqTurn(); return "{$name}/{$reqTurn}턴(전략$postReqTurn)"; } - - public function getCost():array{ + + public function getCost(): array + { return [0, 0]; } - - public function getPreReqTurn():int{ + + public function getPreReqTurn(): int + { return 1; } - public function getPostReqTurn():int{ + public function getPostReqTurn(): int + { $genCount = Util::valueFit($this->nation['gennum'], GameConst::$initialNationGenLimit); - $nextTerm = Util::round(sqrt($genCount*4)*10); + $nextTerm = Util::round(sqrt($genCount * 4) * 10); $nextTerm = $this->generalObj->onCalcStrategic($this->getName(), 'delay', $nextTerm); return $nextTerm; } - public function getBrief():string{ + public function getBrief(): string + { $commandName = $this->getName(); $destCityName = CityConst::byID($this->arg['destCityID'])->name; return "【{$destCityName}】에 {$commandName}"; } - public function run():bool{ - if(!$this->isRunnable()){ + public function run(): bool + { + if (!$this->hasFullConditionMet()) { throw new \RuntimeException('불가능한 커맨드를 강제로 실행 시도'); } @@ -123,7 +146,7 @@ class che_허보 extends Command\NationCommand{ $destNationID = $destCity['nation']; $destNationName = getNationStaticInfo($destNationID)['name']; - + $nationID = $general->getNationID(); $nationName = $this->nation['name']; @@ -138,7 +161,7 @@ class che_허보 extends Command\NationCommand{ $broadcastMessage = "{$generalName}{$josaYi} {$destCityName}허보를 발동하였습니다."; $targetGeneralList = $db->queryFirstColumn('SELECT no FROM general WHERE nation=%i AND no != %i', $nationID, $generalID); - foreach($targetGeneralList as $targetGeneralID){ + foreach ($targetGeneralList as $targetGeneralID) { $targetLogger = new ActionLogger($targetGeneralID, $nationID, $year, $month); $targetLogger->pushGeneralActionLog($broadcastMessage, ActionLogger::PLAIN); $targetLogger->flush(); @@ -148,12 +171,12 @@ class che_허보 extends Command\NationCommand{ $destNationCityList = $db->queryFirstColumn('SELECT city FROM city WHERE nation = %i AND supply = 1', $destNationID); $targetGeneralList = $db->queryFirstColumn('SELECT no FROM general WHERE nation=%i AND city=%i', $destNationID, $destCityID); - foreach(General::createGeneralObjListFromDB($targetGeneralList) as $targetGeneralID => $targetGeneral){ + foreach (General::createGeneralObjListFromDB($targetGeneralList) as $targetGeneralID => $targetGeneral) { $targetLogger = $targetGeneral->getLogger(); $targetLogger->pushGeneralActionLog($destBroadcastMessage, ActionLogger::PLAIN); $moveCityID = Util::choiceRandom($destNationCityList); - if($moveCityID == $destCityID){ + if ($moveCityID == $destCityID) { //현재도시면 다시 랜덤 추첨 $moveCityID = Util::choiceRandom($destNationCityList); } @@ -164,7 +187,8 @@ class che_허보 extends Command\NationCommand{ $destNationLogger = new ActionLogger(0, $destNationID, $year, $month); $destNationLogger->pushNationalHistoryLog( - "{$nationName}{$generalName}{$josaYi} 아국의 {$destCityName}허보를 발동", ActionLogger::PLAIN + "{$nationName}{$generalName}{$josaYi} 아국의 {$destCityName}허보를 발동", + ActionLogger::PLAIN ); $destNationLogger->flush(); @@ -173,7 +197,7 @@ class che_허보 extends Command\NationCommand{ 'def' => $db->sqleval('def * 0.2'), 'wall' => $db->sqleval('wall * 0.2'), ], 'city=%i', $destCityID); - + $josaYiNation = JosaUtil::pick($nationName, '이'); $logger->pushGeneralHistoryLog("{$destCityName}허보를 발동"); @@ -202,15 +226,15 @@ class che_허보 extends Command\NationCommand{ { ob_start(); ?> -
-선택된 도시에 허보를 발동합니다.
-전쟁중인 상대국 도시만 가능합니다.
-목록을 선택하거나 도시를 클릭하세요.
-
-
+
+ 선택된 도시에 허보를 발동합니다.
+ 전쟁중인 상대국 도시만 가능합니다.
+ 목록을 선택하거나 도시를 클릭하세요.
+
+
runnableConstraints=[]; + $this->fullConditionConstraints=[]; } diff --git a/hwe/sammo/DiplomaticMessage.php b/hwe/sammo/DiplomaticMessage.php index 0d2fab83..12d7d36d 100644 --- a/hwe/sammo/DiplomaticMessage.php +++ b/hwe/sammo/DiplomaticMessage.php @@ -88,7 +88,7 @@ class DiplomaticMessage extends Message{ $this->diplomacyDetail = $commandObj->getBrief(); - if(!$commandObj->isRunnable()){ + if(!$commandObj->hasFullConditionMet()){ return [self::DECLINED, $commandObj->getFailString()]; } @@ -109,7 +109,7 @@ class DiplomaticMessage extends Message{ $this->diplomacyDetail = $commandObj->getBrief(); - if(!$commandObj->isRunnable()){ + if(!$commandObj->hasFullConditionMet()){ return [self::DECLINED, $commandObj->getFailString()]; } @@ -130,7 +130,7 @@ class DiplomaticMessage extends Message{ $this->diplomacyDetail = $commandObj->getBrief(); - if(!$commandObj->isRunnable()){ + if(!$commandObj->hasFullConditionMet()){ return [self::DECLINED, $commandObj->getFailString()]; } diff --git a/hwe/sammo/GeneralAI.php b/hwe/sammo/GeneralAI.php index e36be34c..3f0ca841 100644 --- a/hwe/sammo/GeneralAI.php +++ b/hwe/sammo/GeneralAI.php @@ -344,7 +344,7 @@ class GeneralAI } $cmd = buildNationCommandClass('che_발령', $this->general, $this->env, $lastTurn, Util::choiceRandom($troopCandidate)); - if(!$cmd->isRunnable()){ + if(!$cmd->hasFullConditionMet()){ return null; } @@ -433,7 +433,7 @@ class GeneralAI 'destCityID'=>Util::choiceRandom($cityCandidates)['city'] ]); - if(!$cmd->isRunnable()){ + if(!$cmd->hasFullConditionMet()){ return null; } @@ -544,7 +544,7 @@ class GeneralAI 'destCityID'=>Util::choiceRandom($cityCandidates)['city'] ]); - if(!$cmd->isRunnable()){ + if(!$cmd->hasFullConditionMet()){ return null; } @@ -615,7 +615,7 @@ class GeneralAI 'destCityID'=>Util::choiceRandom($cityCandidates)['city'] ]); - if(!$cmd->isRunnable()){ + if(!$cmd->hasFullConditionMet()){ return null; } @@ -666,7 +666,7 @@ class GeneralAI return null; } $cmd = buildNationCommandClass('che_발령', $this->general, $this->env, $lastTurn, Util::choiceRandom($args)); - if(!$cmd->isRunnable()){ + if(!$cmd->hasFullConditionMet()){ return null; } return null; @@ -722,7 +722,7 @@ class GeneralAI 'destCityID'=>Util::choiceRandomUsingWeight($cityCandidates) ]); - if(!$cmd->isRunnable()){ + if(!$cmd->hasFullConditionMet()){ return null; } @@ -794,7 +794,7 @@ class GeneralAI 'destCityID'=>$destCity['city'] ]); - if(!$cmd->isRunnable()){ + if(!$cmd->hasFullConditionMet()){ return null; } @@ -869,7 +869,7 @@ class GeneralAI 'destCityID'=>Util::choiceRandom($cityCandidates)['city'] ]); - if(!$cmd->isRunnable()){ + if(!$cmd->hasFullConditionMet()){ return null; } @@ -899,7 +899,7 @@ class GeneralAI return null; } $cmd = buildNationCommandClass('che_발령', $this->general, $this->env, $lastTurn, Util::choiceRandom($args)); - if(!$cmd->isRunnable()){ + if(!$cmd->hasFullConditionMet()){ return null; } return null; @@ -955,7 +955,7 @@ class GeneralAI 'destCityID'=>Util::choiceRandomUsingWeight($cityCandidates) ]); - if(!$cmd->isRunnable()){ + if(!$cmd->hasFullConditionMet()){ return null; } @@ -1023,7 +1023,7 @@ class GeneralAI 'destCityID'=>$destCity['city'] ]); - if(!$cmd->isRunnable()){ + if(!$cmd->hasFullConditionMet()){ return null; } @@ -1101,7 +1101,7 @@ class GeneralAI 'che_포상', $this->general, $this->env, $lastTurn, Util::choiceRandomUsingWeightPair($candidateArgs) ); - if(!$cmd->isRunnable()){ + if(!$cmd->hasFullConditionMet()){ return null; } @@ -1203,7 +1203,7 @@ class GeneralAI 'che_포상', $this->general, $this->env, $lastTurn, Util::choiceRandomUsingWeightPair($candidateArgs) ); - if(!$cmd->isRunnable()){ + if(!$cmd->hasFullConditionMet()){ return null; } @@ -1287,7 +1287,7 @@ class GeneralAI 'che_포상', $this->general, $this->env, $lastTurn, Util::choiceRandomUsingWeightPair($candidateArgs) ); - if(!$cmd->isRunnable()){ + if(!$cmd->hasFullConditionMet()){ return null; } @@ -1398,7 +1398,7 @@ class GeneralAI 'che_포상', $this->general, $this->env, $lastTurn, Util::choiceRandomUsingWeightPair($candidateArgs) ); - if(!$cmd->isRunnable()){ + if(!$cmd->hasFullConditionMet()){ return null; } @@ -1528,7 +1528,7 @@ class GeneralAI 'che_몰수', $this->general, $this->env, $lastTurn, Util::choiceRandomUsingWeightPair($candidateArgs) ); - if(!$cmd->isRunnable()){ + if(!$cmd->hasFullConditionMet()){ return null; } @@ -1635,7 +1635,7 @@ class GeneralAI $cmd = buildNationCommandClass('che_선전포고', $this->general, $this->env, $lastTurn, [ 'destNationID' => Util::choiceRandomUsingWeight($nations) ]); - if(!$cmd->isRunnable()){ + if(!$cmd->hasFullConditionMet()){ return null; } @@ -1654,7 +1654,7 @@ class GeneralAI //천도를 한턴 넣었다면 계속 넣는다. if($lastTurn->getCommand() === '천도' && $lastTurn->getArg()['destCityID'] != $this->nation['capital']){ $cmd = buildNationCommandClass('che_천도', $this->general, $this->env, $lastTurn, $lastTurn->getArg()); - if($cmd->isRunnable()){ + if($cmd->hasFullConditionMet()){ $nationStor->setValue("last천도Trial_{$this->nation['nation']}", [$general->getVar('officer_level'), $general->getTurnTime()]); return $cmd; } @@ -1771,7 +1771,7 @@ class GeneralAI 'destCityID'=>$targetCityID ]); - if(!$cmd->isRunnable()){ + if(!$cmd->hasFullConditionMet()){ return null; } @@ -1802,13 +1802,13 @@ class GeneralAI if ($genType & self::t통솔장) { if ($develRate['trust'] < 0.95) { $cmd = buildGeneralCommandClass('che_주민선정', $general, $env); - if($cmd->isRunnable()){ + if($cmd->hasFullConditionMet()){ $cmdList[] = [$cmd, $leadership / Util::valueFit($develRate['trust']-0.2, 0.001) * 2]; } } if ($develRate['pop'] < 0.8) { $cmd = buildGeneralCommandClass('che_정착장려', $general, $env); - if($cmd->isRunnable()){ + if($cmd->hasFullConditionMet()){ $cmdList[] = [$cmd, $leadership / Util::valueFit($develRate['pop'], 0.001)]; } } @@ -1817,19 +1817,19 @@ class GeneralAI if($genType & self::t무장){ if($develRate['def'] < 1){ $cmd = buildGeneralCommandClass('che_수비강화', $general, $env); - if($cmd->isRunnable()){ + if($cmd->hasFullConditionMet()){ $cmdList[] = [$cmd, $strength / Util::valueFit($develRate['def'], 0.001)]; } } if($develRate['wall'] < 1){ $cmd = buildGeneralCommandClass('che_성벽보수', $general, $env); - if($cmd->isRunnable()){ + if($cmd->hasFullConditionMet()){ $cmdList[] = [$cmd, $strength / Util::valueFit($develRate['wall'], 0.001)]; } } if($develRate['secu'] < 0.9){ $cmd = buildGeneralCommandClass('che_치안강화', $general, $env); - if($cmd->isRunnable()){ + if($cmd->hasFullConditionMet()){ $cmdList[] = [$cmd, $strength / Util::valueFit($develRate['comm'] / 0.8, 0.001, 1)]; } } @@ -1838,7 +1838,7 @@ class GeneralAI if($genType & self::t지장){ if (!TechLimit($env['startyear'], $env['year'], $nation['tech'])) { $cmd = buildGeneralCommandClass('che_기술연구', $general, $env); - if ($cmd->isRunnable()) { + if ($cmd->hasFullConditionMet()) { $nextTech = $nation['tech'] % 1000 + 1; if (!TechLimit($env['startyear'], $env['year'], $nation['tech'] + 1000)) { //한등급 이상 뒤쳐져 있다면, 조금 더 열심히 하자. @@ -1850,13 +1850,13 @@ class GeneralAI } if ($develRate['agri'] < 1) { $cmd = buildGeneralCommandClass('che_농지개간', $general, $env); - if ($cmd->isRunnable()) { + if ($cmd->hasFullConditionMet()) { $cmdList[] = [$cmd, ($isSpringSummer?1.2:0.8) * $intel / Util::valueFit($develRate['agri'], 0.001, 1)]; } } if ($develRate['comm'] < 1) { $cmd = buildGeneralCommandClass('che_상업투자', $general, $env); - if ($cmd->isRunnable()) { + if ($cmd->hasFullConditionMet()) { $cmdList[] = [$cmd, ($isSpringSummer?0.8:1.2) * $intel / Util::valueFit($develRate['comm'], 0.001, 1)]; } } @@ -1887,14 +1887,14 @@ class GeneralAI if($city['trust'] < 70 && Util::randBool($leadership / GameConst::$chiefStatMin)){ $cmd = buildGeneralCommandClass('che_주민선정', $general, $env); - if($cmd->isRunnable()){ + if($cmd->hasFullConditionMet()){ return $cmd; } } if($city['pop'] < $this->nationPolicy->minNPCRecruitCityPopulation && Util::randBool($leadership / GameConst::$chiefStatMin / 2)){ $cmd = buildGeneralCommandClass('che_정착장려', $general, $env); - if($cmd->isRunnable()){ + if($cmd->hasFullConditionMet()){ return $cmd; } } @@ -1927,13 +1927,13 @@ class GeneralAI if ($genType & self::t통솔장) { if ($develRate['trust'] < 0.95) { $cmd = buildGeneralCommandClass('che_주민선정', $general, $env); - if($cmd->isRunnable()){ + if($cmd->hasFullConditionMet()){ $cmdList[] = [$cmd, $leadership / Util::valueFit($develRate['trust']-0.2, 0.001) * 2]; } } if ($develRate['pop'] < 0.8) { $cmd = buildGeneralCommandClass('che_정착장려', $general, $env); - if($cmd->isRunnable()){ + if($cmd->hasFullConditionMet()){ if (in_array($city['front'], [1, 3])) { $cmdList[] = [$cmd, $leadership / Util::valueFit($develRate['pop'], 0.001)]; } @@ -1947,19 +1947,19 @@ class GeneralAI if($genType & self::t무장){ if($develRate['def'] < 0.5){ $cmd = buildGeneralCommandClass('che_수비강화', $general, $env); - if($cmd->isRunnable()){ + if($cmd->hasFullConditionMet()){ $cmdList[] = [$cmd, $strength / Util::valueFit($develRate['def'], 0.001) / 2]; } } if($develRate['wall'] < 0.5){ $cmd = buildGeneralCommandClass('che_성벽보수', $general, $env); - if($cmd->isRunnable()){ + if($cmd->hasFullConditionMet()){ $cmdList[] = [$cmd, $strength / Util::valueFit($develRate['wall'], 0.001) / 2]; } } if($develRate['secu'] < 0.5){ $cmd = buildGeneralCommandClass('che_치안강화', $general, $env); - if($cmd->isRunnable()){ + if($cmd->hasFullConditionMet()){ $cmdList[] = [$cmd, $strength / Util::valueFit($develRate['secu'] / 0.8, 0.001, 1) / 4]; } } @@ -1968,7 +1968,7 @@ class GeneralAI if($genType & self::t지장){ if (!TechLimit($env['startyear'], $env['year'], $nation['tech'])) { $cmd = buildGeneralCommandClass('che_기술연구', $general, $env); - if ($cmd->isRunnable()) { + if ($cmd->hasFullConditionMet()) { $nextTech = $nation['tech'] % 1000 + 1; if (!TechLimit($env['startyear'], $env['year'], $nation['tech'] + 1000)) { //한등급 이상 뒤쳐져 있다면, 조금 더 열심히 하자. 전쟁중이면 더더욱 @@ -1980,7 +1980,7 @@ class GeneralAI } if ($develRate['agri'] < 0.5) { $cmd = buildGeneralCommandClass('che_농지개간', $general, $env); - if ($cmd->isRunnable()) { + if ($cmd->hasFullConditionMet()) { if (in_array($city['front'], [1, 3])) { $cmdList[] = [$cmd, ($isSpringSummer?1.2:0.8) * $intel / 4 / Util::valueFit($develRate['agri'], 0.001, 1)]; } @@ -1991,7 +1991,7 @@ class GeneralAI } if ($develRate['comm'] < 0.5) { $cmd = buildGeneralCommandClass('che_상업투자', $general, $env); - if ($cmd->isRunnable()) { + if ($cmd->hasFullConditionMet()) { if (in_array($city['front'], [1, 3])) { $cmdList[] = [$cmd, ($isSpringSummer?0.8:1.2) * $intel / 4 / Util::valueFit($develRate['comm'], 0.001, 1)]; } @@ -2055,7 +2055,7 @@ class GeneralAI 'amount' => Util::valueFit(Util::toInt($general->getVar('gold') - $avgAmount), 100, GameConst::$maxResourceActionAmount) ] ); - if($cmd->isRunnable()){ + if($cmd->hasFullConditionMet()){ return $cmd; } } @@ -2067,7 +2067,7 @@ class GeneralAI 'amount' => Util::valueFit(Util::toInt($general->getVar('rice') - $avgAmount), 100, GameConst::$maxResourceActionAmount) ] ); - if($cmd->isRunnable()){ + if($cmd->hasFullConditionMet()){ return $cmd; } } @@ -2081,7 +2081,7 @@ class GeneralAI 'amount' => Util::valueFit(Util::toInt($general->getVar('gold') - $avgAmount), 100, GameConst::$maxResourceActionAmount) ] ); - if($cmd->isRunnable()){ + if($cmd->hasFullConditionMet()){ return $cmd; } } @@ -2093,7 +2093,7 @@ class GeneralAI 'amount' => Util::valueFit(Util::toInt($general->getVar('rice') - $avgAmount), 100, GameConst::$maxResourceActionAmount) ] ); - if($cmd->isRunnable()){ + if($cmd->hasFullConditionMet()){ return $cmd; } } @@ -2250,7 +2250,7 @@ class GeneralAI - if(!$cmd->isRunnable()){ + if(!$cmd->hasFullConditionMet()){ return null; } return $cmd; @@ -2269,14 +2269,14 @@ class GeneralAI if($train < $this->nationPolicy->properWarTrainAtmos){ $cmd = buildGeneralCommandClass('che_훈련', $general, $this->env); - if($cmd->isRunnable()){ + if($cmd->hasFullConditionMet()){ $cmdList[] = [$cmd, GameConst::$maxTrainByCommand / Util::valueFit($train, 1)]; } } if($atmos < $this->nationPolicy->properWarTrainAtmos){ $cmd = buildGeneralCommandClass('che_사기진작', $general, $this->env); - if($cmd->isRunnable()){ + if($cmd->hasFullConditionMet()){ $cmdList[] = [$cmd, GameConst::$maxAtmosByCommand / Util::valueFit($atmos, 1)]; } } @@ -2302,7 +2302,7 @@ class GeneralAI return null; } $cmd = buildGeneralCommandClass('che_소집해제', $this->general, $this->env); - if(!$cmd->isRunnable()){ + if(!$cmd->hasFullConditionMet()){ return null; } return $cmd; @@ -2369,7 +2369,7 @@ class GeneralAI } $cmd = buildGeneralCommandClass('che_출병', $general, $this->env, ['destCityID' => Util::choiceRandom($attackableCities)]); - if(!$cmd->isRunnable()){ + if(!$cmd->hasFullConditionMet()){ return null; } @@ -2441,7 +2441,7 @@ class GeneralAI } $cmd = buildGeneralCommandClass('che_헌납', $general, $this->env, Util::choiceRandomUsingWeightPair($args)); - if(!$cmd->isRunnable()){ + if(!$cmd->hasFullConditionMet()){ return null; } return $cmd; @@ -2518,7 +2518,7 @@ class GeneralAI ]); - if(!$cmd->isRunnable()){ + if(!$cmd->hasFullConditionMet()){ return null; } @@ -2565,7 +2565,7 @@ class GeneralAI ]); - if(!$cmd->isRunnable()){ + if(!$cmd->hasFullConditionMet()){ return null; } @@ -2634,7 +2634,7 @@ class GeneralAI 'optionText' => '순간이동', 'destCityID' => Util::choiceRandomUsingWeight($candidateCities), ]); - if(!$cmd->isRunnable()){ + if(!$cmd->hasFullConditionMet()){ return null; } @@ -2651,7 +2651,7 @@ class GeneralAI } $cmd = buildGeneralCommandClass('che_귀환', $this->general, $this->env); - if(!$cmd->isRunnable()){ + if(!$cmd->hasFullConditionMet()){ return null; } @@ -2723,7 +2723,7 @@ class GeneralAI $cmd = buildGeneralCommandClass('che_이동', $general, $this->env, [ 'destCityID'=>Util::choiceRandomUsingWeight($targetCity) ]); - if(!$cmd->isRunnable()){ + if(!$cmd->hasFullConditionMet()){ return null; } @@ -2756,7 +2756,7 @@ class GeneralAI } $cmd = buildGeneralCommandClass('che_거병', $general, $this->env, null); - if(!$cmd->isRunnable()){ + if(!$cmd->hasFullConditionMet()){ return null; } @@ -2766,7 +2766,7 @@ class GeneralAI protected function do해산(): ?GeneralCommand { $cmd = buildGeneralCommandClass('che_해산', $this->general, $this->env, null); - if(!$cmd->isRunnable()){ + if(!$cmd->hasFullConditionMet()){ return null; } @@ -2782,7 +2782,7 @@ class GeneralAI 'nationType' => $nationType, 'colorType' => $nationColor ]); - if(!$cmd->isRunnable()){ + if(!$cmd->hasFullConditionMet()){ return null; } @@ -2796,7 +2796,7 @@ class GeneralAI 'destGeneralID' => $db->queryFirstField('SELECT `no` FROM general WHERE nation = %i AND npc != 5 ORDER BY RAND() LIMIT 1', $this->general->getNationID()) ]); - if(!$cmd->isRunnable()){ + if(!$cmd->hasFullConditionMet()){ return null; } @@ -2820,7 +2820,7 @@ class GeneralAI if ($rulerNation) { $cmd = buildGeneralCommandClass('che_임관', $general, $env, ['destNationID' => $rulerNation]); - if(!$cmd->isRunnable()){ + if(!$cmd->hasFullConditionMet()){ return null; } @@ -2849,7 +2849,7 @@ class GeneralAI //랜임 커맨드 입력. $cmd = buildGeneralCommandClass('che_랜덤임관', $general, $env); - if(!$cmd->isRunnable()){ + if(!$cmd->hasFullConditionMet()){ return null; } @@ -2860,7 +2860,7 @@ class GeneralAI $paths = array_keys(CityConst::byID($city['city'])->path); $cmd = buildGeneralCommandClass('che_이동', $general, $env, ['destCityID' => Util::choiceRandom($paths)]); - if(!$cmd->isRunnable()){ + if(!$cmd->hasFullConditionMet()){ return null; } @@ -2919,7 +2919,7 @@ class GeneralAI $cmd = buildGeneralCommandClass(Util::choiceRandom($candidate), $this->general, $this->env); - if(!$cmd->isRunnable()){ + if(!$cmd->hasFullConditionMet()){ return buildGeneralCommandClass('che_물자조달', $this->general, $this->env); } return $cmd; @@ -3105,7 +3105,7 @@ class GeneralAI } if(!($reservedCommand instanceof Command\Nation\휴식)){ - if($reservedCommand->isRunnable()){ + if($reservedCommand->hasFullConditionMet()){ $reservedCommand->reason = 'reserved'; return $reservedCommand; } @@ -3136,7 +3136,7 @@ class GeneralAI } public function chooseInstantNationTurn(NationCommand $reservedCommand): ?NationCommand{ - if($reservedCommand->isRunnable()){ + if($reservedCommand->hasFullConditionMet()){ return $reservedCommand; } diff --git a/hwe/sammo/ScoutMessage.php b/hwe/sammo/ScoutMessage.php index ba59c767..5916229e 100644 --- a/hwe/sammo/ScoutMessage.php +++ b/hwe/sammo/ScoutMessage.php @@ -84,7 +84,7 @@ class ScoutMessage extends Message{ 'month'=>$this->msgOption['month'] ]); - if(!$commandObj->isRunnable()){ + if(!$commandObj->hasFullConditionMet()){ $logger->pushGeneralActionLog($commandObj->getFailString()); return self::DECLINED; } diff --git a/hwe/sammo/TurnExecutionHelper.php b/hwe/sammo/TurnExecutionHelper.php index 7135e18f..fba82254 100644 --- a/hwe/sammo/TurnExecutionHelper.php +++ b/hwe/sammo/TurnExecutionHelper.php @@ -67,8 +67,7 @@ class TurnExecutionHelper $general = $this->getGeneral(); while(true){ - $failReason = $commandObj->testRunnable(); - if($failReason){ + if($commandObj->hasFullConditionMet()){ $date = $general->getTurnTime($general::TURNTIME_HM); $failString = $commandObj->getFailString(); $text = "{$failString} <1>{$date}"; @@ -110,8 +109,7 @@ class TurnExecutionHelper $commandClassName = $commandObj->getName(); while(true){ - $failReason = $commandObj->testRunnable(); - if($failReason){ + if($commandObj->hasFullConditionMet()){ $date = $general->getTurnTime($general::TURNTIME_HM); $failString = $commandObj->getFailString(); $text = "{$failString} <1>{$date}"; diff --git a/index.php b/index.php index 0519eaa2..9d6cf41a 100644 --- a/index.php +++ b/index.php @@ -1,7 +1,8 @@ isLoggedIn()) { ?> + 삼국지 모의전투 HiDCHe - - - - - - - - + + + + + + + + @@ -41,196 +43,190 @@ if ($session->isLoggedIn()) { + + - -
-
-
-

삼국지 모의전투 HiDCHe

-
-
-
-

- 로그인 -

-
- -
-
- -
- -
-
+ +
+
+
+

삼국지 모의전투 HiDCHe

+
+
+
+

+ 로그인 +

+
- -
- -
- -
-
- - -
-
-
-
+
+
+
+
+
개인정보처리방침 & 이용약관
© 2020 • HideD +
크롬과 파이어폭스에 최적화되어있습니다.
+
+
+ + -
-
-
-
개인정보처리방침 & 이용약관
© 2020 • HideD -
크롬과 파이어폭스에 최적화되어있습니다.
-
- - - + + \ No newline at end of file diff --git a/j_login.php b/j_login.php index e2c41c62..b431f6e6 100644 --- a/j_login.php +++ b/j_login.php @@ -1,69 +1,71 @@ isLoggedIn()){ +if ($session->isLoggedIn()) { $session->logout(); } $username = mb_strtolower(Util::getReq('username'), 'utf-8'); $password = Util::getReq('password'); -if(!$username || !$password){ +if (!$username || !$password) { Json::die([ - 'result'=>false, - 'reqOTP'=>false, - 'reason'=>'올바르지 않은 입력입니다.' + 'result' => false, + 'reqOTP' => false, + 'reason' => '올바르지 않은 입력입니다.' ]); } -function kakaoOAuthCheck(array $userInfo) : ?array { +function kakaoOAuthCheck(array $userInfo): ?array +{ - if(!\kakao\KakaoKey::REST_KEY){ + if (!\kakao\KakaoKey::REST_KEY) { return [false, '카카오 API 앱이 등록되지 않았습니다. 관리자에게 문의해 주세요.']; } $oauthID = $userInfo['oauth_id']; - $oauthInfo = Json::decode($userInfo['oauth_info'])??[]; - if(!$oauthInfo){ + $oauthInfo = Json::decode($userInfo['oauth_info']) ?? []; + if (!$oauthInfo) { return [false, 'OAuth 정보가 보관되어 있지 않습니다. 카카오 로그인을 수행해 주세요.']; } - - $accessToken = $oauthInfo['accessToken']??null; - $refreshToken = $oauthInfo['refreshToken']??null; - $accessTokenValidUntil = $oauthInfo['accessTokenValidUntil']??null; - $refreshTokenValidUntil = $oauthInfo['refreshTokenValidUntil']??null; - $OTPValue = $oauthInfo['OTPValue']??null; - $OTPTrialUntil = $oauthInfo['OTPTrialUntil']??null; + + $accessToken = $oauthInfo['accessToken'] ?? null; + $refreshToken = $oauthInfo['refreshToken'] ?? null; + $accessTokenValidUntil = $oauthInfo['accessTokenValidUntil'] ?? null; + $refreshTokenValidUntil = $oauthInfo['refreshTokenValidUntil'] ?? null; + $OTPValue = $oauthInfo['OTPValue'] ?? null; + $OTPTrialUntil = $oauthInfo['OTPTrialUntil'] ?? null; $tokenValidUntil = $userInfo['token_valid_until']; - if(!$accessToken || !$refreshToken || !$accessTokenValidUntil || !$refreshTokenValidUntil){ + if (!$accessToken || !$refreshToken || !$accessTokenValidUntil || !$refreshTokenValidUntil) { return [false, 'OAuth 정보가 보관되어 있지 않습니다. 카카오 로그인을 수행해 주세요.']; } $now = TimeUtil::now(); - if($now > $refreshTokenValidUntil){ + if ($now > $refreshTokenValidUntil) { return [false, '로그인 토큰이 만료되었습니다. 카카오 로그인을 수행해 주세요.']; } - if($now > $accessTokenValidUntil){ + if ($now > $accessTokenValidUntil) { $apiHelper = new Kakao_REST_API_Helper($accessToken); $refreshResult = $apiHelper->refresh_access_token($refreshToken); - if(!$refreshResult){ + if (!$refreshResult) { return [false, '로그인 토큰 자동 갱신을 실패했습니다. 카카오 로그인을 수행해 주세요.']; } - $accessToken = $refreshResult['access_token']??null; + $accessToken = $refreshResult['access_token'] ?? null; - if(!$accessToken){ - trigger_error("refreshToken 에러 ".Json::encode($refreshResult).",".$refreshToken.",".substr(\kakao\KakaoKey::REST_KEY, 0, 6), E_USER_NOTICE); + if (!$accessToken) { + trigger_error("refreshToken 에러 " . Json::encode($refreshResult) . "," . $refreshToken . "," . substr(\kakao\KakaoKey::REST_KEY, 0, 6), E_USER_NOTICE); return [false, '로그인 토큰 자동 갱신을 실패했습니다. 카카오 로그인을 수행해 주세요.']; } $accessTokenValidUntil = TimeUtil::nowAddSeconds($refreshResult['expires_in']); @@ -71,20 +73,20 @@ function kakaoOAuthCheck(array $userInfo) : ?array { $oauthInfo['accessToken'] = $accessToken; $oauthInfo['accessTokenValidUntil'] = $accessTokenValidUntil; - $refreshToken = $refreshResult['refresh_token']??null; - if($refreshToken){ + $refreshToken = $refreshResult['refresh_token'] ?? null; + if ($refreshToken) { $refreshTokenValidUntil = TimeUtil::nowAddSeconds($refreshResult['refresh_token_expires_in']); $oauthInfo['refreshToken'] = $refreshToken; $oauthInfo['refresh_token_expires_in'] = $refreshTokenValidUntil; } - + RootDB::db()->update('member', [ - 'oauth_info'=>Json::encode($oauthInfo) + 'oauth_info' => Json::encode($oauthInfo) ], 'no=%i', $userInfo['no']); } - if($tokenValidUntil && $now <= $tokenValidUntil){ + if ($tokenValidUntil && $now <= $tokenValidUntil) { return null; } @@ -95,7 +97,7 @@ function kakaoOAuthCheck(array $userInfo) : ?array { $session->refresh_token = $refreshToken; $session->refresh_token_expires = $refreshTokenValidUntil; - if(!createOTPbyUserNO($userInfo['no'])){ + if (!createOTPbyUserNO($userInfo['no'])) { return [false, '인증 코드를 보내는데 실패했습니다.']; } @@ -103,75 +105,75 @@ function kakaoOAuthCheck(array $userInfo) : ?array { } $userInfo = $RootDB->queryFirstRow( - 'SELECT `no`, `id`, `name`, `grade`, `delete_after`, `acl`, oauth_id, oauth_type, oauth_info, token_valid_until '. - 'from member where id=%s_username AND '. - 'pw=sha2(concat(salt, %s_password, salt), 512)',[ - 'username'=>$username, - 'password'=>$password -]); + 'SELECT `no`, `id`, `name`, `grade`, `delete_after`, `acl`, oauth_id, oauth_type, oauth_info, token_valid_until ' . + 'from member where id=%s_username AND ' . + 'pw=sha2(concat(salt, %s_password, salt), 512)', + [ + 'username' => $username, + 'password' => $password + ] +); -if(!$userInfo){ +if (!$userInfo) { Json::die([ - 'result'=>false, - 'reqOTP'=>false, - 'reason'=>'아이디나 비밀번호가 올바르지 않습니다.' + 'result' => false, + 'reqOTP' => false, + 'reason' => '아이디나 비밀번호가 올바르지 않습니다.' ]); } $canLogin = $RootDB->queryFirstField('SELECT `LOGIN` FROM `system` WHERE `NO` = 1'); -if($canLogin != 'Y' && $userInfo['grade'] < 5){ +if ($canLogin != 'Y' && $userInfo['grade'] < 5) { Json::die([ - 'result'=>false, - 'reason'=>'현재는 로그인이 금지되어있습니다!' + 'result' => false, + 'reason' => '현재는 로그인이 금지되어있습니다!' ]); } $nowDate = TimeUtil::now(); -if($userInfo['delete_after']){ - if($userInfo['delete_after'] < $nowDate){ +if ($userInfo['delete_after']) { + if ($userInfo['delete_after'] < $nowDate) { $RootDB->delete('member', 'no=%i', $userInfo['no']); Json::die([ - 'result'=>false, - 'reqOTP'=>false, - 'reason'=>"기간 만기로 삭제되었습니다. 재 가입을 시도해주세요." + 'result' => false, + 'reqOTP' => false, + 'reason' => "기간 만기로 삭제되었습니다. 재 가입을 시도해주세요." ]); - } - else{ + } else { Json::die([ - 'result'=>false, - 'reqOTP'=>false, - 'reason'=>"삭제 요청된 계정입니다.[{$userInfo['delete_after']}]" + 'result' => false, + 'reqOTP' => false, + 'reason' => "삭제 요청된 계정입니다.[{$userInfo['delete_after']}]" ]); } - } -$RootDB->insert('member_log',[ - 'member_no'=>$userInfo['no'], - 'action_type'=>'login', - 'action'=>Json::encode([ - 'ip'=>Util::get_client_ip(true), - 'type'=>'plain' +$RootDB->insert('member_log', [ + 'member_no' => $userInfo['no'], + 'action_type' => 'login', + 'action' => Json::encode([ + 'ip' => Util::get_client_ip(true), + 'type' => 'plain' ]) ]); -if($userInfo['oauth_type'] == 'KAKAO'){ +if ($userInfo['oauth_type'] == 'KAKAO') { $oauthFailResult = kakaoOAuthCheck($userInfo); - if($oauthFailResult !== null){ - $session->login($userInfo['no'], $userInfo['id'], $userInfo['grade'], true, $userInfo['token_valid_until'], Json::decode($userInfo['acl']??'{}')); + if ($oauthFailResult !== null) { + $session->login($userInfo['no'], $userInfo['id'], $userInfo['grade'], true, $userInfo['token_valid_until'], Json::decode($userInfo['acl'] ?? '{}')); [$oauthReqOTP, $oauthFailReason] = $oauthFailResult; Json::die([ - 'result'=>false, - 'reqOTP'=>$oauthReqOTP, - 'reason'=>$oauthFailReason - ]); + 'result' => false, + 'reqOTP' => $oauthReqOTP, + 'reason' => $oauthFailReason + ]); } } -$session->login($userInfo['no'], $userInfo['id'], $userInfo['grade'], false, $userInfo['token_valid_until'], Json::decode($userInfo['acl']??'{}')); +$session->login($userInfo['no'], $userInfo['id'], $userInfo['grade'], false, $userInfo['token_valid_until'], Json::decode($userInfo['acl'] ?? '{}')); Json::die([ - 'result'=>true, - 'reqOTP'=>false, - 'reason'=>'로그인 되었습니다.' -]); \ No newline at end of file + 'result' => true, + 'reqOTP' => false, + 'reason' => '로그인 되었습니다.' +]); diff --git a/j_updateServer.php b/j_updateServer.php index aefaf8d2..023cf638 100644 --- a/j_updateServer.php +++ b/j_updateServer.php @@ -1,21 +1,21 @@ setReadOnly(); @@ -32,10 +32,10 @@ $v->rule('required', [ 'server' ])->rule('regex', 'target', '/^[0-9a-zA-Z^{}\\/\-_,.@]+$/'); -if(!$v->validate()){ +if (!$v->validate()) { Json::die([ - 'result'=>false, - 'reason'=>$v->errorStr() + 'result' => false, + 'reason' => $v->errorStr() ]); } @@ -43,177 +43,174 @@ $target = Util::getReq('target'); $server = basename($request['server']); -$allowFullUpdate = in_array('fullUpdate', $session->acl[$server]??[]); +$allowFullUpdate = in_array('fullUpdate', $session->acl[$server] ?? []); $allowFullUpdate |= $session->userGrade >= 6; -$allowUpdate = in_array('update', $session->acl[$server]??[]); +$allowUpdate = in_array('update', $session->acl[$server] ?? []); $allowUpdate |= $session->userGrade >= 5; $allowUpdate |= $allowFullUpdate; -if(!$allowUpdate){ +if (!$allowUpdate) { Json::die([ - 'result'=>false, - 'reason'=>'권한이 충분하지 않습니다' + 'result' => false, + 'reason' => '권한이 충분하지 않습니다' ]); } $src_target = $storage->$server; -if($src_target){ +if ($src_target) { $src_target = $src_target[0]; } -if(!$allowFullUpdate || !$target){ +if (!$allowFullUpdate || !$target) { $target = $src_target; -} -else{ +} else { $target = $request['target']; } $baseServerName = Util::array_last_key(AppConf::getList()); -if(!$target && $server != $baseServerName){ +if (!$target && $server != $baseServerName) { Json::die([ - 'result'=>false, - 'reason'=>'git -ish target이 제대로 지정되지 않았습니다.' + 'result' => false, + 'reason' => 'git -ish target이 제대로 지정되지 않았습니다.' ]); } -$targetDir =$target.':'.$baseServerName; +$targetDir = $target . ':' . $baseServerName; -if(!key_exists($server, AppConf::getList())){ +if (!key_exists($server, AppConf::getList())) { Json::die([ - 'result'=>false, - 'reason'=>'불가능한 서버 이름입니다.' + 'result' => false, + 'reason' => '불가능한 서버 이름입니다.' ]); } -if(\file_exists($server) && !is_dir($server)){ +if (\file_exists($server) && !is_dir($server)) { Json::die([ - 'result'=>false, - 'reason'=>'같은 이름을 가진 파일이 있습니다.' + 'result' => false, + 'reason' => '같은 이름을 가진 파일이 있습니다.' ]); } -if(file_exists($server) && !is_writable($server)){ +if (file_exists($server) && !is_writable($server)) { Json::die([ - 'result'=>false, - 'reason'=>$server.' 디렉토리 쓰기 권한이 없습니다.' + 'result' => false, + 'reason' => $server . ' 디렉토리 쓰기 권한이 없습니다.' ]); } -if(!file_exists($server)){ - if(!is_writable('.')){ +if (!file_exists($server)) { + if (!is_writable('.')) { Json::die([ - 'result'=>false, - 'reason'=>$server.' 디렉토리가 없지만 생성할 권한이 없습니다.' + 'result' => false, + 'reason' => $server . ' 디렉토리가 없지만 생성할 권한이 없습니다.' ]); } mkdir($server, 0755); } -if($server == $baseServerName){ +if ($server == $baseServerName) { exec("git fetch -q 2>&1", $output); - if($output){ + if ($output) { Json::die([ - 'result'=>false, - 'reason'=>'git pull 작업 : '.join(', ', $output) + 'result' => false, + 'reason' => 'git pull 작업 : ' . join(', ', $output) ]); } - if($target != $src_target){ + if ($target != $src_target) { $command = sprintf('git checkout %s -q 2>&1', $target); exec($command, $output); - if($output){ + if ($output) { Json::die([ - 'result'=>false, - 'reason'=>join(', ', $output) + 'result' => false, + 'reason' => join(', ', $output) ]); } } exec("git pull -q 2>&1", $output); - if($output && $output[0] != 'Already up-to-date.'){ + if ($output && $output[0] != 'Already up-to-date.') { Json::die([ - 'result'=>false, - 'reason'=>'git pull 작업 : '.join(', ', $output) + 'result' => false, + 'reason' => 'git pull 작업 : ' . join(', ', $output) ]); } $version = getVersion(); $result = Util::generateFileUsingSimpleTemplate( - __DIR__.'/'.$server.'/d_setting/VersionGit.orig.php', - __DIR__.'/'.$server.'/d_setting/VersionGit.php',[ - 'verionGit'=>$version - ], true + __DIR__ . '/' . $server . '/d_setting/VersionGit.orig.php', + __DIR__ . '/' . $server . '/d_setting/VersionGit.php', + [ + 'verionGit' => $version + ], + true ); - - if(ServConfig::$imageRequestKey){ + + if (ServConfig::$imageRequestKey) { try { $imagePullPath = ServConfig::getImagePullURI(); $pullResult = @file_get_contents($imagePullPath); - if($pullResult === false){ + if ($pullResult === false) { throw new \ErrorException('Invalid URI'); } $pullResult = Json::decode($pullResult); - if($pullResult['result']){ + if ($pullResult['result']) { $imgResult = true; $imgDetail = $pullResult['version']; - } - else{ + } else { $imgResult = false; $imgDetail = $pullResult['reason']; } - } - catch(\Exception $e){ + } catch (\Exception $e) { $imgResult = false; $imgDetail = $e->getMessage(); } - } - else{ + } else { $imgResult = true; $imgDetail = 'No key'; } - - + + $storage->$server = [$target, $version]; opcache_reset(); Json::die([ - 'server'=>$server, - 'result'=>true, - 'version'=>$version, - 'imgResult'=>$imgResult, - 'imgDetail'=>$imgDetail, + 'server' => $server, + 'result' => true, + 'version' => $version, + 'imgResult' => $imgResult, + 'imgDetail' => $imgDetail, ]); - } $command = sprintf('git archive --format=zip -o %s %s', escapeshellarg($tmpFile), escapeshellarg($targetDir)); exec("$command 2>&1", $output); -if($output){ +if ($output) { Json::die([ - 'result'=>false, - 'reason'=>join(', ', $output) + 'result' => false, + 'reason' => join(', ', $output) ]); } $zip = new \ZipArchive; -if($zip->open($tmpFile) !== true){ +if ($zip->open($tmpFile) !== true) { Json::die([ - 'result'=>false, - 'reason'=>'archive가 생성되지 않았습니다.' + 'result' => false, + 'reason' => 'archive가 생성되지 않았습니다.' ]); } -if(!$zip->extractTo($server)){ +if (!$zip->extractTo($server)) { Json::die([ - 'result'=>false, - 'reason'=>'생성한 archive를 제대로 옮기지 못했습니다.' + 'result' => false, + 'reason' => '생성한 archive를 제대로 옮기지 못했습니다.' ]); } @@ -222,10 +219,12 @@ $zip->close(); $version = getVersion($target); $result = Util::generateFileUsingSimpleTemplate( - __DIR__.'/'.$server.'/d_setting/VersionGit.orig.php', - __DIR__.'/'.$server.'/d_setting/VersionGit.php',[ - 'verionGit'=>$version - ], true + __DIR__ . '/' . $server . '/d_setting/VersionGit.orig.php', + __DIR__ . '/' . $server . '/d_setting/VersionGit.php', + [ + 'verionGit' => $version + ], + true ); $storage->$server = [$target, $version]; @@ -233,7 +232,7 @@ $storage->$server = [$target, $version]; opcache_reset(); Json::die([ - 'server'=>$server, - 'result'=>true, - 'version'=>$version -]); \ No newline at end of file + 'server' => $server, + 'result' => true, + 'version' => $version +]); diff --git a/showErrorLog.php b/showErrorLog.php index a5051852..7fb18c48 100644 --- a/showErrorLog.php +++ b/showErrorLog.php @@ -1,38 +1,38 @@ setReadOnly(); -if(key_exists('from', $_REQUEST) && is_numeric($_REQUEST['from'])){ - $from = (int)$_REQUEST['from']; - if($from < 0){ +if (key_exists('from', $_REQUEST) && is_numeric($_REQUEST['from'])) { + $from = (int) $_REQUEST['from']; + if ($from < 0) { $from = 0; } -} -else{ +} else { $from = 0; } $allowUpdate = false; -foreach($session->acl as $eachAcl){ - if(in_array('fullUpdate', $eachAcl)){ +foreach ($session->acl as $eachAcl) { + if (in_array('fullUpdate', $eachAcl)) { $allowUpdate = true; break; } - if(in_array('update', $eachAcl)){ + if (in_array('update', $eachAcl)) { $allowUpdate = true; break; } } $allowUpdate |= $session->userGrade >= 5; -if(!$allowUpdate){ +if (!$allowUpdate) { header('Location:./'); } -$fdb = FileDB::db(ROOT.'/d_log/err_log.sqlite3', ROOT.'/f_install/sql/err_log.sql'); +$fdb = FileDB::db(ROOT . '/d_log/err_log.sqlite3', ROOT . '/f_install/sql/err_log.sql'); $err_logs = $fdb->select('err_log', [ 'date', @@ -42,48 +42,51 @@ $err_logs = $fdb->select('err_log', [ 'trace', 'webuser' ], [ - 'ORDER'=>['id'=>'DESC'], - 'LIMIT'=>[$from, 100] + 'ORDER' => ['id' => 'DESC'], + 'LIMIT' => [$from, 100] ]); ?> - - - - - 에러 로그 - - - + + + + + 에러 로그 - - - + + + + + + + + -
- -
-
- - -
-
-
-
    - -
  • - - -
  • - -
  • -
-
+
+ +
+
+ - +
+
+
+
    + +
  • + + +
  • + +
  • +
+
+
+ + +100
- -+100 -
+ \ No newline at end of file diff --git a/src/sammo/JosaUtil.php b/src/sammo/JosaUtil.php index 377e61a8..6e39cef2 100644 --- a/src/sammo/JosaUtil.php +++ b/src/sammo/JosaUtil.php @@ -451,7 +451,8 @@ class JosaUtil{ private static $init = false; - private static function init(){ + private static function init() + { if(JosaUtil::$init){ return; } @@ -502,7 +503,8 @@ class JosaUtil{ return false; } - private static function checkCode(int $code, bool $isRo){ + private static function checkCode(int $code, bool $isRo) + { JosaUtil::init(); $jongsung = ($code - JosaUtil::KO_START_CODE) % 28; @@ -517,7 +519,8 @@ class JosaUtil{ return true; } - public static function check(string $text, string $type){ + public static function check(string $text, string $type) + { JosaUtil::init(); $htarget = preg_replace(JosaUtil::REG_INVALID_CHAR_W_HANJA, ' ', $text); @@ -560,7 +563,8 @@ class JosaUtil{ return JosaUtil::checkText($target, $isRo); } - public static function pick($text, string $wJongsung, string $woJongsung=''){ + public static function pick($text, string $wJongsung, string $woJongsung='') + { /* NOTE:원본 코드와 인자 순서가 다름. * 원본은 pick('바람', '랑', '이랑'); 이었다면 JosaUtil::pick('바람', '이랑', '랑'); 으로 바뀜. * JosaUtil::pick('바람', '은', '는'); JosaUti::pick('바람', '이', '가');처럼 쓰기 위해서임.