Kickstarting – Week 25 Update

Reverie Kickstarter has gone live, check it out here!

I wanted to wait as I have major changes coming to the combat system, but I really needed to publish Kickstarter now to force myself to get the word out. Pax Prime is only 80 days away and I’ve done virtually nothing to generate any buzz. I am worried I might be poisoning myself by releasing a video with pre-alpha footage, and I probably should have mentioned that in the video, but if the Kickstarter fails hopefully I’ll at least get some feedback about what I should change.

I feel like Reverie doesn’t have it’s own identity. It feels like just another generic RPG right now, but that will all change once I get these battle changes in. I am very anxious going back to the design phase so close to Pax Prime, but it really needs to happen. I probably should have kept with my original goal of doing first announcement at Pax East 2015, but I might have just procrastinated and faced the same problems.

Let the Summer of Anxiety begin!

Reverie & Dog Jog – Week 16 Update

I’ve finally named my RPG and it will be called Reverie! The battle system is 80% done and almost completely data driven, which is awesome and means I can add and tweak things quickly. April has been a lot more visual work, but I’ll be holding off posting a ton of updates as I’ll be busy figuring out what to put in the Kickstarter video. I am aiming to have video done and Kickstarter up by the end of May and possibly a playable demo not too long after that. I’ve been making maps in Tiled and testing out animations with my newly purchased tool Spine. Spine is going to save me tons of time as I don’t have to build animation tools anymore! Thank you for LibGDX runtimes you wonderful glorious developers you!

On a different note, in March I took a short break from working on Reverie to work on a smaller project. In January of this year, Tommy LeRoy from Go! Comedy in Ferndale, MI approached me to make a game for an upcoming late night show. I accepted and then in March we actually sat down to figure out what would be in the game. Tommy produced all of the art, which looks pretty spiffy, and he helped me design the game. I made all the SFX with sfxr and programmed the game using LibGDX. It has been on/off development over the past couple months, but I’d say total the project only took about a week of development time. Not too shabby!

The show, Defenders of Greatness: Joysticks of Glory (or DOG JOG for short), is out now and it is hilariously amazing! Check out LaughStub for tickets, it is playing Thursdays at 10pm til May 17th.

Download it for Android here! Don’t have an Android phone? No worries, a web version is on the way soon!

A Sneak Preview of Our Heroes – Week 12 update

I’ve been working with to make all the assets for the game and they have been going to town and rocking out! Very pleased with way things are coming together, so here is a sneak preview of our main heroes: Edwin, Lydia, and Hunter!

I’ve also been at working on creating the sound effects, something that is surprisingly time consuming to get just right, and my friend Chris Petersen (Twitter: @cdpetersenmi) has started working on the music.

I’ve made an Editor for the game and made most everything I can as data driven as possible, which means that when it comes time to making everything final it should be fast to make and easy to tweak any one part of the game.

Look forward to a KickStarter video at end of May and possibly a downloadable playable demo!

Artist Anxiety – Week 8 Update

So after the week 6 update, I realized that I desperately needed to find a pixel artist by the end of the month or I would probably be missing some important deadlines for milestones.

So I put out the word and put up 3 job postings on different artist forums.  Coming up with the job description was so terrifying, I was extremely worried that I wouldn’t get any serious replies.  But on the first day, I got 3 replies overnight.  And in the next couple of days I got more and more, a total of 14.  Some were bad, like real bad.  Some were good, but hard to deal with.  But I finally found someone who I can afford, gave me though out estimates for time to complete, and is talented to boot!  Also I have a company logo now, it is like 90% ready, so I can’t wait to put that up everywhere.

I’ve been mostly doing business stuff these past two weeks, but I’ve been programming here and there.  I finally added friends to the player party!  And I’ve been testing the game on my Ouya, too!  Not sure if I will be able to dual launch on PC and Ouya at the same time, yet, but it looks promising.

Oh and I’ve been writing a lot!  I wrote out descriptions for all of the main characters and antagonists, but more importantly I wrote the ending!  The ending is something I’ve been trying to figure out for the past month, but I finally found the perfect way to wrap everything up in a nice little bow.  It’s no Breaking Bad ending, but I am pretty damn proud of it. I’ve got quite a bit more writing to do, but I feel like now I am just filling in the gaps. It’s like a big paint by numbers, I know what goes where, I just got to fill it in.

Work In Progress – Week 6 Update

Comparing how the game looked week 1 make me realize how far things have come! I’ve been a busy bee: writing, coding, writing, coding, designing, coding, testing… and all the while drinking gratuitous amounts of coffee. The story is still in it’s infancy, but I know exactly how the game is going to start and what is going to be in the demo. Aiming to have the demo, an awesome video, and a Kickstarter page up by April!

Here are some pics of the current build:

[LibGDX] Control Scene2D Buttons With A Controller

LibGDX provides a great way to setup a UI, but it only works with touch or mouse and keyboard.  I really wanted to control the main menu of my game with my controller, so I made a wrapper to simulate mouse movement with the D-pad and mouse click with the A button.

Note: this only supports buttons in a single row or column, I will probably being adding support for selecting buttons in a table grid when I add my in game menu. Also, I may add support for controlling buttons through the keyboard arrow keys.

Hopefully this helps someone else!

public class MenuControllerListener implements ControllerListener {

private final Group buttonGroup;

private int currentButtonIndex = 0;

public MenuControllerListener(Group buttonGroup) {
this.buttonGroup = buttonGroup;
}

@Override public void connected(Controller controller) { }
@Override public void disconnected(Controller controller) { }

@Override
public boolean buttonDown(Controller controller, int buttonCode) {
if(buttonGroup.getChildren().size == 0) return false;
if(controller.getName().toLowerCase().contains("xbox") &&
controller.getName().contains("360")){
switch(buttonCode) {
case Xbox360Pad.BUTTON_A:
Actor currentButton = buttonGroup.getChildren().get(currentButtonIndex);
return clickButton(currentButton);
}
}
return false;
}

@Override
public boolean buttonUp(Controller controller, int buttonCode) {
if(buttonGroup.getChildren().size == 0) return false;
if(controller.getName().toLowerCase().contains("xbox") &&
controller.getName().contains("360")){
switch(buttonCode) {
case Xbox360Pad.BUTTON_A:
Actor currentButton = buttonGroup.getChildren().get(currentButtonIndex);
return releaseButton(currentButton);
}
}
return false;
}

/**
* Simulate button click down.
* @param button
* @return
*/
private boolean clickButton(Actor button) {
InputEvent event = Pools.obtain(InputEvent.class);
event.setType(Type.touchDown);
event.setButton(Input.Buttons.LEFT);

button.fire(event);
boolean handled = event.isHandled();
Pools.free(event);
return handled;
}

/**
* Simulate button click release.
* @param button
* @return
*/
private boolean releaseButton(Actor button) {
InputEvent event = Pools.obtain(InputEvent.class);
event.setType(Type.touchUp);
event.setButton(Input.Buttons.LEFT);

button.fire(event);
boolean handled = event.isHandled();
Pools.free(event);
return handled;
}

@Override
public boolean axisMoved(Controller controller, int axisCode, float value) { return false; }

@Override
public boolean povMoved(Controller controller, int povCode, PovDirection value) {
if(buttonGroup.getChildren().size == 0) return false;
if(controller.getName().toLowerCase().contains("xbox") &&
controller.getName().contains("360")){

unselectButton(buttonGroup.getChildren().get(currentButtonIndex));

switch(value) {
case north:
case west:
currentButtonIndex--;
break;
case south:
case east:
currentButtonIndex++;
break;
default:
break;
}

currentButtonIndex = currentButtonIndex % buttonGroup.getChildren().size;
if(currentButtonIndex < 0) currentButtonIndex = buttonGroup.getChildren().size - 1;

return selectButton(buttonGroup.getChildren().get(currentButtonIndex));
}

return false;
}

/**
* Simulate mousing over a button.
* @param button
* @return
*/
private boolean selectButton(Actor button) {
InputEvent event = Pools.obtain(InputEvent.class);
event.setType(Type.enter);

button.fire(event);
boolean handled = event.isHandled();
Pools.free(event);
return handled;
}

/**
* Simulate mousing off of a button.
* @param button
* @return
*/
private boolean unselectButton(Actor button) {
InputEvent event = Pools.obtain(InputEvent.class);
event.setType(Type.exit);

button.fire(event);
boolean handled = event.isHandled();
Pools.free(event);
return handled;
}

@Override public boolean xSliderMoved(Controller controller, int sliderCode, boolean value) { return false; }
@Override public boolean ySliderMoved(Controller controller, int sliderCode, boolean value) { return false; }
@Override public boolean accelerometerMoved(Controller controller, int accelerometerCode, Vector3 value) { return false; }
}

Example usage:

TextButton.TextButtonStyle buttonStyle = new TextButton.TextButtonStyle();
buttonStyle.font = new BitmapFont();
buttonStyle.font.scale(2f);
buttonStyle.fontColor = Color.WHITE;
buttonStyle.overFontColor = Color.LIGHT_GRAY;
buttonStyle.downFontColor = Color.GRAY;

newGameButton = new TextButton("New Game", buttonStyle);
continueButton = new TextButton("Continue", buttonStyle);
optionsButton = new TextButton("Options", buttonStyle);
exitButton = new TextButton("Exit", buttonStyle);

Table buttonGroup = new Table();
buttonGroup.setFillParent(true);
buttonGroup.align(Align.center);
buttonGroup.add(newGameButton);
buttonGroup.row();
buttonGroup.add(continueButton);
buttonGroup.row();
buttonGroup.add(optionsButton);
buttonGroup.row();
buttonGroup.add(exitButton);

stage.addActor(buttonGroup);

Controllers.addListener(new MenuControllerListener(buttonWrapper));