You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
2.9 KiB
C++
104 lines
2.9 KiB
C++
#ifndef _GAME_CELL_STORE_H
|
|
#define _GAME_CELL_STORE_H
|
|
|
|
/*
|
|
Cell storage.
|
|
|
|
Used to load, look up and store all references in a single cell.
|
|
|
|
Depends on esm/loadcell.hpp (loading from ESM) and esm_store.hpp
|
|
(looking up references.) Neither of these modules depend on us.
|
|
*/
|
|
|
|
#include "esm_store/store.hpp"
|
|
#include "esm/records.hpp"
|
|
#include "mangle/tools/str_exception.hpp"
|
|
#include <list>
|
|
|
|
namespace ESMS
|
|
{
|
|
using namespace ESM;
|
|
|
|
/// A reference to one object (of any type) in a cell.
|
|
template <typename X>
|
|
struct LiveCellRef
|
|
{
|
|
// The object that this instance is based on.
|
|
const X* base;
|
|
|
|
/* Information about this instance, such as 3D location and
|
|
rotation and individual type-dependent data.
|
|
*/
|
|
CellRef ref;
|
|
|
|
/* Pointer to any user-defined or engine-specific object. Eg. a
|
|
Sound object for sound sources.
|
|
*/
|
|
void *custom;
|
|
};
|
|
|
|
/// A list of cell references
|
|
template <typename X>
|
|
struct CellRefList
|
|
{
|
|
typedef LiveCellRef<X> LiveRef;
|
|
std::list<LiveRef> list;
|
|
|
|
// Search for the given reference in the given reclist from
|
|
// ESMStore. Insert the reference into the list if a match is
|
|
// found. If not, throw an exception.
|
|
template <typename Y>
|
|
void find(CellRef &ref, Y recList)
|
|
{
|
|
const X* obj = recList.find(ref.refID);
|
|
if(obj == NULL)
|
|
throw str_exception("Error resolving cell reference " + ref.refID);
|
|
|
|
LiveRef lr;
|
|
lr.ref = ref;
|
|
lr.base = obj;
|
|
lr.custom = NULL;
|
|
|
|
list.push_back(lr);
|
|
}
|
|
};
|
|
|
|
/// A storage struct for one single cell reference.
|
|
struct CellStore
|
|
{
|
|
// Lists for each individual object type
|
|
CellRefList<Activator> activators;
|
|
CellRefList<Potion> potions;
|
|
CellRefList<Apparatus> appas;
|
|
CellRefList<Armor> armors;
|
|
CellRefList<Book> books;
|
|
CellRefList<Clothing> clothes;
|
|
CellRefList<Container> containers;
|
|
CellRefList<Creature> creatures;
|
|
CellRefList<Door> doors;
|
|
CellRefList<Ingredient> ingreds;
|
|
CellRefList<CreatureLevList> creatureLists;
|
|
CellRefList<ItemLevList> itemLists;
|
|
CellRefList<Light> lights;
|
|
CellRefList<Tool> lockpicks;
|
|
CellRefList<Misc> miscItems;
|
|
CellRefList<NPC> npcs;
|
|
CellRefList<Tool> probes;
|
|
CellRefList<Tool> repairs;
|
|
CellRefList<Static> statics;
|
|
CellRefList<Weapon> weapons;
|
|
|
|
/** Look up and load an interior cell from the given ESM data
|
|
storage. */
|
|
void loadInt(const std::string &name, const ESMStore &data, ESMReader &esm);
|
|
|
|
/** Ditto for exterior cell. */
|
|
void loadExt(int X, int Y, const ESMStore &data, ESMReader &esm);
|
|
|
|
private:
|
|
void loadRefs(const Cell &cell, const ESMStore &data, ESMReader &esm);
|
|
};
|
|
}
|
|
|
|
#endif
|