Characters.cpp 105 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690
  1. #include "Hunt.h"
  2. #include "stdio.h"
  3. BOOL NewPhase;
  4. #define fx_DIE 0
  5. //======= new ============//
  6. #define PIG_WALK 0
  7. #define PIG_RUN 1
  8. #define PIG_IDLE1 2
  9. #define PIG_IDLE2 3
  10. #define PIG_IDLE3 4
  11. #define PIG_DIE 5
  12. #define PIG_SLP 6
  13. #define DIM_FLY 0
  14. #define DIM_FLYP 1
  15. #define DIM_FALL 2
  16. #define DIM_DIE 3
  17. #define BRO_WALK 0
  18. #define BRO_RUN 1
  19. #define BRO_IDLE1 2
  20. #define BRO_IDLE2 3
  21. #define BRO_IDLE3 4
  22. #define BRO_DIE 5
  23. #define BRO_SLP 6
  24. #define DIA_WALK 0
  25. #define DIA_RUN 1
  26. #define DIA_SWIM 1
  27. #define DIA_IDLE1 2
  28. #define DIA_IDLE2 3
  29. #define DIA_JUMP 4
  30. #define DIA_SLIDE 5
  31. #define DIA_EAT 6
  32. #define DIA_DIE 7
  33. #define DIA_SLP 8
  34. #define DER_WALK 0
  35. #define DER_RUN 1
  36. #define DER_IDLE1 2
  37. #define DER_IDLE2 3
  38. #define DER_DIE 4
  39. #define DER_SLP 5
  40. #define MAM_WALK 0
  41. #define MAM_RUN 1
  42. #define MAM_IDLE1 2
  43. #define MAM_IDLE2 3
  44. #define MAM_DIE 4
  45. #define MAM_SLP 5
  46. //
  47. int CurDino;
  48. void SetNewTargetPlace(TCharacter *cptr, float R);
  49. void ProcessPrevPhase(TCharacter *cptr)
  50. {
  51. cptr->PPMorphTime+=TimeDt;
  52. if (cptr->PPMorphTime > PMORPHTIME) cptr->PrevPhase = cptr->Phase;
  53. cptr->PrevPFTime+=TimeDt;
  54. cptr->PrevPFTime %= cptr->pinfo->Animation[cptr->PrevPhase].AniTime;
  55. }
  56. void ActivateCharacterFx(TCharacter *cptr)
  57. {
  58. if (cptr->AI) //== not hunter ==//
  59. if (UNDERWATER) return;
  60. int fx = cptr->pinfo->Anifx[cptr->Phase];
  61. if (fx==-1) return;
  62. if ( VectorLength(SubVectors(PlayerPos, cptr->pos) ) > 68 * 256) return;
  63. AddVoice3d(cptr->pinfo->SoundFX[fx].length,
  64. cptr->pinfo->SoundFX[fx].lpData,
  65. cptr->pos.x,cptr->pos.y,cptr->pos.z);
  66. }
  67. void ResetCharacter(TCharacter *cptr)
  68. {
  69. cptr->AI = DinoInfo[cptr->CType].AI;
  70. cptr->pinfo = &ChInfo[cptr->CType];
  71. cptr->State = 0;
  72. cptr->StateF = 0;
  73. cptr->Phase = 0;
  74. cptr->FTime = 0;
  75. cptr->PrevPhase = 0;
  76. cptr->PrevPFTime = 0;
  77. cptr->PPMorphTime = 0;
  78. cptr->beta = 0;
  79. cptr->gamma = 0;
  80. cptr->tggamma = 0;
  81. cptr->bend = 0;
  82. cptr->rspeed = 0;
  83. cptr->AfraidTime = 0;
  84. cptr->BloodTTime = 0;
  85. cptr->BloodTime = 0;
  86. cptr->lookx = (float)f_cos(cptr->alpha);
  87. cptr->lookz = (float)f_sin(cptr->alpha);
  88. cptr->Health = DinoInfo[cptr->CType].Health0;
  89. if (OptAgres>128) cptr->Health= (cptr->Health*OptAgres)/128;
  90. cptr->scale = (float)(DinoInfo[cptr->CType].Scale0 + rRand(DinoInfo[cptr->CType].ScaleA)) / 1000.f;
  91. }
  92. void AddDeadBody(TCharacter *cptr, int phase)
  93. {
  94. if (!MyHealth) return;
  95. if (ExitTime)
  96. AddMessage("Transportation cancelled.");
  97. ExitTime = 0;
  98. OPTICMODE = FALSE;
  99. BINMODE = FALSE;
  100. Characters[ChCount].CType = 0;
  101. Characters[ChCount].alpha = CameraAlpha;
  102. ResetCharacter(&Characters[ChCount]);
  103. int v = rRand(3);
  104. if (phase != HUNT_BREATH)
  105. AddVoicev(fxScream[r].length, fxScream[r].lpData, 256);
  106. Characters[ChCount].Health = 0;
  107. MyHealth = 0;
  108. if (cptr) {
  109. float pl = 170;
  110. //if (cptr->AI==AI_SPINO) pl = 200.f;
  111. //if (cptr->AI==AI_CERAT) pl = 320.f;
  112. Characters[ChCount].pos.x = cptr->pos.x + cptr->lookx * pl * cptr->scale;
  113. Characters[ChCount].pos.z = cptr->pos.z + cptr->lookz * pl * cptr->scale;
  114. Characters[ChCount].pos.y = GetLandQH(Characters[ChCount].pos.x, Characters[ChCount].pos.z);
  115. } else {
  116. Characters[ChCount].pos.x = PlayerX;
  117. Characters[ChCount].pos.z = PlayerZ;
  118. Characters[ChCount].pos.y = PlayerY;
  119. }
  120. Characters[ChCount].Phase = phase;
  121. Characters[ChCount].PrevPhase = phase;
  122. ActivateCharacterFx(&Characters[ChCount]);
  123. DemoPoint.pos = Characters[ChCount].pos;
  124. DemoPoint.DemoTime = 1;
  125. DemoPoint.CIndex = ChCount;
  126. ChCount++;
  127. }
  128. float AngleDifference(float a, float b)
  129. {
  130. a-=b;
  131. a = (float)fabs(a);
  132. if (a > pi) a = 2*pi - a;
  133. return a;
  134. }
  135. float CorrectedAlpha(float a, float b)
  136. {
  137. float d = (float)fabs(a-b);
  138. if (d<pi) return (a+b)/2;
  139. else d = (a+pi*2-b);
  140. if (d<0) d+=2*pi;
  141. if (d>2*pi) d-=2*pi;
  142. return d;
  143. }
  144. void ThinkY_Beta_Gamma(TCharacter *cptr, float blook, float glook, float blim, float glim)
  145. {
  146. cptr->pos.y = GetLandH(cptr->pos.x, cptr->pos.z);
  147. //=== beta ===//
  148. float hlook = GetLandH(cptr->pos.x + cptr->lookx * blook, cptr->pos.z + cptr->lookz * blook);
  149. float hlook2 = GetLandH(cptr->pos.x - cptr->lookx * blook, cptr->pos.z - cptr->lookz * blook);
  150. DeltaFunc(cptr->beta, (hlook2 - hlook) / (blook * 3.2f), TimeDt / 800.f);
  151. if (cptr->beta > blim) cptr->beta = blim;
  152. if (cptr->beta <-blim) cptr->beta =-blim;
  153. //=== gamma ===//
  154. hlook = GetLandH(cptr->pos.x + cptr->lookz * glook, cptr->pos.z - cptr->lookx*glook);
  155. hlook2 = GetLandH(cptr->pos.x - cptr->lookz * glook, cptr->pos.z + cptr->lookx*glook);
  156. cptr->tggamma =(hlook - hlook2) / (glook * 3.2f);
  157. if (cptr->tggamma > glim) cptr->tggamma = glim;
  158. if (cptr->tggamma <-glim) cptr->tggamma =-glim;
  159. /*
  160. if (DEBUG) cptr->tggamma = 0;
  161. if (DEBUG) cptr->beta = 0;
  162. */
  163. }
  164. int CheckPlaceCollisionP(Vector3d &v)
  165. {
  166. int ccx = (int)v.x / 256;
  167. int ccz = (int)v.z / 256;
  168. if (ccx<4 || ccz<4 || ccx>1008 || ccz>1008) return 1;
  169. int F = (FMap[ccz][ccx-1] | FMap[ccz-1][ccx] | FMap[ccz-1][ccx-1] |
  170. FMap[ccz][ccx] |
  171. FMap[ccz+1][ccx] | FMap[ccz][ccx+1] | FMap[ccz+1][ccx+1]);
  172. if (F & (fmWater + fmNOWAY)) return 1;
  173. float h = GetLandH(v.x, v.z);
  174. v.y = h;
  175. float hh = GetLandH(v.x-164, v.z-164); if ( fabs(hh-h) > 160 ) return 1;
  176. hh = GetLandH(v.x+164, v.z-164); if ( fabs(hh-h) > 160 ) return 1;
  177. hh = GetLandH(v.x-164, v.z+164); if ( fabs(hh-h) > 160 ) return 1;
  178. hh = GetLandH(v.x+164, v.z+164); if ( fabs(hh-h) > 160 ) return 1;
  179. for (int z=-2; z<=2; z++)
  180. for (int x=-2; x<=2; x++)
  181. if (OMap[ccz+z][ccx+x]!=255) {
  182. int ob = OMap[ccz+z][ccx+x];
  183. if (MObjects[ob].info.Radius<10) continue;
  184. float CR = (float)MObjects[ob].info.Radius + 64;
  185. float oz = (ccz+z) * 256.f + 128.f;
  186. float ox = (ccx+x) * 256.f + 128.f;
  187. float r = (float) sqrt( (ox-v.x)*(ox-v.x) + (oz-v.z)*(oz-v.z) );
  188. if (r<CR) return 1;
  189. }
  190. return 0;
  191. }
  192. int CheckPlaceCollision(Vector3d &v, BOOL wc, BOOL mc)
  193. {
  194. int ccx = (int)v.x / 256;
  195. int ccz = (int)v.z / 256;
  196. if (ccx<4 || ccz<4 || ccx>1018 || ccz>1018) return 1;
  197. if (wc)
  198. if ( (FMap[ccz][ccx-1] | FMap[ccz-1][ccx] | FMap[ccz-1][ccx-1] |
  199. FMap[ccz][ccx] |
  200. FMap[ccz+1][ccx] | FMap[ccz][ccx+1] | FMap[ccz+1][ccx+1]) & fmWater)
  201. return 1;
  202. float h = GetLandH(v.x, v.z);
  203. if (! (FMap[ccz][ccx] & fmWater) )
  204. if (fabs(h - v.y) > 64) return 1;
  205. v.y = h;
  206. float hh = GetLandH(v.x-64, v.z-64); if ( fabs(hh-h) > 100 ) return 1;
  207. hh = GetLandH(v.x+64, v.z-64); if ( fabs(hh-h) > 100 ) return 1;
  208. hh = GetLandH(v.x-64, v.z+64); if ( fabs(hh-h) > 100 ) return 1;
  209. hh = GetLandH(v.x+64, v.z+64); if ( fabs(hh-h) > 100 ) return 1;
  210. if (mc)
  211. for (int z=-2; z<=2; z++)
  212. for (int x=-2; x<=2; x++)
  213. if (OMap[ccz+z][ccx+x]!=255) {
  214. int ob = OMap[ccz+z][ccx+x];
  215. if (MObjects[ob].info.Radius<10) continue;
  216. float CR = (float)MObjects[ob].info.Radius + 64;
  217. float oz = (ccz+z) * 256.f + 128.f;
  218. float ox = (ccx+x) * 256.f + 128.f;
  219. float r = (float) sqrt( (ox-v.x)*(ox-v.x) + (oz-v.z)*(oz-v.z) );
  220. if (r<CR) return 1;
  221. }
  222. return 0;
  223. }
  224. int CheckPlaceCollision2(Vector3d &v, BOOL wc)
  225. {
  226. int ccx = (int)v.x / 256;
  227. int ccz = (int)v.z / 256;
  228. if (ccx<4 || ccz<4 || ccx>1018 || ccz>1018) return 1;
  229. if (wc)
  230. if ( (FMap[ccz][ccx-1] | FMap[ccz-1][ccx] | FMap[ccz-1][ccx-1] |
  231. FMap[ccz][ccx] |
  232. FMap[ccz+1][ccx] | FMap[ccz][ccx+1] | FMap[ccz+1][ccx+1]) & fmWater)
  233. return 1;
  234. float h = GetLandH(v.x, v.z);
  235. /*if (! (FMap[ccz][ccx] & fmWater) )
  236. if (fabs(h - v.y) > 64) return 1;*/
  237. v.y = h;
  238. float hh = GetLandH(v.x-64, v.z-64); if ( fabs(hh-h) > 100 ) return 1;
  239. hh = GetLandH(v.x+64, v.z-64); if ( fabs(hh-h) > 100 ) return 1;
  240. hh = GetLandH(v.x-64, v.z+64); if ( fabs(hh-h) > 100 ) return 1;
  241. hh = GetLandH(v.x+64, v.z+64); if ( fabs(hh-h) > 100 ) return 1;
  242. return 0;
  243. }
  244. int CheckPossiblePath(TCharacter *cptr, BOOL wc, BOOL mc)
  245. {
  246. Vector3d p = cptr->pos;
  247. float lookx = (float)f_cos(cptr->tgalpha);
  248. float lookz = (float)f_sin(cptr->tgalpha);
  249. int c=0;
  250. for (int t=0; t<20; t++) {
  251. p.x+=lookx * 64.f;
  252. p.z+=lookz * 64.f;
  253. if (CheckPlaceCollision(p, wc, mc)) c++;
  254. }
  255. return c;
  256. }
  257. void LookForAWay(TCharacter *cptr, BOOL wc, BOOL mc)
  258. {
  259. float alpha = cptr->tgalpha;
  260. float dalpha = 15.f;
  261. float afound = alpha;
  262. int maxp = 16;
  263. int curp;
  264. if (!CheckPossiblePath(cptr, wc, mc)) { cptr->NoWayCnt=0; return; }
  265. cptr->NoWayCnt++;
  266. for (int i=0; i<12; i++) {
  267. cptr->tgalpha = alpha+dalpha*pi/180.f;
  268. curp=CheckPossiblePath(cptr, wc, mc) + (i>>1);
  269. if (!curp) return;
  270. if (curp<maxp) {
  271. maxp = curp;
  272. afound = cptr->tgalpha;
  273. }
  274. cptr->tgalpha = alpha-dalpha*pi/180.f;
  275. curp=CheckPossiblePath(cptr, wc, mc) + (i>>1);
  276. if (!curp) return;
  277. if (curp<maxp) {
  278. maxp = curp;
  279. afound = cptr->tgalpha;
  280. }
  281. dalpha+=15.f;
  282. }
  283. cptr->tgalpha = afound;
  284. }
  285. BOOL ReplaceCharacterForward(TCharacter *cptr)
  286. {
  287. float al = CameraAlpha + (float)siRand(2048) / 2048.f;
  288. float sa = (float)f_sin(al);
  289. float ca = (float)f_cos(al);
  290. Vector3d p;
  291. p.x = PlayerX + sa * (ctViewR+rRand(10))*256;
  292. p.z = PlayerZ - ca * (ctViewR+rRand(10))*256;
  293. p.y = GetLandH(p.x, p.z);
  294. if (p.x < 16*256) return FALSE;
  295. if (p.z < 16*256) return FALSE;
  296. if (p.x >1000*256) return FALSE;
  297. if (p.z >1000*256) return FALSE;
  298. if (CheckPlaceCollisionP(p)) return FALSE;
  299. cptr->State = 0;
  300. cptr->pos = p;
  301. //cptr->tgx = cptr->pos.x + siRand(2048);
  302. //cptr->tgz = cptr->pos.z + siRand(2048);
  303. SetNewTargetPlace(cptr, 2048);
  304. if (cptr->AI==AI_ARCHEO) //===== dimor ========//
  305. cptr->pos.y+=1048.f;
  306. return TRUE;
  307. }
  308. void Characters_AddSecondaryOne(int ctype)
  309. {
  310. if (ChCount>64) return;
  311. Characters[ChCount].CType = ctype;
  312. int tr = 0;
  313. replace1:
  314. tr++;
  315. if (tr>128) return;
  316. Characters[ChCount].pos.x = PlayerX + siRand(20040);
  317. Characters[ChCount].pos.z = PlayerZ + siRand(20040);
  318. Characters[ChCount].pos.y = GetLandH(Characters[ChCount].pos.x,
  319. Characters[ChCount].pos.z);
  320. if (CheckPlaceCollisionP(Characters[ChCount].pos)) goto replace1;
  321. if ( fabs(Characters[ChCount].pos.x - PlayerX) +
  322. fabs(Characters[ChCount].pos.z - PlayerZ) < 256 * 40 )
  323. goto replace1;
  324. Characters[ChCount].tgx = Characters[ChCount].pos.x;
  325. Characters[ChCount].tgz = Characters[ChCount].pos.z;
  326. Characters[ChCount].tgtime = 0;
  327. ResetCharacter(&Characters[ChCount]);
  328. ChCount++;
  329. }
  330. void MoveCharacter(TCharacter *cptr, float dx, float dz, BOOL wc, BOOL mc)
  331. {
  332. //return; //000000000000000000000000000000000000000000000
  333. //000000000000000000000000000000000000000000000
  334. //000000000000000000000000000000000000000000000//000000000000000000000000000000000000000000000//000000000000000000000000000000000000000000000
  335. Vector3d p = cptr->pos;
  336. if (CheckPlaceCollision2(p, wc)) {
  337. cptr->pos.x+=dx / 2;
  338. cptr->pos.z+=dz / 2;
  339. return;
  340. }
  341. p.x+=dx;
  342. p.z+=dz;
  343. if (!CheckPlaceCollision2(p, wc)) {
  344. cptr->pos = p;
  345. return;
  346. }
  347. p = cptr->pos;
  348. p.x+=dx/2;
  349. p.z+=dz/2;
  350. if (!CheckPlaceCollision2(p, wc)) cptr->pos = p;
  351. p = cptr->pos;
  352. p.x+=dx/4;
  353. //if (!CheckPlaceCollision2(p)) cptr->pos = p;
  354. p.z+=dz/4;
  355. //if (!CheckPlaceCollision2(p)) cptr->pos = p;
  356. cptr->pos = p;
  357. }
  358. void MoveCharacter2(TCharacter *cptr, float dx, float dz)
  359. {
  360. cptr->pos.x+=dx;
  361. cptr->pos.z+=dz;
  362. }
  363. void SetNewTargetPlace(TCharacter *cptr, float R)
  364. {
  365. Vector3d p;
  366. int tr = 0;
  367. replace:
  368. p.x = cptr->pos.x + siRand((int)R); if (p.x<512) p.x = 512; if (p.x>1018*256) p.x = 1018*256;
  369. p.z = cptr->pos.z + siRand((int)R); if (p.z<512) p.z = 512; if (p.z>1018*256) p.z = 1018*256;
  370. p.y = GetLandH(p.x, p.z);
  371. tr++;
  372. if (tr<128)
  373. if ( fabs(p.x - cptr->pos.x) + fabs(p.z - cptr->pos.z) < R / 2.f) goto replace;
  374. R+=512;
  375. if (tr<256)
  376. if (CheckPlaceCollisionP(p)) goto replace;
  377. cptr->tgtime = 0;
  378. cptr->tgx = p.x;
  379. cptr->tgz = p.z;
  380. }
  381. void SetNewTargetPlace_Brahi(TCharacter *cptr, float R)
  382. {
  383. Vector3d p;
  384. int tr = 0;
  385. replace:
  386. p.x = cptr->pos.x + siRand((int)R); if (p.x<512) p.x = 512; if (p.x>1018*256) p.x = 1018*256;
  387. p.z = cptr->pos.z + siRand((int)R); if (p.z<512) p.z = 512; if (p.z>1018*256) p.z = 1018*256;
  388. tr++;
  389. if (tr<16)
  390. if ( fabs(p.x - cptr->pos.x) + fabs(p.z - cptr->pos.z) < R / 2.f) goto replace;
  391. p.y = GetLandH(p.x, p.z);
  392. float wy = GetLandUpH(p.x, p.z) - p.y;
  393. if (tr<128) {
  394. if (wy > 400) goto replace;
  395. if (wy < 200) goto replace;
  396. }
  397. cptr->tgtime = 0;
  398. cptr->tgx = p.x;
  399. cptr->tgz = p.z;
  400. }
  401. void AnimateHuntDead(TCharacter *cptr)
  402. {
  403. //if (!cptr->FTime) ActivateCharacterFx(cptr);
  404. ProcessPrevPhase(cptr);
  405. BOOL NewPhase = FALSE;
  406. cptr->FTime+=TimeDt;
  407. if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime) {
  408. NewPhase = TRUE;
  409. if (cptr->Phase==2)
  410. cptr->FTime = cptr->pinfo->Animation[cptr->Phase].AniTime-1;
  411. else
  412. cptr->FTime = 0;
  413. if (cptr->Phase==1) {
  414. cptr->FTime=0;
  415. cptr->Phase=2;
  416. }
  417. ActivateCharacterFx(cptr);
  418. }
  419. float h = GetLandH(cptr->pos.x, cptr->pos.z);
  420. DeltaFunc(cptr->pos.y, h, TimeDt / 5.f);
  421. if (cptr->Phase==2)
  422. if (cptr->pos.y > h+3) {
  423. cptr->FTime = 0;
  424. //MessageBeep(0xFFFFFFFF);
  425. }
  426. if (cptr->pos.y < h + 256) {
  427. //=== beta ===//
  428. float blook = 256;
  429. float hlook = GetLandH(cptr->pos.x + cptr->lookx * blook, cptr->pos.z + cptr->lookz * blook);
  430. float hlook2 = GetLandH(cptr->pos.x - cptr->lookx * blook, cptr->pos.z - cptr->lookz * blook);
  431. DeltaFunc(cptr->beta, (hlook2 - hlook) / (blook * 3.2f), TimeDt / 1800.f);
  432. if (cptr->beta > 0.4f) cptr->beta = 0.4f;
  433. if (cptr->beta <-0.4f) cptr->beta =-0.4f;
  434. //=== gamma ===//
  435. float glook = 256;
  436. hlook = GetLandH(cptr->pos.x + cptr->lookz * glook, cptr->pos.z - cptr->lookx*glook);
  437. hlook2 = GetLandH(cptr->pos.x - cptr->lookz * glook, cptr->pos.z + cptr->lookx*glook);
  438. cptr->tggamma =(hlook - hlook2) / (glook * 3.2f);
  439. if (cptr->tggamma > 0.4f) cptr->tggamma = 0.4f;
  440. if (cptr->tggamma <-0.4f) cptr->tggamma =-0.4f;
  441. DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 1800.f);
  442. }
  443. TCharacter *cptr2 = &Characters[DemoPoint.CIndex];
  444. }
  445. void AnimateDiatrDead(TCharacter *cptr)
  446. {
  447. if (cptr->Phase!=DIA_DIE && cptr->Phase!=DIA_SLP) {
  448. if (cptr->PPMorphTime>128) {
  449. cptr->PrevPhase = cptr->Phase;
  450. cptr->PrevPFTime = cptr->FTime;
  451. cptr->PPMorphTime = 0; }
  452. cptr->FTime = 0;
  453. cptr->Phase = DIA_DIE;
  454. ActivateCharacterFx(cptr);
  455. } else {
  456. ProcessPrevPhase(cptr);
  457. cptr->FTime+=TimeDt;
  458. if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime)
  459. if (Tranq) {
  460. cptr->FTime=0;
  461. cptr->Phase = DIA_SLP;
  462. ActivateCharacterFx(cptr);
  463. } else
  464. cptr->FTime = cptr->pinfo->Animation[cptr->Phase].AniTime-1;
  465. }
  466. //======= movement ===========//
  467. DeltaFunc(cptr->vspeed, 0, TimeDt / 800.f);
  468. cptr->pos.x+=cptr->lookx * cptr->vspeed * TimeDt;
  469. cptr->pos.z+=cptr->lookz * cptr->vspeed * TimeDt;
  470. ThinkY_Beta_Gamma(cptr, 100, 96, 0.6f, 0.5f);
  471. DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 1600.f);
  472. }
  473. void AnimatePigDead(TCharacter *cptr)
  474. {
  475. if (cptr->Phase!=PIG_DIE && cptr->Phase!=PIG_SLP) {
  476. if (cptr->PPMorphTime>128) {
  477. cptr->PrevPhase = cptr->Phase;
  478. cptr->PrevPFTime = cptr->FTime;
  479. cptr->PPMorphTime = 0; }
  480. cptr->FTime = 0;
  481. cptr->Phase = PIG_DIE;
  482. ActivateCharacterFx(cptr);
  483. } else {
  484. ProcessPrevPhase(cptr);
  485. cptr->FTime+=TimeDt;
  486. if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime)
  487. if (Tranq) {
  488. cptr->FTime=0;
  489. cptr->Phase = PIG_SLP;
  490. ActivateCharacterFx(cptr);
  491. } else
  492. cptr->FTime = cptr->pinfo->Animation[cptr->Phase].AniTime-1;
  493. }
  494. //======= movement ===========//
  495. DeltaFunc(cptr->vspeed, 0, TimeDt / 800.f);
  496. cptr->pos.x+=cptr->lookx * cptr->vspeed * TimeDt;
  497. cptr->pos.z+=cptr->lookz * cptr->vspeed * TimeDt;
  498. ThinkY_Beta_Gamma(cptr, 100, 96, 0.6f, 0.5f);
  499. DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 1600.f);
  500. }
  501. void AnimateDimorDead(TCharacter *cptr)
  502. {
  503. if (cptr->Phase!=DIM_FALL && cptr->Phase!=DIM_DIE) {
  504. if (cptr->PPMorphTime>128) {
  505. cptr->PrevPhase = cptr->Phase;
  506. cptr->PrevPFTime = cptr->FTime;
  507. cptr->PPMorphTime = 0; }
  508. cptr->FTime = 0;
  509. cptr->Phase = DIM_FALL;
  510. cptr->rspeed = 0;
  511. ActivateCharacterFx(cptr);
  512. return;
  513. }
  514. ProcessPrevPhase(cptr);
  515. cptr->FTime+=TimeDt;
  516. if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime)
  517. if (cptr->Phase == DIM_DIE)
  518. cptr->FTime = cptr->pinfo->Animation[cptr->Phase].AniTime-1;
  519. else
  520. cptr->FTime%= cptr->pinfo->Animation[cptr->Phase].AniTime;
  521. //======= movement ===========//
  522. if (cptr->Phase == DIM_DIE)
  523. DeltaFunc(cptr->vspeed, 0, TimeDt / 400.f);
  524. else
  525. DeltaFunc(cptr->vspeed, 0, TimeDt / 1200.f);
  526. cptr->pos.x+=cptr->lookx * cptr->vspeed * TimeDt;
  527. cptr->pos.z+=cptr->lookz * cptr->vspeed * TimeDt;
  528. if (cptr->Phase == DIM_FALL) {
  529. float wh = GetLandUpH(cptr->pos.x, cptr->pos.z);
  530. float lh = GetLandH (cptr->pos.x, cptr->pos.z);
  531. BOOL OnWater = (wh > lh);
  532. if (OnWater)
  533. if (cptr->pos.y>=wh && (cptr->pos.y+cptr->rspeed * TimeDt / 1024) <wh) {
  534. AddWCircle(cptr->pos.x+siRand(128), cptr->pos.z+siRand(128), 2.0);
  535. AddWCircle(cptr->pos.x+siRand(128), cptr->pos.z+siRand(128), 2.5);
  536. AddWCircle(cptr->pos.x+siRand(128), cptr->pos.z+siRand(128), 3.0);
  537. AddWCircle(cptr->pos.x+siRand(128), cptr->pos.z+siRand(128), 3.5);
  538. AddWCircle(cptr->pos.x+siRand(128), cptr->pos.z+siRand(128), 3.0);
  539. }
  540. cptr->pos.y+=cptr->rspeed * TimeDt / 1024;
  541. cptr->rspeed-=TimeDt*2.56f;
  542. if (cptr->pos.y<lh) {
  543. cptr->pos.y = lh;
  544. if (OnWater) {
  545. AddElements(cptr->pos.x+siRand(128), lh, cptr->pos.z+siRand(128), 4, 10);
  546. AddElements(cptr->pos.x+siRand(128), lh, cptr->pos.z+siRand(128), 4, 10);
  547. AddElements(cptr->pos.x+siRand(128), lh, cptr->pos.z+siRand(128), 4, 10);
  548. }
  549. if (cptr->PPMorphTime>128) {
  550. cptr->PrevPhase = cptr->Phase;
  551. cptr->PrevPFTime = cptr->FTime;
  552. cptr->PPMorphTime = 0; }
  553. cptr->Phase = DIM_DIE;
  554. cptr->FTime = 0;
  555. ActivateCharacterFx(cptr);
  556. }
  557. } else {
  558. ThinkY_Beta_Gamma(cptr, 140, 126, 0.6f, 0.5f);
  559. DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 1600.f);
  560. }
  561. }
  562. void AnimateBronDead(TCharacter *cptr)
  563. {
  564. if (cptr->Phase!=BRO_DIE && cptr->Phase!=BRO_SLP) {
  565. if (cptr->PPMorphTime>128) {
  566. cptr->PrevPhase = cptr->Phase;
  567. cptr->PrevPFTime = cptr->FTime;
  568. cptr->PPMorphTime = 0; }
  569. cptr->FTime = 0;
  570. cptr->Phase = BRO_DIE;
  571. ActivateCharacterFx(cptr);
  572. } else {
  573. ProcessPrevPhase(cptr);
  574. cptr->FTime+=TimeDt;
  575. if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime)
  576. if (Tranq) {
  577. cptr->FTime=0;
  578. cptr->Phase = BRO_SLP;
  579. ActivateCharacterFx(cptr);
  580. } else
  581. cptr->FTime = cptr->pinfo->Animation[cptr->Phase].AniTime-1;
  582. }
  583. //======= movement ===========//
  584. DeltaFunc(cptr->vspeed, 0, TimeDt / 800.f);
  585. cptr->pos.x+=cptr->lookx * cptr->vspeed * TimeDt;
  586. cptr->pos.z+=cptr->lookz * cptr->vspeed * TimeDt;
  587. ThinkY_Beta_Gamma(cptr, 100, 96, 0.6f, 0.5f);
  588. DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 1600.f);
  589. }
  590. void AnimateHogDead(TCharacter *cptr)
  591. {
  592. if (cptr->Phase!=BRO_DIE && cptr->Phase!=BRO_SLP) {
  593. if (cptr->PPMorphTime>128) {
  594. cptr->PrevPhase = cptr->Phase;
  595. cptr->PrevPFTime = cptr->FTime;
  596. cptr->PPMorphTime = 0; }
  597. cptr->FTime = 0;
  598. cptr->Phase = BRO_DIE;
  599. ActivateCharacterFx(cptr);
  600. } else {
  601. ProcessPrevPhase(cptr);
  602. cptr->FTime+=TimeDt;
  603. if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime)
  604. if (Tranq) {
  605. cptr->FTime=0;
  606. cptr->Phase = BRO_SLP;
  607. ActivateCharacterFx(cptr);
  608. } else
  609. cptr->FTime = cptr->pinfo->Animation[cptr->Phase].AniTime-1;
  610. }
  611. //======= movement ===========//
  612. DeltaFunc(cptr->vspeed, 0, TimeDt / 800.f);
  613. cptr->pos.x+=cptr->lookx * cptr->vspeed * TimeDt;
  614. cptr->pos.z+=cptr->lookz * cptr->vspeed * TimeDt;
  615. ThinkY_Beta_Gamma(cptr, 100, 96, 0.6f, 0.5f);
  616. DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 1600.f);
  617. }
  618. void AnimateRhinoDead(TCharacter *cptr)
  619. {
  620. if (cptr->Phase!=BRO_DIE && cptr->Phase!=BRO_SLP) {
  621. if (cptr->PPMorphTime>128) {
  622. cptr->PrevPhase = cptr->Phase;
  623. cptr->PrevPFTime = cptr->FTime;
  624. cptr->PPMorphTime = 0; }
  625. cptr->FTime = 0;
  626. cptr->Phase = BRO_DIE;
  627. ActivateCharacterFx(cptr);
  628. } else {
  629. ProcessPrevPhase(cptr);
  630. cptr->FTime+=TimeDt;
  631. if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime)
  632. if (Tranq) {
  633. cptr->FTime=0;
  634. cptr->Phase = BRO_SLP;
  635. ActivateCharacterFx(cptr);
  636. } else
  637. cptr->FTime = cptr->pinfo->Animation[cptr->Phase].AniTime-1;
  638. }
  639. //======= movement ===========//
  640. DeltaFunc(cptr->vspeed, 0, TimeDt / 800.f);
  641. cptr->pos.x+=cptr->lookx * cptr->vspeed * TimeDt;
  642. cptr->pos.z+=cptr->lookz * cptr->vspeed * TimeDt;
  643. ThinkY_Beta_Gamma(cptr, 100, 96, 0.6f, 0.5f);
  644. DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 1600.f);
  645. }
  646. void AnimateSmiloDead(TCharacter *cptr)
  647. {
  648. if (cptr->Phase!=BRO_DIE && cptr->Phase!=BRO_SLP) {
  649. if (cptr->PPMorphTime>128) {
  650. cptr->PrevPhase = cptr->Phase;
  651. cptr->PrevPFTime = cptr->FTime;
  652. cptr->PPMorphTime = 0; }
  653. cptr->FTime = 0;
  654. cptr->Phase = BRO_DIE;
  655. ActivateCharacterFx(cptr);
  656. } else {
  657. ProcessPrevPhase(cptr);
  658. cptr->FTime+=TimeDt;
  659. if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime)
  660. if (Tranq) {
  661. cptr->FTime=0;
  662. cptr->Phase = BRO_SLP;
  663. ActivateCharacterFx(cptr);
  664. } else
  665. cptr->FTime = cptr->pinfo->Animation[cptr->Phase].AniTime-1;
  666. }
  667. //======= movement ===========//
  668. DeltaFunc(cptr->vspeed, 0, TimeDt / 800.f);
  669. cptr->pos.x+=cptr->lookx * cptr->vspeed * TimeDt;
  670. cptr->pos.z+=cptr->lookz * cptr->vspeed * TimeDt;
  671. ThinkY_Beta_Gamma(cptr, 100, 96, 0.6f, 0.5f);
  672. DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 1600.f);
  673. }
  674. void AnimateDeerDead(TCharacter *cptr)
  675. {
  676. if (cptr->Phase!=DER_DIE && cptr->Phase!=DER_SLP) {
  677. if (cptr->PPMorphTime>128) {
  678. cptr->PrevPhase = cptr->Phase;
  679. cptr->PrevPFTime = cptr->FTime;
  680. cptr->PPMorphTime = 0; }
  681. cptr->FTime = 0;
  682. cptr->Phase = DER_DIE;
  683. ActivateCharacterFx(cptr);
  684. } else {
  685. ProcessPrevPhase(cptr);
  686. cptr->FTime+=TimeDt;
  687. if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime)
  688. if (Tranq) {
  689. cptr->FTime=0;
  690. cptr->Phase = DER_SLP;
  691. ActivateCharacterFx(cptr);
  692. } else
  693. cptr->FTime = cptr->pinfo->Animation[cptr->Phase].AniTime-1;
  694. }
  695. //======= movement ===========//
  696. DeltaFunc(cptr->vspeed, 0, TimeDt / 800.f);
  697. cptr->pos.x+=cptr->lookx * cptr->vspeed * TimeDt;
  698. cptr->pos.z+=cptr->lookz * cptr->vspeed * TimeDt;
  699. ThinkY_Beta_Gamma(cptr, 100, 96, 0.6f, 0.5f);
  700. DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 1600.f);
  701. }
  702. void AnimateDiatr(TCharacter *cptr)
  703. {
  704. NewPhase = FALSE;
  705. int _Phase = cptr->Phase;
  706. int _FTime = cptr->FTime;
  707. float _tgalpha = cptr->tgalpha;
  708. TBEGIN:
  709. float targetx = cptr->tgx;
  710. float targetz = cptr->tgz;
  711. float targetdx = targetx - cptr->pos.x;
  712. float targetdz = targetz - cptr->pos.z;
  713. float tdist = (float)sqrt( targetdx * targetdx + targetdz * targetdz );
  714. float playerdx = PlayerX - cptr->pos.x - cptr->lookx * 108;
  715. float playerdz = PlayerZ - cptr->pos.z - cptr->lookz * 108;
  716. float pdist = (float)sqrt( playerdx * playerdx + playerdz * playerdz );
  717. if (cptr->State==2) { if (cptr->Phase!=DIA_JUMP) NewPhase=TRUE; cptr->State=1; cptr->Phase=DIA_RUN;}
  718. if (GetLandUpH(cptr->pos.x, cptr->pos.z) - GetLandH(cptr->pos.x, cptr->pos.z) > 140 * cptr->scale)
  719. cptr->StateF |= csONWATER; else
  720. cptr->StateF &= (!csONWATER);
  721. if (cptr->Phase == DIA_EAT) goto NOTHINK;
  722. //============================================//
  723. if (!MyHealth) cptr->State = 0;
  724. if (cptr->State) {
  725. if (pdist > ctViewR*140+OptAgres/8) {
  726. nv.x = playerdx; nv.z = playerdz; nv.y = 0;
  727. NormVector(nv, 2048.f);
  728. cptr->tgx = cptr->pos.x - nv.x;
  729. cptr->tgz = cptr->pos.z - nv.z;
  730. cptr->tgtime = 0;
  731. cptr->AfraidTime-=TimeDt;
  732. if (cptr->AfraidTime<=0) {
  733. cptr->AfraidTime=0; cptr->State = 0;
  734. }
  735. } else {
  736. cptr->tgx = PlayerX;
  737. cptr->tgz = PlayerZ;
  738. cptr->tgtime = 0;
  739. }
  740. if (!(cptr->StateF & csONWATER))
  741. if (pdist<1324 * cptr->scale && pdist>900 * cptr->scale)
  742. if (AngleDifference(cptr->alpha, FindVectorAlpha(playerdx, playerdz)) < 0.2f)
  743. cptr->Phase = DIA_JUMP;
  744. if (pdist<300)
  745. if (fabs(PlayerY - cptr->pos.y - 120) < 256) {
  746. if (!(cptr->StateF & csONWATER)) {
  747. cptr->vspeed/= 8.0f;
  748. cptr->State = 1;
  749. cptr->Phase = DIA_EAT;
  750. }
  751. AddDeadBody(cptr, HUNT_EAT);
  752. }
  753. }
  754. if (!cptr->State) {
  755. cptr->AfraidTime = 0;
  756. if (tdist<456) {
  757. SetNewTargetPlace(cptr, 8048.f);
  758. goto TBEGIN; }
  759. }
  760. NOTHINK:
  761. if (pdist<2048) cptr->NoFindCnt = 0;
  762. if (cptr->NoFindCnt) cptr->NoFindCnt--; else
  763. {
  764. cptr->tgalpha = CorrectedAlpha(FindVectorAlpha(targetdx, targetdz), cptr->alpha);//FindVectorAlpha(targetdx, targetdz);
  765. if (cptr->State && pdist>1648) {
  766. cptr->tgalpha += (float)f_sin(RealTime/824.f) / 4.f;
  767. if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
  768. if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
  769. }
  770. }
  771. LookForAWay(cptr, FALSE, TRUE);
  772. if (cptr->NoWayCnt>12) { cptr->NoWayCnt=0; cptr->NoFindCnt = 16 + rRand(20); }
  773. if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
  774. if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
  775. //===============================================//
  776. ProcessPrevPhase(cptr);
  777. //======== select new phase =======================//
  778. cptr->FTime+=TimeDt;
  779. if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime) {
  780. cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
  781. NewPhase = TRUE; }
  782. if (cptr->Phase==DIA_EAT) goto ENDPSELECT;
  783. if (NewPhase && _Phase==DIA_JUMP) { cptr->Phase = DIA_RUN; goto ENDPSELECT; }
  784. if (cptr->Phase== DIA_JUMP) goto ENDPSELECT;
  785. if (NewPhase)
  786. if (!cptr->State)
  787. if (rRand(128)>110) {
  788. cptr->Phase = DIA_IDLE1 + rRand(1);
  789. goto ENDPSELECT;
  790. } else cptr->Phase = DIA_WALK; else cptr->Phase = DIA_RUN;
  791. if (cptr->Phase!=DIA_IDLE1 && cptr->Phase!=DIA_IDLE2)
  792. if (!cptr->State) cptr->Phase=DIA_WALK; else
  793. if (fabs(cptr->tgalpha - cptr->alpha)<1.0 ||
  794. fabs(cptr->tgalpha - cptr->alpha)>2*pi-1.0)
  795. cptr->Phase = DIA_RUN; else cptr->Phase=DIA_WALK;
  796. if (cptr->StateF & csONWATER) cptr->Phase = DIA_SWIM;
  797. if (cptr->Slide>40) cptr->Phase = DIA_SLIDE;
  798. ENDPSELECT:
  799. //====== process phase changing ===========//
  800. if ( (_Phase != cptr->Phase) || NewPhase)
  801. ActivateCharacterFx(cptr);
  802. if (_Phase != cptr->Phase) {
  803. //==== set proportional FTime for better morphing =//
  804. if (MORPHP)
  805. if (_Phase<=3 && cptr->Phase<=3)
  806. cptr->FTime = _FTime * cptr->pinfo->Animation[cptr->Phase].AniTime / cptr->pinfo->Animation[_Phase].AniTime + 64;
  807. else if (!NewPhase) cptr->FTime = 0;
  808. if (cptr->PPMorphTime>128) {
  809. cptr->PrevPhase = _Phase;
  810. cptr->PrevPFTime = _FTime;
  811. cptr->PPMorphTime = 0; }
  812. }
  813. cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
  814. //========== rotation to tgalpha ===================//
  815. float rspd, currspeed, tgbend;
  816. float dalpha = (float)fabs(cptr->tgalpha - cptr->alpha);
  817. float drspd = dalpha; if (drspd>pi) drspd = 2*pi - drspd;
  818. if (cptr->Phase==DIA_JUMP || cptr->Phase==DIA_EAT ||
  819. cptr->Phase==DIA_IDLE1 || cptr->Phase==DIA_IDLE2) goto SKIPROT;
  820. if (drspd > 0.02)
  821. if (cptr->tgalpha > cptr->alpha) currspeed = 0.6f + drspd*1.2f;
  822. else currspeed =-0.6f - drspd*1.2f;
  823. else currspeed = 0;
  824. if (cptr->AfraidTime) currspeed*=2.5;
  825. if (dalpha > pi) currspeed*=-1;
  826. if ((cptr->StateF & csONWATER) || cptr->Phase==DIA_WALK) currspeed/=1.4f;
  827. if (cptr->AfraidTime) DeltaFunc(cptr->rspeed, currspeed, (float)TimeDt / 160.f);
  828. else DeltaFunc(cptr->rspeed, currspeed, (float)TimeDt / 180.f);
  829. tgbend = drspd/3;
  830. if (tgbend>pi/5) tgbend = pi/5;
  831. tgbend*= SGN(currspeed);
  832. if (fabs(tgbend) > fabs(cptr->bend)) DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 800.f);
  833. else DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 600.f);
  834. rspd=cptr->rspeed * TimeDt / 1024.f;
  835. if (drspd < fabs(rspd)) cptr->alpha = cptr->tgalpha;
  836. else cptr->alpha+=rspd;
  837. if (cptr->alpha > pi * 2) cptr->alpha-= pi * 2;
  838. if (cptr->alpha < 0 ) cptr->alpha+= pi * 2;
  839. SKIPROT:
  840. //======= set slide mode ===========//
  841. if (!cptr->Slide && cptr->vspeed>0.6 && cptr->Phase!=DIA_JUMP)
  842. if (AngleDifference(cptr->tgalpha, cptr->alpha)>pi*2/3.f) {
  843. cptr->Slide = (int)(cptr->vspeed*700.f);
  844. cptr->slidex = cptr->lookx;
  845. cptr->slidez = cptr->lookz;
  846. cptr->vspeed = 0;
  847. }
  848. //========== movement ==============================//
  849. cptr->lookx = (float)f_cos(cptr->alpha);
  850. cptr->lookz = (float)f_sin(cptr->alpha);
  851. float curspeed = 0;
  852. if (cptr->Phase == DIA_RUN ) curspeed = 0.640*2;
  853. if (cptr->Phase == DIA_JUMP) curspeed = 0.600*2;
  854. if (cptr->Phase == DIA_WALK) curspeed = 0.224*2;
  855. if (cptr->Phase == DIA_SWIM) curspeed = 0.300*2;
  856. if (cptr->Phase == DIA_EAT) curspeed = 0.0f;
  857. if (cptr->Phase == DIA_RUN && cptr->Slide) {
  858. curspeed /= 8;
  859. if (drspd > pi / 2.f) curspeed=0; else
  860. if (drspd > pi / 4.f) curspeed*=2.f - 4.f*drspd / pi;
  861. } else
  862. if (drspd > pi / 2.f) curspeed*=2.f - 2.f*drspd / pi;
  863. //========== process speed =============//
  864. DeltaFunc(cptr->vspeed, curspeed, TimeDt / 500.f);
  865. if (cptr->Phase==DIA_JUMP) cptr->vspeed = 1.1f;
  866. MoveCharacter(cptr, cptr->lookx * cptr->vspeed * TimeDt * cptr->scale,
  867. cptr->lookz * cptr->vspeed * TimeDt * cptr->scale, FALSE, TRUE);
  868. //========== slide ==============//
  869. if (cptr->Slide) {
  870. MoveCharacter(cptr, cptr->slidex * cptr->Slide / 600.f * TimeDt * cptr->scale,
  871. cptr->slidez * cptr->Slide / 600.f * TimeDt * cptr->scale, FALSE, TRUE);
  872. cptr->Slide-=TimeDt;
  873. if (cptr->Slide<0) cptr->Slide=0;
  874. }
  875. //============ Y movement =================//
  876. if (cptr->StateF & csONWATER) {
  877. cptr->pos.y = GetLandUpH(cptr->pos.x, cptr->pos.z) - 160 * cptr->scale;
  878. cptr->beta/=2;
  879. cptr->tggamma=0;
  880. } else {
  881. ThinkY_Beta_Gamma(cptr, 98, 84, 0.4f, 0.3f);
  882. }
  883. //=== process to tggamma ===//
  884. if (cptr->Phase==DIA_WALK) cptr->tggamma+= cptr->rspeed / 9.0f;
  885. else cptr->tggamma+= cptr->rspeed / 6.0f;
  886. if (cptr->Phase==DIA_JUMP) cptr->tggamma=0;
  887. DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 1624.f);
  888. //==================================================//
  889. }
  890. void AnimatePig(TCharacter *cptr)
  891. {
  892. NewPhase = FALSE;
  893. int _Phase = cptr->Phase;
  894. int _FTime = cptr->FTime;
  895. float _tgalpha = cptr->tgalpha;
  896. if (cptr->AfraidTime) cptr->AfraidTime = max(0, cptr->AfraidTime - TimeDt);
  897. if (cptr->State==2) { NewPhase=TRUE; cptr->State=1; }
  898. TBEGIN:
  899. float targetx = cptr->tgx;
  900. float targetz = cptr->tgz;
  901. float targetdx = targetx - cptr->pos.x;
  902. float targetdz = targetz - cptr->pos.z;
  903. float tdist = (float)sqrt( targetdx * targetdx + targetdz * targetdz );
  904. float playerdx = PlayerX - cptr->pos.x;
  905. float playerdz = PlayerZ - cptr->pos.z;
  906. float pdist = (float)sqrt( playerdx * playerdx + playerdz * playerdz );
  907. //=========== run away =================//
  908. if (cptr->State) {
  909. if (!cptr->AfraidTime) {
  910. if (pdist<2048.f) cptr->AfraidTime = (5 + rRand(5)) * 1024;
  911. if (!cptr->AfraidTime)
  912. if (pdist > 4096.f) {
  913. cptr->State = 0;
  914. SetNewTargetPlace(cptr, 2048.f);
  915. goto TBEGIN; }
  916. }
  917. nv.x = playerdx; nv.z = playerdz; nv.y = 0;
  918. NormVector(nv, 2048.f);
  919. cptr->tgx = cptr->pos.x - nv.x;
  920. cptr->tgz = cptr->pos.z - nv.z;
  921. cptr->tgtime = 0;
  922. }
  923. if (pdist>(ctViewR+20)*256)
  924. if (ReplaceCharacterForward(cptr)) goto TBEGIN;
  925. //======== exploring area ===============//
  926. if (!cptr->State) {
  927. cptr->AfraidTime = 0;
  928. if (pdist<812.f) {
  929. cptr->State = 1;
  930. cptr->AfraidTime = (5 + rRand(5)) * 1024;
  931. cptr->Phase = PIG_RUN;
  932. goto TBEGIN; }
  933. if (tdist<456) {
  934. SetNewTargetPlace(cptr, 2048.f);
  935. goto TBEGIN; }
  936. }
  937. //============================================//
  938. if (cptr->NoFindCnt) cptr->NoFindCnt--;
  939. else cptr->tgalpha = CorrectedAlpha(FindVectorAlpha(targetdx, targetdz), cptr->alpha);//FindVectorAlpha(targetdx, targetdz);
  940. LookForAWay(cptr, TRUE, TRUE);
  941. if (cptr->NoWayCnt>8) { cptr->NoWayCnt=0; cptr->NoFindCnt = 8 + rRand(80); }
  942. if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
  943. if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
  944. //===============================================//
  945. ProcessPrevPhase(cptr);
  946. //======== select new phase =======================//
  947. cptr->FTime+=TimeDt;
  948. if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime) {
  949. cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
  950. NewPhase = TRUE; }
  951. if (NewPhase)
  952. if (!cptr->State) {
  953. if (cptr->Phase == PIG_IDLE1 || cptr->Phase == PIG_IDLE2 || cptr->Phase == PIG_IDLE3) {
  954. if (rRand(128)>96) cptr->Phase = PIG_WALK;
  955. else cptr->Phase = PIG_IDLE1 + rRand(2);
  956. goto ENDPSELECT;
  957. }
  958. if (rRand(128) > 120) cptr->Phase=PIG_IDLE1; else cptr->Phase=PIG_WALK;
  959. } else
  960. if (cptr->AfraidTime) cptr->Phase = PIG_RUN;
  961. else cptr->Phase = PIG_WALK;
  962. ENDPSELECT:
  963. //====== process phase changing ===========//
  964. if ( (_Phase != cptr->Phase) || NewPhase)
  965. ActivateCharacterFx(cptr);
  966. if (_Phase != cptr->Phase) {
  967. if (_Phase<=1 && cptr->Phase<=1)
  968. cptr->FTime = _FTime * cptr->pinfo->Animation[cptr->Phase].AniTime / cptr->pinfo->Animation[_Phase].AniTime + 64;
  969. else if (!NewPhase) cptr->FTime = 0;
  970. if (cptr->PPMorphTime>128) {
  971. cptr->PrevPhase = _Phase;
  972. cptr->PrevPFTime = _FTime;
  973. cptr->PPMorphTime = 0; }
  974. }
  975. cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
  976. //========== rotation to tgalpha ===================//
  977. float rspd, currspeed, tgbend;
  978. float dalpha = (float)fabs(cptr->tgalpha - cptr->alpha);
  979. float drspd = dalpha; if (drspd>pi) drspd = 2*pi - drspd;
  980. if (cptr->Phase == PIG_IDLE1 || cptr->Phase == PIG_IDLE2 || cptr->Phase == PIG_IDLE3) goto SKIPROT;
  981. if (drspd > 0.02)
  982. if (cptr->tgalpha > cptr->alpha) currspeed = 0.8f + drspd*1.4f;
  983. else currspeed =-0.8f - drspd*1.4f;
  984. else currspeed = 0;
  985. if (cptr->AfraidTime) currspeed*=1.5;
  986. if (dalpha > pi) currspeed*=-1;
  987. if ((cptr->State & csONWATER) || cptr->Phase==PIG_WALK) currspeed/=1.4f;
  988. DeltaFunc(cptr->rspeed, currspeed, (float)TimeDt / 260.f);
  989. tgbend = drspd/2;
  990. if (tgbend>pi/2) tgbend = pi/2;
  991. tgbend*= SGN(currspeed);
  992. if (fabs(tgbend) > fabs(cptr->bend)) DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 800.f);
  993. else DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 400.f);
  994. rspd=cptr->rspeed * TimeDt / 1024.f;
  995. if (drspd < fabs(rspd)) cptr->alpha = cptr->tgalpha;
  996. else cptr->alpha+=rspd;
  997. if (cptr->alpha > pi * 2) cptr->alpha-= pi * 2;
  998. if (cptr->alpha < 0 ) cptr->alpha+= pi * 2;
  999. SKIPROT:
  1000. //========== movement ==============================//
  1001. cptr->lookx = (float)f_cos(cptr->alpha);
  1002. cptr->lookz = (float)f_sin(cptr->alpha);
  1003. float curspeed = 0;
  1004. if (cptr->Phase == PIG_RUN ) curspeed = 0.6f;
  1005. if (cptr->Phase == PIG_WALK) curspeed = 0.2f;
  1006. if (drspd > pi / 2.f) curspeed*=2.f - 2.f*drspd / pi;
  1007. //========== process speed =============//
  1008. curspeed*=cptr->scale;
  1009. DeltaFunc(cptr->vspeed, curspeed, TimeDt / 1024.f);
  1010. MoveCharacter(cptr, cptr->lookx * cptr->vspeed * TimeDt,
  1011. cptr->lookz * cptr->vspeed * TimeDt, TRUE, TRUE);
  1012. ThinkY_Beta_Gamma(cptr, 64, 32, 0.7f, 0.4f);
  1013. if (cptr->Phase==PIG_WALK) cptr->tggamma+= cptr->rspeed / 12.0f;
  1014. else cptr->tggamma+= cptr->rspeed / 8.0f;
  1015. DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 2048.f);
  1016. }
  1017. void AnimateBron(TCharacter *cptr)
  1018. {
  1019. NewPhase = FALSE;
  1020. int _Phase = cptr->Phase;
  1021. int _FTime = cptr->FTime;
  1022. float _tgalpha = cptr->tgalpha;
  1023. if (cptr->AfraidTime) cptr->AfraidTime = max(0, cptr->AfraidTime - TimeDt);
  1024. if (cptr->State==2) { NewPhase=TRUE; cptr->State=1; }
  1025. TBEGIN:
  1026. float targetx = cptr->tgx;
  1027. float targetz = cptr->tgz;
  1028. float targetdx = targetx - cptr->pos.x;
  1029. float targetdz = targetz - cptr->pos.z;
  1030. float tdist = (float)sqrt( targetdx * targetdx + targetdz * targetdz );
  1031. //float playerdx = PlayerX - cptr->pos.x;
  1032. //float playerdz = PlayerZ - cptr->pos.z;
  1033. float playerdx = PlayerX - cptr->pos.x - cptr->lookx * 300 * cptr->scale;
  1034. float playerdz = PlayerZ - cptr->pos.z - cptr->lookz * 300 * cptr->scale;
  1035. float pdist = (float)sqrt( playerdx * playerdx + playerdz * playerdz );
  1036. //=========== run away =================//
  1037. if (cptr->State) {
  1038. if (pdist < 6000) cptr->AfraidTime = 8000;
  1039. if (!cptr->AfraidTime) {
  1040. cptr->State = 0;
  1041. SetNewTargetPlace(cptr, 8048.f);
  1042. goto TBEGIN;
  1043. }
  1044. if (pdist > 256*16+OptAgres/8) {
  1045. nv.x = playerdx; nv.z = playerdz; nv.y = 0;
  1046. NormVector(nv, 2048.f);
  1047. cptr->tgx = cptr->pos.x - nv.x;
  1048. cptr->tgz = cptr->pos.z - nv.z;
  1049. cptr->tgtime = 0;
  1050. } else {
  1051. cptr->tgx = PlayerX;
  1052. cptr->tgz = PlayerZ;
  1053. cptr->tgtime = 0;
  1054. }
  1055. }
  1056. if (MyHealth)
  1057. if (pdist<300)
  1058. if (fabs(PlayerY - cptr->pos.y - 160) < 256) {
  1059. cptr->State = 0;
  1060. AddDeadBody(cptr, HUNT_EAT);
  1061. }
  1062. //======== exploring area ===============//
  1063. if (!cptr->State) {
  1064. cptr->AfraidTime = 0;
  1065. if (tdist<456) {
  1066. SetNewTargetPlace(cptr, 8048.f);
  1067. goto TBEGIN; }
  1068. }
  1069. //============================================//
  1070. if (pdist<2048) cptr->NoFindCnt = 0;
  1071. if (cptr->NoFindCnt) cptr->NoFindCnt--;
  1072. else {
  1073. cptr->tgalpha = CorrectedAlpha(FindVectorAlpha(targetdx, targetdz), cptr->alpha);//FindVectorAlpha(targetdx, targetdz);
  1074. if (cptr->AfraidTime)
  1075. if (pdist>12*256) {
  1076. cptr->tgalpha += (float)f_sin(RealTime/1024.f) / 3.f;
  1077. if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
  1078. if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
  1079. }
  1080. }
  1081. LookForAWay(cptr, TRUE, TRUE);
  1082. if (cptr->NoWayCnt>8) { cptr->NoWayCnt=0; cptr->NoFindCnt = 48 + rRand(80); }
  1083. if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
  1084. if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
  1085. //===============================================//
  1086. ProcessPrevPhase(cptr);
  1087. //======== select new phase =======================//
  1088. cptr->FTime+=TimeDt;
  1089. if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime) {
  1090. cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
  1091. NewPhase = TRUE; }
  1092. if (NewPhase)
  1093. if (!cptr->State) {
  1094. if (cptr->Phase == BRO_IDLE1 || cptr->Phase == BRO_IDLE2 || cptr->Phase == BRO_IDLE3) {
  1095. if (rRand(128) > 64 && cptr->Phase == BRO_IDLE3)
  1096. cptr->Phase = BRO_WALK;
  1097. else cptr->Phase = BRO_IDLE1 + rRand(2);
  1098. goto ENDPSELECT;
  1099. }
  1100. if (rRand(128) > 124) cptr->Phase=BRO_IDLE1; else cptr->Phase=BRO_WALK;
  1101. } else
  1102. if (cptr->AfraidTime) cptr->Phase = BRO_RUN;
  1103. else cptr->Phase = BRO_WALK;
  1104. ENDPSELECT:
  1105. //====== process phase changing ===========//
  1106. if ( (_Phase != cptr->Phase) || NewPhase)
  1107. ActivateCharacterFx(cptr);
  1108. if (_Phase != cptr->Phase) {
  1109. if (_Phase<=1 && cptr->Phase<=1)
  1110. cptr->FTime = _FTime * cptr->pinfo->Animation[cptr->Phase].AniTime / cptr->pinfo->Animation[_Phase].AniTime + 64;
  1111. else if (!NewPhase) cptr->FTime = 0;
  1112. if (cptr->PPMorphTime>128) {
  1113. cptr->PrevPhase = _Phase;
  1114. cptr->PrevPFTime = _FTime;
  1115. cptr->PPMorphTime = 0; }
  1116. }
  1117. cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
  1118. //========== rotation to tgalpha ===================//
  1119. float rspd, currspeed, tgbend;
  1120. float dalpha = (float)fabs(cptr->tgalpha - cptr->alpha);
  1121. float drspd = dalpha; if (drspd>pi) drspd = 2*pi - drspd;
  1122. if (cptr->Phase == BRO_IDLE1 || cptr->Phase == BRO_IDLE2 || cptr->Phase == BRO_IDLE3) goto SKIPROT;
  1123. if (drspd > 0.02)
  1124. if (cptr->tgalpha > cptr->alpha) currspeed = 0.2f + drspd*1.0f;
  1125. else currspeed =-0.2f - drspd*1.0f;
  1126. else currspeed = 0;
  1127. if (cptr->AfraidTime) currspeed*=1.5;
  1128. if (dalpha > pi) currspeed*=-1;
  1129. if ((cptr->State & csONWATER) || cptr->Phase==BRO_WALK) currspeed/=1.4f;
  1130. DeltaFunc(cptr->rspeed, currspeed, (float)TimeDt / 400.f);
  1131. tgbend = drspd/3.5f;
  1132. if (tgbend>pi/2.f) tgbend = pi/2.f;
  1133. tgbend*= SGN(currspeed);
  1134. if (fabs(tgbend) > fabs(cptr->bend)) DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 1600.f);
  1135. else DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 1200.f);
  1136. rspd=cptr->rspeed * TimeDt / 612.f;
  1137. if (drspd < fabs(rspd)) cptr->alpha = cptr->tgalpha;
  1138. else cptr->alpha+=rspd;
  1139. if (cptr->alpha > pi * 2) cptr->alpha-= pi * 2;
  1140. if (cptr->alpha < 0 ) cptr->alpha+= pi * 2;
  1141. SKIPROT:
  1142. //========== movement ==============================//
  1143. cptr->lookx = (float)f_cos(cptr->alpha);
  1144. cptr->lookz = (float)f_sin(cptr->alpha);
  1145. float curspeed = 0;
  1146. if (cptr->Phase == BRO_RUN ) curspeed = 0.768*2;
  1147. if (cptr->Phase == BRO_WALK) curspeed = 0.168*2;
  1148. if (drspd > pi / 2.f) curspeed*=2.f - 2.f*drspd / pi;
  1149. //========== process speed =============//
  1150. curspeed*=cptr->scale;
  1151. if (curspeed>cptr->vspeed) DeltaFunc(cptr->vspeed, curspeed, TimeDt / 1024.f);
  1152. else DeltaFunc(cptr->vspeed, curspeed, TimeDt / 256.f);
  1153. MoveCharacter(cptr, cptr->lookx * cptr->vspeed * TimeDt,
  1154. cptr->lookz * cptr->vspeed * TimeDt, TRUE, TRUE);
  1155. ThinkY_Beta_Gamma(cptr, 128, 64, 0.6f, 0.3f);
  1156. if (cptr->Phase==BRO_WALK) cptr->tggamma+= cptr->rspeed / 12.0f;
  1157. else cptr->tggamma+= cptr->rspeed / 8.0f;
  1158. DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 2048.f);
  1159. }
  1160. void AnimateBear(TCharacter *cptr)
  1161. {
  1162. NewPhase = FALSE;
  1163. int _Phase = cptr->Phase;
  1164. int _FTime = cptr->FTime;
  1165. float _tgalpha = cptr->tgalpha;
  1166. if (cptr->AfraidTime) cptr->AfraidTime = max(0, cptr->AfraidTime - TimeDt);
  1167. if (cptr->State==2) { NewPhase=TRUE; cptr->State=1; }
  1168. TBEGIN:
  1169. float targetx = cptr->tgx;
  1170. float targetz = cptr->tgz;
  1171. float targetdx = targetx - cptr->pos.x;
  1172. float targetdz = targetz - cptr->pos.z;
  1173. float tdist = (float)sqrt( targetdx * targetdx + targetdz * targetdz );
  1174. //float playerdx = PlayerX - cptr->pos.x;
  1175. //float playerdz = PlayerZ - cptr->pos.z;
  1176. float playerdx = PlayerX - cptr->pos.x - cptr->lookx * 300 * cptr->scale;
  1177. float playerdz = PlayerZ - cptr->pos.z - cptr->lookz * 300 * cptr->scale;
  1178. float pdist = (float)sqrt( playerdx * playerdx + playerdz * playerdz );
  1179. //=========== run away =================//
  1180. if (cptr->State) {
  1181. if (pdist < 6000) cptr->AfraidTime = 8000;
  1182. if (!cptr->AfraidTime) {
  1183. cptr->State = 0;
  1184. SetNewTargetPlace(cptr, 8048.f);
  1185. goto TBEGIN;
  1186. }
  1187. if (pdist > 256*20+OptAgres/8) {
  1188. nv.x = playerdx; nv.z = playerdz; nv.y = 0;
  1189. NormVector(nv, 2048.f);
  1190. cptr->tgx = cptr->pos.x - nv.x;
  1191. cptr->tgz = cptr->pos.z - nv.z;
  1192. cptr->tgtime = 0;
  1193. } else {
  1194. cptr->tgx = PlayerX;
  1195. cptr->tgz = PlayerZ;
  1196. cptr->tgtime = 0;
  1197. }
  1198. }
  1199. if (MyHealth)
  1200. if (pdist<300)
  1201. if (fabs(PlayerY - cptr->pos.y - 160) < 256) {
  1202. cptr->State = 0;
  1203. AddDeadBody(cptr, HUNT_EAT);
  1204. }
  1205. //======== exploring area ===============//
  1206. if (!cptr->State) {
  1207. cptr->AfraidTime = 0;
  1208. if (tdist<456) {
  1209. SetNewTargetPlace(cptr, 8048.f);
  1210. goto TBEGIN; }
  1211. }
  1212. //============================================//
  1213. if (pdist<2048) cptr->NoFindCnt = 0;
  1214. if (cptr->NoFindCnt) cptr->NoFindCnt--;
  1215. else {
  1216. cptr->tgalpha = CorrectedAlpha(FindVectorAlpha(targetdx, targetdz), cptr->alpha);//FindVectorAlpha(targetdx, targetdz);
  1217. if (cptr->AfraidTime) {
  1218. cptr->tgalpha += (float)f_sin(RealTime/1024.f) / 3.f;
  1219. if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
  1220. if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
  1221. }
  1222. }
  1223. LookForAWay(cptr, TRUE, TRUE);
  1224. if (cptr->NoWayCnt>8) { cptr->NoWayCnt=0; cptr->NoFindCnt = 48 + rRand(80); }
  1225. if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
  1226. if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
  1227. //===============================================//
  1228. ProcessPrevPhase(cptr);
  1229. //======== select new phase =======================//
  1230. cptr->FTime+=TimeDt;
  1231. if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime) {
  1232. cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
  1233. NewPhase = TRUE; }
  1234. if (NewPhase)
  1235. if (!cptr->State) {
  1236. if (cptr->Phase == BRO_IDLE1 || cptr->Phase == BRO_IDLE2 || cptr->Phase == BRO_IDLE3) {
  1237. if (rRand(128) > 64 && cptr->Phase == BRO_IDLE3)
  1238. cptr->Phase = BRO_WALK;
  1239. else cptr->Phase = BRO_IDLE1 + rRand(2);
  1240. goto ENDPSELECT;
  1241. }
  1242. if (rRand(128) > 124) cptr->Phase=BRO_IDLE1; else cptr->Phase=BRO_WALK;
  1243. } else
  1244. if (cptr->AfraidTime) cptr->Phase = BRO_RUN;
  1245. else cptr->Phase = BRO_WALK;
  1246. ENDPSELECT:
  1247. //====== process phase changing ===========//
  1248. if ( (_Phase != cptr->Phase) || NewPhase)
  1249. ActivateCharacterFx(cptr);
  1250. if (_Phase != cptr->Phase) {
  1251. if (_Phase<=1 && cptr->Phase<=1)
  1252. cptr->FTime = _FTime * cptr->pinfo->Animation[cptr->Phase].AniTime / cptr->pinfo->Animation[_Phase].AniTime + 64;
  1253. else if (!NewPhase) cptr->FTime = 0;
  1254. if (cptr->PPMorphTime>128) {
  1255. cptr->PrevPhase = _Phase;
  1256. cptr->PrevPFTime = _FTime;
  1257. cptr->PPMorphTime = 0; }
  1258. }
  1259. cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
  1260. //========== rotation to tgalpha ===================//
  1261. float rspd, currspeed, tgbend;
  1262. float dalpha = (float)fabs(cptr->tgalpha - cptr->alpha);
  1263. float drspd = dalpha; if (drspd>pi) drspd = 2*pi - drspd;
  1264. if (cptr->Phase == BRO_IDLE1 || cptr->Phase == BRO_IDLE2 || cptr->Phase == BRO_IDLE3) goto SKIPROT;
  1265. if (drspd > 0.02)
  1266. if (cptr->tgalpha > cptr->alpha) currspeed = 0.2f + drspd*1.0f;
  1267. else currspeed =-0.2f - drspd*1.0f;
  1268. else currspeed = 0;
  1269. if (cptr->AfraidTime) currspeed*=1.5;
  1270. if (dalpha > pi) currspeed*=-1;
  1271. if ((cptr->State & csONWATER) || cptr->Phase==BRO_WALK) currspeed/=1.4f;
  1272. DeltaFunc(cptr->rspeed, currspeed, (float)TimeDt / 400.f);
  1273. tgbend = drspd/3.5f;
  1274. if (tgbend>pi/2.f) tgbend = pi/2.f;
  1275. tgbend*= SGN(currspeed);
  1276. if (fabs(tgbend) > fabs(cptr->bend)) DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 1600.f);
  1277. else DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 1200.f);
  1278. rspd=cptr->rspeed * TimeDt / 612.f;
  1279. if (drspd < fabs(rspd)) cptr->alpha = cptr->tgalpha;
  1280. else cptr->alpha+=rspd;
  1281. if (cptr->alpha > pi * 2) cptr->alpha-= pi * 2;
  1282. if (cptr->alpha < 0 ) cptr->alpha+= pi * 2;
  1283. SKIPROT:
  1284. //========== movement ==============================//
  1285. cptr->lookx = (float)f_cos(cptr->alpha);
  1286. cptr->lookz = (float)f_sin(cptr->alpha);
  1287. float curspeed = 0;
  1288. if (cptr->Phase == BRO_RUN ) curspeed = 0.896*2;
  1289. if (cptr->Phase == BRO_WALK) curspeed = 0.240*2;
  1290. if (drspd > pi / 2.f) curspeed*=2.f - 2.f*drspd / pi;
  1291. //========== process speed =============//
  1292. curspeed*=cptr->scale;
  1293. if (curspeed>cptr->vspeed) DeltaFunc(cptr->vspeed, curspeed, TimeDt / 1024.f);
  1294. else DeltaFunc(cptr->vspeed, curspeed, TimeDt / 256.f);
  1295. MoveCharacter(cptr, cptr->lookx * cptr->vspeed * TimeDt,
  1296. cptr->lookz * cptr->vspeed * TimeDt, TRUE, TRUE);
  1297. ThinkY_Beta_Gamma(cptr, 128, 64, 0.6f, 0.3f);
  1298. if (cptr->Phase==BRO_WALK) cptr->tggamma+= cptr->rspeed / 12.0f;
  1299. else cptr->tggamma+= cptr->rspeed / 8.0f;
  1300. DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 2048.f);
  1301. }
  1302. void AnimateWolf(TCharacter *cptr)
  1303. {
  1304. NewPhase = FALSE;
  1305. int _Phase = cptr->Phase;
  1306. int _FTime = cptr->FTime;
  1307. float _tgalpha = cptr->tgalpha;
  1308. if (cptr->AfraidTime) cptr->AfraidTime = max(0, cptr->AfraidTime - TimeDt);
  1309. if (cptr->State==2) { NewPhase=TRUE; cptr->State=1; }
  1310. TBEGIN:
  1311. float targetx = cptr->tgx;
  1312. float targetz = cptr->tgz;
  1313. float targetdx = targetx - cptr->pos.x;
  1314. float targetdz = targetz - cptr->pos.z;
  1315. float tdist = (float)sqrt( targetdx * targetdx + targetdz * targetdz );
  1316. //float playerdx = PlayerX - cptr->pos.x;
  1317. //float playerdz = PlayerZ - cptr->pos.z;
  1318. float playerdx = PlayerX - cptr->pos.x - cptr->lookx * 300 * cptr->scale;
  1319. float playerdz = PlayerZ - cptr->pos.z - cptr->lookz * 300 * cptr->scale;
  1320. float pdist = (float)sqrt( playerdx * playerdx + playerdz * playerdz );
  1321. //=========== run away =================//
  1322. if (!MyHealth) cptr->State = 0;
  1323. if (cptr->State) {
  1324. if (pdist > ctViewR*140+OptAgres/8) {
  1325. nv.x = playerdx; nv.z = playerdz; nv.y = 0;
  1326. NormVector(nv, 2048.f);
  1327. cptr->tgx = cptr->pos.x - nv.x;
  1328. cptr->tgz = cptr->pos.z - nv.z;
  1329. cptr->tgtime = 0;
  1330. cptr->AfraidTime-=TimeDt;
  1331. if (cptr->AfraidTime<=0) {
  1332. cptr->AfraidTime=0; cptr->State = 0;
  1333. }
  1334. } else {
  1335. cptr->tgx = PlayerX;
  1336. cptr->tgz = PlayerZ;
  1337. cptr->tgtime = 0;
  1338. }
  1339. }
  1340. if (MyHealth)
  1341. if (pdist<300)
  1342. if (fabs(PlayerY - cptr->pos.y - 160) < 256) {
  1343. cptr->State = 0;
  1344. AddDeadBody(cptr, HUNT_EAT);
  1345. }
  1346. //======== exploring area ===============//
  1347. if (!cptr->State) {
  1348. cptr->AfraidTime = 0;
  1349. if (tdist<456) {
  1350. SetNewTargetPlace(cptr, 8048.f);
  1351. goto TBEGIN; }
  1352. }
  1353. //============================================//
  1354. if (pdist<2048) cptr->NoFindCnt = 0;
  1355. if (cptr->NoFindCnt) cptr->NoFindCnt--;
  1356. else {
  1357. cptr->tgalpha = CorrectedAlpha(FindVectorAlpha(targetdx, targetdz), cptr->alpha);//FindVectorAlpha(targetdx, targetdz);
  1358. if (cptr->AfraidTime)
  1359. if (pdist>12*256) {
  1360. cptr->tgalpha += (float)f_sin(RealTime/1024.f) / 3.f;
  1361. if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
  1362. if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
  1363. }
  1364. }
  1365. LookForAWay(cptr, TRUE, TRUE);
  1366. if (cptr->NoWayCnt>8) { cptr->NoWayCnt=0; cptr->NoFindCnt = 48 + rRand(80); }
  1367. if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
  1368. if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
  1369. //===============================================//
  1370. ProcessPrevPhase(cptr);
  1371. //======== select new phase =======================//
  1372. cptr->FTime+=TimeDt;
  1373. if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime) {
  1374. cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
  1375. NewPhase = TRUE; }
  1376. if (NewPhase)
  1377. if (!cptr->State) {
  1378. if (cptr->Phase == BRO_IDLE1 || cptr->Phase == BRO_IDLE2 || cptr->Phase == BRO_IDLE3) {
  1379. if (rRand(128) > 64)
  1380. cptr->Phase = BRO_WALK;
  1381. else
  1382. cptr->Phase = BRO_IDLE1 + rRand(2);
  1383. goto ENDPSELECT;
  1384. }
  1385. if (rRand(128) > 124) cptr->Phase=BRO_IDLE1 + rRand(2); else cptr->Phase=BRO_WALK;
  1386. } else
  1387. if (cptr->AfraidTime) cptr->Phase = BRO_RUN;
  1388. else cptr->Phase = BRO_WALK;
  1389. ENDPSELECT:
  1390. //====== process phase changing ===========//
  1391. if ( (_Phase != cptr->Phase) || NewPhase)
  1392. ActivateCharacterFx(cptr);
  1393. if (_Phase != cptr->Phase) {
  1394. if (_Phase<=1 && cptr->Phase<=1)
  1395. cptr->FTime = _FTime * cptr->pinfo->Animation[cptr->Phase].AniTime / cptr->pinfo->Animation[_Phase].AniTime + 64;
  1396. else if (!NewPhase) cptr->FTime = 0;
  1397. if (cptr->PPMorphTime>128) {
  1398. cptr->PrevPhase = _Phase;
  1399. cptr->PrevPFTime = _FTime;
  1400. cptr->PPMorphTime = 0; }
  1401. }
  1402. cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
  1403. //========== rotation to tgalpha ===================//
  1404. float rspd, currspeed, tgbend;
  1405. float dalpha = (float)fabs(cptr->tgalpha - cptr->alpha);
  1406. float drspd = dalpha; if (drspd>pi) drspd = 2*pi - drspd;
  1407. if (cptr->Phase == BRO_IDLE1 || cptr->Phase == BRO_IDLE2 || cptr->Phase == BRO_IDLE3) goto SKIPROT;
  1408. if (drspd > 0.02)
  1409. if (cptr->tgalpha > cptr->alpha) currspeed = 0.4f + drspd*1.5f;
  1410. else currspeed =-0.4f - drspd*1.5f;
  1411. else currspeed = 0;
  1412. if (cptr->AfraidTime) currspeed*=1.5;
  1413. if (dalpha > pi) currspeed*=-1;
  1414. if ((cptr->State & csONWATER) || cptr->Phase==BRO_WALK) currspeed/=1.4f;
  1415. DeltaFunc(cptr->rspeed, currspeed, (float)TimeDt / 400.f);
  1416. tgbend = drspd/3.5f;
  1417. if (tgbend>pi/2.f) tgbend = pi/2.f;
  1418. tgbend*= SGN(currspeed);
  1419. if (fabs(tgbend) > fabs(cptr->bend)) DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 1600.f);
  1420. else DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 1200.f);
  1421. rspd=cptr->rspeed * TimeDt / 612.f;
  1422. if (drspd < fabs(rspd)) cptr->alpha = cptr->tgalpha;
  1423. else cptr->alpha+=rspd;
  1424. if (cptr->alpha > pi * 2) cptr->alpha-= pi * 2;
  1425. if (cptr->alpha < 0 ) cptr->alpha+= pi * 2;
  1426. SKIPROT:
  1427. //========== movement ==============================//
  1428. cptr->lookx = (float)f_cos(cptr->alpha);
  1429. cptr->lookz = (float)f_sin(cptr->alpha);
  1430. float curspeed = 0;
  1431. if (cptr->Phase == BRO_RUN ) curspeed = 1.024*2;
  1432. if (cptr->Phase == BRO_WALK) curspeed = 0.160*2;
  1433. if (drspd > pi / 2.f) curspeed*=2.f - 2.f*drspd / pi;
  1434. //========== process speed =============//
  1435. curspeed*=cptr->scale;
  1436. if (curspeed>cptr->vspeed) DeltaFunc(cptr->vspeed, curspeed, TimeDt / 1024.f);
  1437. else DeltaFunc(cptr->vspeed, curspeed, TimeDt / 256.f);
  1438. MoveCharacter(cptr, cptr->lookx * cptr->vspeed * TimeDt,
  1439. cptr->lookz * cptr->vspeed * TimeDt, TRUE, TRUE);
  1440. ThinkY_Beta_Gamma(cptr, 128, 64, 0.6f, 0.3f);
  1441. if (cptr->Phase==BRO_WALK) cptr->tggamma+= cptr->rspeed / 12.0f;
  1442. else cptr->tggamma+= cptr->rspeed / 8.0f;
  1443. DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 2048.f);
  1444. }
  1445. void AnimateHog(TCharacter *cptr)
  1446. {
  1447. NewPhase = FALSE;
  1448. int _Phase = cptr->Phase;
  1449. int _FTime = cptr->FTime;
  1450. float _tgalpha = cptr->tgalpha;
  1451. if (cptr->AfraidTime) cptr->AfraidTime = max(0, cptr->AfraidTime - TimeDt);
  1452. if (cptr->State==2) { NewPhase=TRUE; cptr->State=1; }
  1453. TBEGIN:
  1454. float targetx = cptr->tgx;
  1455. float targetz = cptr->tgz;
  1456. float targetdx = targetx - cptr->pos.x;
  1457. float targetdz = targetz - cptr->pos.z;
  1458. float tdist = (float)sqrt( targetdx * targetdx + targetdz * targetdz );
  1459. //float playerdx = PlayerX - cptr->pos.x;
  1460. //float playerdz = PlayerZ - cptr->pos.z;
  1461. float playerdx = PlayerX - cptr->pos.x - cptr->lookx * 300 * cptr->scale;
  1462. float playerdz = PlayerZ - cptr->pos.z - cptr->lookz * 300 * cptr->scale;
  1463. float pdist = (float)sqrt( playerdx * playerdx + playerdz * playerdz );
  1464. //=========== run away =================//
  1465. if (cptr->State) {
  1466. if (pdist < 6000) cptr->AfraidTime = 8000;
  1467. if (!cptr->AfraidTime) {
  1468. cptr->State = 0;
  1469. SetNewTargetPlace(cptr, 8048.f);
  1470. goto TBEGIN;
  1471. }
  1472. if (pdist > 256*20+OptAgres/8) {
  1473. nv.x = playerdx; nv.z = playerdz; nv.y = 0;
  1474. NormVector(nv, 2048.f);
  1475. cptr->tgx = cptr->pos.x - nv.x;
  1476. cptr->tgz = cptr->pos.z - nv.z;
  1477. cptr->tgtime = 0;
  1478. } else {
  1479. cptr->tgx = PlayerX;
  1480. cptr->tgz = PlayerZ;
  1481. cptr->tgtime = 0;
  1482. }
  1483. }
  1484. if (MyHealth)
  1485. if (pdist<300)
  1486. if (fabs(PlayerY - cptr->pos.y - 160) < 256) {
  1487. cptr->State = 0;
  1488. AddDeadBody(cptr, HUNT_EAT);
  1489. }
  1490. //======== exploring area ===============//
  1491. if (!cptr->State) {
  1492. cptr->AfraidTime = 0;
  1493. if (tdist<456) {
  1494. SetNewTargetPlace(cptr, 8048.f);
  1495. goto TBEGIN; }
  1496. }
  1497. //============================================//
  1498. if (pdist<2048) cptr->NoFindCnt = 0;
  1499. if (cptr->NoFindCnt) cptr->NoFindCnt--;
  1500. else {
  1501. cptr->tgalpha = CorrectedAlpha(FindVectorAlpha(targetdx, targetdz), cptr->alpha);//FindVectorAlpha(targetdx, targetdz);
  1502. if (cptr->AfraidTime)
  1503. if (pdist>12*256) {
  1504. cptr->tgalpha += (float)f_sin(RealTime/1024.f) / 3.f;
  1505. if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
  1506. if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
  1507. }
  1508. }
  1509. LookForAWay(cptr, TRUE, TRUE);
  1510. if (cptr->NoWayCnt>8) { cptr->NoWayCnt=0; cptr->NoFindCnt = 48 + rRand(80); }
  1511. if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
  1512. if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
  1513. //===============================================//
  1514. ProcessPrevPhase(cptr);
  1515. //======== select new phase =======================//
  1516. cptr->FTime+=TimeDt;
  1517. if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime) {
  1518. cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
  1519. NewPhase = TRUE; }
  1520. if (NewPhase)
  1521. if (!cptr->State) {
  1522. if (cptr->Phase == BRO_IDLE1 || cptr->Phase == BRO_IDLE2 || cptr->Phase == BRO_IDLE3) {
  1523. if (rRand(128) > 64 && cptr->Phase == BRO_IDLE3)
  1524. cptr->Phase = BRO_WALK;
  1525. else cptr->Phase = BRO_IDLE1 + rRand(2);
  1526. goto ENDPSELECT;
  1527. }
  1528. if (rRand(128) > 124) cptr->Phase=BRO_IDLE1; else cptr->Phase=BRO_WALK;
  1529. } else
  1530. if (cptr->AfraidTime) cptr->Phase = BRO_RUN;
  1531. else cptr->Phase = BRO_WALK;
  1532. ENDPSELECT:
  1533. //====== process phase changing ===========//
  1534. if ( (_Phase != cptr->Phase) || NewPhase)
  1535. ActivateCharacterFx(cptr);
  1536. if (_Phase != cptr->Phase) {
  1537. if (_Phase<=1 && cptr->Phase<=1)
  1538. cptr->FTime = _FTime * cptr->pinfo->Animation[cptr->Phase].AniTime / cptr->pinfo->Animation[_Phase].AniTime + 64;
  1539. else if (!NewPhase) cptr->FTime = 0;
  1540. if (cptr->PPMorphTime>128) {
  1541. cptr->PrevPhase = _Phase;
  1542. cptr->PrevPFTime = _FTime;
  1543. cptr->PPMorphTime = 0; }
  1544. }
  1545. cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
  1546. //========== rotation to tgalpha ===================//
  1547. float rspd, currspeed, tgbend;
  1548. float dalpha = (float)fabs(cptr->tgalpha - cptr->alpha);
  1549. float drspd = dalpha; if (drspd>pi) drspd = 2*pi - drspd;
  1550. if (cptr->Phase == BRO_IDLE1 || cptr->Phase == BRO_IDLE2 || cptr->Phase == BRO_IDLE3) goto SKIPROT;
  1551. if (drspd > 0.02)
  1552. if (cptr->tgalpha > cptr->alpha) currspeed = 0.3f + drspd*1.4f;
  1553. else currspeed =-0.3f - drspd*1.4f;
  1554. else currspeed = 0;
  1555. if (cptr->AfraidTime) currspeed*=1.5;
  1556. if (dalpha > pi) currspeed*=-1;
  1557. if ((cptr->State & csONWATER) || cptr->Phase==BRO_WALK) currspeed/=1.4f;
  1558. DeltaFunc(cptr->rspeed, currspeed, (float)TimeDt / 400.f);
  1559. tgbend = drspd/3.5f;
  1560. if (tgbend>pi/2.f) tgbend = pi/2.f;
  1561. tgbend*= SGN(currspeed);
  1562. if (fabs(tgbend) > fabs(cptr->bend)) DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 1600.f);
  1563. else DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 1200.f);
  1564. rspd=cptr->rspeed * TimeDt / 612.f;
  1565. if (drspd < fabs(rspd)) cptr->alpha = cptr->tgalpha;
  1566. else cptr->alpha+=rspd;
  1567. if (cptr->alpha > pi * 2) cptr->alpha-= pi * 2;
  1568. if (cptr->alpha < 0 ) cptr->alpha+= pi * 2;
  1569. SKIPROT:
  1570. //========== movement ==============================//
  1571. cptr->lookx = (float)f_cos(cptr->alpha);
  1572. cptr->lookz = (float)f_sin(cptr->alpha);
  1573. float curspeed = 0;
  1574. if (cptr->Phase == BRO_RUN ) curspeed = 0.576*2;
  1575. if (cptr->Phase == BRO_WALK) curspeed = 0.112*2;
  1576. if (drspd > pi / 2.f) curspeed*=2.f - 2.f*drspd / pi;
  1577. //========== process speed =============//
  1578. curspeed*=cptr->scale;
  1579. if (curspeed>cptr->vspeed) DeltaFunc(cptr->vspeed, curspeed, TimeDt / 1024.f);
  1580. else DeltaFunc(cptr->vspeed, curspeed, TimeDt / 256.f);
  1581. MoveCharacter(cptr, cptr->lookx * cptr->vspeed * TimeDt,
  1582. cptr->lookz * cptr->vspeed * TimeDt, TRUE, TRUE);
  1583. ThinkY_Beta_Gamma(cptr, 128, 64, 0.6f, 0.3f);
  1584. if (cptr->Phase==BRO_WALK) cptr->tggamma+= cptr->rspeed / 12.0f;
  1585. else cptr->tggamma+= cptr->rspeed / 8.0f;
  1586. DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 2048.f);
  1587. }
  1588. void AnimateRhino(TCharacter *cptr)
  1589. {
  1590. NewPhase = FALSE;
  1591. int _Phase = cptr->Phase;
  1592. int _FTime = cptr->FTime;
  1593. float _tgalpha = cptr->tgalpha;
  1594. if (cptr->AfraidTime) cptr->AfraidTime = max(0, cptr->AfraidTime - TimeDt);
  1595. if (cptr->State==2) { NewPhase=TRUE; cptr->State=1; }
  1596. TBEGIN:
  1597. float targetx = cptr->tgx;
  1598. float targetz = cptr->tgz;
  1599. float targetdx = targetx - cptr->pos.x;
  1600. float targetdz = targetz - cptr->pos.z;
  1601. float tdist = (float)sqrt( targetdx * targetdx + targetdz * targetdz );
  1602. //float playerdx = PlayerX - cptr->pos.x;
  1603. //float playerdz = PlayerZ - cptr->pos.z;
  1604. float playerdx = PlayerX - cptr->pos.x - cptr->lookx * 300 * cptr->scale;
  1605. float playerdz = PlayerZ - cptr->pos.z - cptr->lookz * 300 * cptr->scale;
  1606. float pdist = (float)sqrt( playerdx * playerdx + playerdz * playerdz );
  1607. //=========== run away =================//
  1608. if (cptr->State) {
  1609. if (pdist < 6000) cptr->AfraidTime = 8000;
  1610. if (!cptr->AfraidTime) {
  1611. cptr->State = 0;
  1612. SetNewTargetPlace(cptr, 8048.f);
  1613. goto TBEGIN;
  1614. }
  1615. if (pdist > 256*18+OptAgres/8) {
  1616. nv.x = playerdx; nv.z = playerdz; nv.y = 0;
  1617. NormVector(nv, 2048.f);
  1618. cptr->tgx = cptr->pos.x - nv.x;
  1619. cptr->tgz = cptr->pos.z - nv.z;
  1620. cptr->tgtime = 0;
  1621. } else {
  1622. cptr->tgx = PlayerX;
  1623. cptr->tgz = PlayerZ;
  1624. cptr->tgtime = 0;
  1625. }
  1626. }
  1627. if (MyHealth)
  1628. if (pdist<300)
  1629. if (fabs(PlayerY - cptr->pos.y - 160) < 256) {
  1630. cptr->State = 0;
  1631. AddDeadBody(cptr, HUNT_EAT);
  1632. }
  1633. //======== exploring area ===============//
  1634. if (!cptr->State) {
  1635. cptr->AfraidTime = 0;
  1636. if (tdist<456) {
  1637. SetNewTargetPlace(cptr, 8048.f);
  1638. goto TBEGIN; }
  1639. }
  1640. //============================================//
  1641. if (pdist<2048) cptr->NoFindCnt = 0;
  1642. if (cptr->NoFindCnt) cptr->NoFindCnt--;
  1643. else {
  1644. cptr->tgalpha = CorrectedAlpha(FindVectorAlpha(targetdx, targetdz), cptr->alpha);//FindVectorAlpha(targetdx, targetdz);
  1645. if (cptr->AfraidTime)
  1646. if (pdist>12*256) {
  1647. cptr->tgalpha += (float)f_sin(RealTime/1024.f) / 3.f;
  1648. if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
  1649. if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
  1650. }
  1651. }
  1652. LookForAWay(cptr, TRUE, TRUE);
  1653. if (cptr->NoWayCnt>8) { cptr->NoWayCnt=0; cptr->NoFindCnt = 48 + rRand(80); }
  1654. if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
  1655. if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
  1656. //===============================================//
  1657. ProcessPrevPhase(cptr);
  1658. //======== select new phase =======================//
  1659. cptr->FTime+=TimeDt;
  1660. if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime) {
  1661. cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
  1662. NewPhase = TRUE; }
  1663. if (NewPhase)
  1664. if (!cptr->State) {
  1665. if (cptr->Phase == BRO_IDLE1 || cptr->Phase == BRO_IDLE2 || cptr->Phase == BRO_IDLE3) {
  1666. if (rRand(128) > 64 && cptr->Phase == BRO_IDLE3)
  1667. cptr->Phase = BRO_WALK;
  1668. else cptr->Phase = BRO_IDLE1 + rRand(2);
  1669. goto ENDPSELECT;
  1670. }
  1671. if (rRand(128) > 124) cptr->Phase=BRO_IDLE1; else cptr->Phase=BRO_WALK;
  1672. } else
  1673. if (cptr->AfraidTime) cptr->Phase = BRO_RUN;
  1674. else cptr->Phase = BRO_WALK;
  1675. ENDPSELECT:
  1676. //====== process phase changing ===========//
  1677. if ( (_Phase != cptr->Phase) || NewPhase)
  1678. ActivateCharacterFx(cptr);
  1679. if (_Phase != cptr->Phase) {
  1680. if (_Phase<=1 && cptr->Phase<=1)
  1681. cptr->FTime = _FTime * cptr->pinfo->Animation[cptr->Phase].AniTime / cptr->pinfo->Animation[_Phase].AniTime + 64;
  1682. else if (!NewPhase) cptr->FTime = 0;
  1683. if (cptr->PPMorphTime>128) {
  1684. cptr->PrevPhase = _Phase;
  1685. cptr->PrevPFTime = _FTime;
  1686. cptr->PPMorphTime = 0; }
  1687. }
  1688. cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
  1689. //========== rotation to tgalpha ===================//
  1690. float rspd, currspeed, tgbend;
  1691. float dalpha = (float)fabs(cptr->tgalpha - cptr->alpha);
  1692. float drspd = dalpha; if (drspd>pi) drspd = 2*pi - drspd;
  1693. if (cptr->Phase == BRO_IDLE1 || cptr->Phase == BRO_IDLE2 || cptr->Phase == BRO_IDLE3) goto SKIPROT;
  1694. if (drspd > 0.02)
  1695. if (cptr->tgalpha > cptr->alpha) currspeed = 0.3f + drspd*1.2f;
  1696. else currspeed =-0.3f - drspd*1.2f;
  1697. else currspeed = 0;
  1698. if (cptr->AfraidTime) currspeed*=1.5;
  1699. if (dalpha > pi) currspeed*=-1;
  1700. if ((cptr->State & csONWATER) || cptr->Phase==BRO_WALK) currspeed/=1.4f;
  1701. DeltaFunc(cptr->rspeed, currspeed, (float)TimeDt / 400.f);
  1702. tgbend = drspd/3.5f;
  1703. if (tgbend>pi/2.f) tgbend = pi/2.f;
  1704. tgbend*= SGN(currspeed);
  1705. if (fabs(tgbend) > fabs(cptr->bend)) DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 1600.f);
  1706. else DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 1200.f);
  1707. rspd=cptr->rspeed * TimeDt / 612.f;
  1708. if (drspd < fabs(rspd)) cptr->alpha = cptr->tgalpha;
  1709. else cptr->alpha+=rspd;
  1710. if (cptr->alpha > pi * 2) cptr->alpha-= pi * 2;
  1711. if (cptr->alpha < 0 ) cptr->alpha+= pi * 2;
  1712. SKIPROT:
  1713. //========== movement ==============================//
  1714. cptr->lookx = (float)f_cos(cptr->alpha);
  1715. cptr->lookz = (float)f_sin(cptr->alpha);
  1716. float curspeed = 0;
  1717. if (cptr->Phase == BRO_RUN ) curspeed = 0.576*2;
  1718. if (cptr->Phase == BRO_WALK) curspeed = 0.168*2;
  1719. if (drspd > pi / 2.f) curspeed*=2.f - 2.f*drspd / pi;
  1720. //========== process speed =============//
  1721. curspeed*=cptr->scale;
  1722. if (curspeed>cptr->vspeed) DeltaFunc(cptr->vspeed, curspeed, TimeDt / 1024.f);
  1723. else DeltaFunc(cptr->vspeed, curspeed, TimeDt / 256.f);
  1724. MoveCharacter(cptr, cptr->lookx * cptr->vspeed * TimeDt,
  1725. cptr->lookz * cptr->vspeed * TimeDt, TRUE, TRUE);
  1726. ThinkY_Beta_Gamma(cptr, 128, 64, 0.6f, 0.3f);
  1727. if (cptr->Phase==BRO_WALK) cptr->tggamma+= cptr->rspeed / 12.0f;
  1728. else cptr->tggamma+= cptr->rspeed / 8.0f;
  1729. DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 2048.f);
  1730. }
  1731. void AnimateSmilo(TCharacter *cptr)
  1732. {
  1733. NewPhase = FALSE;
  1734. int _Phase = cptr->Phase;
  1735. int _FTime = cptr->FTime;
  1736. float _tgalpha = cptr->tgalpha;
  1737. if (cptr->AfraidTime) cptr->AfraidTime = max(0, cptr->AfraidTime - TimeDt);
  1738. if (cptr->State==2) { NewPhase=TRUE; cptr->State=1; }
  1739. TBEGIN:
  1740. float targetx = cptr->tgx;
  1741. float targetz = cptr->tgz;
  1742. float targetdx = targetx - cptr->pos.x;
  1743. float targetdz = targetz - cptr->pos.z;
  1744. float tdist = (float)sqrt( targetdx * targetdx + targetdz * targetdz );
  1745. //float playerdx = PlayerX - cptr->pos.x;
  1746. //float playerdz = PlayerZ - cptr->pos.z;
  1747. float playerdx = PlayerX - cptr->pos.x - cptr->lookx * 300 * cptr->scale;
  1748. float playerdz = PlayerZ - cptr->pos.z - cptr->lookz * 300 * cptr->scale;
  1749. float pdist = (float)sqrt( playerdx * playerdx + playerdz * playerdz );
  1750. //=========== run away =================//
  1751. if (cptr->State) {
  1752. if (pdist < 6000) cptr->AfraidTime = 8000;
  1753. if (!cptr->AfraidTime) {
  1754. cptr->State = 0;
  1755. SetNewTargetPlace(cptr, 8048.f);
  1756. goto TBEGIN;
  1757. }
  1758. if (pdist > 256*16+OptAgres/8) {
  1759. nv.x = playerdx; nv.z = playerdz; nv.y = 0;
  1760. NormVector(nv, 2048.f);
  1761. cptr->tgx = cptr->pos.x - nv.x;
  1762. cptr->tgz = cptr->pos.z - nv.z;
  1763. cptr->tgtime = 0;
  1764. } else {
  1765. cptr->tgx = PlayerX;
  1766. cptr->tgz = PlayerZ;
  1767. cptr->tgtime = 0;
  1768. }
  1769. }
  1770. if (MyHealth)
  1771. if (pdist<300)
  1772. if (fabs(PlayerY - cptr->pos.y - 160) < 256) {
  1773. cptr->State = 0;
  1774. AddDeadBody(cptr, HUNT_EAT);
  1775. }
  1776. //======== exploring area ===============//
  1777. if (!cptr->State) {
  1778. cptr->AfraidTime = 0;
  1779. if (tdist<456) {
  1780. SetNewTargetPlace(cptr, 8048.f);
  1781. goto TBEGIN; }
  1782. }
  1783. //============================================//
  1784. if (pdist<2048) cptr->NoFindCnt = 0;
  1785. if (cptr->NoFindCnt) cptr->NoFindCnt--;
  1786. else {
  1787. cptr->tgalpha = CorrectedAlpha(FindVectorAlpha(targetdx, targetdz), cptr->alpha);//FindVectorAlpha(targetdx, targetdz);
  1788. if (cptr->AfraidTime)
  1789. if (pdist>12*256) {
  1790. cptr->tgalpha += (float)f_sin(RealTime/1024.f) / 3.f;
  1791. if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
  1792. if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
  1793. }
  1794. }
  1795. LookForAWay(cptr, TRUE, TRUE);
  1796. if (cptr->NoWayCnt>8) { cptr->NoWayCnt=0; cptr->NoFindCnt = 48 + rRand(80); }
  1797. if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
  1798. if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
  1799. //===============================================//
  1800. ProcessPrevPhase(cptr);
  1801. //======== select new phase =======================//
  1802. cptr->FTime+=TimeDt;
  1803. if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime) {
  1804. cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
  1805. NewPhase = TRUE; }
  1806. if (NewPhase)
  1807. if (!cptr->State) {
  1808. if (cptr->Phase == BRO_IDLE1 || cptr->Phase == BRO_IDLE2 || cptr->Phase == BRO_IDLE3) {
  1809. cptr->Phase = BRO_WALK;
  1810. goto ENDPSELECT;
  1811. }
  1812. if (rRand(128) > 124) cptr->Phase=BRO_IDLE1 + rRand(2); else cptr->Phase=BRO_WALK;
  1813. } else
  1814. if (cptr->AfraidTime) cptr->Phase = BRO_RUN;
  1815. else cptr->Phase = BRO_WALK;
  1816. ENDPSELECT:
  1817. //====== process phase changing ===========//
  1818. if ( (_Phase != cptr->Phase) || NewPhase)
  1819. ActivateCharacterFx(cptr);
  1820. if (_Phase != cptr->Phase) {
  1821. if (_Phase<=1 && cptr->Phase<=1)
  1822. cptr->FTime = _FTime * cptr->pinfo->Animation[cptr->Phase].AniTime / cptr->pinfo->Animation[_Phase].AniTime + 64;
  1823. else if (!NewPhase) cptr->FTime = 0;
  1824. if (cptr->PPMorphTime>128) {
  1825. cptr->PrevPhase = _Phase;
  1826. cptr->PrevPFTime = _FTime;
  1827. cptr->PPMorphTime = 0; }
  1828. }
  1829. cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
  1830. //========== rotation to tgalpha ===================//
  1831. float rspd, currspeed, tgbend;
  1832. float dalpha = (float)fabs(cptr->tgalpha - cptr->alpha);
  1833. float drspd = dalpha; if (drspd>pi) drspd = 2*pi - drspd;
  1834. if (cptr->Phase == BRO_IDLE1 || cptr->Phase == BRO_IDLE2 || cptr->Phase == BRO_IDLE3) goto SKIPROT;
  1835. if (drspd > 0.02)
  1836. if (cptr->tgalpha > cptr->alpha) currspeed = 0.3f + drspd*1.5f;
  1837. else currspeed =-0.3f - drspd*1.5f;
  1838. else currspeed = 0;
  1839. if (cptr->AfraidTime) currspeed*=1.5;
  1840. if (dalpha > pi) currspeed*=-1;
  1841. if ((cptr->State & csONWATER) || cptr->Phase==BRO_WALK) currspeed/=1.4f;
  1842. DeltaFunc(cptr->rspeed, currspeed, (float)TimeDt / 400.f);
  1843. tgbend = drspd/3.5f;
  1844. if (tgbend>pi/2.f) tgbend = pi/2.f;
  1845. tgbend*= SGN(currspeed);
  1846. if (fabs(tgbend) > fabs(cptr->bend)) DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 1600.f);
  1847. else DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 1200.f);
  1848. rspd=cptr->rspeed * TimeDt / 612.f;
  1849. if (drspd < fabs(rspd)) cptr->alpha = cptr->tgalpha;
  1850. else cptr->alpha+=rspd;
  1851. if (cptr->alpha > pi * 2) cptr->alpha-= pi * 2;
  1852. if (cptr->alpha < 0 ) cptr->alpha+= pi * 2;
  1853. SKIPROT:
  1854. //========== movement ==============================//
  1855. cptr->lookx = (float)f_cos(cptr->alpha);
  1856. cptr->lookz = (float)f_sin(cptr->alpha);
  1857. float curspeed = 0;
  1858. if (cptr->Phase == BRO_RUN ) curspeed = 1.024*2;
  1859. if (cptr->Phase == BRO_WALK) curspeed = 0.320*2;
  1860. if (drspd > pi / 2.f) curspeed*=2.f - 2.f*drspd / pi;
  1861. //========== process speed =============//
  1862. curspeed*=cptr->scale;
  1863. if (curspeed>cptr->vspeed) DeltaFunc(cptr->vspeed, curspeed, TimeDt / 1024.f);
  1864. else DeltaFunc(cptr->vspeed, curspeed, TimeDt / 256.f);
  1865. MoveCharacter(cptr, cptr->lookx * cptr->vspeed * TimeDt,
  1866. cptr->lookz * cptr->vspeed * TimeDt, TRUE, TRUE);
  1867. ThinkY_Beta_Gamma(cptr, 128, 64, 0.6f, 0.3f);
  1868. if (cptr->Phase==BRO_WALK) cptr->tggamma+= cptr->rspeed / 12.0f;
  1869. else cptr->tggamma+= cptr->rspeed / 8.0f;
  1870. DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 2048.f);
  1871. }
  1872. void AnimateDeer(TCharacter *cptr)
  1873. {
  1874. NewPhase = FALSE;
  1875. int _Phase = cptr->Phase;
  1876. int _FTime = cptr->FTime;
  1877. float _tgalpha = cptr->tgalpha;
  1878. if (cptr->AfraidTime) cptr->AfraidTime = max(0, cptr->AfraidTime - TimeDt);
  1879. if (cptr->State==2) { NewPhase=TRUE; cptr->State=1; }
  1880. TBEGIN:
  1881. float targetx = cptr->tgx;
  1882. float targetz = cptr->tgz;
  1883. float targetdx = targetx - cptr->pos.x;
  1884. float targetdz = targetz - cptr->pos.z;
  1885. float tdist = (float)sqrt( targetdx * targetdx + targetdz * targetdz );
  1886. float playerdx = PlayerX - cptr->pos.x;
  1887. float playerdz = PlayerZ - cptr->pos.z;
  1888. float pdist = (float)sqrt( playerdx * playerdx + playerdz * playerdz );
  1889. //=========== run away =================//
  1890. if (cptr->State) {
  1891. if (!cptr->AfraidTime) {
  1892. cptr->State = 0;
  1893. SetNewTargetPlace(cptr, 8048.f);
  1894. goto TBEGIN;
  1895. }
  1896. nv.x = playerdx; nv.z = playerdz; nv.y = 0;
  1897. NormVector(nv, 2048.f);
  1898. cptr->tgx = cptr->pos.x - nv.x;
  1899. cptr->tgz = cptr->pos.z - nv.z;
  1900. cptr->tgtime = 0;
  1901. }
  1902. //======== exploring area ===============//
  1903. if (!cptr->State) {
  1904. cptr->AfraidTime = 0;
  1905. if (pdist<1024.f) {
  1906. cptr->State = 1;
  1907. cptr->AfraidTime = (6 + rRand(8)) * 1024;
  1908. cptr->Phase = DER_RUN;
  1909. goto TBEGIN; }
  1910. if (tdist<456) {
  1911. SetNewTargetPlace(cptr, 8048.f);
  1912. goto TBEGIN; }
  1913. }
  1914. //============================================//
  1915. if (pdist<2048) cptr->NoFindCnt = 0;
  1916. if (cptr->NoFindCnt) cptr->NoFindCnt--;
  1917. else {
  1918. cptr->tgalpha = CorrectedAlpha(FindVectorAlpha(targetdx, targetdz), cptr->alpha);//FindVectorAlpha(targetdx, targetdz);
  1919. if (cptr->AfraidTime) {
  1920. cptr->tgalpha += (float)f_sin(RealTime/1024.f) / 3.f;
  1921. if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
  1922. if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
  1923. }
  1924. }
  1925. LookForAWay(cptr, TRUE, TRUE);
  1926. if (cptr->NoWayCnt>12) { cptr->NoWayCnt=0; cptr->NoFindCnt = 32 + rRand(60); }
  1927. if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
  1928. if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
  1929. //===============================================//
  1930. ProcessPrevPhase(cptr);
  1931. //======== select new phase =======================//
  1932. cptr->FTime+=TimeDt;
  1933. if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime) {
  1934. cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
  1935. NewPhase = TRUE; }
  1936. if (NewPhase)
  1937. if (!cptr->State) {
  1938. if (cptr->Phase == DER_IDLE1 || cptr->Phase == DER_IDLE2) {
  1939. if (rRand(128) > 64 && cptr->Phase == DER_IDLE2)
  1940. cptr->Phase = DER_WALK;
  1941. else cptr->Phase = DER_IDLE1 + rRand(1);
  1942. goto ENDPSELECT;
  1943. }
  1944. if (rRand(128) > 120) cptr->Phase=DER_IDLE1; else cptr->Phase=DER_WALK;
  1945. } else
  1946. if (cptr->AfraidTime) cptr->Phase = DER_RUN;
  1947. else cptr->Phase = DER_WALK;
  1948. ENDPSELECT:
  1949. //====== process phase changing ===========//
  1950. if ( (_Phase != cptr->Phase) || NewPhase)
  1951. ActivateCharacterFx(cptr);
  1952. if (_Phase != cptr->Phase) {
  1953. if (_Phase<=2 && cptr->Phase<=2)
  1954. cptr->FTime = _FTime * cptr->pinfo->Animation[cptr->Phase].AniTime / cptr->pinfo->Animation[_Phase].AniTime + 64;
  1955. else if (!NewPhase) cptr->FTime = 0;
  1956. if (cptr->PPMorphTime>128) {
  1957. cptr->PrevPhase = _Phase;
  1958. cptr->PrevPFTime = _FTime;
  1959. cptr->PPMorphTime = 0; }
  1960. }
  1961. cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
  1962. //========== rotation to tgalpha ===================//
  1963. float rspd, currspeed, tgbend;
  1964. float dalpha = (float)fabs(cptr->tgalpha - cptr->alpha);
  1965. float drspd = dalpha; if (drspd>pi) drspd = 2*pi - drspd;
  1966. if (cptr->Phase == DER_IDLE1 || cptr->Phase == DER_IDLE2) goto SKIPROT;
  1967. if (drspd > 0.02)
  1968. if (cptr->tgalpha > cptr->alpha) currspeed = 0.2f + drspd*1.0f;
  1969. else currspeed =-0.2f - drspd*1.0f;
  1970. else currspeed = 0;
  1971. if (cptr->AfraidTime) currspeed*=1.5;
  1972. if (dalpha > pi) currspeed*=-1;
  1973. if ((cptr->State & csONWATER) || cptr->Phase==DER_WALK) currspeed/=1.4f;
  1974. DeltaFunc(cptr->rspeed, currspeed, (float)TimeDt / 400.f);
  1975. tgbend = drspd/2.f;
  1976. if (tgbend>pi/3.f) tgbend = pi/3.f;
  1977. tgbend*= SGN(currspeed);
  1978. DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 2000.f);
  1979. rspd=cptr->rspeed * TimeDt / 612.f;
  1980. if (drspd < fabs(rspd)) cptr->alpha = cptr->tgalpha;
  1981. else cptr->alpha+=rspd;
  1982. if (cptr->alpha > pi * 2) cptr->alpha-= pi * 2;
  1983. if (cptr->alpha < 0 ) cptr->alpha+= pi * 2;
  1984. SKIPROT:
  1985. //========== movement ==============================//
  1986. cptr->lookx = (float)f_cos(cptr->alpha);
  1987. cptr->lookz = (float)f_sin(cptr->alpha);
  1988. float curspeed = 0;
  1989. if (cptr->Phase == DER_RUN ) curspeed = 0.768*2;
  1990. if (cptr->Phase == DER_WALK) curspeed = 0.160*2;
  1991. if (drspd > pi / 2.f) curspeed*=2.f - 2.f*drspd / pi;
  1992. //========== process speed =============//
  1993. curspeed*=cptr->scale;
  1994. if (curspeed>cptr->vspeed) DeltaFunc(cptr->vspeed, curspeed, TimeDt / 1024.f);
  1995. else DeltaFunc(cptr->vspeed, curspeed, TimeDt / 256.f);
  1996. MoveCharacter(cptr, cptr->lookx * cptr->vspeed * TimeDt,
  1997. cptr->lookz * cptr->vspeed * TimeDt, TRUE, TRUE);
  1998. ThinkY_Beta_Gamma(cptr, 128, 64, 0.6f, 0.4f);
  1999. if (cptr->Phase==DER_WALK) cptr->tggamma+= cptr->rspeed / 16.0f;
  2000. else cptr->tggamma+= cptr->rspeed / 10.0f;
  2001. DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 2048.f);
  2002. }
  2003. void AnimateMamm(TCharacter *cptr)
  2004. {
  2005. NewPhase = FALSE;
  2006. int _Phase = cptr->Phase;
  2007. int _FTime = cptr->FTime;
  2008. float _tgalpha = cptr->tgalpha;
  2009. if (cptr->AfraidTime) cptr->AfraidTime = max(0, cptr->AfraidTime - TimeDt);
  2010. if (cptr->State==2) { NewPhase=TRUE; cptr->State=1; }
  2011. TBEGIN:
  2012. float targetx = cptr->tgx;
  2013. float targetz = cptr->tgz;
  2014. float targetdx = targetx - cptr->pos.x;
  2015. float targetdz = targetz - cptr->pos.z;
  2016. float tdist = (float)sqrt( targetdx * targetdx + targetdz * targetdz );
  2017. float playerdx = PlayerX - cptr->pos.x;
  2018. float playerdz = PlayerZ - cptr->pos.z;
  2019. float pdist = (float)sqrt( playerdx * playerdx + playerdz * playerdz );
  2020. //=========== run away =================//
  2021. if (cptr->State) {
  2022. if (!cptr->AfraidTime) {
  2023. cptr->State = 0;
  2024. SetNewTargetPlace(cptr, 8048.f);
  2025. goto TBEGIN;
  2026. }
  2027. nv.x = playerdx; nv.z = playerdz; nv.y = 0;
  2028. NormVector(nv, 2048.f);
  2029. cptr->tgx = cptr->pos.x - nv.x;
  2030. cptr->tgz = cptr->pos.z - nv.z;
  2031. cptr->tgtime = 0;
  2032. }
  2033. //======== exploring area ===============//
  2034. if (!cptr->State) {
  2035. cptr->AfraidTime = 0;
  2036. if (pdist<1024.f) {
  2037. cptr->State = 1;
  2038. cptr->AfraidTime = (6 + rRand(8)) * 1024;
  2039. cptr->Phase = MAM_RUN;
  2040. goto TBEGIN; }
  2041. if (tdist<456) {
  2042. SetNewTargetPlace(cptr, 8048.f);
  2043. goto TBEGIN; }
  2044. }
  2045. //============================================//
  2046. if (pdist<3048) cptr->NoFindCnt = 0;
  2047. if (cptr->NoFindCnt) cptr->NoFindCnt--;
  2048. else {
  2049. cptr->tgalpha = CorrectedAlpha(FindVectorAlpha(targetdx, targetdz), cptr->alpha);//FindVectorAlpha(targetdx, targetdz);
  2050. if (cptr->AfraidTime) {
  2051. cptr->tgalpha += (float)f_sin(RealTime/1024.f) / 3.f;
  2052. if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
  2053. if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
  2054. }
  2055. }
  2056. LookForAWay(cptr, TRUE, TRUE);
  2057. if (cptr->NoWayCnt>12) { cptr->NoWayCnt=0; cptr->NoFindCnt = 32 + rRand(60); }
  2058. if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
  2059. if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
  2060. //===============================================//
  2061. ProcessPrevPhase(cptr);
  2062. //======== select new phase =======================//
  2063. cptr->FTime+=TimeDt;
  2064. if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime) {
  2065. cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
  2066. NewPhase = TRUE; }
  2067. if (NewPhase)
  2068. if (!cptr->State) {
  2069. if (cptr->Phase == MAM_IDLE1 || cptr->Phase == MAM_IDLE2) {
  2070. if (rRand(128) > 64 && cptr->Phase == MAM_IDLE2)
  2071. cptr->Phase = MAM_WALK;
  2072. else cptr->Phase = MAM_IDLE1 + rRand(1);
  2073. goto ENDPSELECT;
  2074. }
  2075. if (rRand(128) > 120) cptr->Phase=MAM_IDLE1; else cptr->Phase=MAM_WALK;
  2076. } else
  2077. if (cptr->AfraidTime) cptr->Phase = MAM_RUN;
  2078. else cptr->Phase = MAM_WALK;
  2079. ENDPSELECT:
  2080. //====== process phase changing ===========//
  2081. if ( (_Phase != cptr->Phase) || NewPhase)
  2082. ActivateCharacterFx(cptr);
  2083. if (_Phase != cptr->Phase) {
  2084. if (_Phase<=2 && cptr->Phase<=2)
  2085. cptr->FTime = _FTime * cptr->pinfo->Animation[cptr->Phase].AniTime / cptr->pinfo->Animation[_Phase].AniTime + 64;
  2086. else if (!NewPhase) cptr->FTime = 0;
  2087. if (cptr->PPMorphTime>128) {
  2088. cptr->PrevPhase = _Phase;
  2089. cptr->PrevPFTime = _FTime;
  2090. cptr->PPMorphTime = 0; }
  2091. }
  2092. cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
  2093. //========== rotation to tgalpha ===================//
  2094. float rspd, currspeed, tgbend;
  2095. float dalpha = (float)fabs(cptr->tgalpha - cptr->alpha);
  2096. float drspd = dalpha; if (drspd>pi) drspd = 2*pi - drspd;
  2097. if (cptr->Phase == MAM_IDLE1 || cptr->Phase == MAM_IDLE2) goto SKIPROT;
  2098. if (drspd > 0.02)
  2099. if (cptr->tgalpha > cptr->alpha) currspeed = 0.2f + drspd*1.0f;
  2100. else currspeed =-0.2f - drspd*1.0f;
  2101. else currspeed = 0;
  2102. if (cptr->AfraidTime) currspeed*=1.5;
  2103. if (dalpha > pi) currspeed*=-1;
  2104. if ((cptr->State & csONWATER) || cptr->Phase==MAM_WALK) currspeed/=1.4f;
  2105. DeltaFunc(cptr->rspeed, currspeed, (float)TimeDt / 400.f);
  2106. tgbend = drspd/2.f;
  2107. if (tgbend>pi/3.f) tgbend = pi/3.f;
  2108. tgbend*= SGN(currspeed);
  2109. DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 2000.f);
  2110. rspd=cptr->rspeed * TimeDt / 612.f;
  2111. if (drspd < fabs(rspd)) cptr->alpha = cptr->tgalpha;
  2112. else cptr->alpha+=rspd;
  2113. if (cptr->alpha > pi * 2) cptr->alpha-= pi * 2;
  2114. if (cptr->alpha < 0 ) cptr->alpha+= pi * 2;
  2115. SKIPROT:
  2116. //========== movement ==============================//
  2117. cptr->lookx = (float)f_cos(cptr->alpha);
  2118. cptr->lookz = (float)f_sin(cptr->alpha);
  2119. float curspeed = 0;
  2120. if (cptr->Phase == MAM_RUN ) curspeed = 0.640*2;
  2121. if (cptr->Phase == MAM_WALK) curspeed = 0.320*2;
  2122. if (drspd > pi / 2.f) curspeed*=2.f - 2.f*drspd / pi;
  2123. //========== process speed =============//
  2124. curspeed*=cptr->scale;
  2125. if (curspeed>cptr->vspeed) DeltaFunc(cptr->vspeed, curspeed, TimeDt / 1024.f);
  2126. else DeltaFunc(cptr->vspeed, curspeed, TimeDt / 256.f);
  2127. MoveCharacter(cptr, cptr->lookx * cptr->vspeed * TimeDt,
  2128. cptr->lookz * cptr->vspeed * TimeDt, TRUE, TRUE);
  2129. ThinkY_Beta_Gamma(cptr, 128, 64, 0.6f, 0.4f);
  2130. if (cptr->Phase==MAM_WALK) cptr->tggamma+= cptr->rspeed / 16.0f;
  2131. else cptr->tggamma+= cptr->rspeed / 10.0f;
  2132. DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 2048.f);
  2133. }
  2134. void AnimateDimor(TCharacter *cptr)
  2135. {
  2136. NewPhase = FALSE;
  2137. int _Phase = cptr->Phase;
  2138. int _FTime = cptr->FTime;
  2139. float _tgalpha = cptr->tgalpha;
  2140. TBEGIN:
  2141. float targetx = cptr->tgx;
  2142. float targetz = cptr->tgz;
  2143. float targetdx = targetx - cptr->pos.x;
  2144. float targetdz = targetz - cptr->pos.z;
  2145. float tdist = (float)sqrt( targetdx * targetdx + targetdz * targetdz );
  2146. float playerdx = PlayerX - cptr->pos.x;
  2147. float playerdz = PlayerZ - cptr->pos.z;
  2148. float pdist = (float)sqrt( playerdx * playerdx + playerdz * playerdz );
  2149. //=========== run away =================//
  2150. if (pdist>(ctViewR+20)*256)
  2151. if (ReplaceCharacterForward(cptr)) goto TBEGIN;
  2152. //======== exploring area ===============//
  2153. if (tdist<1024) {
  2154. SetNewTargetPlace(cptr, 4048.f);
  2155. goto TBEGIN; }
  2156. //============================================//
  2157. cptr->tgalpha = CorrectedAlpha(FindVectorAlpha(targetdx, targetdz), cptr->alpha);//FindVectorAlpha(targetdx, targetdz);
  2158. if (cptr->tgalpha < 0) cptr->tgalpha+=2*pi;
  2159. if (cptr->tgalpha > 2*pi) cptr->tgalpha-=2*pi;
  2160. //===============================================//
  2161. ProcessPrevPhase(cptr);
  2162. //======== select new phase =======================//
  2163. cptr->FTime+=TimeDt;
  2164. if (cptr->FTime >= cptr->pinfo->Animation[cptr->Phase].AniTime) {
  2165. cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
  2166. NewPhase = TRUE; }
  2167. if (NewPhase) {
  2168. if (cptr->Phase == DIM_FLY)
  2169. if (cptr->pos.y > GetLandH(cptr->pos.x, cptr->pos.z) + 2800)
  2170. cptr->Phase = DIM_FLYP;
  2171. else ;
  2172. else
  2173. if (cptr->Phase == DIM_FLYP)
  2174. if (cptr->pos.y < GetLandH(cptr->pos.x, cptr->pos.z) + 1800)
  2175. cptr->Phase = DIM_FLY;
  2176. }
  2177. //====== process phase changing ===========//
  2178. if ( (_Phase != cptr->Phase) || NewPhase)
  2179. if ( (rand() & 1023) > 980 )
  2180. ActivateCharacterFx(cptr);
  2181. if (_Phase != cptr->Phase) {
  2182. if (!NewPhase) cptr->FTime = 0;
  2183. if (cptr->PPMorphTime>128) {
  2184. cptr->PrevPhase = _Phase;
  2185. cptr->PrevPFTime = _FTime;
  2186. cptr->PPMorphTime = 0; }
  2187. }
  2188. cptr->FTime %= cptr->pinfo->Animation[cptr->Phase].AniTime;
  2189. //========== rotation to tgalpha ===================//
  2190. float rspd, currspeed, tgbend;
  2191. float dalpha = (float)fabs(cptr->tgalpha - cptr->alpha);
  2192. float drspd = dalpha; if (drspd>pi) drspd = 2*pi - drspd;
  2193. if (drspd > 0.02)
  2194. if (cptr->tgalpha > cptr->alpha) currspeed = 0.6f + drspd*1.2f;
  2195. else currspeed =-0.6f - drspd*1.2f;
  2196. else currspeed = 0;
  2197. if (dalpha > pi) currspeed*=-1;
  2198. DeltaFunc(cptr->rspeed, currspeed, (float)TimeDt / 460.f);
  2199. tgbend = drspd/2.f;
  2200. if (tgbend>pi/2) tgbend = pi/2;
  2201. tgbend*= SGN(currspeed);
  2202. if (fabs(tgbend) > fabs(cptr->bend)) DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 800.f);
  2203. else DeltaFunc(cptr->bend, tgbend, (float)TimeDt / 400.f);
  2204. rspd=cptr->rspeed * TimeDt / 1024.f;
  2205. if (drspd < fabs(rspd)) cptr->alpha = cptr->tgalpha;
  2206. else cptr->alpha+=rspd;
  2207. if (cptr->alpha > pi * 2) cptr->alpha-= pi * 2;
  2208. if (cptr->alpha < 0 ) cptr->alpha+= pi * 2;
  2209. //========== movement ==============================//
  2210. cptr->lookx = (float)f_cos(cptr->alpha);
  2211. cptr->lookz = (float)f_sin(cptr->alpha);
  2212. float curspeed = 0;
  2213. if (cptr->Phase == DIM_FLY ) curspeed = 1.5f;
  2214. if (cptr->Phase == DIM_FLYP) curspeed = 1.3f;
  2215. if (drspd > pi / 2.f) curspeed*=2.f - 2.f*drspd / pi;
  2216. if (cptr->Phase == DIM_FLY)
  2217. DeltaFunc(cptr->pos.y, GetLandH(cptr->pos.x, cptr->pos.z)+4048, TimeDt / 6.f);
  2218. else
  2219. DeltaFunc(cptr->pos.y, GetLandH(cptr->pos.x, cptr->pos.z), TimeDt / 16.f);
  2220. if (cptr->pos.y < GetLandH(cptr->pos.x, cptr->pos.z) + 236)
  2221. cptr->pos.y = GetLandH(cptr->pos.x, cptr->pos.z) + 256;
  2222. //========== process speed =============//
  2223. curspeed*=cptr->scale;
  2224. DeltaFunc(cptr->vspeed, curspeed, TimeDt / 2024.f);
  2225. cptr->pos.x+= cptr->lookx * cptr->vspeed * TimeDt;
  2226. cptr->pos.z+= cptr->lookz * cptr->vspeed * TimeDt;
  2227. cptr->tggamma = cptr->rspeed / 4.0f;
  2228. if (cptr->tggamma > pi / 6.f) cptr->tggamma = pi / 6.f;
  2229. if (cptr->tggamma <-pi / 6.f) cptr->tggamma =-pi / 6.f;
  2230. DeltaFunc(cptr->gamma, cptr->tggamma, TimeDt / 2048.f);
  2231. }
  2232. void AnimateCharacters()
  2233. {
  2234. //if (!RunMode) return;
  2235. TCharacter *cptr;
  2236. if (TrophyMode) return;
  2237. for (CurDino=0; CurDino<ChCount; CurDino++) {
  2238. cptr = &Characters[CurDino];
  2239. if (cptr->StateF == 0xFF) continue;
  2240. cptr->tgtime+=TimeDt;
  2241. if (cptr->tgtime > 30*1000) SetNewTargetPlace(cptr, 2048);
  2242. if (cptr->Health)
  2243. if (cptr->BloodTTime) {
  2244. cptr->BloodTTime-=TimeDt;
  2245. if (cptr->BloodTTime<0) cptr->BloodTTime=0;
  2246. float k = (20000.f + cptr->BloodTTime) / 90000.f;
  2247. if (k>1.5) k = 1.5;
  2248. cptr->BloodTime+=(int)((float)TimeDt * k);
  2249. if (cptr->BloodTime>600) {
  2250. cptr->BloodTime=rRand(228);
  2251. AddBloodTrail(cptr);
  2252. if (rRand(128) > 96) AddBloodTrail(cptr);
  2253. }
  2254. }
  2255. switch (cptr->AI) {
  2256. case AI_PIG : if (cptr->Health) AnimatePig(cptr); else AnimatePigDead(cptr);
  2257. break;
  2258. case AI_ARCHEO : if (cptr->Health) AnimateDimor(cptr); else AnimateDimorDead(cptr);
  2259. break;
  2260. case AI_BIGFOOT:
  2261. break;
  2262. case AI_POACHER: ;
  2263. break;
  2264. case AI_BRONT: if (cptr->Health) AnimateBron(cptr); else AnimateBronDead(cptr);
  2265. break;
  2266. case AI_HOG : if (cptr->Health) AnimateHog(cptr); else AnimateHogDead(cptr);
  2267. break;
  2268. case AI_WOLF : if (cptr->Health) AnimateWolf(cptr); else AnimateBronDead(cptr);
  2269. break;
  2270. case AI_RHINO: if (cptr->Health) AnimateRhino(cptr); else AnimateRhinoDead(cptr);
  2271. break;
  2272. case AI_DIATR: if (cptr->Health) AnimateDiatr(cptr); else AnimateDiatrDead(cptr);
  2273. break;
  2274. case AI_DEER : if (cptr->Health) AnimateDeer(cptr); else AnimateDeerDead(cptr);
  2275. break;
  2276. case AI_SMILO: if (cptr->Health) AnimateSmilo(cptr); else AnimateSmiloDead(cptr);
  2277. break;
  2278. case AI_MAMM : if (cptr->Health) AnimateMamm(cptr); else AnimateDeerDead(cptr);
  2279. break;
  2280. case AI_BEAR : if (cptr->Health) AnimateBear(cptr); else AnimateBronDead(cptr);
  2281. break;
  2282. /*
  2283. case AI_ANKY : if (cptr->Health) AnimateAnky(cptr); else AnimateAnkyDead(cptr);
  2284. break;
  2285. case AI_STEGO: if (cptr->Health) AnimateSteg(cptr); else AnimateStegDead(cptr);
  2286. break;
  2287. case AI_ALLO : if (cptr->Health) AnimateRaptor(cptr); else AnimateRaptorDead(cptr);
  2288. break;
  2289. case AI_CHASM: if (cptr->Health) AnimateTric(cptr); else AnimateTricDead(cptr);
  2290. break;
  2291. case AI_VELO : if (cptr->Health) AnimateVelo(cptr); else AnimateVeloDead(cptr);
  2292. break;
  2293. case AI_SPINO: if (cptr->Health) AnimateSpin(cptr); else AnimateSpinDead(cptr);
  2294. break;
  2295. case AI_CERAT: if (cptr->Health) AnimateCera(cptr); else AnimateCeraDead(cptr);
  2296. break;
  2297. case AI_TREX : if (cptr->Health) AnimateTRex(cptr); else AnimateTRexDead(cptr);
  2298. break;
  2299. */
  2300. case 0 : AnimateHuntDead(cptr); break;
  2301. }
  2302. }
  2303. }
  2304. void MakeNoise(Vector3d pos, float range)
  2305. {
  2306. for (int c=0; c<ChCount; c++) {
  2307. TCharacter *cptr = &Characters[c];
  2308. if (!cptr->Health) continue;
  2309. float l = VectorLength(SubVectors(cptr->pos, pos));
  2310. if (l>range) continue;
  2311. cptr->AfraidTime = (int) (10.f + (range-l) / 256.f) * 1024;
  2312. cptr->State = 2;
  2313. cptr->NoFindCnt = 0;
  2314. }
  2315. }
  2316. void CheckAfraid()
  2317. {
  2318. if (!MyHealth) return;
  2319. if (TrophyMode) return;
  2320. Vector3d ppos, plook, clook, wlook, rlook;
  2321. ppos = PlayerPos;
  2322. if (DEBUG || UNDERWATER || ObservMode) return;
  2323. plook.y = 0;
  2324. plook.x = (float) f_sin(CameraAlpha);
  2325. plook.z = (float)-f_cos(CameraAlpha);
  2326. wlook = Wind.nv;
  2327. float kR, kwind, klook, kstand;
  2328. float kmask = 1.0f;
  2329. float kskill = 1.0f;
  2330. float kscent = 1.0f;
  2331. if (CamoMode) kmask *=1.5;
  2332. if (ScentMode) kscent*=1.5;
  2333. for (int c=0; c<ChCount; c++) {
  2334. TCharacter *cptr = &Characters[c];
  2335. if (!cptr->Health) continue;
  2336. if (cptr->AI<10) continue;
  2337. if (cptr->AfraidTime || cptr->State==1) continue;
  2338. rlook = SubVectors(ppos, cptr->pos);
  2339. kR = VectorLength( rlook ) / 256.f / (32.f + ctViewR/2);
  2340. NormVector(rlook, 1.0f);
  2341. kR *= 2.5f / (float)(1.5+OptSens/128.f );
  2342. if (kR > 3.0f) continue;
  2343. clook.x = cptr->lookx;
  2344. clook.y = 0;
  2345. clook.z = cptr->lookz;
  2346. MulVectorsScal(wlook, rlook, kwind); kwind*=Wind.speed / 10;
  2347. MulVectorsScal(clook, rlook, klook); klook*=-1.f;
  2348. if (HeadY > 180) kstand = 0.7f; else kstand = 1.2f;
  2349. //============= reasons ==============//
  2350. float kALook = kR * ((klook+3.f) / 3.f) * kstand * kmask;
  2351. if (klook>0.3) kALook*= 2.0;
  2352. if (klook>0.8) kALook*= 2.0;
  2353. kALook/=DinoInfo[cptr->CType].LookK;
  2354. if (kALook < 1.0)
  2355. if (TraceLook(cptr->pos.x, cptr->pos.y+220, cptr->pos.z,
  2356. PlayerX, PlayerY+HeadY/2.f, PlayerZ) ) kALook*=1.3f;
  2357. if (kALook < 1.0)
  2358. if (TraceLook(cptr->pos.x, cptr->pos.y+220, cptr->pos.z,
  2359. PlayerX, PlayerY+HeadY, PlayerZ) ) kALook = 2.0;
  2360. kALook *= (1.f + (float)ObjectsOnLook / 6.f);
  2361. /*
  2362. if (kR<1.0f) {
  2363. char t[32];
  2364. wsprintf(t,"%d", ObjectsOnLook);
  2365. AddMessage(t);
  2366. kALook = 20.f;
  2367. }
  2368. */
  2369. float kASmell = kR * ((kwind+2.0f) / 2.0F) * ((klook+3.f) / 3.f) * kscent;
  2370. if (kwind>0) kASmell*= 2.0;
  2371. kASmell/=DinoInfo[cptr->CType].SmellK;
  2372. float kRes = min (kALook, kASmell);
  2373. if (kRes < 1.0) {
  2374. /*
  2375. MessageBeep(0xFFFFFFFF);
  2376. char t[128];
  2377. if (kALook<kASmell)
  2378. sprintf(t, "LOOK: KR: %f Tr: %d K: %f", kR, ObjectsOnLook, kALook);
  2379. else
  2380. sprintf(t, "SMELL: KR: %f Tr: %d K: %f", kR, ObjectsOnLook, kASmell);
  2381. AddMessage(t);
  2382. */
  2383. kRes = min (kRes, kR);
  2384. cptr->AfraidTime = (int)(1.0 / (kRes+0.1) * 10.f * 1000.f);
  2385. cptr->State = 2;
  2386. cptr->NoFindCnt = 0;
  2387. }
  2388. }
  2389. }
  2390. void PlaceTrophy()
  2391. {
  2392. ChCount = 0;
  2393. for (int c=0; c<24; c++) {
  2394. if (!TrophyRoom.Body[c].ctype) continue;
  2395. Characters[ChCount].CType = TrophyRoom.Body[c].ctype;
  2396. if (c<6) Characters[ChCount].alpha = pi/2; else
  2397. if (c<12) Characters[ChCount].alpha = pi; else
  2398. if (c<18) Characters[ChCount].alpha = pi*3/2; else
  2399. Characters[ChCount].alpha = 0;
  2400. ResetCharacter(&Characters[ChCount]);
  2401. Characters[ChCount].State = c;
  2402. Characters[ChCount].scale = TrophyRoom.Body[c].scale;
  2403. Characters[ChCount].pos.x = LandingList.list[c].x * 256.f + 128.f;
  2404. Characters[ChCount].pos.z = LandingList.list[c].y * 256.f + 128.f;
  2405. Characters[ChCount].pos.y = GetLandH(Characters[ChCount].pos.x,
  2406. Characters[ChCount].pos.z);
  2407. ChCount++;
  2408. }
  2409. }
  2410. void PlaceCharacters()
  2411. {
  2412. int c, tr;
  2413. ChCount = 0;
  2414. PrintLog("Placing...");
  2415. //return;
  2416. for (c=10; c<30; c++)
  2417. if ( (TargetDino & (1<<c))>0 ) { TargetCall=c; break; }
  2418. //======== lohs =========//
  2419. int MC = 5 + OptDens/80;
  2420. if (OptDayNight==2) MC/=2;
  2421. tr = 0;
  2422. for (c=0; c<MC; c++) {
  2423. Characters[ChCount].CType = 1 + c % 2;
  2424. replace1:
  2425. Characters[ChCount].pos.x = PlayerX + siRand(10040);
  2426. Characters[ChCount].pos.z = PlayerZ + siRand(10040);
  2427. Characters[ChCount].pos.y = GetLandH(Characters[ChCount].pos.x,
  2428. Characters[ChCount].pos.z);
  2429. tr++;
  2430. if (tr>10240) break;
  2431. if (CheckPlaceCollisionP(Characters[ChCount].pos)) goto replace1;
  2432. ResetCharacter(&Characters[ChCount]);
  2433. if (Characters[ChCount].AI==AI_ARCHEO)
  2434. Characters[ChCount].pos.y+=2048.f;
  2435. Characters[ChCount].tgx = Characters[ChCount].pos.x;
  2436. Characters[ChCount].tgz = Characters[ChCount].pos.z;
  2437. Characters[ChCount].tgtime = 0;
  2438. ChCount++;
  2439. }
  2440. int TC = 0;
  2441. int TDi[10];
  2442. TDi[0] = 10;
  2443. for (c=10; c<20; c++)
  2444. if (TargetDino & (1<<c)) TDi[TC++]=c;
  2445. MC = 8 + OptDens/30 + rRand(6);
  2446. tr = 0;
  2447. //======== main =========//
  2448. for (c=0; c<MC; c++) {
  2449. if ((c<4) || (!TargetDino)) Characters[ChCount].CType = AI_to_CIndex[10] + rRand(6); else
  2450. if (c<10) Characters[ChCount].CType = AI_to_CIndex[ TDi[c % (TC)] ];
  2451. else Characters[ChCount].CType = AI_to_CIndex[ TDi[rRand(TC-1)] ];
  2452. //Characters[ChCount].CType = AI_to_CIndex[ AI_BRONT+1];
  2453. //Characters[ChCount].CType = AI_to_CIndex[10] + 7;//rRand(3);
  2454. replace2:
  2455. Characters[ChCount].pos.x = 512*256 + siRand(50*256)*10;
  2456. Characters[ChCount].pos.z = 512*256 + siRand(50*256)*10;
  2457. Characters[ChCount].pos.y = GetLandH(Characters[ChCount].pos.x,
  2458. Characters[ChCount].pos.z);
  2459. tr++;
  2460. if (tr>10240) break;
  2461. if ( fabs(Characters[ChCount].pos.x - PlayerX) +
  2462. fabs(Characters[ChCount].pos.z - PlayerZ) < 256 * 40 )
  2463. goto replace2;
  2464. if (CheckPlaceCollisionP(Characters[ChCount].pos)) goto replace2;
  2465. Characters[ChCount].tgx = Characters[ChCount].pos.x;
  2466. Characters[ChCount].tgz = Characters[ChCount].pos.z;
  2467. Characters[ChCount].tgtime = 0;
  2468. ResetCharacter(&Characters[ChCount]);
  2469. ChCount++;
  2470. }
  2471. PrintLog("\n");
  2472. DemoPoint.DemoTime = 0;
  2473. }
  2474. void CreateChMorphedModel(TCharacter *cptr)
  2475. {
  2476. TAni *aptr = &cptr->pinfo->Animation[cptr->Phase];
  2477. TAni *paptr = &cptr->pinfo->Animation[cptr->PrevPhase];
  2478. int CurFrame, SplineD, PCurFrame, PSplineD;
  2479. float scale = cptr->scale;
  2480. CurFrame = ( (aptr->FramesCount-1) * cptr->FTime * 256) / aptr->AniTime;
  2481. SplineD = CurFrame & 0xFF;
  2482. CurFrame = (CurFrame>>8);
  2483. BOOL PMorph = (cptr->Phase != cptr->PrevPhase) && (cptr->PPMorphTime < PMORPHTIME) && (MORPHP);
  2484. if (PMorph) {
  2485. PCurFrame = ( (paptr->FramesCount-1) * cptr->PrevPFTime * 256) / paptr->AniTime;
  2486. PSplineD = PCurFrame & 0xFF;
  2487. PCurFrame = (PCurFrame>>8);
  2488. }
  2489. if (!MORPHA) { SplineD = 0; PSplineD = 0; }
  2490. float k1, k2, pk1, pk2, pmk1, pmk2;
  2491. k2 = (float)(SplineD) / 256.f;
  2492. k1 = 1.0f - k2;
  2493. k1/=8.f; k2/=8.f;
  2494. if (PMorph) {
  2495. pk2 = (float)(PSplineD) / 256.f;
  2496. pk1 = 1.0f - pk2;
  2497. pk1/=8.f; pk2/=8.f;
  2498. pmk1 = (float)cptr->PPMorphTime / PMORPHTIME;
  2499. pmk2 = 1.f - pmk1;
  2500. }
  2501. int VCount = cptr->pinfo->mptr->VCount;
  2502. short int* adptr = aptr->aniData + CurFrame*VCount*3;
  2503. short int* padptr = paptr->aniData + PCurFrame*VCount*3;
  2504. float sb = (float)f_sin(cptr->beta) * scale;
  2505. float cb = (float)f_cos(cptr->beta) * scale;
  2506. float sg = (float)f_sin(cptr->gamma);
  2507. float cg = (float)f_cos(cptr->gamma);
  2508. for (int v=0; v<VCount; v++) {
  2509. float x = *(adptr+v*3+0) * k1 + *(adptr+(v+VCount)*3+0) * k2;
  2510. float y = *(adptr+v*3+1) * k1 + *(adptr+(v+VCount)*3+1) * k2;
  2511. float z = - (*(adptr+v*3+2) * k1 + *(adptr+(v+VCount)*3+2) * k2);
  2512. if (PMorph) {
  2513. float px = *(padptr+v*3+0) * pk1 + *(padptr+(v+VCount)*3+0) * pk2;
  2514. float py = *(padptr+v*3+1) * pk1 + *(padptr+(v+VCount)*3+1) * pk2;
  2515. float pz = - (*(padptr+v*3+2) * pk1 + *(padptr+(v+VCount)*3+2) * pk2);
  2516. x = x*pmk1 + px* pmk2;
  2517. y = y*pmk1 + py* pmk2;
  2518. z = z*pmk1 + pz* pmk2;
  2519. }
  2520. float zz = z;
  2521. float xx = cg * x - sg * y;
  2522. float yy = cg * y + sg * x;
  2523. //float fi = (z / 400) * (cptr->bend / 1.5f);
  2524. float fi;
  2525. if (z>0) {
  2526. fi = z / 240.f;
  2527. if (fi>1.f) fi=1.f;
  2528. } else {
  2529. fi = z / 380.f;
  2530. if (fi<-1.f) fi=-1.f;
  2531. }
  2532. fi*=cptr->bend;
  2533. float bendc = (float)f_cos(fi);
  2534. float bends = (float)f_sin(fi);
  2535. float bx = bendc * xx - bends * zz;
  2536. float bz = bendc * zz + bends * xx;
  2537. zz = bz;
  2538. xx = bx;
  2539. cptr->pinfo->mptr->gVertex[v].x = xx * scale;
  2540. cptr->pinfo->mptr->gVertex[v].y = cb * yy - sb * zz;
  2541. cptr->pinfo->mptr->gVertex[v].z = cb * zz + sb * yy;
  2542. }
  2543. }
  2544. void CreateMorphedModel(TModel* mptr, TAni *aptr, int FTime, float scale)
  2545. {
  2546. int CurFrame = ((aptr->FramesCount-1) * FTime * 256) / aptr->AniTime;
  2547. int SplineD = CurFrame & 0xFF;
  2548. CurFrame = (CurFrame>>8);
  2549. float k2 = (float)(SplineD) / 256.f;
  2550. float k1 = 1.0f - k2;
  2551. k1*=scale/8.f;
  2552. k2*=scale/8.f;
  2553. int VCount = mptr->VCount;
  2554. short int* adptr = &(aptr->aniData[CurFrame*VCount*3]);
  2555. for (int v=0; v<VCount; v++) {
  2556. mptr->gVertex[v].x = *(adptr+v*3+0) * k1 + *(adptr+(v+VCount)*3+0) * k2;
  2557. mptr->gVertex[v].y = *(adptr+v*3+1) * k1 + *(adptr+(v+VCount)*3+1) * k2;
  2558. mptr->gVertex[v].z =- *(adptr+v*3+2) * k1 - *(adptr+(v+VCount)*3+2) * k2;
  2559. }
  2560. }
  2561. void CreateMorphedObject(TModel* mptr, TVTL &vtl, int FTime)
  2562. {
  2563. int CurFrame = ((vtl.FramesCount-1) * FTime * 256) / vtl.AniTime;
  2564. int SplineD = CurFrame & 0xFF;
  2565. CurFrame = (CurFrame>>8);
  2566. float k2 = (float)(SplineD) / 256.f;
  2567. float k1 = 1.0f - k2;
  2568. k1/=8.f; k2/=8.f;
  2569. int VCount = mptr->VCount;
  2570. short int* adptr = &(vtl.aniData[CurFrame*VCount*3]);
  2571. for (int v=0; v<VCount; v++) {
  2572. mptr->gVertex[v].x = *(adptr+v*3+0) * k1 + *(adptr+(v+VCount)*3+0) * k2;
  2573. mptr->gVertex[v].y = *(adptr+v*3+1) * k1 + *(adptr+(v+VCount)*3+1) * k2;
  2574. mptr->gVertex[v].z =- *(adptr+v*3+2) * k1 - *(adptr+(v+VCount)*3+2) * k2;
  2575. }
  2576. }