예제 #1
0
파일: Utils.cs 프로젝트: gkjolin/CadEditor
        public static void defaultDrawObject(Graphics g, ObjectRec curObject, int listNo, bool isSelected, float curScale, ImageList objectSprites, bool inactive, int leftMargin, int topMargin)
        {
            int x = curObject.x, y = curObject.y;
            var myFont     = new Font(FontFamily.GenericSansSerif, 6.0f);
            var selectRect = new Rectangle((int)(x * curScale) - 8 + leftMargin, (int)(y * curScale) - 8 + topMargin, 16, 16);

            if (curObject.type < objectSprites.Images.Count)
            {
                g.DrawImage(objectSprites.Images[curObject.type], new Point((int)(x * curScale) - 8 + leftMargin, (int)(y * curScale) - 8 + topMargin));
            }
            else
            {
                g.FillRectangle(Brushes.Black, new Rectangle((int)(x * curScale) - 8 + leftMargin, (int)(y * curScale) - 8 + topMargin, 16, 16));
                g.DrawString(curObject.type.ToString("X3"), myFont, Brushes.White, new Point((int)(x * curScale) - 8 + leftMargin, (int)(y * curScale) - 8 + topMargin));
            }


            if (isSelected)
            {
                g.DrawRectangle(new Pen(Brushes.Red, 2.0f), selectRect);
            }
            else
            {
                g.DrawRectangle(new Pen(Brushes.White, 1.0f), selectRect);
            }

            if (inactive)
            {
                g.FillRectangle(new SolidBrush(Color.FromArgb(128, 255, 255, 255)), selectRect);
                g.DrawRectangle(new Pen(Brushes.Black, 1.0f), selectRect);
            }
        }
예제 #2
0
        private String makeStringForObject(ObjectRec obj)
        {
            int    screenNo = coordToScreenNo(obj);
            String ans      = String.Format("{0} <{1:X}>", obj.ToString(), screenNo);

            return(ans);
        }
예제 #3
0
    //-------------------------------------------------------------------------------
    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;
    }
예제 #4
0
        private int coordToScreenNo(ObjectRec obj)
        {
            int index = obj.sy * curLevelLayerData.width + obj.sx;

            if (index < 0 || index >= curLevelLayerData.width * curLevelLayerData.height)
            {
                return(-1);
            }
            return(index);
        }
예제 #5
0
 public static void drawObjectBig(Graphics g, ObjectRec curObject, int listNo, bool selected, float curScale, Image[] objectSprites, bool inactive, int leftMargin, int topMargin)
 {
     if (drawObjectBigFunc != null)
     {
         drawObjectBigFunc(g, curObject, listNo, selected, curScale, objectSprites, inactive, leftMargin, topMargin);
     }
     else
     {
         Utils.defaultDrawObjectBig(g, curObject, listNo, selected, curScale, objectSprites, inactive, leftMargin, topMargin);
     }
 }
예제 #6
0
        private bool isUndefindedObj(ObjectRec obj)
        {
            int scrNo = coordToScreenNo(obj);

            if (scrNo == -1)
            {
                return(false);
            }

            return((obj.type != 0xFF) && (curLevelLayerData.layer[scrNo] == 0));
        }
 public static List<ObjectList> getObjectsLM(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 = Globals.romdata[addr - 3 * objCount + i];
       byte x = Globals.romdata[addr - 2 * objCount + i];
       byte y = Globals.romdata[addr - 1 * objCount + 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" } };
 }
 //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 * 8;
     int realy = y * 8;
     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 List<ObjectList> getObjectsDwdAdvanceLastLevel(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 + 1 * objCount + i];
         x = Globals.romdata[addr + 2 * objCount + i];
         sy = Globals.romdata[addr + 3 * objCount + i];
         y = Globals.romdata[addr - +4 * 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<ObjectRec> 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 objects;
 }
 public List<ObjectRec> 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 objects;
 }
예제 #12
0
 public List<ObjectRec> 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 objects;
 }
예제 #13
0
 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" } };
 }
예제 #14
0
 public static List<ObjectRec> 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 objects;
 }
예제 #15
0
 //addrs saved in ram at D7-D9-DC-DC
 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>();
     for (int i = 0; i < objCount; i++)
     {
       byte x    = Globals.romdata[baseAddr + objCount*0 + i];
       byte y    = Globals.romdata[baseAddr + objCount*2 + i];
       int realx = x * 8;
       int realy = y * 8;
       byte v    = Globals.romdata[baseAddr + objCount*3 + i];
       byte data = Globals.romdata[baseAddr + objCount*1 + i];
       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" } };
 }
예제 #16
0
 public List<ObjectRec> getObjects(int levelNo)
 {
     LevelRec lr = ConfigScript.getLevelRec(levelNo);
     int baseAddr = lr.objectsBeginAddr;
     int objCount = lr.objCount;
     var objects = new List<ObjectRec>();
     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;
 }
예제 #17
0
    public static void drawObject(Graphics g, ObjectRec curObject, bool isSelected, float curScale, ImageList objectSprites)
    {
        //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));
    }
예제 #18
0
파일: Utils.cs 프로젝트: slagusev/CadEditor
        public static void defaultDrawObjectBig(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 / 2) * curScale) + leftMargin, (int)((y - ysize / 2) * 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> 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" } };
 }
 //copy-paste
 //addrs saved in ram at 77-79-7E-81
 public List<ObjectRec> getObjectsJungleBook2(int levelNo)
 {
     LevelRec lr = ConfigScript.getLevelRec(levelNo);
     int objCount = lr.objCount;
     var objects = new List<ObjectRec>();
     for (int i = 0; i < objCount; i++)
     {
     byte y    = Globals.romdata[0x187E8 + i];
     byte x    = Globals.romdata[0x187BB + i];
     byte data = Globals.romdata[0x18842 + i];
     byte v    = Globals.romdata[0x18815 + 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 objects;
 }
예제 #21
0
 public List<ObjectRec> 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 objects;
 }
예제 #22
0
 public static List<ObjectRec> 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 objects;
 }
 public List<ObjectRec> 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 objects;
 }
예제 #24
0
 public static List<ObjectRec> 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 objects;
 }
예제 #25
0
        private void mapScreen_MouseClick(object sender, MouseEventArgs e)
        {
            Point coord = screenNoToCoord();
            int type = curActiveBlock;
            int sx = coord.X, sy = coord.Y;
            int x = (int)(e.X / curScale);
            int y = (int)(e.Y / curScale);

            if (curTool == ToolType.Create)
            {
                int scrLevelNo = getLevelRecForGameType().levelNo;
                int coordXCount = (ConfigScript.getMaxObjCoordX() != -1) ? ConfigScript.getMaxObjCoordX() : ConfigScript.getScreenWidth(scrLevelNo) * 32;
                int coordYCount = (ConfigScript.getMaxObjCoordY() != -1) ? ConfigScript.getMaxObjCoordY() : ConfigScript.getScreenHeight(scrLevelNo) * 32;
                int minCoordX = ConfigScript.getMinObjCoordX();
                int minCoordY = ConfigScript.getMinObjCoordY();

                if (!ConfigScript.getScreenVertical())
                {
                    if (x >= coordXCount || y >= coordYCount || x < minCoordX || y < minCoordY)
                        return;
                }
                else
                {
                    if (y >= coordXCount || x >= coordYCount || y < minCoordX || x < minCoordY)
                        return;
                }
                dirty = true;
                if (bindToAxis)
                {
                    x = (x / 8) * 8;
                    y = (y / 8) * 8;
                }
                var dictionary = ConfigScript.getObjectDictionary(type);
                var obj = new ObjectRec(type, sx, sy, x, y, dictionary);

                int insertPos = lvObjects.SelectedItems.Count > 0 ? lvObjects.SelectedIndices[0] + 1 : lvObjects.Items.Count;
                objects.Insert(insertPos, obj);

                lvObjects.Items.Insert(insertPos, new ListViewItem(makeStringForObject(obj), obj.type));
                lbObjectsCount.Text = String.Format("Objects count: {0}/{1}", lvObjects.Items.Count, getLevelRecForGameType().objCount);
            }
            else if (curTool == ToolType.Delete)
            {
                for (int i = objects.Count - 1; i >= 0; i--)
                {
                    var obj = objects[i];
                    if ((obj.sx == sx) && (obj.sy == sy) && (Math.Abs(obj.x - x) < 8) && (Math.Abs(obj.y - y) < 8))
                    {
                        if (MessageBox.Show("Do you really want to delete object?", "Confirm", MessageBoxButtons.YesNo) != DialogResult.Yes)
                            return;
                        dirty = true;
                        objects.RemoveAt(i);
                        fillObjectsListBox();
                        break;
                    }
                }
                lvObjects.Select();
            }
            mapScreen.Invalidate();
        }
예제 #26
0
        private bool isUndefindedObj(ObjectRec obj)
        {
            int scrNo = coordToScreenNo(obj);
            if (scrNo == -1)
                return false;

               return (obj.type != 0xFF) && (curLevelLayerData.layer[scrNo] == 0);
        }
예제 #27
0
 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" } };
 }
예제 #28
0
 private int coordToScreenNo(ObjectRec obj)
 {
     int index = obj.sy * curLevelLayerData.width + obj.sx;
     if (index < 0 || index >= curLevelLayerData.width * curLevelLayerData.height)
         return -1;
     return index;
 }
예제 #29
0
 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)];
 }
예제 #30
0
 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" } };
 }
예제 #31
0
    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" } };
    }
예제 #32
0
        private void mapScreen_MouseClick(object sender, MouseEventArgs e)
        {
            var   mouseCoord = new Point(e.X, e.Y);
            Point coord = mouseCoordToSxSyCoord(mouseCoord);
            Point ocoord = mouseCoordToCoordInsideScreen(mouseCoord);
            int   type = curActiveBlock;
            int   sx = coord.X, sy = coord.Y;
            int   x = (int)(ocoord.X / curScale);
            int   y = (int)(ocoord.Y / curScale);

            if (curTool == ToolType.Create)
            {
                int scrLevelNo  = getLevelRecForGameType().levelNo;
                int coordXCount = ConfigScript.getScreenWidth(scrLevelNo) * 32;
                int coordYCount = ConfigScript.getScreenHeight(scrLevelNo) * 32;
                int minCoordX   = 0;
                int minCoordY   = 0;

                if (!ConfigScript.getScreenVertical())
                {
                    if (x >= coordXCount || y >= coordYCount || x < minCoordX || y < minCoordY)
                    {
                        return;
                    }
                }
                else
                {
                    if (y >= coordXCount || x >= coordYCount || y < minCoordX || x < minCoordY)
                    {
                        return;
                    }
                }
                setDirty();
                if (bindToAxis)
                {
                    x = (x / 8) * 8;
                    y = (y / 8) * 8;
                }
                var dictionary = ConfigScript.getObjectDictionary(curActiveObjectListIndex, type);
                var obj        = new ObjectRec(type, sx, sy, x, y, dictionary);

                int insertPos        = dgvObjects.SelectedRows.Count > 0 ? dgvObjects.SelectedRows[0].Index + 1 : dgvObjects.RowCount;
                var activeObjectList = objectLists[curActiveObjectListIndex];
                activeObjectList.objects.Insert(insertPos, obj);

                dgvObjects.DataSource = null;
                fillObjectsDataGrid();
            }
            else if (curTool == ToolType.Delete)
            {
                var activeObjectList = objectLists[curActiveObjectListIndex]; //TODO: all
                for (int i = activeObjectList.objects.Count - 1; i >= 0; i--)
                {
                    var obj = activeObjectList.objects[i];
                    if ((obj.sx == sx) && (obj.sy == sy) && (Math.Abs(obj.x - x) < 8) && (Math.Abs(obj.y - y) < 8))
                    {
                        if (MessageBox.Show("Do you really want to delete object?", "Confirm", MessageBoxButtons.YesNo) != DialogResult.Yes)
                        {
                            return;
                        }
                        setDirty();
                        dgvObjects.DataSource = null;
                        activeObjectList.objects.RemoveAt(i);
                        fillObjectsDataGrid();
                        break;
                    }
                }
            }
            mapScreen.Invalidate();
        }
  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" } };
  }
예제 #34
0
        private bool isMouseInside(ObjectRec obj, int x, int y, Image[] sprites)
        {
            var bigObject = sprites[obj.type];

            return((x > (obj.x - bigObject.Width / 2)) && (x < obj.x + bigObject.Width / 2) && (y > (obj.y - bigObject.Height / 2)) && (y < obj.y + bigObject.Height / 2));
        }
예제 #35
0
 private String makeStringForObject(ObjectRec obj)
 {
     int screenNo = coordToScreenNo(obj);
     String ans = String.Format("{0} <{1:X}>", obj.ToString(), screenNo);
     return ans;
 }