update ios port with new health modes, increase sd turns, new game modes, fixed bugs that prevented the creation of AI controlled teams, revisited update modes
authorkoda
Sat, 06 Nov 2010 18:21:30 +0100
changeset 4149 51200479f9d8
parent 4148 eaff5615f976
child 4150 050163c35c83
update ios port with new health modes, increase sd turns, new game modes, fixed bugs that prevented the creation of AI controlled teams, revisited update modes
project_files/HedgewarsMobile/Classes/CommodityFunctions.m
project_files/HedgewarsMobile/Classes/GameSetup.m
project_files/HedgewarsMobile/Classes/LevelViewController.m
project_files/HedgewarsMobile/Classes/MainMenuViewController.m
project_files/HedgewarsMobile/Resources/Settings/Schemes/Barrel Mayhem.plist
project_files/HedgewarsMobile/Resources/Settings/Schemes/Default.plist
project_files/HedgewarsMobile/Resources/Settings/Schemes/Minefield.plist
project_files/HedgewarsMobile/Resources/Settings/Schemes/Pro Mode.plist
project_files/HedgewarsMobile/Resources/Settings/Schemes/Shoppa.plist
project_files/HedgewarsMobile/Resources/Settings/Schemes/Timeless.plist
project_files/HedgewarsMobile/Resources/Settings/Schemes/Tunnel Hogs.plist
project_files/HedgewarsMobile/Resources/Settings/iFrontend/basicFlags_en.plist
--- a/project_files/HedgewarsMobile/Classes/CommodityFunctions.m	Sat Nov 06 12:56:09 2010 -0400
+++ b/project_files/HedgewarsMobile/Classes/CommodityFunctions.m	Sat Nov 06 18:21:30 2010 +0100
@@ -75,45 +75,45 @@
     switch (type) {
         case 0: //default
             theWeapon = [[NSDictionary alloc] initWithObjectsAndKeys:
-                         @"9391929422199121032235111001201000000211110101010",@"ammostore_initialqt",
-                         @"0405040541600655546554464776576666666155510101110",@"ammostore_probability",
+                         @"9391929422199121032235111001201000000211110101011",@"ammostore_initialqt",
+                         @"0405040541600655546554464776576666666155510101117",@"ammostore_probability",
                          @"0000000000000205500000040007004000000000200000000",@"ammostore_delay",
-                         @"1311110312111111123114111111111111111211111101110",@"ammostore_crate", nil];
+                         @"1311110312111111123114111111111111111211111101111",@"ammostore_crate", nil];
             break;
         case 1: //crazy
             theWeapon = [[NSDictionary alloc] initWithObjectsAndKeys:
-                         @"9999999999999999992999999999999999299999999909990",@"ammostore_initialqt",
-                         @"1111110111111111111111111111111111111111111101110",@"ammostore_probability",
+                         @"9999999999999999992999999999999999299999999909999",@"ammostore_initialqt",
+                         @"1111110111111111111111111111111111111111111101111",@"ammostore_probability",
                          @"0000000000000000000000000000000000000000000000000",@"ammostore_delay",
-                         @"1311110312111111123114111111111111111211110101110",@"ammostore_crate", nil];
+                         @"1311110312111111123114111111111111111211110101111",@"ammostore_crate", nil];
             break;
         case 2: //pro mode
             theWeapon = [[NSDictionary alloc] initWithObjectsAndKeys:
                          @"9090009000000000000009000000000000000000000000000",@"ammostore_initialqt",
                          @"0000000000000000000000000000000000000000000000000",@"ammostore_probability",
                          @"0000000000000205500000040007004000000000200000000",@"ammostore_delay",
-                         @"1111111111111111111111111111111111111111100101110",@"ammostore_crate", nil];
+                         @"1111111111111111111111111111111111111111100101111",@"ammostore_crate", nil];
             break;
         case 3: //shoppa
             theWeapon = [[NSDictionary alloc] initWithObjectsAndKeys:
                          @"0000009900000000000000000000000000000000000000000",@"ammostore_initialqt",
                          @"4444410044244402210112121222422000000002000400010",@"ammostore_probability",
                          @"0000000000000000000000000000000000000000000000000",@"ammostore_delay",
-                         @"1111111111111111111111111111111111111111101101110",@"ammostore_crate", nil];
+                         @"1111111111111111111111111111111111111111101101111",@"ammostore_crate", nil];
             break;
-        case 4: //basketball
+        case 4: //clean slate
             theWeapon = [[NSDictionary alloc] initWithObjectsAndKeys:
-                         @"9391929422199121032235111001201000000211110101000",@"ammostore_initialqt",
-                         @"0000000000000000000000000000000000000000000000000",@"ammostore_probability",
-                         @"0000000000000005500000040007004000000000200000000",@"ammostore_delay",
-                         @"1111111111111111111111111111111111111111111101110",@"ammostore_crate", nil];
+                         @"1010009000010000011000000000000000000000000000001",@"ammostore_initialqt",
+                         @"0405040541600655546554464776576666666155510101117",@"ammostore_probability",
+                         @"0000000000000205500000040007004000000000200000000",@"ammostore_delay",
+                         @"1311110312111111123114111111111111111211111101111",@"ammostore_crate", nil];
             break;
         case 5: //minefield
             theWeapon = [[NSDictionary alloc] initWithObjectsAndKeys:
                          @"0000009900090000000300000000000000000000000000000",@"ammostore_initialqt",
                          @"0000000000000000000000000000000000000000000000000",@"ammostore_probability",
                          @"0000000000000205500000040007004000000000200000000",@"ammostore_delay",
-                         @"1111111111111111111111111111111111111111111101110",@"ammostore_crate", nil];
+                         @"1111111111111111111111111111111111111111111101111",@"ammostore_crate", nil];
             break;
         default:
             NSLog(@"Nope");
@@ -143,8 +143,10 @@
                                    [NSNumber numberWithInt:100],      //initialhealth
                                    [NSNumber numberWithInt:15],       //suddendeathtimeout
                                    [NSNumber numberWithInt:5],        //cratedrops
+                                   [NSNumber numberWithInt:35],       //healthprob
+                                   [NSNumber numberWithInt:25],       //healthamount
                                    [NSNumber numberWithInt:3],        //minestime
-                                   [NSNumber numberWithInt:4],        //mines
+                                   [NSNumber numberWithInt:4],        //minesnumber
                                    [NSNumber numberWithInt:0],        //dudmines
                                    [NSNumber numberWithInt:2],        //explosives
                                    nil];
--- a/project_files/HedgewarsMobile/Classes/GameSetup.m	Sat Nov 06 12:56:09 2010 -0400
+++ b/project_files/HedgewarsMobile/Classes/GameSetup.m	Sat Nov 06 18:21:30 2010 +0100
@@ -168,6 +168,7 @@
     int i = 0;
     int result = 0;
     int mask = 0x00000004;
+    int basicArraySize = [basicArray count] - 1;
 
     // pack the gameflags in a single var and send it
     for (NSNumber *value in gamemodArray) {
@@ -179,43 +180,62 @@
     [self sendToEngine:flags];
     [flags release];
 
-    NSString *dmgMod = [[NSString alloc] initWithFormat:@"e$damagepct %d",[[basicArray objectAtIndex:i++] intValue]];
+    NSString *dmgMod = [[NSString alloc] initWithFormat:@"e$damagepct %d",[[basicArray objectAtIndex:i] intValue]];
     [self sendToEngine:dmgMod];
     [dmgMod release];
+    if (i < basicArraySize) i++;
 
     // support for endless games
-    NSInteger tentativeTurntime = [[basicArray objectAtIndex:i++] intValue];
+    NSInteger tentativeTurntime = [[basicArray objectAtIndex:i] intValue];
     if (tentativeTurntime == 100)
         tentativeTurntime = 9999;
     NSString *turnTime = [[NSString alloc] initWithFormat:@"e$turntime %d",tentativeTurntime * 1000];
     [self sendToEngine:turnTime];
     [turnTime release];
+    if (i < basicArraySize) i++;
 
-    result = [[basicArray objectAtIndex:i++] intValue]; // initial health
+    result = [[basicArray objectAtIndex:i] intValue]; // initial health
+    if (i < basicArraySize) i++;
 
-    NSString *sdTime = [[NSString alloc] initWithFormat:@"e$sd_turns %d",[[basicArray objectAtIndex:i++] intValue]];
+    NSString *sdTime = [[NSString alloc] initWithFormat:@"e$sd_turns %d",[[basicArray objectAtIndex:i] intValue]];
     [self sendToEngine:sdTime];
     [sdTime release];
+    if (i < basicArraySize) i++;
 
-    NSString *crateDrops = [[NSString alloc] initWithFormat:@"e$casefreq %d",[[basicArray objectAtIndex:i++] intValue]];
+    NSString *crateDrops = [[NSString alloc] initWithFormat:@"e$casefreq %d",[[basicArray objectAtIndex:i] intValue]];
     [self sendToEngine:crateDrops];
     [crateDrops release];
+    if (i < basicArraySize) i++;
 
-    NSString *minesTime = [[NSString alloc] initWithFormat:@"e$minestime %d",[[basicArray objectAtIndex:i++] intValue] * 1000];
+    NSString *healthProb = [[NSString alloc] initWithFormat:@"e$healthprob %d",[[basicArray objectAtIndex:i] intValue]];
+    [self sendToEngine:healthProb];
+    [healthProb release];
+    if (i < basicArraySize) i++;
+
+    NSString *healthAmount = [[NSString alloc] initWithFormat:@"e$hcaseamount %d",[[basicArray objectAtIndex:i] intValue]];
+    [self sendToEngine:healthAmount];
+    [healthAmount release];
+    if (i < basicArraySize) i++;
+
+    NSString *minesTime = [[NSString alloc] initWithFormat:@"e$minestime %d",[[basicArray objectAtIndex:i] intValue] * 1000];
     [self sendToEngine:minesTime];
     [minesTime release];
+    if (i < basicArraySize) i++;
 
-    NSString *minesNumber = [[NSString alloc] initWithFormat:@"e$minesnum %d",[[basicArray objectAtIndex:i++] intValue]];
+    NSString *minesNumber = [[NSString alloc] initWithFormat:@"e$minesnum %d",[[basicArray objectAtIndex:i] intValue]];
     [self sendToEngine:minesNumber];
     [minesNumber release];
+    if (i < basicArraySize) i++;
 
-    NSString *dudMines = [[NSString alloc] initWithFormat:@"e$minedudpct %d",[[basicArray objectAtIndex:i++] intValue]];
+    NSString *dudMines = [[NSString alloc] initWithFormat:@"e$minedudpct %d",[[basicArray objectAtIndex:i] intValue]];
     [self sendToEngine:dudMines];
     [dudMines release];
+    if (i < basicArraySize) i++;
 
-    NSString *explosives = [[NSString alloc] initWithFormat:@"e$explosives %d",[[basicArray objectAtIndex:i++] intValue]];
+    NSString *explosives = [[NSString alloc] initWithFormat:@"e$explosives %d",[[basicArray objectAtIndex:i] intValue]];
     [self sendToEngine:explosives];
     [explosives release];
+    if (i < basicArraySize) i++;
 
     DLog(@"Sent %d flags and %d modes", [gamemodArray count], i);
     [schemeDictionary release];
@@ -225,7 +245,7 @@
 #pragma mark -
 #pragma mark Thread/Network relevant code
 // select one of GameSetup method and execute it in a seprate thread
--(void) startThread: (NSString *) selector {
+-(void) startThread:(NSString *)selector {
     SEL usage = NSSelectorFromString(selector);
     [NSThread detachNewThreadSelector:usage toTarget:self withObject:nil];
 }
--- a/project_files/HedgewarsMobile/Classes/LevelViewController.m	Sat Nov 06 12:56:09 2010 -0400
+++ b/project_files/HedgewarsMobile/Classes/LevelViewController.m	Sat Nov 06 18:21:30 2010 +0100
@@ -95,14 +95,15 @@
         if (cell == nil) {
             cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier0] autorelease];
             UISwitch *theSwitch = [[UISwitch alloc] init];
-            if (numberOfSections == 1)
-                theSwitch.on = NO;
-            else
-                theSwitch.on = YES;
             [theSwitch addTarget:self action:@selector(switchValueChanged:) forControlEvents:UIControlEventValueChanged];
             cell.accessoryView = theSwitch;
             [theSwitch release];
         }
+        UISwitch *theSwitch = (UISwitch *)cell.accessoryView;
+        if (numberOfSections == 1)
+            theSwitch.on = NO;
+        else
+            theSwitch.on = YES;
         cell.textLabel.text = NSLocalizedString(@"Hogs controlled by AI",@"");
     } else {
         cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier1];
@@ -137,7 +138,7 @@
     if (theSwitch.on) {
         numberOfSections = 2;
         [self.tableView insertSections:sections withRowAnimation:UITableViewRowAnimationFade];
-        level = random() % [levelArray count];
+        level = 1 + (random() % ([levelArray count] - 1));
     } else {
         numberOfSections = 1;
         [self.tableView deleteSections:sections withRowAnimation:UITableViewRowAnimationFade];
@@ -146,7 +147,7 @@
 
     DLog(@"New level is %d",level);
     for (NSMutableDictionary *hog in hogs)
-        [hog setObject:[NSNumber numberWithInt:0] forKey:@"level"];
+        [hog setObject:[NSNumber numberWithInt:level] forKey:@"level"];
 
     [self.tableView reloadData];
     [[NSNotificationCenter defaultCenter] postNotificationName:@"setWriteNeedTeams" object:nil];
--- a/project_files/HedgewarsMobile/Classes/MainMenuViewController.m	Sat Nov 06 12:56:09 2010 -0400
+++ b/project_files/HedgewarsMobile/Classes/MainMenuViewController.m	Sat Nov 06 18:21:30 2010 +0100
@@ -55,18 +55,19 @@
     [[NSFileManager defaultManager] createDirectoryAtPath:SAVES_DIRECTORY() withIntermediateDirectories:NO attributes:nil error:NULL];
     
     // if the settings file is already present, we merge current preferences with the update
-    directoryToCheck = [NSString stringWithFormat:@"%@/Settings/settings.plist",resDir];
+    fileToCheck = [NSString stringWithFormat:@"%@/Settings/settings.plist",resDir];
     if ([[NSFileManager defaultManager] fileExistsAtPath:SETTINGS_FILE()]) {
         NSDictionary *settings = [[NSDictionary alloc] initWithContentsOfFile:SETTINGS_FILE()];
-        NSMutableDictionary *update = [[NSMutableDictionary alloc] initWithContentsOfFile:directoryToCheck];
+        NSMutableDictionary *update = [[NSMutableDictionary alloc] initWithContentsOfFile:fileToCheck];
         [update addEntriesFromDictionary:settings];
         [settings release];
         [update writeToFile:SETTINGS_FILE() atomically:YES];
         [update release];
     } else 
-        [[NSFileManager defaultManager] copyItemAtPath:directoryToCheck toPath:SETTINGS_FILE() error:&err];
+        [[NSFileManager defaultManager] copyItemAtPath:fileToCheck toPath:SETTINGS_FILE() error:&err];
     
-    // if the teams are already present we merge the old teams if they still exist
+    // TODO: scrap this and always copy the bundled files; update exisising ones in some way
+    // if the teams are already present we merge the old teams, else we copy new teams
     directoryToCheck = [NSString stringWithFormat:@"%@/Settings/Teams",resDir];
     if ([[NSFileManager defaultManager] fileExistsAtPath:TEAMS_DIRECTORY()]) {
         for (NSString *str in [[NSFileManager defaultManager] contentsOfDirectoryAtPath:directoryToCheck error:&err]) {
@@ -79,43 +80,46 @@
                 [team release];
                 [update writeToFile:fileToCheck atomically:YES];
                 [update release];
-            }
+            } else
+                [[NSFileManager defaultManager] copyItemAtPath:fileToUpdate toPath:fileToCheck error:&err];
         }
     } else
         [[NSFileManager defaultManager] copyItemAtPath:directoryToCheck toPath:TEAMS_DIRECTORY() error:&err];
     
-    // the same holds for schemes (but they're arrays)
+    // TODO: scrap this and always copy the bundled files; update exisising ones in some way
+    // the same holds for schemes (but they're dictionaries containing arrays)
     directoryToCheck = [NSString stringWithFormat:@"%@/Settings/Schemes",resDir];
     if ([[NSFileManager defaultManager] fileExistsAtPath:SCHEMES_DIRECTORY()]) {
         for (NSString *str in [[NSFileManager defaultManager] contentsOfDirectoryAtPath:directoryToCheck error:nil]) {
             fileToCheck = [NSString stringWithFormat:@"%@/%@",SCHEMES_DIRECTORY(),str];
             fileToUpdate = [NSString stringWithFormat:@"%@/Settings/Schemes/%@",resDir,str];
             if ([[NSFileManager defaultManager] fileExistsAtPath:fileToCheck]) {
-                NSArray *scheme = [[NSArray alloc] initWithContentsOfFile:fileToCheck];
-                NSArray *update = [[NSArray alloc] initWithContentsOfFile:fileToUpdate];
-                if ([update count] > [scheme count])
+                NSDictionary *scheme = [[NSDictionary alloc] initWithContentsOfFile:fileToCheck];
+                NSDictionary *update = [[NSDictionary alloc] initWithContentsOfFile:fileToUpdate];
+                if ([[update objectForKey:@"basic"] count] > [[scheme objectForKey:@"basic"] count] ||
+                    [[update objectForKey:@"gamemod"] count] > [[scheme objectForKey:@"gamemod"] count])
                     [update writeToFile:fileToCheck atomically:YES];
                 [update release];
                 [scheme release];
-            }
+            } else
+                [[NSFileManager defaultManager] copyItemAtPath:fileToUpdate toPath:fileToCheck error:&err];
         }
     } else
         [[NSFileManager defaultManager] copyItemAtPath:directoryToCheck toPath:SCHEMES_DIRECTORY() error:&err];
     
-    // we create weapons the first time only, they are autoupdated each time
-    if ([[NSFileManager defaultManager] fileExistsAtPath:WEAPONS_DIRECTORY()] == NO) {
+    // weapons are autoupdated at runtime but it's better to update then every new version
+    if ([[NSFileManager defaultManager] fileExistsAtPath:WEAPONS_DIRECTORY()] == NO)
         [[NSFileManager defaultManager] createDirectoryAtPath:WEAPONS_DIRECTORY()
                                   withIntermediateDirectories:YES
                                                    attributes:nil
                                                         error:&err];
-        createWeaponNamed(@"Default", 0);
-        createWeaponNamed(@"Crazy", 1);
-        createWeaponNamed(@"Pro mode", 2);
-        createWeaponNamed(@"Shoppa", 3);
-        createWeaponNamed(@"Basketball", 4);
-        createWeaponNamed(@"Minefield", 5);
-    }
-    
+    createWeaponNamed(@"Default", 0);
+    createWeaponNamed(@"Crazy", 1);
+    createWeaponNamed(@"Pro mode", 2);
+    createWeaponNamed(@"Shoppa", 3);
+    createWeaponNamed(@"Clean slate", 4);
+    createWeaponNamed(@"Minefield", 5);
+
     if (err != nil) 
         DLog(@"%@", err);
     else
--- a/project_files/HedgewarsMobile/Resources/Settings/Schemes/Barrel Mayhem.plist	Sat Nov 06 12:56:09 2010 -0400
+++ b/project_files/HedgewarsMobile/Resources/Settings/Schemes/Barrel Mayhem.plist	Sat Nov 06 18:21:30 2010 +0100
@@ -9,6 +9,8 @@
 		<integer>100</integer>
 		<integer>15</integer>
 		<integer>0</integer>
+		<integer>35</integer>
+		<integer>25</integer>
 		<integer>0</integer>
 		<integer>0</integer>
 		<integer>0</integer>
--- a/project_files/HedgewarsMobile/Resources/Settings/Schemes/Default.plist	Sat Nov 06 12:56:09 2010 -0400
+++ b/project_files/HedgewarsMobile/Resources/Settings/Schemes/Default.plist	Sat Nov 06 18:21:30 2010 +0100
@@ -9,6 +9,8 @@
 		<integer>100</integer>
 		<integer>15</integer>
 		<integer>5</integer>
+		<integer>35</integer>
+		<integer>25</integer>
 		<integer>3</integer>
 		<integer>4</integer>
 		<integer>0</integer>
--- a/project_files/HedgewarsMobile/Resources/Settings/Schemes/Minefield.plist	Sat Nov 06 12:56:09 2010 -0400
+++ b/project_files/HedgewarsMobile/Resources/Settings/Schemes/Minefield.plist	Sat Nov 06 18:21:30 2010 +0100
@@ -9,6 +9,8 @@
 		<integer>50</integer>
 		<integer>15</integer>
 		<integer>0</integer>
+		<integer>35</integer>
+		<integer>25</integer>
 		<integer>0</integer>
 		<integer>80</integer>
 		<integer>0</integer>
--- a/project_files/HedgewarsMobile/Resources/Settings/Schemes/Pro Mode.plist	Sat Nov 06 12:56:09 2010 -0400
+++ b/project_files/HedgewarsMobile/Resources/Settings/Schemes/Pro Mode.plist	Sat Nov 06 18:21:30 2010 +0100
@@ -9,6 +9,8 @@
 		<integer>100</integer>
 		<integer>15</integer>
 		<integer>0</integer>
+		<integer>35</integer>
+		<integer>25</integer>
 		<integer>3</integer>
 		<integer>0</integer>
 		<integer>0</integer>
--- a/project_files/HedgewarsMobile/Resources/Settings/Schemes/Shoppa.plist	Sat Nov 06 12:56:09 2010 -0400
+++ b/project_files/HedgewarsMobile/Resources/Settings/Schemes/Shoppa.plist	Sat Nov 06 18:21:30 2010 +0100
@@ -9,6 +9,8 @@
 		<integer>100</integer>
 		<integer>50</integer>
 		<integer>1</integer>
+		<integer>0</integer>
+		<integer>35</integer>
 		<integer>3</integer>
 		<integer>0</integer>
 		<integer>0</integer>
--- a/project_files/HedgewarsMobile/Resources/Settings/Schemes/Timeless.plist	Sat Nov 06 12:56:09 2010 -0400
+++ b/project_files/HedgewarsMobile/Resources/Settings/Schemes/Timeless.plist	Sat Nov 06 18:21:30 2010 +0100
@@ -9,6 +9,8 @@
 		<integer>100</integer>
 		<integer>15</integer>
 		<integer>5</integer>
+		<integer>35</integer>
+		<integer>25</integer>
 		<integer>3</integer>
 		<integer>4</integer>
 		<integer>0</integer>
@@ -36,7 +38,7 @@
 		<false/>
 		<false/>
 		<false/>
-		<false/>
+		<true/>
 	</array>
 </dict>
 </plist>
--- a/project_files/HedgewarsMobile/Resources/Settings/Schemes/Tunnel Hogs.plist	Sat Nov 06 12:56:09 2010 -0400
+++ b/project_files/HedgewarsMobile/Resources/Settings/Schemes/Tunnel Hogs.plist	Sat Nov 06 18:21:30 2010 +0100
@@ -9,6 +9,8 @@
 		<integer>100</integer>
 		<integer>15</integer>
 		<integer>5</integer>
+		<integer>35</integer>
+		<integer>25</integer>
 		<integer>3</integer>
 		<integer>10</integer>
 		<integer>10</integer>
--- a/project_files/HedgewarsMobile/Resources/Settings/iFrontend/basicFlags_en.plist	Sat Nov 06 12:56:09 2010 -0400
+++ b/project_files/HedgewarsMobile/Resources/Settings/iFrontend/basicFlags_en.plist	Sat Nov 06 18:21:30 2010 +0100
@@ -44,7 +44,7 @@
 		<key>image</key>
 		<string>SuddenDeath</string>
 		<key>max</key>
-		<integer>50</integer>
+		<integer>999</integer>
 		<key>min</key>
 		<integer>0</integer>
 		<key>title</key>
@@ -64,6 +64,30 @@
 	</dict>
 	<dict>
 		<key>default</key>
+		<integer>35</integer>
+		<key>image</key>
+		<string>Health</string>
+		<key>max</key>
+		<integer>100</integer>
+		<key>min</key>
+		<integer>0</integer>
+		<key>title</key>
+		<string>Health Kit Probability</string>
+	</dict>
+	<dict>
+		<key>default</key>
+		<integer>25</integer>
+		<key>image</key>
+		<string>Health</string>
+		<key>max</key>
+		<integer>200</integer>
+		<key>min</key>
+		<integer>0</integer>
+		<key>title</key>
+		<string>Health Amount in Kit</string>
+	</dict>
+	<dict>
+		<key>default</key>
 		<integer>3</integer>
 		<key>image</key>
 		<string>Time</string>