/// <summary> /// Blacksmith constructor /// </summary> /// <param name="shoppeKeeperDialogueReference"></param> /// <param name="inventory"></param> /// <param name="theShoppeKeeperReferences"></param> /// <param name="dataOvlReference"></param> public BlackSmith(ShoppeKeeperDialogueReference shoppeKeeperDialogueReference, Inventory inventory, ShoppeKeeperReference theShoppeKeeperReferences, DataOvlReference dataOvlReference) : base(shoppeKeeperDialogueReference, theShoppeKeeperReferences, dataOvlReference) { _inventory = inventory; // go through each of the pieces of equipment in order to build a map of equipment index // -> merchant string list int nEquipmentCounter = 0; foreach (DataOvlReference.Equipment equipment in Enum.GetValues((typeof(DataOvlReference.Equipment)))) { // we only look at equipment up to SpikedCollars if ((int)equipment > (int)DataOvlReference.Equipment.SpikedCollar) { continue; } const int nEquipmentOffset = 8; CombatItem item = inventory.GetItemFromEquipment(equipment); if (item.BasePrice <= 0) { continue; } // add an equipment offset because equipment strings don't start at zero in the merchant strings _equipmentMapToMerchantStrings.Add((int)equipment, nEquipmentCounter + nEquipmentOffset); nEquipmentCounter++; } }
/// <summary> /// Blacksmiths response after buying an item /// </summary> /// <returns></returns> public string GetDoneResponse() { string doneResponse = ShoppeKeeperDialogueReference.GetMerchantString( DataOvlReference.StringReferences.GetString(DataOvlReference.ShoppeKeeperSellingStrings .YES_DONE_SAYS_NAME), shoppeKeeperName: TheShoppeKeeperReference.ShoppeKeeperName); return(doneResponse.Replace("!\"\n", "\"! ")); }
/// <summary> /// Gets merchant response to asking to buy a piece of equipment /// </summary> /// <param name="nEquipmentIndex">index into dialogue array</param> /// <param name="nGold">how much gold will it cost?</param> /// <returns>the complete response string</returns> private string GetEquipmentBuyingOutput(int nEquipmentIndex, int nGold) { int nDialogueIndex = _equipmentMapToMerchantStrings[nEquipmentIndex]; Debug.Assert(nEquipmentIndex >= 0 && nEquipmentIndex <= (int)DataOvlReference.Equipment.SpikedCollar); Debug.Assert(ShoppeKeeperDialogueReference.CountReplacementVariables(nDialogueIndex) == 1); return(ShoppeKeeperDialogueReference.GetMerchantString(nDialogueIndex, nGold: nGold)); }
/// <summary> /// Constructor /// </summary> /// <param name="ultima5Directory">ultima 5 data and save game directory</param> public World(string ultima5Directory) : base() { _u5Directory = ultima5Directory; DataOvlRef = new DataOvlReference(_u5Directory); SmallMapRef = new SmallMapReferences(DataOvlRef); // build the overworld map OverworldMap = new LargeMap(_u5Directory, LargeMap.Maps.Overworld, _tileOverrides); // build the underworld map UnderworldMap = new LargeMap(_u5Directory, LargeMap.Maps.Underworld, _tileOverrides); SpriteTileReferences = new TileReferences(DataOvlRef.StringReferences); InvRef = new InventoryReferences(); LargeMapRef = new LargeMapLocationReferences(DataOvlRef); AllSmallMaps = new SmallMaps(SmallMapRef, _u5Directory, SpriteTileReferences, _tileOverrides); MoonPhaseRefs = new MoonPhaseReferences(DataOvlRef); State = new GameState(_u5Directory, DataOvlRef); // build all combat maps from the Combat Map References foreach (CombatMapReference.SingleCombatMapReference combatMapRef in _combatMapRef.MapReferenceList) { CombatMap combatMap = new CombatMap(_u5Directory, combatMapRef, _tileOverrides); } // build a "look" table for all tiles LookRef = new Look(_u5Directory); // build the sign tables SignRef = new Signs(_u5Directory); TalkScriptsRef = new TalkScripts(_u5Directory, DataOvlRef); // build the NPC tables NpcRef = new NonPlayerCharacterReferences(_u5Directory, SmallMapRef, TalkScriptsRef, State); ShoppeKeeperDialogueReference = new ShoppeKeeperDialogueReference(_u5Directory, DataOvlRef, NpcRef, State.PlayerInventory); // sadly I have to initialize this after the NPCs are created because there is a circular dependency State.InitializeVirtualMap(SmallMapRef, AllSmallMaps, LargeMapRef, OverworldMap, UnderworldMap, NpcRef, SpriteTileReferences, State, NpcRef, InvRef); if (State.Location != SmallMapReferences.SingleMapReference.Location.Britannia_Underworld) { State.TheVirtualMap.LoadSmallMap(SmallMapRef.GetSingleMapByLocation(State.Location, State.Floor), State.CharacterRecords, true); } else { State.TheVirtualMap.LoadLargeMap(LargeMap.Maps.Overworld); } }
/// <summary> /// Construct a shoppe keeper /// </summary> /// <param name="shoppeKeeperDialogueReference"></param> /// <param name="theShoppeKeeperReference"></param> /// <param name="dataOvlReference"></param> protected ShoppeKeeper(ShoppeKeeperDialogueReference shoppeKeeperDialogueReference, ShoppeKeeperReference theShoppeKeeperReference, DataOvlReference dataOvlReference) { ShoppeKeeperDialogueReference = shoppeKeeperDialogueReference; DataOvlReference = dataOvlReference; TheShoppeKeeperReference = theShoppeKeeperReference; }
/// <summary> /// The blacksmiths nasty response to attempting to sell ammo /// </summary> /// <returns></returns> public string DontDealInAmmoOutput() { return(ShoppeKeeperDialogueReference.GetMerchantString(DataOvlReference.StringReferences.GetString( DataOvlReference.ShoppeKeeperSellingStrings .DONT_DEAL_AMMO_GROWL_NAME), shoppeKeeperName: TheShoppeKeeperReference.ShoppeKeeperName)); }
/// <summary> /// Gets the response string when vendor is trying to sell a particular piece of equipment /// </summary> /// <param name="nGold">how much to charge?</param> /// <param name="equipmentName">the name of the equipment</param> /// <returns>the complete response string</returns> public string GetEquipmentSellingOutput(int nGold, string equipmentName) { int sellStringIndex = ShoppeKeeperDialogueReference.GetRandomIndexFromRange(49, 56); return(ShoppeKeeperDialogueReference.GetMerchantString(sellStringIndex, nGold: nGold, equipmentName: equipmentName)); }