#pragma once /************************************************************************ MeOS - Orienteering Software Copyright (C) 2009-2019 Melin Software HB This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Melin Software HB - software@melin.nu - www.melin.nu Eksoppsvägen 16, SE-75646 UPPSALA, Sweden ************************************************************************/ #include "oBase.h" #include "oRunner.h" #include class oTeam;//:public oBase {}; typedef oTeam* pTeam; typedef const oTeam* cTeam; const unsigned int maxRunnersTeam=32; class oTeam : public oAbstractRunner { public: enum ResultCalcCacheSymbol { RCCCourse, RCCSplitTime, RCCCardTimes, RCCCardPunches, RCCCardControls, RCCLast }; private: int getLegRunningTimeUnadjusted(int leg, bool multidayTotal) const; /** Return the total time the team has been resting (pursuit start etc.) up to the specified leg */ int getLegRestingTime(int leg) const; void speakerLegInfo(int leg, int specifiedLeg, int courseControlId, int &missingLeg, int &totalLeg, RunnerStatus &status, int &runningTime) const; void propagateClub(); protected: //pRunner Runners[maxRunnersTeam]; vector Runners; void setRunnerInternal(int k, pRunner r); static const int dataSize = 160; int getDISize() const {return dataSize;} BYTE oData[dataSize]; BYTE oDataOld[dataSize]; // Remove runner r by force and mark as need correction void correctRemove(pRunner r); // Update hash void changeId(int newId); struct TeamPlace { int p; // Day result int totalP; // Total result }; TeamPlace _places[maxRunnersTeam]; int _sortTime; int _sortStatus; RunnerStatus _cachedStatus; mutable vector< vector< vector > > resultCalculationCache; struct RogainingResult { RogainingResult() { reset(); } int points; int reduction; int overtime; void reset() { points = 0; reduction = 0; overtime = 0; } }; mutable pair tTeamPatrolRogainingAndVersion; string getRunners() const; bool matchTeam(int number, const wchar_t *s_lc) const; int tNumRestarts; //Number of restarts for team int getLegToUse(int leg) const; // Get the number of the actual // runner to consider for a given leg // Maps -1 to last runner void addTableRow(Table &table) const; bool inputData(int id, const wstring &input, int inputId, wstring &output, bool noUpdate); void fillInput(int id, vector< pair > &out, size_t &selected); /** Get internal data buffers for DI */ oDataContainer &getDataBuffers(pvoid &data, pvoid &olddata, pvectorstr &strData) const; public: /** Check the the main leg is set if any parallel is set. Returns true if corrections where made.*/ bool checkValdParSetup(); int getRanking() const; int classInstance() const override { return 0; // Not supported } void resetResultCalcCache() const; vector< vector > &getResultCache(ResultCalcCacheSymbol symb) const; void setResultCache(ResultCalcCacheSymbol symb, int leg, vector &data) const; void markClassChanged(int controlId); void setClub(const wstring &name) override; pClub setClubId(int clubId) override; /// Returns team fee (including participating runners fees) int getTeamFee() const; /** Remove runner from team (and from competition) @param askRemoveRunner ask if runner should be removed from cmp. Otherwise just do it. */ void removeRunner(gdioutput &gdi, bool askRemoveRunner, int runnerIx); // Get entry date of team wstring getEntryDate(bool dummy) const; // Get the team itself cTeam getTeam() const {return this;} pTeam getTeam() {return this;} int getRunningTime() const; /// Input data for multiday event void setInputData(const oTeam &t); /// Get total status for multiday event RunnerStatus getTotalStatus() const; void remove(); bool canRemove() const; void prepareRemove(); bool skip() const {return isRemoved();} void setTeamNoStart(bool dns, RunnerStatus dnsStatus); // Set DNS or CANCEL // If apply is triggered by a runner, don't go further than that runner. bool apply(bool sync, pRunner source, bool setTmpOnly); void quickApply(); void evaluate(bool sync); bool adjustMultiRunners(bool sync); int getRogainingPoints(bool multidayTotal) const; int getRogainingReduction() const; int getRogainingOvertime() const; int getRogainingPointsGross() const; int getRogainingPatrolPoints(bool multidayTotal) const; int getRogainingPatrolReduction() const; int getRogainingPatrolOvertime() const; void fillSpeakerObject(int leg, int courseControlId, int previousControlCourseId, bool totalResult, oSpeakerObject &spk) const; bool isRunnerUsed(int Id) const; void setRunner(unsigned i, pRunner r, bool syncRunner); pRunner getRunner(unsigned leg) const; int getNumRunners() const {return Runners.size();} int getNumAssignedRunners() const { int cnt = 0; for (auto &r : Runners) if (r) cnt++; return cnt; } void decodeRunners(const string &rns, vector &rid); void importRunners(const vector &rns); void importRunners(const vector &rns); int getPlace() const {return getLegPlace(-1, false);} int getTotalPlace() const {return getLegPlace(-1, true);} int getNumShortening() const; // Number of shortenings up to and including a leg int getNumShortening(int leg) const; wstring getDisplayName() const; wstring getDisplayClub() const; void setBib(const wstring &bib, int numericalBib, bool updateStartNo, bool setTmpOnly); int getLegStartTime(int leg) const; wstring getLegStartTimeS(int leg) const; wstring getLegStartTimeCompact(int leg) const; wstring getLegFinishTimeS(int leg) const; int getLegFinishTime(int leg) const; int getTimeAfter(int leg) const; //Get total running time after leg wstring getLegRunningTimeS(int leg, bool multidayTotal) const; int getLegRunningTime(int leg, bool multidayTotal) const; int getLegPrelRunningTime(int leg) const; wstring getLegPrelRunningTimeS(int leg) const; RunnerStatus getLegStatus(int leg, bool multidayTotal) const; const wstring &getLegStatusS(int leg, bool multidayTotal) const; wstring getLegPlaceS(int leg, bool multidayTotal) const; wstring getLegPrintPlaceS(int leg, bool multidayTotal, bool withDot) const; int getLegPlace(int leg, bool multidayTotal) const; static bool compareSNO(const oTeam &a, const oTeam &b); static bool compareName(const oTeam &a, const oTeam &b) {return a.sName &clsWithRef); static void convertClassWithReferenceToPatrol(oEvent &oe, const set &clsWithRef); void set(const xmlobject &xo); bool write(xmlparser &xml); oTeam(oEvent *poe, int id); oTeam(oEvent *poe); virtual ~oTeam(void); friend class oClass; friend class oRunner; friend class MeosSQL; friend class oEvent; };