Exemple #1
0
 public void addVal(SPoint p, float m, float di, float diDist, float dm, float w)
 {
     vtxArr[curInd]= new AttkVtx(p, m, di, dm, w);
     curInd++;
     if(vCount==0){//indicates a reset
         dir=0;
         wgt=0;
         perimeter=0;
         diDist=0;
         xMin = p.x;
         xMax = p.x;
         yMin = p.y;
         yMax = p.y;
     }
     dir+=di;
     perimeter+=1;
     wgt+=w;
     vCount++;
     if(m>mag)
         mag=m;
     if(dm>dmg)
         dmg=dm;
     if(xMin>p.x)
         xMin=p.x;
     if(xMax<p.x)
         xMax = p.x;
     if(yMin>p.y)
         yMin=p.y;
     if(yMax<p.y)
         yMax=p.y;
 }
Exemple #2
0
 public void AllocateSecondIndices(int ind, int num)
 {
     jLength[ind] = num;
     aVtx[ind] = new AttkVtx[num];
     atkAng[ind] = new float[num];
     pBounds[ind] = new SPoint[num];
     for (int i=0; i<num; i++) {
             atkAng [ind] [i] = 0;
         aVtx[ind][i]=new AttkVtx();
         }
 }
Exemple #3
0
 public AttkVtx(AttkVtx a)
 {
     next = null;
     frame = -1;
     mag = a.mag;
     dmg = a.dmg;
     dir = a.dir;
     brk = a.brk;
     wgt = a.wgt;
     rad = a.rad;
 }
Exemple #4
0
    public float wgt; //weight used in the hit function

    #endregion Fields

    #region Constructors

    public AttkVtx( )
    {
        dmg=0;
        dir=0;
        wgt=0;
        mag=0;
        rad=0;
        pri = 0;
        pos = new SPoint(0,0);
        next = null;
        frame = -1;
        brk = false;
    }
Exemple #5
0
 public AttkVtx(SPoint p, float m, float d, float dm, float w)
 {
     next = null;
     frame = -1;
     pos = new SPoint(p.x, p.y);
     mag = m;
     dmg = dm;
     dir = d;
     pri = 0;
     brk = false;
     wgt = w;
     rad = 0;
 }
Exemple #6
0
 public AttkTrack( )
 {
     priority = -1;//just a default
     trackType=0;
     aVtx=null;
     hit=null;
     centre = null;
     polyNum=null;
     noHit=false;
     isRadial = false;
     isVacuum = false;
     atkAng=null;
 }
Exemple #7
0
 public void CopyFrom(AttkVtx s)
 {
     if (this == s)
         return ;
     next = s.next;
     frame = s.frame;
     mag = s.mag;
     dmg = s.dmg;
     dir = s.dir;
     brk = s.brk;
     wgt = s.wgt;
     pos = s.pos;
     rad = s.rad;
 }
Exemple #8
0
    public void AllocateFirstIndices(int num)
    {
        iLength = num;
        jLength = new int[iLength];
        hit = new bool[iLength][];
        atkAng = new float[iLength][];
        aVtx = new AttkVtx[iLength][];
        pBounds = new SPoint[iLength][];
        centre = new AttkVtx();
        polyNum = new int[iLength];
        for(int i = 0; i < iLength;i++){
            aVtx[i]=null;
            if(iLength>1)//issues with null arrays
                atkAng[i]=null;
            pBounds[i] = null;
            jLength[i]=0;
            polyNum[i]=1;

            hit[i]=new bool[4];
            for(int j=0;j<4;j++)
                hit[i][j]=false;
        }
    }
Exemple #9
0
 protected AttkVtx InterpVert(AttkVtx vI, AttkVtx vO, Fighter plr)
 {
     //returns an interpolated vertec between vI (vertex inside player hitbox),
     //vO(vertex outside player hitbox), where plr is the player
     AttkVtx retVtx = new AttkVtx();
     float itpWgt = 1.1f;
     if(vO.pos.x > plr.Right()){
         retVtx.pos.x=plr.Right();
         itpWgt = (plr.Right() - vI.pos.x)/(vO.pos.x-vI.pos.x);
         retVtx.pos.y = itpWgt*vI.pos.y + (1-itpWgt)*vO.pos.y;//solve rest
     }else if(vO.pos.x < plr.Left()){
         retVtx.pos.x=plr.Left();
         itpWgt = (plr.Left() - vI.pos.x)/(vO.pos.x-vI.pos.x);
         retVtx.pos.y = itpWgt*vI.pos.y + (1-itpWgt)*vO.pos.y;//solve rest
     }
     if(itpWgt>1){
         if(vO.pos.y > plr.Top()){
             retVtx.pos.y=plr.Top();
             itpWgt = (plr.Top() - vI.pos.y)/(vO.pos.y-vI.pos.y);
             retVtx.pos.x = itpWgt*vI.pos.x + (1-itpWgt)*vO.pos.x;//solve rest
         }
         else if(vO.pos.y > plr.Bottom()){
             retVtx.pos.y=plr.Bottom();
             itpWgt = (plr.Bottom() - vI.pos.y)/(vO.pos.y-vI.pos.y);
             retVtx.pos.x = itpWgt*vI.pos.x + (1-itpWgt)*vO.pos.x;//solve rest
         }
     }
     retVtx.mag = itpWgt*vI.mag + (1-itpWgt)*vO.mag;
     retVtx.dir = itpWgt*vI.dir + (1-itpWgt)*vO.dir;
     retVtx.dmg = itpWgt*vI.dmg + (1-itpWgt)*vO.dmg;
     retVtx.wgt = itpWgt*vI.wgt + (1-itpWgt)*vO.wgt;
     return retVtx;
 }
Exemple #10
0
    public void FetchFrame(int atkInd, float aniLen, float frameInd, int tInd, SPoint loc, bool isRight, AttkTrack aTr)
    {
        AttkVtx vertex;

        vertex = trackList[atkInd].GetVertSPointer(tInd, 0);
        int atkLen;
        if((vertex==null)||(vertex.frame > frameInd)){// attack not yet active
        aTr.noHit=true;
        return;
        }
        if (trackList [atkInd].trackType == 4){// for flash attacks
                if (!flashAtkRdy)//leave if not ready
                        return;
        else
                flashAtkRdy=false;
        }
            //FetchFlashFrame (atkInd,  aniLen,frameInd, tInd, loc, isRight, aTr);
        AttkVtx[] rtnArr;
        AttkVtx ctr=new AttkVtx();
        SPoint retCtr = new SPoint();
        if (trackList [atkInd].isRadial) {
            aTr.AllocateFirstIndices (trackList [atkInd].GetJlength (tInd));//prepare for number of circles
            aTr.AllocateSecondIndices(0, trackList[atkInd].FetchNextBreak(tInd,0, true)+1);//allocate for first poly
        }else{
        aTr.AllocateFirstIndices(trackList[atkInd].polyNum[tInd]);//prepare for number of sub-polygons
            aTr.AllocateSecondIndices(0, trackList[atkInd].FetchNextBreak(tInd,0, true)+1);//allocate for first poly
        }
        float lastFrame = 0;
        float firstFrame=0;
        SPoint lastPt = new SPoint();

        float lastDir=0, lastDmg=0, lastMag=0, lastWgt=0, lastCtrX=0, lastCtrY = 0, lastRad=0;
        float frameTime=1/60.0f;
        frameTime=frameTime/aniLen;
        float aWgt;
        float[] radArr;
        int lastBk=0;
        int pInd=0;//to keep track of tracks/jIndex
        float diffHldr =0;
        if(atkInd < numAtk){
            int numVerts;
            if(trackList[atkInd].isRadial);
            numVerts= trackList[atkInd].jLength[tInd];
            rtnArr = new AttkVtx[numVerts];
            radArr = new float[numVerts];
            for(int j = 0; j < numVerts; j++)
                rtnArr[j]=new AttkVtx();
            for(int j = 0; j < numVerts; j++){

                vertex = trackList[atkInd].GetVertSPointer(tInd, j);
                if(vertex.frame <0) //vertex SPointer
                    vertex = trackList[atkInd].GetVertSPointer(tInd, (int)vertex.pos.x);
                firstFrame = vertex.frame;
                ctr = trackList[atkInd].GetCtrSPointer(tInd);
                while((vertex.next != null)&&(frameInd >= vertex.frame)){
                    lastFrame = vertex.frame;
                    lastPt.x = vertex.pos.x;
                    lastPt.y = vertex.pos.y;
                    lastMag = vertex.mag;
                    lastDir = vertex.dir;
                    lastDmg = vertex.dmg;
                    lastWgt = vertex.wgt;
                    lastRad = vertex.rad;
                    vertex = vertex.next;
                    lastCtrX = ctr.pos.x;
                    lastCtrY = ctr.pos.y;
                    ctr=ctr.next;
                }
                //end of vertlist implies the active window has ended.
                //cancel the function here
                diffHldr = frameInd-frameTime;
                if((vertex.frame<frameInd)&&(firstFrame>frameInd-frameTime)){
                    //entire attack passed between last frame and this
                    //retrieve first vals so it is not skipped
                    vertex = trackList[atkInd].GetVertSPointer(tInd, j);
                    if(vertex.frame <0) //vertex SPointer
                        vertex = trackList[atkInd].GetVertSPointer(tInd, (int)vertex.pos.x);
                    frameInd=vertex.frame;//set to start
                }
                else if(vertex.frame<frameInd){
                    aTr.noHit=true;
                    return;
                }
                if(Mathf.Abs(lastFrame - vertex.frame) == 0)
                    aWgt = 0;
                else
                    aWgt = (frameInd - lastFrame)/Mathf.Abs(lastFrame - vertex.frame); //alpha weight for interpolation
                if(isRight){
                    rtnArr[j].pos.x = (1-aWgt)*lastPt.x + (aWgt)*vertex.pos.x + loc.x;
                    rtnArr[j].dir = (1-aWgt)*lastDir + (aWgt)*vertex.dir;
                }
                else{//INVERTED DIRS HERE
                    rtnArr[j].pos.x = -(1-aWgt)*lastPt.x -(aWgt)*vertex.pos.x + loc.x;
                    rtnArr[j].dir = (1-aWgt)*lastDir + (aWgt)*vertex.dir;
                    float diff = ((Mathf.PI/2)-rtnArr[j].dir)*2.0f;
                    rtnArr[j].dir+=diff;
                }
                rtnArr[j].pos.y = (1-aWgt)*lastPt.y + (aWgt)*vertex.pos.y + loc.y;
                rtnArr[j].dmg = (1-aWgt)*lastDmg + (aWgt)*vertex.dmg;
                rtnArr[j].mag = (1-aWgt)*lastMag + (aWgt)*vertex.mag;
                rtnArr[j].wgt = (1-aWgt)*lastWgt + (aWgt)*vertex.wgt;
                rtnArr[j].rad = (1-aWgt)*lastRad + (aWgt)*vertex.rad;
                radArr[j] =rtnArr[j].rad;
                retCtr.x = (1-aWgt)*lastCtrX + (aWgt)*ctr.pos.x;
                retCtr.y = (1-aWgt)*lastCtrY + (aWgt)*ctr.pos.y;
                aTr.SetCentre(retCtr.x, retCtr.y, 0, pInd);
                //this attack track is ONE track
                // with the polygons separated into new tracks.
                //always start each poly on new track
                SPoint[] spArr = new SPoint[numVerts];
                for(int k=0;k<numVerts;k++){
                    spArr[k] = new SPoint(rtnArr[k].pos.x, rtnArr[k].pos.y);
                }
                SPoint[] circHolder = new SPoint[AttkTrack.CIRC_VNUM];
                if((trackList[atkInd].isRadial)&&(j==numVerts-1)){
                    circHolder = trackList[atkInd].FetchRadialRenderingFrame(spArr, radArr);
                    AttkVtx radVertHolder = new AttkVtx();
                    for(int m = 0; m<numVerts;m++){
                        for(int k=0; k<AttkTrack.CIRC_VNUM;k++)
                        {
                            radVertHolder = new AttkVtx(circHolder[k+m*AttkTrack.CIRC_VNUM], rtnArr[m].mag, rtnArr[m].dir,rtnArr[m].dmg, rtnArr[m].wgt);
                            aTr.SetVertex(radVertHolder, m, k);
                        }
                    if(m<j){
                            int brkCheck=trackList[atkInd].FetchNextBreak(tInd, m, true);
                            aTr.AllocateSecondIndices(m+1, AttkTrack.CIRC_VNUM);
                        }

                }
                }else if((trackList[atkInd].aVtx[tInd][j].brk)||(j==numVerts-1)){//end of this polygon
                    //continue handling circles here
                    if(isRight)
                        for(int k = lastBk; k<=j; k++)//add rtnArr to aTr
                            aTr.SetVertex(rtnArr[k], pInd, k-lastBk);
                    else
                        for(int k = j; k>=lastBk; k--)//add rtnArr to aTr
                            aTr.SetVertex(rtnArr[k], pInd, j-k);
                    pInd++;
                    if(j<numVerts-1){//do not preemtively allocate when done
                        int brkCheck=trackList[atkInd].FetchNextBreak(tInd, j, true);
                        aTr.AllocateSecondIndices(pInd, trackList[atkInd].FetchNextBreak(tInd, j, true)-j);
                    }
                    lastBk=j+1;
                }
            }

            //if(rtnArr!=null)
            //	rtnArr=null;
            if(trackList[atkInd].isRadial){
                for(int i=0;i<aTr.iLength;i++){
                    for(int j = 0; j < AttkTrack.CIRC_VNUM-1; j++){
                        aTr.atkAng[i][j] = Mathf.Atan2(aTr.aVtx[i][j+1].pos.y - aTr.aVtx[i][j].pos.y, aTr.aVtx[i][j+1].pos.x - aTr.aVtx[i][j].pos.x); //store angles for detection
                        aTr.atkAng[i][AttkTrack.CIRC_VNUM-1] = Mathf.Atan2(aTr.aVtx[i][0].pos.y - aTr.aVtx[i][AttkTrack.CIRC_VNUM-1].pos.y, aTr.aVtx[i][0].pos.x - aTr.aVtx[i][AttkTrack.CIRC_VNUM-1].pos.x);
                    }
                }

            }else{
                for(int i=0;i<aTr.iLength;i++){
                    atkLen=aTr.GetJlength(i);
                    for(int j = 0; j < atkLen-1; j++)
                        aTr.atkAng[i][j] = Mathf.Atan2(aTr.aVtx[i][j+1].pos.y - aTr.aVtx[i][j].pos.y, aTr.aVtx[i][j+1].pos.x - aTr.aVtx[i][j].pos.x); //store angles for detection
                    aTr.atkAng[i][atkLen-1] = Mathf.Atan2(aTr.aVtx[i][0].pos.y - aTr.aVtx[i][atkLen-1].pos.y, aTr.aVtx[i][0].pos.x - aTr.aVtx[i][atkLen-1].pos.x);
                }
            }
        }
        AttkTrack rTr = FetchRadialFrame (aTr);
    }
Exemple #11
0
 public void SetCentre(float x, float y, float frame, int iInd)
 {
     AttkVtx c = centre;
     AttkVtx lC = null;
     if(c==null){
         c.pos = new SPoint(x, y);
         c.frame = frame;
     }else{
         while((c != null)&&(c.frame >= 0)&&(c.frame != frame)){
             lC = c;
             c = c.next;
         }
         if(c == null){
             c = new AttkVtx(lC);
             c.frame = frame;
             lC.next = c;
         }
         c.pos = new SPoint(x, y);
         c.frame = frame;
     }
 }
Exemple #12
0
 protected AttkVtx InterpCorner(AttkVtx[] arrV, int arrLen, SPoint oPos)
 {
     AttkVtx rtnVtx = new AttkVtx();
     float dist = 0;
     float distSum=0;
     SPoint tPos = new SPoint();
     for(int i = 0; i< arrLen;i++){
         tPos.x = arrV[i].pos.x-oPos.x;//tranlated for ease of calculations
         tPos.y = arrV[i].pos.y-oPos.y;
         dist=Mathf.Sqrt(tPos.SqDistFromOrigin());
         distSum+=dist;
     }//now average out verts
     for(int i = 0; i< arrLen;i++){
         tPos.x = arrV[i].pos.x-oPos.x;//tranlated for ease of calculations
         tPos.y = arrV[i].pos.y-oPos.y;
         dist=Mathf.Sqrt(tPos.SqDistFromOrigin());
         rtnVtx.mag+=(dist/distSum)*arrV[i].mag;
         rtnVtx.dir+=(dist/distSum)*arrV[i].dir;
         rtnVtx.dmg+=(dist/distSum)*arrV[i].dmg;
         rtnVtx.wgt+=(dist/distSum)*arrV[i].wgt;
     }
     return rtnVtx;
 }
Exemple #13
0
 public void SetDamage(float damage, float frame, int  iInd, int jInd)
 {
     AttkVtx vertex = GetVertSPointer(iInd, jInd);
     AttkVtx lastVertex = null;
     if((iInd < iLength)&&(jInd<jLength[iInd])){
         while((vertex != null)&&(vertex.frame >= 0)&&(vertex.frame != frame)){
             lastVertex = vertex;
             vertex = vertex.next;
         }
         if(vertex == null){
             vertex = new AttkVtx(lastVertex);
             vertex.frame = frame;
             lastVertex.next = vertex;
         }
         vertex.dmg = damage;
     }
 }
Exemple #14
0
 public void SetRadius(float rad, float frame, int  iInd, int jInd)
 {
     AttkVtx vertex = aVtx[iInd][jInd];
     AttkVtx lastVertex = null;
     if((iInd < iLength)&&(jInd<jLength[iInd])){
         while((vertex != null)&&(vertex.frame >= 0)&&(vertex.frame != frame)){
             lastVertex = vertex;
             vertex = vertex.next;
         }
         if(vertex == null){
             vertex = new AttkVtx(lastVertex);
             vertex.frame = frame;
             lastVertex.next = vertex;
         }
         vertex.rad = rad;
     }
 }
Exemple #15
0
 public void SetVertex(float px, float py, float frame, int iInd, int jInd)
 {
     //sets a vertex with a given frame.
     //ALL verts are meant to be input in chronological order (by frames)
     //this function sets the vert values of the vert at the specified frame,
     // or makes a new frame if none exists.
     AttkVtx vertex = aVtx[iInd][jInd];
     AttkVtx lastVertex = null;
     if(frame<0){//vertex SPointer
         vertex.pos = new SPoint(px, py);
         vertex.frame = frame;
     }else{
         if((iInd < iLength)&&(jInd<jLength[iInd])){
             while((vertex != null)&&(vertex.frame >= 0)&&(vertex.frame != frame)){
                 lastVertex = vertex;
                 vertex = vertex.next;
             }
             if(vertex == null){
                 vertex = new AttkVtx(lastVertex);
                 vertex.frame = frame;
                 lastVertex.next = vertex;
             }
             vertex.pos = new SPoint(px, py);
             vertex.frame = frame;
         }
     }
 }
Exemple #16
0
 public void SetVertex(AttkVtx a, int iInd, int jInd)
 {
     aVtx[iInd][jInd].pos.x = a.pos.x;
     aVtx[iInd][jInd].pos.y = a.pos.y;
     aVtx[iInd][jInd].mag = a.mag;
     aVtx[iInd][jInd].dmg = a.dmg;
     aVtx[iInd][jInd].dir = a.dir;
     aVtx[iInd][jInd].wgt = a.wgt;
 }
Exemple #17
0
 public void SetWeight(float weight, float frame, int  iInd, int jInd)
 {
     AttkVtx vertex = aVtx[iInd][jInd];
     AttkVtx lastVertex = null;
     if((iInd < iLength)&&(jInd<jLength[iInd])){
         while((vertex != null)&&(vertex.frame >= 0)&&(vertex.frame != frame)){
             lastVertex = vertex;
             vertex = vertex.next;
         }
         if(vertex == null){
             vertex = new AttkVtx(lastVertex);
             vertex.frame = frame;
         }
         vertex.wgt = weight;
     }
 }