Advertisement
TheBlueTophat

Scrolling Code Module 1

May 20th, 2016
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 21.81 KB | None | 0 0
  1. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \\
  2. // Coolgamers Z3 Scrolling, Version 2 Update/Itteration 4 Module 1. \\
  3. // Module 1:                                                        \\
  4. // General engine functions, variables, & constants.                \\
  5. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \\
  6.  
  7. // ~ Constants and Variables ~
  8.  
  9. const int WMS_LINK = 88; // Weapon/Misc Sprite ID of Link.
  10.  
  11. const int NODETECT_HITXOFFSET = 214747; // Use with ->HitXOffset when ->CollDetect can't be used.
  12. const int OP_INVIS = 0; // Use like OP_OPAQUE and OP_TRANS with scrolling engine drawing functions.
  13. const int EMPTY_VAL = -1; // A value used for when an array indice is "empty". May not be used in things where the value actually normally go below 0.
  14. // The size of the combo list. You can make this smaller, as it isn't very likely that someone would need the stats of every single combo in the combo list.
  15. const int COMBO_LIST_SIZE = 65280; // The size of the entire combo list is 65280 combos, starting at 0.
  16.  
  17. // Combo data; Solidity, the Tile of the combo's, the Type of the combo's, and the Inherent Flag of the combos.
  18. int ComboData_Solid[65280];
  19. int ComboData_Tile[65280];
  20. int ComboData_Type[65280];
  21. int ComboData_IFlag[65280];
  22.  
  23. // Map sizes
  24. const int MAP_COMBO_WIDTH   = 256;
  25. const int MAP_COMBO_HEIGHT  = 88;
  26. const int MAP_COMBO_SIZE    = 22528;
  27.  
  28. const int MAP_HALFCOMBO_WIDTH   = 512;
  29. const int MAP_HALFCOMBO_HEIGHT  = 176;
  30. const int MAP_HALFCOMBO_SIZE    = 90112;
  31.  
  32. // Map data.
  33. int Map_Combo_ID_Layer_0[22528];
  34. int Map_Combo_ID_Layer_1[22528];
  35. int Map_Combo_ID_Layer_2[22528];
  36. int Map_Combo_ID_Layer_3[22528];
  37. int Map_Combo_ID_Layer_4[22528];
  38. int Map_Combo_ID_Layer_5[22528];
  39. int Map_Combo_ID_Layer_6[22528];
  40.  
  41. int Map_Combo_CSet_Layer_0[22528];
  42. int Map_Combo_CSet_Layer_1[22528];
  43. int Map_Combo_CSet_Layer_2[22528];
  44. int Map_Combo_CSet_Layer_3[22528];
  45. int Map_Combo_CSet_Layer_4[22528];
  46. int Map_Combo_CSet_Layer_5[22528];
  47. int Map_Combo_CSet_Layer_6[22528];
  48.  
  49. int Map_Combo_Flag_Layer_0[22528];
  50.  
  51. // Stored similar to combos, whenever the screen position collides with this it won't go any further than the NoShift position.
  52. // The no-shift direction is stored in 4 bits: 0000b.
  53. // The least significant bit is up, the second least significant bit is down, the third least significant bit is left, and the fourth least significant bit is right.
  54. int Map_NoShift[22528];
  55.  
  56. // The directions to not shift.
  57. const int NOSHIFT_UP = 0x01;
  58. const int NOSHIFT_DOWN = 0x02;
  59. const int NOSHIFT_LEFT = 0x04;
  60. const int NOSHIFT_RIGHT = 0x08;
  61.  
  62. // Combo Solidity
  63. const int COMBO_TOPLEFT = 0x01;
  64. const int COMBO_TOPRIGHT = 0x04;
  65. const int COMBO_BOTTOMLEFT = 0x02;
  66. const int COMBO_BOTTOMRIGHT = 0x08;
  67.  
  68. // Screen position. Used as an indice.
  69. int ScreenPosX = 0;
  70. int ScreenPosY = 0;
  71.  
  72. // Used for choosing enemies on each map. I don't remember exactly how, but I believe an array will be used with this.
  73. int FakeMap = 0;
  74.  
  75.  
  76. // ~ Functions ~
  77.  
  78. // Loads all of the data (combos, flags, CSets) on map "map" into "map_id_buffer", "map_flag_buffer", and "map_cset_buffer" respectivly.
  79. void Map_Load_Data(int map, int map_id_buffer, int map_flag_buffer, int map_cset_buffer)
  80. {
  81.     Map_Load_Combos(map, map_id_buffer);
  82.     Map_Load_Flags(map, map_flag_buffer);
  83.     Map_Load_CSets(map, map_cset_buffer);
  84. }
  85.  
  86. void Map_Load_Combos(int map, int map_id_buffer)
  87. {
  88.     // Holds a second variable for an indice in the buffer.
  89.     int mapPos = 0;
  90.    
  91.     // Clears the map array
  92.     for(int i = 0; i < MAP_COMBO_SIZE; i += 1) {map_id_buffer[i] = EMPTY_VAL;}
  93.  
  94.     // Load all of the combos on map "map" into "map_id_buffer".
  95.     for(int i = 0; i < 8; i += 1)  // map screen height
  96.     {
  97.         for(int i2 = 0; i2 < 11; i2 += 1)  // screen combo height
  98.         {
  99.             for(int i3 = 0; i3 < 16; i3 += 1) // map screen width
  100.             {
  101.                 for(int i4 = 0; i4 < 16; i4 += 1) // screen combo width
  102.                 {
  103.                     int screenNum = ((i * 16) + i3);
  104.                     int comboNum = ((i2 * 16) + i4);
  105.                     map_id_buffer[mapPos] = Game->GetComboData(map, screenNum, comboNum);
  106.                     mapPos += 1;
  107.                 }
  108.             }
  109.         }
  110.     }
  111. }
  112.  
  113. void Map_Load_Flags(int map, int map_flag_buffer)
  114. {
  115.     // Holds a second variable for an indice in the buffer.
  116.     int mapPos = 0;
  117.    
  118.     // Clears the map array
  119.     for(int i = 0; i < MAP_COMBO_SIZE; i += 1) {map_flag_buffer[i] = EMPTY_VAL;}
  120.  
  121.     // Load all of the flags on map "map" into "map_flag_buffer".
  122.     for(int i = 0; i < 8; i += 1)  // map screen height
  123.     {
  124.         for(int i2 = 0; i2 < 11; i2 += 1)  // screen combo height
  125.         {
  126.             for(int i3 = 0; i3 < 16; i3 += 1) // map screen width
  127.             {
  128.                 for(int i4 = 0; i4 < 16; i4 += 1) // screen combo width
  129.                 {
  130.                     int screenNum = ((i * 16) + i3);
  131.                     int comboNum = ((i2 * 16) + i4);
  132.                     map_flag_buffer[mapPos] = Game->GetComboFlag(map, screenNum, comboNum);
  133.                     mapPos += 1;
  134.                 }
  135.             }
  136.         }
  137.     }
  138. }
  139.  
  140. void Map_Load_CSets(int map, int map_cset_buffer)
  141. {
  142.     // Holds a second variable for an indice in the buffer.
  143.     int mapPos = 0;
  144.    
  145.     // Clears the map array
  146.     for(int i = 0; i < MAP_COMBO_SIZE; i += 1) {map_cset_buffer[i] = EMPTY_VAL;}
  147.  
  148.     // Load all of the csets on map "map" into "map_cset_buffer".
  149.     for(int i = 0; i < 8; i += 1)  // map screen height
  150.     {
  151.         for(int i2 = 0; i2 < 11; i2 += 1)  // screen combo height
  152.         {
  153.             for(int i3 = 0; i3 < 16; i3 += 1) // map screen width
  154.             {
  155.                 for(int i4 = 0; i4 < 16; i4 += 1) // screen combo width
  156.                 {
  157.                     int screenNum = ((i * 16) + i3);
  158.                     int comboNum = ((i2 * 16) + i4);
  159.                     map_cset_buffer[mapPos] = Game->GetComboCSet(map, screenNum, comboNum);
  160.                     mapPos += 1;
  161.                 }
  162.             }
  163.         }
  164.     }
  165. }
  166.  
  167. void LoadComboData(int combo_solid_buffer, int combo_tile_buffer, int combo_type_buffer, int combo_iflag_buffer)
  168. {
  169.     int StartCombo = Screen->ComboD[0];
  170.    
  171.     for(int i = 0; i < COMBO_LIST_SIZE; i += 1)
  172.     {
  173.         Screen->ComboD[0] = i;
  174.        
  175.         combo_solid_buffer[i] = Screen->ComboS[0];
  176.         combo_tile_buffer[i] = Game->ComboTile(i);
  177.         combo_type_buffer[i] = Screen->ComboT[0];
  178.         combo_iflag_buffer[i] = Screen->ComboI[0];
  179.     }
  180.    
  181.     Screen->ComboD[0] = StartCombo;
  182.    
  183.     // This is to remove any enemies spawned by combos, such as spinning tiles.
  184.     for(int i = 1; i <= Screen->NumNPCs(); i += 1)
  185.     {
  186.         npc en = Screen->LoadNPC(i);
  187.         Remove(en);
  188.     }
  189. }
  190.  
  191. int PosToMapLoc(int x, int y)
  192. {return ((FloorToMultiple(ScreenPosY + y, 16) / 16) * 256) + (FloorToMultiple(ScreenPosX + x, 16) / 16);}
  193.  
  194. // Used for solidity. Returns if the position is in a combos topleft, topright, bottomleft, or bottomright corner.
  195. int PosToComboCorner(int x, int y)
  196. {
  197.     int CornerX = (FloorToMultiple(ScreenPosOffsetX() + x, 8) / 8);
  198.     int CornerY = (FloorToMultiple(ScreenPosOffsetY() + y, 8) / 8);
  199.    
  200.     if(IsEven(CornerX))
  201.     {
  202.         if(IsEven(CornerY))
  203.         {
  204.             return COMBO_TOPLEFT;
  205.         }
  206.        
  207.         if(IsOdd(CornerY))
  208.         {
  209.             return COMBO_BOTTOMLEFT;
  210.         }
  211.     }
  212.    
  213.     if(IsOdd(CornerX))
  214.     {
  215.         if(IsEven(CornerY))
  216.         {
  217.             return COMBO_TOPRIGHT;
  218.         }
  219.        
  220.         if(IsOdd(CornerY))
  221.         {
  222.             return COMBO_BOTTOMRIGHT;
  223.         }
  224.     }
  225.    
  226. }
  227.  
  228. int ScreenLocX()
  229. {return FloorToMultiple(ScreenPosX, 16) / 16;}
  230.  
  231. int ScreenLocY()
  232. {return FloorToMultiple(ScreenPosY, 16) / 16;}
  233.  
  234. int ScreenPosOffsetX()
  235. {return ScreenPosX - FloorToMultiple(ScreenPosX, 16);}
  236.  
  237. int ScreenPosOffsetY()
  238. {return ScreenPosY - FloorToMultiple(ScreenPosY, 16);}
  239.  
  240. // Mouse positions.
  241. float MouseX()
  242. {return Link->InputMouseX;}
  243.  
  244. float MouseY()
  245. {return Link->InputMouseY;}
  246.  
  247. // void DrawMapCombos(int screen_loc_x, int screen_loc_y, int screen_pos_offset_x, int screen_pos_offset_y, int map_id_buffer, int map_flag_buffer, int map_cset_buffer)
  248. void DrawMapCombos(int screen_pos_x, int screen_pos_y, int map_id_buffer, int map_flag_buffer, int map_cset_buffer)
  249. {
  250.     int screen_loc_x = FloorToMultiple(screen_pos_x, 16) / 16;
  251.     int screen_loc_y = FloorToMultiple(screen_pos_y, 16) / 16;
  252.    
  253.     if(ScreenPosOffsetX() % 16 == 0)
  254.     {
  255.         if(ScreenPosOffsetY() % 16 == 0)
  256.         {
  257.             for(int i = 0; i < 12; i += 1)
  258.             {
  259.                 for(int i2 = 0; i2 < 16; i2 += 1)
  260.                 {
  261.                     int iLoc1 = i * 16; // y combo position
  262.                     int iLoc2 = i2 * 16; // x combo position
  263.                    
  264.                     Screen->FastCombo(0, iLoc2, iLoc1, map_id_buffer[((screen_loc_y + i) * 256) + (screen_loc_x + i2)], map_cset_buffer[((screen_loc_y + i) * 256) + (screen_loc_x + i2)], OP_OPAQUE);
  265.                 }
  266.             }
  267.         }
  268.        
  269.         if(ScreenPosOffsetY() % 16 != 0)
  270.         {
  271.             for(int i = -1; i < 12; i += 1)
  272.             {
  273.                 for(int i2 = 0; i2 < 17; i2 += 1)
  274.                 {
  275.                     int iLoc1 = i * 16; // y combo position
  276.                     int iLoc2 = i2 * 16; // x combo position
  277.                    
  278.                     Screen->FastCombo(0, iLoc2, (i * 16) - ScreenPosOffsetY(), map_id_buffer[((screen_loc_y + i) * 256) + (screen_loc_x + i2)], map_cset_buffer[((screen_loc_y + i) * 256) + (screen_loc_x + i2)], OP_OPAQUE);
  279.                 }
  280.             }
  281.         }
  282.     }
  283.    
  284.     if(ScreenPosOffsetX() % 16 != 0)
  285.     {
  286.         if(ScreenPosOffsetY() % 16 == 0)
  287.         {
  288.             for(int i = 0; i < 12; i += 1)
  289.             {
  290.                 for(int i2 = -1; i2 < 17; i2 += 1)
  291.                 {
  292.                     int iLoc1 = i * 16; // y combo position
  293.                     int iLoc2 = i2 * 16; // x combo position
  294.                    
  295.                     Screen->FastCombo(0, iLoc2 - ScreenPosOffsetX(), iLoc1, map_id_buffer[((screen_loc_y + i) * 256) + (screen_loc_x + i2)], map_cset_buffer[((screen_loc_y + i) * 256) + (screen_loc_x + i2)], OP_OPAQUE);
  296.                 }
  297.             }
  298.         }
  299.        
  300.         if(ScreenPosOffsetY() % 16 != 0)
  301.         {
  302.             for(int i = -1; i < 12; i += 1)
  303.             {
  304.                 for(int i2 = -1; i2 < 17; i2 += 1)
  305.                 {
  306.                     int iLoc1 = i * 16; // y combo position
  307.                     int iLoc2 = i2 * 16; // x combo position
  308.                    
  309.                     Screen->FastCombo(0, iLoc2 - ScreenPosOffsetX(), (i * 16) - ScreenPosOffsetY(), map_id_buffer[((screen_loc_y + i) * 256) + (screen_loc_x + i2)], map_cset_buffer[((screen_loc_y + i) * 256) + (screen_loc_x + i2)], OP_OPAQUE);
  310.                 }
  311.             }
  312.         }
  313.     }
  314. }
  315.  
  316. // ~ Math Related Functions ~
  317. // These do things not completely related to map handling.
  318.  
  319. // Floors a value to a multiple.
  320. int FloorToMultiple(int input, int multiple)
  321. {
  322.     if(multiple == 0) {return 0;}
  323.     int mul = Abs(multiple);
  324.     return Floor(input/mul)*mul;
  325. }
  326.  
  327. // returns the value of a number, wraped around within "low" and "high" (inclusive).
  328. float WrapVal(float num, float low, float high)
  329. {
  330.     float val = num;
  331.     if(val < low)
  332.     {
  333.         val = (high - Abs(low - val));
  334.     }
  335.     else if(num > high)
  336.     {
  337.         num = (low + Abs(high - val));
  338.     }
  339. }
  340.  
  341. // returns if an x position is in the screen bounds.
  342. bool InScreenBoundsX(float x)
  343. {
  344.     if(x >= 0 && x < 256)   {return true;}
  345.     else                    {return false;}
  346. }
  347.  
  348. // returns if a y position is in the screen bounds.
  349. bool InScreenBoundsY(float y)
  350. {
  351.     if(y >= 0 && y < 176)   {return true;}
  352.     else                    {return false;}
  353. }
  354.  
  355. void FastFloat(int x, int y, float number)
  356. {
  357.     int num_didgets = 0;
  358.     for(int i = 0; i < 4; i += 1)
  359.     {
  360.         if(number - Abs(number) > 0)
  361.         {
  362.             num_didgets += 1;
  363.         }
  364.     }
  365.    
  366.     Screen->DrawInteger(7, x, y, FONT_Z3SMALL, 1, 0, -1, -1, number, num_didgets, OP_OPAQUE);
  367. }
  368.  
  369. // Returns the state of a binary flag 'flag' of 'num'.
  370. bool CheckFlag(int num, int flag)
  371. {
  372.     return (num & flag);
  373. }
  374.  
  375. // Returns 'num' after the state of binary flag 'flag' was changed.
  376. int SetFlag(int num, int flag, bool state)
  377. {
  378.     if(state) num |= flag;
  379.     if(!state) num &= ~(flag);
  380.     return num;
  381. }
  382.  
  383. // Put this before the main while(true) loop.
  384. void SCRL_PreGameLoopFunc()
  385. {
  386.     ClearTrace();
  387.  
  388.     LoadComboData(ComboData_Solid, ComboData_Tile, ComboData_Type, ComboData_IFlag);
  389.    
  390.     Map_Load_Data(2, Map_Combo_ID_Layer_0, Map_Combo_Flag_Layer_0, Map_Combo_CSet_Layer_0);
  391.    
  392.     ScreenPosX = 112 * 16;
  393.     ScreenPosY = 44 * 16;
  394.    
  395.     for(int i = 0; i < MAP_COMBO_SIZE; i += 1)
  396.     {
  397.         if(Map_Combo_ID_Layer_0[i] == 912)
  398.         {
  399.             Map_NoShift[i] = NOSHIFT_LEFT | NOSHIFT_RIGHT;
  400.         }
  401.     }
  402.    
  403.     Link->X = 120;
  404.     Link->Y = 80;
  405.    
  406.     Link->Invisible = true; // So links actual tile isn't drawn.
  407.    
  408.     // LinkStats[LS_ANIMATIONDELAY] = 6; // the delay of Links' animation per frame.
  409.     LinkStats[LS_ANIMATION_SHEET_START] = 520; // the start of Links tilesheet.
  410.     LinkStats[LS_OPACITY] = OP_OPAQUE;
  411.     LinkStats[LS_ACTION] = SCRL_LA_STAND;
  412.    
  413.     LinkStats[LS_HIT_X] = 120;
  414.     LinkStats[LS_HIT_Y] = 80;
  415.     LinkStats[LS_DRAW_X] = 120;
  416.     LinkStats[LS_DRAW_Y] = 80;
  417.     LinkStats[LS_HIT_X_OFFSET] = 0;
  418.     LinkStats[LS_HIT_Y_OFFSET] = 0;
  419.    
  420.     LinkStats[LS_ANIMATIONFRAMES] = 4;
  421.     // LinkStats[LS_ANIMATIONDELAY] = 6;
  422.     LinkStats[LS_DIR_OR_ACTION_END_TILEDIST] = 4;
  423.    
  424.     SetLinkActionFrameDelays();
  425. }
  426.  
  427. void DebugStuff()
  428. {
  429.     int maxNumWidth = 6*6; // max width of the largest possible number.
  430.    
  431.     FastFloat(maxNumWidth*0, -56+(6*0), ScreenPosX);
  432.     FastFloat(maxNumWidth*1, -56+(6*0), ScreenPosY);
  433.     // ...
  434. }
  435.  
  436. void Z3_Scrolling()
  437. {
  438.     Link->Action = LA_FROZEN; // So the actual Link doesn't do things like use built in items or actually move onscreen.
  439.    
  440.     Link->DrawXOffset = (Link->X - 120);
  441.     Link->HitXOffset = Link->DrawXOffset;
  442.     Link->X = 120;
  443.  
  444.     Link->DrawYOffset = (Link->Y - 80);
  445.     Link->HitYOffset = Link->DrawYOffset;
  446.     Link->Y = 80;
  447.    
  448.     if(LinkStats[LS_ACTION] == SCRL_LA_WALK || LinkStats[LS_ACTION] == SCRL_LA_SWIM)
  449.     {
  450.         // Pans the screen left.
  451.         if(LinkStats[LS_DIR] == DIR_LEFT || LinkStats[LS_DIR] == DIR_LEFTUP || LinkStats[LS_DIR] == DIR_LEFTDOWN)
  452.         {
  453.             if((ComboData_Solid[Map_Combo_ID_Layer_0[PosToMapLoc(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET] - 1, LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 8)]] & PosToComboCorner(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET] - 1, LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 8)) == 0
  454.             && (ComboData_Solid[Map_Combo_ID_Layer_0[PosToMapLoc(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET] - 1, LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 15)]] & PosToComboCorner(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET] - 1, LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 15)) == 0)
  455.             {
  456.                 if((ScreenPosX - 1) >= 0)
  457.                 {
  458.                     ScreenPosX -= 1;
  459.                 }
  460.                 else
  461.                 {
  462.                     LinkStats[LS_HIT_X] -= 1;
  463.                     LinkStats[LS_DRAW_X] -= 1;
  464.                 }
  465.             }
  466.         }
  467.        
  468.         // Pans the screen right.
  469.         if(LinkStats[LS_DIR] == DIR_RIGHT || LinkStats[LS_DIR] == DIR_RIGHTUP || LinkStats[LS_DIR] == DIR_RIGHTDOWN)
  470.         {
  471.             if((ComboData_Solid[Map_Combo_ID_Layer_0[PosToMapLoc(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET] + 16, LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 8)]]  & PosToComboCorner(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET] + 16, LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 8)) == 0
  472.             && (ComboData_Solid[Map_Combo_ID_Layer_0[PosToMapLoc(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET] + 16, LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 15)]] & PosToComboCorner(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET] + 16, LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 15)) == 0)
  473.             {
  474.                 if((ScreenPosX + 256) < (MAP_COMBO_WIDTH * 16))
  475.                 {
  476.                     ScreenPosX += 1;
  477.                 }
  478.                 else
  479.                 {
  480.                     LinkStats[LS_HIT_X] += 1;
  481.                     LinkStats[LS_DRAW_X] += 1;
  482.                 }
  483.             }
  484.         }
  485.        
  486.         // Pans the screen up.
  487.         if(LinkStats[LS_DIR] == DIR_UP || LinkStats[LS_DIR] == DIR_LEFTUP || LinkStats[LS_DIR] == DIR_RIGHTUP)
  488.         {
  489.             if((ComboData_Solid[Map_Combo_ID_Layer_0[PosToMapLoc(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET], LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 7)]] & PosToComboCorner(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET], LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 7)) == 0
  490.             && (ComboData_Solid[Map_Combo_ID_Layer_0[PosToMapLoc(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET] + 8, LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 7)]] & PosToComboCorner(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET] + 8, LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 7)) == 0
  491.             && (ComboData_Solid[Map_Combo_ID_Layer_0[PosToMapLoc(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET] + 15, LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 7)]] & PosToComboCorner(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET] + 15, LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 7)) == 0)
  492.             {
  493.                 if((ScreenPosY - 1) >= 0)
  494.                 {
  495.                     ScreenPosY -= 1;
  496.                 }
  497.                 else
  498.                 {
  499.                     LinkStats[LS_HIT_Y] -= 1;
  500.                     LinkStats[LS_DRAW_Y] -= 1;
  501.                 }
  502.             }
  503.         }
  504.        
  505.         // Pans the screen down.
  506.         if(LinkStats[LS_DIR] == DIR_DOWN || LinkStats[LS_DIR] == DIR_LEFTDOWN || LinkStats[LS_DIR] == DIR_RIGHTDOWN)
  507.         {
  508.             if((ComboData_Solid[Map_Combo_ID_Layer_0[PosToMapLoc(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET], LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 16)]] & PosToComboCorner(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET], LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 16)) == 0
  509.             && (ComboData_Solid[Map_Combo_ID_Layer_0[PosToMapLoc(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET] + 8, LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 16)]] & PosToComboCorner(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET] + 8, LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 16)) == 0
  510.             && (ComboData_Solid[Map_Combo_ID_Layer_0[PosToMapLoc(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET] + 15, LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 16)]] & PosToComboCorner(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET] + 15, LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 16)) == 0)
  511.             {
  512.                 if((ScreenPosY + 176) < (MAP_COMBO_HEIGHT * 16))
  513.                 {
  514.                     ScreenPosY += 1;
  515.                 }
  516.                 else
  517.                 {
  518.                     LinkStats[LS_HIT_Y] += 1;
  519.                     LinkStats[LS_DRAW_Y] += 1;
  520.                 }
  521.             }
  522.         }
  523.        
  524.         if(LinkStats[LS_HIT_X] < 120)
  525.         {
  526.             if(LinkStats[LS_DIR] == DIR_RIGHT || LinkStats[LS_DIR] == DIR_RIGHTUP || LinkStats[LS_DIR] == DIR_RIGHTDOWN)
  527.             {
  528.                 if((ComboData_Solid[Map_Combo_ID_Layer_0[PosToMapLoc(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET] + 16, LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 8)]]  & PosToComboCorner(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET] + 16, LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 8)) == 0
  529.                 && (ComboData_Solid[Map_Combo_ID_Layer_0[PosToMapLoc(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET] + 16, LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 15)]] & PosToComboCorner(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET] + 16, LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 15)) == 0)
  530.                 {
  531.                     LinkStats[LS_HIT_X] += 1;
  532.                     LinkStats[LS_DRAW_X] += 1;
  533.                 }
  534.             }
  535.         }
  536.         else if(LinkStats[LS_HIT_X] > 120)
  537.         {
  538.             if(LinkStats[LS_DIR] == DIR_LEFT || LinkStats[LS_DIR] == DIR_LEFTUP || LinkStats[LS_DIR] == DIR_LEFTDOWN)
  539.             {
  540.                 if((ComboData_Solid[Map_Combo_ID_Layer_0[PosToMapLoc(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET] - 1, LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 8)]] & PosToComboCorner(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET] - 1, LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 8)) == 0
  541.                 && (ComboData_Solid[Map_Combo_ID_Layer_0[PosToMapLoc(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET] - 1, LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 15)]] & PosToComboCorner(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET] - 1, LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 15)) == 0)
  542.                 {
  543.                     LinkStats[LS_HIT_X] -= 1;
  544.                     LinkStats[LS_DRAW_X] -= 1;
  545.                 }
  546.             }
  547.         }
  548.        
  549.         if(LinkStats[LS_HIT_Y] < 80)
  550.         {
  551.             if(LinkStats[LS_DIR] == DIR_DOWN || LinkStats[LS_DIR] == DIR_LEFTDOWN || LinkStats[LS_DIR] == DIR_RIGHTDOWN)
  552.             {
  553.                 if((ComboData_Solid[Map_Combo_ID_Layer_0[PosToMapLoc(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET], LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 16)]] & PosToComboCorner(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET], LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 16)) == 0
  554.                 && (ComboData_Solid[Map_Combo_ID_Layer_0[PosToMapLoc(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET] + 8, LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 16)]] & PosToComboCorner(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET] + 8, LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 16)) == 0
  555.                 && (ComboData_Solid[Map_Combo_ID_Layer_0[PosToMapLoc(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET] + 15, LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 16)]] & PosToComboCorner(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET] + 15, LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 16)) == 0)
  556.                 {
  557.                     LinkStats[LS_HIT_Y] += 1;
  558.                     LinkStats[LS_DRAW_Y] += 1;
  559.                 }
  560.             }
  561.         }
  562.         else if(LinkStats[LS_HIT_Y] > 80)
  563.         {
  564.             if(LinkStats[LS_DIR] == DIR_UP || LinkStats[LS_DIR] == DIR_LEFTUP || LinkStats[LS_DIR] == DIR_RIGHTUP)
  565.             {
  566.                 if((ComboData_Solid[Map_Combo_ID_Layer_0[PosToMapLoc(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET], LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 7)]] & PosToComboCorner(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET], LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 7)) == 0
  567.                 && (ComboData_Solid[Map_Combo_ID_Layer_0[PosToMapLoc(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET] + 8, LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 7)]] & PosToComboCorner(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET] + 8, LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 7)) == 0
  568.                 && (ComboData_Solid[Map_Combo_ID_Layer_0[PosToMapLoc(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET] + 15, LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 7)]] & PosToComboCorner(LinkStats[LS_HIT_X] + LinkStats[LS_HIT_X_OFFSET] + 15, LinkStats[LS_HIT_Y] + LinkStats[LS_HIT_Y_OFFSET] + 7)) == 0)
  569.                 {
  570.                     LinkStats[LS_HIT_Y] -= 1;
  571.                     LinkStats[LS_DRAW_Y] -= 1;
  572.                 }
  573.             }
  574.         }
  575.     }
  576.    
  577.     LinkStats[LS_HIT_X] = Clamp(LinkStats[LS_HIT_X], 0, MAP_COMBO_WIDTH*16);
  578.     LinkStats[LS_DRAW_X] = Clamp(LinkStats[LS_DRAW_X], 0, MAP_COMBO_WIDTH*16);
  579.     LinkStats[LS_HIT_Y] = Clamp(LinkStats[LS_HIT_Y], 0, MAP_COMBO_HEIGHT*16);
  580.     LinkStats[LS_DRAW_Y] = Clamp(LinkStats[LS_DRAW_Y], 0, MAP_COMBO_HEIGHT*16);
  581.    
  582.    
  583.     // Draws the tiles to the screen.
  584.     DrawMapCombos(ScreenPosX, ScreenPosY, Map_Combo_ID_Layer_0, Map_Combo_Flag_Layer_0, Map_Combo_CSet_Layer_0); // Leave this as-is.
  585.    
  586.     HandleCustomWeapons();
  587.     HandleCustomSprites();
  588.     HandleLink(); // From Mod. 2
  589. }
  590.  
  591. global script Global
  592. {
  593.     void run()
  594.     {
  595.         SCRL_PreGameLoopFunc();
  596.        
  597.         while(true)
  598.         {
  599.             Z3_Scrolling();
  600.            
  601.             // Feel free to comment this out, it shouldn't functionally change how anything (important, atleast) works, just shows values and stuff.
  602.             // DebugStuff();
  603.            
  604.             Waitframe();
  605.         }
  606.     }
  607. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement