StringTable Asset: Difference between revisions

From COD Engine Research
No edit summary
No edit summary
Line 9: Line 9:
[[Category:Ghosts]]
[[Category:Ghosts]]
StringTable assets are essentially the CoD engine's way of storing Excel tables for different types of data for different usages. This asset has existed on every CoD from the earliest Call of Duty 4 Alpha to Ghosts. The number of values is columnCount * rowCount. To get a particular cell index, follow this...
StringTable assets are essentially the CoD engine's way of storing Excel tables for different types of data for different usages. This asset has existed on every CoD from the earliest Call of Duty 4 Alpha to Ghosts. The number of values is columnCount * rowCount. To get a particular cell index, follow this...
desiredEntry = (columnCount * desiredRow) + desiredColumn;
<syntaxhighlight lang="cpp">
desiredEntry = (columnCount * desiredRow) + desiredColumn;
</syntaxhighlight>
== Call of Duty 4 & World at War ==
== Call of Duty 4 & World at War ==
This StringTable is about as simple as it gets.  
This StringTable is about as simple as it gets.  
struct StringTable
<syntaxhighlight lang="cpp">
{
struct StringTable
  const char *name;
{
  int columnCount;
  const char *name;
  int rowCount;
  int columnCount;
  const char **values;
  int rowCount;
};
  const char **values;
};
</syntaxhighlight>
== Modern Warfare 2 & 3 & Ghosts ==
== Modern Warfare 2 & 3 & Ghosts ==
struct StringEntry  
<syntaxhighlight lang="cpp">
{
struct StringEntry  
const char *value;
{
unsigned int hash;
  const char *value;
};
  unsigned int hash;  
};
struct StringTable  
 
{
struct StringTable  
const char *name;
{
int columnCount;
  const char *name;
int rowCount;
  int columnCount;
StringEntry *strings;
  int rowCount;
};
  StringEntry *strings;
};
</syntaxhighlight>
The hash in StringEntry can be generated by this function:
The hash in StringEntry can be generated by this function:
unsigned int hash(const char* str)
<syntaxhighlight lang="cpp">
{
unsigned int hash(const char* str)
    unsigned int hash = 0;
{
    
  unsigned int hash = 0;
    while(*str != 0)
 
        hash = tolower( *str++ ) + (31 * hash);
   while(*str != 0)
    hash = tolower( *str++ ) + (31 * hash);
    return hash;
 
}
  return hash;
}
</syntaxhighlight>
== Black Ops 1 & 2 ==
== Black Ops 1 & 2 ==
struct StringEntry
<syntaxhighlight lang="cpp">
{
struct StringEntry
const char *value;
{
unsigned int hash;
  const char *value;
};
  unsigned int hash;
};
struct StringTable
 
{
struct StringTable
const char *name;
{
int columnCount;
  const char *name;
int rowCount;
  int columnCount;
StringEntry *values;
  int rowCount;
unsigned __int16 *cellIndex;
  StringEntry *values;
};
  unsigned __int16 *cellIndex;
};
</syntaxhighlight>
The hash in StringEntry can be generated by this function:
The hash in StringEntry can be generated by this function:
unsigned int hash(const char* str)
<syntaxhighlight lang="cpp">
{
unsigned int hash(const char* str)
    unsigned int hash = 5381;
{
  unsigned int hash = 5381;
    while( *str != 0)
        hash = ((hash << 5) + hash) + *str++;
  while( *str != 0)
    hash = ((hash << 5) + hash) + *str++;
    return hash;
}
  return hash;
}
</syntaxhighlight>
== Source Format ==
== Source Format ==
StringTables are stored in "raw/" at optional paths as comma-seperated Excel tables, similar to below...
StringTables are stored in "raw/" at optional paths as comma-seperated Excel tables, similar to below...
<syntaxhighlight lang="cpp">
  entry1,entry2,entry3
  entry1,entry2,entry3
  entry4,entry5,entry6
  entry4,entry5,entry6
For example, take a look at "mp/clantagfeatures.csv" from Black Ops 1.
For example, take a look at "mp/clantagfeatures.csv" from Black Ops 1.
#Clan Tag Features,,,,,,,,,,,,,,,,
#Clan Tag Features,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
a0,b1,c2,d3,e4,f5,g6,h7,i8,j9,k10,l11,m12,n13,o14,p15,q16
a0,b1,c2,d3,e4,f5,g6,h7,i8,j9,k10,l11,m12,n13,o14,p15,q16
#INDX,#name,#unlocklvl,#unlockplvl,#cost,#type,#data,#nframes,#phase,#frame1,#frame2,#frame3,#frame4,#frame5,#frame6,#frame7,#frame8
#INDX,#name,#unlocklvl,#unlockplvl,#cost,#type,#data,#nframes,#phase,#frame1,#frame2,#frame3,#frame4,#frame5,#frame6,#frame7,#frame8
0,none,,,,tagcolor,,,,,,,,,,,
0,none,,,,tagcolor,,,,,,,,,,,
1,red,,13,250,tagcolor,1,,,,,,,,,,
1,red,,13,250,tagcolor,1,,,,,,,,,,
2,green,,13,250,tagcolor,2,,,,,,,,,,
2,green,,13,250,tagcolor,2,,,,,,,,,,
3,yellow,,13,250,tagcolor,3,,,,,,,,,,
3,yellow,,13,250,tagcolor,3,,,,,,,,,,
4,blue,,13,250,tagcolor,4,,,,,,,,,,
4,blue,,13,250,tagcolor,4,,,,,,,,,,
5,cyan,,13,250,tagcolor,5,,,,,,,,,,
5,cyan,,13,250,tagcolor,5,,,,,,,,,,
6,magenta,,13,250,tagcolor,6,,,,,,,,,,
6,magenta,,13,250,tagcolor,6,,,,,,,,,,
</syntaxhighlight>

Revision as of 17:22, 24 February 2014

StringTable assets are essentially the CoD engine's way of storing Excel tables for different types of data for different usages. This asset has existed on every CoD from the earliest Call of Duty 4 Alpha to Ghosts. The number of values is columnCount * rowCount. To get a particular cell index, follow this...

desiredEntry = (columnCount * desiredRow) + desiredColumn;

Call of Duty 4 & World at War

This StringTable is about as simple as it gets.

struct StringTable
{
  const char *name;
  int columnCount;
  int rowCount;
  const char **values;
};

Modern Warfare 2 & 3 & Ghosts

struct StringEntry 
{
  const char *value;
  unsigned int hash; 
};

struct StringTable 
{
  const char *name;
  int columnCount;
  int rowCount;
  StringEntry *strings;
};

The hash in StringEntry can be generated by this function:

unsigned int hash(const char* str)
{
  unsigned int hash = 0;

  while(*str != 0)
    hash = tolower( *str++ ) + (31 * hash);

  return hash;
}

Black Ops 1 & 2

struct StringEntry
{
  const char *value;
  unsigned int hash;
};

struct StringTable
{
  const char *name;
  int columnCount;
  int rowCount;
  StringEntry *values;
  unsigned __int16 *cellIndex;
};

The hash in StringEntry can be generated by this function:

unsigned int hash(const char* str)
{
  unsigned int hash = 5381;
	 
  while( *str != 0)
    hash = ((hash << 5) + hash) + *str++;
		 
  return hash;
}

Source Format

StringTables are stored in "raw/" at optional paths as comma-seperated Excel tables, similar to below...

 entry1,entry2,entry3
 entry4,entry5,entry6
For example, take a look at "mp/clantagfeatures.csv" from Black Ops 1.
#Clan Tag Features,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
a0,b1,c2,d3,e4,f5,g6,h7,i8,j9,k10,l11,m12,n13,o14,p15,q16
#INDX,#name,#unlocklvl,#unlockplvl,#cost,#type,#data,#nframes,#phase,#frame1,#frame2,#frame3,#frame4,#frame5,#frame6,#frame7,#frame8
0,none,,,,tagcolor,,,,,,,,,,,
1,red,,13,250,tagcolor,1,,,,,,,,,,
2,green,,13,250,tagcolor,2,,,,,,,,,,
3,yellow,,13,250,tagcolor,3,,,,,,,,,,
4,blue,,13,250,tagcolor,4,,,,,,,,,,
5,cyan,,13,250,tagcolor,5,,,,,,,,,,
6,magenta,,13,250,tagcolor,6,,,,,,,,,,