Advertisement
Guest User

C++ Allegro 5 Game Framework (NOT WORKING)

a guest
Dec 31st, 2012
187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 73.44 KB | None | 0 0
  1. // Include all of the Allegro libraries so we don't have to later
  2.  
  3. #include <stdio.h>                              // C++ standard library
  4. #include <iostream>                             // Input\output stream, cout, cin, cerr, etc.
  5. #include <string>                               // C++ string library
  6. #include <allegro5/allegro.h>                   // Allegro base library
  7. #include <allegro5/allegro_audio.h>             // Allegro audio library
  8. #include <allegro5/allegro_acodec.h>            // Library used to load different audio codecs
  9. #include <allegro5/allegro_image.h>             // You MUST load the image library for anything bitmap-image related
  10. #include <allegro5/allegro_font.h>              // Allegro font functions library
  11. #include <allegro5/allegro_ttf.h>               // Allegro library used to interface with TrueType fonts
  12. #include <allegro5/allegro_primitives.h>        // Allegro primitives addon, for drawing shapes n' stuff
  13. #include <allegro5/allegro_native_dialog.h>     // You load this for the native message box feature (see below)
  14.  
  15. // Namespace usage
  16.  
  17. using namespace std;
  18.  
  19. // EDIT THESE DEFINES
  20.  
  21. #define NF_WINDOW_WIDTH     640                                         // Window width
  22. #define NF_WINDOW_HEIGHT    480                                         // Window height
  23. #define NF_FPS              60                                          // Game frames per second
  24. #define NF_WINDOW_TITLE     "Neil's Framework Default Window Title"     // Windowed-mode title
  25. #define NF_START_FULLSCREEN false                                       // true is default fullscreen, false is windowed
  26. #define NF_SHOW_CURSOR      true                                        // true shows the mouse cursor, false hides it in the window/fullscreen
  27. #define NF_F11_SWITCH_MODE  true                                        // true makes pressing F11 automatically switch the window mode: windowed or fullscreen
  28. #define NF_ESC_ENDGAME      true                                        // true makes pressing the "Esc" key automatically close the program, false makes it not
  29. #define NF_RESERVED_SAMPLES 1                                           // Number of tracks in the default mixer available to play at any given moment
  30.  
  31. #define NF_CLEARCOLOR_RED   255                                         // Window sync clear color "red" value
  32. #define NF_CLEARCOLOR_GREEN 255                                         // Window sync clear color "green" value
  33. #define NF_CLEARCOLOR_BLUE  255                                         // Window sync clear color "blue" value
  34.  
  35. // Trusty-dusty extra defines
  36.  
  37. #define NF_PI           3.141592
  38. #define NF_E            2.718281
  39. #define NF_RAD2DEG(r)   (r * (180.0 / NF_PI))
  40. #define NF_DEG2RAD(d)   (d / (180.0 / NF_PI))
  41.  
  42. // Neil's Framework keycode defines
  43.  
  44. #define nfKeyCode_A             0
  45. #define nfKeyCode_B             1
  46. #define nfKeyCode_C             2
  47. #define nfKeyCode_D             3
  48. #define nfKeyCode_E             4
  49. #define nfKeyCode_F             5
  50. #define nfKeyCode_G             6
  51. #define nfKeyCode_H             7
  52. #define nfKeyCode_I             8
  53. #define nfKeyCode_J             9
  54. #define nfKeyCode_K             10
  55. #define nfKeyCode_L             11
  56. #define nfKeyCode_M             12
  57. #define nfKeyCode_N             13
  58. #define nfKeyCode_O             14
  59. #define nfKeyCode_P             15
  60. #define nfKeyCode_Q             16
  61. #define nfKeyCode_R             17
  62. #define nfKeyCode_S             18
  63. #define nfKeyCode_T             19
  64. #define nfKeyCode_U             20
  65. #define nfKeyCode_V             21
  66. #define nfKeyCode_W             22
  67. #define nfKeyCode_X             23
  68. #define nfKeyCode_Y             24
  69. #define nfKeyCode_Z             25
  70. #define nfKeyCode_0             26
  71. #define nfKeyCode_1             27
  72. #define nfKeyCode_2             28
  73. #define nfKeyCode_3             29
  74. #define nfKeyCode_4             30
  75. #define nfKeyCode_5             31
  76. #define nfKeyCode_6             32
  77. #define nfKeyCode_7             33
  78. #define nfKeyCode_8             34
  79. #define nfKeyCode_9             35
  80. #define nfKeyCode_PAD0          36
  81. #define nfKeyCode_PAD1          37
  82. #define nfKeyCode_PAD2          38
  83. #define nfKeyCode_PAD3          39
  84. #define nfKeyCode_PAD4          40
  85. #define nfKeyCode_PAD5          41
  86. #define nfKeyCode_PAD6          42
  87. #define nfKeyCode_PAD7          43
  88. #define nfKeyCode_PAD8          44
  89. #define nfKeyCode_PAD9          45
  90. #define nfKeyCode_F1            46
  91. #define nfKeyCode_F2            47
  92. #define nfKeyCode_F3            48
  93. #define nfKeyCode_F4            49
  94. #define nfKeyCode_F5            50
  95. #define nfKeyCode_F6            51
  96. #define nfKeyCode_F7            52
  97. #define nfKeyCode_F8            53
  98. #define nfKeyCode_F9            54
  99. #define nfKeyCode_F10           55
  100. #define nfKeyCode_F11           56
  101. #define nfKeyCode_F12           57
  102. #define nfKeyCode_ESCAPE        58
  103. #define nfKeyCode_TILDE         59
  104. #define nfKeyCode_MINUS         60
  105. #define nfKeyCode_EQUALS        61
  106. #define nfKeyCode_BACKSPACE     62
  107. #define nfKeyCode_TAB           63
  108. #define nfKeyCode_OPENBRACE     64
  109. #define nfKeyCode_CLOSEBRACE    65
  110. #define nfKeyCode_ENTER         66
  111. #define nfKeyCode_SEMICOLON     67
  112. #define nfKeyCode_QUOTE         68
  113. #define nfKeyCode_BACKSLASH     69
  114. #define nfKeyCode_BACKSLASH2    70
  115. #define nfKeyCode_COMMA         71
  116. #define nfKeyCode_FULLSTOP      72
  117. #define nfKeyCode_SLASH         73
  118. #define nfKeyCode_SPACE         74
  119. #define nfKeyCode_INSERT        75
  120. #define nfKeyCode_DELETE        76
  121. #define nfKeyCode_HOME          77
  122. #define nfKeyCode_END           78
  123. #define nfKeyCode_PAGEUP        79
  124. #define nfKeyCode_PAGEDOWN      80
  125. #define nfKeyCode_LEFT          81
  126. #define nfKeyCode_RIGHT         82
  127. #define nfKeyCode_UP            83
  128. #define nfKeyCode_DOWN          84
  129. #define nfKeyCode_PADSLASH      85
  130. #define nfKeyCode_PADASTERISK   86
  131. #define nfKeyCode_PADMINUS      87
  132. #define nfKeyCode_PADPLUS       88
  133. #define nfKeyCode_PADDELETE     89
  134. #define nfKeyCode_PADENTER      90
  135. #define nfKeyCode_PRINTSCREEN   91
  136. #define nfKeyCode_PAUSE         92
  137. #define nfKeyCode_ABNTC1        93
  138. #define nfKeyCode_YEN           94
  139. #define nfKeyCode_KANA          95
  140. #define nfKeyCode_CONVERT       96
  141. #define nfKeyCode_NOCONVERT     97
  142. #define nfKeyCode_AT            98
  143. #define nfKeyCode_CIRCUMFLEX    99
  144. #define nfKeyCode_COLON2        100
  145. #define nfKeyCode_KANJI         101
  146. #define nfKeyCode_LEFTSHIFT     102
  147. #define nfKeyCode_RIGHTSHIFT    103
  148. #define nfKeyCode_LEFTCONTROL   104
  149. #define nfKeyCode_RIGHTCONTROL  105
  150. #define nfKeyCode_ALT           106
  151. #define nfKeyCode_ALTGR         107
  152. #define nfKeyCode_LEFTWINDOWS   108
  153. #define nfKeyCode_RIGHTWINDOWS  109
  154. #define nfKeyCode_MENU          110
  155. #define nfKeyCode_SCROLLLOCK    111
  156. #define nfKeyCode_NUMLOCK       112
  157. #define nfKeyCode_CAPSLOCK      113
  158. #define nfKeyCode_PADEQUALS     114
  159. #define nfKeyCode_BACKQUOTE     115
  160. #define nfKeyCode_SEMICOLON2    116
  161. #define nfKeyCode_COMMAND       117
  162.  
  163. // Key status true is KEY DOWN, false is KEY UP
  164.  
  165. bool nfCurrentKeyStatus [118]   =   {false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false};
  166. bool nfPreviousKeyStatus [118]  =   {false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false};
  167.  
  168. int nfMouseX            =   0;
  169. int nfMouseY            =   0;
  170. int nfPreviousMouseX    =   0;
  171. int nfPreviousMouseY    =   0;
  172.  
  173. bool nfMouseCurrentDown     =   false;  // True is down, false is up (Generic mouse button, no left-right distinguishment for platform compatibility)
  174. bool nfMousePreviousDown    =   false;
  175.  
  176. // CLASSES
  177.  
  178. class nfDisplay {
  179.     public:
  180.         ALLEGRO_DISPLAY *display;
  181.         ALLEGRO_DISPLAY_MODE fullscreenData;
  182.         ALLEGRO_EVENT_QUEUE *eventQueue;
  183.         ALLEGRO_BITMAP *windowIcon;
  184.         ALLEGRO_TIMER *fpsTimer;
  185.         int width, height;
  186.         unsigned char clearRed, clearGreen, clearBlue;
  187.         int windowedWidth, windowedHeight;
  188.         int fullscreenWidth, fullscreenHeight;
  189.         bool isFullscreen;
  190.         bool cursorVisible;
  191.         bool f11SwitchWindowMode, escExit;
  192.         bool syncRedraw, doExit;
  193.         string title;
  194. } display;
  195.  
  196. class nfImage {
  197.     public:
  198.         ALLEGRO_BITMAP *bitmap;
  199.         unsigned int width, height;
  200.         nfImage();
  201.         ~nfImage();
  202.         bool loadFromFile(string);
  203. };
  204.  
  205. class nfSprite {
  206.     public:
  207.         nfImage currentImage;
  208.         float x, y;
  209.         bool flippedHorizontal, flippedVertical;
  210.         nfSprite();
  211.         ~nfSprite();
  212.         void setImage(nfImage);
  213.         void draw();
  214. };
  215.  
  216. // FUNCTIONS
  217.  
  218. bool nfInit();                  // Initialisation function
  219. void nfSync();                  // Synchronize game in the loop
  220. void nfSyncReset();             // Reset syncRedraw and others
  221. bool nfGetEventQueueEmpty();    // Used in thr sync redraw "if" statement
  222. bool nfDestroy();               // Call at end of program, destroy's "nfDisplay"'s members
  223.  
  224. // M       M  AAAA  IIIII  N   N
  225. // MM     MM  A  A    I    NN  N
  226. // M M   M M  AAAA    I    N N N
  227. // M  M M  M  A  A    I    N  NN
  228. // M   M   M  A  A  IIIII  N   N
  229.  
  230. int main(int argc, char* argv[]) {
  231.     if (!nfInit()) {
  232.         return -1;
  233.     }
  234.  
  235.     // Create sprites, images, sounds, fonts, etc.
  236.  
  237.     nfImage     mypic;
  238.     nfSprite    mysprite;
  239.  
  240.     if (!mypic.loadFromFile("hello.png")) {
  241.         return -1;
  242.     }
  243.  
  244.     mysprite.setImage(mypic);
  245.     mysprite.x  =   435.0;
  246.     mysprite.y  =   235.0;
  247.  
  248.     while (!display.doExit) {
  249.         if (display.syncRedraw && nfGetEventQueueEmpty()) {
  250.  
  251.             // Do loop stuff, draw stuff, play sounds (work in progress), draw text & consolidate fonts, etc.
  252.  
  253.             mysprite.draw();
  254.  
  255.             nfSyncReset(); // Reset the event system (Mostly just set syncRedraw to false)
  256.         }
  257.         nfSync();
  258.     }
  259.  
  260.     if (!nfDestroy()) {
  261.         return -1;
  262.     }
  263.     return 0;
  264. }
  265.  
  266. void nfSync() {
  267.     ALLEGRO_EVENT currentEvent;
  268.     al_wait_for_event(display.eventQueue, &currentEvent);
  269.  
  270.     if (currentEvent.type == ALLEGRO_EVENT_DISPLAY_CLOSE) {
  271.         display.doExit = true;
  272.     } else if (currentEvent.type == ALLEGRO_EVENT_TIMER) {
  273.         display.syncRedraw = true;
  274.     } else if (currentEvent.type == ALLEGRO_EVENT_MOUSE_AXES || currentEvent.type == ALLEGRO_EVENT_MOUSE_LEAVE_DISPLAY) {
  275.         nfPreviousMouseX    =   nfMouseX;
  276.         nfPreviousMouseY    =   nfMouseY;
  277.         nfMouseX            =   currentEvent.mouse.x;
  278.         nfMouseY            =   currentEvent.mouse.y;
  279.     } else if (currentEvent.type == ALLEGRO_EVENT_MOUSE_BUTTON_DOWN) {
  280.         nfMousePreviousDown = nfMouseCurrentDown;
  281.         nfMouseCurrentDown = true;
  282.     } else if (currentEvent.type == ALLEGRO_EVENT_MOUSE_BUTTON_UP) {
  283.         nfMousePreviousDown = nfMouseCurrentDown;
  284.         nfMouseCurrentDown = false;
  285.     } else if (currentEvent.type == ALLEGRO_EVENT_KEY_DOWN) {
  286.         switch (currentEvent.keyboard.keycode) {
  287.             case ALLEGRO_KEY_A:
  288.                 nfPreviousKeyStatus[nfKeyCode_A]    =   nfCurrentKeyStatus[nfKeyCode_A];
  289.                 nfCurrentKeyStatus[nfKeyCode_A]     =   true;
  290.                 break;
  291.             case ALLEGRO_KEY_B:
  292.                 nfPreviousKeyStatus[nfKeyCode_B]    =   nfCurrentKeyStatus[nfKeyCode_B];
  293.                 nfCurrentKeyStatus[nfKeyCode_B]     =   true;
  294.                 break;
  295.             case ALLEGRO_KEY_C:
  296.                 nfPreviousKeyStatus[nfKeyCode_C]    =   nfCurrentKeyStatus[nfKeyCode_C];
  297.                 nfCurrentKeyStatus[nfKeyCode_C]     =   true;
  298.                 break;
  299.             case ALLEGRO_KEY_D:
  300.                 nfPreviousKeyStatus[nfKeyCode_D]    =   nfCurrentKeyStatus[nfKeyCode_D];
  301.                 nfCurrentKeyStatus[nfKeyCode_D]     =   true;
  302.                 break;
  303.             case ALLEGRO_KEY_E:
  304.                 nfPreviousKeyStatus[nfKeyCode_E]    =   nfCurrentKeyStatus[nfKeyCode_E];
  305.                 nfCurrentKeyStatus[nfKeyCode_E]     =   true;
  306.                 break;
  307.             case ALLEGRO_KEY_F:
  308.                 nfPreviousKeyStatus[nfKeyCode_F]    =   nfCurrentKeyStatus[nfKeyCode_F];
  309.                 nfCurrentKeyStatus[nfKeyCode_F]     =   true;
  310.                 break;
  311.             case ALLEGRO_KEY_G:
  312.                 nfPreviousKeyStatus[nfKeyCode_G]    =   nfCurrentKeyStatus[nfKeyCode_G];
  313.                 nfCurrentKeyStatus[nfKeyCode_G]     =   true;
  314.                 break;
  315.             case ALLEGRO_KEY_H:
  316.                 nfPreviousKeyStatus[nfKeyCode_H]    =   nfCurrentKeyStatus[nfKeyCode_H];
  317.                 nfCurrentKeyStatus[nfKeyCode_H]     =   true;
  318.                 break;
  319.             case ALLEGRO_KEY_I:
  320.                 nfPreviousKeyStatus[nfKeyCode_I]    =   nfCurrentKeyStatus[nfKeyCode_I];
  321.                 nfCurrentKeyStatus[nfKeyCode_I]     =   true;
  322.                 break;
  323.             case ALLEGRO_KEY_J:
  324.                 nfPreviousKeyStatus[nfKeyCode_J]    =   nfCurrentKeyStatus[nfKeyCode_J];
  325.                 nfCurrentKeyStatus[nfKeyCode_J]     =   true;
  326.                 break;
  327.             case ALLEGRO_KEY_K:
  328.                 nfPreviousKeyStatus[nfKeyCode_K]    =   nfCurrentKeyStatus[nfKeyCode_K];
  329.                 nfCurrentKeyStatus[nfKeyCode_K]     =   true;
  330.                 break;
  331.             case ALLEGRO_KEY_L:
  332.                 nfPreviousKeyStatus[nfKeyCode_L]    =   nfCurrentKeyStatus[nfKeyCode_L];
  333.                 nfCurrentKeyStatus[nfKeyCode_L]     =   true;
  334.                 break;
  335.             case ALLEGRO_KEY_M:
  336.                 nfPreviousKeyStatus[nfKeyCode_M]    =   nfCurrentKeyStatus[nfKeyCode_M];
  337.                 nfCurrentKeyStatus[nfKeyCode_M]     =   true;
  338.                 break;
  339.             case ALLEGRO_KEY_N:
  340.                 nfPreviousKeyStatus[nfKeyCode_N]    =   nfCurrentKeyStatus[nfKeyCode_N];
  341.                 nfCurrentKeyStatus[nfKeyCode_N]     =   true;
  342.                 break;
  343.             case ALLEGRO_KEY_O:
  344.                 nfPreviousKeyStatus[nfKeyCode_O]    =   nfCurrentKeyStatus[nfKeyCode_O];
  345.                 nfCurrentKeyStatus[nfKeyCode_O]     =   true;
  346.                 break;
  347.             case ALLEGRO_KEY_P:
  348.                 nfPreviousKeyStatus[nfKeyCode_P]    =   nfCurrentKeyStatus[nfKeyCode_P];
  349.                 nfCurrentKeyStatus[nfKeyCode_P]     =   true;
  350.                 break;
  351.             case ALLEGRO_KEY_Q:
  352.                 nfPreviousKeyStatus[nfKeyCode_Q]    =   nfCurrentKeyStatus[nfKeyCode_Q];
  353.                 nfCurrentKeyStatus[nfKeyCode_Q]     =   true;
  354.                 break;
  355.             case ALLEGRO_KEY_R:
  356.                 nfPreviousKeyStatus[nfKeyCode_R]    =   nfCurrentKeyStatus[nfKeyCode_R];
  357.                 nfCurrentKeyStatus[nfKeyCode_R]     =   true;
  358.                 break;
  359.             case ALLEGRO_KEY_S:
  360.                 nfPreviousKeyStatus[nfKeyCode_S]    =   nfCurrentKeyStatus[nfKeyCode_S];
  361.                 nfCurrentKeyStatus[nfKeyCode_S]     =   true;
  362.                 break;
  363.             case ALLEGRO_KEY_T:
  364.                 nfPreviousKeyStatus[nfKeyCode_T]    =   nfCurrentKeyStatus[nfKeyCode_T];
  365.                 nfCurrentKeyStatus[nfKeyCode_T]     =   true;
  366.                 break;
  367.             case ALLEGRO_KEY_U:
  368.                 nfPreviousKeyStatus[nfKeyCode_U]    =   nfCurrentKeyStatus[nfKeyCode_U];
  369.                 nfCurrentKeyStatus[nfKeyCode_U]     =   true;
  370.                 break;
  371.             case ALLEGRO_KEY_V:
  372.                 nfPreviousKeyStatus[nfKeyCode_V]    =   nfCurrentKeyStatus[nfKeyCode_V];
  373.                 nfCurrentKeyStatus[nfKeyCode_V]     =   true;
  374.                 break;
  375.             case ALLEGRO_KEY_W:
  376.                 nfPreviousKeyStatus[nfKeyCode_W]    =   nfCurrentKeyStatus[nfKeyCode_W];
  377.                 nfCurrentKeyStatus[nfKeyCode_W]     =   true;
  378.                 break;
  379.             case ALLEGRO_KEY_X:
  380.                 nfPreviousKeyStatus[nfKeyCode_X]    =   nfCurrentKeyStatus[nfKeyCode_X];
  381.                 nfCurrentKeyStatus[nfKeyCode_X]     =   true;
  382.                 break;
  383.             case ALLEGRO_KEY_Y:
  384.                 nfPreviousKeyStatus[nfKeyCode_Y]    =   nfCurrentKeyStatus[nfKeyCode_Y];
  385.                 nfCurrentKeyStatus[nfKeyCode_Y]     =   true;
  386.                 break;
  387.             case ALLEGRO_KEY_Z:
  388.                 nfPreviousKeyStatus[nfKeyCode_Z]    =   nfCurrentKeyStatus[nfKeyCode_Z];
  389.                 nfCurrentKeyStatus[nfKeyCode_Z]     =   true;
  390.                 break;
  391.             case ALLEGRO_KEY_0:
  392.                 nfPreviousKeyStatus[nfKeyCode_0]    =   nfCurrentKeyStatus[nfKeyCode_0];
  393.                 nfCurrentKeyStatus[nfKeyCode_0]     =   true;
  394.                 break;
  395.             case ALLEGRO_KEY_1:
  396.                 nfPreviousKeyStatus[nfKeyCode_1]    =   nfCurrentKeyStatus[nfKeyCode_1];
  397.                 nfCurrentKeyStatus[nfKeyCode_1]     =   true;
  398.                 break;
  399.             case ALLEGRO_KEY_2:
  400.                 nfPreviousKeyStatus[nfKeyCode_2]    =   nfCurrentKeyStatus[nfKeyCode_2];
  401.                 nfCurrentKeyStatus[nfKeyCode_2]     =   true;
  402.                 break;
  403.             case ALLEGRO_KEY_3:
  404.                 nfPreviousKeyStatus[nfKeyCode_3]    =   nfCurrentKeyStatus[nfKeyCode_3];
  405.                 nfCurrentKeyStatus[nfKeyCode_3]     =   true;
  406.                 break;
  407.             case ALLEGRO_KEY_4:
  408.                 nfPreviousKeyStatus[nfKeyCode_4]    =   nfCurrentKeyStatus[nfKeyCode_4];
  409.                 nfCurrentKeyStatus[nfKeyCode_4]     =   true;
  410.                 break;
  411.             case ALLEGRO_KEY_5:
  412.                 nfPreviousKeyStatus[nfKeyCode_5]    =   nfCurrentKeyStatus[nfKeyCode_5];
  413.                 nfCurrentKeyStatus[nfKeyCode_5]     =   true;
  414.                 break;
  415.             case ALLEGRO_KEY_6:
  416.                 nfPreviousKeyStatus[nfKeyCode_6]    =   nfCurrentKeyStatus[nfKeyCode_6];
  417.                 nfCurrentKeyStatus[nfKeyCode_6]     =   true;
  418.                 break;
  419.             case ALLEGRO_KEY_7:
  420.                 nfPreviousKeyStatus[nfKeyCode_7]    =   nfCurrentKeyStatus[nfKeyCode_7];
  421.                 nfCurrentKeyStatus[nfKeyCode_7]     =   true;
  422.                 break;
  423.             case ALLEGRO_KEY_8:
  424.                 nfPreviousKeyStatus[nfKeyCode_8]    =   nfCurrentKeyStatus[nfKeyCode_8];
  425.                 nfCurrentKeyStatus[nfKeyCode_8]     =   true;
  426.                 break;
  427.             case ALLEGRO_KEY_9:
  428.                 nfPreviousKeyStatus[nfKeyCode_9]    =   nfCurrentKeyStatus[nfKeyCode_9];
  429.                 nfCurrentKeyStatus[nfKeyCode_9]     =   true;
  430.                 break;
  431.             case ALLEGRO_KEY_PAD_0:
  432.                 nfPreviousKeyStatus[nfKeyCode_PAD0]    =   nfCurrentKeyStatus[nfKeyCode_PAD0];
  433.                 nfCurrentKeyStatus[nfKeyCode_PAD0]     =   true;
  434.                 break;
  435.             case ALLEGRO_KEY_PAD_1:
  436.                 nfPreviousKeyStatus[nfKeyCode_PAD1]    =   nfCurrentKeyStatus[nfKeyCode_PAD1];
  437.                 nfCurrentKeyStatus[nfKeyCode_PAD1]     =   true;
  438.                 break;
  439.             case ALLEGRO_KEY_PAD_2:
  440.                 nfPreviousKeyStatus[nfKeyCode_PAD2]    =   nfCurrentKeyStatus[nfKeyCode_PAD2];
  441.                 nfCurrentKeyStatus[nfKeyCode_PAD2]     =   true;
  442.                 break;
  443.             case ALLEGRO_KEY_PAD_3:
  444.                 nfPreviousKeyStatus[nfKeyCode_PAD3]    =   nfCurrentKeyStatus[nfKeyCode_PAD3];
  445.                 nfCurrentKeyStatus[nfKeyCode_PAD3]     =   true;
  446.                 break;
  447.             case ALLEGRO_KEY_PAD_4:
  448.                 nfPreviousKeyStatus[nfKeyCode_PAD4]    =   nfCurrentKeyStatus[nfKeyCode_PAD4];
  449.                 nfCurrentKeyStatus[nfKeyCode_PAD4]     =   true;
  450.                 break;
  451.             case ALLEGRO_KEY_PAD_5:
  452.                 nfPreviousKeyStatus[nfKeyCode_PAD5]    =   nfCurrentKeyStatus[nfKeyCode_PAD5];
  453.                 nfCurrentKeyStatus[nfKeyCode_PAD5]     =   true;
  454.                 break;
  455.             case ALLEGRO_KEY_PAD_6:
  456.                 nfPreviousKeyStatus[nfKeyCode_PAD6]    =   nfCurrentKeyStatus[nfKeyCode_PAD6];
  457.                 nfCurrentKeyStatus[nfKeyCode_PAD6]     =   true;
  458.                 break;
  459.             case ALLEGRO_KEY_PAD_7:
  460.                 nfPreviousKeyStatus[nfKeyCode_PAD7]    =   nfCurrentKeyStatus[nfKeyCode_PAD7];
  461.                 nfCurrentKeyStatus[nfKeyCode_PAD7]     =   true;
  462.                 break;
  463.             case ALLEGRO_KEY_PAD_8:
  464.                 nfPreviousKeyStatus[nfKeyCode_PAD8]    =   nfCurrentKeyStatus[nfKeyCode_PAD8];
  465.                 nfCurrentKeyStatus[nfKeyCode_PAD8]     =   true;
  466.                 break;
  467.             case ALLEGRO_KEY_PAD_9:
  468.                 nfPreviousKeyStatus[nfKeyCode_PAD9]    =   nfCurrentKeyStatus[nfKeyCode_PAD9];
  469.                 nfCurrentKeyStatus[nfKeyCode_PAD9]     =   true;
  470.                 break;
  471.             case ALLEGRO_KEY_F1:
  472.                 nfPreviousKeyStatus[nfKeyCode_F1]    =   nfCurrentKeyStatus[nfKeyCode_F1];
  473.                 nfCurrentKeyStatus[nfKeyCode_F1]     =   true;
  474.                 break;
  475.             case ALLEGRO_KEY_F2:
  476.                 nfPreviousKeyStatus[nfKeyCode_F2]    =   nfCurrentKeyStatus[nfKeyCode_F2];
  477.                 nfCurrentKeyStatus[nfKeyCode_F2]     =   true;
  478.                 break;
  479.             case ALLEGRO_KEY_F3:
  480.                 nfPreviousKeyStatus[nfKeyCode_F3]    =   nfCurrentKeyStatus[nfKeyCode_F3];
  481.                 nfCurrentKeyStatus[nfKeyCode_F3]     =   true;
  482.                 break;
  483.             case ALLEGRO_KEY_F4:
  484.                 nfPreviousKeyStatus[nfKeyCode_F4]    =   nfCurrentKeyStatus[nfKeyCode_F4];
  485.                 nfCurrentKeyStatus[nfKeyCode_F4]     =   true;
  486.                 break;
  487.             case ALLEGRO_KEY_F5:
  488.                 nfPreviousKeyStatus[nfKeyCode_F5]    =   nfCurrentKeyStatus[nfKeyCode_F5];
  489.                 nfCurrentKeyStatus[nfKeyCode_F5]     =   true;
  490.                 break;
  491.             case ALLEGRO_KEY_F6:
  492.                 nfPreviousKeyStatus[nfKeyCode_F6]    =   nfCurrentKeyStatus[nfKeyCode_F6];
  493.                 nfCurrentKeyStatus[nfKeyCode_F6]     =   true;
  494.                 break;
  495.             case ALLEGRO_KEY_F7:
  496.                 nfPreviousKeyStatus[nfKeyCode_F7]    =   nfCurrentKeyStatus[nfKeyCode_F7];
  497.                 nfCurrentKeyStatus[nfKeyCode_F7]     =   true;
  498.                 break;
  499.             case ALLEGRO_KEY_F8:
  500.                 nfPreviousKeyStatus[nfKeyCode_F8]    =   nfCurrentKeyStatus[nfKeyCode_F8];
  501.                 nfCurrentKeyStatus[nfKeyCode_F8]     =   true;
  502.                 break;
  503.             case ALLEGRO_KEY_F9:
  504.                 nfPreviousKeyStatus[nfKeyCode_F9]    =   nfCurrentKeyStatus[nfKeyCode_F9];
  505.                 nfCurrentKeyStatus[nfKeyCode_F9]     =   true;
  506.                 break;
  507.             case ALLEGRO_KEY_F10:
  508.                 nfPreviousKeyStatus[nfKeyCode_F10]    =   nfCurrentKeyStatus[nfKeyCode_F10];
  509.                 nfCurrentKeyStatus[nfKeyCode_F10]     =   true;
  510.                 break;
  511.             case ALLEGRO_KEY_F11:
  512.                 nfPreviousKeyStatus[nfKeyCode_F11]    =   nfCurrentKeyStatus[nfKeyCode_F11];
  513.                 nfCurrentKeyStatus[nfKeyCode_F11]     =   true;
  514.                 break;
  515.             case ALLEGRO_KEY_F12:
  516.                 nfPreviousKeyStatus[nfKeyCode_F12]    =   nfCurrentKeyStatus[nfKeyCode_F12];
  517.                 nfCurrentKeyStatus[nfKeyCode_F12]     =   true;
  518.                 break;
  519.             case ALLEGRO_KEY_ESCAPE:
  520.                 nfPreviousKeyStatus[nfKeyCode_ESCAPE]    =   nfCurrentKeyStatus[nfKeyCode_ESCAPE];
  521.                 nfCurrentKeyStatus[nfKeyCode_ESCAPE]     =   true;
  522.                 break;
  523.             case ALLEGRO_KEY_TILDE:
  524.                 nfPreviousKeyStatus[nfKeyCode_TILDE]    =   nfCurrentKeyStatus[nfKeyCode_TILDE];
  525.                 nfCurrentKeyStatus[nfKeyCode_TILDE]     =   true;
  526.                 break;
  527.             case ALLEGRO_KEY_MINUS:
  528.                 nfPreviousKeyStatus[nfKeyCode_MINUS]    =   nfCurrentKeyStatus[nfKeyCode_MINUS];
  529.                 nfCurrentKeyStatus[nfKeyCode_MINUS]     =   true;
  530.                 break;
  531.             case ALLEGRO_KEY_EQUALS:
  532.                 nfPreviousKeyStatus[nfKeyCode_EQUALS]    =   nfCurrentKeyStatus[nfKeyCode_EQUALS];
  533.                 nfCurrentKeyStatus[nfKeyCode_EQUALS]     =   true;
  534.                 break;
  535.             case ALLEGRO_KEY_BACKSPACE:
  536.                 nfPreviousKeyStatus[nfKeyCode_BACKSPACE]    =   nfCurrentKeyStatus[nfKeyCode_BACKSPACE];
  537.                 nfCurrentKeyStatus[nfKeyCode_BACKSPACE]     =   true;
  538.                 break;
  539.             case ALLEGRO_KEY_TAB:
  540.                 nfPreviousKeyStatus[nfKeyCode_TAB]    =   nfCurrentKeyStatus[nfKeyCode_TAB];
  541.                 nfCurrentKeyStatus[nfKeyCode_TAB]     =   true;
  542.                 break;
  543.             case ALLEGRO_KEY_OPENBRACE:
  544.                 nfPreviousKeyStatus[nfKeyCode_OPENBRACE]    =   nfCurrentKeyStatus[nfKeyCode_OPENBRACE];
  545.                 nfCurrentKeyStatus[nfKeyCode_OPENBRACE]     =   true;
  546.                 break;
  547.             case ALLEGRO_KEY_CLOSEBRACE:
  548.                 nfPreviousKeyStatus[nfKeyCode_CLOSEBRACE]    =   nfCurrentKeyStatus[nfKeyCode_CLOSEBRACE];
  549.                 nfCurrentKeyStatus[nfKeyCode_CLOSEBRACE]     =   true;
  550.                 break;
  551.             case ALLEGRO_KEY_ENTER:
  552.                 nfPreviousKeyStatus[nfKeyCode_ENTER]    =   nfCurrentKeyStatus[nfKeyCode_ENTER];
  553.                 nfCurrentKeyStatus[nfKeyCode_ENTER]     =   true;
  554.                 break;
  555.             case ALLEGRO_KEY_SEMICOLON:
  556.                 nfPreviousKeyStatus[nfKeyCode_SEMICOLON]    =   nfCurrentKeyStatus[nfKeyCode_SEMICOLON];
  557.                 nfCurrentKeyStatus[nfKeyCode_SEMICOLON]     =   true;
  558.                 break;
  559.             case ALLEGRO_KEY_QUOTE:
  560.                 nfPreviousKeyStatus[nfKeyCode_QUOTE]    =   nfCurrentKeyStatus[nfKeyCode_QUOTE];
  561.                 nfCurrentKeyStatus[nfKeyCode_QUOTE]     =   true;
  562.                 break;
  563.             case ALLEGRO_KEY_BACKSLASH:
  564.                 nfPreviousKeyStatus[nfKeyCode_BACKSLASH]    =   nfCurrentKeyStatus[nfKeyCode_BACKSLASH];
  565.                 nfCurrentKeyStatus[nfKeyCode_BACKSLASH]     =   true;
  566.                 break;
  567.             case ALLEGRO_KEY_BACKSLASH2:
  568.                 nfPreviousKeyStatus[nfKeyCode_BACKSLASH2]    =   nfCurrentKeyStatus[nfKeyCode_BACKSLASH2];
  569.                 nfCurrentKeyStatus[nfKeyCode_BACKSLASH2]     =   true;
  570.                 break;
  571.             case ALLEGRO_KEY_COMMA:
  572.                 nfPreviousKeyStatus[nfKeyCode_COMMA]    =   nfCurrentKeyStatus[nfKeyCode_COMMA];
  573.                 nfCurrentKeyStatus[nfKeyCode_COMMA]     =   true;
  574.                 break;
  575.             case ALLEGRO_KEY_FULLSTOP:
  576.                 nfPreviousKeyStatus[nfKeyCode_FULLSTOP]    =   nfCurrentKeyStatus[nfKeyCode_FULLSTOP];
  577.                 nfCurrentKeyStatus[nfKeyCode_FULLSTOP]     =   true;
  578.                 break;
  579.             case ALLEGRO_KEY_SLASH:
  580.                 nfPreviousKeyStatus[nfKeyCode_SLASH]    =   nfCurrentKeyStatus[nfKeyCode_SLASH];
  581.                 nfCurrentKeyStatus[nfKeyCode_SLASH]     =   true;
  582.                 break;
  583.             case ALLEGRO_KEY_SPACE:
  584.                 nfPreviousKeyStatus[nfKeyCode_SPACE]    =   nfCurrentKeyStatus[nfKeyCode_SPACE];
  585.                 nfCurrentKeyStatus[nfKeyCode_SPACE]     =   true;
  586.                 break;
  587.             case ALLEGRO_KEY_INSERT:
  588.                 nfPreviousKeyStatus[nfKeyCode_INSERT]    =   nfCurrentKeyStatus[nfKeyCode_INSERT];
  589.                 nfCurrentKeyStatus[nfKeyCode_INSERT]     =   true;
  590.                 break;
  591.             case ALLEGRO_KEY_DELETE:
  592.                 nfPreviousKeyStatus[nfKeyCode_DELETE]    =   nfCurrentKeyStatus[nfKeyCode_DELETE];
  593.                 nfCurrentKeyStatus[nfKeyCode_DELETE]     =   true;
  594.                 break;
  595.             case ALLEGRO_KEY_HOME:
  596.                 nfPreviousKeyStatus[nfKeyCode_HOME]    =   nfCurrentKeyStatus[nfKeyCode_HOME];
  597.                 nfCurrentKeyStatus[nfKeyCode_HOME]     =   true;
  598.                 break;
  599.             case ALLEGRO_KEY_END:
  600.                 nfPreviousKeyStatus[nfKeyCode_END]    =   nfCurrentKeyStatus[nfKeyCode_END];
  601.                 nfCurrentKeyStatus[nfKeyCode_END]     =   true;
  602.                 break;
  603.             case ALLEGRO_KEY_PGUP:
  604.                 nfPreviousKeyStatus[nfKeyCode_PAGEUP]    =   nfCurrentKeyStatus[nfKeyCode_PAGEUP];
  605.                 nfCurrentKeyStatus[nfKeyCode_PAGEUP]     =   true;
  606.                 break;
  607.             case ALLEGRO_KEY_PGDN:
  608.                 nfPreviousKeyStatus[nfKeyCode_PAGEDOWN]    =   nfCurrentKeyStatus[nfKeyCode_PAGEDOWN];
  609.                 nfCurrentKeyStatus[nfKeyCode_PAGEDOWN]     =   true;
  610.                 break;
  611.             case ALLEGRO_KEY_LEFT:
  612.                 nfPreviousKeyStatus[nfKeyCode_LEFT]    =   nfCurrentKeyStatus[nfKeyCode_LEFT];
  613.                 nfCurrentKeyStatus[nfKeyCode_LEFT]     =   true;
  614.                 break;
  615.             case ALLEGRO_KEY_RIGHT:
  616.                 nfPreviousKeyStatus[nfKeyCode_RIGHT]    =   nfCurrentKeyStatus[nfKeyCode_RIGHT];
  617.                 nfCurrentKeyStatus[nfKeyCode_RIGHT]     =   true;
  618.                 break;
  619.             case ALLEGRO_KEY_UP:
  620.                 nfPreviousKeyStatus[nfKeyCode_UP]    =   nfCurrentKeyStatus[nfKeyCode_UP];
  621.                 nfCurrentKeyStatus[nfKeyCode_UP]     =   true;
  622.                 break;
  623.             case ALLEGRO_KEY_DOWN:
  624.                 nfPreviousKeyStatus[nfKeyCode_DOWN]    =   nfCurrentKeyStatus[nfKeyCode_DOWN];
  625.                 nfCurrentKeyStatus[nfKeyCode_DOWN]     =   true;
  626.                 break;
  627.             case ALLEGRO_KEY_PAD_SLASH:
  628.                 nfPreviousKeyStatus[nfKeyCode_PADSLASH]    =   nfCurrentKeyStatus[nfKeyCode_PADSLASH];
  629.                 nfCurrentKeyStatus[nfKeyCode_PADSLASH]     =   true;
  630.                 break;
  631.             case ALLEGRO_KEY_PAD_ASTERISK:
  632.                 nfPreviousKeyStatus[nfKeyCode_PADASTERISK]    =   nfCurrentKeyStatus[nfKeyCode_PADASTERISK];
  633.                 nfCurrentKeyStatus[nfKeyCode_PADASTERISK]     =   true;
  634.                 break;
  635.             case ALLEGRO_KEY_PAD_MINUS:
  636.                 nfPreviousKeyStatus[nfKeyCode_PADMINUS]    =   nfCurrentKeyStatus[nfKeyCode_PADMINUS];
  637.                 nfCurrentKeyStatus[nfKeyCode_PADMINUS]     =   true;
  638.                 break;
  639.             case ALLEGRO_KEY_PAD_PLUS:
  640.                 nfPreviousKeyStatus[nfKeyCode_PADPLUS]    =   nfCurrentKeyStatus[nfKeyCode_PADPLUS];
  641.                 nfCurrentKeyStatus[nfKeyCode_PADPLUS]     =   true;
  642.                 break;
  643.             case ALLEGRO_KEY_PAD_DELETE:
  644.                 nfPreviousKeyStatus[nfKeyCode_PADDELETE]    =   nfCurrentKeyStatus[nfKeyCode_PADDELETE];
  645.                 nfCurrentKeyStatus[nfKeyCode_PADDELETE]     =   true;
  646.                 break;
  647.             case ALLEGRO_KEY_PAD_ENTER:
  648.                 nfPreviousKeyStatus[nfKeyCode_PADENTER]    =   nfCurrentKeyStatus[nfKeyCode_PADENTER];
  649.                 nfCurrentKeyStatus[nfKeyCode_PADENTER]     =   true;
  650.                 break;
  651.             case ALLEGRO_KEY_PRINTSCREEN:
  652.                 nfPreviousKeyStatus[nfKeyCode_PRINTSCREEN]    =   nfCurrentKeyStatus[nfKeyCode_PRINTSCREEN];
  653.                 nfCurrentKeyStatus[nfKeyCode_PRINTSCREEN]     =   true;
  654.                 break;
  655.             case ALLEGRO_KEY_PAUSE:
  656.                 nfPreviousKeyStatus[nfKeyCode_PAUSE]    =   nfCurrentKeyStatus[nfKeyCode_PAUSE];
  657.                 nfCurrentKeyStatus[nfKeyCode_PAUSE]     =   true;
  658.                 break;
  659.             case ALLEGRO_KEY_ABNT_C1:
  660.                 nfPreviousKeyStatus[nfKeyCode_ABNTC1]    =   nfCurrentKeyStatus[nfKeyCode_ABNTC1];
  661.                 nfCurrentKeyStatus[nfKeyCode_ABNTC1]     =   true;
  662.                 break;
  663.             case ALLEGRO_KEY_YEN:
  664.                 nfPreviousKeyStatus[nfKeyCode_YEN]    =   nfCurrentKeyStatus[nfKeyCode_YEN];
  665.                 nfCurrentKeyStatus[nfKeyCode_YEN]     =   true;
  666.                 break;
  667.             case ALLEGRO_KEY_KANA:
  668.                 nfPreviousKeyStatus[nfKeyCode_KANA]    =   nfCurrentKeyStatus[nfKeyCode_KANA];
  669.                 nfCurrentKeyStatus[nfKeyCode_KANA]     =   true;
  670.                 break;
  671.             case ALLEGRO_KEY_CONVERT:
  672.                 nfPreviousKeyStatus[nfKeyCode_CONVERT]    =   nfCurrentKeyStatus[nfKeyCode_CONVERT];
  673.                 nfCurrentKeyStatus[nfKeyCode_CONVERT]     =   true;
  674.                 break;
  675.             case ALLEGRO_KEY_NOCONVERT:
  676.                 nfPreviousKeyStatus[nfKeyCode_NOCONVERT]    =   nfCurrentKeyStatus[nfKeyCode_NOCONVERT];
  677.                 nfCurrentKeyStatus[nfKeyCode_NOCONVERT]     =   true;
  678.                 break;
  679.             case ALLEGRO_KEY_AT:
  680.                 nfPreviousKeyStatus[nfKeyCode_AT]    =   nfCurrentKeyStatus[nfKeyCode_AT];
  681.                 nfCurrentKeyStatus[nfKeyCode_AT]     =   true;
  682.                 break;
  683.             case ALLEGRO_KEY_CIRCUMFLEX:
  684.                 nfPreviousKeyStatus[nfKeyCode_CIRCUMFLEX]    =   nfCurrentKeyStatus[nfKeyCode_CIRCUMFLEX];
  685.                 nfCurrentKeyStatus[nfKeyCode_CIRCUMFLEX]     =   true;
  686.                 break;
  687.             case ALLEGRO_KEY_COLON2:
  688.                 nfPreviousKeyStatus[nfKeyCode_COLON2]    =   nfCurrentKeyStatus[nfKeyCode_COLON2];
  689.                 nfCurrentKeyStatus[nfKeyCode_COLON2]     =   true;
  690.                 break;
  691.             case ALLEGRO_KEY_KANJI:
  692.                 nfPreviousKeyStatus[nfKeyCode_KANJI]    =   nfCurrentKeyStatus[nfKeyCode_KANJI];
  693.                 nfCurrentKeyStatus[nfKeyCode_KANJI]     =   true;
  694.                 break;
  695.             case ALLEGRO_KEY_LSHIFT:
  696.                 nfPreviousKeyStatus[nfKeyCode_LEFTSHIFT]    =   nfCurrentKeyStatus[nfKeyCode_LEFTSHIFT];
  697.                 nfCurrentKeyStatus[nfKeyCode_LEFTSHIFT]     =   true;
  698.                 break;
  699.             case ALLEGRO_KEY_RSHIFT:
  700.                 nfPreviousKeyStatus[nfKeyCode_RIGHTSHIFT]    =   nfCurrentKeyStatus[nfKeyCode_RIGHTSHIFT];
  701.                 nfCurrentKeyStatus[nfKeyCode_RIGHTSHIFT]     =   true;
  702.                 break;
  703.             case ALLEGRO_KEY_LCTRL:
  704.                 nfPreviousKeyStatus[nfKeyCode_LEFTCONTROL]    =   nfCurrentKeyStatus[nfKeyCode_LEFTCONTROL];
  705.                 nfCurrentKeyStatus[nfKeyCode_LEFTCONTROL]     =   true;
  706.                 break;
  707.             case ALLEGRO_KEY_RCTRL:
  708.                 nfPreviousKeyStatus[nfKeyCode_RIGHTCONTROL]    =   nfCurrentKeyStatus[nfKeyCode_RIGHTCONTROL];
  709.                 nfCurrentKeyStatus[nfKeyCode_RIGHTCONTROL]     =   true;
  710.                 break;
  711.             case ALLEGRO_KEY_ALT:
  712.                 nfPreviousKeyStatus[nfKeyCode_ALT]    =   nfCurrentKeyStatus[nfKeyCode_ALT];
  713.                 nfCurrentKeyStatus[nfKeyCode_ALT]     =   true;
  714.                 break;
  715.             case ALLEGRO_KEY_ALTGR:
  716.                 nfPreviousKeyStatus[nfKeyCode_ALTGR]    =   nfCurrentKeyStatus[nfKeyCode_ALTGR];
  717.                 nfCurrentKeyStatus[nfKeyCode_ALTGR]     =   true;
  718.                 break;
  719.             case ALLEGRO_KEY_LWIN:
  720.                 nfPreviousKeyStatus[nfKeyCode_LEFTWINDOWS]    =   nfCurrentKeyStatus[nfKeyCode_LEFTWINDOWS];
  721.                 nfCurrentKeyStatus[nfKeyCode_LEFTWINDOWS]     =   true;
  722.                 break;
  723.             case ALLEGRO_KEY_RWIN:
  724.                 nfPreviousKeyStatus[nfKeyCode_RIGHTWINDOWS]    =   nfCurrentKeyStatus[nfKeyCode_RIGHTWINDOWS];
  725.                 nfCurrentKeyStatus[nfKeyCode_RIGHTWINDOWS]     =   true;
  726.                 break;
  727.             case ALLEGRO_KEY_MENU:
  728.                 nfPreviousKeyStatus[nfKeyCode_MENU]    =   nfCurrentKeyStatus[nfKeyCode_MENU];
  729.                 nfCurrentKeyStatus[nfKeyCode_MENU]     =   true;
  730.                 break;
  731.             case ALLEGRO_KEY_SCROLLLOCK:
  732.                 nfPreviousKeyStatus[nfKeyCode_SCROLLLOCK]    =   nfCurrentKeyStatus[nfKeyCode_SCROLLLOCK];
  733.                 nfCurrentKeyStatus[nfKeyCode_SCROLLLOCK]     =   true;
  734.                 break;
  735.             case ALLEGRO_KEY_NUMLOCK:
  736.                 nfPreviousKeyStatus[nfKeyCode_NUMLOCK]    =   nfCurrentKeyStatus[nfKeyCode_NUMLOCK];
  737.                 nfCurrentKeyStatus[nfKeyCode_NUMLOCK]     =   true;
  738.                 break;
  739.             case ALLEGRO_KEY_CAPSLOCK:
  740.                 nfPreviousKeyStatus[nfKeyCode_CAPSLOCK]    =   nfCurrentKeyStatus[nfKeyCode_CAPSLOCK];
  741.                 nfCurrentKeyStatus[nfKeyCode_CAPSLOCK]     =   true;
  742.                 break;
  743.             case ALLEGRO_KEY_PAD_EQUALS:
  744.                 nfPreviousKeyStatus[nfKeyCode_PADEQUALS]    =   nfCurrentKeyStatus[nfKeyCode_PADEQUALS];
  745.                 nfCurrentKeyStatus[nfKeyCode_PADEQUALS]     =   true;
  746.                 break;
  747.             case ALLEGRO_KEY_BACKQUOTE:
  748.                 nfPreviousKeyStatus[nfKeyCode_BACKQUOTE]    =   nfCurrentKeyStatus[nfKeyCode_BACKQUOTE];
  749.                 nfCurrentKeyStatus[nfKeyCode_BACKQUOTE]     =   true;
  750.                 break;
  751.             case ALLEGRO_KEY_SEMICOLON2:
  752.                 nfPreviousKeyStatus[nfKeyCode_SEMICOLON2]    =   nfCurrentKeyStatus[nfKeyCode_SEMICOLON2];
  753.                 nfCurrentKeyStatus[nfKeyCode_SEMICOLON2]     =   true;
  754.                 break;
  755.             case ALLEGRO_KEY_COMMAND:
  756.                 nfPreviousKeyStatus[nfKeyCode_COMMAND]    =   nfCurrentKeyStatus[nfKeyCode_COMMAND];
  757.                 nfCurrentKeyStatus[nfKeyCode_COMMAND]     =   true;
  758.                 break;
  759.         }
  760.     } else if (currentEvent.type == ALLEGRO_EVENT_KEY_UP) {
  761.         switch (currentEvent.keyboard.keycode) {
  762.             case ALLEGRO_KEY_A:
  763.                 nfPreviousKeyStatus[nfKeyCode_A]    =   nfCurrentKeyStatus[nfKeyCode_A];
  764.                 nfCurrentKeyStatus[nfKeyCode_A]     =   false;
  765.                 break;
  766.             case ALLEGRO_KEY_B:
  767.                 nfPreviousKeyStatus[nfKeyCode_B]    =   nfCurrentKeyStatus[nfKeyCode_B];
  768.                 nfCurrentKeyStatus[nfKeyCode_B]     =   false;
  769.                 break;
  770.             case ALLEGRO_KEY_C:
  771.                 nfPreviousKeyStatus[nfKeyCode_C]    =   nfCurrentKeyStatus[nfKeyCode_C];
  772.                 nfCurrentKeyStatus[nfKeyCode_C]     =   false;
  773.                 break;
  774.             case ALLEGRO_KEY_D:
  775.                 nfPreviousKeyStatus[nfKeyCode_D]    =   nfCurrentKeyStatus[nfKeyCode_D];
  776.                 nfCurrentKeyStatus[nfKeyCode_D]     =   false;
  777.                 break;
  778.             case ALLEGRO_KEY_E:
  779.                 nfPreviousKeyStatus[nfKeyCode_E]    =   nfCurrentKeyStatus[nfKeyCode_E];
  780.                 nfCurrentKeyStatus[nfKeyCode_E]     =   false;
  781.                 break;
  782.             case ALLEGRO_KEY_F:
  783.                 nfPreviousKeyStatus[nfKeyCode_F]    =   nfCurrentKeyStatus[nfKeyCode_F];
  784.                 nfCurrentKeyStatus[nfKeyCode_F]     =   false;
  785.                 break;
  786.             case ALLEGRO_KEY_G:
  787.                 nfPreviousKeyStatus[nfKeyCode_G]    =   nfCurrentKeyStatus[nfKeyCode_G];
  788.                 nfCurrentKeyStatus[nfKeyCode_G]     =   false;
  789.                 break;
  790.             case ALLEGRO_KEY_H:
  791.                 nfPreviousKeyStatus[nfKeyCode_H]    =   nfCurrentKeyStatus[nfKeyCode_H];
  792.                 nfCurrentKeyStatus[nfKeyCode_H]     =   false;
  793.                 break;
  794.             case ALLEGRO_KEY_I:
  795.                 nfPreviousKeyStatus[nfKeyCode_I]    =   nfCurrentKeyStatus[nfKeyCode_I];
  796.                 nfCurrentKeyStatus[nfKeyCode_I]     =   false;
  797.                 break;
  798.             case ALLEGRO_KEY_J:
  799.                 nfPreviousKeyStatus[nfKeyCode_J]    =   nfCurrentKeyStatus[nfKeyCode_J];
  800.                 nfCurrentKeyStatus[nfKeyCode_J]     =   false;
  801.                 break;
  802.             case ALLEGRO_KEY_K:
  803.                 nfPreviousKeyStatus[nfKeyCode_K]    =   nfCurrentKeyStatus[nfKeyCode_K];
  804.                 nfCurrentKeyStatus[nfKeyCode_K]     =   false;
  805.                 break;
  806.             case ALLEGRO_KEY_L:
  807.                 nfPreviousKeyStatus[nfKeyCode_L]    =   nfCurrentKeyStatus[nfKeyCode_L];
  808.                 nfCurrentKeyStatus[nfKeyCode_L]     =   false;
  809.                 break;
  810.             case ALLEGRO_KEY_M:
  811.                 nfPreviousKeyStatus[nfKeyCode_M]    =   nfCurrentKeyStatus[nfKeyCode_M];
  812.                 nfCurrentKeyStatus[nfKeyCode_M]     =   false;
  813.                 break;
  814.             case ALLEGRO_KEY_N:
  815.                 nfPreviousKeyStatus[nfKeyCode_N]    =   nfCurrentKeyStatus[nfKeyCode_N];
  816.                 nfCurrentKeyStatus[nfKeyCode_N]     =   false;
  817.                 break;
  818.             case ALLEGRO_KEY_O:
  819.                 nfPreviousKeyStatus[nfKeyCode_O]    =   nfCurrentKeyStatus[nfKeyCode_O];
  820.                 nfCurrentKeyStatus[nfKeyCode_O]     =   false;
  821.                 break;
  822.             case ALLEGRO_KEY_P:
  823.                 nfPreviousKeyStatus[nfKeyCode_P]    =   nfCurrentKeyStatus[nfKeyCode_P];
  824.                 nfCurrentKeyStatus[nfKeyCode_P]     =   false;
  825.                 break;
  826.             case ALLEGRO_KEY_Q:
  827.                 nfPreviousKeyStatus[nfKeyCode_Q]    =   nfCurrentKeyStatus[nfKeyCode_Q];
  828.                 nfCurrentKeyStatus[nfKeyCode_Q]     =   false;
  829.                 break;
  830.             case ALLEGRO_KEY_R:
  831.                 nfPreviousKeyStatus[nfKeyCode_R]    =   nfCurrentKeyStatus[nfKeyCode_R];
  832.                 nfCurrentKeyStatus[nfKeyCode_R]     =   false;
  833.                 break;
  834.             case ALLEGRO_KEY_S:
  835.                 nfPreviousKeyStatus[nfKeyCode_S]    =   nfCurrentKeyStatus[nfKeyCode_S];
  836.                 nfCurrentKeyStatus[nfKeyCode_S]     =   false;
  837.                 break;
  838.             case ALLEGRO_KEY_T:
  839.                 nfPreviousKeyStatus[nfKeyCode_T]    =   nfCurrentKeyStatus[nfKeyCode_T];
  840.                 nfCurrentKeyStatus[nfKeyCode_T]     =   false;
  841.                 break;
  842.             case ALLEGRO_KEY_U:
  843.                 nfPreviousKeyStatus[nfKeyCode_U]    =   nfCurrentKeyStatus[nfKeyCode_U];
  844.                 nfCurrentKeyStatus[nfKeyCode_U]     =   false;
  845.                 break;
  846.             case ALLEGRO_KEY_V:
  847.                 nfPreviousKeyStatus[nfKeyCode_V]    =   nfCurrentKeyStatus[nfKeyCode_V];
  848.                 nfCurrentKeyStatus[nfKeyCode_V]     =   false;
  849.                 break;
  850.             case ALLEGRO_KEY_W:
  851.                 nfPreviousKeyStatus[nfKeyCode_W]    =   nfCurrentKeyStatus[nfKeyCode_W];
  852.                 nfCurrentKeyStatus[nfKeyCode_W]     =   false;
  853.                 break;
  854.             case ALLEGRO_KEY_X:
  855.                 nfPreviousKeyStatus[nfKeyCode_X]    =   nfCurrentKeyStatus[nfKeyCode_X];
  856.                 nfCurrentKeyStatus[nfKeyCode_X]     =   false;
  857.                 break;
  858.             case ALLEGRO_KEY_Y:
  859.                 nfPreviousKeyStatus[nfKeyCode_Y]    =   nfCurrentKeyStatus[nfKeyCode_Y];
  860.                 nfCurrentKeyStatus[nfKeyCode_Y]     =   false;
  861.                 break;
  862.             case ALLEGRO_KEY_Z:
  863.                 nfPreviousKeyStatus[nfKeyCode_Z]    =   nfCurrentKeyStatus[nfKeyCode_Z];
  864.                 nfCurrentKeyStatus[nfKeyCode_Z]     =   false;
  865.                 break;
  866.             case ALLEGRO_KEY_0:
  867.                 nfPreviousKeyStatus[nfKeyCode_0]    =   nfCurrentKeyStatus[nfKeyCode_0];
  868.                 nfCurrentKeyStatus[nfKeyCode_0]     =   false;
  869.                 break;
  870.             case ALLEGRO_KEY_1:
  871.                 nfPreviousKeyStatus[nfKeyCode_1]    =   nfCurrentKeyStatus[nfKeyCode_1];
  872.                 nfCurrentKeyStatus[nfKeyCode_1]     =   false;
  873.                 break;
  874.             case ALLEGRO_KEY_2:
  875.                 nfPreviousKeyStatus[nfKeyCode_2]    =   nfCurrentKeyStatus[nfKeyCode_2];
  876.                 nfCurrentKeyStatus[nfKeyCode_2]     =   false;
  877.                 break;
  878.             case ALLEGRO_KEY_3:
  879.                 nfPreviousKeyStatus[nfKeyCode_3]    =   nfCurrentKeyStatus[nfKeyCode_3];
  880.                 nfCurrentKeyStatus[nfKeyCode_3]     =   false;
  881.                 break;
  882.             case ALLEGRO_KEY_4:
  883.                 nfPreviousKeyStatus[nfKeyCode_4]    =   nfCurrentKeyStatus[nfKeyCode_4];
  884.                 nfCurrentKeyStatus[nfKeyCode_4]     =   false;
  885.                 break;
  886.             case ALLEGRO_KEY_5:
  887.                 nfPreviousKeyStatus[nfKeyCode_5]    =   nfCurrentKeyStatus[nfKeyCode_5];
  888.                 nfCurrentKeyStatus[nfKeyCode_5]     =   false;
  889.                 break;
  890.             case ALLEGRO_KEY_6:
  891.                 nfPreviousKeyStatus[nfKeyCode_6]    =   nfCurrentKeyStatus[nfKeyCode_6];
  892.                 nfCurrentKeyStatus[nfKeyCode_6]     =   false;
  893.                 break;
  894.             case ALLEGRO_KEY_7:
  895.                 nfPreviousKeyStatus[nfKeyCode_7]    =   nfCurrentKeyStatus[nfKeyCode_7];
  896.                 nfCurrentKeyStatus[nfKeyCode_7]     =   false;
  897.                 break;
  898.             case ALLEGRO_KEY_8:
  899.                 nfPreviousKeyStatus[nfKeyCode_8]    =   nfCurrentKeyStatus[nfKeyCode_8];
  900.                 nfCurrentKeyStatus[nfKeyCode_8]     =   false;
  901.                 break;
  902.             case ALLEGRO_KEY_9:
  903.                 nfPreviousKeyStatus[nfKeyCode_9]    =   nfCurrentKeyStatus[nfKeyCode_9];
  904.                 nfCurrentKeyStatus[nfKeyCode_9]     =   false;
  905.                 break;
  906.             case ALLEGRO_KEY_PAD_0:
  907.                 nfPreviousKeyStatus[nfKeyCode_PAD0]    =   nfCurrentKeyStatus[nfKeyCode_PAD0];
  908.                 nfCurrentKeyStatus[nfKeyCode_PAD0]     =   false;
  909.                 break;
  910.             case ALLEGRO_KEY_PAD_1:
  911.                 nfPreviousKeyStatus[nfKeyCode_PAD1]    =   nfCurrentKeyStatus[nfKeyCode_PAD1];
  912.                 nfCurrentKeyStatus[nfKeyCode_PAD1]     =   false;
  913.                 break;
  914.             case ALLEGRO_KEY_PAD_2:
  915.                 nfPreviousKeyStatus[nfKeyCode_PAD2]    =   nfCurrentKeyStatus[nfKeyCode_PAD2];
  916.                 nfCurrentKeyStatus[nfKeyCode_PAD2]     =   false;
  917.                 break;
  918.             case ALLEGRO_KEY_PAD_3:
  919.                 nfPreviousKeyStatus[nfKeyCode_PAD3]    =   nfCurrentKeyStatus[nfKeyCode_PAD3];
  920.                 nfCurrentKeyStatus[nfKeyCode_PAD3]     =   false;
  921.                 break;
  922.             case ALLEGRO_KEY_PAD_4:
  923.                 nfPreviousKeyStatus[nfKeyCode_PAD4]    =   nfCurrentKeyStatus[nfKeyCode_PAD4];
  924.                 nfCurrentKeyStatus[nfKeyCode_PAD4]     =   false;
  925.                 break;
  926.             case ALLEGRO_KEY_PAD_5:
  927.                 nfPreviousKeyStatus[nfKeyCode_PAD5]    =   nfCurrentKeyStatus[nfKeyCode_PAD5];
  928.                 nfCurrentKeyStatus[nfKeyCode_PAD5]     =   false;
  929.                 break;
  930.             case ALLEGRO_KEY_PAD_6:
  931.                 nfPreviousKeyStatus[nfKeyCode_PAD6]    =   nfCurrentKeyStatus[nfKeyCode_PAD6];
  932.                 nfCurrentKeyStatus[nfKeyCode_PAD6]     =   false;
  933.                 break;
  934.             case ALLEGRO_KEY_PAD_7:
  935.                 nfPreviousKeyStatus[nfKeyCode_PAD7]    =   nfCurrentKeyStatus[nfKeyCode_PAD7];
  936.                 nfCurrentKeyStatus[nfKeyCode_PAD7]     =   false;
  937.                 break;
  938.             case ALLEGRO_KEY_PAD_8:
  939.                 nfPreviousKeyStatus[nfKeyCode_PAD8]    =   nfCurrentKeyStatus[nfKeyCode_PAD8];
  940.                 nfCurrentKeyStatus[nfKeyCode_PAD8]     =   false;
  941.                 break;
  942.             case ALLEGRO_KEY_PAD_9:
  943.                 nfPreviousKeyStatus[nfKeyCode_PAD9]    =   nfCurrentKeyStatus[nfKeyCode_PAD9];
  944.                 nfCurrentKeyStatus[nfKeyCode_PAD9]     =   false;
  945.                 break;
  946.             case ALLEGRO_KEY_F1:
  947.                 nfPreviousKeyStatus[nfKeyCode_F1]    =   nfCurrentKeyStatus[nfKeyCode_F1];
  948.                 nfCurrentKeyStatus[nfKeyCode_F1]     =   false;
  949.                 break;
  950.             case ALLEGRO_KEY_F2:
  951.                 nfPreviousKeyStatus[nfKeyCode_F2]    =   nfCurrentKeyStatus[nfKeyCode_F2];
  952.                 nfCurrentKeyStatus[nfKeyCode_F2]     =   false;
  953.                 break;
  954.             case ALLEGRO_KEY_F3:
  955.                 nfPreviousKeyStatus[nfKeyCode_F3]    =   nfCurrentKeyStatus[nfKeyCode_F3];
  956.                 nfCurrentKeyStatus[nfKeyCode_F3]     =   false;
  957.                 break;
  958.             case ALLEGRO_KEY_F4:
  959.                 nfPreviousKeyStatus[nfKeyCode_F4]    =   nfCurrentKeyStatus[nfKeyCode_F4];
  960.                 nfCurrentKeyStatus[nfKeyCode_F4]     =   false;
  961.                 break;
  962.             case ALLEGRO_KEY_F5:
  963.                 nfPreviousKeyStatus[nfKeyCode_F5]    =   nfCurrentKeyStatus[nfKeyCode_F5];
  964.                 nfCurrentKeyStatus[nfKeyCode_F5]     =   false;
  965.                 break;
  966.             case ALLEGRO_KEY_F6:
  967.                 nfPreviousKeyStatus[nfKeyCode_F6]    =   nfCurrentKeyStatus[nfKeyCode_F6];
  968.                 nfCurrentKeyStatus[nfKeyCode_F6]     =   false;
  969.                 break;
  970.             case ALLEGRO_KEY_F7:
  971.                 nfPreviousKeyStatus[nfKeyCode_F7]    =   nfCurrentKeyStatus[nfKeyCode_F7];
  972.                 nfCurrentKeyStatus[nfKeyCode_F7]     =   false;
  973.                 break;
  974.             case ALLEGRO_KEY_F8:
  975.                 nfPreviousKeyStatus[nfKeyCode_F8]    =   nfCurrentKeyStatus[nfKeyCode_F8];
  976.                 nfCurrentKeyStatus[nfKeyCode_F8]     =   false;
  977.                 break;
  978.             case ALLEGRO_KEY_F9:
  979.                 nfPreviousKeyStatus[nfKeyCode_F9]    =   nfCurrentKeyStatus[nfKeyCode_F9];
  980.                 nfCurrentKeyStatus[nfKeyCode_F9]     =   false;
  981.                 break;
  982.             case ALLEGRO_KEY_F10:
  983.                 nfPreviousKeyStatus[nfKeyCode_F10]    =   nfCurrentKeyStatus[nfKeyCode_F10];
  984.                 nfCurrentKeyStatus[nfKeyCode_F10]     =   false;
  985.                 break;
  986.             case ALLEGRO_KEY_F11:
  987.                 nfPreviousKeyStatus[nfKeyCode_F11]    =   nfCurrentKeyStatus[nfKeyCode_F11];
  988.                 nfCurrentKeyStatus[nfKeyCode_F11]     =   false;
  989.                 if (display.f11SwitchWindowMode) {
  990.                     if (nfPreviousKeyStatus[nfKeyCode_F11]) {
  991.                         if (display.isFullscreen) {
  992.                             al_set_new_display_flags(ALLEGRO_WINDOWED);
  993.                             al_destroy_display(display.display);
  994.                             display.display         =   al_create_display(display.windowedWidth, display.windowedHeight);
  995.                             display.isFullscreen    = false;
  996.                             display.width           =   display.windowedWidth;
  997.                             display.height          =   display.windowedHeight;
  998.                             al_set_window_title(display.display, display.title.c_str());
  999.                             al_register_event_source(display.eventQueue, al_get_display_event_source(display.display));
  1000.                             if (display.cursorVisible) {
  1001.                                 al_show_mouse_cursor(display.display);
  1002.                             } else {
  1003.                                 al_hide_mouse_cursor(display.display);
  1004.                             }
  1005.                         } else {
  1006.                             al_set_new_display_flags(ALLEGRO_FULLSCREEN);
  1007.                             al_destroy_display(display.display);
  1008.                             display.display         =   al_create_display(display.fullscreenWidth, display.fullscreenHeight);
  1009.                             display.isFullscreen    = true;
  1010.                             display.width           =   display.fullscreenWidth;
  1011.                             display.height          =   display.fullscreenHeight;
  1012.                             al_set_window_title(display.display, display.title.c_str());
  1013.                             al_register_event_source(display.eventQueue, al_get_display_event_source(display.display));
  1014.                             if (display.cursorVisible) {
  1015.                                 al_show_mouse_cursor(display.display);
  1016.                             } else {
  1017.                                 al_hide_mouse_cursor(display.display);
  1018.                             }
  1019.                         }
  1020.                     }
  1021.                 }
  1022.                 break;
  1023.             case ALLEGRO_KEY_F12:
  1024.                 nfPreviousKeyStatus[nfKeyCode_F12]    =   nfCurrentKeyStatus[nfKeyCode_F12];
  1025.                 nfCurrentKeyStatus[nfKeyCode_F12]     =   false;
  1026.                 break;
  1027.             case ALLEGRO_KEY_ESCAPE:
  1028.                 nfPreviousKeyStatus[nfKeyCode_ESCAPE]    =   nfCurrentKeyStatus[nfKeyCode_ESCAPE];
  1029.                 nfCurrentKeyStatus[nfKeyCode_ESCAPE]     =   false;
  1030.                 if (display.escExit) {
  1031.                     if (nfPreviousKeyStatus[nfKeyCode_ESCAPE]) {
  1032.                         display.doExit = true;
  1033.                     }
  1034.                 }
  1035.                 break;
  1036.             case ALLEGRO_KEY_TILDE:
  1037.                 nfPreviousKeyStatus[nfKeyCode_TILDE]    =   nfCurrentKeyStatus[nfKeyCode_TILDE];
  1038.                 nfCurrentKeyStatus[nfKeyCode_TILDE]     =   false;
  1039.                 break;
  1040.             case ALLEGRO_KEY_MINUS:
  1041.                 nfPreviousKeyStatus[nfKeyCode_MINUS]    =   nfCurrentKeyStatus[nfKeyCode_MINUS];
  1042.                 nfCurrentKeyStatus[nfKeyCode_MINUS]     =   false;
  1043.                 break;
  1044.             case ALLEGRO_KEY_EQUALS:
  1045.                 nfPreviousKeyStatus[nfKeyCode_EQUALS]    =   nfCurrentKeyStatus[nfKeyCode_EQUALS];
  1046.                 nfCurrentKeyStatus[nfKeyCode_EQUALS]     =   false;
  1047.                 break;
  1048.             case ALLEGRO_KEY_BACKSPACE:
  1049.                 nfPreviousKeyStatus[nfKeyCode_BACKSPACE]    =   nfCurrentKeyStatus[nfKeyCode_BACKSPACE];
  1050.                 nfCurrentKeyStatus[nfKeyCode_BACKSPACE]     =   false;
  1051.                 break;
  1052.             case ALLEGRO_KEY_TAB:
  1053.                 nfPreviousKeyStatus[nfKeyCode_TAB]    =   nfCurrentKeyStatus[nfKeyCode_TAB];
  1054.                 nfCurrentKeyStatus[nfKeyCode_TAB]     =   false;
  1055.                 break;
  1056.             case ALLEGRO_KEY_OPENBRACE:
  1057.                 nfPreviousKeyStatus[nfKeyCode_OPENBRACE]    =   nfCurrentKeyStatus[nfKeyCode_OPENBRACE];
  1058.                 nfCurrentKeyStatus[nfKeyCode_OPENBRACE]     =   false;
  1059.                 break;
  1060.             case ALLEGRO_KEY_CLOSEBRACE:
  1061.                 nfPreviousKeyStatus[nfKeyCode_CLOSEBRACE]    =   nfCurrentKeyStatus[nfKeyCode_CLOSEBRACE];
  1062.                 nfCurrentKeyStatus[nfKeyCode_CLOSEBRACE]     =   false;
  1063.                 break;
  1064.             case ALLEGRO_KEY_ENTER:
  1065.                 nfPreviousKeyStatus[nfKeyCode_ENTER]    =   nfCurrentKeyStatus[nfKeyCode_ENTER];
  1066.                 nfCurrentKeyStatus[nfKeyCode_ENTER]     =   false;
  1067.                 break;
  1068.             case ALLEGRO_KEY_SEMICOLON:
  1069.                 nfPreviousKeyStatus[nfKeyCode_SEMICOLON]    =   nfCurrentKeyStatus[nfKeyCode_SEMICOLON];
  1070.                 nfCurrentKeyStatus[nfKeyCode_SEMICOLON]     =   false;
  1071.                 break;
  1072.             case ALLEGRO_KEY_QUOTE:
  1073.                 nfPreviousKeyStatus[nfKeyCode_QUOTE]    =   nfCurrentKeyStatus[nfKeyCode_QUOTE];
  1074.                 nfCurrentKeyStatus[nfKeyCode_QUOTE]     =   false;
  1075.                 break;
  1076.             case ALLEGRO_KEY_BACKSLASH:
  1077.                 nfPreviousKeyStatus[nfKeyCode_BACKSLASH]    =   nfCurrentKeyStatus[nfKeyCode_BACKSLASH];
  1078.                 nfCurrentKeyStatus[nfKeyCode_BACKSLASH]     =   false;
  1079.                 break;
  1080.             case ALLEGRO_KEY_BACKSLASH2:
  1081.                 nfPreviousKeyStatus[nfKeyCode_BACKSLASH2]    =   nfCurrentKeyStatus[nfKeyCode_BACKSLASH2];
  1082.                 nfCurrentKeyStatus[nfKeyCode_BACKSLASH2]     =   false;
  1083.                 break;
  1084.             case ALLEGRO_KEY_COMMA:
  1085.                 nfPreviousKeyStatus[nfKeyCode_COMMA]    =   nfCurrentKeyStatus[nfKeyCode_COMMA];
  1086.                 nfCurrentKeyStatus[nfKeyCode_COMMA]     =   false;
  1087.                 break;
  1088.             case ALLEGRO_KEY_FULLSTOP:
  1089.                 nfPreviousKeyStatus[nfKeyCode_FULLSTOP]    =   nfCurrentKeyStatus[nfKeyCode_FULLSTOP];
  1090.                 nfCurrentKeyStatus[nfKeyCode_FULLSTOP]     =   false;
  1091.                 break;
  1092.             case ALLEGRO_KEY_SLASH:
  1093.                 nfPreviousKeyStatus[nfKeyCode_SLASH]    =   nfCurrentKeyStatus[nfKeyCode_SLASH];
  1094.                 nfCurrentKeyStatus[nfKeyCode_SLASH]     =   false;
  1095.                 break;
  1096.             case ALLEGRO_KEY_SPACE:
  1097.                 nfPreviousKeyStatus[nfKeyCode_SPACE]    =   nfCurrentKeyStatus[nfKeyCode_SPACE];
  1098.                 nfCurrentKeyStatus[nfKeyCode_SPACE]     =   false;
  1099.                 break;
  1100.             case ALLEGRO_KEY_INSERT:
  1101.                 nfPreviousKeyStatus[nfKeyCode_INSERT]    =   nfCurrentKeyStatus[nfKeyCode_INSERT];
  1102.                 nfCurrentKeyStatus[nfKeyCode_INSERT]     =   false;
  1103.                 break;
  1104.             case ALLEGRO_KEY_DELETE:
  1105.                 nfPreviousKeyStatus[nfKeyCode_DELETE]    =   nfCurrentKeyStatus[nfKeyCode_DELETE];
  1106.                 nfCurrentKeyStatus[nfKeyCode_DELETE]     =   false;
  1107.                 break;
  1108.             case ALLEGRO_KEY_HOME:
  1109.                 nfPreviousKeyStatus[nfKeyCode_HOME]    =   nfCurrentKeyStatus[nfKeyCode_HOME];
  1110.                 nfCurrentKeyStatus[nfKeyCode_HOME]     =   false;
  1111.                 break;
  1112.             case ALLEGRO_KEY_END:
  1113.                 nfPreviousKeyStatus[nfKeyCode_END]    =   nfCurrentKeyStatus[nfKeyCode_END];
  1114.                 nfCurrentKeyStatus[nfKeyCode_END]     =   false;
  1115.                 break;
  1116.             case ALLEGRO_KEY_PGUP:
  1117.                 nfPreviousKeyStatus[nfKeyCode_PAGEUP]    =   nfCurrentKeyStatus[nfKeyCode_PAGEUP];
  1118.                 nfCurrentKeyStatus[nfKeyCode_PAGEUP]     =   false;
  1119.                 break;
  1120.             case ALLEGRO_KEY_PGDN:
  1121.                 nfPreviousKeyStatus[nfKeyCode_PAGEDOWN]    =   nfCurrentKeyStatus[nfKeyCode_PAGEDOWN];
  1122.                 nfCurrentKeyStatus[nfKeyCode_PAGEDOWN]     =   false;
  1123.                 break;
  1124.             case ALLEGRO_KEY_LEFT:
  1125.                 nfPreviousKeyStatus[nfKeyCode_LEFT]    =   nfCurrentKeyStatus[nfKeyCode_LEFT];
  1126.                 nfCurrentKeyStatus[nfKeyCode_LEFT]     =   false;
  1127.                 break;
  1128.             case ALLEGRO_KEY_RIGHT:
  1129.                 nfPreviousKeyStatus[nfKeyCode_RIGHT]    =   nfCurrentKeyStatus[nfKeyCode_RIGHT];
  1130.                 nfCurrentKeyStatus[nfKeyCode_RIGHT]     =   false;
  1131.                 break;
  1132.             case ALLEGRO_KEY_UP:
  1133.                 nfPreviousKeyStatus[nfKeyCode_UP]    =   nfCurrentKeyStatus[nfKeyCode_UP];
  1134.                 nfCurrentKeyStatus[nfKeyCode_UP]     =   false;
  1135.                 break;
  1136.             case ALLEGRO_KEY_DOWN:
  1137.                 nfPreviousKeyStatus[nfKeyCode_DOWN]    =   nfCurrentKeyStatus[nfKeyCode_DOWN];
  1138.                 nfCurrentKeyStatus[nfKeyCode_DOWN]     =   false;
  1139.                 break;
  1140.             case ALLEGRO_KEY_PAD_SLASH:
  1141.                 nfPreviousKeyStatus[nfKeyCode_PADSLASH]    =   nfCurrentKeyStatus[nfKeyCode_PADSLASH];
  1142.                 nfCurrentKeyStatus[nfKeyCode_PADSLASH]     =   false;
  1143.                 break;
  1144.             case ALLEGRO_KEY_PAD_ASTERISK:
  1145.                 nfPreviousKeyStatus[nfKeyCode_PADASTERISK]    =   nfCurrentKeyStatus[nfKeyCode_PADASTERISK];
  1146.                 nfCurrentKeyStatus[nfKeyCode_PADASTERISK]     =   false;
  1147.                 break;
  1148.             case ALLEGRO_KEY_PAD_MINUS:
  1149.                 nfPreviousKeyStatus[nfKeyCode_PADMINUS]    =   nfCurrentKeyStatus[nfKeyCode_PADMINUS];
  1150.                 nfCurrentKeyStatus[nfKeyCode_PADMINUS]     =   false;
  1151.                 break;
  1152.             case ALLEGRO_KEY_PAD_PLUS:
  1153.                 nfPreviousKeyStatus[nfKeyCode_PADPLUS]    =   nfCurrentKeyStatus[nfKeyCode_PADPLUS];
  1154.                 nfCurrentKeyStatus[nfKeyCode_PADPLUS]     =   false;
  1155.                 break;
  1156.             case ALLEGRO_KEY_PAD_DELETE:
  1157.                 nfPreviousKeyStatus[nfKeyCode_PADDELETE]    =   nfCurrentKeyStatus[nfKeyCode_PADDELETE];
  1158.                 nfCurrentKeyStatus[nfKeyCode_PADDELETE]     =   false;
  1159.                 break;
  1160.             case ALLEGRO_KEY_PAD_ENTER:
  1161.                 nfPreviousKeyStatus[nfKeyCode_PADENTER]    =   nfCurrentKeyStatus[nfKeyCode_PADENTER];
  1162.                 nfCurrentKeyStatus[nfKeyCode_PADENTER]     =   false;
  1163.                 break;
  1164.             case ALLEGRO_KEY_PRINTSCREEN:
  1165.                 nfPreviousKeyStatus[nfKeyCode_PRINTSCREEN]    =   nfCurrentKeyStatus[nfKeyCode_PRINTSCREEN];
  1166.                 nfCurrentKeyStatus[nfKeyCode_PRINTSCREEN]     =   false;
  1167.                 break;
  1168.             case ALLEGRO_KEY_PAUSE:
  1169.                 nfPreviousKeyStatus[nfKeyCode_PAUSE]    =   nfCurrentKeyStatus[nfKeyCode_PAUSE];
  1170.                 nfCurrentKeyStatus[nfKeyCode_PAUSE]     =   false;
  1171.                 break;
  1172.             case ALLEGRO_KEY_ABNT_C1:
  1173.                 nfPreviousKeyStatus[nfKeyCode_ABNTC1]    =   nfCurrentKeyStatus[nfKeyCode_ABNTC1];
  1174.                 nfCurrentKeyStatus[nfKeyCode_ABNTC1]     =   false;
  1175.                 break;
  1176.             case ALLEGRO_KEY_YEN:
  1177.                 nfPreviousKeyStatus[nfKeyCode_YEN]    =   nfCurrentKeyStatus[nfKeyCode_YEN];
  1178.                 nfCurrentKeyStatus[nfKeyCode_YEN]     =   false;
  1179.                 break;
  1180.             case ALLEGRO_KEY_KANA:
  1181.                 nfPreviousKeyStatus[nfKeyCode_KANA]    =   nfCurrentKeyStatus[nfKeyCode_KANA];
  1182.                 nfCurrentKeyStatus[nfKeyCode_KANA]     =   false;
  1183.                 break;
  1184.             case ALLEGRO_KEY_CONVERT:
  1185.                 nfPreviousKeyStatus[nfKeyCode_CONVERT]    =   nfCurrentKeyStatus[nfKeyCode_CONVERT];
  1186.                 nfCurrentKeyStatus[nfKeyCode_CONVERT]     =   false;
  1187.                 break;
  1188.             case ALLEGRO_KEY_NOCONVERT:
  1189.                 nfPreviousKeyStatus[nfKeyCode_NOCONVERT]    =   nfCurrentKeyStatus[nfKeyCode_NOCONVERT];
  1190.                 nfCurrentKeyStatus[nfKeyCode_NOCONVERT]     =   false;
  1191.                 break;
  1192.             case ALLEGRO_KEY_AT:
  1193.                 nfPreviousKeyStatus[nfKeyCode_AT]    =   nfCurrentKeyStatus[nfKeyCode_AT];
  1194.                 nfCurrentKeyStatus[nfKeyCode_AT]     =   false;
  1195.                 break;
  1196.             case ALLEGRO_KEY_CIRCUMFLEX:
  1197.                 nfPreviousKeyStatus[nfKeyCode_CIRCUMFLEX]    =   nfCurrentKeyStatus[nfKeyCode_CIRCUMFLEX];
  1198.                 nfCurrentKeyStatus[nfKeyCode_CIRCUMFLEX]     =   false;
  1199.                 break;
  1200.             case ALLEGRO_KEY_COLON2:
  1201.                 nfPreviousKeyStatus[nfKeyCode_COLON2]    =   nfCurrentKeyStatus[nfKeyCode_COLON2];
  1202.                 nfCurrentKeyStatus[nfKeyCode_COLON2]     =   false;
  1203.                 break;
  1204.             case ALLEGRO_KEY_KANJI:
  1205.                 nfPreviousKeyStatus[nfKeyCode_KANJI]    =   nfCurrentKeyStatus[nfKeyCode_KANJI];
  1206.                 nfCurrentKeyStatus[nfKeyCode_KANJI]     =   false;
  1207.                 break;
  1208.             case ALLEGRO_KEY_LSHIFT:
  1209.                 nfPreviousKeyStatus[nfKeyCode_LEFTSHIFT]    =   nfCurrentKeyStatus[nfKeyCode_LEFTSHIFT];
  1210.                 nfCurrentKeyStatus[nfKeyCode_LEFTSHIFT]     =   false;
  1211.                 break;
  1212.             case ALLEGRO_KEY_RSHIFT:
  1213.                 nfPreviousKeyStatus[nfKeyCode_RIGHTSHIFT]    =   nfCurrentKeyStatus[nfKeyCode_RIGHTSHIFT];
  1214.                 nfCurrentKeyStatus[nfKeyCode_RIGHTSHIFT]     =   false;
  1215.                 break;
  1216.             case ALLEGRO_KEY_LCTRL:
  1217.                 nfPreviousKeyStatus[nfKeyCode_LEFTCONTROL]    =   nfCurrentKeyStatus[nfKeyCode_LEFTCONTROL];
  1218.                 nfCurrentKeyStatus[nfKeyCode_LEFTCONTROL]     =   false;
  1219.                 break;
  1220.             case ALLEGRO_KEY_RCTRL:
  1221.                 nfPreviousKeyStatus[nfKeyCode_RIGHTCONTROL]    =   nfCurrentKeyStatus[nfKeyCode_RIGHTCONTROL];
  1222.                 nfCurrentKeyStatus[nfKeyCode_RIGHTCONTROL]     =   false;
  1223.                 break;
  1224.             case ALLEGRO_KEY_ALT:
  1225.                 nfPreviousKeyStatus[nfKeyCode_ALT]    =   nfCurrentKeyStatus[nfKeyCode_ALT];
  1226.                 nfCurrentKeyStatus[nfKeyCode_ALT]     =   false;
  1227.                 break;
  1228.             case ALLEGRO_KEY_ALTGR:
  1229.                 nfPreviousKeyStatus[nfKeyCode_ALTGR]    =   nfCurrentKeyStatus[nfKeyCode_ALTGR];
  1230.                 nfCurrentKeyStatus[nfKeyCode_ALTGR]     =   false;
  1231.                 break;
  1232.             case ALLEGRO_KEY_LWIN:
  1233.                 nfPreviousKeyStatus[nfKeyCode_LEFTWINDOWS]    =   nfCurrentKeyStatus[nfKeyCode_LEFTWINDOWS];
  1234.                 nfCurrentKeyStatus[nfKeyCode_LEFTWINDOWS]     =   false;
  1235.                 break;
  1236.             case ALLEGRO_KEY_RWIN:
  1237.                 nfPreviousKeyStatus[nfKeyCode_RIGHTWINDOWS]    =   nfCurrentKeyStatus[nfKeyCode_RIGHTWINDOWS];
  1238.                 nfCurrentKeyStatus[nfKeyCode_RIGHTWINDOWS]     =   false;
  1239.                 break;
  1240.             case ALLEGRO_KEY_MENU:
  1241.                 nfPreviousKeyStatus[nfKeyCode_MENU]    =   nfCurrentKeyStatus[nfKeyCode_MENU];
  1242.                 nfCurrentKeyStatus[nfKeyCode_MENU]     =   false;
  1243.                 break;
  1244.             case ALLEGRO_KEY_SCROLLLOCK:
  1245.                 nfPreviousKeyStatus[nfKeyCode_SCROLLLOCK]    =   nfCurrentKeyStatus[nfKeyCode_SCROLLLOCK];
  1246.                 nfCurrentKeyStatus[nfKeyCode_SCROLLLOCK]     =   false;
  1247.                 break;
  1248.             case ALLEGRO_KEY_NUMLOCK:
  1249.                 nfPreviousKeyStatus[nfKeyCode_NUMLOCK]    =   nfCurrentKeyStatus[nfKeyCode_NUMLOCK];
  1250.                 nfCurrentKeyStatus[nfKeyCode_NUMLOCK]     =   false;
  1251.                 break;
  1252.             case ALLEGRO_KEY_CAPSLOCK:
  1253.                 nfPreviousKeyStatus[nfKeyCode_CAPSLOCK]    =   nfCurrentKeyStatus[nfKeyCode_CAPSLOCK];
  1254.                 nfCurrentKeyStatus[nfKeyCode_CAPSLOCK]     =   false;
  1255.                 break;
  1256.             case ALLEGRO_KEY_PAD_EQUALS:
  1257.                 nfPreviousKeyStatus[nfKeyCode_PADEQUALS]    =   nfCurrentKeyStatus[nfKeyCode_PADEQUALS];
  1258.                 nfCurrentKeyStatus[nfKeyCode_PADEQUALS]     =   false;
  1259.                 break;
  1260.             case ALLEGRO_KEY_BACKQUOTE:
  1261.                 nfPreviousKeyStatus[nfKeyCode_BACKQUOTE]    =   nfCurrentKeyStatus[nfKeyCode_BACKQUOTE];
  1262.                 nfCurrentKeyStatus[nfKeyCode_BACKQUOTE]     =   false;
  1263.                 break;
  1264.             case ALLEGRO_KEY_SEMICOLON2:
  1265.                 nfPreviousKeyStatus[nfKeyCode_SEMICOLON2]    =   nfCurrentKeyStatus[nfKeyCode_SEMICOLON2];
  1266.                 nfCurrentKeyStatus[nfKeyCode_SEMICOLON2]     =   false;
  1267.                 break;
  1268.             case ALLEGRO_KEY_COMMAND:
  1269.                 nfPreviousKeyStatus[nfKeyCode_COMMAND]    =   nfCurrentKeyStatus[nfKeyCode_COMMAND];
  1270.                 nfCurrentKeyStatus[nfKeyCode_COMMAND]     =   false;
  1271.                 break;
  1272.         }
  1273.     }
  1274. }
  1275.  
  1276. void nfSyncReset() {
  1277.     al_flip_display();
  1278.     display.syncRedraw = false;
  1279.     al_clear_to_color(al_map_rgb(display.clearRed, display.clearGreen, display.clearBlue));
  1280. }
  1281.  
  1282. bool nfInit() {
  1283.     display.windowedWidth       =   NF_WINDOW_WIDTH;
  1284.     display.windowedHeight      =   NF_WINDOW_HEIGHT;
  1285.     display.isFullscreen        =   NF_START_FULLSCREEN;
  1286.     display.f11SwitchWindowMode =   NF_F11_SWITCH_MODE;
  1287.     display.cursorVisible       =   NF_SHOW_CURSOR;
  1288.     display.escExit             =   NF_ESC_ENDGAME;
  1289.     display.title               =   NF_WINDOW_TITLE;
  1290.     display.clearRed            =   NF_CLEARCOLOR_RED;
  1291.     display.clearGreen          =   NF_CLEARCOLOR_GREEN;
  1292.     display.clearBlue           =   NF_CLEARCOLOR_BLUE;
  1293.     display.doExit              =   false;
  1294.  
  1295.     if (!al_init()) {
  1296.         cerr << "Neil's Framework: al_init() failed to initalise Allegro 5\n";
  1297.         return false;
  1298.     }
  1299.  
  1300.     if (!al_install_audio()) {
  1301.         cerr << "Neil's Framework: al_install_audio() failed to initalise Allegro 5 audio subsystem\n";
  1302.         return false;
  1303.     }
  1304.  
  1305.     al_init_font_addon();
  1306.     if (!al_init_ttf_addon()) {
  1307.         cerr << "Neil's Framework: al_init_ttf_addon() failed to initalise Allegro 5 TrueType font subsystem\n";
  1308.         return false;
  1309.     }
  1310.  
  1311.     if (!al_init_acodec_addon()) {
  1312.         cerr << "Neil's Framework: al_init_acodec_addon() failed to initalise Allegro 5 audio codecs addon\n";
  1313.         return false;
  1314.     }
  1315.  
  1316.     if (!al_install_mouse()) {
  1317.         cerr << "Neil's Framework: al_install_mouse() failed to initalise Allegro 5 mouse subsystem\n";
  1318.         return false;
  1319.     }
  1320.  
  1321.     if (!al_install_keyboard()) {
  1322.         cerr << "Neil's Framework: al_install_keyboard() failed to initalise Allegro 5 keyboard subsystem\n";
  1323.         return false;
  1324.     }
  1325.  
  1326.     if (!al_init_image_addon()) {
  1327.         cerr << "Neil's Framework: al_init_image_addon() failed to initalise Allegro 5 image subsystem\n";
  1328.         return false;
  1329.     }
  1330.  
  1331.     if (!al_init_primitives_addon()) {
  1332.         cerr << "Neil's Framework: al_init() failed to initalise Allegro 5 primitives subsystem\n";
  1333.         return false;
  1334.     }
  1335.  
  1336.     // Reserve the necessary amount of samples
  1337.  
  1338.     if (!al_reserve_samples(NF_RESERVED_SAMPLES)) {
  1339.         cerr << "Neil's Framework: al_reserve_samples(NF_RESERVED_SAMPLES) failed to reserve the necessary audio samples\n";
  1340.         return false;
  1341.     }
  1342.  
  1343.     display.fpsTimer = al_create_timer(1.0 / (float)NF_FPS);
  1344.     if (!display.fpsTimer) {
  1345.         cerr << "Neil's Framework: al_create_timer(1.0 / NF_FPS) failed to create fps-regulating ALLEGRO_TIMER\n";
  1346.         return false;
  1347.     }
  1348.  
  1349.     al_get_display_mode(al_get_num_display_modes() - 1, &display.fullscreenData);
  1350.  
  1351.     display.fullscreenWidth     =   display.fullscreenData.width;
  1352.     display.fullscreenHeight    =   display.fullscreenData.height;
  1353.  
  1354.     if (display.isFullscreen) {
  1355.         al_set_new_display_flags(ALLEGRO_FULLSCREEN);
  1356.         display.width   =   display.fullscreenWidth;
  1357.         display.height  =   display.fullscreenHeight;
  1358.         display.display =   al_create_display(display.width, display.height);
  1359.         if (!display.display) {
  1360.             cerr << "Neil's Framework: al_create_display() failed to create the fullscreen display\n";
  1361.             return false;
  1362.         }
  1363.     } else {
  1364.         al_set_new_display_flags(ALLEGRO_WINDOWED);
  1365.         display.width   =   display.windowedWidth;
  1366.         display.height  =   display.windowedHeight;
  1367.         display.display =   al_create_display(display.width, display.height);
  1368.         if (!display.display) {
  1369.             cerr << "Neil's Framework: al_create_display() failed to create the windowed display\n";
  1370.             return false;
  1371.         }
  1372.     }
  1373.     al_set_window_title(display.display, display.title.c_str());
  1374.  
  1375.     // Set it to the efficient blender mode
  1376.  
  1377.     al_set_blender(ALLEGRO_ADD, ALLEGRO_ALPHA, ALLEGRO_INVERSE_ALPHA);
  1378.  
  1379.     if (display.cursorVisible) {
  1380.         if (!al_show_mouse_cursor(display.display)) {
  1381.             cerr << "Neil's Framework: al_show_mouse_cursor() failed to make the default mouse cursor opaque\n";
  1382.             return false;
  1383.         }
  1384.     } else {
  1385.         if (!al_hide_mouse_cursor(display.display)) {
  1386.             cerr << "Neil's Framework: al_hide_mouse_cursor() failed to make the default mouse cursor hidden\n";
  1387.             return false;
  1388.         }
  1389.     }
  1390.  
  1391.     display.eventQueue  =   al_create_event_queue();
  1392.     if (!display.eventQueue) {
  1393.         cerr << "Neil's Framework: al_create_event_queue() failed to create the Allegro 5 event queue\n";
  1394.         al_destroy_display(display.display);
  1395.         al_destroy_timer(display.fpsTimer);
  1396.         return false;
  1397.     }
  1398.  
  1399.     // Register eventQueue event sources
  1400.  
  1401.     al_register_event_source(display.eventQueue, al_get_display_event_source(display.display));
  1402.     al_register_event_source(display.eventQueue, al_get_timer_event_source(display.fpsTimer));
  1403.     al_register_event_source(display.eventQueue, al_get_keyboard_event_source());
  1404.     al_register_event_source(display.eventQueue, al_get_mouse_event_source());
  1405.  
  1406.     al_clear_to_color(al_map_rgb(display.clearRed, display.clearGreen, display.clearBlue));
  1407.  
  1408.     al_start_timer(display.fpsTimer);   // Start the fps-regulating timer
  1409.  
  1410.     return true;
  1411. }
  1412.  
  1413. bool nfGetEventQueueEmpty() {
  1414.     if (!display.eventQueue) {
  1415.         return false;
  1416.     } else {
  1417.         if (al_is_event_queue_empty(display.eventQueue)) {
  1418.             return true;
  1419.         } else {
  1420.             return false;
  1421.         }
  1422.     }
  1423. }
  1424.  
  1425. bool nfDestroy() {
  1426.     return true;
  1427. }
  1428.  
  1429. bool nfImage::loadFromFile(string filename) {
  1430.     const char * fname = filename.c_str();
  1431.     bitmap = al_load_bitmap(fname);
  1432.     if (!bitmap) {
  1433.         cerr << "Neil's Framework: al_load_bitmap failed to load the image \"" << fname << "\"\n";
  1434.         return false;
  1435.     } else {
  1436.         width   =   al_get_bitmap_width(bitmap);
  1437.         height  =   al_get_bitmap_height(bitmap);
  1438.         return true;
  1439.     }
  1440. }
  1441.  
  1442. nfImage::nfImage() {
  1443.     bitmap  =   NULL;
  1444.     width   =   0;
  1445.     height  =   0;
  1446. }
  1447.  
  1448. nfImage::~nfImage() {
  1449.     if (bitmap) {
  1450.         al_destroy_bitmap(bitmap);
  1451.     }
  1452. }
  1453.  
  1454. nfSprite::nfSprite() {
  1455.     currentImage.bitmap =   NULL;
  1456.     x                   =   0.0;
  1457.     y                   =   0.0;
  1458.     flippedHorizontal   =   false;
  1459.     flippedVertical     =   false;
  1460. }
  1461.  
  1462. nfSprite::~nfSprite() {
  1463.     if (currentImage.bitmap) {
  1464.         al_destroy_bitmap(currentImage.bitmap);
  1465.     }
  1466. }
  1467.  
  1468. void nfSprite::setImage(nfImage newImage) {
  1469.     currentImage = newImage;
  1470. }
  1471.  
  1472. void nfSprite::draw() {
  1473.     if (flippedHorizontal) {
  1474.         if (flippedVertical) {
  1475.             al_draw_bitmap(currentImage.bitmap, x, y, ALLEGRO_FLIP_HORIZONTAL | ALLEGRO_FLIP_VERTICAL);
  1476.         } else {
  1477.             al_draw_bitmap(currentImage.bitmap, x, y, ALLEGRO_FLIP_HORIZONTAL);
  1478.         }
  1479.     } else {
  1480.         if (flippedVertical) {
  1481.             al_draw_bitmap(currentImage.bitmap, x, y, ALLEGRO_FLIP_VERTICAL);
  1482.         } else {
  1483.             al_draw_bitmap(currentImage.bitmap, x, y, 0);
  1484.         }
  1485.     }
  1486. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement