warzone2100/src/researchdef.h

124 lines
7.1 KiB
C++

/*
This file is part of Warzone 2100.
Copyright (C) 1999-2004 Eidos Interactive
Copyright (C) 2005-2013 Warzone 2100 Project
Warzone 2100 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 2 of the License, or
(at your option) any later version.
Warzone 2100 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 Warzone 2100; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
/** \file
* Definitions for research data.
*/
#ifndef __INCLUDED_RESEARCHDEF_H__
#define __INCLUDED_RESEARCHDEF_H__
#include <QtCore/QStringList>
#include "lib/framework/frame.h"
#include "statsdef.h"
/* Research struct type definitions */
enum TECH_CODE
{
TC_MAJOR,
TC_MINOR,
};
struct RES_COMP_REPLACEMENT
{
COMPONENT_STATS *pOldComponent;
COMPONENT_STATS *pNewComponent;
};
struct RESEARCH : public BASE_STATS
{
UBYTE techCode;
UWORD subGroup; /* Subgroup of the item - an iconID from 'Framer' to depict in the button*/
UWORD researchPoints; /* Number of research points required to
complete the research */
UDWORD researchPower; /* Power cost to research */
UBYTE keyTopic; /* Flag to indicate whether in single player
this topic must be explicitly enabled*/
std::vector<UWORD> pPRList; ///< List of research pre-requisites
std::vector<UWORD> pStructList; ///< List of structures that when built would enable this research
std::vector<UWORD> pRedStructs; ///< List of Structures that become redundant
std::vector<COMPONENT_STATS *> pRedArtefacts; ///< List of Artefacts that become redundant
std::vector<UWORD> pStructureResults; ///< List of Structures that are possible after this research
QList<COMPONENT_STATS *> componentResults; ///< List of Components that are possible after this research
QList<RES_COMP_REPLACEMENT> componentReplacement; ///< List of Components that are automatically replaced with new onew after research
QStringList resultStrings; ///< List of hints to javascript interface how to deal with the research
const struct VIEWDATA *pViewData; // data used to display a message in the Intelligence Screen
UWORD iconID; /* the ID from 'Framer' for which graphic to draw in interface*/
BASE_STATS *psStat; /* A stat used to define which graphic is drawn instead of the two fields below */
iIMDShape *pIMD; /* the IMD to draw for this research topic */
iIMDShape *pIMD2; /* the 2nd IMD for base plates/turrets*/
int index; ///< Unique index for this research, set incrementally
RESEARCH() : pViewData(NULL), iconID(0), psStat(NULL), pIMD(NULL), pIMD2(NULL) {}
};
struct PLAYER_RESEARCH
{
UDWORD currentPoints; // If the research has been suspended then this value contains the number of points generated at the suspension/cancel point
// normally it is null
UBYTE ResearchStatus; // Bit flags ... see below
bool possible; ///< is the research possible ... so can enable topics vis scripts
};
#define STARTED_RESEARCH 0x01 // research in progress
#define CANCELLED_RESEARCH 0x02 // research has been canceled
#define RESEARCHED 0x04 // research is complete
#define CANCELLED_RESEARCH_PENDING 0x08 // research almost cancelled, waiting for GAME_RESEARCHSTATUS message to be processed.
#define STARTED_RESEARCH_PENDING 0x10 // research almost in progress, waiting for GAME_RESEARCHSTATUS message to be processed.
#define RESBITS (STARTED_RESEARCH|CANCELLED_RESEARCH|RESEARCHED)
#define RESBITS_PENDING_ONLY (STARTED_RESEARCH_PENDING|CANCELLED_RESEARCH_PENDING)
#define RESBITS_PENDING (RESBITS|RESBITS_PENDING_ONLY)
static inline bool IsResearchPossible(const PLAYER_RESEARCH* research)
{
return research->possible;
}
static inline void MakeResearchPossible(PLAYER_RESEARCH* research)
{
research->possible = true;
}
static inline bool IsResearchCompleted(PLAYER_RESEARCH const *x) { return (x->ResearchStatus & RESEARCHED) != 0; }
static inline bool IsResearchCancelled(PLAYER_RESEARCH const *x) { return (x->ResearchStatus & CANCELLED_RESEARCH) != 0; }
static inline bool IsResearchStarted(PLAYER_RESEARCH const *x) { return (x->ResearchStatus & STARTED_RESEARCH) != 0; }
/// Pending means not yet synchronised, so only permitted to affect the UI, not the game state.
static inline bool IsResearchCancelledPending(PLAYER_RESEARCH const *x) { return (x->ResearchStatus & RESBITS_PENDING_ONLY) != 0?
(x->ResearchStatus & CANCELLED_RESEARCH_PENDING) != 0:
(x->ResearchStatus & CANCELLED_RESEARCH) != 0; }
static inline bool IsResearchStartedPending(PLAYER_RESEARCH const *x) { return (x->ResearchStatus & RESBITS_PENDING_ONLY) != 0?
(x->ResearchStatus & STARTED_RESEARCH_PENDING) != 0:
(x->ResearchStatus & STARTED_RESEARCH) != 0; }
static inline void MakeResearchCompleted(PLAYER_RESEARCH *x) { x->ResearchStatus &= ~RESBITS_PENDING; x->ResearchStatus |= RESEARCHED; }
static inline void MakeResearchCancelled(PLAYER_RESEARCH *x) { x->ResearchStatus &= ~RESBITS_PENDING; x->ResearchStatus |= CANCELLED_RESEARCH; }
static inline void MakeResearchStarted(PLAYER_RESEARCH *x) { x->ResearchStatus &= ~RESBITS_PENDING; x->ResearchStatus |= STARTED_RESEARCH; }
/// Pending means not yet synchronised, so only permitted to affect the UI, not the game state.
static inline void MakeResearchCancelledPending(PLAYER_RESEARCH *x) { x->ResearchStatus &= ~RESBITS_PENDING_ONLY; x->ResearchStatus |= CANCELLED_RESEARCH_PENDING; }
static inline void MakeResearchStartedPending(PLAYER_RESEARCH *x) { x->ResearchStatus &= ~RESBITS_PENDING_ONLY; x->ResearchStatus |= STARTED_RESEARCH_PENDING; }
static inline void ResetPendingResearchStatus(PLAYER_RESEARCH *x) { x->ResearchStatus &= ~RESBITS_PENDING_ONLY; }
/// clear all bits in the status except for the possible bit
static inline void ResetResearchStatus(PLAYER_RESEARCH *x) { x->ResearchStatus &= ~RESBITS_PENDING; }
#endif // __INCLUDED_RESEARCHDEF_H__