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