LIQUIDWAR-SERVER(6)
๐ง NAME ๐ง
it's the Liquid War page, section 6 of the Games Manual โ and the star of the show is liquidwar, a unique multiplayer wargame. periodt. ๐
๐ฆ SYNOPSIS ๐ฆ
liquidwar [-vh]
โจ DESCRIPTION โจ
okay so bestie, Liquid War is a multiplayer wargame. that's the whole thing. the rules are very simple but yet original โ which is honestly the most iconic combo imaginable ๐
๐ OPTIONS ๐
-vโ shows you the version number. yes queen, know thyself.-hโ prints the copyright and various information. like a lil info dump, slay.- โฆ
ngl there are many other command line options, and they're all described further along in this document. keep reading, bestie, they're coming ๐ซถ
โ ๏ธ WARNING โ ๏ธ
real talk for a sec. Liquid War is a cross-platform program โ it also runs on DOS and Windows โ so there was literally no reasonable way to hand you Windows users a groff UNIX-style documentation. so instead, Liquid War's documentation ships in many formats, including HTML, PostScript and PDF.
ngl I genuinely believe those formats are easier to read than this man page. so go check out the /usr/share/doc/liquidwar or /usr/local/share/doc/liquidwar directories โ that's where the HTML and other documentation files should be living, living their best life ๐ธ.
otherwise, if you're a die-hard man page user, you may continue with this document 8-) โ respect honestly.
๐ Rules ๐
๐ The Liquid War concept
Liquid War is a wargame. but it is different from common wargames, and the difference is the whole vibe.
when you play Liquid War, one has to eat one's opponent. ๐ญ there can be from 2 to 6 players. there are no weapons โ the only thing you have to do is move a cursor around in a 2-D battlefield. that cursor is followed by your army, which is composed of a great many little fighters. fighters are represented by small colored squares. all the fighters who have the same color belong to the same team. one very often controls several thousands fighters at the same time ๐ณ. and when fighters from different teams meet, they eat each other. it is as simple as that. no notes.
๐ง How do teams react?
teams are composed of little fighters. these fighters all act independently, so it can happen that one single fighter does something different from what all the others do. main character energy, honestly.
the main goal of these fighters is to reach the cursor you control. and to do that, they are in a way quite clever, for they choose the shortest way to reach it. check it if you want, but it is true โ they really choose the shortest way to reach the cursor. that is the whole point with Liquid War. ๐ฅ
but these fighters are not perfect, so when they choose this shortest way, they do as if they were alone on the battlefield. that's to say that if there is a fighter blocking their way, they won't have the idea to choose another way โ one which is free from fighters but would have been longer otherwise. so fighters can be blocked. it's giving "no thoughts, head empty" but it's also the entire game mechanic ๐
๐ Who eats whom?
when two fighters from different teams meet each other, they first try to avoid fighting, and they dodge. but if there is no way for them to move, they get angry and attack the guy which is blocking them. sometimes, they attack each other and both lose health. but it can happen that a fighter is attacked by another one, which is himself not attacked at all. unfair? maybe. iconic? absolutely.
here is an example of this behaviour: a blue fighter and a red fighter both want to move to their right, for that would be the shortest way to reach their cursor if there was nobody on the battlefield. but they are blocked by other fighters. if, for instance, the red fighter is on the right and the blue fighter on the left, it is the red fighter which will be eaten.
when a fighter is attacked, he first loses health โ that is to say that he gets darker. when his health reaches 0, his color changes and he becomes a member of the team by which he has been attacked. therefore the number of fighters on the battlefield always remains the same. conservation of fighters, bestie, slay ๐
when fighters of a same team get stuck together and block each other, then they regenerate โ that is to say that they get brighter โจ
however, I think the best way for you to understand the way it works is to try the game... ๐
๐ธ Basic strategy
when I play Liquid War, I always try to surround my opponents, and it usually works. no cap.
by the way, the computer has no strategy at all. he is a poor player, and if you get beaten by him, it means you have to improve yourself a lot! ๐ญ (affectionate)
but still, the computer doesn't do one thing which I've seen many beginners doing: he never keeps his cursor motionless right in the middle of his own fighters, for this is the best way to lose. not me calling you out. okay maybe a little ๐
๐ More strategy
here are some more tips, kindly submitted by Jan Samohyl. absolute legend.
- try to cut your opponent off walls and surround him completely with your troops; when trying to penetrate his forces inside a tunnel, keep your troops at the wall (and force them ocassionaly to attack off the wall). I think this is a biggest weakness of the computer AI, that it doesn't know this.
- when luring your troops to outflank an enemy, always move your cursor through the enemy, not the other way around.
- to penetrate very narrow tunnels, stand back for a while and let some enemy troops come from the tunnel to you. then surround them, destroy, repeat. ๐
- I have observed that with more than
2players (6), the game difficulty depends on the map in the following way: if the playing field is completely empty, without any holes (topologically equivalent to full circle), the game is the easiest, because you can just go through the middle to outflank your opponent. if there is a single large obstacle (ie. playfield is topologically equivalent to ring (the area between two nested circles)), the game is the most difficult, because you have to choose one direction for the attack, and cannot simply defend the other direction. for other maps, it seems to really depend on their similarity to one of these two extreme situations (and army size, of course, because it changes the relative size of obstacles). also, if you would later add another cursor, this property would probably disappear (maybe then games withn+1obstacles would be the hardest ones withncursors). - if you want a particularly challenging computer game (at least for some maps), use several players, max out attack, min out defense, max out base health (opposite would be harder, but game then changes to the large cloud of black troops, so you don't see anything) and give winner an advantage. ๐โจ
๐ The winner is...
the clever guy who has got the greatest number of fighters in his team at the end of the game. or the one who exterminates all the other teams! ๐
๐ซถ Authors ๐ซถ
๐งธ Thom-Thom
Liquid War rules have been invented by Thomas Colcombet.
he was trying to find algorithms to find the shortest path from one point to another, and found the Liquid War algorithm. then it came to his mind that a game could be build upon this algorithm, and Liquid War was born ๐ฆ. he programmed the first two versions of Liquid War using Borland Pascal for DOS, and gave me some information about the algorithm so that I could re-program it.
๐ฎ U-Foot
I'm the guy who programmed the latest versions of Liquid War. I enhanced the algorithms, and did quite a bunch of work to have the game playable by (almost) anyone โ that's to say create a correct GUI. ๐
if you want to join me, here's all the information you'll ever need:
Christian Mauduit
E-mail: ufoot@ufoot.org Web site: https://ufoot.org
GnuPG public key: CA272B47 - https://ufoot.org/gnupg.pub GnuPG fingerprint: 71AD 4CBB 345A 5F15 6D03 AA6D 1050 9F67 CA27 2B47
Snail mail: 32 rue Jean Moulin 95100 Argenteuil FRANCE
๐ Other contributors
as Liquid War is now free software, protected by the GPL, anyone is allowed to view, edit, modify, re-compile the source code, and distribute it โ as long as Liquid War is still distributed under the GPL. love that for us.
here's a list of the contributors:
- Alstar: drew a map, which is now included in the main distribution.
- Peter Wang: ported
Liquid WartoGNU/Linux. - Cort Danger Stratton : helped me setting up network support.
- Tim Chadburn : wrote midi files for the game. his contribution has been truely appreciated since it's rather hard to find
GNU GPLcompliant artwork. he also wrote documentation and helped with midi support in general. - Jan Gretschuskin : contributed
11maps, and made the German translation. so if you runLiquid Warwith German menus, you know who you have to thank->Jan!8-)also do not forget to visithttp://www.game-factor.de - Mouse : contributed a map.
- Rene Stach : drew
3maps. - Roderick Schertler : implemented
HTTP 1.1support. - Ryan D. Brown : ported
Liquid WartoMac OS X. - Eduard Bloch : maintained the
Debianpackage, and helped with German support. - Michael Terry : provided a
.desktopfile for better integration withGnome,KDEand other UNIX desktop environments. - Kasper Hviid : contributed many maps, with their own textures, and made the Danish translation. great work, also available on
http://levels.2v1.cz/index.html - David Redick : wrote an external random map generator, available on
http://xdavidx.sqrville.org/lwmapgen/index.html - Alexandre Pineau : maintains the
Debianpackage. - Michael Wagner : translated the web site in German.
- Peter Williams : fixed the
"too many opened socket"server bug. - Jan Samohyl : submitted strategy tips.
- Gavin : wrote the
Liquid Warfanfic. - Dave Vasilevsky : fixed the
Mac OS Xport. - 2 of omega : contributed a map.
- 666-REFIZUL-666 : created many maps (distributed separately).
- Thomas Klausner : fixed
MakefileforFreeBSD - Joan Dolc : helped with
Mac OS/Xport - Jan Szenborn : Polish translation.
many other people helped me by submitting bug reports and patches, and I want to thank them for their precious help ๐ซถ. thanks to all the Debian people too, who nicely maintain the Liquid War .deb package. ๐
๐ Mailing lists ๐
๐ฌ liquidwar-user
๐ธ Description ๐ธ
Okay so this list is the general hangout spot for everything Liquid War. Wanna drop a suggestion? Do it here. Got a bug to report? Here. Need help? Here. Looking for people to play with? Bestie, HERE. Basically any question or remark that's about the game is welcome on this list, no gatekeeping. ๐ซถ
๐ Practical informations ๐
Heads up: you can't send messages to the list unless you're subscribed. The only reason for this is that it's one of the only ways to block spam efficiently. The original author first thought it could be OK to let anyone post, but liquidwar-user seems to have been harvested by robots, so now posters have to be restricted. BUT โ and this is the important part โ anyone can subscribe, and subscription to the list is not moderated. So if you're a human being and not a stupid spam robot, you're welcome on the list 8-)
Here's a list of useful URLs:
- To (un)subscribe:
http://mail.nongnu.org/mailman/listinfo/liquidwar-user - To consult archives:
http://mail.nongnu.org/pipermail/liquidwar-user/ - To post on the list:
liquidwar-user@nongnu.org
๐ฌ Chat and IRC
๐ Web-based chat-box
There's a web-based chat-box set up, and you can get to it right here: https://ufoot.org/liquidwar/v5/metaserver.php
It's not as good as a good old IRC channel, ngl, but not everybody can use IRC (firewalls and the likes say hi ๐), and the author likes the idea that people can chat AND have the list of available servers all on one single web page. Convenient queen behavior. ๐
๐ฆ IRC channels
The author personally spends some time on irc.freenode.net, so you might use it to find other players โ though they claim not to be a real IRC addict... ...not yet, at least! ๐ญ
Here are the channels that are recommended:
#liquidwar: the Liquid War dedicated channel, for finding players and chatting while playing.#netgame_players: a general channel for players who want to play Internet games โ Free Software and/or Open Source games of course, we're onfreenode.net8-)
๐ Fanfic ๐
โจ What's this? โจ
Quoting Gavin: "I wrote a liquid war fanfic some time ago [...] I wrote it after a friend claimed that there wasn't any liquid war fanfic because it wasn't possible."
So here it is โ a Liquid War fanfic, enjoy! (and special thanks to Gavin ๐)
๐ The Battle of Emberlificoted ๐
...
The General presided over his massing army in his seat, or rather hovering ring, of power. It dipped slightly as he flew low over his troops marching through the viscous marsh-like terrain. They were like children: obedient, loyal, and they ate a lot.
Glancing at the status panel mounted in front of him he grimaced; the other five armies: Yellow, Green, Orange, Turquoise, and, of course, Red, were also readying armies of a similar size to his own. His violet clones would have to fight hard and eat well to win this day.
Today would not be a battle of luck, the General mused, it would be a battle of tactics, of alliances, and of betrayal. Every clone was identical - that was the general idea behind clones - and the terrain seemed strangely symmetrical; it would not give advantage to any of the six armies amassed today. Glancing at the hologram of the battlefield projected in front of him the General noted that he would have to move quickly, Orange and Yellow were too close for comfort, though fortunately Baron Red's army of eponymous coloured clones was the furthest.
General Violet's fingertips were sweaty even before they touched the four main control keys in front of him. They were labeled 'W', 'A', 'D', and, of course, the full retreat button - very useful for misleading foes and ambushing them as they pursued - 'S'. The keys were arrange in a roughly equilateral triangular pattern; with 'S' forming the base and being adjacent to both 'A' and 'D', 'W' formed the tip of the triangle.
A long breath left his parched lips as at last he made his move.
...
"Dammit!" he screamed moments later. He had misjudged Captain Yellow and Commander Orange; he had expected one at least to attack immediately, one he could have handled. They were working together - foiling his attempt to shoot between them to near the center of the battlefield to gain a better vantage point. Yellow had shot down towards him, cutting off his advance, and now Orange had sealed his escape route. "It's not over yet" muttered the General. He opened a voice channel with Commander Orange:
"Very clever. Flawed, but still clever."
"Flawed?" came the reply.
"Yes flawed, when the good Captain is finished devouring my army who do you think he will turn to next?", bluffed the General - his hands worked quickly as he manoeuvred his hovering control ring, all that his troops ever saw of him, carefully towards the weakest section of his attackers. If he could just break out a few units he could soon turn the tide against both Yellow and Orange.
"We have an alliance..." Orange's voice was unsure now.
Time for some sarcasm to through her even more off balance, thought the General,
"I gathered", he spoke softly, slowly, and with too much meaning. Then closing the channel he turned his attention back to his escape.
...
"Yes!" wooped the ecstatic figure of the General. Fifty or so of his troops had broken free undetected and were even now working their way cautiously towards the camps of the Yellow army, only the front lines were still actively fighting; this opening gambit of Yellow and Orange had turned into a stale siege and Yellow's army had pitched tent.
General Violet steered his hovering guidance ring to the center of the Yellow camp. His troops struck, both those who had got behind the lines and those who were still besieged. Yellow reacted too slowly and suddenly found that her army, was shrinking back from the onslaught. There was nowhere to run to, and bye now her only ally - Commander Orange - had abandoned her to her fate; he was too busy engaging Sir. Turquoise, who had managed to escape from the slaughter that the Baron had caused to the Turquoise ranks and was even now valiantly attacking the flanks of the Orange troops.
A glance at the status panel showed that Yellow's life force was fading quickly: 8%, 3%, 1%, Gone.
The General smiled, he always enjoyed getting the first kill, and by now his armies life force had grown and his clones had replicated. With his, now, formidable fighting force it was no problem to engulf both Sir. Turquoise and Commander Orange's brawling armies and annihilate them. Once again his army grew in size and power. Now if only the Baron didn't notice that..., thought the General.
...
"Too late!" yelped the General, now thrown into panic, as he saw the approaching Baron. His army had also grown in size and power - having fatally injured the Turquoise army within the opening moments of the battle, and having finally managed to catch the elusive fleeing form of, or what remained of, Emperor Green.
Gripping the controls harder the General thought quickly, his army doesn't so completely outnumber me that this is already over, however unless I can cause him to make a mistake that allows me to take the upper hand then I will inevitably lose. Maybe I can...
This thought was terminated and replaced by another as the Baron's angry red troops broke through the undergrowth that had covered their movements and started to surround the General's army. The thought that now throbbed through the panic-stricken mind of General Violet was simply 'Run!'.
Even as he signaled the retreat and made for what seemed to be the only possible means of escape the Baron's blood red control ring appeared at the opening. The General knew it was over, even before the host of red beings appeared at the opening.
There was no escape. His life force was almost depleted and he was surrounded. Then it was that the Baron decided to communicate:
"Too bad. It was a good game"
The General blinked, gaped, and was generally gobsmacked. Just before his life force completely failed and his own weary eyes closed in defeat he snarled,
"What!? This is not a game!" were the General's dying words.
๐ญ iconic, devastating, no notes.
๐ฎ Menus and hot keys ๐ฎ
๐ Introduction ๐
This section describes how the GUI works. Since programming advanced GUIs with Allegro is not so easy โ standard C programming definitely lacks flexibility โ and also since it's somewhat hard to figure out what is user-friendly and what's not, Liquid War's menus are not always self-explanatory. The plan is just to try and do something better next time! ๐
๐งญ Menus
๐บ๏ธ Map menu
The map menu is where you choose the map you're gonna play on. A map is defined by 3 things:
- A frame. The frame can be chosen with the slider which is below the preview. The frames are automatically sorted by alphabetical order.
- A texture for walls.
- A texture for the zone where fighters are allowed to move.
In the middle of the screen, there is a preview of the level. In this menu, the values of the parameters can be independently changed by:
- Moving a slider.
- Clicking on a "+" or a "-" button.
- Typing a number.
On each side of the preview, sliders let you choose the two textures. There is also a preview of each texture. Below this preview there are 128 little buttons which allow you to choose single colored textures.
The name of the map and its resolution are displayed in the lower part of the screen.
You'll notice that on some maps the texture selection zones simply disappear. This is because these maps are associated with a texture, so choosing a different texture is often not recommended for it won't look as nice as with the right one. If you still want to override this behaviour you can click on the "on/off" button just right to the "Use default texture" label. This is a toggle button which will allow you to use your own textures even on maps that normally come with their own skin.
You'll also notice that a "Random map" button is available. This button generates a new random map using an external program, lwmapgen, developped by David Redick, available on http://www.cs.clemson.edu/~dredick/lwmapgen/
This program supports many command line options, and if you want a very precise control on the generated maps, you'll need to run it separately. Looking at LW's log file you should be able to see the commands LW issues when calling this program, this can give you ideas on how to launch it manually. Alternatively using the --help option (for instance liquidwar-mapgen --help under UNIX) should describe how to use it.
๐ค Teams menu
This menu allows you to choose the teams which are going to play. There are 6 square zones in this menu. Each of them is associated to a team.
Each team can be either:
- Disabled ("Off")
- Controlled by a player ("Human")
- Controlled by the computer ("Cpu")
The computer plays poorly</p>, bestie, so remember that Liquid War is basically a multiplayer game, and that the cpu control is dedicated to beginners only. Like, it's a tutorial friend, not a rival. ๐
You can also choose the color associated to each team by clicking on one of the 12 colored buttons. Pick your aesthetic, slay. โจ
Below the 12 colored buttons, there are four buttons which allow you to choose your keys. Click on one of these buttons and then press the key you want to define. Joystick movements and buttons are considered as keys. You can disable the joystick with the button which is at the bottom left of the menu. Mouse input is also possible, and mouse movements are considered as keys too. To define mouse control, click on the button associated to the direction you want to control, and then move the mouse. Then the button should display something like "M->". Mouse sensibility can be set with the little slider at the bottom right of the menu. Yes gorl, your mouse is a keyboard now, we don't make the rules. ๐
๐ Graphics menu ๐
Here you can choose the graphic options of the game. The glow-up station, fr fr. ๐
The "Video mode" button allows you to switch between fullscreen and windowed mode. This button is not available under DOS. Rip to the DOS girlies.
The "Brightness" slider allows you to set the brightness of the game.
The "Menu res" slider allows you to set the resolution used by the menus. There are currently 5 possible values, which depend on which platform you're running the game on.
I personnaly think the menus look best with the 640x480 resolution, but some may prefer higher resolutions. Lower resolutions should only be used if you have problems using SVGA video modes.
The "Game res" slider allows you to set the resolution used during the game. The allowed values are the same than those for the menus. I recommend that you don't use resolution higher than 640x480, unless you have a Pentium VIII running a 10GHz. ๐ญ iconic honestly
Page flipping can be toggled. It is up to you to decide wether you keep this option or not. The main disavantage of turning page flipping off is that the info bar and the battlefield can look rahter ugly if they overlap. But if you turn page flipping on you will not easily reach the 166 frames per second I sometimes get on small levels with my K6-225. I personnaly always turn page flipping off. no cap.
The viewport size defines how much of your screen will be used by the battlefield. ๐ฆ
- If you set the slider on its left position, the batllefield will not be stectched at all. Or if is strechted, it will be by a
x2or ax4factor. So this is the mode wich allows the fastest display. โก - If you set the slider ont its right position, the game will run in fullscreen mode.
- With all the other positions of the slider, the battlefield will keep its general proportions but it will be stretched.
The "Waves" button allows you to toggle the wave effect. You can also do this while playing, by simply pressing F4.
๐ธ Sound menu ๐ธ
This section allows you to set the sound volumes. There are 4 sliders, which are:
"Sfx": sets the volume of all the sfx sounds, thats to say'the sounds you hear when the game starts, when you loose etc..."Click": sets the volume of the click, this nasty noise you hear each time your press on a button."Game water": sets the volume of the blop blop blop sounds which are played continuously while you are playing. ๐ซง"Menu water": the same thing than"Game water"except that it concerns the sounds played while your are choosing options."Music": general music volume. ๐ถ
๐ Rules menu ๐
This menu is the one where you can change the rules of the game. your world, your laws, periodt. ๐
The "Time" slider controls the time limit. The game will stop after this time is elapsed. You can pause the game by pressing the "F3" key.
By the way, an info bar can display the time left while you are playing. This info bar can be toggled during the game by pressing the "F1" key, and you can change its location by pressing the "F2" key. It also displays how many fighters there are in each team.
The "Army size" slider controls the amount of fighters there will be on the battlefield. The position of the slider reflects the amount of fighters of all the teams together. If there are 4 teams, then each player will have half as many fighters than if there had only been 2 teams.
The "Cursor x" slider controls the speed of your cursor. โจ
- If it is set on the left, the cursor goes at the same speed than the fighters.
- If it is centered, the cursor goes twice faster than the fighters.
- If it is set on the right, the speed of the cursor is multiplicated by 3.
Below is a "Min 160x100" box with a slider on its right. This means that maps will automatically be magnified so that they have a size of at least 160x100. Indeed, some of the maps that come with Liquid War were designed in 1995 when 486 Intel computers were common. Therefore the maps were smalls. Today, these maps are not really fun to play on fast computers, so Thomas Harte suggested this automatic magnifying feature, and that was IMHO a smart idea. You can move the slider to the right to make maps use a higher resolution - ie magnify them.
The "Defaults" button of the "Rules" menu will reset rules to their defaults. This way you can tweak rules and then come back to the default rules whenever you want. Note that there's also a "Defaults" button in the main "Options" menu, but it will reset all options, including player names... The advantage of the "Defaults" button in the "Rules" menu is that it will only reset rules parameters, and keep the rest of your configuration options untouched. the way that matters, fr. ๐ซถ
๐ฅ Speeds menu ๐ฅ
The "frames/s" slider allows you to limit the number of frames per second. If this slider is set on the left, there won't be any limit, so Liquid War will repaint your screen each time the fighters move. But this can be a weird behaviour if your machine is really fast, for no one cares about 100 fps per second, one can not even see them... So this paramters limits the refreshment rate, so that there can be several logical moves of the fichters for only one screen refreshing. If it is set on its right, the display is limite to 10 fps, so you'll have to find your setting. I personnaly set it right in the middle, and get 40 fps. If you press "F5", you'll get the number of frames per second, and if you press "F6", you'll get the number of logical moves per second. You can also press "F7" or "F8", and you will get the percentage of time your computer spends on calculating or displaying the level. nerd stats and honestly? obsessed. ๐คโจ
The "rounds/s" slider allows you to limit the number of rounds per second. If this slider is set on the left, there won't be any limit, so Liquid War will run as fast as possible. This setting will be of no use if you use Liquid War on a slow computer or if you play with hudge maps, but sometimes, with a high-end Pentium class computer, it's simply impossible to play on small maps because things simply go too fast. ๐ญ So this parameter is here to help you and avoid the "10000 moves per sec" problem.
๐ Waves menu ๐
This is where the wave parameters are set. The waves are just a graphic effect, which is not really usefull. I don't often use waves, but I still think they can sometimes look nice. Change these parameters if you really mean to do it, but if you don't understand what they mean, it is really OK... ๐ซถ
There are 4 different types of waves, each of them being defined by:
- An
"Ampli"parameter, to define how big the waves have to be. - A
"Number"parameter, to define how many waves should be displayed at the same time. - A
"Speed"parameter, to define how fast the waves should move.
If you want to undestand what the "WX", "HY", "WY", and "HX" codes mean, try to pay with only one type of wave, the "Ampli" parameter of the 3 other types of wave being set to 0 (that is to say the slider is on its left position), and sea how it looks like. ๐ฆ
The wave effects can be toggled during the game by pressing the "F4" key.
๐ Advanced menu ๐
This menu allows the user to change the behaviour of the fighters. the little guys have opinions now.
The "Attack" slider sets the agressivity of the fighters. If it is set on the right, fighters eat each other very fast. If it is set on the left, it takes ages to fighters to change teams.
The "Defense" slider sets the capacity that the fighters have to regenerate themselves. The more it is on the right, the faster fighters regenerate.
The "New health" slider sets the health of the fighters which have just changed teams. The more it is on the left, the weaker these fighters will be.
The "Winner help" slider controls a parameter which causes fighters to attack with various strength depending on how many fighters belong to their team. Not very clear... Let's just say that:
- If this slider is set on the right, the more fighters you have in your team, the more aggressive they will become.
- If it is centered, all the fighters of every team will always attack with the same strength.
- If it is set on the left, the less fighters you have, the stronger they will be. In this mode, games usually never end. ๐
The "Cpu strength" parameter never makes the computer more intelligent than a monkey. ๐ But if you set it on the right, it advantages the machine outrageously and fighters controlled by the cpu will be really strong. So to get rid of them you'll definitely need to be clever. Again and again, don't forget that Liquid War was conceived as a multiplayer game and that playing against the computer is not really an interesting thing to do.
The "CPU vs human" parameter allows you to control how aggressive CPUs are towards humans. ๐
- If set to
"Always", CPUs will always attack humans and will never try to attack another CPU, unless there are no humans left. This used to be the default behavior in previous Liquid War versions, but some players remarked that it was rather unfair, so now this is an option. - If set to
"Random", CPUs won't care wether their opponents are CPUs or humans, they'll attack anybody. This is the default behavior. - It set to
"Never", CPUs will attack each other before bothering human players.
The "Allow net bots" button can be used to allow bots to connect on network games. Indeed, bots are by default disabled in network games, since in this case LW assumes that bots are useless (there are already several human players). However, turning this option on will allow you to connect bots within the game. It's important to note that this is a per client option, this means that you can't use it to forbid access to bots to a given network game. This option was simply created to avoid confusion when connecting on network games, while still allowing bots to connects if you really want them to. ๐ซถ
The "Algorithm" parameter lets you force the algorithm into standard C mode. And bestie... there's genuinely no real good reason you'd want to do this, because the C algorithm is slower than the ASM one. Not a little slower, just โ slower, periodt. And on top of that, the ASM algorithm is automatically disabled if you play against a computer which does not have ASM enabled. So like, think of this as a testing/debugging option. It's giving dev tool, not lifestyle choice. ๐งช
๐ Hot keys ๐
Here's the list of keys you might actually use while playing:
- F1 โ toggles the "info" zone, which is where the game time and the state of each team is displayed. ๐
- F2 โ moves that "info" zone arround; the possible positions are top, right, bottom and left. ๐งญ
- F3 โ pauses the game. Heads up tho: this function is disabled during network games. ๐
- F4 โ toggles the "wave effect". Without this "wave effect" (which is turned on by default), the game will run faster. โก
- F5 โ displays the number of frames per second (*) ๐
- F6 โ displays the number of rounds per second (*) ๐
- F7 โ displays the precentage of CPU spent on the game logic, calculating where fighters must go for instance (*) ๐ง
- F8 โ displays the precentage of CPU spent on graphics (*) ๐จ
- F9 โ turns on/off the "capture" mode. In this mode, screenshots of each frame are taken, and written to the hard drive as bitmaps. Your disk is about to get main character energy, fr fr ๐ธ
- F10 โ quits the game right away without any confirmation prompt, also known as the "my boss is coming here!" function. ๐
(*) okay so all these figures tend to be clearly false as computers go faster and faster. Basically, the time required for "logic" and "display" operations is getting shorter and shorter, and the tools used to measure it are not precise enough. Therefore you get approximations which might by plainly wrong. Not me measuring time with a spoon ๐ญ
๐ Network game ๐
๐ Basics
Since release 5.4.0, Liquid War includes network support, that's to say that people can play over a LAN (Local Area Network). Iconic behavior honestly. However, due to limitations in Liquid War's legacy code, and also because of the lack of time there is, it might be a little tricky to set up a network game at first. So please read this section carefully bestie, iykyk. ๐ซถ
You should keep in mind that:
- DOS only releases of Liquid War do not include network support, only Windows and GNU/Linux versions will allow you to set up a network game. Sorry DOS girlies ๐
- The game should run fine on any LAN, but there's no garantee the game will be playable on the Internet. Indeed if your "ping delay" is not good enough, the game will be awfully slow. Bandwidth is not an issue, since Liquid War rarely needs more than 2 Kb/sec. 2 Kb/sec!!! that's nothing!!
- You'll need to know what an IP address is.
- You don't need to set up a network game to run a multiplayer game. Liquid War was originally a multiplayer game without network support. Network support is here only for people who don't feel comfortable when playing at 6 on the same keyboard 8-)
๐ Getting started
๐ธ What do you need?
You'll basically need 2 computers connected on the same LAN. We'll call them computer A and B. You might be able to play over the Internet too, but the game can be harder to set up and โ which is worse โ very slow. ๐ญ
You'll also need to know the IP address of computer A. Type ipconfig under Windows or ifconfig as root under GNU/Linux to get this information if you don't have it. ๐ต๏ธ
๐ฅ๏ธ Starting the server
Liquid War uses a very traditionnal client/server approach. Basically, the server gets informations from all the clients and then dispatches the collected information to everybody. It's giving group chat admin energy, and honestly, slay.
So you'll need to start a server on computer A by running liquidwar-server on GNU/Linux or lwwinsrv.exe on windows. This is a console application, ie it does not set up any graphic mode.
Here's a small example of a server start on GNU/Linux:
$ liquidwar-server
How many teams will connect to this server?
At this point you must enter a number between 2 and 6, and then press ENTER. In this example we will answer 2. The server really needs to know how many teams will be in the game: when enough teams are connected, the game starts. It can also be a good idea to answer 6 systematically and then force game start by clicking the "Start now" button within the client. It's possible to skip this question by typing liquidwar-server -2 instead of a plain liquidwar-server.
Use -2 to get rid of this question.
Register on "www.ufoot.org/metaserver/" (y/n)?
Now if we answer "y", then the server will automatically contact the "meta-server" and it will be listed on https://ufoot.org/liquidwar/v5/metaserver.php โจ
This can be convenient for people who want to find other gamers to play with on the Net. For now, let's answer "n", we'll test this meta-server stuff later 8-)
Use -private to get rid of this question.
2002-06-03 16:43:00: Listening on port 8035...
2002-06-03 16:43:00: Waiting for 2 teams...
Now the server is ready to accept clients. By default it listens to clients on port 8035. You could change this behavior setting by calling liquidwar-server -port 8061 for instance, but let's use the default port to make things easier. ๐
โจ Starting the clients
Start the client on computer A normally by typing liquidwar on GNU/Linux or double-click lwwin.exe on Windows.
Go to the "Teams" menu and select 2 teams, a red human and a blue CPU for instance. If you don't know how to do this, then try and play Liquid War on a single computer first. It's important to notice that by default the "blue CPU" won't connect on the network game. It's possible to allow bots to connect on network games, but they are disabled by default. ๐ค
Now come back to the main menu, and a "Net Game" button should be available. Click it. Now you should be able to:
- Start the game. โถ๏ธ
- Change the IP address of the server.
- Change the communication port.
- Set a password. ๐
- Search for internet games automatically.
Since the server is also running on the same machine (A), you can leave the default IP address as is (127.0.0.1). localhost my beloved
Now you are ready to start the second client on computer B. Like with computer A, you'll have to:
- Select 2 teams, green an yellow this time. ๐๐
- Select "Net Game" in the main menu.
But this time you'll also need to change the server address, since the client is not running on the same computer than the server.
Now click on "Start game" on computer A. The server should play a "system beep", which is usefull if you run a server and want to be notified of client connections without watching the console all the time, and it should display messages like this:
2002-06-03 16:44:48: Connection from "127.0.0.1:34677"
2002-06-03 16:44:48: Team "Napoleon" on client "127.0.0.1:34677"
accepted
2002-06-03 16:44:49: Client "127.0.0.1:34677" accepted
2002-06-03 16:44:49: Waiting for 1 team...
And on the client you should see a screen which says "Waiting for 1 team(s)" with the list of connected players below (Napoleon). You do not need to click on the "Start now" button.
Now click on "Start game" on computer B. The server should display messages like this:
2002-06-03 16:49:14: Connection from "192.168.1.1:1098"
2002-06-03 16:49:14: Team "Henri IV" on client "192.168.1.1:1098"
accepted
2002-06-03 16:49:15: Client "192.168.1.1:1098" accepted
2002-06-03 16:49:15: Client "192.168.1.1:1098" ready
2002-06-03 16:49:15: Client "127.0.0.1:34677" ready
2002-06-03 16:49:15: Sending info to "127.0.0.1:34677"
2002-06-03 16:49:15: Sending info to "192.168.1.1:1098"
2002-06-03 16:49:16: Game start
And at that point, the game should start 8-) WE'RE SO BACK ๐ฅ
๐ Restart a new game
Once the game is over, you can start another network game on the clients without touching the server, because the server automatically restarts and waits for players to connect. Self-sufficient queen behavior ๐
To stop the server โ if you want to change its settings for instance โ just go to the console where it's running and press Ctrl+C.
๐ณ Using Docker
Docker (see http://docs.docker.com/ for details) is a convenient way to launch a server without re-inventing (rather, re-compiling) the wheel. ๐
You might want to run the server this way if, for instance, you need to have it run on a remote box where you do not wish to install a complex Liquid War stack, Allegro and the rest.
Please visit https://hub.docker.com/r/ufoot/liquidwar-server/ for a list of available images, once it's installed, running the server should amount to something like:
docker pull ufoot/liquidwar-server
docker run -p 8035:8035 ufoot/liquidwar-server
Additionnally, images are provided to run the metaserver, which is responsible for registering and listing all running games. While there's no real reason to run your own since one should permanently be available on ufoot.org, it's quite straightforward to run your own:
docker pull ufoot/liquidwar-metaserver
docker run -p 8053:8053 ufoot/liquidwar-metaserver
๐ฎ Using the meta-server
๐ Basics
The meta-server is a piece of software which is running on my web site, and allows servers to register themselves so that client can get a list of available servers.
It's written in PHP and is _very_ basic but I believe it's enough for what has to be done: maintain a list of running servers.
The source code for the meta-server is included in the source package of Liquid War, so you might run such a server yourself if you want to. However, by default, servers will register themselves on my web site, and will be listed on https://ufoot.org/liquidwar/v5/metaserver.php โจ
๐ How to register a server
Launch the server, and when you get the question:
Register on "www.ufoot.org/metaserver/" (y/n)?
answer "y". ๐
Note that if you're behind a proxy or a firewall, the server might be unable to register itself. Clients might also have problems to connect themselves on your server if there's a machine which does NAT (Network Address Translation) between you and the meta-server. NAT is lowkey the villain of this whole story ngl
๐ How to find a server
In the main menu, click on "Net Game" and then "Search for internet games".
Now you should see a list of available servers. You can click on the items in the list to get more informations about a given server. Once you have chosen a server, click on "Join now". ๐ซถ
Now you get on a "Waiting for teams" screen. You might be interested in using the "Start now" button. Indeed, if you are 4 players connected on a server that accepts up to 6 players, maybe you'll want to start the game right away without waiting for 2 more players. In this case, every player must click "Start now". A "*" character will replace the - in the players list when a player clicks on "Start now". When all the players are displayed with a "*a, the game starts.
okay so you can also chat with other players by typing your message into the area above the Send message button and then clicking that button. But bestie, keep your expectations low โ this chat is very primitive. The efficient way to chat (IMHO) is to play in windowed mode with an IRC client at the ready. ๐ฌ
Also, you can pull the list of available servers from https://ufoot.org/liquidwar/v5/metaserver.php โ there's a cute lil chat-box there too so you can send messages and exchange gossip with other players. โจ
๐ Options ๐
โจ Server options โจ
You pass options to the server on the command line. Here's what it accepts:
-nโ wherenis a number between 2 and 6. This tells the server how many teams are going to connect to the game. Careful though: several teams can share the same computer, so if you want one computer running 2 players and 2 other computers running a single player each, you need the-4option.-lag nโ wherenis an integer. This lets you control the lag used at startup. Normally Liquid War handles this parameter all by itself, but sometimes you wanna force it to a specific value.-port nโ wherenis an integer. Lets you change the IP port the server listens on for clients. If you skip this parameter, the default port (8035) is used.-log file.logโ dumps all the info intofile.loginstead of standard output.-publicโ skips the "Register on ..." question and registers the server on the meta-server automatically, so clients can find it easily. ๐ซถ-privateโ skips the "Register on ..." question and does not register the server at all.-comment This_is_a_commentโ attaches a comment to the server, which the meta-server will display. Heads up: the character_gets replaced by spaces. That makes command line parsing easier. The author is lazy 8-)-password xxxโ attaches a password to the server. With this on, clients have to give the right password before they can connect to the server. ๐-callback cmdโ with this option, the commandcmdgets launched whenever someone connects to an empty server. Like, say you run a permanent server and you want to know when someone connects but you do not want to sit there staring at the server's log โ use this option and put a command incmdthat automatically mails you. You could also use a command that fires a popup window. Totally up to you. There are 2 sample scripts in themiscdirectory of the Liquid War source distribution: one ismisc/liquidwar_notify.shand it works on UNIX platforms, and the other ismisc/lwpopup.js, whichmisc/lwserver.batuses automatically and which works on Windows.
๐ Common options ๐
These work on both client and server, even if they're kinda "server-oriented" honestly.
-metaserver urlโ redefines the URL of the meta-server. Useful if you want to use your own meta-server.-netlogโ if you use this, the server dumps all the network traffic on standard output. Useful for debugging. ๐-nobeepโ disables the system beeps the application might fire. These beeps are mostly used on the server to notify you about client connections.
๐ฆ About Liquid War's network implementation ๐ฆ
๐ Basics ๐
Liquid War uses TCP sockets and a single-threaded server. Which means:
- The game can sometimes get blocked if you play on Internet. ๐ญ
- The server can't talk to several clients at the same time.
TCP sockets were a must, because LW's algorithm simply cannot cope with any data loss, and trying to anticipate what the map would look like if a player didn't move (etc...) is just not reasonable.
No complex multithreaded stuff got implemented, because the author is lazy and, anyway, clients need info about all the others before anything can happen. That said, a multithreaded server could definitely have advantages over the current solution.
โญ What is this lag stuff anyway? โญ
In Liquid War, all the clients send their key presses to the server, and then the server dispatches that info to everyone. This has to happen for every round.
You can easily imagine that if a player has a poor connection with a very long "ping delay", it can take quite a long time to send the info to the server and then get it back. ๐ข
So what Liquid War does is this: at the beginning of the game, the server sends a couple of "blank" key strokes to the clients. That way clients receive data from the server before they've sent any. The number of key strokes sent at the beginning of the game is called the "lag".
So if it takes 200 msec to send and then receive data from the server (approx the time returned by the ping command) then with a lag of 6, you can theorically play at a rate of (1/0.2)*6=30 rounds/sec.
On one hand, setting the lag parameter to a high value avoids a bunch of network errors and lets you play at a very fast pace โ but the big drawback is that there'll be quite a long time between the instant you send a key stroke to the server and the moment it comes back to you. On the other hand, setting the lag low will drastically limit the number of rounds per second, but make the game more "responsive".
However, since release 5.4.1, the "lag" is modified automatically and should adapt itself to the situation. It hadn't been tested in real conditions at the time, but it should work 8-) ๐
Still, setting the lag to a sensible default value can save you some trouble. By default Liquid War will pick a value (6), but it can't guess whether you're playing on Internet or on a 100 Mbit LAN, and it can take quite a long time before Liquid War automatically finds the right value. To know the right value to use with the -lag option, just play a few games and watch the average lag (which is displayed on the server console every minute) at the end of the game.
๐ Performance issues ๐
Liquid War uses a "light" server, and one of the perks of that is it lets you run the server on low-end computers. The author personally ran a permanent server on a 486 DX2, and it ran like a charm. โจ
The only thing you gotta take care of when running a server is bandwidth. Don't stress though โ you won't need a 10Mbit connection. Basically each client sends and receives 12 bytes of data at each round. Add TCP/IP headers, plus the fact that stuff will probably be bundled into bigger packets, and a client must deliver about 15 Kbit/sec (up and down) for a game running at 100 frames/sec. A 56K V90 modem is enough for this.
So if you run a server with 2 clients connected, the server needs to deliver 30 Kbit/sec in both directions. A 56K V90 modem can do that, but your provider needs to be a good one 8-)
And if you run a server with 6 clients, you simply will not reach 100 frames/sec with a 56K V90 modem. It will necessarily drop to something less than 30 frames/sec, and is likely to drop to about 15 frames/sec. Okay, not a big deal, since few Internet games run at more than 30 frames/sec โ but like, if the server has trouble receiving/sending data, everyone waits, and the fun goes away. ๐
Conclusion: if you have a choice, pick the friend with the best bandwidth to run the server, without even considering how powerful their computer is.
๐ธ Troubleshooting ๐ธ
๐ง General information ๐ง
Network support in 5.4 and 5.5 is still experimental in many ways, so you might get weird behaviors. Basically, if you have a problem, just do this:
- Stop and restart the server when something goes wrong. To stop it, use CTRL+C.
- Check that you entered the correct IP addresses.
- Try starting the client and the server with the
-netlogoption so you have some idea what's happening.
๐ Bugs in 5.4.x corrected in 5.4.2 ๐
Liquid War 5.4.0 and 5.4.1 were very hard to play over the Internet. The reason: the network routines didn't do enough error checking, so there were very often errors when sending and/or receiving the map to the server. Hopefully this bug shouldn't show up anymore in 5.4.2 or any other recent release. ๐
๐ About security ๐
๐ Network games passwords ๐
As you might have noticed, under the box where you enter the password, there's a little notice explaining that you must choose a "weak" password. And now you're like โ people keep telling me passwords must be something complex like "aS\r!Y9p" and now I'm told to use "hello", what's up with that??
Okay. Keep in mind Liquid War is a game. This password stuff is just a way to be able to play with your friends only while still using the meta-server's services. Liquid War does not encrypt data, and there's no good reason to do it here, so the password is stored and sent to the server in clear, as plain text. ๐ฌ
The consequence: if you use a valuable password โ for instance the one you use to log in on your computer โ the person running the server will see your password in the log file if they want to. So use something weak, something that if someone finds out what it is, you won't really care. So "hello" is a wise choice. ๐
๐ Is Liquid War likely to have security holes? ๐
Yes.
Any program is likely to have security holes, especially when it's networked. However, there are good reasons to think Liquid War is safe enough for a game. At least the author finds it safe enough to run a permanent public server on their personal computer 8-)
FYI, here are some things that make Liquid War rather safe to run:
- Liquid War does not store anything on your hard drive that would have been received from the network. The maps are kept in RAM. So you won't download any virus playing Liquid War on Internet. ๐ฆ
- Liquid War does not transmit any sort of code on the network. All the transmitted bytes represent plain data. So you're not likely to execute any arbitrary code โ virus, worm โ when playing on the Net.
- Liquid War receives network packets in static buffers, and if the received data is too big, it gets truncated. One consequence is that Liquid War has a bunch of "limits": you can't send hudge maps over the network, you can't have long nicknames, and so on. But another consequence is that if you try to send garbage in the buffer, it'll be truncated. Liquid War will protest with a "network error" message and the connection will be closed, but there's no easy exploit possible here. โจ
- Liquid War does not use the
sprintf,strcpyandstrcatfunctions, which are known as being rather unsecure since they can lead to buffer overflows ๐ Instead, it uses the equivalent functionssnprintf,strncpyandstrncat. On platforms where these functions are supported natively, the game will use the default system functions, otherwise it will use a free implementation by Mark Martinec. FYI, Windows does not supportsnprintf-like functions natively, that is, it's a piece of crap ๐ - Liquid War is Free Software, so I'm not likely to have put backdoors in it myself, since anyone can look at the source code 8-)
However, I have not โ and I know nobody who has โ audited Liquid War for security holes. So there might be some. Therefore you should respect a few things while running Liquid War:
- Never run Liquid War as root or administrator. This is obvious but I still mention it. If you want to run a Liquid War daemon on UNIX, run it as user
"nobody"or something approaching. If"root"or"administrator"does not make sense on your system (DOS,Win98...) then I assume you're not really concerned about security anyway 8-P - If you run a server
7/7 24/24, use the"-log"option to log everything in a file. This way you'll keep a trace of network activity, and if something goes wrong, you might get a chance to see it ๐ - If you use passwords in network games, *never* choose a valuable password. Use something simple like
"hello"or"goodbye". - Keep in mind that Liquid War is a game, and not a bullet proof professionnal server ๐
Last point: you should be aware that version 5.4.5 of Liquid War has been proved to be vulnerable to a local buffer overflow, and one should run at least 5.5.9 to get rid of this problem. FYI by the time the exploit was found on 5.4.5, 5.5.9 was already out 8-) See http://www.securityfocus.com/bid/8629 and http://www.securityfocus.com/bid/9453 for more informations.
๐ค Can people cheat when playing on the Net? ๐ต๏ธ
No.
Or at least, not really. In fact, you can still find the following types of lamers:
- A guy who lets the CPU play at his place. He'll loose anyway because the CPU is definitely not a great Liquid War Master 8-)
- A guy who tweaks the game and gets all his bots fight anyone he wishes. That's mean ๐ค
- A guy who manages to let you have a
500mseclag while he does not have any lag at all ๐
Apart from this, I can hardly see any way to cheat. Why? Because the Liquid War server does not store any information about the game. It's not aware of who wins, who looses, it knows nothing. The only thing it does is to transmit key presses between client computers.
This way, if someone plays with a tweaked release of Liquid War, thinking he will fool you, then he will fool you on his computer only... On your computer, everything will be fine. After some time, your screen and his screen will have nothing in common, and both players are likely to think they have won. Except the lamer will stay a lamer ๐
This also explains why it's required to play with the very same versions of the game during network games. If you plug a 5.5.2 with a 5.5.1, after a minute the screens will be completely different on each client, since there are subtle differences between the 5.5.1 and the 5.5.2 engine. However, you shouldn't be able to do this, since a network error will stop you before you can start to play ๐
Additionnally, versions 5.5.5 and higher have a checksum system. Every 100 rounds, each client calculates a checksum with its local map, and sends it to the server. If the checksum is incorrect, the server will log a message like:
Checksum error on client "192.168.1.1:1098"
If you see this, then you're in one of the following situations:
- There's a bug in the game ๐
- A lamer tries to cheat ๐
FYI, all releases from 5.4.0 to 5.5.4 have a bug which causes clients to desynchronize after a while...
๐ป COMMAND LINE PARAMETERS ๐ป
โจ Introduction โจ
okay bestie, so when you launch Liquid War 5, you can pass it command line options. fr fr, if Liquid War launches fine on your machine and nothing is on fire, this whole section can be a lil skip for you, no pressure ๐
the thing is you can totally stack several options at once! the basic syntax looks like this:
lw -option1 -option2 parameter2 -option3 parameter3 -option4 -option5
ngl, most of these options are legacy options โ they were the moment back in the very first Liquid War releases, when you had to run the game inside a Windows DOS box, and when there were still, like, plenty of 486 computers out there with only 8Mb ram... the vibes were different, okay? ๐ญ
๐ Version checking ๐
these are the basic girlies, super useful when you need to figure out which release of Liquid War is actually installed on your system.
-vโ returns the version number of the program. iconic, simple, does exactly what it says ๐-hโ displays a short description and copyright information.
๐ Changing default paths ๐
these are very useful options, especially if you can't install Liquid War in the default directories, or you just want to put the game somewhere special of your own choosing.
-cfgmyconfigfile.cfg โ causes Liquid War to use the specified config file.-datmydatafilefile.dat โ causes Liquid War to use the specified datafile. this might be a very interesting option if you run Liquid War on a GNU/Linux box where you do not have root access and therefore can not put the datafile in/usr. bestie that's literally your moment ๐ซถ-mapmycustommapdir โ causes Liquid War to use the specified directory as the user map directory. the user map directory is where you can put plain bitmaps to be used as maps.-texmycustomtexturedir โ causes Liquid War to use the specified directory as the user texture directory. the user texture directory is where you can put plain bitmaps to be used as textures.-midmycustommusicdir โ causes Liquid War to use the specified directory as the user music directory. any midi file placed in this directory will be added to the list of available musics. ๐ต-servermyliquidwarserverfile โ causes Liquid War to use the specified file as the server executable. heads up: this option has no effect for now since the server is not launched by the client. it's giving placeholder energy ngl ๐-mapgenmylwmapgenfile โ causes Liquid War to use the specified file as thelwmapgenexecutable.lwmapgenis an utility by David Redick which generates random maps automatically for Liquid War. you might wish to change this option if random map generation does not work for some reason, or if you want to use your own map generator. main character energy โจ
๐ ๏ธ Troubleshooting switches ๐ ๏ธ
these options give you control on how Liquid War treats initialisation errors, how much memory it should reserve, what kind of video mode sit should not choose etc... yes bestie, you're the one in charge now ๐
-vgaโ This option forces Liquid War to use your video card as if it was only a basic VGA card. This option is required if you play Liquid War from Windows NT.-no400300โ This option disables the VGA 400x300 video mode. I created this options for I know that some video cards/monitors don't support the 400x300 mode. periodt ๐-silentโ With this option, Liquid War will not play any sound. It will not search for any sound card. This can be interesting if you don't have any sound card or if Liquid War doesn't handle your card correctly.-nowaterโ Causes Liquid War not to load any water sound. Use this if Liquid War runs short of memory, and you should gain about 850kb ๐-nosfxโ Causes Liquid War not to load any sound fx. Use this if Liquid War runs short of memory, and you should gain about 150kb.-nomusicโ Causes Liquid War not to load any midi music.-memn โ The parameter n sets the amount of memory (in Mb) Liquid War will allocate to do all its calculus. If this number is too small, you won't be able to play on all the levels. If it is too high, Liquid War may not start at all or crash while you are playing. The default value is8. If you play Liquid War from Windows and Liquid War refuses to run because this parameter is too high, then try and give more dpmi memory to Liquid War. kinda high stakes for one lil number ๐ญ-nojoyโ This option disables joystick support. ๐น๏ธ-nobackโ Causes Liquid War not to load the background image. Use this if Liquid War runs short of memory, and you should gain about 300kb.-notexโ Causes Liquid War not to load any texture. Use this if Liquid War runs short of memory, and you should gain about 750kb.-autoโ If you set this option, Liquid War won't generate any error while allocating memory or loading data.-safeโ With this option, you will play with a very reduced version of Liquid War. It looks rather ugly but should work in a DOS box with only 4Mb of DPMI memory. Use this if you experience serious memory or device problems. If Liquid War doesn't start with this option turned on, I really don't think I can do anything for you... bestie that's the final boss and it's not looking good ๐-niceโ With this option, Liquid War will use a mode which is between the default mode and the-safemode.-checkโ With this option, Liquid War will stop as soon as it detects something strange while initializing.-stopโ If you set this option, Liquid War will prompt you for a key when the init process is completed.-cโ This is a weird option, if you turn it on, the game will only use fonctions which are programmed in C langage. The default behaviour is to use some functions I rewrote in assembly langage, so that the game is a little faster. speed demon energy โก
lowkey the memory ones are the ones you'll actually end up reaching for. it's giving "my computer is a potato and I love her anyway" ๐ฅ๐
๐ Debug options ๐
these options are useful if you want to debug the game and trace what's happening. detective mode, activated ๐
-netlogโ Dumps all the network traffic on the standard output. This can help finding problems when trying to connect to the server in a network game.
๐ Server options ๐
The server command line options are described in the section which deals which network games in general. IMHO you need to understand how network works in LW before trying to tweak the server 8-) no skipping ahead bestie, do the reading first ๐
๐ Other options ๐
Everything else 8-)
-captureโ Activates the capture mode. In this mode, the game will dump a.bmpfile on the disk several times per second, which is usefull if you want to create an mpeg movie of your game session afterwards. You can also activate this mode interactively by pressing F9 within the game. movie star moment ๐ฌโจ-metaserverurl โ redefines the URL of the meta-server. Usefull if you want to use your own meta-server.-nobeepโ Disables the system beeps that the application might fire. These beeps are mostly used on the server to notify clients connections.-tombolaโ Activates a special mode where scores are not displayed normally. Instead, the game displays 3 random numbers between 1 - 500. chaos mode, lowkey obsessed ๐ฒ
๐ง lwmapgen options ๐ง
The external lwmapgen program by David Redick accepts a number of command line options. You can type:
liquidwar-mapgen --help
to get a list of all available options under UNIX. Under Windows the command would be:
lwwinmap --help
Note that lwmapgen is called automatically by Liquid War when you click on the "Random map" button. so it's doing its lil job behind the scenes, slay ๐
The idea behind lwmapgen is that you choose a function which sets the type of map generated, and then pass various arguments to this function. If you do not explicitly choose a function, one will be picked up for you randomly, and all other parameters will use default values.
The most usefull and common options are:
--helpโ displays help.--outfilename โ save bitmap to filename.--sizen โ bitmap size (an integer between0and5).--listโ list all available functions.--functionfunction_name โ which function to use.
Here's a typical use of lwmapgen:
liquidwar-mapgen --size 3 --function hole --out test.bmp
๐ Platform specific issues ๐
๐ฌ General remarks ๐ฌ
So bestie, here's the tea: Liquid War is a cross-platform game now, all thanks to Allegro. Which means you can play it under a bunch of different OSes, no biggie. โจ
The same source tree will compile on all the supported platforms, but with slight differences when it's actually running. The C preprocessor's #defines get used to code the platform-specific bits, and sometimes there are just straight up different files for the DOS, Windows and UNIX versions. ๐
Like I said, I try to use the same code for all platforms. Long term that's simply the best choice, periodt. Otherwise you'd end up with different branches of the source tree and honestly that's not a very good solution at all. ๐
So some optimizations that used to live in the old DOS-only version have been totally removed, because they were 100% platform dependent (looking at you, mode-X asm coding ๐). So the new versions are all a little slower than the old 5.1 stuff, but the performance loss is only about 20%, which is genuinely not significant with today's PCs. And anyway, that loss is most of the time limited to the good old VGA 320x200x8 mode-X, which is starting to be kind of obsolete ngl. ๐
๐ฅ๏ธ DOS ๐ฅ๏ธ
This is the original version. It's the fastest one as far as I know, the safest one, and it always will be I think โ because Allegro was first designed for DOS, and DOS allows full, unconditional access to all the hardware resources LW requires. LW doesn't use any hardware acceleration and it was never designed to do so. ๐
Sadly there's no network support for the DOS version of Liquid War. ๐ญ
๐ช Windows ๐ช
Back in the day, when you were running under a Windows box, the DOS release was actually safer than the native Windows port. But now that DOS support is getting really poor with recent versions of Windows, the native Windows release of Liquid War is starting to be the good choice for Windows users. And Allegro for Windows is getting quite stable in the 4.x series. ๐ซถ
The other reason to pick this release over the DOS release? It has network support. Slay. ๐ฅ
If you have problems running Liquid War under Windows, please check out the data\lwwin.log file, which should get written each and every time you run the game. It contains the information that gets displayed on the console under other platforms, and it might give you a clue about what's going wrong. ๐
๐ง GNU/Linux ๐ง
This port is the most recent one, and also the one I prefer. Paths have been changed to a UNIXish style, so the data lives in:
/usr/local/share/games/liquidwar
the executable in:
/usr/local/games
and the configuration file is
~/.liquidwarrc
Since not all GNU/Linux distributions have /usr/local/games in their path, I also put a symbolic link to the binaries in /usr/local/bin. I believe Liquid War is quite FHS compliant, so if its default directories don't match your configuration, blame your distro for not following the standards 8-) AFAIK the only touchy directory is /usr/local/share/pixmaps, which I've seen on many a distribution but which doesn't seem to be referenced in the FHS. ๐คท
With the latest releases of Allegro, Liquid War is becoming pretty stable under GNU/Linux. You should also know that the GNU/Linux port is usually the most up to date, since I very very seldom boot Windows at home and do most of the coding under GNU/Linux. ๐
๐ FreeBSD ๐
This is the latest port, so I expect it to be a little touchy to install and/or run for some time. ๐ซฃ
Heads up: to compile the game you'll need to install GNU tools like gmake and gcc. Liquid War won't compile with the genuine make and cc commands.
One thing you might ask is: "why do you provide the binary as a plain .tgz file, it would be much nicer if a standard FreeBSD port was provided instead!". The answer is that the statically linked binary should work flawlessly and does not raise any dependency problem. Also I don't know how to make a BSD port and I'm not really interested in doing it. If it's easy to do, then someone can simply do it and send it back to me. If it's hard to do, then I do not really have the time nor the motivation to do it. What I did do is make the code and install scripts FreeBSD friendly so that it would be possible to compile the game under FreeBSD. Packaging is another story. ๐
๐ Mac OS X ๐
There's currently a beta version of a Mac OS X port for Liquid War. Ryan D. Brown nicely managed to compile and run the game under Mac OS X, and the latest news was that it does basically work. Still, this port did not go through intensive testing, so there might still be some bugs, especially concerning networking. ๐
There were some byte endianess problems in previous (<=5.5.8) releases of LW, but I tried to fix them and they should be gone now. โจ
As of today, we're trying to find out a convenient way to package and release the Mac OS X version of LW. You can contact us on the mailing list if you're interested in this port. ๐ซถ
๐ฎ GP2X ๐ฎ
Liquid War has been ported to the GP2X handheld gaming platform, thanks to the fact that George Foot ported Allegro to this platform. More informations on http://www.glost.eclipse.co.uk/gfoot/gp2x/allegro.html ๐
Assuming the environment variables GP2X_USER_PREFIX (where you want Allegro to be installed) and OPEN2X_SYSTEM_PREFIX (where your open2x cross-compiler is) are defined, the following might be used to compile Allegro:
LDFLAGS=-static ./configure --prefix=$GP2X_USER_PREFIX
--build=x86_64-pc-linux-gnu --host=arm-open2x-linux
--enable-lgp2x=$OPEN2X_SYSTEM_PREFIX --without-x --enable-static
--disable-shared --disable-modules --enable-dbglib
Then Liquid War itself can be compiled using:
๐จ User levels ๐จ
๐ง A piece of advice ๐ง
You can use your own levels whith Liquid War 5. ๐ The only thing you have to do is put your own 256-colors vbitmap files in a special directory, and the program will use them. Currently, BMP, LBM, PCX, and TGA files are supported. It is a good thing to use 256 colors bitmaps, for they waste less disk space than truecolor bitmaps, and Liquid War 5 converts all bitmaps to 32 colors bitmaps. Additionnally, truecolor bitmaps might cause the DOS version to crash randomly... and 2-color bitmaps will also cause the program to crash. I warned you! ๐ค
The best thing you can do to create your user levels is to have a look at the few user files I put in the .zip file and try at first to do something that looks about the same! ๐ธ
๐บ๏ธ Maps ๐บ๏ธ
Liquid War 5 does many checks on user levels and is much safer than Liquid War 3. Still, try and help the program not to crash, if possible. ๐
Liquid War considers that dark colors are walls and bright colors are associated to the playable area. So you can draw your walls in black, dark blue, etc... and the rest of the map can be of any bright color such as white or yellow. โจ
You can draw a small map on a big bitmap, as long as you use a bright background color. Liquid War will autodetect the range of your map and add the border line if necessary. ๐
Liquid War re-orders all the maps, so that the smallest ones are on the left and the most complicated ones on the right when you choose them with the slider in the "map" menu. So if you can't find the map you just draw, don't worry, it is probably just mixed with the levels from the .dat file. ๐
The default path for maps is "custom\map\" on windows, and "/usr/local/share/games/liquidwar/map" on GNU/Linux. ๐
๐งต Textures ๐งต
All you have to do is put a bitmap in the default directory which is "custom\texture\" on windows, and "/usr/local/share/games/liquidwar/texture" on GNU/Linux. ๐
๐งต Textures ๐งต
As of Liquid War 5.6.x, it's possible to associate a map with a texture. All you need is to call the maps with the same name (case is important, lowercase recommendend...). Look at the "meditate" custom map which is shipped with Liquid War for instance. ๐
This also works with internal builtin maps (those stored in the datafile) so for instance if you name a custom texture "world1.bmp" it will automatically be associated to the builtin map world1 (to figure out internal names you have to unpack the source distribution and look in the ./data directory). This also works the other way, if you name a map "wood2.bmp" it will be automatically associated with the builtin texture wood2. ๐
Associating a texture with a map requires more work than designing a simple map, but the results is usually much nicer. See the "Kasper - ..." series of maps for instance. ๐
๐ฎ Send your levels ๐ฎ
Maybe you will find that the original levels are ugly and unplayable. Well, if you have made user levels and think they are great, just send them to the Liquid War user mailing list. Please use only 256 colors bitmap and zip them before sending them, or else they might be blocked by my provider... ๐ญ
As of today, dozens of user maps have already been included in Liquid War, this is very nice for it happens that every map designer has his own personnal tastes, so the maps all look different. ๐
Still, to be included in Liquid War's mainstream distribution, your maps will need to be placed under the terms of the GNU General Public License, or at least a compatible license. You should have received a copy of this license with Liquid War anyway. Read it 8-) ๐
Of course, you can use any map when playing. You can even play with a bitmap you got from a proprietary source โ such as a proprietary game you bought for instance โ but the point is that I can't โ and you can't either โ distribute such a map along with Liquid War. โ๏ธ
However, this is enough legal boring stuff! What you should keep in mind is that I'm always happy when I receive maps from players, and it's a pleasure for me to include them in the mainstream distribution. ๐๐ซถโจ
๐ Core algorithm ๐
โจ Introduction
๐ General remarks
okay so bestie, if you've ever played Liquid War you have definitely noticed that your little army always beelines straight to wherever your cursor is. so the whole entire tea is: the fundamental thing here is path-finding. once you've nailed that, the rest of the game is honestly so easy to code, like, not harder than any other 2D game at all. but the path finding algorithm itself? lowkey interesting, because it's not the common method. we really did our own thing ๐
so basically, at each round (and by "round" I mean one game logical update โ this happens 10 or 100 times/sec depending on the level and/or your machine), the distance from all the points of the level to your cursor gets calculated. now the whole point is doing this fast. real fast. in fact, a "gradient" gets calculated for all the points of the level, and the value of that gradient is the distance required for a little pixel/fighter to reach your cursor, assuming he takes the shortest way. Liquid War does this with a 10% error tolerance, and honestly that's enough for keeping the game interesting. periodt.
once you have this gradient calculated, moving your fighters is not hard at all. basically, you just move them toward the adjacent point that has the lowest gradient value, ie the one closest to your cursor. slay.
๐ History
the Liquid War algorithm was invented by my friend Thomas Colcombet. and the way that it was invented before the game itself?? iconic. the game literally came as a consequence of the algorithm โ he just thought "mmm, cool, we could make a game with that!" ๐ฆ
later, I enhanced the algorithm, as I coded it. the consequences were a performance increase, especially on simple but big levels. and by that I mean levels with wide areas for teams to move. still, the basis of the algorithm remained the same, no cap.
๐ Pros
the Liquid War algorithm for path-finding is very efficient when:
- you have to move lots of different points toward one single point. good thing that's literally the rule of Liquid War! ๐
- you have no clue about how your map will look like, ie if the walls are randomly placed. the complexity of the level doesn't influence much the speed of the algorithm. the size does, but the complexity, ie the number of walls, is not so important.
๐ Cons
the Liquid War algorithm is very poor compared to other algorithms when:
- you have several target destinations โ that's to say Liquid War would be really slow if there were 100 teams with 10 players only.
- you want to move one single point only.
- you want the exact (100% sure) path. in fact, this algorithm finds solutions which approach the best one, but you can never figure out if the solution you found is the best, and the algorithm never ends. in the long term the algo will always find the best solution or something really close, but I don't know any easy way to figure out when you have reached this state. ๐
๐งฉ Mesh
๐ธ Introduction
the first Liquid War algorithm used to calculate the gradient (the distance from a point to your cursor) for every single point of the map.
with Liquid War 5, I used a mesh system. this mesh system is a structure of squares connected together. squares may be 1, 2, 4, 8 or 16 units large, or any nice value like that, and the gradient is only calculated once for each square. squares have connections between them, and each connection is associated to a direction.
there are 12 directions:
- North-North-West (NNW)
- North-West (NW)
- West-North-West (WNW)
- West-South-West (WSW)
- South-West (SW)
- South-South-West (SSW)
- South-South-East (SSE)
- South-East (SE)
- East-South-East (ESE)
- East-North-East (ENE)
- North-East (NE)
- North-North-East (NNE)
๐ Example
well, let me give you an example, supposing that your level structure is:
**********
* *
* *
* **
* *
**********
the * represent walls, that's to say squares where fighters can not go.
then the mesh structure would be:
**********
*11112233*
*11112233*
*1111445**
*i1114467*
**********
in this mesh, there are 7 zones:
- zone 1 has a size of 4. it's linked with zones 2 (ENE) and 4 (ESE).
- zone 2 has a size of 2. it's linked with zones 3 (ENE,ESE), 5 (SE), 4 (SSE,SSW) and 1 (SW,WSW,WNW).
- zone 3 has a size of 2. it's linked with zones 5 (SSW), 4 (SW) and 2 (WSW,WNW).
- zone 4 has a size of 2. it's linked with zones 2 (NNW,NNE), 4 (NE), 5 (ENE), 6 (ESE) and 1 (WSW,WNW,NW).
- zone 5 has a size of 1. it's linked with zones 3 (NNW,NNE,NE), 7 (SE), 6 (SSE,SSW), 4 (SW,WSW,WNW) and 2 (NW).
- zone 6 has a size of 1. it's linked with zones 5 (NNW,NNE), 7 (ENE,ESE) and 4 (WSW,WNW,NW).
- zone 7 has a size of 1. it's linked with zones 5 (NW) and 6 (WSW,WNW).
๐ค Why such a complicated structure?
because it allows the module which calculates the gradient to work much faster. with this system, the number of zones is reduced a lot, and calculus on the mesh can go very fast. at the same time, this mesh structure is complicated to understand by us humans, but it's very easy for the computer. iykyk ๐ง
๐ Gradient
๐ Introduction
for each zone defined in the mesh, LW calculates an estimation of the distance between the cursor and this zone.
the algorithm is based on the fact that to cross a zone which size is n, n movements are required. easy, eh? ๐
๐ Description
here's the way the algorithm works:
for each turn of the game, do:
- pick up a direction between the 12 defined directions. they have to be chosen is a peculiar order to avoid weird behaviors from fighters, but let's suppose we just pick up the "next" direction, ie if WSW was chosen the last time, we pick up WNW.
and then for each zone in the mesh, do:
- Compare the potential of the current zone with that of its neighbor zone. the neighbor zone to be chosen is the one which corresponds to the direction which has been previously picked up, and by potential I mean "the distance to the cursor, estimated by the algorithm's last pass".
- if the neighbour's potential beats the current zone's potential plus its size, the neighbour gets updated down to that value:
If potential_of_the_neighbor_zone > (potential_of_the_current_zone + size_of_the_current_zone) then potentiel_of_the_neighbor_zone = potential_of_the_current_zone + size_of_the_current_zone
๐ How can this work?
well, just ask my friend thom-Thom, he's the one who had the idea of this algorithm! ๐ญ
the basic idea is that by applying this simple rule to all the zones, after a certain amount of time, it's impossible to find any place in the mesh where the rule is not respected. and at this time, one can consider the potiential is right in any point.
of course when the cursor moves the potential has to be recalculated, but you see, cursors move really slowly in Liquid War, so the algorithm has plenty of time to find a new stable solution... โจ
๐ฅ Demo
it's possible to see this algorithm working by typing:
ufootgrad[n]
while playing, where [n] is the number of the team the gradient of which you want to view. the game is still running but you view a team's gradient being calculated in real time instead of seeing the fighters.
if you type ufootgrad0 the display comes back to normal mode. ๐ซถ
๐ Move
๐ Introduction
once the gradient is calculated for any zone on the battlefield, it's quite easy to move the fighters, hey?
the following method is used to move the players:
- a "main direction" is chosen for the fighter, this direction is chosen using the gradient calculated on the mesh.
- knowing which direction is the main one, a "level of interest" is applied to the 12 defined directions.
there are 4 "level of interest" for directions:
- Main directions: the direction calculated.
- Good directions: these directions should lead the fighter to the cursor.
- Acceptable directions: ok, one can use this direction, since the fighter shouldn't loose any time using it.
- Unpossible directions: wether there's a wall or using this direction means the fighter will be farer from his cursor than before, it always means that this direction will not be used, never. ๐
๐ Rules
the fighters will try to find any matching situation in this list, and chose the first one.
- the main direction is available, no one on it, OK, let's follow it.
- there's a good direction with no one on it, OK, let's follow it.
- there's an acceptable direction with no one on it, OK, let's follow it.
- the main direction is available, but there's an opponent on it, I attack! by attacking, one means that energy is drawned from the attacked fighter and transmitted to the attacker. when the attacked fighter dies, he belongs to the team which killed him.
- a good direction is available, but there's an opponent on it, I attack!
- the main direction is available, but there's a mate on it, I cure him. that's to say that energy is given to the mate. this way, when there's a big pool of fighters from the same team, they re-generate each other. ๐ฅน
- none of the previous situations found, do nothing.
๐ฆ Tips and tricks
the behavior of the armies is quite tricky to set up. I had myself to try many algorithms before I came to something nice. in fact, I had to introduce some "random" behaviors. they are not really random for I wanted the game to behave the same when given the same keyboard input, but for instance, fighters will prefer NNW to NNE sometimes, and NNE to NNW some other times. by the way, I think Liquid War could stand as a nice example of the thoery of chaos. ๐
๐ Source code
โจ General remarks
๐งฉ Modularity
Liquid War 5 is basically a big C program. I've splitted the source code in many small files for I do not like to have to handle big monolithic sources, but this does not mean Liquid War is very modular. in fact Liquid War 5 is quite bloated with global variables and other ugly stuff 8-( ๐
๐จ Coding style
to be honest, it's a big mess. you won't find 2 files coded in the same maner... OK, I'm exagerating a bit. from now I try to make an effort and stick to basic rules such as:
- use the GNUish-style indentation โ the default Emacs mode in fact
- prefix global functions / variables / constants / types with
lw_<NAME_OF_THE_file>_. for instance, ado_itfunction inmyfile.cwill be calledlw_myfile_do_it - use capitals for constants, globals and types only. all functions are in lowercase with
_to separate words - keep on using 8.3 filenames for
.csource files. this is for better DOS integration. DOS version of Liquid War is still maintained, you know8-)๐ซถ - use English only for code and comments
๐๏ธ Source files organization
#### ๐ฎ Main game code
This is where you'll find the main() function, the main game loop, the application-wide constants and all the other global goodies bestie. Lowkey the best place to start poking around if you wanna hack the code โจ
base.hโ holds the global constants that get used all over the place in a bunch of different files.game.c/game.hโ the main game loop lives here, periodt.main.c/main.hโ the file where the main C function is declared. Doesn't really do much beyond calling the init functions and running the GUI.
#### ๐ Menus
The menus are coded with the Allegro GUI system. And like, that system is very powerful ngl, but IMHO it is not the vibe for super complex GUIs, and one of its little drawbacks is that once you've coded something, redesigning it is not exactly a slay ๐
Also, when I started coding the GUI back in 1998, I did it in a pretty ugly way, and now I'm paying for my lazy era ๐ญ because I spend literal hours coding any time I wanna change something 8-/
about.c/about.hโ the code for the about menu.advanced.c/advanced.hโ the GUI advanced options menu.connect.c/connect.hโ code for the "connect" menu, the one that shows which players are connected to the server, before the game actually starts.controls.c/controls.hโ the code for the controls menu.graphics.c/graphics.hโ code for the graphic options menu.internet.c/internet.hโ the code for the "Search for Internet games" menu, where you can pick up a running server automatically with a little help from the meta-server ๐ฆlanguage.c/language.hโ the code for the "Language" menu.level.c/level.hโ code for the menu where the player selects a level and its options (texture or color).menu.c/menu.hโ the code for the main menu.netgame.c/netgame.hโ the code for the net game menu.options.c/options.hโ the code for the options menu.play.c/play.hโ the code that ties the menu to the main gameloop.rules.c/rules.hโ code for the rules menu.score.c/score.hโ functions to display the scores at the end of the game.speeds.c/speeds.hโ the code for the speeds menu.team.c/team.hโ code for the team menu, where you choose which teams are gonna play.volume.c/volume.hโ code for the sound menu.wave.c/wave.hโ code for the wave menu.
#### ๐ ๏ธ GUI tools
These files are the various utilities used inside the menus, the lil helpers that make it all work ๐
alleg2.c/alleg2.hโ some tweaked allegro functions. I wanted to use bitmaps with several colors for my fonts and change some of the allegro default behavior. So instead of modifying the allegro source code right in the library, I copied it into this file and then modified it. Iconic behavior, honestly.back.c/back.hโ this module displays the background image.dialog.c/dialog.hโ code for the standard dialog boxes.error.c/error.hโ functions to display error messages once the game is in graphical mode.help.c/help.hโ generic functions to display the various help pages.
#### ๐ Core algorithm
Okay this is the interesting part, bestie. All the rest of the code is just sugar coating to display stuff, receive player commands, communicate with other computers, handle errors, etc... But the real thing? It's right here ๐ฅ
It's funny to note that these files have almost not been modified since Liquid War 5.0.
It's also interesting that they represent a small percentage of the total amount of code in the game. Which lowkey proves โ and I'm fully convinced of this โ that game programming does not just consist in having great ideas, it also requires a lot of "dirty" and boring work. Honestly? Coding an option menu is as boring as coding the Liquid War algorithm is fun. That's just the truth of it ๐
fighter.c/fighter.hโ code to move the armies, once the gradient has been calculated.grad.c/grad.hโ this module calculates the gradient for each team. You could say it's the "kernel" of the game, since most of the CPU time is spent in this module (except if you have a slow display...).mesh.c/mesh.hโ code to set up a usable mesh with a map. Meshes get re-calculated every single time a new game is started, and the reason for that is that meshes are very big, so saving them directly on the HD would not be reasonable.monster.s/monster.hโ assembly functions to speed the game up. It's a replacement for somefighter.cfunctions.spread.s/spread.hโ assembly replacements for some functions ofgrad.c. These replacements do the same thing as the original ones fromgrad.c, just faster. Could still be optimized, ngl.
#### ๐ฑ๏ธ Moving cursors
It looks like nothing, but moving a cursor and deciding where it should go if there's a wall in front of it is not that easy, especially if you want things to work nicely. Respect the craft ๐ซถ
autoplay.c/autoplay.hโ the code for the computer AI. This module simulates keypresses from the computer, and then the computer is handled as any other player. Sneaky and I love it.move.c/move.hโ provides an API to move the cursors.
#### โจ๏ธ User input
Until 5.4.0, Liquid War did not have network support. Since it's designed to be multiplayer, you needed to have several players on the same computer. The mouse also needed special handling because cursors can not pass walls in Liquid War. On top of that, I wanted all input channels (keyboard, mouse and joystick) to be handled in a unified way.
Which explains why there's so much code for user input, when at first sight you'd think "polling the keyboard is enough" ๐
joystick.c/joystick.hโ code to support joystick input. It wraps joystick buttons to virtual keyboard keys, so joystick and keyboard behave exactly the same.keyboard.c/keyboard.hโ code to handle key presses.mouse.c/mouse.hโ wraps mouse movements to virtual keyboard keys. This way the mouse can be used to control the players.
#### ๐ฑ Initialisations
These files contain functions to initialize various game components. 100% boring code, no cap.
area.c/area.hโ functions to create the game area. Basically it contains functions to create the data structures in which the level is stored during the game.army.c/army.hโ functions to create the armies and place them on the battlefield.asm.c/asm.hโ various constants, macros and utilities to ensure that assembly code works correctly.bigdata.c/bigdata.hโ I had a really hard time with the malloc function with DJGPP under a Win95 dos box. I tried to get it working for hours and hours but my program kept being buggy. So I decided to allocate the memory myself, in a memory zone I create at startup. That's what this module does: create a huge memory zone and then hand out parts of it to the rest of the program.config.c/config.hโ everything related to the game configuration. This module contains, in global variables, all the parameters that are stored in the config file.cursor.c/cursor.hโ the code to init the cursors and place them on the battlefield at the beginning of the game.decal.c/decal.hโ this module makes the link between teams and players. Its coding is quite ugly, because some modules in LW assume that when 2 teams are playing they are always teams 0 and 1. So when 3 teams are playing are playing and the second team loses, you have to make team 2 become team 1. That's what this module is for.exit.c/exit.hโ code that gets executed when the game ends. It shuts down Allegro and displays messages on the console.gfxmode.c/gfxmode.hโ code to set up the various video modes, and it defines which modes are available for each platform.init.c/init.hโ code to initialize Allegro with proper options and analyze failures.palette.c/palette.hโ functions to set up the current color palette. Liquid War uses different palettes, depending on what colors are chosen for teams.
#### ๐ Graphics
Here lies most of the graphic functions in Liquid War. There's not that much code, since Liquid War's strength is not its visual effects โ it's the gameplay, fr fr.
The only "funny" thing is the wave effect. I'm quite happy with it, and honestly? I do think it is rather fast, given the fact that it uses no 3D hardware at all.
disp.c/disp.hโ functions to display the battlefield.distor.c/distor.hโ this module contains the code to create the "wave effect". It uses a lot of data tables, and is quite complicated to understand...glouglou.s/glouglou.hโ assembly module, it's a replacement for some functions ofdistor.c. It goes much faster but does the same thing.info.c/info.hโ code to display the info bar. The info bar is the bar which displays the time left and the amount of players for each team while the game is running.message.c/message.hโ provides an API to display messages during the game. Super useful if you want to debug the game: you can trace and display anything.pion.c/pion.hโ code to display the cursors.viewport.c/vieport.hโ code to allocate and resize the zone where the map is displayed, also called the "viewport".
#### ๐ต Sound and music
Sound and music routines required some encapsulation, since the game has to be able to run even if the sound and/or music did not load correctly. Resilient queen behavior ๐
music.c/music.hโ the code to control MIDI playback.sound.c/sound.hโ functions to play sound.
#### ๐พ Data management
These functions handle the datafile contents and also the custom data.
Note that the various utilities such as liquidwarcol, liquidwarmap and liquidwartex do not share code with the main executable. This is obviously a design error, for liquidwarmap will handle maps in a very poor way and is unable to autodetect map errors, whereas the game does it rather well. Blame the programmer ๐ญ
disk.c/disk.hโ all the code to access data from the hard drive. In fact, all the HD access is done at startup.map.c/map.hโ code to load the maps from a datafile raw data or a user defined bitmap to a usable structure in RAM.maptex.c/maptex.hโ code to handle the "use default texture" option, and associate a map with a given texture automatically.texture.c/texture.hโ code to handle textures. Textures are stored in a special format which uses 5 bits per pixel.
#### ๐ฒ Random map generator
okay so Liquid War has a "generate random map" feature ๐ซ and it lives in two places: right there inside the game, and as its own lil standalone external program. The source for the external one is chillin' in ./utils/lwmapgen in the Liquid War source distribution. That program was coded by David Redick, it's also up on http://www.cs.clemson.edu/~dredick/lwmapgen/, and it works on GNU/Linux ๐ง. Compiling it under DOS and/or Windows? Untested and unsupported, bestie, do not come for me ๐.
And the random map generator inside Liquid War โ the one that obviously works on any platform LW supports โ shares the same source code for its greater part with the external lwmapgen program. No cap.
random.c/random.hโ wrapper for the map generator written by David Redick โจ it basically does the same as./utils/lwmapgen/main.c, except it does it within Liquid War while it's running, instead of being an external independant program.
โจ Time handling โจ โฐ
Time handling is fundamental in a game, bestie, like the foundation. Time gets used for visual effects (waves... ๐) during the game, it gets used to generate some pseudo random stuff, well โ it gets used everywhere ๐ .
Not me pointing out that on the client, I use 2 "different" clocks. The first one counts the "real" time, in seconds. The second one counts "rounds" and gets incremented by 1 at each game round ๐.
srvtime.c/srvtime.hโ code used to handle time on the server, where Allegro's functions are not available.ticker.c/ticker.hโ sets up a timer callback โฑ๏ธ.time.c/time.hโ functions to know how long the game has been running, knowing that it can be interrupted.
โจ In-game utilities โจ ๐ฎ
These are various utilities used to monitor and control the game while one's playing, iykyk ๐
capture.c/capture.hโ code used to capture the video output of the game and store it in.bmpfiles while playing ๐ธ.checksum.c/checksum.hโ utilities to generate a checksum from a given game state. Used in network code to make sure all the clients stay synchronized ๐ซถ (everyone in the group chat on the same page, literally).code.c/code.hโ this file contains the code to handle key presses during the game. That's to say the pause key for instance โธ๏ธ.profile.c/profile.hโ provides tools to calculate how fast the game is runnning and what operations slow it down ๐.watchdog.c/watchdog.hโ this module waits for "secret codes" to be typed while the game is running, and traps them ๐ต๏ธโโ๏ธ.
โจ Command line handling โจ ๐ฅ๏ธ
OK, now to all the UNIX guys: I know there are many ways to do things in a better and simple way than I did. But keep in mind that in 1998, under DOS, I had a rotten command line ๐ญ and even now I need everything to work on both UNIX and Microsoft platforms. So.
These utilities are not perfect, but they work, that's all I ask them. Periodt ๐ .
basicopt.c/basicopt.hโ handles basic command line parameters such as"-v"or"-h".parser.c/parser.hโ contains code to parse and analyze the command line parameters.startup.c/startup.hโ analyzes the command line parameters and stores them into global variables.
โจ Locale support โจ ๐
Liquid War now has locale support ๐. Basically, all the labels and texts in the UI are stored in constants. There's simply one file per language.
Note to translators: if you decide to translate the menus in another language, keep in mind that all the translations must fit in the various buttons and textboxes. The best resolution to test this โ the one where letters take most place โ is 640x480. So test there, bestie, or your beautiful translation gets the ugly crop ๐.
lang.c/lang.hโ contains code to handle language dependant stuff.langen.c/langen.hโ contains code to handle English specific stuff.langfr.c/langfr.hโ contains code to handle French specific stuff ๐ฅ.
โจ Log and various messages โจ ๐
OK, the API of the log routines is a piece of crap ๐. Now I'm simply too lazy to change it. It works, that's all I ask.
BTW, there's a clear advantage in using custom-made log functions instead of plain calls to "fprintf(stderr,...". It might not be obvious for UNIX users, but think about Windows. Nothing like a "tail -f" there, nor a proper output redirection system. When a user clicks on the Liquid War icon, I want "console" information to be logged in a file! ๐พ
log.hโ common header forlogcli.candlogsrv.c.logcli.cโ contains code to display messages on the console. It's usefull for console may have different behaviors when the game is used on different platforms. This file is used to compile the client.logsrv.cโ contains code to display messages on the console. This file is used to compile the server, which does not use Allegro at all.popupgen.hโ common header for popup functions.popupw32.cโ code to handle popup on the Win32 platform. Popups are a must-have under Windows for error diagnostics, since the average Windows user never gives any look at any log file... ๐ญ (they're so real for that tbh)
โจ Macros, utilities and string support โจ ๐งต
As usual, I needed to prepare a small set of usefull macros ๐ช.
macro.hโ contains basic wrappers/macros for snprintf like functions. This mostly to ease up string manipulation which is โ as always โ a nightmare in standard C ๐ตโ๐ซ.path.c/path.hโ code used to handle filenames and paths, for instance remove path and file extension from a filename ๐ค๏ธ.
It's also important to note that Liquid War uses snprintf instead of sprintf, for using the latter is very likely to cause buffer overflows โ ๏ธ. Under Linux glibc provides this function but Microsoft does not provide it natively on Windows. Therefore I used a third party snprintf implementation by Mark Martinec: http://www.ijs.si/software/snprintf/ and its source is available in the ./utils directory of Liquid War source distribution ๐งฐ.
โจ Byte order and endianess โจ ๐
As you might know, PC Intel based computers are "little-endian" while Sun Sparc stations and Mac computers are "big-endian" ๐. This is an issue for LW since in network games maps are transmitted in binary format. Therefore I needed to set up some (un)serialization fonctions ๐ฆ.
serial.c/serial.hโ code used to transform integers and map headers into an uniform cross-platform byte stream which is readable by both little and big endian machines. Slay, cross-platform communication ๐ซถ.
โจ Thread support โจ ๐งตโจ
Liquid War does have thread support, but it is a "limited" thread support. I mean that the game is generally monothreaded, but a few functions use threads. For instance, calls to the meta-server are done within threads ๐.
Basically, I do not really enjoy programming in a multithreaded environnement ๐ . So when possible, I chose the monothread path, and used threads only where I simply would not be able to find another acceptable solution.
I also needed to use some mutexes to prevent crashes in the user interface ๐ฅ๐ซ.
mutxdos.cโ provides fake mutex support under DOS. This module is here only to make compilation easier.mutxgen.hโ header formutxdos.c,mutxunix.candmutxw32.c.mutxunix.cโ provides mutex support on UNIX.mutxw32.cโ provides mutex support on Win32.thrddos.cโ provides fake thread support under DOS. This module is here only to make compilation easier.thrdgen.hโ header forthrddos.c,thrdunix.candthrdw32.c.thrdunix.cโ provides thread support on UNIX.thrdw32.cโ provides thread support on Win32.
โจ Launching external programs โจ ๐
Liquid War might sometimes launch external programs ๐. This is โ for security reason โ not a default behavior and has to be activated and configured by yourself, using the "-callback" command line option on the server for instance. So yeah, opt-in only, you're in the driver's seat ๐
.
execgen.hโ header forexecunix.candexecw32.c.execunix.cโ code to launch external programs on UNIX.execw32.cโ code to launch external programs on Win32.exec2.cโ code to launch external programs within the client, without any interaction with the user, ie no unwanted popping window for instance ๐.
โจ Low-level network code โจ ๐
There are network packages for Allegro, but I decided not to use them. Socket support is not that hard to implement under UNIX and Win32 and besides, I've done it for my job recently, so I just knew how to do it ๐.
Another reason which decided me to code my own toolbox is that I did not want Liquid War to have external dependencies โ except Allegro of course. This way, UNIX gamers do not have to set up and/or download a specific network library ๐. It's also easier to integrate the game in projects like Debian if it has few dependencies.
This network code is not a masterpiece, it's just a little set of tools that have proven to work. That's all ๐ซก.
BTW, it's important to notice that when linking with Allegro, most blocking UNIX calls ("sleep" or "recv" for instance) stop working: they alwasys return immediately. This led me to implement weird ugly hacks, like calling "recv" in a loop until it gets what it wants... This is theorically and practically a performance killer ๐, but I found no other way to fix this. And FYI, this is not an Allegro bug, it's a feature 8-) ๐
dnsutil.c/dnsutil.hโ wrapper code to issue DNS requests, without having to handle thehostentstruct.sock2cli.cโ code used to wrap low-level network function on the client.sock2gen.hโ header forsock2cli.candsock2srv.c.sock2srv.cโ code used to wrap low-level network function on the server.sockdos.cโ network API for DOS.sockex.cโ network routines shared bysockunixandsockw32.sockgen.hโ header forsockdos.c,sockunix.candsockw32.c.sockunix.cโ network API for UNIX.sockw32.cโ network API for Win32.
โจ High-level network code โจ ๐
These files contains network utilities which are Liquid War specific ๐.
chat.c/chat.hโ functions used to handle chat messages in network games ๐ฌ.keyexch.c/keyexch.hโ functions to send and receive keys to the server. Used on the client ๐.netconf.c/netconf.hโ code to send and receive the config of the clients over the network โ๏ธ.netkey.c/netkey.hโ contains some tools to manipulate key strokes over the network โจ๏ธ.netmap.c/netmap.hโ code to send and receive the maps over the network ๐บ๏ธ.netmess.c/netmess.hโ contains a parser to interpret plain text messages. Used when exhanging information over the network ๐จ.netplay.c/netplay.hโ contains the code to set up and start network games ๐ฎ.network.c/network.hโ contains some network related functions and constants used on the client.ping.c/ping.hโ code used on the client to estimate the average ping time with a server ๐ก.protocol.c/protocol.hโ contains the sequence of messages send and recevied by the client when connecting on the server ๐ค.startinf.c/startinf.hโ contains struct and tools to handle some network informations while starting a network game ๐.
โจ Communication with the meta-server โจ ๐ฐ๏ธ
and that's exactly where we're picking up next, bestie, don't go anywhere ๐
The meta-server is this cute lil thing that BOTH the client and the server hit up, okay? Basically: the server registers itself, and the client goes "hey give me the list of servers" and gets it. That's the whole relationship, it's giving matchmaker. ๐
The meta-server itself is literally just a set of simple PHP scripts sitting on top of a simple MySQL database. Why PHP? Because my provider lets me run PHP pages, that's it, that's the entire reasoning, no cap. ๐
The protocol is very basic and it uses HTTP 1.0 for requests. Answers come back in plain text, one information per line. There's no guarantee that this would work with any HTTP server, but experience proved that it works with my provider 8-).
httputil.c/httputil.h: low level functions to handle http requests.wwwcli.c/wwwcli.h: code used on the client to communicate with the meta-server.wwwsrv.c/wwwsrv.h: code used on the server to communicate with the meta-server.
โจ Server code โจ
The Liquid War server is a rather small program. The only thing it does is accept new players, transmit map and game parameters between them, and then "replicate keys".
By "replicate keys" I mean the server asks each client what keys have been pressed during the last round, and then dispatches this informations to all clients. Which implies that the server has absolutely no idea of who's loosing, who's winning, etc... it's so unbothered fr fr, it simply does not know and does not care. ๐
All the "logic" of the server is coded in these files, the rest is only utilities and helper functions:
server.c/server.h: main code for the server (equivalent ofmain.cfor the client).srvchan.c/srvchan.h: code used to handles channels on the server. A channel is associated to a given computer and may manage several teams.srvcont.c/srvcont.h: global network controler used on the server.srvteam.c/srvteam.h: code used to handle teams on the server.
๐ Bugs ๐
Report a new bug
If you have troubles with Liquid War 5, if you think it is a bug, and if it is not described in this file, then just send a (precise...) decription of your problem to the Liquid War user mailing list. Precise bestie, we're begging. ๐ญ
Besides, it happens that now most bug reports come from the Debian tracking system "http://bugs.debian.org/cgi-bin/pkgreport.cgi?pkg=liquidwar". Thanks to the Debian users and maintainers, it's a very valuable feedback source. ๐ซถ
Additionnaly, on online bug tracking system is availalable on "https://github.com/ufoot/liquidwar5/issues". I try to collect everything here : bugs reported on the mailing-list, bugs from Debian, and bugs I found myself. Alternatively you can report bugs directly on it 8-)
Network
Network support in Liquid War is far from being perfect, so there are a bunch of little problems which can appear. Basically, once the game is correctly started on a LAN, you should have no problems, but getting the game started might be difficult. ๐ฌ
Mouse does not work
Some users reported that they were unable to control the Liquid War cursor with the mouse. Well, the answer is a typical Microsoftish "this ain't a bug, it's a feature!". ๐
More seriously, you're supposed to move the cursor with the keyboard in Liquid War. There's no way to handle the cursor "like a mouse pointer" (*). This is due to:
- Severe limitations in the Liquid War core algorithm.
- The fact that moving the cursor "too fast" would really change the gameplay of Liquid War. As a Liquid War integrist
8-)I can tell you the game would really not be the same if you could move the cursor as fast as you wish. It's part of the game that sometimes it takes you ages to recover from a strategical mistakes. You need to think twice before going to the very end of a level. That's strategy. At least that's how I view things... Anyways as I mentionned above there's a limitation in the core algorithm.
(*) This is not perfectly true, there's a way to control the cursor with the mouse, but it's designed for the case "4 people want to play on the same computer and one single keyboard is not enough". Controlling the cursor with the mouse in Liquid War is possible but yet rather hard to master 8-/ Try it and you'll understand what I mean. This mode can be set up in the "Teams" menu. ๐ฑ๏ธ
Game does not start
On non UNIX platforms such as Windows or DOS, Liquid War is distributed in a .zip file. It's IMPORTANT that you unzip the .zip files with an "unzipper" which preserves the directory structure. Most install problems under Windows come from broken unzipping programs which extract all files in the same directory... WinZip 8.x or the unzip32.exe utility that comes with DJGPP are both able to uncompress Liquid War .zip files correctly. Directory structure is sacred, protect it at all costs. ๐ง
On Liquid War 5.5.9 and later, the Windows version should detect this problem automatically and warn you with a message which basically says something like "Unable to load datafile. Are you sure Liquid War is correctly installed?". If you get this message, you need to reinstall the game by unzipping it with a "correct" unzipping program which does not wreck directory structrure up.
Datafile bugs
Sometimes there are some problems when compiling the datafile, this includes:
- The
liquidwarcol,liquidwarmapandliquidwartexutilities might freeze or segfault. Typing "make" again often solves the problem. ๐ญ - The background image sometimes ends up using the wrong palette, which has a very nasty consequence: it looks ugly. ๐
These bugs are quite hard to get rid off, since I can not reproduce them easily. The good solution would be to completely rewrite the liquidwarcol, liquidwarmap and liquidwartex utilities.
Midi does not work on OSS
Preamble
IF your midi music on Liquid War, or indeed any other Allegro game, doesn't work and you are using the OSS (Open Sound System) drivers (these are the sound drivers which come with the standard kernel distribution), this may well be because Allegro only supports "FM synthesis" and not "wavetable" when it is using OSS. FM synthesis is a very old method of making sound from MIDI and has long since been replaced by wavetable synthesis, with the net result that it's quite possible you've got OSS MIDI working nicely in other applications without having FM support set up at all. This is what I found. (It has to be said that I didn't find the FM sound quality quite as bad as people have said, though).
In this situation, it looks to me like you have the following choices:
Hack Allegro...
to implement wavetable midi on OSS :-)
and for the rest of us...
Use Allegro's DIGMID midi driver...
which creates audio from MIDI using a set of patches (more info here: http://www.talula.demon.co.uk/allegro/digmid.html) and plays back through your sound card's audio.
Get an FM driver up and running...
Which is comprised of the following steps:
- Find out which FM driver is appropriate for your sound card. If you have distribution-specific tools and docs for setting up sound, try those. If not, you will need to be familiar with the knowledge in the Sound-HOWTO and Kernel-HOWTO i.e. know how to compile kernels and modules and deal with sound drivers.
- Look through the OSS modules in '
make menuconfig' and see if anything catches your eye. See if there is any specific documentation on your sound card onhttp://www.linuxdoc.org. Do a few web searches. For my AWE64, I use the OPL3 driver. - Compile and install the FM driver module, or set up your system to use the new kernel if you want to compile the driver in.
- Load the module, or boot your new kernel. It is very important that you pay attention to what is said in the 'help' for your FM driver in '
make menuconfig' and read any necessary files in theDocumentation/sound/directory. For example, I just had a nice half-hour wondering why the hell my FM wasn't working now when it had been before - with the OPL3 driver, you have to give the optionio=0x388toinsmod. Which is stated nice and clear in the docs, but of course I had forgotten since then. You can prevent such happenings by recording options permanently in/etc/modules.conf- see the manpage etc. - Try the game. If it's worked you will hear particularly beepy music. Enjoy! ๐ต
Opl3 occult FAQ
--IMPORTANT-- If you are using Liquid War, your FM will only work if you go to the map 'Elephant inside a boa' and proceed to chase each other round in circles for at least 10 minutes. This cures a bug in the design of the OPL3 interface which conflicts badly with the core Liquid War algorithms. How the hell the music hardware even knows about the core algorithms I don't know, but that's what I made of the now-defunct opl3-occult-FAQ, from which here is an excerpt:
Many roads a man must take. Those with one-track minds are DOOMED, I tells ya. ---- The Liquid War algorithm calculates distances to one place, the cursor.
And:
Man or machine, face or code, must stand strong and solid; must not just ooze away as slime. ---- We think it might just take objection to the whole 'slimy' nature of the LW beings. As well as it being LIQUID War.
So, our carefully tailored approach, is to firstly have the players going in all the possible different directions evenly by moving around the map in circles, and secondly to divert the opl3's attention from the general slimy liquidness of it all by emphasizing the solidity, reality, and natural goodness of that classic tapestry: an elephant inside a boa. ๐๐
That and it's a f***ing ace level. ๐ฅ
Checksum errors
The Liquid War server is a "light" servers which - to some extent - has no idea about what is going on in the game. It simply replicates key strokes between clients and each client maintains its own game state. Normally, the game is designed so that given the same user input, it will behave exactly the same.
However, it happens that sometimes 2 clients can behave differently, and this is a (severe) bug. One consequence is that messages reporting "Checksum errors" appear on the server's and on the client's console output. This bug appears when using non-default rules settings. Basically, if someones tweaks his rules, then the checksum errors appear. Of course I double-triple checked that options were correctly sent on the network, but, well, could not fix the bug. Yet. The short term solution seems to play with default factory settings... ๐ญ
I'm highly interested in bug-reports concerning this problem. ๐
โจ TO DO โจ
okay so this is the part where we're honest about what still needs work ๐ not me spilling the tea about my own bugs but here we are
Bug-fixing ๐
In its latest releases Liquid War is quite stable IMHO. That said, there are still some issues โ with network under Windows, for instance. I'm aware of these bugs and I'm trying to fix them but this really does take time, bestie, like fr fr.
I always welcome bug-reports and patches, because making Liquid War W 5.x.x as stable and bug-free as possible is really important to me โ and most of the time players also appreciate stable programs 8-)
The most important bug-fixing area is probably cross-platform support. That is, make sure that the game runs fine on every supported OS. For instance, it's quite common for Mac OS/X and/or FreeBSD users to "crash" the game. This rarely happens on GNU/Linux, just because it has been so much more tested on this platform. This applies to Liquid War itself and also, to some extent, to Allegro.
New features ๐
Let's be clear: no new features in Liquid War 5. It's bloated, complicated, old, uninteresting to hack. All new features should be found in Liquid War 6, periodt.
Liquid War 6 ๐
Since summer 2005, Liquid War 6, a complete rewrite of Liquid War, is on its way. See http://www.gnu.org/software/liquidwar6/ or "https://ufoot.org/liquidwar/v6" for more informations.
๐ฆ WORK IN PROGRESS ๐ฆ
Note on releases ๐
Whenever Liquid War is released, I usually pass the good news to Freshmeat ( http://freshmeat.net/projects/liquidwar/ ). Then all releases are accessible from the main download page, which is "https://ufoot.org/liquidwar/v5/download".
Releasing the game takes time, for I want all binaries to install properly and sources to compile cleanly. Therefore there might be some delay between the time coding is over and the time a release is actually ready. So for impatients and/or for people who need to test out the very latest versions (eg someone who wants to compile the game on a new platform), it's possible to access the source repository directly. iykyk ๐
About GIT ๐
Historically, Liquid War has used CVS, GNU Arch (aka tla), and now uses git http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html.
So FYI the previously active CVS and GNU Arch repositories, on Sourceforge and Savannah, are currently unmaintained. It has moved to Github. slay โจ
How to get latest releases ๐ซถ
A typical git command would be:
git clone https://github.com/ufoot/liquidwar5.git
If you are interested, I can open this repository in read/write mode, however one of the points of git is that it is distributed and allows cooperative developpement with multiple depots, so this isn't mandatory. And anyways, importing myself patches received by email has never been a real burden.
Besides, most developpement is now done on Liquid War 6. See http://www.gnu.org/software/liquidwar6/ or "https://ufoot.org/liquidwar/v6" for more informations.
๐ COPYING ๐
Liquid War is a multiplayer wargame.
Copyright (C) 1998-2025 Christian Mauduit (ufoot@ufoot.org)
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
๐ธ AUTHOR ๐ธ
Christian Mauduit <ufoot@ufoot.org>
and that's a wrap on the whole page, bestie ๐๐ you made it to the very end, main character energy fr. this little footer down here says v5.6.6, it's Liquid War(6), and it's got its own little date stamp hanging out in the corner โ go forth and play, you absolute icon ๐๐ฆ
๐ฆ where this page comes from
- ubuntu stonking: liquidwar-server 5.6.6-1 ยท GPL-2.0-or-later
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms