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); }
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); } } } } } } }