public virtual void AttackDetect(Fighter plr) { bool multiHitFlag = false; string hitText; //std::stringstream log; bool hitflag = true; int atkLen; int spI=0; int spJ=0; int hbLen=4; SPoint[] plBox; SPoint[][] spBox; float[] plAng ={0, Mathf.PI/2, Mathf.PI, -Mathf.PI/2}; int il = 0; if (fHelper.atkType == GRAB) il = 1; else il = attackBox.trackList[fHelper.atkType].iLength;//num of tracks AttkTrack aBox = new AttkTrack(); int polyHit=-1; plBox = plr.GetHitBox();//loads victim hitbox into plBox //each side is made from the vertices [i] and [+1] int numPoly = 0; //number of polygons in a track; int pInd = 0;//polygon index SPoint[] pHdr = new SPoint[8]; //projectile checks for(int p=0;p<PROJ_LMT;p++){ if(projectile[p].active){ for(int i=0;i<8;i++) pHdr[i]=new SPoint(projectile[p].v[i].x+projectile[p].pos.x,projectile[p].v[i].y+projectile[p].pos.y); atkLen = projectile[p].GetVNum(); for(int j = 0; j < atkLen; j++) if(!CheckAxis(pHdr[0], projectile[p].ang[j], plBox, pHdr, hbLen, projectile[p].GetVNum()) ) //no axis intersection hitflag = false; if(hitflag)//test on the axis of the player hit box to confirm for(int j = 0; j < 4; j++) if(!CheckAxis(plBox[j], plAng[j], plBox, pHdr, hbLen, projectile[p].GetVNum())) //no axis intersection hitflag = false; if(hitflag){ projectile[p].active=false; plr.GetHit(projectile[p].hitdata); } } } if(!atkTmr.IsReady()){//only continue if an attack is out if(fHelper.atkType==GRAB){ aBox= new AttkTrack(); aBox.noHit=false; float gCheck = grabTime/fHelper.actionTmr.GetLen(); float fCheck = fHelper.frame/fHelper.actionTmr.GetLen(); if(Mathf.Abs(fCheck-gCheck)<Time.deltaTime){ aBox.SetGrabBox(GetPos (), stats.grabRange); float[] atAng = new float[4]; atAng[0]=0; atAng[1]=Mathf.PI/2; atAng[2]=Mathf.PI; atAng[3]=-Mathf.PI/2; //for(pInd=0;pInd<numPoly;pInd++)//iterate per poly atkLen = 4; hitflag=true; attackBox.grabRange= stats.grabRange; SPoint[] spArr = attackBox.FetchGrabRenderFrame(fHelper.frame, GetPos (), fHelper.IsFacingRight()); for(int j = 0; j < atkLen; j++) if(!CheckAxis(spArr[j], atAng[j], plBox, spArr, hbLen, atkLen) ) //no axis intersection hitflag = false; if(hitflag)//test on the axis of the player hit box to confirm for(int j = 0; j < 4; j++) if(!CheckAxis(plBox[j], plAng[j], plBox, spArr, hbLen, atkLen)) //no axis intersection hitflag = false; if(hitflag){//hit if(plr.grabbedPlr!=null){ plr.grabbedPlr. state=IDLE; plr.grabbedPlr.Idle(); plr.grabbedPlr.fHelper.Animate ("Idle", true, 0); plr.fHelper.Animate ("Idle", true, 0); plr.grabbedPlr.stats.flags.mBusy=false; plr.grabbedPlr.stats.flags.aBusy=false; plr.grabbedPlr=null; Idle(); fHelper.Animate ("Idle", true, 0); } else if(plr.stats.dodge.IsReady()){ grabbedPlr=plr; plr.Grabbed ();} } } }else{ //attack checks for(int t=0;t<il;t++){//iterate through all sub tr //if(plr.CharName().CompareTo("PsySword")==0) // int ds=2;//checkpt if((fHelper.seqInd!=0)&&((fHelper.seqInd-1)!=t)){ hitflag=false;//do nothing, for now }else { aBox= new AttkTrack(); aBox.noHit=false; if(attackBox.trackList[fHelper.atkType].trackType==AttkBox.FLASH){ if(fHelper.frame>lastFlash){ for(AttkVtx av = attackBox.trackList[fHelper.atkType].aVtx[0][0]; av!=null;av=av.next){ if((av.frame==lastFlash)&&(av.next!=null)){ lastFlash=av.next.frame; attackBox.flashAtkRdy=true; attackBox.ResetHits (fHelper.atkType); while(av.next!=null) av=av.next; //av=null;//force exit } } } } attackBox.FetchFrame(fHelper.atkType, atkTmr.GetLen(), fHelper.frame, t, new SPoint(GetPos().x, GetPos().y), fHelper.IsFacingRight(), aBox);//fetches frame into aBox //aBox has its polygons separated into different tracks for efficiency //make a new SPoint array, spBox, to use checkAxis. hitflag=true; if(aBox.noHit==false){ //if(plr.CharName().CompareTo("PsySword")==0) // int d2s=2;//checkpt spBox=new SPoint[aBox.iLength][]; for(int i=0;i<aBox.iLength;i++) spBox[i]=new SPoint[aBox.jLength[i]]; aBox.FetchSPArr(spBox); if(ClashCheck(plr, spBox, aBox.atkAng)){ return; } numPoly=aBox.iLength; bool hitCheck = false; for(pInd=0;pInd<numPoly;pInd++){//iterate per poly hitflag=true; atkLen = aBox.GetJlength(pInd); for(int j = 0; j < atkLen; j++) if(!CheckAxis(aBox.aVtx[pInd][j].pos, aBox.atkAng[pInd][j], plBox, spBox[pInd], hbLen, aBox.GetJlength(pInd)) ) //no axis intersection hitflag = false; if(hitflag)//test on the axis of the player hit box to confirm for(int j = 0; j < 4; j++) if(!CheckAxis(plBox[j], plAng[j], plBox, spBox[pInd], hbLen, aBox.GetJlength(pInd))) //no axis intersection hitflag = false; if(hitflag) hitCheck=true; } hitflag=hitCheck; //log.str(std::string()); /* for(int i=0;i<aBox.iLength;i++){//tidy up if(!aBox.noHit) delete [] spBox[i]; } if(aBox.iLength==0){ int ee = 2; //log.str(std::string()); } else if(!aBox.noHit){//make sure it was hit if(aBox.iLength>1) delete [] spBox; else delete spBox; spBox=NULL; }*/ }else hitflag=false;//abandon if(hitflag){ AttkData retOb = new AttkData(aBox.GetJlength(t));//initilize for holding vals Attack(plr, t, aBox, retOb); if(!retOb.noHit){ if(debugModeOn){ if(multiHitFlag) hitText = CharName() + " multi-hit\r\n" + plr.CharName() + "!"; else hitText = CharName() + " hit \r\n" + plr.CharName() + "!"; ConsoleLog(hitText); } plr.GetHit(retOb); if((cons!=null)&&(!multiHitFlag)&&(retOb!=null)) cons.PostHit(retOb.GetSPArr(), retOb.curInd, retOb.aBds[0], retOb.attLen, retOb.pBds, retOb.GetConOrigin(), retOb.GetConInter()); multiHitFlag=true; t=il;//force exit; one track hit } } } } } } //seems the ideal place to determine pushback //if the difference in z is less than their average width if((Mathf.Abs(plr.GetPos().x-GetPos().x) < (plr.stats.size.x+stats.size.x)/2 ) &&(Mathf.Abs(plr.GetPos().y-GetPos().y) < (plr.stats.size.y+stats.size.y)/2) &&(!fHelper.airborne)&&(!plr.fHelper.airborne)) if(plr.GetPos().x-GetPos().x>0){ stats.motion.move.x-=0.1f; plr.stats.motion.move.x+=0.1f;} else{ stats.motion.move.x+=0.1f; plr.stats.motion.move.x-=0.1f;} //prob at a second case here for seren sword // if(plr.CharName().CompareTo("Serenity")==0){ // AttackDetect(plr.GetFamiliar()); // } if (fHelper.atkType == DATK) { if ((rightLip != 0) && (stats.motion.pos.x < rightLip)) { stats.motion.vel.x = 0; stats.walk.gndSpeed = 0; } else if ((leftLip != 0) && (stats.motion.pos.x > leftLip)) { stats.motion.vel.x = 0; stats.walk.gndSpeed = 0; } } }