private static ErrorCodes LoadItemAndResearchKit(ProductionInProgress productionInProgress, out ResearchKit researchKit, out Item item) { researchKit = null; item = null; if (productionInProgress.ReservedEids.Length != 2) { Logger.Error("illegal amount of reserved items " + productionInProgress); return(ErrorCodes.ServerError); } var ed = EntityDefault.GetByEid(productionInProgress.ReservedEids[0]); long researchKitEid, itemEid; if (ed.CategoryFlags.IsCategory(CategoryFlags.cf_research_kits) || ed.CategoryFlags.IsCategory(CategoryFlags.cf_random_research_kits)) { researchKitEid = productionInProgress.ReservedEids[0]; itemEid = productionInProgress.ReservedEids[1]; } else { itemEid = productionInProgress.ReservedEids[0]; researchKitEid = productionInProgress.ReservedEids[1]; } item = Item.GetOrThrow(itemEid); researchKit = (ResearchKit)Item.GetOrThrow(researchKitEid); return(ErrorCodes.NoError); }
public IDictionary <string, object> ResearchQuery(Character character, int researchKitDefinition, int targetDefinition) { var replyDict = new Dictionary <string, object> { { k.researchKitDefinition, researchKitDefinition }, { k.itemDefinition, targetDefinition } }; var researchKitDefault = EntityDefault.Get(researchKitDefinition); var itemDefault = EntityDefault.Get(targetDefinition); var missionRelated = false; //match item vs research kit vs mission if (researchKitDefault.CategoryFlags.IsCategory(CategoryFlags.cf_random_research_kits)) { itemDefault.CategoryFlags.IsCategory(CategoryFlags.cf_generic_random_items).ThrowIfFalse(ErrorCodes.OnlyMissionItemAccepted); missionRelated = true; } if (itemDefault.CategoryFlags.IsCategory(CategoryFlags.cf_generic_random_items)) { researchKitDefault.CategoryFlags.IsCategory(CategoryFlags.cf_random_research_kits).ThrowIfFalse(ErrorCodes.OnlyMissionResearchKitAccepted); missionRelated = true; } //on gamma not even possible if (GetDockingBase().IsOnGammaZone()) { missionRelated.ThrowIfTrue(ErrorCodes.MissionItemCantBeResearchedOnGamma); } var researchKitLevel = ResearchKit.GetResearchLevelByDefinition(researchKitDefinition); replyDict.Add(k.researchKitLevel, researchKitLevel); var isPrototypeItem = ProductionDataAccess.IsPrototypeDefinition(targetDefinition); Logger.Info("item definition: " + EntityDefault.Get(targetDefinition).Name + " isPrototype:" + isPrototypeItem); var nominalDict = new Dictionary <string, object>(); var realDict = new Dictionary <string, object>(); //match research levels var itemLevel = ProductionDataAccess.GetResearchLevel(targetDefinition); itemLevel.ThrowIfEqual(0, ErrorCodes.ItemNotResearchable); itemLevel.ThrowIfGreater(researchKitLevel, ErrorCodes.ResearchLevelMismatch); var itemResearchLevel = ProductionDataAccess.ResearchLevels.GetOrDefault(targetDefinition).ThrowIfNull(ErrorCodes.ItemNotResearchable); var outputDefinition = (int)itemResearchLevel.calibrationProgramDefinition.ThrowIfNull(ErrorCodes.ServerError); //calculate CalculateFinalResearchTimeSeconds(character, itemLevel, researchKitLevel, isPrototypeItem, out int researchTimeSeconds, out int levelDifferenceBonusPoints); researchTimeSeconds = GetShortenedProductionTime(researchTimeSeconds); var price = missionRelated ? 0.0 : researchTimeSeconds *GetPricePerSecond(targetDefinition); ProductionDataAccess.GetCalibrationDefault(outputDefinition, out int materialEfficiency, out int timeEfficiency); var rawMaterialEfficiency = materialEfficiency; CalculateMaterialAndTimeEfficiency(character, itemResearchLevel, levelDifferenceBonusPoints, ref materialEfficiency, ref timeEfficiency); if (missionRelated) { //the material efficiency must be default 1.0 materialEfficiency = rawMaterialEfficiency; } //calculate nominal var nominalResearchTimeSeconds = CalculateNominalResearchTimeSeconds(character, itemResearchLevel.researchLevel); var nominalPrice = missionRelated ? 0.0 : nominalResearchTimeSeconds *GetPricePerSecond(targetDefinition); ProductionDataAccess.GetCalibrationDefault(outputDefinition, out int nominalMaterialEfficiency, out int nominalTimeEfficiency); var rawNominalMatEff = nominalMaterialEfficiency; CalculateMaterialAndTimeEfficiency(character, itemResearchLevel, 0, ref nominalMaterialEfficiency, ref nominalTimeEfficiency); if (missionRelated) { nominalMaterialEfficiency = rawNominalMatEff; researchTimeSeconds = 10; nominalResearchTimeSeconds = 10; } //collect definition related replyDict.Add(k.calibrationProgram, itemResearchLevel.calibrationProgramDefinition); //collect real realDict.Add(k.price, (long)price); realDict.Add(k.researchTime, researchTimeSeconds); realDict.Add(k.materialEfficiency, materialEfficiency); realDict.Add(k.timeEfficiency, timeEfficiency); //collect nominal nominalDict.Add(k.price, (long)nominalPrice); nominalDict.Add(k.researchTime, nominalResearchTimeSeconds); nominalDict.Add(k.materialEfficiency, nominalMaterialEfficiency); nominalDict.Add(k.timeEfficiency, nominalTimeEfficiency); replyDict.Add(k.real, realDict); replyDict.Add(k.nominal, nominalDict); replyDict.Add(k.facility, Eid); return(replyDict); }
public ErrorCodes StartResearch(Character character, int researchTimeSeconds, Item sourceItem, ResearchKit researchKit, bool useCorporationWallet, out ProductionInProgress newProduction) { newProduction = ProductionInProgressFactory(); var itemsList = new [] { researchKit, sourceItem }; ItemResearchLevel itemResearchLevel; if (!ProductionDataAccess.ResearchLevels.TryGetValue(sourceItem.Definition, out itemResearchLevel)) { Logger.Error("consistency error. no research level or calibration program was defined for " + EntityDefault.Get(sourceItem.Definition).Name + " " + sourceItem.Definition); return(ErrorCodes.ServerError); } if (itemResearchLevel.calibrationProgramDefinition == null) { Logger.Error("consistency error. CPRG definition is NULL for " + EntityDefault.Get(sourceItem.Definition).Name + " " + sourceItem.Definition); return(ErrorCodes.ServerError); } var cprgDefiniton = (int)itemResearchLevel.calibrationProgramDefinition; MoveItemsToStorage(itemsList); newProduction = ProductionInProgressFactory(); newProduction.startTime = DateTime.Now; newProduction.finishTime = DateTime.Now.AddSeconds(researchTimeSeconds); newProduction.type = ProductionInProgressType.research; newProduction.character = character; newProduction.facilityEID = Eid; newProduction.resultDefinition = cprgDefiniton; newProduction.totalProductionTimeSeconds = researchTimeSeconds; newProduction.baseEID = Parent; newProduction.pricePerSecond = GetPricePerSecond(sourceItem.Definition); newProduction.ReservedEids = (from i in itemsList select i.Eid).ToArray(); newProduction.useCorporationWallet = useCorporationWallet; newProduction.amountOfCycles = 1; if (!newProduction.TryWithdrawCredit()) { if (useCorporationWallet) { throw new PerpetuumException(ErrorCodes.CorporationNotEnoughMoney); } throw new PerpetuumException(ErrorCodes.CharacterNotEnoughMoney); } return(ErrorCodes.NoError); }