diff --git a/UnityScripts/scripts/Loaders/ArtLoader.cs b/UnityScripts/scripts/Loaders/ArtLoader.cs
index 3ace9dab..70ff7cd6 100644
--- a/UnityScripts/scripts/Loaders/ArtLoader.cs
+++ b/UnityScripts/scripts/Loaders/ArtLoader.cs
@@ -7,6 +7,8 @@
///
public class ArtLoader : Loader {
+ public const int BitMapHeaderSize=28;
+
///
/// The complete image file
///
diff --git a/UnityScripts/scripts/Loaders/GRLoader.cs b/UnityScripts/scripts/Loaders/GRLoader.cs
index dc24ae23..0862e38c 100644
--- a/UnityScripts/scripts/Loaders/GRLoader.cs
+++ b/UnityScripts/scripts/Loaders/GRLoader.cs
@@ -97,6 +97,58 @@ public GRLoader(int File)
LoadImageFile();
}
+ public GRLoader(string FileName, int ChunkNo)//For SS1 chunks of art
+ {
+ useOverrideAuxPalIndex=false;
+ OverrideAuxPalIndex=0 ;
+
+ if (!DataLoader.ReadStreamFile(BasePath+FileName, out ImageFileData))
+ {
+ Debug.Log("Unable to load " + BasePath+pathGR[FileToLoad]);
+ return;
+ }
+ else
+ {
+ DataLoader.Chunk art_ark;
+ DataLoader.LoadChunk(ImageFileData,ChunkNo, out art_ark);
+
+ switch ( art_ark.chunkContentType)
+ {
+ case 3://font //TODO
+ break;
+ case 2:
+ case 17:
+ NoOfImages=(int)DataLoader.getValAtAddress( art_ark.data,0,16);
+ ImageCache=new Texture2D[NoOfImages];
+ ImageFileDataLoaded=true;
+ for (int i=0; i0) && (Height >0))
+ {
+ if(CompressionType==4)
+ {//compressed
+ char[] outputImg;
+ // UncompressBitmap(art_ark+textureOffset+BitMapHeaderSize, outputImg,Height*Width);
+ UncompressBitmap(art_ark.data,textureOffset+BitMapHeaderSize, out outputImg,Height*Width);
+ ImageCache[i]=ArtLoader.Image(outputImg,0,Width,Height,"namehere",GameWorldController.instance.palLoader.Palettes[0],true);
+ }
+ else
+ {//Uncompressed
+ ImageCache[i]= ArtLoader.Image(art_ark.data,textureOffset+BitMapHeaderSize,Width,Height,"namehere",GameWorldController.instance.palLoader.Palettes[0],true);
+ }
+ }
+ }
+ break;
+ }
+
+ return;
+ }
+ }
+
public GRLoader(int File, string AuxPalToUse, int AuxPalIndex)
{
if (AuxPalIndex!=-1)
@@ -412,8 +464,9 @@ public Sprite RequestSprite(int index)
{//Still can't be loaded
return Resources.Load("Common/null");
}
- }
- return Sprite.Create(ImageCache[index],new Rect(0,0,ImageCache[index].width,ImageCache[index].height), new Vector2(0.5f, 0.0f));
+ }
+ return Sprite.Create(ImageCache[index],new Rect(0,0,ImageCache[index].width,ImageCache[index].height), new Vector2(0.5f, 0.0f));
+
}
}
diff --git a/UnityScripts/scripts/Loaders/ObjectLoader.cs b/UnityScripts/scripts/Loaders/ObjectLoader.cs
index 729765d1..b6bdfe23 100644
--- a/UnityScripts/scripts/Loaders/ObjectLoader.cs
+++ b/UnityScripts/scripts/Loaders/ObjectLoader.cs
@@ -7,12 +7,138 @@ public class ObjectLoader : Loader {
const int UW2 =2;
const int SHOCK =3;
+
+ //System Shock object classes
+ const int GUNS_WEAPONS = 0;
+ const int AMMUNITION = 1;
+ const int PROJECTILES= 2;
+ const int GRENADE_EXPLOSIONS= 3;
+ const int PATCHES= 4;
+ const int HARDWARE= 5;
+ const int SOFTWARE_LOGS= 6;
+ const int FIXTURES= 7;
+ const int GETTABLES_OTHER= 8;
+ const int SWITCHES_PANELS =9;
+ const int DOORS_GRATINGS= 10;
+ const int ANIMATED= 11;
+ const int TRAPS_MARKERS= 12;
+ const int CONTAINERS_CORPSES= 13;
+ const int CRITTERS= 14;
+
+ //System Shock object classes offsets. For this I will use their chunk offset value.
+ const int GUNS_WEAPONS_OFFSET= 4010;
+ const int AMMUNITION_OFFSET=4011;
+ const int PROJECTILES_OFFSET=4012;
+ const int GRENADE_EXPLOSIONS_OFFSET=4013; //a guess
+ const int PATCHES_OFFSET=4014;
+ const int HARDWARE_OFFSET= 4015;
+ const int SOFTWARE_LOGS_OFFSET=4016;
+ const int FIXTURES_OFFSET= 4017;
+ const int GETTABLES_OTHER_OFFSET=4018; //a guess
+ const int SWITCHES_PANELS_OFFSET=4019;
+ const int DOORS_GRATINGS_OFFSET=4020;
+ const int ANIMATED_OFFSET= 4021; //a guess?
+ const int TRAPS_MARKERS_OFFSET=4022;
+ const int CONTAINERS_CORPSES_OFFSET=4023;
+ const int CRITTERS_OFFSET=4024;
+ const int SURVELLANCE_OFFSET= 4043;
+
+
+
+
+ /*Some friendly array indices for shock objProperties array*/
+ //Software
+ const int SOFT_PROPERTY_VERSION= 0;
+ const int SOFT_PROPERTY_LOG= 9;
+ const int SOFT_PROPERTY_LEVEL =2;
+ //Buttons and panels
+
+ const int BUTTON_PROPERTY_TRIGGER =0;
+ const int BUTTON_PROPERTY_PUZZLE =1;
+ const int BUTTON_PROPERTY_COMBO =2;
+ const int BUTTON_PROPERTY_TRIGGER_2= 3;
+
+
+ //Trigger props
+ const int TRIG_PROPERTY_OBJECT =0;
+ const int TRIG_PROPERTY_TARGET_X =1;
+ const int TRIG_PROPERTY_TARGET_Y =2;
+ const int TRIG_PROPERTY_TARGET_Z =3;
+ const int TRIG_PROPERTY_FLAG =4;
+ const int TRIG_PROPERTY_VARIABLE =5;
+ const int TRIG_PROPERTY_VALUE =6;
+ const int TRIG_PROPERTY_OPERATION =7;
+ const int TRIG_PROPERTY_MESSAGE1 =8;
+ const int TRIG_PROPERTY_MESSAGE2 =9;
+ const int TRIG_PROPERTY_LIGHT_OP =3;
+ const int TRIG_PROPERTY_CONTROL_1 =4 ;
+ const int TRIG_PROPERTY_CONTROL_2 =5;
+ const int TRIG_PROPERTY_UPPERSHADE_1 =6;
+ const int TRIG_PROPERTY_LOWERSHADE_1 =7;
+ const int TRIG_PROPERTY_UPPERSHADE_2= 8;
+ const int TRIG_PROPERTY_LOWERSHADE_2 =9;
+
+ const int TRIG_PROPERTY_FLOOR =5 ;
+ const int TRIG_PROPERTY_CEILING =6;
+ const int TRIG_PROPERTY_SPEED =7 ;
+ const int TRIG_PROPERTY_TRIG_1 =5;
+ const int TRIG_PROPERTY_TRIG_2 =6;
+ const int TRIG_PROPERTY_EMAIL =9;
+ const int TRIG_PROPERTY_TYPE =8;
+
+ const int CONTAINER_CONTENTS_1= 0;
+ const int CONTAINER_CONTENTS_2 =1;
+ const int CONTAINER_CONTENTS_3= 2;
+ const int CONTAINER_CONTENTS_4= 3;
+ const int CONTAINER_WIDTH = 5;
+ const int CONTAINER_HEIGHT = 6;
+ const int CONTAINER_DEPTH =7;
+ const int CONTAINER_TOP = 8;
+ const int CONTAINER_SIDE = 9;
+
+ const int SCREEN_NO_OF_FRAMES= 0;
+ const int SCREEN_LOOP_FLAG= 1;
+ const int SCREEN_START= 2;
+ const int SCREEN_SURVEILLANCE_TARGET= 3;
+
+ const int WORDS_STRING_NO =0;
+ const int WORDS_FONT =1;
+ const int WORDS_SIZE =2;
+ const int WORDS_COLOUR= 3;
+
+ const int BRIDGE_X_SIZE= 0;
+ const int BRIDGE_Y_SIZE= 1;
+ const int BRIDGE_HEIGHT= 2;
+ const int BRIDGE_TOP_BOTTOM_TEXTURE =3;
+ const int BRIDGE_TOP_BOTTOM_TEXTURE_SOURCE= 4;
+ const int BRIDGE_SIDE_TEXTURE= 5;
+ const int BRIDGE_SIDE_TEXTURE_SOURCE =6;
+
+
+
+
+
+
+
///
/// The game objects currently in use.
///
//public ObjectInteraction[] ObjectInteractions;
public ObjectLoaderInfo[] objInfo;
+
+ struct xrefTable
+ {
+ public short tileX;// position
+ public short tileY;// position
+ public int next;
+ public int MstIndex;// into master object table
+ public int nextTile; //objects in next tile
+ public short duplicate;
+ public short duplicateAssigned;
+ public short duplicateNextAssigned;
+ };
+
///
/// Readies the object list. Requires the tilemap to be read in first
///
@@ -34,6 +160,273 @@ public void LoadObjectList(TileMap tileMap, char[] lev_ark)
}
+ public void LoadObjectListShock(TileMap tileMap, char[] lev_ark)
+ {
+
+ objInfo=new ObjectLoaderInfo[1600];
+ BuildObjectListShock(tileMap.Tiles, objInfo, tileMap.texture_map, lev_ark, tileMap.thisLevelNo);
+
+ setObjectTileXY(1,tileMap.Tiles,objInfo);
+
+ //setDoorBits(tileMap.Tiles,objInfo);
+ //setElevatorBits(tileMap.Tiles,objInfo);
+ //setTerrainChangeBits(tileMap.Tiles,objInfo);
+ //SetBullFrog(tileMap.Tiles,objInfo,tileMap.thisLevelNo);
+
+ }
+
+
+ //void BuildObjectListUW(TileInfo[,] LevelInfo, ObjectLoaderInfo[] objList,int[] texture_map, char[] lev_ark, int LevelNo)
+ bool BuildObjectListShock(TileInfo[,] LevelInfo, ObjectLoaderInfo[] objList, int[] texture_map,char[] archive_ark, int LevelNo)
+ {
+
+ short InUseFlag;
+ int ObjectClass;
+ int ObjectSubClass;
+ int ObjectSubClassIndex;
+
+ int[] MasterAddressLookup=new int[1600];
+ long address_pointer=4;
+
+ //unsigned char *archive_ark; //the full file.
+
+ DataLoader.Chunk xref_ark; //The crossref table
+ DataLoader.Chunk mst_ark; //The master table
+
+
+
+ if (!DataLoader.LoadChunk(archive_ark,LevelNo*100+4009,out xref_ark ))
+ {
+ return false;
+ }
+
+ xrefTable[] xref;
+ xref =new xrefTable[xref_ark.chunkUnpackedLength/10];
+ int i=0;
+ int xref_ptr=0;
+ //int xRefLength = (xref_ark.chunkUnpackedLength/10);
+
+
+ //Read in the xref table
+ for (i=0;i> 4) & 0xF, objList[MasterIndex].State & 0xF);
+ //fprintf(LOGFILE,"\tunk1 = %d", getValAtAddress(mst_ark, mstaddress_pointer + 24, 8));
+ //fprintf(LOGFILE,"\tunk2 = %d", getValAtAddress(mst_ark, mstaddress_pointer + 25, 8));
+ //fprintf(LOGFILE,"\tunk3 = %d\n", getValAtAddress(mst_ark, mstaddress_pointer + 26, 8));
+ switch (ObjectClass) //to get further properties specific to each class
+ {
+ case GUNS_WEAPONS:break;
+ case AMMUNITION:break;
+ case PROJECTILES:break;
+ case GRENADE_EXPLOSIONS:break;
+ case PATCHES:break;
+ case HARDWARE:break;
+ case SOFTWARE_LOGS:
+ {
+ lookUpSubClass(archive_ark, LevelInfo, LevelNo * 100 + SOFTWARE_LOGS_OFFSET, SOFTWARE_LOGS, SubClassLink, 9, xref, objList,texture_map, MasterIndex,LevelNo);
+ break;
+ }
+ case FIXTURES:
+ {
+ lookUpSubClass(archive_ark,LevelInfo, LevelNo * 100 + FIXTURES_OFFSET, FIXTURES, SubClassLink, 16, xref, objList, texture_map, MasterIndex, LevelNo);
+ break;
+ }
+ case GETTABLES_OTHER:
+ {
+ lookUpSubClass(archive_ark,LevelInfo, LevelNo * 100 + GETTABLES_OTHER_OFFSET, GETTABLES_OTHER, SubClassLink, 16, xref, objList, texture_map, MasterIndex, LevelNo);
+ break;
+ }
+ case SWITCHES_PANELS:
+ {
+ lookUpSubClass(archive_ark,LevelInfo, LevelNo * 100 + SWITCHES_PANELS_OFFSET, SWITCHES_PANELS, SubClassLink, 30, xref, objList, texture_map, MasterIndex, LevelNo);
+ break;
+ }
+ case DOORS_GRATINGS:
+ {
+ lookUpSubClass(archive_ark, LevelInfo,LevelNo * 100 + DOORS_GRATINGS_OFFSET, DOORS_GRATINGS, SubClassLink, 14, xref, objList, texture_map, MasterIndex, LevelNo) ;
+ break;
+ }
+ case ANIMATED:break;
+ case TRAPS_MARKERS:
+ {
+ lookUpSubClass(archive_ark,LevelInfo, LevelNo * 100 + TRAPS_MARKERS_OFFSET, TRAPS_MARKERS, SubClassLink, 28, xref, objList, texture_map, MasterIndex, LevelNo);
+ break;
+ }
+ case CONTAINERS_CORPSES:
+ {
+ lookUpSubClass(archive_ark,LevelInfo, LevelNo * 100 + CONTAINERS_CORPSES_OFFSET, CONTAINERS_CORPSES, SubClassLink, 21, xref, objList, texture_map, MasterIndex, LevelNo);
+ break;
+ }
+
+ case CRITTERS:
+ {
+ lookUpSubClass(archive_ark,LevelInfo, LevelNo * 100 + CRITTERS_OFFSET, CRITTERS, SubClassLink, 46, xref, objList, texture_map, MasterIndex, LevelNo);
+ break;
+ }
+ }
+ UniqueObjectName(objList[MasterIndex]);
+ }
+ else
+ {
+ objList[MasterIndex].InUseFlag=0;
+ //fprintf(LOGFILE,"\n\nInvalid item id!!\n");
+ }
+
+
+ mstaddress_pointer +=27;
+ }
+
+ //turn obj indices into master indices
+ for (int x=0;x<64;x++)
+ {
+ for(int y=0;y<64;y++)
+ {
+ if (LevelInfo[x,y].indexObjectList !=0)
+ {LevelInfo[x,y].indexObjectList= xref[LevelInfo[x,y].indexObjectList].MstIndex; }
+ }
+ }
+ return true;
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
///
@@ -670,12 +1063,12 @@ void SetBullFrog(TileInfo[,] LevelInfo, ObjectLoaderInfo[] objList,int LevelNo)
///calczyz
/// float *offX, float *offY, float *offZ,
- public Vector3 CalcObjectXYZ(int game, TileMap tileMap, TileInfo[,] LevelInfo, ObjectLoaderInfo[] objList, long index, int x, int y, short WallAdjust)
+ public Vector3 CalcObjectXYZ(string game, TileMap tileMap, TileInfo[,] LevelInfo, ObjectLoaderInfo[] objList, long index, int x, int y, short WallAdjust)
{
float offX= 0f; float offY= 0f; float offZ= 0f;
float ResolutionXY = 7.0f; // A tile has a 7x7 grid for object positioning.
float ResolutionZ = 128.0f; //UW has 127 posible z positions for an object in tile.
- if (game == SHOCK){ ResolutionXY = 256.0f; ResolutionZ = 256.0f; } //Shock has more "z" in it.
+ if (game == Loader.GAME_SHOCK){ ResolutionXY = 256.0f; ResolutionZ = 256.0f; } //Shock has more "z" in it.
float BrushX = 120f;
float BrushY = 120f;
@@ -688,7 +1081,7 @@ public Vector3 CalcObjectXYZ(int game, TileMap tileMap, TileInfo[,] LevelInfo, O
float zpos = objList[index].zpos;
float ceil = tileMap.CEILING_HEIGHT;
offZ = ((zpos / ResolutionZ) * (ceil)) * BrushZ;
- if ((game !=SHOCK) && (x<64) && (y<64))
+ if ((game !=Loader.GAME_SHOCK) && (x<64) && (y<64))
{//Adjust zpos by a fraction for objects on sloped tiles.
switch (LevelInfo[x,y].tileType)
{
@@ -780,7 +1173,7 @@ public Vector3 CalcObjectXYZ(int game, TileMap tileMap, TileInfo[,] LevelInfo, O
{//Adjust the object x,y to avoid clipping into walls.
switch (game)
{
- case SHOCK:
+ case Loader.GAME_SHOCK:
if (objList[index].x == 0){ offX = offX + 0.02f; }
if (objList[index].x == 128){offX = offX - 0.02f;}
if (objList[index].y == 0){offY = offY + 0.02f;}
@@ -826,7 +1219,7 @@ public static void RenderObjectList(ObjectLoader instance, TileMap tilemap, Game
{
if ((instance.objInfo[i].InUseFlag==1) || (UWEBase.EditorMode))
{
- Vector3 position = instance.CalcObjectXYZ(1,tilemap,tilemap.Tiles,instance.objInfo,i,instance.objInfo[i].tileX,instance.objInfo[i].tileY,1);
+ Vector3 position = instance.CalcObjectXYZ(_RES,tilemap,tilemap.Tiles,instance.objInfo,i,instance.objInfo[i].tileX,instance.objInfo[i].tileY,1);
instance.objInfo[i].instance = ObjectInteraction.CreateNewObject(tilemap, instance.objInfo[i],parent,position);
}
}
@@ -1181,4 +1574,1143 @@ public static ObjectLoaderInfo newObject(int item_id, int quality, int owner, in
}
+
+
+ void replaceLink(ref xrefTable[] xref, int tableSize, int indexToFind, int linkToReplace)
+ {//Replaces a link in the Sytem Shock linked list when removing duplicate items that are in two tiles per the xref/master table reconciliaton.
+ if ((indexToFind==0) && (linkToReplace ==0))
+ {return;}
+ for (int i=0; i>4 & 0x03]);
+ objList[objIndex].shockProperties[WORDS_SIZE] = fontID[FontNSize >> 4 & 0x03];
+ //fprintf(LOGFILE,"\nColour %d ", getValAtAddress(sub_ark, add_ptr + 0xA, 16));
+ objList[objIndex].shockProperties[WORDS_COLOUR] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0xA, 16);
+ //fprintf(LOGFILE,"\n\tVal 0x6: %d", getValAtAddress(sub_ark.data, add_ptr + 6, 16));
+ //fprintf(LOGFILE,"\n\tVal 0x8: %d", getValAtAddress(sub_ark.data, add_ptr + 8, 16));
+ //fprintf(LOGFILE,"\n\tVal 0xA: %d", getValAtAddress(sub_ark.data, add_ptr + 0xA, 16));
+ //fprintf(LOGFILE,"\n\tVal 0xC: %d", getValAtAddress(sub_ark.data, add_ptr + 0xC, 16));
+ //fprintf(LOGFILE,"\n\tVal 0xE: %d", getValAtAddress(sub_ark.data, add_ptr + 0xE, 16));
+ break;
+ }
+ case 6:
+ case 8:
+ case 9:
+ //fprintf(LOGFILE,"Screens:");
+ objList[objIndex].shockProperties[SCREEN_NO_OF_FRAMES] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 6, 16);
+ objList[objIndex].shockProperties[SCREEN_LOOP_FLAG] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 8, 16);
+ objList[objIndex].shockProperties[SCREEN_START] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0xC, 16);
+ //fprintf(LOGFILE,"\nNo of Frames: %d", objList[objIndex].shockProperties[SCREEN_NO_OF_FRAMES]);
+ //fprintf(LOGFILE,"\nLoop repeats: %d ", objList[objIndex].shockProperties[SCREEN_LOOP_FLAG]);
+ //fprintf(LOGFILE,"\nStart Frame: %d (from chunk 321) = %d", objList[objIndex].shockProperties[SCREEN_START], 321 + objList[objIndex].shockProperties[SCREEN_START]);
+ if ((objList[objIndex].shockProperties[SCREEN_START] >= 248) && (objList[objIndex].shockProperties[SCREEN_START] <= 255))
+ {//Survellance
+ //unsigned char *sur_ark;
+ DataLoader.Chunk sur_ark;
+ if (DataLoader.LoadChunk(archive_ark,levelNo * 100 + SURVELLANCE_OFFSET,out sur_ark))
+ {
+
+ //fprintf(LOGFILE, "\n\tSurvellance Chunk at %d\n", blockAddress);
+ //LoadShockChunk(blockAddress, chunkType, archive_ark, sur_ark, chunkPackedLength, chunkUnpackedLength);
+ objList[objIndex].shockProperties[SCREEN_SURVEILLANCE_TARGET] = (int)DataLoader.getValAtAddress(sur_ark.data, (objList[objIndex].shockProperties[SCREEN_START]-248)*2, 16);
+ //fprintf(LOGFILE, "\tSurveillance item id: %d", objList[objIndex].shockProperties[SCREEN_SURVEILLANCE_TARGET]);
+
+ }
+
+ }
+ break;
+ default:
+ //fprintf(LOGFILE,"\n\tVal 0x6: %d", getValAtAddress(sub_ark.data, add_ptr + 6, 16));
+ //fprintf(LOGFILE,"\n\tVal 0x8: %d", getValAtAddress(sub_ark.data, add_ptr + 8, 16));
+ //fprintf(LOGFILE,"\n\tVal 0xA: %d", getValAtAddress(sub_ark.data, add_ptr + 0xA, 16));
+ //fprintf(LOGFILE,"\n\tVal 0xC: %d", getValAtAddress(sub_ark.data, add_ptr + 0xC, 16));
+ //fprintf(LOGFILE,"\n\tVal 0xE: %d", getValAtAddress(sub_ark.data, add_ptr + 0xE, 16));
+ break;
+ }
+ break;
+ case 7: //bridges etc
+ int val = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0x8, 8);
+ objList[objIndex].shockProperties[BRIDGE_X_SIZE] = val & 0xF;
+ objList[objIndex].shockProperties[BRIDGE_Y_SIZE] = (val >>4) & 0xF;
+ objList[objIndex].shockProperties[BRIDGE_HEIGHT] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0x9, 8);
+ val = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0xA, 8);
+ objList[objIndex].shockProperties[BRIDGE_TOP_BOTTOM_TEXTURE_SOURCE] = (val >> 7) & 0x1;
+ if (objList[objIndex].shockProperties[BRIDGE_TOP_BOTTOM_TEXTURE_SOURCE]==1)//Retrieve from texture map
+ {
+ objList[objIndex].shockProperties[BRIDGE_TOP_BOTTOM_TEXTURE] = texture_map[val & 0x7F];
+ }
+ else
+ {
+ objList[objIndex].shockProperties[BRIDGE_TOP_BOTTOM_TEXTURE] = val & 0x7F;
+ }
+
+ val = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0xB, 8);
+ objList[objIndex].shockProperties[BRIDGE_SIDE_TEXTURE_SOURCE] = (val >> 7) & 0x1;
+ if (objList[objIndex].shockProperties[BRIDGE_SIDE_TEXTURE_SOURCE] == 1)//Retrieve from texture map
+ {
+ objList[objIndex].shockProperties[BRIDGE_SIDE_TEXTURE] = texture_map[val & 0x7F];
+ }
+ else
+ {
+ objList[objIndex].shockProperties[BRIDGE_SIDE_TEXTURE] = val & 0x7F;
+ }
+ //fprintf(LOGFILE, "\n\tBridge X Size : %d", objList[objIndex].shockProperties[BRIDGE_X_SIZE]);
+ //fprintf(LOGFILE, "\n\tBridge Y Size : %d", objList[objIndex].shockProperties[BRIDGE_Y_SIZE]);
+ //fprintf(LOGFILE, "\n\tBridge Height : %d", objList[objIndex].shockProperties[BRIDGE_HEIGHT]);
+ //fprintf(LOGFILE, "\n\tBridge Top Texture : %d", objList[objIndex].shockProperties[BRIDGE_TOP_BOTTOM_TEXTURE]);
+ //fprintf(LOGFILE, "\n\tBridge Top Texture Source : %d", objList[objIndex].shockProperties[BRIDGE_TOP_BOTTOM_TEXTURE_SOURCE]);
+ //fprintf(LOGFILE, "\n\tBridge Side Texture : %d", objList[objIndex].shockProperties[BRIDGE_SIDE_TEXTURE]);
+ //fprintf(LOGFILE, "\n\tBridge Side Texture Source : %d", objList[objIndex].shockProperties[BRIDGE_SIDE_TEXTURE_SOURCE]);
+
+ /*fprintf(LOGFILE,"\n\tVal 0x6: %d", getValAtAddress(sub_ark, add_ptr + 6, 16));
+ fprintf(LOGFILE,"\n\tVal 0x8: %d", getValAtAddress(sub_ark, add_ptr + 8, 16));
+ fprintf(LOGFILE,"\n\tVal 0xA: %d", getValAtAddress(sub_ark, add_ptr + 0xA, 16));
+ fprintf(LOGFILE,"(%d", getValAtAddress(sub_ark, add_ptr + 0xA, 8));
+ fprintf(LOGFILE,",%d)", getValAtAddress(sub_ark, add_ptr + 0xB, 8));
+ fprintf(LOGFILE,"\n\tVal 0xC: %d", getValAtAddress(sub_ark, add_ptr + 0xC, 16));
+ fprintf(LOGFILE,"\n\tVal 0xE: %d", getValAtAddress(sub_ark, add_ptr + 0xE, 16));*/
+ break;
+ }
+
+
+
+ return true;
+ break;
+ }
+ case GETTABLES_OTHER:
+ {
+ if (objList[objIndex].item_id == 191) //Brief case contents
+ {
+ objList[objIndex].shockProperties[CONTAINER_CONTENTS_1] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0x6, 16);
+ objList[objIndex].shockProperties[CONTAINER_CONTENTS_2] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0x8, 16);
+ objList[objIndex].shockProperties[CONTAINER_CONTENTS_3] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0xA, 16);
+ objList[objIndex].shockProperties[CONTAINER_CONTENTS_4] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0xC, 16);
+ // fprintf(LOGFILE,"\tContents 1 : %d\n", objList[objIndex].shockProperties[CONTAINER_CONTENTS_1]);
+ //fprintf(LOGFILE,"\tContents 2 : %d\n", objList[objIndex].shockProperties[CONTAINER_CONTENTS_2]);
+ //fprintf(LOGFILE,"\tContents 3 : %d\n", objList[objIndex].shockProperties[CONTAINER_CONTENTS_3]);
+ //fprintf(LOGFILE,"\tContents 4 : %d\n", objList[objIndex].shockProperties[CONTAINER_CONTENTS_4]);
+ }
+
+ //for (int j = 0; j < RecordSize; j = j + 2)
+ //{
+ //fprintf(LOGFILE,"j=%d val(16) = %d\n", j, getValAtAddress(sub_ark, add_ptr+ j, 16));
+ //}
+
+ return true;
+ break;
+ }
+ case SWITCHES_PANELS:
+ {
+ //fprintf(LOGFILE,"\n\tSwitch Properties\n");
+ //fprintf(LOGFILE,"\t\tSwitch Action?:%d",getValAtAddress(sub_ark.data,add_ptr+6,16));
+ //fprintf(LOGFILE,"\tVariable:%d",getValAtAddress(sub_ark.data,add_ptr+8,16));
+ //fprintf(LOGFILE,"\tFail Message:%d",getValAtAddress(sub_ark.data,add_ptr+10,16));
+
+ //TODO:Sort out the trigger action variable into a property
+ objList[objIndex].TriggerAction = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+6,16);
+ getShockButtons(LevelInfo,sub_ark,add_ptr,objList,objIndex);
+ return true;
+ break;
+ }
+ case DOORS_GRATINGS:
+ {
+ //TODO: Sort out locking state
+ //fprintf(LOGFILE,"\n\tDoor Properties\n");
+ // int crossref = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 6, 16);
+ // if (crossref != 0)
+ //{
+ // objList[objIndex].SHOCKLocked = 1; // = crossref;
+ // }
+ //else
+ //{
+ // objList[objIndex].SHOCKLocked = 0;
+ // }
+ // objList[objIndex].link = getValAtAddress(sub_ark.data, add_ptr + 10, 8); //Link to it's key. reusage from uw.
+
+ //fprintf(LOGFILE,"\t\tTrigger xref?:%d (%d)", xRef[crossref].MstIndex, crossref);
+ // fprintf(LOGFILE,"\tMessage:%d", getValAtAddress(sub_ark.data, add_ptr + 8, 16));
+ // fprintf(LOGFILE,"\tAccess Required:%d", getValAtAddress(sub_ark.data, add_ptr + 0xA, 8));
+ // fprintf(LOGFILE, "\tOther val:%d\n", getValAtAddress(sub_ark.data, add_ptr + 0xB, 16));
+ return true;
+ break;
+ }
+ case TRAPS_MARKERS: //and triggers too
+ {
+ //TODO: Fix conditions and trigger once values
+ objList[objIndex].conditions[0] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+8,8);
+ objList[objIndex].conditions[1] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+9,8);
+ objList[objIndex].conditions[2] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+10,8);
+ objList[objIndex].conditions[3] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+11,8);
+ objList[objIndex].TriggerOnce = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+7,8);
+ //objList[objIndex].TriggerOnceGlobal = 0;
+ //fprintf(LOGFILE,"\tConditions: %d",objList[objIndex].conditions[0]);
+ //fprintf(LOGFILE,",%d",objList[objIndex].conditions[1]);
+ //fprintf(LOGFILE,",%d",objList[objIndex].conditions[2]);
+ //fprintf(LOGFILE,",%d\n",objList[objIndex].conditions[3]);
+ //fprintf(LOGFILE,"\tTrigger once: %d\n",objList[objIndex].TriggerOnce);
+ //objList[objIndex].address = blockAddress+add_ptr;
+ //fprintf(LOGFILE,"\tObject is at address %d\n", objList[objIndex].address);
+ if ( GameWorldController.instance.objectMaster.type[objList[objIndex].item_id] == ObjectInteraction.SHOCK_TRIGGER_REPULSOR)
+ {
+ objList[objIndex].shockProperties[TRIG_PROPERTY_VALUE] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 21, 8);
+ objList[objIndex].shockProperties[TRIG_PROPERTY_FLAG] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 24, 8);
+ //fprintf(LOGFILE,"\tRepulsor Upwards Displacement is %d\n", objList[objIndex].shockProperties[TRIG_PROPERTY_VALUE]);
+ if (objList[objIndex].shockProperties[TRIG_PROPERTY_FLAG] == 1)
+ {
+ //fprintf(LOGFILE,"\tRepulsor is off (%d)\n", objList[objIndex].shockProperties[TRIG_PROPERTY_FLAG]);
+ }
+ else
+ {
+ //fprintf(LOGFILE,"\tRepulsor is on (%d)\n", objList[objIndex].shockProperties[TRIG_PROPERTY_FLAG]);
+ }
+ }
+ else
+ {
+ getShockTriggerAction(LevelInfo, sub_ark, add_ptr, xRef, objList, objIndex);
+ }
+
+
+ return true;
+ break;
+ }
+ case CONTAINERS_CORPSES:
+ //fprintf(LOGFILE,"\n\tContainer Properties\n");
+ objList[objIndex].shockProperties[CONTAINER_CONTENTS_1] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0x6, 16);
+ objList[objIndex].shockProperties[CONTAINER_CONTENTS_2] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0x8, 16);
+ objList[objIndex].shockProperties[CONTAINER_CONTENTS_3] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0xA, 16);
+ objList[objIndex].shockProperties[CONTAINER_CONTENTS_4] =(int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0xC, 16);
+ objList[objIndex].shockProperties[CONTAINER_WIDTH] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0xE, 8);
+ objList[objIndex].shockProperties[CONTAINER_HEIGHT] =(int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0xF, 8);
+ objList[objIndex].shockProperties[CONTAINER_DEPTH] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0x10, 8);
+ objList[objIndex].shockProperties[CONTAINER_TOP] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0x11, 8);
+ objList[objIndex].shockProperties[CONTAINER_SIDE] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0x12, 8);
+ //fprintf(LOGFILE,"\tContents 1 : %d\n", objList[objIndex].shockProperties[CONTAINER_CONTENTS_1]);
+ //fprintf(LOGFILE,"\tContents 2 : %d\n", objList[objIndex].shockProperties[CONTAINER_CONTENTS_2]);
+ //fprintf(LOGFILE,"\tContents 3 : %d\n", objList[objIndex].shockProperties[CONTAINER_CONTENTS_3]);
+ //fprintf(LOGFILE,"\tContents 4 : %d\n", objList[objIndex].shockProperties[CONTAINER_CONTENTS_4]);
+ //fprintf(LOGFILE,"\tWidth : %d", objList[objIndex].shockProperties[CONTAINER_WIDTH]);
+ //fprintf(LOGFILE,"\tHeight : %d", objList[objIndex].shockProperties[CONTAINER_HEIGHT]);
+ //fprintf(LOGFILE,"\tDepth : %d\n", objList[objIndex].shockProperties[CONTAINER_DEPTH]);
+ //fprintf(LOGFILE,"\tTop : %d", objList[objIndex].shockProperties[CONTAINER_TOP]);
+ //fprintf(LOGFILE,"\tSide : %d", objList[objIndex].shockProperties[CONTAINER_SIDE]);
+ return true;
+ break;
+
+ case CRITTERS:
+ //fprintf(LOGFILE,"\Critter Properties\n");
+ //for (int j = 0; j < RecordSize; j = j + 2)
+ //{
+ //fprintf(LOGFILE,"\tj=%d val(16) = %d\n", j, getValAtAddress(sub_ark.data, add_ptr + j, 16));
+ //}
+ return true;
+ break;
+ }
+ }
+ add_ptr+=RecordSize;
+ k++;
+ }
+ return false;
+ }
+
+
+
+
+
+
+
+ void getShockTriggerAction(TileInfo[,] LevelInfo,DataLoader.Chunk sub_ark, int add_ptr, xrefTable[] xRef, ObjectLoaderInfo[] objList, int objIndex)
+ {
+ //Look up what a trigger does in system shock. Different trigger types activate other triggers/ do things in different ways.
+ short PrintDebug = 1;// (objList[objIndex].item_id == 384);
+ //fprintf(LOGFILE,"",UniqueObjectName(objList[objIndex])); //Weirdness with garbage info getting printed out?
+ int TriggerType =(int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+6,8);
+ objList[objIndex].TriggerAction = TriggerType;
+ switch (TriggerType)
+ {
+ case ObjectInteraction.ACTION_DO_NOTHING :
+ {//Default action.
+ /*if (PrintDebug==1)
+ {
+ //fprintf(LOGFILE,"\tACTION_DO_NOTHING or default for %s\n",UniqueObjectName(objList[objIndex]));
+ //DebugPrintTriggerVals(sub_ark, add_ptr,28);
+ //fprintf(LOGFILE,"\t\tOther values 1:%d\n",getValAtAddress(sub_ark,add_ptr+12,16));
+ //fprintf(LOGFILE,"\t\tOther values 2:%d\n",getValAtAddress(sub_ark,add_ptr+14,16));
+ //fprintf(LOGFILE,"\t\tOther values 3:%d\n",getValAtAddress(sub_ark,add_ptr+16,16));
+ //fprintf(LOGFILE,"\t\tOther values 4:%d\n",getValAtAddress(sub_ark,add_ptr+18,16));
+ //fprintf(LOGFILE,"\t\tOther values 5:%d\n",getValAtAddress(sub_ark,add_ptr+20,16));
+ //fprintf(LOGFILE,"\t\tOther values 6:%d\n",getValAtAddress(sub_ark,add_ptr+22,16));
+ //fprintf(LOGFILE,"\t\tOther values 7:%d\n",getValAtAddress(sub_ark,add_ptr+24,16));
+ //fprintf(LOGFILE,"\t\tOther values 8:%d\n",getValAtAddress(sub_ark,add_ptr+26,16));
+ } */
+ break;
+ }
+ case ObjectInteraction.ACTION_TRANSPORT_LEVEL:
+ {//Sends the player to the specified position in the level.
+
+ objList[objIndex].shockProperties[TRIG_PROPERTY_TARGET_X] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+12,16); //Target X of teleport
+ objList[objIndex].shockProperties[TRIG_PROPERTY_TARGET_Y] =(int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+16,16); //Target Y of teleport
+ objList[objIndex].shockProperties[TRIG_PROPERTY_TARGET_Z]= (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+20,16); //Target Z of teleport
+
+ /*if (PrintDebug==1)
+ {
+ //fprintf(LOGFILE,"\tACTION_TRANSPORT_LEVEL for %s\n",UniqueObjectName(objList[objIndex]));
+ //fprintf(LOGFILE,"\t\tDestination (%d,%d,%d)\n",objList[objIndex].shockProperties[TRIG_PROPERTY_TARGET_X], objList[objIndex].shockProperties[TRIG_PROPERTY_TARGET_Y],objList[objIndex].shockProperties[TRIG_PROPERTY_TARGET_Z] );
+ //DebugPrintTriggerVals(sub_ark, add_ptr, 28);
+ //fprintf(LOGFILE,"\t\tOther values 1:%d\n",getValAtAddress(sub_ark,add_ptr+12,16));
+ //fprintf(LOGFILE,"\t\tOther values 2:%d\n",getValAtAddress(sub_ark,add_ptr+14,16));
+ //fprintf(LOGFILE,"\t\tOther values 3:%d\n",getValAtAddress(sub_ark,add_ptr+16,16));
+ //fprintf(LOGFILE,"\t\tOther values 4:%d\n",getValAtAddress(sub_ark,add_ptr+18,16));
+ //fprintf(LOGFILE,"\t\tOther values 5:%d\n",getValAtAddress(sub_ark,add_ptr+20,16));
+ //fprintf(LOGFILE,"\t\tOther values 6:%d\n",getValAtAddress(sub_ark,add_ptr+22,16));
+ //fprintf(LOGFILE,"\t\tOther values 7:%d\n",getValAtAddress(sub_ark,add_ptr+24,16));
+ //fprintf(LOGFILE,"\t\tOther values 8:%d\n",getValAtAddress(sub_ark,add_ptr+26,16));
+ } */
+ break;
+ }
+ case ObjectInteraction.ACTION_RESURRECTION:
+ {//Brings the player back to life?
+ /*if (PrintDebug==1)
+ {
+ //fprintf(LOGFILE,"\tACTION_RESURRECTION for %s\n",UniqueObjectName(objList[objIndex]));
+ //DebugPrintTriggerVals(sub_ark, add_ptr,30);
+ //fprintf(LOGFILE,"\t\tOther values 1:%d\n",getValAtAddress(sub_ark,add_ptr+12,16));
+ //fprintf(LOGFILE,"\t\tOther values 2:%d\n",getValAtAddress(sub_ark,add_ptr+14,16));
+ //fprintf(LOGFILE,"\t\tOther values 3:%d\n",getValAtAddress(sub_ark,add_ptr+16,16));
+ //fprintf(LOGFILE,"\t\tOther values 4:%d\n",getValAtAddress(sub_ark,add_ptr+18,16));
+ //fprintf(LOGFILE,"\t\tOther values 5:%d\n",getValAtAddress(sub_ark,add_ptr+20,16));
+ //fprintf(LOGFILE,"\t\tOther values 6:%d\n",getValAtAddress(sub_ark,add_ptr+22,16));
+ //fprintf(LOGFILE,"\t\tOther values 7:%d\n",getValAtAddress(sub_ark,add_ptr+24,16));
+ //fprintf(LOGFILE,"\t\tOther values 8:%d\n",getValAtAddress(sub_ark,add_ptr+26,16));
+ }*/
+ objList[objIndex].shockProperties[TRIG_PROPERTY_VALUE] =(int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+16,16); //Target Health
+ break;
+ }
+ case ObjectInteraction.ACTION_CLONE:
+ {//Need to do more research on what this does?
+ // 000C int16 Object to transport.
+ // 000E int16 Delete flag?
+ // 0010 int16 Tile destination X
+ // 0014 int16 Tile destination Y
+ // 0018 int16 Destination height?
+ /*if (PrintDebug==1)
+ {
+ //fprintf(LOGFILE,"\tACTION_CLONE for %s\n",UniqueObjectName(objList[objIndex]));
+ //fprintf(LOGFILE,"\t\tObject to transport:%d\n",getValAtAddress(sub_ark,add_ptr+0xC,16));
+ //fprintf(LOGFILE,"\t\tDeleteFlag?:%d\n",getValAtAddress(sub_ark,add_ptr+0xE,16));
+ //fprintf(LOGFILE,"\t\tDestination tileX:%d\n",getValAtAddress(sub_ark,add_ptr+0x10,16));
+ //fprintf(LOGFILE,"\t\tDestination tileY:%d\n",getValAtAddress(sub_ark,add_ptr+0x14,16));
+ //fprintf(LOGFILE,"\t\tDestination height:%d\n",getValAtAddress(sub_ark,add_ptr+0x18,16));
+ //DebugPrintTriggerVals(sub_ark, add_ptr, 28);
+ //fprintf(LOGFILE,"\t\tOther values 1:%d\n",getValAtAddress(sub_ark,add_ptr+12,16));
+ //fprintf(LOGFILE,"\t\tOther values 2:%d\n",getValAtAddress(sub_ark,add_ptr+14,16));
+ //fprintf(LOGFILE,"\t\tOther values 3:%d\n",getValAtAddress(sub_ark,add_ptr+16,16));
+ //fprintf(LOGFILE,"\t\tOther values 4:%d\n",getValAtAddress(sub_ark,add_ptr+18,16));
+ //fprintf(LOGFILE,"\t\tOther values 5:%d\n",getValAtAddress(sub_ark,add_ptr+20,16));
+ //fprintf(LOGFILE,"\t\tOther values 6:%d\n",getValAtAddress(sub_ark,add_ptr+22,16));
+ //fprintf(LOGFILE,"\t\tOther values 7:%d\n",getValAtAddress(sub_ark,add_ptr+24,16));
+ //fprintf(LOGFILE,"\t\tOther values 8:%d\n",getValAtAddress(sub_ark,add_ptr+26,16));
+
+
+ }*/
+ objList[objIndex].shockProperties[TRIG_PROPERTY_OBJECT] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0xC,16); //obj to transport
+ objList[objIndex].shockProperties[TRIG_PROPERTY_FLAG] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x0E,16); //Delete flag
+ objList[objIndex].shockProperties[TRIG_PROPERTY_TARGET_X] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x10,16); //Target X
+ objList[objIndex].shockProperties[TRIG_PROPERTY_TARGET_Y] =(int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x14,16); //Target Y
+ objList[objIndex].shockProperties[TRIG_PROPERTY_TARGET_Z] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x18,16); //Target z
+
+ break;
+ }
+ case ObjectInteraction.ACTION_SET_VARIABLE:
+ {//Sets a game variable. I don't yet know what the various variables are. I suspect they may be in the exe so I'll have to just observe them in the wild?
+ //000C int16 variable to set
+ //0010 int16 value
+ //0012 int16 ?? action 00 set 01 add
+ //0014 int16 Optional message to receive
+ /*if (PrintDebug==1)
+ {
+ //fprintf(LOGFILE,"\tACTION_SET_VARIABLE for %s\n",UniqueObjectName(objList[objIndex]));
+ //fprintf(LOGFILE,"\t\tVariable to Set:%d\n",getValAtAddress(sub_ark,add_ptr+0xC,16));
+ //fprintf(LOGFILE,"\t\tValue:%d",getValAtAddress(sub_ark,add_ptr+0x10,16));
+ //fprintf(LOGFILE,"\t\taction?:%d (00 set 01 add)\n",getValAtAddress(sub_ark,add_ptr+0x12,16));
+ //fprintf(LOGFILE,"\t\tOptional Message:%d\n",getValAtAddress(sub_ark,add_ptr+0x14,16));
+ //DebugPrintTriggerVals(sub_ark, add_ptr, 28);
+ /* fprintf(LOGFILE,"\t\tOther values 1:%d\n",getValAtAddress(sub_ark,add_ptr+12,16));
+ fprintf(LOGFILE,"\t\tOther values 2:%d\n",getValAtAddress(sub_ark,add_ptr+14,16));
+ fprintf(LOGFILE,"\t\tOther values 3:%d\n",getValAtAddress(sub_ark,add_ptr+16,16));
+ fprintf(LOGFILE,"\t\tOther values 4:%d\n",getValAtAddress(sub_ark,add_ptr+18,16));
+ fprintf(LOGFILE,"\t\tOther values 5:%d\n",getValAtAddress(sub_ark,add_ptr+20,16));
+ fprintf(LOGFILE,"\t\tOther values 6:%d\n",getValAtAddress(sub_ark,add_ptr+22,16));
+ fprintf(LOGFILE,"\t\tOther values 7:%d\n",getValAtAddress(sub_ark,add_ptr+24,16));
+ fprintf(LOGFILE,"\t\tOther values 8:%d\n",getValAtAddress(sub_ark,add_ptr+26,16)); */
+ // }
+ objList[objIndex].shockProperties[TRIG_PROPERTY_VARIABLE] =(int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0xC,16);
+ objList[objIndex].shockProperties[TRIG_PROPERTY_VALUE] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x10,16);
+ objList[objIndex].shockProperties[TRIG_PROPERTY_OPERATION]=(int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x12,16);
+ objList[objIndex].shockProperties[TRIG_PROPERTY_MESSAGE1]=(int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x14,16);
+
+ break;
+ }
+ case ObjectInteraction.ACTION_ACTIVATE:
+ {//Turns on up to 4 other triggers.
+ //000C int16 1st object to activate.
+ //000E int16 Delay before activating object 1.
+ //0010 ... Up to 4 objects and delays stored here.
+ objList[objIndex].shockProperties[0] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0xC,16) ;
+ objList[objIndex].shockProperties[1] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0xe,16) ;
+ objList[objIndex].shockProperties[2] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x10,16) ;
+ objList[objIndex].shockProperties[3] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x12,16) ;
+ objList[objIndex].shockProperties[4] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x14,16) ;
+ objList[objIndex].shockProperties[5] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x16,16) ;
+ objList[objIndex].shockProperties[6] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x18,16) ;
+ objList[objIndex].shockProperties[7] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x1A,16) ;
+ /*if (PrintDebug==1)
+ {
+ //fprintf(LOGFILE,"\tACTION_ACTIVATE for %s\n",UniqueObjectName(objList[objIndex]));
+
+ //fprintf(LOGFILE,"\t\t1st Object to activate raw :%d\t",objList[objIndex].shockProperties[0]);
+ //fprintf(LOGFILE,"1st Object Delay:%d\n",objList[objIndex].shockProperties[1]);
+
+ //fprintf(LOGFILE,"\t\t2nd Object to activate raw :%d\t",objList[objIndex].shockProperties[2]);
+ //fprintf(LOGFILE,"2nd Object Delay:%d\n",objList[objIndex].shockProperties[3]);
+
+ //fprintf(LOGFILE,"\t\t3rd Object to activate raw :%d\t",objList[objIndex].shockProperties[4]);
+ //fprintf(LOGFILE,"3rd Object Delay:%d\n",objList[objIndex].shockProperties[5]);
+
+ //fprintf(LOGFILE,"\t\t4th Object to activate raw :%d\t",objList[objIndex].shockProperties[6]);
+ //fprintf(LOGFILE,"4th Object Delay:%d\n",objList[objIndex].shockProperties[7]);
+ //DebugPrintTriggerVals(sub_ark, add_ptr, 28);
+ /* fprintf(LOGFILE,"\t\tOther values 1:%d\n",getValAtAddress(sub_ark,add_ptr+12,16));
+ fprintf(LOGFILE,"\t\tOther values 2:%d\n",getValAtAddress(sub_ark,add_ptr+14,16));
+ fprintf(LOGFILE,"\t\tOther values 3:%d\n",getValAtAddress(sub_ark,add_ptr+16,16));
+ fprintf(LOGFILE,"\t\tOther values 4:%d\n",getValAtAddress(sub_ark,add_ptr+18,16));
+ fprintf(LOGFILE,"\t\tOther values 5:%d\n",getValAtAddress(sub_ark,add_ptr+20,16));
+ fprintf(LOGFILE,"\t\tOther values 6:%d\n",getValAtAddress(sub_ark,add_ptr+22,16));
+ fprintf(LOGFILE,"\t\tOther values 7:%d\n",getValAtAddress(sub_ark,add_ptr+24,16));
+ fprintf(LOGFILE,"\t\tOther values 8:%d\n",getValAtAddress(sub_ark,add_ptr+26,16)); */
+ //}
+
+ break;
+ }
+ case ObjectInteraction.ACTION_LIGHTING:
+ {//Controls lighting between the specified control points. The control points are usually null triggers but are sometimes regular objects as well.
+ //000C int16 Control point 1
+ //000E int16 Control point 2
+ // ... ?
+
+ objList[objIndex].shockProperties[TRIG_PROPERTY_CONTROL_1] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+12,16);
+ objList[objIndex].shockProperties[TRIG_PROPERTY_CONTROL_2] =(int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+14,16);
+ objList[objIndex].shockProperties[TRIG_PROPERTY_LIGHT_OP] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 16, 16);
+ objList[objIndex].shockProperties[TRIG_PROPERTY_UPPERSHADE_1] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 22, 8);//22,24,23,25
+ objList[objIndex].shockProperties[TRIG_PROPERTY_LOWERSHADE_1] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 23, 8);
+ objList[objIndex].shockProperties[TRIG_PROPERTY_UPPERSHADE_2] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 24, 8);
+ objList[objIndex].shockProperties[TRIG_PROPERTY_LOWERSHADE_2] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 25, 8);
+ /*if (PrintDebug==1)
+ {
+ fprintf(LOGFILE,"\tACTION_LIGHTING for %s\n",UniqueObjectName(objList[objIndex]));
+ fprintf(LOGFILE,"\t\t(%d)Lighting Operation: %d\n", objList[objIndex].address+16, objList[objIndex].shockProperties[TRIG_PROPERTY_LIGHT_OP]);
+ fprintf(LOGFILE,"\t\tControl point 1:%d\n",objList[objIndex].shockProperties[TRIG_PROPERTY_CONTROL_1]);
+ fprintf(LOGFILE,"\t\tControl point 2:%d\n", objList[objIndex].shockProperties[TRIG_PROPERTY_CONTROL_2]);
+ fprintf(LOGFILE,"\t\t(%d)Not used? Upper Shade adjustment = %d\n", objList[objIndex].address +22, objList[objIndex].shockProperties[TRIG_PROPERTY_UPPERSHADE_1]);
+ fprintf(LOGFILE,"\t\t(%d)Not used? Lower Shade adjustment = %d\n", objList[objIndex].address +23 ,objList[objIndex].shockProperties[TRIG_PROPERTY_LOWERSHADE_1]);
+ fprintf(LOGFILE,"\t\t(%d)Upper Shade adjustment = %d\n", objList[objIndex].address +24 ,objList[objIndex].shockProperties[TRIG_PROPERTY_UPPERSHADE_2]);
+ fprintf(LOGFILE,"\t\t(%d)Lower Shade adjustment = %d\n", objList[objIndex].address +25 ,objList[objIndex].shockProperties[TRIG_PROPERTY_LOWERSHADE_2]);
+ DebugPrintTriggerVals(sub_ark, add_ptr, 28);
+ //fprintf(LOGFILE,"\t\tOther values 1:%d\n",getValAtAddress(sub_ark,add_ptr+12,16));
+ //fprintf(LOGFILE,"\t\tOther values 2:%d\n",getValAtAddress(sub_ark,add_ptr+14,16));
+ //fprintf(LOGFILE,"\t\tOther values 3:%d\n",getValAtAddress(sub_ark,add_ptr+16,16));
+ //fprintf(LOGFILE,"\t\tOther values 4:%d\n",getValAtAddress(sub_ark,add_ptr+18,16));
+ //fprintf(LOGFILE,"\t\tOther values 5:%d\n",getValAtAddress(sub_ark,add_ptr+20,16));
+ //fprintf(LOGFILE,"\t\tOther values 6:%d\n",getValAtAddress(sub_ark,add_ptr+22,16));
+ //fprintf(LOGFILE,"\t\tOther values 7:%d\n",getValAtAddress(sub_ark,add_ptr+24,16));
+ //fprintf(LOGFILE,"\t\tOther values 8:%d\n",getValAtAddress(sub_ark,add_ptr+26,16));
+ } */
+ break;
+ }
+ case ObjectInteraction.ACTION_EFFECT:
+ {//Preforms a special effect. One example is the power breaker sparking on research level.
+ /*if (PrintDebug==1)
+ {
+ fprintf(LOGFILE,"\tACTION_EFFECT for %s\n",UniqueObjectName(objList[objIndex]));
+ DebugPrintTriggerVals(sub_ark, add_ptr, 28);
+ //fprintf(LOGFILE,"\t\tOther values 1:%d\n",getValAtAddress(sub_ark,add_ptr+12,16));
+ //fprintf(LOGFILE,"\t\tOther values 2:%d\n",getValAtAddress(sub_ark,add_ptr+14,16));
+ //fprintf(LOGFILE,"\t\tOther values 3:%d\n",getValAtAddress(sub_ark,add_ptr+16,16));
+ //fprintf(LOGFILE,"\t\tOther values 4:%d\n",getValAtAddress(sub_ark,add_ptr+18,16));
+ //fprintf(LOGFILE,"\t\tOther values 5:%d\n",getValAtAddress(sub_ark,add_ptr+20,16));
+ //fprintf(LOGFILE,"\t\tOther values 6:%d\n",getValAtAddress(sub_ark,add_ptr+22,16));
+ //fprintf(LOGFILE,"\t\tOther values 7:%d\n",getValAtAddress(sub_ark,add_ptr+24,16));
+ //fprintf(LOGFILE,"\t\tOther values 8:%d\n",getValAtAddress(sub_ark,add_ptr+26,16));
+ } */
+ break;
+ }
+ case ObjectInteraction.ACTION_MOVING_PLATFORM:
+ {//Usually a lift or a blast door type setup. Both the floor and ceiling have parameters in this.
+
+ setElevatorProperties(LevelInfo, sub_ark,add_ptr,objList, objIndex);
+ //objList[objIndex].shockProperties[TRIG_PROPERTY_TARGET_X] = getValAtAddress(sub_ark,add_ptr+0x0C,16);
+ //objList[objIndex].shockProperties[TRIG_PROPERTY_TARGET_Y] = getValAtAddress(sub_ark,add_ptr+0x10,16);
+ //objList[objIndex].shockProperties[TRIG_PROPERTY_FLOOR] = getValAtAddress(sub_ark,add_ptr+0x14,16); //5
+ //objList[objIndex].shockProperties[TRIG_PROPERTY_CEILING] = getValAtAddress(sub_ark,add_ptr+0x16,16); //6
+ //objList[objIndex].shockProperties[TRIG_PROPERTY_SPEED] = getValAtAddress(sub_ark,add_ptr+0x18,16);
+ //LevelInfo[objList[objIndex].shockProperties[TRIG_PROPERTY_TARGET_X]][objList[objIndex].shockProperties[TRIG_PROPERTY_TARGET_Y]].hasElevator =1;
+ //
+ //short ceilingFlag = (objList[objIndex].shockProperties[TRIG_PROPERTY_CEILING]<=SHOCK_CEILING_HEIGHT);
+ //short floorFlag = (objList[objIndex].shockProperties[TRIG_PROPERTY_FLOOR] <= SHOCK_CEILING_HEIGHT);
+ //short elevatorFlag = (ceilingFlag << 1) | (floorFlag);
+ //
+ //LevelInfo[objList[objIndex].shockProperties[TRIG_PROPERTY_TARGET_X]][objList[objIndex].shockProperties[TRIG_PROPERTY_TARGET_Y]].hasElevator &= elevatorFlag;
+
+ break;
+
+ }
+ case ObjectInteraction.ACTION_TIMER:
+ {//Delays the trigger getting fired off. A good example is the aftermath of destroying the CPUs on hospital level.
+ //000C int16 1st object to activate.?
+ //000E int16 Delay before activating object 1.?
+
+ objList[objIndex].shockProperties[0] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0xC, 16);
+ objList[objIndex].shockProperties[1] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0xe, 16);
+ objList[objIndex].shockProperties[2] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0x10, 16);
+ objList[objIndex].shockProperties[3] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0x12, 16);
+ objList[objIndex].shockProperties[4] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0x14, 16);
+ objList[objIndex].shockProperties[5] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0x16, 16);
+ objList[objIndex].shockProperties[6] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0x18, 16);
+ objList[objIndex].shockProperties[7] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0x1A, 16);
+ /*if (PrintDebug == 1)
+ {
+ fprintf(LOGFILE,"\tACTION_TIMER (i think) for %s\n", UniqueObjectName(objList[objIndex]));
+
+ fprintf(LOGFILE,"\t\t1st Object to activate raw :%d\t", objList[objIndex].shockProperties[0]);
+ fprintf(LOGFILE,"1st Object Delay:%d\n", objList[objIndex].shockProperties[1]);
+
+ DebugPrintTriggerVals(sub_ark, add_ptr, 28);
+ }*/
+ break;
+ }
+ case ObjectInteraction.ACTION_CHOICE:
+ {//A toggle?
+ //000C int16 Trigger 1
+ //0010 int16 Trigger 2
+
+ objList[objIndex].shockProperties[TRIG_PROPERTY_TRIG_1] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x0C,16);
+ objList[objIndex].shockProperties[TRIG_PROPERTY_TRIG_2] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x10,16);
+ /*if (PrintDebug==1)
+ {
+ fprintf(LOGFILE,"\tACTION_CHOICE for %s\n",UniqueObjectName(objList[objIndex]));
+ fprintf(LOGFILE,"\t\tTrigger1:%d\n",objList[objIndex].shockProperties[TRIG_PROPERTY_TRIG_1]);
+ fprintf(LOGFILE,"\t\tTrigger2:%d\n",objList[objIndex].shockProperties[TRIG_PROPERTY_TRIG_2]);
+ DebugPrintTriggerVals(sub_ark, add_ptr, 28);
+ //fprintf(LOGFILE,"\t\tOther values 1:%d\n",getValAtAddress(sub_ark,add_ptr+12,16));
+ //fprintf(LOGFILE,"\t\tOther values 2:%d\n",getValAtAddress(sub_ark,add_ptr+14,16));
+ //fprintf(LOGFILE,"\t\tOther values 3:%d\n",getValAtAddress(sub_ark,add_ptr+16,16));
+ //fprintf(LOGFILE,"\t\tOther values 4:%d\n",getValAtAddress(sub_ark,add_ptr+18,16));
+ //fprintf(LOGFILE,"\t\tOther values 5:%d\n",getValAtAddress(sub_ark,add_ptr+20,16));
+ //fprintf(LOGFILE,"\t\tOther values 6:%d\n",getValAtAddress(sub_ark,add_ptr+22,16));
+ //fprintf(LOGFILE,"\t\tOther values 7:%d\n",getValAtAddress(sub_ark,add_ptr+24,16));
+ //fprintf(LOGFILE,"\t\tOther values 8:%d\n",getValAtAddress(sub_ark,add_ptr+26,16));
+ }*/
+ break;
+ }
+ case ObjectInteraction.ACTION_EMAIL:
+ {//Sends the player an email. (Differs from a message in that a message just plays once and does not hit the data reader)
+ /*if (PrintDebug==1)
+ {
+ fprintf(LOGFILE,"\tACTION_EMAIL for %s\n",UniqueObjectName(objList[objIndex]));
+ // 0F Player receives email
+ //000C int16 Chunk no. of email (offset from 2441 0x0989)
+ //Note the subject line of an email may be used to chain a sequence of emails together (see sspecs)
+ fprintf(LOGFILE,"\t\tEmail chunk:", getValAtAddress(sub_ark,add_ptr+0x0C,16)+2441);
+ DebugPrintTriggerVals(sub_ark, add_ptr, 28);
+ /* fprintf(LOGFILE,"\t\tOther values 1:%d\n",getValAtAddress(sub_ark,add_ptr+12,16));
+ fprintf(LOGFILE,"\t\tOther values 2:%d\n",getValAtAddress(sub_ark,add_ptr+14,16));
+ fprintf(LOGFILE,"\t\tOther values 3:%d\n",getValAtAddress(sub_ark,add_ptr+16,16));
+ fprintf(LOGFILE,"\t\tOther values 4:%d\n",getValAtAddress(sub_ark,add_ptr+18,16));
+ fprintf(LOGFILE,"\t\tOther values 5:%d\n",getValAtAddress(sub_ark,add_ptr+20,16));
+ fprintf(LOGFILE,"\t\tOther values 6:%d\n",getValAtAddress(sub_ark,add_ptr+22,16));
+ fprintf(LOGFILE,"\t\tOther values 7:%d\n",getValAtAddress(sub_ark,add_ptr+24,16));
+ fprintf(LOGFILE,"\t\tOther values 8:%d\n",getValAtAddress(sub_ark,add_ptr+26,16));*/
+ //}
+ objList[objIndex].shockProperties[TRIG_PROPERTY_EMAIL] =(int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x0C,16)+2441;
+
+ break;
+
+ }
+ case ObjectInteraction.ACTION_RADAWAY:
+ {//Radiation healing on the reactor?
+ /*if (PrintDebug==1)
+ {
+ //fprintf(LOGFILE,"\tACTION_RADAWAY for %s\n",UniqueObjectName(objList[objIndex]));
+ //DebugPrintTriggerVals(sub_ark, add_ptr, 28);
+ /* fprintf(LOGFILE,"\t\tOther values 1:%d\n",getValAtAddress(sub_ark,add_ptr+12,16));
+ fprintf(LOGFILE,"\t\tOther values 2:%d\n",getValAtAddress(sub_ark,add_ptr+14,16));
+ fprintf(LOGFILE,"\t\tOther values 3:%d\n",getValAtAddress(sub_ark,add_ptr+16,16));
+ fprintf(LOGFILE,"\t\tOther values 4:%d\n",getValAtAddress(sub_ark,add_ptr+18,16));
+ fprintf(LOGFILE,"\t\tOther values 5:%d\n",getValAtAddress(sub_ark,add_ptr+20,16));
+ fprintf(LOGFILE,"\t\tOther values 6:%d\n",getValAtAddress(sub_ark,add_ptr+22,16));
+ fprintf(LOGFILE,"\t\tOther values 7:%d\n",getValAtAddress(sub_ark,add_ptr+24,16));
+ fprintf(LOGFILE,"\t\tOther values 8:%d\n",getValAtAddress(sub_ark,add_ptr+26,16));*/
+ //}
+ break;
+ }
+ case ObjectInteraction.ACTION_CHANGE_STATE:
+ {//Used a lot in switches. Needs more research. (changes the image?)
+ /*if (PrintDebug==1)
+ {
+ //fprintf(LOGFILE,"\tACTION_CHANGE_STATE for %s\n",UniqueObjectName(objList[objIndex]));
+ objList[objIndex].shockProperties[TRIG_PROPERTY_TYPE] = getValAtAddress(sub_ark, add_ptr + 12, 16);
+ objList[objIndex].shockProperties[TRIG_PROPERTY_OBJECT] = getValAtAddress(sub_ark, add_ptr + 16, 16);
+ fprintf(LOGFILE, "\t\tObject to activate:%d\n", objList[objIndex].shockProperties[TRIG_PROPERTY_OBJECT]);
+ fprintf(LOGFILE, "\t\tNew type:%d\n", objList[objIndex].shockProperties[TRIG_PROPERTY_TYPE]);
+ DebugPrintTriggerVals(sub_ark, add_ptr, 28);
+ //fprintf(LOGFILE,"\t\tOther values 1:%d\n",getValAtAddress(sub_ark,add_ptr+12,16));
+ //fprintf(LOGFILE,"\t\tOther values 2:%d\n",getValAtAddress(sub_ark,add_ptr+14,16));
+ //fprintf(LOGFILE,"\t\tOther values 3:%d\n",getValAtAddress(sub_ark,add_ptr+16,16));
+ //fprintf(LOGFILE,"\t\tOther values 4:%d\n",getValAtAddress(sub_ark,add_ptr+18,16));
+ //fprintf(LOGFILE,"\t\tOther values 5:%d\n",getValAtAddress(sub_ark,add_ptr+20,16));
+ //fprintf(LOGFILE,"\t\tOther values 6:%d\n",getValAtAddress(sub_ark,add_ptr+22,16));
+ //fprintf(LOGFILE,"\t\tOther values 7:%d\n",getValAtAddress(sub_ark,add_ptr+24,16));
+ //fprintf(LOGFILE,"\t\tOther values 8:%d\n",getValAtAddress(sub_ark,add_ptr+26,16));
+ }*/
+ break;
+ }
+ case ObjectInteraction.ACTION_AWAKEN:
+ {//Wakes up sleeping drones in between the two control points and sends them after you. (maybe)
+ objList[objIndex].shockProperties[TRIG_PROPERTY_CONTROL_1] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0x10, 16);
+ objList[objIndex].shockProperties[TRIG_PROPERTY_CONTROL_2] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0x12, 16);
+ /*if (PrintDebug == 1)
+ {
+ fprintf(LOGFILE,"\tACTION_AWAKEN for %s\n", UniqueObjectName(objList[objIndex]));
+ fprintf(LOGFILE,"\t\tControl point object1:%d\n", objList[objIndex].shockProperties[TRIG_PROPERTY_CONTROL_1]);
+ fprintf(LOGFILE,"\t\tControl point object2:%d\n", objList[objIndex].shockProperties[TRIG_PROPERTY_CONTROL_2]);
+ DebugPrintTriggerVals(sub_ark, add_ptr, 28);
+ }*/
+ break;
+ }
+ case ObjectInteraction.ACTION_MESSAGE:
+ {//A once off message. For example the computer voice when the cyborg conversion is activated.
+ //16 Trap message offset in Chunk 2151
+ //000C int16 "Success" message
+ //0010 int16 "Fail" message
+ objList[objIndex].shockProperties[TRIG_PROPERTY_MESSAGE1]=(int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x0C,16);
+ objList[objIndex].shockProperties[TRIG_PROPERTY_MESSAGE2]=(int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x10,16);
+ /*if (PrintDebug==1)
+ {
+ fprintf(LOGFILE,"\tACTION_MESSAGE for %s\n",UniqueObjectName(objList[objIndex]));
+ fprintf(LOGFILE,"\t\tSuccess Message%d\n",objList[objIndex].shockProperties[TRIG_PROPERTY_MESSAGE1]);
+ fprintf(LOGFILE,"\t\tFail Message:%d\n",objList[objIndex].shockProperties[TRIG_PROPERTY_MESSAGE2]);
+ DebugPrintTriggerVals(sub_ark, add_ptr, 28);
+ /* fprintf(LOGFILE,"\t\tOther values 1:%d\n",getValAtAddress(sub_ark,add_ptr+12,16));
+ fprintf(LOGFILE,"\t\tOther values 2:%d\n",getValAtAddress(sub_ark,add_ptr+14,16));
+ fprintf(LOGFILE,"\t\tOther values 3:%d\n",getValAtAddress(sub_ark,add_ptr+16,16));
+ fprintf(LOGFILE,"\t\tOther values 4:%d\n",getValAtAddress(sub_ark,add_ptr+18,16));
+ fprintf(LOGFILE,"\t\tOther values 5:%d\n",getValAtAddress(sub_ark,add_ptr+20,16));
+ fprintf(LOGFILE,"\t\tOther values 6:%d\n",getValAtAddress(sub_ark,add_ptr+22,16));
+ fprintf(LOGFILE,"\t\tOther values 7:%d\n",getValAtAddress(sub_ark,add_ptr+24,16));
+ fprintf(LOGFILE,"\t\tOther values 8:%d\n",getValAtAddress(sub_ark,add_ptr+26,16)); */
+ //}
+ break;
+ }
+ case ObjectInteraction.ACTION_SPAWN:
+ {
+ //000C int32 Class/subclass/type of object to spawn
+ //0010 int16 Control point 1 (object)
+ //0012 int16 Control point 2 (object)
+ //0014 ??
+ //0018 ??
+
+ objList[objIndex].shockProperties[TRIG_PROPERTY_TYPE]=(int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x0C,32);
+ objList[objIndex].shockProperties[TRIG_PROPERTY_CONTROL_1]=(int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x10,16);
+ objList[objIndex].shockProperties[TRIG_PROPERTY_CONTROL_2]=(int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x12,16);
+ /* if (PrintDebug==1)
+ {
+ fprintf(LOGFILE,"\tACTION_SPAWN for %s\n",UniqueObjectName(objList[objIndex]));
+ fprintf(LOGFILE,"\t\Class-sub-type to spawn:%d\n",objList[objIndex].shockProperties[TRIG_PROPERTY_TYPE]);
+ fprintf(LOGFILE,"\t\tControl point object1:%d\n",objList[objIndex].shockProperties[TRIG_PROPERTY_CONTROL_1]);
+ fprintf(LOGFILE,"\t\tControl point object2:%d\n",objList[objIndex].shockProperties[TRIG_PROPERTY_CONTROL_2]);
+ fprintf(LOGFILE,"\t\t??:%d\n",getValAtAddress(sub_ark,add_ptr+0x14,16));
+ fprintf(LOGFILE,"\t\t??:%d\n",getValAtAddress(sub_ark,add_ptr+0x18,16));
+ DebugPrintTriggerVals(sub_ark, add_ptr, 28);
+ /* fprintf(LOGFILE,"\t\tOther values 1:%d\n",getValAtAddress(sub_ark,add_ptr+12,16));
+ fprintf(LOGFILE,"\t\tOther values 2:%d\n",getValAtAddress(sub_ark,add_ptr+14,16));
+ fprintf(LOGFILE,"\t\tOther values 3:%d\n",getValAtAddress(sub_ark,add_ptr+16,16));
+ fprintf(LOGFILE,"\t\tOther values 4:%d\n",getValAtAddress(sub_ark,add_ptr+18,16));
+ fprintf(LOGFILE,"\t\tOther values 5:%d\n",getValAtAddress(sub_ark,add_ptr+20,16));
+ fprintf(LOGFILE,"\t\tOther values 6:%d\n",getValAtAddress(sub_ark,add_ptr+22,16));
+ fprintf(LOGFILE,"\t\tOther values 7:%d\n",getValAtAddress(sub_ark,add_ptr+24,16));
+ fprintf(LOGFILE,"\t\tOther values 8:%d\n",getValAtAddress(sub_ark,add_ptr+26,16)); */
+ // }
+ break;
+ }
+ case ObjectInteraction.ACTION_CHANGE_TYPE:
+ {
+ //000C int16 Object ID to change.
+ //0010 int8 New type.
+ //0012 ??
+
+ objList[objIndex].shockProperties[TRIG_PROPERTY_OBJECT] =(int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x0C,16);
+ objList[objIndex].shockProperties[TRIG_PROPERTY_TYPE] =(int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x10,8);
+ /*if (PrintDebug==1)
+ {
+ fprintf(LOGFILE,"\tACTION_CHANGE_TYPE for %s\n",UniqueObjectName(objList[objIndex]));
+ fprintf(LOGFILE,"\t\Object to Change:%d\n",objList[objIndex].shockProperties[TRIG_PROPERTY_OBJECT]);
+ fprintf(LOGFILE,"\t\tNew Type (within subclass):%d\n",objList[objIndex].shockProperties[TRIG_PROPERTY_TYPE]);
+ //fprintf(LOGFILE,"\t\tChanges to %s\n", getObjectNameByClass(objList[objIndex].ObjectClass, objList[objIndex].ObjectSubClass, objList[objIndex].ObjectSubClassIndex);
+ fprintf(LOGFILE,"\t\t??:%d\n",getValAtAddress(sub_ark,add_ptr+0x12,16));
+ DebugPrintTriggerVals(sub_ark, add_ptr, 28);
+ /* fprintf(LOGFILE,"\t\tOther values 1:%d\n",getValAtAddress(sub_ark,add_ptr+12,16));
+ fprintf(LOGFILE,"\t\tOther values 2:%d\n",getValAtAddress(sub_ark,add_ptr+14,16));
+ fprintf(LOGFILE,"\t\tOther values 3:%d\n",getValAtAddress(sub_ark,add_ptr+16,16));
+ fprintf(LOGFILE,"\t\tOther values 4:%d\n",getValAtAddress(sub_ark,add_ptr+18,16));
+ fprintf(LOGFILE,"\t\tOther values 5:%d\n",getValAtAddress(sub_ark,add_ptr+20,16));
+ fprintf(LOGFILE,"\t\tOther values 6:%d\n",getValAtAddress(sub_ark,add_ptr+22,16));
+ fprintf(LOGFILE,"\t\tOther values 7:%d\n",getValAtAddress(sub_ark,add_ptr+24,16));
+ fprintf(LOGFILE,"\t\tOther values 8:%d\n",getValAtAddress(sub_ark,add_ptr+26,16)); */
+ //}
+ break;
+ }
+ default:
+ {
+ /*if (PrintDebug==1)
+ {
+ fprintf(LOGFILE,"\tUnknown triggeraction:%d for %s\n",TriggerType, UniqueObjectName(objList[objIndex]));
+ DebugPrintTriggerVals(sub_ark, add_ptr, 28);
+ /* fprintf(LOGFILE,"\t\tOther values 1:%d\n",getValAtAddress(sub_ark,add_ptr+12,16));
+ fprintf(LOGFILE,"\t\tOther values 2:%d\n",getValAtAddress(sub_ark,add_ptr+14,16));
+ fprintf(LOGFILE,"\t\tOther values 3:%d\n",getValAtAddress(sub_ark,add_ptr+16,16));
+ fprintf(LOGFILE,"\t\tOther values 4:%d\n",getValAtAddress(sub_ark,add_ptr+18,16));
+ fprintf(LOGFILE,"\t\tOther values 5:%d\n",getValAtAddress(sub_ark,add_ptr+20,16));
+ fprintf(LOGFILE,"\t\tOther values 6:%d\n",getValAtAddress(sub_ark,add_ptr+22,16));
+ fprintf(LOGFILE,"\t\tOther values 7:%d\n",getValAtAddress(sub_ark,add_ptr+24,16));
+ fprintf(LOGFILE,"\t\tOther values 8:%d\n",getValAtAddress(sub_ark,add_ptr+26,16)); */
+ //}
+ break;
+ }
+
+ }
+
+ }
+
+
+
+
+
+ /******/
+
+
+
+
+ void getShockButtons(TileInfo[,] LevelInfo,DataLoader.Chunk sub_ark,int add_ptr, ObjectLoaderInfo[] objList, int objIndex)
+ {
+ //I'm keeping this seperate from trigger action retrieval for the moment.
+
+ //fprintf(LOGFILE,"\n\tVal_oc: %d\n" ,getValAtAddress(sub_ark,add_ptr+0x0c,16));
+ //fprintf(LOGFILE,"\tVal_oe: %d\n" ,getValAtAddress(sub_ark,add_ptr+0x0E,16));
+ //fprintf(LOGFILE,"\tVal_10: %d\n" ,getValAtAddress(sub_ark,add_ptr+0x10,16));
+ //fprintf(LOGFILE,"\tVal_12: %d\n" ,getValAtAddress(sub_ark,add_ptr+0x12,16));
+ //fprintf(LOGFILE,"\tVal_14: %d\n" ,getValAtAddress(sub_ark,add_ptr+0x14,16));
+ //fprintf(LOGFILE,"\tVal_16: %d\n" ,getValAtAddress(sub_ark,add_ptr+0x16,16));
+ //fprintf(LOGFILE,"\tVal_18: %d\n" ,getValAtAddress(sub_ark,add_ptr+0x18,16));
+ //fprintf(LOGFILE,"\tVal_1a: %d\n" ,getValAtAddress(sub_ark,add_ptr+0x1A,16));
+ //
+ //fprintf(LOGFILE,"\tSwitch Properties\n");
+ if (objList[objIndex].ObjectSubClass ==0)
+ {//regular buttons and switches
+ switch (objList[objIndex].TriggerAction) //Switches have action types as well.
+ {
+ case ObjectInteraction.ACTION_SET_VARIABLE:
+ {//Sets a game variable. I don't yet know what the various variables are. I suspect they may be in the exe so I'll have to just observe them in the wild?
+ //000C int16 variable to set
+ //0010 int16 value
+ //0012 int16 ?? action 00 set 01 add
+ //0014 int16 Optional message to receive
+ //fprintf(LOGFILE,"\tACTION_SET_VARIABLE for %s\n", UniqueObjectName(objList[objIndex]));
+ //fprintf(LOGFILE,"\t\tVariable to Set:%d\n", getValAtAddress(sub_ark, add_ptr + 0xC, 16));
+ //fprintf(LOGFILE,"\t\tValue:%d", getValAtAddress(sub_ark, add_ptr + 0x10, 16));
+ //fprintf(LOGFILE,"\t\taction?:%d (00 set 01 add)\n", getValAtAddress(sub_ark, add_ptr + 0x12, 16));
+ //fprintf(LOGFILE,"\t\tOptional Message:%d\n", getValAtAddress(sub_ark, add_ptr + 0x14, 16));
+ //DebugPrintTriggerVals(sub_ark, add_ptr, 28);
+ objList[objIndex].shockProperties[TRIG_PROPERTY_VARIABLE] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0xC, 16);
+ objList[objIndex].shockProperties[TRIG_PROPERTY_VALUE] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0x10, 16);
+ objList[objIndex].shockProperties[TRIG_PROPERTY_OPERATION] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0x12, 16);
+ objList[objIndex].shockProperties[TRIG_PROPERTY_MESSAGE1] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0x14, 16);
+ break;
+ }
+ case ObjectInteraction.ACTION_ACTIVATE:
+ { //Assume same behaviour as a trigger?
+ //fprintf(LOGFILE,"Switch:Action_Activate\n");
+ objList[objIndex].shockProperties[0] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0xC,16) ;
+ objList[objIndex].shockProperties[1] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0xe,16) ;
+ objList[objIndex].shockProperties[2] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x10,16) ;
+ objList[objIndex].shockProperties[3] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x12,16) ;
+ objList[objIndex].shockProperties[4] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x14,16) ;
+ objList[objIndex].shockProperties[5] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x16,16) ;
+ objList[objIndex].shockProperties[6] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x18,16) ;
+ objList[objIndex].shockProperties[7] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x1A,16) ;
+ break;
+ }
+ case ObjectInteraction.ACTION_MOVING_PLATFORM:
+ {
+ //fprintf(LOGFILE,"Switch:Action_Moving_Platform\n");
+ setElevatorProperties(LevelInfo,sub_ark,add_ptr,objList,objIndex);
+ break;
+ }
+ case ObjectInteraction.ACTION_CHOICE:
+ {
+ //fprintf(LOGFILE,"Switch:Action_Choice\n");
+ objList[objIndex].shockProperties[TRIG_PROPERTY_TRIG_1] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0x0C, 16);
+ objList[objIndex].shockProperties[TRIG_PROPERTY_TRIG_2] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0x10, 16);
+ break;
+ }
+ case ObjectInteraction.ACTION_LIGHTING:
+ {
+ //fprintf(LOGFILE,"Switch:Action_Lighting\n");
+ objList[objIndex].shockProperties[TRIG_PROPERTY_CONTROL_1] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 12, 16);
+ if (objList[objIndex].shockProperties[TRIG_PROPERTY_CONTROL_1] <= 3)
+ { //seems to be a special case?
+ objList[objIndex].shockProperties[TRIG_PROPERTY_CONTROL_1] = objIndex;
+ }
+ objList[objIndex].shockProperties[TRIG_PROPERTY_CONTROL_2] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 14, 16);
+ objList[objIndex].shockProperties[TRIG_PROPERTY_UPPERSHADE_1] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 22, 8);
+ objList[objIndex].shockProperties[TRIG_PROPERTY_LOWERSHADE_1] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 24, 8);
+ objList[objIndex].shockProperties[TRIG_PROPERTY_UPPERSHADE_2] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 23, 8);
+ objList[objIndex].shockProperties[TRIG_PROPERTY_LOWERSHADE_2] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 25, 8);
+ //fprintf(LOGFILE,"\t\tControl point 1:%d\n", objList[objIndex].shockProperties[TRIG_PROPERTY_CONTROL_1]);
+ //fprintf(LOGFILE,"\t\tControl point 2:%d\n", objList[objIndex].shockProperties[TRIG_PROPERTY_CONTROL_2]);
+ //fprintf(LOGFILE,"\t\t1st Time Upper Shade adjustment = %d\n", objList[objIndex].shockProperties[TRIG_PROPERTY_UPPERSHADE_1]);
+ //fprintf(LOGFILE,"\t\t1st Time Lower Shade adjustment = %d\n", objList[objIndex].shockProperties[TRIG_PROPERTY_LOWERSHADE_1]);
+ //fprintf(LOGFILE,"\t\t2nd Time Upper Shade adjustment = %d\n", objList[objIndex].shockProperties[TRIG_PROPERTY_UPPERSHADE_2]);
+ //fprintf(LOGFILE,"\t\t2nd Time Lower Shade adjustment = %d\n", objList[objIndex].shockProperties[TRIG_PROPERTY_LOWERSHADE_2]);
+ break;
+ }
+ case ObjectInteraction.ACTION_CHANGE_TYPE:
+ {
+ //fprintf(LOGFILE,"Switch:Action_Change_Type\n");
+ objList[objIndex].shockProperties[TRIG_PROPERTY_OBJECT] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0x0C, 16);
+ objList[objIndex].shockProperties[TRIG_PROPERTY_TYPE] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 0x10, 8);
+ //fprintf(LOGFILE, "\t\tObject to change:%d\n", objList[objIndex].shockProperties[TRIG_PROPERTY_OBJECT]);
+ //fprintf(LOGFILE, "\t\tNew type:%d\n", objList[objIndex].shockProperties[TRIG_PROPERTY_TYPE]);
+ break;
+ }
+ case ObjectInteraction.ACTION_CHANGE_STATE:
+ {
+ //fprintf(LOGFILE, "Switch:Action_Change_State\n");
+ objList[objIndex].shockProperties[TRIG_PROPERTY_TYPE] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 12, 16);
+ objList[objIndex].shockProperties[TRIG_PROPERTY_OBJECT] = (int)DataLoader.getValAtAddress(sub_ark.data, add_ptr + 16, 16);
+ //fprintf(LOGFILE, "\t\tObject to activate:%d\n", objList[objIndex].shockProperties[TRIG_PROPERTY_OBJECT]);
+ //fprintf(LOGFILE, "\t\tNew type:%d\n", objList[objIndex].shockProperties[TRIG_PROPERTY_TYPE]);
+ //DebugPrintTriggerVals(sub_ark, add_ptr, 30);
+ break;
+ }
+ default:
+ {
+ //fprintf(LOGFILE,"Switch:Default\n");
+ objList[objIndex].shockProperties[BUTTON_PROPERTY_TRIGGER] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+12,16);
+ objList[objIndex].shockProperties[BUTTON_PROPERTY_TRIGGER_2] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+16,16);
+ break;
+ }
+ }
+
+ //fprintf(LOGFILE,"\tDefault trigger target %d",objList[objIndex].shockProperties[BUTTON_PROPERTY_TRIGGER]);
+ //fprintf(LOGFILE,"\n\tVal_oc: %d\n" ,getValAtAddress(sub_ark,add_ptr+0x0c,16));
+ //fprintf(LOGFILE,"\tVal_oe: %d\n" ,getValAtAddress(sub_ark,add_ptr+0x0E,16));
+ //fprintf(LOGFILE,"\tVal_10: %d\n" ,getValAtAddress(sub_ark,add_ptr+0x10,16));
+ //fprintf(LOGFILE,"\tVal_12: %d\n" ,getValAtAddress(sub_ark,add_ptr+0x12,16));
+ //fprintf(LOGFILE,"\tVal_14: %d\n" ,getValAtAddress(sub_ark,add_ptr+0x14,16));
+ //fprintf(LOGFILE,"\tVal_16: %d\n" ,getValAtAddress(sub_ark,add_ptr+0x16,16));
+ //fprintf(LOGFILE,"\tVal_18: %d\n" ,getValAtAddress(sub_ark,add_ptr+0x18,16));
+ //fprintf(LOGFILE,"\tVal_1a: %d\n" ,getValAtAddress(sub_ark,add_ptr+0x1A,16));
+ //DebugPrintTriggerVals(sub_ark, add_ptr, 30);
+
+ return;
+ }
+ if((objList[objIndex].ObjectSubClass==2) && (objList[objIndex].ObjectSubClassIndex==0))
+ {//cyberspace terminal
+ //000C int16 X of target Cyberspace
+ //0010 int16 Y of target Cyberspace
+ //0014 int16 Z of target Cyberspace
+ //0018 int16 Level (Cyberspace)
+ objList[objIndex].shockProperties[0] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x0c,16);
+ objList[objIndex].shockProperties[1] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x10,16);
+ objList[objIndex].shockProperties[2] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x14,16);
+ objList[objIndex].shockProperties[3] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x18,16);
+ //fprintf(LOGFILE,"\tCyberspace (%d,%d,%d @ %d)\n",objList[objIndex].shockProperties[0],objList[objIndex].shockProperties[1],objList[objIndex].shockProperties[2],objList[objIndex].shockProperties[3]);
+ return;
+ }
+
+ if((objList[objIndex].ObjectSubClass==2) && (objList[objIndex].ObjectSubClassIndex>=1))
+ {//Fixup station/energy station
+ objList[objIndex].shockProperties[0] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x0c,16); //Amount of charge?/? always 255
+ objList[objIndex].shockProperties[1] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x10,16); //Security level?? //reuse timer??
+ //fprintf(LOGFILE,"\tEnergy Charge: %d %d\n",objList[objIndex].shockProperties[0] ,objList[objIndex].shockProperties[1] );
+ return;
+ }
+ if((objList[objIndex].ObjectSubClass==3) && (objList[objIndex].ObjectSubClassIndex<=3))
+ {
+ //puzzle panels. need to see them in the wild before I know what other stuff does
+ objList[objIndex].shockProperties[BUTTON_PROPERTY_TRIGGER]=(int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x0c,16);
+
+ //if bit 28 is set (0x10000000) it is a block puzzle, else it is a wire puzzle.
+ objList[objIndex].shockProperties[BUTTON_PROPERTY_PUZZLE]= ((int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x10,8)>>28) & 0x01;
+ if (objList[objIndex].shockProperties[BUTTON_PROPERTY_PUZZLE] == 1)
+ {
+ // fprintf(LOGFILE,"\tPuzzle panel: Type is block\n");
+ }
+ else
+ {
+ //fprintf(LOGFILE,"\tPuzzle panel: Type is wire\n");
+ }
+ //fprintf(LOGFILE,"\tTrigger is %d",objList[objIndex].shockProperties[BUTTON_PROPERTY_TRIGGER]);
+ return;
+ }
+
+ if((objList[objIndex].ObjectSubClass==3) && ((objList[objIndex].ObjectSubClassIndex==4) || (objList[objIndex].ObjectSubClassIndex==5) || (objList[objIndex].ObjectSubClassIndex==6)))
+ {//elevators
+
+ //Elevators (9 3 5):
+ //000C int16 Map index of Panel of target Level1 (this means the panel no itself!)
+ //000E int16 Map index of Panel of target Level2
+ //0012 int16 Map index of Panel of target Level3
+ //0018 int16 Bitfield of accessible Levels (Actual)
+ //001A int16 Bitfield of accessible Levels (Shaft)
+ // Levels with a 1 in the "shaft" field but not in the "Actual" field
+ // give a "Shaft damage: Unable to go there" message.
+
+ objList[objIndex].shockProperties[0] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x0c,16);//elevator panel ids
+ objList[objIndex].shockProperties[1] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x0E,16);
+ objList[objIndex].shockProperties[2] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x12,16);
+ objList[objIndex].shockProperties[3] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x18,16);//bitfields for access
+ objList[objIndex].shockProperties[4] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x1A,16);
+ //fprintf(LOGFILE,"\tElevator to one of %d, %d or %d panels on other levels\n",objList[objIndex].shockProperties[0],objList[objIndex].shockProperties[2],objList[objIndex].shockProperties[2]);
+ //fprintf(LOGFILE,"\tAccesable levels actual:%d shaft:%d\n",objList[objIndex].shockProperties[3],objList[objIndex].shockProperties[4]);
+
+ return;
+ }
+
+ if((objList[objIndex].ObjectSubClass==3) && ((objList[objIndex].ObjectSubClassIndex==7) || (objList[objIndex].ObjectSubClassIndex==8) ))
+ {
+ //Number Pads
+ //000C int16 Combination in BCD
+ //000E int16 Map Object to trigger
+ //0018 int16 Map Object to Extra Trigger (?)
+ int combo =(int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x0c,16);
+ int value =
+ (combo & 0x0F) * 1
+ +(combo>>4 & 0x0F) * 10
+ +(combo>>8 & 0x0F) * 100;
+ objList[objIndex].shockProperties[BUTTON_PROPERTY_COMBO] =value; // getValAtAddress(sub_ark,add_ptr+0x0c,16);
+
+ objList[objIndex].shockProperties[BUTTON_PROPERTY_TRIGGER] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x0E,16);
+ objList[objIndex].shockProperties[3] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x18,16); //extra trigger?
+ //fprintf(LOGFILE,"\tNumber pad. Combo is %d, Triggers %d",objList[objIndex].shockProperties[BUTTON_PROPERTY_COMBO],objList[objIndex].shockProperties[BUTTON_PROPERTY_TRIGGER] );
+ return;
+ }
+
+ //unknown object if all other tests fail. set the usual trigger value and keep an eye on this statement in debugging.
+ objList[objIndex].shockProperties[BUTTON_PROPERTY_TRIGGER]=(int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x0c,16);
+ /* shockProperties[0] = getValAtAddress(sub_ark,add_ptr+0x0c,16);
+ shockProperties[1] = getValAtAddress(sub_ark,add_ptr+0x10,16);
+ shockProperties[2] = getValAtAddress(sub_ark,add_ptr+0x12,16);
+ shockProperties[3] = getValAtAddress(sub_ark,add_ptr+0x14,16);
+ shockProperties[4] = getValAtAddress(sub_ark,add_ptr+0x16,16);
+ shockProperties[5] = getValAtAddress(sub_ark,add_ptr+0x18,16);
+ shockProperties[6] = getValAtAddress(sub_ark,add_ptr+0x1A,16);
+ shockProperties[7] = getValAtAddress(sub_ark,add_ptr+0x1B,16);
+ shockProperties[8] = getValAtAddress(sub_ark,add_ptr+0x1C,16); */
+ //fprintf(LOGFILE,"\tOther button type!");
+ //DebugPrintTriggerVals(sub_ark, add_ptr, 30);
+
+ }
+
+
+
+
+
+
+
+ void setElevatorProperties(TileInfo[,]LevelInfo,DataLoader.Chunk sub_ark,int add_ptr, ObjectLoaderInfo[] objList, int objIndex)
+ {
+
+ //000C int16 Tile x coord of platform
+ //0010 int16 Tile y coord of platform
+ //0014 int16 Target floor height
+ //0016 int16 Target ceiling height
+ //0018 int16 Speed
+
+ objList[objIndex].shockProperties[TRIG_PROPERTY_TARGET_X] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x0C,16);
+ objList[objIndex].shockProperties[TRIG_PROPERTY_TARGET_Y] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x10,16);
+ objList[objIndex].shockProperties[TRIG_PROPERTY_FLOOR] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x14,16); //5
+ objList[objIndex].shockProperties[TRIG_PROPERTY_CEILING] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x16,16); //6
+ objList[objIndex].shockProperties[TRIG_PROPERTY_SPEED] = (int)DataLoader.getValAtAddress(sub_ark.data,add_ptr+0x18,16);
+ //LevelInfo[objList[objIndex].shockProperties[TRIG_PROPERTY_TARGET_X]][objList[objIndex].shockProperties[TRIG_PROPERTY_TARGET_Y]].hasElevator =1;
+
+ //short ceilingFlag = (objList[objIndex].shockProperties[TRIG_PROPERTY_CEILING]<=SHOCK_CEILING_HEIGHT);
+ //short floorFlag = (objList[objIndex].shockProperties[TRIG_PROPERTY_FLOOR] <= SHOCK_CEILING_HEIGHT);
+ //short elevatorFlag = (ceilingFlag << 1) | (floorFlag);
+
+ //LevelInfo[objList[objIndex].shockProperties[TRIG_PROPERTY_TARGET_X]][objList[objIndex].shockProperties[TRIG_PROPERTY_TARGET_Y]].hasElevator = elevatorFlag;
+ //LevelInfo[objList[objIndex].shockProperties[TRIG_PROPERTY_TARGET_X],objList[objIndex].shockProperties[TRIG_PROPERTY_TARGET_Y]].hasElevator = elevatorFlag;
+
+ /*if (PrintDebug==1)
+ {
+ fprintf(LOGFILE,"\tACTION_MOVING_PLATFORM action for %s\n", UniqueObjectName(objList[objIndex]));
+ fprintf(LOGFILE,"\t\tTileX of Platform:%d\n",objList[objIndex].shockProperties[TRIG_PROPERTY_TARGET_X]);
+ fprintf(LOGFILE,"\t\tTileY of Platform:%d\n",objList[objIndex].shockProperties[TRIG_PROPERTY_TARGET_Y]);
+ fprintf(LOGFILE,"\t\tTarget floor height:%d\n",objList[objIndex].shockProperties[TRIG_PROPERTY_FLOOR]);
+ fprintf(LOGFILE,"\t\tTarget ceiling height:%d\n",objList[objIndex].shockProperties[TRIG_PROPERTY_CEILING]);
+ fprintf(LOGFILE,"\t\tSpeed:%d\n",objList[objIndex].shockProperties[TRIG_PROPERTY_SPEED]);
+ fprintf(LOGFILE,"\t\tMy elevator flag=%d\n",elevatorFlag);
+ DebugPrintTriggerVals(sub_ark, add_ptr, 28);
+ /* fprintf(LOGFILE,"\t\tOther values 1:%d\n",getValAtAddress(sub_ark,add_ptr+12,16));
+ fprintf(LOGFILE,"\t\tOther values 2:%d\n",getValAtAddress(sub_ark,add_ptr+14,16));
+ fprintf(LOGFILE,"\t\tOther values 3:%d\n",getValAtAddress(sub_ark,add_ptr+16,16));
+ fprintf(LOGFILE,"\t\tOther values 4:%d\n",getValAtAddress(sub_ark,add_ptr+18,16));
+ fprintf(LOGFILE,"\t\tOther values 5:%d\n",getValAtAddress(sub_ark,add_ptr+20,16));
+ fprintf(LOGFILE,"\t\tOther values 6:%d\n",getValAtAddress(sub_ark,add_ptr+22,16));
+ fprintf(LOGFILE,"\t\tOther values 7:%d\n",getValAtAddress(sub_ark,add_ptr+24,16));
+ fprintf(LOGFILE,"\t\tOther values 8:%d\n",getValAtAddress(sub_ark,add_ptr+26,16)); */
+ // }
+
+ }
+
+
+
+
+
+
+
+
}
diff --git a/UnityScripts/scripts/Loaders/ObjectLoaderInfo.cs b/UnityScripts/scripts/Loaders/ObjectLoaderInfo.cs
index 2e12abab..fc4edb4c 100644
--- a/UnityScripts/scripts/Loaders/ObjectLoaderInfo.cs
+++ b/UnityScripts/scripts/Loaders/ObjectLoaderInfo.cs
@@ -75,4 +75,22 @@ public class ObjectLoaderInfo {
public ObjectInteraction instance;
+ //Shock specific stuff
+ //TODO:Split UW specific and Shock specific out in to subclasses?
+ public int ObjectClass;
+ public int ObjectSubClass;
+ public int ObjectSubClassIndex;
+
+ public int Angle1;
+ public int Angle2;
+ public int Angle3;
+
+ public int sprite;
+ public int State;
+ public int unk1;//Probably a texture index.
+
+ public int[] shockProperties=new int[10]; //Shared properties memory
+ public int[] conditions=new int[4];
+ public int TriggerAction;//Needs to be split into a property.
+ public int TriggerOnce;
}
diff --git a/UnityScripts/scripts/Loaders/TextureLoader.cs b/UnityScripts/scripts/Loaders/TextureLoader.cs
index 4c22f752..63d8c51f 100644
--- a/UnityScripts/scripts/Loaders/TextureLoader.cs
+++ b/UnityScripts/scripts/Loaders/TextureLoader.cs
@@ -23,7 +23,7 @@ public class TextureLoader : ArtLoader {
private int TextureSplit=210;//at what point does a texture index refer to the floor instead of a wall in uw1/demo
private int FloorDim=32;
- const int BitMapHeaderSize=28;
+
///
/// Loads the image at index.
diff --git a/UnityScripts/scripts/Objects/ObjectInteraction.cs b/UnityScripts/scripts/Objects/ObjectInteraction.cs
index 2a08e623..601effba 100644
--- a/UnityScripts/scripts/Objects/ObjectInteraction.cs
+++ b/UnityScripts/scripts/Objects/ObjectInteraction.cs
@@ -128,6 +128,51 @@ public class ObjectInteraction : UWEBase {
public const int A_CHANGE_FROM_TRAP=103;
public const int A_CHANGE_TO_TRAP=104;
+
+ /*SYSTEM SHOCK TRIGGER TYPES. I'm adding 1000 to keep them seperate from the above*/
+ public const int SHOCK_TRIGGER_ENTRY = 1000; //Player enters trigger's tile
+ public const int SHOCK_TRIGGER_NULL = 1001 ;//Not set off automatically, must be explicitly activated by a switch or another trigger
+ public const int SHOCK_TRIGGER_FLOOR = 1002;
+ public const int SHOCK_TRIGGER_PLAYER_DEATH =1003;
+ public const int SHOCK_TRIGGER_DEATHWATCH= 1004; //Object is destroyed / dies
+ public const int SHOCK_TRIGGER_AOE_ENTRY = 1005;
+ public const int SHOCK_TRIGGER_AOE_CONTINOUS =1006;
+ public const int SHOCK_TRIGGER_AI_HINT= 1007;
+ public const int SHOCK_TRIGGER_LEVEL = 1008; //Player enters level
+ public const int SHOCK_TRIGGER_CONTINUOUS=1009;
+ public const int SHOCK_TRIGGER_REPULSOR = 1010; //Repulsor lift floor
+ public const int SHOCK_TRIGGER_ECOLOGY = 1011;
+ public const int SHOCK_TRIGGER_SHODAN = 1012;
+ public const int SHOCK_TRIGGER_TRIPBEAM = 1013;
+ public const int SHOCK_TRIGGER_BIOHAZARD = 1014;
+ public const int SHOCK_TRIGGER_RADHAZARD = 1015;
+ public const int SHOCK_TRIGGER_CHEMHAZARD= 1016;
+ public const int SHOCK_TRIGGER_MAPNOTE = 1017; //Map note placed by player (presumably)
+ public const int SHOCK_TRIGGER_MUSIC = 1018;
+
+
+ public const int ACTION_DO_NOTHING =0 ;
+ public const int ACTION_TRANSPORT_LEVEL= 1;
+ public const int ACTION_RESURRECTION =2;
+ public const int ACTION_CLONE= 3;
+ public const int ACTION_SET_VARIABLE= 4;
+ public const int ACTION_ACTIVATE= 6;
+ public const int ACTION_LIGHTING= 7;
+ public const int ACTION_EFFECT= 8;
+ public const int ACTION_MOVING_PLATFORM= 9;
+ public const int ACTION_TIMER = 11 ; //This is an assumption
+ public const int ACTION_CHOICE =12;
+ public const int ACTION_EMAIL =15;
+ public const int ACTION_RADAWAY= 16;
+ public const int ACTION_CHANGE_STATE= 19;
+ public const int ACTION_AWAKEN = 21;
+ public const int ACTION_MESSAGE= 22;
+ public const int ACTION_SPAWN= 23 ;
+ public const int ACTION_CHANGE_TYPE= 24;
+
+
+
+
public const int HEADINGNORTH =180;
public const int HEADINGSOUTH= 0;
public const int HEADINGEAST =270;
@@ -230,7 +275,11 @@ public class ObjectInteraction : UWEBase {
animationStarted=false;
sr= this.gameObject.GetComponentInChildren();
startPos=this.transform.position;
- canbeowned=GameWorldController.instance.commonObject.properties[item_id].CanBelongTo;
+ if (_RES!=GAME_SHOCK)
+ {
+ canbeowned=GameWorldController.instance.commonObject.properties[item_id].CanBelongTo;
+ }
+
}
void Update()
diff --git a/UnityScripts/scripts/Player Character/Character.cs b/UnityScripts/scripts/Player Character/Character.cs
index f9c0bf56..f338cbea 100644
--- a/UnityScripts/scripts/Player Character/Character.cs
+++ b/UnityScripts/scripts/Player Character/Character.cs
@@ -118,6 +118,7 @@ public void ApplyDamage(int damage, GameObject src)
if (_RES==GAME_SHOCK)
{
InteractionMode=UWCharacter.InteractionModePickup;
+ GameWorldController.instance.playerUW.playerCam.rect= new Rect(0.0f,0.0f,1.0f,1.0f);
}
}
diff --git a/UnityScripts/scripts/World/GameWorldController.cs b/UnityScripts/scripts/World/GameWorldController.cs
index 3166ae55..82d3cf6c 100644
--- a/UnityScripts/scripts/World/GameWorldController.cs
+++ b/UnityScripts/scripts/World/GameWorldController.cs
@@ -293,6 +293,8 @@ void Awake()
palLoader.PaletteNo=700;
palLoader.LoadPalettes();
texLoader=new TextureLoader();
+ objectMaster=new ObjectMasters();
+ ObjectArt=new GRLoader("res\\data\\objart.res",1350);
break;
default:
objectMaster=new ObjectMasters();
@@ -555,7 +557,9 @@ public void SwitchLevel(int newLevelNo)
}
else
{
- Tilemaps[newLevelNo].BuildTileMapShock(lev_ark_file_data, newLevelNo);
+ Tilemaps[newLevelNo].BuildTileMapShock(lev_ark_file_data, newLevelNo);
+ objectList[newLevelNo]=new ObjectLoader();
+ objectList[newLevelNo].LoadObjectListShock(Tilemaps[newLevelNo],lev_ark_file_data);
}
if (UWEBase.EditorMode==false)
{
@@ -615,9 +619,9 @@ public void SwitchLevel(int newLevelNo)
TileMapRenderer.GenerateLevelFromTileMap(LevelModel,_RES,Tilemaps[newLevelNo],objectList[newLevelNo]);
switch(UWEBase._RES)
- {//For the moment no objects in Shock
+ {
case GAME_SHOCK:
- break;
+ //break;
default:
ObjectLoader.RenderObjectList(objectList[newLevelNo],Tilemaps[newLevelNo],LevelMarker().gameObject);
break;
diff --git a/UnityScripts/scripts/World/TileMapRenderer.cs b/UnityScripts/scripts/World/TileMapRenderer.cs
index 0d8e8151..73712a18 100644
--- a/UnityScripts/scripts/World/TileMapRenderer.cs
+++ b/UnityScripts/scripts/World/TileMapRenderer.cs
@@ -218,7 +218,7 @@ public static void RenderDoorwayRear(GameObject Parent, TileMap level, ObjectLoa
float uvXPos4 = 1f; // or 1.2f/1.2f
//positions
- Vector3 position = objList.CalcObjectXYZ(1,level,level.Tiles,objList.objInfo,currDoor.index, currDoor.tileX, currDoor.tileY,0);
+ Vector3 position = objList.CalcObjectXYZ(_RES,level,level.Tiles,objList.objInfo,currDoor.index, currDoor.tileX, currDoor.tileY,0);
//center in the tile and at the bottom of the map.
switch (currDoor.heading*45)
{
@@ -381,7 +381,7 @@ public static void RenderDoorwayFront(GameObject Parent, TileMap level, ObjectLo
//Vector3 doorposition;
//positions
- Vector3 position = objList.CalcObjectXYZ(1,level,level.Tiles,objList.objInfo,currDoor.index, currDoor.tileX, currDoor.tileY,0);
+ Vector3 position = objList.CalcObjectXYZ(_RES,level,level.Tiles,objList.objInfo,currDoor.index, currDoor.tileX, currDoor.tileY,0);
//doorposition=position;
//center in the tile and at the bottom of the map.
switch (currDoor.heading*45)
@@ -620,7 +620,7 @@ public static void RenderPillars(GameObject Parent, TileMap level, ObjectLoader
{
if ((objList.objInfo[i].item_id==352) && (objList.objInfo[i].InUseFlag==1))
{
- Vector3 position = objList.CalcObjectXYZ(1,level,level.Tiles,objList.objInfo,i,(int)objList.objInfo[i].tileX,(int)objList.objInfo[i].tileY,0);
+ Vector3 position = objList.CalcObjectXYZ(_RES,level,level.Tiles,objList.objInfo,i,(int)objList.objInfo[i].tileX,(int)objList.objInfo[i].tileY,0);
//position =new Vector3( objList.objInfo[i].tileX*1.2f + 1.2f / 2f,position.y, objList.objInfo[i].tileY*1.2f + 1.2f / 2f);
Vector3[] Verts= new Vector3[24];
Vector2[] UVs= new Vector2[24];
@@ -699,7 +699,7 @@ public static void RenderBridges(GameObject Parent, TileMap level, ObjectLoader
{
if ((objList.objInfo[i].item_id==356) && (objList.objInfo[i].InUseFlag==1))
{
- Vector3 position = objList.CalcObjectXYZ(1,level,level.Tiles,objList.objInfo,i,(int)objList.objInfo[i].tileX,(int)objList.objInfo[i].tileY,0);
+ Vector3 position = objList.CalcObjectXYZ(_RES,level,level.Tiles,objList.objInfo,i,(int)objList.objInfo[i].tileX,(int)objList.objInfo[i].tileY,0);
position =new Vector3( objList.objInfo[i].tileX*1.2f + 1.2f / 2f,position.y, objList.objInfo[i].tileY*1.2f + 1.2f / 2f);
Vector3[] Verts= new Vector3[24];
Vector2[] UVs= new Vector2[24];
diff --git a/gameobjects.cpp b/gameobjects.cpp
index d5120892..981b3660 100644
--- a/gameobjects.cpp
+++ b/gameobjects.cpp
@@ -245,7 +245,7 @@ int ObjectSubClassIndex;
int MasterAddressLookup[1024];
long address_pointer=4;
- ObjectItem tmpObjList[1600];
+ //ObjectItem tmpObjList[1600];
unsigned char *archive_ark; //the full file.
unsigned char *xref_ark; //The crossref table
unsigned char *mst_ark; //The master table
diff --git a/gameobjects.h b/gameobjects.h
index df80a18b..cbe420a2 100644
--- a/gameobjects.h
+++ b/gameobjects.h
@@ -109,26 +109,26 @@
#define A_TIMER_TRIGGER 101
#define HIDDENPLACEHOLDER 999
-/*SYSTEM SHOCK TRIGGER TYPES. I'm adding 100 to keep them seperate from the above*/
-#define SHOCK_TRIGGER_ENTRY 100 //Player enters trigger's tile
-#define SHOCK_TRIGGER_NULL 101 //Not set off automatically, must be explicitly activated by a switch or another trigger
-#define SHOCK_TRIGGER_FLOOR 102
-#define SHOCK_TRIGGER_PLAYER_DEATH 103
-#define SHOCK_TRIGGER_DEATHWATCH 104 //Object is destroyed / dies
-#define SHOCK_TRIGGER_AOE_ENTRY 105
-#define SHOCK_TRIGGER_AOE_CONTINOUS 106
-#define SHOCK_TRIGGER_AI_HINT 107
-#define SHOCK_TRIGGER_LEVEL 108 //Player enters level
-#define SHOCK_TRIGGER_CONTINUOUS 109
-#define SHOCK_TRIGGER_REPULSOR 110 //Repulsor lift floor
-#define SHOCK_TRIGGER_ECOLOGY 111
-#define SHOCK_TRIGGER_SHODAN 112
-#define SHOCK_TRIGGER_TRIPBEAM 113
-#define SHOCK_TRIGGER_BIOHAZARD 114
-#define SHOCK_TRIGGER_RADHAZARD 115
-#define SHOCK_TRIGGER_CHEMHAZARD 116
-#define SHOCK_TRIGGER_MAPNOTE 117 //Map note placed by player (presumably)
-#define SHOCK_TRIGGER_MUSIC 118
+/*SYSTEM SHOCK TRIGGER TYPES. I'm adding 1000 to keep them seperate from the above*/
+#define SHOCK_TRIGGER_ENTRY 1000 //Player enters trigger's tile
+#define SHOCK_TRIGGER_NULL 1001 //Not set off automatically, must be explicitly activated by a switch or another trigger
+#define SHOCK_TRIGGER_FLOOR 1002
+#define SHOCK_TRIGGER_PLAYER_DEATH 1003
+#define SHOCK_TRIGGER_DEATHWATCH 1004 //Object is destroyed / dies
+#define SHOCK_TRIGGER_AOE_ENTRY 1005
+#define SHOCK_TRIGGER_AOE_CONTINOUS 1006
+#define SHOCK_TRIGGER_AI_HINT 1007
+#define SHOCK_TRIGGER_LEVEL 1008 //Player enters level
+#define SHOCK_TRIGGER_CONTINUOUS 1009
+#define SHOCK_TRIGGER_REPULSOR 1010 //Repulsor lift floor
+#define SHOCK_TRIGGER_ECOLOGY 1011
+#define SHOCK_TRIGGER_SHODAN 1012
+#define SHOCK_TRIGGER_TRIPBEAM 1013
+#define SHOCK_TRIGGER_BIOHAZARD 1014
+#define SHOCK_TRIGGER_RADHAZARD 1015
+#define SHOCK_TRIGGER_CHEMHAZARD 1016
+#define SHOCK_TRIGGER_MAPNOTE 1017 //Map note placed by player (presumably)
+#define SHOCK_TRIGGER_MUSIC 1018
//System Shock object classes
#define GUNS_WEAPONS 0
diff --git a/shock_object_settings.txt b/shock_object_settings.txt
new file mode 100644
index 00000000..d9e2126b
--- /dev/null
+++ b/shock_object_settings.txt
@@ -0,0 +1,476 @@
+0 0 0 0 23 ML_41_PISTOL 1 1 0 0 0 1
+1 0 0 1 23 SV_23_DARTGUN 4 4 0 0 0 1
+2 0 0 2 23 MAGNUM_2100 7 7 0 0 0 1
+3 0 0 3 23 MARK3_ASSAULT_RIFLE 10 10 0 0 0 1
+4 0 0 4 23 DC_05_RIOT_GUN 13 13 0 0 0 1
+5 0 1 0 23 AM_27_FLECHETTE 16 16 0 0 0 1
+6 0 1 1 23 RF_07_SKORPION 19 19 0 0 0 1
+7 0 2 0 23 SB_20_MAGPULSE 22 22 0 0 0 1
+8 0 2 1 23 MM_76_RAIL_GUN 25 25 0 0 0 1
+9 0 3 0 23 LEAD_PIPE 28 28 0 0 0 1
+10 0 3 1 23 TS_04_LASER_RAPIER 31 31 0 0 0 1
+11 0 4 0 23 SPARQ_BEAM 34 34 0 0 0 1
+12 0 4 1 23 ER_90_BLASTER 37 37 0 0 0 1
+13 0 4 2 23 RW_45_ION_RIFLE 40 40 0 0 0 1
+14 0 5 0 23 DH_07_STUNGUN 43 43 0 0 0 1
+15 0 5 1 23 LG_XX_PLASMA_RIFLE 46 46 0 0 0 1
+16 1 0 0 23 ML_STANDARD_ROUNDS 49 49 0 0 0 1
+17 1 0 1 23 ML_TEFLON_COATED_ROUNDS 52 52 0 0 0 1
+18 1 1 0 23 SV_NEEDLE_DARTS 55 55 0 0 0 1
+19 1 1 1 23 SV_TRANQ_DARTS 58 58 0 0 0 1
+20 1 2 0 23 HOLLOW_TIP_2100_CLIP 61 61 0 0 0 1
+21 1 2 1 23 HEAVY_SLUG_2100_CLIP 64 64 0 0 0 1
+22 1 2 2 23 DC_RUBBER_SLUGS 67 67 0 0 0 1
+23 1 3 0 23 MARK3_MAGNESIUM_TIP_SHELLS 70 70 0 0 0 1
+24 1 3 1 23 MARK3_PENETRATOR_SHELLS 73 73 0 0 0 1
+25 1 4 0 23 AM_HORNET_CLIP 76 76 0 0 0 1
+26 1 4 1 23 AM_SPLINTER_CLIP 79 79 0 0 0 1
+27 1 5 0 23 RF_SLAG_CLIP 82 82 0 0 0 1
+28 1 5 1 23 RF_LARGE_SLAG_CLIP 85 85 0 0 0 1
+29 1 6 0 23 SB_MAG_PULSE_CART 88 88 0 0 0 1
+30 1 6 1 23 MM_RAIL_CLIP 91 91 0 0 0 1
+31 2 0 0 23 BULLET_TRACER 94 94 0 0 0 1
+32 2 0 1 23 ENERGY_TRACER 97 97 0 0 0 1
+33 2 0 2 23 AUTOMATIC_TRACER 100 100 0 0 0 1
+34 2 0 3 23 NEEDLE_TRACER 105 105 0 0 0 1
+35 2 0 4 23 GRENADE_TRACER 108 108 0 0 0 1
+36 2 0 5 23 RUBBER_TRACER 111 111 0 0 0 1
+37 2 1 0 23 VIRUS_MUTANT_GLOB 113 113 0 0 0 1
+38 2 1 1 23 ELITE_MUTANT_FIRE 116 116 0 0 0 1
+39 2 1 2 23 ASSASSIN_STAR 120 120 0 0 0 1
+40 2 1 3 23 MUTANTBORG_FIRE 124 124 0 0 0 1
+41 2 1 4 23 ZERO_GRAV_PLASMA 128 128 0 0 0 1
+42 2 1 5 23 MAG_PULSE_PROJECTILE 132 132 0 0 0 1
+43 2 1 6 23 RAIL_GUN_PROJECTILE 136 136 0 0 0 1
+44 2 1 7 23 STUN_WAVE 139 139 0 0 0 1
+45 2 1 8 23 PLASMA_BLAST 143 143 0 0 0 1
+46 2 1 9 23 DATA_BOLT 0 0 0 0 0 1
+47 2 1 10 23 DISRUPTION_PULSE 0 0 0 0 0 1
+48 2 1 11 23 ICE_DRILL_ATTACK 0 0 0 0 0 1
+49 2 1 12 23 DISC 0 0 0 0 0 1
+50 2 1 13 23 STORM_BOLT 0 0 0 0 0 1
+51 2 1 14 23 CHLORO_BALL 0 0 0 0 0 1
+52 2 1 15 23 ACIDIC_SLIME 0 0 0 0 0 1
+53 2 2 0 23 DRONE_CAMERA 0 0 0 0 0 1
+54 2 2 1 23 EXPLODODRONE 0 0 0 0 0 1
+55 3 0 0 23 FRAGMENTATION_GRENADE 177 177 0 0 0 1
+56 3 0 1 23 EMP_GRENADE 180 180 0 0 0 1
+57 3 0 2 23 GAS_GRENADE 183 183 0 0 0 1
+58 3 0 3 23 CONCUSSION_BOMB 186 186 0 0 0 1
+59 3 0 4 23 LAND_MINE 189 189 0 0 0 1
+60 3 1 0 23 NITROPACK 192 192 0 0 0 1
+61 3 1 1 23 EARTH_SHAKER_EXPLOSIVE 195 195 0 0 0 1
+62 3 1 2 23 OBJECT_EXPLOSION 0 0 0 0 0 1
+63 4 0 0 23 STAMINUP__STIMULANT 200 200 0 0 0 1
+64 4 0 1 23 SIGHT_VISION_ENHANCEMENT 203 203 0 0 0 1
+65 4 0 2 23 BERSERK_COMBAT_BOOSTER 205 205 0 0 0 1
+66 4 0 3 23 MEDIPATCH__HEALING_AGENT 209 209 0 0 0 1
+67 4 0 4 23 REFLEX_REACTION_AID 212 212 0 0 0 1
+68 4 0 5 23 GENIUS_MIND_ENHANCER 215 215 0 0 0 1
+69 4 0 6 23 DETOX_UNIVERSAL_ANTIDOTE 218 218 0 0 0 1
+70 5 0 0 23 INFRARED_NIGHT_SIGHT_UNIT 221 221 0 0 0 1
+71 5 0 1 23 TARGET_IDENTIFIER 224 224 0 0 0 1
+72 5 0 2 23 SENSAROUND_MULTI_VIEW_UNIT 227 227 0 0 0 1
+73 5 0 3 23 AIM_ENHANCEMENT_HARDWARE 230 230 0 0 0 1
+74 5 0 4 23 HEAD_UP_DISPLAY_GOGGLES 0 0 0 0 0 1
+75 5 1 0 23 BIOLOGICAL_SYSTEMS_MONITOR 235 235 0 0 0 1
+76 5 1 1 23 NAVIGATION_AND_MAPPING_UNIT 239 239 0 0 0 1
+77 5 1 2 23 ENERGY/PROJECTILE_SHIELD 242 242 0 0 0 1
+78 5 1 3 23 MULTIMEDIA_DATA_READER 246 246 0 0 0 1
+79 5 1 4 23 HEAD_MOUNTED_LANTERN 249 249 0 0 0 1
+80 5 1 5 23 VIEW_CONTROL_UNIT 252 252 0 0 0 1
+81 5 1 6 23 ENVIRONMENTAL_PROTECTION_SUIT 255 255 0 0 0 1
+82 5 1 7 23 TURBO_MOTION_BOOSTER_SYSTEM 257 257 0 0 0 1
+83 5 1 8 23 JUMP_JET_MOTION_HARDWARE 260 260 0 0 0 1
+84 5 1 9 23 SYSTEM_ANALYZER 263 263 0 0 0 1
+85 6 0 0 23 ICE_DRILL_DEFENSE_BREAKER 0 0 0 0 0 1
+86 6 0 1 23 DATASTORM_ASSAULT_SOFTWARE 0 0 0 0 0 1
+87 6 0 2 23 MINE_EXPLOSIVE_MODULE 0 0 0 0 0 1
+88 6 0 3 23 DISC_HEAVY_ATTACK_PROGRAM 0 0 0 0 0 1
+89 6 0 4 23 PULSER_COMBAT_SOFTWARE 0 0 0 0 0 1
+90 6 0 5 23 SCRAMBLER_SOFTWARE_GRENADE 0 0 0 0 0 1
+91 6 0 6 23 VIRUS_SOME_COOL_THING 0 0 0 0 0 1
+92 6 1 0 23 CYBER_SHIELD 0 0 0 0 0 1
+93 6 1 1 23 OLD_FAKE_ID 0 0 0 0 0 1
+94 6 1 2 23 ICE_SHIELD 0 0 0 0 0 1
+95 6 2 0 23 TURBO_NAVIGATION_BOOSTER 0 0 0 0 0 1
+96 6 2 1 23 FAKE_ID_ICE_INFILTRATOR 0 0 0 0 0 1
+97 6 2 2 23 DECOY__EVASION_SYSTEM 0 0 0 0 0 1
+98 6 2 3 23 RECALL_ESCAPE_PROGAM 0 0 0 0 0 1
+99 6 3 0 23 TRIOPTIMUM_FUN_PACK_MODULE 0 0 0 0 0 1
+100 6 3 1 23 MONITOR 0 0 0 0 0 1
+101 6 3 2 23 IDENTIFY 0 0 0 0 0 1
+102 6 3 3 23 TRACE 0 0 0 0 0 1
+103 6 3 4 23 TOGGLE 0 0 0 0 0 1
+104 6 4 0 23 TEXT 0 0 0 0 0 1
+105 6 4 1 23 EMAIL 281 281 0 0 0 1
+106 6 5 0 23 MAP_SEGMENT 0 0 0 0 0 1
+107 7 0 0 23 PHONE 332 332 0 0 0 1
+108 7 0 1 23 VCR 0 0 0 0 0 1
+109 7 0 2 23 MICROWAVE_OVEN 0 0 0 0 0 1
+110 7 0 3 23 STEREO 0 0 0 0 0 1
+111 7 0 4 23 KEYBOARD 0 0 0 0 0 1
+112 7 0 5 23 SMALL_CPU 0 0 0 0 0 1
+113 7 0 6 23 TV 0 0 0 0 0 1
+114 7 0 7 23 COMPUTER_MONITOR 0 0 0 0 0 1
+115 7 0 8 23 COMPUTER_NODE 0 0 0 0 0 1
+116 7 1 0 23 DESK 0 0 0 0 0 1
+117 7 1 1 23 DESK 0 0 0 0 0 1
+118 7 1 2 23 CABINET 0 0 0 0 0 1
+119 7 1 3 23 SHELF 0 0 0 0 0 1
+120 7 1 4 23 BED 0 0 0 0 0 1
+121 7 1 5 23 CHAIR 0 0 0 0 0 1
+122 7 1 6 23 TABLE 0 0 0 0 0 1
+123 7 1 7 23 COUCH 0 0 0 0 0 1
+124 7 1 8 23 CHAIR 0 0 0 0 0 1
+125 7 1 9 23 COATTREE 387 387 0 0 0 1
+126 7 2 0 23 SIGN 390 390 0 0 0 1
+127 7 2 1 23 ICON 395 395 0 0 0 1
+128 7 2 2 23 GRAFFITI 399 399 0 0 0 1
+129 7 2 3 23 WORDS 0 0 0 0 0 1
+130 7 2 4 23 PAINTING 403 403 0 0 0 1
+131 7 2 5 23 POSTER 404 404 0 0 0 1
+132 7 2 6 23 SCREEN 0 0 0 0 0 1
+133 7 2 7 23 TEXTURE_MAP 0 0 0 0 0 1
+134 7 2 8 23 SCREEN 0 0 0 0 0 1
+135 7 2 9 23 SCREEN 0 0 0 0 0 1
+136 7 2 10 23 REPULSOR_LIGHTS 424 424 0 0 0 1
+137 7 3 0 23 LAMP 427 427 0 0 0 1
+138 7 3 1 23 FLOOR_LAMP 429 429 0 0 0 1
+139 7 3 2 23 GLOW_BULB 432 432 0 0 0 1
+140 7 3 3 23 CHANDELIER 435 435 0 0 0 1
+141 7 4 0 23 CONTROL_PEDESTAL 0 0 0 0 0 1
+142 7 4 1 23 TUBING 0 0 0 0 0 1
+143 7 4 2 23 CART 0 0 0 0 0 1
+144 7 4 3 23 SURGERY_MACHINE 0 0 0 0 0 1
+145 7 4 4 23 TESTTUBE_RACK 0 0 0 0 0 1
+146 7 4 5 23 CHAIR 0 0 0 0 0 1
+147 7 4 6 23 HOSPITAL_BED 0 0 0 0 0 1
+148 7 4 7 23 BROKEN_LAB_EQUIPMENT 0 0 0 0 0 1
+149 7 4 8 23 BROKEN_LAB_EQUIPMENT 0 0 0 0 0 1
+150 7 5 0 23 MICROSCOPE 0 0 0 0 0 1
+151 7 5 1 23 SCOPE 0 0 0 0 0 1
+152 7 5 2 23 PROBE 0 0 0 0 0 1
+153 7 5 3 23 X_RAY_MACHINE 0 0 0 0 0 1
+154 7 5 4 23 CAMERA 0 0 0 0 0 1
+155 7 5 5 23 CONTROL_PANEL 0 0 0 0 0 1
+156 7 5 6 23 CONTROL_PEDESTAL 0 0 0 0 0 1
+157 7 5 7 23 ENERGY_DRAIN_MINE 486 486 0 0 0 1
+158 7 6 0 23 STATUE 490 490 0 0 0 1
+159 7 6 1 23 SHRUB 492 492 0 0 0 1
+160 7 6 2 23 GRASS 495 495 0 0 0 1
+161 7 6 3 23 POTTED_PLANT 498 498 0 0 0 1
+162 7 6 4 23 FUNGUS 501 501 0 0 0 1
+163 7 6 5 23 FUNGUS 504 504 0 0 0 1
+164 7 6 6 23 FERN 507 507 0 0 0 1
+165 7 6 7 23 VINE 510 510 0 0 0 1
+166 7 6 8 23 VINE 513 513 0 0 0 1
+167 7 6 9 23 SMALL_PLANT 516 516 0 0 0 1
+168 7 6 10 23 PINE_TREE 519 519 0 0 0 1
+169 7 6 11 23 ROCK 0 0 0 0 0 1
+170 7 6 12 23 BOULDER 526 526 0 0 0 1
+171 7 6 13 23 SHRUBBERY 529 529 0 0 0 1
+172 7 6 14 23 VIRUS_INFECTED_SHRUB 532 532 0 0 0 1
+173 7 6 15 23 VIRUS_INFECTED_SHRUBBERY 535 535 0 0 0 1
+174 7 7 0 23 BRIDGE 0 0 0 0 0 1
+175 7 7 1 23 CATWALK 0 0 0 0 0 1
+176 7 7 2 23 REALWALL 0 0 0 0 0 1
+177 7 7 3 23 PILLAR 0 0 0 0 0 1
+178 7 7 4 23 BRASS_RAILING 0 0 0 0 0 1
+179 7 7 5 23 WOODEN_RAILING 0 0 0 0 0 1
+180 7 7 6 23 PILLAR 0 0 0 0 0 1
+181 7 7 7 23 FORCE_BRIDGE 560 560 0 0 0 1
+182 7 7 8 23 ELEPHANT_JORP 563 563 0 0 0 1
+183 7 7 9 23 FORCE_BRIDGE 566 566 0 0 0 1
+184 8 0 0 23 BEVERAGE_CONTAINER 568 568 0 0 0 1
+185 8 0 1 23 WRAPPER 570 570 0 0 0 1
+186 8 0 2 23 PAPERS 573 573 0 0 0 1
+187 8 0 3 23 WARECASING 577 577 0 0 0 1
+188 8 0 4 23 FIRE_EXTINGUISHER 579 579 0 0 0 1
+189 8 0 5 23 WORKER_HELMET 582 582 0 0 0 1
+190 8 0 6 23 LUMP_OF_CLOTHES 585 585 0 0 0 1
+191 8 0 7 23 BRIEFCASE 588 588 0 0 0 1
+192 8 1 0 23 BROKEN_GUN 592 592 0 0 0 1
+193 8 1 1 23 DEBRIS 595 595 0 0 0 1
+194 8 1 2 23 DEBRIS 598 598 0 0 0 1
+195 8 1 3 23 DEBRIS 601 601 0 0 0 1
+196 8 1 4 23 DEBRIS 604 604 0 0 0 1
+197 8 1 5 23 BROKEN_PANEL 607 607 0 0 0 1
+198 8 1 6 23 BROKEN_CLOCK 610 610 0 0 0 1
+199 8 1 7 23 DEBRIS 613 613 0 0 0 1
+200 8 1 8 23 BROKEN_LEVER 615 615 0 0 0 1
+201 8 1 9 23 BROKEN_LEVER 618 618 0 0 0 1
+202 8 2 0 23 HUMAN_CORPSE 622 622 0 0 0 1
+203 8 2 1 23 HUMAN_CORPSE 632 632 0 0 0 1
+204 8 2 2 23 HUMAN_CORPSE 642 642 0 0 0 1
+205 8 2 3 23 HUMAN_CORPSE 652 652 0 0 0 1
+206 8 2 4 23 HUMAN_CORPSE 662 662 0 0 0 1
+207 8 2 5 23 HUMAN_CORPSE 672 672 0 0 0 1
+208 8 2 6 23 HUMAN_CORPSE 682 682 0 0 0 1
+209 8 2 7 23 HUMAN_CORPSE 692 692 0 0 0 1
+210 8 2 8 23 SKELETON 702 702 0 0 0 1
+211 8 2 9 23 HUMAN_BONES 712 712 0 0 0 1
+212 8 2 10 23 BONES 715 715 0 0 0 1
+213 8 2 11 23 SKULL 718 718 0 0 0 1
+214 8 2 12 23 SEVERED_LIMB 720 720 0 0 0 1
+215 8 2 13 23 SEVERED_HEAD 724 724 0 0 0 1
+216 8 2 14 23 SEVERED_HEAD 734 734 0 0 0 1
+217 8 3 0 23 DISPOSABLE_LOGIC_PROBE 741 741 0 0 0 1
+218 8 3 1 23 ILLUDIUM_CADMIUM_BATTERY 744 744 0 0 0 1
+219 8 3 2 23 TELESCOPING_ROD 747 747 0 0 0 1
+220 8 3 3 23 FIRST_AID_KIT 750 750 0 0 0 1
+221 8 3 4 23 TRACTOR_BEAM 753 753 0 0 0 1
+222 8 3 5 23 BATTERY_PACK 756 756 0 0 0 1
+223 8 4 0 23 CURRENT_ACCESS_LEVELS 0 0 0 0 0 1
+224 8 4 1 23 STANDARD_ACCESS_CARD 761 761 0 0 0 1
+225 8 4 2 23 SCIENCE_ACCESS_CARD 764 764 0 0 0 1
+226 8 4 3 23 STORAGE__ACCESS_CARD 767 767 0 0 0 1
+227 8 4 4 23 ENGINEERING_ACCESS_CARD 770 770 0 0 0 1
+228 8 4 5 23 MEDICAL_ACCESS_CARD 773 773 0 0 0 1
+229 8 4 6 23 MAINTENANCE_ACCESS_CARD 776 776 0 0 0 1
+230 8 4 7 23 ADMINISTRATIVE_ACCESS_CARD 779 779 0 0 0 1
+231 8 4 8 23 SECURITY_ACCESS_CARD 782 782 0 0 0 1
+232 8 4 9 23 COMMAND_ACCESS_CARD 785 785 0 0 0 1
+233 8 4 10 23 GROUP_ACCESS_CARD 788 788 0 0 0 1
+234 8 4 11 23 PERSONAL_ACCESS_CARD 791 791 0 0 0 1
+235 8 5 0 23 MULTIPLEXER 796 796 0 0 0 1
+236 8 5 1 23 INTEGRITY_RESTORATIVE 799 799 0 0 0 1
+237 8 5 2 23 SECURITY_DEFENSE_MINE 802 802 0 0 0 1
+238 8 5 3 23 SECURITY_ID_MODULE 805 805 0 0 0 1
+239 8 5 4 23 DATA_VIOLATION 808 808 0 0 0 1
+240 8 5 5 23 ICEWALL 811 811 0 0 0 1
+241 8 5 6 23 INFORMATION_NODE 814 814 0 0 0 1
+242 8 5 7 23 CYBERSPACE_EXIT_PORTAL 817 817 0 0 0 1
+243 8 5 8 23 DATA_FRAGMENT 820 820 0 0 0 1
+244 8 5 9 23 CYBERSPACE_BARRICADE 822 822 0 0 0 1
+245 8 5 10 23 CYBERSPACE_DECOY 826 826 0 0 0 1
+246 8 5 11 23 NAVIGATIONAL_ARROW 829 829 0 0 0 1
+247 8 6 0 23 BEAM_BLAST 831 831 0 0 0 1
+248 8 6 1 23 ACID_CORROSION 834 834 0 0 0 1
+249 8 6 2 23 BULLET_HOLE 836 836 0 0 0 1
+250 8 6 3 23 EXPLOSION_RESIDUE 840 840 0 0 0 1
+251 8 6 4 23 BURN_RESIDUE 843 843 0 0 0 1
+252 8 6 5 23 BLOOD_STAIN 846 846 0 0 0 1
+253 8 6 6 23 CHEMICAL_STAIN 0 0 0 0 0 1
+254 8 6 7 23 OIL_PUDDLE 0 0 0 0 0 1
+255 8 6 8 23 WASTE_SPILL 0 0 0 0 0 1
+256 8 7 0 23 CHEMICAL_ISOTOPE_X_22 858 858 0 0 0 1
+257 8 7 1 23 ISOLINEAR_CHIPSET 860 860 0 0 0 1
+258 8 7 2 23 Z_44_PLASTIQUE(TM) 863 863 0 0 0 1
+259 8 7 3 23 CHEMICAL_ISOTOPE_X_22 866 866 0 0 0 1
+260 8 7 4 23 SYSTEMIC_SEQUENCER 869 869 0 0 0 1
+261 8 7 5 23 SUPERCONDUCTING_PROCESSOR 873 873 0 0 0 1
+262 8 7 6 23 MONOPOLE_STABILIZER 876 876 0 0 0 1
+263 8 7 7 23 INTERFACE_DEMODULATOR 879 879 0 0 0 1
+264 9 0 0 23 SWITCH 881 881 0 0 0 1
+265 9 0 1 23 SWITCH 883 883 0 0 0 1
+266 9 0 2 23 BUTTON 885 885 0 0 0 1
+267 9 0 3 23 BUTTON 889 889 0 0 0 1
+268 9 0 4 23 LEVER 897 897 0 0 0 1
+269 9 0 5 23 LEVER 899 899 0 0 0 1
+270 9 0 6 23 LARGE_BUTTON 905 905 0 0 0 1
+271 9 0 7 23 EMERGENCY_LEVER 909 909 0 0 0 1
+272 9 0 8 23 DIAL 913 913 0 0 0 1
+273 9 1 0 23 ACCESS_CARD_SLOT 920 920 0 0 0 1
+274 9 1 1 23 CIRCUIT_BOARD_SLOT 925 925 0 0 0 1
+275 9 1 2 23 POWER_CONVERTOR 930 930 0 0 0 1
+276 9 1 3 23 ANTENNA_RELAY_PANEL 935 935 0 0 0 1
+277 9 1 4 23 PLASTIQUED_ANTENNA_RELAY 939 939 0 0 0 1
+278 9 1 5 23 DESTROYED_ANTENNA_RELAY 942 942 0 0 0 1
+279 9 1 6 23 RETINAL_ID_SCANNER 945 945 0 0 0 1
+280 9 2 0 23 CYBERSPACE_TERMINAL 949 949 0 0 0 1
+281 9 2 1 23 ENERGY_CHARGE_STATION 952 952 0 0 0 1
+282 9 2 2 23 FIXUP_STATION 955 955 0 0 0 1
+283 9 3 0 23 ACCESS_PANEL 959 959 0 0 0 1
+284 9 3 1 23 ACCESS_PANEL 964 964 0 0 0 1
+285 9 3 2 23 ACCESS_PANEL 969 969 0 0 0 1
+286 9 3 3 23 ACCESS_PANEL 974 974 0 0 0 1
+287 9 3 4 23 ELEVATOR_PANEL 979 979 0 0 0 1
+288 9 3 5 23 ELEVATOR_PANEL 983 983 0 0 0 1
+289 9 3 6 23 ELEVATOR_PANEL 987 987 0 0 0 1
+290 9 3 7 23 KEYPAD_PANEL 991 991 0 0 0 1
+291 9 3 8 23 KEYPAD_PANEL 995 995 0 0 0 1
+292 9 3 9 23 ACCESS_PANEL 999 999 0 0 0 1
+293 9 3 10 23 ACCESS_PANEL 1004 1004 0 0 0 1
+294 9 4 0 23 AMMO_VENDING_MACHINE 1009 1009 0 0 0 1
+295 9 4 1 23 HEAL_VENDING_MACHINE 1013 1013 0 0 0 1
+296 9 5 0 23 INACTIVE_SWITCHING_NODE 1016 1016 0 0 0 1
+297 9 5 1 23 ACTIVE_SWITCHING_NODE 1019 1019 0 0 0 1
+298 9 5 2 23 DATAFLOW_ROUTER 1022 1022 0 0 0 1
+299 10 0 0 23 BLAST_DOOR 1027 1027 0 0 0 1
+300 10 0 1 23 SERVICE_ACCESS_DOOR 1030 1030 0 0 0 1
+301 10 0 2 23 DOOR 1033 1033 0 0 0 1
+302 10 0 3 23 DOOR 1036 1036 0 0 0 1
+303 10 0 4 23 DOOR 1039 1039 0 0 0 1
+304 10 0 5 23 DOOR 1042 1042 0 0 0 1
+305 10 0 6 23 STORAGE_ROOM_DOOR 1045 1045 0 0 0 1
+306 10 0 7 23 SHIELDED_DOOR 1048 1048 0 0 0 1
+307 10 0 8 23 EXECUTIVE_DOOR 1051 1051 0 0 0 1
+308 10 1 0 23 THE_WARM_STONE 1054 1054 0 0 0 1
+309 10 1 1 23 DOORWAY 0 0 0 0 0 1
+310 10 1 2 23 DOORWAY 0 0 0 0 0 1
+311 10 1 3 23 DOORWAY 0 0 0 0 0 1
+312 10 1 4 23 DOORWAY 0 0 0 0 0 1
+313 10 1 5 23 GRATING 1073 1073 0 0 0 1
+314 10 1 6 23 GRATING 1073 1073 0 0 0 1
+315 10 1 7 23 GRATING 1076 1076 0 0 0 1
+316 10 1 8 23 GRATING 1076 1076 0 0 0 1
+317 10 1 9 23 MY_TOE_IS_AN_EGGPLANT 0 0 0 0 0 1
+318 10 2 0 23 FORCE_DOOR 0 0 0 0 0 1
+319 10 2 1 23 FORCE_DOOR 0 0 0 0 0 1
+320 10 2 2 23 FORCE_DOOR 0 0 0 0 0 1
+321 10 2 3 23 FORCE_DOOR 0 0 0 0 0 1
+322 10 2 4 23 FORCE_DOOR 0 0 0 0 0 1
+323 10 2 5 23 ENERGY_GRATING 0 0 0 0 0 1
+324 10 2 6 23 GREAT_LORD_SNAQUEOTRAHN 0 0 0 0 0 1
+325 10 3 0 23 EXECUTIVE_ELEVATOR 1108 1108 0 0 0 1
+326 10 3 1 23 ELEVATOR_DOOR 1109 1109 0 0 0 1
+327 10 3 2 23 ELEVATOR_DOOR 1109 1109 0 0 0 1
+328 10 3 3 23 FREIGHT_ELEVATOR_DOOR 1112 1112 0 0 0 1
+329 10 3 4 23 SALT_THE_FRIES 0 0 0 0 0 1
+330 10 4 0 23 BULKHEAD_DOOR 1120 1120 0 0 0 1
+331 10 4 1 23 BULKHEAD_DOOR 1123 1123 0 0 0 1
+332 10 4 2 23 IRIS_DOOR 1126 1126 0 0 0 1
+333 10 4 3 23 VERTICAL_OPEN_DOOR 0 0 0 0 0 1
+334 10 4 4 23 VERTICAL_SPLIT_DOOR 1138 1138 0 0 0 1
+335 10 4 5 23 DARK_LORD_TUAOHTUA 1141 1141 0 0 0 1
+336 10 4 6 23 HIDDEN_DOOR 1144 1144 0 0 0 1
+337 10 4 7 23 HIDDEN_DOOR 0 0 0 0 0 1
+338 10 4 8 23 HIDDEN_DOOR 1149 1149 0 0 0 1
+339 10 4 9 23 REPORT_THIS_AS_A_BUG 1152 1152 0 0 0 1
+340 11 0 0 23 INACTIVE_EMERGENCY_SIGNAL 1159 1159 0 0 0 1
+341 11 0 1 23 ACTIVE_EMERGENCY_SIGNAL 1160 1160 0 0 0 1
+342 11 0 2 23 INACTIVE_EMERGENCY_SIGNAL 1163 1163 0 0 0 1
+343 11 0 3 23 ACTIVE_EMERGENCY_SIGNAL 1169 1169 0 0 0 1
+344 11 0 4 23 SPARKING_CABLES 0 0 0 0 0 1
+345 11 0 5 23 DEAD_MUTANT 0 0 0 0 0 1
+346 11 0 6 23 MACHINERY 1178 1178 0 0 0 1
+347 11 0 7 23 STATION_HOLOGRAM 1181 1181 0 0 0 1
+348 11 0 8 23 DEAD_MUTANT 0 0 0 0 0 1
+349 11 0 9 23 LIGHT_BLOOD 0 0 0 0 0 1
+350 11 0 10 23 CAMERA_EXPLOSION 0 0 0 0 0 1
+351 11 0 11 23 TV_EXPLOSION 0 0 0 0 0 1
+352 11 0 12 23 SIMPLE_SMOKE 0 0 0 0 0 1
+353 11 0 13 23 PLANT_EXPLOSION 0 0 0 0 0 1
+354 11 0 14 23 BULLET_WALL_HIT 0 0 0 0 0 1
+355 11 0 15 23 BEAM_WALL_HIT 0 0 0 0 0 1
+356 11 0 16 23 IMPACT 0 0 0 0 0 1
+357 11 0 17 23 PROJECTILE_HIT 0 0 0 0 0 1
+358 11 0 18 23 BEAM_HIT 0 0 0 0 0 1
+359 11 0 19 23 BEAM_HIT 0 0 0 0 0 1
+360 11 0 20 23 EXPLOSION 0 0 0 0 0 1
+361 11 0 21 23 EXPLOSION 0 0 0 0 0 1
+362 11 0 22 23 EXPLOSION 0 0 0 0 0 1
+363 11 0 23 23 LARGE_EXPLOSION 0 0 0 0 0 1
+364 11 0 24 23 MAGPULSE_HIT 0 0 0 0 0 1
+365 11 0 25 23 STUN_HIT 0 0 0 0 0 1
+366 11 0 26 23 PLASMA_BEAM_HIT 0 0 0 0 0 1
+367 11 0 27 23 SMOKEY_EXPLOSION 0 0 0 0 0 1
+368 11 0 28 23 CRATE_EXPLOSION 0 0 0 0 0 1
+369 11 0 29 23 MONITOR_EXPLOSION 0 0 0 0 0 1
+370 11 0 30 23 GAS_EXPLOSION 0 0 0 0 0 1
+371 11 0 31 23 EMP_EXPLOSION 0 0 0 0 0 1
+372 11 0 32 23 HUMANOID_CORPSE_EXPLOSION 1340 1340 0 0 0 1
+373 11 0 33 23 ROBOT_CORPSE_EXPLOSION 1343 1343 0 0 0 1
+374 12 0 0 23 ENTRY_TRIGGER 1346 1346 0 0 0 1
+375 12 0 1 23 NULL_TRIGGER 1349 1349 0 0 0 1
+376 12 0 2 23 FLOOR_TRIGGER 1352 1352 0 0 0 1
+377 12 0 3 23 PLAYER_DEATH_TRIGGER 1355 1355 0 0 0 1
+378 12 0 4 23 DEATH_WATCH_TRIGGER 1358 1358 0 0 0 1
+379 12 0 5 23 AREA_ENTER_TRIGGER 1361 1361 0 0 0 1
+380 12 0 6 23 AREA_CONTIN_TRIGGER 1364 1364 0 0 0 1
+381 12 0 7 23 CRITTER_AI_HINT 1367 1367 0 0 0 1
+382 12 0 8 23 LEVEL_ENTRY_TRIGGER 1370 1370 0 0 0 1
+383 12 0 9 23 CONTINUOUS_TRIGGER 1373 1373 0 0 0 1
+384 12 0 10 23 REPULSOR 1376 1376 0 0 0 1
+385 12 0 11 23 ECOLOGY_TRIGGER 1379 1379 0 0 0 1
+386 12 0 12 23 SHODAN_TRIGGER 1382 1382 0 0 0 1
+387 12 1 0 23 TRIP_BEAM 1385 1385 0 0 0 1
+388 12 2 0 23 BIO_HAZARD_VOODOO_MARK 1388 1388 0 0 0 1
+389 12 2 1 23 RAD_HAZARD_VOODOO_MARK 1393 1393 0 0 0 1
+390 12 2 2 23 CHEM_HAZARD_VOODOO 1396 1396 0 0 0 1
+391 12 2 3 23 MAP_NOTE 1400 1400 0 0 0 1
+392 12 2 4 23 MUSIC_VOODOO_MARKER 1402 1402 0 0 0 1
+393 13 0 0 23 CRATE 1404 1404 0 0 0 1
+394 13 0 1 23 CRATE 1407 1407 0 0 0 1
+395 13 0 2 23 CRATE 1410 1410 0 0 0 1
+396 13 1 0 23 RADIOACTIVE_WASTE_BARREL 1413 1413 0 0 0 1
+397 13 1 1 23 TOXIC_WASTE_BARREL 1417 1417 0 0 0 1
+398 13 1 2 23 CHEMICAL_TANK 1420 1420 0 0 0 1
+399 13 2 0 23 THERMOS 1423 1423 0 0 0 1
+400 13 2 1 23 VIAL 1426 1426 0 0 0 1
+401 13 2 2 23 FLASK 1428 1428 0 0 0 1
+402 13 2 3 23 BEAKER 1432 1432 0 0 0 1
+403 13 3 0 23 DEAD_HUMANOID_MUTANT 0 0 0 0 0 1
+404 13 3 1 23 DEAD_GOR_TIGER_MUTANT 1438 1438 0 0 0 1
+405 13 3 2 23 DEAD_INSECT_MUTANT 1441 1441 0 0 0 1
+406 13 3 3 23 DEAD_AVIAN_MUTANT 1445 1445 0 0 0 1
+407 13 3 4 23 DEAD_PLANT_MUTANT 1448 1448 0 0 0 1
+408 13 3 5 23 DEAD_ZERO_G_MUTANT 1451 1451 0 0 0 1
+409 13 3 6 23 DEAD_INVISIBLE_MUTANT 0 0 0 0 0 1
+410 13 3 7 23 DEAD_VIRUS_MUTANT 1457 1457 0 0 0 1
+411 13 4 0 23 DESTROYED_LIFTER_ROBOT 1460 1460 0 0 0 1
+412 13 4 1 23 DESTROYED_REPAIRBOT 1463 1463 0 0 0 1
+413 13 4 2 23 DESTROYED_SERV_BOT 0 0 0 0 0 1
+414 13 4 3 23 DESTROYED_EXEC_BOT 1469 1469 0 0 0 1
+415 13 4 4 23 DESTROYED_TURRET 1472 1472 0 0 0 1
+416 13 4 5 23 DESTROYED_HOPPER 1475 1475 0 0 0 1
+417 13 4 6 23 DESTROYED_SECURITY_1_ROBOT 0 0 0 0 0 1
+418 13 4 7 23 DESTROYED_SECURITY_2_ROBOT 1481 1481 0 0 0 1
+419 13 4 8 23 DESTROYED_AUTOBOMB 1484 1484 0 0 0 1
+420 13 4 9 23 DESTROYED_MAINTENANCE_ROBOT 0 0 0 0 0 1
+421 13 4 10 23 DESTROYED_FLIER 0 0 0 0 0 1
+422 13 4 11 23 DESTROYED_SECURITY_3_ROBOT 1494 1494 0 0 0 1
+423 13 4 12 23 DESTROYED__ROBOT 1497 1497 0 0 0 1
+424 13 5 0 23 DESTROYED_DRONE_CYBORG 1500 1500 0 0 0 1
+425 13 5 1 23 DESTROYED_WARRIOR_CYBORG 1504 1504 0 0 0 1
+426 13 5 2 23 DESTROYED_ASSASSIN_CYBORG 1507 1507 0 0 0 1
+427 13 5 3 23 DESTROYED_ENFORCER_CYBORG 1510 1510 0 0 0 1
+428 13 5 4 23 DESTROYED_ELITE_CYBORG 1513 1513 0 0 0 1
+429 13 5 5 23 DESTROYED_CORTEX_REAVER 1516 1516 0 0 0 1
+430 13 5 6 23 DESTROYED_MUTATED_CYBORG 1519 1519 0 0 0 1
+431 13 6 0 23 DEAD_DIEGO_CYBORG 1522 1522 0 0 0 1
+432 13 6 1 23 DESTROYED_CYBER_GUARD 1525 1525 0 0 0 1
+433 13 6 2 23 DESTROYED_CYBER_REAVER 1528 1528 0 0 0 1
+434 13 6 3 23 DESTROYED_DYNAMIC_ICE 1531 1531 0 0 0 1
+435 13 6 4 23 DESTROYED_HUNTER_KILLER 1534 1534 0 0 0 1
+436 13 6 5 23 DESTROYED_SHODAN_AVATAR 1537 1537 0 0 0 1
+437 13 6 6 23 DESTROYED_VIRUS 1541 1541 0 0 0 1
+438 13 6 7 23 DESTROYED_CYBER_DOG 1544 1544 0 0 0 1
+439 14 0 0 23 HUMANOID_MUTANT 1547 1547 0 0 0 1
+440 14 0 1 23 GORILLA_TIGER_MUTANT 1550 1550 0 0 0 1
+441 14 0 2 23 INSECTOID_MUTANT 1553 1553 0 0 0 1
+442 14 0 3 23 AVIAN_MUTANT 1556 1556 0 0 0 1
+443 14 0 4 23 PLANT_MUTANT 1559 1559 0 0 0 1
+444 14 0 5 23 ZERO_GRAVITY_CREATURE 1562 1562 0 0 0 1
+445 14 0 6 23 SONIC_THE_HEDGEHOG 1565 1565 0 0 0 1
+446 14 0 7 23 INVISIBLE_MUTANT 1568 1568 0 0 0 1
+447 14 0 8 23 VIRUS_MUTANT 1571 1571 0 0 0 1
+448 14 1 0 23 LIFTER 1574 1574 0 0 0 1
+449 14 1 1 23 REPAIRBOT 1577 1577 0 0 0 1
+450 14 1 2 23 SERV_BOT 1580 1580 0 0 0 1
+451 14 1 3 23 EXEC_BOT 1583 1583 0 0 0 1
+452 14 1 4 23 LARGE_TURRET 1586 1586 0 0 0 1
+453 14 1 5 23 HOPPER 1589 1589 0 0 0 1
+454 14 1 6 23 SECURITY_1_ROBOT 1592 1592 0 0 0 1
+455 14 1 7 23 SECURITY_2_ROBOT 1595 1595 0 0 0 1
+456 14 1 8 23 AUTOBOMB 1598 1598 0 0 0 1
+457 14 1 9 23 MAINTENANCE_ROBOT 1601 1601 0 0 0 1
+458 14 1 10 23 FLIER 1604 1604 0 0 0 1
+459 14 1 11 23 SECURITY_3_ROBOT 1607 1607 0 0 0 1
+460 14 2 0 23 CYBORG_DRONE 1610 1610 0 0 0 1
+461 14 2 1 23 CYBORG_WARRIOR 1613 1613 0 0 0 1
+462 14 2 2 23 CYBORG_ASSASSIN 1616 1616 0 0 0 1
+463 14 2 3 23 CYBORG_ENFORCER 1619 1619 0 0 0 1
+464 14 2 4 23 CYBORG_ELITE_GUARD 1622 1622 0 0 0 1
+465 14 2 5 23 CORTEX_REAVER 1623 1623 0 0 0 1
+466 14 2 6 23 MUTATED_CYBORG 1624 1624 0 0 0 1
+467 14 3 0 23 CYBERDOG 1625 1625 0 0 0 1
+468 14 3 1 23 CYBERGUARD 1627 1627 0 0 0 1
+469 14 3 2 23 CYBER_CORTEX_REAVER 1629 1629 0 0 0 1
+470 14 3 3 23 DYNAMIC_ICE 1631 1631 0 0 0 1
+471 14 3 4 23 CYBER_HUNTER_KILLER 1639 1639 0 0 0 1
+472 14 3 5 23 SHODAN 1643 1643 0 0 0 1
+473 14 3 6 23 CYBERGUARD 1649 1649 0 0 0 1
+474 14 4 0 23 SHODAN 0 0 0 0 0 1
+475 14 4 1 23 CYBORG_OF_EDWARD_DIEGO 0 0 0 0 0 1
\ No newline at end of file