Ooh, this is good! I really like the way the poem is presented but in general all the presentation feels good and thoughtful! It is scary putting out personal art (at least for me) so I hope you are doing OK <3
Millie Squilly
Creator of
Recent community posts
I have come up with a... sort of solution for drawing all the colour text at deck launch so that I don't have the "pop in after transition" issue
Essentially I've just put this function in my deck-level scripts to just cycle through all the cards and make them all draw on launch. Then I just call it from the "on view" of my starting card.
(removed, see below for better version)
This is kinda hacky (I didn't see an obvious way to check that the contraptions belong to the right prototype so I'm running it on any contraption) so if you have other contraptions with a redraw[] method that does something else this may not be good but it is working for my purposes!
(Apologies if there IS an obvious way to check which prototype a contraption belongs to and I'm just too eepy to figure it out right now)
Edit: better version, thanks IJ for the tip on picking the prototype name
on refreshcolourtext do each c in deck.cards each w in c.widgets if w.def.name="colourtext" w.redraw[] end end end end
Yes! If you select some text in a text field you can make it a link using the Text->Link menu option. For it to be clickable you'll have to set the field to "locked" in the widgets menu, so that it's not editible in interact mode.
Another tip is if you save out your deck using File->Properties and then "Export" it'll save in a "locked" version so readers can't see all the built-in menus and such.
Let me know if that helps!
So I whipped up a version that uses volatiles, but it does indeed have the problem of, if you're transitioning between cards on a freshly opened deck, it doesn't draw the text in until the end of the transition, so it kind of "pops in". I've uploaded a quick example to show what I mean https://zine.milliesquilly.com/surprises/colourtextpopindemo.html
If there's something I'm missing here please let me know
Here's the new version of the contraption - I'm hestitant to replace the original since it's not a strict improvement, but if you're not using transitions or if you don't mind manually calling "view" on the contraption before the transition it does save on deck size
Edit: slightly updated version, did some experimenting and wasn't able to get manually calling "view" to work so I've exposed the redraw[] function itself. So if you want to use this version and need to refresh the contents before a transition (or whatever other fun things you're doing) you can call redraw[] on the widget to refresh it before your transition.
%%WGT0{"w":[{"name":"colourtext1","type":"contraption","size":[134,65],"pos":[145,125],"show":"transparent","def":"colourtext","widgets":{"canvas1":{"size":[134,65],"pattern":35},"field1":{"pos":[-186,154],"value":{"text":["Look at all this text, it comes in ","different fonts"," and it's red and transparent"],"font":["","menu",""],"arg":["","",""]}},"slider1":{"size":[116,25],"pos":[-52,149],"value":35}}}],"d":{"colourtext":{"name":"colourtext","size":[100,100],"resizable":1,"margin":[0,0,0,0],"description":"Like a text box, but with colour! With volatiles now. Exposes a redraw[] function if you need to refresh it manually for whatever reason.","version":1.2,"script":"on get_colour do\n slider1.value\nend\n\non set_colour x do\n slider1.value:x\n redraw[]\nend\n\non get_value do\n field1.value\nend\n\non set_value x do\n field1.value:x\n redraw[]\nend\n\non redraw do\n canvas1.clear[]\n canvas1.pattern:slider1.value\n size:canvas1.textsize[field1.value canvas1.size[0]-4]\n canvas1.text[field1.value 2,2,size]\nend\n\non view do\n redraw[]\nend\n\non get_redraw do\n redraw\nend","attributes":{"name":["value","colour"],"label":["Text","Colour (palette index)"],"type":["rich","number"]},"widgets":{"canvas1":{"type":"canvas","size":[100,100],"pos":[0,0],"locked":1,"volatile":1,"show":"transparent","border":0,"scale":1},"field1":{"type":"field","size":[100,20],"pos":[-186,189]},"slider1":{"type":"slider","size":[100,25],"pos":[-52,184],"interval":[0,47],"value":1,"style":"compact"}}}}}
Thanks, I have yet to get my head around "volatile" but I will experiment. I was hesitant to try because I wasn't sure whether it would play nice with transition functions, e.g. would it only call the "view" at the end of the transition?
I will experiment and see if I can get it working, since not having images saved in the deck files is probably nicer
Ever wanted to be able to have text fields that are colours other than black or white, or indeed have white text on a transparent background?
ColourText can do that!
It's a pretty simple contraption, there's a field for rich text and a field for the desired colour (by decker palette index). It'll flow/wrap the text fine, but if you're resizing in widgets mode it won't update until you switch back to interact mode. It can't do the "editing in interact mode" thing like real text fields can nor does it have support for adding borders or being able to scroll. If you need those I'll say it's a challenge for the reader at the moment.
Give it a try though! Let me know if there's any obvious bugs or fixes I ought to do.
Edit: you may want to grab the updated version from the comments - it sets the internal canvas as "volatile" so that when you save your deck it doesn't include the image of text, thus saving on space. But it has the drawback of playing a bit funny with transition effects in a way that is workaround-able but requires some coding, so I'm leaving the original version here in case that's easier for you
%%WGT0{"w":[{"name":"colourtext1","type":"contraption","size":[134,65],"pos":[142,122],"show":"transparent","def":"colourtext","widgets":{"canvas1":{"size":[134,65],"image":"%%IMG2AIYAQQD/AJUjAQAOIwEADCMBAAkjAgABIwIABCMBAAIjAQAFIwEACSMBAA4jAQAIIwEAAiMBACgjAQAOIwEADCMBAAojAQACIwEABCMBAAIjAQAPIwEADiMBAAsjAQAoIwEABSMCAAMjAgACIwEAAiMBAAQjAgACIwMABCMCAAMjAQACIwEAAyMDAAEjAwACIwIAAiMDAAMjAwACIwIAAiMBAAMjAQABIwMABiMCAAEjAwAEIwIAAyMCAAIjAwABIwIAAyMCAAMjAwAJIwEABCMBAAIjAQABIwEAAiMBAAEjAQABIwEAByMBAAIjAQAHIwEAAiMBAAIjAQAEIwEAAiMBAAIjAQACIwEAASMBAAcjAQACIwEAAiMBAAIjAQABIwEAAyMBAAgjAQACIwEABCMBAAIjAQABIwEAAiMBAAEjAQACIwEAAiMBAAEjAQACIwEAASMBAAwjAQAEIwEAAiMBAAEjAQACIwEAASMCAAYjAwACIwEABSMDAAIjAQACIwEABCMBAAIjAQACIwEAAiMBAAIjAgAFIwEAAiMEAAMjAQAEIwEACCMBAAIjAQAEIwEABCMBAAIjAQABIwEAAiMBAAIjAQABIwQAAiMCAAojAQAEIwEAAiMBAAEjAQACIwEAASMBAAEjAQAEIwEAAiMBAAIjAQAEIwEAAiMBAAIjAQACIwEABCMBAAIjAQACIwEAAiMBAAQjAQAEIwEAAiMBAAUjAQABIwEAAyMBAAgjAQACIwEABCMBAAIjAQABIwEAAiMBAAEjAQACIwEAAiMBAAEjAQAHIwEACSMEAAIjAgADIwIAAiMBAAIjAQAEIwMAAyMBAAQjAwACIwEAAiMBAAUjAQABIwEAAiMBAAIjAQABIwMABiMBAAIjAgACIwEAAyMBAAMjAQACIwEABCMBAAMjAQAEIwIAAyMCAAIjAQACIwEAAiMBAAIjAgACIwMAXyMBAIQjAQDFIwIAASMCAAMjAwADIwMAHSMCAAcjAwAQIwIALSMBAAwjAgAFIwIABCMCAB8jAgAGIwIAEiMCABcjAQAfIwUAASMCAAEjBAACIwQAAyMEAAIjAgABIwIAAiMEAAIjBQACIwQABCMEAAMjBAACIwUAAiMEAAIjAwARIwEAFCMCAAEjAwAEIwIAAiMCAAEjAgACIwIABCMCAAMjAgACIwIAASMDAAMjAgACIwIAASMCAAIjAgACIwIABiMCAAMjAgACIwIAASMCAAIjAgACIwIAAiMCAAIjAQAEIwIAAiMDAAMjAwAVIwEAASMBAAIjAQADIwIAAiMCAAEjAgACIwIABCMCAAMjAgACIwIAASMCAAQjAgACIwIAASMCAAIjAgACIwIABiMCAAMjAgACIwIAASMCAAIjAgACIwIAAiMDAAgjAQABIwEAAiMBAAEjAQACIwEAFSMBAAEjAQACIwEAAyMCAAIjAgABIwIAAiMCAAQjAgADIwYAASMCAAQjBgABIwIAAiMCAAIjAgAGIwIAAyMCAAIjAgABIwIAAiMCAAIjAgADIwMABSMDAAEjAQACIwEAASMBAAIjAQAVIwEAASMBAAIjAQADIwIAAiMCAAEjAgACIwIABCMCAAMjAgAFIwIABCMCAAUjAgACIwIAAiMCAAYjAgADIwIAAiMCAAEjAgACIwIAAiMCAAQjAwADIwEAAiMBAAEjAQACIwEAASMBAAIjAQAVIwEAASMBAAIjAQADIwIAAiMCAAEjAgACIwIABCMCAAMjAgADIwEAASMCAAQjAgADIwEAASMCAAIjAgACIwIABiMCAAMjAgACIwIAASMCAAIjAgACIwIAAiMBAAIjAgAEIwMAASMBAAIjAQACIwMAHyMFAAEjAgACIwIABCMCAAQjBAACIwIABSMEAAIjAgACIwIAAyMCAAUjAgAEIwQAAiMCAAIjAgADIwIAAiMDAP8A/wBBIwEAAiMBAAIjAQAVIwEAECMBAAQjAQAwIwEAJSMBAAIjAQAVIwEAECMBAAQjAQAwIwEAISMCAAEjAwAEIwMAAyMBAAEjAgACIwIAAyMDAAQjAgACIwMAAyMDAAMjAwABIwEAASMCAAIjAgACIwMAAyMDAAEjAwADIwIAAiMBAAEjAgACIwIAAiMDAAIjAwAhIwEAAiMBAAQjAQAGIwIAAyMBAAIjAQABIwEAAiMBAAYjAQABIwEAAiMBAAEjAQACIwEABCMBAAIjAgAGIwEAASMBAAIjAQABIwEABCMBAAIjAQAEIwEAASMCAAMjAQACIwEAASMBAAIjAQACIwEAIiMBAAIjAQAFIwIABCMBAAQjBAABIwEAAiMBAAQjAwABIwEAAiMBAAEjAQACIwEABCMBAAIjAQAFIwMAASMBAAIjAQACIwIAAiMBAAIjAQACIwMAASMBAAQjBAABIwEAAiMBAAIjAQAiIwEAAiMBAAcjAQADIwEABCMBAAQjAQACIwEAAyMBAAIjAQABIwEAAiMBAAEjAQACIwEABCMBAAIjAQAEIwEAAiMBAAEjAQACIwEABCMBAAEjAQACIwEAASMBAAIjAQABIwEABCMBAAQjAQACIwEAAiMBACIjAQADIwEAAyMDAAQjAQAFIwIAAyMDAAQjAwABIwEAAiMBAAIjAwAFIwEAASMBAAUjAwABIwEAAiMBAAEjAwACIwMAAyMDAAEjAQAFIwIAAiMBAAIjAQADIwEAaiMBAIUjAQD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD8","pattern":35},"field1":{"pos":[-186,154],"value":{"text":["Look at all this text, it comes in ","different fonts"," and it's red and transparent"],"font":["","menu",""],"arg":["","",""]}}}}],"d":{"colourtext":{"name":"colourtext","size":[100,100],"resizable":1,"margin":[0,0,0,0],"description":"Like a text box, but with colour!","version":1,"script":"on get_colour do\n canvas1.pattern\nend\n\non set_colour x do\n canvas1.pattern:x\n redraw[]\nend\n\non get_value do\n field1.value\nend\n\non set_value x do\n field1.value:x\n redraw[]\nend\n\non redraw do\n canvas1.clear[]\n size:canvas1.textsize[field1.value canvas1.size[0]-4]\n canvas1.text[field1.value 2,2,size]\nend\n\non view do\n redraw[]\nend","attributes":{"name":["value","colour"],"label":["Text","Colour (palette index)"],"type":["rich","number"]},"widgets":{"canvas1":{"type":"canvas","size":[100,100],"pos":[0,0],"locked":1,"show":"transparent","border":0,"scale":1},"field1":{"type":"field","size":[100,20],"pos":[-186,189]}}}}}
I was thrown off by having to use "take", since I'm more used to writing "get" for taking objects in these games. In general implementing the common synonyms may be handy (examine as well as look etc) as well as there's some common single letter abbreviations (like the directions IJ mentioned above but also like x for examine). I also noticed the mention of the door disappeared from the room description once I'd started doing things like using the hammer to break the window or the mirror - guessing this is an oversight?
Otherwise I'd second the feedback Internet Janitor mentioned. I'm guessing also there'll be some sort of "I don't know that word" messages for unknown commands in future?
Issue 23 is out! https://zine.milliesquilly.com/issue23.html
I ended up packing way too much stuff into it, but one thing that may interest people here is an attempt at writing a "how to make decker adventure games" tutorial.
I remember when I was writing the crossfade function in palettefade I was kind of trial-and-erroring it a bit in terms of seeing if white and black would come out as 0 and 1 or 32 and 47, since I was having to do pixel by pixel stuff when comparing the two images - worked fine in the end though. Good to know the internal logic!
I think this is a good tutorial. I appreciate the shoutout to palettefade. I may do some poking around later to make sure the col module routines play nice with how palettefade does things, I think they SHOULD but I can't check at the moment. The col module definitely looks handy!
I also think the explanation of the palette and how it's laid out is handy, since I have seen people get confused about how the patterns and colours relate. One thing that's been unclear to me is the difference between pattern 1 and pattern 47, since they're both solid black. The explanation of the difference between pattern 0 and 32 was handy, but I'm guessing it works a bit different since there's no "one is transparent and one isn't" difference with the blacks.
Another thing I found was handy was the explanation about how animated patterns work. I am wondering though, is it possible to use two colours in an animation sequence? The example just sets it to a solid colour, but you could do some simple colour animations if you could have it cycle.
So, there's not really any built-in vector graphics stuff as such, Decker is pretty bitmap based. But if you look at the doco for the canvas widget it's got built in functions for drawing a polygon, a line, etc. I'd think if you write code to use these to dynamically draw whatever shape you want scaled to whatever size is necessary you could essentially do some vector-type graphics this way. If you come up with a particularly clever or general-purpose way of doing it then you could even make it a contraption or module and release it for others to use! This would take some coding though
I have a whole bunch.
zine of Millie already has its own thread but I've made like 22 issues haha. I'll go over the ones on my itch page below
JankyTunes:
For a jam last year I made a whole bunch of musical tools/toys
Janky Drum Machine was my first attempt, a pretty simple drum machine
Janky Synthesizer is a keyboard that generates the noises in real time with a bunch of things you can adjust with the waveform
Janky Sequencer takes the same synthesis engine and uses it in a sequencer, so you can program in tunes and such
JankyTunes: The Contraption is a version of Janky Sequencer that can be embedded inside other decks so you can use it for background music
and I Bring You Notes is a collection of tracks I wrote in Janky Sequencer packaged together as like an EP
Fun game things:
you tried to date me and it went poorly is a semiautobiographical visual novel
Deck(er) The Halls is a digital christmas card
Day, us-ex is a silly gag game referencing a popular immersive sim series
Get Out And Run Some Errands is a point and click game about having to leave the house
and Asteroid Run is an action game about flying a spaceship through an asteroid field
Helpful Decker Modules:
Typetext lets you have text appear in a field one character at a time, optionally with sound effects
PaletteFade is a series of functions for manipulating Decker palettes to create various effects, including fading to black and crossfading
I wonder if a persistent pinned post in these forums would help, as sort of a master list of previous jams as well as when the next one is scheduled. Once a jam is over it can be a bit hard to track down the link, I've found (unless I am missing something, which is entirely possible), so this could help newcomers be aware that there's jams on a regular schedule and also showcase the previous jams a bit.
I've just put out issue 22! https://zine.milliesquilly.com/issue22.html
I used the path module and the follower to make an RPG town style menu!
I did just recently update the code in the deck, so it's possible that the previous version had some glitch in it? Or maybe it was the saved code? Anyway, glad it is working now! I am looking forward to seeing what you're using it for, and as I've said elsewhere please get in touch if you need help with like having JankyTunes autoplay or anything like that!
I don't think I've ever posted a thread about it here, but I've been making zine of millie for a while now, and I'm working on issue 22! Here is a link where you can find it all: https://zine.milliesquilly.com/
There is an example of overriding the navigation events to capture arrow keys and use them for movement with the sokoban example deck http://beyondloom.com/decker/goofs/sokoban.html