/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
Large files files are truncated, but you can click here to view the full file
- //------------------------------------------------------------------------------------------------
- // version 1.0.1
- //------------------------------------------------------------------------------------------------
- #include <math.h>
- #include "3d_all.h"
- #include "Berusky3d_kofola_interface.h"
- #include "Berusky3d_light.h"
- #include "Berusky3d_kofola2d.h"
- #include "game_logic.h"
- #include "animationk.h"
- #include "animend_functions.h"
- #include "water.h"
- #include "3d_math.h"
- #include "3D_graphic.h"
- #include "menu_def.h"
- #include "3D_menus.h"
- #include "Apak.h"
- #define randf() ((float)rand())
- extern APAK_HANDLE *pDataArchive;
- extern LEVELINFO Level;
- extern _3D_CURSOR _3dCur;
- extern G_KONFIG ber;
- extern AUDIO_DATA ad;
- void am_Do_Vodni_Cakanec2(float *pos, int VyskaPadu, int predmet,
- LEVELINFO * p_Level);
- int am_Find_Water(int i, float *f, LEVELINFO * p_Level);
- extern int gl_Choose_Wave_Index(int Plus);
- extern void gl_Do_Strepiny_Na_Vode(float *pos, LEVELINFO * p_Level,
- float fycor);
- static int mx = 0;
- static int my = 0;
- RECT rDrawRect[DRAW_RECT_NUM];
- float am_vzdal_bodu(float x1, float y1, float x2, float y2)
- {
- return ((float) sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)));
- }
- float am_vzdal_bodu_single(float x1, float x2)
- {
- return ((float) sqrt((x2 - x1) * (x2 - x1)));
- }
- //------------------------------------------------------------------------------------------------
- // init animation module
- //------------------------------------------------------------------------------------------------
- int am_Init(ANIMATION_MODULE * p_am, LEVELINFO * p_Level)
- {
- FILE *file = NULL;
- char text[256];
- int i;
- pDataArchive->pActualNode = pDataArchive->pRootNode->pNextNode;
- p_am->Size_of_Anim = 100;
- p_am->p_animation =
- (SIM_ANIMATION *) malloc((p_am->Size_of_Anim) * sizeof(SIM_ANIMATION));
- if (!p_am->p_animation) {
- //MessageBox(p_am->hWnd,"Unable to allocate memory for animatin module","Error",MB_OK);
- kprintf(1, "Unable to allocate memory for animatin module");
- return 0;
- }
- else
- ZeroMemory(p_am->p_animation,
- (p_am->Size_of_Anim) * sizeof(SIM_ANIMATION));
- for (i = 0; i < p_am->Size_of_Anim; i++) {
- p_am->p_animation[i].flag = 0;
- p_am->p_animation[i].p_run = -1;
- p_am->p_animation[i].p_matrix = -1;
- }
- GetPrivateProfileString("game", "data_dir", "c:\\", text, 256, ini_file);
- working_file_translate(text, 255);
- chdir((text));
- pDataArchive->pActualNode = pDataArchive->pRootNode->pNextNode;
- file = aopen(pDataArchive, "animload.dat", "r");
- if (!file) {
- kprintf(1, "animload.dat not found");
- return 0;
- }
- for (i = 0; i < 110; i++)
- p_am->sim_anim[i] = -1;
- i = 0;
- kprintf(1, "Kofola - Nahravam animace...");
- while (!aeof(file)) {
- if (!agets(text, 256, file))
- break;
- newline_cut(text);
- //kprintf(1, "%s", text);
- p_am->sim_anim[i] = sim_nahraj_animaci(pDataArchive, text, 0);
- i++;
- }
- aclose(file);
- return 1;
- }
- //------------------------------------------------------------------------------------------------
- // release animation module
- //------------------------------------------------------------------------------------------------
- void am_Release(ANIMATION_MODULE * p_am, LEVELINFO * p_Level)
- {
- int i;
- for (i = 0; i < 110; i++)
- if (p_am->sim_anim[i] != -1) {
- kprintf(1, "sim_zrus_animaci[%d], sim = %d", i, p_am->sim_anim[i]);
- sim_zrus_animaci(p_am->sim_anim[i]);
- }
- free((void *) p_am->p_animation);
- p_am->Size_of_Anim = 0;
- for (i = 0; i < 10; i++)
- if (p_Level->ExitSparks[i].System != -1) {
- kprintf(1, "ExitSparks[%d], par_zrus %d", i,
- p_Level->ExitSparks[i].System);
- par_zrus(p_Level->ExitSparks[i].System);
- p_Level->ExitSparks[i].System = -1;
- }
- }
- //------------------------------------------------------------------------------------------------
- // find free animation item
- //------------------------------------------------------------------------------------------------
- int am_Find_Free_Animation_Item(ANIMATION_MODULE * p_am)
- {
- int i;
- for (i = 0; i < p_am->Size_of_Anim; i++)
- if (p_am->p_animation[i].flag == -1)
- return i;
- return -1;
- }
- //------------------------------------------------------------------------------------------------
- // get animaton status
- //------------------------------------------------------------------------------------------------
- int am_Animation_Status(SIM_ANIMATION * p_animation, ANIMATION_MODULE * p_am)
- {
- if (p_animation->flag == -1) {
- if (p_animation->p_run != -1) {
- //rani_rozvaz(p_animation->p_run,p_animation->p_matrix);
- rani_zrus(p_animation->p_run);
- p_animation->p_run = -1;
- p_animation->p_matrix = -1;
- }
- return 0;
- }
- else
- return 1;
- }
- //------------------------------------------------------------------------------------------------
- // pripoji funkci na start animace
- //------------------------------------------------------------------------------------------------
- void am_Set_Start_Function(SIM_ANIMATION * p_animation, END_FUNKCE pStartf,
- int iParam1, int iParam2, void *pParam, int index)
- {
- p_animation->tStart[index].pProc = pStartf;
- p_animation->tStart[index].pParam = pParam;
- p_animation->tStart[index].iParam[0] = iParam1;
- p_animation->tStart[index].iParam[1] = iParam2;
- }
- //------------------------------------------------------------------------------------------------
- // nastavi spusteni funkce na ucrite misto animace
- //------------------------------------------------------------------------------------------------
- void am_Set_Triger_Function(SIM_ANIMATION * p_animation, END_FUNKCE pTrigerf,
- int iParam1, int iParam2, void *pParam, int flag, int index)
- {
- p_animation->tTriger[index].pProc = pTrigerf;
- p_animation->tTriger[index].pParam = pParam;
- p_animation->tTriger[index].iParam[0] = iParam1;
- p_animation->tTriger[index].iParam[1] = iParam2;
- p_animation->tTriger[index].flag = flag;
- }
- //------------------------------------------------------------------------------------------------
- // nastavi spusteni funkce na ucrite misto animace
- //------------------------------------------------------------------------------------------------
- void am_Set_aMaterial_Function(SIM_ANIMATION * p_animation, int i,
- END_FUNKCE taMateral, int iParam1, int iParam2, void *pParam, int flag)
- {
- p_animation->taMateral[i].pProc = taMateral;
- p_animation->taMateral[i].pParam = pParam;
- p_animation->taMateral[i].iParam[0] = iParam1;
- p_animation->taMateral[i].iParam[1] = iParam2;
- p_animation->taMateral[i].flag = flag;
- }
- //------------------------------------------------------------------------------------------------
- // odebere predmet ke konstantni animaci
- //------------------------------------------------------------------------------------------------
- void am_Remove_Animate_item(long item, LEVELINFO * p_Level)
- {
- int i = 0;
- while (p_Level->Anim_Item[i] != p_Level->Level[item]->iItem)
- i++;
- if (p_Level->Item[p_Level->Anim_Item[i]].a_run != -1) {
- rani_zrus(p_Level->Item[p_Level->Anim_Item[i]].a_run);
- p_Level->Item[p_Level->Anim_Item[i]].a_run = -1;
- p_Level->Item[p_Level->Anim_Item[i]].a_flag = -1;
- }
- i++;
- while (p_Level->Anim_Item[i] != -1) {
- p_Level->Anim_Item[i - 1] = p_Level->Anim_Item[i];
- i++;
- }
- if (i > 0)
- p_Level->Anim_Item[i - 1] = p_Level->Anim_Item[i];
- else
- p_Level->Anim_Item[0] = -1;
- }
- //------------------------------------------------------------------------------------------------
- // odebere predmet ke konstantni animaci
- //------------------------------------------------------------------------------------------------
- void am_Remove_Animate_itemB(int iItem, LEVELINFO * p_Level)
- {
- int i = 0;
- while (p_Level->Anim_Item[i] != iItem)
- i++;
- if (p_Level->Item[p_Level->Anim_Item[i]].a_run != -1) {
- rani_zrus(p_Level->Item[p_Level->Anim_Item[i]].a_run);
- p_Level->Item[p_Level->Anim_Item[i]].a_run = -1;
- p_Level->Item[p_Level->Anim_Item[i]].a_flag = -1;
- }
- i++;
- while (p_Level->Anim_Item[i] != -1) {
- p_Level->Anim_Item[i - 1] = p_Level->Anim_Item[i];
- i++;
- }
- if (i > 0)
- p_Level->Anim_Item[i - 1] = p_Level->Anim_Item[i];
- else
- p_Level->Anim_Item[0] = -1;
- }
- //------------------------------------------------------------------------------------------------
- // prida predmet ke konstantni animaci
- //------------------------------------------------------------------------------------------------
- void am_Add_Animate_Item(long item, LEVELINFO * p_Level)
- {
- // int iPos[3];
- // float pos[3];
- int i = 0; //, rot;
- while (p_Level->Anim_Item[i] != -1)
- i++;
- p_Level->Anim_Item[i] = p_Level->Level[item]->iItem;
- p_Level->Anim_Item[i + 1] = -1;
- /* memcpy((void *) iPos, (void *) p_Level->Level[item]->Pos, 3*sizeof(int));
- iPos[2]--;
- gl_Logical2Real(iPos[0], iPos[1], iPos[2], &rot, p_Level);
- if(p_Level->Level[rot])
- if(p_Level->Level[rot]->p_Object->Class == 12)
- {
- kom_mesh_get_float(p_Level->Level[item]->Index_Of_Game_Mesh,
- &pos[0], &pos[1], &pos[2], &rot);
- am_Kola_na_VodeB(pos, 1, -1, 1, p_Level);
- }*/
- }
- //------------------------------------------------------------------------------------------------
- // prida predmet ke konstantni animaci
- //------------------------------------------------------------------------------------------------
- void am_Add_Animate_ItemB(int iItem, LEVELINFO * p_Level)
- {
- // int iPos[3];
- // float pos[3];
- int i = 0; //, rot;
- while (p_Level->Anim_Item[i] != -1)
- i++;
- p_Level->Anim_Item[i] = iItem;
- p_Level->Anim_Item[i + 1] = -1;
- /* memcpy((void *) iPos, (void *) p_Level->Item[iItem].Pos, 3*sizeof(int));
- iPos[2]--;
- gl_Logical2Real(iPos[0], iPos[1], iPos[2], &rot, p_Level);
- if(p_Level->Level[rot])
- if(p_Level->Level[rot]->p_Object->Class == 12)
- {
- kom_mesh_get_float(p_Level->Item[iItem].Index_Of_Game_Mesh,
- &pos[0], &pos[1], &pos[2], &rot);
- am_Kola_na_VodeB(pos, 1, -1, 1, p_Level);
- }*/
- }
- //------------------------------------------------------------------------------------------------
- // animuje predmety
- //------------------------------------------------------------------------------------------------
- void am_Animate_Items(ANIMATION_MODULE * p_am, LEVELINFO * p_Level)
- {
- int i = 0;
- ITEMDESC *p_item;
- while (p_Level->Anim_Item[i] != -1) {
- if (p_Level->Item[p_Level->Anim_Item[i]].a_flag == -1) {
- p_item = &p_Level->Item[p_Level->Anim_Item[i]];
- if (p_item->a_run != -1) {
- rani_zrus(p_item->a_run);
- p_item->a_run = -1;
- }
- p_item->a_run =
- rani_aktivuj(p_am->sim_anim[34], &p_item->a_flag, GK_LOOP, 0, 0);
- if (p_item->a_run != -1) {
- rani_privaz_mesh(p_item->a_run, p_item->Index_Of_Game_Mesh, 0);
- p_item->a_flag = 0;
- }
- }
- i++;
- if (i > p_Level->Count_Of_Items)
- return;
- }
- }
- //------------------------------------------------------------------------------------------------
- // animuje predmety
- //------------------------------------------------------------------------------------------------
- void am_Release_Animate_Items(ANIMATION_MODULE * p_am, LEVELINFO * p_Level)
- {
- int i = 0;
- ITEMDESC *p_item;
- while (p_Level->Anim_Item[i] != -1) {
- kprintf(1, "am_Release_Animate_Items - p_Level->Anim_Item[%d]", i);
- p_item = &p_Level->Item[p_Level->Anim_Item[i]];
- if (p_item->a_run != -1) {
- kprintf(1, "rani_zrus...");
- rani_zrus(p_item->a_run);
- p_item->a_run = -1;
- }
- i++;
- }
- }
- void am_Set_aMaterial_Trigers(SIM_ANIMATION * p_animation, ITEMDESC * p_Item,
- LEVELINFO * p_Level)
- {
- int i;
- for (i = 0; i < 3; i++)
- if (p_Item->p_Object->MatEvent[i].cType == 1)
- am_Set_aMaterial_Function(p_animation, i, anmend_Send_Event,
- p_Item->mMaterial->handle_materialove_animace, 0, 0,
- p_Item->p_Object->MatEvent[i].iFlag);
- else if (p_Item->p_Object->MatEvent[i].cType == 2)
- am_Set_aMaterial_Function(p_animation, i, anmend_Send_Event,
- p_Item->mMaterial->handle_materialove_animace, 0, 0, -1);
- else if (!p_Item->p_Object->MatEvent[i].cType)
- am_Set_aMaterial_Function(p_animation, i, NULL, 0, 0, 0, -1);
- }
- void am_Set_Beetle_Switching(LEVELINFO * p_Level, int mesh, int bSwitch)
- {
- int i;
- for (i = 0; i < 6; i++)
- if (p_Level->BeetleAnim[i].Mesh == mesh) {
- p_Level->BeetleAnim[i].bSwitch = bSwitch;
- return;
- }
- return;
- }
- void am_Play_Beatle_Sound(BEETLEANIMATION * p_anim, int mesh, int idx)
- {
- float pos[3];
- int rot;
- kom_mesh_get_float(mesh, &pos[0], &pos[1], &pos[2], &rot);
- p_anim->iSound = ap_Play_Sound(0, 0, 0, pos, idx + (rand()%3), NULL, &ad);
- p_anim->dwTime = timeGetTime();
- }
- void am_Do_Beatle_Cakanec(int mesh, LEVELINFO * p_Level, int id)
- {
- int iPos[3], r;
- float pos[3], fPos[3];
- int real;
- if (p_Level->bUnderWaterLevel)
- return;
- kom_mesh_get_float(mesh, &pos[0], &pos[1], &pos[2], &r);
- iPos[0] = ftoi((pos[0] - ber.x_start - X_PRVEK / 2) / X_PRVEK);
- iPos[2] = ftoi(((pos[1] - ber.y_start - Y_PRVEK / 2) / Y_PRVEK) * 2);
- iPos[1] = ftoi((pos[2] - ber.z_start - Z_PRVEK / 2) / Z_PRVEK);
- if (iPos[0] < 0 || iPos[1] < 0 || iPos[2] < 0 ||
- iPos[0] >= p_Level->Size[0] ||
- iPos[1] >= p_Level->Size[1] || iPos[2] >= p_Level->Size[2])
- return;
- gl_Logical2Real(iPos[0], iPos[1], iPos[2], &real, p_Level);
- if (p_Level->Level[real])
- if (p_Level->Level[real]->p_Object->Class == 12) {
- fPos[0] = pos[0];
- fPos[1] = pos[1] - 1;
- fPos[2] = pos[2];
- if (!id) {
- am_Kola_na_Vode(fPos, 1, 4, 0, p_Level);
- ap_Play_Sound(0,0,0, pos, 74+(rand()%3), NULL, &ad);
- }
- else {
- pos[1] += -0.7f;
- am_Do_Vodni_Cakanec1(pos, 4, 0, p_Level);
- //am_Do_Vodni_Cakanec2(pos, 4, 0, p_Level);
- ap_Play_Sound(0,0,0, pos, 40+(rand()%4), NULL, &ad);
- }
- }
- }
- void am_Animate_Beetle(LEVELINFO * p_Level, int i)
- {
- int r;
- switch (p_Level->BeetleAnim[i].iID) {
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- case 8:
- lani_set(p_Level->BeetleAnim[i].Mesh, 0, 0,
- &p_Level->BeetleAnim[i].Flag, 0, 0, 0);
- p_Level->BeetleAnim[i].iAnimCount++;
- return;
- case 2:
- r = rand() % 8;
- lani_set(p_Level->BeetleAnim[i].Mesh, 0, 2 + r,
- &p_Level->BeetleAnim[i].Flag, 0, 0, 0);
- p_Level->BeetleAnim[i].iAnimCount++;
- return;
- case 0:
- r = rand() % 12;
- lani_set(p_Level->BeetleAnim[i].Mesh, 0, 3 + r,
- &p_Level->BeetleAnim[i].Flag, 0, 0, 0);
- if (p_Level->BeetleAnim[i].iAnimCount) {
- if (r == 4) // pada
- am_Play_Beatle_Sound(&p_Level->BeetleAnim[i],
- p_Level->BeetleAnim[i].Mesh, 165);
- else if (r == 5) // salto
- {
- am_Play_Beatle_Sound(&p_Level->BeetleAnim[i],
- p_Level->BeetleAnim[i].Mesh, 168);
- p_Level->BeetleAnim[i].iEffect = 1;
- p_Level->BeetleAnim[i].iEffectCounter = 0;
- }
- else if (r == 11) // meditace
- am_Play_Beatle_Sound(&p_Level->BeetleAnim[i],
- p_Level->BeetleAnim[i].Mesh, 171);
- }
- p_Level->BeetleAnim[i].iAnimCount++;
- return;
- }
- kprintf(1, "Nemuzu animovat brouka! ID = %d", p_Level->BeetleAnim[i].iID);
- }
- void am_Animate_Beetles(LEVELINFO * p_Level)
- {
- DWORD time = timeGetTime();
- int i, r, x;
- for (i = 0; i < 6; i++)
- if (p_Level->BeetleAnim[i].Mesh != -1
- && p_Level->BeetleAnim[i].Flag == -1) {
- //jedu na starem cekani ... a tak to musi zustat
- /*if(p_Level->BeetleAnim[i].iID == 2)
- {
- kom_mesh_set_mesh(p_Level->BeetleAnim[i].Mesh, 2, p_Level->BeetleAnim[i].iRot);
- r = rand()%8;
- lani_set(p_Level->BeetleAnim[i].Mesh, 0, 2 + r, &p_Level->BeetleAnim[i].Flag,0,0,0);
- }
- else */
- if (gl_Check_Mesh_Sim(p_Level->BeetleAnim[i].Mesh)) //brouk se animuje -> nemuzu prepinat meshe
- am_Animate_Beetle(p_Level, i);
- else {
- r = (rand() % 10);
- /*
- r <0-6> nejcastejsi cekani
- r <7-8> ridke cekani
- r <9> stare cekani
- */
- if (time - p_Level->BeetleAnim[i].dwTime > 180000 && !(rand() % 2)) {
- p_Level->BeetleAnim[i].dwTime = time;
- r = 7;
- }
- if (r < 7) {
- x = (rand() % 6);
- kom_mesh_set_mesh(p_Level->BeetleAnim[i].Mesh, 3 + x,
- p_Level->BeetleAnim[i].iRot);
- p_Level->BeetleAnim[i].iID = 3 + x;
- lani_set(p_Level->BeetleAnim[i].Mesh, 0, 0,
- &p_Level->BeetleAnim[i].Flag, 0, 0, 0);
- p_Level->BeetleAnim[i].iAnimCount++;
- }
- else if (r > 6) {
- kom_mesh_set_mesh(p_Level->BeetleAnim[i].Mesh, 0,
- p_Level->BeetleAnim[i].iRot);
- p_Level->BeetleAnim[i].iID = 0;
- x = rand() % 12;
- lani_set(p_Level->BeetleAnim[i].Mesh, 0, 3 + x,
- &p_Level->BeetleAnim[i].Flag, 0, 0, 0);
- if (p_Level->BeetleAnim[i].iAnimCount) {
- if (x == 4) // pada
- am_Play_Beatle_Sound(&p_Level->BeetleAnim[i],
- p_Level->BeetleAnim[i].Mesh, 165);
- else if (x == 5) // salto
- {
- am_Play_Beatle_Sound(&p_Level->BeetleAnim[i],
- p_Level->BeetleAnim[i].Mesh, 168);
- p_Level->BeetleAnim[i].iEffect = 1;
- p_Level->BeetleAnim[i].iEffectCounter = 0;
- }
- else if (x == 11) // meditace
- am_Play_Beatle_Sound(&p_Level->BeetleAnim[i],
- p_Level->BeetleAnim[i].Mesh, 171);
- }
- p_Level->BeetleAnim[i].iAnimCount++;
- }
- /*else
- {
- kom_mesh_set_mesh(p_Level->BeetleAnim[i].Mesh, 2, p_Level->BeetleAnim[i].iRot);
- p_Level->BeetleAnim[i].iID = 2;
- x = rand()%8;
- lani_set(p_Level->BeetleAnim[i].Mesh, 0, 2 + x, &p_Level->BeetleAnim[i].Flag,0,0,0);
- } */
- }
- }
- else
- if (p_Level->BeetleAnim[i].Mesh != -1
- && p_Level->BeetleAnim[i].Flag != -1
- && p_Level->BeetleAnim[i].iEffect) {
- if (!p_Level->BeetleAnim[i].iEffectCounter) {
- am_Do_Beatle_Cakanec(p_Level->BeetleAnim[i].Mesh, p_Level, 0);
- p_Level->BeetleAnim[i].iEffectCounter++;
- }
- else if (p_Level->BeetleAnim[i].Flag >= 10) {
- p_Level->BeetleAnim[i].iEffect = 0;
- am_Do_Beatle_Cakanec(p_Level->BeetleAnim[i].Mesh, p_Level, 1);
- p_Level->BeetleAnim[i].iEffectCounter = 0;
- }
- }
- }
- void am_Remove_Beetle_Animation(int mesh, LEVELINFO * p_Level)
- {
- int i;
- for (i = 0; i < 6; i++)
- if (p_Level->BeetleAnim[i].Mesh == mesh) {
- lani_set(p_Level->BeetleAnim[i].Mesh, 0, K_CHYBA,
- &p_Level->BeetleAnim[i].Flag, 0, 0, 0);
- kom_mesh_set_mesh(mesh, 0, p_Level->BeetleAnim[i].iRot);
- //kprintf(1, "am_Remove_Beetle_Animation set na je %d", p_Level->BeetleAnim[i].iRot);
- p_Level->BeetleAnim[i].Mesh = -1;
- p_Level->BeetleAnim[i].iID = 0;
- /*
- if(timeGetTime() - p_Level->BeetleAnim[i].dwTime < 1000 && p_Level->BeetleAnim[i].iSound != -1)
- adas_Release_Source(PARTICULAR_SOUND_SOURCE, UNDEFINED_VALUE, p_Level->BeetleAnim[i].iSound);
- */
- p_Level->BeetleAnim[i].iSound = -1;
- return;
- }
- }
- void am_Correct_Beetle_Animation(int mesh, LEVELINFO * p_Level, int rot)
- {
- int i;
- for (i = 0; i < 6; i++)
- if (p_Level->BeetleAnim[i].Mesh == mesh) {
- p_Level->BeetleAnim[i].iRot = rot;
- return;
- }
- }
- int am_Add_Beetle_Animation(int mesh, LEVELINFO * p_Level, int iRot,
- char bExeption)
- {
- int i;
- for (i = 0; i < 6; i++)
- if (p_Level->BeetleAnim[i].Mesh == mesh)
- return 0;
- if (gl_Check_Mesh_Sim(mesh) && !bExeption)
- return 0;
- for (i = 0; i < 6; i++)
- if (p_Level->BeetleAnim[i].Mesh == -1) {
- lani_set(mesh, 0, K_CHYBA, &p_Level->BeetleAnim[i].Flag, 0, 0, 0);
- p_Level->BeetleAnim[i].Mesh = mesh;
- p_Level->BeetleAnim[i].Flag = -1;
- p_Level->BeetleAnim[i].iRot = iRot;
- // kom_mesh_set_mesh(mesh, 2, iRot);
- p_Level->BeetleAnim[i].dwTime = timeGetTime();
- p_Level->BeetleAnim[i].iAnimCount = 1;
- p_Level->BeetleAnim[i].iSound = -1;
- p_Level->BeetleAnim[i].iEffect = 0;
- p_Level->BeetleAnim[i].iEffectCounter = 0;
- return 1;
- }
- return 0;
- }
- void am_Stop_Beetle_Animations(LEVELINFO * p_Level)
- {
- int i;
- for (i = 0; i < 6; i++)
- if (p_Level->BeetleAnim[i].Mesh != -1) {
- //kprintf(1, "lani_set[%d], mesh = %d", i, p_Level->BeetleAnim[i].Mesh);
- lani_set(p_Level->BeetleAnim[i].Mesh, 0, K_CHYBA,
- &p_Level->BeetleAnim[i].Flag, 0, 0, 0);
- p_Level->BeetleAnim[i].Mesh = -1;
- }
- }
- void am_Init_Zhave_Castice(LEVELINFO * p_Level)
- {
- int i, j;
- p_Level->BublSystemE.System.System = -1;
- p_Level->BublSystemE.System.pCastice = NULL;
- p_Level->BublSystemC.System.System = -1;
- p_Level->BublSystemC.System.pCastice = NULL;
- for (i = 0; i < 10; i++) {
- p_Level->KourUst[i].pCastice = NULL;
- p_Level->KourUst[i].System = -1;
- for (j = 0; j < 64; j++)
- p_Level->BublVybuch[i].hHnizdo[j] = 0;
- }
- for (i = 0; i < 20; i++) {
- p_Level->TeleportSparks[i].pCastice = NULL;
- p_Level->TeleportSparks[i].System = -1;
- p_Level->ZhaveCastice[i].System.pCastice = NULL;
- p_Level->KourovaStopa[i].pCastice = NULL;
- p_Level->KourovaStopa[i].System = -1;
- p_Level->Kour[i].pCastice = NULL;
- p_Level->Kour[i].System = -1;
- p_Level->KourKameni[i].pCastice = NULL;
- p_Level->KourKameni[i].System = -1;
- p_Level->BublVybuch[i].pCastice = NULL;
- p_Level->BublVybuch[i].System = -1;
- for (j = 0; j < 64; j++) {
- p_Level->ZhaveCastice[i].hSvetlo[j] = -1;
- p_Level->ZhaveCastice[i].hFlare[j] = -1;
- p_Level->KourovaStopa[i].hHnizdo[j] = 0;
- p_Level->Kour[i].hHnizdo[j] = 0;
- p_Level->KourKameni[i].hHnizdo[j] = 0;
- p_Level->BublVybuch[i].hHnizdo[j] = 0;
- p_Level->TeleportSparks[i].hHnizdo[j] = 0;
- }
- }
- for (i = 0; i < 30; i++) {
- p_Level->BarelSparks[i].pCastice = NULL;
- p_Level->BarelSparks[i].System = -1;
- for (j = 0; j < 64; j++)
- p_Level->BarelSparks[i].hHnizdo[j] = 0;
- }
- for (i = 0; i < 10; i++) {
- p_Level->LiftParticles[i].pCastice = NULL;
- p_Level->LiftParticles[i].System = -1;
- p_Level->VodniKola[i].pCastice = NULL;
- p_Level->VodniKola[i].System = -1;
- p_Level->LiftVParticles[i].pCastice = NULL;
- p_Level->LiftVParticles[i].System = -1;
- p_Level->ExitEfect[i].hSvetlo = -1;
- p_Level->ExitEfect[i].System.System = -1;
- p_Level->ExitEfect[i].hEXSvetlo[0] = -1;
- p_Level->ExitEfect[i].hEXSvetlo[1] = -1;
- p_Level->ExitEfect[i].System.hHnizdo[0] = 0;
- p_Level->ExitEfect[i].System.hHnizdo[1] = 0;
- p_Level->ExitSparks[i].pCastice = NULL;
- p_Level->ExitSparks[i].System = -1;
- p_Level->TelCSparks[i].pCastice = NULL;
- p_Level->TelCSparks[i].System = -1;
- p_Level->NatureESystem[i].pCastice = NULL;
- p_Level->NatureESystem[i].pSystem = -1;
- p_Level->NatureESystem[i].hHnizdo = 0;
- p_Level->NatureESystem[i].EffectID = 0;
- for (j = 0; j < 64; j++) {
- p_Level->LiftParticles[i].hHnizdo[j] = 0;
- p_Level->LiftVParticles[i].hHnizdo[j] = 0;
- p_Level->VodniKola[i].hHnizdo[j] = 0;
- p_Level->ExitSparks[i].hHnizdo[j] = 0;
- p_Level->TelCSparks[i].hHnizdo[j] = 0;
- }
- }
- for (i = 0; i < 100; i++) {
- p_Level->VodniKolaB[i].pCastice = NULL;
- p_Level->VodniKolaB[i].System = -1;
- for (j = 0; j < 64; j++)
- p_Level->VodniKola[i].hHnizdo[j] = 0;
- }
- for (i = 0; i < 6; i++) {
- p_Level->BublSystem[i].System.System = -1;
- p_Level->BublSystem[i].iStart =
- (int) ceil((randf() / (float) RAND_MAX) * 3000);
- for (j = 0; j < 64; j++) {
- p_Level->BublSystem[i].System.hHnizdo[j] = 0;
- }
- }
- for (i = 0; i < 8; i++)
- memset(&p_Level->StreetL[i], 0, sizeof(STREET_LIGHT_EFFECT));
- for (i = 0; i < 10; i++)
- memset(&p_Level->SwampL[i], 0, sizeof(STREET_LIGHT_EFFECT));
- for (i = 0; i < 200; i++)
- memset(&p_Level->StarL[i], 0, sizeof(STREET_LIGHT_EFFECT));
- for (i = 0; i < 2; i++) {
- memset(&p_Level->StarFall[i], 0, sizeof(FAIRY_EFFECT));
- p_Level->StarFall[i].pSystem = -1;
- }
- for (i = 0; i < 6; i++) {
- memset(&p_Level->CandleEffect[i], 0, sizeof(CANDLE_EFFECT));
- p_Level->CandleEffect[i].pSystem = -1;
- p_Level->CandleEffect[i].hSvetlo = -1;
- memset(&p_Level->CandleSmoke[i], 0, sizeof(CANDLE_EFFECT));
- p_Level->CandleSmoke[i].pSystem = -1;
- p_Level->CandleSmoke[i].hSvetlo = -1;
- }
- for (i = 0; i < 4; i++) {
- memset(&p_Level->FairyEffect[i], 0, sizeof(FAIRY_EFFECT));
- p_Level->FairyEffect[i].pSystem = -1;
- }
- }
- void am_Obsluha_Koure(int i, LEVELINFO * p_Level)
- {
- DWORD dwTime, dwEplased;
- int j;
- if (p_Level->Kour[i].System != -1) {
- dwTime = timeGetTime();
- dwEplased = dwTime - p_Level->Kour[i].dwStart;
- if (dwEplased > 1000)
- for (j = 0; j < p_Level->Kour[i].Sizeof; j++)
- if (p_Level->Kour[i].hHnizdo[j]) {
- par_vloz_hnizdo_pivot(p_Level->Kour[i].hHnizdo[j], NULL);
- p_Level->Kour[i].hHnizdo[j] = 0;
- }
- if (!par_get_hnizda(p_Level->Kour[i].System)) {
- par_zrus(p_Level->Kour[i].System);
- p_Level->Kour[i].System = -1;
- }
- }
- }
- void am_Obsluha_Koure_Kameni(int i, LEVELINFO * p_Level)
- {
- DWORD dwTime, dwEplased;
- int j;
- if (p_Level->KourKameni[i].System != -1) {
- dwTime = timeGetTime();
- dwEplased = dwTime - p_Level->KourKameni[i].dwStart;
- if (dwEplased > 1000)
- for (j = 0; j < p_Level->KourKameni[i].Sizeof; j++)
- if (p_Level->KourKameni[i].hHnizdo[j]) {
- par_vloz_hnizdo_pivot(p_Level->KourKameni[i].hHnizdo[j], NULL);
- p_Level->KourKameni[i].hHnizdo[j] = 0;
- }
- if (!par_get_hnizda(p_Level->KourKameni[i].System)) {
- par_zrus(p_Level->KourKameni[i].System);
- p_Level->KourKameni[i].System = -1;
- }
- }
- }
- void am_Do_Zhave_castice(LEVELINFO * p_Level)
- {
- int i, j;
- SYSTEMZHAVYCHCASTIC *pSystem;
- DWORD dwTime, dwEplased;
- for (i = 0; i < 20; i++) {
- if (p_Level->ZhaveCastice[i].System.pCastice) {
- pSystem = &p_Level->ZhaveCastice[i];
- for (j = 0; j < pSystem->System.Sizeof; j++)
- if (!pSystem->System.pCastice[j].aktivni) {
- if (pSystem->hSvetlo[j] != -1) {
- sdl_svetlo_zrus(pSystem->hSvetlo[j]);
- pSystem->hSvetlo[j] = -1;
- }
- if (pSystem->hFlare[j] != -1) {
- kom_flare_zrus(pSystem->hFlare[j]);
- pSystem->hFlare[j] = -1;
- }
- if (pSystem->iKourStopa >= 0) {
- if (p_Level->KourovaStopa[pSystem->iKourStopa].hHnizdo[j]) {
- dwTime = timeGetTime();
- dwEplased =
- dwTime - p_Level->KourovaStopa[pSystem->iKourStopa].dwStart;
- if (dwEplased < 100)
- par_zrus_hnizdo(p_Level->KourovaStopa[pSystem->iKourStopa].
- System,
- p_Level->KourovaStopa[pSystem->iKourStopa].hHnizdo[j]);
- else
- par_vloz_hnizdo_pivot(p_Level->KourovaStopa[pSystem->
- iKourStopa].hHnizdo[j], NULL);
- p_Level->KourovaStopa[pSystem->iKourStopa].hHnizdo[j] = 0;
- }
- }
- }
- else
- sdl_svetlo_set_pos(pSystem->hSvetlo[j],
- (BOD *) & pSystem->System.pCastice[j].p);
- }
- if (p_Level->KourovaStopa[i].System != -1)
- if (!par_get_hnizda(p_Level->KourovaStopa[i].System)) {
- par_zrus(p_Level->KourovaStopa[i].System);
- p_Level->KourovaStopa[i].System = -1;
- }
- //obslouzeni kouru
- am_Obsluha_Koure(i, p_Level);
- //obslouzeni koure do kamenech
- am_Obsluha_Koure_Kameni(i, p_Level);
- }
- }
- void am_Release_Zhave_castice(SYSTEMZHAVYCHCASTIC * pSystem)
- {
- int i;
- pSystem->System.pCastice = NULL;
- for (i = 0; i < 32; i++) {
- if (pSystem->hSvetlo[i] != -1) {
- sdl_svetlo_zrus(pSystem->hSvetlo[i]);
- pSystem->hSvetlo[i] = -1;
- }
- if (pSystem->hFlare[i] != -1) {
- kom_flare_zrus(pSystem->hFlare[i]);
- pSystem->hFlare[i] = -1;
- }
- }
- }
- void am_Release_Kourove_Castice(SYSTEMKOUROVYCHCASTIC * pSystem)
- {
- int i;
- pSystem->pCastice = NULL;
- for (i = 0; i < 64; i++) {
- if (pSystem->hHnizdo[i]) {
- par_vloz_hnizdo_pivot(pSystem->hHnizdo[i], NULL);
- pSystem->hHnizdo[i] = 0;
- }
- }
- }
- void am_Change_Wind(LEVELINFO * p_Level)
- {
- float f;
- p_Level->fVitr[0] = rand() & 0x1 ? randf() : -randf();
- p_Level->fVitr[1] = rand() & 0x1 ? randf() : -randf();
- p_Level->fVitr[2] = rand() & 0x1 ? randf() : -randf();
- vektor_norm((BOD *) p_Level->fVitr);
- f = (randf() / (float) (RAND_MAX)) * (_3DKOREKCE / 2.0f);
- p_Level->fVitr[0] *= f / 30.0f;
- p_Level->fVitr[1] *= f / 50.0f;
- p_Level->fVitr[2] *= f / 30.0f;
- }
- void am_Obsluha_Teleportacnich_Jisker(int i, LEVELINFO * p_Level)
- {
- PAR_KOUR_STOPA *pCastice;
- DWORD dwTime, dwEplased;
- int j, r;
- float f;
- if (p_Level->TeleportSparks[i].System != -1) {
- dwTime = timeGetTime();
- dwEplased = dwTime - p_Level->TeleportSparks[i].dwStart;
- if (!p_Level->bGameResume)
- p_Level->TeleportSparks[i].dwTime += ber.TimeLastFrame;
- if (dwEplased > 30000)
- for (j = 0; j < p_Level->TeleportSparks[i].Sizeof; j++)
- if (p_Level->TeleportSparks[i].hHnizdo[j]) {
- par_zrus_hnizdo(p_Level->TeleportSparks[i].System,
- p_Level->TeleportSparks[i].hHnizdo[j]);
- p_Level->TeleportSparks[i].hHnizdo[j] = 0;
- }
- //mihotani jisker
- if (p_Level->TeleportSparks[i].dwTime > 100) {
- for (j = 0; j < p_Level->TeleportSparks[i].Sizeof; j++)
- if (p_Level->TeleportSparks[i].hHnizdo[j]) {
- pCastice =
- par_cti_hnizdo_castice(p_Level->TeleportSparks[i].hHnizdo[j]);
- if (pCastice) {
- while (pCastice) {
- if (pCastice->rychlost_x > 0.01f &&
- pCastice->rychlost_y > 0.01f) {
- r = rand() % 100;
- if (r < 10) {
- f = (randf() / (float) (RAND_MAX)) / 7.5f;
- pCastice->rychlost_x += f;
- pCastice->rychlost_y += f;
- }
- }
- else
- pCastice->a = 0;
- pCastice = pCastice->p_next;
- }
- }
- }
- p_Level->TeleportSparks[i].dwTime = 0;
- }
- if (!par_get_hnizda(p_Level->TeleportSparks[i].System)) {
- par_zrus(p_Level->TeleportSparks[i].System);
- p_Level->TeleportSparks[i].System = -1;
- }
- }
- }
- void am_Do_Flares(LEVELINFO * p_Level)
- {
- int i, j;
- LENS_FLARE *pFlare;
- DWORD dwTime, dwEplased;
- float koef = ber.TimeLastFrame / 1000.0f;
- dwTime = timeGetTime();
- for (i = 0; i < 20; i++)
- if (p_Level->Flare[i].pFlare) {
- dwEplased = dwTime - p_Level->Flare[i].dwStart;
- if (dwEplased > 1000) {
- //pokud se napodarilo prvek presunout v terminu (500 ms) udelej to ted
- if (p_Level->Flare[i].Item) {
- (anmend_Teleport) ((int) p_Level->Flare[i].Item,
- p_Level->Flare[i].Teleport, p_Level->Flare[i].pPointer);
- p_Level->Flare[i].Item = NULL;
- p_Level->Flare[i].Teleport = -1;
- }
- kom_flare_zrus(p_Level->Flare[i].pFlare);
- p_Level->Flare[i].pFlare = 0;
- if (p_Level->Flare[i].hSvetlo != -1) {
- sdl_svetlo_zrus(p_Level->Flare[i].hSvetlo);
- p_Level->Flare[i].hSvetlo = -1;
- }
- if (p_Level->Flare[i].hEXSvetlo != -1) {
- edl_svetlo_zrus(p_Level->Flare[i].hEXSvetlo);
- p_Level->Flare[i].hEXSvetlo = -1;
- }
- }
- else if (dwEplased > 500) {
- //proved teleportaci, pokud je zapsan predmet
- if (p_Level->Flare[i].Item) {
- (anmend_Teleport) ((int) p_Level->Flare[i].Item,
- p_Level->Flare[i].Teleport, p_Level->Flare[i].pPointer);
- p_Level->Flare[i].Item = NULL;
- p_Level->Flare[i].Teleport = -1;
- }
- pFlare = kom_flare_get_pointer(p_Level->Flare[i].pFlare);
- pFlare->dx -= p_Level->Flare[i].mSpeed * koef;
- pFlare->dy -= p_Level->Flare[i].mSpeed * koef;
- for (j = 0; j < 14; j++)
- if (pFlare->p_sloz[j].vzdal) {
- pFlare->p_sloz[j].dx -= p_Level->Flare[i].Speed[j] * koef;
- pFlare->p_sloz[j].dy -= p_Level->Flare[i].Speed[j] * koef;
- }
- else
- break;
- }
- else {
- pFlare = kom_flare_get_pointer(p_Level->Flare[i].pFlare);
- pFlare->dx += p_Level->Flare[i].mSpeed * koef;
- pFlare->dy += p_Level->Flare[i].mSpeed * koef;
- for (j = 0; j < 14; j++)
- if (pFlare->p_sloz[j].vzdal) {
- pFlare->p_sloz[j].dx += p_Level->Flare[i].Speed[j] * koef;
- pFlare->p_sloz[j].dy += p_Level->Flare[i].Speed[j] * koef;
- }
- else
- break;
- }
- }
- for (i = 0; i < 20; i++)
- am_Obsluha_Teleportacnich_Jisker(i, p_Level);
- }
- void am_Do_LiftVParticies(int i, LEVELINFO * p_Level)
- {
- int r;
- float f, pos[3];
- DWORD dwTime, dwEplased;
- PARMETAC_HNIZDO *pHnizdo;
- dwTime = timeGetTime();
- if (p_Level->LiftVParticles[i].System != -1) {
- dwEplased = dwTime - p_Level->LiftVParticles[i].dwStart;
- if (dwEplased > 200000) {
- par_zrus(p_Level->LiftVParticles[i].System);
- p_Level->LiftVParticles[i].System = -1;
- }
- else {
- if (!p_Level->bGameResume)
- p_Level->LiftVParticles[i].dwTime += ber.TimeLastFrame;
- if (p_Level->LiftVParticles[i].dwTime > 500) {
- p_Level->LiftVParticles[i].dwTime = 0;
- if (p_Level->LiftVParticles[i].hHnizdo[0]) {
- pHnizdo = par_cti_hnizdo(p_Level->LiftVParticles[i].hHnizdo[0]);
- pHnizdo->time_interval += 10;
- }
- }
- if (p_Level->LiftVParticles[i].hHnizdo[0]) {
- kom_mesh_get_float(p_Level->LiftVParticles[i].hHnizdo[1],
- &pos[0], &pos[1], &pos[2], &r);
- memcpy((void *) p_Level->LiftVParticles[i].pivot[0], (void *) pos,
- 3 * sizeof(float));
- p_Level->LiftVParticles[i].pivot[0][0] +=
- (rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX);
- p_Level->LiftVParticles[i].pivot[0][1]--;
- p_Level->LiftVParticles[i].pivot[0][2] +=
- (rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX);
- p_Level->LiftVParticles[i].dir[0][0] = 0;
- p_Level->LiftVParticles[i].dir[0][1] =
- ((-randf() / (float) (RAND_MAX)) / 7.0f) * _3DKOREKCE;
- if (p_Level->LiftVParticles[i].dir[0][1] > (-0.1f) * _3DKOREKCE)
- p_Level->LiftVParticles[i].dir[0][1] = (-0.1f) * _3DKOREKCE;
- p_Level->LiftVParticles[i].dir[0][2] = 0;
- f = (randf() / (float) (RAND_MAX)) / 8.0f;
- par_vloz_hnizdo_scale(p_Level->LiftVParticles[i].hHnizdo[0], f, f, 0,
- 0);
- }
- }
- }
- }
- void am_Do_Lifts(LEVELINFO * p_Level)
- {
- int i, r;
- float f, pos[3];
- DWORD dwTime, dwEplased;
- dwTime = timeGetTime();
- for (i = 0; i < 10; i++) {
- if (p_Level->LiftParticles[i].System != -1) {
- dwEplased = dwTime - p_Level->LiftParticles[i].dwStart;
- if (dwEplased > p_Level->LiftParticles[i].dwStop) {
- if (!par_get_hnizda(p_Level->LiftParticles[i].System)) {
- par_zrus(p_Level->LiftParticles[i].System);
- p_Level->LiftParticles[i].System = -1;
- }
- else
- par_vloz_hnizdo_pivot(p_Level->LiftParticles[i].hHnizdo[0], NULL);
- }
- else {
- if (!p_Level->bGameResume)
- p_Level->LiftParticles[i].dwTime += ber.TimeLastFrame;
- if (p_Level->LiftParticles[i].dwTime > 100) {
- p_Level->LiftParticles[i].dwTime = 0;
- r = rand() % 100;
- if (r < 50 && p_Level->LiftParticles[i].hHnizdo[0]) {
- //nacteni pozice vytahu
- kom_mesh_get_float(p_Level->LiftParticles[i].hHnizdo[1],
- &pos[0], &pos[1], &pos[2], &r);
- memcpy((void *) p_Level->LiftParticles[i].pivot[0], (void *) pos,
- 3 * sizeof(float));
- p_Level->LiftParticles[i].pivot[0][0] +=
- (rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX);
- p_Level->LiftParticles[i].pivot[0][1]--;
- p_Level->LiftParticles[i].pivot[0][2] +=
- (rand() & 0x1 ? randf() : -randf()) / (float) (RAND_MAX);
- p_Level->LiftParticles[i].dir[0][0] = 0;
- p_Level->LiftParticles[i].dir[0][1] =
- ((-randf() / (float) (RAND_MAX)) / 10.0f) * _3DKOREKCE;
- if (p_Level->LiftParticles[i].dir[0][1] > (-0.03f) * _3DKOREKCE)
- p_Level->LiftParticles[i].dir[0][1] = (-0.03f) * _3DKOREKCE;
- p_Level->LiftParticles[i].dir[0][2] = 0;
- f = (randf() / (float) (RAND_MAX)) / 25.0f;
- par_vloz_hnizdo_scale(p_Level->LiftParticles[i].hHnizdo[0], f, f,
- 0, 0);
- par_vloz_hnizdo_pust_castici(p_Level->LiftParticles[i].
- hHnizdo[0]);
- }
- }
- }
- }
- am_Do_LiftVParticies(i, p_Level);
- }
- }
- void am_Do_Water_KolaB(LEVELINFO * p_Level)
- {
- int i, rot;
- float a, pos[3];
- DWORD dwTime, dwEplased;
- PARMETAC_HNIZDO *pHnizdo;
- WATER_BOUNDARY Boundary;
- dwTime = timeGetTime();
- for (i = 0; i < 100; i++)
- if (p_Level->VodniKolaB[i].System != -1) {
- dwEplased = dwTime - p_Level->VodniKolaB[i].dwStart - ber.TimeLastFrame;
- if (p_Level->VodniKolaB[i].dwExpire) {
- if (!p_Level->bGameResume)
- p_Level->VodniKolaB[i].dwExpireTime += ber.TimeLastFrame;
- if (p_Level->VodniKolaB[i].dwExpireTime >=
- p_Level->VodniKolaB[i].dwExpire
- && p_Level->VodniKolaB[i].hHnizdo[2] != -1)
- p_Level->VodniKolaB[i].hHnizdo[2] = -1;
- }
- if (p_Level->VodniKolaB[i].hHnizdo[2] != -1) {
- kom_mesh_get_float(p_Level->VodniKolaB[i].hHnizdo[2],
- &pos[0], &pos[1], &pos[2], &rot);
- if (!p_Level->VodniKolaB[i].dwExpire)
- w_Choose_Best_Boundary(&Boundary, pos[0], pos[2], pos[1] - 1,
- WATER_BOUNDARY_METHOD_SIZE_HEURISTICS);
- else
- w_Choose_Best_Boundary(&Boundary, pos[0], pos[2],
- p_Level->VodniKolaB[i].pivot[0][1] - 0.67f,
- WATER_BOUNDARY_METHOD_SIZE_HEURISTICS);
- par_vloz_hnizdo_clip(p_Level->VodniKolaB[i].hHnizdo[0],
- Boundary.Left, Boundary.Bottom, Boundary.Right, Boundary.Top);
- pos[1] -= 0.33f;
- p_Level->VodniKolaB[i].pivot[0][0] = pos[0];
- if (!p_Level->VodniKolaB[i].dwExpire)
- p_Level->VodniKolaB[i].pivot[0][1] = pos[1];
- p_Level->VodniKolaB[i].pivot[0][2] = pos[2];
- }
- if (dwEplased > p_Level->VodniKolaB[i].dwStop) {
- if (!par_get_hnizda(p_Level->VodniKolaB[i].System)) {
- par_zrus(p_Level->VodniKolaB[i].System);
- p_Level->VodniKolaB[i].System = -1;
- }
- else {
- pHnizdo = par_cti_hnizdo(p_Level->VodniKolaB[i].hHnizdo[0]);
- if (pHnizdo) {
- if (!p_Level->bGameResume)
- p_Level->VodniKolaB[i].dwTime += ber.TimeLastFrame;
- if (p_Level->VodniKolaB[i].dwTime > 250) {
- p_Level->VodniKolaB[i].dwTime = 0;
- if (pHnizdo->a > 0) {
- a = pHnizdo->a - 0.05f;
- if (a <= 0)
- a = 0;
- par_vloz_hnizdo_diff(p_Level->VodniKolaB[i].hHnizdo[0],
- pHnizdo->r, pHnizdo->g, pHnizdo->b, a,
- pHnizdo->dr, pHnizdo->dg, pHnizdo->db,
- pHnizdo->da, pHnizdo->ka);
- }
- else if (p_Level->VodniKolaB[i].hHnizdo[0])
- par_vloz_hnizdo_pivot(p_Level->VodniKolaB[i].hHnizdo[0],
- NULL);
- }
- }
- }
- }
- }
- }
- void am_Do_Water(LEVELINFO * p_Level)
- {
- int i;
- float a;
- DWORD dwTime, dwEplased;
- PARMETAC_HNIZDO *pHnizdo;
- dwTime = timeGetTime();
- for (i = 0; i < 10; i++)
- if (p_Level->VodniKola[i].System != -1) {
- dwEplased = dwTime - p_Level->VodniKola[i].dwStart - ber.TimeLastFrame;
- if (dwEplased > p_Level->VodniKola[i].dwStop) {
- /* if(!p_Level->VodniKola[i].hHnizdo[1] && p_Level->VodniKola[i].dwStop > 0)
- {
- am_Do_Vodni_Cakanec2(p_Level->VodniKola[i].pivot[1],
- p_Level->VodniKola[i].hHnizdo[2],
- p_Level->VodniKola[i].hHnizdo[3],
- p_Level);
- p_Level->VodniKola[i].hHnizdo[1] = 1;
- }*/
- if (!par_get_hnizda(p_Level->VodniKola[i].System)) {
- par_zrus(p_Level->VodniKola[i].System);
- p_Level->VodniKola[i].System = -1;
- }
- else {
- pHnizdo = par_cti_hnizdo(p_Level->VodniKola[i].hHnizdo[0]);
- if (pHnizdo) {
- if (!p_Level->bGameResume)
- p_Level->VodniKola[i].dwTime += ber.TimeLastFrame;
- if (p_Level->VodniKola[i].dwTime > 250) {
- p_Level->VodniKola[i].dwTime = 0;
- if (pHnizdo->a > 0) {
- a = pHnizdo->a - 0.05f;
- if (a <= 0)
- a = 0;
- /* if(p_Level->VodniKola[i].dwStop > 0)
- par_vloz_hnizdo_scale(p_Level->VodniKola[i].hHnizdo[0], 0.01f, 0.01f,
- pHnizdo->utlum_x, pHnizdo->utlum_y);*/
- par_vloz_hnizdo_diff(p_Level->VodniKola[i].hHnizdo[0],
- pHnizdo->r, pHnizdo->g, pHnizdo->b, a,
- pHnizdo->dr, pHnizdo->dg, pHnizdo->db,
- pHnizdo->da, pHnizdo->ka);
- }
- else if (p_Level->VodniKola[i].hHnizdo[0])
- par_vloz_hnizdo_pivot(p_Level->VodniKola[i].hHnizdo[0], NULL);
- }
- }
- }
- }
- }
- }
- int am_Get_Free_VodniKola(LEVELINFO * p_Level)
- {
- int i;
- for (i = 0; i < 10; i++)
- if (p_Level->VodniKola[i].System == -1)
- return i;
- return -1;
- }
- int am_Kola_na_Vode(float *pos, int VyskaSloupce, int VyskaPadu, int predmet,
- LEVELINFO * p_Level)
- {
- int k, m;
- PAR_KOUR_STOPA *pKourovaS;
- PARMETAC_HNIZDO *pHnizdo;
- SYSTEMKOUROVYCHCASTIC *pSystem;
- WATER_BOUNDARY Boundary;
- int size = ftoi(100 / p_Level->KvalitaCastic);
- k = am_Get_Free_VodniKola(p_Level);
- if (k == -1)
- return -1;
- pSystem = &p_Level->VodniKola[k];
- pKourovaS = (PAR_KOUR_STOPA *) malloc(size * sizeof(PAR_KOUR_STOPA));
- if (!pKourovaS)
- return -1;
- pSystem->pCastice = pKourovaS;
- pSystem->Sizeof = size;
- pSystem->dwStart = timeGetTime();
- m = kom_najdi_material("cvkolo1");
- if (m == -1)
- kprintf(1, "Nelze najit material cvkolo1");
- pKourovaS[0].rychlost_x = pKourovaS[0].rychlost_y = 1.5f;
- pKourovaS[0].utlum_x = 2.75f + ((VyskaPadu - 1) * 0.25f);
- pKourovaS[0].utlum_y = 2.75f + ((VyskaPadu - 1) * 0.25f);
- pKourovaS[0].r = pKourovaS[0].g = pKourovaS[0].b = 1.0f;
- pKourovaS[0].a = 0.6f;
- pKourovaS[0].dr = pKourovaS[0].dg = pKourovaS[0].db = pKourovaS[0].da =
- -0.15f;
- pKourovaS[0].ka = 0;
- pSystem->System = par_vyrob();
- par_set_param(pSystem->System, m, TPAR_NO_FOG | TPAR_3D | TPAR_SCALE_ADD |
- TPAR_VETSI | TPAR_AUTOREMOVE | TPAR_2DCLIP, (BOD *) pos, NULL);
- par_vloz_kour_stopu(pSystem->System, pKourovaS, pSystem->Sizeof);
- pSystem->hHnizdo[0] = par_vloz_hnizdo(pSystem->System);
- par_vloz_hnizdo_komplet(pSystem->hHnizdo[0], 550, (BOD *) pSystem->pivot[0],
- pKourovaS);
- par_vloz_hnizdo_timer(pSystem->hHnizdo[0], 550, -550);
- memcpy((void *) pSystem->pivot[0], (void *) pos, 3 * sizeof(float));
- pSystem->pivot[0][1] += 0.7f;
- if (pSystem->hHnizdo[0])
- pHnizdo = par_cti_hnizdo(pSystem->hHnizdo[0]);
- pSystem->nx[0][0] = 1;
- pSystem->nx[0][1] = 0;
- pSystem->nx[0][2] = 0;
- pSystem->ny[0][0] = 0;
- pSystem->ny[0][1] = 0;
- pSystem->ny[0][2] = 1;
- pHnizdo->p_nx = (BOD *) pSystem->nx[0];
- pHnizdo->p_ny = (BOD *) pSystem->ny[0];
- pSystem->dwStart = timeGetTime();
- pSystem->dwTime = 0;
- pSystem->dwExpire = 0;
- pSystem->dwExpireTime = 0;
- pSystem->dwStop = VyskaSloupce * 10;
- memcpy((void *) pSystem->pivot[1], (void *) pos, 3 * sizeof(float));
- // pSystem->hHnizdo[1] = 0;
- pSystem->hHnizdo[2] = VyskaPadu;
- pSystem->hHnizdo[3] = predmet;
- w_Choose_Best_Boundary(&Boundary, pos[0], pos[2], pos[1],
- WATER_BOUNDARY_METHOD_SIZE_HEURISTICS);
- par_vloz_hnizdo_clip(pSystem->hHnizdo[0], Boundary.Left, Boundary.Bottom,
- Boundary.Right, Boundary.Top);
- par_pripoj_funkci(pSystem->System, anmend_ZrusCastice3, 0, 0,
- (void *) pKourovaS);
- par_go(pSystem->System, &pSystem->flag, 0, 0);
- return k;
- }
- void am_Do_Vodni_Cakanec1(float *pos, int vyska, int Predmet,
- LEVELINFO * p_Level)
- {
- int i, r;
- PAR_STREPINA *pCastice;
- int pocercastic;
- int ph;
- int material;
- float v;
- float fpos[3];
- memcpy((void *) fpos, (void *) pos, 3 * sizeof(float));
- fpos[1] += 0.7f;
- for (i = 0; i < 10; i++) {
- r = rand() % 10;
- if (p_Level->VodniCakanec1[r].flag == -1)
- break;
- }
- if (i == 10)
- return;
- p_Level->VodniCakanec1[r].dwStart = timeGetTime();
- if (Predmet)
- pocercastic = p_Level->VodniCakanec1[r].Sizeof / 2;
- else
- pocercastic = p_Level->VodniCakanec1[r].Sizeof;
- pCastice = (PAR_STREPINA *) malloc(pocercastic * sizeof(PAR_STREPINA));
- if (!pCastice)
- return;
- memcpy((void *) pCastice, (void *) p_Level->VodniCakanec1[r].pCastice,
- pocercastic * sizeof(PAR_STREPINA));
- //pregeneruj parametry podle vysky padu
- for (i = 0; i < pocercastic; i++) {
- v =
- (pCastice[i].vel1 + pCastice[i].vel2 + pCastice[i].vel3 +
- pCastice[i].vel4) / 2.0f;
- if (Predmet) {
- pCastice[i].rychlost =
- (((randf() / (float) (RAND_MAX)) * v) * (8.0f +
- (vyska * 0.25f))) * _3DKOREKCE;
- if (pCastice[i].rychlost < 0.1f * _3DKOREKCE)
- pCastice[i].rychlost = 0.1f * _3DKOREKCE;
- pCastice[i].p.z =
- ((rand() & 0x1 ? randf() : -randf()) / (float) RAND_MAX) / 5.0f;
- pCastice[i].p.x =
- ((rand() & 0x1 ? randf() : -randf()) / (float) RAND_MAX) / 5.0f;
- }
- else {
- pCastice[i].rychlost =
- (((randf() / (float) (RAND_MAX)) * v) * (8.0f +
- (vyska * 0.5f))) * _3DKOREKCE;
- if (pCastice[i].rychlost < 0.1f * _3DKOREKCE)
- pCastice[i].rychlost = 0.1f * _3DKOREKCE;
- }
- }
- ph = par_vyrob();
- material = kom_najdi_material("ckapka2");
- if (material == -1)
- kprintf(1, "Nelze najit material ckapka2");
- par_set_param(ph, material, TPAR_YPLANE_LOW | TPAR_HTEST | TPAR_AUTOREMOVE,
- (BOD *) fpos, NULL);
- par_set_y_plane(ph, fpos[1] - 0.1f);
- par_vloz_strepy(ph, pCastice, pocercastic);
- par_pripoj_funkci(ph, anmend_ZrusCastice3, 0, 0, (void *) pCastice);
- par_go(ph, &p_Level->VodniCakanec1[r].flag, 0, 0);
- }
- void am_Do_Vodni_Cakanec2(float *pos, int VyskaPadu, int predmet,
- LEVELINFO * p_Level)
- {
- int i, r;
- PAR_STREPINA *pCastice;
- int pocercastic;
- int ph;
- int material;
- float v;
- float fpos[3];
- memcpy((void *) fpos, (void *) pos, 3 * sizeof(float));
- fpos[1] += 0.7f;
- for (i = 0; i < 10; i++) {
- r = rand() % 10;
- if (p_Level->VodniCakanec2[r].flag == -1)
- break;
- }
- if (i == 10) {
- for (i = 0; i < 10; i++) {
- if (p_Level->VodniCakanec2[i].flag == -1)
- break;
- }
- if (i == 10)
- return;
- r = i;
- }
- if (predmet)
- pocercastic = p_Level->VodniCakanec1[r].Sizeof / 2;
- else
- pocercastic = p_Level->VodniCakanec1[r].Sizeof;
- p_Level->VodniCakanec2[r].dwStart = timeGetTime();
- pCastice = (PAR_STREPINA *) malloc(pocercastic * sizeof(PAR_STREPINA));
- if (!pCastice)
- return;
- memcpy((void *) pCastice, (void *) p_Level->VodniCakanec2[r].pCastice,
- pocercastic * sizeof(PAR_STREPINA));
- //pregeneruj parametry podle vysky padu
- for (i = 0; i < pocercastic; i++) {
- v =
- (pCastice[i].vel1 + pCastice[i].vel2 + pCastice[i].vel3 +
- pCastice[i].vel4) / 2.0f;
- if (!predmet)
- pCastice[i].rychlost =
- (((randf() / (float) (RAND_MAX)) * v) * (8.0f +
- VyskaPadu)) * _3DKOREKCE;
- else
- pCastice[i].rychlost =
- (((randf() / (float) (RAND_MAX)) * v) * (8.0f +
- (VyskaPadu / 2.0f))) * _3DKOREKCE;
- if (pCastice[i].rychlost < 0.1f * _3DKOREKCE)
- pCastice[i].rychlost = 0.1f * _3DKOREKCE;
- }
- ph = par_vyrob();
- if (!ph)
- return;
- material = kom_najdi_material("ckapka2");
- if (material == -1)
- kprintf(1, "Nelze najit material ckapka2");
- par_set_param(ph, material, TPAR_YPLANE_LOW | TPAR_HTEST | TPAR_AUTOREMOVE,
- (BOD *) fpos, NULL);
- par_set_y_plane(ph, fpos[1] - 0.1f);
- par_vloz_strepy(ph, pCastice, pocercastic);
- par_pripoj_funkci(ph, anmend_ZrusCastice3, 0, 0, (void *) pCastice);
- par_go(ph, &p_Level->VodniCakanec2[r].flag, 0, 0);
- }
- int am_Get_Free_Lift_VParticles(LEVELINFO * p_Level)
- {
- int i;
- for (i = 0; i < 10; i++)
- if (p_Level->LiftVParticles[i].System == -1)
- return i;
- return -1;
- }
- void am_Do_Lift_VParticles(float *pos, int mesh, LEVELINFO * p_Level)
- {
- int k, m;
- PAR_KOUR_STOPA *pKourovaS;
- int size = ftoi(500 / p_Level->KvalitaCastic);
- k = am_Get_Free_Lift_VParticles(p_Level);
- if (k == -1)
- return;
- pKourovaS = (PAR_KOUR_STOPA *) malloc(size * sizeof(PAR_KOUR_STOPA));
- if (!pKourovaS)
- return;
- p_Level->LiftVParticles[k].pCastice = pKourovaS;
- p_Level->LiftVParticles[k].Sizeof = size;
- p_Level->LiftVParticles[k].dwStart = timeGetTime();
- m = kom_najdi_material("ckapka1");
- if (m == -1)
- kprintf(1, "Nelze najit material ckapka1");
- pKourovaS[0].rychlost_x = pKourovaS[0].rychlost_y =
- (randf() / (float) (RAND_MAX));
- pKourovaS[0].utlum_x = 0;
- pKourovaS[0].utlum_y = 0;
- pKourovaS[0].r = pKourovaS[0].g = pKourovaS[0].b = 1.0f;
- pKourovaS[0].a = 1.0f;
- pKourovaS[0].dr = pKourovaS[0].dg = pKourovaS[0].db = pKourovaS[0].…
Large files files are truncated, but you can click here to view the full file