//------------------------------------------------------------------------------- public List <ObjectRec> getCheese(int levelNo) { var objects = new List <ObjectRec>(); int baseAddr = getCheeseAddr(); if (baseAddr == -1) { return(objects); } int curAddr = baseAddr; byte objType = 0; while (objects.Count < 255) { byte b = Globals.romdata[curAddr]; if (b == 0xFF) { break; } if (b == 0xFE) { curAddr++; objType = Globals.romdata[curAddr++]; } byte x = Globals.romdata[curAddr++]; byte y = Globals.romdata[curAddr++]; var obj = new ObjectRec(objType, 0, 0, x * 32, y * 32); objects.Add(obj); } return(objects); }
public static List <ObjectList> getEnemiesFromArray(byte[] romdata, int baseAddr, int objCount) { var objects = new List <ObjectRec>(); const int ENEMY_REC_LEN = 12; for (int i = 0; i < objCount; i++) { int r = Utils.readWord(romdata, baseAddr + i * ENEMY_REC_LEN + 0); int x = Utils.readWord(romdata, baseAddr + i * ENEMY_REC_LEN + 2); int y = Utils.readWord(romdata, baseAddr + i * ENEMY_REC_LEN + 4); int t = Utils.readWord(romdata, baseAddr + i * ENEMY_REC_LEN + 6); int enemyAddr = Utils.readInt(romdata, baseAddr + i * ENEMY_REC_LEN + 8); int victimNo = enemyAddrToEnemyNo(enemyAddr); var dataDict = new Dictionary <string, int>(); dataDict["R"] = r; dataDict["T"] = t; var obj = new ObjectRec(victimNo, 0, 0, x / 2, y / 2, dataDict); objects.Add(obj); } return(new List <ObjectList> { new ObjectList { objects = objects, name = "Objects" } });; }
public List <ObjectList> getObjectsCad2(int levelNo) { //hack for prizes if (levelNo >= LEVEL_REC_COUNT) { return(getPrizesCad2(levelNo)); } LevelRec lr = ConfigScript.getLevelRec(levelNo); int addr = lr.objectsBeginAddr; int objCount = lr.objCount; var objects = new List <ObjectRec>(); for (int i = 0; i < objCount; i++) { int v = Globals.romdata[addr + i * 3 + 2]; int xx = Globals.romdata[addr + i * 3 + 0]; int yy = Globals.romdata[addr + i * 3 + 1]; int sx = (xx >> 4); int sy = (yy >> 4); int x = (xx & 0x0F) * 32; int y = (yy & 0x0F) * 32; var obj = new ObjectRec(v, sx, sy, x, y); objects.Add(obj); } return(new List <ObjectList> { new ObjectList { objects = objects, name = "Objects" } }); }
public List <ObjectList> getObjectsDt(int levelNo) { LevelRec lr = ConfigScript.getLevelRec(levelNo); int objCount = lr.objCount, addr = lr.objectsBeginAddr; var objects = new List <ObjectRec>(); var objLineOffsets = new byte[lr.height]; for (int i = 0; i < lr.height; i++) { objLineOffsets[i] = Globals.romdata[addr + i - lr.height]; } for (int i = 0; i < objCount; i++) { byte v = Globals.romdata[addr + i]; byte sx = Globals.romdata[addr - 3 * objCount + i - lr.height]; byte x = Globals.romdata[addr - 2 * objCount + i - lr.height]; byte y = Globals.romdata[addr - objCount + i - lr.height]; byte sy = convertObjectIndexToScreenYcoord(objLineOffsets, i); var obj = new ObjectRec(v, sx, sy, x, y); objects.Add(obj); } return(new List <ObjectList> { new ObjectList { objects = objects, name = "Objects" } }); }
public List <ObjectList> getPrizesCad2(int levelNo) { LevelRec lr = ConfigScript.getLevelRec(levelNo); int addr = lr.objectsBeginAddr; int objCount = lr.objCount; var objects = new List <ObjectRec>(); for (int i = 0; i < objCount; i++) { int xx = Globals.romdata[addr + i * 2 + 0]; int yy = Globals.romdata[addr + i * 2 + 1]; int sx = (xx >> 4); int v = (yy >> 4); int sy = 0; int x = (xx & 0x0F) * 32; int y = (yy & 0x0F) * 32; var obj = new ObjectRec(v, sx, sy, x, y); objects.Add(obj); } return(new List <ObjectList> { new ObjectList { objects = objects, name = "Items" } }); }
//addrs saved in ram at 77-79-7E-81 public List <ObjectList> getObjectsJungleBook(int levelNo) { LevelRec lr = ConfigScript.getLevelRec(levelNo); int objCount = lr.objCount; int objAddr = lr.objectsBeginAddr; var objects = new List <ObjectRec>(); for (int i = 0; i < objCount; i++) { byte x = Globals.romdata[objAddr - objCount * 2 + i]; byte y = Globals.romdata[objAddr - objCount * 1 + i]; byte v = Globals.romdata[objAddr + objCount * 0 + i]; byte data = Globals.romdata[objAddr + objCount * 1 + i]; int realx = x * 32 + 16; int realy = y * 32 + 16; var dataDict = new Dictionary <string, int>(); dataDict["data"] = data; var obj = new ObjectRec(v, 0, 0, realx, realy, dataDict); objects.Add(obj); } return(new List <ObjectList> { new ObjectList { objects = objects, name = "Objects" } }); }
public static List <ObjectList> getObjectsLM2(int levelNo) { LevelRec lr = ConfigScript.getLevelRec(levelNo); int objCount = lr.objCount, addr = lr.objectsBeginAddr; int addrSx = 0x13890; int addrX = 0x138C4; int addrY = addr - 1 * objCount; var objects = new List <ObjectRec>(); for (int i = 0; i < objCount; i++) { byte v = Globals.romdata[addr + i]; byte sx = Globals.romdata[addrSx + i]; byte x = Globals.romdata[addrX + i]; byte y = Globals.romdata[addrY + i]; byte sy = 0; var obj = new ObjectRec(v, sx, sy, x, y); objects.Add(obj); } return(new List <ObjectList> { new ObjectList { objects = objects, name = "Objects" } }); }
public List <ObjectList> getObjects(int levelNo) { LevelRec lr = ConfigScript.getLevelRec(levelNo); int objCount = lr.objCount; int baseAddr = lr.objectsBeginAddr; var objects = new List <ObjectRec>(); for (int i = 0; i < objCount; i++) { byte data = Globals.romdata[baseAddr + objCount * 0 + i]; byte x = Globals.romdata[baseAddr + objCount * 1 + i]; byte sx = (byte)(x & 0x0F); x = (byte)(x & 0xF0); byte y = Globals.romdata[baseAddr + objCount * 2 + i]; byte sy = (byte)(y & 0x0F); y = (byte)(y & 0xF0); int v = Utils.readWordUnsigned(Globals.romdata, baseAddr + objCount * 3 + i * 2); int enemyType = enemyNoToEnemyType[v]; var dataDict = new Dictionary <string, int>(); dataDict["data"] = data; var obj = new ObjectRec(enemyType, sx, sy, x, y, dataDict); objects.Add(obj); } return(new List <ObjectList> { new ObjectList { objects = objects, name = "Objects" } }); }
public List <ObjectList> getObjectsCad(int levelNo) { LevelRec lr = ConfigScript.getLevelRec(levelNo); int objCount = lr.objCount, addr = lr.objectsBeginAddr; var objects = new List <ObjectRec>(); for (int i = 0; i < objCount; i++) { byte v = Globals.romdata[addr + i]; if (levelNo != 4) { byte sx, sy, x, y; sx = Globals.romdata[addr - 4 * objCount + i]; x = Globals.romdata[addr - 3 * objCount + i]; sy = Globals.romdata[addr - 2 * objCount + i]; y = Globals.romdata[addr - objCount + i]; var obj = new ObjectRec(v, sx, sy, x, y); objects.Add(obj); } else //C&D LEVEL D EXCEPTION, unaligned pointers { byte sx = Globals.romdata[addr - 4 * objCount + 1 + i]; byte x = Globals.romdata[addr - 3 * objCount + 1 + i]; byte sy = Globals.romdata[addr - 2 * objCount + 1 + i]; byte y = Globals.romdata[addr - objCount + i]; var obj = new ObjectRec(v, sx, sy, x, y); objects.Add(obj); } } return(new List <ObjectList> { new ObjectList { objects = objects, name = "Objects" } }); }
private static void saveCommandObject(ObjectRec obj, int baseAddr) { int v = obj.type; var dataDict = obj.additionalData; Utils.writeWord(Globals.romdata, baseAddr, v); for (int i = 0; i < commandDict[v] * 2 - 2; i++) { Globals.romdata[baseAddr + 2 + i] = (byte)dataDict[String.Format("data{0}", i)]; } }
public static ObjectList getItemsFromArray(byte[] romdata, int baseAddr, int objCount) { var objects = new List <ObjectRec>(); const int ITEM_REC_LEN = 6; for (int i = 0; i < objCount; i++) { int x = Utils.readWord(romdata, baseAddr + i * ITEM_REC_LEN + 0); int y = Utils.readWord(romdata, baseAddr + i * ITEM_REC_LEN + 2); int t = Utils.readWord(romdata, baseAddr + i * ITEM_REC_LEN + 4); var obj = new ObjectRec(t, 0, 0, x / 2, y / 2); objects.Add(obj); } return(new ObjectList { objects = objects, name = "Items" }); }
public static void drawObject(Graphics g, ObjectRec curObject, int listNo, bool isSelected, float curScale, ImageList objectSprites, bool inactive, int leftMargin, int topMargin) { //don't render commands if (curObject.type >= 0xFF00) { return; } var dict = curObject.additionalData; var myFont = new Font(FontFamily.GenericSansSerif, 6.0f); int x = curObject.x, y = curObject.y; int addX = dict["addX"]; int addY = dict["addY"]; int fromFloor = dict["fromFloor"]; /*if (curObject.type < objectSprites.Images.Count) * { * var p1 = new Point((int)(x * curScale) - 8, (int)(y * curScale) - 8); * var p2 = new Point(p1.X + (int)(addX/2 * curScale) - 8, p1.Y + (int)(addY/2 * curScale) - 8); * g.DrawImage(objectSprites.Images[curObject.type], p1); * if (fromFloor == 0) * { * g.DrawImage(objectSprites.Images[curObject.type],p2); * g.DrawLine(new Pen(Brushes.Red), p1, p2); * } * } * else*/ { var p1 = new Point((int)(x * curScale) - 8, (int)(y * curScale) - 8); g.FillRectangle(Brushes.Black, new Rectangle(p1, new Size(16, 16))); g.DrawString(curObject.type.ToString("X3"), myFont, Brushes.White, p1); if (fromFloor == 0) { var p2 = new Point(p1.X + (int)(addX / 2 * curScale) - 8, p1.Y + (int)(addY / 2 * curScale) - 8); g.FillRectangle(Brushes.Green, new Rectangle(p2, new Size(16, 16))); g.DrawString(curObject.type.ToString("X3"), myFont, Brushes.White, p2); g.DrawLine(new Pen(Brushes.Red), p1, p2); } } if (isSelected) { g.DrawRectangle(new Pen(Brushes.Red, 2.0f), new Rectangle((int)(x * curScale) - 8, (int)(y * curScale) - 8, 16, 16)); } }
public List <ObjectList> getObjectsDt2(int levelNo) { LevelRec lr = ConfigScript.getLevelRec(levelNo); int objCount = lr.objCount, addr = lr.objectsBeginAddr; var objects = new List <ObjectRec>(); int objectsReaded = 0; int currentHeight = 0; while (objectsReaded < objCount) { byte command = Globals.romdata[addr]; if (command == 0xFF) { currentHeight = Globals.romdata[addr + 1]; if (currentHeight == 0xFF) { break; } addr += 2; } else { byte v = Globals.romdata[addr + 2]; byte xbyte = Globals.romdata[addr + 0]; byte ybyte = Globals.romdata[addr + 1]; byte sx = (byte)(xbyte >> 5); byte x = (byte)((xbyte & 0x1F) << 3); byte sy = (byte)currentHeight; byte y = ybyte; var obj = new ObjectRec(v, sx, sy, x, y); objects.Add(obj); objectsReaded++; addr += 3; } } return(new List <ObjectList> { new ObjectList { objects = objects, name = "Objects" } }); }
public static ObjectList getVictimsFromArray(byte[] romdata, int baseAddr, int objCount) { var objects = new List <ObjectRec>(); for (int i = 0; i < objCount; i++) { int x = Utils.readWord(romdata, baseAddr + i * 12 + 0); int y = Utils.readWord(romdata, baseAddr + i * 12 + 2); int data = Utils.readWord(romdata, baseAddr + i * 12 + 6); int victimAddr = Utils.readInt(romdata, baseAddr + i * 12 + 8); int victimNo = victimAddrToVictimNo(victimAddr); var dataDict = new Dictionary <string, int>(); dataDict["no"] = data; var obj = new ObjectRec(victimNo, 0, 0, x / 2, y / 2, dataDict); objects.Add(obj); } return(new ObjectList { objects = objects, name = "Victims" }); }
public static List <ObjectList> getObjectsNemo(int levelNo) { LevelRec lr = ConfigScript.getLevelRec(levelNo); int objCount = lr.objCount, addr = lr.objectsBeginAddr; var objects = new List <ObjectRec>(); var objScreenAddr = ConfigScript.getPalBytesAddr(); //not palBytes, but object sx/sy decode int screenIndex = 0; for (int i = 0; i < objCount; i++) { //read, how many objects at current screen while (true) { int curIndex = Globals.romdata[objScreenAddr]; int nextIndex = Globals.romdata[objScreenAddr + 1]; if (i < nextIndex) { break; } objScreenAddr++; screenIndex++; } int sx = screenIndex % lr.width; int sy = screenIndex / lr.width; // int v = Globals.romdata[addr + i * 2 + 0]; int xy = Globals.romdata[addr + i * 2 + 1]; int x = (xy >> 4) * 16; int y = (xy & 0x0F) * 16; var obj = new ObjectRec(v, sx, sy, x, y); objects.Add(obj); //hack for .NET optimizer(?). It fails to forever loop, if no this string var a = i.ToString(); } return(new List <ObjectList> { new ObjectList { objects = objects, name = "Objects" } }); }
//------------------------------------------------------------------------------- public List <ObjectRec> getEnemies(int levelNo) { LevelRec lr = ConfigScript.getLevelRec(levelNo); int objCount = lr.objCount; var objects = new List <ObjectRec>(); int baseAddr = lr.objectsBeginAddr; for (int i = 0; i < objCount; i++) { byte x = Globals.romdata[baseAddr + i * 4 + 0]; byte y = Globals.romdata[baseAddr + i * 4 + 1]; int realx = x * 32; int realy = y * 32; byte v = Globals.romdata[baseAddr + i * 4 + 3]; byte data = Globals.romdata[baseAddr + i * 4 + 2]; var dataDict = new Dictionary <string, int>(); dataDict["data"] = data; var obj = new ObjectRec(v, 0, 0, realx, realy, dataDict); objects.Add(obj); } return(objects); }
//addrs saved in ram at DD-DF-E1-E3 public List <ObjectList> getObjects(int levelNo) { LevelRec lr = ConfigScript.getLevelRec(levelNo); int objCount = lr.objCount; var objects = new List <ObjectRec>(); for (int i = 0; i < objCount; i++) { byte x = Globals.romdata[0x14D84 + i]; byte y = Globals.romdata[0x14D9C + i]; int realx = x * 16; int realy = y * 16; byte v = Globals.romdata[0x14DB4 + i]; var obj = new ObjectRec(v, 0, 0, realx, realy); objects.Add(obj); } return(new List <ObjectList> { new ObjectList { objects = objects, name = "Objects" } }); }
public static void drawObjectBig(Graphics g, ObjectRec curObject, int listNo, bool isSelected, float curScale, Image[] objectSpritesBig, bool inactive, int leftMargin, int topMargin) { int x = curObject.x, y = curObject.y; int xsize = objectSpritesBig[curObject.type].Size.Width; int ysize = objectSpritesBig[curObject.type].Size.Height; var rect = new Rectangle((int)((x - xsize) * curScale) + leftMargin, (int)((y - ysize) * curScale) + topMargin, (int)(xsize * curScale), (int)(ysize * curScale)); if (curObject.type < objectSpritesBig.Length) { g.DrawImage(objectSpritesBig[curObject.type], rect); } if (isSelected) { g.DrawRectangle(new Pen(Brushes.Red, 2.0f), rect); } if (inactive) { g.FillRectangle(new SolidBrush(Color.FromArgb(128, 255, 255, 255)), rect); g.DrawRectangle(new Pen(Brushes.Black, 1.0f), rect); } }
public List <ObjectList> getObjectsDwd(int levelNo) { LevelRec lr = ConfigScript.getLevelRec(levelNo); int objCount = lr.objCount, addr = lr.objectsBeginAddr; var objects = new List <ObjectRec>(); for (int i = 0; i < objCount; i++) { byte v = Globals.romdata[addr + i]; byte sx, sy, x, y; sx = Globals.romdata[addr - 4 * objCount + i]; x = Globals.romdata[addr - 3 * objCount + i]; sy = Globals.romdata[addr - 2 * objCount + i]; y = Globals.romdata[addr - objCount + i]; var obj = new ObjectRec(v, sx, sy, x, y); objects.Add(obj); } return(new List <ObjectList> { new ObjectList { objects = objects, name = "Objects" } }); }
//---------------------------------------------------------------------------- //Read only standart enemies (5 bytes per enemy) //other types: //0x0D - Bags (+1 byte) //0x1B - Fly chairs (+1 byte) //0xFF - var length (checkpoints, pointers to next rooms) //0x12 - arrow between rooms (7 bytes per arrow) public List <ObjectList> getObjects(int levelNo) { LevelRec lr = ConfigScript.getLevelRec(levelNo); int objCount = lr.objCount; int baseAddr = lr.objectsBeginAddr; var objects = new List <ObjectRec>(); for (int i = 0; i < objCount; i++) { int v = Globals.romdata[baseAddr + 5 * i + 0]; int x = Globals.romdata[baseAddr + 5 * i + 1] * 2; int sx = Globals.romdata[baseAddr + 5 * i + 2]; int y = Globals.romdata[baseAddr + 5 * i + 3] * 2; int sy = Globals.romdata[baseAddr + 5 * i + 4]; var obj = new ObjectRec(v, sx, sy, x, y); objects.Add(obj); } return(new List <ObjectList> { new ObjectList { objects = objects, name = "Objects" } }); }
public static List <ObjectList> getObjects(int levelNo) { LevelRec lr = ConfigScript.getLevelRec(levelNo); int objCount = lr.objCount; int baseAddr = lr.objectsBeginAddr; var objects = new List <ObjectRec>(); int objSize = 6; for (int i = 0; i < objCount; i++) { int dirIndex = Globals.romdata[baseAddr + objSize * i + 0]; int type = Globals.romdata[baseAddr + objSize * i + 1]; int flags1 = Globals.romdata[baseAddr + objSize * i + 2]; int x = Globals.romdata[baseAddr + objSize * i + 3]; int flags2 = Globals.romdata[baseAddr + objSize * i + 4]; int y = Globals.romdata[baseAddr + objSize * i + 5]; int direction = dirIndex & 0x40; int index = dirIndex & 0x3F; var dataDict = new Dictionary <string, int>(); dataDict["direction"] = direction; dataDict["index"] = index; dataDict["flags1"] = flags1; dataDict["flags2"] = flags2; int scrX = (x >> 4) - 1; int realX = (x & 0x0F) * 16; int scrY = (y >> 4) - 1; int realY = (y & 0x0F) * 16; var obj = new ObjectRec(type, scrX, scrY, realX, realY, dataDict); objects.Add(obj); } return(new List <ObjectList> { new ObjectList { objects = objects, name = "Objects" } }); }
public List <ObjectList> getObjects(int levelNo) { LevelRec lr = ConfigScript.getLevelRec(levelNo); int objCount = lr.objCount; int baseAddr = lr.objectsBeginAddr; var objects = new List <ObjectRec>(); for (int i = 0; i < objCount; i++) { byte x = Globals.romdata[baseAddr + objCount * 0 + i + 1]; byte y = Globals.romdata[baseAddr + objCount * 1 + i + 2]; byte v = Globals.romdata[baseAddr + objCount * 2 + i + 2]; int scrx = x >> 4; scrx &= 0x7; //if bit 8 set, that something happen int realx = (x & 0x0F) * 16; int realy = y; var obj = new ObjectRec(v, scrx, 0, realx, realy); objects.Add(obj); } return(new List <ObjectList> { new ObjectList { objects = objects, name = "Objects" } }); }
public static List <ObjectList> getObjectsTT(int levelNo) { LevelRec lr = ConfigScript.getLevelRec(levelNo); int objCount = lr.objCount, addr = lr.objectsBeginAddr; var objects = new List <ObjectRec>(); for (int i = 0; i < objCount; i++) { int v = Globals.romdata[addr + i * 3 + 0]; int xx = Globals.romdata[addr + i * 3 + 1]; int yy = Globals.romdata[addr + i * 3 + 2]; int sx = xx >> 4; int sy = 0; int x = (xx & 0x0F) * 16; int y = yy * 16; var obj = new ObjectRec(v, sx, sy, x, y); objects.Add(obj); } return(new List <ObjectList> { new ObjectList { objects = objects, name = "Objects" } }); }
public static List <ObjectList> getObjects(int levelNo) { LevelRec lr = ConfigScript.getLevelRec(levelNo); int objCount = lr.objCount, addr = lr.objectsBeginAddr; var objects = new List <ObjectRec>(); int curAddr = addr; while (objects.Count != objCount) { int baseAddr = curAddr; int v = Utils.readWordUnsigned(Globals.romdata, baseAddr); var dataDict = new Dictionary <string, int>(); if (v < 0xFF00) { int sx, sy, x, y, fromFloor, addX, addY; sx = 0; sy = 0; addX = 0; addY = 0; x = Utils.readWord(Globals.romdata, baseAddr + 8); y = Utils.readWord(Globals.romdata, baseAddr + 10); fromFloor = Utils.readWord(Globals.romdata, baseAddr + 6); if (fromFloor == 0) { x = Utils.readWord(Globals.romdata, baseAddr + 2); //x += Utils.readWord(Globals.romdata, baseAddr + 8)/2; y = Utils.readWord(Globals.romdata, baseAddr + 4); //y += Utils.readWord(Globals.romdata, baseAddr + 10)/2; addX = Utils.readWord(Globals.romdata, baseAddr + 8); addY = Utils.readWord(Globals.romdata, baseAddr + 10); } int data1 = Globals.romdata[baseAddr + 12]; int data2 = Globals.romdata[baseAddr + 13]; //read flags field dataDict["data1"] = data1; dataDict["data2"] = data2; //We don't read it as BYTE, must be WORD, but for now CadEditor can't show WORD in object's data comboBox //read addX field dataDict["data3"] = Globals.romdata[baseAddr + 2]; dataDict["data4"] = Globals.romdata[baseAddr + 3]; //read addY field dataDict["data5"] = Globals.romdata[baseAddr + 4]; dataDict["data6"] = Globals.romdata[baseAddr + 5]; //read real pos Fields as WORDs dataDict["fromFloor"] = fromFloor; dataDict["addX"] = addX; dataDict["addY"] = addY; var obj = new ObjectRec(v, sx, sy, x, y, dataDict); objects.Add(obj); curAddr += OBJ_SIZE; } else { objects.Add(makeCommandObject(v, curAddr)); curAddr += commandDict[v] * 2; } } return(new List <ObjectList> { new ObjectList { objects = objects, name = "Objects" } }); }
public static bool selectObjectBig(ObjectRec obj, Image[] objectSprites, int x, int y) { var bigObject = objectSprites[obj.type]; return((x > obj.x - bigObject.Width) && (x < obj.x) && (y > obj.y - bigObject.Height) && (y < obj.y)); }