So far, a little bit more than 30 levels in the oven. Damned hex of the overly challenging levels, my design is suffering, but they are some damned fine levels, challenges worthy of the most heathenous foes.

Speaking of vexations, the hell of feature creep tried to entangle me today. A terrifying creature, the creeper, but he whimpers at the mercy of the great terror, defying the web, embracing temptation, and incorporating the new ideas without the downfall of dismantled codebases or ruined timelines.

Edited by Diablo on Wed Oct 12, 2016 4:01 pm; edited 6 times

DiabloContributorJoined: 19 Nov 2015
Posts: 388
Location: :( :(

Posted: Sun Sep 18, 2016 4:04 pm Post subject:

I added two new programmatically complicated plot devices yesterday. Damned satisfied with how they turned out both syntactically and synthetically, however the resource cost involved in implementing these new implements meant that I barley had any mana remaining to summon new levels, only got a couple levels out, damned good levels nonetheless. Sunday offered me a modestly fruitful mana potion, as the level count climbed modestly. Soon vermin, I will wrap base level production stage and move forward.

Notwithstanding the potential arrival of bug issues concerning either the newest implements or older implements' implemental interactions thereof, core gameplay programming is complete. The interesting status of a browser game, though, is that it can change very dynamically. Each visit to the page essentially downloads the latest patch, making the addition of any number of new implements virtually unimpeded.

timothy.goldsmithNewbieJoined: 19 Sep 2016
Posts: 1

Posted: Mon Sep 19, 2016 4:26 pm Post subject:

Attention: L. Diablo,
and others to whom it may concern,

I am writing to you on behalf of People for the Ethical Treatment of Animals (PETA). As a lifelong advocate of animals' rights, I forthwith have taken an immediate position of interest in the development of this videogame ("the game").

Before I begin, I will provide the fullest disclosure as required by governing law: I descend from a prolific lineage of snake handlers. For numerous generations, my line has marched at the forefront of snakes and the rights and privileges thereof. Consider this a sworn testimony in fulfilment of all contractual bylaws in the realm of disclosure.

Urgently, I have reviewed the available material for Snakes without Brakes, and I have compiled a modestly extensive list of potential unalienable rights violations. As you provide more information and documentation in regards to this project, I will dutifully update and revise this list as it pertains to your treatment of the snake population at large.

Understand, Mr. Diablo, that any failure to adhere to the documented standards and rights of snakes may and will result in aggressive acts of activism, and I shall endeavor inexhaustibly to shine a terrible and staggering light upon any injustice you bring upon the snakes within this game.

With respect,
Timothy Goldsmith VII
Snake Activism Division
People for the Ethical Treatment of Animals_________________www.peta.org/donate thank you

Understand, Mr. Diablo, that any failure to adhere to the documented standards and rights of snakes may and will result in aggressive acts of activism, and I shall endeavor inexhaustibly to shine a terrible and staggering light upon any injustice you bring upon the snakes within this game.

Damn you, Goldsmith! You're blighting my thread! In any case, of law or otherwise, what may or may not happen to the snakes duringi development, testing, and beyond is not within my control.

DiabloContributorJoined: 19 Nov 2015
Posts: 388
Location: :( :(

Posted: Tue Sep 20, 2016 3:47 pm Post subject:

I entered in the depths of hell, otherwise known as windows, to make a short recording of the basic gameplay. Damned chain of conversions, from using one product to record a (terribly oversized) avi, to another to compress the avi to a viable size, to another website that converts avis to gifs, but for illustrative purposes, I consider it acceptable.

Damn this gif! Continue onwards for better quality samples later in the thread!

Edited by Diablo on Wed Sep 28, 2016 4:43 pm; edited 1 time

DiabloContributorJoined: 19 Nov 2015
Posts: 388
Location: :( :(

Posted: Tue Sep 20, 2016 4:06 pm Post subject:

As this is a development log, I wish to go into a little bit of technical detail on file formats.

By the way, damnation!, I left out the one line of code localStorage.setItem that would have saved my completion data for each of the levels. I have wrapped initial level production, and I had planned on using that data to mete out difficulty ratings for each level, and thereafter to determine optimal level sequencing and/or additional level creations to balance the difficulty wave.

The brunt of recent development centers on the level select dialog. Let's take a quick look at this:

I am very pleased with the turnout for this dialog. Tonight's serving of charred humans will taste better than ever. However, populating this dialog mandated that I commit to creating a level index of some sort.

Individual levels in the game are saved as plain text JSON files. The format is terrifyingly straightforward: title, intro message, snakes[], gems[], you get the idea. When time came to put together a master record of levels, I created a small function buildLevelIndex() that loops through all possible levels. (This was easy enough, as the level names are 0.1.json, 0.2.json, ...) After retrieving each file via an AJAX call, I parsed out the title, difficulty, etc. and saved it into an overall list, that tracks all of the game's levels. levels.json, or something like that.

When the user requests the level select screen, a single AJAX call retrieves that master list, and then uses it to populate the dialog itself. Each level has a "record key," which is used by the population routine to query localStorage for previous completion data on that level. If the record data exists, then those columns are successfully datafied.

Each table column across each row also contains a simple rel attribute for sorting purposes. Consider the difficulty column; the text string is converted to a simple integer by a reverse lookup. The user chooses to sort via the dropdown, the dialog removes all table rows, sorts them using a custom .sort() function that compares the appropriate column's rel attribute, and then the dialog re-parents the rows in the properly sorted order.

SiroccoModeratorJoined: 19 Aug 2005
Posts: 9470
Location: Not Finland

Posted: Wed Sep 21, 2016 2:44 pm Post subject:

I like how you've reused some (or all) of the UI from your recent Lode Runner game._________________NoOP / Reyn Time -- The $ is screwing everyone these days. (0xDB)

DiabloContributorJoined: 19 Nov 2015
Posts: 388
Location: :( :(

Posted: Wed Sep 21, 2016 3:51 pm Post subject:

Sirocco wrote:

I like how you've reused some (or all) of the UI from your recent Lode Runner game.

I specifically remember getting a tip from you on positioning numerical values in the corner, it works damned fine, I threw it into my bag of tricks. I need all the hellp I can get with this stuff.

DiabloContributorJoined: 19 Nov 2015
Posts: 388
Location: :( :(

Posted: Wed Sep 21, 2016 4:19 pm Post subject:

Not a hell of a lot of to update on in this iteration of the devil log. I've re-completed most of the levels for the difficulty rating project, but I still need to finish them off. Additionally finished tuning up the level select dialog, hooking up the sort order dropdown and respecting existing preferences when loading a different level set.

In lieu of meaningful developmental progress, I'll defer to the topic at hand, look and feel of the game.

The visuals of the game are clearly minimal. Originally I was simply using color fills. The "dark" parts of the level did not exist in the first iterations of the game, I believe adding them makes creating more interesting shapes of levels, instead of having perfectly square levels every time.

When a level is loaded, each wall tile is assigned a random rotation and opacity deviation, within a narrow bound for obvious reasons. This helps to mitigate the monotony to an extent, perhaps introducing also a feeling of chaos into the arena. I apply a simple pattern of greyscale deviations to the floor tile.

My primary motive for adding spacing between each grid tile is aesthetic. In conjunction, though, I expect it to make the gameplay easier to parse as well, particularly when trying to count the distance you need to travel with your snake.

Adding as much damned animation as possible was a priority here. Almost every object in the game has some element of idle motion. The weaving of the snakes helps them to stand out to the player, avoiding some potential "where is waldo" conflicts. The motions of the assorted puzzle elements hellps them to stand out as well, ensuring the focus is on solving the puzzle rather than looking for the puzzle.

Speaking of accursedly important visual concepts, the border that appears around the snakes is mandatory. This was an interesting programmatical exercise, although it obviously amounted to a simple directional check (previous left, next down? it's a curve).

Adding as much damned animation as possible was a priority here. Almost every object in the game has some element of idle motion. The weaving of the snakes helps them to stand out to the player, avoiding some potential "where is waldo" conflicts. The motions of the assorted puzzle elements hellps them to stand out as well, ensuring the focus is on solving the puzzle rather than looking for the puzzle.

This is one of the little "secret sauces" to making a game look polished. Animate anything and everything, but not to the point where there's visual fatigue from looking at the screen :D_________________NoOP / Reyn Time -- The $ is screwing everyone these days. (0xDB)

DiabloContributorJoined: 19 Nov 2015
Posts: 388
Location: :( :(

Posted: Fri Sep 23, 2016 4:31 pm Post subject:

Hello, minions. I am in a rather pleased mood, as a result of some development geared toward mobile users.

Yesterday, I commenced upon the righteous path of sound effect work. I do not require too very many sound effects for this game, this is good because my workflow via bfxr.com looks about like this:

Code:

press randomize 20 or 30 times until I hear something "kind of good"
fiddle with all the damned sliders until i make it at least 30% worse
battle cry for increase change of critical mutation
mutate a few times, get a result worth exporting to wav

I figured I'd share a screenshot of some of the new sound effects in action:

As illustrated, I insist upon having a small number of variations to combat aural fatigue. I do not want the download size of the game to become excessively large, so I do not have 20 versions of each sound. It is a damned balancing act. And as usual, I am taken aback and the overall enhancement of the gameplay experience, that you get just by laying a few damned sfx on your game.

DiabloContributorJoined: 19 Nov 2015
Posts: 388
Location: :( :(

Posted: Sat Sep 24, 2016 11:40 am Post subject:

This morning I sorted out the remaining issues with mobile controls. The chief demon, was that I needed to disable the ability of the user to change page scaling, it conflicts with the position: fixed that I employ for the menu and status bars at the top and bottom of the screen, disrespectfully.

Drag and drop control of the snakes themselves also needed some custom tooling here. On a desktop browser I rely on the mousedown, mouseup event to determine when you have selected and released a snake. Because I do not use the click event explicitly, you can drag the snakes in a single click, rather than clicking once to select a snake and then twice to move the snake. It is very much like working nothing but half days, in a way, which is perfect. However, a mobile device did not cooperate, did not trigger mouseup in the same way after a finger drag. (I think it might have sent the mouseup event to the original table cell clicked, but I'm not certain.)

Enter, then, the touchstart and touchend mobile events. The touchstart is the tablet equivalent of a mousedown (in my ledger, anyhow), and it behaves as expected. I attach a touchstart callback to each cell, and if you have touched a snake, then it becomes eligible for movement, either by the laborious second click, or by a drag and release. Consternably, however, the touchend event is directed to the widget on which the touchstart event occurred, without any regard to how far you have dragged before releasing.

To resolve this, I had to get a little bit dirty. I listen for the touchend event on the "snake is here currently" cell. When received, I request cell references for each non-diagonally adjacent table cell (NWSE), and I calculate the absolute screen coordinates of each of those cells. From there, I need only perform a simple collision check between the "mouse position" (in this case, the absolute screen location of the touchend event) and those 4 neighboring cells. This approach is not quite as elegant as I would like (preferably I would receive touchend event on the destination), but it's not my call.

DiabloContributorJoined: 19 Nov 2015
Posts: 388
Location: :( :(

Posted: Sat Sep 24, 2016 5:46 pm Post subject:

I don't recall when I added damned screen wrappin to the game, but it was a pretty early decision. You just have to make sure to use a general purpose getCellByOffset(dx, dy) function that automagically takes the out-of-bounds index lookups and moves them to the first/last index.

I mentioned previously that darkness didn't exist in the first iterations of the game, it made a great addition to be sure, but it also introduced visual ambiguity in regards to , am I going to screen wrap there, or what? It's black as hell, that must be the edge of the level, but it won't let me screenwrap, what the hell? You can only screenwrap at the literal edge of the level, and darkness is just as much of a wall as a wall, but it's unfair to expect a player to so easily discriminate that which the level making sadist sees as so much obvious.

Thus I have introduced screen wrapping guides, which will visually cue players, hey, i can screen wrap there, eliminating the unwanted visual ambiguity, and at the same time giving them the visual cue, reminder that screen wrapping is indeed possible. No need to make a secret about it, screen wrapping is not designed to be an easter egg.

SiroccoModeratorJoined: 19 Aug 2005
Posts: 9470
Location: Not Finland

Posted: Sun Sep 25, 2016 8:13 am Post subject:

I remember playing Pac-Man for the first time and thinking how utterly novel it was to be able to wrap to the other side of the screen. It, too, made no secret of this mechanic :D_________________NoOP / Reyn Time -- The $ is screwing everyone these days. (0xDB)

DiabloContributorJoined: 19 Nov 2015
Posts: 388
Location: :( :(

Posted: Tue Sep 27, 2016 4:26 pm Post subject:

Damned close to putting out some playable levels on this project, humans. I considered rushing something out today, but Baal talked me out of it. The mark of his firebrand still stings a little bit.

I've been spritzing up the UI. I really needed a non-generic font, I will tell you this though, misery is when you go to 1000000freefonts.com and cycle through page after page of insufferable font hell, wondering cursedly to yourself, who would ever use these, you can't even read the damned letters. I eventually settled on one that works alright, it is not completed reviled. I also experimented with slightly askewed elements for a little bit of flair, it gives the screen a little bit of life and personality, and I think it also makes it look more like "i am important, read me!" than a more orderly counterpart.

snake controls now allow you to click any cell in the direction you want to travel

slightly altered 0.4, changed title, rewrote level intro message to better explain that darkness is like a wall, not dangerous

increased opacity of overlays to reduce conflict with the noise presented by the level itself, in the background

added special thanks and changelog sections to help menu

SiroccoModeratorJoined: 19 Aug 2005
Posts: 9470
Location: Not Finland

Posted: Fri Sep 30, 2016 4:24 am Post subject:

Great presentation, and it's a nice and clean web app. The aesthetic from your previous games comes back into focus (I have no complaints there)._________________NoOP / Reyn Time -- The $ is screwing everyone these days. (0xDB)

DiabloContributorJoined: 19 Nov 2015
Posts: 388
Location: :( :(

Posted: Fri Sep 30, 2016 2:13 pm Post subject:

Sirocco wrote:

Great presentation, and it's a nice and clean web app. The aesthetic from your previous games comes back into focus (I have no complaints there).

Thanks, human!

DiabloContributorJoined: 19 Nov 2015
Posts: 388
Location: :( :(

Posted: Fri Sep 30, 2016 2:15 pm Post subject:

A new level set is available! Level set 1.1-1.9 introduces spinning blades that kill snakes who run into them, and also pushable blocks, the snakes can push them around the level.

These levels are a little trickier than the warmup levels, but most of them are still not too hard. Not until the last one, anyway......... :)

If you played 1 or more of the previous level set, the game will try to automatically start you on the first level in this new set, you can still go back to the others using the "levels" menu. (Also try this menu in case the code doesn't properly detect that you already beat one or more of the previous level set.)

I have been getting some damned helpful feedback on this game. One of the main areas of contention has been the sections of darkness, where some humans might think of the dark as a dangerous thing, or something that functions differently than a wall. It's certainly something I wanted to work on.

To make the level layout easier to figure out at a glance, the places you can and can't go to or screenwrap to, I'm working on adding explicit perimeter walls at the edge of the majority of the play area. I've got a screenshot of the before and after of one of the levels, the addition of the various transition tiles makes it look a little cleaner, but more importantly it also makes it much more obvious as to where you can and can't go to.

DiabloContributorJoined: 19 Nov 2015
Posts: 388
Location: :( :(

Posted: Tue Oct 04, 2016 3:45 pm Post subject:

Another damned level set is here! This level set (2.1-2.9) adds two new objects, arrows and tunnels. A snake that collides with an arrow block is forced to change its direction, which can lead to terrible hell for snakes, and tunnels will only allow a snake to move through them on one axis, otherwise the snake hits the side of the tunnel and stops.

There's also some gameplay additions and fixes. Holding down ALT will highlight all of your snakes so you can identify them more easily, and also, if you click on a snake at the very edge of a level, you now get a move target on the edge of the level you can screenwrap to. Before you had to move the mouse to the other side of the level to complete the screenwrap, that was a hassle. Last but not least, every level has been revised to include better wall markings, with new corner walls and half walls, so you know exactly when you can or can't screenwrap to a certain location.

Thanks for coming back, humans, there's another level set ready to play! In these damned levels, you meet the new fragile block, which is a block that will fall apart when your snake runs into it. You also can meet the multicolored snakes, they're snakes with 2 heads, except each head is a different color! What the hell! Not only that, but there are also special color converters on some levels, and your snakes will change colors as they pass through them.

If you have played the game before, then you will be automatically started on the newest level set you haven't tried yet, and you can also use the level select menu (on the top of the screen) to pick whichever level you want to start on.