/// <summary> /// Try to klimb the given tile - typically called after you select a direction /// </summary> /// <param name="xy"></param> /// <param name="klimbResult"></param> /// <returns></returns> public string TryToKlimbInDirection(Point2D xy, out KlimbResult klimbResult) { TileReference tileReference = State.TheVirtualMap.GetTileReference(xy); string retStr; if (State.TheVirtualMap.IsLargeMap) { // is it even klimbable? if (tileReference.IsKlimable) { if (tileReference.Index != SpriteTileReferences.GetTileNumberByName("SmallMountains")) { throw new Ultima5ReduxException( "I am not personal aware of what on earth you would be klimbing that is not already stated in the following logic..."); } State.GrapplingFall(); klimbResult = KlimbResult.SuccessFell; retStr = DataOvlRef.StringReferences.GetString(DataOvlReference.KlimbingStrings.FELL); } // is it tall mountains? we can't klimb those else if (tileReference.Index == SpriteTileReferences.GetTileNumberByName("TallMountains")) { klimbResult = KlimbResult.CantKlimb; retStr = DataOvlRef.StringReferences.GetString(DataOvlReference.KlimbingStrings.IMPASSABLE); } // there is no chance of klimbing the thing else { klimbResult = KlimbResult.CantKlimb; retStr = DataOvlRef.StringReferences.GetString(DataOvlReference.KlimbingStrings.NOT_CLIMABLE); } } else // it's a small map { if (tileReference.IsKlimable) { // ie. a fence klimbResult = KlimbResult.Success; retStr = string.Empty; } else { klimbResult = KlimbResult.CantKlimb; retStr = DataOvlRef.StringReferences.GetString(DataOvlReference.TravelStrings.WHAT); } } PassTime(); return(retStr); }
/// <summary> /// Try to klimb the given tile - typically called after you select a direction /// </summary> /// <param name="xy"></param> /// <param name="klimbResult"></param> /// <returns></returns> public string TryToKlimb(Point2D xy, out KlimbResult klimbResult) { //Point2D klimbTilePos = GetAdustedPos(CurrentVirtualMap.CurrentPosition, keyCode); TileReference tileReference = State.TheVirtualMap.GetTileReference(xy); if (State.TheVirtualMap.IsLargeMap) { // is it even klimable? if (tileReference.IsKlimable) { if (tileReference.Index == SpriteTileReferences.GetTileNumberByName("SmallMountains")) { State.GrapplingFall(); klimbResult = KlimbResult.SuccessFell; return(DataOvlRef.StringReferences.GetString(DataOvlReference.KLIMBING_STRINGS.FELL)); } throw new Exception("I am not personnaly aware of what on earth you would be klimbing that is not already stated in the following logic..."); } // is it tall mountains? we can't klimb those else if (tileReference.Index == SpriteTileReferences.GetTileNumberByName("TallMountains")) { klimbResult = KlimbResult.CantKlimb; return(DataOvlRef.StringReferences.GetString(DataOvlReference.KLIMBING_STRINGS.IMPASSABLE)); } // there is no chance of klimbing the thing else { klimbResult = KlimbResult.CantKlimb; return(DataOvlRef.StringReferences.GetString(DataOvlReference.KLIMBING_STRINGS.NOT_CLIMABLE)); } } else // it's a small map { if (tileReference.IsKlimable) { // ie. a fence klimbResult = KlimbResult.Success; return(String.Empty); } else { klimbResult = KlimbResult.CantKlimb; return(DataOvlRef.StringReferences.GetString(DataOvlReference.TRAVEL_STRINGS.WHAT)); } } }
/// <summary> /// Climbs the ladder on the current tile that the Avatar occupies /// </summary> public string TryToKlimb(out KlimbResult klimbResult) { string getKlimbOutput(string output = "") { if (output == "") { return(DataOvlRef.StringReferences.GetString(DataOvlReference.TravelStrings.KLIMB)); } return(DataOvlRef.StringReferences.GetString(DataOvlReference.TravelStrings.KLIMB) + output); } TileReference curTileRef = State.TheVirtualMap.GetTileReferenceOnCurrentTile(); // if it's a large map, we either klimb with the grapple or don't klimb at all if (State.TheVirtualMap.IsLargeMap) { if (State.HasGrapple) // we don't have a grapple, so we can't klimb { klimbResult = KlimbResult.RequiresDirection; return(getKlimbOutput()); } klimbResult = KlimbResult.CantKlimb; return(getKlimbOutput(DataOvlRef.StringReferences.GetString(DataOvlReference.KlimbingStrings.WITH_WHAT))); } // we can't klimb on the current tile, so we need to pick a direction if (!SpriteTileReferences.IsLadder(curTileRef.Index) && !SpriteTileReferences.IsGrate(curTileRef.Index)) { klimbResult = KlimbResult.RequiresDirection; return(getKlimbOutput()); } SmallMapReferences.SingleMapReference.Location location = State.TheVirtualMap.CurrentSingleMapReference.MapLocation; int nCurrentFloor = State.TheVirtualMap.CurrentSingleMapReference.Floor; bool hasBasement = State.TheVirtualMap.SmallMapRefs.HasBasement(location); int nTotalFloors = State.TheVirtualMap.SmallMapRefs.GetNumberOfFloors(location); int nTopFloor = hasBasement ? nTotalFloors - 1 : nTotalFloors; TileReference tileReference = State.TheVirtualMap.GetTileReference(State.TheVirtualMap.CurrentPosition); if (SpriteTileReferences.IsLadderDown(tileReference.Index) || SpriteTileReferences.IsGrate(tileReference.Index)) { if ((hasBasement && nCurrentFloor >= 0) || nCurrentFloor > 0) { State.TheVirtualMap.LoadSmallMap(SmallMapRef.GetSingleMapByLocation(location, nCurrentFloor - 1), State.CharacterRecords, false); klimbResult = KlimbResult.Success; return(getKlimbOutput(DataOvlRef.StringReferences.GetString(DataOvlReference.TravelStrings.DOWN))); } } else if (SpriteTileReferences.IsLadderUp(tileReference.Index)) { if (nCurrentFloor + 1 < nTopFloor) { State.TheVirtualMap.LoadSmallMap(SmallMapRef.GetSingleMapByLocation(location, nCurrentFloor + 1), State.CharacterRecords, false); klimbResult = KlimbResult.Success; return(getKlimbOutput(DataOvlRef.StringReferences.GetString(DataOvlReference.TravelStrings.UP))); } } klimbResult = KlimbResult.RequiresDirection; return(getKlimbOutput()); }