X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=Source%2FWeapons.cpp;h=f6cf200fe8d5ef519b3d0222bb62796c292eea38;hb=2f6f7fe7b9562156a966b6cfd62afb2dc69734f7;hp=2f87d33e3a6330e40a2b632c90db4efcffa71404;hpb=9842b9043399f44a19c58d15e297d2a9dfadd272;p=lugaru.git diff --git a/Source/Weapons.cpp b/Source/Weapons.cpp index 2f87d33..f6cf200 100644 --- a/Source/Weapons.cpp +++ b/Source/Weapons.cpp @@ -98,7 +98,8 @@ void Weapon::setType(int t) { } void Weapon::DoStuff(int i) { - static int whichpatchx,whichpatchz,whichhit,m; + //~ cout << position.x << "," << position.y << "," << position.z << "|" << tippoint.x << "," << tippoint.y << "," << tippoint.z << endl; + static int whichpatchx,whichpatchz,whichhit; static XYZ start,end,colpoint,normalrot,footvel,footpoint; static XYZ terrainnormal; static XYZ vel; @@ -116,20 +117,27 @@ void Weapon::DoStuff(int i) { static XYZ extramove; static float tempmult; - if(owner!=-1){ + if(owner!=-1) { oldowner=owner; } - if(damage>=2 && type==staff && owner!=-1){ + if(damage>=2 && type==staff && owner!=-1) { // the staff breaks emit_sound_at(staffbreaksound, tippoint); XYZ tempvel; - for(int j=0;j<40;j++){ + for(int j=0;j<40;j++) { tempvel.x=float(abs(Random()%100)-50)/20; tempvel.y=float(abs(Random()%100)-50)/20; tempvel.z=float(abs(Random()%100)-50)/20; Sprite::MakeSprite(splintersprite, position+(tippoint-position)*((float)j-8)/32,tempvel*.5, 115/255,73/255,12/255, .1, 1); } - int tempowner; - tempowner=owner; + if(owner!=-1) { + player[owner].weaponactive=-1; + player[owner].num_weapons--; + if(player[owner].num_weapons) { + player[owner].weaponids[0]=player[owner].weaponids[player[owner].num_weapons]; + if(player[owner].weaponstuck==player[owner].num_weapons) + player[owner].weaponstuck=0; + } + } owner=-1; hitsomething=0; missed=1; @@ -137,38 +145,32 @@ void Weapon::DoStuff(int i) { firstfree=1; position=0; physics=0; - if(tempowner!=-1) { - player[tempowner].num_weapons--; - if(player[tempowner].num_weapons) { - player[tempowner].weaponids[0]=player[tempowner].weaponids[player[tempowner].num_weapons]; - if(player[tempowner].weaponstuck==player[tempowner].num_weapons) - player[tempowner].weaponstuck=0; - } - player[tempowner].weaponactive=-1; - } } oldposition=position; oldtippoint=tippoint; - if(owner==-1&&(velocity.x||velocity.y||velocity.z)&&!physics){ + if(owner==-1 && (velocity.x||velocity.y||velocity.z) && !physics) { // if the weapon is flying position+=velocity*multiplier; tippoint+=velocity*multiplier; whichpatchx=position.x/(terrain.size/subdivision*terrain.scale); whichpatchz=position.z/(terrain.size/subdivision*terrain.scale); - if(whichpatchx>0 && whichpatchz>0 && whichpatchx0 && whichpatchz>0 && whichpatchxtemppoint2.x)rotation1=360-rotation1; + if(temppoint1.x>temppoint2.x) + rotation1=360-rotation1; rotation3=0; smallrotation=90; @@ -206,164 +209,176 @@ void Weapon::DoStuff(int i) { } } } - if(velocity.x||velocity.y||velocity.z) - for(int j=0;j0){ - player[j].weaponids[player[j].num_weapons]=player[j].weaponids[0]; - } - player[j].num_weapons++; - player[j].weaponids[0]=i; + } + + if(velocity.x||velocity.y||velocity.z) { + for(int j=0;j0){ + player[j].weaponids[player[j].num_weapons]=player[j].weaponids[0]; + } + player[j].num_weapons++; + player[j].weaponids[0]=i; - player[j].aitype=attacktypecutoff; + player[j].aitype=attacktypecutoff; + } + else { + if(j!=0) numthrowkill++; + player[j].num_weapons++; + player[j].weaponstuck=player[j].num_weapons-1; + if(normaldotproduct(player[j].facing,velocity)>0) + player[j].weaponstuckwhere=1; + else + player[j].weaponstuckwhere=0; + + player[j].weaponids[player[j].num_weapons-1]=i; + + player[j].RagDoll(0); + player[j].skeleton.joints[player[j].skeleton.jointlabels[abdomen]].velocity+=velocity*2; + player[j].skeleton.joints[player[j].skeleton.jointlabels[neck]].velocity+=velocity*2; + player[j].skeleton.joints[player[j].skeleton.jointlabels[rightshoulder]].velocity+=velocity*2; + player[j].skeleton.joints[player[j].skeleton.jointlabels[leftshoulder]].velocity+=velocity*2; + if(bloodtoggle&&tutoriallevel!=1) + Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .8, .3); + if(tutoriallevel==1) + Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,1,1, .8, .3); + footvel=tippoint-position; + Normalise(&footvel); + if(bloodtoggle&&tutoriallevel!=1) + Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*-1, 1,0,0, .6, 1); + + if(tutoriallevel!=1) { + if(player[j].weaponstuckwhere==0) + player[j].DoBloodBig(2,205); + if(player[j].weaponstuckwhere==1) + player[j].DoBloodBig(2,200); + player[j].damage+=200/player[j].armorhigh; + player[j].deathbleeding=1; + player[j].bloodloss+=(200+abs((float)(Random()%40))-20)/player[j].armorhigh; + owner=j; + bloody=2; + blooddrip=5; } - else { - if(j!=0)numthrowkill++; - player[j].num_weapons++; - player[j].weaponstuck=player[j].num_weapons-1; - if(normaldotproduct(player[j].facing,velocity)>0)player[j].weaponstuckwhere=1; - else player[j].weaponstuckwhere=0; - - player[j].weaponids[player[j].num_weapons-1]=i; - - player[j].RagDoll(0); - player[j].skeleton.joints[player[j].skeleton.jointlabels[abdomen]].velocity+=velocity*2; - player[j].skeleton.joints[player[j].skeleton.jointlabels[neck]].velocity+=velocity*2; - player[j].skeleton.joints[player[j].skeleton.jointlabels[rightshoulder]].velocity+=velocity*2; - player[j].skeleton.joints[player[j].skeleton.jointlabels[leftshoulder]].velocity+=velocity*2; - if(bloodtoggle&&tutoriallevel!=1) - Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,0,0, .8, .3); - if(tutoriallevel==1) - Sprite::MakeSprite(cloudimpactsprite, footpoint,footvel, 1,1,1, .8, .3); - footvel=tippoint-position; - Normalise(&footvel); - if(bloodtoggle&&tutoriallevel!=1) - Sprite::MakeSprite(bloodflamesprite, footpoint,footvel*-1, 1,0,0, .6, 1); - - if(tutoriallevel!=1) { - if(player[j].weaponstuckwhere==0) - player[j].DoBloodBig(2,205); - if(player[j].weaponstuckwhere==1) - player[j].DoBloodBig(2,200); - player[j].damage+=200/player[j].armorhigh; - player[j].deathbleeding=1; - player[j].bloodloss+=(200+abs((float)(Random()%40))-20)/player[j].armorhigh; - owner=j; - bloody=2; - blooddrip=5; - } - emit_sound_at(fleshstabsound, position, 128.); + emit_sound_at(fleshstabsound, position, 128.); - if(animation[player[0].targetanimation].height==highheight) - award_bonus(0, ninja); - else - award_bonus(0, Bullseyebonus); - } + if(animation[player[0].targetanimation].height==highheight) + award_bonus(0, ninja); + else + award_bonus(0, Bullseyebonus); } - else missed=1; } + else missed=1; + } + } + } + if(position.ytemppoint2.x) rotation1=360-rotation1; + else if(environment==grassyenvironment){ + if(findDistancefast(&position,&viewer)temppoint2.x) rotation1=360-rotation1; + } + } + //Sword physics XYZ mid; XYZ oldmid; @@ -384,8 +399,10 @@ void Weapon::DoStuff(int i) { newpoint1=midp-vel*length*(tipmass/(mass+tipmass)); newpoint2=midp+vel*length*(mass/(mass+tipmass)); if(!freeze){ - if(freetime>.04)velocity=velocity+(newpoint1-position)/multiplier; - if(freetime>.04)tipvelocity=tipvelocity+(newpoint2-tippoint)/multiplier; + if(freetime>.04) { + velocity=velocity+(newpoint1-position)/multiplier; + tipvelocity=tipvelocity+(newpoint2-tippoint)/multiplier; + } } position=newpoint1; tippoint=newpoint2; @@ -395,41 +412,40 @@ void Weapon::DoStuff(int i) { whichpatchx=(position.x)/(terrain.size/subdivision*terrain.scale); whichpatchz=(position.z)/(terrain.size/subdivision*terrain.scale); if(whichpatchx>0&&whichpatchz>0&&whichpatchx0)velocity*=1-friction*frictionness; else velocity=0; velocity+=bounceness*elasticity; - if(findLengthfast(&bounceness)>1){ + if(findLengthfast(&bounceness)>1) { int whichsound; - if(type==staff)whichsound=footstepsound3+abs(Random()%2); - if(type!=staff)whichsound=clank1sound+abs(Random()%4); + if(type==staff) + whichsound=footstepsound3+abs(Random()%2); + else + whichsound=clank1sound+abs(Random()%4); emit_sound_at(whichsound, position, 128*findLengthfast(&bounceness)); } } start=oldtippoint; end=tippoint; whichhit=objects.model[k].LineCheck(&start,&end,&colpoint,&objects.position[k],&objects.rotation[k]); - if(whichhit!=-1){ + if(whichhit!=-1) { hitsomething=1; tippoint=colpoint; terrainnormal=DoRotation(objects.model[k].facenormals[whichhit],0,objects.rotation[k],0)*-1; @@ -479,14 +498,16 @@ void Weapon::DoStuff(int i) { if(findLengthfast(&bounceness)>1){ int whichsound; - if(type==staff)whichsound=footstepsound3+abs(Random()%2); - if(type!=staff)whichsound=clank1sound+abs(Random()%4); + if(type==staff) + whichsound=footstepsound3+abs(Random()%2); + else + whichsound=clank1sound+abs(Random()%4); emit_sound_at(whichsound, position, 128*findLengthfast(&bounceness)); } } - if((objects.type[k]!=boxtype&&objects.type[k]!=platformtype&&objects.type[k]!=walltype&&objects.type[k]!=weirdtype)||objects.rotation2[k]!=0) - for(m=0;m<2;m++){ + if((objects.type[k]!=boxtype && objects.type[k]!=platformtype && objects.type[k]!=walltype && objects.type[k]!=weirdtype)||objects.rotation2[k]!=0) + for(int m=0;m<2;m++){ mid=(position*(21+(float)m*10)+tippoint*(19-(float)m*10))/40; oldmid2=mid; oldmid=(oldposition*(21+(float)m*10)+oldtippoint*(19-(float)m*10))/40; @@ -494,7 +515,7 @@ void Weapon::DoStuff(int i) { start=oldmid; end=mid; whichhit=objects.model[k].LineCheck(&start,&end,&colpoint,&objects.position[k],&objects.rotation[k]); - if(whichhit!=-1){ + if(whichhit!=-1) { hitsomething=1; mid=colpoint; terrainnormal=DoRotation(objects.model[k].facenormals[whichhit],0,objects.rotation[k],0)*-1; @@ -510,8 +531,10 @@ void Weapon::DoStuff(int i) { if(findLengthfast(&bounceness)>1){ int whichsound; - if(type==staff)whichsound=footstepsound3+abs(Random()%2); - if(type!=staff)whichsound=clank1sound+abs(Random()%4); + if(type==staff) + whichsound=footstepsound3+abs(Random()%2); + else + whichsound=clank1sound+abs(Random()%4); emit_sound_at(whichsound, mid, 128*findLengthfast(&bounceness)); } position+=(mid-oldmid2)*(20/(1+(float)m*10)); @@ -524,7 +547,7 @@ void Weapon::DoStuff(int i) { start=oldmid; end=mid; whichhit=objects.model[k].LineCheck(&start,&end,&colpoint,&objects.position[k],&objects.rotation[k]); - if(whichhit!=-1){ + if(whichhit!=-1) { hitsomething=1; mid=colpoint; terrainnormal=DoRotation(objects.model[k].facenormals[whichhit],0,objects.rotation[k],0)*-1; @@ -540,8 +563,10 @@ void Weapon::DoStuff(int i) { if(findLengthfast(&bounceness)>1){ int whichsound; - if(type==staff)whichsound=footstepsound3+abs(Random()%2); - if(type!=staff)whichsound=clank1sound+abs(Random()%4); + if(type==staff) + whichsound=footstepsound3+abs(Random()%2); + else + whichsound=clank1sound+abs(Random()%4); emit_sound_at(whichsound, mid, 128*findLengthfast(&bounceness)); } tippoint+=(mid-oldmid2)*(20/(1+(float)m*10)); @@ -552,48 +577,52 @@ void Weapon::DoStuff(int i) { start=position; end=tippoint; whichhit=objects.model[k].LineCheck(&start,&end,&colpoint,&objects.position[k],&objects.rotation[k]); - if(whichhit!=-1){ + if(whichhit!=-1) { hitsomething=1; closestdistance=-1; closestswordpoint=colpoint;//(position+tippoint)/2; point[0]=DoRotation(objects.model[k].vertex[objects.model[k].Triangles[whichhit].vertex[0]],0,objects.rotation[k],0)+objects.position[k]; point[1]=DoRotation(objects.model[k].vertex[objects.model[k].Triangles[whichhit].vertex[1]],0,objects.rotation[k],0)+objects.position[k]; point[2]=DoRotation(objects.model[k].vertex[objects.model[k].Triangles[whichhit].vertex[2]],0,objects.rotation[k],0)+objects.position[k]; - if(DistancePointLine(&closestswordpoint, &point[0], &point[1], &distance,&colpoint )) + if(DistancePointLine(&closestswordpoint, &point[0], &point[1], &distance,&colpoint )) { if(distance1){ + + if(findLengthfast(&bounceness)>1) { int whichsound; if(terrain.getOpacity(position.x,position.z)>.2){ - if(type==staff)whichsound=footstepsound3+abs(Random()%2); - if(type!=staff)whichsound=clank1sound+abs(Random()%4); + if(type==staff) + whichsound=footstepsound3+abs(Random()%2); + else + whichsound=clank1sound+abs(Random()%4); + } else { + whichsound=footstepsound+abs(Random()%2); } - else whichsound=footstepsound+abs(Random()%2); emit_sound_at(whichsound, position, findLengthfast(&bounceness) - * (terrain.getOpacity(position.x,position.z) > .2 - ? 128. - : 32.)); + * (terrain.getOpacity(position.x,position.z) > .2 ? 128. : 32.)); - if(terrain.getOpacity(position.x,position.z)<.2){ + if(terrain.getOpacity(position.x,position.z)<.2) { XYZ terrainlight; terrainlight=terrain.getLighting(position.x,position.z); if(environment==snowyenvironment){ - if(findDistancefast(&position,&viewer)1){ + if(findLengthfast(&bounceness)>1){ int whichsound; if(terrain.getOpacity(tippoint.x,tippoint.z)>.2){ - if(type==staff)whichsound=footstepsound3+abs(Random()%2); - if(type!=staff)whichsound=clank1sound+abs(Random()%4); + if(type==staff) + whichsound=footstepsound3+abs(Random()%2); + else + whichsound=clank1sound+abs(Random()%4); + } else { + whichsound=footstepsound+abs(Random()%2); } - else whichsound=footstepsound+abs(Random()%2); emit_sound_at(whichsound, tippoint, findLengthfast(&bounceness) - * (terrain.getOpacity(tippoint.x,tippoint.z) > .2 - ? 128. - : 32.)); + * (terrain.getOpacity(tippoint.x,tippoint.z) > .2 ? 128. : 32.)); - if(terrain.getOpacity(tippoint.x,tippoint.z)<.2){ + if(terrain.getOpacity(tippoint.x,tippoint.z)<.2) { XYZ terrainlight; terrainlight=terrain.getLighting(tippoint.x,tippoint.z); if(environment==snowyenvironment){ - if(findDistancefast(&tippoint,&viewer).4){ velocity=0; tipvelocity=0; @@ -796,35 +830,35 @@ void Weapon::DoStuff(int i) { } } multiplier=tempmult; - if(blooddrip&&bloody){ + if(blooddrip && bloody) { blooddripdelay-=blooddrip*multiplier/2; blooddrip-=multiplier; - if(blooddrip<0)blooddrip=0; - if(blooddrip>5)blooddrip=5; - if(blooddripdelay<0&&bloodtoggle){ + if(blooddrip<0) blooddrip=0; + if(blooddrip>5) blooddrip=5; + if(blooddripdelay<0 && bloodtoggle) { blooddripdelay=1; XYZ bloodvel; XYZ bloodloc; bloodloc=position+(tippoint-position)*.7; bloodloc.y-=.05; - if(bloodtoggle){ + if(bloodtoggle) { bloodvel=0; Sprite::MakeSprite(bloodsprite, bloodloc,bloodvel, 1,1,1, .03, 1); } } } - if(onfire){ + if(onfire) { flamedelay-=multiplier; - if(onfire&&flamedelay<=0){ + if(onfire&&flamedelay<=0) { flamedelay=.020; flamedelay-=multiplier; normalrot=0; - if(owner!=-1){ + if(owner!=-1) { normalrot=player[owner].velocity; } normalrot.y+=1; - if(owner!=-1){ - if(player[owner].onterrain){ + if(owner!=-1) { + if(player[owner].onterrain) { normalrot.y=1; } } @@ -834,13 +868,13 @@ void Weapon::DoStuff(int i) { } } - if(!onfire&&owner==-1&&type!=staff){ + if(!onfire && owner==-1 && type!=staff) { flamedelay-=multiplier; - if(flamedelay<=0){ + if(flamedelay<=0) { flamedelay=.020; flamedelay-=multiplier; normalrot=0; - if(Random()%50==0&&findDistancefast(&position,&viewer)>80){ + if(Random()%50==0&&findDistancefast(&position,&viewer)>80) { XYZ shinepoint; shinepoint=position+(tippoint-position)*(((float)abs(Random()%100))/100); Sprite::MakeSprite(weaponshinesprite, shinepoint,normalrot, 1,1,1, (.1+(float)abs(Random()%100)/200-.25)*1/3*fast_sqrt(findDistance(&shinepoint,&viewer)), 1); @@ -860,30 +894,47 @@ void Weapons::DoStuff() { } void Weapon::Draw() { - static int j; static XYZ terrainlight; static GLfloat M[16]; - static bool draw; - if((frustum.SphereInFrustum(position.x,position.y,position.z,1)&&findDistancefast(&viewer,&position)1)||(player[owner].currentanimation==staffhitreversedanim&&player[owner].currentframe>1)||(player[owner].currentanimation==staffspinhitanim&&player[owner].currentframe>1)||(player[owner].currentanimation==staffspinhitreversedanim&&player[owner].currentframe>1)||(player[owner].currentanimation==staffgroundsmashanim&&player[owner].currentframe>1)||(player[owner].targetanimation==swordslashanim&&player[owner].targetframe<7)||player[owner].targetanimation==crouchstabanim||player[owner].targetanimation==swordslashreversalanim||player[owner].targetanimation==swordslashreversedanim||player[owner].targetanimation==knifefollowanim||player[owner].targetanimation==swordgroundstabanim||player[owner].targetanimation==knifethrowanim)&&player[owner].targetanimation==lastdrawnanim&&!player[owner].skeleton.free) + draw=true; + if ( + (player[owner].targetanimation==knifeslashstartanim|| + player[owner].targetanimation==swordsneakattackanim|| + (player[owner].currentanimation==staffhitanim && player[owner].currentframe>1)|| + (player[owner].currentanimation==staffhitreversedanim && player[owner].currentframe>1)|| + (player[owner].currentanimation==staffspinhitanim && player[owner].currentframe>1)|| + (player[owner].currentanimation==staffspinhitreversedanim && player[owner].currentframe>1)|| + (player[owner].currentanimation==staffgroundsmashanim && player[owner].currentframe>1)|| + (player[owner].targetanimation==swordslashanim && player[owner].targetframe<7)|| + player[owner].targetanimation==crouchstabanim|| + player[owner].targetanimation==swordslashreversalanim|| + player[owner].targetanimation==swordslashreversedanim|| + player[owner].targetanimation==knifefollowanim|| + player[owner].targetanimation==swordgroundstabanim|| + player[owner].targetanimation==knifethrowanim)&& + player[owner].targetanimation==lastdrawnanim&& + !player[owner].skeleton.free + ) { drawhowmany=10; + } else { + drawhowmany=1; } - else drawhowmany=1; if(player[owner].targetanimation==swordgroundstabanim) { lastdrawnrotation1=rotation1; @@ -903,14 +954,15 @@ void Weapon::Draw() { { glAlphaFunc(GL_GREATER, 0.01); } - for(j=drawhowmany;j>0;j--) + for(int j=drawhowmany;j>0;j--) { glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix glPushMatrix(); glColor4f(terrainlight.x,terrainlight.y,terrainlight.z,j/drawhowmany); - if(owner!=-1)glTranslatef(position.x*(((float)(j))/drawhowmany)+lastdrawnposition.x*(1-((float)(j))/drawhowmany),position.y*(((float)(j))/drawhowmany)-.02+lastdrawnposition.y*(1-((float)(j))/drawhowmany),position.z*(((float)(j))/drawhowmany)+lastdrawnposition.z*(1-((float)(j))/drawhowmany)); - if(owner==-1)glTranslatef(position.x*(((float)(j))/drawhowmany)+lastdrawnposition.x*(1-((float)(j))/drawhowmany),position.y*(((float)(j))/drawhowmany)+lastdrawnposition.y*(1-((float)(j))/drawhowmany),position.z*(((float)(j))/drawhowmany)+lastdrawnposition.z*(1-((float)(j))/drawhowmany)); - //glTranslatef(position.x,position.y-.02,position.z); + if(owner==-1) + glTranslatef(position.x*(((float)(j))/drawhowmany)+lastdrawnposition.x*(1-((float)(j))/drawhowmany),position.y*(((float)(j))/drawhowmany)+lastdrawnposition.y*(1-((float)(j))/drawhowmany),position.z*(((float)(j))/drawhowmany)+lastdrawnposition.z*(1-((float)(j))/drawhowmany)); + else + glTranslatef(position.x*(((float)(j))/drawhowmany)+lastdrawnposition.x*(1-((float)(j))/drawhowmany),position.y*(((float)(j))/drawhowmany)-.02+lastdrawnposition.y*(1-((float)(j))/drawhowmany),position.z*(((float)(j))/drawhowmany)+lastdrawnposition.z*(1-((float)(j))/drawhowmany)); glRotatef(bigrotation*(((float)(j))/drawhowmany)+lastdrawnbigrotation*(1-((float)(j))/drawhowmany),0,1,0); glRotatef(bigtilt2*(((float)(j))/drawhowmany)+lastdrawnbigtilt2*(1-((float)(j))/drawhowmany),1,0,0); glRotatef(bigtilt*(((float)(j))/drawhowmany)+lastdrawnbigtilt*(1-((float)(j))/drawhowmany),0,0,1);