Advertisement
Guest User

Untitled

a guest
Nov 20th, 2019
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /// @descripton tile_determine_image(grid, grid_x, grid_y, is_sprite)
  2. /// @param grid
  3. /// @param grid_x
  4. /// @param grid_y
  5. /// @param is_sprite
  6.  
  7. var _grid   = argument0;
  8. var _grid_x = argument1;
  9. var _grid_y = argument2;
  10. var _sprite = argument3;
  11.  
  12. var _tile_offset = (_sprite) ? 0 : 5;
  13.  
  14. var _w      = ds_grid_width(_grid);
  15. var _h      = ds_grid_height(_grid);
  16.  
  17. var _surround;
  18.  
  19. var _x_off, _y_off, _x, _y, _sx, _sy;
  20.  
  21. for(_x_off=-1;_x_off<=1;++_x_off){
  22.     for(_y_off=-1;_y_off<=1;++_y_off){
  23.    
  24.         _sx = _x_off +1;
  25.         _sy = _y_off +1;
  26.    
  27.         _x  = _grid_x +_x_off;
  28.         _y  = _grid_y +_y_off;
  29.        
  30.         if(_x <   0 || _y <   0
  31.         || _x >= _w || _y >= _h)
  32.             _surround[_sx,_sy] = 0;
  33.         else
  34.             _surround[_sx,_sy] = _grid[# _x, _y];
  35.     }
  36. }
  37.  
  38. var _values;
  39.  
  40. _values[0, 0] = 1;
  41. _values[1, 0] = 2;
  42. _values[2, 0] = 4;
  43. _values[0, 1] = 8;
  44. _values[1, 1] = 0; // center always filled
  45. _values[2, 1] = 16;
  46. _values[0, 2] = 32;
  47. _values[1, 2] = 64;
  48. _values[2, 2] = 128;
  49.  
  50. var _sum = 0;
  51.  
  52. for(_sx=0;_sx<=2;++_sx)
  53.     for(_sy=0;_sy<=2;++_sy)
  54.         _sum   += _surround[_sx, _sy]
  55.                 ? _values[_sx, _sy]
  56.                 : 0;
  57.  
  58. switch(_sum){
  59.  
  60.     // single
  61.     case 0:    
  62.     case 1:
  63.     case 4:
  64.     case 5:
  65.     case 32:
  66.     case 33:
  67.     case 36:
  68.     case 37:
  69.     case 128:
  70.     case 129:
  71.     case 132:
  72.     case 133:
  73.     case 160:
  74.     case 161:
  75.     case 164:
  76.     case 165:
  77.         return (14 +_tile_offset); 
  78.     break;
  79.    
  80.     // single neighbor above
  81.     case 2:
  82.     case 3:
  83.     case 6:
  84.     case 7:
  85.     case 34:
  86.     case 35:
  87.     case 38:
  88.     case 39:
  89.     case 130:
  90.     case 131:
  91.     case 134:
  92.     case 135:
  93.     case 162:
  94.     case 163:
  95.     case 166:
  96.     case 167:
  97.         return (30 +_tile_offset); 
  98.     break;
  99.    
  100.     // single neighbor left
  101.     case 8:
  102.     case 9:
  103.     case 12:
  104.     case 13:
  105.     case 40:
  106.     case 41:
  107.     case 44:
  108.     case 45:
  109.     case 136:
  110.     case 137:
  111.     case 140:
  112.     case 141:
  113.     case 168:
  114.     case 169:
  115.     case 172:
  116.     case 173:
  117.         return (17 +_tile_offset); 
  118.     break;
  119.    
  120.     // single neighbor right
  121.     case 16:
  122.     case 17:
  123.     case 20:
  124.     case 21:
  125.     case 48:
  126.     case 49:
  127.     case 52:
  128.     case 53:
  129.     case 144:
  130.     case 145:
  131.     case 148:
  132.     case 149:
  133.     case 176:
  134.     case 177:
  135.     case 180:
  136.     case 181:
  137.         return (15 +_tile_offset); 
  138.     break;
  139.    
  140.     // single neighbor below
  141.     case 64:   
  142.     case 65:
  143.     case 68:
  144.     case 69:
  145.     case 96:
  146.     case 97:
  147.     case 100:
  148.     case 101:
  149.     case 192:
  150.     case 193:
  151.     case 196:
  152.     case 197:
  153.     case 224:
  154.     case 225:
  155.     case 228:
  156.     case 229:
  157.         return (20 +_tile_offset); 
  158.     break;
  159.    
  160.     // two neighbors above and below
  161.     case 66:
  162.     case 67:
  163.     case 70:
  164.     case 71:
  165.     case 98:
  166.     case 99:
  167.     case 102:
  168.     case 103:
  169.     case 194:
  170.     case 195:
  171.     case 198:
  172.     case 199:
  173.     case 226:
  174.     case 227:
  175.     case 230:
  176.     case 231:
  177.         return (25 +_tile_offset);
  178.     break;
  179.    
  180.     // two neighbors left and right
  181.     case 24:
  182.     case 25:
  183.     case 28:
  184.     case 29:
  185.     case 56:
  186.     case 57:
  187.     case 60:
  188.     case 61:
  189.     case 152:
  190.     case 153:
  191.     case 156:
  192.     case 157:
  193.     case 184:
  194.     case 185:
  195.     case 188:
  196.     case 189:
  197.         return (16 +_tile_offset);
  198.     break;
  199.    
  200.     // two neighbors top and left
  201.     case 10:
  202.     case 14:
  203.     case 42:
  204.     case 46:
  205.     case 138:
  206.     case 142:
  207.     case 170:
  208.     case 174:
  209.         // tube corner
  210.         return (44 +_tile_offset);
  211.     break;
  212.    
  213.     // two neighbors top and right
  214.     case 18:
  215.     case 19:
  216.     case 50:
  217.     case 51:
  218.     case 146:
  219.     case 147:
  220.     case 178:
  221.     case 179:
  222.         // tube corner
  223.         return (39 +_tile_offset);
  224.     break;
  225.    
  226.     // two neighbors bottom and left
  227.     case 72:
  228.     case 73:
  229.     case 76:
  230.     case 77:
  231.     case 200:
  232.     case 201:
  233.     case 204:
  234.     case 205:
  235.         // tube corner
  236.         return (46 +_tile_offset);
  237.     break;
  238.    
  239.     // two neighbors bottom and right
  240.     case 80:
  241.     case 81:
  242.     case 84:
  243.     case 85:
  244.     case 112:
  245.     case 113:
  246.     case 116:
  247.     case 117:
  248.         // tube corner
  249.         return (45 +_tile_offset);
  250.     break;
  251.    
  252.     // three neighbors w, nw, n
  253.     case 11:
  254.     case 15:
  255.     case 43:
  256.     case 47:
  257.     case 139:
  258.     case 143:
  259.     case 171:
  260.     case 175:
  261.         // full corner
  262.         return (12 +_tile_offset);
  263.     break;
  264.    
  265.     // three neighbors n, ne, e
  266.     case 22:
  267.     case 23:
  268.     case 54:
  269.     case 55:
  270.     case 150:
  271.     case 151:
  272.     case 182:
  273.     case 183:
  274.         // full corner
  275.         return (10 +_tile_offset);
  276.     break;
  277.    
  278.     // three neighbors e, se, s
  279.     case 208:
  280.     case 209:
  281.     case 212:
  282.     case 213:
  283.     case 240:
  284.     case 241:
  285.     case 244:
  286.     case 245:
  287.         // full corner
  288.         return (0 +_tile_offset);
  289.     break;
  290.    
  291.     // three neighbors s, sw, w
  292.     case 104:
  293.     case 105:
  294.     case 108:
  295.     case 109:
  296.     case 232:
  297.     case 233:
  298.     case 236:
  299.     case 237:
  300.         // full corner
  301.         return (2 +_tile_offset);
  302.     break;
  303.    
  304.     // three neighbor T, w, n, e
  305.     case 26:
  306.     case 58:
  307.     case 154:
  308.     case 186:
  309.         // T with edge on bottom
  310.         return (33 +_tile_offset);
  311.     break;
  312.    
  313.     // three neighbor T n, e, s
  314.     case 82:
  315.     case 83:
  316.     case 114:
  317.     case 115:
  318.         // T with edge on left
  319.         return (34 +_tile_offset);
  320.     break;
  321.    
  322.     // three neighbor T w, e, s
  323.     case 88:
  324.     case 89:
  325.     case 92:
  326.     case 93:
  327.         // T with edge on top
  328.         return (31 +_tile_offset);
  329.     break;
  330.    
  331.     // three neighbor T w, n, s
  332.     case 74:
  333.     case 78:
  334.     case 202:
  335.     case 206:
  336.         // T with edge on right
  337.         return (32 +_tile_offset);
  338.     break;
  339.    
  340.     // four neighbor top edge with bottom left inside corner
  341.     case 216:
  342.     case 217:
  343.     case 220:
  344.     case 221:
  345.         return (36 +_tile_offset);
  346.     break;
  347.    
  348.     // four neighbor top edge with bottom right inside corner
  349.     case 120:
  350.     case 121:
  351.     case 124:
  352.     case 125:
  353.         return (35 +_tile_offset);
  354.     break;
  355.    
  356.     // four neighbor right edge with top left inside corner
  357.     case 106:
  358.     case 110:
  359.     case 234:
  360.     case 238:
  361.         return (43 +_tile_offset);
  362.     break;
  363.    
  364.     // four neighbor right edge with bottom left inside corner
  365.     case 75:
  366.     case 79:
  367.     case 203:
  368.     case 207:
  369.         return (38 +_tile_offset);
  370.     break;
  371.    
  372.     // four neighbor bottom edge with top left inside corner
  373.     case 30:
  374.     case 62:
  375.     case 158:
  376.     case 190:
  377.         return (41 +_tile_offset);
  378.     break;
  379.    
  380.     // four neighbor bottom edge with top right inside corner
  381.     case 27:
  382.     case 59:
  383.     case 155:
  384.     case 187:
  385.         return (40 +_tile_offset);
  386.     break;
  387.    
  388.     // four neighbor left edige with top right inside corner
  389.     case 210:
  390.     case 211:
  391.     case 242:
  392.     case 243:
  393.         return (42 +_tile_offset);
  394.     break;
  395.    
  396.     // four neighbor left edge with bottom right inside corner
  397.     case 86:
  398.     case 87:
  399.     case 118:
  400.     case 119:
  401.         return (37 +_tile_offset);
  402.     break;
  403.    
  404.     // four neighbor cross
  405.     case 90:
  406.         return (13 +_tile_offset);
  407.     break;
  408.    
  409.     // five neighbor left edge
  410.     case 214:
  411.     case 215:
  412.     case 246:
  413.     case 247:
  414.         return (5 +_tile_offset);
  415.     break;
  416.    
  417.     // five neighbor right edge
  418.     case 107:
  419.     case 111:
  420.     case 235:
  421.     case 239:
  422.         return (7 +_tile_offset);
  423.     break;
  424.    
  425.     // five neighbor top edge
  426.     case 248:
  427.     case 249:
  428.     case 252:
  429.     case 253:
  430.         return (1 +_tile_offset);
  431.     break;
  432.    
  433.     // five neighbor bottom edge
  434.     case 31:
  435.     case 63:
  436.     case 159:
  437.     case 191:
  438.         return (11 +_tile_offset);
  439.     break;
  440.    
  441.     // five neighbor triple inside corner bottom right filled
  442.     case 218:
  443.         return (27 +_tile_offset);
  444.     break;
  445.    
  446.     // five neighbor triple inside corner bottom left filled
  447.     case 122:
  448.         return (21 +_tile_offset);
  449.     break;
  450.  
  451.     // five neighbor triple inside corner top left filled
  452.     case 91:
  453.         return (22 +_tile_offset);
  454.     break;
  455.    
  456.     // five neighbor triple inside corner top right filled
  457.     case 94:
  458.         return (26 +_tile_offset);
  459.     break;
  460.    
  461.     // six neighbor double inside corners facing up
  462.     case 250:
  463.         return (23 +_tile_offset);
  464.     break;
  465.    
  466.     // six neighbor double inside corners facing down
  467.     case 95:
  468.         return (29 +_tile_offset);
  469.     break;
  470.    
  471.     // six neighbor double inside corners facing left
  472.     case 222:
  473.         return (28 +_tile_offset);
  474.     break;
  475.    
  476.     // six neighbor double inside corners facing right
  477.     case 123:
  478.         return (24 +_tile_offset);
  479.     break;
  480.    
  481.     // six neighbor double inside corner top left and bottom right
  482.     case 126:
  483.         return (19 +_tile_offset);
  484.     break;
  485.    
  486.     // six neighbor double inside corner bottom left and top right
  487.     case 219:
  488.         return (18 +_tile_offset);
  489.     break;
  490.    
  491.     // seven neighbor missing top left
  492.     case 254:
  493.         return (9 +_tile_offset);
  494.     break;
  495.    
  496.     // seven neighbor missing top right
  497.     case 251:
  498.         return (8 +_tile_offset);
  499.     break;
  500.    
  501.     // seven neighbor missing bottom right
  502.     case 127:
  503.         return (3 +_tile_offset);
  504.     break;
  505.    
  506.     // seven neighbor missing bottom left
  507.     case 223:
  508.         return (4 +_tile_offset);
  509.     break;
  510.    
  511.     // all eight neighbors
  512.     case 255:
  513.         return (6 +_tile_offset);
  514.     break;
  515.    
  516.     default:
  517.         show_debug_message("no case for sum: "+string(_sum)+" surround: "+string(_surround));
  518. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement