PageRenderTime 28ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/DR.World/Ablast20/Source/ABEDITOR.PAS

https://code.google.com/p/d-edit/
Pascal | 382 lines | 339 code | 28 blank | 15 comment | 0 complexity | 60a5a40dbc26a932c5b8ce07ab75590a MD5 | raw file
  1. {-= Level Editor for Alien Blaster =-}
  2. Program Editor;
  3. {$I abmain.pas}
  4. Const ProgramTitle = 'Level Editor v1.0';
  5. NothingEntered = '';
  6. NotSaved = 0;
  7. var LevelSettingsModified, GameSettingsModified : Boolean;
  8. Focus : RecordPointer;
  9. {Pop up usage information}
  10. Procedure ShowHelp; Forward;
  11. {Update screen}
  12. Procedure Update;
  13. Var FocusColor : Byte;
  14. Level : String;
  15. Begin
  16. FocusColor:= Random(256);
  17. Level:= 'LEVEL:';
  18. If CurrentLevel = NotSaved Then Level:= Level + '(UNTITLED)'
  19. Else Level:= Level + IntToStr(CurrentLevel);
  20. With Focus^, Enemies.SpaceShip Do
  21. Begin
  22. With Focus^ Do
  23. Output(0, ScreenHeight - Font.Width + 1, 'X:' + IntToStr(Trunc(X)) + ' Y:' + IntToStr(Trunc(Y)), VirtualScreen1); {state}
  24. Output((ScreenWidth - Length(Level) * Font.Width) Div 2, ScreenHeight - Font.Width + 1, Level, VirtualScreen1);
  25. If LevelSettingsModified Then
  26. Output(ScreenWidth - 8 * Font.Width, ScreenHeight - Font.Width + 1, 'MODIFIED', VirtualScreen1);
  27. With Enemies Do PutSprites(FirstEnemy, Spaceship); {set all enemies}
  28. PutPixel(Trunc(X), Trunc(Y), FocusColor, VirtualScreen1); {show focus...}
  29. PutPixel(Trunc(X) + 1, Trunc(Y), FocusColor, VirtualScreen1);
  30. PutPixel(Trunc(X), Trunc(y) + 1, FocusColor, VirtualScreen1);
  31. PutPixel(Trunc(X) + Width - 1, Trunc(Y), FocusColor, VirtualScreen1);
  32. PutPixel(Trunc(X) + Width - 2 , Trunc(Y), FocusColor, VirtualScreen1);
  33. PutPixel(Trunc(X) + Width - 1, Trunc(Y) + 1, FocusColor, VirtualScreen1);
  34. PutPixel(Trunc(X), Trunc(Y) + Height - 1, FocusColor, VirtualScreen1);
  35. PutPixel(Trunc(X), Trunc(Y) + Height - 2, FocusColor, VirtualScreen1);
  36. PutPixel(Trunc(X) + 1, Trunc(Y) + Height - 1, FocusColor, VirtualScreen1);
  37. PutPixel(Trunc(X) + Width - 1, Trunc(Y) + Height - 1, FocusColor, VirtualScreen1);
  38. PutPixel(Trunc(X) + Width - 2, Trunc(Y) + Height - 1, FocusColor, VirtualScreen1);
  39. PutPixel(Trunc(X) + Width - 1, Trunc(Y) + Height - 2, FocusColor, VirtualScreen1);
  40. End;
  41. End;
  42. Procedure ShowHelp;
  43. Begin
  44. Flip(VirtualScreen2^, Display^);
  45. With Font Do
  46. Begin {misc}
  47. Output((ScreenWidth + 1 - (Length(ProgramTitle) + 5 + Length(GameTitle)) * Width) Div 2, Width * 0,
  48. UpperStr(ProgramTitle) + ' FOR ' + UpperStr(GameTitle), Display);
  49. Output(0, Width * 1, 'BY ' + UpperStr(Programmer) + ' (' + UpperStr(EMail) + ')', Display);
  50. Output((ScreenWidth - 11 * Width) Div 2, Width * 3, '- HELP -', Display);
  51. Output(0, Width * 5, '(EDTING MODE)', Display);
  52. Output(0, Width * 6, ' ESC:QUIT EDITOR ENTER:PLAY', Display);
  53. Output(0, Width * 7, ' +:SELECT NEXT -:SELECT PREVIOUS', Display);
  54. Output(0, Width * 8, ' INS:CREATE NEW DEL:ERASE SELECTED', Display);
  55. Output(0, Width * 9, 'PGUP:MOVE TO TOP PGDN:MOVE TO BOTTOM ', Display);
  56. Output(0, Width * 10, 'HOME:MOVE TO LEFT END:MOVE TO RIGHT', Display);
  57. Output(0, Width * 11, ' F1:HELP SCREEN F2:NEW LEVEL', Display);
  58. Output(0, Width * 12, ' F3:GAME SETTINGS F4:LEVEL SETTINGS', Display);
  59. Output(0, Width * 13, ' F5:OPEN LEVEL F6:SAVE LEVEL', Display);
  60. Output((ScreenWidth - 37 * Width) Div 2, Width * 15, 'USE THE ARROW KEYS TO MOVE THE CURSOR', Display);
  61. Output(0, Width * 17, '(PLAYING MODE)', Display);
  62. Output(0, Width * 18, 'ESC:QUIT GAME', Display);
  63. With GameSettings Do {keys}
  64. Begin
  65. Output(0, width * 19, UpperStr(Key(Left)) + ':MOVE LEFT', Display);
  66. Output(0, Width * 20, UpperStr(Key(Right)) + ':MOVE RIGHT', Display);
  67. Output(0, Width * 21, UpperStr(Key(Shoot)) + ':SHOOT', Display);
  68. End;
  69. ReadKey;
  70. End;
  71. End;
  72. {Edit text string or exit if nothing was entered}
  73. Function EditString(Var Variable; Size : Byte; Var Modified : Boolean; Output : String) : boolean;
  74. Var Input : String;
  75. begin
  76. Case Size Of
  77. SizeOf(Real) : Write(Output + ' (' + RealToStr(Real(Variable)) + '):');
  78. SizeOf(Word) : Write(Output + ' (' + RealToStr(Word(Variable)) + '):');
  79. End;
  80. ReadLn(Input);
  81. If Input = NothingEntered Then EditString:= False
  82. Else
  83. Begin
  84. Case Size Of
  85. SizeOf(Real) : Real(Variable):= StrToReal(Input);
  86. SizeOf(Word) : Word(Variable):= Word(Round(StrToReal(Input)));
  87. End;
  88. Editstring:= True;
  89. Modified:= True;
  90. End;
  91. End;
  92. {Edit settings}
  93. Procedure EditGameSettings;
  94. {Get key or exit if esc was pressed}
  95. Procedure EditKey(Var Which : Byte; Message : String);
  96. Var Input : Byte;
  97. Begin
  98. Write(Message);
  99. Input:= ReadKbdPort;
  100. If Input <> 1{esc} Then
  101. Begin
  102. GameSettingsModified:= True;
  103. Which:= Input;
  104. Write(Key(Input));
  105. End;
  106. WriteLn;
  107. End;
  108. Begin
  109. SetMode(TextMode);
  110. WriteLn('- GAME SETTINGS -');
  111. With GameSettings Do
  112. Begin
  113. EditKey(Left, 'Move left (' + Key(Left) + '):');
  114. EditKey(Right, 'Move rigth (' + Key(Right) + '):');
  115. EditKey(Shoot, 'Fire (' + Key(Shoot) + '):');
  116. EditString(BulletOffset, SizeOf(BulletOffset), GameSettingsModified, 'Bullet offset');
  117. EditString(PlayersHorizoffset, SizeOf(PlayersHorizOffset), GameSettingsModified, 'Player offset');
  118. EditString(FrameDelay, SizeOf(FrameDelay), GameSettingsModified, 'Frame delay');
  119. End;
  120. SetMode(GraphicsMode);
  121. SetPalette;
  122. End;
  123. {Modify level settings}
  124. Procedure EditLevelSettings;
  125. Begin
  126. SetMode(TextMode);
  127. WriteLn('- LEVEL SETTINGS -');
  128. With LevelSettings Do
  129. Begin
  130. EditString(RandomShoot, SizeOf(RandomShoot), LevelSettingsModified, 'Random shoot');
  131. EditString(EnemysHorizOffset, SizeOf(EnemysHorizOffset), LevelSettingsModified, 'Enemy X offset');
  132. EditString(EnemysVertOffset, SizeOf(EnemysVertOffset), LevelSettingsModified, 'Enemy Y offset');
  133. End;
  134. SetMode(GraphicsMode);
  135. SetPalette;
  136. End;
  137. {Load level}
  138. Procedure Load;
  139. Label TryAgain;
  140. Var Enemy : RecordPointer;
  141. Modified : Boolean;
  142. Entered : Word;
  143. Begin
  144. SetMode(TextMode);
  145. WriteLn('- LOAD -');
  146. TryAgain:
  147. Entered:= CurrentLevel;
  148. If EditString(Entered, SizeOf(CurrentLevel), Modified, 'Level') Then
  149. Begin
  150. If LoadLevel(Entered, True) <> Success Then
  151. Begin
  152. WriteLn('Error: Can not load level!');
  153. Goto TryAgain;
  154. End;
  155. CurrentLevel:= Entered;
  156. LevelSettingsModified:= False;
  157. Focus:= Enemies.FirstEnemy;
  158. End;
  159. SetMode(GraphicsMode);
  160. SetPalette;
  161. End;
  162. {Save level without asking for filename}
  163. Function SaveDirect(Level : Word) : Integer;
  164. Var Enemy : RecordPointer;
  165. F : File;
  166. Begin
  167. Assign(F, LevelFile + IntToStr(Level));
  168. {$I-} ReWrite(F, 1); {$I+}
  169. If IOResult <> Success Then
  170. Begin
  171. SaveDirect:= CantCreateFile;
  172. Exit;
  173. End;
  174. BlockWrite(F, LevelSettings, SizeOf(LevelSettingsRecord));
  175. Enemy:= Enemies.FirstEnemy;
  176. While Enemy <> Nil Do
  177. With Enemy^ Do
  178. Begin
  179. BlockWrite(F, X, SizeOf(X));
  180. BlockWrite(F, Y, SizeOf(Y));
  181. Enemy:= Next;
  182. End;
  183. Close(F);
  184. SaveDirect:= Success;
  185. End;
  186. {Ask for filename and save level}
  187. Procedure Save;
  188. Label TryAgain;
  189. Var Temp : Word;
  190. Modified : Boolean;
  191. F : File;
  192. Begin
  193. SetMode(TextMode);
  194. WriteLn('- SAVE -');
  195. TryAgain:
  196. Temp:= CurrentLevel;
  197. If EditString(Temp, SizeOf(CurrentLevel), Modified, 'Level') Then
  198. Begin
  199. If OpenFile(F, LevelFile + IntToStr(Temp)) = Success Then
  200. Begin
  201. Close(F);
  202. Write('Level exists! Overwrite?');
  203. If Not (UpCase(ReadKey) In [kEnter, kYes]) Then
  204. Begin
  205. WriteLn('No');
  206. Goto TryAgain;
  207. End;
  208. End;
  209. If SaveDirect(Temp) <> Success Then
  210. Begin
  211. Writeln('Error! Can''t save level');
  212. Exit;
  213. End Else LevelSettingsModified:= False;
  214. LoadLevel(Temp, False); {solving the first-in-last-out problem with pointers}
  215. SaveDirect(Temp);
  216. LoadLevel(Temp, False);
  217. End;
  218. CurrentLevel:= Temp;
  219. SetMode(GraphicsMode);
  220. SetPalette;
  221. End;
  222. {Save game settings}
  223. Function SaveGameSettings : Integer;
  224. Var F : File;
  225. Result : Integer;
  226. Begin
  227. Assign(F, SettingsFile);
  228. {$i-} ReWrite(F, 1); {$i+}
  229. Result:= IOResult;
  230. If Result <> Success Then
  231. Begin
  232. SaveGameSettings:= Result;
  233. Exit;
  234. End;
  235. SaveGameSettings:= Success;
  236. BlockWrite(F, GameSettings, SizeOf(GameSettings));
  237. Close(F);
  238. End;
  239. {Reset focus}
  240. Procedure InitFocus;
  241. Begin
  242. LevelSettingsModified:= False;
  243. CurrentLevel:= NotSaved;
  244. With Enemies Do
  245. Begin
  246. Create(FirstEnemy);
  247. FirstEnemy^.X:= 0;
  248. FirstEnemy^.Y:= 0;
  249. Focus:= FirstEnemy;
  250. End;
  251. End;
  252. {Handle input}
  253. Procedure HandleKbdInput;
  254. Var Input : Char;
  255. Begin
  256. Input:= ReadKey;
  257. With Enemies, Focus^ Do
  258. Case Input of
  259. kEsc : Begin
  260. If LevelSettingsModified Then
  261. Case Message('SAVE LEVEL?') of
  262. kYes, kEnter : Save;
  263. kEsc : Exit;
  264. End;
  265. If GameSettingsModified Then
  266. Case Message('SAVE SETTINGS?') of
  267. kYes, kEnter : If SaveGameSettings <> Success Then Message('ERROR! CAN''T SAVE SETTINGS!');
  268. kEsc : Exit;
  269. End;
  270. Quit(Success, ProgramTitle + LastUpdate);
  271. End;
  272. kEnter : Begin
  273. Player.Lifes:= DefaultLifes;
  274. SetupPlayer;
  275. SaveDirect(NotSaved); {solve the first-in-last-out problem by pointers...}
  276. LoadLevel(NotSaved, False);
  277. SaveDirect(NotSaved);
  278. LoadLevel(NotSaved, False);
  279. STARTGAME;
  280. If LoadLevel(NotSaved, False) <> Success Then
  281. Quit(CantLoadLevel, 'Can''t load ' + LevelFile + RealToStr(CurrentLevel) + ' level!');
  282. {Focus:= Enemies.FirstEnemy;}
  283. End;
  284. kPlus : If Next <> Nil Then Focus:= Next;
  285. kMinus : If Focus <> FirstEnemy Then Focus:= Previous;
  286. kExtended : Begin
  287. Input:= Readkey;
  288. If Input In [kIns, kDel, kLeft, kRight, kUp, kDown, kPgUp, kPgDn, kHome, kEnd] Then LevelSettingsModified:= True;
  289. Case Input Of
  290. kPgUp : Y:= 0;
  291. kPgDn : Y:= ScreenHeight + 1 - SpaceShip.Height;
  292. kHome : X:= 0;
  293. kEnd : X:= ScreenWidth + 1 - SpaceShip.Width;
  294. kUp : If Y > 0 Then Y:= Y - 1;
  295. kDown : If y + SpaceShip.Height - 1 < ScreenHeight Then Y:= Y + 1;
  296. kLeft : If X > 0 Then X:= X - 1;
  297. kRight : If X + SpaceShip.Width - 1 < ScreenWidth Then X:= X + 1;
  298. kF1 : ShowHelp;
  299. kF2 : Begin
  300. If LevelSettingsModified Then
  301. Case Message('SAVE LEVEL?') of
  302. kYes, kEnter : Save;
  303. kEsc : Exit;
  304. End;
  305. EraseEnemies;
  306. InitFocus;
  307. End;
  308. kF3 : EditGameSettings;
  309. kF4 : EditLevelSettings;
  310. kF5 : Begin
  311. If LevelSettingsModified Then
  312. Case Message('SAVE LEVEL?') of
  313. kYes, kEnter : Save;
  314. kEsc : Exit;
  315. End;
  316. Load;
  317. End;
  318. kF6 : Save;
  319. kDel : If Not ((Focus = FirstEnemy) And (Focus^.Next = Nil)) Then
  320. Begin
  321. Erase(Focus, FirstEnemy);
  322. If Focus = Nil Then Focus:= Previous;
  323. End;
  324. kIns : Begin
  325. Create(FirstEnemy);
  326. FirstEnemy^.X:= X;
  327. FirstEnemy^.Y:= Y;
  328. Focus:= FirstEnemy;
  329. End;
  330. End;
  331. End;
  332. End;
  333. End;
  334. BEGIN
  335. Initallization; {initallize and prapare...}
  336. SetupEnemies;
  337. GetMem(VirtualScreen1, BufferSize);
  338. New(Palette);
  339. SetMode(GraphicsMode);
  340. LoadFont;
  341. LoadBackground;
  342. LoadSprites;
  343. SetPalette;
  344. InitFocus;
  345. Repeat
  346. While Not Keypressed Do
  347. Begin {update screen}
  348. Flip(VirtualScreen2^, VirtualScreen1^);
  349. Update;
  350. Flip(VirtualScreen1^, Display^);
  351. End;
  352. HandleKbdInput; {react on input}
  353. Until False;
  354. END.