Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics
SalesBundles

DagonDev

50
Posts
25
Topics
6
Followers
11
Following
A member registered Mar 23, 2015 · View creator page →

Creator of

Recent community posts

Asking this because I assumed this how this worked. I used function load palette from snippets: https://github.com/nesbox/TIC-80/wiki/code-examples-and-snippets#load-string-pal...

And I thought that if I call it with one palette at the start of the loop (before rendering anything) and then call this function again with diff. palette before rendering any gui I could use 32 colors. But, this changes colors of everything, even already rendered stuff. While I see other functions in snippets, quick look at them show they do the same thing actually, poke`ing memory at color palette memory position.

So, is it possible to use two diff. palettes at all?

It isn't really touched in wiki at all. How one relates to another?
Assuming I have tempo (beats per minute) 60, how much speed should i have so one note is equal to 1/60th of minute? Does dividing speed by two makes one note equal to 1/120th of minute in same tempo? Does speed behaves the same regarding of tempo?

(4 edits)

I am working on windows system from external editor (sublime text 3) with text based cart (.lua). When I am saving via ST3 (and reloading with ctrl+r in tic80) everything stays the same, but whenever I change something in tic80 (like graphic or map) and save it there every code bank from 1 to 7 gets duplicated, making my file size almost twice as big. It is easy to reproduce this, but can provide my file in private message if needed.

Example:

Create text based file in TIC-80.

Write random comments in every code bank and save file.

Open file in external edtor, save it there and reload file in TIC-80.

Change graphic in TIC-80 and save file in TIC-80

Reload file in external editor


EDIT: It looks like it is related to the fact, that whenever you reload file saved in external editor all banks are loaded into bank 0,in pair with loading each bank separately. Dunno why. So this also makes 512k code limit unavailible as TIC80 will fail if sum of code from banks 1-7 gets bigger than 64k.


EDIT2: Already reported, just found out: https://github.com/nesbox/TIC-80/issues/516

Also looking forward to it. Nesbox do you mind sharing what possible designs you consider atm?

I am using Asset forge to export models to png. My current setup is: Front-top 45 angle, shadows 100%, ambient 0%, sprite size large, color filter b/w. So I need to change few of those default values. While I don't mind entering those once when opening app,  but it becomes really tiring when I am changing one thing on the model and want to export it to see how it looks on png to find myself inputing those settings yet again.

IF AF could not lose what user changed in export window that would be great. Thanks!

That is awesome news, I hope this get more people into this project. :)

Thanks :)

(2 edits)

I missed this information, sounds awesome, thank you! Does that mean I can use this in 'normal' uploadable games? I am looking at sync command (https://github.com/nesbox/TIC-80/wiki/sync#parameters) and it looks like it should work 'anywhere'. But regarding code limit, do I need to call sync or switch bank somehow to utilize 512kb or does it work 'automagically'?

Edit:

I opened TIC80 Pro and i see banks for code editor, but how do I make use of this if I am working with code from external editor (and loading it via command line?)

(1 edit)

So I am new and proud owner of TIC-80 PRO. I was wondering if it would be possible to remove code limit (other limits?) when game is exported to plain exe? While it is necessary to have one when uploading game to the central repository, if we could specify that game will be only exported to exe it could allow for more than 'normal' exporting. PICO-8 is doing it in a way that if you go over limit it doesn't allow you to export your game to the uploadable format, but you can still save and run it.


Edit: Saw that in 0.60 you can expand space for everything except code limit, so my question stands only for code limit.

Keep up good work! I think it is awesome you did overview videos, very useful especially for sfx and gfx editors!

If you try to play two sounds on one channel, only last one will play. You need to give unique channels if you want to hear all of 3 sounds at once, check: https://github.com/nesbox/tic.computer/wiki/sfx

Thank you for replying, it means much to get input from the developer itself!

I understand your stance on that and really appreciate honest response.

Luckily, variant with open source will allow me to achieve what I want so everything is good. Looking forward to it, great news. :D

(1 edit)

TL;DR at the bottom.

I am writing this even though I didn't encounter code limit yet, but I think I will. I base this from my experience when I say I don't want to deal with that. I already had my code limit problems when I was developing game for PICO8. I tried to make quite a big game and, as it was my first time with code limit, it was difficult experience to try to work around that and left me burned out and negative towards fantasy console in general. (Although I finished game, much smaller and different from what I wanted)

My problem isn't with code limit itself (which I think is good) but how punishing it is for project that hits it before completion. If you want to create something more than demo scene or mini game you will hit it sooner or later. Is TIC-80 is designed only for small things?

I fell in love with TIC-80 and how user friendly it is and decided to use it regardless of code limit. But I didn't forget last time and said to myself: respect code limit and do something small. Thought about doing small prototypes around single mechanic/system. So I did. I released first prototype for TIC80 - https://tic.computer/play?cart=138 which sits at 57620/65535 code size. Idea was to prototype one system (lockpicking/opening locked containers) by creating sandbox in which player can do few actions (open/close locks,create/use keys). And I managed to do it without any code cleaning, while I was writing it in a way that was most readable to me (using classes, writing long/descriptive variables etc.) Success!

My initial plan was to do 2 more prototypes (around pickpocketing and sneaking mechanic) and that was ok. But now, it got bigger. I decided I want to make little game combining 3 of those (when I finish then) in one small scenario and I think I will hit code limit with it. Of course I can just do prototypes and then move to other engine, but porting all of this is, maybe, unnecessary work. Though that maybe I can do all of this with TIC-80?  But here is a thing, I don't want to go through fighting around code limit as I already had with last game. If there is no other way, I would prefer switching to other console (like LIKO12) than forcing myself through problems I don't want to have. Hence my questions below.

You could say: Obviously you made too big of a game then and want to repeat same mistake! And yes, it is how it looks like but I dare you to be this smart, about your project, when you start it. Knowing if your game is too big for arbitrary limit requires big experience in, not only in making games, knowing system inside out you are working with.


Look I know that if you go through my released code you can easily get 10k code free or more. Remove classes (OOP in lua, red flag, right?), remove half of variables with long ass names etc. Here is a thing. I want to start cleaning code only after I finish the whole game. There is a reason for I wrote stuff the way I wrote it - it makes remembering code and working with it easier for me - and don't want to handicap myself too early. What I want to is to have ability to ignore code limit as long as I am running it locally only. I don't like doing optimization mid coding, hate when I am forced to stop in the middle of writing somehing - so I can free some space  and dislike how code limit force you to write non-readable code. I could start with writing compact code from the beginning, but I don't want to do that. The more code I write, the more important is to me to write descriptive code - which isn't space friendly.

TL;DR


Tried to make too big of a game before (for PICO8) and code limit bite my ass hard. I created 1 small project for TIC-80, but looks like I want to create big game again later and before I do that I want to ask you if we can do something about code limit or should I just be realistic and move on to something else.

Questions:

1. Am I making too big of a game for TIC-80? (I am talking about consolidating 3 prototypes described earlier)
2. If yes, does that I mean I am trying to do a game that isn't compatible with TIC-80 design?
3. If yes, should I just move to other fantasy console (like LIKO12) that doesn't have code limit?
4. If no, can code limit became soft? Or can we do something about it?

If there is a yes to the 4th question, what I am proposing is:
- After you hit 64k code limit, show warning in editor (like having code count in red) and when running game/saving file/exporting game show descriptive warning (same as one you have when trying to run too much code via external lua file (dofile))
- Don't allow to upload such games to tic80 repository.
- If exporting to exe/html5 etc. show only warning
- Allow hard code limit to be configurable, so i.e. you can limit yourself to 128k/256k, while 64k is still hard limit for uploads.

I don't want to move to other console if I don't need. TIC-80 looks like the best of all fantasy stuff and perceive it as most user-friendly. Which is why I want to remove code limit as it is in my opinion very unfriendly and stands in contrast to what TIC-80 wants to be.
(But maybe I don't understand what TIC-80 is for?)

I have problems with creating sounds I want using SFX editor. I have trouble parsing what is written in the wiki to practical usage.
I didn't found any topic related to this or yt on the subject. I tried using sfx from other carts, but it isn't perfect...
I only have Pico8 and Pixel Vision 8 experience but don't really know how to translate that to Tic-80.

Ideally if someone would make video like one for pico8 (not made by creator!)

I understand that I am asking for much, so any tips are welcome. :)


(Linked video)

Thanks. :)

I think I fixed it now, dropbox is preventing you from clean link to image. If someone have same problem as me, look here: https://cantonbecker.com/etcetera/2014/how-to-directly-link-or-embed-dropbox-ima...

If someone could confirm, that would be great. :)

Update: Added working inventory which you can see with creating keys mechanic on this gif:


GIF LINK

Great, thank you for info. Roadmap would be nice, or is there a one already and I missed it?

Hi all,

I am suprised how map editor is unfriendly compared to great sprite editor.

There is no erase brush (I use first, 'empty', tile as a substitute).

Not having ability to select more than one sprite is really tiring (when you have map piece that is bigger than 8x8 pixels), but that wouldn't be so bad if not the next point...

There isn't working select/copy/paste/cut option (which could really speed up creating process) even though there are icons for those in top bar.

Are those things are in and I just don't know how to use it? Or is there any eta for those things?

Thanks for help

Thanks for letting me know. Added clickable links below embeded ones as they don't look broken to me.

(5 edits)

This is simple prototype of lockpicking mechanic. Currently the whole project serves only as proof of concept.

As you can see in the first gif:


GIF Link

you open lock by providing valid combination of Left/Right presses.
Idea is to have system similar to Gothic series/Risen 1 lockpicking but with more emphasis on player skill instead PC abilities unlocking.

So what is different in my version?

- There is no skill to unlock, from the start you know how to open locks.
- Difficulty of the lock depends on lock combination length and pattern a lock have
- Each type of lock determines different chest sprite - knowing what chest you are opening is valuable information
- No memorisation, you learn what pattern each lock type have, no specific combinations.
- No random chance
- Lockpick breaks only if you make a mistake at the same combination step twice, to punish recklessness.
- You can also open locks by force (but only low level ones) or by key
- With key you can also close the chest (if you need to cover your tracks or plant some item inside)
- You can create keys at special table, with every combination you want, or steal them from owners

Skilled lockpicker can quickly loot whole floor full of chests with only one lockpick and/or set of keys.


EDIT:

Atm. I am 80% completed, still need to implement inventory (to have ability to switch between created keys) and bashing locks.

Atm. I am 90% completed only need to add bashing locks to have full functionality I envisioned for lockpicking/opening locks mechanic. Although I think I skip (bashing locks) this and leave it for the future if I decide to make full thief build prototype (which would have sound/stealth mechanics where bashing locks would have consequences).

Not sure if I release it as playable version (cause I would need to make one), but wanted to share some stuff.
I have no idea how I could make simple scenario based only on opening locks mechanic, but if I think of one I would like to make playable version of this. If someone have idea, please let me know in the comments. :)

Regardless of playable version, I release WebGL build of project as soon as I manage to make one (https://github.com/PixelVision8/GameCreator/issues/40)


Bonus GIF:

Working inventory and creating keys mechanic on this gif:

Just like title says.


https://github.com/PixelVision...

https://github.com/PixelVision...

(1 edit)

Btw. bug still exists. Just reminder, before you release bugfix version. :)

Edit: Github issue: https://github.com/PixelVision...

I will do that later, can't remember github creds. and have no access to mail currently. What you mean by adjusting? I don't think so.  I am only using ScrollPosition() as provided above and dynamic objects (that are drawn with DrawSprites()) have static x,y as they doesn't move (so far).

Hi, so title says all.

I have simple camera system in place that is based on player position in the world.

Camera position is set like this:

    function Init()
        glCamera.xPlayerOffset=glScreenPixelWidth/2
        glCamera.yPlayerOffset=glScreenPixelHeight/2
[...]
    function Update()
        glCamera.x=math.max(0,math.min(glPlayer.x-glCamera.xPlayerOffset,
            glTilemapPixelWidth))
        glCamera.y=math.max(0,math.min(glPlayer.y-glCamera.yPlayerOffset,
            glTilemapPixelHeight)) 

It makes sure that screen is always centered on player unless we hit bounds of map (0,0 or tilemap size).
I am scrolling stuff with ScrollPosition() and this is my order of calling stuff:

function Draw()
    Clear()
    ScrollPosition(glCamera.x,glCamera.y)
    DrawTilemap()
    DrawObjects()
end

Where DrawObjects() iterates over dynamic objects in the game and draws them using DrawSprites().

If I move player only on X axis, everything works as expected, but if I moved player over Y axis (or both) dynamic objects, drawn with DrawSprites, are somehow scrolling with camera (but only over Y axis) - and I made sure that those objects doesn't change position.

editorBridge.fps works as intended. :)

Yeah, after seeing Unity export function I feel like whole thread is over. I really like idea of sketching in GC and moving on into Unity. With that in mind I think it would be good to have some hard limitations.

The more statistics exposed, the better. :)

Somehow missed this function. Did quick test and works the same as apiBridge version.

You could paste all of this you wrote into documentation and it would help tremendously.

I was having wrong assumption that drawing to cache is faster and more desirable rather than drawing onto tiles itself, but seeing how easy it is to clear tile it now makes sense.

1. Yeah, while it is obvious in retrospective, it isn't really at the start. But I am used to thinking that if x,y args in method means diff. things depending on other argument, then it should be in separate method instead. So I wasn't expecting it.

Sure, getting good documentation is iterative process.

(3 edits)

Thanks to this topic: If you want to redraw HUD part of screen, every frame, you basically lock yourself to 30fps I started thinking about Game Creator and

wondering if I am expecting something real or my own imagined fantasy console.
 
My biggest grip is how v0.7 introduced lot of limiting, hardware limitation like, decisions.
Last versions where more lenient on how stuff is done and imho that was good choice. Going back on this feels like a downgrade to me.

In my childhood I played on NES and SNES, and later on emulators, so I understand nostalgia and appeal of creating game from that times... but I have trouble seeing pros of developing with problems from that era. Of course, I am not your 8bit purist/'there is right way of doing things' type of guy. This is why I moved away from Pico8 with frustration, despite having game out and knowing how everything works. I was tired of those arbitrary decisions - most notably code limit. When i saw Game Creator, without code limit, with tool editing/creating and ability to choose/create template I thought this is what I was looking for.

I was seeing GC as a env. that takes 8bit idea as a concept, for player to decide what to do with it, rather than set of rules.
My grip is that v0.7 backed up from, what I was experiencing, is Game Creator spirit.

This isn't necessary bad, there is big group of 8bit purists, that still looks for something more than Pico8,TIC etc., and I may not be the target of GC. I just want to show my side of the coin, as I am identify myself as one wanting best of two worlds. Let's say I want to see 2017 development/way of doing things in 8bit env.

My question is: What is spirit/purpose of Game Creator? Do I have wrong impression of what GC is trying to accomplish?

(1 edit)

Tough decision. I understand you trying to balance between going old style and going user convenience, but from my personal perspective, this gets detrimental to end product.

Good way, for now, would be to allow all solutions you described so user can decide what works best for his/her game.

Because if you choose to use more lenient method, purists will be angry and if I you choose 100% true way of 8bit, it will throw away all those people looking for developing game in 2017 way with limitations. (like me)

Then, making several methods is very time consuming and prone to bugs...

This thread made me think about Game Creator and I moved it to separate thread: LINK.

I found lacking in LUA Api that:

1. there is no information when I should pass pixel x,y, for drawing functions like DrawText/DrawSprite etc. , and when should I pass tile x,y.

2. There is no information where stuff,  ScrollPosition, RebuildTilemap etc., belongs to Update or Draw method and why. Looking at demos and my own experimentation it looks a bit confusing. like ScrollPosition should be done in Draw function (tilemap demo)?

Sorry I already moved past this so I can't provide code, but can confirm this behaviour was from rebuilding tilemap each frame.

I was doing this because I wanted to draw gui stuff at 0,0 space (where I have normal tilemap sprites) then draw HUD part of the game from 0,0 on tilemap and then clean tilemap to original state, so when drawing game portion of the screen gui doesn't appear there. But unless I missed something, it looks like it is bad way to approach drawing gui on tile map, so I switched to drawing GUI outside game portion of tilemap (I resized tilemap to have 1 empty screen of space for gui). I think this is how old games drawn gui, right?

Also, by asking for distinction between DrawMode.TilemapCache and DrawMode.Tile I meant what is a difference for me by using one over another.

Sure, thanks for letting me know.

Sounds good.


For now I created simple FPS calculator, which at least shows when game gets over 100% cpu consumption.

If someone want to use it:

function CalculateFPS(timeDelta)
    table.insert(FPSTable,(1/timeDelta))
    local l=#FPSTable
    if l<10 then
        return
    end
    local n=0
    for i,v in ipairs(FPSTable) do
        n=n+v
    end
    averageFPS=n/l
    table.remove(FPSTable,1)
end

Calling this function in Update function allows to check current FPS in averageFPS variable.

So I am trying to draw HUD just like it is done in need tilemap demo and if I want to redraw something from HUD space I am not drawing rest of the screen in that frame and vice versa.
My quick tests shows me that you can't draw both on same frame as it doesn't work.
I understand that every dynamic thing should be drawn with DrawSprite and not with redrawing tilemap, but I am trying to upgrade my logger debug lib (https://itch.io/t/79403/debugging-tools-logger) that would eat up sprite limit quite quickly.
Easy solution would be not to redraw HUD space every other frame, but... then you still lock drawing game space into <60 fps. What is the reasoning for how this works? And can I bypass this?

(4 edits)

So I upgraded to v0.7 and I have trouble upgrading my code to get same behavior as I got from deprecated apiBridge.

I want to have ability to draw non dynamic text easily. Before v0.7 I used RebuildScreenBuffer() on each frame and then I drawn font with DrawFontToBuffer on each frame.

Now if I use RebuildTilemap() instead DrawFontToBuffer() on each frame I get wanted behaviour only if I use DrawText() with DrawMode.TilemapCache. Which isn't bad, but for some reason that text is drawn only on transparent pixels of tilemap (and there is no aboveBG bool for DrawText like it is for DrawSprite function). If I want to draw 'above' existing tilemap I need to use DrawText function with DrawMode.Tile, but then RebuildTilemap() doesn't clean it. My workaround around this is to:

1. generate 'clean' tilemap data (before calling any DrawFont) at Init() with:
    for y=0,tilemapHeight-1 do
        for x=0,tilemapWidth-1 do
            add(gl_tilemap,Tile(x,y)["spriteID"])
        end
    end
2. Clean whole tilemap with call on every frame: UpdateTiles(0,0,tilemapWidth,gl_tilemap)
3. call DrawFont with DrawMode.Tile after calling UpdateTiles

While I can make sure I don't regenerate whole tilemap every frame, but only overwritten parts, I am not sure if it is intented way, also I can't have fontSpacing with DrawMode.Tile. How I should procced with this?

Bonus question:
1. What is a difference between DrawMode.TilemapCache and DrawMode.Tile? I read new documentation but I still don't understand.