0"""333DDDUUUfffwww 02TvͫgE#2Tv2Tv̬̬̬̈̬̬̬̬̈̬̬̬̬̬̪쬪̬̬̬̪쬪 >?IDiffffffff63333CDDDDDID̙iffffffff6333333CDDDII ̙iffffffff633333333DDD̙iffffffff6333333333CID̜iffffffff63333333333DD@D̜iffffffff63333333333IDDDDD̜iffffffff63333333333DDDDDDiffffffff63333333333DDDDDD@ifffffff6333333333IDDDDDDD̙fffffff633333333DDDDDDDD̙fffffff633333333IDDDDDDDDDɜfffffff633333333IDDDDDDDDDD̜fffffff633333333DDDDDDDDDDD̜fffffff633333333IDDDDDDDDDDD@̜fffffff633333333IDDDDDDDDDDDD̜fffffff633333333DDDDDDDDDDDDD̜fffffff633333333DN䙙IDDDDDDDDDDDDDD̜̙fffffff63333333DDIDDDDDDDDDDDDDDD̙fffffff63333333DDDDDDDDDDDDDDDDDD̙fffffff63333333DDDDDDDDDDDDDDDDDD@ɜfffffff63333333DDIDDDDDDDDDDDDDDDD̜fffffff63333333DDDDDDDDDDDDDDDDDDD̜fffffff63333333DDDDDDDDDDDDDDDDD̜ifffff6333333DIDDDDDDDDDDDDDDDD̜ifffff633333DIDDDDDDDDDDDDDDDD̜ifffff633333D鞙DDDDDDDDDDDDDDDD̜̙ifffff633333DDDDDDDDDDDDDDDDD̙IDDDDD$"3333IDDDDDDDDDDDDDDD̙ifFDDDDD$"""33HDDDDDDDDDDDDɜfffFDDDDD$""""2DDDDDDDDDDDD̜iffffFDDDDD$"""""DDDDDDDDDDDlfffffFDDDDD$"""""HDDDDDDDĎhfffffFDDDD$"""""DDDDDDDD̈hfffffFDDDD""""""DDDDDDDD̈hfffffFDDDD""""""HHDĎhffffFfDDD""""""HDD̈ffffffDDD""""""HDĎffffffDDD""""""HϯffffffDDD"""""(ffffffDDD""""(ffffffDDD""""""/"hffffDDD""""""""""hffffDDD""""(""""""hffffDDD""""(""""""/"hfffDDD""""("""""""""fffDDD""""""""""""""fffDDD""""""""""""""/"/򪪪fffDDD"""""""""""""""""򪪪fffDDD"""(""""""""""""""fffDDD"""(""""""""""""""ʬhfdFD"""(""""""""""""""̬hffFD"""(""""""""""""""̬hffFD"""3"""""""""""""""̬ʬ̪hfFD""3""""""""""""""̪fFD"3""""""""""""""̪3#"3>3>3>3>ȌȌȌ""""""""""""""ʬ̪JD3#"33333333333̌""""""""""""""̪ED3#"33333333333̌""""""""""""""̪ZED3#"33333333333̌ȌX%UR%UR%UR%UR%UʬeFUC$"33333333333\UUUUUUUUUUUUUlfVUD$"33333333333\UUUUUUUUUUUUUffVUD$"33333333333\UUUUUUUUUUUUUwvWw.33333333333\UUUUUUUUUUUUUwwww33333333333\UUUUUUUUUUUUU~wwww33333333333\UUUUUUUUUUUUUpy 33333333333\UUUUUUUUUUUUU 33333333333\UUUUUUUUUUUUU 33333333333\UUUUUUUUUUUUU 33333333333\UUUUUUUUUUUUU33333333333\UUUUUUUUUUUUU33333333333\UUUUUUUUUUUUU" 33333333333\UUUUUUUUUUUUU ""̪ 33333333333\UUUUUUUUUUUUU """̪ 33333333333\UUUUUUUUUUX """"̪ 33333333333\UUUUUUUUU""""B̪33333333333\UUUUUUUUU""""B̬33333333333\UUUUX"""""BD̬ 33333333333UUU """""BD̬33333333333UUU """""BDDݭ̬333333333333 X" """""BDDdݪʪ̪333333333333 """""""DDDfff̬̪333333333333 """""""DDDfff̪333333333333 """""""DDDDfffhʪ̬f`f`333333333333"""""""BDDDDffff̬fffff333333333333"""""""BDDDDffff̬fffff333333333333 """"""""BDDDDffffʪ̪ffffff`f`f333333333333+""""""""BDDDDffff̪ffffffffffff333333333333""""""""BDDDDffff̬ffffffffffff3333333338"""""""BDDDDDffff̬hffffffffffff33333333+""""""DDDDDDffff̪hffffffffffff33333333""""""DDDDDDffff̬hffffffffffff3338"""""DDDDDDfffffʪhffffffffffff33+"""BDDDDDdffffffffffffffffff33"""BDDDDDdfffffzfffffffffffff+""BDDDDDdfffffwwfffffffffffff""BDDDDDdfffffzwwwhfffffffffffff""BDDDDDdfffffwwwwhfffffffffffff+BDDDDDDdfffffzwwwwzwhfffffffffffffNDDDDDDdfffffwwwwwwwwhfffffffffffffDDDDDDdfffffzwwwwwwwwffffffffffffffNDDDDDdfffffwwwwwwwwwzffffffffffffff@DDDDDdfffffzwwwwwwwwwwhffffffffffffff@DDDDdfffffzwwwwwwwwwwwhffffffffffffff@DNDDdfffffffwwwwwwwwwwwwwzhffffffffffffffDDNDfffffffffwwwwwwwwwwwwwwwwfffffffffffffffDDDNfffffffffDwwwwwwwwwwwwwwwwffffffffffffffF@DDDDffffffffHDDwwwwwwwwwwwwwwwwwhffffffffffffffFDDDDDDaffffffDDDDwwwwwwwwwwwwwwwwwwhffffffffffffffFDDDDDDDaffffDDDDDDwwwwwwwwwwwwwwwwwwhffffffffffffffDDDDDDDDDDDDDDDDDDGtwwwwwwwwwwwwwwwwHDfffffffffffffffD@DDDDDDDDDDDDDDDDDDDtwwwwwwwwwwwwwwwGDDDfffffffffffffffD@DDDDDDDDDDDDDDDDDDDtwwwwwwwwwwwwwwwDDDDhffffffffffffffFDD@DDDDDDDDDDDDDDDDDDDDtDwwwwwwwwwwwwwGDDDDHhffffffffffffffFD@DDDDDDDDDDDDDDDDDDDDDDDDDwwwwwwwwwwwwwGDDDDDfffffffffffffffDD@DDDDDDDDDDDDDDDDDDDDDDDDDwwwwwwwwwwwwwDDDDDDhfffffffffffffffDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDwwwwwwwwwwwwGDDDDDDDHhfffffffffffffffDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDwwwwwwwwwwwwDDDDDDDDDDfffffffffffffffFDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDwwwwwwwwwwwGDDDDDDDDDDfffffffffffffffFDD؍MDDDDDDDDDDDDDDDDDDDDDDDDDDDDDGtwwwwwwwwwDDDDDDDDDDDDhfffffffffffffffDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDtwwwwwwwwGDDDDDDDDDDDDDhfffffffffffffffDDDMDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDtwwwwwwwGDDDDDDDDDDDDDDfffffffffffffffFDDDMDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDtwwwwwwwDDDDDDDDDDDDDDDHDhfffffffffffffffFDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDtwwwwwwGDDDDDDDDDDDDDDDDDDhfffffffffffffffDDDDMDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDtwwwwwwDDDDDDDDDDDDDDDDDDDffffffffffffffffDDDDMDDDDDDDDDDDDDDDDADDDDDDDDDDDtDwwwwDDDDDDDDDDDDDDDDDDDafffffffffffffFDDDDDDDDDDDDDDDDDDDDADDDDDDDDDDDDDwwwGDDDDDDDDDDDDDDDDDDDafffffffffffffFDDDDMDDDDDDDDDDDDDDDADDDDDDDDDDDDDwwGDDDDDDDDDDDDDDDDDDDDafffffffffffffDDDDDDDDDDDDDDDDDDDADDDDDDDDDDDDDGtDDDDDDDDDDDDDDDDDDDDaaffffffffffDDDDDDDDDDDDDDDDDDADDDDDDDDDDDDDD@DDDDDDDDDDDDDDDDDDDDafffffffffFDDDDDMDDDDDDDDDDDDADDDDDDDDDDDDD@DDDDDDDDDDDDDDDDDDDafffffffffFDDDDDDDDDDDDDDDDDADDDDDDDDDDDD@DDDDDDDDDDDDDDDDDDDaffffffffDDDDDDMDDDDDDDDDDDADDDDDDDDDDD@DDDDDDDDDDDDDDDDDDDffffffffDDDDDDDDDDDDDDDDDADDDDDDDDD@DDDDDDDDDDDDDDDDDDfffffffFDDDDDDMDDDDDDDDDDADDDDDDDD@DDDDDDDDDDDDDDDDDDfffffffDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDaffffffDDDDDDDh-- title: pow circle -- author: quadtrip -- desc: circle effect -- script: lua -- Global configurations local GRID_SIZE = 7 local PARTICLE_SIZE = 10 local RAY_START = { x = 120, y = 68 } local RAY_DIR = { x = 1, y = -0.5 } local BRIGHTNESS_DECAY = 0.001 local interpolationSpeed = 0.01 -- Particle class local Particle = {} Particle.__index = Particle function Particle.new(x, y) local self = setmetatable({}, Particle) self.x = x self.y = y self.brightness = 0 return self end function Particle:intersect(ray_start, ray_dir) local tmin = (self.x - ray_start.x) / ray_dir.x local tmax = (self.x + PARTICLE_SIZE - ray_start.x) / ray_dir.x if ray_dir.x < 0 then tmin, tmax = tmax, tmin end local tymin = (self.y - ray_start.y) / ray_dir.y local tymax = (self.y + PARTICLE_SIZE - ray_start.y) / ray_dir.y if ray_dir.y < 0 then tymin, tymax = tymax, tymin end if (tmin > tymax) or (tymin > tmax) then return false end if (tmin < 0 and tmax < 0) or (tymin < 0 and tymax < 0) then return false end self.brightness = 1.0 return true end function math.clamp(low, n, high) return math.min(math.max(n, low), high) end function Particle:draw() local color = math.floor(math.clamp(self.brightness,0,1) * 15) circ(self.x+1, self.y+1, PARTICLE_SIZE/2, color) end function Particle:update() self.brightness = self.brightness - BRIGHTNESS_DECAY if self.brightness < 0 then self.brightness = 0 end end -- Setup initial particles local particles = {} for i = 0, (240 // GRID_SIZE) - 1 do for j = 0, (136 // GRID_SIZE) - 1 do table.insert(particles, Particle.new(i * GRID_SIZE, j * GRID_SIZE)) end end --for i=0,47 do poke(0x3fc0+i,i*5) end local currentPalette = {} local targetPalette = {} local t = 0 -- progression variable, ranges from 0 to 1 -- Extract RGB values from palette string function extractRGB(paletteString) local colors = {} for i=1, #paletteString, 6 do local color = string.sub(paletteString, i, i+5) table.insert(colors, color) end return colors end -- LERP function lerp(a, b, t) return math.floor(a + (b - a) * t + 0.5) -- This rounds instead of truncates end -- Example palettes local palettes = { "000000111111222222333333444444555555666666777777888888999999aaaaaabbbbbbccccccddddddeeeeeeffffff", "0000001d2b537e255383769cab5236008751ff004d5f574fff77a8ffa300c2c3c700e436ffccaa29adffffec27fff1e8", "000000ffffffa8734ae9b287772d26b6686285d4dcc5ffffa85fb4e99df5559e4a92df8742348b7e70cabdcc71ffffb0", "3f28117a2222d13b27e07f8a5d853a68c127b3e868122615513155286fb89b8bffa8e4d4cc8218c7b581000000ffffff", "00000019102846af45a1d685453e787664fe8331299ec2e8dc534be18d79d6b97be9d8a1216c4bd365c8afaab9f5f4eb", "0000005e606e2234d10c7e455c2e78b5b5b5ffffffffd93f7be2f98a36224c81fb44aacceb8a60aa5c3d6cd947e23d69", "0000001b1e29362747443f4152524c64647c73615077785b9ea4a7cbe8f7e08b79a2324e003308084a3c546a00516cbf", "000000555555aaaaaaffffff0000aa5555ff00aa0055ff5500aaaa55ffffaa0000ff5555aa00aaff55ffaa5500ffff55", "0d080d4f2b24825b31c59154f0bd77fbdf9bfff9e4bebbb27bb24e74adbb4180a032535f2a23497d3840c16c5be89973", "f6f6bfe6d1d1868691794765f5e17aedc38dcc8d86ca657e39d4b98dbcd28184ab6860869dc0857ea788567864051625", "1a1c2c5d275db13e53ef7d57ffcd75a7f07038b76425717929366f3b5dc941a6f673eff7f4f4f494b0c2566c86333c57", "0000007e7e7ebebebeffffff7e0000ff0000007e0000ff007e7e00ffff0000007e0000ff7e007eff00ff007e7e00ffff" } function colorsToPaletteString(colors) local str = "" for i=1, #colors do str = str .. colors[i] end return str end function loadPalette(palette) for i=0,15 do r=tonumber(string.sub(palette,i*6+1,i*6+2),16) g=tonumber(string.sub(palette,i*6+3,i*6+4),16) b=tonumber(string.sub(palette,i*6+5,i*6+6),16) poke(0x3FC0+(i*3)+0,r) poke(0x3FC0+(i*3)+1,g) poke(0x3FC0+(i*3)+2,b) end end function toHex(val) local hex = string.format("%02x", val) return hex:lower() end -- Update palette function updatePalette() local interpolatedColors = {} for i=1, 16 do local currColor = currentPalette[i] local targetColor = targetPalette[i] local newColor = toHex(lerp(tonumber(currColor:sub(1,2), 16), tonumber(targetColor:sub(1,2), 16), t)) .. toHex(lerp(tonumber(currColor:sub(3,4), 16), tonumber(targetColor:sub(3,4), 16), t)) .. toHex(lerp(tonumber(currColor:sub(5,6), 16), tonumber(targetColor:sub(5,6), 16), t)) table.insert(interpolatedColors, newColor) end loadPalette(colorsToPaletteString(interpolatedColors)) -- Increment t t = t + interpolationSpeed if t >= 1 then t = 0 currentPalette = targetPalette -- Logic to select new target palette local index = math.random(1, #palettes) targetPalette = extractRGB(palettes[index]) end end -- Initially set the current and target palette currentPalette = extractRGB(palettes[1]) curpal = 2 targetPalette = extractRGB(palettes[curpal]) cls(0) function applyVignette(x, y, strength) local centerX = 240 / 2 -- Assuming a 240x136 TIC-80 resolution, change accordingly if different local centerY = 136 / 2 local maxDist = math.sqrt(centerX^2 + centerY^2) local dist = math.sqrt((x - centerX)^2 + (y - centerY)^2) local lerpValue = dist / maxDist -- Calculate the fade strength based on distance local fade = lerp(1, strength, lerpValue) -- Get the pixel color local col = pix(x,y) -- Darken the color local darkenedCol = fade * col -- Apply the darkened color back to the screen pix(x, y, math.floor(darkenedCol)) end function TIC() updatePalette() RAY_DIR.y=math.cos(time()/600) RAY_DIR.x=math.sin(time()/600) -- Draw all particles for _, particle in pairs(particles) do particle:intersect(RAY_START, RAY_DIR) particle:update() particle:draw() end BRIGHTNESS_DECAY = 0.01*math.cos(time()*0.0002) for x = 0, 239 do for y = 0, 135 do applyVignette(x, y, 12-math.cos(time()*0.0002)*10) end end end