Skip to main content

Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics
SalesBundles
Jobs
TagsGame Engines

ahmwma

190
Posts
3
Topics
176
Followers
193
Following
A member registered Mar 18, 2017 · View creator page →

Creator of

Recent community posts

(1 edit)

Yay! This is a really good thread idea.

My absolute favorite beginner tip is the bring out the TOOLBARS.

Decker > Toolbars in the menu. 

It has all your drawing tools, colors, and the ability to swap between Widget mode and Interact mode with a single click.


Also, y'know how you can navigate cards with the arrow keys? That's the navigate[] event, and it can be modified so that your players can no longer sequence break or poke around where they shouldn't. (Sorry players.)

My personal favorite recommendation for people who aren't sure what to do with that is to borrow the Deck-level script from Internet Janitor's Dex Vex:

on navigate x do
 if !deck.locked send navigate[x] end
end

This deactivates the arrow key navigation if the deck is Locked/Protected -- which people often choose to do when publishing to remove the top Menu Bar from the final project, as mentioned above by treegravy.

But this version of navigate[] still lets you (the person making the deck) use arrow keys while you're working on your Unlocked project.

Put this in the script section that you find in the menu at File > Properties > Script... if you want to try it. 
(If you don't like it, just delete this part of the script later -- Decker will return to the default navigation)

---

Some Visual Novel considerations:

It's super possible and very cool to make Visual Novels in Decker without any kind of scripting.

Put text and images on a card. Use buttons that lead to other cards to move forward through the story or make choices.

It's just the basic widgets and your story however you want to tell it.

A recently published deck in this style is Ed Naarel's take me to the lakes where all the poets go to die --  please check the content warnings on any of the links in my post before playing, lol -- which has plenty of flourish and  storytelling using this kind of button navigation between cards.

A way to think about this kind of Deck is that it's sort of like laying out physical notecards and connecting the paths between them with string. (But the string is buttons....)

Whether it's Linear:

Or Branching:


It's just cards connected together and it works great for lots of projects.

---

On the other hand, for something a bit more similar to a standard visual novel engine there are the officially supported modules: Dialogizer and Puppeter. (Both can be found in your examples folder)

The Dialogizer module creates dialog boxes, and can read a (narrative) script written in a text field so you don't need to (code) script very much at all, except for set-up.

The Puppeteer module can display images of characters and can move them around for a traditional visual novel sprite experience. It's very easy to change expressions or have a bunch of characters in one scene. And it was built to work well with Dialogizer to do exactly this:


In this case, the way the Deck is set up is a bit more like a stage play where you might not have as many cards (backgrounds) but you can have much longer scenes play out on each one. 

And you will probably need to have some "behind the scenes" cards, where your character sprites are stored. (I like the metaphor of these being the Character's Dressing Rooms, Prop storage and so on).

There's a bit more set-up involved with this kind of Deck than when making a no-script project. But it's really not too hard to get started with these modules as a newer user. I know of several people who used these in their first projects.

(And I'm sure a longer thing can be written up about how to do it, if people want to use it but are having trouble).

---

If none of this feels right.... you can definitely make your own concept and ideas for how you want your story to be presented or for how the player should interact. Decker is very flexible, and a lot of us love to help people figure out how to make those ideas real inside the program.

Some further examples of different storytelling:

Air Gong's Daisy Chain comes to mind -- it uses a wide variety of widgets and a more multimedia-type experience to tell the story. 

Or alternatively there are narrative explore-a-computer games like trainspotter's EyeOS or Gray-LoFi's  Old Web Cobwebs that might be inspiring for other ways to tell stories -- or parts of them -- in Decker, even if they're less traditionally Visual Novel-y.

---

Some specific example folder decks that are broadly helpful, or have useful resources:

All about Color (Info on color palettes, 1-bit patterns, importing images, etc)

All about Sound (Info about sound! Just the basic Decker stuff, not how to use Millie's JankyTunes)

All about Fonts (Bonus fonts exist in here! And you can make your own!)

All about Brushes (Bonus brushes for your art! And instructions to make more. I really love some of the brushes in here!)

Public Transit (I can't find an online mirror of it yet but it's in your Example Folder! It has even more Card Transitions!)

(1 edit)

Okay!

I'm going to make an example based on what I understand about your project and describe it step-by-step, in case it helps anyone else... I think you've got most of this set up but hopefully something along the way will fix whatever isn't working for you too -- or maybe this will create more questions, which I will do my best to answer.

Step 1: Have a Deck open

Step 2: Transfer the rect module from the draggables example deck.

Use the File > Resources Menu, select draggable.deck from the examples folder that came with your downloadable Decker and use the "Choose..." button. Select 'rect' and use the copy button to copy it across to the current deck.


Step 3: Create the two widgets that will interact
(I put a doodle of a Hand inside a canvas, and wrote a fake Bill in a field for the purposes of the example.)


Step 4: Make the canvas draggable inside of it's properties menu.


Step 5: A little bit of Lil. 
(This is basically the same script Millie wrote, but my example is written with the hand is moving onto the bill, rather than the bill moving onto the hand because now I know which widget is which.)

on release do
 if rect.overlaps[hand bill]
  go["card56"]
 end
end

I put this script inside of the draggable canvas.

And... this seems to work for me, how I think you want it... at least based on what I know.


Here is this little example in a deck that you can poke at: (Link)

If you're trying to get some other behavior out of your widgets, please let me know and I'll do my best to adjust the example to what you're trying to make

A small, clarifying question:

You have two widgets, a field and a canvas. And two objects, a bill and a hand.

Are you intending for the Field to be dragged onto the Canvas?

Or for the Canvas to be dragged onto the Field?

(It makes a difference)

Hi there! 

The beginning of the jam is approaching and I'm wondering what other participants are thinking about, and what they're looking forward to.

I'm pretty comfortable working in Decker but I'm not much of a writer so my personal challenge for this jam is to write my own (short) VN this time. I've got a loose idea so far!

For anyone dropping by who would like to talk about their own projects, now or later into the jam:

  • Have you used Decker before? Is there anything you're not sure how to do?
  • Are you working with familiar stories and characters? Or branching out into new ideas?
  • Anything else you're thinking about for this Jam?

Love the way you tell stories. Stunning.

Sound is not my strong point, but I do know there are some peculiarities about sound in native Decker that are a little different in Web Decker and (temporarily) using the browser-based Web Decker to import your sound clips might be the easiest workaround for mystery audio problems.

You can either open your project in Web Decker to import them before saving the file and re-opening it back in native Decker. 

Or you can import them into a blank Deck, save it, and transfer the audio clip to your active project using the File > Resources menu. 
(Or by dragging the other .deck file onto your open Decker project from a folder -- that will also open the same resource transfer window)

Another interesting thing about Web Decker is that it supports any audio file format your browser can handle, it's not just limited to .wav files. This might also be easier in some ways if you're having to convert clips anyway.

Hopefully this helps in the short term! If there's still issues please say so and I'm sure someone with more audio experience can help.

Stubble Fernando.... what an adventure.

(1 edit)

On the subject of time... So, I did make Tea and Bread (as Millie mentioned -- thanks!) using the .beat clock for my timers. 

Specifically this version of it that sends out events and it does work for creating timers. It definitely does that.

But you can also skip the clock contraptions and make a simple text field or slider widget into a timer instead.


Using a text field as an example:
1. Make a field
2. Set it to be animated in the widgets menu (so that it experiences 60 'on view do' events per second)
3. Write a tiny script so that it increases the number inside the field every time there's a 'on view do' event:

on view do
me.text:me.text+1
end

Ta-dah! It's the basic building block of a timer.  This version of it will make the number go up forever.

But since we want to change cards when we hit a certain amount of time.... we can do something like this:

on view do
if me.text=300 # if the timer has reached 5 seconds (5 x 60 = 300) #
me.text:0 # reset the clock #
go[home] # and go to another card #
else
me.text:me.text+1
end
end

300 view events (5 seconds) is way too fast for what you're planning -- but I hope it's a nice understandable number for testing.

Any amount of time you want to use in your scripts should be converted into seconds, and then multiplied by 60 -- this is the total number of 'on view do' events that must happen before you reach your intended time.

----

Now, the bit I'm not sure about is the pointer -- I've never done anything with pointer.pos and I'm not sure how to script that off the top of my head (Sorry!)

But I will bring up the issue of mobile users, and offer an alternative (until someone more familiar with pointer comes along...)

It's a nice feature of Decker that the majority of decks work the same on touchscreen devices like phones and tablets as they do on computers.... but these devices don't track pointer.pos in the same way. They don't usually have a cursor to track the position of. (I think Decker just looks at the most recent tap on touchscreens...?)

It's possible that this is fine for your project and having it work slightly differently on mobile isn't a big deal. But, y'know, something to think about.

So here is a possible alternate version of your request -- one that resets the clock when there's a click/tap, rather than while the player is moving their mouse cursor:

on view do
if pointer.held # if a click happens #
me.text:0 # reset clock #
elseif me.text=300 #else, if we've reached 5 seconds on the clock....#
me.text:0  # reset the clock #
go[home] # and go to another card #
else
me.text:me.text+1 # make number go up#
end
end

And here's this version of the field widget to copy-paste into your deck if you'd like to mess with it :

%%WGT0{"w":[{"name":"field1","type":"field","size":[36,15],"pos":[228,35],"animated":1,"script":"on view do\nif pointer.held\nme.text:0\nelseif me.text=300\nme.text:0\ngo[home]\nelse\nme.text:me.text+1\nend\nend","show":"transparent","value":"0"}],"d":{}}

I hope this gives you something to work with!

And alternatively, if you wanted to use a slider instead of a text field for some reason: 
Use me.value in the script instead of me.text and make sure to set the maximum value of the slider to at least the number you intend for it to reach.

Beautiful ❤️

Hi! Welcome!

Two answers, depending on why and when you want to hide it:

1. A published deck without a visible menu bar is "Protected/Locked" -- this is done in a different save menu than the usual one because a locked deck is stuck in Interact mode and can no longer be edited. This is usually the final step before publication. 

You can find this option in the menu under File > Properties, where you can also adjust the name and author properties of your project if you'd like to and then you can save the locked/protected/"no menu bar" version of the deck with the "Protect..." button.

2. While you're making your deck, and while you have a drawing tool active you can hit the "M" key on your keyboard to hid the menu bar. It's very useful to make sure your cards will look how you want them to when the menu bar isn't visible anymore.

I hope this helps!

(1 edit)

The short answer is "Yeah!" Variables are usually stored in widgets in one way or another.

The long answer is "Yeah! But there's a lot of ways this could be done depending on what you need, so it would help to narrow it down."

A field is always a good option for storing numbers and strings of text to refer to later.

Here's an example of making a user-entered name appear in an alert:

Button script:

on click do
 alert["Your name is ", namefield.text, "!"]
end
field.text is useful for referring to the simple (non-Rich Text) contents of a field in scripts.
(replace the "field" here with the name of your actual field widget!)

If you're using something like the Dialogizer module there's a helpful reference for how to do this same thing in the dialog boxes created by the module.

Or it might be handy to know how to how to refer to a widget on another card....?

Reusing the example above.... if I needed to check this same stored string of text from a different card later, I could write it like this:

alert["Your name is still ", othercardname.widgets.namefield.text, "!"] 

You can also store numbers in fields and use field.text to set them, and modify them and so on.

This is sort of just a general answer -- it might not be what you needed for your project at this exact moment. 

I'd love to make a more specific answer for you if you can narrow it down to a more specific question. :D

It seems like you got it figured out, you just needed an example of how to write it.

As you noticed, the "on change do" event handler inside the slider will usually only trigger when it's clicked/interacted with directly.

So here's an example of how to cause the "change" event to happen from inside a button script:

on click do
 slider1.value: slider1.value-1
 slider1.event["change" slider1.value]
end

Hopefully this gives you what you needed. Looks cool!

It's tough, but good luck out there. Sometimes a big change is the thing that lets you connect to someone in a different way instead of just seeing them around.... Well, sometimes. I'm still figuring this stuff out too.

I hope some of your metaphorical plants grow with you into the future -- or that you find new ones, in new places.

I'm assuming you only want the dialog to appear one time when the player gets to the card.


One way to do it is to put the "one time only" part of the script into an If statement, which checks some condition to see whether or not to play the scene and then modifies the condition once it's done.

In this case, I'm using a checkbox on the card named 'arriving' -- You can set a button to be a 'checkbox' in it's properties menu. Checkboxes either have a value (marked/True) or nothing (unmarked/False).

on view do
 if arriving.value # looks to see if the checkbox is True #
   dd.open[deck]
   dd.say["The first message."]
   dd.say["The second message."]
   dd.close[]
   arriving.value:0 #sets the checkbox to False so the scene doesn't repeat #
 end # the 'end' for the If statement #
play["bus sound" "loop"]
zazz.wave[card wave_bus 0.002]
go[card]
end

But we also need to make sure the checkbox is True when it needs to be.

On the script (whether in a button or not) that led to this card you can add

NameOfBusWaveCard.widgets.arriving.value:1

before the

go["NameOfBusWaveCard"]

to make sure the checkbox is marked True before the player gets there. Replace "NameOfBusWaveCard" with the actual name. :) And if you like how everything works, you can set this "arriving" widget's visibility to "None" to hide it from your user.

Hopefully this gives you a tool for setting things up how you want them! Please let me know if you need something else and I'll make a different example.

Loved this!

The new font editing deck has been so smooth to work with! Well done.

(1 edit)

Oops, you're right! I changed my mind about how to do it while I was writing the post and I think I updated the widget in my open copy of decker and forgot to update the code snippet for you.

My mistake! I'll fix it for anyone who stumbles on the thread in the future. The codebox in the post is correct, and now so is the copied widget.

It sounds like you've got it figured out now, though. :D Good luck with your project!

(1 edit)

Following up on Millie's post -- I made a little slider example that does what she said in the last section. This slider is animated (60 view events per second), locked (not interactive for users in Interact mode) and volatile (doesn't save the value stored in it between sessions).

%%WGT0{"w":[{"name":"timerslider","type":"slider","size":[100,25],"pos":[152,105],"locked":1,"animated":1,"volatile":1,"script":"on change val do\n\nend\n\non view do\n if me.value=180 #60 frames per second x 3#\n me.value:0\n go[\"Next\"] #change this to the name of the card you want to go to#\n else\n me.value:me.value+1\n end\nend","interval":[0,180],"style":"compact"}],"d":{}}

And, explaining the script contained in it:

on view do
if me.value=180   
me.value:0   
go["Next"]   
else  
me.value:me.value+1  
end 
end 

Or, to explain it more casually:

on every view event (60 per second on this animated widget) 
IF my stored number has reached 3 seconds (180 = 60 frames x 3) 
reset me back to 0 
then go[] to another card 
ELSE (in any other circumstance) 
make my stored number go up by 1 
end (for the if statement) 
end (for the on view do)

Technically I made a "Count Up" rather than a "Count Down" but I hope it makes sense anyway! You're welcome to use or deconstruct this example for your project.

More notes:

Probably change the go["Next"] to have the name of the card you actually want it to go to?

A live countdown timer can be a little annoying while testing your other interactive elements... But it should be fine if the rest of the card is ready.

If it's annoying while testing anyway I can explain a way to make it easier to work around while editing your project. I wanted to keep it simple for this example.

When everything works how you like.... set this timerslider widget's visibility to "None" so your players can't see it. :)

(1 edit)

The 512 by 342 size of a Card includes the space under the Menu bar. You can hide the Menu bar with the "M" key on your keyboard while you're placing your imported images (or otherwise using drawing tools) on your cards in Decker.

To explain a little more.... if you choose to 'Lock'/'Protect' a deck for publication the Menu bar and all of Decker's editing tools are hidden from your users and that space underneath the Menu bar becomes visible on every card.

Beautiful art, by the way!

it's so nice to see your art collected like this! <3

...the GLOVED HANDS.... really cool cutscenes!

Enjoyed this a lot. The quail...

(1 edit)

Scripts typically can only run while you're in Interact Mode (or from inside the Listener). Likewise, the canvas.brush attribute you mentioned, when it's used in a script it only meaningfully changes the brush setting for that one canvas when the canvas is clicked in Interact Mode, y'know? (I think you knew that, I'm just clarifying for anyone wandering by.)

So, yeah, I don't think it's possible to change your Drawing Mode tool or brush via scripting.

But, in case it's of use to you and your project: 

The Toolbars do extend downwards with an arrow at the bottom if you have more than the default amount of brushes.


 And as a further example, this is how the 'stamp'-style brushes from the brushes example deck appear on the toolbar:


The last one is quite a large stamp, relative to the others, but it's neatly constrained to it's own little rectangle and it's not too hard to figure out which one is which.

I hope this helps, I'm excited to hear that someone is making use of custom brushes!

Thank you so much for checking it out!

Well, the good news is that I don't think you're doing anything wrong and there does seem to be a way to continue authoring your project on iPad.

I had to ask a friend with an iPhone to test this for me, so I hope this works the same for you. Safari on iOS doesn't seem to want to open .deck files at all, so we'll use the other file format that Decker projects can be saved to -- HTML.

1. Save your project as a .html file instead of a .deck file
If you're not sure how to do that: in the Save As menu, write .html at the end of the file name.
This will have a slightly larger file size than the same project as a .deck but that's fine and normal.

2. When you want to open your project again go to a copy of Web Decker hosted online.
For example: The Decker Tour Deck is online, unlocked, and always there for you.
(Yes, it does seem like you have to do this instead of opening the .html project file from your device's File system.)

3. Use the File > Open menu inside of that online instance of Web Decker to open your project.

Then make sure save as .html again when you're done!

---

Your existing .deck file should be able to be opened in Web Decker on a non-iOS device and saved as an .html file so you can continue using it on iPad with this method.

Web Decker is nearly identical to Native Decker when it comes to authoring projects. One of the main differences between them, unfortunately, is that there's also a web browser involved in Web Decker. And every web browser has it's own slightly frustrating quirks. I'm sorry you've run into this one.

Anyway! If the method above works for you, I'd love to know.

This is so very lovely! Well done!

&  is AND,   |  is OR.

if thing1.value & thing2.value # AND
if thing1.value | thing2.value # OR
if ! thing1.value # NOT

Do these examples work for what you need? There's more in this post as well.

Enjoyed this a lot. So many stories.

(1 edit)

It might be easier to use the more general "Bouncer" version of this contraption:  https://itch.io/post/8380177

You can open up the properties menu of the contraption on the card where you want to use it and paste a different image into the image box:

I think most people prefer to use the native Decker application on a computer to author their projects rather than any kind of web Decker, if the option exists.

But it is possible to reduce the amount of extra space around the program on a phone screen.

If you hold your phone in a horizontal rotation and select Decker > Fullscreen in the menu bar at the top it brings everything in closer.

And optionally you could also select Decker > Toolbars, which makes a variety of drawing tools available in the remaining gaps on the sides.

(Even if you're not drawing anything it can be useful to be able to switch between Interact mode and Widget mode with a single click -- or tap -- with the buttons at the top of the left side toolbar.)

I really enjoyed exploring this! Your art makes lovely use of 1-bit. Well done.

bumping with my efforts from the latest jam :)

hoping other people will add theirs too! there's some very cool new stuff!

A wild walk around the wood(s)... I have experienced things here.

Thank you too, for reading! Good luck out there!

Thank you so much!

You're right, the norm doesn't matter! We all have our own levels of what we need in terms of people vs. time alone, for our own well being. (I'm often torn between wanting to see what the people I care about are up to... and my extremely low battery for this stuff. It's tough to find the balance.)

But anyway... always happy to cross paths with you, fellow introvert.

thank you!! <3

Thank you!!

Yep, everything was made directly in Decker. Turning on the Toolbars makes it a very comfortable little art program and it's nice to be able to do everything in one place for projects like this.

Perhaps I have put a plastic bambino in a plant pot... it doesn't grow leaves or anything but once in a while it does make a weird noise to let me know there's some unmissably cool olszoj art to check out.

Thank you very much for playing~