Adds saving throws to monster card display.

Adds proficiencyBonus implementation to Monster. The proficiency bonus relies on CR and defaults to 0 until the CR fields are implemented
This commit is contained in:
2020-10-04 00:19:04 -07:00
parent 757f75657f
commit 9ced8e3407
4 changed files with 119 additions and 2 deletions

View File

@@ -342,12 +342,19 @@
<constraint firstAttribute="height" constant="10" id="mAQ-Ry-dzJ"/> <constraint firstAttribute="height" constant="10" id="mAQ-Ry-dzJ"/>
</constraints> </constraints>
</imageView> </imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="wordWrap" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hMb-Iw-k4h">
<rect key="frame" x="8" y="284.5" width="398" height="17"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews> </subviews>
<viewLayoutGuide key="safeArea" id="WIX-Yu-LXJ"/> <viewLayoutGuide key="safeArea" id="WIX-Yu-LXJ"/>
<color key="backgroundColor" systemColor="systemBackgroundColor"/> <color key="backgroundColor" systemColor="systemBackgroundColor"/>
<constraints> <constraints>
<constraint firstItem="pZa-ia-7UT" firstAttribute="leading" secondItem="WYM-ya-Yje" secondAttribute="leading" id="5Uq-aL-jK9"/> <constraint firstItem="pZa-ia-7UT" firstAttribute="leading" secondItem="WYM-ya-Yje" secondAttribute="leading" id="5Uq-aL-jK9"/>
<constraint firstItem="8yl-Bh-hgf" firstAttribute="centerX" secondItem="lBc-X0-1US" secondAttribute="centerX" id="6Lc-MB-cog"/> <constraint firstItem="8yl-Bh-hgf" firstAttribute="centerX" secondItem="lBc-X0-1US" secondAttribute="centerX" id="6Lc-MB-cog"/>
<constraint firstItem="WIX-Yu-LXJ" firstAttribute="trailing" secondItem="hMb-Iw-k4h" secondAttribute="trailing" constant="8" id="7Ti-ID-py9"/>
<constraint firstItem="p05-uG-AlV" firstAttribute="trailing" secondItem="Ae7-YW-3xk" secondAttribute="trailing" id="DpK-wf-8qN"/> <constraint firstItem="p05-uG-AlV" firstAttribute="trailing" secondItem="Ae7-YW-3xk" secondAttribute="trailing" id="DpK-wf-8qN"/>
<constraint firstItem="pZa-ia-7UT" firstAttribute="top" secondItem="WIX-Yu-LXJ" secondAttribute="top" constant="8" id="DpT-G9-lVC"/> <constraint firstItem="pZa-ia-7UT" firstAttribute="top" secondItem="WIX-Yu-LXJ" secondAttribute="top" constant="8" id="DpT-G9-lVC"/>
<constraint firstItem="pZa-ia-7UT" firstAttribute="trailing" secondItem="WYM-ya-Yje" secondAttribute="trailing" id="GdO-iX-qNf"/> <constraint firstItem="pZa-ia-7UT" firstAttribute="trailing" secondItem="WYM-ya-Yje" secondAttribute="trailing" id="GdO-iX-qNf"/>
@@ -360,6 +367,7 @@
<constraint firstItem="pZa-ia-7UT" firstAttribute="leading" secondItem="WIX-Yu-LXJ" secondAttribute="leading" constant="8" id="Pzo-wK-eiz"/> <constraint firstItem="pZa-ia-7UT" firstAttribute="leading" secondItem="WIX-Yu-LXJ" secondAttribute="leading" constant="8" id="Pzo-wK-eiz"/>
<constraint firstItem="WYM-ya-Yje" firstAttribute="trailing" secondItem="p05-uG-AlV" secondAttribute="trailing" id="QYF-YD-yAJ"/> <constraint firstItem="WYM-ya-Yje" firstAttribute="trailing" secondItem="p05-uG-AlV" secondAttribute="trailing" id="QYF-YD-yAJ"/>
<constraint firstItem="0HK-T4-KQW" firstAttribute="leading" secondItem="8yl-Bh-hgf" secondAttribute="leading" id="Zyv-3S-cKO"/> <constraint firstItem="0HK-T4-KQW" firstAttribute="leading" secondItem="8yl-Bh-hgf" secondAttribute="leading" id="Zyv-3S-cKO"/>
<constraint firstItem="hMb-Iw-k4h" firstAttribute="leading" secondItem="WIX-Yu-LXJ" secondAttribute="leading" constant="8" id="cXv-Yu-4Za"/>
<constraint firstItem="Ae7-YW-3xk" firstAttribute="top" secondItem="p05-uG-AlV" secondAttribute="bottom" constant="8" symbolic="YES" id="cmv-YY-dax"/> <constraint firstItem="Ae7-YW-3xk" firstAttribute="top" secondItem="p05-uG-AlV" secondAttribute="bottom" constant="8" symbolic="YES" id="cmv-YY-dax"/>
<constraint firstItem="lBc-X0-1US" firstAttribute="leading" secondItem="skY-EN-baw" secondAttribute="leading" id="dPJ-04-kH2"/> <constraint firstItem="lBc-X0-1US" firstAttribute="leading" secondItem="skY-EN-baw" secondAttribute="leading" id="dPJ-04-kH2"/>
<constraint firstItem="0HK-T4-KQW" firstAttribute="trailing" secondItem="8yl-Bh-hgf" secondAttribute="trailing" id="dTU-0J-ILa"/> <constraint firstItem="0HK-T4-KQW" firstAttribute="trailing" secondItem="8yl-Bh-hgf" secondAttribute="trailing" id="dTU-0J-ILa"/>
@@ -368,6 +376,7 @@
<constraint firstItem="p05-uG-AlV" firstAttribute="leading" secondItem="Ae7-YW-3xk" secondAttribute="leading" id="nHB-QQ-JPT"/> <constraint firstItem="p05-uG-AlV" firstAttribute="leading" secondItem="Ae7-YW-3xk" secondAttribute="leading" id="nHB-QQ-JPT"/>
<constraint firstItem="zcw-26-kZQ" firstAttribute="top" secondItem="lBc-X0-1US" secondAttribute="bottom" constant="8" symbolic="YES" id="q0O-jK-tzU"/> <constraint firstItem="zcw-26-kZQ" firstAttribute="top" secondItem="lBc-X0-1US" secondAttribute="bottom" constant="8" symbolic="YES" id="q0O-jK-tzU"/>
<constraint firstAttribute="trailing" secondItem="lBc-X0-1US" secondAttribute="trailing" id="sTY-zt-Sac"/> <constraint firstAttribute="trailing" secondItem="lBc-X0-1US" secondAttribute="trailing" id="sTY-zt-Sac"/>
<constraint firstItem="hMb-Iw-k4h" firstAttribute="top" secondItem="zcw-26-kZQ" secondAttribute="bottom" constant="8" id="sk5-ZE-Vfd"/>
<constraint firstItem="WYM-ya-Yje" firstAttribute="top" secondItem="pZa-ia-7UT" secondAttribute="bottom" constant="8" symbolic="YES" id="thF-cF-gcb"/> <constraint firstItem="WYM-ya-Yje" firstAttribute="top" secondItem="pZa-ia-7UT" secondAttribute="bottom" constant="8" symbolic="YES" id="thF-cF-gcb"/>
<constraint firstItem="p05-uG-AlV" firstAttribute="top" secondItem="WYM-ya-Yje" secondAttribute="bottom" constant="8" symbolic="YES" id="ydJ-o0-UE4"/> <constraint firstItem="p05-uG-AlV" firstAttribute="top" secondItem="WYM-ya-Yje" secondAttribute="bottom" constant="8" symbolic="YES" id="ydJ-o0-UE4"/>
</constraints> </constraints>
@@ -387,6 +396,7 @@
<outlet property="monsterHitPoints" destination="Ae7-YW-3xk" id="3og-CQ-jGe"/> <outlet property="monsterHitPoints" destination="Ae7-YW-3xk" id="3og-CQ-jGe"/>
<outlet property="monsterIntelligence" destination="p82-wJ-OUJ" id="YzY-1R-Bje"/> <outlet property="monsterIntelligence" destination="p82-wJ-OUJ" id="YzY-1R-Bje"/>
<outlet property="monsterMeta" destination="pZa-ia-7UT" id="QEV-cs-IEk"/> <outlet property="monsterMeta" destination="pZa-ia-7UT" id="QEV-cs-IEk"/>
<outlet property="monsterSavingThrows" destination="hMb-Iw-k4h" id="LYK-xX-GCc"/>
<outlet property="monsterSpeed" destination="0HK-T4-KQW" id="V8T-ZK-2aB"/> <outlet property="monsterSpeed" destination="0HK-T4-KQW" id="V8T-ZK-2aB"/>
<outlet property="monsterStrength" destination="Gfb-yf-Tbu" id="obD-QK-ZSo"/> <outlet property="monsterStrength" destination="Gfb-yf-Tbu" id="obD-QK-ZSo"/>
<outlet property="monsterWisdom" destination="0lo-zE-s25" id="Wy8-kG-8Gg"/> <outlet property="monsterWisdom" destination="0lo-zE-s25" id="Wy8-kG-8Gg"/>

View File

@@ -13,8 +13,11 @@
@implementation Monster @implementation Monster
@synthesize blindsightDistance; @synthesize blindsightDistance;
// TODO: move this to Core Data and add to editor
@synthesize challengeRating; @synthesize challengeRating;
// TODO: move this to Core Data and add to editor
@synthesize customChallengeRating; @synthesize customChallengeRating;
// TODO: move this to Core Data and add to editor
@synthesize customProficiencyBonus; @synthesize customProficiencyBonus;
@synthesize darkvisionDistance; @synthesize darkvisionDistance;
@synthesize isBlind; @synthesize isBlind;
@@ -352,11 +355,106 @@ NSString *const kAdvantageTypeDisadvantage = @"disadvantage";
} }
-(NSString*)savingThrowsDescription { -(NSString*)savingThrowsDescription {
@throw [[NSException alloc] initWithName:@"unimplemented" reason:@"Method not implemented." userInfo:nil]; NSMutableArray *parts = [[NSMutableArray alloc] init];
NSString *name;
int bonus;
if (self.strengthSavingThrowProficiency != kProficiencyTypeNone) {
name = NSLocalizedString(@"Strength", @"");
bonus = self.proficiencyBonus + self.strengthModifier;
[parts addObject:[NSString stringWithFormat:@"%@ %+d", name, bonus]];
}
if (self.dexteritySavingThrowProficiency != kProficiencyTypeNone) {
name = NSLocalizedString(@"Dexterity", @"");
bonus = self.proficiencyBonus + self.dexterityModifier;
[parts addObject:[NSString stringWithFormat:@"%@ %+d", name, bonus]];
}
if (self.constitutionSavingThrowProficiency != kProficiencyTypeNone) {
name = NSLocalizedString(@"Constitution", @"");
bonus = self.proficiencyBonus + self.constitutionModifier;
[parts addObject:[NSString stringWithFormat:@"%@ %+d", name, bonus]];
}
if (self.intelligenceSavingThrowProficiency != kProficiencyTypeNone) {
name = NSLocalizedString(@"Intelligence", @"");
bonus = self.proficiencyBonus + self.intelligenceModifier;
[parts addObject:[NSString stringWithFormat:@"%@ %+d", name, bonus]];
}
if (self.wisdomSavingThrowProficiency != kProficiencyTypeNone) {
name = NSLocalizedString(@"Wisdom", @"");
bonus = self.proficiencyBonus + self.wisdomModifier;
[parts addObject:[NSString stringWithFormat:@"%@ %+d", name, bonus]];
}
if (self.charismaSavingThrowProficiency != kProficiencyTypeNone) {
name = NSLocalizedString(@"Charisma", @"");
bonus = self.proficiencyBonus + self.charismaModifier;
[parts addObject:[NSString stringWithFormat:@"%@ %+d", name, bonus]];
}
return [parts componentsJoinedByString:@" "];
} }
-(int)proficiencyBonus { -(int)proficiencyBonus {
@throw [[NSException alloc] initWithName:@"unimplemented" reason:@"Method not implemented." userInfo:nil]; if ([@"*" isEqualToString:challengeRating]) {
return customProficiencyBonus;
} else if (
[@"0" isEqualToString:challengeRating] ||
[@"1/8" isEqualToString:challengeRating] ||
[@"1/4" isEqualToString:challengeRating] ||
[@"1/2" isEqualToString:challengeRating] ||
[@"1" isEqualToString:challengeRating] ||
[@"2" isEqualToString:challengeRating] ||
[@"3" isEqualToString:challengeRating] ||
[@"4" isEqualToString:challengeRating]
) {
return 2;
} else if (
[@"5" isEqualToString:challengeRating] ||
[@"6" isEqualToString:challengeRating] ||
[@"7" isEqualToString:challengeRating] ||
[@"8" isEqualToString:challengeRating])
{
return 3;
} else if (
[@"9" isEqualToString:challengeRating] ||
[@"10" isEqualToString:challengeRating] ||
[@"11" isEqualToString:challengeRating] ||
[@"12" isEqualToString:challengeRating])
{
return 4;
} else if (
[@"13" isEqualToString:challengeRating] ||
[@"14" isEqualToString:challengeRating] ||
[@"15" isEqualToString:challengeRating] ||
[@"16" isEqualToString:challengeRating])
{
return 5;
} else if (
[@"17" isEqualToString:challengeRating] ||
[@"18" isEqualToString:challengeRating] ||
[@"19" isEqualToString:challengeRating] ||
[@"20" isEqualToString:challengeRating])
{
return 6;
} else if (
[@"21" isEqualToString:challengeRating] ||
[@"22" isEqualToString:challengeRating] ||
[@"23" isEqualToString:challengeRating] ||
[@"24" isEqualToString:challengeRating])
{
return 7;
} else if (
[@"25" isEqualToString:challengeRating] ||
[@"26" isEqualToString:challengeRating] ||
[@"27" isEqualToString:challengeRating] ||
[@"28" isEqualToString:challengeRating])
{
return 8;
} else if (
[@"29" isEqualToString:challengeRating] ||
[@"30" isEqualToString:challengeRating])
{
return 9;
} else {
return 0;
}
} }
-(void)addSkill: (Skill*)skill { -(void)addSkill: (Skill*)skill {

View File

@@ -24,6 +24,7 @@ NS_ASSUME_NONNULL_BEGIN
@property (weak, nonatomic) IBOutlet UILabel *monsterIntelligence; @property (weak, nonatomic) IBOutlet UILabel *monsterIntelligence;
@property (weak, nonatomic) IBOutlet UILabel *monsterWisdom; @property (weak, nonatomic) IBOutlet UILabel *monsterWisdom;
@property (weak, nonatomic) IBOutlet UILabel *monsterCharisma; @property (weak, nonatomic) IBOutlet UILabel *monsterCharisma;
@property (weak, nonatomic) IBOutlet UILabel *monsterSavingThrows;
@property Monster* monster; @property Monster* monster;

View File

@@ -105,6 +105,14 @@ NSString* makeHTMLFragmentString(NSString* format, ...) {
if (self.monsterCharisma) { if (self.monsterCharisma) {
self.monsterCharisma.text = self.monster.charismaDescription; self.monsterCharisma.text = self.monster.charismaDescription;
} }
if (self.monsterSavingThrows) {
NSString *savingThrowsDescription = self.monster.savingThrowsDescription;
if (savingThrowsDescription == nil) {
self.monsterSavingThrows.text = @"";
} else {
self.monsterSavingThrows.attributedText = [HTMLHelper attributedStringFromHTML:makeHTMLFragmentString(@"<b>Saving Throws</b> %@", savingThrowsDescription)];
}
}
} }
- (IBAction)unwindWithSegue:(UIStoryboardSegue *)unwindSegue { - (IBAction)unwindWithSegue:(UIStoryboardSegue *)unwindSegue {