Alfredperson [Lexaloffle Blog Feed]https://www.lexaloffle.com/bbs/?uid=123855 lost. <p> <table><tr><td> <a href="/bbs/?pid=175833#p"> <img src="/bbs/thumbs/pico8_lost-0.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=175833#p"> lost</a><br><br> by <a href="/bbs/?uid=123855"> Alfredperson</a> <br><br><br> <a href="/bbs/?pid=175833#p"> [Click to Play]</a> </td></tr></table> <br /> you must find the void</p> https://www.lexaloffle.com/bbs/?tid=152184 https://www.lexaloffle.com/bbs/?tid=152184 Sun, 19 Oct 2025 05:13:08 UTC inaccessible characters? <p>hey so basically, on the P8SCII chart, the first row of characters (1-15) seems to be inaccessable when using <code>chr()</code> and there seems to be no keyboard shortcuts to type them out. anyone know anything about this?</p> https://www.lexaloffle.com/bbs/?tid=151994 https://www.lexaloffle.com/bbs/?tid=151994 Fri, 10 Oct 2025 01:04:56 UTC Pico 9.1.0 <p> <table><tr><td> <a href="/bbs/?pid=174548#p"> <img src="/bbs/thumbs/pico8_pico9-26.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=174548#p"> Pico 9.1.0</a><br><br> by <a href="/bbs/?uid=123855"> Alfredperson</a> <br><br><br> <a href="/bbs/?pid=174548#p"> [Click to Play]</a> </td></tr></table> </p> <p>This is a &quot;base&quot; cart with extra features (wow!)<br /> Would appreciate notification of any bugs</p> <h3>How to set up cart:</h3> <ol> <li>delete all demo values (functions included)</li> <li>delete the sections in the loop functions which say &quot;delete this&quot;</li> <li>if you are using cartdata, set <code>using_cartdata</code> to true, and set <code>save_menuitem</code> to the string that you want to appear in the menu when saving</li> <li>if you want to use more than 64 cartdata values, set <code>saverange_start</code> to the first memory address in the range subtracted by 0x8000, set <code>saveids</code> to how many more save groups of 64 cartdata values you need, and <code>using_cartdata_extra</code> to true</li> <li>set <code>game_id</code> to your cartridge id. this will be used in cartdata functions and reloading for calibrating and recalibrating save values</li> <li>set the <code>g_init</code>, <code>g_update</code> and <code>g_draw</code> functions to your own personal loops</li> </ol> <p><em>optionals</em><br /> there is a table called <code>genopmt</code>. this is an automatically prepared metatable<br /> there is also a collection of all visible characters through characters 1-15 in the first few lines of the main _init() tab</p> <h1>FUNCTIONS:</h1> <h2>-- DRAWING FUNCTIONS --</h2> <p><div><div><input type="button" value=" Show " onClick="if (this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display != '') { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = ''; this.innerText = ''; this.value = ' Hide '; } else { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = 'none'; this.innerText = ''; this.value = ' Show '; }"></div><div><div style="display: none;"></p> <h3>polygon(col,centx,centy,[...])</h3> <p><strong>[...]</strong><br /> . <em>given positions</em></p> <p>draws a polygon from the given positions e.g. <code>polygon(11,64,64,{-4,-4},{4,-4},{4,4},{-4,4})</code> (draws a square)</p> <h3>spinpol3d(col,centx,centy,progression,[...])</h3> <p>note: very uncontrollable. this function was found from a glitch</p> <p><strong>[...]</strong><br /> . <em>given positions</em></p> <p>draws a selection of lines which seem to resemble a 3d shape. it is currently unknown how to use this function in any purposeful way, though if anyone knows how to use it, an explanation as of how to use it would be greatly appreciated</p> <h3>tblpol(col,centx,centy,positions)</h3> <p>draws a polygon from a table of positions (<em>positions parameter</em>) e.g. <code>polygon(11,64,64,{{-4,-4},{4,-4},{4,4},{-4,4}})</code></p> <h3>regpol(points,centx,centy,rad,progression,col)</h3> <p>draws a regular polygon at the given coordinates, and turns based on how large the progression value is</p> <h3>rotspr([n],x,y,w,h,flipx,flipy)</h3> <p>draws a sprite rotated 90 degrees counter-clockwise</p> <h3>specspr(sprmapx,sprmapy,drawx,drawy,w,h,flipx,flipy)</h3> <p>draws a sprite with specific given coordinates on the sprite map</p> <h3>approxpoint(perimcol,connectcol,perimpointcol,centrad,perimpointrad,[...])</h3> <p><strong>[...]</strong><br /> . <em>given positions</em></p> <p><em>return-value</em><br /> . average point coordinates (in table value)</p> <p>draws a polygon with each point along the perimeter of the polygon connecting to the average position of all given positions e.g. <code>approxpoint(11,9,10,2,2,{60,60},{68,60},{68,68},{60,68})</code></p> <h3>dapproxpoint([...])</h3> <p><strong>[...]</strong><br /> . <em>given positions</em></p> <p><em>return-value</em><br /> . average point coordinates (in table value)</p> <p>runs <code>approxpoint</code> with automatically set colours and radiuses.</p> <h3>loadimage(p,w,h,x,y)</h3> <p>draws an image of all of the hexadecimal values of colors in <code>p</code>. add <code>&quot;-&quot;</code> to <code>p</code> to skip that pixel</p> <h3>squarepattern(p,x,y,c)</h3> <p>generates an 8x8 texture of the desired color from string <code>p</code></p> <h3>rndp()</h3> <p>runs fillp with a random pattern</p> <p></div></div></div></p> <h2>-- PRINTING FUNCTIONS --</h2> <p><div><div><input type="button" value=" Show " onClick="if (this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display != '') { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = ''; this.innerText = ''; this.value = ' Hide '; } else { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = 'none'; this.innerText = ''; this.value = ' Show '; }"></div><div><div style="display: none;"></p> <h3>cprint(txt,centx,y,c)</h3> <p>prints the text given at the centre of the &quot;centx&quot; parameter</p> <h3>fprint(txt,x,y,c,outc,mlayer)</h3> <p><strong>outc</strong><br /> . <em>color of layer</em></p> <p><strong>mlayer</strong><br /> . <em>thickness of layer</em></p> <p>prints the text given with a layer of pixels around the text</p> <h3>fcprint(txt,centx,y,c,outc,mlayer)</h3> <p>runs <code>fprint</code> at the centre of the &quot;centx&quot; parameter</p> <h3>rightprint(txt,x,y,c)</h3> <p>prints the given text with the end of the text being at the &quot;x&quot; parameter</p> <h3>rightfprint(txt,x,y,c,outc,mlayer)</h3> <p>runs <code>fprint</code> with the end of the text being at the &quot;x&quot; parameter</p> <h3>rep_print(print_type,txts,x,y,c,dist,outc,mlayer)</h3> <p>dist default=6</p> <p>prints the split text at the y coordinate added by the text index in which is being printed, multiplied by the distance</p> <p></div></div></div></p> <h2>-- MAP FUNCTIONS --</h2> <p><div><div><input type="button" value=" Show " onClick="if (this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display != '') { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = ''; this.innerText = ''; this.value = ' Hide '; } else { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = 'none'; this.innerText = ''; this.value = ' Show '; }"></div><div><div style="display: none;"></p> <h3>flag_at(x,y,f,modx,mody)</h3> <p><strong>modx</strong><br /> . <em>function in which to change the &quot;x&quot; parameter by (defaults to return)</em></p> <p><strong>mody</strong><br /> . <em>function in which to change the &quot;y&quot; parameter by (defaults to return)</em></p> <p>returns if the given map tile has the flag declared in the parameters</p> <h3>tile_at(x,y)</h3> <p>returns <code>mget(x,y)</code></p> <p></div></div></div></p> <h2>-- VALUE MODIFICATION FUNCTIONS (MATH, BOOLEANS, STRINGS) --</h2> <p><div><div><input type="button" value=" Show " onClick="if (this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display != '') { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = ''; this.innerText = ''; this.value = ' Hide '; } else { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = 'none'; this.innerText = ''; this.value = ' Show '; }"></div><div><div style="display: none;"></p> <h3>val_in_env(method,valpath,setvalue)</h3> <p>sets, gets, or runs a table function for the value indexed by _ENV with valpath split by <code>&quot;.&quot;</code> (depends on method parameter (also works for metatables)) the value indexed by _ENV with valpath split by <code>&quot;.&quot;</code></p> <h3>hexadecstr(val,len)</h3> <p>returns a string containing the given number in hexadecimal form e.g. <code>hexadecstr(31,3)</code> returns <code>&quot;01f&quot;</code></p> <h3>strtohexadec(str)</h3> <p>returns a hexadecimal number from the given string</p> <h3>strtobin(str,len)</h3> <p>returns a binary number from the given string</p> <h3>isub(str,i)</h3> <p>returns the letter of the letter index of the given string</p> <h3>opensplit(str,sep,convert_num)</h3> <p>returns the unpacked split table</p> <h3>remove(str,remstr)</h3> <p>returns the given string with no instance of the &quot;remstr&quot; parameter</p> <h3>replace(str,remstr,rplstr)</h3> <p>returns the given string with all instances of remstr replaced with rplstr</p> <h3>indchar(str)</h3> <p>returns a table of all characters in the given string in order</p> <h3>indword(str)</h3> <p>returns a table of all words in the given string in order</p> <h3>indline(str)</h3> <p>returns a table of all lines in the given string in order</p> <h3>wrap_text_intbl(str,width)</h3> <p>returns a table of all lines of the given string wrapped</p> <h3>wrap_text(str,width)</h3> <p>returns wrap_text_tbl concatenated by <code>&quot;\n&quot;</code></p> <h3>concat(tbl,sep)</h3> <p>returns a string of the entire table given concatenated by the separator parameter</p> <h3>numstr(num,len)</h3> <p>returns the number value in a string with the length given e.g. <code>numstr(39,3)</code> returns &quot;039&quot;</p> <h3>has_double(str)</h3> <p>returns the amount of 8-pixel-wide characters in the given string</p> <h3>centre(x,y,centx,centy)</h3> <p>returns a table of the positions added by the either &quot;cent&quot; parameter for that coordinate, or, if the parameter is nil, 64 e.g. <code>centre(-4,4,50)</code> returns {46,68}</p> <h3>avg([...])</h3> <p><strong>[...]</strong><br /> . number values in average calculation</p> <p>returns the average of the values given</p> <h3>tabavg(tbl)</h3> <p>returns the average of all of the values in the given table</p> <h3>tabiavg(tbl,index)</h3> <p>returns the average of the index of all of the tables in the given table e.g. <code>tabiavg({{1,2,4},{1,4},{1,5,7},{7,6,4,8}},2)</code> returns average of 2,4,5, and 6</p> <h3>r(val)</h3> <p>returns the value given. useful for conditional values with functions e.g. <code>(boolean and flr or r)(8.5)</code></p> <h3>fraction(num,denom)</h3> <p>returns the fraction of the numerator divided by the denominator. hardly necessary but just a shortcut i guess</p> <h3>factorial(val)</h3> <p>returns factorial of the value given</p> <h3>round(val,base)</h3> <p><strong><em>base</em></strong><br /> . number to round to. defaults to 1</p> <p>returns the rounded value to the base</p> <h3>recip(val)</h3> <p>returns the reciprocal of the given value. again, hardly necessary, but this is used in all variations of sec(val)</p> <h3>comball(type,[...])</h3> <p><strong><em>[...]</em></strong><br /> . given tables of values in operation</p> <p>returns a table of all tables given changed by the desired operation. operation is decided from the following strings:<br /> <code>&quot;add&quot;</code>:addition,<code>&quot;sub&quot;</code>:subtraction,<code>&quot;mul&quot;</code>:multiplication,<code>&quot;div&quot;</code>:division<code>&quot;mod&quot;</code>:modulation,<br /> <code>&quot;pow&quot;</code>:exponentiation,<code>&quot;concat&quot;</code>:concatenation</p> <h3>tan(val)</h3> <p>returns tangent of given value</p> <h3>cot(val)</h3> <p>returns cotangent of given value</p> <h3>sec(val)</h3> <p>returns secant of given value</p> <h3>cosec(val)</h3> <p>returns cosecant of given value</p> <h3>arcsin(val)</h3> <p>returns arcsine of given value</p> <h3>arccos(val)</h3> <p>returns arccosine of given value</p> <h3>arcsec(val)</h3> <p>returns arcsecant of given value</p> <h3>arccsc(val)</h3> <p>returns arccosecant of given value</p> <h3>arccot(val)</h3> <p>returns arccotangent of given value</p> <h3>bool(val,[convert_num])</h3> <p><strong>[convert_num]</strong><br /> . <em>if number in string matters. defaults to false</em></p> <p>returns &quot;boolean value&quot; of given value</p> <h3>bflr(val,base)</h3> <p>base defaults to 1. returns lowest multiple of base from given value</p> <h3>bceil(val,base)</h3> <p>base defaults to 1. returns highest multiple of base from given value</p> <h3>exp10(val)</h3> <p>returns 10^val divided by 10</p> <p></div></div></div></p> <h2>-- TABLE FUNCTIONS --</h2> <p><div><div><input type="button" value=" Show " onClick="if (this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display != '') { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = ''; this.innerText = ''; this.value = ' Hide '; } else { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = 'none'; this.innerText = ''; this.value = ' Show '; }"></div><div><div style="display: none;"></p> <h3>tblfind(tbl,iname)</h3> <p>returns the number index of the &quot;iname&quot; parameter in the given table</p> <h3>addmetamethod(tblpath,metatable,metamethod)</h3> <p>adds a new metamethod to the metatable of _ENV indexed by <code>tblpath</code> split by <code>&quot;.&quot;</code> if <code>metatable[metamethod]</code> isn't equal to <code>nil</code>.</p> <h3>delmetamethod(tblpath,metatable,metamethod)</h3> <p>deletes a metamethod from the metatable of _ENV indexed by <code>tblpath</code> split by <code>&quot;.&quot;</code> if <code>metatable[metamethod]</code> isn't equal to <code>nil</code>.</p> <p></div></div></div></p> <h2>-- CONDITIONAL FUNCTIONS --</h2> <p><div><div><input type="button" value=" Show " onClick="if (this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display != '') { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = ''; this.innerText = ''; this.value = ' Hide '; } else { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = 'none'; this.innerText = ''; this.value = ' Show '; }"></div><div><div style="display: none;"></p> <h3>switch(val,default,[...])</h3> <p><strong>[...]</strong><br /> . <em>tables for each case</em></p> <p>if the given value is equal to the case in the table currently being checked, it will run the function in that table. if the given value is equal to none of the cases in any of the given tables, it will run the default function</p> <h3>bswitch(val,default,[...])</h3> <p><strong>[...]</strong><br /> . <em>tables for each case</em></p> <p>runs switch, but automatically breaks when the function in the tables is decided</p> <p></div></div></div></p> <h2>-- SOUND FUNCTIONS --</h2> <p><div><div><input type="button" value=" Show " onClick="if (this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display != '') { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = ''; this.innerText = ''; this.value = ' Hide '; } else { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = 'none'; this.innerText = ''; this.value = ' Show '; }"></div><div><div style="display: none;"></p> <h3>playnote(note)</h3> <p>plays the &quot;note&quot; parameter. does not affect actual sfx or music tracks in any way.</p> <p></div></div></div></p> <h2>-- TYPE FUNCTIONS --</h2> <p><div><div><input type="button" value=" Show " onClick="if (this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display != '') { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = ''; this.innerText = ''; this.value = ' Hide '; } else { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = 'none'; this.innerText = ''; this.value = ' Show '; }"></div><div><div style="display: none;"></p> <h3>fortype(tbl,detecttype,func)</h3> <p>runs the given function for all values of the given type in the given table.</p> <h3>changetype(valroot,type)</h3> <p>changes the type of the value indexed by the value name at the end of the string of the value directory (location in all tables) in _ENV, with the directory string being split by <code>&quot;.&quot;</code> (also works with number indexing)</p> <p></div></div></div></p> <h2>-- MISC FUNCTIONS --</h2> <p><div><div><input type="button" value=" Show " onClick="if (this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display != '') { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = ''; this.innerText = ''; this.value = ' Hide '; } else { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = 'none'; this.innerText = ''; this.value = ' Show '; }"></div><div><div style="display: none;"></p> <h3>inmenu()</h3> <p>returns true if is in menu</p> <p></div></div></div></p> <h2>-- PROTOTYPES --</h2> <h3>these are functions which do not work or did not and are currently being worked on. once function is finished, final function name and type of function will be underneath the main documentation for the function.</h3> <p><div><div><input type="button" value=" Show " onClick="if (this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display != '') { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = ''; this.innerText = ''; this.value = ' Hide '; } else { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = 'none'; this.innerText = ''; this.value = ' Show '; }"></div><div><div style="display: none;"></p> <h3>squashstr(str,width)</h3> <p>returns a multi-line string value with the max amount of length for each line is decided by the width parameter.</p> <p>COMPLETE FUNCTION: wrap_text(str,width) in value modification functions</p> <p></div></div></div></p> <p>Any more features I should add?</p> https://www.lexaloffle.com/bbs/?tid=151728 https://www.lexaloffle.com/bbs/?tid=151728 Thu, 25 Sep 2025 13:25:38 UTC almost unlimited cartdata <p>okay so basically this trick almost gives you infinite savedata</p> <p>first, choose a memory address above 0x7fff to represent a progress counter, a memory address above 0x7fff to represent if the game has already set the progress counter to 0, a memory address above 0x7fff to represent the progress before updating, a memory address to declare if the game has started, a variable declaring if the game is calibrating the save values, and a variable inside the game declaring how many extra groups of 64 savedata values are required.</p> <p>second, in the _init function, set the initial progress counter to the actual progress counter. make an if statement which checks if the progress counter is equal or over the limit. inside that statement, run cartdata with an id concatenated with the progress, set a group of memory addresses to the cartdata values, change the progress counter by one by using the initial progress counter, and then finally load the cartridge again.</p> <p>third, in the _update function, add an if statement which checks if the game has started. move all of the previous code inside of the _update function into that statement.</p> <p>your code by now should look something like this:</p> <div> <div class=scrollable_with_touch style="width:100%; max-width:800px; overflow:auto; margin-bottom:12px"> <table style="width:100%" cellspacing=0 cellpadding=0> <tr><td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> <td background=/gfx/code_bg0.png> <div style="font-family : courier; color: #000000; display:absolute; padding-left:10px; padding-top:4px; padding-bottom:4px; "> <pre>function calibrate_save(index) for i=0,63 do poke(0x8000+index*0x40+i+range_start,dget(i)) end end --0xffff=calibration progress --0xfffe=pre-updated calibration progress --0xfffd=if has set initial calibration --0xfffc=if has started game function _init() is_calibrating=false saveids=4 range_start=0x0000 if peek(0xfffd)!=1 then poke(0xffff,0) poke(0xfffd,1) end poke(0xfffe,peek(0xffff)) if peek(0xffff)&lt;saveids then is_calibrating=true cartdata(&quot;mygameid_decomp&quot; .. peek(0xffff)) calibrate_save(peek(0xffff)) poke(0xffff,peek(0xfffe)) load(&quot;mygame.p8&quot; or &quot;#mygame&quot;) end end function _update() if not is_calibrating then -- ... end end</pre></div></td> <td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> </tr></table></div></div> <p>all this does is use a different cartdata id for each initial runtime moment, then restarts if the values have been set, and if they have to be set.</p> <p>to access the save data values, get the designated memory address within the group of memory addresses.</p> <p>to save from within the game, you need to make a menuitem, which basically does the same exact thing when it calibrates the values at the start, except instead of the addresses being set, the save values are set by the addresses e.g:</p> <div> <div class=scrollable_with_touch style="width:100%; max-width:800px; overflow:auto; margin-bottom:12px"> <table style="width:100%" cellspacing=0 cellpadding=0> <tr><td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> <td background=/gfx/code_bg0.png> <div style="font-family : courier; color: #000000; display:absolute; padding-left:10px; padding-top:4px; padding-bottom:4px; "> <pre>--0xfffb=if is saving function _init() is_calibrating=false saveids=4 range_start=0x0000 if peek(0xfffd)!=1 then poke(0xffff,0) poke(0xfffb,0) poke(0xfffd,1) end poke(0xfffe,peek(0xffff)) if peek(0xffff)&gt;=saveids then poke(0xfffb,0) end if peek(0xfffb)==1 then cartdata(&quot;mygameid_decomp&quot; .. peek(0xffff)) save(peek(0xffff)) load(&quot;mygame.p8&quot; or &quot;#mygame&quot;) end if peek(0xffff)&lt;saveids and peek(0xfffb)!=1 then is_calibrating=true cartdata(&quot;mygameid_decomp&quot; .. peek(0xffff)) calibrate_save(peek(0xffff)) poke(0xffff,peek(0xfffe)) load(&quot;mygame.p8&quot; or &quot;#mygame&quot;) end end function save(index) for i=0,63 do dset(i,peek(0x8000+i+range_start+index*0x40)) end end function _update() if not is_calibrating then menuitem(1,&quot;save&quot;,function() poke(0xffff,0) poke(0xfffb,1) load(&quot;mygame.p8&quot; or &quot;#mygame&quot;) end) --... end end</pre></div></td> <td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> </tr></table></div></div> <p>just another minor exploit :)</p> https://www.lexaloffle.com/bbs/?tid=151625 https://www.lexaloffle.com/bbs/?tid=151625 Sat, 20 Sep 2025 08:37:18 UTC playing music notes from &quot;print()&quot; <p>this method exists which almost no information is spread about on the internet</p> <p>all you have to do is print &quot;\A&quot; concatenated with the note, and then the octave e.g:<code>print(&quot;\AD#3&quot;)</code>. this plays the D# note on the third octave you can also print a message as it plays if you concatenate the string with a space, and then the message e.g:<code>print(&quot;\AD#2 Hello World!&quot;)</code>. one thing i find really cool about this feature is that you can harmonize notes by concatenating multiple notes by a space e.g:<code>print(&quot;\AD#3 \AD2 \AD1 \AC#1 \AD0&quot;)</code>.</p> https://www.lexaloffle.com/bbs/?tid=151624 https://www.lexaloffle.com/bbs/?tid=151624 Sat, 20 Sep 2025 06:01:17 UTC _update60 glitch? <p>sorry found the problem<br /> no glitch</p> https://www.lexaloffle.com/bbs/?tid=151546 https://www.lexaloffle.com/bbs/?tid=151546 Sun, 14 Sep 2025 10:49:12 UTC &quot;supposedly new&quot; cc techs <p>hey so i've come to the realisation that as i continue to work on new celeste mods, i am most likely going to come across alot more techs which i am not familiar with, so i guess this post can be like an area for creating cc techs and verifying which cc techs already existed.</p> <h2>-- dash trajectory manipulation --</h2> <p>the logic of this tech is pretty strange so prepare yourselves<br /> anyway basically what i mean by &quot;dash trajectory manipulation&quot;, is changing the direction of your dash midway through the dash itself<br /> i don't really know how it works<br /> i was just kinda messing around and then i got this<br /> | | | | | | | | | | | | | | | | | | | | | | | | | |<br /> V V V V V V V V V V V V V V V V V V V V V V V V V V</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/123855/celeste_0.gif" alt="" /> <p>i think i was turning around as soon as i got to the edge of the screen, then performing the spike walk.<br /> for some reason it only works on the edges of the screen tho?<br /> anyone know anything about this?</p> <h2>-- vertical movement manipulation --</h2> <p>ok so this one is crazu<br /> <table><tr><td> <a href="/bbs/?pid=172921#p"> <img src="/bbs/thumbs/pico8_mamumibiza-0.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=172921#p"> mamumibiza</a><br><br> by <a href="/bbs/?uid=123855"> Alfredperson</a> <br><br><br> <a href="/bbs/?pid=172921#p"> [Click to Play]</a> </td></tr></table> <br /> so basically in order to pass this level, you have to dash horizontally, jump on the next frame which you can, and then dash horizontally on the next frame.</p> <h3>what's happening?</h3> <p>so basically when you dash horizontally the first time and jump, because you leave the dash early, the game assumes that you haven't left the dash yet, and slows down the movement on the y axis, offsetting you on the y axis by 2 pixels on the next frame, which allows you to dash on the one pixel that's safe.</p> <p>hopefully this gives you some insight as to how to beat this thing:<br /> <table><tr><td> <a href="/bbs/?pid=172921#p"> <img src="/bbs/thumbs/pico8_gracelessnesses-1.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=172921#p"> gracelessnesses</a><br><br> by <a href="/bbs/?uid=123855"> Alfredperson</a> <br><br><br> <a href="/bbs/?pid=172921#p"> [Click to Play]</a> </td></tr></table> </p> https://www.lexaloffle.com/bbs/?tid=151220 https://www.lexaloffle.com/bbs/?tid=151220 Thu, 28 Aug 2025 12:42:55 UTC Dark Fault <p> <table><tr><td> <a href="/bbs/?pid=172868#p"> <img src="/bbs/thumbs/pico8_faultdark-0.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=172868#p"> Dark Fault V1.0</a><br><br> by <a href="/bbs/?uid=123855"> Alfredperson</a> <br><br><br> <a href="/bbs/?pid=172868#p"> [Click to Play]</a> </td></tr></table> <br /> Hello<br /> Yet another celeste mod<br /> I'm running out of ideas<br /> Any suggestions for new mods?</p> https://www.lexaloffle.com/bbs/?tid=151198 https://www.lexaloffle.com/bbs/?tid=151198 Wed, 27 Aug 2025 11:26:13 UTC Celeste saving template <p> <table><tr><td> <a href="/bbs/?pid=172841#p"> <img src="/bbs/thumbs/pico8_celestesavetemplate-0.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=172841#p"> Celeste saving template</a><br><br> by <a href="/bbs/?uid=123855"> Alfredperson</a> <br><br><br> <a href="/bbs/?pid=172841#p"> [Click to Play]</a> </td></tr></table> <br /> This is just a template for people who are trying to make a celeste mod with cartdata<br /> yes</p> https://www.lexaloffle.com/bbs/?tid=151188 https://www.lexaloffle.com/bbs/?tid=151188 Tue, 26 Aug 2025 14:39:29 UTC better cprint function <p>hey so i've seen a lot of carts which have a function for printing a string of text in the centre of the area on the x axis which they have depicted, and it often ends up looking something like this:</p> <div> <div class=scrollable_with_touch style="width:100%; max-width:800px; overflow:auto; margin-bottom:12px"> <table style="width:100%" cellspacing=0 cellpadding=0> <tr><td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> <td background=/gfx/code_bg0.png> <div style="font-family : courier; color: #000000; display:absolute; padding-left:10px; padding-top:4px; padding-bottom:4px; "> <pre>-- actual function function cprint(txt,centre,y,c) print(txt,centre-#txt*2,y,c) end -- example function _init() cls() end function _draw() cprint(&quot;Centre:64&quot;,64,0,7) for x=0,127,8 do for y=16,127,8 do line(x,0,x,127,8) line(0,y,127,0,8) end end cprint(&quot;Hello World!&quot;,64,62,7) end</pre></div></td> <td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> </tr></table></div></div> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/123855/untitled_1_0.png" alt="" /> <p>but often one thing that they don't account for is the extra space in which the characters with an id over 127 cover. for example,</p> <div> <div class=scrollable_with_touch style="width:100%; max-width:800px; overflow:auto; margin-bottom:12px"> <table style="width:100%" cellspacing=0 cellpadding=0> <tr><td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> <td background=/gfx/code_bg0.png> <div style="font-family : courier; color: #000000; display:absolute; padding-left:10px; padding-top:4px; padding-bottom:4px; "> <pre>-- chr(151) cprint(&quot;❎❎❎❎❎❎❎&quot;,64,62,7) cprint(&quot;❎❎❎❎❎❎&quot;,64,68,7) cprint(&quot;❎❎❎❎&quot;,64,74,7)</pre></div></td> <td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> </tr></table></div></div> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/123855/untitled_1_2.png" alt="" /> <p>in order to fix this, i first built a function which returns how many characters in the string are doubled in length,</p> <div> <div class=scrollable_with_touch style="width:100%; max-width:800px; overflow:auto; margin-bottom:12px"> <table style="width:100%" cellspacing=0 cellpadding=0> <tr><td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> <td background=/gfx/code_bg0.png> <div style="font-family : courier; color: #000000; display:absolute; padding-left:10px; padding-top:4px; padding-bottom:4px; "> <pre>function has_double(str) local letters=0 for i=1,#str do local char_code=ord(sub(str,i,i)) if char_code&gt;=128 and char_code&lt;=255 then letters+=1 end end return letters end</pre></div></td> <td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> </tr></table></div></div> <p>then i implemented it into the &quot;cprint&quot; function as so</p> <div> <div class=scrollable_with_touch style="width:100%; max-width:800px; overflow:auto; margin-bottom:12px"> <table style="width:100%" cellspacing=0 cellpadding=0> <tr><td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> <td background=/gfx/code_bg0.png> <div style="font-family : courier; color: #000000; display:absolute; padding-left:10px; padding-top:4px; padding-bottom:4px; "> <pre>function cprint(txt,centre,y,c) for i=1,#txt do local added_letters=has_double(txt) print(text,centre-(#txt+added_letters)*2,y,c) end end</pre></div></td> <td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> </tr></table></div></div> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/123855/cprint_0.png" alt="" /> <p>feel free to copy</p> https://www.lexaloffle.com/bbs/?tid=151154 https://www.lexaloffle.com/bbs/?tid=151154 Sun, 24 Aug 2025 12:18:29 UTC madeline did something <p> <table><tr><td> <a href="/bbs/?pid=172623#p"> <img src="/bbs/thumbs/pico8_madelineisdying-0.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=172623#p"> madeline did something</a><br><br> by <a href="/bbs/?uid=123855"> Alfredperson</a> <br><br><br> <a href="/bbs/?pid=172623#p"> [Click to Play]</a> </td></tr></table> </p> <h1>!!!!!!SEIZURE WARNING!!!!!!</h1> https://www.lexaloffle.com/bbs/?tid=151125 https://www.lexaloffle.com/bbs/?tid=151125 Fri, 22 Aug 2025 16:19:31 UTC new cc tech? <p>hey so i think i just found a new tech</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/123855/foraker_0.gif" alt="" /> <p>basically, from what i can see, the player falls down, and with enough precision and velocity in which the player falls, there is a one-frame window where you can jump off of the wall with the spikes<br /> this just stood out to me because the hitbox of a right-facing spike is larger than a left-facing spike's hitbox. This allows the player to jump off of a left-facing spike's wall while stationary, but not with a right-facing spike's.<br /> maybe this was already a tech?</p> https://www.lexaloffle.com/bbs/?tid=151016 https://www.lexaloffle.com/bbs/?tid=151016 Sun, 17 Aug 2025 04:28:30 UTC roadtrip <p> <table><tr><td> <a href="/bbs/?pid=171902#p"> <img src="/bbs/thumbs/pico8_roadtrip-0.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=171902#p"> roadtrip</a><br><br> by <a href="/bbs/?uid=123855"> Alfredperson</a> <br><br><br> <a href="/bbs/?pid=171902#p"> [Click to Play]</a> </td></tr></table> <br /> road</p> https://www.lexaloffle.com/bbs/?tid=150864 https://www.lexaloffle.com/bbs/?tid=150864 Sun, 10 Aug 2025 14:20:14 UTC kaizotraining <p> <table><tr><td> <a href="/bbs/?pid=171556#p"> <img src="/bbs/thumbs/pico8_kaizotraining-0.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=171556#p"> kaizotraining</a><br><br> by <a href="/bbs/?uid=123855"> Alfredperson</a> <br><br><br> <a href="/bbs/?pid=171556#p"> [Click to Play]</a> </td></tr></table> </p> <h1>kaizo training</h1> <p>if you look to practice kaizo cc<br /> go here<br /> i guess</p> https://www.lexaloffle.com/bbs/?tid=150748 https://www.lexaloffle.com/bbs/?tid=150748 Mon, 04 Aug 2025 21:56:24 UTC crazy game coming soon <h1>CRAZY GAME COMING SOON</h1> <p>hello<br /> in about a year<br /> i will publish a crazy big game<br /> SPACEBOUND(a starbound demake)<br /> it will be published here<br /> could take longer than a year tho</p> https://www.lexaloffle.com/bbs/?tid=150502 https://www.lexaloffle.com/bbs/?tid=150502 Thu, 24 Jul 2025 00:24:23 UTC where is celeste classic discord <h1>help can't find celeste classic discord</h1> <p>hey so i've been hearing about the celeste classic discord server and i've tried searching it up everywhere, but it's still not coming up. Does anyone have the link or know how to get to the server?</p> https://www.lexaloffle.com/bbs/?tid=150134 https://www.lexaloffle.com/bbs/?tid=150134 Tue, 08 Jul 2025 06:31:57 UTC Kaileste V1.1.5 <p> <table><tr><td> <a href="/bbs/?pid=168462#p"> <img src="/bbs/thumbs/pico8_realkaileste-18.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=168462#p"> Kaileste 1.1.5</a><br><br> by <a href="/bbs/?uid=123855"> Alfredperson</a> <br><br><br> <a href="/bbs/?pid=168462#p"> [Click to Play]</a> </td></tr></table> <br /> Kaileste</p> <p>Only those who have ventured so far as to see what truely awaits, will never return the same as whence they were stable<br /> One holds the secrets<br /> Alternating from white to black<br /> 19 emblems of Havoc and chaos<br /> Find IT<br /> And you shall see<br /> 01000001 01001111 01001100 00100000 01001001 01010011 01001100 01001100 01001011 01001100 01011001 01001010 01010011 01010110 01000100 01010101<br /> 117 116 103 105 40 131 117 125 40 110 101 126 105 40 123 105 105 116 40 111 124<br /> 131 117 125 40 103 101 116 116 117 124 40 122 125 116<br /> 131 117 125 40 103 101 116 116 117 124 40 110 111 104 105<br /> 106 111 107 110 124 40 101 116 104 40 110 117 120 105 40 124 117 40 123 125 122 126 111 126 105<br /> The key lays at the top of the forbidden peak</p> <h1>UPDATES</h1> <h3>-- V1.1.0 --</h3> <p>Added savegame mechanics</p> <h3>-- V1.1.2 --</h3> <p>Fixed all known specific-level bugs. Would appreciate notification of any others tho.</p> <h3>-- V1.1.4 --</h3> <p>Fixed loading levels from save above 800m</p> <h3>-- V1.1.5 --</h3> <p>Fixed saved minutes display in &quot;draw_time()&quot;</p> https://www.lexaloffle.com/bbs/?tid=149502 https://www.lexaloffle.com/bbs/?tid=149502 Fri, 13 Jun 2025 04:07:22 UTC annoyingleste <p> <table><tr><td> <a href="/bbs/?pid=168236#p"> <img src="/bbs/thumbs/pico8_painlested-1.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=168236#p"> annoyingleste</a><br><br> by <a href="/bbs/?uid=123855"> Alfredperson</a> <br><br><br> <a href="/bbs/?pid=168236#p"> [Click to Play]</a> </td></tr></table> <br /> failure of camera</p> https://www.lexaloffle.com/bbs/?tid=149419 https://www.lexaloffle.com/bbs/?tid=149419 Sat, 07 Jun 2025 13:36:34 UTC Kaileste Demo graveyard <p>:(<br /> no game here<br /> but...<br /> <a href="https://www.lexaloffle.com/bbs/?pid=168462#p">&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;better&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot;&quot; kaileste</a><br /> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^</p> https://www.lexaloffle.com/bbs/?tid=149147 https://www.lexaloffle.com/bbs/?tid=149147 Fri, 23 May 2025 13:38:36 UTC