Files
starruler-linux/source/game/obj/blueprint.h
T
2018-07-17 14:15:37 +02:00

115 lines
3.2 KiB
C++

#pragma once
#include "design/effector.h"
#include "design/design.h"
#include "util/basic_type.h"
#include "util/hex_grid.h"
class SaveMessage;
enum HexFlags {
HF_Active = 0x1,
HF_Destroyed = 0x2,
HF_NoHP = 0x4,
HF_Gone = 0x8,
HF_NoRepair = 0x10,
};
enum DamageFlags {
DF_DestroyedObject = 0x40000000,
};
namespace net {
struct Message;
};
class CScriptAny;
class Blueprint {
public:
struct HexStatus {
unsigned char flags;
unsigned char hp;
};
struct SysStatus {
unsigned short workingHexes;
EffectStatus status;
};
const Design* design;
HexStatus* hexes;
SysStatus* subsystems;
BasicType* states;
double* effectorStates;
EffectorTarget* effectorTargets;
double currentHP;
double quadrantHP[4];
float removedHP;
double shipEffectiveness;
unsigned statusID;
unsigned short destroyedHexes;
bool designChanged;
bool hpDelta;
bool holdFire;
float hpFactor;
vec2i repairingHex;
CScriptAny** data;
HexStatus* getHexStatus(unsigned index);
HexStatus* getHexStatus(unsigned x, unsigned y);
SysStatus* getSysStatus(unsigned index);
SysStatus* getSysStatus(unsigned x, unsigned y);
CScriptAny* getHookData(unsigned index);
Blueprint();
void destroy(Object* obj);
void preClear();
~Blueprint();
void init(Object* obj);
float think(Object* obj, double time);
void ownerChange(Object* obj, Empire* prevEmpire, Empire* newEmpire);
bool hasTagActive(int index);
double getTagEfficiency(int index, bool ignoreInactive = true);
double getEfficiencySum(int variable, int tag = -1, bool ignoreInactive = true);
double getEfficiencyFactor(int variable, int tag = -1, bool ignoreInactive = true);
bool doesAutoTarget(Object* obj, Object* target);
bool canTarget(Object* obj, Object* target);
void target(Object* obj, Object* target, TargetFlags flags = TF_Target);
void target(Object* obj, unsigned efftrIndex, Object* target, TargetFlags flags = TF_Target);
void target(Object* obj, const Subsystem* sys, Object* target, TargetFlags flags = TF_Target);
void clearTracking(Object* obj);
Object* getCombatTarget();
vec3d getOptimalFacing(int sysVariable, int tag = -1, bool ignoreInactive = true);
void damage(Object* obj, DamageEvent& evt, const vec2u& hex);
void damage_internal(Object* obj, DamageEvent& evt, const vec2u& hex);
void damage(Object* obj, DamageEvent& evt, const vec2u& hex, HexGridAdjacency dir, bool runGlobal);
void damage(Object* obj, DamageEvent& evt, const vec2u& hex, bool runGlobal);
bool globalDamage(Object* obj, DamageEvent& evt);
void damage(Object* obj, DamageEvent& evt, const vec2d& direction);
void damage(Object* obj, DamageEvent& evt, double position, const vec2d& direction);
void damage(Object* obj, DamageEvent& evt, const vec2u& position, const vec2d& endPoint);
void create(Object* obj, const Design* design);
void start(Object* obj, bool fromRetrofit = false);
void retrofit(Object* obj, const Design* design);
double repair(Object* obj, double amount);
double repair(Object* obj, const vec2u& hex, double amount);
void sendDetails(Object* obj, net::Message& msg);
void recvDetails(Object* obj, net::Message& msg);
bool sendDelta(Object* obj, net::Message& msg);
void recvDelta(Object* obj, net::Message& msg);
void save(Object* obj, SaveMessage& file);
void load(Object* obj, SaveMessage& file);
};