Yesterday night I finally managed to release the first working version of my Android:Netrunner plugin for OCTGN. The plugin came out so quickly because it’s a direct port of my Netrunner plugin, which is already at a very polished level. All I had to do this time was fork the code, carefully search and replace the various keywords and work on making the basic scripts (setup table, play card from hand, trash card, start/end turn) work with the new card properties.
I am very thankful to the people online who came forward to provide censored scans or cards and other paraphernalia, xml exports and even the image for my new table board. Thanks a lot everyone, you know who you are. I would never have done it so quickly without you.
And I’m still not done of course. I’m merely warming up in fact. There’s at least 2 more days of frantic coding ahead of me, so that I can bring the core set and the game to the same level of polish as the original netrunner. I need to put in all the scripts for the cards, tweak and bugfix the existing code (although there’s far less script crashes than I expected) and then, finally I can relax by starting to play Guild Wars 2 which will have just come up.
In fact GW2 should already be active for me, since I pre-purchased, but it’s just my luck that I’m working on the weekend. But even if I weren’t, I don’t think I would even try to play without getting ANR finished. I’m far too dedicated to it to stop now.
It’s actually weird just how much I’ve been hooked to coding for this card game. I haven’t even checked my RSS feed, of which the priority items only are already ~500. That’s going to be a PITA to get though.Worth it though.
Anyway, at the moment, anyone can download the basic first version as well as the required markers. One can also download the first set, in its censored version. You can find all the links in the forum.
Why is the first set censored you ask? Well from what people tell me, FFG, the creators of Android:Netrunner have this unwritten policy that they allow online versions of their LCGs, as long as the cards text is censored in some way for the first six months a set is out. Apparently they are likely to send you a nastygram or an outright DMCA request to your host if you don’t abide by this. I have no idea how true this is, as I’ve only heard it third hand, but there you have it.
Because of this, I’ve avoided uploading an uncensored set to my website as I’ve done with all my other CCGs, as I may wake up one morning with my site (or Google account, had I used google drive) taken down. I also didn’t upload the censored version because of the same concerns, given that this is, again all third hand knowledge.
To tell the truth, this whole policy is not only unnecesarry, but also counter-productive. From my experience, most people play card games online when there’s absolutely no other option (and maybe not even then). I’ve yet to see anyone who does it because they’re too cheap. This doubly goes for LCGs which do not have the collectible aspect and thus I can guarantee you that 95% of the people playing have bought the cards. If anything, having an online version is helpful as it increases exposure to the game, and it allows people to check it out and see if they like before they buy. It will absolutely boost sales, particularly with the price ranges of LCGs.
With Android:Netrunner, it’s makes even more sense to allow the uncensored cards at this moment. The game is not even out. Excitement is running out and letting people play a version online (which is never as fun as playing the actual game) can create more buzz and talk about your game. But because of this misguided overall policy of FFG, I’m afraid to do so, as it might lead to action against me. For doing something nice for others and FFG no less. But these are the pains of our culture of permission and intellectual lockdown. Company policies are just as often driven by their legal department, rather than what makes business sense.
But enough about that. Now is the time to grab the OCTGN plugin, a friend and give the whole thing a whirl. And remember, the version you play now is about 10 times worse than the final one I’m going to be releasing in a day or two. So even if you’re not impressed with it currently, check back again when the automations are in place and see what you think then.
I must have spent 16 hours a day on the weekend coding my netrunner plugin and yesterday I stayed until 5am coding the latest features. I don’t know why, but this kind of thing is addicting to me. I just can’t tear away from my computer while my code is still not working. If I don’t get to a working state, I won’t go to bed. And given the sorry state of the OCTGN debugger, something that I think will have fixed in 20 minutes, ends up taking 1.5 hours. Of course my wife is none too impressed by this, since I end up telling her that I’ll be going to bed “soon” and when I get there, it’s not even in the same timezone as “soon”.
And speaking of a debugger, can I rant about the one, or rather lack of one in OCTGN 3 for a moment? Dear gawds I want to rip someone’s head out at times. It is so bad that the only thing I get is a python syntax check when I try to install a new version of the plugin, and even then, when it finds unexpected sytax (eg, a missing closing parenthesis, a bad indentation etc) it will report the correct issue, but then point to the wrong line of code! You can see that in the screenshot on the right, where I removed a colon after a loop opened, so it got confused by the line break. It then reported a line 30 lines above it! it seems that the more deep in the code the error is, the larger the offset of the line reported. This makes finding syntax errors an absolute pain in the cohones. But this is nowhere near as bad as how non-existent runtime debugging is.
If an error appears during runtime (e.g. trying to read a variable that doesn’t exist, like a typo), the only thing I get is a python aborting error that mentions the very first function I called in OCTGN. So if I have a complex structure where the first function can call upwards of 20 others, included nested calls etc, then imagine one script failing with this error. There is absolutely no clue where to begin looking! I used to have to manually enter short pop-up windows in the code, that would inform me where I’m at in the code, so that I can begin to even track the issue. Tracking a small case-sensitive typo could take from 5 to 20 minutes, depending on how much code I wrote in between. Now? I’ve written my own “soft” debugger inside the python script, which accepts levels of verbosity and spits out messages such as which function I am entering/leaving, and what the result of regex commands are. It’s not perfect, but at least it narrows down my search considerably, and I don’t have to repackage the plugin just to insert some error tracking code.
Why would I repackage the whole plugin to test a line of code, you ask? Fool! A sane development environment of course provides some way to alter code on the fly, not to mention a runtime debugger. But OCTGN is no same development environment. If anything, it’s actively taxing your sanity as you spend 10 minutes for the 1000th time, trying to track which of the 10 variables in a function failed to receive a value somewhere. But if that wasn’t enough, the lack of a way to modify your code while in the game, means that the only way to make small changes in order to try and fix issues is to:
Exit the game you’re currently in.
Make your changes in the python code and save the file.
Re-add the python file into your .o8g file (a simply .zip, renamed). I use 7zip’s handy function to remember the previous names of files you’ve compressed into, so I just select the relevant directory, “compress to” and then select the name. So it adds and replaces to the existing .o8s files with the same name in the current directory. But make sure the .o8g file you’re putting it into does not have the same name as the .o8g file you used last time! Since OCTGN always keeps the current plugin files open in the system, if you try to reinstall a file with the same name, it will fail. So what I do is keep two .o8g in the folder, Netrunner-OCTGN.o8g and Netrunner-OCTGNa.o8g, and every time add the latest changes to the other one.
Go to the Game tab.
Select “Install Game”.
Find your new .o8g file and select it. This takes 2 extra clicks for me since for some reason Windows 7 or OCTGN, I don’t know which, refuses to remember the name of the previous directory I was in last time I installed a game.
Press OK to install it. Hope you didn’t miss any syntax errors. If you did, you have to close the almost-useless error pointer, go back, fix the issue, and then start from step 2 again. But THIS time you have to use the same .o8g name you just used, as it didn’t actually install it, so it’s still using the old one. Make sure you remember that info, because this shit’s written nowhere…
If you had no syntax errors, then it will allow the plugin to be updated after a confirmation dialogue (extra click there.)
Once your plugin is updated, reinstall the sets, if I’ve made any changes to the autoscripts of the cards. Fortunately, those don’t lock the files, so I can re-use the same filenames and don’t have to keep track of which file I installed last time.
However, sometimes OCTGN will decide to keep one of your set files open anyway, usually because you looked at one of those cards last (although OCTGN is using an internal DB now). In case you see those lovely red errors when installing the sets, the quickest way to fix it is to restart OCTGN, including logging-in again. Mmmm, I loves me some time wasters…
Go to the game Host/Join tab.
Click “Host” to start a game lobby.
Select the Game you will play from the list.
Provide a lobby name (or click OK to accept the previous one.)
Wait 5 – 10 seconds for the board to load.
Load my debugger (which I’ve conveniently coded so that it spawns 6 cards with abilities I’d like to check and the environment to use them in. In the past I had to always load a deck, use the Setup function, and then fish for the cards I wanted to check.)
Test the new code.
My now I’ve gotten so proficient at this, that I can do this whole procedure in under a minute. However I need to do this for everything. From the smallest typo, to the biggest code blunder in the universe. Can you imagine the overhead of this? I can tell you, it’s absolutely ludicrous. I would code 50 times faster, if I could make code changes and re-run the same code WITHOUT FRIGGING EXITING, REPACKAGING,REINSTALLING and RESTARTING MY GAME EVERY TIME! The fuck!
So imagine doing all that, and then realizing you didn’t fix the issue at all. Imagine you don’t even know where to being looking for the error, so you have to do this whole process 2 or 4 times, just to enter enough messages and error hooks in the places you suspect the problem is, just so that can begin to track it down. I’ve spent hours in issues that would have normally taken me seconds, just because I couldn’t track it easily (think: regression bug) Fun!!!
Oh yeah, did you see that wonderful error above. This is the totality of the console I have in the game. A lot of goddamn scrolling involved to perhaps get an idea where the error happened. As you can see, by default, it tells you fuck-all where the error would be. Not only that, but the error will appear before ALL the notification you’ve put in the code, because python processes the code faster than OCTGN puts out notifications. So first you see the error, and then you see your debugging messages you’ve inserted into the code. Talk about mindfuck.
Oh sure, you see that it was the “useAbility()” function, but that’s just where the rabbit hole starts. In fact, this particular error was caused by a regex which I hadn’t configured to process numbers in the text of special Autoscripted announcements. So one group in the regex results was empty. This was the 10th function or so called from useAbility()…It took me half an hour to track that down, and that was WITH my custom-made debugger spitting out the actual last function used until now. Good fucking luck figuring that out just from that message…
You need to be a goddamn zen coder to not be ripping your testicle hairs out with OCTGN. You need to be able to write flawless code the first time around, because if you don’t, you’d better write your own debugger first before you even begin to write any sort of advanced plugin. And then you’d better have the patience of a Go grandmaster…
However, for all its failings, OCTGN is still top of the line among card game engines, primarily because of its integration of Iron Python. It has its quirks (some of them quirkier than others) but the flexibility and power of using python in the backend just can’t be topped. Other card games like GCCG also support some sort of scripting, but then you have to learn its own internal syntax, which is definitely not as advanced as the capabilities of python. This is why, for all its failings and frustrations, I still stick with OCTGN. It’s the first engine that allowed me to fully realize my vision for how a card game engine online should work (i.e. automation up the arse!).
Hopefully the new version that’s in development will have *something* better than this sorry situation. But I swear if they have to break my existing python code in 20 different ways due to a new interpreter (like what happened when moving from OCTGN 2 to OCTGN 3) without giving me a proper debugger, I’m going to cry…Imagine having to debug 3000 lines of code times 4 plugins…
Aaaanyway, it is what it is. Still, through the fire and flames, I’ve still created a plugin I am proud of, and soon I’ll be using the existing code to implement Android: Netrunner. So why don’t you give the current plugin a run and let me know what ya think. You don’t want to let all that past frustration go to waste, do you? Do you?
So after Dune, I got into developing a Netrunner plugin. I don’t remember exactly why, I think I noticed that the existing plugin had a few bugs and/or could use a few tweaks now and there. I edited it a bit to polish it a bit more, then I edited a bit more to take off some rough edges and…well, one thing led to another and I’ve written another 2000 lines of code >_<
It’s all good though, I was always interested in Netrunner, even though I didn’t get into it when it was active (it had already died when I started diversifying from Magic:The Gathering). With this particular plugin I went completely overboard in the scripting department, writing flexible code to automate around 70% of the various card effects in the game, so that you can just play a card and it works without you fiddling with counters and markers. This is even far beyond the Dune CCG plugin I’ve coded, but then again Netrunner’s card effects and rules are not as convoluted as Dune’s.
For those curious, there’s a lot of reasons to be interested in Netrunner. It’s one of the few (or is it the only?) asymmetrical card games out there, with the two sides of the game having completely different mechanics and strategies. One is always attacking, and one is always defending, but depending on the cards each player uses, the roles might be temporarily reversed as well. It also has bluffing build-in to its system in a way that even Doomtown cannot achieve, and that is a game based on Poker! If you like games which involve an element of bluff, Netrunner is absolutely something you should check. The setting is cyberpunk which is rare in itself, but not only that but it’s made with a degree of humor and 90s pop-culture reference that you can’t help but love. It’s especially cute to see how wrong they go the future in some issues, especially in how IT would progress. In Netrunner’s world things like newsgroups and BBS’ and jury-rigged computers are still big, which is something that gives the whole theme a nice William Gibson and 80’s IT sheen. I love it.
Finally I can’t help but mention that there’s a reboot/reimplementation of the Netrunner franchise from FFG, called Android Netrunner which is set in a different universe but retains a lot of the flavour and (hopefully) improved card game mechanics. It’s also an LCG which means it not a huge money-sink if you want to enjoy it, and it can cater to both those who like to dabble in deck-design and those who just want to pick up cards and play. Since Netrunner was one of those CCGs which kept a large cult following after more than a decade after its end, you can enjoy how many people have come out of the woodwork for the new part of the franchise. It’s going to be big!
Naturally an Android Netrunner plugin will be forthcoming and in it I plan to re-use a lot of the code I wrote for Netrunner, so there’s that 😉
Once everything is set up, you need to find someone to play with. Once you do, one hosts and game and the other joins. Leave the two-sided checkbox checked and once the game is started, load your decks. Things should be fairly intuitive but keep in mind 4 basic things in relation to the OCTGN engine plugin.
First thing you do after you load a deck is Setup (Ctrl+Shift+S)
At the start of your turn, declare it with F1
At the end of your turn, declare it with F12. Make sure the game announces that your turn has ended and is not expecting you to discard down to your max hand size 😉
Play cards from your hand with the “Pay and Install” (double-click with the mouse) or “Play at no cost”
And some more advanced stuff starting from version 2.1.x
Most card will automatically trigger their abilities when played/scored/rezzed so you don’t need to do anything else. Pay attention to the notification area for messages from them.
Cards with abilities which increase your MU, Hand Size, etc will automatically increase it when they come into play and reduce it when they go away, as long as you don’t drag&drop them in or out of the table manually. Use the built-in commands for that. Rez, Derez, Trash etc
Cards with abilities you activate while they’re in play (like programs, agendas, upgrades etc) will trigger them when you double-click on them. If they have more than one ability (such as most icebreakers), the game will prompt you to select one and pay the appropriate cost.
Cards which reduce the cost of other card’s abilities, will also automatically work. If you have a card which has tokens which can pay the cost for activating icebreakers, they will be automatically used when you use one such ability. If you have more than one of these cards which can affect such costs they will be triggered in the order you put them on the table. If you wanted to use the tokens from another card instead, you can simply drag the token manually to the other card afterwards.
There are cards which will automatically do damage to your opponent and thus discard random cards from their hand. Due to the way OCTGN works, this may crash the game if you opponent was manipulating the same card. There is a warning before all such damage that will warn you to inform your opponent to be hands-off while the effect is in progress. This warning will also give your opponent the opportunity to play cards which prevent damage.
Yes, cards which reduce damage taken have been automated and work automatically depending on the kind of damage you take. As before, they too get triggered by the order they’ve been put on the table, so if you didn’t want to lose the counters from one particular card, just drag them in from the card you did want to use.
Some cards require that you select a target from the table or your hand. Do this before you play or activate the card. If you don’t the action will abort and the game will inform you to select your targets first. As always, keep your eye on the chatbox for such warnings.
Cards which have effects which trigger at start/end of turn (i.e. refilling bit markers on them) will automatically work.
If you don’t like some or all the automations, you can disable some or all of them. Go to the game menu, and you can disable damage automations (i.e. your opponent will have to use the damage options manually but those won’t automatically use the damage prevention cards), Turn Start/End automations and Play/Score/Rez Automations (i.e. mostly everything). If you find that you’d rather do everything manually, just disable all of them and you’ll have an experience as with most generic card game engines.
Phew, that should be the most basic things about the new automations. In general if you’re not sure if a card is automated, simply play it and see what happens. You will be surprised at how many cards just work.
You can find updates discussions about the plugin in the forum
I know many Free Software enthusiasts are not crazy about Mono, but this was the only viable option for an app that was in MS dotNet, so this is definitelly better than the alternative as OCTGN is heads and shoulders above all other card game engines in my opinion, both for its usability and looks, but also for its natural support for a proper scripting language in the form of python, rather than no scripting or having an custom one that one needs to learn, like GCCG.
So I spent 5 hours yesterday having an epic session in the Dune CCGon OCTGN. I was playing with two old timers of the game, JP and flaney and the game took far more than any of us expected, primarily because of the kind of decks everyone was playing. Namely all of us where in some way focused in battle so there was a lot of pitched encounters.
I haven’t mentioned yet my work on Dune CCG and I’ve done with Doomtown and 7th Sea, but I plan to do that in the future. Suffice to say that Dune is a very deep game on a strategic level and it really supports backstabbing, scheming and careful plotting, as befits the universe of Dune. Thus the game we played yesterday.
There were 3 minor houses duking it out to see which would ascend to the high council. I was backed by the Water Sellers, JP was backed by House Corrino and flaney was backed by the Dune Smugglers with a heavy Corrino support.
Things started out fairly quickly, with JP managing to secure access to Imperial Revenues on the first turn which provided significant funding throughout the game given the amount of battles ongoing. Then on the same turn secured Carthag along with a Carthag privateer who became an instant cash cow. I was able to grab Arrakeen instead and was lucky to get a Patriarch to go with it, setting me up for the same combo that JP did, but for less money. I eventually also managed to bring in some heave defense against battles in the form of my House Shield Generator, which I foolishly hoped would make my homeworld impervious to assault. Flaney on the other hand started out slower, opting out to bring in Corrino firepower first and realizing that he’s messed his deck construction quite a bit 🙂
My deck was trying to set-up command based combos. Specifically using cards which increase my persona’s command and having personas or other cards which are based on such command rank. Thus I had one Persona stealing solaris (The currency of the game) from other players equal to his command, another giving me favour the same way, and yet another who I engaged (i.e. turned sideways to mark as “used”) to get Solaris equal to his command. My hand was fairly nice to me in this way, so I ended up with a nice money-making machine that started making the two other players very nervous. So much so that by the 3rd turn, they were already scheming to take me down.
Fortunately, I had forecasted and brought a lot of battle defenses out to stave off such problems. Unfortunately, against 2 players it’s almost impossible to hold out. I was at least secure in my thoughts that my primary money maker, my own homeworld, would be secure by being backed by a house shield generator. Unfortunately disaster struck (certainly brought about by the cunning Corrino spies)
Cackling with evil excitement, JP on the bottom started his offensive on the peaceful Water Sellers. I had quite a lot of defense to handle one attacker, but seeing as both other players were already planning as a team to take me down, I didn’t hold much hope.
Flaney’s Smuggler backed house followed suit, no doubt while being covertly financed by the Emperor, given that Sardaukar commanders could be seen leading their troops. Under their combined assault, even my homeworld protected by a Palace Fortress was eventually pillaged.
Being thoroughly subdued, I was hoping to get a breath of air, but unfortunately that was not to be. The assault continued relentless into the next round after I managed to recover Arrakeen and my Homeworld by performing an honest trade in water selling (to JP specifically). Honestly could not understand why I was being focused on so heavily, even though I was completely peaceful. After another round of Sardaukar raids, I was left once again completely subdued.
Further to my aggravation, the other player’s colluding went much further than simply ganging up on the honest merchants. Flaney was letting JP petition the imperial assembly for resources and major house allies, without the slightest of resistance. JP was getting everything dirt cheap! At this point I must admit that I started being a bit annoyed as it seemed to me that I was truly playing a 2v1 game. The only thing they weren’t doing was giving money to each other! It started looking as if all that mattered was that just that I wouldn’t win, no matter what, which is a bit unfair to tell the truth.
Unfortunately after the second round of assault, JP petitioned for Arrakeen (which he got for bargain price of course) and locked me out completely out of my money making scheme. That achieved, both players were ready to start working on their victory rather than just beating up on me, until I managed to sneak past JP’s defenses and reclaim Arrakeen by sending out my Marshal and his Laser-bearing Guard Commander flunky to restore order. This was primarily because due to a mistake, JP has forgotten to restore his House Agent, which then allowed me to poison his defending Guard.
Arrakeen then allowed me to quickly spawn 21 Solaris from it, which were primarily went to recovering from the last assault. And yet, both other players were outraged at how Solaris much my perfectly honest trading was producing, and were determined to destroy the growing free market of Arrakis. As soon as their turn came about, Saurdaukar legions once more descended and razed my Arrakeen headquarters to the round, followed by yet another Smuggler assault on my homeworld. This time I wasn’t going to recover that easily.
It was obvious that the Corrino player was working towards gaining admission to the high council by sheer force, as they quickly accumulated control of all the major deserts on Dune and both cities. Only the Dune seat of Governorship still remained in my hands. I was urgently pressing Flaney to reconsider his alliance with JP who was one single battle away from winning the game. All JP had to do, was pry the Dune Regency out of my cold dead fingers. JP knew that as well, so the first order of business after grabbing Arrakeen, was to turn on his ally.
Hostilities quickly escalated to full-blown war, but I doubted Flaney could halt the progress of the Corrino who were by now making obscene amounts of money (In one turn one he brought in something like 3 Saurdaukar battalions and 2 commanders) and had significant defenses set up to prevent all assault.
At this point were going on for 4 hours of game or so. This was primarily because the other players were not so familiar with the OCTGN engine, so figuring out how to do some things, along with the general thought required from the game was taking its toll. We had all far exceeded our alloted time. I had to go to bed, Flaney had to go to work and JP had to do something as well, don’t remember what 🙂 We were all eager to see the game finished, regardless of how awesome it was, but it felt like it would go on forever.
Fortunately for me, JP did a fatal mistake. After the Smuggler assaults, he completely forgot to reclaim control of Carthag. I assumed because he didn’t want to destroyed again, but he told me later that it slipped his mind. So on my turn I petitioned its governorship from the Imperial Assembly after making sure that I couldn’t be opposed financially (see: Selling others some more water). This allowed me another bout of money-making, which was lower than with Arrakeen, but still significant. This in turn allowed me to recover to a large extend and start aggressively collecting spice for my admission to the high council.
Given that I sneaked this by after the Corrino player had finished, I was not in fear of being run over by the Saurdaukar again for a while, and the smugglers just didn’t have the firepower to get through my defenses. So I quickly purchased the Imperial Favor to get the initiative next turn, and with my newly controlled deserts I produced and bought the spice I needed to win before the others could mount an effective offense.
Through the rubble I managed to snatch victory from the jaws of defeat. Rising through my burnt cities like a water phoenix. Free Trade thriumphant!
All jokes aside, there were certainly a few combos I abused in my deck to make obscene amounts of money but it wasn’t as overpowered as it seemed. There was a lot of investment in my personas and they all took multiple turns to recover the money I spent on them. The Corrino were making use of the same combos, albeit not so refined, and having similar money production each turn, which is why on the last turn they had something like 70 Solaris worth or cards on the table. They will undoubtedly say that even after all the beating I got, I still won, which is a testament to how overpowered my cards were, but I’ll say that to my defense they had decks that played to my strengths and I only won because of 2 key mistakes on their part.
The game ended at around the 5-hour mark, which was already stretching it. It was however such a great and thoughtful experience that we couldn’t just abandon it. You should have seen how the other 2 players were cheering each other on as they figured out a way to break through my defenses and raze everything to the ground, and then do it again each turn >_<
In the end, I only won because of 2 crucial mistakes done by the others due to tiredness. If I hadn’t secured Carthag on the last turn, there was no way I was going to be able to make enough money to recover my defenses and buy favour and spice on top of that. On the other hand, player mistakes were the only thing going for me in that game, given just how brutally I had been put in the corner and beat upon.
In the end, my victory was just as well, since JP was about to concede due to time constraints, and so was I and Flaney, so maybe they (subconsciously) let me win, who knows? I’ll take my victories where I can get them, and after being the punching-bag in such a heated game, I think I deserved it. 🙂
Ever since I’ve started coding games on OCTGN and working significantly with python, my ethusiasm for programming has been rekindled. So much so that I’ve pretty much stopped doing almost all other things I was doing lately, including reading reddit.
Today, after I went to bed coding and woke up to code afresh, I got to thinking why I ever stopped doing it. The truth is that I stopped doing it (or rather, never fully started) because I didn’t have a good base at modern programming languages and because I didn’t have a project to draw my interest in doing learning them. This is actually a big problem for me. Due to the way my ADHD-addled brain works, I find it nearly impossible to work on something that A) doesn’t excite me, B) doesn’t give me a clear short-term goal. And because of this, the thought of first learning a programming language before trying to use to code something I want to have, was overwhelming.
I always wanted to get into python, and I did start with a few introductory texts, but I quickly lost attention. Not being able to do, or having something to do with what I learned, killed my interest. And this is where OCTGN helped: It allowed me to start slow (small incremental improvements), on a working base to work on (other games), on something that interested me (making defunct CCGs I love work online).
Slowly I’ve been building up steam and learning python as I go, which is the only way I know that works for me. The result is that I spent almost all day yesterday getting the automation for the Dune CCG work, and then re-writing the code to be more intuitive and succinct. This shit’s addicting!
My hope is that once I’ve perfected all the games I want to on OCTGN, I’ll be able to use the knowledge and familiarity I’ve achieved in python to move to some of the other projects currently sitting in the back-burner of my brain.
First of all an introduction for those not in the know:
The 7th Sea CCG is a defunct collectible card game based around naval combat in all forms. From blasting your opponent’s ship to splinters with your cannons, to boarding them and hacking them to bits. It plays around the common theme of Swashbuckling Pirates and Privateers and thus you do stuff such as send your crew on adventures and generally try to control the 5 seas the game is played in.
Deck building revolves around many things:
Selecting what faction you want to play, as there are dedicated pirates, army captains, chartered privateers and even the undead, each with their own rich history, story and gameplay tendencies.
Deciding what basic strategy you’re going to use to achieve victory: Big Cannon Attacks, Small Cannon attacks, Boardings, A bit of this and a bit of that, Controlling the Seas or some other wacky experimental build – like playing the Viking Raiders and using your Laerdom sorcerers to destroy opponent’s ships through weather catastrophes.
Deciding on the type of cards you’re going to use, as too much of one card might make you strong in your chosen tactic, but might cripple you if you’re ever trapped in a boarding.
And there’s a lot of other fine strategies in deckbuilding that emerge once you start to understand how the game works and the cards interact with each other.
The game is primarily designed for 2 players playing as opponents, but you can easily play it with more, albeit a Free-For-All is not recommended. However some of my fondest experiences with card games were when playing this game as 2 vs 2 team matches.
Now that we have the game ready, the only thing that is left is to find someone to play with. Fortunately, the new OCTGN 3 has a built-in game lobby capability, which means that whenever you go to the host/join tab, you’ll see any available game lobbies for the games you have installed, and if you host a game, anyone with the same game can see it and join. Unfortunately the 7th Sea CCG is even less active than Doomtown which means it is unlikely anyone will be hosting or looking to join a game at the same moment you are. Even worse, there’s not even a specific community for the 7th Sea CCG. There’s a Facebook group with 4 people (at this time) which you might ask in, A Facebook page with more fans, but related to all things 7th Sea, which for most people is only the RPG, and of course our own OCTGN Game fora where you may inquire if anyone if up for a game. But very likely, your best bet would be to contact me directly 😉
The 7th Sea CCG version for OCTGN is not yet as automated as Doomtown, mostly because I “power” my motivation to code this stuff depending on how much I actually play the game and thus see areas for streamlining and improvement. Given that I haven’t managed to find a single person to play with (something which I hope to change with this post), it’s no surprise that the scripting behind it is minimal. Still, I do plan to improve it as much as I can, even if I don’t play much personally. Eventually I hope to make it as streamlined to play as possible and take away much of the “carpal-tunnel” tediousness that online play introduces to card games as well as help players avoid common mistakes done while playing complex games.
If you do get to play a game with your friends and find things that annoy or could simply be improved, do contact me and I’ll work on it as soon as possible. And of course, spread the word.
I just managed to finish my first Doomtown on OCTGN on the latest version1 with Eloi who is also a maintainer of games for OCTGN. In fact, the reason we started playing is because I found a way to create larger capital cards for Warhammer:Invasion2 and I contacted him about it in case he wants to use it. I mentioned Doomtown and he was interested to try it, so we did.
Fortunately he had skype because otherwise my fingers would be raw from all the typing. As it is, I’m just really really thirsty from all that talking 🙂
So yeah, we did a learning session and it worked fabulously! So I wanted to share with all of you a screenshot I took as the game was nearing its end. I think it looks great.
So if any you out there manage to play a game and get into a nice situation, do take a screenshot and send it over for me. Maybe I can make a “best moments” gallery 😉
I’d managed to play a few full games back on 0.2.7 or something and a few games where my opponent’s PC crashed in the middle of the game with recent versions [↩]
OCTGN is limited at the moment in the sense that you can only have one size of cards. [↩]
I’ve updated the torrent for Doomtown to include the latest version of the game definition and markers and also the latest versions of the sets, which I’m glad to say, have finally started including High Quality scans.
For those who do not know, the Bundle includes everything you need to play Doomtown on OCTGN but it’s not updated as often, as usually only the game definition is updated. Nevertheless it’s the best way for a new player to grab everything they need, without downloading all the files 1 by 1 from the repository. Inside you will find the game and sets, plus pdfs with the rules, faqs and so on. Once you’ve downloaded it, you can simply direct OCTGN to install the files from that the directory, and if in the future you download a newer version of the bundle, your game on OCTGN will be automatically up to date1
Not especially tricky as you can see. The trickiest is finding someone to play with. You can try subscribing to the Doomtown Facebook Group and see if anyone is available for a game. You can also create a game and hope that someone is online to join it since anyone who has Doomtown installed will see open game lobbies.
However I guarantee that if you like card or tabletop games, you will find this one a blast. In the recent weeks I’ve spent a lot of effort in automating away most of the more tedious stuff one has to do when playing card games online, such as modifying counters and typing each action that they do in the chat. I’ve literally spent the latter half of my vacation (while staying home sick) to code some pretty nifty stuff to use the powers that playing on a PC gives us in order to make the game easier to play.
For example, the game will let you know if you cannot play a unique card, because someone else has it in play (or it’s dead). It will automatically calculate your poker hand rank, taking into account jokers and what kind of poker you play. It will update your various totals (influence, control) as you play and lose cards and you can even force it to recalculate all your totals in case you lose track. It will pay your upkeep and receive your production at the start of the turn, and refresh your cards and hand at the end of the turn. It will even remember if you permanently modified a card before and add the same modifications in case that card leaves and comes back into play later on.