test(compare): trace NPC possession selection
This commit is contained in:
@@ -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')
|
||||
]);
|
||||
]);
|
||||
|
||||
Reference in New Issue
Block a user