diff --git a/edr/data/engineers_mats.json b/edr/data/engineers_mats.json new file mode 100644 index 00000000..eb3cf086 --- /dev/null +++ b/edr/data/engineers_mats.json @@ -0,0 +1,149 @@ +{ + "domino green": { + "topographical surveys": 20, + "stellar activity logs": 20, + "spectral analysis data": 10, + "transmitter": 5, + "circuit board": 10, + "weapon inventory": 10, + "chemical inventory": 10, + "digital designs": 10, + "epoxy adhesive": 10, + "memory chip": 5, + "compression-liquefied gas": 1, + "ballistics data": 10, + "metal coil": 20, + "rdx": 10, + "weapon component": 5, + "ionised gas": 2, + "chemical formulae": 10, + "mineral survey": 15, + "motor": 5, + "electromagnet": 10, + "electrical fuse": 10, + "risk assessments": 30, + "ion battery": 20, + "micro transformer": 25, + "optical lens": 5, + "reactor output review": 10, + "electrical wiring": 15, + "mining analytics": 10, + "viscoelastic polymer": 10, + "micro hydraulics": 10 + }, + "kit fowler": { + "combat training material":10, + "combatant performance":10, + "epinephrine":10, + "micro thrusters":15, + "recycling logs":15, + "weapon test data":20, + "production reports":10, + "weapon component":10, + "reactor output review":10, + "ion battery":5, + "micro transformer":15, + "electrical wiring":15, + "security expenses":5, + "tungsten carbide":5, + "metal coil":10, + "digital designs":10, + "operational manual":10, + "production schedule":10, + "circuit board":5, + "encrypted memory chip":15 + }, + "yarden bond": { + "audio logs":5, + "patrol routes":20, + "scrambler":10, + "transmitter":15, + "circuit board":5, + "evacuation protocols":10, + "genetic research":5, + "epinephrine":10, + "ph neutraliser":15, + "operational manual":10, + "combatant performance":40, + "combat training material":10, + "viscoelastic polymer":30, + "extraction yield data":10, + "biometric data":5, + "weapon component":10, + "electromagnet":30, + "metal coil":20, + "rdx":10, + "chemical patents":5, + "microelectrode":20, + "electrical wiring":45, + "chemical catalyst":10, + "radioactivity data":5, + "aerogel":20, + "optical fibre":25, + "optical lens":5, + "g-meds":10, + "topographical surveys":10, + "micro thrusters":5, + "motor":10, + "settlement assault plans":5, + "tactical plans":10, + "micro hydraulics":5 + + }, + "terra velasquez": { + "evacuation protocol":10, + "genetic researc":5, + "epinephrine":10, + "ph neutraliser":15, + "extraction yield data":10, + "biometric data":5, + "combatant performance":10, + "weapon component":15, + "electromagnet":20, + "metal coil":20, + "viscoelastic polymer":10, + "rdx":10, + "chemical patents":5, + "combatant performance":10, + "microelectrode":20, + "electrical wiring":30, + "chemical catalyst":10, + "electromagnet":10, + "metal coil":10, + "radioactivity data":5, + "combatant performance":10, + "aerogel":20, + "optical fibre":25, + "metal coil":10, + "optical lens":5, + "electrical wiring":15, + "pharmaceutical patents":5, + "air quality reports":15, + "oxygenic bacteria":10, + "ph neutraliser":15, + "troop deployment records":5, + "gene sequencing data":5, + "clinical trial records":5, + "oxygenic bacteria":10, + "chemical catalyst":15, + "atmospheric data":10, + "mining analytics":10, + "viscoelastic polymer":15 + + }, + "jude navarro": { + + }, + "hero ferrari": { + + }, + "wellington beck": { + + }, + "uma laszlo": { + + }, + "oden geiger": { + + } +} \ No newline at end of file diff --git a/edr/data/odyssey_mats.json b/edr/data/odyssey_mats.json new file mode 100644 index 00000000..8c329437 --- /dev/null +++ b/edr/data/odyssey_mats.json @@ -0,0 +1,192 @@ +{ + "manufacturinginstructions": { "type": "data", "locations": ["STO buildings", "RES buildings", "IND buildings", "HAB buildings", "Crashed satellite", "Mission reward"], "used": 56}, + "weaponschematic": { "type": "item", "locations": ["Irregular markers", "STO buildings", "PWR buildings", "CMD buildings"], "used": 44}, + "ionisedgas": { "type": "item", "locations": ["RES buildings", "PWR buildings", "IND buildings", "EXT buildings", "AGRI buildings", "Mission reward"], "used": 38}, + "operationalmanual": { "type": "data", "locations": ["MED room", "RES buildings", "IND buildings", "CMD buildings", "Crashed satellite", "Mission reward"], "used": 33}, + "combattrainingmaterial": { "type": "data", "locations": ["RES buildings", "HAB buildings", "CMD buildings", "Mission reward"], "used": 25}, + "combatantperformance": { "type": "data", "locations": ["HAB buildings", "CMD buildings", "Mission reward"], "used": 25}, + "mininganalytics": { "type": "data", "locations": ["IND buildings", "EXT buildings", "Mission reward"], "used": 22}, + "compressionliquefiedgas": { "type": "item", "locations": ["RES buildings", "PWR buildings", "IND buildings", "EXT buildings", "AGRI buildings", "Mission reward"], "used": 20}, + "biometricdata": { "type": "data", "locations": ["MED room", "CMD buildings", "Mission reward"], "used": 18}, + "weapontestdata": { "type": "data", "locations": ["CMD buildings", "Mission reward"], "used": 18}, + "spectralanalysisdata": { "type": "data", "locations": ["RES buildings", "CMD buildings", "Crashed satellite", "Mission reward"], "used": 17}, + "digitaldesigns": { "type": "data", "locations": ["HAB buildings", "Mission reward"], "used": 14}, + "patrolroutes": { "type": "data", "locations": ["Irregular markers", "CMD buildings", "Mission reward"], "used": 14}, + "productionreports": { "type": "data", "locations": ["RES buildings", "IND buildings", "AGRI buildings", "Mission reward"], "used": 14}, + "riskassessments": { "type": "data", "locations": ["RES buildings", "HAB buildings", "Mission reward"], "used": 14}, + "healthmonitor": { "type": "item", "locations": ["MED room", "RES buildings", "HAB buildings", "Mission reward", "Surface crash site"], "used": 12}, + "largecapacitypowerregulator": { "type": "item", "locations": ["Settlements"], "used": 12}, + "suitschematic": { "type": "item", "locations": ["STO buildings", "PWR buildings", "CMD buildings", "Mission reward"], "used": 12}, + "atmosphericdata": { "type": "data", "locations": ["Irregular markers", "RES buildings", "IND buildings", "Crashed satellite", "Mission reward"], "used": 11}, + "audiologs": { "type": "data", "locations": ["CMD buildings", "Settlements", "Mission reward"], "used": 11}, + "productionschedule": { "type": "data", "locations": ["RES buildings", "IND buildings", "AGRI buildings", "Mission reward"], "used": 11}, + "securityexpenses": { "type": "data", "locations": ["CMD buildings", "Mission reward"], "used": 11}, + "topographicalsurveys": { "type": "data", "locations": ["RES buildings", "IND buildings", "Crashed satellite", "Mission reward"], "used": 10}, + "reactoroutputreview": { "type": "data", "locations": ["RES buildings", "PWR buildings", "Mission reward"], "used": 9}, + "ballisticsdata": { "type": "data", "locations": ["Irregular markers", "CMD buildings", "Mission reward"], "used": 7}, + "radioactivitydata": { "type": "data", "locations": ["RES buildings", "PWR buildings", "IND buildings", "Crashed satellite", "Mission reward"], "used": 6}, + "stellaractivitylogs": { "type": "data", "locations": ["RES buildings", "CMD buildings", "AGRI buildings", "Crashed satellite", "Mission reward"], "used": 6}, + "weaponinventory": { "type": "data", "locations": ["CMD buildings", "Mission reward"], "used": 6}, + "bloodtestresults": { "type": "data", "locations": ["MED room", "RES buildings", "AGRI buildings", "Mission reward"], "used": 4}, + "chemicalexperimentdata": { "type": "data", "locations": ["RES buildings", "IND buildings", "AGRI buildings", "Mission reward"], "used": 4}, + "chemicalformulae": { "type": "data", "locations": ["RES buildings", "IND buildings", "AGRI buildings", "Mission reward"], "used": 4}, + "chemicalpatents": { "type": "data", "locations": ["RES buildings", "IND buildings", "AGRI buildings", "Mission reward"], "used": 4}, + "extractionyielddata": { "type": "data", "locations": ["RES buildings", "IND buildings", "EXT buildings", "Mission reward"], "used": 4}, + "geneticresearch": { "type": "data", "locations": ["MED room", "RES buildings", "AGRI buildings", "Mission reward"], "used": 4}, + "medicalrecords": { "type": "data", "locations": ["MED room", "RES buildings", "Mission reward"], "used": 4}, + "mineralsurvey": { "type": "data", "locations": ["IND buildings", "EXT buildings", "Crashed satellite", "Mission reward"], "used": 4}, + "surveillanceequipment": { "type": "item", "locations": ["STO buildings", "EXT buildings", "CMD buildings"], "used": 4}, + "airqualityreports": { "type": "data", "locations": ["STO buildings", "PWR buildings", "IND buildings", "HAB buildings", "EXT buildings", "AGRI buildings", "Mission reward"], "used": 3}, + "chemicalinventory": { "type": "data", "locations": ["RES buildings", "IND buildings", "EXT buildings", "AGRI buildings", "Mission reward"], "used": 3}, + "clinicaltrialrecords": { "type": "data", "locations": ["MED room", "RES buildings", "Mission reward"], "used": 3}, + "evacuationprotocols": { "type": "data", "locations": ["PWR buildings", "IND buildings", "HAB buildings", "Mission reward"], "used": 3}, + "gmeds": { "type": "item", "locations": ["Irregular markers", "MED room", "RES buildings", "CMD buildings", "AGRI buildings", "Settlements", "Mission reward", "Surface crash site"], "used": 3}, + "genesequencingdata": { "type": "data", "locations": ["MED room", "RES buildings", "AGRI buildings", "Mission reward"], "used": 3}, + "maintenancelogs": { "type": "data", "locations": ["Irregular markers", "PWR buildings", "AGRI buildings", "Mission reward"], "used": 3}, + "nocdata": { "type": "data", "locations": ["Crashed satellite", "Mission reward"], "used": 3}, + "pharmaceuticalpatents": { "type": "data", "locations": ["MED room", "RES buildings", "CMD buildings", "AGRI buildings", "Mission reward"], "used": 3}, + "recyclinglogs": { "type": "data", "locations": ["IND buildings", "HAB buildings", "Mission reward"], "used": 3}, + "settlementassaultplans": { "type": "data", "locations": ["CMD buildings", "Mission reward"], "used": 3}, + "surveilleancelogs": { "type": "data", "locations": ["CMD buildings", "Crashed satellite", "Mission reward"], "used": 3}, + "tacticalplans": { "type": "data", "locations": ["Irregular markers", "CMD buildings", "Mission reward"], "used": 3}, + "troopdeploymentrecords": { "type": "data", "locations": ["CMD buildings", "Mission reward"], "used": 3}, + "biologicalsample": { "type": "item", "locations": ["STO buildings", "AGRI buildings"], "used": 0}, + "catmedia": { "type": "data", "locations": ["HAB buildings"], "used": 0}, + "classicentertainment": { "type": "data", "locations": ["HAB buildings"], "used": 0}, + "employeegeneticdata": { "type": "data", "locations": ["RES buildings", "CMD buildings"], "used": 0}, + "financialprojections": { "type": "data", "locations": ["HAB buildings"], "used": 0}, + "geneticrepairmeds": { "type": "item", "locations": ["MED room", "STO buildings", "RES buildings", "IND buildings", "EXT buildings", "AGRI buildings"], "used": 0}, + "insightentertainmentsuite": { "type": "item", "locations": ["Settlements"], "used": 0}, + "multimediaentertainment": { "type": "data", "locations": ["HAB buildings"], "used": 0}, + "opinionpolls": { "type": "data", "locations": ["HAB buildings", "CMD buildings"], "used": 0}, + "push": { "type": "item", "locations": ["Irregular markers", "Surface crash site"], "used": 0}, + "settlementdefenceplans": { "type": "data", "locations": ["Irregular markers", "CMD buildings"], "used": 0}, + "smearcampaignplans": { "type": "data", "locations": ["HAB buildings", "CMD buildings"], "used": 0}, + "accidentlogs": { "type": "data", "locations": ["RES buildings", "PWR buildings", "IND buildings", "HAB buildings", "EXT buildings", "AGRI buildings"], "used": 0}, + "agriculturalprocesssample": { "type": "item", "locations": [], "used": 0}, + "axcombatlogs": { "type": "data", "locations": ["CMD buildings"], "used": 0}, + "biochemicalagent": { "type": "item", "locations": ["Irregular markers", "Surface crash site"], "used": 0}, + "biologicalweapondata": { "type": "data", "locations": [], "used": 0}, + "blacklistdata": { "type": "data", "locations": ["CMD buildings", "Crashed satellite"], "used": 0}, + "buildingschematic": { "type": "item", "locations": ["CMD buildings", "AGRI buildings"], "used": 0}, + "californium": { "type": "item", "locations": ["EXT buildings"], "used": 0}, + "campaignplans": { "type": "data", "locations": ["HAB buildings"], "used": 0}, + "castfossil": { "type": "item", "locations": ["EXT buildings"], "used": 0}, + "censusdata": { "type": "data", "locations": ["HAB buildings"], "used": 0}, + "chemicalprocesssample": { "type": "item", "locations": [], "used": 0}, + "chemicalsample": { "type": "item", "locations": ["RES buildings"], "used": 0}, + "chemicalweapondata": { "type": "data", "locations": [], "used": 0}, + "cocktailrecipes": { "type": "data", "locations": ["HAB buildings"], "used": 0}, + "compactlibrary": { "type": "item", "locations": ["RES buildings", "HAB buildings", "CMD buildings", "Settlements"], "used": 0}, + "conflicthistory": { "type": "data", "locations": ["CMD buildings"], "used": 0}, + "criminalrecords": { "type": "data", "locations": ["CMD buildings"], "used": 0}, + "cropyieldanalysis": { "type": "data", "locations": ["AGRI buildings"], "used": 0}, + "culinaryrecipes": { "type": "data", "locations": ["HAB buildings"], "used": 0}, + "deepmantlesample": { "type": "item", "locations": ["RES buildings", "EXT buildings"], "used": 0}, + "degradedpowerregulator": { "type": "item", "locations": ["Irregular markers", "RES buildings", "Surface crash site"], "used": 0}, + "dutyrota": { "type": "data", "locations": ["RES buildings", "PWR buildings", "IND buildings", "CMD buildings"], "used": 0}, + "employeedirectory": { "type": "data", "locations": ["HAB buildings"], "used": 0}, + "employeeexpenses": { "type": "data", "locations": ["HAB buildings"], "used": 0}, + "employmenthistory": { "type": "data", "locations": ["HAB buildings"], "used": 0}, + "enhancedinterrogationrecordings": { "type": "data", "locations": ["CMD buildings"], "used": 0}, + "espionagematerial": { "type": "data", "locations": [], "used": 0}, + "explorationjournals": { "type": "data", "locations": ["HAB buildings"], "used": 0}, + "factionassociates": { "type": "data", "locations": ["HAB buildings"], "used": 0}, + "factiondonatorlist": { "type": "data", "locations": ["HAB buildings"], "used": 0}, + "factionnews": { "type": "data", "locations": ["HAB buildings", "Crashed satellite"], "used": 0}, + "fleetregistry": { "type": "data", "locations": [], "used": 0}, + "geologicaldata": { "type": "data", "locations": ["EXT buildings"], "used": 0}, + "hush": { "type": "item", "locations": ["Irregular markers", "Surface crash site"], "used": 0}, + "hydroponicdata": { "type": "data", "locations": ["AGRI buildings"], "used": 0}, + "incidentlogs": { "type": "data", "locations": ["CMD buildings"], "used": 0}, + "inertiacanister": { "type": "item", "locations": ["RES buildings", "PWR buildings", "IND buildings", "AGRI buildings"], "used": 0}, + "infinity": { "type": "item", "locations": ["HAB buildings", "CMD buildings", "Settlements"], "used": 0}, + "influenceprojections": { "type": "data", "locations": ["HAB buildings"], "used": 0}, + "inorganiccontaminant": { "type": "item", "locations": [], "used": 0}, + "insight": { "type": "item", "locations": ["RES buildings", "HAB buildings", "CMD buildings", "Settlements"], "used": 0}, + "insightdatabank": { "type": "item", "locations": ["RES buildings", "HAB buildings", "CMD buildings", "Settlements"], "used": 0}, + "internalcorrespondence": { "type": "data", "locations": ["HAB buildings", "Crashed satellite"], "used": 0}, + "interrogationrecordings": { "type": "data", "locations": ["CMD buildings"], "used": 0}, + "interviewrecordings": { "type": "data", "locations": [], "used": 0}, + "jobapplications": { "type": "data", "locations": ["HAB buildings", "CMD buildings"], "used": 0}, + "kompromat": { "type": "data", "locations": [], "used": 0}, + "lazarus": { "type": "item", "locations": ["Irregular markers", "Surface crash site"], "used": 0}, + "literaryfiction": { "type": "data", "locations": ["HAB buildings"], "used": 0}, + "meetingminutes": { "type": "data", "locations": ["HAB buildings"], "used": 0}, + "microbialinhibitor": { "type": "item", "locations": ["RES buildings", "AGRI buildings"], "used": 0}, + "mutageniccatalyst": { "type": "item", "locations": [], "used": 0}, + "networkaccesshistory": { "type": "data", "locations": ["HAB buildings"], "used": 0}, + "networksecurityprotocols": { "type": "data", "locations": [], "used": 0}, + "nextofkinrecords": { "type": "data", "locations": ["HAB buildings"], "used": 0}, + "nutritionalconcentrate": { "type": "item", "locations": ["RES buildings", "AGRI buildings"], "used": 0}, + "patienthistory": { "type": "data", "locations": ["MED room"], "used": 0}, + "payrollinformation": { "type": "data", "locations": ["HAB buildings"], "used": 0}, + "personalcomputer": { "type": "item", "locations": ["RES buildings", "HAB buildings", "CMD buildings", "Settlements"], "used": 0}, + "personaldocuments": { "type": "item", "locations": ["HAB buildings", "CMD buildings", "Settlements"], "used": 0}, + "personallogs": { "type": "data", "locations": ["HAB buildings"], "used": 0}, + "petrifiedfossil": { "type": "item", "locations": ["EXT buildings"], "used": 0}, + "photoalbums": { "type": "data", "locations": ["HAB buildings"], "used": 0}, + "plantgrowthcharts": { "type": "data", "locations": ["AGRI buildings"], "used": 0}, + "politicalaffiliations": { "type": "data", "locations": ["HAB buildings"], "used": 0}, + "prisonerlogs": { "type": "data", "locations": [], "used": 0}, + "propaganda": { "type": "data", "locations": ["Crashed satellite"], "used": 0}, + "purchaserecords": { "type": "data", "locations": ["HAB buildings", "AGRI buildings"], "used": 0}, + "purchaserequests": { "type": "data", "locations": ["AGRI buildings"], "used": 0}, + "pyrolyticcatalyst": { "type": "item", "locations": [], "used": 0}, + "refinementprocesssample": { "type": "item", "locations": [], "used": 0}, + "residentialdirectory": { "type": "data", "locations": ["HAB buildings"], "used": 0}, + "salesrecords": { "type": "data", "locations": ["HAB buildings"], "used": 0}, + "seedgeneaology": { "type": "data", "locations": ["RES buildings", "AGRI buildings"], "used": 0}, + "shareholderinformation": { "type": "data", "locations": [], "used": 0}, + "shipschematic": { "type": "item", "locations": ["STO buildings", "CMD buildings"], "used": 0}, + "slushfundlogs": { "type": "data", "locations": [], "used": 0}, + "spyware": { "type": "data", "locations": [], "used": 0}, + "syntheticgenome": { "type": "item", "locations": ["AGRI buildings"], "used": 0}, + "syntheticpathogen": { "type": "item", "locations": ["Irregular markers", "Surface crash site"], "used": 0}, + "taxrecords": { "type": "data", "locations": ["HAB buildings"], "used": 0}, + "travelpermits": { "type": "data", "locations": ["HAB buildings"], "used": 0}, + "trueformfossil": { "type": "item", "locations": ["EXT buildings"], "used": 0}, + "unionmembership": { "type": "data", "locations": ["PWR buildings"], "used": 0}, + "universaltranslator": { "type": "item", "locations": ["HAB buildings", "CMD buildings", "Settlements"], "used": 0}, + "vaccinationrecords": { "type": "data", "locations": ["RES buildings"], "used": 0}, + "vaccineresearch": { "type": "data", "locations": [], "used": 0}, + "vehicleschematic": { "type": "item", "locations": ["STO buildings", "CMD buildings"], "used": 0}, + "vipsecuritydetail": { "type": "data", "locations": [], "used": 0}, + "virologydata": { "type": "data", "locations": ["RES buildings"], "used": 0}, + "virus": { "type": "data", "locations": [], "used": 0}, + "visitorregister": { "type": "data", "locations": ["HAB buildings"], "used": 0}, + "xenodefenceprotocols": { "type": "data", "locations": [], "used": 0}, + "aerogel": { "cost": 9, "type": "component", "subtype": "chemical", "locations": [ "RES buildings", "IND buildings", "EXT buildings", "AGRI buildings"], "used": 4}, + "chemicalcatalyst": { "cost": 7, "type": "component", "subtype": "chemical", "locations": [ "RES buildings", "AGRI buildings"], "used": 11}, + "chemicalsuperbase": { "cost": 9, "type": "component", "subtype": "chemical", "locations": [ "MED room", "RES buildings", "IND buildings", "Settlements"], "used": 16}, + "epinephrine": { "cost": 5, "type": "component", "subtype": "chemical", "locations": [ "MED room", "RES buildings", "AGRI buildings"], "used": 6}, + "epoxyadhesive": { "cost": 5, "type": "component", "subtype": "chemical", "locations": [ "STO buildings", "RES buildings", "CMD buildings", "Settlements"], "used": 6}, + "graphene": { "cost": 23, "type": "component", "subtype": "chemical", "locations": [ "RES buildings", "HAB buildings", "CMD buildings", "AGRI buildings"], "used": 12}, + "oxygenicbacteria": { "cost": 5, "type": "component", "subtype": "chemical", "locations": [ "RES buildings", "AGRI buildings"], "used": 6}, + "phneutraliser": { "cost": 5, "type": "component", "subtype": "chemical", "locations": [ "MED room", "RES buildings", "AGRI buildings"], "used": 6}, + "rdx": { "cost": 7, "type": "component", "subtype": "chemical", "locations": [ "STO buildings", "RES buildings", "IND buildings", "CMD buildings"], "used": 12}, + "viscoelasticpolymer": { "cost": 11, "type": "component", "subtype": "chemical", "locations": [ "RES buildings", "CMD buildings", "AGRI buildings"], "used": 40}, + "circuitboard": { "cost": 9, "type": "component", "subtype": "circuit", "locations": [ "IND buildings", "CMD buildings", "Settlements"], "used": 28}, + "circuitswitch": { "cost": 4, "type": "component", "subtype": "circuit", "locations": [ "STO buildings", "RES buildings", "IND buildings", "HAB buildings", "EXT buildings", "CMD buildings", "AGRI buildings", "Settlements"], "used": 3}, + "electricalfuse": { "cost": 5, "type": "component", "subtype": "circuit", "locations": [ "CMD buildings"], "used": 7}, + "electricalwiring": { "cost": 9, "type": "component", "subtype": "circuit", "locations": [ "IND buildings", "CMD buildings"], "used": 12}, + "electromagnet": { "cost": 9, "type": "component", "subtype": "circuit", "locations": [ "STO buildings", "RES buildings", "CMD buildings"], "used": 23}, + "ionbattery": { "cost": 9, "type": "component", "subtype": "circuit", "locations": [ "RES buildings", "CMD buildings", "Settlements"], "used": 13}, + "metalcoil": { "cost": 9, "type": "component", "subtype": "circuit", "locations": [ "STO buildings", "RES buildings", "IND buildings", "CMD buildings", "AGRI buildings", "Settlements"], "used": 22}, + "microsupercapacitor": { "cost": 5, "type": "component", "subtype": "circuit", "locations": [ "RES buildings", "CMD buildings"], "used": 7}, + "microtransformer": { "cost": 7, "type": "component", "subtype": "circuit", "locations": [ "MED room", "RES buildings", "IND buildings", "CMD buildings", "AGRI buildings"], "used": 9}, + "microelectrode": { "cost": 16, "type": "component", "subtype": "circuit", "locations": [ "IND buildings", "AGRI buildings"], "used": 28}, + "motor": { "cost": 5, "type": "component", "subtype": "circuit", "locations": [ "STO buildings", "RES buildings", "IND buildings", "AGRI buildings", "Settlements"], "used": 7}, + "opticalfibre": { "cost": 11, "type": "component", "subtype": "circuit", "locations": [ "STO buildings", "CMD buildings", "AGRI buildings"], "used": 23}, + "carbonfibreplating": { "cost": 11, "type": "component", "subtype": "tech", "locations": [ "RES buildings"], "used": 7}, + "encryptedmemorychip": { "cost": 4, "type": "component", "subtype": "tech", "locations": [ "RES buildings", "CMD buildings", "Settlements"], "used": 6}, + "memorychip": { "cost": 4, "type": "component", "subtype": "tech", "locations": [ "RES buildings", "CMD buildings", "Settlements"], "used": 3}, + "microhydraulics": { "cost": 7, "type": "component", "subtype": "tech", "locations": [ "RES buildings", "IND buildings", "Settlements"], "used": 25}, + "microthrusters": { "cost": 5, "type": "component", "subtype": "tech", "locations": [ "STO buildings", "RES buildings", "IND buildings", "CMD buildings"], "used": 6}, + "opticallens": { "cost": 9, "type": "component", "subtype": "tech", "locations": [ "RES buildings", "CMD buildings", "Settlements"], "used": 20}, + "scrambler": { "cost": 5, "type": "component", "subtype": "tech", "locations": [ "RES buildings", "CMD buildings"], "used": 14}, + "titaniumplating": { "cost": 11, "type": "component", "subtype": "tech", "locations": [ "IND buildings"], "used": 7}, + "transmitter": { "cost": 5, "type": "component", "subtype": "tech", "locations": [ "CMD buildings", "Settlements"], "used": 14}, + "tungstencarbide": { "cost": 11, "type": "component", "subtype": "tech", "locations": [ "RES buildings", "IND buildings", "EXT buildings", "AGRI buildings"], "used": 27}, + "weaponcomponent": { "cost": 18, "type": "component", "subtype": "tech", "locations": [ "IND buildings", "CMD buildings"], "used": 49} +} \ No newline at end of file diff --git a/edr/edengineers.py b/edr/edengineers.py new file mode 100644 index 00000000..876529a4 --- /dev/null +++ b/edr/edengineers.py @@ -0,0 +1,281 @@ +import json +import utils2to3 + +class EDEngineer(object): + def __init__(self): + self.name = None + self.progress = None + self.rank_progress = None + self.rank = None + + def update(self, progress): + if self.name is None or self.name == progress.get("Engineer", None): + self.progress = progress.get("Progress", None) + self.rank_progress = progress.get("RankProgress", 0) + self.rank = progress.get("Rank", 0) + + def dibs(self, materials): + return None + + def relevant(self, material_name): + return False + + def interested_in(self, material_name): + return False + +class EDDominoGreen(EDEngineer): + def __init__(self): + super().__init__() + self.name = "Domino Green" + +class EDKitFowler(EDEngineer): + def __init__(self): + super().__init__() + self.name = "Kit Fowler" + + def dibs(self, materials): + needed = {} + if self.progress is None: + needed["push"] = 5 + if self.progress != "Unlocked": + needed["opinionpolls"] = 20 + return needed + + def relevant(self, material_name): + return material_name.lower() in ["opinionpolls", "push"] + + def interested_in(self, material_name): + theset = ["opinionpolls"] + if self.progress is None: + theset.append("push") + + if self.progress != "Unlocked": + return material_name.lower() in theset + return False + +class EDYardenBond(EDEngineer): + def __init__(self): + super().__init__() + self.name = "Yarden Bond" + + def dibs(self, materials): + needed = {} + if self.progress is None: + needed["surveillanceequipment"] = 5 + if self.progress != "Unlocked": + needed["smearcampaignplans"] = 8 + return needed + + def relevant(self, material_name): + return material_name.lower() in ["smearcampaignplans", "surveillanceequipment"] + + def interested_in(self, material_name): + theset = ["smearcampaignplans"] + if self.progress is None: + theset.append("surveillanceequipment") + + if self.progress != "Unlocked": + return material_name.lower() in theset + return False + +class EDJudeNavarro(EDEngineer): + def __init__(self): + super().__init__() + self.name = "Jude Navarro" + +class EDTerraVelasquez(EDEngineer): + def __init__(self): + super().__init__() + self.name = "Terra Velasquez" + + def dibs(self, materials): + needed = {} + if self.progress is None: + needed["geneticrepairmeds"] = 5 + return needed + + def relevant(self, material_name): + return material_name.lower() == "geneticrepairmeds" + + def interested_in(self, material_name): + theset = [] + if self.progress is None: + theset.append("geneticrepairmeds") + + return material_name.lower() in theset + +class EDOdenGeiger(EDEngineer): + def __init__(self): + super().__init__() + self.name = "Oden Geiger" + + def dibs(self, materials): + needed = {} + if self.progress != "Unlocked": + me = materials.get("biologicalsample", 0) + ce = materials.get("employeegenetic data", 0) + cm = materials.get("geneticresearch", 0) + me = max(min(20, me), 7) + ce = max(min(20-me, ce), 7) + cm = 20-me-ce + + + needed = {"biologicalsample":me, "employeegenetic data":ce, "geneticresearch": cm} + + if self.progress is None: + needed["financialprojections"] = 15 + + return needed + + def relevant(Self, material_name): + return material_name.lower() in ["financialprojections", "biologicalsample", "employeegeneticdata", "geneticresearch"] + + def interested_in(self, material_name): + theset = ["biologicalsample", "employeegeneticdata", "geneticresearch"] + if self.progress is None: + theset.append("financialprojections") + + if self.progress != "Unlocked": + return material_name.lower() in theset + return False + +class EDHeroFerrari(EDEngineer): + def __init__(self): + super().__init__() + self.name = "Hero Ferrari" + +class EDWellingtonBeck(EDEngineer): + def __init__(self): + super().__init__() + self.name = "Wellington Beck" + + def dibs(self, materials): + needed = {} + if self.progress != "Unlocked": + me = materials.get("multimediaentertainment", 0) + ce = materials.get("classicentertainment", 0) + cm = materials.get("catmedia", 0) + me = max(min(25, me), 8) + ce = max(min(25-me, ce), 25-me-8) + cm = 25-me-ce + + needed = {"multimedia entertainment":me, "classic entertainment":ce, "cat media": cm} + + if self.progress is None: + needed["settlementdefenceplans"] = 15 + return needed + + def relevant(self, material_name): + return material_name.lower() in ["settlementdefenceplans", "multimediaentertainment", "classicentertainment", "catmedia"] + + def interested_in(self, material_name): + theset = ["multimediaentertainment", "classicentertainment", "catmedia"] + if self.progress is None: + theset.append("settlementdefenceplans") + + if self.progress != "Unlocked": + return material_name.lower() in theset + return False + +class EDUmaLaszlo(EDEngineer): + def __init__(self): + super().__init__() + self.name = "Uma Laszlo" + + + def dibs(self, materials): + needed = {} + if self.progress is None: + needed["insightentertainmentsuite"] = 5 + return needed + + def relevant(self, material_name): + return material_name.lower() == "insightentertainmentsuite" + + def interested_in(self, material_name): + if self.progress is None: + return self.relevant(material_name) + return False + + +class EDEngineers(object): + ODYSSEY_MATS = json.loads(open(utils2to3.abspathmaker(__file__, 'data', 'odyssey_mats.json')).read()) + + def __init__(self): + self.engineers = {} + engineers = ["domino green", "kit fowler", "yarden bond", "terra velasquez", "jude navarro", "hero ferrari", "wellington beck", "uma laszlo", "oden geiger"] + for e in engineers: + self.engineers[e] = EDEngineerFactory.from_engineer_name(e) + + def update(self, engineer_progress_event): + engineers = engineer_progress_event.get("Engineers", []) + for e in engineers: + self.engineers[e["Engineer"]] = EDEngineerFactory.from_engineer_progress_dict(e) + + def dibs(self, materials): + # TODO not needed? + dibs_list = [] + for name in self.engineers: + dibs = self.engineers[name].dibs(materials) + if dibs: + dibs_list.append(dibs) + for name in EDEngineers.ODYSSEY_MATS: + quantity = materials.get(name, 0) + if EDEngineers.ODYSSEY_MATS[name].get("used", 0) > 0 and quantity: + dibs_list.append({name: quantity}) + return dibs_list + + def is_useless(self, material_name): + if material_name not in EDEngineers.ODYSSEY_MATS: + return False # better safe than sorry, and currently takes care of consumables. + + if EDEngineers.ODYSSEY_MATS[material_name].get("used", 0) > 0: + return False + + return not self.is_contributing(material_name) + + def is_contributing(self, material_name): + for name in self.engineers: + if self.engineers[name].relevant(material_name): + return True + return False + + def is_unnecessary(self, material_name): + for name in self.engineers: + if self.engineers[name].relevant(material_name) and not self.engineers[name].interested_in(material_name): + return True + return False + + +class EDUnknownEngineer(EDEngineer): + def __init__(self): + super(EDUnknownEngineer, self).__init__() + self.type = u'Unknown' + +class EDEngineerFactory(object): + __engineer_classes = { + "domino green": EDDominoGreen, + "kit fowler": EDKitFowler, + "yarden bond": EDYardenBond, + "terra velasquez": EDTerraVelasquez, + "jude navarro": EDJudeNavarro, + "hero ferrari": EDHeroFerrari, + "wellington beck": EDWellingtonBeck, + "uma laszlo": EDUmaLaszlo, + "oden geiger": EDOdenGeiger, + "unknown": EDUnknownEngineer + } + + @staticmethod + def from_engineer_progress_dict(progress): + engineer = EDEngineerFactory.from_engineer_name(progress.get("Engineer", 'unknown')) + engineer.update(progress) + return engineer + + @staticmethod + def from_engineer_name(name): + return EDEngineerFactory.__engineer_classes.get(name.lower(), EDUnknownEngineer)() + + @staticmethod + def unknown_engineer(): + return EDUnknownEngineer() \ No newline at end of file diff --git a/edr/edentities.py b/edr/edentities.py index d055f7ef..01c96d48 100644 --- a/edr/edentities.py +++ b/edr/edentities.py @@ -19,6 +19,7 @@ import edrfleetcarrier import edrminingstats import edrbountyhuntingstats +import edengineers import utils2to3 EDRLOG = EDRLog() @@ -880,6 +881,7 @@ def __init__(self, name=None): self.fleet_carrier = edrfleetcarrier.EDRFleetCarrier() self.mining_stats = edrminingstats.EDRMiningStats() self.bounty_hunting_stats = edrbountyhuntingstats.EDRBountyHuntingStats() + self.engineers = edengineers.EDEngineers() def __repr__(self): return str(self.__dict__) diff --git a/edr/edrclient.py b/edr/edrclient.py index 5f9a167e..c427a081 100644 --- a/edr/edrclient.py +++ b/edr/edrclient.py @@ -776,14 +776,26 @@ def cmdr(self, cmdr_name, autocreate=True, check_inara_server=False): self.__commsjammed() return None - def eval_build(self, eval_type): - canonical_commands = ["power"] - synonym_commands = ["priority", "pp", "priorities"] - supported_commands = set(canonical_commands + synonym_commands) + def eval(self, eval_type): + canonical_commands = ["power", "backpack", "locker"] + synonym_commands = {"power": ["priority", "pp", "priorities"]} + supported_commands = set(canonical_commands + synonym_commands["power"]) if eval_type not in supported_commands: self.__notify(_(u"EDR Evals"), [_(u"Yo dawg, I don't do evals for '{}'").format(eval_type), _(u"Try {} instead.").format(", ".join(canonical_commands))], clear_before=True) return + if eval_type == "power" or eval_type in synonym_commands["power"]: + self.eval_build() + elif eval_type == "backpack": + self.eval_backpack() + elif eval_type == "locker": + self.eval_locker() + + def eval_build(self): + if not self.player.mothership.update_modules(): + self.notify_with_details(_(u"Loadout information is stale"), [_(u"Congrats, you've found a bug in Elite!"), _(u"The modules info isn't updated right away :("), _(u"Try again after moving around or relog and check your modules.")]) + return + vehicle = self.player.mothership if not vehicle.modules: self.__notify(_(u"Basic Power Assessment"), [_(u"Yo dawg, U sure that you got modules on this?")], clear_before=True) @@ -808,8 +820,41 @@ def eval_build(self, eval_type): praise = _(u" ✓: {}").format(assessment[fraction]["praise"]) if "praise" in assessment[fraction] else u"" formatted_assessment.append(_(u"{}{}").format(recommendation, praise)) self.__notify(_(u"Basic Power Assessment (β; oddities? relog, look at your modules)"), formatted_assessment, clear_before=True) - - + + def eval_backpack(self, passive=False): + micro_resources = dict(sorted(self.player.inventory.all_in_backpack().items(), key=lambda item: item[1], reverse=True)) + if micro_resources: + details = self.__eval_micro_resources(micro_resources, from_backpack=True) + if details: + self.__notify("Backpack assessment", details, clear_before=True) + elif not passive: + self.__notify(_("Backpack assessment"), [_(u"Nothing superfluous")], clear_before = True) + elif not passive: + self.__notify(_("Backpack assessment"), [_(u"Empty backpack?")], clear_before=True) + + def eval_locker(self, passive=False): + micro_resources = dict(sorted(self.player.inventory.all_in_locker().items(), key=lambda item: item[1], reverse=True)) + if micro_resources: + details = self.__eval_micro_resources(micro_resources) + if details: + self.__notify(_(u"Storage assessment"), details, clear_before=True) + elif not passive: + self.__notify(_("Storage assessment"), [_(u"Nothing superfluous")], clear_before=True) + elif not passive: + self.__notify(_("Storage assessment"), [_(u"Empty ship locker?")], clear_before=True) + + def __eval_micro_resources(self, micro_resources, from_backpack=False): + discardable = [self.player.inventory.oneliner(name, from_backpack) for name in micro_resources if (self.player.engineers.is_useless(name) and self.player.inventory.count(name, from_backpack=from_backpack, from_locker=not from_backpack))] + unnecessary = [self.player.inventory.oneliner(name, from_backpack) for name in micro_resources if (self.player.engineers.is_unnecessary(name) and self.player.inventory.count(name, from_backpack=from_backpack, from_locker=not from_backpack))] + details = [] + discardable = discardable[0:min(len(discardable), 3)] + unnecessary = unnecessary[0:min(len(unnecessary), 3)] + if discardable: + details.append(_(u"Useless: {}").format(", ".join(discardable))) + if unnecessary: + details.append(_(u"Unnecessary: {}").format(", ".join(unnecessary))) + return details + def evict_system(self, star_system): self.edrsystems.evict(star_system) diff --git a/edr/edrinventory.py b/edr/edrinventory.py index 0aa15b37..e0ae9458 100644 --- a/edr/edrinventory.py +++ b/edr/edrinventory.py @@ -7,10 +7,19 @@ from edri18n import _ import utils2to3 +#TODO anarchy only microresources... +#TODO clear backpack when boarding, etc. +#TODO consistency checks, or at least not showing useless/unnecessary for items that are at 0 + class EDRInventory(object): EDR_INVENTORY_ENCODED_CACHE = utils2to3.abspathmaker(__file__, 'cache', 'encoded_mats.v1.p') EDR_INVENTORY_RAW_CACHE = utils2to3.abspathmaker(__file__, 'cache', 'raw_mats.v1.p') - EDR_INVENTORY_MANUFACTURED_CACHE = utils2to3.abspathmaker(__file__, 'cache', 'manufactured_mats.v1.p') + EDR_INVENTORY_MANUFACTURED_CACHE = utils2to3.abspathmaker(__file__, 'cache', 'manufactured_mats.v1.p') + EDR_INVENTORY_COMPONENT_CACHE = utils2to3.abspathmaker(__file__, 'cache', 'component_mats.v1.p') + EDR_INVENTORY_ITEM_CACHE = utils2to3.abspathmaker(__file__, 'cache', 'item_mats.v1.p') + EDR_INVENTORY_CONSUMABLE_CACHE = utils2to3.abspathmaker(__file__, 'cache', 'consumables.v1.p') + EDR_INVENTORY_DATA_CACHE = utils2to3.abspathmaker(__file__, 'cache', 'data_mats.v1.p') + EDR_INVENTORY_BACKPACK_CACHE = utils2to3.abspathmaker(__file__, 'cache', 'backpack.v1.p') MATERIALS_LUT = { "zinc": {"localized": _(u"Zinc"), "raw": "Zinc", "category": "raw", "grade": 2}, @@ -144,7 +153,204 @@ class EDRInventory(object): "unknowncarapace": {"localized": _(u"Thargoid Carapace"), "raw": "Thargoid Carapace", "category": "manufactured", "grade": 2}, "unknownenergycell": {"localized": _(u"Thargoid Energy Cell"), "raw": "Thargoid Energy Cell", "category": "manufactured", "grade": 3}, "unknownorganiccircuitry": {"localized": _(u"Thargoid Organic Circuitry"), "raw": "Thargoid Organic Circuitry", "category": "manufactured", "grade": 5}, - "unknowntechnologycomponents": {"localized": _(u"Thargoid Technological Components"), "raw": "Thargoid Technological Components", "category": "manufactured", "grade": 4} + "unknowntechnologycomponents": {"localized": _(u"Thargoid Technological Components"), "raw": "Thargoid Technological Components", "category": "manufactured", "grade": 4}, + "bypass": { "localized": _(u"E-Breach"), "category": "consumable", "raw": "E-Breach", "grade":0}, + "largecapacitypowerregulator": { "localized": _(u"Power Regulator"), "category": "item", "raw": "Power Regulator", "grade":0}, + "chemicalinventory": { "localized": _(u"Chemical Inventory"), "category": "data", "raw": "Chemical Inventory", "grade":0}, + "dutyrota": { "localized": _(u"Duty Rota"), "category": "data", "raw": "Duty Rota", "grade":0}, + "evacuationprotocols": { "localized": _(u"Evacuation Protocols"), "category": "data", "raw": "Evacuation Protocols", "grade":0}, + "explorationjournals": { "localized": _(u"Exploration Journals"), "category": "data", "raw": "Exploration Journals", "grade":0}, + "factionnews": { "localized": _(u"Faction News"), "category": "data", "raw": "Faction News", "grade":0}, + "financialprojections": { "localized": _(u"Financial Projections"), "category": "data", "raw": "Financial Projections", "grade":0}, + "salesrecords": { "localized": _(u"Sales Records"), "category": "data", "raw": "Sales Records", "grade":0}, + "unionmembership": { "localized": _(u"Union Membership"), "category": "data", "raw": "Union Membership", "grade":0}, + "compactlibrary": { "localized": _(u"Compact Library"), "category": "item", "raw": "Compact Library", "grade":0}, + "infinity": { "localized": _(u"infinity"), "category": "item", "raw": "infinity", "grade":0}, + "insightentertainmentsuite": { "localized": _(u"Insight Entertainment Suite"), "category": "item", "raw": "Insight Entertainment Suite", "grade":0}, + "lazarus": { "localized": _(u"lazarus"), "category": "item", "raw": "lazarus", "grade":0}, + "energycell": { "localized": _(u"Energy Cell"), "category": "consumable", "raw": "Energy Cell", "grade":0}, + "healthpack": { "localized": _(u"Medkit"), "category": "consumable", "raw": "Medkit", "grade":0}, + "universaltranslator": { "localized": _(u"Universal Translator"), "category": "item", "raw": "Universal Translator", "grade":0}, + "biochemicalagent": { "localized": _(u"Biochemical Agent"), "category": "item", "raw": "Biochemical Agent", "grade":0}, + "degradedpowerregulator": { "localized": _(u"Degraded Power Regulator"), "category": "item", "raw": "Degraded Power Regulator", "grade":0}, + "hush": { "localized": _(u"Hush"), "category": "item", "raw": "Hush", "grade":0}, + "maintenancelogs": { "localized": _(u"Maintenance Logs"), "category": "data", "raw": "Maintenance Logs", "grade":0}, + "patrolroutes": { "localized": _(u"Patrol Routes"), "category": "data", "raw": "Patrol Routes", "grade":0}, + "push": { "localized": _(u"push"), "category": "item", "raw": "push", "grade":0}, + "settlementdefenceplans": { "localized": _(u"Settlement Defence Plans"), "category": "data", "raw": "Settlement Defence Plans", "grade":0}, + "surveilleancelogs": { "localized": _(u"Surveillance Logs"), "category": "data", "raw": "Surveillance Logs", "grade":0}, + "syntheticpathogen": { "localized": _(u"Synthetic Pathogen"), "category": "item", "raw": "Synthetic Pathogen", "grade":0}, + "buildingschematic": { "localized": _(u"Building Schematic"), "category": "item", "raw": "Building Schematic", "grade":0}, + "operationalmanual": { "localized": _(u"Operational Manual"), "category": "data", "raw": "Operational Manual", "grade":0}, + "blacklistdata": { "localized": _(u"Blacklist Data"), "category": "data", "raw": "Blacklist Data", "grade":0}, + "insight": { "localized": _(u"Insight"), "category": "item", "raw": "Insight", "grade":0}, + "airqualityreports": { "localized": _(u"Air Quality Reports"), "category": "data", "raw": "Air Quality Reports", "grade":0}, + "employeedirectory": { "localized": _(u"Employee Directory"), "category": "data", "raw": "Employee Directory", "grade":0}, + "factionassociates": { "localized": _(u"Faction Associates"), "category": "data", "raw": "Faction Associates", "grade":0}, + "meetingminutes": { "localized": _(u"Meeting Minutes"), "category": "data", "raw": "Meeting Minutes", "grade":0}, + "multimediaentertainment": { "localized": _(u"Multimedia Entertainment"), "category": "data", "raw": "Multimedia Entertainment", "grade":0}, + "networkaccesshistory": { "localized": _(u"Network Access History"), "category": "data", "raw": "Network Access History", "grade":0}, + "purchaserecords": { "localized": _(u"Purchase Records"), "category": "data", "raw": "Purchase Records", "grade":0}, + "radioactivitydata": { "localized": _(u"Radioactivity Data"), "category": "data", "raw": "Radioactivity Data", "grade":0}, + "residentialdirectory": { "localized": _(u"Residential Directory"), "category": "data", "raw": "Residential Directory", "grade":0}, + "shareholderinformation": { "localized": _(u"Shareholder Information"), "category": "data", "raw": "Shareholder Information", "grade":0}, + "travelpermits": { "localized": _(u"Travel Permits"), "category": "data", "raw": "Travel Permits", "grade":0}, + "accidentlogs": { "localized": _(u"Accident Logs"), "category": "data", "raw": "Accident Logs", "grade":0}, + "campaignplans": { "localized": _(u"Campaign Plans"), "category": "data", "raw": "Campaign Plans", "grade":0}, + "combattrainingmaterial": { "localized": _(u"Combat Training Material"), "category": "data", "raw": "Combat Training Material", "grade":0}, + "internalcorrespondence": { "localized": _(u"Internal Correspondence"), "category": "data", "raw": "Internal Correspondence", "grade":0}, + "payrollinformation": { "localized": _(u"Payroll Information"), "category": "data", "raw": "Payroll Information", "grade":0}, + "personallogs": { "localized": _(u"Personal Logs"), "category": "data", "raw": "Personal Logs", "grade":0}, + "weaponinventory": { "localized": _(u"Weapon Inventory"), "category": "data", "raw": "Weapon Inventory", "grade":0}, + "atmosphericdata": { "localized": _(u"Atmospheric Data"), "category": "data", "raw": "Atmospheric Data", "grade":0}, + "topographicalsurveys": { "localized": _(u"Topographical Surveys"), "category": "data", "raw": "Topographical Surveys", "grade":0}, + "literaryfiction": { "localized": _(u"Literary Fiction"), "category": "data", "raw": "Literary Fiction", "grade":0}, + "reactoroutputreview": { "localized": _(u"Reactor Output Review"), "category": "data", "raw": "Reactor Output Review", "grade":0}, + "nextofkinrecords": { "localized": _(u"Next of Kin Records"), "category": "data", "raw": "Next of Kin Records", "grade":0}, + "purchaserequests": { "localized": _(u"Purchase Requests"), "category": "data", "raw": "Purchase Requests", "grade":0}, + "taxrecords": { "localized": _(u"Tax Records"), "category": "data", "raw": "Tax Records", "grade":0}, + "visitorregister": { "localized": _(u"Visitor Register"), "category": "data", "raw": "Visitor Register", "grade":0}, + "pharmaceuticalpatents": { "localized": _(u"Pharmaceutical Patents"), "category": "data", "raw": "Pharmaceutical Patents", "grade":0}, + "vaccineresearch": { "localized": _(u"Vaccine Research"), "category": "data", "raw": "Vaccine Research", "grade":0}, + "virologydata": { "localized": _(u"Virology Data"), "category": "data", "raw": "Virology Data", "grade":0}, + "vaccinationrecords": { "localized": _(u"Vaccination Records"), "category": "data", "raw": "Vaccination Records", "grade":0}, + "censusdata": { "localized": _(u"Census Data"), "category": "data", "raw": "Census Data", "grade":0}, + "geographicaldata": { "localized": _(u"Geographical Data"), "category": "data", "raw": "Geographical Data", "grade":0}, + "mineralsurvey": { "localized": _(u"Mineral Survey"), "category": "data", "raw": "Mineral Survey", "grade":0}, + "chemicalformulae": { "localized": _(u"Chemical Formulae"), "category": "data", "raw": "Chemical Formulae", "grade":0}, + "amm_grenade_frag": { "localized": _(u"Frag Grenade"), "category": "consumable", "raw": "Frag Grenade", "grade":0}, + "amm_grenade_emp": { "localized": _(u"Shield Disruptor"), "category": "consumable", "raw": "Shield Disruptor", "grade":0}, + "amm_grenade_shield": { "localized": _(u"Shield Projector"), "category": "consumable", "raw": "Shield Projector", "grade":0}, + "chemicalexperimentdata": { "localized": _(u"Chemical Experiment Data"), "category": "data", "raw": "Chemical Experiment Data", "grade":0}, + "chemicalpatents": { "localized": _(u"Chemical Patents"), "category": "data", "raw": "Chemical Patents", "grade":0}, + "productionreports": { "localized": _(u"Production Reports"), "category": "data", "raw": "Production Reports", "grade":0}, + "productionschedule": { "localized": _(u"Production Schedule"), "category": "data", "raw": "Production Schedule", "grade":0}, + "bloodtestresults": { "localized": _(u"Blood Test Results"), "category": "data", "raw": "Blood Test Results", "grade":0}, + "combatantperformance": { "localized": _(u"Combatant Performance"), "category": "data", "raw": "Combatant Performance", "grade":0}, + "troopdeploymentrecords": { "localized": _(u"Troop Deployment Records"), "category": "data", "raw": "Troop Deployment Records", "grade":0}, + "catmedia": { "localized": _(u"Cat Media"), "category": "data", "raw": "Cat Media", "grade":0}, + "employeegeneticdata": { "localized": _(u"Employee Genetic Data"), "category": "data", "raw": "Employee Genetic Data", "grade":0}, + "factiondonatorlist": { "localized": _(u"Faction Donator List"), "category": "data", "raw": "Faction Donator List", "grade":0}, + "nocdata": { "localized": _(u"NOC Data"), "category": "data", "raw": "NOC Data", "grade":0}, + "trueformfossil": { "localized": _(u"True Form Fossil"), "category": "item", "raw": "True Form Fossil", "grade":0}, + "healthmonitor": { "localized": _(u"Health Monitor"), "category": "item", "raw": "Health Monitor", "grade":0}, + "nutritionalconcentrate": { "localized": _(u"Nutritional Concentrate"), "category": "item", "raw": "Nutritional Concentrate", "grade":0}, + "personaldocuments": { "localized": _(u"Personal Documents"), "category": "item", "raw": "Personal Documents", "grade":0}, + "chemicalsample": { "localized": _(u"Chemical Sample"), "category": "item", "raw": "Chemical Sample", "grade":0}, + "insightdatabank": { "localized": _(u"Insight Data Bank"), "category": "item", "raw": "Insight Data Bank", "grade":0}, + "ionisedgas": { "localized": _(u"Ionised Gas"), "category": "item", "raw": "Ionised Gas", "grade":0}, + "personalcomputer": { "localized": _(u"Personal Computer"), "category": "item", "raw": "Personal Computer", "grade":0}, + "shipschematic": { "localized": _(u"Ship Schematic"), "category": "item", "raw": "Ship Schematic", "grade":0}, + "suitschematic": { "localized": _(u"Suit Schematic"), "category": "item", "raw": "Suit Schematic", "grade":0}, + "vehicleschematic": { "localized": _(u"Vehicle Schematic"), "category": "item", "raw": "Vehicle Schematic", "grade":0}, + "weaponschematic": { "localized": _(u"Weapon Schematic"), "category": "item", "raw": "Weapon Schematic", "grade":0}, + "inertiacanister": { "localized": _(u"Inertia Canister"), "category": "item", "raw": "Inertia Canister", "grade":0}, + "surveillanceequipment": { "localized": _(u"Surveillance Equipment"), "category": "item", "raw": "Surveillance Equipment", "grade":0}, + "deepmantlesample": { "localized": _(u"Deep Mantle Sample"), "category": "item", "raw": "Deep Mantle Sample", "grade":0}, + "microbialinhibitor": { "localized": _(u"Microbial Inhibitor"), "category": "item", "raw": "Microbial Inhibitor", "grade":0}, + "castfossil": { "localized": _(u"Cast Fossil"), "category": "item", "raw": "Cast Fossil", "grade":0}, + "petrifiedfossil": { "localized": _(u"Petrified Fossil"), "category": "item", "raw": "Petrified Fossil", "grade":0}, + "agriculturalprocesssample": { "localized": _(u"Agricultural Process Sample"), "category": "item", "raw": "Agricultural Process Sample", "grade":0}, + "chemicalprocesssample": { "localized": _(u"Chemical Process Sample"), "category": "item", "raw": "Chemical Process Sample", "grade":0}, + "refinementprocesssample": { "localized": _(u"Refinement Process Sample"), "category": "item", "raw": "Refinement Process Sample", "grade":0}, + "microsupercapacitor": { "localized": _(u"Micro Supercapacitor"), "category": "component", "raw": "Micro Supercapacitor", "grade":0}, + "microtransformer": { "localized": _(u"Micro Transformer"), "category": "component", "raw": "Micro Transformer", "grade":0}, + "chemicalsuperbase": { "localized": _(u"Chemical Superbase"), "category": "component", "raw": "Chemical Superbase", "grade":0}, + "circuitswitch": { "localized": _(u"Circuit Switch"), "category": "component", "raw": "Circuit Switch", "grade":0}, + "electricalwiring": { "localized": _(u"Electrical Wiring"), "category": "component", "raw": "Electrical Wiring", "grade":0}, + "encryptedmemorychip": { "localized": _(u"Encrypted Memory Chip"), "category": "component", "raw": "Encrypted Memory Chip", "grade":0}, + "epoxyadhesive": { "localized": _(u"Epoxy Adhesive"), "category": "component", "raw": "Epoxy Adhesive", "grade":0}, + "memorychip": { "localized": _(u"Memory Chip"), "category": "component", "raw": "Memory Chip", "grade":0}, + "microhydraulics": { "localized": _(u"Micro Hydraulics"), "category": "component", "raw": "Micro Hydraulics", "grade":0}, + "opticalfibre": { "localized": _(u"Optical Fibre"), "category": "component", "raw": "Optical Fibre", "grade":0}, + "titaniumplating": { "localized": _(u"Titanium Plating"), "category": "component", "raw": "Titanium Plating", "grade":0}, + "phneutraliser": { "localized": _(u"pH Neutraliser"), "category": "component", "raw": "pH Neutraliser", "grade":0}, + "metalcoil": { "localized": _(u"Metal Coil"), "category": "component", "raw": "Metal Coil", "grade":0}, + "viscoelasticpolymer": { "localized": _(u"Viscoelastic Polymer"), "category": "component", "raw": "Viscoelastic Polymer", "grade":0}, + "ionbattery": { "localized": _(u"Ion Battery"), "category": "component", "raw": "Ion Battery", "grade":0}, + "chemicalcatalyst": { "localized": _(u"Chemical Catalyst"), "category": "component", "raw": "Chemical Catalyst", "grade":0}, + "electricalfuse": { "localized": _(u"Electrical Fuse"), "category": "component", "raw": "Electrical Fuse", "grade":0}, + "opticallens": { "localized": _(u"Optical Lens"), "category": "component", "raw": "Optical Lens", "grade":0}, + "weaponcomponent": { "localized": _(u"Weapon Component"), "category": "component", "raw": "Weapon Component", "grade":0}, + "carbonfibreplating": { "localized": _(u"Carbon Fibre Plating"), "category": "component", "raw": "Carbon Fibre Plating", "grade":0}, + "microthrusters": { "localized": _(u"Micro Thrusters"), "category": "component", "raw": "Micro Thrusters", "grade":0}, + "oxygenicbacteria": { "localized": _(u"Oxygenic Bacteria"), "category": "component", "raw": "Oxygenic Bacteria", "grade":0}, + "circuitboard": { "localized": _(u"Circuit Board"), "category": "component", "raw": "Circuit Board", "grade":0}, + "tungstencarbide": { "localized": _(u"Tungsten Carbide"), "category": "component", "raw": "Tungsten Carbide", "grade":0}, + "ballisticsdata": { "localized": _(u"Ballistics Data"), "category": "data", "raw": "Ballistics Data", "grade":0}, + "politicalaffiliations": { "localized": _(u"Political Affiliations"), "category": "data", "raw": "Political Affiliations", "grade":0}, + "conflicthistory": { "localized": _(u"Conflict History"), "category": "data", "raw": "Conflict History", "grade":0}, + "riskassessments": { "localized": _(u"Risk Assessments"), "category": "data", "raw": "Risk Assessments", "grade":0}, + "stellaractivitylogs": { "localized": _(u"Stellar Activity Logs"), "category": "data", "raw": "Stellar Activity Logs", "grade":0}, + "manufacturinginstructions": { "localized": _(u"Manufacturing Instructions"), "category": "data", "raw": "Manufacturing Instructions", "grade":0}, + "digitaldesigns": { "localized": _(u"Digital Designs"), "category": "data", "raw": "Digital Designs", "grade":0}, + "medicalrecords": { "localized": _(u"Medical Records"), "category": "data", "raw": "Medical Records", "grade":0}, + "employmenthistory": { "localized": _(u"Employment History"), "category": "data", "raw": "Employment History", "grade":0}, + "vipsecuritydetail": { "localized": _(u"VIP Security Detail"), "category": "data", "raw": "VIP Security Detail", "grade":0}, + "classicentertainment": { "localized": _(u"Classic Entertainment"), "category": "data", "raw": "Classic Entertainment", "grade":0}, + "photoalbums": { "localized": _(u"Photo Albums"), "category": "data", "raw": "Photo Albums", "grade":0}, + "biometricdata": { "localized": _(u"Biometric Data"), "category": "data", "raw": "Biometric Data", "grade":0}, + "extractionyielddata": { "localized": _(u"Extraction Yield Data"), "category": "data", "raw": "Extraction Yield Data", "grade":0}, + "securityexpenses": { "localized": _(u"Security Expenses"), "category": "data", "raw": "Security Expenses", "grade":0}, + "culinaryrecipes": { "localized": _(u"Culinary Recipes"), "category": "data", "raw": "Culinary Recipes", "grade":0}, + "fleetregistry": { "localized": _(u"Fleet Registry"), "category": "data", "raw": "Fleet Registry", "grade":0}, + "influenceprojections": { "localized": _(u"Influence Projections"), "category": "data", "raw": "Influence Projections", "grade":0}, + "cocktailrecipes": { "localized": _(u"Cocktail Recipes"), "category": "data", "raw": "Cocktail Recipes", "grade":0}, + "employeeexpenses": { "localized": _(u"Employee Expenses"), "category": "data", "raw": "Employee Expenses", "grade":0}, + "interviewrecordings": { "localized": _(u"Interview Recordings"), "category": "data", "raw": "Interview Recordings", "grade":0}, + "recyclinglogs": { "localized": _(u"Recycling Logs"), "category": "data", "raw": "Recycling Logs", "grade":0}, + "jobapplications": { "localized": _(u"Job Applications"), "category": "data", "raw": "Job Applications", "grade":0}, + "californium": { "localized": _(u"Californium"), "category": "item", "raw": "Californium", "grade":0}, + "pyrolyticcatalyst": { "localized": _(u"Pyrolytic catalyst"), "category": "item", "raw": "Pyrolytic catalyst", "grade":0}, + "spyware": { "localized": _(u"Spyware"), "category": "data", "raw": "Spyware", "grade":0}, + "tacticalplans": { "localized": _(u"Tactical Plans"), "category": "data", "raw": "Tactical plans", "grade":0}, + "virus": { "localized": _(u"Virus"), "category": "data", "raw": "Virus", "grade":0}, + "aerogel": { "localized": _(u"Aerogel"), "category": "component", "raw": "Aerogel", "grade":0}, + "geneticrepairmeds": { "localized": _(u"Genetic Repair Meds"), "category": "item", "raw": "Genetic Repair Meds", "grade":0}, + "cropyieldanalysis": { "localized": _(u"Crop Yield Analysis"), "category": "data", "raw": "Crop Yield Analysis", "grade":0}, + "kompromat": { "localized": _(u"Kompromat"), "category": "data", "raw": "Kompromat", "grade":0}, + "xenodefenceprotocols": { "localized": _(u"Xeno Defence Protocols"), "category": "data", "raw": "Xeno Defence Protocols", "grade":0}, + "geologicaldata": { "localized": _(u"Geological Data"), "category": "data", "raw": "Geological Data", "grade":0}, + "opinionpolls": { "localized": _(u"Opinion Polls"), "category": "data", "raw": "Opinion Polls", "grade":0}, + "propaganda": { "localized": _(u"Propaganda"), "category": "data", "raw": "Propaganda", "grade":0}, + "hydroponicdata": { "localized": _(u"Hydroponic Data"), "category": "data", "raw": "Hydroponic Data", "grade":0}, + "mininganalytics" :{ "localized": _(u"Mining Analytics"), "raw": "Mining Analytics", "category": "data", "grade": 0}, + "compressionliquefiedgas" :{ "localized": _(u"Compression Liquefied Gas"), "raw": "Compression Liquefied Gas", "category": "item", "grade": 0}, + "weapontestdata" :{ "localized": _(u"Weapon Test Data"), "raw": "Weapon Test Data", "category": "data", "grade": 0}, + "spectralanalysisdata" :{ "localized": _(u"Spectral Analysis Data"), "raw": "Spectral Analysis Data", "category": "data", "grade": 0}, + "audiologs" :{ "localized": _(u"Audiologs"), "raw": "Audiologs", "category": "data", "grade": 0}, + "geneticresearch" :{ "localized": _(u"Genetic Research"), "raw": "Genetic Research", "category": "data", "grade": 0}, + "clinicaltrialrecords" :{ "localized": _(u"Clinical Trial Records"), "raw": "Clinical Trial Records", "category": "data", "grade": 0}, + "gmeds" :{ "localized": _(u"G-Meds"), "raw": "G-Meds", "category": "data", "grade": 0}, + "genesequencingdata" :{ "localized": _(u"Gene Sequencing Data"), "raw": "Gene Sequencing Data", "category": "data", "grade": 0}, + "settlementassaultplans" :{ "localized": _(u"Settlement Assault Plans"), "raw": "Settlement Assault Plans", "category": "data", "grade": 0}, + "biologicalsample" :{ "localized": _(u"Biological Sample"), "raw": "Biological Sample", "category": "data", "grade": 0}, + "smearcampaignplans" :{ "localized": _(u"Smear Campaign Plans"), "raw": "Smear Campaign Plans", "category": "data", "grade": 0}, + "axcombatlogs" :{ "localized": _(u"Ax Combat Logs"), "raw": "Ax Combat Logs", "category": "data", "grade": 0}, + "biologicalweapondata" :{ "localized": _(u"Biological Weapon Data"), "raw": "Biological Weapon Data", "category": "data", "grade": 0}, + "chemicalweapondata" :{ "localized": _(u"Chemical Weapon Data"), "raw": "Chemical Weapon Data", "category": "data", "grade": 0}, + "criminalrecords" :{ "localized": _(u"Criminal Records"), "raw": "Criminal Records", "category": "data", "grade": 0}, + "enhancedinterrogationrecordings" :{ "localized": _(u"Enhanced Interrogation Recordings"), "raw": "Enhanced Interrogation Recordings", "category": "data", "grade": 0}, + "espionagematerial" :{ "localized": _(u"Espionage Material"), "raw": "Espionage Material", "category": "data", "grade": 0}, + "incidentlogs" :{ "localized": _(u"Incident Logs"), "raw": "Incident Logs", "category": "data", "grade": 0}, + "inorganiccontaminant" :{ "localized": _(u"Inorganic Contaminant"), "raw": "Inorganic Contaminant", "category": "item", "grade": 0}, + "interrogationrecordings" :{ "localized": _(u"Interrogation Recordings"), "raw": "Interrogation Recordings", "category": "data", "grade": 0}, + "mutageniccatalyst" :{ "localized": _(u"Mutagenic Catalyst"), "raw": "Mutagenic Catalyst", "category": "item", "grade": 0}, + "networksecurityprotocols" :{ "localized": _(u"Network Security Protocols"), "raw": "Network Security Protocols", "category": "data", "grade": 0}, + "patienthistory" :{ "localized": _(u"Patient History"), "raw": "Patient History", "category": "data", "grade": 0}, + "plantgrowthcharts" :{ "localized": _(u"Plant Growth Charts"), "raw": "Plant Growth Charts", "category": "data", "grade": 0}, + "prisonerlogs" :{ "localized": _(u"Prisoner Logs"), "raw": "Prisoner Logs", "category": "data", "grade": 0}, + "seedgeneaology" :{ "localized": _(u"Seed Geneaology"), "raw": "Seed Geneaology", "category": "data", "grade": 0}, + "slushfundlogs" :{ "localized": _(u"Slush Fund Logs"), "raw": "Slush Fund Logs", "category": "data", "grade": 0}, + "syntheticgenome" :{ "localized": _(u"Synthetic Genome"), "raw": "Synthetic Genome", "category": "item", "grade": 0}, + "epinephrine" :{ "localized": _(u"Epinephrine"), "raw": "Epinephrine", "category": "component", "grade": 0}, + "graphene" :{ "localized": _(u"Graphene"), "raw": "Graphene", "category": "component", "grade": 0}, + "rdx" :{ "localized": _(u"Rdx"), "raw": "Rdx", "category": "component", "grade": 0}, + "electromagnet" :{ "localized": _(u"Electromagnet"), "raw": "Electromagnet", "category": "component", "grade": 0}, + "microelectrode" :{ "localized": _(u"Microelectrode"), "raw": "Microelectrode", "category": "component", "grade": 0}, + "motor" :{ "localized": _(u"Motor"), "raw": "Motor", "category": "component", "grade": 0}, + "scrambler" :{ "localized": _(u"Scrambler"), "raw": "Scrambler", "category": "component", "grade": 0}, + "transmitter" :{ "localized": _(u"Transmitter"), "raw": "Transmitter", "category": "component", "grade": 0}, } INTERNAL_NAMES_LUT = { u'classified scan databanks': 'scandatabanks', u'conductive components': 'conductivecomponents', u'abnormal compact emissions data': 'compactemissionsdata', u'germanium': 'germanium', @@ -197,39 +403,133 @@ def __init__(self): self.manufactured = pickle.load(handle) except: self.manufactured = {} + + try: + with open(self.EDR_INVENTORY_COMPONENT_CACHE, 'rb') as handle: + self.components = pickle.load(handle) + except: + self.components = {} + + try: + with open(self.EDR_INVENTORY_ITEM_CACHE, 'rb') as handle: + self.items = pickle.load(handle) + except: + self.items = {} + + try: + with open(self.EDR_INVENTORY_CONSUMABLE_CACHE, 'rb') as handle: + self.consumables = pickle.load(handle) + except: + self.consumables = {} + + try: + with open(self.EDR_INVENTORY_DATA_CACHE, 'rb') as handle: + self.data = pickle.load(handle) + except: + self.data = {} + + try: + with open(self.EDR_INVENTORY_BACKPACK_CACHE, 'rb') as handle: + self.backpack = pickle.load(handle) + except: + self.backpack = {} self.__check() def initialize(self, materials): + if "Encoded" in materials: + self.encoded = {} for thing in materials.get("Encoded", []): cname = self.__c_name(thing["Name"]) self.encoded[cname] = thing["Count"] + if "Raw" in materials: + self.raw = {} for thing in materials.get("Raw", []): cname = self.__c_name(thing["Name"]) self.raw[cname] = thing["Count"] + if "Manufactured" in materials: + self.manufactured = {} for thing in materials.get("Manufactured", []): cname = self.__c_name(thing["Name"]) self.manufactured[cname] = thing["Count"] + + if "Items" in materials: + self.items = {} + for thing in materials.get("Items", []): + cname = self.__c_name(thing["Name"]) + self.items[cname] = thing["Count"] + + if "Components" in materials: + self.components = {} + for thing in materials.get("Components", []): + cname = self.__c_name(thing["Name"]) + self.components[cname] = thing["Count"] + + if "Data" in materials: + self.data = {} + for thing in materials.get("Data", []): + cname = self.__c_name(thing["Name"]) + self.data[cname] = thing["Count"] + + if "Consumables" in materials: + self.consumables = {} + for thing in materials.get("Consumables", []): + cname = self.__c_name(thing["Name"]) + self.consumables[cname] = thing["Count"] + self.initialized = True self.inconsistencies = False def initialize_with_edmc(self, state): + self.encoded = {} if "Encoded" in state else self.encoded for thing in state.get("Encoded", {}): cname = self.__c_name(thing) self.encoded[cname] = state["Encoded"][thing] + self.raw = {} if "Raw" in state else self.raw for thing in state.get("Raw", {}): cname = self.__c_name(thing) self.raw[cname] = state["Raw"][thing] + self.manufactured = {} if "Manufactured" in state else self.manufactured for thing in state.get("Manufactured", {}): cname = self.__c_name(thing) self.manufactured[cname] = state["Manufactured"][thing] + + self.components = {} if "Component" in state else self.components + for thing in state.get("Component", {}): + cname = self.__c_name(thing) + self.components[cname] = state["Component"][thing] + + self.items = {} if "Item" in state else self.items + for thing in state.get("Item", {}): + cname = self.__c_name(thing) + self.items[cname] = state["Item"][thing] + + self.consumables = {} if "Consumable" in state else self.consumables + for thing in state.get("Consumable", {}): + cname = self.__c_name(thing) + self.consumables[cname] = state["Consumable"][thing] + + self.data = {} if "Data" in state else self.data + for thing in state.get("Data", {}): + cname = self.__c_name(thing) + self.data[cname] = state["Data"][thing] + + backpack = {} if "BackPack" in state else self.backpack + for category in backpack: + ccategory = category.lower() + self.backpack[ccategory] = {} + for thing in backpack[category]: + cname = self.__c_name(thing) + self.backpack[ccategory][cname] = backpack[category][thing] + self.initialized = True self.inconsistencies = False def stale_or_incorrect(self): + self.__check() return not self.initialized or self.inconsistencies def persist(self): @@ -242,13 +542,81 @@ def persist(self): with open(self.EDR_INVENTORY_RAW_CACHE, 'wb') as handle: pickle.dump(self.raw, handle, protocol=pickle.HIGHEST_PROTOCOL) + with open(self.EDR_INVENTORY_CONSUMABLE_CACHE, 'wb') as handle: + pickle.dump(self.consumables, handle, protocol=pickle.HIGHEST_PROTOCOL) + + with open(self.EDR_INVENTORY_ITEM_CACHE, 'wb') as handle: + pickle.dump(self.items, handle, protocol=pickle.HIGHEST_PROTOCOL) + + with open(self.EDR_INVENTORY_DATA_CACHE, 'wb') as handle: + pickle.dump(self.data, handle, protocol=pickle.HIGHEST_PROTOCOL) + + with open(self.EDR_INVENTORY_COMPONENT_CACHE, 'wb') as handle: + pickle.dump(self.components, handle, protocol=pickle.HIGHEST_PROTOCOL) + + with open(self.EDR_INVENTORY_BACKPACK_CACHE, 'wb') as handle: + pickle.dump(self.backpack, handle, protocol=pickle.HIGHEST_PROTOCOL) + + def all_in_locker(self): + return {**self.items, **self.consumables, **self.data, **self.components} + + def all_in_backpack(self): + return {**self.backpack.get("item",{}), **self.backpack.get("consumable",{}), **self.backpack.get("data",{}), **self.backpack.get("component",{})} + + def bought(self, info): + self.add(info["Category"], info["Name"], info["Count"]) + + def sold(self, info): + if "MicroResources" not in info: + self.substract(info["Category"], info["Name"], info["Count"]) + return + + for resource in info["MicroResources"]: + self.substract(resource["Category"], resource["Name"], resource["Count"]) + + def transferred(self, info): + if "Transfers" not in info: + return + + for transfer in info["Transfers"]: + self.set(transfer["Category"], transfer["Name"], transfer.get("NewCount", transfer.get("Count", 0))) + self.adjust_backpack(transfer["Category"], transfer["Name"], transfer.get("OldCount", 0) - transfer.get("NewCount", 0)) + + def backpack_change(self, info): + if "Added" in info: + for addition in info["Added"]: + self.adjust_backpack(addition["Type"], addition["Name"], addition.get("Count", 0)) + + if "Removed" in info: + for removal in info["Removed"]: + self.adjust_backpack(removal["Type"], removal["Name"], -removal.get("Count", 0)) + + + def traded(self, info): + if "Offered" not in info: + return + + for offer in info["Offered"]: + self.substract(offer["Category"], offer["Name"], offer["Count"]) + + self.add(info["Category"], info["Received"], info["Count"]) + def collected(self, info): self.add(info["Category"], info["Name"], info["Count"]) def discarded(self, info): self.substract(info["Category"], info["Name"], info["Count"]) - def count(self, name): + + def count(self, name, from_backpack=True, from_locker=True): + total = 0 + if from_backpack: + total += self.count_backpack(name) + if from_locker: + total += self.count_locker(name) + return total + + def count_locker(self, name): cname = self.__c_name(name) category = self.category(cname) if category == "encoded": @@ -257,18 +625,44 @@ def count(self, name): return self.raw.get(cname, 0) elif category == "manufactured": return self.manufactured.get(cname, 0) + elif category == "item": + return self.items.get(cname, 0) + elif category == "component": + return self.components.get(cname, 0) + elif category == "data": + return self.data.get(cname, 0) + elif category == "consumables": + return self.consumables.get(cname, 0) return 0 - def oneliner(self, name): + def count_backpack(self, name): + cname = self.__c_name(name) + category = self.category(cname) + if category not in self.backpack: + return 0 + return self.backpack[category].get(cname, 0) + + def oneliner(self, name, from_backpack=False): cname = self.__c_name(name) category = self.category(cname) entry = self.MATERIALS_LUT.get(cname, None) if not category or not entry: return name - count = self.count(cname) - grades = [u"?", u"Ⅰ", u"Ⅱ", u"Ⅲ", u"Ⅳ", u"Ⅴ"] - slots = [u"?", u"300", u"250", u"200", u"150", u"100"] - return u"{} (Grade {}; {}/{})".format(_(entry["raw"]), grades[entry["grade"]], count, slots[entry["grade"]]) + total_count = self.count(name) + count = total_count + if from_backpack: + count = self.count_backpack(name) + + if category in ["encoded", "raw", "manufactured"]: + grades = [u"?", u"Ⅰ", u"Ⅱ", u"Ⅲ", u"Ⅳ", u"Ⅴ"] + slots = [u"?", u"300", u"250", u"200", u"150", u"100"] + return u"{} (Grade {}; {}/{})".format(_(entry["raw"]), grades[entry["grade"]], total_count, slots[entry["grade"]]) + + shorthands = {"data": _("DAT"), "component": _("ASS"), "item": _("GDS"), "consumable": _("CNS") } + if from_backpack: + return u"{} ({}:{}/{})".format(_(entry["raw"]), shorthands.get(category, category[0:min(3,len(category))]), count, total_count) + return u"{} ({}:{})".format(_(entry["raw"]), shorthands.get(category, category[0:min(3,len(category))]), total_count) + def __check(self): self.inconsistencies = False @@ -277,7 +671,20 @@ def __check(self): self.__check_item(thing) if self.inconsistencies: return False - return True + + for collection in [self.items, self.data, self.components]: + tally = 0 + for thing in collection: + count = self.count(thing) + if count < 0: + self.inconsistencies = True + break + tally += count + if tally > 1000: + self.inconsistencies = True + break + + return self.inconsistencies def __check_item(self, name): cname = self.__c_name(name) @@ -288,10 +695,12 @@ def __check_item(self, name): if count < 0: self.inconsistencies = True return False - max_for_slot = self.slots(name) - if count > max_for_slot: - self.inconsistencies = True - return False + + if self.category(name) in ["raw", "manufactured", "encoded"]: + max_for_slot = self.slots(name) + if count > max_for_slot: + self.inconsistencies = True + return False return True def donated_engineer(self, info): @@ -332,6 +741,14 @@ def add(self, category, name, count): self.raw[cname] = min(self.raw.get(cname, 0) + count, self.slots(name)) elif ccategory == "manufactured": self.manufactured[cname] = min(self.manufactured.get(cname, 0) + count, self.slots(name)) + elif ccategory == "data": + self.data[cname] = min(self.data.get(cname, 0) + count, 1000) + elif ccategory == "item": + self.items[cname] = min(self.items.get(cname, 0) + count, 1000) + elif ccategory == "component": + self.components[cname] = min(self.components.get(cname, 0) + count, 1000) + elif ccategory == "consumable": + self.consumables[cname] = min(self.consumables.get(cname, 0) + count, 1000) def slots(self, name): cname = self.__c_name(name) @@ -345,17 +762,112 @@ def substract(self, category, name, count): ccategory = self.__c_cat(category) cname = self.__c_name(name) if ccategory == "encoded": - self.encoded[cname] = max(self.encoded.get(cname, 0) - count, 0) + newcount = max(self.encoded.get(cname, 0) - count, 0) + if newcount > 0: + self.encoded[cname] = newcount + else: + self.encoded.pop(cname, None) elif ccategory == "raw": - self.raw[cname] = max(self.raw.get(cname, 0) - count, 0) + newcount = max(self.raw.get(cname, 0) - count, 0) + if newcount > 0: + self.raw[cname] = newcount + else: + self.raw.pop(cname, None) elif ccategory == "manufactured": - self.manufactured[cname] = max(self.manufactured.get(cname, 0) - count, 0) + newcount = max(self.manufactured.get(cname, 0) - count, 0) + if newcount > 0: + self.manufactured[cname] = newcount + else: + self.manufactured.pop(cname, None) + elif ccategory == "data": + newcount = max(self.data.get(cname, 0) - count, 0) + if newcount > 0: + self.data[cname] = newcount + else: + self.data.pop(cname, None) + elif ccategory == "item": + newcount = max(self.items.get(cname, 0) - count, 0) + if newcount > 0: + self.items[cname] = newcount + else: + self.items.pop(cname, None) + elif ccategory == "component": + newcount = max(self.components.get(cname, 0) - count, 0) + if newcount > 0: + self.components[cname] = newcount + else: + self.components.pop(cname, None) + elif ccategory == "consumable": + newcount = max(self.consumables.get(cname, 0) - count, 0) + if newcount > 0: + self.consumables[cname] = newcount + else: + self.consumables.pop(cname, None) + + + def set(self, category, name, newcount): + ccategory = self.__c_cat(category) + cname = self.__c_name(name) + if newcount == 0: + self.remove(category, name) + return + + if ccategory == "encoded": + self.encoded[cname] = newcount + elif ccategory == "raw": + self.raw[cname] = newcount + elif ccategory == "manufactured": + self.manufactured[cname] = newcount + elif ccategory == "data": + self.data[cname] = newcount + elif ccategory == "item": + self.items[cname] = newcount + elif ccategory == "component": + self.components[cname] = newcount + elif ccategory == "consumable": + self.consumables[cname] = newcount + + def remove(self, category, name): + ccategory = self.__c_cat(category) + cname = self.__c_name(name) + + if ccategory == "encoded": + self.encoded.pop(cname, None) + elif ccategory == "raw": + self.raw.pop(cname, None) + elif ccategory == "manufactured": + self.manufactured.pop(cname, None) + elif ccategory == "data": + self.data.pop(cname, None) + elif ccategory == "item": + self.items.pop(cname, None) + elif ccategory == "component": + self.components.pop(cname, None) + elif ccategory == "consumable": + self.consumables.pop(cname, None) + + def adjust_backpack(self, category, name, count): + ccategory = category.lower() + if ccategory not in self.backpack: + self.backpack[ccategory] = {} + newcount = max(self.backpack[ccategory].get(name, 0) + count, 0) + if newcount > 0: + self.backpack[ccategory][name] = newcount + else: + self.backpack[ccategory].pop(name, None) def category(self, name): cname = self.__c_name(name) entry = self.MATERIALS_LUT.get(cname, None) return entry["category"] if entry else None + @staticmethod + def readable(name): + cname = name.lower() + if cname in EDRInventory.MATERIALS_LUT: + return EDRInventory.MATERIALS_LUT[cname].get("localized", name) + return name + def __c_cat(self, category): ccat = category.lower() if ccat.endswith(u";"): diff --git a/edr/edrsystems.py b/edr/edrsystems.py index 5bc4140c..a7084242 100644 --- a/edr/edrsystems.py +++ b/edr/edrsystems.py @@ -917,9 +917,6 @@ def closest_destination(self, sysAndSta1, sysAndSta2, override_sc_distance = Non sc_distance = override_sc_distance or self.reasonable_sc_distance - print(sysAndSta1) - print(sysAndSta2) - print(sc_distance) if sysAndSta1['station']['distanceToArrival'] > sc_distance and sysAndSta2['station']['distanceToArrival'] > sc_distance: if abs(sysAndSta1['distance'] - sysAndSta2['distance']) < 5: return sysAndSta1 if sysAndSta1['station']['distanceToArrival'] < sysAndSta2['station']['distanceToArrival'] else sysAndSta2 diff --git a/edr/l10n/fr/edr.po b/edr/l10n/fr/edr.po index 634cc275..44712872 100644 --- a/edr/l10n/fr/edr.po +++ b/edr/l10n/fr/edr.po @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: EDR\n" -"POT-Creation-Date: 2021-07-07 13:48+0900\n" -"PO-Revision-Date: 2021-07-07 13:48+0900\n" +"POT-Creation-Date: 2021-07-24 10:19+0900\n" +"PO-Revision-Date: 2021-07-24 10:20+0900\n" "Last-Translator: \n" "Language-Team: Alpha\n" "Language: fr_FR\n" @@ -18,52 +18,52 @@ msgstr "" "X-Poedit-SearchPath-0: l10n\n" "X-Poedit-SearchPath-1: .\n" -#: edentities.py:202 +#: edentities.py:203 msgid "N/A" msgstr "N/A" #. Translators: this is a short representation for a bounty >= 10 000 000 000 credits (b stands for billion) -#: edentities.py:205 edrsystems.py:639 +#: edentities.py:206 edrsystems.py:639 msgid "{} b" msgstr "{} mm" #. Translators: this is a short representation for a bounty >= 1 000 000 000 credits (b stands for billion) -#: edentities.py:208 edrsystems.py:642 +#: edentities.py:209 edrsystems.py:642 msgid "{:.1f} b" msgstr "{:.1f} mm" #. Translators: this is a short representation for a bounty >= 10 000 000 credits (m stands for million) -#: edentities.py:211 edrsystems.py:645 +#: edentities.py:212 edrsystems.py:645 msgid "{} m" msgstr "{} m" #. Translators: this is a short representation for a bounty >= 1 000 000 credits (m stands for million) -#: edentities.py:214 edrsystems.py:648 +#: edentities.py:215 edrsystems.py:648 msgid "{:.1f} m" msgstr "{:.1f} m" #. Translators: this is a short representation for a bounty >= 10 000 credits (k stands for kilo, i.e. thousand) -#: edentities.py:217 edrsystems.py:651 +#: edentities.py:218 edrsystems.py:651 msgid "{} k" msgstr "{} k" #. Translators: this is a short representation for a bounty >= 1000 credits (k stands for kilo, i.e. thousand) -#: edentities.py:220 edrsystems.py:654 +#: edentities.py:221 edrsystems.py:654 msgid "{:.1f} k" msgstr "{:.1f} k" #. Translators: this is a short representation for a bounty < 1000 credits (i.e. shows the whole bounty, unabbreviated) -#: edentities.py:223 edrsystems.py:657 +#: edentities.py:224 edrsystems.py:657 msgid "{}" msgstr "{}" #. Translators: this is used when a location, comprised of a system and a place (e.g. Alpha Centauri & Hutton Orbital), has no place specified -#: edentities.py:336 +#: edentities.py:337 msgid "For an unknown or missing place|Unknown" msgstr "Indéterminé" #. Translators: this is used when a location, comprised of a system and a body (e.g. Alpha Centauri & 3 A), has no body specified -#: edentities.py:348 +#: edentities.py:349 msgid "For an unknown or missing body|Unknown" msgstr "Indéterminé" @@ -84,12 +84,12 @@ msgstr "Toujours" #: edrclient.py:102 edrclient.py:107 edrclient.py:216 edrclient.py:220 #: edrclient.py:327 edrclient.py:337 edrclient.py:447 edrclient.py:453 -#: edrclient.py:1420 edrclient.py:1441 +#: edrclient.py:1465 edrclient.py:1486 msgid "Never" msgstr "Jamais" #: edrclient.py:109 edrclient.py:111 edrclient.py:221 edrclient.py:339 -#: edrclient.py:340 edrclient.py:453 edrclient.py:1427 +#: edrclient.py:340 edrclient.py:453 edrclient.py:1472 msgid "Public" msgstr "Publique" @@ -389,209 +389,254 @@ msgstr "Yo , mon gros, j'évalue pas '{}'" msgid "Try {} instead." msgstr "Essaie ça plutôt: {}." -#: edrclient.py:789 edrclient.py:793 edrclient.py:799 +#: edrclient.py:796 +msgid "Loadout information is stale" +msgstr "Les informations ne sont pas à jour" + +#: edrclient.py:796 +msgid "Congrats, you've found a bug in Elite!" +msgstr "Félicitations! Vous avez trouvé un bug dans Elite!" + +#: edrclient.py:796 +msgid "The modules info isn't updated right away :(" +msgstr "Les informations de vos modules ne sont pas mises à jour de suite :(" + +#: edrclient.py:796 +msgid "Try again after moving around or relog and check your modules." +msgstr "" +"Essayez plus tard après avoir bougé ou reloguez et regardez vos modules." + +#: edrclient.py:801 edrclient.py:805 edrclient.py:811 msgid "Basic Power Assessment" msgstr "Evaluation de base sur la puissance" -#: edrclient.py:789 +#: edrclient.py:801 msgid "Yo dawg, U sure that you got modules on this?" msgstr "Yo, gros, t'es sure que t'as des modules dans ton zinc?" -#: edrclient.py:793 +#: edrclient.py:805 msgid "Yo dawg, the info I got from FDev might be stale." msgstr "Yo, mon gars, les infos que j'ai eu de Fdev sont trop old school." -#: edrclient.py:793 +#: edrclient.py:805 msgid "Try again later after a bunch of random actions." msgstr "Essaie encore après d'autres actions." -#: edrclient.py:793 +#: edrclient.py:805 msgid "Or try this: relog, look at your modules, try again." msgstr "Ou alors, essaie après un relogage et un coup d'oeil aux modules." -#: edrclient.py:799 +#: edrclient.py:811 msgid "Yo dawg, sorry but I can't help with dat." msgstr "Yo, mon p'tit gars, j'peux pas t'aider avec ça." -#: edrclient.py:805 +#: edrclient.py:817 msgid "⚡: {}" msgstr "" -#: edrclient.py:806 +#: edrclient.py:818 msgid "{}: {}\t{}" msgstr "" -#: edrclient.py:807 +#: edrclient.py:819 msgid " ⚑: {}" msgstr "" -#: edrclient.py:808 +#: edrclient.py:820 msgid " ✓: {}" msgstr "" -#: edrclient.py:809 edrresourcefinder.py:735 +#: edrclient.py:821 edrresourcefinder.py:735 msgid "{}{}" msgstr "" -#: edrclient.py:810 +#: edrclient.py:822 msgid "Basic Power Assessment (β; oddities? relog, look at your modules)" msgstr "" "Evaluation Basique de Puissance (β; bizarreries? relogue et regarde tes " "modules)" -#: edrclient.py:932 +#: edrclient.py:831 edrclient.py:833 +msgid "Backpack assessment" +msgstr "Evaluation du sac-à-dos" + +#: edrclient.py:831 edrclient.py:842 +msgid "Nothing superfluous" +msgstr "" + +#: edrclient.py:833 +msgid "Empty backpack?" +msgstr "" + +#: edrclient.py:840 edrclient.py:842 edrclient.py:844 +msgid "Storage assessment" +msgstr "Evaluation du stockage" + +#: edrclient.py:844 +msgid "Empty ship locker?" +msgstr "" + +#: edrclient.py:853 load.py:1392 +msgid "Useless: {}" +msgstr "" + +#: edrclient.py:855 load.py:1394 +msgid "Unnecessary: {}" +msgstr "" + +#: edrclient.py:977 msgid "{} alerts enabled" msgstr "Alertes {} activées" -#: edrclient.py:932 +#: edrclient.py:977 msgid "{} alerts disabled" msgstr "Alertes {} désactivées" -#: edrclient.py:934 edrclient.py:964 +#: edrclient.py:979 edrclient.py:1009 #, python-brace-format msgid " <={max_distance}ly" msgstr " <={max_distance}al" -#: edrclient.py:936 edrclient.py:966 +#: edrclient.py:981 edrclient.py:1011 #, python-brace-format msgid " >={min_bounty}cr" msgstr " >={min_bounty}cr" -#: edrclient.py:937 edrclient.py:967 edrclient.py:985 edrclient.py:998 -#: edrclient.py:1000 edrclient.py:1003 edrclient.py:1022 edrclient.py:1024 -#: edrclient.py:1044 +#: edrclient.py:982 edrclient.py:1012 edrclient.py:1030 edrclient.py:1043 +#: edrclient.py:1045 edrclient.py:1048 edrclient.py:1067 edrclient.py:1069 +#: edrclient.py:1089 msgid "EDR Alerts" msgstr "Alertes EDR" -#: edrclient.py:950 +#: edrclient.py:995 msgid "{} alerts already enabled" msgstr "alertes {} déjà activées" -#: edrclient.py:953 +#: edrclient.py:998 msgid "" "Request an EDR account to access enemy alerts (https://edrecon.com/account)" msgstr "" "Demandez un compte EDR afin d'accéder aux alertes d'ennemis (https://edrecon." "com/account)" -#: edrclient.py:955 +#: edrclient.py:1000 msgid "Pledge to a power to access enemy alerts" msgstr "Prêter allégeance à une puissance afin d'accéder aux alertes d'ennemis" -#: edrclient.py:957 +#: edrclient.py:1002 msgid "Remain loyal for at least {} days to access enemy alerts" msgstr "" "Vous devez avoir au moins {} jours de loyauté à votre puissance afin " "d'accéder aux alertes d'ennemis" -#: edrclient.py:959 +#: edrclient.py:1004 msgid "Enabling Enemy alerts" msgstr "Activation des alertes temps-réel" -#: edrclient.py:959 +#: edrclient.py:1004 msgid "Couldn't enable Enemy alerts" msgstr "Impossible d'activer les alerts temps-réel" -#: edrclient.py:961 +#: edrclient.py:1006 #, python-brace-format msgid "Enabling {kind} alerts" msgstr "Activation des alertes {kind}" -#: edrclient.py:961 +#: edrclient.py:1006 #, python-brace-format msgid "Couldn't enable {kind} alerts" msgstr "Impossible d'activer les alertes {kind}" -#: edrclient.py:981 +#: edrclient.py:1026 msgid "Disabling {} alerts" msgstr "Désactivation des alertes {}" -#: edrclient.py:983 +#: edrclient.py:1028 msgid "{} alerts already disabled" msgstr "alertes {} déjà désactivées" -#: edrclient.py:998 +#: edrclient.py:1043 #, python-brace-format msgid "minimum bounty set to {min_bounty} cr for {kind}" msgstr "prime minimale de {min_bounty} cr pour {kind}" -#: edrclient.py:1000 +#: edrclient.py:1045 msgid "invalid value for minimum bounty" msgstr "entrée invalide pour la prime minimale" -#: edrclient.py:1003 +#: edrclient.py:1048 msgid "no minimum bounty required" msgstr "aucune prime minimale requise" -#: edrclient.py:1022 +#: edrclient.py:1067 #, python-brace-format msgid "maximum distance set to {max_distance} ly for {kind}" msgstr "distance maximale de {max_distance} al pour {kind}" -#: edrclient.py:1024 +#: edrclient.py:1069 msgid "invalid value, removing maximal distance" msgstr "suppression de la distance maximale" -#: edrclient.py:1027 +#: edrclient.py:1072 msgid "Outlaws Alerts" msgstr "Alertes Bandits" -#: edrclient.py:1027 +#: edrclient.py:1072 msgid "no limits on distance" msgstr "sans distance maximale" -#: edrclient.py:1040 +#: edrclient.py:1085 msgid "Comms link interrupted. Send '?{} on' to re-establish." msgstr "Liaison interrompue. Envoyez '?{}' pour rétablir la liaison." -#: edrclient.py:1083 +#: edrclient.py:1128 #, python-brace-format msgid "{cmdr} ({ship}) sighted in {location}" msgstr "{cmdr} ({ship}) repéré à {location}" -#: edrclient.py:1085 +#: edrclient.py:1130 #, python-brace-format msgid "Enemy {cmdr} ({ship}) sighted in {location}" msgstr "Ennemi {cmdr} ({ship}) repéré à {location}" -#: edrclient.py:1087 +#: edrclient.py:1132 #, python-brace-format msgid "Outlaw {cmdr} ({ship}) sighted in {location}" msgstr "Bandit {cmdr} ({ship}) repéré à {location}" -#: edrclient.py:1091 +#: edrclient.py:1136 #, python-brace-format msgid " [{distance:.3g} ly]" msgstr " [{distance:.3g} al]" -#: edrclient.py:1091 +#: edrclient.py:1136 #, python-brace-format msgid " [{distance} ly]" msgstr " [{distance} al]" -#: edrclient.py:1094 +#: edrclient.py:1139 #, python-brace-format msgid " wanted for {bounty} cr" msgstr " recherché pour {bounty} cr" -#: edrclient.py:1096 +#: edrclient.py:1141 msgid " wanted somewhere" msgstr " recherché quelque part" -#: edrclient.py:1108 edrclient.py:1587 +#: edrclient.py:1153 edrclient.py:1632 msgid "got info about {}" msgstr "profile reçu pour {}" -#: edrclient.py:1114 edrclient.py:1117 edrclient.py:1233 edrclient.py:1588 -#: edrclient.py:1593 +#: edrclient.py:1159 edrclient.py:1162 edrclient.py:1278 edrclient.py:1633 +#: edrclient.py:1638 msgid "Intel about {}" msgstr "Renseignements sur {}" -#: edrclient.py:1117 +#: edrclient.py:1162 msgid "No info" msgstr "Aucune info" -#: edrclient.py:1130 edrresourcefinder.py:248 edrresourcefinder.py:256 +#: edrclient.py:1175 edrresourcefinder.py:248 edrresourcefinder.py:256 #: edrresourcefinder.py:266 edrresourcefinder.py:281 edrresourcefinder.py:290 #: edrresourcefinder.py:301 edrresourcefinder.py:309 edrresourcefinder.py:333 #: edrresourcefinder.py:356 edrresourcefinder.py:367 edrresourcefinder.py:413 @@ -601,7 +646,7 @@ msgstr "Aucune info" msgid "{distance:.3g}" msgstr "{distance:.3g}" -#: edrclient.py:1130 edrresourcefinder.py:248 edrresourcefinder.py:256 +#: edrclient.py:1175 edrresourcefinder.py:248 edrresourcefinder.py:256 #: edrresourcefinder.py:266 edrresourcefinder.py:281 edrresourcefinder.py:290 #: edrresourcefinder.py:301 edrresourcefinder.py:309 edrresourcefinder.py:333 #: edrresourcefinder.py:356 edrresourcefinder.py:367 edrresourcefinder.py:413 @@ -611,146 +656,146 @@ msgstr "{distance:.3g}" msgid "{distance}" msgstr "{distance}" -#: edrclient.py:1131 +#: edrclient.py:1176 #, python-brace-format msgid "{dist}ly from {from_sys} to {to_sys}" msgstr "{dist}al entre {from_sys} et {to_sys}" -#: edrclient.py:1135 +#: edrclient.py:1180 msgid "Taxi time ({}LY): {}" msgstr "Trajet en Taxi ({}LY): {}" -#: edrclient.py:1136 +#: edrclient.py:1181 msgid "Transfer time: {}" msgstr "Temps de transfert: {}" -#: edrclient.py:1137 +#: edrclient.py:1182 #, python-brace-format msgid "distance: {dist}ly" msgstr "distance: {dist}al" -#: edrclient.py:1139 +#: edrclient.py:1184 msgid "distance failed" msgstr "échec de la fonction 'distance'" -#: edrclient.py:1140 +#: edrclient.py:1185 msgid "Couldn't calculate a distance. Invalid or unknown system names?" msgstr "Impossible de calculer la distance. Systèmes inconnus ou non valides?" -#: edrclient.py:1151 +#: edrclient.py:1196 msgid "no cmdr id (contact)." msgstr "pas de cmdr id (contact)." #. Translators: this is shown via EDMC's EDR status line upon contact with a known outlaw -#: edrclient.py:1159 edrclient.py:1210 +#: edrclient.py:1204 edrclient.py:1255 msgid "{} is bad news." msgstr "{} est une mauvaise nouvelle." -#: edrclient.py:1164 edrclient.py:1223 +#: edrclient.py:1209 edrclient.py:1268 msgid "[Caution!] Intel about {}" msgstr "[Attention!] Renseignements sur {}" #. Translators: this is shown to users who don't yet have an EDR account -#: edrclient.py:1167 edrclient.py:1236 +#: edrclient.py:1212 edrclient.py:1281 msgid "You could have helped other EDR users by reporting this outlaw." msgstr "" "Vous auriez pu aider d'autres utilisateurs EDR en rapportant ce bandit." -#: edrclient.py:1169 +#: edrclient.py:1214 msgid "You could have helped other EDR users by reporting this enemy." msgstr "" "Vous auriez pu aider d'autres utilisateurs EDR en rapportant cet ennemi." -#: edrclient.py:1193 +#: edrclient.py:1238 msgid "failed to report scan." msgstr "scan non rapporté (échec)." -#: edrclient.py:1198 +#: edrclient.py:1243 msgid "cmdr unknown to EDR." msgstr "cmd inconnu des services EDR." -#: edrclient.py:1214 +#: edrclient.py:1259 msgid "PP Enemy (weapons free). " msgstr "Ennemi PP (feu à volonté). " -#: edrclient.py:1216 edrclient.py:1228 +#: edrclient.py:1261 edrclient.py:1273 msgid "Wanted for {} cr" msgstr "Recherché pour {} cr" -#: edrclient.py:1218 +#: edrclient.py:1263 msgid "Wanted somewhere. A Kill-Warrant-Scan will reveal their highest bounty." msgstr "Recherché par une autorité. Un scan révèlera la plus grosse prime." -#: edrclient.py:1225 +#: edrclient.py:1270 msgid "Intel for cmdr {}." msgstr "Renseignements sur {}." -#: edrclient.py:1230 +#: edrclient.py:1275 msgid "Wanted somewhere but it could be minor offenses." msgstr "Recherché par une autorité. Possibilité d'un délit mineur." #. Translators: this is shown to users who don't yet have an EDR account -#: edrclient.py:1239 +#: edrclient.py:1284 #, python-brace-format msgid "You could have helped other {power} pledges by reporting this enemy." msgstr "Vous auriez pu aider les alliés de {power} en rapportant cet ennemi." -#: edrclient.py:1243 +#: edrclient.py:1288 msgid "not novel enough (scan)." msgstr "situation pas assez nouvelle (scan)" -#: edrclient.py:1254 +#: edrclient.py:1299 msgid "Scan reporting disabled in solo/private modes." msgstr "Rapport de scan désactivé en mode Solo/Privé." -#: edrclient.py:1263 +#: edrclient.py:1308 msgid "scan reported for {}." msgstr "scan de {} rapport." -#: edrclient.py:1280 +#: edrclient.py:1325 msgid "not novel enough (traffic)." msgstr "situation pas assez nouvelle (trafic)" -#: edrclient.py:1292 +#: edrclient.py:1337 msgid "traffic reported." msgstr "trafic rapport." -#: edrclient.py:1308 edrclient.py:1340 +#: edrclient.py:1353 edrclient.py:1385 msgid "Crimes reporting is off (!crimes on to re-enable)" msgstr "Rapport de crimes désactivé (envoyez '!crimes on' pour activer)" -#: edrclient.py:1313 +#: edrclient.py:1358 msgid "Anarchy system (crimes not reported)." msgstr "Anarchie (crimes non rapportés)" -#: edrclient.py:1319 +#: edrclient.py:1364 msgid "" "You could have helped other EDR users or get help by reporting this crime!" msgstr "" "Vous auriez pu aider d'autres utilisateurs EDR ou alerter les vigiles en " "rapportant ce crime!" -#: edrclient.py:1329 +#: edrclient.py:1374 msgid "crime reported!" msgstr "crime rapporté!" -#: edrclient.py:1345 +#: edrclient.py:1390 msgid "Anarchy system (fights not reported)." msgstr "Anarchie (combats non rapportés)" -#: edrclient.py:1356 helpcontent.py:119 load.py:515 load.py:519 load.py:521 +#: edrclient.py:1401 helpcontent.py:119 load.py:520 load.py:524 load.py:526 msgid "EDR Central" msgstr "EDR Central" -#: edrclient.py:1356 load.py:519 +#: edrclient.py:1401 load.py:524 msgid "Fight reporting enabled" msgstr "Rapport de combat activé" -#: edrclient.py:1356 +#: edrclient.py:1401 msgid "Reason: presence of outlaws" msgstr "Raison: présence d'hors-la-loi" -#: edrclient.py:1356 load.py:519 +#: edrclient.py:1401 load.py:524 msgid "" "Turn it off: flash your lights twice, or leave this area, or escape danger " "and retract hardpoints." @@ -758,26 +803,26 @@ msgstr "" "Désactiver: flashez vos phares deux fois, quittez cet endroit, ou mettez " "vous en sécurité et désactivez vos armes." -#: edrclient.py:1360 +#: edrclient.py:1405 msgid "Need assistance?" msgstr "Besoin de renforts?" -#: edrclient.py:1360 +#: edrclient.py:1405 msgid "Flash your lights twice to report a PvP fight to enforcers." msgstr "" "Flashez vos phares pour rapporter un combat PvP aux forces de sécurité." -#: edrclient.py:1360 +#: edrclient.py:1405 msgid "Send '!crimes off' to make EDR go silent." msgstr "" "Envoyez '!crimes off' dans le chat pour désactiver ces alertes et ignorer " "les crimes." -#: edrclient.py:1380 +#: edrclient.py:1425 msgid "fight reported!" msgstr "combat rapporté!" -#: edrclient.py:1396 +#: edrclient.py:1441 msgid "" "You could have helped other EDR users by reporting this problematic crew " "member!" @@ -785,186 +830,186 @@ msgstr "" "Vous auriez pu aider d'autres utilisateurs EDR en rapportant ce membre " "d'équipage problématique!" -#: edrclient.py:1401 +#: edrclient.py:1446 msgid "{} is unknown to EDR." msgstr "{} n'est pas connu par les services EDR." -#: edrclient.py:1406 +#: edrclient.py:1451 #, python-brace-format msgid "multicrew session reported (cmdr {name})." msgstr "succès du rapport d'équipage (cmd {name})." -#: edrclient.py:1422 edrclient.py:1443 +#: edrclient.py:1467 edrclient.py:1488 msgid "Skipped FC jump announcement." msgstr "Itinéraire du porte-vaisseaux ignoré." -#: edrclient.py:1428 +#: edrclient.py:1473 msgid "Sent PSA for FC jump schedule." msgstr "Itinéraire du porte-vaisseaux annoncé (public)." -#: edrclient.py:1430 +#: edrclient.py:1475 msgid "Sent Private FC jump schedule." msgstr "Itinéraire du porte-vaisseaux annoncé (privé)." -#: edrclient.py:1449 +#: edrclient.py:1494 msgid "Cancelled FC jump schedule." msgstr "Itinéraire du porte-vaisseaux annulé." -#: edrclient.py:1462 edrclient.py:1504 edrclient.py:1528 edrclient.py:1541 -#: edrclient.py:1554 edrclient.py:1622 edrclient.py:1636 edrclient.py:1646 -#: edrclient.py:1685 +#: edrclient.py:1507 edrclient.py:1549 edrclient.py:1573 edrclient.py:1586 +#: edrclient.py:1599 edrclient.py:1667 edrclient.py:1681 edrclient.py:1691 +#: edrclient.py:1730 msgid "Sorry, this feature only works with an EDR account." msgstr "Désolé, cette fonctionnalité nécessite un compte EDR." -#: edrclient.py:1467 +#: edrclient.py:1512 #, python-brace-format msgid "Message not sent. Try again in {duration}." msgstr "Message refusé. Essayez encore dans {duration}." -#: edrclient.py:1468 edrclient.py:1496 +#: edrclient.py:1513 edrclient.py:1541 msgid "EDR central" msgstr "Centrale EDR" -#: edrclient.py:1480 +#: edrclient.py:1525 msgid "Message sent with codeword '{}'." msgstr "Message envoyé avec le code '{}'." -#: edrclient.py:1480 +#: edrclient.py:1525 msgid "Ask the codeword to identify trusted commanders." msgstr "Demandez le code afin d'identifier votre interlocuteur." -#: edrclient.py:1483 +#: edrclient.py:1528 msgid "For good measure, also reach out to these folks with the info below:" msgstr "" "Pour plus d'efficacité, veuillez aussi contacter le groupe ci dessous avec " "les infos:" -#: edrclient.py:1490 +#: edrclient.py:1535 msgid "Check ED Market Connector for instructions about other options" msgstr "" "Regardez l'interface utilisateur d'ED Market Connector pour des instructions " "complémentaires" -#: edrclient.py:1491 +#: edrclient.py:1536 msgid "Sent to EDR central - Also try: {}" msgstr "Envoyé à EDR Central" -#: edrclient.py:1495 +#: edrclient.py:1540 msgid "Message sent to EDR central" msgstr "Message envoyé à EDR Central" -#: edrclient.py:1510 edrclient.py:1514 edrclient.py:1518 edrclient.py:1560 -#: edrclient.py:1564 edrclient.py:1568 +#: edrclient.py:1555 edrclient.py:1559 edrclient.py:1563 edrclient.py:1605 +#: edrclient.py:1609 edrclient.py:1613 msgid "Squadron Dex" msgstr "Dex Escadron" -#: edrclient.py:1510 edrclient.py:1560 +#: edrclient.py:1555 edrclient.py:1605 msgid "You need to join a squadron on https://inara.cz to use this feature." msgstr "" "Vous devez rejoindre un escadron sur https://inara.cz pour utiliser cette " "fonctionnalité." -#: edrclient.py:1510 edrclient.py:1560 +#: edrclient.py:1555 edrclient.py:1605 msgid "Then, reboot EDR to reflect these changes." msgstr "Ensuite, relancez EDR pour appliquer les changements." -#: edrclient.py:1514 edrclient.py:1564 +#: edrclient.py:1559 edrclient.py:1609 msgid "You need to reach {} to tag enemies or allies." msgstr "Vous devez être au moins {} afin de taggé des ennemis ou alliés." -#: edrclient.py:1518 edrclient.py:1533 edrclient.py:1535 edrclient.py:1546 -#: edrclient.py:1548 edrclient.py:1568 +#: edrclient.py:1563 edrclient.py:1578 edrclient.py:1580 edrclient.py:1591 +#: edrclient.py:1593 edrclient.py:1613 msgid "Cmdr Dex" msgstr "Dex Commandants" -#: edrclient.py:1520 +#: edrclient.py:1565 #, python-brace-format msgid "Successfully tagged cmdr {name} with {tag}" msgstr "Cmdr {name} a bien été tagué avec {tag}" -#: edrclient.py:1522 +#: edrclient.py:1567 #, python-brace-format msgid "Could not tag cmdr {name} with {tag}" msgstr "Impossible de tagguer Cmdr {name} avec {tag}" -#: edrclient.py:1533 +#: edrclient.py:1578 msgid "Successfully attached a memo to cmdr {}" msgstr "Le mémo à-propos du cmd {} a bien été enregistré" -#: edrclient.py:1535 +#: edrclient.py:1580 msgid "Failed to attach a memo to cmdr {}" msgstr "Impossible d'enregistrer le mémo à-propos du cmd {}" -#: edrclient.py:1546 +#: edrclient.py:1591 msgid "Successfully removed memo from cmdr {}" msgstr "Le mémo à-propos du cmd {} a bien été supprimé" -#: edrclient.py:1548 +#: edrclient.py:1593 msgid "Failed to remove memo from cmdr {}" msgstr "Impossible de supprimer le mémo à-propos du cmd {}" -#: edrclient.py:1571 +#: edrclient.py:1616 msgid "Successfully removed all tags from cmdr {}" msgstr "Tous les tags ont bien été supprimés pour le cmd {}" -#: edrclient.py:1573 +#: edrclient.py:1618 msgid "Successfully removed tag {} from cmdr {}" msgstr "Le tag {} a bien été supprimé pour le cmd {}" -#: edrclient.py:1575 +#: edrclient.py:1620 msgid "Could not remove tag(s) from cmdr {}" msgstr "Impossible de supprimer les tags pour le cmd {}" -#: edrclient.py:1588 edrclient.py:1593 +#: edrclient.py:1633 edrclient.py:1638 msgid "Intel about {} (Open)" msgstr "Renseignements sur {} (Open)" -#: edrclient.py:1592 +#: edrclient.py:1637 msgid "no info about {}" msgstr "aucune info sur {}" -#: edrclient.py:1594 +#: edrclient.py:1639 msgid "Not recently sighted or not an outlaw." msgstr "Aucun récent contact, ou non recherché." -#: edrclient.py:1605 +#: edrclient.py:1650 msgid " @ {}" msgstr "" -#: edrclient.py:1607 +#: edrclient.py:1652 msgid "'{}' ({}): {}{}" msgstr "'{}' ({}): {}{}" -#: edrclient.py:1609 +#: edrclient.py:1654 msgid "{}: {}{}" msgstr "" -#: edrclient.py:1613 edrclient.py:1615 edrclient.py:1617 +#: edrclient.py:1658 edrclient.py:1660 edrclient.py:1662 msgid "Ship locator" msgstr "Recherche de vaisseau" -#: edrclient.py:1615 +#: edrclient.py:1660 msgid "No info about your fleet." msgstr "Aucune info sur votre flotille." -#: edrclient.py:1615 +#: edrclient.py:1660 msgid "Visit a shipyard to update your fleet info." msgstr "Visitez un shipyard pour mettre à jour votre flotte." -#: edrclient.py:1617 +#: edrclient.py:1662 msgid "Couldn't find anything" msgstr "Rien trouvé" -#: edrclient.py:1627 edrclient.py:1630 edrclient.py:1640 edrclient.py:1653 -#: edrclient.py:1655 edrclient.py:1661 edrclient.py:1664 +#: edrclient.py:1672 edrclient.py:1675 edrclient.py:1685 edrclient.py:1698 +#: edrclient.py:1700 edrclient.py:1706 edrclient.py:1709 msgid "Kill Rewards" msgstr "Prime" -#: edrclient.py:1627 +#: edrclient.py:1672 msgid "{} on Cmdr {}" msgstr "{} sur Cmdt {}" -#: edrclient.py:1629 +#: edrclient.py:1674 msgid "" "Send '!contract example $$$ 10' in chat to set a reward of 10 million " "credits on Cmdr 'example'" @@ -972,31 +1017,31 @@ msgstr "" "Envoyez '!contract example $$$ 10' dans le chat pour placer un contrat de 10 " "million de crédits pour la destruction du Cmdt 'example'." -#: edrclient.py:1630 +#: edrclient.py:1675 msgid "You haven't set any contract yet" msgstr "Vous n'avez pas encore placé de contrat" -#: edrclient.py:1640 edrclient.py:1653 +#: edrclient.py:1685 edrclient.py:1698 msgid "Reward of {} for a kill on Cmdr {}" msgstr "Prime de {} pour la destruction de Cmdt {}" -#: edrclient.py:1653 +#: edrclient.py:1698 msgid "Send '!contract {} $$$ 0' in chat to remove the kill reward" msgstr "Envoyez '!contract {} $$$ 0' dans le chat pour supprimer votre contrat" -#: edrclient.py:1655 +#: edrclient.py:1700 msgid "Failed to place a reward for a kill on Cmdr {}" msgstr "Impossible de placer un contrat sur Cmdt {}" -#: edrclient.py:1655 +#: edrclient.py:1700 msgid "You may have too many active contracts." msgstr "" -#: edrclient.py:1655 +#: edrclient.py:1700 msgid "Send '!contracts' to see all your contracts." msgstr "" -#: edrclient.py:1659 +#: edrclient.py:1704 #, python-brace-format msgid "" "Send '!contract {cmdr} $$$ 10' in chat to set a reward of 10 million credits " @@ -1005,47 +1050,47 @@ msgstr "" "Envoyez '!contract {cmdr} $$$ 10' dans le chat pour placer un contrat de 10 " "million de crédits pour la destruction du Cmdt '{cmdr}'." -#: edrclient.py:1661 +#: edrclient.py:1706 msgid "Removed reward for a kill on Cmdr {}" msgstr "" -#: edrclient.py:1664 +#: edrclient.py:1709 msgid "Failed to remove reward for a kill on Cmdr {} (not even set?)" msgstr "Impossible de supprimer votre contrat sur Cmdt {} (n'existe pas?)" -#: edrclient.py:1689 edrclient.py:1694 edrclient.py:1700 +#: edrclient.py:1734 edrclient.py:1739 edrclient.py:1745 #, python-brace-format msgid "Recently Sighted {kind}" msgstr "{kind} récemment repérés" -#: edrclient.py:1689 +#: edrclient.py:1734 msgid "You need to be pledged to a power." msgstr "Vous devez prêter allégeance à un pouvoir." -#: edrclient.py:1694 edrclient.py:1700 +#: edrclient.py:1739 edrclient.py:1745 #, python-brace-format msgid "Recently Sighted {kind} (Open)" msgstr "{kind} récemment repérés (Open)" -#: edrclient.py:1695 +#: edrclient.py:1740 #, python-brace-format msgid "No {kind} sighted in the last {timespan}" msgstr "Pas de contact avec des {kind} depuis {timespan}" -#: edrclient.py:1698 +#: edrclient.py:1743 #, python-brace-format msgid "recently sighted {kind}" msgstr "{kind} récemment repérés" -#: edrclient.py:1765 +#: edrclient.py:1810 msgid "Comms Link Error" msgstr "Erreur de Liaison Comms" -#: edrclient.py:1765 +#: edrclient.py:1810 msgid "EDR Central can't be reached at the moment" msgstr "Impossible de joindre le central EDR" -#: edrclient.py:1765 +#: edrclient.py:1810 msgid "" "Try again later. Join https://edrecon.com/discord or contact Cmdr LeKeno if " "it keeps failing" @@ -1053,281 +1098,281 @@ msgstr "" "Essayez plus tard, rejoignez https://edrecon.com/discord ou contactez Cmdt " "LeKeno si cela persiste" -#: edrclient.py:1780 +#: edrclient.py:1825 msgid "EDR needs you!" msgstr "EDR a besoin de vous!" -#: edrclient.py:1780 +#: edrclient.py:1825 msgid "Apply for an account at https://edrecon.com/account" msgstr "Demandez un compte EDR depuis https://edrecon.com/account" -#: edrclient.py:1780 +#: edrclient.py:1825 msgid "It's free, no strings attached." msgstr "C'est gratuit et sans obligations." -#: edrclient.py:1789 edrclient.py:1793 edrclient.py:1805 edrclient.py:1808 -#: edrclient.py:1818 edrclient.py:1821 edrclient.py:1831 edrclient.py:1834 -#: edrclient.py:1845 edrclient.py:1848 edrclient.py:1859 edrclient.py:1862 -#: edrclient.py:1875 edrclient.py:1878 edrclient.py:1891 edrclient.py:1894 -#: edrclient.py:1904 edrclient.py:1907 edrclient.py:1917 edrclient.py:1920 -#: edrclient.py:1930 edrclient.py:1933 edrclient.py:1983 edrclient.py:1987 -#: edrclient.py:1993 edrclient.py:2001 edrclient.py:2004 edrclient.py:2010 +#: edrclient.py:1834 edrclient.py:1838 edrclient.py:1850 edrclient.py:1853 +#: edrclient.py:1863 edrclient.py:1866 edrclient.py:1876 edrclient.py:1879 +#: edrclient.py:1890 edrclient.py:1893 edrclient.py:1904 edrclient.py:1907 +#: edrclient.py:1920 edrclient.py:1923 edrclient.py:1936 edrclient.py:1939 +#: edrclient.py:1949 edrclient.py:1952 edrclient.py:1962 edrclient.py:1965 +#: edrclient.py:1975 edrclient.py:1978 edrclient.py:2028 edrclient.py:2032 +#: edrclient.py:2038 edrclient.py:2046 edrclient.py:2049 edrclient.py:2055 msgid "EDR Search" msgstr "Recherche EDR" -#: edrclient.py:1789 edrclient.py:1983 +#: edrclient.py:1834 edrclient.py:2028 msgid "Already searching for something, please wait..." msgstr "Recherche en cours, veuillez patienter..." -#: edrclient.py:1793 edrclient.py:1987 +#: edrclient.py:1838 edrclient.py:2032 msgid "Search features only work in the bubble or Colonia." msgstr "" "Désolé, cette fonctionnalité ne fonctionne que dans la bulle ou à Colonia." -#: edrclient.py:1804 +#: edrclient.py:1849 msgid "I.Factors: searching..." msgstr "I. Factors: recherche en cours..." -#: edrclient.py:1805 +#: edrclient.py:1850 msgid "Interstellar Factors: searching..." msgstr "Interstellar Factors: recherche en cours..." -#: edrclient.py:1807 +#: edrclient.py:1852 msgid "I.Factors: failed" msgstr "I. Factors: échec" -#: edrclient.py:1808 edrclient.py:1821 edrclient.py:1834 edrclient.py:1848 -#: edrclient.py:1862 edrclient.py:1878 edrclient.py:1894 edrclient.py:1907 -#: edrclient.py:1920 edrclient.py:1933 +#: edrclient.py:1853 edrclient.py:1866 edrclient.py:1879 edrclient.py:1893 +#: edrclient.py:1907 edrclient.py:1923 edrclient.py:1939 edrclient.py:1952 +#: edrclient.py:1965 edrclient.py:1978 msgid "Unknown system" msgstr "Système inconnu" -#: edrclient.py:1817 +#: edrclient.py:1862 msgid "Raw mat. trader: searching..." msgstr "Marchand de mat. premières: recherche en cours..." -#: edrclient.py:1818 +#: edrclient.py:1863 msgid "Raw material trader: searching..." msgstr "Marchand de matières premières: recherche en cours..." -#: edrclient.py:1820 +#: edrclient.py:1865 msgid "Raw mat. trader: failed" msgstr "Marchand de mat. premières: échec" -#: edrclient.py:1830 edrclient.py:1831 +#: edrclient.py:1875 edrclient.py:1876 msgid "Encoded data trader: searching..." msgstr "Marchand de données encodées: recherche en cours..." -#: edrclient.py:1833 +#: edrclient.py:1878 msgid "Encoded data trader: failed" msgstr "Marchand de données encodées: échec" -#: edrclient.py:1844 +#: edrclient.py:1889 msgid "Manufactured mat. trader: searching..." msgstr "Marchand de d. encodées: recherche en cours..." -#: edrclient.py:1845 +#: edrclient.py:1890 msgid "Manufactured material trader: searching..." msgstr "Marchand de fabrications: recherche en cours..." -#: edrclient.py:1847 +#: edrclient.py:1892 msgid "Manufactured mat. trader: failed" msgstr "Marchand de fabrications: échec" -#: edrclient.py:1858 edrclient.py:1859 +#: edrclient.py:1903 edrclient.py:1904 msgid "Staging station: searching..." msgstr "Spatioport en retrait: recherche en cours..." -#: edrclient.py:1861 +#: edrclient.py:1906 msgid "Staging station: failed" msgstr "Spatioport en retrait: échec" -#: edrclient.py:1871 +#: edrclient.py:1916 msgid "RRR Fleet Carrier: searching..." msgstr "Porte-vaisseaux avec RRR: recherche en cours..." -#: edrclient.py:1872 +#: edrclient.py:1917 msgid "RRR Fleet Carrier: searching in {}..." msgstr "Porte-vaisseaux avec RRR: recherche autour de {}..." -#: edrclient.py:1872 +#: edrclient.py:1917 msgid "If there are no results, try: !rrrfc {} < 15" msgstr "S'il n'y a aucun résultat, essayez: !rrrfc {} < 15" -#: edrclient.py:1874 +#: edrclient.py:1919 msgid "RRR Fleet Carrier: searching within {} LY of {}..." msgstr "" "Porte-vaisseaux avec RRR: recherche dans un rayon de {} AL autour de {}..." -#: edrclient.py:1877 +#: edrclient.py:1922 msgid "RRR Fleet Carrier: failed" msgstr "Porte-vaisseaux avec RRR: échec" -#: edrclient.py:1887 +#: edrclient.py:1932 msgid "RRR Station: searching..." msgstr "Spatioport avec RRR: recherche en cours..." -#: edrclient.py:1888 +#: edrclient.py:1933 msgid "RRR Station: searching in {}..." msgstr "Spatioport avec RRR: recherche autour de {}..." -#: edrclient.py:1888 +#: edrclient.py:1933 msgid "If there are no results, try: !rrr {} < 15" msgstr "" -#: edrclient.py:1890 +#: edrclient.py:1935 msgid "RRR Station: searching within {} LY of {}..." msgstr "Spatioport avec RRR: recherche dans un rayon de [{}LY] autour de {}" -#: edrclient.py:1893 +#: edrclient.py:1938 msgid "RRR Station: failed" msgstr "Spatioport avec RRR: échec" -#: edrclient.py:1903 edrclient.py:1904 +#: edrclient.py:1948 edrclient.py:1949 msgid "Human tech broker: searching..." msgstr "Courtier en technologie humaine: recherche en cours..." -#: edrclient.py:1906 +#: edrclient.py:1951 msgid "Human tech broker: failed" msgstr "Courtier en technologie humaine: échec" -#: edrclient.py:1916 edrclient.py:1917 +#: edrclient.py:1961 edrclient.py:1962 msgid "Guardian tech broker: searching..." msgstr "Courtier en technologie Gardien: recherche en cours..." -#: edrclient.py:1919 +#: edrclient.py:1964 msgid "Guardian tech broker: failed" msgstr "Courtier en technologie gardien: échec" -#: edrclient.py:1929 edrclient.py:1930 +#: edrclient.py:1974 edrclient.py:1975 msgid "Offbeat station: searching..." msgstr "Spatioport pas visité récemment: recherche en cours..." -#: edrclient.py:1932 +#: edrclient.py:1977 msgid "Offbeat station: failed" msgstr "Spatioport pas visité récemment: échec" -#: edrclient.py:1941 +#: edrclient.py:1986 #, python-brace-format msgid "{dist:.3g}LY" msgstr "{dist:.3g}AL" -#: edrclient.py:1941 +#: edrclient.py:1986 #, python-brace-format msgid "{dist}LY" msgstr "{dist}AL" -#: edrclient.py:1942 +#: edrclient.py:1987 #, python-brace-format msgid "{dist}LS" msgstr "{dist}LS" -#: edrclient.py:1943 +#: edrclient.py:1988 #, python-brace-format msgid "{system}, {dist}" msgstr "{system}, {dist}" -#: edrclient.py:1944 +#: edrclient.py:1989 #, python-brace-format msgid "{station} ({type}), {sc_dist}" msgstr "{station} ({type}), {sc_dist}" -#: edrclient.py:1945 +#: edrclient.py:1990 #, python-brace-format msgid "as of {date} {ci}" msgstr "date des infos: {date} {ci}" -#: edrclient.py:1949 +#: edrclient.py:1994 msgid "{}: nothing within [{}LY, {}LS] of {}" msgstr "{}: rien dans un rayon de [{}LY, {}LS] autour de {}" -#: edrclient.py:1950 edrclient.py:2029 edrclient.py:2031 +#: edrclient.py:1995 edrclient.py:2074 edrclient.py:2076 msgid "checked {} systems" msgstr "{} systèmes dans la recherche" -#: edrclient.py:1952 +#: edrclient.py:1997 msgid "checked {} systems and {} stations" msgstr "{} systèmes et {} statioports dans la recherche" -#: edrclient.py:1953 +#: edrclient.py:1998 msgid "nothing found within [{}LY, {}LS], {}." msgstr "rien dans un rayon de [{}LY, {}LS], {}." -#: edrclient.py:1956 edrclient.py:2035 +#: edrclient.py:2001 edrclient.py:2080 msgid "{} near {}" msgstr "{} proche de {}" -#: edrclient.py:1963 +#: edrclient.py:2008 msgid "Unrecognized materials profile" msgstr "Profile matériaux non reconnu" -#: edrclient.py:1963 +#: edrclient.py:2008 msgid "To see a list of profiles, send: !materials" msgstr "Envoyez !materials pour voir la liste des profiles" -#: edrclient.py:1967 +#: edrclient.py:2012 msgid "Using materials profile '{}'" msgstr "Profile {} utilisé" -#: edrclient.py:1967 +#: edrclient.py:2012 msgid "Revert to default profile by sending: !materials default" msgstr "Pour revenir au profile de base, envoyez: !materials default" -#: edrclient.py:1969 +#: edrclient.py:2014 msgid "Using default materials profile" msgstr "Utilisation du profile de base" -#: edrclient.py:1969 +#: edrclient.py:2014 msgid "See the list of profiles by sending: !materials" msgstr "Pour voir la liste des profiles, envoyez: !materials" -#: edrclient.py:1976 +#: edrclient.py:2021 msgid "Available materials profiles" msgstr "Liste des profiles disponibles" -#: edrclient.py:1992 edrclient.py:1993 +#: edrclient.py:2037 edrclient.py:2038 msgid "{}: not supported." msgstr "{}: non disponible." -#: edrclient.py:1993 edrclient.py:2004 edrclient.py:2010 +#: edrclient.py:2038 edrclient.py:2049 edrclient.py:2055 msgid "To learn how to use the feature, send: !help search" msgstr "Pour afficher l'aide, envoyez: !help search" -#: edrclient.py:2000 edrclient.py:2001 +#: edrclient.py:2045 edrclient.py:2046 msgid "{}: searching..." msgstr "{}: recherche en cours..." -#: edrclient.py:2003 edrclient.py:2004 edrclient.py:2009 edrclient.py:2010 +#: edrclient.py:2048 edrclient.py:2049 edrclient.py:2054 edrclient.py:2055 msgid "{}: failed..." msgstr "{}: échec..." -#: edrclient.py:2006 +#: edrclient.py:2051 msgid "{}: found" msgstr "{}: succès" -#: edrclient.py:2017 +#: edrclient.py:2062 #, python-brace-format msgid "{dist:.3g}" msgstr "{dist:.3g}" -#: edrclient.py:2017 +#: edrclient.py:2062 #, python-brace-format msgid "{dist}" msgstr "{dist}" -#: edrclient.py:2018 +#: edrclient.py:2063 msgid "{} ({}LY, {})" msgstr "{} ({}AL, {})" -#: edrclient.py:2022 +#: edrclient.py:2067 msgid "as of {}" msgstr "date des infos: {}" -#: edrclient.py:2028 +#: edrclient.py:2073 msgid "{}: nothing within [{}LY] of {}" msgstr "{}: rien dans un rayon de [{}LY] autour de {}" -#: edrclient.py:2032 +#: edrclient.py:2077 msgid "nothing found within {}LY, {}." msgstr "rien dans un rayon de {}LY, {}." @@ -1623,532 +1668,1336 @@ msgstr "" msgid "Pirates" msgstr "" -#: edrinventory.py:16 +#: edrinventory.py:25 msgid "Zinc" msgstr "" -#: edrinventory.py:17 +#: edrinventory.py:26 msgid "Mercury" msgstr "" -#: edrinventory.py:18 +#: edrinventory.py:27 msgid "Polonium" msgstr "" -#: edrinventory.py:19 +#: edrinventory.py:28 msgid "Tellurium" msgstr "" -#: edrinventory.py:20 +#: edrinventory.py:29 msgid "Yttrium" msgstr "" -#: edrinventory.py:21 +#: edrinventory.py:30 msgid "Antimony" msgstr "" -#: edrinventory.py:22 +#: edrinventory.py:31 msgid "Selenium" msgstr "" -#: edrinventory.py:23 +#: edrinventory.py:32 msgid "Ruthenium" msgstr "" -#: edrinventory.py:24 +#: edrinventory.py:33 msgid "Zirconium" msgstr "" -#: edrinventory.py:25 +#: edrinventory.py:34 msgid "Vanadium" msgstr "" -#: edrinventory.py:26 +#: edrinventory.py:35 msgid "Manganese" msgstr "" -#: edrinventory.py:27 +#: edrinventory.py:36 msgid "Chromium" msgstr "" -#: edrinventory.py:28 +#: edrinventory.py:37 msgid "Molybdenum" msgstr "" -#: edrinventory.py:29 +#: edrinventory.py:38 msgid "Technetium" msgstr "" -#: edrinventory.py:30 +#: edrinventory.py:39 msgid "Tin" msgstr "" -#: edrinventory.py:31 +#: edrinventory.py:40 msgid "Arsenic" msgstr "" -#: edrinventory.py:32 +#: edrinventory.py:41 msgid "Cadmium" msgstr "" -#: edrinventory.py:33 +#: edrinventory.py:42 msgid "Iron" msgstr "" -#: edrinventory.py:34 +#: edrinventory.py:43 msgid "Niobium" msgstr "" -#: edrinventory.py:35 +#: edrinventory.py:44 msgid "Phosphorus" msgstr "" -#: edrinventory.py:36 +#: edrinventory.py:45 msgid "Germanium" msgstr "" -#: edrinventory.py:37 +#: edrinventory.py:46 msgid "Tungsten" msgstr "" -#: edrinventory.py:38 +#: edrinventory.py:47 msgid "Sulphur" msgstr "" -#: edrinventory.py:39 +#: edrinventory.py:48 msgid "Carbon" msgstr "" -#: edrinventory.py:40 +#: edrinventory.py:49 msgid "Nickel" msgstr "" -#: edrinventory.py:41 +#: edrinventory.py:50 msgid "Rhenium" msgstr "" -#: edrinventory.py:42 +#: edrinventory.py:51 msgid "Boron" msgstr "" -#: edrinventory.py:43 +#: edrinventory.py:52 msgid "Lead" msgstr "" -#: edrinventory.py:44 +#: edrinventory.py:53 msgid "Focus Crystals" msgstr "" -#: edrinventory.py:45 +#: edrinventory.py:54 msgid "Compound Shielding" msgstr "" -#: edrinventory.py:46 +#: edrinventory.py:55 msgid "Galvanising Alloys" msgstr "" -#: edrinventory.py:47 +#: edrinventory.py:56 msgid "Heat Vanes" msgstr "" -#: edrinventory.py:48 +#: edrinventory.py:57 msgid "Configurable Components" msgstr "" -#: edrinventory.py:49 +#: edrinventory.py:58 msgid "Biotech Conductors" msgstr "" -#: edrinventory.py:50 +#: edrinventory.py:59 msgid "Chemical Manipulators" msgstr "" -#: edrinventory.py:51 +#: edrinventory.py:60 msgid "Mechanical Components" msgstr "" -#: edrinventory.py:52 +#: edrinventory.py:61 msgid "Proprietary Composites" msgstr "" -#: edrinventory.py:53 +#: edrinventory.py:62 msgid "High Density Composites" msgstr "" -#: edrinventory.py:54 +#: edrinventory.py:63 msgid "Proto Radiolic Alloys" msgstr "" -#: edrinventory.py:55 +#: edrinventory.py:64 msgid "Chemical Distillery" msgstr "" -#: edrinventory.py:56 +#: edrinventory.py:65 msgid "Chemical Processors" msgstr "" -#: edrinventory.py:57 +#: edrinventory.py:66 msgid "Imperial Shielding" msgstr "" -#: edrinventory.py:58 +#: edrinventory.py:67 msgid "Grid Resistors" msgstr "" -#: edrinventory.py:59 +#: edrinventory.py:68 msgid "Heat Conduction Wiring" msgstr "" -#: edrinventory.py:60 +#: edrinventory.py:69 msgid "Military Grade Alloys" msgstr "" -#: edrinventory.py:61 +#: edrinventory.py:70 msgid "Hybrid Capacitors" msgstr "" -#: edrinventory.py:62 +#: edrinventory.py:71 msgid "Heat Exchangers" msgstr "" -#: edrinventory.py:63 +#: edrinventory.py:72 msgid "Conductive Polymers" msgstr "" -#: edrinventory.py:64 +#: edrinventory.py:73 msgid "Shielding Sensors" msgstr "" -#: edrinventory.py:65 +#: edrinventory.py:74 msgid "Heat Dispersion Plate" msgstr "" -#: edrinventory.py:66 +#: edrinventory.py:75 msgid "Electrochemical Arrays" msgstr "" -#: edrinventory.py:67 +#: edrinventory.py:76 msgid "Conductive Ceramics" msgstr "" -#: edrinventory.py:68 +#: edrinventory.py:77 msgid "Conductive Components" msgstr "" -#: edrinventory.py:69 +#: edrinventory.py:78 msgid "Military Supercapacitors" msgstr "" -#: edrinventory.py:70 +#: edrinventory.py:79 msgid "Mechanical Equipment" msgstr "" -#: edrinventory.py:71 +#: edrinventory.py:80 msgid "Phase Alloys" msgstr "" -#: edrinventory.py:72 +#: edrinventory.py:81 msgid "Pharmaceutical Isolators" msgstr "" -#: edrinventory.py:73 +#: edrinventory.py:82 msgid "Core Dynamics Composites" msgstr "" -#: edrinventory.py:74 +#: edrinventory.py:83 msgid "Basic Conductors" msgstr "" -#: edrinventory.py:75 +#: edrinventory.py:84 msgid "Mechanical Scrap" msgstr "" -#: edrinventory.py:76 +#: edrinventory.py:85 msgid "Salvaged Alloys" msgstr "" -#: edrinventory.py:77 +#: edrinventory.py:86 msgid "Proto Light Alloys" msgstr "" -#: edrinventory.py:78 +#: edrinventory.py:87 msgid "Refined Focus Crystals" msgstr "" -#: edrinventory.py:79 +#: edrinventory.py:88 msgid "Shield Emitters" msgstr "" -#: edrinventory.py:80 +#: edrinventory.py:89 msgid "Precipitated Alloys" msgstr "" -#: edrinventory.py:81 +#: edrinventory.py:90 msgid "Worn Shield Emitters" msgstr "" -#: edrinventory.py:82 +#: edrinventory.py:91 msgid "Exquisite Focus Crystals" msgstr "" -#: edrinventory.py:83 +#: edrinventory.py:92 msgid "Polymer Capacitors" msgstr "" -#: edrinventory.py:84 +#: edrinventory.py:93 msgid "Thermic Alloys" msgstr "" -#: edrinventory.py:85 +#: edrinventory.py:94 msgid "Improvised Components" msgstr "" -#: edrinventory.py:86 +#: edrinventory.py:95 msgid "Crystal Shards" msgstr "" -#: edrinventory.py:87 +#: edrinventory.py:96 msgid "Heat Resistant Ceramics" msgstr "" -#: edrinventory.py:88 +#: edrinventory.py:97 msgid "Tempered Alloys" msgstr "" -#: edrinventory.py:89 +#: edrinventory.py:98 msgid "Flawed Focus Crystals" msgstr "" -#: edrinventory.py:90 +#: edrinventory.py:99 msgid "Filament Composites" msgstr "" -#: edrinventory.py:91 -msgid "Compact Composites" +#: edrinventory.py:100 +msgid "Compact Composites" +msgstr "" + +#: edrinventory.py:101 +msgid "Chemical Storage Units" +msgstr "" + +#: edrinventory.py:102 +msgid "Proto Heat Radiators" +msgstr "" + +#: edrinventory.py:103 +msgid "Guardian Power Conduit" +msgstr "" + +#: edrinventory.py:104 +msgid "Guardian Power Cell" +msgstr "" + +#: edrinventory.py:105 +msgid "Guardian Technology Component" +msgstr "" + +#: edrinventory.py:106 +msgid "Guardian Wreckage Components" +msgstr "" + +#: edrinventory.py:107 +msgid "Guardian Sentinel Weapon Parts" +msgstr "" + +#: edrinventory.py:108 +msgid "Classified Scan Fragment" +msgstr "" + +#: edrinventory.py:109 +msgid "Security Firmware Patch" +msgstr "" + +#: edrinventory.py:110 +msgid "Datamined Wake Exceptions" +msgstr "Datamined Wake Exception (Centre de distribution" + +#: edrinventory.py:111 +msgid "Abnormal Compact Emissions Data" +msgstr "" + +#: edrinventory.py:112 +msgid "Aberrant Shield Pattern Analysis" +msgstr "" + +#: edrinventory.py:113 +msgid "Adaptive Encryptors Capture" +msgstr "" + +#: edrinventory.py:114 +msgid "Unexpected Emission Data" +msgstr "" + +#: edrinventory.py:115 +msgid "Cracked Industrial Firmware" +msgstr "" + +#: edrinventory.py:116 +msgid "Classified Scan Databanks" +msgstr "" + +#: edrinventory.py:117 +msgid "Specialised Legacy Firmware" +msgstr "" + +#: edrinventory.py:118 +msgid "Modified Embedded Firmware" +msgstr "" + +#: edrinventory.py:119 +msgid "Distorted Shield Cycle Recordings" +msgstr "" + +#: edrinventory.py:120 +msgid "Decoded Emission Data" +msgstr "" + +#: edrinventory.py:121 +msgid "Anomalous Bulk Scan Data" +msgstr "" + +#: edrinventory.py:122 +msgid "Unidentified Scan Archives" +msgstr "" + +#: edrinventory.py:123 +msgid "Inconsistent Shield Soak Analysis" +msgstr "" + +#: edrinventory.py:124 +msgid "Divergent Scan Data" +msgstr "" + +#: edrinventory.py:125 +msgid "Untypical Shield Scans" +msgstr "" + +#: edrinventory.py:126 +msgid "Peculiar Shield Frequency Data" +msgstr "" + +#: edrinventory.py:127 +msgid "Tagged Encryption Codes" +msgstr "" + +#: edrinventory.py:128 +msgid "Modified Consumer Firmware" +msgstr "" + +#: edrinventory.py:129 +msgid "Irregular Emission Data" +msgstr "" + +#: edrinventory.py:130 +msgid "Open Symmetric Keys" +msgstr "" + +#: edrinventory.py:131 +msgid "Unusual Encrypted Files" +msgstr "" + +#: edrinventory.py:132 +msgid "Exceptional Scrambled Emission Data" +msgstr "" + +#: edrinventory.py:133 +msgid "Anomalous FSD Telemetry" +msgstr "" + +#: edrinventory.py:134 +msgid "Eccentric Hyperspace Trajectories" +msgstr "" + +#: edrinventory.py:135 +msgid "Atypical Disrupted Wake Echoes" +msgstr "" + +#: edrinventory.py:136 +msgid "Strange Wake Solutions" +msgstr "" + +#: edrinventory.py:137 +msgid "Atypical Encryption Archives" +msgstr "" + +#: edrinventory.py:138 +msgid "Pattern Alpha Obelisk Data" +msgstr "" + +#: edrinventory.py:139 +msgid "Pattern Gamma Obelisk Data" +msgstr "" + +#: edrinventory.py:140 +msgid "Guardian Module Blueprint Fragment" +msgstr "" + +#: edrinventory.py:141 +msgid "Pattern Beta Obelisk Data" +msgstr "" + +#: edrinventory.py:142 +msgid "Pattern Delta Obelisk Data" +msgstr "" + +#: edrinventory.py:143 +msgid "Guardian Starship Blueprint Fragment" +msgstr "" + +#: edrinventory.py:144 +msgid "Guardian Weapon Blueprint Fragment" +msgstr "" + +#: edrinventory.py:145 +msgid "Pattern Epsilon Obelisk Data" +msgstr "" + +#: edrinventory.py:146 +msgid "Ship Systems Data" +msgstr "" + +#: edrinventory.py:147 +msgid "Ship Flight Data" +msgstr "" + +#: edrinventory.py:148 +msgid "Thargoid Ship Signature" +msgstr "" + +#: edrinventory.py:149 +msgid "Thargoid Structural Data" +msgstr "" + +#: edrinventory.py:150 +msgid "Thargoid Wake Data" +msgstr "" + +#: edrinventory.py:151 +msgid "Bio-Mechanical Conduits" +msgstr "" + +#: edrinventory.py:152 +msgid "Propulsion Elements" +msgstr "" + +#: edrinventory.py:153 +msgid "Thargoid Carapace" +msgstr "" + +#: edrinventory.py:154 +msgid "Thargoid Energy Cell" +msgstr "" + +#: edrinventory.py:155 +msgid "Thargoid Organic Circuitry" +msgstr "" + +#: edrinventory.py:156 +msgid "Thargoid Technological Components" +msgstr "" + +#: edrinventory.py:157 +msgid "E-Breach" +msgstr "" + +#: edrinventory.py:158 +msgid "Power Regulator" +msgstr "" + +#: edrinventory.py:159 +msgid "Chemical Inventory" +msgstr "" + +#: edrinventory.py:160 +msgid "Duty Rota" +msgstr "" + +#: edrinventory.py:161 +msgid "Evacuation Protocols" +msgstr "" + +#: edrinventory.py:162 +msgid "Exploration Journals" +msgstr "" + +#: edrinventory.py:163 +msgid "Faction News" +msgstr "" + +#: edrinventory.py:164 +msgid "Financial Projections" +msgstr "" + +#: edrinventory.py:165 +msgid "Sales Records" +msgstr "" + +#: edrinventory.py:166 +msgid "Union Membership" +msgstr "" + +#: edrinventory.py:167 +msgid "Compact Library" +msgstr "" + +#: edrinventory.py:168 +msgid "infinity" +msgstr "" + +#: edrinventory.py:169 +msgid "Insight Entertainment Suite" +msgstr "" + +#: edrinventory.py:170 +msgid "lazarus" +msgstr "" + +#: edrinventory.py:171 +msgid "Energy Cell" +msgstr "" + +#: edrinventory.py:172 +msgid "Medkit" +msgstr "" + +#: edrinventory.py:173 +msgid "Universal Translator" +msgstr "" + +#: edrinventory.py:174 +msgid "Biochemical Agent" +msgstr "" + +#: edrinventory.py:175 +msgid "Degraded Power Regulator" +msgstr "" + +#: edrinventory.py:176 +msgid "Hush" +msgstr "" + +#: edrinventory.py:177 +msgid "Maintenance Logs" +msgstr "" + +#: edrinventory.py:178 +msgid "Patrol Routes" +msgstr "" + +#: edrinventory.py:179 +msgid "push" +msgstr "" + +#: edrinventory.py:180 +msgid "Settlement Defence Plans" +msgstr "" + +#: edrinventory.py:181 +msgid "Surveillance Logs" +msgstr "" + +#: edrinventory.py:182 +msgid "Synthetic Pathogen" +msgstr "" + +#: edrinventory.py:183 +msgid "Building Schematic" +msgstr "" + +#: edrinventory.py:184 +msgid "Operational Manual" +msgstr "" + +#: edrinventory.py:185 +msgid "Blacklist Data" +msgstr "" + +#: edrinventory.py:186 +msgid "Insight" +msgstr "" + +#: edrinventory.py:187 +msgid "Air Quality Reports" +msgstr "" + +#: edrinventory.py:188 +msgid "Employee Directory" +msgstr "" + +#: edrinventory.py:189 +msgid "Faction Associates" +msgstr "" + +#: edrinventory.py:190 +msgid "Meeting Minutes" +msgstr "" + +#: edrinventory.py:191 +msgid "Multimedia Entertainment" +msgstr "" + +#: edrinventory.py:192 +msgid "Network Access History" +msgstr "" + +#: edrinventory.py:193 +msgid "Purchase Records" +msgstr "" + +#: edrinventory.py:194 +msgid "Radioactivity Data" +msgstr "" + +#: edrinventory.py:195 +msgid "Residential Directory" +msgstr "" + +#: edrinventory.py:196 +msgid "Shareholder Information" +msgstr "" + +#: edrinventory.py:197 +msgid "Travel Permits" +msgstr "" + +#: edrinventory.py:198 +msgid "Accident Logs" +msgstr "" + +#: edrinventory.py:199 +msgid "Campaign Plans" +msgstr "" + +#: edrinventory.py:200 +msgid "Combat Training Material" +msgstr "" + +#: edrinventory.py:201 +msgid "Internal Correspondence" +msgstr "" + +#: edrinventory.py:202 +msgid "Payroll Information" +msgstr "" + +#: edrinventory.py:203 +msgid "Personal Logs" +msgstr "" + +#: edrinventory.py:204 +msgid "Weapon Inventory" +msgstr "" + +#: edrinventory.py:205 +msgid "Atmospheric Data" +msgstr "" + +#: edrinventory.py:206 +msgid "Topographical Surveys" +msgstr "" + +#: edrinventory.py:207 +msgid "Literary Fiction" +msgstr "" + +#: edrinventory.py:208 +msgid "Reactor Output Review" +msgstr "" + +#: edrinventory.py:209 +msgid "Next of Kin Records" +msgstr "" + +#: edrinventory.py:210 +msgid "Purchase Requests" +msgstr "" + +#: edrinventory.py:211 +msgid "Tax Records" +msgstr "" + +#: edrinventory.py:212 +msgid "Visitor Register" +msgstr "" + +#: edrinventory.py:213 +msgid "Pharmaceutical Patents" +msgstr "" + +#: edrinventory.py:214 +msgid "Vaccine Research" +msgstr "" + +#: edrinventory.py:215 +msgid "Virology Data" +msgstr "" + +#: edrinventory.py:216 +msgid "Vaccination Records" +msgstr "" + +#: edrinventory.py:217 +msgid "Census Data" +msgstr "" + +#: edrinventory.py:218 +msgid "Geographical Data" +msgstr "" + +#: edrinventory.py:219 +msgid "Mineral Survey" +msgstr "" + +#: edrinventory.py:220 +msgid "Chemical Formulae" +msgstr "" + +#: edrinventory.py:221 +msgid "Frag Grenade" +msgstr "" + +#: edrinventory.py:222 +msgid "Shield Disruptor" +msgstr "" + +#: edrinventory.py:223 +msgid "Shield Projector" +msgstr "" + +#: edrinventory.py:224 +msgid "Chemical Experiment Data" +msgstr "" + +#: edrinventory.py:225 +msgid "Chemical Patents" +msgstr "" + +#: edrinventory.py:226 +msgid "Production Reports" +msgstr "" + +#: edrinventory.py:227 +msgid "Production Schedule" +msgstr "" + +#: edrinventory.py:228 +msgid "Blood Test Results" +msgstr "" + +#: edrinventory.py:229 +msgid "Combatant Performance" +msgstr "" + +#: edrinventory.py:230 +msgid "Troop Deployment Records" +msgstr "" + +#: edrinventory.py:231 +msgid "Cat Media" +msgstr "" + +#: edrinventory.py:232 +msgid "Employee Genetic Data" +msgstr "" + +#: edrinventory.py:233 +msgid "Faction Donator List" +msgstr "" + +#: edrinventory.py:234 +msgid "NOC Data" +msgstr "" + +#: edrinventory.py:235 +msgid "True Form Fossil" +msgstr "" + +#: edrinventory.py:236 +msgid "Health Monitor" +msgstr "" + +#: edrinventory.py:237 +msgid "Nutritional Concentrate" +msgstr "" + +#: edrinventory.py:238 +msgid "Personal Documents" +msgstr "" + +#: edrinventory.py:239 +msgid "Chemical Sample" +msgstr "" + +#: edrinventory.py:240 +msgid "Insight Data Bank" +msgstr "" + +#: edrinventory.py:241 +msgid "Ionised Gas" +msgstr "" + +#: edrinventory.py:242 +msgid "Personal Computer" +msgstr "" + +#: edrinventory.py:243 +msgid "Ship Schematic" +msgstr "" + +#: edrinventory.py:244 +msgid "Suit Schematic" +msgstr "" + +#: edrinventory.py:245 +msgid "Vehicle Schematic" +msgstr "" + +#: edrinventory.py:246 +msgid "Weapon Schematic" +msgstr "" + +#: edrinventory.py:247 +msgid "Inertia Canister" +msgstr "" + +#: edrinventory.py:248 +msgid "Surveillance Equipment" +msgstr "" + +#: edrinventory.py:249 +msgid "Deep Mantle Sample" +msgstr "" + +#: edrinventory.py:250 +msgid "Microbial Inhibitor" +msgstr "" + +#: edrinventory.py:251 +msgid "Cast Fossil" +msgstr "" + +#: edrinventory.py:252 +msgid "Petrified Fossil" +msgstr "" + +#: edrinventory.py:253 +msgid "Agricultural Process Sample" +msgstr "" + +#: edrinventory.py:254 +msgid "Chemical Process Sample" +msgstr "" + +#: edrinventory.py:255 +msgid "Refinement Process Sample" +msgstr "" + +#: edrinventory.py:256 +msgid "Micro Supercapacitor" +msgstr "" + +#: edrinventory.py:257 +msgid "Micro Transformer" +msgstr "" + +#: edrinventory.py:258 +msgid "Chemical Superbase" +msgstr "" + +#: edrinventory.py:259 +msgid "Circuit Switch" +msgstr "" + +#: edrinventory.py:260 +msgid "Electrical Wiring" +msgstr "" + +#: edrinventory.py:261 +msgid "Encrypted Memory Chip" +msgstr "" + +#: edrinventory.py:262 +msgid "Epoxy Adhesive" +msgstr "" + +#: edrinventory.py:263 +msgid "Memory Chip" +msgstr "" + +#: edrinventory.py:264 +msgid "Micro Hydraulics" +msgstr "" + +#: edrinventory.py:265 +msgid "Optical Fibre" +msgstr "" + +#: edrinventory.py:266 +msgid "Titanium Plating" +msgstr "" + +#: edrinventory.py:267 +msgid "pH Neutraliser" +msgstr "" + +#: edrinventory.py:268 +msgid "Metal Coil" +msgstr "" + +#: edrinventory.py:269 +msgid "Viscoelastic Polymer" +msgstr "" + +#: edrinventory.py:270 +msgid "Ion Battery" +msgstr "" + +#: edrinventory.py:271 +msgid "Chemical Catalyst" +msgstr "" + +#: edrinventory.py:272 +msgid "Electrical Fuse" +msgstr "" + +#: edrinventory.py:273 +msgid "Optical Lens" +msgstr "" + +#: edrinventory.py:274 +msgid "Weapon Component" +msgstr "" + +#: edrinventory.py:275 +msgid "Carbon Fibre Plating" +msgstr "" + +#: edrinventory.py:276 +msgid "Micro Thrusters" +msgstr "" + +#: edrinventory.py:277 +msgid "Oxygenic Bacteria" +msgstr "" + +#: edrinventory.py:278 +msgid "Circuit Board" +msgstr "" + +#: edrinventory.py:279 +msgid "Tungsten Carbide" +msgstr "" + +#: edrinventory.py:280 +msgid "Ballistics Data" +msgstr "" + +#: edrinventory.py:281 +msgid "Political Affiliations" +msgstr "" + +#: edrinventory.py:282 +msgid "Conflict History" +msgstr "" + +#: edrinventory.py:283 +msgid "Risk Assessments" +msgstr "" + +#: edrinventory.py:284 +msgid "Stellar Activity Logs" +msgstr "" + +#: edrinventory.py:285 +msgid "Manufacturing Instructions" +msgstr "" + +#: edrinventory.py:286 +msgid "Digital Designs" +msgstr "" + +#: edrinventory.py:287 +msgid "Medical Records" +msgstr "" + +#: edrinventory.py:288 +msgid "Employment History" +msgstr "" + +#: edrinventory.py:289 +msgid "VIP Security Detail" +msgstr "" + +#: edrinventory.py:290 +msgid "Classic Entertainment" +msgstr "" + +#: edrinventory.py:291 +msgid "Photo Albums" +msgstr "" + +#: edrinventory.py:292 +msgid "Biometric Data" +msgstr "" + +#: edrinventory.py:293 +msgid "Extraction Yield Data" +msgstr "" + +#: edrinventory.py:294 +msgid "Security Expenses" +msgstr "" + +#: edrinventory.py:295 +msgid "Culinary Recipes" +msgstr "" + +#: edrinventory.py:296 +msgid "Fleet Registry" +msgstr "" + +#: edrinventory.py:297 +msgid "Influence Projections" +msgstr "" + +#: edrinventory.py:298 +msgid "Cocktail Recipes" +msgstr "" + +#: edrinventory.py:299 +msgid "Employee Expenses" +msgstr "" + +#: edrinventory.py:300 +msgid "Interview Recordings" msgstr "" -#: edrinventory.py:92 -msgid "Chemical Storage Units" +#: edrinventory.py:301 +msgid "Recycling Logs" msgstr "" -#: edrinventory.py:93 -msgid "Proto Heat Radiators" +#: edrinventory.py:302 +msgid "Job Applications" msgstr "" -#: edrinventory.py:94 -msgid "Guardian Power Conduit" +#: edrinventory.py:303 +msgid "Californium" msgstr "" -#: edrinventory.py:95 -msgid "Guardian Power Cell" +#: edrinventory.py:304 +msgid "Pyrolytic catalyst" msgstr "" -#: edrinventory.py:96 -msgid "Guardian Technology Component" +#: edrinventory.py:305 +msgid "Spyware" msgstr "" -#: edrinventory.py:97 -msgid "Guardian Wreckage Components" +#: edrinventory.py:306 +msgid "Tactical Plans" msgstr "" -#: edrinventory.py:98 -msgid "Guardian Sentinel Weapon Parts" +#: edrinventory.py:307 +msgid "Virus" msgstr "" -#: edrinventory.py:99 -msgid "Classified Scan Fragment" +#: edrinventory.py:308 +msgid "Aerogel" msgstr "" -#: edrinventory.py:100 -msgid "Security Firmware Patch" +#: edrinventory.py:309 +msgid "Genetic Repair Meds" msgstr "" -#: edrinventory.py:101 -msgid "Datamined Wake Exceptions" -msgstr "Datamined Wake Exception (Centre de distribution" +#: edrinventory.py:310 +msgid "Crop Yield Analysis" +msgstr "" -#: edrinventory.py:102 -msgid "Abnormal Compact Emissions Data" +#: edrinventory.py:311 +msgid "Kompromat" msgstr "" -#: edrinventory.py:103 -msgid "Aberrant Shield Pattern Analysis" +#: edrinventory.py:312 +msgid "Xeno Defence Protocols" msgstr "" -#: edrinventory.py:104 -msgid "Adaptive Encryptors Capture" +#: edrinventory.py:313 +msgid "Geological Data" msgstr "" -#: edrinventory.py:105 -msgid "Unexpected Emission Data" +#: edrinventory.py:314 +msgid "Opinion Polls" msgstr "" -#: edrinventory.py:106 -msgid "Cracked Industrial Firmware" +#: edrinventory.py:315 +msgid "Propaganda" msgstr "" -#: edrinventory.py:107 -msgid "Classified Scan Databanks" +#: edrinventory.py:316 +msgid "Hydroponic Data" msgstr "" -#: edrinventory.py:108 -msgid "Specialised Legacy Firmware" +#: edrinventory.py:317 +msgid "Mining Analytics" msgstr "" -#: edrinventory.py:109 -msgid "Modified Embedded Firmware" +#: edrinventory.py:318 +msgid "Compression Liquefied Gas" msgstr "" -#: edrinventory.py:110 -msgid "Distorted Shield Cycle Recordings" +#: edrinventory.py:319 +msgid "Weapon Test Data" msgstr "" -#: edrinventory.py:111 -msgid "Decoded Emission Data" +#: edrinventory.py:320 +msgid "Spectral Analysis Data" msgstr "" -#: edrinventory.py:112 -msgid "Anomalous Bulk Scan Data" +#: edrinventory.py:321 +msgid "Audiologs" msgstr "" -#: edrinventory.py:113 -msgid "Unidentified Scan Archives" +#: edrinventory.py:322 +msgid "Genetic Research" msgstr "" -#: edrinventory.py:114 -msgid "Inconsistent Shield Soak Analysis" +#: edrinventory.py:323 +msgid "Clinical Trial Records" msgstr "" -#: edrinventory.py:115 -msgid "Divergent Scan Data" +#: edrinventory.py:324 +msgid "G-Meds" msgstr "" -#: edrinventory.py:116 -msgid "Untypical Shield Scans" +#: edrinventory.py:325 +msgid "Gene Sequencing Data" msgstr "" -#: edrinventory.py:117 -msgid "Peculiar Shield Frequency Data" +#: edrinventory.py:326 +msgid "Settlement Assault Plans" msgstr "" -#: edrinventory.py:118 -msgid "Tagged Encryption Codes" +#: edrinventory.py:327 +msgid "Biological Sample" msgstr "" -#: edrinventory.py:119 -msgid "Modified Consumer Firmware" +#: edrinventory.py:328 +msgid "Smear Campaign Plans" msgstr "" -#: edrinventory.py:120 -msgid "Irregular Emission Data" +#: edrinventory.py:329 +msgid "Ax Combat Logs" msgstr "" -#: edrinventory.py:121 -msgid "Open Symmetric Keys" +#: edrinventory.py:330 +msgid "Biological Weapon Data" msgstr "" -#: edrinventory.py:122 -msgid "Unusual Encrypted Files" +#: edrinventory.py:331 +msgid "Chemical Weapon Data" msgstr "" -#: edrinventory.py:123 -msgid "Exceptional Scrambled Emission Data" +#: edrinventory.py:332 +msgid "Criminal Records" msgstr "" -#: edrinventory.py:124 -msgid "Anomalous FSD Telemetry" +#: edrinventory.py:333 +msgid "Enhanced Interrogation Recordings" msgstr "" -#: edrinventory.py:125 -msgid "Eccentric Hyperspace Trajectories" +#: edrinventory.py:334 +msgid "Espionage Material" msgstr "" -#: edrinventory.py:126 -msgid "Atypical Disrupted Wake Echoes" +#: edrinventory.py:335 +msgid "Incident Logs" msgstr "" -#: edrinventory.py:127 -msgid "Strange Wake Solutions" +#: edrinventory.py:336 +msgid "Inorganic Contaminant" msgstr "" -#: edrinventory.py:128 -msgid "Atypical Encryption Archives" +#: edrinventory.py:337 +msgid "Interrogation Recordings" msgstr "" -#: edrinventory.py:129 -msgid "Pattern Alpha Obelisk Data" +#: edrinventory.py:338 +msgid "Mutagenic Catalyst" msgstr "" -#: edrinventory.py:130 -msgid "Pattern Gamma Obelisk Data" +#: edrinventory.py:339 +msgid "Network Security Protocols" msgstr "" -#: edrinventory.py:131 -msgid "Guardian Module Blueprint Fragment" +#: edrinventory.py:340 +msgid "Patient History" msgstr "" -#: edrinventory.py:132 -msgid "Pattern Beta Obelisk Data" +#: edrinventory.py:341 +msgid "Plant Growth Charts" msgstr "" -#: edrinventory.py:133 -msgid "Pattern Delta Obelisk Data" +#: edrinventory.py:342 +msgid "Prisoner Logs" msgstr "" -#: edrinventory.py:134 -msgid "Guardian Starship Blueprint Fragment" +#: edrinventory.py:343 +msgid "Seed Geneaology" msgstr "" -#: edrinventory.py:135 -msgid "Guardian Weapon Blueprint Fragment" +#: edrinventory.py:344 +msgid "Slush Fund Logs" msgstr "" -#: edrinventory.py:136 -msgid "Pattern Epsilon Obelisk Data" +#: edrinventory.py:345 +msgid "Synthetic Genome" msgstr "" -#: edrinventory.py:137 -msgid "Ship Systems Data" +#: edrinventory.py:346 +msgid "Epinephrine" msgstr "" -#: edrinventory.py:138 -msgid "Ship Flight Data" +#: edrinventory.py:347 +msgid "Graphene" msgstr "" -#: edrinventory.py:139 -msgid "Thargoid Ship Signature" +#: edrinventory.py:348 +msgid "Rdx" msgstr "" -#: edrinventory.py:140 -msgid "Thargoid Structural Data" +#: edrinventory.py:349 +msgid "Electromagnet" msgstr "" -#: edrinventory.py:141 -msgid "Thargoid Wake Data" +#: edrinventory.py:350 +msgid "Microelectrode" msgstr "" -#: edrinventory.py:142 -msgid "Bio-Mechanical Conduits" +#: edrinventory.py:351 +msgid "Motor" msgstr "" -#: edrinventory.py:143 -msgid "Propulsion Elements" +#: edrinventory.py:352 +msgid "Scrambler" msgstr "" -#: edrinventory.py:144 -msgid "Thargoid Carapace" +#: edrinventory.py:353 +msgid "Transmitter" msgstr "" -#: edrinventory.py:145 -msgid "Thargoid Energy Cell" +#: edrinventory.py:661 +msgid "DAT" msgstr "" -#: edrinventory.py:146 -msgid "Thargoid Organic Circuitry" +#: edrinventory.py:661 +msgid "ASS" +msgstr "ASS" + +#: edrinventory.py:661 +msgid "GDS" msgstr "" -#: edrinventory.py:147 -msgid "Thargoid Technological Components" +#: edrinventory.py:661 +msgid "CNS" msgstr "" #: edrlegalrecords.py:60 @@ -4175,98 +5024,81 @@ msgstr "Drones: {}/{}" msgid "initialized." msgstr "initialisé." -#: load.py:515 load.py:521 +#: load.py:520 load.py:526 msgid "Fight reporting disabled" msgstr "Rapport de combat désactivé" -#: load.py:515 +#: load.py:520 msgid "Looks like you are safe, and disengaged." msgstr "Il semble que vous soyez en sécurité et désengagé." -#: load.py:521 +#: load.py:526 msgid "Flash your lights twice to re-enable." msgstr "Flashez vos phares deux fois afin de réactiver." -#: load.py:674 +#: load.py:682 msgid "System info acquired" msgstr "Infos du système acquises" -#: load.py:674 +#: load.py:682 msgid "Noteworthy material densities will be shown when approaching a planet." msgstr "" "Un sommaire des matériaux présents en forte densité s'affichera lors d'une " "approche planétaire." -#: load.py:763 +#: load.py:771 msgid "blip failed." msgstr "échec d'un blip." -#: load.py:766 +#: load.py:774 msgid "blip succeeded!" msgstr "blip rapporté!" -#: load.py:780 load.py:833 +#: load.py:788 load.py:841 msgid "Crime reporting disabled in solo/private modes." msgstr "Rapport de crime désactivé en mode Solo/Privé." -#: load.py:819 load.py:878 +#: load.py:827 load.py:886 msgid "failed to report crime." msgstr "crime non rapporté (échec)." -#: load.py:884 +#: load.py:892 msgid "Fight reporting disabled in solo/private modes." msgstr "Rapport de combat désactivé en mode Solo/Privé." -#: load.py:928 +#: load.py:936 msgid "failed to report contact." msgstr "contact non rapporté (échec)." -#: load.py:982 +#: load.py:990 msgid "Traffic reporting disabled in solo/private modes." msgstr "Rapport de traffic désactivé en mode Solo/Privé." -#: load.py:990 +#: load.py:998 msgid "failed to report traffic." msgstr "trafic non rapporté (échec)." -#: load.py:996 +#: load.py:1004 msgid "Multicrew reporting disabled in private mode." msgstr "Pas de rapport multicrew en mode privé." -#: load.py:1000 +#: load.py:1008 msgid "failed to report multicrew session." msgstr "crime équipage non rapporté (échec)." -#: load.py:1572 +#: load.py:1607 msgid "Call rejected: you seem to have enough fuel." msgstr "Appel rejeté: il semble que vous ayez assez de carburant." -#: load.py:1572 load.py:1576 +#: load.py:1607 load.py:1611 msgid "Contact Cmdr LeKeno if this is inaccurate" msgstr "Contactez Cmdr LeKeno si ceci est incorrect" -#: load.py:1576 +#: load.py:1611 msgid "Call rejected: you seem to have enough hull left." msgstr "" "Appel rejeté: il semble que votre coque n'est pas dans un état critique." -#: load.py:1611 -msgid "Loadout information is stale" -msgstr "Les informations ne sont pas à jour" - -#: load.py:1611 -msgid "Congrats, you've found a bug in Elite!" -msgstr "Félicitations! Vous avez trouvé un bug dans Elite!" - -#: load.py:1611 -msgid "The modules info isn't updated right away :(" -msgstr "Les informations de vos modules ne sont pas mises à jour de suite :(" - -#: load.py:1611 -msgid "Try again after moving around or relog and check your modules." -msgstr "" -"Essayez plus tard après avoir bougé ou reloguez et regardez vos modules." - #: randomtips.py:15 msgid "" "Situation reports (SITREPs) provide a summary of recent activity at a " @@ -4977,6 +5809,22 @@ msgstr "" #: randomtips.py:114 msgid "" +"[Odyssey] Send '!eval backpack' to get an assessment of items in your " +"backpack." +msgstr "" +"[Odyssey] Envoyez '!eval backpack' pour obtenir une évaluation du contenu de " +"votre sac-à-dos." + +#: randomtips.py:115 +msgid "" +"[Odyssey] Send '!eval locker' to get an assessment of items in your ship " +"locker." +msgstr "" +"[Odyssey] Envoyez '!eval locker' pour obtenir une évaluation du contenu de " +"votre stockage (vaisseau)." + +#: randomtips.py:116 +msgid "" "Send '!offbeat' to get a station whose info hasn't been updated recently and " "has a higher chance of carrying premium weapons/suits." msgstr "" @@ -4984,7 +5832,7 @@ msgstr "" "récemment pour accroire les chances de trouver des combinaison spatiales our " "des armes pré-upgradés." -#: randomtips.py:115 +#: randomtips.py:117 msgid "" "Send '!materials' to get a list of material profiles supported by EDR (e.g. " "synthesis for FSD, etc.)" @@ -4992,7 +5840,7 @@ msgstr "" "Enoyez '!materials' pour obtenir une liste des profils matériaux supportés " "par EDR (e.g. synthèse pour FSD, etc.)" -#: randomtips.py:116 +#: randomtips.py:118 msgid "" "Send '!rrrfc' to get a fleet carrier with repair, rearm, refuel in the " "current system. Double check docking access before proceeding." @@ -5001,7 +5849,7 @@ msgstr "" "réarmement, ravitaillement dans le système. Vérifiez les droits d'accès " "avant de vous dirigez dessus." -#: randomtips.py:117 +#: randomtips.py:119 msgid "" "Send '!rrrfc < 15' to get a fleet carrier with repair, rearm, refuel within " "15 LY of the current system. Double check docking access before proceeding." @@ -5010,7 +5858,7 @@ msgstr "" "réarmement, ravitaillement dans un rayon de 15 AL autour du système. " "Vérifiez les droits d'accès avant de vous dirigez dessus." -#: randomtips.py:118 +#: randomtips.py:120 msgid "" "Send '!rrrfc deciat' to get a fleet carrier with repair, rearm, refuel " "within the specified system (e.g. Deciat). Double check docking access " @@ -5020,7 +5868,7 @@ msgstr "" "réarmement, ravitaillement dans le système précisé (e.g. Deciat). Vérifiez " "les droits d'accès avant de vous dirigez dessus." -#: randomtips.py:119 +#: randomtips.py:121 msgid "" "Send '!rrr' to get a station with repair, rearm, refuel in the current " "system." @@ -5028,7 +5876,7 @@ msgstr "" "Envoyez '!rrr' pour obtenir un spatioport avec réparations, réarmement, " "ravitaillement dans le système." -#: randomtips.py:120 +#: randomtips.py:122 msgid "" "Send '!rrr < 15' to get a station with repair, rearm, refuel within 15 LY of " "the current system." @@ -5036,7 +5884,7 @@ msgstr "" "Envoyez '!rrr < 15' pour obtenir un spatioport avec réparations, réarmement, " "ravitaillement dans un rayon de 15 AL autour du système." -#: randomtips.py:121 +#: randomtips.py:123 msgid "" "Send '!rrr deciat' to get a station with repair, rearm, refuel within the " "specified system (e.g. Deciat)." @@ -5044,7 +5892,7 @@ msgstr "" "Envoyez '!rrr deciat' pour obtenir un spatioport avec réparations, " "réarmement, ravitaillement dans le système spécifié (e.g. Deciat)." -#: randomtips.py:122 +#: randomtips.py:124 msgid "" "Send 'When using EDR's search features, the system name will be placed in " "the clipboard. Hit Ctrl+V to paste the result." @@ -5052,7 +5900,7 @@ msgstr "" "Quand vous utilisez une fonctionnalité de recherche, EDR placera le nom du " "système dans le presse-papier. Utilisez Ctrl+V pour coller le résultat." -#: randomtips.py:125 +#: randomtips.py:127 msgid "" "Never fly what you can't afford to lose. Check your rebuy and credit balance " "on your right panel." @@ -5061,7 +5909,7 @@ msgstr "" "d'accident. Vérifiez votre coût de rachat et votre solde dans le panneau à " "droite." -#: randomtips.py:126 +#: randomtips.py:128 msgid "" "Never combat log in Open. If you aren't willing to accept the risk, don't " "bother with Open, Google 'Mobius PVE'." @@ -5070,7 +5918,7 @@ msgstr "" "pas prêt à courir le risque de perdre votre vaisseau, ne jouer pas en mode " "ouvert." -#: randomtips.py:127 +#: randomtips.py:129 msgid "" "Hit Ctrl+B to display a bandwidth meter. You are not alone if it goes over " "1000 B/s." @@ -5078,14 +5926,14 @@ msgstr "" "Ctrl + B permet d'afficher un moniteur de bande passante. Vous n'êtes pas " "seul s'il affiche plus de 1000 B/s." -#: randomtips.py:128 +#: randomtips.py:130 msgid "" "Regularly check your contact history in the top panel for known threats." msgstr "" "Vérifiez régulièrement l'historique des contacts dans le panneau haut afin " "de repérer des ennemis." -#: randomtips.py:129 +#: randomtips.py:131 msgid "" "[Planet] Dismiss your ship immediately after boarding your SRV. Outlaws will " "destroy it in seconds otherwise." @@ -5094,7 +5942,7 @@ msgstr "" "vaisseau au sol ne survivra pas suffisamment longtemps face à la puissance " "de feu d'un bandit." -#: randomtips.py:130 +#: randomtips.py:132 msgid "" "[Planet] Switch your SRV lights off if an outlaw shows up. Run far away " "before calling back your ship." @@ -5102,7 +5950,7 @@ msgstr "" "[Planète] Si un bandit arrive, éteignez les phares de votre SRV et roulez à " "fond le plus loi possible avant de rappeler votre vaisseau." -#: randomtips.py:131 +#: randomtips.py:133 msgid "" "[Planet] For new discoveries, land a bit away from the area of interest and " "dismiss your ship asap." @@ -5110,7 +5958,7 @@ msgstr "" "[Planète] Pour les nouvelles découvertes, atterrissez assez loin afin " "d'avoir le temps de renvoyer votre vaisseau malgré la présence d'hors la loi." -#: randomtips.py:132 +#: randomtips.py:134 msgid "" "[Explorers] Don't trust anyone, check a contact's loadout in your left panel " "before banding to take selfies." @@ -5118,7 +5966,7 @@ msgstr "" "[Explorateurs] Ne faites confiance à personne, vérifiez l'équipement d'un " "contact avant de passer à la séance selfie." -#: randomtips.py:133 +#: randomtips.py:135 msgid "" "[Explorers] On your trip back to the bubble, reach out to Iridium Wing for " "an escort." @@ -5126,7 +5974,7 @@ msgstr "" "[Explorateurs] Pour revenir vers la bulle en sécurité, demandez une escorte " "à l'Iridium Wing." -#: randomtips.py:134 +#: randomtips.py:136 msgid "" "[Explorers] Throttle down to 0% when your jump completes to avoid bad " "surprises (e.g. neutron star, 2 stars close to each other)" @@ -5134,14 +5982,14 @@ msgstr "" "[Explorateurs] Réduisez la poussée à chaque saut pour parer à toutes " "éventualités (e.g. étoile à neutrons)" -#: randomtips.py:135 +#: randomtips.py:137 msgid "" "[Traders] Don't be greedy, use your biggest slot for a shield not for cargo!" msgstr "" "[Marchands] Ne privilégiez jamais le profit avant votre sécurité: mettez un " "bouclier conséquent!" -#: randomtips.py:136 +#: randomtips.py:138 msgid "" "[Traders] Pledge for 4 weeks to Aisling Duval in order to get the stronger " "'prismatic shields'." @@ -5149,7 +5997,7 @@ msgstr "" "[Marchands] Alignez vous avec Aisling Duval pendant 4 semaines pour obtenir " "des boucliers plus robustes dits prismatiques." -#: randomtips.py:137 +#: randomtips.py:139 msgid "" "[Traders] Engineer regular shields with Thermal Resistance, shield boosters " "with Heavy Duty." @@ -5157,7 +6005,7 @@ msgstr "" "[Marchands] Améliorer vos boucliers avec une modification de résistance " "thermale, et vos survolteurs de boucliers avec une modification 'lourde'." -#: randomtips.py:138 +#: randomtips.py:140 msgid "" "[Traders] Engineer prismatic shields with Reinforced, even resistance % with " "Augmented Resistance on your shield boosters." @@ -5166,7 +6014,7 @@ msgstr "" "renforcement, et égalez les résistances sur vos survolteurs avec résistance " "augmentée." -#: randomtips.py:139 +#: randomtips.py:141 msgid "" "[Traders] Rares are special goods (e.g. Hutton Mug, Sothis Gold). The " "further you take them from where you buy them (up to 200ly) the more you get " @@ -5175,7 +6023,7 @@ msgstr "" "[Marchands] Les Rares sont des marchandises uniques dont le bénéfice accroit " "avec la distance, jusqu'à 200 années lumière, e.g. Hutton Mug, Sothis Gold." -#: randomtips.py:140 +#: randomtips.py:142 msgid "" "[Suicide trap] At busy stations, stay below 100 m/s or you will get killed " "by the station for colliding into a 'suicide eagle'." @@ -5184,7 +6032,7 @@ msgstr "" "s pour éviter de faire les frais d'une collision volontaire contre un " "vaisseau suicide, e.g. un Eagle avec quelques % de coque." -#: randomtips.py:141 +#: randomtips.py:143 msgid "" "[Suicide trap] Advanced trap: force shells may push you over the 100m/s safe " "speed limit. Watch out for wings/duo and cannons loadouts." @@ -5193,7 +6041,7 @@ msgstr "" "peuvent vous poussez au dessus des 100 m/s. Vérifiez qui est dans votre " "instance." -#: randomtips.py:142 +#: randomtips.py:144 msgid "" "[Anti-suicide trap] Buy an eagle, remove its shield, ram the suicide eagle " "before they destroy another ship." @@ -5202,7 +6050,7 @@ msgstr "" "entrez en collision avec l'Eagle suicidaire avant qu'il n'est le temps de " "faire de même." -#: randomtips.py:143 +#: randomtips.py:145 msgid "" "[Anti-suicide trap] Stay under 100 m/s and ram the suicide eagle before they " "destroy another ship." @@ -5210,7 +6058,7 @@ msgstr "" "[Contre-mesure piège suicide] Restez en dessous de 100 m/s et entrez en " "collision avec l'Eagle suicidaire pour lui dénier son opportunité." -#: randomtips.py:144 +#: randomtips.py:146 msgid "" "[Anti-suicide trap] Warn other commanders about the presence of a 'suicide " "eagle' as they approach or leave the station." @@ -5219,7 +6067,7 @@ msgstr "" "présence d'un Eagle suicidaire lorsqu'ils approchent ou quittent le " "spatioport." -#: randomtips.py:145 +#: randomtips.py:147 msgid "" "[Powerplay hunters] Watch out for powerplay hunters at stations in enemy " "territory: fighting back will get you wanted." @@ -5228,7 +6076,7 @@ msgstr "" "particulier aux abords d'un spatioport. Vous risquez de devenir recherché si " "vous essayez de vous défendre." -#: randomtips.py:146 +#: randomtips.py:148 msgid "" "[Anarchy] Watch for suspicious pilots, they can safely hunt/ram you even if " "you are clean (station and security won't retaliate)." @@ -5236,7 +6084,7 @@ msgstr "" "[Anarchie] Dans un système anarchiste, ne comptez pas sur les statioports " "pour vous défendre en cas d'attaque par un autre commandant." -#: randomtips.py:147 +#: randomtips.py:149 msgid "" "[Station] The station fires back when hit. Use that to your advantage: stay " "close to the structure, chaff, etc." @@ -5245,7 +6093,7 @@ msgstr "" "cela à votre avantage en restant près de la structure et en lançant des " "pailletes." -#: randomtips.py:148 +#: randomtips.py:150 msgid "" "[Station] The no-fire zone is a misnomer: players can and will fire at you " "at the cost of a small fine." @@ -5254,7 +6102,7 @@ msgstr "" "Les autres commandants peuvent toujours vous tirez dessus pour une modique " "amende." -#: randomtips.py:149 +#: randomtips.py:151 msgid "" "[Escape] Bind a key/button to 'select next route' to quickly target your " "escape route." @@ -5262,7 +6110,7 @@ msgstr "" "[S'échapper] Configurez la commande qui permet cibler le prochain système de " "l'itinéraire." -#: randomtips.py:150 +#: randomtips.py:152 msgid "" "[Escape] It is safer and faster to jump to a different system than going " "back to supercruise (i.e. 'high waking' is not subject to mass lock)." @@ -5270,7 +6118,7 @@ msgstr "" "[S'échapper] Sauter vers un autre système est plus rapide et sur (i.e. vous " "ne serez pas affecté par les effets de masse)." -#: randomtips.py:151 +#: randomtips.py:153 msgid "" "[Interdiction] Do NOT attempt to win a player interdiction, instead submit " "to get a faster FSD cooldown." @@ -5278,7 +6126,7 @@ msgstr "" "[Interdiction] N'essayez pas de gagner une interdiction à tout prix. En vous " "soumettant à une interdiction votre FSD se rechargera plus vite." -#: randomtips.py:152 +#: randomtips.py:154 msgid "" "[Interdiction] Type-7's have a high yaw rate which comes handy when fighting " "interdictions." @@ -5286,7 +6134,7 @@ msgstr "" "[Interdiction] Le lacet des Type-7 est très utile pour combattre les " "interdictions." -#: randomtips.py:153 +#: randomtips.py:155 msgid "" "[Community Goal] Consider setting camp at a nearby system with a decent " "station instead of going straight for the CG system/station" @@ -5295,7 +6143,7 @@ msgstr "" "un système voisin au lieu d'aller directement au système théâtre de " "l'opération communautaire" -#: randomtips.py:154 +#: randomtips.py:156 msgid "" "[Community Goal] Drop just before being interdicted, throttle to zero, " "charge your FSD, boost when the player shows up. Repeat." @@ -5304,7 +6152,7 @@ msgstr "" "espace normal, mettez la poussée à zéro, chargez votre FSD, accélérez dès " "que l'autre commandant se pointe. Répétez jusqu'à votre arrivée." -#: randomtips.py:155 +#: randomtips.py:157 msgid "" "[Supercruise] Don't supercruise straight to the station, take a curve above " "the plane: faster and safer." @@ -5313,7 +6161,7 @@ msgstr "" "navigation. Prenez une courbe au dessus du plan, c'est au final plus rapide " "et plus sur." -#: randomtips.py:156 +#: randomtips.py:158 msgid "" "[Supercruise] Go around planets and other stellar objects as they will slow " "you down." @@ -5321,7 +6169,7 @@ msgstr "" "[Super-navigation] Utilisez les champs de gravitation pour décélérer plus " "rapidement." -#: randomtips.py:157 +#: randomtips.py:159 msgid "" "[Supercruise] 'Ride the 6': keep max speed until the countdown reaches 6 " "seconds, then middle of the blue zone." @@ -5329,7 +6177,7 @@ msgstr "" "[Super-navigation] 'Surfez le 6': lorsque le temps d'arrivée atteint 6 " "secondes, réduisez votre vitesse jusqu'au milieu de la zone bleue." -#: randomtips.py:158 +#: randomtips.py:160 msgid "" "[Supercruise] If your destination is near a planet, have the planet behind " "you and use its gravity well to slow you down." @@ -5337,7 +6185,7 @@ msgstr "" "[Super-navigation] Si votre destination se situe près d'une planète, faîtes " "en sort que la planète soit derrière vous afin de ralentir plus rapidement." -#: randomtips.py:159 +#: randomtips.py:161 msgid "" "[Combat] Put all 4 pips to SYS when being fired upon; move them where needed " "when not fired upon." @@ -5345,7 +6193,7 @@ msgstr "" "[Combat] Répartissez 4 pips dans SYS si vous êtes sous le feu, répartissez " "suivant les besoins lorsque vous n'êtes pas la cible principale." -#: randomtips.py:160 +#: randomtips.py:162 msgid "" "[Combat] Don't fly in a straight line, you'll die if you do. Be evasive: " "combine rolls, turns, thrusters, boost and Fligh Assist Off." @@ -5353,7 +6201,7 @@ msgstr "" "[Combat] Ne volez pas en ligne droite. Faîtes des manœuvres évasives: " "roulis, tangage, poussée latérale et verticale, boost, etc." -#: randomtips.py:161 +#: randomtips.py:163 msgid "" "[Combat] When shields drop, target specific modules. In particular: power " "plant, drives, biweave shields, weapons." @@ -5361,7 +6209,7 @@ msgstr "" "[Combat] Après avoir supprimé le bouclier, ciblez des module spécifiques: " "générateur, moteurs, générateur de bouclier, armes." -#: randomtips.py:162 +#: randomtips.py:164 #, python-format msgid "" "[Combat] Double shield cell banking: fire first cell, wait for 90% heat, " @@ -5371,13 +6219,13 @@ msgstr "" "première cellule, 90% en température, dissipateur, chute rapide de la " "température, deuxième cellule." -#: randomtips.py:163 +#: randomtips.py:165 msgid "[Combat] Railgun with feedback cascade can counter shield cell banking." msgstr "" "[Combat] Les cannons électriques avec l'effet cascade peuvent nullifier " "l'apport des cellules de boucliers." -#: randomtips.py:164 +#: randomtips.py:166 msgid "" "[Combat] Best time to fire your shield cell is when you are at 1 / 1.5 ring " "and right in front of your opponent just as you are about to fly past them." @@ -5385,7 +6233,7 @@ msgstr "" "[Combat] Le meilleur moment pour utiliser une cellule c'est lorsque vous " "êtes à 1 ou 1.5 anneaux de bouclier et lors d'une passe." -#: randomtips.py:165 +#: randomtips.py:167 msgid "" "[Interdicted] Put 4 pips to SYS, 2 to ENG and fly evasive. Hit next route " "and high wake asap, do not fly in a straight line." @@ -5393,12 +6241,12 @@ msgstr "" "[Interdiction] Mettez 4 pips dans SYS, 2 dans MOT et volez en mode évasif. " "Sélectionner un autre système et faîtes un saut hyper-espace." -#: randomtips.py:166 +#: randomtips.py:168 msgid "[Pirates] Follow their instructions and you will avoid a certain death." msgstr "" "[Pirates] Suivez leurs instructions et vous éviterez une mort certaine." -#: randomtips.py:167 +#: randomtips.py:169 msgid "" "[Fuel] Mnemonics for fuel scoopable stars: KGB FOAM or 'Oh Be A Fine Girl " "Kiss Me'." @@ -5406,13 +6254,13 @@ msgstr "" "[Fuel] Mnémonique pour les étoiles de ravitaillement: KGB FOAM ou 'Oh Be A " "Fine Girl Kiss Me'." -#: randomtips.py:168 +#: randomtips.py:170 msgid "[Fuel] Out of fuel? Call the fuel rats (https://fuelrats.com/)." msgstr "" "[Carburant] Plus de carburant? Appelez les 'fuel rats' à la rescousse: " "https://fuelrats.com/." -#: randomtips.py:169 +#: randomtips.py:171 msgid "" "[Bounty hunting] Don't steal kills. Instead, ask to join a wing: everyone " "will get the same bounty and way faster." @@ -5420,7 +6268,7 @@ msgstr "" "[Chasse à la prime] N'hésitez pas à demander de rejoindre une esquadrille: " "tous les membres recevront la prime en entier mais plus rapidement." -#: randomtips.py:170 +#: randomtips.py:172 msgid "" "[Community] Most players are just nice folks. Chat with people, make " "friends. It might come handy." @@ -5428,19 +6276,19 @@ msgstr "" "[Communauté] La plupart des pilotes sont sympa, n'hésitez pas à chatter et " "vous faire des amis." -#: randomtips.py:171 +#: randomtips.py:173 msgid "[Defense] Fit Point Defenses to your ship to destroy missiles and mines" msgstr "" "[Défenses] Equipez des défenses ponctuelles afin de détruire les mines et " "missiles" -#: randomtips.py:172 +#: randomtips.py:174 msgid "" "[Defense] Like the song says you've got to know when to walk away and know " "when to run." msgstr "[Défense] Sachez quand il vaut mieux prendre la poudre d'escampette." -#: randomtips.py:173 +#: randomtips.py:175 #, python-format msgid "" "[Mining] Limit your cargo (e.g. LTD) to be within 10% of the demand of a " @@ -5509,9 +6357,6 @@ msgstr "" #~ msgid "not in Open? Start EDMC before Elite." #~ msgstr "pas en 'Jeu Ouvert'? Avez vous bien lancé EDMC avant Elite?" -#~ msgid "Signal insights" -#~ msgstr "Analyse du signal" - #~ msgid "Datamined Wake Exception (Distribution Center, {})" #~ msgstr "Datamined Wake Exception (Centre de distribution, {})" @@ -5553,9 +6398,6 @@ msgstr "" #~ msgid "traffic reported (cmdr {name})." #~ msgstr "trafic rapporté (cmd {name})." -#~ msgid "Neutral" -#~ msgstr "Neutre" - #~ msgid "Enforcer" #~ msgstr "Vigile" diff --git a/edr/load.py b/edr/load.py index 50cfd3cd..6f3f4021 100644 --- a/edr/load.py +++ b/edr/load.py @@ -444,6 +444,11 @@ def handle_friends_events(ed_player, entry): elif entry["Status"] == "Offline": ed_player.deinstanced_player(entry["Name"]) +def handle_engineer_progress(ed_player, entry): + if entry["event"] != "EngineerProgress": + return + ed_player.engineers.update(entry) + def handle_powerplay_events(ed_player, entry): if entry["event"] == "Powerplay": EDRLOG.log(u"Initial powerplay event: {}".format(entry), "DEBUG") @@ -616,7 +621,10 @@ def journal_entry(cmdr, is_beta, system, station, entry, state): if entry["event"] == "Friends": handle_friends_events(ed_player, entry) - if entry["event"] in ["Materials", "MaterialCollected", "MaterialDiscarded", "EngineerContribution", "EngineerCraft", "MaterialTrade", "MissionCompleted", "ScientificResearch", "TechnologyBroker", "Synthesis"]: + if entry["event"] == "EngineerProgress": + handle_engineer_progress(ed_player, entry) + + if entry["event"] in ["Materials", "MaterialCollected", "MaterialDiscarded", "EngineerContribution", "EngineerCraft", "MaterialTrade", "MissionCompleted", "ScientificResearch", "TechnologyBroker", "Synthesis", "Backpack", "BackpackChange", "BuyMicroResources", "SellMicroResources", "TransferMicroResources", "TradeMicroResources", "ShipLockerMaterials", "ShipLocker"]: handle_material_events(ed_player, entry, state) if entry["event"] == "StoredShips": @@ -776,7 +784,7 @@ def edr_submit_crime(criminal_cmdrs, offence, victim, timestamp): """ #TODO sort out ship and suit... if not victim.in_open(): - EDRLOG.log(u"Skipping submit crime (wing) due to unconfirmed Open mode", "INFO") + EDRLOG.log(u"Skipping submit crime due to unconfirmed Open mode", "INFO") EDR_CLIENT.status = _(u"Crime reporting disabled in solo/private modes.") return @@ -1351,11 +1359,13 @@ def handle_scan_events(player, entry): return True def handle_material_events(cmdr, entry, state): + if entry["event"] in ["Materials", "ShipLockerMaterials"] or (entry["event"] == "ShipLocker" and len(entry.keys()) > 2) or (entry["event"] == "Backpack" and len(entry.keys()) > 2): + cmdr.inventory.initialize(entry) + if cmdr.inventory.stale_or_incorrect(): cmdr.inventory.initialize_with_edmc(state) - if entry["event"] == "Materials": - cmdr.inventory.initialize(entry) - elif entry["event"] == "MaterialCollected": + + if entry["event"] == "MaterialCollected": cmdr.inventory.collected(entry) elif entry["event"] == "MaterialDiscarded": cmdr.inventory.discarded(entry) @@ -1370,7 +1380,33 @@ def handle_material_events(cmdr, entry, state): cmdr.inventory.traded(entry) elif entry["event"] == "MissionCompleted": cmdr.inventory.rewarded(entry) - + EDR_CLIENT.eval_locker(passive=True) + elif entry["event"] == "BackpackChange": + cmdr.inventory.backpack_change(entry) + if "Added" in entry: + added = [cmdr.inventory.oneliner(item["Name"], from_backpack=True) for item in entry["Added"] if not(cmdr.engineers.is_useless(item["Name"]) or cmdr.engineers.is_unnecessary(item["Name"])) or "MissionID" in item] + discardable = [cmdr.inventory.oneliner(item["Name"], from_backpack=True) for item in entry["Added"] if cmdr.engineers.is_useless(item["Name"]) and not cmdr.engineers.is_unnecessary(item["Name"]) and "MissionID" not in item] + unnecessary = [cmdr.inventory.oneliner(item["Name"], from_backpack=True) for item in entry["Added"] if cmdr.engineers.is_unnecessary(item["Name"]) and "MissionID" not in item] + details = [", ".join(added)] + if discardable: + details.append(_(u"Useless: {}").format(", ".join(discardable))) + if unnecessary: + details.append(_(u"Unnecessary: {}").format(", ".join(unnecessary))) + EDR_CLIENT.notify_with_details("Materials Info", details) + elif "Removed" in entry: + EDR_CLIENT.eval_backpack(passive=True) + elif entry["event"] == "SellMicroResources": + cmdr.inventory.sold(entry) + EDR_CLIENT.eval_locker(passive=True) + elif entry["event"] == "BuyMicroResources": + cmdr.inventory.bought(entry) + elif entry["event"] == "TransferMicroResources": + cmdr.inventory.bought(entry) + EDR_CLIENT.eval_backpack(passive=True) + elif entry["event"] == "TradeMicroResources": + cmdr.inventory.traded(entry) + EDR_CLIENT.eval_locker(passive=True) + def handle_commands(cmdr, entry): if not entry["event"] == "SendText": return @@ -1554,7 +1590,6 @@ def handle_bang_commands(cmdr, command, command_parts): override_sc_dist = None if len(command_parts) >= 2: parameters = [param.strip() for param in " ".join(command_parts[1:]).split("< ", 1)] - print(parameters) search_center = parameters[0] or cmdr.star_system override_sc_dist = int(parameters[1]) if len(parameters) > 1 else None EDR_CLIENT.offbeat_station_near(search_center, override_sc_dist) @@ -1605,10 +1640,7 @@ def handle_bang_commands(cmdr, command, command_parts): elif command == "!eval" and len(command_parts) == 2: eval_type = command_parts[1] EDRLOG.log(u"Eval command for {}".format(eval_type), "INFO") - if EDR_CLIENT.player.mothership.update_modules(): - EDR_CLIENT.eval_build(eval_type) - else: - EDR_CLIENT.notify_with_details(_(u"Loadout information is stale"), [_(u"Congrats, you've found a bug in Elite!"), _(u"The modules info isn't updated right away :("), _(u"Try again after moving around or relog and check your modules.")]) + EDR_CLIENT.eval(eval_type) elif command == "!contracts" and len(command_parts) == 1: EDRLOG.log(u"Contracts command", "INFO") EDR_CLIENT.contracts() diff --git a/edr/randomtips.py b/edr/randomtips.py index 5fbc5fc0..9117a601 100644 --- a/edr/randomtips.py +++ b/edr/randomtips.py @@ -111,6 +111,8 @@ def _(message): return message _(u"Send '!ship fdl' to find out where you've parked your Fer-de-Lance."), _(u"Send '!ship In Front Of Things' to find out where you've parked your ship named 'In Front of Things'."), _(u"Send '!eval power' to get an assessment of your power priorities."), + _(u"[Odyssey] Send '!eval backpack' to get an assessment of items in your backpack."), + _(u"[Odyssey] Send '!eval locker' to get an assessment of items in your ship locker."), _(u"Send '!offbeat' to get a station whose info hasn't been updated recently and has a higher chance of carrying premium weapons/suits."), _(u"Send '!materials' to get a list of material profiles supported by EDR (e.g. synthesis for FSD, etc.)"), _(u"Send '!rrrfc' to get a fleet carrier with repair, rearm, refuel in the current system. Double check docking access before proceeding."),