Demo.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760
  1. //------------------------------------------------------------------------------------------------
  2. // 0.0.1
  3. //------------------------------------------------------------------------------------------------
  4. #include <stdio.h>
  5. #include <math.h>
  6. #include <unistd.h>
  7. #include <sys/types.h>
  8. #include <dirent.h>
  9. #include <errno.h>
  10. #include "3d_all.h"
  11. #include "Demo.h"
  12. #include "Bind.h"
  13. #include "Berusky3d_kofola_interface.h"
  14. #include "Berusky_universal.h"
  15. #include "profiles.h"
  16. extern PLAYER_PROFILE pPlayerProfile;
  17. extern int iActualLevel;
  18. extern int iActualScene;
  19. void demo_Set_Scene_Level(char *cDemo, int *pScene, int *pLevel)
  20. {
  21. char odir[MAX_FILENAME + 1];
  22. FILE *file;
  23. DEMOFILEHEADER FileHeader;
  24. if (getcwd(odir, MAX_FILENAME) == NULL)
  25. return;
  26. if (chdir(SAVE_DIR))
  27. return;
  28. file = fopen(cDemo, "rb");
  29. if (!file) {
  30. /* GCC warns when we don't check the return value of chdir(). For
  31. some reason, casting to (void) doesn't work. */
  32. if (chdir(odir))
  33. return;
  34. return;
  35. }
  36. if (fread(&FileHeader, sizeof(DEMOFILEHEADER), 1, file) != 1) {
  37. fclose(file);
  38. return;
  39. }
  40. fclose(file);
  41. (*pScene) = FileHeader.iScene;
  42. (*pLevel) = FileHeader.iLevel;
  43. /* GCC warns when we don't check the return value of chdir(). For
  44. some reason, casting to (void) doesn't work. */
  45. if (chdir(odir))
  46. return;
  47. }
  48. int demo_Check_Owner(WCHAR * wPlayer, char *cDemo, WCHAR * wDemoName)
  49. {
  50. WCHAR wc[128];
  51. char text[256];
  52. DEMOFILEHEADER FileHeader;
  53. FILE *file;
  54. file = fopen(cDemo, "rb");
  55. if (!file)
  56. return 0;
  57. if (fread(&FileHeader, sizeof(DEMOFILEHEADER), 1, file) != 1) {
  58. fclose(file);
  59. return 0;
  60. }
  61. fclose(file);
  62. if(FileHeader.iDemoID != 123456789 ||
  63. FileHeader.iHiVer != DEMO_HIVERSION ||
  64. FileHeader.iLoVer != DEMO_LOVERSION)
  65. return 0;
  66. strcpy(text, "ANAKREON_DEMO_ANAKREON");
  67. MultiByteToWideChar(CP_ACP, 0, text, strlen(text)+1, wc, sizeof(wc)/sizeof(wc[0]));
  68. if(!wcscmp(wc, FileHeader.cPlayerName)) {
  69. wcscpy(wDemoName, FileHeader.cFileName);
  70. return 1;
  71. }
  72. if(wcscmp(wPlayer, FileHeader.cPlayerName))
  73. return 0;
  74. else {
  75. wcscpy(wDemoName, FileHeader.cFileName);
  76. return 1;
  77. }
  78. return 0;
  79. }
  80. //------------------------------------------------------------------------------------------------
  81. // init demo saving
  82. //------------------------------------------------------------------------------------------------
  83. DEMOKEYFRAME *demo_Init(DEMOSTRUCTURE * p_Demo)
  84. {
  85. p_Demo->Frame_Counter = 0;
  86. p_Demo->p_First = (DEMOKEYFRAME *) mmalloc(sizeof(DEMOKEYFRAME));
  87. p_Demo->p_Last = p_Demo->p_First;
  88. return p_Demo->p_First;
  89. }
  90. //------------------------------------------------------------------------------------------------
  91. // Release demo key frame line
  92. //------------------------------------------------------------------------------------------------
  93. void demo_Release(DEMOSTRUCTURE * p_Demo)
  94. {
  95. DEMOKEYFRAME *p_Frame, *p_Next;
  96. p_Frame = p_Demo->p_First;
  97. while(p_Frame) {
  98. p_Next = p_Frame->p_Next;
  99. kprintf(1, "Release Demo Frame Vkey = %d", p_Frame->Key);
  100. free((void *) p_Frame);
  101. p_Frame = p_Next;
  102. }
  103. p_Demo->p_First = NULL;
  104. }
  105. //------------------------------------------------------------------------------------------------
  106. // add new demo key frame into the line
  107. //------------------------------------------------------------------------------------------------
  108. DEMOKEYFRAME *demo_Create_Frame(DEMOSTRUCTURE * p_Demo)
  109. {
  110. p_Demo->p_Last->p_Next = NULL;
  111. p_Demo->p_Last->p_Next = (DEMOKEYFRAME *) mmalloc(sizeof(DEMOKEYFRAME));
  112. p_Demo->Frame_Counter++;
  113. p_Demo->p_Last = p_Demo->p_Last->p_Next;
  114. p_Demo->p_Last->p_Next = NULL;
  115. p_Demo->Start = timeGetTime();
  116. return p_Demo->p_Last;
  117. }
  118. //------------------------------------------------------------------------------------------------
  119. // count eplaset time in millisecods
  120. //------------------------------------------------------------------------------------------------
  121. DWORD demo_Eplased_Time(DWORD Start, DWORD Finish)
  122. {
  123. DWORD epl = Finish - Start;
  124. return epl;
  125. }
  126. //------------------------------------------------------------------------------------------------
  127. // save demo
  128. //------------------------------------------------------------------------------------------------
  129. int demo_Save(DEMOSTRUCTURE * p_Demo, char *p_File_Name, char Ovladani,
  130. char *cLevelName)
  131. {
  132. DEMOFILEHEADER FileHeader;
  133. FILE *file;
  134. int i;
  135. DEMOKEYFRAME *p_Frame;
  136. file = fopen(p_File_Name, "wb");
  137. if (!file)
  138. return 0;
  139. ZeroMemory(&FileHeader, sizeof(FileHeader));
  140. FileHeader.iHiVer = DEMO_HIVERSION;
  141. FileHeader.iLoVer = DEMO_LOVERSION;
  142. FileHeader.bOvladaniBerusek1 = Ovladani;
  143. strcpy(FileHeader.cLevelName, cLevelName);
  144. FileHeader.iDemoID = 123456789;
  145. FileHeader.iLevel = iActualLevel;
  146. FileHeader.iScene = iActualScene;
  147. fwrite(&FileHeader, sizeof(DEMOFILEHEADER), 1, file);
  148. fwrite(p_Demo, sizeof(DEMOSTRUCTURE), 1, file);
  149. p_Frame = p_Demo->p_First;
  150. for (i = 0; i < p_Demo->Frame_Counter; i++) {
  151. fwrite(p_Frame, sizeof(DEMOKEYFRAME), 1, file);
  152. p_Frame = p_Frame->p_Next;
  153. }
  154. fclose(file);
  155. return 1;
  156. }
  157. int demo_Exist(WCHAR * wName, char *cFile)
  158. {
  159. DEMOFILEHEADER FileHeader;
  160. DIR *dir;
  161. struct dirent *ent;
  162. int errno_save;
  163. dir = opendir(".");
  164. if (!dir)
  165. return 1;
  166. errno = 0;
  167. while ((ent = readdir(dir))) {
  168. char *name = ent->d_name;
  169. FILE *file;
  170. if (strcmp(name + strlen(name) - 4, ".dem")) {
  171. errno = 0;
  172. continue;
  173. }
  174. file = fopen(name, "rb");
  175. if (!file) {
  176. errno = 0;
  177. continue;
  178. }
  179. if (fread(&FileHeader, sizeof(DEMOFILEHEADER), 1, file) != 1) {
  180. fclose(file);
  181. closedir(dir);
  182. return 1;
  183. }
  184. fclose(file);
  185. if (!wcscmp(FileHeader.cFileName, wName) && !wcscmp(FileHeader.cPlayerName, pPlayerProfile.cName)) {
  186. strcpy(cFile, name);
  187. closedir(dir);
  188. return 1;
  189. }
  190. // Reset `errno' for the next time around.
  191. errno = 0;
  192. }
  193. errno_save = errno;
  194. closedir(dir);
  195. return !!errno_save;
  196. }
  197. int demo_SaveWC(DEMOSTRUCTURE * p_Demo, WCHAR * wcName, char Ovladani,
  198. char *cLevelName, char *cLoadSignature)
  199. {
  200. char cFile[1024];
  201. char pom[128];
  202. char pom2[128];
  203. DEMOFILEHEADER FileHeader;
  204. FILE *file;
  205. int i;
  206. DEMOKEYFRAME *p_Frame;
  207. _strdate(pom);
  208. for (i = 0; i < (signed) strlen(pom); i++)
  209. if (pom[i] == '/')
  210. pom[i] = '_';
  211. _strtime(pom2);
  212. for (i = 0; i < (signed) strlen(pom2); i++)
  213. if (pom2[i] == ':')
  214. pom2[i] = '_';
  215. sprintf(cFile, "demo_[%s]_[%s].dem", pom, pom2);
  216. if (chdir(SAVE_DIR))
  217. return 0;
  218. //strcat(cText, DIR_SLASH_STRING);
  219. //strcat(cText, cFile);
  220. demo_Exist(wcName, cFile);
  221. file = fopen(cFile, "wb");
  222. if (!file)
  223. return 0;
  224. ZeroMemory(&FileHeader, sizeof(FileHeader));
  225. FileHeader.iHiVer = DEMO_HIVERSION;
  226. FileHeader.iLoVer = DEMO_LOVERSION;
  227. FileHeader.bOvladaniBerusek1 = Ovladani;
  228. wcscpy(FileHeader.cPlayerName, pPlayerProfile.cName);
  229. wcscpy(FileHeader.cFileName, wcName);
  230. strcpy(FileHeader.cLevelName, cLevelName);
  231. FileHeader.iDemoID = 123456789;
  232. FileHeader.iLevel = iActualLevel;
  233. FileHeader.iScene = iActualScene;
  234. if (!strcmp(cLoadSignature, "LOAD_GAME"))
  235. FileHeader.iLoadedLevel = 1;
  236. else
  237. FileHeader.iLoadedLevel = 0;
  238. fwrite(&FileHeader, sizeof(DEMOFILEHEADER), 1, file);
  239. fwrite(p_Demo, sizeof(DEMOSTRUCTURE), 1, file);
  240. p_Frame = p_Demo->p_First;
  241. for (i = 0; i < p_Demo->Frame_Counter; i++) {
  242. fwrite(p_Frame, sizeof(DEMOKEYFRAME), 1, file);
  243. p_Frame = p_Frame->p_Next;
  244. }
  245. fclose(file);
  246. return 1;
  247. }
  248. //------------------------------------------------------------------------------------------------
  249. // load demo
  250. //------------------------------------------------------------------------------------------------
  251. int demo_Load(DEMOSTRUCTURE * p_Demo, char *p_File_Name, char *bOvladani,
  252. char *cLevel_Name, char *cLoadedSignature)
  253. {
  254. DEMOFILEHEADER FileHeader;
  255. FILE *file;
  256. int i;
  257. DEMOKEYFRAME *p_Frame;
  258. DEMOKEYFRAME *p_Last;
  259. file = fopen(p_File_Name, "rb");
  260. if (!file) {
  261. kprintf(1, "Demo file not found");
  262. return 0;
  263. }
  264. if (fread(&FileHeader, sizeof(DEMOFILEHEADER), 1, file) != 1) {
  265. kprintf(1, "Cannot read %s", p_File_Name);
  266. fclose(file);
  267. return 0;
  268. }
  269. if (FileHeader.iDemoID != 123456789 ||
  270. FileHeader.iHiVer != DEMO_HIVERSION ||
  271. FileHeader.iLoVer != DEMO_LOVERSION) {
  272. kprintf(1, "Demo Version mismatch! - Expected: v%d.%d - File v%d.%d",
  273. DEMO_HIVERSION, DEMO_LOVERSION, FileHeader.iHiVer, FileHeader.iLoVer);
  274. fclose(file);
  275. return 0;
  276. }
  277. iActualLevel = FileHeader.iLevel;
  278. iActualScene = FileHeader.iScene;
  279. *bOvladani = FileHeader.bOvladaniBerusek1;
  280. strcpy(cLevel_Name, FileHeader.cLevelName);
  281. if (FileHeader.iLoadedLevel)
  282. strcpy(cLoadedSignature, "LOAD_GAME");
  283. if (fread(p_Demo, sizeof(DEMOSTRUCTURE), 1, file) != 1) {
  284. kprintf(1, "Cannot read %s", p_File_Name);
  285. fclose(file);
  286. return 0;
  287. }
  288. p_Demo->bOvladaniBerusek1 = FileHeader.bOvladaniBerusek1;
  289. p_Demo->p_First = p_Demo->p_Last = NULL;
  290. for (i = 0; i < p_Demo->Frame_Counter; i++) {
  291. p_Frame = (DEMOKEYFRAME *) mmalloc(sizeof(DEMOKEYFRAME));
  292. if (fread(p_Frame, sizeof(DEMOKEYFRAME), 1, file) != 1) {
  293. kprintf(1, "Cannot read %s", p_File_Name);
  294. fclose(file);
  295. demo_Release(p_Demo);
  296. free(p_Frame);
  297. return 0;
  298. }
  299. if (i == 0)
  300. p_Demo->p_First = p_Frame;
  301. else
  302. p_Last->p_Next = p_Frame;
  303. p_Last = p_Frame;
  304. p_Last->p_Next = NULL;
  305. }
  306. fclose(file);
  307. return 1;
  308. }
  309. int demo_Virual2Fuction(int iVirtualKey, CONTROL_KEYS * p_keys)
  310. {
  311. if (iVirtualKey == p_keys->move_forward)
  312. return 1;
  313. if (iVirtualKey == p_keys->turn_back)
  314. return 2;
  315. if (iVirtualKey == p_keys->turn_left)
  316. return 3;
  317. if (iVirtualKey == p_keys->turn_right)
  318. return 4;
  319. if (iVirtualKey == p_keys->next_beatle)
  320. return 5;
  321. /*if(iVirtualKey == p_keys->inventory)
  322. return 6;
  323. if(iVirtualKey == p_keys->inventory_select)
  324. return 7;
  325. if(iVirtualKey == p_keys->inventory_left)
  326. return 8;
  327. if(iVirtualKey == p_keys->inventory_right)
  328. return 9;
  329. if(iVirtualKey == p_keys->inventory_cancel)
  330. return 10;
  331. if(iVirtualKey == p_keys->camera_move_left)
  332. return 11;
  333. if(iVirtualKey == p_keys->camera_move_right)
  334. return 12;
  335. if(iVirtualKey == p_keys->camera_move_forward)
  336. return 13;
  337. if(iVirtualKey == p_keys->camera_move_back)
  338. return 14; */
  339. if (iVirtualKey == p_keys->camera_zoom_in)
  340. return 15;
  341. if (iVirtualKey == p_keys->camera_zoom_out)
  342. return 16;
  343. /*if(iVirtualKey == p_keys->camera_turn_left)
  344. return 17;
  345. if(iVirtualKey == p_keys->camera_turn_right)
  346. return 18;
  347. if(iVirtualKey == p_keys->camera_turn_up)
  348. return 19;
  349. if(iVirtualKey == p_keys->camera_turn_down)
  350. return 20; */
  351. if (iVirtualKey == p_keys->camera_fast_turn_left)
  352. return 21;
  353. if (iVirtualKey == p_keys->camera_fast_turn_right)
  354. return 22;
  355. if (iVirtualKey == p_keys->camera_center)
  356. return 23;
  357. if (iVirtualKey == p_keys->menu)
  358. return 24;
  359. if (iVirtualKey == p_keys->item_lock)
  360. return 25;
  361. if (iVirtualKey == p_keys->blow_detonation_pack)
  362. return 26;
  363. if (iVirtualKey == p_keys->beatle1)
  364. return 27;
  365. if (iVirtualKey == p_keys->beatle2)
  366. return 28;
  367. if (iVirtualKey == p_keys->beatle3)
  368. return 29;
  369. if (iVirtualKey == p_keys->beatle4)
  370. return 30;
  371. if (iVirtualKey == p_keys->beatle5)
  372. return 31;
  373. if (iVirtualKey == p_keys->beatle6)
  374. return 32;
  375. /*if(iVirtualKey == p_keys->item1)
  376. return 33;
  377. if(iVirtualKey == p_keys->item2)
  378. return 34;
  379. if(iVirtualKey == p_keys->item3)
  380. return 35;
  381. if(iVirtualKey == p_keys->item4)
  382. return 36; */
  383. if (iVirtualKey == p_keys->next_song)
  384. return 37;
  385. if (iVirtualKey == p_keys->disable_inventory)
  386. return 38;
  387. if (iVirtualKey == p_keys->disable_top_ledge)
  388. return 39;
  389. if (iVirtualKey == p_keys->screenshot)
  390. return 40;
  391. if (iVirtualKey == p_keys->visibility)
  392. return 41;
  393. if (iVirtualKey == p_keys->hint)
  394. return 42;
  395. if (iVirtualKey == p_keys->restart)
  396. return 43;
  397. if (iVirtualKey == p_keys->highlight)
  398. return 44;
  399. if (iVirtualKey == p_keys->camera_move)
  400. return 45;
  401. if (iVirtualKey == p_keys->camera_rotation)
  402. return 46;
  403. if (iVirtualKey == p_keys->pause)
  404. return 47;
  405. return 0;
  406. }
  407. int demo_Fuction2Virtual(int iFunctionKey, CONTROL_KEYS * p_keys)
  408. {
  409. switch (iFunctionKey) {
  410. case 1:
  411. return p_keys->move_forward;
  412. case 2:
  413. return p_keys->turn_back;
  414. case 3:
  415. return p_keys->turn_left;
  416. case 4:
  417. return p_keys->turn_right;
  418. case 5:
  419. return p_keys->next_beatle;
  420. case 6:
  421. return p_keys->inventory;
  422. case 7:
  423. return p_keys->inventory_select;
  424. case 8:
  425. return p_keys->inventory_left;
  426. case 9:
  427. return p_keys->inventory_right;
  428. case 10:
  429. return p_keys->inventory_cancel;
  430. case 11:
  431. return p_keys->camera_move_left;
  432. case 12:
  433. return p_keys->camera_move_right;
  434. case 13:
  435. return p_keys->camera_move_forward;
  436. case 14:
  437. return p_keys->camera_move_back;
  438. case 15:
  439. return p_keys->camera_zoom_in;
  440. case 16:
  441. return p_keys->camera_zoom_out;
  442. case 17:
  443. return p_keys->camera_turn_left;
  444. case 18:
  445. return p_keys->camera_turn_right;
  446. case 19:
  447. return p_keys->camera_turn_up;
  448. case 20:
  449. return p_keys->camera_turn_down;
  450. case 21:
  451. return p_keys->camera_fast_turn_left;
  452. case 22:
  453. return p_keys->camera_fast_turn_right;
  454. case 23:
  455. return p_keys->camera_center;
  456. case 24:
  457. return p_keys->menu;
  458. case 25:
  459. return p_keys->item_lock;
  460. case 26:
  461. return p_keys->blow_detonation_pack;
  462. case 27:
  463. return p_keys->beatle1;
  464. case 28:
  465. return p_keys->beatle2;
  466. case 29:
  467. return p_keys->beatle3;
  468. case 30:
  469. return p_keys->beatle4;
  470. case 31:
  471. return p_keys->beatle5;
  472. case 32:
  473. return p_keys->beatle6;
  474. case 33:
  475. return p_keys->item1;
  476. case 34:
  477. return p_keys->item2;
  478. case 35:
  479. return p_keys->item3;
  480. case 36:
  481. return p_keys->item4;
  482. case 37:
  483. return p_keys->next_song;
  484. case 38:
  485. return p_keys->disable_inventory;
  486. case 39:
  487. return p_keys->disable_top_ledge;
  488. case 40:
  489. return p_keys->screenshot;
  490. case 41:
  491. return p_keys->visibility;
  492. case 42:
  493. return p_keys->hint;
  494. case 43:
  495. return p_keys->restart;
  496. case 44:
  497. return p_keys->highlight;
  498. case 45:
  499. return p_keys->camera_move;
  500. case 46:
  501. return p_keys->camera_rotation;
  502. case 47:
  503. return p_keys->pause;
  504. default:
  505. return 0;
  506. }
  507. }
  508. int demo_Get_Move(int *pos_o, int *pos_n)
  509. {
  510. int x = pos_o[0] - pos_n[0];
  511. int y = pos_o[1] - pos_n[1];
  512. if (x < 0)
  513. return 1;
  514. else if (x > 0)
  515. return 3;
  516. else if (y < 0)
  517. return 0;
  518. else
  519. return 2;
  520. }
  521. int demo_Rotation(int initRot, int finishRot)
  522. {
  523. int rot = initRot - finishRot;
  524. float t[3], fr, fi, di;
  525. int s, ss;
  526. kam_pol_get((BOD *) t, &fr, &fi, &di);
  527. fr = fr / 90.0f;
  528. s = ftoi(fr);
  529. s = s % 4;
  530. if (s > 0)
  531. ss = 4 - s;
  532. else
  533. ss = abs(s);
  534. rot = 4 - (ss - finishRot);
  535. if (rot > 3)
  536. rot = rot % 4;
  537. else
  538. rot = abs(rot);
  539. //kprintf(1, "keyrot = %d, rot = %d", finishRot, rot);
  540. return rot;
  541. }
  542. int demo_Create_Sequence(int *pKeyLine, int iKLSize, DEMOKEYFRAME * pFrame,
  543. char *pBerusky1, int Rotation, CONTROL_KEYS * p_cont, DEMOSTRUCTURE * pDemo,
  544. int *pos_a)
  545. {
  546. int i, c = 0;
  547. if (!pFrame)
  548. return 0;
  549. for (i = 0; i < 3; i++)
  550. if (pFrame->pos_n[i] != -1)
  551. c++;
  552. for (i = 0; i < 3; i++)
  553. if (pFrame->pos_o[i] != -1)
  554. c++;
  555. ZeroMemory(pKeyLine, iKLSize * sizeof(int));
  556. //nejedna se o pokus o pohyb
  557. if (!c) {
  558. pKeyLine[0] = demo_Fuction2Virtual(pFrame->Key, p_cont);
  559. pDemo->p_Last = pFrame->p_Next;
  560. return 1;
  561. }
  562. if (pFrame->bOvladaniBerusek1) {
  563. int rot =
  564. demo_Rotation(Rotation, demo_Get_Move(pFrame->pos_o, pFrame->pos_n));
  565. *pBerusky1 = 1;
  566. if (!rot)
  567. pKeyLine[0] = p_cont->move_forward;
  568. else if (rot == 1)
  569. pKeyLine[0] = p_cont->turn_right;
  570. else if (rot == 2)
  571. pKeyLine[0] = p_cont->turn_back;
  572. else
  573. pKeyLine[0] = p_cont->turn_left;
  574. pDemo->p_Last = pFrame->p_Next;
  575. }
  576. else {
  577. int move = demo_Get_Move(pFrame->pos_o, pFrame->pos_n);
  578. int rot = Rotation - move;
  579. *pBerusky1 = 0;
  580. if (!rot)
  581. pKeyLine[0] = p_cont->move_forward;
  582. else if (abs(rot) == 2) {
  583. pKeyLine[0] = p_cont->turn_back;
  584. pKeyLine[1] = p_cont->move_forward;
  585. }
  586. else if (Rotation - 1 == move || (!Rotation && move == 3)) {
  587. pKeyLine[0] = p_cont->turn_left;
  588. pKeyLine[1] = p_cont->move_forward;
  589. }
  590. else {
  591. pKeyLine[0] = p_cont->turn_right;
  592. pKeyLine[1] = p_cont->move_forward;
  593. }
  594. pDemo->p_Last = pFrame->p_Next;
  595. }
  596. return 1;
  597. }