算号代码获取
struct Rand{
unsigned char a,b,c[256];
inline Rand(int _a,int _b,unsigned char *_c):a(_a),b(_b){memcpy(c,_c,sizeof(c));}
inline unsigned char m(){
b+=c[++a];
std::swap(c[a],c[b]);
return c[(c[a]+c[b])&255];
}
inline int operator()(int a){
if(!a)
return 0;
int u=m();
return u=(u<<8|m())%a;
}
};
struct Name{
struct Skill{
int id,freq;
inline void init(int _id){
id=_id,freq=0;
return;
}
};
Skill nameskill[128];
unsigned char val[256],namebase[128],namebonus[128],team[256],name[256];
int namelen,teamlen,bonuslen;
bool load(char *rawnamein){
for(int i=0;i<256;++i)
name[i]=team[i]=0;
char *namein=cvt(rawnamein);
namelen=1,teamlen=1,bonuslen=0;
for(int i=0,f=0;namein[i];++i){
if(namein[i]=='@')
f=1;
else if(!f)
name[namelen++]=namein[i];
else
team[teamlen++]=namein[i];
}
if(namelen==1||teamlen==1)
return false;
unsigned char s;
for(int i=0;i<256;++i)
val[i]=i;
for(int i=s=0;i<256;++i){
s+=team[i%teamlen]+val[i];
std::swap(val[i],val[s]);
}
for(int i=0;i<2;++i){
for(int j=s=0;j<256;++j){
s+=name[j%namelen]+val[j];
std::swap(val[j],val[s]);
}
}
for(int i=0;i<256;++i){
unsigned char m=val[i]*181+160;
if(m>=89&&m<217)
namebase[bonuslen++]=m&63;
}
memcpy(namebonus,namebase,sizeof(namebase));
return true;
}
void calcprops(int *propbonus){
int propcnt=0;
unsigned char r[32];
memcpy(r,namebonus,sizeof(r));
for(int i=10;i<31;i+=3){
std::sort(r+i,r+i+3);
propbonus[propcnt++]=r[i+1];
}
std::sort(r,r+10);
propbonus[propcnt++]=154;
for(int i=3;i<7;++i)
propbonus[propcnt-1]+=r[i];
return;
}
void calcskill(){
unsigned char *a=namebonus+64,*b=namebase+64;
Rand rand(0,0,val);
for(int i=0;i<40;++i)
nameskill[i].init(i);
for(int s=0,i=0;i<2;++i){
for(int j=0;j<40;++j){
s=(s+rand(40)+nameskill[j].id)%40;
swap(nameskill[j].id,nameskill[s].id);
}
}
int last=-1;
for(int i=0,j=0;i<64;i+=4,++j){
unsigned char p=min({a[i],a[i+1],a[i+2],a[i+3]}),q=min({b[i],b[i+1],b[i+2],b[i+3]});
if(p>10){
if(nameskill[j].id<35)
nameskill[j].freq=p-10;
if(q<=10)
nameskill[j].e=true;
else if(nameskill[j].id<25)
last=j;
}
}
if(last!=-1){
nameskill[last].e=true;
nameskill[last].freq*=2;
}
unsigned char u;
u=nameskill[14].freq;
if(u>0&&(!nameskill[14].e)){
nameskill[14].freq+=min({namebonus[60],namebonus[61],u});
nameskill[14].e=true;
}
u=nameskill[15].freq;
if(u>0&&(!nameskill[15].e)){
nameskill[15].freq+=min({namebonus[62],namebonus[63],u});
nameskill[15].e=true;
}
return;
}
};