RandyGaul / cute_headers

Collection of cross-platform one-file C/C++ libraries with no dependencies, primarily used for games
4.21k stars 264 forks source link

cute_tiled: object `type` field #362

Closed konsumer closed 8 months ago

konsumer commented 9 months ago

I swear this worked before, but I have objects like this:

Screenshot 2023-10-15 at 5 07 38 PM

I want the Class field to just show up as object->type.ptr. If I modify that class-parser part like this it works:

case 1485919047363370797U: // class
  // CUTE_TILED_WARNING("Class field of Tiled objects is not yet supported. Ignoring field.");
  // while (cute_tiled_peak(m) != ',' && cute_tiled_peak(m) != '}') cute_tiled_next(m);
  // if (cute_tiled_peak(m) == '}') continue;
  cute_tiled_intern_string(m, &object->type);
  break;

Since there is no type field, it seems to me like a pretty safe overload.

Want a PR for this?

RandyGaul commented 9 months ago

Okay, sounds fine to me! PR is welcome.

konsumer commented 9 months ago

Some more notes on this:

I had a map that saved like this:

"objects":[
    {
     "class":"player",
     "gid":1,
     "height":16,
     "id":1,
     "name":"",
     "rotation":0,
     "visible":true,
     "width":16,
     "x":384,
     "y":352
    }
]

Not even quite sure how I managed to save this, but it made all my code looking for type not work, so I think it may be some older compatibility setting, in save. I didn't hand-edit or anything, just some option when saving in Tiled. The PR simply treats class as if it's type, since they seem to be interchangeable. Like this is the current format, without editing anything by hand, just re-saving it:

[
  {
   "gid":1,
   "height":16,
   "id":1,
   "name":"",
   "rotation":0,
   "type":"player",
   "visible":true,
   "width":16,
   "x":384,
   "y":352
  }
]

Tiled editor, itself, seems to do the same thing. I opened the file with class and it worked fine (showing in the UI as Class) then saved it in a different location, and it renamed it to type with all the data in the same place. When I open that fixed file again, it looks the same:

Screenshot 2023-10-15 at 11 05 24 PM

Now, that it's saved with type it's not really a big deal to me either way. Not totally sure how I managed to save it with class but the PR would make it work for both types of files, and doesn't break the old behavior.

konsumer commented 9 months ago

I think the source of the prob is this:

type | string | The class of the object (was saved as class in 1.9, optional)

So, the field just got renamed in 1.9. Supporting both type and class and putting in type in the struct (as I do in PR) seems to be the correct behavior, to me.

RandyGaul commented 8 months ago

Thanks for the help!