Programmieren mit Swift - Für macOS und iOS
Programmieren mit Swift - Für macOS und iOS
Die Characterklasse

Eine weitere Eigenschaft, die der Spielfigur zusteht, ist die Klasse. Sie beschreibt in etwa den Beruf der Figur und erhält Werte wie Kämpfer, Kleriker oder Dieb. Da die Klasse ähnlich funktioniert wie die Rasse, werden Sie auf den folgenden Seiten wenig Neues erfahren, aber Gelegenheit finden, das Gelernte zu vertiefen.

Da man mit dem Wort Class in Programmiersprachen generell vorsichtig umgehen sollte, nennen Sie diese Klasse CharClass. Vom Aufbau her ist sie der Klasse Race nicht unähnlich.

Die CharClass.h
#import <Cocoa/Cocoa.h>

@interface CharClass : NSObject {

    NSString *classname;
}

- (
id)initWithClassname:(NSString *) name;
- (NSString *)classname;
- (
void)setClassname:(NSString *)value;

@end
Die CharClass.m
#import "CharClass.h"

@implementation CharClass

- (
id)initWithClassname:(NSString *) name
{
    if(self = [super init])
    {
        [
self setClassname:name];
    }
    return (self);
}

- (NSString *)classname {
    return [[classname retain] autorelease];
}

- (
void)setClassname:(NSString *)value {
    if (classname != value) {
        [classname release];
        classname = [value copy];
    }
}

@end
Um die Klasse der Spielfigur zu speichern, benötigt die Character-Klasse eine weitere Instanzvariabel mit den zugehörigen Accessor-Methoden.
NSString *charClass;
In der MyController Klasse gehen die Dinge jetzt den Ihnen bekannten Weg. Zunächst benötigen Sie ein weiteres Array und ein Outlet zu einem passenden Controller. Das Array wird wie zuvor in der init-Methode von MyController initialisiert.
NSMutableArray *classesArray;
IBOutlet NSArrayController *myClassesController;
Neben dem Ermitteln der möglichen Rasse, muss jetzt nach dem Würfeln auch die mögliche Klasse ermittelt werden.
[self determinePossibleClasses];
In der Methode selbst sind dann wieder verschiedene if-Strukturen nötig, um das Klassen-Array zu füllen.
- (void)determinePossibleClasses
{
    [classesArray removeAllObjects];

    int strength = [[rpgCharacter strength] intValue];
    int dexterity = [[rpgCharacter dexterity] intValue];
    int constitution = [[rpgCharacter constitution] intValue];
    int intelligence = [[rpgCharacter intelligence] intValue];
    int wisdom = [[rpgCharacter wisdom] intValue];
    int charisma = [[rpgCharacter charisma] intValue];

    if(strength >= 9)
    {
        [classesArray addObject:[[CharClass alloc] initWithClassname:@"Kämpfer"]];
    }

    if(strength >= 12 && constitution >= 9 )
    {
        [classesArray addObject:[[CharClass alloc] initWithClassname:@"Paladin"]];
    }

    if(strength >= 13 && dexterity >= 13 && constitution >= 14 && wisdom >= 14)
    {
    [classesArray addObject:[[CharClass alloc] initWithClassname:@"Waldläufer"]];
    }

    if( intelligence >= 9)
    {
    [classesArray addObject:[[CharClass alloc] initWithClassname:@"Zauberkundiger"]];
    }

    if(wisdom >= 9)
    {
    [classesArray addObject:[[CharClass alloc] initWithClassname:@"Kleriker"]];
    }

    if(wisdom >= 12 && charisma >= 15)
    {
    [classesArray addObject:[[CharClass alloc] initWithClassname:@"Druide"]];
    }  

    if(dexterity >= 9)
    {
    [classesArray addObject:[[CharClass alloc] initWithClassname:@"Dieb"]];
    }

    if(dexterity >= 12 && intelligence >= 13 && charisma >= 15)
    {
    [classesArray addObject:[[CharClass alloc] initWithClassname:@"Barde"]];
    }
Da es im Gegensatz zur Rasse Mensch keine Klasse gibt, die immer verfügbar ist, muss die Vorauswahl hier etwas anders geschehen. Am einfachsten ist es, das erste Objekt im Array zu verwenden.
    [rpgCharacter setCharClass:[[classesArray objectAtIndex:0] className]];
    [myClassesController rearrangeObjects];
}