From: sf17k Date: Wed, 4 May 2011 22:09:15 +0000 (-0400) Subject: MAJOR cleanup X-Git-Url: https://git.jsancho.org/?a=commitdiff_plain;h=6bd4d8e827e8e47b78db4a1f236cba2eed7032b4;p=lugaru.git MAJOR cleanup --- diff --git a/Source/Game.cpp b/Source/Game.cpp index c3c846d..1002b0a 100644 --- a/Source/Game.cpp +++ b/Source/Game.cpp @@ -84,13 +84,8 @@ Game::Game() // SkyBox skybox; cameramode = 0; - cameratogglekeydown = 0; - chattogglekeydown = 0; olddrawmode = 0; drawmode = 0; - drawmodetogglekeydown = 0; - explodetogglekeydown = 0; - detailtogglekeydown = 0; firstload = 0; oldbutton = 0; @@ -154,10 +149,6 @@ Game::Game() // XYZ cameraloc; cameradist = 0; - envtogglekeydown = 0; - slomotogglekeydown = 0; - texturesizetogglekeydown = 0; - freezetogglekeydown = 0; drawtoggle = 0; editorenabled = 0; @@ -194,12 +185,9 @@ Game::Game() displayblink = 0; displayselected = 0; consolekeydown = 0; - consoletogglekeydown = 0; consoleblinkdelay = 0; consoleblink = 0; consoleselected = 0; -// memset(togglekey, 0, sizeof(togglekey)); -// memset(togglekeydelay, 0, sizeof(togglekeydelay)); autocam = 0; crouchkey = 0,jumpkey = 0,forwardkey = 0,chatkey = 0,backkey = 0,leftkey = 0,rightkey = 0,drawkey = 0,throwkey = 0,attackkey = 0; diff --git a/Source/Game.h b/Source/Game.h index 63bb0a6..92a6945 100644 --- a/Source/Game.h +++ b/Source/Game.h @@ -118,13 +118,8 @@ class Game float rotation,rotation2; SkyBox skybox; bool cameramode; - bool cameratogglekeydown; - bool chattogglekeydown; int olddrawmode; int drawmode; - bool drawmodetogglekeydown; - bool explodetogglekeydown; - bool detailtogglekeydown; bool firstload; bool oldbutton; @@ -180,10 +175,6 @@ class Game XYZ cameraloc; float cameradist; - bool envtogglekeydown; - bool slomotogglekeydown; - bool texturesizetogglekeydown; - bool freezetogglekeydown; int drawtoggle; bool editorenabled; @@ -219,12 +210,9 @@ class Game bool displayblink; int displayselected; bool consolekeydown; - bool consoletogglekeydown; float consoleblinkdelay; bool consoleblink; int consoleselected; - //int togglekey[140]; - //float togglekeydelay[140]; bool autocam; unsigned short crouchkey,jumpkey,forwardkey,chatkey,backkey,leftkey,rightkey,drawkey,throwkey,attackkey; @@ -241,6 +229,16 @@ class Game void Dispose(); int DrawGLScene(StereoSide side); void DrawGL(); + //factored from Tick() -sf17k + void MenuTick(); + void doTutorial(); + void doDebugKeys(); + void doJumpReversals(); + void doAerialAcrobatics(); + void doAttacks(); + void doPlayerCollisions(); + void doAI(int i); + //end factored void Tick(); void TickOnce(); void TickOnceAfter(); @@ -296,7 +294,6 @@ class Game void inputText(char* str, int* charselected, int* nb_chars); void flash(); bool waiting; - bool mainmenutogglekeydown; //int mainmenu; Account* accountactive; }; diff --git a/Source/GameTick.cpp b/Source/GameTick.cpp index b30d4f1..1fba112 100644 --- a/Source/GameTick.cpp +++ b/Source/GameTick.cpp @@ -47,9 +47,7 @@ using namespace std; extern float multiplier; extern XYZ viewer; extern int environment; -extern float texscale; extern Terrain terrain; -extern int kTextureSize; extern float screenwidth,screenheight; extern float gravity; extern int detail; @@ -60,9 +58,6 @@ extern float slomodelay; extern bool floatjump; extern float volume; extern Light light; -extern float texdetail; -extern GLubyte bloodText[512*512*3]; -extern GLubyte wolfbloodText[512*512*3]; extern float camerashake; extern float woozy; extern float blackout; @@ -78,36 +73,22 @@ extern bool ambientsound; extern bool mousejump; extern float viewdistance; extern bool freeze; -extern bool autoslomo; extern bool keyboardfrozen; -extern int netdatanew; extern bool loadingstuff; extern XYZ windvector; extern bool debugmode; static int music1; extern int mainmenu; -extern int oldmainmenu; extern bool visibleloading; extern int loadscreencolor; -extern float flashamount,flashr,flashg,flashb; -extern int flashdelay; extern XYZ envsound[30]; extern float envsoundvol[30]; extern int numenvsounds; extern float envsoundlife[30]; extern float usermousesensitivity; extern bool ismotionblur; -extern bool foliage; -extern bool trilinear; -extern bool damageeffects; -extern bool showpoints; extern bool showdamagebar; // (des)activate the damage bar -extern bool texttoggle; -extern bool alwaysblur; -extern float gamespeed; extern bool decals; -extern bool immediate; -extern bool velocityblur; extern float tintr,tintg,tintb; extern bool skyboxtexture; extern float skyboxr; @@ -148,7 +129,6 @@ extern float hotspotsize[40]; extern char hotspottext[40][256]; extern int currenthotspot; -extern int kBitsPerPixel; extern int hostile; extern bool stillloading; @@ -156,8 +136,6 @@ extern bool winfreeze; extern bool campaign; -extern float oldgamespeed; - static const char *rabbitskin[] = { ":Data:Textures:Fur3.jpg", ":Data:Textures:Fur.jpg", @@ -206,6 +184,93 @@ static console_handler cmd_handlers[] = { #undef DECLARE_COMMAND }; + + +// added utility functions -sf17k ============================================================= + +//TODO: try to hide these variables completely with a better interface +inline void setAnimation(int playerid,int animation){ + player[playerid].targetanimation=animation; + player[playerid].targetframe=0; + player[playerid].target=0; +} + +//TODO: this is incorrect but I'm afraid to change it and break something, +//probably causes quirky behavior that I might want to preserve +inline float roughDirection(XYZ vec){ + Normalise(&vec); + float angle=-asin(-vec.x)*180/M_PI; + if(vec.z<0) + angle=180-angle; + return angle; +} +inline float roughDirectionTo(XYZ start, XYZ end){ + return roughDirection(end-start); +} + +//TODO: gotta be a better way +inline float pitch(XYZ vec){ + Normalise(&vec); + return -asin(vec.y)*180/M_PI; +} +inline float pitchTo(XYZ start, XYZ end){ + return pitch(end-start); +} + +//change these to a Person method +inline Joint& playerJoint(int playerid, int bodypart){ + return player[playerid].skeleton.joints[player[playerid].skeleton.jointlabels[bodypart]]; } +inline Joint& playerJoint(Person* pplayer, int bodypart){ + return pplayer->skeleton.joints[pplayer->skeleton.jointlabels[bodypart]]; } + +inline float sq(float n){ return n*n; } + +inline float stepTowardf(float from, float to, float by){ + if(fabs(from-to)to) return from-by; + else return from+by; +} + +void playdialogueboxsound(){ + XYZ temppos; + temppos=player[participantfocus[whichdialogue][indialogue]].coords; + temppos=temppos-viewer; + Normalise(&temppos); + temppos+=viewer; + + int sound=-1; + switch(dialogueboxsound[whichdialogue][indialogue]){ + case -6: sound=alarmsound; break; + case -4: sound=consolefailsound; break; + case -3: sound=consolesuccesssound; break; + case -2: sound=firestartsound; break; + case -1: sound=fireendsound; break; + case 1: sound=rabbitchitter; break; + case 2: sound=rabbitchitter2; break; + case 3: sound=rabbitpainsound; break; + case 4: sound=rabbitpain1sound; break; + case 5: sound=rabbitattacksound; break; + case 6: sound=rabbitattack2sound; break; + case 7: sound=rabbitattack3sound; break; + case 8: sound=rabbitattack4sound; break; + case 9: sound=growlsound; break; + case 10: sound=growl2sound; break; + case 11: sound=snarlsound; break; + case 12: sound=snarl2sound; break; + case 13: sound=barksound; break; + case 14: sound=bark2sound; break; + case 15: sound=bark3sound; break; + case 16: sound=barkgrowlsound; break; + default: break; + } + if(sound!=-1) + emit_sound_at(sound, temppos); +} + +// end added utility functions ================================================================ + + + static void ch_quit(Game *game, const char *args) { game->tryquit = 1; @@ -238,7 +303,7 @@ static void ch_save(Game *game, const char *args) fpackf(tfile, "Bf Bf Bf", skyboxlightr, skyboxlightg, skyboxlightb); fpackf(tfile, "Bf Bf Bf Bf Bf Bi", player[0].coords.x, player[0].coords.y, player[0].coords.z, player[0].rotation, player[0].targetrotation, player[0].num_weapons); if(player[0].num_weapons>0&&player[0].num_weapons<5) - for(j=0;jnumpathpoints); - for(j=0;jnumpathpoints;j++){ + for(int j=0;jnumpathpoints;j++){ fpackf(tfile, "Bf Bf Bf Bi", game->pathpoint[j].x, game->pathpoint[j].y, game->pathpoint[j].z, game->numpathpointconnect[j]); - for(k=0;knumpathpointconnect[j];k++){ + for(int k=0;knumpathpointconnect[j];k++){ fpackf(tfile, "Bi", game->pathpointconnect[j][k]); } } @@ -700,8 +765,7 @@ static void ch_black(Game *game, const char *args) static void ch_sizemin(Game *game, const char *args) { - int i; - for (i = 1; i < numplayers; i++) + for (int i = 1; i < numplayers; i++) if (player[i].scale < 0.8 * 0.2) player[i].scale = 0.8 * 0.2; } @@ -734,8 +798,8 @@ static void ch_notindemo(Game *game, const char *args) static void ch_type(Game *game, const char *args) { - int i, n = sizeof(editortypenames) / sizeof(editortypenames[0]); - for (i = 0; i < n; i++) + int n = sizeof(editortypenames) / sizeof(editortypenames[0]); + for (int i = 0; i < n; i++) if (stripfx(args, editortypenames[i])) { editoractive = i; break; @@ -744,8 +808,8 @@ static void ch_type(Game *game, const char *args) static void ch_path(Game *game, const char *args) { - int i, n = sizeof(pathtypenames) / sizeof(pathtypenames[0]); - for (i = 0; i < n; i++) + int n = sizeof(pathtypenames) / sizeof(pathtypenames[0]); + for (int i = 0; i < n; i++) if (stripfx(args, pathtypenames[i])) { editorpathtype = i; break; @@ -771,7 +835,7 @@ static void ch_hs(Game *game, const char *args) static void ch_dialogue(Game *game, const char *args) { - int dlg, i, j; + int dlg; char buf1[32], buf2[64]; sscanf(args, "%d %31s", &dlg, buf1); @@ -785,7 +849,7 @@ static void ch_dialogue(Game *game, const char *args) ifstream ipstream(ConvertFileName(buf2)); ipstream.ignore(256,':'); ipstream >> numdialogueboxes[numdialogues]; - for(i=0;i> dialogueboxsound[numdialogues][i]; } - for(i=0;i> numdialogueboxes[whichdi]; - for(i=0;i= numdialogues) return; - for(i=0;iendpoint.x)minx=endpoint.x; - miny=startpoint.y; - if(miny>endpoint.y)miny=endpoint.y; - minz=startpoint.z; - if(minz>endpoint.z)minz=endpoint.z; - - maxx=startpoint.x; - if(maxxminx-objects.model[i].boundingsphereradius&&objects.position[i].xminy-objects.model[i].boundingsphereradius&&objects.position[i].yminz-objects.model[i].boundingsphereradius&&objects.position[i].zminx-objects.model[i].boundingsphereradius&& + objects.position[i].xminy-objects.model[i].boundingsphereradius&& + objects.position[i].yminz-objects.model[i].boundingsphereradius&& + objects.position[i].zendpoint.x)minx=endpoint.x; - miny=startpoint.y; - if(miny>endpoint.y)miny=endpoint.y; - minz=startpoint.z; - if(minz>endpoint.z)minz=endpoint.z; - - maxx=startpoint.x; - if(maxxminx-objects.model[what].boundingsphereradius&&objects.position[what].xminy-objects.model[what].boundingsphereradius&&objects.position[what].yminz-objects.model[what].boundingsphereradius&&objects.position[what].zminx-objects.model[what].boundingsphereradius&& + objects.position[what].xminy-objects.model[what].boundingsphereradius&& + objects.position[what].yminz-objects.model[what].boundingsphereradius&& + objects.position[what].z= 0 && which <= 15) - { + } else if (which >= 0 && which <= 15) { char buf[32]; snprintf(buf, 32, "map%d", which + 1); Loadlevel(buf); - } - else - Loadlevel("mapsave"); + } else + Loadlevel("mapsave"); } void Game::Loadlevel(const char *name){ - int i,j,k,l,m; static int oldlevel; int templength; float lamefloat; @@ -1501,7 +1480,7 @@ void Game::Loadlevel(const char *name){ numdialogues=0; - for(i=0;i<20;i++) + for(int i=0;i<20;i++) { dialoguegonethrough[i]=0; } @@ -1529,7 +1508,7 @@ void Game::Loadlevel(const char *name){ freeze=0; winfreeze=0; - for(i=0;i<100;i++) + for(int i=0;i<100;i++) { bonusnum[i]=0; } @@ -1566,21 +1545,21 @@ void Game::Loadlevel(const char *name){ { terrain.numdecals=0; Sprite::deleteSprites(); - for(i=0;i0&&player[0].num_weapons<5) { - for(j=0;j128||templength<=0)templength=128; + int m; for(m=0;mmaxdistance) @@ -1794,7 +1774,7 @@ void Game::Loadlevel(const char *name){ bool removeanother=0; if(numplayers>1&&numplayers0&&player[i-howmanyremoved].num_weapons<5) { - for(j=0;jmaxplayers-1)numplayers=maxplayers-1; - for(i=0;i2)newdetail=detail; + if(newdetail<0)newdetail=detail; + if(newscreenwidth>3000)newscreenwidth=screenwidth; + if(newscreenwidth<0)newscreenwidth=screenwidth; + if(newscreenheight>3000)newscreenheight=screenheight; + if(newscreenheight<0)newscreenheight=screenheight; + } + + if(Input::MouseClicked()&&selected==3){ + fireSound(); + flash(); + if(!gameon){ + //quit + tryquit=1; + pause_sound(stream_music3); + }else{ + //end game + gameon=0; + mainmenu=1; + } + } + } + if(mainmenu==3){ + if(Input::MouseClicked()){ + + if(selected!=-1) + fireSound(); + + switch(selected){ + case 0: { + extern SDL_Rect **resolutions; + bool isCustomResolution = true; + bool found = false; + for(int i = 0; (!found) && (resolutions[i]); i++){ + if((resolutions[i]->w == screenwidth) && (resolutions[i]->h == screenwidth)) + isCustomResolution = false; + + if((resolutions[i]->w == newscreenwidth) && (resolutions[i]->h == newscreenheight)){ + i++; + if(resolutions[i] != NULL){ + newscreenwidth = (int) resolutions[i]->w; + newscreenheight = (int) resolutions[i]->h; + }else if(isCustomResolution){ + if((screenwidth == newscreenwidth) && (screenheight == newscreenheight)){ + newscreenwidth = (int) resolutions[0]->w; + newscreenheight = (int) resolutions[0]->h; + }else{ + newscreenwidth = screenwidth; + newscreenheight = screenheight; + } + }else{ + newscreenwidth = (int) resolutions[0]->w; + newscreenheight = (int) resolutions[0]->h; + } + found = true; + } + } + + if(!found){ + newscreenwidth = (int) resolutions[0]->w; + newscreenheight = (int) resolutions[0]->h; + } + } break; + case 1: + newdetail++; + if(newdetail>2)newdetail=0; + break; + case 2: + bloodtoggle++; + if(bloodtoggle>2)bloodtoggle=0; + break; + case 3: + difficulty++; + if(difficulty>2)difficulty=0; + break; + case 4: + ismotionblur=1-ismotionblur; + break; + case 5: + decals=1-decals; + break; + case 6: + musictoggle=1-musictoggle; + + if(!musictoggle){ + pause_sound(music1); + pause_sound(stream_music2); + pause_sound(stream_music3); + + for(int i=0;i<4;i++){ + oldmusicvolume[i]=0; + musicvolume[i]=0; + } + } + + if(musictoggle) + emit_stream_np(stream_music3); + break; + case 7: + flash(); + //options + mainmenu=4; + selected=-1; + keyselect=-1; + break; + case 8: + flash(); + + if(newdetail>2)newdetail=detail; + if(newdetail<0)newdetail=detail; + if(newscreenwidth<0)newscreenwidth=screenwidth; + if(newscreenheight<0)newscreenheight=screenheight; + + SaveSettings(*this); + if(mainmenu==3&&gameon)mainmenu=2; + if(mainmenu==3&&!gameon)mainmenu=1; + break; + case 9: + invertmouse=1-invertmouse; + break; + case 10: + usermousesensitivity+=.2; + if(usermousesensitivity>2)usermousesensitivity=.2; + break; + case 11: + volume+=.1f; + if(volume>1.0001f)volume=0; + OPENAL_SetSFXMasterVolume((int)(volume*255)); + break; + case 12: + flash(); + + newstereomode = stereomode; + mainmenu=18; + keyselect=-1; + break; + case 13: + showdamagebar=!showdamagebar; + break; + } + } + } + if(mainmenu==4){ + if(Input::MouseClicked()&&selected!=-1&&!waiting){ + fireSound(); + if(selected<9&&keyselect==-1) + keyselect=selected; + if(keyselect!=-1) + setKeySelected(); + if(selected==9){ + flash(); + + mainmenu=3; + + if(newdetail>2)newdetail=detail; + if(newdetail<0)newdetail=detail; + if(newscreenwidth>3000)newscreenwidth=screenwidth; + if(newscreenwidth<0)newscreenwidth=screenwidth; + if(newscreenheight>3000)newscreenheight=screenheight; + if(newscreenheight<0)newscreenheight=screenheight; + } + } + } + + if(mainmenu==5){ + + if(endgame==2){ + accountactive->endGame(); + endgame=0; + } + + if(Input::MouseClicked()){ + if((selected-7>=accountactive->getCampaignChoicesMade())){ + fireSound(); + flash(); + startbonustotal=0; + + loading=2; + loadtime=0; + targetlevel=7; + if(firstload) TickOnceAfter(); + else LoadStuff(); + whichchoice=selected-7-accountactive->getCampaignChoicesMade(); + visibleloading=1; + stillloading=1; + Loadlevel(campaignmapname[campaignchoicewhich[selected-7-accountactive->getCampaignChoicesMade()]]); + //Loadlevel(campaignmapname[levelorder[selected-7]]); + campaign=1; + mainmenu=0; + gameon=1; + pause_sound(stream_music3); + } + if(selected>=1 && selected<=5){ + fireSound(); + flash(); + } + switch(selected){ + case 1: + startbonustotal=0; + + loading=2; + loadtime=0; + targetlevel=-1; + if(firstload)TickOnceAfter(); + if(!firstload)LoadStuff(); + else { + Loadlevel(-1); + } + + mainmenu=0; + gameon=1; + pause_sound(stream_music3); + break; + case 2: + mainmenu=9; + break; + case 3: + mainmenu=6; + break; + case 4: + if(mainmenu==5&&gameon)mainmenu=2; + if(mainmenu==5&&!gameon)mainmenu=1; + break; + case 5: + mainmenu=7; + break; + } + } + } + else if(mainmenu==9){ + if(Input::MouseClicked()&&selected=0&&selected<=accountactive->getProgress()){ + fireSound(); + flash(); + + startbonustotal=0; + + loading=2; + loadtime=0; + targetlevel=selected; + if(firstload)TickOnceAfter(); + if(!firstload)LoadStuff(); + else { + Loadlevel(selected); + } + campaign=0; + + mainmenu=0; + gameon=1; + pause_sound(stream_music3); + } + if(Input::MouseClicked()&&selected==numchallengelevels){ + fireSound(); + flash(); + mainmenu=5; + } + } + if(mainmenu==10){ + endgame=2; + if(Input::MouseClicked()&&selected==3){ + fireSound(); + flash(); + mainmenu=5; + } + } + + if(mainmenu==6){ + if(Input::MouseClicked()) { + if(selected>-1){ + fireSound(); + if(selected==1) { + flash(); + accountactive = Account::destroy(accountactive); + mainmenu=7; + } else if(selected==2) { + flash(); + mainmenu=5; + } + } + } + } + if(mainmenu==7){ + if(Input::MouseClicked()) { + if(selected!=-1){ + fireSound(); + if(selected==0&&Account::getNbAccounts()<8){ + entername=1; + } else if (selected-1){ + fireSound(); + flash(); + if(selected<=2) + accountactive->setDifficulty(selected); + mainmenu=5; + } + } + if (mainmenu==18) { + if(Input::MouseClicked()&&selected==0) { + newstereomode = (StereoMode)(newstereomode + 1); + while(!CanInitStereo(newstereomode)) { + printf("Failed to initialize mode %s (%i)\n", StereoModeName(newstereomode), newstereomode); + newstereomode = (StereoMode)(newstereomode + 1); + if ( newstereomode >= stereoCount ) { + newstereomode = stereoNone; + } + } + } + + if(Input::isKeyPressed(MOUSEBUTTON1)&&selected==1) + stereoseparation+=0.001; + if(Input::isKeyPressed(MOUSEBUTTON2)&&selected==1) + stereoseparation-=0.001; + + if(Input::MouseClicked()&&selected==2) { + stereoreverse =! stereoreverse; + } + + if(Input::MouseClicked()&&selected==3) { + flash(); + + stereomode = newstereomode; + InitStereo(stereomode); + + mainmenu=3; + } + } + + if(Input::isKeyDown(SDLK_q)&&Input::isKeyDown(SDLK_LMETA)){ + tryquit=1; + if(mainmenu==3){ + if(newdetail>2)newdetail=detail; + if(newdetail<0)newdetail=detail; + if(newscreenwidth<0)newscreenwidth=screenwidth; + if(newscreenheight<0)newscreenheight=screenheight; + + SaveSettings(*this); + } + } + + if(mainmenu==1||mainmenu==2){ + if(loaddistrib>4)transition+=multiplier/8; + if(transition>1){ + transition=0; + anim++; + if(anim>4)anim=0; + loaddistrib=0; + } + } + OPENAL_SetFrequency(channels[stream_music3], 22050); + + if(entername) { + inputText(displaytext[0],&displayselected,&displaychars[0]); + if(!waiting) { // the input as finished + if(displaychars[0]){ // with enter + accountactive = Account::add(string(displaytext[0])); + + mainmenu=8; + + flash(); + + fireSound(firestartsound); + + for(int i=0;i<255;i++){ + displaytext[0][i]=' '; + } + displaychars[0]=0; + + displayselected=0; + } + entername=0; + } + + displayblinkdelay-=multiplier; + if(displayblinkdelay<=0){ + displayblinkdelay=.3; + displayblink=1-displayblink; + } + } +} + +void Game::doTutorial(){ + if(tutorialstagetime>tutorialmaxtime){ + tutorialstage++; + tutorialsuccess=0; + if(tutorialstage<=1){ + canattack=0; + cananger=0; + reversaltrain=0; + } + switch(tutorialstage){ + case 1: + tutorialmaxtime=5; + break; case 2: + tutorialmaxtime=2; + break; case 3: + tutorialmaxtime=600; + break; case 4: + tutorialmaxtime=1000; + break; case 5: + tutorialmaxtime=600; + break; case 6: + tutorialmaxtime=600; + break; case 7: + tutorialmaxtime=600; + break; case 8: + tutorialmaxtime=600; + break; case 9: + tutorialmaxtime=600; + break; case 10: + tutorialmaxtime=2; + break; case 11: + tutorialmaxtime=1000; + break; case 12: + tutorialmaxtime=1000; + break; case 13: + tutorialmaxtime=2; + break; case 14: { + tutorialmaxtime=3; + + XYZ temp,temp2; + + temp.x=1011; + temp.y=84; + temp.z=491; + temp2.x=1025; + temp2.y=75; + temp2.z=447; + + player[1].coords=(temp+temp2)/2; + + emit_sound_at(fireendsound, player[1].coords); + + for(int i=0;i0)tutorialsuccess=1; + break; case 41: if(player[0].weaponactive==-1&&player[0].num_weapons>0)tutorialsuccess=1; + break; case 43: if(player[0].targetanimation==knifeslashstartanim)tutorialsuccess=1; + break; case 44: if(animation[player[0].targetanimation].attack==reversal)tutorialsuccess=1; + break; case 45: if(animation[player[0].targetanimation].attack==reversal)tutorialsuccess=1; + break; case 46: if(animation[player[0].targetanimation].attack==reversal)tutorialsuccess=1; + break; case 49: if(player[1].weaponstuck!=-1)tutorialsuccess=1; + break; default: break; + } + if(tutorialsuccess>=1)tutorialstagetime=tutorialmaxtime-3; + + + if(tutorialstagetime==tutorialmaxtime-3){ + emit_sound_np(consolesuccesssound); + } + + if(tutorialsuccess>=1){ + if(tutorialstage==34||tutorialstage==35) + tutorialstagetime=tutorialmaxtime-1; + } + } + + if(tutorialstage<14||tutorialstage>=50){ + player[1].coords.y=300; + player[1].velocity=0; + } +} + + + +void Game::doDebugKeys(){ float headprop,bodyprop,armprop,legprop; + if(debugmode){ + if(Input::isKeyPressed(SDLK_v)){ + freeze=1-freeze; + if(freeze){ + OPENAL_SetFrequency(OPENAL_ALL, 0.001); + } + } + + if(Input::isKeyPressed(SDLK_BACKQUOTE)){ + console=1-console; + if(console){ + OPENAL_SetFrequency(OPENAL_ALL, 0.001); + } else { + freeze=0; + waiting=false; + } + } + + if(console) + freeze=1; + if(console&&!Input::isKeyDown(SDLK_LMETA)){ + inputText(consoletext[0],&consoleselected,&consolechars[0]); + if(!waiting) { + archiveselected=0; + cmd_dispatch(this, consoletext[0]); + if(consolechars[0]>0){ + + for(int k=14;k>=1;k--){ + for(int j=0;j<255;j++){ + consoletext[k][j]=consoletext[k-1][j]; + } + consolechars[k]=consolechars[k-1]; + } + for(int j=0;j<255;j++){ + consoletext[0][j]=' '; + } + consolechars[0]=0; + consoleselected=0; + } + } + + consoleblinkdelay-=multiplier; + if(consoleblinkdelay<=0){ + consoleblinkdelay=.3; + consoleblink=1-consoleblink; + } + } + + + + if(Input::isKeyPressed(SDLK_h)){ + player[0].damagetolerance=200000; + player[0].damage=0; + player[0].burnt=0; + player[0].permanentdamage=0; + player[0].superpermanentdamage=0; + } + + if(Input::isKeyPressed(SDLK_j)){ + environment++; + if(environment>2) + environment=0; + Setenvironment(environment); + } + + if(Input::isKeyPressed(SDLK_c)){ + cameramode=1-cameramode; + } + + if(Input::isKeyPressed(SDLK_x)&&!Input::isKeyDown(SDLK_LSHIFT)){ + if(player[0].num_weapons>0){ + if(weapons.type[player[0].weaponids[0]]==sword)weapons.type[player[0].weaponids[0]]=staff; + else if(weapons.type[player[0].weaponids[0]]==staff)weapons.type[player[0].weaponids[0]]=knife; + else weapons.type[player[0].weaponids[0]]=sword; + if(weapons.type[player[0].weaponids[0]]==sword){ + weapons.mass[player[0].weaponids[0]]=1.5; + weapons.tipmass[player[0].weaponids[0]]=1; + weapons.length[player[0].weaponids[0]]=.8; + } + if(weapons.type[player[0].weaponids[0]]==staff){ + weapons.mass[player[0].weaponids[0]]=2; + weapons.tipmass[player[0].weaponids[0]]=1; + weapons.length[player[0].weaponids[0]]=1.5; + } + + if(weapons.type[player[0].weaponids[0]]==knife){ + weapons.mass[player[0].weaponids[0]]=1; + weapons.tipmass[player[0].weaponids[0]]=1.2; + weapons.length[player[0].weaponids[0]]=.25; + } + } + } + + if(Input::isKeyPressed(SDLK_x)&&Input::isKeyDown(SDLK_LSHIFT)){ + int closest=-1; + float closestdist=-1; + float distance; + if(numplayers>1) + for(int i=1;i1) + for(int i=1;i1) + for(int i=1;i9) + player[closest].whichskin=0; + if(player[closest].whichskin>2&&player[closest].creature==wolftype) + player[closest].whichskin=0; + + LoadTextureSave(creatureskin[player[closest].creature][player[closest].whichskin], + &player[closest].skeleton.drawmodel.textureptr,1,&player[closest].skeleton.skinText[0],&player[closest].skeleton.skinsize); + } + + if(player[closest].numclothes){ + for(int i=0;i1) + for(int i=1;i1) + for(int i=1;i1) + for(int i=1;inumchallengelevels-1)targetlevel=0; + loading=1; + leveltime=5; + } + + if(editorenabled){ + if(Input::isKeyPressed(SDLK_DELETE)&&Input::isKeyDown(SDLK_LSHIFT)){ + int closest=-1; + float closestdist=-1; + float distance; + if(numplayers>1) + for(int i=1;i0&&closest>=0){ + //player[closest]=player[numplayers-1]; + //player[closest].skeleton=player[numplayers-1].skeleton; + numplayers--; + } + } + + if(Input::isKeyPressed(SDLK_DELETE)&&Input::isKeyDown(SDLK_LCTRL)){ + int closest=-1; + float closestdist=-1; + float distance; + if(max_objects>1) + for(int i=1;i0&&closest>=0){ + objects.position[closest].y-=500; + } + } + + if(Input::isKeyPressed(SDLK_m)&&Input::isKeyDown(SDLK_LSHIFT)){ + //drawmode++; + //if(drawmode>2)drawmode=0; + if(objects.numobjects1) + for(int i=0;i1&&pathpointselected!=-1){ + numpathpointconnect[pathpointselected]++; + pathpointconnect[pathpointselected][numpathpointconnect[pathpointselected]-1]=numpathpoints-1; + } + pathpointselected=numpathpoints-1; + } + } + } + + if(Input::isKeyPressed(SDLK_PERIOD)){ + pathpointselected++; + if(pathpointselected>=numpathpoints)pathpointselected=-1; + } + if(Input::isKeyPressed(SDLK_COMMA)&&!Input::isKeyDown(SDLK_LSHIFT)){ + pathpointselected--; + if(pathpointselected<=-2) + pathpointselected=numpathpoints-1; + } + if(Input::isKeyPressed(SDLK_COMMA)&&Input::isKeyDown(SDLK_LSHIFT)){ + if(pathpointselected!=-1){ + numpathpoints--; + pathpoint[pathpointselected]=pathpoint[numpathpoints]; + numpathpointconnect[pathpointselected]=numpathpointconnect[numpathpoints]; + for(int i=0;ifiretype)editortype=0; + } + + if(Input::isKeyDown(SDLK_LEFT)&&!Input::isKeyDown(SDLK_LSHIFT)&&!Input::isKeyDown(SDLK_LCTRL)){ + editorrotation-=multiplier*100; + if(editorrotation<-.01)editorrotation=-.01; + } + + if(Input::isKeyDown(SDLK_RIGHT)&&!Input::isKeyDown(SDLK_LSHIFT)&&!Input::isKeyDown(SDLK_LCTRL)){ + editorrotation+=multiplier*100; + } + + if(Input::isKeyDown(SDLK_UP)&&!Input::isKeyDown(SDLK_LCTRL)){ + editorsize+=multiplier; + } + + if(Input::isKeyDown(SDLK_DOWN)&&!Input::isKeyDown(SDLK_LCTRL)){ + editorsize-=multiplier; + if(editorsize<.1)editorsize=.1; + } + + + if(Input::isKeyPressed(SDLK_LEFT)&&Input::isKeyDown(SDLK_LSHIFT)&&Input::isKeyDown(SDLK_LCTRL)){ + mapradius-=multiplier*10; + } + + if(Input::isKeyPressed(SDLK_RIGHT)&&Input::isKeyDown(SDLK_LSHIFT)&&Input::isKeyDown(SDLK_LCTRL)){ + mapradius+=multiplier*10; + } + if(Input::isKeyDown(SDLK_UP)&&Input::isKeyDown(SDLK_LCTRL)){ + editorrotation2+=multiplier*100; + } + + if(Input::isKeyDown(SDLK_DOWN)&&Input::isKeyDown(SDLK_LCTRL)){ + editorrotation2-=multiplier*100; + if(editorrotation2<-.01)editorrotation2=-.01; + } + if(Input::isKeyPressed(SDLK_DELETE)&&objects.numobjects&&Input::isKeyDown(SDLK_LSHIFT)){ + int closest=-1; + float closestdist=-1; + float distance; + for(int i=0;i0&&closest>=0)objects.DeleteObject(closest); + } + } + } +} + + + +void Game::doJumpReversals(){ + for(int k=0;k0&& + !player[k].skeleton.free&& + player[k].targetanimation!=climbanim&& + player[k].targetanimation!=hanganim){ + XYZ lowpoint,lowpointtarget,lowpoint2,lowpointtarget2,lowpoint3,lowpointtarget3,lowpoint4,lowpointtarget4,lowpoint5,lowpointtarget5,lowpoint6,lowpointtarget6,lowpoint7,lowpointtarget7,colpoint,colpoint2; + int whichhit; + bool tempcollide=0; + + if(player[k].collide<-.3) + player[k].collide=-.3; + if(player[k].collide>1) + player[k].collide=1; + player[k].collide-=multiplier*30; + + //clip to terrain + player[k].coords.y=max(player[k].coords.y, terrain.getHeight(player[k].coords.x,player[k].coords.z)); + + for(int l=0;l.5&&player[k].aitype==playercontrolled|| + objects.position[i].y>player[k].coords.y){ + lowpoint=player[k].coords; + if(player[k].targetanimation!=jumpupanim&& + player[k].targetanimation!=jumpdownanim&& + !player[k].isFlip()) + lowpoint.y+=1.25; + else + lowpoint.y+=1.3; + if( player[k].coords.yterrain.getHeight(player[k].coords.x,player[k].coords.z)-.1) + player[k].coords.y=terrain.getHeight(player[k].coords.x,player[k].coords.z); + if(player[k].SphereCheck(&lowpoint, 1.3, &colpoint, &objects.position[i], &objects.rotation[i], &objects.model[i])!=-1){ + flatfacing=lowpoint-player[k].coords; + player[k].coords=lowpoint; + player[k].coords.y-=1.3; + player[k].collide=1; + tempcollide=1; + //wall jumps + //TODO: refactor four similar blocks + if(player[k].aitype==playercontrolled&& + (player[k].targetanimation==jumpupanim|| + player[k].targetanimation==jumpdownanim|| + player[k].isFlip())&& + !player[k].jumptogglekeydown&& + player[k].jumpkeydown){ + lowpointtarget=lowpoint+DoRotation(player[k].facing,0,-90,0)*1.5; + XYZ tempcoords1=lowpoint; + whichhit=objects.model[i].LineCheck(&lowpoint,&lowpointtarget,&colpoint,&objects.position[i],&objects.rotation[i]); + if(whichhit!=-1&&fabs(objects.model[i].facenormals[whichhit].y)<.3){ + setAnimation(k,walljumpleftanim); + emit_sound_at(movewhooshsound, player[k].coords); + if(k==0) + pause_sound(whooshsound); + + lowpointtarget=DoRotation(objects.model[i].facenormals[whichhit],0,objects.rotation[i],0); + player[k].rotation=-asin(0-lowpointtarget.x)*180/M_PI; + if(lowpointtarget.z<0) + player[k].rotation=180-player[k].rotation; + player[k].targetrotation=player[k].rotation; + player[k].lowrotation=player[k].rotation; + if(k==0) + numwallflipped++; + } + else + { + lowpoint=tempcoords1; + lowpointtarget=lowpoint+DoRotation(player[k].facing,0,90,0)*1.5; + whichhit=objects.model[i].LineCheck(&lowpoint,&lowpointtarget,&colpoint,&objects.position[i],&objects.rotation[i]); + if(whichhit!=-1&&fabs(objects.model[i].facenormals[whichhit].y)<.3){ + setAnimation(k,walljumprightanim); + emit_sound_at(movewhooshsound, player[k].coords); + if(k==0)pause_sound(whooshsound); + + lowpointtarget=DoRotation(objects.model[i].facenormals[whichhit],0,objects.rotation[i],0); + player[k].rotation=-asin(0-lowpointtarget.x)*180/M_PI; + if(lowpointtarget.z<0)player[k].rotation=180-player[k].rotation; + player[k].targetrotation=player[k].rotation; + player[k].lowrotation=player[k].rotation; + if(k==0)numwallflipped++; + } + else + { + lowpoint=tempcoords1; + lowpointtarget=lowpoint+player[k].facing*2; + whichhit=objects.model[i].LineCheck(&lowpoint,&lowpointtarget,&colpoint,&objects.position[i],&objects.rotation[i]); + if(whichhit!=-1&&fabs(objects.model[i].facenormals[whichhit].y)<.3){ + setAnimation(k,walljumpbackanim); + emit_sound_at(movewhooshsound, player[k].coords); + if(k==0)pause_sound(whooshsound); + + lowpointtarget=DoRotation(objects.model[i].facenormals[whichhit],0,objects.rotation[i],0); + player[k].rotation=-asin(0-lowpointtarget.x)*180/M_PI; + if(lowpointtarget.z<0)player[k].rotation=180-player[k].rotation; + player[k].targetrotation=player[k].rotation; + player[k].lowrotation=player[k].rotation; + if(k==0)numwallflipped++; + } + else + { + lowpoint=tempcoords1; + lowpointtarget=lowpoint-player[k].facing*2; + whichhit=objects.model[i].LineCheck(&lowpoint,&lowpointtarget,&colpoint,&objects.position[i],&objects.rotation[i]); + if(whichhit!=-1&&fabs(objects.model[i].facenormals[whichhit].y)<.3){ + setAnimation(k,walljumpfrontanim); + emit_sound_at(movewhooshsound, player[k].coords); + if(k==0)pause_sound(whooshsound); + + lowpointtarget=DoRotation(objects.model[i].facenormals[whichhit],0,objects.rotation[i],0); + player[k].rotation=-asin(0-lowpointtarget.x)*180/M_PI; + if(lowpointtarget.z<0)player[k].rotation=180-player[k].rotation; + player[k].rotation+=180; + player[k].targetrotation=player[k].rotation; + player[k].lowrotation=player[k].rotation; + if(k==0)numwallflipped++; + } + } + } + } + } + } + } + else if(objects.type[i]==rocktype){ + lowpoint2=player[k].coords; + lowpoint=player[k].coords; + lowpoint.y+=2; + if(objects.model[i].LineCheck(&lowpoint,&lowpoint2,&colpoint,&objects.position[i],&objects.rotation[i])!=-1){ + player[k].coords=colpoint; + player[k].collide=1; + tempcollide=1; + + if(player[k].targetanimation==jumpdownanim||player[k].isFlip()){ + //flipped into a rock + if(player[k].isFlip()&&animation[player[k].targetanimation].label[player[k].targetframe]==7) + player[k].RagDoll(0); + + if(player[k].targetanimation==jumpupanim){ + player[k].jumppower=-4; + player[k].targetanimation=player[k].getIdle(); + } + player[k].target=0; + player[k].targetframe=0; + player[k].onterrain=1; + + if(player[k].id==0){ + pause_sound(whooshsound); + OPENAL_SetVolume(channels[whooshsound], 0); + } + + //landing + if((player[k].targetanimation==jumpdownanim||player[k].isFlip())&&!player[k].wasLanding()){ + if(player[k].isFlip()) + player[k].jumppower=-4; + player[k].targetanimation=player[k].getLanding(); + emit_sound_at(landsound, player[k].coords, 128.); + if(k==0){ + envsound[numenvsounds]=player[k].coords; + envsoundvol[numenvsounds]=16; + envsoundlife[numenvsounds]=.4; + numenvsounds++; + } + + } + } + } + } + } + + if(tempcollide&&(/*player[k].jumptogglekeydown*/1==1||player[k].aitype!=playercontrolled)) + for(int l=0;l.5) + if(whichhit!=-1){ + if(whichhit!=-1&&player[k].targetanimation!=jumpupanim&&player[k].targetanimation!=jumpdownanim) + player[k].collided=1; + if(checkcollide(lowpoint7,lowpointtarget7)==-1) + if(checkcollide(lowpoint6,lowpointtarget6)==-1) + if( objects.model[i].LineCheckPossible(&lowpoint2,&lowpointtarget2, + &colpoint,&objects.position[i],&objects.rotation[i])!=-1&& + objects.model[i].LineCheckPossible(&lowpoint3,&lowpointtarget3, + &colpoint,&objects.position[i],&objects.rotation[i])!=-1&& + objects.model[i].LineCheckPossible(&lowpoint4,&lowpointtarget4, + &colpoint,&objects.position[i],&objects.rotation[i])!=-1&& + objects.model[i].LineCheckPossible(&lowpoint5,&lowpointtarget5, + &colpoint,&objects.position[i],&objects.rotation[i])!=-1) + for(int j=0;j<45;j++){ + lowpoint=player[k].coords; + lowpoint.y+=(float)j/13; + lowpointtarget=lowpoint+facing*1.4; + if(objects.model[i].LineCheckPossible(&lowpoint,&lowpointtarget, + &colpoint2,&objects.position[i],&objects.rotation[i])==-1){ + if(j<=6||j<=25&&player[k].targetanimation==jumpdownanim) + break; + if(player[k].targetanimation==jumpupanim||player[k].targetanimation==jumpdownanim){ + lowpoint=DoRotation(objects.model[i].facenormals[whichhit],0,objects.rotation[k],0); + lowpoint=player[k].coords; + lowpoint.y+=(float)j/13; + lowpointtarget=lowpoint+facing*1.3; + flatfacing=player[k].coords; + player[k].coords=colpoint-DoRotation(objects.model[i].facenormals[whichhit],0,objects.rotation[k],0)*.01; + player[k].coords.y=lowpointtarget.y-.07; + player[k].currentoffset=(flatfacing-player[k].coords)/player[k].scale; + + if(j>10||!player[k].isRun()){ + if(player[k].targetanimation==jumpdownanim||player[k].targetanimation==jumpupanim){ + if(k==0) + pause_sound(whooshsound); + } + emit_sound_at(jumpsound, player[k].coords, 128.); + + lowpointtarget=DoRotation(objects.model[i].facenormals[whichhit],0,objects.rotation[i],0); + player[k].rotation=-asin(0-lowpointtarget.x)*180/M_PI; + if(lowpointtarget.z<0) + player[k].rotation=180-player[k].rotation; + player[k].targetrotation=player[k].rotation; + player[k].lowrotation=player[k].rotation; + + //player[k].velocity=lowpointtarget*.03; + player[k].velocity=0; + + //climb ledge (?) + if(player[k].targetanimation==jumpupanim){ + player[k].targetanimation=climbanim; + player[k].jumppower=0; + player[k].jumpclimb=1; + } + player[k].transspeed=6; + player[k].target=0; + player[k].targetframe=1; + //hang ledge (?) + if(j>25){ + setAnimation(k,hanganim); + player[k].jumppower=0; + } + } + break; + } + } + } + } + } + } + } + } + if(player[k].collide<=0){ + //in the air + if(!player[k].onterrain&& + player[k].targetanimation!=jumpupanim&& + player[k].targetanimation!=jumpdownanim&& + player[k].targetanimation!=climbanim&& + player[k].targetanimation!=hanganim&& + !player[k].isWallJump()&& + !player[k].isFlip()){ + if(player[k].currentanimation!=climbanim&& + player[k].currentanimation!=tempanim&& + player[k].targetanimation!=backhandspringanim&& + (player[k].targetanimation!=rollanim|| + player[k].targetframe<2|| + player[k].targetframe>6)){ + //stagger off ledge (?) + if(player[k].targetanimation==staggerbackhighanim||player[k].targetanimation==staggerbackhardanim) + player[k].RagDoll(0); + setAnimation(k,jumpdownanim); + + if(!k) + emit_sound_at(whooshsound, player[k].coords, 128.); + } + //gravity + player[k].velocity.y+=gravity; + } + } + } + player[k].realoldcoords=player[k].coords; + } +} + +void Game::doAttacks(){ + static XYZ relative; + static int randattack; + static bool playerrealattackkeydown=0; + + if(!Input::isKeyDown(attackkey)) + oldattackkey=0; + if(oldattackkey) + player[0].attackkeydown=0; + if(oldattackkey) + playerrealattackkeydown=0; + if(!oldattackkey) + playerrealattackkeydown=Input::isKeyDown(attackkey); + if((player[0].parriedrecently<=0|| + player[0].weaponactive==-1)&& + (!oldattackkey|| + (realthreat&& + player[0].lastattack!=swordslashanim&& + player[0].lastattack!=knifeslashstartanim&& + player[0].lastattack!=staffhitanim&& + player[0].lastattack!=staffspinhitanim))) + player[0].attackkeydown=Input::isKeyDown(attackkey); + if(Input::isKeyDown(attackkey)&& + !oldattackkey&& + !player[0].backkeydown){ + for(int k=0;k1) + for(int i=0;i0&& + attackweapon==knife&& + player[i].bloodloss>player[i].damagetolerance/2) + player[k].targetanimation=knifefollowanim; + //knifeslashstart + else if(distance<2.5*sq(player[k].scale*5)&& + animation[player[i].targetanimation].height!=lowheight&& + !player[k].forwardkeydown&& + !player[k].leftkeydown&& + !player[k].rightkeydown&& + !player[k].crouchkeydown&& + attackweapon==knife&& + player[k].weaponmissdelay<=0) + player[k].targetanimation=knifeslashstartanim; + //swordslash + else if(distance<4.5*sq(player[k].scale*5)&& + animation[player[i].targetanimation].height!=lowheight&& + !player[k].crouchkeydown&& + attackweapon==sword&& + player[k].weaponmissdelay<=0) + player[k].targetanimation=swordslashanim; + //staffhit + else if(distance<4.5*sq(player[k].scale*5)&& + animation[player[i].targetanimation].height!=lowheight&& + !player[k].crouchkeydown&& + attackweapon==staff&& + player[k].weaponmissdelay<=0&& + !player[k].leftkeydown&& + !player[k].rightkeydown&& + !player[k].forwardkeydown) + player[k].targetanimation=staffhitanim; + //staffspinhit + else if(distance<4.5*sq(player[k].scale*5)&& + animation[player[i].targetanimation].height!=lowheight&& + !player[k].crouchkeydown&& + attackweapon==staff&& + player[k].weaponmissdelay<=0) + player[k].targetanimation=staffspinhitanim; + //spinkick + else if(distance<2.5*sq(player[k].scale*5)&& + animation[player[i].targetanimation].height!=lowheight) + player[k].targetanimation=spinkickanim; + //lowkick + else if(distance<2.5*sq(player[k].scale*5)&& + animation[player[i].targetanimation].height==lowheight&& + animation[player[k].targetanimation].attack!=normalattack) + player[k].targetanimation=lowkickanim; + } else { //AI player + if(distance<4.5*sq(player[k].scale*5)){ + randattack=abs(Random()%5); + if(!attackweapon&&distance<2.5*sq(player[k].scale*5)){ + //sweep + if(randattack==0&&animation[player[i].targetanimation].height!=lowheight) + player[k].targetanimation=sweepanim; + //upunch + else if(randattack==1&&animation[player[i].targetanimation].height!=lowheight&& + !attackweapon) + player[k].targetanimation=upunchanim; + //spinkick + else if(randattack==2&&animation[player[i].targetanimation].height!=lowheight) + player[k].targetanimation=spinkickanim; + //lowkick + else if(animation[player[i].targetanimation].height==lowheight) + player[k].targetanimation=lowkickanim; + } + if(attackweapon){ + //sweep + if((tutoriallevel!=1||!attackweapon)&& + distance<2.5*sq(player[k].scale*5)&& + randattack==0&& + animation[player[i].targetanimation].height!=lowheight) + player[k].targetanimation=sweepanim; + //knifeslashstart + else if(distance<2.5*sq(player[k].scale*5)&& + attackweapon==knife&& + player[k].weaponmissdelay<=0) + player[k].targetanimation=knifeslashstartanim; + //swordslash + else if(!(player[0].victim==&player[i]&& + player[0].hasvictim&& + player[0].targetanimation==swordslashanim)&& + attackweapon==sword&& + player[k].weaponmissdelay<=0) + player[k].targetanimation=swordslashanim; + //staffhit + else if(!(player[0].victim==&player[i]&& + player[0].hasvictim&& + player[0].targetanimation==swordslashanim)&& + attackweapon==staff&& + player[k].weaponmissdelay<=0&& + randattack<3) + player[k].targetanimation=staffhitanim; + //staffspinhit + else if(!(player[0].victim==&player[i]&& + player[0].hasvictim&& + player[0].targetanimation==swordslashanim)&& + attackweapon==staff&& + player[k].weaponmissdelay<=0&& + randattack>=3) + player[k].targetanimation=staffspinhitanim; + //spinkick + else if((tutoriallevel!=1||!attackweapon)&& + distance<2.5*sq(player[k].scale*5)&& + randattack==1&& + animation[player[i].targetanimation].height!=lowheight) + player[k].targetanimation=spinkickanim; + //lowkick + else if(distance<2.5*sq(player[k].scale*5)&& + animation[player[i].targetanimation].height==lowheight&& + animation[player[k].targetanimation].attack!=normalattack) + player[k].targetanimation=lowkickanim; + } + } + } + //upunch becomes wolfslap + if(player[k].targetanimation==upunchanim&&player[k].creature==wolftype) + player[k].targetanimation=wolfslapanim; + } + //sneak attacks + if((k==0)&&(tutoriallevel!=1||tutorialstage==22)&& + player[i].howactive0&&player[k].madskills|| + player[i].surprised>0|| + player[i].aitype==passivetype|| + attackweapon&&player[i].stunned>0)&& + normaldotproduct(player[i].facing,player[i].coords-player[k].coords)>0){ + //sneakattack + if(!attackweapon){ + player[k].currentanimation=sneakattackanim; + player[k].targetanimation=sneakattackanim; + player[i].currentanimation=sneakattackedanim; + player[i].targetanimation=sneakattackedanim; + player[k].oldcoords=player[k].coords; + player[k].coords=player[i].coords; + } + //knifesneakattack + if(attackweapon==knife){ + player[k].currentanimation=knifesneakattackanim; + player[k].targetanimation=knifesneakattackanim; + player[i].currentanimation=knifesneakattackedanim; + player[i].targetanimation=knifesneakattackedanim; + player[i].oldcoords=player[i].coords; + player[i].coords=player[k].coords; + } + //swordsneakattack + if(attackweapon==sword){ + player[k].currentanimation=swordsneakattackanim; + player[k].targetanimation=swordsneakattackanim; + player[i].currentanimation=swordsneakattackedanim; + player[i].targetanimation=swordsneakattackedanim; + player[i].oldcoords=player[i].coords; + player[i].coords=player[k].coords; + } + if(attackweapon!=staff){ + player[k].victim=&player[i]; + player[k].hasvictim=1; + player[i].targettilt2=0; + player[i].targetframe=1; + player[i].currentframe=0; + player[i].target=0; + player[i].velocity=0; + player[k].targettilt2=player[i].targettilt2; + player[k].currentframe=player[i].currentframe; + player[k].targetframe=player[i].targetframe; + player[k].target=player[i].target; + player[k].velocity=0; + player[k].targetrotation=player[i].rotation; + player[k].rotation=player[i].rotation; + player[i].targetrotation=player[i].rotation; + } + } + if(animation[player[k].targetanimation].attack==normalattack&& + player[k].victim==&player[i]&& + (!player[i].skeleton.free)){ + oldattackkey=1; + player[k].targetframe=0; + player[k].target=0; + + player[k].targetrotation=roughDirectionTo(player[k].coords,player[i].coords); + player[k].targettilt2=pitchTo(player[k].coords,player[i].coords); + player[k].lastattack3=player[k].lastattack2; + player[k].lastattack2=player[k].lastattack; + player[k].lastattack=player[k].targetanimation; + } + if(player[k].targetanimation==knifefollowanim&& + player[k].victim==&player[i]){ + oldattackkey=1; + player[k].targetrotation=roughDirectionTo(player[k].coords,player[i].coords); + player[k].targettilt2=pitchTo(player[k].coords,player[i].coords); + player[k].victim=&player[i]; + player[k].hasvictim=1; + player[i].targetanimation=knifefollowedanim; + player[i].currentanimation=knifefollowedanim; + player[i].targettilt2=0; + player[i].targettilt2=player[k].targettilt2; + player[i].targetframe=1; + player[i].currentframe=0; + player[i].target=0; + player[i].velocity=0; + player[k].currentanimation=knifefollowanim; + player[k].targetanimation=knifefollowanim; + player[k].targettilt2=player[i].targettilt2; + player[k].currentframe=player[i].currentframe; + player[k].targetframe=player[i].targetframe; + player[k].target=player[i].target; + player[k].velocity=0; + player[k].oldcoords=player[k].coords; + player[i].coords=player[k].coords; + player[i].targetrotation=player[k].targetrotation; + player[i].rotation=player[k].targetrotation; + player[k].rotation=player[k].targetrotation; + player[i].rotation=player[k].targetrotation; + } + } + } + const bool hasstaff=attackweapon==staff; + if(k==0&&numplayers>1) + for(int i=0;i1000|| + player[k].isRun()|| + hasstaff|| + (attackweapon&& + (player[i].skeleton.longdead>2000|| + player[i].damage>player[i].damagetolerance/8|| + player[i].bloodloss>player[i].damagetolerance/2)&& + distance<1.5*sq(player[k].scale*5)))){ + player[k].victim=&player[i]; + player[k].hasvictim=1; + if(attackweapon&&tutoriallevel!=1){ + //crouchstab + if(player[k].crouchkeydown&&attackweapon==knife&&distance<1.5*sq(player[k].scale*5)) + player[k].targetanimation=crouchstabanim; + //swordgroundstab + if(player[k].crouchkeydown&&distance<1.5*sq(player[k].scale*5)&&attackweapon==sword) + player[k].targetanimation=swordgroundstabanim; + //staffgroundsmash + if(distance<3.5*sq(player[k].scale*5)&&attackweapon==staff) + player[k].targetanimation=staffgroundsmashanim; + } + if(distance<2.5&& + player[k].crouchkeydown&& + player[k].targetanimation!=crouchstabanim&& + !attackweapon&& + player[i].dead&& + player[i].skeleton.free&& + player[i].skeleton.longdead>1000){ + player[k].targetanimation=killanim; + //TODO: refactor this out, what does it do? + for(int j=0;jcoords)) + player[k].victim=&player[i]; + }else{ + player[k].victim=&player[i]; + player[k].hasvictim=1; + } + } + } + } + if(player[k].aitype==playercontrolled) + //rabbit kick + if(player[k].attackkeydown&& + player[k].isRun()&& + player[k].wasRun()&& + ((player[k].hasvictim&& + findDistancefast(&player[k].coords,&player[k].victim->coords)<12*sq(player[k].scale*5)&& + findDistancefast(&player[k].coords,&player[k].victim->coords)>7*sq(player[k].scale*5)&& + !player[k].victim->skeleton.free&& + player[k].victim->targetanimation!=getupfrombackanim&& + player[k].victim->targetanimation!=getupfromfrontanim&& + animation[player[k].victim->targetanimation].height!=lowheight&& + player[k].aitype!=playercontrolled&& //wat??? + normaldotproduct(player[k].facing,player[k].victim->coords-player[k].coords)>0&& + player[k].rabbitkickenabled)|| + player[k].jumpkeydown)){ + oldattackkey=1; + setAnimation(k,rabbitkickanim); + } + //update counts + if(animation[player[k].targetanimation].attack&&k==0){ + numattacks++; + switch(attackweapon){ + case 0: numunarmedattack++; break; + case knife: numknifeattack++; break; + case sword: numswordattack++; break; + case staff: numstaffattack++; break; + } + } + } + } + } + } +} - for(i=0;i<15;i++){ +void Game::doPlayerCollisions(){ + static XYZ rotatetarget; + static float collisionradius; + if(numplayers>1) + for(int k=0;kplayer[k].coords.y-3) + if(player[i].coords.yplayer[k].coords.x-3) + if(player[i].coords.xplayer[k].coords.z-3) + if(player[i].coords.zskeleton.free) + collisionradius=3; + if((!player[i].skeleton.oldfree||!player[k].skeleton.oldfree)&& + (findDistancefast(&tempcoords1,&tempcoords2)1)|| + (player[k].skeleton.oldfree==1&&findLengthfast(&player[k].velocity)>1)|| + (player[i].skeleton.oldfree==0&&player[k].skeleton.oldfree==0)){ + rotatetarget=player[k].velocity-player[i].velocity; + if((player[i].targetanimation!=getupfrombackanim&&player[i].targetanimation!=getupfromfrontanim|| + player[i].skeleton.free)&& + (player[k].targetanimation!=getupfrombackanim&&player[k].targetanimation!=getupfromfrontanim|| + player[k].skeleton.free)) + if((((k!=0&&findLengthfast(&rotatetarget)>150|| + k==0&&findLengthfast(&rotatetarget)>50&&player[0].rabbitkickragdoll)&& + normaldotproduct(rotatetarget,player[k].coords-player[i].coords)>0)&& + (k==0|| + k!=0&&player[i].skeleton.oldfree==1&&animation[player[k].currentanimation].attack==neutral|| + /*i!=0&&*/player[k].skeleton.oldfree==1&&animation[player[i].currentanimation].attack==neutral))|| + (player[i].targetanimation==jumpupanim||player[i].targetanimation==jumpdownanim||player[i].isFlip())&& + (player[k].targetanimation==jumpupanim||player[k].targetanimation==jumpdownanim||player[k].isFlip())&& + k==0&&!player[i].skeleton.oldfree&&!player[k].skeleton.oldfree){ + //If hit by body + if( (i!=0||player[i].skeleton.free)&& + (k!=0||player[k].skeleton.free)|| + (animation[player[i].targetanimation].height==highheight&& + animation[player[k].targetanimation].height==highheight)){ + if(tutoriallevel!=1){ + emit_sound_at(heavyimpactsound, player[i].coords); + } + + player[i].RagDoll(0); + if(player[i].damage>player[i].damagetolerance-findLengthfast(&rotatetarget)/4&&!player[i].dead){ + award_bonus(0, aimbonus); + } + player[i].DoDamage(findLengthfast(&rotatetarget)/4); + player[k].RagDoll(0); + if(player[k].damage>player[k].damagetolerance-findLengthfast(&rotatetarget)/4&&!player[k].dead){ + award_bonus(0, aimbonus); // Huh, again? + } + player[k].DoDamage(findLengthfast(&rotatetarget)/4); + + for(int j=0;jplayer[i].coords.y+2&& + !player[0].onterrain) + player[i].pause=1; + + //pathfinding + if(player[i].aitype==pathfindtype){ + if(player[i].finalpathfindpoint==-1){ + float closestdistance; + float tempdist; + int closest; + XYZ colpoint; + closest=-1; + closestdistance=-1; + for(int j=0;j.8&&!player[i].jumpkeydown&&player[i].collided<.8) + player[i].targetrotation+=90*(player[i].whichdirection*2-1); + + if(player[i].collided<1||player[i].targetanimation!=jumpupanim) + player[i].jumpkeydown=0; + if((player[i].collided>.8&&player[i].jumppower>=5)) + player[i].jumpkeydown=1; + + if((tutoriallevel!=1||cananger)&& + hostile&& + !player[0].dead&& + findDistancefast(&player[i].coords,&player[0].coords)<400&& + player[i].occluded<25){ + if(findDistancefast(&player[i].coords,&player[0].coords)<12&& + animation[player[0].targetanimation].height!=lowheight&& + !editorenabled&& + (player[0].coords.y0) + if(player[j].coords.y.5) + player[i].howactive=typeactive; + + if(player[i].aitype==passivetype){ + player[i].aiupdatedelay-=multiplier; + player[i].losupdatedelay-=multiplier; + player[i].lastseentime+=multiplier; + player[i].pausetime-=multiplier; + if(player[i].lastseentime>1) + player[i].lastseentime=1; + + if(player[i].aiupdatedelay<0){ + if(player[i].numwaypoints>1&&player[i].howactive==typeactive&&player[i].pausetime<=0){ + player[i].targetrotation=roughDirectionTo(player[i].coords,player[i].waypoints[player[i].waypoint]); + player[i].lookrotation=player[i].targetrotation; + player[i].aiupdatedelay=.05; + + if(findDistancefastflat(&player[i].coords,&player[i].waypoints[player[i].waypoint])<1){ + if(player[i].waypointtype[player[i].waypoint]==wppause) + player[i].pausetime=4; + player[i].waypoint++; + if(player[i].waypoint>player[i].numwaypoints-1) + player[i].waypoint=0; + + } + } + + if(player[i].numwaypoints>1&&player[i].howactive==typeactive&&player[i].pausetime<=0) + player[i].forwardkeydown=1; + else + player[i].forwardkeydown=0; + player[i].leftkeydown=0; + player[i].backkeydown=0; + player[i].rightkeydown=0; + player[i].crouchkeydown=0; + player[i].attackkeydown=0; + player[i].throwkeydown=0; + + if(player[i].avoidcollided>.8&&!player[i].jumpkeydown&&player[i].collided<.8){ + if(!player[i].avoidsomething) + player[i].targetrotation+=90*(player[i].whichdirection*2-1); + else{ + XYZ leftpos,rightpos; + float leftdist,rightdist; + leftpos = player[i].coords+DoRotation(player[i].facing,0,90,0); + rightpos = player[i].coords-DoRotation(player[i].facing,0,90,0); + leftdist = findDistancefast(&leftpos, &player[i].avoidwhere); + rightdist = findDistancefast(&rightpos, &player[i].avoidwhere); + if(leftdist.8&&player[i].jumppower>=5)) + player[i].jumpkeydown=1; + + + //hearing sounds + if(!editorenabled){ + if(player[i].howactive<=typesleeping) + if(numenvsounds>0&&(tutoriallevel!=1||cananger)&&hostile) + for(int j=0;j0&&findDistancefast(&player[i].coords,&envsound[j])< + 2*(vol+vol*(player[i].creature==rabbittype)*3)) + player[i].aitype=attacktypecutoff; + } + + if(player[i].aitype!=passivetype){ + if(player[i].howactive==typesleeping) + setAnimation(i,getupfromfrontanim); + player[i].howactive=typeactive; + } + } + + if(player[i].howactive0)){ + float smelldistance=50; + if(j==0&&player[j].num_weapons>0){ + if(weapons.bloody[player[j].weaponids[0]]) + smelldistance=100; + if(player[j].num_weapons==2) + if(weapons.bloody[player[j].weaponids[1]]) + smelldistance=100; + } + if(j!=0) + smelldistance=100; + windsmell=windvector; + Normalise(&windsmell); + windsmell=windsmell*2+player[j].coords; + if(findDistancefast(&player[i].coords,&windsmell)0) + if((-1==checkcollide( + DoRotation(playerJoint(i,head).position,0,player[i].rotation,0)* + player[i].scale+player[i].coords, + DoRotation(playerJoint(j,head).position,0,player[j].rotation,0)* + player[j].scale+player[j].coords)&& + !player[j].isWallJump())|| + (player[j].targetanimation==hanganim&& + normaldotproduct(player[j].facing,player[i].coords-player[j].coords)<0)){ + player[i].lastseentime-=.2; + if(j==0&&animation[player[j].targetanimation].height==lowheight) + player[i].lastseentime-=.4; + else + player[i].lastseentime-=.6; + } + if(player[i].lastseentime<=0){ + player[i].aitype=searchtype; + player[i].lastchecktime=12; + player[i].lastseen=player[j].coords; + player[i].lastseentime=12; + } + } + } + } + } + //alerted surprise + if(player[i].aitype==attacktypecutoff&&musictype!=2){ + if(player[i].creature!=wolftype){ + player[i].stunned=.6; + player[i].surprised=.6; + } + if(player[i].creature==wolftype){ + player[i].stunned=.47; + player[i].surprised=.47; + } + numseen++; + } + } + + //search for player + int j; + if(player[i].aitype==searchtype){ + player[i].aiupdatedelay-=multiplier; + player[i].losupdatedelay-=multiplier; + if(!player[i].pause) + player[i].lastseentime-=multiplier; + player[i].lastchecktime-=multiplier; + + if(player[i].isRun()&&!player[i].onground){ + if(player[i].coords.y>terrain.getHeight(player[i].coords.x,player[i].coords.z)+10){ + XYZ test2=player[i].coords+player[i].facing; + test2.y+=5; + XYZ test=player[i].coords+player[i].facing; + test.y-=10; + j=checkcollide(test2,test,player[i].laststanding); + if(j==-1) + j=checkcollide(test2,test); + if(j==-1){ + player[i].velocity=0; + setAnimation(i,player[i].getStop()); + player[i].targetrotation+=180; + player[i].stunned=.5; + //player[i].aitype=passivetype; + player[i].aitype=pathfindtype; + player[i].finalfinaltarget=player[i].waypoints[player[i].waypoint]; + player[i].finalpathfindpoint=-1; + player[i].targetpathfindpoint=-1; + player[i].lastpathfindpoint=-1; + player[i].lastpathfindpoint2=-1; + player[i].lastpathfindpoint3=-1; + player[i].lastpathfindpoint4=-1; + } + else player[i].laststanding=j; + } + } + //check out last seen location + if(player[i].aiupdatedelay<0){ + player[i].targetrotation=roughDirectionTo(player[i].coords,player[i].lastseen); + player[i].lookrotation=player[i].targetrotation; + player[i].aiupdatedelay=.05; + player[i].forwardkeydown=1; + + if(findDistancefastflat(&player[i].coords,&player[i].lastseen)<1*sq(player[i].scale*5)||player[i].lastchecktime<0){ + player[i].forwardkeydown=0; + player[i].aiupdatedelay=1; + player[i].lastseen.x+=(float(Random()%100)-50)/25; + player[i].lastseen.z+=(float(Random()%100)-50)/25; + player[i].lastchecktime=3; + } + + player[i].leftkeydown=0; + player[i].backkeydown=0; + player[i].rightkeydown=0; + player[i].crouchkeydown=0; + player[i].attackkeydown=0; + player[i].throwkeydown=0; + + if(player[i].avoidcollided>.8&&!player[i].jumpkeydown&&player[i].collided<.8){ + if(!player[i].avoidsomething)player[i].targetrotation+=90*(player[i].whichdirection*2-1); + else{ + XYZ leftpos,rightpos; + float leftdist,rightdist; + leftpos = player[i].coords+DoRotation(player[i].facing,0,90,0); + rightpos = player[i].coords-DoRotation(player[i].facing,0,90,0); + leftdist = findDistancefast(&leftpos, &player[i].avoidwhere); + rightdist = findDistancefast(&rightpos, &player[i].avoidwhere); + if(leftdist.8&&player[i].jumppower>=5)) + player[i].jumpkeydown=1; + + if(numenvsounds>0&&((tutoriallevel!=1||cananger)&&hostile)) + for(int k=0;k0) + if((checkcollide( + DoRotation(playerJoint(i,head).position,0,player[i].rotation,0)* + player[i].scale+player[i].coords, + DoRotation(playerJoint(0,head).position,0,player[0].rotation,0)* + player[0].scale+player[0].coords)==-1)|| + (player[0].targetanimation==hanganim&&normaldotproduct( + player[0].facing,player[i].coords-player[0].coords)<0)){ + /* //TODO: changed j to 0 on a whim, make sure this is correct + (player[j].targetanimation==hanganim&&normaldotproduct( + player[j].facing,player[i].coords-player[j].coords)<0) + */ + player[i].aitype=attacktypecutoff; + player[i].lastseentime=1; + } + } + //player escaped + if(player[i].lastseentime<0){ + //player[i].aitype=passivetype; + numescaped++; + player[i].aitype=pathfindtype; + player[i].finalfinaltarget=player[i].waypoints[player[i].waypoint]; + player[i].finalpathfindpoint=-1; + player[i].targetpathfindpoint=-1; + player[i].lastpathfindpoint=-1; + player[i].lastpathfindpoint2=-1; + player[i].lastpathfindpoint3=-1; + player[i].lastpathfindpoint4=-1; + } + } + + if(player[i].aitype!=gethelptype) + player[i].runninghowlong=0; + + //get help from buddies + if(player[i].aitype==gethelptype){ + player[i].runninghowlong+=multiplier; + player[i].aiupdatedelay-=multiplier; + + if(player[i].aiupdatedelay<0||player[i].ally==0){ + player[i].aiupdatedelay=.2; + + //find closest ally + //TODO: factor out closest search somehow + if(!player[i].ally){ + int closest=-1; + float closestdist=-1; + for(int k=0;k0){ + player[i].targetrotation=roughDirectionTo(player[i].coords,player[player[i].ally].coords); + player[i].lookrotation=player[i].targetrotation; + player[i].aiupdatedelay=.05; + player[i].forwardkeydown=1; + + if(findDistancefastflat(&player[i].coords,&player[player[i].ally].coords)<3){ + player[i].aitype=searchtype; + player[i].lastseentime=12; + player[player[i].ally].aitype=searchtype; + if(player[player[i].ally].lastseentime.8&&!player[i].jumpkeydown&&player[i].collided<.8){ + if(!player[i].avoidsomething) + player[i].targetrotation+=90*(player[i].whichdirection*2-1); + else{ + XYZ leftpos,rightpos; + float leftdist,rightdist; + leftpos = player[i].coords+DoRotation(player[i].facing,0,90,0); + rightpos = player[i].coords-DoRotation(player[i].facing,0,90,0); + leftdist = findDistancefast(&leftpos, &player[i].avoidwhere); + rightdist = findDistancefast(&rightpos, &player[i].avoidwhere); + if(leftdist.8&&player[i].jumppower>=5) + player[i].jumpkeydown=1; + } + + //retreiving a weapon on the ground + if(player[i].aitype==getweapontype){ + player[i].aiupdatedelay-=multiplier; + player[i].lastchecktime-=multiplier; + + if(player[i].aiupdatedelay<0){ + player[i].aiupdatedelay=.2; + + //ALLY IS WEPON + if(player[i].ally<0){ + int closest=-1; + float closestdist=-1; + for(int k=0;k=0){ + if(weapons.owner[player[i].ally]!=-1|| + findDistancefast(&player[i].coords,&weapons.position[player[i].ally])>16){ + player[i].aitype=attacktypecutoff; + player[i].lastseentime=1; + } + //TODO: factor these out as moveToward() + player[i].targetrotation=roughDirectionTo(player[i].coords,weapons.position[player[i].ally]); + player[i].lookrotation=player[i].targetrotation; + player[i].aiupdatedelay=.05; + player[i].forwardkeydown=1; + + + if(player[i].avoidcollided>.8&&!player[i].jumpkeydown&&player[i].collided<.8){ + if(!player[i].avoidsomething) + player[i].targetrotation+=90*(player[i].whichdirection*2-1); + else{ + XYZ leftpos,rightpos; + float leftdist,rightdist; + leftpos = player[i].coords+DoRotation(player[i].facing,0,90,0); + rightpos = player[i].coords-DoRotation(player[i].facing,0,90,0); + leftdist = findDistancefast(&leftpos, &player[i].avoidwhere); + rightdist = findDistancefast(&rightpos, &player[i].avoidwhere); + if(leftdist.8&&player[i].jumppower>=5)) + player[i].jumpkeydown=1; + } + + if(player[i].aitype==attacktypecutoff){ + player[i].aiupdatedelay-=multiplier; + //dodge or reverse rabbit kicks, knife throws, flips + if(player[i].damage.5) + player[i].stunned=1; + } + //go for weapon on the ground + if(player[i].wentforweapon<3) + for(int k=0;kterrain.getHeight(player[i].coords.x,player[i].coords.z)+10){ + XYZ test2=player[i].coords+player[i].facing; + test2.y+=5; + XYZ test=player[i].coords+player[i].facing; + test.y-=10; + j=checkcollide(test2,test,player[i].laststanding); + if(j==-1) + j=checkcollide(test2,test); + if(j==-1){ + player[i].velocity=0; + setAnimation(i,player[i].getStop()); + player[i].targetrotation+=180; + player[i].stunned=.5; + player[i].aitype=pathfindtype; + player[i].finalfinaltarget=player[i].waypoints[player[i].waypoint]; + player[i].finalpathfindpoint=-1; + player[i].targetpathfindpoint=-1; + player[i].lastpathfindpoint=-1; + player[i].lastpathfindpoint2=-1; + player[i].lastpathfindpoint3=-1; + player[i].lastpathfindpoint4=-1; + }else + player[i].laststanding=j; + } + //lose sight of player in the air (?) + if(player[0].coords.y>player[i].coords.y+5&& + animation[player[0].targetanimation].height!=highheight&& + !player[0].onterrain){ + player[i].aitype=pathfindtype; + player[i].finalfinaltarget=player[i].waypoints[player[i].waypoint]; + player[i].finalpathfindpoint=-1; + player[i].targetpathfindpoint=-1; + player[i].lastpathfindpoint=-1; + player[i].lastpathfindpoint2=-1; + player[i].lastpathfindpoint3=-1; + player[i].lastpathfindpoint4=-1; + } + //it's time to think (?) + if(player[i].aiupdatedelay<0&& + !animation[player[i].targetanimation].attack&& + player[i].targetanimation!=staggerbackhighanim&& + player[i].targetanimation!=staggerbackhardanim&& + player[i].targetanimation!=backhandspringanim&& + player[i].targetanimation!=dodgebackanim){ + //draw weapon + if(player[i].weaponactive==-1&&player[i].num_weapons>0) + player[i].drawkeydown=Random()%2; + else + player[i].drawkeydown=0; + player[i].rabbitkickenabled=Random()%2; + //chase player + XYZ rotatetarget=player[0].coords+player[0].velocity; + XYZ targetpoint=player[0].coords; + if(findDistancefast(&player[0].coords,&player[i].coords)< + findDistancefast(&rotatetarget,&player[i].coords)) + targetpoint+=player[0].velocity* + findDistance(&player[0].coords,&player[i].coords)/findLength(&player[i].velocity); + player[i].targetrotation=roughDirectionTo(player[i].coords,targetpoint); + player[i].lookrotation=player[i].targetrotation; + player[i].aiupdatedelay=.2+fabs((float)(Random()%100)/1000); + + if(findDistancefast(&player[i].coords,&player[0].coords)>5&&(player[0].weaponactive==-1||player[i].weaponactive!=-1)) + player[i].forwardkeydown=1; + else if((findDistancefast(&player[i].coords,&player[0].coords)>16|| + findDistancefast(&player[i].coords,&player[0].coords)<9)&& + player[0].weaponactive!=-1) + player[i].forwardkeydown=1; + else if(Random()%6==0||(player[i].creature==wolftype&&Random()%3==0)) + player[i].forwardkeydown=1; + else + player[i].forwardkeydown=0; + //chill out around the corpse + if(player[0].dead){ + player[i].forwardkeydown=0; + if(Random()%10==0) + player[i].forwardkeydown=1; + if(Random()%100==0){ + player[i].aitype=pathfindtype; + player[i].finalfinaltarget=player[i].waypoints[player[i].waypoint]; + player[i].finalpathfindpoint=-1; + player[i].targetpathfindpoint=-1; + player[i].lastpathfindpoint=-1; + player[i].lastpathfindpoint2=-1; + player[i].lastpathfindpoint3=-1; + player[i].lastpathfindpoint4=-1; + } + } + player[i].leftkeydown=0; + player[i].backkeydown=0; + player[i].rightkeydown=0; + player[i].crouchkeydown=0; + player[i].throwkeydown=0; + + if(player[i].avoidcollided>.8&&!player[i].jumpkeydown&&player[i].collided<.8) + player[i].targetrotation+=90*(player[i].whichdirection*2-1); + //attack!!! + if(Random()%2==0||player[i].weaponactive!=-1||player[i].creature==wolftype) + player[i].attackkeydown=1; + else + player[i].attackkeydown=0; + if(player[i].isRun()&&Random()%6&&findDistancefast(&player[i].coords,&player[0].coords)>7) + player[i].attackkeydown=0; + + //TODO: wat + if(player[i].aitype!=playercontrolled&& + (player[i].isIdle()|| + player[i].isCrouch()|| + player[i].isRun())){ + int target=-2; + for(int j=0;jcoords)<4&& + player[j].victim==&player[i]&& + (player[j].targetanimation==sweepanim|| + player[j].targetanimation==spinkickanim|| + player[j].targetanimation==staffhitanim|| + player[j].targetanimation==staffspinhitanim|| + player[j].targetanimation==winduppunchanim|| + player[j].targetanimation==upunchanim|| + player[j].targetanimation==wolfslapanim|| + player[j].targetanimation==knifeslashstartanim|| + player[j].targetanimation==swordslashanim&& + (findDistancefast(&player[j].coords,&player[i].coords)<2|| + player[i].weaponactive!=-1))){ + if(target>=0) + target=-1; + else + target=j; + } + if(target>=0) + player[target].Reverse(); + } + + if(player[i].collided<1) + player[i].jumpkeydown=0; + if(player[i].collided>.8&&player[i].jumppower>=5|| + findDistancefast(&player[i].coords,&player[0].coords)>400&& + player[i].onterrain&& + player[i].creature==rabbittype) + player[i].jumpkeydown=1; + //TODO: why are we controlling the human? + if(normaldotproduct(player[i].facing,player[0].coords-player[i].coords)>0) + player[0].jumpkeydown=0; + if(player[0].targetanimation==jumpdownanim&& + findDistancefast(&player[0].coords,&player[i].coords)<40) + player[i].crouchkeydown=1; + if(player[i].jumpkeydown) + player[i].attackkeydown=0; + + if(tutoriallevel==1) + if(!canattack) + player[i].attackkeydown=0; + + + XYZ facing=player[i].coords; + XYZ flatfacing=player[0].coords; + facing.y+=playerJoint(i,head).position.y*player[i].scale; + flatfacing.y+=playerJoint(0,head).position.y*player[0].scale; + if(player[i].occluded>=2) + if(-1!=checkcollide(facing,flatfacing)){ + if(!player[i].pause) + player[i].lastseentime-=.2; + if(player[i].lastseentime<=0&& + (player[i].creature!=wolftype|| + player[i].weaponstuck==-1)){ + player[i].aitype=searchtype; + player[i].lastchecktime=12; + player[i].lastseen=player[0].coords; + player[i].lastseentime=12; + } + }else + player[i].lastseentime=1; + } + } + if(animation[player[0].targetanimation].height==highheight&& + (player[i].aitype==attacktypecutoff|| + player[i].aitype==searchtype)) + if(player[0].coords.y>terrain.getHeight(player[0].coords.x,player[0].coords.z)+10){ + XYZ test=player[0].coords; + test.y-=40; + if(-1==checkcollide(player[0].coords,test)) + player[i].stunned=1; + } + //stunned + if(player[i].aitype==passivetype&&!(player[i].numwaypoints>1)|| + player[i].stunned>0|| + player[i].pause&&player[i].damage>player[i].superpermanentdamage){ + if(player[i].pause) + player[i].lastseentime=1; + player[i].targetrotation=player[i].rotation; + player[i].forwardkeydown=0; + player[i].leftkeydown=0; + player[i].backkeydown=0; + player[i].rightkeydown=0; + player[i].jumpkeydown=0; + player[i].attackkeydown=0; + player[i].crouchkeydown=0; + player[i].throwkeydown=0; + } + + + XYZ facing; + facing=0; + facing.z=-1; + + XYZ flatfacing=DoRotation(facing,0,player[i].rotation+180,0); + facing=flatfacing; + + if(player[i].aitype==attacktypecutoff){ + player[i].targetheadrotation=180-roughDirectionTo(player[i].coords,player[0].coords); + player[i].targetheadrotation2=pitchTo(player[i].coords,player[0].coords); + }else if(player[i].howactive>=typesleeping){ + player[i].targetheadrotation=player[i].targetrotation; + player[i].targetheadrotation2=0; + }else{ + if(player[i].interestdelay<=0){ + player[i].interestdelay=.7+(float)(abs(Random()%100))/100; + player[i].headtarget=player[i].coords; + player[i].headtarget.x+=(float)(abs(Random()%200)-100)/100; + player[i].headtarget.z+=(float)(abs(Random()%200)-100)/100; + player[i].headtarget.y+=(float)(abs(Random()%200)-100)/300; + player[i].headtarget+=player[i].facing*1.5; + } + player[i].targetheadrotation=180-roughDirectionTo(player[i].coords,player[i].headtarget); + player[i].targetheadrotation2=pitchTo(player[i].coords,player[i].headtarget); + } + } +} + + + +void Game::Tick(){ + static XYZ facing,flatfacing; + static int target; + + int templength; + + for(int i=0;i<15;i++){ displaytime[i]+=multiplier; } keyboardfrozen=0; + Input::Tick(); - if (Input::isKeyDown(SDLK_F6) && !freezetogglekeydown) { - if (Input::isKeyDown(SDLK_LSHIFT)) { + if(Input::isKeyPressed(SDLK_F6)){ + if(Input::isKeyDown(SDLK_LSHIFT)) stereoreverse=true; - } else { + else stereoreverse=false; - } - if (stereoreverse) { + if(stereoreverse) printf("Stereo reversed\n"); - } else { + else printf("Stereo unreversed\n"); - } - freezetogglekeydown=1; } - if (Input::isKeyDown(SDLK_F7)) { - if (Input::isKeyDown(SDLK_LSHIFT)) { + if(Input::isKeyDown(SDLK_F7)){ + if(Input::isKeyDown(SDLK_LSHIFT)) stereoseparation -= 0.001; - } else { + else stereoseparation -= 0.010; - } - printf("Stereo decreased increased to %f\n", stereoseparation); } - if (Input::isKeyDown(SDLK_F8)) { - if (Input::isKeyDown(SDLK_LSHIFT)) { + if(Input::isKeyDown(SDLK_F8)){ + if(Input::isKeyDown(SDLK_LSHIFT)) stereoseparation += 0.001; - } else { + else stereoseparation += 0.010; - } - printf("Stereo separation increased to %f\n", stereoseparation); } + if(Input::isKeyPressed(SDLK_TAB)&&tutoriallevel){ + if(tutorialstage!=51) + tutorialstagetime=tutorialmaxtime; + emit_sound_np(consolefailsound, 128.); + } + if(!console){ if(mainmenu&&endgame==1)mainmenu=10; - if( (Input::isKeyDown(SDLK_ESCAPE)||(mainmenu==0&&((Input::isKeyDown(jumpkey)||Input::isKeyDown(SDLK_SPACE)||(campaign)))&&!oldjumpkeydown&&campaign&&winfreeze)) - && !mainmenutogglekeydown - && (!mainmenu||gameon||mainmenu==3||mainmenu==4||mainmenu==5||mainmenu==6||(mainmenu==7&&!entername)||mainmenu==9||mainmenu==10) - ) { // go back + // menu back + if( (Input::isKeyPressed(SDLK_ESCAPE) + ||(mainmenu==0 + &&((Input::isKeyPressed(jumpkey) + ||Input::isKeyPressed(SDLK_SPACE) + ||(campaign))) + &&campaign + &&winfreeze)) + && (!mainmenu||gameon||mainmenu==3||mainmenu==4||mainmenu==5||mainmenu==6||(mainmenu==7&&!entername)||mainmenu==9||mainmenu==10)){ selected=-1; if(mainmenu==1||mainmenu==2||mainmenu==0){ if(mainmenu==0&&!winfreeze)mainmenu=2; else if(mainmenu==0&&winfreeze&&(campaignchoosenext[campaignchoicewhich[whichchoice]])==1)mainmenu=100; - else if(mainmenu==0&&winfreeze){ - - } + else if(mainmenu==0&&winfreeze){ } else if(mainmenu==1||mainmenu==2)mainmenu=0; if(mainmenu&&musictoggle){ if(mainmenu==1||mainmenu==2||mainmenu==100){ @@ -2263,20 +6122,14 @@ void Game::Tick() } } if(mainmenu==3){ - fireSound(); - - flash(); - if(newdetail>2)newdetail=detail; if(newdetail<0)newdetail=detail; if(newscreenwidth<0)newscreenwidth=screenwidth; if(newscreenheight<0)newscreenheight=screenheight; - SaveSettings(*this); } - if(mainmenu==4||mainmenu==5||mainmenu==6||mainmenu==7||mainmenu==9||mainmenu==10||mainmenu==100){ + if((mainmenu>=3 && mainmenu<=7)||mainmenu==9||mainmenu==10||mainmenu==100){ fireSound(); - flash(); } if(mainmenu==3&&gameon)mainmenu=2; @@ -2293,5040 +6146,1525 @@ void Game::Tick() gameon=0; winfreeze=0; } - mainmenutogglekeydown=1; - } - if(!Input::isKeyDown(SDLK_ESCAPE)){ - mainmenutogglekeydown=0; } } - static bool minimaptogglekeydown; - if(Input::isKeyDown(SDLK_TAB)&&!minimaptogglekeydown&&tutoriallevel){ - if(tutorialstage!=51) - tutorialstagetime=tutorialmaxtime; - emit_sound_np(consolefailsound, 128.); - minimaptogglekeydown=1; - } - if(!Input::isKeyDown(SDLK_TAB)){ - minimaptogglekeydown=0; + if(mainmenu){ + MenuTick(); } - if(mainmenu){ - //menu buttons - if(mainmenu==1||mainmenu==2){ - if(Input::Button()&&!oldbutton&&selected==1){ - if(!gameon){ - fireSound(firestartsound); + if(!mainmenu){ + if(hostile==1)hostiletime+=multiplier; + else hostiletime=0; + if(!winfreeze)leveltime+=multiplier; - flash(); + //keys + if(Input::isKeyDown(SDLK_ESCAPE)){ + chatting=0; + console=0; + freeze=0; + displaychars[0]=0; + } + + if(Input::isKeyPressed(chatkey)&&!console&&!chatting&&debugmode) + chatting=1; - //new game - if(accountactive) { - mainmenu=5; - } else { - mainmenu=7; + if(chatting){ + inputText(displaytext[0],&displayselected,&displaychars[0]); + if(!waiting) { + if(displaychars[0]){ + for(int j=0;j<255;j++){ + displaytext[0][j]=' '; } - selected=-1; - } - else - { - //resume - mainmenu=0; - pause_sound(stream_music3); - resume_stream(music1); - } + displaychars[0]=0; + displayselected=0; + } + chatting=0; } - if(Input::Button()&&!oldbutton&&selected==2){ - fireSound(); - - flash(); - - //options - - mainmenu=3; + displayblinkdelay-=multiplier; + if(displayblinkdelay<=0){ + displayblinkdelay=.3; + displayblink=1-displayblink; + } + } + if(chatting) + keyboardfrozen=1; + if(Input::isKeyDown(SDLK_q)&&Input::isKeyDown(SDLK_LMETA)){ + tryquit=1; + if(mainmenu==3){ if(newdetail>2)newdetail=detail; if(newdetail<0)newdetail=detail; - if(newscreenwidth>3000)newscreenwidth=screenwidth; if(newscreenwidth<0)newscreenwidth=screenwidth; - if(newscreenheight>3000)newscreenheight=screenheight; if(newscreenheight<0)newscreenheight=screenheight; - } - - if(Input::Button()&&!oldbutton&&selected==3){ - fireSound(); - - flash(); - if(!gameon){ - //quit - tryquit=1; - pause_sound(stream_music3); - } - else{ - //end game - gameon=0; - mainmenu=1; - } + SaveSettings(*this); } } - if(mainmenu==3){ - if(Input::Button()&&!oldbutton&&selected!=-1){ - fireSound(); + + static int oldwinfreeze; + if(winfreeze&&!oldwinfreeze){ + OPENAL_SetFrequency(OPENAL_ALL, 0.001); + emit_sound_np(consolesuccesssound); + } + if(winfreeze==0) + oldwinfreeze=winfreeze; + else + oldwinfreeze++; + + if((Input::isKeyPressed(jumpkey)||Input::isKeyPressed(SDLK_SPACE))&&!campaign) + if(winfreeze) + winfreeze=0; + if((Input::isKeyDown(SDLK_ESCAPE))&&!campaign&&gameon) + if(winfreeze){ + mainmenu=9; + gameon=0; } - if(Input::Button()&&!oldbutton&&selected==0){ - - extern SDL_Rect **resolutions; - bool isCustomResolution = true; - bool found = false; - for (int i = 0; (!found) && (resolutions[i]); i++) - { - if ((resolutions[i]->w == screenwidth) && (resolutions[i]->h == screenwidth)) - isCustomResolution = false; - if ((resolutions[i]->w == newscreenwidth) && (resolutions[i]->h == newscreenheight)) - { - i++; - if (resolutions[i] != NULL) - { - newscreenwidth = (int) resolutions[i]->w; - newscreenheight = (int) resolutions[i]->h; - } - else if (isCustomResolution) - { - if ((screenwidth == newscreenwidth) && (screenheight == newscreenheight)) - { - newscreenwidth = (int) resolutions[0]->w; - newscreenheight = (int) resolutions[0]->h; - } - else - { - newscreenwidth = screenwidth; - newscreenheight = screenheight; - } - } - else - { - newscreenwidth = (int) resolutions[0]->w; - newscreenheight = (int) resolutions[0]->h; - } - found = true; - } - } - if (!found) - { - newscreenwidth = (int) resolutions[0]->w; - newscreenheight = (int) resolutions[0]->h; - } + //TODO: what is this test? + if(!freeze&&!winfreeze&&!(mainmenu&&gameon)&&(gameon||!gamestarted)){ - - } - if(Input::Button()&&!oldbutton&&selected==1){ - newdetail++; - if(newdetail>2)newdetail=0; - } - if(Input::Button()&&!oldbutton&&selected==2){ - bloodtoggle++; - if(bloodtoggle>2)bloodtoggle=0; - } - if(Input::Button()&&!oldbutton&&selected==3){ - difficulty++; - if(difficulty>2)difficulty=0; - } - if(Input::Button()&&!oldbutton&&selected==4){ - ismotionblur=1-ismotionblur; - } - if(Input::Button()&&!oldbutton&&selected==5){ - decals=1-decals; - } - if(Input::Button()&&!oldbutton&&selected==6){ - musictoggle=1-musictoggle; - - if(!musictoggle){ - pause_sound(music1); - pause_sound(stream_music2); - pause_sound(stream_music3); - - for(i=0;i<4;i++){ - oldmusicvolume[i]=0; - musicvolume[i]=0; - } - } - - if(musictoggle) - emit_stream_np(stream_music3); - } - if(Input::Button()&&!oldbutton&&selected==9){ - invertmouse=1-invertmouse; - } - if(Input::Button()&&!oldbutton&&selected==10){ - usermousesensitivity+=.2; - if(usermousesensitivity>2)usermousesensitivity=.2; - } - if(Input::Button()&&!oldbutton&&selected==11){ - volume+=.1f; - if(volume>1.0001f)volume=0; - OPENAL_SetSFXMasterVolume((int)(volume*255)); - } - if(Input::Button()&&!oldbutton&&selected==7){ - /*fireSound(); - */ - flash(); - - //options - - mainmenu=4; - selected=-1; - keyselect=-1; - } - if(Input::Button() && !oldbutton && selected == 12) { - flash(); - - newstereomode = stereomode; - mainmenu=18; - keyselect=-1; - } - if(Input::Button() && !oldbutton && selected == 13) { - showdamagebar=!showdamagebar; - } - if(Input::Button()&&!oldbutton&&selected==8){ - fireSound(); - - flash(); - - if(newdetail>2)newdetail=detail; - if(newdetail<0)newdetail=detail; - if(newscreenwidth<0)newscreenwidth=screenwidth; - if(newscreenheight<0)newscreenheight=screenheight; - - - SaveSettings(*this); - if(mainmenu==3&&gameon)mainmenu=2; - if(mainmenu==3&&!gameon)mainmenu=1; - } - } - if(mainmenu==4){ - if(Input::Button()&&!oldbutton&&selected!=-1&&!waiting){ - fireSound(); - if(selected<9&&keyselect==-1) - keyselect=selected; - if(keyselect!=-1) - setKeySelected(); - if(selected==9){ - flash(); - - mainmenu=3; - - if(newdetail>2)newdetail=detail; - if(newdetail<0)newdetail=detail; - if(newscreenwidth>3000)newscreenwidth=screenwidth; - if(newscreenwidth<0)newscreenwidth=screenwidth; - if(newscreenheight>3000)newscreenheight=screenheight; - if(newscreenheight<0)newscreenheight=screenheight; - } - } - } - - if(mainmenu==5){ - - if(endgame==2){ - accountactive->endGame(); - endgame=0; - } - - if(Input::Button()&&!oldbutton&&selected==1){ - fireSound(); - - flash(); - - startbonustotal=0; - - loading=2; - loadtime=0; - targetlevel=-1; - if(firstload)TickOnceAfter(); - if(!firstload)LoadStuff(); - else { - Loadlevel(-1); - } - - mainmenu=0; - gameon=1; - pause_sound(stream_music3); - } - if(Input::Button()&&!oldbutton&&(selected-7>=accountactive->getCampaignChoicesMade())){ - fireSound(); - - flash(); - - startbonustotal=0; - - loading=2; - loadtime=0; - targetlevel=7; - if(firstload) TickOnceAfter(); - else LoadStuff(); - whichchoice=selected-7-accountactive->getCampaignChoicesMade(); - visibleloading=1; - stillloading=1; - Loadlevel(campaignmapname[campaignchoicewhich[selected-7-accountactive->getCampaignChoicesMade()]]); - //Loadlevel(campaignmapname[levelorder[selected-7]]); - campaign=1; - mainmenu=0; - gameon=1; - pause_sound(stream_music3); - } - if(Input::Button()&&!oldbutton&&selected==4){ - fireSound(); - - flash(); - - if(mainmenu==5&&gameon)mainmenu=2; - if(mainmenu==5&&!gameon)mainmenu=1; - } - if(Input::Button()&&!oldbutton&&selected==5){ - fireSound(); - - flash(); - - mainmenu=7; - } - if(Input::Button()&&!oldbutton&&selected==3){ - fireSound(); - - flash(); - - mainmenu=6; - } - if(Input::Button()&&!oldbutton&&selected==2){ - fireSound(); - - flash(); - - mainmenu=9; - } - } - else if(mainmenu==9){ - if(Input::Button()&&!oldbutton&&selected=0&&selected<=accountactive->getProgress()){ - fireSound(); - - flash(); - - startbonustotal=0; - - loading=2; - loadtime=0; - targetlevel=selected; - if(firstload)TickOnceAfter(); - if(!firstload)LoadStuff(); - else { - Loadlevel(selected); - } - campaign=0; - - mainmenu=0; - gameon=1; - pause_sound(stream_music3); - } - if(Input::Button()&&!oldbutton&&selected==numchallengelevels){ - fireSound(); - - flash(); - - mainmenu=5; - } - } - if(mainmenu==10){ - endgame=2; - if(Input::Button()&&!oldbutton&&selected==3){ - fireSound(); - - flash(); - - mainmenu=5; - } - } - - if(mainmenu==6){ - if(Input::Button()&&!oldbutton) { - if(selected>-1){ - fireSound(); - if(selected==1) { - flash(); - accountactive = Account::destroy(accountactive); - mainmenu=7; - } else if(selected==2) { - flash(); - mainmenu=5; - } - } - } - } - if(mainmenu==7){ - if(Input::Button()&&!oldbutton) { - if(selected!=-1){ - fireSound(); - if(selected==0&&Account::getNbAccounts()<8){ - entername=1; - } else if (selected-1){ - fireSound(); - - if(selected<=2) - accountactive->setDifficulty(selected); - - mainmenu=5; - - flash(); - - } - } - if (mainmenu==18) { - if(Input::Button()&&!oldbutton&&selected==0) { - newstereomode = (StereoMode)(newstereomode + 1); - while(!CanInitStereo(newstereomode)) { - printf("Failed to initialize mode %s (%i)\n", StereoModeName(newstereomode), newstereomode); - newstereomode = (StereoMode)(newstereomode + 1); - if ( newstereomode >= stereoCount ) { - newstereomode = stereoNone; - } - } - } - - if(Input::isKeyDown(MOUSEBUTTON1)&&!oldbutton&&selected==1) { - stereoseparation+=0.001; - } - if(Input::isKeyDown(MOUSEBUTTON2)&&!oldbutton&&selected==1) { - stereoseparation-=0.001; - } - - if(Input::Button()&&!oldbutton&&selected==2) { - stereoreverse =! stereoreverse; - } - - if(Input::Button()&&!oldbutton&&selected==3) { - flash(); - - stereomode = newstereomode; - InitStereo(stereomode); - - mainmenu=3; - } - } - - - if(Input::Button()||Input::isKeyDown(MOUSEBUTTON2))oldbutton=1; - else oldbutton=0; - - if(Input::isKeyDown(SDLK_q)&&Input::isKeyDown(SDLK_LMETA)){ - tryquit=1; - if(mainmenu==3){ - if(newdetail>2)newdetail=detail; - if(newdetail<0)newdetail=detail; - if(newscreenwidth<0)newscreenwidth=screenwidth; - if(newscreenheight<0)newscreenheight=screenheight; - - SaveSettings(*this); - } - } - - if(mainmenu==1||mainmenu==2){ - if(loaddistrib>4)transition+=multiplier/8; - if(transition>1){ - transition=0; - anim++; - if(anim>4)anim=0; - loaddistrib=0; - } - } - OPENAL_SetFrequency(channels[stream_music3], 22050); - - if(entername) { - inputText(displaytext[0],&displayselected,&displaychars[0]); - if(!waiting) { // the input as finished - if(displaychars[0]){ // with enter - accountactive = Account::add(string(displaytext[0])); - - mainmenu=8; - - flash(); - - fireSound(firestartsound); - - for(i=0;i<255;i++){ - displaytext[0][i]=' '; - } - displaychars[0]=0; - - displayselected=0; - } else { // with escape or empty - mainmenutogglekeydown=1; - } - entername=0; - } - - displayblinkdelay-=multiplier; - if(displayblinkdelay<=0){ - displayblinkdelay=.3; - displayblink=1-displayblink; - } - } - } - - if(!mainmenu){ - if(hostile==1)hostiletime+=multiplier; - else hostiletime=0; - if(!winfreeze)leveltime+=multiplier; - if(Input::isKeyDown(SDLK_ESCAPE)){ - chatting=0; - console=0; - freeze=0; - displaychars[0]=0; - } - - if(Input::isKeyDown(chatkey)&&!chattogglekeydown&&!console&&!chatting&&debugmode){ - chatting=1; - chattogglekeydown=1; - } - - if(!Input::isKeyDown(chatkey)){ - chattogglekeydown=0; - } - - if(chatting){ - inputText(displaytext[0],&displayselected,&displaychars[0]); - if(!waiting) { - if(displaychars[0]){ - for(int j=0;j<255;j++){ - displaytext[0][j]=' '; - } - displaychars[0]=0; - displayselected=0; - } - chatting=0; - } - - displayblinkdelay-=multiplier; - if(displayblinkdelay<=0){ - displayblinkdelay=.3; - displayblink=1-displayblink; - } - } - - if(chatting)keyboardfrozen=1; - - if(Input::isKeyDown(SDLK_v)&&!freezetogglekeydown&&debugmode){ - freeze=1-freeze; - if(freeze){ - OPENAL_SetFrequency(OPENAL_ALL, 0.001); - } - freezetogglekeydown=1; - } - - if(!Input::isKeyDown(SDLK_v)&&!Input::isKeyDown(SDLK_F1)){ - freezetogglekeydown=0; - } - - if(Input::isKeyDown(SDLK_BACKQUOTE)&&!consoletogglekeydown&&debugmode){ - console=1-console; - if(console){ - OPENAL_SetFrequency(OPENAL_ALL, 0.001); - } else { - freeze=0; - waiting=false; - } - consoletogglekeydown=1; - } - - if(!Input::isKeyDown(SDLK_BACKQUOTE)){ - consoletogglekeydown=0; - } - - if(console)freeze=1; - - if(console&&!Input::isKeyDown(SDLK_LMETA)){ - inputText(consoletext[0],&consoleselected,&consolechars[0]); - if(!waiting) { - archiveselected=0; - cmd_dispatch(this, consoletext[0]); - if(consolechars[0]>0){ - - for(k=14;k>=1;k--){ - for(j=0;j<255;j++){ - consoletext[k][j]=consoletext[k-1][j]; - } - consolechars[k]=consolechars[k-1]; - } - for(j=0;j<255;j++){ - consoletext[0][j]=' '; - } - consolechars[0]=0; - consoleselected=0; - } - } - - consoleblinkdelay-=multiplier; - if(consoleblinkdelay<=0){ - consoleblinkdelay=.3; - consoleblink=1-consoleblink; - } - } - - if(Input::isKeyDown(SDLK_q)&&Input::isKeyDown(SDLK_LMETA)){ - tryquit=1; - if(mainmenu==3){ - if(newdetail>2)newdetail=detail; - if(newdetail<0)newdetail=detail; - if(newscreenwidth<0)newscreenwidth=screenwidth; - if(newscreenheight<0)newscreenheight=screenheight; - - SaveSettings(*this); - } - } - - static int oldwinfreeze; - if(winfreeze&&!oldwinfreeze){ - OPENAL_SetFrequency(OPENAL_ALL, 0.001); - emit_sound_np(consolesuccesssound); - } - if(winfreeze==0)oldwinfreeze=winfreeze; - else oldwinfreeze++; - - if((Input::isKeyDown(jumpkey)||Input::isKeyDown(SDLK_SPACE))&&!oldjumpkeydown&&!campaign){ - if(winfreeze)winfreeze=0; - oldjumpkeydown=1; - } - if((Input::isKeyDown(SDLK_ESCAPE))&&!campaign&&gameon){ - if(winfreeze){ - mainmenu=9; - gameon=0; - } - } - if((Input::isKeyDown(jumpkey)||Input::isKeyDown(SDLK_SPACE))){ - oldjumpkeydown=1; - } - if(!Input::isKeyDown(jumpkey)&&!Input::isKeyDown(SDLK_SPACE))oldjumpkeydown=0; - - if(!freeze&&!winfreeze&&!(mainmenu&&gameon)&&(gameon||!gamestarted)){ - - static bool oldbuttondialogue; - - if(indialogue!=-1)talkdelay=1; - talkdelay-=multiplier; - - if(talkdelay<=0) - if(indialogue==-1&&(animation[player[0].targetanimation].height!=highheight)/*&&!hostile*/) - for(i=0;i49){ - realdialoguetype=dialoguetype[i]-50; - special=1; - } - else if(dialoguetype[i]>39){ - realdialoguetype=dialoguetype[i]-40; - special=1; - } - else if(dialoguetype[i]>29){ - realdialoguetype=dialoguetype[i]-30; - special=1; - } - else if(dialoguetype[i]>19){ - realdialoguetype=dialoguetype[i]-20; - special=1; - } - else if(dialoguetype[i]>9){ - realdialoguetype=dialoguetype[i]-10; - special=1; - } - else { - realdialoguetype=dialoguetype[i]; - special=0; - } - if((!hostile||(dialoguetype[i]>40&&dialoguetype[i]<50))&&realdialoguetype0&&(dialoguegonethrough[i]==0||!special)&&(special||(Input::isKeyDown(attackkey)&&!oldbuttondialogue))){ - if(findDistancefast(&player[0].coords,&player[realdialoguetype].coords)<6||player[realdialoguetype].howactive>=typedead1||(dialoguetype[i]>40&&dialoguetype[i]<50)){ - whichdialogue=i; - for(j=0;j0){ - hotspot[i]=player[hotspottype[i]].coords; - } - } - } - - //Tutorial - if(tutoriallevel&&tutorialstagetime>tutorialmaxtime){ - tutorialstage++; - tutorialsuccess=0; - if(tutorialstage<=1){ - canattack=0; - cananger=0; - reversaltrain=0; - } - if(tutorialstage==1){ - tutorialmaxtime=5; - } else if(tutorialstage==2){ - tutorialmaxtime=2; - } else if(tutorialstage==3){ - tutorialmaxtime=600; - } else if(tutorialstage==4){ - tutorialmaxtime=1000; - } else if(tutorialstage==5){ - tutorialmaxtime=600; - } else if(tutorialstage==6){ - tutorialmaxtime=600; - } else if(tutorialstage==7){ - tutorialmaxtime=600; - } else if(tutorialstage==8){ - tutorialmaxtime=600; - } else if(tutorialstage==9){ - tutorialmaxtime=600; - } else if(tutorialstage==10){ - tutorialmaxtime=2; - } else if(tutorialstage==11){ - tutorialmaxtime=1000; - } else if(tutorialstage==12){ - tutorialmaxtime=1000; - } else if(tutorialstage==13){ - tutorialmaxtime=2; - } else if(tutorialstage==14){ - tutorialmaxtime=3; - - XYZ temp,temp2; - - temp.x=1011; - temp.y=84; - temp.z=491; - temp2.x=1025; - temp2.y=75; - temp2.z=447; - - player[1].coords=(temp+temp2)/2; - - emit_sound_at(fireendsound, player[1].coords); - - for(i=0;i0)tutorialsuccess=1; - } - if(tutorialstage==41){ - if(player[0].weaponactive==-1&&player[0].num_weapons>0)tutorialsuccess=1; - } - if(tutorialstage==43){ - if(player[0].targetanimation==knifeslashstartanim)tutorialsuccess=1; - } - if(tutorialstage==44){ - if(animation[player[0].targetanimation].attack==reversal)tutorialsuccess=1; - } - if(tutorialstage==45){ - if(animation[player[0].targetanimation].attack==reversal)tutorialsuccess=1; - } - if(tutorialstage==46){ - if(animation[player[0].targetanimation].attack==reversal)tutorialsuccess=1; - } - if(tutorialstage==49){ - if(player[1].weaponstuck!=-1)tutorialsuccess=1; - } - if(tutorialsuccess>=1)tutorialstagetime=tutorialmaxtime-3; - - - if(tutorialstagetime==tutorialmaxtime-3){ - emit_sound_np(consolesuccesssound); - } - - if(tutorialsuccess>=1){ - if(tutorialstage==34||tutorialstage==35) - tutorialstagetime=tutorialmaxtime-1; - } - } - - if(tutoriallevel){ - if(tutorialstage<14||tutorialstage>=50){ - player[1].coords.y=300; - player[1].velocity=0; - } - } - - if(tutoriallevel!=1){ - if(bonustime==0&&bonus!=solidhit&&bonus!=spinecrusher&&bonus!=tracheotomy&&bonus!=backstab&&bonusvalue>10){ - emit_sound_np(consolesuccesssound); - } - } - else - if(bonustime==0){ - emit_sound_np(fireendsound); - } - if(bonustime==0){ - if(bonus!=solidhit&&bonus!=twoxcombo&&bonus!=threexcombo&&bonus!=fourxcombo&&bonus!=megacombo)bonusnum[bonus]++; - else bonusnum[bonus]+=0.15; - if(tutoriallevel)bonusvalue=0; - bonusvalue/=bonusnum[bonus]; - bonustotal+=bonusvalue; - } - bonustime+=multiplier; - - if(environment==snowyenvironment){ - precipdelay-=multiplier; - while(precipdelay<0){ - precipdelay+=.04; - if(!detail)precipdelay+=.04; - XYZ footvel,footpoint; - - footvel=0; - footpoint=viewer+viewerfacing*6; - footpoint.y+=((float)abs(Random()%1200))/100-6; - footpoint.x+=((float)abs(Random()%1200))/100-6; - footpoint.z+=((float)abs(Random()%1200))/100-6; - Sprite::MakeSprite(snowsprite, footpoint,footvel, 1,1,1, .1, 1); - } - } - for(k=0;kplayer[k].targetrotation){ - player[k].rotation-=multiplier*player[k].turnspeed; - } - else if(player[k].rotationplayer[k].targetrotation){ - player[k].rotation-=multiplier*player[k].turnspeed; - } - else if(player[k].rotationplayer[k].targetrotation){ - player[k].rotation-=multiplier*player[k].turnspeed; - } - else if(player[k].rotation0){ - if(!player[k].skeleton.free&&player[k].targetanimation!=climbanim&&player[k].targetanimation!=hanganim){ - bool tempcollide=0; - - if(player[k].collide<-.3)player[k].collide=-.3; - if(player[k].collide>1)player[k].collide=1; - player[k].collide-=multiplier*30; - - if(player[k].coords.y.5&&player[k].aitype==playercontrolled)||objects.position[i].y>player[k].coords.y))){ - lowpoint=player[k].coords; - if(player[k].targetanimation!=jumpupanim&&player[k].targetanimation!=jumpdownanim&&!player[k].isFlip())lowpoint.y+=1.25; - else lowpoint.y+=1.3; - if(player[k].coords.yterrain.getHeight(player[k].coords.x,player[k].coords.z)-.1){ - player[k].coords.y=terrain.getHeight(player[k].coords.x,player[k].coords.z); - } - /*while(player[k].coords.y.5) - if(whichhit!=-1){ - //if(k==0){ - if(whichhit!=-1)if(player[k].targetanimation!=jumpupanim&&player[k].targetanimation!=jumpdownanim)player[k].collided=1; - if(checkcollide(lowpoint7,lowpointtarget7)==-1) - if(checkcollide(lowpoint6,lowpointtarget6)==-1) - if(objects.model[i].LineCheckPossible(&lowpoint2,&lowpointtarget2,&colpoint,&objects.position[i],&objects.rotation[i])!=-1&&objects.model[i].LineCheckPossible(&lowpoint3,&lowpointtarget3,&colpoint,&objects.position[i],&objects.rotation[i])!=-1&&objects.model[i].LineCheckPossible(&lowpoint4,&lowpointtarget4,&colpoint,&objects.position[i],&objects.rotation[i])!=-1&&objects.model[i].LineCheckPossible(&lowpoint5,&lowpointtarget5,&colpoint,&objects.position[i],&objects.rotation[i])!=-1) - for(j=0;j<45;j++){ - lowpoint=player[k].coords; - lowpoint.y+=(float)j/13; - lowpointtarget=lowpoint+facing*1.4; - if(objects.model[i].LineCheckPossible(&lowpoint,&lowpointtarget,&colpoint2,&objects.position[i],&objects.rotation[i])==-1){ - if(j<=6){ - j=100; - } - /*if(j>=25&&(player[k].isRun()||player[k].targetanimation==sneakanim||player[k].targetanimation==walkanim)){ - j=100; - }*/ - if(j<=25&&player[k].targetanimation==jumpdownanim){ - j=100; - } - if(j!=100&&(/*j>25||(player[k].isRun()||player[k].targetanimation==sneakanim||player[k].targetanimation==walkanim)||*/player[k].targetanimation==jumpupanim||player[k].targetanimation==jumpdownanim)){ - lowpoint=DoRotation(objects.model[i].facenormals[whichhit],0,objects.rotation[k],0); - if(1==1/*dotproduct(&player[k].velocity,&lowpoint)>0||player[k].aitype!=playercontrolled||(player[k].isRun()||player[k].targetanimation==sneakanim||player[k].targetanimation==walkanim||player[k].targetanimation==jumpupanim)*/){ - lowpoint=player[k].coords; - lowpoint.y+=(float)j/13; - lowpointtarget=lowpoint+facing*1.3; - flatfacing=player[k].coords; - player[k].coords=colpoint-DoRotation(objects.model[i].facenormals[whichhit],0,objects.rotation[k],0)*.01; - player[k].coords.y=lowpointtarget.y-.07; - player[k].currentoffset=(flatfacing-player[k].coords)/player[k].scale; - - if(j>10||!player[k].isRun()){ - if(player[k].targetanimation==jumpdownanim||player[k].targetanimation==jumpupanim){ - if(k==0)pause_sound(whooshsound); - } - emit_sound_at(jumpsound, player[k].coords, 128.); - - lowpointtarget=DoRotation(objects.model[i].facenormals[whichhit],0,objects.rotation[i],0); - player[k].rotation=-asin(0-lowpointtarget.x); - player[k].rotation*=360/6.28; - if(lowpointtarget.z<0)player[k].rotation=180-player[k].rotation; - player[k].targetrotation=player[k].rotation; - player[k].lowrotation=player[k].rotation; - - //player[k].velocity=lowpointtarget*.03; - player[k].velocity=0; - - if(/*(player[k].isRun()||player[k].targetanimation==sneakanim||player[k].targetanimation==walkanim)||*/player[k].targetanimation==jumpupanim){ - //player[k].currentanimation=climbanim; - player[k].targetanimation=climbanim; - player[k].jumppower=0; - player[k].jumpclimb=1; - } - player[k].transspeed=6; - player[k].target=0; - - //player[k].currentframe=1; - player[k].targetframe=1; - if(j>25){ - //player[k].currentframe=0; - player[k].targetframe=0; - //player[k].currentanimation=hanganim; - player[k].targetanimation=hanganim; - player[k].jumppower=0; - } - } - j=100; - } - } - } - } - //} - } - } - } - } - } - if(player[k].collide<=0){ - if(!player[k].onterrain&&player[k].targetanimation!=jumpupanim&&player[k].targetanimation!=jumpdownanim&&player[k].targetanimation!=climbanim&&player[k].targetanimation!=hanganim&&!player[k].isWallJump()&&!player[k].isFlip()){ - if(player[k].currentanimation!=climbanim&&player[k].currentanimation!=tempanim&&player[k].targetanimation!=backhandspringanim&&(player[k].targetanimation!=rollanim||player[k].targetframe<2||player[k].targetframe>6)){ - if(player[k].targetanimation==staggerbackhighanim||player[k].targetanimation==staggerbackhardanim)player[k].RagDoll(0); - player[k].targetanimation=jumpdownanim; - player[k].targetframe=0; - player[k].target=0; - - if(!k) - emit_sound_at(whooshsound, player[k].coords, 128.); - } - player[k].velocity.y+=gravity; - } - } - } - } - player[k].realoldcoords=player[k].coords; - } - - static XYZ oldviewer; - - if(indialogue==-1){ - player[0].forwardkeydown=Input::isKeyDown(forwardkey); - player[0].leftkeydown=Input::isKeyDown(leftkey); - player[0].backkeydown=Input::isKeyDown(backkey); - player[0].rightkeydown=Input::isKeyDown(rightkey); - player[0].jumpkeydown=Input::isKeyDown(jumpkey); - player[0].crouchkeydown=Input::isKeyDown(crouchkey); - player[0].drawkeydown=Input::isKeyDown(drawkey); - player[0].throwkeydown=Input::isKeyDown(throwkey); - } - else - { - player[0].forwardkeydown=0; - player[0].leftkeydown=0; - player[0].backkeydown=0; - player[0].rightkeydown=0; - player[0].jumpkeydown=0; - player[0].crouchkeydown=0; - player[0].drawkeydown=0; - player[0].throwkeydown=0; - } - - if(!player[0].jumpkeydown)player[0].jumpclimb=0; - - - static bool endkeydown; - if(indialogue!=-1){ - cameramode=1; - if(directing){ - facing=0; - facing.z=-1; - - facing=DoRotation(facing,-rotation2,0,0); - facing=DoRotation(facing,0,0-rotation,0); - - flatfacing=0; - flatfacing.z=-1; - - flatfacing=DoRotation(flatfacing,0,-rotation,0); - - if(Input::isKeyDown(forwardkey))viewer+=facing*multiplier*4; - if(Input::isKeyDown(backkey))viewer-=facing*multiplier*4; - if(Input::isKeyDown(leftkey))viewer+=DoRotation(flatfacing*multiplier,0,90,0)*4; - if(Input::isKeyDown(rightkey))viewer+=DoRotation(flatfacing*multiplier,0,-90,0)*4; - if(Input::isKeyDown(jumpkey))viewer.y+=multiplier*4; - if(Input::isKeyDown(crouchkey))viewer.y-=multiplier*4; - if(!endkeydown&&(Input::isKeyDown(SDLK_1)||Input::isKeyDown(SDLK_2)||Input::isKeyDown(SDLK_3)||Input::isKeyDown(SDLK_4)||Input::isKeyDown(SDLK_5) - ||Input::isKeyDown(SDLK_6)||Input::isKeyDown(SDLK_7)||Input::isKeyDown(SDLK_8)||Input::isKeyDown(SDLK_9)||Input::isKeyDown(SDLK_0) - ||Input::isKeyDown(SDLK_MINUS))){ - int whichend; - if(Input::isKeyDown(SDLK_1))whichend=1; - if(Input::isKeyDown(SDLK_2))whichend=2; - if(Input::isKeyDown(SDLK_3))whichend=3; - if(Input::isKeyDown(SDLK_4))whichend=4; - if(Input::isKeyDown(SDLK_5))whichend=5; - if(Input::isKeyDown(SDLK_6))whichend=6; - if(Input::isKeyDown(SDLK_7))whichend=7; - if(Input::isKeyDown(SDLK_8))whichend=8; - if(Input::isKeyDown(SDLK_9))whichend=9; - if(Input::isKeyDown(SDLK_0))whichend=0; - if(Input::isKeyDown(SDLK_MINUS))whichend=-1; - if(whichend!=-1){ - participantfocus[whichdialogue][indialogue]=whichend; - participantlocation[whichdialogue][whichend]=player[whichend].coords; - participantrotation[whichdialogue][whichend]=player[whichend].rotation; - } - if(whichend==-1){ - participantfocus[whichdialogue][indialogue]=-1; - } - if(player[participantfocus[whichdialogue][indialogue]].dead){ - indialogue=-1; - directing=0; - cameramode=0; - } - dialoguecamera[whichdialogue][indialogue]=viewer; - dialoguecamerarotation[whichdialogue][indialogue]=rotation; - dialoguecamerarotation2[whichdialogue][indialogue]=rotation2; - indialogue++; - if(indialogue=numdialogueboxes[whichdialogue]){ - indialogue=-1; - directing=0; - cameramode=0; - } - } - if(!directing){ - pause_sound(whooshsound); - viewer=dialoguecamera[whichdialogue][indialogue]; - if(viewer.y0.5) - if((!endkeydown&&(Input::isKeyDown(SDLK_1)||Input::isKeyDown(SDLK_2)||Input::isKeyDown(SDLK_3)||Input::isKeyDown(SDLK_4)||Input::isKeyDown(SDLK_5) - ||Input::isKeyDown(SDLK_6)||Input::isKeyDown(SDLK_7)||Input::isKeyDown(SDLK_8)||Input::isKeyDown(SDLK_9)||Input::isKeyDown(SDLK_0) - ||Input::isKeyDown(SDLK_MINUS)))||(Input::isKeyDown(attackkey)&&!oldbuttondialogue)){ - indialogue++; - endkeydown=1; - if(indialogue=numdialogueboxes[whichdialogue]){ - indialogue=-1; - directing=0; - cameramode=0; - if(dialoguetype[whichdialogue]>19&&dialoguetype[whichdialogue]<30){ - hostile=1; - } - if(dialoguetype[whichdialogue]>29&&dialoguetype[whichdialogue]<40){ - windialogue=1; - } - if(dialoguetype[whichdialogue]>49&&dialoguetype[whichdialogue]<60){ - hostile=1; - for(i=1;i2)environment=0; - Setenvironment(environment); - - envtogglekeydown=1; - } - - - if(!Input::isKeyDown(SDLK_j)){ - envtogglekeydown=0; - } - - if(Input::isKeyDown(SDLK_c)&&!cameratogglekeydown&&debugmode){ - cameramode=1-cameramode; - cameratogglekeydown=1; - } - - if(!Input::isKeyDown(SDLK_c)){ - cameratogglekeydown=0; - } - - if(Input::isKeyDown(SDLK_x)&&!Input::isKeyDown(SDLK_LSHIFT)&&!detailtogglekeydown&&debugmode){ - if(player[0].num_weapons>0){ - if(weapons.type[player[0].weaponids[0]]==sword)weapons.type[player[0].weaponids[0]]=staff; - else if(weapons.type[player[0].weaponids[0]]==staff)weapons.type[player[0].weaponids[0]]=knife; - else weapons.type[player[0].weaponids[0]]=sword; - if(weapons.type[player[0].weaponids[0]]==sword){ - weapons.mass[player[0].weaponids[0]]=1.5; - weapons.tipmass[player[0].weaponids[0]]=1; - weapons.length[player[0].weaponids[0]]=.8; - } - if(weapons.type[player[0].weaponids[0]]==staff){ - weapons.mass[player[0].weaponids[0]]=2; - weapons.tipmass[player[0].weaponids[0]]=1; - weapons.length[player[0].weaponids[0]]=1.5; - } - - if(weapons.type[player[0].weaponids[0]]==knife){ - weapons.mass[player[0].weaponids[0]]=1; - weapons.tipmass[player[0].weaponids[0]]=1.2; - weapons.length[player[0].weaponids[0]]=.25; - } - } - detailtogglekeydown=1; - } - - if(Input::isKeyDown(SDLK_x)&&Input::isKeyDown(SDLK_LSHIFT)&&!detailtogglekeydown&&debugmode){ - int closest=-1; - float closestdist=-1; - float distance; - if(numplayers>1) - for(i=1;i1) - for(i=1;i1) - for(i=1;i9)player[closest].whichskin=0; - if(player[closest].whichskin>2&&player[closest].creature==wolftype)player[closest].whichskin=0; - - LoadTextureSave(creatureskin[player[closest].creature][player[closest].whichskin], - &player[closest].skeleton.drawmodel.textureptr,1,&player[closest].skeleton.skinText[0],&player[closest].skeleton.skinsize); - } - - if(player[closest].numclothes){ - for(i=0;i1) - for(i=1;i1) - for(i=1;i1) - for(i=1;i1) - for(i=1;i0&&closest>=0){ - //player[closest]=player[numplayers-1]; - //player[closest].skeleton=player[numplayers-1].skeleton; - numplayers--; - } - drawmodetogglekeydown=1; - } - - if(Input::isKeyDown(SDLK_DELETE)&&editorenabled&&!drawmodetogglekeydown&&Input::isKeyDown(SDLK_LCTRL)){ - int closest=-1; - float closestdist=-1; - float distance; - if(max_objects>1) - for(i=1;i0&&closest>=0){ - objects.position[closest].y-=500; - } - drawmodetogglekeydown=1; - } - - if(Input::isKeyDown(SDLK_m)&&!drawmodetogglekeydown&&!Input::isKeyDown(SDLK_LSHIFT)&&editorenabled&&debugmode){ - //drawmode++; - //if(drawmode>2)drawmode=0; - if(objects.numobjects1) - for(i=0;i1&&pathpointselected!=-1){ - numpathpointconnect[pathpointselected]++; - pathpointconnect[pathpointselected][numpathpointconnect[pathpointselected]-1]=numpathpoints-1; - } - pathpointselected=numpathpoints-1; - } - } - drawmodetogglekeydown=1; - } - - if(Input::isKeyDown(SDLK_PERIOD)&&!drawmodetogglekeydown&&editorenabled){ - pathpointselected++; - if(pathpointselected>=numpathpoints)pathpointselected=-1; - drawmodetogglekeydown=1; - } - if(Input::isKeyDown(SDLK_COMMA)&&!Input::isKeyDown(SDLK_LSHIFT)&&!drawmodetogglekeydown&&editorenabled){ - pathpointselected--; - if(pathpointselected<=-2) - pathpointselected=numpathpoints-1; - drawmodetogglekeydown=1; - } - if(Input::isKeyDown(SDLK_COMMA)&&Input::isKeyDown(SDLK_LSHIFT)&&!drawmodetogglekeydown&&editorenabled){ - if(pathpointselected!=-1){ - numpathpoints--; - pathpoint[pathpointselected]=pathpoint[numpathpoints]; - numpathpointconnect[pathpointselected]=numpathpointconnect[numpathpoints]; - for(i=0;ifiretype)editortype=0; - drawmodetogglekeydown=1; - } - - if(Input::isKeyDown(SDLK_LEFT)&&editorenabled&&!Input::isKeyDown(SDLK_LSHIFT)&&!Input::isKeyDown(SDLK_LCTRL)){ - editorrotation-=multiplier*100; - if(editorrotation<-.01)editorrotation=-.01; - drawmodetogglekeydown=1; - } - - if(Input::isKeyDown(SDLK_RIGHT)&&editorenabled&&!Input::isKeyDown(SDLK_LSHIFT)&&!Input::isKeyDown(SDLK_LCTRL)){ - editorrotation+=multiplier*100; - drawmodetogglekeydown=1; - } - - if(Input::isKeyDown(SDLK_UP)&&editorenabled&&!Input::isKeyDown(SDLK_LCTRL)){ - editorsize+=multiplier; - drawmodetogglekeydown=1; - } - - if(Input::isKeyDown(SDLK_DOWN)&&editorenabled&&!Input::isKeyDown(SDLK_LCTRL)){ - editorsize-=multiplier; - if(editorsize<.1)editorsize=.1; - drawmodetogglekeydown=1; - } - - - if(Input::isKeyDown(SDLK_LEFT)&&!drawmodetogglekeydown&&editorenabled&&Input::isKeyDown(SDLK_LSHIFT)&&Input::isKeyDown(SDLK_LCTRL)){ - mapradius-=multiplier*10; - } - - if(Input::isKeyDown(SDLK_RIGHT)&&!drawmodetogglekeydown&&editorenabled&&Input::isKeyDown(SDLK_LSHIFT)&&Input::isKeyDown(SDLK_LCTRL)){ - mapradius+=multiplier*10; - } - if(Input::isKeyDown(SDLK_UP)&&editorenabled&&Input::isKeyDown(SDLK_LCTRL)){ - editorrotation2+=multiplier*100; - } - - if(Input::isKeyDown(SDLK_DOWN)&&editorenabled&&Input::isKeyDown(SDLK_LCTRL)){ - editorrotation2-=multiplier*100; - if(editorrotation2<-.01)editorrotation2=-.01; - } - if(Input::isKeyDown(SDLK_DELETE)&&editorenabled&&objects.numobjects&&!drawmodetogglekeydown&&!Input::isKeyDown(SDLK_LSHIFT)){ - int closest=-1; - float closestdist=-1; - float distance; - for(i=0;i0&&closest>=0)objects.DeleteObject(closest); - drawmodetogglekeydown=1; - } - - - if(!Input::isKeyDown(SDLK_m)&&!Input::isKeyDown(SDLK_LEFT)&&!Input::isKeyDown(SDLK_COMMA)&&!Input::isKeyDown(SDLK_PERIOD)&&!Input::isKeyDown(SDLK_RIGHT)&&!Input::isKeyDown(SDLK_DELETE)&&!Input::isKeyDown(SDLK_p)){ - drawmodetogglekeydown=0; - } - - if(Input::isKeyDown(SDLK_n)&&!Input::isKeyDown(SDLK_LCTRL)&&!texturesizetogglekeydown&&debugmode){ - //if(!player[0].skeleton.free)player[0].damage+=500; - player[0].RagDoll(0); - //player[0].spurt=1; - //player[0].DoDamage(1000); - - emit_sound_at(whooshsound, player[0].coords, 128.); - - texturesizetogglekeydown=1; - } - - if(Input::isKeyDown(SDLK_n)&&Input::isKeyDown(SDLK_LCTRL)&&!texturesizetogglekeydown&&debugmode){ - - int closest=-1; - float closestdist=-1; - float distance; - for(i=0;i1&&player[k].backkeydown&&player[k].targetanimation!=backhandspringanim&&(player[k].isIdle()||player[k].isStop()||player[k].isRun()||player[k].targetanimation==walkanim)){ - for(i=0;i1) - for(i=0;i0&&weapons.type[player[k].weaponids[player[k].weaponactive]]==knife&&player[i].bloodloss>player[i].damagetolerance/2)player[k].targetanimation=knifefollowanim; - else if(findDistancefast(&player[k].coords,&player[i].coords)<2.5*(player[k].scale*5)*(player[k].scale*5)&&animation[player[i].targetanimation].height!=lowheight&&!player[k].forwardkeydown&&!player[k].leftkeydown&&!player[k].rightkeydown&&!player[k].crouchkeydown&&player[k].weaponactive!=-1&&weapons.type[player[k].weaponids[player[k].weaponactive]]==knife&&player[k].weaponmissdelay<=0)player[k].targetanimation=knifeslashstartanim; - else if(findDistancefast(&player[k].coords,&player[i].coords)<4.5*(player[k].scale*5)*(player[k].scale*5)&&animation[player[i].targetanimation].height!=lowheight&&!player[k].crouchkeydown&&player[k].weaponactive!=-1&&weapons.type[player[k].weaponids[player[k].weaponactive]]==sword&&player[k].weaponmissdelay<=0)player[k].targetanimation=swordslashanim; - else if(findDistancefast(&player[k].coords,&player[i].coords)<4.5*(player[k].scale*5)*(player[k].scale*5)&&animation[player[i].targetanimation].height!=lowheight&&!player[k].crouchkeydown&&player[k].weaponactive!=-1&&weapons.type[player[k].weaponids[player[k].weaponactive]]==staff&&player[k].weaponmissdelay<=0&&!player[k].leftkeydown&&!player[k].rightkeydown&&!player[k].forwardkeydown)player[k].targetanimation=staffhitanim; - else if(findDistancefast(&player[k].coords,&player[i].coords)<4.5*(player[k].scale*5)*(player[k].scale*5)&&animation[player[i].targetanimation].height!=lowheight&&!player[k].crouchkeydown&&player[k].weaponactive!=-1&&weapons.type[player[k].weaponids[player[k].weaponactive]]==staff&&player[k].weaponmissdelay<=0)player[k].targetanimation=staffspinhitanim; - else if(findDistancefast(&player[k].coords,&player[i].coords)<2.5*(player[k].scale*5)*(player[k].scale*5)&&animation[player[i].targetanimation].height!=lowheight)player[k].targetanimation=spinkickanim; - else if(findDistancefast(&player[k].coords,&player[i].coords)<2.5*(player[k].scale*5)*(player[k].scale*5)&&animation[player[i].targetanimation].height==lowheight&&animation[player[k].targetanimation].attack!=normalattack)player[k].targetanimation=lowkickanim; - } - else { - if(findDistancefast(&player[k].coords,&player[i].coords)<4.5*(player[k].scale*5)*(player[k].scale*5)){ - if(player[k].weaponactive==-1)randattack=abs(Random()%5); - else randattack=abs(Random()%5); - if(player[k].weaponactive==-1&&findDistancefast(&player[k].coords,&player[i].coords)<2.5*(player[k].scale*5)*(player[k].scale*5)){ - if(randattack==0&&animation[player[i].targetanimation].height!=lowheight)player[k].targetanimation=sweepanim; - else if(randattack==1&&animation[player[i].targetanimation].height!=lowheight&&player[k].weaponactive==-1)player[k].targetanimation=upunchanim; - else if(randattack==2&&animation[player[i].targetanimation].height!=lowheight)player[k].targetanimation=spinkickanim; - else if(animation[player[i].targetanimation].height==lowheight)player[k].targetanimation=lowkickanim; - } - if(player[k].weaponactive!=-1){ - if((tutoriallevel!=1||player[k].weaponactive==-1)&&findDistancefast(&player[k].coords,&player[i].coords)<2.5*(player[k].scale*5)*(player[k].scale*5)&&randattack==0&&animation[player[i].targetanimation].height!=lowheight)player[k].targetanimation=sweepanim; - else if(findDistancefast(&player[k].coords,&player[i].coords)<2.5*(player[k].scale*5)*(player[k].scale*5)/*&&animation[player[i].targetanimation].height!=lowheight*/&&weapons.type[player[k].weaponids[player[k].weaponactive]]==knife&&player[k].weaponmissdelay<=0)player[k].targetanimation=knifeslashstartanim; - //else if(findDistancefast(&player[k].coords,&player[i].coords)<2.5&&player[k].weaponactive!=-1&&player[i].staggerdelay>0&&weapons.type[player[k].weaponids[player[k].weaponactive]]==knife)player[k].targetanimation=knifefollowanim; - else if(!(player[0].victim==&player[i]&&player[0].hasvictim&&player[0].targetanimation==swordslashanim)&&weapons.type[player[k].weaponids[player[k].weaponactive]]==sword&&player[k].weaponmissdelay<=0)player[k].targetanimation=swordslashanim; - else if(!(player[0].victim==&player[i]&&player[0].hasvictim&&player[0].targetanimation==swordslashanim)&&weapons.type[player[k].weaponids[player[k].weaponactive]]==staff&&player[k].weaponmissdelay<=0&&randattack<3)player[k].targetanimation=staffhitanim; - else if(!(player[0].victim==&player[i]&&player[0].hasvictim&&player[0].targetanimation==swordslashanim)&&weapons.type[player[k].weaponids[player[k].weaponactive]]==staff&&player[k].weaponmissdelay<=0&&randattack>=3)player[k].targetanimation=staffspinhitanim; - else if((tutoriallevel!=1||player[k].weaponactive==-1)&&findDistancefast(&player[k].coords,&player[i].coords)<2.5*(player[k].scale*5)*(player[k].scale*5)&&randattack==1&&animation[player[i].targetanimation].height!=lowheight)player[k].targetanimation=spinkickanim; - else if(findDistancefast(&player[k].coords,&player[i].coords)<2.5*(player[k].scale*5)*(player[k].scale*5)&&animation[player[i].targetanimation].height==lowheight&&animation[player[k].targetanimation].attack!=normalattack)player[k].targetanimation=lowkickanim; - } - } - } - if(player[k].targetanimation==upunchanim&&player[k].creature==wolftype)player[k].targetanimation=wolfslapanim; - } - if((tutoriallevel!=1||tutorialstage==22)&&player[i].howactive0&&player[k].madskills)||(player[i].surprised>0)||player[i].aitype==passivetype)||(player[k].weaponactive!=-1&&player[i].stunned>0))&&normaldotproduct(player[i].facing,player[i].coords-player[k].coords)>0&&(k==0)){ - if(player[k].weaponactive==-1){ - player[i].targetanimation=sneakattackedanim; - player[i].currentanimation=sneakattackedanim; - player[k].currentanimation=sneakattackanim; - player[k].targetanimation=sneakattackanim; - player[k].oldcoords=player[k].coords; - player[k].coords=player[i].coords; - } - if(player[k].weaponactive!=-1&&weapons.type[player[k].weaponids[player[k].weaponactive]]==knife){ - player[i].targetanimation=knifesneakattackedanim; - player[i].currentanimation=knifesneakattackedanim; - player[k].currentanimation=knifesneakattackanim; - player[k].targetanimation=knifesneakattackanim; - player[i].oldcoords=player[i].coords; - player[i].coords=player[k].coords; - } - if(player[k].weaponactive!=-1&&weapons.type[player[k].weaponids[player[k].weaponactive]]==sword){ - player[i].targetanimation=swordsneakattackedanim; - player[i].currentanimation=swordsneakattackedanim; - player[k].currentanimation=swordsneakattackanim; - player[k].targetanimation=swordsneakattackanim; - player[i].oldcoords=player[i].coords; - player[i].coords=player[k].coords; - } - if(player[k].weaponactive==-1||weapons.type[player[k].weaponids[player[k].weaponactive]]!=staff){ - player[k].victim=&player[i]; - player[k].hasvictim=1; - player[i].targettilt2=0; - player[i].targetframe=1; - player[i].currentframe=0; - player[i].target=0; - player[i].velocity=0; - player[k].targettilt2=player[i].targettilt2; - player[k].currentframe=player[i].currentframe; - player[k].targetframe=player[i].targetframe; - player[k].target=player[i].target; - player[k].velocity=0; - player[k].targetrotation=player[i].rotation; - player[k].rotation=player[i].rotation; - player[i].targetrotation=player[i].rotation; - } - } - if(animation[player[k].targetanimation].attack==normalattack&&player[k].victim==&player[i]&&(!player[i].skeleton.free)){ - oldattackkey=1; - player[k].targetframe=0; - player[k].target=0; - //player[k].velocity=0; - - rotatetarget=player[i].coords-player[k].coords; - Normalise(&rotatetarget); - player[k].targetrotation=-asin(0-rotatetarget.x); - player[k].targetrotation*=360/6.28; - if(rotatetarget.z<0)player[k].targetrotation=180-player[k].targetrotation; - - player[k].targettilt2=-asin(rotatetarget.y)*360/6.28;//*-70; - - player[k].lastattack3=player[k].lastattack2; - player[k].lastattack2=player[k].lastattack; - player[k].lastattack=player[k].targetanimation; - //player[k].targettilt2=0; - //slomo=1; - //slomodelay=.2; - } - if(player[k].targetanimation==knifefollowanim&&player[k].victim==&player[i]){ - rotatetarget=player[i].coords-player[k].coords; - Normalise(&rotatetarget); - player[k].targetrotation=-asin(0-rotatetarget.x); - player[k].targetrotation*=360/6.28; - if(rotatetarget.z<0)player[k].targetrotation=180-player[k].targetrotation; - player[k].targettilt2=-asin(rotatetarget.y)*360/6.28;//*-70; - oldattackkey=1; - player[k].victim=&player[i]; - player[k].hasvictim=1; - player[i].targetanimation=knifefollowedanim; - player[i].currentanimation=knifefollowedanim; - player[i].targettilt2=0; - player[i].targettilt2=player[k].targettilt2; - player[i].targetframe=1; - player[i].currentframe=0; - player[i].target=0; - player[i].velocity=0; - player[k].currentanimation=knifefollowanim; - player[k].targetanimation=knifefollowanim; - player[k].targettilt2=player[i].targettilt2; - player[k].currentframe=player[i].currentframe; - player[k].targetframe=player[i].targetframe; - player[k].target=player[i].target; - player[k].velocity=0; - player[k].oldcoords=player[k].coords; - player[i].coords=player[k].coords; - player[i].targetrotation=player[k].targetrotation; - player[i].rotation=player[k].targetrotation; - player[k].rotation=player[k].targetrotation; - player[i].rotation=player[k].targetrotation; - } - } - } - bool hasstaff=0; - if(player[k].weaponactive!=-1){ - if(weapons.type[player[k].weaponids[player[k].weaponactive]]==staff)hasstaff=1; - } - if(numplayers>1) - for(i=0;i1000||player[k].isRun()||(hasstaff)||(player[k].weaponactive!=-1&&player[i].skeleton.free&&(player[i].skeleton.longdead>2000||player[i].damage>player[i].damagetolerance/8||player[i].bloodloss>player[i].damagetolerance/2)&&findDistancefast(&player[k].coords,&player[i].coords)<1.5*(player[k].scale*5)*(player[k].scale*5)))){ - player[k].victim=&player[i]; - player[k].hasvictim=1; - if(player[k].weaponactive!=-1&&tutoriallevel!=1){ - if(player[k].crouchkeydown&&player[k].weaponactive!=-1&&weapons.type[player[k].weaponids[player[k].weaponactive]]==knife&&findDistancefast(&player[k].coords,&player[i].coords)<1.5*(player[k].scale*5)*(player[k].scale*5))player[k].targetanimation=crouchstabanim; - if(player[k].crouchkeydown&&findDistancefast(&player[k].coords,&player[i].coords)<1.5*(player[k].scale*5)*(player[k].scale*5)/*&&player[i].dead!=2*/&&weapons.type[player[k].weaponids[player[k].weaponactive]]==sword)player[k].targetanimation=swordgroundstabanim; - if(/*(player[k].crouchkeydown||!player[i].dead)&&*/findDistancefast(&player[k].coords,&player[i].coords)<3.5*(player[k].scale*5)*(player[k].scale*5)/*&&player[i].dead!=2*/&&weapons.type[player[k].weaponids[player[k].weaponactive]]==staff)player[k].targetanimation=staffgroundsmashanim; - } - if(findDistancefast(&player[k].coords,&player[i].coords)<2.5&&player[k].crouchkeydown&&player[k].targetanimation!=crouchstabanim&&(player[k].weaponactive==-1)&&player[i].dead&&player[i].skeleton.free&&player[i].skeleton.longdead>1000){ - player[k].targetanimation=killanim; - for(j=0;jcoords)&&i!=k&&(i==0||k==0)){ - player[k].victim=&player[i]; - } - } - } - if(player[k].aitype==playercontrolled) - if(player[k].attackkeydown&&(player[k].isRun())&&player[k].wasRun()&&((player[k].hasvictim&&findDistancefast(&player[k].coords,&player[k].victim->coords)<12*(player[k].scale*5)*(player[k].scale*5)&&findDistancefast(&player[k].coords,&player[k].victim->coords)>7*(player[k].scale*5)*(player[k].scale*5)&&!player[k].victim->skeleton.free&&player[k].victim->targetanimation!=getupfrombackanim&&player[k].victim->targetanimation!=getupfromfrontanim&&animation[player[k].victim->targetanimation].height!=lowheight&&player[k].aitype!=playercontrolled&&normaldotproduct(player[k].facing,player[k].victim->coords-player[k].coords)>0&&player[k].rabbitkickenabled)||player[k].jumpkeydown)){ - oldattackkey=1; - player[k].targetanimation=rabbitkickanim; - player[k].targetframe=0; - player[k].target=0; - } - if(animation[player[k].targetanimation].attack&&k==0){ - numattacks++; - bool armedstaff=0; - if(player[k].weaponactive!=-1){ - if(weapons.type[player[k].weaponids[player[k].weaponactive]]==staff)armedstaff=1; - } - bool armedsword=0; - if(player[k].weaponactive!=-1){ - if(weapons.type[player[k].weaponids[player[k].weaponactive]]==sword)armedsword=1; - } - bool armedknife=0; - if(player[k].weaponactive!=-1){ - if(weapons.type[player[k].weaponids[player[k].weaponactive]]==knife)armedknife=1; - } - if(armedstaff)numstaffattack++; - else if(armedsword)numswordattack++; - else if(armedknife)numknifeattack++; - else numunarmedattack++; - } - } - } - } - - //Collisions - static float collisionradius; - if(numplayers>1) - for(k=0;kplayer[k].coords.y-3) - if(player[i].coords.yplayer[k].coords.x-3) - if(player[i].coords.xplayer[k].coords.z-3) - if(player[i].coords.zskeleton.free)collisionradius=3; - if((!player[i].skeleton.oldfree||!player[k].skeleton.oldfree)&&(findDistancefast(&tempcoords1,&tempcoords2)1)||(player[k].skeleton.oldfree==1&&findLengthfast(&player[k].velocity)>1)||(player[i].skeleton.oldfree==0&&player[k].skeleton.oldfree==0)){ - rotatetarget=player[k].velocity-player[i].velocity; - if(((player[i].targetanimation!=getupfrombackanim&&player[i].targetanimation!=getupfromfrontanim)||player[i].skeleton.free)&&((player[k].targetanimation!=getupfrombackanim&&player[k].targetanimation!=getupfromfrontanim)||player[k].skeleton.free)) - if(((((findLengthfast(&rotatetarget)>150&&(i!=0&&k!=0))||(findLengthfast(&rotatetarget)>50&&player[0].rabbitkickragdoll/*currentanimation==rabbitkickanim*/&&(i==0||k==0)))&&normaldotproduct(rotatetarget,player[k].coords-player[i].coords)>0)&&((i==0||k==0)||((player[i].skeleton.oldfree==1&&k!=0&&animation[player[k].currentanimation].attack==neutral)||(player[k].skeleton.oldfree==1&&i!=0&&animation[player[i].currentanimation].attack==neutral)||(player[i].isFlip()&&!player[i].skeleton.oldfree&&(i==0||k==0))||(player[k].isFlip()&&!player[k].skeleton.oldfree&&(i==0||k==0))||(i==0||k==0))))||((player[i].targetanimation==jumpupanim||player[i].targetanimation==jumpdownanim||player[i].isFlip())&&(player[k].targetanimation==jumpupanim||player[k].targetanimation==jumpdownanim||player[k].isFlip())&&(i==0||k==0)&&(!player[i].skeleton.oldfree&&!player[k].skeleton.oldfree))){ - //If hit by body - if((i!=0||player[i].skeleton.free)&&(k!=0||player[k].skeleton.free)||(animation[player[i].targetanimation].height==highheight&&animation[player[k].targetanimation].height==highheight)){ - if(tutoriallevel!=1){ - emit_sound_at(heavyimpactsound, player[i].coords); - } - //player[i].velocity=player[k].velocity; - //player[k].velocity=player[i].velocity; - - player[i].RagDoll(0); - if(player[i].damage>player[i].damagetolerance-findLengthfast(&rotatetarget)/4&&!player[i].dead){ - award_bonus(0, aimbonus); - } - player[i].DoDamage(findLengthfast(&rotatetarget)/4); - player[k].RagDoll(0); - if(player[k].damage>player[k].damagetolerance-findLengthfast(&rotatetarget)/4&&!player[k].dead){ - award_bonus(0, aimbonus); // Huh, again? - } - player[k].DoDamage(findLengthfast(&rotatetarget)/4); - - //if(player[i].skeleton.oldfree){ - for(j=0;jnumchallengelevels-1)targetlevel=0; - loading=1; - leveltime=5; - slomotogglekeydown=1; - } - static bool movekey; - static bool connected; - - for(int i=0;i.8)player[i].avoidcollided=0; - if(player[i].aitype!=playercontrolled&&indialogue==-1){ - player[i].jumpclimb=0; - //AI - if(editorenabled)player[i].stunned=1; - - player[i].pause=0; - //if(findDistancefastflat(&player[i].coords,&player[0].coords)<3/*&&player[0].coords.y>player[i].coords.y+.1*/)player[i].pause=1; - if(findDistancefastflat(&player[0].coords,&player[i].coords)<30&&player[0].coords.y>player[i].coords.y+2&&!player[0].onterrain)player[i].pause=1; - - /*if(player[i].aitype==passivetype&&player[i].numwaypoints<=1){ - player[i].forwardkeydown=0; - player[i].leftkeydown=0; - player[i].backkeydown=0; - player[i].rightkeydown=0; - player[i].crouchkeydown=0; - player[i].attackkeydown=0; - player[i].jumpkeydown=0; - player[i].throwkeydown=0; - }*/ - - if(player[i].aitype==pathfindtype){ - if(player[i].finalpathfindpoint==-1){ - float closestdistance; - float tempdist; - int closest; - XYZ colpoint; - closest=-1; - closestdistance=-1; - for(j=0;j.8&&!player[i].jumpkeydown&&player[i].collided<.8)player[i].targetrotation+=90*(player[i].whichdirection*2-1); - - if(player[i].collided<1||player[i].targetanimation!=jumpupanim)player[i].jumpkeydown=0; - if((player[i].collided>.8&&player[i].jumppower>=5))player[i].jumpkeydown=1; - - if((tutoriallevel!=1||cananger)&&hostile&&!player[0].dead&&findDistancefast(&player[i].coords,&player[0].coords)<400&&player[i].occluded<25){ - if(findDistancefast(&player[i].coords,&player[0].coords)<12&&animation[player[0].targetanimation].height!=lowheight&&!editorenabled&&(player[0].coords.y0) - if(player[j].coords.y.5){ - player[i].howactive=typeactive; - } - - if(player[i].aitype==passivetype){ - player[i].aiupdatedelay-=multiplier; - player[i].losupdatedelay-=multiplier; - player[i].lastseentime+=multiplier; - player[i].pausetime-=multiplier; - if(player[i].lastseentime>1)player[i].lastseentime=1; - - if(player[i].aiupdatedelay<0){ - if(player[i].numwaypoints>1&&player[i].howactive==typeactive&&player[i].pausetime<=0){ - rotatetarget=player[i].waypoints[player[i].waypoint]-player[i].coords; - Normalise(&rotatetarget); - player[i].targetrotation=-asin(0-rotatetarget.x); - player[i].targetrotation*=360/6.28; - if(rotatetarget.z<0)player[i].targetrotation=180-player[i].targetrotation; - player[i].lookrotation=player[i].targetrotation; - player[i].aiupdatedelay=.05; - - if(findDistancefastflat(&player[i].coords,&player[i].waypoints[player[i].waypoint])<1){ - if(player[i].waypointtype[player[i].waypoint]==wppause)player[i].pausetime=4; - player[i].waypoint++; - if(player[i].waypoint>player[i].numwaypoints-1)player[i].waypoint=0; - - } - } - - if(player[i].numwaypoints>1&&player[i].howactive==typeactive&&player[i].pausetime<=0)player[i].forwardkeydown=1; - else player[i].forwardkeydown=0; - player[i].leftkeydown=0; - player[i].backkeydown=0; - player[i].rightkeydown=0; - player[i].crouchkeydown=0; - player[i].attackkeydown=0; - player[i].throwkeydown=0; - - if(player[i].avoidcollided>.8&&!player[i].jumpkeydown&&player[i].collided<.8){ - if(!player[i].avoidsomething)player[i].targetrotation+=90*(player[i].whichdirection*2-1); - else{ - XYZ leftpos,rightpos; - float leftdist,rightdist; - leftpos = player[i].coords+DoRotation(player[i].facing,0,90,0); - rightpos = player[i].coords-DoRotation(player[i].facing,0,90,0); - leftdist = findDistancefast(&leftpos, &player[i].avoidwhere); - rightdist = findDistancefast(&rightpos, &player[i].avoidwhere); - if(leftdist.8&&player[i].jumppower>=5))player[i].jumpkeydown=1; - - - if(!editorenabled){ - if(player[i].howactive0&&(tutoriallevel!=1||cananger)&&hostile) - for(j=0;j0&&(tutoriallevel!=1||cananger)&&hostile) - for(j=0;j14) - if(findDistancefast(&player[i].coords,&envsound[j])<2*((envsoundvol[j]-14)+(envsoundvol[j]-14)*(player[i].creature==rabbittype)*3)){ - player[i].aitype=attacktypecutoff; - } - } - - if(player[i].aitype!=passivetype){ - if(player[i].howactive==typesleeping){ - player[i].targetanimation=getupfromfrontanim; - player[i].targetframe=0; - player[i].target=0; - } - - player[i].howactive=typeactive; - } - } - - if(player[i].howactive0)){ - if(j==0&&player[j].num_weapons>0){ - if(weapons.bloody[player[j].weaponids[0]])smelldistance=100; - if(player[j].num_weapons==2) - if(weapons.bloody[player[j].weaponids[1]])smelldistance=100; - } - if(j!=0){ - smelldistance=100; - } - windsmell=windvector; - Normalise(&windsmell); - windsmell=windsmell*2+player[j].coords; - if(findDistancefast(&player[i].coords,&windsmell)0) - if((-1==checkcollide(DoRotation(player[i].skeleton.joints[player[i].skeleton.jointlabels[head]].position,0,player[i].rotation,0)*player[i].scale+player[i].coords,DoRotation(player[j].skeleton.joints[player[j].skeleton.jointlabels[head]].position,0,player[j].rotation,0)*player[j].scale+player[j].coords)&&!player[j].isWallJump())||(player[j].targetanimation==hanganim&&normaldotproduct(player[j].facing,player[i].coords-player[j].coords)<0)){ - player[i].lastseentime-=.2; - if(j==0&&animation[player[j].targetanimation].height==lowheight)player[i].lastseentime-=.4; - else player[i].lastseentime-=.6; - } - if(player[i].lastseentime<=0){ - player[i].aitype=searchtype; - player[i].lastchecktime=12; - player[i].lastseen=player[j].coords; - player[i].lastseentime=12; - } - } - } - } - } - if(player[i].aitype==attacktypecutoff&&musictype!=2){ - if(player[i].creature!=wolftype){ - player[i].stunned=.6; - player[i].surprised=.6; - } - if(player[i].creature==wolftype){ - player[i].stunned=.47; - player[i].surprised=.47; - } - numseen++; - } - } - - if(player[i].aitype==searchtype){ - player[i].aiupdatedelay-=multiplier; - player[i].losupdatedelay-=multiplier; - if(!player[i].pause)player[i].lastseentime-=multiplier; - player[i].lastchecktime-=multiplier; - - if(player[i].isRun()&&!player[i].onground){ - if(player[i].coords.y>terrain.getHeight(player[i].coords.x,player[i].coords.z)+10){ - test2=player[i].coords+player[i].facing; - test2.y+=5; - test=player[i].coords+player[i].facing; - test.y-=10; - j=checkcollide(test2,test,player[i].laststanding); - if(j==-1)j=checkcollide(test2,test); - if(j==-1){ - player[i].velocity=0; - player[i].targetanimation=player[i].getStop(); - player[i].targetframe=0; - player[i].target=0; - player[i].targetrotation+=180; - player[i].stunned=.5; - //player[i].aitype=passivetype; - player[i].aitype=pathfindtype; - player[i].finalfinaltarget=player[i].waypoints[player[i].waypoint]; - player[i].finalpathfindpoint=-1; - player[i].targetpathfindpoint=-1; - player[i].lastpathfindpoint=-1; - player[i].lastpathfindpoint2=-1; - player[i].lastpathfindpoint3=-1; - player[i].lastpathfindpoint4=-1; - } - else player[i].laststanding=j; - } - } - if(player[i].aiupdatedelay<0){ - rotatetarget=player[i].lastseen-player[i].coords; - Normalise(&rotatetarget); - player[i].targetrotation=-asin(0-rotatetarget.x); - player[i].targetrotation*=360/6.28; - if(rotatetarget.z<0)player[i].targetrotation=180-player[i].targetrotation; - player[i].lookrotation=player[i].targetrotation; - player[i].aiupdatedelay=.05; - player[i].forwardkeydown=1; - - if(findDistancefastflat(&player[i].coords,&player[i].lastseen)<1*(player[i].scale*5)*(player[i].scale*5)||player[i].lastchecktime<0){ - player[i].forwardkeydown=0; - player[i].aiupdatedelay=1; - player[i].lastseen.x+=(float(Random()%100)-50)/25; - player[i].lastseen.z+=(float(Random()%100)-50)/25; - player[i].lastchecktime=3; - } - - player[i].leftkeydown=0; - player[i].backkeydown=0; - player[i].rightkeydown=0; - player[i].crouchkeydown=0; - player[i].attackkeydown=0; - player[i].throwkeydown=0; - - if(player[i].avoidcollided>.8&&!player[i].jumpkeydown&&player[i].collided<.8){ - if(!player[i].avoidsomething)player[i].targetrotation+=90*(player[i].whichdirection*2-1); - else{ - XYZ leftpos,rightpos; - float leftdist,rightdist; - leftpos = player[i].coords+DoRotation(player[i].facing,0,90,0); - rightpos = player[i].coords-DoRotation(player[i].facing,0,90,0); - leftdist = findDistancefast(&leftpos, &player[i].avoidwhere); - rightdist = findDistancefast(&rightpos, &player[i].avoidwhere); - if(leftdist.8&&player[i].jumppower>=5))player[i].jumpkeydown=1; - - if(numenvsounds>0&&((tutoriallevel!=1||cananger)&&hostile)) - for(j=0;j0) - if((-1==checkcollide(DoRotation(player[i].skeleton.joints[player[i].skeleton.jointlabels[head]].position,0,player[i].rotation,0)*player[i].scale+player[i].coords,DoRotation(player[0].skeleton.joints[player[0].skeleton.jointlabels[head]].position,0,player[0].rotation,0)*player[0].scale+player[0].coords))||(player[j].targetanimation==hanganim&&normaldotproduct(player[j].facing,player[i].coords-player[j].coords)<0)){ - player[i].aitype=attacktypecutoff; - player[i].lastseentime=1; - } - } - if(player[i].lastseentime<0){ - //player[i].aitype=passivetype; - numescaped++; - player[i].aitype=pathfindtype; - player[i].finalfinaltarget=player[i].waypoints[player[i].waypoint]; - player[i].finalpathfindpoint=-1; - player[i].targetpathfindpoint=-1; - player[i].lastpathfindpoint=-1; - player[i].lastpathfindpoint2=-1; - player[i].lastpathfindpoint3=-1; - player[i].lastpathfindpoint4=-1; - } - } - - if(player[i].aitype!=gethelptype){ - player[i].runninghowlong=0; - } - - if(player[i].aitype==gethelptype){ - player[i].runninghowlong+=multiplier; - player[i].aiupdatedelay-=multiplier; - - if(player[i].aiupdatedelay<0||player[i].ally==0){ - player[i].aiupdatedelay=.2; - - int closest; - float closestdist; - closest=-1; - closestdist=-1; - float distance; - - if(!player[i].ally){ - for(j=0;j0){ - rotatetarget=player[player[i].ally].coords-player[i].coords; - Normalise(&rotatetarget); - player[i].targetrotation=-asin(0-rotatetarget.x); - player[i].targetrotation*=360/6.28; - if(rotatetarget.z<0)player[i].targetrotation=180-player[i].targetrotation; - player[i].lookrotation=player[i].targetrotation; - player[i].aiupdatedelay=.05; - player[i].forwardkeydown=1; - - if(findDistancefastflat(&player[i].coords,&player[player[i].ally].coords)<3){ - player[i].aitype=searchtype; - player[i].lastseentime=12; - player[player[i].ally].aitype=searchtype; - if(player[player[i].ally].lastseentime.8&&!player[i].jumpkeydown&&player[i].collided<.8){ - if(!player[i].avoidsomething)player[i].targetrotation+=90*(player[i].whichdirection*2-1); - else{ - XYZ leftpos,rightpos; - float leftdist,rightdist; - leftpos = player[i].coords+DoRotation(player[i].facing,0,90,0); - rightpos = player[i].coords-DoRotation(player[i].facing,0,90,0); - leftdist = findDistancefast(&leftpos, &player[i].avoidwhere); - rightdist = findDistancefast(&rightpos, &player[i].avoidwhere); - if(leftdist.8&&player[i].jumppower>=5))player[i].jumpkeydown=1; - } - - if(player[i].aitype==getweapontype){ - player[i].aiupdatedelay-=multiplier; - player[i].lastchecktime-=multiplier; - - if(player[i].aiupdatedelay<0){ - player[i].aiupdatedelay=.2; - - int closest; - float closestdist; - closest=-1; - closestdist=-1; - float distance; - - if(player[i].ally<0){ - for(j=0;j=0){ - if(weapons.owner[player[i].ally]!=-1||findDistancefast(&player[i].coords,&weapons.position[player[i].ally])>16){ - player[i].aitype=attacktypecutoff; - player[i].lastseentime=1; - } - rotatetarget=weapons.position[player[i].ally]-player[i].coords; - Normalise(&rotatetarget); - player[i].targetrotation=-asin(0-rotatetarget.x); - player[i].targetrotation*=360/6.28; - if(rotatetarget.z<0)player[i].targetrotation=180-player[i].targetrotation; - player[i].lookrotation=player[i].targetrotation; - player[i].aiupdatedelay=.05; - player[i].forwardkeydown=1; - - - if(player[i].avoidcollided>.8&&!player[i].jumpkeydown&&player[i].collided<.8){ - if(!player[i].avoidsomething)player[i].targetrotation+=90*(player[i].whichdirection*2-1); - else{ - XYZ leftpos,rightpos; - float leftdist,rightdist; - leftpos = player[i].coords+DoRotation(player[i].facing,0,90,0); - rightpos = player[i].coords-DoRotation(player[i].facing,0,90,0); - leftdist = findDistancefast(&leftpos, &player[i].avoidwhere); - rightdist = findDistancefast(&rightpos, &player[i].avoidwhere); - if(leftdist.8&&player[i].jumppower>=5))player[i].jumpkeydown=1; - } - - if(player[i].aitype==attacktypecutoff){ - player[i].aiupdatedelay-=multiplier; - if(player[i].damage.5)player[i].stunned=1; - } - if(player[i].wentforweapon<3) - for(j=0;jterrain.getHeight(player[i].coords.x,player[i].coords.z)+10){ - test2=player[i].coords+player[i].facing; - test2.y+=5; - test=player[i].coords+player[i].facing; - test.y-=10; - j=checkcollide(test2,test,player[i].laststanding); - if(j==-1)j=checkcollide(test2,test); - if(j==-1){ - player[i].velocity=0; - player[i].targetanimation=player[i].getStop(); - player[i].targetframe=0; - player[i].target=0; - player[i].targetrotation+=180; - player[i].stunned=.5; - //player[i].aitype=passivetype; - player[i].aitype=pathfindtype; - player[i].finalfinaltarget=player[i].waypoints[player[i].waypoint]; - player[i].finalpathfindpoint=-1; - player[i].targetpathfindpoint=-1; - player[i].lastpathfindpoint=-1; - player[i].lastpathfindpoint2=-1; - player[i].lastpathfindpoint3=-1; - player[i].lastpathfindpoint4=-1; - } - else player[i].laststanding=j; - } - } - if(player[0].coords.y>player[i].coords.y+5&&animation[player[0].targetanimation].height!=highheight&&!player[0].onterrain){ - player[i].aitype=pathfindtype; - player[i].finalfinaltarget=player[i].waypoints[player[i].waypoint]; - player[i].finalpathfindpoint=-1; - player[i].targetpathfindpoint=-1; - player[i].lastpathfindpoint=-1; - player[i].lastpathfindpoint2=-1; - player[i].lastpathfindpoint3=-1; - player[i].lastpathfindpoint4=-1; - } - if(player[i].aiupdatedelay<0&&!animation[player[i].targetanimation].attack&&player[i].targetanimation!=staggerbackhighanim&&player[i].targetanimation!=staggerbackhardanim&&player[i].targetanimation!=backhandspringanim&&player[i].targetanimation!=dodgebackanim){ - if(player[i].weaponactive==-1&&player[i].num_weapons>0)player[i].drawkeydown=Random()%2; - else player[i].drawkeydown=0; - player[i].rabbitkickenabled=Random()%2; - rotatetarget=player[player[i].aitarget].coords+player[player[i].aitarget].velocity; - if(findDistancefast(&player[player[i].aitarget].coords,&player[i].coords)5&&(player[0].weaponactive==-1||player[i].weaponactive!=-1))player[i].forwardkeydown=1; - else if((findDistancefast(&player[i].coords,&player[0].coords)>16||findDistancefast(&player[i].coords,&player[0].coords)<9)&&player[0].weaponactive!=-1)player[i].forwardkeydown=1; - else if(Random()%6==0||(player[i].creature==wolftype&&Random()%3==0))player[i].forwardkeydown=1; - else player[i].forwardkeydown=0; - if(player[0].dead){ - player[i].forwardkeydown=0; - if(Random()%10==0)player[i].forwardkeydown=1; - if(Random()%100==0){ - player[i].aitype=pathfindtype; - player[i].finalfinaltarget=player[i].waypoints[player[i].waypoint]; - player[i].finalpathfindpoint=-1; - player[i].targetpathfindpoint=-1; - player[i].lastpathfindpoint=-1; - player[i].lastpathfindpoint2=-1; - player[i].lastpathfindpoint3=-1; - player[i].lastpathfindpoint4=-1; - } - } - player[i].leftkeydown=0; - player[i].backkeydown=0; - player[i].rightkeydown=0; - player[i].crouchkeydown=0; - player[i].throwkeydown=0; - - if(player[i].avoidcollided>.8&&!player[i].jumpkeydown&&player[i].collided<.8)player[i].targetrotation+=90*(player[i].whichdirection*2-1); - if(Random()%2==0/*||player[0].weaponactive!=-1*/||player[i].weaponactive!=-1||player[i].creature==wolftype)player[i].attackkeydown=1; - else player[i].attackkeydown=0; - if((player[i].isRun())&&Random()%6&&findDistancefast(&player[i].coords,&player[0].coords)>7)player[i].attackkeydown=0; - - if(player[i].aitype!=playercontrolled&&(player[i].isIdle()||player[i].isCrouch()||player[i].isRun())){ - target=-2; - for(j=0;jcoords)<4&&player[j].victim==&player[i]&&(player[j].targetanimation==sweepanim||player[j].targetanimation==spinkickanim||player[j].targetanimation==staffhitanim||player[j].targetanimation==staffspinhitanim||player[j].targetanimation==winduppunchanim||player[j].targetanimation==upunchanim||player[j].targetanimation==wolfslapanim||player[j].targetanimation==knifeslashstartanim||((player[j].targetanimation==swordslashanim)&&(findDistancefast(&player[j].coords,&player[i].coords)<2||(player[i].weaponactive!=-1))))){ - if(target>=0)target=-1; - else target=j; - } - } - } - if(target>=0)player[target].Reverse(); - } - - if(player[i].collided<1)player[i].jumpkeydown=0; - if((player[i].collided>.8&&player[i].jumppower>=5)||(findDistancefast(&player[i].coords,&player[0].coords)>400&&player[i].onterrain&&player[i].creature==rabbittype))player[i].jumpkeydown=1; - if(normaldotproduct(player[i].facing,player[0].coords-player[i].coords)>0) - player[0].jumpkeydown=0; - if(player[0].targetanimation==jumpdownanim&&findDistancefast(&player[0].coords,&player[i].coords)<40)player[i].crouchkeydown=1; - if(player[i].jumpkeydown)player[i].attackkeydown=0; - //if(animation[player[i].targetanimation].attack==reversed)player[i].crouchkeydown=1; - - if(tutoriallevel==1){ - if(!canattack)player[i].attackkeydown=0; - } - - - facing=player[i].coords; - flatfacing=player[0].coords; - facing.y+=player[i].skeleton.joints[player[i].skeleton.jointlabels[head]].position.y*player[i].scale; - flatfacing.y+=player[0].skeleton.joints[player[0].skeleton.jointlabels[head]].position.y*player[0].scale; - if(player[i].occluded>=2) - if(-1!=checkcollide(facing,flatfacing)){ - if(!player[i].pause)player[i].lastseentime-=.2; - if(player[i].lastseentime<=0&&(player[i].creature!=wolftype||player[i].weaponstuck==-1)){ - player[i].aitype=searchtype; - player[i].lastchecktime=12; - player[i].lastseen=player[0].coords; - player[i].lastseentime=12; - } - } - else player[i].lastseentime=1; - } - } - if(animation[player[0].targetanimation].height==highheight&&(player[i].aitype==attacktypecutoff||player[i].aitype==searchtype)){ - if(player[0].coords.y>terrain.getHeight(player[0].coords.x,player[0].coords.z)+10){ - test=player[0].coords; - test.y-=40; - if(-1==checkcollide(player[0].coords,test))player[i].stunned=1; - } - } - // NOTE: Ask about logic of this call : NOTE - if((player[i].aitype==passivetype && !(player[i].numwaypoints>1)) || - player[i].stunned>0 || - (player[i].pause && (player[i].damage > player[i].superpermanentdamage))) - { - if(/*player[i].aitype==attacktypecutoff&&*/player[i].pause)player[i].lastseentime=1; - player[i].targetrotation=player[i].rotation; - player[i].forwardkeydown=0; - player[i].leftkeydown=0; - player[i].backkeydown=0; - player[i].rightkeydown=0; - player[i].jumpkeydown=0; - player[i].attackkeydown=0; - player[i].crouchkeydown=0; - player[i].throwkeydown=0; - } - - - facing=0; - facing.z=-1; - - flatfacing=DoRotation(facing,0,player[i].rotation+180,0); - facing=flatfacing; - - if(player[i].aitype==attacktypecutoff){ - rotatetarget=player[0].coords-player[i].coords; - Normalise(&rotatetarget); - player[i].targetheadrotation=-asin(0-rotatetarget.x); - player[i].targetheadrotation*=360/6.28; - if(rotatetarget.z<0)player[i].targetheadrotation=180-player[i].targetheadrotation; - - player[i].targetheadrotation*=-1; - player[i].targetheadrotation+=180; - //player[i].targetheadrotation2=0; - player[i].targetheadrotation2=-asin(rotatetarget.y)*360/6.28; - } - else if(player[i].howactive>=typesleeping){ - player[i].targetheadrotation=player[i].targetrotation; - player[i].targetheadrotation2=0; - } - else { - if(player[i].interestdelay<=0){ - player[i].interestdelay=.7+(float)(abs(Random()%100))/100; - player[i].headtarget=player[i].coords; - player[i].headtarget.x+=(float)(abs(Random()%200)-100)/100; - player[i].headtarget.z+=(float)(abs(Random()%200)-100)/100; - player[i].headtarget.y+=(float)(abs(Random()%200)-100)/300; - player[i].headtarget+=player[i].facing*1.5; - } - rotatetarget=player[i].headtarget-player[i].coords; - Normalise(&rotatetarget); - player[i].targetheadrotation=-asin(0-rotatetarget.x); - player[i].targetheadrotation*=360/6.28; - if(rotatetarget.z<0)player[i].targetheadrotation=180-player[i].targetheadrotation; - - player[i].targetheadrotation*=-1; - player[i].targetheadrotation+=180; - player[i].targetheadrotation2=-asin(rotatetarget.y)*360/6.28; - } - //if(whichlevel==2)player[i].jumpkeydown=0; - } - if(animation[player[i].targetanimation].attack==reversed){ - //player[i].targetrotation=player[i].rotation; - player[i].forwardkeydown=0; - player[i].leftkeydown=0; - player[i].backkeydown=0; - player[i].rightkeydown=0; - player[i].jumpkeydown=0; - player[i].attackkeydown=0; - //player[i].crouchkeydown=0; - player[i].throwkeydown=0; - } - - if(indialogue!=-1){ - player[i].forwardkeydown=0; - player[i].leftkeydown=0; - player[i].backkeydown=0; - player[i].rightkeydown=0; - player[i].jumpkeydown=0; - player[i].crouchkeydown=0; - player[i].drawkeydown=0; - player[i].throwkeydown=0; - } - - if(player[i].collided<-.3)player[i].collided=-.3; - if(player[i].collided>1)player[i].collided=1; - player[i].collided-=multiplier*4; - player[i].whichdirectiondelay-=multiplier; - if(player[i].avoidcollided<-.3||player[i].whichdirectiondelay<=0){ - player[i].avoidcollided=-.3; - player[i].whichdirection=abs(Random()%2); - player[i].whichdirectiondelay=.4; - } - if(player[i].avoidcollided>1)player[i].avoidcollided=1; - player[i].avoidcollided-=multiplier/4; - if(!player[i].skeleton.free)player[i].stunned-=multiplier; - if(!player[i].skeleton.free)player[i].surprised-=multiplier; - if(player[i].surprised<=0&&player[i].aitype==attacktypecutoff&&i!=0&&!player[i].dead&&!player[i].skeleton.free&&animation[player[i].targetanimation].attack==neutral)numresponded=1; - - if(!player[i].throwkeydown){ - player[i].throwtogglekeydown=0; - } - if(player[i].throwkeydown&&!player[i].throwtogglekeydown){ - if(player[i].weaponactive==-1&&player[i].num_weapons<2&&(player[i].isIdle()||player[i].isCrouch()||player[i].targetanimation==sneakanim||player[i].targetanimation==rollanim||player[i].targetanimation==backhandspringanim||player[i].isFlip()||player[i].isFlip()||player[i].aitype!=playercontrolled)){ - for(j=0;jid)) - if(findDistancefastflat(&player[i].coords,&weapons.position[j])<2&&player[i].weaponactive==-1){ - if(findDistancefast(&player[i].coords,&weapons.position[j])<1||player[i].victim){ - if(weapons.type[j]!=staff) - emit_sound_at(knifedrawsound, player[i].coords, 128.); - - player[i].weaponactive=0; - weapons.owner[j]=player[i].id; - if(player[i].num_weapons>0){ - player[i].weaponids[player[i].num_weapons]=player[i].weaponids[0]; - } - player[i].num_weapons++; - player[i].weaponids[0]=j; - } - } - //} - } - } - else if ((player[i].isIdle()||player[i].isFlip()||player[i].aitype!=playercontrolled)&&findDistancefast(&player[i].coords,&weapons.position[j])<5&&player[i].coords.yid)) - if(findDistancefastflat(&player[i].coords,&weapons.position[k])<3&&player[i].weaponactive==-1){ - if(weapons.type[k]!=staff) - emit_sound_at(knifedrawsound, player[i].coords, 128.); - - player[i].weaponactive=0; - weapons.owner[k]=player[i].id; - if(player[i].num_weapons>0){ - player[i].weaponids[player[i].num_weapons]=player[i].weaponids[0]; - } - player[i].num_weapons++; - player[i].weaponids[0]=k; - } - } - } - } - } - } - if(player[i].isCrouch()||player[i].targetanimation==sneakanim||player[i].isRun()||player[i].isIdle()||player[i].targetanimation==rollanim||player[i].targetanimation==backhandspringanim){ - if(numplayers>1) - for(j=0;j0&&player[j].weaponstuckwhere==1))||player[j].weaponstuck==-1||player[j].num_weapons>1)){ - if(player[i].targetanimation!=rollanim&&player[i].targetanimation!=backhandspringanim){ - player[i].throwtogglekeydown=1; - player[i].victim=&player[j]; - player[i].hasvictim=1; - player[i].targetanimation=crouchremoveknifeanim; - player[i].target=0; - player[i].targetframe=0; - rotatetarget=player[j].coords-player[i].coords; - Normalise(&rotatetarget); - player[i].targetrotation=-asin(0-rotatetarget.x); - player[i].targetrotation*=360/6.28; - if(rotatetarget.z<0)player[i].targetrotation=180-player[i].targetrotation; - } - if(player[i].targetanimation==rollanim||player[i].targetanimation==backhandspringanim){ - player[i].throwtogglekeydown=1; - player[i].victim=&player[j]; - player[i].hasvictim=1; - int k = player[j].weaponids[0]; - if(player[i].hasvictim){ - bool fleshstuck; - fleshstuck=0; - if(player[i].victim->weaponstuck!=-1){ - if(player[i].victim->weaponids[player[i].victim->weaponstuck]==k){ - fleshstuck=1; - } - } - if(!fleshstuck){ - if(weapons.type[k]!=staff) - emit_sound_at(knifedrawsound, player[i].coords, 128.); - } - if(fleshstuck) - emit_sound_at(fleshstabremovesound, player[i].coords, 128.); - - player[i].weaponactive=0; - if(weapons.owner[k]!=-1){ - if(player[i].victim->num_weapons==1)player[i].victim->num_weapons=0; - else player[i].victim->num_weapons=1; - - player[i].victim->skeleton.longdead=0; - player[i].victim->skeleton.free=1; - player[i].victim->skeleton.broken=0; - - for(int l=0;lskeleton.num_joints;l++){ - player[i].victim->skeleton.joints[l].velchange=0; - player[i].victim->skeleton.joints[l].locked=0; - } - - XYZ relative; - relative=0; - relative.y=10; - Normalise(&relative); - XYZ footvel,footpoint; - footvel=0; - footpoint=weapons.position[k]; - if(player[i].victim->weaponstuck!=-1){ - if(player[i].victim->weaponids[player[i].victim->weaponstuck]==k){ - if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .8, .3); - weapons.bloody[k]=2; - weapons.blooddrip[k]=5; - player[i].victim->weaponstuck=-1; - player[i].victim->bloodloss+=2000; - player[i].victim->DoDamage(2000); - } - } - if(player[i].victim->num_weapons>0){ - if(player[i].victim->weaponstuck!=0&&player[i].victim->weaponstuck!=-1)player[i].victim->weaponstuck=0; - if(player[i].victim->weaponids[0]==k) - player[i].victim->weaponids[0]=player[i].victim->weaponids[player[i].victim->num_weapons]; - } - - player[i].victim->weaponactive=-1; - - player[i].victim->skeleton.joints[player[i].victim->skeleton.jointlabels[abdomen]].velocity+=relative*6; - player[i].victim->skeleton.joints[player[i].victim->skeleton.jointlabels[neck]].velocity+=relative*6; - player[i].victim->skeleton.joints[player[i].victim->skeleton.jointlabels[rightshoulder]].velocity+=relative*6; - player[i].victim->skeleton.joints[player[i].victim->skeleton.jointlabels[leftshoulder]].velocity+=relative*6; - } - weapons.owner[k]=i; - if(player[i].num_weapons>0){ - player[i].weaponids[player[i].num_weapons]=player[i].weaponids[0]; - } - player[i].num_weapons++; - player[i].weaponids[0]=k; - } - } - } - } - } - } - if(player[i].weaponactive!=-1&&player[i].aitype==playercontrolled){ - if(weapons.type[player[i].weaponids[0]]==knife){ - if(player[i].isIdle()||player[i].isRun()||player[i].isCrouch()||player[i].targetanimation==sneakanim||player[i].isFlip()) - if(numplayers>1) - for(j=0;j1.5&&!player[j].skeleton.free&&-1==checkcollide(DoRotation(player[j].skeleton.joints[player[j].skeleton.jointlabels[head]].position,0,player[j].rotation,0)*player[j].scale+player[j].coords,DoRotation(player[i].skeleton.joints[player[i].skeleton.jointlabels[head]].position,0,player[i].rotation,0)*player[i].scale+player[i].coords)){ - if(!player[i].isFlip()){ - player[i].throwtogglekeydown=1; - player[i].victim=&player[j]; - player[i].targetanimation=knifethrowanim; - player[i].target=0; - player[i].targetframe=0; - rotatetarget=player[j].coords-player[i].coords; - Normalise(&rotatetarget); - player[i].targetrotation=-asin(0-rotatetarget.x); - player[i].targetrotation*=360/6.28; - if(rotatetarget.z<0)player[i].targetrotation=180-player[i].targetrotation; - - player[i].targettilt2=-asin(rotatetarget.y)*360/6.28; - } - if(player[i].isFlip()){ - if(player[i].weaponactive!=-1){ - player[i].throwtogglekeydown=1; - player[i].victim=&player[j]; - XYZ aim; - weapons.owner[player[i].weaponids[0]]=-1; - aim=player[i].victim->coords+DoRotation(player[i].victim->skeleton.joints[player[i].victim->skeleton.jointlabels[abdomen]].position,0,player[i].victim->rotation,0)*player[i].victim->scale+player[i].victim->velocity*findDistance(&player[i].victim->coords,&player[i].coords)/50-(player[i].coords+DoRotation(player[i].skeleton.joints[player[i].skeleton.jointlabels[righthand]].position,0,player[i].rotation,0)*player[i].scale); - Normalise(&aim); - - aim=DoRotation(aim,(float)abs(Random()%30)-15,(float)abs(Random()%30)-15,0); - - weapons.velocity[player[i].weaponids[0]]=aim*50; - weapons.tipvelocity[player[i].weaponids[0]]=aim*50; - weapons.missed[player[i].weaponids[0]]=0; - weapons.freetime[player[i].weaponids[0]]=0; - weapons.firstfree[player[i].weaponids[0]]=1; - weapons.physics[player[i].weaponids[0]]=0; - player[i].num_weapons--; - if(player[i].num_weapons){ - player[i].weaponids[0]=player[i].weaponids[player[i].num_weapons]; - } - player[i].weaponactive=-1; - } - } - } - } - } - } - if(player[i].weaponactive!=-1&&player[i].aitype==playercontrolled){ - if(player[i].isCrouch()||player[i].targetanimation==sneakanim) - { - player[i].throwtogglekeydown=1; - weapons.owner[player[i].weaponids[0]]=-1; - weapons.velocity[player[i].weaponids[0]]=player[i].velocity*.2; - if(weapons.velocity[player[i].weaponids[0]].x==0)weapons.velocity[player[i].weaponids[0]].x=.1; - weapons.tipvelocity[player[i].weaponids[0]]=weapons.velocity[player[i].weaponids[0]]; - weapons.missed[player[i].weaponids[0]]=1; - weapons.freetime[player[i].weaponids[0]]=0; - weapons.firstfree[player[i].weaponids[0]]=1; - weapons.physics[player[i].weaponids[0]]=1; - player[i].num_weapons--; - if(player[i].num_weapons){ - player[i].weaponids[0]=player[i].weaponids[player[i].num_weapons]; - if(player[i].weaponstuck==player[i].num_weapons)player[i].weaponstuck=0; - } - - player[i].weaponactive=-1; - for(j=0;j1) - for(j=0;j1) - for(j=0;jcoords)<3&&player[j].victim==&player[i]&&(player[j].targetanimation==sweepanim||player[j].targetanimation==upunchanim||player[j].targetanimation==wolfslapanim||((player[j].targetanimation==swordslashanim||player[j].targetanimation==knifeslashstartanim||player[j].targetanimation==staffhitanim||player[j].targetanimation==staffspinhitanim)&&findDistancefast(&player[j].coords,&player[i].coords)<2))){ - if(target>=0)target=-1; - else target=j; - } - } - } - if(target>=0)player[target].Reverse(); - player[i].lowreversaldelay=.5; - - if(player[i].isIdle()){ - player[i].targetanimation=player[i].getCrouch(); - player[i].target=0; - player[i].targetframe=0; - player[i].transspeed=10; - } - if(player[i].isRun()||(player[i].isStop()&&(player[i].leftkeydown||player[i].rightkeydown||player[i].forwardkeydown||player[i].backkeydown))){ - player[i].targetanimation=rollanim; - player[i].target=0; - player[i].targetframe=0; - player[i].transspeed=20; - } - } - if(!player[i].crouchkeydown){ - //Uncrouch - if(!player[i].isRun()&&player[i].targetanimation!=sneakanim&&i==0)player[i].superruntoggle=0; - target=-2; - if(player[i].isCrouch()){ - if(numplayers>1) - for(j=0;jcoords)<3&&player[j].victim==&player[i]&&(player[j].targetanimation==spinkickanim)&&player[i].isCrouch()){ - if(target>=0)target=-1; - else target=j; - } - } - } - if(target>=0)player[target].Reverse(); - player[i].highreversaldelay=.5; - - if(player[i].isCrouch()){ - if(!player[i].wasCrouch()){ - player[i].currentanimation=player[i].getCrouch(); - player[i].currentframe=0; - } - player[i].target=0; - player[i].targetanimation=player[i].getIdle(); - player[i].targetframe=0; - player[i].transspeed=10; - } - } - if(player[i].targetanimation==sneakanim){ - player[i].targetanimation=player[i].getIdle(); - player[i].target=0; - player[i].targetframe=0; - player[i].transspeed=10; - } - } - if(player[i].forwardkeydown){ - if(player[i].isIdle()||(player[i].isStop()&&player[i].targetrotation==player[i].rotation)||(player[i].isLanding()&&player[i].targetframe>0&&!player[i].jumpkeydown)||(player[i].isLandhard()&&player[i].targetframe>0&&!player[i].jumpkeydown&&player[i].crouchkeydown)){ - if(player[i].aitype==passivetype)player[i].targetanimation=walkanim; - else player[i].targetanimation=player[i].getRun(); - player[i].target=0; - player[i].targetframe=0; - } - if(player[i].isCrouch()){ - player[i].targetanimation=sneakanim; - if(player[i].wasCrouch())player[i].target=0; - player[i].targetframe=0; - } - if(player[i].targetanimation==hanganim/*&&(!player[i].forwardstogglekeydown||player[i].aitype!=playercontrolled)*/){ - player[i].targetanimation=climbanim; - player[i].target=0; - player[i].targetframe=1; - player[i].jumpclimb=1; - } - if(player[i].targetanimation==jumpupanim||player[i].targetanimation==jumpdownanim||player[i].isFlip()){ - player[i].velocity+=absflatfacing*5*multiplier; - } - player[i].forwardstogglekeydown=1; - movekey=1; - } - if (player[i].rightkeydown){ - if(player[i].isIdle()||(player[i].isStop()&&player[i].targetrotation==player[i].rotation)||(player[i].isLanding()&&player[i].targetframe>0&&!player[i].jumpkeydown)||(player[i].isLandhard()&&player[i].targetframe>0&&!player[i].jumpkeydown&&player[i].crouchkeydown)){ - player[i].targetanimation=player[i].getRun(); - player[i].target=0; - player[i].targetframe=0; - } - if(player[i].isCrouch()){ - player[i].targetanimation=sneakanim; - if(player[i].wasCrouch()) player[i].target=0; - player[i].targetframe=0; - } - if(player[i].targetanimation==jumpupanim||player[i].targetanimation==jumpdownanim||player[i].isFlip()){ - player[i].velocity+=DoRotation(absflatfacing*5*multiplier,0,-90,0); - } - player[i].targetrotation-=90; - if(player[i].forwardkeydown)player[i].targetrotation+=45; - if(player[i].backkeydown)player[i].targetrotation-=45; - movekey=1; - } - if ( player[i].leftkeydown){ - if(player[i].isIdle()||(player[i].isStop()&&player[i].targetrotation==player[i].rotation)||(player[i].isLanding()&&player[i].targetframe>0&&!player[i].jumpkeydown)||(player[i].isLandhard()&&player[i].targetframe>0&&!player[i].jumpkeydown&&player[i].crouchkeydown)){ - player[i].targetanimation=player[i].getRun(); - player[i].target=0; - player[i].targetframe=0; - } - if(player[i].isCrouch()){ - player[i].targetanimation=sneakanim; - if(player[i].wasCrouch())player[i].target=0; - player[i].targetframe=0; - } - if(player[i].targetanimation==jumpupanim||player[i].targetanimation==jumpdownanim||player[i].isFlip()){ - player[i].velocity-=DoRotation(absflatfacing*5*multiplier,0,-90,0); - } - player[i].targetrotation+=90; - if(player[i].forwardkeydown)player[i].targetrotation-=45; - if(player[i].backkeydown)player[i].targetrotation+=45; - movekey=1; - } - if(player[i].backkeydown){ - if(player[i].isIdle()||(player[i].isStop()&&player[i].targetrotation==player[i].rotation)||(player[i].isLanding()&&player[i].targetframe>0&&!player[i].jumpkeydown)||(player[i].isLandhard()&&player[i].targetframe>0&&!player[i].jumpkeydown&&player[i].crouchkeydown)){ - player[i].targetanimation=player[i].getRun(); - player[i].target=0; - player[i].targetframe=0; - } - if(player[i].isCrouch()){ - player[i].targetanimation=sneakanim; - if(player[i].wasCrouch())player[i].target=0; - player[i].targetframe=0; - } - if(player[i].targetanimation==jumpupanim||player[i].targetanimation==jumpdownanim||player[i].isFlip()){ - player[i].velocity-=absflatfacing*5*multiplier; - } - if(player[i].targetanimation==hanganim){ - player[i].currentanimation=jumpdownanim; - player[i].targetanimation=jumpdownanim; - player[i].target=0; - player[i].currentframe=0; - player[i].targetframe=1; - player[i].velocity=0; - player[i].velocity.y+=gravity; - player[i].coords.y-=1.4; - player[i].grabdelay=1; - } - if ( !player[i].leftkeydown&&!player[i].rightkeydown) - player[i].targetrotation+=180; - movekey=1; - } - if((player[i].jumpkeydown&&!player[i].jumpclimb)||player[i].jumpstart){ - if((((player[i].isLanding()&&player[i].targetframe>=3)||player[i].isRun()||player[i].targetanimation==walkanim||player[i].isCrouch()||player[i].targetanimation==sneakanim)&&player[i].jumppower>1)&&((player[i].targetanimation!=rabbitrunninganim&&player[i].targetanimation!=wolfrunninganim)||i!=0)){ - player[i].jumpstart=0; - player[i].targetanimation=jumpupanim; - player[i].target=0; - player[i].targetframe=0; - player[i].rotation=player[i].targetrotation; - player[i].transspeed=20; - player[i].FootLand(0,1); - player[i].FootLand(1,1); - - facing=0; - facing.z=-1; - flatfacing=DoRotation(facing,0,player[i].targetrotation+180,0); - - if(movekey)player[i].velocity=flatfacing*player[i].speed*45*player[i].scale; - if(!movekey)player[i].velocity=0; - - //Dodge sweep? - target=-2; - if(numplayers>1) - for(j=0;jcoords)<3&&player[j].victim==&player[i]&&(player[j].targetanimation==sweepanim)){ - if(target>=0)target=-1; - else target=j; - } - } - } - if(target>=0)player[i].velocity.y=1; - else if(player[i].crouchkeydown||player[i].aitype!=playercontrolled){ - player[i].velocity.y=7; - player[i].crouchtogglekeydown=1; - } - else player[i].velocity.y=5; - - if(mousejump&&i==0&&debugmode){ - if(!player[i].isLanding())player[i].tempdeltav=deltav; - if(player[i].tempdeltav<0)player[i].velocity.y-=(float)(player[i].tempdeltav)/multiplier/1000; - } - - player[i].coords.y+=.2; - player[i].jumppower-=1; - - if (!i) - emit_sound_at(whooshsound, player[i].coords, 128.); - - emit_sound_at(jumpsound, player[i].coords, 128.); - } - if((player[i].isIdle())&&player[i].jumppower>1){ - player[i].targetanimation=player[i].getLanding(); - player[i].landhard=0; - player[i].target=0; - player[i].targetframe=2; - player[i].jumpstart=1; - player[i].tempdeltav=deltav; - } - if(player[i].targetanimation==jumpupanim&&(((!floatjump&&!editorenabled)||!debugmode)||player[i].aitype!=playercontrolled)){ - if(player[i].jumppower>multiplier*6){ - player[i].velocity.y+=multiplier*6; - player[i].jumppower-=multiplier*6; - } - if(player[i].jumppower<=multiplier*6){ - player[i].velocity.y+=player[i].jumppower; - player[i].jumppower=0; - } - } - if(((floatjump||editorenabled)&&debugmode)&&i==0)player[i].velocity.y+=multiplier*30; - } - - if(!movekey){ - if(player[i].isRun()||player[i].targetanimation==walkanim){ - player[i].targetanimation=player[i].getStop(); - player[i].target=0; - player[i].targetframe=0; - } - if(player[i].targetanimation==sneakanim){ - player[i].targetanimation=player[i].getCrouch(); - if(player[i].currentanimation==sneakanim)player[i].target=0; - player[i].targetframe=0; - } - } - if(player[i].targetanimation==walkanim&&(player[i].aitype==attacktypecutoff||player[i].aitype==searchtype||(player[i].aitype==passivetype&&player[i].numwaypoints<=1))){ - player[i].targetanimation=player[i].getStop(); - player[i].target=0; - player[i].targetframe=0; - } - if(player[i].isRun()&&(player[i].aitype==passivetype)){ - player[i].targetanimation=player[i].getStop(); - player[i].target=0; - player[i].targetframe=0; - } - } - } - if(player[i].targetanimation==rollanim)player[i].targetrotation=oldtargetrotation; - } - - //Rotation - for(k=0;k180){ - if(player[k].rotation>player[k].targetrotation)player[k].rotation-=360; - else player[k].rotation+=360; - } - - if(abs(player[k].rotation-player[k].targetrotation)>90&&(player[k].isRun()||player[k].targetanimation==walkanim)){ - player[k].targetanimation=player[k].getStop(); - player[k].targetframe=0; - player[k].target=0; - } - - if(player[k].targetanimation==backhandspringanim||player[k].targetanimation==dodgebackanim){ - player[k].targettilt=0; - } - if(player[k].targetanimation!=jumpupanim&&player[k].targetanimation!=backhandspringanim&&player[k].targetanimation!=jumpdownanim&&!player[k].isFlip()){ - player[k].targettilt=0; - if(player[k].jumppower<0&&!player[k].jumpkeydown)player[k].jumppower=0; - player[k].jumppower+=multiplier*7; - if(player[k].isCrouch())player[k].jumppower+=multiplier*7; - //*(1-(player[k].damage/player[k].damagetolerance)) - if(player[k].jumppower>5)player[k].jumppower=5; - } - - if(player[k].isRun()){ - player[k].targettilt=(player[k].rotation-player[k].targetrotation)/4; - } - - if(abs(player[k].tilt-player[k].targettilt)player[k].targettilt){ - player[k].tilt-=multiplier*150; - } - else if(player[k].tilt=0;j--){ - envsoundlife[j]-=multiplier; - if(envsoundlife[j]<0){ - numenvsounds--; - envsoundlife[j]=envsoundlife[numenvsounds]; - envsound[j]=envsound[numenvsounds]; - } - } - if(slomo) OPENAL_SetFrequency(OPENAL_ALL, slomofreq); - else OPENAL_SetFrequency(OPENAL_ALL, 22050); - - if(tutoriallevel==1){ - XYZ temp; - XYZ temp2; - XYZ temp3; - XYZ oldtemp; - XYZ oldtemp2; - temp.x=1011; - temp.y=84; - temp.z=491; - temp2.x=1025; - temp2.y=75; - temp2.z=447; - temp3.x=1038; - temp3.y=76; - temp3.z=453; - oldtemp=temp; - oldtemp2=temp2; - if(tutorialstage>=51) - if(findDistancefast(&temp,&player[0].coords)>=findDistancefast(&temp,&temp2)-1||findDistancefast(&temp3,&player[0].coords)<4){ - OPENAL_StopSound(OPENAL_ALL); // hack...OpenAL renderer isn't stopping music after tutorial goes to level menu... - OPENAL_SetFrequency(OPENAL_ALL, 0.001); - - emit_stream_np(stream_music3); - - gameon=0; - mainmenu=5; - - fireSound(); - - flash(); - } - if(tutorialstage<51) - if(findDistancefast(&temp,&player[0].coords)>=findDistancefast(&temp,&temp2)-1||findDistancefast(&temp3,&player[0].coords)<4){ - emit_sound_at(fireendsound, player[0].coords); - - player[0].coords=(oldtemp+oldtemp2)/2; - - flash(); - } - if(tutorialstage>=14&&tutorialstage<50) - if(findDistancefast(&temp,&player[1].coords)>=findDistancefast(&temp,&temp2)-1||findDistancefast(&temp3,&player[1].coords)<4){ - emit_sound_at(fireendsound, player[1].coords); - - for(int i=0;i49){ + realdialoguetype=dialoguetype[i]-50; + special=1; + } + else if(dialoguetype[i]>39){ + realdialoguetype=dialoguetype[i]-40; + special=1; + } + else if(dialoguetype[i]>29){ + realdialoguetype=dialoguetype[i]-30; + special=1; + } + else if(dialoguetype[i]>19){ + realdialoguetype=dialoguetype[i]-20; + special=1; + } + else if(dialoguetype[i]>9){ + realdialoguetype=dialoguetype[i]-10; + special=1; + } + else { + realdialoguetype=dialoguetype[i]; + special=0; + } + if((!hostile||dialoguetype[i]>40&&dialoguetype[i]<50)&& + realdialoguetype0&& + (dialoguegonethrough[i]==0||!special)&& + (special||Input::isKeyPressed(attackkey))){ + if(findDistancefast(&player[0].coords,&player[realdialoguetype].coords)<6|| + player[realdialoguetype].howactive>=typedead1|| + dialoguetype[i]>40&&dialoguetype[i]<50){ + whichdialogue=i; + for(int j=0;j0){ + hotspot[i]=player[hotspottype[i]].coords; + } + } + } + + //Tutorial + if(tutoriallevel){ + doTutorial(); + } + + //bonuses + if(tutoriallevel!=1){ + if(bonustime==0&& + bonus!=solidhit&& + bonus!=spinecrusher&& + bonus!=tracheotomy&& + bonus!=backstab&& + bonusvalue>10){ + emit_sound_np(consolesuccesssound); + } + } else if(bonustime==0){ + emit_sound_np(fireendsound); + } + if(bonustime==0){ + if(bonus!=solidhit&& + bonus!=twoxcombo&& + bonus!=threexcombo&& + bonus!=fourxcombo&& + bonus!=megacombo) + bonusnum[bonus]++; + else + bonusnum[bonus]+=0.15; + if(tutoriallevel) + bonusvalue=0; + bonusvalue/=bonusnum[bonus]; + bonustotal+=bonusvalue; + } + bonustime+=multiplier; + + //snow effects + if(environment==snowyenvironment){ + precipdelay-=multiplier; + while(precipdelay<0){ + precipdelay+=.04; + if(!detail) + precipdelay+=.04; + XYZ footvel,footpoint; + + footvel=0; + footpoint=viewer+viewerfacing*6; + footpoint.y+=((float)abs(Random()%1200))/100-6; + footpoint.x+=((float)abs(Random()%1200))/100-6; + footpoint.z+=((float)abs(Random()%1200))/100-6; + Sprite::MakeSprite(snowsprite, footpoint,footvel, 1,1,1, .1, 1); + } + } + + + doAerialAcrobatics(); + + + static XYZ oldviewer; + + //control keys + if(indialogue==-1){ + player[0].forwardkeydown=Input::isKeyDown(forwardkey); + player[0].leftkeydown=Input::isKeyDown(leftkey); + player[0].backkeydown=Input::isKeyDown(backkey); + player[0].rightkeydown=Input::isKeyDown(rightkey); + player[0].jumpkeydown=Input::isKeyDown(jumpkey); + player[0].crouchkeydown=Input::isKeyDown(crouchkey); + player[0].drawkeydown=Input::isKeyDown(drawkey); + player[0].throwkeydown=Input::isKeyDown(throwkey); + } + else + { + player[0].forwardkeydown=0; + player[0].leftkeydown=0; + player[0].backkeydown=0; + player[0].rightkeydown=0; + player[0].jumpkeydown=0; + player[0].crouchkeydown=0; + player[0].drawkeydown=0; + player[0].throwkeydown=0; + } + + if(!player[0].jumpkeydown) + player[0].jumpclimb=0; + + + if(indialogue!=-1){ + cameramode=1; + if(directing){ + facing=0; + facing.z=-1; + + facing=DoRotation(facing,-rotation2,0,0); + facing=DoRotation(facing,0,0-rotation,0); + + flatfacing=0; + flatfacing.z=-1; + + flatfacing=DoRotation(flatfacing,0,-rotation,0); + + if(Input::isKeyDown(forwardkey)) + viewer+=facing*multiplier*4; + if(Input::isKeyDown(backkey)) + viewer-=facing*multiplier*4; + if(Input::isKeyDown(leftkey)) + viewer+=DoRotation(flatfacing*multiplier,0,90,0)*4; + if(Input::isKeyDown(rightkey)) + viewer+=DoRotation(flatfacing*multiplier,0,-90,0)*4; + if(Input::isKeyDown(jumpkey)) + viewer.y+=multiplier*4; + if(Input::isKeyDown(crouchkey)) + viewer.y-=multiplier*4; + if( Input::isKeyPressed(SDLK_1)|| + Input::isKeyPressed(SDLK_2)|| + Input::isKeyPressed(SDLK_3)|| + Input::isKeyPressed(SDLK_4)|| + Input::isKeyPressed(SDLK_5)|| + Input::isKeyPressed(SDLK_6)|| + Input::isKeyPressed(SDLK_7)|| + Input::isKeyPressed(SDLK_8)|| + Input::isKeyPressed(SDLK_9)|| + Input::isKeyPressed(SDLK_0)|| + Input::isKeyPressed(SDLK_MINUS)){ + int whichend; + if(Input::isKeyPressed(SDLK_1))whichend=1; + if(Input::isKeyPressed(SDLK_2))whichend=2; + if(Input::isKeyPressed(SDLK_3))whichend=3; + if(Input::isKeyPressed(SDLK_4))whichend=4; + if(Input::isKeyPressed(SDLK_5))whichend=5; + if(Input::isKeyPressed(SDLK_6))whichend=6; + if(Input::isKeyPressed(SDLK_7))whichend=7; + if(Input::isKeyPressed(SDLK_8))whichend=8; + if(Input::isKeyPressed(SDLK_9))whichend=9; + if(Input::isKeyPressed(SDLK_0))whichend=0; + if(Input::isKeyPressed(SDLK_MINUS)) + whichend=-1; + if(whichend!=-1){ + participantfocus[whichdialogue][indialogue]=whichend; + participantlocation[whichdialogue][whichend]=player[whichend].coords; + participantrotation[whichdialogue][whichend]=player[whichend].rotation; + } + if(whichend==-1){ + participantfocus[whichdialogue][indialogue]=-1; + } + if(player[participantfocus[whichdialogue][indialogue]].dead){ + indialogue=-1; + directing=0; + cameramode=0; + } + dialoguecamera[whichdialogue][indialogue]=viewer; + dialoguecamerarotation[whichdialogue][indialogue]=rotation; + dialoguecamerarotation2[whichdialogue][indialogue]=rotation2; + indialogue++; + if(indialogue=numdialogueboxes[whichdialogue]){ + indialogue=-1; + directing=0; + cameramode=0; + } + } + if(!directing){ + pause_sound(whooshsound); + viewer=dialoguecamera[whichdialogue][indialogue]; + viewer.y=max((double)viewer.y,terrain.getHeight(viewer.x,viewer.z)+.1); + rotation=dialoguecamerarotation[whichdialogue][indialogue]; + rotation2=dialoguecamerarotation2[whichdialogue][indialogue]; + if(dialoguetime>0.5) + if( Input::isKeyPressed(SDLK_1)|| + Input::isKeyPressed(SDLK_2)|| + Input::isKeyPressed(SDLK_3)|| + Input::isKeyPressed(SDLK_4)|| + Input::isKeyPressed(SDLK_5)|| + Input::isKeyPressed(SDLK_6)|| + Input::isKeyPressed(SDLK_7)|| + Input::isKeyPressed(SDLK_8)|| + Input::isKeyPressed(SDLK_9)|| + Input::isKeyPressed(SDLK_0)|| + Input::isKeyPressed(SDLK_MINUS)|| + Input::isKeyPressed(attackkey)){ + indialogue++; + if(indialogue=numdialogueboxes[whichdialogue]){ + indialogue=-1; + directing=0; + cameramode=0; + if(dialoguetype[whichdialogue]>19&&dialoguetype[whichdialogue]<30){ + hostile=1; + } + if(dialoguetype[whichdialogue]>29&&dialoguetype[whichdialogue]<40){ + windialogue=1; + } + if(dialoguetype[whichdialogue]>49&&dialoguetype[whichdialogue]<60){ + hostile=1; + for(int i=1;i.8) + player[i].avoidcollided=0; + + doAI(i); + + if(animation[player[i].targetanimation].attack==reversed){ + //player[i].targetrotation=player[i].rotation; + player[i].forwardkeydown=0; + player[i].leftkeydown=0; + player[i].backkeydown=0; + player[i].rightkeydown=0; + player[i].jumpkeydown=0; + player[i].attackkeydown=0; + //player[i].crouchkeydown=0; + player[i].throwkeydown=0; + } + + if(indialogue!=-1){ + player[i].forwardkeydown=0; + player[i].leftkeydown=0; + player[i].backkeydown=0; + player[i].rightkeydown=0; + player[i].jumpkeydown=0; + player[i].crouchkeydown=0; + player[i].drawkeydown=0; + player[i].throwkeydown=0; + } + + if(player[i].collided<-.3) + player[i].collided=-.3; + if(player[i].collided>1) + player[i].collided=1; + player[i].collided-=multiplier*4; + player[i].whichdirectiondelay-=multiplier; + if(player[i].avoidcollided<-.3||player[i].whichdirectiondelay<=0){ + player[i].avoidcollided=-.3; + player[i].whichdirection=abs(Random()%2); + player[i].whichdirectiondelay=.4; + } + if(player[i].avoidcollided>1) + player[i].avoidcollided=1; + player[i].avoidcollided-=multiplier/4; + if(!player[i].skeleton.free){ + player[i].stunned-=multiplier; + player[i].surprised-=multiplier; + } + if(i!=0&&player[i].surprised<=0&& + player[i].aitype==attacktypecutoff&& + !player[i].dead&& + !player[i].skeleton.free&& + animation[player[i].targetanimation].attack==neutral) + numresponded=1; + + if(!player[i].throwkeydown) + player[i].throwtogglekeydown=0; + + //pick up weapon + if(player[i].throwkeydown&&!player[i].throwtogglekeydown){ + if(player[i].weaponactive==-1&& + player[i].num_weapons<2&& + (player[i].isIdle()|| + player[i].isCrouch()|| + player[i].targetanimation==sneakanim|| + player[i].targetanimation==rollanim|| + player[i].targetanimation==backhandspringanim|| + player[i].isFlip()|| + player[i].isFlip()|| + player[i].aitype!=playercontrolled)){ + for(int j=0;jid) + if(findDistancefastflat(&player[i].coords,&weapons.position[j])<2&&player[i].weaponactive==-1) + if(findDistancefast(&player[i].coords,&weapons.position[j])<1||player[i].victim){ + if(weapons.type[j]!=staff) + emit_sound_at(knifedrawsound, player[i].coords, 128.); + + player[i].weaponactive=0; + weapons.owner[j]=player[i].id; + if(player[i].num_weapons>0) + player[i].weaponids[player[i].num_weapons]=player[i].weaponids[0]; + player[i].num_weapons++; + player[i].weaponids[0]=j; + } + } + }else if((player[i].isIdle()|| + player[i].isFlip()|| + player[i].aitype!=playercontrolled)&& + findDistancefast(&player[i].coords,&weapons.position[j])<5&& + player[i].coords.yid) + if(findDistancefastflat(&player[i].coords,&weapons.position[k])<3&& + player[i].weaponactive==-1){ + if(weapons.type[k]!=staff) + emit_sound_at(knifedrawsound, player[i].coords, 128.); + + player[i].weaponactive=0; + weapons.owner[k]=player[i].id; + if(player[i].num_weapons>0) + player[i].weaponids[player[i].num_weapons]=player[i].weaponids[0]; + player[i].num_weapons++; + player[i].weaponids[0]=k; + } + } + } + } + } + } + if(player[i].isCrouch()|| + player[i].targetanimation==sneakanim|| + player[i].isRun()|| + player[i].isIdle()||player[i].targetanimation==rollanim|| + player[i].targetanimation==backhandspringanim){ + if(numplayers>1) + for(int j=0;j0&& + player[j].weaponstuckwhere==1))|| + player[j].weaponstuck==-1|| + player[j].num_weapons>1)){ + if(player[i].targetanimation!=rollanim&&player[i].targetanimation!=backhandspringanim){ + player[i].throwtogglekeydown=1; + player[i].victim=&player[j]; + player[i].hasvictim=1; + setAnimation(i,crouchremoveknifeanim); + player[i].targetrotation=roughDirectionTo(player[i].coords,player[j].coords); + } + if(player[i].targetanimation==rollanim||player[i].targetanimation==backhandspringanim){ + player[i].throwtogglekeydown=1; + player[i].victim=&player[j]; + player[i].hasvictim=1; + int k = player[j].weaponids[0]; + if(player[i].hasvictim){ + bool fleshstuck; + fleshstuck=0; + if(player[i].victim->weaponstuck!=-1){ + if(player[i].victim->weaponids[player[i].victim->weaponstuck]==k){ + fleshstuck=1; + } + } + if(!fleshstuck){ + if(weapons.type[k]!=staff) + emit_sound_at(knifedrawsound, player[i].coords, 128.); + } + if(fleshstuck) + emit_sound_at(fleshstabremovesound, player[i].coords, 128.); + + player[i].weaponactive=0; + if(weapons.owner[k]!=-1){ + if(player[i].victim->num_weapons==1)player[i].victim->num_weapons=0; + else player[i].victim->num_weapons=1; + + player[i].victim->skeleton.longdead=0; + player[i].victim->skeleton.free=1; + player[i].victim->skeleton.broken=0; + + for(int l=0;lskeleton.num_joints;l++){ + player[i].victim->skeleton.joints[l].velchange=0; + player[i].victim->skeleton.joints[l].locked=0; + } + + XYZ relative; + relative=0; + relative.y=10; + Normalise(&relative); + XYZ footvel,footpoint; + footvel=0; + footpoint=weapons.position[k]; + if(player[i].victim->weaponstuck!=-1){ + if(player[i].victim->weaponids[player[i].victim->weaponstuck]==k){ + if(bloodtoggle)Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .8, .3); + weapons.bloody[k]=2; + weapons.blooddrip[k]=5; + player[i].victim->weaponstuck=-1; + player[i].victim->bloodloss+=2000; + player[i].victim->DoDamage(2000); + } + } + if(player[i].victim->num_weapons>0){ + if(player[i].victim->weaponstuck!=0&&player[i].victim->weaponstuck!=-1)player[i].victim->weaponstuck=0; + if(player[i].victim->weaponids[0]==k) + player[i].victim->weaponids[0]=player[i].victim->weaponids[player[i].victim->num_weapons]; + } + + player[i].victim->weaponactive=-1; + + playerJoint(player[i].victim,abdomen).velocity+=relative*6; + playerJoint(player[i].victim,neck).velocity+=relative*6; + playerJoint(player[i].victim,rightshoulder).velocity+=relative*6; + playerJoint(player[i].victim,leftshoulder).velocity+=relative*6; + } + weapons.owner[k]=i; + if(player[i].num_weapons>0){ + player[i].weaponids[player[i].num_weapons]=player[i].weaponids[0]; + } + player[i].num_weapons++; + player[i].weaponids[0]=k; + } + } + } + } + } + } + if(player[i].weaponactive!=-1&&player[i].aitype==playercontrolled){ + if(weapons.type[player[i].weaponids[0]]==knife){ + if(player[i].isIdle()|| + player[i].isRun()|| + player[i].isCrouch()|| + player[i].targetanimation==sneakanim|| + player[i].isFlip()) + if(numplayers>1) + for(int j=0;j1.5&& + !player[j].skeleton.free&& + -1==checkcollide(DoRotation(playerJoint(j,head).position,0,player[j].rotation,0)*player[j].scale+player[j].coords,DoRotation(playerJoint(i,head).position,0,player[i].rotation,0)*player[i].scale+player[i].coords)){ + if(!player[i].isFlip()){ + player[i].throwtogglekeydown=1; + player[i].victim=&player[j]; + setAnimation(i,knifethrowanim); + player[i].targetrotation=roughDirectionTo(player[i].coords,player[j].coords); + player[i].targettilt2=pitchTo(player[i].coords,player[j].coords); + } + if(player[i].isFlip()){ + if(player[i].weaponactive!=-1){ + player[i].throwtogglekeydown=1; + player[i].victim=&player[j]; + XYZ aim; + weapons.owner[player[i].weaponids[0]]=-1; + aim=player[i].victim->coords+DoRotation(playerJoint(player[i].victim,abdomen).position,0,player[i].victim->rotation,0)*player[i].victim->scale+player[i].victim->velocity*findDistance(&player[i].victim->coords,&player[i].coords)/50-(player[i].coords+DoRotation(playerJoint(i,righthand).position,0,player[i].rotation,0)*player[i].scale); + Normalise(&aim); + + aim=DoRotation(aim,(float)abs(Random()%30)-15,(float)abs(Random()%30)-15,0); + + weapons.velocity[player[i].weaponids[0]]=aim*50; + weapons.tipvelocity[player[i].weaponids[0]]=aim*50; + weapons.missed[player[i].weaponids[0]]=0; + weapons.freetime[player[i].weaponids[0]]=0; + weapons.firstfree[player[i].weaponids[0]]=1; + weapons.physics[player[i].weaponids[0]]=0; + player[i].num_weapons--; + if(player[i].num_weapons){ + player[i].weaponids[0]=player[i].weaponids[player[i].num_weapons]; + } + player[i].weaponactive=-1; + } + } + } + } + } + } + if(player[i].weaponactive!=-1&&player[i].aitype==playercontrolled){ + if(player[i].isCrouch()||player[i].targetanimation==sneakanim){ + player[i].throwtogglekeydown=1; + weapons.owner[player[i].weaponids[0]]=-1; + weapons.velocity[player[i].weaponids[0]]=player[i].velocity*.2; + if(weapons.velocity[player[i].weaponids[0]].x==0)weapons.velocity[player[i].weaponids[0]].x=.1; + weapons.tipvelocity[player[i].weaponids[0]]=weapons.velocity[player[i].weaponids[0]]; + weapons.missed[player[i].weaponids[0]]=1; + weapons.freetime[player[i].weaponids[0]]=0; + weapons.firstfree[player[i].weaponids[0]]=1; + weapons.physics[player[i].weaponids[0]]=1; + player[i].num_weapons--; + if(player[i].num_weapons){ + player[i].weaponids[0]=player[i].weaponids[player[i].num_weapons]; + if(player[i].weaponstuck==player[i].num_weapons)player[i].weaponstuck=0; + } + + player[i].weaponactive=-1; + for(int j=0;j1) + for(int j=0;j1) + for(int j=0;jcoords)<3&& + player[j].victim==&player[i]&& + (player[j].targetanimation==sweepanim|| + player[j].targetanimation==upunchanim|| + player[j].targetanimation==wolfslapanim|| + ((player[j].targetanimation==swordslashanim|| + player[j].targetanimation==knifeslashstartanim|| + player[j].targetanimation==staffhitanim|| + player[j].targetanimation==staffspinhitanim)&& + findDistancefast(&player[j].coords,&player[i].coords)<2))){ + if(target>=0) + target=-1; + else + target=j; + } + } + } + if(target>=0) + player[target].Reverse(); + player[i].lowreversaldelay=.5; + + if(player[i].isIdle()){ + setAnimation(i,player[i].getCrouch()); + player[i].transspeed=10; + } + if(player[i].isRun()|| + (player[i].isStop()&& + (player[i].leftkeydown|| + player[i].rightkeydown|| + player[i].forwardkeydown|| + player[i].backkeydown))){ + setAnimation(i,rollanim); + player[i].transspeed=20; + } + } + if(!player[i].crouchkeydown){ + //Uncrouch + if(!player[i].isRun()&&player[i].targetanimation!=sneakanim&&i==0)player[i].superruntoggle=0; + target=-2; + if(player[i].isCrouch()){ + if(numplayers>1) + for(int j=0;jcoords)<3&& + player[j].victim==&player[i]&& + (player[j].targetanimation==spinkickanim)&& + player[i].isCrouch()){ + if(target>=0) + target=-1; + else + target=j; + } + } + } + if(target>=0) + player[target].Reverse(); + player[i].highreversaldelay=.5; + + if(player[i].isCrouch()){ + if(!player[i].wasCrouch()){ + player[i].currentanimation=player[i].getCrouch(); + player[i].currentframe=0; + } + setAnimation(i,player[i].getIdle()); + player[i].transspeed=10; + } + } + if(player[i].targetanimation==sneakanim){ + setAnimation(i,player[i].getIdle()); + player[i].transspeed=10; + } + } + if(player[i].forwardkeydown){ + if(player[i].isIdle()|| + (player[i].isStop()&& + player[i].targetrotation==player[i].rotation)|| + (player[i].isLanding()&& + player[i].targetframe>0&& + !player[i].jumpkeydown)|| + (player[i].isLandhard()&& + player[i].targetframe>0&& + !player[i].jumpkeydown&& + player[i].crouchkeydown)){ + if(player[i].aitype==passivetype) + setAnimation(i,walkanim); + else + setAnimation(i,player[i].getRun()); + } + if(player[i].isCrouch()){ + player[i].targetanimation=sneakanim; + if(player[i].wasCrouch()) + player[i].target=0; + player[i].targetframe=0; + } + if(player[i].targetanimation==hanganim/*&&(!player[i].forwardstogglekeydown||player[i].aitype!=playercontrolled)*/){ + setAnimation(i,climbanim); + player[i].targetframe=1; + player[i].jumpclimb=1; + } + if(player[i].targetanimation==jumpupanim||player[i].targetanimation==jumpdownanim||player[i].isFlip()){ + player[i].velocity+=absflatfacing*5*multiplier; + } + player[i].forwardstogglekeydown=1; + movekey=1; + } + if (player[i].rightkeydown){ + if(player[i].isIdle()|| + (player[i].isStop()&& + player[i].targetrotation==player[i].rotation)|| + (player[i].isLanding()&& + player[i].targetframe>0&& + !player[i].jumpkeydown)|| + (player[i].isLandhard()&& + player[i].targetframe>0&& + !player[i].jumpkeydown&& + player[i].crouchkeydown)){ + setAnimation(i,player[i].getRun()); + } + if(player[i].isCrouch()){ + player[i].targetanimation=sneakanim; + if(player[i].wasCrouch()) + player[i].target=0; + player[i].targetframe=0; + } + if(player[i].targetanimation==jumpupanim||player[i].targetanimation==jumpdownanim||player[i].isFlip()){ + player[i].velocity+=DoRotation(absflatfacing*5*multiplier,0,-90,0); + } + player[i].targetrotation-=90; + if(player[i].forwardkeydown)player[i].targetrotation+=45; + if(player[i].backkeydown)player[i].targetrotation-=45; + movekey=1; + } + if ( player[i].leftkeydown){ + if(player[i].isIdle()|| + (player[i].isStop()&& + player[i].targetrotation==player[i].rotation)|| + (player[i].isLanding()&& + player[i].targetframe>0&& + !player[i].jumpkeydown)|| + (player[i].isLandhard()&& + player[i].targetframe>0&& + !player[i].jumpkeydown&& + player[i].crouchkeydown)){ + setAnimation(i,player[i].getRun()); + } + if(player[i].isCrouch()){ + player[i].targetanimation=sneakanim; + if(player[i].wasCrouch()) + player[i].target=0; + player[i].targetframe=0; + } + if(player[i].targetanimation==jumpupanim||player[i].targetanimation==jumpdownanim||player[i].isFlip()){ + player[i].velocity-=DoRotation(absflatfacing*5*multiplier,0,-90,0); + } + player[i].targetrotation+=90; + if(player[i].forwardkeydown)player[i].targetrotation-=45; + if(player[i].backkeydown)player[i].targetrotation+=45; + movekey=1; + } + if(player[i].backkeydown){ + if(player[i].isIdle()|| + (player[i].isStop()&& + player[i].targetrotation==player[i].rotation)|| + (player[i].isLanding()&& + player[i].targetframe>0&& + !player[i].jumpkeydown)|| + (player[i].isLandhard()&& + player[i].targetframe>0&& + !player[i].jumpkeydown&& + player[i].crouchkeydown)){ + setAnimation(i,player[i].getRun()); + } + if(player[i].isCrouch()){ + player[i].targetanimation=sneakanim; + if(player[i].wasCrouch()) + player[i].target=0; + player[i].targetframe=0; + } + if(player[i].targetanimation==jumpupanim||player[i].targetanimation==jumpdownanim||player[i].isFlip()){ + player[i].velocity-=absflatfacing*5*multiplier; + } + if(player[i].targetanimation==hanganim){ + player[i].currentanimation=jumpdownanim; + player[i].targetanimation=jumpdownanim; + player[i].target=0; + player[i].currentframe=0; + player[i].targetframe=1; + player[i].velocity=0; + player[i].velocity.y+=gravity; + player[i].coords.y-=1.4; + player[i].grabdelay=1; + } + if ( !player[i].leftkeydown&&!player[i].rightkeydown) + player[i].targetrotation+=180; + movekey=1; + } + if((player[i].jumpkeydown&&!player[i].jumpclimb)||player[i].jumpstart){ + if((((player[i].isLanding()&&player[i].targetframe>=3)|| + player[i].isRun()|| + player[i].targetanimation==walkanim|| + player[i].isCrouch()|| + player[i].targetanimation==sneakanim)&& + player[i].jumppower>1)&& + ((player[i].targetanimation!=rabbitrunninganim&& + player[i].targetanimation!=wolfrunninganim)||i!=0)){ + player[i].jumpstart=0; + setAnimation(i,jumpupanim); + player[i].rotation=player[i].targetrotation; + player[i].transspeed=20; + player[i].FootLand(0,1); + player[i].FootLand(1,1); + + facing=0; + facing.z=-1; + flatfacing=DoRotation(facing,0,player[i].targetrotation+180,0); + + if(movekey)player[i].velocity=flatfacing*player[i].speed*45*player[i].scale; + if(!movekey)player[i].velocity=0; + + //Dodge sweep? + target=-2; + if(numplayers>1) + for(int j=0;jcoords)<3&& + player[j].victim==&player[i]&& + (player[j].targetanimation==sweepanim)){ + if(target>=0)target=-1; + else target=j; + } + } + } + if(target>=0)player[i].velocity.y=1; + else if(player[i].crouchkeydown||player[i].aitype!=playercontrolled){ + player[i].velocity.y=7; + player[i].crouchtogglekeydown=1; + } + else player[i].velocity.y=5; + + if(mousejump&&i==0&&debugmode){ + if(!player[i].isLanding())player[i].tempdeltav=deltav; + if(player[i].tempdeltav<0)player[i].velocity.y-=(float)(player[i].tempdeltav)/multiplier/1000; + } + + player[i].coords.y+=.2; + player[i].jumppower-=1; + + if (!i) + emit_sound_at(whooshsound, player[i].coords, 128.); + + emit_sound_at(jumpsound, player[i].coords, 128.); + } + if((player[i].isIdle())&&player[i].jumppower>1){ + setAnimation(i,player[i].getLanding()); + player[i].targetframe=2; + player[i].landhard=0; + player[i].jumpstart=1; + player[i].tempdeltav=deltav; + } + if(player[i].targetanimation==jumpupanim&& + (((!floatjump&& + !editorenabled)|| + !debugmode)|| + player[i].aitype!=playercontrolled)){ + if(player[i].jumppower>multiplier*6){ + player[i].velocity.y+=multiplier*6; + player[i].jumppower-=multiplier*6; + } + if(player[i].jumppower<=multiplier*6){ + player[i].velocity.y+=player[i].jumppower; + player[i].jumppower=0; + } + } + if(((floatjump||editorenabled)&&debugmode)&&i==0)player[i].velocity.y+=multiplier*30; + } + + if(!movekey){ + if(player[i].isRun()||player[i].targetanimation==walkanim) + setAnimation(i,player[i].getStop()); + if(player[i].targetanimation==sneakanim){ + player[i].targetanimation=player[i].getCrouch(); + if(player[i].currentanimation==sneakanim) + player[i].target=0; + player[i].targetframe=0; + } + } + if(player[i].targetanimation==walkanim&& + (player[i].aitype==attacktypecutoff|| + player[i].aitype==searchtype|| + (player[i].aitype==passivetype&& + player[i].numwaypoints<=1))) + setAnimation(i,player[i].getStop()); + if(player[i].isRun()&&(player[i].aitype==passivetype)) + setAnimation(i,player[i].getStop()); + } + } + if(player[i].targetanimation==rollanim) + player[i].targetrotation=oldtargetrotation; + } + + //Rotation + for(int k=0;k180){ + if(player[k].rotation>player[k].targetrotation) + player[k].rotation-=360; + else + player[k].rotation+=360; + } + + //stop to turn in right direction + if(fabs(player[k].rotation-player[k].targetrotation)>90&&(player[k].isRun()||player[k].targetanimation==walkanim)) + setAnimation(k,player[k].getStop()); + + if(player[k].targetanimation==backhandspringanim||player[k].targetanimation==dodgebackanim) + player[k].targettilt=0; + + if(player[k].targetanimation!=jumpupanim&& + player[k].targetanimation!=backhandspringanim&& + player[k].targetanimation!=jumpdownanim&& + !player[k].isFlip()){ + player[k].targettilt=0; + if(player[k].jumppower<0&&!player[k].jumpkeydown) + player[k].jumppower=0; + player[k].jumppower+=multiplier*7; + if(player[k].isCrouch()) + player[k].jumppower+=multiplier*7; + if(player[k].jumppower>5) + player[k].jumppower=5; + } + + if(player[k].isRun()) + player[k].targettilt=(player[k].rotation-player[k].targetrotation)/4; + + player[k].tilt=stepTowardf(player[k].tilt,player[k].targettilt,multiplier*150); + player[k].grabdelay-=multiplier; + } + + //do animations + for(int k=0;k=0;j--){ + envsoundlife[j]-=multiplier; + if(envsoundlife[j]<0){ + numenvsounds--; + envsoundlife[j]=envsoundlife[numenvsounds]; + envsound[j]=envsound[numenvsounds]; + } + } + if(slomo) + OPENAL_SetFrequency(OPENAL_ALL, slomofreq); + else + OPENAL_SetFrequency(OPENAL_ALL, 22050); + + if(tutoriallevel==1){ + XYZ temp; + XYZ temp2; + XYZ temp3; + XYZ oldtemp; + XYZ oldtemp2; + temp.x=1011; + temp.y=84; + temp.z=491; + temp2.x=1025; + temp2.y=75; + temp2.z=447; + temp3.x=1038; + temp3.y=76; + temp3.z=453; + oldtemp=temp; + oldtemp2=temp2; + if(tutorialstage>=51) + if(findDistancefast(&temp,&player[0].coords)>=findDistancefast(&temp,&temp2)-1||findDistancefast(&temp3,&player[0].coords)<4){ + OPENAL_StopSound(OPENAL_ALL); // hack...OpenAL renderer isn't stopping music after tutorial goes to level menu... + OPENAL_SetFrequency(OPENAL_ALL, 0.001); + + emit_stream_np(stream_music3); + + gameon=0; + mainmenu=5; + + fireSound(); + + flash(); + } + if(tutorialstage<51) + if(findDistancefast(&temp,&player[0].coords)>=findDistancefast(&temp,&temp2)-1||findDistancefast(&temp3,&player[0].coords)<4){ + emit_sound_at(fireendsound, player[0].coords); + + player[0].coords=(oldtemp+oldtemp2)/2; + + flash(); + } + if(tutorialstage>=14&&tutorialstage<50) + if(findDistancefast(&temp,&player[1].coords)>=findDistancefast(&temp,&temp2)-1||findDistancefast(&temp3,&player[1].coords)<4){ + emit_sound_at(fireendsound, player[1].coords); + + for(int i=0;i90)rotation2=90; - if(rotation2<-70)rotation2=-70; + if(!invertmouse) + rotation2+=deltav*.7; + if(invertmouse) + rotation2-=deltav*.7; + if(rotation2>90) + rotation2=90; + if(rotation2<-70) + rotation2=-70; } } @@ -7337,7 +7675,6 @@ void Game::TickOnceAfter(){ static XYZ col; static float brotate; static XYZ facing; - static int i,j; static float changedelay; static bool alldead; static float unseendelay; @@ -7345,31 +7682,40 @@ void Game::TickOnceAfter(){ if(!mainmenu){ - if(environment==snowyenvironment)music1=stream_music1snow; - if(environment==grassyenvironment)music1=stream_music1grass; - if(environment==desertenvironment)music1=stream_music1desert; + if(environment==snowyenvironment) + music1=stream_music1snow; + if(environment==grassyenvironment) + music1=stream_music1grass; + if(environment==desertenvironment) + music1=stream_music1desert; realthreat=0; musictype=music1; - for(i=0;i0){ + if(unseendelay>0) musictype=stream_music2; - } } @@ -7381,27 +7727,33 @@ void Game::TickOnceAfter(){ musicvolume[3]=0; } - if(musictoggle){ - if(musictype!=oldmusictype&&musictype==stream_music2){ + if(musictoggle) + if(musictype!=oldmusictype&&musictype==stream_music2) emit_sound_np(alarmsound); - - } - } musicselected=musictype; - if(musicselected==music1)musicvolume[0]+=multiplier*450; - else musicvolume[0]-=multiplier*450; - if(musicselected==stream_music2)musicvolume[1]+=multiplier*450; - else musicvolume[1]-=multiplier*450; - if(musicselected==stream_music3)musicvolume[2]+=multiplier*450; - else musicvolume[2]-=multiplier*450; + if(musicselected==music1) + musicvolume[0]+=multiplier*450; + else + musicvolume[0]-=multiplier*450; + if(musicselected==stream_music2) + musicvolume[1]+=multiplier*450; + else + musicvolume[1]-=multiplier*450; + if(musicselected==stream_music3) + musicvolume[2]+=multiplier*450; + else + musicvolume[2]-=multiplier*450; - for(i=0;i<3;i++){ - if(musicvolume[i]<0)musicvolume[i]=0; - if(musicvolume[i]>512)musicvolume[i]=512; + for(int i=0;i<3;i++){ + if(musicvolume[i]<0) + musicvolume[i]=0; + if(musicvolume[i]>512) + musicvolume[i]=512; } - if(musicvolume[2]>128&&!loading&&!mainmenu)musicvolume[2]=128; + if(musicvolume[2]>128&&!loading&&!mainmenu) + musicvolume[2]=128; if(musictoggle){ if(musicvolume[0]>0&&oldmusicvolume[0]<=0) @@ -7410,66 +7762,58 @@ void Game::TickOnceAfter(){ emit_stream_np(stream_music2, musicvolume[1]); if(musicvolume[2]>0&&oldmusicvolume[2]<=0) emit_stream_np(stream_music3, musicvolume[2]); - if(musicvolume[0]<=0&&oldmusicvolume[0]>0){ + if(musicvolume[0]<=0&&oldmusicvolume[0]>0) pause_sound(music1); - } - if(musicvolume[1]<=0&&oldmusicvolume[1]>0){ + if(musicvolume[1]<=0&&oldmusicvolume[1]>0) pause_sound(stream_music2); - } - if(musicvolume[2]<=0&&oldmusicvolume[2]>0){ + if(musicvolume[2]<=0&&oldmusicvolume[2]>0) pause_sound(stream_music3); - } - if(musicvolume[0]!=oldmusicvolume[0]){ + if(musicvolume[0]!=oldmusicvolume[0]) OPENAL_SetVolume(channels[music1], musicvolume[0]); - } - if(musicvolume[1]!=oldmusicvolume[1]){ + if(musicvolume[1]!=oldmusicvolume[1]) OPENAL_SetVolume(channels[stream_music2], musicvolume[1]); - } - if(musicvolume[2]!=oldmusicvolume[2]){ + if(musicvolume[2]!=oldmusicvolume[2]) OPENAL_SetVolume(channels[stream_music3], musicvolume[2]); - } - for(i=0;i<3;i++){ + for(int i=0;i<3;i++) oldmusicvolume[i]=musicvolume[i]; - } } else { pause_sound(music1); pause_sound(stream_music2); pause_sound(stream_music3); - for(i=0;i<4;i++){ + for(int i=0;i<4;i++){ oldmusicvolume[i]=0; musicvolume[i]=0; } } killhotspot=2; - for(i=0;i10&&hotspottype[i]<20){ - if(player[hotspottype[i]-10].dead==0){ + if(player[hotspottype[i]-10].dead==0) killhotspot=0; - } else if(killhotspot==2) killhotspot=1; } } - if(killhotspot==2)killhotspot=0; + if(killhotspot==2) + killhotspot=0; winhotspot=0; - for(i=0;imaxalarmed)maxalarmed=numalarmed; + for(int i=1;imaxalarmed) + maxalarmed=numalarmed; if(changedelay<=0&&!loading&&!editorenabled&&gameon&&!tutoriallevel&&changedelay!=-999&&!won){ if(player[0].dead&&changedelay<=0){ @@ -7477,9 +7821,9 @@ void Game::TickOnceAfter(){ targetlevel=whichlevel; } alldead=1; - for(i=1;iwinCampaignLevel(whichchoice, bonustotal, leveltime); scoreadded=1; - } - else - { + }else{ accountactive->winLevel(whichlevel,bonustotal-startbonustotal,leveltime); } won=1; @@ -7525,18 +7867,21 @@ void Game::TickOnceAfter(){ } if(!editorenabled&&gameon&&!mainmenu){ - if(changedelay!=-999)changedelay-=multiplier/7; - if(player[0].dead)targetlevel=whichlevel; + if(changedelay!=-999) + changedelay-=multiplier/7; + if(player[0].dead) + targetlevel=whichlevel; if(loading==2&&!campaign){ flash(); fireSound(firestartsound); - if(!player[0].dead&&targetlevel!=whichlevel){ + if(!player[0].dead&&targetlevel!=whichlevel) startbonustotal=bonustotal; - } - if(player[0].dead) Loadlevel(whichlevel); - else Loadlevel(targetlevel); + if(player[0].dead) + Loadlevel(whichlevel); + else + Loadlevel(targetlevel); fireSound(); @@ -7554,28 +7899,39 @@ void Game::TickOnceAfter(){ loading=3; } - if(changedelay<=-999&&whichlevel!=-2&&!loading&&(player[0].dead||(alldead&&maptype==mapkilleveryone)||(winhotspot)||(killhotspot))&&!winfreeze)loading=1; - if((player[0].dead||(alldead&&maptype==mapkilleveryone)||(winhotspot)||(windialogue)||(killhotspot))&&changedelay<=0){ - { - if(whichlevel!=-2&&!loading&&!player[0].dead){ - winfreeze=1; - changedelay=-999; - } - if(player[0].dead)loading=1; - } + if(changedelay<=-999&& + whichlevel!=-2&& + !loading&& + (player[0].dead|| + (alldead&&maptype==mapkilleveryone)|| + (winhotspot)|| + (killhotspot))&& + !winfreeze) + loading=1; + if((player[0].dead|| + (alldead&&maptype==mapkilleveryone)|| + (winhotspot)|| + (windialogue)|| + (killhotspot))&& + changedelay<=0){ + if(whichlevel!=-2&&!loading&&!player[0].dead){ + winfreeze=1; + changedelay=-999; + } + if(player[0].dead) + loading=1; } } if(campaign) - if(mainmenu==0&&winfreeze&&(campaignchoosenext[campaignchoicewhich[whichchoice]])==1){ - if(campaignnumnext[campaignchoicewhich[whichchoice]]==0){ + if(mainmenu==0&&winfreeze&&(campaignchoosenext[campaignchoicewhich[whichchoice]])==1) + if(campaignnumnext[campaignchoicewhich[whichchoice]]==0) endgame=1; - } - } else if(mainmenu==0&&winfreeze){ if(campaignchoosenext[campaignchoicewhich[whichchoice]]==2) stealthloading=1; - else stealthloading=0; + else + stealthloading=0; if(!stealthloading){ float gLoc[3]={0,0,0}; @@ -7590,21 +7946,21 @@ void Game::TickOnceAfter(){ ifstream ipstream(ConvertFileName(":Data:Campaigns:main.txt")); ipstream.ignore(256,':'); ipstream >> campaignnumlevels; - for(i=0;i> campaignmapname[i]; ipstream.ignore(256,':'); ipstream >> campaigndescription[i]; - for(j=0;j<256;j++){ + for(int j=0;j<256;j++){ if(campaigndescription[i][j]=='_')campaigndescription[i][j]=' '; } ipstream.ignore(256,':'); ipstream >> campaignchoosenext[i]; ipstream.ignore(256,':'); ipstream >> campaignnumnext[i]; - for(j=0;j> campaignnextlevel[i][j]; campaignnextlevel[i][j]-=1; @@ -7616,20 +7972,20 @@ void Game::TickOnceAfter(){ } ipstream.close(); - for(i=0;igetCampaignChoicesMade();i++){ + for(int i=0;igetCampaignChoicesMade();i++){ levelorder[i+1]=campaignnextlevel[levelorder[i]][accountactive->getCampaignChoice(i)]; levelvisible[levelorder[i+1]]=1; } @@ -7642,7 +7998,7 @@ void Game::TickOnceAfter(){ else { campaignchoicenum=campaignnumnext[levelorder[whichlevelstart]]; - for(i=0;itarget.y) target.y=player[0].skeleton.joints[i].position.y*player[0].scale+player[0].coords.y; } @@ -7712,27 +8069,25 @@ void Game::TickOnceAfter(){ coltarget=cameraloc; objects.SphereCheckPossible(&colviewer, findDistance(&colviewer,&coltarget)); if(terrain.patchobjectnum[player[0].whichpatchx][player[0].whichpatchz]) - for(j=0;j.8)camerashake=.8; //if(woozy>10)woozy=10; @@ -7797,3 +8150,4 @@ void Game::TickOnceAfter(){ } } } + diff --git a/Source/Input.cpp b/Source/Input.cpp index 3cf1b1c..811ab01 100644 --- a/Source/Input.cpp +++ b/Source/Input.cpp @@ -25,13 +25,33 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. extern bool keyboardfrozen; +bool keyDown[SDLK_LAST+6]; +bool keyPressed[SDLK_LAST+6]; + +void Input::Tick(){ + SDL_PumpEvents(); + Uint8 *keyState = SDL_GetKeyState(NULL); + for(int i=0;i=SDLK_LAST+6) // vraiment utile? à vérifier + return false; + return keyDown[k]; +} + +bool Input::isKeyPressed(int k) { + if(keyboardfrozen||k>=SDLK_LAST+6) + return false; + return keyPressed[k]; } const char* Input::keyToChar(unsigned short i) { @@ -47,8 +67,7 @@ const char* Input::keyToChar(unsigned short i) { return "unknown"; } -unsigned short Input::CharToKey(const char* which) -{ +unsigned short Input::CharToKey(const char* which) { for(unsigned short i=0;i FUNCTION PROTOTYPES <**/ class Input { public: + static void Tick(); static bool isKeyDown(int k); + static bool isKeyPressed(int k); static const char* keyToChar(unsigned short which); static void setKeyFor(Game* g); static unsigned short CharToKey(const char* which); - static Boolean Button(); + static Boolean MouseClicked(); }; #endif diff --git a/Source/Lights.h b/Source/Lights.h index d9b060b..483d1e0 100644 --- a/Source/Lights.h +++ b/Source/Lights.h @@ -34,6 +34,15 @@ public: GLfloat ambient[3]; int attach; XYZ location; + inline void setColors(GLfloat cr, GLfloat cg, GLfloat cb, + GLfloat ar, GLfloat ag, GLfloat ab){ + color[0]=cr; + color[1]=cg; + color[2]=cb; + ambient[0]=ar; + ambient[1]=ag; + ambient[2]=ab; + } }; void SetUpMainLight(Light* whichsource, int whichlight, float ambientr, float ambientg, float ambientb); diff --git a/Source/Person.h b/Source/Person.h index eed0a27..7f09302 100644 --- a/Source/Person.h +++ b/Source/Person.h @@ -179,7 +179,6 @@ struct Person float turnspeed; int aitype; - int aitarget; float aiupdatedelay; float losupdatedelay; int ally; diff --git a/Source/Settings.cpp b/Source/Settings.cpp index 71b7581..dce0e0e 100644 --- a/Source/Settings.cpp +++ b/Source/Settings.cpp @@ -141,11 +141,11 @@ bool LoadSettings(Game &game) { printf("Loading config\n"); while(!ipstream.eof()) { ipstream.getline( setting, sizeof(setting) ); - printf("setting : %s\n",setting); // skip blank lines // assume lines starting with spaces are all blank if ( strlen(setting) == 0 || setting[0] == ' ' || setting[0] == '\t') continue; + printf("setting : %s\n",setting); if ( ipstream.eof() || ipstream.fail() ) { fprintf(stderr, "Error reading config file: Got setting name '%s', but value can't be read\n", setting);