test(compare): trace NPC possession selection

This commit is contained in:
2026-07-31 04:39:00 +00:00
parent 765dee831c
commit 90d078c100
4 changed files with 514 additions and 30 deletions
+12 -30
View File
@@ -55,14 +55,9 @@ if($token && $refresh){
if($nowT >= $pickMoreFrom){
$oldPickResult = Json::decode($token['pick_result']);
foreach($keepResult as $keepId){
if(\key_exists($keepId, $oldPickResult) && $oldPickResult[$keepId]['keepCnt'] > 0){
$pickResult[$keepId] = $oldPickResult[$keepId];
$pickResult[$keepId]['keepCnt']-=1;
}
}
if(count($pickResult) == count($oldPickResult)){
$keepSelection = NpcPossessionSelector::applyKeep($oldPickResult, $keepResult);
$pickResult = $keepSelection['picked'];
if($keepSelection['cancelled']){
$refresh = false;
}
}
@@ -96,35 +91,22 @@ foreach($db->query('SELECT `no`, `name`, leadership, strength, intel, nation, im
$general['personal'] = buildPersonalityClass($general['personal'])->getName();
$general['nation'] = getNationStaticInfo($general['nation'])['name'];
$candidates[$general['no']] = $general + ['keepCnt'=>KEEP_CNT];
$allStat = $general['leadership'] + $general['strength'] + $general['intel'];
$weight[$general['no']] = pow($allStat, 1.5);
$weight[$general['no']] = NpcPossessionSelector::weight($general);
}
foreach($db->queryFirstColumn('SELECT pick_result FROM select_npc_token WHERE `owner`!=%i AND valid_until >=%s', $userID, $now) as $reserved){
$reserved = Json::decode($reserved);
foreach(array_keys($reserved) as $reservedNPC){
if(key_exists($reservedNPC, $weight)){
unset($candidates[$reservedNPC]);
unset($weight[$reservedNPC]);
}
}
}
NpcPossessionSelector::removeReserved(
$candidates,
$weight,
$db->queryFirstColumn('SELECT pick_result FROM select_npc_token WHERE `owner`!=%i AND valid_until >=%s', $userID, $now),
);
$rng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
$rng = new RandUtil(new LiteHashDRBG(NpcPossessionSelector::buildSeed(
UniqueConst::$hiddenSeed,
'SelectNPCToken',
$userID,
$now,
)));
$pickLimit = min(count($candidates), 5);
while(count($pickResult) < $pickLimit){
$generalID = $rng->choiceUsingWeight($weight);
if(!key_exists($generalID, $pickResult)){
$pickResult[$generalID] = $candidates[$generalID];
}
}
$pickResult = NpcPossessionSelector::select($candidates, $weight, $pickResult, $rng);
$newNonce = random_int(0, 0xfffffff);
@@ -176,4 +158,4 @@ Json::die([
'pickMoreFrom'=>($inserted===-1)?$pickMoreFrom->format('Y-m-d H:i:s'):'2000-01-01 01:00:00',
'pickMoreSeconds'=>($inserted===-1)?$pickMoreSecond:0,
'validUntil'=>$validUntil->format('Y-m-d H:i:s')
]);
]);