Deck builder for iOS - could it have existed all along right under our noses?

By dboeren1, in CoC General Discussion

In the past few days there's been a discussion on Boardgamegeek in the Android: Netrunner forum about the possibility of a deckbuilder app. However, FFG has never come out with one, nor is anyone working on one that we know of.

However, I think we may have found a workaround. It's not a perfect solution, but it actually works OK and you can use it with any LCG/CCG you play.

It's a comic book app called ComicZeal. Effectively, you're importing your card images as if they were a bunch of 1-page comic books (each "book" is a zipfile full of JPGs for individual pages).

I've been able to write a fairly simple python script to read, rename, and zip up all the images from the Call of Cthulhu LackeyCCG plugin, from there it's fairly easy to import them into Comic Zeal and start organizing them.

You do have to organize them manually, but it's a one time operation and while annoying the payoff is pretty good to be able to browse cards and build decks anywhere.

It's not all perfect though. You can search by card name, but not by anything else. Supposedly keyword searching will be in a future version. Importing brings images in in a flat list, so you have to organize them yourself. I'm doing folders by faction, then folders by card type, then dividers by cost.

Once your cards are imported and organized, it's time to build decks. I'd recommend creating another folder for your decks, and subfolders for each individual deck. Then what you do is browse around and 2-finger drag cards you want to the right side of the scree, into what the app calls the slider. The slider shows how many cards are currently in there. Then you can go to your deck folder and drag the cards out of the slider. The quirky parts are:

1. You can't use the 2x2 grid view with the slider, you have to use the less useful list view (hoping this feature is added later)
2. Three copies of a card will show up as three cards, not one card with a 3x notation, unless you want to import triple copies of all your cards which I doubt you do.

Anyway, I'm still messing with it, just bought the program today. But, I thought some of you might be interested and I'll update the thread with more impressions as I work with it. Honestly, I'm quite willing to put up some minor inconveniences because the alternative is having nothing or trying to use cardgamedb through the web browser which isn't so hot either. Note that you CAN use cardgamedb to do more useful searching and then look up the cards by name in Comic Zeal which partially gets around that problem.


Anyone? Bueller? Somehow I thought this might be of more interest :)

Anyway… Last night I finished organizing all the cards by faction/type/cost. I do have a manual cleanup phase where I need to add or touch-up a few cards by hand where Lackey failed to separate the name and sub-name, and also for a few cards with duplicate names. Also, the Lackey plugin doesn't have the final asylum pack in it yet so I have to add those. But aside from a bit of cleanup it's done and ready to go.

So then I tried some deckbuilding. It works but it's not what you'd call a luxurious experience. You have to 2-finger drag cards to the right edge. It's possible to accidentally 1-finger drag instead which moves instead of copying and then you have to undo your mistake. Nor can you see what's in your "deck" on the fly. You have to navigate between folders to do this. I recommend creating your deck folder in the same folder as your main faction, then moving it to your decks folder later once it's complete or mostly complete.

In the end, I would characterize it as being a pretty good card and deck viewer, but still a bit cumbersome on the deck building aspect. However, it does work, and probably works even better on the iPad with the bigger screen. If you merely need to ENTER a deck, say one you already built or found online, then that works pretty well since you don't have to inspect what's already in your deck along the way.

My best tip for building would be to add cards liberally, not worrying that you're well over 50, and then go to the deck folder to do your trimming in a single view.

One of the best function of a real deckbuilder is the search function by keyword, faction, cost… Although your solution does the trick to organize cards visually, I doesn't expertly help on deckbuilding research and strategy. Unless you perfectly know all the cards.

Though it might be helpful to build a deck you thought about in the train and keep it for reference when you're away from your cards.

What I personaly do : I open Nyarlazorbec Deckbuilder's on my PC and then use it through a remote control program on my Android Tablet. It could work outside home with an internet connection, but I never tried. It works quite well.

I agree, the search facility is not there yet (other than by name), but the author has said that he's planning on a keyword feature in a future revision so we may get this functionality down the line. For now you may also need a browser window open to cardgamedb to do searches in. It's still great just to have a nice local card browser that's with you anywhere. If I had a computer with me, I would honestly just use that and not worry about connecting to a phone.

If anyone does want to give it a try, here's my python script I use to import all the cards and get them ready to load into ComicZeal.

To run it your current directory should contain:

1. The python script

2. setinfo.txt copied from Lackey

3. a setimages subdirectory copied from Lackey

import csv, shutil, zipfile, os

# Create a comiczeal subdirectory if one does not exist

if not os.path.exists('comiczeal'): os.mkdir('comiczeal')

# First pass, build a dictionary of unique names

reader = csv.DictReader(open('setinfo.txt', 'rb'), delimiter=' ')

namelist=[]

dupelist=[]

for row in reader:

# Skip the non-LCG cards (if any)

if row.get('Extension')!='LCG': continue

# Skip the story cards (they don't go in decks)

if row.get('Type')=='Story': continue

# Trim off leading *'s

name=row.get('Name').strip().replace(' ','_')

if name.startswith('*'): name=name[1:]

# Trim off sub-names

comma=name.find(',')

if comma>0: name=name[0:comma]

# Add the name to our list

if name in namelist: dupelist.append(name)

else: namelist.append(name)

# Second pass, build our list of cards

reader = csv.DictReader(open('setinfo.txt', 'rb'), delimiter=' ')

for row in reader:

# Skip the non-LCG cards (if any)

if row.get('Extension')!='LCG': continue

# Skip the story cards (they don't go in decks)

if row.get('Type')=='Story': continue

# Trim off leading *'s

name=row.get('Name').strip().replace(' ','_')

if name.startswith('*'): name=name[1:]

# Calculate the base name (no subname)

basename = name

comma=basename.find(',')

if comma>0: basename=basename[0:comma]

# Trim off sub-name if it's not needed

if basename not in dupelist: name=basename

# Construct our filenames

src_filename='setimages/'+row.get('Set')+'/'+row.get('ImageFile')+'.jpg'

dst_filename='comiczeal/'+name+'.jpg'

zip_filename='comiczeal/'+name+'.zip'

# Create a faction subdirectory if one does not exist

faction = row.get('Faction').strip().replace(' ','_')

if not os.path.exists('comiczeal/'+faction): os.mkdir('comiczeal/'+faction)

# Show what file we're on

print src_filename+'->'+dst_filename

# Copy the file to our working directory

shutil.copyfile(src_filename, dst_filename)

# Zip them up individually, deleting the .jpg's as we go

with zipfile.ZipFile(zip_filename, 'w') as myzip:

os.chdir('comiczeal')

myzip.write(dst_filename[10:])

if os.path.exists(faction+'/'+name+'.zip'):

os.remove(name+'.zip')

else:

shutil.move(name+'.zip', faction)

os.chdir('..')

os.remove(dst_filename)