ribrdb / desynced-tools

Tools for working with behaviors and blueprints from Desynced.
MIT License
4 stars 3 forks source link

Behavior strings get corrupted #45

Closed swazrgb closed 6 months ago

swazrgb commented 6 months ago

I was testing longer behaviors, and occasionally get a behavior string that isn't recognized by the game and attempting to parse it with DesyncedJavascriptUtil gives: ERROR: cannot parse unknown type undefined

For example the following asm:

foo:
  .name "foo"
  .pname    p1, v
  set_reg   1, p1
  set_reg   2, p1
  set_reg   3, p1
  set_reg   4, p1
  set_reg   5, p1
  set_reg   6, p1
  set_reg   7, p1
  set_reg   8, p1
  set_reg   9, p1
  set_reg   10, p1
  set_reg   11, p1
  set_reg   12, p1
  set_reg   13, p1
  set_reg   14, p1
  set_reg   15, p1
  set_reg   16, p1
  set_reg   17, p1
  set_reg   18, p1
  set_reg   19, p1
  set_reg   20, p1
  set_reg   21, p1
  set_reg   22, p1
  set_reg   23, p1
  set_reg   24, p1
  set_reg   25, p1
  set_reg   26, p1
  set_reg   27, p1
  set_reg   28, p1
  set_reg   29, p1
  set_reg   30, p1
  set_reg   31, p1
  set_reg   32, p1
  set_reg   33, p1
  set_reg   34, p1
  set_reg   35, p1
  set_reg   36, p1
  set_reg   37, p1
  set_reg   38, p1
  set_reg   39, p1
  set_reg   40, p1
  set_reg   41, p1
  set_reg   42, p1
  set_reg   43, p1
  set_reg   44, p1
  set_reg   45, p1
  set_reg   46, p1
  set_reg   47, p1
  set_reg   48, p1
  set_reg   49, p1
  set_reg   50, p1
  set_reg   51, p1
  set_reg   52, p1
  set_reg   53, p1
  set_reg   54, p1
  set_reg   55, p1
  set_reg   56, p1
  set_reg   57, p1
  set_reg   58, p1
  set_reg   59, p1
  set_reg   60, p1
  set_reg   61, p1
  set_reg   62, p1
  set_reg   63, p1
  set_reg   64, p1
  set_reg   65, p1
  set_reg   66, p1
  set_reg   67, p1
  set_reg   68, p1
  set_reg   69, p1
  set_reg   70, p1
  set_reg   71, p1
  set_reg   72, p1
  set_reg   73, p1
  set_reg   74, p1
  set_reg   75, p1
  set_reg   76, p1
  set_reg   77, p1
  set_reg   78, p1
  set_reg   79, p1
  set_reg   80, p1
  set_reg   81, p1
  set_reg   82, p1
  set_reg   83, p1
  set_reg   84, p1
  set_reg   85, p1
  set_reg   86, p1
  set_reg   87, p1
  set_reg   88, p1
  set_reg   89, p1
  set_reg   90, p1
  set_reg   91, p1
  set_reg   92, p1
  set_reg   93, p1
  set_reg   94, p1
  set_reg   95, p1
  set_reg   96, p1
  set_reg   97, p1
  set_reg   98, p1
  set_reg   99, p1
  set_reg   100, p1
  set_reg   101, p1
  set_reg   102, p1
  set_reg   103, p1
  set_reg   104, p1
  set_reg   105, p1
  set_reg   106, p1
  set_reg   107, p1
  set_reg   108, p1
  set_reg   109, p1
  set_reg   110, p1
  set_reg   111, p1
  set_reg   112, p1
  set_reg   113, p1
  set_reg   114, p1
  set_reg   115, p1
  set_reg   116, p1
  set_reg   117, p1
  set_reg   118, p1
  set_reg   119, p1
  set_reg   120, p1
  set_reg   121, p1
  set_reg   122, p1
  set_reg   123, p1
  set_reg   124, p1
  set_reg   125, p1
  set_reg   126, p1
  set_reg   127, p1
  set_reg   128, p1
  set_reg   129, p1
  set_reg   130, p1
  .ret  

Produces this corrupt behavior string:

DSC3Ic3nYCqG1m8zmZ0aCCjA3TebDk4NuaDH2zgg3R0ux0MI2a7nEJ0BOX2R4Frjkn0hMvW741ZKbq2TyUXd4TgCaJ2S2iVW2JZmNT27rS710T6cG73lrh2D0YfpNm2wxA0L2zew1E2SRriW0tDgVO1CPSDS1EgFBp1AzSdF1LBXSb30vilk30vaDI1qGXxp2xsKIq1Ul8BQ1UTT4k1V2fMw4YlJN43bzB4a31WIHI4CBfq42jLwt62z7OW42i9q9q2iIdic2i4LBS2QoZC20Cokl70Uz4Y608HBD04Hp6sc31SrPG31Rkxj1qoe3b0HfdZY2ZBlqX2WuSuo2bS3GM3gRNcw2p4HYt2o0XzS2o165V1dKtNf0RaBfw2wQkWb2xZ90m2w99Qa0poKQm2AL8Vo4Vfgpc2ZJuCm1KIa084C5DQk1GS8KG2nIREn3pGXZ30jsDWL0jWBex2WsQEw2UCFR72wAg622WnlmK261rwR1F5zC12we4hz2xmLN62vvx5o2DMvYy2otjUY4gEWX930nCZd24gCWF3Tu4i31ErhMd49HlpO3RoDYW1ahQAU48DM7t0PtEII0R7PPE4SFLPrD

Removing the last line (set_reg 130, p1) results in a functional behavior string which I can load in the game. If I add the final set_reg node in the game and export the behavior string from the game I get:

DSC3Ii3nYCqG1m9GrN3VrYJA2BcELN2Bdugp2SAPzT0vxivi17rRdV2NB1G10bc29k0aVqv62C57oH2HUZT51blibj1CQgmN1E1ev93IdWnH0huHr01qINWj3LsIzh1TNp8q0kG6lo0kXhvi33TxwX1U4wFM1UXrrW1UGGiQ13ZyWQ2ews3c3pTk6K3F93Jw4PoQsi2zdovk2iCadY2i8BrY2iGzQK3WtUjk0PJ5cH0GDwWA0YOGJG0NsIPq31PpsO31S20m31Qvoa2PQsmK2VvOrC2aSSFW2YBf4k3nOYio1wbKlt1vVmrs1vVVos1vW3uv0Vr5y32xJkG52wkY442xswYG00vJtU2SVH7G1Hq6KG3dAef21uL16W0k4JjG0kLsod0kD5F50Wrw951H4FRU1rKgI01ZAKto0UPqg03IsQMx3Gg3oM1zL1Mf3L04VV1Ie7Dt0jxgXT0N5bL92yYiKZ2bEeoK3bjVUC49Ctri130khE0VsTDC2xUkE12w4kdo2xD94u0l68ZY0VSAZ82L1yff1bYERS3jsTPx2XBU783AAFp91iF75W0Nhpxa3bmO7D3dHiRq2ANBnr0Vezgj3oWUfQr

Which does parse correctly.

swazrgb commented 6 months ago

I asked on the Desynced discord and Bernhard from Stage said they would hopefully publish an implementation of how to serialize these strings as well

ribrdb commented 6 months ago

Hmm, the data seems mostly correct, but the data stream ends before the reader is done. The decompressed data from the game is 6 bytes longer

swazrgb commented 6 months ago

Here is another one which gives a different error message: ERROR: Unable to parse table key of type 'table'

ASM:

foo:
  .name "foo"
  .pname    p1, v
  set_reg   1, p1
  set_reg   2, p1
  set_reg   3, p1
  set_reg   4, p1
  set_reg   5, p1
  set_reg   6, p1
  set_reg   7, p1
  set_reg   8, p1
  set_reg   9, p1
  set_reg   10, p1
  set_reg   11, p1
  set_reg   12, p1
  set_reg   13, p1
  set_reg   14, p1
  set_reg   15, p1
  set_reg   16, p1
  set_reg   17, p1
  set_reg   18, p1
  set_reg   19, p1
  set_reg   20, p1
  set_reg   21, p1
  set_reg   22, p1
  set_reg   23, p1
  set_reg   24, p1
  set_reg   25, p1
  set_reg   26, p1
  set_reg   27, p1
  set_reg   28, p1
  set_reg   29, p1
  set_reg   30, p1
  set_reg   31, p1
  set_reg   32, p1
  set_reg   33, p1
  set_reg   34, p1
  set_reg   35, p1
  set_reg   36, p1
  set_reg   37, p1
  set_reg   38, p1
  set_reg   39, p1
  set_reg   40, p1
  set_reg   41, p1
  set_reg   42, p1
  set_reg   43, p1
  set_reg   44, p1
  set_reg   45, p1
  set_reg   46, p1
  set_reg   47, p1
  set_reg   48, p1
  set_reg   49, p1
  set_reg   50, p1
  set_reg   51, p1
  set_reg   52, p1
  set_reg   53, p1
  set_reg   54, p1
  set_reg   55, p1
  set_reg   56, p1
  set_reg   57, p1
  set_reg   58, p1
  set_reg   59, p1
  set_reg   60, p1
  set_reg   61, p1
  set_reg   62, p1
  set_reg   63, p1
  set_reg   64, p1
  set_reg   65, p1
  set_reg   66, p1
  set_reg   67, p1
  set_reg   68, p1
  set_reg   69, p1
  set_reg   70, p1
  set_reg   71, p1
  set_reg   72, p1
  set_reg   73, p1
  set_reg   74, p1
  set_reg   75, p1
  set_reg   76, p1
  set_reg   77, p1
  set_reg   78, p1
  set_reg   79, p1
  set_reg   80, p1
  set_reg   81, p1
  set_reg   82, p1
  set_reg   83, p1
  set_reg   84, p1
  set_reg   85, p1
  set_reg   86, p1
  set_reg   87, p1
  set_reg   88, p1
  set_reg   89, p1
  set_reg   90, p1
  set_reg   91, p1
  set_reg   92, p1
  set_reg   93, p1
  set_reg   94, p1
  set_reg   95, p1
  set_reg   96, p1
  set_reg   97, p1
  set_reg   98, p1
  set_reg   99, p1
  set_reg   100, p1
  set_reg   101, p1
  set_reg   102, p1
  set_reg   103, p1
  set_reg   104, p1
  set_reg   105, p1
  set_reg   106, p1
  set_reg   107, p1
  set_reg   108, p1
  set_reg   109, p1
  set_reg   110, p1
  set_reg   111, p1
  set_reg   112, p1
  set_reg   113, p1
  set_reg   114, p1
  set_reg   115, p1
  set_reg   116, p1
  set_reg   117, p1
  set_reg   118, p1
  set_reg   119, p1
  set_reg   120, p1
  set_reg   121, p1
  set_reg   122, p1
  set_reg   123, p1
  set_reg   124, p1
  set_reg   125, p1
  set_reg   126, p1
  set_reg   127, p1
  set_reg   128, p1
  .ret  

Behavior string:

DSC3Gk3nYCqG1m9GpZ3VrTyS4NHoZf4NHpNe1vmpf40yETvV0P3GJu0UwJhA3RU5zE1K2fOk2B3eZj48UYWx0fSpsk4P99701bmD9u4Y0oOb3HaHdg1w3xjZ0MrtWc0g3FtD0g8N5Q1Xb0c61UYd0s1M4e1s1M92oG1M1tXg3Yb6d005qB5M0EvKyr03ZOJJ1qkE572gOfjt2gO7W71VjuPn2UATVw1HfHhq1GWdFB1InQPx4BciCH1YcJ4l3tQ4Hr3tQLKs0xkcNv2Z7zU21TETSU1Tnfha1T5fuU0QTMTa17RMQg2I6daa03aSNM1udMuO2iTNbU2iOxpB2iXlOj18ikgb0xyB9A0oqxcg171J0s0dUzko1uwZbD1qhQWf1qjcur1qgsQf1mcLpr2PWuIe2U4UFO1HummY0v4RDt1InDuA0BXAQC2XYknq1RAB8M1311o93FFnYl0ThSiH0qpXI212J9yT0qPMIa0OjuTM1hf398261ETD262KXj4RLAK74gRobI0bWrz81YnJCd4Ovfp61hwlCb3buyhi3YOvmb4OLOQZ0NgAxe2yvaSt0lOsI54aJkJ43XnZ

So when there are 128 set_reg's the error is ERROR: Unable to parse table key of type 'table', 129 work, 130 gives ERROR: cannot parse unknown type undefined