test(compare): trace deterministic monthly seed progression

This commit is contained in:
2026-08-03 18:57:01 +00:00
parent 3b2fd1082f
commit f16a6b6880
23 changed files with 1274 additions and 213 deletions
+15
View File
@@ -94,6 +94,21 @@ class ProcessIncome extends \sammo\Event\Action
foreach ($generalRawList as $rawGeneral) {
$generalObj = new General($rawGeneral, null, null, null, null, $year, $month, false);
$gold = Util::round(getBill($generalObj->getVar('dedication')) * $ratio);
if (
getenv('REF_DETERMINISTIC_INSTALL_ENABLED') === '1'
&& getenv('SEED_PARITY_MONTHLY_RESOURCE_TRACE') === '1'
&& in_array((string)$generalObj->getID(), explode(',', (string)getenv('REF_AI_TRACE_GENERAL_IDS')), true)
) {
fwrite(STDOUT, 'MONTHLY_RESOURCE_REF ' . json_encode([
'action' => 'ProcessIncome',
'type' => 'gold',
'generalId' => $generalObj->getID(),
'current' => $generalObj->getVar('gold'),
'pay' => $gold,
'ratio' => $ratio,
'originOutcome' => $originoutcome,
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . "\n");
}
$generalObj->increaseVar('gold', $gold);
$logger = $generalObj->getLogger();
@@ -71,6 +71,21 @@ class ProcessSemiAnnual extends \sammo\Event\Action
$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,
@@ -90,6 +105,20 @@ class ProcessSemiAnnual extends \sammo\Event\Action
$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)
+27 -1
View File
@@ -114,7 +114,7 @@ class RaiseDisaster extends \sammo\Event\Action
if (!$isGood) {
//FIXME: factory 형태로 바꿔야함
$generalListByCity = Util::arrayGroupBy($db->query(
'SELECT %l FROM general WHERE city IN %li',
'SELECT %l FROM general WHERE city IN %li ORDER BY city, no',
Util::formatListOfBackticks(General::mergeQueryColumn()[0]),
Util::squeezeFromArray($targetCityList, 'city')),
'city');
@@ -133,6 +133,19 @@ class RaiseDisaster extends \sammo\Event\Action
'def' => $db->sqleval('def * %d', $affectRatio),
'wall' => $db->sqleval('wall * %d', $affectRatio),
], 'city = %i', $city['city']);
if (in_array((string)$city['city'], array_filter(explode(',', (string)getenv('REF_AI_TRACE_CITY_IDS')), 'strlen'), true)) {
$storedTrust = $db->queryFirstField('SELECT trust FROM city WHERE city = %i', $city['city']);
fwrite(STDOUT, 'MONTHLY_FLOAT_TRACE ' . json_encode([
'engine' => 'ref',
'cityId' => $city['city'],
'year' => $year,
'month' => $month,
'isGood' => false,
'inputTrust' => $city['trust'],
'affectRatio' => $affectRatio,
'storedTrust' => $storedTrust,
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . "\n");
}
$generalList = array_map(
function ($rawGeneral) use ($city, $year, $month) {
@@ -158,6 +171,19 @@ class RaiseDisaster extends \sammo\Event\Action
'def' => $db->sqleval('least(def * %d, def_max)', $affectRatio),
'wall' => $db->sqleval('least(wall * %d, wall_max)', $affectRatio),
], 'city = %i', $city['city']);
if (in_array((string)$city['city'], array_filter(explode(',', (string)getenv('REF_AI_TRACE_CITY_IDS')), 'strlen'), true)) {
$storedTrust = $db->queryFirstField('SELECT trust FROM city WHERE city = %i', $city['city']);
fwrite(STDOUT, 'MONTHLY_FLOAT_TRACE ' . json_encode([
'engine' => 'ref',
'cityId' => $city['city'],
'year' => $year,
'month' => $month,
'isGood' => true,
'inputTrust' => $city['trust'],
'affectRatio' => $affectRatio,
'storedTrust' => $storedTrust,
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . "\n");
}
}
}
}