Lexaloffle Games Blog News from Lexaloffle Land http://www.lexaloffle.com/ Carts in Carts <img style="" border=0 src="https://www.lexaloffle.com/bbs/files/1/map_api.gif" width=400 height=300 alt="" /> <p>A heads up for Voxatron users -- the first version of the Lua api will be out next week in 0.3.5!</p> <p>Pictured above is the result of drawing voxels directly into a room's map. The 0.3.5 api also provides access to actor attributes and state, spawning, camera control, and direct access to the display. The entire PICO-8 api is in there with some 3D counterparts (line3d, box, sphere), and it's possible to import a pico-8 cart into the resource tree, place it in a room, and run the cart on a single slice of the display. The .p8 cart shows up in the resource navigator, and is placeable in the room like this:</p> <img style="" border=0 src="https://www.lexaloffle.com/bbs/files/1/p8cart_in_voxcart.png" width=260 height=140 alt="" /> <p>The code can also be edited to make slight adjustments for the 3d display:</p> <img style="" border=0 src="https://www.lexaloffle.com/bbs/files/1/jelpi3d.png" width=640 height=400 alt="" /> <p>In other news, I've updated the website with mobile-friendly cart listings and touch controls for the carts. It's still a work in progress -- the sound in particular is very choppy or missing altogether. But apart from that it is quite useable. If you have a modern phone or touch device please try it out!</p> http://www.lexaloffle.com/bbs/?tid=28325 http://www.lexaloffle.com/bbs/?tid=28325 Tue, 27 Dec 2016 14:46:41 UTC New Website and Player Layout <p>Hey All</p> <p>I'm in the process of simplifying the website a little. In particular, I wanted to improve the experience of playing cartridges in threads by removing clutter. They now look more like a page dedicated to the cart:</p> <ul> <li>The player starts open</li> <li>There's a big obvious play button and large thumbnail</li> <li>There's no banner at the top of each page</li> </ul> <p><div style="display:table; background-color:#222;"><div id=p20430 class="playarea_0"> <div id=pc_container style="display:table; width:100%; height:0px"><center> <script type="text/javascript"> var Module; // current Module var module_canvas; var buttons_to_show = null; var playable_area_count = 0; var playarea_state = 0; var codo_command = 0; var codo_command_p = 0; var codo_volume = 256; var codo_running = false; var pa_pid = new Array(256); function loadJS(file) { // create new script element var jsElm = document.createElement("script"); jsElm.type = "application/javascript"; jsElm.src = file; // insert the element to the body element in order to load the script document.body.appendChild(jsElm); } function on_module_load() { //buttons_to_show.style.display = ""; } function onKeyDown_blocker(event) { event = event || window.event; // only while cartridge is active // to do: check for element focus instead //if (playarea_state == 1 && codo_running) { var o = document.activeElement; if (!o || o == document.body || o.tagName == "module_canvas") { //if ([32, 37, 38, 39, 40, 13].indexOf(event.keyCode) > -1) { if (event.preventDefault) event.preventDefault(); } } } } function set_sound_button() { var sb = document.getElementById("sound_button"); if (codo_volume == 0) { sb.innerHTML = "<img src=/gfx/p8b_sound0.png width=24>"; } else { sb.innerHTML = "<img src=/gfx/p8b_sound1.png width=24>"; } } function set_pause_button() { var sb = document.getElementById("pause_button"); if (codo_running) { sb.innerHTML = "<img src=/gfx/p8b_pause.png width=24>"; } else { sb.innerHTML = "<img src=/gfx/p8b_resume.png width=24>"; } } var pico8_buttons = [0, 0, 0, 0, 0, 0, 0, 0]; function press_pico8_button(pl, which, state) { if (state == 0) pico8_buttons[pl] &= ~(1 << which); else pico8_buttons[pl] |= (1 << which); } function get_cart_info(pid, field) { var num = pdat.length; for (i = 0; i < num; i++) { if (pdat[i][0] == pid) { if (field == "title") return pdat[i][2]; if (field == "author") return pdat[i][8]; if (field == "jsfile") { if (pdat[i][15] == 6) return "vox_034b.js"; if (pdat[i][15] == 7) return "pico8_0110c.js"; } if (field == "cpost_url") { var cpid = pdat[i][17]; var num = Math.floor(cpid / 10000); var url = `/bbs/cposts/`+num+`/`; if (pdat[i][15] == 6) return url + `cpost` + cpid + `.png`; if (pdat[i][15] == 7) return url + cpid + `.p8.png`; } } } return ""; } function toggle_playarea(el_id, pid, jsfile, cpost_url) { if (!jsfile) { jsfile = get_cart_info(pid, "jsfile"); cpost_url = get_cart_info(pid, "cpost_url"); } //window.alert(cpost_url); if (el_id == 'playarea_popup') { document.getElementById("playarea_popup").style.display = ""; document.getElementById("playarea_popup_container").style.display = ""; document.getElementById("playarea_popup_back").style.display = ""; // hide everything else on page //document.getElementById("pagediv").style.display = "none"; // set title, author if (document.getElementById("playarea_popup_title")) document.getElementById("playarea_popup_title").innerHTML = get_cart_info(pid, "title"); if (document.getElementById("playarea_popup_author")) document.getElementById("playarea_popup_author").innerHTML = get_cart_info(pid, "author") } if (Module) { // load and run new cart from running session codo_command = 6; codo_command_p = pid; if (!codo_running) Module.resumeMainLoop(); codo_running = true; } else { // first cart; create canvas and load pico-8 player module_canvas = document.createElement("canvas"); Module = { arguments: [cpost_url], canvas: module_canvas }; var e = document.createElement("script"); e.type = "application/javascript"; e.src = jsfile; document.body.appendChild(e); // load and run // install key blocker document.addEventListener('keydown', onKeyDown_blocker, false); // make canvas fullscreenable fullscreenable_canvas(module_canvas); } // add canvas to playarea div document.getElementById(el_id).appendChild(module_canvas); // to do: works for second-run cart. why? //module_canvas.style.width = "256px"; //module_canvas.style.height = "368px"; for (i = 0; i < playable_area_count; i++) if (el_id == 'playarea_popup') { // already handled } else if (pa_pid[i] == pid) { el = document.getElementById("infodiv"+pa_pid[i].toString()); if (el) el.style.display = "none"; buttons_to_show = document.getElementById("buttonsdiv"+pa_pid[i].toString()); //!! document.getElementById("buttonsdiv"+pa_pid[i].toString()).style.display = "table"; } else { el = document.getElementById("infodiv"+pa_pid[i].toString()); if (el) el.style.display = ""; document.getElementById("buttonsdiv"+pa_pid[i].toString()).style.display = "none"; } if (codo_command == 6) // not loading; just display now on_module_load(); codo_running = true; } </script> <STYLE TYPE="text/css"> <!-- .playarea_0{ width:360px; height:256px; display:table; } @media screen and (min-width: 800px) { .playarea_0{ width:640px; height:512px; } } --> </STYLE> <STYLE TYPE="text/css"> <!-- canvas{ image-rendering: optimizeSpeed; image-rendering: -moz-crisp-edges; image-rendering: -webkit-optimize-contrast; image-rendering: optimize-contrast; image-rendering: pixelated; -ms-interpolation-mode: nearest-neighbor; border: 0px; width:512px; height:512px; } @media screen and (max-width: 800px) { canvas{ width:256px; height:256px; } } --> </STYLE> <div id=playarea_20430 style="background-color:#000"> </div> <script> pa_pid[0] = 20430; playable_area_count = 1; </script> <script> var mb = 0; // deleteme function abs(x) { return x < 0 ? -x : x; } // step 0 down 1 drag 2 up function pico8_buttons_event(e, step) { pico8_buttons[0] = 0; // show buttons as soon as touched document.getElementById("touch_controls").style.display=""; var num = 0; if (e.touches) num = e.touches.length; for (var i = 0; i < num; i++) { var touch = null; touch = e.touches[i]; //tindex = touch.identifier; var x = touch.clientX; var y = touch.clientY; //if (codo_running && y > 100) // e.preventDefault(); var w = document.body.clientWidth; var h = document.body.clientHeight; b = 0; // determine mask to clear (mask) and mask to set (b) for button state changes. if (x < w/2) { mask = 0xf; // dpad var cx = 70; var cy = h-70; deadzone = 15; var dx = x - cx; var dy = y - cy; if (abs(dx) > abs(dy) * 0.8) // horizontal { if (dx < -deadzone) b |= 0x1; if (dx > deadzone) b |= 0x2; } if (abs(dy) > abs(dx) * 0.8) // vertical { if (dy < -deadzone) b |= 0x4; if (dy > deadzone) b |= 0x8; } } else { // button; diagonal split from bottom right corner mask = 0x30; // close to menu? dx = x - (w/2); dy = y - (h-20); if (dx*dx + dy*dy < 50*50) { // menu button b |= 0x40; } else { // one or both of [X], [O] if ( (h-y) > (w-x) * 0.8) b |= 0x10; if ( (w-x) > (h-y) * 0.8) b |= 0x20; } } pico8_buttons[0] |= b; } } /* addEventListener("mousedown", function(event){ pico8_buttons_event(event, 0);}, false); addEventListener("mousemove", function(event){ pico8_buttons_event(event, 1);}, false); addEventListener("mouseup", function(event){ pico8_buttons_event(event, 2);}, false); */ var touch_detected = false; addEventListener("touchstart", function(event){ touch_detected = true; pico8_buttons_event(event, 0);}, false); addEventListener("touchmove", function(event){ pico8_buttons_event(event, 1);}, false); addEventListener("touchend", function(event){ pico8_buttons_event(event, 2);}, false); </script> </center> <div id=buttonsdiv20430 style="display:none; height:24px; margin-top:-100px; border:0px; padding:0px; width:100%; "> <div style="float:right; width:40px; height;80px;"> <div class="bright_hover" style="margin-bottom:4px;"> <a onclick="codo_running = !codo_running; if (codo_running) Module.resumeMainLoop(); else Module.pauseMainLoop(); set_pause_button();"> <div id=pause_button> <img src="/gfx/p8b_pause.png" width=24 height=24> </div> </a> </div> <a onclick= "codo_volume = (codo_volume == 0) ? 256 : 0; codo_command = 2; codo_command_p = codo_volume; set_sound_button();"> <div id="sound_button" class="bright_hover" style="margin-bottom:4px;"> <img src="/gfx/p8b_sound1.png" width=24 height=24> </div></a> <div class="bright_hover" style="margin-bottom:4px;"> <a onclick="Module.requestFullScreen(true, false);"> <img src="/gfx/p8b_full.png" width=24 height=24></a> </div> </div> </div> </div> <div id=infodiv20430 style=" position:relative; width:100%; height:100%; background:url('thumbs/pico20430.png') no-repeat center; background-size:contain; color:#fff; font-size:16; text-shadow: -1px 1px 2px rgba(16, 0, 48, 0.7); "> <div style=" background: rgba(0,0,0,0.6); width:100%; height:100%; "> <div style="padding-top:10px;padding-left:10px;font-size:20px"> <a href="?pid=20430#p20430">PICO-8 Jam #2</a> </div> <div style="margin-left:10px;margin-top:4px;font-size:15px"> by <a href="/bbs/?uid=1">zep</a> </div> </div> <div style=" position:absolute; width:100%; height:100%; top:0; left:0; display:flex; align-items: center; "> <div style=" width:100%; height:80px; "> <center> <a style="cursor:pointer;" onClick=" var pa = 'playarea_20430'; if (touch_detected) pa = 'playarea_popup'; toggle_playarea(pa,20430, 'pico8_0110c.js', '/bbs/cposts/2/20430.p8.png'); "> <img src="/gfx/play80.png" width=80 height=80> </a> </center> </div> </div> </div></div> <div style="margin-top:4px;margin-left:8px;float:left"> <a href="/bbs/cposts/2/20430.p8.png"><img src="/gfx/cart32.png" width=16 height=20></a> </div> <div style="margin-top:6px;margin-left:4px;float:left"> <font color=#999 size=1> <a href="/bbs/cposts/2/20430.p8.png">Cart</a> &#91#20430#&#93 | <a style="cursor:pointer;" onclick=' var el = document.getElementById("cartcode_20430"); if (el.style.display == "none") el.style.display = ""; else el.style.display = "none"; microAjax("/bbs/snippet.php?cart_id=20430", function (retdata){ var el = document.getElementById("cartcode_20430"); el.innerHTML = retdata; el.focus(); el.select(); } ); '> Copy </a> | <a style="cursor:pointer;" onclick=' var el = document.getElementById("cartsrc_20430"); if (el.style.display == "none") el.style.display = ""; else el.style.display = "none"; microAjax("/bbs/snippet.php?cart_id=20430&src=1", function (retdata){ var el = document.getElementById("cartsrc_20430"); el.innerHTML = retdata; } ); '> Code </a> | 2016-05-11 | <a href="?pid=20432#p20430">Link</a> </font> </div> <div style="margin-top:2px;margin-left: 8px;float:left"> <img src="/gfx/set_cc1.png" width=20 height=20></div> <div class="desktop_div" style="float:right; margin-right:10px; margin-top:2px"> <div style="display:flex; align-items: center; cursor:pointer;" class="rate_20432_like" > <div style="display:table; width:20px; height:20px" title="Give this thread a star" class="i_rate_20432_like" ><img src="/gfx/set_like0.png" width=20 height=20></div> <div style="margin-left:8px;">30</div></div></div><div class="desktop_div" style="float:right; margin-right:10px; margin-top:2px"> <div style="display:flex; align-items: center; cursor:pointer;" class="rate_20432_fav" > <div style="display:table; width:20px; height:20px" title="Add to your favourites collection" class="i_rate_20432_fav" ><img src="/gfx/set_fav0.png" width=20 height=20></div> </div></div></div> <div style="width:100%"> <textarea rows=50 class=lexinput id="cartcode_20430" style="width:100%;background-color:#fed;display:none;overflow:hidden; font-size:1pt;overflow-wrap:break-word;"></textarea> <textarea rows=30 id="cartsrc_20430" style="width:100%;background-color:#fed;display:none;"></textarea> </div> </p> <p>I removed the PLAY buttons from the thread previews, and autoplay, as I think they're no longer needed -- the whole playable region of a cart is now visible without scrolling after opening the cart's thread, and it's more obvious to new visitors what to do next.</p> <p>There are still a few small things to finish, but let me know what you think of the new layout, and if there's anything that bugs you.</p> http://www.lexaloffle.com/bbs/?tid=3368 http://www.lexaloffle.com/bbs/?tid=3368 Tue, 17 May 2016 16:25:16 UTC Tokyo Demo Fest 2016 <p><a href="http://tokyodemofest.jp/2016/"><img style="" border=0 src="https://www.lexaloffle.com/bbs/files/1/tdf.png" width=651 height=258 alt="" /></a></p> <p>This weekend (20th, 21st) I'll be at <a href="http://tokyodemofest.jp/2016/">Tokyo Demo Fest 2016</a>, giving a short PICO-8 seminar at 3pm on Sunday, and also making a wee demo for the Wild compo (also in PICO-8, naturally). If you're in Tokyo, come along! The venue is larger than last year -- <a href="http://www.3331.jp/access/en/">3331 Arts Chiyoda</a>, which is around 8 minutes walk from Akihabara station. You can find the registration page and more information <a href="http://tokyodemofest.jp/2016/">here</a>.</p> <p>Here's a 4k demo from last year (it won the combined pc section):</p> <p><object width="640" height="400"><param name="movie" value="https://www.youtube.com/v/ISkIB4w6v6I&hl=en&fs=1&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="https://www.youtube.com/v/ISkIB4w6v6I&hl=en&fs=1&rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="400"></embed></object></p> http://www.lexaloffle.com/bbs/?tid=3067 http://www.lexaloffle.com/bbs/?tid=3067 Sun, 14 Feb 2016 12:06:25 UTC Multi-Update <img style="" border=0 src="https://www.lexaloffle.com/bbs/files/1/sr3k_2.png" width=640 height=296 alt="" /> <p>Hey All</p> <p>I've been doing some spring cleaning, and updated all of the older Lexaloffle games: Neko Puzzle (which is now free), Swarm Racer, Chocolate Castle, Zen Puzzle Garden, Swarm Racer and Swarm Racer 3000. If you had any trouble running these games on newer versions of OSX or 64-bit Linux, these versions should work out of the box.</p> <p>SR3K also has some new wall rendering and analogue joystick support. I've been chipping away at it very sporadically but it's on slow burn until after Voxatron is finished. An 8-track preview is available to any Lexaloffle customers.</p> <p>You can find downloads on the <a href="https://www.lexaloffle.com/games.php">game pages</a>, or your <a href="https://www.lexaloffle.com/games.php?page=updates">updates page</a> / <a href="https://www.humblebundle.com/home/library">Humble Library page</a>.</p> <p>User-made <a href="https://www.lexaloffle.com/bbs/?cat=3&amp;amp;mode=carts">ZPG</a> and <a href="https://www.lexaloffle.com/bbs/?cat=4&amp;amp;mode=carts">Chocolate Castle</a> puzzles are also back up with new HTML5 players. You can post puzzles by saving them to clipboard and then pasting the puzzle text into a BBS post.</p> http://www.lexaloffle.com/bbs/?tid=2941 http://www.lexaloffle.com/bbs/?tid=2941 Tue, 29 Dec 2015 12:56:25 UTC New BBS Features <p>Hey All</p> <p>There's a new version of the BBS live now. It's still a little rough -- let me know in the comments if you find something weird going on. I'll be tweaking and extending it over the next month or so.</p> <p><a href="https://www.lexaloffle.com/bbs/?mode=carts&amp;amp;cat=7&amp;amp;sub=2"><img style="" border=0 src="https://www.lexaloffle.com/bbs/files/1/cart_example.png" width=163 height=226 alt="" /></a></p> <p>New stuff:<br /> <br> <a href="http://www.lexaloffle.com/bbs/?tid=2613">:: Read More </a> http://www.lexaloffle.com/bbs/?tid=2613 http://www.lexaloffle.com/bbs/?tid=2613 Thu, 15 Oct 2015 19:20:58 UTC PICO-8 0.1.3 <p>You can find it on your <a href="https://www.lexaloffle.com/games.php?page=updates">Updates</a> page. The new builds should be up on Humble soon too (check the version numbers on the files).</p> <p>This is a quick bug-fixing update. Due to a rogue dev-debug-mode flag being mistakenly switched on in 0.1.2, much of the standard Lua library was accessible. So if you've started using PICO-8 recently, not knowing the library is not supposed to be there and tried to use it, sorry about the confusion! </p> <p>v0.1.3 Changes:</p> <p>Added: paste into commandline<br /> Fixed: lua standard libraries accessible<br /> Fixed: command-line loading doesn't work<br /> Fixed: music pattern finished too early when all tracks set to looping<br /> Fixed: peek()ing odd bytes in sfx address space masks bit 7<br /> Fixed: cstore and reload from code space should have no effect</p> http://www.lexaloffle.com/bbs/?tid=2612 http://www.lexaloffle.com/bbs/?tid=2612 Thu, 15 Oct 2015 17:40:16 UTC PICO-8 0.1.2 <p>Check your <a href="https://www.lexaloffle.com/games.php?page=updates">updates</a> page!</p> <p>Note: If you bought PICO-8 (rather than Voxatron), it isn't possible yet to activate your Lexaloffle account from Humble. I've been activating accounts manually, so if you purchased PICO-8 very recently and don't see it show up yet, please check back in a day or so. The Humble Bundle library builds should be live soon too.</p> <p>New stuff: HTML5 exporter, 8-player joystick support, cartridge save data.</p> <p>To export your cartridge as a stand-alone html5 version:</p> <div> <div style="max-width:720px; 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> EXPORT BLAH.HTML </pre></div></td> <td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> </tr></table></div></div> <p>Open the folder (FOLDER) and you should be able to see BLAH.HTML and BLAH.JS</p> <p>Here's a demo of cartridge saving. Note that save data is not persistent yet in the web version:</p> <p><div style="display:table; background-color:#222;"><div id=p14880 class="playarea_1"> <div id=pc_container style="display:table; width:100%; height:0px"><center> <STYLE TYPE="text/css"> <!-- .playarea_1{ width:360px; height:256px; display:table; } @media screen and (min-width: 800px) { .playarea_1{ width:640px; height:128px; } } --> </STYLE> <div id=playarea_14880 style="background-color:#000"> </div> <script> pa_pid[1] = 14880; playable_area_count = 2; </script> <script> var mb = 0; // deleteme function abs(x) { return x < 0 ? -x : x; } // step 0 down 1 drag 2 up function pico8_buttons_event(e, step) { pico8_buttons[0] = 0; // show buttons as soon as touched document.getElementById("touch_controls").style.display=""; var num = 0; if (e.touches) num = e.touches.length; for (var i = 0; i < num; i++) { var touch = null; touch = e.touches[i]; //tindex = touch.identifier; var x = touch.clientX; var y = touch.clientY; //if (codo_running && y > 100) // e.preventDefault(); var w = document.body.clientWidth; var h = document.body.clientHeight; b = 0; // determine mask to clear (mask) and mask to set (b) for button state changes. if (x < w/2) { mask = 0xf; // dpad var cx = 70; var cy = h-70; deadzone = 15; var dx = x - cx; var dy = y - cy; if (abs(dx) > abs(dy) * 0.8) // horizontal { if (dx < -deadzone) b |= 0x1; if (dx > deadzone) b |= 0x2; } if (abs(dy) > abs(dx) * 0.8) // vertical { if (dy < -deadzone) b |= 0x4; if (dy > deadzone) b |= 0x8; } } else { // button; diagonal split from bottom right corner mask = 0x30; // close to menu? dx = x - (w/2); dy = y - (h-20); if (dx*dx + dy*dy < 50*50) { // menu button b |= 0x40; } else { // one or both of [X], [O] if ( (h-y) > (w-x) * 0.8) b |= 0x10; if ( (w-x) > (h-y) * 0.8) b |= 0x20; } } pico8_buttons[0] |= b; } } /* addEventListener("mousedown", function(event){ pico8_buttons_event(event, 0);}, false); addEventListener("mousemove", function(event){ pico8_buttons_event(event, 1);}, false); addEventListener("mouseup", function(event){ pico8_buttons_event(event, 2);}, false); */ var touch_detected = false; addEventListener("touchstart", function(event){ touch_detected = true; pico8_buttons_event(event, 0);}, false); addEventListener("touchmove", function(event){ pico8_buttons_event(event, 1);}, false); addEventListener("touchend", function(event){ pico8_buttons_event(event, 2);}, false); </script> </center> <div id=buttonsdiv14880 style="display:none; height:24px; margin-top:-100px; border:0px; padding:0px; width:100%; "> <div style="float:right; width:40px; height;80px;"> <div class="bright_hover" style="margin-bottom:4px;"> <a onclick="codo_running = !codo_running; if (codo_running) Module.resumeMainLoop(); else Module.pauseMainLoop(); set_pause_button();"> <div id=pause_button> <img src="/gfx/p8b_pause.png" width=24 height=24> </div> </a> </div> <a onclick= "codo_volume = (codo_volume == 0) ? 256 : 0; codo_command = 2; codo_command_p = codo_volume; set_sound_button();"> <div id="sound_button" class="bright_hover" style="margin-bottom:4px;"> <img src="/gfx/p8b_sound1.png" width=24 height=24> </div></a> <div class="bright_hover" style="margin-bottom:4px;"> <a onclick="Module.requestFullScreen(true, false);"> <img src="/gfx/p8b_full.png" width=24 height=24></a> </div> </div> </div> </div> <div id=infodiv14880 style=" position:relative; width:100%; height:100%; background:url('thumbs/pico14880.png') no-repeat center; background-size:contain; color:#fff; font-size:16; text-shadow: -1px 1px 2px rgba(16, 0, 48, 0.7); "> <div style=" background: rgba(0,0,0,0.6); width:100%; height:100%; "> <div style="padding-top:10px;padding-left:10px;font-size:20px"> <a href="?pid=14880#p14880">Bitpools 0.1.2</a> </div> <div style="margin-left:10px;margin-top:4px;font-size:15px"> by <a href="/bbs/?uid=1">zep</a> </div> </div> <div style=" position:absolute; width:100%; height:100%; top:0; left:0; display:flex; align-items: center; "> <div style=" width:100%; height:80px; "> <center> <a style="cursor:pointer;" onClick=" var pa = 'playarea_14880'; if (touch_detected) pa = 'playarea_popup'; toggle_playarea(pa,14880, 'pico8_0110c.js', '/bbs/cposts/1/14880.p8.png'); "> <img src="/gfx/play80.png" width=80 height=80> </a> </center> </div> </div> </div></div> <div style="margin-top:4px;margin-left:8px;float:left"> <a href="/bbs/cposts/1/14880.p8.png"><img src="/gfx/cart32.png" width=16 height=20></a> </div> <div style="margin-top:6px;margin-left:4px;float:left"> <font color=#999 size=1> <a href="/bbs/cposts/1/14880.p8.png">Cart</a> &#91#14880#&#93 | <a style="cursor:pointer;" onclick=' var el = document.getElementById("cartcode_14880"); if (el.style.display == "none") el.style.display = ""; else el.style.display = "none"; microAjax("/bbs/snippet.php?cart_id=14880", function (retdata){ var el = document.getElementById("cartcode_14880"); el.innerHTML = retdata; el.focus(); el.select(); } ); '> Copy </a> | <a style="cursor:pointer;" onclick=' var el = document.getElementById("cartsrc_14880"); if (el.style.display == "none") el.style.display = ""; else el.style.display = "none"; microAjax("/bbs/snippet.php?cart_id=14880&src=1", function (retdata){ var el = document.getElementById("cartsrc_14880"); el.innerHTML = retdata; } ); '> Code </a> | 2015-10-02 | <a href="?pid=14155#p14880">Link</a> </font> </div> <div style="margin-top:2px;margin-left: 8px;float:left"> <img src="/gfx/set_cc1.png" width=20 height=20></div> <div class="desktop_div" style="float:right; margin-right:10px; margin-top:2px"> <div style="display:flex; align-items: center; cursor:pointer;" class="rate_14155_like" > <div style="display:table; width:20px; height:20px" title="Give this thread a star" class="i_rate_14155_like" ><img src="/gfx/set_like0.png" width=20 height=20></div> <div style="margin-left:8px;">5</div></div></div><div class="desktop_div" style="float:right; margin-right:10px; margin-top:2px"> <div style="display:flex; align-items: center; cursor:pointer;" class="rate_14155_fav" > <div style="display:table; width:20px; height:20px" title="Add to your favourites collection" class="i_rate_14155_fav" ><img src="/gfx/set_fav0.png" width=20 height=20></div> </div></div></div> <div style="width:100%"> <textarea rows=50 class=lexinput id="cartcode_14880" style="width:100%;background-color:#fed;display:none;overflow:hidden; font-size:1pt;overflow-wrap:break-word;"></textarea> <textarea rows=30 id="cartsrc_14880" style="width:100%;background-color:#fed;display:none;"></textarea> </div> </p> <p>Changelog:</p> <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;"><br /> Added: html5 cartridge exporter<br /> Added: Cartridge save data (64 fixed point numbers)<br /> Added: 8-player input<br /> Added: Demo carts: COLLIDE and BUTTERFLY<br /> Added: Command-line parameters // load cart, -run, settings<br /> Added: Alternative function keys (F6..F9 aliased as F1..F4)<br /> Added: pairs()<br /> Added: printh() for debugging<br /> Added: Tab completion for filenames in console<br /> Added: stack trace on runtime error<br /> Changed: music pattern length taken to be first non-looping channel's length<br /> Changed: noise instrument (6) has low frequency white noise scaled by volume<br /> Changed: screenshot captures whole window contents at display resolution<br /> Changed: del() moves remaining items up one index to maintain a packed table<br /> Changed: add(),del(),count(),all() no longer store extra fields<br /> Changed: removed count() from docs -- now just a legacy function. Use # operator instead.<br /> Changed: cursor only blinks while window is active<br /> Changed: peek(), poke() and binary operations (band()..) have no function call overhead<br /> Changed: yellow slightly warmer<br /> Changed: No camera snapping after pan in map mode<br /> Fixed: sqrt() crashing for 0 or &gt;= 32761<br /> Fixed: Semi-colon characters in text editor<br /> Fixed: Long lines split when saving in .p8 format<br /> Fixed: pget() does not respect camera position<br /> Fixed: Error message when peeking or poking outside of legal address space<br /> Fixed: Search replace colour fills one pixel outside of selected region<br /> Fixed: Playing an empty music pattern breaks subsequent music playback<br /> Fixed: Invalid sfx editing state on startup<br /> Fixed: Painting instruments values in frequency view also sets volumes<br /> Fixed: Inconsistent gif recording speeds<br /> Fixed: Unmapped joystick support<br /> Fixed: Compressed code size sometimes larger than uncompressed<br /> Fixed: mid() fails when first argument is not smallest<br /> Fixed: Scroll wheel changes sprite/map zoom while in code editor<br /> Fixed: CTRL-R (quick-run) drawing over current line in command mode<br /> Fixed: Label capture (F7) does not respect screen palette state<br /> Fixed: Syntax highlighting of api functions and hex numbers<br /> Fixed: Looping to 0 with negative step finishes at 1<br /> Fixed: nil values printed as false instead of nil<br /> Fixed: Hexidecimal fractional parts<br /> Fixed: btnp() unresponsive when skipping frames<br /> Fixed: Editing mode is lost when using ctrl-r to run<br /> Fixed: Tracker note entry keys mapped, messing up piano-like layout<br /> Fixed: Shared gfx/map memory out of sync after some editor operations<br /> Fixed: Alt-gr character entry<br /> Fixed: Using shift to select in code editor has wrong selection range<br /> Fixed: Dragging above top of text causes selection to flip to end<br /> Fixed: Duplicate at end of file listing<br /> </div></div></div></p> http://www.lexaloffle.com/bbs/?tid=2548 http://www.lexaloffle.com/bbs/?tid=2548 Fri, 02 Oct 2015 17:59:42 UTC Updates Ahoy <img style="" border=0 src="https://www.lexaloffle.com/bbs/files/1/lex_pp.png" width=256 height=256 alt="" /> <p>Just a quick note for blog-checkers, Voxatron 0.3.3 and PICO-8 0.1.2 are both arriving this month. </p> <p>I'll go into detail about new Voxatron developments and plans after the update's out, but here's <a href="https://www.lexaloffle.com/bbs/?pid=13984#p13984">a quick preview</a> until then.</p> <p>Also, here's the current changelog for pico-8 0.1.2. There are still known issues that I've rolled over to 0.1.3 but let me know if I missed something small that's easy to fix!</p> <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> <div> <div style="max-width:720px; 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> v0.1.2 Added: Cartridge save data (64 fixed point numbers) Added: 8-player input Added: demo carts: COLLIDE and BUTTERFLY Added: Command-line parameters // load cart, -run, settings Added: Alternative function keys (F6..F9 aliased as F1..F4) Added: pairs() Added: printh() for debugging Changed: music pattern length taken to be first non-looping channel's length Changed: screenshot captures whole window contents at display resolution Changed: del() moves remaining items up one index to maintain a packed table Changed: count() includes non-array elements. count(a,v) counts instances of value v Changed: add(),del(),count(),all() no longer store hidden fields Tweaked: palette: slightly darker gray, warmer greens and yellow Fixed: sqrt() crashing for 0 or &gt;= 32761 Fixed: Semi-colon characters in text editor Fixed: Long lines split when saving in .p8 format Fixed: pget() does not respect camera position Fixed: Error message when peeking or poking outside of legal address space Fixed: Search replace colour fills one pixel outside of selected region Fixed: Playing an empty music pattern breaks subsequent music playback Fixed: Invalid sfx editing state on startup Fixed: Painting instruments values in frequency view also sets volumes Fixed: Inconsistent gif recording speeds Fixed: Unmapped joystick support Fixed: Compressed code size sometimes larger than uncompressed Fixed: mid() fails when first argument is not smallest Fixed: Scroll wheel changes sprite/map zoom while in code editor Fixed: CTRL-R (quick-run) overwriting current command line Fixed: Label capture (F7) does not respect screen palette state </pre></div></td> <td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> </tr></table></div></div> <p></div></div></div></p> http://www.lexaloffle.com/bbs/?tid=2452 http://www.lexaloffle.com/bbs/?tid=2452 Thu, 10 Sep 2015 18:51:21 UTC PICO-8 Fanzine #1 <p><a href="http://sectordub.itch.io/pico-8-fanzine-1"><img style="" border=0 src="https://www.lexaloffle.com/bbs/files/1/pico8zine_table.jpg" width=500 height=375 alt="" /></a></p> <p>Issue #1 of the community-made PICO-8 zine is out! You can order the 48-page printed version via <a href="http://pico8fanzine.bigcartel.com/">pico8fanzine.bigcartel.com</a> for a nominal fee, or <a href="http://sectordub.itch.io/pico-8-fanzine-1"> download the pdf</a> (<a href="https://www.lexaloffle.com/files/zine/pico8zine_1.pdf">mirror</a>).</p> <p>Much respect to <a href="http://www.twitter.com/arnaud_debock">@arnaud_debock</a> and contributors for putting this together -- it's humbling to see the world of PICO-8 extended in such a creative and kick-ass way. Issue #1 includes artwork and articles by <a href="http://www.twitter.com/@dotsukiHARA">@dotsukiHARA</a>, <a href="http://www.twitter.com/@bitmoo">@bitmoo</a>, <a href="http://www.twitter.com/@TheRealMolen">@TheRealMolen</a>, <a href="http://www.twitter.com/@pizzamakesgames">@pizzamakesgames</a>, <a href="http://www.twitter.com/@PROGRAM_IX">@PROGRAM_IX</a>, <a href="http://www.twitter.com/@aliceffekt">@aliceffekt</a>, <a href="http://www.twitter.com/@modernmodron">@modernmodron</a> and <a href="http://www.twitter.com/@terrycavanagh">@terrycavanagh</a>. I also took the opportunity to write something on the history of PICO-8 and it's relationship with other Lexaloffle projects.</p> <p>If you'd like to contribute to future issues, see also <a href="https://www.lexaloffle.com/bbs/?tid=2106">this thread</a>, or tweet <a href="http://www.twitter.com/@arnaud_debock">@arnaud_debock</a>.</p> http://www.lexaloffle.com/bbs/?tid=2298 http://www.lexaloffle.com/bbs/?tid=2298 Sat, 22 Aug 2015 11:19:45 UTC Adaptive HUD Formatting <img style="" border=0 src="https://www.lexaloffle.com/bbs/files/1/inv_formatting.gif" width=512 height=320 alt="" /> <p>The last inventories thing I needed for 0.3.3: adaptive formatting (an extreme example). Each inventory item is assigned a group (left, middle, right), and it does its best to figure out how to format everything in a sensible way that doesn't jump around too much and doesn't overlap. I had to be careful not to end up with a 1996 html table renderer!</p> <p>It's possible with the new inventory system to display the capacity of an item (e.g. empty slots for up to 5 potions), to draw different icons for wielded or carried, and to draw different icons depending on how much ammo each one has.</p> <p>To handle 1p vs multiplayer inventories, you can tag animations with context information -- how many players should exist for them to be displayed and with which attributes. For example, a single player inventory might show a row of potions, but when playing multiplayer it might be displayed as a single icon with a number to save space.</p> <p>There's not long to go before 0.3.3 -- just a few microscripting details and converting legacy cartridges over to the new system on load. 0.3.4 will be a smaller follow-up, so let me know if there's something you're hanging out for, and I'll see if I can bump it up, or make sure it will be possible with Lua scripting later on. Things that were recently mentioned and are already confirmed:</p> <ul> <li>pico-8 music tracker and music triggering (and some new music!)</li> <li>custom inventories with selection and/or button bindings</li> <li>inventory microscripting (check for number of arrows in a quiver etc.)</li> <li>items that share the same ammo (e.g. all spells cost MP) </li> <li>id duplication and aliasing bugs after copy/paste</li> <li>fixed density allowing actors to sink in liquid</li> <li>scroll-wheel zoom, mb3 camera movement , alt-click mb2 emulation</li> <li>fixed total playtime bug for speedruns, made restarts faster</li> </ul> <p>There are a few things that are wishlisted, but might be better suited to Lua scripting later on:</p> <ul> <li>player selection menu</li> <li>separate inventory menu</li> <li>assigning chase targets to monsters (for waypoints or making snakey monsters)</li> <li>arcade style lives</li> </ul> http://www.lexaloffle.com/bbs/?tid=2096 http://www.lexaloffle.com/bbs/?tid=2096 Thu, 02 Jul 2015 20:26:09 UTC Voxatron Lua Scripting Preview <p>The general strategy for developing Voxatron's toolset is to provide specialized features (modifiers, microscripting, physics properties etc) that capture 90% of a typical designer's requirements, and then leave the rest to <a href="http://www.lua.org">Lua</a> scripting. Lua will be kind of like a glue that that holds the engine together and fills in the gaps of functionality.</p> <p>Working on custom player inventories and menus that have a plethora of possible requirements, I feel I've hit that 90% boundary. The engine is now complete enough that it is possible to create a Lua API that is grounded in something stable and maintainable. For this purpose, I've created a text editor that can be used within Designer, and a custom version of Lua designed to work efficiently with Voxatron (both of which you can see in action in <a href="http://www.pico-8.com">PICO-8</a>). It's time to (carefully) plug everything in and see what happens!</p> <p>It will also be possible to write cartridges from scratch in Lua, of course. This would be handy for making games that need their own style of physics, or things like RTS, sim or puzzle games that deviate a lot from typical Voxatron shooty-runny things. The purest cartridge can contain simply one Lua script, and no rooms or object definitions.</p> <p>If all goes well, I'll start to roll out a minimal API later next month for anyone to experiment with. It is a typical object-wise callback scheme, where things happening in the world/engine call Lua functions that the cart designer provides.</p> <p>Here's a simple example:</p> <p><iframe class="vine-embed" src="https://vine.co/v/eiTpKIL2eLZ/embed/simple" width="320" height="320" frameborder="0"></iframe><script async src="//platform.vine.co/static/scripts/embed.js" charset="utf-8"></script></p> <p>This is a regular twirly gun using emitters to shoot out the bullets. I've attached a script to each bullet (it's just a SCRIPT item that sits anywhere in the bullet's resource tree) that looks like this:</p> <div> <div style="max-width:720px; 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 this.new() local a = new_bullet() a.col = 12 return a end function this.draw(a) local x,y,z = a:xyz() line3d(x,y,z-30,x,y,z-5,a.col) 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>Every time a bullet is created, the new() function is called (if one exists), and some Lua data (a table, to be precise) is attached to that object. Now, any time something happens to the bullet -- it's moved or drawn or collides -- a corresponding function is called. Here I've only provided a single function that is called by the engine each time the bullet is drawn which grabs the bullet's world position and draws a line straight up.</p> <p>If you're new to programming and want to get a head-start, I would suggest playing around with <a href="http://www.pico-8.com">PICO-8</a>, which is free for all existing Voxatron alpha users (including the earlier Humble Bundles). Have a look at the <a href="https://www.lexaloffle.com/games.php?page=updates">Updates Page</a> for download instructions.</p> <p>Incidentally, I am relatively new to Lua scripting myself! So if you have any feedback or questions about Voxatron scripting, feel free to post here.</p> http://www.lexaloffle.com/bbs/?tid=2087 http://www.lexaloffle.com/bbs/?tid=2087 Mon, 22 Jun 2015 17:29:12 UTC PICO-8 0.1.1 <p><a href="http://www.pico-8.com">PICO-8</a> 0.1.1 is now available! Grab it from the <a href="https://www.lexaloffle.com/games.php?page=updates">Updates</a> page.</p> <p>Note that PICO-8 is available to all Voxatron alpha users (including bundle customers). You may need to <a href="/account.php?page=activate">activate your account</a>, or <a href="/accounts.php">log in via email</a> if you don't have a username/password already set up.</p> <p>I'm doing things a little out of order here.. a full introductory post to PICO-8 will follow in a bit for those who haven't been around lately, but for now here's a rundown of new stuff in 0.1.1..</p> <p><strong>1. Gif saving! Press F9 to save the last 8 seconds (or F8 to set a starting point if you wish)</strong></p> <img style="" border=0 src="files/1/froggleoid.gif" width=256 height=256 alt="" /> <p><strong>2. Token counting.</strong></p> <p>Instead of limiting cartridges to ~15k of ascii text, the primary limit is now 8192 tokens. I say primary limit, because the character count still stands, but is now 32k -- in practice the token limit is almost always reached first. There is actually also a third limit when saving cartridges -- the code must compress to the original 15k allocation. Exceeding this is extremely rare and you can probably ignore it! To get the status of your program, use the new INFO() command.</p> <p>There aren't currently any cartridges that I know of that go over 8k tokens, and in general this change will give you around 20~30% more space.</p> <p><strong>3. Freeform sprite and map editing</strong></p> <p>You can now zoom out with the mousewheel and pan around using space. There is also a more traditional selection tool (you can use cursors to move the selection around). See the <a href="https://www.lexaloffle.com/pico-8.php?page=manual">manual</a> for more details.</p> <p><strong>4. New api functions</strong></p> <p>By popular demand, sqrt(), atan2() and sub() have been added.</p> <p>atan2() follows the convention set by cos() and sin() of flipping y so that angles increase anti-clockwise in screenspace and reach a full circle at 1.0. So atan2(0,-1) is 0.25</p> <p>To grab the length of a string, you can use the now-fixed # operator (#s) and grab individual characters with sub(s,pos,pos)</p> <p><strong>5. More palette control</strong></p> <p>Palette mapping now applies to all draw operations (note: there is a tiny bit of palette weirdness for existing carts because of this)<br /> Also, you can specify which colours spr(), sspr() and map() should treat as transparent using palt()<br /> palt(1, true) -- don't draw any dark blue pixels</p> <p><strong>6. Better saving, loading and re-loading</strong></p> <p>You can now quick-save with CTRL-S. Saving over files, or quitting without saving causes a backup to be saved in [pico-8 home]/backup.</p> <p>When loading a .png, you can now omit the &quot;.p8.png&quot; and pico-8 will check for it.</p> <p>Using CTRL-R will automatically reload the cartridge if no changes have been made (making it easier to work with external editors for heretics).</p> <p>--</p> <p>Thanks so much to everyone who has given suggestions and shaped the direction of this project. I'm really happy with the way token counting in particular has worked out, but the proof will be in the pudding! Let me know if there are any show-stopping problems that should be nipped in the bud, and I'll include them in a bug-fixing update next week (that will also hopefully include keyboard mapping &amp; broken Yosemite mouse fixes).</p> <p>Test 0.1.1 cart:</p> <p><div style="display:table; background-color:#222;"><div id=p11253 class="playarea_2"> <div id=pc_container style="display:table; width:100%; height:0px"><center> <STYLE TYPE="text/css"> <!-- .playarea_2{ width:360px; height:256px; display:table; } @media screen and (min-width: 800px) { .playarea_2{ width:640px; height:128px; } } --> </STYLE> <div id=playarea_11253 style="background-color:#000"> </div> <script> pa_pid[2] = 11253; playable_area_count = 3; </script> <script> var mb = 0; // deleteme function abs(x) { return x < 0 ? -x : x; } // step 0 down 1 drag 2 up function pico8_buttons_event(e, step) { pico8_buttons[0] = 0; // show buttons as soon as touched document.getElementById("touch_controls").style.display=""; var num = 0; if (e.touches) num = e.touches.length; for (var i = 0; i < num; i++) { var touch = null; touch = e.touches[i]; //tindex = touch.identifier; var x = touch.clientX; var y = touch.clientY; //if (codo_running && y > 100) // e.preventDefault(); var w = document.body.clientWidth; var h = document.body.clientHeight; b = 0; // determine mask to clear (mask) and mask to set (b) for button state changes. if (x < w/2) { mask = 0xf; // dpad var cx = 70; var cy = h-70; deadzone = 15; var dx = x - cx; var dy = y - cy; if (abs(dx) > abs(dy) * 0.8) // horizontal { if (dx < -deadzone) b |= 0x1; if (dx > deadzone) b |= 0x2; } if (abs(dy) > abs(dx) * 0.8) // vertical { if (dy < -deadzone) b |= 0x4; if (dy > deadzone) b |= 0x8; } } else { // button; diagonal split from bottom right corner mask = 0x30; // close to menu? dx = x - (w/2); dy = y - (h-20); if (dx*dx + dy*dy < 50*50) { // menu button b |= 0x40; } else { // one or both of [X], [O] if ( (h-y) > (w-x) * 0.8) b |= 0x10; if ( (w-x) > (h-y) * 0.8) b |= 0x20; } } pico8_buttons[0] |= b; } } /* addEventListener("mousedown", function(event){ pico8_buttons_event(event, 0);}, false); addEventListener("mousemove", function(event){ pico8_buttons_event(event, 1);}, false); addEventListener("mouseup", function(event){ pico8_buttons_event(event, 2);}, false); */ var touch_detected = false; addEventListener("touchstart", function(event){ touch_detected = true; pico8_buttons_event(event, 0);}, false); addEventListener("touchmove", function(event){ pico8_buttons_event(event, 1);}, false); addEventListener("touchend", function(event){ pico8_buttons_event(event, 2);}, false); </script> </center> <div id=buttonsdiv11253 style="display:none; height:24px; margin-top:-100px; border:0px; padding:0px; width:100%; "> <div style="float:right; width:40px; height;80px;"> <div class="bright_hover" style="margin-bottom:4px;"> <a onclick="codo_running = !codo_running; if (codo_running) Module.resumeMainLoop(); else Module.pauseMainLoop(); set_pause_button();"> <div id=pause_button> <img src="/gfx/p8b_pause.png" width=24 height=24> </div> </a> </div> <a onclick= "codo_volume = (codo_volume == 0) ? 256 : 0; codo_command = 2; codo_command_p = codo_volume; set_sound_button();"> <div id="sound_button" class="bright_hover" style="margin-bottom:4px;"> <img src="/gfx/p8b_sound1.png" width=24 height=24> </div></a> <div class="bright_hover" style="margin-bottom:4px;"> <a onclick="Module.requestFullScreen(true, false);"> <img src="/gfx/p8b_full.png" width=24 height=24></a> </div> </div> </div> </div> <div id=infodiv11253 style=" position:relative; width:100%; height:100%; background:url('thumbs/pico11253.png') no-repeat center; background-size:contain; color:#fff; font-size:16; text-shadow: -1px 1px 2px rgba(16, 0, 48, 0.7); "> <div style=" background: rgba(0,0,0,0.6); width:100%; height:100%; "> <div style="padding-top:10px;padding-left:10px;font-size:20px"> <a href="?pid=11253#p11253">Froggleoid 1.1</a> </div> <div style="margin-left:10px;margin-top:4px;font-size:15px"> by <a href="/bbs/?uid=1">zep</a> </div> </div> <div style=" position:absolute; width:100%; height:100%; top:0; left:0; display:flex; align-items: center; "> <div style=" width:100%; height:80px; "> <center> <a style="cursor:pointer;" onClick=" var pa = 'playarea_11253'; if (touch_detected) pa = 'playarea_popup'; toggle_playarea(pa,11253, 'pico8_0110c.js', '/bbs/cposts/1/11253.p8.png'); "> <img src="/gfx/play80.png" width=80 height=80> </a> </center> </div> </div> </div></div> <div style="margin-top:4px;margin-left:8px;float:left"> <a href="/bbs/cposts/1/11253.p8.png"><img src="/gfx/cart32.png" width=16 height=20></a> </div> <div style="margin-top:6px;margin-left:4px;float:left"> <font color=#999 size=1> <a href="/bbs/cposts/1/11253.p8.png">Cart</a> &#91#11253#&#93 | <a style="cursor:pointer;" onclick=' var el = document.getElementById("cartcode_11253"); if (el.style.display == "none") el.style.display = ""; else el.style.display = "none"; microAjax("/bbs/snippet.php?cart_id=11253", function (retdata){ var el = document.getElementById("cartcode_11253"); el.innerHTML = retdata; el.focus(); el.select(); } ); '> Copy </a> | <a style="cursor:pointer;" onclick=' var el = document.getElementById("cartsrc_11253"); if (el.style.display == "none") el.style.display = ""; else el.style.display = "none"; microAjax("/bbs/snippet.php?cart_id=11253&src=1", function (retdata){ var el = document.getElementById("cartsrc_11253"); el.innerHTML = retdata; } ); '> Code </a> | 2015-06-11 | <a href="?pid=11111#p11253">Link</a> </font> </div> <div class="desktop_div" style="float:right; margin-right:10px; margin-top:2px"> <div style="display:flex; align-items: center; cursor:pointer;" class="rate_11111_like" > <div style="display:table; width:20px; height:20px" title="Give this thread a star" class="i_rate_11111_like" ><img src="/gfx/set_like0.png" width=20 height=20></div> <div style="margin-left:8px;">17</div></div></div><div class="desktop_div" style="float:right; margin-right:10px; margin-top:2px"> <div style="display:flex; align-items: center; cursor:pointer;" class="rate_11111_fav" > <div style="display:table; width:20px; height:20px" title="Add to your favourites collection" class="i_rate_11111_fav" ><img src="/gfx/set_fav0.png" width=20 height=20></div> </div></div></div> <div style="width:100%"> <textarea rows=50 class=lexinput id="cartcode_11253" style="width:100%;background-color:#fed;display:none;overflow:hidden; font-size:1pt;overflow-wrap:break-word;"></textarea> <textarea rows=30 id="cartsrc_11253" style="width:100%;background-color:#fed;display:none;"></textarea> </div> </p> <p>Full changelog:</p> <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;"><br /> v0.1.1<br /> Added: Token-based code limiting (8192 tokens, 32k ascii text)<br /> Added: Freeform move, pan and selection in sprite and map editors<br /> Added: Flood-fill tool (sprite and map)<br /> Added: .GIF saver<br /> Added: CTRL-Stamp to stamp with transparency<br /> Added: Single-step undo for map and sprites<br /> Added: 2x2 brush<br /> Added: sqrt(), atan2()<br /> Added: CTRL-S to quick-save<br /> Added: CTRL-R reloads .p8 file and runs (useful for external text editing)<br /> Added: Automatic backups on overwriting or quitting without saving<br /> Added: Scroll wheel zooms in sprite editor<br /> Added: Customisable resolution // e.g. pico8 -width 580<br /> Added: Strings highlighted as green<br /> Added: ALT-click can optionally simulate right click (see config.txt)<br /> Added: palt() to control transparency for spr(), sspr()<br /> Added: info()<br /> Changed: load() tries adding .p8.png, .png if file doesn't exist<br /> Changed: Draw operations apply only to selection when active<br /> Changed: Move operations (cursors) apply to selection if present<br /> Changed: Removed time()<br /> Changed: Random seed is random on cart startup<br /> Changed: api functions never read directly from cart rom<br /> Changed: sspr() can take negative values for dw, dh<br /> Fixed: Sparse table indexing with integers fails<br /> Fixed: Assignment operators and shortform if-then-else failing<br /> Fixed: sspr() failed when w0 == 128<br /> Fixed: Circle drawing broken when camera not (0,0)<br /> Fixed: CPU hogging<br /> Fixed: Noise instrument clobbers rnd() sequence<br /> Fixed: Audio system not resetting on program reset<br /> Fixed: % operator sometimes wrong for negative values<br /> Fixed: Length operator (#)<br /> Fixed: Power operator (^)<br /> Fixed: Line clipping bug on right and bottom edges<br /> Fixed: print() precision for whole numbers<br /> Fixed: print() broken for negative y values<br /> Fixed: tokenization and keyword highlighting<br /> Fixed: sprite properties not copied/pasted<br /> Fixed: Only sfx 0..32 could be used as music patterns<br /> Fixed: Saving and loading a .p8 file adds newline to end of code<br /> Fixed: Drag selection to left margin in code editor -&gt; selects all<br /> </div></div></div></p> http://www.lexaloffle.com/bbs/?tid=2070 http://www.lexaloffle.com/bbs/?tid=2070 Thu, 11 Jun 2015 20:51:43 UTC Inventories &amp; HUDs <p>Hey All</p> <p>So you may be wondering what I've been up to for the last 4 months or so, and I'll post all about that very soon! v0.3.3 has required a lot of general housekeeping work including improving the player inventory system to function nicely with world state saving, scripting and controls. As a result, it became a good opportunity to also squeeze in weapon switching and custom HUDs. </p> <p>Here's the design I have -- please feel free to comment and criticize -- especially if it looks like it won't carry ideas for carts you'd like to make soonish.</p> <p>Here's an example HUD that shows a single player carrying more than one weapon (switchable with Q/E or shoulder buttons):</p> <p><a href="files/1/vox_inv.png"><img style="" border=0 src="files/1/vox_inv.png" width=320 height=200 alt="" /></a></p> <p>The basic idea is to add an animation to INV_ITEM similar to the ones that exist now for arcade weapons, but to allow adding <em>any</em> inventory item to the hud, including things like potions that are activated with an alternative button, or temporary pickups like the score multiplier.</p> <p>The items only have limited information about how they are to be displayed up top -- the layout happens mostly automatically. But certain common item meanings (score, life, player head) are tagged as such to help make a sensible layout.</p> <p>The layout is performed in single player by separating elements into up to 3 groups and aligning then left, then right then center. Multiplayer layout is similar, but elements are squashed together and layed out per-player.</p> <p>The goal here is to provide a simple way to make inventories for common genres, without requiring lua scripting or a lot of work doing layouts that work both in 1P &amp; 2P. Later on, fancy HUD requirements can be taken care of in Lua scripts (more on that shortly!).</p> <p>So, the steps to make a custom HUD will be:</p> <ol> <li>Add (or alias) any inventory items (INV ITEM) that the player should start with. // e.g. start with a bow and 8 arrows</li> <li>Add animations to inventory items that should be shown in the HUD</li> <li>Tag some inventory items as having a special meaning: score, lives</li> </ol> <p>It will still be possible to use the old arcade HUD that you're all familiar with, but not to mix-and-match the two systems.</p> <p>So, here's the question -- are there any simple HUDS you'd like to use that don't seem to work with a scheme like this?</p> <p>Here are some examples that I think will be ok:</p> <p>Doom: Score, life, current weapon &amp; ammo<br /> Bomberman, Bloot: Player heads with points won in a single row<br /> RPG: armour &amp; weapon, MP, HP, Gold<br /> Adventure: List of collected objects<br /> Scrolly Shooter: lives, score, panic bombs // lives logic not yet implemented</p> http://www.lexaloffle.com/bbs/?tid=1780 http://www.lexaloffle.com/bbs/?tid=1780 Wed, 01 Apr 2015 18:39:37 UTC Voxatron 0.3.2 <p>Hi All</p> <p>Voxatron 0.3.2 is now up on your <a href="https://www.lexaloffle.com/games.php?page=my">games page</a> or Humble download page (check the version number on the file). This is another bug fixing update, recommended in particular to Windows users as the 0.3.1 package was broken and still included 0.3.0's save game bug o( <em> </em> )o. </p> <p>v0.3.2</p> <p>Added: Monsters to default resource tree<br /> Added: HOST:M-STATE:COLLECTED<br /> Fixed: (Windows) save games broken<br /> Fixed: WORLD:RANDOM not selectable trigger<br /> Fixed: Can not deselect aliased objects by clicking<br /> Fixed: Favourites sometimes not saved<br /> Fixed: Custom pickup score does not respect bonus multiplier</p> http://www.lexaloffle.com/bbs/?tid=1707 http://www.lexaloffle.com/bbs/?tid=1707 Tue, 28 Oct 2014 17:15:55 UTC Voxatron 0.3.1 <p>Hi All</p> <p>Voxatron 0.3.1 is now up on your <a href="https://www.lexaloffle.com/games.php?page=my">games page</a> or Humble download page (check the version number on the file). This is just a quick bug-fixing update, but is highly recommended as game progress saving is broken in 0.3.0.</p> <p>v0.3.1 Changelog:</p> <p>Fixed: Save games / checkpoints broken when Voxatron is clean installed o_O<br /> Fixed: Sticky joystick buttons and sticks making menu navigation impossible<br /> Fixed: Object references break when loading .vob.png<br /> Fixed: Able to edit internal items from toolbar object button<br /> Fixed: SYSTEM:BUTTON doesn't work when player 1 doesn't exist<br /> Fixed: Bullet life shown even though meaningless (use DURATION instead)<br /> Fixed: Corrupt internal music item at end of list<br /> Fixed: 2d png importer crashes for files larger than 128x128<br /> Fixed: Default pickup sound plays even when default_sound flag is 0<br /> Fixed: Pickups can not respond to life &lt;= 0 event<br /> Fixed: HURT event triggered when player life increases<br /> Fixed: Monster entry stops after P1 dies in 2-player arena<br /> Fixed: Grenades damage indestructible walls<br /> Fixed: Placing room objects resets properties each time<br /> Fixed: 2-way doors facing in the same direction causes crash<br /> Fixed: Bullets hurt player even when hurt_same_team flag is 0</p> http://www.lexaloffle.com/bbs/?tid=1698 http://www.lexaloffle.com/bbs/?tid=1698 Thu, 23 Oct 2014 15:21:49 UTC Voxatron 0.3.0 <p><object width="640" height="400"><param name="movie" value="https://www.youtube.com/v/ZWsUxlnNCbc&hl=en&fs=1&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="https://www.youtube.com/v/ZWsUxlnNCbc&hl=en&fs=1&rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="400"></embed></object></p> <p>Voxatron 0.3.0 is now available! You can grab it from your <a href="https://www.lexaloffle.com/games.php?page=my">games page</a> or Humble download page. The largest changes you'll notice are a 2P arena cart, a whole new cart called Bloot (4-player!) and a sound designer that you can see a glimpse of in the trailer (it's shared with my other fantasy console, <a href="http://www.pico-8.com">PICO-8</a>, which is a kind of subset of Voxatron). Try Bloot to see what kind of sounds you can make with it. </p> <p>On the more technical side, there is now support for aliased objects, which means you can make references to objects from different folders. This is useful for things like making shared properties between actors or dropping random loot. Tutorials on how to use this are on their way :)</p> <p>If you'd like to try making a multiplayer cartridge, just plonk more than one player into a room and they will automatically be assigned controls to a human player in order (P1, P2..). Note that you'll need to set up controls in the options menu for each player, which can currently be keyboard, keyboard+mouse, and up to 4 joysticks. Note that each player needs to have a separate definition (you can't currently two DJ Beeps for example).</p> <p>Finally, as some of you have discovered already, it is now possible to <strong>freely play any BBS cart right in your browser</strong>. This means that cart designers can share their games with people who don't own Voxatron, and gives a handy way to preview carts without leaving the forum. I'm hoping that this will encourage users to post and share more stuff, and will serve as a way to introduce more people to Voxatron.</p> <p>Check out the <a href="https://www.lexaloffle.com/voxatron.php?page=dev">Development Map</a> to see how all these features are going to fit together. Coming up next is switchable inventory items, making RPGs and Doom-style inventories possible.</p> <p>If you find any bugs, feel free to post them in the comments. I saw the save game issue and the sticky 'up' button bug preventing menu use (<em>ugh</em>), and will make another small update soon to address these. </p> <p>Thanks for playing, and I'll catch you in the forums!</p> <ul> <li>zep</li> </ul> <p>Update: I uploaded some fixed .deb installers for Linux that are also live on Humble for anyone who had trouble with this.</p> <p>Update 2: There's a nasty bug that prevents saving if you clean installed Voxatron. I'll patch it soon, but until then <a href="https://www.lexaloffle.com/bbs/?pid=9125#p9125">here's a workaround</a>.</p> <p>v0.3 changes:</p> <p>Added: Multiplayer<br /> Added: Pico-8 sound editor<br /> Added: Item aliasing<br /> Added: Random alias selection (for loot dropping etc.)<br /> Added: Low camera angle<br /> Added: M-STATE:C-CRASH event caused by actors colliding at high speed<br /> Added: Bullet flag collide_with_sender<br /> Added: 2d png importer<br /> Changed: Debris and snow no longer settles underneath actors<br /> Changed: Friction applies to objects bouncing in z<br /> Fixed: Tiling actors in editor use incorrect spacing<br /> Fixed: Life less than zero trigger not activating before actor does not exist<br /> Fixed: Actors with negatiec gravity do not lift off the ground<br /> Fixed: Item id corruption after pasting from another file<br /> Fixed: Cart profile saving (favourites, game_in_progress)</p> http://www.lexaloffle.com/bbs/?tid=1679 http://www.lexaloffle.com/bbs/?tid=1679 Thu, 16 Oct 2014 15:01:01 UTC Voxatron 0.2.13 <p>Hey All</p> <p>Voxatron 0.2.13 builds are <a href="https://www.lexaloffle.com/games.php?page=my">now up</a>, and will shortly be up on Humble Store (check the version number in the filename). If you don't have a lexaloffle account (<a href="https://www.lexaloffle.com/games.php?page=my">Games &gt; My Games</a>) and would like one, you can activate it from your humble store page (<a href="https://www.lexaloffle.com/bbs/?tid=1207">see this thread</a>). To update from a Humble Store account, search your email for the download page link, or request a new one <a href="http://www.humblebundle.com/?s=resender">here</a>.</p> <p>The main two changes in 0.2.13 are much more flexible player control options, and moving to SDL2. </p> <p><h3>Player Controls</h3>The default player control style is now analogue, which means that you can run and shoot in any direction! This will eventually be an optional property of players, but for now I decided it doesn't badly break the design of any existing cartridges so set it as default. This means the mouse control style can be more natural -- using ASDW + the cursor as an absolute point to shoot at.</p> <img style="" border=0 src="https://www.lexaloffle.com/gfx/g_controls.gif" alt="" /> <p>Many users asked for this early on, but I stubbornly held out with a more minimal 8-way control set, wanting to keep the controls across games more simple, genre-agnostic, retro-feeling and unified. I was really, really wrong about that! -- it doesn't hurt to have analogue control in the vast majority of cases (even though existing carts weren't design for it), and it of course makes hardcore arena shooting much more fun.</p> <p>It's also possible to assign buttons to various actions in the player designer, but more on that soon. (For a preview, check out the list of button actions in the player controls setup menu).</p> <p><h3>SDL2</h3>SDL is the core library that Voxatron uses to do operating system-level things like window management and to talk to hardware (controllers, sound and video). SDL2 provides better controller configuration, multi-monitor support and doesn't crash on startup under recent versions of OSX (!) It also means I've had to change quite a lot of historically stable code, so there might be a few small glitches in this department for the next couple of updates.</p> <p>SDL2 has quite a nice controller configuration scheme, where many common controller layouts are automatically detected on startup and a best guess at the layout is made from a database supplied from other users (including a large number of Steam users). It's possible to add extra controllers or alternative mappings using the standard SDL2 layout syntax by adding a line sdl_controllers.txt (see vox.txt for details), rather than using the in-game config in earlier versions. This might cause some disruption for a few users, but should make controller setup much easier and more consistent in the long run.</p> <p>** Linux users: The linux installer doesn't give you SDL2 automatically, so please either manually install SDL2 (<a href="http://www.libsdl.org">http://www.libsdl.org</a>) or wait for a follow-up update next week that will hopefully fix this.</p> <p>Updated (but still very wip) manual:<br /> <a href="https://lexaloffle.com/files/docs/voxatron_manual_213.html"><a href="https://lexaloffle.com/files/docs/voxatron_manual_213.html">https://lexaloffle.com/files/docs/voxatron_manual_213.html</a></a></p> <p>Changes:</p> <p>v0.2.13</p> <p>Added: Analogue player movement and facing control<br /> Added: Custom control mappings per player<br /> Added: Inventory items assigned a useage button<br /> Added: Transparent voxel rendering in Designer<br /> Added: Cartridge metadata section with 2d 60x32 label<br /> Added: Capture cartridge preview image in-game (F7)<br /> Added: default_sounds flag for actors<br /> Added: car-style control (turn left, right, accelerate)<br /> Added: Low air friction flag in actor properties (on by default)<br /> Changed: Moved to SDL2: better multiple monitor support, controller support and fixes OSX startup crash<br /> Changed: Game controllers now customisable sdl's scheme (~/.lexaloffle/Voxatron/sdl_controllers.txt)<br /> Changed: Control configuration format and default config values // camera is now O, P<br /> Changed: Any actor now has low air friction after being thrown<br /> Changed: Mouse control now uses absolute cursor position to determine player facing<br /> Changed: Players have warp-in flag<br /> Changed: Better 2d drawing for depth==1 props<br /> Fixed: Duplicate object instance ids when dragging to draw multiple objects or stamping<br /> Fixed: Internal pickup friction and mass<br /> Fixed: Loading and saving a cartridge clobbers existing preview image<br /> Fixed: Throwing using directional controls<br /> Fixed: Import .xm file now fails gracefully for unsupported files (&gt; 128k or &gt; 8 channels)<br /> Fixed: Jumping twice quickly causing annoying jump sound retrigger<br /> Fixed: Actors not observing warp-in property at t=0<br /> Fixed: Legacy default player starting position sometimes not at center of room</p> http://www.lexaloffle.com/bbs/?tid=1661 http://www.lexaloffle.com/bbs/?tid=1661 Thu, 14 Aug 2014 18:59:15 UTC Voxatron 0.2.12 <p>Hey All</p> <p>Voxatron 0.2.12 builds are <a href="https://www.lexaloffle.com/games.php?page=my">now up</a>, and will shortly be up on Humble Store (check the version number in the filename). If you don't have a lexaloffle account (<a href="https://www.lexaloffle.com/games.php?page=my">Games &gt; My Games</a>) and would like one, you can activate it from your humble store page (<a href="https://www.lexaloffle.com/bbs/?tid=1207">see this thread</a>). To update from a Humble Store account, search your email for the download page link, or request a new one <a href="http://www.humblebundle.com/?s=resender">here</a>.</p> <p>Another update for folks designing stuff.. doors, Designer performance, .qb file importing, object instance browsing and title screen support. As usual earlier carts should still function roughly the same, but let me know if you notice any breakage. If there aren't any show-stopping bugs, I'm going to work on getting the <a href="https://www.lexaloffle.com/bbs/files/1/voxatron_manual_0.html">manual</a> up to date and posting some tutorials, but for now here's a quick intro to new features..<br /> <br> <a href="http://www.lexaloffle.com/bbs/?tid=1629">:: Read More </a> http://www.lexaloffle.com/bbs/?tid=1629 http://www.lexaloffle.com/bbs/?tid=1629 Thu, 29 May 2014 19:02:16 UTC Labels <p>Here's a WIP preview of labels designed for Voxatron 0.3.* releases. They will be mostly brushed up existing cartridges (e.g. Twisty Castle will be extended and given a 2P option), but there are a couple of news ones too. I'll let you guess what they are for now :)</p> <img style="" border=0 src="files/1/alpha_cart_labels.png" width=528 height=448 alt="" /> <p>Also just a heads up for designers, it looks like 0.2.12, which irons out doors, title screens, and many little engine details, will be ready at the end of this week.</p> <p>Catch you soon!</p> <ul> <li>z</li> </ul> http://www.lexaloffle.com/bbs/?tid=1626 http://www.lexaloffle.com/bbs/?tid=1626 Mon, 26 May 2014 19:27:17 UTC Voxatron 0.2.11 <p>Hey All</p> <p>Voxatron 0.2.11 builds are <a href="https://www.lexaloffle.com/games.php?page=my">now up</a>, and will shortly be up on Humble Store (check the version number in the filename). If you don't have a lexaloffle account (<a href="https://www.lexaloffle.com/games.php?page=my">Games &gt; My Games</a>) and would like one, you can activate it from your humble store page (<a href="https://www.lexaloffle.com/bbs/?tid=1207">see this thread</a>). To update from a Humble Store account, search your email for the download page link, or request a new one <a href="http://www.humblebundle.com/?s=resender">here</a>.</p> <p>v0.2.11 is mostly a bug-fixing update, but it does include one new type of object: fonts.<br /> To use a font for drawing into a prop, make sure it is the only one selected as 'default font' (I'll make that easier later!), and then while editing the prop, open the console (escape) and type @SOMETHING. The text will be drawn in the currently selected colour.</p> <p>Note that it's case sensitive, and the default font included only contains capital letters. To make your own font or extend the default one, just add the characters in any order and name them as themselves.</p> <p>A couple of things I've bumped to 0.2.12 to get this update out earlier are the music importing bugs and also importing Qubicle .qb models. But next up is better documentation and some more tutorial carts!</p> <p>Changes in v0.2.11:</p> <p>Added: Fonts<br /> Added: Collide events for particular sides<br /> Fixed: Draw text command<br /> Fixed: Shoot button triggered by movement button events<br /> Fixed: Missing voxel cursor<br /> Fixed: Actors can fall through thin pieces of floor<br /> Fixed: Rotated non-square actors get stuck / climb walls<br /> Fixed: +1 Life logic<br /> Fixed: Sword base weapon starts as peagun for single shot<br /> Fixed: Microscript DEF_ID, OBJ_ID selectors<br /> Fixed: Paste into current item crashes<br /> Fixed: Crash when saving world state<br /> Fixed: Can draw boxes in title screen with mouse<br /> Fixed: Freeze pickup destroys falling debris<br /> Fixed: Bullet leaving debris incorrectly<br /> Fixed: Crash for short rooms<br /> Fixed: Invalid extend_walls value handled robustly<br /> Fixed: LERP over 0 seconds crash<br /> Fixed: help tip drawn over top of checkboxes</p> http://www.lexaloffle.com/bbs/?tid=1604 http://www.lexaloffle.com/bbs/?tid=1604 Sat, 19 Apr 2014 16:34:08 UTC