Skip to content

Instantly share code, notes, and snippets.

@benjaminhallock
Last active March 7, 2017 21:20
Show Gist options
  • Save benjaminhallock/e80a99ece00dbab1f601197e7701a07f to your computer and use it in GitHub Desktop.
Save benjaminhallock/e80a99ece00dbab1f601197e7701a07f to your computer and use it in GitHub Desktop.
-(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