TIC-80 is a fantasy computer for making, playing and sharing tiny games.

Overview

Build Status

TIC-80 TIC-80 TINY COMPUTER - https://tic80.com

About

TIC-80 is a FREE and OPEN SOURCE fantasy computer for making, playing and sharing tiny games.

With TIC-80 you get built-in tools for development: code, sprites, maps, sound editors and the command line, which is enough to create a mini retro game.

Games are packaged into a cartridge file, which can be easily distributed. TIC-80 works on all popular platforms. This means your cartridge can be played in any device.

To make a retro styled game, the whole process of creation and execution takes place under some technical limitations: 240x136 pixel display, 16 color palette, 256 8x8 color sprites, 4 channel sound, etc.

TIC-80

Features

  • Multiple programming languages: Lua, Moonscript, Javascript, Wren, Fennel, and Squirrel.
  • Games can have mouse and keyboard as input
  • Games can have up to 4 controllers as input (with up to 8 buttons, each)
  • Built-in editors: for code, sprites, world maps, sound effects and music
  • An aditional memory bank: load different assets from your cartridge while your game is executing

Binary Downloads

You can download compiled versions for the major operating systems directly from our releases page.

Pro Version

To help support TIC-80 development, we have a PRO Version. This version has a few additional features and binaries can only be downloaded on our Itch.io page.

For users who can't spend the money, we made it easy to build the pro version from the source code. (cmake .. -DBUILD_PRO=On)

Pro features

  • Save/load cartridges in text format, and create your game in any editor you want, also useful for version control systems.
  • Even more memory banks: instead of having only 1 memory bank you have 8.
  • Export your game without editors, and then publish it to app stores (WIP).

Community

You can play and share games, tools and music at https://tic80.com/play.

The community also hangs out and discusses on Telegram or Discord.

Contributing

You can contribute by issuing a bug or requesting a new feature on our issues page. Keep in mind when engaging on a discussion to follow our Code of Conduct.

You can also contribute by reviewing or improving our wiki. The wiki holds TIC-80 documentation, code snippets and game development tutorials.

Build instructions

Windows

with Visual Studio 2017

  • install Visual Studio 2017
  • install git
  • run following commands in cmd
git clone --recursive https://github.com/nesbox/TIC-80 && cd TIC-80/build
cmake -G "Visual Studio 15 2017 Win64" ..
  • open TIC-80.sln and build
  • enjoy :)

with MinGW

git clone --recursive https://github.com/nesbox/TIC-80 && cd TIC-80/build
cmake -G "MinGW Makefiles" ..
mingw32-make -j4

Linux

Ubuntu 14.04

run the following commands in the Terminal

sudo apt-get install git cmake libgtk-3-dev libgles1-mesa-dev libglu-dev -y
git clone --recursive https://github.com/nesbox/TIC-80 && cd TIC-80/build
cmake ..
make -j4

to install the latest CMake:

wget "https://cmake.org/files/v3.12/cmake-3.12.0-Linux-x86_64.sh"
sudo sh cmake-3.12.0-Linux-x86_64.sh --skip-license --prefix=/usr

Ubuntu 18.04

run the following commands in the Terminal

sudo apt-get install g++ git cmake libgtk-3-dev libglvnd-dev libglu1-mesa-dev freeglut3-dev libasound2-dev -y
git clone --recursive https://github.com/nesbox/TIC-80 && cd TIC-80/build
cmake ..
make -j4

Raspberry Pi (Retropie)

First, add jessie-backports repo to your /etc/apt/sources.list

deb http://ftp.debian.org/debian jessie-backports main

Then run the following commands in the Terminal

# required public keys
gpg --keyserver pgpkeys.mit.edu --recv-key  8B48AD6246925553      
gpg -a --export 8B48AD6246925553 | sudo apt-key add -
gpg --keyserver pgpkeys.mit.edu --recv-key 7638D0442B90D010
gpg -a --export 7638D0442B90D010 | sudo apt-key add -

# upgrade system
sudo apt-get update
sudo apt-get dist-upgrade

# install software
sudo apt-get install git build-essential libgtk-3-dev libsdl2-dev zlib1g-dev
sudo apt-get install -t jessie-backports liblua5.3-dev
git clone --recursive https://github.com/nesbox/TIC-80 && cd TIC-80/build
cmake ..
make -j4

Note: If you are using a normal Raspberry Pi image (not Retropie) you may not have OpenGL drivers enabled. Run sudo raspi-config, then select 7 for "Advanced Options", followed by 6 for "GL Drivers", and enable "GL (Fake KMS) Desktop Driver". After changing this setting, reboot.

Mac

install Command Line Tools for Xcode and brew package manager

run the following commands in the Terminal

brew install git cmake
git clone --recursive https://github.com/nesbox/TIC-80 && cd TIC-80/build
cmake ..
make -j4

iOS / tvOS

You can find iOS/tvOS version here

Credits

Comments
  • [Feature Request] Cartridge embedded in PNG export for easy sharing

    [Feature Request] Cartridge embedded in PNG export for easy sharing

    The ability to create a png with a .tic cartridge embedded and the game's f7 cover image displayed (and also subsequently easily being able to load it) would be extremely useful. A png image is much easier to share than a .tic file as nearly every website accepts .pngs (provided no compression is done) with very few accepting indeterminate file types. It also adds a visual element helping tic cartridges naturally stand out on webpages and in filesystem thumbnails and being able to easily distinguish between them.

    Several similar fantasy consoles also have this feature and it is a very popular way to share creations.

    enhancement 
    opened by ElfEars 50
  • Linux Sound Lag

    Linux Sound Lag

    On the "Game Menu", surf and sound in games, it has a delay before playing the sound. (Both fullscreen and windowed mode) I built the pro version myself (if that helps)

    Doesn't affect using the Web Version on Chrome

    opened by MrDiamond123 41
  • [Suggestion] Treat TIC()+SNC() and OVR()+BDR() as two different layers

    [Suggestion] Treat TIC()+SNC() and OVR()+BDR() as two different layers

    I'm extremely confused about how OVR and BDR should be used. It seems that OVR were implemented in the API to be able to do things like having a waving background while drawing the sprites correctly, but the way it work is odd, trying to poke things like the screen offset values do nothing at all. And for now BDR just do the same as SCN but with more lines, and nothing that were drawing during the OVR are affected by it.

    My suggestion would be to make OVR and BDR act the same as TIC and SCN but as if it were a "second layer", so any poke'd values will not affect the "first layer".

    Note: With OVR acting like TIC I'm only referring to rendering and vram access, just to make it completely clear.

    enhancement 
    opened by Weeppiko 40
  • Low-level API concerns (WASM, etc)

    Low-level API concerns (WASM, etc)

    Much of the TIC-80 API is potentially problematic because of default values/variable args. (ie our scripting languages allow passing a variable number of arguments, and in WASM that is not easily possible)

    In other places the API is problematic because using -1 as a "default placeholder" would mix types, such as when the value is supposed to be a boolean. Ie, in Zig for example there is no way a function can return an integer in one place and a boolean in another... it's one or the other, those are not compatible types.

    • btn() - the default form that returns a numeric, the btn(x) variant returns a boolean
    • font (take booleans)
    • print (take booleans)

    Or you have cases when the input CAN be negative but the value is also optional:

    • map - the sx and sy arguments, etc

    Many others take only positive numeric arguments and I think using -1 could work there such as:

    • cls
    • clip
    • etc
    • sfx
    • pix
    • etc

    Originally posted by @msx80 in https://github.com/nesbox/TIC-80/issues/1259#issuecomment-1004032808 :

    I feel like the "simple just works" TIC approach boiled down to WASM might would be -1 for "i dunno" or "just do the right thing"... ie, no one would need to know the defaults to call the API - that would be all handled INSIDE TIC, not WASM. So to call sync(), effectively sync(0,0,false) you would need to know that -1 was "default" and the number of arguments (to push the right number of args onto the stack).

    So the problem with how to map the API to simpler languages (like C or wasm) is tougth. Maybe we could do a separated issue for this?

    Anyway, i think there are two ways: one where the defaults are implemented in the language and one were they're implemented in TIC. I also think the second one offer more value (you avoid repeating all the defaults values), but it's a bit harder to implements. It would require changes to the tic80 layer (which is not much trouble).

    The most delicate thing would be to choose a value to communicate "default" to tic80. You propose -1 which works for most cases but what if -1 is also a valid option for the parameter? I think tic80 accepts negative values for coordinates in api. In "map" you can pass negatives to sx and sy, -1 would be ambiguous as the default is 0.

    PS we already have some kind of "c api" in api.h. I think it's sensible to use it (or at least take it into consideration)

    API lang: wasm 
    opened by joshgoebel 36
  • Adding WebAssembly runtime support via BINARY chunks

    Adding WebAssembly runtime support via BINARY chunks

    hi there! is there any interest in adding WebAssembly as a supported "language"? I've been experimenting with this wasm interpreter, it can run binary wasm file by interpreting the bytecode. It's pretty easy to attach custom api functions and claims to be pretty fast. Obviously it won't be editable inside tic-80 editor (we could show a base64 encoding or something) but it would open up a lot of possibilities, like making games in any language that targets WebAssembly.

    wasm3 looks like a well written software, doesn't have dependencies and is standard c, should compile on most platforms.

    i'd like to give it a try eventually :)

    enhancement lang: wasm 
    opened by msx80 35
  • Anbernic RG351M with ArkOS - most games lag terribly

    Anbernic RG351M with ArkOS - most games lag terribly

    I just found out about TIC-80 so i downloaded a few games from https://tic80.com added it into the folder on the SD cards. But most games just studders terribly or slow motion.

    From maybe 10 games that I tried only Witch 'em Up and Cauliflower Power runs smooth.

    v. 0.90.1748

    opened by Mr-Bajs 34
  • Discussion: OVR needs a rethink, it makes no

    Discussion: OVR needs a rethink, it makes no "hardware" sense

    OVR feels very "bolted" on and like we're just pulling stuff out of a hat. I think some thought needs to go into how it works and see if we can course correct - or if we care (though I'd be sad if we don't as to me this is taking a step away from a fantasy hardware console it's just fantasy in general). I feel like the decisions being made with regard to OVR are very different than prior decision made and it's muddling the platform.

    TIC-80 feels like a real fantasy computer underneath, that's part of it's charm

    The rest of the platform behavior feels very "rooted in [fantasy] hardware" for the most part... what does pix do? It writes to VRAM... you can implement your own pix - you don't have to use the system one, etc... The audio state exists in RAM. The palette exists in RAM. The mouse state exists in RAM. Underneath the API is "real" fantasy "hardware". The API is merely interacting with the hardware.

    Meanwhile, OVR is complete voodoo that violates all this... For example:

    • If I draw a line in OVR it seems to "disappear" come the next frame?
      • How? why?
      • Was it not written to VRAM?
      • If not, how did it get painted to the screen at all?
    • Yet, if I poke two pixels in OVR they are persistent forever.

    So, the question:

    How would I write my own line function that has the same behavior the internal line function? IE (in hardware terms) I want to write to the OVERLAY RAM - so that my line only persists during the overlay phase - just like the built in line. In the past that has always been possible - writing functions to replace the internal API - because underneath it all was just the RAM/VRAM/magic memory register locations, etc...


    OVR is a violation of the fantasy computer aspect

    OVR is step off the path and I'd love to see if there is any way to fix this and get us back on the path. If there is truly hidden OVR RAM - and that's the hardware explanation, then we should expose it as VRAM and make the machine a 112kb machine... I realize the memory map is "full", but there is no reason it can't be expanded at the top-end... OR that a more manual "banked" approach couldn't be taken to VRAM the same as is taken with the other areas of cartridge "ROM".

    For example, allow, VRAM banking:

    vbank(0) -- default VRAM
    vbank(1) -- OVR VRAM (contents are drawn overtop of default VRAM)
    -- OR
    VRAM = 1 << 8 -- bitmask for VRAM banking
    sync(VRAM, 0) 
    sync(VRAM, 1) 
    

    Then the hardware story could be that there is 32KB of VRAM... accessible in two banks. OVR and TIC could "magically" tickle the "hardware" such that the appropriate bank is addressed at the right time, etc... so now if I want to write a line function that draws only to OVR then I just poke into the OVR VRAM bank (1)... it's very clear how the "hardware" is working - no more magic.

    I'm not saying this is perfect solution (the transparency aspect of OVR VRAM would be an open question). I'm just trying to point out the problem, shed some light on it, and start a discussion about making this all make more sense in the future.


    Summary

    Again the key question here (which should have an answer from a hardware perspective):

    How would I write my own line function that has the same behavior the internal line function during OVR? (ie, how do I write directly to OVR buffer, but NOT the screen buffer using the hardware, not the API)

    And questions for thought:

    • Should the API be allowed/able to do things that are impossible to do by poking/peeking the RAM directly?
    • If so, when is this allowable and when should it be discouraged?

    If/when the core TIC API could be entirely replaced by peek/pokeing the "hardware" I'd say we've achieved a very high fidelity of being a real "fantasy computer" under the covers - which I've always felt was a key goal of the project (am I wrong?). The less this holds true the more we become just a "gaming platform/engine" like https://domeengine.com and less of a "fantasy computer".


    An analogy how how I feel like lost the path with OVR

    Silly example: lets say we decided to add a "high res" mode that 480x272 or a "high color" mode (256 colors)... you could do this two ways:

    • Rethink the memory layout, increasing addressable VRAM to 32kb or 64kb to allow for more data
    • Just say "it's magic, high res mode doesn't use VRAM just use the API functions instead"... ie, peek and poke become meaningless. The idea that it's "real hardware" under the surface becomes meaningless. There is no attempt to explain how "high res" or "high color " mode actually functions with respect to the underlying fantasy hardware.

    The latter is what I feel we've done (so far) with OVR and what I'd love to see course corrected.


    you can't modify the SCN palette during OVR because both palettes are in the same address and can only be accessed during their respective phases.

    NOW this is sounding vaguely familiar. There is the "hidden" OVR palette that doesn't exist in RAM (already a slight problem IMHO from a "hardware" perspective) and then is swapped in during OVR I suppose? So perhaps it is as you say, that the palettes are "magically banked" between OVR and non-OVR...

    One can easily imagine a reasonable story here, for example:

    The TIC "hardware" has 48 bytes of internal reserved RAM used exclusively for the Overlay palette. During the OVR pass this RAM is mapped into the PALETTE address space (making it accessible to peek/poke, etc)... and after OVR concluded that memory is remapped to the regular PALETTE RAM.

    If that's the story, this should probably be better documented on the wiki. I'd love to hear a similar story for how OVR is suppose to existing in a fantasy hardware sense. I really think we should have one to guide the decisions we're making there from a "hardware" perspective.

    Just saying the same thing with regards to ALL of VRAM - that there is a whole 16kb of internal reserved RAM that the "hardware" magically swaps in and out is kind of a tall order IMHO. If that's the story though we should document it and stick to it and make sure the behavior is consistent with that.

    Originally posted by @joshgoebel in https://github.com/nesbox/TIC-80/issues/1632#issuecomment-960419302

    discussion 
    opened by joshgoebel 31
  • Ruby scripting support

    Ruby scripting support

    This PR adds support for the Ruby programming language, or to be precise a slimmed down variant of Ruby called MRuby.

    Resources

     

    pre-0.90 Description This PR adds basic support for [Ruby](https://www.ruby-lang.org) scripting via [MRuby](https://mruby.org/).

    I thought it'd be nice to have Ruby as an option for scripting, because it's widely used in WebDev (Rails, Sinatra, etc.), DevOps (Puppet, Chef, Vagrant), ITSec (Logstash, Metasploit) and probably in many more applications beyond my field of expertise (SketchUp being the first one to come to my mind).

    If you decided to merge, Ruby would make the second most popular language of those available in TIC (right after JavaScript).

    I've already tested this on Windows (10, x64) and Linux (openSUSE Tumbleweed) and it compiles without any problems. There are still ~macOS~, Emscripten and Android left to test, but: ~1) I'd have to install XCode my Mac;~ 2) I don't know how to x-compile for Emscripten; 3) I don't own any Android device.

    Apart from that, everything seems to work flawlessly. :wink:

    EDIT: Ran build on my Mac, it works there too.

    opened by remi6397 30
  • Error on openig in linux

    Error on openig in linux

    I'm on ArchLinux, i compiled this package this aur and also this this from tic.computer i always get an error code when i want to launch it:

    TIC-80 tiny computer 0.70.6
     http://tic.computer (C) 2017
    malloc(): invalid next size (unsorted)
    zsh: abort (core dumped)  ./tic80
    

    or this, from the compiled one, which i think its the same:

    TIC-80 tiny computer 0.80.1097-dev Pro
     http://tic80.com (C) 2020
    malloc(): invalid next size (unsorted)
    zsh: abort (core dumped)  tic80
    

    does tic80 have a dependency to RUN? i know it has some to build. take a look at the aur package pkgbuild i compiled.

    platform: linux 
    opened by narukeh 29
  • feature: sspr() function: multi tile sprite operations and palette swapping

    feature: sspr() function: multi tile sprite operations and palette swapping

    spr() function, but extended to operate #on multiple tiles at once. Useful for larger sprites. Similar to pico 8 function: spr( n, x, y, [w,] [h,] [flip_x,] [flip_y] )

    A useful addition would be per-sprite palette swaps, for color cycling effects and animations, like on the real NES. In this case, a palette editor, and palette selector in the sprite editor would be handy.

    sspr(id, x, y, [w [h [colorkey [pal_id [scale [flip [rotate] ] ] ] ] ] ])

    enhancement API 
    opened by ambyra 29
  • Ruby scripting support

    Ruby scripting support

    Replaces #1006

    This PR adds support for the Ruby programming language, or to be precise a lightweight implementation of Ruby called MRuby.

    Resources


    pre-0.90 Description This PR adds basic support for [Ruby](https://www.ruby-lang.org) scripting via [MRuby](https://mruby.org/).

    I thought it'd be nice to have Ruby as an option for scripting, because it's widely used in WebDev (Rails, Sinatra, etc.), DevOps (Puppet, Chef, Vagrant), ITSec (Logstash, Metasploit) and probably in many more applications beyond my field of expertise (SketchUp being the first one to come to my mind).

    If you decided to merge, Ruby would make the second most popular language of those available in TIC (right after JavaScript).

    I've already tested this on Windows (10, x64) and Linux (openSUSE Tumbleweed) and it compiles without any problems. There are still ~macOS~, Emscripten and Android left to test, but: ~1) I'd have to install XCode my Mac;~ 2) I don't know how to x-compile for Emscripten; 3) I don't own any Android device.

    Apart from that, everything seems to work flawlessly. :wink:

    EDIT: Ran build on my Mac, it works there too.

    opened by remi6397 28
  • HTML versions not loading cart automatically on dev builds when exported without editors

    HTML versions not loading cart automatically on dev builds when exported without editors

    HTML carts exported without editors for whatever reason don't load the cart automatically on startup. From my testing this only affects the non-stable versions I have (1.0.2149-dev Pro (9a53121), 1.0.2246-dev (d23ffe1) and 1.0.2246-dev Pro (d23ffe1)), and doesn't affect the stable 0.90 and 1.0 executables. This also appears to only affect HTML exports, as Windows exports work fine for me (Windows is the only other platform I can test).

    dir shows that the cart does exist and you can use load to load it and run it manually, but it doesn't do it automatically. However, if alone=1 is specified when exporting, the cart will load automatically without issue. The actual cart contents don't seem to matter, as all of the above happens on all carts I've tried exporting.

    opened by PAPERMOON-SO 0
  • Enforce CPU and RAM limits

    Enforce CPU and RAM limits

    There were past discussions about limiting somehow the performance of TIC-80 (e.g. #1007), but I did not understand if such feature is not wanted at all by the community or if it was just delayed due to implementation difficulties. Since I think it would be in the spirit of the project, I try to summarize my understanding of the problem.

    TIC-80 aims to make simple to play and create old-style videogames. This means that it has to place limits to the resources, that for now regard:

    1. The size of the code
    2. The display resolution, sprite number, color, etc
    3. The sound output, track number, etc

    Someone feels that it should be added

    1. CPU speed limit
    2. RAM limit

    Someone else thinks that should be added:

    1. An assembler language in the spirit of old machines (WASM is too high level)

    Personally I think TIC-80 and similar projects are nice because let you to write games that have some old-style limitation, but without the problematic of the programming old machines. So I think 6) is out of the scope, moreover if you want an absolute realistic programming experience, you can program a game for, say, the NES and play it in an emulator (I bet all the needed tools can be found over the internet)

    Instead, I thing 4) and 5) are very important: without them you can produce games that were absolutely impossible to have on oldest machine, e.g. big open world, advanced AI enemies, software rendered 3D, and so on. What should be allowed in TIC-80 is not the topic of this post; here I want just to focus on how to enforce the limitations. In other words, I spoke of "Software Rendered 3D" but we could eventually decide to give enough resources to the machine to run "Wolfstain 3d"-like games.

    The most simply way to enforce 4) and 5), is similar to the one used in a other projects:

    p1) An option to run the lua language (e.g. with -- script: Lua-limited in the header) enabling checks on the number of executed instructions and used ram; when the limit is hit, "Something bad" happened, e.g. it is artificially slows down, or the system crashes with an error, or a annoying icon appears.

    This have the side effect that the games will run on every modern hardware in the same way, so, no more games that run well on a desktop, and are unplayable on raspberry. It can be also used just as a development policy, i.e. to develop the cartridge, 'lua-limited' is used, than it is switched to 'lua' when releasing.

    Since I see no drawbacks (well... except the fact that I do not know if it is doable for all the other supported languages), and since it is very simple to implement, I got the doubt that such feature is not wanted at all from the community.

    Moreover such solution still does not enforces true hard limits, e.g. hash tables access are still performed at maximum speed, there are 64 bit integers, and so on. I am not sure that this is an issue, after all we are just "Faking" and old console, and p1) could be enough to get the feeling. In any case, I think that the only way to enforce a true hard limit is:

    p2) A new scripting language with limited allocated ram, fixed cycle time, and without complex operation like table access.

    This would be more complex and quite interesting to write. In one of the assembler proposal (#1678) there was the implict goal to access the VRAM and other TIC-80 internals, directly, not through the API. I do not think this is desirable for the same reason that bring me to exclude the 6): the games must be old-style, but the programming experience should be modern and enjoyable.

    I believe that a very simple language that drives TIC-80 through the API probably can be written in 1-2 man-month.

    Now, the questions, i.e. the reason why I wrote this long post:

    • Are some kind of CPU + RAM limit desirable for the community?
    • If yes, do you prefer p1) or p2) (lua-limited vs dsl-language)?

    I think p1) absolutely worth since it will give fair results with minimal effort, while I am unsure about p2): it seems just funny to implement but it does not probably give much value.

    EDIT - other ideas popped out during the discussion:

    p3) Enforce the limits for WASM; some of (or all of ) IDE supported language must compile to WASM or have a VM compiled to WASM

    p4) CPU only - Measure the current machine performance and calculate a maximum time to be imposed between TIC() calls.

    opened by pocomane 10
  • pre-seed from web browser emulator

    pre-seed from web browser emulator

    Hello!

    I am currently struggling with something. I have a usecase where I produce a generator as a tic-80 cartridge, export it via the web export, and now wish to modify the seed for the prng from the browser.

    I've explored a few different options, but what I've been trying lately is to read in the cart.tic file before it's loaded, search for the seed=[some number] line, and replace it, then saving cart.tic

    It doesn't work, and I was wondering if anyone could help me figure out why? This is my javascript code "seed_fuckery.js", which I am loading prior to loading the emulator:

    // Read the contents of the cart.tic file using an XHR request
    const xhr = new XMLHttpRequest();
    xhr.open('GET', 'cart.tic', true);
    xhr.responseType = 'arraybuffer';
    xhr.onload = function() {
      console.log("Loaded cart.tic");
      // Convert the data to an array of bytes
      const bytes = new Uint8Array(xhr.response);
    
      // Create a file-like object from the array of bytes
      const file = new Blob([bytes], { type: 'application/wasm' });
    
      // Read the contents of the file using the FileReader API
      const fileReader = new FileReader();
      fileReader.readAsArrayBuffer(file);
    
      fileReader.onload = function() {
        // Convert the data to an array of bytes
        const bytes = new Uint8Array(fileReader.result);
    
        // Iterate over the buffer, starting from the beginning
        let pos = 0;
        while (pos < bytes.length) {
          // Read the 4-byte header of the current chunk
          const header = bytes.slice(pos, pos + 4);
          pos += 4;
    
          // Extract the bank number and chunk type from the first byte of the header
          const bankNumber = header[0] >> 3;
          const chunkType = header[0] & 0x1F;
    
          // Extract the size of the chunk from the second and third bytes of the header
          const size = new DataView(header.buffer).getUint16(1, true);
    
          // Read the chunk data from the buffer
          const chunkData = bytes.slice(pos, pos + size);
          pos += size;
    
          // If the chunk type is 5 (code), process the chunk data
          if (chunkType === 5) {
            // Convert the chunk data from a buffer to a string
            const code = String.fromCharCode.apply(null, chunkData);
    
            // Find the line that reads "seed=42069" (or any number)
            const lines = code.split('\n');
            for (let i = 0; i < lines.length; i++) {
              const line = lines[i];
              console.log(line)
              if (line.startsWith('seed=')) {
                // Extract the old seed value
                const oldSeed = parseInt(line.slice(5));
                console.log(`Old seed: ${oldSeed}`);
    
                // Replace the old seed value with the new seed value
                const newSeed = Math.floor(fxrand()*1000000000);
                lines[i] = `seed=${newSeed}`;
                console.log(`New seed: ${newSeed}`);
              }
            }
    
            // Convert the modified code back to a buffer
            chunkData = Uint8Array.from(lines.join('\n').split('').map(c => c.charCodeAt(0)));
          }
    
          // Create a Blob from the modified chunk data and header
          const output = new Blob([header, chunkData], { type: 'application/wasm' });
    
          // Write the output Blob to the output.tic file using the FileSaver API
          saveAs(output, 'cart.tic');
        }
      }
    };
    
    opened by aebrer 8
  • [LINUX]

    [LINUX] "Up" and "Left" arrow keys permanently pressed with external USB keyboard

    Hi!

    As per issue title, it appears that the TIC-80 application on my computer is detecting the "up" and "left" arrow keys to be permanently pressed while my external USB keyboard is attached to my laptop.

    My setup:

    • Hardware: System76 Lemur Pro 10 with i7 CPU (see here)
    • OS: Arch Linux (updated as of 2022/12/16) with i3 desktop environment
    • TIC-80 Version: 1.0.2164 Pro (b09c50c)
    • External keyboard: "Anne Pro 2" (programmed with obinskit software)

    Reproduction steps:

    • Download, unzip and launch the TIC-80 application
    • Press "CTRL-R" (run the "hello world" cartridge)
    • The TIC-80 "character" immediately starts moving up and left, as if the "up" and "left" arrow keys were pressed

    Other notes:

    • Unplugging the external keyboard stops the character from moving. Replugging the keyboard resumes character moving
    • The issue does not appear on the web version of TIC-80, even with the keyboard plugged in
    • The issue does not appear if the keyboard is connected via bluetooth
    • In the latest development version 1.0.2254-dev (fb8ba3f), the issue still appears, but only the "up" arrow appears to be pressed

    Not a "breaking" bug (I can work around it by connecting via Bluetooth, but annoying nonetheless...

    Let me know if I can provide further info, and thanks for developing this great little fantasy computer!

    opened by RaelZero 0
Releases(v1.0.2164)
  • v1.0.2164(May 2, 2022)

    What's Changed

    • Added --version command line argument by @nalquas in https://github.com/nesbox/TIC-80/pull/1503
    • Handle emacs ^n ^p and ^e keys in the editor by @trufae in https://github.com/nesbox/TIC-80/pull/1530
    • sdl: Fix comparision warning by @RobLoach in https://github.com/nesbox/TIC-80/pull/1537
    • Add TIC_UNUSED() to handle unused parameter warnings by @RobLoach in https://github.com/nesbox/TIC-80/pull/1538
    • Update Fennel to version 0.10.0. by @technomancy in https://github.com/nesbox/TIC-80/pull/1539
    • fix path problems with baremeta #1541 by @msx80 in https://github.com/nesbox/TIC-80/pull/1582
    • Improvements for language support by @msx80 in https://github.com/nesbox/TIC-80/pull/1590
    • Baremetal RPI: added Squirrel language which was previously disabled. by @msx80 in https://github.com/nesbox/TIC-80/pull/1596
    • Fix eval command by @technomancy in https://github.com/nesbox/TIC-80/pull/1633
    • Optimize tic api call performance in LUA. by @vsariola in https://github.com/nesbox/TIC-80/pull/1628
    • #714: fix crackling audio. by @vsariola in https://github.com/nesbox/TIC-80/pull/1618
    • Activate strict mode in Fennel when strict: true header is found. by @technomancy in https://github.com/nesbox/TIC-80/pull/1653
    • Poke1 and Peek1 by @SuperPupperDoggo in https://github.com/nesbox/TIC-80/pull/1616
    • (fix) ignore negative index passed to spr by @joshgoebel in https://github.com/nesbox/TIC-80/pull/1665
    • (enh) errors when mkdir fails by @joshgoebel in https://github.com/nesbox/TIC-80/pull/1667
    • (chore) move moonscript into separate C file by @joshgoebel in https://github.com/nesbox/TIC-80/pull/1670
    • fixup: move moon script and fennel into sep files by @joshgoebel in https://github.com/nesbox/TIC-80/pull/1671
    • (enh) Music editor: Skip over sharp column when using cursor keys by @joshgoebel in https://github.com/nesbox/TIC-80/pull/1672
    • Fedora build instructions by @lzap in https://github.com/nesbox/TIC-80/pull/1679
    • add MacOS application instructions by @lzap in https://github.com/nesbox/TIC-80/pull/1680
    • suggest pro when trying to open source with standard by @joshgoebel in https://github.com/nesbox/TIC-80/pull/1684
    • Replace a right single apostrophe in the API help with an apostrophe by @blinry in https://github.com/nesbox/TIC-80/pull/1697
    • Improvements to README.md by @Tyler887 in https://github.com/nesbox/TIC-80/pull/1701
    • Add community guidelines by @Tyler887 in https://github.com/nesbox/TIC-80/pull/1703
    • Update Fennel to version 1.0.0. by @technomancy in https://github.com/nesbox/TIC-80/pull/1708
    • squirrel: Fix mouse() from returning null values by @RobLoach in https://github.com/nesbox/TIC-80/pull/1719
    • Add some missing spaces, and reword a few phrases by @blinry in https://github.com/nesbox/TIC-80/pull/1722
    • sdl: Fix warnings of string.h missing by @RobLoach in https://github.com/nesbox/TIC-80/pull/1724
    • Fix OpenDingux builds by @RobLoach in https://github.com/nesbox/TIC-80/pull/1725
    • Ruby scripting support by @remi6397 in https://github.com/nesbox/TIC-80/pull/1726
    • Small changes to the Ruby bindings by @remi6397 in https://github.com/nesbox/TIC-80/pull/1733
    • Add Shift+Return shortcut to the code editor that auto-closes a block by @blinry in https://github.com/nesbox/TIC-80/pull/1721
    • When listing language options in the spec, use "x, y, or z" format by @blinry in https://github.com/nesbox/TIC-80/pull/1745
    • On Linux, use Ctrl+L to clear the console, per default of other shells by @blinry in https://github.com/nesbox/TIC-80/pull/1753
    • Add help topics for keys and buttons by @blinry in https://github.com/nesbox/TIC-80/pull/1754
    • Typo: Correct variable was not getting updated by @joshgoebel in https://github.com/nesbox/TIC-80/pull/1783
    • Create SECURITY.md by @joshgoebel in https://github.com/nesbox/TIC-80/pull/1786
    • Console: cd with no args returns home by @joshgoebel in https://github.com/nesbox/TIC-80/pull/1789
    • add default license, version, site tags to demos by @joshgoebel in https://github.com/nesbox/TIC-80/pull/1790
    • support CTRL-A, CTRL-E console editing keystrokes by @joshgoebel in https://github.com/nesbox/TIC-80/pull/1791
    • (chore) bring all Demo header into sync with new tags by @joshgoebel in https://github.com/nesbox/TIC-80/pull/1793
    • fix: prevent cartridges hijacking keyboard events by @joshgoebel in https://github.com/nesbox/TIC-80/pull/1787
    • Do not default to the first available language for new carts. by @remi6397 in https://github.com/nesbox/TIC-80/pull/1792
    • (enh) moonscript supports eval now by @joshgoebel in https://github.com/nesbox/TIC-80/pull/1800
    • faster drawTile, remove repeat clipping checks by @joshgoebel in https://github.com/nesbox/TIC-80/pull/1801
    • order langauges by alphabetical order by @joshgoebel in https://github.com/nesbox/TIC-80/pull/1804
    • split out main menu code from studio by @joshgoebel in https://github.com/nesbox/TIC-80/pull/1813
    • Fix compilation for emscripten libretro by @phcoder in https://github.com/nesbox/TIC-80/pull/1821
    • mruby: Make Ruby Build Optional by @RobLoach in https://github.com/nesbox/TIC-80/pull/1823
    • Update SDL2 version by @luizdepra in https://github.com/nesbox/TIC-80/pull/1825
    • Export without editor in pro version is done. by @Darenn in https://github.com/nesbox/TIC-80/pull/1837
    • (chore) update Zig source to use new BOOT() by @joshgoebel in https://github.com/nesbox/TIC-80/pull/1863
    • [WIP] Advanced tab-completion for the console by @blinry in https://github.com/nesbox/TIC-80/pull/1840
    • fix(zig) fix template compiling and add TextureSource by @joshgoebel in https://github.com/nesbox/TIC-80/pull/1850
    • D WebAssembly binding by @PierceNg in https://github.com/nesbox/TIC-80/pull/1886
    • Fix crash when internet is disabled by @OldiLo in https://github.com/nesbox/TIC-80/pull/1890
    • Improved D template by @PierceNg in https://github.com/nesbox/TIC-80/pull/1891

    New Contributors

    • @trufae made their first contribution in https://github.com/nesbox/TIC-80/pull/1530
    • @vsariola made their first contribution in https://github.com/nesbox/TIC-80/pull/1628
    • @lzap made their first contribution in https://github.com/nesbox/TIC-80/pull/1679
    • @blinry made their first contribution in https://github.com/nesbox/TIC-80/pull/1697
    • @Tyler887 made their first contribution in https://github.com/nesbox/TIC-80/pull/1701
    • @remi6397 made their first contribution in https://github.com/nesbox/TIC-80/pull/1726
    • @luizdepra made their first contribution in https://github.com/nesbox/TIC-80/pull/1825
    • @Darenn made their first contribution in https://github.com/nesbox/TIC-80/pull/1837
    • @PierceNg made their first contribution in https://github.com/nesbox/TIC-80/pull/1886
    • @OldiLo made their first contribution in https://github.com/nesbox/TIC-80/pull/1890

    Full Changelog: https://github.com/nesbox/TIC-80/compare/0.90.1723...v1.0.2164

    Source code(tar.gz)
    Source code(zip)
    tic80-v1.0-android.apk(7.36 MB)
    tic80-v1.0-html.zip(997.97 KB)
    tic80-v1.0-linux.deb(1.81 MB)
    tic80-v1.0-linux.zip(1.81 MB)
    tic80-v1.0-mac.dmg(1.70 MB)
    tic80-v1.0-mac.zip(1.68 MB)
    tic80-v1.0-nintendo-3ds.zip(1.04 MB)
    tic80-v1.0-rpi-baremetal.zip(2.83 MB)
    tic80-v1.0-rpi.deb(3.10 MB)
    tic80-v1.0-rpi.zip(3.10 MB)
    tic80-v1.0-rpi4-baremetal.zip(2.46 MB)
    tic80-v1.0-win.zip(1.71 MB)
    tic80-v1.0-winxp.zip(1.40 MB)
  • v0.90.1723(Jul 16, 2021)

    CHANGELOG v0.90.1723

    CLOSED ISSUES

    1. #1517 - [0.90] "Cart has changed" dialog does not close
    2. #1513 - map editor: tile cursor not visible in 0.90
    3. #1494 - [0.90] Watcher fails when loading multiple carts
    4. #1510 - Unable to draw to bigger circles in 0.90
    5. #1499 - TIC-80 keeps stopping (Android)
    6. #1490 - [0.90] (Win7) getsystemtimepreciseasfiletime error in exported executable
    7. #1501 - TIC-80 is not opening on linux
    8. #1493 - Wonky icon [0.90 Bug]
    9. #1495 - [0.90] TIC-80 does not start
    10. #1492 - [0.90]No name and author name by pressing Ctrl+S to save cart.png
    11. #1496 - Won't Start in Firefox
    12. #1489 - [0.90 bug] ctrl+r returns multiple times

    CHANGELOG v0.90.1706

    THANKS to all the people who helped release this version, especially the contributors

    @cogk @Voklen @brickviking @schraf @Karethoth @jminor @cgrs @RobLoach @txgruppi @tstopak @phlubby @joshgoebel @technomancy @nalquas @msx80 @asiekierka @drako0812

    MAIN CHANGES

    image

    Added text selection/copy/paste to the console

    ezgif-1-3ed349c748d5


    A cart can be saved and distributes as a PNG image, use save game.png command. meat


    TIC-80 can work like a compiler without UI with --cli command line parameter, for example here we load game.tic cart from current dir (use --fs .) and export it as game.exe executable for Windows:

    $ ./tic80 --cli --fs . --cmd "load game.tic & export win game.exe & exit"
    
    cart game.tic loaded!
    use RUN command to run it
    
    GET /export/0.90/win [100%]
    
    game.exe exported :)
    

    Also, games can be exported without access to the editors with alone=1 flag (PRO feature) export linux game.exe alone=1


    The help command was redesigned and you can get info about spec/ram/api/command/...

    >help
    
    usage: help [<text>|version|welcome|
    spec|ram|vram|commands|api|startup|
    terms|license]
    
    >help api
    API functions:
    OVR SCN TIC btn btnp circ circb clip 
    cls elli ellib exit fget font fset key 
    keyp line map memcpy memset mget mouse 
    mset music peek peek4 pix pmem poke 
    poke4 print rect rectb reset sfx spr 
    sync textri time trace tri trib tstamp
    
    >help sync
    ---=== API ===---
    sync(mask=0 bank=0 tocart=false)
    
    The pro version of TIC-80 contains 8 
    memory banks.
    To switch between these banks, sync can 
    be used to either load contents from a 
    memory bank to runtime, or save 
    contents from the active runtime to a 
    bank.
    The function can only be called once 
    per frame.If you have manipulated the 
    runtime memory (e.g. by using mset), 
    you can reset the active state by 
    calling sync(0,0,false).
    This resets the whole runtime memory to 
    the contents of bank 0.Note that sync 
    is not used to load code from banks; 
    this is done automatically.
    

    Another useful thing you can export whole help info in Markdown format, use command export help cheatsheet.md


    Added mouse capture functionality to receive relative values instead of the current cursor position (useful in first-person 3D games), the cursor is hidden and this mode. To enable this mode pls use poke(0x7FC3F,1,1) command. Small example with enabling the relative mode:

    function flip(val)return val>0 and 0 or 1 end
    
    function TIC()
    	if btnp(4)then 
    		poke(0x7FC3F,flip(peek(0x7FC3F,1)),1)
    	end	
    		
    	cls()
    	local x,y=mouse()
    	print(x..":"..y)
    end
    

    Added baremetal/rpi/3ds builds to Github Actions and all the Nightly Builds can be downloaded here https://nightly.link/nesbox/TIC-80/workflows/build/master


    Now you can change bit mode in the map editor ezgif-1-4c01dcf4fc08


    On Android, you can switch between the system keyboard and TIC-80 internal keyboard image Hardware keyboard now detects automatically.

    CLOSED ISSUES

    1. #1486 - Problems with Jxx and row parameter of the music () function again present. Old lines are being used in src/core/sound.c
    2. #1482 - Website: Can’t upload Fennel cartridges
    3. #1480 - Website: Page titles
    4. #1477 - saveid not working when exporting with alone=1
    5. #1475 - Add an additional parameter to peek/poke functions for diferent bit resolutions
    6. #1469 - TIC-80 crash on Windows XP
    7. #1455 - Move all the icons to the config.lua
    8. #1454 - TIC throws OOMs when trying to run this cart in browser
    9. #1447 - Cursor shows over bookmarks tab
    10. #1446 - M command retriggers note
    11. #1434 - map editor select appears over show tiles
    12. #1430 - Horizontal scrolling while shift is held
    13. #1421 - Navigate palette with [ and ] keys
    14. #1414 - Please add Git SHA to the build number version in console
    15. #1405 - Code outline items corruption
    16. #1398 - TIC-80 Crashes when I stream it in a Discord voice channel.
    17. #1396 - Buffer Overflow Vulnerability in src/studio/fs.c
    18. #1395 - Distribute Linux version as zip on itch.io for better itch.io app integration
    19. #1394 - Incorrect OVR palette
    20. #1388 - RESUME command doesn't restore screen bug
    21. #1380 - Update wiki: CHUNK_SCREEN, tic_screen, sync, etc.
    22. #1372 - Path does not update on console correctly bug
    23. #1370 - Editor does not update when pressing enter bug
    24. #1360 - music function crashes in javascript bug
    25. #1356 - Saving cartridge crashes the dev (Pro) build bug
    26. #1345 - Crash in editor with 1BPP mode bug
    27. #1343 - (end) add "Debug" to TIC_VERSION_LABEL for debug builds
    28. #1338 - TIC80 Freezes When Trying To Run Game After Saving As Lua bug
    29. #1332 - alt-tab inserts a space in the code editor bug
    30. #1331 - Little pause at the beginning of the music
    31. #1326 - current build crashes on 3ds
    32. #1323 - duktape submodule fetches all duktape versions ever released
    33. #1319 - Add new & popular filter to the website
    34. #1315 - Add pagination to the website website
    35. #1312 - [Request] Please add THEME.CODE.FG to alter foreground text in code editor
    36. #1308 - Add a chunk to load default palette/waveforms
    37. #1306 - Game exits to the console if you press ESC twice
    38. #1290 - Live reload not working bug
    39. #1282 - Dividing by Zero in line function causes Tic-80 to crash. bug
    40. #1275 - Please add back ability to name gifs
    41. #1273 - Distorted sound with 0.80.1345 Pro on Linux
    42. #1271 - new fennel creates the cart with the old palette
    43. #1269 - tic80 -h command outputs to nowhere unless redirected
    44. #1268 - Zlib compression does not seem to work in 0.80+ versions of TIC-80
    45. #1267 - Command line arguments do not work anymore in the latest commit
    46. #1264 - Make all the network requests async
    47. #1255 - CRT effect in mac
    48. #1254 - better clipboard support
    49. #1247 - Make TIC work more like a compiler. console
    50. #1246 - Add benchmark demos for every supported script.
    51. #1240 - When compiling TIC-80 with GCC Mingw-w64 it (mingw64) adds additional DLL dependencies
    52. #1239 - Gif export does not automatically add .gif extension
    53. #1227 - Feature: Add colors to text with control characters (like Commodore 64)
    54. #1226 - music() parameter changed? bug lang: javascript
    55. #1225 - Change Bits Per Pixel in the Map Editor editor: map
    56. #1224 - install target on Linux does not follow CMAKE_INSTALL_PREFIX
    57. #1220 - In HTML exported games, all unused buttons on Xbox One controller open/close the TIC menu
    58. #1216 - Please add a export for web platform: html5
    59. #1213 - Default text color is now a dark grey
    60. #1210 - Missing Xext.h on Armbian buster
    61. #1206 - Minor bug when typing "cd "
    62. #1205 - 0.80 running quite slower than 0.70.6
    63. #1195 - editor outline command ctrl+o scrolling not possible
    64. #1193 - Music() function with tempo parameters API
    65. #1192 - editor command for comment/uncomment for multiple lines bug editor: code
    66. #1188 - Creating or loading a cartridge resets font setting to default in code editor editor: code enhancement
    67. #1159 - (0.80 beta) No wave cut/copy/paste anymore in new SFX editor?
    68. #1111 - tic.c could be split into quasi-independent parts for api, io, core loop, drawing, music...
    69. #1102 - Add Keyboard Shortcuts for switching banks
    70. #1084 - Building without GTK dependencies
    71. #1044 - Error on openig in linux platform: linux
    72. #1033 - ls/dir fails to sort properly
    73. #1017 - Build succeeded : TIC-80 for Raspberry Pi (Raspbian Buster)
    74. #1003 - please add to the music editor the button "play from now on" editor: music
    75. #1001 - Use cover as raw binary screen buffer instead GIF
    76. #999 - (0.80-dev suggestion) Allow array of volumes in sfx() for left/right API
    77. #987 - key()/keyp() codes 66 to 78 don't work bug
    78. #986 - Suggestion: add a mouse capture functionality
    79. #979 - Replacement of circ() and circb() functions
    80. #978 - Add Keyboard Shortcuts to Music Editor
    81. #957 - CTRL+R doesn't work when launching a tic.computer/play cart SURF
    82. #923 - Website "store" improvements website
    83. #921 - Setup CI using Github Actions
    84. #912 - Integrating Raspberry Baremetal build
    85. #909 - Small font not working in "player" executable bug
    86. #901 - Properly name of cart.tic software in website website
    87. #832 - (0.80.0-dev Pro) Custom system sounds won't play at the correct speed bug
    88. #823 - corrupted size vs prev_size
    89. #799 - Native export shows "File not downloaded" bug
    90. #764 - Map editor: replace tile feature editor: map enhancement
    91. #755 - [Feature Request] Cartridge embedded in PNG export for easy sharing enhancement
    92. #749 - Music "joins" channels together after pressing "Play" while music / frame is still playing
    93. #726 - it should be possible to save and switch multiple 'sections' of the memory to a different 'bank' using sync (e.g. sprites & map) API bug
    94. #692 - Indent with the same characters as were used for previous line.
    95. #660 - Enable keyboard in landscape mode on Android
    96. #658 - Add CRT-filter option to the game menu enhancement
    97. #640 - Clear Input Text Instantly console enhancement
    98. #639 - Page Up / Page Down console enhancement
    99. #636 - CRT Shader Alternative (Speed, Simplicity)
    100. #559 - mouse() returns x,y outside 0,0-239,135 when mouse pointer is on screen border
    101. #454 - Allow using/pasting palettes with less than 16 colors editor: sprites enhancement
    102. #426 - Import sprite to specific slot enhancement
    103. #415 - input rgb values into palette editor editor: sprites enhancement
    104. #370 - Syntax highlighting bug bug editor: code lang: lua
    105. #312 - if you press up or down very fast it keeps repeating the same selection in SURF SURF bug
    106. #253 - Distribute TIC as package in Linux enhancement platform: linux
    107. #169 - Disable Editors PRO enhancement
    108. #154 - help (api function) command enhancement

    MERGED PULL REQUESTS

    1. #1483 - #764: replace tile feature in map editor by @cogk
    2. #1464 - Installing and running instructions by @Voklen
    3. #1463 - Correct spelling of a single word by @brickviking
    4. #1457 - Adding a Progressive Web App build by @schraf
    5. #1456 - Fixes for 2 SIGSEGVs when section is NULL by @Karethoth
    6. #1443 - Enable CRT shader in wasm/WebGL build by @jminor
    7. #1442 - Fix import command. by @jminor
    8. #1435 - Fix CRT shader on macOS. by @jminor
    9. #1427 - fix dapper builds by @cgrs
    10. #1416 - wren: Add as and continue keywords by @RobLoach
    11. #1406 - Update Wren to 0.4.0 by @RobLoach
    12. #1393 - libretro: Add features from jdgleaver by @RobLoach
    13. #1390 - libretro: Fix retro_get_memory_size() by @RobLoach
    14. #1386 - Add "code" to the import usage documentation by @RobLoach
    15. #1385 - Font fix on cart load by @txgruppi
    16. #1369 - Fixed Squirrel's print function fixed flag by @txgruppi
    17. #1368 - Wren TIC.btn fixes by @txgruppi
    18. #1363 - Multiline Comments by @tstopak
    19. #1361 - libretro: Update the memory data slots by @RobLoach
    20. #1358 - Fix MinGW build, do not add msvc specific flag by @tstopak
    21. #1355 - Fix using full path as cart name when loading cart by @phlubby
    22. #1348 - libretro: Update libretro.h and code standards by @RobLoach
    23. #1341 - Show how to build pro version by @joshgoebel
    24. #1336 - Update to Fennel 0.8.1. by @technomancy
    25. #1328 - Update to Duktape 2.6.0, and use a shallow clone by @RobLoach
    26. #1322 - Clip mouse values in SDL and Sokol by @nalquas
    27. #1318 - Make RAM and VRAM a bit more explicit by @joshgoebel
    28. #1316 - (chore) Migrate Raspberry Pi build instructions from wiki by @joshgoebel
    29. #1265 - minor cleaning on RPI baremetal build and Credits by @msx80
    30. #1256 - bare metal rpi build updated to latest TIC-80 and Circle by @msx80
    31. #1234 - SDL Player: Add constants and clean up error reporting by @RobLoach
    32. #1222 - n3ds: add prescale linear filter, wide mode support; close #1219 by @asiekierka
    33. #1221 - Update Lua to 5.3.6. by @asiekierka
    34. #1218 - libretro: Add Mouse Hide Delay option by @RobLoach
    35. #1217 - n3ds: fix crash in async net_httpc access, close #1200 by @asiekierka
    36. #1178 - Update Duktape to 2.5.0 by @RobLoach
    37. #1176 - SDL: Render in the correct aspect ratio by @RobLoach
    38. #1175 - Update Wren to 0.3.0 by @RobLoach
    39. #1165 - fixes #1163 (0.80 beta) time() always returns 0 when built with sokol by @drako0812
    40. #1161 - Update to Fennel version 0.6.0. by @technomancy
    Source code(tar.gz)
    Source code(zip)
    tic80-v0.90-android.apk(5.57 MB)
    tic80-v0.90-baremetal.zip(2.48 MB)
    tic80-v0.90-linux.deb(1.39 MB)
    tic80-v0.90-linux.zip(1.39 MB)
    tic80-v0.90-mac.dmg(1.35 MB)
    tic80-v0.90-nintendo-3ds.zip(798.21 KB)
    tic80-v0.90-rpi.deb(2.81 MB)
    tic80-v0.90-wasm.zip(727.09 KB)
    tic80-v0.90-win.zip(1.30 MB)
    tic80-v0.90-winxp.zip(1.17 MB)
  • v0.80.1344(Sep 3, 2020)

    CHANGELOG v0.80.1344

    MAIN CHANGES

    First of all, I want to say THANKS to all the people who helped release this version, especially the contributors

    @asiekierka @robloach @ddelemeny @technomancy @anatolse @stefandevai @gouchi @phcoder @michaeldel @wadetb @farvardin @buckle2000 @kawa-yoiko @cuu @grahamclemo @rudenkoarts @librorumque @kostik1337

    The new version has a new UI made with the Sweetie16 palette designed by GrafxKid.

    Code Editor

    1. added bookmarks support toggle [CTRL+F1], next [F1], prev [SHIFT+F1], remove all [CTRL+SHIFT+F1]
    2. added parentheses matching by @technomancy
    3. removed code banks and all the code limited by 64K of compressed data now
    4. added font shadow button
    5. removed dofile() function, but you can save cart in text format and edit in any editor you want, use save game.lua and folder to locate it image

    Sprite Editor

    1. changed default palette to Sweetie16 made by GrafxKid image
    2. added the Advanced Mode button where you can edit sprite flags, scanline/overline palette, switch bits per pixel image
    3. with 4bpp, 2bpp, 1bpp modes you can store more sprites by lowering the color bit (added by @ddelemeny). Please, read Advanced Drawing Techniques article and look at bpp.tic demo bpp

    Sfx Editor

    1. added stereo sound support, you can set the volume for left/right channels
    2. fully redesigned UI, I tried to fit all screens in one and added some wave animation sfx

    Music Editor

    1. added music effects support, you can change master volume, play a chord, jump to frame, pitch bend, vibrato, delay
    2. added new Piano Mode, where you can edit notes/octaves using mouse image
    3. added waveform animation and follow mode music

    Console

    1. added export sfx/music [index] command to export .wav
    2. export html creates .zip ready for production on itch.io with Web Assembly inside

    CLOSED ISSUES

    1. #1148 - pmem command with html exports?
    2. #1145 - found bug in 0.80.1278-dev
    3. #1140 - difference in sfx noise behaviour switching from 0.70.6 to 0.80-dev
    4. #1139 - surf does not show all games
    5. #1138 - surf loops around at end only
    6. #1136 - workaround to load code from multi bank carts
    7. #1135 - add menu command to show game menu console
    8. #1130 - saving to a cart extension that isn't .tic doesn't display the overwrite warning
    9. #1090 - music editor with piano roll editor: music
    10. #1089 - create a tool to compile text carts to .tic
    11. #1085 - suggestion: change show/hide grid key in map editor
    12. #1075 - paren matching in code editor
    13. #1071 - sprite editor select tool jumbles the selection content when moved
    14. #1054 - remove all the duk_is_null_or_undefined in jsapi.c
    15. #983 - (0.80.0-dev) some carts that poke to sound registers are broken
    16. #977 - (0.80.0-dev) jxy command in music editor can softlock tic-80
    17. #973 - (0.80.0-dev) add stereo panning registers to ram layout?
    18. #972 - sounds not playing in google chrome in exported game
    19. #962 - loading cartridges with active code banks broken
    20. #948 - update squirrel
    21. #940 - tic-80 surf: show the cover image resolution is 480x272 after tic-80 cover image is broken
    22. #938 - use curl instead sdl2-net
    23. #931 - [music tracker] can no longer change octave
    24. #917 - appveyor failing
    25. #909 - small font not working in "player" executable
    26. #902 - palette loading bug
    27. #896 - copy table data directly to ram using memcpy()
    28. #889 - restore keyconfig command
    29. #873 - it's time to change default palette
    30. #870 - deploy all the builds to https://builds.tic80.com
    31. #850 - pmem with saveid is broken at least in chrome
    32. #837 - program crashes after random interval (10 min), bringing down xwayland
    33. #816 - command+k clear console
    34. #815 - osx: "no mountable file systems"
    35. #810 - --input: [gamepad/mouse/keyboard] issue
    36. #807 - display in non-sokol build
    37. #785 - keyboard on android version
    38. #783 - get rid of max_carts const
    39. #782 - extract 16kb vram from 80kb ram
    40. #777 - emscripten build issues and build instructions
    41. #747 - keyboard layout broken again! (0.80.0-dev)
    42. #732 - stereo sound support
    43. #725 - sound and music exporter
    44. #693 - add ovr() palette to the sprite editor
    45. #668 - 0.70.1 pro on android: back button broken bug
    46. #657 - switching between apps turns tic-80's screen black on android
    47. #585 - divide by zero crashes tic80
    48. #557 - "wiki" command does nothing in web build
    49. #452 - start into surf mode.
    50. #435 - fold function in code editor
    51. #382 - music editor: sustaining notes through frames
    52. #320 - maybe move to cmake or something similar?
    53. #261 - implement effects column in the music editor

    MERGED PULL REQUESTS

    1. @asiekierka #1122 - 3ds port
    2. @asiekierka #1120 - surf: add support for using left/right or page up/page down to scroll
    3. @asiekierka #1119 - minor rendering optimizations
    4. @robloach #1114 - display the stack when there is an error
    5. @robloach #1053 - fix font() breaking when retrieving arguments
    6. @robloach #1045 - add timestamp() function
    7. @robloach #1028 - split up 3rd-party submodule into individual vendor submodules
    8. @robloach #851 - update to duktape 2.3.0
    9. @ddelemeny #1105 - modify blit segment spec
    10. @ddelemeny #1099 - variable bit-per-pixel drawing api
    11. @ddelemeny #1097 - draw studio popup after everything else
    12. @ddelemeny #1095 - enable chromakey array on map and textri
    13. @ddelemeny #1094 - fix segmentation fault caused by findmatcheddelim unsafe null pointer
    14. @ddelemeny #1061 - sort points vertically in ticline
    15. @technomancy #1101 - allow "export html foo.zip" to provide name non-interactively.
    16. @technomancy #1091 - wip: upgrade to fennel version 0.4
    17. @technomancy #1078 - accept and run commands from argv.
    18. @technomancy #840 - when -code-watch flag is passed, reload all the code upon resume.
    19. @anatolse #1066 - fixed some warnings from a static analyzer
    20. @stefandevai #1067 - update generated html
    21. @stefandevai #1064 - add sustain to notes and effects on frame change
    22. @stefandevai #1063 - follow cursor on music editor
    23. @gouchi #1048 - add libretro makefile
    24. @phcoder #1031 - make merge_static.sh executable
    25. @phcoder #1030 - allow overriding cmake_position_independent_code from command line
    26. @phcoder #1024 - fix resulting name for libretro emscripten variant
    27. @michaeldel #1012 - fix sdl cursors memory leak
    28. @wadetb #975 - touch keyboard tweaks and fix
    29. @wadetb #974 - fix android black screen when paused
    30. @wadetb #968 - map view fixes when wrapping around the edge
    31. @wadetb #967 - misc code editor additions/fixes
    32. @farvardin #930 - adding extra keys for the trackers
    33. @buckle2000 #839 - add using and local as moonscript keywords
    34. @kawa-yoiko #826 - fix sokol build vertically flipped under linux
    35. @kawa-yoiko #821 - fix (and simplify) blurry sokol rendering
    36. @kawa-yoiko #820 - fix colour replacement misses borders
    37. @kawa-yoiko #819 - workaround for freeze on fullscreen under macos
    38. @cuu #813 - fix -fullscreen
    39. @grahamclemo #759 - add squirrel language support to tic-80
    40. @rudenkoarts #744 - wren code outline
    41. @librorumque #739 - respect palette map for sprite colorkey
    42. @kostik1337 #733 - added single-param pmem function in wren api
    Source code(tar.gz)
    Source code(zip)
    tic80-v0.80-android.apk(5.95 MB)
    tic80-v0.80-linux.deb(1.56 MB)
    tic80-v0.80-osx.dmg(1.46 MB)
    tic80-v0.80-wasm.zip(688.41 KB)
    tic80-v0.80-win.zip(1.22 MB)
  • v0.70.6(Aug 24, 2018)

    CHANGELOG

    version 0.70.5 (https://github.com/nesbox/TIC-80/milestone/24?closed=1)

    0.70.6

    • GL3 shader error bug #678
    • Wiki command does nothing on Android bug #659
    • Caps Lock not working bug #661
    • Keyboard mappings broken! bug #655
    • Re-enable tumbler mouse clicks bug #688 (thank you @db0z)
    • Gently clicking the right side on the Code Editor scrolls the entire screen while using the small font bug #682
    • Add config flag to make tiny font default editors enhancement #666
    • When using Wren, sync() writes data to cart instead of restoring it bug #673
    • #673 #684 fix (sync() with no arguments in wren) (thank you @db0z)
    • The file system doesn't work in 0.70.1 bug #664
    • Music editor stucks on the last note bug #662
    Source code(tar.gz)
    Source code(zip)
    html.zip(999.15 KB)
    tic80_0.70.6.apk(4.45 MB)
    tic80_0.70.6.dmg(2.95 MB)
    tic80_0.70.6.exe(1.92 MB)
    tic80_0.70.6.tar.gz(4.04 MB)
    tic80_0.70.6.zip(2.08 MB)
  • v0.70.1(Aug 12, 2018)

    CHANGELOG

    version 0.70.1 (https://github.com/nesbox/TIC-80/milestone/23?closed=1)

    0.70.1

    • added own touch keyboard on Android image
    • added alternative tiny font, you can use it in the Code Editor or in the API screen
    • added Wren language support http://wren.io (thank you @RudenkoArts)
    • added Fennel language support https://fennel-lang.org (thank you @technomancy)
    • added eval command (thank you @technomancy)
    • added CRT monitor effect, use F6 to enable/disable it (works on every platform supported OpenGL) image
    • removed VSYNC support, using delay instead, so TIC should work on monitors > 60Hz without sound desync
    • added stack trace on an error (thank you @jahodfra)
    • fixed selection flipping in the Sprite Editor (thank you @frenetic)
    • use CTRL+PGUP/PGDN to switch modes (thank you @technomancy)
    • added Quit TIC-80 to the game menu
    • added -uiscale command line argument (UI_SCALE in the config)
    • added menu to build.sh script (thank you @matimati433)
    • added Travis Continuous Integration service
    • fixed UV errors, clipping and some improvements in textri api (thank you MonstersGoBoom)
    • fixed error on startup in Firefox
    • SDL2 lib extracted as a separated entity

    you can review full changelog here https://github.com/nesbox/TIC-80/milestone/23?closed=1

    Thanks all for the support and Pull Requests.

    PS. I hope next update will be released earlier than a half year :)

    Source code(tar.gz)
    Source code(zip)
    html.zip(998.76 KB)
    tic80_0.70.1.apk(6.64 MB)
    tic80_0.70.1.dmg(2.95 MB)
    tic80_0.70.1.zip(2.08 MB)
    tic80_64bit_0.70.1.tar.gz(4.02 MB)
  • v0.60.3(Dec 24, 2017)

    CHANGELOG

    version 0.60.3 (https://github.com/nesbox/TIC-80/milestone/22?closed=1)

    0.60.3

    • Persistent Memory (PMEM) moved from 80K RAM layout and has 1KB now (you can store up to 256 integers). Freed space (28 bytes) used to store data for 4 gamepads + mouse XY and buttons + keyboard
    • added keyboard support (use key() / keyp() API)
    • you can use mouse / gamepad / keyboard simultaneously, and you can use up to 4 gamepads
    • removed KEYMAP command, you can configure gamepad mapping in the GAME MENU
    • you will see SYNC label (synchronization error) if your game doesn't fit 60 FPS (only native, doesn't work in web version)
    • mouse pointer disappears in games that don't support it (in games with declared -- input: gamepad or -- input: keyboard)
    • mirror/rotate selection in the Sprite Editor
    • SDL updated 2.0.7

    0.60.0

    • added optimisations for main render function and some draw API, like draw spr, circ and tri, now they > 2x faster (by @jahodfra)
    • added special Overlap Mode (OVR), it allows you to do things like this: par ... here I draw BG in TIC() function and change palette and screen offset in scanline() callback, then I draw Ship sprite in OVR() function as though it will be on a separate layer
    • added -skip command line option to run TIC without startup animation
    • added -fullscreen command line option to run in Fullscreen
    • added shadow variable to the Config to hide shadow in the Code Editor
    • you can exit infinite loop in Lua and JS by pressing ESC now
    • added reset() API, to restore your game to initial state
    • syntax highlighter in the Code Editor was totally rewritten and works 100x faster now
    • [PRO feature] added Bank Switching, for people who want to create a really big game, you can switch between 8 banks in Runtime using sync() API, you can do it only one time per frame for tiles, sprites, map, sfx, music, info here https://github.com/nesbox/TIC-80/wiki/sync#parameters
    • fixed keyboard focus on Android
    • fixed selected deletion in Sprite Editor (by @frenetic)
    • Sprite and Map editors render in OVR mode now (UI is not changed at all if change palette)
    • added random generator pre-seeding on every game start
    • and other minor fixes...

    Thanks for contributions: @jahodfra @frenetic

    and others, for the bug reports!

    Source code(tar.gz)
    Source code(zip)
    html.zip(884.97 KB)
    tic80_0.60.3.apk(5.74 MB)
    tic80_0.60.3.dmg(2.00 MB)
    tic80_0.60.3.zip(1.69 MB)
    tic80_32bit_0.60.3.tar.gz(1.41 MB)
    tic80_64bit_0.60.3.tar.gz(1.40 MB)
    tic80_chip_0.60.3.tar.gz(1.80 MB)
  • v0.50.1(Nov 28, 2017)

    CHANGELOG

    version 0.50.1 (https://github.com/nesbox/TIC-80/milestone/21?closed=1)

    added:

    • you can define cart storage directory as first parameter in command line, tic80 . will use current directory as storage, tic80 ../path/to/cart.tic will use ../path/to/ as storage and load cart.tic
    • added PRO version of TIC, you can get it here for $5 https://nesbox.itch.io/tic, or build yourself using make linux-pro for example
    • added text version of carts and you can edit it in any editor, use 'save cart.lua' to get text version of your cart [PRO feature]
    • optimised spr() function performance (got 20000 points in benchmark, 13000 was before)
    • tic renamed to tic80
    • sync() api has new direction parameter, true -> sync from RAM to cart, false -> sync from cart to RAM (useful to restore cart data in the RAM)
    • you can paste sigle color value in the palette editor
    • added benchmark.tic cart to demos
    • run tic80 -surf to start in SURF mode
    • run tic80 -nosound to start in silent mode
    • run tic80 -fullscreen to start in fullscreen mode
    • makefile flags to build with LTO (link time optimisation)
    • added 1px shadow to text in the Code Editor
    • updated makefile to build on any version of Linux (Arch/RPi/...)
    • added edit command to show editors
    • added version command
    • added RETINA support on MacOSX

    fixed:

    • pix() api color bounds
    • warning message emits a tone on unsaved cart
    • sprites export with wrong palette
    • scanline position and border, all render to one texture 256x144px
    • fixed live reload
    • fixed some crashes
    • removed some compilation warnings
    • XYUV's switched to floats in textri(), also fixed crash

    Thanks for contributions:

    @MonstersGoBoom @josefnpat @jahodfra

    Source code(tar.gz)
    Source code(zip)
    html.zip(879.93 KB)
    tic80_0.50.1.apk(5.87 MB)
    tic80_0.50.1.dmg(2.02 MB)
    tic80_0.50.1.zip(1.83 MB)
    tic80_32bit_0.50.1.tar.gz(1.40 MB)
    tic80_64bit_0.50.1.tar.gz(1.39 MB)
    tic80_chip_0.50.1.tar.gz(1.79 MB)
  • v0.47.0(Oct 20, 2017)

    Changelog

    In .47 we got help from 4 contributors: Matheus Lessa Rodrigues Anthony Camboni Filippo Death Thanks!

    All the editor modes use the only system palette now, except Sprite and Map Editors (they use game palette), added LUA live reload command line parameter (use -code-watch) and closed other small issues...

    Closed issues

    • On website, SURF is broken bug #303
    • Use scanline trick to draw Sprite and Map editors with cart palette enhancement #345
    • better bounds checking for memcpy, memset bug #342
    • Live reload of .lua file(s) in developer mode enhancement #299
    • Tic 0.47.0 enhancement #340
    • btn() always returns number api bug #339
    • Crash on Android android bug #324
    • Ensure tile pos is always visible in map editor enhancement #338
    • adding code editor ctrl+home and ctrl+end functionality editors enhancement #334
    • Run button on code editor only editors enhancement #331
    • textri() causes error when using javascript api bug #328
    Source code(tar.gz)
    Source code(zip)
    html.zip(895.49 KB)
    tic_0.47.0.apk(5.91 MB)
    tic_0.47.0.dmg(2.02 MB)
    tic_0.47.0.zip(1.83 MB)
    tic_32bit_0.47.0.tar.gz(1.90 MB)
    tic_64bit_0.47.0.tar.gz(1.96 MB)
    tic_arm_0.47.0.tar.gz(916.27 KB)
  • v0.46.0(Oct 5, 2017)

    Changelog:

    • Music Editor can copy/paste selected area now

      cpy

      added on/off green buttons to temporarily mute the channel CTRL+scroll changes note value of selected notes

    • also, we have first pull request from @Nullious 🎉 he added textri api function which you can use to draw a triangle filled with texture from image ram or map ram

      demo

    Closed issues:

    • Music Editor requests #174
    • Add buttons to toggle channels on/off in music editor #193
    • bug in SURF #304
    • textri command api #317
    • Browser hang if i run html-build, in native build OK. JavaScript. #306
    • Border color does not update when loading carts until esc is pressed. #308
    • V 0.45.0 exported doesn't contain correct palette #307
    Source code(tar.gz)
    Source code(zip)
    html.zip(923.83 KB)
    tic_0.46.0.apk(6.01 MB)
    tic_0.46.0.dmg(2.07 MB)
    tic_0.46.0.zip(1.86 MB)
    tic_32bit_0.46.0.tar.gz(1.93 MB)
    tic_64bit_0.46.0.tar.gz(1.99 MB)
    tic_arm_0.46.0.tar.gz(917.82 KB)
  • v0.45.0(Sep 18, 2017)

    The main enhancement is SURF mode for browsing local and website carts use surf command to run it (or press any button on the gamepad) surf

    Closed issues:

    • In code editor, keep the current column of the cursor when switching lines #184
    • Incorrect Lua syntax highlighting in text editor #232
    • NEW with wrong parameters gives a silent error #257
    • Add "resume" command to return to the game in the same place where the game was stopped #264
    • Ability to edit default game template in similar way to config #276
    • time() function returns different values depending on how the program is run #278
    • error() crashes TIC #279
    • Game menu doesn't work if game has mouse input #280
    • Shortcut CTRL+/ in JavaScript code added LUA comment symbols "--" #284
    • TIC website improvements #285
    • Game menu wraps downwards but not upwards #286
    • Implement SURF mode #293
    • SURF return to TIC doesn't restore previous line index (and other suggestion) #296
    • SURF doesn't show cover for local cart #295
    • If you select "reset game" in Game Menu the sound will break - an annoying hiss will begin. #297
    Source code(tar.gz)
    Source code(zip)
    html.zip(895.43 KB)
    tic_0.45.0.apk(5.69 MB)
    tic_0.45.0.dmg(2.02 MB)
    tic_0.45.0.zip(1.83 MB)
    tic_32bit_0.45.0.tar.gz(1.90 MB)
    tic_64bit_0.45.0.tar.gz(1.95 MB)
    tic_arm_0.45.0.tar.gz(912.75 KB)
  • v0.40.0(Aug 25, 2017)

    Changelog

    Closed issues:

    • Game menu #270
    • Edit Config as cartridge #269
    • Confirmation Dialogs #59
    • GIF recording #157
    • Alt-1 adds "1" to the editor #277
    • [0.40.0] "config" doesn't work when in a subdirectory #274
    • Native export does nothing on Windows 10 when launched from cmd-line #267
    • [0.40.0] "export native" doesn't export .dll's (Windows) #273

    TIC-80 got new logo/emoticons/mascot image image image image People called it TICSY


    If you press ESC (or BACK on mobile) you'll see Game Menu where you can resume/reset the game, configure gamepad buttons mapping or exit to the editors. Menu shows in exported and website games only.

    bare


    config.lua is deprecated and it looks like cartridge now, in code you define variables, system images in sprites and systems sounds in SFX editor accordingly config as usual use config command to load configuration, config reset to reset


    you will see WARNING dialog:

    • if you have unsaved changes and try to load/new/exit commands
    • if you try to delete a file using del command
    • if cartridge already exists and you try to overwrite it

    image


    press F9 to start/stop GIF recording (you'll see REC label in the top-right corner) image

    also, you can define these variables in the Config

    GIF_LENGTH=20 -- in seconds
    GIF_SCALE=2
    

    and finally, we have the same ARM build for PocketCHIP and RaspberryPi

    hope you enjoy it! image

    Source code(tar.gz)
    Source code(zip)
    html.zip(889.93 KB)
    tic_0.40.0.apk(5.66 MB)
    tic_0.40.0.dmg(2.00 MB)
    tic_0.40.0.zip(1.82 MB)
    tic_32bit_0.40.0.tar.gz(1.88 MB)
    tic_64bit_0.40.0.tar.gz(1.95 MB)
    tic_arm_0.40.0.tar.gz(908.29 KB)
  • v0.30.0(Jul 30, 2017)

    Closed issues

    • Music editor: Row indicator #248
    • Map Editor (0.30.0): Fill in selected box only (Suggestion) #249
    • CLIP doesn't affect CLS api #247
    • Show 'press BACK button to enter UI' on mobile #237
    • Don't copy internal files to separate folder on every release #246
    • Unflip the nibbles in clipboard data #226
    • CTRL+Enter to play pattern from cursor pos in the Music Editor #238
    • [REQUEST] Fill a portion of the map with a specific tile #138
    • Box select, copy and paste in the map editor #132
    • Map editor request #178
    • Export native not working in 0.29.3 #233
    • Random generator seed doesn't work on MacOS #228
    • JS: sfx() incorrectly using "note" argument #229
    • JS: font() produces incorrect results #230
    • Array of transparent colors for SPR() #225
    Source code(tar.gz)
    Source code(zip)
    html.zip(890.05 KB)
    tic_0.30.0.apk(5.63 MB)
    tic_0.30.0.dmg(1.99 MB)
    tic_0.30.0.zip(1.69 MB)
    tic_32bit_0.30.0.tar.gz(1.89 MB)
    tic_64bit_0.30.0.tar.gz(1.95 MB)
    tic_chip_0.30.0.tar.gz(919.41 KB)
  • v0.29.1(Jul 5, 2017)

    • JavaScript support #213
    • Error message when run out of code space #149
    • Replace color function in sprite editor editors #183
    • Timeout version check after certain period passed #216
    • Gridlines not visible in the map editor when the background sprite isn't black #190
    • Change the startup sound #130
    • Add 'saveid:' metatag #199
    • Command line loaded sprites with wrong palette indices? #200
    • Add ls command the same as dir #201
    • Can't save or load a cart in Windows 8.1 #202
    • Cannot change palette for new carts in config file #204
    • More accurate timer #208
    • Extra spaces on command line interpreted as part of file name #215
    • Help commands show capital instead of lowercase #214
    • wasted code when injecting it from the command line #219
    • Crash in the Music Editor bug #218

    The main enhancement is Javascript support, use new js command to load Hello World demo

    Source code(tar.gz)
    Source code(zip)
    html.zip(883.85 KB)
    tic_0.29.1.apk(5.60 MB)
    tic_0.29.1.dmg(1.98 MB)
    tic_0.29.1.zip(1.68 MB)
    tic_32bit_0.29.1.tar.gz(1.88 MB)
    tic_64bit_0.29.1.tar.gz(1.94 MB)
  • v0.28.1(Jun 16, 2017)

    Changelog

    • official 80K RAM layout you can access all the memory by peek/poke functions
    +-----------------------------------+
    |           80K RAM LAYOUT          |
    +-------+-------------------+-------+
    | ADDR  | INFO              | SIZE  |
    +-------+-------------------+-------+
    | 00000 | SCREEN            | 16320 |
    | 03FC0 | PALETTE           | 48    |
    | 03FF0 | PALETTE MAP       | 8     |
    | 03FF8 | BORDER COLOR      | 1     |
    | 03FF9 | SCREEN OFFSET     | 2     |
    | 03FFB | GAMEPAD MASK      | 1     |
    | 03FFC | GAMEPAD           | 2     |
    | 03FFE | ...               | 2     |
    | 04000 | SPRITES           | 16384 |
    | 08000 | MAP               | 32640 |
    | 0FF80 | PERSISTENT MEMORY | 28    |
    | 0FF9C | SOUND REGISTERS   | 72    |
    | 0FFE4 | WAVEFORMS         | 256   |
    | 100E4 | SFX               | 4224  |
    | 11164 | MUSIC PATTERNS    | 11520 |
    | 13E64 | MUSIC TRACKS      | 408   |
    | 13FFC | MUSIC POS         | 4     |
    | 14000 | ...               | 0     |
    +-------+-------------------+-------+
    
    • TIC has 60 music patterns in total which can be assigned to any channel and any track image

    • fixed bug with sfx api, you couldn't play effect on two channels at the same time

    • add import/export map command to get the map as raw binary (240*136 bytes), also you can inject map from command line tic cart.tic -map world.map

    • added X Y gamepad buttons handling (also you can configure binding in keymap)

    • add gamepad mask to assign what buttons show and handle (00111100 by 0x03FFB address will show LRAB only)

    • add frame and loop parameters to music api music [track=-1] [frame=-1] [loop=true]

    • Loading cart and code via command line does not load the palette within the cart. #180

    HOTFIX

    • double ESC returns to game
    • cursor doesn't render (only black box)
    • X Y touch buttons #186 #185
    • added NUMPAD support to enter numbers in the Music Editor
    • enable record mode in music editor and press Enter, cursor moves to pattern edit box!!!
    • fixed typo "ame is missing"
    • fixed cover loaded from the previous cart
    Source code(tar.gz)
    Source code(zip)
    html.zip(640.34 KB)
    tic_0.28.1.apk(4.30 MB)
    tic_0.28.1.dmg(1.45 MB)
    tic_0.28.1.zip(1.28 MB)
    tic_32bit_0.28.1.tar.gz(1.44 MB)
    tic_64bit_0.28.1.tar.gz(1.50 MB)
  • v0.27.0(Jun 8, 2017)

    Changelog

    • Record option for the music editor enhancement #167 record

    • Sprite editor enhancements enhancement #128

    • Feature: Color picker and other keyboard shortcut in sprite editor. enhancement #124 image

    • Serious "loss of data" issue with new command bug #168

    • loadmusic/loadsfx/loadsprites/loadmap/loadcode commands enhancement #164 section

    • [0.26.0 dev Windows 10 exe] font function crashes program when given nil value bug #165

    • trace() is useless for truth/false values enhancement #163

    • Volume column in tracker? enhancement #161 image

    • Palette editor enhancement #166 image

    Console command changes

    • added config reset to reset config.lua
    • added load cart.tic [sprites | map | cover | code | sfx | music | palette] to load sections from other carts

    API changes

    • trace output works like standard Lua print function
    • changed RGB order by 0x3FF0 from BGR to RGB
    Source code(tar.gz)
    Source code(zip)
    html.zip(637.04 KB)
    tic_0.27.0.apk(4.28 MB)
    tic_0.27.0.dmg(1.45 MB)
    tic_0.27.0.zip(1.27 MB)
    tic_32bit_0.27.0.tar.gz(1.42 MB)
    tic_64bit_0.27.0.tar.gz(1.49 MB)
  • v0.26.0(Jun 2, 2017)

    • Restore sprites and map data on every game start #159
    • Update check or autoupdater #153
    • If custom cursor is defined in config.lua, it still doesn't allign with the resolution #155
    • Screenshots with Hotkey #144
    • You can cd into non-existing directories online #148
    • TIC doesn't load demo carts on win7 #142
    • Cover image palette changed #93

    API changes:

    • added sync function to copy modified sprite/map area to the cartridge #159
    Source code(tar.gz)
    Source code(zip)
    html.zip(631.51 KB)
    tic_0.26.0.apk(4.26 MB)
    tic_0.26.0.dmg(1.45 MB)
    tic_0.26.0.zip(1.26 MB)
    tic_32bit_0.26.0.tar.gz(1.42 MB)
    tic_64bit_0.26.0.tar.gz(1.48 MB)
  • v0.25.0(May 25, 2017)

    version 0.25.0

    • Pre-seed the random generator in the Lua environment #127

    • Feature: Custom colors defined in metadata for sprites and palette in sprite editor #119

    • 0.24 crash with moonscript error #135

    • Browse and load carts directly from the tic.computer website #146 dir

    • Change screen offset in every scanline #129 glitch

    • Command line argument to inject an image into the launched cart #141

    • Version mobile on scrolling #120

    • Soft Keyboard does not reappear after running game with mouse input. #66

    • Sfx editor improvements #140 image

    Source code(tar.gz)
    Source code(zip)
    html.zip(629.49 KB)
    tic_0.25.0.apk(4.24 MB)
    tic_0.25.0.dmg(1.44 MB)
    tic_0.25.0.zip(1.26 MB)
    tic_32bit_0.25.0.tar.gz(1.41 MB)
    tic_64bit_0.25.0.tar.gz(1.48 MB)
  • v0.24.0(May 12, 2017)

    version 0.24.0

    • On V 0.23 Demo SOUND should be named SFX #118

    • SFX editor keybaord keys not working correctly if NumLock is active #114

    • Feature: Colored output of trace() #121

    • Sprite editor: copy > scale > paste bug #115

    • Scaling the map #75

    • Mouse cursor #116

    • Border scanline effect #126 border

    • Add "cd" command for the console #82 dir

    • Configure buttons mapping #45 keymap

    Source code(tar.gz)
    Source code(zip)
    html.zip(640.73 KB)
    tic_0.24.0.apk(4.26 MB)
    tic_0.24.0.dmg(1.44 MB)
    tic_0.24.0.zip(1.26 MB)
    tic_32bit_0.24.0.tar.gz(1.42 MB)
    tic_64bit_0.24.0.tar.gz(1.48 MB)
  • v0.23.0(May 4, 2017)

    version 0.23.0

    • sound module has been rewritten from scratch and got editable waveforms
    • added Music category to the https://tic.computer/play?cat=3
    • added speed parameter to the tracker (for fine tune music speed, means how many 'ticks' to play each row)
    • fixed arpeggio note pitch
    • Map same keys for SFX and MUSIC Editor #112
    • Add the ability to output log to file. #109
    • btnp() hold parameter time resets when any other button is pressed #108
    • Cannot print newlines #90
    • Improvement the "world map" in the "map editor" #79
    • Show the tile's ID for the map editor. #105
    • Scaling the text with print() function #78
    • Cannot load files that includes whitespace in its filename #88
    • "sfx(-1)" is required before playing same sound, duration parameter to sfx api. #87
    • add hotkey for comment/uncomment #95
    • Sprite editor - Selection tool bug #102
    • feature: sspr() function: multi tile sprite operations and palette swapping #71

    API changes:

    • you can draw composite sprites, add w and h parameters spr id x y [colorkey=-1] [scale=1] [flip=0] [rotate=0] [w=1 h=1]

    • added duration parameter to sfx, means how many ticks to play (sfx == -1 by default to play sfx infinitely) sfx id [note] [duration=-1] [channel=0] [volume=15] [speed] where note is index = octave * 12 + note or string like C#4

    • added scale param to print and font api print text [x=0 y=0] [color=15] [fixed=false] [scale=1] -> width font text [x=0 y=0] [color=15] [w=8 h=8] [fixed=false] [scale=1] -> width where w and h size for empty symbol (space for example) also print and font can draw multiline text (use \n to wrap words)

    Source code(tar.gz)
    Source code(zip)
    html.zip(628.60 KB)
    tic_0.23.0.apk(4.21 MB)
    tic_0.23.0.dmg(1.43 MB)
    tic_0.23.0.zip(1.24 MB)
    tic_32bit_0.23.0.tar.gz(1.40 MB)
    tic_64bit_0.23.0.tar.gz(1.47 MB)
  • v0.22.0(Apr 20, 2017)

  • v0.21.0(Mar 23, 2017)

    version 0.21.0

    • you can assign cart cover image by pressing [F7]
    • added 'import/export cover' command
    • cover loads to screen buffer on every game start
    • [github] EXPORT behaves differently on Windows and HTML platforms #64
    • [github] Native Scrolling on macOS #67
    • [github] Cursor Jump #68
    • [github] dofile on first line false detection #65
    • [github] Running the MoonScript code using 'dofile' produces an error #70
    • [github] Add the ability to run the tic application from the command line with the following parameters: -cart game.tic, -code code.lua #69
    Source code(tar.gz)
    Source code(zip)
    html.zip(610.91 KB)
    tic_0.21.0.apk(4.12 MB)
    tic_0.21.0.dmg(1.40 MB)
    tic_0.21.0.zip(1.22 MB)
    tic_32bit_0.21.0.tar.gz(1.37 MB)
    tic_64bit_0.21.0.tar.gz(1.43 MB)
  • v0.20.0(Mar 22, 2017)

    version 0.20.0

    • [github] Configuration for startup sound #51
    • [github] Sound RAM Poke Crash #55
    • [github] Touch buttons with labels #56
    • [github] Triangle primitives #63
    • added toolbar icons with tooltips
    • added THEME to the config (you can define start beep, code syntax colors, touch gamepad buttons)
    • copy/paste works in SFX EDITOR
    • reduced Linux builds size from 8MB to 2MB
    • added TRI api function to draw filled triangles
    Source code(tar.gz)
    Source code(zip)
    html.zip(606.98 KB)
    tic_0.20.0.apk(4.09 MB)
    tic_0.20.0.dmg(1.39 MB)
    tic_0.20.0.zip(1.21 MB)
    tic_32bit_0.20.0.tar.gz(1.36 MB)
    tic_64bit_0.20.0.tar.gz(1.43 MB)
Owner
Vadim Grigoruk
Vadim Grigoruk
Cute Framework (CF for short) is the cutest framework available for making 2D games in C/C++

Cute Framework (CF for short) is the cutest framework available for making 2D games in C/C++. CF comprises of different features, where the various features avoid inter-dependencies. In this way using CF is about picking and choosing which pieces are needed for your game

null 314 Dec 26, 2022
A single-header C++ library for making simple 2D games

A single-header C++ library for making simple 2D games PLATFORM: Windows LANGUAGE: C++ ENVIRONMENT: Visual Studio Why? Learning C++ is often seen as d

Sumo Digital Academy 63 Dec 22, 2022
A flutter package for making game levels map like candy crush or similar games using flutter with ability to be horizontal or vertical

Game Levels Scrolling Map A package for making game levels map like candy crush or similar games using flutter with ability to be horizontal or vertic

Mohamed Sayed 12 Oct 26, 2022
This is a list of different open-source video games and commercial video games open-source remakes.

This is a list of different open-source video games and commercial video games open-source remakes.

Ivan Bobev 173 Jan 2, 2023
A terminal-based Tic-Tac-Toe game for two players, written in C++.

TicTacToe Terminal-based TicTacToe Game Project description A terminal-based Tic-Tac-Toe game for two players, written in C++. Execution Option 1: nav

Sven Eschlbeck 2 Dec 18, 2021
A c program to play a simple 2 players tic tac toe game

Tic_Tac_Toe_Game A c program to play a simple 2 players tic tac toe game Tic-tac-toe is a simple game for two players who take turns marking the space

Muhammad Zain Ul Haque 1 Oct 28, 2021
A simple C++ program for an interactive Tic Tac Toe Game.

CSE 332 Lab 3:Tic-Tac-Toe Game Objective: This lab is intended to extend your use of basic C++ language features from the previous labs, and to give y

Julia Grandury 1 Nov 8, 2021
A tic-tac-toe game made only in flutter

Tic Tac Toe Game A simple Flutter Tic tac toe game made for educational purpose. the main goal of this project is to teach the importance of data stru

Mouheb Boucherb 22 Nov 29, 2022
Simple implementation of Tic-Tac-Toe game on C++.

Simple implementation of Tic-Tac-Toe game on C++.

null 1 Dec 28, 2021
Tic Tac Toe implementation using c programming language with minimax algorithm.

Tic Tac Toe implementation using c programming language with minimax algorithm.

Sehan Weerasekara 1 Feb 19, 2022
Simple tic-tac-toe game written on c++

tic-tac-toe-cpp Simple tic-tac-toe game written on c++ Play Start ttt.exe (for Windows), enter a number from 1 to 9 and the game will automatically pu

null 2 Feb 10, 2022
A simple example of a tic-tac-toe game written in C using raylib.

raylib-C-TicTacToe A simple example of a tic-tac-toe game written in C using raylib. ?? Table of Contents About Built Using Authors ?? About Raylib-c-

ZimonIsHim 2 Feb 10, 2022
OpenMW is an open-source open-world RPG game engine that supports playing Morrowind.

OpenMW is an open-source open-world RPG game engine that supports playing Morrowind.

null 4.5k Jan 2, 2023
A text-based space adventure role-playing game developed by a team of 5.

SpaceAdventureRPG - Text-Based Game A text-based space adventure role-playing game developed by a team of 5. Module: 4007CEM, Class: B, Group: 3 Contr

Jonas Djondo 1 Nov 18, 2021
A chess playing engine with portable libraries.

Swordfish A chess playing engine. Swordfish is designed to be decent at chess, and at the same time, providing a set of chess libraries which can be u

Patrick 9 Sep 28, 2022
A Game Boy game that rewards you for playing it on several console models!

GB Corp. A Game Boy game for the Game Boy Competition 2021 by Dr. Ludos (2021) This is the source code, you can get a precompiled rom from here: https

Dr. Ludos 10 Sep 25, 2022
🚀 Making multi-player gamedev simpler since 2017

Making multi-player gamedev simpler since 2017. Single-header cross-platform world replication in pure C99. Built with love using zpl • Brought to you

ZPL | Your C11 Powerkit 1k Jan 4, 2023
To recreate the board game Scotland yard and enable a single player to play the game by letting one of the roles being played by the computer based on written algorithm

Scotland Yard GAME OF SCOTLAND YARD This is a custom version of the classic board game, Scotland Yard .The game uses the London map used in the origin

Brshank 2 Nov 11, 2021
Game Engine that is being developed by a computer science student using C and OpenGL

Project LOGLE Contents About the Project Project Status Known Issues Setup ?? About Game Engine that is being developed by a computer science student

Ewan 1 Jan 21, 2022