Advertisement
Twili

zelootma2.c

Jul 25th, 2022
947
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 17.54 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. char pointers[1532][64]={0};
  4. short scenes[0x614][0x80];
  5. short count[0x614]={0};
  6. short exits[0x614][0x80];
  7.  
  8. unsigned int read32(unsigned char *RAM, int ptr)
  9. {
  10.     return (unsigned int)((RAM[ptr]<<24)|(RAM[ptr+1]<<16)|(RAM[ptr+2]<<8)|RAM[ptr+3]);
  11. }
  12.  
  13. unsigned int read24(unsigned char *RAM, int ptr)
  14. {
  15.     return (unsigned int)((RAM[ptr]<<16)|(RAM[ptr+1]<<8)|RAM[ptr+2]);
  16. }
  17.  
  18. unsigned int read16(unsigned char *RAM, int ptr)
  19. {
  20.     return (unsigned int)((RAM[ptr]<<8)|RAM[ptr+1]);
  21. }
  22.  
  23. void demo_work(unsigned char *RAM, int text, int ptr, unsigned char scene_id)
  24. {
  25.      unsigned int add,setup,special,special2;
  26.      unsigned short records,undefined;
  27.      char demo, found;
  28.      demo=0;
  29.      printf("scene_id %02X\n",scene_id);
  30.      while(RAM[ptr]==0x2)
  31.      {
  32.          add=0;
  33.          setup=text+read24(RAM,ptr+1);
  34.          printf("%d %08X\n",demo,setup);
  35.          while(RAM[setup]!=0x14)
  36.          {
  37.              if(RAM[setup]==0x17)
  38.              {
  39.                  add=text+read24(RAM,setup+5)+8;
  40.                  break;
  41.              }
  42.              setup+=8;
  43.          }
  44.          if(add>0)
  45.          {
  46.              undefined=0;
  47.              while(read32(RAM,add)!=0xFFFFFFFFUL)
  48.              {
  49.                  switch(read32(RAM,add))
  50.                  {
  51.                      case 0x01:
  52.                      case 0x02:
  53.                      case 0x05:
  54.                      case 0x06:
  55.                          add+=12;
  56.                          while(RAM[add]!=0xff)
  57.                          {
  58.                              add+=16;
  59.                          }
  60.                          add+=16;
  61.                          break;
  62.                      case 0x03:
  63.                      case 0x04:
  64.                      case 0x0A:
  65.                      case 0x0B:
  66.                      case 0x0D:
  67.                      case 0x10:
  68.                      case 0x12:
  69.                      case 0x15:
  70.                      case 0x16:
  71.                      case 0x17:
  72.                      case 0x18:
  73.                      case 0x19:
  74.                      case 0x1A:
  75.                      case 0x1B:
  76.                      case 0x1C:
  77.                      case 0x1D:
  78.                      case 0x1E:
  79.                      case 0x1F:
  80.                      case 0x20:
  81.                      case 0x21:
  82.                      case 0x22:
  83.                      case 0x23:
  84.                      case 0x24:
  85.                      case 0x25:
  86.                      case 0x27:
  87.                      case 0x28:
  88.                      case 0x29:
  89.                      case 0x2A:
  90.                      case 0x2B:
  91.                      case 0x2C:
  92.                      case 0x2E:
  93.                      case 0x2F:
  94.                      case 0x30:
  95.                      case 0x31:
  96.                      case 0x32:
  97.                      case 0x33:
  98.                      case 0x34:
  99.                      case 0x35:
  100.                      case 0x36:
  101.                      case 0x37:
  102.                      case 0x39:
  103.                      case 0x3A:
  104.                      case 0x3B:
  105.                      case 0x3C:
  106.                      case 0x3D:
  107.                      case 0x3E:
  108.                      case 0x40:
  109.                      case 0x42:
  110.                      case 0x43:
  111.                      case 0x44:
  112.                      case 0x45:
  113.                      case 0x46:
  114.                      case 0x47:
  115.                      case 0x48:
  116.                      case 0x49:
  117.                      case 0x4A:
  118.                      case 0x4B:
  119.                      case 0x4C:
  120.                      case 0x4D:
  121.                      case 0x4E:
  122.                      case 0x4F:
  123.                      case 0x51:
  124.                      case 0x52:
  125.                      case 0x53:
  126.                      case 0x54:
  127.                      case 0x55:
  128.                      case 0x56:
  129.                      case 0x57:
  130.                      case 0x58:
  131.                      case 0x59:
  132.                      case 0x5A:
  133.                      case 0x5D:
  134.                      case 0x5E:
  135.                      case 0x6A:
  136.                      case 0x6B:
  137.                      case 0x6C:
  138.                      case 0x6D:
  139.                      case 0x6E:
  140.                      case 0x6F:
  141.                      case 0x70:
  142.                      case 0x71:
  143.                      case 0x72:
  144.                      case 0x73:
  145.                      case 0x74:
  146.                      case 0x75:
  147.                      case 0x76:
  148.                      case 0x77:
  149.                      case 0x78:
  150.                      case 0x79:
  151.                      case 0x7B:
  152.                      case 0x7C:
  153.                      case 0x83:
  154.                      case 0x84:
  155.                      case 0x85:
  156.                      case 0x87:
  157.                      case 0x88:
  158.                      case 0x89:
  159.                      case 0x8D:
  160.                      case 0x8E:
  161.                      case 0x8F:
  162.                      case 0x90:
  163.                          records=read16(RAM,add+6);
  164.                          add+=8;
  165.                          for(undefined=0;undefined<records;undefined+=1)
  166.                          {
  167.                              add+=48;
  168.                          }
  169.                          undefined=0;
  170.                          break;
  171.                      case 0x09:
  172.                      case 0x13:
  173.                          records=read16(RAM,add+6);
  174.                          add+=8;
  175.                          for(undefined=0;undefined<records;undefined+=1)
  176.                          {
  177.                              add+=12;
  178.                          }
  179.                          undefined=0;
  180.                          break;
  181.                      case 0x2D:
  182.                      case 0x3E8:
  183.                          if(read32(RAM,add)==0x3E8)
  184.                          {
  185.                              special=read24(RAM,0xBB2115+read16(RAM,add+8)*4)+0xA771A2;
  186.                              special2=read24(RAM,0xBB2119+read16(RAM,add+8)*4)+0xA771A2;
  187.                              found=0;
  188.                              while(read16(RAM,special)!=0x1E1A)
  189.                              {
  190.                                  if(read16(RAM,special-2)==0x1000)
  191.                                  {
  192.                                      found=1;
  193.                                  }
  194.                                  special+=4;
  195.                                  if(special==special2){break;}
  196.                              }
  197.                              special2=read16(RAM,special-4);
  198.                              if(special2<=0x610||found==0)
  199.                              {
  200.                                  
  201.                                  exits[special2][count[special2]]=scene_id;
  202.                                  scenes[special2][count[special2]]=demo;
  203.                                  count[special2]+=1;
  204.                              }
  205.                          }
  206.                          add+=16;
  207.                          break;
  208.                      default:
  209.                          undefined=1;
  210.                          break;
  211.                  }
  212.              }
  213.          }
  214.          ptr+=4;
  215.          demo+=1;
  216.      }
  217.      printf("\n");
  218.      system("pause");
  219. }
  220.  
  221. int main()
  222. {
  223.     unsigned int start[0x6E],stop[0x6E],add,loop,text,end;
  224.     unsigned int special3[0x614]={0};
  225.     unsigned char prev=0x6E, special, special2;
  226.     FILE *ROM=fopen("zelootma.z64","rb");
  227.     fseek(ROM,0,SEEK_END);
  228.     end=ftell(ROM);
  229.     fseek(ROM,0,SEEK_SET);
  230.     unsigned char *RAM=malloc(end);
  231.     fread(RAM,1,end,ROM);
  232.     fclose(ROM);
  233.     for(loop=0;loop<0x614;loop+=1)
  234.     {
  235.         for(add=0;add<0x80;add+=1)
  236.         {
  237.             scenes[loop][add]=-1;
  238.         }
  239.     }
  240.     add=0xBE80;
  241.     for(loop=0;loop<1532;loop+=1)
  242.     {
  243.         text=0;
  244.         while(RAM[add]!=0)
  245.         {
  246.             pointers[loop][text]=RAM[add];
  247.             if(pointers[loop][text]==0x63&&pointers[loop][text-1]==0x73){pointers[loop][text-2]=0;}
  248.             text+=1;
  249.             add+=1;
  250.         }
  251.         while(RAM[add]==0)
  252.         {
  253.             add+=1;
  254.         }
  255.     }
  256.     for(loop=0xBA0BB0;loop<0xBA1448;loop+=0x14)
  257.     {
  258.         add=read32(RAM,loop);
  259.         text=add;
  260.         start[(loop-0xBA0BB0)/0x14]=0;
  261.         stop[(loop-0xBA0BB0)/0x14]=0;
  262.         while(RAM[add]!=0x14)
  263.         {
  264.             switch(RAM[add])
  265.             {
  266.                 case 0x0:
  267.                      special2=RAM[add+1];
  268.                      break;
  269.                 case 0xF:
  270.                     stop[(loop-0xBA0BB0)/0x14]=text+read24(RAM,add+5);
  271.                     break;
  272.                 case 0x13:
  273.                     start[(loop-0xBA0BB0)/0x14]=text+read24(RAM,add+5);
  274.                     break;
  275.                 case 0x18:
  276.                     demo_work(RAM,text,text+read24(RAM,add+5)+0xC,(loop-0xBA0BB0)/0x14);
  277.                     break;
  278.             }
  279.             add+=8;
  280.         }
  281.         if(read16(RAM,stop[(loop-0xBA0BB0)/0x14]-2)==0)
  282.         {
  283.             stop[(loop-0xBA0BB0)/0x14]-=2;
  284.         }
  285.         if(start[(loop-0xBA0BB0)/0x14]>0&&stop[(loop-0xBA0BB0)/0x14]>0)
  286.         {
  287.         //printf("%02X ",(loop-0xBA0BB0)/0x14);
  288.         for(add=start[(loop-0xBA0BB0)/0x14];add<stop[(loop-0xBA0BB0)/0x14];add+=2)
  289.         {
  290.             end=read16(RAM,add);
  291.             if(end<=0x613)
  292.             {
  293.                 exits[end][count[end]]=(loop-0xBA0BB0)/0x14;
  294.                 count[end]+=1;
  295.                 //printf("%04X ",end);
  296.             }
  297.             else
  298.             {
  299.                 if(end!=0x7fff)
  300.                 {
  301.                 for(special=0;special<special2;special+=1)
  302.                 {
  303.                     exits[read16(RAM,0xC23398+2*RAM[0xC233B4+(end-(unsigned short)(0x7FF9))]+2*special)][count[read16(RAM,0xC23398+2*RAM[0xC233B4+(end-(unsigned short)(0x7FF9))]+2*special)]]=(loop-0xBA0BB0)/0x14;
  304.                     count[read16(RAM,0xC23398+2*RAM[0xC233B4+(end-(unsigned short)(0x7FF9))]+2*special)]+=1;
  305.                     special3[read16(RAM,0xC23398+2*RAM[0xC233B4+(end-(unsigned short)(0x7FF9))]+2*special)]=0xC23398+2*RAM[0xC233B4+(end-(unsigned short)(0x7FF9))]+2*special;
  306.                 }
  307.                 }
  308.             }
  309.         }
  310.         //printf("(%08X %08X)\n",start[(loop-0xBA0BB0)/0x14],stop[(loop-0xBA0BB0)/0x14]);
  311.         }
  312.     }
  313.     for(loop=0;loop<0x614;loop+=1)
  314.     {
  315.         end=RAM[0xB9F360+loop*4];
  316.         if(prev==end)
  317.         {
  318.            if(RAM[0xB9F361+loop*4]!=special)
  319.            {
  320.                special=0x66;
  321.            }
  322.         }
  323.         if(end!=prev||special==0x66)
  324.         {
  325.         //if(end==0x51){printf("\n");}
  326.         if(prev<0x51||prev>0x63){if(end>=0x51&&end<=0x63){if(prev!=0x64){printf("\n");}}}
  327.         if(prev>=0x51&&prev<=0x63){if(end<0x51||end>0x63){if(prev!=0x5F){printf("\n");}}}
  328.         if(prev==0x1B||prev==0x1E||prev==0x20||prev==0x23||prev==0x45||prev==0x5F)
  329.         {
  330.             if(end!=0x67)
  331.             {
  332.                 if(RAM[0xB9F358+loop*4]!=0x1B&&RAM[0xB9F358+loop*4]!=0x1E&&RAM[0xB9F358+loop*4]!=0x20&&RAM[0xB9F358+loop*4]!=0x23&&RAM[0xB9F358+loop*4]!=0x45&&RAM[0xB9F358+loop*4]!=0x5F)
  333.                 {
  334.                     loop+=2;
  335.                     goto skip;
  336.                 }
  337.             }
  338.         }
  339.         printf("#define ");
  340.         switch(end)
  341.         {
  342.             case 0x51:
  343.                 printf("Field");
  344.                 break;
  345.             case 0x52:
  346.                 printf("Village");
  347.                 break;
  348.             case 0x53:
  349.                 printf("Graveyard");
  350.                 break;
  351.             case 0x54:
  352.                 printf("River");
  353.                 break;
  354.             case 0x55:
  355.                 printf("Forest");
  356.                 break;
  357.             case 0x56:
  358.                 printf("Meadow");
  359.                 break;
  360.             case 0x57:
  361.                 printf("Hylia");
  362.                 break;
  363.             case 0x58:
  364.                 printf("Domain");
  365.                 break;
  366.             case 0x59:
  367.                 printf("Fountain");
  368.                 break;
  369.             case 0x5A:
  370.                 printf("Valley");
  371.                 break;
  372.             case 0x5B:
  373.                 printf("Woods");
  374.                 break;
  375.             case 0x5C:
  376.                 printf("Colossus");
  377.                 break;
  378.             case 0x5D:
  379.                 printf("Fortress");
  380.                 break;
  381.             case 0x5E:
  382.                 printf("Wasteland");
  383.                 break;
  384.             case 0x5F:
  385.                 printf("Castle");
  386.                 break;
  387.             case 0x60:
  388.                 printf("Trail");
  389.                 break;
  390.             case 0x61:
  391.                 printf("Crater");
  392.                 break;
  393.             case 0x62:
  394.                 printf("City");
  395.                 break;
  396.             case 0x63:
  397.                 printf("Ranch");
  398.                 break;
  399.             default:
  400.                 for(add=0;add<1532;add+=1)
  401.                 {
  402.                     if(read32(RAM,0x12F70+add*16)==read32(RAM,0xBA0BB0+end*0x14))
  403.                     {
  404.                         break;
  405.                     }
  406.                 }
  407.                 printf("%s",pointers[add]);
  408.                 break;
  409.         }
  410.         printf("_%d",RAM[0xB9F361+loop*4]);
  411.         if(count[loop]>0){printf("_from_");}
  412.         if(count[loop]==0){printf(" ");}
  413.         for(text=0;text<count[loop];text+=1)
  414.         {
  415.             switch(exits[loop][text])
  416.             {
  417.                 case 0x51:
  418.                     printf("Field");
  419.                     break;
  420.                 case 0x52:
  421.                     printf("Village");
  422.                     break;
  423.                 case 0x53:
  424.                     printf("Graveyard");
  425.                     break;
  426.                 case 0x54:
  427.                     printf("River");
  428.                     break;
  429.                 case 0x55:
  430.                     printf("Forest");
  431.                     break;
  432.                 case 0x56:
  433.                     printf("Meadow");
  434.                     break;
  435.                 case 0x57:
  436.                     printf("Hylia");
  437.                     break;
  438.                 case 0x58:
  439.                     printf("Domain");
  440.                     break;
  441.                 case 0x59:
  442.                     printf("Fountain");
  443.                     break;
  444.                 case 0x5A:
  445.                     printf("Valley");
  446.                     break;
  447.                 case 0x5B:
  448.                     printf("Woods");
  449.                     break;
  450.                 case 0x5C:
  451.                     printf("Colossus");
  452.                     break;
  453.                 case 0x5D:
  454.                     printf("Fortress");
  455.                     break;
  456.                 case 0x5E:
  457.                     printf("Wasteland");
  458.                     break;
  459.                 case 0x5F:
  460.                     printf("Castle");
  461.                     break;
  462.                 case 0x60:
  463.                     printf("Trail");
  464.                     break;
  465.                 case 0x61:
  466.                     printf("Crater");
  467.                     break;
  468.                 case 0x62:
  469.                     printf("City");
  470.                     break;
  471.                 case 0x63:
  472.                     printf("Ranch");
  473.                     break;
  474.                 default:
  475.                     for(add=0;add<1532;add+=1)
  476.                     {
  477.                         if(read32(RAM,0x12F70+add*16)==read32(RAM,0xBA0BB0+exits[loop][text]*0x14))
  478.                         {
  479.                             break;
  480.                         }
  481.                     }
  482.                     //if(special3[loop]>0)
  483.                     //{
  484.                     //    printf("%s_%08X ",pointers[add],special3[loop]);
  485.                     //}
  486.                     //else
  487.                    // {
  488.                     printf("%s",pointers[add]);
  489.                     //}
  490.                     break;
  491.             }
  492.             if(scenes[loop][text]>-1){printf("_demo_%d",scenes[loop][text]);}
  493.             printf(" ");
  494.         }
  495.         printf("0x%X",loop);
  496.         if(end>=0x51&&end<0x64&&count[loop]==0){printf(" //UNUSED OR SPECIAL");}
  497.         if(count[loop]>1){printf(" //beta");}
  498.         if(special3[loop]>0)
  499.         {
  500.             printf("\n                        /* %08X */",special3[loop]);
  501.             special3[loop]=loop+1;
  502.             while(RAM[0xB9F360+4*special3[loop]]==end)
  503.             {
  504.                 special3[loop]+=1;
  505.             }
  506.             if(end<0x51||end>0x63){if(RAM[0xB9F360+4*special3[loop]]<0x51||RAM[0xB9F360+4*special3[loop]]>0x63){printf("\n");}}
  507.             if(end>=0x51&&end<=0x63)
  508.             {
  509.                 if(RAM[0xB9F360+4*special3[loop]]>=0x51&&RAM[0xB9F360+4*special3[loop]]<=0x63)
  510.                 {
  511.                     printf("\n");
  512.                 }
  513.                 else
  514.                 {
  515.                     if(RAM[0xB9F360+4*special3[loop]]==0x64)
  516.                     {
  517.                         printf("\n");
  518.                     }
  519.                 }
  520.             }
  521.         }
  522.         printf("\n");
  523.        // if(prev>=0x51&&prev<=0x63)
  524.        // {
  525.        //     if(end<0x51||end>0x63){printf("\n");}
  526.        // }
  527.         }
  528.         skip:
  529.         prev=end;
  530.         special=RAM[0xB9F361+loop*4];
  531.     }
  532.     //for(loop=0;loop<0x6E;loop+=1)
  533.     //{
  534.     //    for(add=0;add<1532;add+=1)
  535.     //    {
  536.     //        if(read32(RAM,0x12F70+add*16)==read32(RAM,0xBA0BB0+loop*0x14))
  537.     //        {
  538.     //            break;
  539.     //        }
  540.     //    }
  541.     //    text=0;
  542.     //    if(start[loop]>0&&stop[loop]>0)
  543.     //    {
  544.     //        text=(stop[loop]-start[loop])/2;
  545.     //    }
  546.     //    printf("%s has %d exits.\n",pointers[add],text);
  547.     //}
  548.     free(RAM);
  549.     system("pause");
  550.     return 0;
  551. }
  552.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement