Пример #1
0
    bool Enact(Movable m, ushort agentId)
    {
        if (m.who == null)
        {
            Debug.LogError($"{agentId} is lacking its game object");
            movables.Remove(agentId);
            Debug.Log($"{movables.Count} movables remain");
            return(false);
        }
        int nextX = m.NextX;
        int nextY = m.NextY;

        ResolveConflict(nextX, nextY, m.agentType, m.who, m.actionX, m.actionY);
        if (levelDidReset)
        {
            return(false);
        }
        bool occupied = IsOccupied(nextX, nextY, m.agentType);

        if (!occupied)
        {
            levelData[nextX, nextY] = LevelFeature.CopyAgent(levelData[m.x, m.y], levelData[nextX, nextY]);
            levelData[m.x, m.y]     = LevelFeature.ClearAgent(levelData[m.x, m.y]);
            m.who.SendMessage("Move", GetPositionAt(nextX, nextY), SendMessageOptions.RequireReceiver);
            return(true);
        }
        return(false);
    }
Пример #2
0
    void ResolvePlayerConflict(int x, int y, int xDir, int yDir)
    {
        LevelFeatureValue targetVal = levelData[x, y];

        if (LevelFeature.FulfillsSemanticGroundMask(true, true, targetVal))
        {
            if (IsInsideLevel(x + xDir, y + yDir))
            {
                LevelFeatureValue nextVal = levelData[x + xDir, y + yDir];
                if (LevelFeature.DoesntBlockMovableGround(nextVal))
                {
                    levelData[x, y] = LevelFeature.SetGround(false, false, targetVal);
                    levelData[x + xDir, y + yDir] = LevelFeature.SetGround(true, true, nextVal);
                }
                else
                {
                    int xExtraDir = xDir == 0 ? 0 : xDir + Mathf.RoundToInt(Mathf.Sign(xDir));
                    int yExtraDir = yDir == 0 ? 0 : yDir + Mathf.RoundToInt(Mathf.Sign(yDir));
                    if (IsInsideLevel(x + xExtraDir, y + yExtraDir))
                    {
                        LevelFeatureValue nextNextVal = levelData[x + xExtraDir, y + yExtraDir];
                        if (!LevelFeature.WouldBlockMovableGroundWithoutAgent(nextVal))
                        {
                            if (!IsOccupied(x + xExtraDir, y + yExtraDir, LevelFeature.GetAgentType(nextNextVal)))
                            {
                                ushort agentId = LevelFeature.GetAgentId(nextVal);
                                SetMovable(agentId, movables[agentId].Evolve(xDir, yDir));
                                movables[agentId].who.SendMessage("Move", GetPositionAt(x + xDir, y + yDir), SendMessageOptions.RequireReceiver);

                                levelData[x + xExtraDir, y + yExtraDir] = LevelFeature.CopyAgent(nextNextVal, levelData[x + xExtraDir, y + yExtraDir]);
                                levelData[x + xDir, y + yDir]           = LevelFeature.ClearAgent(nextNextVal);
                                levelData[x, y] = LevelFeature.SetGround(false, false, targetVal);
                                levelData[x + xDir, y + yDir] = LevelFeature.SetGround(true, true, nextVal);
                            }
                        }
                    }
                }
            }
        }
    }