From f9b2fcb11a0ce59c77abb613ffdd8d03f079ee17 Mon Sep 17 00:00:00 2001 From: Firew0lf Date: Tue, 29 Dec 2015 22:54:56 +0100 Subject: [PATCH] Added Canvas and Sound. Warning: the Canvas are slow, and the sound doesn't work. --- README.md | 4 + uCompat/Canvas.lua | 219 +++++++++++++++++++++++++++++++++++++++++++++ uCompat/Debug.lua | 2 +- uCompat/Sound.lua | 58 ++++++++++++ uCompat/init.lua | 3 + uCompat/screen.lua | 9 +- 6 files changed, 292 insertions(+), 3 deletions(-) create mode 100644 uCompat/Sound.lua diff --git a/README.md b/README.md index c5e6379..10fbcea 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ Untested. Actually done: + * Canvas * Color * Controls * Debug @@ -13,9 +14,12 @@ Actually done: * ini * Map * Motion + * Nifi * Rumble * screen * ScrollMap + * Sound (without sound) * Sprite * System * Timer + * Wifi diff --git a/uCompat/Canvas.lua b/uCompat/Canvas.lua index 1f455fd..4b25298 100644 --- a/uCompat/Canvas.lua +++ b/uCompat/Canvas.lua @@ -1,11 +1,230 @@ --[[ Canvas related µLua compatibility layer/lib for ctrµLua + + If you used to use the canvas to speed up your drawing: f*ck you. ]] +require("uCompat.screen") + +-- Constants + +ATTR_X1 = 1 +ATTR_Y1 = 2 +ATTR_X2 = 3 +ATTR_Y2 = 4 +ATTR_X3 = 5 +ATTR_Y3 = 6 +ATTR_COLOR = 7 +ATTR_COLOR1 = 8 +ATTR_COLOR2 = 9 +ATTR_COLOR3 = 10 +ATTR_COLOR4 = 11 +ATTR_TEXT = 12 +ATTR_VISIBLE = 13 +ATTR_FONT = 14 +ATTR_IMAGE = 15 + -- Local +local function attrTable() + return { + type = false, + [ATTR_X1] = false, + [ATTR_Y1] = false, + [ATTR_X2] = false, + [ATTR_Y2] = false, + [ATTR_X3] = false, + [ATTR_Y3] = false, + [ATTR_COLOR] = false, + [ATTR_COLOR1] = false, + [ATTR_COLOR2] = false, + [ATTR_COLOR3] = false, + [ATTR_COLOR4] = false, + [ATTR_TEXT] = false, + [ATTR_VISIBLE] = false, + [ATTR_FONT] = false, + [ATTR_IMAGE] = false + } +end +local TYPE_LINE = 1 +local TYPE_POINT = 2 +local TYPE_RECT = 3 +local TYPE_FILLRECT = 4 +local TYPE_GRADIENTRECT = 5 +local TYPE_TEXT = 6 +local TYPE_TEXTFONT = 7 +local TYPE_TEXTBOX = 8 +local TYPE_IMAGE = 9 + +local function searchObject(t, o) + for n,v in pairs(t) do + if (v == o) then return n end + end + return nil +end -- Module Canvas = {} + +function Canvas.new() + return {} +end + +function Canvas.destroy(canvas) + -- + collectgarbage() +end + +function Canvas.newLine(x1, y1, x2, y2, color) + local o = attrTable() + o.type = TYPE_LINE + o[ATTR_X1] = x1 + o[ATTR_Y1] = y1 + o[ATTR_X2] = x2 + o[ATTR_Y2] = y2 + o[ATTR_COLOR] = color + return o +end + +function Canvas.newPoint(x1, y1, color) + local o = attrTable() + o.type = TYPE_POINT + o[ATTR_X1] = x1 + o[ATTR_Y1] = y1 + o[ATTR_COLOR] = color + return o +end + +function Canvas.newRect(x1, y1, x2, y2, color) + local o = attrTable() + o.type = TYPE_RECT + o[ATTR_X1] = x1 + o[ATTR_Y1] = y1 + o[ATTR_X2] = x2 + o[ATTR_Y2] = y2 + o[ATTR_COLOR] = color + return o +end + +function Canvas.newFillRect(x1, y1, x2, y2, color) + local o = attrTable() + o.type = TYPE_FILLRECT + o[ATTR_X1] = x1 + o[ATTR_Y1] = y1 + o[ATTR_X2] = x2 + o[ATTR_Y2] = y2 + o[ATTR_COLOR] = color + return o +end + +function Canvas.newGradientRect(x1, y1, x2, y2, color1, color2, color3, color4) + local o = attrTable() + o.type = TYPE_GRADIENTRECT + o[ATTR_X1] = x1 + o[ATTR_Y1] = y1 + o[ATTR_X2] = x2 + o[ATTR_Y2] = y2 + o[ATTR_COLOR1] = color1 + o[ATTR_COLOR2] = color2 + o[ATTR_COLOR3] = color3 + o[ATTR_COLOR4] = color4 + return o +end + +function Canvas.newText(x1, y1 text, color) + local o = attrTable() + o.type = TYPE_TEXT + o[ATTR_X1] = x1 + o[ATTR_Y1] = y1 + o[ATTR_TEXT] = text + o[ATTR_COLOR] = color + return o +end + +function Canvas.newTextFont(x1, y1, text, color, font) + local o = attrTable() + o.type = TYPE_TEXTFONT + o[ATTR_X1] = x1 + o[ATTR_Y1] = y1 + o[ATTR_TEXT] = text + o[ATTR_COLOR] = color + o[ATTR_FONT] = font + return o +end + +function Canvas.newTextBox(x1, y1, x2, y2, text, color) + local o = attrTable() + o.type = TYPE_TEXTBOX + o[ATTR_X1] = x1 + o[ATTR_Y1] = y1 + o[ATTR_X2] = x2 + o[ATTR_Y2] = y2 + o[ATTR_TEXT] = text + o[ATTR_COLOR] = color + return o +end + +function Canvas.newImage(x1, y1, image, x2, y2, x3, y3) + local o = attrTable() + o.type = TYPE_IMAGE + o[ATTR_X1] = x1 + o[ATTR_Y1] = y1 + o[ATTR_IMAGE] = image + o[ATTR_X2] = x2 + o[ATTR_Y2] = y2 + o[ATTR_X3] = x3 + o[ATTR_Y3] = y3 +end + +function Canvas.add(canvas, object) + canvas[#canvas+1] = object +end + +function Canvas.draw(scr, canvas, x, y) + for i=1, #canvas do + local o = canvas[i] -- gotta go fast + if o.type == TYPE_LINE then + screen.drawLine(scr, o[ATTR_X1]+x, o[ATTR_Y1]+y, o[ATTR_X2]+x, o[ATTR_Y2]+y, o[ATTR_COLOR]) + elseif o.type == TYPE_POINT then + screen.drawPoint(scr, o[ATTR_X1]+x, o[ATTR_Y1]+y, o[ATTR_COLOR]) + elseif o.type == TYPE_RECT then + screen.drawRect(scr, o[ATTR_X1]+x, o[ATTR_Y1]+y, o[ATTR_X2]+x, o[ATTR_Y2]+y, o[ATTR_COLOR]) + elseif o.type == TYPE_FILLRECT then + screen.drawFillRect(scr, o[ATTR_X1]+x, o[ATTR_Y1]+y, o[ATTR_X2]+x, o[ATTR_Y2]+y, o[ATTR_COLOR]) + elseif o.type == TYPE_GRADIENTRECT then + screen.drawGradientRect(scr, o[ATTR_X1]+x, o[ATTR_Y1]+y, o[ATTR_X2]+x, o[ATTR_Y2]+y, o[ATTR_COLOR1], o[ATTR_COLOR2], o[ATTR_COLOR3], o[ATTR_COLOR4]) + elseif o.type == TYPE_TEXT then + screen.print(scr, o[ATTR_X1]+x, o[ATTR_Y1]+y, o[ATTR_TEXT], o[ATTR_COLOR]) + elseif o.type == TYPE_TEXTFONT then + screen.printFont(scr, o[ATTR_X1]+x, o[ATTR_Y1]+y, o[ATTR_TEXT], o[ATTR_COLOR], o[ATTR_FONT]) + elseif o.type == TYPE_TEXTBOX then + screen.drawTextBox(scr, o[ATTR_X1]+x, o[ATTR_Y1]+y, o[ATTR_X2]+x, o[ATTR_Y2]+y, o[ATTR_TEXT], o[ATTR_COLOR]) + elseif o.type == TYPE_IMAGE then + screen.blit(scr, o[ATTR_X1]+x, o[ATTR_Y1]+y, o[ATTR_IMAGE], o[ATTR_X2], o[ATTR_Y2], o[ATTR_X3], o[ATTR_Y3]) + end + end +end + +function Canvas.setAttr(object, attrName, attrValue) + object[attrName] = attrValue +end + +function Canvas.getAttr(object, attrName) + return obect[attrName] +end + +function Canvas.setObjOnTop(canvas, object) + local i = searchObject(canvas, object) + if not i then return end + + table.remove(canvas, i) + canvas[#canvas+1] = object +end + +function Canvas.removeObj(canvas, object) + local i = searchObject(canvas, object) + if not i then return end + table.remove(canvas, i) +end diff --git a/uCompat/Debug.lua b/uCompat/Debug.lua index 883e2b6..ef24598 100644 --- a/uCompat/Debug.lua +++ b/uCompat/Debug.lua @@ -1,5 +1,5 @@ --[[ - Debug Images related µLua compatibility layer/lib for ctrµLua + Debug related µLua compatibility layer/lib for ctrµLua ]] -- Module diff --git a/uCompat/Sound.lua b/uCompat/Sound.lua new file mode 100644 index 0000000..70df84e --- /dev/null +++ b/uCompat/Sound.lua @@ -0,0 +1,58 @@ +--[[ + Sound +]] + +Sound = {} + +PLAY_ONCE = 0 +PLAY_LOOP = 1 + +-- Module + +function Sound.loadMod(id) + +end + +function Sound.unloadMod(id) + +end + +function Sound.startMod(id, playmode) + +end + +function Sound.pause() + +end + +function Sound.stop() + +end + +function Sound.setPosition(id, position) + +end + +function Sound.isActive() + return false +end + +function Sound.startJingle(id) + +end + +function Sound.setModVolume(volume) -- range: 0-1024 + +end + +function Sound.setJingleVolume(volume) -- range: 0-1024 + +end + +function Sound.setModTempo(tempo) -- range: 512-2048 + +end + +function Sound.setModPitch(pitch) + +end diff --git a/uCompat/init.lua b/uCompat/init.lua index 8c4b0c1..065927d 100644 --- a/uCompat/init.lua +++ b/uCompat/init.lua @@ -18,10 +18,12 @@ require("uCompat.Color") require("uCompat.Debug") require("uCompat.Font") require("uCompat.Image") +require("uCompat.Canvas") require("uCompat.Map") require("uCompat.ScrollMap") require("uCompat.Timer") require("uCompat.Sprite") +require("uCompat.Sound") require("uCompat.Controls") require("uCompat.Motion") require("uCompat.Rumble") @@ -29,3 +31,4 @@ require("uCompat.dsUser") require("uCompat.System") require("uCompat.ini") require("uCompat.Wifi") +reqiore("uCompat.Nifi") diff --git a/uCompat/screen.lua b/uCompat/screen.lua index 2cb0757..6a458b6 100644 --- a/uCompat/screen.lua +++ b/uCompat/screen.lua @@ -151,8 +151,13 @@ function screen.drawFillRect(scr, x0, y0, x1, y1, color) checkBuffer(scr)[#videoStack[scr]+1] = {"rectangle", {offsetX+x0, offsetY+y0, (x1-x0), (y1-y0), 0, RGB2RGBA(color)}} end -function screen.drawGradientRect(scr, x0, y0, x1, y1, color, color, color, color) - +function screen.drawGradientRect(scr, x0, y0, x1, y1, color1, color2, color3, color4) + local midX = math.ceil((x1-x0)/2) + local midY = math.ceil((y1-y0)/2) + checkBuffer(scr)[#videoStack[scr]+1] = {"rectangle", {offsetX+x0, offsetY+y0, midX, midY, 0, RGB2RGBA(color1)}} + checkBuffer(scr)[#videoStack[scr]+1] = {"rectangle", {offsetX+x0+midX, offsetY+y0, midX, midY, 0, RGB2RGBA(color2)}} + checkBuffer(scr)[#videoStack[scr]+1] = {"rectangle", {offsetX+x0, offsetY+y0+midY, midX, midY, 0, RGB2RGBA(color3)}} + checkBuffer(scr)[#videoStack[scr]+1] = {"rectangle", {offsetX+x0+midX, offsetY+y0+midY, midX, midY, 0, RGB2RGBA(color4)}} end function screen.drawTextBox(scr, x0, y0, x1, y1, text, color)