voxeltpt

sw unmin

May 11th, 2021
576
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. lim =3
  2.  M = math
  3. si = M.sin
  4. co = M.cos
  5. pi = M.pi
  6.  
  7. S = screen
  8. C = S.setColor
  9. dL = S.drawLine
  10. dC = S.drawCircle
  11. dRF = S.drawRectF
  12. dTF = S.drawTriangleF
  13. dTx = S.drawText
  14. dTxB = S.drawTextBox
  15.  
  16. MS = map.mapToScreen
  17. SM = map.screenToMap
  18. I = input
  19. O = output
  20.  
  21. tU = table.unpack
  22. F = string.format
  23.  
  24. zoom = 1
  25. tz = 5 * 32 * 0.11
  26. zooms = {0.3, 2, 5, 10, 30, 50}
  27. grids = {10, 100, 500, 1000, 2500, 5000}
  28. grid = 100
  29. sis = {5, 4, 3, 2, 1, 1}
  30. SZ = 4
  31. wp = {}
  32. sel = 0
  33.  
  34. function dPoi(xx, yy, s, r, ...)
  35.     local a, x, y = ..., 0, 0
  36.     a = (a or 30) * pi / 360
  37.     x = xx + s / 2 * si(r)
  38.     y = yy - s / 2 * co(r)
  39.     xx = xx - s / 4 * si(r)
  40.     yy = yy + s / 4 * co(r)
  41.     dTF(xx, yy, x, y, x - s * si(r + a), y + s * co(r + a))
  42.     dTF(xx, yy, x, y, x - s * si(r - a), y + s * co(r - a))
  43. end
  44. function clamp(a, b, c)
  45.     return M.min(M.max(a, b), c)
  46. end
  47. function getN(...)
  48.     local a = {}
  49.     for b, c in ipairs({...}) do
  50.         a[b] = I.getNumber(c)
  51.     end
  52.     return tU(a)
  53. end
  54. function outN(o, ...)
  55.     for i, v in ipairs({...}) do
  56.         O.setNumber(o + i - 1, v)
  57.     end
  58. end
  59.  
  60. function onTick()
  61.     touch = I.getBool(1)
  62.     W, H, tx, ty, gx, gy, gz, dir, swp = getN(1, 2, 3, 4, 11, 12, 13, 14, 15)
  63.     if gx == nil then
  64.         return true
  65.     end
  66.     if wx == nil then
  67.         if gx == 0 then
  68.             return true
  69.         end
  70.         wx, wy, Fx, Fy, Fz = gx, gy, gx, gy, zoom
  71.     end
  72.     if swp > 0 and swp <= #wp then
  73.         sel = swp
  74.     end
  75.  
  76.     if touch and not t then
  77.         if tx < 10 then
  78.             tz = ty
  79.             Fz = M.sin((tz / H) ^ 2 * pi / 2) * 50
  80.             i = 1
  81.             while Fz > zooms[i] do
  82.                 i = i + 1
  83.             end
  84.             grid = grids[i]
  85.             SZ = sis[i]
  86.         elseif ty < 13 then
  87.             ttx = M.ceil((tx - 11) / 13)
  88.             if ttx > 0 and ttx <= #wp then
  89.                 if sel == ttx then
  90.                     table.remove(wp, sel)
  91.                     sel = 0
  92.                     ttx = 0
  93.                 else
  94.                     sel = ttx
  95.                     Fx, Fy = wp[sel].x, wp[sel].y
  96.                 end
  97.             end
  98.             if ttx == #wp + 1 then
  99.                 if #wp+1<=lim then
  100.                     sel = #wp + 1
  101.                     wp[sel] = {x = wx, y = wy}
  102.                 end
  103.             end
  104.         else
  105.             Fx, Fy = SM(wx, wy, zoom, W, H, tx, ty)
  106.         end
  107.     end
  108.     wx = wx + (Fx - wx) * 0.1
  109.     wy = wy + (Fy - wy) * 0.1
  110.     zoom = zoom + (Fz - zoom) * 0.1
  111.     t = touch
  112.  
  113.     outN(1, gx, gy, wx, wy, gx, gy, gz, sel, #wp)
  114.     if sel > 0 then
  115.         outN(1, wp[sel].x, wp[sel].y)
  116.     end
  117. end
  118.  
  119. function onDraw()
  120.     if wx == nil then
  121.         return true
  122.     end
  123.     w = S.getWidth()
  124.     h = S.getHeight()
  125.     cx = w / 2
  126.     cy = h / 2
  127.     sz = SZ / H * h
  128.     if w == W then
  129.         mx, my, zo = wx, wy, zoom
  130.     else
  131.         mx, my, zo = gx, gy, 1
  132.     end
  133.  
  134.     S.setMapColorOcean(10, 10, 15)
  135.     S.setMapColorShallows(15, 15, 20)
  136.     S.setMapColorLand(60, 60, 60)
  137.     S.setMapColorGrass(40, 60, 40)
  138.     S.setMapColorSand(55, 55, 50)
  139.     S.setMapColorSnow(80, 80, 80)
  140.     S.drawMap(mx, my, zo)
  141.     x1, y1 = SM(mx, my, zo, w, h, 0, h)
  142.     x2, y2 = SM(mx, my, zo, w, h, w, 0)
  143.     x1 = M.floor(x1 / grid) * grid
  144.     y1 = M.floor(y1 / grid) * grid
  145.  
  146.     C(0, 0, 0, 20)
  147.     for xx = x1, x2, grid do
  148.         x, y = MS(mx, my, zo, w, h, xx, y1)
  149.         dL(x, 0, x, h)
  150.     end
  151.     for yy = y1, y2, grid do
  152.         x, y = MS(mx, my, zo, w, h, x1, yy)
  153.         dL(0, y, w, y)
  154.     end
  155.  
  156.     if w == W then
  157.         dRF(8, 0, 2, h)
  158.         C(0, 0, 0, 200)
  159.         dRF(0, 0, 8, h)
  160.         dRF(58, h - 19, 45, 16)
  161.         dRF(11, h - 19, 45, 16)
  162.         dTxB(105, h - 19, w - 110, 15, F("grid:%.0f  scale:%.1f", grid, zo), -1, 1)
  163.  
  164.         C(255, 150, 0)
  165.         dL(1, tz, 7, tz)
  166.         dTxB(105, h - 20, w - 110, 15, F("grid:%.0f  scale:%.1f", grid, zo), -1, 1)
  167.         dTxB(60, h - 20, 45, 15, F("x:%.0f\ny:%.0f", mx, my), -1, 1)
  168.     end
  169.  
  170.     vx, vy = MS(mx, my, zo, w, h, gx, gy)
  171.     r = dir * pi * -2
  172.  
  173.     if vx < 10 or vx > w or vy < 0 or vy > h then
  174.         C(200, 0, 0)
  175.         vx = clamp(vx, 12, w - 3)
  176.         vy = clamp(vy, 5, h - 3)
  177.         r = M.atan(gx - mx, gy - my)
  178.         dPoi(vx, vy, 10, r, 40)
  179.     else
  180.         vy1 = vy - (gz / 10) / (zo + 1)
  181.         if gz < 0 then
  182.             C(0, 50, 200)
  183.             dPoi(vx, vy1, 10, r, 50)
  184.             C(0, 50, 100, 100)
  185.             dL(vx, vy + 5, vx, vy1)
  186.             C(0, 0, 0, 100)
  187.             dPoi(vx, vy, 10, r, 50)
  188.         else
  189.             C(0, 0, 0, 100)
  190.             dPoi(vx, vy, 10, r, 50)
  191.             C(100, 0, 0, 100)
  192.             dL(vx, vy - 4, vx, vy1)
  193.             C(200, 0, 0)
  194.             dPoi(vx, vy1, 10, r, 50)
  195.         end
  196.     end
  197.  
  198.     if w == W then
  199.         C(0, 0, 0, 50)
  200.         dL(10, cy + 1, cx - 5, cy + 1)
  201.         dL(cx + 1, 0, cx + 1, cy - 5)
  202.         dL(cx + 6, cy + 1, w, cy + 1)
  203.         dL(cx + 1, cy + 6, cx + 1, h)
  204.         C(255, 255, 255, 50)
  205.         dL(10, cy, cx - 5, cy)
  206.         dL(cx, 0, cx, cy - 5)
  207.         dL(cx + 6, cy, w, cy)
  208.         dL(cx, cy + 6, cx, h)
  209.         C(200, 0, 0)
  210.         dTxB(13, h - 20, 45, 15, F("x:%.0f\ny:%.0f", gx, gy), -1, 1)
  211.     end
  212.     i = 1
  213.     while i <= #wp do
  214.         lx, ly = ox, oy
  215.         ox, oy = MS(mx, my, zo, w, h, wp[i].x, wp[i].y)
  216.         C(0, 100, 0, 220)
  217.         if i == sel then
  218.             dL(ox, oy, vx, vy)
  219.         end
  220.         C(0, 0, 0, 150)
  221.         if i <= sel then
  222.             C(0, 0, 0, 20)
  223.         end
  224.         dC(ox, oy + 1, sz)
  225.         if i > 1 then
  226.             dL(ox, oy, lx, ly)
  227.         end
  228.         C(0, i == sel and 150 or 0, 0, 220)
  229.         dC(ox, oy, sz)
  230.         if w == W then
  231.             dRF(-2 + i * 13, 2, 10, 10)
  232.             C(255, 255, 255)
  233.             dTx((i > 9 and -2 or 1) + i * 13, 4, i)
  234.         end
  235.         i = i + 1
  236.     end
  237.     if w == W then
  238.         C(0, 0, 0, 200)
  239.         dRF(-2 + i * 13, 2, 10, 10)
  240.         C(255, 255, 255)
  241.         dL(i * 13 - 1, 6, 6 + i * 13, 6)
  242.         dL(2 + i * 13, 3, 2 + i * 13, 10)
  243.     end
  244. end
  245.  
RAW Paste Data