假设:小丑速度参数在 335545 个 fp32 间均匀取值,小丑倒计时随机数为一个 0~299 的均匀整数分布,1/20为早爆丑,出生点为一个 780~819 的均匀整数分布。
下表列出了在一段时间内每个时机,单个小丑的一切可能性在对应位置开盒的数量。
假设:小丑速度参数在 335545 个 fp32 间均匀取值,小丑倒计时随机数为一个 0~299 的均匀整数分布,1/20为早爆丑,出生点为一个 780~819 的均匀整数分布。
下表列出了在一段时间内每个时机,单个小丑的一切可能性在对应位置开盒的数量。
const std::array<float,19> jack_ground = {
-49.8f, -49.8f, -49.2f, -48.6f, -47.9f, -44.3f,
-40.7f, -39.7f, -38.7f, -38.7f, -37.8f, -36.8f, -35.8f,
-34.0f, -32.1f, -32.1f, -32.1f, -30.5f, -28.9f
};
constexpr int jack_frame_cnt=19;
constexpr float jack_tot_dx=-28.9f-(-49.8f);
constexpr unsigned jack_dx_lim=0x3f28f5c3,jack_dx_sup=0x3f2e147b;
void oper_jack(int t,int ice_time,bool is_half){
for(int i=0;i<40;++i){
for(unsigned dx=jack_dx_lim;dx<=jack_dx_sup;++dx){
float f_dx=*(float*)&dx;
jack_walk(f_dx,t,ice_time,is_half,i);
}
}
}
void jack_walk(float dx,int t,int ice_time,bool is_half,int begin_pos){
float delta_reanim_progress=(dx*moveC/jack_tot_dx)*0.01f;
float reanim_progress=delta_reanim_progress;
if(is_half)reanim_progress*=chill_modifier;
// reanim_progress=0;
float absc=static_cast(780+begin_pos);
int init_absc=780*16384,now_movement;
float now_modifier;
int bump_t = -1;
for(int i=1;i<=t;++i){
int now_frameID=static_cast(reanim_progress*(jack_frame_cnt-1));
now_modifier=(i>=ice_time)?chill_modifier:1;
reanim_progress+=delta_reanim_progress*now_modifier;
if(static_cast(absc)<=tar_pos){
bump_t = i;
break;
}
absc-=dx*now_modifier*(jack_ground[now_frameID+1]-jack_ground[now_frameID])*moveC*jack_frame_cnt*per_cent/jack_tot_dx;
if(reanim_progress>=1)reanim_progress-=1;
}
if(bump_t==-1)return;
// std::cout<<std::fixed<<std::setprecision(8)<<dx<<" "<<bump_t<<"\n";
for(int ice_l = 0;ice_l<=200;++ice_l){
if(bump_t+ice_l+399>tar_t)break;
int ctd = tar_t - (ice_l+400),true_ct;
for(int jack_ct = 70;jack_ct <= 299;++jack_ct){
true_ct = ((static_cast(static_cast((450+jack_ct)/3)/dx))<<1);
if(true_ct>ctd)break;
if(true_ct+1<bump_t)continue;
++tot_jacks;
++cnt_jack[true_ct+ice_l+400];
}
}
}
应邀放出了部分计算代码以供参考,其中 70 是我自己取的魔数,因为更早爆的小丑必然炸空气。坐标更新顺序是按我自己的理解来的。