bool RamProxyService::_Calculate(const Call_InstallJob &args, InventoryItemRef installedItem, Client *const c, Rsp_InstallJob &into) { if(!m_db.GetAssemblyLineProperties(args.installationAssemblyLineID, into.materialMultiplier, into.timeMultiplier, into.installCost, into.usageCost)) return false; const ItemType *productType; // perform some activity-specific actions switch(args.activityID) { /* * Manufacturing */ case ramActivityManufacturing: { BlueprintRef bp = BlueprintRef::StaticCast( installedItem ); productType = &bp->productType(); into.productionTime = bp->type().productionTime(); into.materialMultiplier *= bp->materialMultiplier(); into.timeMultiplier *= bp->timeMultiplier(); into.charMaterialMultiplier = c->GetChar()->GetAttribute(AttrManufactureCostMultiplier).get_float(); into.charTimeMultiplier = c->GetChar()->GetAttribute(AttrManufactureTimeMultiplier).get_float(); switch(productType->race()) { case raceCaldari: into.charTimeMultiplier *= double(c->GetChar()->GetAttribute(AttrCaldariTechTimePercent).get_int()) / 100.0; break; case raceMinmatar: into.charTimeMultiplier *= double(c->GetChar()->GetAttribute(AttrMinmatarTechTimePercent).get_int()) / 100.0; break; case raceAmarr: into.charTimeMultiplier *= double(c->GetChar()->GetAttribute(AttrAmarrTechTimePercent).get_int()) / 100.0; break; case raceGallente: into.charTimeMultiplier *= double(c->GetChar()->GetAttribute(AttrGallenteTechTimePercent).get_int()) / 100.0; break; case raceJove: break; case racePirate: break; } break; } /* * Time productivity research */ case ramActivityResearchingTimeProductivity: { BlueprintRef bp = BlueprintRef::StaticCast( installedItem ); productType = &installedItem->type(); into.productionTime = bp->type().researchProductivityTime(); into.charMaterialMultiplier = double(c->GetChar()->GetAttribute(AttrResearchCostPercent).get_int()) / 100.0; into.charTimeMultiplier = c->GetChar()->GetAttribute(AttrManufacturingTimeResearchSpeed).get_float(); break; } /* * Material productivity research */ case ramActivityResearchingMaterialProductivity: { BlueprintRef bp = BlueprintRef::StaticCast( installedItem ); productType = &installedItem->type(); into.productionTime = bp->type().researchMaterialTime(); into.charMaterialMultiplier = double(c->GetChar()->GetAttribute(AttrResearchCostPercent).get_int()) / 100.0; into.charTimeMultiplier = c->GetChar()->GetAttribute(AttrMineralNeedResearchSpeed).get_float(); break; } /* * Copying */ case ramActivityCopying: { BlueprintRef bp = BlueprintRef::StaticCast( installedItem ); productType = &installedItem->type(); // no ceil() here on purpose into.productionTime = (bp->type().researchCopyTime() / bp->type().maxProductionLimit()) * args.licensedProductionRuns; into.charMaterialMultiplier = double(c->GetChar()->GetAttribute(AttrResearchCostPercent).get_int()) / 100.0; into.charTimeMultiplier = c->GetChar()->GetAttribute(AttrCopySpeedPercent).get_float(); break; } default: { productType = &installedItem->type(); into.charMaterialMultiplier = 1.0; into.charTimeMultiplier = 1.0; break; } } if(!m_db.MultiplyMultipliers(args.installationAssemblyLineID, productType->groupID(), into.materialMultiplier, into.timeMultiplier)) return false; // calculate the remaining things into.productionTime *= static_cast<int32>(into.timeMultiplier * into.charTimeMultiplier * args.runs); into.usageCost *= ceil(into.productionTime / 3600.0); into.cost = into.installCost + into.usageCost; // I "hope" this is right, simple tells client how soon will his job be started // Unfortunately, rounding done on client's side causes showing "Start time: 0 seconds" when he has to wait less than minute // I have no idea how to avoid this ... into.maxJobStartTime = m_db.GetNextFreeTime(args.installationAssemblyLineID); return true; }