queryAllLists('SELECT nation,rate_tmp,type FROM nation'); // 인구 및 민심 $db->update('city', [ 'trust' => 50, 'agri' => $db->sqleval('agri * 0.99'), 'comm' => $db->sqleval('comm * 0.99'), 'secu' => $db->sqleval('secu * 0.99'), 'def' => $db->sqleval('def * 0.99'), 'wall' => $db->sqleval('wall * 0.99'), ], 'nation=0'); foreach ($nationList as [$nationID, $taxRate, $nationType]) { $nationTypeObj = buildNationTypeClass($nationType); $popRatio = (30 - $taxRate) / 200; // 20일때 5% 5일때 12.5% 50일때 -10% $popRatio = $nationTypeObj->onCalcNationalIncome('pop', $popRatio); $updateVar = []; if ($popRatio >= 0) { $updateVar['pop'] = $db->sqleval('least(pop_max, %i + pop * (1 + %d * (1 + secu / secu_max / 10)))', GameConst::$basePopIncreaseAmount, $popRatio); } else { $updateVar['pop'] = $db->sqleval('least(pop_max, %i + pop * (1 + %d * (1 - secu / secu_max / 10)))', GameConst::$basePopIncreaseAmount, $popRatio); } $genericRatio = (20 - $taxRate) / 200; // 20일때 0% 0일때 10% 100일때 -40% foreach (['agri', 'comm', 'secu', 'def', 'wall'] as $key) { $updateVar[$key] = $db->sqleval('least(%b, %b * (1 + %d))', $key . '_max', $key, $genericRatio); } $trustDiff = 20 - $taxRate; $updateVar['trust'] = $db->sqleval('greatest(0, least(100, trust + %i))', $trustDiff); $db->update('city', $updateVar, 'nation = %i AND supply = 1', $nationID); } } public function run(array $env) { $db = DB::db(); $resource = $this->resource; $traceGeneralIDs = array_filter(explode(',', (string)getenv('REF_AI_TRACE_GENERAL_IDS')), 'strlen'); if (getenv('REF_DETERMINISTIC_INSTALL_ENABLED') === '1' && getenv('SEED_PARITY_MONTHLY_RESOURCE_TRACE') === '1') { foreach ($traceGeneralIDs as $generalID) { $current = $db->queryFirstField('SELECT %b FROM general WHERE no = %i', $resource, (int)$generalID); if ($current !== null) { fwrite(STDOUT, 'MONTHLY_RESOURCE_REF ' . json_encode([ 'action' => 'ProcessSemiAnnual', 'resource' => $resource, 'generalId' => (int)$generalID, 'current' => (int)$current, ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . "\n"); } } } // 내정 1% 감소 $db->update('city', [ 'dead' => 0, 'agri' => $db->sqleval('agri * 0.99'), 'comm' => $db->sqleval('comm * 0.99'), 'secu' => $db->sqleval('secu * 0.99'), 'def' => $db->sqleval('def * 0.99'), 'wall' => $db->sqleval('wall * 0.99'), ], true); //인구 증가 popIncrease(); // > 10000 유지비 3%, > 1000 유지비 1% // 유지비 1% $db->update('general', [ $resource => $db->sqleval('IF(%b > 10000, %b * 0.97, %b * 0.99)', $resource, $resource, $resource) ], '%b > 1000', $resource); if (getenv('REF_DETERMINISTIC_INSTALL_ENABLED') === '1' && getenv('SEED_PARITY_MONTHLY_RESOURCE_TRACE') === '1') { foreach ($traceGeneralIDs as $generalID) { $next = $db->queryFirstField('SELECT %b FROM general WHERE no = %i', $resource, (int)$generalID); if ($next !== null) { fwrite(STDOUT, 'MONTHLY_RESOURCE_REF ' . json_encode([ 'action' => 'ProcessSemiAnnualAfter', 'resource' => $resource, 'generalId' => (int)$generalID, 'next' => (int)$next, ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . "\n"); } } } // > 100000 유지비 5%, > 100000 유지비 3%, > 1000 유지비 1% $db->update('nation', [ $resource => $db->sqleval('IF(%b > 100000, %b * 0.95, IF(%b > 10000, %b * 0.97, %b * 0.99))', $resource, $resource, $resource, $resource, $resource) ], '%b > 1000', $resource); } }