public bool AreFeetOnEatEdiblesGround() { foreach (Collider2D col in collsTouching[SideFeet]) { BaseGround baseGround = col.GetComponent <BaseGround>(); if (baseGround != null && baseGround.MayPlayerEatHere) { return(true); // This one's good! } } return(false); // Wow, nah, we're not touching any gem-friendly grounds. }
virtual protected void OnFeetLeaveCollidable(Collidable collidable) { timeLastGrounded = Time.time; // Left Ground? BaseGround ground = collidable as BaseGround; if (ground != null) { // Left respawn-friendly Ground, AND we can set GroundedRespawnPos?? if (ground.IsPlayerRespawn && MaySetGroundedRespawnPos()) { SetGroundedRespawnPos(ground); } } }
/// Intelligently sets what GroundedRespawnPos SHOULD be based on our position relative to this Ground. I.e. not on its edge, or in the air. private void SetGroundedRespawnPos(BaseGround ground) { Rect gr = ground.GetMyRect(); float marginX = 2f; // how much farther from the edge we wanna prevent spawning from. marginX = Mathf.Min(marginX, gr.width * 0.5f); // limit marginX for small grounds/platforms. float posX = pos.x; float posY = gr.y + gr.height * 0.5f + Size.y * 0.5f + 0.01f; // top 'o the ground. posX = Mathf.Max(gr.x - gr.width * 0.5f + marginX, posX); posX = Mathf.Min(gr.x + gr.width * 0.5f - marginX, posX); GameManagers.Instance.DataManager.playerGroundedRespawnData = new PlayerData { pos = new Vector2(posX, posY), type = PlayerType(), dirFacing = DirFacing, rotation = 0, vel = Vector2.zero, }; }
//--------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------- void SetLevelTerrain(List <PixelClass> pList, List <GroundTileScript> gtList) { if (pList.Count != gtList.Count || pList == null || gtList == null) { Debug.Log("ERROR: Discrepancy between lists p|gt " + pList.Count + " " + gtList.Count); return; } /* Layers for each tile type and their binary value: * 9 : Clear/Objective/Base 512 * 10 : FixedTerrain/Impassable 1024 * 11 : Rough 2048 * 12 : Hazard 4096 */ for (int i = 0; i < gtList.Count; i++) { switch (pList[i].colourCompare) { case PixelClass.pixelReader.BLACK: ImpassableGround impassableTile = new ImpassableGround(); gtList[i].tileReference = impassableTile; gtList[i].tileReference.tileID = i; gtList[i].tileReference.hasBlockOnIt = true; gtList[i].tileReference.type = GroundTile.GroundType.IMPASSABLE; gtList[i].tileReference.tileRenderer = gtList[i].gameObject.GetComponent <MeshRenderer>(); gtList[i].gameObject.layer = 10; break; case PixelClass.pixelReader.RED: HazardGround hazardTile = new HazardGround(); gtList[i].tileReference = hazardTile; gtList[i].tileReference.tileID = i; gtList[i].tileReference.type = GroundTile.GroundType.HAZARD; gtList[i].tileReference.tileRenderer = gtList[i].gameObject.GetComponent <MeshRenderer>(); gtList[i].gameObject.layer = 12; break; case PixelClass.pixelReader.DARK_RED: HazardGround hazardTileBlocked = new HazardGround(); gtList[i].tileReference = hazardTileBlocked; gtList[i].tileReference.tileID = i; gtList[i].tileReference.hasBlockOnIt = true; gtList[i].tileReference.type = GroundTile.GroundType.HAZARD; gtList[i].tileReference.tileRenderer = gtList[i].gameObject.GetComponent <MeshRenderer>(); gtList[i].gameObject.layer = 12; break; case PixelClass.pixelReader.GREEN: ClearGround clearTile = new ClearGround(); gtList[i].tileReference = clearTile; gtList[i].tileReference.tileID = i; gtList[i].tileReference.type = GroundTile.GroundType.CLEAR; gtList[i].tileReference.tileRenderer = gtList[i].gameObject.GetComponent <MeshRenderer>(); gtList[i].gameObject.layer = 9; break; case PixelClass.pixelReader.TEAL_GREEN: ClearGround clearTileBlocked = new ClearGround(); gtList[i].tileReference = clearTileBlocked; gtList[i].tileReference.tileID = i; gtList[i].tileReference.hasBlockOnIt = true; gtList[i].tileReference.type = GroundTile.GroundType.CLEAR; gtList[i].tileReference.tileRenderer = gtList[i].gameObject.GetComponent <MeshRenderer>(); gtList[i].gameObject.layer = 9; break; case PixelClass.pixelReader.BLUE: ObjectiveGround objectiveTile = new ObjectiveGround(); gtList[i].tileReference = objectiveTile; gtList[i].tileReference.tileID = i; gtList[i].tileReference.type = GroundTile.GroundType.OBJECTIVE; gtList[i].tileReference.tileRenderer = gtList[i].gameObject.GetComponent <MeshRenderer>(); gtList[i].gameObject.layer = 9; break; case PixelClass.pixelReader.GREY: RoughGround roughTile = new RoughGround(); gtList[i].tileReference = roughTile; gtList[i].tileReference.tileID = i; gtList[i].tileReference.type = GroundTile.GroundType.ROUGH; gtList[i].tileReference.tileRenderer = gtList[i].gameObject.GetComponent <MeshRenderer>(); gtList[i].gameObject.layer = 11; break; case PixelClass.pixelReader.DARK_GREY: RoughGround roughTileBlocked = new RoughGround(); gtList[i].tileReference = roughTileBlocked; gtList[i].tileReference.tileID = i; gtList[i].tileReference.hasBlockOnIt = true; gtList[i].tileReference.type = GroundTile.GroundType.ROUGH; gtList[i].tileReference.tileRenderer = gtList[i].gameObject.GetComponent <MeshRenderer>(); gtList[i].gameObject.layer = 11; break; case PixelClass.pixelReader.MAGENTA: BaseGround baseTile = new BaseGround(); gtList[i].tileReference = baseTile; gtList[i].tileReference.tileID = i; gtList[i].tileReference.type = GroundTile.GroundType.BASE; gtList[i].tileReference.tileRenderer = gtList[i].gameObject.GetComponent <MeshRenderer>(); gtList[i].gameObject.layer = 9; baseTilesList.Add(gtList[i]); // Maybe add baseTile to a list of base tiles, then return the 5th member (index [4]) to always find the center of the base prefab (which currently consists of 9 tiles). break; default: ClearGround defaultClearTile = new ClearGround(); gtList[i].tileReference = defaultClearTile; gtList[i].tileReference.tileID = i; gtList[i].tileReference.type = GroundTile.GroundType.CLEAR; gtList[i].tileReference.tileRenderer = gtList[i].gameObject.GetComponent <MeshRenderer>(); gtList[i].gameObject.layer = 9; Debug.Log("No usable info found, using default tile state"); break; } //Debug.Log("Loading properties for individual tile: " + i); gtList[i].tileReference.LoadProperties(); Vector3 wPosition = gtList[i].nodeReference.worldPosition; gtList[i].nodeReference.walkableNode = !(Physics.CheckSphere(wPosition, (displace - 1) / 2, unwalkableNode)); //gtList[i].nodeReference.movementModifier = gtList[i].tileReference.tileMovementPenaltyForPF; // deprecated if (gtList[i].tileReference.isWalkable | gtList[i].nodeReference.walkableNode) { Ray ray = new Ray(gtList[i].transform.position + Vector3.up * 30, Vector3.down); RaycastHit hit; if (Physics.Raycast(ray, out hit, 100, traversableMask)) { traversableTilesDictionary.TryGetValue(hit.collider.gameObject.layer, out gtList[i].nodeReference.movementModifier); } } } Debug.Log("Level Terrain Set"); }