PageRenderTime 93ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 1ms

/berusky2-0.7/src/kofola/animationk.cpp

#
C++ | 7759 lines | 7738 code | 14 blank | 7 comment | 4 complexity | d82f331121371503673e573cc89f4c85 MD5 | raw file
Possible License(s): GPL-3.0
  1. //------------------------------------------------------------------------------------------------
  2. // version 1.0.1
  3. //------------------------------------------------------------------------------------------------
  4. #include <math.h>
  5. #include "3d_all.h"
  6. #include "Berusky3d_kofola_interface.h"
  7. #include "Berusky3d_light.h"
  8. #include "Berusky3d_kofola2d.h"
  9. #include "game_logic.h"
  10. #include "animationk.h"
  11. #include "animend_functions.h"
  12. #include "water.h"
  13. #include "3d_math.h"
  14. #include "3D_graphic.h"
  15. #include "menu_def.h"
  16. #include "3D_menus.h"
  17. #include "Apak.h"
  18. #define randf() ((float)rand())
  19. extern APAK_HANDLE *pDataArchive;
  20. extern LEVELINFO Level;
  21. extern _3D_CURSOR _3dCur;
  22. extern G_KONFIG ber;
  23. extern AUDIO_DATA ad;
  24. void am_Do_Vodni_Cakanec2(float *pos, int VyskaPadu, int predmet,
  25. LEVELINFO * p_Level);
  26. int am_Find_Water(int i, float *f, LEVELINFO * p_Level);
  27. extern int gl_Choose_Wave_Index(int Plus);
  28. extern void gl_Do_Strepiny_Na_Vode(float *pos, LEVELINFO * p_Level,
  29. float fycor);
  30. static int mx = 0;
  31. static int my = 0;
  32. RECT rDrawRect[DRAW_RECT_NUM];
  33. float am_vzdal_bodu(float x1, float y1, float x2, float y2)
  34. {
  35. return ((float) sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)));
  36. }
  37. float am_vzdal_bodu_single(float x1, float x2)
  38. {
  39. return ((float) sqrt((x2 - x1) * (x2 - x1)));
  40. }
  41. //------------------------------------------------------------------------------------------------
  42. // init animation module
  43. //------------------------------------------------------------------------------------------------
  44. int am_Init(ANIMATION_MODULE * p_am, LEVELINFO * p_Level)
  45. {
  46. FILE *file = NULL;
  47. char text[256];
  48. int i;
  49. pDataArchive->pActualNode = pDataArchive->pRootNode->pNextNode;
  50. p_am->Size_of_Anim = 100;
  51. p_am->p_animation =
  52. (SIM_ANIMATION *) malloc((p_am->Size_of_Anim) * sizeof(SIM_ANIMATION));
  53. if (!p_am->p_animation) {
  54. //MessageBox(p_am->hWnd,"Unable to allocate memory for animatin module","Error",MB_OK);
  55. kprintf(1, "Unable to allocate memory for animatin module");
  56. return 0;
  57. }
  58. else
  59. ZeroMemory(p_am->p_animation,
  60. (p_am->Size_of_Anim) * sizeof(SIM_ANIMATION));
  61. for (i = 0; i < p_am->Size_of_Anim; i++) {
  62. p_am->p_animation[i].flag = 0;
  63. p_am->p_animation[i].p_run = -1;
  64. p_am->p_animation[i].p_matrix = -1;
  65. }
  66. GetPrivateProfileString("game", "data_dir", "c:\\", text, 256, ini_file);
  67. working_file_translate(text, 255);
  68. chdir((text));
  69. pDataArchive->pActualNode = pDataArchive->pRootNode->pNextNode;
  70. file = aopen(pDataArchive, "animload.dat", "r");
  71. if (!file) {
  72. kprintf(1, "animload.dat not found");
  73. return 0;
  74. }
  75. for (i = 0; i < 110; i++)
  76. p_am->sim_anim[i] = -1;
  77. i = 0;
  78. kprintf(1, "Kofola - Nahravam animace...");
  79. while (!aeof(file)) {
  80. if (!agets(text, 256, file))
  81. break;
  82. newline_cut(text);
  83. //kprintf(1, "%s", text);
  84. p_am->sim_anim[i] = sim_nahraj_animaci(pDataArchive, text, 0);
  85. i++;
  86. }
  87. aclose(file);
  88. return 1;
  89. }
  90. //------------------------------------------------------------------------------------------------
  91. // release animation module
  92. //------------------------------------------------------------------------------------------------
  93. void am_Release(ANIMATION_MODULE * p_am, LEVELINFO * p_Level)
  94. {
  95. int i;
  96. for (i = 0; i < 110; i++)
  97. if (p_am->sim_anim[i] != -1) {
  98. kprintf(1, "sim_zrus_animaci[%d], sim = %d", i, p_am->sim_anim[i]);
  99. sim_zrus_animaci(p_am->sim_anim[i]);
  100. }
  101. free((void *) p_am->p_animation);
  102. p_am->Size_of_Anim = 0;
  103. for (i = 0; i < 10; i++)
  104. if (p_Level->ExitSparks[i].System != -1) {
  105. kprintf(1, "ExitSparks[%d], par_zrus %d", i,
  106. p_Level->ExitSparks[i].System);
  107. par_zrus(p_Level->ExitSparks[i].System);
  108. p_Level->ExitSparks[i].System = -1;
  109. }
  110. }
  111. //------------------------------------------------------------------------------------------------
  112. // find free animation item
  113. //------------------------------------------------------------------------------------------------
  114. int am_Find_Free_Animation_Item(ANIMATION_MODULE * p_am)
  115. {
  116. int i;
  117. for (i = 0; i < p_am->Size_of_Anim; i++)
  118. if (p_am->p_animation[i].flag == -1)
  119. return i;
  120. return -1;
  121. }
  122. //------------------------------------------------------------------------------------------------
  123. // get animaton status
  124. //------------------------------------------------------------------------------------------------
  125. int am_Animation_Status(SIM_ANIMATION * p_animation, ANIMATION_MODULE * p_am)
  126. {
  127. if (p_animation->flag == -1) {
  128. if (p_animation->p_run != -1) {
  129. //rani_rozvaz(p_animation->p_run,p_animation->p_matrix);
  130. rani_zrus(p_animation->p_run);
  131. p_animation->p_run = -1;
  132. p_animation->p_matrix = -1;
  133. }
  134. return 0;
  135. }
  136. else
  137. return 1;
  138. }
  139. //------------------------------------------------------------------------------------------------
  140. // pripoji funkci na start animace
  141. //------------------------------------------------------------------------------------------------
  142. void am_Set_Start_Function(SIM_ANIMATION * p_animation, END_FUNKCE pStartf,
  143. int iParam1, int iParam2, void *pParam, int index)
  144. {
  145. p_animation->tStart[index].pProc = pStartf;
  146. p_animation->tStart[index].pParam = pParam;
  147. p_animation->tStart[index].iParam[0] = iParam1;
  148. p_animation->tStart[index].iParam[1] = iParam2;
  149. }
  150. //------------------------------------------------------------------------------------------------
  151. // nastavi spusteni funkce na ucrite misto animace
  152. //------------------------------------------------------------------------------------------------
  153. void am_Set_Triger_Function(SIM_ANIMATION * p_animation, END_FUNKCE pTrigerf,
  154. int iParam1, int iParam2, void *pParam, int flag, int index)
  155. {
  156. p_animation->tTriger[index].pProc = pTrigerf;
  157. p_animation->tTriger[index].pParam = pParam;
  158. p_animation->tTriger[index].iParam[0] = iParam1;
  159. p_animation->tTriger[index].iParam[1] = iParam2;
  160. p_animation->tTriger[index].flag = flag;
  161. }
  162. //------------------------------------------------------------------------------------------------
  163. // nastavi spusteni funkce na ucrite misto animace
  164. //------------------------------------------------------------------------------------------------
  165. void am_Set_aMaterial_Function(SIM_ANIMATION * p_animation, int i,
  166. END_FUNKCE taMateral, int iParam1, int iParam2, void *pParam, int flag)
  167. {
  168. p_animation->taMateral[i].pProc = taMateral;
  169. p_animation->taMateral[i].pParam = pParam;
  170. p_animation->taMateral[i].iParam[0] = iParam1;
  171. p_animation->taMateral[i].iParam[1] = iParam2;
  172. p_animation->taMateral[i].flag = flag;
  173. }
  174. //------------------------------------------------------------------------------------------------
  175. // odebere predmet ke konstantni animaci
  176. //------------------------------------------------------------------------------------------------
  177. void am_Remove_Animate_item(long item, LEVELINFO * p_Level)
  178. {
  179. int i = 0;
  180. while (p_Level->Anim_Item[i] != p_Level->Level[item]->iItem)
  181. i++;
  182. if (p_Level->Item[p_Level->Anim_Item[i]].a_run != -1) {
  183. rani_zrus(p_Level->Item[p_Level->Anim_Item[i]].a_run);
  184. p_Level->Item[p_Level->Anim_Item[i]].a_run = -1;
  185. p_Level->Item[p_Level->Anim_Item[i]].a_flag = -1;
  186. }
  187. i++;
  188. while (p_Level->Anim_Item[i] != -1) {
  189. p_Level->Anim_Item[i - 1] = p_Level->Anim_Item[i];
  190. i++;
  191. }
  192. if (i > 0)
  193. p_Level->Anim_Item[i - 1] = p_Level->Anim_Item[i];
  194. else
  195. p_Level->Anim_Item[0] = -1;
  196. }
  197. //------------------------------------------------------------------------------------------------
  198. // odebere predmet ke konstantni animaci
  199. //------------------------------------------------------------------------------------------------
  200. void am_Remove_Animate_itemB(int iItem, LEVELINFO * p_Level)
  201. {
  202. int i = 0;
  203. while (p_Level->Anim_Item[i] != iItem)
  204. i++;
  205. if (p_Level->Item[p_Level->Anim_Item[i]].a_run != -1) {
  206. rani_zrus(p_Level->Item[p_Level->Anim_Item[i]].a_run);
  207. p_Level->Item[p_Level->Anim_Item[i]].a_run = -1;
  208. p_Level->Item[p_Level->Anim_Item[i]].a_flag = -1;
  209. }
  210. i++;
  211. while (p_Level->Anim_Item[i] != -1) {
  212. p_Level->Anim_Item[i - 1] = p_Level->Anim_Item[i];
  213. i++;
  214. }
  215. if (i > 0)
  216. p_Level->Anim_Item[i - 1] = p_Level->Anim_Item[i];
  217. else
  218. p_Level->Anim_Item[0] = -1;
  219. }
  220. //------------------------------------------------------------------------------------------------
  221. // prida predmet ke konstantni animaci
  222. //------------------------------------------------------------------------------------------------
  223. void am_Add_Animate_Item(long item, LEVELINFO * p_Level)
  224. {
  225. // int iPos[3];
  226. // float pos[3];
  227. int i = 0; //, rot;
  228. while (p_Level->Anim_Item[i] != -1)
  229. i++;
  230. p_Level->Anim_Item[i] = p_Level->Level[item]->iItem;
  231. p_Level->Anim_Item[i + 1] = -1;
  232. /* memcpy((void *) iPos, (void *) p_Level->Level[item]->Pos, 3*sizeof(int));
  233. iPos[2]--;
  234. gl_Logical2Real(iPos[0], iPos[1], iPos[2], &rot, p_Level);
  235. if(p_Level->Level[rot])
  236. if(p_Level->Level[rot]->p_Object->Class == 12)
  237. {
  238. kom_mesh_get_float(p_Level->Level[item]->Index_Of_Game_Mesh,
  239. &pos[0], &pos[1], &pos[2], &rot);
  240. am_Kola_na_VodeB(pos, 1, -1, 1, p_Level);
  241. }*/
  242. }
  243. //------------------------------------------------------------------------------------------------
  244. // prida predmet ke konstantni animaci
  245. //------------------------------------------------------------------------------------------------
  246. void am_Add_Animate_ItemB(int iItem, LEVELINFO * p_Level)
  247. {
  248. // int iPos[3];
  249. // float pos[3];
  250. int i = 0; //, rot;
  251. while (p_Level->Anim_Item[i] != -1)
  252. i++;
  253. p_Level->Anim_Item[i] = iItem;
  254. p_Level->Anim_Item[i + 1] = -1;
  255. /* memcpy((void *) iPos, (void *) p_Level->Item[iItem].Pos, 3*sizeof(int));
  256. iPos[2]--;
  257. gl_Logical2Real(iPos[0], iPos[1], iPos[2], &rot, p_Level);
  258. if(p_Level->Level[rot])
  259. if(p_Level->Level[rot]->p_Object->Class == 12)
  260. {
  261. kom_mesh_get_float(p_Level->Item[iItem].Index_Of_Game_Mesh,
  262. &pos[0], &pos[1], &pos[2], &rot);
  263. am_Kola_na_VodeB(pos, 1, -1, 1, p_Level);
  264. }*/
  265. }
  266. //------------------------------------------------------------------------------------------------
  267. // animuje predmety
  268. //------------------------------------------------------------------------------------------------
  269. void am_Animate_Items(ANIMATION_MODULE * p_am, LEVELINFO * p_Level)
  270. {
  271. int i = 0;
  272. ITEMDESC *p_item;
  273. while (p_Level->Anim_Item[i] != -1) {
  274. if (p_Level->Item[p_Level->Anim_Item[i]].a_flag == -1) {
  275. p_item = &p_Level->Item[p_Level->Anim_Item[i]];
  276. if (p_item->a_run != -1) {
  277. rani_zrus(p_item->a_run);
  278. p_item->a_run = -1;
  279. }
  280. p_item->a_run =
  281. rani_aktivuj(p_am->sim_anim[34], &p_item->a_flag, GK_LOOP, 0, 0);
  282. if (p_item->a_run != -1) {
  283. rani_privaz_mesh(p_item->a_run, p_item->Index_Of_Game_Mesh, 0);
  284. p_item->a_flag = 0;
  285. }
  286. }
  287. i++;
  288. if (i > p_Level->Count_Of_Items)
  289. return;
  290. }
  291. }
  292. //------------------------------------------------------------------------------------------------
  293. // animuje predmety
  294. //------------------------------------------------------------------------------------------------
  295. void am_Release_Animate_Items(ANIMATION_MODULE * p_am, LEVELINFO * p_Level)
  296. {
  297. int i = 0;
  298. ITEMDESC *p_item;
  299. while (p_Level->Anim_Item[i] != -1) {
  300. kprintf(1, "am_Release_Animate_Items - p_Level->Anim_Item[%d]", i);
  301. p_item = &p_Level->Item[p_Level->Anim_Item[i]];
  302. if (p_item->a_run != -1) {
  303. kprintf(1, "rani_zrus...");
  304. rani_zrus(p_item->a_run);
  305. p_item->a_run = -1;
  306. }
  307. i++;
  308. }
  309. }
  310. void am_Set_aMaterial_Trigers(SIM_ANIMATION * p_animation, ITEMDESC * p_Item,
  311. LEVELINFO * p_Level)
  312. {
  313. int i;
  314. for (i = 0; i < 3; i++)
  315. if (p_Item->p_Object->MatEvent[i].cType == 1)
  316. am_Set_aMaterial_Function(p_animation, i, anmend_Send_Event,
  317. p_Item->mMaterial->handle_materialove_animace, 0, 0,
  318. p_Item->p_Object->MatEvent[i].iFlag);
  319. else if (p_Item->p_Object->MatEvent[i].cType == 2)
  320. am_Set_aMaterial_Function(p_animation, i, anmend_Send_Event,
  321. p_Item->mMaterial->handle_materialove_animace, 0, 0, -1);
  322. else if (!p_Item->p_Object->MatEvent[i].cType)
  323. am_Set_aMaterial_Function(p_animation, i, NULL, 0, 0, 0, -1);
  324. }
  325. void am_Set_Beetle_Switching(LEVELINFO * p_Level, int mesh, int bSwitch)
  326. {
  327. int i;
  328. for (i = 0; i < 6; i++)
  329. if (p_Level->BeetleAnim[i].Mesh == mesh) {
  330. p_Level->BeetleAnim[i].bSwitch = bSwitch;
  331. return;
  332. }
  333. return;
  334. }
  335. void am_Play_Beatle_Sound(BEETLEANIMATION * p_anim, int mesh, int idx)
  336. {
  337. float pos[3];
  338. int rot;
  339. kom_mesh_get_float(mesh, &pos[0], &pos[1], &pos[2], &rot);
  340. p_anim->iSound = ap_Play_Sound(0, 0, 0, pos, idx + (rand()%3), NULL, &ad);
  341. p_anim->dwTime = timeGetTime();
  342. }
  343. void am_Do_Beatle_Cakanec(int mesh, LEVELINFO * p_Level, int id)
  344. {
  345. int iPos[3], r;
  346. float pos[3], fPos[3];
  347. int real;
  348. if (p_Level->bUnderWaterLevel)
  349. return;
  350. kom_mesh_get_float(mesh, &pos[0], &pos[1], &pos[2], &r);
  351. iPos[0] = ftoi((pos[0] - ber.x_start - X_PRVEK / 2) / X_PRVEK);
  352. iPos[2] = ftoi(((pos[1] - ber.y_start - Y_PRVEK / 2) / Y_PRVEK) * 2);
  353. iPos[1] = ftoi((pos[2] - ber.z_start - Z_PRVEK / 2) / Z_PRVEK);
  354. if (iPos[0] < 0 || iPos[1] < 0 || iPos[2] < 0 ||
  355. iPos[0] >= p_Level->Size[0] ||
  356. iPos[1] >= p_Level->Size[1] || iPos[2] >= p_Level->Size[2])
  357. return;
  358. gl_Logical2Real(iPos[0], iPos[1], iPos[2], &real, p_Level);
  359. if (p_Level->Level[real])
  360. if (p_Level->Level[real]->p_Object->Class == 12) {
  361. fPos[0] = pos[0];
  362. fPos[1] = pos[1] - 1;
  363. fPos[2] = pos[2];
  364. if (!id) {
  365. am_Kola_na_Vode(fPos, 1, 4, 0, p_Level);
  366. ap_Play_Sound(0,0,0, pos, 74+(rand()%3), NULL, &ad);
  367. }
  368. else {
  369. pos[1] += -0.7f;
  370. am_Do_Vodni_Cakanec1(pos, 4, 0, p_Level);
  371. //am_Do_Vodni_Cakanec2(pos, 4, 0, p_Level);
  372. ap_Play_Sound(0,0,0, pos, 40+(rand()%4), NULL, &ad);
  373. }
  374. }
  375. }
  376. void am_Animate_Beetle(LEVELINFO * p_Level, int i)
  377. {
  378. int r;
  379. switch (p_Level->BeetleAnim[i].iID) {
  380. case 3:
  381. case 4:
  382. case 5:
  383. case 6:
  384. case 7:
  385. case 8:
  386. lani_set(p_Level->BeetleAnim[i].Mesh, 0, 0,
  387. &p_Level->BeetleAnim[i].Flag, 0, 0, 0);
  388. p_Level->BeetleAnim[i].iAnimCount++;
  389. return;
  390. case 2:
  391. r = rand() % 8;
  392. lani_set(p_Level->BeetleAnim[i].Mesh, 0, 2 + r,
  393. &p_Level->BeetleAnim[i].Flag, 0, 0, 0);
  394. p_Level->BeetleAnim[i].iAnimCount++;
  395. return;
  396. case 0:
  397. r = rand() % 12;
  398. lani_set(p_Level->BeetleAnim[i].Mesh, 0, 3 + r,
  399. &p_Level->BeetleAnim[i].Flag, 0, 0, 0);
  400. if (p_Level->BeetleAnim[i].iAnimCount) {
  401. if (r == 4) // pada
  402. am_Play_Beatle_Sound(&p_Level->BeetleAnim[i],
  403. p_Level->BeetleAnim[i].Mesh, 165);
  404. else if (r == 5) // salto
  405. {
  406. am_Play_Beatle_Sound(&p_Level->BeetleAnim[i],
  407. p_Level->BeetleAnim[i].Mesh, 168);
  408. p_Level->BeetleAnim[i].iEffect = 1;
  409. p_Level->BeetleAnim[i].iEffectCounter = 0;
  410. }
  411. else if (r == 11) // meditace
  412. am_Play_Beatle_Sound(&p_Level->BeetleAnim[i],
  413. p_Level->BeetleAnim[i].Mesh, 171);
  414. }
  415. p_Level->BeetleAnim[i].iAnimCount++;
  416. return;
  417. }
  418. kprintf(1, "Nemuzu animovat brouka! ID = %d", p_Level->BeetleAnim[i].iID);
  419. }
  420. void am_Animate_Beetles(LEVELINFO * p_Level)
  421. {
  422. DWORD time = timeGetTime();
  423. int i, r, x;
  424. for (i = 0; i < 6; i++)
  425. if (p_Level->BeetleAnim[i].Mesh != -1
  426. && p_Level->BeetleAnim[i].Flag == -1) {
  427. //jedu na starem cekani ... a tak to musi zustat
  428. /*if(p_Level->BeetleAnim[i].iID == 2)
  429. {
  430. kom_mesh_set_mesh(p_Level->BeetleAnim[i].Mesh, 2, p_Level->BeetleAnim[i].iRot);
  431. r = rand()%8;
  432. lani_set(p_Level->BeetleAnim[i].Mesh, 0, 2 + r, &p_Level->BeetleAnim[i].Flag,0,0,0);
  433. }
  434. else */
  435. if (gl_Check_Mesh_Sim(p_Level->BeetleAnim[i].Mesh)) //brouk se animuje -> nemuzu prepinat meshe
  436. am_Animate_Beetle(p_Level, i);
  437. else {
  438. r = (rand() % 10);
  439. /*
  440. r <0-6> nejcastejsi cekani
  441. r <7-8> ridke cekani
  442. r <9> stare cekani
  443. */
  444. if (time - p_Level->BeetleAnim[i].dwTime > 180000 && !(rand() % 2)) {
  445. p_Level->BeetleAnim[i].dwTime = time;
  446. r = 7;
  447. }
  448. if (r < 7) {
  449. x = (rand() % 6);
  450. kom_mesh_set_mesh(p_Level->BeetleAnim[i].Mesh, 3 + x,
  451. p_Level->BeetleAnim[i].iRot);
  452. p_Level->BeetleAnim[i].iID = 3 + x;
  453. lani_set(p_Level->BeetleAnim[i].Mesh, 0, 0,
  454. &p_Level->BeetleAnim[i].Flag, 0, 0, 0);
  455. p_Level->BeetleAnim[i].iAnimCount++;
  456. }
  457. else if (r > 6) {
  458. kom_mesh_set_mesh(p_Level->BeetleAnim[i].Mesh, 0,
  459. p_Level->BeetleAnim[i].iRot);
  460. p_Level->BeetleAnim[i].iID = 0;
  461. x = rand() % 12;
  462. lani_set(p_Level->BeetleAnim[i].Mesh, 0, 3 + x,
  463. &p_Level->BeetleAnim[i].Flag, 0, 0, 0);
  464. if (p_Level->BeetleAnim[i].iAnimCount) {
  465. if (x == 4) // pada
  466. am_Play_Beatle_Sound(&p_Level->BeetleAnim[i],
  467. p_Level->BeetleAnim[i].Mesh, 165);
  468. else if (x == 5) // salto
  469. {
  470. am_Play_Beatle_Sound(&p_Level->BeetleAnim[i],
  471. p_Level->BeetleAnim[i].Mesh, 168);
  472. p_Level->BeetleAnim[i].iEffect = 1;
  473. p_Level->BeetleAnim[i].iEffectCounter = 0;
  474. }
  475. else if (x == 11) // meditace
  476. am_Play_Beatle_Sound(&p_Level->BeetleAnim[i],
  477. p_Level->BeetleAnim[i].Mesh, 171);
  478. }
  479. p_Level->BeetleAnim[i].iAnimCount++;
  480. }
  481. /*else
  482. {
  483. kom_mesh_set_mesh(p_Level->BeetleAnim[i].Mesh, 2, p_Level->BeetleAnim[i].iRot);
  484. p_Level->BeetleAnim[i].iID = 2;
  485. x = rand()%8;
  486. lani_set(p_Level->BeetleAnim[i].Mesh, 0, 2 + x, &p_Level->BeetleAnim[i].Flag,0,0,0);
  487. } */
  488. }
  489. }
  490. else
  491. if (p_Level->BeetleAnim[i].Mesh != -1
  492. && p_Level->BeetleAnim[i].Flag != -1
  493. && p_Level->BeetleAnim[i].iEffect) {
  494. if (!p_Level->BeetleAnim[i].iEffectCounter) {
  495. am_Do_Beatle_Cakanec(p_Level->BeetleAnim[i].Mesh, p_Level, 0);
  496. p_Level->BeetleAnim[i].iEffectCounter++;
  497. }
  498. else if (p_Level->BeetleAnim[i].Flag >= 10) {
  499. p_Level->BeetleAnim[i].iEffect = 0;
  500. am_Do_Beatle_Cakanec(p_Level->BeetleAnim[i].Mesh, p_Level, 1);
  501. p_Level->BeetleAnim[i].iEffectCounter = 0;
  502. }
  503. }
  504. }
  505. void am_Remove_Beetle_Animation(int mesh, LEVELINFO * p_Level)
  506. {
  507. int i;
  508. for (i = 0; i < 6; i++)
  509. if (p_Level->BeetleAnim[i].Mesh == mesh) {
  510. lani_set(p_Level->BeetleAnim[i].Mesh, 0, K_CHYBA,
  511. &p_Level->BeetleAnim[i].Flag, 0, 0, 0);
  512. kom_mesh_set_mesh(mesh, 0, p_Level->BeetleAnim[i].iRot);
  513. //kprintf(1, "am_Remove_Beetle_Animation set na je %d", p_Level->BeetleAnim[i].iRot);
  514. p_Level->BeetleAnim[i].Mesh = -1;
  515. p_Level->BeetleAnim[i].iID = 0;
  516. /*
  517. if(timeGetTime() - p_Level->BeetleAnim[i].dwTime < 1000 && p_Level->BeetleAnim[i].iSound != -1)
  518. adas_Release_Source(PARTICULAR_SOUND_SOURCE, UNDEFINED_VALUE, p_Level->BeetleAnim[i].iSound);
  519. */
  520. p_Level->BeetleAnim[i].iSound = -1;
  521. return;
  522. }
  523. }
  524. void am_Correct_Beetle_Animation(int mesh, LEVELINFO * p_Level, int rot)
  525. {
  526. int i;
  527. for (i = 0; i < 6; i++)
  528. if (p_Level->BeetleAnim[i].Mesh == mesh) {
  529. p_Level->BeetleAnim[i].iRot = rot;
  530. return;
  531. }
  532. }
  533. int am_Add_Beetle_Animation(int mesh, LEVELINFO * p_Level, int iRot,
  534. char bExeption)
  535. {
  536. int i;
  537. for (i = 0; i < 6; i++)
  538. if (p_Level->BeetleAnim[i].Mesh == mesh)
  539. return 0;
  540. if (gl_Check_Mesh_Sim(mesh) && !bExeption)
  541. return 0;
  542. for (i = 0; i < 6; i++)
  543. if (p_Level->BeetleAnim[i].Mesh == -1) {
  544. lani_set(mesh, 0, K_CHYBA, &p_Level->BeetleAnim[i].Flag, 0, 0, 0);
  545. p_Level->BeetleAnim[i].Mesh = mesh;
  546. p_Level->BeetleAnim[i].Flag = -1;
  547. p_Level->BeetleAnim[i].iRot = iRot;
  548. // kom_mesh_set_mesh(mesh, 2, iRot);
  549. p_Level->BeetleAnim[i].dwTime = timeGetTime();
  550. p_Level->BeetleAnim[i].iAnimCount = 1;
  551. p_Level->BeetleAnim[i].iSound = -1;
  552. p_Level->BeetleAnim[i].iEffect = 0;
  553. p_Level->BeetleAnim[i].iEffectCounter = 0;
  554. return 1;
  555. }
  556. return 0;
  557. }
  558. void am_Stop_Beetle_Animations(LEVELINFO * p_Level)
  559. {
  560. int i;
  561. for (i = 0; i < 6; i++)
  562. if (p_Level->BeetleAnim[i].Mesh != -1) {
  563. //kprintf(1, "lani_set[%d], mesh = %d", i, p_Level->BeetleAnim[i].Mesh);
  564. lani_set(p_Level->BeetleAnim[i].Mesh, 0, K_CHYBA,
  565. &p_Level->BeetleAnim[i].Flag, 0, 0, 0);
  566. p_Level->BeetleAnim[i].Mesh = -1;
  567. }
  568. }
  569. void am_Init_Zhave_Castice(LEVELINFO * p_Level)
  570. {
  571. int i, j;
  572. p_Level->BublSystemE.System.System = -1;
  573. p_Level->BublSystemE.System.pCastice = NULL;
  574. p_Level->BublSystemC.System.System = -1;
  575. p_Level->BublSystemC.System.pCastice = NULL;
  576. for (i = 0; i < 10; i++) {
  577. p_Level->KourUst[i].pCastice = NULL;
  578. p_Level->KourUst[i].System = -1;
  579. for (j = 0; j < 64; j++)
  580. p_Level->BublVybuch[i].hHnizdo[j] = 0;
  581. }
  582. for (i = 0; i < 20; i++) {
  583. p_Level->TeleportSparks[i].pCastice = NULL;
  584. p_Level->TeleportSparks[i].System = -1;
  585. p_Level->ZhaveCastice[i].System.pCastice = NULL;
  586. p_Level->KourovaStopa[i].pCastice = NULL;
  587. p_Level->KourovaStopa[i].System = -1;
  588. p_Level->Kour[i].pCastice = NULL;
  589. p_Level->Kour[i].System = -1;
  590. p_Level->KourKameni[i].pCastice = NULL;
  591. p_Level->KourKameni[i].System = -1;
  592. p_Level->BublVybuch[i].pCastice = NULL;
  593. p_Level->BublVybuch[i].System = -1;
  594. for (j = 0; j < 64; j++) {
  595. p_Level->ZhaveCastice[i].hSvetlo[j] = -1;
  596. p_Level->ZhaveCastice[i].hFlare[j] = -1;
  597. p_Level->KourovaStopa[i].hHnizdo[j] = 0;
  598. p_Level->Kour[i].hHnizdo[j] = 0;
  599. p_Level->KourKameni[i].hHnizdo[j] = 0;
  600. p_Level->BublVybuch[i].hHnizdo[j] = 0;
  601. p_Level->TeleportSparks[i].hHnizdo[j] = 0;
  602. }
  603. }
  604. for (i = 0; i < 30; i++) {
  605. p_Level->BarelSparks[i].pCastice = NULL;
  606. p_Level->BarelSparks[i].System = -1;
  607. for (j = 0; j < 64; j++)
  608. p_Level->BarelSparks[i].hHnizdo[j] = 0;
  609. }
  610. for (i = 0; i < 10; i++) {
  611. p_Level->LiftParticles[i].pCastice = NULL;
  612. p_Level->LiftParticles[i].System = -1;
  613. p_Level->VodniKola[i].pCastice = NULL;
  614. p_Level->VodniKola[i].System = -1;
  615. p_Level->LiftVParticles[i].pCastice = NULL;
  616. p_Level->LiftVParticles[i].System = -1;
  617. p_Level->ExitEfect[i].hSvetlo = -1;
  618. p_Level->ExitEfect[i].System.System = -1;
  619. p_Level->ExitEfect[i].hEXSvetlo[0] = -1;
  620. p_Level->ExitEfect[i].hEXSvetlo[1] = -1;
  621. p_Level->ExitEfect[i].System.hHnizdo[0] = 0;
  622. p_Level->ExitEfect[i].System.hHnizdo[1] = 0;
  623. p_Level->ExitSparks[i].pCastice = NULL;
  624. p_Level->ExitSparks[i].System = -1;
  625. p_Level->TelCSparks[i].pCastice = NULL;
  626. p_Level->TelCSparks[i].System = -1;
  627. p_Level->NatureESystem[i].pCastice = NULL;
  628. p_Level->NatureESystem[i].pSystem = -1;
  629. p_Level->NatureESystem[i].hHnizdo = 0;
  630. p_Level->NatureESystem[i].EffectID = 0;
  631. for (j = 0; j < 64; j++) {
  632. p_Level->LiftParticles[i].hHnizdo[j] = 0;
  633. p_Level->LiftVParticles[i].hHnizdo[j] = 0;
  634. p_Level->VodniKola[i].hHnizdo[j] = 0;
  635. p_Level->ExitSparks[i].hHnizdo[j] = 0;
  636. p_Level->TelCSparks[i].hHnizdo[j] = 0;
  637. }
  638. }
  639. for (i = 0; i < 100; i++) {
  640. p_Level->VodniKolaB[i].pCastice = NULL;
  641. p_Level->VodniKolaB[i].System = -1;
  642. for (j = 0; j < 64; j++)
  643. p_Level->VodniKola[i].hHnizdo[j] = 0;
  644. }
  645. for (i = 0; i < 6; i++) {
  646. p_Level->BublSystem[i].System.System = -1;
  647. p_Level->BublSystem[i].iStart =
  648. (int) ceil((randf() / (float) RAND_MAX) * 3000);
  649. for (j = 0; j < 64; j++) {
  650. p_Level->BublSystem[i].System.hHnizdo[j] = 0;
  651. }
  652. }
  653. for (i = 0; i < 8; i++)
  654. memset(&p_Level->StreetL[i], 0, sizeof(STREET_LIGHT_EFFECT));
  655. for (i = 0; i < 10; i++)
  656. memset(&p_Level->SwampL[i], 0, sizeof(STREET_LIGHT_EFFECT));
  657. for (i = 0; i < 200; i++)
  658. memset(&p_Level->StarL[i], 0, sizeof(STREET_LIGHT_EFFECT));
  659. for (i = 0; i < 2; i++) {
  660. memset(&p_Level->StarFall[i], 0, sizeof(FAIRY_EFFECT));
  661. p_Level->StarFall[i].pSystem = -1;
  662. }
  663. for (i = 0; i < 6; i++) {
  664. memset(&p_Level->CandleEffect[i], 0, sizeof(CANDLE_EFFECT));
  665. p_Level->CandleEffect[i].pSystem = -1;
  666. p_Level->CandleEffect[i].hSvetlo = -1;
  667. memset(&p_Level->CandleSmoke[i], 0, sizeof(CANDLE_EFFECT));
  668. p_Level->CandleSmoke[i].pSystem = -1;
  669. p_Level->CandleSmoke[i].hSvetlo = -1;
  670. }
  671. for (i = 0; i < 4; i++) {
  672. memset(&p_Level->FairyEffect[i], 0, sizeof(FAIRY_EFFECT));
  673. p_Level->FairyEffect[i].pSystem = -1;
  674. }
  675. }
  676. void am_Obsluha_Koure(int i, LEVELINFO * p_Level)
  677. {
  678. DWORD dwTime, dwEplased;
  679. int j;
  680. if (p_Level->Kour[i].System != -1) {
  681. dwTime = timeGetTime();
  682. dwEplased = dwTime - p_Level->Kour[i].dwStart;
  683. if (dwEplased > 1000)
  684. for (j = 0; j < p_Level->Kour[i].Sizeof; j++)
  685. if (p_Level->Kour[i].hHnizdo[j]) {
  686. par_vloz_hnizdo_pivot(p_Level->Kour[i].hHnizdo[j], NULL);
  687. p_Level->Kour[i].hHnizdo[j] = 0;
  688. }
  689. if (!par_get_hnizda(p_Level->Kour[i].System)) {
  690. par_zrus(p_Level->Kour[i].System);
  691. p_Level->Kour[i].System = -1;
  692. }
  693. }
  694. }
  695. void am_Obsluha_Koure_Kameni(int i, LEVELINFO * p_Level)
  696. {
  697. DWORD dwTime, dwEplased;
  698. int j;
  699. if (p_Level->KourKameni[i].System != -1) {
  700. dwTime = timeGetTime();
  701. dwEplased = dwTime - p_Level->KourKameni[i].dwStart;
  702. if (dwEplased > 1000)
  703. for (j = 0; j < p_Level->KourKameni[i].Sizeof; j++)
  704. if (p_Level->KourKameni[i].hHnizdo[j]) {
  705. par_vloz_hnizdo_pivot(p_Level->KourKameni[i].hHnizdo[j], NULL);
  706. p_Level->KourKameni[i].hHnizdo[j] = 0;
  707. }
  708. if (!par_get_hnizda(p_Level->KourKameni[i].System)) {
  709. par_zrus(p_Level->KourKameni[i].System);
  710. p_Level->KourKameni[i].System = -1;
  711. }
  712. }
  713. }
  714. void am_Do_Zhave_castice(LEVELINFO * p_Level)
  715. {
  716. int i, j;
  717. SYSTEMZHAVYCHCASTIC *pSystem;
  718. DWORD dwTime, dwEplased;
  719. for (i = 0; i < 20; i++) {
  720. if (p_Level->ZhaveCastice[i].System.pCastice) {
  721. pSystem = &p_Level->ZhaveCastice[i];
  722. for (j = 0; j < pSystem->System.Sizeof; j++)
  723. if (!pSystem->System.pCastice[j].aktivni) {
  724. if (pSystem->hSvetlo[j] != -1) {
  725. sdl_svetlo_zrus(pSystem->hSvetlo[j]);
  726. pSystem->hSvetlo[j] = -1;
  727. }
  728. if (pSystem->hFlare[j] != -1) {
  729. kom_flare_zrus(pSystem->hFlare[j]);
  730. pSystem->hFlare[j] = -1;
  731. }
  732. if (pSystem->iKourStopa >= 0) {
  733. if (p_Level->KourovaStopa[pSystem->iKourStopa].hHnizdo[j]) {
  734. dwTime = timeGetTime();
  735. dwEplased =
  736. dwTime - p_Level->KourovaStopa[pSystem->iKourStopa].dwStart;
  737. if (dwEplased < 100)
  738. par_zrus_hnizdo(p_Level->KourovaStopa[pSystem->iKourStopa].
  739. System,
  740. p_Level->KourovaStopa[pSystem->iKourStopa].hHnizdo[j]);
  741. else
  742. par_vloz_hnizdo_pivot(p_Level->KourovaStopa[pSystem->
  743. iKourStopa].hHnizdo[j], NULL);
  744. p_Level->KourovaStopa[pSystem->iKourStopa].hHnizdo[j] = 0;
  745. }
  746. }
  747. }
  748. else
  749. sdl_svetlo_set_pos(pSystem->hSvetlo[j],
  750. (BOD *) & pSystem->System.pCastice[j].p);
  751. }
  752. if (p_Level->KourovaStopa[i].System != -1)
  753. if (!par_get_hnizda(p_Level->KourovaStopa[i].System)) {
  754. par_zrus(p_Level->KourovaStopa[i].System);
  755. p_Level->KourovaStopa[i].System = -1;
  756. }
  757. //obslouzeni kouru
  758. am_Obsluha_Koure(i, p_Level);
  759. //obslouzeni koure do kamenech
  760. am_Obsluha_Koure_Kameni(i, p_Level);
  761. }
  762. }
  763. void am_Release_Zhave_castice(SYSTEMZHAVYCHCASTIC * pSystem)
  764. {
  765. int i;
  766. pSystem->System.pCastice = NULL;
  767. for (i = 0; i < 32; i++) {
  768. if (pSystem->hSvetlo[i] != -1) {
  769. sdl_svetlo_zrus(pSystem->hSvetlo[i]);
  770. pSystem->hSvetlo[i] = -1;
  771. }
  772. if (pSystem->hFlare[i] != -1) {
  773. kom_flare_zrus(pSystem->hFlare[i]);
  774. pSystem->hFlare[i] = -1;
  775. }
  776. }
  777. }
  778. void am_Release_Kourove_Castice(SYSTEMKOUROVYCHCASTIC * pSystem)
  779. {
  780. int i;
  781. pSystem->pCastice = NULL;
  782. for (i = 0; i < 64; i++) {
  783. if (pSystem->hHnizdo[i]) {
  784. par_vloz_hnizdo_pivot(pSystem->hHnizdo[i], NULL);
  785. pSystem->hHnizdo[i] = 0;
  786. }
  787. }
  788. }
  789. void am_Change_Wind(LEVELINFO * p_Level)
  790. {
  791. float f;
  792. p_Level->fVitr[0] = rand() & 0x1 ? randf() : -randf();
  793. p_Level->fVitr[1] = rand() & 0x1 ? randf() : -randf();
  794. p_Level->fVitr[2] = rand() & 0x1 ? randf() : -randf();
  795. vektor_norm((BOD *) p_Level->fVitr);
  796. f = (randf() / (float) (RAND_MAX)) * (_3DKOREKCE / 2.0f);
  797. p_Level->fVitr[0] *= f / 30.0f;
  798. p_Level->fVitr[1] *= f / 50.0f;
  799. p_Level->fVitr[2] *= f / 30.0f;
  800. }
  801. void am_Obsluha_Teleportacnich_Jisker(int i, LEVELINFO * p_Level)
  802. {
  803. PAR_KOUR_STOPA *pCastice;
  804. DWORD dwTime, dwEplased;
  805. int j, r;
  806. float f;
  807. if (p_Level->TeleportSparks[i].System != -1) {
  808. dwTime = timeGetTime();
  809. dwEplased = dwTime - p_Level->TeleportSparks[i].dwStart;
  810. if (!p_Level->bGameResume)
  811. p_Level->TeleportSparks[i].dwTime += ber.TimeLastFrame;
  812. if (dwEplased > 30000)
  813. for (j = 0; j < p_Level->TeleportSparks[i].Sizeof; j++)
  814. if (p_Level->TeleportSparks[i].hHnizdo[j]) {
  815. par_zrus_hnizdo(p_Level->TeleportSparks[i].System,
  816. p_Level->TeleportSparks[i].hHnizdo[j]);
  817. p_Level->TeleportSparks[i].hHnizdo[j] = 0;
  818. }
  819. //mihotani jisker
  820. if (p_Level->TeleportSparks[i].dwTime > 100) {
  821. for (j = 0; j < p_Level->TeleportSparks[i].Sizeof; j++)
  822. if (p_Level->TeleportSparks[i].hHnizdo[j]) {
  823. pCastice =
  824. par_cti_hnizdo_castice(p_Level->TeleportSparks[i].hHnizdo[j]);
  825. if (pCastice) {
  826. while (pCastice) {
  827. if (pCastice->rychlost_x > 0.01f &&
  828. pCastice->rychlost_y > 0.01f) {
  829. r = rand() % 100;
  830. if (r < 10) {
  831. f = (randf() / (float) (RAND_MAX)) / 7.5f;
  832. pCastice->rychlost_x += f;
  833. pCastice->rychlost_y += f;
  834. }
  835. }
  836. else
  837. pCastice->a = 0;
  838. pCastice = pCastice->p_next;
  839. }
  840. }
  841. }
  842. p_Level->TeleportSparks[i].dwTime = 0;
  843. }
  844. if (!par_get_hnizda(p_Level->TeleportSparks[i].System)) {
  845. par_zrus(p_Level->TeleportSparks[i].System);
  846. p_Level->TeleportSparks[i].System = -1;
  847. }
  848. }
  849. }
  850. void am_Do_Flares(LEVELINFO * p_Level)
  851. {
  852. int i, j;
  853. LENS_FLARE *pFlare;
  854. DWORD dwTime, dwEplased;
  855. float koef = ber.TimeLastFrame / 1000.0f;
  856. dwTime = timeGetTime();
  857. for (i = 0; i < 20; i++)
  858. if (p_Level->Flare[i].pFlare) {
  859. dwEplased = dwTime - p_Level->Flare[i].dwStart;
  860. if (dwEplased > 1000) {
  861. //pokud se napodarilo prvek presunout v terminu (500 ms) udelej to ted
  862. if (p_Level->Flare[i].Item) {
  863. (anmend_Teleport) ((int) p_Level->Flare[i].Item,
  864. p_Level->Flare[i].Teleport, p_Level->Flare[i].pPointer);
  865. p_Level->Flare[i].Item = NULL;
  866. p_Level->Flare[i].Teleport = -1;
  867. }
  868. kom_flare_zrus(p_Level->Flare[i].pFlare);
  869. p_Level->Flare[i].pFlare = 0;
  870. if (p_Level->Flare[i].hSvetlo != -1) {
  871. sdl_svetlo_zrus(p_Level->Flare[i].hSvetlo);
  872. p_Level->Flare[i].hSvetlo = -1;
  873. }
  874. if (p_Level->Flare[i].hEXSvetlo != -1) {
  875. edl_svetlo_zrus(p_Level->Flare[i].hEXSvetlo);
  876. p_Level->Flare[i].hEXSvetlo = -1;
  877. }
  878. }
  879. else if (dwEplased > 500) {
  880. //proved teleportaci, pokud je zapsan predmet
  881. if (p_Level->Flare[i].Item) {
  882. (anmend_Teleport) ((int) p_Level->Flare[i].Item,
  883. p_Level->Flare[i].Teleport, p_Level->Flare[i].pPointer);
  884. p_Level->Flare[i].Item = NULL;
  885. p_Level->Flare[i].Teleport = -1;
  886. }
  887. pFlare = kom_flare_get_pointer(p_Level->Flare[i].pFlare);
  888. pFlare->dx -= p_Level->Flare[i].mSpeed * koef;
  889. pFlare->dy -= p_Level->Flare[i].mSpeed * koef;
  890. for (j = 0; j < 14; j++)
  891. if (pFlare->p_sloz[j].vzdal) {
  892. pFlare->p_sloz[j].dx -= p_Level->Flare[i].Speed[j] * koef;
  893. pFlare->p_sloz[j].dy -= p_Level->Flare[i].Speed[j] * koef;
  894. }
  895. else
  896. break;
  897. }
  898. else {
  899. pFlare = kom_flare_get_pointer(p_Level->Flare[i].pFlare);
  900. pFlare->dx += p_Level->Flare[i].mSpeed * koef;
  901. pFlare->dy += p_Level->Flare[i].mSpeed * koef;
  902. for (j = 0; j < 14; j++)
  903. if (pFlare->p_sloz[j].vzdal) {
  904. pFlare->p_sloz[j].dx += p_Level->Flare[i].Speed[j] * koef;
  905. pFlare->p_sloz[j].dy += p_Level->Flare[i].Speed[j] * koef;
  906. }
  907. else
  908. break;
  909. }
  910. }
  911. for (i = 0; i < 20; i++)
  912. am_Obsluha_Teleportacnich_Jisker(i, p_Level);
  913. }
  914. void am_Do_LiftVParticies(int i, LEVELINFO * p_Level)
  915. {
  916. int r;
  917. float f, pos[3];
  918. DWORD dwTime, dwEplased;
  919. PARMETAC_HNIZDO *pHnizdo;
  920. dwTime = timeGetTime();
  921. if (p_Level->LiftVParticles[i].System != -1) {
  922. dwEplased = dwTime - p_Level->LiftVParticles[i].dwStart;
  923. if (dwEplased > 200000) {
  924. par_zrus(p_Level->LiftVParticles[i].System);
  925. p_Level->LiftVParticles[i].System = -1;
  926. }
  927. else {
  928. if (!p_Level->bGameResume)
  929. p_Level->LiftVParticles[i].dwTime += ber.TimeLastFrame;
  930. if (p_Level->LiftVParticles[i].dwTime > 500) {
  931. p_Level->LiftVParticles[i].dwTime = 0;
  932. if (p_Level->LiftVParticles[i].hHnizdo[0]) {
  933. pHnizdo = par_cti_hnizdo(p_Level->LiftVParticles[i].hHnizdo[0]);
  934. pHnizdo->time_interval += 10;
  935. }
  936. }
  937. if (p_Level->LiftVParticles[i].hHnizdo[0]) {
  938. kom_mesh_get_float(p_Level->LiftVParticles[i].hHnizdo[1],
  939. &pos[0], &pos[1], &pos[2], &r);
  940. memcpy((void *) p_Level->LiftVParticles[i].pivot[0], (void *) pos,
  941. 3 * sizeof(float));
  942. p_Level->LiftVParticles[i].pivot[0][0] +=
  943. (rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX);
  944. p_Level->LiftVParticles[i].pivot[0][1]--;
  945. p_Level->LiftVParticles[i].pivot[0][2] +=
  946. (rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX);
  947. p_Level->LiftVParticles[i].dir[0][0] = 0;
  948. p_Level->LiftVParticles[i].dir[0][1] =
  949. ((-randf() / (float) (RAND_MAX)) / 7.0f) * _3DKOREKCE;
  950. if (p_Level->LiftVParticles[i].dir[0][1] > (-0.1f) * _3DKOREKCE)
  951. p_Level->LiftVParticles[i].dir[0][1] = (-0.1f) * _3DKOREKCE;
  952. p_Level->LiftVParticles[i].dir[0][2] = 0;
  953. f = (randf() / (float) (RAND_MAX)) / 8.0f;
  954. par_vloz_hnizdo_scale(p_Level->LiftVParticles[i].hHnizdo[0], f, f, 0,
  955. 0);
  956. }
  957. }
  958. }
  959. }
  960. void am_Do_Lifts(LEVELINFO * p_Level)
  961. {
  962. int i, r;
  963. float f, pos[3];
  964. DWORD dwTime, dwEplased;
  965. dwTime = timeGetTime();
  966. for (i = 0; i < 10; i++) {
  967. if (p_Level->LiftParticles[i].System != -1) {
  968. dwEplased = dwTime - p_Level->LiftParticles[i].dwStart;
  969. if (dwEplased > p_Level->LiftParticles[i].dwStop) {
  970. if (!par_get_hnizda(p_Level->LiftParticles[i].System)) {
  971. par_zrus(p_Level->LiftParticles[i].System);
  972. p_Level->LiftParticles[i].System = -1;
  973. }
  974. else
  975. par_vloz_hnizdo_pivot(p_Level->LiftParticles[i].hHnizdo[0], NULL);
  976. }
  977. else {
  978. if (!p_Level->bGameResume)
  979. p_Level->LiftParticles[i].dwTime += ber.TimeLastFrame;
  980. if (p_Level->LiftParticles[i].dwTime > 100) {
  981. p_Level->LiftParticles[i].dwTime = 0;
  982. r = rand() % 100;
  983. if (r < 50 && p_Level->LiftParticles[i].hHnizdo[0]) {
  984. //nacteni pozice vytahu
  985. kom_mesh_get_float(p_Level->LiftParticles[i].hHnizdo[1],
  986. &pos[0], &pos[1], &pos[2], &r);
  987. memcpy((void *) p_Level->LiftParticles[i].pivot[0], (void *) pos,
  988. 3 * sizeof(float));
  989. p_Level->LiftParticles[i].pivot[0][0] +=
  990. (rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX);
  991. p_Level->LiftParticles[i].pivot[0][1]--;
  992. p_Level->LiftParticles[i].pivot[0][2] +=
  993. (rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX);
  994. p_Level->LiftParticles[i].dir[0][0] = 0;
  995. p_Level->LiftParticles[i].dir[0][1] =
  996. ((-randf() / (float) (RAND_MAX)) / 10.0f) * _3DKOREKCE;
  997. if (p_Level->LiftParticles[i].dir[0][1] > (-0.03f) * _3DKOREKCE)
  998. p_Level->LiftParticles[i].dir[0][1] = (-0.03f) * _3DKOREKCE;
  999. p_Level->LiftParticles[i].dir[0][2] = 0;
  1000. f = (randf() / (float) (RAND_MAX)) / 25.0f;
  1001. par_vloz_hnizdo_scale(p_Level->LiftParticles[i].hHnizdo[0], f, f,
  1002. 0, 0);
  1003. par_vloz_hnizdo_pust_castici(p_Level->LiftParticles[i].
  1004. hHnizdo[0]);
  1005. }
  1006. }
  1007. }
  1008. }
  1009. am_Do_LiftVParticies(i, p_Level);
  1010. }
  1011. }
  1012. void am_Do_Water_KolaB(LEVELINFO * p_Level)
  1013. {
  1014. int i, rot;
  1015. float a, pos[3];
  1016. DWORD dwTime, dwEplased;
  1017. PARMETAC_HNIZDO *pHnizdo;
  1018. WATER_BOUNDARY Boundary;
  1019. dwTime = timeGetTime();
  1020. for (i = 0; i < 100; i++)
  1021. if (p_Level->VodniKolaB[i].System != -1) {
  1022. dwEplased = dwTime - p_Level->VodniKolaB[i].dwStart - ber.TimeLastFrame;
  1023. if (p_Level->VodniKolaB[i].dwExpire) {
  1024. if (!p_Level->bGameResume)
  1025. p_Level->VodniKolaB[i].dwExpireTime += ber.TimeLastFrame;
  1026. if (p_Level->VodniKolaB[i].dwExpireTime >=
  1027. p_Level->VodniKolaB[i].dwExpire
  1028. && p_Level->VodniKolaB[i].hHnizdo[2] != -1)
  1029. p_Level->VodniKolaB[i].hHnizdo[2] = -1;
  1030. }
  1031. if (p_Level->VodniKolaB[i].hHnizdo[2] != -1) {
  1032. kom_mesh_get_float(p_Level->VodniKolaB[i].hHnizdo[2],
  1033. &pos[0], &pos[1], &pos[2], &rot);
  1034. if (!p_Level->VodniKolaB[i].dwExpire)
  1035. w_Choose_Best_Boundary(&Boundary, pos[0], pos[2], pos[1] - 1,
  1036. WATER_BOUNDARY_METHOD_SIZE_HEURISTICS);
  1037. else
  1038. w_Choose_Best_Boundary(&Boundary, pos[0], pos[2],
  1039. p_Level->VodniKolaB[i].pivot[0][1] - 0.67f,
  1040. WATER_BOUNDARY_METHOD_SIZE_HEURISTICS);
  1041. par_vloz_hnizdo_clip(p_Level->VodniKolaB[i].hHnizdo[0],
  1042. Boundary.Left, Boundary.Bottom, Boundary.Right, Boundary.Top);
  1043. pos[1] -= 0.33f;
  1044. p_Level->VodniKolaB[i].pivot[0][0] = pos[0];
  1045. if (!p_Level->VodniKolaB[i].dwExpire)
  1046. p_Level->VodniKolaB[i].pivot[0][1] = pos[1];
  1047. p_Level->VodniKolaB[i].pivot[0][2] = pos[2];
  1048. }
  1049. if (dwEplased > p_Level->VodniKolaB[i].dwStop) {
  1050. if (!par_get_hnizda(p_Level->VodniKolaB[i].System)) {
  1051. par_zrus(p_Level->VodniKolaB[i].System);
  1052. p_Level->VodniKolaB[i].System = -1;
  1053. }
  1054. else {
  1055. pHnizdo = par_cti_hnizdo(p_Level->VodniKolaB[i].hHnizdo[0]);
  1056. if (pHnizdo) {
  1057. if (!p_Level->bGameResume)
  1058. p_Level->VodniKolaB[i].dwTime += ber.TimeLastFrame;
  1059. if (p_Level->VodniKolaB[i].dwTime > 250) {
  1060. p_Level->VodniKolaB[i].dwTime = 0;
  1061. if (pHnizdo->a > 0) {
  1062. a = pHnizdo->a - 0.05f;
  1063. if (a <= 0)
  1064. a = 0;
  1065. par_vloz_hnizdo_diff(p_Level->VodniKolaB[i].hHnizdo[0],
  1066. pHnizdo->r, pHnizdo->g, pHnizdo->b, a,
  1067. pHnizdo->dr, pHnizdo->dg, pHnizdo->db,
  1068. pHnizdo->da, pHnizdo->ka);
  1069. }
  1070. else if (p_Level->VodniKolaB[i].hHnizdo[0])
  1071. par_vloz_hnizdo_pivot(p_Level->VodniKolaB[i].hHnizdo[0],
  1072. NULL);
  1073. }
  1074. }
  1075. }
  1076. }
  1077. }
  1078. }
  1079. void am_Do_Water(LEVELINFO * p_Level)
  1080. {
  1081. int i;
  1082. float a;
  1083. DWORD dwTime, dwEplased;
  1084. PARMETAC_HNIZDO *pHnizdo;
  1085. dwTime = timeGetTime();
  1086. for (i = 0; i < 10; i++)
  1087. if (p_Level->VodniKola[i].System != -1) {
  1088. dwEplased = dwTime - p_Level->VodniKola[i].dwStart - ber.TimeLastFrame;
  1089. if (dwEplased > p_Level->VodniKola[i].dwStop) {
  1090. /* if(!p_Level->VodniKola[i].hHnizdo[1] && p_Level->VodniKola[i].dwStop > 0)
  1091. {
  1092. am_Do_Vodni_Cakanec2(p_Level->VodniKola[i].pivot[1],
  1093. p_Level->VodniKola[i].hHnizdo[2],
  1094. p_Level->VodniKola[i].hHnizdo[3],
  1095. p_Level);
  1096. p_Level->VodniKola[i].hHnizdo[1] = 1;
  1097. }*/
  1098. if (!par_get_hnizda(p_Level->VodniKola[i].System)) {
  1099. par_zrus(p_Level->VodniKola[i].System);
  1100. p_Level->VodniKola[i].System = -1;
  1101. }
  1102. else {
  1103. pHnizdo = par_cti_hnizdo(p_Level->VodniKola[i].hHnizdo[0]);
  1104. if (pHnizdo) {
  1105. if (!p_Level->bGameResume)
  1106. p_Level->VodniKola[i].dwTime += ber.TimeLastFrame;
  1107. if (p_Level->VodniKola[i].dwTime > 250) {
  1108. p_Level->VodniKola[i].dwTime = 0;
  1109. if (pHnizdo->a > 0) {
  1110. a = pHnizdo->a - 0.05f;
  1111. if (a <= 0)
  1112. a = 0;
  1113. /* if(p_Level->VodniKola[i].dwStop > 0)
  1114. par_vloz_hnizdo_scale(p_Level->VodniKola[i].hHnizdo[0], 0.01f, 0.01f,
  1115. pHnizdo->utlum_x, pHnizdo->utlum_y);*/
  1116. par_vloz_hnizdo_diff(p_Level->VodniKola[i].hHnizdo[0],
  1117. pHnizdo->r, pHnizdo->g, pHnizdo->b, a,
  1118. pHnizdo->dr, pHnizdo->dg, pHnizdo->db,
  1119. pHnizdo->da, pHnizdo->ka);
  1120. }
  1121. else if (p_Level->VodniKola[i].hHnizdo[0])
  1122. par_vloz_hnizdo_pivot(p_Level->VodniKola[i].hHnizdo[0], NULL);
  1123. }
  1124. }
  1125. }
  1126. }
  1127. }
  1128. }
  1129. int am_Get_Free_VodniKola(LEVELINFO * p_Level)
  1130. {
  1131. int i;
  1132. for (i = 0; i < 10; i++)
  1133. if (p_Level->VodniKola[i].System == -1)
  1134. return i;
  1135. return -1;
  1136. }
  1137. int am_Kola_na_Vode(float *pos, int VyskaSloupce, int VyskaPadu, int predmet,
  1138. LEVELINFO * p_Level)
  1139. {
  1140. int k, m;
  1141. PAR_KOUR_STOPA *pKourovaS;
  1142. PARMETAC_HNIZDO *pHnizdo;
  1143. SYSTEMKOUROVYCHCASTIC *pSystem;
  1144. WATER_BOUNDARY Boundary;
  1145. int size = ftoi(100 / p_Level->KvalitaCastic);
  1146. k = am_Get_Free_VodniKola(p_Level);
  1147. if (k == -1)
  1148. return -1;
  1149. pSystem = &p_Level->VodniKola[k];
  1150. pKourovaS = (PAR_KOUR_STOPA *) malloc(size * sizeof(PAR_KOUR_STOPA));
  1151. if (!pKourovaS)
  1152. return -1;
  1153. pSystem->pCastice = pKourovaS;
  1154. pSystem->Sizeof = size;
  1155. pSystem->dwStart = timeGetTime();
  1156. m = kom_najdi_material("cvkolo1");
  1157. if (m == -1)
  1158. kprintf(1, "Nelze najit material cvkolo1");
  1159. pKourovaS[0].rychlost_x = pKourovaS[0].rychlost_y = 1.5f;
  1160. pKourovaS[0].utlum_x = 2.75f + ((VyskaPadu - 1) * 0.25f);
  1161. pKourovaS[0].utlum_y = 2.75f + ((VyskaPadu - 1) * 0.25f);
  1162. pKourovaS[0].r = pKourovaS[0].g = pKourovaS[0].b = 1.0f;
  1163. pKourovaS[0].a = 0.6f;
  1164. pKourovaS[0].dr = pKourovaS[0].dg = pKourovaS[0].db = pKourovaS[0].da =
  1165. -0.15f;
  1166. pKourovaS[0].ka = 0;
  1167. pSystem->System = par_vyrob();
  1168. par_set_param(pSystem->System, m, TPAR_NO_FOG | TPAR_3D | TPAR_SCALE_ADD |
  1169. TPAR_VETSI | TPAR_AUTOREMOVE | TPAR_2DCLIP, (BOD *) pos, NULL);
  1170. par_vloz_kour_stopu(pSystem->System, pKourovaS, pSystem->Sizeof);
  1171. pSystem->hHnizdo[0] = par_vloz_hnizdo(pSystem->System);
  1172. par_vloz_hnizdo_komplet(pSystem->hHnizdo[0], 550, (BOD *) pSystem->pivot[0],
  1173. pKourovaS);
  1174. par_vloz_hnizdo_timer(pSystem->hHnizdo[0], 550, -550);
  1175. memcpy((void *) pSystem->pivot[0], (void *) pos, 3 * sizeof(float));
  1176. pSystem->pivot[0][1] += 0.7f;
  1177. if (pSystem->hHnizdo[0])
  1178. pHnizdo = par_cti_hnizdo(pSystem->hHnizdo[0]);
  1179. pSystem->nx[0][0] = 1;
  1180. pSystem->nx[0][1] = 0;
  1181. pSystem->nx[0][2] = 0;
  1182. pSystem->ny[0][0] = 0;
  1183. pSystem->ny[0][1] = 0;
  1184. pSystem->ny[0][2] = 1;
  1185. pHnizdo->p_nx = (BOD *) pSystem->nx[0];
  1186. pHnizdo->p_ny = (BOD *) pSystem->ny[0];
  1187. pSystem->dwStart = timeGetTime();
  1188. pSystem->dwTime = 0;
  1189. pSystem->dwExpire = 0;
  1190. pSystem->dwExpireTime = 0;
  1191. pSystem->dwStop = VyskaSloupce * 10;
  1192. memcpy((void *) pSystem->pivot[1], (void *) pos, 3 * sizeof(float));
  1193. // pSystem->hHnizdo[1] = 0;
  1194. pSystem->hHnizdo[2] = VyskaPadu;
  1195. pSystem->hHnizdo[3] = predmet;
  1196. w_Choose_Best_Boundary(&Boundary, pos[0], pos[2], pos[1],
  1197. WATER_BOUNDARY_METHOD_SIZE_HEURISTICS);
  1198. par_vloz_hnizdo_clip(pSystem->hHnizdo[0], Boundary.Left, Boundary.Bottom,
  1199. Boundary.Right, Boundary.Top);
  1200. par_pripoj_funkci(pSystem->System, anmend_ZrusCastice3, 0, 0,
  1201. (void *) pKourovaS);
  1202. par_go(pSystem->System, &pSystem->flag, 0, 0);
  1203. return k;
  1204. }
  1205. void am_Do_Vodni_Cakanec1(float *pos, int vyska, int Predmet,
  1206. LEVELINFO * p_Level)
  1207. {
  1208. int i, r;
  1209. PAR_STREPINA *pCastice;
  1210. int pocercastic;
  1211. int ph;
  1212. int material;
  1213. float v;
  1214. float fpos[3];
  1215. memcpy((void *) fpos, (void *) pos, 3 * sizeof(float));
  1216. fpos[1] += 0.7f;
  1217. for (i = 0; i < 10; i++) {
  1218. r = rand() % 10;
  1219. if (p_Level->VodniCakanec1[r].flag == -1)
  1220. break;
  1221. }
  1222. if (i == 10)
  1223. return;
  1224. p_Level->VodniCakanec1[r].dwStart = timeGetTime();
  1225. if (Predmet)
  1226. pocercastic = p_Level->VodniCakanec1[r].Sizeof / 2;
  1227. else
  1228. pocercastic = p_Level->VodniCakanec1[r].Sizeof;
  1229. pCastice = (PAR_STREPINA *) malloc(pocercastic * sizeof(PAR_STREPINA));
  1230. if (!pCastice)
  1231. return;
  1232. memcpy((void *) pCastice, (void *) p_Level->VodniCakanec1[r].pCastice,
  1233. pocercastic * sizeof(PAR_STREPINA));
  1234. //pregeneruj parametry podle vysky padu
  1235. for (i = 0; i < pocercastic; i++) {
  1236. v =
  1237. (pCastice[i].vel1 + pCastice[i].vel2 + pCastice[i].vel3 +
  1238. pCastice[i].vel4) / 2.0f;
  1239. if (Predmet) {
  1240. pCastice[i].rychlost =
  1241. (((randf() / (float) (RAND_MAX)) * v) * (8.0f +
  1242. (vyska * 0.25f))) * _3DKOREKCE;
  1243. if (pCastice[i].rychlost < 0.1f * _3DKOREKCE)
  1244. pCastice[i].rychlost = 0.1f * _3DKOREKCE;
  1245. pCastice[i].p.z =
  1246. ((rand() & 0x1 ? randf() : -randf()) / (float) RAND_MAX) / 5.0f;
  1247. pCastice[i].p.x =
  1248. ((rand() & 0x1 ? randf() : -randf()) / (float) RAND_MAX) / 5.0f;
  1249. }
  1250. else {
  1251. pCastice[i].rychlost =
  1252. (((randf() / (float) (RAND_MAX)) * v) * (8.0f +
  1253. (vyska * 0.5f))) * _3DKOREKCE;
  1254. if (pCastice[i].rychlost < 0.1f * _3DKOREKCE)
  1255. pCastice[i].rychlost = 0.1f * _3DKOREKCE;
  1256. }
  1257. }
  1258. ph = par_vyrob();
  1259. material = kom_najdi_material("ckapka2");
  1260. if (material == -1)
  1261. kprintf(1, "Nelze najit material ckapka2");
  1262. par_set_param(ph, material, TPAR_YPLANE_LOW | TPAR_HTEST | TPAR_AUTOREMOVE,
  1263. (BOD *) fpos, NULL);
  1264. par_set_y_plane(ph, fpos[1] - 0.1f);
  1265. par_vloz_strepy(ph, pCastice, pocercastic);
  1266. par_pripoj_funkci(ph, anmend_ZrusCastice3, 0, 0, (void *) pCastice);
  1267. par_go(ph, &p_Level->VodniCakanec1[r].flag, 0, 0);
  1268. }
  1269. void am_Do_Vodni_Cakanec2(float *pos, int VyskaPadu, int predmet,
  1270. LEVELINFO * p_Level)
  1271. {
  1272. int i, r;
  1273. PAR_STREPINA *pCastice;
  1274. int pocercastic;
  1275. int ph;
  1276. int material;
  1277. float v;
  1278. float fpos[3];
  1279. memcpy((void *) fpos, (void *) pos, 3 * sizeof(float));
  1280. fpos[1] += 0.7f;
  1281. for (i = 0; i < 10; i++) {
  1282. r = rand() % 10;
  1283. if (p_Level->VodniCakanec2[r].flag == -1)
  1284. break;
  1285. }
  1286. if (i == 10) {
  1287. for (i = 0; i < 10; i++) {
  1288. if (p_Level->VodniCakanec2[i].flag == -1)
  1289. break;
  1290. }
  1291. if (i == 10)
  1292. return;
  1293. r = i;
  1294. }
  1295. if (predmet)
  1296. pocercastic = p_Level->VodniCakanec1[r].Sizeof / 2;
  1297. else
  1298. pocercastic = p_Level->VodniCakanec1[r].Sizeof;
  1299. p_Level->VodniCakanec2[r].dwStart = timeGetTime();
  1300. pCastice = (PAR_STREPINA *) malloc(pocercastic * sizeof(PAR_STREPINA));
  1301. if (!pCastice)
  1302. return;
  1303. memcpy((void *) pCastice, (void *) p_Level->VodniCakanec2[r].pCastice,
  1304. pocercastic * sizeof(PAR_STREPINA));
  1305. //pregeneruj parametry podle vysky padu
  1306. for (i = 0; i < pocercastic; i++) {
  1307. v =
  1308. (pCastice[i].vel1 + pCastice[i].vel2 + pCastice[i].vel3 +
  1309. pCastice[i].vel4) / 2.0f;
  1310. if (!predmet)
  1311. pCastice[i].rychlost =
  1312. (((randf() / (float) (RAND_MAX)) * v) * (8.0f +
  1313. VyskaPadu)) * _3DKOREKCE;
  1314. else
  1315. pCastice[i].rychlost =
  1316. (((randf() / (float) (RAND_MAX)) * v) * (8.0f +
  1317. (VyskaPadu / 2.0f))) * _3DKOREKCE;
  1318. if (pCastice[i].rychlost < 0.1f * _3DKOREKCE)
  1319. pCastice[i].rychlost = 0.1f * _3DKOREKCE;
  1320. }
  1321. ph = par_vyrob();
  1322. if (!ph)
  1323. return;
  1324. material = kom_najdi_material("ckapka2");
  1325. if (material == -1)
  1326. kprintf(1, "Nelze najit material ckapka2");
  1327. par_set_param(ph, material, TPAR_YPLANE_LOW | TPAR_HTEST | TPAR_AUTOREMOVE,
  1328. (BOD *) fpos, NULL);
  1329. par_set_y_plane(ph, fpos[1] - 0.1f);
  1330. par_vloz_strepy(ph, pCastice, pocercastic);
  1331. par_pripoj_funkci(ph, anmend_ZrusCastice3, 0, 0, (void *) pCastice);
  1332. par_go(ph, &p_Level->VodniCakanec2[r].flag, 0, 0);
  1333. }
  1334. int am_Get_Free_Lift_VParticles(LEVELINFO * p_Level)
  1335. {
  1336. int i;
  1337. for (i = 0; i < 10; i++)
  1338. if (p_Level->LiftVParticles[i].System == -1)
  1339. return i;
  1340. return -1;
  1341. }
  1342. void am_Do_Lift_VParticles(float *pos, int mesh, LEVELINFO * p_Level)
  1343. {
  1344. int k, m;
  1345. PAR_KOUR_STOPA *pKourovaS;
  1346. int size = ftoi(500 / p_Level->KvalitaCastic);
  1347. k = am_Get_Free_Lift_VParticles(p_Level);
  1348. if (k == -1)
  1349. return;
  1350. pKourovaS = (PAR_KOUR_STOPA *) malloc(size * sizeof(PAR_KOUR_STOPA));
  1351. if (!pKourovaS)
  1352. return;
  1353. p_Level->LiftVParticles[k].pCastice = pKourovaS;
  1354. p_Level->LiftVParticles[k].Sizeof = size;
  1355. p_Level->LiftVParticles[k].dwStart = timeGetTime();
  1356. m = kom_najdi_material("ckapka1");
  1357. if (m == -1)
  1358. kprintf(1, "Nelze najit material ckapka1");
  1359. pKourovaS[0].rychlost_x = pKourovaS[0].rychlost_y =
  1360. (randf() / (float) (RAND_MAX));
  1361. pKourovaS[0].utlum_x = 0;
  1362. pKourovaS[0].utlum_y = 0;
  1363. pKourovaS[0].r = pKourovaS[0].g = pKourovaS[0].b = 1.0f;
  1364. pKourovaS[0].a = 1.0f;
  1365. pKourovaS[0].dr = pKourovaS[0].dg = pKourovaS[0].db = pKourovaS[0].da = 0;
  1366. pKourovaS[0].ka = 0;
  1367. p_Level->LiftVParticles[k].System = par_vyrob();
  1368. par_set_param(p_Level->LiftVParticles[k].System, m,
  1369. TPAR_NO_FOG | TPAR_YPLANE_LOW | TPAR_VETSI | TPAR_AUTOREMOVE | TPAR_DIR,
  1370. (BOD *) pos, NULL);
  1371. par_vloz_kour_stopu(p_Level->LiftVParticles[k].System, pKourovaS,
  1372. p_Level->LiftVParticles[k].Sizeof);
  1373. p_Level->LiftVParticles[k].hHnizdo[0] =
  1374. par_vloz_hnizdo(p_Level->LiftVParticles[k].System);
  1375. par_vloz_hnizdo_komplet(p_Level->LiftVParticles[k].hHnizdo[0], 1,
  1376. (BOD *) p_Level->LiftVParticles[k].pivot[0], pKourovaS);
  1377. par_vloz_hnizdo_timer(p_Level->LiftVParticles[k].hHnizdo[0], 1, -1);
  1378. memcpy((void *) p_Level->LiftVParticles[k].pivot[0], (void *) pos,
  1379. 3 * sizeof(float));
  1380. p_Level->LiftParticles[k].pivot[0][0] +=
  1381. (rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX);
  1382. p_Level->LiftParticles[k].pivot[0][1]--;
  1383. p_Level->LiftParticles[k].pivot[0][2] +=
  1384. (rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX);
  1385. p_Level->LiftParticles[k].dir[0][0] = 0;
  1386. p_Level->LiftParticles[k].dir[0][1] =
  1387. ((-randf() / (float) (RAND_MAX)) / 10.0f) * _3DKOREKCE;
  1388. if (p_Level->LiftVParticles[k].dir[0][1] > (-0.03f) * _3DKOREKCE)
  1389. p_Level->LiftVParticles[k].dir[0][1] = (-0.03f) * _3DKOREKCE;
  1390. p_Level->LiftVParticles[k].dir[0][2] = 0;
  1391. par_vloz_hnizdo_dir(p_Level->LiftVParticles[k].hHnizdo[0],
  1392. (BOD *) p_Level->LiftVParticles[k].dir[0]);
  1393. par_vloz_hnizdo_y_plane(p_Level->LiftVParticles[k].hHnizdo[0],
  1394. pos[1] + 0.7f);
  1395. p_Level->LiftVParticles[k].dwStart = timeGetTime();
  1396. p_Level->LiftVParticles[k].dwTime = 0;
  1397. par_pripoj_funkci(p_Level->LiftVParticles[k].System, anmend_ZrusCastice3, 0,
  1398. 0, (void *) pKourovaS);
  1399. p_Level->LiftVParticles[k].hHnizdo[1] = mesh;
  1400. par_go(p_Level->LiftVParticles[k].System, &p_Level->LiftVParticles[k].flag,
  1401. 0, 0);
  1402. }
  1403. int am_Get_Free_VodniKolaB(LEVELINFO * p_Level)
  1404. {
  1405. int i;
  1406. for (i = 0; i < 100; i++)
  1407. if (p_Level->VodniKolaB[i].System == -1)
  1408. return i;
  1409. return -1;
  1410. }
  1411. int am_Find_Corresponding_VodniKolaB(int mesh, LEVELINFO * p_Level)
  1412. {
  1413. int i;
  1414. for (i = 0; i < 100; i++)
  1415. if (p_Level->VodniKolaB[i].System != -1 &&
  1416. p_Level->VodniKolaB[i].hHnizdo[2] == mesh)
  1417. return i;
  1418. return -1;
  1419. }
  1420. int am_Kola_na_VodeB(float *pos, int Beruska, int mesh, int infinity,
  1421. LEVELINFO * p_Level)
  1422. {
  1423. int k, m;
  1424. PAR_KOUR_STOPA *pKourovaS;
  1425. PARMETAC_HNIZDO *pHnizdo;
  1426. SYSTEMKOUROVYCHCASTIC *pSystem;
  1427. WATER_BOUNDARY Boundary;
  1428. int size = ftoi(100 / p_Level->KvalitaCastic);
  1429. pos[1] -= 0.5f;
  1430. k = am_Find_Corresponding_VodniKolaB(mesh, p_Level);
  1431. if (k != -1) {
  1432. p_Level->VodniKolaB[k].dwStart = timeGetTime();
  1433. par_vloz_hnizdo_diff(p_Level->VodniKolaB[k].hHnizdo[0],
  1434. 1.0f, 1.0f, 1.0f, 0.6f, -0.25f, -0.25f, -0.25f, -0.25f, 0);
  1435. par_vloz_hnizdo_pivot(p_Level->VodniKolaB[k].hHnizdo[0],
  1436. (BOD *) p_Level->VodniKolaB[k].pivot[0]);
  1437. w_Choose_Best_Boundary(&Boundary, pos[0], pos[2], pos[1] - 0.5f,
  1438. WATER_BOUNDARY_METHOD_SIZE_HEURISTICS);
  1439. par_vloz_hnizdo_clip(p_Level->VodniKolaB[k].hHnizdo[0],
  1440. Boundary.Left, Boundary.Bottom, Boundary.Right, Boundary.Top);
  1441. return -1;
  1442. }
  1443. k = am_Get_Free_VodniKolaB(p_Level);
  1444. if (k == -1)
  1445. return -1;
  1446. pSystem = &p_Level->VodniKolaB[k];
  1447. pKourovaS = (PAR_KOUR_STOPA *) malloc(size * sizeof(PAR_KOUR_STOPA));
  1448. if (!pKourovaS)
  1449. return -1;
  1450. pSystem->pCastice = pKourovaS;
  1451. pSystem->Sizeof = size;
  1452. pSystem->dwStart = timeGetTime();
  1453. m = kom_najdi_material("cvkolo1");
  1454. if (m == -1)
  1455. kprintf(1, "Nelze najit material cvkolo1");
  1456. if (!Beruska)
  1457. pKourovaS[0].rychlost_x = pKourovaS[0].rychlost_y = 1.5f;
  1458. else
  1459. pKourovaS[0].rychlost_x = pKourovaS[0].rychlost_y = 0.5f;
  1460. pKourovaS[0].utlum_x = 1.75f;
  1461. pKourovaS[0].utlum_y = 1.75f;
  1462. pKourovaS[0].r = pKourovaS[0].g = pKourovaS[0].b = 1.0f;
  1463. pKourovaS[0].a = 0.6f;
  1464. pKourovaS[0].dr = pKourovaS[0].dg = pKourovaS[0].db = pKourovaS[0].da =
  1465. -0.25f;
  1466. pKourovaS[0].ka = 0;
  1467. pSystem->System = par_vyrob();
  1468. par_set_param(pSystem->System, m, TPAR_NO_FOG | TPAR_3D | TPAR_SCALE_ADD |
  1469. TPAR_VETSI | TPAR_AUTOREMOVE | TPAR_2DCLIP, (BOD *) pos, NULL);
  1470. par_vloz_kour_stopu(pSystem->System, pKourovaS, pSystem->Sizeof);
  1471. pSystem->hHnizdo[0] = par_vloz_hnizdo(pSystem->System);
  1472. par_vloz_hnizdo_komplet(pSystem->hHnizdo[0], 400, (BOD *) pSystem->pivot[0],
  1473. pKourovaS);
  1474. if (p_Level->bSikminaDown)
  1475. par_vloz_hnizdo_timer(pSystem->hHnizdo[0], 400, 500);
  1476. else
  1477. par_vloz_hnizdo_timer(pSystem->hHnizdo[0], 400, -400);
  1478. memcpy((void *) pSystem->pivot[0], (void *) pos, 3 * sizeof(float));
  1479. pSystem->pivot[0][1] += 0.7f;
  1480. if (pSystem->hHnizdo[0])
  1481. pHnizdo = par_cti_hnizdo(pSystem->hHnizdo[0]);
  1482. pSystem->nx[0][0] = 1;
  1483. pSystem->nx[0][1] = 0;
  1484. pSystem->nx[0][2] = 0;
  1485. pSystem->ny[0][0] = 0;
  1486. pSystem->ny[0][1] = 0;
  1487. pSystem->ny[0][2] = 1;
  1488. pHnizdo->p_nx = (BOD *) pSystem->nx[0];
  1489. pHnizdo->p_ny = (BOD *) pSystem->ny[0];
  1490. pSystem->dwStart = timeGetTime();
  1491. pSystem->dwTime = 0;
  1492. pSystem->dwExpire = 0;
  1493. pSystem->dwExpireTime = 0;
  1494. if (!infinity)
  1495. pSystem->dwStop = 500;
  1496. else
  1497. pSystem->dwStop = 7200000;
  1498. pSystem->hHnizdo[1] = Beruska;
  1499. pSystem->hHnizdo[2] = mesh;
  1500. //if(infinity)
  1501. w_Choose_Best_Boundary(&Boundary, pos[0], pos[2], pos[1] - 0.5f,
  1502. WATER_BOUNDARY_METHOD_SIZE_HEURISTICS);
  1503. par_vloz_hnizdo_clip(pSystem->hHnizdo[0], Boundary.Left, Boundary.Bottom,
  1504. Boundary.Right, Boundary.Top);
  1505. par_pripoj_funkci(pSystem->System, anmend_ZrusCastice3, 0, 0,
  1506. (void *) pKourovaS);
  1507. par_go(pSystem->System, &pSystem->flag, 0, 0);
  1508. return k;
  1509. }
  1510. void am_Release_BublSystem(int i, LEVELINFO * p_Level)
  1511. {
  1512. par_zrus(p_Level->BublSystem[i].System.System);
  1513. p_Level->BublSystem[i].System.System = -1;
  1514. }
  1515. void am_Do_BublSystem(int i, LEVELINFO * p_Level)
  1516. {
  1517. float pos[3], f;
  1518. int rot;
  1519. SYSTEMKOUROVYCHCASTIC *pSystem = &p_Level->BublSystem[i].System;
  1520. if (!p_Level->bGameResume)
  1521. pSystem->dwTime += ber.TimeLastFrame;
  1522. if (pSystem->dwTime > pSystem->dwStop) {
  1523. pSystem->dwTime = 0;
  1524. if (p_Level->BublSystem[i].bOn) {
  1525. p_Level->BublSystem[i].bOn = 0;
  1526. par_vloz_hnizdo_timer(pSystem->hHnizdo[0], 100000, 0);
  1527. pSystem->dwStop = 3000;
  1528. }
  1529. else {
  1530. pSystem->dwStop = 1000 + p_Level->BublSystem[i].iStart;
  1531. p_Level->BublSystem[i].bOn = 1;
  1532. par_vloz_hnizdo_timer(pSystem->hHnizdo[0], 1,
  1533. p_Level->BublSystem[i].iStart);
  1534. p_Level->BublSystem[i].iStart = 0;
  1535. }
  1536. }
  1537. kom_mesh_get_float(p_Level->BublSystem[i].mesh, &pos[0], &pos[1], &pos[2],
  1538. &rot);
  1539. memcpy((void *) pSystem->pivot[0], (void *) pos, 3 * sizeof(float));
  1540. pSystem->pivot[0][0] +=
  1541. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) / 5.0f;
  1542. pSystem->pivot[0][1] += 0.70f;
  1543. pSystem->pivot[0][2] +=
  1544. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) / 5.0f;
  1545. pSystem->dir[0][1] = (randf() / (float) (RAND_MAX)) * 5.0f;
  1546. if (pSystem->dir[0][1] < 1.0f)
  1547. pSystem->dir[0][1] = 1.0f;
  1548. f = (randf() / (float) (RAND_MAX)) / 7.0f;
  1549. par_vloz_hnizdo_scale(pSystem->hHnizdo[0], f, f, 0, 0);
  1550. if (am_Find_Water(i, &f, p_Level))
  1551. par_vloz_hnizdo_y_plane(pSystem->hHnizdo[0], f);
  1552. }
  1553. int am_Find_Water(int i, float *f, LEVELINFO * p_Level)
  1554. {
  1555. int r;
  1556. int j;
  1557. int iPos[3];
  1558. float pos[3];
  1559. memcpy((void *) iPos,
  1560. (void *) p_Level->Item[p_Level->BublSystem[i].iItem].Pos,
  1561. 3 * sizeof(int));
  1562. iPos[2]++;
  1563. for (j = iPos[2]; j < p_Level->Size[2]; j += 2) {
  1564. gl_Logical2Real(iPos[0], iPos[1], j, &r, p_Level);
  1565. if (p_Level->Level[r])
  1566. if (p_Level->Level[r]->p_Object->Class == 12) {
  1567. kom_get_fyz_souradnice(iPos[0], j, iPos[1], (BOD *) pos);
  1568. *f = pos[1] + 0.6f;
  1569. return 1;
  1570. }
  1571. gl_Logical2Real(iPos[0], iPos[1], j + 1, &r, p_Level);
  1572. if (p_Level->Level[r])
  1573. if (p_Level->Level[r]->p_Object->Class == 2) {
  1574. kom_get_fyz_souradnice(iPos[0], j, iPos[1], (BOD *) pos);
  1575. *f = pos[1];
  1576. return 1;
  1577. }
  1578. }
  1579. *f = ber.y_start + 50;
  1580. return p_Level->bUnderWaterLevel;
  1581. }
  1582. int am_Find_WaterB(int *viPos, float *f, LEVELINFO * p_Level)
  1583. {
  1584. int r;
  1585. int j;
  1586. int iPos[3];
  1587. float pos[3];
  1588. memcpy((void *) iPos, (void *) viPos, 3 * sizeof(int));
  1589. iPos[2]++;
  1590. for (j = iPos[2]; j < p_Level->Size[2]; j += 2) {
  1591. gl_Logical2Real(iPos[0], iPos[1], j, &r, p_Level);
  1592. if (p_Level->Level[r])
  1593. if (p_Level->Level[r]->p_Object->Class == 12) {
  1594. kom_get_fyz_souradnice(iPos[0], j, iPos[1], (BOD *) pos);
  1595. *f = pos[1] + 0.6f;
  1596. return 1;
  1597. }
  1598. }
  1599. *f = ber.y_start + 50;
  1600. return p_Level->bUnderWaterLevel;
  1601. }
  1602. void am_Create_BublSystem(int i, LEVELINFO * p_Level)
  1603. {
  1604. float pos[3], f;
  1605. int m, rot;
  1606. PAR_KOUR_STOPA *pKourovaS;
  1607. SYSTEMKOUROVYCHCASTIC *pSystem = &p_Level->BublSystem[i].System;
  1608. int size = ftoi(500 / p_Level->KvalitaCastic);
  1609. pKourovaS = (PAR_KOUR_STOPA *) malloc(size * sizeof(PAR_KOUR_STOPA));
  1610. if (!pKourovaS)
  1611. return;
  1612. pSystem->pCastice = pKourovaS;
  1613. pSystem->Sizeof = size;
  1614. m = kom_najdi_material("cbublina1");
  1615. if (m == -1)
  1616. kprintf(1, "Nelze najit material cbublina1");
  1617. pKourovaS[0].rychlost_x = pKourovaS[0].rychlost_y =
  1618. (randf() / (float) (RAND_MAX)) / 7.0f;
  1619. pKourovaS[0].utlum_x = 0;
  1620. pKourovaS[0].utlum_y = 0;
  1621. pKourovaS[0].r = pKourovaS[0].g = pKourovaS[0].b = 1.0f;
  1622. pKourovaS[0].a = 0.8f;
  1623. pKourovaS[0].dr = pKourovaS[0].dg = pKourovaS[0].db = pKourovaS[0].da = 0;
  1624. pKourovaS[0].ka = 0;
  1625. pSystem->System = par_vyrob();
  1626. kom_mesh_get_float(p_Level->BublSystem[i].mesh, &pos[0], &pos[1], &pos[2],
  1627. &rot);
  1628. pos[1]++;
  1629. par_set_param(pSystem->System, m,
  1630. TPAR_NO_FOG | TPAR_YPLANE_TOP | TPAR_VETSI | TPAR_AUTOREMOVE | TPAR_DIR,
  1631. (BOD *) pos, NULL);
  1632. par_vloz_kour_stopu(pSystem->System, pKourovaS, pSystem->Sizeof);
  1633. pSystem->hHnizdo[0] = par_vloz_hnizdo(pSystem->System);
  1634. par_vloz_hnizdo_komplet(pSystem->hHnizdo[0], 100000,
  1635. (BOD *) pSystem->pivot[0], pKourovaS);
  1636. par_vloz_hnizdo_timer(pSystem->hHnizdo[0], 100000, -100000);
  1637. memcpy((void *) pSystem->pivot[0], (void *) pos, 3 * sizeof(float));
  1638. pSystem->pivot[0][0] +=
  1639. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) / 5.0f;
  1640. pSystem->pivot[0][1] += 0.70f;
  1641. pSystem->pivot[0][2] +=
  1642. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) / 5.0f;
  1643. pSystem->dir[0][0] = 0;
  1644. pSystem->dir[0][1] = (randf() / (float) (RAND_MAX)) * 5.0f;
  1645. if (pSystem->dir[0][1] < 1.0f)
  1646. pSystem->dir[0][1] = 1.0f;
  1647. pSystem->dir[0][2] = 0;
  1648. par_vloz_hnizdo_dir(pSystem->hHnizdo[0], (BOD *) pSystem->dir[0]);
  1649. if (am_Find_Water(i, &f, p_Level))
  1650. par_vloz_hnizdo_y_plane(pSystem->hHnizdo[0], f);
  1651. pSystem->dwStart = timeGetTime();
  1652. pSystem->dwTime = 0;
  1653. pSystem->dwStop = 2000;
  1654. p_Level->BublSystem[i].bOn = 0;
  1655. par_pripoj_funkci(pSystem->System, anmend_ZrusCastice3, 0, 0,
  1656. (void *) pKourovaS);
  1657. par_go(pSystem->System, &pSystem->flag, 0, 0);
  1658. }
  1659. void am_Do_Bubliny_Berusek(LEVELINFO * p_Level)
  1660. {
  1661. int real;
  1662. int i, j;
  1663. for (i = 0; i < 6; i++)
  1664. if (p_Level->BublSystem[i].iItem != -1) {
  1665. j = p_Level->BublSystem[i].iItem;
  1666. gl_Logical2Real(p_Level->Item[j].Pos[0], p_Level->Item[j].Pos[1],
  1667. p_Level->Item[j].Pos[2], &real, p_Level);
  1668. if (p_Level->Square[real].bUnderWater &&
  1669. p_Level->BublSystem[i].System.System == -1)
  1670. am_Create_BublSystem(i, p_Level);
  1671. else
  1672. if (p_Level->Square[real].bUnderWater &&
  1673. p_Level->BublSystem[i].System.System != -1)
  1674. am_Do_BublSystem(i, p_Level);
  1675. else
  1676. if (!p_Level->Square[real].bUnderWater &&
  1677. p_Level->BublSystem[i].System.System != -1)
  1678. am_Release_BublSystem(i, p_Level);
  1679. }
  1680. }
  1681. void am_Do_BublVybuchy(LEVELINFO * p_Level)
  1682. {
  1683. int i;
  1684. for (i = 0; i < 20; i++) {
  1685. if (p_Level->BublVybuch[i].System != -1) {
  1686. if (p_Level->BublVybuch[i].hHnizdo[0]) {
  1687. par_vloz_hnizdo_pivot(p_Level->BublVybuch[i].hHnizdo[0], NULL);
  1688. if (!par_get_hnizda(p_Level->BublVybuch[i].System)) {
  1689. par_zrus(p_Level->BublVybuch[i].System);
  1690. p_Level->BublVybuch[i].System = -1;
  1691. }
  1692. }
  1693. }
  1694. }
  1695. }
  1696. int am_Get_Free_BublVybuch(LEVELINFO * p_Level)
  1697. {
  1698. int i;
  1699. for (i = 0; i < 20; i++)
  1700. if (p_Level->BublVybuch[i].System == -1)
  1701. return i;
  1702. return -1;
  1703. }
  1704. void am_Do_Vybuch_Bublin(int *iPos, float *fPos, LEVELINFO * p_Level)
  1705. {
  1706. float f;
  1707. int m;
  1708. PAR_KOUR_STOPA *pKourovaS;
  1709. PAR_KOUR_STOPA *pCastice;
  1710. SYSTEMKOUROVYCHCASTIC *pSystem;
  1711. int size = ftoi(500 / p_Level->KvalitaCastic);
  1712. m = am_Get_Free_BublVybuch(p_Level);
  1713. if (m == -1)
  1714. return;
  1715. pSystem = &p_Level->BublVybuch[m];
  1716. pKourovaS = (PAR_KOUR_STOPA *) malloc(size * sizeof(PAR_KOUR_STOPA));
  1717. if (!pKourovaS)
  1718. return;
  1719. pSystem->pCastice = pKourovaS;
  1720. pSystem->Sizeof = size;
  1721. m = kom_najdi_material("cbublina1");
  1722. if (m == -1)
  1723. kprintf(1, "Nelze najit material cbublina1");
  1724. pKourovaS[0].rychlost_x = pKourovaS[0].rychlost_y =
  1725. (randf() / (float) (RAND_MAX)) / 4.5f;
  1726. pKourovaS[0].utlum_x = 0;
  1727. pKourovaS[0].utlum_y = 0;
  1728. pKourovaS[0].r = pKourovaS[0].g = pKourovaS[0].b = 1.0f;
  1729. pKourovaS[0].a = 0.8f;
  1730. pKourovaS[0].dr = pKourovaS[0].dg = pKourovaS[0].db = pKourovaS[0].da = 0;
  1731. pKourovaS[0].ka = 0;
  1732. pSystem->System = par_vyrob();
  1733. par_set_param(pSystem->System, m,
  1734. TPAR_NO_FOG | TPAR_YPLANE_TOP | TPAR_VETSI | TPAR_AUTOREMOVE | TPAR_DIR,
  1735. (BOD *) fPos, NULL);
  1736. par_vloz_kour_stopu(pSystem->System, pKourovaS, pSystem->Sizeof);
  1737. pSystem->hHnizdo[0] = par_vloz_hnizdo(pSystem->System);
  1738. par_vloz_hnizdo_komplet(pSystem->hHnizdo[0], 1, (BOD *) pSystem->pivot[0],
  1739. pKourovaS);
  1740. par_vloz_hnizdo_timer(pSystem->hHnizdo[0], 1, -1);
  1741. memcpy((void *) pSystem->pivot[0], (void *) fPos, 3 * sizeof(float));
  1742. if (am_Find_WaterB(iPos, &f, p_Level)) {
  1743. float fpos[3];
  1744. par_vloz_hnizdo_y_plane(pSystem->hHnizdo[0], f);
  1745. fpos[0] = pSystem->pivot[0][0];
  1746. fpos[2] = pSystem->pivot[0][2];
  1747. //fpos[1] = pSystem->pivot[0][1] + (f - 0.6f);
  1748. fpos[1] = f;
  1749. if (!p_Level->bUnderWaterLevel)
  1750. gl_Do_Strepiny_Na_Vode(fpos, p_Level, -0.7f);
  1751. }
  1752. pCastice =
  1753. par_vloz_hnizdo_pust_castice(pSystem->System, pSystem->hHnizdo[0], size);
  1754. while (pCastice) {
  1755. pCastice->p.x +=
  1756. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX));
  1757. pCastice->p.y +=
  1758. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX));
  1759. pCastice->p.z +=
  1760. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX));
  1761. pCastice->dir.x = 0;
  1762. pCastice->dir.y = (randf() / (float) (RAND_MAX)) * 5.0f;
  1763. if (pCastice->dir.y < 1.0f)
  1764. pCastice->dir.y = 1.0f;
  1765. pCastice->dir.z = 0;
  1766. pCastice->rychlost_x = pCastice->rychlost_y =
  1767. (randf() / (float) (RAND_MAX)) / 4.5f;
  1768. pCastice = pCastice->p_next;
  1769. }
  1770. pSystem->dir[0][0] = 0;
  1771. pSystem->dir[0][1] = (randf() / (float) (RAND_MAX)) * 5.0f;
  1772. if (pSystem->dir[0][1] < 1.0f)
  1773. pSystem->dir[0][1] = 1.0f;
  1774. pSystem->dir[0][2] = 0;
  1775. par_vloz_hnizdo_dir(pSystem->hHnizdo[0], (BOD *) pSystem->dir[0]);
  1776. pSystem->dwStart = timeGetTime();
  1777. pSystem->dwTime = 0;
  1778. pSystem->dwStop = 0;
  1779. par_pripoj_funkci(pSystem->System, anmend_ZrusCastice3, 0, 0,
  1780. (void *) pKourovaS);
  1781. par_go(pSystem->System, &pSystem->flag, 0, 0);
  1782. }
  1783. void am_Do_Exit_Efects(LEVELINFO * p_Level)
  1784. {
  1785. EXITEFECT *pEEfect;
  1786. int i;
  1787. for (i = 0; i < 10; i++)
  1788. if (p_Level->ExitEfect[i].System.System != -1) {
  1789. pEEfect = &p_Level->ExitEfect[i];
  1790. if (!p_Level->bGameResume)
  1791. pEEfect->System.dwTime += ber.TimeLastFrame;
  1792. if (pEEfect->System.dwTime > pEEfect->System.dwStop) {
  1793. if (pEEfect->System.hHnizdo[0])
  1794. par_vloz_hnizdo_pivot(pEEfect->System.hHnizdo[0], NULL);
  1795. if (pEEfect->System.hHnizdo[1])
  1796. par_vloz_hnizdo_pivot(pEEfect->System.hHnizdo[1], NULL);
  1797. }
  1798. if (par_get_hnizda(pEEfect->System.System) < 2) {
  1799. par_zrus(pEEfect->System.System);
  1800. pEEfect->System.System = -1;
  1801. if (pEEfect->hSvetlo != -1) {
  1802. sdl_svetlo_zrus(pEEfect->hSvetlo);
  1803. pEEfect->hSvetlo = -1;
  1804. }
  1805. if (pEEfect->hEXSvetlo[0] != -1) {
  1806. edl_svetlo_zrus(pEEfect->hEXSvetlo[0]);
  1807. pEEfect->hEXSvetlo[0] = -1;
  1808. }
  1809. if (pEEfect->hEXSvetlo[1] != -1) {
  1810. edl_svetlo_zrus(pEEfect->hEXSvetlo[1]);
  1811. pEEfect->hEXSvetlo[1] = -1;
  1812. }
  1813. lani_set(pEEfect->mesh, 0, K_CHYBA, &p_Level->TrashFlag, 0, 0, 0);
  1814. kom_zrus_prvek(pEEfect->mesh);
  1815. }
  1816. }
  1817. }
  1818. int am_Get_Free_ExitSystem(LEVELINFO * p_Level)
  1819. {
  1820. int i;
  1821. for (i = 0; i < 10; i++)
  1822. if (p_Level->ExitEfect[i].hSvetlo == -1)
  1823. return i;
  1824. return -1;
  1825. }
  1826. void am_Do_Exit(int Bmesh, int Emesh, LEVELINFO * p_Level)
  1827. {
  1828. int m, k;
  1829. PAR_KOUR_STOPA *pKourovaS;
  1830. PARMETAC_HNIZDO *pHnizdo;
  1831. SYSTEMKOUROVYCHCASTIC *pSystem;
  1832. EXITEFECT *pEEfect;
  1833. int i, hSvetlo;
  1834. float pos[3];
  1835. int rot;
  1836. i = am_Get_Free_ExitSystem(p_Level);
  1837. if (i == -1)
  1838. return;
  1839. pEEfect = &p_Level->ExitEfect[i];
  1840. pEEfect->mesh = Bmesh;
  1841. hSvetlo = sdl_svetlo_vyrob(SDL_UTLUM_LINEAR);
  1842. if (hSvetlo != -1) {
  1843. kom_mesh_get_float(Bmesh, &pos[0], &pos[1], &pos[2], &rot);
  1844. sdl_svetlo_set_pos(hSvetlo, (BOD *) pos);
  1845. sdl_svetlo_set_diff(hSvetlo, 1, 1, 1, 4, 10, 10);
  1846. sdl_anim_vyrob(hSvetlo, 15, 0, 0, 2);
  1847. sdl_anim_vloz_klic_vzdal(hSvetlo, 0, 10, 4, 10, 0);
  1848. sdl_anim_vloz_klic_vzdal(hSvetlo, 1, 4, 4, 4, 14);
  1849. sdl_anim_start(hSvetlo, &p_Level->TrashFlag, 0, 0, 0);
  1850. pEEfect->hSvetlo = hSvetlo;
  1851. }
  1852. else
  1853. pEEfect->hSvetlo = -1;
  1854. pEEfect->hEXSvetlo[0] =
  1855. edl_svetlo_vyrob(EDL_BODOVE | EDL_GOURAND | EDL_SPEC_ADD | EDL_DOSAH |
  1856. EDL_UTLUM_LIN, 0);
  1857. hSvetlo = pEEfect->hEXSvetlo[0];
  1858. if (hSvetlo != -1) {
  1859. kom_mesh_get_float(Emesh, &pos[0], &pos[1], &pos[2], &rot);
  1860. pos[1] += 1.0f;
  1861. edl_svetlo_set_pos(hSvetlo, (BOD *) pos, (BOD *) pos);
  1862. edl_svetlo_set_spec(hSvetlo, 1, 1, 1);
  1863. edl_svetlo_set_par(hSvetlo, 1, 3, 0, 4.0f);
  1864. }
  1865. pEEfect->hEXSvetlo[1] =
  1866. edl_svetlo_vyrob(EDL_MESH_LIGHT | EDL_PRUHL_LIGHT | EDL_ALFA_SET |
  1867. EDL_DOSAH | EDL_UTLUM_KVAD | EDL_PLOSNE_Y, 1);
  1868. hSvetlo = pEEfect->hEXSvetlo[1];
  1869. if (hSvetlo != -1) {
  1870. edl_svetlo_pridej_mesh(hSvetlo, Bmesh);
  1871. edl_svetlo_uzavri_meshe(hSvetlo);
  1872. kom_mesh_get_float(Bmesh, &pos[0], &pos[1], &pos[2], &rot);
  1873. edl_svetlo_set_pos(hSvetlo, (BOD *) pos, (BOD *) pos);
  1874. edl_svetlo_set_diff(hSvetlo, 1);
  1875. edl_svetlo_set_par(hSvetlo, 1, 0, 0, 0);
  1876. edl_anim_vyrob(hSvetlo, 20, 0, 0, 0, 0, 2);
  1877. edl_anim_vloz_klic_vzdal(hSvetlo, 0, 0, 0, 1, 0);
  1878. edl_anim_vloz_klic_vzdal(hSvetlo, 1, 1, 0, 1, 19);
  1879. edl_anim_start(hSvetlo, &p_Level->TrashFlag, 0, 0, 0);
  1880. }
  1881. // pEEfect->hEXSvetlo[1] = -1;
  1882. kom_mesh_get_float(Bmesh, &pos[0], &pos[1], &pos[2], &rot);
  1883. pSystem = &pEEfect->System;
  1884. pKourovaS = (PAR_KOUR_STOPA *) malloc(100 * sizeof(PAR_KOUR_STOPA));
  1885. if (!pKourovaS)
  1886. return;
  1887. pSystem->pCastice = pKourovaS;
  1888. pSystem->Sizeof = 100;
  1889. pSystem->dwStart = timeGetTime();
  1890. m = kom_najdi_material("flare11");
  1891. if (m == -1)
  1892. kprintf(1, "Nelze najit material flare11");
  1893. pKourovaS[0].rychlost_x = pKourovaS[0].rychlost_y = 1.0f;
  1894. pKourovaS[0].utlum_x = 0;
  1895. pKourovaS[0].utlum_y = 0;
  1896. pKourovaS[0].r = pKourovaS[0].g = pKourovaS[0].b = 1.0f;
  1897. pKourovaS[0].a = 1.0f;
  1898. pKourovaS[0].dr = pKourovaS[0].dg = pKourovaS[0].db = pKourovaS[0].da = 0;
  1899. pKourovaS[0].ka = 0;
  1900. pSystem->System = par_vyrob();
  1901. par_set_param(pSystem->System, m,
  1902. TPAR_NO_FOG | TPAR_YPLANE_LOW | TPAR_DIR | TPAR_3D | TPAR_VETSI |
  1903. TPAR_AUTOREMOVE, (BOD *) pos, NULL);
  1904. par_vloz_kour_stopu(pSystem->System, pKourovaS, pSystem->Sizeof);
  1905. for (k = 0; k < 2; k++) {
  1906. pSystem->hHnizdo[k] = par_vloz_hnizdo(pSystem->System);
  1907. par_vloz_hnizdo_komplet(pSystem->hHnizdo[k], 1000,
  1908. (BOD *) pSystem->pivot[k], pKourovaS);
  1909. par_vloz_hnizdo_timer(pSystem->hHnizdo[k], 1000, -1000);
  1910. memcpy((void *) pSystem->pivot[k], (void *) pos, 3 * sizeof(float));
  1911. pSystem->dir[k][0] = 0;
  1912. if (k == 0)
  1913. pSystem->dir[k][1] = 1;
  1914. else {
  1915. pSystem->dir[k][1] = -1;
  1916. par_vloz_hnizdo_y_plane(pSystem->hHnizdo[k], pos[1] - 0.8f);
  1917. }
  1918. pSystem->dir[k][2] = 0;
  1919. vektor_norm((BOD *) pSystem->dir[k]);
  1920. par_vloz_hnizdo_dir(pSystem->hHnizdo[k], (BOD *) pSystem->dir[k]);
  1921. if (pSystem->hHnizdo[k])
  1922. pHnizdo = par_cti_hnizdo(pSystem->hHnizdo[k]);
  1923. pSystem->nx[k][0] = 1;
  1924. pSystem->nx[k][1] = 0;
  1925. pSystem->nx[k][2] = 0;
  1926. pSystem->ny[k][0] = 0;
  1927. pSystem->ny[k][1] = 0;
  1928. pSystem->ny[k][2] = 1;
  1929. pHnizdo->p_nx = (BOD *) pSystem->nx[k];
  1930. pHnizdo->p_ny = (BOD *) pSystem->ny[k];
  1931. pSystem->dwStart = timeGetTime();
  1932. pSystem->dwTime = 0;
  1933. pSystem->dwStop = 250;
  1934. }
  1935. par_pripoj_funkci(pSystem->System, anmend_ZrusCastice3, 0, 0,
  1936. (void *) pKourovaS);
  1937. par_go(pSystem->System, &pSystem->flag, 0, 0);
  1938. kom_mesh_get_float(Emesh, &pos[0], &pos[1], &pos[2], &rot);
  1939. rot = rand() % 3;
  1940. ap_Play_Sound(0, 0, 0, pos, 81 + rot, NULL, &ad);
  1941. }
  1942. int am_Get_Free_ExitSparksSystem(LEVELINFO * p_Level)
  1943. {
  1944. int i;
  1945. for (i = 0; i < 10; i++)
  1946. if (p_Level->ExitSparks[i].System == -1)
  1947. return i;
  1948. return -1;
  1949. }
  1950. void am_Do_Exit_Sparks(LEVELINFO * p_Level)
  1951. {
  1952. ITEMDESC *pItem;
  1953. PAR_KOUR_STOPA *pCastice;
  1954. int i, r;
  1955. float f, pos[3];
  1956. for (i = 0; i < 10; i++)
  1957. if (p_Level->ExitSparks[i].System != -1) {
  1958. if (!p_Level->bGameResume)
  1959. p_Level->ExitSparks[i].dwTime += ber.TimeLastFrame;
  1960. //mihotani jisker
  1961. if (p_Level->ExitSparks[i].dwTime > 100) {
  1962. if (p_Level->ExitSparks[i].hHnizdo[0]) {
  1963. pCastice =
  1964. par_cti_hnizdo_castice(p_Level->ExitSparks[i].hHnizdo[0]);
  1965. if (pCastice) {
  1966. while (pCastice) {
  1967. r = rand() % 100;
  1968. if (r < 10) {
  1969. f = (randf() / (float) (RAND_MAX)) / 7.5f;
  1970. pCastice->rychlost_x += f;
  1971. pCastice->rychlost_y += f;
  1972. }
  1973. pCastice = pCastice->p_next;
  1974. }
  1975. }
  1976. }
  1977. p_Level->ExitSparks[i].dwTime = 0;
  1978. }
  1979. pItem = (ITEMDESC *) p_Level->ExitSparks[i].hHnizdo[1];
  1980. kom_mesh_get_float(pItem->Index_Of_Game_Mesh, &pos[0], &pos[1], &pos[2],
  1981. &r);
  1982. p_Level->ExitSparks[i].pivot[0][0] =
  1983. (rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX);
  1984. p_Level->ExitSparks[i].pivot[0][2] =
  1985. (rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX);
  1986. norm_vect_2D(&p_Level->ExitSparks[i].pivot[0][0],
  1987. &p_Level->ExitSparks[i].pivot[0][2]);
  1988. f = (randf() / (float) (RAND_MAX)) / 1.35f;
  1989. p_Level->ExitSparks[i].pivot[0][0] *= f;
  1990. p_Level->ExitSparks[i].pivot[0][2] *= f;
  1991. p_Level->ExitSparks[i].pivot[0][0] += pos[0];
  1992. p_Level->ExitSparks[i].pivot[0][2] += pos[2];
  1993. f = (randf() / (float) (RAND_MAX)) / 10.0f;
  1994. par_vloz_hnizdo_scale(p_Level->ExitSparks[i].hHnizdo[0], f, f, -0.5f,
  1995. -0.5f);
  1996. }
  1997. }
  1998. void am_Do_TelCSparks(LEVELINFO * p_Level)
  1999. {
  2000. ITEMDESC *pItem;
  2001. int i, r;
  2002. float f, pos[3];
  2003. PAR_KOUR_STOPA *pCastice;
  2004. for (i = 0; i < 10; i++)
  2005. if (p_Level->TelCSparks[i].System != -1) {
  2006. // test na vypnuti efektu
  2007. if (!par_get_hnizda(p_Level->TelCSparks[i].System)) {
  2008. par_zrus(p_Level->TelCSparks[i].System);
  2009. p_Level->TelCSparks[i].System = -1;
  2010. sdl_svetlo_zrus(p_Level->TelCSparks[i].hHnizdo[2]);
  2011. p_Level->TelCSparks[i].hHnizdo[2] = -1;
  2012. continue;
  2013. }
  2014. pCastice = par_cti_hnizdo_castice(p_Level->TelCSparks[i].hHnizdo[0]);
  2015. // test na velikost castic. Pokud je moc mala, tak pric s ni
  2016. if (pCastice) {
  2017. while (pCastice) {
  2018. if (pCastice->rychlost_x < 0.001f || pCastice->rychlost_y < 0.001f)
  2019. pCastice->a = 0;
  2020. pCastice = pCastice->p_next;
  2021. }
  2022. }
  2023. pItem = (ITEMDESC *) p_Level->TelCSparks[i].hHnizdo[1];
  2024. if (pItem) {
  2025. if ((rand() % 3))
  2026. kom_mesh_get_float(pItem->Index_Of_Game_Mesh, &pos[0], &pos[1],
  2027. &pos[2], &r);
  2028. else {
  2029. int iPos[3];
  2030. gl_Real2Logical(pItem->Connection[0], iPos, p_Level);
  2031. kom_get_fyz_souradnice(iPos[0], iPos[2], iPos[1], (BOD *) pos);
  2032. }
  2033. p_Level->TelCSparks[i].pivot[0][0] =
  2034. (rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX);
  2035. p_Level->TelCSparks[i].pivot[0][2] =
  2036. (rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX);
  2037. norm_vect_2D(&p_Level->TelCSparks[i].pivot[0][0],
  2038. &p_Level->TelCSparks[i].pivot[0][2]);
  2039. f = (randf() / (float) (RAND_MAX)) * 0.75f;
  2040. p_Level->TelCSparks[i].pivot[0][0] *= f;
  2041. p_Level->TelCSparks[i].pivot[0][2] *= f;
  2042. p_Level->TelCSparks[i].pivot[0][0] += pos[0];
  2043. p_Level->TelCSparks[i].pivot[0][2] += pos[2];
  2044. f = (randf() / (float) (RAND_MAX)) / 2.0f;
  2045. par_vloz_hnizdo_scale(p_Level->TelCSparks[i].hHnizdo[0], f, f, -2.0f,
  2046. -2.0f);
  2047. p_Level->TelCSparks[i].dir[0][1] = (randf() / (float) (RAND_MAX)) * 5;
  2048. }
  2049. }
  2050. }
  2051. void am_Release_BarelSparks(LEVELINFO * p_Level, ITEMDESC * pBarel)
  2052. {
  2053. int i;
  2054. for (i = 0; i < 30; i++)
  2055. if (p_Level->BarelSparks[i].System != -1 &&
  2056. p_Level->BarelSparks[i].hHnizdo[1] == (int) pBarel) {
  2057. par_zrus(p_Level->BarelSparks[i].System);
  2058. p_Level->BarelSparks[i].System = -1;
  2059. sdl_svetlo_zrus(p_Level->BarelSparks[i].hHnizdo[2]);
  2060. p_Level->BarelSparks[i].hHnizdo[2] = -1;
  2061. return;
  2062. }
  2063. }
  2064. void am_Do_BarelSparks(LEVELINFO * p_Level)
  2065. {
  2066. ITEMDESC *pItem;
  2067. int i, r;
  2068. float f, pos[3];
  2069. PAR_KOUR_STOPA *pCastice;
  2070. for (i = 0; i < 30; i++)
  2071. if (p_Level->BarelSparks[i].System != -1) {
  2072. // test na vypnuti efektu
  2073. if (!par_get_hnizda(p_Level->BarelSparks[i].System)) {
  2074. par_zrus(p_Level->BarelSparks[i].System);
  2075. p_Level->BarelSparks[i].System = -1;
  2076. sdl_svetlo_zrus(p_Level->BarelSparks[i].hHnizdo[2]);
  2077. p_Level->BarelSparks[i].hHnizdo[2] = -1;
  2078. continue;
  2079. }
  2080. pCastice = par_cti_hnizdo_castice(p_Level->BarelSparks[i].hHnizdo[0]);
  2081. // test na velikost castic. Pokud je moc mala, tak pric s ni
  2082. if (pCastice) {
  2083. while (pCastice) {
  2084. if (pCastice->rychlost_x < 0.001f || pCastice->rychlost_y < 0.001f)
  2085. pCastice->a = 0;
  2086. pCastice = pCastice->p_next;
  2087. }
  2088. }
  2089. pItem = (ITEMDESC *) p_Level->BarelSparks[i].hHnizdo[1];
  2090. if (pItem) {
  2091. kom_mesh_get_float(pItem->Index_Of_Game_Mesh, &pos[0], &pos[1],
  2092. &pos[2], &r);
  2093. p_Level->BarelSparks[i].pivot[0][0] =
  2094. (rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX);
  2095. p_Level->BarelSparks[i].pivot[0][1] = pos[1] + 1;
  2096. p_Level->BarelSparks[i].pivot[0][2] =
  2097. (rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX);
  2098. norm_vect_2D(&p_Level->BarelSparks[i].pivot[0][0],
  2099. &p_Level->BarelSparks[i].pivot[0][2]);
  2100. f = (randf() / (float) (RAND_MAX)) * 0.75f;
  2101. p_Level->BarelSparks[i].pivot[0][0] *= f;
  2102. p_Level->BarelSparks[i].pivot[0][2] *= f;
  2103. p_Level->BarelSparks[i].pivot[0][0] += pos[0];
  2104. p_Level->BarelSparks[i].pivot[0][2] += pos[2];
  2105. f = (randf() / (float) (RAND_MAX)) / 2.0f;
  2106. par_vloz_hnizdo_scale(p_Level->BarelSparks[i].hHnizdo[0], f, f, -2.0f,
  2107. -2.0f);
  2108. p_Level->BarelSparks[i].dir[0][1] =
  2109. (randf() / (float) (RAND_MAX)) * 1;
  2110. pos[1] += 1.25f;
  2111. sdl_svetlo_set_pos(p_Level->BarelSparks[i].hHnizdo[2], (BOD *) pos);
  2112. }
  2113. }
  2114. }
  2115. void am_Create_Exit_Sparks(ITEMDESC * pExit, char Down, LEVELINFO * p_Level)
  2116. {
  2117. int m, k;
  2118. PAR_KOUR_STOPA *pKourovaS;
  2119. SYSTEMKOUROVYCHCASTIC *pSystem;
  2120. float pos[3];
  2121. int rot;
  2122. int size = ftoi(100 / p_Level->KvalitaCastic);
  2123. k = am_Get_Free_ExitSparksSystem(p_Level);
  2124. if (k == -1)
  2125. return;
  2126. pSystem = &p_Level->ExitSparks[k];
  2127. pKourovaS = (PAR_KOUR_STOPA *) malloc(size * sizeof(PAR_KOUR_STOPA));
  2128. if (!pKourovaS)
  2129. return;
  2130. kom_mesh_get_float(pExit->Index_Of_Game_Mesh, &pos[0], &pos[1], &pos[2],
  2131. &rot);
  2132. pSystem->pCastice = pKourovaS;
  2133. pSystem->Sizeof = size;
  2134. pSystem->dwStart = timeGetTime();
  2135. m = kom_najdi_material("flare12");
  2136. if (m == -1)
  2137. kprintf(1, "Nelze najit material flare12");
  2138. pKourovaS[0].rychlost_x = pKourovaS[0].rychlost_y =
  2139. (randf() / (float) (RAND_MAX)) / 10.0f;
  2140. pKourovaS[0].utlum_x = -0.5f;
  2141. pKourovaS[0].utlum_y = -0.5f;
  2142. pKourovaS[0].r = 0.98f;
  2143. pKourovaS[0].g = 0.91f;
  2144. pKourovaS[0].b = 0.33f;
  2145. pKourovaS[0].a = 1.0f;
  2146. pKourovaS[0].dr = pKourovaS[0].dg = pKourovaS[0].db = pKourovaS[0].da = 0;
  2147. pKourovaS[0].ka = 0;
  2148. pSystem->System = par_vyrob();
  2149. if (Down)
  2150. par_set_param(pSystem->System, m,
  2151. TPAR_NO_FOG | TPAR_YPLANE_LOW | TPAR_DIR | TPAR_SCALE | TPAR_VETSI |
  2152. TPAR_AUTOREMOVE, (BOD *) pos, NULL);
  2153. else
  2154. par_set_param(pSystem->System, m,
  2155. TPAR_NO_FOG | TPAR_YPLANE_TOP | TPAR_DIR | TPAR_SCALE | TPAR_VETSI |
  2156. TPAR_AUTOREMOVE, (BOD *) pos, NULL);
  2157. par_vloz_kour_stopu(pSystem->System, pKourovaS, pSystem->Sizeof);
  2158. pSystem->hHnizdo[0] = par_vloz_hnizdo(pSystem->System);
  2159. par_vloz_hnizdo_komplet(pSystem->hHnizdo[0], 10, (BOD *) pSystem->pivot[0],
  2160. pKourovaS);
  2161. par_vloz_hnizdo_timer(pSystem->hHnizdo[0], 10, -10);
  2162. memcpy((void *) pSystem->pivot[0], (void *) pos, 3 * sizeof(float));
  2163. if (Down)
  2164. pSystem->pivot[0][1] += 0.8f;
  2165. else
  2166. pSystem->pivot[0][1] -= 0.8f;
  2167. pSystem->dir[0][0] = 0;
  2168. if (Down)
  2169. pSystem->dir[0][1] = -1;
  2170. else
  2171. pSystem->dir[0][1] = 1;
  2172. pSystem->dir[0][2] = 0;
  2173. if (Down)
  2174. par_vloz_hnizdo_y_plane(pSystem->hHnizdo[0], pos[1] - 0.8f);
  2175. else
  2176. par_vloz_hnizdo_y_plane(pSystem->hHnizdo[0], pos[1] + 0.8f);
  2177. par_vloz_hnizdo_dir(pSystem->hHnizdo[0], (BOD *) pSystem->dir[0]);
  2178. pSystem->dwStart = timeGetTime();
  2179. pSystem->dwTime = 0;
  2180. pSystem->dwStop = 0;
  2181. pSystem->hHnizdo[1] = (int) pExit;
  2182. par_pripoj_funkci(pSystem->System, anmend_ZrusCastice3, 0, 0,
  2183. (void *) pKourovaS);
  2184. par_go(pSystem->System, &pSystem->flag, 0, 0);
  2185. }
  2186. int am_Get_Free_TelCSparksSystem(LEVELINFO * p_Level)
  2187. {
  2188. int i;
  2189. for (i = 0; i < 10; i++)
  2190. if (p_Level->TelCSparks[i].System == -1)
  2191. return i;
  2192. return -1;
  2193. }
  2194. int am_Create_TelCSparks(ITEMDESC * pTel, LEVELINFO * p_Level)
  2195. {
  2196. int m, k;
  2197. PAR_KOUR_STOPA *pKourovaS;
  2198. SYSTEMKOUROVYCHCASTIC *pSystem;
  2199. float pos[3];
  2200. int rot;
  2201. int size = ftoi(300 / p_Level->KvalitaCastic);
  2202. k = am_Get_Free_TelCSparksSystem(p_Level);
  2203. if (k == -1)
  2204. return -1;
  2205. pSystem = &p_Level->TelCSparks[k];
  2206. pKourovaS = (PAR_KOUR_STOPA *) malloc(size * sizeof(PAR_KOUR_STOPA));
  2207. if (!pKourovaS)
  2208. return -1;
  2209. kom_mesh_get_float(pTel->Index_Of_Game_Mesh, &pos[0], &pos[1], &pos[2],
  2210. &rot);
  2211. pSystem->pCastice = pKourovaS;
  2212. pSystem->Sizeof = size;
  2213. pSystem->dwStart = timeGetTime();
  2214. m = kom_najdi_material("flare104");
  2215. if (m == -1)
  2216. kprintf(1, "Nelze najit material flare104");
  2217. pKourovaS[0].rychlost_x = pKourovaS[0].rychlost_y =
  2218. (randf() / (float) (RAND_MAX)) / 3.0f;
  2219. pKourovaS[0].utlum_x = -2;
  2220. pKourovaS[0].utlum_y = -2;
  2221. pKourovaS[0].r = 0;
  2222. pKourovaS[0].g = 0.8f;
  2223. pKourovaS[0].b = 0.97f;
  2224. pKourovaS[0].a = 1.0f;
  2225. pKourovaS[0].dr = pKourovaS[0].dg = pKourovaS[0].db = pKourovaS[0].da = 0;
  2226. pKourovaS[0].ka = 0;
  2227. pSystem->System = par_vyrob();
  2228. par_set_param(pSystem->System, m,
  2229. TPAR_NO_FOG | TPAR_YPLANE_TOP | TPAR_DIR | TPAR_SCALE | TPAR_VETSI |
  2230. TPAR_AUTOREMOVE, (BOD *) pos, NULL);
  2231. par_vloz_kour_stopu(pSystem->System, pKourovaS, pSystem->Sizeof);
  2232. pSystem->hHnizdo[0] = par_vloz_hnizdo(pSystem->System);
  2233. par_vloz_hnizdo_komplet(pSystem->hHnizdo[0], 10, (BOD *) pSystem->pivot[0],
  2234. pKourovaS);
  2235. par_vloz_hnizdo_timer(pSystem->hHnizdo[0], 10, -10);
  2236. memcpy((void *) pSystem->pivot[0], (void *) pos, 3 * sizeof(float));
  2237. pSystem->pivot[0][1]--;
  2238. pSystem->dir[0][0] = 0;
  2239. pSystem->dir[0][1] = (randf() / (float) (RAND_MAX)) * 5;
  2240. pSystem->dir[0][2] = 0;
  2241. par_vloz_hnizdo_y_plane(pSystem->hHnizdo[0], pos[1] + 3);
  2242. par_vloz_hnizdo_dir(pSystem->hHnizdo[0], (BOD *) pSystem->dir[0]);
  2243. pSystem->dwStart = timeGetTime();
  2244. pSystem->dwTime = 0;
  2245. pSystem->dwStop = 0;
  2246. pSystem->hHnizdo[1] = (int) pTel;
  2247. par_pripoj_funkci(pSystem->System, anmend_ZrusCastice3, 0, 0,
  2248. (void *) pKourovaS);
  2249. par_go(pSystem->System, &pSystem->flag, 0, 0);
  2250. return k;
  2251. }
  2252. void am_TurnOn_The_Teleport(ITEMDESC * pTel, LEVELINFO * p_Level)
  2253. {
  2254. float pos[3];
  2255. int hSvetlo, rot;
  2256. int i = am_Create_TelCSparks(pTel, p_Level);
  2257. int rnd = rand() % 3;
  2258. if (i == -1)
  2259. return;
  2260. hSvetlo = sdl_svetlo_vyrob(SDL_UTLUM_KVADRATIC);
  2261. kom_mesh_get_float(pTel->Index_Of_Game_Mesh, &pos[0], &pos[1], &pos[2],
  2262. &rot);
  2263. if (hSvetlo != -1) {
  2264. pos[1]++;
  2265. sdl_svetlo_set_pos(hSvetlo, (BOD *) pos);
  2266. sdl_svetlo_set_diff(hSvetlo, 1, 1, 1, 2, 3, 3);
  2267. sdl_anim_vyrob(hSvetlo, 20, 0, 0, 2);
  2268. sdl_anim_vloz_klic_vzdal(hSvetlo, 0, 0, 0, 0, 0);
  2269. sdl_anim_vloz_klic_vzdal(hSvetlo, 1, 3, 2, 3, 19);
  2270. sdl_anim_start(hSvetlo, &p_Level->TrashFlag, 0, 0, 0);
  2271. p_Level->TelCSparks[i].hHnizdo[2] = hSvetlo;
  2272. }
  2273. else
  2274. p_Level->TelCSparks[i].hHnizdo[2] = -1;
  2275. ap_Play_Sound(0,0,0, pos, rnd+71, NULL, &ad);
  2276. }
  2277. int am_Find_TelCSparks(ITEMDESC * pTel, LEVELINFO * p_Level)
  2278. {
  2279. ITEMDESC *pItem;
  2280. int i;
  2281. for (i = 0; i < 10; i++)
  2282. if (p_Level->TelCSparks[i].System != -1) {
  2283. pItem = (ITEMDESC *) p_Level->TelCSparks[i].hHnizdo[1];
  2284. if (pItem)
  2285. if (pItem->iItem == pTel->iItem)
  2286. return i;
  2287. }
  2288. return -1;
  2289. }
  2290. void am_TurnOff_The_Teleport(ITEMDESC * pTel, LEVELINFO * p_Level)
  2291. {
  2292. int hSvetlo;
  2293. float pos[3];
  2294. int i = am_Find_TelCSparks(pTel, p_Level);
  2295. int rnd = rand() % 3;
  2296. if (i == -1)
  2297. return;
  2298. hSvetlo = p_Level->TelCSparks[i].hHnizdo[2];
  2299. if (hSvetlo != -1) {
  2300. sdl_anim_vyrob(hSvetlo, 20, 0, 0, 2);
  2301. sdl_anim_vloz_klic_vzdal(hSvetlo, 0, 3, 2, 3, 0);
  2302. sdl_anim_vloz_klic_vzdal(hSvetlo, 1, 0, 0, 0, 19);
  2303. sdl_anim_start(hSvetlo, &p_Level->TrashFlag, 0, 0, 0);
  2304. }
  2305. if (p_Level->TelCSparks[i].hHnizdo[0])
  2306. par_vloz_hnizdo_pivot(p_Level->TelCSparks[i].hHnizdo[0], NULL);
  2307. p_Level->TelCSparks[i].hHnizdo[1] = 0;
  2308. kom_get_fyz_souradnice(pTel->Pos[0], pTel->Pos[2], pTel->Pos[1],
  2309. (BOD *) pos);
  2310. ap_Play_Sound(0,0,0, pos, rnd+68, NULL, &ad);
  2311. }
  2312. void am_Create_Sparks_To_Exits(LEVELINFO * p_Level)
  2313. {
  2314. int i;
  2315. for (i = 0; i < p_Level->Size_of_Level; i++)
  2316. if (p_Level->Level[i]) {
  2317. if (p_Level->Level[i]->p_Object->Class == 4) {
  2318. am_Create_Exit_Sparks(p_Level->Level[i], 1, p_Level);
  2319. am_Create_Exit_Sparks(p_Level->Level[i], 0, p_Level);
  2320. }
  2321. if (p_Level->Level[i]->p_Object->Class == 9 &&
  2322. !p_Level->Level[i]->p_Object->SubClass)
  2323. am_Create_TelCSparks(p_Level->Level[i], p_Level);
  2324. }
  2325. }
  2326. int am_Counet_Waters(LEVELINFO * p_Level)
  2327. {
  2328. int i, c = 0;
  2329. for (i = 0; i < p_Level->Size_of_Level; i++)
  2330. if (p_Level->Level[i])
  2331. if (p_Level->Level[i]->p_Object->Class == 12)
  2332. c++;
  2333. return c;
  2334. }
  2335. ITEMDESC *am_Find_Next_Water(int *LastIndex, LEVELINFO * p_Level)
  2336. {
  2337. int i, x = (*LastIndex) + 1;
  2338. for (i = x; i < p_Level->Size_of_Level; i++)
  2339. if (p_Level->Level[i])
  2340. if (p_Level->Level[i]->p_Object->Class == 12) {
  2341. (*LastIndex) = i;
  2342. return p_Level->Level[i];
  2343. }
  2344. (*LastIndex) = -1;
  2345. return NULL;
  2346. }
  2347. void am_Do_Rain(RAINSYSTEM * pRain)
  2348. {
  2349. float dir[6], pos[3];
  2350. int i;
  2351. // pregeneruj pivoty hnizd vodnich kol
  2352. if (pRain->bWaterCircles)
  2353. for (i = 0; i < pRain->SizeofWHnizda; i++) {
  2354. memcpy((void *) &pRain->Wpivot[i], (void *) &pRain->Wpos[i],
  2355. sizeof(BOD));
  2356. pRain->Wpivot[i].x +=
  2357. (rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX);
  2358. pRain->Wpivot[i].z +=
  2359. (rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX);
  2360. pRain->Wpivot[i].y -= 0.3f;
  2361. }
  2362. // pregeneruj pivoty hnizd deste
  2363. if (pRain->bRain) {
  2364. kam_get_float_ext(dir, pos);
  2365. //kprintf(1,"y: %f + %f = %f | floor: %f", pos[1], pRain->fSky, pos[1] + pRain->fSky, ber.y_start);
  2366. memcpy((void *) &pRain->RainCenter, (void *) pos, sizeof(BOD));
  2367. for (i = 0; i < pRain->SizeofHnizda; i++) {
  2368. memcpy((void *) &pRain->pivot[i], (void *) &pRain->RainCenter,
  2369. sizeof(BOD));
  2370. pRain->pivot[i].x +=
  2371. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) *
  2372. pRain->fDist;
  2373. pRain->pivot[i].z +=
  2374. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) *
  2375. pRain->fDist;
  2376. //pRain->pivot[i].y = pRain->fSky;
  2377. //pRain->pivot[i].y = pos[1] + 1.0f;
  2378. pRain->pivot[i].y = pos[1] + pRain->fSky;
  2379. }
  2380. }
  2381. }
  2382. void am_Do_Snow(SNOWSYSTEM * pSnow)
  2383. {
  2384. float dir[6], pos[3];
  2385. int i;
  2386. // pregeneruj pivoty hnizd snehu
  2387. if (pSnow->bSnow) {
  2388. kam_get_float_ext(dir, pos);
  2389. memcpy((void *) &pSnow->SnowCenter, (void *) pos, sizeof(BOD));
  2390. for (i = 0; i < pSnow->SizeofHnizda; i++) {
  2391. memcpy((void *) &pSnow->pivot[i], (void *) &pSnow->SnowCenter,
  2392. sizeof(BOD));
  2393. pSnow->pivot[i].x +=
  2394. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) *
  2395. pSnow->fDist;
  2396. pSnow->pivot[i].z +=
  2397. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) *
  2398. pSnow->fDist;
  2399. //pSnow->pivot[i].y = pSnow->fSky;
  2400. //pSnow->pivot[i].y = pos[1] + 1.0f;
  2401. pSnow->pivot[i].y = pos[1] + pSnow->fSky;
  2402. assert(fabs(pSnow->pivot[i].x) < 1000);
  2403. }
  2404. }
  2405. }
  2406. void am_Do_NESChmiri(NATUREEFFECTSYSTEM * pNESystem)
  2407. {
  2408. float dir[6], pos[3];
  2409. int j;
  2410. if (!Level.bGameResume)
  2411. pNESystem->dwTime += ber.TimeLastFrame;
  2412. if (pNESystem->dwTime > pNESystem->dwRegTime) {
  2413. pNESystem->dwTime = 0;
  2414. kam_get_float_ext(dir, pos);
  2415. for (j = 0; j < pNESystem->SizeofHnizda; j++) {
  2416. memcpy((void *) &pNESystem->pivot[j], (void *) pos, sizeof(BOD));
  2417. pNESystem->pivot[j].x +=
  2418. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) *
  2419. pNESystem->fRadius;
  2420. pNESystem->pivot[j].z +=
  2421. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) *
  2422. pNESystem->fRadius;
  2423. //pNESystem->pivot[j].y = pNESystem->fSky;
  2424. //pNESystem->pivot.y = pos[1] + 1.0f;
  2425. pNESystem->pivot[j].y = pos[1] + pNESystem->fSky;
  2426. pNESystem->dir[j].x =
  2427. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * 0.25f;
  2428. //pNESystem->dir[j].y = -0.15f;
  2429. pNESystem->dir[j].y = (-randf() / (float) (RAND_MAX)) * 0.25f;
  2430. pNESystem->dir[j].z =
  2431. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * 0.25f;
  2432. }
  2433. }
  2434. }
  2435. void am_Do_NESSvetluska(NATUREEFFECTSYSTEM * pNESystem)
  2436. {
  2437. float dir[6], pos[3];
  2438. int j;
  2439. if (!Level.bGameResume)
  2440. pNESystem->dwTime += ber.TimeLastFrame;
  2441. if (!Level.bGameResume)
  2442. pNESystem->dwGenTimeCounter += ber.TimeLastFrame;
  2443. if (pNESystem->dwGenTimeCounter > pNESystem->dwGenTime) {
  2444. pNESystem->dwGenTimeCounter = 0;
  2445. if (!(rand() % pNESystem->iGenProbability)) {
  2446. int r = rand() % pNESystem->SizeofHnizda;
  2447. kam_get_float_ext(dir, pos);
  2448. memcpy((void *) &pNESystem->pivot[r], (void *) pos, sizeof(BOD));
  2449. pNESystem->pivot[r].x +=
  2450. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) *
  2451. pNESystem->fRadius;
  2452. pNESystem->pivot[r].z +=
  2453. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) *
  2454. pNESystem->fRadius;
  2455. pNESystem->pivot[r].y = pNESystem->fLowPlain;
  2456. par_vloz_hnizdo_pust_castici(pNESystem->hHnizdo[r]);
  2457. }
  2458. return;
  2459. }
  2460. if (pNESystem->dwTime > pNESystem->dwRegTime) {
  2461. pNESystem->dwTime = 0;
  2462. for (j = 0; j < pNESystem->SizeofHnizda; j++) {
  2463. if (!(rand() % pNESystem->iGenProbability))
  2464. par_vloz_hnizdo_pust_castici(pNESystem->hHnizdo[j]);
  2465. pNESystem->dir[j].x =
  2466. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * 0.25f;
  2467. pNESystem->dir[j].y = (randf() / (float) (RAND_MAX)) * 0.5f;
  2468. pNESystem->dir[j].z =
  2469. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * 0.25f;
  2470. }
  2471. }
  2472. }
  2473. void am_Do_NESMusku(NATUREEFFECTSYSTEM * pNESystem)
  2474. {
  2475. PAR_KOUR_STOPA *pCastice;
  2476. int j;
  2477. if (!Level.bGameResume)
  2478. pNESystem->dwTime += ber.TimeLastFrame;
  2479. if (pNESystem->dwTime > pNESystem->dwRegTime) {
  2480. pNESystem->dwTime = 0;
  2481. for (j = 0; j < pNESystem->SizeofHnizda; j++) {
  2482. if (!(rand() % 2)) {
  2483. pNESystem->dir[j].x =
  2484. (rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX);
  2485. pNESystem->dir[j].y =
  2486. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * 0.15f;
  2487. pNESystem->dir[j].z =
  2488. (rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX);
  2489. norm_vect(&pNESystem->dir[j].x, &pNESystem->dir[j].y,
  2490. &pNESystem->dir[j].z);
  2491. memcpy((void *) &pNESystem->nx[j], (void *) &pNESystem->dir[j],
  2492. sizeof(BOD));
  2493. pCastice = par_cti_hnizdo_castice(pNESystem->hHnizdo[j]);
  2494. if (pCastice)
  2495. memcpy((void *) &pCastice->nx, (void *) &pNESystem->dir[j],
  2496. sizeof(BOD));
  2497. pNESystem->dir[j].x *= 4;
  2498. pNESystem->dir[j].z *= 4;
  2499. }
  2500. }
  2501. }
  2502. }
  2503. void am_Do_NESList(NATUREEFFECTSYSTEM * pNESystem, LEVELINFO * p_Level)
  2504. {
  2505. PAR_KOUR_STOPA *pCastice;
  2506. float dir[6], pos[3];
  2507. int j;
  2508. if (!p_Level->bGameResume)
  2509. pNESystem->dwTime += ber.TimeLastFrame;
  2510. if (!p_Level->bGameResume)
  2511. pNESystem->dwGenTimeCounter += ber.TimeLastFrame;
  2512. if (pNESystem->dwGenTimeCounter > pNESystem->dwGenTime) {
  2513. pNESystem->dwGenTimeCounter = 0;
  2514. if (!(rand() % pNESystem->iGenProbability)) {
  2515. int r = rand() % pNESystem->SizeofHnizda;
  2516. kam_get_float_ext(dir, pos);
  2517. memcpy((void *) &pNESystem->pivot[r], (void *) pos, sizeof(BOD));
  2518. pNESystem->pivot[r].x +=
  2519. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) *
  2520. pNESystem->fRadius;
  2521. pNESystem->pivot[r].z +=
  2522. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) *
  2523. pNESystem->fRadius;
  2524. //pNESystem->pivot[r].y = pNESystem->fSky;
  2525. //pNESystem->pivot.y = pos[1] + 1.0f;
  2526. pNESystem->pivot[r].y = pos[1] + pNESystem->fSky;
  2527. par_vloz_hnizdo_pust_castici(pNESystem->hHnizdo[r]);
  2528. }
  2529. return;
  2530. }
  2531. if (pNESystem->dwTime > pNESystem->dwRegTime) {
  2532. pNESystem->dwTime = 0;
  2533. for (j = 0; j < pNESystem->SizeofHnizda; j++) {
  2534. if (!(rand() % pNESystem->iGenProbability))
  2535. par_vloz_hnizdo_pust_castici(pNESystem->hHnizdo[j]);
  2536. pNESystem->dir[j].x =
  2537. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * 0.5f;
  2538. pNESystem->dir[j].y = -3;
  2539. pNESystem->dir[j].z =
  2540. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * 0.5f;
  2541. pNESystem->dir[j].x += pNESystem->AddDir.x;
  2542. pNESystem->dir[j].y += pNESystem->AddDir.y;
  2543. pNESystem->dir[j].z += pNESystem->AddDir.z;
  2544. pNESystem->dir[j].x += p_Level->fVitr[0];
  2545. pNESystem->dir[j].y += p_Level->fVitr[1];
  2546. pNESystem->dir[j].z += p_Level->fVitr[2];
  2547. memcpy((void *) &pNESystem->nx[j], (void *) &pNESystem->dir[j],
  2548. sizeof(BOD));
  2549. norm_vect(&pNESystem->nx[j].x, &pNESystem->nx[j].y,
  2550. &pNESystem->nx[j].z);
  2551. pCastice = par_cti_hnizdo_castice(pNESystem->hHnizdo[j]);
  2552. while (pCastice) {
  2553. memcpy((void *) &pCastice->nx, (void *) &pNESystem->nx[j],
  2554. sizeof(BOD));
  2555. pCastice = pCastice->p_next;
  2556. }
  2557. }
  2558. }
  2559. }
  2560. void am_Do_Nature_Effects(LEVELINFO * p_Level)
  2561. {
  2562. NATUREEFFECTSYSTEM *pNESystem;
  2563. int i;
  2564. for (i = 0; i < 10; i++)
  2565. if (p_Level->NatureESystem[i].pSystem != -1) {
  2566. pNESystem = &p_Level->NatureESystem[i];
  2567. switch (pNESystem->EffectID) {
  2568. case 1:
  2569. case 2:
  2570. case 3:
  2571. am_Do_NESChmiri(pNESystem);
  2572. break;
  2573. case 4:
  2574. case 5:
  2575. am_Do_NESMusku(pNESystem);
  2576. break;
  2577. case 6:
  2578. case 7:
  2579. case 8:
  2580. case 9:
  2581. case 10:
  2582. case 11:
  2583. am_Do_NESList(pNESystem, p_Level);
  2584. break;
  2585. case 12:
  2586. am_Do_NESSvetluska(pNESystem);
  2587. break;
  2588. }
  2589. }
  2590. }
  2591. int am_Create_Water_Circles(LEVELINFO * p_Level, RAINSYSTEM * pRain,
  2592. float fRadius, unsigned int uiDensity, unsigned int uiIntensity,
  2593. float fmaxDivergence)
  2594. {
  2595. PARMETAC_HNIZDO *pWHnizdo;
  2596. ITEMDESC *pItem;
  2597. float pos[3] = { 0, 0, 0 };
  2598. PAR_KOUR_STOPA *pCastice;
  2599. int cWaters, i, material, LastItem = 0, rot;
  2600. int intensity, delay;
  2601. pRain->hWHnizdo = NULL;
  2602. pRain->Wpivot = NULL;
  2603. pRain->Wpos = NULL;
  2604. cWaters = am_Counet_Waters(p_Level);
  2605. if (!cWaters) {
  2606. pRain->bWaterCircles = 0;
  2607. return 1;
  2608. }
  2609. pRain->SizeofWHnizda = cWaters;
  2610. // pamet na hnizda
  2611. pRain->hWHnizdo = (int *) malloc(cWaters * sizeof(int));
  2612. if (!pRain->hWHnizdo) {
  2613. pRain->bWaterCircles = 0;
  2614. return 0;
  2615. }
  2616. // pamet na pivoty
  2617. pRain->Wpivot = (BOD *) malloc(cWaters * sizeof(BOD));
  2618. if (!pRain->Wpivot) {
  2619. free((void *) pRain->hWHnizdo);
  2620. pRain->bWaterCircles = 0;
  2621. return 0;
  2622. }
  2623. // pamet na pozice vody
  2624. pRain->Wpos = (BOD *) malloc(cWaters * sizeof(BOD));
  2625. if (!pRain->Wpos) {
  2626. free((void *) pRain->hWHnizdo);
  2627. free((void *) pRain->Wpivot);
  2628. pRain->bWaterCircles = 0;
  2629. return 0;
  2630. }
  2631. // vypocet potrebne velikosti pameti na castice
  2632. pRain->SizeofWCastice = cWaters * 10;
  2633. // pamet na castice
  2634. pRain->pWCastice =
  2635. (PAR_KOUR_STOPA *) malloc(pRain->SizeofWCastice * sizeof(PAR_KOUR_STOPA));
  2636. if (!pRain->pWCastice) {
  2637. free((void *) pRain->hWHnizdo);
  2638. free((void *) pRain->Wpivot);
  2639. free((void *) pRain->Wpos);
  2640. pRain->bWaterCircles = 0;
  2641. return 0;
  2642. }
  2643. material = kom_najdi_material("ckolo1");
  2644. if (material == -1)
  2645. kprintf(1, "Nelze najit material ckolo1");
  2646. pCastice = &pRain->pWCastice[0];
  2647. pCastice->rychlost_x = 0.01f;
  2648. pCastice->rychlost_y = 0.01f;
  2649. pCastice->utlum_x = pCastice->utlum_y = 3.0f;
  2650. pCastice->r = pCastice->g = pCastice->b = 1.0f;
  2651. pCastice->a = 0.8f;
  2652. pCastice->da = pCastice->dr = pCastice->dg = pCastice->db = -3.0f;
  2653. pCastice->ka = 0.0f;
  2654. pRain->Wnx.x = 1;
  2655. pRain->Wnx.y = 0;
  2656. pRain->Wnx.z = 0;
  2657. pRain->Wny.x = 0;
  2658. pRain->Wny.y = 0;
  2659. pRain->Wny.z = 1;
  2660. pRain->pWSystem = par_vyrob();
  2661. if (pRain->pWSystem == -1) {
  2662. free((void *) pRain->hWHnizdo);
  2663. free((void *) pRain->Wpivot);
  2664. free((void *) pRain->Wpos);
  2665. free((void *) pRain->pWCastice);
  2666. pRain->bWaterCircles = 0;
  2667. return 0;
  2668. }
  2669. par_set_param(pRain->pWSystem, material,
  2670. TPAR_NO_FOG | TPAR_3D | TPAR_SCALE_ADD | TPAR_VETSI | TPAR_AUTOREMOVE,
  2671. (BOD *) pos, NULL);
  2672. pCastice = pRain->pWCastice;
  2673. par_vloz_kour_stopu(pRain->pWSystem, pCastice, pRain->SizeofWCastice);
  2674. for (i = 0; i < pRain->SizeofWHnizda; i++) {
  2675. pRain->hWHnizdo[i] = par_vloz_hnizdo(pRain->pWSystem);
  2676. if (pRain->hWHnizdo[i] != -1) {
  2677. pItem = am_Find_Next_Water(&LastItem, p_Level);
  2678. if (pItem) {
  2679. kom_mesh_get_float(pItem->Index_Of_Game_Mesh, &pRain->Wpos[i].x,
  2680. &pRain->Wpos[i].y, &pRain->Wpos[i].z, &rot);
  2681. memcpy((void *) &pRain->Wpivot[i], (void *) &pRain->Wpos[i],
  2682. sizeof(BOD));
  2683. pRain->Wpivot[i].x +=
  2684. (rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX);
  2685. pRain->Wpivot[i].z +=
  2686. (rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX);
  2687. pRain->Wpivot[i].y -= 0.3f;
  2688. intensity =
  2689. (int) ceil((uiIntensity / 2.0f) +
  2690. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) *
  2691. ((uiIntensity * fmaxDivergence) / 2.0f));
  2692. delay = rand() % uiIntensity;
  2693. par_vloz_hnizdo_timer(pRain->hWHnizdo[i], intensity, delay);
  2694. par_vloz_hnizdo_komplet(pRain->hWHnizdo[i], intensity,
  2695. &pRain->Wpivot[i], pCastice);
  2696. pWHnizdo = par_cti_hnizdo(pRain->hWHnizdo[i]);
  2697. if (pWHnizdo) {
  2698. pWHnizdo->p_nx = &pRain->Wnx;
  2699. pWHnizdo->p_ny = &pRain->Wny;
  2700. }
  2701. }
  2702. }
  2703. }
  2704. par_go(pRain->pWSystem, &pRain->flag, 0, 0);
  2705. pRain->bWaterCircles = 1;
  2706. return 1;
  2707. }
  2708. int am_Create_Rain(LEVELINFO * p_Level, RAINSYSTEM * pRain, float fRadius,
  2709. unsigned int uiDensity, unsigned int uiIntensity, float fmaxDivergence,
  2710. float fSky)
  2711. {
  2712. PARMETAC_HNIZDO *pHnizdo;
  2713. float fvPos[3];
  2714. PAR_KOUR_STOPA *pCastice;
  2715. int i, material, intensity, delay;
  2716. kom_get_fyz_souradnice((int) floor(p_Level->Size[0] / 2.0f), 0,
  2717. (int) floor(p_Level->Size[2] / 2.0f), (BOD *) fvPos);
  2718. fvPos[1] = ber.y_start;
  2719. pRain->fDist = fRadius; // radius deste
  2720. pRain->uiDensity = uiDensity; // hustota deste (pocet hnizd)
  2721. pRain->uiIntensity = uiIntensity; // intenzita deste (casovy interval knizd)
  2722. pRain->fSky = fSky; // vyska oblohy (y souradnice, odkud kapky padaji)
  2723. pRain->fLowPlain = ber.y_start; // dno levelu
  2724. memcpy((void *) &pRain->RainCenter, (void *) fvPos, 3 * sizeof(float));
  2725. // pamet na hnizda
  2726. pRain->hHnizdo = (int *) malloc(uiDensity * sizeof(int));
  2727. if (!pRain->hHnizdo) {
  2728. pRain->bRain = 0;
  2729. return 0;
  2730. }
  2731. else
  2732. pRain->SizeofHnizda = uiDensity;
  2733. // pamet na pivoty
  2734. pRain->pivot = (BOD *) malloc(uiDensity * sizeof(BOD));
  2735. if (!pRain->pivot) {
  2736. free((void *) pRain->hHnizdo);
  2737. pRain->bRain = 0;
  2738. return 0;
  2739. }
  2740. // vypocet potrebne velikosti pameti na castice
  2741. pRain->SizeofCastice = (int) ceil((uiDensity * 2) + (fRadius * fRadius));
  2742. // pamet na castice
  2743. pRain->pCastice =
  2744. (PAR_KOUR_STOPA *) malloc(pRain->SizeofCastice * sizeof(PAR_KOUR_STOPA));
  2745. if (!pRain->pCastice) {
  2746. free((void *) pRain->hHnizdo);
  2747. free((void *) pRain->pivot);
  2748. pRain->bRain = 0;
  2749. return 0;
  2750. }
  2751. // prvotni nagenerovani deste
  2752. material = kom_najdi_material("ckapka3");
  2753. if (material == -1)
  2754. kprintf(1, "Nelze najit material ckapka3");
  2755. pCastice = &pRain->pCastice[0];
  2756. pCastice->rychlost_x = 0.3f;
  2757. pCastice->rychlost_y = 0.02f;
  2758. pCastice->utlum_x = pCastice->utlum_y = 0.0f;
  2759. pCastice->r = pCastice->g = pCastice->b = 1.0f;
  2760. pCastice->a = 1.0f;
  2761. pCastice->da = pCastice->dr = pCastice->dg = pCastice->db = 0.0f;
  2762. pRain->dir.x = (rand() & 0x1 ? randf() : -randf()) / (float) (2 * RAND_MAX);
  2763. pRain->dir.y = -27.0f;
  2764. pRain->dir.z = (rand() & 0x1 ? randf() : -randf()) / (float) (2 * RAND_MAX);
  2765. memcpy((void *) &pRain->nx, (void *) &pRain->dir, sizeof(BOD));
  2766. norm_vect(&pRain->nx.x, &pRain->nx.y, &pRain->nx.z);
  2767. pRain->pSystem = par_vyrob();
  2768. if (pRain->pSystem == -1) {
  2769. free((void *) pRain->hHnizdo);
  2770. free((void *) pRain->pivot);
  2771. free((void *) pRain->pCastice);
  2772. pRain->bRain = 0;
  2773. return 0;
  2774. }
  2775. par_set_param(pRain->pSystem, material,
  2776. TPAR_3D | TPAR_HALF_LIFE | TPAR_YPLANE_LOW | TPAR_VETSI | TPAR_AUTOREMOVE
  2777. | TPAR_DIR | TPAR_NO_FOG, (BOD *) fvPos, NULL);
  2778. pCastice = pRain->pCastice;
  2779. par_vloz_kour_stopu(pRain->pSystem, pCastice, pRain->SizeofCastice);
  2780. for (i = 0; i < pRain->SizeofHnizda; i++) {
  2781. pRain->hHnizdo[i] = par_vloz_hnizdo(pRain->pSystem);
  2782. if (pRain->hHnizdo[i] != -1) {
  2783. intensity =
  2784. (int) ceil(uiIntensity +
  2785. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) *
  2786. (uiIntensity * fmaxDivergence));
  2787. delay = rand() % uiIntensity;
  2788. par_vloz_hnizdo_timer(pRain->hHnizdo[i], intensity, delay);
  2789. par_vloz_hnizdo_komplet(pRain->hHnizdo[i], intensity, &pRain->pivot[i],
  2790. pCastice);
  2791. memcpy((void *) &pRain->pivot[i], (void *) fvPos, 3 * sizeof(float));
  2792. pRain->pivot[i].x +=
  2793. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * fRadius;
  2794. pRain->pivot[i].z +=
  2795. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * fRadius;
  2796. pRain->pivot[i].y = ber.y_start + fSky;
  2797. par_vloz_hnizdo_dir(pRain->hHnizdo[i], &pRain->dir);
  2798. par_vloz_hnizdo_y_plane(pRain->hHnizdo[i], pRain->fLowPlain);
  2799. pHnizdo = par_cti_hnizdo(pRain->hHnizdo[i]);
  2800. if (pHnizdo) {
  2801. pHnizdo->p_nx = &pRain->nx;
  2802. pHnizdo->p_ny = &pRain->ny;
  2803. }
  2804. }
  2805. }
  2806. par_go(pRain->pSystem, &pRain->flag, 0, 0);
  2807. pRain->bRain = 1;
  2808. am_Create_Water_Circles(p_Level, pRain, fRadius, uiDensity, uiIntensity,
  2809. fmaxDivergence);
  2810. return 1;
  2811. }
  2812. int am_Create_Snow(LEVELINFO * p_Level, SNOWSYSTEM * pSnow, float fRadius,
  2813. unsigned int uiDensity, unsigned int uiIntensity, float fmaxDivergence,
  2814. float fSky)
  2815. {
  2816. float fvPos[3];
  2817. PAR_KOUR_STOPA *pCastice;
  2818. int i, material, intensity, delay;
  2819. kom_get_fyz_souradnice((int) floor(p_Level->Size[0] / 2.0f), 0,
  2820. (int) floor(p_Level->Size[2] / 2.0f), (BOD *) fvPos);
  2821. fvPos[1] = ber.y_start;
  2822. pSnow->fDist = fRadius; // radius snehu
  2823. pSnow->uiDensity = uiDensity; // hustota snehu (pocet hnizd)
  2824. pSnow->uiIntensity = uiIntensity; // intenzita snehu (casovy interval knizd)
  2825. pSnow->fSky = fSky; // vyska oblohy (y souradnice, odkud kapky padaji)
  2826. pSnow->fLowPlain = ber.y_start; // dno levelu
  2827. memcpy((void *) &pSnow->SnowCenter, (void *) fvPos, 3 * sizeof(float));
  2828. // pamet na hnizda
  2829. pSnow->hHnizdo = (int *) malloc(uiDensity * sizeof(int));
  2830. if (!pSnow->hHnizdo) {
  2831. pSnow->bSnow = 0;
  2832. return 0;
  2833. }
  2834. else
  2835. pSnow->SizeofHnizda = uiDensity;
  2836. // pamet na pivoty
  2837. pSnow->pivot = (BOD *) malloc(uiDensity * sizeof(BOD));
  2838. if (!pSnow->pivot) {
  2839. free((void *) pSnow->hHnizdo);
  2840. pSnow->bSnow = 0;
  2841. return 0;
  2842. }
  2843. // vypocet potrebne velikosti pameti na castice
  2844. pSnow->SizeofCastice = (int) ceil((uiDensity * 20) + (fRadius * fRadius));
  2845. // pamet na castice
  2846. pSnow->pCastice =
  2847. (PAR_KOUR_STOPA *) malloc(pSnow->SizeofCastice * sizeof(PAR_KOUR_STOPA));
  2848. if (!pSnow->pCastice) {
  2849. free((void *) pSnow->hHnizdo);
  2850. free((void *) pSnow->pivot);
  2851. pSnow->bSnow = 0;
  2852. return 0;
  2853. }
  2854. // prvotni nagenerovani deste
  2855. material = kom_najdi_material("cvlocka1");
  2856. if (material == -1)
  2857. kprintf(1, "Nelze najit material cvlocka1");
  2858. pCastice = &pSnow->pCastice[0];
  2859. pCastice->rychlost_y = 0.02f;
  2860. pCastice->rychlost_y = 0.02f;
  2861. pCastice->utlum_x = pCastice->utlum_y = 0.0f;
  2862. pCastice->r = pCastice->g = pCastice->b = 1.0f;
  2863. pCastice->a = 1.0f;
  2864. pCastice->da = pCastice->dr = pCastice->dg = pCastice->db = 0.0f;
  2865. pSnow->dir.x = (rand() & 0x1 ? randf() : -randf()) / (float) (6 * RAND_MAX);
  2866. pSnow->dir.y = -0.25f;
  2867. pSnow->dir.z = (rand() & 0x1 ? randf() : -randf()) / (float) (6 * RAND_MAX);
  2868. pSnow->pSystem = par_vyrob();
  2869. if (pSnow->pSystem == -1) {
  2870. free((void *) pSnow->hHnizdo);
  2871. free((void *) pSnow->pivot);
  2872. free((void *) pSnow->pCastice);
  2873. pSnow->bSnow = 0;
  2874. return 0;
  2875. }
  2876. par_set_param(pSnow->pSystem, material,
  2877. TPAR_YPLANE_LOW | TPAR_VETSI | TPAR_AUTOREMOVE | TPAR_DIR | TPAR_NO_FOG,
  2878. (BOD *) fvPos, NULL);
  2879. pCastice = pSnow->pCastice;
  2880. par_vloz_kour_stopu(pSnow->pSystem, pCastice, pSnow->SizeofCastice);
  2881. for (i = 0; i < pSnow->SizeofHnizda; i++) {
  2882. pSnow->hHnizdo[i] = par_vloz_hnizdo(pSnow->pSystem);
  2883. if (pSnow->hHnizdo[i] != -1) {
  2884. intensity =
  2885. (int) ceil(uiIntensity +
  2886. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) *
  2887. (uiIntensity * fmaxDivergence));
  2888. delay = rand() % (uiIntensity * 1000);
  2889. par_vloz_hnizdo_timer(pSnow->hHnizdo[i], intensity, delay);
  2890. par_vloz_hnizdo_komplet(pSnow->hHnizdo[i], intensity, &pSnow->pivot[i],
  2891. pCastice);
  2892. memcpy((void *) &pSnow->pivot[i], (void *) fvPos, 3 * sizeof(float));
  2893. pSnow->pivot[i].x +=
  2894. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * fRadius;
  2895. pSnow->pivot[i].z +=
  2896. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * fRadius;
  2897. pSnow->pivot[i].y = fSky;
  2898. par_vloz_hnizdo_dir(pSnow->hHnizdo[i], &pSnow->dir);
  2899. par_vloz_hnizdo_y_plane(pSnow->hHnizdo[i], pSnow->fLowPlain);
  2900. //pregenerovani nekterych parametru
  2901. pCastice[0].rychlost_y = pCastice[0].rychlost_x =
  2902. randf() / (float) (50 * RAND_MAX);
  2903. if (pCastice[0].rychlost_y < 0.005f)
  2904. pCastice[0].rychlost_y = pCastice[0].rychlost_x = 0.005f;
  2905. }
  2906. }
  2907. par_go(pSnow->pSystem, &pSnow->flag, 0, 0);
  2908. pSnow->bSnow = 1;
  2909. return 1;
  2910. }
  2911. void am_Error_NESRelease(NATUREEFFECTSYSTEM * pNESystem)
  2912. {
  2913. if (pNESystem->hHnizdo)
  2914. free((void *) pNESystem->hHnizdo);
  2915. if (pNESystem->pCastice)
  2916. free((void *) pNESystem->pCastice);
  2917. if (pNESystem->pivot)
  2918. free((void *) pNESystem->pivot);
  2919. if (pNESystem->dir)
  2920. free((void *) pNESystem->dir);
  2921. if (pNESystem->nx)
  2922. free((void *) pNESystem->nx);
  2923. if (pNESystem->ny)
  2924. free((void *) pNESystem->ny);
  2925. pNESystem->hHnizdo = NULL;
  2926. pNESystem->pCastice = NULL;
  2927. pNESystem->pivot = NULL;
  2928. pNESystem->dir = NULL;
  2929. pNESystem->nx = NULL;
  2930. pNESystem->ny = NULL;
  2931. }
  2932. int am_Create_Chmiri_Pampelisek(LEVELINFO * p_Level,
  2933. NATUREEFFECTSYSTEM * pNESystem, float fRadius, unsigned int uiDensity,
  2934. unsigned int uiIntensity, float fSky, float fLowPlane, int iID)
  2935. {
  2936. float fvPos[3];
  2937. PAR_KOUR_STOPA *pCastice;
  2938. int material, i;
  2939. kom_get_fyz_souradnice((int) floor(p_Level->Size[0] / 2.0f), 0,
  2940. (int) floor(p_Level->Size[2] / 2.0f), (BOD *) fvPos);
  2941. fvPos[1] = ber.y_start;
  2942. pNESystem->EffectID = iID;
  2943. pNESystem->fRadius = fRadius;
  2944. pNESystem->uiDensity = uiDensity;
  2945. pNESystem->uiIntensity = uiIntensity;
  2946. pNESystem->fSky = fSky;
  2947. pNESystem->fLowPlain = ber.y_start + fLowPlane;
  2948. pNESystem->SizeofCastice = uiDensity;
  2949. pNESystem->SizeofHnizda = uiDensity;
  2950. pNESystem->SizeofDir = uiDensity;
  2951. pNESystem->SizeofPivot = uiDensity;
  2952. pNESystem->hHnizdo = NULL;
  2953. pNESystem->pCastice = NULL;
  2954. pNESystem->pivot = NULL;
  2955. pNESystem->dir = NULL;
  2956. pNESystem->nx = NULL;
  2957. pNESystem->ny = NULL;
  2958. // pamet na castice
  2959. pNESystem->pCastice =
  2960. (PAR_KOUR_STOPA *) malloc(pNESystem->SizeofCastice *
  2961. sizeof(PAR_KOUR_STOPA));
  2962. if (!pNESystem->pCastice)
  2963. return 0;
  2964. pNESystem->hHnizdo = (int *) malloc(pNESystem->SizeofHnizda * sizeof(int));
  2965. if (!pNESystem->hHnizdo) {
  2966. am_Error_NESRelease(pNESystem);
  2967. return 0;
  2968. }
  2969. pNESystem->pivot = (BOD *) malloc(pNESystem->SizeofPivot * sizeof(BOD));
  2970. if (!pNESystem->pivot) {
  2971. am_Error_NESRelease(pNESystem);
  2972. return 0;
  2973. }
  2974. pNESystem->dir = (BOD *) malloc(pNESystem->SizeofDir * sizeof(BOD));
  2975. if (!pNESystem->dir) {
  2976. am_Error_NESRelease(pNESystem);
  2977. return 0;
  2978. }
  2979. material = kom_najdi_material("cchmiri1");
  2980. if (material == -1)
  2981. kprintf(1, "Nelze najit material cchmiri1");
  2982. pCastice = &pNESystem->pCastice[0];
  2983. pCastice->rychlost_x = 0.16f;
  2984. pCastice->rychlost_y = 0.08f;
  2985. pCastice->utlum_x = pCastice->utlum_y = 0.0f;
  2986. pCastice->r = pCastice->g = pCastice->b = 1.0f;
  2987. pCastice->a = 1.0f;
  2988. pCastice->da = pCastice->dr = pCastice->dg = pCastice->db = 0.0f;
  2989. pNESystem->pSystem = par_vyrob();
  2990. if (pNESystem->pSystem == -1) {
  2991. free((void *) pNESystem->pCastice);
  2992. return 0;
  2993. }
  2994. par_set_param(pNESystem->pSystem, material, TPAR_YPLANE_LOW | TPAR_VETSI |
  2995. TPAR_AUTOREMOVE | TPAR_DIR | TPAR_VITR | TPAR_NO_FOG, (BOD *) fvPos,
  2996. NULL);
  2997. pCastice = pNESystem->pCastice;
  2998. par_vloz_kour_stopu(pNESystem->pSystem, pCastice, pNESystem->SizeofCastice);
  2999. for (i = 0; i < pNESystem->SizeofHnizda; i++) {
  3000. pNESystem->hHnizdo[i] = par_vloz_hnizdo(pNESystem->pSystem);
  3001. if (pNESystem->hHnizdo[i] != -1) {
  3002. par_vloz_hnizdo_komplet(pNESystem->hHnizdo[i], uiIntensity,
  3003. &pNESystem->pivot[i], pCastice);
  3004. par_vloz_hnizdo_timer(pNESystem->hHnizdo[i], uiIntensity,
  3005. -1 * uiIntensity);
  3006. memcpy((void *) &pNESystem->pivot[i], (void *) fvPos,
  3007. 3 * sizeof(float));
  3008. pNESystem->pivot[i].x +=
  3009. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * fRadius;
  3010. pNESystem->pivot[i].z +=
  3011. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * fRadius;
  3012. pNESystem->pivot[i].y = fSky;
  3013. pNESystem->dir[i].x =
  3014. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * 0.25f;
  3015. //pNESystem->dir[i].y = -0.15f;
  3016. pNESystem->dir[i].y = (-randf() / (float) (RAND_MAX)) * 0.25f;
  3017. pNESystem->dir[i].z =
  3018. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * 0.25f;
  3019. par_vloz_hnizdo_dir(pNESystem->hHnizdo[i], &pNESystem->dir[i]);
  3020. par_vloz_hnizdo_y_plane(pNESystem->hHnizdo[i], pNESystem->fLowPlain);
  3021. par_vloz_hnizdo_vitr(pNESystem->hHnizdo[i], (BOD *) p_Level->fVitr);
  3022. }
  3023. }
  3024. par_go(pNESystem->pSystem, &pNESystem->flag, 0, 0);
  3025. pNESystem->dwTime = 0;
  3026. pNESystem->dwRegTime = uiIntensity;
  3027. return 1;
  3028. }
  3029. int am_Create_Chmiri(LEVELINFO * p_Level, NATUREEFFECTSYSTEM * pNESystem,
  3030. float fRadius, unsigned int uiDensity,
  3031. unsigned int uiIntensity, float fSky, float fLowPlane,
  3032. char *cMaterial, int iID)
  3033. {
  3034. float fvPos[3];
  3035. PAR_KOUR_STOPA *pCastice;
  3036. int material, i;
  3037. kom_get_fyz_souradnice((int) floor(p_Level->Size[0] / 2.0f), 0,
  3038. (int) floor(p_Level->Size[2] / 2.0f), (BOD *) fvPos);
  3039. fvPos[1] = ber.y_start;
  3040. pNESystem->EffectID = iID;
  3041. pNESystem->fRadius = fRadius;
  3042. pNESystem->uiDensity = uiDensity;
  3043. pNESystem->uiIntensity = uiIntensity;
  3044. pNESystem->fSky = fSky;
  3045. pNESystem->fLowPlain = ber.y_start + fLowPlane;
  3046. pNESystem->SizeofCastice = uiDensity;
  3047. pNESystem->SizeofHnizda = uiDensity;
  3048. pNESystem->SizeofDir = uiDensity;
  3049. pNESystem->SizeofPivot = uiDensity;
  3050. pNESystem->hHnizdo = NULL;
  3051. pNESystem->pCastice = NULL;
  3052. pNESystem->pivot = NULL;
  3053. pNESystem->dir = NULL;
  3054. pNESystem->nx = NULL;
  3055. pNESystem->ny = NULL;
  3056. // pamet na castice
  3057. pNESystem->pCastice =
  3058. (PAR_KOUR_STOPA *) malloc(pNESystem->SizeofCastice *
  3059. sizeof(PAR_KOUR_STOPA));
  3060. if (!pNESystem->pCastice)
  3061. return 0;
  3062. pNESystem->hHnizdo = (int *) malloc(pNESystem->SizeofHnizda * sizeof(int));
  3063. if (!pNESystem->hHnizdo) {
  3064. am_Error_NESRelease(pNESystem);
  3065. return 0;
  3066. }
  3067. pNESystem->pivot = (BOD *) malloc(pNESystem->SizeofPivot * sizeof(BOD));
  3068. if (!pNESystem->pivot) {
  3069. am_Error_NESRelease(pNESystem);
  3070. return 0;
  3071. }
  3072. pNESystem->dir = (BOD *) malloc(pNESystem->SizeofDir * sizeof(BOD));
  3073. if (!pNESystem->dir) {
  3074. am_Error_NESRelease(pNESystem);
  3075. return 0;
  3076. }
  3077. material = kom_najdi_material(cMaterial);
  3078. if (material == -1)
  3079. kprintf(1, "Nelze najit material %s", cMaterial);
  3080. pCastice = &pNESystem->pCastice[0];
  3081. pCastice->rychlost_x = 0.06f;
  3082. pCastice->rychlost_y = 0.06f;
  3083. pCastice->utlum_x = pCastice->utlum_y = 0.0f;
  3084. pCastice->r = pCastice->g = pCastice->b = 1.0f;
  3085. pCastice->a = 1.0f;
  3086. pCastice->da = pCastice->dr = pCastice->dg = pCastice->db = 0.0f;
  3087. pNESystem->pSystem = par_vyrob();
  3088. if (pNESystem->pSystem == -1) {
  3089. free((void *) pNESystem->pCastice);
  3090. return 0;
  3091. }
  3092. par_set_param(pNESystem->pSystem, material, TPAR_YPLANE_LOW | TPAR_VETSI |
  3093. TPAR_AUTOREMOVE | TPAR_DIR | TPAR_VITR | TPAR_NO_FOG, (BOD *) fvPos,
  3094. NULL);
  3095. pCastice = pNESystem->pCastice;
  3096. par_vloz_kour_stopu(pNESystem->pSystem, pCastice, pNESystem->SizeofCastice);
  3097. for (i = 0; i < pNESystem->SizeofHnizda; i++) {
  3098. pNESystem->hHnizdo[i] = par_vloz_hnizdo(pNESystem->pSystem);
  3099. if (pNESystem->hHnizdo[i] != -1) {
  3100. par_vloz_hnizdo_komplet(pNESystem->hHnizdo[i], uiIntensity,
  3101. &pNESystem->pivot[i], pCastice);
  3102. par_vloz_hnizdo_timer(pNESystem->hHnizdo[i], uiIntensity,
  3103. -1 * uiIntensity);
  3104. memcpy((void *) &pNESystem->pivot[i], (void *) fvPos,
  3105. 3 * sizeof(float));
  3106. pNESystem->pivot[i].x +=
  3107. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * fRadius;
  3108. pNESystem->pivot[i].z +=
  3109. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * fRadius;
  3110. pNESystem->pivot[i].y = fSky;
  3111. pNESystem->dir[i].x =
  3112. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * 0.25f;
  3113. //pNESystem->dir[i].y = -0.15f;
  3114. pNESystem->dir[i].y = (-randf() / (float) (RAND_MAX)) * 0.25f;
  3115. pNESystem->dir[i].z =
  3116. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * 0.25f;
  3117. par_vloz_hnizdo_dir(pNESystem->hHnizdo[i], &pNESystem->dir[i]);
  3118. par_vloz_hnizdo_y_plane(pNESystem->hHnizdo[i], pNESystem->fLowPlain);
  3119. par_vloz_hnizdo_vitr(pNESystem->hHnizdo[i], (BOD *) p_Level->fVitr);
  3120. }
  3121. }
  3122. par_go(pNESystem->pSystem, &pNESystem->flag, 0, 0);
  3123. pNESystem->dwTime = 0;
  3124. pNESystem->dwRegTime = uiIntensity;
  3125. return 1;
  3126. }
  3127. int am_Create_Svetlusky(LEVELINFO * p_Level, NATUREEFFECTSYSTEM * pNESystem,
  3128. float fRadius, unsigned int uiDensity,
  3129. unsigned int uiIntensity, float fSky, float fLowPlane,
  3130. char *cMaterial, int iID)
  3131. {
  3132. float fvPos[3], r;
  3133. PAR_KOUR_STOPA *pCastice;
  3134. int material, i;
  3135. kom_get_fyz_souradnice((int) floor(p_Level->Size[0] / 2.0f), 0,
  3136. (int) floor(p_Level->Size[2] / 2.0f), (BOD *) fvPos);
  3137. fvPos[1] = ber.y_start;
  3138. pNESystem->EffectID = iID;
  3139. pNESystem->fRadius = fRadius;
  3140. pNESystem->uiDensity = uiDensity;
  3141. pNESystem->uiIntensity = uiIntensity;
  3142. pNESystem->fSky = ber.y_start + fSky;
  3143. pNESystem->fLowPlain = ber.y_start;
  3144. pNESystem->SizeofCastice = uiDensity;
  3145. pNESystem->SizeofHnizda = uiDensity;
  3146. pNESystem->SizeofDir = uiDensity;
  3147. pNESystem->SizeofPivot = uiDensity;
  3148. pNESystem->hHnizdo = NULL;
  3149. pNESystem->pCastice = NULL;
  3150. pNESystem->pivot = NULL;
  3151. pNESystem->dir = NULL;
  3152. pNESystem->nx = NULL;
  3153. pNESystem->ny = NULL;
  3154. // pamet na castice
  3155. pNESystem->pCastice =
  3156. (PAR_KOUR_STOPA *) malloc(pNESystem->SizeofCastice *
  3157. sizeof(PAR_KOUR_STOPA));
  3158. if (!pNESystem->pCastice)
  3159. return 0;
  3160. pNESystem->hHnizdo = (int *) malloc(pNESystem->SizeofHnizda * sizeof(int));
  3161. if (!pNESystem->hHnizdo) {
  3162. am_Error_NESRelease(pNESystem);
  3163. return 0;
  3164. }
  3165. pNESystem->pivot = (BOD *) malloc(pNESystem->SizeofPivot * sizeof(BOD));
  3166. if (!pNESystem->pivot) {
  3167. am_Error_NESRelease(pNESystem);
  3168. return 0;
  3169. }
  3170. pNESystem->dir = (BOD *) malloc(pNESystem->SizeofDir * sizeof(BOD));
  3171. if (!pNESystem->dir) {
  3172. am_Error_NESRelease(pNESystem);
  3173. return 0;
  3174. }
  3175. material = kom_najdi_material(cMaterial);
  3176. if (material == -1)
  3177. kprintf(1, "Nelze najit material %s", cMaterial);
  3178. pCastice = &pNESystem->pCastice[0];
  3179. pCastice->rychlost_x = 0.06f;
  3180. pCastice->rychlost_y = 0.06f;
  3181. pCastice->utlum_x = pCastice->utlum_y = 0.0f;
  3182. pCastice->r = 0.99f;
  3183. pCastice->g = 0.96f;
  3184. pCastice->b = 0.66f;
  3185. pCastice->a = 1.0f;
  3186. pCastice->da = pCastice->dr = pCastice->dg = pCastice->db = 0.0f;
  3187. pNESystem->pSystem = par_vyrob();
  3188. if (pNESystem->pSystem == -1) {
  3189. free((void *) pNESystem->pCastice);
  3190. return 0;
  3191. }
  3192. par_set_param(pNESystem->pSystem, material, TPAR_YPLANE_TOP | TPAR_VETSI |
  3193. TPAR_AUTOREMOVE | TPAR_DIR | TPAR_VITR | TPAR_NO_FOG, (BOD *) fvPos,
  3194. NULL);
  3195. pCastice = pNESystem->pCastice;
  3196. par_vloz_kour_stopu(pNESystem->pSystem, pCastice, pNESystem->SizeofCastice);
  3197. for (i = 0; i < pNESystem->SizeofHnizda; i++) {
  3198. r = (randf() / (float) (RAND_MAX)) * 0.1f;
  3199. pCastice->rychlost_x = 0.05f + r;
  3200. pCastice->rychlost_y = 0.05f + r;
  3201. pNESystem->hHnizdo[i] = par_vloz_hnizdo(pNESystem->pSystem);
  3202. if (pNESystem->hHnizdo[i] != -1) {
  3203. par_vloz_hnizdo_komplet(pNESystem->hHnizdo[i], uiIntensity,
  3204. &pNESystem->pivot[i], pCastice);
  3205. par_vloz_hnizdo_timer(pNESystem->hHnizdo[i], uiIntensity,
  3206. -1 * uiIntensity);
  3207. memcpy((void *) &pNESystem->pivot[i], (void *) fvPos,
  3208. 3 * sizeof(float));
  3209. pNESystem->pivot[i].x +=
  3210. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * fRadius;
  3211. pNESystem->pivot[i].z +=
  3212. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * fRadius;
  3213. pNESystem->pivot[i].y = ber.y_start;
  3214. pNESystem->dir[i].x =
  3215. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * 0.25f;
  3216. //pNESystem->dir[i].y = -0.15f;
  3217. pNESystem->dir[i].y = (randf() / (float) (RAND_MAX)) * 0.5f;
  3218. pNESystem->dir[i].z =
  3219. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * 0.25f;
  3220. par_vloz_hnizdo_dir(pNESystem->hHnizdo[i], &pNESystem->dir[i]);
  3221. par_vloz_hnizdo_y_plane(pNESystem->hHnizdo[i], pNESystem->fSky);
  3222. par_vloz_hnizdo_vitr(pNESystem->hHnizdo[i], &pNESystem->dir[i]);
  3223. }
  3224. }
  3225. par_go(pNESystem->pSystem, &pNESystem->flag, 0, 0);
  3226. pNESystem->dwTime = 0;
  3227. pNESystem->dwGenTimeCounter = 0;
  3228. pNESystem->dwRegTime = 500;
  3229. pNESystem->dwGenTime = rand() % (uiIntensity * 10);
  3230. pNESystem->iGenProbability = uiIntensity;
  3231. return 1;
  3232. }
  3233. int am_Create_Musku(LEVELINFO * p_Level, NATUREEFFECTSYSTEM * pNESystem,
  3234. float fRadius, unsigned int uiDensity,
  3235. unsigned int uiIntensity, float fSky, float fLowPlane,
  3236. char *cMaterial, int iID)
  3237. {
  3238. PARMETAC_HNIZDO *pHnizdo;
  3239. float fvPos[3];
  3240. PAR_KOUR_STOPA *pCastice;
  3241. int material, i;
  3242. kom_get_fyz_souradnice((int) floor(p_Level->Size[0] / 2.0f), 0,
  3243. (int) floor(p_Level->Size[2] / 2.0f), (BOD *) fvPos);
  3244. fvPos[1] = ber.y_start;
  3245. pNESystem->EffectID = iID;
  3246. pNESystem->fRadius = fRadius;
  3247. pNESystem->uiDensity = uiDensity;
  3248. pNESystem->uiIntensity = uiIntensity;
  3249. pNESystem->fSky = ber.y_start + fSky;
  3250. pNESystem->fLowPlain = ber.y_start + fLowPlane;
  3251. pNESystem->SizeofCastice = uiDensity;
  3252. pNESystem->SizeofHnizda = uiDensity;
  3253. pNESystem->SizeofDir = uiDensity;
  3254. pNESystem->SizeofPivot = uiDensity;
  3255. pNESystem->SizeofNX = uiDensity;
  3256. pNESystem->SizeofNY = uiDensity;
  3257. pNESystem->hHnizdo = NULL;
  3258. pNESystem->pCastice = NULL;
  3259. pNESystem->pivot = NULL;
  3260. pNESystem->dir = NULL;
  3261. pNESystem->nx = NULL;
  3262. pNESystem->ny = NULL;
  3263. // pamet na castice
  3264. pNESystem->pCastice =
  3265. (PAR_KOUR_STOPA *) malloc(pNESystem->SizeofCastice *
  3266. sizeof(PAR_KOUR_STOPA));
  3267. if (!pNESystem->pCastice)
  3268. return 0;
  3269. pNESystem->hHnizdo = (int *) malloc(pNESystem->SizeofHnizda * sizeof(int));
  3270. if (!pNESystem->hHnizdo) {
  3271. am_Error_NESRelease(pNESystem);
  3272. return 0;
  3273. }
  3274. pNESystem->pivot = (BOD *) malloc(pNESystem->SizeofPivot * sizeof(BOD));
  3275. if (!pNESystem->pivot) {
  3276. am_Error_NESRelease(pNESystem);
  3277. return 0;
  3278. }
  3279. pNESystem->dir = (BOD *) malloc(pNESystem->SizeofDir * sizeof(BOD));
  3280. if (!pNESystem->dir) {
  3281. am_Error_NESRelease(pNESystem);
  3282. return 0;
  3283. }
  3284. pNESystem->nx = (BOD *) malloc(pNESystem->SizeofNX * sizeof(BOD));
  3285. if (!pNESystem->nx) {
  3286. am_Error_NESRelease(pNESystem);
  3287. return 0;
  3288. }
  3289. pNESystem->ny = (BOD *) malloc(pNESystem->SizeofNY * sizeof(BOD));
  3290. if (!pNESystem->ny) {
  3291. am_Error_NESRelease(pNESystem);
  3292. return 0;
  3293. }
  3294. material = kom_najdi_material(cMaterial);
  3295. if (material == -1)
  3296. kprintf(1, "Nelze najit material %s", cMaterial);
  3297. pCastice = &pNESystem->pCastice[0];
  3298. pCastice->rychlost_x = 0.06f;
  3299. pCastice->rychlost_y = 0.06f;
  3300. pCastice->utlum_x = pCastice->utlum_y = 0.0f;
  3301. pCastice->r = pCastice->g = pCastice->b = 1.0f;
  3302. pCastice->a = 1.0f;
  3303. pCastice->da = pCastice->dr = pCastice->dg = pCastice->db = 0.0f;
  3304. pNESystem->pSystem = par_vyrob();
  3305. if (pNESystem->pSystem == -1) {
  3306. free((void *) pNESystem->pCastice);
  3307. return 0;
  3308. }
  3309. par_set_param(pNESystem->pSystem, material,
  3310. TPAR_3D | TPAR_HALF_LIFE | TPAR_NO_FOG | TPAR_YPLANE_LOW | TPAR_VETSI |
  3311. TPAR_AUTOREMOVE | TPAR_VITR, (BOD *) fvPos, NULL);
  3312. pCastice = pNESystem->pCastice;
  3313. par_vloz_kour_stopu(pNESystem->pSystem, pCastice, pNESystem->SizeofCastice);
  3314. for (i = 0; i < pNESystem->SizeofHnizda; i++) {
  3315. pNESystem->hHnizdo[i] = par_vloz_hnizdo(pNESystem->pSystem);
  3316. if (pNESystem->hHnizdo[i] != -1) {
  3317. par_vloz_hnizdo_komplet(pNESystem->hHnizdo[i], uiIntensity,
  3318. &pNESystem->pivot[i], pCastice);
  3319. par_vloz_hnizdo_timer(pNESystem->hHnizdo[i], uiIntensity,
  3320. -1 * uiIntensity);
  3321. memcpy((void *) &pNESystem->pivot[i], (void *) fvPos,
  3322. 3 * sizeof(float));
  3323. pNESystem->pivot[i].x +=
  3324. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * fRadius;
  3325. pNESystem->pivot[i].z +=
  3326. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * fRadius;
  3327. pNESystem->pivot[i].y = fSky;
  3328. pNESystem->dir[i].x =
  3329. (rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX);
  3330. pNESystem->dir[i].y =
  3331. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * 0.15f;
  3332. pNESystem->dir[i].z =
  3333. (rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX);
  3334. norm_vect(&pNESystem->dir[i].x, &pNESystem->dir[i].y,
  3335. &pNESystem->dir[i].z);
  3336. par_vloz_hnizdo_vitr(pNESystem->hHnizdo[i], &pNESystem->dir[i]);
  3337. par_vloz_hnizdo_y_plane(pNESystem->hHnizdo[i], pNESystem->fLowPlain);
  3338. memcpy((void *) &pNESystem->nx[i], (void *) &pNESystem->dir[i],
  3339. sizeof(BOD));
  3340. norm_vect(&pNESystem->nx[i].x, &pNESystem->nx[i].y,
  3341. &pNESystem->nx[i].z);
  3342. pHnizdo = par_cti_hnizdo(pNESystem->hHnizdo[i]);
  3343. if (pHnizdo) {
  3344. pHnizdo->p_nx = &pNESystem->nx[i];
  3345. pHnizdo->p_ny = &pNESystem->ny[i];
  3346. }
  3347. }
  3348. }
  3349. par_go(pNESystem->pSystem, &pNESystem->flag, 0, 0);
  3350. pNESystem->dwTime = 0;
  3351. pNESystem->dwRegTime = 250;
  3352. return 1;
  3353. }
  3354. int am_Create_Padajici_Listi(LEVELINFO * p_Level,
  3355. NATUREEFFECTSYSTEM * pNESystem, float fRadius, unsigned int uiDensity,
  3356. unsigned int uiIntensity, float fSky, float fLowPlane, char *cMaterial,
  3357. int iID)
  3358. {
  3359. PARMETAC_HNIZDO *pHnizdo;
  3360. float fvPos[3];
  3361. PAR_KOUR_STOPA *pCastice;
  3362. int material, i;
  3363. kom_get_fyz_souradnice((int) floor(p_Level->Size[0] / 2.0f), 0,
  3364. (int) floor(p_Level->Size[2] / 2.0f), (BOD *) fvPos);
  3365. fvPos[1] = ber.y_start;
  3366. pNESystem->EffectID = iID;
  3367. pNESystem->fRadius = fRadius;
  3368. pNESystem->uiDensity = uiDensity;
  3369. pNESystem->uiIntensity = uiIntensity;
  3370. pNESystem->fSky = fSky * 2;
  3371. pNESystem->fLowPlain = ber.y_start + fLowPlane;
  3372. pNESystem->SizeofCastice = (uiDensity * 10);
  3373. pNESystem->SizeofHnizda = uiDensity;
  3374. pNESystem->SizeofDir = uiDensity;
  3375. pNESystem->SizeofPivot = uiDensity;
  3376. pNESystem->SizeofNX = uiDensity;
  3377. pNESystem->SizeofNY = uiDensity;
  3378. pNESystem->hHnizdo = NULL;
  3379. pNESystem->pCastice = NULL;
  3380. pNESystem->pivot = NULL;
  3381. pNESystem->dir = NULL;
  3382. pNESystem->nx = NULL;
  3383. pNESystem->ny = NULL;
  3384. // pamet na castice
  3385. pNESystem->pCastice =
  3386. (PAR_KOUR_STOPA *) malloc(pNESystem->SizeofCastice *
  3387. sizeof(PAR_KOUR_STOPA));
  3388. if (!pNESystem->pCastice)
  3389. return 0;
  3390. pNESystem->hHnizdo = (int *) malloc(pNESystem->SizeofHnizda * sizeof(int));
  3391. if (!pNESystem->hHnizdo) {
  3392. am_Error_NESRelease(pNESystem);
  3393. return 0;
  3394. }
  3395. pNESystem->pivot = (BOD *) malloc(pNESystem->SizeofPivot * sizeof(BOD));
  3396. if (!pNESystem->pivot) {
  3397. am_Error_NESRelease(pNESystem);
  3398. return 0;
  3399. }
  3400. pNESystem->dir = (BOD *) malloc(pNESystem->SizeofDir * sizeof(BOD));
  3401. if (!pNESystem->dir) {
  3402. am_Error_NESRelease(pNESystem);
  3403. return 0;
  3404. }
  3405. pNESystem->nx = (BOD *) malloc(pNESystem->SizeofNX * sizeof(BOD));
  3406. if (!pNESystem->nx) {
  3407. am_Error_NESRelease(pNESystem);
  3408. return 0;
  3409. }
  3410. pNESystem->ny = (BOD *) malloc(pNESystem->SizeofNY * sizeof(BOD));
  3411. if (!pNESystem->ny) {
  3412. am_Error_NESRelease(pNESystem);
  3413. return 0;
  3414. }
  3415. material = kom_najdi_material(cMaterial);
  3416. if (material == -1)
  3417. kprintf(1, "Nelze najit material %s", cMaterial);
  3418. pCastice = &pNESystem->pCastice[0];
  3419. pCastice->rychlost_x = 0.2f;
  3420. pCastice->rychlost_y = 0.2f;
  3421. pCastice->utlum_x = pCastice->utlum_y = 0.0f;
  3422. pCastice->r = pCastice->g = pCastice->b = 1.0f;
  3423. pCastice->a = 1.0f;
  3424. pCastice->da = pCastice->dr = pCastice->dg = pCastice->db = 0.0f;
  3425. pNESystem->pSystem = par_vyrob();
  3426. if (pNESystem->pSystem == -1) {
  3427. free((void *) pNESystem->pCastice);
  3428. return 0;
  3429. }
  3430. par_set_param(pNESystem->pSystem, material,
  3431. TPAR_3D | TPAR_HALF_LIFE | TPAR_YPLANE_LOW | TPAR_VETSI | TPAR_VITR |
  3432. TPAR_NO_FOG, (BOD *) fvPos, NULL);
  3433. pCastice = pNESystem->pCastice;
  3434. par_vloz_kour_stopu(pNESystem->pSystem, pCastice, pNESystem->SizeofCastice);
  3435. for (i = 0; i < pNESystem->SizeofHnizda; i++) {
  3436. pNESystem->hHnizdo[i] = par_vloz_hnizdo(pNESystem->pSystem);
  3437. if (pNESystem->hHnizdo[i] != -1) {
  3438. par_vloz_hnizdo_komplet(pNESystem->hHnizdo[i], 3600000,
  3439. &pNESystem->pivot[i], pCastice);
  3440. par_vloz_hnizdo_timer(pNESystem->hHnizdo[i], 3600000, 0);
  3441. memcpy((void *) &pNESystem->pivot[i], (void *) fvPos,
  3442. 3 * sizeof(float));
  3443. pNESystem->pivot[i].x +=
  3444. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * fRadius;
  3445. pNESystem->pivot[i].z +=
  3446. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * fRadius;
  3447. pNESystem->pivot[i].y = fSky;
  3448. pNESystem->dir[i].x =
  3449. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * 0.5f;
  3450. pNESystem->dir[i].y = -1;
  3451. pNESystem->dir[i].z =
  3452. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * 0.5f;
  3453. norm_vect(&pNESystem->dir[i].x, &pNESystem->dir[i].y,
  3454. &pNESystem->dir[i].z);
  3455. par_vloz_hnizdo_vitr(pNESystem->hHnizdo[i], &pNESystem->dir[i]);
  3456. par_vloz_hnizdo_y_plane(pNESystem->hHnizdo[i], pNESystem->fLowPlain);
  3457. pCastice->rychlost_x = pCastice->rychlost_y =
  3458. (randf() / (float) (RAND_MAX));
  3459. if (pCastice->rychlost_x < 0.05f)
  3460. pCastice->rychlost_x = pCastice->rychlost_y = 0.05f;
  3461. if (pCastice->rychlost_x > 0.3f)
  3462. pCastice->rychlost_x = pCastice->rychlost_y = 0.3f;
  3463. par_vloz_hnizdo_scale(pNESystem->hHnizdo[i], pCastice->rychlost_x,
  3464. pCastice->rychlost_y, 0, 0);
  3465. memcpy((void *) &pNESystem->nx[i], (void *) &pNESystem->dir[i],
  3466. sizeof(BOD));
  3467. norm_vect(&pNESystem->nx[i].x, &pNESystem->nx[i].y,
  3468. &pNESystem->nx[i].z);
  3469. pHnizdo = par_cti_hnizdo(pNESystem->hHnizdo[i]);
  3470. if (pHnizdo) {
  3471. pHnizdo->p_nx = &pNESystem->nx[i];
  3472. pHnizdo->p_ny = &pNESystem->ny[i];
  3473. }
  3474. }
  3475. }
  3476. pNESystem->AddDir.x =
  3477. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * 3;
  3478. pNESystem->AddDir.y = (randf() / (float) (RAND_MAX)) * 2;
  3479. pNESystem->AddDir.z =
  3480. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * 3;
  3481. //norm_vect(&pNESystem->AddDir.x, &pNESystem->AddDir.y, &pNESystem->AddDir.z);
  3482. par_go(pNESystem->pSystem, &pNESystem->flag, 0, 0);
  3483. pNESystem->dwTime = 0;
  3484. pNESystem->dwGenTimeCounter = 0;
  3485. pNESystem->dwRegTime = 500;
  3486. pNESystem->dwGenTime = rand() % (uiIntensity * 10);
  3487. pNESystem->iGenProbability = uiIntensity;
  3488. return 1;
  3489. }
  3490. int am_Get_Free_Nature_Effect_System(LEVELINFO * p_Level)
  3491. {
  3492. int i;
  3493. for (i = 0; i < 10; i++)
  3494. if (p_Level->NatureESystem[i].pSystem == -1)
  3495. return i;
  3496. return -1;
  3497. }
  3498. int am_Create_Nature_Effect(LEVELINFO * p_Level, int iEffectID, float fRadius,
  3499. unsigned int uiDensity, unsigned int uiIntensity,
  3500. float fSky, float fLowPlane)
  3501. {
  3502. int k = am_Get_Free_Nature_Effect_System(p_Level);
  3503. if (k == -1)
  3504. return 0;
  3505. switch (iEffectID) {
  3506. case 1:
  3507. return am_Create_Chmiri_Pampelisek(p_Level, &p_Level->NatureESystem[k],
  3508. fRadius, uiDensity, uiIntensity, fSky, fLowPlane, 1);
  3509. case 2:
  3510. return am_Create_Chmiri(p_Level, &p_Level->NatureESystem[k], fRadius,
  3511. uiDensity, uiIntensity, fSky, fLowPlane, "cchmiri2", 2);
  3512. case 3:
  3513. return am_Create_Chmiri(p_Level, &p_Level->NatureESystem[k], fRadius,
  3514. uiDensity, uiIntensity, fSky, fLowPlane, "cchmiri3", 3);
  3515. case 4:
  3516. return am_Create_Musku(p_Level, &p_Level->NatureESystem[k], fRadius,
  3517. uiDensity, uiIntensity, fSky, fLowPlane, "cmuska1", 4);
  3518. case 5:
  3519. return am_Create_Musku(p_Level, &p_Level->NatureESystem[k], fRadius,
  3520. uiDensity, uiIntensity, fSky, fLowPlane, "cmuska2", 5);
  3521. case 6:
  3522. return am_Create_Padajici_Listi(p_Level, &p_Level->NatureESystem[k],
  3523. fRadius, uiDensity, uiIntensity, fSky, fLowPlane, "clist1", 6);
  3524. case 7:
  3525. return am_Create_Padajici_Listi(p_Level, &p_Level->NatureESystem[k],
  3526. fRadius, uiDensity, uiIntensity, fSky, fLowPlane, "clist2", 7);
  3527. case 8:
  3528. return am_Create_Padajici_Listi(p_Level, &p_Level->NatureESystem[k],
  3529. fRadius, uiDensity, uiIntensity, fSky, fLowPlane, "clist3", 8);
  3530. case 9:
  3531. return am_Create_Padajici_Listi(p_Level, &p_Level->NatureESystem[k],
  3532. fRadius, uiDensity, uiIntensity, fSky, fLowPlane, "clist4", 9);
  3533. case 10:
  3534. return am_Create_Padajici_Listi(p_Level, &p_Level->NatureESystem[k],
  3535. fRadius, uiDensity, uiIntensity, fSky, fLowPlane, "clist5", 10);
  3536. case 11:
  3537. return am_Create_Padajici_Listi(p_Level, &p_Level->NatureESystem[k],
  3538. fRadius, uiDensity, uiIntensity, fSky, fLowPlane, "clist6", 11);
  3539. case 12:
  3540. return am_Create_Svetlusky(p_Level, &p_Level->NatureESystem[k], fRadius,
  3541. uiDensity, uiIntensity, fSky, fLowPlane, "csvetluska1", 12);
  3542. default:
  3543. return 0;
  3544. }
  3545. }
  3546. void am_Create_Water_Effect(LEVELINFO * p_Level)
  3547. {
  3548. long guid;
  3549. BOD p(0, 0, 0);
  3550. WATERDESC *pWater;
  3551. int i, c = 0;
  3552. pWater = &p_Level->Water;
  3553. for (i = 0; i < p_Level->Size_of_Level; i++)
  3554. if (p_Level->Level[i])
  3555. if (p_Level->Level[i]->p_Object->Class == 12) {
  3556. c++;
  3557. guid = p_Level->Level[i]->p_Object->GUID;
  3558. }
  3559. if (!c) {
  3560. pWater->bWater = 0;
  3561. return;
  3562. }
  3563. pWater->hWater = vod_vyrob(c);
  3564. for (i = 0; i < p_Level->Size_of_Level; i++)
  3565. if (p_Level->Level[i])
  3566. if (p_Level->Level[i]->p_Object->Class == 12)
  3567. vod_pridej_mesh(pWater->hWater,
  3568. p_Level->Level[i]->Index_Of_Game_Mesh);
  3569. vod_uzavri_meshe(pWater->hWater);
  3570. if (guid == 12000)
  3571. pWater->hVodnik[0] =
  3572. vod_vloz_vodnika(pWater->hWater, &p,
  3573. VOD_AKTIVNI | VOD_Z_PLANE | VOD_DIFF_ADD | VOD_SPEC_ADD, 0.04f, 100, 1,
  3574. 0, 0, 200);
  3575. else
  3576. pWater->hVodnik[0] =
  3577. vod_vloz_vodnika(pWater->hWater, &p,
  3578. VOD_AKTIVNI | VOD_Z_PLANE | VOD_DIFF_ADD | VOD_SPEC_ADD, 0.01f, 100, 1,
  3579. 0, 0, 200);
  3580. if (guid == 12000) {
  3581. vod_vloz_vodnika_spec(pWater->hVodnik[0], 0.1f, 0.1f, 0.1f);
  3582. vod_vloz_vodnika_add_spec(pWater->hVodnik[0], 0, 0, 0);
  3583. vod_vloz_vodnika_diff(pWater->hVodnik[0], 0.05f, 0.05f, 0.05f, 0.125f);
  3584. vod_vloz_vodnika_add_diff(pWater->hVodnik[0], 0, 0, 0, 0);
  3585. }
  3586. else {
  3587. vod_vloz_vodnika_spec(pWater->hVodnik[0], 0.05f, 0.05f, 0.05f);
  3588. vod_vloz_vodnika_add_spec(pWater->hVodnik[0], 0, 0, 0);
  3589. vod_vloz_vodnika_diff(pWater->hVodnik[0], 0.025f, 0.025f, 0.025f, 0.05f);
  3590. vod_vloz_vodnika_add_diff(pWater->hVodnik[0], 0, 0, 0, 0);
  3591. }
  3592. if (guid == 12000) {
  3593. pWater->hVodnik[1] =
  3594. vod_vloz_vodnika(pWater->hWater, &p, VOD_AKTIVNI | VOD_X_PLANE, 0.04f,
  3595. 100, 1, 0, 0, 200);
  3596. pWater->hVodnik[2] =
  3597. vod_vloz_vodnika(pWater->hWater, &p, VOD_AKTIVNI | VOD_BOD, 0.04f, 200,
  3598. 1, 0, 0, 300);
  3599. }
  3600. else {
  3601. pWater->hVodnik[1] =
  3602. vod_vloz_vodnika(pWater->hWater, &p, VOD_AKTIVNI | VOD_X_PLANE, 0.01f,
  3603. 100, 1, 0, 0, 200);
  3604. pWater->hVodnik[2] =
  3605. vod_vloz_vodnika(pWater->hWater, &p, VOD_AKTIVNI | VOD_BOD, 0.01f, 200,
  3606. 1, 0, 0, 300);
  3607. }
  3608. pWater->bWater = 1;
  3609. }
  3610. void am_Create_Prizemni_Mlhu(LEVELINFO * p_Level, float fDensity,
  3611. float fHeight)
  3612. {
  3613. float pos[3];
  3614. int hSvetlo;
  3615. hSvetlo = edl_svetlo_vyrob(EDL_PLOSNE_Y | EDL_SPEC_ADD | EDL_SCENA |
  3616. EDL_DOSAH | EDL_UTLUM_LIN, 0);
  3617. if (hSvetlo != -1) {
  3618. pos[0] = 0;
  3619. pos[1] = ber.y_start;
  3620. pos[2] = 0;
  3621. edl_svetlo_set_pos(hSvetlo, (BOD *) pos, (BOD *) pos);
  3622. edl_svetlo_set_spec(hSvetlo, 0.5f, 0.5f, 0.5f);
  3623. edl_svetlo_set_par(hSvetlo, 1, fHeight, 0, 0);
  3624. p_Level->Mist.hSvetlo = hSvetlo;
  3625. }
  3626. else
  3627. p_Level->Mist.bMist = 0;
  3628. }
  3629. void am_Start_Animaci_Pontonky(ITEMDESC * pItem)
  3630. {
  3631. int guid = pItem->p_Object->GUID == 5007;
  3632. BOD b((float) (rand() % 2), 0, (float) (rand() % 2));
  3633. int anim, i, f1, f2;
  3634. float r;
  3635. if (pItem->a_run != -1)
  3636. return;
  3637. if (!b.x && !b.z) {
  3638. b.x = 1.0f;
  3639. b.z = 1.0f;
  3640. }
  3641. anim = sim_vyrob_animaci(4, 4, 0);
  3642. sim_vloz_pivot(anim, 0.0f, 1.0f, 0.0f);
  3643. sim_vloz_klic_posun(anim, 0, 0.0f, 0.0f, 0.0f, 0);
  3644. i = rand() % 2;
  3645. if (guid == 5007)
  3646. r = rand() / (float) (RAND_MAX * 5);
  3647. else
  3648. r = rand() / (float) (RAND_MAX * 40);
  3649. if (r < 0.05f)
  3650. r = 0.05f;
  3651. if (guid == 5007)
  3652. f1 = (int) ceil(r * 200);
  3653. else
  3654. f1 = (int) ceil(r * 400);
  3655. if (i)
  3656. r *= -1;
  3657. sim_vloz_klic_posun(anim, 1, 0.0f, r, 0.0f, f1);
  3658. if (guid == 5007)
  3659. r = rand() / (float) (RAND_MAX * 5);
  3660. else
  3661. r = rand() / (float) (RAND_MAX * 40);
  3662. if (r < 0.05f)
  3663. r = 0.05f;
  3664. if (guid == 5007)
  3665. f2 = (int) ceil((r * 200) + f1);
  3666. else
  3667. f2 = (int) ceil((r * 400) + f1);
  3668. if (!i)
  3669. r *= -1;
  3670. sim_vloz_klic_posun(anim, 2, 0.0f, r, 0.0f, f1 + f2);
  3671. sim_vloz_klic_posun(anim, 3, 0.0f, 0.0f, 0.0f, 2 * f1 + f2);
  3672. sim_vloz_klic_rotace(anim, 0, &b, 0, 0);
  3673. i = rand() % 2;
  3674. if (guid == 5007)
  3675. r = (rand() / (float) (RAND_MAX)) * 10;
  3676. else
  3677. r = (rand() / (float) (RAND_MAX)) * 2;
  3678. if (i)
  3679. r *= -1;
  3680. sim_vloz_klic_rotace(anim, 1, &b, r, f1);
  3681. if (guid == 5007)
  3682. r = (rand() / (float) (RAND_MAX)) * 10;
  3683. else
  3684. r = (rand() / (float) (RAND_MAX)) * 2;
  3685. if (!i)
  3686. r *= -1;
  3687. sim_vloz_klic_rotace(anim, 2, &b, r, f1 + f2);
  3688. sim_vloz_klic_rotace(anim, 3, &b, 0, 2 * f1 + f2);
  3689. sim_interpoluj_animaci(anim, 2 * f1 + f2 + 1, 1);
  3690. pItem->a_run = rani_aktivuj(anim, &pItem->a_flag, GK_LOOP, 0, 0);
  3691. rani_privaz_mesh(pItem->a_run, pItem->Index_Of_Game_Mesh, 0);
  3692. }
  3693. void am_Start_Animace_Pontonek(LEVELINFO * p_Level)
  3694. {
  3695. int i;
  3696. for (i = 0; i < p_Level->Count_Of_Items; i++)
  3697. if (p_Level->Item[i].p_Object) {
  3698. if (p_Level->Item[i].p_Object->Class == 5 &&
  3699. p_Level->Item[i].p_Object->SubClass == 3)
  3700. if (gl_Check_Anim_Pontonky(&p_Level->Item[i], p_Level))
  3701. am_Start_Animaci_Pontonky(&p_Level->Item[i]);
  3702. }
  3703. else
  3704. kprintf(1, "p_Level->Item[%d].p_Object == NULL", i);
  3705. }
  3706. int am_Get_Free_BarelSparksSystem(LEVELINFO * p_Level)
  3707. {
  3708. int i;
  3709. for (i = 0; i < 30; i++)
  3710. if (p_Level->BarelSparks[i].System == -1)
  3711. return i;
  3712. return -1;
  3713. }
  3714. int am_Create_BarelSparksSystem(ITEMDESC * pTel, LEVELINFO * p_Level)
  3715. {
  3716. int m, k;
  3717. PAR_KOUR_STOPA *pKourovaS;
  3718. SYSTEMKOUROVYCHCASTIC *pSystem;
  3719. float pos[3];
  3720. int rot;
  3721. int size = ftoi(10 / p_Level->KvalitaCastic);
  3722. k = am_Get_Free_BarelSparksSystem(p_Level);
  3723. if (k == -1)
  3724. return -1;
  3725. pSystem = &p_Level->BarelSparks[k];
  3726. pKourovaS = (PAR_KOUR_STOPA *) malloc(size * sizeof(PAR_KOUR_STOPA));
  3727. if (!pKourovaS)
  3728. return -1;
  3729. kom_mesh_get_float(pTel->Index_Of_Game_Mesh, &pos[0], &pos[1], &pos[2],
  3730. &rot);
  3731. pSystem->pCastice = pKourovaS;
  3732. pSystem->Sizeof = size;
  3733. pSystem->dwStart = timeGetTime();
  3734. //m = kom_najdi_material("flare12");
  3735. m = kom_najdi_material("flare100");
  3736. if (m == -1)
  3737. kprintf(1, "Nelze najit material flare12");
  3738. pKourovaS[0].rychlost_x = pKourovaS[0].rychlost_y =
  3739. (randf() / (float) (RAND_MAX)) / 1.0f;
  3740. pKourovaS[0].utlum_x = -2;
  3741. pKourovaS[0].utlum_y = -2;
  3742. pKourovaS[0].r = 0;
  3743. pKourovaS[0].g = 1;
  3744. pKourovaS[0].b = 0.5f;
  3745. pKourovaS[0].a = 1.0f;
  3746. pKourovaS[0].dr = pKourovaS[0].dg = pKourovaS[0].db = pKourovaS[0].da = 0;
  3747. pKourovaS[0].ka = 0;
  3748. pSystem->System = par_vyrob();
  3749. par_set_param(pSystem->System, m,
  3750. TPAR_NO_FOG | TPAR_YPLANE_TOP | TPAR_DIR | TPAR_SCALE | TPAR_VETSI |
  3751. TPAR_AUTOREMOVE, (BOD *) pos, NULL);
  3752. par_vloz_kour_stopu(pSystem->System, pKourovaS, pSystem->Sizeof);
  3753. pSystem->hHnizdo[0] = par_vloz_hnizdo(pSystem->System);
  3754. par_vloz_hnizdo_komplet(pSystem->hHnizdo[0], 10, (BOD *) pSystem->pivot[0],
  3755. pKourovaS);
  3756. par_vloz_hnizdo_timer(pSystem->hHnizdo[0], 10, -10);
  3757. memcpy((void *) pSystem->pivot[0], (void *) pos, 3 * sizeof(float));
  3758. pSystem->pivot[0][1]++;
  3759. pSystem->dir[0][0] = 0;
  3760. pSystem->dir[0][1] = (randf() / (float) (RAND_MAX)) * 1;
  3761. pSystem->dir[0][2] = 0;
  3762. par_vloz_hnizdo_y_plane(pSystem->hHnizdo[0], pos[1] + 3);
  3763. par_vloz_hnizdo_dir(pSystem->hHnizdo[0], (BOD *) pSystem->dir[0]);
  3764. pSystem->dwStart = timeGetTime();
  3765. pSystem->dwTime = 0;
  3766. pSystem->dwStop = 0;
  3767. pSystem->hHnizdo[1] = (int) pTel;
  3768. par_pripoj_funkci(pSystem->System, anmend_ZrusCastice3, 0, 0,
  3769. (void *) pKourovaS);
  3770. par_go(pSystem->System, &pSystem->flag, 0, 0);
  3771. return k;
  3772. }
  3773. void am_Start_Barels(LEVELINFO * p_Level)
  3774. {
  3775. float pos[3];
  3776. int hSvetlo, rot;
  3777. int rnd = rand() % 3;
  3778. int i, k;
  3779. for (i = 0; i < p_Level->Count_Of_Items; i++)
  3780. if (p_Level->Item[i].p_Object) {
  3781. if (p_Level->Item[i].p_Object->Class == 6 &&
  3782. p_Level->Item[i].p_Object->GUID == 6014) {
  3783. hSvetlo = sdl_svetlo_vyrob(SDL_UTLUM_LINEAR);
  3784. kom_mesh_get_float(p_Level->Item[i].Index_Of_Game_Mesh, &pos[0],
  3785. &pos[1], &pos[2], &rot);
  3786. if (hSvetlo != -1) {
  3787. pos[1] += 1.25f;
  3788. sdl_svetlo_set_pos(hSvetlo, (BOD *) pos);
  3789. sdl_svetlo_set_diff(hSvetlo, 0, 1, 0.5f, 1, 4, 4);
  3790. k = am_Create_BarelSparksSystem(&p_Level->Item[i], p_Level);
  3791. if (k > -1)
  3792. p_Level->BarelSparks[k].hHnizdo[2] = (int) hSvetlo;
  3793. else
  3794. sdl_svetlo_zrus(hSvetlo);
  3795. }
  3796. }
  3797. }
  3798. else
  3799. kprintf(1, "p_Level->Item[%d].p_Object == NULL", i);
  3800. }
  3801. int gl_Get_Free_Kour_Pusa(LEVELINFO * p_Level)
  3802. {
  3803. int i;
  3804. for (i = 0; i < 10; i++)
  3805. if (p_Level->KourUst[i].System == -1)
  3806. return i;
  3807. return -1;
  3808. }
  3809. void am_Do_Mouth_Smoke(int iItem, float *pos, LEVELINFO * p_Level)
  3810. {
  3811. int k, m, i;
  3812. PAR_KOUR_STOPA *pKourovaS;
  3813. float f;
  3814. k = gl_Get_Free_Kour_Pusa(p_Level);
  3815. if (k == -1)
  3816. return;
  3817. pKourovaS = (PAR_KOUR_STOPA *) malloc(20 * sizeof(PAR_KOUR_STOPA));
  3818. if (!pKourovaS)
  3819. return;
  3820. p_Level->KourUst[k].pCastice = pKourovaS;
  3821. p_Level->KourUst[k].Sizeof = 1;
  3822. p_Level->KourUst[k].dwStart = timeGetTime();
  3823. m = kom_najdi_material("mrak1_1");
  3824. if (m == -1)
  3825. kprintf(1, "Nelze najit material mrak1_1");
  3826. pKourovaS[0].rychlost_x = 0.02f;
  3827. pKourovaS[0].rychlost_y = 0.02f;
  3828. pKourovaS[0].utlum_x = 2.7f;
  3829. pKourovaS[0].utlum_y = 2.7f;
  3830. pKourovaS[0].r = pKourovaS[0].g = pKourovaS[0].b = 0.95f;
  3831. pKourovaS[0].a = 0.3f;
  3832. pKourovaS[0].dr = pKourovaS[0].dg = pKourovaS[0].db = pKourovaS[0].da =
  3833. -0.2f;
  3834. pKourovaS[0].ka = 0.0f;
  3835. p_Level->KourUst[k].System = par_vyrob();
  3836. par_set_param(p_Level->KourUst[k].System, m,
  3837. TPAR_NO_FOG | TPAR_SCALE | TPAR_VETSI | TPAR_AUTOREMOVE | TPAR_DIR |
  3838. TPAR_VITR, (BOD *) pos, NULL);
  3839. par_vloz_kour_stopu(p_Level->KourUst[k].System, pKourovaS, 20);
  3840. for (i = 0; i < p_Level->KourUst[k].Sizeof; i++) {
  3841. p_Level->KourUst[k].hHnizdo[i] =
  3842. par_vloz_hnizdo(p_Level->KourUst[k].System);
  3843. par_vloz_hnizdo_komplet(p_Level->KourUst[k].hHnizdo[i], 100,
  3844. (BOD *) p_Level->KourUst[k].pivot[i], pKourovaS);
  3845. par_vloz_hnizdo_timer(p_Level->KourUst[k].hHnizdo[i], 100, -100);
  3846. //vygeneruj dir
  3847. p_Level->KourUst[k].dir[i][0] = (rand() & 0x1 ? randf() : -randf());
  3848. p_Level->KourUst[k].dir[i][1] = (randf());
  3849. p_Level->KourUst[k].dir[i][2] = (rand() & 0x1 ? randf() : -randf());
  3850. vektor_norm((BOD *) p_Level->KourUst[k].dir[i]);
  3851. f = (randf() / (float) (RAND_MAX)) * _3DKOREKCE;
  3852. p_Level->KourUst[k].dir[i][0] *= f / 100.0f;
  3853. p_Level->KourUst[k].dir[i][1] *= f / 100.0f;
  3854. p_Level->KourUst[k].dir[i][2] *= f / 100.0f;
  3855. memcpy((void *) p_Level->KourUst[k].pivot[i], (void *) pos,
  3856. 3 * sizeof(float));
  3857. par_vloz_hnizdo_dir(p_Level->KourUst[k].hHnizdo[i],
  3858. (BOD *) p_Level->KourUst[k].dir[i]);
  3859. par_vloz_hnizdo_vitr(p_Level->KourUst[k].hHnizdo[i],
  3860. (BOD *) p_Level->fVitr);
  3861. }
  3862. p_Level->KourUst[k].dwStart = timeGetTime();
  3863. p_Level->KourUst[k].hHnizdo[1] = iItem;
  3864. par_pripoj_funkci(p_Level->KourUst[k].System, anmend_ZrusCastice3, 0, 0,
  3865. (void *) pKourovaS);
  3866. par_go(p_Level->KourUst[k].System, &p_Level->KourUst[k].flag, 0, 0);
  3867. }
  3868. void am_Do_BeatleSmokes(LEVELINFO * p_Level)
  3869. {
  3870. float pos[3], f;
  3871. int rot, i;
  3872. int real;
  3873. BEATLE_SMOKE_SYSTEM *pBeatle;
  3874. if (!p_Level->Snow.bSnow)
  3875. return;
  3876. for (i = 0; i < 10; i++)
  3877. if (p_Level->KourUst[i].System != -1) {
  3878. //vygeneruj dir
  3879. p_Level->KourUst[i].dir[0][0] = (rand() & 0x1 ? randf() : -randf());
  3880. p_Level->KourUst[i].dir[0][1] = (randf());
  3881. p_Level->KourUst[i].dir[0][2] = (rand() & 0x1 ? randf() : -randf());
  3882. vektor_norm((BOD *) p_Level->KourUst[i].dir[0]);
  3883. f = (randf() / (float) (RAND_MAX)) * _3DKOREKCE;
  3884. p_Level->KourUst[i].dir[0][0] *= f / 100.0f;
  3885. p_Level->KourUst[i].dir[0][1] *= f / 100.0f;
  3886. p_Level->KourUst[i].dir[0][2] *= f / 100.0f;
  3887. kom_mesh_get_float(p_Level->Item[p_Level->KourUst[i].hHnizdo[1]].
  3888. Index_Of_Game_Mesh, &pos[0], &pos[1], &pos[2], &rot);
  3889. pos[1] += 0.70f;
  3890. switch (p_Level->Item[p_Level->KourUst[i].hHnizdo[1]].Rotation) {
  3891. case 0:
  3892. pos[2] += 0.5f;
  3893. break;
  3894. case 1:
  3895. pos[0] += 0.5f;
  3896. break;
  3897. case 2:
  3898. pos[2] -= 0.5f;
  3899. break;
  3900. case 3:
  3901. pos[0] -= 0.5f;
  3902. break;
  3903. }
  3904. memcpy((void *) p_Level->KourUst[i].pivot[0], (void *) pos,
  3905. 3 * sizeof(float));
  3906. }
  3907. for (i = 0; i < 6; i++) {
  3908. pBeatle = &p_Level->BeatleSmoke[i];
  3909. if (pBeatle->iItem != -1) {
  3910. if (!p_Level->bGameResume)
  3911. pBeatle->dwRealTime += ber.TimeLastFrame;
  3912. if (pBeatle->dwRealTime > pBeatle->dwExpTime) {
  3913. kom_mesh_get_float(p_Level->Item[pBeatle->iItem].Index_Of_Game_Mesh,
  3914. &pos[0], &pos[1], &pos[2], &rot);
  3915. pos[1] += 0.70f;
  3916. pBeatle->dwRealTime = 0;
  3917. gl_Logical2Real(p_Level->Item[pBeatle->iItem].Pos[0],
  3918. p_Level->Item[pBeatle->iItem].Pos[1],
  3919. p_Level->Item[pBeatle->iItem].Pos[2], &real, p_Level);
  3920. if (!p_Level->Square[real].bUnderWater)
  3921. am_Do_Mouth_Smoke(pBeatle->iItem, pos, p_Level);
  3922. }
  3923. }
  3924. }
  3925. }
  3926. void am_Obsluha_Koure_Brouku(LEVELINFO * p_Level)
  3927. {
  3928. DWORD dwTime, dwEplased;
  3929. int j, i;
  3930. if (!p_Level->Snow.bSnow)
  3931. return;
  3932. for (i = 0; i < 10; i++)
  3933. if (p_Level->KourUst[i].System != -1) {
  3934. dwTime = timeGetTime();
  3935. dwEplased = dwTime - p_Level->KourUst[i].dwStart;
  3936. if (dwEplased > 1500)
  3937. for (j = 0; j < p_Level->KourUst[i].Sizeof; j++)
  3938. if (p_Level->KourUst[i].hHnizdo[j]) {
  3939. par_vloz_hnizdo_pivot(p_Level->KourUst[i].hHnizdo[j], NULL);
  3940. p_Level->KourUst[i].hHnizdo[j] = 0;
  3941. }
  3942. if (!par_get_hnizda(p_Level->KourUst[i].System)) {
  3943. par_zrus(p_Level->KourUst[i].System);
  3944. p_Level->KourUst[i].System = -1;
  3945. }
  3946. }
  3947. }
  3948. void am_Create_Steps_System(LEVELINFO * p_Level)
  3949. {
  3950. int i, m;
  3951. PAR_KOUR_STOPA *pKourovaS;
  3952. PARMETAC_HNIZDO *pHnizdo;
  3953. SYSTEMKOUROVYCHCASTIC *pSystem;
  3954. int size = 100, rot;
  3955. float pos[3];
  3956. for (i = 0; i < 6; i++)
  3957. if (p_Level->BeatleSmoke[i].iItem != -1) {
  3958. pSystem = &p_Level->BeatleSmoke[i].sStopy;
  3959. kom_mesh_get_float(p_Level->Item[p_Level->BeatleSmoke[i].iItem].
  3960. Index_Of_Game_Mesh, &pos[0], &pos[1], &pos[2], &rot);
  3961. pKourovaS = (PAR_KOUR_STOPA *) malloc(size * sizeof(PAR_KOUR_STOPA));
  3962. if (!pKourovaS)
  3963. return;
  3964. pSystem->pCastice = pKourovaS;
  3965. pSystem->Sizeof = size;
  3966. pSystem->dwStart = timeGetTime();
  3967. m = kom_najdi_material("csteps0");
  3968. if (m == -1) {
  3969. kprintf(1, "Nelze najit material csteps0");
  3970. free((void *) pKourovaS);
  3971. return;
  3972. }
  3973. pKourovaS[0].rychlost_x = 0.5f;
  3974. pKourovaS[0].rychlost_y = 0.5f;
  3975. pKourovaS[0].utlum_x = 0;
  3976. pKourovaS[0].utlum_y = 0;
  3977. pKourovaS[0].r = 0.14f;
  3978. pKourovaS[0].g = 0.47f;
  3979. pKourovaS[0].b = 0.65f;
  3980. pKourovaS[0].a = 0.75f;
  3981. pKourovaS[0].dr = pKourovaS[0].dg = pKourovaS[0].db = 0;
  3982. pKourovaS[0].da = -0.02f;
  3983. pKourovaS[0].ka = 0;
  3984. pSystem->System = par_vyrob();
  3985. par_set_param(pSystem->System, m, TPAR_NO_FOG | TPAR_3D |
  3986. TPAR_VETSI | TPAR_AUTOREMOVE, (BOD *) pos, NULL);
  3987. par_vloz_kour_stopu(pSystem->System, pKourovaS, pSystem->Sizeof);
  3988. pSystem->hHnizdo[0] = par_vloz_hnizdo(pSystem->System);
  3989. par_vloz_hnizdo_komplet(pSystem->hHnizdo[0], 1000000,
  3990. (BOD *) pSystem->pivot[0], pKourovaS);
  3991. par_vloz_hnizdo_timer(pSystem->hHnizdo[0], 1000000, 0);
  3992. memcpy((void *) pSystem->pivot[0], (void *) pos, 3 * sizeof(float));
  3993. pSystem->pivot[0][1] -= 0.95f;
  3994. if (pSystem->hHnizdo[0])
  3995. pHnizdo = par_cti_hnizdo(pSystem->hHnizdo[0]);
  3996. pSystem->nx[0][0] = 1;
  3997. pSystem->nx[0][1] = 0;
  3998. pSystem->nx[0][2] = 0;
  3999. pSystem->ny[0][0] = 0;
  4000. pSystem->ny[0][1] = 0;
  4001. pSystem->ny[0][2] = 1;
  4002. pHnizdo->p_nx = (BOD *) pSystem->nx[0];
  4003. pHnizdo->p_ny = (BOD *) pSystem->ny[0];
  4004. pSystem->dwStart = timeGetTime();
  4005. pSystem->dwTime = 0;
  4006. pSystem->dwExpire = 0;
  4007. pSystem->dwExpireTime = 0;
  4008. pSystem->dwStop = 0;
  4009. // pSystem->hHnizdo[1] = 0;
  4010. par_pripoj_funkci(pSystem->System, anmend_ZrusCastice3, 0, 0,
  4011. (void *) pKourovaS);
  4012. par_go(pSystem->System, &pSystem->flag, 0, 0);
  4013. }
  4014. return;
  4015. }
  4016. void am_Change_NXNZ(LEVELINFO * p_Level, ITEMDESC * pItem,
  4017. SYSTEMKOUROVYCHCASTIC * pSystem)
  4018. {
  4019. int iPos[3];
  4020. int real;
  4021. memcpy((void *) iPos, pItem->Pos, 3 * sizeof(int));
  4022. switch (pItem->Rotation) {
  4023. case 0:
  4024. iPos[1]--;
  4025. break;
  4026. case 1:
  4027. iPos[0]--;
  4028. break;
  4029. case 2:
  4030. iPos[1]++;
  4031. break;
  4032. case 3:
  4033. iPos[0]++;
  4034. break;
  4035. }
  4036. gl_Logical2Real(iPos[0], iPos[1], iPos[2], &real, p_Level);
  4037. if (p_Level->Level[real]) {
  4038. if (p_Level->Level[real]->p_Object->Class != 19)
  4039. iPos[2] -= 2;
  4040. }
  4041. else
  4042. iPos[2] -= 2;
  4043. gl_Logical2Real(iPos[0], iPos[1], iPos[2], &real, p_Level);
  4044. if (p_Level->Level[real]) {
  4045. if (p_Level->Level[real]->p_Object->Class != 19)
  4046. return;
  4047. }
  4048. else
  4049. return;
  4050. switch (p_Level->Level[real]->Rotation) {
  4051. case 3:
  4052. pSystem->nx[0][0] = 1;
  4053. pSystem->nx[0][1] = 1;
  4054. pSystem->nx[0][2] = 0;
  4055. pSystem->ny[0][0] = 0;
  4056. pSystem->ny[0][1] = 0;
  4057. pSystem->ny[0][2] = 1;
  4058. break;
  4059. case 1:
  4060. pSystem->nx[0][0] = -1;
  4061. pSystem->nx[0][1] = 1;
  4062. pSystem->nx[0][2] = 0;
  4063. pSystem->ny[0][0] = 0;
  4064. pSystem->ny[0][1] = 0;
  4065. pSystem->ny[0][2] = -1;
  4066. break;
  4067. case 2:
  4068. pSystem->nx[0][0] = 1;
  4069. pSystem->nx[0][1] = 0;
  4070. pSystem->nx[0][2] = 0;
  4071. pSystem->ny[0][0] = 0;
  4072. pSystem->ny[0][1] = 1;
  4073. pSystem->ny[0][2] = 1;
  4074. break;
  4075. case 0:
  4076. pSystem->nx[0][0] = -1;
  4077. pSystem->nx[0][1] = 0;
  4078. pSystem->nx[0][2] = 0;
  4079. pSystem->ny[0][0] = 0;
  4080. pSystem->ny[0][1] = 1;
  4081. pSystem->ny[0][2] = -1;
  4082. break;
  4083. }
  4084. }
  4085. void am_Set_Step(int iFoot, LEVELINFO * p_Level)
  4086. {
  4087. int i, rot;
  4088. float pos[3];
  4089. SYSTEMKOUROVYCHCASTIC *pSystem;
  4090. PARMETAC_HNIZDO *pHnizdo;
  4091. if (p_Level->Actual_Item == -1)
  4092. return;
  4093. for (i = 0; i < 6; i++)
  4094. if (p_Level->Level[p_Level->Actual_Item]->Index_Of_Game_Mesh ==
  4095. p_Level->Item[p_Level->BeatleSmoke[i].iItem].Index_Of_Game_Mesh
  4096. && p_Level->BeatleSmoke[i].iItem != -1) {
  4097. if (p_Level->BeatleSmoke[i].iStepc) {
  4098. kom_mesh_get_float(p_Level->Item[p_Level->BeatleSmoke[i].iItem].
  4099. Index_Of_Game_Mesh, &pos[0], &pos[1], &pos[2], &rot);
  4100. pSystem = &p_Level->BeatleSmoke[i].sStopy;
  4101. memcpy((void *) pSystem->pivot[0], (void *) pos, 3 * sizeof(float));
  4102. if (!iFoot) {
  4103. pSystem->pivot[0][1] -= 0.95f;
  4104. pSystem->nx[0][0] = 1;
  4105. pSystem->nx[0][1] = 0;
  4106. pSystem->nx[0][2] = 0;
  4107. pSystem->ny[0][0] = 0;
  4108. pSystem->ny[0][1] = 0;
  4109. pSystem->ny[0][2] = 1;
  4110. }
  4111. else {
  4112. /*am_Change_NXNZ(p_Level, p_Level->Level[p_Level->Actual_Item], pSystem);
  4113. if(!(p_Level->BeatleSmoke[i].iStepc%2))
  4114. pSystem->pivot[0][1] -= 0.7f;
  4115. else
  4116. pSystem->pivot[0][1] += 0.2f; */
  4117. }
  4118. pHnizdo = par_cti_hnizdo(pSystem->hHnizdo[0]);
  4119. if (pHnizdo) {
  4120. pHnizdo->rotace = p_Level->Level[p_Level->Actual_Item]->Rotation;
  4121. switch (pHnizdo->rotace) {
  4122. case 0:
  4123. if (!(p_Level->BeatleSmoke[i].iStepc % 2))
  4124. pSystem->pivot[0][0] += 0.4f;
  4125. else
  4126. pSystem->pivot[0][0] -= 0.4f;
  4127. break;
  4128. case 2:
  4129. if (!(p_Level->BeatleSmoke[i].iStepc % 2))
  4130. pSystem->pivot[0][0] -= 0.4f;
  4131. else
  4132. pSystem->pivot[0][0] += 0.4f;
  4133. break;
  4134. case 1:
  4135. if (!(p_Level->BeatleSmoke[i].iStepc % 2))
  4136. pSystem->pivot[0][2] -= 0.4f;
  4137. else
  4138. pSystem->pivot[0][2] += 0.4f;
  4139. break;
  4140. case 3:
  4141. if (!(p_Level->BeatleSmoke[i].iStepc % 2))
  4142. pSystem->pivot[0][2] += 0.4f;
  4143. else
  4144. pSystem->pivot[0][2] -= 0.4f;
  4145. break;
  4146. }
  4147. }
  4148. par_vloz_hnizdo_pust_castici(pSystem->hHnizdo[0]);
  4149. }
  4150. p_Level->BeatleSmoke[i].iStepc++;
  4151. return;
  4152. }
  4153. }
  4154. void am_Zero_Step(LEVELINFO * p_Level)
  4155. {
  4156. int i;
  4157. if (p_Level->Actual_Item == -1)
  4158. return;
  4159. p_Level->bSetStep = 0;
  4160. for (i = 0; i < 6; i++)
  4161. if (p_Level->Level[p_Level->Actual_Item]->Index_Of_Game_Mesh ==
  4162. p_Level->Item[p_Level->BeatleSmoke[i].iItem].Index_Of_Game_Mesh
  4163. && p_Level->BeatleSmoke[i].iItem != -1) {
  4164. p_Level->BeatleSmoke[i].iStepc = 0;
  4165. return;
  4166. }
  4167. }
  4168. void am_Release_Steps(LEVELINFO * p_Level)
  4169. {
  4170. int i;
  4171. for (i = 0; i < 6; i++)
  4172. if (p_Level->BeatleSmoke[i].iItem != -1
  4173. && p_Level->BeatleSmoke[i].sStopy.System != -1) {
  4174. kprintf(1, "p_Level->BeatleSmoke[%d], par_zrus %d", i,
  4175. p_Level->BeatleSmoke[i].sStopy.System);
  4176. par_zrus(p_Level->BeatleSmoke[i].sStopy.System);
  4177. p_Level->BeatleSmoke[i].sStopy.System = -1;
  4178. }
  4179. }
  4180. void am_Do_Step(int param, int param2, void *p_param)
  4181. {
  4182. LEVELINFO *p_Level = (LEVELINFO *) p_param;
  4183. if (!p_Level->bSetStep)
  4184. return;
  4185. am_Set_Step(param, p_Level);
  4186. // p_Level->bSetStep = 0;
  4187. }
  4188. void am_Destroy_Steps(ITEMDESC * pItem, LEVELINFO * p_Level)
  4189. {
  4190. float pos[3];
  4191. int rot, i;
  4192. PAR_KOUR_STOPA *pks;
  4193. if (!pItem)
  4194. return;
  4195. kom_mesh_get_float(pItem->Index_Of_Game_Mesh, &pos[0], &pos[1], &pos[2],
  4196. &rot);
  4197. pos[1] += 1.05f;
  4198. for (i = 0; i < 6; i++)
  4199. if (p_Level->BeatleSmoke[i].iItem != -1
  4200. && p_Level->BeatleSmoke[i].sStopy.System != -1) {
  4201. pks = par_cti_hnizdo_castice(p_Level->BeatleSmoke[i].sStopy.hHnizdo[0]);
  4202. if (pks) {
  4203. while (pks) {
  4204. if (pks->p.x >= pos[0] - 1 && pks->p.x <= pos[0] + 1 &&
  4205. pks->p.z >= pos[2] - 1 && pks->p.z <= pos[2] + 1 &&
  4206. pks->p.y >= pos[1] - 0.5f && pks->p.y <= pos[1] + 0.5f)
  4207. pks->a = 0;
  4208. pks = pks->p_next;
  4209. }
  4210. }
  4211. }
  4212. }
  4213. void am_Create_BublSystem_Effect1(float *pos, LEVELINFO * p_Level, int iSize)
  4214. {
  4215. int m;
  4216. PAR_KOUR_STOPA *pKourovaS;
  4217. SYSTEMKOUROVYCHCASTIC *pSystem = &p_Level->BublSystemE.System;
  4218. int size = ftoi(iSize / p_Level->KvalitaCastic);
  4219. pKourovaS = (PAR_KOUR_STOPA *) malloc(size * sizeof(PAR_KOUR_STOPA));
  4220. if (!pKourovaS)
  4221. return;
  4222. pSystem->pCastice = pKourovaS;
  4223. pSystem->Sizeof = size;
  4224. m = kom_najdi_material("cbublina1");
  4225. if (m == -1)
  4226. kprintf(1, "Nelze najit material cbublina1");
  4227. pKourovaS[0].rychlost_x = pKourovaS[0].rychlost_y =
  4228. (randf() / (float) (RAND_MAX)) / 7.0f;
  4229. pKourovaS[0].utlum_x = 0;
  4230. pKourovaS[0].utlum_y = 0;
  4231. pKourovaS[0].r = pKourovaS[0].g = pKourovaS[0].b = 1.0f;
  4232. pKourovaS[0].a = 0.8f;
  4233. pKourovaS[0].dr = pKourovaS[0].dg = pKourovaS[0].db = pKourovaS[0].da = 0;
  4234. pKourovaS[0].ka = 0;
  4235. pSystem->System = par_vyrob();
  4236. par_set_param(pSystem->System, m,
  4237. TPAR_NO_FOG | TPAR_YPLANE_TOP | TPAR_VETSI | TPAR_AUTOREMOVE | TPAR_DIR,
  4238. (BOD *) pos, NULL);
  4239. par_vloz_kour_stopu(pSystem->System, pKourovaS, pSystem->Sizeof);
  4240. pSystem->hHnizdo[0] = par_vloz_hnizdo(pSystem->System);
  4241. par_vloz_hnizdo_komplet(pSystem->hHnizdo[0], 100000,
  4242. (BOD *) pSystem->pivot[0], pKourovaS);
  4243. par_vloz_hnizdo_timer(pSystem->hHnizdo[0], 100000, -100000);
  4244. memcpy((void *) pSystem->pivot[0], (void *) pos, 3 * sizeof(float));
  4245. memcpy((void *) pSystem->pivot[1], (void *) pos, 3 * sizeof(float));
  4246. pSystem->pivot[0][0] +=
  4247. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) / 5.0f;
  4248. pSystem->pivot[0][2] +=
  4249. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) / 5.0f;
  4250. pSystem->dir[0][0] = 0;
  4251. pSystem->dir[0][1] = (randf() / (float) (RAND_MAX)) * 5.0f;
  4252. if (pSystem->dir[0][1] < 1.0f)
  4253. pSystem->dir[0][1] = 1.0f;
  4254. pSystem->dir[0][2] = 0;
  4255. par_vloz_hnizdo_dir(pSystem->hHnizdo[0], (BOD *) pSystem->dir[0]);
  4256. par_vloz_hnizdo_y_plane(pSystem->hHnizdo[0], 50.0f);
  4257. pSystem->dwStart = timeGetTime();
  4258. pSystem->dwTime = 0;
  4259. pSystem->dwStop = 2000;
  4260. p_Level->BublSystemE.bOn = 0;
  4261. par_pripoj_funkci(pSystem->System, anmend_ZrusCastice3, 0, 0,
  4262. (void *) pKourovaS);
  4263. par_go(pSystem->System, &pSystem->flag, 0, 0);
  4264. }
  4265. void am_Create_BublSystem_Effect2(float *pos, LEVELINFO * p_Level, int iSize,
  4266. float yPlane)
  4267. {
  4268. int m;
  4269. PAR_KOUR_STOPA *pKourovaS;
  4270. SYSTEMKOUROVYCHCASTIC *pSystem = &p_Level->BublSystemC.System;
  4271. int size = ftoi(iSize / p_Level->KvalitaCastic);
  4272. pKourovaS = (PAR_KOUR_STOPA *) malloc(size * sizeof(PAR_KOUR_STOPA));
  4273. if (!pKourovaS)
  4274. return;
  4275. pSystem->pCastice = pKourovaS;
  4276. pSystem->Sizeof = size;
  4277. m = kom_najdi_material("cbublina1");
  4278. if (m == -1)
  4279. kprintf(1, "Nelze najit material cbublina1");
  4280. pKourovaS[0].rychlost_x = pKourovaS[0].rychlost_y =
  4281. (randf() / (float) (RAND_MAX)) / 7.0f;
  4282. pKourovaS[0].utlum_x = 0;
  4283. pKourovaS[0].utlum_y = 0;
  4284. pKourovaS[0].r = pKourovaS[0].g = pKourovaS[0].b = 1.0f;
  4285. pKourovaS[0].a = 0.8f;
  4286. pKourovaS[0].dr = pKourovaS[0].dg = pKourovaS[0].db = pKourovaS[0].da = 0;
  4287. pKourovaS[0].ka = 0;
  4288. pSystem->System = par_vyrob();
  4289. par_set_param(pSystem->System, m,
  4290. TPAR_NO_FOG | TPAR_YPLANE_TOP | TPAR_VETSI | TPAR_AUTOREMOVE | TPAR_DIR,
  4291. (BOD *) pos, NULL);
  4292. par_vloz_kour_stopu(pSystem->System, pKourovaS, pSystem->Sizeof);
  4293. pSystem->hHnizdo[0] = par_vloz_hnizdo(pSystem->System);
  4294. par_vloz_hnizdo_komplet(pSystem->hHnizdo[0], 100000,
  4295. (BOD *) pSystem->pivot[0], pKourovaS);
  4296. par_vloz_hnizdo_timer(pSystem->hHnizdo[0], 100000, -100000);
  4297. memcpy((void *) pSystem->pivot[0], (void *) pos, 3 * sizeof(float));
  4298. memcpy((void *) pSystem->pivot[1], (void *) pos, 3 * sizeof(float));
  4299. pSystem->pivot[0][0] +=
  4300. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) / 5.0f;
  4301. pSystem->pivot[0][2] +=
  4302. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) / 5.0f;
  4303. pSystem->dir[0][0] = 0;
  4304. pSystem->dir[0][1] = (randf() / (float) (RAND_MAX)) * 5.0f;
  4305. if (pSystem->dir[0][1] < 1.0f)
  4306. pSystem->dir[0][1] = 1.0f;
  4307. pSystem->dir[0][2] = 0;
  4308. par_vloz_hnizdo_dir(pSystem->hHnizdo[0], (BOD *) pSystem->dir[0]);
  4309. par_vloz_hnizdo_y_plane(pSystem->hHnizdo[0], yPlane);
  4310. pSystem->dwStart = timeGetTime();
  4311. pSystem->dwTime = 0;
  4312. pSystem->dwStop = 2000;
  4313. p_Level->BublSystemC.bOn = 0;
  4314. par_pripoj_funkci(pSystem->System, anmend_ZrusCastice3, 0, 0,
  4315. (void *) pKourovaS);
  4316. par_go(pSystem->System, &pSystem->flag, 0, 0);
  4317. }
  4318. void am_Do_BublSystemE(LEVELINFO * p_Level)
  4319. {
  4320. float f;
  4321. SYSTEMKOUROVYCHCASTIC *pSystem = &p_Level->BublSystemE.System;
  4322. if (p_Level->BublSystemE.System.System == -1)
  4323. return;
  4324. if (!p_Level->bGameResume)
  4325. pSystem->dwTime += ber.TimeLastFrame;
  4326. if (pSystem->dwTime > pSystem->dwStop) {
  4327. pSystem->dwTime = 0;
  4328. if (p_Level->BublSystemE.bOn) {
  4329. p_Level->BublSystemE.bOn = 0;
  4330. par_vloz_hnizdo_timer(pSystem->hHnizdo[0], 100000, 0);
  4331. pSystem->dwStop =
  4332. 3000 + (int) ceil((randf() / (float) (RAND_MAX)) * 1000);
  4333. }
  4334. else {
  4335. pSystem->dwStop = 2000;
  4336. p_Level->BublSystemE.bOn = 1;
  4337. par_vloz_hnizdo_timer(pSystem->hHnizdo[0], 1, 0);
  4338. ap_Play_Sound(0,0,1, pSystem->pivot[1], gl_Choose_Wave_Index(102), NULL, &ad);
  4339. }
  4340. }
  4341. memcpy((void *) pSystem->pivot[0], (void *) pSystem->pivot[1],
  4342. 3 * sizeof(float));
  4343. pSystem->pivot[0][0] +=
  4344. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX));
  4345. pSystem->pivot[0][1] +=
  4346. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX));
  4347. pSystem->pivot[0][2] +=
  4348. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX));
  4349. pSystem->dir[0][1] = (randf() / (float) (RAND_MAX)) * 10.0f;
  4350. if (pSystem->dir[0][1] < 4.0f)
  4351. pSystem->dir[0][1] = 4.0f + (randf() / (float) (RAND_MAX)) * 5.0f;
  4352. f = (randf() / (float) (RAND_MAX)) / 2.0f;
  4353. par_vloz_hnizdo_scale(pSystem->hHnizdo[0], f, f, 0, 0);
  4354. }
  4355. void am_Do_BublSystemC(LEVELINFO * p_Level)
  4356. {
  4357. float f;
  4358. SYSTEMKOUROVYCHCASTIC *pSystem = &p_Level->BublSystemC.System;
  4359. if (p_Level->BublSystemC.System.System == -1)
  4360. return;
  4361. if (!p_Level->bGameResume)
  4362. pSystem->dwTime += ber.TimeLastFrame;
  4363. if (pSystem->dwTime > pSystem->dwStop) {
  4364. pSystem->dwTime = 0;
  4365. p_Level->BublSystemC.bOn = 0;
  4366. par_vloz_hnizdo_pust_castici(pSystem->hHnizdo[0]);
  4367. pSystem->dwStop =
  4368. 3000 + (int) ceil((randf() / (float) (RAND_MAX)) * 1000);
  4369. pSystem->dir[0][1] = (randf() / (float) (RAND_MAX)) * 10.0f;
  4370. if (pSystem->dir[0][1] < 4.0f)
  4371. pSystem->dir[0][1] = 4.0f + (randf() / (float) (RAND_MAX)) * 5.0f;
  4372. f = (randf() / (float) (RAND_MAX)) * 1.5f;
  4373. par_vloz_hnizdo_scale(pSystem->hHnizdo[0], f, f, 0, 0);
  4374. }
  4375. }
  4376. void am_Start_Joint_Animations(void)
  4377. {
  4378. ExMeshHandle mh, next;
  4379. ChapadloHandle *p_handle = NULL;
  4380. char *p_jmeno;
  4381. int chapadel;
  4382. static int flag;
  4383. int i, j, objektu;
  4384. /* -----------------------------------------------------------
  4385. Tuto cast musis delat nekde na zacatku - trva to dlouho
  4386. (nacteni animaci objektu)
  4387. */
  4388. /* Smycka - hleda a vraci postupne vsechny meshe ve scene ktere
  4389. maji joint-animace
  4390. */
  4391. next = 0;
  4392. while ((mh = kom_najdi_mesh_joint(&next)) != K_CHYBA) {
  4393. /* U nalezeneho meshe nacte pocet objektu ktere maji joint-animace
  4394. */
  4395. objektu = chani_mesh_cti_objekty(mh);
  4396. /* Projede objekty meshe (pocet objektu s animacema = objektu)
  4397. a spusti jejich prvni animaci
  4398. */
  4399. for (i = 0; i < objektu; i++) {
  4400. /* Nacni animace i-teho objektu v poradi
  4401. */
  4402. chani_mesh_cti_chapadelniky(mh, i, &p_handle, &chapadel);
  4403. /* chapadel = pocet animaci objektu
  4404. p_handle = pole handlu na tyto animace
  4405. */
  4406. /* Vrati jmena animaci objektu
  4407. */
  4408. for (j = 0; j < chapadel; j++) {
  4409. p_jmeno = chani_cti_jmeno(p_handle[j]);
  4410. }
  4411. /* -----------------------------------------------------------
  4412. Tuto cast muzes delat behem hry - je to rychle
  4413. */
  4414. /* Vyberu si 1. animaci v objektu a tu zaradim do seznamu animaci
  4415. (!!! pozor !!! pri zarazovani animace nekontroluju jestli ta animace
  4416. tam uz je nebo ne, tak to musis volat jen 1x! nejlepe pred spustenim
  4417. animace)
  4418. */
  4419. j = 0;
  4420. chani_zarad(p_handle[j]);
  4421. /* Zarazenou animaci spustim
  4422. */
  4423. chani_go(p_handle[j], &flag, GK_LOOP, 0, 0);
  4424. /* Uvolnim pole handlu (je to pole integeru, alokuje se
  4425. pri volani chani_mesh_cti_chapadelniky pomoci malloc
  4426. a ty to musis uvolnit kdyz to pole nepotrebujes
  4427. To pole si klidne muzes ulozit do nejake sve struktury,
  4428. ja ho k nicemu nepozuivam a je urceny jen pro tebe
  4429. */
  4430. free(p_handle);
  4431. }
  4432. }
  4433. /* Postup pri ruseni bezici animace:
  4434. 1) Zastavim animaci
  4435. chani_stop(p_handle[j]);
  4436. 2) Vymazu ji z fronty animaci
  4437. chani_zrus(p_handle[j]);
  4438. */
  4439. }
  4440. int find_free_street_light(LEVELINFO * p_Level)
  4441. {
  4442. int i;
  4443. for (i = 0; i < 8; i++)
  4444. if (!p_Level->StreetL[i].bUsed)
  4445. return i;
  4446. return -1;
  4447. }
  4448. void am_Create_Street_Light(LEVELINFO * p_Level, int iStart, int iPause,
  4449. float *pos)
  4450. {
  4451. STREET_LIGHT_EFFECT *psle;
  4452. int idx = find_free_street_light(p_Level);
  4453. if (idx < 0)
  4454. return;
  4455. psle = &p_Level->StreetL[idx];
  4456. psle->bUsed = 1;
  4457. psle->eCounter = 0;
  4458. psle->ePause = iPause;
  4459. psle->epCounter = iPause;
  4460. psle->eStart = iStart;
  4461. psle->hFlare = -1;
  4462. psle->dwEfTime = 0;
  4463. psle->hSvetlo = -1;
  4464. psle->pos[0] = pos[0];
  4465. psle->pos[1] = pos[1];
  4466. psle->pos[2] = pos[2];
  4467. psle->Speed = 10;
  4468. psle->hFlare = -1;
  4469. }
  4470. void am_Do_Street_Lights(LEVELINFO * p_Level)
  4471. {
  4472. STREET_LIGHT_EFFECT *psle;
  4473. int i, hSvetlo;
  4474. DWORD e = ber.TimeLastFrame;
  4475. float k = ber.TimeLastFrame / 1000.0f;
  4476. LENS_FLARE *pFlare;
  4477. DWORD t = timeGetTime();
  4478. DWORD ep;
  4479. for (i = 0; i < 8; i++)
  4480. if (p_Level->StreetL[i].bUsed) {
  4481. psle = &p_Level->StreetL[i];
  4482. if (psle->eCounter < psle->eStart)
  4483. psle->eCounter += e;
  4484. else if (psle->epCounter < psle->ePause) {
  4485. psle->epCounter += e;
  4486. if (psle->hFlare != -1) {
  4487. ep = t - psle->dwEfTime;
  4488. if (ep < 250) {
  4489. pFlare = kom_flare_get_pointer(psle->hFlare);
  4490. pFlare->dx += psle->Speed * k;
  4491. pFlare->dy += psle->Speed * k;
  4492. if (pFlare->dx > 2.5f) {
  4493. pFlare->dx = pFlare->dy = 2.5f;
  4494. }
  4495. }
  4496. else if (ep > 1000 && ep < 1250) {
  4497. pFlare = kom_flare_get_pointer(psle->hFlare);
  4498. pFlare->dx -= psle->Speed * k;
  4499. pFlare->dy -= psle->Speed * k;
  4500. if (pFlare->dx < 0) {
  4501. pFlare->dy = 0;
  4502. pFlare->dx = 0;
  4503. }
  4504. }
  4505. else if (ep >= 1250) {
  4506. kom_flare_zrus(psle->hFlare);
  4507. psle->hFlare = -1;
  4508. }
  4509. }
  4510. }
  4511. else {
  4512. /*if(!i)
  4513. kprintf(1, "Svetlo [%d] na %f, %f, %f", i, psle->pos[0], psle->pos[1], psle->pos[2]); */
  4514. psle->epCounter = 0;
  4515. hSvetlo = sdl_svetlo_vyrob(SDL_UTLUM_LINEAR);
  4516. if (hSvetlo != -1) {
  4517. sdl_svetlo_set_pos(hSvetlo, (BOD *) psle->pos);
  4518. sdl_svetlo_set_diff(hSvetlo, 0.996f, 0.617f, 0, 0, 0, 0);
  4519. sdl_anim_vyrob(hSvetlo, 30, 0, 0, 4);
  4520. sdl_anim_vloz_klic_vzdal(hSvetlo, 0, 0, 0, 0, 0);
  4521. sdl_anim_vloz_klic_vzdal(hSvetlo, 1, 70, 10, 70, 5);
  4522. sdl_anim_vloz_klic_vzdal(hSvetlo, 2, 70, 10, 70, 25);
  4523. sdl_anim_vloz_klic_vzdal(hSvetlo, 3, 0, 0, 0, 29);
  4524. sdl_anim_start(hSvetlo, &p_Level->TrashFlag, GK_REMOVE, 0, 0);
  4525. psle->hSvetlo = hSvetlo;
  4526. }
  4527. psle->dwEfTime = timeGetTime();
  4528. if (psle->hFlare != K_CHYBA)
  4529. kom_flare_zrus(psle->hFlare);
  4530. psle->hFlare = kom_flare_vyrob(FLR_NO_ZTEST);
  4531. if (psle->hFlare != -1) {
  4532. int m = kom_najdi_material("flare4");
  4533. if (m != -1) {
  4534. kom_flare_set_param(psle->hFlare, 0.996f, 0.617f, 0, 0.75f,
  4535. 0.001f, 0.001f, m, GL_ONE);
  4536. kom_flare_set_pivot(psle->hFlare, (BOD *) & psle->pos);
  4537. }
  4538. }
  4539. }
  4540. }
  4541. }
  4542. void am_Do_Street_Lights_Release(LEVELINFO * p_Level)
  4543. {
  4544. int i;
  4545. STREET_LIGHT_EFFECT *psle;
  4546. for (i = 0; i < 8; i++)
  4547. if (p_Level->StreetL[i].bUsed) {
  4548. kprintf(1, "am_Do_Street_Lights_Release[%d] ...", i);
  4549. psle = &p_Level->StreetL[i];
  4550. if (psle->hFlare != -1) {
  4551. kprintf(1, "kom_flare_zrus ...");
  4552. kom_flare_zrus(psle->hFlare);
  4553. }
  4554. if (psle->hSvetlo != -1) {
  4555. kprintf(1, "sdl_svetlo_zrus ...");
  4556. sdl_svetlo_zrus(psle->hSvetlo);
  4557. }
  4558. }
  4559. }
  4560. void am_Do_RainB(RAINSYSTEM * pRain)
  4561. {
  4562. int i;
  4563. for (i = 0; i < pRain->SizeofWHnizda; i++) {
  4564. memcpy((void *) &pRain->Wpivot[i], (void *) &pRain->Wpos[i], sizeof(BOD));
  4565. pRain->Wpivot[i].x +=
  4566. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) *
  4567. pRain->fDist;
  4568. pRain->Wpivot[i].z +=
  4569. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) *
  4570. pRain->fDist;
  4571. //pRain->Wpivot[i].y -= 0.3f;
  4572. }
  4573. }
  4574. int am_Create_Water_CirclesB(LEVELINFO * p_Level, RAINSYSTEM * pRain,
  4575. float fRadius, unsigned int uiDensity, unsigned int uiIntensity,
  4576. float fmaxDivergence, float *rPos)
  4577. {
  4578. PARMETAC_HNIZDO *pWHnizdo;
  4579. float pos[3] = { 0, 0, 0 };
  4580. PAR_KOUR_STOPA *pCastice;
  4581. int cWaters, i, material;
  4582. int intensity, delay;
  4583. pRain->hWHnizdo = NULL;
  4584. pRain->Wpivot = NULL;
  4585. pRain->Wpos = NULL;
  4586. cWaters = 20;
  4587. pRain->SizeofWHnizda = cWaters;
  4588. // pamet na hnizda
  4589. pRain->hWHnizdo = (int *) malloc(cWaters * sizeof(int));
  4590. if (!pRain->hWHnizdo) {
  4591. pRain->bWaterCircles = 0;
  4592. return 0;
  4593. }
  4594. // pamet na pivoty
  4595. pRain->Wpivot = (BOD *) malloc(cWaters * sizeof(BOD));
  4596. if (!pRain->Wpivot) {
  4597. free((void *) pRain->hWHnizdo);
  4598. pRain->bWaterCircles = 0;
  4599. return 0;
  4600. }
  4601. // pamet na pozice vody
  4602. pRain->Wpos = (BOD *) malloc(cWaters * sizeof(BOD));
  4603. if (!pRain->Wpos) {
  4604. free((void *) pRain->hWHnizdo);
  4605. free((void *) pRain->Wpivot);
  4606. pRain->bWaterCircles = 0;
  4607. return 0;
  4608. }
  4609. // vypocet potrebne velikosti pameti na castice
  4610. pRain->SizeofWCastice = cWaters * 10;
  4611. // pamet na castice
  4612. pRain->pWCastice =
  4613. (PAR_KOUR_STOPA *) malloc(pRain->SizeofWCastice * sizeof(PAR_KOUR_STOPA));
  4614. if (!pRain->pWCastice) {
  4615. free((void *) pRain->hWHnizdo);
  4616. free((void *) pRain->Wpivot);
  4617. free((void *) pRain->Wpos);
  4618. pRain->bWaterCircles = 0;
  4619. return 0;
  4620. }
  4621. material = kom_najdi_material("ckolo1");
  4622. if (material == -1)
  4623. kprintf(1, "Nelze najit material ckolo1");
  4624. pCastice = &pRain->pWCastice[0];
  4625. pCastice->rychlost_x = 0.01f;
  4626. pCastice->rychlost_y = 0.01f;
  4627. pCastice->utlum_x = pCastice->utlum_y = 20.0f;
  4628. pCastice->r = pCastice->g = pCastice->b = 1.0f;
  4629. pCastice->a = 0.8f;
  4630. pCastice->da = pCastice->dr = pCastice->dg = pCastice->db = -3.0f;
  4631. pCastice->ka = 0.0f;
  4632. pRain->Wnx.x = 1;
  4633. pRain->Wnx.y = 0;
  4634. pRain->Wnx.z = 0;
  4635. pRain->Wny.x = 0;
  4636. pRain->Wny.y = 0;
  4637. pRain->Wny.z = 1;
  4638. pRain->pWSystem = par_vyrob();
  4639. if (pRain->pWSystem == -1) {
  4640. free((void *) pRain->hWHnizdo);
  4641. free((void *) pRain->Wpivot);
  4642. free((void *) pRain->Wpos);
  4643. free((void *) pRain->pWCastice);
  4644. pRain->bWaterCircles = 0;
  4645. return 0;
  4646. }
  4647. par_set_param(pRain->pWSystem, material,
  4648. TPAR_NO_FOG | TPAR_3D | TPAR_SCALE_ADD | TPAR_VETSI | TPAR_AUTOREMOVE,
  4649. (BOD *) pos, NULL);
  4650. pCastice = pRain->pWCastice;
  4651. par_vloz_kour_stopu(pRain->pWSystem, pCastice, pRain->SizeofWCastice);
  4652. for (i = 0; i < pRain->SizeofWHnizda; i++) {
  4653. pRain->hWHnizdo[i] = par_vloz_hnizdo(pRain->pWSystem);
  4654. if (pRain->hWHnizdo[i] != -1) {
  4655. //pItem = am_Find_Next_Water(&LastItem, p_Level);
  4656. //if(pItem)
  4657. {
  4658. /*kom_mesh_get_float(pItem->Index_Of_Game_Mesh, &pRain->Wpos[i].x,
  4659. &pRain->Wpos[i].y, &pRain->Wpos[i].z, &rot); */
  4660. pRain->Wpos[i].x = rPos[0];
  4661. pRain->Wpos[i].y = rPos[1];
  4662. pRain->Wpos[i].z = rPos[2];
  4663. memcpy((void *) &pRain->Wpivot[i], (void *) &pRain->Wpos[i],
  4664. sizeof(BOD));
  4665. pRain->Wpivot[i].x +=
  4666. (rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX);
  4667. pRain->Wpivot[i].z +=
  4668. (rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX);
  4669. pRain->Wpivot[i].y -= 0.3f;
  4670. intensity =
  4671. (int) ceil((uiIntensity / 2.0f) +
  4672. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) *
  4673. ((uiIntensity * fmaxDivergence) / 2.0f));
  4674. delay = rand() % uiIntensity;
  4675. par_vloz_hnizdo_timer(pRain->hWHnizdo[i], intensity, delay);
  4676. par_vloz_hnizdo_komplet(pRain->hWHnizdo[i], intensity,
  4677. &pRain->Wpivot[i], pCastice);
  4678. pWHnizdo = par_cti_hnizdo(pRain->hWHnizdo[i]);
  4679. if (pWHnizdo) {
  4680. pWHnizdo->p_nx = &pRain->Wnx;
  4681. pWHnizdo->p_ny = &pRain->Wny;
  4682. }
  4683. }
  4684. }
  4685. }
  4686. par_go(pRain->pWSystem, &pRain->flag, 0, 0);
  4687. pRain->fDist = fRadius;
  4688. pRain->bWaterCircles = 1;
  4689. return 1;
  4690. }
  4691. void am_Flip(LEVELINFO * p_Level, ANIMATION_MODULE * p_am, char bAll,
  4692. RECT_LINE * rline, int rsize, int bTutor, int bTText, int ty)
  4693. {
  4694. RECT r;
  4695. char c;
  4696. int i, x = 0;
  4697. float s[2];
  4698. float pos[4];
  4699. s[0] = (float) hwconf.xres / 1024.0f;
  4700. s[1] = (float) hwconf.yres / 768.0f;
  4701. am_Animate_Items(p_am, p_Level);
  4702. am_Animate_Beetles(p_Level);
  4703. am_Do_Zhave_castice(p_Level);
  4704. am_Do_Flares(p_Level);
  4705. am_Do_Lifts(p_Level);
  4706. am_Do_Water(p_Level);
  4707. am_Do_Water_KolaB(p_Level);
  4708. am_Do_Bubliny_Berusek(p_Level);
  4709. am_Do_BublVybuchy(p_Level);
  4710. am_Do_Exit_Efects(p_Level);
  4711. am_Do_Exit_Sparks(p_Level);
  4712. am_Do_TelCSparks(p_Level);
  4713. am_Do_Rain(&p_Level->Rain);
  4714. am_Do_RainB(&p_Level->StreetRain);
  4715. am_Do_Snow(&p_Level->Snow);
  4716. am_Do_Nature_Effects(p_Level);
  4717. am_Do_BarelSparks(p_Level);
  4718. am_Do_BeatleSmokes(p_Level);
  4719. am_Obsluha_Koure_Brouku(p_Level);
  4720. am_Do_BublSystemE(p_Level);
  4721. am_Do_BublSystemC(p_Level);
  4722. am_Do_Street_Lights(p_Level);
  4723. am_Do_Swamp_Lights(p_Level);
  4724. am_Do_Star_Lights(p_Level);
  4725. am_Do_StarFall(p_Level);
  4726. am_Do_CandleSparks(p_Level);
  4727. am_Do_CandleSmoke(p_Level);
  4728. r.left = mx;
  4729. r.top = my;
  4730. r.right = _3dCur.idx;
  4731. r.bottom = _3dCur.idy;
  4732. if (rline) {
  4733. ddx2AddRectItem(rline, r, 0);
  4734. if (!rline->rlast)
  4735. ddx2SetRect(NULL, 0);
  4736. else {
  4737. ZeroMemory(rDrawRect, sizeof(RECT) * DRAW_RECT_NUM);
  4738. for (i = 0; i < rline->rlast; i++)
  4739. if (!_2d_Is_InRectLine(rDrawRect, &rline->rect[i].rect, x)) {
  4740. memcpy(&rDrawRect[x], &rline->rect[i].rect, sizeof(RECT));
  4741. x++;
  4742. }
  4743. ddx2SetRect(rDrawRect, x);
  4744. }
  4745. }
  4746. p_Level->bGameResume = 0;
  4747. spracuj_spravy(0);
  4748. kom_klavesy_hra();
  4749. kom_kresli_level();
  4750. _3d_Begin_Draw();
  4751. if (!bAll)
  4752. _3d_Draw_MenusB(p_Level, -1, &c, s, bTutor, bTText, ty);
  4753. _3d_End_Draw();
  4754. if (bAll)
  4755. ddx2RenderujVse(p_ber);
  4756. else
  4757. ddx2RenderujMenu(p_ber);
  4758. _3d_Begin_Draw();
  4759. _3d_Set_Smooth();
  4760. if (p_Level->bRestart)
  4761. p_Level->iMessageBoxReturn = _3d_Draw_MessageBox(5, s);
  4762. if (p_Level->bReturnToMenu)
  4763. p_Level->iMessageBoxReturn = _3d_Draw_MessageBox(7, s);
  4764. pos[0] = (float) mi.x + _3dCur.iaddx;
  4765. pos[1] = (float) mi.y + _3dCur.iaddy;
  4766. pos[2] = (float) mi.x + _3dCur.idx + _3dCur.iaddx;
  4767. pos[3] = (float) mi.y + _3dCur.idy + _3dCur.iaddy;
  4768. _3d_Draw_Box(p_Level->iCursor, pos);
  4769. _3d_End_Draw();
  4770. flip();
  4771. _2d_Clear_RectLine(rline);
  4772. mx = mi.x;
  4773. my = mi.y;
  4774. }
  4775. void am_FlipA(LEVELINFO * p_Level, ANIMATION_MODULE * p_am, char bAll,
  4776. RECT_LINE * rline, int rsize, int bTutor, int bTText, int ty)
  4777. {
  4778. char c;
  4779. float s[2];
  4780. float pos[4];
  4781. s[0] = (float) hwconf.xres / 1024.0f;
  4782. s[1] = (float) hwconf.yres / 768.0f;
  4783. am_Animate_Items(p_am, p_Level);
  4784. am_Animate_Beetles(p_Level);
  4785. am_Do_Zhave_castice(p_Level);
  4786. am_Do_Flares(p_Level);
  4787. am_Do_Lifts(p_Level);
  4788. am_Do_Water(p_Level);
  4789. am_Do_Water_KolaB(p_Level);
  4790. am_Do_Bubliny_Berusek(p_Level);
  4791. am_Do_BublVybuchy(p_Level);
  4792. am_Do_Exit_Efects(p_Level);
  4793. am_Do_Exit_Sparks(p_Level);
  4794. am_Do_TelCSparks(p_Level);
  4795. am_Do_Rain(&p_Level->Rain);
  4796. am_Do_RainB(&p_Level->StreetRain);
  4797. am_Do_Snow(&p_Level->Snow);
  4798. am_Do_Nature_Effects(p_Level);
  4799. am_Do_BarelSparks(p_Level);
  4800. am_Do_BeatleSmokes(p_Level);
  4801. am_Obsluha_Koure_Brouku(p_Level);
  4802. am_Do_BublSystemE(p_Level);
  4803. am_Do_BublSystemC(p_Level);
  4804. am_Do_Street_Lights(p_Level);
  4805. am_Do_Swamp_Lights(p_Level);
  4806. am_Do_Star_Lights(p_Level);
  4807. am_Do_StarFall(p_Level);
  4808. am_Do_CandleSparks(p_Level);
  4809. am_Do_CandleSmoke(p_Level);
  4810. p_Level->bGameResume = 0;
  4811. spracuj_spravy(0);
  4812. kom_klavesy_hra();
  4813. kom_kresli_level();
  4814. _3d_Begin_Draw();
  4815. _3d_Draw_MenusB(p_Level, -1, &c, s, bTutor, bTText, ty);
  4816. if (!p_Level->iCursor) {
  4817. pos[0] = (float) mi.x + _3dCur.iaddx;
  4818. pos[1] = (float) mi.y + _3dCur.iaddy;
  4819. pos[2] = (float) mi.x + _3dCur.idx + _3dCur.iaddx;
  4820. pos[3] = (float) mi.y + _3dCur.idy + _3dCur.iaddy;
  4821. }
  4822. else {
  4823. pos[0] = (float) mi.x;
  4824. pos[1] = (float) mi.y;
  4825. pos[2] = (float) mi.x + 32;
  4826. pos[3] = (float) mi.y + 32;
  4827. }
  4828. _3d_Draw_Box(p_Level->iCursor, pos);
  4829. _3d_End_Draw();
  4830. flip();
  4831. mx = mi.x;
  4832. my = mi.y;
  4833. }
  4834. void am_Start_Gen_Animation(char *cMesh, LEVELINFO * p_Level)
  4835. {
  4836. int iAnimation = K_CHYBA, iMesh = K_CHYBA;
  4837. BOD b((float) (rand() % 2), 0, (float) (rand() % 2));
  4838. BOD p;
  4839. int anim, i, f1, f2;
  4840. float r;
  4841. iMesh = kom_pridej_mesh_do_levelu(cMesh);
  4842. if (iMesh == K_CHYBA)
  4843. return;
  4844. if (!b.x && !b.z) {
  4845. b.x = 1.0f;
  4846. b.z = 1.0f;
  4847. }
  4848. anim = sim_vyrob_animaci(1, 4, 0);
  4849. kom_mesh_get_pivot(iMesh, &p);
  4850. sim_vloz_pivot(anim, p.x, p.y, p.z);
  4851. sim_vloz_klic_posun(anim, 0, 0, 0, 0, 0);
  4852. r = rand() / (float) (RAND_MAX * 40);
  4853. if (r < 0.05f)
  4854. r = 0.05f;
  4855. f1 = (int) ceil(r * 800);
  4856. r = rand() / (float) (RAND_MAX * 40);
  4857. if (r < 0.05f)
  4858. r = 0.05f;
  4859. f2 = (int) ceil((r * 800) + f1);
  4860. sim_vloz_klic_rotace(anim, 0, &b, 0, 0);
  4861. i = rand() % 2;
  4862. r = (rand() / (float) (RAND_MAX)) * 2;
  4863. if (i)
  4864. r *= -1;
  4865. sim_vloz_klic_rotace(anim, 1, &b, r, f1);
  4866. r = (rand() / (float) (RAND_MAX)) * 2;
  4867. if (!i)
  4868. r *= -1;
  4869. sim_vloz_klic_rotace(anim, 2, &b, r, f1 + f2);
  4870. sim_vloz_klic_rotace(anim, 3, &b, 0, 2 * f1 + f2);
  4871. sim_interpoluj_animaci(anim, 2 * f1 + f2 + 1, 1);
  4872. iAnimation = rani_aktivuj(anim, &p_Level->TrashFlag, GK_LOOP, 0, 0);
  4873. if (iAnimation == K_CHYBA)
  4874. return;
  4875. rani_privaz_mesh(iAnimation, iMesh, 0);
  4876. }
  4877. int find_free_swamp_light(LEVELINFO * p_Level)
  4878. {
  4879. int i;
  4880. for (i = 0; i < 10; i++)
  4881. if (!p_Level->SwampL[i].bUsed)
  4882. return i;
  4883. return -1;
  4884. }
  4885. void am_Create_Swamp_Light(LEVELINFO * p_Level, int iStart, int iPause,
  4886. float *pos)
  4887. {
  4888. STREET_LIGHT_EFFECT *psle;
  4889. int hSvetlo;
  4890. int idx = find_free_swamp_light(p_Level);
  4891. if (idx < 0)
  4892. return;
  4893. psle = &p_Level->SwampL[idx];
  4894. ZeroMemory(psle, sizeof(STREET_LIGHT_EFFECT));
  4895. psle->bUsed = 1;
  4896. psle->eCounter = 0;
  4897. psle->ePause = iPause;
  4898. psle->epCounter = iPause;
  4899. psle->eStart = iStart;
  4900. psle->hFlare = -1;
  4901. psle->dwEfTime = 0;
  4902. psle->hSvetlo = -1;
  4903. psle->pos[0] = pos[0];
  4904. psle->pos[1] = pos[1];
  4905. psle->pos[2] = pos[2];
  4906. psle->Speed = (randf() / (float) RAND_MAX) * 0.3f;
  4907. psle->fdx = (randf() / (float) RAND_MAX) * 0.3f;
  4908. psle->dwRiseTime = (int) ceil(rand() / (float) RAND_MAX) * 150;
  4909. if (psle->dwRiseTime < 50)
  4910. psle->dwRiseTime = 50;
  4911. psle->dwLightTime = (int) ceil(rand() / (float) RAND_MAX) * 250;
  4912. if (psle->dwLightTime < psle->dwRiseTime)
  4913. psle->dwLightTime = psle->dwRiseTime + 50;
  4914. hSvetlo = sdl_svetlo_vyrob(SDL_UTLUM_LINEAR);
  4915. if (hSvetlo != -1) {
  4916. sdl_svetlo_set_pos(hSvetlo, (BOD *) psle->pos);
  4917. sdl_svetlo_set_diff(hSvetlo, 0.996f, 0.617f, 0, 1, psle->Speed * 200,
  4918. psle->Speed * 200);
  4919. psle->hSvetlo = hSvetlo;
  4920. }
  4921. psle->hFlare = kom_flare_vyrob(0);
  4922. if (psle->hFlare != -1) {
  4923. int m = kom_najdi_material("flare4");
  4924. if (m != -1) {
  4925. kom_flare_set_param(psle->hFlare, 0.996f, 0.617f, 0, 0.5f, psle->fdx,
  4926. psle->fdx, m, GL_ONE);
  4927. kom_flare_set_pivot(psle->hFlare, (BOD *) & psle->pos);
  4928. }
  4929. }
  4930. }
  4931. void am_Do_Swamp_Lights(LEVELINFO * p_Level)
  4932. {
  4933. STREET_LIGHT_EFFECT *psle;
  4934. int i;
  4935. DWORD e = ber.TimeLastFrame;
  4936. float k = ber.TimeLastFrame / 1000.0f;
  4937. LENS_FLARE *pFlare;
  4938. DWORD t = timeGetTime();
  4939. DWORD ep;
  4940. if (p_Level->bGameResume) {
  4941. e = 0;
  4942. k = 0;
  4943. }
  4944. for (i = 0; i < 10; i++)
  4945. if (p_Level->SwampL[i].bUsed) {
  4946. psle = &p_Level->SwampL[i];
  4947. if (psle->eCounter < psle->eStart)
  4948. psle->eCounter += e;
  4949. else if (psle->epCounter < psle->ePause) {
  4950. psle->epCounter += e;
  4951. if (psle->hFlare != -1) {
  4952. ep = t - psle->dwEfTime;
  4953. if (ep < psle->dwRiseTime) {
  4954. pFlare = kom_flare_get_pointer(psle->hFlare);
  4955. pFlare->dx += psle->Speed * k;
  4956. pFlare->dy += psle->Speed * k;
  4957. if (pFlare->dx > 0.5f) {
  4958. pFlare->dx = psle->fdx;
  4959. pFlare->dy = psle->fdx;
  4960. }
  4961. }
  4962. else if (ep >= psle->dwRiseTime && ep <= 2 * psle->dwRiseTime) {
  4963. pFlare = kom_flare_get_pointer(psle->hFlare);
  4964. pFlare->dx -= psle->Speed * k;
  4965. pFlare->dy -= psle->Speed * k;
  4966. if (pFlare->dx < psle->fdx) {
  4967. pFlare->dy = psle->fdx;
  4968. pFlare->dx = psle->fdx;
  4969. }
  4970. }
  4971. }
  4972. }
  4973. else {
  4974. psle->epCounter = 0;
  4975. psle->dwEfTime = timeGetTime();
  4976. psle->dwRiseTime = (int) ceil(rand() / (float) RAND_MAX) * 150;
  4977. if (psle->dwRiseTime < 50)
  4978. psle->dwRiseTime = 50;
  4979. psle->dwLightTime = (int) ceil(rand() / (float) RAND_MAX) * 250;
  4980. if (psle->dwLightTime < psle->dwRiseTime)
  4981. psle->dwLightTime = psle->dwRiseTime + 50;
  4982. psle->ePause = (2 * psle->dwRiseTime); // + psle->dwLightTime;
  4983. }
  4984. }
  4985. }
  4986. void am_Do_Swamp_Lights_Release(LEVELINFO * p_Level)
  4987. {
  4988. int i;
  4989. STREET_LIGHT_EFFECT *psle;
  4990. for (i = 0; i < 10; i++)
  4991. if (p_Level->SwampL[i].bUsed) {
  4992. kprintf(1, "am_Do_Swamp_Lights_Release[%d] ...", i);
  4993. psle = &p_Level->SwampL[i];
  4994. if (psle->hFlare != -1) {
  4995. kprintf(1, "kom_flare_zrus[%d] ...", i);
  4996. kom_flare_zrus(psle->hFlare);
  4997. }
  4998. if (psle->hSvetlo != -1) {
  4999. kprintf(1, "sdl_svetlo_zrus[%d] ...", i);
  5000. sdl_svetlo_zrus(psle->hSvetlo);
  5001. }
  5002. }
  5003. }
  5004. void am_Do_Star_Lights_Release(LEVELINFO * p_Level)
  5005. {
  5006. int i;
  5007. STREET_LIGHT_EFFECT *psle;
  5008. for (i = 0; i < 200; i++)
  5009. if (p_Level->StarL[i].bUsed) {
  5010. kprintf(1, "am_Do_Star_Lights_Release[%d] ...", i);
  5011. psle = &p_Level->StarL[i];
  5012. if (psle->hFlare != -1) {
  5013. kprintf(1, "kom_flare_zrus[%d] ...", i);
  5014. kom_flare_zrus(psle->hFlare);
  5015. }
  5016. if (psle->hSvetlo != -1) {
  5017. kprintf(1, "sdl_svetlo_zrus[%d] ...", i);
  5018. sdl_svetlo_zrus(psle->hSvetlo);
  5019. }
  5020. }
  5021. }
  5022. void am_Gen_Swamp_Lights(LEVELINFO * p_Level, RECT * r)
  5023. {
  5024. BOD p1, p2;
  5025. float p[3];
  5026. int i, t;
  5027. int done = 0;
  5028. kom_get_level_size(&p1, &p2);
  5029. p1.x -= 25.0f;
  5030. p1.z -= 25.0f;
  5031. p2.x += 25.0f;
  5032. p2.z += 25.0f;
  5033. //generuj staticke msvetilka
  5034. for (i = 0; i < 10; i++) {
  5035. t = (int) ftoi((randf() / (float) RAND_MAX) * 1000.0f);
  5036. done = 0;
  5037. while (!done) {
  5038. p[0] =
  5039. r->left +
  5040. (float) (rand() / (float) RAND_MAX) *
  5041. am_vzdal_bodu_single((float) r->left, (float) r->right);
  5042. p[1] = p_ber->y_start + 1 + ((rand() / (float) RAND_MAX) * 40);
  5043. p[2] =
  5044. r->top +
  5045. (rand() / (float) RAND_MAX) * am_vzdal_bodu_single((float) r->top,
  5046. (float) r->bottom);
  5047. if ((p[0] < p1.x || p[0] > p2.x) && (p[2] < p1.z || p[2] > p2.z))
  5048. done = 1;
  5049. }
  5050. am_Create_Swamp_Light(p_Level, t, t, p);
  5051. }
  5052. }
  5053. int find_used_swamp_light(LEVELINFO * p_Level)
  5054. {
  5055. int i;
  5056. for (i = 0; i < 10; i++)
  5057. if (p_Level->SwampL[i].bUsed && !p_Level->SwampL[i].bConnected)
  5058. return i;
  5059. return -1;
  5060. }
  5061. int am_Create_Fairy(LEVELINFO * p_Level, FAIRY_EFFECT * pF, float pos[3],
  5062. float fLowPlain, char *cMaterial, float fRadius, float fStartY,
  5063. RECT * pScene)
  5064. {
  5065. PAR_KOUR_STOPA *pCastice;
  5066. int material;
  5067. int iSwampL = find_used_swamp_light(p_Level);
  5068. if (iSwampL == -1)
  5069. return 0;
  5070. ZeroMemory(pF, sizeof(FAIRY_EFFECT));
  5071. pF->hHnizdo = -1;
  5072. pF->pSystem = -1;
  5073. pF->iSound = ap_Play_Sound(2, 0, 1, pos, 139, NULL, &ad);
  5074. memcpy(&pF->rScene, pScene, sizeof(RECT));
  5075. pF->csize = 300;
  5076. pF->pCastice =
  5077. (PAR_KOUR_STOPA *) malloc(pF->csize * sizeof(PAR_KOUR_STOPA));
  5078. pF->fLowPlain = fLowPlain;
  5079. if (!pF->pCastice)
  5080. return 0;
  5081. pF->faire_dir[0] = (rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX);
  5082. pF->faire_dir[2] = (rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX);
  5083. norm_vect(&pF->faire_dir[0], &pF->faire_dir[1], &pF->faire_dir[2]);
  5084. pF->speed = 20 + ((randf() / (float) (RAND_MAX)) * 60);
  5085. memcpy((void *) &pF->pos, (void *) pos, 3 * sizeof(float));
  5086. if (p_Level->SwampL[iSwampL].hFlare != K_CHYBA)
  5087. kom_flare_set_pivot(p_Level->SwampL[iSwampL].hFlare, &pF->pivot);
  5088. if (p_Level->SwampL[iSwampL].hSvetlo != K_CHYBA)
  5089. sdl_svetlo_set_pos(p_Level->SwampL[iSwampL].hSvetlo, &pF->pivot);
  5090. p_Level->SwampL[iSwampL].bConnected = 1;
  5091. pF->iSwampLight = iSwampL;
  5092. material = kom_najdi_material(cMaterial);
  5093. if (material == -1) {
  5094. kprintf(1, "Nelze najit material %s", cMaterial);
  5095. free((void *) pF->pCastice);
  5096. return 0;
  5097. }
  5098. //gen sinu
  5099. pF->falngle[0] = (randf() / (float) RAND_MAX) * 4;
  5100. pF->falngle[1] = (randf() / (float) RAND_MAX) * 4;
  5101. pF->falngle[2] = (randf() / (float) RAND_MAX) * 4;
  5102. pF->fsinspeed[0] = (randf() / (float) RAND_MAX) * 2;
  5103. pF->fsinspeed[1] = (randf() / (float) RAND_MAX) * 2;
  5104. pF->fsinspeed[2] = (randf() / (float) RAND_MAX) * 2;
  5105. pF->fmult[0] = (randf() / (float) RAND_MAX) * 10;
  5106. pF->fmult[1] = (randf() / (float) RAND_MAX) * 10;
  5107. pF->fmult[2] = (randf() / (float) RAND_MAX) * 10;
  5108. pCastice = &pF->pCastice[0];
  5109. pCastice->rychlost_x = 0.06f;
  5110. pCastice->rychlost_y = 0.06f;
  5111. pCastice->utlum_x = pCastice->utlum_y = 0.0f;
  5112. pCastice->r = 0.98f;
  5113. pCastice->g = 0.91f;
  5114. pCastice->b = 0.33f;
  5115. pCastice->a = 0.75f;
  5116. pCastice->da = pCastice->dr = pCastice->dg = pCastice->db = 0.0f;
  5117. pF->pSystem = par_vyrob();
  5118. if (pF->pSystem == -1) {
  5119. free((void *) pF->pCastice);
  5120. return 0;
  5121. }
  5122. memcpy((void *) &pF->pivot, (void *) pos, 3 * sizeof(float));
  5123. par_set_param(pF->pSystem, material,
  5124. TPAR_NO_FOG | TPAR_YPLANE_LOW | TPAR_DIR | TPAR_SCALE | TPAR_VETSI |
  5125. TPAR_AUTOREMOVE, &pF->pivot, &pF->pivot);
  5126. pCastice = pF->pCastice;
  5127. par_vloz_kour_stopu(pF->pSystem, pCastice, pF->csize);
  5128. pF->hHnizdo = par_vloz_hnizdo(pF->pSystem);
  5129. if (pF->hHnizdo != -1) {
  5130. par_vloz_hnizdo_komplet(pF->hHnizdo, 5, &pF->pivot, pCastice);
  5131. par_vloz_hnizdo_timer(pF->hHnizdo, 5, 0);
  5132. memcpy((void *) &pF->pivot, (void *) pos, 3 * sizeof(float));
  5133. pF->pivot.x +=
  5134. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * fRadius;
  5135. pF->pivot.z +=
  5136. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * fRadius;
  5137. pF->pivot.y = fStartY;
  5138. memcpy((void *) &pF->dir, (void *) pos, 3 * sizeof(float));
  5139. pF->dir.x = 0;
  5140. pF->dir.y = -1;
  5141. pF->dir.z = 0;
  5142. par_vloz_hnizdo_dir(pF->hHnizdo, &pF->dir);
  5143. par_vloz_hnizdo_y_plane(pF->hHnizdo, pF->fLowPlain);
  5144. }
  5145. par_pripoj_funkci(pF->pSystem, anmend_ZrusCastice3, 0, 0,
  5146. (void *) pF->pCastice);
  5147. par_go(pF->pSystem, &pF->flag, 0, 0);
  5148. pF->dwTime = 0;
  5149. pF->dwRegTime = 250;
  5150. return 1;
  5151. }
  5152. int find_free_fairy_system(LEVELINFO * p_Level)
  5153. {
  5154. int i;
  5155. for (i = 0; i < 5; i++)
  5156. if (p_Level->FairyEffect[i].pSystem == -1)
  5157. return i;
  5158. return -1;
  5159. }
  5160. int am_Create_Fairies(LEVELINFO * p_Level, RECT * r)
  5161. {
  5162. //RECT r = {-200, -200, 200, 200};
  5163. int i, idx;
  5164. float pos[3], low_plane, radius, start;
  5165. for (i = 0; i < 5; i++) {
  5166. idx = find_free_fairy_system(p_Level);
  5167. if (idx == -1)
  5168. return 0;
  5169. radius = 10;
  5170. low_plane = p_ber->y_start;
  5171. start = p_ber->y_start + 5 + ((rand() / (float) RAND_MAX) * 25);
  5172. pos[0] =
  5173. r->left +
  5174. (float) (rand() / (float) RAND_MAX) *
  5175. am_vzdal_bodu_single((float) r->left, (float) r->right);
  5176. pos[1] = p_ber->y_start + 25 + ((rand() / (float) RAND_MAX) * 25);
  5177. pos[2] =
  5178. r->top +
  5179. (rand() / (float) RAND_MAX) * am_vzdal_bodu_single((float) r->top,
  5180. (float) r->bottom);
  5181. am_Create_Fairy(p_Level, &p_Level->FairyEffect[idx], pos, low_plane,
  5182. "flare12", radius, start, r);
  5183. }
  5184. return 1;
  5185. }
  5186. void am_move_Fiere(FAIRY_EFFECT * pF, LEVELINFO * p_Level)
  5187. {
  5188. float f = ber.TimeLastFrame / 1000.0f;
  5189. int c = 0;
  5190. memcpy((void *) &pF->pivot, (void *) pF->pos, 3 * sizeof(float));
  5191. pF->pivot.x += pF->faire_dir[0] * pF->speed * f;
  5192. pF->pivot.z += pF->faire_dir[2] * pF->speed * f;
  5193. if (pF->pivot.x < pF->rScene.left) {
  5194. pF->pivot.x = (float) pF->rScene.left;
  5195. c++;
  5196. }
  5197. if (pF->pivot.x > pF->rScene.right) {
  5198. pF->pivot.x = (float) pF->rScene.right;
  5199. c++;
  5200. }
  5201. if (pF->pivot.z < pF->rScene.top) {
  5202. pF->pivot.z = (float) pF->rScene.top;
  5203. c++;
  5204. }
  5205. if (pF->pivot.z > pF->rScene.bottom) {
  5206. pF->pivot.z = (float) pF->rScene.bottom;
  5207. c++;
  5208. }
  5209. if (c) {
  5210. pF->faire_dir[0] =
  5211. (rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX);
  5212. pF->faire_dir[2] =
  5213. (rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX);
  5214. norm_vect(&pF->faire_dir[0], &pF->faire_dir[1], &pF->faire_dir[2]);
  5215. pF->speed = 20 + ((randf() / (float) (RAND_MAX)) * 60);
  5216. pF->fsinspeed[0] = (randf() / (float) RAND_MAX) * 2;
  5217. pF->fsinspeed[1] = (randf() / (float) RAND_MAX) * 2;
  5218. pF->fsinspeed[2] = (randf() / (float) RAND_MAX) * 2;
  5219. pF->fmult[0] = (randf() / (float) RAND_MAX) * 10;
  5220. pF->fmult[1] = (randf() / (float) RAND_MAX) * 10;
  5221. pF->fmult[2] = (randf() / (float) RAND_MAX) * 10;
  5222. }
  5223. memcpy((void *) pF->pos, (void *) &pF->pivot, 3 * sizeof(float));
  5224. //modulace pozice;
  5225. pF->falngle[0] += pF->fsinspeed[0] * f;
  5226. pF->falngle[1] += pF->fsinspeed[1] * f;
  5227. pF->falngle[2] += pF->fsinspeed[2] * f;
  5228. pF->pivot.x += ((float) sin(pF->falngle[0]) * pF->fmult[0]);
  5229. pF->pivot.y += ((float) sin(pF->falngle[1]) * pF->fmult[1]);
  5230. pF->pivot.z += ((float) sin(pF->falngle[2]) * pF->fmult[2]);
  5231. //kprintf(1, "f = %f", (float)sin(pF->falngle[0]) * pF->fmult[0]);
  5232. if (p_Level->SwampL[pF->iSwampLight].hSvetlo != K_CHYBA)
  5233. sdl_svetlo_set_pos(p_Level->SwampL[pF->iSwampLight].hSvetlo, &pF->pivot);
  5234. if (pF->iSound != -1) {
  5235. float ftmp[3];
  5236. memcpy((void *) ftmp, (void *) &pF->pivot, 3 * sizeof(float));
  5237. //adas_Set_Source_Position(PARTICULAR_SOUND_SOURCE, 2, pF->iSound, ftmp);
  5238. }
  5239. }
  5240. void am_Do_Fairies(LEVELINFO * p_Level)
  5241. {
  5242. FAIRY_EFFECT *pF;
  5243. int i;
  5244. float f;
  5245. for (i = 0; i < 4; i++)
  5246. if (p_Level->FairyEffect[i].pSystem != -1) {
  5247. pF = &p_Level->FairyEffect[i];
  5248. //pF->dwTime += ber.TimeLastFrame;
  5249. pF->dir.y = ((-randf() / (float) (RAND_MAX)) * 60.0f);
  5250. if (pF->dir.y > -10)
  5251. pF->dir.y = -10 + ((-randf() / (float) (RAND_MAX)) * 20.0f);
  5252. f = (randf() / (float) (RAND_MAX)) * 1.0f;
  5253. par_vloz_hnizdo_scale(pF->hHnizdo, f, f, 0, 0);
  5254. am_move_Fiere(pF, p_Level);
  5255. }
  5256. }
  5257. int find_free_star_system(LEVELINFO * p_Level)
  5258. {
  5259. int i;
  5260. for (i = 0; i < 200; i++)
  5261. if (!p_Level->StarL[i].bUsed)
  5262. return i;
  5263. return -1;
  5264. }
  5265. void am_Gen_Star_Light(LEVELINFO * p_Level, int iStart, int iPause,
  5266. float *pos, int iNoLight)
  5267. {
  5268. STREET_LIGHT_EFFECT *psle;
  5269. int hSvetlo;
  5270. int idx = find_free_star_system(p_Level);
  5271. if (idx < 0)
  5272. return;
  5273. psle = &p_Level->StarL[idx];
  5274. ZeroMemory(psle, sizeof(STREET_LIGHT_EFFECT));
  5275. psle->bUsed = 1;
  5276. psle->eCounter = 0;
  5277. psle->ePause = iPause;
  5278. psle->epCounter = iPause;
  5279. psle->eStart = iStart;
  5280. psle->hFlare = -1;
  5281. psle->dwEfTime = 0;
  5282. psle->hSvetlo = -1;
  5283. psle->pos[0] = pos[0];
  5284. psle->pos[1] = pos[1];
  5285. psle->pos[2] = pos[2];
  5286. psle->Speed = (randf() / (float) RAND_MAX) * 0.3f;
  5287. if (!iNoLight)
  5288. psle->fdx = 0.1f + (randf() / (float) RAND_MAX) * 0.3f;
  5289. else
  5290. psle->fdx = 0.01f + (randf() / (float) RAND_MAX) * 0.1f;
  5291. psle->dwRiseTime = (int) ceil(rand() / (float) RAND_MAX) * 150;
  5292. if (psle->dwRiseTime < 50)
  5293. psle->dwRiseTime = 50;
  5294. psle->dwLightTime = (int) ceil(rand() / (float) RAND_MAX) * 250;
  5295. if (psle->dwLightTime < psle->dwRiseTime)
  5296. psle->dwLightTime = psle->dwRiseTime + 50;
  5297. if (!iNoLight) {
  5298. hSvetlo = sdl_svetlo_vyrob(SDL_UTLUM_LINEAR);
  5299. if (hSvetlo != -1) {
  5300. sdl_svetlo_set_pos(hSvetlo, (BOD *) psle->pos);
  5301. sdl_svetlo_set_diff(hSvetlo, 0.765f, 0.89f, 0.89f, 1,
  5302. psle->Speed * 1000, psle->Speed * 1000);
  5303. psle->hSvetlo = hSvetlo;
  5304. }
  5305. }
  5306. psle->hFlare = kom_flare_vyrob(0);
  5307. if (psle->hFlare != -1) {
  5308. int m = kom_najdi_material("flare4");
  5309. if (m != -1) {
  5310. kom_flare_set_param(psle->hFlare, 0.765f, 0.89f, 0.89f, 0.75f,
  5311. psle->fdx, psle->fdx, m, GL_ONE);
  5312. kom_flare_set_pivot(psle->hFlare, (BOD *) & psle->pos);
  5313. }
  5314. }
  5315. }
  5316. void am_Gen_Star_Lights(LEVELINFO * p_Level, float *pos)
  5317. {
  5318. BOD p1, p2;
  5319. int done = 0;
  5320. float p[3];
  5321. int i, t, s;
  5322. kom_get_level_size(&p1, &p2);
  5323. p1.x -= 50.0f;
  5324. p1.z -= 50.0f;
  5325. p2.x += 50.0f;
  5326. p2.z += 50.0f;
  5327. for (i = 0; i < 200; i++) {
  5328. s = (int) ftoi((randf() / (float) RAND_MAX) * 10000.0f);
  5329. t = (int) ftoi((randf() / (float) RAND_MAX) * 1000.0f);
  5330. done = 0;
  5331. while (!done) {
  5332. p[0] =
  5333. pos[0] +
  5334. (rand() / (float) RAND_MAX) * am_vzdal_bodu_single((float) pos[0],
  5335. (float) pos[3]);
  5336. p[1] =
  5337. -50 + pos[1] +
  5338. (rand() / (float) RAND_MAX) * am_vzdal_bodu_single((float) pos[1],
  5339. (float) pos[4]);
  5340. p[2] =
  5341. pos[2] +
  5342. (rand() / (float) RAND_MAX) * am_vzdal_bodu_single((float) pos[2],
  5343. (float) pos[5]);
  5344. if ((p[0] < p1.x || p[0] > p2.x) && (p[2] < p1.z || p[2] > p2.z))
  5345. done = 1;
  5346. }
  5347. am_Gen_Star_Light(p_Level, s, t, p, i);
  5348. }
  5349. }
  5350. void am_Do_Star_Lights(LEVELINFO * p_Level)
  5351. {
  5352. STREET_LIGHT_EFFECT *psle;
  5353. int i;
  5354. DWORD e = ber.TimeLastFrame;
  5355. float k = ber.TimeLastFrame / 1000.0f;
  5356. LENS_FLARE *pFlare;
  5357. DWORD t = timeGetTime();
  5358. DWORD ep;
  5359. for (i = 0; i < 200; i++)
  5360. if (p_Level->StarL[i].bUsed) {
  5361. psle = &p_Level->StarL[i];
  5362. if (psle->eCounter < psle->eStart)
  5363. psle->eCounter += e;
  5364. else if (psle->epCounter < psle->ePause) {
  5365. psle->epCounter += e;
  5366. if (psle->hFlare != -1) {
  5367. ep = t - psle->dwEfTime;
  5368. if (ep < psle->dwRiseTime) {
  5369. pFlare = kom_flare_get_pointer(psle->hFlare);
  5370. pFlare->dx += psle->Speed * k;
  5371. pFlare->dy += psle->Speed * k;
  5372. if (pFlare->dx > 0.2f) {
  5373. pFlare->dx = psle->fdx;
  5374. pFlare->dy = psle->fdx;
  5375. }
  5376. }
  5377. else if (ep >= psle->dwRiseTime && ep <= 2 * psle->dwRiseTime) {
  5378. pFlare = kom_flare_get_pointer(psle->hFlare);
  5379. pFlare->dx -= psle->Speed * k;
  5380. pFlare->dy -= psle->Speed * k;
  5381. if (pFlare->dx < psle->fdx) {
  5382. pFlare->dy = psle->fdx;
  5383. pFlare->dx = psle->fdx;
  5384. }
  5385. }
  5386. }
  5387. }
  5388. else {
  5389. psle->epCounter = 0;
  5390. psle->dwEfTime = timeGetTime();
  5391. psle->dwRiseTime = (int) ceil(rand() / (float) RAND_MAX) * 150;
  5392. if (psle->dwRiseTime < 50)
  5393. psle->dwRiseTime = 50;
  5394. psle->dwLightTime = (int) ceil(rand() / (float) RAND_MAX) * 250;
  5395. if (psle->dwLightTime < psle->dwRiseTime)
  5396. psle->dwLightTime = psle->dwRiseTime + 50;
  5397. psle->ePause = (2 * psle->dwRiseTime); // + psle->dwLightTime;
  5398. }
  5399. }
  5400. }
  5401. int am_Create_Falling_Star(LEVELINFO * p_Level, FAIRY_EFFECT * pF,
  5402. float pos[3], float fLowPlain, char *cMaterial, float fRadius,
  5403. float fStartY, float *pScene)
  5404. {
  5405. float pos1[3], pos2[3];
  5406. PAR_KOUR_STOPA *pCastice;
  5407. int material;
  5408. int iStarL = 0;
  5409. if (iStarL == -1)
  5410. return 0;
  5411. ZeroMemory(pF, sizeof(FAIRY_EFFECT));
  5412. pF->hHnizdo = -1;
  5413. pF->pSystem = -1;
  5414. pF->iSound = -1;
  5415. memcpy(&pF->fScene, pScene, 6 * sizeof(float));
  5416. pF->csize = 7000;
  5417. pF->pCastice =
  5418. (PAR_KOUR_STOPA *) malloc(pF->csize * sizeof(PAR_KOUR_STOPA));
  5419. pF->fLowPlain = fLowPlain;
  5420. if (!pF->pCastice)
  5421. return 0;
  5422. pos1[0] =
  5423. pScene[0] +
  5424. ((randf() / (float) (RAND_MAX)) * am_vzdal_bodu_single(pScene[3],
  5425. pScene[0]));
  5426. pos1[1] = pScene[4];
  5427. pos1[2] =
  5428. pScene[2] +
  5429. ((randf() / (float) (RAND_MAX)) * am_vzdal_bodu_single(pScene[2],
  5430. pScene[5]));
  5431. pos2[0] =
  5432. pScene[0] +
  5433. ((randf() / (float) (RAND_MAX)) * am_vzdal_bodu_single(pScene[3],
  5434. pScene[0]));
  5435. pos2[1] = pScene[1];
  5436. pos2[2] =
  5437. pScene[2] +
  5438. ((randf() / (float) (RAND_MAX)) * am_vzdal_bodu_single(pScene[2],
  5439. pScene[5]));
  5440. Make_Vector(pos1, pos2, pF->faire_dir);
  5441. norm_vect(&pF->faire_dir[0], &pF->faire_dir[1], &pF->faire_dir[2]);
  5442. pF->speed = 40 + ((randf() / (float) (RAND_MAX)) * 100);
  5443. memcpy((void *) &pF->pos, (void *) pos1, 3 * sizeof(float));
  5444. if (p_Level->StarL[iStarL].hFlare != K_CHYBA)
  5445. kom_flare_set_pivot(p_Level->StarL[iStarL].hFlare, &pF->pivot);
  5446. if (p_Level->StarL[iStarL].hSvetlo != K_CHYBA)
  5447. sdl_svetlo_set_pos(p_Level->StarL[iStarL].hSvetlo, &pF->pivot);
  5448. p_Level->StarL[iStarL].bConnected = 1;
  5449. pF->iSwampLight = iStarL;
  5450. material = kom_najdi_material(cMaterial);
  5451. if (material == -1) {
  5452. kprintf(1, "Nelze najit material %s", cMaterial);
  5453. free((void *) pF->pCastice);
  5454. return 0;
  5455. }
  5456. //gen sinu
  5457. pF->falngle[0] = (randf() / (float) RAND_MAX) * 4;
  5458. pF->falngle[1] = (randf() / (float) RAND_MAX) * 4;
  5459. pF->falngle[2] = (randf() / (float) RAND_MAX) * 4;
  5460. pF->fsinspeed[0] = (randf() / (float) RAND_MAX) * 2;
  5461. pF->fsinspeed[1] = (randf() / (float) RAND_MAX) * 2;
  5462. pF->fsinspeed[2] = (randf() / (float) RAND_MAX) * 2;
  5463. pF->fmult[0] = (randf() / (float) RAND_MAX) * 10;
  5464. pF->fmult[1] = (randf() / (float) RAND_MAX) * 10;
  5465. pF->fmult[2] = (randf() / (float) RAND_MAX) * 10;
  5466. pCastice = &pF->pCastice[0];
  5467. pCastice->rychlost_x = 0.06f;
  5468. pCastice->rychlost_y = 0.06f;
  5469. pCastice->utlum_x = pCastice->utlum_y = -0.1f;
  5470. pCastice->r = 0.765f;
  5471. pCastice->g = 0.89f;
  5472. pCastice->b = 0.89f;
  5473. pCastice->a = 0.75f;
  5474. pCastice->da = pCastice->dr = pCastice->dg = pCastice->db = 0.0f;
  5475. pF->pSystem = par_vyrob();
  5476. if (pF->pSystem == -1) {
  5477. free((void *) pF->pCastice);
  5478. return 0;
  5479. }
  5480. memcpy((void *) &pF->pivot, (void *) pos, 3 * sizeof(float));
  5481. par_set_param(pF->pSystem, material,
  5482. TPAR_NO_FOG | TPAR_SCALE | TPAR_VETSI | TPAR_AUTOREMOVE, &pF->pivot,
  5483. &pF->pivot);
  5484. pCastice = pF->pCastice;
  5485. par_vloz_kour_stopu(pF->pSystem, pCastice, pF->csize);
  5486. pF->hHnizdo = par_vloz_hnizdo(pF->pSystem);
  5487. if (pF->hHnizdo != -1) {
  5488. par_vloz_hnizdo_komplet(pF->hHnizdo, 5, &pF->pivot, pCastice);
  5489. par_vloz_hnizdo_timer(pF->hHnizdo, 5, 0);
  5490. memcpy((void *) &pF->pivot, (void *) pos1, 3 * sizeof(float));
  5491. /* pF->pivot.x += ((rand()&0x1 ? randf() : -randf())/(float)(RAND_MAX)) * fRadius;
  5492. pF->pivot.z += ((rand()&0x1 ? randf() : -randf())/(float)(RAND_MAX)) * fRadius;
  5493. pF->pivot.y = fStartY;*/
  5494. /* memcpy((void *)&pF->dir, (void *)pos, 3 * sizeof(float));
  5495. pF->dir.x = 0;
  5496. pF->dir.y = -1;
  5497. pF->dir.z = 0;
  5498. par_vloz_hnizdo_dir(pF->hHnizdo, &pF->dir);*/
  5499. //par_vloz_hnizdo_y_plane(pF->hHnizdo, pF->fLowPlain);
  5500. }
  5501. par_pripoj_funkci(pF->pSystem, anmend_ZrusCastice3, 0, 0,
  5502. (void *) pF->pCastice);
  5503. par_go(pF->pSystem, &pF->flag, 0, 0);
  5504. pF->dwTime = 0;
  5505. pF->dwRegTime = 250;
  5506. return 1;
  5507. }
  5508. void am_move_Star(FAIRY_EFFECT * pF, LEVELINFO * p_Level)
  5509. {
  5510. float pos1[3], pos2[3];
  5511. float f = ber.TimeLastFrame / 1000.0f;
  5512. int c = 0;
  5513. if (p_Level->bGameResume) {
  5514. f = 0;
  5515. }
  5516. memcpy((void *) &pF->pivot, (void *) pF->pos, 3 * sizeof(float));
  5517. pF->pivot.x += pF->faire_dir[0] * pF->speed * f;
  5518. pF->pivot.y += pF->faire_dir[1] * pF->speed * f;
  5519. pF->pivot.z += pF->faire_dir[2] * pF->speed * f;
  5520. if (pF->pivot.y < pF->fScene[1])
  5521. c++;
  5522. if (c) {
  5523. pos1[0] =
  5524. pF->fScene[0] + ((randf() / (float) (RAND_MAX)) * pF->fScene[3]);
  5525. pos1[1] = pF->fScene[4];
  5526. pos1[2] =
  5527. pF->fScene[2] + ((randf() / (float) (RAND_MAX)) * pF->fScene[5]);
  5528. pos2[0] =
  5529. pF->fScene[0] + ((randf() / (float) (RAND_MAX)) * pF->fScene[3]);
  5530. pos2[1] = pF->fScene[1];
  5531. pos2[2] =
  5532. pF->fScene[2] + ((randf() / (float) (RAND_MAX)) * pF->fScene[5]);
  5533. Make_Vector(pos1, pos2, pF->faire_dir);
  5534. norm_vect(&pF->faire_dir[0], &pF->faire_dir[1], &pF->faire_dir[2]);
  5535. pF->speed = 40 + ((randf() / (float) (RAND_MAX)) * 100);
  5536. memcpy((void *) &pF->pivot, (void *) pos1, 3 * sizeof(float));
  5537. }
  5538. memcpy((void *) pF->pos, (void *) &pF->pivot, 3 * sizeof(float));
  5539. if (p_Level->StarL[pF->iSwampLight].hSvetlo != K_CHYBA)
  5540. sdl_svetlo_set_pos(p_Level->StarL[pF->iSwampLight].hSvetlo, &pF->pivot);
  5541. }
  5542. void am_Do_StarFall(LEVELINFO * p_Level)
  5543. {
  5544. PAR_KOUR_STOPA *pCastice;
  5545. FAIRY_EFFECT *pF;
  5546. int i;
  5547. float f, f1;
  5548. for (i = 0; i < 2; i++)
  5549. if (p_Level->StarFall[i].pSystem != -1) {
  5550. pF = &p_Level->StarFall[i];
  5551. f = (randf() / (float) (RAND_MAX)) * 4.0f;
  5552. f1 = 0.025f + (randf() / (float) (RAND_MAX)) * 2.0f;
  5553. par_vloz_hnizdo_scale(pF->hHnizdo, f, f, -f1, -f1);
  5554. am_move_Star(pF, p_Level);
  5555. pCastice = par_cti_hnizdo_castice(pF->hHnizdo);
  5556. // test na velikost castic. Pokud je moc mala, tak pric s ni
  5557. if (pCastice) {
  5558. while (pCastice) {
  5559. if (pCastice->rychlost_x < 0.01f || pCastice->rychlost_y < 0.01f)
  5560. pCastice->a = 0;
  5561. pCastice = pCastice->p_next;
  5562. }
  5563. }
  5564. }
  5565. }
  5566. int am_Create_Falling_Stars(LEVELINFO * p_Level, float *r)
  5567. {
  5568. int i, idx;
  5569. float pos[3], low_plane, radius, start;
  5570. for (i = 0; i < 1; i++) {
  5571. idx = 0;
  5572. if (idx == -1)
  5573. return 0;
  5574. radius = 10;
  5575. low_plane = r[1];
  5576. start = r[4];
  5577. pos[0] = r[0] + randf() * r[3];
  5578. pos[1] = r[4];
  5579. pos[2] = r[2] + randf() * r[5];
  5580. am_Create_Falling_Star(p_Level, &p_Level->StarFall[idx], pos, low_plane,
  5581. "flare100", radius, start, r);
  5582. }
  5583. return 1;
  5584. }
  5585. int am_Get_Free_CandleSystem(LEVELINFO * p_Level)
  5586. {
  5587. int i;
  5588. for (i = 0; i < 6; i++)
  5589. if (p_Level->CandleEffect[i].pSystem == -1)
  5590. return i;
  5591. return -1;
  5592. }
  5593. int am_Create_CandleSystem(float *pos, LEVELINFO * p_Level)
  5594. {
  5595. int m, k, hSvetlo;
  5596. PAR_KOUR_STOPA *pKourovaS;
  5597. CANDLE_EFFECT *pSystem;
  5598. k = am_Get_Free_CandleSystem(p_Level);
  5599. if (k == -1)
  5600. return -1;
  5601. pSystem = &p_Level->CandleEffect[k];
  5602. pKourovaS = (PAR_KOUR_STOPA *) malloc(200 * sizeof(PAR_KOUR_STOPA));
  5603. if (!pKourovaS)
  5604. return -1;
  5605. pSystem->pCastice = pKourovaS;
  5606. pSystem->csize = 200;
  5607. m = kom_najdi_material("flare5");
  5608. if (m == -1)
  5609. kprintf(1, "Nelze najit material flare5");
  5610. pKourovaS[0].rychlost_x = pKourovaS[0].rychlost_y =
  5611. (randf() / (float) (RAND_MAX)) / 1.0f;
  5612. pKourovaS[0].utlum_x = -2;
  5613. pKourovaS[0].utlum_y = -2;
  5614. pKourovaS[0].r = 1;
  5615. pKourovaS[0].g = 1;
  5616. pKourovaS[0].b = 0.5f;
  5617. pKourovaS[0].a = 0.75f;
  5618. pKourovaS[0].dr = pKourovaS[0].dg = pKourovaS[0].db = pKourovaS[0].da = 0;
  5619. pKourovaS[0].ka = 0;
  5620. pSystem->pSystem = par_vyrob();
  5621. par_set_param(pSystem->pSystem, m,
  5622. TPAR_NO_FOG | TPAR_YPLANE_TOP | TPAR_DIR | TPAR_SCALE | TPAR_VETSI |
  5623. TPAR_AUTOREMOVE, (BOD *) pos, NULL);
  5624. par_vloz_kour_stopu(pSystem->pSystem, pKourovaS, pSystem->csize);
  5625. pSystem->hHnizdo = par_vloz_hnizdo(pSystem->pSystem);
  5626. par_vloz_hnizdo_komplet(pSystem->hHnizdo, 10, &pSystem->pivot, pKourovaS);
  5627. par_vloz_hnizdo_timer(pSystem->hHnizdo, 10, -10);
  5628. memcpy((void *) &pSystem->pivot, (void *) pos, 3 * sizeof(float));
  5629. memcpy((void *) &pSystem->pos, (void *) pos, 3 * sizeof(float));
  5630. pSystem->dir.x = 0;
  5631. pSystem->dir.y = (randf() / (float) (RAND_MAX)) * 1;
  5632. pSystem->dir.z = 0;
  5633. par_vloz_hnizdo_y_plane(pSystem->hHnizdo, pos[1] + 10);
  5634. par_vloz_hnizdo_dir(pSystem->hHnizdo, &pSystem->dir);
  5635. par_pripoj_funkci(pSystem->pSystem, anmend_ZrusCastice3, 0, 0,
  5636. (void *) pKourovaS);
  5637. par_go(pSystem->pSystem, &pSystem->flag, 0, 0);
  5638. hSvetlo = sdl_svetlo_vyrob(SDL_UTLUM_LINEAR);
  5639. if (hSvetlo != -1) {
  5640. int cfames = 50 * ((rand() % 9) + 1);
  5641. int cklicu = (int) floor(cfames / 4.0f);
  5642. float dosah;
  5643. int frm;
  5644. sdl_svetlo_set_pos(hSvetlo, (BOD *) pSystem->pos);
  5645. sdl_svetlo_set_diff(hSvetlo, 0.25f, 0.25f, 0.197f, 0, 0, 0);
  5646. sdl_anim_vyrob(hSvetlo, cfames, 0, 0, cklicu);
  5647. sdl_anim_vloz_klic_vzdal(hSvetlo, 0, 30, 0, 30, 0);
  5648. sdl_anim_vloz_klic_vzdal(hSvetlo, cklicu - 1, 30, 0, 30, cfames - 1);
  5649. for (m = 1; m < cklicu - 1; m++) {
  5650. dosah = 30 + (((rand() & 0x1 ? randf() : -randf()) / RAND_MAX) * 25.0f);
  5651. frm = (m * (int) floor(cfames / (float) cklicu));
  5652. sdl_anim_vloz_klic_vzdal(hSvetlo, m, dosah, 0, dosah, frm);
  5653. }
  5654. sdl_anim_start(hSvetlo, &p_Level->TrashFlag, GK_LOOP, 0, 0);
  5655. }
  5656. pSystem->hSvetlo = hSvetlo;
  5657. return k;
  5658. }
  5659. void am_Do_CandleSparks(LEVELINFO * p_Level)
  5660. {
  5661. int i;
  5662. float f;
  5663. PAR_KOUR_STOPA *pCastice;
  5664. CANDLE_EFFECT *pSystem;
  5665. for (i = 0; i < 6; i++)
  5666. if (p_Level->CandleEffect[i].pSystem != -1) {
  5667. pCastice = par_cti_hnizdo_castice(p_Level->CandleEffect[i].hHnizdo);
  5668. pSystem = &p_Level->CandleEffect[i];
  5669. // test na velikost castic. Pokud je moc mala, tak pric s ni
  5670. if (pCastice) {
  5671. while (pCastice) {
  5672. if (pCastice->rychlost_x < 0.001f || pCastice->rychlost_y < 0.001f)
  5673. pCastice->a = 0;
  5674. pCastice = pCastice->p_next;
  5675. }
  5676. }
  5677. memcpy((void *) &pSystem->pivot, (void *) &pSystem->pos,
  5678. 3 * sizeof(float));
  5679. pSystem->pivot.x +=
  5680. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * 0.25f;
  5681. pSystem->pivot.y = pSystem->pos[1];
  5682. pSystem->pivot.z +=
  5683. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * 0.25f;
  5684. //norm_vect_2D(&pSystem->pivot.x, &pSystem->pivot.y);
  5685. f = (randf() / (float) (RAND_MAX)) * 2;
  5686. if (f < 1)
  5687. f = 1;
  5688. par_vloz_hnizdo_scale(pSystem->hHnizdo, f, f, -2.0f, -2.0f);
  5689. pSystem->dir.y = (randf() / (float) (RAND_MAX)) * 2;
  5690. }
  5691. }
  5692. int am_Get_Free_SmokeSystem(LEVELINFO * p_Level)
  5693. {
  5694. int i;
  5695. for (i = 0; i < 6; i++)
  5696. if (p_Level->CandleSmoke[i].pSystem == -1)
  5697. return i;
  5698. return -1;
  5699. }
  5700. int am_Create_CandleSmokeSystem(float *pos, LEVELINFO * p_Level)
  5701. {
  5702. int m, k;
  5703. PAR_KOUR_STOPA *pKourovaS;
  5704. CANDLE_EFFECT *pSystem;
  5705. k = am_Get_Free_CandleSystem(p_Level);
  5706. if (k == -1)
  5707. return -1;
  5708. pSystem = &p_Level->CandleSmoke[k];
  5709. pKourovaS = (PAR_KOUR_STOPA *) malloc(300 * sizeof(PAR_KOUR_STOPA));
  5710. if (!pKourovaS)
  5711. return -1;
  5712. pSystem->pCastice = pKourovaS;
  5713. pSystem->csize = 300;
  5714. m = kom_najdi_material("mrak1_1");
  5715. if (m == -1)
  5716. kprintf(1, "Nelze najit material mrak1_1");
  5717. pKourovaS[0].rychlost_x = pKourovaS[0].rychlost_y =
  5718. (randf() / (float) (RAND_MAX)) / 10.0f;
  5719. pKourovaS[0].utlum_x = 1;
  5720. pKourovaS[0].utlum_y = 1;
  5721. pKourovaS[0].r = 0.75f;
  5722. pKourovaS[0].g = 0.75f;
  5723. pKourovaS[0].b = 0.75f;
  5724. pKourovaS[0].a = 0.5f;
  5725. pKourovaS[0].dr = pKourovaS[0].dg = pKourovaS[0].db = 0;
  5726. pKourovaS[0].da = -0.1f;
  5727. pKourovaS[0].ka = 0;
  5728. pSystem->pSystem = par_vyrob();
  5729. par_set_param(pSystem->pSystem, m,
  5730. TPAR_NO_FOG | TPAR_YPLANE_TOP | TPAR_DIR | TPAR_SCALE | TPAR_VETSI |
  5731. TPAR_AUTOREMOVE, (BOD *) pos, NULL);
  5732. par_vloz_kour_stopu(pSystem->pSystem, pKourovaS, pSystem->csize);
  5733. pSystem->hHnizdo = par_vloz_hnizdo(pSystem->pSystem);
  5734. par_vloz_hnizdo_komplet(pSystem->hHnizdo, 10, &pSystem->pivot, pKourovaS);
  5735. par_vloz_hnizdo_timer(pSystem->hHnizdo, 10, -10);
  5736. memcpy((void *) &pSystem->pivot, (void *) pos, 3 * sizeof(float));
  5737. memcpy((void *) &pSystem->pos, (void *) pos, 3 * sizeof(float));
  5738. pSystem->dir.x = 0;
  5739. pSystem->dir.y = (randf() / (float) (RAND_MAX)) * 1;
  5740. pSystem->dir.z = 0;
  5741. par_vloz_hnizdo_y_plane(pSystem->hHnizdo, pos[1] + 10);
  5742. par_vloz_hnizdo_dir(pSystem->hHnizdo, &pSystem->dir);
  5743. par_pripoj_funkci(pSystem->pSystem, anmend_ZrusCastice3, 0, 0,
  5744. (void *) pKourovaS);
  5745. par_go(pSystem->pSystem, &pSystem->flag, 0, 0);
  5746. return k;
  5747. }
  5748. void am_Do_CandleSmoke(LEVELINFO * p_Level)
  5749. {
  5750. int i;
  5751. float f;
  5752. CANDLE_EFFECT *pSystem;
  5753. for (i = 0; i < 6; i++)
  5754. if (p_Level->CandleSmoke[i].pSystem != -1) {
  5755. pSystem = &p_Level->CandleSmoke[i];
  5756. memcpy((void *) &pSystem->pivot, (void *) &pSystem->pos,
  5757. 3 * sizeof(float));
  5758. pSystem->pivot.x +=
  5759. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * 0.25f;
  5760. pSystem->pivot.y = pSystem->pos[1];
  5761. pSystem->pivot.z +=
  5762. ((rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX)) * 0.25f;
  5763. //norm_vect_2D(&pSystem->pivot.x, &pSystem->pivot.y);
  5764. f = (randf() / (float) (RAND_MAX)) * 0.01f;
  5765. par_vloz_hnizdo_scale(pSystem->hHnizdo, f, f, 1.0f, 1.0f);
  5766. pSystem->dir.y = (randf() / (float) (RAND_MAX)) * 2;
  5767. }
  5768. }
  5769. void am_Start_Voda_Kanal(void)
  5770. {
  5771. BOD p(0, 0, 0);
  5772. MeshHandle mh;
  5773. VodnikHandle voh;
  5774. VodaHandle vh = vod_vyrob(5);
  5775. mh = kom_pridej_mesh_do_levelu("voda.b2m_Voda1");
  5776. vod_pridej_mesh(vh, mh);
  5777. mh = kom_pridej_mesh_do_levelu("voda.b2m_Voda2");
  5778. vod_pridej_mesh(vh, mh);
  5779. mh = kom_pridej_mesh_do_levelu("voda.b2m_Voda3");
  5780. vod_pridej_mesh(vh, mh);
  5781. mh = kom_pridej_mesh_do_levelu("voda.b2m_Voda4");
  5782. vod_pridej_mesh(vh, mh);
  5783. mh = kom_pridej_mesh_do_levelu("voda.b2m_Voda5");
  5784. vod_pridej_mesh(vh, mh);
  5785. vod_uzavri_meshe(vh);
  5786. voh =
  5787. vod_vloz_vodnika(vh, &p,
  5788. VOD_AKTIVNI | VOD_Z_PLANE | VOD_DIFF_ADD | VOD_SPEC_ADD, 1, 50, 1, 0, 0,
  5789. 200);
  5790. vod_vloz_vodnika_spec(voh, 0.1f, 0.1f, 0.1f);
  5791. vod_vloz_vodnika_add_spec(voh, 0, 0, 0);
  5792. vod_vloz_vodnika_diff(voh, 0.05f, 0.05f, 0.05f, 0.125f);
  5793. vod_vloz_vodnika_add_diff(voh, 0, 0, 0, 0);
  5794. p.x = 100;
  5795. p.z = 100;
  5796. voh =
  5797. vod_vloz_vodnika(vh, &p,
  5798. VOD_AKTIVNI | VOD_X_PLANE | VOD_DIFF_ADD | VOD_SPEC_ADD, 0.5f, 50, 1, 0,
  5799. 0, 200);
  5800. voh =
  5801. vod_vloz_vodnika(vh, &p,
  5802. VOD_AKTIVNI | VOD_BOD | VOD_DIFF_ADD | VOD_SPEC_ADD, 0.25f, 50, 1, 0, 0,
  5803. 200);
  5804. }
  5805. void am_Create_Item_Lights(LEVELINFO * p_Level)
  5806. {
  5807. float pos[3];
  5808. int i, hSvetlo, rot;
  5809. for (i = 0; i < p_Level->Size_of_Level; i++)
  5810. if (p_Level->Level[i])
  5811. if (p_Level->Level[i]->p_Object->Class == 13) {
  5812. hSvetlo = sdl_svetlo_vyrob(SDL_UTLUM_LINEAR);
  5813. if (hSvetlo != -1) {
  5814. kom_mesh_get_float(p_Level->Level[i]->Index_Of_Game_Mesh, &pos[0],
  5815. &pos[1], &pos[2], &rot);
  5816. sdl_svetlo_set_pos(hSvetlo, (BOD *) pos);
  5817. sdl_svetlo_set_diff(hSvetlo, 1.0f, 1.0f, 0.75f, 0, 0, 0);
  5818. sdl_anim_vyrob(hSvetlo, 40, 0, 0, 4);
  5819. sdl_anim_vloz_klic_vzdal(hSvetlo, 0, 1, 0, 1, 0);
  5820. sdl_anim_vloz_klic_vzdal(hSvetlo, 1, 1.5f, 0, 1.5f, 9);
  5821. sdl_anim_vloz_klic_vzdal(hSvetlo, 2, 2, 0, 2, 19);
  5822. sdl_anim_vloz_klic_vzdal(hSvetlo, 3, 1, 0, 1, 29);
  5823. sdl_anim_start(hSvetlo, &p_Level->TrashFlag, GK_LOOP, 0, 0);
  5824. }
  5825. p_Level->Level[i]->hSvetlo = hSvetlo;
  5826. }
  5827. }
  5828. void am_Start_Voda_Akvarko(void)
  5829. {
  5830. BOD p(0, 0, 0);
  5831. MeshHandle mh;
  5832. VodnikHandle voh;
  5833. VodaHandle vh = vod_vyrob(1);
  5834. mh = kom_pridej_mesh_do_levelu("akvarko_voda.b2m");
  5835. vod_pridej_mesh(vh, mh);
  5836. vod_uzavri_meshe(vh);
  5837. voh =
  5838. vod_vloz_vodnika(vh, &p,
  5839. VOD_AKTIVNI | VOD_Z_PLANE | VOD_DIFF_ADD | VOD_SPEC_ADD, 0.1f, 50, 1, 0,
  5840. 0, 200);
  5841. vod_vloz_vodnika_spec(voh, 0.1f, 0.1f, 0.1f);
  5842. vod_vloz_vodnika_add_spec(voh, 0, 0, 0);
  5843. vod_vloz_vodnika_diff(voh, 0.05f, 0.05f, 0.05f, 0.125f);
  5844. vod_vloz_vodnika_add_diff(voh, 0, 0, 0, 0);
  5845. p.x = 100;
  5846. p.z = 100;
  5847. voh =
  5848. vod_vloz_vodnika(vh, &p,
  5849. VOD_AKTIVNI | VOD_X_PLANE | VOD_DIFF_ADD | VOD_SPEC_ADD, 0.1f, 50, 1, 0,
  5850. 0, 200);
  5851. voh =
  5852. vod_vloz_vodnika(vh, &p,
  5853. VOD_AKTIVNI | VOD_BOD | VOD_DIFF_ADD | VOD_SPEC_ADD, 0.1f, 50, 1, 0, 0,
  5854. 200);
  5855. }