/* no idea whose this is. if whoever made it wants to say something and claim credit, please let me know. */ #include #include #include pidiv.h #include gender.h #define DEFAULT_MODE CLI #define NUM_POKEMON 493 #define IV_MAX 31 #define TEST 29 #define PRNG(x) (0x41c64E6D*(x)+0x6073) #define PRNG_REV(x) (0xEEB9EB65*(x)+0xA3561A1) #define APRNG(x) (0x6C078965*(x)+0x1) #define APRNG_REV(x) (0x9638806D*(x)+0x69c77F93) // High and low functions for u32 #define HIGH(x) ((x)>>16&0xFFFF) #define LOW(x) ((x)&0xFFFF) #define RAND8 random(0x100) #define RAND16 random(0x10000) typedef unsigned char u8; // 0 to 255 typedef unsigned short u16; // 0 to 65535 typedef unsigned long u32; // 0 to 4294967295 typedef unsigned long long u64; // 0 to 1.8*10^19 typedef signed char s8; // -127 to 127 (usually -128) typedef signed short s16; // -32767 to 32767 (usually -32768) typedef signed long s32; // +/- 2147483647 typedef signed long long s64; // +/- 9.2*10^18 int mode; s32 * pref_stats; s32 * stats; u8 * pref_ivs; u8 * ivs; u8 * algorithms; u8 * ic_log; u8 gender_threshold; u64 num_results; u64 found; u8 log_length; u8 tail; enum {CLI, GUI, NUM_MODES}; enum {HP, ATK, DEF, SPD, SATK, SDEF, NUM_IVS}; enum {NORMAL, WILD, UNCOMMON, RARE, VERY_RARE, SUPER_RARE, NUM_ALGORITHMS}; enum {NATURE, CLASS, GENDER, SHINY, HP_TYPE, HP_POWER, TID, SID, NUM_STATS}; u8 get_gender_threshold(int pokemon) { return (pokemon <= 0 || pokemon > NUM_POKEMON) ? gender[0] : gender[pokemon]; } int cli_input() { // temp code int i; for(i = 0; i < NUM_IVS; i++) { pref_ivs[i]=TEST; } for(i = 0; i< NUM_ALGORITHMS; i++) { algorithms[i] = 1; } pref_stats[NATURE] = -1; pref_stats[CLASS] = -1; pref_stats[GENDER] = -1; pref_stats[SHINY] = 0; pref_stats[HP_TYPE] = -1; pref_stats[HP_POWER] = 30; pref_stats[TID] = -1; pref_stats[SID] = -1; /* TODO: cli_input */ return 0; } int gui_input() { /* TODO: gui_input */ return 0; } int get_input() { if(mode == CLI) { return cli_input(); } else if(mode == GUI) { return gui_input(); } return 1; } void init_all() { int i; pref_stats = (s32*) calloc(NUM_STATS, sizeof(s32)); if(pref_stats==NULL) exit (1); stats = (s32*) calloc(NUM_STATS, sizeof(s32)); if(stats==NULL) exit (1); pref_ivs = (u8*) calloc(NUM_IVS, sizeof(u8)); if(pref_ivs==NULL) exit (1); ivs = (u8*) calloc(NUM_IVS, sizeof(u8)); if(ivs==NULL) exit (1); algorithms = (u8*) calloc(NUM_ALGORITHMS, sizeof(u8)); if(algorithms==NULL) exit (1); ic_log = NULL; mode = DEFAULT_MODE; gender_threshold = 255; num_results = 0; found = 0; log_lenghth = 0; tail = -1; return; } void init_ic() { for(i = 0; i < NUM_IVS; i++) { log_length += IV_MAX-pref_ivs[i]; } if(algorithms==NULL) exit (1); ic_log = (u8*) calloc(log_length, sizeof(u8)); } void free_all() { free(pref_stats); free(stats); free(pref_ivs); free(ivs); free(algorithms); if(ic_log) free(ic_log); return; } int cli_print_data(u32 pid, u8 algorithm) { // temp code printf("%010u %2d %2d %2d %2d %2d %2d %1d %2d %1d %1d %1d %2d %2d %05u %05u\n", pid, ivs[HP], ivs[ATK], ivs[DEF], ivs[SPD], ivs[SATK], ivs[SDEF], algorithm, stats[NATURE], stats[CLASS], stats[GENDER], stats[SHINY], stats[HP_TYPE], stats[HP_POWER], stats[TID], stats[SID]); /* TODO: real cli_print_data */ return 0; } int gui_print_data(u32 pid, u8 algorithm) { /* TODO: gui_print_data */ return 0; } int print_data(u32 pid, u8 algorithm) { if(mode == CLI) { return cli_print_data(pid, algorithm); } else if(mode == GUI) { return gui_print_data(pid, algorithm); } return 1; } int check_pid(u32 pid, u8 algorithm) { int ret; stats[NATURE] = (s32) pid%25; stats[CLASS] = (s32) pid&0x1; stats[HP_TYPE] = (s32) ((ivs[5]&0x1)<<5|(ivs[4]&0x1)<<4|(ivs[3]&0x1)<<3|(ivs[2]&0x1)<<2|(ivs[1]&0x1)<<1|ivs[0]&0x1)*15/63; stats[HP_POWER] = (s32) ((ivs[5]&0x2)<<4|(ivs[4]&0x2)<<3|(ivs[3]&0x2)<<2|(ivs[2]&0x2)<<1|(ivs[2]&0x2)|(ivs[2]&0x2)>>1)*40/63+30; stats[TID] = (s32) (prefs[TID]>=0 ? prefs[TID] : (prefs[SID]<0 ? RAND16 : (prefs[SHINY] ? HIGH(pid)^LOW(pid)^prefs[SID] : RAND16))); stats[SID] = (s32) (prefs[SID]>=0 ? prefs[SID] : (prefs[SHINY] ? HIGH(pid)^LOW(pid)^stats[TID] : RAND16)); stats[SHINY] = (HIGH(pid)^LOW(pid)^stats[TID]^stats[SID]) < 8 ? 1 : 0; stats[GENDER] = gender_threshold==0 ? 0 : (gender_threshold==254 ? 1 : (gender_threshold==255 ? 2 : ((pid&0xFF) > gender_threshold ? 0 : 1))); if(!(1<= 0) return 0; if(stats[GENDER] != prefs[GENDER] && prefs[GENDER] >= 0) return 0; if(!stats[SHINY] && prefs[SHINY]) return 0; if(!(1< ic_log[i-1]) || ic_log[i] >= NUM_IVS) { ic_log[i] = 0; ivs[0]--; if(i>0) { ret = flip(i-1); if(ret) return ret; } else { ret = exp_log(); if(ret) return ret; } } else { ivs[ic_log[i]]--; } if(ivs[ic_log[i]] < pref_ivs[ic_log[i]] || ivs[ic_log[i]] > IV_MAX) return flip(i); return 0; } int exp_log() { tail++; if(tail > log_length) return 1; ic_log[tail]=0; ivs[0]--; if(ivs[0]