- if(musictoggle)
- emit_stream_np(stream_menutheme);
- break;
- case 7:
- flash();
- //options
- mainmenu=4;
- selected=-1;
- keyselect=-1;
- break;
- case 8:
- flash();
-
- if(newdetail>2)newdetail=detail;
- if(newdetail<0)newdetail=detail;
- if(newscreenwidth<0)newscreenwidth=screenwidth;
- if(newscreenheight<0)newscreenheight=screenheight;
-
- SaveSettings(*this);
- mainmenu=gameon?2:1;
- break;
- case 9:
- invertmouse=1-invertmouse;
- break;
- case 10:
- usermousesensitivity+=.2;
- if(usermousesensitivity>2)usermousesensitivity=.2;
- break;
- case 11:
- volume+=.1f;
- if(volume>1.0001f)volume=0;
- OPENAL_SetSFXMasterVolume((int)(volume*255));
- break;
- case 12:
- flash();
-
- newstereomode = stereomode;
- mainmenu=18;
- keyselect=-1;
- break;
- case 13:
- showdamagebar=!showdamagebar;
- break;
- }
- }
- break;
- case 4:
- if(Input::MouseClicked()&&selected!=-1&&!waiting){
- fireSound();
- if(selected<9&&keyselect==-1)
- keyselect=selected;
- if(keyselect!=-1)
- setKeySelected();
- if(selected==9){
- flash();
-
- mainmenu=3;
-
- if(newdetail>2)newdetail=detail;
- if(newdetail<0)newdetail=detail;
- if(newscreenwidth>3000)newscreenwidth=screenwidth;
- if(newscreenwidth<0)newscreenwidth=screenwidth;
- if(newscreenheight>3000)newscreenheight=screenheight;
- if(newscreenheight<0)newscreenheight=screenheight;
- }
- }
- break;
- case 5:
- if(endgame==2){
- accountactive->endGame();
- endgame=0;
- }
-
- if(Input::MouseClicked()){
- if((selected-7>=accountactive->getCampaignChoicesMade())){
- fireSound();
- flash();
- startbonustotal=0;
-
- loading=2;
- loadtime=0;
- targetlevel=7;
- if(firstload) TickOnceAfter();
- else LoadStuff();
- whichchoice=selected-7-accountactive->getCampaignChoicesMade();
- visibleloading=1;
- stillloading=1;
- Loadlevel(campaignmapname[campaignchoicewhich[selected-7-accountactive->getCampaignChoicesMade()]]);
- //Loadlevel(campaignmapname[levelorder[selected-7]]);
- campaign=1;
- mainmenu=0;
- gameon=1;
- pause_sound(stream_menutheme);
- }
- if(selected>=1 && selected<=5){
- fireSound();
- flash();
- }
- switch(selected){
- case 1:
- startbonustotal=0;
-
- loading=2;
- loadtime=0;
- targetlevel=-1;
- if(firstload)TickOnceAfter();
- if(!firstload)LoadStuff();
- else {
- Loadlevel(-1);
- }
-
- mainmenu=0;
- gameon=1;
- pause_sound(stream_menutheme);
- break;
- case 2:
- mainmenu=9;
- break;
- case 3:
- mainmenu=6;
- break;
- case 4:
- mainmenu=gameon?2:1;
- break;
- case 5:
- mainmenu=7;
- break;
- }
- }
- break;
- case 6:
- if(Input::MouseClicked()) {
- if(selected>-1){
- fireSound();
- if(selected==1) {
- flash();
- accountactive = Account::destroy(accountactive);
- mainmenu=7;
- } else if(selected==2) {
- flash();
- mainmenu=5;
- }
- }
- }
- break;
- case 7:
- if(Input::MouseClicked()) {
- if(selected!=-1){
- 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:
- if(Input::MouseClicked()&&selected>-1){
- fireSound();
- flash();
- if(selected<=2)
- accountactive->setDifficulty(selected);
- mainmenu=5;
- }
- break;
- case 9:
- if(Input::MouseClicked()&&selected<numchallengelevels&&selected>=0&&selected<=accountactive->getProgress()){
- fireSound();
- flash();
-
- startbonustotal=0;
-
- loading=2;
- loadtime=0;
- targetlevel=selected;
- if(firstload)TickOnceAfter();
- if(!firstload)LoadStuff();
- else Loadlevel(selected);
- campaign=0;
-
- mainmenu=0;
- gameon=1;
- pause_sound(stream_menutheme);
- }
- if(Input::MouseClicked()&&selected==numchallengelevels){
- fireSound();
- flash();
- mainmenu=5;
- }
- break;
- case 10:
- endgame=2;
- if(Input::MouseClicked()&&selected==3){
- fireSound();
- flash();
- mainmenu=5;
- }
- break;
- case 18:
- if(Input::isKeyPressed(MOUSEBUTTON1)&&selected==1)
- stereoseparation+=0.001;
- else if(Input::isKeyPressed(MOUSEBUTTON2)&&selected==1)
- stereoseparation-=0.001;
- else if(Input::MouseClicked()&&selected>-1){
- fireSound();
- if(selected==0){
- newstereomode = (StereoMode)(newstereomode + 1);
- while(!CanInitStereo(newstereomode)){
- printf("Failed to initialize mode %s (%i)\n", StereoModeName(newstereomode), newstereomode);
- newstereomode = (StereoMode)(newstereomode + 1);
- if(newstereomode >= stereoCount)
- newstereomode = stereoNone;
- }
- }
- if(selected==2)
- stereoreverse =! stereoreverse;
- if(selected==3){
- flash();
- mainmenu=3;
-
- stereomode = newstereomode;
- InitStereo(stereomode);
- }
- }
- break;
- }
-
- if(Input::isKeyDown(SDLK_q)&&Input::isKeyDown(SDLK_LMETA)){
- tryquit=1;
- if(mainmenu==3){
- if(newdetail>2)newdetail=detail;
- if(newdetail<0)newdetail=detail;
- if(newscreenwidth<0)newscreenwidth=screenwidth;
- if(newscreenheight<0)newscreenheight=screenheight;
-
- SaveSettings(*this);
- }
- }
-
- if(mainmenu==1||mainmenu==2){
- if(loaddistrib>4)transition+=multiplier/8;
- if(transition>1){
- transition=0;
- anim++;
- if(anim>4)anim=0;
- loaddistrib=0;
- }
- }
- OPENAL_SetFrequency(channels[stream_menutheme], 22050);
-
- if(entername) {
- inputText(displaytext[0],&displayselected,&displaychars[0]);
- if(!waiting) { // the input as finished
- if(displaychars[0]){ // with enter
- accountactive = Account::add(string(displaytext[0]));
-
- mainmenu=8;
-
- flash();
-
- fireSound(firestartsound);
-
- for(int i=0;i<255;i++){
- displaytext[0][i]=0;
- }
- displaychars[0]=0;
-
- displayselected=0;
- }
- entername=0;
- }
-
- displayblinkdelay-=multiplier;
- if(displayblinkdelay<=0){
- displayblinkdelay=.3;
- displayblink=1-displayblink;
- }
- }
-}
-
-void Game::doTutorial(){
- if(tutorialstagetime>tutorialmaxtime){
- tutorialstage++;
- tutorialsuccess=0;
- if(tutorialstage<=1){
- canattack=0;
- cananger=0;
- reversaltrain=0;
- }
- switch(tutorialstage){
- case 1:
- tutorialmaxtime=5;
- break; case 2:
- tutorialmaxtime=2;
- break; case 3:
- tutorialmaxtime=600;
- break; case 4:
- tutorialmaxtime=1000;
- break; case 5:
- tutorialmaxtime=600;
- break; case 6:
- tutorialmaxtime=600;
- break; case 7:
- tutorialmaxtime=600;
- break; case 8:
- tutorialmaxtime=600;
- break; case 9:
- tutorialmaxtime=600;
- break; case 10:
- tutorialmaxtime=2;
- break; case 11:
- tutorialmaxtime=1000;
- break; case 12:
- tutorialmaxtime=1000;
- break; case 13:
- tutorialmaxtime=2;
- break; case 14: {
- tutorialmaxtime=3;
-
- XYZ temp,temp2;
-
- temp.x=1011;
- temp.y=84;
- temp.z=491;
- temp2.x=1025;
- temp2.y=75;
- temp2.z=447;
-
- player[1].coords=(temp+temp2)/2;
-
- emit_sound_at(fireendsound, player[1].coords);
-
- for(int i=0;i<player[1].skeleton.num_joints;i++){
- if(Random()%2==0){
- if(!player[1].skeleton.free)temp2=(player[1].coords-player[1].oldcoords)/multiplier/2;//velocity/2;
- if(player[1].skeleton.free)temp2=player[1].skeleton.joints[i].velocity*player[1].scale/2;
- if(!player[1].skeleton.free)temp=DoRotation(DoRotation(DoRotation(player[1].skeleton.joints[i].position,0,0,player[1].tilt),player[1].tilt2,0,0),0,player[1].rotation,0)*player[1].scale+player[1].coords;
- if(player[1].skeleton.free)temp=player[1].skeleton.joints[i].position*player[1].scale+player[1].coords;
- Sprite::MakeSprite(breathsprite, temp,temp2, 1,1,1, .6+(float)abs(Random()%100)/200-.25, 1);
- }
- }
- }
- break; case 15:
- tutorialmaxtime=500;
- break; case 16:
- tutorialmaxtime=500;
- break; case 17:
- tutorialmaxtime=500;
- break; case 18:
- tutorialmaxtime=500;
- break; case 19:
- tutorialstage=20;
- //tutorialmaxtime=500;
- break; case 20:
- tutorialmaxtime=500;
- break; case 21:
- tutorialmaxtime=500;
- if(bonus==cannon){
- bonus=Slicebonus;
- againbonus=1;
- }
- else againbonus=0;
- break; case 22:
- tutorialmaxtime=500;
- break; case 23:
- tutorialmaxtime=500;
- break; case 24:
- tutorialmaxtime=500;
- break; case 25:
- tutorialmaxtime=500;
- break; case 26:
- tutorialmaxtime=2;
- break; case 27:
- tutorialmaxtime=4;
- reversaltrain=1;
- cananger=1;
- player[1].aitype=attacktypecutoff;
- break; case 28:
- tutorialmaxtime=400;
- break; case 29:
- tutorialmaxtime=400;
- player[0].escapednum=0;
- break; case 30:
- tutorialmaxtime=4;
- reversaltrain=0;
- cananger=0;
- player[1].aitype=passivetype;
- break; case 31:
- tutorialmaxtime=13;
- break; case 32:
- tutorialmaxtime=8;
- break; case 33:
- tutorialmaxtime=400;
- cananger=1;
- canattack=1;
- player[1].aitype=attacktypecutoff;
- break; case 34:
- tutorialmaxtime=400;
- break; case 35:
- tutorialmaxtime=400;
- break; case 36:
- tutorialmaxtime=2;
- reversaltrain=0;
- cananger=0;
- player[1].aitype=passivetype;
- break; case 37:
- damagedealt=0;
- damagetaken=0;
- tutorialmaxtime=50;
- cananger=1;
- canattack=1;
- player[1].aitype=attacktypecutoff;
- break; case 38:
- tutorialmaxtime=4;
- canattack=0;
- cananger=0;
- player[1].aitype=passivetype;
- break; case 39: {
- XYZ temp,temp2;
-
- temp.x=1011;
- temp.y=84;
- temp.z=491;
- temp2.x=1025;
- temp2.y=75;
- temp2.z=447;
-
-
- weapons.owner[weapons.numweapons]=-1;
- weapons.type[weapons.numweapons]=knife;
- weapons.damage[weapons.numweapons]=0;
- weapons.mass[weapons.numweapons]=1;
- weapons.tipmass[weapons.numweapons]=1.2;
- weapons.length[weapons.numweapons]=.25;
- weapons.position[weapons.numweapons]=(temp+temp2)/2;
- weapons.tippoint[weapons.numweapons]=(temp+temp2)/2;
-
- weapons.velocity[weapons.numweapons]=0.1;
- weapons.tipvelocity[weapons.numweapons]=0.1;
- weapons.missed[weapons.numweapons]=1;
- weapons.hitsomething[weapons.numweapons]=0;
- weapons.freetime[weapons.numweapons]=0;
- weapons.firstfree[weapons.numweapons]=1;
- weapons.physics[weapons.numweapons]=1;
-
- weapons.numweapons++;
- }
- break; case 40:
- tutorialmaxtime=300;
- break; case 41:
- tutorialmaxtime=300;
- break; case 42:
- tutorialmaxtime=8;
- break; case 43:
- tutorialmaxtime=300;
- break; case 44:
- weapons.owner[0]=1;
- player[0].weaponactive=-1;
- player[0].num_weapons=0;
- player[1].weaponactive=0;
- player[1].num_weapons=1;
- player[1].weaponids[0]=0;
-
- cananger=1;
- canattack=1;
- player[1].aitype=attacktypecutoff;
-
- tutorialmaxtime=300;
- break; case 45:
- weapons.owner[0]=1;
- player[0].weaponactive=-1;
- player[0].num_weapons=0;
- player[1].weaponactive=0;
- player[1].num_weapons=1;
- player[1].weaponids[0]=0;
-
- tutorialmaxtime=300;
- break; case 46:
- weapons.owner[0]=1;
- player[0].weaponactive=-1;
- player[0].num_weapons=0;
- player[1].weaponactive=0;
- player[1].num_weapons=1;
- player[1].weaponids[0]=0;
-
- weapons.type[0]=sword;
-
- tutorialmaxtime=300;
- break; case 47: {
- tutorialmaxtime=10;
-
- XYZ temp,temp2;
-
- temp.x=1011;
- temp.y=84;
- temp.z=491;
- temp2.x=1025;
- temp2.y=75;
- temp2.z=447;
-
- weapons.owner[weapons.numweapons]=-1;
- weapons.type[weapons.numweapons]=sword;
- weapons.damage[weapons.numweapons]=0;
- weapons.mass[weapons.numweapons]=1;
- weapons.tipmass[weapons.numweapons]=1.2;
- weapons.length[weapons.numweapons]=.25;
- weapons.position[weapons.numweapons]=(temp+temp2)/2;
- weapons.tippoint[weapons.numweapons]=(temp+temp2)/2;
-
- weapons.velocity[weapons.numweapons]=0.1;
- weapons.tipvelocity[weapons.numweapons]=0.1;
- weapons.missed[weapons.numweapons]=1;
- weapons.hitsomething[weapons.numweapons]=0;
- weapons.freetime[weapons.numweapons]=0;
- weapons.firstfree[weapons.numweapons]=1;
- weapons.physics[weapons.numweapons]=1;
-
- weapons.owner[0]=1;
- weapons.owner[1]=0;
- player[0].weaponactive=0;
- player[0].num_weapons=1;
- player[0].weaponids[0]=1;
- player[1].weaponactive=0;
- player[1].num_weapons=1;
- player[1].weaponids[0]=0;
-
- weapons.numweapons++;
- }
- break; case 48:
- canattack=0;
- cananger=0;
- player[1].aitype=passivetype;
-
- tutorialmaxtime=15;
-
- weapons.owner[0]=1;
- weapons.owner[1]=0;
- player[0].weaponactive=0;
- player[0].num_weapons=1;
- player[0].weaponids[0]=1;
- player[1].weaponactive=0;
- player[1].num_weapons=1;
- player[1].weaponids[0]=0;
-
- if(player[0].weaponactive!=-1)weapons.type[player[0].weaponids[player[0].weaponactive]]=staff;
- else weapons.type[0]=staff;
-
- weapons.numweapons++;
- break; case 49:
- canattack=0;
- cananger=0;
- player[1].aitype=passivetype;
-
- tutorialmaxtime=200;
-
- weapons.position[1]=1000;
- weapons.tippoint[1]=1000;
-
- weapons.numweapons=1;
- weapons.owner[0]=0;
- player[1].weaponactive=-1;
- player[1].num_weapons=0;
- player[0].weaponactive=0;
- player[0].num_weapons=1;
- player[0].weaponids[0]=0;
-
- weapons.type[0]=knife;
-
- weapons.numweapons++;
- break; case 50: {
- tutorialmaxtime=8;
-
- XYZ temp,temp2;
- emit_sound_at(fireendsound, player[1].coords);
-
- for(int i=0;i<player[1].skeleton.num_joints;i++){
- if(Random()%2==0){
- if(!player[1].skeleton.free)temp2=(player[1].coords-player[1].oldcoords)/multiplier/2;//velocity/2;
- if(player[1].skeleton.free)temp2=player[1].skeleton.joints[i].velocity*player[1].scale/2;
- if(!player[1].skeleton.free)temp=DoRotation(DoRotation(DoRotation(player[1].skeleton.joints[i].position,0,0,player[1].tilt),player[1].tilt2,0,0),0,player[1].rotation,0)*player[1].scale+player[1].coords;
- if(player[1].skeleton.free)temp=player[1].skeleton.joints[i].position*player[1].scale+player[1].coords;
- Sprite::MakeSprite(breathsprite, temp,temp2, 1,1,1, .6+(float)abs(Random()%100)/200-.25, 1);
- }
- }
-
- player[1].num_weapons=0;
- player[1].weaponstuck=-1;
- player[1].weaponactive=-1;
-
- weapons.numweapons=0;
-
- weapons.owner[0]=-1;
- weapons.velocity[0]=0.1;
- weapons.tipvelocity[0]=-0.1;
- weapons.missed[0]=1;
- weapons.hitsomething[0]=0;
- weapons.freetime[0]=0;
- weapons.firstfree[0]=1;
- weapons.physics[0]=1;
- }
- break; case 51:
- tutorialmaxtime=80000;
- break; default: break;
- }
- if(tutorialstage<=51)tutorialstagetime=0;
- }
-
- //Tutorial success
- if(tutorialstagetime<tutorialmaxtime-3){
- switch(tutorialstage){
- case 3: if(deltah||deltav)tutorialsuccess+=multiplier;
- break; case 4: if(player[0].forwardkeydown||player[0].backkeydown||player[0].leftkeydown||player[0].rightkeydown)tutorialsuccess+=multiplier;
- break; case 5: if(player[0].jumpkeydown)tutorialsuccess=1;
- break; case 6: if(player[0].isCrouch())tutorialsuccess=1;
- break; case 7: if(player[0].targetanimation==rollanim)tutorialsuccess=1;
- break; case 8: if(player[0].targetanimation==sneakanim)tutorialsuccess+=multiplier;
- break; case 9: if(player[0].targetanimation==rabbitrunninganim||player[0].targetanimation==wolfrunninganim)tutorialsuccess+=multiplier;
- break; case 11: if(player[0].isWallJump())tutorialsuccess=1;
- break; case 12: if(player[0].targetanimation==flipanim)tutorialsuccess=1;
- break; case 15: if(player[0].targetanimation==upunchanim||player[0].targetanimation==winduppunchanim)tutorialsuccess=1;
- break; case 16: if(player[0].targetanimation==winduppunchanim)tutorialsuccess=1;
- break; case 17: if(player[0].targetanimation==spinkickanim)tutorialsuccess=1;
- break; case 18: if(player[0].targetanimation==sweepanim)tutorialsuccess=1;
- break; case 19: if(player[0].targetanimation==dropkickanim)tutorialsuccess=1;
- break; case 20: if(player[0].targetanimation==rabbitkickanim)tutorialsuccess=1;
- break; case 21: if(bonus==cannon)tutorialsuccess=1;
- break; case 22: if(bonus==spinecrusher)tutorialsuccess=1;
- break; case 23: if(player[0].targetanimation==walljumprightkickanim||player[0].targetanimation==walljumpleftkickanim)tutorialsuccess=1;
- break; case 24: if(player[0].targetanimation==rabbittacklinganim)tutorialsuccess=1;
- break; case 25: if(player[0].targetanimation==backhandspringanim)tutorialsuccess=1;
- break; case 28: if(animation[player[0].targetanimation].attack==reversed&&player[0].feint)tutorialsuccess=1;
- break; case 29:
- if(player[0].escapednum==2){
- tutorialsuccess=1;
- reversaltrain=0;
- cananger=0;
- player[1].aitype=passivetype;
- }
- break; case 33: if(animation[player[0].targetanimation].attack==reversal)tutorialsuccess=1;
- break; case 34: if(animation[player[0].targetanimation].attack==reversal)tutorialsuccess=1;
- break; case 35:
- if(animation[player[0].targetanimation].attack==reversal){
- tutorialsuccess=1;
- reversaltrain=0;
- cananger=0;
- player[1].aitype=passivetype;
- }
- break; case 40: if(player[0].num_weapons>0)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.type[player[0].weaponids[0]]==sword)weapons.type[player[0].weaponids[0]]=staff;
- else if(weapons.type[player[0].weaponids[0]]==staff)weapons.type[player[0].weaponids[0]]=knife;
- else weapons.type[player[0].weaponids[0]]=sword;
- if(weapons.type[player[0].weaponids[0]]==sword){
- weapons.mass[player[0].weaponids[0]]=1.5;
- weapons.tipmass[player[0].weaponids[0]]=1;
- weapons.length[player[0].weaponids[0]]=.8;
- }
- if(weapons.type[player[0].weaponids[0]]==staff){
- weapons.mass[player[0].weaponids[0]]=2;
- weapons.tipmass[player[0].weaponids[0]]=1;
- weapons.length[player[0].weaponids[0]]=1.5;
- }
-
- if(weapons.type[player[0].weaponids[0]]==knife){
- weapons.mass[player[0].weaponids[0]]=1;
- weapons.tipmass[player[0].weaponids[0]]=1.2;
- weapons.length[player[0].weaponids[0]]=.25;
- }
- }
- }
-
- if(Input::isKeyPressed(SDLK_x)&&Input::isKeyDown(SDLK_LSHIFT)){
- int closest=-1;
- float closestdist=-1;
- float distance;
- if(numplayers>1)
- for(int i=1;i<numplayers;i++){
- distance=findDistancefast(&player[i].coords,&player[0].coords);
- if(closestdist==-1||distance<closestdist){
- closestdist=distance;
- closest=i;
- }
- }
- if(closest!=-1){
- if(player[closest].num_weapons){
- if(weapons.type[player[closest].weaponids[0]]==sword)
- weapons.type[player[closest].weaponids[0]]=staff;
- else if(weapons.type[player[closest].weaponids[0]]==staff)
- weapons.type[player[closest].weaponids[0]]=knife;
- else weapons.type[player[closest].weaponids[0]]=sword;
- if(weapons.type[player[closest].weaponids[0]]==sword){
- weapons.mass[player[closest].weaponids[0]]=1.5;
- weapons.tipmass[player[closest].weaponids[0]]=1;
- weapons.length[player[closest].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[closest].weaponids[0]]==knife){
- weapons.mass[player[closest].weaponids[0]]=1;
- weapons.tipmass[player[closest].weaponids[0]]=1.2;
- weapons.length[player[closest].weaponids[0]]=.25;
- }
- }
- if(!player[closest].num_weapons){
- player[closest].weaponids[0]=weapons.numweapons;
- weapons.owner[weapons.numweapons]=closest;
- weapons.type[weapons.numweapons]=knife;
- weapons.damage[weapons.numweapons]=0;
- weapons.numweapons++;
- player[closest].num_weapons=1;
- if(weapons.type[player[closest].weaponids[0]]==sword){
- weapons.mass[player[closest].weaponids[0]]=1.5;
- weapons.tipmass[player[closest].weaponids[0]]=1;
- weapons.length[player[closest].weaponids[0]]=.8;
- }
- if(weapons.type[player[closest].weaponids[0]]==knife){
- weapons.mass[player[closest].weaponids[0]]=1;
- weapons.tipmass[player[closest].weaponids[0]]=1.2;
- weapons.length[player[closest].weaponids[0]]=.25;
- }
- }
- }
- }
-
- if(Input::isKeyDown(SDLK_u)){
- int closest=-1;
- float closestdist=-1;
- float distance;
- if(numplayers>1)
- for(int i=1;i<numplayers;i++){
- distance=findDistancefast(&player[i].coords,&player[0].coords);
- if(closestdist==-1||distance<closestdist){
- closestdist=distance;
- closest=i;
- }
- }
- player[closest].rotation+=multiplier*50;
- player[closest].targetrotation=player[closest].rotation;
- }
-
-
- if(Input::isKeyPressed(SDLK_o)&&!Input::isKeyDown(SDLK_LSHIFT)){
- int closest=-1;
- float closestdist=-1;
- float distance;
- if(numplayers>1)
- for(int i=1;i<numplayers;i++){
- distance=findDistancefast(&player[i].coords,&player[0].coords);
- if(closestdist==-1||distance<closestdist){
- closestdist=distance;
- closest=i;
- }
- }
- if(Input::isKeyDown(SDLK_LCTRL))closest=0;
-
- if(closest!=-1){
- player[closest].whichskin++;
- if(player[closest].whichskin>9)
- 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;i<player[closest].numclothes;i++){
- tintr=player[closest].clothestintr[i];
- tintg=player[closest].clothestintg[i];
- tintb=player[closest].clothestintb[i];
- AddClothes((char *)player[closest].clothes[i],&player[closest].skeleton.skinText[0]);
- }
- player[closest].DoMipmaps();
- }
- }
-
- if(Input::isKeyPressed(SDLK_o)&&Input::isKeyDown(SDLK_LSHIFT)){
- int closest=-1;
- float closestdist=-1;
- float distance;
- if(numplayers>1)
- for(int i=1;i<numplayers;i++){
- distance=findDistancefast(&player[i].coords,&player[0].coords);
- if(closestdist==-1||distance<closestdist){
- closestdist=distance;
- closest=i;
- }
- }
- if(closest!=-1){
- if(player[closest].creature==wolftype){
- headprop=player[closest].proportionhead.x/1.1;
- bodyprop=player[closest].proportionbody.x/1.1;
- armprop=player[closest].proportionarms.x/1.1;
- legprop=player[closest].proportionlegs.x/1.1;
- }
-
- if(player[closest].creature==rabbittype){
- headprop=player[closest].proportionhead.x/1.2;
- bodyprop=player[closest].proportionbody.x/1.05;
- armprop=player[closest].proportionarms.x/1.00;
- legprop=player[closest].proportionlegs.x/1.1;
- }
-
-
- if(player[closest].creature==rabbittype){
- player[closest].skeleton.id=closest;
- player[closest].skeleton.Load((char *)":Data:Skeleton:Basic Figure Wolf",(char *)":Data:Skeleton:Basic Figure Wolf Low",(char *)":Data:Skeleton:Rabbitbelt",(char *)":Data:Models:Wolf.solid",(char *)":Data:Models:Wolf2.solid",(char *)":Data:Models:Wolf3.solid",(char *)":Data:Models:Wolf4.solid",(char *)":Data:Models:Wolf5.solid",(char *)":Data:Models:Wolf6.solid",(char *)":Data:Models:Wolf7.solid",(char *)":Data:Models:Wolflow.solid",(char *)":Data:Models:Belt.solid",0);
- LoadTextureSave(":Data:Textures:Wolf.jpg",&player[closest].skeleton.drawmodel.textureptr,1,&player[closest].skeleton.skinText[closest],&player[closest].skeleton.skinsize);
- player[closest].whichskin=0;
- player[closest].creature=wolftype;
-
- player[closest].proportionhead=1.1;
- player[closest].proportionbody=1.1;
- player[closest].proportionarms=1.1;
- player[closest].proportionlegs=1.1;
- player[closest].proportionlegs.y=1.1;
- player[closest].scale=.23*5*player[0].scale;
-
- player[closest].damagetolerance=300;
- }
- else
- {
- player[closest].skeleton.id=closest;
- player[closest].skeleton.Load((char *)":Data:Skeleton:Basic Figure",(char *)":Data:Skeleton:Basic Figurelow",(char *)":Data:Skeleton:Rabbitbelt",(char *)":Data:Models:Body.solid",(char *)":Data:Models:Body2.solid",(char *)":Data:Models:Body3.solid",(char *)":Data:Models:Body4.solid",(char *)":Data:Models:Body5.solid",(char *)":Data:Models:Body6.solid",(char *)":Data:Models:Body7.solid",(char *)":Data:Models:Bodylow.solid",(char *)":Data:Models:Belt.solid",1);
- LoadTextureSave(":Data:Textures:Fur3.jpg",&player[closest].skeleton.drawmodel.textureptr,1,&player[closest].skeleton.skinText[0],&player[closest].skeleton.skinsize);
- player[closest].whichskin=0;
- player[closest].creature=rabbittype;
-
- player[closest].proportionhead=1.2;
- player[closest].proportionbody=1.05;
- player[closest].proportionarms=1.00;
- player[closest].proportionlegs=1.1;
- player[closest].proportionlegs.y=1.05;
- player[closest].scale=.2*5*player[0].scale;
-
- player[closest].damagetolerance=200;
- }
-
- if(player[closest].creature==wolftype){
- player[closest].proportionhead=1.1*headprop;
- player[closest].proportionbody=1.1*bodyprop;
- player[closest].proportionarms=1.1*armprop;
- player[closest].proportionlegs=1.1*legprop;
- }
-
- if(player[closest].creature==rabbittype){
- player[closest].proportionhead=1.2*headprop;
- player[closest].proportionbody=1.05*bodyprop;
- player[closest].proportionarms=1.00*armprop;
- player[closest].proportionlegs=1.1*legprop;
- player[closest].proportionlegs.y=1.05*legprop;
- }
-
- }
- }
-
- if(Input::isKeyPressed(SDLK_b)&&!Input::isKeyDown(SDLK_LSHIFT)){
- slomo=1-slomo;
- slomodelay=1000;
- }
-
-
- if(((Input::isKeyPressed(SDLK_i)&&!Input::isKeyDown(SDLK_LSHIFT)))){
- int closest=-1;
- float closestdist=-1;
- float distance;
- XYZ flatfacing2,flatvelocity2;
- XYZ blah;
- if(numplayers>1)
- for(int i=1;i<numplayers;i++){
- distance=findDistancefast(&player[i].coords,&player[0].coords);
- if(distance<144&&!player[i].headless)
- if(closestdist==-1||distance<closestdist){
- closestdist=distance;
- closest=i;
- blah = player[i].coords;
- }
- }
-
- if(closest!=-1){
- XYZ headspurtdirection;
- //int i = player[closest].skeleton.jointlabels[head];
- Joint& headjoint=playerJoint(closest,head);
- for(int k=0;k<player[closest].skeleton.num_joints; k++){
- if(!player[closest].skeleton.free)
- flatvelocity2=player[closest].velocity;
- if(player[closest].skeleton.free)
- flatvelocity2=headjoint.velocity;
- if(!player[closest].skeleton.free)
- flatfacing2=DoRotation(DoRotation(DoRotation(headjoint.position,0,0,player[closest].tilt),player[closest].tilt2,0,0),0,player[closest].rotation,0)*player[closest].scale+player[closest].coords;
- if(player[closest].skeleton.free)
- flatfacing2=headjoint.position*player[closest].scale+player[closest].coords;
- flatvelocity2.x+=(float)(abs(Random()%100)-50)/10;
- flatvelocity2.y+=(float)(abs(Random()%100)-50)/10;
- flatvelocity2.z+=(float)(abs(Random()%100)-50)/10;
- headspurtdirection=headjoint.position-playerJoint(closest,neck).position;
- Normalise(&headspurtdirection);
- Sprite::MakeSprite(bloodflamesprite, flatfacing2,flatvelocity2, 1,1,1, .6, 1);
- flatvelocity2+=headspurtdirection*8;
- Sprite::MakeSprite(bloodsprite, flatfacing2,flatvelocity2/2, 1,1,1, .16, 1);
- }
- Sprite::MakeSprite(cloudsprite, flatfacing2,flatvelocity2*0, .6,0,0, 1, .5);
-
- emit_sound_at(splattersound, blah);
- emit_sound_at(breaksound2, blah, 100.);
-
- if(player[closest].skeleton.free==2)player[closest].skeleton.free=0;
- player[closest].RagDoll(0);
- player[closest].dead=2;
- player[closest].headless=1;
- player[closest].DoBloodBig(3,165);
-
- camerashake+=.3;
- }
- }
-
- if(((Input::isKeyPressed(SDLK_i)&&Input::isKeyDown(SDLK_LSHIFT)))){
- int closest=-1;
- float closestdist=-1;
- float distance;
- XYZ flatfacing2,flatvelocity2;
- XYZ blah;
- if(numplayers>1)
- for(int i=1;i<numplayers;i++){
- distance=findDistancefast(&player[i].coords,&player[0].coords);
- if(distance<144)
- if(closestdist==-1||distance<closestdist){
- closestdist=distance;
- closest=i;
- blah=player[i].coords;
- }
- }
-
- if(closest!=-1){
- emit_sound_at(splattersound, blah);
-
- emit_sound_at(breaksound2, blah);
-
- for(int i=0;i<player[closest].skeleton.num_joints; i++){
- if(!player[closest].skeleton.free)flatvelocity2=player[closest].velocity;
- if(player[closest].skeleton.free)flatvelocity2=player[closest].skeleton.joints[i].velocity;
- if(!player[closest].skeleton.free)flatfacing2=DoRotation(DoRotation(DoRotation(player[closest].skeleton.joints[i].position,0,0,player[closest].tilt),player[closest].tilt2,0,0),0,player[closest].rotation,0)*player[closest].scale+player[closest].coords;
- if(player[closest].skeleton.free)flatfacing2=player[closest].skeleton.joints[i].position*player[closest].scale+player[closest].coords;
- flatvelocity2.x+=(float)(abs(Random()%100)-50)/10;
- flatvelocity2.y+=(float)(abs(Random()%100)-50)/10;
- flatvelocity2.z+=(float)(abs(Random()%100)-50)/10;
- Sprite::MakeSprite(bloodflamesprite, flatfacing2,flatvelocity2, 1,1,1, 3, 1);
- Sprite::MakeSprite(bloodsprite, flatfacing2,flatvelocity2, 1,1,1, .3, 1);
- Sprite::MakeSprite(cloudsprite, flatfacing2,flatvelocity2*0, .6,0,0, 1, .5);
- }
-
- for(int i=0;i<player[closest].skeleton.num_joints; i++){
- if(!player[closest].skeleton.free)flatvelocity2=player[closest].velocity;
- if(player[closest].skeleton.free)flatvelocity2=player[closest].skeleton.joints[i].velocity;
- if(!player[closest].skeleton.free)flatfacing2=DoRotation(DoRotation(DoRotation(player[closest].skeleton.joints[i].position,0,0,player[closest].tilt),player[closest].tilt2,0,0),0,player[closest].rotation,0)*player[closest].scale+player[closest].coords;
- if(player[closest].skeleton.free)flatfacing2=player[closest].skeleton.joints[i].position*player[closest].scale+player[closest].coords;
- flatvelocity2.x+=(float)(abs(Random()%100)-50)/10;
- flatvelocity2.y+=(float)(abs(Random()%100)-50)/10;
- flatvelocity2.z+=(float)(abs(Random()%100)-50)/10;
- Sprite::MakeSprite(bloodflamesprite, flatfacing2,flatvelocity2, 1,1,1, 3, 1);
- Sprite::MakeSprite(bloodsprite, flatfacing2,flatvelocity2, 1,1,1, .4, 1);
- }
-
- for(int i=0;i<player[closest].skeleton.num_joints; i++){
- if(!player[closest].skeleton.free)flatvelocity2=player[closest].velocity;
- if(player[closest].skeleton.free)flatvelocity2=player[closest].skeleton.joints[i].velocity;
- if(!player[closest].skeleton.free)flatfacing2=DoRotation(DoRotation(DoRotation(player[closest].skeleton.joints[i].position,0,0,player[closest].tilt),player[closest].tilt2,0,0),0,player[closest].rotation,0)*player[closest].scale+player[closest].coords;
- if(player[closest].skeleton.free)flatfacing2=player[closest].skeleton.joints[i].position*player[closest].scale+player[closest].coords;
- flatvelocity2.x+=(float)(abs(Random()%100)-50)/10;
- flatvelocity2.y+=(float)(abs(Random()%100)-50)/10;
- flatvelocity2.z+=(float)(abs(Random()%100)-50)/10;
- Sprite::MakeSprite(bloodflamesprite, flatfacing2,flatvelocity2*2, 1,1,1, 3, 1);
- Sprite::MakeSprite(bloodsprite, flatfacing2,flatvelocity2*2, 1,1,1, .4, 1);
- }
-
- for(int i=0;i<player[closest].skeleton.num_joints; i++){
- if(!player[closest].skeleton.free)flatvelocity2=player[closest].velocity;
- if(player[closest].skeleton.free)flatvelocity2=player[closest].skeleton.joints[i].velocity;
- if(!player[closest].skeleton.free)flatfacing2=DoRotation(DoRotation(DoRotation(player[closest].skeleton.joints[i].position,0,0,player[closest].tilt),player[closest].tilt2,0,0),0,player[closest].rotation,0)*player[closest].scale+player[closest].coords;
- if(player[closest].skeleton.free)flatfacing2=player[closest].skeleton.joints[i].position*player[closest].scale+player[closest].coords;
- flatvelocity2.x+=(float)(abs(Random()%100)-50)/10;
- flatvelocity2.y+=(float)(abs(Random()%100)-50)/10;
- flatvelocity2.z+=(float)(abs(Random()%100)-50)/10;
- Sprite::MakeSprite(bloodflamesprite, flatfacing2,flatvelocity2*2, 1,1,1, 3, 1);
- Sprite::MakeSprite(bloodsprite, flatfacing2,flatvelocity2*2, 1,1,1, .4, 1);
- }
-
- XYZ temppos;
- for(int j=0;j<numplayers; j++){
- if(j!=closest){
- if(findDistancefast(&player[j].coords,&player[closest].coords)<25){
- player[j].DoDamage((25-findDistancefast(&player[j].coords,&player[closest].coords))*60);
- if(player[j].skeleton.free==2)
- player[j].skeleton.free=1;
- player[j].skeleton.longdead=0;
- player[j].RagDoll(0);
- for(int i=0;i<player[j].skeleton.num_joints; i++){
- temppos=player[j].skeleton.joints[i].position+player[j].coords;
- if(findDistancefast(&temppos,&player[closest].coords)<25){
- flatvelocity2=temppos-player[closest].coords;
- Normalise(&flatvelocity2);
- player[j].skeleton.joints[i].velocity+=flatvelocity2*((20-findDistancefast(&temppos,&player[closest].coords))*20);
- }
- }
- }
- }
- }
-
- player[closest].DoDamage(10000);
- player[closest].RagDoll(0);
- player[closest].dead=2;
- player[closest].coords=20;
- player[closest].skeleton.free=2;
-
- camerashake+=.6;
-
- }
- }
-
- if(Input::isKeyPressed(SDLK_f)){
- player[0].onfire=1-player[0].onfire;
- if(player[0].onfire){
- player[0].CatchFire();
- }
- if(!player[0].onfire){
- emit_sound_at(fireendsound, player[0].coords);
- pause_sound(stream_firesound);
- }
- }
-
- if(Input::isKeyPressed(SDLK_n)&&!Input::isKeyDown(SDLK_LCTRL)){
- //if(!player[0].skeleton.free)player[0].damage+=500;
- player[0].RagDoll(0);
- //player[0].spurt=1;
- //player[0].DoDamage(1000);
-
- emit_sound_at(whooshsound, player[0].coords, 128.);
- }
-
- if(Input::isKeyPressed(SDLK_n)&&Input::isKeyDown(SDLK_LCTRL)){
- int closest=-1;
- float closestdist=-1;
- float distance;
- for(int i=0;i<objects.numobjects;i++){
- if(objects.type[i]==treeleavestype){
- objects.scale[i]*=.9;
- }
- }
- }
-
- if(Input::isKeyPressed(SDLK_m)&&Input::isKeyDown(SDLK_LSHIFT)){
- editorenabled=1-editorenabled;
- if(editorenabled){
- player[0].damagetolerance=100000;
- } else {
- player[0].damagetolerance=200;
- }
- player[0].damage=0; // these lines were in both if and else, but I think they would better fit in the if
- player[0].permanentdamage=0;
- player[0].superpermanentdamage=0;
- player[0].bloodloss=0;
- player[0].deathbleeding=0;
- }
-
- //skip level
- if(whichlevel!=-2&&Input::isKeyPressed(SDLK_k)&&Input::isKeyDown(SDLK_LSHIFT)&&!editorenabled){
- targetlevel++;
- if(targetlevel>numchallengelevels-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;i<numplayers;i++){
- distance=findDistancefast(&player[i].coords,&player[0].coords);
- if(closestdist==-1||distance<closestdist){
- closestdist=distance;
- closest=i;
- }
- }
- if(closestdist>0&&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;i<max_objects;i++){
- distance=findDistancefast(&objects.position[i],&player[0].coords);
- if(closestdist==-1||distance<closestdist){
- closestdist=distance;
- closest=i;
- }
- }
- if(closestdist>0&&closest>=0){
- objects.position[closest].y-=500;
- }
- }
-
- if(Input::isKeyPressed(SDLK_m)&&Input::isKeyDown(SDLK_LSHIFT)){
- //drawmode++;
- //if(drawmode>2)drawmode=0;
- if(objects.numobjects<max_objects-1){
- XYZ boxcoords;
- boxcoords.x=player[0].coords.x;
- boxcoords.z=player[0].coords.z;
- boxcoords.y=player[0].coords.y-3;
- if(editortype==bushtype)boxcoords.y=player[0].coords.y-.5;
- if(editortype==firetype)boxcoords.y=player[0].coords.y-.5;
- //objects.MakeObject(abs(Random()%3),boxcoords,Random()%360);
- float temprotat,temprotat2;
- temprotat=editorrotation;
- temprotat2=editorrotation2;
- if(temprotat<0||editortype==bushtype)temprotat=Random()%360;
- if(temprotat2<0)temprotat2=Random()%360;
-
- objects.MakeObject(editortype,boxcoords,(int)temprotat-((int)temprotat)%30,(int)temprotat2,editorsize);
- if(editortype==treetrunktype)
- objects.MakeObject(treeleavestype,boxcoords,Random()%360*(temprotat2<2)+(int)editorrotation-((int)editorrotation)%30,editorrotation2,editorsize);
- }
- }
-
- if(Input::isKeyPressed(SDLK_p)&&Input::isKeyDown(SDLK_LSHIFT)&&!Input::isKeyDown(SDLK_LCTRL)){
- if(numplayers<maxplayers-1){
- player[numplayers].scale=.2*5*player[0].scale;
- player[numplayers].creature=rabbittype;
- player[numplayers].howactive=editoractive;
- player[numplayers].skeleton.id=numplayers;
- player[numplayers].skeleton.Load((char *)":Data:Skeleton:Basic Figure",(char *)":Data:Skeleton:Basic Figurelow",(char *)":Data:Skeleton:Rabbitbelt",(char *)":Data:Models:Body.solid",(char *)":Data:Models:Body2.solid",(char *)":Data:Models:Body3.solid",(char *)":Data:Models:Body4.solid",(char *)":Data:Models:Body5.solid",(char *)":Data:Models:Body6.solid",(char *)":Data:Models:Body7.solid",(char *)":Data:Models:Bodylow.solid",(char *)":Data:Models:Belt.solid",1);
-
- //texsize=512*512*3/texdetail/texdetail;
- //if(!player[numplayers].loaded)player[numplayers].skeleton.skinText = new GLubyte[texsize];
- //player[numplayers].skeleton.skinText.resize(texsize);
-
- int k=abs(Random()%2)+1;
- if(k==0){
- LoadTextureSave(":Data:Textures:Fur3.jpg",&player[numplayers].skeleton.drawmodel.textureptr,1,&player[numplayers].skeleton.skinText[0],&player[numplayers].skeleton.skinsize);
- player[numplayers].whichskin=0;
- }
- else if(k==1){
- LoadTextureSave(":Data:Textures:Fur.jpg",&player[numplayers].skeleton.drawmodel.textureptr,1,&player[numplayers].skeleton.skinText[0],&player[numplayers].skeleton.skinsize);
- player[numplayers].whichskin=1;
- }
- else {
- LoadTextureSave(":Data:Textures:Fur2.jpg",&player[numplayers].skeleton.drawmodel.textureptr,1,&player[numplayers].skeleton.skinText[0],&player[numplayers].skeleton.skinsize);
- player[numplayers].whichskin=2;
- }
-
- LoadTexture(":Data:Textures:Belt.png",&player[numplayers].skeleton.drawmodelclothes.textureptr,1,1);
- player[numplayers].power=1;
- player[numplayers].speedmult=1;
- player[numplayers].currentanimation=bounceidleanim;
- player[numplayers].targetanimation=bounceidleanim;
- player[numplayers].currentframe=0;
- player[numplayers].targetframe=1;
- player[numplayers].target=0;
- player[numplayers].bled=0;
- player[numplayers].speed=1+(float)(Random()%100)/1000;
-
- player[numplayers].targetrotation=player[0].targetrotation;
- player[numplayers].rotation=player[0].rotation;
-
- player[numplayers].velocity=0;
- player[numplayers].coords=player[0].coords;
- player[numplayers].oldcoords=player[numplayers].coords;
- player[numplayers].realoldcoords=player[numplayers].coords;
-
- player[numplayers].id=numplayers;
- player[numplayers].skeleton.id=numplayers;
- player[numplayers].updatedelay=0;
- player[numplayers].normalsupdatedelay=0;
-
- player[numplayers].aitype=passivetype;
-
- if(player[0].creature==wolftype){
- headprop=player[0].proportionhead.x/1.1;
- bodyprop=player[0].proportionbody.x/1.1;
- armprop=player[0].proportionarms.x/1.1;
- legprop=player[0].proportionlegs.x/1.1;
- }
-
- if(player[0].creature==rabbittype){
- headprop=player[0].proportionhead.x/1.2;
- bodyprop=player[0].proportionbody.x/1.05;
- armprop=player[0].proportionarms.x/1.00;
- legprop=player[0].proportionlegs.x/1.1;
- }
-
- if(player[numplayers].creature==wolftype){
- player[numplayers].proportionhead=1.1*headprop;
- player[numplayers].proportionbody=1.1*bodyprop;
- player[numplayers].proportionarms=1.1*armprop;
- player[numplayers].proportionlegs=1.1*legprop;
- }
-
- if(player[numplayers].creature==rabbittype){
- player[numplayers].proportionhead=1.2*headprop;
- player[numplayers].proportionbody=1.05*bodyprop;
- player[numplayers].proportionarms=1.00*armprop;
- player[numplayers].proportionlegs=1.1*legprop;
- player[numplayers].proportionlegs.y=1.05*legprop;
- }
-
- player[numplayers].headless=0;
- player[numplayers].onfire=0;
-
- if(cellophane){
- player[numplayers].proportionhead.z=0;
- player[numplayers].proportionbody.z=0;
- player[numplayers].proportionarms.z=0;
- player[numplayers].proportionlegs.z=0;
- }
-
- player[numplayers].tempanimation.Load((char *)"Tempanim",0,0);
-
- player[numplayers].damagetolerance=200;
-
- player[numplayers].protectionhead=player[0].protectionhead;
- player[numplayers].protectionhigh=player[0].protectionhigh;
- player[numplayers].protectionlow=player[0].protectionlow;
- player[numplayers].armorhead=player[0].armorhead;
- player[numplayers].armorhigh=player[0].armorhigh;
- player[numplayers].armorlow=player[0].armorlow;
- player[numplayers].metalhead=player[0].metalhead;
- player[numplayers].metalhigh=player[0].metalhigh;
- player[numplayers].metallow=player[0].metallow;
-
- player[numplayers].immobile=player[0].immobile;
-
- player[numplayers].numclothes=player[0].numclothes;
- if(player[numplayers].numclothes)
- for(int i=0;i<player[numplayers].numclothes;i++){
- strcpy(player[numplayers].clothes[i], player[0].clothes[i]);
- player[numplayers].clothestintr[i]=player[0].clothestintr[i];
- player[numplayers].clothestintg[i]=player[0].clothestintg[i];
- player[numplayers].clothestintb[i]=player[0].clothestintb[i];
- tintr=player[numplayers].clothestintr[i];
- tintg=player[numplayers].clothestintg[i];
- tintb=player[numplayers].clothestintb[i];
- AddClothes((char *)player[numplayers].clothes[i],&player[numplayers].skeleton.skinText[0]);
- }
- if(player[numplayers].numclothes){
- player[numplayers].DoMipmaps();
- }
-
- player[numplayers].power=player[0].power;
- player[numplayers].speedmult=player[0].speedmult;
-
- player[numplayers].damage=0;
- player[numplayers].permanentdamage=0;
- player[numplayers].superpermanentdamage=0;
- player[numplayers].deathbleeding=0;
- player[numplayers].bleeding=0;
- player[numplayers].numwaypoints=0;
- player[numplayers].waypoint=0;
- player[numplayers].jumppath=0;
- player[numplayers].weaponstuck=-1;
- player[numplayers].weaponactive=-1;
- player[numplayers].num_weapons=0;
- player[numplayers].bloodloss=0;
- player[numplayers].dead=0;
-
- player[numplayers].loaded=1;
-
- numplayers++;
- }
- }
-
- if(Input::isKeyPressed(SDLK_p)&&Input::isKeyDown(SDLK_LSHIFT)){
- if(player[numplayers-1].numwaypoints<90){
- player[numplayers-1].waypoints[player[numplayers-1].numwaypoints]=player[0].coords;
- player[numplayers-1].waypointtype[player[numplayers-1].numwaypoints]=editorpathtype;
- player[numplayers-1].numwaypoints++;
- }
- }
-
- if(Input::isKeyPressed(SDLK_p)&&Input::isKeyDown(SDLK_LCTRL)){
- if(numpathpoints<30){
- bool connected,alreadyconnected;
- connected=0;
- if(numpathpoints>1)
- for(int i=0;i<numpathpoints;i++){
- if(findDistancefast(&pathpoint[i],&player[0].coords)<.5&&i!=pathpointselected&&!connected){
- alreadyconnected=0;
- for(int j=0;j<numpathpointconnect[pathpointselected];j++){
- if(pathpointconnect[pathpointselected][j]==i)alreadyconnected=1;
- }
- if(!alreadyconnected){
- numpathpointconnect[pathpointselected]++;
- connected=1;
- pathpointconnect[pathpointselected][numpathpointconnect[pathpointselected]-1]=i;
- }
- }
- }
- if(!connected){
- numpathpoints++;
- pathpoint[numpathpoints-1]=player[0].coords;
- numpathpointconnect[numpathpoints-1]=0;
- if(numpathpoints>1&&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;i<numpathpointconnect[pathpointselected];i++){
- pathpointconnect[pathpointselected][i]=pathpointconnect[numpathpoints][i];
- }
- for(int i=0;i<numpathpoints;i++){
- for(int j=0;j<numpathpointconnect[i];j++){
- if(pathpointconnect[i][j]==pathpointselected){
- pathpointconnect[i][j]=pathpointconnect[i][numpathpointconnect[i]-1];
- numpathpointconnect[i]--;
- }
- if(pathpointconnect[i][j]==numpathpoints){
- pathpointconnect[i][j]=pathpointselected;
- }
- }
- }
- pathpointselected=numpathpoints-1;
- }
- }
-
- if(Input::isKeyPressed(SDLK_LEFT)&&Input::isKeyDown(SDLK_LSHIFT)&&!Input::isKeyDown(SDLK_LCTRL)){
- editortype--;
- if(editortype==treeleavestype||editortype==10)editortype--;
- if(editortype<0)editortype=firetype;
- }
-
- if(Input::isKeyPressed(SDLK_RIGHT)&&Input::isKeyDown(SDLK_LSHIFT)&&!Input::isKeyDown(SDLK_LCTRL)){
- editortype++;
- if(editortype==treeleavestype||editortype==10)editortype++;
- if(editortype>firetype)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;i<objects.numobjects;i++){
- distance=findDistancefast(&objects.position[i],&player[0].coords);
- if(closestdist==-1||distance<closestdist){
- closestdist=distance;
- closest=i;
- }
- }
- if(closestdist>0&&closest>=0)objects.DeleteObject(closest);
- }
- }
- }
-}
-
-
-
-void Game::doJumpReversals(){
- for(int k=0;k<numplayers;k++)
- for(int i=k;i<numplayers;i++){
- if(i==k)continue;
- if( player[k].skeleton.free==0&&
- player[i].skeleton.oldfree==0&&
- (player[i].targetanimation==jumpupanim||
- player[k].targetanimation==jumpupanim)&&
- (player[i].aitype==playercontrolled||
- player[k].aitype==playercontrolled)&&
- (player[i].aitype==attacktypecutoff&&player[i].stunned<=0||
- player[k].aitype==attacktypecutoff&&player[k].stunned<=0)){
- if( findDistancefast(&player[i].coords,&player[k].coords)<10*sq((player[i].scale+player[k].scale)*2.5)&&
- findDistancefastflat(&player[i].coords,&player[k].coords)<2*sq((player[i].scale+player[k].scale)*2.5)){
- //TODO: refactor two huge similar ifs
- if(player[i].targetanimation==jumpupanim&&
- player[k].targetanimation!=getupfrombackanim&&
- player[k].targetanimation!=getupfromfrontanim&&
- animation[player[k].targetanimation].height==middleheight&&
- normaldotproduct(player[i].velocity,player[k].coords-player[i].coords)<0&&
- (player[k].aitype==playercontrolled&&player[k].attackkeydown||
- player[k].aitype!=playercontrolled)){
- player[i].victim=&player[k];
- player[i].velocity=0;
- player[i].currentanimation=jumpreversedanim;
- player[i].targetanimation=jumpreversedanim;
- player[i].currentframe=0;
- player[i].targetframe=1;
- player[i].targettilt2=0;
- player[k].victim=&player[i];
- player[k].velocity=0;
- player[k].currentanimation=jumpreversalanim;
- player[k].targetanimation=jumpreversalanim;
- player[k].currentframe=0;
- player[k].targetframe=1;
- player[k].targettilt2=0;
- if(player[i].coords.y<player[k].coords.y+1){
- player[i].currentanimation=rabbitkickreversedanim;
- player[i].targetanimation=rabbitkickreversedanim;
- player[i].currentframe=1;
- player[i].targetframe=2;
- player[k].currentanimation=rabbitkickreversalanim;
- player[k].targetanimation=rabbitkickreversalanim;
- player[k].currentframe=1;
- player[k].targetframe=2;
- }
- player[i].target=0;
- player[k].oldcoords=player[k].coords;
- player[i].coords=player[k].coords;
- player[k].targetrotation=player[i].targetrotation;
- player[k].rotation=player[i].targetrotation;
- if(player[k].aitype==attacktypecutoff)
- player[k].stunned=.5;
- }
- if(player[k].targetanimation==jumpupanim&&
- player[i].targetanimation!=getupfrombackanim&&
- player[i].targetanimation!=getupfromfrontanim&&
- animation[player[i].targetanimation].height==middleheight&&
- normaldotproduct(player[k].velocity,player[i].coords-player[k].coords)<0&&
- ((player[i].aitype==playercontrolled&&player[i].attackkeydown)||
- player[i].aitype!=playercontrolled)){
- player[k].victim=&player[i];
- player[k].velocity=0;
- player[k].currentanimation=jumpreversedanim;
- player[k].targetanimation=jumpreversedanim;
- player[k].currentframe=0;
- player[k].targetframe=1;
- player[k].targettilt2=0;
- player[i].victim=&player[k];
- player[i].velocity=0;
- player[i].currentanimation=jumpreversalanim;
- player[i].targetanimation=jumpreversalanim;
- player[i].currentframe=0;
- player[i].targetframe=1;
- player[i].targettilt2=0;
- if(player[k].coords.y<player[i].coords.y+1){
- player[k].targetanimation=rabbitkickreversedanim;
- player[k].currentanimation=rabbitkickreversedanim;
- player[i].currentanimation=rabbitkickreversalanim;
- player[i].targetanimation=rabbitkickreversalanim;
- player[k].currentframe=1;
- player[k].targetframe=2;
- player[i].currentframe=1;
- player[i].targetframe=2;
- }
- player[k].target=0;
- player[i].oldcoords=player[i].coords;
- player[k].coords=player[i].coords;
- player[i].targetrotation=player[k].targetrotation;
- player[i].rotation=player[k].targetrotation;
- if(player[i].aitype==attacktypecutoff)
- player[i].stunned=.5;
- }
- }
- }
- }
-}
-
-void Game::doAerialAcrobatics(){
- static XYZ facing,flatfacing;
- for(int k=0;k<numplayers;k++){
- player[k].turnspeed=500;
-
- if((player[k].isRun()&&
- ((player[k].targetrotation!=rabbitrunninganim&&
- player[k].targetrotation!=wolfrunninganim)||
- player[k].targetframe==4))||
- player[k].targetanimation==removeknifeanim||
- player[k].targetanimation==crouchremoveknifeanim||
- player[k].targetanimation==flipanim||
- player[k].targetanimation==fightsidestep||
- player[k].targetanimation==walkanim){
- player[k].rotation=stepTowardf(player[k].rotation, player[k].targetrotation, multiplier*player[k].turnspeed);
- }
-
-
- if(player[k].isStop()||
- player[k].isLanding()||
- player[k].targetanimation==staggerbackhighanim||
- (player[k].targetanimation==sneakanim&&player[k].currentanimation==sneakanim)||
- player[k].targetanimation==staggerbackhardanim||
- player[k].targetanimation==backhandspringanim||
- player[k].targetanimation==dodgebackanim||
- player[k].targetanimation==rollanim||
- (animation[player[k].targetanimation].attack&&
- player[k].targetanimation!=rabbitkickanim&&
- (player[k].targetanimation!=crouchstabanim||player[k].hasvictim)&&
- (player[k].targetanimation!=swordgroundstabanim||player[k].hasvictim))){
- player[k].rotation=stepTowardf(player[k].rotation, player[k].targetrotation, multiplier*player[k].turnspeed*2);
- }
-
- if(player[k].targetanimation==sneakanim&&player[k].currentanimation!=sneakanim){
- player[k].rotation=stepTowardf(player[k].rotation, player[k].targetrotation, multiplier*player[k].turnspeed*4);
- }
-
- /*if(player[k].aitype!=passivetype||(findDistancefast(&player[k].coords,&viewer)<viewdistance*viewdistance))*/
- player[k].DoStuff();
- if(player[k].immobile&&k!=0)
- player[k].coords=player[k].realoldcoords;
-
- //if player's position has changed (?)
- if(findDistancefast(&player[k].coords,&player[k].realoldcoords)>0&&
- !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<terrain.patchobjectnum[player[k].whichpatchx][player[k].whichpatchz];l++){
- int i=terrain.patchobjects[player[k].whichpatchx][player[k].whichpatchz][l];
- if(objects.type[i]!=rocktype||
- objects.scale[i]>.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.y<terrain.getHeight(player[k].coords.x,player[k].coords.z)&&
- player[k].coords.y>terrain.getHeight(player[k].coords.x,player[k].coords.z)-.1)
- player[k].coords.y=terrain.getHeight(player[k].coords.x,player[k].coords.z);
- if(player[k].SphereCheck(&lowpoint, 1.3, &colpoint, &objects.position[i], &objects.rotation[i], &objects.model[i])!=-1){
- flatfacing=lowpoint-player[k].coords;
- player[k].coords=lowpoint;
- player[k].coords.y-=1.3;
- player[k].collide=1;
- tempcollide=1;
- //wall jumps
- //TODO: refactor four similar blocks
- if(player[k].aitype==playercontrolled&&
- (player[k].targetanimation==jumpupanim||
- player[k].targetanimation==jumpdownanim||
- player[k].isFlip())&&
- !player[k].jumptogglekeydown&&
- player[k].jumpkeydown){
- lowpointtarget=lowpoint+DoRotation(player[k].facing,0,-90,0)*1.5;
- XYZ tempcoords1=lowpoint;
- whichhit=objects.model[i].LineCheck(&lowpoint,&lowpointtarget,&colpoint,&objects.position[i],&objects.rotation[i]);
- if(whichhit!=-1&&fabs(objects.model[i].facenormals[whichhit].y)<.3){
- setAnimation(k,walljumpleftanim);
- emit_sound_at(movewhooshsound, player[k].coords);
- if(k==0)
- pause_sound(whooshsound);
-
- lowpointtarget=DoRotation(objects.model[i].facenormals[whichhit],0,objects.rotation[i],0);
- player[k].rotation=-asin(0-lowpointtarget.x)*180/M_PI;
- if(lowpointtarget.z<0)
- player[k].rotation=180-player[k].rotation;
- player[k].targetrotation=player[k].rotation;
- player[k].lowrotation=player[k].rotation;
- if(k==0)
- numwallflipped++;
- }
- else
- {
- lowpoint=tempcoords1;
- lowpointtarget=lowpoint+DoRotation(player[k].facing,0,90,0)*1.5;
- whichhit=objects.model[i].LineCheck(&lowpoint,&lowpointtarget,&colpoint,&objects.position[i],&objects.rotation[i]);
- if(whichhit!=-1&&fabs(objects.model[i].facenormals[whichhit].y)<.3){
- setAnimation(k,walljumprightanim);
- emit_sound_at(movewhooshsound, player[k].coords);
- if(k==0)pause_sound(whooshsound);
-
- lowpointtarget=DoRotation(objects.model[i].facenormals[whichhit],0,objects.rotation[i],0);
- player[k].rotation=-asin(0-lowpointtarget.x)*180/M_PI;
- if(lowpointtarget.z<0)player[k].rotation=180-player[k].rotation;
- player[k].targetrotation=player[k].rotation;
- player[k].lowrotation=player[k].rotation;
- if(k==0)numwallflipped++;
- }
- else
- {
- lowpoint=tempcoords1;
- lowpointtarget=lowpoint+player[k].facing*2;
- whichhit=objects.model[i].LineCheck(&lowpoint,&lowpointtarget,&colpoint,&objects.position[i],&objects.rotation[i]);
- if(whichhit!=-1&&fabs(objects.model[i].facenormals[whichhit].y)<.3){
- setAnimation(k,walljumpbackanim);
- emit_sound_at(movewhooshsound, player[k].coords);
- if(k==0)pause_sound(whooshsound);
-
- lowpointtarget=DoRotation(objects.model[i].facenormals[whichhit],0,objects.rotation[i],0);
- player[k].rotation=-asin(0-lowpointtarget.x)*180/M_PI;
- if(lowpointtarget.z<0)player[k].rotation=180-player[k].rotation;
- player[k].targetrotation=player[k].rotation;
- player[k].lowrotation=player[k].rotation;
- if(k==0)numwallflipped++;
- }
- else
- {
- lowpoint=tempcoords1;
- lowpointtarget=lowpoint-player[k].facing*2;
- whichhit=objects.model[i].LineCheck(&lowpoint,&lowpointtarget,&colpoint,&objects.position[i],&objects.rotation[i]);
- if(whichhit!=-1&&fabs(objects.model[i].facenormals[whichhit].y)<.3){
- setAnimation(k,walljumpfrontanim);
- emit_sound_at(movewhooshsound, player[k].coords);
- if(k==0)pause_sound(whooshsound);
-
- lowpointtarget=DoRotation(objects.model[i].facenormals[whichhit],0,objects.rotation[i],0);
- player[k].rotation=-asin(0-lowpointtarget.x)*180/M_PI;
- if(lowpointtarget.z<0)player[k].rotation=180-player[k].rotation;
- player[k].rotation+=180;
- player[k].targetrotation=player[k].rotation;
- player[k].lowrotation=player[k].rotation;
- if(k==0)numwallflipped++;
- }
- }
- }
- }
- }
- }
- }
- else if(objects.type[i]==rocktype){
- lowpoint2=player[k].coords;
- lowpoint=player[k].coords;
- lowpoint.y+=2;
- if(objects.model[i].LineCheck(&lowpoint,&lowpoint2,&colpoint,&objects.position[i],&objects.rotation[i])!=-1){
- player[k].coords=colpoint;
- player[k].collide=1;
- tempcollide=1;
-
- if(player[k].targetanimation==jumpdownanim||player[k].isFlip()){
- //flipped into a rock
- if(player[k].isFlip()&&animation[player[k].targetanimation].label[player[k].targetframe]==7)
- player[k].RagDoll(0);
-
- if(player[k].targetanimation==jumpupanim){
- player[k].jumppower=-4;
- player[k].targetanimation=player[k].getIdle();
- }
- player[k].target=0;
- player[k].targetframe=0;
- player[k].onterrain=1;
-
- if(player[k].id==0){
- pause_sound(whooshsound);
- OPENAL_SetVolume(channels[whooshsound], 0);
- }