Big rename part 2: 'config' etc. to 'mapping.
[enjoyable.git] / Target.m
index e7ea673..097562e 100644 (file)
--- a/Target.m
+++ b/Target.m
@@ -5,50 +5,85 @@
 //  Created by Sam McCall on 5/05/09.
 //
 
-@implementation Target
+#import "Target.h"
 
-+(Target*) unstringify: (NSString*) str withConfigList: (NSArray*) configs {
-       NSArray* components = [str componentsSeparatedByString:@"~"];
-       NSParameterAssert([components count]);
-       NSString* typeTag = components[0];
-       if([typeTag isEqualToString:@"key"])
-               return [TargetKeyboard unstringifyImpl:components];
-       if([typeTag isEqualToString:@"cfg"])
-               return [TargetConfig unstringifyImpl:components withConfigList:configs];
-    if([typeTag isEqualToString:@"mmove"])
-        return [TargetMouseMove unstringifyImpl:components];
-    if([typeTag isEqualToString:@"mbtn"])
-        return [TargetMouseBtn unstringifyImpl:components];
-    if([typeTag isEqualToString:@"mscroll"])
-        return [TargetMouseScroll unstringifyImpl:components];
-    if([typeTag isEqualToString:@"mtoggle"])
-        return [TargetToggleMouseScope unstringifyImpl:components];
-               
-       NSParameterAssert(NO);
-       return NULL;
+#import "TargetKeyboard.h"
+#import "TargetConfig.h"
+#import "TargetMouseMove.h"
+#import "TargetMouseBtn.h"
+#import "TargetMouseScroll.h"
+#import "TargetToggleMouseScope.h"
+
+@implementation Target {
+    BOOL running;
+}
+
++ (NSString *)serializationCode {
+    [self doesNotRecognizeSelector:_cmd];
+    return nil;
+}
+
+- (NSDictionary *)serialize {
+    [self doesNotRecognizeSelector:_cmd];
+    return nil;    
+}
+
+- (BOOL)isEqual:(id)object {
+    return [object isKindOfClass:Target.class]
+        && [[self serialize] isEqual:[object serialize]];
 }
 
--(NSString*) stringify {
-       [self doesNotRecognizeSelector:_cmd];
-       return NULL;
+- (NSUInteger)hash {
+    return [[self serialize] hash];
 }
 
--(void) trigger: (JoystickController *)jc {
-       [self doesNotRecognizeSelector:_cmd];
++ (Target *)targetDeserialize:(NSDictionary *)serialization
+                  withMappings:(NSArray *)mappings {
+    // Don't crash loading old/bad mappings (but don't load them either).
+    if (![serialization isKindOfClass:NSDictionary.class])
+        return nil;
+    NSString *type = serialization[@"type"];
+    for (Class cls in @[TargetKeyboard.class,
+                        TargetConfig.class,
+                        TargetMouseMove.class,
+                        TargetMouseBtn.class,
+                        TargetMouseScroll.class,
+                        TargetToggleMouseScope.class
+         ]) {
+        if ([type isEqualToString:cls.serializationCode])
+            return [cls targetDeserialize:serialization withMappings:mappings];
+    }
+    
+    return nil;
 }
 
--(void) untrigger: (JoystickController *)jc {
-       // no-op by default
+- (void)trigger {
 }
 
-- (BOOL)update:(JoystickController *)jc {
+- (void)untrigger {
+}
+
+- (BOOL)update:(NJInputController *)jc {
     return NO;
 }
 
--(BOOL) isContinuous {
-    return false;
+- (BOOL)isContinuous {
+    return NO;
+}
+
+- (BOOL)running {
+    return running;
+}
+
+- (void)setRunning:(BOOL)newRunning {
+    if (running != newRunning) {
+        running = newRunning;
+        if (running)
+            [self trigger];
+        else
+            [self untrigger];
+    }
 }
 
-@synthesize inputValue, running;
 
 @end