Version of Robotron arcade game using LPC1768, a Gameduino shield, a serial EEPROM (for high scores), two microswitch joysticks and two buttons plus a box to put it in. 20 levels of mayhem.

Dependencies:   25LCxxx_SPI CommonTypes Gameduino mbed

Revision:
10:bfa1c307c99d
Parent:
0:5fa232ee5fdf
Child:
11:2ddaf46e95cb
--- a/LevelCollection.cpp	Sun Jun 09 14:28:53 2013 +0000
+++ b/LevelCollection.cpp	Sun Jun 09 19:34:56 2013 +0000
@@ -8,29 +8,8 @@
 #include <stdio.h>
 #include "LevelCollection.h"
 #include "Level0.h"
-#include "Level1.h"
-#include "Level2.h"
-#if 0
-    #include "Level3.h"
-    #include "Level4.h"
-    #include "Level5.h"
-    #include "Level6.h"
-    #include "Level7.h"
-    #include "Level8.h"
-    #include "Level9.h"
-    #include "Level10.h"
-    #include "Level10.h"
-    #include "Level11.h"
-    #include "Level12.h"
-    #include "Level13.h"
-    #include "Level14.h"
-    #include "Level15.h"
-    #include "Level16.h"
-    #include "Level17.h"
-    #include "Level18.h"
-    #include "Level19.h"
-    #include "Level20.h"
-#endif
+#include "LevelNormal.h"
+#include "LevelDescriptor.h"
 
 /***************/
 /* CONSTRUCTOR */
@@ -53,58 +32,20 @@
   return LEVELCOUNT;
 }
 
-// Individual levels.
-static Level0 level0;  // Not a real level. This is attract mode.
-static Level1 level1;
-static Level2 level2;
-#if 0
-static Level3 level3;
-static Level4 level4;
-static Level5 level5;
-static Level6 level6;
-static Level7 level7;
-static Level8 level8;
-static Level9 level9;
-static Level10 level10;
-static Level11 level11;
-static Level12 level12;
-static Level13 level13;
-static Level14 level14;
-static Level15 level15;
-static Level16 level16;
-static Level17 level17;
-static Level18 level18;
-static Level19 level19;
-static Level20 level20;
-#endif
+// Level 0 which is NOT dynamically allocated.
+// Not a real level. This is attract mode.
+static Level0 level0;
 
-// Pointers to all the levels.
-// If I have got this right then each pointer in the array points to a
-// Level that is NOT const, but the array itself is const and cannot be modified.
-static Level* const levels[ LEVELCOUNT ] = {
-  &level0,
-  &level1,
-  &level2,
-#if 0
-    &level3,
-  &level4,
-  &level5,
-  &level6,
-    &level7,
-  &level8,
-  &level9,
-  &level10,
-  &level11,
-  &level12,
-    &level13,
-  &level14,
-  &level15,
-  &level16,
-    &level17,
-  &level18,
-  &level19,
-  &level20,
-#endif
+// Level descriptors.
+static const UInt8 ld0[] = { ENDDESCRIPTOR };
+static const UInt8 ld1[] = { Grunt, 5, Crusher, 5, ENDDESCRIPTOR };
+static const UInt8 ld2[] = { Grunt, 10, Brain, 2, ENDDESCRIPTOR };
+
+// Array pointing to level data for each level.
+static const UInt8* const levelDescriptors[ LEVELCOUNT ] = {
+    ld0,
+    ld1,
+    ld2,
 };
 
 /***************/
@@ -114,15 +55,29 @@
 // Returns pointer to level or NULL if no such level.
 Level *LevelCollection::GetLevel( UInt8 levelNumber ) {
   if( levelNumber >= LEVELCOUNT ) {
+    // Level number out of range.
     return (Level*)NULL;
   }
+  else if( levelNumber == 0 ) {
+    // Level zero is the attract mode and is not dynamically allocated.
+    return &level0;
+  }
   else {
-    // Fetch pointer to level from array and tag it with the
-    // correct level number before returning it.
-    Level *level = levels[ levelNumber ];
+    // Fetch level descriptor for this level and create a Level from it.
+    Level *level = new LevelNormal( levelDescriptors[ levelNumber ] );
+    // Tag it with the correct level number before returning it.
     level->LevelNumber = levelNumber;
     return level;
   }
 }
 
-
+/*******************************/
+/* FREE MEMORY USED BY A LEVEL */
+/*******************************/
+// Pass pointer to a level.
+// Frees memory used by level.
+void LevelCollection::FreeLevel( Level *level ) {
+    if( ( level != (Level*)NULL ) && level->IsDynamicallyAllocated ) {
+        delete level;
+    }
+}