public void CalculateResultingPoints(CalibrationProgram sourceCalibration, CalibrationProgram targetCalibration, Character character, out int materialEfficiencyPoints, out int timeEfficiencyPoints) { //betterCT.ME+weakCT.ME/3 + (1-(100/(100+STANDING+PLAYER_EXTENSION_PONT+Facility_PONT)))*25 var materialBase = 0; var timeBase = 0; var weakMaterial = 0; var weakTime = 0; if (sourceCalibration.IsBetterThanOther(targetCalibration)) { materialBase = sourceCalibration.MaterialEfficiencyPoints; timeBase = sourceCalibration.TimeEfficiencyPoints; weakMaterial = targetCalibration.MaterialEfficiencyPoints / 3; weakTime = targetCalibration.TimeEfficiencyPoints / 3; } else { materialBase = targetCalibration.MaterialEfficiencyPoints; timeBase = targetCalibration.TimeEfficiencyPoints; weakMaterial = sourceCalibration.MaterialEfficiencyPoints / 3; weakTime = sourceCalibration.TimeEfficiencyPoints / 3; } var magic = (1 - (100.0 / (100.0 + GetAdditiveComponentForPoints(character)))) * 50; materialEfficiencyPoints = (int)(materialBase + weakMaterial + magic); timeEfficiencyPoints = (int)(timeBase + weakTime + magic); }
public Dictionary <string, object> QueryMaterialAndTime(CalibrationProgram calibrationProgram, Character character, int targetDefintion, int lineOrCPRGMaterialPoints, int lineOrCPRGTimePoints, bool forNextRound = false) { var result = new Dictionary <string, object>(); if (forNextRound) { var decalibration = ProductionDataAccess.GetDecalibration(targetDefintion); double newMaterialEfficiency = 0; double newTimeEfficiency = 0; ProductionLine.GetDecalibratedEfficiencies(lineOrCPRGMaterialPoints, lineOrCPRGTimePoints, decalibration.decrease, ref newMaterialEfficiency, ref newTimeEfficiency); lineOrCPRGMaterialPoints = (int)newMaterialEfficiency; lineOrCPRGTimePoints = (int)newTimeEfficiency; } bool hasBonus; var materialMultiplier = CalculateFinalMaterialMultiplier(character, lineOrCPRGMaterialPoints, targetDefintion, out hasBonus); if (calibrationProgram.IsMissionRelated) { materialMultiplier = materialMultiplier.Clamp(); //never ask more than what we have in the mission } var materials = ProductionDescription.GetRequiredComponentsInfo(ProductionInProgressType.massProduction, 1, materialMultiplier, calibrationProgram.Components); materials.Count.ThrowIfEqual(0, ErrorCodes.WTFErrorMedicalAttentionSuggested); var productionTimeSeconds = CalculateFinalProductionTimeSeconds(character, targetDefintion, lineOrCPRGTimePoints); var price = CalculateProductionPrice(productionTimeSeconds); if (calibrationProgram.IsMissionRelated) { //mission stuff is fixed price = 0; productionTimeSeconds = 10; } result.Add(k.materials, materials); result.Add(k.productionTime, productionTimeSeconds); result.Add(k.price, price); result.Add(k.definition, targetDefintion); result.Add(k.materialMultiplier, materialMultiplier); result.Add(k.hasBonus, hasBonus); result.Add(k.targetQuantity, calibrationProgram.TargetQuantity); return(result); }
private ProductionLine DecalibrateLine(ProductionInProgress productionInProgress, ref bool wasLineDead, out CalibrationProgram cprg) { cprg = null; var productionLine = ProductionLine.LoadByProductionId(productionInProgress.character, productionInProgress.ID); if (productionLine == null) { Logger.Error("DecalibrateLine: productionline was not found. a production in progress exists without related productionline. " + productionInProgress); return(null); } //this CPRG drives the production cprg = productionLine.GetOrCreateCalibrationProgram(this); // mission mechanism if (cprg.IsMissionRelated) { //kill the line, delete cprg wasLineDead = true; ProductionLine.DeleteById(productionLine.Id); Logger.Info("production line was deleted " + productionLine); Repository.Delete(cprg); Logger.Info("CPRG deleted from db " + cprg.Eid); return(productionLine); } //decalibrate var newMaterialEfficiency = productionLine.MaterialEfficiency; var newTimeEfficiency = productionLine.TimeEfficiency; Logger.Info("pre decalibration mateff:" + newMaterialEfficiency + " timeeff:" + newTimeEfficiency + " " + productionInProgress); productionLine.GetDecalibratedEfficiencies(ref newMaterialEfficiency, ref newTimeEfficiency); Logger.Info("post decalibration mateff:" + newMaterialEfficiency + " timeeff:" + newTimeEfficiency + " " + productionInProgress); productionLine.MaterialEfficiency = newMaterialEfficiency; productionLine.TimeEfficiency = newTimeEfficiency; if (productionLine.IsAtZero()) { wasLineDead = true; Logger.Info("line is dead. " + productionInProgress); var info = new Dictionary <string, object> { { k.facility, GetFacilityInfo(productionInProgress.character) }, { k.line, productionLine.ToDictionary() } }; Message.Builder.SetCommand(Commands.ProductionLineDead) .WithData(info) .ToCharacter(productionInProgress.character) .Send(); } ProductionLine.PostMassProduction(productionInProgress.character, productionLine.Id, newTimeEfficiency, newMaterialEfficiency); return(productionLine); }
public static void CreateCalibratedLine(Character character, long facilityEid, CalibrationProgram program) { const string insertSqlCommand = @"INSERT dbo.productionlines (characterid,facilityeid,targetdefinition,materialefficiency,timeefficiency,cprgeid) VALUES (@characterID, @facility ,@definition,@materialEfficiency,@timeEfficiency,@cprgEid)"; Db.Query().CommandText(insertSqlCommand) .SetParameter("@characterID", character.Id) .SetParameter("@facility", facilityEid) .SetParameter("@definition", program.TargetDefinition) .SetParameter("@materialEfficiency", program.MaterialEfficiencyPoints) .SetParameter("@timeEfficiency", program.TimeEfficiencyPoints) .SetParameter("@cprgEid", program.Eid) .ExecuteNonQuery().ThrowIfEqual(0, ErrorCodes.SQLInsertError); }
public static ItemResearchLevel GetItemReserchLevelByCalibrationProgram(this IProductionDataAccess dataAccess, CalibrationProgram calibrationProgram) { return(dataAccess.ResearchLevels.Values.FirstOrDefault(i => i.calibrationProgramDefinition == calibrationProgram.Definition)); }
public void Visit(CalibrationProgram calibrationProgram) { AddItemTradeInfo(calibrationProgram); _tradeInfo[k.materialEfficiency] = calibrationProgram.MaterialEfficiencyPoints; _tradeInfo[k.timeEfficiency] = calibrationProgram.TimeEfficiencyPoints; }