コード例 #1
0
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;
}