123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690 |
- #include "Hunt.h"
- #include "stdio.h"
- BOOL NewPhase;
- #define fx_DIE 0
- //======= new ============//
- #define PIG_WALK 0
- #define PIG_RUN 1
- #define PIG_IDLE1 2
- #define PIG_IDLE2 3
- #define PIG_IDLE3 4
- #define PIG_DIE 5
- #define PIG_SLP 6
- #define DIM_FLY 0
- #define DIM_FLYP 1
- #define DIM_FALL 2
- #define DIM_DIE 3
- #define BRO_WALK 0
- #define BRO_RUN 1
- #define BRO_IDLE1 2
- #define BRO_IDLE2 3
- #define BRO_IDLE3 4
- #define BRO_DIE 5
- #define BRO_SLP 6
- #define DIA_WALK 0
- #define DIA_RUN 1
- #define DIA_SWIM 1
- #define DIA_IDLE1 2
- #define DIA_IDLE2 3
- #define DIA_JUMP 4
- #define DIA_SLIDE 5
- #define DIA_EAT 6
- #define DIA_DIE 7
- #define DIA_SLP 8
- #define DER_WALK 0
- #define DER_RUN 1
- #define DER_IDLE1 2
- #define DER_IDLE2 3
- #define DER_DIE 4
- #define DER_SLP 5
- #define MAM_WALK 0
- #define MAM_RUN 1
- #define MAM_IDLE1 2
- #define MAM_IDLE2 3
- #define MAM_DIE 4
- #define MAM_SLP 5
- //
- int CurDino;
- void SetNewTargetPlace(TCharacter *cptr, float R);
- void ProcessPrevPhase(TCharacter *cptr)
- {
- cptr->PPMorphTime+=TimeDt;
- if (cptr->PPMorphTime > PMORPHTIME) cptr->PrevPhase = cptr->Phase;
- cptr->PrevPFTime+=TimeDt;
- cptr->PrevPFTime %= cptr->pinfo->Animation[cptr->PrevPhase].AniTime;
- }
- void ActivateCharacterFx(TCharacter *cptr)
- {
- if (cptr->AI) //== not hunter ==//
- if (UNDERWATER) return;
- int fx = cptr->pinfo->Anifx[cptr->Phase];
- if (fx==-1) return;
- if ( VectorLength(SubVectors(PlayerPos, cptr->pos) ) > 68 * 256) return;
- AddVoice3d(cptr->pinfo->SoundFX[fx].length,
- cptr->pinfo->SoundFX[fx].lpData,
- cptr->pos.x,cptr->pos.y,cptr->pos.z);
- }
- void ResetCharacter(TCharacter *cptr)
- {
- cptr->AI = DinoInfo[cptr->CType].AI;
- cptr->pinfo = &ChInfo[cptr->CType];
- cptr->State = 0;
- cptr->StateF = 0;
- cptr->Phase = 0;
- cptr->FTime = 0;
- cptr->PrevPhase = 0;
- cptr->PrevPFTime = 0;
- cptr->PPMorphTime = 0;
- cptr->beta = 0;
- cptr->gamma = 0;
- cptr->tggamma = 0;
- cptr->bend = 0;
- cptr->rspeed = 0;
- cptr->AfraidTime = 0;
- cptr->BloodTTime = 0;
- cptr->BloodTime = 0;
- cptr->lookx = (float)f_cos(cptr->alpha);
- cptr->lookz = (float)f_sin(cptr->alpha);
-
- cptr->Health = DinoInfo[cptr->CType].Health0;
- if (OptAgres>128) cptr->Health= (cptr->Health*OptAgres)/128;
- cptr->scale = (float)(DinoInfo[cptr->CType].Scale0 + rRand(DinoInfo[cptr->CType].ScaleA)) / 1000.f;
- }
- void AddDeadBody(TCharacter *cptr, int phase)
- {
- if (!MyHealth) return;
- if (ExitTime)
- AddMessage("Transportation cancelled.");
- ExitTime = 0;
- OPTICMODE = FALSE;
- BINMODE = FALSE;
- Characters[ChCount].CType = 0;
- Characters[ChCount].alpha = CameraAlpha;
- ResetCharacter(&Characters[ChCount]);
- int v = rRand(3);
- if (phase != HUNT_BREATH)
- AddVoicev(fxScream[r].length, fxScream[r].lpData, 256);
- Characters[ChCount].Health = 0;
- MyHealth = 0;
- if (cptr) {
- float pl = 170;
- //if (cptr->AI==AI_SPINO) pl = 200.f;
- //if (cptr->AI==AI_CERAT) pl = 320.f;
- Characters[ChCount].pos.x = cptr->pos.x + cptr->lookx * pl * cptr->scale;
- Characters[ChCount].pos.z = cptr->pos.z + cptr->lookz * pl * cptr->scale;
- Characters[ChCount].pos.y = GetLandQH(Characters[ChCount].pos.x, Characters[ChCount].pos.z);
- } else {
- Characters[ChCount].pos.x = PlayerX;
- Characters[ChCount].pos.z = PlayerZ;
- Characters[ChCount].pos.y = PlayerY;
- }
-
- Characters[ChCount].Phase = phase;
- Characters[ChCount].PrevPhase = phase;
- ActivateCharacterFx(&Characters[ChCount]);
-
- DemoPoint.pos = Characters[ChCount].pos;
- DemoPoint.DemoTime = 1;
- DemoPoint.CIndex = ChCount;
- ChCount++;
- }
- float AngleDifference(float a, float b)
- {
- a-=b;
- a = (float)fabs(a);
- if (a > pi) a = 2*pi - a;
- return a;
- }
- float CorrectedAlpha(float a, float b)
- {
- float d = (float)fabs(a-b);
- if (d<pi) return (a+b)/2;
- else d = (a+pi*2-b);
- if (d<0) d+=2*pi;
- if (d>2*pi) d-=2*pi;
- return d;
- }
- void ThinkY_Beta_Gamma(TCharacter *cptr, float blook, float glook, float blim, float glim)
- {
- cptr->pos.y = GetLandH(cptr->pos.x, cptr->pos.z);
- //=== beta ===//
- float hlook = GetLandH(cptr->pos.x + cptr->lookx * blook, cptr->pos.z + cptr->lookz * blook);
- float hlook2 = GetLandH(cptr->pos.x - cptr->lookx * blook, cptr->pos.z - cptr->lookz * blook);
- DeltaFunc(cptr->beta, (hlook2 - hlook) / (blook * 3.2f), TimeDt / 800.f);
- if (cptr->beta > blim) cptr->beta = blim;
- if (cptr->beta <-blim) cptr->beta =-blim;
- //=== gamma ===//
- hlook = GetLandH(cptr->pos.x + cptr->lookz * glook, cptr->pos.z - cptr->lookx*glook);
- hlook2 = GetLandH(cptr->pos.x - cptr->lookz * glook, cptr->pos.z + cptr->lookx*glook);
- cptr->tggamma =(hlook - hlook2) / (glook * 3.2f);
- if (cptr->tggamma > glim) cptr->tggamma = glim;
- if (cptr->tggamma <-glim) cptr->tggamma =-glim;
- /*
- if (DEBUG) cptr->tggamma = 0;
- if (DEBUG) cptr->beta = 0;
- */
- }
- int CheckPlaceCollisionP(Vector3d &v)
- {
- int ccx = (int)v.x / 256;
- int ccz = (int)v.z / 256;
- if (ccx<4 || ccz<4 || ccx>1008 || ccz>1008) return 1;
- int F = (FMap[ccz][ccx-1] | FMap[ccz-1][ccx] | FMap[ccz-1][ccx-1] |
- FMap[ccz][ccx] |
- FMap[ccz+1][ccx] | FMap[ccz][ccx+1] | FMap[ccz+1][ccx+1]);
- if (F & (fmWater + fmNOWAY)) return 1;
- float h = GetLandH(v.x, v.z);
- v.y = h;
- float hh = GetLandH(v.x-164, v.z-164); if ( fabs(hh-h) > 160 ) return 1;
- hh = GetLandH(v.x+164, v.z-164); if ( fabs(hh-h) > 160 ) return 1;
- hh = GetLandH(v.x-164, v.z+164); if ( fabs(hh-h) > 160 ) return 1;
- hh = GetLandH(v.x+164, v.z+164); if ( fabs(hh-h) > 160 ) return 1;
-
- for (int z=-2; z<=2; z++)
- for (int x=-2; x<=2; x++)
- if (OMap[ccz+z][ccx+x]!=255) {
- int ob = OMap[ccz+z][ccx+x];
- if (MObjects[ob].info.Radius<10) continue;
- float CR = (float)MObjects[ob].info.Radius + 64;
-
- float oz = (ccz+z) * 256.f + 128.f;
- float ox = (ccx+x) * 256.f + 128.f;
-
- float r = (float) sqrt( (ox-v.x)*(ox-v.x) + (oz-v.z)*(oz-v.z) );
- if (r<CR) return 1;
- }
- return 0;
- }
- int CheckPlaceCollision(Vector3d &v, BOOL wc, BOOL mc)
- {
- int ccx = (int)v.x / 256;
- int ccz = (int)v.z / 256;
- if (ccx<4 || ccz<4 || ccx>1018 || ccz>1018) return 1;
- if (wc)
- if ( (FMap[ccz][ccx-1] | FMap[ccz-1][ccx] | FMap[ccz-1][ccx-1] |
- FMap[ccz][ccx] |
- FMap[ccz+1][ccx] | FMap[ccz][ccx+1] | FMap[ccz+1][ccx+1]) & fmWater)
- return 1;
- float h = GetLandH(v.x, v.z);
- if (! (FMap[ccz][ccx] & fmWater) )
- if (fabs(h - v.y) > 64) return 1;
-
- v.y = h;
- float hh = GetLandH(v.x-64, v.z-64); if ( fabs(hh-h) > 100 ) return 1;
- hh = GetLandH(v.x+64, v.z-64); if ( fabs(hh-h) > 100 ) return 1;
- hh = GetLandH(v.x-64, v.z+64); if ( fabs(hh-h) > 100 ) return 1;
- hh = GetLandH(v.x+64, v.z+64); if ( fabs(hh-h) > 100 ) return 1;
- if (mc)
- for (int z=-2; z<=2; z++)
- for (int x=-2; x<=2; x++)
- if (OMap[ccz+z][ccx+x]!=255) {
- int ob = OMap[ccz+z][ccx+x];
- if (MObjects[ob].info.Radius<10) continue;
- float CR = (float)MObjects[ob].info.Radius + 64;
-
- float oz = (ccz+z) * 256.f + 128.f;
- float ox = (ccx+x) * 256.f + 128.f;
-
- float r = (float) sqrt( (ox-v.x)*(ox-v.x) + (oz-v.z)*(oz-v.z) );
- if (r<CR) return 1;
- }
- return 0;
- }
- int CheckPlaceCollision2(Vector3d &v, BOOL wc)
- {
- int ccx = (int)v.x / 256;
- int ccz = (int)v.z / 256;
- if (ccx<4 || ccz<4 || ccx>1018 || ccz>1018) return 1;
- if (wc)
- if ( (FMap[ccz][ccx-1] | FMap[ccz-1][ccx] | FMap[ccz-1][ccx-1] |
- FMap[ccz][ccx] |
- FMap[ccz+1][ccx] | FMap[ccz][ccx+1] | FMap[ccz+1][ccx+1]) & fmWater)
- return 1;
- float h = GetLandH(v.x, v.z);
- /*if (! (FMap[ccz][ccx] & fmWater) )
- if (fabs(h - v.y) > 64) return 1;*/
- v.y = h;
- float hh = GetLandH(v.x-64, v.z-64); if ( fabs(hh-h) > 100 ) return 1;
- hh = GetLandH(v.x+64, v.z-64); if ( fabs(hh-h) > 100 ) return 1;
- hh = GetLandH(v.x-64, v.z+64); if ( fabs(hh-h) > 100 ) return 1;
- hh = GetLandH(v.x+64, v.z+64); if ( fabs(hh-h) > 100 ) return 1;
- return 0;
- }
- int CheckPossiblePath(TCharacter *cptr, BOOL wc, BOOL mc)
- {
- Vector3d p = cptr->pos;
- float lookx = (float)f_cos(cptr->tgalpha);
- float lookz = (float)f_sin(cptr->tgalpha);
- int c=0;
- for (int t=0; t<20; t++) {
- p.x+=lookx * 64.f;
- p.z+=lookz * 64.f;
- if (CheckPlaceCollision(p, wc, mc)) c++;
- }
- return c;
- }
- void LookForAWay(TCharacter *cptr, BOOL wc, BOOL mc)
- {
- float alpha = cptr->tgalpha;
- float dalpha = 15.f;
- float afound = alpha;
- int maxp = 16;
- int curp;
- if (!CheckPossiblePath(cptr, wc, mc)) { cptr->NoWayCnt=0; return; }
-
- cptr->NoWayCnt++;
- for (int i=0; i<12; i++) {
- cptr->tgalpha = alpha+dalpha*pi/180.f;
- curp=CheckPossiblePath(cptr, wc, mc) + (i>>1);
- if (!curp) return;
- if (curp<maxp) {
- maxp = curp;
- afound = cptr->tgalpha;
- }
- cptr->tgalpha = alpha-dalpha*pi/180.f;
- curp=CheckPossiblePath(cptr, wc, mc) + (i>>1);
- if (!curp) return;
- if (curp<maxp) {
- maxp = curp;
- afound = cptr->tgalpha;
- }
- dalpha+=15.f;
- }
-
- cptr->tgalpha = afound;
- }
- BOOL ReplaceCharacterForward(TCharacter *cptr)
- {
- float al = CameraAlpha + (float)siRand(2048) / 2048.f;
- float sa = (float)f_sin(al);
- float ca = (float)f_cos(al);
- Vector3d p;
- p.x = PlayerX + sa * (ctViewR+rRand(10))*256;
- p.z = PlayerZ - ca * (ctViewR+rRand(10))*256;
- p.y = GetLandH(p.x, p.z);
- if (p.x < 16*256) return FALSE;
- if (p.z < 16*256) return FALSE;
- if (p.x >1000*256) return FALSE;
- if (p.z >1000*256) return FALSE;
-
- if (CheckPlaceCollisionP(p)) return FALSE;
- cptr->State = 0;
- cptr->pos = p;
- //cptr->tgx = cptr->pos.x + siRand(2048);
- //cptr->tgz = cptr->pos.z + siRand(2048);
- SetNewTargetPlace(cptr, 2048);
- if (cptr->AI==AI_ARCHEO) //===== dimor ========//
- cptr->pos.y+=1048.f;
- return TRUE;
- }
- void Characters_AddSecondaryOne(int ctype)
- {
- if (ChCount>64) return;
- Characters[ChCount].CType = ctype;
- int tr = 0;
- replace1:
- tr++;
- if (tr>128) return;
- Characters[ChCount].pos.x = PlayerX + siRand(20040);
- Characters[ChCount].pos.z = PlayerZ + siRand(20040);
- Characters[ChCount].pos.y = GetLandH(Characters[ChCount].pos.x,
- Characters[ChCount].pos.z);
- if (CheckPlaceCollisionP(Characters[ChCount].pos)) goto replace1;
- if ( fabs(Characters[ChCount].pos.x - PlayerX) +
- fabs(Characters[ChCount].pos.z - PlayerZ) < 256 * 40 )
- goto replace1;
- Characters[ChCount].tgx = Characters[ChCount].pos.x;
- Characters[ChCount].tgz = Characters[ChCount].pos.z;
- Characters[ChCount].tgtime = 0;
- ResetCharacter(&Characters[ChCount]);
- ChCount++;
- }
- void MoveCharacter(TCharacter *cptr, float dx, float dz, BOOL wc, BOOL mc)
- {
- //return; //000000000000000000000000000000000000000000000
- //000000000000000000000000000000000000000000000
- //000000000000000000000000000000000000000000000//000000000000000000000000000000000000000000000//000000000000000000000000000000000000000000000
- Vector3d p = cptr->pos;
- if (CheckPlaceCollision2(p, wc)) {
- cptr->pos.x+=dx / 2;
- cptr->pos.z+=dz / 2;
- return;
- }
-
- p.x+=dx;
- p.z+=dz;
-
- if (!CheckPlaceCollision2(p, wc)) {
- cptr->pos = p;
- return;
- }
- p = cptr->pos;
- p.x+=dx/2;
- p.z+=dz/2;
- if (!CheckPlaceCollision2(p, wc)) cptr->pos = p;
- p = cptr->pos;
- p.x+=dx/4;
- //if (!CheckPlaceCollision2(p)) cptr->pos = p;
- p.z+=dz/4;
- //if (!CheckPlaceCollision2(p)) cptr->pos = p;
- cptr->pos = p;
- }
- void MoveCharacter2(TCharacter *cptr, float dx, float dz)
- {
- cptr->pos.x+=dx;
- cptr->pos.z+=dz;
- }
- void SetNewTargetPlace(TCharacter *cptr, float R)
- {
- Vector3d p;
- int tr = 0;
- replace:
- p.x = cptr->pos.x + siRand((int)R); if (p.x<512) p.x = 512; if (p.x>1018*256) p.x = 1018*256;
- p.z = cptr->pos.z + siRand((int)R); if (p.z<512) p.z = 512; if (p.z>1018*256) p.z = 1018*256;
- p.y = GetLandH(p.x, p.z);
- tr++;
- if (tr<128)
- if ( fabs(p.x - cptr->pos.x) + fabs(p.z - cptr->pos.z) < R / 2.f) goto replace;
-
- R+=512;
- if (tr<256)
- if (CheckPlaceCollisionP(p)) goto replace;
- cptr->tgtime = 0;
- cptr->tgx = p.x;
- cptr->tgz = p.z;
- }
- void SetNewTargetPlace_Brahi(TCharacter *cptr, float R)
- {
- Vector3d p;
- int tr = 0;
- replace:
- p.x = cptr->pos.x + siRand((int)R); if (p.x<512) p.x = 512; if (p.x>1018*256) p.x = 1018*256;
- p.z = cptr->pos.z + siRand((int)R); if (p.z<512) p.z = 512; if (p.z>1018*256) p.z = 1018*256;
- tr++;
- if (tr<16)
- if ( fabs(p.x - cptr->pos.x) + fabs(p.z - cptr->pos.z) < R / 2.f) goto replace;
- p.y = GetLandH(p.x, p.z);
- float wy = GetLandUpH(p.x, p.z) - p.y;
- if (tr<128) {
- if (wy > 400) goto replace;
- if (wy < 200) goto replace;
- }
- cptr->tgtime = 0;
- cptr->tgx = p.x;
- cptr->tgz = p.z;
- }
- void AnimateHuntDead(TCharacter *cptr)
- {
-
- //if (!cptr->FTime) ActivateCharacterFx(cptr);
-
- ProcessPrevPhase(cptr);
- BOOL NewPhase = FALSE;
-
- cptr->FTime+=TimeDt;
- if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime) {
- NewPhase = TRUE;
- if (cptr->Phase==2)
- cptr->FTime = cptr->pinfo->Animation[cptr->Phase].AniTime-1;
- else
- cptr->FTime = 0;
- if (cptr->Phase==1) {
- cptr->FTime=0;
- cptr->Phase=2;
- }
- ActivateCharacterFx(cptr);
- }
-
- float h = GetLandH(cptr->pos.x, cptr->pos.z);
- DeltaFunc(cptr->pos.y, h, TimeDt / 5.f);
- if (cptr->Phase==2)
- if (cptr->pos.y > h+3) {
- cptr->FTime = 0;
- //MessageBeep(0xFFFFFFFF);
- }
-
- if (cptr->pos.y < h + 256) {
- //=== beta ===//
- float blook = 256;
- float hlook = GetLandH(cptr->pos.x + cptr->lookx * blook, cptr->pos.z + cptr->lookz * blook);
- float hlook2 = GetLandH(cptr->pos.x - cptr->lookx * blook, cptr->pos.z - cptr->lookz * blook);
- DeltaFunc(cptr->beta, (hlook2 - hlook) / (blook * 3.2f), TimeDt / 1800.f);
- if (cptr->beta > 0.4f) cptr->beta = 0.4f;
- if (cptr->beta <-0.4f) cptr->beta =-0.4f;
- //=== gamma ===//
- float glook = 256;
- hlook = GetLandH(cptr->pos.x + cptr->lookz * glook, cptr->pos.z - cptr->lookx*glook);
- hlook2 = GetLandH(cptr->pos.x - cptr->lookz * glook, cptr->pos.z + cptr->lookx*glook);
- cptr->tggamma =(hlook - hlook2) / (glook * 3.2f);
- if (cptr->tggamma > 0.4f) cptr->tggamma = 0.4f;
- if (cptr->tggamma <-0.4f) cptr->tggamma =-0.4f;
- DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 1800.f);
- }
-
- TCharacter *cptr2 = &Characters[DemoPoint.CIndex];
- }
- void AnimateDiatrDead(TCharacter *cptr)
- {
- if (cptr->Phase!=DIA_DIE && cptr->Phase!=DIA_SLP) {
- if (cptr->PPMorphTime>128) {
- cptr->PrevPhase = cptr->Phase;
- cptr->PrevPFTime = cptr->FTime;
- cptr->PPMorphTime = 0; }
- cptr->FTime = 0;
- cptr->Phase = DIA_DIE;
- ActivateCharacterFx(cptr);
- } else {
- ProcessPrevPhase(cptr);
- cptr->FTime+=TimeDt;
- if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime)
- if (Tranq) {
- cptr->FTime=0;
- cptr->Phase = DIA_SLP;
- ActivateCharacterFx(cptr);
- } else
- cptr->FTime = cptr->pinfo->Animation[cptr->Phase].AniTime-1;
- }
- //======= movement ===========//
- DeltaFunc(cptr->vspeed, 0, TimeDt / 800.f);
- cptr->pos.x+=cptr->lookx * cptr->vspeed * TimeDt;
- cptr->pos.z+=cptr->lookz * cptr->vspeed * TimeDt;
- ThinkY_Beta_Gamma(cptr, 100, 96, 0.6f, 0.5f);
- DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 1600.f);
- }
- void AnimatePigDead(TCharacter *cptr)
- {
- if (cptr->Phase!=PIG_DIE && cptr->Phase!=PIG_SLP) {
- if (cptr->PPMorphTime>128) {
- cptr->PrevPhase = cptr->Phase;
- cptr->PrevPFTime = cptr->FTime;
- cptr->PPMorphTime = 0; }
-
- cptr->FTime = 0;
- cptr->Phase = PIG_DIE;
- ActivateCharacterFx(cptr);
- } else {
- ProcessPrevPhase(cptr);
- cptr->FTime+=TimeDt;
- if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime)
- if (Tranq) {
- cptr->FTime=0;
- cptr->Phase = PIG_SLP;
- ActivateCharacterFx(cptr);
- } else
- cptr->FTime = cptr->pinfo->Animation[cptr->Phase].AniTime-1;
- }
- //======= movement ===========//
- DeltaFunc(cptr->vspeed, 0, TimeDt / 800.f);
- cptr->pos.x+=cptr->lookx * cptr->vspeed * TimeDt;
- cptr->pos.z+=cptr->lookz * cptr->vspeed * TimeDt;
- ThinkY_Beta_Gamma(cptr, 100, 96, 0.6f, 0.5f);
-
- DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 1600.f);
- }
- void AnimateDimorDead(TCharacter *cptr)
- {
- if (cptr->Phase!=DIM_FALL && cptr->Phase!=DIM_DIE) {
- if (cptr->PPMorphTime>128) {
- cptr->PrevPhase = cptr->Phase;
- cptr->PrevPFTime = cptr->FTime;
- cptr->PPMorphTime = 0; }
- cptr->FTime = 0;
- cptr->Phase = DIM_FALL;
- cptr->rspeed = 0;
- ActivateCharacterFx(cptr);
- return;
- }
-
- ProcessPrevPhase(cptr);
- cptr->FTime+=TimeDt;
- if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime)
- if (cptr->Phase == DIM_DIE)
- cptr->FTime = cptr->pinfo->Animation[cptr->Phase].AniTime-1;
- else
- cptr->FTime%= cptr->pinfo->Animation[cptr->Phase].AniTime;
-
- //======= movement ===========//
- if (cptr->Phase == DIM_DIE)
- DeltaFunc(cptr->vspeed, 0, TimeDt / 400.f);
- else
- DeltaFunc(cptr->vspeed, 0, TimeDt / 1200.f);
- cptr->pos.x+=cptr->lookx * cptr->vspeed * TimeDt;
- cptr->pos.z+=cptr->lookz * cptr->vspeed * TimeDt;
- if (cptr->Phase == DIM_FALL) {
- float wh = GetLandUpH(cptr->pos.x, cptr->pos.z);
- float lh = GetLandH (cptr->pos.x, cptr->pos.z);
- BOOL OnWater = (wh > lh);
- if (OnWater)
- if (cptr->pos.y>=wh && (cptr->pos.y+cptr->rspeed * TimeDt / 1024) <wh) {
- AddWCircle(cptr->pos.x+siRand(128), cptr->pos.z+siRand(128), 2.0);
- AddWCircle(cptr->pos.x+siRand(128), cptr->pos.z+siRand(128), 2.5);
- AddWCircle(cptr->pos.x+siRand(128), cptr->pos.z+siRand(128), 3.0);
- AddWCircle(cptr->pos.x+siRand(128), cptr->pos.z+siRand(128), 3.5);
- AddWCircle(cptr->pos.x+siRand(128), cptr->pos.z+siRand(128), 3.0);
- }
- cptr->pos.y+=cptr->rspeed * TimeDt / 1024;
- cptr->rspeed-=TimeDt*2.56f;
- if (cptr->pos.y<lh) {
- cptr->pos.y = lh;
- if (OnWater) {
- AddElements(cptr->pos.x+siRand(128), lh, cptr->pos.z+siRand(128), 4, 10);
- AddElements(cptr->pos.x+siRand(128), lh, cptr->pos.z+siRand(128), 4, 10);
- AddElements(cptr->pos.x+siRand(128), lh, cptr->pos.z+siRand(128), 4, 10);
- }
- if (cptr->PPMorphTime>128) {
- cptr->PrevPhase = cptr->Phase;
- cptr->PrevPFTime = cptr->FTime;
- cptr->PPMorphTime = 0; }
- cptr->Phase = DIM_DIE;
- cptr->FTime = 0;
- ActivateCharacterFx(cptr);
- }
- } else {
- ThinkY_Beta_Gamma(cptr, 140, 126, 0.6f, 0.5f);
- DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 1600.f);
- }
- }
- void AnimateBronDead(TCharacter *cptr)
- {
- if (cptr->Phase!=BRO_DIE && cptr->Phase!=BRO_SLP) {
- if (cptr->PPMorphTime>128) {
- cptr->PrevPhase = cptr->Phase;
- cptr->PrevPFTime = cptr->FTime;
- cptr->PPMorphTime = 0; }
- cptr->FTime = 0;
- cptr->Phase = BRO_DIE;
- ActivateCharacterFx(cptr);
- } else {
- ProcessPrevPhase(cptr);
- cptr->FTime+=TimeDt;
- if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime)
- if (Tranq) {
- cptr->FTime=0;
- cptr->Phase = BRO_SLP;
- ActivateCharacterFx(cptr);
- } else
- cptr->FTime = cptr->pinfo->Animation[cptr->Phase].AniTime-1;
- }
- //======= movement ===========//
- DeltaFunc(cptr->vspeed, 0, TimeDt / 800.f);
- cptr->pos.x+=cptr->lookx * cptr->vspeed * TimeDt;
- cptr->pos.z+=cptr->lookz * cptr->vspeed * TimeDt;
- ThinkY_Beta_Gamma(cptr, 100, 96, 0.6f, 0.5f);
-
- DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 1600.f);
- }
- void AnimateHogDead(TCharacter *cptr)
- {
- if (cptr->Phase!=BRO_DIE && cptr->Phase!=BRO_SLP) {
- if (cptr->PPMorphTime>128) {
- cptr->PrevPhase = cptr->Phase;
- cptr->PrevPFTime = cptr->FTime;
- cptr->PPMorphTime = 0; }
- cptr->FTime = 0;
- cptr->Phase = BRO_DIE;
- ActivateCharacterFx(cptr);
- } else {
- ProcessPrevPhase(cptr);
- cptr->FTime+=TimeDt;
- if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime)
- if (Tranq) {
- cptr->FTime=0;
- cptr->Phase = BRO_SLP;
- ActivateCharacterFx(cptr);
- } else
- cptr->FTime = cptr->pinfo->Animation[cptr->Phase].AniTime-1;
- }
- //======= movement ===========//
- DeltaFunc(cptr->vspeed, 0, TimeDt / 800.f);
- cptr->pos.x+=cptr->lookx * cptr->vspeed * TimeDt;
- cptr->pos.z+=cptr->lookz * cptr->vspeed * TimeDt;
- ThinkY_Beta_Gamma(cptr, 100, 96, 0.6f, 0.5f);
-
- DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 1600.f);
- }
- void AnimateRhinoDead(TCharacter *cptr)
- {
- if (cptr->Phase!=BRO_DIE && cptr->Phase!=BRO_SLP) {
- if (cptr->PPMorphTime>128) {
- cptr->PrevPhase = cptr->Phase;
- cptr->PrevPFTime = cptr->FTime;
- cptr->PPMorphTime = 0; }
- cptr->FTime = 0;
- cptr->Phase = BRO_DIE;
- ActivateCharacterFx(cptr);
- } else {
- ProcessPrevPhase(cptr);
- cptr->FTime+=TimeDt;
- if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime)
- if (Tranq) {
- cptr->FTime=0;
- cptr->Phase = BRO_SLP;
- ActivateCharacterFx(cptr);
- } else
- cptr->FTime = cptr->pinfo->Animation[cptr->Phase].AniTime-1;
- }
- //======= movement ===========//
- DeltaFunc(cptr->vspeed, 0, TimeDt / 800.f);
- cptr->pos.x+=cptr->lookx * cptr->vspeed * TimeDt;
- cptr->pos.z+=cptr->lookz * cptr->vspeed * TimeDt;
- ThinkY_Beta_Gamma(cptr, 100, 96, 0.6f, 0.5f);
-
- DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 1600.f);
- }
- void AnimateSmiloDead(TCharacter *cptr)
- {
- if (cptr->Phase!=BRO_DIE && cptr->Phase!=BRO_SLP) {
- if (cptr->PPMorphTime>128) {
- cptr->PrevPhase = cptr->Phase;
- cptr->PrevPFTime = cptr->FTime;
- cptr->PPMorphTime = 0; }
- cptr->FTime = 0;
- cptr->Phase = BRO_DIE;
- ActivateCharacterFx(cptr);
- } else {
- ProcessPrevPhase(cptr);
- cptr->FTime+=TimeDt;
- if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime)
- if (Tranq) {
- cptr->FTime=0;
- cptr->Phase = BRO_SLP;
- ActivateCharacterFx(cptr);
- } else
- cptr->FTime = cptr->pinfo->Animation[cptr->Phase].AniTime-1;
- }
- //======= movement ===========//
- DeltaFunc(cptr->vspeed, 0, TimeDt / 800.f);
- cptr->pos.x+=cptr->lookx * cptr->vspeed * TimeDt;
- cptr->pos.z+=cptr->lookz * cptr->vspeed * TimeDt;
- ThinkY_Beta_Gamma(cptr, 100, 96, 0.6f, 0.5f);
-
- DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 1600.f);
- }
- void AnimateDeerDead(TCharacter *cptr)
- {
- if (cptr->Phase!=DER_DIE && cptr->Phase!=DER_SLP) {
- if (cptr->PPMorphTime>128) {
- cptr->PrevPhase = cptr->Phase;
- cptr->PrevPFTime = cptr->FTime;
- cptr->PPMorphTime = 0; }
-
- cptr->FTime = 0;
- cptr->Phase = DER_DIE;
- ActivateCharacterFx(cptr);
- } else {
- ProcessPrevPhase(cptr);
- cptr->FTime+=TimeDt;
- if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime)
- if (Tranq) {
- cptr->FTime=0;
- cptr->Phase = DER_SLP;
- ActivateCharacterFx(cptr);
- } else
- cptr->FTime = cptr->pinfo->Animation[cptr->Phase].AniTime-1;
- }
- //======= movement ===========//
- DeltaFunc(cptr->vspeed, 0, TimeDt / 800.f);
- cptr->pos.x+=cptr->lookx * cptr->vspeed * TimeDt;
- cptr->pos.z+=cptr->lookz * cptr->vspeed * TimeDt;
- ThinkY_Beta_Gamma(cptr, 100, 96, 0.6f, 0.5f);
-
- DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 1600.f);
- }
- void AnimateDiatr(TCharacter *cptr)
- {
- NewPhase = FALSE;
- int _Phase = cptr->Phase;
- int _FTime = cptr->FTime;
- float _tgalpha = cptr->tgalpha;
- TBEGIN:
- float targetx = cptr->tgx;
- float targetz = cptr->tgz;
- float targetdx = targetx - cptr->pos.x;
- float targetdz = targetz - cptr->pos.z;
- float tdist = (float)sqrt( targetdx * targetdx + targetdz * targetdz );
- float playerdx = PlayerX - cptr->pos.x - cptr->lookx * 108;
- float playerdz = PlayerZ - cptr->pos.z - cptr->lookz * 108;
- float pdist = (float)sqrt( playerdx * playerdx + playerdz * playerdz );
- if (cptr->State==2) { if (cptr->Phase!=DIA_JUMP) NewPhase=TRUE; cptr->State=1; cptr->Phase=DIA_RUN;}
-
- if (GetLandUpH(cptr->pos.x, cptr->pos.z) - GetLandH(cptr->pos.x, cptr->pos.z) > 140 * cptr->scale)
- cptr->StateF |= csONWATER; else
- cptr->StateF &= (!csONWATER);
- if (cptr->Phase == DIA_EAT) goto NOTHINK;
-
- //============================================//
- if (!MyHealth) cptr->State = 0;
- if (cptr->State) {
- if (pdist > ctViewR*140+OptAgres/8) {
- nv.x = playerdx; nv.z = playerdz; nv.y = 0;
- NormVector(nv, 2048.f);
- cptr->tgx = cptr->pos.x - nv.x;
- cptr->tgz = cptr->pos.z - nv.z;
- cptr->tgtime = 0;
- cptr->AfraidTime-=TimeDt;
- if (cptr->AfraidTime<=0) {
- cptr->AfraidTime=0; cptr->State = 0;
- }
- } else {
- cptr->tgx = PlayerX;
- cptr->tgz = PlayerZ;
- cptr->tgtime = 0;
- }
-
- if (!(cptr->StateF & csONWATER))
- if (pdist<1324 * cptr->scale && pdist>900 * cptr->scale)
- if (AngleDifference(cptr->alpha, FindVectorAlpha(playerdx, playerdz)) < 0.2f)
- cptr->Phase = DIA_JUMP;
- if (pdist<300)
- if (fabs(PlayerY - cptr->pos.y - 120) < 256) {
- if (!(cptr->StateF & csONWATER)) {
- cptr->vspeed/= 8.0f;
- cptr->State = 1;
- cptr->Phase = DIA_EAT;
- }
-
- AddDeadBody(cptr, HUNT_EAT);
- }
- }
- if (!cptr->State) {
- cptr->AfraidTime = 0;
- if (tdist<456) {
- SetNewTargetPlace(cptr, 8048.f);
- goto TBEGIN; }
- }
- NOTHINK:
- if (pdist<2048) cptr->NoFindCnt = 0;
- if (cptr->NoFindCnt) cptr->NoFindCnt--; else
- {
- cptr->tgalpha = CorrectedAlpha(FindVectorAlpha(targetdx, targetdz), cptr->alpha);//FindVectorAlpha(targetdx, targetdz);
- if (cptr->State && pdist>1648) {
- cptr->tgalpha += (float)f_sin(RealTime/824.f) / 4.f;
- if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
- if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
- }
- }
- LookForAWay(cptr, FALSE, TRUE);
- if (cptr->NoWayCnt>12) { cptr->NoWayCnt=0; cptr->NoFindCnt = 16 + rRand(20); }
- if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
- if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
-
- //===============================================//
- ProcessPrevPhase(cptr);
-
- //======== select new phase =======================//
- cptr->FTime+=TimeDt;
-
- if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime) {
- cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
- NewPhase = TRUE; }
-
- if (cptr->Phase==DIA_EAT) goto ENDPSELECT;
- if (NewPhase && _Phase==DIA_JUMP) { cptr->Phase = DIA_RUN; goto ENDPSELECT; }
- if (cptr->Phase== DIA_JUMP) goto ENDPSELECT;
-
- if (NewPhase)
- if (!cptr->State)
- if (rRand(128)>110) {
- cptr->Phase = DIA_IDLE1 + rRand(1);
- goto ENDPSELECT;
- } else cptr->Phase = DIA_WALK; else cptr->Phase = DIA_RUN;
-
- if (cptr->Phase!=DIA_IDLE1 && cptr->Phase!=DIA_IDLE2)
- if (!cptr->State) cptr->Phase=DIA_WALK; else
- if (fabs(cptr->tgalpha - cptr->alpha)<1.0 ||
- fabs(cptr->tgalpha - cptr->alpha)>2*pi-1.0)
- cptr->Phase = DIA_RUN; else cptr->Phase=DIA_WALK;
- if (cptr->StateF & csONWATER) cptr->Phase = DIA_SWIM;
- if (cptr->Slide>40) cptr->Phase = DIA_SLIDE;
-
-
- ENDPSELECT:
- //====== process phase changing ===========//
- if ( (_Phase != cptr->Phase) || NewPhase)
- ActivateCharacterFx(cptr);
-
- if (_Phase != cptr->Phase) {
- //==== set proportional FTime for better morphing =//
- if (MORPHP)
- if (_Phase<=3 && cptr->Phase<=3)
- cptr->FTime = _FTime * cptr->pinfo->Animation[cptr->Phase].AniTime / cptr->pinfo->Animation[_Phase].AniTime + 64;
- else if (!NewPhase) cptr->FTime = 0;
- if (cptr->PPMorphTime>128) {
- cptr->PrevPhase = _Phase;
- cptr->PrevPFTime = _FTime;
- cptr->PPMorphTime = 0; }
- }
-
- cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
-
-
- //========== rotation to tgalpha ===================//
-
- float rspd, currspeed, tgbend;
- float dalpha = (float)fabs(cptr->tgalpha - cptr->alpha);
- float drspd = dalpha; if (drspd>pi) drspd = 2*pi - drspd;
- if (cptr->Phase==DIA_JUMP || cptr->Phase==DIA_EAT ||
- cptr->Phase==DIA_IDLE1 || cptr->Phase==DIA_IDLE2) goto SKIPROT;
-
- if (drspd > 0.02)
- if (cptr->tgalpha > cptr->alpha) currspeed = 0.6f + drspd*1.2f;
- else currspeed =-0.6f - drspd*1.2f;
- else currspeed = 0;
- if (cptr->AfraidTime) currspeed*=2.5;
-
- if (dalpha > pi) currspeed*=-1;
- if ((cptr->StateF & csONWATER) || cptr->Phase==DIA_WALK) currspeed/=1.4f;
-
- if (cptr->AfraidTime) DeltaFunc(cptr->rspeed, currspeed, (float)TimeDt / 160.f);
- else DeltaFunc(cptr->rspeed, currspeed, (float)TimeDt / 180.f);
- tgbend = drspd/3;
- if (tgbend>pi/5) tgbend = pi/5;
- tgbend*= SGN(currspeed);
- if (fabs(tgbend) > fabs(cptr->bend)) DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 800.f);
- else DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 600.f);
-
- rspd=cptr->rspeed * TimeDt / 1024.f;
- if (drspd < fabs(rspd)) cptr->alpha = cptr->tgalpha;
- else cptr->alpha+=rspd;
-
- if (cptr->alpha > pi * 2) cptr->alpha-= pi * 2;
- if (cptr->alpha < 0 ) cptr->alpha+= pi * 2;
- SKIPROT:
- //======= set slide mode ===========//
- if (!cptr->Slide && cptr->vspeed>0.6 && cptr->Phase!=DIA_JUMP)
- if (AngleDifference(cptr->tgalpha, cptr->alpha)>pi*2/3.f) {
- cptr->Slide = (int)(cptr->vspeed*700.f);
- cptr->slidex = cptr->lookx;
- cptr->slidez = cptr->lookz;
- cptr->vspeed = 0;
- }
- //========== movement ==============================//
- cptr->lookx = (float)f_cos(cptr->alpha);
- cptr->lookz = (float)f_sin(cptr->alpha);
- float curspeed = 0;
- if (cptr->Phase == DIA_RUN ) curspeed = 0.640*2;
- if (cptr->Phase == DIA_JUMP) curspeed = 0.600*2;
- if (cptr->Phase == DIA_WALK) curspeed = 0.224*2;
- if (cptr->Phase == DIA_SWIM) curspeed = 0.300*2;
- if (cptr->Phase == DIA_EAT) curspeed = 0.0f;
- if (cptr->Phase == DIA_RUN && cptr->Slide) {
- curspeed /= 8;
- if (drspd > pi / 2.f) curspeed=0; else
- if (drspd > pi / 4.f) curspeed*=2.f - 4.f*drspd / pi;
- } else
- if (drspd > pi / 2.f) curspeed*=2.f - 2.f*drspd / pi;
- //========== process speed =============//
-
- DeltaFunc(cptr->vspeed, curspeed, TimeDt / 500.f);
-
- if (cptr->Phase==DIA_JUMP) cptr->vspeed = 1.1f;
- MoveCharacter(cptr, cptr->lookx * cptr->vspeed * TimeDt * cptr->scale,
- cptr->lookz * cptr->vspeed * TimeDt * cptr->scale, FALSE, TRUE);
-
- //========== slide ==============//
- if (cptr->Slide) {
- MoveCharacter(cptr, cptr->slidex * cptr->Slide / 600.f * TimeDt * cptr->scale,
- cptr->slidez * cptr->Slide / 600.f * TimeDt * cptr->scale, FALSE, TRUE);
- cptr->Slide-=TimeDt;
- if (cptr->Slide<0) cptr->Slide=0;
- }
-
- //============ Y movement =================//
- if (cptr->StateF & csONWATER) {
- cptr->pos.y = GetLandUpH(cptr->pos.x, cptr->pos.z) - 160 * cptr->scale;
- cptr->beta/=2;
- cptr->tggamma=0;
- } else {
- ThinkY_Beta_Gamma(cptr, 98, 84, 0.4f, 0.3f);
- }
- //=== process to tggamma ===//
- if (cptr->Phase==DIA_WALK) cptr->tggamma+= cptr->rspeed / 9.0f;
- else cptr->tggamma+= cptr->rspeed / 6.0f;
- if (cptr->Phase==DIA_JUMP) cptr->tggamma=0;
- DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 1624.f);
- //==================================================//
-
- }
- void AnimatePig(TCharacter *cptr)
- {
- NewPhase = FALSE;
- int _Phase = cptr->Phase;
- int _FTime = cptr->FTime;
- float _tgalpha = cptr->tgalpha;
- if (cptr->AfraidTime) cptr->AfraidTime = max(0, cptr->AfraidTime - TimeDt);
- if (cptr->State==2) { NewPhase=TRUE; cptr->State=1; }
- TBEGIN:
- float targetx = cptr->tgx;
- float targetz = cptr->tgz;
- float targetdx = targetx - cptr->pos.x;
- float targetdz = targetz - cptr->pos.z;
- float tdist = (float)sqrt( targetdx * targetdx + targetdz * targetdz );
- float playerdx = PlayerX - cptr->pos.x;
- float playerdz = PlayerZ - cptr->pos.z;
- float pdist = (float)sqrt( playerdx * playerdx + playerdz * playerdz );
-
- //=========== run away =================//
-
- if (cptr->State) {
- if (!cptr->AfraidTime) {
- if (pdist<2048.f) cptr->AfraidTime = (5 + rRand(5)) * 1024;
-
- if (!cptr->AfraidTime)
- if (pdist > 4096.f) {
- cptr->State = 0;
- SetNewTargetPlace(cptr, 2048.f);
- goto TBEGIN; }
- }
- nv.x = playerdx; nv.z = playerdz; nv.y = 0;
- NormVector(nv, 2048.f);
- cptr->tgx = cptr->pos.x - nv.x;
- cptr->tgz = cptr->pos.z - nv.z;
- cptr->tgtime = 0;
- }
- if (pdist>(ctViewR+20)*256)
- if (ReplaceCharacterForward(cptr)) goto TBEGIN;
- //======== exploring area ===============//
- if (!cptr->State) {
- cptr->AfraidTime = 0;
- if (pdist<812.f) {
- cptr->State = 1;
- cptr->AfraidTime = (5 + rRand(5)) * 1024;
- cptr->Phase = PIG_RUN;
- goto TBEGIN; }
-
- if (tdist<456) {
- SetNewTargetPlace(cptr, 2048.f);
- goto TBEGIN; }
- }
-
-
- //============================================//
- if (cptr->NoFindCnt) cptr->NoFindCnt--;
- else cptr->tgalpha = CorrectedAlpha(FindVectorAlpha(targetdx, targetdz), cptr->alpha);//FindVectorAlpha(targetdx, targetdz);
- LookForAWay(cptr, TRUE, TRUE);
- if (cptr->NoWayCnt>8) { cptr->NoWayCnt=0; cptr->NoFindCnt = 8 + rRand(80); }
- if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
- if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
-
- //===============================================//
- ProcessPrevPhase(cptr);
- //======== select new phase =======================//
- cptr->FTime+=TimeDt;
-
- if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime) {
- cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
- NewPhase = TRUE; }
-
- if (NewPhase)
- if (!cptr->State) {
- if (cptr->Phase == PIG_IDLE1 || cptr->Phase == PIG_IDLE2 || cptr->Phase == PIG_IDLE3) {
- if (rRand(128)>96) cptr->Phase = PIG_WALK;
- else cptr->Phase = PIG_IDLE1 + rRand(2);
- goto ENDPSELECT;
- }
- if (rRand(128) > 120) cptr->Phase=PIG_IDLE1; else cptr->Phase=PIG_WALK;
- } else
- if (cptr->AfraidTime) cptr->Phase = PIG_RUN;
- else cptr->Phase = PIG_WALK;
-
- ENDPSELECT:
- //====== process phase changing ===========//
- if ( (_Phase != cptr->Phase) || NewPhase)
- ActivateCharacterFx(cptr);
-
- if (_Phase != cptr->Phase) {
- if (_Phase<=1 && cptr->Phase<=1)
- cptr->FTime = _FTime * cptr->pinfo->Animation[cptr->Phase].AniTime / cptr->pinfo->Animation[_Phase].AniTime + 64;
- else if (!NewPhase) cptr->FTime = 0;
- if (cptr->PPMorphTime>128) {
- cptr->PrevPhase = _Phase;
- cptr->PrevPFTime = _FTime;
- cptr->PPMorphTime = 0; }
- }
-
- cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
-
-
- //========== rotation to tgalpha ===================//
-
- float rspd, currspeed, tgbend;
- float dalpha = (float)fabs(cptr->tgalpha - cptr->alpha);
- float drspd = dalpha; if (drspd>pi) drspd = 2*pi - drspd;
- if (cptr->Phase == PIG_IDLE1 || cptr->Phase == PIG_IDLE2 || cptr->Phase == PIG_IDLE3) goto SKIPROT;
- if (drspd > 0.02)
- if (cptr->tgalpha > cptr->alpha) currspeed = 0.8f + drspd*1.4f;
- else currspeed =-0.8f - drspd*1.4f;
- else currspeed = 0;
-
- if (cptr->AfraidTime) currspeed*=1.5;
- if (dalpha > pi) currspeed*=-1;
- if ((cptr->State & csONWATER) || cptr->Phase==PIG_WALK) currspeed/=1.4f;
-
- DeltaFunc(cptr->rspeed, currspeed, (float)TimeDt / 260.f);
- tgbend = drspd/2;
- if (tgbend>pi/2) tgbend = pi/2;
- tgbend*= SGN(currspeed);
- if (fabs(tgbend) > fabs(cptr->bend)) DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 800.f);
- else DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 400.f);
-
- rspd=cptr->rspeed * TimeDt / 1024.f;
- if (drspd < fabs(rspd)) cptr->alpha = cptr->tgalpha;
- else cptr->alpha+=rspd;
-
- if (cptr->alpha > pi * 2) cptr->alpha-= pi * 2;
- if (cptr->alpha < 0 ) cptr->alpha+= pi * 2;
- SKIPROT:
- //========== movement ==============================//
- cptr->lookx = (float)f_cos(cptr->alpha);
- cptr->lookz = (float)f_sin(cptr->alpha);
- float curspeed = 0;
- if (cptr->Phase == PIG_RUN ) curspeed = 0.6f;
- if (cptr->Phase == PIG_WALK) curspeed = 0.2f;
-
- if (drspd > pi / 2.f) curspeed*=2.f - 2.f*drspd / pi;
- //========== process speed =============//
- curspeed*=cptr->scale;
- DeltaFunc(cptr->vspeed, curspeed, TimeDt / 1024.f);
-
- MoveCharacter(cptr, cptr->lookx * cptr->vspeed * TimeDt,
- cptr->lookz * cptr->vspeed * TimeDt, TRUE, TRUE);
- ThinkY_Beta_Gamma(cptr, 64, 32, 0.7f, 0.4f);
- if (cptr->Phase==PIG_WALK) cptr->tggamma+= cptr->rspeed / 12.0f;
- else cptr->tggamma+= cptr->rspeed / 8.0f;
- DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 2048.f);
- }
- void AnimateBron(TCharacter *cptr)
- {
- NewPhase = FALSE;
- int _Phase = cptr->Phase;
- int _FTime = cptr->FTime;
- float _tgalpha = cptr->tgalpha;
- if (cptr->AfraidTime) cptr->AfraidTime = max(0, cptr->AfraidTime - TimeDt);
- if (cptr->State==2) { NewPhase=TRUE; cptr->State=1; }
- TBEGIN:
- float targetx = cptr->tgx;
- float targetz = cptr->tgz;
- float targetdx = targetx - cptr->pos.x;
- float targetdz = targetz - cptr->pos.z;
- float tdist = (float)sqrt( targetdx * targetdx + targetdz * targetdz );
- //float playerdx = PlayerX - cptr->pos.x;
- //float playerdz = PlayerZ - cptr->pos.z;
- float playerdx = PlayerX - cptr->pos.x - cptr->lookx * 300 * cptr->scale;
- float playerdz = PlayerZ - cptr->pos.z - cptr->lookz * 300 * cptr->scale;
- float pdist = (float)sqrt( playerdx * playerdx + playerdz * playerdz );
-
- //=========== run away =================//
-
- if (cptr->State) {
- if (pdist < 6000) cptr->AfraidTime = 8000;
- if (!cptr->AfraidTime) {
- cptr->State = 0;
- SetNewTargetPlace(cptr, 8048.f);
- goto TBEGIN;
- }
- if (pdist > 256*16+OptAgres/8) {
- nv.x = playerdx; nv.z = playerdz; nv.y = 0;
- NormVector(nv, 2048.f);
- cptr->tgx = cptr->pos.x - nv.x;
- cptr->tgz = cptr->pos.z - nv.z;
- cptr->tgtime = 0;
- } else {
- cptr->tgx = PlayerX;
- cptr->tgz = PlayerZ;
- cptr->tgtime = 0;
- }
- }
- if (MyHealth)
- if (pdist<300)
- if (fabs(PlayerY - cptr->pos.y - 160) < 256) {
- cptr->State = 0;
- AddDeadBody(cptr, HUNT_EAT);
- }
- //======== exploring area ===============//
- if (!cptr->State) {
- cptr->AfraidTime = 0;
-
- if (tdist<456) {
- SetNewTargetPlace(cptr, 8048.f);
- goto TBEGIN; }
- }
-
-
- //============================================//
- if (pdist<2048) cptr->NoFindCnt = 0;
- if (cptr->NoFindCnt) cptr->NoFindCnt--;
- else {
- cptr->tgalpha = CorrectedAlpha(FindVectorAlpha(targetdx, targetdz), cptr->alpha);//FindVectorAlpha(targetdx, targetdz);
- if (cptr->AfraidTime)
- if (pdist>12*256) {
- cptr->tgalpha += (float)f_sin(RealTime/1024.f) / 3.f;
- if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
- if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
- }
- }
-
- LookForAWay(cptr, TRUE, TRUE);
- if (cptr->NoWayCnt>8) { cptr->NoWayCnt=0; cptr->NoFindCnt = 48 + rRand(80); }
- if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
- if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
-
- //===============================================//
- ProcessPrevPhase(cptr);
- //======== select new phase =======================//
- cptr->FTime+=TimeDt;
-
- if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime) {
- cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
- NewPhase = TRUE; }
-
- if (NewPhase)
- if (!cptr->State) {
- if (cptr->Phase == BRO_IDLE1 || cptr->Phase == BRO_IDLE2 || cptr->Phase == BRO_IDLE3) {
- if (rRand(128) > 64 && cptr->Phase == BRO_IDLE3)
- cptr->Phase = BRO_WALK;
- else cptr->Phase = BRO_IDLE1 + rRand(2);
- goto ENDPSELECT;
- }
- if (rRand(128) > 124) cptr->Phase=BRO_IDLE1; else cptr->Phase=BRO_WALK;
- } else
- if (cptr->AfraidTime) cptr->Phase = BRO_RUN;
- else cptr->Phase = BRO_WALK;
-
- ENDPSELECT:
- //====== process phase changing ===========//
- if ( (_Phase != cptr->Phase) || NewPhase)
- ActivateCharacterFx(cptr);
-
- if (_Phase != cptr->Phase) {
- if (_Phase<=1 && cptr->Phase<=1)
- cptr->FTime = _FTime * cptr->pinfo->Animation[cptr->Phase].AniTime / cptr->pinfo->Animation[_Phase].AniTime + 64;
- else if (!NewPhase) cptr->FTime = 0;
- if (cptr->PPMorphTime>128) {
- cptr->PrevPhase = _Phase;
- cptr->PrevPFTime = _FTime;
- cptr->PPMorphTime = 0; }
- }
-
- cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
-
-
- //========== rotation to tgalpha ===================//
-
- float rspd, currspeed, tgbend;
- float dalpha = (float)fabs(cptr->tgalpha - cptr->alpha);
- float drspd = dalpha; if (drspd>pi) drspd = 2*pi - drspd;
- if (cptr->Phase == BRO_IDLE1 || cptr->Phase == BRO_IDLE2 || cptr->Phase == BRO_IDLE3) goto SKIPROT;
- if (drspd > 0.02)
- if (cptr->tgalpha > cptr->alpha) currspeed = 0.2f + drspd*1.0f;
- else currspeed =-0.2f - drspd*1.0f;
- else currspeed = 0;
-
- if (cptr->AfraidTime) currspeed*=1.5;
- if (dalpha > pi) currspeed*=-1;
- if ((cptr->State & csONWATER) || cptr->Phase==BRO_WALK) currspeed/=1.4f;
-
- DeltaFunc(cptr->rspeed, currspeed, (float)TimeDt / 400.f);
- tgbend = drspd/3.5f;
- if (tgbend>pi/2.f) tgbend = pi/2.f;
- tgbend*= SGN(currspeed);
- if (fabs(tgbend) > fabs(cptr->bend)) DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 1600.f);
- else DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 1200.f);
-
- rspd=cptr->rspeed * TimeDt / 612.f;
- if (drspd < fabs(rspd)) cptr->alpha = cptr->tgalpha;
- else cptr->alpha+=rspd;
-
- if (cptr->alpha > pi * 2) cptr->alpha-= pi * 2;
- if (cptr->alpha < 0 ) cptr->alpha+= pi * 2;
- SKIPROT:
- //========== movement ==============================//
- cptr->lookx = (float)f_cos(cptr->alpha);
- cptr->lookz = (float)f_sin(cptr->alpha);
- float curspeed = 0;
- if (cptr->Phase == BRO_RUN ) curspeed = 0.768*2;
- if (cptr->Phase == BRO_WALK) curspeed = 0.168*2;
-
- if (drspd > pi / 2.f) curspeed*=2.f - 2.f*drspd / pi;
- //========== process speed =============//
- curspeed*=cptr->scale;
- if (curspeed>cptr->vspeed) DeltaFunc(cptr->vspeed, curspeed, TimeDt / 1024.f);
- else DeltaFunc(cptr->vspeed, curspeed, TimeDt / 256.f);
-
- MoveCharacter(cptr, cptr->lookx * cptr->vspeed * TimeDt,
- cptr->lookz * cptr->vspeed * TimeDt, TRUE, TRUE);
- ThinkY_Beta_Gamma(cptr, 128, 64, 0.6f, 0.3f);
- if (cptr->Phase==BRO_WALK) cptr->tggamma+= cptr->rspeed / 12.0f;
- else cptr->tggamma+= cptr->rspeed / 8.0f;
- DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 2048.f);
- }
- void AnimateBear(TCharacter *cptr)
- {
- NewPhase = FALSE;
- int _Phase = cptr->Phase;
- int _FTime = cptr->FTime;
- float _tgalpha = cptr->tgalpha;
- if (cptr->AfraidTime) cptr->AfraidTime = max(0, cptr->AfraidTime - TimeDt);
- if (cptr->State==2) { NewPhase=TRUE; cptr->State=1; }
- TBEGIN:
- float targetx = cptr->tgx;
- float targetz = cptr->tgz;
- float targetdx = targetx - cptr->pos.x;
- float targetdz = targetz - cptr->pos.z;
- float tdist = (float)sqrt( targetdx * targetdx + targetdz * targetdz );
- //float playerdx = PlayerX - cptr->pos.x;
- //float playerdz = PlayerZ - cptr->pos.z;
- float playerdx = PlayerX - cptr->pos.x - cptr->lookx * 300 * cptr->scale;
- float playerdz = PlayerZ - cptr->pos.z - cptr->lookz * 300 * cptr->scale;
- float pdist = (float)sqrt( playerdx * playerdx + playerdz * playerdz );
-
- //=========== run away =================//
-
- if (cptr->State) {
- if (pdist < 6000) cptr->AfraidTime = 8000;
- if (!cptr->AfraidTime) {
- cptr->State = 0;
- SetNewTargetPlace(cptr, 8048.f);
- goto TBEGIN;
- }
- if (pdist > 256*20+OptAgres/8) {
- nv.x = playerdx; nv.z = playerdz; nv.y = 0;
- NormVector(nv, 2048.f);
- cptr->tgx = cptr->pos.x - nv.x;
- cptr->tgz = cptr->pos.z - nv.z;
- cptr->tgtime = 0;
- } else {
- cptr->tgx = PlayerX;
- cptr->tgz = PlayerZ;
- cptr->tgtime = 0;
- }
- }
- if (MyHealth)
- if (pdist<300)
- if (fabs(PlayerY - cptr->pos.y - 160) < 256) {
- cptr->State = 0;
- AddDeadBody(cptr, HUNT_EAT);
- }
- //======== exploring area ===============//
- if (!cptr->State) {
- cptr->AfraidTime = 0;
-
- if (tdist<456) {
- SetNewTargetPlace(cptr, 8048.f);
- goto TBEGIN; }
- }
-
-
- //============================================//
- if (pdist<2048) cptr->NoFindCnt = 0;
- if (cptr->NoFindCnt) cptr->NoFindCnt--;
- else {
- cptr->tgalpha = CorrectedAlpha(FindVectorAlpha(targetdx, targetdz), cptr->alpha);//FindVectorAlpha(targetdx, targetdz);
- if (cptr->AfraidTime) {
- cptr->tgalpha += (float)f_sin(RealTime/1024.f) / 3.f;
- if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
- if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
- }
- }
-
- LookForAWay(cptr, TRUE, TRUE);
- if (cptr->NoWayCnt>8) { cptr->NoWayCnt=0; cptr->NoFindCnt = 48 + rRand(80); }
- if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
- if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
-
- //===============================================//
- ProcessPrevPhase(cptr);
- //======== select new phase =======================//
- cptr->FTime+=TimeDt;
-
- if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime) {
- cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
- NewPhase = TRUE; }
-
- if (NewPhase)
- if (!cptr->State) {
- if (cptr->Phase == BRO_IDLE1 || cptr->Phase == BRO_IDLE2 || cptr->Phase == BRO_IDLE3) {
- if (rRand(128) > 64 && cptr->Phase == BRO_IDLE3)
- cptr->Phase = BRO_WALK;
- else cptr->Phase = BRO_IDLE1 + rRand(2);
- goto ENDPSELECT;
- }
- if (rRand(128) > 124) cptr->Phase=BRO_IDLE1; else cptr->Phase=BRO_WALK;
- } else
- if (cptr->AfraidTime) cptr->Phase = BRO_RUN;
- else cptr->Phase = BRO_WALK;
-
- ENDPSELECT:
- //====== process phase changing ===========//
- if ( (_Phase != cptr->Phase) || NewPhase)
- ActivateCharacterFx(cptr);
-
- if (_Phase != cptr->Phase) {
- if (_Phase<=1 && cptr->Phase<=1)
- cptr->FTime = _FTime * cptr->pinfo->Animation[cptr->Phase].AniTime / cptr->pinfo->Animation[_Phase].AniTime + 64;
- else if (!NewPhase) cptr->FTime = 0;
- if (cptr->PPMorphTime>128) {
- cptr->PrevPhase = _Phase;
- cptr->PrevPFTime = _FTime;
- cptr->PPMorphTime = 0; }
- }
-
- cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
-
-
- //========== rotation to tgalpha ===================//
-
- float rspd, currspeed, tgbend;
- float dalpha = (float)fabs(cptr->tgalpha - cptr->alpha);
- float drspd = dalpha; if (drspd>pi) drspd = 2*pi - drspd;
- if (cptr->Phase == BRO_IDLE1 || cptr->Phase == BRO_IDLE2 || cptr->Phase == BRO_IDLE3) goto SKIPROT;
- if (drspd > 0.02)
- if (cptr->tgalpha > cptr->alpha) currspeed = 0.2f + drspd*1.0f;
- else currspeed =-0.2f - drspd*1.0f;
- else currspeed = 0;
-
- if (cptr->AfraidTime) currspeed*=1.5;
- if (dalpha > pi) currspeed*=-1;
- if ((cptr->State & csONWATER) || cptr->Phase==BRO_WALK) currspeed/=1.4f;
-
- DeltaFunc(cptr->rspeed, currspeed, (float)TimeDt / 400.f);
- tgbend = drspd/3.5f;
- if (tgbend>pi/2.f) tgbend = pi/2.f;
- tgbend*= SGN(currspeed);
- if (fabs(tgbend) > fabs(cptr->bend)) DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 1600.f);
- else DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 1200.f);
-
- rspd=cptr->rspeed * TimeDt / 612.f;
- if (drspd < fabs(rspd)) cptr->alpha = cptr->tgalpha;
- else cptr->alpha+=rspd;
-
- if (cptr->alpha > pi * 2) cptr->alpha-= pi * 2;
- if (cptr->alpha < 0 ) cptr->alpha+= pi * 2;
- SKIPROT:
- //========== movement ==============================//
- cptr->lookx = (float)f_cos(cptr->alpha);
- cptr->lookz = (float)f_sin(cptr->alpha);
- float curspeed = 0;
- if (cptr->Phase == BRO_RUN ) curspeed = 0.896*2;
- if (cptr->Phase == BRO_WALK) curspeed = 0.240*2;
-
- if (drspd > pi / 2.f) curspeed*=2.f - 2.f*drspd / pi;
- //========== process speed =============//
- curspeed*=cptr->scale;
- if (curspeed>cptr->vspeed) DeltaFunc(cptr->vspeed, curspeed, TimeDt / 1024.f);
- else DeltaFunc(cptr->vspeed, curspeed, TimeDt / 256.f);
-
- MoveCharacter(cptr, cptr->lookx * cptr->vspeed * TimeDt,
- cptr->lookz * cptr->vspeed * TimeDt, TRUE, TRUE);
- ThinkY_Beta_Gamma(cptr, 128, 64, 0.6f, 0.3f);
- if (cptr->Phase==BRO_WALK) cptr->tggamma+= cptr->rspeed / 12.0f;
- else cptr->tggamma+= cptr->rspeed / 8.0f;
- DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 2048.f);
- }
- void AnimateWolf(TCharacter *cptr)
- {
- NewPhase = FALSE;
- int _Phase = cptr->Phase;
- int _FTime = cptr->FTime;
- float _tgalpha = cptr->tgalpha;
- if (cptr->AfraidTime) cptr->AfraidTime = max(0, cptr->AfraidTime - TimeDt);
- if (cptr->State==2) { NewPhase=TRUE; cptr->State=1; }
- TBEGIN:
- float targetx = cptr->tgx;
- float targetz = cptr->tgz;
- float targetdx = targetx - cptr->pos.x;
- float targetdz = targetz - cptr->pos.z;
- float tdist = (float)sqrt( targetdx * targetdx + targetdz * targetdz );
- //float playerdx = PlayerX - cptr->pos.x;
- //float playerdz = PlayerZ - cptr->pos.z;
- float playerdx = PlayerX - cptr->pos.x - cptr->lookx * 300 * cptr->scale;
- float playerdz = PlayerZ - cptr->pos.z - cptr->lookz * 300 * cptr->scale;
- float pdist = (float)sqrt( playerdx * playerdx + playerdz * playerdz );
-
- //=========== run away =================//
-
- if (!MyHealth) cptr->State = 0;
- if (cptr->State) {
- if (pdist > ctViewR*140+OptAgres/8) {
- nv.x = playerdx; nv.z = playerdz; nv.y = 0;
- NormVector(nv, 2048.f);
- cptr->tgx = cptr->pos.x - nv.x;
- cptr->tgz = cptr->pos.z - nv.z;
- cptr->tgtime = 0;
- cptr->AfraidTime-=TimeDt;
- if (cptr->AfraidTime<=0) {
- cptr->AfraidTime=0; cptr->State = 0;
- }
- } else {
- cptr->tgx = PlayerX;
- cptr->tgz = PlayerZ;
- cptr->tgtime = 0;
- }
- }
- if (MyHealth)
- if (pdist<300)
- if (fabs(PlayerY - cptr->pos.y - 160) < 256) {
- cptr->State = 0;
- AddDeadBody(cptr, HUNT_EAT);
- }
- //======== exploring area ===============//
- if (!cptr->State) {
- cptr->AfraidTime = 0;
- if (tdist<456) {
- SetNewTargetPlace(cptr, 8048.f);
- goto TBEGIN; }
- }
-
-
- //============================================//
- if (pdist<2048) cptr->NoFindCnt = 0;
- if (cptr->NoFindCnt) cptr->NoFindCnt--;
- else {
- cptr->tgalpha = CorrectedAlpha(FindVectorAlpha(targetdx, targetdz), cptr->alpha);//FindVectorAlpha(targetdx, targetdz);
- if (cptr->AfraidTime)
- if (pdist>12*256) {
- cptr->tgalpha += (float)f_sin(RealTime/1024.f) / 3.f;
- if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
- if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
- }
- }
-
- LookForAWay(cptr, TRUE, TRUE);
- if (cptr->NoWayCnt>8) { cptr->NoWayCnt=0; cptr->NoFindCnt = 48 + rRand(80); }
- if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
- if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
-
- //===============================================//
- ProcessPrevPhase(cptr);
- //======== select new phase =======================//
- cptr->FTime+=TimeDt;
-
- if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime) {
- cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
- NewPhase = TRUE; }
-
- if (NewPhase)
- if (!cptr->State) {
- if (cptr->Phase == BRO_IDLE1 || cptr->Phase == BRO_IDLE2 || cptr->Phase == BRO_IDLE3) {
- if (rRand(128) > 64)
- cptr->Phase = BRO_WALK;
- else
- cptr->Phase = BRO_IDLE1 + rRand(2);
- goto ENDPSELECT;
- }
- if (rRand(128) > 124) cptr->Phase=BRO_IDLE1 + rRand(2); else cptr->Phase=BRO_WALK;
- } else
- if (cptr->AfraidTime) cptr->Phase = BRO_RUN;
- else cptr->Phase = BRO_WALK;
-
- ENDPSELECT:
- //====== process phase changing ===========//
- if ( (_Phase != cptr->Phase) || NewPhase)
- ActivateCharacterFx(cptr);
-
- if (_Phase != cptr->Phase) {
- if (_Phase<=1 && cptr->Phase<=1)
- cptr->FTime = _FTime * cptr->pinfo->Animation[cptr->Phase].AniTime / cptr->pinfo->Animation[_Phase].AniTime + 64;
- else if (!NewPhase) cptr->FTime = 0;
- if (cptr->PPMorphTime>128) {
- cptr->PrevPhase = _Phase;
- cptr->PrevPFTime = _FTime;
- cptr->PPMorphTime = 0; }
- }
-
- cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
-
-
- //========== rotation to tgalpha ===================//
-
- float rspd, currspeed, tgbend;
- float dalpha = (float)fabs(cptr->tgalpha - cptr->alpha);
- float drspd = dalpha; if (drspd>pi) drspd = 2*pi - drspd;
- if (cptr->Phase == BRO_IDLE1 || cptr->Phase == BRO_IDLE2 || cptr->Phase == BRO_IDLE3) goto SKIPROT;
- if (drspd > 0.02)
- if (cptr->tgalpha > cptr->alpha) currspeed = 0.4f + drspd*1.5f;
- else currspeed =-0.4f - drspd*1.5f;
- else currspeed = 0;
-
- if (cptr->AfraidTime) currspeed*=1.5;
- if (dalpha > pi) currspeed*=-1;
- if ((cptr->State & csONWATER) || cptr->Phase==BRO_WALK) currspeed/=1.4f;
-
- DeltaFunc(cptr->rspeed, currspeed, (float)TimeDt / 400.f);
- tgbend = drspd/3.5f;
- if (tgbend>pi/2.f) tgbend = pi/2.f;
- tgbend*= SGN(currspeed);
- if (fabs(tgbend) > fabs(cptr->bend)) DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 1600.f);
- else DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 1200.f);
-
- rspd=cptr->rspeed * TimeDt / 612.f;
- if (drspd < fabs(rspd)) cptr->alpha = cptr->tgalpha;
- else cptr->alpha+=rspd;
-
- if (cptr->alpha > pi * 2) cptr->alpha-= pi * 2;
- if (cptr->alpha < 0 ) cptr->alpha+= pi * 2;
- SKIPROT:
- //========== movement ==============================//
- cptr->lookx = (float)f_cos(cptr->alpha);
- cptr->lookz = (float)f_sin(cptr->alpha);
- float curspeed = 0;
- if (cptr->Phase == BRO_RUN ) curspeed = 1.024*2;
- if (cptr->Phase == BRO_WALK) curspeed = 0.160*2;
-
- if (drspd > pi / 2.f) curspeed*=2.f - 2.f*drspd / pi;
- //========== process speed =============//
- curspeed*=cptr->scale;
- if (curspeed>cptr->vspeed) DeltaFunc(cptr->vspeed, curspeed, TimeDt / 1024.f);
- else DeltaFunc(cptr->vspeed, curspeed, TimeDt / 256.f);
-
- MoveCharacter(cptr, cptr->lookx * cptr->vspeed * TimeDt,
- cptr->lookz * cptr->vspeed * TimeDt, TRUE, TRUE);
- ThinkY_Beta_Gamma(cptr, 128, 64, 0.6f, 0.3f);
- if (cptr->Phase==BRO_WALK) cptr->tggamma+= cptr->rspeed / 12.0f;
- else cptr->tggamma+= cptr->rspeed / 8.0f;
- DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 2048.f);
- }
- void AnimateHog(TCharacter *cptr)
- {
- NewPhase = FALSE;
- int _Phase = cptr->Phase;
- int _FTime = cptr->FTime;
- float _tgalpha = cptr->tgalpha;
- if (cptr->AfraidTime) cptr->AfraidTime = max(0, cptr->AfraidTime - TimeDt);
- if (cptr->State==2) { NewPhase=TRUE; cptr->State=1; }
- TBEGIN:
- float targetx = cptr->tgx;
- float targetz = cptr->tgz;
- float targetdx = targetx - cptr->pos.x;
- float targetdz = targetz - cptr->pos.z;
- float tdist = (float)sqrt( targetdx * targetdx + targetdz * targetdz );
- //float playerdx = PlayerX - cptr->pos.x;
- //float playerdz = PlayerZ - cptr->pos.z;
- float playerdx = PlayerX - cptr->pos.x - cptr->lookx * 300 * cptr->scale;
- float playerdz = PlayerZ - cptr->pos.z - cptr->lookz * 300 * cptr->scale;
- float pdist = (float)sqrt( playerdx * playerdx + playerdz * playerdz );
-
- //=========== run away =================//
-
- if (cptr->State) {
- if (pdist < 6000) cptr->AfraidTime = 8000;
- if (!cptr->AfraidTime) {
- cptr->State = 0;
- SetNewTargetPlace(cptr, 8048.f);
- goto TBEGIN;
- }
- if (pdist > 256*20+OptAgres/8) {
- nv.x = playerdx; nv.z = playerdz; nv.y = 0;
- NormVector(nv, 2048.f);
- cptr->tgx = cptr->pos.x - nv.x;
- cptr->tgz = cptr->pos.z - nv.z;
- cptr->tgtime = 0;
- } else {
- cptr->tgx = PlayerX;
- cptr->tgz = PlayerZ;
- cptr->tgtime = 0;
- }
- }
- if (MyHealth)
- if (pdist<300)
- if (fabs(PlayerY - cptr->pos.y - 160) < 256) {
- cptr->State = 0;
- AddDeadBody(cptr, HUNT_EAT);
- }
- //======== exploring area ===============//
- if (!cptr->State) {
- cptr->AfraidTime = 0;
-
- if (tdist<456) {
- SetNewTargetPlace(cptr, 8048.f);
- goto TBEGIN; }
- }
-
-
- //============================================//
- if (pdist<2048) cptr->NoFindCnt = 0;
- if (cptr->NoFindCnt) cptr->NoFindCnt--;
- else {
- cptr->tgalpha = CorrectedAlpha(FindVectorAlpha(targetdx, targetdz), cptr->alpha);//FindVectorAlpha(targetdx, targetdz);
- if (cptr->AfraidTime)
- if (pdist>12*256) {
- cptr->tgalpha += (float)f_sin(RealTime/1024.f) / 3.f;
- if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
- if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
- }
- }
-
- LookForAWay(cptr, TRUE, TRUE);
- if (cptr->NoWayCnt>8) { cptr->NoWayCnt=0; cptr->NoFindCnt = 48 + rRand(80); }
- if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
- if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
-
- //===============================================//
- ProcessPrevPhase(cptr);
- //======== select new phase =======================//
- cptr->FTime+=TimeDt;
-
- if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime) {
- cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
- NewPhase = TRUE; }
-
- if (NewPhase)
- if (!cptr->State) {
- if (cptr->Phase == BRO_IDLE1 || cptr->Phase == BRO_IDLE2 || cptr->Phase == BRO_IDLE3) {
- if (rRand(128) > 64 && cptr->Phase == BRO_IDLE3)
- cptr->Phase = BRO_WALK;
- else cptr->Phase = BRO_IDLE1 + rRand(2);
- goto ENDPSELECT;
- }
- if (rRand(128) > 124) cptr->Phase=BRO_IDLE1; else cptr->Phase=BRO_WALK;
- } else
- if (cptr->AfraidTime) cptr->Phase = BRO_RUN;
- else cptr->Phase = BRO_WALK;
-
- ENDPSELECT:
- //====== process phase changing ===========//
- if ( (_Phase != cptr->Phase) || NewPhase)
- ActivateCharacterFx(cptr);
-
- if (_Phase != cptr->Phase) {
- if (_Phase<=1 && cptr->Phase<=1)
- cptr->FTime = _FTime * cptr->pinfo->Animation[cptr->Phase].AniTime / cptr->pinfo->Animation[_Phase].AniTime + 64;
- else if (!NewPhase) cptr->FTime = 0;
- if (cptr->PPMorphTime>128) {
- cptr->PrevPhase = _Phase;
- cptr->PrevPFTime = _FTime;
- cptr->PPMorphTime = 0; }
- }
-
- cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
-
-
- //========== rotation to tgalpha ===================//
-
- float rspd, currspeed, tgbend;
- float dalpha = (float)fabs(cptr->tgalpha - cptr->alpha);
- float drspd = dalpha; if (drspd>pi) drspd = 2*pi - drspd;
- if (cptr->Phase == BRO_IDLE1 || cptr->Phase == BRO_IDLE2 || cptr->Phase == BRO_IDLE3) goto SKIPROT;
- if (drspd > 0.02)
- if (cptr->tgalpha > cptr->alpha) currspeed = 0.3f + drspd*1.4f;
- else currspeed =-0.3f - drspd*1.4f;
- else currspeed = 0;
-
- if (cptr->AfraidTime) currspeed*=1.5;
- if (dalpha > pi) currspeed*=-1;
- if ((cptr->State & csONWATER) || cptr->Phase==BRO_WALK) currspeed/=1.4f;
-
- DeltaFunc(cptr->rspeed, currspeed, (float)TimeDt / 400.f);
- tgbend = drspd/3.5f;
- if (tgbend>pi/2.f) tgbend = pi/2.f;
- tgbend*= SGN(currspeed);
- if (fabs(tgbend) > fabs(cptr->bend)) DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 1600.f);
- else DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 1200.f);
-
- rspd=cptr->rspeed * TimeDt / 612.f;
- if (drspd < fabs(rspd)) cptr->alpha = cptr->tgalpha;
- else cptr->alpha+=rspd;
-
- if (cptr->alpha > pi * 2) cptr->alpha-= pi * 2;
- if (cptr->alpha < 0 ) cptr->alpha+= pi * 2;
- SKIPROT:
- //========== movement ==============================//
- cptr->lookx = (float)f_cos(cptr->alpha);
- cptr->lookz = (float)f_sin(cptr->alpha);
- float curspeed = 0;
- if (cptr->Phase == BRO_RUN ) curspeed = 0.576*2;
- if (cptr->Phase == BRO_WALK) curspeed = 0.112*2;
-
- if (drspd > pi / 2.f) curspeed*=2.f - 2.f*drspd / pi;
- //========== process speed =============//
- curspeed*=cptr->scale;
- if (curspeed>cptr->vspeed) DeltaFunc(cptr->vspeed, curspeed, TimeDt / 1024.f);
- else DeltaFunc(cptr->vspeed, curspeed, TimeDt / 256.f);
-
- MoveCharacter(cptr, cptr->lookx * cptr->vspeed * TimeDt,
- cptr->lookz * cptr->vspeed * TimeDt, TRUE, TRUE);
- ThinkY_Beta_Gamma(cptr, 128, 64, 0.6f, 0.3f);
- if (cptr->Phase==BRO_WALK) cptr->tggamma+= cptr->rspeed / 12.0f;
- else cptr->tggamma+= cptr->rspeed / 8.0f;
- DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 2048.f);
- }
- void AnimateRhino(TCharacter *cptr)
- {
- NewPhase = FALSE;
- int _Phase = cptr->Phase;
- int _FTime = cptr->FTime;
- float _tgalpha = cptr->tgalpha;
- if (cptr->AfraidTime) cptr->AfraidTime = max(0, cptr->AfraidTime - TimeDt);
- if (cptr->State==2) { NewPhase=TRUE; cptr->State=1; }
- TBEGIN:
- float targetx = cptr->tgx;
- float targetz = cptr->tgz;
- float targetdx = targetx - cptr->pos.x;
- float targetdz = targetz - cptr->pos.z;
- float tdist = (float)sqrt( targetdx * targetdx + targetdz * targetdz );
- //float playerdx = PlayerX - cptr->pos.x;
- //float playerdz = PlayerZ - cptr->pos.z;
- float playerdx = PlayerX - cptr->pos.x - cptr->lookx * 300 * cptr->scale;
- float playerdz = PlayerZ - cptr->pos.z - cptr->lookz * 300 * cptr->scale;
- float pdist = (float)sqrt( playerdx * playerdx + playerdz * playerdz );
-
- //=========== run away =================//
-
- if (cptr->State) {
- if (pdist < 6000) cptr->AfraidTime = 8000;
- if (!cptr->AfraidTime) {
- cptr->State = 0;
- SetNewTargetPlace(cptr, 8048.f);
- goto TBEGIN;
- }
- if (pdist > 256*18+OptAgres/8) {
- nv.x = playerdx; nv.z = playerdz; nv.y = 0;
- NormVector(nv, 2048.f);
- cptr->tgx = cptr->pos.x - nv.x;
- cptr->tgz = cptr->pos.z - nv.z;
- cptr->tgtime = 0;
- } else {
- cptr->tgx = PlayerX;
- cptr->tgz = PlayerZ;
- cptr->tgtime = 0;
- }
- }
- if (MyHealth)
- if (pdist<300)
- if (fabs(PlayerY - cptr->pos.y - 160) < 256) {
- cptr->State = 0;
- AddDeadBody(cptr, HUNT_EAT);
- }
- //======== exploring area ===============//
- if (!cptr->State) {
- cptr->AfraidTime = 0;
-
- if (tdist<456) {
- SetNewTargetPlace(cptr, 8048.f);
- goto TBEGIN; }
- }
-
-
- //============================================//
- if (pdist<2048) cptr->NoFindCnt = 0;
- if (cptr->NoFindCnt) cptr->NoFindCnt--;
- else {
- cptr->tgalpha = CorrectedAlpha(FindVectorAlpha(targetdx, targetdz), cptr->alpha);//FindVectorAlpha(targetdx, targetdz);
- if (cptr->AfraidTime)
- if (pdist>12*256) {
- cptr->tgalpha += (float)f_sin(RealTime/1024.f) / 3.f;
- if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
- if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
- }
- }
-
- LookForAWay(cptr, TRUE, TRUE);
- if (cptr->NoWayCnt>8) { cptr->NoWayCnt=0; cptr->NoFindCnt = 48 + rRand(80); }
- if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
- if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
-
- //===============================================//
- ProcessPrevPhase(cptr);
- //======== select new phase =======================//
- cptr->FTime+=TimeDt;
-
- if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime) {
- cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
- NewPhase = TRUE; }
-
- if (NewPhase)
- if (!cptr->State) {
- if (cptr->Phase == BRO_IDLE1 || cptr->Phase == BRO_IDLE2 || cptr->Phase == BRO_IDLE3) {
- if (rRand(128) > 64 && cptr->Phase == BRO_IDLE3)
- cptr->Phase = BRO_WALK;
- else cptr->Phase = BRO_IDLE1 + rRand(2);
- goto ENDPSELECT;
- }
- if (rRand(128) > 124) cptr->Phase=BRO_IDLE1; else cptr->Phase=BRO_WALK;
- } else
- if (cptr->AfraidTime) cptr->Phase = BRO_RUN;
- else cptr->Phase = BRO_WALK;
-
- ENDPSELECT:
- //====== process phase changing ===========//
- if ( (_Phase != cptr->Phase) || NewPhase)
- ActivateCharacterFx(cptr);
-
- if (_Phase != cptr->Phase) {
- if (_Phase<=1 && cptr->Phase<=1)
- cptr->FTime = _FTime * cptr->pinfo->Animation[cptr->Phase].AniTime / cptr->pinfo->Animation[_Phase].AniTime + 64;
- else if (!NewPhase) cptr->FTime = 0;
- if (cptr->PPMorphTime>128) {
- cptr->PrevPhase = _Phase;
- cptr->PrevPFTime = _FTime;
- cptr->PPMorphTime = 0; }
- }
-
- cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
-
-
- //========== rotation to tgalpha ===================//
-
- float rspd, currspeed, tgbend;
- float dalpha = (float)fabs(cptr->tgalpha - cptr->alpha);
- float drspd = dalpha; if (drspd>pi) drspd = 2*pi - drspd;
- if (cptr->Phase == BRO_IDLE1 || cptr->Phase == BRO_IDLE2 || cptr->Phase == BRO_IDLE3) goto SKIPROT;
- if (drspd > 0.02)
- if (cptr->tgalpha > cptr->alpha) currspeed = 0.3f + drspd*1.2f;
- else currspeed =-0.3f - drspd*1.2f;
- else currspeed = 0;
-
- if (cptr->AfraidTime) currspeed*=1.5;
- if (dalpha > pi) currspeed*=-1;
- if ((cptr->State & csONWATER) || cptr->Phase==BRO_WALK) currspeed/=1.4f;
-
- DeltaFunc(cptr->rspeed, currspeed, (float)TimeDt / 400.f);
- tgbend = drspd/3.5f;
- if (tgbend>pi/2.f) tgbend = pi/2.f;
- tgbend*= SGN(currspeed);
- if (fabs(tgbend) > fabs(cptr->bend)) DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 1600.f);
- else DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 1200.f);
-
- rspd=cptr->rspeed * TimeDt / 612.f;
- if (drspd < fabs(rspd)) cptr->alpha = cptr->tgalpha;
- else cptr->alpha+=rspd;
-
- if (cptr->alpha > pi * 2) cptr->alpha-= pi * 2;
- if (cptr->alpha < 0 ) cptr->alpha+= pi * 2;
- SKIPROT:
- //========== movement ==============================//
- cptr->lookx = (float)f_cos(cptr->alpha);
- cptr->lookz = (float)f_sin(cptr->alpha);
- float curspeed = 0;
- if (cptr->Phase == BRO_RUN ) curspeed = 0.576*2;
- if (cptr->Phase == BRO_WALK) curspeed = 0.168*2;
-
- if (drspd > pi / 2.f) curspeed*=2.f - 2.f*drspd / pi;
- //========== process speed =============//
- curspeed*=cptr->scale;
- if (curspeed>cptr->vspeed) DeltaFunc(cptr->vspeed, curspeed, TimeDt / 1024.f);
- else DeltaFunc(cptr->vspeed, curspeed, TimeDt / 256.f);
-
- MoveCharacter(cptr, cptr->lookx * cptr->vspeed * TimeDt,
- cptr->lookz * cptr->vspeed * TimeDt, TRUE, TRUE);
- ThinkY_Beta_Gamma(cptr, 128, 64, 0.6f, 0.3f);
- if (cptr->Phase==BRO_WALK) cptr->tggamma+= cptr->rspeed / 12.0f;
- else cptr->tggamma+= cptr->rspeed / 8.0f;
- DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 2048.f);
- }
- void AnimateSmilo(TCharacter *cptr)
- {
- NewPhase = FALSE;
- int _Phase = cptr->Phase;
- int _FTime = cptr->FTime;
- float _tgalpha = cptr->tgalpha;
- if (cptr->AfraidTime) cptr->AfraidTime = max(0, cptr->AfraidTime - TimeDt);
- if (cptr->State==2) { NewPhase=TRUE; cptr->State=1; }
- TBEGIN:
- float targetx = cptr->tgx;
- float targetz = cptr->tgz;
- float targetdx = targetx - cptr->pos.x;
- float targetdz = targetz - cptr->pos.z;
- float tdist = (float)sqrt( targetdx * targetdx + targetdz * targetdz );
- //float playerdx = PlayerX - cptr->pos.x;
- //float playerdz = PlayerZ - cptr->pos.z;
- float playerdx = PlayerX - cptr->pos.x - cptr->lookx * 300 * cptr->scale;
- float playerdz = PlayerZ - cptr->pos.z - cptr->lookz * 300 * cptr->scale;
- float pdist = (float)sqrt( playerdx * playerdx + playerdz * playerdz );
-
- //=========== run away =================//
-
- if (cptr->State) {
- if (pdist < 6000) cptr->AfraidTime = 8000;
- if (!cptr->AfraidTime) {
- cptr->State = 0;
- SetNewTargetPlace(cptr, 8048.f);
- goto TBEGIN;
- }
- if (pdist > 256*16+OptAgres/8) {
- nv.x = playerdx; nv.z = playerdz; nv.y = 0;
- NormVector(nv, 2048.f);
- cptr->tgx = cptr->pos.x - nv.x;
- cptr->tgz = cptr->pos.z - nv.z;
- cptr->tgtime = 0;
- } else {
- cptr->tgx = PlayerX;
- cptr->tgz = PlayerZ;
- cptr->tgtime = 0;
- }
- }
- if (MyHealth)
- if (pdist<300)
- if (fabs(PlayerY - cptr->pos.y - 160) < 256) {
- cptr->State = 0;
- AddDeadBody(cptr, HUNT_EAT);
- }
- //======== exploring area ===============//
- if (!cptr->State) {
- cptr->AfraidTime = 0;
-
- if (tdist<456) {
- SetNewTargetPlace(cptr, 8048.f);
- goto TBEGIN; }
- }
-
-
- //============================================//
- if (pdist<2048) cptr->NoFindCnt = 0;
- if (cptr->NoFindCnt) cptr->NoFindCnt--;
- else {
- cptr->tgalpha = CorrectedAlpha(FindVectorAlpha(targetdx, targetdz), cptr->alpha);//FindVectorAlpha(targetdx, targetdz);
- if (cptr->AfraidTime)
- if (pdist>12*256) {
- cptr->tgalpha += (float)f_sin(RealTime/1024.f) / 3.f;
- if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
- if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
- }
- }
-
- LookForAWay(cptr, TRUE, TRUE);
- if (cptr->NoWayCnt>8) { cptr->NoWayCnt=0; cptr->NoFindCnt = 48 + rRand(80); }
- if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
- if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
-
- //===============================================//
- ProcessPrevPhase(cptr);
- //======== select new phase =======================//
- cptr->FTime+=TimeDt;
-
- if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime) {
- cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
- NewPhase = TRUE; }
-
- if (NewPhase)
- if (!cptr->State) {
- if (cptr->Phase == BRO_IDLE1 || cptr->Phase == BRO_IDLE2 || cptr->Phase == BRO_IDLE3) {
- cptr->Phase = BRO_WALK;
- goto ENDPSELECT;
- }
- if (rRand(128) > 124) cptr->Phase=BRO_IDLE1 + rRand(2); else cptr->Phase=BRO_WALK;
- } else
- if (cptr->AfraidTime) cptr->Phase = BRO_RUN;
- else cptr->Phase = BRO_WALK;
-
- ENDPSELECT:
- //====== process phase changing ===========//
- if ( (_Phase != cptr->Phase) || NewPhase)
- ActivateCharacterFx(cptr);
-
- if (_Phase != cptr->Phase) {
- if (_Phase<=1 && cptr->Phase<=1)
- cptr->FTime = _FTime * cptr->pinfo->Animation[cptr->Phase].AniTime / cptr->pinfo->Animation[_Phase].AniTime + 64;
- else if (!NewPhase) cptr->FTime = 0;
- if (cptr->PPMorphTime>128) {
- cptr->PrevPhase = _Phase;
- cptr->PrevPFTime = _FTime;
- cptr->PPMorphTime = 0; }
- }
-
- cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
-
-
- //========== rotation to tgalpha ===================//
-
- float rspd, currspeed, tgbend;
- float dalpha = (float)fabs(cptr->tgalpha - cptr->alpha);
- float drspd = dalpha; if (drspd>pi) drspd = 2*pi - drspd;
- if (cptr->Phase == BRO_IDLE1 || cptr->Phase == BRO_IDLE2 || cptr->Phase == BRO_IDLE3) goto SKIPROT;
- if (drspd > 0.02)
- if (cptr->tgalpha > cptr->alpha) currspeed = 0.3f + drspd*1.5f;
- else currspeed =-0.3f - drspd*1.5f;
- else currspeed = 0;
-
- if (cptr->AfraidTime) currspeed*=1.5;
- if (dalpha > pi) currspeed*=-1;
- if ((cptr->State & csONWATER) || cptr->Phase==BRO_WALK) currspeed/=1.4f;
-
- DeltaFunc(cptr->rspeed, currspeed, (float)TimeDt / 400.f);
- tgbend = drspd/3.5f;
- if (tgbend>pi/2.f) tgbend = pi/2.f;
- tgbend*= SGN(currspeed);
- if (fabs(tgbend) > fabs(cptr->bend)) DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 1600.f);
- else DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 1200.f);
-
- rspd=cptr->rspeed * TimeDt / 612.f;
- if (drspd < fabs(rspd)) cptr->alpha = cptr->tgalpha;
- else cptr->alpha+=rspd;
-
- if (cptr->alpha > pi * 2) cptr->alpha-= pi * 2;
- if (cptr->alpha < 0 ) cptr->alpha+= pi * 2;
- SKIPROT:
- //========== movement ==============================//
- cptr->lookx = (float)f_cos(cptr->alpha);
- cptr->lookz = (float)f_sin(cptr->alpha);
- float curspeed = 0;
- if (cptr->Phase == BRO_RUN ) curspeed = 1.024*2;
- if (cptr->Phase == BRO_WALK) curspeed = 0.320*2;
-
- if (drspd > pi / 2.f) curspeed*=2.f - 2.f*drspd / pi;
- //========== process speed =============//
- curspeed*=cptr->scale;
- if (curspeed>cptr->vspeed) DeltaFunc(cptr->vspeed, curspeed, TimeDt / 1024.f);
- else DeltaFunc(cptr->vspeed, curspeed, TimeDt / 256.f);
-
- MoveCharacter(cptr, cptr->lookx * cptr->vspeed * TimeDt,
- cptr->lookz * cptr->vspeed * TimeDt, TRUE, TRUE);
- ThinkY_Beta_Gamma(cptr, 128, 64, 0.6f, 0.3f);
- if (cptr->Phase==BRO_WALK) cptr->tggamma+= cptr->rspeed / 12.0f;
- else cptr->tggamma+= cptr->rspeed / 8.0f;
- DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 2048.f);
- }
- void AnimateDeer(TCharacter *cptr)
- {
- NewPhase = FALSE;
- int _Phase = cptr->Phase;
- int _FTime = cptr->FTime;
- float _tgalpha = cptr->tgalpha;
- if (cptr->AfraidTime) cptr->AfraidTime = max(0, cptr->AfraidTime - TimeDt);
- if (cptr->State==2) { NewPhase=TRUE; cptr->State=1; }
- TBEGIN:
- float targetx = cptr->tgx;
- float targetz = cptr->tgz;
- float targetdx = targetx - cptr->pos.x;
- float targetdz = targetz - cptr->pos.z;
- float tdist = (float)sqrt( targetdx * targetdx + targetdz * targetdz );
- float playerdx = PlayerX - cptr->pos.x;
- float playerdz = PlayerZ - cptr->pos.z;
- float pdist = (float)sqrt( playerdx * playerdx + playerdz * playerdz );
-
- //=========== run away =================//
-
- if (cptr->State) {
-
- if (!cptr->AfraidTime) {
- cptr->State = 0;
- SetNewTargetPlace(cptr, 8048.f);
- goto TBEGIN;
- }
- nv.x = playerdx; nv.z = playerdz; nv.y = 0;
- NormVector(nv, 2048.f);
- cptr->tgx = cptr->pos.x - nv.x;
- cptr->tgz = cptr->pos.z - nv.z;
- cptr->tgtime = 0;
- }
- //======== exploring area ===============//
- if (!cptr->State) {
- cptr->AfraidTime = 0;
- if (pdist<1024.f) {
- cptr->State = 1;
- cptr->AfraidTime = (6 + rRand(8)) * 1024;
- cptr->Phase = DER_RUN;
- goto TBEGIN; }
-
- if (tdist<456) {
- SetNewTargetPlace(cptr, 8048.f);
- goto TBEGIN; }
- }
-
-
- //============================================//
- if (pdist<2048) cptr->NoFindCnt = 0;
- if (cptr->NoFindCnt) cptr->NoFindCnt--;
- else {
- cptr->tgalpha = CorrectedAlpha(FindVectorAlpha(targetdx, targetdz), cptr->alpha);//FindVectorAlpha(targetdx, targetdz);
- if (cptr->AfraidTime) {
- cptr->tgalpha += (float)f_sin(RealTime/1024.f) / 3.f;
- if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
- if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
- }
- }
-
- LookForAWay(cptr, TRUE, TRUE);
- if (cptr->NoWayCnt>12) { cptr->NoWayCnt=0; cptr->NoFindCnt = 32 + rRand(60); }
- if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
- if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
-
- //===============================================//
- ProcessPrevPhase(cptr);
- //======== select new phase =======================//
- cptr->FTime+=TimeDt;
-
- if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime) {
- cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
- NewPhase = TRUE; }
-
- if (NewPhase)
- if (!cptr->State) {
- if (cptr->Phase == DER_IDLE1 || cptr->Phase == DER_IDLE2) {
- if (rRand(128) > 64 && cptr->Phase == DER_IDLE2)
- cptr->Phase = DER_WALK;
- else cptr->Phase = DER_IDLE1 + rRand(1);
- goto ENDPSELECT;
- }
- if (rRand(128) > 120) cptr->Phase=DER_IDLE1; else cptr->Phase=DER_WALK;
- } else
- if (cptr->AfraidTime) cptr->Phase = DER_RUN;
- else cptr->Phase = DER_WALK;
-
- ENDPSELECT:
- //====== process phase changing ===========//
- if ( (_Phase != cptr->Phase) || NewPhase)
- ActivateCharacterFx(cptr);
-
- if (_Phase != cptr->Phase) {
- if (_Phase<=2 && cptr->Phase<=2)
- cptr->FTime = _FTime * cptr->pinfo->Animation[cptr->Phase].AniTime / cptr->pinfo->Animation[_Phase].AniTime + 64;
- else if (!NewPhase) cptr->FTime = 0;
- if (cptr->PPMorphTime>128) {
- cptr->PrevPhase = _Phase;
- cptr->PrevPFTime = _FTime;
- cptr->PPMorphTime = 0; }
- }
-
- cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
-
-
- //========== rotation to tgalpha ===================//
-
- float rspd, currspeed, tgbend;
- float dalpha = (float)fabs(cptr->tgalpha - cptr->alpha);
- float drspd = dalpha; if (drspd>pi) drspd = 2*pi - drspd;
- if (cptr->Phase == DER_IDLE1 || cptr->Phase == DER_IDLE2) goto SKIPROT;
- if (drspd > 0.02)
- if (cptr->tgalpha > cptr->alpha) currspeed = 0.2f + drspd*1.0f;
- else currspeed =-0.2f - drspd*1.0f;
- else currspeed = 0;
-
- if (cptr->AfraidTime) currspeed*=1.5;
- if (dalpha > pi) currspeed*=-1;
- if ((cptr->State & csONWATER) || cptr->Phase==DER_WALK) currspeed/=1.4f;
-
- DeltaFunc(cptr->rspeed, currspeed, (float)TimeDt / 400.f);
- tgbend = drspd/2.f;
- if (tgbend>pi/3.f) tgbend = pi/3.f;
- tgbend*= SGN(currspeed);
- DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 2000.f);
-
-
- rspd=cptr->rspeed * TimeDt / 612.f;
- if (drspd < fabs(rspd)) cptr->alpha = cptr->tgalpha;
- else cptr->alpha+=rspd;
-
- if (cptr->alpha > pi * 2) cptr->alpha-= pi * 2;
- if (cptr->alpha < 0 ) cptr->alpha+= pi * 2;
- SKIPROT:
- //========== movement ==============================//
- cptr->lookx = (float)f_cos(cptr->alpha);
- cptr->lookz = (float)f_sin(cptr->alpha);
- float curspeed = 0;
- if (cptr->Phase == DER_RUN ) curspeed = 0.768*2;
- if (cptr->Phase == DER_WALK) curspeed = 0.160*2;
-
- if (drspd > pi / 2.f) curspeed*=2.f - 2.f*drspd / pi;
- //========== process speed =============//
- curspeed*=cptr->scale;
- if (curspeed>cptr->vspeed) DeltaFunc(cptr->vspeed, curspeed, TimeDt / 1024.f);
- else DeltaFunc(cptr->vspeed, curspeed, TimeDt / 256.f);
-
- MoveCharacter(cptr, cptr->lookx * cptr->vspeed * TimeDt,
- cptr->lookz * cptr->vspeed * TimeDt, TRUE, TRUE);
- ThinkY_Beta_Gamma(cptr, 128, 64, 0.6f, 0.4f);
- if (cptr->Phase==DER_WALK) cptr->tggamma+= cptr->rspeed / 16.0f;
- else cptr->tggamma+= cptr->rspeed / 10.0f;
- DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 2048.f);
- }
- void AnimateMamm(TCharacter *cptr)
- {
- NewPhase = FALSE;
- int _Phase = cptr->Phase;
- int _FTime = cptr->FTime;
- float _tgalpha = cptr->tgalpha;
- if (cptr->AfraidTime) cptr->AfraidTime = max(0, cptr->AfraidTime - TimeDt);
- if (cptr->State==2) { NewPhase=TRUE; cptr->State=1; }
- TBEGIN:
- float targetx = cptr->tgx;
- float targetz = cptr->tgz;
- float targetdx = targetx - cptr->pos.x;
- float targetdz = targetz - cptr->pos.z;
- float tdist = (float)sqrt( targetdx * targetdx + targetdz * targetdz );
- float playerdx = PlayerX - cptr->pos.x;
- float playerdz = PlayerZ - cptr->pos.z;
- float pdist = (float)sqrt( playerdx * playerdx + playerdz * playerdz );
-
- //=========== run away =================//
-
- if (cptr->State) {
-
- if (!cptr->AfraidTime) {
- cptr->State = 0;
- SetNewTargetPlace(cptr, 8048.f);
- goto TBEGIN;
- }
- nv.x = playerdx; nv.z = playerdz; nv.y = 0;
- NormVector(nv, 2048.f);
- cptr->tgx = cptr->pos.x - nv.x;
- cptr->tgz = cptr->pos.z - nv.z;
- cptr->tgtime = 0;
- }
- //======== exploring area ===============//
- if (!cptr->State) {
- cptr->AfraidTime = 0;
- if (pdist<1024.f) {
- cptr->State = 1;
- cptr->AfraidTime = (6 + rRand(8)) * 1024;
- cptr->Phase = MAM_RUN;
- goto TBEGIN; }
-
- if (tdist<456) {
- SetNewTargetPlace(cptr, 8048.f);
- goto TBEGIN; }
- }
-
-
- //============================================//
- if (pdist<3048) cptr->NoFindCnt = 0;
- if (cptr->NoFindCnt) cptr->NoFindCnt--;
- else {
- cptr->tgalpha = CorrectedAlpha(FindVectorAlpha(targetdx, targetdz), cptr->alpha);//FindVectorAlpha(targetdx, targetdz);
- if (cptr->AfraidTime) {
- cptr->tgalpha += (float)f_sin(RealTime/1024.f) / 3.f;
- if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
- if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
- }
- }
-
- LookForAWay(cptr, TRUE, TRUE);
- if (cptr->NoWayCnt>12) { cptr->NoWayCnt=0; cptr->NoFindCnt = 32 + rRand(60); }
- if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
- if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
-
- //===============================================//
- ProcessPrevPhase(cptr);
- //======== select new phase =======================//
- cptr->FTime+=TimeDt;
-
- if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime) {
- cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
- NewPhase = TRUE; }
-
- if (NewPhase)
- if (!cptr->State) {
- if (cptr->Phase == MAM_IDLE1 || cptr->Phase == MAM_IDLE2) {
- if (rRand(128) > 64 && cptr->Phase == MAM_IDLE2)
- cptr->Phase = MAM_WALK;
- else cptr->Phase = MAM_IDLE1 + rRand(1);
- goto ENDPSELECT;
- }
- if (rRand(128) > 120) cptr->Phase=MAM_IDLE1; else cptr->Phase=MAM_WALK;
- } else
- if (cptr->AfraidTime) cptr->Phase = MAM_RUN;
- else cptr->Phase = MAM_WALK;
-
- ENDPSELECT:
- //====== process phase changing ===========//
- if ( (_Phase != cptr->Phase) || NewPhase)
- ActivateCharacterFx(cptr);
-
- if (_Phase != cptr->Phase) {
- if (_Phase<=2 && cptr->Phase<=2)
- cptr->FTime = _FTime * cptr->pinfo->Animation[cptr->Phase].AniTime / cptr->pinfo->Animation[_Phase].AniTime + 64;
- else if (!NewPhase) cptr->FTime = 0;
- if (cptr->PPMorphTime>128) {
- cptr->PrevPhase = _Phase;
- cptr->PrevPFTime = _FTime;
- cptr->PPMorphTime = 0; }
- }
-
- cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
-
-
- //========== rotation to tgalpha ===================//
-
- float rspd, currspeed, tgbend;
- float dalpha = (float)fabs(cptr->tgalpha - cptr->alpha);
- float drspd = dalpha; if (drspd>pi) drspd = 2*pi - drspd;
- if (cptr->Phase == MAM_IDLE1 || cptr->Phase == MAM_IDLE2) goto SKIPROT;
- if (drspd > 0.02)
- if (cptr->tgalpha > cptr->alpha) currspeed = 0.2f + drspd*1.0f;
- else currspeed =-0.2f - drspd*1.0f;
- else currspeed = 0;
-
- if (cptr->AfraidTime) currspeed*=1.5;
- if (dalpha > pi) currspeed*=-1;
- if ((cptr->State & csONWATER) || cptr->Phase==MAM_WALK) currspeed/=1.4f;
-
- DeltaFunc(cptr->rspeed, currspeed, (float)TimeDt / 400.f);
- tgbend = drspd/2.f;
- if (tgbend>pi/3.f) tgbend = pi/3.f;
- tgbend*= SGN(currspeed);
- DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 2000.f);
-
-
- rspd=cptr->rspeed * TimeDt / 612.f;
- if (drspd < fabs(rspd)) cptr->alpha = cptr->tgalpha;
- else cptr->alpha+=rspd;
-
- if (cptr->alpha > pi * 2) cptr->alpha-= pi * 2;
- if (cptr->alpha < 0 ) cptr->alpha+= pi * 2;
- SKIPROT:
- //========== movement ==============================//
- cptr->lookx = (float)f_cos(cptr->alpha);
- cptr->lookz = (float)f_sin(cptr->alpha);
- float curspeed = 0;
- if (cptr->Phase == MAM_RUN ) curspeed = 0.640*2;
- if (cptr->Phase == MAM_WALK) curspeed = 0.320*2;
-
- if (drspd > pi / 2.f) curspeed*=2.f - 2.f*drspd / pi;
- //========== process speed =============//
- curspeed*=cptr->scale;
- if (curspeed>cptr->vspeed) DeltaFunc(cptr->vspeed, curspeed, TimeDt / 1024.f);
- else DeltaFunc(cptr->vspeed, curspeed, TimeDt / 256.f);
-
- MoveCharacter(cptr, cptr->lookx * cptr->vspeed * TimeDt,
- cptr->lookz * cptr->vspeed * TimeDt, TRUE, TRUE);
- ThinkY_Beta_Gamma(cptr, 128, 64, 0.6f, 0.4f);
- if (cptr->Phase==MAM_WALK) cptr->tggamma+= cptr->rspeed / 16.0f;
- else cptr->tggamma+= cptr->rspeed / 10.0f;
- DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 2048.f);
- }
- void AnimateDimor(TCharacter *cptr)
- {
- NewPhase = FALSE;
- int _Phase = cptr->Phase;
- int _FTime = cptr->FTime;
- float _tgalpha = cptr->tgalpha;
-
- TBEGIN:
- float targetx = cptr->tgx;
- float targetz = cptr->tgz;
- float targetdx = targetx - cptr->pos.x;
- float targetdz = targetz - cptr->pos.z;
- float tdist = (float)sqrt( targetdx * targetdx + targetdz * targetdz );
- float playerdx = PlayerX - cptr->pos.x;
- float playerdz = PlayerZ - cptr->pos.z;
- float pdist = (float)sqrt( playerdx * playerdx + playerdz * playerdz );
-
- //=========== run away =================//
- if (pdist>(ctViewR+20)*256)
- if (ReplaceCharacterForward(cptr)) goto TBEGIN;
- //======== exploring area ===============//
- if (tdist<1024) {
- SetNewTargetPlace(cptr, 4048.f);
- goto TBEGIN; }
-
-
- //============================================//
-
- cptr->tgalpha = CorrectedAlpha(FindVectorAlpha(targetdx, targetdz), cptr->alpha);//FindVectorAlpha(targetdx, targetdz);
- if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
- if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
-
- //===============================================//
- ProcessPrevPhase(cptr);
- //======== select new phase =======================//
- cptr->FTime+=TimeDt;
-
- if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime) {
- cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
- NewPhase = TRUE; }
-
- if (NewPhase) {
- if (cptr->Phase == DIM_FLY)
- if (cptr->pos.y > GetLandH(cptr->pos.x, cptr->pos.z) + 2800)
- cptr->Phase = DIM_FLYP;
- else ;
- else
- if (cptr->Phase == DIM_FLYP)
- if (cptr->pos.y < GetLandH(cptr->pos.x, cptr->pos.z) + 1800)
- cptr->Phase = DIM_FLY;
- }
-
- //====== process phase changing ===========//
- if ( (_Phase != cptr->Phase) || NewPhase)
- if ( (rand() & 1023) > 980 )
- ActivateCharacterFx(cptr);
-
- if (_Phase != cptr->Phase) {
- if (!NewPhase) cptr->FTime = 0;
- if (cptr->PPMorphTime>128) {
- cptr->PrevPhase = _Phase;
- cptr->PrevPFTime = _FTime;
- cptr->PPMorphTime = 0; }
- }
-
-
- cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
-
-
- //========== rotation to tgalpha ===================//
-
- float rspd, currspeed, tgbend;
- float dalpha = (float)fabs(cptr->tgalpha - cptr->alpha);
- float drspd = dalpha; if (drspd>pi) drspd = 2*pi - drspd;
-
- if (drspd > 0.02)
- if (cptr->tgalpha > cptr->alpha) currspeed = 0.6f + drspd*1.2f;
- else currspeed =-0.6f - drspd*1.2f;
- else currspeed = 0;
-
- if (dalpha > pi) currspeed*=-1;
- DeltaFunc(cptr->rspeed, currspeed, (float)TimeDt / 460.f);
- tgbend = drspd/2.f;
- if (tgbend>pi/2) tgbend = pi/2;
- tgbend*= SGN(currspeed);
- if (fabs(tgbend) > fabs(cptr->bend)) DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 800.f);
- else DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 400.f);
-
- rspd=cptr->rspeed * TimeDt / 1024.f;
- if (drspd < fabs(rspd)) cptr->alpha = cptr->tgalpha;
- else cptr->alpha+=rspd;
-
- if (cptr->alpha > pi * 2) cptr->alpha-= pi * 2;
- if (cptr->alpha < 0 ) cptr->alpha+= pi * 2;
- //========== movement ==============================//
- cptr->lookx = (float)f_cos(cptr->alpha);
- cptr->lookz = (float)f_sin(cptr->alpha);
- float curspeed = 0;
- if (cptr->Phase == DIM_FLY ) curspeed = 1.5f;
- if (cptr->Phase == DIM_FLYP) curspeed = 1.3f;
-
- if (drspd > pi / 2.f) curspeed*=2.f - 2.f*drspd / pi;
- if (cptr->Phase == DIM_FLY)
- DeltaFunc(cptr->pos.y, GetLandH(cptr->pos.x, cptr->pos.z)+4048, TimeDt / 6.f);
- else
- DeltaFunc(cptr->pos.y, GetLandH(cptr->pos.x, cptr->pos.z), TimeDt / 16.f);
-
-
- if (cptr->pos.y < GetLandH(cptr->pos.x, cptr->pos.z) + 236)
- cptr->pos.y = GetLandH(cptr->pos.x, cptr->pos.z) + 256;
-
-
- //========== process speed =============//
- curspeed*=cptr->scale;
- DeltaFunc(cptr->vspeed, curspeed, TimeDt / 2024.f);
-
- cptr->pos.x+= cptr->lookx * cptr->vspeed * TimeDt;
- cptr->pos.z+= cptr->lookz * cptr->vspeed * TimeDt;
-
- cptr->tggamma = cptr->rspeed / 4.0f;
- if (cptr->tggamma > pi / 6.f) cptr->tggamma = pi / 6.f;
- if (cptr->tggamma <-pi / 6.f) cptr->tggamma =-pi / 6.f;
- DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 2048.f);
- }
- void AnimateCharacters()
- {
- //if (!RunMode) return;
- TCharacter *cptr;
- if (TrophyMode) return;
- for (CurDino=0; CurDino<ChCount; CurDino++) {
- cptr = &Characters[CurDino];
- if (cptr->StateF == 0xFF) continue;
- cptr->tgtime+=TimeDt;
- if (cptr->tgtime > 30*1000) SetNewTargetPlace(cptr, 2048);
- if (cptr->Health)
- if (cptr->BloodTTime) {
- cptr->BloodTTime-=TimeDt;
- if (cptr->BloodTTime<0) cptr->BloodTTime=0;
- float k = (20000.f + cptr->BloodTTime) / 90000.f;
- if (k>1.5) k = 1.5;
- cptr->BloodTime+=(int)((float)TimeDt * k);
- if (cptr->BloodTime>600) {
- cptr->BloodTime=rRand(228);
- AddBloodTrail(cptr);
- if (rRand(128) > 96) AddBloodTrail(cptr);
- }
- }
- switch (cptr->AI) {
- case AI_PIG : if (cptr->Health) AnimatePig(cptr); else AnimatePigDead(cptr);
- break;
- case AI_ARCHEO : if (cptr->Health) AnimateDimor(cptr); else AnimateDimorDead(cptr);
- break;
- case AI_BIGFOOT:
- break;
- case AI_POACHER: ;
- break;
- case AI_BRONT: if (cptr->Health) AnimateBron(cptr); else AnimateBronDead(cptr);
- break;
- case AI_HOG : if (cptr->Health) AnimateHog(cptr); else AnimateHogDead(cptr);
- break;
- case AI_WOLF : if (cptr->Health) AnimateWolf(cptr); else AnimateBronDead(cptr);
- break;
- case AI_RHINO: if (cptr->Health) AnimateRhino(cptr); else AnimateRhinoDead(cptr);
- break;
- case AI_DIATR: if (cptr->Health) AnimateDiatr(cptr); else AnimateDiatrDead(cptr);
- break;
- case AI_DEER : if (cptr->Health) AnimateDeer(cptr); else AnimateDeerDead(cptr);
- break;
- case AI_SMILO: if (cptr->Health) AnimateSmilo(cptr); else AnimateSmiloDead(cptr);
- break;
- case AI_MAMM : if (cptr->Health) AnimateMamm(cptr); else AnimateDeerDead(cptr);
- break;
- case AI_BEAR : if (cptr->Health) AnimateBear(cptr); else AnimateBronDead(cptr);
- break;
- /*
- case AI_ANKY : if (cptr->Health) AnimateAnky(cptr); else AnimateAnkyDead(cptr);
- break;
- case AI_STEGO: if (cptr->Health) AnimateSteg(cptr); else AnimateStegDead(cptr);
- break;
- case AI_ALLO : if (cptr->Health) AnimateRaptor(cptr); else AnimateRaptorDead(cptr);
- break;
- case AI_CHASM: if (cptr->Health) AnimateTric(cptr); else AnimateTricDead(cptr);
- break;
- case AI_VELO : if (cptr->Health) AnimateVelo(cptr); else AnimateVeloDead(cptr);
- break;
- case AI_SPINO: if (cptr->Health) AnimateSpin(cptr); else AnimateSpinDead(cptr);
- break;
- case AI_CERAT: if (cptr->Health) AnimateCera(cptr); else AnimateCeraDead(cptr);
- break;
- case AI_TREX : if (cptr->Health) AnimateTRex(cptr); else AnimateTRexDead(cptr);
- break;
- */
- case 0 : AnimateHuntDead(cptr); break;
- }
- }
- }
- void MakeNoise(Vector3d pos, float range)
- {
- for (int c=0; c<ChCount; c++) {
- TCharacter *cptr = &Characters[c];
- if (!cptr->Health) continue;
- float l = VectorLength(SubVectors(cptr->pos, pos));
- if (l>range) continue;
-
- cptr->AfraidTime = (int) (10.f + (range-l) / 256.f) * 1024;
- cptr->State = 2;
- cptr->NoFindCnt = 0;
-
- }
- }
- void CheckAfraid()
- {
- if (!MyHealth) return;
- if (TrophyMode) return;
- Vector3d ppos, plook, clook, wlook, rlook;
- ppos = PlayerPos;
- if (DEBUG || UNDERWATER || ObservMode) return;
- plook.y = 0;
- plook.x = (float) f_sin(CameraAlpha);
- plook.z = (float)-f_cos(CameraAlpha);
- wlook = Wind.nv;
-
- float kR, kwind, klook, kstand;
-
- float kmask = 1.0f;
- float kskill = 1.0f;
- float kscent = 1.0f;
- if (CamoMode) kmask *=1.5;
- if (ScentMode) kscent*=1.5;
- for (int c=0; c<ChCount; c++) {
- TCharacter *cptr = &Characters[c];
- if (!cptr->Health) continue;
- if (cptr->AI<10) continue;
- if (cptr->AfraidTime || cptr->State==1) continue;
- rlook = SubVectors(ppos, cptr->pos);
- kR = VectorLength( rlook ) / 256.f / (32.f + ctViewR/2);
- NormVector(rlook, 1.0f);
- kR *= 2.5f / (float)(1.5+OptSens/128.f );
- if (kR > 3.0f) continue;
-
- clook.x = cptr->lookx;
- clook.y = 0;
- clook.z = cptr->lookz;
- MulVectorsScal(wlook, rlook, kwind); kwind*=Wind.speed / 10;
- MulVectorsScal(clook, rlook, klook); klook*=-1.f;
- if (HeadY > 180) kstand = 0.7f; else kstand = 1.2f;
- //============= reasons ==============//
- float kALook = kR * ((klook+3.f) / 3.f) * kstand * kmask;
- if (klook>0.3) kALook*= 2.0;
- if (klook>0.8) kALook*= 2.0;
- kALook/=DinoInfo[cptr->CType].LookK;
- if (kALook < 1.0)
- if (TraceLook(cptr->pos.x, cptr->pos.y+220, cptr->pos.z,
- PlayerX, PlayerY+HeadY/2.f, PlayerZ) ) kALook*=1.3f;
-
- if (kALook < 1.0)
- if (TraceLook(cptr->pos.x, cptr->pos.y+220, cptr->pos.z,
- PlayerX, PlayerY+HeadY, PlayerZ) ) kALook = 2.0;
- kALook *= (1.f + (float)ObjectsOnLook / 6.f);
- /*
- if (kR<1.0f) {
- char t[32];
- wsprintf(t,"%d", ObjectsOnLook);
- AddMessage(t);
- kALook = 20.f;
- }
- */
-
- float kASmell = kR * ((kwind+2.0f) / 2.0F) * ((klook+3.f) / 3.f) * kscent;
- if (kwind>0) kASmell*= 2.0;
- kASmell/=DinoInfo[cptr->CType].SmellK;
-
- float kRes = min (kALook, kASmell);
- if (kRes < 1.0) {
- /*
- MessageBeep(0xFFFFFFFF);
- char t[128];
- if (kALook<kASmell)
- sprintf(t, "LOOK: KR: %f Tr: %d K: %f", kR, ObjectsOnLook, kALook);
- else
- sprintf(t, "SMELL: KR: %f Tr: %d K: %f", kR, ObjectsOnLook, kASmell);
- AddMessage(t);
- */
- kRes = min (kRes, kR);
- cptr->AfraidTime = (int)(1.0 / (kRes+0.1) * 10.f * 1000.f);
- cptr->State = 2;
- cptr->NoFindCnt = 0;
- }
- }
- }
- void PlaceTrophy()
- {
- ChCount = 0;
-
- for (int c=0; c<24; c++) {
- if (!TrophyRoom.Body[c].ctype) continue;
- Characters[ChCount].CType = TrophyRoom.Body[c].ctype;
-
- if (c<6) Characters[ChCount].alpha = pi/2; else
- if (c<12) Characters[ChCount].alpha = pi; else
- if (c<18) Characters[ChCount].alpha = pi*3/2; else
- Characters[ChCount].alpha = 0;
- ResetCharacter(&Characters[ChCount]);
- Characters[ChCount].State = c;
- Characters[ChCount].scale = TrophyRoom.Body[c].scale;
- Characters[ChCount].pos.x = LandingList.list[c].x * 256.f + 128.f;
- Characters[ChCount].pos.z = LandingList.list[c].y * 256.f + 128.f;
-
- Characters[ChCount].pos.y = GetLandH(Characters[ChCount].pos.x,
- Characters[ChCount].pos.z);
- ChCount++;
- }
- }
- void PlaceCharacters()
- {
- int c, tr;
- ChCount = 0;
- PrintLog("Placing...");
- //return;
- for (c=10; c<30; c++)
- if ( (TargetDino & (1<<c))>0 ) { TargetCall=c; break; }
-
-
- //======== lohs =========//
- int MC = 5 + OptDens/80;
- if (OptDayNight==2) MC/=2;
-
- tr = 0;
- for (c=0; c<MC; c++) {
- Characters[ChCount].CType = 1 + c % 2;
- replace1:
- Characters[ChCount].pos.x = PlayerX + siRand(10040);
- Characters[ChCount].pos.z = PlayerZ + siRand(10040);
- Characters[ChCount].pos.y = GetLandH(Characters[ChCount].pos.x,
- Characters[ChCount].pos.z);
- tr++;
- if (tr>10240) break;
- if (CheckPlaceCollisionP(Characters[ChCount].pos)) goto replace1;
- ResetCharacter(&Characters[ChCount]);
- if (Characters[ChCount].AI==AI_ARCHEO)
- Characters[ChCount].pos.y+=2048.f;
- Characters[ChCount].tgx = Characters[ChCount].pos.x;
- Characters[ChCount].tgz = Characters[ChCount].pos.z;
- Characters[ChCount].tgtime = 0;
-
- ChCount++;
- }
-
- int TC = 0;
- int TDi[10];
- TDi[0] = 10;
- for (c=10; c<20; c++)
- if (TargetDino & (1<<c)) TDi[TC++]=c;
-
- MC = 8 + OptDens/30 + rRand(6);
- tr = 0;
-
- //======== main =========//
- for (c=0; c<MC; c++) {
-
- if ((c<4) || (!TargetDino)) Characters[ChCount].CType = AI_to_CIndex[10] + rRand(6); else
- if (c<10) Characters[ChCount].CType = AI_to_CIndex[ TDi[c % (TC)] ];
- else Characters[ChCount].CType = AI_to_CIndex[ TDi[rRand(TC-1)] ];
- //Characters[ChCount].CType = AI_to_CIndex[ AI_BRONT+1];
- //Characters[ChCount].CType = AI_to_CIndex[10] + 7;//rRand(3);
- replace2:
- Characters[ChCount].pos.x = 512*256 + siRand(50*256)*10;
- Characters[ChCount].pos.z = 512*256 + siRand(50*256)*10;
- Characters[ChCount].pos.y = GetLandH(Characters[ChCount].pos.x,
- Characters[ChCount].pos.z);
- tr++;
- if (tr>10240) break;
- if ( fabs(Characters[ChCount].pos.x - PlayerX) +
- fabs(Characters[ChCount].pos.z - PlayerZ) < 256 * 40 )
- goto replace2;
-
- if (CheckPlaceCollisionP(Characters[ChCount].pos)) goto replace2;
- Characters[ChCount].tgx = Characters[ChCount].pos.x;
- Characters[ChCount].tgz = Characters[ChCount].pos.z;
- Characters[ChCount].tgtime = 0;
- ResetCharacter(&Characters[ChCount]);
- ChCount++;
- }
- PrintLog("\n");
- DemoPoint.DemoTime = 0;
- }
- void CreateChMorphedModel(TCharacter *cptr)
- {
- TAni *aptr = &cptr->pinfo->Animation[cptr->Phase];
- TAni *paptr = &cptr->pinfo->Animation[cptr->PrevPhase];
- int CurFrame, SplineD, PCurFrame, PSplineD;
- float scale = cptr->scale;
- CurFrame = ( (aptr->FramesCount-1) * cptr->FTime * 256) / aptr->AniTime;
- SplineD = CurFrame & 0xFF;
- CurFrame = (CurFrame>>8);
- BOOL PMorph = (cptr->Phase != cptr->PrevPhase) && (cptr->PPMorphTime < PMORPHTIME) && (MORPHP);
- if (PMorph) {
- PCurFrame = ( (paptr->FramesCount-1) * cptr->PrevPFTime * 256) / paptr->AniTime;
- PSplineD = PCurFrame & 0xFF;
- PCurFrame = (PCurFrame>>8);
- }
-
- if (!MORPHA) { SplineD = 0; PSplineD = 0; }
- float k1, k2, pk1, pk2, pmk1, pmk2;
- k2 = (float)(SplineD) / 256.f;
- k1 = 1.0f - k2;
- k1/=8.f; k2/=8.f;
- if (PMorph) {
- pk2 = (float)(PSplineD) / 256.f;
- pk1 = 1.0f - pk2;
- pk1/=8.f; pk2/=8.f;
- pmk1 = (float)cptr->PPMorphTime / PMORPHTIME;
- pmk2 = 1.f - pmk1;
- }
- int VCount = cptr->pinfo->mptr->VCount;
- short int* adptr = aptr->aniData + CurFrame*VCount*3;
- short int* padptr = paptr->aniData + PCurFrame*VCount*3;
- float sb = (float)f_sin(cptr->beta) * scale;
- float cb = (float)f_cos(cptr->beta) * scale;
- float sg = (float)f_sin(cptr->gamma);
- float cg = (float)f_cos(cptr->gamma);
- for (int v=0; v<VCount; v++) {
- float x = *(adptr+v*3+0) * k1 + *(adptr+(v+VCount)*3+0) * k2;
- float y = *(adptr+v*3+1) * k1 + *(adptr+(v+VCount)*3+1) * k2;
- float z = - (*(adptr+v*3+2) * k1 + *(adptr+(v+VCount)*3+2) * k2);
- if (PMorph) {
- float px = *(padptr+v*3+0) * pk1 + *(padptr+(v+VCount)*3+0) * pk2;
- float py = *(padptr+v*3+1) * pk1 + *(padptr+(v+VCount)*3+1) * pk2;
- float pz = - (*(padptr+v*3+2) * pk1 + *(padptr+(v+VCount)*3+2) * pk2);
- x = x*pmk1 + px* pmk2;
- y = y*pmk1 + py* pmk2;
- z = z*pmk1 + pz* pmk2;
- }
-
- float zz = z;
- float xx = cg * x - sg * y;
- float yy = cg * y + sg * x;
- //float fi = (z / 400) * (cptr->bend / 1.5f);
- float fi;
- if (z>0) {
- fi = z / 240.f;
- if (fi>1.f) fi=1.f;
- } else {
- fi = z / 380.f;
- if (fi<-1.f) fi=-1.f;
- }
-
- fi*=cptr->bend;
-
- float bendc = (float)f_cos(fi);
- float bends = (float)f_sin(fi);
-
- float bx = bendc * xx - bends * zz;
- float bz = bendc * zz + bends * xx;
- zz = bz;
- xx = bx;
-
- cptr->pinfo->mptr->gVertex[v].x = xx * scale;
- cptr->pinfo->mptr->gVertex[v].y = cb * yy - sb * zz;
- cptr->pinfo->mptr->gVertex[v].z = cb * zz + sb * yy;
- }
- }
- void CreateMorphedModel(TModel* mptr, TAni *aptr, int FTime, float scale)
- {
- int CurFrame = ((aptr->FramesCount-1) * FTime * 256) / aptr->AniTime;
- int SplineD = CurFrame & 0xFF;
- CurFrame = (CurFrame>>8);
- float k2 = (float)(SplineD) / 256.f;
- float k1 = 1.0f - k2;
- k1*=scale/8.f;
- k2*=scale/8.f;
-
- int VCount = mptr->VCount;
- short int* adptr = &(aptr->aniData[CurFrame*VCount*3]);
- for (int v=0; v<VCount; v++) {
- mptr->gVertex[v].x = *(adptr+v*3+0) * k1 + *(adptr+(v+VCount)*3+0) * k2;
- mptr->gVertex[v].y = *(adptr+v*3+1) * k1 + *(adptr+(v+VCount)*3+1) * k2;
- mptr->gVertex[v].z =- *(adptr+v*3+2) * k1 - *(adptr+(v+VCount)*3+2) * k2;
- }
- }
- void CreateMorphedObject(TModel* mptr, TVTL &vtl, int FTime)
- {
- int CurFrame = ((vtl.FramesCount-1) * FTime * 256) / vtl.AniTime;
- int SplineD = CurFrame & 0xFF;
- CurFrame = (CurFrame>>8);
- float k2 = (float)(SplineD) / 256.f;
- float k1 = 1.0f - k2;
- k1/=8.f; k2/=8.f;
-
- int VCount = mptr->VCount;
- short int* adptr = &(vtl.aniData[CurFrame*VCount*3]);
- for (int v=0; v<VCount; v++) {
- mptr->gVertex[v].x = *(adptr+v*3+0) * k1 + *(adptr+(v+VCount)*3+0) * k2;
- mptr->gVertex[v].y = *(adptr+v*3+1) * k1 + *(adptr+(v+VCount)*3+1) * k2;
- mptr->gVertex[v].z =- *(adptr+v*3+2) * k1 - *(adptr+(v+VCount)*3+2) * k2;
- }
- }
|