X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=Source%2FGameTick.cpp;h=8b519880e7da4f483bddcfe830334cc7db30cd72;hb=42bf932baf8cecf12b4daba00c4453093aa4971a;hp=909c5033bfe0a31a7997f2ff55ef6e0cc4547b3c;hpb=0941fb2cb76a06a316d8a488c1504f84b66e4b4f;p=lugaru.git diff --git a/Source/GameTick.cpp b/Source/GameTick.cpp index 909c503..8b51988 100644 --- a/Source/GameTick.cpp +++ b/Source/GameTick.cpp @@ -27,10 +27,16 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #endif +#include #include #include "Game.h" #include "openal_wrapper.h" #include "Settings.h" +#include "Input.h" +#include "Animation.h" +#include "Awards.h" + +#include using namespace std; @@ -44,12 +50,7 @@ using namespace std; extern float multiplier; extern XYZ viewer; extern int environment; -extern float texscale; extern Terrain terrain; -extern OPENAL_SAMPLE *samp[100]; -extern int channels[100]; -extern Sprites sprites; -extern int kTextureSize; extern float screenwidth,screenheight; extern float gravity; extern int detail; @@ -59,21 +60,13 @@ extern int slomo; extern float slomodelay; extern bool floatjump; extern float volume; -extern Animation animation[animation_count]; extern Light light; -extern float texdetail; -extern GLubyte bloodText[512*512*3]; -extern GLubyte wolfbloodText[512*512*3]; -extern float terraindetail; extern float camerashake; extern float woozy; extern float blackout; extern bool cellophane; extern bool musictoggle; extern int difficulty; -extern Weapons weapons; -extern Person player[maxplayers]; -extern int numplayers; extern int bloodtoggle; extern bool invertmouse; extern float windvar; @@ -83,47 +76,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 char mapname[256]; extern XYZ windvector; -extern bool buttons[3]; extern bool debugmode; -static int music1; +static int leveltheme; 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 vblsync; -extern bool immediate; -extern bool velocityblur; -extern int bonus; -extern int oldbonus; -extern float bonusvalue; -extern float bonustotal; -extern float bonustime; -extern float startbonustotal; extern float tintr,tintg,tintb; -extern float bonusnum[100]; extern bool skyboxtexture; extern float skyboxr; extern float skyboxg; @@ -145,19 +113,15 @@ extern bool reversaltrain; extern bool canattack; extern bool cananger; extern float damagedealt; -extern float damagetaken; extern int maptype; extern int editoractive; extern int editorpathtype; -extern bool oldbuttons[3]; extern float hostiletime; extern bool gamestarted; extern int numhotspots; -extern int winhotspot; -extern int windialogue; extern int killhotspot; extern XYZ hotspot[40]; extern int hotspottype[40]; @@ -165,73 +129,13 @@ extern float hotspotsize[40]; extern char hotspottext[40][256]; extern int currenthotspot; -extern int kBitsPerPixel; extern int hostile; -extern int numaccounts; -extern int accountactive; -extern int accountdifficulty[10]; -extern int accountprogress[10]; -extern float accountpoints[10]; -extern float accounthighscore[10][50]; -extern float accountfasttime[10][50]; -extern bool accountunlocked[10][60]; -extern char accountname[10][256]; - extern bool stillloading; extern bool winfreeze; -extern int numfalls; -extern int numflipfail; -extern int numseen; -extern int numstaffattack; -extern int numswordattack; -extern int numknifeattack; -extern int numunarmedattack; -extern int numescaped; -extern int numflipped; -extern int numwallflipped; -extern int numthrowkill; -extern int numafterkill; -extern int numreversals; -extern int numattacks; -extern int maxalarmed; -extern int numresponded; - -extern int numdialogues; -extern int numdialogueboxes[max_dialogues]; -extern int dialoguetype[max_dialogues]; -extern int dialogueboxlocation[max_dialogues][max_dialoguelength]; -extern float dialogueboxcolor[max_dialogues][max_dialoguelength][3]; -extern int dialogueboxsound[max_dialogues][max_dialoguelength]; -extern char dialoguetext[max_dialogues][max_dialoguelength][128]; -extern char dialoguename[max_dialogues][max_dialoguelength][64]; -extern XYZ dialoguecamera[max_dialogues][max_dialoguelength]; -extern XYZ participantlocation[max_dialogues][10]; -extern int participantfocus[max_dialogues][max_dialoguelength]; -extern int participantaction[max_dialogues][max_dialoguelength]; -extern float participantrotation[max_dialogues][10]; -extern XYZ participantfacing[max_dialogues][max_dialoguelength][10]; -extern float dialoguecamerarotation[max_dialogues][max_dialoguelength]; -extern float dialoguecamerarotation2[max_dialogues][max_dialoguelength]; -extern int indialogue; -extern int whichdialogue; -extern int directing; -extern float dialoguetime; -extern int dialoguegonethrough[20]; - extern bool campaign; -extern float oldgamespeed; - -extern float accountcampaignhighscore[10]; -extern float accountcampaignfasttime[10]; -extern float accountcampaignscore[10]; -extern float accountcampaigntime[10]; - -extern int accountcampaignchoicesmade[10]; -extern int accountcampaignchoices[10][5000]; - static const char *rabbitskin[] = { ":Data:Textures:Fur3.jpg", ":Data:Textures:Fur.jpg", @@ -262,13 +166,8 @@ static bool stripfx(const char *str, const char *pfx) return !strncasecmp(str, pfx, strlen(pfx)); } -extern OPENAL_STREAM * strm[20]; -extern "C" void PlaySoundEx(int channel, OPENAL_SAMPLE *sptr, OPENAL_DSPUNIT *dsp, signed char startpaused); -extern "C" void PlayStreamEx(int chan, OPENAL_STREAM *sptr, OPENAL_DSPUNIT *dsp, signed char startpaused); - - static const char *cmd_names[] = { -#define DECLARE_COMMAND(cmd) #cmd " ", +#define DECLARE_COMMAND(cmd) #cmd, #include "ConsoleCmds.h" #undef DECLARE_COMMAND }; @@ -285,6 +184,80 @@ static console_handler cmd_handlers[] = { #undef DECLARE_COMMAND }; + + +// added utility functions -sf17k ============================================================= + +//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); +} + +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; @@ -292,187 +265,174 @@ static void ch_quit(Game *game, const char *args) static void ch_map(Game *game, const char *args) { - char buf[64]; - snprintf(buf, 63, ":Data:Maps:%s", args); - game->Loadlevel(buf); + game->Loadlevel(args); game->whichlevel = -2; campaign = 0; } -static void ch_save(Game *game, const char *args) -{ - char buf[64]; - int i, j, k, l, m, templength; - float headprop, bodyprop, armprop, legprop; - snprintf(buf, 63, ":Data:Maps:%s", args); - - - int mapvers = 12;; - - FILE *tfile; - tfile=fopen( ConvertFileName(buf), "wb" ); - fpackf(tfile, "Bi", mapvers); - fpackf(tfile, "Bi", maptype); - fpackf(tfile, "Bi", hostile); - fpackf(tfile, "Bf Bf", viewdistance, fadestart); - fpackf(tfile, "Bb Bf Bf Bf", skyboxtexture, skyboxr, skyboxg, skyboxb); - 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;j0&&player[0].num_weapons<5) + for(int j=0;j1&&numplayers0&&player[j].num_weapons<5) - for(k=0;knumpathpoints); - if(game->numpathpoints) - for(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++){ - fpackf(tfile, "Bi", game->pathpointconnect[j][k]); - } - } + fpackf(tfile, "Bi", numplayers); + if(numplayersnumpathpoints); + 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(int k=0;knumpathpointconnect[j];k++) + fpackf(tfile, "Bi", game->pathpointconnect[j][k]); + } - fpackf(tfile, "Bf Bf Bf Bf", game->mapcenter.x, game->mapcenter.y, game->mapcenter.z, game->mapradius); + fpackf(tfile, "Bf Bf Bf Bf", game->mapcenter.x, game->mapcenter.y, game->mapcenter.z, game->mapradius); - fclose(tfile); + fclose(tfile); } static void ch_cellar(Game *game, const char *args) @@ -523,7 +483,7 @@ static void ch_size(Game *game, const char *args) static int find_closest() { int closest = 0; - float closestdist = 1.0/0.0; + float closestdist = std::numeric_limits::max(); for (int i = 1; i < numplayers; i++) { float distance; @@ -555,9 +515,7 @@ static void set_proportion(int pnum, const char *args) player[pnum].proportionbody=1.1*bodyprop; player[pnum].proportionarms=1.1*armprop; player[pnum].proportionlegs=1.1*legprop; - } - - if(player[pnum].creature==rabbittype){ + } else if(player[pnum].creature==rabbittype){ player[pnum].proportionhead=1.2*headprop; player[pnum].proportionbody=1.05*bodyprop; player[pnum].proportionarms=1.00*armprop; @@ -669,10 +627,10 @@ static void set_clothes(int pnum, Game *game, const char *args) char buf[64]; snprintf(buf, 63, ":Data:Textures:%s.png", args); - if (!game->AddClothes(buf,0,1,&player[pnum].skeleton.skinText[pnum],&player[pnum].skeleton.skinsize)) + if (!game->AddClothes(buf,&player[pnum].skeleton.skinText[pnum])) return; - player[pnum].DoMipmaps(5,0,0,player[pnum].skeleton.skinsize,player[pnum].skeleton.skinsize); + player[pnum].DoMipmaps(); strcpy(player[pnum].clothes[player[pnum].numclothes],buf); player[pnum].clothestintr[player[pnum].numclothes]=tintr; player[pnum].clothestintg[player[pnum].numclothes]=tintg; @@ -794,8 +752,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; } @@ -828,8 +785,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; @@ -838,8 +795,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; @@ -865,7 +822,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); @@ -879,7 +836,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;i Tick() <*****/ -extern void ScreenShot(const char * fname); +extern bool save_image(const char * fname); void Screenshot (void) { char temp[1024]; @@ -1207,67 +1114,36 @@ void Screenshot (void) #else mkdir("Screenshots", S_IRWXU); #endif - - ScreenShot(temp); + + save_image(temp); } - - -void Game::SetUpLighting(){ - if(environment==snowyenvironment){ - light.color[0]=.65; - light.color[1]=.65; - light.color[2]=.7; - light.ambient[0]=.4; - light.ambient[1]=.4; - light.ambient[2]=.44; - } - if(environment==desertenvironment){ - light.color[0]=.95; - light.color[1]=.95; - light.color[2]=.95; - light.ambient[0]=.4; - light.ambient[1]=.35; - light.ambient[2]=.3; - } - - if(environment==grassyenvironment){ - light.color[0]=.95; - light.color[1]=.95; - light.color[2]=1; - light.ambient[0]=.4; - light.ambient[1]=.4; - light.ambient[2]=.44; - } - if(!skyboxtexture){ - light.color[0]=1; - light.color[1]=1; - light.color[2]=1; - light.ambient[0]=.4; - light.ambient[1]=.4; - light.ambient[2]=.4; - } +void Game::SetUpLighting(){ + if(environment==snowyenvironment) + light.setColors(.65,.65,.7,.4,.4,.44); + if(environment==desertenvironment) + light.setColors(.95,.95,.95,.4,.35,.3); + if(environment==grassyenvironment) + light.setColors(.95,.95,1,.4,.4,.44); + if(!skyboxtexture) + light.setColors(1,1,1,.4,.4,.4); float average; average=(skyboxlightr+skyboxlightg+skyboxlightb)/3; light.color[0]*=(skyboxlightr+average)/2; light.color[1]*=(skyboxlightg+average)/2; light.color[2]*=(skyboxlightb+average)/2; - light.ambient[0]=light.ambient[0]*(skyboxlightr+average)/2*1; - light.ambient[1]=light.ambient[1]*(skyboxlightg+average)/2*1; - light.ambient[2]=light.ambient[2]*(skyboxlightb+average)/2*1; - /* - light.ambient[0]=0; - light.ambient[1]=0; - light.ambient[2]=0; */ + light.ambient[0]*=(skyboxlightr+average)/2; + light.ambient[1]*=(skyboxlightg+average)/2; + light.ambient[2]*=(skyboxlightb+average)/2; } int Game::findPathDist(int start,int end){ - int i,j,k,smallestcount,count,connected; + int smallestcount,count,connected; int last,last2,last3,last4; int closest; smallestcount=1000; - for(i=0;i<50;i++){ + for(int i=0;i<50;i++){ count=0; last=start; last2=-1; @@ -1275,23 +1151,23 @@ int Game::findPathDist(int start,int end){ last4=-1; while(last!=end&&count<30){ closest=-1; - for(j=0;jendpoint.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) { + char buf[32]; + snprintf(buf, 32, "map%d", which + 1); // challenges + Loadlevel(buf); + } else + Loadlevel("mapsave"); +} -void Game::Loadlevel(char *name){ - int i,j,k,l,m; - static int oldlevel; +void Game::Loadlevel(const char *name) { int templength; float lamefloat; - int lameint; + static const char *pfx = ":Data:Maps:"; + char *buf; float headprop,legprop,armprop,bodyprop; @@ -1641,57 +1412,55 @@ void Game::Loadlevel(char *name){ LOG(std::string("Loading level...") + name); - if(!gameon)visibleloading=1; - - if(stealthloading)visibleloading=0; - - if(!stillloading)loadtime=0; + if(!gameon) + visibleloading=1; + if(stealthloading) + visibleloading=0; + if(!stillloading) + loadtime=0; gamestarted=1; numenvsounds=0; - //visibleloading=1; - if(tutoriallevel!=-1)tutoriallevel=0; - else tutoriallevel=1; - if(tutoriallevel==1)tutorialstage=0; - if(tutorialstage==0){ + if(tutoriallevel!=-1) + tutoriallevel=0; + else + tutoriallevel=1; + + if(tutoriallevel==1) + tutorialstage=0; + if(tutorialstage==0) { tutorialstagetime=0; tutorialmaxtime=1; } loadingstuff=1; - if(!firstload){ - oldlevel=50; - } - OPENAL_SetPaused(channels[whooshsound], true); - OPENAL_SetPaused(channels[stream_firesound], true); + pause_sound(whooshsound); + pause_sound(stream_firesound); // Change the map filename into something that is os specific - char *FixedFN = ConvertFileName(name); + buf = (char*) alloca(strlen(pfx) + strlen(name) + 1); + sprintf(buf, "%s%s", pfx, name); + const char *FixedFN = ConvertFileName(buf); int mapvers; - FILE *tfile; + FILE *tfile; + //~ char* buff=getcwd(NULL,0); + //~ cout << buff << " " << FixedFN << endl; + //~ free(buff); tfile=fopen( FixedFN, "rb" ); - if(tfile) - { - OPENAL_SetPaused(channels[stream_firesound], true); - - + if(tfile) { + pause_sound(stream_firesound); scoreadded=0; - windialogue=0; - + windialogue=false; hostiletime=0; - won=0; - //campaign=0; - animation[bounceidleanim].Load((char *)":Data:Animations:Idle",middleheight,neutral); + animation[bounceidleanim].Load((char *)"Idle",middleheight,neutral); numdialogues=0; - for(i=0;i<20;i++) - { + for(int i=0;i<20;i++) dialoguegonethrough[i]=0; - } indialogue=-1; cameramode=0; @@ -1699,10 +1468,13 @@ void Game::Loadlevel(char *name){ damagedealt=0; damagetaken=0; - if(accountactive!=-1)difficulty=accountdifficulty[accountactive]; + if(accountactive) + difficulty=accountactive->getDifficulty(); - if(difficulty!=2)minimap=1; - else minimap=0; + if(difficulty!=2) + minimap=1; + else + minimap=0; numhotspots=0; currenthotspot=-1; @@ -1716,10 +1488,8 @@ void Game::Loadlevel(char *name){ freeze=0; winfreeze=0; - for(i=0;i<100;i++) - { + for(int i=0;i<100;i++) bonusnum[i]=0; - } numfalls=0; numflipfail=0; @@ -1742,86 +1512,83 @@ void Game::Loadlevel(char *name){ bonus=0; gameon=1; changedelay=0; - if(console) - { - PlaySoundEx( consolesuccesssound, samp[consolesuccesssound], NULL, true); - OPENAL_SetVolume(channels[consolesuccesssound], 256); - OPENAL_SetPaused(channels[consolesuccesssound], false); + if(console){ + emit_sound_np(consolesuccesssound); freeze=0; - console=0; + console=false; } - if(!stealthloading) - { + if(!stealthloading){ terrain.numdecals=0; - sprites.numsprites=0; - for(i=0;i=15)funpackf(tfile, "Bi", &indemo); - else indemo=0; - if(mapvers>=5)funpackf(tfile, "Bi", &maptype); - else maptype=mapkilleveryone; - if(mapvers>=6)funpackf(tfile, "Bi", &hostile); - else hostile=1; - if(mapvers>=4)funpackf(tfile, "Bf Bf", &viewdistance, &fadestart); + if(mapvers>=15) + funpackf(tfile, "Bi", &indemo); + else + indemo=0; + if(mapvers>=5) + funpackf(tfile, "Bi", &maptype); else - { + maptype=mapkilleveryone; + if(mapvers>=6) + funpackf(tfile, "Bi", &hostile); + else + hostile=1; + if(mapvers>=4) + funpackf(tfile, "Bf Bf", &viewdistance, &fadestart); + else{ viewdistance=100; fadestart=.6; } - if(mapvers>=2)funpackf(tfile, "Bb Bf Bf Bf", &skyboxtexture, &skyboxr, &skyboxg, &skyboxb); - else - { + if(mapvers>=2) + funpackf(tfile, "Bb Bf Bf Bf", &skyboxtexture, &skyboxr, &skyboxg, &skyboxb); + else{ skyboxtexture=1; skyboxr=1; skyboxg=1; skyboxb=1; } - if(mapvers>=10)funpackf(tfile, "Bf Bf Bf", &skyboxlightr, &skyboxlightg, &skyboxlightb); - else - { + if(mapvers>=10) + funpackf(tfile, "Bf Bf Bf", &skyboxlightr, &skyboxlightg, &skyboxlightb); + else{ skyboxlightr=skyboxr; skyboxlightg=skyboxg; skyboxlightb=skyboxb; } - if(!stealthloading)funpackf(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(stealthloading)funpackf(tfile, "Bf Bf Bf Bf Bf Bi", &lamefloat,&lamefloat,&lamefloat,&lamefloat,&lamefloat, &player[0].num_weapons); + if(!stealthloading) + funpackf(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(stealthloading) + funpackf(tfile, "Bf Bf Bf Bf Bf Bi", &lamefloat,&lamefloat,&lamefloat,&lamefloat,&lamefloat, &player[0].num_weapons); player[0].originalcoords=player[0].coords; if(player[0].num_weapons>0&&player[0].num_weapons<5) - { - for(j=0;j=9) - { funpackf(tfile, "Bi Bi", &player[0].whichskin, &player[0].creature); - } - else - { + else{ player[0].whichskin=0; player[0].creature=rabbittype; } - for(i=0;i=8) - { + //dialogues + if(mapvers>=8){ funpackf(tfile, "Bi", &numdialogues); - if(numdialogues) - { - for(k=0;k128||templength<=0)templength=128; - for(m=0;m64||templength<=0)templength=64; - for(m=0;m128||templength<=0) + templength=128; + int m; + for(m=0;m64||templength<=0)templength=64; + for(m=0;m=7) - { + if(mapvers>=7){ funpackf(tfile, "Bi", &numhotspots); - if(numhotspots) - { - for(i=0;imaxdistance) - { - whichclosest=i; + if(tempdist>maxdistance){ + //~ whichclosest=i; maxdistance=tempdist; } } objects.radius=fast_sqrt(maxdistance); } - if(visibleloading){loadscreencolor=4; LoadingScreen();} + if(visibleloading) + LoadingScreen(); //mapcenter=objects.center; //mapradius=objects.radius; funpackf(tfile, "Bi", &numplayers); int howmanyremoved=0; bool removeanother=0; - if(numplayers>1&&numplayers1&&numplayers=5)funpackf(tfile, "Bi", &player[i-howmanyremoved].howactive); - else player[i-howmanyremoved].howactive=typeactive; - if(mapvers>=3)funpackf(tfile, "Bf",&player[i-howmanyremoved].scale); - else player[i-howmanyremoved].scale=-1; - if(mapvers>=11)funpackf(tfile, "Bb",&player[i-howmanyremoved].immobile); - else player[i-howmanyremoved].immobile=0; - if(mapvers>=12)funpackf(tfile, "Bf",&player[i-howmanyremoved].rotation); - else player[i-howmanyremoved].rotation=0; + if(mapvers>=5) + funpackf(tfile, "Bi", &player[i-howmanyremoved].howactive); + else + player[i-howmanyremoved].howactive=typeactive; + if(mapvers>=3) + funpackf(tfile, "Bf",&player[i-howmanyremoved].scale); + else + player[i-howmanyremoved].scale=-1; + if(mapvers>=11) + funpackf(tfile, "Bb",&player[i-howmanyremoved].immobile); + else + player[i-howmanyremoved].immobile=0; + if(mapvers>=12) + funpackf(tfile, "Bf",&player[i-howmanyremoved].rotation); + else + player[i-howmanyremoved].rotation=0; player[i-howmanyremoved].targetrotation=player[i-howmanyremoved].rotation; if(player[i-howmanyremoved].num_weapons<0||player[i-howmanyremoved].num_weapons>5){ removeanother=1; howmanyremoved++; } - if(!removeanother) - { - if(player[i-howmanyremoved].num_weapons>0&&player[i-howmanyremoved].num_weapons<5) - { - for(j=0;j0&&player[i-howmanyremoved].num_weapons<5){ + for(int j=0;j=5)funpackf(tfile, "Bi", &player[i-howmanyremoved].waypointtype[j]); - else player[i-howmanyremoved].waypointtype[j] = wpkeepwalking; + if(mapvers>=5) + funpackf(tfile, "Bi", &player[i-howmanyremoved].waypointtype[j]); + else + player[i-howmanyremoved].waypointtype[j] = wpkeepwalking; } funpackf(tfile, "Bi", &player[i-howmanyremoved].waypoint); - if(player[i-howmanyremoved].waypoint>player[i-howmanyremoved].numwaypoints-1)player[i-howmanyremoved].waypoint=0; + if(player[i-howmanyremoved].waypoint>player[i-howmanyremoved].numwaypoints-1) + player[i-howmanyremoved].waypoint=0; funpackf(tfile, "Bf Bf Bf", &player[i-howmanyremoved].armorhead, &player[i-howmanyremoved].armorhigh, &player[i-howmanyremoved].armorlow); funpackf(tfile, "Bf Bf Bf", &player[i-howmanyremoved].protectionhead, &player[i-howmanyremoved].protectionhigh, &player[i-howmanyremoved].protectionlow); funpackf(tfile, "Bf Bf Bf", &player[i-howmanyremoved].metalhead, &player[i-howmanyremoved].metalhigh, &player[i-howmanyremoved].metallow); funpackf(tfile, "Bf Bf", &player[i-howmanyremoved].power, &player[i-howmanyremoved].speedmult); - if(mapvers>=4)funpackf(tfile, "Bf Bf Bf Bf", &headprop, &bodyprop, &armprop, &legprop); - else - { + if(mapvers>=4) + funpackf(tfile, "Bf Bf Bf Bf", &headprop, &bodyprop, &armprop, &legprop); + else{ headprop=1; bodyprop=1; armprop=1; legprop=1; } - if(player[i-howmanyremoved].creature==wolftype) - { + if(player[i-howmanyremoved].creature==wolftype){ player[i-howmanyremoved].proportionhead=1.1*headprop; player[i-howmanyremoved].proportionbody=1.1*bodyprop; player[i-howmanyremoved].proportionarms=1.1*armprop; player[i-howmanyremoved].proportionlegs=1.1*legprop; } - if(player[i-howmanyremoved].creature==rabbittype) - { + if(player[i-howmanyremoved].creature==rabbittype){ player[i-howmanyremoved].proportionhead=1.2*headprop; player[i-howmanyremoved].proportionbody=1.05*bodyprop; player[i-howmanyremoved].proportionarms=1.00*armprop; @@ -2072,13 +1805,11 @@ void Game::Loadlevel(char *name){ } funpackf(tfile, "Bi", &player[i-howmanyremoved].numclothes); - if(player[i-howmanyremoved].numclothes) - { - for(k=0;k30||numpathpoints<0) numpathpoints=0; - if(numpathpoints) - { - for(j=0;jmaxplayers-1)numplayers=maxplayers-1; - for(i=0;imaxplayers-1) + numplayers=maxplayers-1; + for(int i=0;itutorialmaxtime){ + 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_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[player[0].weaponids[0]].getType()==sword) + weapons[player[0].weaponids[0]].setType(staff); + else if(weapons[player[0].weaponids[0]].getType()==staff) + weapons[player[0].weaponids[0]].setType(knife); + else + weapons[player[0].weaponids[0]].setType(sword); + } + } + + 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); + } + } + } +} - for(i=0;i<15;i++){ - displaytime[i]+=multiplier; - } +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){ + player[k].setAnimation(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){ + player[k].setAnimation(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){ + player[k].setAnimation(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){ + player[k].setAnimation(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){ + player[k].setAnimation(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); + player[k].setAnimation(jumpdownanim); + + if(!k) + emit_sound_at(whooshsound, player[k].coords, 128.); + } + //gravity + player[k].velocity.y+=gravity; + } + } + } + player[k].realoldcoords=player[k].coords; + } +} - keyboardfrozen=0; +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; + player[k].setAnimation(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; + } + } + } + } + } + } +} - static bool mainmenutogglekeydown; +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) + player[i].setAnimation(getupfromfrontanim); + player[i].howactive=typeactive; + } + } + + if(player[i].howactive0)){ + float smelldistance=50; + if(j==0&&player[j].num_weapons>0){ + if(weapons[player[j].weaponids[0]].bloody) + smelldistance=100; + if(player[j].num_weapons==2) + if(weapons[player[j].weaponids[1]].bloody) + 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].getJointFor(head).position,0,player[i].rotation,0)* + player[i].scale+player[i].coords, + DoRotation(player[j].getJointFor(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; + player[i].setAnimation(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(player[i].getJointFor(head).position,0,player[i].rotation,0)* + player[i].scale+player[i].coords, + DoRotation(player[0].getJointFor(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[player[i].ally].owner!=-1|| + findDistancefast(&player[i].coords,&weapons[player[i].ally].position)>16){ + player[i].aitype=attacktypecutoff; + player[i].lastseentime=1; + } + //TODO: factor these out as moveToward() + player[i].targetrotation=roughDirectionTo(player[i].coords,weapons[player[i].ally].position); + 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; + player[i].setAnimation(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+=player[i].getJointFor(head).position.y*player[i].scale; + flatfacing.y+=player[0].getJointFor(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); + } + } +} - if (stereoreverse) { - printf("Stereo reversed\n"); - } else { - printf("Stereo unreversed\n"); - } - freezetogglekeydown=1; +/* +Values of mainmenu : +1 Main menu +2 Menu pause (resume/end game) +3 Option menu +4 Controls configuration menu +5 Main game menu (choose level or challenge) +6 Deleting user menu +7 User managment menu (select/add) +8 Choose difficulty menu +9 Challenge level selection menu +10 End of the campaign congratulation (is that really a menu?) +11 Same that 9 ??? => unused +18 stereo configuration +*/ + +void Game::MenuTick(){ + //menu buttons + + // some specific case where we do something even if the left mouse button is not pressed. + if((mainmenu==5) && (endgame==2)) { + accountactive->endGame(); + endgame=0; } + if(mainmenu==10) + endgame=2; + if( (mainmenu==18) && Input::isKeyPressed(MOUSEBUTTON2) && (selected==1) ) + stereoseparation-=0.001; + + if(Input::MouseClicked() && (selected >= 0)) { // handling of the left mouse clic in menus + switch(mainmenu) { + case 1: + case 2: + switch(selected) { + case 1: + if(gameon) { //resume + mainmenu=0; + pause_sound(stream_menutheme); + resume_stream(leveltheme); + } else { //new game + fireSound(firestartsound); + flash(); + mainmenu=(accountactive?5:7); + selected=-1; + } + break; + case 2: //options + fireSound(); + 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; + break; + case 3: + fireSound(); + flash(); + if(gameon){ //end game + gameon=0; + mainmenu=1; + } else { //quit + tryquit=1; + pause_sound(stream_menutheme); + } + break; + } + break; + case 3: + fireSound(); + bool isCustomResolution,found; + switch(selected){ + case 0: + extern SDL_Rect **resolutions; + isCustomResolution = true; + 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 (IsKeyDown(theKeyMap, MAC_F7_KEY)) { - if (IsKeyDown(theKeyMap, MAC_SHIFT_KEY)) { - stereoseparation -= 0.001; - } else { - stereoseparation -= 0.010; - } - - printf("Stereo decreased increased to %f\n", stereoseparation); - } - - if (IsKeyDown(theKeyMap, MAC_F8_KEY)) { - if (IsKeyDown(theKeyMap, MAC_SHIFT_KEY)) { - stereoseparation += 0.001; - } else { - stereoseparation += 0.010; - } - - printf("Stereo separation increased to %f\n", stereoseparation); - } - - - if(!console){ - if(mainmenu&&endgame==1)mainmenu=10; - if(IsKeyDown(theKeyMap, MAC_ESCAPE_KEY)&&!mainmenutogglekeydown&&(mainmenu==7&&entername)){ - for(j=0;j<255;j++){ - displaytext[0][j]=' '; - } - displaychars[0]=0; - displayselected=0; - entername=0; - mainmenutogglekeydown=1; - } - if((IsKeyDown(theKeyMap, MAC_ESCAPE_KEY)||(mainmenu==0&&((IsKeyDown(theKeyMap, jumpkey)||IsKeyDown(theKeyMap, MAC_SPACE_KEY)||(campaign)))&&!oldjumpkeydown&&campaign&&winfreeze))&&!mainmenutogglekeydown&&(!mainmenu||gameon||mainmenu==3||mainmenu==4||mainmenu==5||mainmenu==6||(mainmenu==7&&!entername)||mainmenu==9||mainmenu==11||mainmenu==13||mainmenu==17||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==1||mainmenu==2)mainmenu=0; - if(mainmenu&&musictoggle){ - if(mainmenu==1||mainmenu==2||mainmenu==100){ - OPENAL_SetFrequency(OPENAL_ALL, 0.001); - PlayStreamEx( stream_music3, strm[stream_music3], NULL, true); - OPENAL_SetPaused(channels[stream_music3], false); - OPENAL_SetVolume(channels[stream_music3], 256); - OPENAL_SetPaused(channels[music1], true); - } - } - if(!mainmenu){ - OPENAL_SetPaused(channels[stream_music3], true); - OPENAL_SetPaused(channels[music1], false); - } - } - if(mainmenu==3){ - float gLoc[3]={0,0,0}; - float vel[3]={0,0,0}; - OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f); - PlaySoundEx( fireendsound, samp[fireendsound], NULL, true); - OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel); - OPENAL_SetVolume(channels[fireendsound], 256); - OPENAL_SetPaused(channels[fireendsound], false); - OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f); - - flashr=1; - flashg=0; - flashb=0; - flashamount=1; - flashdelay=1; - - 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==13||mainmenu==10||mainmenu==11||mainmenu==100){ - float gLoc[3]={0,0,0}; - float vel[3]={0,0,0}; - OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f); - PlaySoundEx( fireendsound, samp[fireendsound], NULL, true); - OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel); - OPENAL_SetVolume(channels[fireendsound], 256); - OPENAL_SetPaused(channels[fireendsound], false); - OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f); - - flashr=1; - flashg=0; - flashb=0; - flashamount=1; - flashdelay=1; - } - if(mainmenu==3&&gameon)mainmenu=2; - if(mainmenu==3&&!gameon)mainmenu=1; - if(mainmenu==5&&gameon)mainmenu=2; - if(mainmenu==5&&!gameon)mainmenu=1; - if(mainmenu==4)mainmenu=3; - if(mainmenu==6)mainmenu=5; - if(mainmenu==7)mainmenu=1; - if(mainmenu==9)mainmenu=5; - if(mainmenu==11)mainmenu=5; - if(mainmenu==13)mainmenu=12; - if(mainmenu==10)mainmenu=5; - if(mainmenu==100){ - mainmenu=5; - gameon=0; - winfreeze=0; - } - mainmenutogglekeydown=1; - } - if(!IsKeyDown(theKeyMap, MAC_ESCAPE_KEY)){ - mainmenutogglekeydown=0; - } - } - - /*static bool minimaptogglekeydown; - if(IsKeyDown(theKeyMap, MAC_TAB_KEY)&&!minimaptogglekeydown){ - minimap=1-minimap; - minimaptogglekeydown=1; - } - if(!IsKeyDown(theKeyMap, MAC_TAB_KEY)){ - minimaptogglekeydown=0; - } - */ - - static bool minimaptogglekeydown; - if(IsKeyDown(theKeyMap, MAC_TAB_KEY)&&!minimaptogglekeydown&&tutoriallevel){ - if(tutorialstage!=51) - tutorialstagetime=tutorialmaxtime; - PlaySoundEx( consolefailsound, samp[consolefailsound], NULL, true); - OPENAL_SetVolume(channels[consolefailsound], 128); - OPENAL_SetPaused(channels[consolefailsound], false); - minimaptogglekeydown=1; - } - if(!IsKeyDown(theKeyMap, MAC_TAB_KEY)){ - minimaptogglekeydown=0; - } - - if(mainmenu){ - //menu buttons - if(mainmenu==1||mainmenu==2){ - if(Button()&&!oldbutton&&selected==1){ - if(!gameon){ - float gLoc[3]={0,0,0}; - float vel[3]={0,0,0}; - OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f); - PlaySoundEx( firestartsound, samp[firestartsound], NULL, true); - OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel); - OPENAL_SetVolume(channels[firestartsound], 256); - OPENAL_SetPaused(channels[firestartsound], false); - OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f); - - flashr=1; - flashg=0; - flashb=0; - flashamount=1; - flashdelay=1; - - //new game - if(accountactive!=-1)mainmenu=5; - else mainmenu=7; - /* - startbonustotal=0; - - loading=2; - loadtime=0; - if(firstload)TickOnceAfter(); - if(!firstload)LoadStuff(); - else { - Loadlevel(0); - } - mainmenu=0; - gameon=1; - OPENAL_SetPaused(channels[music3], true); */ - } - else - { - //resume - mainmenu=0; - OPENAL_SetPaused(channels[stream_music3], true); - OPENAL_SetPaused(channels[music1], false); - } - } - - if(Button()&&!oldbutton&&selected==2){ - float gLoc[3]={0,0,0}; - float vel[3]={0,0,0}; - OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f); - PlaySoundEx( firestartsound, samp[firestartsound], NULL, true); - OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel); - OPENAL_SetVolume(channels[firestartsound], 256); - OPENAL_SetPaused(channels[firestartsound], false); - OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f); - - flashr=1; - flashg=0; - flashb=0; - flashamount=1; - flashdelay=1; - - //options - - 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(Button()&&!oldbutton&&selected==3){ - float gLoc[3]={0,0,0}; - float vel[3]={0,0,0}; - OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f); - PlaySoundEx( fireendsound, samp[fireendsound], NULL, true); - OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel); - OPENAL_SetVolume(channels[fireendsound], 256); - OPENAL_SetPaused(channels[fireendsound], false); - OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f); - - flashr=1; - flashg=0; - flashb=0; - flashamount=1; - flashdelay=1; - - if(!gameon){ - //quit - tryquit=1; - OPENAL_SetPaused(channels[stream_music3], true); - } - else{ - //end game - gameon=0; - mainmenu=1; - } - } - if(Button())oldbutton=1; - else oldbutton=0; - } - - if(mainmenu==3){ - if(Button()&&!oldbutton&&selected!=-1){ - float gLoc[3]={0,0,0}; - float vel[3]={0,0,0}; - OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f); - PlaySoundEx( firestartsound, samp[firestartsound], NULL, true); - OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel); - OPENAL_SetVolume(channels[firestartsound], 256); - OPENAL_SetPaused(channels[firestartsound], false); - OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f); - } - if(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; - } - - - } - if(Button()&&!oldbutton&&selected==1){ - newdetail++; - if(newdetail>2)newdetail=0; - } - if(Button()&&!oldbutton&&selected==2){ - bloodtoggle++; - if(bloodtoggle>2)bloodtoggle=0; - } - if(Button()&&!oldbutton&&selected==3){ - difficulty++; - if(difficulty>2)difficulty=0; - } - if(Button()&&!oldbutton&&selected==4){ - ismotionblur=1-ismotionblur; - } - if(Button()&&!oldbutton&&selected==5){ - decals=1-decals; - } - if(Button()&&!oldbutton&&selected==6){ - musictoggle=1-musictoggle; - - if(!musictoggle){ - OPENAL_SetPaused(channels[music1], true); - OPENAL_SetPaused(channels[stream_music2], true); - OPENAL_SetPaused(channels[stream_music3], true); - - for(i=0;i<4;i++){ - oldmusicvolume[i]=0; - musicvolume[i]=0; - } - } - - if(musictoggle){ - PlayStreamEx( stream_music3, strm[stream_music3], NULL, true); - OPENAL_SetPaused(channels[stream_music3], false); - OPENAL_SetVolume(channels[stream_music3], 256); - } - } - if(Button()&&!oldbutton&&selected==9){ - invertmouse=1-invertmouse; - } - if(Button()&&!oldbutton&&selected==10){ - usermousesensitivity+=.2; - if(usermousesensitivity>2)usermousesensitivity=.2; - } - if(Button()&&!oldbutton&&selected==11){ - volume+=.1f; - if(volume>1.0001f)volume=0; - OPENAL_SetSFXMasterVolume((int)(volume*255)); - } - if(Button()&&!oldbutton&&selected==7){ - /*float gLoc[3]={0,0,0}; - float vel[3]={0,0,0}; - OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f); - PlaySoundEx( firestartsound, samp[firestartsound], NULL, true); - OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel); - OPENAL_SetVolume(channels[firestartsound], 256); - OPENAL_SetPaused(channels[firestartsound], false); - OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f); - */ - flashr=1; - flashg=0; - flashb=0; - flashamount=1; - flashdelay=1; - - //options - - mainmenu=4; - keyselect=-1; - } - if(Button() && !oldbutton && selected == 12) { - flashr=1; - flashg=0; - flashb=0; - flashamount=1; - flashdelay=1; - - newstereomode = stereomode; - mainmenu=18; - keyselect = -1; - } - if(Button() && !oldbutton && selected == 13) { - showdamagebar=!showdamagebar; - } - if(Button()&&!oldbutton&&selected==8){ - float gLoc[3]={0,0,0}; - float vel[3]={0,0,0}; - OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f); - PlaySoundEx( fireendsound, samp[fireendsound], NULL, true); - OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel); - OPENAL_SetVolume(channels[fireendsound], 256); - OPENAL_SetPaused(channels[fireendsound], false); - OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f); - - flashr=1; - flashg=0; - flashb=0; - flashamount=1; - flashdelay=1; - - 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(Button())oldbutton=1; - else oldbutton=0; - } - if(mainmenu==4){ - if(Button()&&!oldbutton&&selected!=-1&&keyselect==-1){ - float gLoc[3]={0,0,0}; - float vel[3]={0,0,0}; - OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f); - PlaySoundEx( firestartsound, samp[firestartsound], NULL, true); - OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel); - OPENAL_SetVolume(channels[firestartsound], 256); - OPENAL_SetPaused(channels[firestartsound], false); - OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f); - } - if(Button()&&!oldbutton&&selected<9&&keyselect==-1){ - keyselect=selected; - oldbuttons[0]=1; - oldbuttons[1]=1; - oldbuttons[2]=1; - } - if(keyselect!=-1){ - for(i=0;i<3;i++) - if(!buttons[i]&&!oldbutton&&!Button())oldbuttons[i]=0; - for(i=0;i<140;i++){ - if((IsKeyDown(theKeyMap, i)||(buttons[0]&&!oldbuttons[0]&&!oldbutton)||(buttons[1]&&!oldbuttons[1]&&!oldbutton))&&keyselect!=-1){ - if(i!=MAC_ESCAPE_KEY&&(strcmp(KeyToChar(i),"unknown")||(buttons[0]&&!oldbuttons[0]&&!oldbutton)||(buttons[1]&&!oldbuttons[1]&&!oldbutton))){ - float gLoc[3]={0,0,0}; - float vel[3]={0,0,0}; - OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f); - PlaySoundEx( fireendsound, samp[fireendsound], NULL, true); - OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel); - OPENAL_SetVolume(channels[fireendsound], 256); - OPENAL_SetPaused(channels[fireendsound], false); - OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f); - - int keynum; - keynum=i; - if(buttons[0]&&!oldbuttons[0])keynum=MAC_MOUSEBUTTON1; - if(buttons[1]&&!oldbuttons[1])keynum=MAC_MOUSEBUTTON2; - - - - if(keyselect==0)forwardkey=keynum; - if(keyselect==1)backkey=keynum; - if(keyselect==2)leftkey=keynum; - if(keyselect==3)rightkey=keynum; - if(keyselect==4)crouchkey=keynum; - if(keyselect==5)jumpkey=keynum; - if(keyselect==6)drawkey=keynum; - if(keyselect==7)throwkey=keynum; - if(keyselect==8)attackkey=keynum; - keyselect=-1; - } - } - }} - if(Button()&&!oldbutton&&selected==9){ - float gLoc[3]={0,0,0}; - float vel[3]={0,0,0}; - OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f); - PlaySoundEx( fireendsound, samp[fireendsound], NULL, true); - OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel); - OPENAL_SetVolume(channels[fireendsound], 256); - OPENAL_SetPaused(channels[fireendsound], false); - OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f); - - flashr=1; - flashg=0; - flashb=0; - flashamount=1; - flashdelay=1; - - 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){ - accountcampaignchoicesmade[accountactive]=0; - accountcampaignscore[accountactive]=0; - accountcampaigntime[accountactive]=0; - endgame=0; - } - - if(Button()&&!oldbutton&&selected==1){ - float gLoc[3]={0,0,0}; - float vel[3]={0,0,0}; - OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f); - PlaySoundEx( firestartsound, samp[firestartsound], NULL, true); - OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel); - OPENAL_SetVolume(channels[firestartsound], 256); - OPENAL_SetPaused(channels[firestartsound], false); - OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f); - - flashr=1; - flashg=0; - flashb=0; - flashamount=1; - flashdelay=1; - - startbonustotal=0; - - loading=2; - loadtime=0; - targetlevel=-1; - if(firstload)TickOnceAfter(); - if(!firstload)LoadStuff(); - else { - Loadlevel(-1); - } - - mainmenu=0; - gameon=1; - OPENAL_SetPaused(channels[stream_music3], true); - } - if(Button()&&!oldbutton&&selected-7>=accountcampaignchoicesmade[accountactive]){//selected>=7&&(selected-7<=campaignnumchoices)){ - float gLoc[3]={0,0,0}; - float vel[3]={0,0,0}; - OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f); - PlaySoundEx( firestartsound, samp[firestartsound], NULL, true); - OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel); - OPENAL_SetVolume(channels[firestartsound], 256); - OPENAL_SetPaused(channels[firestartsound], false); - OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f); - - flashr=1; - flashg=0; - flashb=0; - flashamount=1; - flashdelay=1; - - startbonustotal=0; - - loading=2; - loadtime=0; - targetlevel=7; - if(firstload)TickOnceAfter(); - if(!firstload)LoadStuff(); - //else { - for(i=0;i<255;i++){ - mapname[i]='\0'; - } - mapname[0]=':'; - mapname[1]='D'; - mapname[2]='a'; - mapname[3]='t'; - mapname[4]='a'; - mapname[5]=':'; - mapname[6]='M'; - mapname[7]='a'; - mapname[8]='p'; - mapname[9]='s'; - mapname[10]=':'; - strcat(mapname,campaignmapname[campaignchoicewhich[selected-7-accountcampaignchoicesmade[accountactive]]]); - whichchoice=selected-7-accountcampaignchoicesmade[accountactive]; - visibleloading=1; - stillloading=1; - Loadlevel(mapname); - //Loadlevel(campaignmapname[levelorder[selected-7]]); - campaign=1; - mainmenu=0; - gameon=1; - OPENAL_SetPaused(channels[stream_music3], true); - } - if(Button()&&!oldbutton&&selected==4){ - float gLoc[3]={0,0,0}; - float vel[3]={0,0,0}; - OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f); - PlaySoundEx( fireendsound, samp[fireendsound], NULL, true); - OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel); - OPENAL_SetVolume(channels[fireendsound], 256); - OPENAL_SetPaused(channels[fireendsound], false); - OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f); - - flashr=1; - flashg=0; - flashb=0; - flashamount=1; - flashdelay=1; - - if(mainmenu==5&&gameon)mainmenu=2; - if(mainmenu==5&&!gameon)mainmenu=1; - } - if(Button()&&!oldbutton&&selected==5){ - float gLoc[3]={0,0,0}; - float vel[3]={0,0,0}; - OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f); - PlaySoundEx( fireendsound, samp[fireendsound], NULL, true); - OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel); - OPENAL_SetVolume(channels[fireendsound], 256); - OPENAL_SetPaused(channels[fireendsound], false); - OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f); - - flashr=1; - flashg=0; - flashb=0; - flashamount=1; - flashdelay=1; - - mainmenu=7; - } - if(Button()&&!oldbutton&&selected==3){ - float gLoc[3]={0,0,0}; - float vel[3]={0,0,0}; - OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f); - PlaySoundEx( firestartsound, samp[firestartsound], NULL, true); - OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel); - OPENAL_SetVolume(channels[firestartsound], 256); - OPENAL_SetPaused(channels[firestartsound], false); - OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f); - - flashr=1; - flashg=0; - flashb=0; - flashamount=1; - flashdelay=1; - - mainmenu=6; - } - if(Button()&&!oldbutton&&selected==2){ - float gLoc[3]={0,0,0}; - float vel[3]={0,0,0}; - OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f); - PlaySoundEx( firestartsound, samp[firestartsound], NULL, true); - OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel); - OPENAL_SetVolume(channels[firestartsound], 256); - OPENAL_SetPaused(channels[firestartsound], false); - OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f); - - flashr=1; - flashg=0; - flashb=0; - flashamount=1; - flashdelay=1; - - mainmenu=9; - } - if(Button())oldbutton=1; - else oldbutton=0; - } - if(mainmenu==9){ - if(Button()&&!oldbutton&&selected=0&&selected<=accountprogress[accountactive]){ - float gLoc[3]={0,0,0}; - float vel[3]={0,0,0}; - OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f); - PlaySoundEx( firestartsound, samp[firestartsound], NULL, true); - OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel); - OPENAL_SetVolume(channels[firestartsound], 256); - OPENAL_SetPaused(channels[firestartsound], false); - OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f); - - flashr=1; - flashg=0; - flashb=0; - flashamount=1; - flashdelay=1; - - startbonustotal=0; - - loading=2; - loadtime=0; - targetlevel=selected; - if(firstload)TickOnceAfter(); - if(!firstload)LoadStuff(); - else { - Loadlevel(selected); - } - campaign=0; - - mainmenu=0; - gameon=1; - OPENAL_SetPaused(channels[stream_music3], true); - } - if(Button()&&!oldbutton&&selected==numchallengelevels){ - float gLoc[3]={0,0,0}; - float vel[3]={0,0,0}; - OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f); - PlaySoundEx( fireendsound, samp[fireendsound], NULL, true); - OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel); - OPENAL_SetVolume(channels[fireendsound], 256); - OPENAL_SetPaused(channels[fireendsound], false); - OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f); - - flashr=1; - flashg=0; - flashb=0; - flashamount=1; - flashdelay=1; - - mainmenu=5; - } - if(Button())oldbutton=1; - else oldbutton=0; - } - if(mainmenu==11){ - if(Button()&&!oldbutton&&selected=0&&selected<=accountprogress[accountactive]){ - float gLoc[3]={0,0,0}; - float vel[3]={0,0,0}; - OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f); - PlaySoundEx( firestartsound, samp[firestartsound], NULL, true); - OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel); - OPENAL_SetVolume(channels[firestartsound], 256); - OPENAL_SetPaused(channels[firestartsound], false); - OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f); - - flashr=1; - flashg=0; - flashb=0; - flashamount=1; - flashdelay=1; - - startbonustotal=0; - - loading=2; - loadtime=0; - targetlevel=selected; - if(firstload)TickOnceAfter(); - if(!firstload)LoadStuff(); - else { - Loadlevel(selected); - } - campaign=0; - - mainmenu=0; - gameon=1; - OPENAL_SetPaused(channels[stream_music3], true); - } - if(Button()&&!oldbutton&&selected==numchallengelevels){ - float gLoc[3]={0,0,0}; - float vel[3]={0,0,0}; - OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f); - PlaySoundEx( fireendsound, samp[fireendsound], NULL, true); - OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel); - OPENAL_SetVolume(channels[fireendsound], 256); - OPENAL_SetPaused(channels[fireendsound], false); - OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f); - - flashr=1; - flashg=0; - flashb=0; - flashamount=1; - flashdelay=1; - - mainmenu=5; - } - if(Button())oldbutton=1; - else oldbutton=0; - } - if(mainmenu==10){ - endgame=2; - if(Button()&&!oldbutton&&selected==3){ - float gLoc[3]={0,0,0}; - float vel[3]={0,0,0}; - OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f); - PlaySoundEx( fireendsound, samp[fireendsound], NULL, true); - OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel); - OPENAL_SetVolume(channels[fireendsound], 256); - OPENAL_SetPaused(channels[fireendsound], false); - OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f); - - flashr=1; - flashg=0; - flashb=0; - flashamount=1; - flashdelay=1; - - mainmenu=5; - } - if(Button())oldbutton=1; - else oldbutton=0; - } - - if(mainmenu==6){ - if(Button()&&!oldbutton&&selected!=-1){ - float gLoc[3]={0,0,0}; - float vel[3]={0,0,0}; - OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f); - PlaySoundEx( firestartsound, samp[firestartsound], NULL, true); - OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel); - OPENAL_SetVolume(channels[firestartsound], 256); - OPENAL_SetPaused(channels[firestartsound], false); - OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f); - } - if(Button()&&!oldbutton&&selected==1){ - float gLoc[3]={0,0,0}; - float vel[3]={0,0,0}; - OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f); - PlaySoundEx( fireendsound, samp[fireendsound], NULL, true); - OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel); - OPENAL_SetVolume(channels[fireendsound], 256); - OPENAL_SetPaused(channels[fireendsound], false); - OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f); - - flashr=1; - flashg=0; - flashb=0; - flashamount=1; - flashdelay=1; - - for(i=accountactive;i0&&selected= stereoCount ) { - newstereomode = stereoNone; - } - } - } - - if(buttons[0]&&!oldbutton&&selected==1) { - stereoseparation+=0.001; - } - if(buttons[1]&&!oldbutton&&selected==1) { - stereoseparation-=0.001; - } - - if(Button()&&!oldbutton&&selected==2) { - stereoreverse =! stereoreverse; - } - - if(Button()&&!oldbutton&&selected==3) { - flashr=1; - flashg=0; - flashb=0; - flashamount=1; - flashdelay=1; - - stereomode = newstereomode; - InitStereo(stereomode); - - mainmenu=3; - } - - if(Button() || buttons[1])oldbutton=1; - else oldbutton=0; - } - - - if(Button()||buttons[1])oldbutton=1; - else oldbutton=0; - - if(IsKeyDown(theKeyMap, MAC_Q_KEY)&&IsKeyDown(theKeyMap, MAC_COMMAND_KEY)){ - 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){ - for(i=0;i<140;i++){ - if(IsKeyDown(theKeyMap, i)){ - togglekeydelay[i]+=multiplier; - if(togglekeydelay[i]>.4){ - togglekey[i]=0; - togglekeydelay[i]=.36; - } - if(!togglekey[i]){ - if(KeyToSingleChar(i)!='\0'&&displaychars[0]<60){ - for(j=255;j>=displayselected+1;j--){ - displaytext[0][j]=displaytext[0][j-1]; - } - displaytext[0][displayselected]=KeyToSingleChar(i); - if(IsKeyDown(theKeyMap, MAC_SHIFT_KEY))displaytext[0][displayselected]=Shift(displaytext[0][displayselected]); - displayselected++; - displaychars[0]++; - } - if(i==MAC_DELETE_KEY&&displayselected!=0){ - for(j=displayselected-1;j<255;j++){ - displaytext[0][j]=displaytext[0][j+1]; - } - displaytext[0][255]=' '; - displayselected--; - displaychars[0]--; - } - if(i==MAC_ARROW_LEFT_KEY&&displayselected!=0){ - displayselected--; - } - if(i==MAC_ARROW_RIGHT_KEY&&displayselected.4){ - togglekey[i]=0; - togglekeydelay[i]=.36; - } - if(!togglekey[i]){ - if(KeyToSingleChar(i)!='\0'&&displaychars[0]<60){ - for(j=255;j>=displayselected+1;j--){ - displaytext[0][j]=displaytext[0][j-1]; - } - displaytext[0][displayselected]=KeyToSingleChar(i); - if(IsKeyDown(theKeyMap, MAC_SHIFT_KEY))displaytext[0][displayselected]=Shift(displaytext[0][displayselected]); - displayselected++; - displaychars[0]++; - } - if(i==MAC_DELETE_KEY&&displayselected!=0){ - for(j=displayselected-1;j<255;j++){ - displaytext[0][j]=displaytext[0][j+1]; - } - displaytext[0][255]=' '; - displayselected--; - displaychars[0]--; - } - if(i==MAC_ARROW_LEFT_KEY&&displayselected!=0){ - displayselected--; - } - if(i==MAC_ARROW_RIGHT_KEY&&displayselected.4){ - togglekey[i]=0; - togglekeydelay[i]=.36; - } - if(!togglekey[i]){ - if(KeyToSingleChar(i)!='\0'&&consolechars[0]<255){ - for(j=255;j>=consoleselected+1;j--){ - consoletext[0][j]=consoletext[0][j-1]; - } - consoletext[0][consoleselected]=KeyToSingleChar(i); - if(IsKeyDown(theKeyMap, MAC_SHIFT_KEY))consoletext[0][consoleselected]=Shift(consoletext[0][consoleselected]); - consoleselected++; - consolechars[0]++; - } - else if(i==MAC_ENTER_KEY){ - for(j=255;j>=consoleselected+1;j--){ - consoletext[0][j]=consoletext[0][j-1]; - } - consoletext[0][consoleselected]='\n'; - consoleselected++; - consolechars[0]++; - } - if(i==MAC_DELETE_KEY&&consoleselected!=0){ - for(j=consoleselected-1;j<255;j++){ - consoletext[0][j]=consoletext[0][j+1]; - } - consoletext[0][255]=' '; - consoleselected--; - consolechars[0]--; - } - if(i==MAC_ARROW_UP_KEY){ - if(archiveselected<14)archiveselected++; - for(j=0;j<255;j++){ - consolechars[0]=consolechars[archiveselected]; - consoletext[0][j]=consoletext[archiveselected][j]; - consoleselected=consolechars[0]; - } - } - if(i==MAC_ARROW_DOWN_KEY){ - if(archiveselected>0)archiveselected--; - for(j=0;j<255;j++){ - consolechars[0]=consolechars[archiveselected]; - consoletext[0][j]=consoletext[archiveselected][j]; - consoleselected=consolechars[0]; - } - } - if(i==MAC_ARROW_LEFT_KEY&&consoleselected!=0){ - consoleselected--; - } - if(i==MAC_ARROW_RIGHT_KEY&&consoleselected0){ - 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; - } - } - } - togglekey[i]=1; - } - else { - togglekey[i]=0; - togglekeydelay[i]=0; - } - } - - consoleblinkdelay-=multiplier; - if(consoleblinkdelay<=0){ - consoleblinkdelay=.3; - consoleblink=1-consoleblink; - } - } - - if(IsKeyDown(theKeyMap, MAC_Q_KEY)&&IsKeyDown(theKeyMap, MAC_COMMAND_KEY)){ - 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); - PlaySoundEx( consolesuccesssound, samp[consolesuccesssound], NULL, true); - OPENAL_SetVolume(channels[consolesuccesssound], 256); - OPENAL_SetPaused(channels[consolesuccesssound], false); - } - if(winfreeze==0)oldwinfreeze=winfreeze; - else oldwinfreeze++; - - if((IsKeyDown(theKeyMap, jumpkey)||IsKeyDown(theKeyMap, MAC_SPACE_KEY))&&!oldjumpkeydown&&!campaign){ - if(winfreeze)winfreeze=0; - oldjumpkeydown=1; - } - if((IsKeyDown(theKeyMap, MAC_ESCAPE_KEY))&&!campaign&&gameon){ - if(winfreeze){ - mainmenu=9; - gameon=0; - } - } - if((IsKeyDown(theKeyMap, jumpkey)||IsKeyDown(theKeyMap, MAC_SPACE_KEY))){ - oldjumpkeydown=1; - } - if(!IsKeyDown(theKeyMap, jumpkey)&&!IsKeyDown(theKeyMap, MAC_SPACE_KEY))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||(IsKeyDown(theKeyMap, 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; - } - if(tutorialstage==2){ - tutorialmaxtime=2; - } - if(tutorialstage==3){ - tutorialmaxtime=600; - } - if(tutorialstage==4){ - tutorialmaxtime=1000; - } - if(tutorialstage==5){ - tutorialmaxtime=600; - } - if(tutorialstage==6){ - tutorialmaxtime=600; - } - if(tutorialstage==7){ - tutorialmaxtime=600; - } - if(tutorialstage==8){ - tutorialmaxtime=600; - } - if(tutorialstage==9){ - tutorialmaxtime=600; - } - if(tutorialstage==10){ - tutorialmaxtime=2; - } - if(tutorialstage==11){ - tutorialmaxtime=1000; - } - if(tutorialstage==12){ - tutorialmaxtime=1000; - } - if(tutorialstage==13){ - tutorialmaxtime=2; - } - 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; - - float gLoc[3]; - float vel[3]; - gLoc[0]=player[1].coords.x; - gLoc[1]=player[1].coords.y; - gLoc[2]=player[1].coords.z; - vel[0]=0; - vel[1]=0; - vel[2]=0; - PlaySoundEx( fireendsound, samp[fireendsound], NULL, true); - OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel); - OPENAL_SetVolume(channels[fireendsound], 256); - OPENAL_SetPaused(channels[fireendsound], false); - - 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){ - PlaySoundEx( consolesuccesssound, samp[consolesuccesssound], NULL, true); - OPENAL_SetVolume(channels[consolesuccesssound], 256); - OPENAL_SetPaused(channels[consolesuccesssound], false); - } - - 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){ - PlaySoundEx( consolesuccesssound, samp[consolesuccesssound], NULL, true); - OPENAL_SetVolume(channels[consolesuccesssound], 256); - OPENAL_SetPaused(channels[consolesuccesssound], false); - } - } - else - if(bonustime==0){ - PlaySoundEx( fireendsound, samp[fireendsound], NULL, true); - OPENAL_SetVolume(channels[fireendsound], 256); - OPENAL_SetPaused(channels[fireendsound], false); - } - 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; - sprites.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)OPENAL_SetPaused(channels[whooshsound], true); - } - float gLoc[3]; - float vel[3]; - gLoc[0]=player[k].coords.x; - gLoc[1]=player[k].coords.y; - gLoc[2]=player[k].coords.z; - vel[0]=player[k].velocity.x; - vel[1]=player[k].velocity.y; - vel[2]=player[k].velocity.z; - PlaySoundEx( jumpsound, samp[jumpsound], NULL, true); - OPENAL_3D_SetAttributes(channels[jumpsound], gLoc, vel); - OPENAL_SetVolume(channels[jumpsound], 128); - OPENAL_SetPaused(channels[jumpsound], false); - - 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; - - float gLoc[3]; - float vel[3]; - gLoc[0]=player[k].coords.x; - gLoc[1]=player[k].coords.y; - gLoc[2]=player[k].coords.z; - vel[0]=player[k].velocity.x; - vel[1]=player[k].velocity.y; - vel[2]=player[k].velocity.z; - if(k==0){ - PlaySoundEx( whooshsound, samp[whooshsound], NULL, true); - OPENAL_3D_SetAttributes(channels[whooshsound], gLoc, vel); - OPENAL_SetVolume(channels[whooshsound], 128); - OPENAL_SetPaused(channels[whooshsound], false); - } - } - player[k].velocity.y+=gravity; - } - } - } - } - player[k].realoldcoords=player[k].coords; - } - - static XYZ oldviewer; - - if(indialogue==-1){ - player[0].forwardkeydown=IsKeyDown(theKeyMap, forwardkey); - player[0].leftkeydown=IsKeyDown(theKeyMap, leftkey); - player[0].backkeydown=IsKeyDown(theKeyMap, backkey); - player[0].rightkeydown=IsKeyDown(theKeyMap, rightkey); - player[0].jumpkeydown=IsKeyDown(theKeyMap, jumpkey); - player[0].crouchkeydown=IsKeyDown(theKeyMap, crouchkey); - player[0].drawkeydown=IsKeyDown(theKeyMap, drawkey); - player[0].throwkeydown=IsKeyDown(theKeyMap, 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(IsKeyDown(theKeyMap, forwardkey))viewer+=facing*multiplier*4; - if(IsKeyDown(theKeyMap, backkey))viewer-=facing*multiplier*4; - if(IsKeyDown(theKeyMap, leftkey))viewer+=DoRotation(flatfacing*multiplier,0,90,0)*4; - if(IsKeyDown(theKeyMap, rightkey))viewer+=DoRotation(flatfacing*multiplier,0,-90,0)*4; - if(IsKeyDown(theKeyMap, jumpkey))viewer.y+=multiplier*4; - if(IsKeyDown(theKeyMap, crouchkey))viewer.y-=multiplier*4; - if(!endkeydown&&(IsKeyDown(theKeyMap, MAC_1_KEY)||IsKeyDown(theKeyMap, MAC_2_KEY)||IsKeyDown(theKeyMap, MAC_3_KEY)||IsKeyDown(theKeyMap, MAC_4_KEY)||IsKeyDown(theKeyMap, MAC_5_KEY) - ||IsKeyDown(theKeyMap, MAC_6_KEY)||IsKeyDown(theKeyMap, MAC_7_KEY)||IsKeyDown(theKeyMap, MAC_8_KEY)||IsKeyDown(theKeyMap, MAC_9_KEY)||IsKeyDown(theKeyMap, MAC_0_KEY) - ||IsKeyDown(theKeyMap, MAC_MINUS_KEY))){ - int whichend; - if(IsKeyDown(theKeyMap, MAC_1_KEY))whichend=1; - if(IsKeyDown(theKeyMap, MAC_2_KEY))whichend=2; - if(IsKeyDown(theKeyMap, MAC_3_KEY))whichend=3; - if(IsKeyDown(theKeyMap, MAC_4_KEY))whichend=4; - if(IsKeyDown(theKeyMap, MAC_5_KEY))whichend=5; - if(IsKeyDown(theKeyMap, MAC_6_KEY))whichend=6; - if(IsKeyDown(theKeyMap, MAC_7_KEY))whichend=7; - if(IsKeyDown(theKeyMap, MAC_8_KEY))whichend=8; - if(IsKeyDown(theKeyMap, MAC_9_KEY))whichend=9; - if(IsKeyDown(theKeyMap, MAC_0_KEY))whichend=0; - if(IsKeyDown(theKeyMap, MAC_MINUS_KEY))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){ - OPENAL_SetPaused(channels[whooshsound], true); - viewer=dialoguecamera[whichdialogue][indialogue]; - if(viewer.y0.5) - if((!endkeydown&&(IsKeyDown(theKeyMap, MAC_1_KEY)||IsKeyDown(theKeyMap, MAC_2_KEY)||IsKeyDown(theKeyMap, MAC_3_KEY)||IsKeyDown(theKeyMap, MAC_4_KEY)||IsKeyDown(theKeyMap, MAC_5_KEY) - ||IsKeyDown(theKeyMap, MAC_6_KEY)||IsKeyDown(theKeyMap, MAC_7_KEY)||IsKeyDown(theKeyMap, MAC_8_KEY)||IsKeyDown(theKeyMap, MAC_9_KEY)||IsKeyDown(theKeyMap, MAC_0_KEY) - ||IsKeyDown(theKeyMap, MAC_MINUS_KEY)))||(IsKeyDown(theKeyMap, 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(!IsKeyDown(theKeyMap, MAC_J_KEY)){ - envtogglekeydown=0; - } - - if(IsKeyDown(theKeyMap, MAC_C_KEY)&&!cameratogglekeydown&&debugmode){ - cameramode=1-cameramode; - cameratogglekeydown=1; - } - - if(!IsKeyDown(theKeyMap, MAC_C_KEY)){ - cameratogglekeydown=0; - } - - if(IsKeyDown(theKeyMap, MAC_X_KEY)&&!IsKeyDown(theKeyMap, MAC_SHIFT_KEY)&&!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(IsKeyDown(theKeyMap, MAC_X_KEY)&&IsKeyDown(theKeyMap, MAC_SHIFT_KEY)&&!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(IsKeyDown(theKeyMap, MAC_DELETE_KEY)&&editorenabled&&!drawmodetogglekeydown&&IsKeyDown(theKeyMap, MAC_CONTROL_KEY)){ - 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(IsKeyDown(theKeyMap, MAC_M_KEY)&&!drawmodetogglekeydown&&!IsKeyDown(theKeyMap, MAC_SHIFT_KEY)&&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(IsKeyDown(theKeyMap, MAC_PERIOD_KEY)&&!drawmodetogglekeydown&&editorenabled){ - pathpointselected++; - if(pathpointselected>=numpathpoints)pathpointselected=-1; - drawmodetogglekeydown=1; - } - if(IsKeyDown(theKeyMap, MAC_COMMA_KEY)&&!IsKeyDown(theKeyMap, MAC_SHIFT_KEY)&&!drawmodetogglekeydown&&editorenabled){ - pathpointselected--; - if(pathpointselected<=-2)pathpointselected=numpathpoints-1; - drawmodetogglekeydown=1; - } - if(IsKeyDown(theKeyMap, MAC_COMMA_KEY)&&IsKeyDown(theKeyMap, MAC_SHIFT_KEY)&&!drawmodetogglekeydown&&editorenabled){ - if(pathpointselected!=-1){ - numpathpoints--; - pathpoint[pathpointselected]=pathpoint[numpathpoints]; - numpathpointconnect[pathpointselected]=numpathpointconnect[numpathpoints]; - for(i=0;ifiretype)editortype=0; - drawmodetogglekeydown=1; - } - - if(IsKeyDown(theKeyMap, MAC_ARROW_LEFT_KEY)&&editorenabled&&!IsKeyDown(theKeyMap, MAC_SHIFT_KEY)&&!IsKeyDown(theKeyMap, MAC_CONTROL_KEY)){ - editorrotation-=multiplier*100; - if(editorrotation<-.01)editorrotation=-.01; - drawmodetogglekeydown=1; - } - - if(IsKeyDown(theKeyMap, MAC_ARROW_RIGHT_KEY)&&editorenabled&&!IsKeyDown(theKeyMap, MAC_SHIFT_KEY)&&!IsKeyDown(theKeyMap, MAC_CONTROL_KEY)){ - editorrotation+=multiplier*100; - drawmodetogglekeydown=1; - } - - if(IsKeyDown(theKeyMap, MAC_ARROW_UP_KEY)&&editorenabled&&!IsKeyDown(theKeyMap, MAC_CONTROL_KEY)){ - editorsize+=multiplier; - drawmodetogglekeydown=1; - } - - if(IsKeyDown(theKeyMap, MAC_ARROW_DOWN_KEY)&&editorenabled&&!IsKeyDown(theKeyMap, MAC_CONTROL_KEY)){ - editorsize-=multiplier; - if(editorsize<.1)editorsize=.1; - drawmodetogglekeydown=1; - } - - - if(IsKeyDown(theKeyMap, MAC_ARROW_LEFT_KEY)&&!drawmodetogglekeydown&&editorenabled&&IsKeyDown(theKeyMap, MAC_SHIFT_KEY)&&IsKeyDown(theKeyMap, MAC_CONTROL_KEY)){ - mapradius-=multiplier*10; - } - - if(IsKeyDown(theKeyMap, MAC_ARROW_RIGHT_KEY)&&!drawmodetogglekeydown&&editorenabled&&IsKeyDown(theKeyMap, MAC_SHIFT_KEY)&&IsKeyDown(theKeyMap, MAC_CONTROL_KEY)){ - mapradius+=multiplier*10; - } - if(IsKeyDown(theKeyMap, MAC_ARROW_UP_KEY)&&editorenabled&&IsKeyDown(theKeyMap, MAC_CONTROL_KEY)){ - editorrotation2+=multiplier*100; - } - - if(IsKeyDown(theKeyMap, MAC_ARROW_DOWN_KEY)&&editorenabled&&IsKeyDown(theKeyMap, MAC_CONTROL_KEY)){ - editorrotation2-=multiplier*100; - if(editorrotation2<-.01)editorrotation2=-.01; - } - if(IsKeyDown(theKeyMap, MAC_DELETE_KEY)&&editorenabled&&objects.numobjects&&!drawmodetogglekeydown&&!IsKeyDown(theKeyMap, MAC_SHIFT_KEY)){ - int closest=-1; - float closestdist=-1; - float distance; - for(i=0;i0&&closest>=0)objects.DeleteObject(closest); - drawmodetogglekeydown=1; - } - - - if(!IsKeyDown(theKeyMap, MAC_M_KEY)&&!IsKeyDown(theKeyMap, MAC_ARROW_LEFT_KEY)&&!IsKeyDown(theKeyMap, MAC_COMMA_KEY)&&!IsKeyDown(theKeyMap, MAC_PERIOD_KEY)&&!IsKeyDown(theKeyMap, MAC_ARROW_RIGHT_KEY)&&!IsKeyDown(theKeyMap, MAC_DELETE_KEY)&&!IsKeyDown(theKeyMap, MAC_P_KEY)){ - drawmodetogglekeydown=0; - } - - if(IsKeyDown(theKeyMap, MAC_N_KEY)&&!IsKeyDown(theKeyMap, MAC_CONTROL_KEY)&&!texturesizetogglekeydown&&debugmode){ - //if(!player[0].skeleton.free)player[0].damage+=500; - player[0].RagDoll(0); - //player[0].spurt=1; - //player[0].DoDamage(1000); - - float gLoc[3]; - float vel[3]; - gLoc[0]=player[0].coords.x; - gLoc[1]=player[0].coords.y; - gLoc[2]=player[0].coords.z; - vel[0]=player[0].velocity.x; - vel[1]=player[0].velocity.y; - vel[2]=player[0].velocity.z; - PlaySoundEx( whooshsound, samp[whooshsound], NULL, true); - OPENAL_3D_SetAttributes(channels[whooshsound], gLoc, vel); - OPENAL_SetVolume(channels[whooshsound], 128); - OPENAL_SetPaused(channels[whooshsound], false); - //OPENAL_SetPaused(channels[whooshsound], true); - - texturesizetogglekeydown=1; - } - - if(IsKeyDown(theKeyMap, MAC_N_KEY)&&IsKeyDown(theKeyMap, MAC_CONTROL_KEY)&&!texturesizetogglekeydown&&debugmode){ - - int closest=-1; - float closestdist=-1; - float distance; - for(i=0;iw; + newscreenheight = (int) resolutions[0]->h; } - - static XYZ relative; - static int randattack; - //Attack - static bool playerrealattackkeydown=0; - - if(!buttons[0])oldbutton=0; - if(!IsKeyDown(theKeyMap, attackkey))oldattackkey=0; - if(oldattackkey)player[0].attackkeydown=0; - if(oldattackkey)playerrealattackkeydown=0; - if(!oldattackkey)playerrealattackkeydown=IsKeyDown(theKeyMap, 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=IsKeyDown(theKeyMap, attackkey); - if(IsKeyDown(theKeyMap, attackkey)&&!oldattackkey&&!player[0].backkeydown){ - for(k=0;k2) newdetail=0; + break; + case 2: + bloodtoggle++; + if(bloodtoggle>2) bloodtoggle=0; + break; + case 3: + difficulty++; + if(difficulty>2) difficulty=0; + break; + case 4: + ismotionblur = !ismotionblur; + break; + case 5: + decals = !decals; + break; + case 6: + musictoggle = !musictoggle; + + if(musictoggle) { + emit_stream_np(stream_menutheme); + } else { + pause_sound(leveltheme); + pause_sound(stream_fighttheme); + pause_sound(stream_menutheme); + + for(int i=0;i<4;i++){ + oldmusicvolume[i]=0; + musicvolume[i]=0; } } - if(!hostile||indialogue!=-1)player[0].attackkeydown=0; - - for(k=0;k1&&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++; - } - } - } - } + break; + case 7: // controls + flash(); + mainmenu=4; + selected=-1; + keyselect=-1; + break; + case 8: + flash(); + + SaveSettings(*this); + mainmenu=gameon?2:1; + break; + case 9: + invertmouse = !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; + } + break; + case 4: + if(!waiting) { + fireSound(); + if(selected<(debugmode?10:9) && keyselect==-1) + keyselect=selected; + if(keyselect!=-1) + setKeySelected(); + if(selected==(debugmode?10:9)){ + flash(); + mainmenu=3; + } + } + break; + case 5: + fireSound(); + flash(); + if((selected-NB_CAMPAIGN_MENU_ITEM >= accountactive->getCampaignChoicesMade())) { + startbonustotal=0; - //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)){ - static float gLoc[3]; - static float vel[3]; - gLoc[0]=player[i].coords.x; - gLoc[1]=player[i].coords.y; - gLoc[2]=player[i].coords.z; - vel[0]=player[i].velocity.x; - vel[1]=player[i].velocity.y; - vel[2]=player[i].velocity.z; - if(tutoriallevel!=1){ - PlaySoundEx( heavyimpactsound, samp[heavyimpactsound], NULL, true); - OPENAL_3D_SetAttributes(channels[heavyimpactsound], gLoc, vel); - OPENAL_SetVolume(channels[heavyimpactsound], 256); - OPENAL_SetPaused(channels[heavyimpactsound], false); - } - //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){ - bonus=aimbonus; - bonustime=0; - bonusvalue=150; - } - player[i].DoDamage(findLengthfast(&rotatetarget)/4); - player[k].RagDoll(0); - if(player[k].damage>player[k].damagetolerance-findLengthfast(&rotatetarget)/4&&!player[k].dead){ - bonus=aimbonus; - bonustime=0; - bonusvalue=150; - } - player[k].DoDamage(findLengthfast(&rotatetarget)/4); - - //if(player[i].skeleton.oldfree){ - for(j=0;jgetCampaignChoicesMade(); + actuallevel=(accountactive->getCampaignChoicesMade()>0?campaignlevels[accountactive->getCampaignChoicesMade()-1].nextlevel[whichchoice]:0); + visibleloading=1; + stillloading=1; + Loadlevel(campaignlevels[actuallevel].mapname.c_str()); + campaign=1; + mainmenu=0; + gameon=1; + pause_sound(stream_menutheme); + } + switch(selected){ + case 1: + startbonustotal=0; + + loading=2; + loadtime=0; + targetlevel=-1; + if(firstload) { + TickOnceAfter(); + } else + LoadStuff(); + Loadlevel(-1); + + mainmenu=0; + gameon=1; + pause_sound(stream_menutheme); + break; + case 2: + mainmenu=9; + break; + case 3: + mainmenu=6; + break; + case 4: + mainmenu=(gameon?2:1); + break; + case 5: + mainmenu=7; + break; + case 6: + vector campaigns = ListCampaigns(); + vector::iterator c; + if ((c = find(campaigns.begin(),campaigns.end(),accountactive->getCurrentCampaign()))==campaigns.end()) { + if(!campaigns.empty()) + accountactive->setCurrentCampaign(campaigns.front()); + } else { + c++; + if(c==campaigns.end()) + c=campaigns.begin(); + accountactive->setCurrentCampaign(*c); + } + LoadCampaign(); + break; + } + break; + case 6: + fireSound(); + if(selected==1) { + flash(); + accountactive = Account::destroy(accountactive); + mainmenu=7; + } else if(selected==2) { + flash(); + mainmenu=5; + } + break; + case 7: + fireSound(); + if(selected==0 && Account::getNbAccounts()<8){ + entername=1; + } else if (selected < Account::getNbAccounts()+1) { + flash(); + mainmenu=5; + accountactive=Account::get(selected-1); + } else if (selected == Account::getNbAccounts()+1) { + flash(); + mainmenu=5; + for(int j=0;j<255;j++){ + displaytext[0][j]=0; + } + displaychars[0]=0; + displayselected=0; + entername=0; + } + break; + case 8: + fireSound(); + flash(); + if(selected<=2) + accountactive->setDifficulty(selected); + mainmenu=5; + break; + case 9: + if(selectedgetProgress()){ + fireSound(); + flash(); - for(k=0;k= stereoCount) + newstereomode = stereoNone; + } + } else if(selected==2) { + stereoreverse = !stereoreverse; + } else if(selected==3) { + flash(); + mainmenu=3; + + stereomode = newstereomode; + InitStereo(stereomode); + } + } + break; + } + } - //pile + if(Input::isKeyDown(SDLK_q) && Input::isKeyDown(SDLK_LMETA)){ + tryquit=1; + if(mainmenu==3) { + SaveSettings(*this); + } + } - if(!IsKeyDown(theKeyMap, MAC_N_KEY)){ - texturesizetogglekeydown=0; - } + OPENAL_SetFrequency(channels[stream_menutheme], 22050); - for(k=0;knumchallengelevels-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(Input::isKeyDown(SDLK_F8)){ + if(Input::isKeyDown(SDLK_LSHIFT)) + stereoseparation += 0.001; + else + stereoseparation += 0.010; + printf("Stereo separation increased to %f\n", stereoseparation); + } - 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){ - float gLoc[3]; - float vel[3]; - gLoc[0]=player[i].coords.x; - gLoc[1]=player[i].coords.y; - gLoc[2]=player[i].coords.z; - vel[0]=player[i].velocity.x; - vel[1]=player[i].velocity.y; - vel[2]=player[i].velocity.z; - if(weapons.type[j]!=staff){ - PlaySoundEx( knifedrawsound, samp[knifedrawsound], NULL, true); - OPENAL_3D_SetAttributes(channels[knifedrawsound], gLoc, vel); - OPENAL_SetVolume(channels[knifedrawsound], 128); - OPENAL_SetPaused(channels[knifedrawsound], false); - } - - 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){ - float gLoc[3]; - float vel[3]; - gLoc[0]=player[i].coords.x; - gLoc[1]=player[i].coords.y; - gLoc[2]=player[i].coords.z; - vel[0]=player[i].velocity.x; - vel[1]=player[i].velocity.y; - vel[2]=player[i].velocity.z; - if(weapons.type[k]!=staff){ - PlaySoundEx( knifedrawsound, samp[knifedrawsound], NULL, true); - OPENAL_3D_SetAttributes(channels[knifedrawsound], gLoc, vel); - OPENAL_SetVolume(channels[knifedrawsound], 128); - OPENAL_SetPaused(channels[knifedrawsound], false); - } - - 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){ - float gLoc[3]; - float vel[3]; - gLoc[0]=player[i].coords.x; - gLoc[1]=player[i].coords.y; - gLoc[2]=player[i].coords.z; - vel[0]=player[i].velocity.x; - vel[1]=player[i].velocity.y; - vel[2]=player[i].velocity.z; - 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){ - PlaySoundEx( knifedrawsound, samp[knifedrawsound], NULL, true); - OPENAL_3D_SetAttributes(channels[knifedrawsound], gLoc, vel); - OPENAL_SetVolume(channels[knifedrawsound], 128); - OPENAL_SetPaused(channels[knifedrawsound], false); - } - } - if(fleshstuck){ - PlaySoundEx( fleshstabremovesound, samp[fleshstabremovesound], NULL, true); - OPENAL_3D_SetAttributes(channels[fleshstabremovesound], gLoc, vel); - OPENAL_SetVolume(channels[fleshstabremovesound], 128); - OPENAL_SetPaused(channels[fleshstabremovesound], false); - } - - 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)sprites.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;j unused + 18 stereo configuration + */ + + if(!console) { + //campaign over? + if(mainmenu&&endgame==1) + mainmenu=10; + //go to level select after completing a campaign level + if(campaign&&winfreeze&&mainmenu==0&&campaignlevels[actuallevel].choosenext==1) { + mainmenu=5; + gameon=0; + winfreeze=0; + fireSound(); + flash(); + if(musictoggle) { + OPENAL_SetFrequency(OPENAL_ALL, 0.001); + emit_stream_np(stream_menutheme); + pause_sound(leveltheme); + } + LoadCampaign(); + } + //escape key pressed + //TODO: there must be code somewhere else that handles clicking the Back button, merge it with this + if(Input::isKeyPressed(SDLK_ESCAPE)&& + (gameon||mainmenu==0||(mainmenu>=3&&mainmenu!=8&&!(mainmenu==7&&entername)))) { + selected=-1; + if(mainmenu==0&&!winfreeze) + mainmenu=2; //pause + else if(mainmenu==1||mainmenu==2){ + mainmenu=0; //unpause + } + //play menu theme + if(musictoggle&&(mainmenu==1||mainmenu==2)){ + OPENAL_SetFrequency(OPENAL_ALL, 0.001); + emit_stream_np(stream_menutheme); + pause_sound(leveltheme); + } + //on resume, play level music + if(!mainmenu){ + pause_sound(stream_menutheme); + resume_stream(leveltheme); + } + //finished with settings menu + if(mainmenu==3){ + SaveSettings(*this); + } + //effects + if(mainmenu>=3&&mainmenu!=8){ + fireSound(); + flash(); + } + //go back + switch(mainmenu){ + case 3: case 5: + mainmenu=gameon?2:1; break; + case 4: case 18: + mainmenu=3; break; + case 6: case 7: case 9: case 10: + mainmenu=5; break; + } + } + } - if(i==0||!player[0].dead||player[i].weaponactive!=-1) - if((player[i].drawkeydown&&!player[i].drawtogglekeydown)||(player[i].num_weapons==2&&player[i].weaponactive==-1&&player[i].isIdle())||(player[0].dead&&player[i].weaponactive!=-1&&i!=0)){ - //Setenvironment(1-environment); - bool isgood; - isgood=1; - if(player[i].weaponactive!=-1){ - if(weapons.type[player[i].weaponids[player[i].weaponactive]]==staff)isgood=0; - } - if(/*(player[i].weaponactive==-1||player[i].num_weapons==1)&&*/isgood&&player[i].creature!=wolftype){ - if(player[i].isIdle()&&player[i].num_weapons&&weapons.type[player[i].weaponids[0]]==knife){ - player[i].targetanimation=drawrightanim; - player[i].targetframe=0; - player[i].target=0; - player[i].drawtogglekeydown=1; - } - if((player[i].isIdle()||(player[i].aitype!=playercontrolled&&player[0].weaponactive!=-1&&player[i].isRun()))&&player[i].num_weapons&&weapons.type[player[i].weaponids[0]]==sword){ - player[i].targetanimation=drawleftanim; - player[i].targetframe=0; - player[i].target=0; - player[i].drawtogglekeydown=1; - } - if(player[i].isCrouch()&&player[i].num_weapons&&weapons.type[player[i].weaponids[0]]==knife){ - player[i].targetanimation=crouchdrawrightanim; - player[i].targetframe=0; - player[i].target=0; - player[i].drawtogglekeydown=1; - } - } - } - if(player[i].isCrouch()&&weapons.bloody[player[i].weaponids[player[i].weaponactive]]&&bloodtoggle&&player[i].onterrain&&player[i].num_weapons&&player[i].weaponactive!=-1&&player[i].attackkeydown){ - if(weapons.bloody[player[i].weaponids[player[i].weaponactive]]&&player[i].onterrain&&bloodtoggle&&musictype!=stream_music2){ - if(weapons.type[player[i].weaponids[player[i].weaponactive]]==knife)player[i].targetanimation=crouchstabanim; - if(weapons.type[player[i].weaponids[player[i].weaponactive]]==sword)player[i].targetanimation=swordgroundstabanim; - player[i].targetframe=0; - player[i].target=0; - player[i].hasvictim=0; - //player[i].attacktogglekeydown=1; - } - } - - if(!player[i].drawkeydown){ - player[i].drawtogglekeydown=0; - } - - if(i==0){ - absflatfacing=0; - absflatfacing.z=-1; - - absflatfacing=DoRotation(absflatfacing,0,-rotation,0); - } - else absflatfacing=flatfacing; - - 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; - } - movekey=0; - //Do controls - if(!animation[player[i].targetanimation].attack&&player[i].targetanimation!=staggerbackhighanim&&player[i].targetanimation!=staggerbackhardanim&&player[i].targetanimation!=backhandspringanim&&player[i].targetanimation!=dodgebackanim){ - if(!player[i].forwardkeydown){ - player[i].forwardstogglekeydown=0; - } - if(player[i].crouchkeydown){ - //Crouch - target=-2; - if(i==0){ - player[i].superruntoggle=1; - if(numplayers>1) - 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; - - static float gLoc[3]; - static float vel[3]; - gLoc[0]=player[i].coords.x; - gLoc[1]=player[i].coords.y; - gLoc[2]=player[i].coords.z; - vel[0]=player[i].velocity.x; - vel[1]=player[i].velocity.y; - vel[2]=player[i].velocity.z; - - if(i==0){ - PlaySoundEx( whooshsound, samp[whooshsound], NULL, true); - OPENAL_3D_SetAttributes(channels[whooshsound], gLoc, vel); - OPENAL_SetVolume(channels[whooshsound], 128); - OPENAL_SetPaused(channels[whooshsound], false); - } - - PlaySoundEx( jumpsound, samp[jumpsound], NULL, true); - OPENAL_3D_SetAttributes(channels[jumpsound], gLoc, vel); - OPENAL_SetVolume(channels[jumpsound], 128); - OPENAL_SetPaused(channels[jumpsound], false); - } - 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; - } + if(mainmenu) { + MenuTick(); + } - //Rotation - for(k=0;k180){ - if(player[k].rotation>player[k].targetrotation)player[k].rotation-=360; - else player[k].rotation+=360; - } + if(!mainmenu) { + if(hostile==1)hostiletime+=multiplier; + else hostiletime=0; + if(!winfreeze)leveltime+=multiplier; - 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; - } + //keys + if(Input::isKeyPressed(SDLK_v)&&debugmode){ + freeze=1-freeze; + if(freeze){ + OPENAL_SetFrequency(OPENAL_ALL, 0.001); + } + } - 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(Input::isKeyPressed(chatkey)&&!console&&!chatting&&debugmode) + chatting=1; - if(player[k].isRun()){ - player[k].targettilt=(player[k].rotation-player[k].targetrotation)/4; - } + if(chatting){ + inputText(displaytext[0],&displayselected,&displaychars[0]); + if(!waiting) { + if(displaychars[0]){ + for(int j=0;j<255;j++) + displaytext[0][j]=0; + displaychars[0]=0; + displayselected=0; + } + chatting=0; + } - if(abs(player[k].tilt-player[k].targettilt)player[k].targettilt){ - player[k].tilt-=multiplier*150; - } - else if(player[k].tilt0) { + consoletext[0][consolechars[0]]='\0'; + cmd_dispatch(this, consoletext[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]=0; + consolechars[0]=0; + consoleselected=0; + } + } - objects.DoStuff(); - - if(numenvsounds!=0) - for(j=numenvsounds-1;j>=0;j--){ - envsoundlife[j]-=multiplier; - if(envsoundlife[j]<0){ - numenvsounds--; - envsoundlife[j]=envsoundlife[numenvsounds]; - envsound[j]=envsound[numenvsounds]; - } - } - if(!slomo)OPENAL_SetFrequency(OPENAL_ALL, 22050); - if(slomo)OPENAL_SetFrequency(OPENAL_ALL, slomofreq); - - 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); - - PlayStreamEx( stream_music3, strm[stream_music3], NULL, true); - OPENAL_SetPaused(channels[stream_music3], false); - OPENAL_SetVolume(channels[stream_music3], 256); - - gameon=0; - mainmenu=5; - - float gLoc[3]={0,0,0}; - float vel[3]={0,0,0}; - OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 9999.0f, 99999.0f); - PlaySoundEx( fireendsound, samp[fireendsound], NULL, true); - OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel); - OPENAL_SetVolume(channels[fireendsound], 256); - OPENAL_SetPaused(channels[fireendsound], false); - OPENAL_Sample_SetMinMaxDistance(samp[fireendsound], 8.0f, 2000.0f); - - flashr=1; - flashg=0; - flashb=0; - flashamount=1; - flashdelay=1; - } - if(tutorialstage<51) - if(findDistancefast(&temp,&player[0].coords)>=findDistancefast(&temp,&temp2)-1||findDistancefast(&temp3,&player[0].coords)<4){ - float gLoc[3]; - float vel[3]; - gLoc[0]=player[0].coords.x; - gLoc[1]=player[0].coords.y; - gLoc[2]=player[0].coords.z; - vel[0]=0; - vel[1]=0; - vel[2]=0; - PlaySoundEx( fireendsound, samp[fireendsound], NULL, true); - OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel); - OPENAL_SetVolume(channels[fireendsound], 256); - OPENAL_SetPaused(channels[fireendsound], false); - - player[0].coords=(oldtemp+oldtemp2)/2; - - flashr=1; - flashg=1; - flashb=1; - flashamount=1; - flashdelay=1; - } - if(tutorialstage>=14&&tutorialstage<50) - if(findDistancefast(&temp,&player[1].coords)>=findDistancefast(&temp,&temp2)-1||findDistancefast(&temp3,&player[1].coords)<4){ - float gLoc[3]; - float vel[3]; - gLoc[0]=player[1].coords.x; - gLoc[1]=player[1].coords.y; - gLoc[2]=player[1].coords.z; - vel[0]=0; - vel[1]=0; - vel[2]=0; - PlaySoundEx( fireendsound, samp[fireendsound], NULL, true); - OPENAL_3D_SetAttributes(channels[fireendsound], gLoc, vel); - OPENAL_SetVolume(channels[fireendsound], 256); - OPENAL_SetPaused(channels[fireendsound], false); - - 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=true; + } + 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[j].position)<2&&player[i].weaponactive==-1) + if(findDistancefast(&player[i].coords,&weapons[j].position)<1||player[i].victim){ + if(weapons[j].getType()!=staff) + emit_sound_at(knifedrawsound, player[i].coords, 128.); + + player[i].weaponactive=0; + weapons[j].owner=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[j].position)<5&& + player[i].coords.yid) + if(findDistancefastflat(&player[i].coords,&weapons[k].position)<3&& + player[i].weaponactive==-1){ + if(weapons[k].getType()!=staff) + emit_sound_at(knifedrawsound, player[i].coords, 128.); + + player[i].weaponactive=0; + weapons[k].owner=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; + player[i].setAnimation(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[k].getType()!=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[k].owner!=-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[k].position; + 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[k].bloody=2; + weapons[k].blooddrip=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->getJointFor(abdomen).velocity+=relative*6; + player[i].victim->getJointFor(neck).velocity+=relative*6; + player[i].victim->getJointFor(rightshoulder).velocity+=relative*6; + player[i].victim->getJointFor(leftshoulder).velocity+=relative*6; + } + weapons[k].owner=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[player[i].weaponids[0]].getType()==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(player[j].getJointFor(head).position,0,player[j].rotation,0)*player[j].scale+player[j].coords,DoRotation(player[i].getJointFor(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].setAnimation(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[player[i].weaponids[0]].owner=-1; + aim=player[i].victim->coords+DoRotation(player[i].victim->getJointFor(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].getJointFor(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[player[i].weaponids[0]].velocity=aim*50; + weapons[player[i].weaponids[0]].tipvelocity=aim*50; + weapons[player[i].weaponids[0]].missed=0; + weapons[player[i].weaponids[0]].freetime=0; + weapons[player[i].weaponids[0]].firstfree=1; + weapons[player[i].weaponids[0]].physics=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[player[i].weaponids[0]].owner=-1; + weapons[player[i].weaponids[0]].velocity=player[i].velocity*.2; + if(weapons[player[i].weaponids[0]].velocity.x==0)weapons[player[i].weaponids[0]].velocity.x=.1; + weapons[player[i].weaponids[0]].tipvelocity=weapons[player[i].weaponids[0]].velocity; + weapons[player[i].weaponids[0]].missed=1; + weapons[player[i].weaponids[0]].freetime=0; + weapons[player[i].weaponids[0]].firstfree=1; + weapons[player[i].weaponids[0]].physics=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()){ + player[i].setAnimation(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))){ + player[i].setAnimation(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; + } + player[i].setAnimation(player[i].getIdle()); + player[i].transspeed=10; + } + } + if(player[i].targetanimation==sneakanim){ + player[i].setAnimation(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) + player[i].setAnimation(walkanim); + else + player[i].setAnimation(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)*/){ + player[i].setAnimation(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)){ + player[i].setAnimation(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)){ + player[i].setAnimation(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)){ + player[i].setAnimation(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; + player[i].setAnimation(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){ + player[i].setAnimation(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) + player[i].setAnimation(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))) + player[i].setAnimation(player[i].getStop()); + if(player[i].isRun()&&(player[i].aitype==passivetype)) + player[i].setAnimation(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)) + player[k].setAnimation(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_menutheme); + + 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; } - if(mainmenu)rotation+=multiplier*5; } -void Game::TickOnceAfter(){ +void Game::TickOnceAfter(){ static XYZ colviewer; static XYZ coltarget; static XYZ target; static XYZ col; - static float brotate; static XYZ facing; - static int i,j; static float changedelay; static bool alldead; static float unseendelay; @@ -8649,446 +7473,295 @@ 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) + leveltheme=stream_snowtheme; + if(environment==grassyenvironment) + leveltheme=stream_grasstheme; + if(environment==desertenvironment) + leveltheme=stream_deserttheme; realthreat=0; - musictype=music1; - for(i=0;i0){ - musictype=stream_music2; - } + if(unseendelay>0) + musictype=stream_fighttheme; } if(loading==2){ - musictype=stream_music3; + musictype=stream_menutheme; musicvolume[2]=512; musicvolume[0]=0; musicvolume[1]=0; musicvolume[3]=0; } - if(musictoggle){ - if(musictype!=oldmusictype&&musictype==stream_music2){ - static float gLoc[3]; - static float vel[3]; - gLoc[0]=cameraloc.x; - gLoc[1]=cameraloc.y; - gLoc[2]=cameraloc.z; - vel[0]=0; - vel[1]=0; - vel[2]=0; - PlaySoundEx( alarmsound, samp[alarmsound], NULL, true); - OPENAL_SetVolume(channels[alarmsound], 512); - OPENAL_SetPaused(channels[alarmsound], false); - - } - } + if(musictoggle) + if(musictype!=oldmusictype&&musictype==stream_fighttheme) + 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==leveltheme) + musicvolume[0]+=multiplier*450; + else + musicvolume[0]-=multiplier*450; + if(musicselected==stream_fighttheme) + musicvolume[1]+=multiplier*450; + else + musicvolume[1]-=multiplier*450; + if(musicselected==stream_menutheme) + 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){ - PlayStreamEx( music1, strm[music1], NULL, true); - OPENAL_SetPaused(channels[music1], false); - } - if(musicvolume[1]>0&&oldmusicvolume[1]<=0){ - PlayStreamEx( stream_music2, strm[stream_music2], NULL, true); - OPENAL_SetPaused(channels[stream_music2], false); - } - if(musicvolume[2]>0&&oldmusicvolume[2]<=0){ - PlayStreamEx( stream_music3, strm[stream_music3], NULL, true); - OPENAL_SetPaused(channels[stream_music3], false); - } - } - - if(!musictoggle){ - OPENAL_SetPaused(channels[music1], true); - OPENAL_SetPaused(channels[stream_music2], true); - OPENAL_SetPaused(channels[stream_music3], true); + if(musicvolume[0]>0&&oldmusicvolume[0]<=0) + emit_stream_np(leveltheme, musicvolume[0]); + if(musicvolume[1]>0&&oldmusicvolume[1]<=0) + emit_stream_np(stream_fighttheme, musicvolume[1]); + if(musicvolume[2]>0&&oldmusicvolume[2]<=0) + emit_stream_np(stream_menutheme, musicvolume[2]); + if(musicvolume[0]<=0&&oldmusicvolume[0]>0) + pause_sound(leveltheme); + if(musicvolume[1]<=0&&oldmusicvolume[1]>0) + pause_sound(stream_fighttheme); + if(musicvolume[2]<=0&&oldmusicvolume[2]>0) + pause_sound(stream_menutheme); + + if(musicvolume[0]!=oldmusicvolume[0]) + OPENAL_SetVolume(channels[leveltheme], musicvolume[0]); + if(musicvolume[1]!=oldmusicvolume[1]) + OPENAL_SetVolume(channels[stream_fighttheme], musicvolume[1]); + if(musicvolume[2]!=oldmusicvolume[2]) + OPENAL_SetVolume(channels[stream_menutheme], musicvolume[2]); + + for(int i=0;i<3;i++) + oldmusicvolume[i]=musicvolume[i]; + } else { + pause_sound(leveltheme); + pause_sound(stream_fighttheme); + pause_sound(stream_menutheme); - for(i=0;i<4;i++){ + for(int i=0;i<4;i++){ oldmusicvolume[i]=0; musicvolume[i]=0; } } - if(musictoggle){ - if(musicvolume[0]<=0&&oldmusicvolume[0]>0){ - OPENAL_SetPaused(channels[music1], true); + killhotspot=2; + for(int i=0;i10&&hotspottype[i]<20){ + if(player[hotspottype[i]-10].dead==0) + killhotspot=0; + else if(killhotspot==2) + killhotspot=1; } - if(musicvolume[1]<=0&&oldmusicvolume[1]>0){ - OPENAL_SetPaused(channels[stream_music2], true); + } + if(killhotspot==2) + killhotspot=0; + + + winhotspot=false; + for(int i=0;imaxalarmed) + maxalarmed=numalarmed; + + if(changedelay<=0&&!loading&&!editorenabled&&gameon&&!tutoriallevel&&changedelay!=-999&&!won){ + if(player[0].dead&&changedelay<=0){ + changedelay=1; + targetlevel=whichlevel; } - if(musicvolume[2]<=0&&oldmusicvolume[2]>0){ - OPENAL_SetPaused(channels[stream_music3], true); + alldead=true; + for(int i=1;inumchallengelevels-1)targetlevel=0; } - if(musicvolume[2]!=oldmusicvolume[2]){ - OPENAL_SetVolume(channels[stream_music3], musicvolume[2]); + if(winhotspot||windialogue) { + changedelay=0.1; + targetlevel=whichlevel+1; + if(targetlevel>numchallengelevels-1)targetlevel=0; } - for(i=0;i<3;i++){ - oldmusicvolume[i]=musicvolume[i]; - } - } - killhotspot=2; - if(numhotspots) - for(i=0;i10&&hotspottype[i]<20){ - if(player[hotspottype[i]-10].dead==0){ - killhotspot=0; - } - else if(killhotspot==2) - killhotspot=1; - } + if(killhotspot){ + changedelay=1; + targetlevel=whichlevel+1; + if(targetlevel>numchallengelevels-1)targetlevel=0; } - if(killhotspot==2)killhotspot=0; - - winhotspot=0; - if(numhotspots) - for(i=0;i0&&!player[0].dead&&!won) { + //high scores, awards, win + if(campaign) { + accountactive->winCampaignLevel(whichchoice, bonustotal, leveltime); + scoreadded=1; + } else { + accountactive->winLevel(whichlevel,bonustotal-startbonustotal,leveltime); } + won=1; + } + } - int numalarmed=0; - if(numplayers>1) - for(i=1;imaxalarmed)maxalarmed=numalarmed; - - if(changedelay<=0&&!loading&&!editorenabled&&gameon&&!tutoriallevel&&changedelay!=-999&&!won){ - if(player[0].dead&&changedelay<=0){ - changedelay=1; - targetlevel=whichlevel; - } - alldead=1; - if(numplayers>1) - for(i=1;inumchallengelevels-1)targetlevel=0; - } - if(winhotspot||windialogue){ - changedelay=0.1; - targetlevel=whichlevel+1; - if(targetlevel>numchallengelevels-1)targetlevel=0; - } - + if(!winfreeze){ - if(killhotspot){ - changedelay=1; - targetlevel=whichlevel+1; - if(targetlevel>numchallengelevels-1)targetlevel=0; - } + if(leveltime<1){ + loading=0; + changedelay=.1; + alldead=false; + winhotspot=false; + killhotspot=0; + } - if(changedelay>0&&!player[0].dead&&!won){ - //high scores, awards, win - if(campaign){ - won=1; - accountcampaignchoices[accountactive][accountcampaignchoicesmade[accountactive]]=whichchoice; - accountcampaignchoicesmade[accountactive]++; - accountcampaignscore[accountactive]+=bonustotal; - scoreadded=1; - accountcampaigntime[accountactive]+=leveltime; - if(accountcampaignscore[accountactive]>accountcampaignhighscore[accountactive])accountcampaignhighscore[accountactive]=accountcampaignscore[accountactive]; - - //if(accountprogress[accountactive]accounthighscore[accountactive][whichlevel])accounthighscore[accountactive][whichlevel]=bonustotal-startbonustotal; - if(accountfasttime[accountactive][whichlevel]==0||leveltimegetCampaignChoicesMade()].mapname.c_str()); - if(campaign) - 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; - - if(!stealthloading){ - float gLoc[3]={0,0,0}; - float vel[3]={0,0,0}; - OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 9999.0f, 99999.0f); - PlaySoundEx( firestartsound, samp[firestartsound], NULL, true); - OPENAL_3D_SetAttributes(channels[firestartsound], gLoc, vel); - OPENAL_SetVolume(channels[firestartsound], 256); - OPENAL_SetPaused(channels[firestartsound], false); - OPENAL_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f); - - flashr=1; - flashg=0; - flashb=0; - flashamount=1; - flashdelay=1; - } + fireSound(); - startbonustotal=0; - - 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++){ - if(campaigndescription[i][j]=='_')campaigndescription[i][j]=' '; - } - ipstream.ignore(256,':'); - ipstream >> campaignchoosenext[i]; - ipstream.ignore(256,':'); - ipstream >> campaignnumnext[i]; - if(campaignnumnext[i]) - for(j=0;j> campaignnextlevel[i][j]; - campaignnextlevel[i][j]-=1; - } - ipstream.ignore(256,':'); - ipstream >> campaignlocationx[i]; - ipstream.ignore(256,':'); - ipstream >> campaignlocationy[i]; - } - ipstream.close(); + loading=3; + } + if(changedelay<=-999&& + whichlevel!=-2&& + !loading&& + (player[0].dead|| + (alldead&&maptype==mapkilleveryone)|| + (winhotspot)|| + (killhotspot))) + loading=1; + if((player[0].dead|| + (alldead&&maptype==mapkilleveryone)|| + (winhotspot)|| + (windialogue)|| + (killhotspot))&& + changedelay<=0) { + if(whichlevel!=-2&&!loading&&!player[0].dead) { + winfreeze=true; + changedelay=-999; + } + if(player[0].dead) + loading=1; + } + } - for(i=0;itarget.y) target.y=player[0].skeleton.joints[i].position.y*player[0].scale+player[0].coords.y; } @@ -9131,27 +7803,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; @@ -9216,3 +7884,4 @@ void Game::TickOnceAfter(){ } } } +