Wednesday, November 22, 2006

Invitaton for abuse

Ooh, look at that. No, not Celtic's bizarre lead over everyone else in the Scottish Premier League. Look closer.

It's a screenshot.

It's a screenshot of what the GUI engine is capable of. It's green, which is always nice and relaxing, and it's got some football related info on it, organised in a nice way that people can instantly recognise, and that's not just because the top two are the Old Firm.

That league table is a custom gadget in the GUI. The release on Sunday night went fairly well as module releases to a programming language community go, and so on Monday I went to work on more gadgets that I needed. The first was a simple generic table which could take any number of columns and produce output not dissimilar to that screen there. It's a rather good gadget for working with lists of things, but for a league table I needed something more specific, and more powerful.

Hence the customisation. At the minute, it's largely the same except the column headers are predefined, and it's a lot easier to add the data because of it. Underneath the hood, as I might say if I was American and cared about cars, each team has a name, a position in the league, a home record, and an away record. Those last two get combined to show you what's shown here, while the league position is used in case you throw things out by sorting it.

Which you can't do yet because I haven't coded in the column sorting. Or the viewing of home/away records. In good time, I'm sure.

So, work is going quite well at the moment. From now on I'm going to resolve to post a screenshot with every blog post, so if I forget one, use the comments feature to send me abuse. I crave it.

Sunday, November 19, 2006

My First Release

The GUI is finished.

Well, that's not strictly true. It exists, it works, and it has all the basic features I need but basic isn't good enough for the game. Nonetheless, I'll be releasing it tomorrow if I can get off my arse and write some example code, build a few executables and find somewhere decent to host it. None of that should be a problem but I'd like to find a web host now and migrate this blog over, rather than rely on a third party host.

It'll feel great to finally have something out there, even if it isn't a game, is entirely free, and won't keep me in Yazoo. It'll just be nice to have something to offer, get some feedback and hopefully see people using it and liking it.

Following the release, I'll be implementing some things that are specific to my own game. Which is always a lot more fun. It brings me closer to finishing (although "close" really isn't a great adjective to be using at this point) and I get to try things out. First up, a standard list - we all need those and that'll get slapped into the release version of the interface. Then a league table gadget, which I guess people don't need much, and some fixture lists.

Essentially, everything you see on the screen is a gadget. As it should be.

Thursday, November 09, 2006

A nice, relaxing, excruciatingly painful break

The fun met an abrupt pause last week. I had to go to the dentist to fulfill the latest part of my bi-decennial checkup. Unlike the more mundane fillings, this one was a root canal. My first. I was entirely oblivious to the horror stories that surround this process, and as such the entire thing passed without me even noticing the dentist had done it. I was just about to utter a mild "excuse me, is it done" when the very answer came forth.

Off I went about my business. As the anaesthetic wore off, I felt a tinge of pain but nothing to get in the way of the work I had planned - implementing a simple panel as one of the basic building blocks for my new GUI system, and the others to go along with it.

That night, I worked. I had some successes, but was tired and unusually cold. The next day was not so lovely. The pain had built up, and I sat through work, swirling freezing water around my gums in an attempt to numb things. That never worked, and I came home that night with no plans other than to curl up under a blanket and watch some football. I never slept, the pain was too much. I resolved to burst into the dentists office the following morning, which I did, and thankfully got myself some antibiotics. Antibiotics which wouldn't work for three days.

I couldn't stay in work, so I went home, going through a repetitive pattern of sleep, toilet, pain, sleep, toilet, pain. First in the bed (not the toilet part, mind you) and then on the sofa after I resolved to finally play Bully. That never happened. The house was biting cold, but there was no way that heating was going on after last winter's bill. More jumpers.

Finally, my girlfriend arrived with stacks of pills and all manner of drugs which I'm pretty sure I would have injected straight into the offending gum if I only had a needle. Miraculously, they worked anyway. I could sit up, watch TV, talk! Thank fuck for all that.

Still though I wasn't fit to work. It wasn't until Sunday that I finally loaded up BlitzMax to see if I could knock something more out, managing to do half that button I had wanted to get done during the week. Instead of having most of the GUI work done by Sunday, I had barely started.

Which means that's what I've been doing this week. That button has been completed and I've added some labels, images and a nice combo box that surprisingly works exactly as I wanted it to. This is a breakthrough for me, as I hate coding those fucking things. It's even pretty extensible and the same code can be used for those lovely right-click shortcut menu jobs.

I also learned some more about BlitzMax's 2D system, which isn't the best, but rather than mope as I would have done in the not-too-distant past, I've taken it on board as a challenge. If I have to get stuck into the guts of OpenGL, I'll do it.

There's a solution in there somewhere...

Thursday, October 26, 2006

Joyless Soul - meet Mr Big Fuck-off GUI

I wasn't in Madrid that long, was I?

I think I'm going to have to bite the bullet (or chew any other type of ammunition, though that may lead to the swallowing of poison darts) and write my own GUI system.

I've done one before. It didn't work very well, the code was a hideous mess and on some computers it slowed to a crawl. But none of that bothers me this time. First, things are object oriented now - this is good for GUI systems. Secondly, I've picked up a few tricks which I'm interested in trying out along the way.

And thirdly, fuck it. Every time I try a third party solution, it causes me as much hassle as it would be to write my own. There's nothing essentially wrong with these off the shelf GUI engines. For what they're designed to do, they do very well indeed - and they've been excellent to learn from. It's just that what I want to do, and the way I'd like to do it, is not really compatible. I wanted to build a system that would surround a GUI, providing me all the gadgets I need but without the headache inducing method of creating each and every screen through mind-numbing statements littered throughout the code. It needs to be skinnable - incredibly so. It's not enough to change colours, I want a modder to be able to redesign every screen in the game.

The last GUI I've been using was pretty good and I had a working system, but the fourth problem reared its head. Lack of transparency. Things were happening using this GUI that I didn't understand, and they were eating my frame rate - before I'd even so much as started processing any of the game stuff. At this point, that's the last thing I need. I need control, and I'm going to get it.

And the fifth thing? Well, that's the whole reason I started coding in the first place when I was about 10 years old. It's fun. It's fun to achieve things, it's fun to hack things, it's fun to just throw stuff at your computer and learn from the results. Back then I got a buzz from properly generating a random number and recreating Grandstand's Saturday afternoon vidiprinter. Over the last few months I've lost that buzz, and it's making me lose a lot more.

I'm going to have fun again. There will be a game at the end of all this. But if it was just a game I wanted, I'd be playing Football Manager.

Monday, October 09, 2006

Bars and Madrid

Despite the fact that I seem to never update anyway, I thought it wouldn't be a bad idea to let you six (or however many visit these days) know that there'll be no work done over the next four days, because some people who should really know better are sending me off to another country for reasons best known to themselves.

Still, I've almost completed an xml wrapper for the GUI system, and it's working well. It needs a good method of accessing the individual gadgets, and some way of getting the scrollbars to actually do something other than move up and down in a mesmerising but ultimately useless way. I'd kinda like certain things to scroll.

Oh, and properly skinned. I don't really want my game to look like Windows XP. Nobody does.

Tuesday, October 03, 2006

To simplify, treat middleware as your intestinal tract...

Owing to those recent problems that were doing my head in, I've spent the weekend doing my best (my lovely, lazy best) to come up with a viable solution.

Tonight I re-read a reply on the BlitzMax forums regarding the frame rate troubles I've been happen. At first, I had dismissed it as technical details that I wasn't willing to get into, especially when I simply don't have enough knowledge of how BlitzMax is actually working to dare get stuck into its guts and start changing variables.

Nevertheless, at a loss for a solution, I decided to give it a go.

The result was better than I could honestly have hoped.

Remember how the problem was this unwanted delay whilst trying to find out if a key or mouse button is being pressed? Well, tracing the path through the code from that simple KeyDown() function led me into the entrails that make up BlitzMax's innards, where I found the function PollSystem.

The offending function PollSystem.

What does it do? Well, allow me to put my whole heart into this biological analogy I've got going here.

Eating food is pretty simple, yeah? You chew, swallow, and it goes into your stomach, where your body does the rest. Your conscious job, unless you've just had a dodgy chip from the local eatery and are thus doomed to spend the next four hours renacting scenes from Platoon on the ceramic, is over.

Imagine, though, if that wasn't it. Imagine that every time your stomach wanted to do something with that disgustingly fatty yet absolutely deliciously greasy burger, it sent it back to your mouth. Asked you to chew again. And again. And again. Heck, never mind the burger, eating a fucking chip would take forever.


That is how PollSystem works. Or at least that's how it works to my admittedly incomplete knowledge. Every time I ask BlitzMax "is L being pressed?", it goes off and tries to read every single key again. This is just how it works.

On Windows, this is very, very fast. Negligible, in fact, unless you really wanted to make the absolute most of your time. We're talking... (I need a calculator for this) ..... one twenty-five-millionth. Is that a real number? 0.00000004 seconds. It's fucking fast.

On OS X, it's slower. I don't know if it's a bug with BlitzMax, a "quirk" (read fucking stupid flaw) of OS X, or anything, but it's one forty-thousandth in silly named numbers, or 0.0002496 if you want accuracy. That's 624 times slower.


So, what did I do? Well, I made BlitzMax chew its damn food before swallowing, that's what I did. By tweaking a single line, I stop it from calling PollSystem every time I check a key. The proviso is that I must do it myself, once per frame, to ensure that everything works. The result? OS X runs very fast indeed. My test came back telling me it ran six times faster than an untweaked Windows, but that's not a fair comparison for various technical reasons.

The thing eating away at the back of my mind, unfortunately, is that I'm no expert on BlitzMax and I'm not sure what the repercussions are of my tweaking. It does seem strange that the system would automatically be slower than is theoretically possible - however BlitzMax, being middleware, has been built with ease of use in mind every bit as much as power.

I'm hoping that this was simply a feature to keep the system more user friendly for new users. Hopefully someone in the know will clue me in. I'm feeling kind of lucky though, after seeing Watford throw away a 2-0 lead, but still steal an equaliser in the dying minutes to seal a 3-3 draw and win me £50.

Thursday, September 28, 2006

Ok, it's been two weeks. What's happened?

Well, the laptop's breathing again but it's not too reliable for doing any work on, so I've gone ahead and got that Mac. And now that's where my current focus lies. See, the system I'm using to create the game, BlitzMax, allows you to compile the same code on a Mac, a PC and on Linux with minimal changes.

In theory.

Unfortunately, things haven't gone smoothly. For a start, my editor won't work at all on the Mac thanks to a painfully slow implementation of listboxes, so any further work on that will have to stick to the PC for the time being.

Elsewhere, the GUI system I've planned on using has been throwing up dodgy frame rates on the Mac as well, the bottleneck being reading from the keyboard. While I can get by fine knowing that my editor will only work on Windows, the game must run as smoothly as possible on every platform.

I got a Mac because if I can release games for both platforms, I'll theoretically improve sales. I'd only need to sell 80 or so Mac copies to have it pay for itself. So it's very important that I get everything running smoothly.

Thankfully, it's entirely possible to code without having to test every 5 minutes. The Mac's in the spare room, a quiet haven where I can work without being distracted. As a result I can still churn out code and then give it a few tests on the PC just to make it perfect.

Also, seeing as I need to learn more about Macs and all that, I'm going to have to write a little something extra, specially for OS X. I'll worry about a PC version when its finished.

Thursday, September 14, 2006

It's dead

Or as good as.

Not the game. My laptop. The hard drive is effectively fucked, quite possibly thanks to the overheating I had earlier. A new hard drive would cost about £50 but for a four year old laptop that's having more problems than I am (and that's a lot of problems), I'm not convinced it's a good idea to keep hacking at it.

Instead, I'm going to buy myself a Mac. Plenty of advantages to be had with that.

What it does mean is that I can't get much work done over the next few days, though weekends are still pretty clear. I'll use this time to finish some of those games other people made.

Sunday, September 10, 2006

It nearly happened again

Damn right it nearly did. I had just sat down to work on how seeding systems are set up in the database, when I started to lose confidence in how I had previously done it and was all set to rework that.

Fuck it. Rework it? Nah. I took an hour or two out and came to the conclusion that it does the job and is very simple, so I'll keep it like that. If I want to rework it at any point, I'll wait until I actually have a game and can then fritter away time on such unproductive tasks.

Elsewhere, with the spare room in the flat having been tidied up in the last week, I've decided to get myself a desk and stop working in the living room so much, distracted by the internet, the telly, the fridge full of food and so on. I'll try to instill a proper work ethic rather than the current slapdash approach. Anything to make progress.

Tuesday, September 05, 2006

An African or a European Vole?

I'm well aware that it's been a week and a half, and there's a very good explanation around here somewhere. I'm going to need three parakeets and a small African vole to find them though.

Are there any voles in Africa?

Anyway, I'm really pissed off these days because I'm still stuck on the editor, which of course I had already finished. But the end is in sight, I guess.

In the meantime I've been biding my time with games of Football Manager 2006, and actually enjoying it again. Makes a change.

Friday, August 25, 2006

Tony's Mate's a Nonce

I'm having a bit of a block at the moment. I've had a cold all week which hasn't helped matters, and when I sit in front of the computer I can't do any fucking work. It's rather irritating.

Still, I did get all the nations entered. The final count is 274, which is rather large. 207 FIFA nations, and then a bunch of oddballs. Should be fun managing the likes of Catalonia.

Saturday, August 19, 2006

It Begins

Saturday. The greatest day of the week. The lie in, the free time and thankfully now the football yet again. Sure, the English season has already kicked off for all those Football League clubs, and even the local clubs here have started their League Cup (Newry won, whooo!). But today marks the return of the full six hour Soccer Saturday, and start of AFC Telford United's league season. And Match of the Day, of course.

It's marvellous, really. So I'm off to enjoy it. And maybe do some work too.

Tuesday, August 15, 2006

FA Cup Is Here Again!

Ah, competitions. Let's hope they all work.

With a bank holiday weekend coming up in a little over ten days, I'm going to work hard to make sure that I can get the data editor working regarding competitions. Already I'm able to create the damn things and tweak various simple values - the number of entrants, when the competition should be reset, that sort of thing.

The actual structure of each competition is like playing with Lego, except without the cool ability to make a large sword and smash it over your friend's skull, showering both of you in sharp plastic blocks. Lego is ace.

Getting a basic competition built is simple, and after that I've to redo all that horribly complex qualification stuff that bled my mind dry earlier in the year. If I can get it all done for that Friday though, I've got a "fun" saturday coming up.

In that one day, I plan to go from having a bunch of raw data to having working competition structures. One day, a huge boost.

But not this Saturday. This Saturday, the season kicks off for those teams at the top, and loads of teams at the very bottom. While the likes of Chelsea and Liverpool battle it out for early leadership of the Premiership, exotic sounding sides like Deeping Rangers and Ramsbottom United will try to make it through the Extra Preliminary Round of the FA Cup.

My tip to go the furthest, based on nothing more than the name of the club alone? The mighty Diss Town, away at Tring Athletic. If the former isn't an entire team full of Ali G lookalikes, I may retract the tip.

Saturday, August 12, 2006

Related Clubs

In football, clubs aren't standalone entities. In addition to many clubs having close ties with companies (such as Philips Sport Vereniging, better known as PSV Eindhoven, or lowly Airbus UK in the League of Wales), there are plenty of clubs that have links with other clubs. Manchester United, as many know, have a relationship with Royal Antwerp, while elsewhere both the Metrostars and Austria Salzburg have been purchased by Red Bull, controversially changing team colours and renaming the sides to Red Bull New York and Red Bull Salzburg respectively.

So what do those relationships mean? Well, Antwerp's case is clear - United regularly send out youngsters on loan to aid their development. For the Red Bull sides, things have yet to fully materialise. It is possible that players could move between the sides, and with a common ownership I wouldn't be too surprised to see that their financial status mirror each other. Regardless, it's a tricky situation.

This becomes pertinent when regarding the game. No simulation of world football would be complete without organising relationships between the clubs, and while each individual case is often complex, there are general factors that I can use.

The first relationships I have in the game are the obvious. Rivalries exist between clubs, of differing strengths and reasons, be they sporting, political or simply based on location alone (a number of rivalries encompass all three, of course). Clubs can be Successors, in that they were formed out of an existing or collapsing club. FC United and AFC Wimbledon are two famous "successor" clubs formed by fans who feel the original side have mistreated them for too long. AFC Telford United or 1.FC Lokomotiv Leipzig are sides borne out of the ashes of clubs who have fallen under financial strain. In these situations there is often great debate as regards the ownership of the history of the original club - AFC Wimbledon and Milton Keynes Dons both claim the history of the old Wimbledon. Personally, I side with AFC Wimbledon (with a little foot in the "Wimbledon are dead and there are two new clubs" camp) but if the game's to be encyclopaedic, I need to find an official answer.

And of course, there are mergers. These "successor" clubs are formed out of a merger of existing clubs, or perhaps just absorbing a single club into the existing powerhouse. Kinda like Loco Roco. Rushden & Diamonds are a merger club, formed from the non-league sides Rushden Town and Irthlingborough Diamonds.

The game will not feature any mergers, splits or new clubs itself during the course of play. The technicalities of such features are pretty simple, but club names are hugely complex around the world. What applies in England will not stand in Germany, and is utterly useless in Brazil.

You can, however, form your own clubs in the game, at any point (provided you have the cash).

Feeder Clubs will be in the game, in a greatly simplified format at first. As described above, a feeder club link will allow for the parent side to send their players out on loan to the feeder, adhering to all the transfer rules of the governing bodies involved. The parent side can also have first option on any player in the feeder club. As the intricacies of feeder clubs become more apparent, I'll be expanding on the situation, but a basic implementation is a must. Feeder sides such as Real Madrid Castilla, which are essentially part of the whole Real Madrid club, will be implemented as second or third sides of the main side.

And lastly, clubs can be linked Financially, enabling potential situations like the Red Bull Empire.

And remember from Star Wars - empires are the bad guys.

Thursday, August 10, 2006

Outside the mainstream

Derry City just beat Gretna 5-1, away from home. A lot of people are very happy in Ireland right now. A fair few people in Scotland are probably in shock. And some people in Northern Ireland are a little scared because if Irish league clubs continue to improve, the Northerners are screwed in the Setanta Cup.

Elsewhere, Drogheda United, also of the League of Ireland, slipped to a narrow defeat at Norwegian side IK Start, whilst Welsh side Llanelli were defeated by the same scoreline by Odense BK of Denmark.

Now, this blog isn't a football news website so why am I telling you this? Well, it's because the only game that was actually available to watch on the television tonight was Newcastle United's dour affair with Lithuanian side Ventspils.

TV hates the little guys. The media just don't care. And as a result the average football fan in England's streets remains eternally blinkered about anything that's ever occurred outside the scope of the Premiership or Champions League. When unfashionable clubs finally do get on the box, they're constantly patronised to great lengths by commentators who put in a half arsed research attempt. When Liverpool faced Total Network Solutions in the Champions League first qualifying round - for many people the first time they even knew there was more than one - the folk in the studio just about managed to get the name of the club right. When a part time non-league side faces Premiership opposition, it doesn't matter how much the lowly representatives eulogise about their club's strengths and the appeal of the non-league game. All the papers want to know about is which one's the plumber.

It's about ratings, it's about drawing in the viewers for advertising revenue, and in that respect you can forgive the likes of ITV and five for not going to great lengths to snatch at the opportunity to cover Gretna's charge through Europe (that the game was picked up by Irish channel Setanta Sports is only some consolation, as I don't have it). The BBC, unhindered by commercial restrictions, could well have picked up Llanelli's game against Odense - an away game, it's not exactly going to stop the hordes from flocking to the stadium to catch the action. The travellers will always go.

So what about the game? Well, it's an area I want to pay attention to. Not only do I want to give plenty of exposure to the teams people rarely hear about, I want to bring forth the full experience. Playing a football game, as I've said in the past, can often be a sterile affair. Games rarely seem to note the difference in quality between the competing sides, so when I score a late equaliser with Yeovil against Liverpool in FIFA 2005, I get the same celebration as if the roles were reversed.

There's a lack of emotion. Derry City right now are over the moon. It's their third European win on the trot (the other two coming in the first qualifying round against IFK Goteborg, no mean feat) and only their fourth ever. The travelling fans were ecstatic throughout the second half, there's a party atmosphere throughout.

A game needs this. Football such as this is all about the passion. If it's missing, you've missed the point.

Wednesday, August 09, 2006

Overheating Fun

Being a geek, I have two computers at home, a laptop and a desktop. This gives me the ability to work regardless of what my girlfriend wants to do - and as she quite likes Rollercoaster Tycoon 3 at the moment (which she's happily modding and displaying a much greater understanding of 3D modelling than I ever have, though she still refuses to accept a geek label), I'm stuck with the laptop.

Pesky integrated graphics.

The laptop is four years old. It's still quite powerful as far as laptops go, although the memory is a bit of a bottleneck, and as such I can happily make my game on it. Or at least, I used to. For now, my damn laptop overheats far too much and shuts off. A laptop cooler is sitting in the local post office. I have to go out of my way at lunch tomorrow to pick it up. It had better bloody work.

It's irritating because it means I can't work using the laptop without fear of either breaking it or losing my work. And the fecking thing proved far too difficult to open for my puny little hands. That'll have to be fixed.

Still, in other news the editor is mostly working now, and I'm going to spend plenty of time over the next month getting competitions in order. Quite looking forward to that, as it's becoming very boring stuff recently which has led to posts telling you to all bugger off, and overheating laptops.

Saturday, August 05, 2006

Dullness

As ever, I've got nothing to report on the basis that it's all incredibly boring stuff. Things get fixed, things get broken, things get changed, dropped, and poo-pooed on.

So there really isn't much to say these weeks, which is perhaps a bad thing. Maybe I could be like other bloggers and start reviewing other games for the hell of it, except that I don't have the inclination to go cramming shite into my schedule, what with shit games being infinitely more fun to read about.

So essentially you'll probably have to wait until I'm doing something more interesting before the blog actually becomes worth your time.

Monday, July 31, 2006

Morose what now?

Ok. Been a bit long. I blame.... cabbage.

I've been doing plenty of work on the data editor, and now it's almost refurbished. Well, it looks identical to the old one but uses the new database code, and as such it's infinitely better and using it is like breathing a whole new type of air, with 55% less fart.

I've also fixed a fairly major bug in the database code, so that's equally excellent.

But apart from that lot, I'm getting a bit annoyed that I'm retreading old ground. I expected this to happen, of course, and I'm still not doing too badly with regards to my targets. However, it does sap the energy to spend each night in front of the computer doing repetitive tasks.

So in addition, I'll also fiddle about a bit with random graphical jiggery-pokery (the best kind of pokery) to keep that little spark alive that says "have a bit of fun, you morose fuck!"

Although if it's going to be rude...

Sunday, July 23, 2006

Wahey for Backups

So, there I was, about 90% of the way towards changing the way the system stores the group sizes. I had updated the database structure and found that I made a wonderful saving of 8MB.

Then it hit me - the major memory hits come from any tables that have a lot of records. The biggest table is the People table - 575,000 records. The next biggest weighs in at a mere 16,000, which is section data (each competition being split up into sections, such as a group phase or knockout stage).

Other than the People table, I wasn't losing much memory. And although on an individual basis the speed hit wasn't that big, there's no point in sacrificing speed for 8MB of RAM. Speed lets me do more.

So the backup was useful, to stop me having to spend time changing everything back. I've got to do that more often.

In other areas, I started playing Brothers in Arms: Earned in Blood. The series is easily the best WWII shooter out there. It's atmospheric, looks great, and best of all doesn't treat your character as John Matrix. Invincible supermen don't work for me in a historic setting, so to see myself get ripped apart when in the open is joyous indeed.

Or not, as I'd rather kill them.

The sequel looks ace.

Wednesday, July 19, 2006

Insight into My World

I can use the database code to solve a problem with the database code. Now that's just genius on a par with folk like the guy who invented marmalade, and stuff.

Actually, I hate marmalade. Tangy bunch of crap.

See, my problem is that I'm often forced into using too much memory to store small numbers. I wrote the database code as a means of allowing me to store small numbers in just the right amount of memory. So what I've decided to do is have the system automatically create fields for every "group" in a table, telling you how many entries are in that group.

I had held off this idea in the past because I thought it would be too slow. That's a load of poo, it's perfect. The player table alone shaves nearly 10MB from the file size. Ten arse megabytes that weren't being used at all.

In other news, I purchased a copy of Kudos, obviously on the basis that my own life's down the pan so I may as well lead an alternate one. That went well. Within a year I had lost all my friends, been robbed three times and learned the ancient art of Kung Fu in retaliation. One of the chaps that burgled my home decided that instead of taking the cable telly, he'd swipe my self help book. Such a blow to my confidence, but at least I could still watch the Comedy Channel. Alone.

Hey, it beats staring at the walls with the lights off.

That's an option in the game, by the way. Where I live, I have no walls.