1. // Level.cpp - Copyright (C) 2003 Oliver Pearce, see COPYING for details
  2.  
  3. #include "coRect.h"
  4. #include "gegner.h"
  5. #include "level.h"
  6. #include <iostream>
  7. #include <fstream>
  8. #include <vector>
  9. #include <string>
  10. #include <iostream>
  11.  
  12. #if defined(linux)
  13. #include <netinet/in.h>
  14. #endif
  15.  
  16. extern int einfuellen(int x,int y,int w,int h,int typ, int x2, int y2);
  17. extern void parseLevel();
  18. extern Gegner gegnerArr[20];
  19.  
  20. //extern vector <CoRect> levEx;
  21.  
  22. bool Level::loadLevel(const char* fileName){
  23.  
  24. files.push_back("level1.bdt");
  25. files.push_back("level2.bdt");
  26. files.push_back("level3.bdt");
  27.  
  28. ifstream inFile(fileName);
  29. //ifstream inFile("test.dat");
  30. int x, y, w, h, typ;
  31.  
  32. for(int i=0; i<60; ++i){
  33. for(int k=0; k<60; ++k){
  34. inFile.read((char*) &x, sizeof(x) );
  35. inFile.read((char*) &y, sizeof(y) );
  36. inFile.read((char*) &w, sizeof(w) );
  37. inFile.read((char*) &h, sizeof(h) );
  38. inFile.read((char*) &typ, sizeof(typ) );
  39.  
  40. #if defined(linux)
  41. x = ntohl(x);
  42. y = ntohl(y);
  43. w = ntohl(w);
  44. h = ntohl(h);
  45. typ = ntohl(typ);
  46. #endif
  47.  
  48. einfuellen(x,y,w,h,typ,k,i);
  49.  
  50. }
  51. }
  52.  
  53. for(int i=0; i<3; ++i){ //liest Eingänge ein
  54. inFile.read((char*) &x, sizeof(x) );
  55. inFile.read((char*) &y, sizeof(y) );
  56.  
  57. #if defined(linux)
  58. x = ntohl(x);
  59. y = ntohl(y);
  60. #endif
  61.  
  62. Eingang eingang; //Eingänge ...
  63. eingang.xCoor = x;
  64. eingang.yCoor = y;
  65.  
  66. einVec.push_back(eingang);
  67.  
  68. int einXPos = x/10;
  69. int einYPos = y/10;
  70. for (int i=0; i < 3; ++i){
  71. for (int k=0; k < 6; ++k)
  72. einfuellen(x+10*i, y+10*k, 10, 10, 8, einXPos+i, einYPos+k); //...Eingänge
  73. }
  74.  
  75. }
  76. inFile.read((char*) &x, sizeof(x) ); //Ausgang....
  77. inFile.read((char*) &y, sizeof(y) );
  78. #if defined(linux)
  79. x = ntohl(x);
  80. y = ntohl(y);
  81. #endif
  82. Eingang ausgang;
  83. ausgang.xCoor = x;
  84. ausgang.yCoor = y;
  85. this->ausgang = ausgang;
  86.  
  87.  
  88. inFile.read((char*) &x, sizeof(x) ); //GegnerAusgang....
  89. inFile.read((char*) &y, sizeof(y) );
  90. #if defined(linux)
  91. x = ntohl(x);
  92. y = ntohl(y);
  93. #endif
  94. Eingang gegnerAusgang;
  95. gegnerAusgang.xCoor = x;
  96. gegnerAusgang.yCoor = y;
  97. this->gegnerAusgang = gegnerAusgang;
  98.  
  99. inFile.read((char*) &x, sizeof(x) ); //StartPosition...
  100. inFile.read((char*) &y, sizeof(y) );
  101. #if defined(linux)
  102. x = ntohl(x);
  103. y = ntohl(y);
  104. #endif
  105. Eingang startPosition;
  106. startPosition.xCoor = x;
  107. startPosition.yCoor = y;
  108. this->startPosition = startPosition; //...StartPosition
  109.  
  110.  
  111. for(int i=0; i<20; ++i){ //liest Gegner- Steuerungs- Skript ein
  112. inFile.read((char*) &x, sizeof(x) );
  113. #if defined(linux)
  114. x = ntohl(x);
  115. #endif
  116. skript.push_back(x);
  117. }
  118.  
  119. for(int i=0; i <3; ++i){
  120. inFile.read((char*) &x, sizeof(x) ); //StartPosition der stationären Gegner
  121. inFile.read((char*) &y, sizeof(y) );
  122. #if defined(linux)
  123. x = ntohl(x);
  124. y = ntohl(y);
  125. #endif
  126. if (x != -1 && y != -1){
  127. for (int i=0; i< 20 ; ++i) { //Gegner generieren
  128. if ( ! (gegnerArr[i].getIsAlive()) ) {
  129. if (x%33 == 0) //Möglichkeit, auch granatwefende stationäre Gegner zu schaffen!
  130. gegnerArr[i] = Gegner (x, y ,20,50, 4);
  131. else
  132. gegnerArr[i] = Gegner (x, y ,20,50, 2);
  133. break;
  134. }
  135. }
  136. }
  137. }
  138.  
  139. inFile.read((char*) &x, sizeof(x) ); //Levelzeit einlesen
  140. #if defined(linux)
  141. x = ntohl(x);
  142. #endif
  143. levelZeit = x;
  144.  
  145. parseLevel();
  146. //Startzeit des Levels bestimmen
  147. time(&levelStartZeit);
  148.  
  149. return true;
  150. }
  151.  
  152. void Level::gegnerGenerator() {
  153.  
  154. Uint32 aktuelleZeit = SDL_GetTicks();
  155. if (aktuelleZeit > startzeit + 3000 ) { //Wie oft kommt ein neuer Gegner
  156. startzeit = SDL_GetTicks();
  157.  
  158. Eingang aktEingang = einVec[einIndex]; //Aktueller Eingang zuweisen
  159. ++einIndex;
  160. if (einIndex == 3)
  161. einIndex =0;
  162.  
  163. int aktSkript = skript[skriptIndex]; //Aktueller Skriptwert zuweisen
  164. ++ skriptIndex;
  165. if (skriptIndex == 20)
  166. skriptIndex =0;
  167.  
  168. //if ( ( aktEingang.xCoor != -100 ) && (aktEingang.yCoor != -100) ){ //Mit -100/-100 kann das Produktionstempo vermindert werden
  169. if (aktSkript != 0){
  170. for (int i=0; i< 20 ; ++i) { //Gegner generieren
  171. if ( ! (gegnerArr[i].getIsAlive()) ) {
  172. gegnerArr[i] = Gegner (aktEingang.xCoor, aktEingang.yCoor ,20,50, aktSkript);
  173. break;
  174. }
  175. }
  176. }
  177.  
  178. }
  179.  
  180. }
  181.  
  182. void Level::reset() {
  183. for (int i=0; i<3; ++i){
  184. einVec.pop_back();
  185. }
  186. for (int i=0; i<20; ++i){
  187. skript.pop_back();
  188. }
  189. skriptIndex = 0;
  190. }
  191.  
  192.  
  193.  
  194.  
  195.  
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202.  
  203.  
  204.  
  205.  
  206.  
  207.  
  208.  
  209.  
  210.  
  211.  
  212.  
  213.  
  214.  
  215.  
  216.  
  217.  
  218.