Exemplo n.º 1
0
 public void DidSpecialMoveCharacter(CharacterSpecialMoveReport csmr)
 {
     Resume();
 }
Exemplo n.º 2
0
 public void WillSpecialMoveCharacter(CharacterSpecialMoveReport csmr)
 {
     Pause();
 }
Exemplo n.º 3
0
    public void SpecialMove(
        Vector3 start,
        bool animateMoveToStart,
        string moveType,
        Region lineMove,
        float specialMoveSpeedXY,
        float specialMoveSpeedZ,
        SkillDef cause
        )
    {
        specialMoveType                = moveType;
        specialMoveExecutor.XYSpeed    = specialMoveSpeedXY;
        specialMoveExecutor.ZSpeedDown = specialMoveSpeedZ;
        List <Character> collidedCharacters = new List <Character>();
        float            direction = -1, amount = -1, remaining = -1, dropDistance = -1;
        PathNode         movePath = lineMove.GetLineMove(
            out direction,
            out amount,
            out remaining,
            out dropDistance,
            collidedCharacters,
            this,
            start
            );

        //move executor special move (path)
        specialMoveExecutor.Activate();
        CharacterSpecialMoveReport rep = new CharacterSpecialMoveReport(
            this,
            moveType,
            lineMove,
            cause,
            start,
            movePath,
            direction,
            amount,
            remaining,
            dropDistance,
            collidedCharacters
            );

        map.BroadcastMessage(
            "WillSpecialMoveCharacter",
            rep,
            SendMessageOptions.DontRequireReceiver
            );
        MoveExecutor.MoveFinished movedToStart =
            (srcStart, srcEndNode, srcFinishedNicely) => {
            Debug.Log("src finished nicely? " + srcFinishedNicely);
            specialMoveExecutor.SpecialMoveTo(
                movePath,
                (src, endNode, finishedNicely) => {
                Debug.Log(
                    "specially moved character " + this.name +
                    " by " + moveType +
                    " from " + start +
                    " in dir " + direction +
                    " node " + movePath +
                    " into " + (
                        collidedCharacters.Count == 0 ?
                        "nobody":
                        "" + collidedCharacters.Count + " folks"
                        ) +
                    " left over " + remaining +
                    " dropped " + dropDistance
                    );
                map.BroadcastMessage(
                    "DidSpecialMoveCharacter",
                    rep,
                    SendMessageOptions.DontRequireReceiver
                    );
                specialMoveExecutor.Deactivate();
                var allChars      = map.CharactersAt(endNode.pos);
                var otherChars    = allChars.Where(c => c != this && c != mountedCharacter).ToArray();
                Character[] chars = null;
                if (otherChars.Length > 0)
                {
                    //try to fix myself
                    chars = new Character[] { IsMounting?mountedCharacter: this };
                }
                if (chars != null && chars.Length > 0)
                {
                    //if any collisions left over between me and somebody else...
                    Debug.Log("fix collisions");
                    bool success = false;
                    if (!success)
                    {
                        Debug.Log("try straight");
                        success = TrySpecialMoveResponse(direction, endNode, chars, lineMove, cause);
                    }
                    if (!success)
                    {
                        Debug.Log("try left");
                        success = TrySpecialMoveResponse(SRPGUtil.WrapAngle(direction + 90), endNode, chars, lineMove, cause);
                    }
                    if (!success)
                    {
                        Debug.Log("try right");
                        success = TrySpecialMoveResponse(SRPGUtil.WrapAngle(direction - 90), endNode, chars, lineMove, cause);
                    }
                    if (!success)
                    {
                        Debug.Log("try back");
                        success = TrySpecialMoveResponse(SRPGUtil.WrapAngle(direction + 180), endNode, chars, lineMove, cause);
                    }
                    if (!success)
                    {
                        Debug.LogError("Can't shove " + chars.Length + " chars out of the way!");
                    }
                }
            }
                );
        };

        if (start != TilePosition)
        {
            if (animateMoveToStart)
            {
                specialMoveExecutor.SpecialMoveTo(
                    new PathNode(start, null, 0),
                    movedToStart,
                    3.0f
                    );
            }
            else
            {
                specialMoveExecutor.ImmediatelyMoveTo(
                    new PathNode(start, null, 0),
                    movedToStart,
                    3.0f
                    );
            }
        }
        else
        {
            movedToStart(start, new PathNode(start, null, 0), true);
        }
    }
Exemplo n.º 4
0
 public void WillSpecialMoveCharacter(CharacterSpecialMoveReport csmr)
 {
     Pause();
 }
Exemplo n.º 5
0
 public void DidSpecialMoveCharacter(CharacterSpecialMoveReport csmr)
 {
     Resume();
 }
Exemplo n.º 6
0
    public void SpecialMove(
		Vector3 start,
		bool animateMoveToStart,
		string moveType,
		Region lineMove,
		float specialMoveSpeedXY,
		float specialMoveSpeedZ,
		SkillDef cause
	)
    {
        specialMoveType = moveType;
        specialMoveExecutor.XYSpeed = specialMoveSpeedXY;
        specialMoveExecutor.ZSpeedDown = specialMoveSpeedZ;
        List<Character> collidedCharacters = new List<Character>();
        float direction=-1, amount=-1, remaining=-1, dropDistance=-1;
        PathNode movePath = lineMove.GetLineMove(
            out direction,
            out amount,
            out remaining,
            out dropDistance,
            collidedCharacters,
            this,
            start
        );
        //move executor special move (path)
        specialMoveExecutor.Activate();
        CharacterSpecialMoveReport rep = new CharacterSpecialMoveReport(
            this,
            moveType,
            lineMove,
            cause,
            start,
            movePath,
            direction,
            amount,
            remaining,
            dropDistance,
            collidedCharacters
        );
        map.BroadcastMessage(
            "WillSpecialMoveCharacter",
            rep,
            SendMessageOptions.DontRequireReceiver
        );
        MoveExecutor.MoveFinished movedToStart =
        (srcStart, srcEndNode, srcFinishedNicely) => {
            Debug.Log("src finished nicely? "+srcFinishedNicely);
            specialMoveExecutor.SpecialMoveTo(
                movePath,
                (src, endNode, finishedNicely) => {
                    Debug.Log(
                        "specially moved character "+this.name+
                        " by "+moveType+
                        " from "+start+
                        " in dir "+direction+
                        " node "+movePath+
                        " into "+(
                            collidedCharacters.Count==0 ?
                                "nobody":
                                ""+collidedCharacters.Count+" folks"
                        )+
                        " left over "+remaining+
                        " dropped "+dropDistance
                    );
                    map.BroadcastMessage(
                        "DidSpecialMoveCharacter",
                        rep,
                        SendMessageOptions.DontRequireReceiver
                    );
                    specialMoveExecutor.Deactivate();
                    var allChars = map.CharactersAt(endNode.pos);
                    var otherChars = allChars.Where(c => c != this && c != mountedCharacter).ToArray();
                    Character[] chars = null;
                    if(otherChars.Length > 0) {
                        //try to fix myself
                        chars = new Character[]{IsMounting ? mountedCharacter : this};
                    }
                    if(chars != null && chars.Length > 0) {
                    //if any collisions left over between me and somebody else...
                        Debug.Log("fix collisions");
                        bool success = false;
                        if(!success) {
                            Debug.Log("try straight");
                            success = TrySpecialMoveResponse(direction, endNode, chars, lineMove, cause);
                        }
                        if(!success) {
                            Debug.Log("try left");
                            success = TrySpecialMoveResponse(SRPGUtil.WrapAngle(direction+90), endNode, chars, lineMove, cause);
                        }
                        if(!success) {
                            Debug.Log("try right");
                            success = TrySpecialMoveResponse(SRPGUtil.WrapAngle(direction-90), endNode, chars, lineMove, cause);
                        }
                        if(!success) {
                            Debug.Log("try back");
                            success = TrySpecialMoveResponse(SRPGUtil.WrapAngle(direction+180), endNode, chars, lineMove, cause);
                        }
                        if(!success) {
                            Debug.LogError("Can't shove "+chars.Length+" chars out of the way!");
                        }
                    }
                }
            );
        };

        if(start != TilePosition) {
            if(animateMoveToStart) {
                specialMoveExecutor.SpecialMoveTo(
                    new PathNode(start, null, 0),
                    movedToStart,
                    3.0f
                );
            } else {
                specialMoveExecutor.ImmediatelyMoveTo(
                    new PathNode(start, null, 0),
                    movedToStart,
                    3.0f
                );
            }
        } else {
            movedToStart(start, new PathNode(start, null, 0), true);
        }
    }