-
-
Save benjaminhallock/e80a99ece00dbab1f601197e7701a07f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-(void)calculateBestAttacker | |
{ | |
for (Pokemon *p in self.arrayPokemon) | |
{ | |
if (p.id == self.pokemon1.id) continue; | |
p.killChance = [self calculateChances:p]; | |
if (self.bestAttacker == nil) self.bestAttacker = p; | |
else if (self.bestAttacker.killChance < p.killChance) self.bestAttacker = p; | |
} | |
} | |
-(NSNumber *)calculateChances:(Pokemon *)p2 | |
{ | |
self.dicOutcomes = [NSMutableDictionary new]; | |
for (int i = 0; i < 9; i++) | |
{ | |
NSNumber *n = self.pokemon1.arrayS[i]; | |
if (n.intValue != 0) | |
{ | |
for (int ii = 0; ii < 9; ii++) | |
{ | |
NSNumber *nn = p2.arrayS[ii]; | |
if (nn.intValue != 0) | |
{ | |
// Key Pair of Chance of this move and outcome. | |
int index1 = i; | |
int index2 = ii; | |
NSNumber *chance1 = n; | |
NSNumber *chance2 = nn; | |
WinType wintype = [self didPlayerWin:self.pokemon1.arrayD[index1] withOpp:p2.arrayD[index2]]; | |
double chance = chance2.doubleValue * chance1.doubleValue; | |
if (wintype == kDraw) NSLog(@"Draw!"); | |
NSString *typeString = [self enumString:wintype]; | |
if([self.dicOutcomes objectForKey:typeString]) | |
{ | |
NSNumber *sum = [self.dicOutcomes valueForKey:typeString]; | |
self.dicOutcomes[typeString] = [NSNumber numberWithDouble:(sum.doubleValue + chance)]; | |
} | |
else | |
{ | |
[self.dicOutcomes addEntriesFromDictionary:@{typeString:[NSNumber numberWithDouble:chance]}]; | |
} | |
} | |
} | |
} | |
else | |
{ | |
NSLog(@"HEY ITS ZERO"); | |
} | |
} | |
NSNumber *drawTotal = self.dicOutcomes[[self enumString:kDraw]]; | |
NSLog(@"%@ DRAW TOTAL", drawTotal); | |
drawTotal = [NSNumber numberWithDouble:(drawTotal.doubleValue * 100.0 / pow(96.0,2.0))]; | |
NSLog(@"%@ DRAW TOTAL", drawTotal); | |
self.labelDrawChance.text = drawTotal.stringValue; | |
NSNumber *killTotal = self.dicOutcomes[[self enumString:kKO]]; | |
killTotal = [NSNumber numberWithDouble:(killTotal.doubleValue * 100.0 / pow(96.0,2.0))]; | |
NSLog(@"%@ KILL TOTAL", killTotal); | |
self.labelKillChance.text = killTotal.stringValue; | |
NSNumber *dieTotal = self.dicOutcomes[[self enumString:kDead]]; | |
dieTotal = [NSNumber numberWithDouble:(dieTotal.doubleValue * 100.0 / pow(96.0,2.0))]; | |
NSLog(@"%@ DEAD TOTAL", dieTotal); | |
self.labelDieChance.text = dieTotal.stringValue; | |
return dieTotal; | |
} | |
- (IBAction)onSpinPressed:(id)sender | |
{ | |
if (!self.pokemon1 && !self.pokemon2) | |
{ | |
[ProgressHUD showError:@"Select 2 Pokemon"]; | |
} | |
else | |
{ | |
[self calculateChances:self.pokemon2]; | |
[self calculateBestAttacker]; | |
NSLog(@"BEST ATTACK IS %@", self.bestAttacker.name); | |
self.maxSpinCount = 0; | |
NSString *d1 = [self spinPlayer:self.pokemon1 spinCount:0]; | |
self.maxSpinCount = 0; | |
NSString *d2 = [self spinPlayer:self.pokemon2 spinCount:0]; | |
WinType outcome = [self didPlayerWin:d1 withOpp:d2]; | |
if (outcome == kDraw) | |
{ | |
[ProgressHUD showSuccess:@"Draw!"]; | |
} | |
else if (outcome == kDead) | |
{ | |
[ProgressHUD showSuccess:[NSString stringWithFormat:@"%@ wins!",self.pokemon2.name]]; | |
} | |
else if (outcome == kKO) | |
{ | |
[ProgressHUD showSuccess:[NSString stringWithFormat:@"%@ wins!",self.pokemon1.name]]; | |
} | |
else if (outcome == kEffectWin) | |
{ | |
[ProgressHUD showSuccess:[NSString stringWithFormat:@"%@ effect wins! %@",self.pokemon1.name, self.pokemon1.alleffects]]; | |
} | |
else if (outcome == kEffectLose) | |
{ | |
[ProgressHUD showSuccess:[NSString stringWithFormat:@"%@ effect wins! %@",self.pokemon2.name, self.pokemon2.alleffects]]; | |
} | |
} | |
} | |
-(NSString *)spinPlayer:(Pokemon *)p1 spinCount:(int)x | |
{ | |
int spinCount = x; | |
NSString *d1; | |
int random1 = (int)arc4random_uniform(96); | |
double fraction = 24.0 / 96.0 * M_PI * 2.0; | |
self.image1.transform = CGAffineTransformIdentity; | |
self.image1.transform = CGAffineTransformRotate(self.image1.transform, fraction); | |
[self spinImage:random1]; | |
int sum = 0; | |
for (int i=0;i<9;i++) | |
{ | |
NSNumber *s = p1.arrayS[i]; | |
if(random1 < sum || s.intValue == 0) break; | |
sum += s.intValue; | |
d1 = p1.arrayD[i]; | |
} | |
// If #, spin again and double damage, if number is greater than 0 double. | |
if ([d1 isEqualToString:@"#"]) | |
{ | |
d1 = [self spinPlayer:p1 spinCount:spinCount + 1]; | |
//Stop this from repeating every loop | |
// Could be Miss or X or 2* or -30, this returns 0 for non-numbers | |
int x = [self integerFromString:d1]; | |
if (spinCount == 0 && x > 0) | |
{ | |
d1 = [NSString stringWithFormat:@"%d",[self integerFromString:d1] * 2]; | |
} | |
} | |
else if ([d1 hasPrefix:@"#"]) | |
{ | |
//Spin again until other is rolled, buff damage; | |
d1 = [self spinPlayer:p1 spinCount:spinCount + 1]; | |
int x = [self integerFromString:d1]; | |
#warning AVOID UNKNOWN CIRSUMSTANCE WHERE NEGATIVE GETS ADDED TO POSITIVE | |
if (spinCount == 0 && x > 0) | |
{ | |
int buff = [self integerFromString:[d1 substringFromIndex:1]]; | |
d1 = [NSString stringWithFormat:@"%d",[self integerFromString:d1] + buff]; | |
} | |
} | |
else if ([d1 hasSuffix:@"#"]) | |
{ | |
NSString *ogd1 = d1; | |
//Spin again and multiple by damage before #; Returns X Miss 2* damage | |
d1 = [self spinPlayer:p1 spinCount:spinCount + 1]; | |
if (_maxSpinCount < spinCount + 1) self.maxSpinCount = spinCount + 1; | |
if (self.maxSpinCount == spinCount + 1) | |
{ | |
#warning MAKE SURE NEGATIVE VALUE GOES THROUGH GRENINJA | |
ogd1 = [ogd1 substringToIndex:ogd1.length - 1]; | |
int damage = [self integerFromString:ogd1]; | |
d1 = [NSString stringWithFormat:@"%d", damage * (spinCount + 1)]; | |
} | |
} | |
else if ([d1 containsString:@"##"]) | |
{ | |
NSString *ogd1 = d1; | |
if (spinCount == 1) | |
{ | |
d1 = [NSString stringWithFormat:@"%d", [self removePoundAddNumbers:d1]]; | |
return d1; | |
} | |
d1 = [self spinPlayer:p1 spinCount:spinCount + 1]; | |
if ([ogd1 containsString:@"###"] && spinCount == 0) | |
{ | |
//Bedrill save 40 damage, returns 0 for miss | |
int x = [self integerFromString:d1]; | |
if (x == 0) d1 = @"40"; | |
} | |
} | |
return d1; | |
} | |
-(WinType)didPlayerWin:(NSString *)d1 withOpp:(NSString *)d2 | |
{ | |
//Returns 0 for all non numbers; | |
int d11 = [self integerFromString:d1]; | |
int d22 = [self integerFromString:d2]; | |
NSLog(@"%@ %@", d1, d2); | |
NSLog(@"%d %d", d11, d22); | |
bool containsStar1 = [d1 containsString:@"*"]; | |
bool containsStar2 = [d2 containsString:@"*"]; | |
int starpower1 = 0; | |
int starpower2 = 0; | |
if (containsStar1) starpower1 = [self integerFromString:[d1 substringToIndex:1]]; | |
if (containsStar2) starpower2 = [self integerFromString:[d2 substringToIndex:1]]; | |
if ([d1 isEqual: @"X"]) return kDraw; | |
else if ([d2 isEqual: @"X"]) return kDraw; | |
else if (containsStar1 && d22 < 0) return kDead; | |
else if (containsStar2 && d11 < 0) return kKO; | |
else if (containsStar1 && d22 > 0) return kEffectWin; | |
else if (containsStar2 && d11 > 0) return kEffectLose; | |
else if (starpower1 == starpower2 && starpower1 != 0) return kDraw; | |
else if (starpower2 > starpower1) return kEffectLose; | |
else if (starpower1 > starpower2) return kEffectWin; | |
else if (abs(d11) > 0 && [d2 isEqual: @"Miss"]) return kKO; | |
else if (abs(d22) > 0 && [d1 isEqual: @"Miss"]) return kDead; | |
else if (abs(d11) > abs(d22)) return kKO; | |
else if (abs(d22) > abs(d11)) return kDead; | |
else if (abs(d11) == abs(d22)) return kDraw; | |
else return nil; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment