Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor the production system #478

Open
4 tasks
LucasKovacs opened this issue Jan 5, 2022 · 6 comments
Open
4 tasks

Refactor the production system #478

LucasKovacs opened this issue Jan 5, 2022 · 6 comments
Assignees
Labels
Enhancement Issues that require improvements

Comments

@LucasKovacs
Copy link
Member

LucasKovacs commented Jan 5, 2022

The whole production system is a bit chaotic and old. It uses eval which I also don't like at all.

  • Refactor resources setting.-
  • Refactor infos.-
  • Refactor the planets resources update.-
  • Queues refactor.-

Features depending on this:

All these feature, somehow, touches code related to production or resources storage which is also a mess. Queues are also embed a bit with the refactor of planets resources update, that's why queues refactor must be followed by #258

@LucasKovacs LucasKovacs self-assigned this Jan 5, 2022
@LucasKovacs LucasKovacs modified the milestone: v3.4.0 Jan 5, 2022
@LucasKovacs LucasKovacs added the Enhancement Issues that require improvements label Jan 5, 2022
@jonamix-ar
Copy link

Esta refactorizaciones, serviría un montón para el día de mañana crear las clases y los objetos. de booster y esos

@LucasKovacs
Copy link
Member Author

Quiero cerrar a fin de mes la 3.3 y ya veremos que para febrero. Quizás esto, veré que me dan ganas jaja

@jonamix-ar
Copy link

jonamix-ar commented May 11, 2022

Estube investigando las calculadoras de ogame como funcionan

function getProductionRateSplit(techID, techLevel, energyTechLevel, plasmaTechLevel, maxTemp, pos, universeSpeedFactor, geologist, engineer, productionFactor, powerFactor, boosterType, allOfficers, playerClass, isTrader) {
    var geologistFactor = geologist === true ? 0.1 : 0;
    var allStaffFactor = allOfficers === true ? 0.02 : 0;
    var engineerFactor = (engineer === true) ? 0.1 : 0;
    var boostFactor = boosterType * 0.1;
    var classFactor = playerClass === 0 ? 0.25 : 0;
    let allianceClassFactor = isTrader ? 0.05 : 0;
    var positionFactor = 1;
    var basePR;
    var rows = [0, 0, 0, 0, 0, 0, 0, 0, 0];
    switch (techID * 1) {
        case 1:
            switch (pos * 1) {
                case 6:
                case 10:
                    positionFactor = 1.17;
                    break;
                case 7:
                case 9:
                    positionFactor = 1.23;
                    break;
                case 8:
                    positionFactor = 1.35;
                    break;
                default:
                    positionFactor = 1;
            }
            rows[0] = Math.floor(30 * universeSpeedFactor * positionFactor);
            basePR = 30.0 * techLevel * Math.pow(1.1, techLevel) * productionFactor * powerFactor * positionFactor;
            rows[1] = Math.floor(basePR * universeSpeedFactor);
            rows[2] = Math.round(basePR * 0.01 * plasmaTechLevel * universeSpeedFactor);
            rows[3] = Math.round(basePR * boostFactor * universeSpeedFactor);
            rows[4] = Math.round(basePR * geologistFactor * universeSpeedFactor);
            rows[5] = 0; // тут в таблице Инженер
            rows[6] = Math.round(basePR * allStaffFactor * universeSpeedFactor);
            rows[7] = Math.round(basePR * classFactor * universeSpeedFactor);
            rows[8] = Math.round(basePR * allianceClassFactor * universeSpeedFactor);
            break;
        case 2:
            switch (pos * 1) {
                case 1:
                    positionFactor = 1.4;
                    break;
                case 2:
                    positionFactor = 1.296;
                    break;
                case 3:
                    positionFactor = 1.2;
                    break;
                default:
                    positionFactor = 1;
            }
            rows[0] = Math.floor(15 * universeSpeedFactor * positionFactor);
            basePR = 20.0 * techLevel * Math.pow(1.1, techLevel) * productionFactor * powerFactor * positionFactor;
            rows[1] = Math.floor(basePR * universeSpeedFactor);
            rows[2] = Math.round(basePR * 0.0066 * plasmaTechLevel * universeSpeedFactor);
            rows[3] = Math.round(basePR * boostFactor * universeSpeedFactor);
            rows[4] = Math.round(basePR * geologistFactor * universeSpeedFactor);
            rows[5] = 0;
            rows[6] = Math.round(basePR * allStaffFactor * universeSpeedFactor);
            rows[7] = Math.round(basePR * classFactor * universeSpeedFactor);
            rows[8] = Math.round(basePR * allianceClassFactor * universeSpeedFactor);
            break;
        case 3:
            rows[0] = 0;
            basePR = 10.0 * techLevel * Math.pow(1.1, techLevel) * (1.44 - 0.004 * maxTemp) * productionFactor * powerFactor;
            rows[1] = Math.floor(basePR * universeSpeedFactor);
            rows[2] = Math.round(basePR * 0.0033 * plasmaTechLevel * universeSpeedFactor);
            rows[3] = Math.round(basePR * boostFactor * universeSpeedFactor);
            rows[4] = Math.round(basePR * geologistFactor * universeSpeedFactor);
            rows[5] = 0;
            rows[6] = Math.round(basePR * allStaffFactor * universeSpeedFactor);
            rows[7] = Math.round(basePR * classFactor * universeSpeedFactor);
            rows[8] = Math.round(basePR * allianceClassFactor * universeSpeedFactor);
            break;
        case 4:
            //productionRate = Math.floor(20.0 * techLevel * Math.pow(1.1, techLevel) * engineerFactor * powerFactor);
            basePR = Math.floor(20.0 * techLevel * Math.pow(1.1, techLevel) * powerFactor);
            rows[1] = Math.floor(basePR);
            break;
        case 12:
            //productionRate = Math.floor(30.0 * techLevel * Math.pow((1.05 + energyTechLevel * 0.01), techLevel) * engineerFactor * powerFactor);
            basePR = Math.floor(30.0 * techLevel * Math.pow((1.05 + energyTechLevel * 0.01), techLevel) * powerFactor);
            rows[1] = Math.floor(basePR);
            break;
        case 212:
            //productionRate = techLevel * Math.floor((maxTemp + 140) / 6) * engineerFactor * powerFactor;
            basePR = techLevel * Math.floor((maxTemp + 140) / 6) * powerFactor;
            if (basePR < 0) {
                basePR = 0;
            }
            rows[1] = Math.floor(basePR);
    }
    return rows;
}

Consumo x Hora

function getHourlyConsumption(techID, techLevel, universeSpeedFactor, powerFactor) {
    if (techLevel < 1)
        return 0;
    var consump;
    switch (techID * 1) {
        case 1: 
        case 2:
            consump = Math.floor(10.0 * techLevel * Math.pow(1.1, techLevel) * powerFactor);
            break;
        case 12:
            consump = Math.floor(Math.floor(10.0 * techLevel * Math.pow(1.1, techLevel) * universeSpeedFactor) * powerFactor);
            break;
        case 3:
            consump = Math.floor(20.0 * techLevel * Math.pow(1.1, techLevel) * powerFactor);
            break;
        default:
            return 0;
    }
    return consump;
}

Cost de energia

function getBuildEnergyCost_C(techID, techLevel, techData) {
    if (techLevel < 1)
        return 0;
    var data = techData[techID];
    if (data === undefined)
        return [0, 0, 0];
    var buildCost = 0;
    switch (techID * 1) {
        case 33:
            buildCost = 1000 * Math.pow(data[3], techLevel - 1);
            break;
        case 36:
            buildCost = Math.floor(50 * Math.pow(data[3] / 2, techLevel - 1));
            break;
        case 199:
            buildCost = 300000 * Math.pow(data[3], techLevel - 1);
            break;
        default:
            buildCost = 0;
    }
    return buildCost;
}

Reduccion de tiempo x mo

function getHalvingCost(techID, timeSpan) {
    if (Number(timeSpan) === 0)
        return 0;
    let tmCost = 750;
    if (techID < 200 && timeSpan > 1800) {
        let halves = Math.ceil(Math.ceil(timeSpan / 60) / 30);
        tmCost = 750 * halves;
        if (techID < 100 && tmCost > 72000)
            tmCost = 72000;
        if (techID > 100 && techID < 200 && tmCost > 108000)
            tmCost = 108000;
        return tmCost;
    }
    if (techID > 200 && timeSpan > 1800) {
        let halves = 0.1 * Math.ceil(Math.floor(timeSpan / 60) / 3);
        tmCost = Math.floor(750 * halves);
        if (tmCost > 72000)
            tmCost = 72000;
        return tmCost;
    }
    return tmCost;
}

No se si serviria pero por las dudas para sacar ideas creo q si ojala pudieramos parecernos a ogame con el diseño antiguo jajaj

@jonamix-ar
Copy link

jonamix-ar commented Apr 29, 2023

@LucasKovacs Consulto con que universo vamos hacer los test para tomar referencias y poder ayudarte esta refactorización por q ahora viste q no hay más universo x1 va no encontré yo.

@LucasKovacs
Copy link
Member Author

Cual es el mínimo que encontraste?

@jonamix-ar
Copy link

jonamix-ar commented Apr 29, 2023

X4 son casi todo, dorado de UK desapareció por q se fusiono. Lo que podemos hacer es usar la calculadora proxyfox.-

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Enhancement Issues that require improvements
Projects
Status: No status
Development

No branches or pull requests

2 participants