From 57d5ba389877e39c400ea3a90dc578f2bd80fe8f Mon Sep 17 00:00:00 2001 From: "Christian Mauduit (ufoot)" Date: Sat, 22 Dec 2018 23:14:37 +0100 Subject: [PATCH 1/6] Starting to migrate from allegro 4 to allegro 5 (many squashed commits) --- .gitignore | 11 + .travis.yml | 43 + CLAUDE.md | 196 ++ ChangeLog | 14 +- Makefile.dj | 10 +- Makefile.in | 17 +- Makefile.mgw | 12 +- README.md | 1 + aclocal.m4 | 358 +++ bootstrap | 22 + configure.ac | 102 +- data/Makefile.in | 51 +- data/back/Makefile.in | 29 - data/back/lw5back.bmp | Bin 0 -> 414226 bytes data/back/lw5back.pcx | Bin 277818 -> 0 bytes data/font/Makefile.in | 30 - data/font/degrad10.bmp | Bin 0 -> 21218 bytes data/font/degrad10.pcx | Bin 15783 -> 0 bytes data/font/degrad20.bmp | Bin 0 -> 63756 bytes data/font/degrad20.pcx | Bin 42992 -> 0 bytes data/font/mouse20.bmp | Bin 0 -> 1568 bytes data/font/mouse20.pcx | Bin 1129 -> 0 bytes data/font/mouse40.bmp | Bin 0 -> 2188 bytes data/font/mouse40.pcx | Bin 1584 -> 0 bytes data/font/void1.bmp | Bin 0 -> 1168 bytes data/font/void1.pcx | Bin 898 -> 0 bytes data/liquidwar-data.txt | 30 + data/map/007.bmp | Bin 0 -> 2892 bytes data/map/007.pcx | Bin 2532 -> 0 bytes data/map/213.bmp | Bin 0 -> 2860 bytes data/map/213.pcx | Bin 2503 -> 0 bytes data/map/4zones.bmp | Bin 0 -> 3416 bytes data/map/4zones.pcx | Bin 3417 -> 0 bytes data/map/666.bmp | Bin 0 -> 4806 bytes data/map/666.pcx | Bin 4767 -> 0 bytes data/map/Makefile.in | 184 -- data/map/alstar1.bmp | Bin 0 -> 5176 bytes data/map/alstar1.pcx | Bin 4547 -> 0 bytes data/map/aquarium.bmp | Bin 0 -> 5826 bytes data/map/aquarium.pcx | Bin 8474 -> 0 bytes data/map/bestiole.bmp | Bin 0 -> 4856 bytes data/map/bestiole.pcx | Bin 4494 -> 0 bytes data/map/biere.bmp | Bin 0 -> 6412 bytes data/map/biere.pcx | Bin 5816 -> 0 bytes data/map/boa.bmp | Bin 0 -> 2092 bytes data/map/boa.pcx | Bin 1873 -> 0 bytes data/map/bonoball.bmp | Bin 0 -> 4540 bytes data/map/bonoball.pcx | Bin 4220 -> 0 bytes data/map/carreaux.bmp | Bin 0 -> 6740 bytes data/map/carreaux.pcx | Bin 6273 -> 0 bytes data/map/carres.bmp | Bin 0 -> 3816 bytes data/map/carres.pcx | Bin 3439 -> 0 bytes data/map/centrik.bmp | Bin 0 -> 6208 bytes data/map/centrik.pcx | Bin 5697 -> 0 bytes data/map/chenille.bmp | Bin 0 -> 6200 bytes data/map/chenille.pcx | Bin 7085 -> 0 bytes data/map/chinois.bmp | Bin 0 -> 2776 bytes data/map/chinois.pcx | Bin 2243 -> 0 bytes data/map/clown.bmp | Bin 0 -> 6560 bytes data/map/clown.pcx | Bin 6098 -> 0 bytes data/map/coccinel.bmp | Bin 0 -> 3276 bytes data/map/coccinel.pcx | Bin 3055 -> 0 bytes data/map/coeurs.bmp | Bin 0 -> 3832 bytes data/map/coeurs.pcx | Bin 3357 -> 0 bytes data/map/cornet3b.bmp | Bin 0 -> 3676 bytes data/map/cornet3b.pcx | Bin 3193 -> 0 bytes data/map/crown.bmp | Bin 0 -> 4676 bytes data/map/crown.pcx | Bin 4199 -> 0 bytes data/map/derivsol.bmp | Bin 0 -> 4400 bytes data/map/derivsol.pcx | Bin 4050 -> 0 bytes data/map/donuts.bmp | Bin 0 -> 4436 bytes data/map/donuts.pcx | Bin 3954 -> 0 bytes data/map/echange.bmp | Bin 0 -> 7876 bytes data/map/echange.pcx | Bin 7559 -> 0 bytes data/map/echlune.bmp | Bin 0 -> 3900 bytes data/map/echlune.pcx | Bin 3355 -> 0 bytes data/map/etoile.bmp | Bin 0 -> 3488 bytes data/map/etoile.pcx | Bin 3188 -> 0 bytes data/map/feuille.bmp | Bin 0 -> 3064 bytes data/map/feuille.pcx | Bin 2752 -> 0 bytes data/map/fille.bmp | Bin 0 -> 3228 bytes data/map/fille.pcx | Bin 2726 -> 0 bytes data/map/fils.bmp | Bin 0 -> 3488 bytes data/map/fils.pcx | Bin 3083 -> 0 bytes data/map/flo1.bmp | Bin 0 -> 2124 bytes data/map/flo1.pcx | Bin 1748 -> 0 bytes data/map/garcon.bmp | Bin 0 -> 3244 bytes data/map/garcon.pcx | Bin 2755 -> 0 bytes data/map/glasses.bmp | Bin 0 -> 7492 bytes data/map/glasses.pcx | Bin 10367 -> 0 bytes data/map/haricot.bmp | Bin 0 -> 2408 bytes data/map/haricot.pcx | Bin 2384 -> 0 bytes data/map/lapin.bmp | Bin 0 -> 7080 bytes data/map/lapin.pcx | Bin 5985 -> 0 bytes data/map/liqwar.bmp | Bin 0 -> 3884 bytes data/map/liqwar.pcx | Bin 3470 -> 0 bytes data/map/lwtab002.bmp | Bin 0 -> 1924 bytes data/map/lwtab002.pcx | Bin 1545 -> 0 bytes data/map/lwtab003.bmp | Bin 0 -> 3516 bytes data/map/lwtab003.pcx | Bin 3083 -> 0 bytes data/map/lwtab004.bmp | Bin 0 -> 3040 bytes data/map/lwtab004.pcx | Bin 2622 -> 0 bytes data/map/lwtab005.bmp | Bin 0 -> 5112 bytes data/map/lwtab005.pcx | Bin 4767 -> 0 bytes data/map/lwtab006.bmp | Bin 0 -> 1952 bytes data/map/lwtab006.pcx | Bin 1459 -> 0 bytes data/map/lwtab008.bmp | Bin 0 -> 2420 bytes data/map/lwtab008.pcx | Bin 1945 -> 0 bytes data/map/lwtab009.bmp | Bin 0 -> 5436 bytes data/map/lwtab009.pcx | Bin 4721 -> 0 bytes data/map/lwtabbar.bmp | Bin 0 -> 2440 bytes data/map/lwtabbar.pcx | Bin 1879 -> 0 bytes data/map/lwtabdrt.bmp | Bin 0 -> 2524 bytes data/map/lwtabdrt.pcx | Bin 2009 -> 0 bytes data/map/lwtabgen.bmp | Bin 0 -> 6212 bytes data/map/lwtabgen.pcx | Bin 5845 -> 0 bytes data/map/lwtabmic.bmp | Bin 0 -> 3752 bytes data/map/lwtabmic.pcx | Bin 3098 -> 0 bytes data/map/lwtabrec.bmp | Bin 0 -> 2488 bytes data/map/lwtabrec.pcx | Bin 1789 -> 0 bytes data/map/lwtabses.bmp | Bin 0 -> 3608 bytes data/map/lwtabses.pcx | Bin 2984 -> 0 bytes data/map/lwtabto2.bmp | Bin 0 -> 2152 bytes data/map/lwtabto2.pcx | Bin 1768 -> 0 bytes data/map/lwtabto4.bmp | Bin 0 -> 2392 bytes data/map/lwtabto4.pcx | Bin 1990 -> 0 bytes data/map/lwtabtom.bmp | Bin 0 -> 3836 bytes data/map/lwtabtom.pcx | Bin 3120 -> 0 bytes data/map/lwtabtru.bmp | Bin 0 -> 2376 bytes data/map/lwtabtru.pcx | Bin 1882 -> 0 bytes data/map/lwtabvid.bmp | Bin 0 -> 1560 bytes data/map/lwtabvid.pcx | Bin 1195 -> 0 bytes data/map/marionet.bmp | Bin 0 -> 5260 bytes data/map/marionet.pcx | Bin 4723 -> 0 bytes data/map/musique.bmp | Bin 0 -> 3884 bytes data/map/musique.pcx | Bin 3863 -> 0 bytes data/map/net1.bmp | Bin 0 -> 16440 bytes data/map/net1.pcx | Bin 17460 -> 0 bytes data/map/net2.bmp | Bin 0 -> 18772 bytes data/map/net2.pcx | Bin 18643 -> 0 bytes data/map/ordino.bmp | Bin 0 -> 4984 bytes data/map/ordino.pcx | Bin 4088 -> 0 bytes data/map/papillon.bmp | Bin 0 -> 3832 bytes data/map/papillon.pcx | Bin 3354 -> 0 bytes data/map/penta.bmp | Bin 0 -> 2932 bytes data/map/penta.pcx | Bin 2297 -> 0 bytes data/map/peur.bmp | Bin 0 -> 3388 bytes data/map/peur.pcx | Bin 2971 -> 0 bytes data/map/pieuvre.bmp | Bin 0 -> 6936 bytes data/map/pieuvre.pcx | Bin 6360 -> 0 bytes data/map/pigface.bmp | Bin 0 -> 3632 bytes data/map/pigface.pcx | Bin 3301 -> 0 bytes data/map/platform.bmp | Bin 0 -> 5310 bytes data/map/platform.pcx | Bin 5617 -> 0 bytes data/map/poisson.bmp | Bin 0 -> 5004 bytes data/map/poisson.pcx | Bin 4669 -> 0 bytes data/map/policier.bmp | Bin 0 -> 2684 bytes data/map/policier.pcx | Bin 2336 -> 0 bytes data/map/portable.bmp | Bin 0 -> 6192 bytes data/map/portable.pcx | Bin 6363 -> 0 bytes data/map/sgdb.bmp | Bin 0 -> 5888 bytes data/map/sgdb.pcx | Bin 5483 -> 0 bytes data/map/sol.bmp | Bin 0 -> 3084 bytes data/map/sol.pcx | Bin 2496 -> 0 bytes data/map/spagueti.bmp | Bin 0 -> 5972 bytes data/map/spagueti.pcx | Bin 5585 -> 0 bytes data/map/strike.bmp | Bin 0 -> 3904 bytes data/map/strike.pcx | Bin 3849 -> 0 bytes data/map/tilt.bmp | Bin 0 -> 3456 bytes data/map/tilt.pcx | Bin 3030 -> 0 bytes data/map/tipi.bmp | Bin 0 -> 5232 bytes data/map/tipi.pcx | Bin 4906 -> 0 bytes data/map/titanic.bmp | Bin 0 -> 5236 bytes data/map/titanic.pcx | Bin 5182 -> 0 bytes data/map/trumpet.bmp | Bin 0 -> 3568 bytes data/map/trumpet.pcx | Bin 3657 -> 0 bytes data/map/tulipes.bmp | Bin 0 -> 5712 bytes data/map/tulipes.pcx | Bin 5306 -> 0 bytes data/map/tuyaux.bmp | Bin 0 -> 7362 bytes data/map/tuyaux.pcx | Bin 8344 -> 0 bytes data/map/velo.bmp | Bin 0 -> 5032 bytes data/map/velo.pcx | Bin 4665 -> 0 bytes data/map/village.bmp | Bin 0 -> 3648 bytes data/map/village.pcx | Bin 3287 -> 0 bytes data/map/void.bmp | Bin 0 -> 3352 bytes data/map/void.pcx | Bin 4131 -> 0 bytes data/map/volet.bmp | Bin 0 -> 4676 bytes data/map/volet.pcx | Bin 4574 -> 0 bytes data/map/z.bmp | Bin 0 -> 5028 bytes data/map/z.pcx | Bin 6601 -> 0 bytes data/maptex/{2d.orig.bmp => 2d.bmp} | Bin data/maptex/{3d.orig.bmp => 3d.bmp} | Bin data/maptex/{3x3.orig.bmp => 3x3.bmp} | Bin data/maptex/Makefile.in | 111 - data/maptex/{ac.orig.bmp => ac.bmp} | Bin .../{anaglyph1.orig.bmp => anaglyph1.bmp} | Bin .../{anaglyph2.orig.bmp => anaglyph2.bmp} | Bin data/maptex/{around.orig.bmp => around.bmp} | Bin data/maptex/{big.orig.bmp => big.bmp} | Bin data/maptex/{blemmya.orig.bmp => blemmya.bmp} | Bin data/maptex/{bored.orig.bmp => bored.bmp} | Bin data/maptex/{card.orig.bmp => card.bmp} | Bin .../{charming.orig.bmp => charming.bmp} | Bin data/maptex/{chess.orig.bmp => chess.bmp} | Bin data/maptex/{circle.orig.bmp => circle.bmp} | Bin data/maptex/{circlus.orig.bmp => circlus.bmp} | Bin data/maptex/{clean.orig.bmp => clean.bmp} | Bin data/maptex/{confuse.orig.bmp => confuse.bmp} | Bin data/maptex/{dirt.orig.bmp => dirt.bmp} | Bin data/maptex/{egg.orig.bmp => egg.bmp} | Bin data/maptex/{eyes.orig.bmp => eyes.bmp} | Bin data/maptex/{garden.orig.bmp => garden.bmp} | Bin data/maptex/{honey.orig.bmp => honey.bmp} | Bin .../{honeymoon.orig.bmp => honeymoon.bmp} | Bin .../{jabberwocky.orig.bmp => jabberwocky.bmp} | Bin .../{labyrint.orig.bmp => labyrint.bmp} | Bin data/maptex/{logo.orig.bmp => logo.bmp} | Bin data/maptex/{lost.orig.bmp => lost.bmp} | Bin data/maptex/{lw.orig.bmp => lw.bmp} | Bin data/maptex/lwtab002.bmp | Bin 0 -> 5734 bytes data/maptex/lwtab002.orig.pcx | Bin 3955 -> 0 bytes data/maptex/lwtab003.bmp | Bin 0 -> 21586 bytes data/maptex/lwtab003.orig.pcx | Bin 13685 -> 0 bytes data/maptex/lwtab004.bmp | Bin 0 -> 18624 bytes data/maptex/lwtab004.orig.pcx | Bin 11654 -> 0 bytes data/maptex/lwtab006.bmp | Bin 0 -> 3998 bytes data/maptex/lwtab006.orig.pcx | Bin 2562 -> 0 bytes data/maptex/lwtab008.bmp | Bin 0 -> 4190 bytes data/maptex/lwtab008.orig.pcx | Bin 2772 -> 0 bytes data/maptex/lwtab009.bmp | Bin 0 -> 12144 bytes data/maptex/lwtab009.orig.pcx | Bin 7863 -> 0 bytes data/maptex/lwtabbar.bmp | Bin 0 -> 5866 bytes data/maptex/lwtabbar.orig.pcx | Bin 3738 -> 0 bytes data/maptex/lwtabdrt.bmp | Bin 0 -> 12520 bytes data/maptex/lwtabdrt.orig.pcx | Bin 8713 -> 0 bytes data/maptex/lwtabmic.bmp | Bin 0 -> 17098 bytes data/maptex/lwtabmic.orig.pcx | Bin 10370 -> 0 bytes data/maptex/lwtabrec.bmp | Bin 0 -> 10460 bytes data/maptex/lwtabrec.orig.pcx | Bin 6847 -> 0 bytes data/maptex/lwtabses.bmp | Bin 0 -> 21808 bytes data/maptex/lwtabses.orig.pcx | Bin 15100 -> 0 bytes data/maptex/lwtabto2.bmp | Bin 0 -> 2152 bytes data/maptex/lwtabto2.orig.pcx | Bin 1768 -> 0 bytes data/maptex/lwtabto4.bmp | Bin 0 -> 7106 bytes data/maptex/lwtabto4.orig.pcx | Bin 4439 -> 0 bytes data/maptex/lwtabtom.bmp | Bin 0 -> 17380 bytes data/maptex/lwtabtom.orig.pcx | Bin 10645 -> 0 bytes data/maptex/lwtabtru.bmp | Bin 0 -> 2982 bytes data/maptex/lwtabtru.orig.pcx | Bin 2142 -> 0 bytes data/maptex/lwtabvid.bmp | Bin 0 -> 5314 bytes data/maptex/lwtabvid.orig.pcx | Bin 3806 -> 0 bytes .../{metation.orig.bmp => metation.bmp} | Bin data/maptex/{paper.orig.bmp => paper.bmp} | Bin .../{papercut.orig.bmp => papercut.bmp} | Bin data/maptex/{pastel.orig.bmp => pastel.bmp} | Bin data/maptex/{place.orig.bmp => place.bmp} | Bin ...geometry.orig.bmp => psyforcegeometry.bmp} | Bin ...ltiroom.orig.bmp => psyforcemultiroom.bmp} | Bin ...lcube.orig.bmp => psyforcespheralcube.bmp} | Bin ...cesquares.orig.bmp => psyforcesquares.bmp} | Bin ...om.orig.bmp => psyforceultramultiroom.bmp} | Bin data/maptex/{puckman.orig.bmp => puckman.bmp} | Bin data/maptex/{rect.orig.bmp => rect.bmp} | Bin .../{rectangle.orig.bmp => rectangle.bmp} | Bin data/maptex/{rough.orig.bmp => rough.bmp} | Bin data/maptex/{skull.orig.bmp => skull.bmp} | Bin .../{skullbig.orig.bmp => skullbig.bmp} | Bin data/maptex/{slimy.orig.bmp => slimy.bmp} | Bin data/maptex/{smile.orig.bmp => smile.bmp} | Bin ...solsystembyn.orig.bmp => solsystembyn.bmp} | Bin .../{sonnesystem.orig.bmp => sonnesystem.bmp} | Bin data/maptex/{tiles.orig.bmp => tiles.bmp} | Bin .../{underground.orig.bmp => underground.bmp} | Bin data/maptex/{watch.orig.bmp => watch.bmp} | Bin data/music/Makefile.in | 24 - data/sfx/Makefile.in | 17 - data/texture/Makefile.in | 47 - data/texture/amethyst.bmp | Bin 0 -> 9164 bytes data/texture/amethyst.gimp.pcx | Bin 6039 -> 0 bytes data/texture/bricks.bmp | Bin 0 -> 18638 bytes data/texture/bricks.gimp.pcx | Bin 11471 -> 0 bytes data/texture/crash1.bmp | Bin 0 -> 9148 bytes data/texture/crash1.gimp.pcx | Bin 5322 -> 0 bytes data/texture/electricblue.bmp | Bin 0 -> 6386 bytes data/texture/electricblue.gimp.pcx | Bin 4321 -> 0 bytes data/texture/granite2.bmp | Bin 0 -> 23884 bytes data/texture/granite2.gimp.pcx | Bin 13124 -> 0 bytes data/texture/greenmess.bmp | Bin 0 -> 16458 bytes data/texture/greenmess.gimp.pcx | Bin 11056 -> 0 bytes data/texture/lumps.bmp | Bin 0 -> 3978 bytes data/texture/lumps.gimp.pcx | Bin 2549 -> 0 bytes data/texture/marble3.bmp | Bin 0 -> 9052 bytes data/texture/marble3.gimp.pcx | Bin 6048 -> 0 bytes data/texture/pebbles.bmp | Bin 0 -> 18554 bytes data/texture/pebbles.gimp.pcx | Bin 12568 -> 0 bytes data/texture/pine.bmp | Bin 0 -> 6322 bytes data/texture/pine.gimp.pcx | Bin 4159 -> 0 bytes data/texture/poolbottom.bmp | Bin 0 -> 5052 bytes data/texture/poolbottom.gimp.pcx | Bin 2899 -> 0 bytes data/texture/qbert.bmp | Bin 0 -> 4708 bytes data/texture/qbert.gimp.pcx | Bin 2981 -> 0 bytes data/texture/redcubes.bmp | Bin 0 -> 8592 bytes data/texture/redcubes.gimp.pcx | Bin 5322 -> 0 bytes data/texture/smallsquares.bmp | Bin 0 -> 5758 bytes data/texture/smallsquares.gimp.pcx | Bin 3813 -> 0 bytes data/texture/terra.bmp | Bin 0 -> 8972 bytes data/texture/terra.gimp.pcx | Bin 5330 -> 0 bytes data/texture/wood2.bmp | Bin 0 -> 5638 bytes data/texture/wood2.gimp.pcx | Bin 3326 -> 0 bytes data/water/Makefile.in | 20 - doc/makedoc.py | 684 +++-- liquidwar.spec | 4 +- misc/Makefile.vc | 3 - misc/allegro-gp2x/allegro-accel.html | 76 - misc/allegro-gp2x/allegro-building.html | 63 - misc/allegro-gp2x/allegro-prebuilt.html | 47 - misc/allegro-gp2x/allegro-using.html | 56 - misc/allegro-gp2x/allegro.html | 56 - misc/liquidwar.gpe | 52 - src/Makefile.in | 84 +- src/advanced.c | 63 +- src/alleg2.c | 299 +- src/alleg2.h | 9 +- src/asm.c | 143 - src/asm.h | 78 - src/back.c | 7 +- src/back.h | 4 +- src/backport.c | 2051 +++++++++++++ src/backport.h | 391 +++ src/backportgui.c | 2665 +++++++++++++++++ src/backportgui.h | 243 ++ src/backportguiproc.c | 2111 +++++++++++++ src/backportguiproc.h | 35 + src/base.h | 2 +- src/bigdata.c | 8 +- src/capture.c | 14 +- src/code.c | 16 +- src/config.c | 65 +- src/config.h | 1 - src/connect.c | 10 +- src/dialog.h | 4 +- src/disk.c | 777 +++-- src/disk.h | 32 +- src/disp.c | 21 +- src/distor.c | 154 +- src/distor.h | 2 +- src/error.c | 6 +- src/exit.c | 17 +- src/fighter.c | 50 +- src/game.c | 34 +- src/game.h | 2 +- src/gfxmode.c | 41 +- src/glouglou.h | 84 - src/glouglou.s | 242 -- src/grad.c | 75 +- src/grad.h | 6 +- src/graphics.c | 12 +- src/info.c | 53 +- src/init.c | 21 +- src/joystick.c | 7 +- src/keyboard.c | 3 +- src/lang.h | 396 ++- src/langde.c | 4 - src/langdk.c | 4 - src/langen.c | 4 - src/langfr.c | 4 - src/langpl.c | 5 +- src/level.c | 18 +- src/logcli.c | 5 +- src/lwwin.rc | 10 +- src/main.c | 49 +- src/map.c | 209 +- src/map.h | 17 +- src/{mutxdos.c => mapgen_stubs.c} | 75 +- src/maptex.c | 12 +- src/maptex.h | 16 +- src/menu.c | 11 - src/mesh.c | 32 +- src/mesh.h | 8 +- src/message.c | 6 +- src/monster.h | 92 - src/monster.s | 974 ------ src/mouse.c | 3 +- src/move.c | 2 +- src/music.c | 1 + src/netconf.c | 14 +- src/netconf.h | 1 - src/netplay.c | 3 +- src/network.c | 2 +- src/options.c | 4 +- src/palette.c | 18 +- src/palette.h | 4 +- src/path.c | 69 +- src/path.h | 2 + src/ping.c | 3 +- src/pion.c | 2 +- src/play.c | 2 +- src/popupw32.c | 2 +- src/profile.c | 2 +- src/random.c | 26 +- src/score.c | 14 +- src/serial.h | 2 +- src/sockdos.c | 141 - src/sound.c | 18 +- src/spread.h | 87 - src/spread.s | 959 ------ src/srvchan.c | 17 +- src/srvcont.c | 15 - src/startup.c | 30 +- src/startup.h | 1 - src/test_backport_pixel.c | 227 ++ src/test_path.c | 288 ++ src/{thrddos.c => test_simple.h} | 92 +- src/texture.c | 107 +- src/texture.h | 6 +- src/thrdgen.h | 16 + src/thrdunix.c | 123 +- src/thrdw32.c | 58 +- src/ticker.c | 47 +- src/viewport.c | 12 +- src/viewport.h | 6 +- src/watchdog.c | 2 +- src/x11icon.c | 6 +- utils/Makefile.in | 45 +- utils/liquidwarcol.c | 451 --- utils/liquidwarmap.c | 576 ---- utils/liquidwartex.c | 447 --- utils/lwmapgen/main.c | 31 +- utils/lwmapgen/map.h | 2 +- 429 files changed, 11082 insertions(+), 7167 deletions(-) create mode 100644 .travis.yml create mode 100644 CLAUDE.md create mode 100644 aclocal.m4 create mode 100755 bootstrap delete mode 100644 data/back/Makefile.in create mode 100644 data/back/lw5back.bmp delete mode 100644 data/back/lw5back.pcx delete mode 100644 data/font/Makefile.in create mode 100644 data/font/degrad10.bmp delete mode 100644 data/font/degrad10.pcx create mode 100644 data/font/degrad20.bmp delete mode 100644 data/font/degrad20.pcx create mode 100644 data/font/mouse20.bmp delete mode 100644 data/font/mouse20.pcx create mode 100644 data/font/mouse40.bmp delete mode 100644 data/font/mouse40.pcx create mode 100644 data/font/void1.bmp delete mode 100644 data/font/void1.pcx create mode 100644 data/liquidwar-data.txt create mode 100644 data/map/007.bmp delete mode 100644 data/map/007.pcx create mode 100644 data/map/213.bmp delete mode 100644 data/map/213.pcx create mode 100644 data/map/4zones.bmp delete mode 100644 data/map/4zones.pcx create mode 100644 data/map/666.bmp delete mode 100644 data/map/666.pcx delete mode 100644 data/map/Makefile.in create mode 100644 data/map/alstar1.bmp delete mode 100644 data/map/alstar1.pcx create mode 100644 data/map/aquarium.bmp delete mode 100644 data/map/aquarium.pcx create mode 100644 data/map/bestiole.bmp delete mode 100644 data/map/bestiole.pcx create mode 100644 data/map/biere.bmp delete mode 100644 data/map/biere.pcx create mode 100644 data/map/boa.bmp delete mode 100644 data/map/boa.pcx create mode 100644 data/map/bonoball.bmp delete mode 100644 data/map/bonoball.pcx create mode 100644 data/map/carreaux.bmp delete mode 100644 data/map/carreaux.pcx create mode 100644 data/map/carres.bmp delete mode 100644 data/map/carres.pcx create mode 100644 data/map/centrik.bmp delete mode 100644 data/map/centrik.pcx create mode 100644 data/map/chenille.bmp delete mode 100644 data/map/chenille.pcx create mode 100644 data/map/chinois.bmp delete mode 100644 data/map/chinois.pcx create mode 100644 data/map/clown.bmp delete mode 100644 data/map/clown.pcx create mode 100644 data/map/coccinel.bmp delete mode 100644 data/map/coccinel.pcx create mode 100644 data/map/coeurs.bmp delete mode 100644 data/map/coeurs.pcx create mode 100644 data/map/cornet3b.bmp delete mode 100644 data/map/cornet3b.pcx create mode 100644 data/map/crown.bmp delete mode 100644 data/map/crown.pcx create mode 100644 data/map/derivsol.bmp delete mode 100644 data/map/derivsol.pcx create mode 100644 data/map/donuts.bmp delete mode 100644 data/map/donuts.pcx create mode 100644 data/map/echange.bmp delete mode 100644 data/map/echange.pcx create mode 100644 data/map/echlune.bmp delete mode 100644 data/map/echlune.pcx create mode 100644 data/map/etoile.bmp delete mode 100644 data/map/etoile.pcx create mode 100644 data/map/feuille.bmp delete mode 100644 data/map/feuille.pcx create mode 100644 data/map/fille.bmp delete mode 100644 data/map/fille.pcx create mode 100644 data/map/fils.bmp delete mode 100644 data/map/fils.pcx create mode 100644 data/map/flo1.bmp delete mode 100644 data/map/flo1.pcx create mode 100644 data/map/garcon.bmp delete mode 100644 data/map/garcon.pcx create mode 100644 data/map/glasses.bmp delete mode 100644 data/map/glasses.pcx create mode 100644 data/map/haricot.bmp delete mode 100644 data/map/haricot.pcx create mode 100644 data/map/lapin.bmp delete mode 100644 data/map/lapin.pcx create mode 100644 data/map/liqwar.bmp delete mode 100644 data/map/liqwar.pcx create mode 100644 data/map/lwtab002.bmp delete mode 100644 data/map/lwtab002.pcx create mode 100644 data/map/lwtab003.bmp delete mode 100644 data/map/lwtab003.pcx create mode 100644 data/map/lwtab004.bmp delete mode 100644 data/map/lwtab004.pcx create mode 100644 data/map/lwtab005.bmp delete mode 100644 data/map/lwtab005.pcx create mode 100644 data/map/lwtab006.bmp delete mode 100644 data/map/lwtab006.pcx create mode 100644 data/map/lwtab008.bmp delete mode 100644 data/map/lwtab008.pcx create mode 100644 data/map/lwtab009.bmp delete mode 100644 data/map/lwtab009.pcx create mode 100644 data/map/lwtabbar.bmp delete mode 100644 data/map/lwtabbar.pcx create mode 100644 data/map/lwtabdrt.bmp delete mode 100644 data/map/lwtabdrt.pcx create mode 100644 data/map/lwtabgen.bmp delete mode 100644 data/map/lwtabgen.pcx create mode 100644 data/map/lwtabmic.bmp delete mode 100644 data/map/lwtabmic.pcx create mode 100644 data/map/lwtabrec.bmp delete mode 100644 data/map/lwtabrec.pcx create mode 100644 data/map/lwtabses.bmp delete mode 100644 data/map/lwtabses.pcx create mode 100644 data/map/lwtabto2.bmp delete mode 100644 data/map/lwtabto2.pcx create mode 100644 data/map/lwtabto4.bmp delete mode 100644 data/map/lwtabto4.pcx create mode 100644 data/map/lwtabtom.bmp delete mode 100644 data/map/lwtabtom.pcx create mode 100644 data/map/lwtabtru.bmp delete mode 100644 data/map/lwtabtru.pcx create mode 100644 data/map/lwtabvid.bmp delete mode 100644 data/map/lwtabvid.pcx create mode 100644 data/map/marionet.bmp delete mode 100644 data/map/marionet.pcx create mode 100644 data/map/musique.bmp delete mode 100644 data/map/musique.pcx create mode 100644 data/map/net1.bmp delete mode 100644 data/map/net1.pcx create mode 100644 data/map/net2.bmp delete mode 100644 data/map/net2.pcx create mode 100644 data/map/ordino.bmp delete mode 100644 data/map/ordino.pcx create mode 100644 data/map/papillon.bmp delete mode 100644 data/map/papillon.pcx create mode 100644 data/map/penta.bmp delete mode 100644 data/map/penta.pcx create mode 100644 data/map/peur.bmp delete mode 100644 data/map/peur.pcx create mode 100644 data/map/pieuvre.bmp delete mode 100644 data/map/pieuvre.pcx create mode 100644 data/map/pigface.bmp delete mode 100644 data/map/pigface.pcx create mode 100644 data/map/platform.bmp delete mode 100644 data/map/platform.pcx create mode 100644 data/map/poisson.bmp delete mode 100644 data/map/poisson.pcx create mode 100644 data/map/policier.bmp delete mode 100644 data/map/policier.pcx create mode 100644 data/map/portable.bmp delete mode 100644 data/map/portable.pcx create mode 100644 data/map/sgdb.bmp delete mode 100644 data/map/sgdb.pcx create mode 100644 data/map/sol.bmp delete mode 100644 data/map/sol.pcx create mode 100644 data/map/spagueti.bmp delete mode 100644 data/map/spagueti.pcx create mode 100644 data/map/strike.bmp delete mode 100644 data/map/strike.pcx create mode 100644 data/map/tilt.bmp delete mode 100644 data/map/tilt.pcx create mode 100644 data/map/tipi.bmp delete mode 100644 data/map/tipi.pcx create mode 100644 data/map/titanic.bmp delete mode 100644 data/map/titanic.pcx create mode 100644 data/map/trumpet.bmp delete mode 100644 data/map/trumpet.pcx create mode 100644 data/map/tulipes.bmp delete mode 100644 data/map/tulipes.pcx create mode 100644 data/map/tuyaux.bmp delete mode 100644 data/map/tuyaux.pcx create mode 100644 data/map/velo.bmp delete mode 100644 data/map/velo.pcx create mode 100644 data/map/village.bmp delete mode 100644 data/map/village.pcx create mode 100644 data/map/void.bmp delete mode 100644 data/map/void.pcx create mode 100644 data/map/volet.bmp delete mode 100644 data/map/volet.pcx create mode 100644 data/map/z.bmp delete mode 100644 data/map/z.pcx rename data/maptex/{2d.orig.bmp => 2d.bmp} (100%) rename data/maptex/{3d.orig.bmp => 3d.bmp} (100%) rename data/maptex/{3x3.orig.bmp => 3x3.bmp} (100%) delete mode 100644 data/maptex/Makefile.in rename data/maptex/{ac.orig.bmp => ac.bmp} (100%) rename data/maptex/{anaglyph1.orig.bmp => anaglyph1.bmp} (100%) rename data/maptex/{anaglyph2.orig.bmp => anaglyph2.bmp} (100%) rename data/maptex/{around.orig.bmp => around.bmp} (100%) rename data/maptex/{big.orig.bmp => big.bmp} (100%) rename data/maptex/{blemmya.orig.bmp => blemmya.bmp} (100%) rename data/maptex/{bored.orig.bmp => bored.bmp} (100%) rename data/maptex/{card.orig.bmp => card.bmp} (100%) rename data/maptex/{charming.orig.bmp => charming.bmp} (100%) rename data/maptex/{chess.orig.bmp => chess.bmp} (100%) rename data/maptex/{circle.orig.bmp => circle.bmp} (100%) rename data/maptex/{circlus.orig.bmp => circlus.bmp} (100%) rename data/maptex/{clean.orig.bmp => clean.bmp} (100%) rename data/maptex/{confuse.orig.bmp => confuse.bmp} (100%) rename data/maptex/{dirt.orig.bmp => dirt.bmp} (100%) rename data/maptex/{egg.orig.bmp => egg.bmp} (100%) rename data/maptex/{eyes.orig.bmp => eyes.bmp} (100%) rename data/maptex/{garden.orig.bmp => garden.bmp} (100%) rename data/maptex/{honey.orig.bmp => honey.bmp} (100%) rename data/maptex/{honeymoon.orig.bmp => honeymoon.bmp} (100%) rename data/maptex/{jabberwocky.orig.bmp => jabberwocky.bmp} (100%) rename data/maptex/{labyrint.orig.bmp => labyrint.bmp} (100%) rename data/maptex/{logo.orig.bmp => logo.bmp} (100%) rename data/maptex/{lost.orig.bmp => lost.bmp} (100%) rename data/maptex/{lw.orig.bmp => lw.bmp} (100%) create mode 100644 data/maptex/lwtab002.bmp delete mode 100644 data/maptex/lwtab002.orig.pcx create mode 100644 data/maptex/lwtab003.bmp delete mode 100644 data/maptex/lwtab003.orig.pcx create mode 100644 data/maptex/lwtab004.bmp delete mode 100644 data/maptex/lwtab004.orig.pcx create mode 100644 data/maptex/lwtab006.bmp delete mode 100644 data/maptex/lwtab006.orig.pcx create mode 100644 data/maptex/lwtab008.bmp delete mode 100644 data/maptex/lwtab008.orig.pcx create mode 100644 data/maptex/lwtab009.bmp delete mode 100644 data/maptex/lwtab009.orig.pcx create mode 100644 data/maptex/lwtabbar.bmp delete mode 100644 data/maptex/lwtabbar.orig.pcx create mode 100644 data/maptex/lwtabdrt.bmp delete mode 100644 data/maptex/lwtabdrt.orig.pcx create mode 100644 data/maptex/lwtabmic.bmp delete mode 100644 data/maptex/lwtabmic.orig.pcx create mode 100644 data/maptex/lwtabrec.bmp delete mode 100644 data/maptex/lwtabrec.orig.pcx create mode 100644 data/maptex/lwtabses.bmp delete mode 100644 data/maptex/lwtabses.orig.pcx create mode 100644 data/maptex/lwtabto2.bmp delete mode 100644 data/maptex/lwtabto2.orig.pcx create mode 100644 data/maptex/lwtabto4.bmp delete mode 100644 data/maptex/lwtabto4.orig.pcx create mode 100644 data/maptex/lwtabtom.bmp delete mode 100644 data/maptex/lwtabtom.orig.pcx create mode 100644 data/maptex/lwtabtru.bmp delete mode 100644 data/maptex/lwtabtru.orig.pcx create mode 100644 data/maptex/lwtabvid.bmp delete mode 100644 data/maptex/lwtabvid.orig.pcx rename data/maptex/{metation.orig.bmp => metation.bmp} (100%) rename data/maptex/{paper.orig.bmp => paper.bmp} (100%) rename data/maptex/{papercut.orig.bmp => papercut.bmp} (100%) rename data/maptex/{pastel.orig.bmp => pastel.bmp} (100%) rename data/maptex/{place.orig.bmp => place.bmp} (100%) rename data/maptex/{psyforcegeometry.orig.bmp => psyforcegeometry.bmp} (100%) rename data/maptex/{psyforcemultiroom.orig.bmp => psyforcemultiroom.bmp} (100%) rename data/maptex/{psyforcespheralcube.orig.bmp => psyforcespheralcube.bmp} (100%) rename data/maptex/{psyforcesquares.orig.bmp => psyforcesquares.bmp} (100%) rename data/maptex/{psyforceultramultiroom.orig.bmp => psyforceultramultiroom.bmp} (100%) rename data/maptex/{puckman.orig.bmp => puckman.bmp} (100%) rename data/maptex/{rect.orig.bmp => rect.bmp} (100%) rename data/maptex/{rectangle.orig.bmp => rectangle.bmp} (100%) rename data/maptex/{rough.orig.bmp => rough.bmp} (100%) rename data/maptex/{skull.orig.bmp => skull.bmp} (100%) rename data/maptex/{skullbig.orig.bmp => skullbig.bmp} (100%) rename data/maptex/{slimy.orig.bmp => slimy.bmp} (100%) rename data/maptex/{smile.orig.bmp => smile.bmp} (100%) rename data/maptex/{solsystembyn.orig.bmp => solsystembyn.bmp} (100%) rename data/maptex/{sonnesystem.orig.bmp => sonnesystem.bmp} (100%) rename data/maptex/{tiles.orig.bmp => tiles.bmp} (100%) rename data/maptex/{underground.orig.bmp => underground.bmp} (100%) rename data/maptex/{watch.orig.bmp => watch.bmp} (100%) delete mode 100644 data/music/Makefile.in delete mode 100644 data/sfx/Makefile.in delete mode 100644 data/texture/Makefile.in create mode 100644 data/texture/amethyst.bmp delete mode 100644 data/texture/amethyst.gimp.pcx create mode 100644 data/texture/bricks.bmp delete mode 100644 data/texture/bricks.gimp.pcx create mode 100644 data/texture/crash1.bmp delete mode 100644 data/texture/crash1.gimp.pcx create mode 100644 data/texture/electricblue.bmp delete mode 100644 data/texture/electricblue.gimp.pcx create mode 100644 data/texture/granite2.bmp delete mode 100644 data/texture/granite2.gimp.pcx create mode 100644 data/texture/greenmess.bmp delete mode 100644 data/texture/greenmess.gimp.pcx create mode 100644 data/texture/lumps.bmp delete mode 100644 data/texture/lumps.gimp.pcx create mode 100644 data/texture/marble3.bmp delete mode 100644 data/texture/marble3.gimp.pcx create mode 100644 data/texture/pebbles.bmp delete mode 100644 data/texture/pebbles.gimp.pcx create mode 100644 data/texture/pine.bmp delete mode 100644 data/texture/pine.gimp.pcx create mode 100644 data/texture/poolbottom.bmp delete mode 100644 data/texture/poolbottom.gimp.pcx create mode 100644 data/texture/qbert.bmp delete mode 100644 data/texture/qbert.gimp.pcx create mode 100644 data/texture/redcubes.bmp delete mode 100644 data/texture/redcubes.gimp.pcx create mode 100644 data/texture/smallsquares.bmp delete mode 100644 data/texture/smallsquares.gimp.pcx create mode 100644 data/texture/terra.bmp delete mode 100644 data/texture/terra.gimp.pcx create mode 100644 data/texture/wood2.bmp delete mode 100644 data/texture/wood2.gimp.pcx delete mode 100644 data/water/Makefile.in delete mode 100644 misc/allegro-gp2x/allegro-accel.html delete mode 100644 misc/allegro-gp2x/allegro-building.html delete mode 100644 misc/allegro-gp2x/allegro-prebuilt.html delete mode 100644 misc/allegro-gp2x/allegro-using.html delete mode 100644 misc/allegro-gp2x/allegro.html delete mode 100644 misc/liquidwar.gpe delete mode 100644 src/asm.c delete mode 100644 src/asm.h create mode 100644 src/backport.c create mode 100644 src/backport.h create mode 100644 src/backportgui.c create mode 100644 src/backportgui.h create mode 100644 src/backportguiproc.c create mode 100644 src/backportguiproc.h delete mode 100644 src/glouglou.h delete mode 100644 src/glouglou.s rename src/{mutxdos.c => mapgen_stubs.c} (71%) delete mode 100644 src/monster.h delete mode 100644 src/monster.s delete mode 100644 src/sockdos.c delete mode 100644 src/spread.h delete mode 100644 src/spread.s create mode 100644 src/test_backport_pixel.c create mode 100644 src/test_path.c rename src/{thrddos.c => test_simple.h} (63%) delete mode 100644 utils/liquidwarcol.c delete mode 100644 utils/liquidwarmap.c delete mode 100644 utils/liquidwartex.c diff --git a/.gitignore b/.gitignore index 9a4e6b24..5c33c7b3 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,8 @@ liquidwarcol liquidwarmap liquidwartex *.dat +.#* +*.bak /misc/docker/tables.sql doc/tex/*.aux doc/tex/*.dvi @@ -33,3 +35,12 @@ doc/tex/*.toc doc/texi/*.texi doc/txt/*.txt __pycache__ +doc/html/*.html +doc/man/*.man +doc/man/*.6 +doc/man/*.6.gz +allegro-4* +allegro-5* +__pycache__ +*.pyc +src/liquidwar.dSYM diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..7e3e79a4 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,43 @@ +# Liquid War is a multiplayer wargame +# Copyright (C) 1998-2025 Christian Mauduit +# +# 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 +# +# Liquid War homepage : https://ufoot.org/liquidwar/v5 +# Contact author : ufoot@ufoot.org + +language: c + +addons: + apt: + packages: + - liballegro5-dev + - liballegro-audio5-dev + - liballegro-image5-dev + - libxml2-utils + +install: autoconf + +script: ./configure && make && make check && make package_source + +deploy: + provider: releases + api_key: $GITHUB_OAUTH_TOKEN + file_glob: true + file: liquidwar-*.tar.gz + skip_cleanup: true + overwrite: true + on: + tags: true diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 00000000..45c06dbf --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,196 @@ +# Liquid War 5 - Project Analysis + +## Project Overview + +**Liquid War 5** is a classic multiplayer wargame originally created by Christian Mauduit (U-Foot) and first developed in 1998. The game features unique mechanics where players control armies of liquid and must absorb opposing forces to win. + +- **License**: GPL v2 +- **Language**: C (with some assembly optimizations) +- **Version**: 5.7.0 +- **Platform**: Cross-platform (Linux, Windows, macOS) +- **Graphics**: Allegro 5 game library +- **Homepage**: https://ufoot.org/liquidwar/v5 + +## Project Structure + +### Core Directories + +``` +liquidwar5/ +├── src/ # Main source code (~100+ C files) +├── data/ # Game assets (maps, textures, sounds, music) +│ ├── map/ # Game level files (.pcx/.bmp + .txt configs) +│ ├── texture/ # Background textures (.pcx files) +│ ├── music/ # MIDI background music +│ ├── sfx/ # Sound effects (.wav files) +│ ├── font/ # Game fonts (.pcx) +│ └── back/ # Background images +├── utils/ # Utility programs (map generators, converters) +├── doc/ # Documentation generation system +├── custom/ # User-customizable content +├── misc/ # Platform-specific files, icons, packaging +└── www/ # Web components (metaserver PHP code) +``` + +### Key Executables Built + +- `liquidwar` - Main game client +- `liquidwar-server` - Dedicated game server +- `liquidwar-mapgen` - Map generation utility + +## Build System + +### Dependencies + +**Required:** +- **Allegro 5** - Main graphics/audio library (5.0+ required) +- **pkg-config** - For finding Allegro +- **pthread** - Threading support +- **Standard C libraries** - Network, system headers + +**Optional:** +- **Python** - Documentation generation +- **LaTeX/PDFLaTeX** - PDF documentation +- **makeinfo** - Info page generation +- **gzip** - Compression + +### Build Process + +1. **Configure**: `./configure` (autotools-based) +2. **Build**: `make` or `gmake` +3. **Install**: `make install` + +**Configuration Options:** +- `--enable-debug` - Debug build +- `--enable-static` - Static linking +- `--disable-doc-*` - Disable specific documentation formats + +## Key Source Files + +### Game Engine Core (`src/`) + +| Module | Purpose | +|--------|---------| +| `main.c` | Program entry point | +| `game.c` | Core game logic | +| `army.c` | Army/unit management | +| `fighter.c` | Individual unit behavior | +| `move.c` | Movement algorithms | +| `mesh.c` | Game field mesh system | +| `map.c` | Level loading/management | +| `graphics.c` | Rendering system | +| `menu.c` | User interface | + +### Network System +- `network.c`, `netgame.c`, `netplay.c` - Multiplayer networking +- `server.c`, `protocol.c` - Server implementation +- `sock*.c` - Socket abstraction (Unix/Windows) + +### Platform Support +- `exec*.c` - Platform-specific execution +- `mutx*.c` - Mutex implementations per platform +- `thrd*.c` - Threading abstractions + +### Allegro 4 to Allegro 5 Migration +- `backport.h` and `backport.c` - **Backward compatibility module** containing functions that disappeared in Allegro 5 and need to be reimplemented. This includes GUI functions, input handling, and other utilities that Liquid War 5 requires. It implements only what LW5 needs from the deprecated Allegro 4 API. +- **Pixel functions**: Use `putpixel()` and `getpixel()` from the backport layer instead of `al_put_pixel()` and `al_get_pixel()`. The backport functions work identically to the original Allegro 4 functions and should be favored for compatibility. + +## Game Features + +### Core Gameplay +- **Liquid Army Control**: Unique mechanic where armies flow like liquid +- **Multiplayer Support**: Up to 6 players locally or networked +- **Network Play**: TCP/IP multiplayer with dedicated server support +- **Custom Content**: User maps, textures, and music + +### Technical Features +- **Cross-platform**: Linux, Windows, macOS support +- **Assembly Optimizations**: i386 assembly for performance-critical code +- **Flexible Graphics**: Multiple resolution support +- **Modular Design**: Extensible map and texture system + +## Development Workflow + +### Building from Source +```bash +# Configure with standard options +./configure + +# Build everything +make + +# Install system-wide +sudo make install + +# Build documentation +make -C doc +``` + +### Development Commands +- `make clean` - Clean build files +- `make dep` - Update dependencies +- `make check` - Run tests +- `make package_source` - Create source distribution + +### Testing the Build +- Run `./src/liquidwar` to test the game client +- Check `liquidwar --help` for command-line options +- Test network functionality with `liquidwar-server` + +### Building Individual Files +- Use `make -C src/ filename.o` to build individual object files from the src directory +- Example: `make -C src/ backport.o` or `make -C src/ init.o` +- This is useful for testing compilation of specific modules during development + +## Platform-Specific Notes + +### Linux/Unix +- Primary development platform +- Uses X11 for graphics (through Allegro) +- Requires development headers for dependencies + +### Windows +- MinGW/MSYS2 supported +- Visual C++ project files in `misc/` +- Uses DirectX backend through Allegro + +### macOS +- Builds as native application +- Creates `.app` bundle with `make package_macosx_tgz` +- Handles dynamic library dependencies automatically + +## Packaging System + +The project includes extensive packaging support: +- **Source tarballs** (`make package_source`) +- **Binary packages** for multiple platforms +- **RPM packages** (`make package_binary_rpm`) +- **Windows installers** (NSIS-based) +- **Docker containers** for server deployment + +## Legacy Considerations + +This is a **20+ year old codebase** with significant historical context: +- Originally developed without version control +- Migrated from SourceForge to GitHub +- **Liquid War 6** exists but this version (5) remains widely used +- Code style reflects late 1990s C programming practices +- Contains platform compatibility layers for systems no longer common + +## Current Status + +- **Maintenance mode**: No active development +- **Stable**: Still compiles and runs on modern systems +- **Package availability**: Available in major Linux distributions +- **Community**: Small but dedicated user base +- **Successor**: Liquid War 6 exists but hasn't replaced this version + +## For Contributors + +If you want to contribute or experiment: +1. Focus on bug fixes rather than major features +2. Maintain compatibility with the existing codebase style +3. Test across multiple platforms if possible +4. Contact the original author (ufoot@ufoot.org) for guidance + +The codebase, while old, demonstrates solid C programming practices and cross-platform development techniques from the era before modern game engines. diff --git a/ChangeLog b/ChangeLog index ec5591a8..9334c94b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,16 @@ 2025-11-10 Christian Mauduit (ufoot@ufoot.org) - * Bump version to 5.6.7 to avoid confusion. + * Update copyright notice (year 2025). + +2020-01-05 Christian Mauduit (ufoot@ufoot.org) + + * Update copyright notice (year 2020). + +2018-12-24 Christian Mauduit (ufoot@ufoot.org) + + * Bump version to 5.7.0. + + * Backporting Allegro 4 functions for Allegro 5 (squashed many commits) 2025-11-09 Christian Mauduit (ufoot@ufoot.org) @@ -340,7 +350,7 @@ 2004-08-22 Christian Mauduit (ufoot@ufoot.org) - * Added more strategy tips suggested by Jan Samohl. + * Added more strategy tips suggested by Jan Samoh�l. 2004-08-19 Christian Mauduit (ufoot@ufoot.org) diff --git a/Makefile.dj b/Makefile.dj index c9687658..98ac8e61 100644 --- a/Makefile.dj +++ b/Makefile.dj @@ -19,9 +19,9 @@ # Contact author : ufoot@ufoot.org # # This Makefile is used to compile the MS DOS 32-bit executable binary. -# +# # It requires a working DJGPP http://www.delorie.com/djgpp/ install to work. -# +# # Typical DJGPP requirements are: # v2/copying.dj # v2/djdev203.zip @@ -154,9 +154,6 @@ volume \ watchdog \ wave \ wwwcli \ -glouglou \ -monster \ -spread \ vbeafex OBJ_NAMES_MAPGEN=\ @@ -179,7 +176,7 @@ OBJ_NAMES_MAPGEN=\ ../utils/lwmapgen/rand_poly_cut \ ../utils/lwmapgen/street \ ../utils/lwmapgen/worms - + OBJ_FILES=$(addprefix $(OBJ_PATH),$(addsuffix $(OBJ_EXT),$(OBJ_NAMES))) OBJ_FILES_MAPGEN=$(addprefix $(OBJ_PATH),$(addsuffix $(OBJ_EXT),$(OBJ_NAMES_MAPGEN))) @@ -218,4 +215,3 @@ lwdosmap.exe: $(OBJ_FILES_MAPGEN) @echo "=== End of lwdosmap.rsp ===" $(CC) -o $@ @lwdosmap.rsp @rm -f lwdosmap.rsp - diff --git a/Makefile.in b/Makefile.in index 2a22d376..1763551d 100644 --- a/Makefile.in +++ b/Makefile.in @@ -75,11 +75,6 @@ PACKAGE_DOCKER_TABLES_SQL = $(DOCKER_DIR)/tables.sql PACKAGE_BINARY_TAR = liquidwar-$(VERSION).$(HOST).tar PACKAGE_BINARY_TGZ = liquidwar-$(VERSION).$(HOST).tgz -PACKAGE_DOS_DIR = LW5 -PACKAGE_DOS_EXE = lwdos.exe lwdosmap.exe -PACKAGE_DOS_ZIP = lw$(VERSION_COMPACT)d.zip -PACKAGE_DOS_CWSDPMI = cwsdpmi.exe - PACKAGE_WIN32_DIR = LW5 PACKAGE_WIN32_EXE = lwwin.exe lwwinsrv.exe lwwinmap.exe PACKAGE_WIN32_ZIP = lw$(VERSION_COMPACT)w.zip @@ -97,8 +92,6 @@ PACKAGE_MACOSX_TAR = liquidwar-$(VERSION)-macosx.tar PACKAGE_MACOSX_TGZ = liquidwar-$(VERSION)-macosx.tgz PACKAGE_MACOSX_DMG = liquidwar-$(VERSION).dmg -PACKAGE_GP2X_DIR = liquidwar-$(VERSION)-gp2x -PACKAGE_GP2X_ZIP = liquidwar-$(VERSION)-gp2x.zip PACKAGE_TMP = /tmp/liquidwar-$(VERSION).tmp @@ -107,7 +100,7 @@ all: build_bin build_data build_doc @echo "Build complete." @echo "Type \"$(GMAKE) install\" to install Liquid War $(VERSION)." -world: clean world_clean all package_source package_win32 package_dos package_binary package_source_rpm package_binary_rpm package_gp2x +world: clean world_clean all package_source package_win32 package_binary package_source_rpm package_binary_rpm build_bin: @$(GMAKE) -C $(MAKE_BIN_DIR) @@ -243,12 +236,10 @@ world_clean: @rm -f $(PACKAGE_BINARY_TGZ) @rm -f $(PACKAGE_SOURCE_RPM) @rm -f $(PACKAGE_BINARY_RPM) - @rm -f $(PACKAGE_DOS_ZIP) @rm -f $(PACKAGE_WIN32_ZIP) @rm -f $(PACKAGE_NSIS_EXE) @rm -f $(PACKAGE_MACOSX_TGZ) @rm -f $(PACKAGE_MACOSX_DMG) - @rm -f $(PACKAGE_GP2X_ZIP) # used when preparing packages packageclean: clean world_clean @@ -315,6 +306,7 @@ $(PACKAGE_SOURCE_TARGZ): @echo "Deleting temporary directory." @rm -rf $(PACKAGE_TMP) +<<<<<<< HEAD package_dos: $(PACKAGE_DOS_ZIP) $(PACKAGE_DOS_ZIP): $(PACKAGE_DOS_EXE) $(PACKAGE_DOS_CWSDPMI) @@ -354,6 +346,8 @@ $(PACKAGE_DOS_ZIP): $(PACKAGE_DOS_EXE) $(PACKAGE_DOS_CWSDPMI) @mv $(PACKAGE_TMP)/$(PACKAGE_DOS_ZIP) . @echo "Deleting temporary directory." @rm -rf $(PACKAGE_TMP) +======= +>>>>>>> 0836880 ([dos] removed support) package_win32: $(PACKAGE_WIN32_ZIP) @@ -526,6 +520,7 @@ $(PACKAGE_MACOSX_DMG): $(PACKAGE_MACOSX_TGZ) @echo "Deleting temporary directory." @rm -rf $(PACKAGE_TMP) +<<<<<<< HEAD package_gp2x: $(PACKAGE_GP2X_ZIP) $(PACKAGE_GP2X_ZIP): $(PACKAGE_SOURCE_TARGZ) @@ -556,6 +551,8 @@ $(PACKAGE_GP2X_ZIP): $(PACKAGE_SOURCE_TARGZ) @cp $(PACKAGE_TMP)/$(PACKAGE_GP2X_ZIP) . @rm -rf $(PACKAGE_TMP) +======= +>>>>>>> fc68ac4 ([backport] removed GP2X support) $(PACKAGE_DOCKER_SOURCE_TARGZ): $(PACKAGE_SOURCE_TARGZ) @cp $< $@ diff --git a/Makefile.mgw b/Makefile.mgw index 2b95067b..27895100 100644 --- a/Makefile.mgw +++ b/Makefile.mgw @@ -143,10 +143,7 @@ volume \ watchdog \ wave \ wwwcli \ -glouglou \ -monster \ -spread \ -lwwin +lwwin OBJ_NAMES_SRV=\ basicopt \ @@ -192,8 +189,8 @@ OBJ_NAMES_MAPGEN=\ ../utils/lwmapgen/rand_poly \ ../utils/lwmapgen/rand_poly_cut \ ../utils/lwmapgen/street \ -../utils/lwmapgen/worms - +../utils/lwmapgen/worms + OBJ_FILES=$(addprefix $(OBJ_PATH),$(addsuffix $(OBJ_EXT),$(OBJ_NAMES))) OBJ_FILES_SRV=$(addprefix $(OBJ_PATH),$(addsuffix $(OBJ_EXT),$(OBJ_NAMES_SRV))) @@ -225,6 +222,3 @@ lwwinsrv.exe: $(OBJ_FILES_SRV) lwwinmap.exe: $(OBJ_FILES_MAPGEN) gcc -Wl,--subsystem,console -o $@ $(OBJ_FILES_MAPGEN) -lalleg44 - - - diff --git a/README.md b/README.md index 20a1bc43..58e2bb07 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,7 @@ License ------- 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 diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 00000000..5c4cb704 --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,358 @@ +# generated automatically by aclocal 1.16.5 -*- Autoconf -*- + +# Copyright (C) 1996-2021 Free Software Foundation, Inc. + +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) +# pkg.m4 - Macros to locate and use pkg-config. -*- Autoconf -*- +# serial 12 (pkg-config-0.29.2) + +dnl Copyright © 2004 Scott James Remnant . +dnl Copyright © 2012-2015 Dan Nicholson +dnl +dnl This program is free software; you can redistribute it and/or modify +dnl it under the terms of the GNU General Public License as published by +dnl the Free Software Foundation; either version 2 of the License, or +dnl (at your option) any later version. +dnl +dnl This program is distributed in the hope that it will be useful, but +dnl WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl General Public License for more details. +dnl +dnl You should have received a copy of the GNU General Public License +dnl along with this program; if not, write to the Free Software +dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +dnl 02111-1307, USA. +dnl +dnl As a special exception to the GNU General Public License, if you +dnl distribute this file as part of a program that contains a +dnl configuration script generated by Autoconf, you may include it under +dnl the same distribution terms that you use for the rest of that +dnl program. + +dnl PKG_PREREQ(MIN-VERSION) +dnl ----------------------- +dnl Since: 0.29 +dnl +dnl Verify that the version of the pkg-config macros are at least +dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's +dnl installed version of pkg-config, this checks the developer's version +dnl of pkg.m4 when generating configure. +dnl +dnl To ensure that this macro is defined, also add: +dnl m4_ifndef([PKG_PREREQ], +dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) +dnl +dnl See the "Since" comment for each macro you use to see what version +dnl of the macros you require. +m4_defun([PKG_PREREQ], +[m4_define([PKG_MACROS_VERSION], [0.29.2]) +m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, + [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) +])dnl PKG_PREREQ + +dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) +dnl ---------------------------------- +dnl Since: 0.16 +dnl +dnl Search for the pkg-config tool and set the PKG_CONFIG variable to +dnl first found in the path. Checks that the version of pkg-config found +dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is +dnl used since that's the first version where most current features of +dnl pkg-config existed. +AC_DEFUN([PKG_PROG_PKG_CONFIG], +[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) +m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) +m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) +AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) +AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) +AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=m4_default([$1], [0.9.0]) + AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + PKG_CONFIG="" + fi +fi[]dnl +])dnl PKG_PROG_PKG_CONFIG + +dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ------------------------------------------------------------------- +dnl Since: 0.18 +dnl +dnl Check to see whether a particular set of modules exists. Similar to +dnl PKG_CHECK_MODULES(), but does not set variables or print errors. +dnl +dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +dnl only at the first occurrence in configure.ac, so if the first place +dnl it's called might be skipped (such as if it is within an "if", you +dnl have to call PKG_CHECK_EXISTS manually +AC_DEFUN([PKG_CHECK_EXISTS], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +if test -n "$PKG_CONFIG" && \ + AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then + m4_default([$2], [:]) +m4_ifvaln([$3], [else + $3])dnl +fi]) + +dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) +dnl --------------------------------------------- +dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting +dnl pkg_failed based on the result. +m4_define([_PKG_CONFIG], +[if test -n "$$1"; then + pkg_cv_[]$1="$$1" + elif test -n "$PKG_CONFIG"; then + PKG_CHECK_EXISTS([$3], + [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes ], + [pkg_failed=yes]) + else + pkg_failed=untried +fi[]dnl +])dnl _PKG_CONFIG + +dnl _PKG_SHORT_ERRORS_SUPPORTED +dnl --------------------------- +dnl Internal check to see if pkg-config supports short errors. +AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi[]dnl +])dnl _PKG_SHORT_ERRORS_SUPPORTED + + +dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +dnl [ACTION-IF-NOT-FOUND]) +dnl -------------------------------------------------------------- +dnl Since: 0.4.0 +dnl +dnl Note that if there is a possibility the first call to +dnl PKG_CHECK_MODULES might not happen, you should be sure to include an +dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac +AC_DEFUN([PKG_CHECK_MODULES], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl +AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl + +pkg_failed=no +AC_MSG_CHECKING([for $2]) + +_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) +_PKG_CONFIG([$1][_LIBS], [libs], [$2]) + +m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS +and $1[]_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details.]) + +if test $pkg_failed = yes; then + AC_MSG_RESULT([no]) + _PKG_SHORT_ERRORS_SUPPORTED + if test $_pkg_short_errors_supported = yes; then + $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` + else + $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD + + m4_default([$4], [AC_MSG_ERROR( +[Package requirements ($2) were not met: + +$$1_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +_PKG_TEXT])[]dnl + ]) +elif test $pkg_failed = untried; then + AC_MSG_RESULT([no]) + m4_default([$4], [AC_MSG_FAILURE( +[The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +_PKG_TEXT + +To get pkg-config, see .])[]dnl + ]) +else + $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS + $1[]_LIBS=$pkg_cv_[]$1[]_LIBS + AC_MSG_RESULT([yes]) + $3 +fi[]dnl +])dnl PKG_CHECK_MODULES + + +dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +dnl [ACTION-IF-NOT-FOUND]) +dnl --------------------------------------------------------------------- +dnl Since: 0.29 +dnl +dnl Checks for existence of MODULES and gathers its build flags with +dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags +dnl and VARIABLE-PREFIX_LIBS from --libs. +dnl +dnl Note that if there is a possibility the first call to +dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to +dnl include an explicit call to PKG_PROG_PKG_CONFIG in your +dnl configure.ac. +AC_DEFUN([PKG_CHECK_MODULES_STATIC], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +_save_PKG_CONFIG=$PKG_CONFIG +PKG_CONFIG="$PKG_CONFIG --static" +PKG_CHECK_MODULES($@) +PKG_CONFIG=$_save_PKG_CONFIG[]dnl +])dnl PKG_CHECK_MODULES_STATIC + + +dnl PKG_INSTALLDIR([DIRECTORY]) +dnl ------------------------- +dnl Since: 0.27 +dnl +dnl Substitutes the variable pkgconfigdir as the location where a module +dnl should install pkg-config .pc files. By default the directory is +dnl $libdir/pkgconfig, but the default can be changed by passing +dnl DIRECTORY. The user can override through the --with-pkgconfigdir +dnl parameter. +AC_DEFUN([PKG_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([pkgconfigdir], + [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, + [with_pkgconfigdir=]pkg_default) +AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +])dnl PKG_INSTALLDIR + + +dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) +dnl -------------------------------- +dnl Since: 0.27 +dnl +dnl Substitutes the variable noarch_pkgconfigdir as the location where a +dnl module should install arch-independent pkg-config .pc files. By +dnl default the directory is $datadir/pkgconfig, but the default can be +dnl changed by passing DIRECTORY. The user can override through the +dnl --with-noarch-pkgconfigdir parameter. +AC_DEFUN([PKG_NOARCH_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([noarch-pkgconfigdir], + [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, + [with_noarch_pkgconfigdir=]pkg_default) +AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +])dnl PKG_NOARCH_INSTALLDIR + + +dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, +dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ------------------------------------------- +dnl Since: 0.28 +dnl +dnl Retrieves the value of the pkg-config variable for the given module. +AC_DEFUN([PKG_CHECK_VAR], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl + +_PKG_CONFIG([$1], [variable="][$3]["], [$2]) +AS_VAR_COPY([$1], [pkg_cv_][$1]) + +AS_VAR_IF([$1], [""], [$5], [$4])dnl +])dnl PKG_CHECK_VAR + +dnl PKG_WITH_MODULES(VARIABLE-PREFIX, MODULES, +dnl [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND], +dnl [DESCRIPTION], [DEFAULT]) +dnl ------------------------------------------ +dnl +dnl Prepare a "--with-" configure option using the lowercase +dnl [VARIABLE-PREFIX] name, merging the behaviour of AC_ARG_WITH and +dnl PKG_CHECK_MODULES in a single macro. +AC_DEFUN([PKG_WITH_MODULES], +[ +m4_pushdef([with_arg], m4_tolower([$1])) + +m4_pushdef([description], + [m4_default([$5], [build with ]with_arg[ support])]) + +m4_pushdef([def_arg], [m4_default([$6], [auto])]) +m4_pushdef([def_action_if_found], [AS_TR_SH([with_]with_arg)=yes]) +m4_pushdef([def_action_if_not_found], [AS_TR_SH([with_]with_arg)=no]) + +m4_case(def_arg, + [yes],[m4_pushdef([with_without], [--without-]with_arg)], + [m4_pushdef([with_without],[--with-]with_arg)]) + +AC_ARG_WITH(with_arg, + AS_HELP_STRING(with_without, description[ @<:@default=]def_arg[@:>@]),, + [AS_TR_SH([with_]with_arg)=def_arg]) + +AS_CASE([$AS_TR_SH([with_]with_arg)], + [yes],[PKG_CHECK_MODULES([$1],[$2],$3,$4)], + [auto],[PKG_CHECK_MODULES([$1],[$2], + [m4_n([def_action_if_found]) $3], + [m4_n([def_action_if_not_found]) $4])]) + +m4_popdef([with_arg]) +m4_popdef([description]) +m4_popdef([def_arg]) + +])dnl PKG_WITH_MODULES + +dnl PKG_HAVE_WITH_MODULES(VARIABLE-PREFIX, MODULES, +dnl [DESCRIPTION], [DEFAULT]) +dnl ----------------------------------------------- +dnl +dnl Convenience macro to trigger AM_CONDITIONAL after PKG_WITH_MODULES +dnl check._[VARIABLE-PREFIX] is exported as make variable. +AC_DEFUN([PKG_HAVE_WITH_MODULES], +[ +PKG_WITH_MODULES([$1],[$2],,,[$3],[$4]) + +AM_CONDITIONAL([HAVE_][$1], + [test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"]) +])dnl PKG_HAVE_WITH_MODULES + +dnl PKG_HAVE_DEFINE_WITH_MODULES(VARIABLE-PREFIX, MODULES, +dnl [DESCRIPTION], [DEFAULT]) +dnl ------------------------------------------------------ +dnl +dnl Convenience macro to run AM_CONDITIONAL and AC_DEFINE after +dnl PKG_WITH_MODULES check. HAVE_[VARIABLE-PREFIX] is exported as make +dnl and preprocessor variable. +AC_DEFUN([PKG_HAVE_DEFINE_WITH_MODULES], +[ +PKG_HAVE_WITH_MODULES([$1],[$2],[$3],[$4]) + +AS_IF([test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"], + [AC_DEFINE([HAVE_][$1], 1, [Enable ]m4_tolower([$1])[ support])]) +])dnl PKG_HAVE_DEFINE_WITH_MODULES + diff --git a/bootstrap b/bootstrap new file mode 100755 index 00000000..1312d437 --- /dev/null +++ b/bootstrap @@ -0,0 +1,22 @@ +# Liquid War is a multiplayer wargame +# Copyright (C) 1998-2025 Christian Mauduit +# +# 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 +# +# Liquid War homepage : https://ufoot.org/liquidwar/v5 +# Contact author : ufoot@ufoot.org + +autoreconf + diff --git a/configure.ac b/configure.ac index d711b214..1ba557d8 100644 --- a/configure.ac +++ b/configure.ac @@ -20,7 +20,7 @@ dnl Process this file with autoconf to produce a configure script. -AC_INIT() +AC_INIT AC_PROG_CC @@ -30,22 +30,27 @@ dnl Now we check if we need to use ou own snprintf function AC_CHECK_FUNC(snprintf,[SNPRINTF=yes],[SNPRINTF=no]) AC_SUBST(SNPRINTF) +dnl Checking for allegro-5. +echo -n "checking for Allegro 5... " -dnl Checking for allegro-config, the very-needed Allegro file +PKG_PROG_PKG_CONFIG([0.25]) -AC_CHECK_PROG(ALLEGRO_CONFIG,allegro-config,yes,no) +PKG_CHECK_MODULES([ALLEGRO5], + [allegro-5,allegro_primitives-5,allegro_audio-5,allegro_font-5,allegro_image-5,allegro_color-5,allegro_acodec-5], + [ALLEGRO5_VERSION=5], + [PKG_CHECK_MODULES([ALLEGRO50], + [allegro-5.0,allegro_primitives-5.0,allegro_audio-5.0,allegro_font-5.0,allegro_image-5.0,allegro_color-5.0,allegro_acodec-5.0], + [ALLEGRO5_VERSION=5.0] + )] +) -if test $ALLEGRO_CONFIG != "yes"; then - AC_MSG_ERROR(Unable to find allegro-config - this tool is normally installed by Allegro and must be placed in a directory which is in your PATH. Allegro is a game programming library required by Liquid War. It is available on http://www.talula.demon.co.uk/allegro/. You need to install the complete Allegro developpement package to build Liquid War.) -fi; +echo "using allegro-$ALLEGRO5_VERSION" -dnl Various checks for Allegro +ALCFLAGS=$(pkg-config --cflags allegro-$ALLEGRO5_VERSION allegro_primitives-$ALLEGRO5_VERSION allegro_audio-$ALLEGRO5_VERSION allegro_font-$ALLEGRO5_VERSION allegro_image-$ALLEGRO5_VERSION allegro_color-$ALLEGRO5_VERSION allegro_acodec-$ALLEGRO5_VERSION) +ALLIBS=$(pkg-config --libs allegro-$ALLEGRO5_VERSION allegro_primitives-$ALLEGRO5_VERSION allegro_audio-$ALLEGRO5_VERSION allegro_font-$ALLEGRO5_VERSION allegro_image-$ALLEGRO5_VERSION allegro_color-$ALLEGRO5_VERSION allegro_acodec-$ALLEGRO5_VERSION allegro_main-$ALLEGRO5_VERSION) +ALVERSION=$(pkg-config --modversion allegro-$ALLEGRO5_VERSION) -echo -n "checking for Allegro... " -ALCFLAGS=`allegro-config --cflags 2>/dev/null` -ALLIBS=`allegro-config --libs 2>/dev/null` -ALVERSION=`allegro-config --version 2>/dev/null` -ALDVERSION=`echo ALVERSION | awk 'BEGIN { FS = "."; } { printf "%d",($1 * 1000 + $2) * 1000 + $3;}'` +ALDVERSION=$(echo ALVERSION | awk 'BEGIN { FS = "."; } { printf "%d",($1 * 1000 + $2) * 1000 + $3;}') AC_SUBST(ALCFLAGS) AC_SUBST(ALLIBS) @@ -60,30 +65,12 @@ fi dnl dnl version check dnl -if test $ALDVERSION -gt 4002000 ; then - AC_MSG_ERROR(An old version of Allegro ($ALVERSION) has been detected - please upgrade to 4.2.0 or better.) +if test $ALDVERSION -gt 5000000 ; then + AC_MSG_ERROR(An old version of Allegro ($ALVERSION) has been detected - please upgrade to 5.0.0 or better.) else echo "found $ALVERSION". fi -dnl disabled this. assume allegro-config doesn't lie and all files are -dnl available -#AC_CHECK_HEADER(allegro.h,,[AC_MSG_ERROR(Missing some include file. Please reinstall Allegro.)]) - -dnl disabled this. assume allegro-config doesn't lie and all files are -dnl available -#AC_CHECK_LIB(alleg,main,,[AC_MSG_ERROR(Compilation probe failed. Please check your Allegro installation.)]) - -dnl very often, dat (the datafile compiler) is not installed, -dnl and we _really_ need it... -AC_CHECK_PROG(ALLEGRO_DAT,dat,yes,no) - -if test $ALLEGRO_DAT != "yes"; then - AC_MSG_ERROR(Couldn't find the allegro datafile compiler - please install the complete Allegro package with all its developper tools. The end-user package is not enough to compile Liquid War.) -fi; - - - dnl Uncomment this if you want to shock your users #cat <32o}+ud@ay{2Q%@bWV8Mdp`E=iV@4bio{-Mt`6EFYD zG%s%d@wj*WJGhkUrq5njojvWi>Z&=@st4A7xw`X~YpTh|byc&beW*I+xZ|qJ=gg^A ze0D)~$E~+ky~iI~eQxQetB;-aq3W7Xp2hd1>iW-qx?23nIo13*XI1A+8_Th?s`cM~ zw3>9>d#cq-7gYD${zuhm$G@*y^vO@MeM9w^-?*>(z2T+$lUuH@W==Yx`j5+&S1YcW zUwv%m@zsZqA6fNZ{LyOdm%m(HdhWF9%qj1ymh@dv^^WbX#=n<)ZoH;ibi^`$)#=BNt^TjRPgZw){#M#&QuR&hIrps7s)yFDsV2Yw(CVs-&#(S?>1V3H-MEpu z4X>8)F8y<6RLlE6TYc`DD|m-PsqdxLQHK_uwY0kBnuXQx)25f6JE^+-!gG0Mss8xJ z<<;Do6RI;O9bNU&2LFyWxNX5_t4~q?d9?SXXPrsA9apXY)_v8Dw9Ut-PpW!*4y~@? z{?G7!Us%4hy8G5!s_Q;|F8$F{oz&A^U3l7*>e^3#teSn=xax@wk5{)`x3v26FWp`} z@{Mm)kKT80^~B>Fs{j10Z&ly_!4Im_#vWI#<{g(_Jg54?H4Cacsn4Ca++Ka`qo>h- zw^aXr%JCdqOuMY0U*1#wC)(oZVTH0!10TbykDYyX_1K0DJomlT=U3lSt@!lC)wz?v z#i>2j17E(qdf?8r)c3vB@1HQdx?#bE+y}-koL2qWt=CjDd)`-FaUpnHu#j@5@qIbx zW>t$n{i$mGL-$p;E|_2a)mOh-U3T_V&RtrKA9;B7&{yx~oj+S$f6ZsBKfL%{+LC&V zJ+%7wGf%5l^!3pv7gvA8xz*P!1wXe`e|g_GXbbw1I?X<95@nrMt+{n+^~gitsP6gl zE!9cjY&LlMJ^JW@uYS2Y`?L>LOFj+O&z@ABfA$%?+oQbO@M`sP+ThEduYPYNxV-g7 zFnE0R=Xc#nTaV}cx_R%9RSPftNHv?jx_$W~-eYF<=tB=xALD)3-g*PakFLJS_1}N$ zscJgqE#&;_1#@|)Qhl0d%{_Z2?e%&3=C7;sXHKI0v5bX_d55Lok9v-MZ*|GJXIBs0 zbvt9>cCdCXxS3R4$@~8S*Ivr|-^BHobItm1eVaa8N}t_A+q{?W+pEL7OI5F}t9qc} z?=U`PZ5gP0>i&A5UOSU>qd3C(wZki~h-=s8J$c+a{B(8BvUF7>W@67|~}clI?sZ1vQG^;YXq z`g{g&)5F=d9Q~X6f%-4%uh)l_uh-wNKUg1M|4IFi^(X7I*}ApwDQ=QD0x5UeEDUmhpE+T<Mdn)y`?^{e!g5+Ro%3gc*wTtrB#OUNi5cDkD#aM-L;2s zeyHa?-+n;({%wy@j-S4~!oBuNQ51bL0Ol5gkAZ_*G<%KxxmBEj5D^PHz-13eI-F0> z0p;~apC4ZL#QB@)y}ZxT2RPSnkBk0>ad0f(@3nj}7vF7t+L4vlf}csz|3}i_8)&aB z?DxkA?kh2Zr~`;Tn0FgCQ2!Tj`)zRh-ugS>^!t4NBinym|9$;;VD)45MfLyYdfQp|)@2!bcogYW6o@{p*hZ(xmWvuxuIqd4OGXfMZ) zqbsiKoExP4b)fi2-e3_pewLB+yLu+?w5UF_9tFNef}m9#84ISDQG=Oa^prBc>;#QR z1SanS%R9?@&^#Jkzrpdl_!ixBLGjzoTyXkkGY>58<@3e(7RC40rv%>D2dYK+ochfo zVxOzu3`E!UO@a28`8xxg&vUO_&-S8v6G*;{Z!x_Hr1#dl8$Nt52^?=@dr7^!Y^$$h z|NgS2xxYcDqiq<^iDBDo*xG5}ubc1pM7w0$p$A4=itVmILW_p>yKUpV4sMO>6VLP( z>=Hd8@2-`)ODm~l2R7+HoDx&+)xj$9g#B-lXbzOhzI?dXaS-y+GP{%!mr(B$V7|-hx_-RA4a7|V zyN|-YH9<7krHcoo~a;H`GtTqdUus!M}Hb+S#!4mG#bM zKIq&lqn0^be?=hmBmBL$zM#GWw2R%nVDyil5d$K__^cJH7_P zjwz$-pYi<@a0KGvZDqwE{LoK3Osxlw?69dlkRx8{R#ykbJKM7H#6+$4b~B0&hpA_Q zz`1be%Y2_y{|K}#0}(ehkAc6FVbUYOvjgydN2N4*QGCmRfAu%Av2yr?!e8+x{a}*V>Vt zJ!NZZ2ws&~bM$6Aws+d=asegKPeXhrXM*L)FlaY_1Cs|S( zei~g<2`kz{m!?JouxQ?+3_b+e|LywMvUptOUp3#Y@aJEn5&UEQ)%tsIsyc9AGjK2n zJGAqTpf29k_dO)uEJjouQ%9u@;%W8^BPE}y<}kjfr~Y@aaW(93cv z8rBAMSanyq5frMKg3t}H<^mXETnCY~LkCG9>U7#Bd$R1er$i(e3e4D^sVgN?a=XP} zljwL~&sT%~p4m4?_h-Eo)t6IQ;C5N>4Zndm6+F#mD?4u2M?&wa*9+GY` zQl?|2{X{Lr2zrHA#yiQ?yTGI)VJ+;%$P1PemwinSJogBFJ)FC&K~K|H_JI$s8V1)f z(!b96Gr8Nka|ew3T0OmVqpAKidZ{*57gwBN`IOi{I_l$_mnsq2j**&{>FVc+K9#E| zu@6QaPfxuN_K>>Wi6AYd>`pYo`5H>A(>Lw8c!fpqHT1VJV<&^q4@VJ-zyykQ?gB@UM1~quIs6VPj zUJt%j#I|M&P3f)h7GXjHBawQpKgUYocGytGzEAE@mEPsnSTE0~qB zj|Hx_1Y&%aWr^Iw*tQJq9P4o~`&w)EVW58yL>06((dwIMHQT58>4Q~8TDw2cD2==6 zZBf>T7OPIdu`an9B!D=}kj*C7m&eu0jn|Nkv%u!K`i%0=@ZoKsaU@64M<|DSBN+yU z^Bl+GfxMTJ*p{^p4SEq)+gkWlWcR?-3(K^6bu$a(4ihtQ)k%Ec$=3XkuP=hFbNM{b z!Q4yr-LTy|jffMC+T9-ksqX~Ryz|`pZuUK+#WNTAsx~*LgR#J9IR%NWb@L{uoX@ks zXuS+eCG8e4Q(gvhmz9?TKk9)IklZ*qMMx?gT>ZIrwB z(1!1;M<82o#r{5&t*h}39n-{EJ*xAzLwcTUZ~bi@ThdRq8fYBA_HgudQ{VB_dISAD z2d=#`EMW9H(DNd;#T$W{oowF?!f)j7$Kkq*k+ILl74qEO^^INW4N{8}eRD$#ob8!F z^4T=xoSdk(xQVVA|WXZB*5YfUc$hq9iy+7w#!tKemmXoL^Dzhr6Vz%aD0>zp$zMCM zIMC_P;;?$b>y4cI6{x(peyMoX@9JL-n~e;f4Q7?N_-~4=_@~@EAAPPCb)^PrSFoio z2kW@Zfe}Xr;?f(b2S<#F7k!QTXJ9P;_Ht}PfzLwMn-QG1i7Q_Y)NN>bz1q7tAH0WE zqSm(n%VP`36LrCiqK@|s%d?y94@bW;`uT2U?Qpgozipd2o@uMN#_N*tvj5v_+GD|* zwkOw#8yHr!fH>M)>kvOod+i4~-{A>;l_F@MmFFMeoMp7SUijeAOyhaou%Dj8ZtKKn zBV6(xIB^`fIx^dec9}&Rf4e@4a(-I>6Pz`HXC$+22K!3qLB_UxHnN^b87Xbo;#E8! zTjP&mp*uhY-XakfI20xSz}eCDsr8r90j+;vO=){ryi2qdb;@^4jkq0Mj5>H0{=1o) zK2%NwW6MC(v*qKIcvl%K&iJe^kFmWT?8tAUv4TI2)cp}#=YqLA17kOG?xe6Wl*?eQ zycl>J#xXtIj|Jk;@<5nYhAgPBMNLj$i?)TnL@d^j%5GsP1j@vXGI9YesothP95#gE z=AjQRLKe^Cx>tke!tag7=M_p;EMX9+Jk|!jF8tzgO~XDCH;_S(X=#Cv5)m8w^vDC4 zr&*HaX54|UdqSitoWP)j^@@UmAA2Q z(e(m>YJl&Qudsc091)M|ZDZn^yV!e&{j_wIw|Kv?Rh6sP^CYFL{+1c+&(Z#|SyB?fSb|ls^QY z`x>l_^cZOWU`uhj0JCdk-y^bs!B;;~ygR%Xai zJ*(P<(Kj7!vY*!8T=$Iim`?zOJ#jv-Ypo9MQ6^8~+D;uTMJ#hni^GWMqsZJx>tDcQ zXTW9?>(%t(-`BU|7oHv^XAEa+!MZJ*!@@0aqk8hn`lkiI4@ml2#LIq7t?=4`>Om zZ;6!rJu-F#nB$3MKp%?rQ~s-=in*+B`<>?#XYF>&jp1vzY~%3qwX*P1xW~Bh*zm}y z-6?-hBKCqm4_w`db$eytZ!Y_H4-2gh4ev%U_;~o4*Mq3_!Di3#tre?PVJt%}@0+yG z4*tq_%gRk*xf;{J1_otwK#$0}jH|V1ksk2VBJiRV)rPp1Yft0+hAz)+Li*-aG8|as zm^|l|+t7r|4 zHv0}fz{8+-Fz(WGf`ob>wkbY-j~cg|gw(|AoYx#h3GEXy&Jo843TVyI5LSg(PpW+uvLlKX2)Pfi+HXSg4l8qsu7%$O zyY?n!f zIBP{W4wmG;lB+-Rg(+PwQh~Cw*{Q20f)8*_=3*AGdS&0uVF_e2Srk<=a@U z>Hk%RttAKHpYW0V6%QKLtMI78W6^qD9zGh4>U!r3SQb+UssF2Y+(V!4%ZNqjC4pQuvGl@-H_K5o)CXce9TV4N#MpZ{rv0!oJdnQQ zIIy*lc);J`FZ&63RntXPy%knc^8y>x6$BpyGX_(oHF`OWHoE>iy{Mm1cFH%pygt8- z2~Dh<>j#Mc%cvri(enR~8!>cfN^9yngrj%MNAGPvlqp|n6)Z3_0BJZUB=s5e-;?z4 zsCpz;sYuZ;JO-P=EUaU}(Tg108+RCWMNXP0@Dx|9FIS*z>0#3cY)-)` zFcI1p+L<;0_$p=$C_9&t^^(~GoQZ8QW|Uzbh*zhQhaAtZf-_Q*7>Xe zv)ALD<61ro(81n9`y$h&A`+-Ja~Az4OJy4sBJ6NC$2=#_+|D-kT&G9)20w8e?AiB) zlF0+1-8=Eav^FhO->p&I)A*=~jHYL@eul^-N6}cJTOMRC)00NqqV<|d_=P+Yfsc)MFhr} zbSGCP>oqibS_V2WS~b)Pd7am^*Tp-Nd(*68%sT#`EVJl?Cqv?$2qMt2K+Tol=A_Wu zwK4A^UbPdg{3&<|mg=4@J7KAiAA*z%bih>RgrpZ^71yduVL^6X!SVEL=vlidm`SNN z2R4$q!iy&7u&0*3A+;x3__EN$^rCqdBsIJF_8RqcwfA0_X?G*q#LKmC)%~>8SsW!F z$~?aCM$nfs(Luoyw8MaY(pCp*`ALk3BR{qpHlbq-JxGkT_=y;kxgP~DD%pC`cl4mB zYvVN^umti~^vnfz$jK}FeX^rH8=s-tz1rhLdc4PzqdOxf`RHa4H4V@4%8q2&frOib#F;?9t3|1^Yx9i(OLs-gNgHuA zepzzsK-(K}M%LPiK9B!4vPjg{p9>BWQTSouw&bPE(-VLCX-^N&tzHUPD%i`YyIf_2 z>ZaIIo0y09(Rh?{(1@w*w4ll8CP)K!dN0(}ceAAj&T|}Z#9{a>>g$k~_lLv;XWECh z(Xjop&5Tj4!0=4K`>iap-44WC%T;Jp`Wd$|2IrvVEG*rvlgN00_$VHjVHCx}$QQ0p`SF=jQvENV3a{&n3L?3A_!b^PmK+13HZM-*xdK$eVYk2R)+?#mNJ~)!7L4z$hj#?@EkZw5^kaztNVUV+~VvDzL-(^2) zLK`H))TvjVPaV`_?pya5iLG=sTW~QM9>hJdCLZP;9%VF`ulb0ah3ql{KnxS)ybZe2 z8;gG-w089-yqX7%xE%h(uof`TJd=`MI z(0*FBsLA0>?Z);Q0hb-u8L?q8b4X(`C!;GKY>#g@>vXHO)KMVQ!z!Bu^FOh z#5uYXO-9N&hV>U{8bsfkd|ZeBjtzTCj0d;0SU8-1ey~0~I4I;?eQd`Gv9Ch>G_%QfVDC!U5g9%j*7Gw~~09Im<@o-?K- zUm4TPoHpepcmYrH)dKh@@pBpNrA~et_13>IrI;mj8L?0FdA3DbztMw`BQlZVHnI{+iszled(OmrG@d;(e%F-o^bl7hPtlW%_jk29 z5>ozA>QNH9Fg-+M#q0G?C^N;5{pK~t1-g<+-_@7K57CM!rH{V*G2YEFWYhd({r}*3 z`e!UTWpJ|DfJn<)aP3ykp^tSU`N&AlsF9#>AV%%<))(s<{zGTF<-8 z1Q+V-=49xz{}q3~4r7^xHWys#H<-!Y%gR_Z^wh@5{vkvCIauix@MUJYET@;u+#rvf z0`klUI=zFdIWQcVx%8v9wHlS|m7aO^DzkPyb1mo1+0Dq1c|jr#&Aky>+KF4xN%fE7 z@vkb|z|6*J_T~O|8q(C|mQkQB+st-LpOpKyEBF||^7?;iyQSL6@cN@{PmlP^Mta?L zH8VV}Mo&w73V&7bN%Wg%@nS`vg^%8AIvHrL?`a!_iY}g|q0bCup6M!NOzpGtuAv{UZH13;f&}K2UM=8F2I! z3|H@OjE3z`sqr}#VdQX#{sPL?VEA*=1sK~_VN}s$wcqQQC$TpjT=EW?W zwD9fIVK7q(e#n*+Z}bK|q?|INF!lVFxiX>~ITf#Ak-b>|jB&RV)*45hCeW_>menZM zzyq7bU}LNE(FzDu7;WSU8I#km&{GwdAbYH9?TqlI()*qJ^m1pc|*R zEiYv~hCInF!t%XZ6n5-Faq8Po17Al5uHM9B`zFXb5&1Qf`jGcUpR0F2!B`x{G5nd} zP9Nu;py+P4#zubkl}Nv5LrT6AHX(?C)%H@t%toByJLS${^ueEU&k^ijK_rK(I(8#I z1X#)Zip;hUW9sYb?(@ou{V1IWikMR%p5!O(#V&2Y8OlH2VK;w`i>srnZRvH`#1^at zw#@2YjO5#*X8}J|+iS`S`b4=Wd$h;f@96EAi6GA2|8GXK8Da8Hw6Wf))jZd^ZmZC@ zE`hTa^Yk6?my&BcSX+)i;DDznb;D+)25zSe4L*zvTCIoVxI$#0?ZXbvqMSnlWq}aU zBKO2`zKzyI=1}^>c{d~^XqrS#lzm&N&l%)tpMiXQg4p2&^>Mtd`8$+@R@l=ehfUQF zadfmxBL6@sc<}yF)1GTlm$jhAspp|5ph+H1ixjLIV*@YO6Ur0VWUKg$#7p!GK6B_T zIZm5VX{R4Te>-|s8IAnZOFA3xx*22SXxEQ7veYB6kCIFD=%;_GbDh#Kql;#B%XRv? zl!><^6`j9Q2b0NKbMU`kkCvs@re*k^@J#5tN<8TyRc0E$(Nophfg&!sZ642l4m4sH zg32W!B^MJ#d<(AI1m0*twUX|bhvk@6s*I#he=oMv^Q}h${@Gf{5ygt`r7jmR7MBKF zO=i364&S&ymuy#h&CF?*5A?Kn7t*s>r zxUvCHfhn+~^oDhngN}!8tqFRxm3p6oPX_R){|zyjZ`H;VxrYd$88nt3TGV@aYh_&` zc?dJDpTQcXXcda=yR`Az6j#BI>pI}vBFphkZ(nLT1dz3B$7LJoo;W83KwP47a;K{PFV5k;<2 za^hcao@>;t5;saakxjNu*&Tia8At>fp-yWsa<9QmBI|nYH9IGL?;9F4^>RP*F)cwg z_%_!%q)YeOQ#v_09lsK-V@7IXC|WN@q@1Mp0j^oVI2yxetrq!-fs zs!7N~eW9Bf>6=^DvxkgTE3L$la+FU$5fx@d=eg)bq+`t0>hx&d-{GgwtC4hp%U~jy z1&vEYm}dx*@R8~d-CWeq)yRzrhUYW!$Fcv7mUTRu*+17e6HOKseedfaNQ9(3>%u!c zgeH*-MiaTO(S(WqzzM_>2asq|^nkvpw!<@``_LtmQ!)<2Vuueq!zixY`DWKo@$~?s`gde>sOYG5Yss zdN{!gJ#h*sQCqQv^clzyT3pFGxv#XL-|wN9#K;2bas}_ci4i}E_FHI+6}>!;N$1dP z&v7bl{D_k-P->Z$mD+uJxZ2$2?4hj3hq)#tth%*5X)k)L!$9%?GlO8CeLU|qJiz}Q zB$M63`QgIyw~hnXEn!g}EMI;H2+t+8{}@;i?O2Wf%A zMaWRj2X^(HE{1uYB(GsOJ)&IDPhh;{MEdDb#`GDS8RsZQGW-Io_!EIH^&$0XZLzr^ z#vBBF=jOPG6~FbZ%PK~bwf6L?&+XC!$~-sz&PV@No_!?Hq#Sf#@8=ch;HTs7)cYjk z$SdmB*Mq57U?r_ZV{^(k^`C1wyQeFoV7>SWG6zPfCd$&=iKg9^Yb%^bl!0grqbYO^ zTO<8WMr6d0TCp0o+OGPHTteTYe}E5VmA;jQfup^&(L&C6%$YDUqpKY#Nt}PS*?AdC zEXzm?l<?R2i|!&+D8aqglkh3NM_t@D;k=qKlv@1b7P zLV9{l)=Le_yVRi2g1eMP`#ASodV3c2q};Jl!?K@i(6Go219$3I`mOYP$Z@Z6hx0Cs zq&Vx_j1;p--emttYM>k&RiDtfy^X82nNA^=jUEG5(1MFvkaK^?7%g|hH}zyJ_Ty@Xg=P>99}#Fp7pp|j~Qu7h2w`0}U~bu+ogE=$W+V+8M5* zMcF0$*xN9LGh)PreQ!&e|Et`(j27DvJ>pq&o*HSjSlrcaRD7TmG(sdzvy1*4a?M%IG;OxCgW; zX`+^GJSF1A;RO(}qGB>S_Mzoe`dObQ&l$tBv*vYmWFVJXI>%!%^2u4{qEty#M>Ne9 z0?aqRDcHtUJx(a{QRF>!VSQnJd=IWM4y;$`%7$!paPus_?#yd{2My;4%6J^BUe1wU z)O$pmIu7VUKR%`YW-%g14hv=N#g;c~Q%%{AUZPD{^IC4Vqw&Zu%DPXvC9_U5_*uHo{0_$Fiawx|dkgwHK|=tGry57|bJP~?Id zv>v3^GFSGneH>%zOl0_U@MI>gB@Gt6avP{wFA~C;+D0z$g`*j7Z@H#Lg5~*qbAXkR z9*2Vlhzi?}gW`+3v9N<9;)=B2;1Z4<&yhse(DzVJTVAUrxt$19LbIp7;u!Ebmon4( z>-6eyFtCS~D&QiKm#evmX^}OcbOc>`^<_J4LD3f+7W>^uqN^$GlSFoI#S_XE%uVOx zyfX7#tV4@LxYO;;Xp27C%+r@6E6~|pGeOGOax#|MD*Dna!Ev;7FV{VR2MW&-XHE?H z`~;SZGD~rm-CfQFZ|S)_g>NnX4+R3X{A4yYB=2_ahS@4a@38G%KS2M0 zUd>a$=p1mTc9yZ074$In8`v{TZ+(kRdfk~k=?id{S+E>gMEJzvHm@hoiYs=bJ#8r4 zID#L5Z>>4dSng+Sp@Pk8hpe4K8x>akp$}xGz+xwQJ0Ab;zcS*ErA>^th(qST z(j(jXI45NfZL4+*hPhjf-CSW1(0V~rC*z*bp;D(xYfk0_hyCC=&T*HTO4h4WKP|pQ zr+$g|y{l*2EA8!3a$Srh-fAnj_;h_XbF2RbZ-Ds>>gUcC+FsV7`+)4O{Svjqbv=o( zM$f`AjJm_>KLTNYPtT+0vwB89_iwNJjnC+b@|k)oLTbx&+i3Nf$f`$}iQ|muW248- zAh+jN!5fd#TbF{Xk@%eOHG#A1iF0!$bF_Do%i`=D)~Z0Ga`lO@%K}Y*3YI=npMoFr zBVnV-QRXo$Ys8Z5C~ut}xSA7L1(62@!kn+8F0MwTXG?GSy}`O3WnK=)^#!P5~Y~eT{olcY=X9^ELSEUxL97!B5HTL|E6l=-t#e4)X9F z$a9lm=856smjlgAKZAWV`6zFo@tO}%+V}BwK2rCPEwvq1desqQ?r`QUHldAaLv*-x z4SjJe?L-WYUN)!c5fJeV$Ra|FpZjDOOfSz4`t~ulPYfA*B4c(IGF2wiAME{)!<{dp zS>e3|XR=tXbn=u;#1YvjV>RX#8)JC|)Hw?_GlcasnT>EeHA+dU=g17Hp)8k_u11U7 zS&1v;z3^r#SDTodlUke>p?P@e;k*n@te3O+56W8{55&Q08I{=vd#wQxzf>nP#-MgH z)se`za;(9^QGaheQDND`OZ1?+)-DjciZ?W3egl|WL;uJP3u9iXQi9p1;BH|s-DcQC zeSgrg-e!VMqI74nf@HahUTd-Fw;$u!?Xf1cw9Z@$b+$xa%UkrW(%E3mCi5o$nZ6xId^uJD;Ld&Mpuen_Q!b+c zix3Mi=l5%o=86*5MRdtuF;W;|l=#2s+gJlf*;t=Ubi@^OPDEO26`lZ^Mj;y?6C->c z;fxl+BVch%Xkcpd7nae;KT9!+?2NCSl=cRhiOvXn9FEg7r8fT+D9c4x!ZXP(EHnfsutZ(y=Qnc6=_(@(M0c7Yn`k1o~HWNJYz5(9U75K_DPXS|v3um2cJ?AvggGy7mW|MJOL-*`|q zikkl#IW-2X<$6G_&htN*_vJioxlJzgUA|@v8W|4S^ozEb^4m2Z17Cbc9V6?RK6(X< za5NrqTgdDwQDz)Q`|?S>>1acHIcL7Yd^j%r4dCZ(kYrxE=z0fqUCEi8ee+^D2`zti zWW%_Mgi#x_N9WQL&tY%KU}{q8V(R!JsAa7;yVRq4>9x?eiV}4mvj#8Y3ekB57z0=A z?}3k8#my))mSl0JO=K`oqLzXTw*?M0$+dx~h)t2bTLHfe^QpeE;$G`-}{x{HKGWQ&?HJSU3rHL_k5IK{Ufqp{#5zMFB z-wzSz>jNozEW%3>bHbLhKd7zw9`VKZWIoF4_Rd6;x+1kPe|bAk5&2wWt-U9%6-Pg% zPM0#~M-binF}0qI&r~@n+l4+4D$GBg1J3Z{cIi9OBOh}Vz}9ce`Q>T!w`b7AF6DlF z6(7hJI^aFp8b!eRR&J_WTTvsPE$y4e2PaIsZYs z^M3HSt&CSE%l?q@yU_9NpIAA<9)LyE$l9^ldQy?1m(W|o>!XT!3SR>|(?OJZR-(-e z|Gn5r_SH&QVIhb~y{BJxE9kZi4WkLD!b{AM~XLV zPs-!eE&FkQPJ`KZ<{!k06nG)y9jhZ6ccyI5qOT2tNv&jO z9Xc|Uy<1DHp99Yw3lhIje-XWGG-x}h{!IN+{WFm1vtlNp@=_i%o2KQrL_9Te{X26y zjNNJPomBr<{ys)b&vir|rKKj&=Z}Fv*QHHPN%t|c$h3_tLO)WilT+6MQry^A&wbJ4FIuBWZU zS+0Vlmey+E$uik~;NWTA|L2U(&tMPT5pwdk;P4pmWp8zZ!Id#ST`P4ty*G}YSqL`G zM^ScZF>I`tx2W@}`a0kmvL*NiSu!bBnzQ{f=RR_yg0;BH@9}&N3J-?;95ZH&6Wq_U zcXeblSMm(m?Q7udQf!zH*0;jT;%PEi3Xe(PDkGb$T3fU{52t?O?-JhT7wm7Pwp+rg zbr#r1@UDLY%pF2ct&m;E@D#DHWU!6eIFQ@ok$324tnYvue}h--M)0Eyb-w8T;t8wK z)}9eljT*i_v0>~5>WCYv|Awc&%m#7VmM<3Pt)2w#EXy20b+@;j!(nO>q#nR!3DnTYFEVzQ2P_|)uo86;aMQ8%r#ukYO~Ky@fM;u7BEyNu^wA&q9! zG8f=cdzv0e|MpRgPuId40A+e;_uwnAr#3KV*CFA=n^vBgGoA8#>4m_W76YEEBiI*j zene3_SEFTD@7tgMA`4BUC4PZ6y$!j{8>FrVZZ1MvUR{o-o~zkYw_k^Uc1wM86CPOD zYd3BADtz^7w2V*hX2f(M&2koqUVH75=c#Qc$FwVavvO9pQqE9qvE}oPh=9n4;T5nz z8;xP>e8$)w>an!`Gmz%`HA=w4V!emEu^`Q)at8ECMch0~9Y%ww;3=*%C;8*SbbqdRiGDCz3th+2mZM9yay$H@VCWRK zkz76W%&Fx&wd+ZliG2eaE35s1uC2(M3uwDz0#D1qt}}LBEI5K|S|+x4=@P4*zCxeGh$F%D9)&rW$%%PEk7D zUtZuZvl;MXk@rdezf2i#a;2z9%}Ru*y^Ff^q-;ub;aOF?-_zlw^!|$@BSg7+@O`xX zLOiPAC`XxXIE`)45iORQR;;|xSO1_~Tz?lNoeCp8fc-NUFAcd2;B7k5`D3xL?GLs0 z@jTO*-fKMF)!Np;O6XB7lI#QIsamxfdmK**=t@;X*Ll6t&$YKR@1lctBa4|)e*#*> zO|-;SjE1-qep71_L&mZ$0V!Gp`bfjy700JiPv(~LB$4(4T0%x(bM@9X!`)KEXQxJ8 zku~b5(<7nJ-Zrx))~cNi-eD@s?#GjHEj|7SGHx!??j*S5A!M>S+7m#Bk_|r=x{<3M z{U%sy4EmB@>x=7Ok17qq|YVKxws(YV? zOiCZ9`E(*G*NRd5MqYspJzdH%&+2E5jF`d<2xM8SK_L&>#)Ad-Xg!J`IciTF-(BAq zvd!$!`|0=R>n$*o8M=(hQ)!uCBU;0FAGX?&F+x7xyi_hOqUc2={!)6TkLzATCpn2) ztOPG|&n1*BBfbVZKFE=csqNq+3k@i2!5HnKF?Dd{I8V<;T7c?D>TJh$bdnhV^dYEI z@82HU@5%JiBA$wD_#7g+RqfUpY$Za+ek9x z8{Vs3wDWnKjdjZ%T}E4mb*w!1m0$%cPsFgdk2p&=xVt?VS$@^`?&o)%tm&Pg{{&i4 zt7?EZ`#P;S5++{_lGb6@EiB9^L3V7(H95k^8eRgmFzq%m(vEURvl7mF8OavE+I2D7 zBiotLF2il(nMSOFdz5B@7BOXyC%eHO;XCNer4S3~(t6<4bv!zWyen7dHNwN4JjcI2 z&)h<7R4qU4ShO{K?17^3o!Tm0eO5fLbF5PnOGpkJPydbtO;3TF@0QQeHc!y=t3b)s zq2=7zjK-&SZvCV3J6BLZi&D!LU&^#|(VCn~^DGRd3{)bf2UO3%vFz)2P{(=$g!#J- zGLrFVSZP@Ll~}TxVGhO;m%xt;T$4_=Yg+tT=%MN8O9mys+UUdqrNHIH|+ND)Ifcm2oqdt zWJ)jGSHPIuJ38KJ7M!)1K6CxtZgk79(~@)0L3$gltMOoLbK)m^fn4E1 zoA;0K-G3K}1wt0x^nXVzHb~zu-Q$J|7_&to%x6vQWfSf>W<<-S# z7502*)cf?KDm0y=&|D`XD|^AuI-VHMc8+4yfveQCMo}+&+>G|@dC-~C&@<{g+URTO zX?^?cQ$!Wla|P!cIS${Mn2dSwnR6A|QRz2ROZMjO?by4M@SD_cssDWxnG7th;C{eFo3aYR`fpF?Smnb7j7FK%E&4SbSj5e4A$* zJ?-xl$2C`mzW_Z6Z^C1&ak`!{e>+&)TYph4oDV$H?BK85qc=cQ;7MwdqjEl<9OU`5 z^6n4TQX6k^7PFZf*b0oPndgcyy-mu^wDgp;dJ9||d>7y7_((^8Ga(|>v2Lk7Y|A^s z*PcL+wQ|Z#FEG{lPgeb&B)txxME{*{p=pl@&iWO z1-$)ppvyOSkTFh~*(TnKb?}#X)=#pso0+)V33qnT71N>S~`*rZeM7&RI$M`Z8o=XY|Nyepa!)n!Y#3MvPA4 zidBI&&sh8OqQ^mwdO9S2AYikyqDUj51CI>w1ys^F)vmRV`n>h#B`$d-Ixe z%^HvMHd-N$A92&i^T*-2x;ab8H{;m4z?!%a1^)oj&j*dj%UJzP|;BzX{3t zBD&bcAyf6Ld-mg@v$?Gn=US0^wtmA|XINxDs;ka8+fcv0W#Wn8oE|LYNnIWTi!X=7 zQ{Pfov;V}K?3P>hY0jK5*HB#P6BT>uWnY3O=Za}+Z|CqGSESuZNos1F=u68q*HEOJ z?R>5FWeJ}K7P9{RYeA`+aLivtuF3?RPmJ>DMO$$^pYS{JZC|#Y3a^%b@K~4`p)?#{ zUs7%^X2-8A?*Ej&w3jCn^>D7CF;hJ*`d-Wh-oSmX=`({ia*o~g(I$K9#qD#{-#gyY zGx4L{O-mkCj4-X{{Z{)t?$34qwueR^-izT_H)?*=tn*Gpmd!w8CSgHNw~`zzY@tRI zz^SW+_fYOwyq4#KO0Gfo2U%ouMID;R4>Fk_0NhrooG{!6L&8b@^YHlF|)$?V9u*}JUpyM zz9Tz_Bj|BOPw5vM{&wq|AfGjCN981$HMBMIiX&Q`9+`)?-edYjx1s;5=`SYJx8unW zNo>Cb?$Vdxx(yl8h5>^mchj1uQ$n(#9#}alEQV%RS(7M>cIhJr%F(=bB7LOAXP@}p zVi07Re*lx5tZ#cF{_cM$#u<;J$1i~im+~188t%aEe2w!&mqDi9rR8wUc^s3W9R=H{ zgWEGY<7iuYCF5Bgw(`kv-e!1k1AO@ia+)Z4F@Jg^+Ct=AfJ5xZ$W#>5Sen*ZoQYPo zh1BunLdy;dqXKmg)7Bg6?gQSg4o+nD4Qbw|NGB8C73iDzXMe)nL;>8)b!@ z9m)66vLK(da9U<*mf;w$rQ?i5|% zDOaC2Pc^fn^B0GX=!)EW=CJxLqnSUZ9CfX%FUD%~N|{AX>On>hVJ-OXw2se9-OlyB zMc@K>Y&Z8l2Nx`;w_vBrYp-%lUejOVI;JV9_i*$r7;6L9=;26x(2Sg1Z;gBLbLbJ% zdca;VD+jLMugS?GolNEEo3sw`GF-&^jGthPqw24vc&OYV0&;PgILl}e6^gIv3?LIGa@8^RbqaJ45k7@L> zK7i)-thPcKgO%_z&c6W~UG2!LGJ2@C=1R)BqH;UW{*|y5)Rm1=?|{u@H1Z%~?NQ=7 zjZs4-r+8!K(Jm$G9>zSLvktqVzXdAJ0Y6g$O(|v18fI)~H!_j+z~M1D>wbFDyg&RU z%xR5ZQw#RMyN^HX!<^gFEUxc^#j>42K^c(0Y!h`hd$Jvic(TlQ+M4nU8F~iqt3G=y z^5rM>59yDkpyIduvXk=ihwzoZJmIfAU4X~KvAPQ8FpEbi=lZsX^Q~q_{F?eGZI{R1 za*)oG{1L7XUd;0`qcO<#ni8#IaFLrdd{3Ri+1pOUX!(+yV$OJ3o zwiYuh-sZ>^!C$8bhkX&0`I~)Msi5veEYp~4#~5-RQ_fvF5y@b-v~wc$kjP_~b%mFt zQEuYXiio6ARsAb$05q)d)FU6;*{%zat@u5VyxJpTI62SX^UYtJIPhf$!;95M6s z^?EMFF8l`wje6&Y2-$-lH>7b1gzFK=ZBXVKw={Kxwba{;6!^;q{(9AopzL1s*d4SPHbJ9Cwv!ex8+#7ET4!Zn51U=j_Prci zhBi!wKOD3o(4%)BFF$^Ny>oj(*$kd4!-d}r{>#{Kl`4G7E`Dfh07QKm2DEpde;)<zv58A<#=g*?3)=F^%NeIm-4F1HdTe-iW&;ekW^6`vo2vPZ$jR$6@@-y^`E z5v$v1>z(A;IVYKHOxDy?Q_wqj9#5eb_L_b-*lRo^MDP8zysP=|Mo80NqqN&>Yy!OE z?L*t^^lq@79ujIS4w3`oED@-BYmTV&!Hf_WY8G+#VQ{Vt2wu$m?+&*9sdW-TM&g*0 zDMEQRN3>*>mr7qz#kWW_Qf20A*2fyO+XsHM%&l`CF!|Xr-^CIew1z?FtP3 zYamk%E>};o^^8ls4sw3Lx4&AIGfm!LY$96=vXyfq;jRhbOfT&yT90)qz?V4`oAAcD z<|-oqjVxE>3VQ-uPS(?E5L@0WzL2VXyUJT)40JWJne#xz;{D+B9Iko+yt$PqbvB%y z6_Kod$6sRc{MK5sAZJ}e$33-3^}%zH#zfH4s<6$GF>5D9`>B`P2Y#|WU2oZ*9iz7W znfhX)>MbIjJDO3InMi5a4@o*1*^*X(*z}$|>RXEu8rjp|U&{G4W(N4qdc>7{;7~l} zbBUzCR-U1cE-HEodl}1ml@}r%wTm4`=G%71EK!lAcBzDy+bApY&?rkz1+Q33vY=iV zW2)~79P0VV-|JQT&^q8=-@Fetm$@J2N!$_b!xfaG<;6aChUYjU7)Hj>9pr8#cf{M@ z&-o#%R{RZNbEsV-^Q;Gbpce$qM0Xhh-pug%dHp~^6C}EY9gF|&N3_^7+Vn9-rQ>)f z7Kz@u)5}QOWC#2=3RYZ&kK{yf<+@=p(~}WAi`Lc8YA%L0sJy4uVKmfPO8UNFRpJ!c z7kP!Vn_kAw(AN=G30oP>(uy$hrG(ZSEDFynyFgQiHQ_%o7;9Q~^haedEC_bZ0lBX8 z3xLLNjfH8+V40{Hws?z(P-o4pAq`&E;ny(wXr-6x?{*RMD>9r}LdSxQ;mF-S`tfPn z=^0vSHBkn0X4j(mJxcq9K2z{@GLF?je1ElwUV5+7J6Mi^i;nMl8`pdU%+99ti7@dc z*rWaqvX&WfwBRE>V#Ykf!`-O8-Hd#9&K{#BSAtcy)CZk!Cn}8L%7fw!T>Q5FPw>$D zVWJb=kJZkc9pj2Sv65i}mxB7t2$2C{!}Kb*zc%d*WIZd|&F!(o*%0os2Gp@r6Q3@Q zssB>OuDmmgmbsFadKTU90a1utzKy?kljm^*`rQRY=SIXVC08JK&XYc~CFtMkHVsF1 z1gcoA2NceL(=sPtw5+7B$AKw48(6U-Fy{c9pQhiW7v$(&+Yynk%%Fu0(Gg`eYv;#q5|4QySpG81inAxF}Cx0LbuCHzZjF~$wm zN*rk-Z>oJ`e{@#wkE& zOEfxf{@uUrV9(Rze3CUm0KZI$CVLw*F#ji7>lcErQ^H!h*6=Kze7I$Xz3#VJ-u`-4 zKVG~JYho9hvCV!L=tO($pv<@1KdL+1?KxZ6k?vpKVjW}b!}t{TFg~5J;x9|;&$}&r zE$L@=Mhf;tXoAl%&b6E8i5*(a3`*BLT0lfh96G;6{LPASZnWqOu5(Q|`A{_E?@|#j z1F7&qm+`bVil$}Kun$7wgO@pCRA#%GfAs>kgzH@B=~E8B&={*gN;gJ(Q!=X+Y89&) z8r2ZLy8_AJI?y-8I4k$XFQeAGGYg>8V%mHIt)8g#wWZRVQM6Wu(?Yi)8(!*CH@vw1 zi}F%2Lusa-i?EyrktnxeiHx8PR-?VeYD?g9C73jlC(v zYi|^ztDP2NoKq`eD&~}E7mIVGUpKW2pH2Qkpe!77n?;$KmLh<-?tW(KW`rrRK|){s zf%7fSrI%CB-2Pc;2 zz{$h(ZQTC=bXGRxz>eBO^wv70e6VK_|#a}(j`qz~G=J#T?@L5a= z&+{Btbfpz&4`b=H$T+r@S#@9NfqnUFyGAbTSJqAZCH2jaW5}*tKAvPRxUgY zF0h=rdMWLt9XucYWUdQi(3vdCOII-=lO6BT23pPMDLJ)=L%)h6M!{TvVFdR&-{l_e zb2S4s80RvD&o6K=8I*2Dno+;h`xq@C1q=k!jpmK4yVln5utMy2-?}^cKl$D_hX0&p z$E+xLmKNEMw8`MlC!5`D_NJV*hPQYR@$1Eb()5PYf|MKfwfGc;+Rz}=_4VWTK{zk& zxCVVA&ag+#4*axQ@X#?!Eiog9H=jmbcJt&3XgjfkW5R+EYIXCiF)<2)Z~2w}}@cn?wj;4l_{Zuzr#nqHAHW zhFzD)#cRkNwuo}|ELn^#^QO@l_0q7FIUx6kG#1IQV3AM3ZI{<-Uz=BDtk;O!TlIO( zu0XwvsmFIyC!dcxX-$J$Sh9<@qG#xZNr_u}-Ar0nhVhIT0H=dIM>(*U7IF4Z&Xhe2 zt=e1*b;pc`>*q4+xQd8~{3jY^*9YKEHOtgrY8LV2_!hbG7IAGnXa8~D+pOh2>X=w|RDA;E z{)RR`9+@>C4*dkRcU{oOI%~&Xz}6%1h%#M&j6TM3wBv((TuEMLupDO>XT(3&z}N3w z^qOV9l>BLI_>17!-yC#BMz|Ryr*|jzK%R167B$Dp_0rN7QfrHt92%(opPZUUWit4+ z@y^7wz9cPn(9H-S(gDiN&N6RV-hY8Tv2Vs_l$K0|B) zUDkr%O<6O*xSrL$#nGP3d}Db>bfXd6O*FwdOIn00X>a6gg+=gVETfdHP$XFUV zFU1@|Xa18{6FsSR`5+^Cmq@WUxpNdO|3G~!2)_t^KY^ZF%^mv1MYlHiJ=AO)Z|k$f zx2xeMdj0LLcpv%AUmlEeto7|L@A!r}c13rqsq*&fzpL@TJnXL%i+jo(&Y1mgJY6jt zE`|}9?_AUpVx|wR<~$CyEZ4T!-01h|aB=1og6a;A$HBtbO`#dLwQKR}w{@Ym$^vz= zZr-jJ*4)I?&j*pt=W=er!}Nw$)OF|(D_{+E(-H9TSWrBR_E=pHFTIT`-z+Y!V7P(& z4iUVtxbpeOWM#&KM)&0oZh`>vs|5bC=aVwE^0Dr zycm3mPrXdcXALb6?xl@Hw;pkM>^$Nj>GNDeuR9CtJWwj~^LIAeksyliZ&=kW#yfKJ z1loiarH9q!v|!X0##NMY9_Z8~FooyKbu;k1vbGL$+=z){N%|{|MoL|I#oUkew8MB> z*0uIFg5ZuviR_QPwh&s=^Xdir*~DL}R^EqihwnL9SGU3E#)n+3!I@^`C{aYFq)o4o zGqkm;Cn1riW)@GdS};_Hxi&Yhm`p6OhqoFVXT*S`P=4Ewi^=r2-kS64zTj=o$b#SC z`Jk=l_x9vm@ADI9^@OX_1@ouv-3_Oj3&ES4@voPizxdXJag}NLJ5TMCZG(2ZExA#P z=_$tUr!X!yfS_?8@KQ#-K4E|L*fj<>@Z_WT`-@=J*J09Jz2tT9@fv5Qzz&&@H=ON_ zw1TqA^)CHY$MM($-F%jVRI^H*@04oD{JKgly7b$~XTN;#mF`;yP~3dr@=)sOSajdqFMR{u{u!tB=xTx*m_ zzo0!pg0k(5uMs?B{J{|m(q4Bi zkQ^5bFKce$(;X`aa1=a-rW)uT7}n7vI+&(C(O^I<_w#M0S!&&(+a3@jYTtbbzal=$ zR>wC>q|n#Kk+;x)57CM@fz&5q)2Bh-INF2t1j_`NyXt>cI`lk;_Qy}WIm6>_w~T#aHqsMR-PwCGi8A+~~T`5U-s zm@NXD^?Y6xJefLdWY^-&-^Q^uyhY|(m`$P8CC;_K)__?wSUw^Y%>rI`h5G{;mNjxx z2gv@I*y)$nm)*9ajH5^31NNCR$!wdnkIcNVt;oQnM&^sDwfi1>I$DB}T4&DtYo=z{ zj*FIZyfc52-uxkJs=ETMYe4EB&=aS%7zmN)!IjKvG<7%lHdpy-dgB-nFr7Xy-v{fj zp>7~Yi_*-W$j?5U_h~&CdZ)D4d?$D|M-O}5aiqg-Jv?_D8c26?YzM>gES}5#>lLUE z^>>MS_1w6>(YB(@uDG^?wbf^c! z3t69KCJ0>uKdxraxY=+RLsm6HG@||<-o6pE;RM=m5Ag)`J$vG;qMqtKuBkqW@jRZ^ z`6b`_41Er9HjYdT*3*!3v1f%nqYjCdT8Nf|>*wLl1)wr9V@7ydc%dysJkzs)t! z=_>SLbW~SZbZws&gXss*;z~vsdNMUrFIHz;2aXDMjuyQbe3W-~ZM2ESJjqpXshN&S zq^H<6TS$%6zCD3{mMw97r~ay+{243NQ1fhi{af2Xk84UQ@0E|Ti*grR zs0(d7&=__Q$Cc$GNrsaH{VOvyagP?i_odtw*=PrGonBJ4&;{H-gTF5{3&Oi#)Or_n zTEpM#itALH`>QPlf&-gk*qA2m*cE;(@SqKXR%KsiYi1-+eB#$9JF@E{GHzonxia0c z7YJF&-|@V+qcUuKZD!Kkw<$dck3 zn5i2HOwVqmAFie+h9lc-V^{cbjZW7!nG0Wxr*C^WqWssVC2o}e%kiL!zRH+P%neY;@uP;PIIu_rB8jcO^cgHx5c0u<%JXo93%t6BQU^LU`b%iI5ZN57*hsjAQ z;Fl|{1$U~ormd7nbsdImZ=cVx{`zoapprQ4@z-dx)gXX*kL4aXF(bTkr@!tuztPM3 z1V=A|VSBlb=ngEP(Qzqt{i$(NafV?J}rF*#;k@U42K_7EO={w9|N2H_m_OC>SC zkIbHyA}EDNMJ(q)ovi0k?JP@C`NpNQNjdDbY#HA`fwNBg@5^J&LDQ9t#o9U%4;IAI1lV4MB7;oZMe145s`XZv$Jy2m27 zeq9^+%oWtu(H@H^VJ`Rbnp_8$7(PM`PgXL79?us)@$kj?ApIdP{&wGgdmGjCgv`X|&6)7GxCoIa`N!q(bB z-rM!8F(sE4T1H)S8fBoZOrw5&Btu$ zwTy@A;my+4VCG)bh>t$8Oql(XmH(-Unyyra$ym2uSI@Uptj^>Ff!jw(-s)}^3Qq>hJ6U0F!|`x1_= zrVW1rAD)k0`UKaHw8gpz?22svB-VKkMxYSyT@3q5d z;f^Nii0*0n!sA34#b2wJYb}ovVYXI|2luVR{<`MAEn3h5meofh$4h9OMAEDs?Qjo0 z@dWMY43MK(#bhM>U>3;}Fv5n$^}}D|+=G13DZmE!Eut0-py#+{&Z>FS_Y_-EYf;a( zSAgQ8R;oUkF;H`$dK)A^IqG1RtR&HGMpGhD)>Q}CEuXTbRv;q1JAWTlT>x)8=+zHo zW^rC4uFvC`7L*K}^Z1=3<~6$_>n>V2Tk8Z`&YrVZ+g7uu?IjTfl82L>bSnPm!|-mJ zzjSHjbp9C5%?$V7!i4^I4b08Qc@;n8o-?`fSad716lc+*W*o;=WD#lmxURo4KJ}LL zPw=K@NmKhJ_4Wg66x*(Gyox-GXX}eW_KWn-MV1*nk4FGZZibIs*?1e}J1Y#mmZQF{ zaoO#>S2tq`&vLAslYUEPqXh!>=#Im#HoHW57As(S_k=8gzkyu759uH+z5}P3OUgT` z1*(nlOVZXkSBG;w8+8U-xPwh3Q(4VQIks3|mrTOQbe4vAZgJf9h-2s99veDGx&F3` zV|rX@dn>VEO1&IRCc~(ax+0D|{bAm41(L+C4ABHnFTRsBHbJqs_pYYE_Y zrEEN^TrIvu{5qbZOi<6YbY;0&1&$Rz;$E)q=(xcgwEb8x!&h0)$PdET8o@3uxL9(tuBwqZcqM> zf|{|%Gg}J2cC2bk>Dw7h7FXY;Oc5Qp6`N`)@W9dV#M$r!Yf}||`7F*G4GVh?MyG5M z74I0CtZ`o)k7Jgn^(H#RhBlS<+tT0)^$z0zu4jm>MDx&R{59HY714&*Il7??hr5mG z=$%~*&u^qx+L4#cL%pfJ`Gu6nh|vSKy>V?m;+R-@TaXND4`{Hoq#32@Yn7u#uDCp> zK?5eMz!ePjIK*D~z(nwJ*w!f6Ss?nlC?W1D=i$$AHJtN`zwKe!iC%mS#kstU53DrX zNIwnV!99E%p_ip?J29=liJ7uTvHsq73TuLu(Xob=c|dcSy>J2eW#tNNIai{0ErQiZ zvA+&a>S%J!&Gj1rUz|xhJq!zMqE+$4#hfF(-OdF0CHRfr&Av)&3d_vdBhF{qMf>a} zQf8)u`Y_LfabyaAqtm37 zE%Ywqq4kWF{`|!gvsIG~U8Rr`FDK?Ug137uGNyS_wow;rhN*k-2^`{!Q2S}0LUc=Z zPHp0Vqpo}RG%fgkepC792$C1bASC%x8dN=8}Rd6!;u6}@dl>nt#zUWJT1h2PFpYKs$MGQrA>!l zPc@U!weAWUY{~gH{sO@xw2HHP(N@94Rxthq$aS96r9`@1ap~hA+>F9UK<2&Zz!%Vh zZ^8+!H^pyPCLEOGK;P4hm1DW;6O?KUY#WktJ>32da$q=&Y}Sh_X1nUEf%}f{#MQ=(5nutmT>~o@O!lON0CdzIqMv!QD9c9 zM=L?APH&vng-CVe`E27d;x#>KqV)xG2-X#U>q0&jp|Y+leU3{9>6zhRZWNeX z2>ZTHZzsmz;CB_BRdE5Hgpu_Qq)Cp*HL@7!7zEem=lJW@KcI}KVNN|R%fP(rr*054 ze6(o5D;Rf;bl+=x)Dr%SHm6^s=FSu_V`>XgS@GoCXgg}*Y^?i^kGC5k!`NeSw*9XE zOZ`_!`aj|GD4HziqQopA5Z*zo+5@s*ovb)#k1ND~VQg`i8qq=ZXF%+!@b^XRnTx5# zG`u#S!yYoaI3{rz=ko4b%(oYm?Qxn>qR9%asj#KiOpi^!wU6pjkq zZKTInuvW6aZ|Pdey^KCBkYCWoF zE3(iYII^p23kVi_t^>KGOMCBy@a|*XfwuH{OeMnMDnl8GkU6)2R5{hs29c-c&OFaw zBNJ~GG-a-lYZo(H86R&GtEMY6ot=#4sjky$bvYKCPKNVh?i6zcz-q}g!aiPDX9u+Y zDWll<;xy`RoRywJ`{)K;t3al9++xnZ4j-HK>F);_6MGC4y1uv`8RIG2IzIl_I6s;v z{2bIC3s1Mdzd8^9+m+n;3w$B=*+yG7SXoY$Ex=7ZX!NA%_**;DUd|w@;QYN&ARzs_ z`HuUoq|Imq|BX>MfpRFJ#b*1hXCky^SV)wm^&41nra<&DxY9OLV?PFM$J|HfO&nDJ z4352kv3pEdOT>fqRe(VLCcb@Q`Xd}UJc0d;Q)DgK?+53`qkX!5QzeSO?2A{dAcx?& zl~{-B1^Oe*gP8_Q<{D1lXM+VOmRryu;~F!P(_4bSNj2E{$FAsMzH`K1Dy zyP18}T+F_+4_w3C_04AzEk7Y-j@E4WXu7gbrqY7*K=g2AnX8D*BHxQ&W+;0(W(3U$ zv@x8RGX?(+QqLWfIUB1{zuFj{en((pF@DIsWbHgd-)w}@kOLwquUdcdl`s%Or^kwtw#4Of{Nb#~22>Tb#1MSp_6gsH))o4Hap zT|=(6Gl#5$mX|i#S%F#n1bmB6F{}@_#imCxa!ckcC5DHfk$YWdM1QIHUPJBtHAY4h z??5!8kds1vjn-WkT7%l|eXc^7=sST{cI^au$JL7IkD(Sz`v_dFtw)w~VN(4HtdPog z2cvAO75s{`@d2so2I{pnxrWP-J}=W>VkPX=d;+aAnc5mb_xE&{23oOzn;GEKPkLJ5 z614=b)mJiwGwb2!yNj#7yiOk(5$Wdsmm{O*CYS<5);C9VI@{jy5u5~a<-Ps+TgUO9 z?Micw!NX_`YZ%Y-neE4X*_dVHk@Wt?x)b_s_jPkD*3XD@BDh7dk{x|O{Q5h6>c5{v zi#?RlwUzil_=!1(K49)mCl=h%4lJXMTgco#_kbEv^Qc{anHuG|%79ws#`vqec2xN0 z`o<@M0{y*Df>OOMU>hV1hnMwTs!M3M$_wJT7X;~9P|FStFh@-LR-D<2Erh?Uh+TCr zH3hj>U&wF&eKc`GlM*yvQ9;|VGw)0GU1SOH|6<|5Ic?Hn{ zGj(?IG4?u7_9|K58SGt;S40i?q59g!HCv-MGEc!4+rQ#gMB@H!JKF0YU~VCX z4#%4Mhu9ka7MpqZ>Hzvs$MG?mp+)5?GV!~UWEvuG zC=U$5L=x97|jHm@z7@|39|QKDMvwOwinO zZMU6L6N0q`cGt|rPGgdmF_~mwLo~5O7FDU}6w;{4MlqnKIB8J?CV;b!W@fb#6tznO zinLqNRhs!HL}G%LCSEDhQZkYg&2~f;W^7EldkX*>Jq7tj0%msHQbe~pV_Uy1z zg4yHS*fYRhSY$Vbk4-#pGI7B^ySUkBOK;5*&UbH7_whEz&ipz&!%%uZ@V*WnZw1~Q zFvgxhI%^x>NeonJa+F%Hwcz$QfS%O77g{wlZ7ce?okh;GMyJ8=5%|4v=A+#EGEX^8 z4xBy*b-APvEE71hmK5<1aUYB)8!otY7kBPs3`h9f$SArQsnuo?Wln5O{uOm-fpHB^ zrWIk27bFeY4*VBBm;<4O+L=~d7ZcPk{O(hspS&xdiT|Gm|NpG|kJbM`gZjJFojLbZ zWKw8H-3cy4t}oB^Is7NCdoS-vJ@35S@OQ4H9*&?Hx=xm9GL^-{+J)7BLx%Q#D)GM(SzuISL}UEY;DIeI%<+HKyw%h5t=GAe4<7+Zwba#l_H z(~e8;gwK%H&~R&G&-x{dw)}=RQsmf~p{Q5b(LRVy`aXBi zM={4$nO6b6qn*GD`kK+s_Y2b#n_Q)Z5@&#G4b+0~b-_jL)Nuif$PAt>JURLyl{ZRO zPuM}pPM7u$Ia^B?*_qHi_2leo+V3+jGSP()FQ4jj%owm6mseO>ZpS5JsX)7c`P#

9wfX8FiUsPYfHXaae>gH)r@@rC_ z%KW%z=-%5GI(pNELb= zVOXn9&GYnaJoEi@S^kP2%^#CLp^4iD14^=2D)3X0?G+`!l~y zxuATwjWZV0Z^BAdv*XQe8wYbUBB^!l?5zH`g6b(=uJ9b7%d|1Y2qybBh* zz?JHn;<1&!W_Ee?!%*5Y;g<>i#5wk?xAPX&P~v-V_om|la=|*`TX-ecG(MQ#*QgE& z`bc=FAq2jH6T;Sd$P-E@#^>Ix1B}2NpO6uHKDE8YIU-9~Deh7kcXQ3*lA%S;a=l)( z4}j`&pv?K7YOvn#j;UEI?53xD2KcNG&X@dic(ZAzeNzBg`&ATQg zhvYW-%+`OWz9qUumN7wctw(cPY$ot&TX2OUC9 z=vm4ZdE9JhK6JeEe0NWH@$z<7N}5VtDl(FUYi%!(c^Ic&-@^S$NVPnpU5nsx`r+KQ zV*>3&PmXydj+L4xBAs)c*~w?FSWBhO6?vcZ6-d9IpXPO%`RPpFz@xGTdLTzhJw7N% z8{{pdPUfn3k3L3aMB8eQt?0()cKjK-P~?k%$z9;_2vB^0aaiBD4O& z&~*blr2_kdO!D77t~IowXGGh{`qEKpg)_ATCcr&2Y%-VXB4agA!u`vPZP=S*g*evc zkcwm7Vy&yM#oADV`OavXlU(C!{w1qLX9)E!uWspWKJ)XGmY|(UkR9q5>ZIJUlV4Zt z|2(fdc?YSkT`6-)nJ@PU+}s1CM!;@!#{2NRtU`CT>M%N^6s-X(pqLeF=Dq}W3nN=B zM#Ymq<#W)y3ONM$+`-*4!FTNChC0>F)ymX#e4_TO7POuk;)Y?ZX0QJ2I%my^_`ptV zj3uM!!QsQx@=2ZD704Qe^Xt1-ztPL6C&s*J_h}0b%*xzZtgH)vX6{Sn3j7P8t#0Nz zs$pV*^;$E@toI;MC-9(a&5aZ@z0tGzy}I7l36#n}mmN^FNBSAPTu~oc59@3`*C=Q1 z;(HG`Z*N9@|LWsXyOeJZ!dkq3#L1zIH_*%V?z|4RXgezV)x`C;$ustW>F)EScl;R8 z(uZy~_d9$dLxn%sA-3v==r6y3mi6^nt*orm+aD{BzG1EcV}))?8G|E#6MOeO;~ro& z4{`2T)oVYAh}AHP1z)LFBAB@Xscv@p4pwCct4SOPY|9Ze_~~fGFt9dm^%ICxP@zj-3aN`=MwvknHC6IJ~q6>|NLgN$ho8dc5C9 zPt-3t#VAhk1pP95%8JltXM+b^jgClM6Ygc?P@ivPB{?(c6CcYktCMl7=YgFWm4_IE zQDgb+D_mnNLoANyr1b|z73qk z!;t6k9=UdAKx;h)EQy$i;bOiouga(Y&RycT|F!3I5?AN9=ww1 z0OdsZ#G`-ImHl}78L2jBS{_2HGuAKRA9bbXNyt|tUlguPSL9-6WV1)fhz1jgtd+~r zlPTpY@Aw9Yy>)ce@`T9Kj>-Z1GiwhRAvDj*%3I;6HEHKsInFmY;}z`5-|&nn^ac6! z>%lMO(u@#@nQ6zG1y=0?Dr)=ZfSeZWTg-igdu2X{z8qnR76@M2&)wSA?Qtb{5Ldx+ zpYFBFldS&xHPrRzVb`w3(=Y(fbN}_eMn;;oDPdb^oK5ez=czvCow+~0HR2D^7aOL`5(>JzLf`x}7AWLWd= z`F^)IuAWG|G>Owm?e5tt-*&`CNajZ^&NMSJmY$G`9ifKd(I0~0e^=Zk{om8m;2u`| zaP`e{7#rVR(c!V+^yPr^WvE!~)fy_alFE#P0Y+ht!e}wSORQJ3Q#-*buZ_GK^trsqw$u>51iN%k!Cjw;2-9Njt@qRM$~BlpV6yR!Ii6sYpI8_$ zB03l2lZqyTcbjS2S9QsU&_nceyX&!cvDR%BGVd93w6YVcG5-6(a%ozcjE*b`BQeaV zbi_sFU*Z+Gm^u5M=Htq(4){-Sk_PHtExyF4r?GvGZ(60@LN z>1shw@l40jj%(q2a(*$MyZGX6te9Py>|Zei7MUfv9F7z zl$0P(kY|7wr&;5Bu-Wa*`2wBS?L|)0 zXmcrEk~L_?TY1lzyZ)vf5hJ$ifs*hkD0hzWs;z6`n6;IWU8!P{GW{{~gqAcU^Tk{VnF)kZ}#BiQQIKui%+hf9B3` zTmjYipHLe{KSQ&M@7p;?@97iF{;tSIFr(aV*nh*E_wy8_&S!#OfWZy!;kOUy|1LJR z|LQX#?#dbRpq2uX3UZx-52fD)oELYSJAwD_yT+1@ip|;15QR9$~E?;@fD>isv=B70>27@Qg7^2?@h| z`n(J<_OD%OmuDq{T8mi+N`)`8zE*=N18(Vr*B8Cu+A~;;`0LW&p!Y%F1AaPuh{iaK zHtB(Xg!5+NyM6~`1iUl6hOKrf^z@sUW1ZGME0w&OqgTQ`z9Sh~mjUqn&&gb~ALv)h z$HqackBtY_?z>7ng{Gnl)wD%T2}38SG+R?D*oo!sB6U7`wHy zk~jePn>sw5aDrQi(?%?w2UoSO<=I-YYL!^N_@>lEd<}Az*2>-Rtsc(&VKIudG4S7d z@2uJ~3OdX^&HK0 zK>slp=OdtW9g@+W@T1io;z8nb^w#EkYdeagoz}(&E_%)aHRN~471BWt3LQ#Kyu^4d z*4Vv??@?p!f9=X8_Rr&+7#Mf&;@ZSND9vtO>YNAA#ovcN=_y>q8dIHEx@tUy%zYnN zQ-D$*@YEYeZgAe!@kvu1*2CM|ol1!gW&_03$Bm6LWx#xXrBa_wD=UJTz6GFASIhEf_m5-OJu^fRj)`KEQFU($ZpW@s!9 zPW?Vq^hKy(QVY&EcaM@nly&R~9P2GU+pXQoQ+(HUXNvXF?=ZqhmGz_G zfti9v(WerL}|v6BIfLBllOzu19E2Lq`o4@AYh%GwZDOTJXbxM-^QfXDtM+? z*PH?7g)fiVFOHi*2v&+YU}=k6^O}R1uwuKInmU`^3%|}wzn}d#mX|%X(w2S&P_2HH zJAm{#zD?#6uLeVT0?-P74_ZCgr~gDhH5q-4wWuAxJhT)m#FLB4bCtgjft9hB4wyJo z>+2KF+6L^GA_j2WeqZKNiK7?zSIMoPWtF|MfCCuV;-=#=rp9c|o>R6)?OiLi;5;AV z5&nCt0^)_X*?DheHdROQvja|Joq%~Dza=llogwx&t;&_m z%o=*@gwz$35@uA&b?pla=8~DD-EOs_d!r=O=kQ^t-Ra(6{mjgW!8xwl0cLyz&ppR8 zhJ)M67ttrNBT|=?E8CG*46rwb`PxzU6<(rK^Lm9AfRbkt$U63I%*wojoAH;B8O7b* z0c`-f>yBEQuvB;|5VWJapTFDVpotNO)*U<;JprB_2GSJZ%GSU zg7Wj!2#l!f*)a22i|ql<#ZC;rbH>HR%7=`a04F7;eTIzSC5Mz#Yqh!?OJqfLq`n}} zG&&d9YgMfC>jm8`=>dgY*1?XTR1s-&KN+`r5|qBUsZoZ?&;TxnNa3}+(({> zT{E|#5AwV^VkBUd8i`p=%oE5NwHBuifHQsQ($bGslU>v^TDX*JvVVpWq|K`nhxC_< zk@`Hm(;(N}&b+l8jh|-uZtPNdf3LSF}45p@(;KcFwZf!-^EN{p_M4jxE735#-`zuE}6 z_J}%D;+U4NwT4vkcz3D5E-8`8sqgU}=6ReuOp;d}I0?Vh($1WvlSORhd#wb<=BmZl zi0*NXl39#2b}aXEZ(8^ZN9{MEwwgNL?ZqrqJ0v_3UhjvRDs3P}SB%to981^?T4>JQ z?vCc+v@mI@igjpkv%o3q;E*BF-R;ymk<8h6k=%;toG50-I5U$}i_K0|a*|Wb6S+-y zM&}{+9sq7*e4kgPq6qx;I|goHT)JQ(t=slB~ByryXHBoV~Uw06@$}? z!!c{SoH}Ob5a;|UJl0)&@2$?gU4+}TV&qcR)7zZw2l1DJKjp`l74t}XmLuzNLEPzei0U*=rB3-a>tSO>I> z=!(}9a9FcH#OveCXgQ;iW(zA}kGs{Ohq&j_G3L#_A~7raSy^$ZO|pbfMv{HEpc$@* zkBH066n~lC<10C|l~^|>G-GvyMy^o1k}*E+ke~dwy(2K0NTfbztu>+I-d!i)$?Q-C zwOiR@EGj+x))D&j&ogH$ym#gb`kWS<3x09F1GAz;G}fViENv$_k6EbZj}oK6N2-U| zTmxdrV8xNZ-i+^|!@$`|81Ri`zat1Mg>@Oc+2_BQp`T2bza@ig|6o&b9a-sVW^E$lcm#0VU(8Ufuc zSRXAEJ1EXU|69>6#nv6bPsyz9GQ}9pNz#*MbpHa_pybvsCN_rlzr$I+jv6Yvzoj2W&M!8hWY>IQb;bg|m`uH}-`wXwcd|$)}FH+t5S$@fV z$*9f@myDhKzGK?U(3)s$UFUX`t#LE`k>2$oW-5Hc%^M9CHV?% zIQVgByH*MKGJY4GG{SQwUK61Xj;yAe8DeS^?j3WH_b0$!E%MvK7Qe_&D`(M!s1PU> zN6+Aq65GsO6S~Gmhzl0I$JDwq$B1$)BgQ$hJ+kF3RjyGfP2luvyXDhR( z?UL!_KUw0+(K3)Lgt%hFsOrT1V#kIaU>E zZO9qN=x3wkH|ho+$aR3fJV@Cq)~UTNm)~-{3n;Ax1GSB><{xvieV4b39a4xHLt9ua zwdJjxA2wFQuRX`}iSmKr#>V@=+^c!A)sfGM;rwg%Leg78OHD`knA2fIMy@vicBVu* z7o(bhC-!h$4a?j#?I$~{y$GjxoS6^AsH5lkLN9~{=F#btk;6H$ij;Y*jq4=F#yL{9 z7G5uWSgef>9>Jy5W}~BG(t%fG21s)yzoTA9oaRNIfw=CyLhs=d?F~#(gWJg5SH>zX zX8e2kt*jJc>Udf!<}@1dp27w^g7wA-Gly?}q&#mCd{rwTW+PuWr<$s7RyuM<;lAOC zfEU|&BeSK=#MB!mKAW#^)|r-`M{b3~vb#{(#xe1JD_A6-v@`7M<%WgnE|;Iz9Dt3Auj z#e_xhZ(|?FgOi)RvlH0p*`)_M>m9M}+OzdKMobGVw3o8)>Kh|+ZFvs=TWK$cx7$%@ zgYg`-m*n@U$xkza{oH+bJaam#G+@&|i zB_G$%rVJX6&j*3(7FNh{n5}J|A`LCY#ww?}vtad+_(%!}C^j*4xjNb)~lQa)1Qprewt;>zfgdc z!s_g3HL0^y(fOJVK*LaX)0s6YwI@5Mx#=QCXvSQp*u0w6k}r>Qrx(i^sB8ncuMf?B zEvLcLwZs$LiB&wlj(^-Mfj<7FuZYp+QyWiso`{4nIso67gChCBX8DL~lKRW8CblM* zegk;yf$HI%yo9q^8L5BEd%Vg_B)x7%Om+n>v-ar?U`2x`74}vLS^*c?ZBtp|z2y6P z?p!@J`q1(N3s&F*6ypb2OLI8f=b8?U$m$X1r6fAY>;`xzpSXdHopa@BbHM)+e&TOc z1EJf4hw4Rr;v?CMVX-=H=e?Z!KggN0f-azc6LYfTb>!8L1XbddDFsgaTl+> z*h*!g*vtLByWHU1^X5NR_1Sq3%N2HoDx=Q`L#5ZaUnXVyxBz){H-PZ3hq0$BT`HnfOwIEMk&a0<`A zbc)vn%r}E^j&pi>@)l&1`&qjm@hjDDdcFE!vRF?-=2UfXEvLPy;`d?VoGC?g$0tKEQY?=Ega)-0M* z?9!ZajR8Vzh+A3 z22$vCa*+l~ROFZ3bwV4?N@Xqo?;)e;cvQatW!Zb)*z)?oZ*4;BP3)NVJz!$hBD-RR zK5Bi398Y{!&g=bI1!UPt2 zMCs~Ci_>1CiSZeKc1B%{Knx@kqdx5n!>g+XrX~6SdWY8R3NoBs;c0&BwbPFdKZ}vb zo5Vrogx^=QPWC$A#Z2Dh<*rB>bvag#l>IzQFW@Y%IaWj*SzGL%jZUygYC>b;87_PcweAdcsFVuR-`?m4%HW`YJvWLX%yhHlc|x{{IEw_+)@ zuRqBs-cDZDK%4{)1JJO$o1F*yoo{O6F)nySe71P4HOY5n0$3fsYoCI=0CLm7!>nid z_3kE$XC>1bFjxH6vo{02Vo#!7Yzy4I%@_*$#*^}E@LCVtZT$N7Ja!vt6IbAp__5vP zSq&L&xz#@YkP+(ROUT9!dU8HB#>@}uhC7>A^b?|JSzG(n@Re90n7rB^V2Q7y9tj94AJkyYC(xcJ_Q)!UtMbhW zR*Oh6t9}Z6JBcKfWAh)b)P(b#gBGiu0nntIsv&Dn#4B|Qa=nnNDXZbv zP_cTxd|XeTJS=HTjat2lu6lf%a3*jy@{@u(_5R`?DeB`B%;h9ko&@sF&|JUF+pzb> z2K4O1;`1tAe9F(T6Sd)!`*K8li0r_`oCPbe#VENt@oC`@811#LVSB#EuY7r(F&5j zmU@c1N!n`S;SRW~)r9Wrd=Xr|4d2K(a1xi*L~box!QO3*2ku>y!{5R84mq_{0A+;D zr)?g%O`PPxs;|uz)uU>*ko+pOr4E0~;dWK8HkfQr`;Q}Q;zvYb?23^7YyC8Oh^^x2 zM=Kex?gujVcGrRyi>Fyt@8zBsQ=FltH(r}Bcb>C9fkO54XVav@On7pgBHm&S4K@#LlyE} zV?uTeqXvchxB7^(WRRDdHaJ|=KBchJoGB(trGw1=I<8#_MJr?7U2%vry|#~c^?diT z^U94t;UTDZ4RDe-7!UY$)vY%8Z+LP2Nk-ym%pOU<_AJsvUm0)_Ys4UN*_n%@?Wg}` z51kgL^S}IGI`MZ%rRICw$Ief32I&Vr%pK*fo}olL&q&=l=P#L^QgZ^S75Yj19-^QB z7dZzl5ef-kq*aUN{e3QIM@bTQPY!Pn9_y9dIoDWD<4*%0zXRQG1{=WV@+6;j0nyJP zcC)8VS&yE32LH!dFnwFOHNM&FK)u_lRP#gi8j9a)>qbcE8I9JBf3mF~RQC`LZ9Rgp z0FR_PAPMf97k^Ln6}a)Ys;?5UahL3O*?rS~Opn94rD?s^@^1R~V>{aOJgY&>%COEQ zD}Y?*KK?(7ulriYe>{8z?rW0KQnOk5fIuJEXk5zGR=Z70T+3XIT-piko4bmC{%_ri zI|8JREOf?s0;Ma#dnXl zul7GzI**A5Elsq?{Os~xaSlEZB%E7>Iqh#S;PNN zqAk9}{5Erz@WemMJ*{!#&g}@?f4sAK636gL@-Fp%09Kemr=Bi-_$j5N{kaA{|0FnN zmyfML;S+w{$~Su$xHn|>3{zjIVi-Vx(cC26gybx{eH>8^P-9iC+Bg%BcLk$;iMKHO3lZ7(Q`=BIBIEA< z@&#XoinTGH1OLEU=vutLv55a#TK!;(^)Jc?XJOr9YT9~F^cc$jtfiH1jXOcd%zitc z4^%6#QBQG?{oGG|T}mYm6u*3eGAKsHh?RJ$@2Z{KCs6Gz_nVPA)RD;k<%rqe(Os_K zo57-yW*s%!S242+y{kO;MUVXn^7SBh4PSvHmDkF-8jR83ww&*=YJt_B!|%3cK#XpC zq@|tu|HFK3R5@e*mlzQd32XDf|DXr?fKqHN((693%iRU#5O%7NTew4_wQ#H8!Y>84 zGa9gx`2?+U*Pv5Zq1`>ar8jAWd#7fvKPq>N(|e-d*(kmlLP~@xd@t&Wi$eoakGI2z zbnpz=^j*Gvj^E$q`!jg`UIzQMUfGcns<0m2XlQm~kRQ9x5Is}Th=d^+Z|@|#+&W5+ z1w|;s_B1r{(`D`V##YQ(uS zX2k5d?+UO>`!?o@_e6;${(64SP#f4iHM~+S+_9*2D;;~7lTzt&=n+y4lH96Y^k1`2 zeO7vLruj^I^)92##pfWS!mn|T`$#JT%t9*`TE~Xb4wyy#VFe$~r#eF1nR{Z7+j^>XzD^r`?MVp1@iK9!I=Lig1=KzWLp*Rvx#8$KQ=M z9^d_)zKWVm!u+3O_;2d8KY^A!G4M8{O8x9#_BK+jn;E(1tGlGQ4~IQ3m3UIbQC>%& zh=|&0cQ43=&t59L-59BdBXLBSbU7-UT|+f-ny08<0szemWo- z@Qwe#kk6wFt|v3V-cnEV>%0+s?grc4z3eBPbvM@Xb=VqK z)TWP1zsU+#R3G9wWJp%pK;Mk|ERbw64I=iX{h(JqJj1}-Yylx92BzMWo=G(rbrtHs z0@B0$|5MISYgmf73TjBb3JQeIjlTDCpZ!pVUT-`zQ8}axQ?|QXP4HtV!2AF`mr8O*KvatF95c+Pb}1Ma=3msUGsnz+M3uwIR61HHG> zD@M2a@^1AN<@0j2Hg+u{7vyJPRd4I@X}MI;X{?m<6Ze~LC*kc8`#O2Gcz%s|Zmg=e zON z@h5uDfj1#ltQW(kFKBw5+P_rg6@8cHGMjTc$9fwbvWHXp;D5+3xx2nWdpL>d)}L&u zI^#%SIKRJ*tzb>NzD#wpr@(OiMOwgAj|G$(exEx`2%+qY7xJ~mcl;@gdKhTlNN3XP zx%0!U+7UGOmCRqu=tfpp>>hzn4Iv-Dhpj8mzY(gS?j&$PZlDz`&oj?hj<6M7>P)%B z4Ax1D%rHGX$>rUx^dat>d|r#PwTj)bH)ELUHOX6FEBixIo#H>SFk{=UuRIwnWDfe% z&3{n0_9*m5#VzxM#*Htz<3WEz?fS$Av4_oj(FXSUdUxdOes=_Bh@1T_3|vKz3*T<$ zC?ApLQw~UbROo=?^7rR?67N7TbvS!_#>lwhQT7VBA9-jV&I+J7!28DPxi4G=zAdFY z`v#=n5b$L_>Z{VTGidSH&&0I$6D(`~&(E$ae*fP5wS~@X%)pl!Uy1WpPo{0`HDqWQ zW#t@cVMAHZ8k)g`=ZBa5@a)3-5*oqBXaXOBBkDm$U9FG&oiR8zUr7zEjmlX*&0Yh> zJN&jUBq4s&4l!qU{b-qwpVs!*LC@*jRGS~V9zDFx$67~B)7`goM_4K6Hu!9MJC`y> z*9iMqt zPFM9BykQqJ5gU%OqA#H5e1x|1HkD@2MsCR4z)Bt+#M{{k}~$B1Xx+ENR9_&vr_@w2i%DL6?u0J(rV0iaXNJ$H6zwTNyibh(byH2 z`HBr_IcS4=K9aY4jb2Y}bgk??aQT!Qp1X%ph!ffYW30X20;OGM!a*O!sLvr{JjN*o zxQm@y_i${8HCh}TZwK6T3R^NWDHtmwnWbaOD%Q7~v8gSB8~y5RE3rYZf#2E{v`@oK<`rhOfg$=Q_)g* zG9=3yENZciZdBCu@O*V1;d14!LkXuAjyc8{>#*@r&R1he9;P;HhOL$&UV(ZwE4>;@ zF@o#fkM@rFCZ40D2P=+&NV$P5;U8gD<8$iJvbGvXKdXMHp7d;`zw}Ko$=$A# z6Ayx)_+*ejTBu@ZaB1*C3)L(S@_Pci#ZhQEv>+o{@^IHJq(JCB>D}=+vc>bz?X;B5 zy%}p}OMVHuhBkp(Pi7;e&gHD9;!1OKLj*dv(0B_TIQ}(og6uP(_EdqTSTKm?t!%jjqo+Dm=jz z=}GxI#@N-#jiW>L%*~yljC-Eo*!}2MQjT3%-6!S{d?9K1&m6;U8m_%*z=AkGY!hd##p}5fpKL zFWACt%KpG+eQf4b>Pa|(C+(}%FTtGa`6Z%n*5LTiY=1tiTL8Gs`6p=wLp zo8^OQLax9Xg_lD(C_!W8f+Es$lw4WuI9I(^SBmdeb4mqf*fYB;1wqmw}osyLiekvjKrM|6BQl2UH2zNiG z^~GEgD>9WDn~*UNbM~5Q!vY=TUQkU1n&WC9nNSLOAqUhJ1s1^D=&X2*1``yK(qg|7 z16h$4#p>!mm)GDV(Jw3b@MZ3#{%&k5aHovaa(egD(hsEPB!0aXM+Ktej(P1Hw_VDxIwE4zb`FoLtkAem4I2EIEyi(QS^>QlRxIQmK8^(P#q&zF=O zR#RXzqif`V^HMubJt>dJT;qS_Kzc+|N75o7>jhrd;6E~ebqxv7RkHF?3OEfH+YSEM zW!sspWcKW{2Q|+Xb@F4#ur=rd*2ty}`*UVB0>oSip3*>D&LIu(R4`53+&S1`ZxVWN zJ?y}3mq7i^U_Udru0*X#%Am3oIr%90KDR*u={rpu8Xr;luD+w%Zurp`yyI=G>PyvQ zg|ERmC$A@6FMX=V&5`~8^zvJnfx>>up}F+TO9 zJKzR?iv+lizC&Lxi}8E7rxBf4*iS}ZY7d`QRUD~}Fxc~YoDr!Lqzw_((n!MH%v1Z> ztf5h!J;}S;h*H3jr1q{I%YXRbx%!{^Yom4F7w_)7XmATUw1+ke&b~~G`;)gfU6nVwbtmP^{h%< zW#I{CZdb@1)xn}ot;AYZJ8yTy9A|~K9`8fa`RzQ{QZXB{DJY^xd{e?&nV}u(bEVge zDj0n}$-R^Zc1$I64UOS*hx5&@OtJi~ajVma%vWv?ZJOY;(x7LJFkm%D= z>krFpC+R|rR5qw}?*q%#qu%3P{;#ENWWadD3Zk_7@>5SzP8fsJ_Jywa#u_UnVvVC` z1N5LS=Do%0ln};{^<%xpr%yKT!6!Kef5X*~be?^VwKBh6{Z0)?+*YP2!OW<*4(vV` zPai|G&~s`Xt}&AyKD8$Fxt<3q?%!pvB=bo1vG$XF(9aoWZPS+wo?(qva>(=C_c^n@ zTKvC~F4U6jSued99ZlWW@4mo#S2r=Ayk>KogC?H)y|fQj)Yc?+VD&OiG-xqLUJ4-2t+Tlrbb5P?@D!S*0Ql{ zUq^qj8H@~QLH|5mA*<3m_MrTE$^1ty|6gK`x@Lg zf?)5N$f6^nrY~4-sYgeNpsudgoz|?_I?bs3?GDMrDB6w`%x5`IHus2G5ZP3-5FduQ z6WKfbMq6@*cbMU!yfK2glsw)_L6mY%Q<73 zGg8X*gZ(pbhx70jJ0YOst#y9!YCCxPyQ{(dRyHiemIEI1*Q5l9Y&~=)`=N`OywXk< z50MA8vBU?Ug_F!wEygMarMoiR-4?7YQhwb5RaRIAN~YPhdfS`c%?52eMRB`we06jpPswa^j%R-qaB6%CYHhy@LYy%R^Y z7}T5=g%!dt&p?rq<@aiyPzqCgb8T(pmfXE(tlb&+z z3Nhpy>t*ypttP0M(fYI=Vua=o*mr3a+R+K1wi7x?4r7I`Rk`l>x(tk019J>Q7Osp; z?uomOaJ5yhn>lZUd6>H~2b7G9+enETu&l?d_N@6X@u+P0tVIr(2wPwZ8$#?(>< zHg$Yg2DTn0`-3~@<;C8av0pmB*i9#FhdwB$VEIYyN6?*@GQNL+R&w8kk3wRcVZ=Q? zvGE-_@{|K`XXzOl-VU7i#i(Y>C{XC*Zd-s1o->}FQhJK#8%N1K*Pv@TC&~)X>1=eQO{7T8Z6S(bU^F_j+r@p6o{C)?>?#87iniiW&mf1W%d%Y zU(^Y{E3 z+QHi4gFJUn9Xub*^oaSC<^wsh-cJE{=Yo8ID!~fnO7^anLY(0#uF0(JQP+lZ!1Y#7 zwD!a_H&=ShsEIo{ zSbb_=QY(K>|9(Irb(y3D?GE&-us@P2>So0kKHXcAJvq?3m;)4or&h~2{8M%MXU$5{ zGj3Lra&>^!G$)8%-mt?DR?C>%Ty0N}W7R(~w?%}E-=6Vteu&U_@-}H~D2Tni{?z^%GsMuZDYBlAL`EF)|omk1 zG4q_~Sao9zbnjqIt+IkzsKU~p>Ps23i?!47g%a%e7M>6u~w0`nLLZ|s&bRVs_#!nSkJl(R!|Hc&&buN!A0JfLgTn(;FMQUR;|RS=#I? z(8rWVX}5S+b5UG#=_Ng4auvN7cGmSSdj6=auC;Bn(TC7Skq6B1X#8FU^tAP^TMVKbFcMwIPH@KIS09rpeKbJ9oZ++0s)8hk{Kk?Xtg zJGjWaHJ`^9&bhK5g?bqjhYgE<1~tLm^^Al)U9jr;rZ4{LMn9WnCg$W>sa(KdEm(2h zEDF0350z!$_GY>)yaX=T@3FhFC$-G2CV-+M z6O^7^y$k5Q_JDM+7$Ia0k+d|Ymn$U3CUh{f1Er$$XvOZQ?urWhv<%La^$n%13$5)8 z)Mj*K9it=y0tF2-f5&;s98hJ9aBQN?VnF=vbi5h+&&+x?SGsvW1cdrnee<4M zN&@SkF8v?U61Y(Ia<0+{%{Dyb=Yi8c^t1t>_!DAZ?mTAqLTc==!IX%{8Ks$mM)uX% zd|CZ-OW=@tleIf30S;hQ$=kIE6WjGlgSQzOi0Y8bKviph-p*&XW}b-W(x|>=Ee|YE zFb-Pl%6X^k*#}hYL#%D94{H=0F~2uGUdl;xS-g*wY~7zyD(_3)3Npyupp*zb>}FwY zo*JCgWIfRguOWD&IYY{|bF7mwW}~Nidb36gKT_$zYc9p6HkxPK?GNcwcGglCUhtys zyPB)bTfMFtGeb!3AT;#ixXKwD$raDv9)~jGKff>77*b&S+xsLX+M&znVV!<}72vHJ zw|SojO7?WK(yCNH#s{U;vCGO7L9%rp9g`9QHQL>$$g;2 zO*6X4-u3ArrQ&xx8vh3~wHEDDZ-$8-JK?yoSDIOE+u$!ZL$lJAF%|blaxeSM&{W0; zU&afzE~x4_ICvj%L;DLGH!-4fspvtDOx!{)I#j18)~sCR5}AKwpEwF=KK90eew3){ zF?vs0Tx4E-V33p(Q4rSG&&90V5Okzx%vgC)6I6s;s@3GwM6A5MgYViwU{c)UIwX;P z(WU$^R=Cee_~D^`y?D~Q^41Ove-R6^pdGFsjUPiAqn*ztBZ-tssEwDeTI3F zEu#O6e(=CQbu{xqlu4;qwHR;IPY|17{t_$L@>V`O!4#_F(dwF)x23Uqp6<<)bQHJ_1##7k<* zS4(N_XX35rX%S0}KoxnUeCUktSV88%*$WYQg!fUOx02`xV=$}OeW{c_=BQaeuTSIz z$Hqfqy@+jm6S$F`2cilD3e}E^G1)(BUXD5!qnr)LXH*#>wyssL{#1F0QDihyE-P(* z133BIZbq^g+Oltk`vRMh{$gz|%F96;8F80NjJ#Z`*GF`8J+ySG+C(Oc7LYko#{SHJ zH_OqgKw|TDLDd(Yw3EA?WS2YP9Ish$!Oqg>@S8|c+O^|&lNUothw!Ma1}eLNf%Xs> zO16sD%m8{`4|=S&(GdSz>t`LqUaqnF`xVAxbK~cqeko34wHIH5bJnV<09tXI3`&C`wW;8mhd z>YvLaS3LihZj5y&PUP`67Esh?^q9#X+{0PEq3;7vH8WKPnT4ZY%1rqec|XQ?v+2d4 z3v`>-7iX8Fvy9ptQ0$<@HXwE?;5!*e7Jcjud+se^5;eM~?xo_Sh-Lxd;4~mJahh-){mltvlb(Yc*Li9|F-2 zIm;~451}Ibw7lzWGcO81MDQd1NQhMJKh~ z^ZNN>>?Gp)@t(Tcgnkcxi__D*%dN!pk%hPp9K)ECSYm#Fd16W(Egk%_T<_J=%J%rC zXG6+DzX&^0E@>68RqKvcPkQQnYN%qlbeA;c)AirYa$NgKdNVra7}ZXbvVD#oX*)G2 zR~>gh&r=dQDl>92<6c>#*GUeBRRqqAKq*$`Dh0&fiH?-eMosmo()F0khSc4(>!VYpIMBQnEG3U6T`9YyEq&&x^SO5>c5r&{ ztq!zr>k+&P+I?>_L%R}f14n<(3R6oIG;jY(vk0s<8V9TOmz={oO70e;YO%7;bsGdq ztWEe&t(jI2{5&vu6=>*jfQtgB8EEKjp0=Cs2YAx+VALD|?W<3zTZqL<1#NI~ z4D5!NC0$L(;UeF!ts`PS%+2+Z!=wc^4TgL5D0-TCV)}BWB9G`Nrvg8uOjcI9Go;xT z(uq) zD$cqron`fiYu?5Br=9`?loxusse)_uLE+dL7%%Sl5~iITlg5%qCoUm(QYX}^ksGNC zs`uCIS*?ZOPAoIv?9ZVBG2k1_YK-0L{uBDzQmD;3lW{ESk9qHD?#VL}N8{P2@O#kD zF!EzugV;YAEHqQ^9-u9j2$S1+%2{Bz3hqOm0y@Mk_#tkELLTOI7xF3X^(Ub4?9%ok za?a`(X+8HmdIrt!2YlB%k=g#wLYql*C@{NZJ%LmUnZ`)PI-v>WRl`|3 z7DwP==_!)t67B(e&s4weW!`TwuQ{N#8wwOkHvz+8o~%}QJ>OnoUEPhkRDHENwp6G5 zk|L*gy$Z&t8!X~3T9Avm*BI}w@NWIx;jl1-{3_OF3hc2qb*R`sE4w*s!|Ovk!1-E8 zYISOcN;K(DtxUa9ue;f2^V%X=Z^#zbD}5MtYLoWV(%u6nrPh==TDWF5q_nWA*&0wS zr9sZM0@>c9yI4)nM-Bz0OGRebNq0&|eHVHHp))89S;jM@tL;3A6$sn}BWg8G<3sLX zE=F7kzHWbgJ6dijA2bxVBWA6(CGFzr<9<9pX0DXDz?iy#U{>cS^SSB|8R0j%I-W95{X7xxJ^Ql+ z#X0urqNUIacbbDbmyugO2@Lh;nN_p~K4oWdZ7;in+L>Ih#3uYBPoPsShRW0h@k&5* zL}#ItC*z#Qp{pN2U%&03GYX&9(om<2MHb$T4)cSw%a$;Qhq(`#qxdDInBeC`Z}^@u zHCI~PX}LsDmU^zdN?tI5)X@*BMe4q`>-n{(`Ze~`w}P7XSHA*A-Q`s%$hv#!><(bo z(o-KA;vL+_D6c+@6Ht*3w3OA34`cP&`*|Hy^jB0w zejlAu8%Gkavr=jWg-K;4 zI=!eI8(BelK^ zt%!rHtGP2)eY!u;boIEy z&>zs@_0+9mHQbv6j^U1}cqWVt5?RozO$~uLs#j<*0gvs4{lx-roGCaTN4eV1PeZ5b z=zjO5oU85hJIEa5n|(;c3&0znD@Ue~Ao>Q4Y%Qg8hdb=5JLvJd85v<#tM$MiaV462 zR@AidXr+Ox>=<~R2IA&9nMEI7{~M-vPzRwJM&{yTvkaZHN)L1>O=s1DL*(-RUtdGCeygwAB; zMd&TZiR5)2*8tU4=4VYr+O=S1Xp=EB>*M#rTj(YX_U}bET*}IRlV?bGuk-ynviG{w zL7=4Xfg=NOP<2Hq?J!66!s6#CRuc8G%6ewq-Ow`@2WA)vv5LkX*LvKBIO848e2cps z;W^TT>!v?1<%zN3#ty2}6QLa(o<`2-w_{lHVsh`bo5TZm^hg`5r8leprM6KtI&Cc} zK)u*bFZd1`kD@k})~faY84CtG@Gj_4v~E=&i1KZMCu_Bz0{`@$sEw$J+V?;|3U)J6&Hi>~RcpgGSpoquHL>}=V8TP{;~%MK68unS z#@`^$%hl{u>>kI`qB4(&A}~PakWB^uRGu0eRu37i{tp~kUCUb1n`4#LYW14##4h_f zbg=bKYA*kChV6?m_{C&;sY6C%e^{g?l?^eF;e; z^_<0qvew`!VEHoC@;JUhy@u{No0WCXW_B!ebVG@qX~A%5$!?Q+M5Ir;WYF7VYp1&_ z-CaRXz(%?cIPf{_uDDWE^818Ja49vb^x*ryneOgh=?)r0tkh9PxC{tgi?ymuy8-XV zt6_iL4Ne?o1$%;rCQY?;rLJhi&Q}lEp><}&Yy(H6ym8>JEuv3EE5h&c;v*sP)EV73 zAgN2-&DgQt2_;8A8k90kEEnIB?w}+q^5m*H$H+mj=S)ftj;^&>qib(BBa zcgR+rmTTm>lRG`by0_(RS@2E6G|+v$_8meQy^OXdcf>M!XjMFoVJ! znl~}dh%7a@%5zc@gme(*BhZ`m3$t*I&0sH4MlfHTF_YF<*Ta17Ca=jJXcz0GHur^m+G zv73%v#L-96w=X3UNo1$rg|W-I8dwF+lFIoZDzf^Hk(vMmMQj`H4ok3!6D{efcatQ?;Q6m{C^b8(~c`( zo_&*~R5^OqHl&XOy%PSJQceD-%+U9-AL#ojZYycvBwfLK%*hRTXXICpNOrAPmLwhc zgsc`!i%Y!LXDk+(q3vf^(K?E3UhX}?e=8W3qi8$GnuR0{rcSw?Z%R6|^S{B^tgqIK zYOa=}18eG_dyXq((KTJ67@bvdEe213S%X}mzDO4*a6%lhYn?mVUE)E8oRA zxs}wYR!(2CvVpZR&%;b4`&wm{?T+A$(&8$xeTFq6+oPZ7CU%1f;X!QZO=zVZ-*Pto zO%4vHLniW)kFXcK_OkizP)FEtWEv&~>IwS*Od!(_Sjs!C_cIr=irAVuy1rdGwV899 zBBSRc@O~*rSr0Rap|alS{jGg*C;rSAI9E^g6ldAP+MG^n^Ni@;j`eFN@})fGEYQj- zr;qrCM+Q3CR{fac07tsuV$zWLb;jk?g5=0Yf&MvYY;V!FQ0p<~CY`Cn z+5=Kwij-;f-T?e>h7~fdw~MZ5dcl>Kt|0OTYE&Qe7hbUNh)4&na7ZI+fIKHU3k!pw zC*~a7Q%!mp47yC_l$=z(?=n}XPcr>#R+>tw-rtOqJz<-Gk8vkxDWH}%;Qr>97T~Fv zk&;o&lE(cGb(INvQYgvAYHRJKTK`jN7)IRJQ_by%*{gQnx?J`$HiWS#0q9?^!@gjy|^WpUrr$QR$y3NCZIVbisI)wCV z-mg7b{6|ly6fNbcOUMhPFlqdq7?TtjTp+qSww)QXT1F}AE<+Q{$!bt}iT+jZ*w1zO zsdPC_eo|wy2sMW@U!SaB+4lDako~o+u;eEW!3x_swrA;yN z&1yRdE?9qHU&hHw2S)^KRML*3bmfF&CRF|P@A398H673hO!`>Bs zLaVHVIrGZd-3oCY8S>x`Kj#Zj$;}b1}Jl@4CC{&zX@UI3h z47^a%Xe+rd@=Dh6BCBcdLiYhO#`ie$TfwRu|GS$bMj-U1Dnrk6-QB!i0k%VUd?tz> z9b-afn9YDC%37~63ZhqH8Q;yAIU3JXM%(j-f5Bm;L)vgiSa7h_d(-|?&y$*!Bx=6t z`M|%(nbPnqcw$dm=E%Dq9ymX_CsH(yD3$9f}UZIL3`%uGRF8G`iyXP4sevHx-tH& zF2lJ>2`CGHEM8mBgGbiJ4=0eSKZBZTI7jRt2nCrNqfdU08iHluo)(ba;W6;VSlr9i z>mftZE*aCyPKl|!rN7~$}!J2`7bUACf9)?cOLT$(Kg<9je zKB!YK8?-9j^7>Dvxqh zez+Uis$|tml)aAh$V-K0J*x|ABO>qW)I7EEz|evOWBnbm(zcPX;FFQPSt^^S(YWO3 zG1D4)h405s6jV*8Mr?;Uy{Xm*a8K^o#M|Sy9-PFpuA*j$J{~eoxvL(p-)K2kD~(Sx z2Jd>Bdz-14TD)~!Qj%xuT{g<<+`Qg+N&1hBl|Tvbisr*GB%SBwfxZ)w|qh z)4XOgL#0FGq`zSF`in*wbLppBrA6w3?MNH}e`v z4Iuvi4ZpR^jpM!rzG+Kc;C|MLeF=)Rrd7WY5|4Lx8aht@aJ@dhZiP;>hDSg74~i74 z_lU>{F-T?VzlAcMEn2bR;YBJjTSr{pqju9os)8jAFO2-I`E|%O zX|nZ|GQ&WY9YVu1F8o|k^(J=4MAO&XYFu>9oze3;cR=Y0{FHWvKUY%FQ^A!u3Jb~G!B zdazWWWv90}@wlJ$rrHgvLJmTy6UAH`V;|a%`d#&&f*H`M+FIffQ0Z{i%2Xw?++UA; z%FEG)N`!$_uGBNj%?f6BZc+B;m92iNtkbXLmG%KJ_9(B*NT_};c|ge3IKC0+{17g- zh;z+Mm)A%QQn4~IF*#+qtDqHz^e3;}4%Bk0C2;B=L8aP9$N5j*bPq zLQp;fUGlH6>un+m(lN)Cu-K}p-Lw|)AXh1+PMsfT(wkaR&v41`I{2#keYsH+0zVNvo~(3UtLyaZSp=cZgQ< z5OCWKjlRL!oGdw%19qCD zY;KQ6;g;9Ao2z&*%j8CIvH{BX^y#r zxBBvAyu%NWC3;qsmg3tkFi(wF4K_c$zoXG&btd{{)q>4vpNZ^HcVmoLZPDhS`v+^_ z9i6$q!Bp^3o8@#!jUiSV+Z3sKZQRYVrmsz$_wM?b#dop)704=+#h>+S`M`R=ZpK#&vfm%WpwD_adJblWB@w0G~L;RapOy z$R{#}^w?`TOwUKQi+R1QtG)U-?pfv&_>l7jo!LQMJdn> z9%=V+q~^Po9wX^hUz7W@X8r+oDfTH{3yI^{h4c&=tV&~c0pxRAb$3~Zzsw8~quIOD zO11V2t`d-DoUQJ@K$}PxG#BUT+9qWtZ!=%w5$5MUq>G`_MXc~9Bw#;OdX)8_gRkx5 zB~@vCYPlK#P?9c1s`f+0(x*hqbLndZnlwbUj}hNK18Q=W=d=&3dQUkm~tQl^SOT9JFOqCLmh zniQ%}P`Xqm$GV4XB10i$gqnwTZdUqxb?^YLQ7X7!mHTE|TcHf(F3>MABi_4sj`GzV z!}N`@KN395tC?RhKLPugUq+bZC7z)yRdXM$SrzfGq0x=l|8J8KW2Ei{&Ql(_V%Dn5 zPaKPu*>~WhYQRGDTCzo+<3GNEapK4GTsga(yDAHdcF}BP9%v6sWy(8oUJq*Y*Q))c zzS_iP7!B7!52reWDzY>C*(H6)&I#P7!MwCby|?;uW`o&x$T6!2Bt@%Ed;s@**hmX*l2isygEP+nwfv+w0UQ3;ntn&Ex!5O0Em}X|1g~@j7T&`bF9z zFW(>&^fsPqPhqrd=upUMWAfQZOCjb_d?jfwq)m;4)It(R6aG@AxHuT=44y+v@|<^| zIU`TC(uII-|a+umeneXANhm)4UGJ*c&%xCLq z@Z$tHWxT*H8V^Gw)?%0$u?8x}ioL(|)auj8dfnL5 z6JF+#@Z+M(hBt{{Mq=3`H+;8HBl_R%(Be`%8yhEe)Y$e`04;dAa}MGLP_;81cyOu) zl65;fqb;%ateHNH%v{z_Vs_z7nPP74b$T_Q+nDPFzsxZ*7IO>;ufm!iK>yzlzO3S^ zYdJo^Y|T;EKQYHQ<)b~A^$aOvjivsKb5n8}Rdp}Ll^n6cK?)Yv^rcE;W_P+~>LJpG z8liXyr4&c5SBDB%KGiyvF~(-(w$6xOC2}&$UF?Mb@>Yz9I~2Cd%oK5Lz= z;D2W|$uY<6_rYpZyw}cUoh~C&f6m%J3niMn@0ViL(*x9cXT@gnH3HB12A)Je5@e^ch~NG%)!JD_t6N=_Pbe~| z8S3O$N6;tK*V1<*8_`j$P?qcJ^U+6pCsp8bVt5F%aE1C9`(Y%`4QQ&bKv(t+z+!Kn zuO`szXrhC#98sO!G0FM7zjg$kK(NC8-)}(~?!UY{dPcc_uDhD3O-9xNa_x9+J?vSy zYP)=Tph^BgPWc%Kw2G;-|bzcv=0YeJ72Y{cEk$ z3=(=X$9J>-N=Uhq{@6L7?r)`~oph9zX3}2Es|T2j5qmg+wkwSu<30zu&Kytk(A0*n z1D<9inZKr&35^(xWfwW#Gsi&6JIO13xh*!kHYqRFczr>oXtY{>N=furXtv#}LXD1o zaJ6yyv^|ZdvZ_GF9w+jG%$}3#lt!sddcF9m4xzW+9Br$8E-+qdHlmk@eke5qy+7f* zWWOD0l8=WjYt)Dd%72n zC`v}V@v^6kIY?%S96|33 z3lA$(I?XQ3bc8YQ4=wlG)DBB==Fesxf}UCTrG6I87C(=^AmSq_C-39)Mb32B>c8gY zmArEwt0lE9UqW8HbL8zj*&0=JXebpQM29fL4=V>&7Xotg8iCeUhewk)I$LAn^195x zN$gLbgjA}(ayxjSmrE+OH^b6^fpx=1M~rmu1n2zET!q72WwdP!4kaJF2sQ2nG6z`$ zcNDQx;UTDUCuiyfQjb-iF}9*_Lg{I>fO8syMzu93Ij$XOUi2QY%}A$F6(iE(GFc|9 zRMO~9G$nJT)Q8m-rFwj#1urfbVV{)cWx6cKyJO!ia|yDRPakb+5))tm7*V8O{$mVE zWB2jZ>LP0=IyUPiGftw^(@X3AWvws)9l6L8(tx z3%pjQ2KVQvyieUY^PTL}i6(;vYF3cng^YY^4HW5K6-(gl*E7CJp5nC$(a`+kY>!6l zGbHOE5O;5@=eWxW@MSNnqXv}{+_|Y^y~DeBat=y40rruJ3vF8a;r>Z_X{qZfN=j%C z`ja{{YJwz1ztsb)msoF*9wMl;Lp}Co#*AiLtodh0zj`zCcq;T}ZBO(6>{D?ecCbe~ zYM{sX)$@}-0=0;jC_h_H2o!~0+7;NRT&JCsJWPy~B9tIfrPjE1rycRhxp0(2EC zznIaSL>_7*s<9poerIm3nb_v59On9SV3P3{!~$P1dSB zdxuZggHUP6pSVjzSHTF+*8h&T6KppF$XuqAJna;GZ4!=@9MNi6eerf2TE{iU);&MH zKvJ#LdOGGI#yC!)n^dar0{=7`(Nd16IlsvntsI!RNfcJ_KDt$L>W>1xZ{2h;wT`r(bWn5iH)=+!smy%`HUoJ!%O zwyx?`bemVJje0fY?=8IsWykME#%^bvUhAAg#+e(_lY`BQ(Yz*jmU70f99xj8`h?tT+wM}z zS*?}NjI7x8YagQ<;z~0gtaUj7?#LU>>@}uM`~i$Ie^dFR)OA-GEu5=4TPh!5 zjdyW}jJr5Ksa&6qIql{U;B>e30wYXLt+uQsWmJl*U=(sQ#pEgEvUq zp|h#=<`a}=A$fV0lq#l5xAGNt2^E^dj6vTw+743qVno5e%8u?gFhhMHO5OeFmwLd4 zBY&dtE5%rhjY6eJRJ%{Ie*$BB5SzH*xABSLx#n|{Zxb9bBI^~tTgS2mF8K)DCnOA9 zTkXo)Qt$Rte7XAB^jHfm@jLZr*HrC5ex11$_TxGRw&}mLi?x-P)XAF{9@U>lK@A~vZ zSzsWmG78it!p>a@Y{sF8->d!ryY{8(98XfJMg$3~z){Y^gL}Ig9OvoV`Q6g3Q68=D z1Mnq%71P*#$|*ff(5#(4phf+-QfuZhsOOqd?~ZQDS0!>#Xu;Q1+|A@=e(T{)?~>o_ zIe#1br@H%zT^hA1A0>--8`Nqqo>lnVmCjqBSh;UfYy)E@uROB2mp8mxy{6@va;MaR z;@BzpA^!%?8U|ugtKK=G=*30jb%yMXHvWQcVSc5Ilz4pm!Ls!Da{Wu^Ap&nPeO zUAp%D2zNWdJgg5k)5Ja^o+)3{njIlq=}oZLyIUXX?kniU@C)+?)MAZ(nfV4D0(T{c zBcJ9jQixZaWEGX0c8ioBycu+=6ko<@%^8v#tb~j7aaKP%^B~8}Et;+;xs$jpjbKBg z|B2yxa%SNL$-_9KmX7X$O3m^X*OL>IeO=zg;xW(TG`73FMk=WMTku;i8x$#b=HXSrAHRn$6=pY@=mR-EdTikVj$X+?9 zUiIXh_Q%zZCvsW2&-EjL(czH}3N~9hcTh3^+C3hj;>7jfvC+eh@k{R+4W9-_7IS|g zZuDU{IQta*SBYu21!=Vtx-}0&LzwvvkNNT`JCs>K_19Q(Rx^JZVDEkMlvEt`wd-#mNeq_s!pktlnVw&nucUGf;m zl)av#r~Uvqs7LTbNL}NxcKw;+Jfn^F1GvDuQpaD??@Hh(s5^5_of%E))M$%HWNE4GDK6KNulCcYORFe-hRdP4 z4_G}kZ2q@L*UzCZV=r%`S-Y3)#_DgF^LAjJ<22q4t^|%p;Vr<-`F|NGnTfs>owwPu1uI#3yBiKuAes+A4A~PCyA$S7FyUUe`gWDuclg^_Z5ro6qF4 z;8C+O&b2)Uh)4s{HBnA*T8tu-pcv24tJQ_p`aBTUwzFbFsd|L*+4JNV(30K1Mi`Hh zcSp!8y=;1yqE8{CHh)Q8padP_Nn{f9Zf%`82TIcYtfmp69`0e>NExo=G%rofTI%*w zFXJqCafDj@J&al2thKDwB(1BjTHz;8vZ_-0)|;jcX@;JCchpn$ad*dcQj}H`F&sHa zNNQsiYT5Y0xK5a;r8x?B`k7+qu0725rQpz7aQ~Osd*%qf!ddbs^?&_vV%%zGs;@$g z8|nkL>OT5+M$y#eKJFp1is$)ES5!(@;uAyh}6*!MMDM~$Q z+nx#f{$Jx7qiIR)=K2UvBgABZvWI}xQ-=fg-PM~sc@H%6RjB<()#W}hMvW9`8>I^U z7#s>eGoR|)$XmvnepIzYqe@uTS$(&HNU)=kH@jkHAT^$A@0A*Nz}4~Xfr8n!z0B5* z^1WC|soahbW)Zl}K#*@&d-P2N@OV!o@tS?z#r)SzsV(Hw< zfXqsis&D0(k*C~4O&_&(&BMHJ<_YfC_y5Sc+t|y``o8o0&lyj)EjZlF3MadAc4HGJ zIPnhF7`qS!N6^S3OOw_`*hTya?Zjgz)`$!y*u`p}0abUYWBEZ@*mdYW09TePCE%4% zMPOIsd9rfWU3nP10!NrhD?{>NZAV_EmG}L+zUSC<_rW>mcYZh5@4ESZzW3L4*~k2b z(2b8<$>z4MJWDnu!*}R~_T3r)OM9xncM>cewBJ&{(eKcQtS&qUKe~Hy71)TQb@pxE)|h*%@fS4-m7DROJWy}^Zcja5scbj7 zN9H-rj!9-~$X|LxxIWgi=T|%MCMDC$m37NPHqJ^yPrp94*7p78(tMun4qgH+B-KQb zjR{Nn`~Au{InfoC0#D&kEt?op%v5M~?WGyX<3#P`_h<(q6HCL-vVrjFbAEKOGB*07 zt)TQoZ~tLj`cDpi^DQCxC=d7Y(1h!S_RAL5dA_aOLB_D^W(HnVMZzyR-M9DGx8+bc zLzcqM{;GfR*Z8u0jqg^=^UW1$4vJN|-$vO&y^oSbnp zSw+UzItI0qzVYh^?~nbSGMO**4s^8lnL*H{ zc){RZ{}1}_ZQN!Jr^le(M(XJM?Ax-1zga4&_m*=XQ(_cT|TX@Z2 zoM&9@`Co_AvXu}1qS5EKXvOO#**{e5>)oCC$OfLxDVWSj8720W=QFp8shL2}XOqiC z`E>rfPbR%@>s_qiPvQXU|6Tb~Zr;oD*}bCCSe$if@WbamFUlo#QFh z(zQC}&acChOw${*%amA}e0M&c4u7_K$aRn}NOp@)(TvToB_Zj`Z|U0O@gf+PYr-pN z{p&R&H*7xI$IJs1M+@c&Cr^0QSX3xn#xV4%X}l)-WrvcqB(z_%o*K(g?kT#s58u&s zm2k25eZRZR0kAUgY@c2fUKmcu*0kj>Hr2SF7aW8{*|OlX^E=b$oUG@&+_h{N|mFD$B`kL{LnE<6y%V zb~B?EjnloVZ`@;{e5)=jNj|Ccv82#yf9{%HGEgtnX<& zm+a}$ipKT#PoS6e$qz>2TEYHb_C(p1JIT>~-b{|~t?;As+%>h~*=jPphZha)9ri5~ zrGM3s7O$62^xjQ!+)BRoCHm4ve3i$My#kY;ie~UDV``%0N7n95@&}Lh-pcF#qNmV^hr`n+EHbzWq=&6>Da_^NSf--uesG<*uH)CW@2~ zb8OMc=j%^9Fqu{H@T%3>$~~-H_=f7kO0Kn03LiRDpEx)rcX&5n-|V_8lGShMKAQLO zo;~b6ewWNHRx=)VS~Xu6)a~W{nc94;Qqiploi*-pPIw&u7>=@R?NtxgjFFh`x%DQz zBAQ%yk{2Zl7sb@o*aW`TF~v$&sg{GQIQ6!8Jb@UD!ur(GKdO zlasC}{%9k0&=Wsj|L*28un70}j*kB7|1BSpCq<;hmGTc%AKKJwt1~q7sA%onwX}B# ztR33?`s#^RCMIWY{4eKG*Cvuc+;?<>u>kb5^D-h|3U}hnf3k4S5AtMET>QW~llDWM ze&vB4RO5g78dl_pjL%ED+O|A_P}Y5T4|(z*!@IR)tt@(D*yabnAvy7F$PU3GDK~6B zvu4zPs2=;3&=1w3;ji0#VABl4Wc%7V2^Uy8z#je9y!*^1#8=|TaQhrQ+kbmth(kV= z3~vwQL4W*l;@Vk8ET=dvpDVxZ{9F4IuDNxzyw1L2L0OxizTTn@TJdA`4@H{gG)1)8IiZ7u^4_}6&%Q?%Rkt?-+b2c8@=}H7Af|Zu}?Gj1pN7YldB1Q+|oH!=Ko^E4}Xj z>b!>6aIErqlKm4zuEIjUmrGZ3g~DAXo+VsK?*#i*JeA{#CzM z{d`*X(!$Bxk=~CdyZobei&LVJCzJP>`lu;uO+P4yZU}0&5l*i z%PMAMRU@{(+)*@sdmklTh&P+%aaD*XDa;7@c58jgsQb71nMM7Fzvu&0A=igZnD(=@ z2p%nU;D6>V)2Ap=F3Ar=`!%aYht-Mq=rFF7PoV1y`8}(D-&T1cxNm3Qn6AK1yD3>a zGh<<%rNASM`_jKjGXEW;S8t%rT9NH!J*8x`JdE041HX}l>Pb2;1kl}1bX0^bzuWEg zl3ux~D{_z@4n6;45yG!r9epf6&Z3h%Y*xWxQ>W*kpZ(4@KQ7&myykCo&(_$quVEu< zCK@e4gdB&ozO23*$xQ#mzx0879XVsO;6+|sc^)q*r>xyTJro4lB++H zZTxiq?nl|ZNk3Wd!)h=0_Ewa=BwBBp-HCWt8`scts!RvA-(%I$)3mEEEt)%#UO>A1 zZiu@!?sI2c@3tdp^P&0MVbv@S()y+FPxrvV?ZZdJa#qKloeOYmPFT+1%6u5|dY-pq}a=dRzKUsyJ$2qmso zM3r=Ry^Id5_!Me4r~@r6PSC#-9mf-*j-Ad^Pt!R0;YB8Hj%M(JOX;5?IPz7*)z36S zR#%Z%dgBhk_Ijo9vyZ#7k-7L{H|an4PygTd7A6zPvDf{NR62j=sOzne}W}Ix_=FM#yQU z6XRTe>508HJ$&!Vi6})CZ|>eV_YTqb>sHTRAN48)6~B4u%kpURh({^-rk3bGmJ;5F zW28GI8NDUW)qg!r+r(4pou1>XPs7NPmHYdtbVyicQMjfrtay2U{0#P$UVkkAoafbF z&+s$z+a9YweppMNOmqKl4*vAuAOHNKlReKzLw_AjEZu$Nz~nk^clRx{?2efz>iU9_oMc;PyC6$gbCyy%WCc zbJSO@8=Ey6aIqVSS_T(-Bb4v`Bun2l7Q;tT%1A2I#ZHw2WCY~VJhXYNBcsTV^0un!Sok!o?NEA96 z#q7axesgF1n1zlrz>`^1t*zJ@65Ps3o26UROZl+uLoeDj2!FBiZb@I4fpDyOL4T6w zbyL0REU7H+0^?dovxcElU1eS05?#X3x!x%vjKaLtw@goc<%+N&chh zgW`CiV)_p%X+YxI_ZPcr$B+ENsE!ZYN(E5x#JVFHTnTuD{eZ@vU%F*l%VFp5isoch z=xubWR5gb2x9#5d#Cj`vh>w_&%}*j@$4+H*t@}1lG(Y9GTbCq3PHM z^7eX!-yA0xUmia`Ezs_7sOXt`Ge1}#xVLJac+GoOeQw^+Fy7M@x#1T#uzs+#?dCEs zq{|q$UyxO|lG0(Fq?SL$CZEjT-6}ynJJOmi`|0lfTz5|F{I;wVYvY`ZGNJz2{uMEA zOxP`JBxLP%j8db<9n$qIKHD8(p60atoO}Mgu8h9U)@7NxzR$M2A6M<)@BDZUV^NzGne1mG9`|BLuzq>v@r2{Z zZ0;g!NlE(lne_}xCcQ@9lfQgnFIFe=L$=SO)eKj-CiKf<*P=(eP8O0E*Hzkm)!Yh0 zZ;h+SmVYd&r@`~#TKnW!QsbXA3SWzYApC0YsfR<-%A7eL1{YrAmmlny%-;LN(gUMl zTwwZvmWFi#2BK`5 ztrqBQvdGvR4bkv?RXXU*K*PBYd+QrEU$3ke>dobM=^mNzO5z>BBk&8_-JS7mYsTDD zUtSfx{-|D-TS$}n;aeBop`kquI)3%DZ2cemAGJn>`+NPSKkPK>(H&m5bctmpHD=k> z!)=$QFdU+Gk;$YQI=#>szHO_w%$9C0(xx`l79-4aPa@IYt!VPrbePFp{Dq>Q=39QH zd&u~E>$7{B$N$#o=N4zSV-nlY?oW@# z7uX%BXk#Fz#gG^6av^gqDyL-L$#Z5e7)g8u{*U=cPmc<#;!qVuwzOdiFczoQV zJGWQT3f7ZmkskJ+P6XTN#QY=KMAy{&T23>F{^AyJQeHVMgo^P<>m%|qODd$D2pRG5 zRT68Fo-ngl{NAxR04;(1kt1i;5S>8$?MxpOF2+u~pr80$ot#t~9)9gpTN>JE1J*9W zDXv`Ck1oFBIrv-?fdyk7m|NHQ;M~T^`dh4Voa#)pe3%7rc|2sFHK#n5Bngj;WNmMJ<2E9j zcgOuN?^#w@nF`t6s~`F&i;Qh93P8ia`Lyzxp1iY`r)z~4Wj~yyYaO~Db$;x5`~#Bc zZ}aq6A-KKyfM2boyQ;@cQRO3*b*);yWk*kAzmNTBHX3_!u>RUbZ)hpMrq9tZVF!4Y z+LHX+k^XyoU=R*@D^G5N8NusoTC)ZIv|Gf>>Mu)CM*qqiM~? zS$IAhdG@X+>CVQ1S*iK7>v6Va^CId$IOowAdw^BB;z6{C9evG3yRCEA=jXM1$h(pRZ?D(+8Xqk;=Dx+%McvOXTWGu*&@>p) z^ACjA_cZ!E_g2Gv>q(!W8S+btx zKeC?hZtA2w-k3)Yeyt;Uj}KJR2Z|&7ptFx1Ulf*J|B4LndXaT=S+;%F`Fe);Ui_!o zFftyVjcQ?PVtiv?CcW#~wLjBk^}*)cW@2S5e0q{PvA^Ujy|(}8i0>YUKbb~m<-SkF z!@iow>}SIJS9=qi)|#L8KzK{Ewwq}U8!MX>8hGBbJvw))d+qjwYPzF0o~s1(ZN)3T z26GK=Z;Y)@2_hZxDj!aY0V=ra^c0z$%AiYHz;vt0zSTz-z=lBJiEqM&(YOM^jGrvm*3@Z^JLs~ z_5SXz;Su#rGMKLjPZM`PnI=ASA$nR;iOnw{)}q1Ikl&`WP3Vc zSicZ59`q#J zH#hbq+5bCz@;q+rX?0`#`sRa&pts)45AsUvqgvPB%?N+RYI?GfL*eP-YgNY(9hDx| z_iRr39IKMt*xBwKL82&#UL_IOC?xcF;HRgd-JOsJ(PGWCW!??g9sO{k&ZoN5Iq_%K zlYKZ*QMP4xUGXxA?W2sbf=DYgZ^pr4BluE1ZSSVngzT51HIn*)dgd)XBR7J##>(zv z_kStcKVIBU-puvgjmlr&9sK@w^OTYIo6)H?hVPF)4|@}h5e4D%&^7#sr99W@HT7CF zL3TfS@Gr_@w@1VkwSbm=ed`j9?~RTlPle3n6FI-?D^vH)r0-hKbN$w{`v~pwv<)s^!ST*+9ZW}o^9-#e>KkOY`XKFB zk3P9QmA4`<;pVaajX#plohJT3zh|o*9_b(b@a%>k+(^(_iioa^``hcQcZC8gR#>b4 zEA_*f?z$9*{_Fk!aC*SmbORV&{{Qg+ENVByY02x(@xzfri~saq{(jcf7kb;x8+o4J z-O$A$cDse{+vAF(JGYC*5jf^Ydq=;W4aZO{2bQ$HZEF^(_`t6ulb_u}E}bIV^T_QR z`=h?6<8RfDyi_vZ2B%AIEL7HG@xf?}w|9BZSMPStoofWnZuol_% zX?tcP{oRl}IWU)pPH%#!$$asPvuQ1!IC}NSV{!-&y*n+~ZYOZ{U{pGzWsh*PXlWPAXH6zhITj@5GcLg;XiHoX?&D}&5_EbVa7;Ti>+in%pb&wERwA#3G3J^f^3^ZGQ_ zJ1c9X7Of3B)-E@zY!ZcLQj1qx=yOBur;;+K!<(FxnKkoxa{J~=e(K=QTD$w!gLm}J z_9cV2VU-7EaQ*D&)(si`nNTbrmZ$tDyOWROj_x+A^als;3+>|>dm+hxZRnQmQWPB5 zNZU3Kvz?ySf7wX6QCY7vDX5$X+KoI(yd<8-H+5qDE;N?{!;x1+)6&M57rxc_ptY~ z#14}fzm%`-ABP$iz95-Mxi`8 zUB4HndSn0ZNe;cf7QN}?(_ZVNtEWWPu z)XG0&tEblDy+JxG&>5}9k*X9kg6XgIypuBuF zu^(hd_LXEiz)7p?tc=g@9*yyXz5Qeo_F}khO~h~~0xU~f{Or*XE!I1jhs~2m?n?9D zriq8~Ru{Z=%d0KM{plq3CmXwisFm0I)^ghHQS-hy&fRI=u>Lz6GW+JVr<c$W z=@DM->1q8sR6a;&?U4E?hE#SHFC1SB>Fiiek!OcO#yE#;42Qbom?-7dv zo7W806OVTU-*1h2%}OC>zZH_L<8s(2+LP$9`q63?B(~Mv(Co}yJ)LJo zHrwn)cVBCGexm=!s)befMXhi#*oHDWx-!m0X<^}X+WZ$9Pr8~Y`^v|PUaYSo=N4Bu zolQ4*R*zl$JM6F;#j*4s-}AkdTc0%R2d3VT#C^W!pA6MM-(4(t)W+g}JozD>Xq+DJ z=$?4{l*C8)c;#FfE!$gF-0GgzUAw6#dq-D{s8LgYe3I3wFR!k27=J3-d-~v4+so-6 zcBdI1tdwi68oFBaMZ+6}!toq0x`TIZinEg>3#qQt6VJEjqn_;eC(KM?uO@j{P3YMu zbNON_Nt^(O^hD*XvhO)KvAjLe)6uYA|4nYp^x9o%;pj#lw1{fE()Sea%vk5%tOfhh z`VR&DKNXG9f7HPJ>__$aU|4=Bs=2mv=>d7WTc;%HDY~AH9m2D#`wxd=;VkQRbxp_4 z3!c2@+rGH)EHia1X&y2&(X6Z{_GMj>SvT=wcUueCN{+OCc031|b z_m0uMmX7DB<7uV-PNK82*?`mTkxY8xRO2n13O&lef>Qj_94~hddf7?Njh)UehGqUE zGMen1d}64E>G7DML*oeh^8{^s>8a5*s`s`P!CLfZR+u%y$y>Yt_EDpG7$`LAte&&N z%3Gq$J67$`$j{f?a27Bh*8fibzm|q&|JXYZzT6$pg^zE9 zd8^Qf2bqy}de>KY-N;Er_y54G92{bj_4)YB4%>gWi{eM>!K z9FE4zzEalI-HV5rQ7-NX_e)zyOFP{&6N_~B^!7u&qjd~6e_G9D1N{9;JNmOp+Cj;Y zSLrG$TzEu@i^dkkpsiD_^%SPa$nE)~dCfvTX~5!N(Wg~|=&$F~-~0Z;+Ko%j|GCiB z+@C@GdfTdRQih#`>d0&US9TnY{NaAn7cT1^=CD_r{l`0HLrpXl2cX$mRRGnR(`U5! zZ@;kOXD=jGWuHzw>aM(G;tsCg9?Bses#({v$tNmxL;B`Ra+)bF}m{w(u?Y z11CF7rx}E!nenCK>Be_BK(xu5xoAY6ID1Q@BPaWOXHg-kKGvN0A4(;2(5N@@>$1&_ z#2m4~VR^6*E2Mo^<#u#(Yh^>hLmT5c`XV20)E*r|@0;V?KU;6!-Z9Djwe(k6D--d0 zB>#z(BOVN+k5;xlhRtQOLh_k<*8FxE(e&}xca7G@2lK9||BW3@JV#4w7rn32NDOT= zS4oeKG@qW}iLf`JcX&PU+#%7dE7Hn6zig)Z69>`v zB$ochIq&T}z2u%~_37@n-i!UmeyMj~{<9E*0v1Xa$`);nM?555V5AU7k;BXElUmtDeeG`cB76-o3Ru%S`isWy&qy+8H}nm=W@5 zty(;1@@T57n)K|B>yXhWx>tPosd%E8gwYghnQMHyY~H)-xo5k}x`Q{SWv}&Cdaile z$@1}~h5Y&{X`YpxB;Jz7{Myeav8~)>6-L==2ip*y&-}yv|Etd2KohU5x&PYj9@kGP zt1G{L@ZaxZShbzE<487)Uf-;hs=nWF| zq<*ar>m5<-u$(qe>!SNAjW**+xIsnDxy;_i`-ZAc^*dg4Xy-Gbk&8&7sx+dGNb#|4 z8nJ3{EE^oA#j++-f+Z?PL1wGjW$a4w`lrLnSE9Z*_Wy&`;dpp@Lp^RD_R-|j`x`lH z3Eo$KKG*fj>u+_UXg~O`=8v?OxSfB#m92euK8!Q*{paF!bd(Snp6Rt0 zsx3}6v0agG?daOp@0GpF4w^qIH^RKEKd-F!RXY8JjjdO3NwS_V5x+CXdHA3V7n%i) zP@dUX+dRU@qlBMI^Dx&%tm>T|Jy=c8RbR1F_6IIEa{AudB>qm5v6|ppqDv92H)J_q zQC}D{qdbVfW#Cz#pXrwr$7^vK9O`4u&-$r6_d6Q!8QLC=@CZFF&znAyT>97 z)2{VqR=)ng3D#$Kyw-bqJqm@Rp#qe9c1d%#N0tlu6spnJ+Mh3qJ{3nGTQBY6X|Oo_ z)sZpqww(`&B`|o%&)fT14!e95(V6c?7tbu38qa&Sd;dmGUz-Gmyr1kIzHip_K1*cs z((UI%&O#ux-?rjjP`ZzB_1ks%Wq-I(J@duIvt^zA;#%WazKLh);$-)=(Hza6Mo!CL zmfq&h@saN>n{B9EJk&g;JOj%%UjF{ko$IsmGQ)fK)$il4Y(%#Bz|I%FMqcEvJ_+C7 zUz(6(8e^G%3+qr1;SVe-fpJFJHE zdE6gvSP%R%FL(6DkZ#|cpGy9XCeA9*BX$U)OHE(!_YA*Og6l9Qn~%=Q`}j;HToEtg z5wJJ&TY9?)ij0+~Y9VjhthMS)xwSoYrn}_$<1uz%GJ6kBtIMh>O$plJ{6fF#AnHjs zH#TbGW3I)EQS3k6{C=K^%X`zYgC8b=RB%Ql=$#Zjt){N(_lC;-H%TF%JeoZ|<+FyzToT!$(s<=ZOr1-fq zPObW1Jzl*%x1q6y|?BZyx{7|-N&)!j4 z&Ej40aS`q2mC({hhQ~LjKlNq#5l520i<9wu!z&v+O?(%F4UzKA@z>Rlj+FrGhsjQ; zTBBPT@Hcm!h-8wn$i^!%1~35-&R&!NbWdac=~wW zGVQ28{PJrZ)rT)1SsHZOHF?|&8Liop%kJ*%QP;1mABro5j=ZG{$zrLM)m>?tS<%*> z9eWk7hpO-bcnTkB+l$T`RlldYW3HU<$T?_U_FBhQ9p2Gp=hDWb>Q;aFPqgh5>yF6? zX5q-Of2MUkc?Rjk<|%%zo;V#+?+cMn$N6sWSOiw|_hk27la!Uu@kFItx%;`!@|N;_ z-xo@6tQY^)qVI3z1Ao(oth>8<(uDaIWO?ZmEreTF&dEYwlI7mAH_1kG^jeFeHvDeV zUB)&YfOI3VN$B}ihV%LdU(;h|os)$;u$_(S*dgqe`_gp37eYnee|DA059m#=t=2MZ zWQE@nZ((83HF)P9jpKb~S*QZcSEyL58iOTImlE?t;0Q>-P8`N1YVKUeM7Bi z2Z?Cj?n~z5g;jf|qO4`z?vCkzN0xnk6dF-d*h(LGN98T;41%JkW*crFcrA(}Bed^A z->9p2V3@r3;4k||Wrsa?RmWs5j{c0_-YE;>3)P5}t(4^%Ki|2>+SyW$j+~ZN{)&E8 zGAeEj=e-?m#c!Uhk0W_{Q~1 zix>Ansi*oypLUWPi79`D{YyUM^{%p}_c=s+-?*_&DnvErg3iqCZ0L=0l*uz>Zr?L& z+{g{``(1fpzgP_R!#%~)d}CJYCmIv;7S5z6U$J6cb_w`KbSj(dmzIa@@_N^f3D$fQ zM}};ue6F)*_{-pMcWI`Y!ofU%azEeSbY^m8fe% z)%}(Kuj3e5+&{JOOg2OvXsR(zzM>ibcwNNdtb}w>zkam$pMvZ@JMWq&4$h}lTi?fu zrTeG7>0GFKGI}-Fn(lK`=PvbMPdyq(o%hhC&vowhwIc{hPnYocBy}3Qq{ewP(eT_`NEf2bxnj_!s66A_`b1VK`8P187-M<;xys)}M-}LkH z2dID2x!6^`=Dfbvn|e_8S;yOj^yuqS(wrnZ8U@i0X=vFSs}G`zRXTJg=X*Mh)2h~8 z?@T43^U#ed*E?YRTqW?4I5S7=HTR%wejYN+HBTkWqvyP0NxORvmR1eTT_+{OcGUFI zuJe9JBejT!>fvnCKh2wQV^{8Podvr$y}SM)`@Wo3`GI=!co?<***ojMpKdH(N=y23 z6l!f?(T|JK-!FBY$L!Za1bu;@pkCdm0q&xX)@hEwJF520?qZZPL`Q?&-D*J ze4y1_PYBjVvte*0PmQj)KZ<`|kRKf8Q$c zEC@MO@cd$Z`KDU&eE;pk#8W+9a}wHH&4>^`GBWAdoBQkOwC@dn*y+mua8Fwa?=5l6 zp4q}N9$T!ox7gX`@q=6VwYrk5ZuEI#(O$i?v$%>@Eqe|cA8Ku;?=_F=li}qVGIZAB z@98Vo?ujE+>B^#kN)YKj+Q&*-$GXqTE_@aj*E=UmM27H}4sP7tXJ$KhTCxdgFgJ< zbmph}7O}E}l>hKOPu^Cx_p`}sW$=-UJEy~s&D~umH!oxh((K=J@IS1#WQ)gDyw4g~ z&+H^N={tB`b>1GXRzTo<(z2sLlGYVt!Kzu;LVbPFD8V2(;)=WIn6t+ZZhyM}@SH`n zD;3p_B~4SGqawD+xCbg_`sT$liOBIe$9}d#OINcJE7B*dMCL&G(i+ zd}FlBtMJ>k0j@mwCZ(o8e)QumAP1 zzD|RS1DK)XZY%hIXz4ie=zrLmOUVecBXO12r~T6iJbjA3PO`2!3CoWYW$2}-akY3y zfzcC+T=F5jr6Hvc|IhIQJ7T=8YkAZs+T8Q!TFEK8U6CxFS~6mJYM1OL(;JPDgIcZ2 z<6RGiy`ftAqPL09mVu~tOA|TQ`^&_QKcw5IIpF3^-gkUW^AwM*rK)MOTRtS zdzT&3bK^<-ZajiDZq=4nZdm!_{_~a{^lerL9lw43s_o>V+!&YOHM?VTl6_wLZ%^8@ z2ljeC8{ma)p0ae;#VOXclSl9vvrztK6i+Y6H+9vNsvImLU zo9-lHQG3XG{`B#P;RM}V|M0+Ex9ElJ-}BtD(2EEy-EHNx^foye-Zgf*viGsxD2r^2 zLI(SzzZ)}0uq4}efA#(%K}dG+!x1gvrrta~ z$unN|*ncJtrY}!zuUuIxutX<-rR%FTY*=ldwnPi3xx=@99qneP<-~Kv2J4%83DO6X zcpEKVsdRk1w*6N9aeTFat#WtAZ|(jUd*5BH>hi6Q-xnXauWKRzUoGbK^;&^vDU}|C z7mKrb2MLcC=uI&&aWeWHO@NkSt(JGjS*~wH{cQ_j-Uv%=wB z9`RG%d)QU?vmHNN`(VB~2T?uS;KR`cz2xZNzo)DOaB98lQZ@FrFx?z9<y0S0_mIP=`c#wv z5yst|OLugpu|?s_F0E&iJj+V=-CX^?Nt}4Z_UI9s7R&zJ;_o~*d~h;{>EhN7qlf=g zHv89WwKY=hbp7Y`pIF)ZLk21DNQCUFJ}g|a{iSG@rq6fx)kP6x1B0XCOprAmwlw(K`)K98 zE6w2j)%q(7vCr48x6~RlF^@N{vfj;fc{r(Uz8}y2!?oTh`RFHa!f)hPlij2uJ~IB! z6~KfSNag@>D(4Qq;43H0 z`f7#_y;|IPVq47uS+TEHL+A|OH-DQ|7A9_8_W0%l{ioSCpL)xpr{D9>LE|pttf-po zQW(yv55Ft}zIRbHzVwN7^8vmXj@j+SUnb^VTXB{&Cv_f9qmNcgt~@d*n;g|J+=yrq zf1Ru}a&_9tLZCPLkOKEN1|RGfrql2nJ^XHeWX4UUt=^s-7-t6Abb95Y^~I~#(dZJR z@xwhGV6=O*7)?g)&-HtJ$&EA7BfKSV;zY^vyr{;2Wq>y9ttB#9_F?=KZ5z*TCZ~TR zN%pDb3HxVZ{ENx$7pnC)%QX4DP}GW>n=3;3??x+6r44_rcfKJ_RcxG={OH0CN~ITy z(k*!-dw*+1x>}L{jr?6XYSmIyg59AFN#?RS=_giQLl@Vr`A3Fo>i zdB1e$Xt*8_PouM#Zz+4_ioWgd#t(OQ^?Nvau$$vOwejO&{Tt0MxiKE`{hl1Yyqkxu zCY25QYDTKBUhW*^tFfF@b;b|I>vX*O@Otq^LiofX%x%9a49_f;`!7%5hLrh?{HT>^ z%Q@0yWXe#b)p@R}&U^f)ef7+Gelp0c+fc7usFzqh_40_&)yV04r=_=$4A7+OR22Cm0De`}dB$>6wyb4A@YPbbH3STjM} z88``#Lu}&$@GaBE?}~Cqy|j0n;#+Gj%5V#|zVj~}+>MWHX#O`Hymgn?ws2ib_V$TU zFemIh3%)TCCD$h_p4R{I!tc?q^?UTw?1^90)(67g-k2iK;# z`4wF!TgFpBTQy?4=yGpHm*hQ^pvut=XTDf7OTyDoE_@sf_q+zmSaFqp7HmuA*d#58`UQITu zrs^*OHCeXkC}}jBUo@-l&Q+ren}x3GiwEevGu4&<_`%h7l2)xrQT3nSYqsv#&%1+u zT!StTlV-ol>iJe9E2900YH7_^9tROYlK&e^OZh<5GiyRUx_XQ}hWEW)E(?#ozA_E^ zg>qb=eadRtb=^I-{XO-Dbq{E}v=%EE(A7yZnXuM6xvr%`bVDB6+ldPq?8&8~5-yd(p?pjAy zwqu)LWsJMxU1*OrdQDF~+Y!tj_B07z@ApPphZ!R`S66izn;aKkmhT$Z&ZXdkinj8Ky%_d(_FxglXFdt9d~vvtZ$|gW)7PzvUWRHBH>;;vO))v1)b`8^%hJC# z``r9e93+2Iyg;ch6elO=U+DZl>OZX=Pr#d7L2b$DiD8ax*Qez8lI`ngI4;}|-@-Z3 zu1|O`l76_8_Ber^mQf9Btxv5tPu}RVpY}Na{_Y5lJ6HeC(coE$Z1;J~^*uR9S@CfJ z^zZ*j{Zsvla+36U$Jg6uCK(*11#FIP@7=-zPGa0(+B$*@8I272k6WLpzK=(>Z^&Ez zsYdCs@bO3GUj9~j#daL{V)Vg^|9ff9U(f#GqlXpec{&j&v5j zYw5jl-~X*%PI@$k#mZfqr}FiY9po~M(Y#%;7Aqn#ai${ zA3c58SU=LZFVE@f&%<=Km#Qhr#)4m*3EhNxV;~EzOxX3V-sd+e_g-8P<+p#F7Ou0j zi;*#Cj6H$}(G2+P@B%A9lp7OXm#3{GRyj^t-np!pWv{nGS?i(yVl?>f_`nb11he+} zE_)`q?-?sb+?n2wyS&f`hv8jbbJ^Unp$&+@PXqz~k;819t{u&v=F*I^h00}vL;B1v zJM0SXV4TR>xpJxb;?ZRHCZii2Ek0U#=;=(Yyr*mWr{8*nO{8bweR?(;j}opABlsj; zoGcqT&zCaverb1PWcM6^KHz?_Bod$ZNT$|zHllRS+`lEskLJHEgJswA!*5P4N&DL5 z(C>tq6IBI7j;ZK;+6H_(3XBhQL@nSf>y6MGJF7ju8rq>BJE>%z^k@DUxla4zZp&< zpT;|eu4wxw=6_s()z#ZWYI@CvH9!JCn4jXgc!ISa%pX0LpOMGz;od37hW9{CZ~+Lr z&^Ip_UNDvw9A3){rb+6y4ga;w^;1(Qit%zessjSmQ9mmPY+2?jI$D^So zQ)XAHg~)fxnD9etWgqh$-Xc`r>E9$I$xl8C2g`9(_#~+vBz5TyO47<(;U+ z?2Sc3BnsYjT^7!T#r@Oux^E)g&_5hN-uqbScO~s_+l<{0|F^HzAzBe)Gi$1UC{5qG zijTB!slAcRBA562p(4y*EGNvW6=VJLLNupsNq-puX%O4VrR7gBV@>WBPs82aW96B6 zdHR0+wXmpcQ38Lm5KiKO5Fe*~-TaE|(i{Sckd}jxh)-m$-E7vbhVqX#KwwX^+`IR|(fgHT@OS&qOWmM?ZBf-kmj^e%)E$+0_ zWN~(WngA5eDj-UF+Xgyb@%Sw%a&MU7HF;)H_qoQ2ZTsc;?kB>Dv)@YV=MBJZzH#v0 z&fXIp++ABAu2*RRtN#3Ju0qF$e_3?P7twQh{}yM_<2Ve9N!iEi_1U$(eZWHxzwMnH^9=gLllkg#=KHGE zC3*l)F)lDxP~H&SeB@@ja{V-VlT~Y9-&?vG?%;a&S?e%Pd^fb>1NA{1qTh)<-`B{{ zNsp(oy+5w5Pp*$oe=qD{%EZLX?+uj(zzCR^cXak)i_r$?+?VNVu(?72Jx&xF;JYi(+?6Hj!VO)%fy3QtPPyV#l?JzvHnu2AjkvDTwm z^(QB-qGU|vMm$rC7DtHcztmI59jZ;@9IYKi(%?a91b!(`^gPQ~ zm?m9ceKg&D{C5y48=i0P9b2=`+3?Fc=uCO^Yo+CP zE2KpXFQEU^3bt!ans~z2sx@Y~%G|T^`W$Br{IBJeVByG{Tk@OV0qX&|T=-3F|fABx8-}BJ}?Z6DyIX~Lg1C0zD?Sbwz!ms}F z^o>Taj;hxl_w$T5^C2vKG%9@k(A+}PNM$;$*#GzetMBlDYUSL8-rJ|~7;o{3jdfh< z6a0+BWk@?7AnnoW)5-ov(g~jGF7su6)Dav(lRN??9fptf{w)9W#iRJaNNu_RJfSZV zq|Z(>kPT<$jEm9eS1MTv$NK2sy^mn$GuR$h7kRf3ljahY!%0_b5zd3U)7zJaVA@Y( z)hbtL_wan7cTCPBzn*jSd$?BH{0^a8O=an2h4ErkW+kuI@w%8V$LDvZmct3nFK_=& z8;~R5V@8a1ZLa38ht2&5`m?u}rMcq=QP2^-zv1yGDiueDC}$2Y8;Q|#OCtAM*~96K zB?Ph***~XOTaUJn9dG8-q5Fp2xj#DiyN#ec;~u%Fv}D0JYjXhyFt zI$xt8*Ye&Fe`^@xDOeWXE3F!CudcEzAFLOytDKPq*$&AcvgPJo?hVNt##=@C9c+To zIhnf8Z$}6C^zsJI{wix;Yda_Wt%LtHx&M)kS+8c$miZ?x5Y6BfGWV{{%P?G^{Z*>v zU0YEGnuQFsS^xd&&3CF6jFDnQ5ETLU3{i{iZxABYB{ zSJ`f4{QehZH_}DaCnq3J;L;*Vk8n2L!CHqy6#)$Cu#dVfRLXdCV8Uo?1s&IV>*#{_ z|EYuTulMqH^SQ%}Ic2Dij{^P4HcHyBI!JchZU>767LYJob@Ns%vb>X zU%dC;rT6H687-tTDbK?!4nP0+?$q1cAyi%HR*v9ZEhnOP|5lt~T8b|!&wVgH#kIVE$b0{RL zcm>UijplSN9=B#;*0)#1;oHxkr%{5D!aLSyPraAzeTPOyzpK3-;PF3G z-1e%*r5TR(Ja6w6>CGa?SCqy5^>pI1*?0Dvzb)B}bINJHB9469;t+Tw-Cu7T3H*T_ z{Ago&+rjBLf{}Wl9A$CAxM<~}t(B`8SDUB!f==;P#S8M`ZQj%K$^B&iJHm1vf`f~H z0}uGv=8?^3<3{#K#J_%{l{@X7_;ft$>CnI16LsnQzr0Y66Yv6F?8CnxvLK7<*(CnI zOY-mbe5zGhBQp42ji}b&Bt0G5xU6<0$EKgh&RTqUix+4+jR{uo1aczNH? zG=A-j79Ppmp=(}Y{I>OkdehO(!bcK~zCSYJ{^%gOZX8JL@d}CzLMbipT;)AeiD$cZ zZXH<%eJIMCCiWD{x{nn7{*kPV-e7bW-us?Bo(q*X=RC(U{!x5;tR$_l%h#Y@PeLN> zzuePTFTT6u4b`2sW%dmj?<(D=<0LbzUlW%d)I&9o;KVqs-0VGR_v>hB0rijmJ=c@& z96s>D`tQP)2B05b+f$BCZ`FG2dl7)^8ZACpnM7)TPrgwRfNML#1-=x;j~=qK`PV2f ztn-*3F~8L+g^j~@>?G8L=I%{n{gVj7lDoYZ`i58>V0KV4Tk^fNq`b3@o!H)+{r`#O6^IvXKG$8J?73}JB%Yu=zJI<2 zJNJBBJh8H#?~J*+c4y`bu;$Je4*uqfC0e(t{?*5$oh`nQ9?7;T{wWemex7;Y`^AI9O$*f~K{CeN&BkzO{_P=kLLVPF_ z_c8A7#}8&dL%*W|@Vbo7Oan#vuoIVA$UC<^AH59LAyEs)+E;_Kjn>%zw2!lm99n-{ z{=-w1)5`a&ysUr?>cSC5;*a+tsS+ko;05uZ(D6;TkttfJu(uj=|E^Cv%tl+h26z3liEwP)Gm z67+oiw0MAe_K)>trrn-i)lmy!KOVVx@CdIZ4 zmfyZHUX-*OIH9(}6XZu7CctvjNs+MGol#iiAWK*3*E z#xjUTyMNB$uymW{jqUi(ja3kg)pJ?+?5Vr!iH8s5aM3mYPX5t1E|mVG@}d5;e>ms; z>3iQR3*?bxCMlth*qFxGUVW#l*-L5PyalTrQKvB$p?JC4&@sjQ%;;|P(+8*5ai2YJ zuwtEEpJem0&8&~X?<7{&9G>1RrU%W<;oaW4`Pg>ky&OU7(fwf@;rG%8S_9`uyRNRC z8Q;BK|Esr^XY(jzSIk^rJcX}uw>nNoJcM`m{i(`xjC=f}MzY!Waf8En?u=3G+v?lB zRj@oCs~>*c_P;Xf;e$d^E3adXEZT287lz3SlyfxBEUs$(HyK;eOy5`b%Qp}$_Rad% zuVk-ZS{KTp{f{mw4m&(yJO^|MR*MJ$+Lb4ejng}iHQwV37`n&V$;@!po751d(rA`v zVEBb~AukLUS?}XzL{VnQiOW6EQ~PWqCD8F6t5o4>kgF!rmFy?x=*}arA*kBCmzISecne#!5A^Hpf=Q z#c=Nn>zZ9jE~QIcmxaKChhK=~TN|FY;N)ebJ>5aRpvb|un_2qdgFjf=gBLf>TnyX4 z9dG!>e1(t1F+P{>@a~R3Ry@HjjcF3u7oSU~5MwYy=#zb99$EWx{Ev8s9l>x3T7`(D z)vI63YatqWciaL;j^cNp{;hl=cEad)6A6hEYm$>#LGwM z>Q?>`N*LJ-ao?}quq68)?V%t2G`55{?s>$luyG*@xV-kYbHj$TwkD9B=1=!5SvHTihRg-xD`rSKtwkr(56=qI>pEJG(T7X^~c~ z&z!sLmH(ZW*LHM^r=?3Q?2n!yN-E>7ec(eeo*&PK(z)g= zeSLpsd<=9!_85Dg*T$~wdggdNgi}13{=(WQ3%&0LIzL%SH+Kz(@br_>o?rZ7?2HE* zFZf+ZS?F#=`#l@&voX>7o%J7D-Fq8({)X~ z6Fh@vs@$Fqd}TTZ-c{V85@l~4TiM$DF3aOu%i%sA9eUUlGzcxyD@&KCY#eE7yyFue8Xbo~5&veZHH5`J6boM?~^Th!wXE=m>S-hn^yB4x4fBEb5GC!kL&a4)VW9x(C z(ehPk5tlca;7}YAZO>{a-5($8Su@2hOuG5dl|lkL8ndB8fSFQTY)p<>-+pn5Ldb9uZj zZ7y^sX&#bj0q~w2VFz^IVIP);+5et1vjT0A{>gT4t}J{8P576Nv2g|07+)S)mB(@M zPpx8^v2NHFqGTD< z)$ycNafViG-b9(L>J=vtakwwNA{r7Qg!cc`ueHO+_+@bGIC3r0^WMXPy)HC8+INwL zMK$q@%kXXU-P0IaNB_#LaYkvzfcE0o-dUsb(3ysdE7K9)o<)|9AVU$qyF8@Pb@kI9 zuPDP`WYIqzN+x$x)Tp>seG&aMnj-;awzqBo!Dj%-GKr|WkSFJq0vjGql9*6&AnORT1`>bP4)f^6^1s_mkn z+Daaa2kkk->{mMxyf{ZR1n;y}ExWE`V~i_UX>55nde&a`YS4V<-Y^msN6}9xt@5Ls zv+HeS@--pjOYuli`sGioPF4bsYU>pqhS7j{5GLoqI4nQpR%y*_sSN%(xt+KR?L%9q zzJuR|^_}d8#UjD`9Ry*W{(QGEVhY}s(fO>Fxg?#5p=4rN8gUoV!*So1ay{ zcnxUqznE0E)5S;H@nY7_zG2CBSIZ>W$S0t`i$JjU%{R=Cm|pPlybE@He_h<-vOXmD z>`}*;fOCjMjL+cnoq2b;N}ubO|8XH6Pu?ExFgCLM)ph^y$?(5+rE?G3n>hND$^G=% z_`%@3IrZ_*CqnG0ytK6a`wpJy`&4w{U;Vkh$1A}9@~Xs7kLo#^Kf544+?^u+aG&kJ zq!gM$abE~~G;a8YMAjUgeOY2r7<|D@Jgc&rg}Te|*va&+^3;=_C}*$&pX45oz-YzF z_jYUVdK0-0E9?XIB#&d%cZ4j(6~qwGiO4;v$XkfkT<4p2Zg_xivY)1z-d!EhWi?tY zr!9!BIJdVPXa{hD_Z0D17*{Til}Du`u}9LZ{#p9{lIUG?<`tRV)1KdD)j_skwRLAbOoQX`kku-!M+(I^KaNbza;rWbI2%T@Q9ub$=kzxfJUL?a7m9Zi-7O1 zyIeOrQ`GLhda->LqRMN+HFO>JYyR-PN%V;jkk$`$KP=mw!T6`6ud}maka0xWdTbvH++hZ52e%H$uuWapYiS(Np4H__wV0@MkGdeK}Td}I~LNDs5Zy+n)Jbk0*^bVe?ox?HB3uCnyi$NZw zvJKn|vySwXw_TkTO}^W8>QmY0kJP&9wOg_<+a+*gMJ6Ns<#@r*7b*BqIRCTmIoira zc7d7wcC-&~(rd7OXWI5{xf)@9)>)mKShwS?+eX^6b0gR^Ow&XRm*K{hDR){Nf&uf$EV`C?%wO-XUb#vTK~*(B%5$`-Xl^G zXQvHV-+-dM!r@PVJ2Qy?a4|?*hCwR9;!<$SwZyH%| zO(R#w8%_^q`N51kp#DPt%L>?xY*h*>yLYX+f@{+8m99r0>)N25Pf|af?;LL(>Yi)? z{tq1GnvgRZKOMbU!b=X1R}K$kuZ~7TZeQ2uLiO}^NS{b2Eq!r_EDk+X8C{)Bq1jiS zmV%FnN!}NCJzg&GmmA?<>O9WJHzzNMZQR;79j^?bT6AZ%p0VJO(d+AXBy+yuk%RE2 zb+jkmSA8W)i$_|8_3=h`X=2^eeQWeqSxe{lpO+357>V(F(AdW#M~l8?WAycBeOBp4 zcy-r! z4(}7!GaAuXeZ1PV+R{JLhE{%l=d&m2jSS?tdw+fG_W1Rd{8ti>mfZGZ^&?+2?fuT^ zz)H?!{e8DbG=J_NhDlqbb0oI_d*S{svV609S=X) z=>c6?&vcib#}m|9E&?tD&r23oV;q5B13z$HU3pT~9#J6vB7XF?HSaonGrG;`sdL3>OAPzx;Z-0 z`BOc`w_(KDInTxCzL5qXE04wxcOMHuYnPyO+)1X{!M@&42G&y33DD+9O~Q`BmAIFb8CrSDc(h;GmK40&)Vbi!Rabl<1C>R*xW zzOClu9*8xj^!Jk;N4J~Fpyvy_u%XK@OM!LXv2lA{vZ`t4K){;Ym^tS3oB$iTTBM$a;9%=gmNmRzSy#2;~mBMhnj_t|rIa|Ejnr!!kaamZ_YQgdE z89lvmsgG-2o;s3xp8sa{2EhS=S+Em-)KhouO9qdIf6fx#Qb_FlQAb7 z+H+IFcp(mdrk2HjE``@0B#plvvY?#C&dc_Eze(7o-HV~i%@H%RzSPq@8UDz^{YUb& zjZ8NqnAL5E+9LMN^=Hj1=MO?XFMoP}w!$aZo3aO5LBI^6r$ajXfG_dZ?zvdjKfe!D zrNcu*b(g_gT*us=g>$+jO4FWum+xKAptHj*U+OK!bkV`Fav@;sO$+Dk+uf)>nLRI; z@4jW#@6k&-(y3XJctQXAjZ*u5xw7DXY5LuR^3dDloj)4&Se1X|lG$iK?8=hl%h!9@ zz0g&w*3JoV8^)`FF*Vm>d;xH?+F1>IzP65ZqmPiH)-xG-?t3tS&PQ&bDaU@{fYuE6 z>_=7{oQ%9*@7b`>$AV|Ok1u3oIo^U>@cEe^aV1{3`fZ=FWWIB=f2+6h(dVN5{wZ;M zYQuAeH?cy=@9@2JQ`)|NCptee&-aD?k#|#n+(JJ?0#vhBrnPt%%Y|Qq+}rd|i?0a> zzZBJ573e#wl%ta-!EC6iVg(ZTA8g>s0GVt4trNdwP!MgJM!@lQBHFG{zL z3jA)G}iCdK$u)TEIse{||kMI3v zlUZ|+H0Lwpe;eN!ubhbb_{-nD`CfXxth|Z5JssL76AvG_EWFFS`B)r;p3r`GJxOXO z=hNrS7)H*;`2Bu8pRUZ0^mM+!jhRB9tX`j48q;mBnVd?xdt4y;T0L32MvCyL zI3BF?#*fw#g>0V8V>Nf-4vTBl^F?MFc^;4BjjbIbCgbL7i=t&+8}su?{;}G}AI}qI zL{G;@AHhx9cnGE0D@W!Z>z;I{ zqYMwgulD!Aic;wIzH3)nh?3+Cka_BK_2eeS!Nxa+GhFDN>Rfy8t+sXo5LZYe*wXg0 z^VeKp`d`_;EB;o$hJ7<$SA?ZjEs5{f*wfqBeciK=AFlq|^5W46ju;iSq=gwNz6Ly2 z&o`3k*nDpOxf72euN@g7Gr!c7j+&poXIY!}JhE#Ne#Pd(w}(?s%ad<>bkUxu&FH*E zqHA}b{4&Eq_xnxXzRJ-<_-B^H#=MatW()6haGABQ3!^t|@}rT?U3ohW5UTe);OV%| zuO9sKV(CwBn$w#f?gL$G?cZ#2vY$8p^Zkc(dzh^(oAvysY5T?b*ba1o@_;uVFE&6E zkg4|{4nDGl{$hbk^5Yzz%v%q+xMvtHN2R0WdAQ!LC`v8uY}ezyYnDIip!*y7LH|Nc zcazO_Fnui9&wGE%!9QFWzp`I6eC*&a`@ZJjU6r^p^7=mBD3N!+yY8g3&`1M$*c4WOb9pHHHTpE6Kbl5qX@1m{#UmqQmyOJD2DfobPp~tYf ze9NLSv}f(h3)Gv=cJ**!KKa+%QOAWoM;qC2wy22S%<5*{!{Lm-dujOO|GCb?zgR7K zgKG3JZ-PFg$D`yk)e)`r#?CtuIbfd*{iO?3W10$nL36;}7V4D~?&}Uw z4%Zs=4_{JK`UoWJ4<$`5AI_jw`~q4bsyQCKvF07;tLSa^?YiyYrZQSDb_Wf{9cK=% z+nVu3`GoNRFqaw%Fk_~2znTZLfh zyOpu#D#oMY+F@ceK)ZsQKWAl#@)nP%h0pMTXR-`f@k#DbPyW6X3T4hWizg0X&+4}? z4#EFsHJ{(>BLnBNS@iGT9e=o z2xhf3hKr|n zcKyDp4Y+UQ7Q08E8E?H$pVBgZ+A{|~y)oB(KX-L})b5qt`Dj%9mL%u12XAHRXJeZ& zE7QC>FKR`>uYR7esIKU0PL$u(%@f5RrzTUBjp$z=V zgPJI-dR*&0o#teGsn)NhVLi{iXeJxaY^* zBLv@ahj)ynGd$py+A%#pS`JA!T=P}*i@b`{u|TYYQSbi$CH@{StM#v7XA=)cgV7rM zlcv@udHc#8JFXFZb`Q;daklEIuJ|jC2=o5&>KgGy3%!ZnL$*9oyZxT+9eNgrW$(bN zvHJCR+dn(_f6`umEnnaJ^JTV5!}d*^hePtGlI3;?g)7LF^Uh=cVmQ5XafDf$ly%K> zf#ayr%|+aQGDNc8A(aU&C)w?nZQi@REX#rK&`LvA62B{X z{^_1E_g@Wo_AcvKj9-=op7NpX%F|srd)5`$M*`f93y4w9@#o?@Z(I?+z0^Nkxp!#- z^?IBjoRjj77jM7^!pYb|R-JP8$@GHJtj_1>h0xRW+Vb-h2|m3vfT#LC`ifVebuJo# zYvQi%in<#2W9yvVV!ZFL|Ii^$IREcyyv8D4G}oI>qOoR;p}Em=`TyP(F9`k7-Zj|< zJFmdf2T(t*Lk6Mvb5qA^Mv9EZgD;GpJ-RXq(;K2!xX)k$21gE!WSR)V;GaB1NhIhV zZK&`>?_gU%KTIkiEwg!oEQS-6?l~)fXfMmN9@rhj?(hYg5x#JJrRj6^y|9ytd#8*RcSwHT%0?vn@L*C+sy*o{BSv#n>y2c+SnjsTnIKt%hD@Qiw zWcIPuukXFI0WrO1>(p=Ul`Y3j%No^b;re|Q-%IL8e`u_CkHmpdHh52M(;+GWuGT!# z?z_-Cx{ZxJI>61n`TU!;Vz5pwG;eilt&NGJb+6j_ zufsDo!#iO2Z-qp&alaS(#RYihVV2*~iao4^@%+C%8E%fu?8u9E&>EC2vS7ZQY+b(n zxJv$miSWTWum24PHy(T|tH1tTZBNf%b7_{$U!4C`F?@Xzwf_W7zes33b-10geAGPs zGPf>vAB6teLg)iw{OWr4bSn#?(M!pCy8QL&Rr=;wy+Yo8tIzKL!gX1?{f3D3Fa5u( zIJih&d+;rZcKkBqYyYa`VRM?;8L#^LNzr(^QhWc){R{0&!{2MmXpNmqPa#W5z{MS+ zk6N?CbF`diZ{#8k9G%a4_)%5=Y4G2Vrbgaf=$B5x+Xl_>i`JCBbb)$vxB^_&fC7Jo6UNb4QYCv8=U`v5VtHW%#VMJK6Vi{n78~0&3*_ zWWSkWr#hBhpv5RaS zp?XH8-sj&-XIz+;M>DggyK@jtLs;JDz04m((~{z5i?8Wl65UuB7xjbWh3ob9s~6o? zQg@-&!>p3g`;E-mR{Uvi=I!5Yj{X-r`WvB*)%>%e$DCKWu(!vb9;(I5i}YWr+r%A? zhAG&|USB9?laDu^e$v@aJS6n5EZNH*pZT=S zvDx4!7qbu69=_G-hOIS#ro6vO8`wwfKEIy*_JMgnccsTq-VG_daIEcNRxWhyH%D&i zAu{$zZ0I&>anxo19$nEpi1<4Pmp4}D;%_5m-WZpBO{g<-?!hQ{Ms|?=WdBKG<8avT zmGxgpPEt5-hJL?cq4y*qkFcO#8{Ir}u!(Z6YdntkspOtNTr&Eb#ulX{m2sKy?O$&; z>N|Wp)4#6OJ~EG0x4h!f<%3#}KJy8nR=NPHer?}8Y&65M+WkWF{2tw)bNbm>!-JWw zNA)DbM7x?{)Bo`^sF@W?W}gWAKl69+*WFTWtb9z1WJjLw44=9u`O^6T;1UNS8F5pZ z`k>f((US|c0$-W>@1HrkmH7e%OD5N*(KqOWSx?d_T)F#P|~$~_?xwsxy`l}CZTpeoy)h z$*eb=Qy&uGfv946Y5KoLzGv8?W22ZyZ(P0-YWc=k$X^d<_8cWAA?NnS;krB%MXm8W zGxPon^U01c$@z)w=HDn+hF<-VG-q?vWW7x6O$Mzwtk%i7VOi5qDQD*P-cW|z!u_X1 zGkibanVH$fC;y?&U2OFWGi}V1w<`zS^6$IX%sT#kzItnA$kPAV(&v@GR_zdluNPJ% zK0oK`=XxitC*Q~#iD+v4?&E#KxsztKZpK6Qiku1&*Ebb|C3kN(uHj?zJ^#l#n|21>2-&2cTNzLO2uV2(-J~qqKnzdIa z|BqLrp>))6nncn|QIk;<~_ z(m<+}{(eZ7|DxkFagdRVGF-ot6cLw@;buJGn|2E2YOzPPy6wIB%7YP_H+~nlihI*O zpw?)wjDiijpUyG4L#_>~FD2_BE8V-NVY=*^qiIz#P4~XGJ(6GjUrVgu>Yc_Qjk*lF znSD1OpXhY6R@__j^15rw6D6JNoLkjV>5B%h9zFRAd+2Nm5m~*Op`dMuqfYjRElAWEb5S8%T}xTC(|mktz-G0 zD2y0JS^*O4YO>&6@kdlfvaQjqQn?x%hpG@Iai(&~>{Q?pQlep>k8{2kx_{hzKlk(F ze9n*e>;3zjbJxhd`|I*?{$>2(PeM9m@~+8~e|5}G{Z_g&J=py8e?2hSz8K;5l_9tJ z%w*cl8R)mSw%&}!-y4qk>*VN&tC_1uf+wGo$iv@0u>RFn)*%1y6W!~|$9m$9Jn#G0 zen3XYlSl><`ki_eo}r5Dp6#72ob%eVw}))TF-fkp@MQM1FXV;M`K)trCSL?E*|uzI zeBw|X5!%o9JEUnoc)z>T&bRkAii2wi%+hP|I6rlA z?Z-9GEM*N@*&u)FLf-A+;_|GIK5?XxQ&J5oV>KtP_tD_oYh}%YX{k@H{dChO!~JVv zeR|^lxZ{5}j>jrin+D#Cw|!wLyH%D9E&I)|S-iaeuXMyJmzg(_Y*zfm?qhS~P;zsp zEO+Nemn`UfZ*da#wB2|}d|tefOBZdE;-tCt8#-dwj9GB+bS2FHJvpAZX7bNm)^ILk z?OZfd7DXO2$a^P5zFfb(6T-@!?dSlXdcWI4Iz)>WDgSCc0(Fuu&~ zkM42J=yQ`5DrlCdb?Ti)*KYGSg@ZC(Hsp2^ulX_WEbQjRe~z;sZfs$fBo=^~{uSt?E)cAQ%svnKteq+i@$>9sikL3Y=v3 z&nAmWZR@$Lq&IA^<2I#fPb=CPGQM#eSL%vaC&)E&1840S#cdzXq=eMV4J2Q85Be(Dhv`F$Kl{fLW@9#WYT3&s$-x1CJ z@W3&|niFF@NWLMHtH;^K6dj+BCu@VZY_6=yA)JE_=!6v*?RUsStJ|U&v^q8F_w3F| z7e;yBfkH^Kp~H@ItXl})-#`6vw4>?q-X7P$Thu~4cXw^1@i;?6M5iR`^j@potoh71 zk%2g4fvg$lWCv*h-39(v+BdEXzwidLB)w}BzgjB}KK*~RYpq6S+T32t?pm$m)LZaWeMcLZ zve>v-^U`kNX13@#vRKNjU*cx1*p zsWeOL0^QVo-x<>R18L_|>z3oOlFsdXy7pkXl4nLs>Df3HJ<=G*&wKMmEW1&aOZT3B zO@?3TdAi({1?_oa+X&OSr`(+KcT)SrfSD_YyE@T)qV~crzV%|~wSB$kuMXKf?E>d6 zq#YbhHtZg<6qW9&eUL&^U@sp^9?Qzy*1zc?GX@jSv~4n&FLC0TUv5Up)oo_U<5c)I ziG68ET5@_y+3(jU@JlP7{(_l-J9O?cXkmTkywVc*2h{3ZpSiwLV-CqH{kj$nDHms* znJh+ioT>H0w#%+Qo8$}Qe;>}Xw;E*_7N0YD!7$EIOmy_*l*F~P^3#Gkr%&Sz zWuD!+_WP|d@#S{&`*d-uPt?=DF~)jdaV$0?joIkU=+=;AweG>j1O1PgHaN>zU3XId zl+0fkI`tRV?hehLq-A&XC;80(cI|UXY7ytGtM;2o z=samjSL;->pv^9OGhh1;!|MY{Vu-d*j5Q_9TD_-Lt@+=+(Dgr|(=UpTZOHtA=xU5- z>jCRQ4gN@@*57@H=3z5Kbrw$Y>8yDyQAGDHU7ydNuTQLU_(=V=h27lqo6Gm7UGL7T zIJxBKH@N242HLNb`?J0K_B1v|m9+BKkB_?#)Z$r-a@;C~)a-qJhgX%XKDZPwnKUdO z`tA6__6=#ht@3A=6$$hvVCeGGxtUtC#u;5bd;6%`@xPj z_*2w8B=w;5d4%4@!dH^qzmD;vY_24ouUY;d^*n&TmE?q>ocvit)zRxg;JEgtzhMzW8L1X8)BmF!AEX0+ zuFsQ2po=><1LdW>JU6Awu^OZ1WnQ6l&S(KY*_4E{CuY>Gj@rM!404G5mur8$_|MT+JvT&L}oG;Om*Z_l&!SnE5> zSRbp&FJ!Vk(LcM*eRP~Pe|*})a$#Oxduyx(!|vQzW2~O3uJvf^HxBOf;IiMbi{yh7 zrM1aDco9FCerLCsakQ%*czN{G&iaEi-&tlG9(f_j47=;^TE-;p$+c(dbNb`f`o&$( zb!?=zHAedTg8TbrGmA}&I!&vUPGmGm8v5JJEMp-*7ZzE_r`GM3Z|?dxhR8ji@l1W;UD>> zqw!%me!rO0S1RRuX}OgMx>2jL!H(M=c?gM9L>AC#m z-(CCW^5V!om2Yk*w;5%cvp&rEd?h(b+RlBV%@Vygt(br6OG(#nq*s&Ba##O~l{@@G z@K%3UQ@Bz0KEpE&kLl5)UwN#CEbSZ_J8;?=$20mQ+wYf#-FvlnDvAH-Ru90!g}_25AJK#Ca6Fy`%4UMz#Y?9?7#fF-pG`ZSnq3_v9}O zx%%14EDjZA(6N)-9Vzchnj5S?SiMemX38?Q5X>*Mu3wbj|H0K+TvLvbs<5(sA`bV%cX(@vb*Io~_*#XF+$H<64KuIWuCDfYp#iOx9nh zjp!FgR4!EF96mBF4@NJn3UlDL_5V^Ih?XO3cW~Cd>$K)WL$+Esc5`DsqfZm3kW6=k zL!1UqXU2%5l{AG@xvgxK(*xw4X z_D3+EYQ~Nn^EZj@{-~XuSh)`^timdn%L+`tJ7lgbP*3HD8sE2%oKTrwGP(0DhvON8 zlJRvp#V^+z7Z`4i%8;__1Es#h^F;68pLehZ?5He?bg|yJ zd045>g-3m`o;~q+_&6S)gWE&tztf)MbET_@C!Gx4hr3Frnhi{Ooi5ks>q>9)f-xH_fJGl{TCw9a%;k7|4nJS@>N}`3}v3GN7!9jbugV` zat$?{Ql1a+cr|8YSjEnDGL}v#HdOhwcqLh9UgTU^^64=OGBnB819AD=dTOGT_3wD) zW7itv3$dcFuscyR5j(Yp2gf-QllZxFtwPgsSL&uA{;@@u$k2G1ieOsef&kr0l zvJ(#*znwonN(zb7p51u=ur;l4zp2&y&DU%Uo0(G`cc!89Y9H!7@tlt5x|v@a$os%p z>*sIQ_6m&z)2t_?0Z&BEmf%q8DFD`X`AOZ+C94kNP}>FWy|-(;Q7JH;OQa z@er-gXHE0UZ$eMC!S51gS+TAfTVp3V{!7**#r8Uz`xctNDDwJ^&}i?0w>y5gJBHSgM@OyWg=%#jepJ3=<%I2O z@_d+nfAU(U=hwrz-4gMMxx(4EDp5}My`hm8t8D4zeeH>pMi-e!4St=o_We^;Ka?CaK9kyZ9~cSE!pvf6Op(6!MLEB$QaP~Q$D zj~u#IC&@}6v-4n~@3Vd8xIVa@qzxvdtbO9)SJ>%CDv8EFF@2yKP6=(DLel)iVxsw6JqgpBlhU|=Z`^DppGj?Ft4xtKD5XD; zzuN~YX(KZ(%#WeH z2Th@txeMomGk&B_V|^9Z->HsA>Wz!trDwXg(ZRRrDS990aFmVIu~9e`9n+PMZ_wA4 zu^#94IJ>iRJ+7~<{Z{hjrg}B|ekq@W$5LJ`%bhPW&bc@mZp8xai$o)yyO!BI?EdJ` zo+93UsXNL4(KplAK1OudoSnsy4km5s9W@)gf?Sy_;sC>Jt)?BcD!V}5wALL=a zyqs}kE1%xl+t~^*Z>3e7NcyID6V$EBT`&c~Rqqd09VL z+rMZRlW;zC@3dCY0Nikl(uhP&{YftjgfGeQu$|vJDV9})GSHpq?r|1#Z9W?3;#1za z_7}s-xf0gT_Ww%Pjo-=cy}mKsJ-k^b8;g&RHy+9k_GZ$3qJeMO8Iskg^Fh&1N${1w z%YPnOGkH$Lw?5q!{;n-y>H{0L^i7pOiu00@;${Pq;@f+M9+9=5yf%vKjbJ4YnNIg5 z3!Ue&{z&hDfT_I>3p8C(rU!kQJm;H*clY7ydt5Dzdnv-P>h=&Z0W=R}09 zJkfz(*7)}7VE(8G3q4~Xu_N<}ajfa1*6!q0|7%-!u6J#9Wok9;d=y8IACceIFkNMK zg~;2wd!l*Bz)fMo>Q>d|{E*pci+OC)7#4O*o!kV%n}JoSYzgxERO5`=riHD=kB|N{ zXZKK}IsGpe>N&kCYZwpxagyi#YyV{Je~pLoBpzK(>zE|x3*gVAgTXq^C7(435VdHp z3^$xw#P?zz=CR&*()H137@uuyYQf6ebX#Tpiv=nEnc=^dA2MT7KN)c$E1JvMn7*(3 zm!$2(t%GiN0&6k+*AUJZz`OnM+ONg2i%GRg`WKbvVCzGpV*Ew~-Nie?@0OOo*DormU7HT*f5neIaiX%^X{m<|JEmG6NQTGOqt9JF4rw>Gs!)3-k_OAel9LFF->PD^A_Vfn>`$p?^A}; z%w;^iC(Rv^%cMEPS|3zfrw=>Y==|zBE`zs_+>j8TtBt%M+y7yB4q@+ppw@q5+IU7s z)~LI#(!%sOx2fOi7P31B)BI`uc3kA7x3DLM{Ep)A^=6iJ#%FT5=Z2jAY&{Rl)7NNy z{ZW3uSCWBmhwjf5dHPI}=FY4(`8jiCMEPA-LuOgcn4(nxMOP=U2@UvD|H$^dC~Kc; z#YfV#*ji7beOIC2@wNX+bSq46TKnFnPljpQGZdTk#B*jnV(XYSt72dms#(a_!t$>* zdf#jYowX3??(F^Mu5|vP?kbzBIF)?wFNbXQ!V{Htd)9;bB7AK$_P0k2S`6%twbRST z^QMpe&Xd-&|4%O0>wB3ubn}%}t?t=bLqET;)b})Nc-~VT=!D1WGyS<`LvouDdF2F{+%}VJC!v3-lr;oEZaP;(4LL$)TYlw5$76tvD29c z_K9$F)5rn4n)SUcJkx-iy@A3ig zWLb>t<7avT&7Y}ekTwxcI*SI)I`X8^oK|vMzry(Rg!8OHIxjhVPwyO_k)1MRH~SpA zNXE%eWK_xQJYNl1zoaHjcwoJ;C*Q5fxZWM)`sDMX0F#%g*E|0x`2ZPdN%eo!G{<2^ zYPIft);L?>F=1#Rd;4a{Mr|;zea3cZ8P$Pi<{vKvev9s&8<_sYz_xrtzHn<2dmBsa zY_0+qa>m z@21O5@x?OFEN($;VL5 z<~}=QhZyX%?N&6ynwTDDZ;%hUs}bh4aR*N{IY zCE>|z{U@Hz`hdDKJGHM5ZI%W&FzejV?l#cjsUbm`{AL(R8?4lc zZZ-x_Jf5+qBN?v~^Sg@qjCUqWWE-wW3p}OyB>MiFdXGOlj@vU3{`KVQfA06DuE?ny z2wzN{oGyB{kGyjnCIk%18T=-Fqn1Qt6DeAS8;W7#;WIOR|MJPOE(ZR+wSV5{GYh); zCx_NdlODdbaLVqsFVV!WUCr$=D6hmC#d*WhuH7Y@(>f?(*gWmBxjp;84C(FqjCbJ_ zGywUa?!2XAd_jb*9Sk>o=J1g09yNz=pZ?WPvj?YUMPr$BDBYn?hBWU^87KQ%Lx=qP zawG5lXM4wbM?7q1Rh~~n7lB-5frjTw-(5_RO?EY!kW=P;C%Th-<2NVW_|xHn{KCbp zkHxNM56s+UG?OoMV}3R*EI!yf)~g$CV9X(Ah5UG7{B=r5Xb->X-gpIG#LEYh#qi^F?wc!_PiDkTJ?`uGi6!lwUwq7>?r5%X(*I3wCZn�hZ%_>yzBys^w!f1a>vwW&O)W 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

nl7quK;b$-utR1;vr&ifJvljgjOW9?_3J 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

mQSSOwMj@zFWI1Q%k{TmhQ;K-4oSFu3X$j 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

^$Da&FaYpwH z8bAwNAZD=K9c!^|S-$;;F@zkwetjaqU=Gtqv6QD1?sN=m@o^^G*gLj4v{dal6_lOu zKa3zbeLUqdwL%I03v?)2l9f>E*-9D{w%s!b8G61qwHE$N6)VRsE#$(rXp1~^k%RrU zXiw2E+P=CN{8v~lLj*GX>UbYm(6Y(+{f{ePzkj#+)cnRR;Jq`N{gsG4&NypPeYaNW zKe>g6I__*`bG#DW!|&|4o?5Gzb}e)2zB0Y0x^Ue57R%tLjC|y|-Du}y@3kX!An2>w z@9a-EvlqK3d=DN8e7LTCjO@g<7hFHZA#@!Hri{kU;s)#+ShY>91J|J>Mw7>QUd-(+7r;(6=Ua#sD* zL#sC~DH^rY7Ysi{r3I{SRQy}csrJJ`N?BH?^J8U(0S_5}B)So~JZ zNxb9z)yYe{*lr}b`keDKuVFcC+><$iOuznX*<=)a*&gabpb;DLnM#{cN!#YENE6b*f%b+L?JYbpEJvk$eiZ{{+Qe`P-DKk2xS z^v}Vpn@!8+i~+3eh1ILXIc>Z>3{Fw@XG|h2=wG^KGbO|jAgLaC=01G1`>$S`b`R_4 z9MCM~-h7BZYRPF?apNXOzozHI9#~FTwysd=sL zX&lhZhY{bVm+3hm3LlVK{;NGnTly_J_qVmI6vRbu$k&~jJv&-9EuRmAnT(1rYdj{a z+89}r#*?;WVw&}5r59)5sye5R>x$`gv;W88aeBD{a>%wkfO}galXXTZiX7LbU>)rp zF2(^yuGWm0&SRFf(mz9w4_D=O7nxX$mDI!Tj{jd!YyEETIE|kEq}nhYf$}Splag~} z3c}88T8v}&xcVJ^zoXYbv>qFOq}N-9ty3Kis|`{)AEGhT6TM>mV+^#pNwMO$*UQRA zlu_{NY@BZ`+ChJKC?>Y4EA$LbOH~vl-IdisP)uO50T_jqZRy`rKN=oHETAX5?ZoZY z#}$fT59TF5U(L;fUD3X-No|$MGBCt!eayFa`FLK~+4oi_q{z%Q^cU8M4TPZLpu=BC z%b7D4486NHac5V4Qb#?Z`7s{qSn{*zJ5&ljjaIv}EUa18s=KkwJou-&2lBKjk~kAY zEEgh$a*n{G44gCmo9ZQY|6oTD;S|@H`QEZ8D2eR!rP;Y?gN%#c411w~Y_7r5`aaMh zyZrT@qrXGYMR&ZU|8~42*9c*7qAt!zz5(HP&HF3 zTDOd^)>|)BBuv0Kb6J#=73}R-N@l)&7_o^A6J@UpQ+WuoDEYwR4%9O9h{(~K85eie z9_PG8qvvbA$sT4d9d;nH?UOyxGAHJg>oq)&e3WI>9ba(qffUPgN4}5mQ}dd9v(dw& zABGs(nqFtBs46Da;$j0M7dSSE&B}E!_VVt=al|)^bkMc-Z@`M791O&Bt!b5AUFzWK zxNWCwdJp)}978#0Q-&6@7U7Q!XL(3kcfLo}jUf(HgrZY}oc4cgY@e+kmGUSv0yCK7 zPU)0G$$wIab*AhL2JHYp{B`) z;5D4qHhZ%xQO+Yn3^@>&HEZr2wT^wOzo@lp*<$ve%0Dp1--z?y9R9&Ewf^_kcK@)CweG!I5Hr6Lc3hhl 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ñUw^xNd`&y(H`?Y%?J8if4!rVaZYmZ!9NWI5 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 diff --git a/data/font/degrad20.bmp b/data/font/degrad20.bmp new file mode 100644 index 0000000000000000000000000000000000000000..eba6d1d53e8126fa4d6523c94e483a3193f58612 GIT binary patch literal 63756 zcmeI5yN_ktQO3`!AJeaqbwy<9CYF#TM_>s@$l!#)A^-vhAc17bgbo}yL9&E|kVqUN zM}&lgkRdtZKj4pW3IWmO_kC5h*4mHLkJ~eI?~M0oT7Aym>rqu-RjsO8Yw!NSpWgl7 z&j0@DwA=k1pZ;jS+x-{6_q%I;cDuj-pWW^ces8z?_2<5*8~ppC{`<=h{^ZYp_RC-Y z@3;T#KR*AR&;Q{!`|p1DyPy5!CqMaJelCCYt6#nO!<+v;e*3R}`TJ^I|Cnz2@3Ygul<<1hL7i`|a?Kl{zkx1UW0n+|-0IWeqZBLq(9r$O%9LhL(`ud{LX2AIPCWaeqUjE(x2_>CWlA$VbGt;{qeNl zAMrjVv+c@9D~%0Td%sUkg9ltUf4{A8FJ9@J{%n!u7Fj+TS+3_FO@Fq0cgygWPPWs>Ccv_Zkg(9GSzJlr0V%w#qb3c!{&c(*b&)wMn0Kcp$*q+HVK#%8|&aa;HPz^QDV;l}Ex*P}hUBt6)&){ic04Lz`b)>?NB ziecM$2fp8;*B8~Z=Ui@skA|KtZ zNazdLJ*2gR`bi!`5rJ?IPpG?Z_MXUj}7Cp{I5uxo8Ld@xg+=S^PnsKzV4n|EpDT- zz4?8-+9$Eng}$7N2iIapV!{?%_I_Ku$a+@U@<;fDb?Cvl>`*!7G>;s!%-_{bSQVEz;7eP=FLaRRNdsQaY_Ptjg$ExeJ9y?ZQ z-*Y{7UVpB-^!utqzyI2L?G(J*dhxmXbLiGK*E#t-=lX}2p{qV$TYvR+s;Ga;w1nPK z@!8Ild~{X*R&DzV-wM|BC+a~TaqeSjZd`oeJ&vY7+it-pQcL=<6|q5ozM@)d^1IFc zPWLS~T)l(($!XPq>-MbJC$V?%75V!uQv1M>+NTj8H~+KcyIa1yJwvfQL-C5!%i&A5 zy7zPH+vnPRXc=xhBj=EK$@LG7+DmAAP21pW+Zp+kcRZfUTj;{JGty4(ZV~f~BIc$) zcRne-?Tl<0`-?L6rayVwc6*;joI2j*@H{y*{qd82+uz-2XSF}_n)-(8C%!YX`TK1r z{L#Otw7%og{K6J*z9`Q6H1;)K&qdRpEzf&Vo@dE#GP@7`*=lFctuKAb?Lrr}osrkq zqCcDrYiHywZ*Q3Y)DtUM_ru}-l6NENZ86n~r-uAFTK$dxdPm(Gf7d9)?{7J8&a*!k zZ^+8-81>Py4!hI+8`?}~=lP`j)7{}d-Z#P1hxf<3Q~NvFy34zs?(6+T`drtT-(wxQ za?Ji*doWFJ4%er6BSE&}D&rp7Ogs(COkDMQE<{_67uO{XaT=cRcze1#CRHIBT8nqy z|FpknES&*bNCT?xc=}4xiN3rY0f}?%^oD1$be%OSS}_tbg#UQ=!Y#dS`R3nhWzOO` z54F0>zb5{W6zaVo@JvlX&+`W7)rY714(yS~42%U8a0eB>qPIaX%E(X7<|nzL7c#dr z+=`iw*PVkV58fBRJiI?*A`hrK#t!`*z4gu_y;s0btBn*P=e&+&;DR?AT>6a?>Y?{k z#M`uxigcEd)LPe&BeGybziq4DUhyFQBtyoP43Vw4Jnfh>$LDo9@fMVl6XWGuvjQ7Q z23f&-qnLTRyto?t4)RLQXy|CGg;3qV_Ik=AyO3hEmt|Ku}hS!PiR1CpJY^A1@1K)&uKSF>ghRB!0(8qPa_nJ6%f92K|@z zSj?uDslP}r-fIzm=N#>#t)9s)JF+y)e_io=?L2~YmXRbM>0`8Tk7kjKgr~fgbm}d5 zgZ_kUPRw_sl>kmn*9kOrO-Ncgm-Zqho6@^C+<(LP*1^IosR+#qit610mJV1*+vKO^ zAB0WzUy)L2Mbp&YI(4FE@SEbGC#@=ZwXTG;k+Z!f{XD9qg4EJFQ(oQQ1aIYS?^k3d z)crn2#*g>U*a{dGKP;5_;q5`PnPz#CoU}laMH=zhl8Za&U&_?2+MV#>yMwH8uvcaf zFAM9V71u3;8ZRvz?GBBQ*DBAb72P^#dfp%*+b;;&`ssuAdNfJQt3}2P=`HqGr||Wb z$$rm2(LW=o0Wfh3^JEAx& zGbL~PiqGf0zt`}TqU<}zOKXpQj=-QTY&Ce4K0!Y}Us9$o)r0_3MZyF=9Q=kx!5erGb*7sH?k-hK+j$q??~jdHcr5?ep{wGORoC7OgXJ2y$4P zr~1S*^p>EtOY}H?VdhuZaZrcPla9mTvFjr1qdW?93UXsLaRq{ovgyej@KkP2h3wbR2MvoejJEi2r z>5i? z8f`64s^j__c~56b>Hn0s;Op-$mvo6w`3A2%MaP^jcoSWk&lZ5bMDA18I9gzD*WZte zbt|%luJ9W4j`vQ4H>!D&6SiU*`u)RoeNNAp$-@{MnO(d&HOu_QOd8TcWy*?N&dp5B z_hkM{wuB8zzbn6<&s3x9_nbFfD+=PCWK{JDT@n6=`$qoJxwJoQZQ5FeN0AotU8Ap5U|P#)m63?#*zSZL^F2AuTt9qKvaT~Oo}6_Mt_g~-`DPeo_03#~?X z%z!PEy*Z|>3@!SJZsjMUtNDM+aWzf^i8f!#VHsOCjwD@Y3mSV_U5FKHA~n}*GD}>d z0i~IJsWRbwa*{jw8dr{$%Z0w#5*;xp25!EY(ejS*s2WV<5OIf$-%(dcCiDi4a_;0+ z8A+{FjV#ggd5i8Cg+!(D3F(!h(W0cPj8&hCxJPfS&6cJ^HG;?}$2&tNW7`|Kx;#zg z({uI9b;%*0svb}mc?=g`#T>ZgTf39es41+~3A!C!t7d})hAY@bWWZI8(Y>hW6)x5) zqcFs9VNXa>wGC0EH;j)@fk%d0nd3xJL=jYA! zI9|bR!|OtvxOxUX(yE%#`MP8YGSVMcv}n^k!zj1VAzDpjQ%JoMH(BAZQaoqgsiv+` z^_14HAciEIYff@{$6SS-d~-xlX_3r=RKtIVIzLX6ErKrS@go@VzxDpDw@1D z+cHOw=sV#DX7lDcw1`K-TG71q_LF!mqxQswY{+?1V`LhU zg1k$tS@dRP(fLS3FOEaw(Nm;G529q&>C4$TVWpa*YTeFn`wWxJApAtLCi}cGl4dm5 zha$e`bY)bFY}w&?y&pjoGLP;DKa4a)Rm7yR{}|EX(%zJxtjc8(()RkKhvk%EEjCpt9lBDuDC* z%7f(>Rx1VIpzP*85QzM4tfz+sL4SCbhz$ah;lxc!KX&-kCTmYfX{CCDEbKv%(R5F+ zo#3Hg-%s*hHk3_jM32oV`*W3_*;zf?XZOk2|JXb_bA^;0-_h6gH8A#X`bhs)>QPb8 zS-aP3Ss~SBt-VPVeYe#r8*q(}`NIEZoSij5Q7Em(C+Lc`&mP8pYS=T=-T4@d?HaRq zK_2aMw$s{D=QCt~6&*3xSb2;JWN?IZKoIM3MZIyuo~pIlyNyXnap)OzO|?P$Dn}@~ z0=Bk$yijOkR<71YfM(WdRm@c-!IFk=+>6;5Iisem7swOA8CH6ZBSy+P{J>3UDOINd zov1`%F`6Oyku}GP<15}Pn4OYJUM9Vv7eA)Tpz3r`P~W10A8nbv@e)47_IjR^dTVrg zPI3xaq2^aTQ&lZ}zR4XKeU`5G6Ki8j_O5UnL_q_{UokXUCN7g9lp}lYSM}f68PWM1>#n+A0)+lNzs(Teat{hy~ zMh6(}LAqc~39X>gmRb>VrA^alS-d^8t=MrnAuXHnW2 zu>D;_Q_@zHpqdq21Wo7zQsrles6^|e60VrTaey(4&k=JfH>^7qg;X>eInKPA9F!4F z<+@cTt+cvpEJeXHiY|neY$EW7$J`@BU$RHYQyjV$0G;9~$2N+U?V^R&W~g)26l;H- zfRYqcnM6*ar=4XOc#3F&89ajI2?lXuBI+E&Su;k7>ckuQ!t&`eX~&)p6tmW}$lYGj zyGzg#`SNW;Qc~A7{xV|bDAKQr=G)zru)d3m*b7)YYo=3bv>M}W)7a`KP}4r6DUxl> zGS+)(A^kFr)-zf~OJYVn;Mkj%R90WI%s+EbFdR-DmzM(%3C{(4!F{WT-Bs?mT{tJ`F@Up}K| ztNLsEZp|7iVUd3z>7W_TqPEj(v(k{b-{bSp*!b>DKeb`BbLnuM1}#*{QT48Zthl*8 zzKT_5o++yuHK>^G%h;RVPau3!m~^e7C)X6{<=E*HCXHtSy7=xvSYD{|_Duy+j%w z8a0#NQ47ko06Xn^Sh9|cOnm8{WzDpz=IyJ0T0&Ub$}--^0g*GIUqk&{lhmGg|Bv zzj1$uR+G`1PwaLnzN*sDb_?o?_XzpxvZI}|apGU5rf!z|-t}m&x#LHcOxjV-VIwboI)8BJcd)^I+HVd+z3M)NpjT=&-2>=DEG zOWZ+ijtafu6`t}&*&eNpsI~G&RwiWjRGh>8p=Z?HCBIy`%*242Kv*H}x zmE@IW3{mb=9EJUPRUwL5;PQwpp6Izmw8aw*(a6P?=V)4%0X^+=>E@X{sr!ST-$xuN zomO_NxTv&8vL%{Ex_IVV5tuFYKQcGbiLK`fVaYo30ndn@i42;DMN%h6)AY{~^ zn+*FXRAno%9tuf+OH`M4qWY4pjDpA}mHje(q_?e3Nc9TZqxNXo+lK7>SlO!P6`Y0RcvZr9O!t=b;wS#75K;|;mUC?jHsD&%Z;3XK_P3J#D9 z^~&>i;BL_eJ9n?R$LC)2Y;6}Kwu-ON8=sIe9gJvwh><#O+7Z5^y3_Tux6Io3eAlME z>0xEZq;^sIzK!-u&ULdYS&jLG1r5caDPge!V}r zpr=z#lP9c#x^W*zvmWoYD^~MQ_i<{EZQMsYx05&DM_cZ<)h^zA1l0&)ek{;(tR2Dn zU3AQQj^AT%@38vjkE}w-j;#;O)^;7g>>SeF<(^%?#(g8u&_~i}s`OBFNL#aZb=}S< zh@Zej6cZ787nUf(dwa2usBcqkSkt*duO=GF=-%C%?n%n4iJx)za5e|p$(v1@W{Nj) zf3XXRulk;-QPE2)8oS)?*}R7oqPX;d?UW>nkITR6&D z?IV4TK-Y4P%HmyL|(F)&}?HVTGBV#4#Bg8%`6w@wfa_r%}b=YHt z3TsE{U~v&EsPvZ~Y{0(eL5LLH?FkIfNTeG6w5d6xy4^F5vvCb_>oH12AmqX$~l=ZZcQp+#%0elco8QmYzKtF(d&Mc`?j$~+Q( zp?EjEhICj6MwDCGe4N`NrWx9T7Lts}2UL+r#XK>_h^grH{6?t0$uh!flGaOEr&cLe zS-51y&VJr2LmP~&aGugH{PSvMSy_D^G8SbtPvj<+(YYNs)#pYIhw=FK-%pc2})XA!v>g3m={GvNe$P~Ue7?=s*Z%F zI79X5#QC{)3GLXCo3zGrS0%+6jX97vv_Hd6TRdewFg5fr%FHW{S5URj>-y;Wg{)lT zHUuMrzS{57lXX2&l_9dy*mtcAwX(Z@xAQW$>Av%m)eopG%Pmfac@jNkj;<=@cU!cz zOL7|XJ8|AxGj>#coPol<-tZx8R0Ys}6L*dGwbq0I!>i+>7D5lC992B6NX*ly;9elj zI3Cyip~H4$&7=qR8Y>u|p=HF(NHEGGR;16Qo#+NBot6>SwTmr%w{=OsUE%Hi#I>QQ zp<+S(oNTL|Ri$CzB2X(EL;D*JVLh^M$!@fy_^$n|tKQmUQz6JJjn438P5L!oXb|lg zpXve?SfP#_ja{!T7j`i}`DMed>yE6r`_@?9CbCS8FAH=f)IQ&7AaoG6tR2sLcF*4D z#_3(J>-}zcQ%Pv=nNx~x)9&yF4o zD!9{ps4TR6>l&)GUHH>8DBE5$zNn~if%EL|9JC58^OU|Woyzm@3<*`D9?r@VqKJP!HNg(G(tAe0nnrVcS-xzn{X=%R_;h<#; z-wTD&yJ9>0_pp+|1LIJ!%i1qi99Qvb#bT;-hj(tibKtP~?I$g``GMRK)haRbzi01E zXl6J;D!ol%^_N}#sbV|fe*G1{>a>c4~3*UDY`Se(*BA-btRnZZ=JtNu) zdoEu~A4xLyO8njAH=ek&nbNYyx2J~i_xQ+rHld1p++joP2 zBUJf$aH|-H{uGzB+f~0`wzF0{c&ch>M2%7-=(m1!PkV9t(Nln;LNe^nCaPz(R;!{j zM%r=ZrQ_SWhP^$F_`F%5tUc){ZX|WB0zyo`S8#?CkZ=A}J$TFD@T{JwpF9Of59vrr z18QeGfL%u1leFIMABvh$t0cz}c~Lpl8nx(u9YIfiii7cL$=5QAycpZmY_!A|P_GH! zB^fvluqP{T(R_~h&Uhi>Kl?nMR;!qWQ6&j^!}P$hEc)Q&OVT*@5*70NH&N=`T^0%zlDA?W)uATux(JkXw`E*`v)0+*G)_#fu7&g10=|%- z^`K(HCjW7VY`-fMBq8r4LT73*v>ZLq}agAoP%!MmcN9Nfs0lYTP#>P@&pa*oIat?qL@taqo4;Sf+!yS22Maoeav; zEXv5qLtGDb-kNo(t~HY=)Z7RW=kWA3y3o)v3)Y%>9FHZ!r?73Zgmyd(mKYWo(ck@m zMp!Hy3Jps%a#pf!MyYC}GHCAelM<5E@C2ChamyEZv`Ed=THBLu=t_P<>r{C`J3Ey^ zC(v{)z3=2_ZC!IS0|=;k*#62#^LeF%@=Z zTJlUwiJF1Eg!3+T3v6@J)bPZ%L+69HgXGD2?8o4)NnR~^o=XqpxrXR-|Kc5~YIbRf zGYNBV-2~U#HMf39&QNw@n8+t>N78qs(KD_2Uzo7YCBD)Wco6=kLib9RVU3|(QM1Ss zyJ=C5E-EUOmLkj47$}8yU4s%;9A)c?fGEz{R`v*L49iRWSH-y2%kWu9(mYC2kd@w+ z1;jz+V@Oa{V16T?KFQP#IQS`LsPL-DPEpHf(S?SBbPx%OTOoBi34sBz#Gq;zAgLaq z#cpW|;GkrDu?KQwR9-LEO|4YS85ku#T3<4rqJOT4<2ejTo!KTxNRJB%X)NoW{BIz# zy5klj5NY6p;Z(H0P3w|3kW^yKSli=So3Mtb{7`r{S6f*LwbD4oW}ec#RZMK%;648B z5^J&6e6W$-gx-OkbWxJCg=S?ukVLZd!egiv{k}4ckmv*>z86Nh$AJx~x(Hy#KCGqu zp!Y@TBaeqSPJ8is`3P2)J*u{oWL)*mlMNwB{x(>QHe1Uj-(0bxT8}kmb|8Ntx+4Zz zcr@;0Z3M3y(UYG&c8{1%YpKTfnqma4acH2uDR!+Yudq$u9P#2%+ zhb)kX>Yx6NY#6g*DaR)Ij`tHzP{pW5#MwYw(~yMpKpf#I$vq@9kRIZJ!2{B==`Ioxwz;cf zi9Ql9b6!XZgAp09 zu$GslBqCE}pb>1Rc_r68W1gf^c5Aib%qS@o}#Y!PXnxsxlO_DW(6ax6Yahe%DH zB{HoMBl!-k<)IyLFnTlNphzIr8vll7(~A6!kr6J0(21nEjv9+}`0e1gSd;Q<>h%}{AS3+2qGkxys#G9RS9&XANo-w9bWb6ZS+&|cT_+sn zNM&m1!FbHtcRJ#GP(GJiRr1V#lUTo6D~aPPR>bTt&&Rp_+|?MQq-P}puVrM53?8j0 ztLm+l|3pNL3|Iwg*RE?O^UrF?qa5y956xA(6E!b#NL{Zz42{-n#CYfX`0KFQ(lv&9 jKBV+O>#K67sL}WOz35PdP(M}Q9%*~5&L6u8yZ!$IW6Q!O literal 0 HcmV?d00001 diff --git a/data/font/degrad20.pcx b/data/font/degrad20.pcx deleted file mode 100644 index 454bc2832b93c757ce403a7a51302307c96b9fb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42992 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 YR)1)k-#3lQfAhb8p8uZ__-!EYf70o+&Hw-a diff --git a/data/font/mouse20.bmp b/data/font/mouse20.bmp new file mode 100644 index 0000000000000000000000000000000000000000..067f8d923188004eba3f55058761ed7f1bdd9157 GIT binary patch literal 1568 zcmeHHu}T9$5Ph?IcYC*Y7nRd05QKmP0v4u7C4n>+!9p!kC|CqynIc6RA(aR=*D0wi zEiJVZ{0ToIwYARd-W7g=kmcU7@6GJIVOVx}x*x%ENULgfmHL6RmrORZXfJ$$i+Fg<+y* z1M4>gEL$hOOxTbKc;~~Gb;e~R#C8W}GTsVQoMD*gZDDx4!VCPrTP$wp^PAc1dNLWt!{LHrd_y6;MvRwOFNolO zdU3X0TMf1|@E^{Aes}JZL{kfPcga-}d7vMgF-a)}R>chui0%;M%mJ&%ZUf`O2HwC% z2?Nhdho^YA{=ylVG$-&vz~;o}$^pCCb2Az;hU}*0T_T;Qeo*0;86{VG_GFqJU>%2} zqK<6M&7k8JTxHx6M}xi8&8APqwR*u?8N`(sapV3b;FsB2nxujUPoRqQcSZbKIVM$Q zP^XlL2EGK_*UhoYoK_7f3}FSg!H6w`lb<0Ie5cId2 literal 0 HcmV?d00001 diff --git a/data/font/mouse40.pcx b/data/font/mouse40.pcx deleted file mode 100644 index 0d126c5315cdb1d88d3dc07b36119027532d374d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1584 zcmeHFt8x`V6zqM??9S|7b7f=%R3$z#9}tO%Kp-NJS0Ey=rSYSStIdn$taf9zEl#tOlP4e0Q_mOxJgMvWK|4=(d7Dd~`nmC(Tex z zQzeR+OBR$9%9u^5ZgB#T3wb2>Pb%gilf00U86z9}E3>Q>^CYVvHtGc8J63~I+D2tI z9L~4G-q?eJMOm3o5Ed;9?htKgLMR$_Z9kH>l}^Z_bI9#d3=GBASL8X+m~3IJLtY|) zRtYimvn_-#60Bwj#(C&-VzrIN283j`j`UtZ`fk*E@VC857M+o37_v%46S#*;Rh%Nl zJf=YpkVHsCdqTnm^@0bIK<5?n!Fg%Vp+%UW9nmAU-38`7BL;--a_0Sr&xvWAuIfoO zEmNTlQC^RfY=bXz_e|U~NCd6XE(F)NvA6|p7)Em9y2V#C!X#7h4Z?^&iSOvCUEn7# zX=nw%&|-;q>-F2!>dn#7>%+rW2L~_r_h0PoJ>S_`Z*L!OZLOBer`|uY_A&5?_k4-t O-_P#9dk6jx2mS!rUv}02 diff --git a/data/font/void1.bmp b/data/font/void1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4ffed2c2deb0dacae45f5cbe552bbc56393b973f GIT binary patch literal 1168 zcmZ?roxs8X23U3NX=!O{K+HCC=1fjouItPiG5tm$#V`Q17RF^@5N2Sguiwv*pTC_UIe9%pc=&P# zZ}0gG_V&{m%+325w6)tAl$Gllq@~LlgoX1NxVh6A*xBQO`lEq37_7hebveT*9u0%h NG%)ni0JuD01OO6<*wp|4 literal 0 HcmV?d00001 diff --git a/data/font/void1.pcx b/data/font/void1.pcx deleted file mode 100644 index 7ab016b55ed3f69fcacf3bfcfac0be2ad202ac1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 898 zcmd;LW#nLh0v$#jMi`rDnvs!#bWKR6^DqcA?60rio}a%yIeB?__Gt;h=H~6% n+V#rH<gvpYLCK7aix7kj=YBA+n(hW8y_l`dY9+f?Mm8OEuB zB=FqDpDoTW-hRBf{eAl8$8^zL|X10IVa|+HH)fe9;cptK+I&)bGkz_hhI;$@CF)6Pf5l zD&3Y~>mAwC5wL!}9?OB2z3mAeu!_&$m~;` zn|Nn|2UX1JYsm$D2+aW47Px>h!Mn6;^1-yu`~K+L^_jMyV@?vhTbT2_-0O+?cRcbf za7~`~LBHG^wa)wAslU(1_(2~SpW#g0KVvi2GX9cxjC>m}<1;_U(DyK=rt!14F=sxT zJkOdTx6V25TG}yoWqa_u2+F@u))m(o?$GtVzR$Top8u%UaeuB`#}O+nuE!2~xX?w; z^T#`l9P{Hk=W=idwT^Zjt2N$RhHqdU$2?`I>7e_yj^B#w)^Ws2yBF$sk9!N;AW1lm4)@=RWzUhAy00^i_H%`@&QKZM44#`gMT zje4yG^qO49reDvOuq8i$Z~FK8^!WVFD(FWG-s_Kh;C+xEfv=3G|B>Z`wKfJH@gCO9 zh2uGT8v6k4OXSh(ZvsEV6+EDKM4Wlz+UvEzJ>|#^`w#sTz}c$`+%}Ma@?Oti7`We?4cK?7^hhG4e!B@xcAnGSM_=zm*7Oa7hhs8u}}Nl zd-x^diFkj%uzBqLDrdHi{|zm9WqE>>knc>M+PC|5Tid{sF#H BOXdIo literal 0 HcmV?d00001 diff --git a/data/map/007.pcx b/data/map/007.pcx deleted file mode 100644 index 143776666a311599ff0fd0cf1199d9276f05fcc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2532 zcmeHI+iu!G5S@{zR8{?`{zLm^%^wvo?Al=PB?Jhhfyb(<`UUPeGd3m{()6)X5R1p> z%w=bGcKGm4-wQrp<+FU!sSE~#rfG=0@}pOxawT70ss324kw$8)=YRJSw2_~3D>J=^ z9OQ>)vXQ0kfQ;prM!At%*Fc8$wvv^uq*VD0l0q)<8w|}f!PC*Dp*c2`!e*|wc+O-g5eU%;G}kTAxh(LO z$^r;=7rHs25s6H}2B2%8x#Xr>AQC+-kz9(spQAyF7M(*UL-HfjEwzU3Qi!HfouLtx zn4_E-7(7N;+#ntmEIKaew})g2vXq&*iy(bPC{Zr3s*5bkLzY23BAqkp5Koq=Ha3OC z{hYH4*w(_$I%_*+SSqrX*DV=vdKGF%7ZG)is0+h!C8*0&h7J?dkKPh2CU;{tFEK$U zu%S2FaARw;VLE?fXd5h%O=}Zy;)R|1Lx%p(8G7HEP0!HQ%h)mO?*cJsOF5zwnZI|{ z%MA5hbJyC?cWGJDo{J2#w0nelJIYvlW7wyR3cyKsxVO`F(oc76E*`QB*R>tpuvk&= ztgCpWbj)5GVsSH;5KZu; zha+ZHZk8D)(iqc>sX3b9jpzsy%u!rz=y3Y&tQ^O7Hg3_awDPIhz4<&{+ub_0lXhkI z=OEn>=9D^|2K3T$3Ye{p4iR%=(ggeKrNl7a#pk46ua|m%m;OXP{_}s@<3Fjl_qPiC H#})VkY1*A7 diff --git a/data/map/213.bmp b/data/map/213.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ba9b095a4a73522cc351299a9dfd713b86f59140 GIT binary patch literal 2860 zcmd^=zfaRa6u|G=(te?o0;T0=%kK(G475;wqrpK#f{D($vSQR2V_02W7<6IvuW;_b z;K1OZi302#N4_hvmGY1C;MMnJOsxg0$#F@X z^}}+%eQGuGeg?Zyt2Slx#gnoBSGKQh&Q2{(DVYA9Bb`wkWmR;Q#iyNJ{94&1hy4AC z{Q^IKeTnho)$TK2Ze(T6u!;jaP-y(V342Cs>Ge~{Ro7X2 zOm&_Am9wRAqcS@=Tvv6SHNWcT^|;ViKXcL**wv=^` z;&YvRU96X1bIbgJR5Bvw*hc?qKEyxoVh(MG8FlhA8#lvFevUlojhGU8($kl1?2=x=$G5Lqdr99ykGuF@J7OmA-(qw$*r*vt-z0C$ zv3Yc1TjZ%cdkFMXDCaksr5$&)YZ_ySz}r~n^u{3cv` zZJa#H=iu6p6Yz}lzlSX6njl9Jrurm2VY{e(l3F$S6g++npT#f1IRosvw`u%)-CAPn zwn3xkecK}Y)Bc~qUt|1tFhj01wg)!RxF=H~pff2VL%G zlRIq1wH{I%^}UO4#I5D?9at-V2X0&VU*=IW$r^VVP2W26{cd0vzgFz>`t{gtYS7$M zoo&IQZa=fkQ{?mCkFpK?^!-TvrWxyAO{Mn2)?ivYVOj1XfLG{ueNS@NIqqJ1X$7wD zX_i`!z$5T7T))$Hxnm0}d2c4hIy>ZEg!Pb5?mC8^BS#VDzm+)g^4?~N@!v`SPZ3ju z`)?&_JINK8dGh*iC1v}}Em)Bl{ci8aZ;`!ClS{w*l5CM0dsrqDyuHqbzUVR}l>?eb~0j-50E1un?M zj`aE0TGH;?dGSo23!k_0T3%_>%n*XKBz?2o?&X9_WvEM{vLtUT@-IF?g7i7;oJr82 zYnna5YNPtdF-&UrYqAsl9+ezNMMJhC>FAn#(~69>F7G30>#|hQ9YMc9`;j)aAsxK2 zR^=yg%>Yg&^-=y#~+SjE~@q&4}0xe}#SBoBDU&~79_D}-a7g5E`RsItwiGn_M^ zC2!?a7_KRGya{wU(ofJn<2CUvp!S=IQ7iw7yEP&?`Vk2ZETagjg4Wu?hZXwl3 z#%K<(?jV&Jau2cmGWpEeG!JNJ36)u087=T(767g%Nf!Ij!z;;t1B-i(iL-usyrxX7 z#)5iHWp=Bj_SggkwR6!jXI+Z*rdea1wQ0KR3bxEd<`a;~YD(u6Wif?0J%)Br_{8S4 zpY9BDdW}?M%--X(KGHsJ8R;E?&FiQD~?H^zL1CPLQ$5Hz zVqI}!f3c7+ka5(8eu4hP_sGFInW#TQO80QFYkE6(ERd*sO za$ePK*^inm)fLp5c&DjwcP}-y)?LfjTkU?)diRS}9Q1xVi$QO(ZAaMpy2j3*&zIQ# zbPPJd_UC8NGi-mt20g*{=WkGZAo|nU>`I(P8}q48{CQpZ&GC{q&!4@vp8kUSkIKzO z@7xw|<~pbN9cH1MyIF2Wyw+{^99WEhnQFt!)jz$wS@oIQEZbIuO213(OV SGG~yLlgGwmF`aaAe*Ot4yU7*+ diff --git a/data/map/4zones.bmp b/data/map/4zones.bmp new file mode 100644 index 0000000000000000000000000000000000000000..76e5f7fcf8008a754fdea7b09c4548a910617ab6 GIT binary patch literal 3416 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 literal 0 HcmV?d00001 diff --git a/data/map/666.pcx b/data/map/666.pcx deleted file mode 100644 index a401654217679d295a42db0791b61a6eed2ca188..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4767 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 literal 0 HcmV?d00001 diff --git a/data/map/alstar1.pcx b/data/map/alstar1.pcx deleted file mode 100644 index 962d3f63ac4e14955d3d5cf3e2d434d1b3ed246e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4547 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 SmTUjh``7!gH2=-pME?mJxaVa6 literal 0 HcmV?d00001 diff --git a/data/map/aquarium.pcx b/data/map/aquarium.pcx deleted file mode 100644 index 6315be305c7a72266ce588f75252101847b4d722..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8474 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 diff --git a/data/map/bestiole.bmp b/data/map/bestiole.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ed45998cd3d85e85c31963275f5d5647dad1be75 GIT binary patch literal 4856 zcmeH~%WfP+6o#uj)3@==cs%!uJ!8jqFd=qgI}RZ34hV@{h$8`;un8nfHf-6lVUu-U z1d(mTJMa*!k=TXrukI@Mc#IHBL`G?K)&HM!>fGwIb8`33wsF6os>b}l>IKiwJl3Q< z#(dW_=H>zT)PW-Sz4ZUw=H$}{-#>lv$L{Gb)86#Q-|f-SQRm5%CzpBRXV0Ex@6~>* z>^^*YC}IEOxP{-#m)L#vdzFD#8Tj92;8!9(|3v1wjluuF z&hN7B2uyzacu&w7fNh_{`ZhEBa9-{fe4qSXKZo_$AHu1Y%IVj<4|x3kq2uTG;x~Bm z8pNiJ{$UCGh_i)BPBBUD9osS;>Qu(w!tV-lx+AKORSx8!=K7W9;7*=)KR zRH=jPE(g9>@E!UqDdAo6AiXa35>pTI9fzwXSHT+rZ-bAK?-OrAPV#uSSXb$v*iIaG zh5bsw&FnHgn4mv1-GU$EOM~+gJH>v^>AtCkW8N)lkRmTGL$1mU z7!>@7cbhsScEj-z=S1{jiVxysL+`QOL{ITmc&hkVGm{cOw3pD!`3M=^f3G_TT!f5u zcQf}bGCjLRzNMEC-#pi~+so)& ze&}rZ-UAaJ&EX071bm8oBgn7eLyy`Dk4m`iW}kZzz%`T@ASWnb4Do%f%T!roLnF)Zy(Q-v{eam&o4Tm*+)u zbbzfUb`pCv^ia(C^1Y4UvAxDRm)Fegk;B9ugnraa7}7J!?J~B8L00`f2A^<7CG@!D zC*1V}&iBh6XHD=W!T+0u{=UOnn}Ued|Gy?y3g zOwTm%&(9$F+rxj&iY0OuQ~OoycwTYJC*2Fp8Qq}{nCCTD`}FjV<1#1fxtW_U8GH<{ zIho;O6m+NfqgZyR!3bHeH|2f|k<<4uTHrda-nze<-xG4=^=8}y^~XirCi&3a^IV;E zt)zP!y|J^|b-j}@`@G%T#Hd-P9<32aO1*qN?!c**;xcz1=ed!y`FEW3+SpqOJ$%Rc zv54PwzQ^3pdHEdI_erzk%#Lu~EzO4WxMoKcJjGvspLDMBlglsS>Zz32{cQh?xYf^z z!?V!m$JB9!I*Uu;GHhzC*>{5;NwA@P4NiYk^A0c31;HcMI&8*)c<| zMXY{4y-D6@^lRI3x$e81u?f~k*Z&Ron6owiyxt@FK{eM|U(sWVU+XXFDgEuAue(P7 ZPsrD+=0T8em@kU;^MCa||Nly3{{rPfsUrXY literal 0 HcmV?d00001 diff --git a/data/map/bestiole.pcx b/data/map/bestiole.pcx deleted file mode 100644 index 730f193c9144ec929abdaf310c109b9e2f66b5e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4494 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 OzlU$fxK@2*6!Q=EiKy-X literal 0 HcmV?d00001 diff --git a/data/map/biere.pcx b/data/map/biere.pcx deleted file mode 100644 index 1deb0c634a3f65e8c46232b339a48c2906712ab2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5816 zcmeI0`)(RX6vod;sZ>>cs6K7;9xSjoZU)=L7!1B7PGTp2wQABhp}%j2H4A2NY*m#i z#nO6r&Ufx}=ImL1`N{ok{QYi2`^{zc;>C;Qaw*Dp{<)Xt?4^yqlYN_QX-j*@wg3MI zJ9O9ZZR@z)Zrp``?z+@2T+>o_&bnni*RnqAKJ?Trpe1(T z66mRQkxShiTEj*TQf?)zP2jdCqp1N$V)^Qxx*6P;t5wE52Tk47zS$9?#XTh;nLD+w z_%DAe-ZgTEj6B#xa-zILCh?AJqlG&G9U&u)?Uk&ab(NrBK!e8vD8$uuuk3GJYrWi~GCWcO6!D+#*gl~*q$Js*hRh`J<<9f&=)Ae@+aA0Rp1G?ZIqShX0(*~g0Gf~A= zM^o3gnSFq|fH&g`yCtrkN4&XhU}{UJf~nJU*R@le%It0nDP0Mog8W)DFE=`_u*oWr z#KwgG9_sNu(pmAVSl&4p;FUy0AF*1x0h%Xlb4b7tYdunWw?REXcN1!d&HaM5HNOsm zQd{7)I6iNo37UQ0RdoTZ%uDnEDDV5|>PSj1HQ09^mA=0efQgA;0@I!yAg&2@`u`KaO(#}wZ~ z9>gJ6Z-}w-C5PjTN?55$>@5rmZ=jS ztCk03Go>-y`iv{DYgCn0fc8C__$r#hp&W&}D|qgKme`*0M61(5R0FuB?AyfIA^0_= zN&m^|FcoF#raPVs3=cTY6;|*j=+@Rb=_qUK45#zjI`yfRe2Ify-ht;NbG>fS-L0yPn!;bc5osWG;i!AMy2}osqTVo4bvwPqE zU9@C8i`i8lc`lkFdm7c8Qhk$Wq8Xawvis4T9f-^3Xg-O0rKYtHEqF61lV@A?P!Q|* ziAageanzIjXoo1`vis34vPV(7JNtF-mewi_AX!EWRL zHWF8kH5lh96bTeqOzKd_n~?p$L#7mp&dm}vAYlLFg(OGPmztIGtg#K z_6#(MqH|D9V7oK<7|J(COmuYdd|It~Gv66ZBV0fvJ_kKj*B@;(({IH{ev3i|{52}UT z`uqn(ACGFVib;qDBn^u~RXlobJLao8Sk0RH#ioulm{Yq=bYNW7Lq wDmG!IIe6+RM;H<1Z@P|8WNX0ryA3^8f$< diff --git a/data/map/boa.bmp b/data/map/boa.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0d929588dfec7d9bb0ed328279a704cee85fd6b1 GIT binary patch literal 2092 zcmeIxO-~b16b9h;O(&$SDGeA(2vXbHkLd>>OfVtF4IAqMp`|S!Z4pCgVBrSBO1Ey@ zu8e2*|EEsyaMF-B~Doae~s+-aGYRVR36p5>`|jwi@z&peOK zk7NybtuOG%{FsO46uSX;P|*G~+kbS12UZXI3HPmjm$Tfnp1YjmuJr_+m;LqE7IcA4 zs~6aStLt~UV=l68F0p1VbK6|umU)q{&8vK6uF^Aaa>=~Kin+!jin@k6UGokL<_2>p zX;08iX00A{iy4%)zr{2v>RqPHdrV?c>j#|2lDaKtZ&}^pten$dXTHlBtf=2`3ZD8% T&gGi=U%!w4>+`?I;T`-5lc!UA literal 0 HcmV?d00001 diff --git a/data/map/boa.pcx b/data/map/boa.pcx deleted file mode 100644 index 78dbb3d399f0afca3c336b9c74446bf167a4e054..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1873 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 VPV2bxH)-Oqaa!28Er@1d1OOQ_tCIi# literal 0 HcmV?d00001 diff --git a/data/map/carreaux.pcx b/data/map/carreaux.pcx deleted file mode 100644 index 855c20f6e7bc9528e8954f2e1e5c13e82f9ef1d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6273 zcmeI0T?)c55QJx-f{2Imrh1m9TJcHzdlD^pkeH}oC{!Y?LdYadx=r^X8NO*@CnJvG z+7)xmxJFSF)>^+3+1P++u!u}=r&;)Zd(7dzf~D_g8kkpnVflx6!#!3!V#ysUH;fx4 z4{%q_t$THHOMW9tlstmsM^<>czrW*UQkgVKllC!ypcnL6Krhe*dXk{$32w|kEl*{1 v>R~=)U4%*BVf4*Y$B?Q#70{_a`X>bB9fvi{t~%%R>w;^$f~sdJkgx)G!Xi&t diff --git a/data/map/carres.bmp b/data/map/carres.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ddc84a67bc739751b9699c63e004e983b4b3bb5d GIT binary patch literal 3816 zcmZ?reZj{723;%+3^hR3W*}|^VnzlIAZB2Q<6>YiGh|>mBnK7*NdUor7y@&g+=Ghy z4}H}L+#x3_*ZP{#*w|P&EiFwAh}mY&oXKg+b)8uwrr!vp7zTjWp#T;Z7KZ=-f#!~a z(GVC7fe{x1TYx^shS?aFGqMBah^KoP1sS-YdWd0XFtRdmGIBETBI&~>#?I)@AcaNk zK#5~>BS=gh%^&#qE{rk^9B6u|EvCW94-8vOdngfSVH9CtNAf4KSpzM{%P7FWjpS!^ z_Y4+!Ltwn)avMxe37U^!Zl;#F6)^tL&8Ae0jZvI|70taMGl>-s!J?K}F)3htYh%$5 z5@!deeN1-@MmZ(4Foe00p5o@vFhjNzpO_sq&OzlIJ5(<=F%Cvv22C`z+B6UoW#j>t zsgODg<|dFmv=C=y6av}>@i)31$a1WVVhjRkZWt=^(m=NxA%!W--Gfn_hfyAw1`+X( z>{e>ZnE=BCn|Y*)3o}Xp+ddGpq@igRto22h~rjSEKMx)NwhDN-U*=2g&uWZKi<|wr}x~3s7;7b)o zOfaq~?5{U<^iE_gwbs9<*{Le$Z%;x#$sSJNMr!(PcJ`;ttZq$tCo8AVwDr$P!VwD*jcAUWHE0y6QUF==S85K2Ai98@WCj%9%TLbS7pW zXIZ=VKFew>R@5(#{&!?`EbID>D*Ab~=Ofq8X0nIM-)~~ajHT{&P9YT{`4{=<2iJX2 nRm)RR diff --git a/data/map/centrik.bmp b/data/map/centrik.bmp new file mode 100644 index 0000000000000000000000000000000000000000..10c69314e10aa8964f50b33a06ff62be58ba0a67 GIT binary patch literal 6208 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 literal 0 HcmV?d00001 diff --git a/data/map/centrik.pcx b/data/map/centrik.pcx deleted file mode 100644 index b1a26a7e39291b3834107b928962d3c312790019..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5697 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 diff --git a/data/map/chinois.bmp b/data/map/chinois.bmp new file mode 100644 index 0000000000000000000000000000000000000000..43d9f3d9d9a0000b1e3ddf0cd2f83b577949749d GIT binary patch literal 2776 zcmeHIO-~b16uqyV4sB_m*z!@ZEznYikK#ZZs6aIZm8d|13BedQm`F@q8W&Au=>j(d z-#}YRQ3I8 zfY+$z`$4|!yG%~qCVgVEe+pisVY0|#UOl4kK5t>KC`H+S=~9ytl<@cm^kkBf9{)<) znm5b!ETZcc8~bU|MlXzqv);T@pArJS3Pt~VhbuuH-uMI zoO*yo(XQ&CEU+ND3|;`LqNh}Z7;~a0z^?(W=yC80FeAF8EbL`bS#%M6378UHP+>{| z3ipJ(t3?@HCnY|D+_VuNgy%?n7_mMTq6iQIEZ{1D$+A@Ct1J_2vlkB4Xrajki;K9#2&t|OAe=h61UH0*mJ+D4An z1IXD1@)GCov;%0}kJt{7lQ^Hr7%&I?%_|{iHju~XJr3}_S=sM*o`W2|H<)*kH-Q}2 z$TPi$x0mwwT7lk_=bJo+8fi#u6?st=rMl>OoI@O5LdB>iUPalSmsFj8ZM*P_sQp>V zDML@oJ8+LpLO+pM33*S2kD->I`8-6=g`2&}wX*@}TH#u|59r$BI=l<$TI9N019a_j zo!tg>t#hw50=>b#braCNWcHrfn`ZBty>0fsIUCH`p=Zk!&e@hT;Mv3VA5q=D$FnH| zL~x#AK<7S0ZWnY+?!5<{fli2C#yMLmh4ZngTfDML!{eFML081f)z=?O>lfv;wkL40j+-*-iM#rfT!nD4trdOKAUr$sBhb! ziw^d5pmlA{AU}_N^_=Ci>xb5JxQ2W_izRu7IBhFbs{A|Czmep549M|LyMG<43m7@Vzr{%_}=8=)Gr5B(Aa0 zU7sB{){L9(x1Fdrgq z@D}qiqSQ1=_$kr?Z!ljVN>hV)9@z!2qfDW*8f=n{BcgnqVKxCV%Gb4yegFyw$$DWWrmmYk~IhRf$#J4Sa-;!6o#csh`e! zLLBjFa&!jwHV>QRUR(y2gB82yl2zQ>PIY3OMbG|K7L|cJNE^9}ZwL2l`%S)u{U}-= z^Ck4n?)n<>#FZBL-_BK{WezIqGG1cY(5ljUTV_<_R)S6czZO`Iv(!Ve#J{5N@GPY^ zW+iyfGwKSgu!l4SM9EMZ)r_*Kq*@)@)E+97im$k_P0gZKP@CvaW1Dnp8u{qtu}yoa z4YapT5!>_+YD6{ZBAD*UYRdCxorYB_FZ^Yxz|`1r!^amPz98|%i7!-q(c%l(yPW6j zuZydYs1zt+i{YH|+`sgwym2?U7)MXN5Lx2N-A98&r!D iyaBu(af9Z>Wd`31JOiXM?ukrhAU!&k9__{X*Yh9skRap$ diff --git a/data/map/clown.bmp b/data/map/clown.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6967168f3638135c49ca7daa2cff61346b32819e GIT binary patch literal 6560 zcmeI0$#Pvs8OOWNozER~uSQFXmDn*JWP%f9CpL~V*hx%6Tp_7cr7Fcxu<$kuwk#kN z8#dXn@s7t}ofm)|55bzX`Tf4{UP+dD1FX`i)2I9Y%|mzJ`;Y#%TjK98-BNzf=pQ_P z<*8-JQ_A*MDQ~_}%J&B`=>mUGSO4*G|KS(E`|kVyT>bp-2U`b!{&zh(I@);r`0-_) z{*xz9M)%r(b*}#6yB`Z){UPp|zizi%o<4=|i@z5hc;SKnI}iL5i%&nlE^GC-%za&U z>o0kKRbH-N^Zv5@pnk>s^K!j@$@{Z%qkh5rQ8}tV=lyB9RX^kXNx4%W@&35nt)KFK zSaxbHSL!E>KVsZr{4wJX%emTR{8PpsAgf!h)`yHAFzz${i1B^KL&hI6exLEAT&^E5 zevk2bxmX`CewXnMI^Jje4&z=K)meF|zR&l)kg=%avR~he@15F|A(*zdV4Zs#+G!co z5#R6feYc#i8>Nrj-TF>^@58^3PWk;4c+L*%xs-7X8(dgwT3z7sT8zzt(<9(2>P1%KCe>gAyC!oQTappoww*}1+~FMw+U z>-r2oc39tw^#Qsb@IB$_1^p!E$M{G30di8$VbIN(bANcVj6=5xzDPOS#H|aT3HS!P znrCoheAs2ZSGI%CICLI>>p&;JHu#Opg;>}B-H1a6zpHhy zf9jjIJdb@9eqzO`oAGLRM)G@g{v zWo{At^@;KA@#qs}tY}(jrtnJ|{jeT1mDrEKOM9AT27V2^^3<_YHjeSeSNvMMl`#w6 z3+xf^T2nT`_oy}X72g4$ak`0p>a&60nd zGO}K_nKyUFr?Bc^u4un}%ron5i*IdgPhl(H>TMnBhe7DjfGcH_IrDdPjNc3FfZQ4| zZ(dCU*F^4~;La^=&)jI?D{ce)deB|Lw_9McR))mI_)Y@T)Xnglm~C`AkDLi>#;6qO z)oVacT+kbua==)OZ0vwd8P1uQ3lY7y6;Aan0P#_?dend}to_$oWC3j9-aw{o0}T z$X_~R zYet%8iTAAzopR}zX2cv<6lfakTtIg%@D1mK^h4_Y(h_5@QkMz2oBR&ZH~nRetZ?SI zezktb$5?A2`)B6G34Q_2co@Sr^4%V)zV`0^lFs6NnYC3gpS#>a<9@}`=|BP#2#~dDbM(N-br6r6Jv1dIK*FhW>CgkU{a2Luh^;0 z`p^0^KjhI;bJnN1;GV6_tdF!sy!~SY?`h<>we6Y7=XvZ5Ul`BywY|o3k1}S#-&&Es zZ~LbF?Ps}H+B+uH+XB3?$@9cn`~n}E3wZ|9e(Betv5uwD7ir(A(!$H=__W*GXc z>T1O=?X_Or6V-nT?;H5eT%1O%jIX|Se=xTu;OsH3+XrUl^(B3t?d-AcamFg~_VGL) zS-;cr26%m94(I-DKAI2aqI45%%>HTai?7IYk2lA1zk4OH^0s#EYne+^_7Bg8>Y?8D zO!Mjjcx8;4(1_Ir94C#5M4FzO|<%KF=BY%^os@UjEzlDp>2^ zv!OiYEq0~1Jvy-)!Ph=$Esn55za}<&g?EvxNn`67X;FU&e|6L+!&5Z&MRn6A`+t{v zUe>2NF6s^F^o1DXq2B6eZ_Iwyi`e(+OKFq2v8ev&W#bF^RK5#=OhErfuu>?ho}r8rT;9Q2&TWZX-RsnG7&K?G1I{_GVY_FU+{1E@)o%4P zrg>jm-R~~c>+lk9ow;rv_}2f@=nwZqbJcg{d~k?e&P$j3iZ)J&&x*#}(O0?e%s4mf zFXJsA>0ERFQEuv#d;b_4%)vckCvSa{cyrUJcL7b`koY%Yjevq|unl8_|dB)Qg z>(E+R`KBK{ddKwk1#@8~*Zi|4&CR46M0~vSd0+D!H;1Qp0sE$YIHAp$8GB=+pJvFL z$GiQXG%3eA(RU{~Hl<#+p=-&}t6ys8 zTGnyanYpIj*|)WK%syjJ*d#9b9!1V*XWC`2c$Q{RFM+L`g*JKHyRtuIuH~Msf1agt zZ@SDqVjUXKHRAl8#(2qJJ@xl#S@O8TozcBWoBZ9zJT~@OW8!lkGY77aUkyEXh0Po` zcDcu?gFLT+8^qnlK4@?7?2)nctS_%a&OAGeD={%Q#f{KgUi#hG`CNyWdEp&YjAv;3 zPM!_=__0H;*bhvfy}~oCk66#=^6>0rjoBa7`A6WrW3PIIwe0^g1~2 zxb}B_BE}k#$7a;wupUu6XE9sQ{t8-qbnYifyF)JihPZB#N7k?W{y=W*k|!0Je*ckJ cT*nUc|6Atm!{74#koTY9_cPw7e*-P`zX;x!EC2ui literal 0 HcmV?d00001 diff --git a/data/map/clown.pcx b/data/map/clown.pcx deleted file mode 100644 index f8bc3ed305ee44deb9adfc74437886aa85306746..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6098 zcmeI0YmeL35rz)|2PlgEsQ$j7RL~I!KTnFfG(eefzcM-18R7c&oGA4!CvP2W(U0Gk|q@ zg0POX{Ov&0+*g4#LeA?@`>Z_WzS^OUyo-8wQ6=|i{eM~>RU3?}@m1W6)ap+ivAQcU z5S_<{=Zx@AP&(pSBnkB?)L`;&ml@#11JD!rak#r<1}Fn7&r%`-9f}UB3w)o!oMY7M zca!#o&_0hwqYIBh$A-jAuwseOUUx*AnJ#DYU2!ztgyV!zd+#HqCK30wCL~-`JucTW zo*|VXZ^|(m&1m;KlBP@z>N8mrP^qCqi$AfxkfK z^qY*dl`Yz;#TJe>nuQ*u^qqv(7V;eO?krYL%TiMBI&zczRM!+cQ_?uh$~okoQq$6B zidJnG=QPqZ;;u)w&x@`g)Y4X&xl_sjC4x{ObhpNkLXw(`Ym1UmxDD=%)m~@z^HtN zJFhWHa36pHa_Q6^U{Ax^k_nA!744qwXLus*Zh@3~JjN%-4A297OAhum|^)-;QvcN?ZYVk-jF{^U14dfK$ zPl2?1wY%(y?skFJN|{WzF+p<#K8ApF&;D+c&=^Z#8uoY4%I?vS{} zE@}x)X_3CMy)F6FQS_?13(pMpM25PpW6d9ZdVQQy>^!@ybs4 z0rm(P(b^N#1ZEu@C{azQ)5bYFh(W<~laf)$R^rmx<=-MOi@1+)_eTVBUy=Iud+%d; zk3I8lS7;U?VcfPn z9IP2@uxQz*yEZG)9#(QEl2#gSH@*V740}ZWR>Hl-3SV%@n9!bDw#YiJL`sCztplWt_Bsg7Z!J82Wh~4bq;e<TBre2$$u}KL}s;0t-^`Y6f+O*&Co1hiujqK5>>Q%UH+)RxK*gFi@F>)qPVF8tN}QhINpe z+cKJ=33fdhJdY|hMJpr$KIBTpdTg04=yiKm`$i!@3)WnZ5KL;CZ#Ucpy-qho$_m@Y z4c9T(k6fuqv>Q5onUV1v%eH#MdxJE_`G!_Zx^Nzan=rZuF)y3OcdCdy%c5mFG zJaPDqG%K$ngnsaKaNgi(*=@v2^m=4H3V#ffe%wX9z((ukC@hqA+HapwR|8S>@;Pnv z6kYcjCwpx@L-9D{S72A3abS_(*NjIz&9|P5OoVTbS>+@mZ|BHeP+5JN^Tl+G4O!{x zGp25_Zdcl1WWJ*=Y!hxhCLp=*H>N$L|EB81x(BC2_FL1c`HONAs^!yuSxvWBShlhz zD{0P0bTW9ng_ME&aGF+=$w{5R%UdWZ=A|2MulAv7p;B?hRXI&so{Ae4LHd0V?o7%% zxHp5ahX7@oX8F;RCfXQA%y)_R(R3HLkn-y&7S`=CT7uH=gKKVy_EyVhkK_Pp!g3iu zX$8B5FQ7-ZLw#vDZAlTVHh;>?@H)V1v=38DSe0zsf0iKNIZgqO_1^^s1iVr}#5z_G zY2=JrN_@a*ZSVuYz@&stDo-=+@n+f|1L`8$Pz@AhA}zt}5=rtrY~4lQ1ZomTASJTI zZ4T13F8?7Nt}@UTw8rC@Jy&F&LfdahPZA>C?erwcZ_o874hgNkM2!@VI{Y%#_YrSQ zp1yMeV3yuo#eD`5?CO5~YK6QPwT#(7*{9`~)qUP%Yx@Yblo@FBxzYv4OzTB2KJDHv zb`+aZ?oY!~t^Gt+r0NosK22#E&#-A$KC}I$B}QNDY4sAT=DfMUz8M%R=&bruexm1J zGMiw*&*clVQ!04M>?^Zt2yEYX_A@c#lMgND)i331v>s#JW9>PgSzpoDVw1bbw*0~~ zPfAO62R^~JOixkZ=OEK_@^Qn&-^<+Ut>i5~;rPVQpy$jc%vxsCm`#~!V;eJnbJPBo zCbngt^;fu4qU~(XtYa3Fo=IQ6@R&Z&CiIz+Kg%u32SzJKOM3aX956cI$eTa+ZRq4% zI^34u=AJM*WpozSUog7FjBUAQ^bnf+Yu@P8bEUje^8 B53v9M diff --git a/data/map/coccinel.bmp b/data/map/coccinel.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8e3fc399646ba5438b124a39cb3fa508ec236878 GIT binary patch literal 3276 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 literal 0 HcmV?d00001 diff --git a/data/map/cornet3b.pcx b/data/map/cornet3b.pcx deleted file mode 100644 index 7edc364888826f1878392818e1a75fd451f97f85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3193 zcmeHJ+iuf95S@{Vgb*LaFVSCtFN(d+t<9~?J!yI`r7gDtujZUtd+kjDg-4`Da_n=? z%0h7+zug3#OO3e3v1bGXLn8cd~K z!*Urc|Aa2!LqBgBqcfygX>09Zl2A!$ywpQf+(6RNK-=4s$DV1oqI_4%89sIe{ZEJ!75V z*3zjQn=k|#AS6?PXQp#GiUh7@1END;KxiQCkr@m?(mOSSOcJEgg*q^`4~2s=F5Md_ zVTknmHI+UNSIU$oFz5yG$OMXQ)WwQe1uHnl#UT^evwserC>)ZFR4S>A&BqUQisx?O zL#0ZBP1Z4m^Ebi8^ir(s`4fd1+=6XK_D|UHs-?S%Fgn7iOYPr=(%=7eq82U+xYkSvIBE%14vn}5T3Bvn-;!BIea=Q(>9W`p{`{I1TZm|*V?^XKd31zr z?GcZ@Oc355IRp%UWin6W7_rx@lR8FAXg7tQFS0`1Js(VC=f{Y}`xgYY7)_!1*U2fK zc)nMNyXMYfav5TD4DCK>F=8k9H#Cn__DO|?K>mfs-4>$(w9gikT8y}eUkWWl)6~%+ z&{xwg;1?sd!?&Qts0;0}&@!9}b<_s>ZrUYc#;67DN6;#Cg@$cH`)S&j@bvfZmF@2v U;@AKDp|$t~=A8dI_nzlHb946Q?bz7g4`pM%hWaym zJX13s^zXhgyC?3kfI#yk|Fg{5-FF^7`s1JF+rN#w<8S}=PESwU_wV1|6!mS+iBZVsvg?z#{l- ztgjdJgmqb;fYmeqv}Xw2W{)297CMSUc)+7Io&Ug_tW*5CzS~Rt2j_6@74uZFwTr%D z3*mFTWV#ktKB5(Vlwnap*I^0kl^3mVn?tLoxRe)R9dnRj9WZBWjdg9DvePxoOfT_j zneEu*HU{|HV1KQ@oar60CiKeYrsezC?wYqOothsnyuU)v&#*7aNlrh&M@J9L=U!_? ze@2cRzHL4w21gIgC)CW*BlEG>U(xrxQAUqVrIL02&{JwlU@ZM%B%fmR4NTA4o!hm2a*-7H6yJvS+|BXf#PqQ@S@D-l%GsJ(eqm!7 z&<_}}L}%=jI1iP}5< zh`dhe>xBKcksp~4=z*NRXX$~(KeRo+rXw%4_(v9B(-F3`&r9BhncDS^zvY!IA7M-K zo8)y09ib!s2Is8EU!yKl_KMhFa`7|tTl8bj&yi_viT61-iPxY$9)07PD*DkmSEpG2Vm595Yv@0Xhv;ioto3{JZ4XQ~)_9*d zD&TGM(4zlyef6)-W|ux|(FYE1)3-WbeSF6;mSz70%1y z3QtTEKkE2crrw$hZvO%2Env=7cn>e&vCU^0{FwdL`kGA_u>{?rIbr{`-hh0K=&>r8 z`cbyFsn0fjUMXM${2COn6dzN3O3f8=;noV%>{CB)m|bGm841xT@dV^8KzC;GCAe&* zynEm^GkOZwOx@zlYoC4c>h#r<0Xa@GyoEja(xTr2YTmK<9<@s>9#hMJ`m|SgoA?Iw zO%Y#E(-twN=qY!({+xLh5oe!$b*@|3QM|j@57ARE#Ne^5sWChBg1#LI>snxXlt+gL z_^z23vRA|Ad`5ge>wByVd3S96jalQ8hxS`N<@_|sLzi4NR+wmE6LJ;WZ`s6*Gi=Ja zaoE_(74r-%uzC*D_j!l>yL-i$bFDi`oBCBVY-Hua=3wsIHAG$`C;A?Gl;5&QtTc%NJy!|RMa4}S(df&Yglo)b) zhW|OegRi1r#+NyMiN1{=d-P^bA5dq}cd&n%e2Kn`?JLw$cE3Si{^alP(3Ah)qocTr J|DTCA-oFz^xYhsw literal 0 HcmV?d00001 diff --git a/data/map/crown.pcx b/data/map/crown.pcx deleted file mode 100644 index e8cafa207f7ab3ad1de1e956f38219845c3d0964..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4199 zcmeH~*>c-P5JejgsY<2tDgOTt5J`y?34kC-0bIpR)Iu#~#kTA?336_O0HwJ6;OAHp z#O^zHW_p_*@V8%rUyYwLe%}S}0?9x06SVEeCmnYvOut?K|Gm$Sb%M{%Xj?aUap~0J z;Nu&q4eQwk!3WSYcuzJ8{y=WQytQ#H?`-CB(~@9obC(;I25Vc?^2#o2d1=d9Uf8;p z=e9u(+4Y{;GqexZW8Xd6#I{&>?mMT!*sc!RjSYjGu@~#G`!&prvCq~vY%9j4XTcmj z!awO9__JE?;K@ZWMGx_^U{v~qr|0@Pevj}gtMw2)L+@h42~jARF|fX4=LhVT$mN!T zjw}y4WUdMGh6rY$3BKmk)*xtEM5JO^L(l=4JaaTAVhQMo|B0hXpsHB2_Yib|w_}h5 zend3#AO%hFal)DdM=z0u4)IKA!j2)4n1fz`c5MpU$GQ+(*N%>Yb4O!7Lo&8?^a75! z5pzP2Yo3e8nD8Ek(O=Y^qG|t zfD|;L2%B~VCt-&%-VK?P@Y%4P`+COFlZWC~Xl6~guhDDP$sN@pQ8^7+;TkU|)_~i` z<_OSBX`3QLj9rAqA;5b znU;1%Z&f+Yyli(gJr(Hups8s_uIYxk$Je9wMBL+g?7cUEx!u6HAv$e77YFTyE*95X z5roLPuWqopN7H;Q@4#=p_wTX0(l{1qSB%{;*23mWo3hi6ZmO|8xl>kFwnclO&O(k} zsXco8xpXb^v6PiGCN0P7jL2;9{gHap)uG#aZ5yOV&PAK_Uol!D4{#!?Rs1#0OuIF` z`ZqOl57LKIA}cueXgUu^WDlaVu=ZI?vV8|K1X;1~nnoA z4brubM7`q7y*lRXvfe__!(IpBx$4`!AL_5YOy{+vX(HljHjHpnp zF$B>JHUC>jQV_kn9Fc@mUm_{{Z+MGQ2Pu(qW!a&9G^<3^$&MUd9wTO^2TsXLu{e2! z#%N;bI^~`7!0og45Ls`$-=gw|_ff{n*BxZ9 zzktg35=oi$XN}08f_!#87E5BFcg-1`&}WqTv&$K*!alg1!zk>d%liHyJC=MFyobpe pNn_Sp|3{j-w;I(RS3df^Z!NF!-}%B*6vgpt&rj)R1pZGE_!n5CcvJuY diff --git a/data/map/derivsol.bmp b/data/map/derivsol.bmp new file mode 100644 index 0000000000000000000000000000000000000000..360766cbfe99c0fd77342a0f9d02bfbe1a08d255 GIT binary patch literal 4400 zcmeH~NpD<55XY-|Z{B!Tk3AlbJznEIo8u+1ojo?7aNz(V0Yun^0Y#ulkvMS!E?fe~ zoVXz&u?mDDmP@_?5)vPRGw1O8*L#oW#EJ3&$jGhk`v0rCtE;Q4pLd>K88H8S8k>E{ z=nvW#v|xQSvoGsr8>?owCmj^Q?@s>b!p_BKuiv=+&(bruCOea#{2kWU*W0_hy9>1B z=FOXxv(>+%r7Jhqq@4d)?yg@P$9Crq^FI1Liol}?{O=<0Cp&&no3gJ0WymJ%>rkT~ zw{N`f*|(05+IQY}?fcMxAGRO7AF?04Z__uy2kj^CTlTZ}{q+6d4ZG!ioxX)!wO_oi z*stD~?YE#Znb_~%m*@vwj>B0l> zY#+OCRmMkXrHq$+n3k~q2Q>LtLq13=TRB_@YiHOJnEVJ9hil*+@H+AWP3uNh3Rl6q zj+eq*hR1e2jDj`b4uEORl3fd9j#a`0ver!OJ;r8DtA-x3=1%OY$E0a>=8ZT9Vec}J zS-&;$E#eG>y%S~}Yq9T$y$X9f%!0LS(B~4K*e-qv8*-lq9D6IwgAG`RJx9bqdT)kB z$41y!#5oCjBP@Xp+PJTq*z3ee@>m#h{pz z$u;8J$N8>>P4H10&h)CpGa(LrMDCvdaj z)P1=UaheWi9>`6Fvv6aaO)+PSc>^uRb~2oEe%Q}FA$KCndFA9|wDE8ropI(!b0F6d zm$$KSVV_Pvd_ITtdSM%#338{HC)bfb(j5&u_tlZFF?=^X4nJw_d*;ab;qZj>Ls<^X z*Cwq*982__@Fe^c_Gymiyke{~8Vna7!0U{39#6qfqgU8Bz;*6@^exUjcwX$+8H8_o zPAHEKFh_d#>tKA@UP?c$^+%+EWQ@@vvAr&dVf=X zAgdQO@Ohf{U+{C-r}bou*hPLG%IyN*B<2M^Z~dA624|Vp80C9`pYZx9pM)=@vr#36@o5mfQ>fRFbrFC_gz12N7 z;$(LayOcZ1y=rkLvDd%?KY~pgE~dVl9l}1w5@%ASt|ZJ^@%X7`9odyPHH{Ccwz>e7JoP57GE+k%^cOYcNre%0P(`qb_K_ds0FYjA;2 zgUg?u>mS4CRDX&X-w&VUEl_@rx&BHPgTyAl4~7-iEU7486ruZ;#^Vu-Y+6C4@KIdQj2zE@~7 zu3vC%-fhKP??TP@b^<${UqYRj1}kBwrnnZ|0B^g_S$>tB+o0~Hb}jO{j7>kSU)8r?63-(Z1%vD!di)RcBmq3HP(aUFo71dp@4VMs-WF zxPJCnWvp+9g44Y&k$b99vEPw1*yww)ggi^@u-6v7?pMym*vwH&hSAfR4#Mm1o@K0B zD*v>Ga#)DgA>#(Nu&$GUKl)iAi^*JV8 zy;1r$xWN4KN0{DTVcYb=6mxy=oOUd6S>I2&yv104q;ko5)j`$bZPpjB{iky5@(8kO o_%`dF#MjaPWu0dOs#jQ{`u literal 0 HcmV?d00001 diff --git a/data/map/derivsol.pcx b/data/map/derivsol.pcx deleted file mode 100644 index 04ee096d62e0c32c8a0426be0ab683e1d00a4df3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4050 zcmeH~eN!Sw5XQT!E>)>iK2$zw@?B(EkoOl6QB)KT_2fYC^}N%~uX|W_^{C|XXR1ya zw&!`eXL_c4dY0dQ(O-qXmi#GyXjwjd_>d%tAwT%1ZBc2KgH6BaeKUS^<09$>?QQz8^LzB4oR6LF zZu$j9G?UI6lE{!}T8s7tqoSJYhBV(GU+LAId6ifTE(N3~I*}AKwHnQQ7|RRad?K0= z6=eKf>Ke=Q(Cq zr!WN>>5V+W1^tSnfXf_M)eD(`JYo>kYAj}q;Uk8&m{{uQ#ENeqH}c?<8s5Nx7`M9a z+9Joa*qjpMHEBg%$US;tthS!XE^?Jt!s(3Z=m@k3Yi%xf*x1I$jDLy`5&97td1gxB4 znW2L2IW@&lwxPlx88L<^K{R~VW-`OX(my8NEoW>`%NEq@969Ci*xVJuVB=bzW~LWx zMgz3OFc!uF`F+h92m@cb-420ktheSe$F9(i$?=M7U&trys_xL7rvheLe5dJC9F5KYA^&q3=Cm8jSED8TtSds@;Q3Sc6%` z@<;?iRlLukPXsMR$I@Qwl2{+rgIZu03VJ7F#<6)~kLH-j5bBgX$1o%7Dn0nx+VU+~ zgXubJMf_IIq?0rKXSR-AhgK&l1zpLAp4If=Q_42T>+LKaht%!}GoRu|W^Gw$w}7R1 zn~N^q%15r#fiKF5?7g$Ml4o_Y2Va2il2@sBO>irK5zl@29XZB+JKu-jLfeJF#~uST zhRpNU-k6A8m$~_T1WaKNBEMBVH$kWVTSq*g`S5oZ1Gyb)^Wl$cZjuRMJzyS-sm;^$2$Z>_ro3+)U=x@snM-_E zq-q8x+9S|?Ian(tx=-5V`+e@JeRxZ#SQ0(pM#}dG+%`S7JLRpg=KDh~*FDN@${$nw z_RzPt1sm^#a@U1V`==DRE?b}KkGLH>^i%$fyRjp~4S!DgYU7_pB`h@2G52JfxY*qk zHZ0Kz1+7IwSrJdMsh)#%ysU&ECwf5vYI2mVACf=OOR80qYGpo!Q=I4(cVvSj+y@Kg zBhgQK0#?yOuu!TJopCePDbB}Wp+F`&N25-d&cLjY7ukm;w`YyRF`;ihMqqc;LmOwh z#tQI>%&_EU1G}WzeaM+fWC`4H_zI{*ek5X7dP{7IYnt5#39lJ;TNpN@+0=;^S%OVE zr`g1b#w@^)1+B2rvB{RS@TzOvP_|*V@wYTSi3Bw}*yc{!4-+Sru0DK%Qze&Pk#=2r z!L5o*-;io9JtNiEQjMsXvrjn78@NkVvcseYcDw7+Jrb|*VE63yzDst6^j%sZ4P08X u?}skkAPrqwu)oJH&5=%Bx`zGt9|qfhIQ;&ff5E)}N%FJ*a|iy%JMcHyJ0Z9L diff --git a/data/map/donuts.bmp b/data/map/donuts.bmp new file mode 100644 index 0000000000000000000000000000000000000000..73626738d6c5976869ba5a298d73f6e163cd60a2 GIT binary patch literal 4436 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 Mzxj8dNaOrJ0m;8%@c;k- literal 0 HcmV?d00001 diff --git a/data/map/echange.pcx b/data/map/echange.pcx deleted file mode 100644 index 82a5e6afa07e482871773528e7b4c0d05cf58e08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7559 zcmeI1>252z5k|=$0fHbv=0P&=kY~50?$*{)Yq2D2@h;i2CGU6hOqBDLIJaBN0F(I> zOfdJtb`?*N&8Dh~Wa)2z@qcyv`=|eh|CdiBuGee*`HlblkKVf<{SW>(+V7aH-RA#u z_`7z$S2}k0USl2GNJs9`w6(i*Yu`ftH|<^IGvuF}&tJO}UvVQ^zR+^yGJog#w2W!_OiRl@m_9-O#4}UBas&7j{T;pTAKegL zvv^}3HUH#J(a+Ie(JTJN^b7PC=9c(Zo>p;}=+Ededg@(+riN!eYxl&g6MCioC^R22 z$F*D0zOl~R`?N24vyJ_6us>$TYxh8VY~z$dd&%1Gt^Jwt%b~r@8?D_P?U8?W%|iQ- z_S?{&`Y6~(yz$!2Swq>UJ`U|MZ@P9j*8W6$6511Mzqa;A+V!fNAKtu1mn%an9-X76 zXKmN+!q5^_4ZW(!hR#7{K91Da0;(Y&8=D$iqSphfe`gb859p1+8pawtZe;8pJq;{H zF4>r;#uhw2XHA&;4RD_b*J=7@=+{IpTR$8Qc8lH$tYs{vU)R_iJqs*Dj(FzUwT;ct z+kv%>$@!bcZqPe{b&zA+b?q9kvKQ+H)-{&FYR0b7dx7V)3Zeu+C;=P@(Xes z5*fJ(^U7%e4lC5)Nz#A?B%HG_;fCT0evU}VAiDj4g;!4aNV;YZnDbCgBZ-F>%cvqsuUM*MA?#eJ|y zY>WnP*|xoEV4tG`a$y#?j1kkPfgko+s|r5~XN_}f7W3~GDN)$LqQhS$%r@SodCY=^ zQsI=5HETs!8Z0VUB&-6Z5mtxj?iUmraA&Lfl+QtkKyUE62uwyX5U}Od( zynnbuhptPTx}TCEM`VaR`fK*t4U7(<;~hF?jgq01e*gevVsPSN_fLm#0>Mic1M z4t-(`BDUtCW&hl9YUm>)1G4hA-@cJkBNubp`?Nzokq?+BsOq)oLoq2n-udFF= z&MA8H|N0NCRXECgX1CDq#NOk7+w%XgroZMfF@C-8Ws0K1p4m4tJmAd(aJad+L6MnUI}C zYta4dG$pf%Hi)?W%r<4`6xE4mKP#S*GeukUJ(N+|TQW1q=zb_6AF)lg&7#8)hZ6cR z79F$bVsU6gkVV%lPOvz%p_H)bnT58sLmN^VixaaL+QzrN?dUL4=3O=xr#$7*hDf4i zpVe|~wz%ybS5J8v=rV=G4UtL5c;D8PDO! zNw#=_6pJWx`cS^)sHcKjvGAg6--;{5kk#8R*4#4M%8fZ}s!CO?@Z1@>ppR-z#k!EL znUC%oFH;euSWQ~c=g}=VhN{?7tU=uyS>eAb&=f0Iy7)f17iO)JOtIeeK%Xb~&S<*6 z7OP}SBVXyG`c|>FrYrcf`~j-^$8Z%V4To7VDcTY>26*r&4HMUTHE%m6v$~ z+I8J7R#VmQ4W>d=!k9TrnMYzw>l?%J!tI8=({D_>SYE72c~(MRT648kaky9@-mp(F zML?Nx%ly?dCBLxii7BE=^vju^S0TTw@t(S|Qs^f;F_r0ceV2Y5*s-yyu{lh7UL;q) zDv_m9cAfTZ_6*Zk0}B`^jEMAPA-r}v0pk6?T;25b!h@TmpAr`hudg0f?#A>by1tgc z_tA%Bl_pmW75XpH2V^tVXOC!kvEojje5aNYEpJxZ>XW6_!gUM3p3>{YpW(%8_A`9} z@j;}kSYJi^!cLRf7Yz+G-p}7cn#jD5zd_EBnXlK^8$)E~>h)E^1etmID)KEd-w!Pj ifBCLuGiCk$z0%+LR_MR`+G*!&q(9X^SKyDl0{;R2CJ5L7 diff --git a/data/map/echlune.bmp b/data/map/echlune.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f7347a71ffda6b6e655e870cf04752839072433e GIT binary patch literal 3900 zcmeH}xpG`p5Qh8AUFXiG*(8so8O=ze@o4cP8*GeC0VW`F05K7PUI2=S3_GEUGO073 zfr!{I!9x%eoA2*)#}-@h0C-Bb?&-h#^y&V)`{+J?@~CJ2`#v@MmemhDKk)=BdCY#U z%lpyCx7wcMe~E|*JS<0 z^E)!${5bAUzcfwl)hqnI{k>)2Ed&2M27V;tt50c%;S#K{FT-`-xqTN3e?JYmzn_K7 z^-uj>qL)0fZ(KjNuigI0imo`g`9A13*T>K#T{kY zXQ9GI{BQG4@Vl_4`xZ8}9dhmv=f-C0dC0F~myOQZLoTc&X4U7q%Ply$Dyt?@UWNVo z49R2ooZ8TJ6PuA!T<_X`IH>)eV7EtX;$42CJaJj|k-TkF>XwHI9EzJ$u(4w$SmY&Q zE960~UxjPf7Q`c+YBxdF8E445?BBm4?-PS^-{_~dO^l`2TK0;4QJ-~=tU4}uw4U=; z{HpOrR(@@GlDx3K=PTbgkPnHeL4Bf4#MJA_->@7k4_)jF_KFYfKLQh;!J~ZM1Y2@e zYHROR$>(Sw8s66DlQ zJijA&YIuxm=XOcH6<9^@i~D2i5qm}+L$BwMnEUit&l+KXt$JmEzVH3K<-I3)fX@>+ zS1(E)A&-f-1ExL~He}D(&+7R+#eH3DD{|TLxfRxDJ@T3AU%~odbDw?9bb*~_y!U*)s9<+$d2NbQBU&}SZBPA+?nb%?b=e2QE7Z2Nqfb>Tp`aykY( zV1Ez43H~D1##htvE$1pHzYMO$Wm(&62E|84T}s}C<6Z7h&1U6z!MVBPZE7$6*T^kw z^(oq-=6$deo(ZKa#4Dqa(Hkf8eXJ$ONYP&<$s^x7s*S;v{aHspf8|GlTJ9L+x;j{4?>)=0O zk96wGBz9&#JMsztnqHPe;nA}-p#uZ^zYjy0Pw_Z67%4t*x<8vi>KZ^tI? zTe56={2$tL{hD4Y=z$UUuzakYg8{uPo{#Bw=2-96K^t)h= zO=0J7Gxiw8ag%#B;9oIIuIvKNRgXN(!DhT$cAGPW#rYD}wi}$8dCuZw3Z}eD;;QKJ zoEgcn7k|=qu`Q^X=BPlYo{G8*p7ouhdMkH*)1+R{eLp{;Ch>oa_B35rc%2?%D=zf^ zNOy~Bs`|yb%DHO-F=dXu?{>L=56SNXKPwNP_&UzQW7h9sSE2iu^?ly*8P_qtkHGJN fb$K@H9_tSsS1xgVpLjGY!k@5~?bYwn&Dz2rtuA&n literal 0 HcmV?d00001 diff --git a/data/map/echlune.pcx b/data/map/echlune.pcx deleted file mode 100644 index 362a8e5dfb8f128d4f83e5919dd2874db859f83a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3355 zcmeH}>5dyk6oqd|gM<(d#RHOOfM;>LSMTdA-gnP<2uYNM5Wsxrwml|6k-|@;jMUwC ztGk>!Ri5v@3EvujKiW_BL&)sv>gsqr%JPMO;h6<{WCL^%_(Pk1*8NUec2=UesK zckWT+nbl}E4+)-x^>>s?Lfw9$tC&Vo%F0r+7ie*)U>VyCOJOf*N0uZ^+>+btVD&Jy zIi}PegAH6s$t;+%(6e5c*#b>7H>?PKYlpcl(KK|OZU%P8Ba4P@kTAC`aVs>6*UL|8 zyR)s_0ku&Y*Cf$sN|>;8U>A#88Pn8;x0>o(i{@`_@33^O%eXga8I{`B2aX#G6-2h| z8nmTpM;dk;u30y5pL%N0_K>`VL$AH`PV4G<=pE$PTI^#T3;V&EAwxBYj{t??noJy# z)+bHE!NG0P-x-Vp?uf9nB@Hj=e{4PM>Pn#g3ZP>Xcf}9Q`1~K1l6n`5SR<-DTIaOt z-xiTo*$+=KXUhZIIkK4Q1@%%M&0SiBeukzFbfz9ab7Ufv;;NA0!^x7L$;Xa#@1v9N`A&+15d`* zfN8QQuTJ?8>%?j{aV)eWeH&pZ$X8*tun;GE@OHvfoCoG7 zyp(im-e8+EbjGz;;rnQh_8j2Ex<@-;m$Zg~Rf-6n17*ugEN0j0A6c3dO|dk19*9e6 zCN9$igY|zc1;o`m^#ZN+;f-D18E|07@P@YfeBV(b z<9iJLkAO=FxF#;8Pm;6#6vvH^v?5z(%W$O5=l=Kl{y+aK`04+4U-hpD{Erd%8x@80 Aa{vGU diff --git a/data/map/etoile.bmp b/data/map/etoile.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4905ff2bad9b33c10c21639f47ffb24520a7d02e GIT binary patch literal 3488 zcmeHJJ5y6(5Z#X?_a-6X6%t-Cb`FIKBoJOn2!VisL4{7Grf?i}##ToQZ7ig*q4Q^0 z^C$cf*4B8=y}S1&jx$tNl40lWIp2HteEZQk`j(gA_c+lE`HR zfCNph>@NVF{gXH6m%rwZzgLQtPd{C)Rx6yHo!xqxWqsCK5#>_t8?$Wr0l4_=RE1C-*su(R)5!JrLF#s z8}9RSvZZ_nW1aJ*rFa|u5IDna;3RNU+uQI{;2MgzfPI+Z7TVIlo7&!jp8>a_xCuNA zGu%L14tQPLH-Yo8wFrAMigv>r@W)}R+P;pyI0BJnZ2$ z*0%8;{8!*|I*vJb3Ck;H4ql*7jD2|yJfiIxw9f!n@tuH;DxZZv4O@nd1s3iri@qh` zm0%7ZZ6VKG7Qxl=9f6H2&zw%e)?oA}BHjqXuy7zFurj+MixZV!zwsMRU1)A6!{E?wkAR!Hg?HI~;oeZch8n0Ur)vPmX|RwS5-;BiM{$=CFr( zQhnTXFem3`F2g*L>%k{yXQb|Xh=q?c7{|MD5S)qkBpl1UbC2As#hE$p!F-tIWD>rI zy>#%UzKkyfd;&2J@4n@h_teMw%vBD3ObcP0Q>a1IZ>$~WB&;=lP!mjR%wZa~iN5qr zo6I@&Oigi457r2t#qJ7qMx(|V3*)&ruEClxg|FQ;&cS_DVT`-o zQR$x@MU5k9Wb|WNMCiu=jc$KI3JWT1^7m+r9xm0nXli zYMk$LSI^UM`941foXJ*S%?j?fw4; GiTe%N3~?y{ literal 0 HcmV?d00001 diff --git a/data/map/etoile.pcx b/data/map/etoile.pcx deleted file mode 100644 index 3151950a284871e971b24128b624eaea0bfcf537..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3188 zcmeH}*-o25425STDpge{xd)=p|nzkj6|NE)tn%8nay-w@po>o|D z=jR21aSMv{QL8u77ejy0wL5*5N79F3zt2n3n^s?zUP8aiCG{j7zRgYQ2Oh-ut@H)i zYF-F@BU}Ra17AyT!oR~MEe7tz_?7fg_y@d{I*#EMmbC2I3ebhL6*)Y_*txV-$*e^s zt!v!qOxi?pA7iKTnn>TWrrr}ie0%Ud4f&UN6pj*QJI9DQ&WFru4wG+0Hj=$OeO=tGB#ldy@`DgQwXogy~TPyRA=J&Y|F~9!13^rc}<#UHs-Q|>%cK)E-M_y zT(SXAc|l708a8qTCy6f+?X{QW;IOS`DMc}Hj7XxN39QhTL-AB_vsoY!^Il>1ctJ&nxpki$G9BDNEJ?iU(!nzjN!MzAX;<_O7w2`O?ovoF@k3 haEE?rzW#;Z)1NlhKmPS^tk?atdYknYf&VfBzW|y=wzB{L diff --git a/data/map/feuille.bmp b/data/map/feuille.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8f19dde3db78c02ea1b455756aa4d9699871654c GIT binary patch literal 3064 zcmeH}OK%%h6oAi(XFOwjoEdxkOdLN*96O2gXxyd^w9tl>BJq%T1cby6DePFlmK_uX zLh3rdgICwxA+hI2uts7RzI$dO%(h!H%GH_k&AI1!XPlF_{;r5!-+Lloa`zkSbCycT z68S6;Il3Y8tZ&dg;JUo}Gv(ybyI(wc_Sf{Cr~PLC@t-=M&(rhs^G#Oq;^Lxoulz@0 z`tg%PXMA-L?mw63d2)G)-|OqT1J@n+-*w=3DqdVqWl8I>U!`F37xA@*{<9QK{v@F$ z=s!xy z=RA@Y@w&!$siREXs4vr6~Au#)l&)@_6^sp~4@IBZ7y^DPnKf~Pre$Jcl1U}HA`9Fa7v9B}V zI=pZB`}ESqbp5W-lR{o^K<%E{SKuA^ijMIU%3jU`YF&kQbrW8KyI2M5Q6Jf{{#N8| z`a42z+dQlC24{YZ-mqE5oQGv*U*KKg-x*2e9{LPDvKcny4!X;wqBnWoWKOZn(aU|8+ZiDKl%BJ|f;4d(L<^=Dl~nH6L(4#jZ~tA9BCVIUaD9KFaUE zLhkTw`FcUlIQx&$cX=llL`f7yiV`J~I-e~$lC6UkId~r}?*Lx!5mq|F54<(o)-L z%0;?PYREfDO6e>;C)MRFeJ6SHD1%Zu$*`1;GIml;4l*gFz090cm4BoMSvagBCM~3i zHjtgHbS`b=p4`a>IY!Q8B|DwDs8UI=sY+35~ZJ%gUGd2~ojOz%M+K@9b^O;k_BeB$I0q@fYKh7>l&)5Ob#yBf!d z70?w4Na9W$K|=M((uM5p;V@)_)DsMRqn6X)GEVM^W8?e{t1B-F1iA;%q@HcWKb0bcTI9%9V$n+EYAty5VNY*Sn zO?@Y+{E2qJGSV|y%e9Wab1|Q!g&t{(j;IpDj(*QIhTXbqpm$7`<#WNRk@q>zp>CK~ ztIeF{gHAw4x)$I0G_*-YhM;4;6;I9}#t?&A-KV;g8mQ+O63_&6PJde$c-Ypk3+WT{ zJOj1b8#)4Qfi6j$CA1Fe!547v8Zl2m_n=GXF(kUL=so!}bd9YC!>zO3g05h=1Fbk) z<1K0txSf0Mw{$UN*jf&3z7E(gUA!69T7x`-6!+?ry$vy3sNq;w+<%B73p3=bf33^O@%eZnb|)h4K<@-eERz!W9BZPA_Hu!g?2K9)2B`07Sw}^#8Y60C6Lq9- zLh{xkvXGrF_oR!-cnC{OJP|RbFcFtjN~{H*Ii6f>syf6Nv-;rVoepY(rLd*sHglNA zdm$lC-q5^@6Zmtf)1SP-;fg6p*I_=@%#i!=PTj=hOj`{-=3K*l1DH|fvI@6-8yE=t zd~G;Tgk#zc>YUaKxte{(o^fADFOU?{2VAw??nj!gkY1tX6~XTl15rrVpGDib)_?ui R-|KHbz(4dK8TcP(;4j!t8(sha diff --git a/data/map/fille.bmp b/data/map/fille.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c4d34cd086cbbfd7faf73c99466a4b90d7b2942d GIT binary patch literal 3228 zcmeHIId2nD5T41d&t2Q``izhDeUNY@F&Gd+pfnK(grKH&MF%A<4NXL8i626pKf#Zn zrZ(R!^Pbn{lIRd#d9>dgZ|=7~d-~C*=y~rFy#;y$`T$}|gNTAO(fowyGK_?xz_T*H zh&eld@%rNO>-71juoAxe!n4_|v{)?0pyYD7%-qj@cBU^cPQ}ZpgojAGlisc*e=XZ~NdZ4!3IKw%*64U*TpT}(D*yJ&VpNHy8a29mB;0I=W@+Z#(g)eukVkg!LLSngl@I7haff?!^(VN? z9lECSE{AkoagSSc!{R0#EAI0FomgDAJ2~K53|DEUHUqBEO~pel(JhMul0HcOBi^Um z78mG_;xX>XUB#wPqBFT1vuAUeaM|Jk*JF5{*AP86cW4t=Y`!D-F}ZKzlC5LR!7p&p z);H!go}fNc_k;_!Zox@r+vh3gDZ!4NL6`TS&w*S!qYm^UOK{50Hsl0kK4fV-`!**d znTsBoJ@MeLfO9_V6RMKIQ$QZy_hNlEiTpg+Nc?~T)l1wI{5s%0^u$Mf zF8W?lz2ut%IUo}?q}NIrf{R*h=gl+|(0 z*|KY5#)&O|{a8%#Z+0$@C6^@Z%pDd!h4|(_W{R3J@N4GSLx1;>yN9=#Sr=G#z{hOc zn!Cu7$T5$-Y^tmSz6t-04L-25s^E;wu!;LoQ=200b_;w}`2y}&2$`9mk8ec>u~W#g vs5bIHCNu0KUPoma%p!wY9w}cz4UZMqurE&(OK+bkHs6E4d&mF#1rvV*V`p6A literal 0 HcmV?d00001 diff --git a/data/map/fille.pcx b/data/map/fille.pcx deleted file mode 100644 index 449009a273ce3096a482a9e75dd0c6e1432705f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2726 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 literal 0 HcmV?d00001 diff --git a/data/map/flo1.pcx b/data/map/flo1.pcx deleted file mode 100644 index 4ad9e74fe828cf4e1da197b72b049a1d133416f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1748 zcmdT@2~Oic5Ui4dgwQ^U7qE|lm)TBY=OhGTakJdZO<*A$VyNyQ0$Cx2RU{V6c2)Px zboWfxOigeSdS)?$X{IO?3LymZjQDU4#2kK(IDL3pKtKt9P-H+ASIC4Jx~K|MT%s;4 zzv2a&vP(Eei_55S)7c_AT)`RIoW~k-XANv|38z?M6}xPsqsR?e84lS(TXCwgQXFZG zY_XgroUn2$7Cr z*mL(XUZaLbGH^dw@=rW4A=LLBEO_C6Tb3cvHslFLpmsq0`UCqsFwmVw5)BUUN#SEW zSleD$geUbSR<_t#f>R~WH2SFinWeU|Hrk{?;hu?dh`qdo@|2v diff --git a/data/map/garcon.bmp b/data/map/garcon.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9e90e21f62d406447d97df0fb702278c66920db4 GIT binary patch literal 3244 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 diff --git a/data/map/haricot.bmp b/data/map/haricot.bmp new file mode 100644 index 0000000000000000000000000000000000000000..22231e8c2686f018c41446671f992a442f71bb4b GIT binary patch literal 2408 zcmeIz$xD?{7zXg?q4Lhov)=2h*CA7{Q#qw(CZ&)CE)rS<;v#4vw1|j^%#zB$kffq0 ziXs|qv|TIzgLeG`ty|l3Uiq-epmlzD_}%xM^G)Zx?`PleWB_)|ZUs*3*NWPL8sS$1 zzNo*feyv%D>%^+}XF=cK=+xY&Z}EfgV_C83uS_Ho850u|m1;?gi;ID-;O8yz@wp~9 z**kRE-;UK)U3c@?T!GCM`0rN0eRqCr-mi)15C zF)DZ93=3pE&N5$a$2sQ7T1+!n)?kJ?vKp6|Evs;uS+WvWnJFu9jTy2W^Gq|ZGgX#h zfhn>SH<&C-uxJ+JCL@ZAaLbJ0wi(48hSgt)yJi9IF{C&j_su*!U{G-`9-29LME8mJ z%*JDjJ+ttHevNx(;wgQKGw{qz#|tJY_DsV|i#=2E%HmWkahv9);Pp=??kA&e@Q_b}bY_cMlG%jGcku@v2w-(l5Z1v)L~Bj{%w zyQ~f(np>xub+r*u%{HLf>LnRns?#Q`p=6!cj0UT#6rIaW^ literal 0 HcmV?d00001 diff --git a/data/map/haricot.pcx b/data/map/haricot.pcx deleted file mode 100644 index 57e668f575c551549ae77d82381c6e5b1956ddf4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2384 zcmeIy>rPrx5C!11el%&CK8ml~7osR~kvoXoQIK0zl&b>nu07|36BA2n`m;jf{?0Im zjr+{Zw=et(y%P9=6Q0ofLoc4=<2OY+IQVzk{vKP$$k1n2FhJQbBZcv@;NHJ)lQG{Pc+#_8FRVIYtt)k*hL8o z?lE8oMJ&0~9&Hq`;#PaKkjIA4+M|gaUbxa84ehbxLOax@J)iKzD_p>Frf;g5V*G_Q zFU@g|bY~SAWh6Mzy%lp(zv7i;e`d^RPsbQbc2!b_<0*@FRbft7DHiO?@qu}y6w!VM zJt`+@u{pD$7QE02_`KyoD`vu2q&3s38lSg0=$WZ7c3dw^hI#*@t!gj$1(9}4gt5QX zo@e15UcrC9JE}cT!#uCx{C4kX&v^K$S8(>bH}cQWajV#S@=xCJMV}s*uOY{0R>ihVJ;`^8V@LJeF}0fMPcsg9nS66*6iQ(V1&Z;ELi zJeV4I)VkI5m}^~YvMjVN*uzrmOmk?Z^-i;Cqjk&?wp#m~V6U~S*`W!^CiT6DNi|It zhqzSMv~f6-F1VI_l_xZ*Tu_w|avD6Atik37pOR6-NK)bIDBF?>!`>>^Kdj$1*`0II NeE-zv3H(nd@Ef-vsiFV? diff --git a/data/map/lapin.bmp b/data/map/lapin.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c3ee6af2e9a0c8b1fc827a9e3e29d869cd0f80df GIT binary patch literal 7080 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 A<^TWy diff --git a/data/map/lwtab002.bmp b/data/map/lwtab002.bmp new file mode 100644 index 0000000000000000000000000000000000000000..3a35d7223463548c754151190b50bf9d2207a445 GIT binary patch literal 1924 zcmZ?rZDD5sgDw^Zh8iF%0Emr%n2~`4h#44uF)=Wh88R>&k^>8ZB!J*Q41qaL?m@-< zhrVhA?vN9eYkkdVY-}u?mX@Xl#B4KX&g8V^y3VW-(+@Hh4uIC702US&hX4P8=8l5V z5Eu=C5f=iWa)*&YfRTkkno$9R&CJNnzyy?IViaOf2GSt4ATbWSd{qWEMqZ#gP6igZ z9%98rfM#=I(N7(5c`Rmw#9)3yXA3ZjL;b7@3?tImFf+ZOVF01kfMLSRAPN>EmCebZ z$;b-T3t_V`iUQro33MAMo>&KNpg+iOJ~cH9ERr62CGlc4lsGon3Y` zkRf>Hm|!Lm9LLdG8>QtD7Xla4mg#ny#s&$r1X2Y}K-LT~Q$j%O+16%Q76+FptHr#+z_HV&a;xfm8 z;#C7IXvO1=U)I|pBKfYE+x0#R32khv9xbBiR8_Yr$w5wFizP5SIPSdo_9pkdpTHka F;0}xG{^S4v diff --git a/data/map/lwtab003.bmp b/data/map/lwtab003.bmp new file mode 100644 index 0000000000000000000000000000000000000000..46ef8fff5a2bd3dc987aeeebf3d117536ce99757 GIT binary patch literal 3516 zcmeH}&vM&T6vofBbR}7qEIW?vgrp8hN*oB&(xjA`GG(ANlq^^P!wd_SOkRL3TQ+RE z&MuF^f>mFFhhWV*{Jvu=al#`IPwqtezVrVa9qHvaf7a%|-&3<+xw_>1%n4R-%#OQe z&z_jQojE9i-&OnPH!oj*_sg5N{~Uh%$80?N?eB1MaxywUKR@7P7Z(@Z7v*2c;ZJXl zCEWgSck7p?sa;)R_x^WZf%^*l?<#Of#yY1~gzx!3up|WQa6;%<3|rhs8-=m02R0K} z$NyKz_G}zBEC-u~%(g;mT~3c@_9OQT-OM)7 z-ACuy3N|5z1LQwm!Ny^TkJO%mx4L8Ejl^@rQM`{i3*VVdxZXv6J#@)8u_qo=W}k$d z9EGL!kz+Z2x?s8I)M8IViEid{t?nK+2cd`U)H1jh-|+j6HKC$Dg&ljYk=zPunvj2O z+t_RIX&6`uw#8Xssinvb9k0Oq)H;x_YL;Rng=@&Wgd31^w8JHr64MCz9yu(yY=sN- zt;T)=zW6h$hmENbX_lkcWjC;&B}Z9B5^U&op``Y_c659>- znm!iT&#BeE%SAiox*(p6-t8?h^|puoZI7j)HaFZ5dBvdq6x2P!X_hpU)EH z?z#oO#Ybke%e-VhGky31In6);CVmJuB#wqzs-17}qdqC-Xz#=I>21qtj)fm$x6iy( zUiSg>Q{KVlqoA*PZsd2t&(Uj`CGCKMYt6H`><&LgSM%H@-V{0cY;`B@dq9kf9B0_l zJPe6PT!nqjopiJdHn|r!hO4i+!tnw3Ew24xe2Hzi{K)r3pZ(MET4c<&?2M>&N$&bY zi}ZGFi7BrI_5f@U*1^kbY=;`k*N_;Ru!C;O{54!l?go2E{~CO%Zw<4SpeNb6`yA8j z0!^g=aKzjw(&`%U{xyS|6-smBssZ_RTQ)^#6}k=_K`1Lw56 z^zNvadt||Vid;pnhj8_^PG--slaWhv2R|mCl%CJ7Wuxouy1aIC&Z%r?g|EP7)Hw&& zZdvTH)bps&(|bwJ;$zoIc|PuwxH5QVEHBO$~?@hd+s~4cYAkjCmY8b5<~zIkU%her)MvTe}$h& zvDBXFbE>OPRdv_wS6{dZpc6D_%41pFb8y}7|w7VN>Lmb%tvZfO}Bmkc*EZ;vhksBGn?R`CAH1q_2_c3_se8m6~Doj)Rp zYd|Jexy*h#qL?+d#=9>pnmm(3(w( zqrV%t21ICy-*J~~d^F5N?;Vw{gDm!D@n=7 zk<`gkAavO-qB^Y|{r|;VL&~P;x}ZI?=lJzJdm=mSnv!=hfh?71@+RdTK0$YCFL?^7 zqlK8~%yP!yDpstqk?Jg}9$cURt0R_1e}nUsX&JG%_#a$GB#RH`DKX6ByoX=1)8G=f zCIb2Hm@mo3;M_G66->~I0{r7{DA{v5abT7z=VWkKUJ{E$<%X-Uv*@6t^cr=hu_g z6q7PCE1nHjBXeNZF%vo=K%F{I=p(u&^bD^hY0khdOoPV)B&BG&Q-R^_b@VceMJrgF zAghqzC#=w(J+?S0ujdmRY7oaMfO3`6=Vswyla37ODjm7F%EB_O$JkLN9CzNG| zzBy89&I$OEytKw-EXeorokB zRoib#txo;xxJ1WrO5*AmkQg1taR+sQo^Tu1Oc2L6hTDK*fh}N5KNq5tm-5zv=vyH) z#Eu&f+~MF3ixJ&}^n|ry&^=15ElA!Di5LmWsIM~ER8^iD@nCC$5StodA;D4Nfe*v<-cDDck diff --git a/data/map/lwtab004.bmp b/data/map/lwtab004.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6d79f9a2157d1df02d27f6fbedb39f881032301c GIT binary patch literal 3040 zcmeH|J8vXK5XY<7+3~!0XCJfg-SgRN--E}UZ7d-K5=ICJE&!p62$3TaL`q6Ra+9ft20w> zKEmyMK@iB@9e(e>dj{?q_}?*bOU2FlO4|Ao`AdoQ2Y#<4)lcL=`+k2Zxpvuq!S981 zwBz?@($}2*W9+-q)e@Vj$4>E;$WRM>jrh&bJ7FKnTqAr8WTf^Ko=B$eNumKdEh&jv z<7?zd9&gD#e8lK1h%>>r$QnN-v18<}Og&cUu~d2>4>$5!K7VI_jO|(;XxsZbBK9%+ z%*zj{hO*m(rgV z%z?$MuroX&R%2(q4d8s}>?-ynV%0uv9%9x2+4`zmXEk;}?RNHTV`F%MO-U@n3-8PD zF1W=l;38mltyb%?ot5NZx;7_?EO*ZO*yWrZG5^~(L+}*bW_la1z!TPkJ$ww-rryOK zJ^^pR(SrIczb2;{db2&uboQ|oGdgqq``32m^z5$u7Z$)*UAO5ih&_Od23rz$L7u~R zFuMc$dTn%fu{pio#iqPjA@jPeH)k$GUF~2CX2kAkYm>`@_ao;HY-3YdGZ#7cK7jYS zjxq08n>x0!N>*SovtMFg>)K59@M-T^gV_w`QZQeA`Z=a=wXV%=%rd_nI9`#P#j_bU zEW)k?xBK7V*2kO}L;5izw!Ph{9P3kf9`P=ioXC-WATw+`?tM<=P(LD9yEpdcChVW1 z6L~pi9?#{J8R?UcNX+|wf&akqVDeNyCXa}jj@@?8 zko;Qi?Xv$1md9LA;U%OVo39!>q_?F$*~l-brOqprZ}pkqXS@w9d0#Jm4aS+(`KgzU a+c7zO<2kS%{OtL$9{s|ydA!|QqHh6DeOfU9 literal 0 HcmV?d00001 diff --git a/data/map/lwtab004.pcx b/data/map/lwtab004.pcx deleted file mode 100644 index 3704d23c5f66e06b1f186f7b3cbbc9d2904b442a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2622 zcmeH|>u%aW5QS%?RH~{zRNtk2ujW}|8*JkXHZfqpkU(hEdzz+|s!DagSqKEwAMMXd zK{DPwGka#{?Ckp46MZWDUdu~)p`o0doV0Cg$Y1{SR8&so)nB?FyS38FlIQrpl&-dN z%YQDpq>MjGPgBVx*Re#*BSt+*WT3HJ>Q5XgR_e=|G$K5{$~DxRq!#)`R(M(RR>o&pXtJHHNOwvEE3+q8`kr_rCxR92fv2Qg z!969l)JYM5hR9VAe=dP$PB4?oEIH`Hp(ZI}DnvaQ>xKBZn&zckkY=ry4mlT(f)^}~ z^o+Fj=vdx5%H_^);tEW4k2G+R7OOl$8`oSK_<{puMo}Ho@^?NHoq)_AAhpgwnggVP z=NO6UjXh6|Jw>2IWG{+`l2BJ4bs3f<>~K`DT*B;HCoyh zneX0j3>uJAgMUWM4c`zn=D9dPE07)$t`5)vXbQTb@%9Xbgv>0z0H*l^OCNuWpRt2J z4Y^;FVJXNVl^eIVaMfB%mG~Q)^DbOhM4+~RDZN5L8-w+bPv8nef=K?(Vu#dY!-mjX zuZGBHNfeUOMC3SjOA2Q+T??9bk|^g}_a3x0{vk+?C5N!!FjSx&POR-p>1x`b zBZ=u#&S^@zwgDZ;Y)K6LkW73mbI^pKr9&$Sx(*Ev(7s(RY*Yt9{he9*$P%` z#)K!9EB1KJ0T0}4O;&691%5cXqPi|^XLt^)DO8j7#33bI5xdl2G0ruyLN1npi~fe% z&rrn&^@x3s_SpCtes+*8uWLABd@}CF5${Ca5~nYHSi4*$rc5hm?D6e`@g3`PaJ%Hc pW9x6nKUgzh?8Dkh#i#>YD#qR;1QI2`sTlgS>eJ)KTBo@}1A_TQa6 zCfGelmwJpbGM^*v`dKTmR^Y!=V1|lmM&2kR&tU1kmbVz|!3->db(981$KOYb@#6Vo zUlHFXFE2jo+O)E%Ng{ zU=Dw27@B9i9hk4P%VFCjmQm5lILAAbH^FJyt>EY5G;rJ-Y|H9tig#LYFWNO^tK%G@ zT-V<>c^6r8)jFhWZRU5dST`FZoTm%?Z5Ug37S!R_RU6WV(a-U%pK}%8gm2TlJ?Op- zOX_so!#e%zzP=_+YP~LgM)54S>&^~?9{--RD6I5%0FtMXZP4_NK3&Q0oC%`aK| z<~i*ddDVXY86DoYNqxjtozr!G<9}a_@^iZ`kD~Xs%GckQ_Rf*krUQM5DZ1nQN#E>U zoEnGnwSc(`OW(zKN4GT<)z?z@m&TKiyWjQE@8WlJ)64JAKM2f`JI!(TeO>G<#;AL! z?O;*g0RCHX3_s3t7$aNYOWhowY#iQy$WiBTM#icQU;6h}oY%NNg>q<7z}(337$d*q zLCnoeJ@w|T=G8eIri!b@l%SMH&;9N`=?C3%a46WeEui4t&wlw!vE2>ouN+? FbqNGlTz3Ef literal 0 HcmV?d00001 diff --git a/data/map/lwtab005.pcx b/data/map/lwtab005.pcx deleted file mode 100644 index 8a0cf33eed564ace6ad3cd53da43d687acbe3c59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4767 zcmeHK+fE}f47H`Mgb*LazrcSj-!hHbLc8LA5kf_()P3NAM;G3~kVZkF{A62P;I+wheOW>UyTibCGbvt;Cm z^F?+;t*k@9ujQfqqYf^mjm3vwBejxZW)=DqvE!>X<*NOl_tlIX_z0$pUdQPB{Fu~! zH?$$dp!Ul44c!VRe!teUV5u8pBn-sTY>=t*LjNo+9;5o;tL!sIjs%KbGDyYR}LR<+d}!eXs6(e;>ZR5@NfCZdO#xOH?h>!ddR?YBdTweT*o3 zOi@p`LA{9eRBsu#NT720(B1NXXOaJLXjDt8u{0D}z1$EiS;o!XM~g4ao7NF- w`vGm~bje#u7Jnz`TNv)Ze(t#(oNMO|Q;i4l7x7-_&++{G`g{DHflr))zi+$sOaK4? diff --git a/data/map/lwtab006.bmp b/data/map/lwtab006.bmp new file mode 100644 index 0000000000000000000000000000000000000000..626882e57a50f06d3b0c5dfb85931e686ecb61c5 GIT binary patch literal 1952 zcmZ?rUBJ!&23;%+3^hPj01z7iF(U&95Hm1{F*7ij88R>&k^>8ZB!J*Q41qaL?m@-< zhrVhA?vN9eYkkdVY-}u?mX@Xl#B4KX&g8V^y3VW-(+@Hh4uIC702US&hX4P8=8l5V z5Eu=C5f=iWa)*&YjuBYy0I?X9W&_gn5NBm%VQ_`o#R{Z7NMgG%fb@Xe3DQR{o0ZWH ztQV#qL^~mwM>(GbXucK@^T6Hc2X!|g8e}&+qajcq8(c3)Oc96`fEdIE`JWbI?2G~o jY+yHYF|a`GLblIl(1^(a{Vxp;1DN~BPYc)*wbnDK&IL>5IrF4;qE`$!uFfVzTUuH7m z7%EH5uwad%C`80g5``s*67xiQmnJv>!ZqQU=6E*BJsIDgsNSRZ6HsxFz^!K4z`dur z5a+glPe8?+Mh&qC;Vw4cZ#|u|uBui?>{z&JlV|!5i(z3hhc581?D|~>Vu)VH>0MA# ZL)64E+Am<+mTC5ic6V;T!vy|#0#9Xdrm6q{ diff --git a/data/map/lwtab008.bmp b/data/map/lwtab008.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f7743d45e98fb0d11ef5bc676c548c1c63edbdb0 GIT binary patch literal 2420 zcmeHHy-veG47Tr*(EL>-6>CP+wM1fL>B59mn3?keFtW0+bk3VF_a%4-n3==p94Sqj zq(l`HImJ5P_t`$n@p*ak=u){}ETSi9E64?eX#yd72Y$IA+9V|?1XfXf;2bcEvO33NcNrDfT+Y6n=B@j!(43G)3@_kxw6H!(Q^PY$bQWB!3(J z{toBi{KIMTIHVI`6P`kJgA0Huayfw1IiEdX3jQ9X&LzN;2Ie527-E5w`$f0+Y!sb> zH#SD!x6w3(pRqCeU)xCiMgbrr?aRXw5*M-Z|Wdk~(rpK@3z-4+v2hSc(f5#u`PI~|?6B>=! zezvk3u}3G5UMJ@8mSaGdB??N6#3{bXGYCiCBe21z@Sd&2&-hx{;fu9o;tveMPJTf$ z@kepT8QxJr;zO)XlD56FIeg0!tx>!63|mjc z^UcR%*q!l(UmI7goA$m$Gpm5#55DfUZG`)HGBCl86(uU90jQw@!E?#Ubvp~p*W^w34poN&dR7>X7OxU5uX4T(1uDt249p(d_%>+1&9-aG~Sj;d)2}t6amL_=4*5O zd%B{1K%21D_L|S_-MXTENG-(E_L|S_-MYVM&*y~qVXs}vUF(*5KAZKqA1OC>?4QZ# z_N=+NM;h18uo|QJ@6z)gUF$4c|8Ls;-uZIh0i7$i&ivjwU#s0ubLTmp;iZ4Ob}-JC zNqmetT<>&zXJpK01%p`@&t@%zf4M&s`%q&vl$r z*W06L?|wsQd$;Z{+MAxwIgx9Za@V@0zRa$AU*vBq-#l0Ei|T!`YX2zfPrm)mx1Vx- P_|E>m{9nWb?+Q|H71~@= literal 0 HcmV?d00001 diff --git a/data/map/lwtab009.pcx b/data/map/lwtab009.pcx deleted file mode 100644 index fbd28898f118f3691770e1c22ffd7342ceba064f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4721 zcmeHK!A`?447H^pA;d@VFYsUNTUs_o+f8g75JKAlX&=CmQ+aM`l9|voTQ5kh6wR@p zoy2wg)~gG?Bs}+YOExDMCBl9*!s6W+5_Ojx2v!`t!OP!x*lY8vW>f-vj#Fq2N&N1})!gXA|#Pe@$HlNlW z?$g?a@r~E9TQ_d=>!#l+y_XVSWsPU=wP37Hu?2cZ-yUN7ki@k*7dNHn*{&Jyqtc(X z+3o}RSfB3d{eAf(g_9&F!ilGFU&L1$_7}ZkNb^3NHHjN=ElN3O-`sWO|I~Mi8k1CM zIgH#J;bgtvbCk`3%M5QS&&pMT>R2PXs~OOOa6A%Tb`I+`?8AfTr93((RcA)3^F6Y9J~9)g+{ z=X^W6@wMR%@RdiqJ7;G1?3wXizWd&@`2DENzH0VCb|DMam6`pK|Me@g>sfRH=v(Dq zTwK2W^yTXM_xZ=4v+3;HuP~p_4;G8XQ(3cIE_-kKH|6=~E4ID+wC%=MRh6w)+IRQu z6xb>7-zmVm6YPE9d0CH#TAzkJ>mvPuM^szJaV1mr~>8FPvQB>d37hWBs0< zA7VaS;n0I5eszl3jDx@L)rbrCLyt1W=KavJD}0#v!VOJ|t++wxN`pG; zQcIWiSx*!{j{CH^7KVRc#u+)D{ZEq*|2Br66X9?`*PJ)g8h;_4V~yN{JDi9US~TKB zt+W4Ox)1vJ{m^`kKUPjxYjU%$IhV7KV|~#N?Ys`0$2mplM{TJw{OA?xMI13b#jwVx z!BGo4)Eu4U(u-TA1l5iqwd_HjZJhm^``f>^QQ9CpYSHPo!3#` zP#8Fxj1)sn{m$rKB;5NDjY?@me|wDAiaw%-^f&cGb8zC(ivLE?cp}@xy^pB{XFb=r z&UFl4ocZjZ7+O?z*23s_?lB0R$kY48`M_lqxp?nVC-kCM7~xEe|1YYj6@Gd@*A3ij g?OIYR?w)gbPuji<;q*k-^`-WDl;ZuZq^5w5QS%;f`~7pPv9HqGjE#olD4*0>#Yb{!5@NxFA%>o8)NmC{uC?;**$aS zc6O(GJHBiDj_tsXd}zI1uW1?~Km7TLxt-YI59!}&jV;U?KXtQL@7pckH%~U?owM${ zy|@k7E%I&zY3O$K1)O+c1%^PaWHrj{8IC#9SPpm=`VcnRjCJh;Te^+eR=}m}fjT6_ zqkq8?8A^NF25Yy3=ko`aRBjF8wsxZ>#pDH5g>+C6qQg^oPjYTzm8_J5f+(_&kE%*h zor;wn7kq^kd?}TN)#(y;1yW$4y%wE=3^Fe(ChB!iwrQ78q$*Xmjw?84-7YJhj|6Eh zF)C1nOY*VQQZaZ>vFO}nRWH}{LicsV7tij45e?BVwgT`5y9&om$1~{+Yy9)c^i__y zckq_H3F4fuFdR@;sFI>Cr3l=xLyY_g)5$ypB@7t~1Z7dE1!|^XMryUAtJK28$>rs0 zNuYG8bIT_cNput=jJjo1*aiqGq9Hov;rOs@8?$`paRWc`5Tuj>5>$fV`Mr|*C@tffngTZB(CaY!r)hNcp9|})>J_PU7#3^l`4%}VJtVUa`I{_ ah1&^^Io3q)|N3v_`~SlK{$GJVtiU@-Dm+I3 diff --git a/data/map/lwtabdrt.bmp b/data/map/lwtabdrt.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f4adbc919be4fbde13746a7d0585367d4b36116c GIT binary patch literal 2524 zcmeH{J5K^Z6ov07J|Gz7rQl-~QJ%g4V`pPyVJx(^vY;_mCdR_n#>Sd|V(p)>@gG=Q z<2lQ&8BVR0OgLfgx5M7y-ZOJ@{*knBJSWT^F?)c{AZN3X+2xekQQPb-2q7O}4B}51 zoSa_Xy}W(ZFJ6N}@bu}r-EOYe>s6uYe!rhQPQ6douU0Kj#tdz%^Pmc^2k$;@^ldA+@uvyB{1e+6kY@ipe5lYuvMri zd>M=?315lWvT(lRP}mw+R~Yxu5w;H27RLW@AdEHK7seXw31ba+g|U7+!dSzWFxI{) ztOnK)#=g~sHNa}Z*z>Be7TC5h`ejSlE?7kvy|yWAAFM3w0F2&@{X%a9PzHQmIQx`^ z_}pL5p5~!7;q<^Fv?`o_q0d%?(_=$FjlQ32nL|BB57Q^=N#>+4)WZcZ`anI;y|eFn zMtGLlXa79WTkNTS?wE`H^Uo)}%3k^Bn0sYk{PRAnbvnE^D$%{rcIhx@9N$NL_?@zA T)GZk@f9~w&hyT``cd5B=Cha~X literal 0 HcmV?d00001 diff --git a/data/map/lwtabdrt.pcx b/data/map/lwtabdrt.pcx deleted file mode 100644 index 4a8f566f118ebedfa1f9ae78e356d0aaabafc266..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2009 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 literal 0 HcmV?d00001 diff --git a/data/map/lwtabgen.pcx b/data/map/lwtabgen.pcx deleted file mode 100644 index e4c68a8d645528a065509dcd2df4bb0694577404..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5845 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 C`{LyQ diff --git a/data/map/lwtabmic.bmp b/data/map/lwtabmic.bmp new file mode 100644 index 0000000000000000000000000000000000000000..33ae2591953e002f9c7f209d2b7bcdd19be8f38e GIT binary patch literal 3752 zcmeH}yN)A86o#wZ_lw=W_1IpoJ&ab2hJ}P3Kw2(B+JuMzVgjN`2}lSK+Jt12jpq$` z1mb-O9)g&7`2MP{?zRJ7fN8nZUFSddI_H#Mef!7ExaUo5%&&aCX8p*rCTAIQERFf> zV`JVO9Z>+!L-@JPt8c#l`R%)ZZod2T*dBlX+uq*ZuI}#cu372*{eAIO`B!xF!`l~P z4iDx|o;Z%p!vlIBpT`V5X5fF9f!9QA&2LuYWq7}|mHE7*ePUblY4`oY?#z2OGj+Ew zY;E@TU@oCm9WAqSv#}-n+8k|eijJPzm07W0fnC|y?Oon-m*46PFOho+-Vj3xrX_nJ z4~5G?fnNzU&ojnz@^Xcaw!;;tauwur_QE&d3GyC~T;ANh1m1T37sOhO_{!0FNl(kl zi8rT?WH;!O&*9v~w{~(lvDDb{e4?wCLfuGy<@l6)Ya%=4t-PylVs!Z0_2;I#$%$!V zV))XL&VetcPQ;fvJhC(1UY~5Xoj%1hAMts8p6{~bsjw4t$)AYjYfJU${W_xC+e*o; z z6plyq(9^#5m9vywO^MU;SChi$D^>pCTERgN@ zc?(mYg_`ksip@2+`apdtU8>L6@y6&?o>V6>^4SSb0!?-=@Gs`I}o2 zTib=h)ccuTbGC}j=Vi&RZXgfd>=>ji~1pAUU?l6_!K@rw-fBN;0bjz r;9tPg5Nplbj_6;q_qiVEviUXsJRkAO&!0v*e;L{L{{{8G(Aa+g3=2!y literal 0 HcmV?d00001 diff --git a/data/map/lwtabmic.pcx b/data/map/lwtabmic.pcx deleted file mode 100644 index d15508736eb2275456f500bff7eba15ba6e81f46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3098 zcmeH}*^bjl6oyYpjf6%#6mJ4=0?+2%E+@{?X(t^z0U;2xTp%=a(F2nC{wiBeBQD?) ziI%FX>ilP4D*oe5)Nb7wFO2g7S`D7s z!M%asI4_|!;7PF8y0`4cy@T$phj*fRcuVx|uqC;YRm0mrYvJ8OR}wsSD(E%zj{BOJ z_Ku?;$$rdLP70eqtAe=P&FvpVBwm5-2;q!tcVtIymGDJcZb!^1tP;K+{1jZn%tWdX z^Y%X6Ya%Ycdp|o8D3QoQKotgSB=3klLWR9TIwQ|j*nQ9zu?)i{eNhJ$337X!7WSvx zK)b;?)o!}?1ki;02e$>+U9zerq8;h$No5mAOJdw}-lFPyq^VOBOb@SU%9Y3D0p4TC zPt0=zc5tMxf-P300lp^+DnA!*!8NtNSsrJV_Z`z?g0IO$R4_SaF5&(Y%ev)N_|UiE1W(kUSzk>8hDl4p2jfDuHmT(TC;GCd=m22 z6NTt;Mpo#|=usoW9NC(L7W_?+pXJm$nh!NEKBpX)xOI()N}qFHLwnCsDkgfxS)=`qeHm1wxT}#X zNU>g$U^PQr@CJ37$d!}IZb^LObFMQH32V(ZpK&8RB4%vc!_H*5k>j<${3R& z)51Jh6LhN@8pj!Hz`R_{F|CJ4O)s%4*5Fik3pw5f@zFd(rpr9vL)#~{9n;?VK^6TH^U#khy+X8ro)eW@ zv)MuFMtAj~A1<&B?n}Kw(erzIfoT9@mnxy9Lf>A%M55`AQ<{e$)cccFRq#XrG#s3s zlWH9M!U!iNOoduOkKxN#^#>Ab%pGw@3N=KEUfIwr3e$6bO-OOTgl+MyVl`wo3soxJ z3O;3|#SwLS{5d@G^L$2!p3hG_fv-7hX#V9H{g3^gf%%_(`T*fGBz}@S`ROmAZ$E8* L-+yP|7tX*}e-I>u diff --git a/data/map/lwtabrec.bmp b/data/map/lwtabrec.bmp new file mode 100644 index 0000000000000000000000000000000000000000..69e67bbe8034f22d14b65548652648124b1ab018 GIT binary patch literal 2488 zcmZ?r-NDHK23;%+3^hPj1rU1!F(U&95Hm37u`)2288R>&k^>8ZB!J*Q41qaL?m@-< zhrVhA?vN9eYkkdVY-}u?mX@Xl#B4KX&g8V^y3VW-({BV)3v;h#yFp4nnp^51O`GZ+Z2IxK^ zG&lNEAjZci&%n;81jO7x3<+OQ_<+Iy6kZ^^Kzvf<0&(b31d4;g7n^w?ITc18c-V^q z`5-Y^oS9R=HfA)1n+q}rn;Sss0hhQLP!8SyAh*#{To7nJKMp$vLe3uO7Hshbatpc~ zDDFrTmjmWcBX}6AL(PQcLvr|_umi;>vKb&TLg@+QM^IXTsRQxVfaymBNQ25AZ1U*p VsmtdBrUOy9d+?WmpmLId5dbsaJ<|XH literal 0 HcmV?d00001 diff --git a/data/map/lwtabrec.pcx b/data/map/lwtabrec.pcx deleted file mode 100644 index 4b3079fc085f2beb2a3ec793a0ee1110e5a886e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1789 zcmeHG+iJo<6r6z+iuh4J*AJ>+7^N0PNgfKKC}JO5TH4}^>+FT3iP1#R2f>9TJG1Au zb8=b_e1z6Bp3va{Q4|?tEYonY2cm~=L-Vqk!4@$5W7Rw62xF$$=`hs@BbRMhQIye&(F^rH#avEB!7E*Tl}i@cQkwV z{!GgDg!N#FMQ#p$0N&4F3)Y`v75ME3@J+CeUw8Z1$=VR!^u+|vo+rEkF8kZz%!O~e zt>B+wbKi9}bma3+&>M26BDi#?;KP9Lur9C`Rs`G0a6`B}YuQ;xbO+nF%RC1^XOzwW z*$p;RE^>;6xIVHMxIN}Ea?Dybv)qXF8lpS*7$u{y&p7FK5-!egvGZUnE^_0rZw#L0 zy7+8djd;lKHX=MGmWqLDqw0GZZkHIPcy>?E?=1DlK9|HN_AUI#FJtlCkKAS0`^-<> zMVMdtva9==I}7VA#XTFy(MYeH?=K$X_#qPx1GJbJ~oJ4E_^X3oK&a%ICQ8o+o2u_4Idlu?s2)<=WxtW+ zwhLAZIu&fKAYuk?6xb~4hrK#Owk19GH1U0t z(RlU8I%oBg`^aXrtm6)QbJRqioO^0od9WHEkW1xiKu;*2hO0kR2iv|uuH~mEhv_}l zkGiA!R&ml>R}Gx*^Cjy;_FG(Z&r9$Lu_^__zBn()_UXRv*GGh#p?v@EQ2?g3)eYWyv|zhtG+ur z-|VPf^$t&vrx{%D_%QJ$=3XoPE#`aVVgTPwa`rJdBUd%@tG?)>*UIcIkdHC_s=n#_ zO?qW@|8?GjecnWUA99?lb1Y^lr zwPd-{`%w?|)xw@)r9G;}m5%bTnfTTO@3TjKln|=})nN%8-MfjO>NUkUt^c$JyS|!y z6I$?k59*AnNwd-A{(6_x7i~C=4Mt&BgQ{KG)H&*@^t|$tSO1xh8av$Gdf7PTQ1zlb zTD=>m`>V!O*Lok+8(MEOejPCN#%Jt(mRTR;yZv7ye!<%Q@0p^fx_lY*Uorpof%)r< c&KvIiP0)G6S@yrxTXYQnGw|tnhriDM2bud?Gynhq literal 0 HcmV?d00001 diff --git a/data/map/lwtabses.pcx b/data/map/lwtabses.pcx deleted file mode 100644 index cdc909ac061099f0cdc659cf5a1dbedae29ed59b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2984 zcmeH}`%YRx5XN^Bn>0-ys_)XiSA7=FIa~w*~0$!j|Yi(i^Pk-O;Ie`9U|7@ah zvpe5h&d$s?tDipDN5{{1_tkx|vfJC+OVd=y8-HxyncH{Y-e~^XEOn`yIhR^$Q`_CU z7K0W&*0CbzBs(V?yzOnu9&h<`<<)sso3T-(8iK1Aet6txQ8L#|-gVGTHIZ(GeBpzCvu1i9;1;`f#% z9t--0$2wp=Y>wGW?8>&zeqe`Lyo6ZNOSje6(H|iz1>LL3ez4KU*w@@4az`mguEDCY zR9Kz6q;QDa9cS$_m5x>9IAqD}o>fJya|w0H+U}flY)v;|uW)O9d8-?^F>*rox}ET{ zwcN~xj+P9$^fBQ?0jV#of_nj#ie2>y=ejAf8lff(&<8x`vn6*1{+MAZ%mjJCde~sG z&-x1NXNIYv1FkFXC@saK?}FBdIkZN7i(EG@9jsPBcdWAia=;Wtkz+gXw^6ifum=jG z+bMA<^+*>kysL9db5BHAkdK-yu0Ek!fQb;|=O3_nM!FGa5kj{R(Jt5<*bULgoKGmL z+A=pv=qOd$A&so#>GKHGGx|`$q3SX+2o)hqzNQI1h&?NWL-fF}z~we=5ix$Ds^TJD z3AxYGoV>)bP?G{q)_y8lgAU&q`PFzC`0a7CWdrMTe_)dS%_IiR#`MN z*WB?G-BI>E>2kkk^O?0Wm0WVSXU@6;pHtg(gqz}EexWM@i&vT$sr5{0FR=Jkpm6Un zcN(6pSuB$st8+TjAQMeBf%GUSUX8Zoftrj*gGB0>6YK33Ra3bz_nW9~tNTO+r8WlXfQX?18R6E!Eh3!W0HI6dHMpK^)lk?a z`Z=E;P#q>mWxqz8G6J`V&yegG`rmU-tzb*ouTyMi5Z%$?#1CZ*MMdIMu%`8)Y&-s%<^dmtQp;TM zlwF-znQxT5^!MzPT^+b#i7+qmn3@D!c_~LdPO`gVso{E#C*WgnF?Pw~LC~`)ctUk6 zltr^Cm9T4MbwDA;$Ty@fz2p<*6}w2-f-ia}cCj|tIkqIXvFmx_#9TdKJa)R3Tysd- z?aF%GwsQD1{8H34H`Ys=n*Qphruv1y$Em3!+p}=U8U8`|{LlZFy#7byU4E~?e_VmT DOs@iu diff --git a/data/map/lwtabto2.bmp b/data/map/lwtabto2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e37549dc1bf09d9915ee5ef5fde1fa1121ca21a8 GIT binary patch literal 2152 zcmeH|zityj5XNVHce`HS*>QxAKw=px6p0Ef(b1#<3M8PWw&-bTX=qaWO{nt{bi4pH zwfTOtcj3<~;8R9>^Udrx-_FiCSFb-z&7Uu|*(bfdkv)|Ko65|-S7y(inB8m~B%tRo z{<(AY;@!vVo1d3&zi#@?=O1Ca-QL;lc8_Fnzu)KQvv1Yq`)g=#AC>#-sq5Mf2k{=C zV+W2M`0qNv?@nV)IFqq1WOHG)rO?YNS?6X}Sq?MBYpucGb7+-2v4!@gFtJ|wOXYx_ z=$*V?`00Qxp{&d3vwU85;Qu?Mpfb+Bj<^eA7`!7A4`=Jv|X;+PNTEO=!rVQ_KY=tsM! kS#71M@S_<`%;2e3zDIN{w4TfOX3@*suVoi{=exG>3p1c9EC2ui literal 0 HcmV?d00001 diff --git a/data/map/lwtabto2.pcx b/data/map/lwtabto2.pcx deleted file mode 100644 index 541e9c5479f8458760637d8a468073cda7658c3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1768 zcmeH`U2fbk41`C(7AT5dra3`x(41NR(aQGz0okTa0yOVEg!>J(3#55U9}C1-TFcRp z9MROL59ya4LZg|+v?!xK))nd{JrQ)5~Rh$m@^a_wlIj0sNGmiclAJRKF0G!w+lYCY-6wf6wGWute|EFhG!fv{qm@y?w~wjFIuHo)OzeqC%apKW_ojn5k*)G>GU9Jd nGet`}V=n6Zv7l{8_ZMNlMmzb6eg5Zr{raN5`|ln2k2~-OG^$oH diff --git a/data/map/lwtabto4.bmp b/data/map/lwtabto4.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ada107a2741c6d04a866a60bf90521827a6541c3 GIT binary patch literal 2392 zcmZ?rjo@SegDw^Zh8iF%1&SFNI2ag#>~lbIGeZW3Lvlb4NC1Qx{=*QMs!f9z~YCz03bLLD=TdwQO8ZrGwAjL2MG!_N0u&^-v{|_{G6pV(z zXb6nB5P+3CFq(ydg^{1ZlMz%-kj}OQ>J@?NC6z7AD96AL)XxjmPbohJY7QY<31}y> zy_E8`fc}7m0jX?I*vkR23{v=0!Y4Hjkky02K^y80QrSE}y^c`5q_Q1=dSPjRRJJrw zuMyN#3U9w1tH7H!&1UtN?((_Z5a)4 z2y9bc6I?(Dfrw5Z?B&`$^OtTtZ2`SMj2K_$dpZz$_}Ma!kO~AV(V+n=kAsGNWcc zD9amNu}*odNNSc({-vll`u>rA#TD0=vw0({rum%cNw|7zYsc+@A$Z(*YWap$&*~NU GO9h@a9mzNV diff --git a/data/map/lwtabtom.bmp b/data/map/lwtabtom.bmp new file mode 100644 index 0000000000000000000000000000000000000000..da1d32228bf86a8dfaaa8d4c82b0211cb65c5b24 GIT binary patch literal 3836 zcmeH}yK);h6o!Fa>~eRhB}IvpC0V8<>*|c-jKfU2G;UI*Na_@cC!+^Q+O%oXxYnDb z_DlF7T)Xp(@_#tMisCC+9AU6H_sfq1z4__$#Kqsg!MVTn^+#IXHO}k%&(68;Upx1H zsRIO-yUTy^@aD%~{(ATR)Ai5)Ef>pwKKj*awR>}ObE#F|-rlx9bRWv=U*CO;aQ?~N zgI@^2-QCIV-=4!z4WD9t$nxpev!^+(jST6 zXk91Tb6>kk=h|29YLFYbQnV0x-aSwBbKkf^^umW|=QPo;{8Z=Q^7)0|mP|G1UHW}@ zo@5UdL#y*eIv+$^jbiAXm%nENy_C(uP5q8LO0<2+9>{iU<)ZGS)n(z9WY{`nM}OIaO)VqelEL@#orm)uPr;y^%YVf8@|VRn9^5Lg%3Pp2|no zrJr@w2}6%xNroQho`0inY&Wt=+&N!tT!`2E#gI!I^Y_ty5Pd7f0G<9&gED?svRMx~ zWB^Gthal)_T@@_{vbvlwv=7UjcUukXYn|$Ht8o;Ly@S)KkY&=_&p+{R<=(bvg z;-i*ZsvqY@-_#R1FhZ^A5xe={j=B%!Lah5lGQ`^W-6X$m%VORYp2pEu<^`Q=;hY$P zaL@>^_iAaDS(wPh^MQ8NX5wg5(YNGwITsd%jn0;L-ZLBe_jJcK5YjZRnMv z?I|wq??JSm=ZxjgESjmF^pksTm?C!YWiqwuInx58(C3N|IqJ$?v0k^DbERT|poUxcxUkMBd?N7uQ-_*W|OzH6%YSY-80^E>V`k=3Ov?Kv4hu59&gE9Yb-tL zkKTcH=p)tfRJKaRmg&&w4RuGZNIdY%J3_tigYQzcMlbVh=Gz>oBn$6p)T_t_Y*#g{Ft$Z zbK`>*u+RT8F#Q^I!Bi6$j-s>A$3x;DT?%7{XWjhanPGKSG|a& z)y$9_4*B!vNI!g6z7JkM^Zuy}adL8UI2@Gx%U5|8C7$vAy4NAzMH7c|TY~R9zVAyD z*QJXY6>D{C&Tg3xU+7x=S6{2LCU$))i+IV{6NBe383}ow>IPBs zrGAk%$^rV&@Uzfb@AeZeCZj|vk|vFB;aG~$xUG|>{pTsEAVlYt1--4tw*xoL(> z`5BK982O_@<+jZ71k({pWpkcQS>Q})mA5#FbTOe2s|>hDvo9zHM0#I=MZ+d*IN)G{ zvx=p)zDBkzSyJJhj}%ZWB$j%L3=@y1jF#VH#eiYuY*y=w+ZO3VA&_|$nV8i06_lWi zn8prSmG|+UJ%pw*dA1sL9ro{-1Llxial;a0N0sLUB46+)6}wb*fwsDkbv^jbv9Nj` z8990q^YysHog0&wv*VwZr=yv~S)(@wx#+ghp;WFpO&DznL#(bIO5Tg0lcdS1fTsd~$5Bll#-k zRyrfmy9S>|kcWs2)odJ>q^c`761)9v@sI@9vNW5g11U5U< zB1Y>dS1u?o$6U(Fii+fI(Cm3k%}vS(;w2AooQlY!ViH~*xa{z}<$0p(z-^KM=&@ce z6=XcNIFi;=4ERh*hJ(b_28(;lNI*_{SzA?viFb2$ofWi-=ZK!F z@{-hQf`eYl=B|5LN5JPqDM|BgSh3{#Nm6r~_o+9-7STuC+Vk(3-{Qy1%3xjJkY^

t@Ea@i5zkaK@sFDdnFhB0jL)&hVs%vdOea1DzM~u^%%vjyzu6$so6g zw#fVY`@s5cM9JJl|2IZJ{4h>GG5%iSFNXSGB)|Q8a>GXds{Ht${~vwb-=c53z9I0x GMBr~(A`qtl diff --git a/data/map/lwtabtru.bmp b/data/map/lwtabtru.bmp new file mode 100644 index 0000000000000000000000000000000000000000..052ecdcc57040e6a407d83a87b49ce9d81190d91 GIT binary patch literal 2376 zcmeH{y^a$x6os!d9?wr^vdd;+VG$`nf)!K{iH;@`f(8WC)Oi6~S{jW`&b706_qMV4efMTxwfdm(Lc>|DVfIt_%jae{vj}3)x6Z$~ zS-ko5<@)B&)yE&R+p}-K-F!ZuE|<&48ez3sHLu!V#ntC)!frl=-TS=vwq7gl@jEJT zRN%i;fd3t5?;U?H+xfNj^?*Im+`Ga$jcULO&7JdhCaiX~jdyG#ty>plBS!s?-`JJ* zK)xqCJ`=4^h0hMK#`QY8&0EHpte^|9R5RKVBj_#> z=Ujun=H8$q^??(MK5g|+Jth~vXqIhf;=;W>#LHpXlwT80l{1x5CUD<9!F6DbzP|G#b>AdfDg>VdI@A n9KT*?=|dlT8aDbqRPMXNa*rPA%;mt7m<#Q*E&W&Vzh&+(c0Vd6 literal 0 HcmV?d00001 diff --git a/data/map/lwtabtru.pcx b/data/map/lwtabtru.pcx deleted file mode 100644 index 9c016505162bf4b95c0cb265fb294fd66e63e1c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1882 zcmeH{TW%9U5JjsbBO%0Q!V1^{S@S$Rp0USCoG5`r@Btr4u!!ND?g^3d6+V$-x!qm2 zUbm{N{q9Y^4L+aZEI#HgHk-||EFv%bQpWB!? ze$O^Oa~9rZ%-MLHL3-8!biiVpW86W$%`S|DrO?Suv|*1C#S!ruhY7=x9Yccj@g><> zppJM!ir(yB3)B{ic^hY;)o8YWz9*r!n#|dtHn=Nw>h9~i?LaN3xVqd8i>;s z)l{h#mHf6W3+&Mo4eOP5uV_F?k(sZIcM!i^Q46v`CwxzTEiIu2F}8Ko2o=}gdTv-G zII?NJE&Z)dI<{MA$9Tp9{vUzB%4Ke)0qH6pkaZ}xGNmY(y=uCX| z=;Cb+E1j0Bu35ZAOe~bzE2}PkBbvVwZ{rtMPjZKMPrE7!Z3gr`eLs?6&slQf_M$;P zFi91w_=v2(*IMINe8QjlAFoVShB@S1h%;(b=w*st`&!R$~hhojlo-RI_-!I zoo8CFzfE;Y3Fidpbnlc^)H@r29A2%IFDd2QDwj9bqxPv(69Z0MG4Ex^1ChC&Sb7i6 njllb(A>4A^>{XhScJpXHWm0vsXA9vsnxB*o- diff --git a/data/map/lwtabvid.bmp b/data/map/lwtabvid.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ba0ccec76644ce9290d2d4a186e767e00500fcb7 GIT binary patch literal 1560 zcmZ?rm0)84gDw^Zh8iF%0Emr%n2~`4h#46AfP}Ih1cL=Yf(-v*2+VPE4=V0I^i?Bp zhn%Qf>uW}1V`Jg8v@|s!W}7*4CZ{deb!Ls2evq+n0JIJTu&}T&{QnO$cNC00N3tcUH||9 diff --git a/data/map/marionet.bmp b/data/map/marionet.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f1e20a793263c8b4f25b0d18d18e54d31370a493 GIT binary patch literal 5260 zcmeH~%WfP+6o#w1XS!#`bMg3YkL|g{*Vs;MPkc#C5XvTE0TP5DauGs8GD1jf*s^7V zkh1myDUZQAJDz}tV9h#we|J}R&5RSWCzeay^_{;?Rac!lRrBDJ-{ws6_iM?RpLzS8 z@+ZZb3dNXU+L+TLV_vN%PzL^9yZ@x};Nj;#y?FJ{&S!tD&#(XTw;c|LvzM2bTa@VP z>Z*Fb_E)&`{Kc`v?vL(9{z|2idHou{@BiMAvZ|zgQ0$*c%E+*Re zkbZ@@>U(h^eoR@hfw|$uRU7S5#y5Dn7)*I&meFr|@j8P>{>2Y@*PfV3d_;`z?QAyF zEqc0wh30nVZ_d+=ve+!p*0K3S7n}JpcFgz9d29il*eu_1E9+x{ddh;FEutGzq&vuT zO9?9{{t6bO3zL2wTgKlyY?rd1wOxUAXdl6PjK}c~@wkLdYu5GnD(f{zDbc1&o4w4> z8ZpsIVnVSPnw$C908 z50d>|!_PK++v6?zt;2Wm@AI96g=WjsZo~Fyzd6SCVTwD&(E{&V=x*V!VDc>%@*Pf> z_IHTRXKH)Me&~BTu_M|#HlOsNeHwTy^`|xMWo;ExYI}$0Bny*0t}&;&GC5|Fozhmh zK)SiC-&3CJIZOLJgDEehx;L|PbjlIF?k=p8F~zOcVUz{QTHa$`mUCUoF3^v&4`54U zy6f0|{4Hd<8QN&g@AE8JKwLzeVd;2hm*hCE%#u~ZyP@m=cUfC zb7FNq*K03y$gL5%Ui&ERSNg#A%oO~DJv8faYi|(q<6JS_Ot{V#n$(4(LnY zueB1__lR%sypC@YKbrfyxxP%jmE`1ej|Hq>8LqrM&LhTp0zVtkhv+AHn8eK#+Q^)G zdhwWVQY@W}@hbHT_??W`neP(iV|-}t{k?dCPV1uha{Ezd(2%*VV^bXY{Fv`o{-468 zv$?Q^9K33|XfBA$=_IbZ3L^WMb0!OlMuGyuUrX8-`pJ4|o_PM&d4EEG?i^G-WDh*z zIm%-5DZF4I`F)CYigTtrmF`6k*w;=c7Q;Ru9^5>LP0{ugrr#V|cip=h=x)Q^9YlAx zY1mD4?w%ty3)_IX`7wW#YjBW|$?yY@vtFRfE?&RuMtP88dTpsGvb^t5m z)8#nb@iy&3o@Z6xVPD+O{HVT18^x3S4)C$fZ!MRXbr;;Ej{uGHDK>yrU@q5*bz!=9 z>i2KFZPxw!{5{Tphi}u*j~Rcr-|;W`ZWUwy1p@4v;{X5v literal 0 HcmV?d00001 diff --git a/data/map/marionet.pcx b/data/map/marionet.pcx deleted file mode 100644 index 26448fcac1a11d0bfea0f6afcf7750072d5df45c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4723 zcmeH~`EDCG5Qj-11&X2%)dy`}W>>qb(~^8jmL18m9Vd1i+ff`l=l1(?ma8Lfk^EU8 z0#+iwIhN!Mhtwax`QII%zg^S)<(ux=vu9;liu~ZmKX=|ecdZ{(-&8AI>83pTPF(3r zKk>;=v@U!DtD9hR;S1Vts&)$af*v!Otn*Q*`>!yPC`)O?2MZ z$nxxvz6pw;fs`+&}zw#JgU z0-Y}qi-o=$kkY5V<&J~a3p^#*mA=XPN0zuW+`a?We|CpBg3A51% zL@f`W?jHqx<*CV)A*I*%fAuF=nOrUNZ}XFBf8Y5aCcoZ6WQ2!;**1xbR zL(nErLZxUbMU;STXIt}tp0-mLi98N{uNv-BlDHO%wD~Rg?IFp@D60XIDo%P;!6RwY=aqC1iQ*+`PP>a;hpCzE9`qVI z;8&9Fn&d5#EuIdN9v-a*%H}3`GRamg*@fQnw8(SW4De<)%JO&63?j*JO|oFe=B_Y0f(z@S>E^vS;kul=1b@ z%c~k>RO|K>&3xZ2(0!~uv>@+zQzSWY=#zpCMwYvem7dWvNWo*3QtK|=Ik8)%((OT8 zj3H-k8f%x9=t-aj>76;{fFdtR2Z?3CjIk(MCTXF+l(eYzl4yn7c+hIL(bvjO@v&1$ z3vA@oBsxP((uYiW3Z71|=@CD996*k$v1wj2#u_E9P@Ofy-iAbeyJ7CCB`39wwpG_} zg%w<^(8T%E0PpJ|4fT3I3&UBb4L=Es^T4od+S1Ma0ee#cjLS6S)lGKmHuO`ytQ!0! zr1ZAT*3al`KPO>wDtD{>*FitZQz}Ky!IxHn(h|PH;w!0PJ|p>pjw+K5Ez|j)d`3r= zaH;bNKauDF&PX;L=+e=ApC*s!*anI^4-hLkPZ3qYj13bH45gNlSokBkN5@LHk(@30 zJ&BcBIvU{u9jnz!MtNQ!v1+STddV8zAz3H4%za7Z=N4V7+_JjBN`)*Ec@{~kqh2wR zj*ccf{3B6O)%l?lK(WZF(6WxCA5v3P9wO~>{m~}6KsQpA#8KEP=TN(ZDawUE3L9J3 zIC-&CDf81nHDbH6NLN>l7H@2jt-6w!1CzR@vMml@62h%6N$Ma!;MBdiwqQmz;|2t*~@t_=yj9hQ2Rk==?YqN^kiu`#j}bVSlhXGxNf722!voQFN8Jb9XAK}S2v zbcU6ch$3h=2%}lJ_?)p0I(&5x$e5qeQ|6G@RPWW*NQFBKbWr&{B!`cQ?>e18M^vLo zW|$C{{U z>U4hGAWhEAXr)`8%I*Ccd1QR5;ySH$G0G^j9Ts_&e5TsZk?1U5>J9NVXKU>uZLCRp zT%u-vu|c&BPyF2mZBz2+{+gh~IcqLWKPId%*B+$S zoh0={Xr9vL&^)b6{rRYzOx@A)1t8-ukC7J;=4=D?Z;i%L!#28+S! z28+Yy4VENc&0sF9YOoZ{Ggz8q#anIW#vJB%Q& zV1M7jXR){OIru$`y$8Q*m;Z^KyyavB*u^-0kyyv$p_I2XiwD1P@cJAuB#r_C! zZVd2I{blM7>y**6QW>a!i#|CcvlgDyQ!@7(JWub&=@ZZ5Q=rFF^p;(7$*peH#x=ov zP?PFF%(fIX&Zz!@7Gv-9EPfs0MgNgjrIrhlQAU0cd}Jfxd_H)`(am`td@KfA!NMpR=y%z**+kJkERe!r%#M i>MMFK)3+VfKc+tXd+k@g>Hdz5nbZE<{0{Z!qCWsO0Gyft literal 0 HcmV?d00001 diff --git a/data/map/musique.pcx b/data/map/musique.pcx deleted file mode 100644 index 25e9fc573874d3285990fea3da735420690f500d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3863 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 b{+c6JpXb*L{F-Lvd5OQEeWky{4cY$!_q_xc literal 0 HcmV?d00001 diff --git a/data/map/net1.pcx b/data/map/net1.pcx deleted file mode 100644 index bb222b1f30c875987f27ae618a08b058c2d1abe3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17460 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 diff --git a/data/map/net2.bmp b/data/map/net2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1140535fd45f4d2b37b7f667b2a822b3c12ba118 GIT binary patch literal 18772 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 MyZ^iY7D?0jKjqs7pa1{> literal 0 HcmV?d00001 diff --git a/data/map/net2.pcx b/data/map/net2.pcx deleted file mode 100644 index b72eb53ba2707c1ff8a2f629908ca301150d3453..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18643 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 Q3mg9bfB(;c|BD>>53Q2a4gdfE diff --git a/data/map/ordino.bmp b/data/map/ordino.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f334923f8a73086b9618b80f1728b1b99a9720bb GIT binary patch literal 4984 zcmeH~%T5$Q6oyaDmATJw$GO1(!wjGX2x^QMWP>qrp^2_s5?(+P@v<{++^}ZjbGYUu z^c_sx8DnCC|6kob-PK()6G8}J>`>{U{;y7*I_K0G*nYe}Ci?l55P6SJzcCIll#F1A z{3wdtSQ9yF=t&BAj=dlK%l6LGmj_2bJ5RneCK?~VtBs9~vAw;$Hb(03@Gx^X`!(Kq zaj;Ib4v`h##N`K8zw&hK4SGosWe#x%w_MpH7X z=+2d-scvV^babFwb8sTV*U=+ty;7;Y~F@e0yAdO zm!RKr^>K^d!8+qbo|8>?y-i=ndZlU@EuDiYi;WeP2{09zwlJoh zvdmbRF3#%jRgxdUHn}>uqG6A|GLB&`jyvGxi~F+fcy5!c zVXka&j2UAW<-TDb_Wc_4N?=V4IVd1UvB;Vrw`J`yRqXHE+LRI4We<$03ViVMZF1|d zl>*D&z#1rr*qDq4{9_!_n&r7leb^*=QBM1k)GT8~`#~Q(yAC_5`!{3H`V4a3nH+9h z_gm(Iwc4MX(dS@oFb6*8$J?>z+)vgKa~kBlTn0JT5o;vKCEVHwa%9N*oL_4}j(suS z`;KMZK8L@KPg&V=Yov*HUgx0yTHdML5QcX$JA`S$pD4qcsPz0~Psq4-c6DCEdP3J8 z?;PvEIgiP(7o{V`)GfEmSD%}wf&h67^iQago(=v)_H$Nb@4fF z_#4*w9m4wd_AvEjtRJLvFQ?bp*HeFloV-H(*?(4bohD@$^Fcqoc_)9Sc2)OXyZu4h zHQlSdb?gVcC)2&yoL0YX#4T#y)DzN047|LYwe~Qu*JpelwD&VNH)rjWb1z$cV!-%a nWR1OoKC-{J+#VD5cQE7q@8!gKFnbvo?@oK?x)^W%pDXGw>RPbj literal 0 HcmV?d00001 diff --git a/data/map/ordino.pcx b/data/map/ordino.pcx deleted file mode 100644 index 219f3b36dd1f0c3e7e9f87aae14f9af051ef096f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4088 zcmeH~>2BIU5XWaeRH~{zRG+YYCv%1SC}+(T2!R}Jl}f0PqHO=Ow%5BBPC-F5l^Uc3 z<~R4uF7dlJ{Fd;up^x-|FXXLKO8y-9!&_q7(x(H}lWL0OwL?^v*CYQ+@4j=6xItVa zE)&mC!y5S~rM~bPt=h#C=`dH_j8b%}nD3;42qmR~fqFjE;~ZzQ?6t0>|2+Sn&epkqh~&xQvYn zPJ(=vBNF8uYu%4*G|M^M76T}qw{x8VmD21k;WPCCOB5Q6mcK+79Ys8ae8n?2lffx=8oRd zO3XcK#r|8|BV^3g6fU81G7Bs_en&AvA4B2?U2Q?2C)}unX+q@(TAat+p`w>FauRE- z^;VRi;bC<{7ehGImBIzSv@2rY+6NzCRiP?s@N5M+uJZCRGt+gQu`lgHw#M5C<>{e? z7~Mv_77iyKVhjr{Gg#K7DlHAMzEfg6fiD|lni!a|o&qc0i44RN%kKRWxA14gvh4Do z1mYtLBc5sTRr6|g6D2e=k|6`R;Ml5>FS^u@8fl_~?&pn-$#q%Q$#Qr|(A zRf~EKl2~i>zXr$M1S!!^O^OM!g6<}?={Pn^coR~GM%y9RAdeyW?2rX?cOdtURQ5Lq z(sZPAczJ?u6Qtpg8Hm!PjOcc=FEzm~HSwnApefcsu_t@xV^eLbiCiC;NT0YZZFLXf zn7bAo;hwc^pQj_ac#P*UZgAUnC=m^v;CsQQJ`es1jsNR>mG7d*jrVvCIqo?p`QUQu V&qqCUojUlL{Qa--OpX3?nBPV$V*>yH diff --git a/data/map/papillon.bmp b/data/map/papillon.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e35243c12803436c1e2aca661627090f25b1eeb7 GIT binary patch literal 3832 zcmeH}J98XG5P*Ab-@CWE$KFfQJ@h*1Bw3c_lVmU$Y!%oB7q|q3q&OrYC8L~>xCs3R zDE|av{|SBsF;!&d>%P6yiNFOhR%vUyzv-Uo?&+Dmi!c6K5&Qeu7x@wCSDs&ZoWwjL z-=`wyCnB$h26ceHH}ii}E*^dL!;9B{PA-2NwujIEaMS6uc=qhsE>HOK<;&z=`nxyz z_Qh>Ap8v7jwLjnY<;@%BefRgS0`DsDzpKD2GM+!*N!?A+#}d0c(s4JDN3c^_bvKX) z(sCy86Xc$(W4q~gkvp&>*>*d~E!d%q-8OOoJ1FG_zMdrLyKalIhV)z@ zDRb?)P4qhBGkxMVOz*h}`-x=u^_^acb$lXx_TZ7Mm8|O$*e>xW%rUc@v&d!myq#rk zETPM#TiSK-N&h9w$T@H|X}gidr@k4vhYQwV?7y%riT>eRr9R49Zi6+Nyfb+lE3BS{ z6iaq9){Kcdthg0&s~T_Ge$IJLJX)g+d)?=bG|WC{4^rbz z>xC|Tr1R(;DRoJ(*BP_krh)-M|@18q@9m9O=VyVEouAo-E1&>*y!g$9unY#l&q2?Yo9^5nD zaBbr)S6T2j_JwP~r@S3?aIC5OQrI)+b$nXbc6mfjIrkOp8^qf{?;)qu(;3T&FLiZz z(`tE!O->CHV^w@3;?ca6C-54!vFwvWi~Mw*oZd_5PmxG&kXIYt#J;xRq1+@+y;ExN zI=vm6eJIE9b>hpJr?KFHoWR$3QtVsTxNmn?jD35F-)7w&^C<5uxG$&hO>*g7V*!1& z!n*S~wC0)Zt@dWhSr{&2_pDBZ)hT8Ej9#1P>k)ICC$w`Gz_q_q%grOtE@OJO0`@88 z?$!HJ>*v8%8H;)Q;@}6^WY@+rYT_~G%ZIiXGao%qE9_l`Tt6zguG3=O%Tm{vI_OWS zovx*Ozsg#3U32ZDe@U%${A1z|c`i)%P1koKRG@gHeFZ*OJFt5jNT_*`Ywd&ebg}dis>Cx;1lB8W*xN) z@ol3=@CNte6&tXZTg0}v#QO9>N4I+{DI{b(y#hmF6iY7{Zg0rO5Wn#C3YVk;d5&BiR2cw)%(e#mOj05 zi#4?#N7P^+$_bm5Sr{CBK-+&?O7TjI>JMe4l^!u;B55K|plJ~2nN8I1A(tFzg literal 0 HcmV?d00001 diff --git a/data/map/papillon.pcx b/data/map/papillon.pcx deleted file mode 100644 index 5258a921e47bf858704eae891aaa28cc3b279ab9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3354 zcmeH}`EJ`r5XNT!7buE8R3EW@h~_~^k(7AoB6V7ab=k6f#kG^PX%qH0OUibFrbz!R z5CIf-zWH``uHEGi-|6?l?^pR*e$u9#oSc+pX~8cWAS4mcahYtraDE{Xy%l8_)H8M%CTgx;4&mI%pq2AV_naI!1E zYXI6Mha;D*w*2Xkj`n2C(;`2m;zKBHrcIdA#FJ7zhh;1<#bk>~rCQV>1sRa96wC)} zK4CLV#VlKD>j|4zm*47f;>M@6U#T&i2dZmhi}#VSr82_zH}yEctGA3TpEiESxal~)ysyU{g+3+l zQahM`g9{ zon)!+k&=oV${oll7BVc@CbX48xdolDzHPT|jYe{f-2r~~K|8gdO}QlE0<^$FR--AM zAK_8pHfu&6?DXhUx`_FPyXW7dK0a0T@v+aOK4^|~M29ZIT<+jDh%=X&Cg;8)UGFXarrNp`;PWeKB_HhLj**MX+n>bcCY?z`qs zKz7^!ryv1UkBPNHrq1&ta;{sMfLO05a9Ykn0Xn84hT3TwJI`|6$OzOp6>9vPOV6%S zL#?;$q)qT)Ed%~5Gy*X+=l(jPZT62@p=Uq~{u5T=Dg?=SACVO{GitPy9Nai7E|m`B zCEZs1D^hS*_NeCbtY;*_L$fpBj;uHd@r7SRx>VgV^vpRTTOz6KR7gzTLwp`_&;AoK zA}h%!97AI2XL%aCSzku%4xBj7nEJ%@K#RA1KG>;Ydv1?)pYAfmc6bc3cbOR1(gnG* zL)C|UkaMz~vmp<3j8$SqciL#^dU!*g#&qs2xb@0}9k9UHIk~^*=DVOHyZQ*ud}{TM hJY7pk?|0FE`T=GiV?X}qFTu}0?Y_z1GVnjnz~5T${h$B< diff --git a/data/map/penta.bmp b/data/map/penta.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f891faac5f1590e3b381a1b7eca72a85d746a45a GIT binary patch literal 2932 zcmeHIO)o=H5WSc7>6ZvaqoP4Xsy6*dkOq-%*dVOC?oLQp+S=H3-G5@;KjA;HwtnU` zGcmnh`&v{)deh09JLk;InfvZbYo~Wf(^-!ZWA4ejCOaXsCPrq=i)YME$(VMo69hoZ zmtSX7JHEVaw%_s>Pq~HM!>g@SD(Oa}u}S8&TCMm&;(0P(Z15~K0Jy1 z?dMqUXy4EHeE;|P-q3i~T-k}P=b?=nOSZxB@9tN*UXAO?ewyP2jwg7J-cj~{gR?S# z4rtnU^dmM!R^<31`J!8}7{%bjG9%<+2Hnf!o}TJi;25;Hc)bT7^SNBiiCSTp%o`^z zwCS7_>k7lpC{J_y?RSY=QgydzpC!Y*y2h~aB;_yls0D0~O!oj+?k(c5ZKVr2E}o)T zc1VugTj}A}kh>VxOL#@4Ax%E&o-0k72W);o?1*b=KF$C&BK%zb0te@;Yhcd2(&Y94 zK10?|M-ZnRkO$ovvLL=-YpT~A^YP6;=kQbU?*B9V#~J$$Xa+#~ literal 0 HcmV?d00001 diff --git a/data/map/penta.pcx b/data/map/penta.pcx deleted file mode 100644 index a54176ade80a6991b1bab8b78054011c4e60356d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2297 zcmeHI+e*Vg5Z!qwi1<;y>DSng)YhsMuUKpmRD9415`9sMxSrFUO=sJrCdMae*-duN zWoEJo+x3>LIsA6qmfMsbm)?8c_{$d|EV@eDiEF#7qJAH77zfHs7Lamn9p)ZYSz`~AoySfr#-};KWQWAx z=Hes77)*gNuP$e=7ku1IR!BXgpo`^~l3r4ACxqEg=tU5CIn@@7ahO7UzC80Y|Lf AM*si- diff --git a/data/map/peur.bmp b/data/map/peur.bmp new file mode 100644 index 0000000000000000000000000000000000000000..224791559fd9f2f544f3599f1683868b9df75d21 GIT binary patch literal 3388 zcmeHJ%T5$Q6s@9bhMD0tzzmOJ=y~v%K^_Jt0b(>7HU`i{C8!G*u84cLZrzv|V&aD1 zaOIkx@FQHi#&fFgoi3myab+-eIGMiZo?BIY9~E|=+#50e`RI&!kGIdjTfmwEV9eKo zF1pwP>3h_DeR79l zeX!k?=lmS&-q7a;AN{Xn{C~dwEbae#zP=zG#DMu^bJzYJ+5xj8nnN3zZFxTeUk7G> zW50l}2F!~8rGHQDSFoqOCfR=j@7)Y;1zZ)FlXa-O1ylmgS!<|U1tx&HXd|4LYhLA@ z>A*+649tt(S!b5PuYns2_#C(n>~&xSh((_VPd)kJ3%oN+!ViIOh<-58mjb>3o_c;; z0ceVzJl7{b81O}}cYfbI_?GC&t3DU-CE z+=%FypC!>{aij3F9?ZMyMt!XFH3~V^=^kUyX)P~u4!xJuQTeiHXYtEDmA?yn4mNA6 z+zxtS9yaSb?veEAHndIHtSi?Wm+z{e2ixEXt~DwA1T-z!3jpV#BK)MRvj}bms0Mrk z_A)T#k?hNUC(k})kFbBH`+G;|$z*=mCq+Q#vVwi+<9x7J7^^eMxuTEr#C~CHP1dX; zZXdP-7^m|`{s49aFh*yMXMGF|0F2R@nhNyv>Fkh?0nQ+K3+SBiUT7fyJeS3<&cihH zP1ptGnw<7M`4-^pAmXBak29}b&*l4T&%nP5#J12s3%NC*4n$a2zlr@rp0lan&)!M6 zG$+cjW|}|Ndfmrf<#?`+1D0E#y;@h zmdp=*3hm{GsD09liH|+Vz16>mJ(&l_UG_DRtFHg#*~{zSx_#j5{KU?V(4W%KH}9 PKa%&0|BvYZDaQT+GAmue literal 0 HcmV?d00001 diff --git a/data/map/peur.pcx b/data/map/peur.pcx deleted file mode 100644 index 5d031978f1739bab08a733dc6a15a9ba097e49dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2971 zcmeH}*-jfl5JkHlB1KU?Du0uFPWYu6+t_9e5E8(_W-*u$h!9dhd70c()ngA^0utgW zmfF*OYw7B$TRrpUmAy{-eN6AuJL@v7s*1-We>Rsa&7}{IRKKlOr7Ep!@L#0LDqFGQ z#_X5Ym2EnDX?@K<`TW9GHDB`inIi9KRJP#jQ_UBxt##kmC)P=8rsbk9CobCa`LVTx zmzwYTdMw$%(h&=dZ3hnp?nu#1vP6$BSy;-pykEF4%b|p$Y=zIM<(`D2EEGr(Q`tz{ z?Q3{cLNR2-o>(1fG^G-LMalO&lJHwL$$N%yS3VyUjx0@NIJnP{T$aj0gpp$npOwjJ zN0JAmoz!j!>yw1-Ku(7$S4$eh>|Bp6rV4~3_LZ4Z$?)vd0<`}kz}-OU+8n=7$DEyosO_fp9Q%#u|YTCl=$**A zcm;z?r3W<94cnk@D|Jnec2L|YI28C@PV{hUr%h?n1*ZZt;k=wKh{l66h#~|!I`^+; z)XDjpKFi5WAL7Iz0;j*xow7~(;gM+2p4W(kZFopUIuU|?S0lJkOD00l?`Z@bH#8$| z%7Q-kN3`6!ydj|=#2z;iC!zyr|~x@+P(IM9k%@XEiF7$Q@xbqBAq0}i&Td0cMS z$}8#Mz5)sKx8zuI>9Jv091Ddl%TshkEABN8%XJ#MfkuS_S#~`bQ|o{n$&xCa`Hw&ZX>;noJ$S?;$8m+m@#SgUG(53LfT~K-m4-`F68lJuJ01bl99r;8Tl$zD(OqZGk#kn9L61q!Mv?UMt zC8Ja)XkQ8?&t!hJftKpi!qGK7qZL}_oJMs95KYISuLyA@SZTDU*gT&T+>@ulGEM9a-HXQ-|Tna_RX(>xB66g+Na3vZ;R(%Kk2*Z Sxi^0yfB(<;LW%zOHh%#BZB0i2 diff --git a/data/map/pieuvre.bmp b/data/map/pieuvre.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2a192e0bbb15fd0395bf877781f3eea1eef3b77c GIT binary patch literal 6936 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 diff --git a/data/map/poisson.bmp b/data/map/poisson.bmp new file mode 100644 index 0000000000000000000000000000000000000000..263727731971b6cb11ab14542dd48a63440c2ff8 GIT binary patch literal 5004 zcmeH~NpD=o6@_p0JkQ+Gm}$a=!CklMIo65D_d?y?ajGTXl!3>U$slZ5aOhYboMWjh?H0 zp_Zbi7E$O%ynZd>tA&LC`g^hb_s6}5kN*7mSN}fv=*z`;@!7x9(b3WH>C>lsYL#ct zp4H!M{8&7A^7(bh%Ria>ufI~M6fa&#@5{fJ9(d`2|2q#n*N&I%pOI2g-@mHoocJXQ z?thM=`=6rZ{>Lc0{~;=QUruH5zt=bYcTsi!ZPeU<6Lt4rN5lPN&Hqa@J^mnO>5tL! z_(ANXPonMdy*NxCYh01Ox8quR5*?3^<7WDObUnTk$LVoCz8UYNN71wVM!cJT7k!V9 z;{EiS76%G*Bi%GsGj<_X#a|b`V(fMK zpeTFT-<70@&B@jP#+ZJTcFpOTGe6P4)Pdef+BTEF7DDs>?q!`;WQojlQL|&&7c|FlQ>g$TL5}X^OL+*3222vy#WXiCV!S;;vI zVP(x&DB8kjRRXQ*`+V^fWq-jbd{>gRYvJ{m~Io(ql_>%XAyLF$?_OK|$JEg5UX ze{gGRm{c3YauzA_&As6q0!B)bdon(`04ret$9 z)(DTDwxN7)o3r#|R$FjbBlUd{K7okKP1`4!{kxUTusQ(ZE!Tj%7jN!RUjvYEJ3aqpzHbv6Jc+hlh3r?o2vPm<;8eSd}?e>{2iUo)pK&{WJ~h1{2lSB@vStJ&raf#@#j`m!(-#H_Aa}Yan znS6P}cqND%@x*D8flc{)JIQpd|Z;A zf^2YyPmGV9;~CETllpm>RunV*#oWH^W%YSK%`6{UKJb0QdBPccH_eT4$3_f&hg4J( zBiBViHL`BJpW~dpjjKP4Q{22#+$}x!n5}N%Y{0&|;wr~zCvDI|LIxEIDd>(?a z=V`iStZZ!4u}7X^cZ`*cZJ)d|m^(>t<{0e#_GTpx?Ii&+``PKi{69ga7~l literal 0 HcmV?d00001 diff --git a/data/map/poisson.pcx b/data/map/poisson.pcx deleted file mode 100644 index 020d4d20f2b55af757f3e9f41b346208d5063b3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4669 zcmeH~*>c=A5JekRPE{(EkIGLbA2bU&BxheZyGEnkmM!n`rg(C0gB;mBN#IJID>_SX;6AJYz|zjOcp&@L@xm1tp& zV}EYVW52Z4u|Ko+u|K7sS92$p9Q$KSy`S1V9PEvCd}QYgZY^VQZ@2WXET{j`-qPP& zLI1sdqQA8+{Wo@?zqB6xS8y6OU|fO~b_cs**P&%YWD_`rJqKwaYugCf!1~CZF{f=~ zxD&83@-C9XZhSmMCiw(;hNc3GO2$LxOhVJ9$P=^`c4J2VCw z*$!yKq(f+hrOPMChaSBFQ>5$=I$`eE^oaE_;{xoACl4h&ZMsKBp401-TYDI%Jb9Qp zT7vdH!pg`!j2%xF#ueH()@80TLyWU(einw#m^M`J+Awp16=h%;%W&;a!#cWD5=sJ@q_XL8Oul2R1QEUu6ZTk3 z<&z!D?ZXu_zLl!%&XJ}^?eg#vvp!H1;zpAsUBE3_?+enlX_JxL0BPCh@1*Z=%qJ55 zfhVuu!uyCcaR=%&(1{{X3+Xa`dPJ4xic*dyrL5X((A49YGSdEazC|>ptcA{kPm@wb zMxhiz$#w>z5-w(E724o#h{OIF=(sEVcJP^4szazLyh zvo_p7nP-MpQ=%zo+He=+HFHdQFJa}LWMV1VbeAY|q)&(C+!>l5H8=fE5komLhcSau zxE*3B#ic{KRNE^Ux(O$YnAAfp0if4#(pyhmG#o4k{WZMNzW3- z#P@dUXuQwHVdUrnbn5PrTeZG2ddrFvN>}q2>}l$2%B3|!`7q%=6k`r!#*X3vC|}42 zDnwa6&D~Q%VsXZ@-G!AirZ5)A`3h#N9a+6`#stRF z!z@Gzp;jJThZARvogqY7r^Hfa$jTKAu}3ggj>xCVQ!#}sc&isvb+>k;&TlcKrwnJ# z7{SKBrFZdZh`+sa6@lh&Ibwoe=eEqj2MlK8*MRC5CPcttQqW z+&ZHNV-HfNe!LIF>W3H3=)yQ7&m%+e(94-@>V=oiC}5n!@Q|Efh8F8qFR3};g{O!P zfr!Kx+nn(wPK_z0aOUA}S13cT;U=VJqYC&3cd%~b8#a(~_A5C)xl~2?6z3(J{Rx}7 zcWHw3mW?*xs*Jw6v`zmxH=3@?jFFK65kcduIT0&&8*2A@vVjQ~E~gd%wv&qOYf( zk5aBpeOL83A@r@YWTY2(jY@1gu!i0a;+NnQXVm=}8>{;zr$XJI6QjDn@RKLbU81d) zFOjz@ohv^mBWLaBS?q84oUA!pJ~Qk7i5#!AQh51Wbg2@_~g=A^|N8jT`7_(;)<+N$r0^ zeFcRJ${?lS56~e|AMf4n9-9jhrp9YO@4Pp&GyCbSy@R|&?PFTx0M>ipC7>h=i2U$H z*4rXMH4^DS3+*=|Tm5Hm4uhY~r=O~&>bvi%+wB$ygFyqx42Q$qgZx*o`Qos{VB1jc zR13pU0y#$Z00@nxZF23S#m~3+SEL{uJ86?0_%C-Lz^Vy80rtnH|6+O>X&<`SN1L&q zO;2veA8C7p0KU2rKKfPa7ie{Q0wfs6cN8T@F}DtDvliy@0UeQ&x5|t9=PD~rW4F|l zRMo7k#5^YzWwa(EACc@w;3;y2OXaQH*m|H3yB&wM;%uCtALT+83IHN@u-myD%eNQ_?tpBYR0 z)7aBm8#Q=tC+Fx#^KrF~%E(kA?l$gyCZVlEODD9u7@JCHJ)GYyXm;;6V7vUa<2%cK zg&2F*J6H$r*l+GfchvGe>eb-4cj__b$#-G-6Yz?|_rc5H_Rem@o<@$6qwT;h0P}!- z3)I}Vu?x<3WZ%#(=2^#ExBL-&8_;-P`mpcEwkJJf*VJA-PuJd7tFb<@^&XD15Bh)I I{?Cj01z-WA0RR91 literal 0 HcmV?d00001 diff --git a/data/map/policier.pcx b/data/map/policier.pcx deleted file mode 100644 index 58df9028c88937106758c4685d97556bbff5d3c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2336 zcmeH}-Ez}F427i&W*CNt;!)sb=zFd6Yf=YjNK1gUKwBt+@bz&!E+G($o ziM-O;Bgw1PZgTIA-!(pu?V&yJp474|Cl&&uzLQ`fDgu)-t)`~;Vf&7`?bsuE-r_?< z>mz!S(o1hU8PQsPX8T+HhIKgf(u%5XO}+G0QRZmEM7KB*fQ%Yg3;l_=>;>ZiqOBZy+r|xhfUO*h?ai@YH|!q%hYh>Uyz(lB;wwF+U-TYF=$-4es2#u@=emJBiP6PP=#R zh0T`MndkO!{6xl0P-z<1-35R3aA1he(4~TNqiQ1=1c)HBoGBcCqB^=e=G$qO`Ti5_~XLg UmxKf^_A9|L@suJ(!ysU=e=hRDsQ>@~ diff --git a/data/map/portable.bmp b/data/map/portable.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e5212a48b01a4c49034a2a112751d7c9f0574aee GIT binary patch literal 6192 zcmeI0ze)o^5XNWlJaU)B#2nH1FCqa+p(0*wlg3IxYYYFLSlim#*rdJ}@ENSFd;`H( zu(m$;E)y)wE}yWG1#iihyKH_;_GWj!fea3JJ5-EEkLX_AZ86cSx-wOih@K*%-p)wH zL_SH`_*Hxu9Gu(@Uq1WC&)s(S;e+Eij*=wVRPxg_4feygnf~c;FNeoN{oId{Wh!nt z$_$hl_;(q|Xj?tA?%ktzK2qP?yJp;DzlivK*Wy`P(CAj^CI{5g=th_ZSE;E{BFr4u zNvCUJ>fE53MpwUJYCKP&Mwb!?VX7QaMWYLegD@et$=B#y;<&~Hyhxr#XR_v!nVcir z`El)RAnQTu0%1&bx*{HlFeYzVl{g5a^RRq=P2!mRuq%woSJ#Cx`SXS_w)@1i;vvt1 zLVRlbIDBZHMaBP+Sx$XgVY7WAa#l` zh;JYa;$w&(BEE|F^R#+{t+>cDAh|$titG)t#|VR*IfOxK0AY}tbd4$d$KUi1B+ss$ m4P-q?T_6lnrwD`i2ErgdhWH`ktB60_>IGOF-T!Z+dEzfx4F|;l literal 0 HcmV?d00001 diff --git a/data/map/portable.pcx b/data/map/portable.pcx deleted file mode 100644 index 6a0bf5665464886a8208a63c4f547ff315c1cc80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6363 zcmeI0+fKqj5QgW!FfqnAk@tTBL^%m!JfjBB@ya(C%d!nO-Sr~@t=Kjbw&d${J3I4F zx_dj?wcPk_T8v$uK9TVhz&P6q-pVRFjgdJKN*#^e;(H4AfYnCfo0 z?)cO#H^_WQT@WT$r>^IahlI)LhU+ExAxuukT(7}TP7hsgfywEr>pd_zeRh2WX3>?( gCs$pS-;$+KieA{HF+f0g#jSJpcdz diff --git a/data/map/sgdb.bmp b/data/map/sgdb.bmp new file mode 100644 index 0000000000000000000000000000000000000000..777b01c7e2800c83399b1db2c6c0da52df50bbf3 GIT binary patch literal 5888 zcmeHLO>Yx15Vbd(>~6lBG$ajaTA-Ac?-HqifJ+5b91tHuLP8u-FB}m)^#Xzm66(1U ze}MxM2X09H6Z{CyoXdN=Yt?b=w2h#ENYs(nZ=PqyV~^L{mAj%T;@>-8hz&e_f_#NY z5kiDmuL-fdB*b<%2C2YrNBzZ}mDPtYHn)E)JowUWbl-lLyPFOjT%aM$EI{7|-$E804kj{a-# zZ`vb10sJ;vGp+zQ&!<(Zt^i#iu3K~w@Bq?+)MX@ij+wTbz^3=mACEcqu|=$}CneU5 zcKSJa#7*HoYQhKO^w2L_xFIl}Gr6=aq2(AK^UlQ*4A>9hHw($7Eyv7)n}_%qYsM3R zNAc5^am>c?WWg9$Ht!lzYJ;Zlivlm3Ymv5-L{I|1J3+$9*m#wof>42pX5h^ zM?Tk*`QjL!z1&kL@vQq`?#bnRnRl)Ob216(Aby=&28Vg%es*#4u^rsu(K1HG8}!Tg zB-TMsDzQgU5kiX%a#72^XCe9D$RG%B;D9Bu2ep?P6ZMoKrwRAMr`|%z)W%ywY ztNmo#e~I3`KdEP}@}0>&UqGL^(dVK#KH|64QKI)SHni5H(swNNv9~S|*BtTK@F$3& zAgg_6tPNX7EWD%foMQ~Xy5GgwchB%aOya#(fJCx^e20B8a35qL`{S^lJTU_)8GcwB ztkr*2zncg59L5~?8sEX%C;P~rzdxJ?{ZLuUz8`sBPX6 z8sIS>dYvdA>aI{n4VfH0PZ4bKolwIW85y?vdAw64_bSGw`?T}C_)P8RCHE%!Nozu3TcOWgif7|JqHacd0H~+2udF1L%`mHgC{qx%L zd;)v;Rf_A+ZH&!9SC!AvCf`1M5A(h{pioxvuz%)NH5Z?vE~Ye&&XJr2%jT7 zSE+R!J8|rx)ZiK8dmime0<@-}UGT38cu!iU1&i>9)rWO} z89%_X8e#6nxm{(>Jz<&A$}reutX$u4{SddQj`VUOt&}kyU|%p&(?CrX$`MV>k-}eQ z=|Bnh63s6$b?Le-R=3umtAWCerp!2jrHxWoRh?im@|IP$Cg2|;;vBwxFkS{dYKvRw za~OE)^J0^w2gVMzE*>nLHoGVj^dKsdXgq@VF3MOVU}$(ku~YjfTogeoK0t+0&~10} zRJuokgV4#-DSbg+aROutX3_~1)X*v94o`ntq;W!C6A^f;A&*O*-5fmaY-#hJj>Y)p&h z6B4DLAw;{*kR05u-%%i9f6Ua5F7=gN)T1#9&heXM-@;mLXnCyEs= zARjHoJ^@K&j&aCao}gB3xx_T$f_PK%`Lz}*D7SGF=+uo~u{9m_@8!HZhT47)&NGbL zgVuIx<911X*+_eBseOj=Ybkd6Y-+1&lQA`|#7EG{Gq0$VwtZ;i8^$^|?j=iH7v`*0 mD<458eBoO1bz*+)g|El?Uw7`W{nJwMx1!tnZ3h0~415O}*DWsq diff --git a/data/map/sol.bmp b/data/map/sol.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c15c28160588b5cc60cb33006bcc9e97f053c4d5 GIT binary patch literal 3084 zcmeH}yKWOv5Qb;$y?b}P7u!il;@A;HX(19F1rZVz1=Q4e0a_{~8k*Fpc?s&gL>_{g zI{g2fa~zBufh9V!%4)tdJ9}n!F2^~4QmdUV8Tjuq@Cskddn&n}K=v}$W5`ZgU7GCm2(p!_@+fL$riYM??COEZJ>55% zX(A)fsTPuXPPCMC#g!y0t|eaaSfW30sDDRy+^rMy5#u>^IsA#lrc1F$q>i1gg5K$JtzgGJ>y@rR-0Qjo`)#9h zF((#Fc$d1y;)u{QZom6=?mO1)w$)|!ZS>Ki7Y63reXrA{R>P1Nrz=;v8=~J@^cnTc zH`g8J!0`w?u{uSt>7=uIl4rPC=SWJcALk?nPvD=NfP2p=xbvKW8$TO4cw&fbV8s4q3PsnEl4*4&^u12is9TzrRF18%ZTC=8{UG~EfdTogF+_5_o7XCa~ X;4J81v&6a1-h7N)v%kY{E~V&C_Wni! literal 0 HcmV?d00001 diff --git a/data/map/sol.pcx b/data/map/sol.pcx deleted file mode 100644 index 99dd30096ecb158704bfa3af93e5e3655517ef25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2496 zcmeH|>u%FP5JqRDA|b>>wXX_qlGt85zB@_dq@_3DIl`IQIM5)fRQ-k2NLiizygR#d zvp;>%kHYU#zR0EKa&d97-|tO1^QTv$awT8STznfZX0);OTFZW z9p_V_iQlj1w0~2_?c>w)>F?XOoDt*Fa?=>AiBj@VxMq}lbSHWs;9 znbQ)=od&3IvQ#ddtmsOo8q<|i1=UUqO1!}`CqS)J4s}ie8dx`qwZhUVg;q`pv_4RY zlO;h)7zf&_k-3w#)|?v*-d;vM`kdQU=moQipcdRP&Vphv^{ho9!*Ns09aHRL2};JA zQ^lNrzUC#xteTzQYfhDxgvPTxten{JpC5N6uT)apFT}jF>NY#kFH;&SAu3j}=AEU* zPLJWS3f=h3syFcb`Z&v(St88$ibMvV&6v?oj7#2jyqTaLYQ(yy;VsvTbyS5mNGo@w zwUb-+cCsbqy(}#mqx^isxFLjAo1?5aKGHx1oKjC{tX@YBw^odlQIRiEtlW+>YW}u2 zv)~-8So52fljPFL-0EbcdwS||$GFxT8F2KLvDZ7XP~CfPeLsFOKEL{Vb@~B%pT9@o HKaRjJ(3Oe8 diff --git a/data/map/spagueti.bmp b/data/map/spagueti.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6aaad06f33edfda0766b57949b81ec61af9c3364 GIT binary patch literal 5972 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 literal 0 HcmV?d00001 diff --git a/data/map/spagueti.pcx b/data/map/spagueti.pcx deleted file mode 100644 index 58a4123b564124286c0c18ac4e244e10045740dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5585 zcmeI0*>YRC6-9xERHah+sC;zt1C}{n&a)(nq9tqaY*}s(?Y3{$Iv{Dao}9;2wN#fE zz}`4GI1@nr<8S%ziN7D|-|1huZL_XxU%&X5>y%TS{_~6U$F!Qc{vYk$ztZ}VCaikL zjPGed>n*LXX-(@jtu)BDX`A1scD{$O%A0hRUo!eGeM_6XOfU0wnlth>)%hl$r&Ic$ zX}`*+={!GApJ>0&^YlDFOTW?nm`CXaQf$}xT|V2j?%;n+CwY)A^9pQ~kJCN<39Fpb z@3Yn&YRy>TIsFQmZ$pDszKQ-c4byjKE%J-#kJBLi$c@y=Jv3~lSstT*BfUn0K1eh5 zKqicwG8l{W?10R2 zE0C+);VsgOIgPYrUZ3ZNxhweFKvt}#rhD`j^c1P*fzISxEPI$hXBco!TyH(~A=MM;98Cpg3h-X6BxKe|+finPo#>keD6`^JTiOyjXB=oje zRCEdJh!tjxX_FCwI*b*xd6l1rrN2Xw7WBJVX-xl^eh*)b z`IOZHX$MPP4A3!eecUC9Cc)AUy$7t(E{qMN4oUZr<%&)A(;#pS=@zSN(M_6$EG?!i zJ?h@(um-f9(IF*g?5(wnFJ%s{>;|@0^UO^OGG`;?3DZunqpJ^V7h(sl~hs$t!g2L^M4imFwID zH;Nkv+#+L?91*Q`?gUC4o&PD4n`ko_u7E#t@d;@<#Mhs$nPD>lr z`JB%oGt2lg7!AhF;xQ3Z#v|KUV}ZOscw62^M8^uvsRfLf3tyQt$2Q|YwqczHI?U1+ zkXJP*`?>J&6__YDr#O?*PZiv1ogU6xq1wB#i=JSd6 z9lPK#pjS|B`Dc_WhemtUH9cgU`+-W*iwL`<*94L2j(($mkJZdXYg0kZFmpuoBeBv! zi-H9L=THVk8L&ls@2hvdG>9HE`L-X_lW ztOhn*z#1j>*3;z_=rYeLb5DPO{boefo>BCu7_nM?;L#>}clv-;5$)zdKO(=d%ye0U zkmV6RWo{L9_6`}^%4#uXRhNi8 z{B)R)&vx=FE?NUntx&wIgzipykE$>V)N{kCVx-8ZqSeB_FUWRt)w9QXAu2o@%~WksA?b*@o@^I!(%OE)swccl z#>#pDcS=^=Aldq%O$wt_n?0k26-$+9qt^*cZy05zm%Ek`Wew5p*7k=C_iuG6nPE*h zMZXe3>hTi9omvfxUt3hg{R*!bb?;VO>ypv=>Je()^Yki}>L;ocPk7M|sGbtl9#yPi zethOJYTS|gajc-`#u2*SVLJ#q=pjM12Y{9yuc@XE2PlGFN@R3E1_m7AtP}f`2@6^i z7kF8!Kt|xow;X(6#Bw9*Exv+NE>|<=S`am{Xhpw*GeQ%u1r?#KF1O6?G6%^7hu8wm zECe0_q8*A;K}{X+<71@g=xh2NLp+?>h<)pjDSBCW2VtN#yRP6_{f#OPwRDh`}=zQM*1QTd`q&<0DHaOa1)GbGNK@0I(&5$&UUC4>a(8fw?WS$ za@GfQxkG25TP(ZaeHy5#Po5Z_DrYsXv*y~v6(Ze=HP-s9p-y6|x4|XY1eMLef*l9u zsiKi|m`nJ@xeZ%GxW+o<^)SjFTO6>nkXP;_bvEP0OfWaDjspzmSyNI+%)8zNYtG_k z>zOlSPKz6&$#o33d{-ROujTf>u-7Ty54TA2F8dyN+!l~LB5B5qeWE`Oc{e0ao$u*S zLodVAA0y`6Gbgm4#qQpq`wI83vBn1ch6Ft&(9V&$rGLiRvEgoXiB^~C8^4%5Nj3XE z<_C%|^q$f)jIKF@9k03jP4g`!!0{U0M)?&xcD#;ngKyBZW)F4TPVYE(WciEEkloa1 zZ+pZZW!RpwcFj%K_JXziw7p`bn)|fvGrU-%xo!V{{nw#?@&nWV_5;@AU!?x(|7C&y HV+;HjcqX9k diff --git a/data/map/strike.bmp b/data/map/strike.bmp new file mode 100644 index 0000000000000000000000000000000000000000..cdccbd7d428bd2a146ba7bf33d2fcce02b951877 GIT binary patch literal 3904 zcmeH}NmFD+5XUoVwx%1pS-P9vn`YmaW*Y`(ScU;402xF=V6a7u1W!D6g=1dU$EHRdGg82tG`E%FH5P?i@&s1t975BpAYdiUtC;7*V_Jw zj68igXN>*BaW|gpYy93lcMRMy@V{f=S~j@z&A(0Zr*_MxHlb~jFSRK5H7%+t4;=PF z`(;^kvg+1f=&&qcx8l~H>$udkjE(j2nNG?qdluaK5MR?e%R7jjwK>!l8PS?d>Ik+T zi%Xv_$+(VTYq1S&kT&AW={*_M37K;ELv5B8V(QlW_?g6ywO`YyG!a`;*JMa%@MZB8 zVo;4qqZZITltJPd3w0e50Z-_L^b^yl!#Dh|g;Z zyezQ*U*-&Zb}htrq|7}A96lHDT;_gzQsf@}4xiNwekv0E7e1}o0B_ZO$?F5Svi_&w z!PvLx0r)DhT6|LT;C<2zUVx8^!zV)g2z)if$Kk-*9}&+gv06W4@M-WSJr3}a!$;vj zwF;-lQX>AwfMb=+E&8&qU>lPzryGGMvp1qAoU=nt>{-JOZv?M^CmcS+{p?vM-0!h; zIDC+}te;c(*d-^{&j7xa8f?&0c-gM=Q0~9qR4gKKkGkZrUZKonc+&gE*>z zZU#K1i5t3BYHo&}&oD!JTz>pMqnjp{0_UcjF3oIG;%%S?qv)r&ho5CV%&G`@8@(~5 zy&>Ki#63Z;RN&6&vYcsaC&?UZ3FgN!^DH0Ez$Cs}gE@4B{VO~H9=!$cU>?Wl*#vz* zMeh78Z3k~>e-eBsh{JHG#9747#?Y>#?90)o`}EmZh{wT`!Mxq0FDL78Q@_d_?u9cm z$7bqu{cza}Upw$-=D$57MsH@}DntL}s8xTqiMart1@C39diywc$b;wU%Zx6Ec#ON} zn4v}Hc7|T?_Qp>ZUW@cun%?pJ8b4X?P-GSw+~+C|CpmC4!&1C+As2b#$Okh!MQ?iC z*k^ewe5-oE=R^A}ehSQ?8h%#8?_UQTWQnN?2gd)Bv+v+eIq(7aOzRvxntHN1@!!@2 zHJ8U`kldy5yW#dGsrv%>Fm;`VLyvb-zeQpgrMG+Q@UFmboR|wT!9K&g|K_Kt_dc-c zfa68ka%W`NGlKm*y=1;~9$$y6=d2$&yA8O0#(LYWH@R>9dW#&r3s;Yw{^q&|`z6_N z`fd8t_}_KwUCw`w-mmwF_kHxQIlcLP@d5YQck6F;K9n!v{J`Ot)aId+ztibDc~V|? z`1kO9?BpNl?UPU*mN%UIBQyR@C;vn(pM`Qo-g5HK)aKhx{)Jk38p^%$j+1{Sx6hpX q8+m&#loN99UBjm$ae%DjvPAtFaIdUr@Pm!Ck{HmA8^;mwU4*eS%Q~};%2Xq{BgcWm8HZc!W2k+(){gWNysn}pEF+nt z?Yh0EoyURJr4PT*u^c*{a=fMuiLgEAsM-l$<-YXb6OO2@E7J1z6;|xRPdTc#-ioG# zHO2RDg>4?89O+V8`XY~Ri834Qvh!`bVtT*Nvk$fgY1X+tHMCh<+U+M{LuIxRDI}DR7Gt z!H?iMGJ1&l2-d;UxE0v9W{I+P*nJCLz;hYLpHQ6!nkJe(*1w58E~G~G4aWzR(?=@n zg;e2nc!^5RVty%QDpP}3R^gm1>8evND7W8WRp(Nqjmz*Fw!Oe>@WK!I zmE`q=SR1L!RcwF2a&yV(AZQkp*q62mPwPf!`oez~&>J(8%bK23pX-#6yv0uk~J#*2#!-;ayw!!YXmmcp}-*WB!G&}J@Qf}!R zddFK2d=QTpG^NKw#yYV*p5x<#?BE$Vn2)fH&8P5mP>d-93QN7sz_E_=B^rNt{6sOq zBNseQeJD$*En}xByTVPl2k877LlnhuK4)Cra12e_Y9sk@)aTsxSTR6Rpo#1Zre0y8 znhYdU_&aq$-vp03inZ`X_8+kwjZLeJb*cX#&gf2(v&&|q_?2m9t6XxjV7s6-hff@y z(|IwDu=XEnYsi2r+^n~N7Yq#cXAMxHhhEvB#lGftg00U=;CDu_;U%{jY+Y#+>4gFs zzGXhLW$WW4UeOd`AQaqO_RosD51b>5C%zOGJg+seyYFP~X zVx`zkgE9R~+c3+4Vofu8 zS5)XJEW6PxoqbQ5AFtXx9#5qB8r$rlf3b?od(7;~)*x~FWN%;9Uwupe$;15LJ^Vkv N&0YQkRG$AnwghWI^gorOG9g+)5proLop-JtA z-$9)}!H=MZ*1TE!?773(LQaQQewvxLvpX}pd%NB{{xnOreKABIp}hmX0!$7-^vfaI zyi0W9SyDRCI{wcZdk4?npI`i}pM3L5-sd0OXfz6~R;voc+U>Txo%kN9pPg@rv)>Rd z(2OzE>0sVzo36lg1^&Ag_<)Kv&M40@aHn+D$^)udxkU{t?@-gq3LRNFPcN-Z(it<~WV9X}Y4g0%s`;loXfY zJQabQ;!<3sIUudL1ndPMr8t)hTwCw)Cer#Qb|K1$DV?tT3QVsv$b?`@!8)|%>hcJW;m`?(srk9Y-TH<4pr**ok8 zzL9Zuczk$%iM1BWA%`_;s+d`v)147^2IqZS^-pS#ixlr_4?ifzpDCHQCm&f zb<|cJVb@UGit7JYd))lte8TzaTC`rodDVMTKwWwd@~G>c$~%WTwno@l+--6nmz9rj z5=Yj7~#AnUQ@kElfG}0j$cGB6`+c|h>U&P68K(Xs73Cpl|CP} zZ-c@6CwJR&k6(l?Z$=dUn)iCV%prGtrRRSgx`R7FczGKJeAM2-zW;A6`0dLJd9EF4G#bVjB3u6SKvWLo<(BH}YDTW4qC|{-(L};{ zsZHtYD><>~LJMh;(?e-%Zw)=fOd9DXRyUCx<0*Oj?5xnjqwm0VS15Jglb5&JlDck% zCO}*8!P#9}-36YN1=@A!e1*0&vwojh-4m>Kx_N{qlG(U2Yx{%Mog@Aw=%ba^v-7Xz zv9?hmR)qN(;k4X<>shHpj8kyTvqOfc))7`PyZ0djRFPJL&SvE3j^*pfYLMv1FFzOi z$enKeoYB`Cd7i)vKXZX7&%N{s)>#V|Pb{4yURKS`Z7;=EVkzD|_N?yz2>YTke)l1~ zHeMRQ>kxM=_2G4>;zOm_W-P_N(9_R2=VR}kQCtYZE^$UvDZO;7T^VjA#p~`EZLaOP zx%Ty(?#>@05C+jg?x!_=f^$clw`Yv-$fw{-REa!m#VnEUg6I9hpQ2@qk`2`*XSBc$ z0b}uAFhZXGr7^5N90H#qqxcF*%jfg?z)o&;EdU)jQ@J2PH3uyrg9%ee087M?iK$?K)i}R2xND zpa(kk$V_us&F#z6=`3(03s7jnrzms}#MhY9xxc0}|3dh?*HMmh#24fgBfVW>Wc1%L pCUPxTcp6+4He(}Wd1J@9?G@DrL^VF!`737qv*b~J%)oz~f!`zda6AA2 diff --git a/data/map/tipi.bmp b/data/map/tipi.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e6c0aad826ab6b7df30cc51def8ff5ff0429eb86 GIT binary patch literal 5232 zcmeH~yHgxT5Qk^j`uv7UpTY36y4cLAZuH)zQ^wb?G1OA@sH{6AL#=*uNzklR^ovS+LzWI4mf&XO% zj*1?FzU{0T$8LyKJ{f+N%VE; zZb+W`{#-w=F+6(iZ~97y?Rv|WxlKQq#~F}rQZg>VPTVcc9g6V=l+#4CU(*%e8?ui? zdqv~a&ir-R$D(~Ov0v5woTMpxE!wLZvmWAKkzntaZP^dVZ>Z&vbTDHQm|01`>+3l;B0b!w1a3w$=xZ7;bujo^ ziOh(Ysu;_Q`Q``aoTM(M*I#gbF(>9z1K4E=%#?3veW3=}@j*^zpYhA`6YR`IuwRle ze_H;}MZ2xn?9;MO$i5KmR$pqv{Iim(UsVl*f3q|HVs771j9{k+$dUPGAM_Vprgct6 zhCX9`Fc%~tM$MH~_dapf6UH^gOi70Pkb0S(tmpMOBR#&>B;1dvPshZJ`|-SYnM=Nn z$Sle}V78Hl6>$5N1kx=iibYsSU+4v0!Po@le~%-TYV#1YlwcHjph9M>#ecF5lM{gKMpOqxDajo<&{&;r6VPBWOBF8x(CLH^Ozx8-c z{Vhoc*DrxHfAB?)eX_pZP|PC3*@fW@Q3n|6lKSEKK}})kr_Gk1tSdwR;Ac}ZE-sT; z9e9@E8^-*ESZ(Gl*;rR!FMV8Ku4s%OgnaN- zWUfX#X9os9pGeYJDMOuM9u=5t8sh_jp)YPps7dPUy2dc{FC6=QTT)jox^b}d{&pAU zhIHl&=C*uLGkjZ}R^u2QJ-^+BX-H3O82WfeLf)w#7{+kyF}1%VA@7u1lMV)<-f+7T zxTSb*ni^xzB>!f3=Y(gnF>urpKYJ3^XUw|p%?}Lwyr(!kbB)=MjyMPm^|~9GvaZ&{ z^mUH}jy-|fmk_V7z`?*4IdU|A>?sUq9$)t)_(~b}6b2nNd`Cj=FJoBiyIq)D-s?Lg ztPkeB787DyKJ+3CIg|f=3Fn6ViVQmZz;M=6hIM(xLx-OSU6^g{A+cD~L&=zY5ZB`D zXpEg0oX1XkIk%09W#4S>9ldji%NY%}_VayLak1h1BMILERf#?SgT17jGW9U;<@S4P zua$F2`Jl(%w$U$M!kO>1^|kcGA)dWg_m$^k@tyjTdm=sW!!~QWOlLIo|Gut)OLh1R z?^5IL>RtUvI`)Gzb~eu6)AulSAm^fOSKkZh`^9t4Z4T$z$9dE@*fYInLQXsv@X7Zx zeaqg_tCR9mWccQVHHL2(W9WNqS@c7X;3sA5{MddHk39`sCN|_mU&FkLdpk1pT!`J{ zKGZ$_c#oRDlp`j7KadnT-bvUv+xWxp`;sEJ6>V_lugzuoH*t}}--Fy=o8$cBC$;m; zwr^|f^bL8W`omnuo`>4~pnVHmr;c|;n+rYEP1neM1?F|f&lQ`#oYu3%a&PO}v7d{n jh-EF7&yR)i3)xcpe;H57r}=-O`!mTn{9oSwZ}0p+3Crbe literal 0 HcmV?d00001 diff --git a/data/map/tipi.pcx b/data/map/tipi.pcx deleted file mode 100644 index 30872b293d6c7009bb14a76a825dbc256fa15aa2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4906 zcmeI0*>W2<5JiE9RHah+sQg^=VW3u$q88GM#7NX)OHRCMmlI2#+=E6F9Fb09R~~H> z>n*1m_jzbLN@C!Y^ z;-3`t|1iJvsbM4k_oK$m*XOYlepP!mV@Y9e&O(ni^W~N^skVD@*Ii)kgmrnwtugn- znKkUnVc~;dy!@Xm?IFh+a!tyMtprq;eH*q-iq-o@MlG;)xn1S_m;=cG6 zb8L^T!Bei2^}0o`avx;Dhn`+GY{imtfF=D??_l@|&*XZ#BD_7dd2WjJ=dizu4;j5s zY~qIAQ6uY2?PKx%3-%yPuTESlN(0@QlEs$7qajI%u9~>{Iby2e#IB-YekpuHW5xP! z<^F85dz;vm?)KEqhSRHw-UlBWI#M6^rMQ}VSq9H~I&oQ^9kEC1L!zO@94&E<z2z7yy(N2Z>U-3JTAs2;=1bvF*X*+*^)$x4Ed%Ln?gxTRVOfo!p1R4mnD@xW zX1CY@K23nc)eD1#K$sCGKO=FIxm*gk5l__^4AJI6+DyUiv zJJ(GL*98Id!$ycj)<#hA6QpSoSGq%h)+RdPOg4K+uyzoBc2MoqBld}!Q4mJRR|qHwGJ!Z4+2U{l4bBwyf_-jNZ)HJ)2F3D` zy+mBK-sp~XcZ#Fh%6u`iBfl}!Wo2IL4jmc{>ujfNWnRff*1=E@rbCgo8P{Ru(BTmU zU#UNI=Ss{6>RxNa$d&qCcUU0U)w?O-nfg*zlp%AuANM4272(YE#c;VXvXcQrGhRvZzlB zg&q_d*BbHj6#49w?U|p|C-N{N4T?3tl2)5KmX#f6MDm(-zfyxDlkMD}rLdr7XI5o+ z9-_o}Fen{sJnWUCR>%t|<_tB_Qw4jQLW>5)P9Ex+jP9~DiPSu3IYqu4#PvMeO3{ZL zVMJoN);9w7iP|z9-XYL|xDmlOoy7!eaVvt+D!~e)K|B!mBA6RzD>mCtR@DhcI2LuP z-x-Wti3{D~J<(hyu~)pFrqvgzg?D5G_e?MIru*>7}znQe?<>ea@`c2Hksh8dvCL#&B@=Rdxm z{xIja{uljaK=4=mJ>XlHZ!5qGr2J9_>0+GU2fTOXl2IRK)P;bR{H|-`cexO&v{ohg ZpRn|YEVCpX7XN76l^#QwnrEd2+T4-~b0&B6r>msrKZAE0YDE{tE_)91{cAqy;*GRc|Sr@!t#-F^D>xwCTW z`6np)Tn~s|0QEPe>7QHJNMjr{m<&zyQSXJwLiF4 ztMy#HdbNTPZftC%movZm)ywNMB5Xfc?xD}-<|ftY0j$?CHkC58%nc@#{Qc&>iP}kY zAAcTa;D4EcI--^#M?jtr^!bZE>7K#xaG1~{`?Ee}ZuRdQ`W^)2)ZN3MIhE!FTD~B4 z7{o&D{bq;Apb$;S)G@|s6JU}~?{(*N>m(t(! z3}ux5j;E2JaBQ2HCtS*5=Q-Kq3l(ALgZpu3g-CFpHR-vQmD^cS$-tMuofb4q^( zdb`q}g3c>_kbCJe<^`QEbAc|wUQy?Zi0K*3ZCrD_i=M{3Pw`nU(|OGMbw0xtI)`~l z=TlszvzQO)e1ga54CaG6??o=Vp~IY@r@-Io_$lP0LO$lF!5>n7j?>h}!xXX)%%?SA zyA<2b8A?LOV~+w1!H)qiE1u^z@WrO+dXNj~C}IymTYvN10bd3o$CLmbVywc3tY>8k zJdXWL08h|Lgn2HWlhE@KQvmF+Vm78CY9fS>f*(@M##MxG9+!aUXuo1Mt|D|2+z*?1 zS^}1UFE*wk@{!_sT2%h9##)H-G^>2i)o7kmsI3~!NAezQc`oO9PNI$`W0>!-?Z9$~ zJFaK_%K@?<*U&)ifJXb&KEqoiptyn&!9<2X2V|=k^eZSGdw|>9V#P_JG@mz1= zk1GG|SY9N)G3CG268CQ9zuCecSN=7}mt1(XNBM8G@MR6#uU-cxIk!2I_$>As>LiJM zYsNjYe!t5@Zm&fz?)&W)Ol(;HZ}ZNWp45s@Hiq?wFpnlQj&+<#Swn2eQ^urXx3<8h z95$eOCNH8lt=LV}p0U}$WNv-EiSro8&DxDvZfuD+a(^Q_vnIb1r{r0lHl{1^V=U?; z+gzUGayGszIR6vet@A&dgmSJ{iA)=x#Zn zGKYB%`Q)aY%iSP%)IpUw$a~Qz8v7cccOO!08NFRFS=ZQ4<6bdw>;pF1gk>DI1Z)hL z+;h?o0&aIUecVGCUZ6DkYlp+L&L6>3ya<^B-c^jgkGe_Xu1xCMv%sf-Nq&9w;xLBQ zct7gZ_$=!)bZtJSc~vp-t&5h`-W0DPPd110>~eXYyx3p7QR# z1NUn)mWW|f&Yr{&Vt-y$y&_Klv+IeksTejMVa8X%+MLZI-ecqIB~c&N7kL*ln8{fZ zxwKe;ML;e(NFS=-{`m(|bXz7wpm zb^<*hOE0PYJoiOD#qoCNH}IlcKMfu6CEJAOTkvEHo^$IP{WS0_z3A5OiLEd3$vNzZ z?#q)-rdwqK_%1SX20PG)LwZtW3gFp1$vP>V`z-cuvPq^rl94;d$OPyi=8R9HR!=xv z@_ub{X65{7&5&xSmE%q>>HL!4dPYa=C2)_V(Pu)}PYRLW=J$h%L25x{eVW4vK-=C^ zz}(mh(7%k`OeE{UuGmPqUQ@Sg@fFY>Fy&zt+x{UI$j%d#B1D8eWI#*vG(L8UczJhbyW*z)egy}Q5I^9w() zsJ|GlYN0LseG`oRKW~rVBYoZXzK$eTd9RXFl_!;)tGw;yp>$N?CO0OpPS}U^P=_3af1}vx?dFOxm>ZV?^hbT5{JgSIUxdhSIN`voJW^vim;AS*zS?X{cT0T)}QB zOlahWGQe0&ow=SPutF#4-Q&YKUvl`#aabhQf4qRF3;0&UheWyEx&D)Cd`=suqwR~t za(`Dn2EnTr|B6~n$MUET%eQ251#2u;DwwMEGGqu0p z&>ljYLmNA4dzup4T!^&Y*@E^6+KxL#rLJh|ZPJdFYg(>VOZbUuPrxm7iZ#=xP_|%z zyHuN0gm$L76XdACW4q7=bUE^tW50>r5{$em_fqvo&_{y57#m*CJuCDbP=+pRKq*wxmW$0!WZ-BMj0rU)<{n84%1!k2(eGI*McPFn}KlF_j0ocBAFEe+e zCJ3w|v$vQZ1{uo*9Gb!3k#6dlH<-^cI`V{lVC0s8l9A}1!2ZuD(R1w+5SA1ak$VAj zrsUYiz|+Vk;SJd79Hv>|SjB#7+#5@#Xxg3bkN5E60oU4YTmXgRBHr|l4z~MF% z`E-<$$sSG(a(KoB4%@NMe<>|+riurSeUkHnJ{+q9&J9Yso}<8JYK+sB-8qgW(8ip3 zP65s_?D8B8wwk;r&+E&Mub1po-lOMzlWpt>8S)Z%VGb{jnX?h%su?}`$OzGt(!;#6PslCXT!=P){}Z&1 zu#egb@F+ItFqtdYx7zAytaVSIv25dm0(-U<*>>w>yQktWn-i`(L(MG zjWPQH&47~6xeI-3G+#jL*=SXW%~KssdjY8<>3AgMr;eg4(?$lG-Y+j8+=nc#Vh)M1 zA_KCrfE-mwuYoYy!wTsuVwFjRdpXBh!6)`Jx>tky9!ya9ufW*B5*WK(#n$z}9${Mv z>9sTkG{spt!DYQh&HVwkfNf0YVZ2n%g`@Iq?%YJFC?@ps!#M@5c$jozbjlIh7 zU?GEd9gBAf@G-30VH<(RgXLD|&Nv(JDhG$h6K9j$QgYa_m_e{svHC2SD>(;^HD>|bU}E{!HgywqcZx2htU)%{?okq@e1mLniw|-D zc^&eW@@FWfQU;Li?ePuAKhJ_GrpW4e9r8B94R4dB+(EKiBlq8XNZ~!Qlm|!y-xDW1 zr1eT-$*fh<6C``vq!pG&zrt7&ybjuWeSyT)WD<*l@0cdNLE?4Aq!Q!VD;8~Pk=Wav zi4iKOHp^O=_^=JK4EM_)p)Kfc%B;NPc$tnE_@X z(mzxX8e{!m@P7vol=v_u8X#o)A8q3g*Z>!6t>Zf3Ydw6qXPOB2(0^49V2?wXH3%>m GxxWEKW@)DY diff --git a/data/map/trumpet.bmp b/data/map/trumpet.bmp new file mode 100644 index 0000000000000000000000000000000000000000..82bb262f0e9f3b51bc57817c34af2b1527356dc6 GIT binary patch literal 3568 zcmeHJ&u>&!6#mZb{OaqpzG*wt!D$CdX*-=MR9m5nu|Nw#AcR1|f&{jc5F%huiH5Bk zH@NM>#FYydCN7L7#>DgwaA9IJM&r_jEJz43MB?+i=e;-YPA@FGvM+se&-=c6&OPVc zbI>M=c62Ok5XHJPdExne1YyDaO7oRtEr$R_(bWSeypFqbm#uoDCo#R{B+}s>|Blvlsb@l$Tot!>g&U>PWc6XoM4D4p$f0uy>2O0Cu{oX?; zrR2TMm3I333O<$%u5%fivc~ZeK9!>!FW@s-<#-;S%VCb^@P({!Jc}=dZ5C(nl`L^Q zjj!bp$5Z%L7CD~8chcdwf$wF3<2tsarDI+8JF#`plzHMOP?K2)UqVCXh#$uo^|M?o zV-M#6$1qC!8GaZOa)9^@uJ`h`imGDMxY5I2!??_F-d?=b!;TW$PppZX2{y+y#$}q= z6mBJ0i`eKktWEo)vXAp7QIa~!@=DLAj&ggIE65%UJKQ3)ySXm7I(h|igHHX0a*}l$uT`X90nc=r8_QKRw}!Q5 zxn+mjpq|aUQU3z=fJ`srhUj~s`AU1(I?r*eXU|AkbDVM~$l3Zb7@;3!Iq2B5Top$0 z%7^r2xbNH_=Q+*z3i*+~esN6sfkb~yV{!Y;8hb<)DPN<{eHx`RZVXXDy#_k(9V2x!zZi`EtJ|dtOFT z;Q3E;5=mY=r9mV)?WI;4&~9rbqy5)PwjUe(tNq#FDdVu;|7ia;BW2k29LGh z8$4p|*m)22J}`Ko_k+QodS4jy$7Js+gC#lV#2I4?a?!(P<+6uO%M}lsl4~B;kS;Sa z&bP+*Jzcjh*FCHzH#}@iZhBZnZhKfLZ+qB?-0`royz5~@^l7_)f!y`5lDzL>Mft$P z3i6KTpdv+{&s!RAp6l9raOMdDNBL6etZIYV#(!IcFR73CCBQ9z?^{_Z_6%NWbtq+*p? z)OLS=&+JTh@9cj1z#j>JU-%n+<)WBD5Xj|~f4sv?JN*5X;oD&Wh5r}PHK4a-Wr*Vq zOz9;jlf+FBm-d`Q8$-(`-YD``@N45IF&Qf2 zdT-G(=-Q$c(3M52pi7I^KyNJSf?iuxc5`LXCg|LvZP1xTJ#j7_?#0IcU|QE6}V(1D5{@H1q(4-kcv2d%^3(Ub56Fj9K#{vG4gR zu^(9W5XL<5&%_RRX4n~)o(rP_c38SB_Huk~czHfEyaEpmugIr{SK>ap*fB_%yU2N( z_~>SnRJaq7?fgvXggx}NM9+B?t*@^B80!z$+fskX)5!PKA7Hnk?yKKp93h(Np89^` zAFA*1Wuzae-%k8v^_zT+$_F;29sYT-c?-|snXgvTJ}4jR9NwMe|lGvH-|7Z4%$ z5MIK4;`o?r_>1^SGbnTD6zgPrBTc)9v$6yw-t+{$CAU05$4sIGPPM)s4Zvm*o1sS~ z?hx$4V7o|VA8Z~m7o{$uzg_Si_+`TPk?`kv0nez!cQLY!bgYpgDWiuG=d_Dwste0Q zgRBhY3=tjjsqjZ7k2%w0r00E%5v7W>hxggX92=#BF&iZhr5=sxV2oLI+36|NuC796 z+^91h*VUCD;ECC^*-XdubhjSHY?LXK2KQ2Vn<(q2*a&ks_%N0CGq61{vpz20gB_*n z=<*%dAXRS{d2R7AK2RE|C;OK6mEsvRkArJEV6+Q5tc{z-jpX8}_OaN29P%)1!>80o zobd3_%Ha@}mq+M1C~-i!$Q#4XtNkd4A{EuXlLL@SYOip*1XNLbfqTl!NoKmlYa^hV z+B2L&0l8|AP?Uh0Y9FJus+@~KG+wt4jdHFhiCih9V#V6_HX~qDDv*v@~g=lrH%L z6o`U41%H7bK}~Jech+prYANBUD#t#}r z8fc{S$9zg3AExwXD=)I4zq9z4Cr>~7`ny+e{@(rS_pPO^pZ+S2j*f1eoSf`v^iEGt zho4OSS?#`f^%3CslexG4I-O2BJCok)ziS4r8Tj8Z@S7rLl~_HdVj95)>?Z{m}iom(`c`cwEnpU`>QSdNVpA+!&)Zx=8Ngn z)7q@?8^S-RWmjt1Q8CKU+JA#;C5P1;skSB>-Wzw zUHNIul%B*=YD^0Qm&R48qrFj$8)|Psdxf6UdfwHuU-Z+K-sd%Xn$OnQLB>|X+V-~Q zy<#f!0Jg9B%sIBqK8F2qmgy=F);q{^`-&X#7+aVZBZC(b9ncWdA2?NaaPu@2{p8blwy zut%M^ryLI)5KE(HAlvZ38a39*v9pE_e8#SI(5tQ$_Cp6fZZ2&T9rP%6oU4A;1t0F? zh}nHjjlC~CKA@L#27L_t9n`$Q1-?YQV9{s!GW*6p@;pQScGlq>6JuL$LpWl>SI$57 z;S9UT5eK=9e1$#E(Mf;k;gF+$$e(#)-F~iXy*YP`#~%5e&@y34?a&9gKQUFjjVY>Cpq)evMXAPnwU|KSg+SO@7ar5@zZk4lEXhZ!tPqexh6Mj zo$!c0KP|VUHOK8-Sk5-k$=+m)(FgP?c?3fqk&T!ZRl}3A&a>_EeQ5H>ciTCDqXo&r zpLIF*g}R>TJvbm=E$}3o?KJ- zxGy<4M?bZ}9l_i+w&0mOakio}Y$A&eWZ8#1bhP~>fA+uO8@ccSKDozD%CSz3Ms0)N z%X9mWy;~X)8*|R8=v6q`t>?(1uZ^eI;IFO!p61Ad$8XNM(2sv{CXy%gKhQ9?x&rIm zz|nn;$l)EyP3nbLaOmZ}2-n19nJVA=LWVlxTgM)FSd_g~X z?unm5_oaS5d-01inV2ra)3-~y--4qS`EKvLrPtrPxJz|q8(yhDcy43O75 zv1NLqIp1DzRWX#G#7r$aC*Yo)V~XrIz7r3)I4i($H$ASgkyC0Ej znq0#5Sc9B1CwB72c>=d%$;I6lUBNZ?Q0APM#6XR~>sq!mln%!S=1_w>EALg#iTjCI zm&G@>TvwKPl=1d0&O&;Y?+ZHMfVz!4>_e?{*Te_bEd{f9(gDbNRpIhz=aYHu<|_UT{x7EZ}`n}bK%BR}IS_8)7V+NFm&xrVHR90re%bFEd0 z+AdW$d;^_#*Ub}Qsh0!cxK~gw_!0U4RPP5`qc-tva&KRI)c@q(vDWz(QLpRrjW|N* zvDT5JK3DXA0n}&IK6`sw=XvmsCU0`I literal 0 HcmV?d00001 diff --git a/data/map/tulipes.pcx b/data/map/tulipes.pcx deleted file mode 100644 index fc7cf65783502f8686d535557e0349e44d76c330..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5306 zcmeI0=}sL-5QV!XB1KUiDsPp%R{RJvcjdAf14$rwWi!Z$Ek*J2Ba`#hnPLV65%#}G zM)aMT?mD%cs_N-`zx$?sTlDvH`LX;^7iDd2t?N2w9{5)um0BK^pB^ZFTdXTx`AdV( zrgXKdZ)@|QyH}E1UCTbv-DYiX%(P`gvkWv}>UyrRlGJ!^M|1m{TWV~E>_7T^t*32W z59*{$H72@WT(4e+Y+HV*E3FPIZNbWhRuAjE%ypdyrqd@F{N2~U+hOHOD+}4Ux$;S~ zjmA~)0X`16kD6^YLqttomnTixyVm+qcQdV?={k`ot*&7AG&j?=DIau)f2Vrd>Q}L! zt4;86a_{Q8?7t9xOJi431NOaUR&`pQX%=p8uVQame!F*dNB-WwN_E_=^;j!Q4I=nb zi34GsPxExQ9!oj5WN|wUu6c;GWwMqvi zwCo!IEY6&2JnnT-*wG%kwo3k~5QLNAyY+U2z(d+^5jtBnTDEap1*NJd#B?HAiVF&n zUuv4hL_cFGp*Ez5i&&8As#_bGsrYsE;#^n^K!Wx)ME)4FzF>f=O7uDNL(O@vsri&MpLIO2)$8qX-q-hq|(7 z%_26a7^?0K^<39RC=e7HsF%98jYP1LHs0volFglxO|XXapBhAu?=MC=-GwlS7f77z z9?O<)M$-62pRsBWnsU)UBTdIXzt+tYIUMVL9naQ{wn3V*B!`wZ@4PwC3rA?%2}bcQ zIUySKz#39W;~7Zefg9GhRDbX{AZL2BQ|+lAX;9=E6w;g03SvObrH5TB?Of@86;j@b zh!;Nw#8E#(_3}odv*DfHNwc z9_1c;&ayqk7nsZ_t=CAJlMbH-6Gl2K#AYP>HhCip@CGt#V>g=ET*B6XVlT%V@`87~ z*@%^R_Jm?StH9CpyL#;JtkPA9bk;eQSmPMU28n-OC8KcXeZ@IM`dD*#hnGC(m3(=H z?Q}z#w{Fipm84P5MEYUoVFWv?s4{y@PC+CxW6mo`>dt2_P7|!)^?)=JH)A9|_DOO? zZIWTKk=cd;P99t{J6z2qX!cFLYO=6#9HKBg20P78H}gTLz%D_Yg{X9x6hG4-QMhCC ziJ~od_u&XfOr#+mG}{vh3J}7uYg=sDY?=_jMubkhOcbGG4+Lw3*l6qaR*Nk>jvN^Sak#bcfLU?`Zxl1iU}Hep zXQQY^_&^F&D-=g_v|uZbH$;k~iE>7nHEI%vg4B{I=g;>1`B*xbMfatyw!@LtUr?N{ zKKsEfy0Bx!;3*7%GQ#oOM$RT8Z5ZK>q2esfR~vM|(M5RVd%l!ln_49AV`=+;p;;oP z13A`Pn&&~<{^7~Fq>$zil`ks#DW!+_kv`K3)yInh&d3w(4 zFQ_F;kVW?%#XXHaLV}~*AECn)jYWECD{77X@M;yS>}*G|>O-Yh@ru2G zK;LPAgU2Qge)LFJLDKcZJWu`xfIP2S%X5_K>Y+Y|Irgls@+yIK%aN0={(b$-&k@c8 k{(Q;P=lr1YHthZvV*F#t_n-Ys&F!CFzCM3t;D5}(zk&|aZU6uP diff --git a/data/map/tuyaux.bmp b/data/map/tuyaux.bmp new file mode 100644 index 0000000000000000000000000000000000000000..cf0c6bc5394f2cba27e9eecde20117dfe312e837 GIT binary patch literal 7362 zcmeHMO>fjz6g^iUU?%ZQLI_L<3?Z3>ArmGv1EpV7fPe@j7ErZpSZ75b6(0(SEt^Vh zs8m6-EGebp7qD$w+L8ew@ws5b*9NghEP~`7+wsiU?|KL#R3L1{@w?|d-}ijpz4m)= zw(Xf*0r&WBK5&YqGXnJS6fEKie3AjWir(o04hY--bB%3-`;LrFKF{yHoNdjXekP?- zsby$rsE6l*@$vD*=H$J3`2%AEPG$dKbH-uY^cx?s0thVub#aa)my+X(#aQE9?>W zt+syHJ}j94e@NN__OL7u*axLuu`gkvEUEO#tMfabV{r)k4QXkrV3vG?gzN7Dnk5~; zi}EX4BsB|c0z1WWwQ&3uWdeiJSYw~ZE@^lzd$%M5^=s{f{Db=Tzih91e?r3cRX$fQ zwW+P6VN=wk5UN+EetiaJNzuR>WW9kUWS|Di!JqXvx$eNl^JGLv$@7<^Jq4Gdi(XAl}NUd+rd6vq;BmI zoU;OHi{PA$IH5GOo^a?iaMVD?2l;r?`^R?kP*loZ#2ED%1SG zE`D8_RX;ku7T47Jy(p`A0aGg8hpQ^ykH1xXC*P-o9NRTmU6;>em8y$>|C{n_u~HpB z-~XHPy=YhC#`j-{h&P|_i-=X9Ul$SQK3|N;5ufjm$ge7&R&%q;Te4D#x0v_hyPxki zU7u#zLG7dX?Hu>5b@(mJi_LZTFVQ8R*Wtgw8u_#i{}~Fh$>49w#|CywHX7J%*AhODDf*K_tf=;ULmYWnYE#NLQ%NY>|yK z^GjQtJ3K4N{lXku)vN|`o$RB>S+ufz2G6q5&T+_BtSom33KeUgTH4_5>e~1UrAleQ Z-TAfgHP+9R_Vc&M6!-7U-vvAb@*iG2^6dZs literal 0 HcmV?d00001 diff --git a/data/map/tuyaux.pcx b/data/map/tuyaux.pcx deleted file mode 100644 index 97cde6f2dfdd1cf02e3ff433bc466dabc3921f3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8344 zcmeHM=~5a&5bpkws#Gd(lDup3OevK^mIahcBT4`PIn}5oNu2at>@mFvlvGT)OldLS z*Ua?vG3SSO_#Wu<1wY|uD)ReAAN-1&|0w7|Ku~I-?*i7Xox&K4pElj1SGeV8DdAt zJcoFA28X0|RBl~#K$^I+JldymxUxMOZ-9EJefk6qvJ8h;$%Y(W##s!1RJN!&_=Cb5 z4t}rjri0%p{A2^%r%^nDtI<7aC}6=b599*@zZm8bGQ|90m<1e=jbvX332YbY#C}U) zFW?-L+HFAxIc;R0-=UA(=p=UnBYa5cuL%>pPv9Cb!@C%#qrHwlS-gR_EZ)SMjqnq^ zX664CzN!96c1W^YEy2!J#y4Gxt`-z=!FtuQzu9=O>=PSFmKDGTVL|Pe4YcQ7W;WJ$yVhOGuJU%h+5gF@+;+tdy8Q73(V{#uO>Fl@cRp zVs)j&6`bPnN{Jzy;nB_|29y<*mA$-#L?7B%c6ynqZN3uE=mh z!}$z1FkER%&S$J>+uW8bGXA%1Zp(R0)aj*NK!=T5%gQC*je5)W*sQVaC7X4Y?bCee zX02t1w3TtQ-m+ubw6vVavaA3%wqF;gw;p4)Ee_^1>*d|ya-EXpwc97v^X>RZpxOhv z3HqNAHji~~_vo0QkG(0ro*jy2ZYt6>M%;EOC*ZZ)Ww&vEVRmYrSZwqR-iqORom)7u zl;V0mO6?%+pkr3xQ6zd&G)KGd)H?FgdUtlXTt;6x6n*v#AkYt?0_rrA>70$O15xG> z=gVD3l<{zy!1y?38IR6qBbF)9x$bI1Mm{&>&3PxRSrRTEBkaB*EFZ_G$|^Ee!_v>8 zd3sinzLhNpvg@L9&B@ZkO|%7xX3&eF@(f&r0zFMcrCmHn=iR&-jXW9q<~IT-OI&V| zOAIc3QDJa-NN(0{j=MUn*^a_H4am+V83{2(a~z8mWLX>7>UgV~w(b oN`RGU95mZdslc9*)6(|;x(}N2>GLDKkP1N;>**)8z+1GyUnmI0&;S4c diff --git a/data/map/velo.bmp b/data/map/velo.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e9f5af86a5d39e941ba32ac5141c5a5a8233899c GIT binary patch literal 5032 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 QhyQ#(uRmAde_VmT0WP@ZEdT%j diff --git a/data/map/village.bmp b/data/map/village.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9223704e82075c220ab36b084a0ad070fe8484f0 GIT binary patch literal 3648 zcmeH}%TilM5Qe)!NJ2VC=z=atAcHZwAaNBSadTo~60nVph)FpKsZ=&p_St5eO*XD9 z$%CY__B*7KcgQ+x^7ZHlf?(lgs*FmfrvJZtX8Llb=jIVAEU(jPp(@Tf$2 zM1C6;*;o;IS9YW+_+9q@4(xq)^26JA|J1s_m$T)c{?=Bjl{r5@ukeH~E-prQV}B0U z&fcz?asS75H-4c|NG>l~_x^XEf%^=6a2fcEh`*7He$RL+RXt-okwtyO*p(Iig7KAX z=;w?trK2Z|N3yNQj4vdm<1(Qyk)O+$PD)mfke^9HAEA5hWM3N_*Hy8xrG0D=l}cToHkwF;yOqE zL*#uSz*W`?$+#|pm*tVx(S@k*5_r+&E(1;}SBorA@1~@|NwrI&Aq&)JR$IvP(xPrN zx`ter$6A)Mt|Ql|K}43dBt>n5tJE+mt2!YC?SL!jW3r_g_T3C{oSF~Gyr%JE%WamR6SO|n*ky>YdgRx=BIi0%#RB1Nt#%bvg2Z@lGlt(Gr!|Ob57#Tq9B3>9CJ&QJ0Cc1fECVAjTDZ zC_3zu^R#Z@V*%VC539u3hRcDQ*tdwM&0}~0yoP?0XWU^QoFG35hZoVWBj@qgM{jro zoRb{+FFJ0CnA`00K3s?SH|;z(H+y5f3F_~Yr|Uh2W&chtMjavpcDK2v#_>5OCC2Q4 z{h+QF=P>WY%{evZMP0nNbuo1L4_sdv$W4s=g@b%se&#p>BG%F(A$nVd{yE|Bt_;!ln)Kgkhr8~MX*l^6dCieCTlWQfdc^I~=M6u@k0d=h z$~|EC0DVrrb@HdkCHdODll#bJc|#6Gp5p7Qymozd4}MC%WRA!a;2p0WSn;+Ba`l~=#a}SwVELI8Rps@kfT<|ft=@_?FMpz_uRgr%%(^_ i?7OPX{0FRc8pt!`#J;<%XV=kv<>avb%4pwfqW=P}@RpkZ literal 0 HcmV?d00001 diff --git a/data/map/village.pcx b/data/map/village.pcx deleted file mode 100644 index 87f82b183cf76aea17ec7ef0ce033ee01a9b7997..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3287 zcmeH}eN!4q5XQT!Ox0B?A1WU)_mvb_mR=Z>|%o~3+7nNLof1~-fSt0h@ksGO~N&85l zo=6Jn$cq01*+*_V`Li4#XL2o>c4dg1I=Lew#UIh&faIoa(;h+LwEY zv?+7Vn5`$@BtUne6`5!U4-6GLw7;?|HP$Kg5c@**K!>0%BMT{uuScLO&J&GH~6 zZOd3M$W25%6+9p6m2^ONQpM-4-b>3NAJilZyTl&JEvxrgv5=ZHz&BDSCd+*)F?dC8 z*0_Nbk;Oz0oIYoy;S`U|zQrt&d}WrNcn>A!vlRpTX))wJ$iUTWwop} zh}f7A{hCST%rU`+Nyw1d)Y$2%8x^yM#`x^_%rOy}e8iWk)ERFxv!Y`>3E6*RLRmSc z!oHk4CXidll*!P-F*UhoX3u2Suu;!URhAp3A)nEBoFtEx*LF1x*r$~J_3+K(oD{l; z)tXP_2)imCmf=eqKIS~{y68&qE$T?}cW}%&%+OE-U{J?c^V0UA>y07WQ4IS?~5e z_}{rx?sLAeJEuNuGoh}wYy!2K+j=o7a5mp#=8U-J%skr|^A)DejjG8RYg~cu__)33 zuBb1!e5uSpm(-ONUnWy5m+&hpNhap)9LXwt4hnV33A>Os^PZp^k&^{=t^*3GR0H&V z>iPuKjk+y))^Tp;mf(;B^k&-DIPE63vXu*%CNB- zALudhlz0KAPk6+cC}DH@gpZ^LZZU3czs7Ac`Br@GY<+TYB(KSVej&a+A}vuVY+fI~ zemrjc-8gE*H++iEu8Xyzi9CCSQlj7&m4(~mL@v;B{bb zeSLjd9of%fb(_w$1W&e`{#@ji9*g07e}BXqelUCmhOfZ?aRmmjP#^U7-xpBGOY%;m zo@b=T(ZLhaqv+%@=^?D)Vd;Ks68H&j#sad|RKr~iV zHb`;i%gd8j&at8~qKZMPWS+cSdDR>fq0#bcnJdpJM_wI+svIS%AEXB6{PL2Nt<^@3 zlIN5quPO8bn#ydgW{R4b6`_&xriWfYEmZL$6=i6321jbuDP7*o&G6s3DGR7($Ta$d2J@SoTAyT} z?qK$l6YnYD$q?j5GA%qoJXJhtJbhASlP8y_nJ1i+C!wdKC#I*UC#z+xWv^wiWwT|q zWw&LyWxHj)WxsWSb%S+i7b-Q)Fb-$ej>}+6X1v@*~S;Ed17f}$NHInBK@F$%7M!En1 literal 0 HcmV?d00001 diff --git a/data/map/void.pcx b/data/map/void.pcx deleted file mode 100644 index d76cc8c29a89f6819e21fc68834edeb4e344692f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4131 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 B@HYSe literal 0 HcmV?d00001 diff --git a/data/map/z.pcx b/data/map/z.pcx deleted file mode 100644 index 182e7240b4b93a09943308d4d8caf232e841ec49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6601 zcmeI0*>Wm35QbY9sY<2tCds=d&t&$^X1C2^yn(R|Ucd_&+mruqwFE=u=G^AwOeKsy zwHm3_8~*JV_p9LFU+xe0Cmz24&_DOL`|(BFZ%AbOba&np`PoL#QgB;a4CP76JLA4Q zN`Gfukq0@Cm`noT#J#j5J(6fYb-3?_G^?$oF`HZ7?hi{fRd~(>j zSl84o{SwTJHhzWEsR}2 z_5l0{<{W{)M4ojO`3Aj~WB0y8=}j}RwXsWRAiD$G?6E1>*B-l(4&)=u>f&pKnLT=` z6vojbUD+31z;_ZU?9q|Z(jFbEhVmXAsBCqQ_Ti<8z(}cY>nX*Br09v##vbh|ZAI$O z)>aDdRShF4>WQ05nT~i}9Rv-HSXX*tw4uA_o_OM((L=}_m@TR*(bt)ts~RmU9V+c2 z&in-xm5!9QT+3))DSh%$vMyX^PAOt0b?S^#IxP1b?n5EMbO(M*7aOK0Zw0?pj^4aw z8)fw9EnDl_S&FTc(bKnbZ}2Vk{2lh9EcmTuGm5mQ`}MS9)O&jdd6au7o8Cc`B`ulkS&9~no~LNeXz+HgH)|BB*7iWX8NGbo z9cdPIg5~tUY~~&Q2E^YOo&8BB?%T#FiWrZOoHOpz7#;lynnqx(io9ti@xVSbBXFF^ zGh`^YwroMC4s0cLT}uZJ>|L1F6QKhK_J)E@Mh6b;)flR0WJ_ao>L9m}ny#f&lbvDT z&u9s#PaQkJrwCD7Of-YKQ!!CG_%jv{q2wV_I(VS-NSWvtkQ+dL7Af66(ECW4{uhwz zL;gN?I&}L$?;>UTUqX(uw~;a!0-Z+6qOgSC9%OGKWrzeik&>N_Md1ZiIJUd8^*jmO-%V{yi?KoSjaMSHHiE`I+B|P+gz<}wdCLej_ip1vP<-5{j@T0* zIN6Bdjc$hk#)zqH2%92Uz);-4Xv2=4k__Pw#sF)mKat_2V06QZIy~7iLW!qi&=sYD z|Ff)i5hMsCbT%6qfYBx$I52jA^$*(B(rz7C8V(JuBS_&pK?+9Lih9C*VzF=37(vWJ zoUAz*2aD<2%t72@&B2Yp*rT!v^UG@vxf6_8gjtCjtf6xy3#5Z%(hzG9<|t;^DuN_& zZy>DEiL^j?RnH*!#M1=fWj}y0ThUwhtocSOhA~s*kYC)3ZQn|%vn!nr9fO%*Xlz1D$>ums{8Cpu2D- zuNSU@ZaWK?&*@rU*LZQ9&C3FLJ&#T%tLwvT-fM-`3usH(n$nJ5Z_ehE5vcf3DXUHQhD4zb@Cu(>hV1LkVcw`68Dgmtr^ zb}8YLRqH;^WEPvqQ{sW*Wbtg3}&griTAGa}#HdaO#?Annc=y zJnxEo8b|$I$mXyg?*1yuo}vc7f?P&2zzN?#&aJ{S&a?P_jTRY2IaWjcDTny>bvMCm z@Y7-ZUf*BPKl_ng#kD=NH+LHJokY1C=qtiv+%t0uZ-&vDb$OhIwqREA^bRM^VkJ8V zCO%K^aX+*wZ-g`LIP(B|=dp&AS;ouLcLQan@pOqBrkqdAWN)y}Gd_=^z7^hR@xw^g z*!>qsE$Z1AshYPkI=oCd%Fy$;suT(QNl9^s7%J=_{z&3Nn#ONC5e7P0NE+mMVoe>C diff --git a/data/maptex/2d.orig.bmp b/data/maptex/2d.bmp similarity index 100% rename from data/maptex/2d.orig.bmp rename to data/maptex/2d.bmp diff --git a/data/maptex/3d.orig.bmp b/data/maptex/3d.bmp similarity index 100% rename from data/maptex/3d.orig.bmp rename to data/maptex/3d.bmp diff --git a/data/maptex/3x3.orig.bmp b/data/maptex/3x3.bmp similarity index 100% rename from data/maptex/3x3.orig.bmp rename to data/maptex/3x3.bmp diff --git a/data/maptex/Makefile.in b/data/maptex/Makefile.in deleted file mode 100644 index 5b93ea9f..00000000 --- a/data/maptex/Makefile.in +++ /dev/null @@ -1,111 +0,0 @@ -ALLEGRO_DAT = dat - -DST_EXT = tex -TMP_BMP_EXT = bmp -SRC_BMP_EXT = orig.bmp -TMP_PCX_EXT = pcx -SRC_PCX_EXT = orig.pcx - -TEXTURES_BMP = 2d \ - 3d \ - 3x3 \ - ac \ - anaglyph1 \ - anaglyph2 \ - around \ - big \ - blemmya \ - bored \ - card \ - charming \ - chess \ - circle \ - circlus \ - clean \ - confuse \ - dirt \ - egg \ - eyes \ - garden \ - honey \ - honeymoon \ - jabberwocky \ - labyrint \ - logo \ - lost \ - lw \ - metation \ - paper \ - papercut \ - pastel \ - place \ - psyforcegeometry \ - psyforcemultiroom \ - psyforcespheralcube \ - psyforcesquares \ - psyforceultramultiroom \ - puckman \ - rect \ - rectangle \ - rough \ - skullbig \ - skull \ - slimy \ - smile \ - solsystembyn \ - sonnesystem \ - tiles \ - underground \ - watch - -TEXTURES_PCX = lwtab002 \ - lwtab003 \ - lwtab004 \ - lwtab006 \ - lwtab008 \ - lwtab009 \ - lwtabbar \ - lwtabdrt \ - lwtabmic \ - lwtabrec \ - lwtabses \ - lwtabto2 \ - lwtabto4 \ - lwtabtom \ - lwtabtru - -DST_FILES = $(addsuffix .$(DST_EXT),$(TEXTURES_BMP)) $(addsuffix .$(DST_EXT),$(TEXTURES_PCX)) -TMP_FILES_BMP = $(addsuffix .$(TMP_BMP_EXT),$(TEXTURES_BMP)) -TMP_FILES_PCX = $(addsuffix .$(TMP_PCX_EXT),$(TEXTURES_PCX)) - -all: maptex.dat - -maptex.dat: $(DST_FILES) $(TMP_FILES_BMP) $(TMP_FILES_PCX) - @rm -f $@ - @echo Creating $@ - @$(ALLEGRO_DAT) -a $@ $(DST_FILES) - -clean: - @rm -f $(DST_FILES) $(TMP_FILES_BMP) $(TMP_FILES_PCX) *.dat - -distclean: - @rm -f Makefile - -%.$(TMP_BMP_EXT): %.$(SRC_BMP_EXT) - @echo Converting $< to $@ - @cp $< $@ - @../../utils/liquidwarcol -s 32 32 $@ - -%.$(DST_EXT): %.$(TMP_BMP_EXT) - @echo Converting $< to $@ - @../../utils/liquidwartex -s 32 32 $< - -%.$(TMP_PCX_EXT): %.$(SRC_PCX_EXT) - @echo Converting $< to $@ - @cp $< $@ - @../../utils/liquidwarcol -s 32 32 $@ - -%.$(DST_EXT): %.$(TMP_PCX_EXT) - @echo Converting $< to $@ - @../../utils/liquidwartex -s 32 32 $< - diff --git a/data/maptex/ac.orig.bmp b/data/maptex/ac.bmp similarity index 100% rename from data/maptex/ac.orig.bmp rename to data/maptex/ac.bmp diff --git a/data/maptex/anaglyph1.orig.bmp b/data/maptex/anaglyph1.bmp similarity index 100% rename from data/maptex/anaglyph1.orig.bmp rename to data/maptex/anaglyph1.bmp diff --git a/data/maptex/anaglyph2.orig.bmp b/data/maptex/anaglyph2.bmp similarity index 100% rename from data/maptex/anaglyph2.orig.bmp rename to data/maptex/anaglyph2.bmp diff --git a/data/maptex/around.orig.bmp b/data/maptex/around.bmp similarity index 100% rename from data/maptex/around.orig.bmp rename to data/maptex/around.bmp diff --git a/data/maptex/big.orig.bmp b/data/maptex/big.bmp similarity index 100% rename from data/maptex/big.orig.bmp rename to data/maptex/big.bmp diff --git a/data/maptex/blemmya.orig.bmp b/data/maptex/blemmya.bmp similarity index 100% rename from data/maptex/blemmya.orig.bmp rename to data/maptex/blemmya.bmp diff --git a/data/maptex/bored.orig.bmp b/data/maptex/bored.bmp similarity index 100% rename from data/maptex/bored.orig.bmp rename to data/maptex/bored.bmp diff --git a/data/maptex/card.orig.bmp b/data/maptex/card.bmp similarity index 100% rename from data/maptex/card.orig.bmp rename to data/maptex/card.bmp diff --git a/data/maptex/charming.orig.bmp b/data/maptex/charming.bmp similarity index 100% rename from data/maptex/charming.orig.bmp rename to data/maptex/charming.bmp diff --git a/data/maptex/chess.orig.bmp b/data/maptex/chess.bmp similarity index 100% rename from data/maptex/chess.orig.bmp rename to data/maptex/chess.bmp diff --git a/data/maptex/circle.orig.bmp b/data/maptex/circle.bmp similarity index 100% rename from data/maptex/circle.orig.bmp rename to data/maptex/circle.bmp diff --git a/data/maptex/circlus.orig.bmp b/data/maptex/circlus.bmp similarity index 100% rename from data/maptex/circlus.orig.bmp rename to data/maptex/circlus.bmp diff --git a/data/maptex/clean.orig.bmp b/data/maptex/clean.bmp similarity index 100% rename from data/maptex/clean.orig.bmp rename to data/maptex/clean.bmp diff --git a/data/maptex/confuse.orig.bmp b/data/maptex/confuse.bmp similarity index 100% rename from data/maptex/confuse.orig.bmp rename to data/maptex/confuse.bmp diff --git a/data/maptex/dirt.orig.bmp b/data/maptex/dirt.bmp similarity index 100% rename from data/maptex/dirt.orig.bmp rename to data/maptex/dirt.bmp diff --git a/data/maptex/egg.orig.bmp b/data/maptex/egg.bmp similarity index 100% rename from data/maptex/egg.orig.bmp rename to data/maptex/egg.bmp diff --git a/data/maptex/eyes.orig.bmp b/data/maptex/eyes.bmp similarity index 100% rename from data/maptex/eyes.orig.bmp rename to data/maptex/eyes.bmp diff --git a/data/maptex/garden.orig.bmp b/data/maptex/garden.bmp similarity index 100% rename from data/maptex/garden.orig.bmp rename to data/maptex/garden.bmp diff --git a/data/maptex/honey.orig.bmp b/data/maptex/honey.bmp similarity index 100% rename from data/maptex/honey.orig.bmp rename to data/maptex/honey.bmp diff --git a/data/maptex/honeymoon.orig.bmp b/data/maptex/honeymoon.bmp similarity index 100% rename from data/maptex/honeymoon.orig.bmp rename to data/maptex/honeymoon.bmp diff --git a/data/maptex/jabberwocky.orig.bmp b/data/maptex/jabberwocky.bmp similarity index 100% rename from data/maptex/jabberwocky.orig.bmp rename to data/maptex/jabberwocky.bmp diff --git a/data/maptex/labyrint.orig.bmp b/data/maptex/labyrint.bmp similarity index 100% rename from data/maptex/labyrint.orig.bmp rename to data/maptex/labyrint.bmp diff --git a/data/maptex/logo.orig.bmp b/data/maptex/logo.bmp similarity index 100% rename from data/maptex/logo.orig.bmp rename to data/maptex/logo.bmp diff --git a/data/maptex/lost.orig.bmp b/data/maptex/lost.bmp similarity index 100% rename from data/maptex/lost.orig.bmp rename to data/maptex/lost.bmp diff --git a/data/maptex/lw.orig.bmp b/data/maptex/lw.bmp similarity index 100% rename from data/maptex/lw.orig.bmp rename to data/maptex/lw.bmp diff --git a/data/maptex/lwtab002.bmp b/data/maptex/lwtab002.bmp new file mode 100644 index 0000000000000000000000000000000000000000..49b38ca5fbaa2b392ea3845abc533cffbb65b6b8 GIT binary patch literal 5734 zcmc&&F-#mu7X9_Bhk<2x*%P`YV6`yQz|4SwH3JMV9!6SpBCt-}9RUF+5g^$C0l@?l za1sGpSy~4K4lK)o0|yQqIB?*T99TLB4jedeK)^`^1Ox;G*2#f`x%aF3&veg#_twcF zKX-L?^{-#=zyGUxe*W{V@5%lB8W8;ht-k;>fT3=H=-+=J3a30=hjday|GAr=SN~Q! z{MUc-fBol=fBf;6b5kr9`)}R4H3oD&c<`X7^3{>e|NT(RHvceP$6sGx9}Nx;(!|6B zmCI$idGjW1Y;4f&+qbD+uhYT70o}WIj~+jMOwXS`r&q6D(Ytr==;Y*tE-o(I_5J(z z^!oK{dhy}~J$?F=9zJ|Xhlhu>zrRnlTFu!Kn_^q$n4X@dFbt_TJq;A8x35fn{Z$$m zT&2PACJjxjQ?9f@)7331u5MF#eTP;ycWLc*oi=v&X{&xfI|p}x8g1|I(k8GDtnJrm zb+1mEF}d=Px3#z)}OC+By6e?JKZ1_qiC9u-4FL!^+kDss6TDTH%{aH2pgNl_}5 zNFm%Qs?{nfR#sL>vAViS3gKI^wzfu!_4Rd9NL&<~o13KA+S($;_VzX@L>G#kogGr_ z?(UL8Vy+MkDfSQ-g=j+|8dKc4bB7dn@7^Va=t&`ZRNTLRpA@1y#iK`$NFmx)JbChj z6rxqdvuDppAv#xxrWG$=z9fa@fkL#ec=P5BDc-()OA5&uh2)Fk=;(+P$H&K{ko;1d zo}QB8?Cgvb=jZ37kX%%JfL;|Jp;^TzXjjo_G$=i6GSfgWV1e#oA~S53P1VLA_d!Pf z{{m!SF9wUYpeNQR&)vLLUN#lXQNir)Ds6|X&7{y4^eyB4EZ#w%ze?M~;%c*985VmP zSaJ6zlggSKW;u}mD;OEdD3jr=wrtj7p6-gdkp?iv0ev?FT!Ecoyw~&+<3p1TLLCW@ zZ@`w=Yl1^(zj^P+Vw{Yvq=8;H3#>15rFN~skzOm39IPyl7$7ukGsCL@UF)7T{d>g4mI^ z&DjOB$P0{iSI*?ohgs1R`5I~M3XUyUv!hllzOJ+g9?oN6<*!5f7rTw@C9Y48;d^aDIz|$i7${fpspy@3;Ujul_^JWfSwlEG~l4w1PkJC2RD4dy+S06aQoSLIa zPoW|_VR$P#H((21I*xe0Yp!Sf+c|h6?Boz9aBf2j)wvpZMFt@DIYbcbae>Fp1U$bS zvshsVSXU+%pa9rv>fTjFsn>~m>g$Z?p2q^r%!Oe5>xr*tx#@Y}G#>Ljs_s&8C36wa z5#$BlhmJ*Iao?}Od%!x_qL~$#B74t;@lvE$pLM>5`FiSimV~!b{Z;jxw_wOl1lQ~& z<^Xuc6zz=V7Sb?Zd4ae>u}&c}hHYm_{^(cds5~0OmkMFJ~OH#rO`~zM0fBd~}fv zuJe?gwD1}0i9GfdCFyZo9jb2V`U-u61L0-TF)pl2+j$>2zolmWHs_3UQ77k4+b*&u zQhAGUE}`0ehH>ay&K(_9JgSe#K%NbtkZ+5KWW=%h+NtZySjPFRS*1nQ0Ww?k7KcsT zd*)Fgk(-@$#Xv2}y%~X${N63QhF5!35iKerG8FYsTBtCyQX_qjua=^hXs?o*^c%Is zD_%}mopl^LNg;(ff^nY1b9axBg{NBK=X>FIs*ncMe;*4DgJ^dW|C^BrZCSG*R^!Ek%Xay^Wb8sRL)g(w9>AX$_04l;}RgQdh$=^NGmdOLPc~I)41Z?i+xGXvA)I8 zGnqkV6RYlf;S$Znb3sm*a$2)`ipH*iGZ{`f7MUrCPS@x|+mFTwdCQ+MQPEW9VNYqJZ8hXqn0a<39B%SscKr1eEBBmNJ- zw?Qldf6B7_UH~s;2aYO+uRu~glD{M9?+I9eb^L}dO8@Tx+6 literal 0 HcmV?d00001 diff --git a/data/maptex/lwtab002.orig.pcx b/data/maptex/lwtab002.orig.pcx deleted file mode 100644 index f936745ef41608a5481dcd9bfd780743ccff7ea0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3955 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 Q<1g&p`}F;Ld}q`BFVYaq761SM literal 0 HcmV?d00001 diff --git a/data/maptex/lwtab003.orig.pcx b/data/maptex/lwtab003.orig.pcx deleted file mode 100644 index b4b195d27d35a1bbdd7f8f0d9d863cf982846838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13685 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 E0H)D$U;qFB diff --git a/data/maptex/lwtab004.bmp b/data/maptex/lwtab004.bmp new file mode 100644 index 0000000000000000000000000000000000000000..743bf9803bfe77a9e9c7101c6ea239a0ef1916b7 GIT binary patch literal 18624 zcmb_kJB(!2c0KohySnBBBRo$+dN9-9>gt}6j6{E`2c$Qaur#tpHo*i~BEW)xfM5cG zu`~g)kW4TE0YU^=A|N0jAixp*&l|AFx@7)9tYLU{V`LRh<|LtfyE;dlQ}p8Vyx zf4ckNzyD|ZAOG{ukNx@Iekz`N>ZwaFzx?thM*Hr&@2=b!eOqn+^Mk+Thy5R>Tljb3 z!iDho&SHkPBzaHLrd< zZO(E1`t`83wx+gpt0Amj3f+Y#LU(x@x+nHSw{|nEPH%

vzJ1{g=XpXI~4KZoVEa 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 ITSw`C0E);w`v3p{ literal 0 HcmV?d00001 diff --git a/data/maptex/lwtab006.orig.pcx b/data/maptex/lwtab006.orig.pcx deleted file mode 100644 index a3256445c971854e8623b9a372e99c15448b570b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2562 zcmeHIv5p)?5Zwz92sZbl}hd0RaI4 z0aEwOp6~Yd@X6S$ISB#+A0T8oaA3*u@M?PZW_7*`E+F%2cc*9iRaMukS2gdxwe`*f zpKFsVlgnF|w{(53&(>#?^Bav3dNVgyr)hfCm}%-`8*`ePBwms+DM;_L&k~Y}-uZ|} zlDW7;{4y1{WS7~GyHQ$~{bTWtiX|)`iO=jBY{1D+qUB8C$ymYi}=@%s8&VV@j!_wT& ziNonWsIv>&vDCRj*|tr#y9jzZm~Faf1eN&D1j8pioX{ScmofTp~3TK2M&dO>ICCX4DX=9fPqH;dN zn0Oz269~^>Qc&QG`(pK)xg*9u?oN*kn|*dO(C3W@KZQHkIkH`2GeHHUx;qxf$O@sj z0M>wWglMU0Z3FnG+D1IfBV;wCwjWD^o*_{Ih0~$7gEk>VgRDU`KQm00cxI3|90HRy zEgA~q!@o+10zgktl@1VY2O6O8e?$*gpoUg_S#8f&yGMAkjm~L(yEfE50*5#f`zNqf zRbqcO8f&9v6bVeqk+wia3qS+M!EyN3==R^nq5gX&93M*=3`55eY^#s$q0_ZB>d}D_ zP@)<=(xc$YoiDZbH$Xf?N&Z5W?y(Mu6An6l4x-i_Ke`6>FH~WxVy+pLSB5k3P~a69 z^?M2Ay6p97as1L_=u|1xXG+nl6CQ!<{Yn6%zdq);QDxB5n{F(uYNU^lc%3#Yu?ak7 zEgc47m7f&u9n?KOfeF)n=v2ocx(8P}s26ktgj}JuGM(LRhWfI$3VTeb1=z-FXgn;? zE^8BA&f|2nv+QJ*5w!sdLwIYPjJ!qXBOrjPlK|Qk$SzX{*F03t7 z%W4v!R~_f~FvrkqItNAb(0K=WALu9(Xi}rBZ6YXHs#Y|VPOSsUN_c=DLWo#zO^PKf zmGv2357V6D0z*V!EnNUQX)7kvn*(!kGU{-hR%Gd1xImGUxS((p3M42fT)e^s zkz802QYa`W5Tc-h~&Zr1qFo*3KUULyv*#rdEWS*!9Wy?PdjgR zc6N5&?7rpm_rHuo{eB+;ekJJ#;uB%vH39q;29n=ul!BFTA~B*VwK1qv^i*MIsTz<8e$)O(CDpV`gRsv$L~U zTwFxGUPrUp#QOR=c6N4faBzU*<71qkpX2iK5;r$Ds=c_lz{$x84i68px3`C_tu3sr zt)bCqz_xAWi+!?ho+F)3BbiJhJd!3d2uJdWL<@+;ONb|DFfmoZ0g%7wC)tFv-xLmpK!*}NaXrpHep`!*NI28bxp^>6wN zlRiM>ENb7T$d-t@&#c#R=@`ef4`pkm#%Uee-b%e8S^MCYeX4a)%wMs8^&ChJ4< zK-sfi`_%r&m7PU>5jBU7Yuw9AMD=UiA(HhxY;WbbkL|lYbnI*=ISwjW*3^HT&X1MT z_B0=@gJt&b_R*Z7+_0+~$%ecbU%NVQERAvJRdI4Z*;VV;=G)>vZc~<=OP<*YE4QCvRq6UhLZ^ z2YzuqEA9b(2kC6-w^rWzzvOJ_))9|0-`h|&sP@p8>*jM+k2CYk_Bvi& zLuQ|r1BtMEHkp0ic}DY_dM!s(eVBUF-akhFd3xjHwf4`I{~BeCnI|pleDr%?59M8Q z`Bb0Jtq+;6U#!on>Hm2zn&*xguc~$D-%rkcx6TLres}BUUw1UW`-bbg=Zt##J*9hxdHf#ql>3!?Mh$*{qkQpM#(5j$ terVodAH92$Pt*SSciu5NBR>-EU7Am0b?4@LH_J@YM<;##Tl(kT`UknP#ti@f literal 0 HcmV?d00001 diff --git a/data/maptex/lwtab008.orig.pcx b/data/maptex/lwtab008.orig.pcx deleted file mode 100644 index 8534910ac06b0db99918d496148bf0bd8ee5db70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2772 zcmc(gEpQq^6vu<;q*FSBKtv#NH_U7VnPEDJ+#DhzA|is$L?93m5r_!Hi4zC}q9P(9 zq9URqq9URqBBCNQTs|5|OBzH30)aq8Fd0Nd#P$F7-Ma)@3e0q-Ke)Tyw{Q3Dd;50x z&8x`kIgp!sH@6&Fj!=0fBJbyB@APcJP^PE<%2a0eWrYMoKXq+;>H$x~R;FFIY-K3B z&z~!N)Zb(^>(;JWH9Rdmx-0i-Sawa>mVK+xh^IvrNN9XzU*nCsx-o)g^%F)(h<<4Q z4qX&#Ml)!?L0OTEdMf({Z$mYCNb5%1ZR(aYOAi5M)M1Y`$t+snpNF?NG^9b()~))D zo+L0--M-M{Tv~N)<(sb2D69=b5Mg$8WuNOd=+~78ISLfY-*oHT1{0Uipc;KgHDMk@ zq6K=efHK(`)q=@0%nZK43^Y*)>g4XIHpz5ED3Z|D!Jr7~(jT;;^FwQf`k{pS20b{c zs021?jZh2wP$iJP=oK3M7ri{>;P5z;E%5@6o0&J_4tB?o8)zpJq~+1dOKZ(&=v)mP zrdFC*7y*(upGV?+50vRM(x2N$Y#6jxpT~H%ffJI5xSiAWMkMI_zOsTrKBa?bvK zBAXM>a!UH~cY#S};l;R{B)G4}+(T2}XV>J~1HEWxT`2P$M|e+}SCG(6dZ~=JxLsqh zSR#=~rBc~!c4K2BpU)SIMb~w!)$0EK{^8-_@$vEL>1ngs>~uQ)ejo2vtL1s#$;rvl z(b2)d!QS3prBZPm2OZHJgJ7t1I-N`=)AP~Hd^8)2uEt~QiG_`1Vl%avUs>8(O>eJf zb~dx6!kSymRZ97)yR}>0ajH9|%66$zC{;F{O3p2>m&>bVXT>dM+(OFDCEc|}C$r!r z<4!#4%tzZTzjNnz+J3j~_d0&B>)-e2-@o?mHn6iLHVX&0U2Vqyh z+A&yb=A(d>Wj+Z=2IjMX1Yo`h$QB0a!F&~vMGTUMxfB`#(u_flF?T{+Kn5~hp(or6 PNK|GZJPJ>O@B6<1wAA7~ diff --git a/data/maptex/lwtab009.bmp b/data/maptex/lwtab009.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4f7d58b04cd0c7f59cc170faef3c01906988700d GIT binary patch literal 12144 zcmeHNKTMlP6n~#hVz6mVV@0S!4UR0Cs7SS14_HPOQW!j-%4$6@xDo?Z7#OJJ!2^{T zP=!h+{QU;_lFfe3bU|?WCDuV}xsLGJReedqx=d-^*+!;fl3gRc9 z?|c95y?1x-d-CHSe$9dS`=bxwHyr(m_yyrWKLX&NuK_aONQeoVgeL!sFON$<)i(bA z_tB4kJ-Gki_lA?t=TlFfJjo*NK700T;QRPd^wG~7-w`qYp*qiBGMR*tkr5alABV}w zNtl_Lf!WzvSXfwqdc6*-tE;fNxd}TvJMik&E7;xLg|~0t!pX@AoS&bI&%?t**xTEK z*RNm0ix)3oYikQOHa1{oWd&-rnvg{@NjB-o<#Le8WFQgCA@Yz&PC_y@1;ZmH7|G1Q z=y(OjCT1ZwH3#|9JWN&=VY<2m<%K%TF0H^^eH9j0*AX?CUs-}GqJk)|)S$FnhpFXd zn5Zp79_h!cb;y+KFgjg_;d~8JnHnTgh*%AphsV%7I)Uaf;S`!DXV5%FoHZmG=g>TV z2hDec_t1Qg`0zp4ol2#EFg!f$g8axB9UTP*t(7r0HUB8YDwTji{$`ZRWnfe)6<|<(U{F3WC?6S5pFRZ!<(2F)(O3d0SwxUjCYu?jQ5zcj1QQ*jApY5PWo=vd3YxqO^@N{K-Nh+_!&jSvXPKyP8!du z>|hb8k>gwSnJ7kl=A10iI>mUwQFKl*r;P`29J%1Rknu2BM!XOyCN!Cy^8IXx6z&xx z$QLQ35G~t=wQ&#)*~~VPUb5f8&wE*vhe)aKH2>uV&!u0aj|PQYDa*+Yp>L%;C;J7C zdEP0G7}80fpltNrXJm)qi=>lE?hr86LvDOC7d%gj z=TcT5j`i5lGm_WRA>&T^P3TA-$2%&USN_B*D$s`39pM!9 zd>|RbNBj3O{JJfDg{Zg}yt$ol?*-ikq95#nNBSE8^|Y-?%8sNHs@BkTsX9jFT^OBP z$N0)lYW(ud^vd9mE;MfFZ&RKo??VpCJkLAqoeZ}yI$>$Kqu*L}V3RFtc&Gxv(# z9b4yt@jI^atuejsQ@Z0!-r4EyH=)z-(N=%p@;!)N_C{2FBl;pe?crd4kdG)&deLjr z_e@Zq%c>WKcIh&6Xe-wVx*UC8<~!Dmn3rAiVlS&7>-{M9A)`3HuZ?3k7QG;GRD zg*>Eh8P(~;I$L}f6z$_;O0L0}p3Yb)2iKIQNXZURdw-SYNphs4?@IF|0Y625Rjv!= zq4nHjmFw%AbJzLNV$dGHp5zn8tC#tHW&0BC?B)5<%X952&tG}Yx5quKSK9SGg8n64 zv^%c+encH=UE)1P))LoS2gtq6eaw$j|CrQm`gv_a@74t>p1e+*x>VO`!{_Smh_8AF zx2nr^8@k~SvxRc}Q*X6ZH|TrO^;<{&s2F(q4ju1kp69x3pO|{+ZREMO`sdrFWPfa1 zP5UJ#cACoS^yg)Iqh!}*_;p+S`-W7n`S;?2dxzmXGRLu|#C%e9jFv8K4%YG_@j z34M?*n;xmI(}pix_w~M0UCX;;>pW=dWnIZTvASF2JuB}TKRpz?PrcRP-_hxH3XLgG zZd-5F=(mrUoBBTX_F%(0u(Haa3UN?%S>-Q1Wyh5&BYZ~nj`-!M-cQZ=%n{uM=%Fk? G)BXd*f7oIG literal 0 HcmV?d00001 diff --git a/data/maptex/lwtab009.orig.pcx b/data/maptex/lwtab009.orig.pcx deleted file mode 100644 index 1af4c03ef231ef7465b19366ae50099441401dfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7863 zcmeHMElev}6b7+jvuuJuAP`K`^W8V&-;M$A$9Bfvj=vqJ`=K!Y)7bD#!3>tlx%#7WDt8-hP)Fo%2vT)ryXp(R z4ciIbtDIdg+R9RPmoJ}iN$OKEx_Z&E8$Fypl~ep|J0Nk2EqwI^H+)GLp*a;vbCg}Q zKP#}|+oA?~{!Zy9y_J21U(l&*%dn|Gu^8%Xr;d=`%Kja4apPD`!+DK+MScIIj?iq% zzQ(Vmnyg;&TCeUlp|7c_FN$I)w6PxMCUZiXF=2cJJn({xUom@xf()hy(npC`kp#?0 zQpY1wu(%6Y30^=qB;m%i$uWVnOuC3v;?>@#7=u(A z(+c%+&NY+JB{pw}D>lNMF|94^V=@aSOVB!jg0+Sf;4sZWe<+FDoGPjW9#uyg_+(B-xY85hHPQ**$ef8EVJL+~th4OuER< zLrxvp&h6U|QsLs)dW=ksa55);)9SH*nBr@nmHA*0)5t^)#X_JRX+)pO#%g}@7tP89;&=Tl~t&ht19Ciy2PZ0xMCyB8PhtU+KN??2^6d~ zTP(u?$u@nh$AXxpU_vV~p8HgZ9D{~A>V!UAFP&xd88V!IN0-%K>#^tmhxfG}!$H8Y z2Y#zSN%+55k7c|G3hFdG^d@fveG2cQkhXMH#&4#Ama;yo+=o!{h1X)2*r$?ut?%&y zZE9+2c6PQUtJQK{ z_w4NK#ettfm&(BXxE=)`=O-(LOPp!_*tmS7n3Uix_ zZ?>1`cUBknHkL|TE0x{#YH71p*?w2sE7$f))typxt5n@6SJx~1tNZ)Q`{l*T?m}g& zP+8AcR_4kJGv)krd3v%uG1+c;og1&y_HNtWUB|n-_3rQJ)4lf|y57Ts_lVD<_w?jJ zlWC0^0aneJ6F_0c8v)G1z;YN1f<*xq%UBky2v!BK31eNbA%MjgTY_!DjsS*b>cR{^4kf#6|W k3K{~083QrKxDm7kh(N}z;7)KaK%g=n1doCzf#-Su0vV7}@c;k- diff --git a/data/maptex/lwtabbar.bmp b/data/maptex/lwtabbar.bmp new file mode 100644 index 0000000000000000000000000000000000000000..463491ba7557e3d990ae4c7f739858091fc695ee GIT binary patch literal 5866 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�PvyXa%m6DQ)%nWaJzDK`t< zhbE!V_=+i*MCl==nqCREfGXVkCZyreTrPT+C?ufmJ@pCloO;e#_ypljiY$|IV5zto ze|%((LW{uA!LT0a3Xb|$38oQM)<&3tVLrX^6yW)KK)yPM3IB^+M_ZO z4e6^?xVXBy`ug=N{=U4twAP-U zo*o|`9~>O)?d`pM`SSVm=h%qt_y|6wwcgm+m|TCd-#?yz`*8N<^7Qk?$<_OJA1B9` z_UPj5aB}+Ao*bOLdvkiUe{#5Y{Py+H!QGYJyLafnwYA-Q>$~e4yZ3|L*27UyjP#>X z@_1Bij~+c4ZS9Pm{K_Y-y z#!&D`@K}JFFt!Cx1gIF}55ZHxt^kE)JQMsWK-n3vjPaKMrZ8Y7<8Q%h0lZ_tYsMP^ zoMpTfAPkHn0Rq5yCqP;lhzH|LfD|zh9>zrQUVxY}kTJ#w!AAiS$oM4qEchZoP#NC@ M-v$2&uCK5E1??6F1^@s6 diff --git a/data/maptex/lwtabdrt.bmp b/data/maptex/lwtabdrt.bmp new file mode 100644 index 0000000000000000000000000000000000000000..aae89cdb0251d8588305649010902426471c0da6 GIT binary patch literal 12520 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 literal 0 HcmV?d00001 diff --git a/data/maptex/lwtabdrt.orig.pcx b/data/maptex/lwtabdrt.orig.pcx deleted file mode 100644 index 6b92b81d316ec3f1aa36a76cce9ff54d14db1a6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8713 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 ZwO`EsZT71fgsMhWiH*#@n0@{F^*^i9ubcn? diff --git a/data/maptex/lwtabmic.bmp b/data/maptex/lwtabmic.bmp new file mode 100644 index 0000000000000000000000000000000000000000..95ab9f174579417115a54b7a6f7b8dcba370ab09 GIT binary patch literal 17098 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 diff --git a/data/maptex/lwtabrec.bmp b/data/maptex/lwtabrec.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e276e1c6d36e4f556d8e90c7da34d8bdbde38e65 GIT binary patch literal 10460 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 Hrtbd%Q$+h} literal 0 HcmV?d00001 diff --git a/data/maptex/lwtabses.orig.pcx b/data/maptex/lwtabses.orig.pcx deleted file mode 100644 index 61d42439b40497fe142748242300503f75c26724..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15100 zcmb7LEsSK>l`exQ(I%2XK!8E2ySlrof2O;qtE;R33j_oh1OylaEC?_N2rw{MU|Ay-#U(y>mv>j!_}pE8adUUOz^7ddht2V0eUk3y9w(2}$yA@^ z^i-du9cQP@*_l2|?L0qA^K*Tc=NI}UJ%`V_yhxW<`YiR#>#KBqqtEi@R-YsZC>~;HcY?`z7p0EXsbdn>FWN z342jj?v-^M4imOnO7^8>pG*2XNxziz3(7y5>`TcdB&U)Df=XWE!d7awoy};kR#pnB zR^_Vov^A(_$VMwrK0J17?~nqT0T1ix{itcJr!{T+R%~HKT8LJpg{b50jf96Cld!OH z!jim>)_%Z})X~^m%VNtSRd9|L=v$NY*}ZSd?`O;cS!K=yA8Emb1REvrDFKrf*d{2s zfVrE;4cOA+`ve&HeS6v9`$pgQxJ9&x1c?weKyMwkwRzoF=0QK{IXiz-HbEf&}0bXa!P@ z@suW`)M8&>(n5A#(unTclRXMU&j`YkGxTcHot(*j&8S2yEM@3Ne|Yzi8Sc+^ine6&x&!JD1{$PkPSG+=iZ@C%t` z_^^f97BTShBBCEDpr~$S!V!o})6tiXGCnjeFx321=*( z`D`FDr_wAOZr|~?C(wr^D;&jVr#q)f0XH0?g>89hXPfa7Af=i zbbfuy?@y+)vy311U(bb&O(>McyL`umom(~9tQapYGr~9YiXFdxe`e(r9}pP4@QFqvC_4I%pvL_Qu4| z9$oR0;xQXYaYQdWj^bVA&%sJYp#0qP3v$jf`0wx!f=Ny6Tu>YFOI~_KZ`;`1+TIb0 zR2r##1iIe9EUsX8f4m zg@{NkoUmouOyF+X6OOtbhJoIbqk>;yZWo?X~ktSUmdERh(zNv^C`Ptl{vHX}I$Cd-T{f!zQw zltoDx#bu-&awvm?um}Vg3Ity!{mE>8DY)`q61Wfd+=12Tp$RUE^o%;!bp|>hM;ty*NfGfGDd9ChVG9H%Fz(}KHVdqG}-Gs-mjRStJ@LlCYY2HR4P zjl_tylMtj4F%;BTcQw3KK`LZx@Q~(qak#V9fM4~e84|krZSdd0O@>w0B`NMZyd9P4 zBeRdxBG>GQVP||vs%FbbbBPt8m4u6u0ruXKWC}M`C`iNOIUVl7@P<6acy#bU$fOJ* z-)gwRcQlLRW*@WQ8I8ZYmyk0QXQ~hu1Ou`PVGre(K zAboHn*R(7W9G6DJ9f-HSX{6h-R_+jTPH5CoHENX-nnod1u}BCZcvSrcipr>3a|Oy; z7k4hk!x7?}G^UZvAR~k%tpM*%i;SSQ*%dn`ts+#Tx|T(JnA4kE=oSxQdTY=kt2s>D zJ0%6iH7!iaHoNsTfV5wxsN;Mv^3?=#JfgEu^dN&mUT$MLRYz%SJ2%X3vKd%;hnt2_ zmF{R&MFu!6Vztxn=Jt3Gqa^xBxMyVDo_iJo-6wlkli6K zF&&W_hnpxS6&I06Ih1HlvjaxtqD65zNgwXz=E&$!R|gYos<6}1U~^-Xv9WFs5rHjl z5P|eLLLIK8iq3-N+4l)uUG59=G-|jVDF|dt7B-S5g?5xyj>1sVfL)xfKv`uAcQxFM zr1xg785o)9cO5XLkcvcBXk!oI^GyKVRDnW&GAt$yA7P(bohR6{ko+|ku~@uU{S&H; zVgQp9ii~z998#X5R*Ak5+ITcYj*%59kDe%4gMlwSugqJ@RDqu7Nh>iSR~U+esq{_` zu%zAyjHcDP;+$EZDT?=4Tq9{%B8|2PK?E==$r_j#Bb4A;ry$7X>5k)5scixiK0?ze zcKc|$kS*D)s=MM-LC@-@s_%f)xu$B^bayH+NyShr#Ak$u@Y={@2@M}$HhNFo-6vA1 zRe3jVRza7$f+)C3HCU=}t1-KP$r!igjGZwED>wjyvOY~)cBSEAI!NlrpsKrMb_RT| z>IWMq+?m8+-s`xuT61Y`UE#(&Kn^Gcpm7w zlcy#Mz;Ukc#Lu)AjASmz^FP^z4^X9@L0Sym`RDmbCr5`;0h7Td4>2C>3XN0HxTa>m z(QyE*gPF+hnLw|%1Ms=`Ut9e#Vi?QPi_mOr=%S`(TSywyxyL92iB!b3eu)%FRlF~8 zq3Z1uSdwQ1aMb8rvLH+Xz?uy2RSxziwzJ8-CiaLV5%Dde+xah&D>TZmG zS1;JwjGkSoc&UA?t0M0Y-W8XCxVgm9dnqDY)fE{bH>HV_7F>QZ%_D^{)@=}4aSY11 zjAYrP92o?00*Equ{aC)A?-{`3Iyx`&pvu5oXs;7`J}{?_H{0c zc`FlR;NvROv9QeT8QJNuBB};y-K4Z?;#cuvN1(9jxG(o-W1<+*3p@|^ef8+R&L1^e zS^B7>gcm}fCL61Sa#!3{GXYl@JZd^IWYeEKxi=c_N?1_4hQf@#nWE4@U`iNYBbNdy zepj5fnph2iU82cy;EjP$*SYuMLiVEhWWC65>pB$A)>%R^$Km1h;VxH2ica0^n$jI` z;G!ub%G%r|_32dxL?l1EcS@%-3B}NQya_;k{<^MmU{!?-ZRak^cRMMhakP&B(5F+G zjrwmr=VLkE#d?VNQ0Wly*;SQYj3?dwlGD?=n6Uf5fSgTLO5a|5!puQ)hYlX0zAiXT zl>ZyeUEJc@`B-$)zJQ0_3bTai0^xuMC!7lL9b@|VoX*vA_hS}op=1723KutajtJ{L zFe>wC^j&=>#;J`~m`oFgN=*&7+G zUHQOhIa5PJSqox=I;4`tLn$cnb}_6h;<4&<8NnFOLy1*W2haksz(*~rQZh$irhbPh z+SJI=?dWnP)2u#%!(EiB8tx_vr}G!rO$t#6gb=SgKogspeKp`2ZS!>u9rducF8GB* z2?R*~-GipO*sKc#9=yv-9oCV#1-gzXpcCXm$BIH0Q&!DbyHpu(dS%)tTR{ zw^rmEBaAO08DFH~+cA7mgRk50Efc z8o+H^?==MmD$bVTkUx&Hb4wf!#LIA%6KL+3l;4$(@3BhdZgngIqUFlkbv60oA~TA| za54t%5vJw)d9=hb#&3$abRv)3+f_p#F_UE}cQ+g9z{J>%cj<0y6@;Lus6CdA?yP(3 zs+y&g*)YuIsHF2&xs487xf_!to8)jm&h)ye6}A6GwFZ=$IZ8XvOttGJ|*ruTkCD z2bE(QZV<0_fWIcex@jRBb_v6cKz~JIIabbKHhZpKIRRAMB^W#k#i8=y5rdQ~hRSge zyRolZ06A@`#>>u*?~<<{STu(i-OE0xitG>Bm$O5-;zduBV~e{@mge$aL~*%MR?BrL z3np53qd_;1`6q`8329ELL}_^Cc(~*(3zx?vzA0yJK1S^>olLa}yBFagA@bCS?vZiL zgDBlqR}H)e&ym^nq+BJ`0!BA*KMbV}umxHa{8-I zp^)w5Y@3r96CWOGOW!UgQ4D=&)GI23l|E#3!ezR3yj_c3F|Dw3`7A?tu+TzRP7Zi< z6|YA&i)NA=&ivRY7*s&f@$ws7 z#lbQE^SmNEQA{jsggQ(_jOrk(5)>yWbi(YXE~J5j>-PRTvoxefF%+qLkE%GoYDqyG zk1Rdq`e)upjKdXJ*&^{hl{mM9P-So)r-VMdiCE~nAY3;`ycd~z+jlg}VKKu`Jsp@b zVm_wBw{T8O5Gr%0@R*ie z(|WY%Xb&9)A|bEKbnJ=%$32)_-}~%`^}VMzf{8DQ)TN9)O?D%d36#=}j+7;BRad*G z>p~I-0QUwf4)~M_FV%j!9KGdS~Lvt`uVfCdYo?QHAU^_<+Vv%D5{> zAvne2^A4kEehNwG(~jJ%2OKlXNn0tT6%4)uhf_B3+DktUaC#m`FWr^cS3P~)0M zG<<~cC@2d)Q7Cjtk5HOsZluHCysZK>s7%N~<1W2)^H$eaG`@crQC`caUTiu1e-a%d zcK;U)7id!*el&wNTxBfAR3k?-Xpy8|GUx$-d!_S95!LRUMfBp40-gskw zfB)+0>diObeCw^Z-hTV-ci(;Y{rBI0`t<2XAAR)6C!c)w*=JvV`Q_JNfBo|1OZ@w* zufA%U=F?9<{rKaLpFMl_0_2=b_=PzHp(4X=v!olE&)%tNPXy^6QSU-yet-XF83j%wMV*wT~sN*$_HID^l zy%w>45$l(+fQi?yV*NT65cB#?tpAMl+gJeB>vyq!9}BR1!DL?l6$?i3f+@ZJ5bJ|j zu$>od?e$?SSk~*0u|Ni|KgR+Ay#6~D*y06xc>PZ-u*eJK@%lX0|HcB%yudN9|BLmv dSYV*nKVm(P^&%FC>h(>mZ)5#4)~i>q{soY0c2fWV diff --git a/data/maptex/lwtabto2.bmp b/data/maptex/lwtabto2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5886cda91c156c0a6447d30f22ba8a48d33e07f7 GIT binary patch literal 2152 zcmZXTF-U7y7{~uH$-TMWXnbgz_C;PU1nPspOK1j%Py){(EmC}Kh71-m2wKRH!6AbM zhfsv)kikL3!NI}7!NI|TgHQ(t2M31?fo8~%Awvc!4i2~9|J;19kJpeN=brDJ^PT_s z&i}ms>9-in?_&h`UA{gD-w7ea1mN#5kbM_m0t~{}zv;ZM{IcEo>z}tj|M@2Q=8sXR zSS-$OZf<@nSVu=k&iB*Z@Y`QIO#A64+x_pCNFr;*F$P%4$My1I&5t%j|wEwoxK zwA*bQ930^E^c0tum$!@Th87Mrfvb3}Wg*8`L6GiS4%JT9u6xL2Dm&;IAR#u=?DitWK zx3adj2Bli9LgBqA>+9=K>h(I5jg1W`^o7!BG@vw_O(?u`g&tCNc6Ol98wx$9?CtGA z+27xXLO&_=qjGq72!*~=PEJms(7Vdn*%=giRk^shfI^=u^t5t)eGP^0K%w`QySqCm z_xJZu_+}Ko7p2?nLh1E-Q24%-!C(MoI2=M5jYd%T7L_OQy7DZ3S6;;T3jP1V1EOBE zkP_I=3NsRmcy=KvgoU^P2zyRpTE-*NhRnB9aAoe4H!ExH!jzYk`ExRdv4nhcUQ*(( zCb2o`dnRU^IX@IE)BY&ynLlmvGIz-PM)skO*Rnp)F*S)rWk1e|Of-ilaYtg*o0w>f zc&^DYZM4NCZc9I9VwN{;^3It&NwYuC5S9L{th41D)W)-hr9UM(Eom)@Q+p6|MF-a~ z?n<3Bz94&i8DnjNSlH;(xk;JpNRFAwIfHoETaXxYGwuk17REv*5ATa()WAEmMOW1H zSr<#jxF5$X=?CWwv{EnQj+qxVHKPV<*0Gr6qXz=5uF0iiw$a17aBVPVO*C5GSCX4v zVC^|4E>J^8;>^#SaT#MQCpwwKDa1^l-f%vhgLSsVFT8(S;CjY_{TIwWw$zC+)f+N( zOPbh!=i_|@G1e$9`!iQW<_7!P;?MX*GiyT)tSNoSnmVGBK4i;#Sd??npS-uAZy8?& ze&e_;`>|euhZkj^xq|aqe@4EwAC=tnoc1m6Yw@Zpnu7e)OilFQD{1*2sbf~!*8<-x P_0so?LR!B0t`YhdYpd;> literal 0 HcmV?d00001 diff --git a/data/maptex/lwtabto2.orig.pcx b/data/maptex/lwtabto2.orig.pcx deleted file mode 100644 index f3304e4cdd00df4ece3f59772797dc1fe22e0ab3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1768 zcmb7^FH9Rz9LHO+u&hfe5Qqw1Qh_K*Z$Tg`5C}vCOAr+Z1fl|gKvYarR7@ZchzZ05 zVgfONKunO__3nCYp^(ybqaa&O~?4o1IEByo6xz(xW+0pA>Jl(Tuir^+t>(9V179r z({h@S_{KN)P;NO9M%~oSgLC!Is$p(k?S-ZX8`TUia!yK@>Qf?a^&nLB9ppwfU{9RmX23PM=ASV0zI3UQ!65O4*p)=XgC zGY1ijXI>-32+WXrKGZ$Lu0!yX-Xycg3O&@0VYp&8Ejt1$(~P*olW>r); z%F2qgJ=248NsOv(n}Db?E2`cwQ>zo%ZV4e_CpB$2IT|~o2_4ro&|j?YhtGf1I}zM7g^x$ZCALa14AhGV0(*B za}k0mvo;R-pDKzvze{jVrg}0XDz?Gv9h;S*xz2S zlsBvUrCMd@u(mho#(0MPcsPh32k~eaj~?Ukh|gpkPbcwo8b9HAil3ij@bZt5NX)$= zrQmeJyt1I+)WV{IgoPyqWf5>3VMSS0a9CkYSywg`)I``+wiHxM*j9FwT?K^|_LO}E zWfyQ|!Y2inBH${8&&r{KyAyEN!WRWMD|}VZ48k`B4Iq41&@BSmL-?Vfiv%=}5GpMN eZ6=_{guXIR(1F6EGE&A08daDoPs+1`{`m`A*%r6} diff --git a/data/maptex/lwtabto4.bmp b/data/maptex/lwtabto4.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c694f56e4f1dab95656f150e1e1fb9f1838c4a01 GIT binary patch literal 7106 zcmd^^KS*Rp9LK+N%58G1v5;UPoZcx>^vHr9xS&xui!CHbB4G=2$Yq0DSXfwC7_g8a z#KOWt#KOYD!otGBfQ4`t78Vv378Vv378Vu~EG*2-d;8s)H}n3jmoBT{o!=YR*?ph= z%*=EB@Z;xJc(=dmfj?yRdnE#2LC8Aa0(5-u$Lmm?c;dHr@S*VY-0J6lx_|on^|!D8 zycPZZ{ms+U)8EOw+}POo`iEB+b=|+N_NfQ+CZEo^H8nM%wY3$!y}cM59K_hz7>dOr z%H=ZV=jXAsw1l;_HEeHhV}E}iM@L6EJ3GVG)fMjU?!5N={2a%}$2d4R!0zrYHa9o1 zy1I(R#YN1`&3R*~G1b`WIdZuiIyyS!8ExSfYq-QRPO*qX%wY#*tYb>{Okf@blrSQz zevG0^-nYrGW;7w=oktsrvbQMvCow2f$V_28Q^KT7Ia5YCTf$6s60=Q3nQ_cD7i2~; z-!h1W)&Yk_CX<1gY&Huzcc&zzi`fH^%q1*7H+qvi{9ad83W^70alnqSQI^);BAn;S5< zx3^%_Tx9O=@4-AgJb-z8d<66K^aRmc$^oMNw_f43pSne*5?=MO!*A7N{HnfB^fczg zJCXmUFOcDeKH)sN?!D-fzuD99PUOU}$Tz6tm^S;~9pgn__@i`Yd*t(~afY&fUz*B! zO)rK-UcIV@PSK-AYw(ZbT4#(pc@CnpQJ$F?YE*T|eZ#POE|QVS%^)ecI?p0$MAHhP zDrq}oyh=l=U4*i&%ZH2?Ps^cNKje;)4JQ`hSsy}AGE($>YMNc8iu8}Zkr-RMUmnN! zr(M&ubQShfzt4F`D*n+o5@T!kt7B&j&p+QepPI?8Qm62*>SE3Ik)6>#+dj=MP(8yw zva7Z=*cX_=G4^Q#jVjSSa{5yDG@<{(J#u=kd!~VbI>9}A2Io`zM}BO{Rkk(yr}^nh z)0I^X{*fPBave_PpF4wxBK*^9p5dO_ha>$9;pFYXA^kCHUj(7bE*$++XWdHJdmVm} zYoEE^1>I0j}#4BHqBJ4 zo~9QdrFV)zm9*+Pv_fb)V;JTIh?$@GMf|0qsp-n&7ipi(%RVO8|Iez&d0TB$yJxUU jcJE^@xMxoF>UH%~WmTzffB8nd6>sX^{?ac0X(avy${ERJ literal 0 HcmV?d00001 diff --git a/data/maptex/lwtabto4.orig.pcx b/data/maptex/lwtabto4.orig.pcx deleted file mode 100644 index de33bfb11bfd1304b03d40f7eac68e04bd0808a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4439 zcmds)FH9R@7{))u(q$~Es6ZfEC<&xTa!E@3WR({Ao-F6Ykun6vEMoNIlz{K9hWJ3G&% z-CHO+&2M4c{e(1hOPCd7# z`(fz*l0381IQPTQ{Uteu%Ov-M(7l#?#C|h%;V^9g&w^$FDu>-J$lu=T4PJJ z=;N>n+EAlcvGH4oByX}qj{`Wv;N#fwp2NB@csMoV_n$YAmznETu*@f32ZtU7FTM!m z5j@DL#vm_~m*`N1Q&1wWCa<#N)mRPWW!@@82J#B;biPKAkC=}^KGu93^2z3-$j6&E zkk`#ekPj2b(1}T2%Uh05WGRz3(^f|)RwH>eZ#guLO@05_kV{M`d1OgGz%QXRFsm*hy0KejiFR$`fZ{>eMT4y@{js0*>P+4v6ulk5^+gQLno7=Zw5lsfTA8l>W_; z(7X9N|MP zo}OM@TwGsY-{0RqJw4I=&CN}(*E>5qJ2^QyI5^nb+uPpWZnxX?MtVDa2z``o+xdL{ zP`F+3xGQeA#h@+DTjF?K?5~O4n&>QvW=X8gish^*Wkfb5(qyJCvUM@r5T%Bwtfy+t z)M_);Xr)@s@m6Deqn_SeO>fpR?d43nGSOL_+>&2Vg-9tHhp0PN2AY7VYgQH_!>n0| zVqsA`tP->cQM0TiXc?+OlnHAUT7xJtRs&jxnh*uc+JH78ik(GU#@d2tQ&_Z>tX=3m zM0>}gy=Lu0w6m;3h+tqHLj(Zp14Oj22oKgdL=>?I9@Zyl01;*^VvO|-x`l{9)&ukl RdV~m6)^F$!^cQkn_aA?*p3?vT diff --git a/data/maptex/lwtabtom.bmp b/data/maptex/lwtabtom.bmp new file mode 100644 index 0000000000000000000000000000000000000000..75352eef1cb2ea7cfeff1b34265fcba6b81c2750 GIT binary patch literal 17380 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 QEyH-4)muH|e?{^B0s_-AmH+?% literal 0 HcmV?d00001 diff --git a/data/maptex/lwtabtru.orig.pcx b/data/maptex/lwtabtru.orig.pcx deleted file mode 100644 index e40b3ff9fdfcc929bbb4a1e6887da747ee26e83a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2142 zcmb7^FHl@Z9LEpQp;J18h=@RBXD-aXr-MGBu+87h&Z4+Ls%Bicpz%##H%Pu5X!}V>Xw$`7<}xPd@cM{{1I6nfpC2 zjBj`+`Rm-A=0@Ao{LplAGx@ae?gYt^%nox?IPb7_=lN@cQ|p}qU>9T^@7`-0WR9aQ z!Z*3`Sn=!2pqH1%cllssaP6|f|B-8FQAb87$U@4Au}J=peGGt znYPk_RN+VhA>_QnMLR{566Pfah5snCwhwx3_HZgNK@JW6g)9!0ug80dt~@H3+(<>V z3PrZ!>@aOhhN1Gda-9WZ$e`W93B*`X7QeQ8t3XP~EB#RD_fqxY+tC*FEc8Y$<=(<9 zSn)a4?!Ix4(F=KekQs_^^jE?|cx5Dxu4H7cYKMcYpsXAn@*zLc$Q=CDQ_&4ss(jWL zA}FfL&pI>-5lS8!;1whIkSpRuU#eyx)nlG)L0k$6r+3L*$#(N2$d;PWjKPYbdpJbv zMBXS@B#iMD2NeGQ)JpR&rlEPE5=s^y&T9%Z9QWlr;#?(Q8eIoXY>?Ue>UB(kETaR2 z3oS<~M)z^Lc~_0I8ZT#4G;~$p9{j0T=nZwTA{%>lLQv~jZKrN%BB+RTg5jCYtS%ov zh_N()9L99R+>~gPx^owjs=6Y9r%-$v!7$Tqj{Or<9o-E9XjrB;DWc|2!3+0fif|3- z@et@DgzFYYg#nwChk7Or7cQRc#mc-5dAq;GL5EN{&O6*r?k`UO(RHdJp>Rr?cYuJl zz*P~;dT*whAk1`qvDFO;WtMmtuE%HkRZdlvYkJ72vmUl@dFRH*$0sHx8jVJ?*_@l3 zYqeTSOG|5OYa1IITU%Q@J3D)Odj|&xXJ==F!QlG(ns2|~FUxX&e}8v(cYAw#b8~Zj zeSLLx6+_H%f-CQRy# diff --git a/data/maptex/lwtabvid.bmp b/data/maptex/lwtabvid.bmp new file mode 100644 index 0000000000000000000000000000000000000000..396e68dccf5b66503d92b7e4d65058d2555b8ffe GIT binary patch literal 5314 zcmbuDKTK3v6vofJ?=mwk*{~aSLqQ@YB#Q~jA`HU}%rKKkK|waSOF_XV6eLnmP*6~~ z2?g1hECq#yF%}jU78Vv3Zen4gg@uKM1%-u$1qB6#*;rV-{mwo2yg%~>j7t3S=ickp-=63d z$rF0`@FCs3dzTIm4{2|2k9Kx;{8&6DkIm1Rn3$l^(NXFzPe4`bA869RV26f=7ioBO ziAKg(Xso_U6PiQQVk6ak&1m( zjf{+tir-Z=Ha12o_FToDs4$nLs@LnJV((O)PKQ(r3k#%LTwEj-`>k4DUMAJb$_lA? zUQ}yqYouCVUnkYZ#s;Z47pkqTEmCc7ZfXJ3q~h$V9$?;8oK@AMM~_IwIahI}RZo#271x1^v#)xIys2Kj zdPOR(85P%y>gec*RBw@671x*Q{rmT%I!4A-C&;{tYf<&#!v|7*M180}efmTyuAOU_ z&~q-Cw&~cmnKx}aZ(3&FwoKEsY}3q{rkyjhxI%W;G;oDn!_;x@DH}dx8u)zpF2=xE z7!TuOY&-+c!SnFUjuC>6YrAfD2 z55!kx&H4#X{c|JCBRHDuqif)OG4=r7+Xcp`6(x+tS(k6IYblwXF*S@*5bg(ZArwcI zurTAE&cHUCm6F5@I2B^*o{E zGUH)FXyIQp7r{R!tYEB4tu(`A78%69!9yX-XD_W3NuGEpR2HMa!=3^yd=N@}2eYlD zI@4+OzzfeAB^6^a(-BDBOkeH$X;ULsXmpyjFKUiRW?JX;TGnBInuh9tBpN z^Q@yOC%fs;LD61^_kXcTGodF}5F9crv?s+i_a9Q6q+wGM(ed~}{byG2vgqo15<9w*oDL2Lq{n#e+ zrPY@6IZ#JE$h)c8Wlo39u2~5+D#|C>qS~Tb1Y$dNVKPECnAXkUzV8uSd6EmE)pY}7 zcad^OP*!*fLOW@$;CcmD{4PFo9oi(z+;=TzH0!XH)isbxkL8+UQj0WzFpL~wWb2cG z`)3k!^%eb1yR7{Tbv7B20MQX8VL+(|iX$+g*nh z>}%6&lif;p&1rHa5gB%PP&8SR+1nqhVpjz28$J!^T$2y?B0;Aup%SpmV2+R zXk4w_#f9?xK8B?Dm7NoNUJt{*B;k~2eR=Pd#KMU}oyq(QwX8q7wq^YkQt?w*3oEd% zuqf;35S{ZiKm=>^4=O;(Cxb*a0&*AiY?E15S{k@qu|m2~_s-7{dNXs6v4 z9VWN3W%IzqyyxOd>Lp35<{;~@bb?G~Te_3w6AABR&)bQm`x|EE&*%3ynpGj+*S6?*$ikW$kM_e zIeAHb+nnI^l<;HbgutHmI>q=EA-5_pt#>$d2j-QXxO(0DT4XJzz`M)&3%q8>QKj-{C4V|BnHg{{i)L BSug+q literal 0 HcmV?d00001 diff --git a/data/maptex/lwtabvid.orig.pcx b/data/maptex/lwtabvid.orig.pcx deleted file mode 100644 index 75805085fe32edfdef6eb9e444cb12720e4f5099..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3806 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 literal 0 HcmV?d00001 diff --git a/data/texture/amethyst.gimp.pcx b/data/texture/amethyst.gimp.pcx deleted file mode 100644 index ed1e5de950e28964535deea889166f857c0d5acd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6039 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 Wv-28j8v4YGqOOwdpyQA)xWK;6>bH(RSs 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 literal 0 HcmV?d00001 diff --git a/data/texture/crash1.gimp.pcx b/data/texture/crash1.gimp.pcx deleted file mode 100644 index 786a342d54c9a40217c698829f6d8ae34b3e964e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5322 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 literal 0 HcmV?d00001 diff --git a/data/texture/greenmess.gimp.pcx b/data/texture/greenmess.gimp.pcx deleted file mode 100644 index 5c31b499f35e3142cf3fa5923a0036172bae89eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11056 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 diff --git a/data/texture/lumps.bmp b/data/texture/lumps.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e9f96cf95967f231e24ecec484bf4944b5edfbfd GIT binary patch literal 3978 zcmeH}KXY5h6~*`Ndjv>`k`WOCMGAw!5&~f;m~beBG#QwTXc|&rii#kR96K5oDpy%bE;1t*DqOg5;o5b+gg=Dq)XwkReW2w}kj5OXfVXeYz2~0$XR-hA z`D?-dp64O_oo{ax%ffsxy}1;^t@X5g!#95lA^p>dpZ4!h{`SRx{@Z>0ee+uLpFi5& zyLXq)&(Axo(u)@_7T&J>kaeGav7y7WKivJ|FOM+{Ha`uuEBm2+^MjDbo8jQ-tI${- zhsC%Ndg~vB;r{cmSlJARAAA!U^`lU$k3ze1&Y2U=UkwK*FT-&BWvEql!(jLG(6~Bg ze=XFm%H}i9O+u}-69yZfgvHWE7>+o5WhYFZeaE><818-+4kj;o|1o}c!r|F>p}lq< z+D+MC4TmS+fLq7jh|kS1*!c|qXT0lR`v{I7!|`9>#Ba>`ufxIk-}uRvTy^Zc#Lk!4_#7K+#I+Acv?7KBV#wo_a0u@j zoO^5Fn$oYyxe;eJ!E~^76bA4+fZz1&Tm0_g;~8fszsSR{55Fq#|4_jGWN+KL9b4J@ z*0riVio?snhQ=y~IJ6dfQybeI+p)Lo5BAp#n)ZfuY|$RGpC=UOhL;MQuv#U33ZL7F zt=PP6;BC(F6P|b7=QNJ+*_sa-m~0qZ<=~jE)osi6?1uf>7VLFL-L_@x!83aRZtYWinZ7W%36WC7d zy5sNID){=Ver3bL95zbHhMrrn8NqEE-UGXB*HLWG-gO(xRw3H4oknqY=FS7&29IpE zBWvQ(CyJ(Bwteh8VXe582$OOgCnnM@8_vsXH5+Bpq8i1Zi=SVcn~HmyI}$c|1)Fvo3Z{ zVNjiyg8ytZ;{X=^v5W#2s%N?HmWg0B_N?JHu;6ME3s@;9E^wHe z5~27vP<;uX%XqKY8eD`pMZs-2sU}#mg?-hAV#fw?$UH(d3h`kjeeT+uQub2~4vKG;YmAK{jE6!xf&>FU0gV9@d-+pU< zvDfW@x*6D0_It4F6VE8G%92>2wt7eWP$~2Go@>RtOugQ)t9BPl_p#K$(lz2tJ>->F zSi(Y5JCvul1OX>$r zuRc*6W9t@kYk_r0XRff5qN@{yPd=uIYJq7~RMM2Xz)PMY9TUSqlg0Db;hWfOQDL4J z%@%c&Y|MH}s$5i67e8grze5c?0ezeN516Z4g=CYgF%)U_?(Q%`_J9c zkLs>oER+4zt@;#x#5B`Xbu^PT`Bbh`mM$vLdwf>;{aDAMdPNmL-eM~sx&lmQzAGnb z!YUUj{^VQTpw6LJGfkBumsC4=qEJRbIul|dv#C4BQ8PxW&-zXspZ2t)S-`CnLiAhd zA`)d(bEBc0$)6@3$g(|TCI3a=3Y`VrE(LlvSGMW6GJRhzrXaNs+AXH|bt5i-)(u=J zNX(onlc{^mvYxH+q}eK4_Z(Yytly?Kl+nbDwv+th0t{0VxCbH(R{?s3KJ zI?Hp8c6q{k1rnpq-^-XU%%Q|JW!&pt3d`r5@&(S7PMJ!RuxAfr*?p=~W|@}CUhl%X zKlxO~Qr)LXt{GEjX8E*Db6R&+bYvN%em8i1c&2ru&*D~g^5UMLiv6ZR5s;bJMp9Qj z&okAbTPW-1K8LJ2=Pa0!@GPc7H7~MTWQIvtc6LYmYwFY3?`3}?ZhM&L5+&7*gig*^p wrtbMAV$Fdy=HDJ?9{Bl7oPVERJX_8k`#Qgz>Ol(iss4Al2Oik(bUxVs0Ar#@761SM literal 0 HcmV?d00001 diff --git a/data/texture/lumps.gimp.pcx b/data/texture/lumps.gimp.pcx deleted file mode 100644 index 87ce48199eb06d452e47b012d29b2749c8185b11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2549 zcmeHIF?Z8e6js!S6ekv8a_Tf z3;qJVf7EATL;LtkA2NK}zjv)+#eCpI|7bFD20X~$yn6eKwf;g|4`XgR(ckpD9C)m@ z-d?y}*y}ZK*o+Tk^j1^2AWhE3*&FRkmBnGZUJ5)wz11R#E0TLL8~YcJE^JLYqmmT^ z?Jo^ixbkEy1LHwb)?1Bi;F$ww8vUtBpl@1SB1k$3S47skkzy+)QJD?x?{Ta>;oJ8?zXxrHK<$Ax1?iEl7FO z*yHAGU~&ZwrZ|vk2Jk>GlM{V54J7VMjzWF4osaven4T!~j=r zo;uU_T@%A(r1hB5xG_0uS3C9f#vv+)(1ez91B&En<4!R-qEv4Wx9?TjTcbuEdC6Iz z0S~QCEu`jD%sB8z?W-H-H+s$0QNs^Ybr1<1DbRycGRFBPsQ!mjT7=D_lxpxeM4uBx^^P??Qtv76;EHxh|8mSbOT*021(aNy1dA-=k*2Xv- zqdUaR2nuBff3-6lwdq;|2L8_2WX-BoJ*pCg)QQxd9S%_;9NP*TW`@{P^c3E)MOfIVS67b)1q!yW;*ub2y*V;yt;^^SI-@P*n6X%I z?tS%bPS@F!-Fj!KaDUBR)7ek`t|-|%dhWYT|9L0c&E{U+@AWO4TZM-eH!0c6I(wOP zPejzp7M`{0V%e_gtg~D=UUP>fyO}9`zf<4I?yziUboK*rwkK=u%YJt^TNn~U`%%SDO0Go=dncm%tQFPtTxZ#SLX-+8yt{;> zVXv7jJgWKk%Whd`eA(X36e@bIUveLB)?akGzf9uRl6_q9hh_J}|K|VS{-X-K1I800 Ax&QzG diff --git a/data/texture/marble3.bmp b/data/texture/marble3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..93a2ed980c9bf0c4e321bf648e629037db0b37e3 GIT binary patch literal 9052 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 O3=fZuj*d-F&;B3FE`a#} diff --git a/data/texture/pebbles.bmp b/data/texture/pebbles.bmp new file mode 100644 index 0000000000000000000000000000000000000000..48e0c65f61d63f78926e50a6750ed8b8f2565b14 GIT binary patch literal 18554 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 TitS{~-N;1~wB}!)$in{zI^*Hj literal 0 HcmV?d00001 diff --git a/data/texture/pebbles.gimp.pcx b/data/texture/pebbles.gimp.pcx deleted file mode 100644 index c132f40e364e5d5c79bcabd1dde36590c05ee35a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12568 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 literal 0 HcmV?d00001 diff --git a/data/texture/pine.gimp.pcx b/data/texture/pine.gimp.pcx deleted file mode 100644 index fc45293438b9c80112bfedb13cb9d1d5d5fea2ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4159 zcmeH~O;&?26onx#A+=>GoiT8z3vlQf*h1IBCR~Fjp)>Xr?|Xxp(JTy_r6=_GxnZlDIt6Ne=VYtUVG8R91JYaCg8)eDR z>aJL4hZKHxQ;e?}6Miu#GI1R2w&V;)a9K~Du=>NOI0Tf;I(02}D2ariP^AdZN330* ztAXVfP@3C899%4`JTZ1rkHWICODi<0Ix0v@xIe-o-Xz@?w$n%|bQ;T`D^gjY8;0$| zIW$%XP`MFdlvn0oKfg|_6Vt|!u>xGEf{T1D7)umav{x=8m1l6Q?HODW@Q9cvut(04 zSPqs=OH(hc)F2EFO}!jN6JWEDRC~g{@)eXc=F&OCtb>=Mro+lE7uXU!Zo7fR&BM*> z9En|I&uZ_QQKZA>nS^48jV5`bAqZZRp@|`%`ozy>-*KS)5W`0IZsi40B+?_2@#LPJ zMqyZN9JOf}e5QekdY%gq6&>*hlA}b>qYO!kpMdP?U|vB+ynZt&GUG?ua>*X#W--WT zgx7xwB4}P7<#c-4=v&|@Ill}n>niK&D!e>}t`1!lUY|o#g{}#q4x!oYcA?HfGx@u7 L8{RVThcfU6BQJ21 diff --git a/data/texture/poolbottom.bmp b/data/texture/poolbottom.bmp new file mode 100644 index 0000000000000000000000000000000000000000..97bfd035ed187f79f525fecec5e053c73677deec GIT binary patch literal 5052 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 L^#9fWG6VkwRL%5K diff --git a/data/texture/qbert.bmp b/data/texture/qbert.bmp new file mode 100644 index 0000000000000000000000000000000000000000..32ba12d53789d3b50388cd182a84735b547a1ae6 GIT binary patch literal 4708 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 literal 0 HcmV?d00001 diff --git a/data/texture/qbert.gimp.pcx b/data/texture/qbert.gimp.pcx deleted file mode 100644 index a879d77ca20fffb29aa9b2f09d0dce24e8584f40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2981 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 diff --git a/data/texture/redcubes.bmp b/data/texture/redcubes.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c2ecda3704cf1a5eec4fae5903010c76678fbd0f GIT binary patch literal 8592 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 UnXX5XHW6J5VQ&>PxTo}g0Uj|STmS$7 literal 0 HcmV?d00001 diff --git a/data/texture/redcubes.gimp.pcx b/data/texture/redcubes.gimp.pcx deleted file mode 100644 index 63f58dd9d5f1d1298de3cf5078e3995d232f29be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5322 zcmb7IeNMhUR7xaucs4hMSudxVe02CERVy|-5WTku zN)WbwoG!XkwI7ppr=vXq)|C{u(4L5<$nyqa7Yox**at+UgaJ^h$jhjwi}`&|3S z{yo6q$jyD9_j#W8_xygpSK~eNvMBs|2)~Qx70=WD{TF@Bdzkvm7ybVZX_-(YJzNfR z{!NXdKoUeCiU>0sCF`E;;{wczA(04->Ui}4>wmEm-{%z~pMQw`6h>l=)Mv|Ai zX`&D{xOPNNPf)VF7p~PFKj&TN5!Wm!HAN&UqpibsZ7jCN;kVoXe9%PH>QD{#2JXQ1 zSd<6}m4p;~MMnm=!FQ<+5kC2A_+I|U7+f-zL@-4nXDGP?Zg#;RTiQE`b@>bK-R}g~ zz>M|LJ==m}NF@oa?Mxt+=`x?T61fR3hYj#uCskTozET>;uyDss<0~Q6zUnP&d<4GU zQ)Pq8l|wL51s~G5I;0BpLRuA>R7h0qO>q5`63*XYrQpB*Dk6_lk{-SZ!mQRk5$kP& zuSO&}*90H6WbN+EDk@p=R8Rv6MiOZu)IYe)(0d4`RzK~ODM?!nliWd=!F|+>qWV>s z4FuhA#~N8bzXm=$T~#?ea1y?OIil4;ltcX_Kb)#pHdxLx9aK7w4Mu&ZjCH^?%yz*yrk*O8OFi6JNGxzQ ztWAN?7RRQ}z_&|Xua#87#LqV`fboPdrfStW@-3`Gsdt3`eg)QinPATax~(bE3sZ%Q zEoEV!Kqv4$n8S1=_?Cw2RR>GAx(S{Fd=qYxu6PSqX3`b!~_$34_wxT1QHe0Cb&i1Rf~L~MhBT{ zsKZc7D3z3@Bk=pqC+-<|(WYMJxsc7Zxuvih;u^!J)jiYS`;+Z-T3b+IC_DqAICI_+3(?067@ri^@fq zY8d>9@h}dAcZUxL%poEG6#;HP*;@^F2omCBa2cl89fVt(y-B)WF(?Rfl>{{kA##xB z2cnkz-kr#+Z%|efGQP)Wz#v3r9E=jHJqDA6I@R8(rjTJZo&%`M?vf1uOJl-dS+dN@iqe9old}@L|_n4KEyc&ILx^S&U zC?K9k<`+vS9S>;mlYWdGlpDcI!kCl2`OS@q3@OR3LRzegtsF7Vw}Y}#E?2svQXXJCYA*ajb!V4))~AS|VG zV&W`ZUICMskQA}TI}gI8)PQt4$YhX|82IpHRgbAyLWOC4$LC-yY6M{5L!}mRKoeZqvyz<=^!beCB z^-Z1v8g5lCCz5{M7KF!@5?R`Tgd(Vo@JZRzez@d!^ye>bXeZQZMiUpDm6&^8n;pKd z7^pH~w=q~nTQ7`yw!;MK)n5Cu4U6GoG$~UibPPH%$C48!52uiW|7?K^DYs1Rp~nQ2 z4Go7k2by3uady$$o86l`Fw`CR{R6LQM+kSG|EGqKwg_qrdF& ze23B~JVU5G$dQ4Ju&W2=M643V=fmeGTVH@1UT38~(g~mCZ1|bw)kdOdF-T9%kNu8R zC=6E{Ea8*}Z<9C>j?js+NX^J*;LHrnN+xQ~{<@-te0VpRtK`^(Y67#t{PMHbF@N z1#XL;lmq`36sBH_@{CNKKG#IU46b5gyK3-&XkiIKUBg_qkkK$w9hy2psm6V=BS93l z+o~rO*7OQLBp#oNorT}7IJshx5b(pS03TvYRMZ$eEo|2*k6OSGF{KHHwg)C6!;EM^ zs!2JBl5&W?7@--#L_LJ0^8rGC^KQ5fbEo`ptHzFvMxI=fg6UH+pFuk~!l*c=sIcQB zvJ^z_ioxg>l94VAOUl86U^@Zxo}qNJrp5@+^-$h&4%(N*tAs z^ZS*9*>SkF)1PuQ!c@*_9FSSnzBY-cg?{%sd@P_Ro%|sSxWl8hgzJ?N*;?#<`E|S~ zNRg8A;IcxP-u6qBj{u5wVg73PGJ-qKstG)?@wF=@@(`x;HQd2cP~`RQ?E$yQ| zvRlT}z^5>_m)jN)8Te+eEOnr{{7>R2Bn>F;J}(O6C4mk^)mZy-t5<(lbF3q+T`*m( zO%7QCv!$Gbb|Bt)dLv8>5A1@u2Rh_9Tsz^YN4Hq!2#GW%6hq7C6H;*XS9SgV`?W-H zMBdl9A3b}5R*{A1`5WQ={oB#x$F^2wk>Qea?Ue@=o%-xD&2kAbyB0_`(YhV^q9bB+zc1MUM?iy(vXwA-* z^`kZxJ~<*41yLn%7X_DMStva3)x2_7STS^L>pUifQ}QKT+3+Ln`hlC-(T%6_&)1=e zYAhVIw8dqU#>mK&8NB6acL;jva18!<7Oy1uL`64jLGu`9lngV5=*H9gl}5#>aNX*B z2S=rg1e9R>QR%ZN3rI0&*=k`%(JA7Xg4Cs;3+>n3f~M^-8*D*qVRR@A+(u6Z7Y#&d zCDi%=mVgw8WTQ<3#u#`7Z^Id_u9Oh-h3iuIAqk<9sKPo-A_6nI{`|)qHieY>AE+1? zYNM=~KlIx{et4bIrty@<(F*Z7>KJ^!1ka5Tl$2WJ9qK*4p^U|xaFM1>8aZKykfj26 zs@f0T4ilvUjbyCd?Xed>1W`2Sh~5xxZjZs0e3-&z7(@~7DuR{<=76{uQ^jhy^>bAI zS)nn6mv9Gq?3tJvHq_%gQ7khEpPBSE2?l$hsXg8cV7BCkR0u8)s0?0tJr!Qlwo-)_ zdK(U~%A%MLeIo9Lg`u;->%Vs^Mhj_mA} zkCpGQdJ^lXCs^si@)9pv!cIGUM-ZRdbwUkj324_U+$4Z8upf-jrpLkd?%Tlrq#Z}b znqcrUg=em;_iBSE>3_YYUri{uKaLeH(~`h)um^|?P4KmDqJ+S|AB|+gwNt%(9LeS_ z{X8{Xhs}dglU}Fasnfq{wsDqiW=ou751TE1 zoqj)WZ{c&!IGrbW=j&!RZZ_L>`XQDLnX`XtWY!st7oE8$%&y~{Yai#1@Isp7574F< z$8Iz;?Pg}5*_CvPTg|RGmwVnTY~o#2#w;D9A2iyJaJeVEPQgfT<6KLOM%8%la$VNA z(;en)!`|FeY~D7bvCqs_aaqUAt{PS_>GWZ(1lOzl!fvy@*=##%c6D?7pwn@Mv)7od zeH=T%@uR$Zx!IWHxM8O_#Ja*pQy=GQFfWLi7xtU6UHpLpy-%kf^e(B<>G!eO&0O{` zowohF(8`O)S@sxfV~wT`j*ol2PqAz_XMN7RpqVy4%d&@AYlTj~hP6Frymy~7_X)4- zd9SP7Y}&2UcX&O&;kZ}5%T{nXC%nEY&fdYh`m(YI^YWVcobJ5hFz1T%g+8P4*L?AF zM#r&xZNzF_Y|eJ-^nKZ`Zlk$7+clV**Ua+GoQtq|eR;(-IWD77f7oeTN7E;qwx2m& z$pYb7I%|>_PB{6u%=X7toqLKBtDJ zyPfvKyjw@>pL1p}qv?Kr(W^$w(Sp1Q*1fZ!SfKT1S^GYxy^1yzu=Z!2RzH2uS>9!* z?|GZEA7^v7dGnq(T4GLnm^HSuru{6R)V~K7S>+D+E+VWVJF%${j;pA!RzA8rUM18Zr;+zJ9ZmQHJquN oclYsmyN&jptZ|%oce89W9)UBrhPC%O@yFfl%&wsCS>bg3AJ}q7Bme*a diff --git a/data/texture/smallsquares.bmp b/data/texture/smallsquares.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4fea0140e11ff43f7bcaa01b110b7c99ee908dd1 GIT binary patch literal 5758 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 literal 0 HcmV?d00001 diff --git a/data/texture/smallsquares.gimp.pcx b/data/texture/smallsquares.gimp.pcx deleted file mode 100644 index 54961edcfb8116664d5eebda3023b4021058ca45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3813 zcmb7`dpy*6+sEs6i{Z+3PX$~vq-%y&ZdO6EZe*28oAGexo*yn3|4Ikwvv$1q20FcBsas2ij^mw`Wj=WlF78S(!T zbGXl5d4=MuH~6~8T|9g-Dh_way#{yD%g9myAEk73Wpx%@T4#IYXS~2rn2lV9*}i`; zT6o{2&`t@>0Tfqsm@dZU>7zF?FO;-P>oFEYvO--8D+YasN9opb)ZttVty;U};m>T0# zDvyH(Ow6pKDCWk>lXyTUnIY8+Xs+lQMc77IF;dnILsqsCxhdLsXyW0EhAB&!_(xvS z@vLb!Y@F^Vh>CJ^GvGSu1h`XxQZIefFQi->BfX zIp`^mEN4q3{We?=!XPQ6@zwOz4r3f`tnA8= z!gA6Q8L}>!Ox7$u1>v27R<&&^J|B6{-xu+qE?sQk&Cp&l+P} z4NT^fkGYSe86Jx(SK-b&G2G{wjhAca5Nmxsy;QWsV-HQ06P4`1zOA`hi;rZSE*jOw z^Qu`@(p7j;rRpP{f_^<~n={k!LUf27i}iFyIb2!Qb<^2hXy7Z&agr#d5t^ZPsXrYgofW)^Onv1NVr zm0stc#Kq0B=xy_&gA>>xUWO(v3GDcIuap*#E;fzZ(z7Hz6g1T}(Nz#{79S%W8*grA z{bBF2<_4Ahxew!ElT#j+7!aT7$&!iDrQA$x!9a3 zVTL3`i(6%xs#oKYti-Cai0TqDt&&O}s%X|!!mYY^X|xr`lR3I7X5mRB2GMBoS zY}~}()0QlwCOI!ZW+z(7$b+?Ni7v@dwy!jRXRa#YR7a{tWo` zgntl=jAa5Ryr*!qO7c>)Ib_MHr5aiU@-y`onz7Z!uumjAIq2{LWRh$w7RyrWP0 zEOo*I1Q^vf?6`95FWlK^%;2#*KqK245n3&`SgMne5{B80Z`hyu&;%x|iIOnn ziD#yntRp{+inCdSFK7^OsgYbTU`bA1iFj8nFM}@>J_W6&XvG`J)#doK_>8cLsr1q( z7d9?eWmPfBhVaFO4d1R-BhX1pBalVM2TWR*`f=Dq6(mh9eef~W-vW&`+$1#W7b!s) ztAq(>Oh~HMh2x9T7It?Tkjvn4t+nK3I7Y02Np=`Z{aEUZvJbGRS;7SVmeDU=!R3ZVxv%?(PLvGmqa z+7az}`WiKX81urr@&t+w&ccYUo8feH8?IiudVXPG#%#RL+z`OlzK%Z=6Gb$$4!4|( z9Gr`;;Gt1QN-a99<+adB!O_e{(lwlJK+~7fYL=WlmbPr70US+LSK=!XUyK&~KT3o6 z;FKsIEe!Tl)?pmFS)Vk2btK;Dv4zUSdq08qKQ;O2(sVBJ-7s^`iXvw!;;`|Kd2#VU zPrfWT`uuF>%64?i8&prH)wyE1;ZrsV!|`7IFnbV-CI zOpBhDrK}^XtHVkrlHqjQKpwrHV(MDAsZM-yZlRgt_!}JJuCfpxU+AutA(tUzu>h0N zxSkNrNL>oj4Kk1yRtK^cO{bVDLo_9T&D7O9&YiCkhj9kdcpTn|!MT_;j;8A+Y&t?6 z>edk&kbEF|?6??M!V=AuL`ng!c&Nr#AqU1esOi@V<(PrcSwN5IVEvE6k<$9P!Vl<3 zjuWocsL`m&!)tdFJS@W7kf^g!4htPA!abY1IAZS&S{K0vKy6So(6jLX;{Y~MLxxVj4jv~tx^^bWB8~O zW}LR`D5Hhf7>o!C=oZg?a(Lwyh=WQN(c_|q7B7>B~6a(XQI>&0;SkvSsowT$6 z3+0(8e1$fOAv_3Ki?@0D8F{7@2U0IL`NzIYY&B3b);Kq zM@77B@bW4+yG`Z0(t?7TjNe*=e(Jp(c_G_3E6(%4&q>}Zzu&j#lIA>JAJ3(??-yJt zuL%fV_oKGTb5Uvf!97vY!CjZLN@C1w%lDJRvY~;LmTddZY=@TpyxxL?r?s@3E6SP+ z9qL36#wy+N()<(MIi1)~~ZSop-!oXV&VKg_pCFf}G=CPhN@_WQF?gjPv|7 z@oOUQhgYWpZ)U~*krp|2IW{XkJi$c!SiwMj`$$XCNz=u;<>jxQ40PkK*Ow0^XCA6N znzl`_SS_=0aFw0Q@Sn*Od23S>lJ1J`9?wp8o24vtg@o))>na@{XEqbdrDi?wGD9ojZg z6Ek={=fb((1N)MSIp!q|=a1#@YO3x(c|Nn))~df)P_WUjY=6w<{G^*dnBOi>7(biS zl(3|vr^PM*_@(^Z4~gFPL5aBKMWyFVKE}zMH`^>1*{?~yx*_Of{^ecEIk(`e++A%~7i#~S9~+qza4VnJRdS@crYy^Q`B-sq0N1poc*ou5 zQ@d;WE^TuABhSylVD8Y93qLzAXjp51bk*|8n!QI4ggxu7zmXTe#6q>YwkLo8_NSf0 k<2A=`?GNPW>t1xUC{4C~oS*XY_q4xW6faPd+i9ZvKVsL~od5s; diff --git a/data/texture/terra.bmp b/data/texture/terra.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ed4eddc743abfdc18bc043355d76bac385f49f8e GIT binary patch literal 8972 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 F{|Eg|EQ0_5 diff --git a/data/texture/wood2.bmp b/data/texture/wood2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1e4e166980ea542ca5d3656cdd4aa8f0c9b3630e GIT binary patch literal 5638 zcmeI0O;cM}5{7U06%w+|mk?kqjZHwp24hBCKoB4p1SsYs*w`8>#x`+z;YAi%c&f5U zrLu6<%p!}VDvMNk7V|r1J%3_;#H?pM^SpiWRLw7#O(-Af>YhG*-hTVz^l|5l;&>8& zKNgbYd!DkZVM%{tJbyouBr}Woh!=X9{QKj-_|f_N=^uao`@im;{q6SH?LYm~mY0`D z-@bi2%P4;M@S*(KwST1dUj8iA|NUdT|M{!Wc9VMcZBp+r+80T+^HWmY_;XTUyyW-S zN&V=jq`tx2;%QRf{)YKqlWO}N?|xv-d)9uPRFD3G?3<*zEm_vgKTYag^lVGdTgEx_ z$Zu=Sk4gO$`HeTop)+Hj`7S!YMfWereS;j&-Cxo19^HRMmVLKbm!YTg1NeA8Vm@P^ zjd%P8NBb>nenF1s4ff2?-~Ntw>@|DDy6^bSUf5R;``#ptu#Y`Am|H~G_B&)49dKvh zz^+Ev!@ja5lPz%6W{nn;X(x=1T`*G= z4pwG1VAIkm?btGB*V8%P%Z6uY6Xs21i#7%7zCKO71n46*}2UxvDppXvY=}NUiODr zq-fZ+OM79T*{ILh5gJSEE&jwx<|S+u7XxT5TOSe=cEFy4NcIZ5p;MM(r%P(umXMjZ zE$|hP-9^hGY;1;B#pJMm(UC+_E%k#dN@(c7$ z+I{xi1JQ;p*pT(mD_ewA-j&7rG;Gy3+T+bMQr$czz<0xD?5VHwc?nCO+9#HfDU)cf zva05nSXzsLm;8*~a|_Eh?FOC|a49wh;jd=TvH7{p3wwIQ*6p4>W)wi(wvOK+J~zS8 zg~z$j-wl+H$hyo{gYQl3hxN39hX>*M0mw$v2f0r2V#rRd-$t%9&oKXj{gumSu+>cW zh?R4(0h$(?ru>lH|J0tOV?N3A6gxM;+jK>1FMQWQqGMysm6)rs`Upl9<;uacE9>gK zm6ewuSckU*n?0(PG#*7fc)=zhtLZcvXSK#0J=V4EP{R_lW^&3Qx_btyL=A zZFozuLh*kQ+1^Iu8I@1fOnl@~L-m1mv2l#=iGA0+{Iq~RWmXf({ZtiDyjO{c3f1WZ zP8927#AQN!cBpd~%u9X`oyr#N-45NG)R-#oR{5k>Xppic@^oM*!?1$!O*eymM zF~mkQrACDPfdr4Je&^>`?rlZGqdu{!tZBijPN6-%r^tto-m4%bzs?i0JGPkTxsUj= zy;2<|P82T@jp#YIda6usf>OIQd3S&{1)ryC^da{GZAR3Jji)y2)T4ByKuvOT3Z3IF zc{KTH;oSTE)X^DSjkEhK+Il)o;AjHQhCa|3r@U~O{(TiekrmJkQ^f7T8=&FRhJPg!IXTWQ%GYx^!6gd zl`q%9krDlQ-YCNquR1%G`P2n|DPQ-%fJ~|^SB2f^lch&gcYWvis~PdrqfQU77X4|X zNKHYDDw%w*U+N_}kI_45mt-QD3+kK$?I?@cQAqtFcv5}UdhuAHZ>4igIdPb6M_m^4 zNTelBYN3{#`p=y8RXnqbB%TWEulgi3&za+Ab

{6ZQIu9rCRDty6E6ilG{?k8IRt zp4E>Gz=NV)OsS%)dgmTfb_VXGUdk&I(Q6)1Q*@>dvO=+}s3E?6iFLO) zht*BJBA@e^s1ZeV-jUb5pCx~GSTP53b?oX%4tqL=1kQho5qF1e|Bsr0710 z^X~Vo7!J;&mxtd?=ESo)ZGGyb6^?1_fCZvWey@RGhTTuWORe{#uwae329_$1S0Yz? z{BGm_4nq|~v9=JOd9SbAkxogS!gu^r&S9OwMKI-Fp}MixUaHPYxgb9bu;&9?C)Y<* zYv8gRy62s4jtZpCrH?M89P%ZXH5XVfyYn+6Vh~&MlU!YF1-?Fku{+4_+YGvAoenni z&ZP6v^F*KQeZJ;r=q4*tBf6$#D;QLf)yK)gsyZ;wyNU~Dwy2o}r{4^H;!;Dmt^qLV z=0&D?!-Y#M>%7&I`k^631JW%dPhhFTr|vynFes9AH;LN{vXR{`PN#f39S+MSUBn0K zd`mvfx(r?W@vVr^{h<{Rb%S1bg1r>0In&3i#6N*ry_#}Hbx^mECG71BjycQ8=jeU# z&MBthm8+L1<<*Y&8TypbFZetIi;$gxM!NGJMQ2CD6s$zPd-;{=Cv}f?^qsuw8Fc(aq0fA=&g_;ldig?+qm*PuY0mkH`z9ly8A1}^Qx`N zn)^hjmoSz&LvsBYw}c97B&j={qDfq+K9VB^+5Iv+ghjj&i+RVa+}vhHOvnaxRl2*V zmg>$aZ>l%ax;D4Y4D_lbZ7kL8Wy)T|g8o-zn7yeM@O6f7G~zc}C%MmEL#7xz&v8qR I+LYLT0EE`uYXATM literal 0 HcmV?d00001 diff --git a/data/texture/wood2.gimp.pcx b/data/texture/wood2.gimp.pcx deleted file mode 100644 index 9dbb95cbefb7c3f7c3375cd2bf731fb0f826336c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3326 zcmeHJF?ZWW61HrKtF=S`0wK~A_9BE@PzFWmmMdy0gE~q}f;1bbS73qkl&v5k%6kRgR9O+_Am)vE18^`2BBng0kkS}b-BmO*@ za7&)Zs#8A&w-a~9YcvXYK>z^L=)N1t}?M;n=Pmry?Mlgq%QBG5r?QPBsokP54 z^eCT4x(lY8a#e?6-CeNCX>+rAe9;Zmw7&c73buzgkKvJJBTYQ$XSN5nw5LO;|GjQG zTzt>d1~0Gl=6a_G7>m3OZd_|s#%qRaq(9>Xwmw_0dKq33zLG)e(!e>94*ZN! zMzqo*S)7_uBdDk@!phkSwgstNG=%PCA zx|CaE9gp37-_2L?5iIs+i|z9`5EMGnwqns`nT)Z{$jm)0nLBG*2Vf6RM(3O^Z5F27cW;?8~hO5T)U|| zUcmms+=qqR4%_3|7})CZ?dfe3(An1g^;5Vwep!VvGZ%nhU>y(@Tg<9Q&2icVw_6KM zJD`4R_2Ovj={0P@@ynV9=9sNQYi~{8(Us`=h8SIr+OA)?V@Q2r z$pobJbtS zt5u}=jN++~+z;p(n+s)IF*a&kscM%dT zMBrmF&_DnWP{tg>M=3>WVV3(~JILq&Ne(0sBk?m|iZWo8OB*$Jxczt=>YgM*<3>Ti z!-FByMe4Qz5&83|Sb}vW?;Lg36#%>YAZWF^E7TWb;zrd=v`j z{0Hw5R(m$}R4_;UE}f%-Z1~mH=4R!v^OI|IYZ#Dje%CSFZoFDqtHnqPFf{LhA$lu3 zz>tiM&P+!F8y2>jtpB3_!$CiL)Q1eKUOqY)?!wjmcD*#1m>0*e3C+rQmJfG_+aB>< zGj40j$y^(EEH>`)+3DukbRUX<;^60wQqu#3GjtDuPsfZ`m9)7;A@nmEy2f z+1$H@)4hD~?8gT;b=%>X^|3p4m&K1UDMN!cV8!Tmb`Yui%h@k2&^;q={erC^Dx)4< z)er0u4clgl0^B3~IkyP6R|q*=t&vDdy?I<$82!d~8VS0hrfTp62F`LAkQg$Hob#xcZ%&%*gJd6u zEK}^aq4Onl@+0;Z?_>5MWV0joZoqyYI`5V9DP*6A?5$*f#LjD6FmT?6?6$>zo3Jkf z=gkpY9I;P|eHyT@L-xmvy~gb=mPX@7Q@4vabVYA=#%P z`x-jG$Lv2#mdvEIVSKmGc#y&RDzz!@l7%#Xl~=urEt6>|Mye4p=79J9~p> WC+sus4f$)y{~T5SfA>EZf&T*dQJbRx diff --git a/data/water/Makefile.in b/data/water/Makefile.in deleted file mode 100644 index 9808aaf1..00000000 --- a/data/water/Makefile.in +++ /dev/null @@ -1,20 +0,0 @@ -ALLEGRO_DAT = dat - -WAVS = amb3.wav amb4.wav bath1.wav bath2.wav \ - bubble.wav flush.wav forest1.wav kitch4.wav \ - lavaflow.wav niagara.wav shower1.wav sodapor.wav \ - thundr2.wav thundr3.wav tidal.wav water.wav - -all: water.dat - -water.dat: $(WAVS) - @rm -f $@ - @echo Creating $@ - @dat -a -t sample $@ $(WAVS) - -clean: - @rm -f *.dat - -distclean: - @rm -f Makefile - diff --git a/doc/makedoc.py b/doc/makedoc.py index 6326b54c..8f83d8c4 100644 --- a/doc/makedoc.py +++ b/doc/makedoc.py @@ -13,72 +13,76 @@ import string import re + def remove_duplicate_blanks(text): - result=text + result = text - result=result.replace("\t"," ") - result=result.replace("\n"," ") + result = result.replace("\t", " ") + result = result.replace("\n", " ") - if (result!=""): - temp="" - while temp!=result: - temp=result - result=result.replace(" "," ") + if result != "": + temp = "" + while temp != result: + temp = result + result = result.replace(" ", " ") return result -def format_text(text,left_col,right_col): - temp=remove_duplicate_blanks(text) - - result="" - p=0 - l=len(temp) - while p0: - if cur_line[i]==' ': + +def format_text(text, left_col, right_col): + temp = remove_duplicate_blanks(text) + + result = "" + p = 0 + l = len(temp) + while p < l: + cur_line = temp[p : p + right_col - left_col] + dp = len(cur_line) + if dp == right_col - left_col: + i = dp - 1 + while i > 0: + if cur_line[i] == " ": break - i=i-1 - if i>0: - cur_line=cur_line[0:i] - dp=i+1 - if 0==1: #the following code justifies the text, it is disabled - j=i-1 - while len(cur_line)0 and cur_line[j-1]==' ': - j=j-1 - cur_line=cur_line[:j]+' '+cur_line[j:] - j=j-1 - if j<0: - j=len(cur_line)-1 - - result=result+" "*left_col+cur_line+"\n" - p=p+dp + i = i - 1 + if i > 0: + cur_line = cur_line[0:i] + dp = i + 1 + if 0 == 1: # the following code justifies the text, it is disabled + j = i - 1 + while len(cur_line) < right_col - left_col - 1: + if cur_line[j] == " ": + while j > 0 and cur_line[j - 1] == " ": + j = j - 1 + cur_line = cur_line[:j] + " " + cur_line[j:] + j = j - 1 + if j < 0: + j = len(cur_line) - 1 + + result = result + " " * left_col + cur_line + "\n" + p = p + dp return result + def format_email_and_url(text): - result=text + result = text - email=re.compile(r'"([\w\-\.]+@[\w\-\.]+)"') - result=email.sub(r'\1',result); + email = re.compile(r'"([\w\-\.]+@[\w\-\.]+)"') + result = email.sub(r"\1", result) - url=re.compile(r'"http://([\w\-\.\~/]+)"', re.I) - result=url.sub(r'http://\1',result); + url = re.compile(r'"http://([\w\-\.\~/]+)"', re.I) + result = url.sub(r"http://\1", result) return result + def format_html(text): - result=text + result = text - result=result.replace("<","ufoot_html_lt") - result=result.replace(">","ufoot_html_gt") - result=result.replace("&","&") - result=result.replace("ufoot_html_lt","<") - result=result.replace("ufoot_html_gt",">") + result = result.replace("<", "ufoot_html_lt") + result = result.replace(">", "ufoot_html_gt") + result = result.replace("&", "&") + result = result.replace("ufoot_html_lt", "<") + result = result.replace("ufoot_html_gt", ">") # Uncomment this to make mailing list adresses look like "xxx at xxx" # instead of "xxx@xxx". This can prevent spammers from harvesting @@ -86,17 +90,28 @@ def format_html(text): # fakeemail=re.compile('"([\w\.]+\-user)@([\w\-\.]+)"') # result=fakeemail.sub(r'\1 at \2 (replace "at" by "@")',result); - email=re.compile(r'"([\w\-\.]+@[\w\-\.]+)"') - result=email.sub(r'\1',result); + email = re.compile(r'"([\w\-\.]+@[\w\-\.]+)"') + result = email.sub(r'\1', result) + + url = re.compile(r'"http://([\w\-\.\~/]+)"', re.I) + result = url.sub(r'\1', result) - url=re.compile(r'"http://([\w\-\.\~/]+)"', re.I) - result=url.sub(r'\1',result); - return result -def format_tex(text): - result=text +def format_tex(text): + result = text + + result = result.replace("\\", "$\\backslash$") + result = result.replace("_", "\\_") + result = result.replace("#", "\\#") + result = result.replace("%", "\\%") + result = result.replace("}", "\\}") + result = result.replace("<", "$<$") + result = result.replace(">", "$>$") + result = result.replace("~", "$\\tilde{}$") + +<<<<<<< HEAD result=result.replace("\\","$\\backslash$") result=result.replace("_","\\_") result=result.replace("#","\\#") @@ -106,107 +121,150 @@ def format_tex(text): result=result.replace(">","$>$") result=result.replace("~","$\\tilde{}$") +======= +>>>>>>> 4ce03a0 ([build] fix build issues) return result + def format_texi(text): - result=text + result = text +<<<<<<< HEAD result=result.replace("@","@@") result=result.replace("}","@}") result=result.replace("{","@{") +======= + result = result.replace("@", "@@") + result = result.replace("}", "@}") + result = result.replace("{", "@{") +>>>>>>> 4ce03a0 ([build] fix build issues) return result + def format_uwc(text): - result=text + result = text +<<<<<<< HEAD result=result.replace("]","]") result=result.replace("[","[[") +======= + result = result.replace("]", "]") + result = result.replace("[", "[[") +>>>>>>> 4ce03a0 ([build] fix build issues) return result + def format_uwc_text(text): - result=text + result = text + + result = format_uwc(result) - result=format_uwc(result) - # This is an ugly way to get rid of all junk at line start - result=format_text(result,0,999999) + result = format_text(result, 0, 999999) return result + def format_uwc_elem(text): - result=text + result = text +<<<<<<< HEAD result=format_uwc(result) result=result.replace("\n"," ") result=result.replace("\r"," ") result=remove_duplicate_blanks(result) +======= + result = format_uwc(result) + result = result.replace("\n", " ") + result = result.replace("\r", " ") + result = remove_duplicate_blanks(result) +>>>>>>> 4ce03a0 ([build] fix build issues) return result + def format_uwc_code(text): - result=text + result = text - result=format_uwc(result) - line=re.compile('^(.*)$',re.M) - result=line.sub(r" \1",result); + result = format_uwc(result) + line = re.compile("^(.*)$", re.M) + result = line.sub(r" \1", result) return result + class XMLToX(xml.sax.ContentHandler): def __init__(self): xml.sax.ContentHandler.__init__(self) - self.charbuf="" - self.translated="" - self.stack=[] - def write(self,text): - self.translated=self.translated+text - def start_file(self,title): + self.charbuf = "" + self.translated = "" + self.stack = [] + + def write(self, text): + self.translated = self.translated + text + + def start_file(self, title): pass - def start_chap(self,title): + + def start_chap(self, title): pass - def start_part(self,title): + + def start_part(self, title): pass + def start_text(self): pass + def start_list(self): pass + def start_elem(self): pass + def start_code(self): pass + def end_file(self): pass + def end_chap(self): pass + def end_part(self): pass + def end_text(self): pass + def end_list(self): pass + def end_elem(self): pass + def end_code(self): pass - def startElement(self,tag,attributes): - self.charbuf="" + + def startElement(self, tag, attributes): + self.charbuf = "" self.stack.append(tag) - if tag=="file": + if tag == "file": self.start_file(attributes["title"]) - if tag=="chap": + if tag == "chap": self.start_chap(attributes["title"]) - if tag=="part": + if tag == "part": self.start_part(attributes["title"]) - if tag=="text": + if tag == "text": self.start_text() - if tag=="list": + if tag == "list": self.start_list() - if tag=="elem": + if tag == "elem": self.start_elem() - if tag=="code": + if tag == "code": self.start_code() +<<<<<<< HEAD def endElement(self,tag): data=self.charbuf.strip() if (data!=""): @@ -214,195 +272,267 @@ def endElement(self,tag): self.charbuf="" self.stack=self.stack[:-1] if tag=="file": +======= + + def endElement(self, tag): + data = self.charbuf.strip() + if data != "": + self.write(self.translate(data, self.stack[-1])) + self.charbuf = "" + self.stack = self.stack[:-1] + if tag == "file": +>>>>>>> 4ce03a0 ([build] fix build issues) self.end_file() - elif tag=="chap": + elif tag == "chap": self.end_chap() - elif tag=="part": + elif tag == "part": self.end_part() - elif tag=="text": + elif tag == "text": self.end_text() - elif tag=="list": + elif tag == "list": self.end_list() - elif tag=="elem": + elif tag == "elem": self.end_elem() - elif tag=="code": + elif tag == "code": self.end_code() - def translate(self,data,tag): + + def translate(self, data, tag): return data - def characters(self,data): - self.charbuf+=data + + def characters(self, data): + self.charbuf += data + class XMLToHTML(XMLToX): - def __init__(self,header,footer): + def __init__(self, header, footer): XMLToX.__init__(self) - self.header=header - self.footer=footer - def start_file(self,title): - self.write("\n"+\ - "\n\n"+\ - "\n"+\ - ""+\ - title+\ - "\n\n\n\n"+\ - self.header+\ - "\n

"+\ - title+\ - "

\n") - def start_chap(self,title): - self.write("
\n

"+\ - title+\ - "

\n") - def start_part(self,title): - self.write("

"+\ - title+\ - "

\n") + self.header = header + self.footer = footer + + def start_file(self, title): + self.write( + '\n' + + "\n\n" + + '\n' + + "" + + title + + "\n\n\n\n" + + self.header + + "\n

" + + title + + "

\n" + ) + + def start_chap(self, title): + self.write("
\n

" + title + "

\n") + + def start_part(self, title): + self.write("

" + title + "

\n") + def start_text(self): self.write("

") + def start_list(self): self.write("

    ") + def start_elem(self): self.write("
  • ") + def start_code(self): self.write("
    ")
    +
         def end_file(self):
    -        self.write(self.footer+\
    -                   "\n\n\n")
    +        self.write(self.footer + "\n\n\n")
    +
         def end_chap(self):
             self.write("\n")
    +
         def end_part(self):
             self.write("\n")
    +
         def end_text(self):
             self.write("

    \n") + def end_list(self): self.write("
\n") + def end_elem(self): self.write("\n") + def end_code(self): self.write("\n") - def translate(self,data,tag): - result=data - result=format_html(result) + + def translate(self, data, tag): + result = data + result = format_html(result) return result + class XMLToPHP(XMLToX): def __init__(self): XMLToX.__init__(self) - def start_file(self,title): - self.write("\n\n\n\n"+\ - "
\n

"+\ - title+\ - "

\n
\n") - def start_chap(self,title): - self.write("
\n

"+\ - title+\ - "

\n") - def start_part(self,title): - self.write("

"+\ - title+\ - "

\n") + + def start_file(self, title): + self.write( + "\n\n\n\n" + + "
\n

" + + title + + "

\n
\n" + ) + + def start_chap(self, title): + self.write("
\n

" + title + "

\n") + + def start_part(self, title): + self.write("

" + title + "

\n") + def start_text(self): self.write("

") + def start_list(self): self.write("

    ") + def start_elem(self): self.write("
  • ") + def start_code(self): self.write("
    ")
    +
         def end_file(self):
             self.write("\n\n\n\n")
    +
         def end_chap(self):
             self.write("\n")
    +
         def end_part(self):
             self.write("\n")
    +
         def end_text(self):
             self.write("

    \n") + def end_list(self): self.write("
\n") + def end_elem(self): self.write("\n") + def end_code(self): self.write("\n") - def translate(self,data,tag): - result=data - result=format_html(result) + + def translate(self, data, tag): + result = data + result = format_html(result) return result + class XMLToTeX(XMLToX): def __init__(self): XMLToX.__init__(self) - def start_file(self,title): - self.write("\\chapter{"+\ - self.translate(title,"text")+\ - "}\n") - def start_chap(self,title): - self.write("\\section{"+\ - self.translate(title,"text")+\ - "}\n") - def start_part(self,title): - self.write("\\subsection{"+\ - self.translate(title,"text")+\ - "}\n") + + def start_file(self, title): + self.write("\\chapter{" + self.translate(title, "text") + "}\n") + + def start_chap(self, title): + self.write("\\section{" + self.translate(title, "text") + "}\n") + + def start_part(self, title): + self.write("\\subsection{" + self.translate(title, "text") + "}\n") + def start_text(self): self.write("\n") + def start_list(self): self.write("\\begin{itemize}\n") + def start_elem(self): self.write("\\item[$\\bullet$]") + def start_code(self): self.write("\\begin{verbatim}\n") + def end_file(self): self.write("") + def end_chap(self): self.write("\n") + def end_part(self): self.write("\n") + def end_text(self): self.write("\n") + def end_list(self): self.write("\\end{itemize}\n") + def end_elem(self): self.write("\n") + def end_code(self): self.write("\n\\end{verbatim}\n") +<<<<<<< HEAD def translate(self,data,tag): result=data result=format_email_and_url(result) if (tag!="code"): result=format_tex(result) +======= + + def translate(self, data, tag): + result = data + result = format_email_and_url(result) + if tag != "code": + result = format_tex(result) +>>>>>>> 4ce03a0 ([build] fix build issues) return result + class XMLToMan(XMLToX): def __init__(self): XMLToX.__init__(self) - def start_file(self,title): - self.write(".SH "+title+"\n\n") - def start_chap(self,title): - self.write(".SS "+title+"\n\n") - def start_part(self,title): - self.write(".TP 0 \n.B "+title+"\n") + + def start_file(self, title): + self.write(".SH " + title + "\n\n") + + def start_chap(self, title): + self.write(".SS " + title + "\n\n") + + def start_part(self, title): + self.write(".TP 0 \n.B " + title + "\n") def start_text(self): self.write(".HP 0\n") + def start_list(self): self.write("") + def start_elem(self): self.write(".TP 3 \n.B *\n") + def start_code(self): self.write(".HP 0\n") + def end_file(self): self.write("") + def end_chap(self): self.write("\n") + def end_part(self): self.write("\n") + def end_text(self): self.write("\n") + def end_list(self): self.write("\n") + def end_elem(self): self.write("\n") + def end_code(self): self.write("\n") +<<<<<<< HEAD def translate(self,data,tag): result=data result=format_email_and_url(result) @@ -411,154 +541,247 @@ def translate(self,data,tag): result=result.replace("-",r"\-") if (tag=="code"): result=result.replace("\n","\n.br\n") +======= + + def translate(self, data, tag): + result = data + result = format_email_and_url(result) + result = result.replace("\\", "\\\\") + result = result.replace(".", "\\.") + result = result.replace("-", "\\-") + if tag == "code": + result = result.replace("\n", "\n.br\n") +>>>>>>> 4ce03a0 ([build] fix build issues) else: - result=remove_duplicate_blanks(result) + result = remove_duplicate_blanks(result) return result + class XMLToTxt(XMLToX): - def __init__(self,header): + def __init__(self, header): XMLToX.__init__(self) - self.header=header - def start_file(self,title): - self.write(self.header+" - "+title+"\n\n") - self.indent=0 - def start_chap(self,title): - self.write("\n\n"+\ - " "*self.indent+"\n"+title+"\n"+\ - " "*self.indent+"="*len(title)+"\n\n") - self.indent=self.indent+2 - def start_part(self,title): - self.write("\n"+\ - " "*self.indent+title+"\n"+\ - " "*self.indent+"-"*len(title)+"\n") - self.indent=self.indent+2 + self.header = header + + def start_file(self, title): + self.write(self.header + " - " + title + "\n\n") + self.indent = 0 + + def start_chap(self, title): + self.write( + "\n\n" + + " " * self.indent + + "\n" + + title + + "\n" + + " " * self.indent + + "=" * len(title) + + "\n\n" + ) + self.indent = self.indent + 2 + + def start_part(self, title): + self.write( + "\n" + + " " * self.indent + + title + + "\n" + + " " * self.indent + + "-" * len(title) + + "\n" + ) + self.indent = self.indent + 2 + def start_text(self): self.write("\n") + def start_list(self): self.write("") - self.indent=self.indent+2 + self.indent = self.indent + 2 + def start_elem(self): self.write("\n") + def start_code(self): self.write("\n") + def end_file(self): self.write("\n") + def end_chap(self): self.write("") - self.indent=self.indent-2 + self.indent = self.indent - 2 + def end_part(self): self.write("") - self.indent=self.indent-2 + self.indent = self.indent - 2 + def end_text(self): self.write("") + def end_list(self): self.write("") - self.indent=self.indent-2 + self.indent = self.indent - 2 + def end_elem(self): self.write("") + def end_code(self): self.write("\n") +<<<<<<< HEAD def translate(self,data,tag): result=data result=format_email_and_url(result) if (tag=="code"): result=" "*self.indent+\ result.replace("\n","\n"+" "*self.indent) +======= + + def translate(self, data, tag): + result = data + result = format_email_and_url(result) + if tag == "code": + result = " " * self.indent + result.replace("\n", "\n" + " " * self.indent) +>>>>>>> 4ce03a0 ([build] fix build issues) else: - result=format_text(result,self.indent,80) - if (tag=="elem"): - result=" "*(self.indent-2)+"* "+result[self.indent:] + result = format_text(result, self.indent, 80) + if tag == "elem": + result = " " * (self.indent - 2) + "* " + result[self.indent :] return result + class XMLToTexi(XMLToX): - def __init__(self,node): + def __init__(self, node): XMLToX.__init__(self) - self.node=node - def start_file(self,title): - self.write("\n@node "+self.node+" , , , Top\n") - self.write("\n@chapter "+title+"\n"); - def start_chap(self,title): - self.write("\n@section "+title+"\n"); - def start_part(self,title): - self.write("\n@subsection "+title+"\n"); + self.node = node + + def start_file(self, title): + self.write("\n@node " + self.node + " , , , Top\n") + self.write("\n@chapter " + title + "\n") + + def start_chap(self, title): + self.write("\n@section " + title + "\n") + + def start_part(self, title): + self.write("\n@subsection " + title + "\n") + def start_text(self): self.write("\n") + def start_list(self): self.write("\n@itemize @bullet") + def start_elem(self): self.write("\n@item\n") + def start_code(self): self.write("\n@example\n") + def end_file(self): self.write("\n") + def end_chap(self): self.write("\n") + def end_part(self): self.write("\n") + def end_text(self): self.write("\n") + def end_list(self): self.write("@end itemize\n") + def end_elem(self): self.write("\n") + def end_code(self): self.write("\n@end example\n") +<<<<<<< HEAD def translate(self,data,tag): result=data result=format_email_and_url(result) +======= +>>>>>>> 4ce03a0 ([build] fix build issues) - if (tag!="code"): - result=remove_duplicate_blanks(result) - result=format_texi(result) + def translate(self, data, tag): + result = data + result = format_email_and_url(result) + + if tag != "code": + result = remove_duplicate_blanks(result) + result = format_texi(result) return result + class XMLToUWC(XMLToX): def __init__(self): XMLToX.__init__(self) - def start_file(self,title): + + def start_file(self, title): # In UWikKiCMS document is handled manually once for # all directly in the UWiKiCMS site/instance. pass - def start_chap(self,title): - self.write("\n!! "+title+"\n"); - def start_part(self,title): - self.write("\n! "+title+"\n"); + + def start_chap(self, title): + self.write("\n!! " + title + "\n") + + def start_part(self, title): + self.write("\n! " + title + "\n") + def start_text(self): self.write("\n") + def start_list(self): self.write("\n") + def start_elem(self): self.write("\n* ") + def start_code(self): self.write("\n") + def end_file(self): self.write("\n") + def end_chap(self): self.write("\n") + def end_part(self): self.write("\n") + def end_text(self): self.write("\n") + def end_list(self): self.write("\n") + def end_elem(self): # No \n for we do not want blank lines between elems pass + def end_code(self): self.write("\n") +<<<<<<< HEAD def translate(self,data,tag): result=data result=format_email_and_url(result) +======= +>>>>>>> 4ce03a0 ([build] fix build issues) - if (tag=="code"): - result=format_uwc_code(result) - elif (tag=="elem"): - result=format_uwc_elem(result) + def translate(self, data, tag): + result = data + result = format_email_and_url(result) + + if tag == "code": + result = format_uwc_code(result) + elif tag == "elem": + result = format_uwc_elem(result) else: - result=format_uwc_text(result) + result = format_uwc_text(result) return result +<<<<<<< HEAD def run_parser(handler,dst,src): dst_file=open(dst,"w",encoding="iso-8859-1") src_file=open(src,"r") @@ -567,25 +790,34 @@ def run_parser(handler,dst,src): parser.setContentHandler(handler) parser.parse(src_file) dst_code=handler.translated +======= + +def run_parser(handler, dst, src): + dst_file = open(dst, "w") + src_file = open(src, "r") + # src_code=src_file.read() + parser = xml.sax.make_parser() + parser.setContentHandler(handler) + parser.parse(src_file) + dst_code = handler.translated +>>>>>>> 4ce03a0 ([build] fix build issues) dst_file.write(dst_code) src_file.close() dst_file.close() - -def make_html(html_file,xml_file,header,footer): - header_file=open(header,"r") - footer_file=open(footer,"r") - header_str=header_file.read() - footer_str=footer_file.read() - handler=XMLToHTML(header_str,footer_str) - run_parser(handler,html_file,xml_file) + + +def make_html(html_file, xml_file, header, footer): + header_file = open(header, "r") + footer_file = open(footer, "r") + header_str = header_file.read() + footer_str = footer_file.read() + handler = XMLToHTML(header_str, footer_str) + run_parser(handler, html_file, xml_file) header_file.close() footer_file.close() -def make_php(php_file,xml_file): - parser=xml.sax.make_parser() - handler=(XMLToPHP()) - run_parser(handler,php_file,xml_file) +<<<<<<< HEAD def make_tex(tex_file,xml_file): parser=xml.sax.make_parser() handler=XMLToTeX() @@ -612,11 +844,41 @@ def make_uwc(uwc_file,xml_file): parser=xml.sax.make_parser() handler=XMLToUWC() run_parser(handler,uwc_file,xml_file) +======= +def make_php(php_file, xml_file): + parser = xml.sax.make_parser() + handler = XMLToPHP() + run_parser(handler, php_file, xml_file) +>>>>>>> 4ce03a0 ([build] fix build issues) + + +def make_tex(tex_file, xml_file): + parser = xml.sax.make_parser() + handler = XMLToTeX() + run_parser(handler, tex_file, xml_file) +def make_man(man_file, xml_file): + parser = xml.sax.make_parser() + handler = XMLToMan() + run_parser(handler, man_file, xml_file) +def make_txt(txt_file, xml_file, header): + parser = xml.sax.make_parser() + handler = XMLToTxt(header) + run_parser(handler, txt_file, xml_file) +def make_texi(texi_file, xml_file): + node = xml_file.replace(".xml", "") + node = node.replace("xml/", "") + parser = xml.sax.make_parser() + handler = XMLToTexi(node) + run_parser(handler, texi_file, xml_file) +def make_uwc(uwc_file, xml_file): + parser = xml.sax.make_parser() + handler = XMLToUWC() + run_parser(handler, uwc_file, xml_file) diff --git a/liquidwar.spec b/liquidwar.spec index 5a00c7fb..7efa7c68 100644 --- a/liquidwar.spec +++ b/liquidwar.spec @@ -2,11 +2,11 @@ Summary: A unique multiplayer wargame. Summary(fr): Un "wargame" multijoueur indit. Summary(de): Ein einzigartiges Kriegspiel fr mehrere Spieler. Name: liquidwar -Version: 5.6.5 +Version: 5.7.0 Release: 1 License: GPL Group: Amusements/Games -Source: http://freesoftware.fsf.org/download/liquidwar/liquidwar-5.6.5.tar.gz +Source: http://freesoftware.fsf.org/download/liquidwar/liquidwar-5.7.0.tar.gz URL: https://ufoot.org/liquidwar/v5 Vendor: Christian Mauduit Packager: Christian Mauduit diff --git a/misc/Makefile.vc b/misc/Makefile.vc index 5e74ef5e..adfbe226 100644 --- a/misc/Makefile.vc +++ b/misc/Makefile.vc @@ -112,9 +112,6 @@ volume \ watchdog \ wave \ wwwcli \ -glouglou \ -monster \ -spread \ ../utils/snprintf/snprintf \ lwwin diff --git a/misc/allegro-gp2x/allegro-accel.html b/misc/allegro-gp2x/allegro-accel.html deleted file mode 100644 index bed19a38..00000000 --- a/misc/allegro-gp2x/allegro-accel.html +++ /dev/null @@ -1,76 +0,0 @@ - - - GP2X Hardware Acceleration in Allegro - - - -

GP2X Hardware Acceleration in Allegro

- -

Credits

- -

The hardware acceleration in GP2X Allegro is heavily based on -paeryn's code for SDL. He did all the hard work! - -

What is accelerated

- -
    - -
  • Trivial filling operations - rectfill, -hline, vline, clear_to_color - when applied to a bitmap in -video memory, i.e. the screen, a video bitmap, or a subbitmap -of either. - -
  • Blitting operations - blit, masked_blit, -draw_sprite - where the source and destination are both in -video memory. - -
- -

Acceleration is only supported in 8bpp and 16bpp modes; GP2X -Allegro only supports those modes anyway, so that's OK. - -

Allegro uses 5Mb for video memory, and you can set a graphics -mode with any virtual size you like subject to available memory. - -

To take advantage of hardware accelerated blitting, it's -easiest to use video bitmaps. First create one the size of the -visible screen (SCREEN_W x SCREEN_H), then use show_video_bitmap -to ensure the screen is scrolled properly, and do all your -drawing there. Then create additional video bitmaps for your -sprites, etc, and use blit or draw_sprite as normal to draw them -to your primary video bitmap. - -

You can combine that with page flipping by creating two -screen-sized video bitmaps, and drawing to one while the other -is visible, swapping which is which each frame. - - -

Hardware Scrolling

- -

If you're not using video bitmaps, you can scroll the visible -screen around the virtual screen, but there's a 32-bit granularity so -you're restricted to even X coordinates in 16bpp or multiples of -4 in 8bpp. - -

It's not trivial to combine this with using video bitmaps, -though it can be done. - - -

Example - Parallax Demo

- -

I've uploaded an example which uses page flipped video -bitmaps to take advantage of the hardware acceleration. It -draws lots of layers of random pipe-like tiles, using -accelerated masked blits or sprites or something, I don't -totally remember! - -

- - - - - - \ No newline at end of file diff --git a/misc/allegro-gp2x/allegro-building.html b/misc/allegro-gp2x/allegro-building.html deleted file mode 100644 index 79947018..00000000 --- a/misc/allegro-gp2x/allegro-building.html +++ /dev/null @@ -1,63 +0,0 @@ - - - Building Allegro for GP2X - - - -

Building Allegro for GP2X

- -

by George Foot - - -

Don't Panic

- -

It's really not very hard... - -

    - -
  1. Unpack the Allegro sources, e.g. tar -xzf allegro-4.2.0.tar.gz - -
  2. Apply my patches, e.g. cd allegro-4.2.0 ; patch -p1 < gp2xallegro-0.3.diff - -
  3. Configure properly - this is the hard bit, so unless you - know better, stick to the following command: - -

    LDFLAGS=-static ./configure --host arm-open2x-linux - --without-x --enable-static --disable-shared --enable-lgp2x - --disable-modules --prefix=/opt/gp2x - --enable-dbglib - -

    This will build static libraries, not shared libraries, - in debug and release modes, and link the various programs - (demo game, examples, tests) with the release version, - totally staticly. Everything gets installed to - subdirectories (bin, lib, include, share) of /opt/gp2x. - -

    If you want, you can --enable-dbgprog to build the - programs in debug mode too, and link them to the debug - library. Up to you. - -

  4. make depend - sort out dependencies, write - makefiles - -
  5. make - build everything - -
  6. make install - copy relevant stuff to /opt/gp2x or - whatever you set --prefix to -
- -After installation, you probably want to add the relevant bin -directory to your path. Don't worry about the include or lib -directories, gp2x-allegro-config handles that for you! So it -doesn't matter if you choose to install Allegro off by itself -somewhere, away from all your precious devkitgp2x libraries. - - -

Using Allegro for GP2X

- -

See Using Allegro for GP2X - - - - - diff --git a/misc/allegro-gp2x/allegro-prebuilt.html b/misc/allegro-gp2x/allegro-prebuilt.html deleted file mode 100644 index fa94ec0f..00000000 --- a/misc/allegro-gp2x/allegro-prebuilt.html +++ /dev/null @@ -1,47 +0,0 @@ - - - Pre-built GP2X Allegro v0.2 - - - -

Pre-built GP2X Allegro v0.3

- -

by George Foot - - -

Introduction

- -

This is aimed at Windows users who lack the software to -crosscompile Unix Allegro themselves. It's particularly aimed -at devkitGP2X users, but it may also work with other toolchains, -if they are sufficiently advanced; the GPH toolchain is not -advanced though, so don't use that. - - -

Download

- -

I'd recommend also installing Allegro 4.2.0, as that's what this is based on - then you'll have the docs and examples, not to mention the ability to test your games on your PC! -

- - -

Installing

- -

You can install this wherever you like, including into your -devkitGP2X directories. You need to edit the -gp2x-allegro-config script, in the bin directory, and set the -prefix to the parent of the bin directory. You may want to add -the bin directory to your path. - - -

Using Allegro for GP2X

- -

See Using Allegro for GP2X - - - - - diff --git a/misc/allegro-gp2x/allegro-using.html b/misc/allegro-gp2x/allegro-using.html deleted file mode 100644 index 3b9934f8..00000000 --- a/misc/allegro-gp2x/allegro-using.html +++ /dev/null @@ -1,56 +0,0 @@ - - - Using Allegro for GP2X - - - -

Using Allegro for GP2X

- -

Building your own programs

- -

Generally you should use the gp2x-allegro-config script in -your compile and link command lines. It fills out include and -library paths, and links the right libraries for you. The main -options are: - -

-
--cflags
pass this when compiling -
--libs
pass this when linking -
debug
pass this to enable debugging, and link - against the debug library -
- -

If it's one command which is both compiling and linking, pass -both flags. - -

As a side effect of the configure line above, -gp2x-allegro-config will also force your binaries to link -staticly. If you don't like it, edit the script and take out -the -static option. - -

Example: building the joystick example program

- -

The examples will have been built automatically, but as an -example of building your own program, try copying the exjoy.c -file from the examples directory to somewhere fresh. Then you -can compile it: - -

gcc -o exjoy.o -c exjoy.c -O2 -Wall -Werror -g -`gp2x-allegro-config --cflags debug` - -

And link it: - -

gcc -o exjoy exjoy.o `gp2x-allegro-config --libs` - -

Then write a .gpe wrapper script that runs './exjoy' and -chains back to the gp2xmenu. - -

Note that it's OK to pass 'debug' when compiling yet not when -linking - your own code's TRACE calls will then output to -allegro.log, while the library itself will not. Quite a useful -setup. - - - - -

\ No newline at end of file diff --git a/misc/allegro-gp2x/allegro.html b/misc/allegro-gp2x/allegro.html deleted file mode 100644 index 4224d9ec..00000000 --- a/misc/allegro-gp2x/allegro.html +++ /dev/null @@ -1,56 +0,0 @@ - - - GP2X Allegro - - - -

GP2X Allegro v0.3

- -

by George Foot - -

I've ported Allegro to the GP2X. Thanks must go to rlyeh, -whose "minimal" library was a great reference for -setting the video mode beyond what fbdev can do, and paeryn, -whose 2D acceleration routines in SDL provided the basis of the -routines Allegro is using now. - -

Links and Downloads

- - -

If you don't know Allegro, but want to -learn, have a look around the website, and get the main -distribution and install it on your dev PC. You might want to -get a zip version instead of the .tar.gz linked above, if you're -using Windows. Then get the binary archive above, and use that -when developing for GP2X. Use the documentation from the core -Allegro distribution, which gets built in various formats as -part of the build process. - -

If you know Allegro and just want to develop -for the GP2X, you can just get the binary package - it includes -all the headers too, but no docs. Use the documentation from -core Allegro, which you'll probably want to install on your dev -PC anyway as above (if you haven't already got it). - -

If you're an advanced user who might want to -hack the library itself, you'll need the original sources and my -patches, but not the binary archive. It's not too hard to build it yourself. - - -

Using Allegro for GP2X

- -

See Using Allegro for GP2X - -

Hardware Acceleration

- -

See GP2X Hardware Acceleration in Allegro - - - - -

\ No newline at end of file diff --git a/misc/liquidwar.gpe b/misc/liquidwar.gpe deleted file mode 100644 index dddcef2b..00000000 --- a/misc/liquidwar.gpe +++ /dev/null @@ -1,52 +0,0 @@ -#! /bin/sh - -############################################################################# -# Liquid War is a multiplayer wargame # -# Copyright (C) 1998-2025 Christian Mauduit # -# # -# 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 # -# # -# Liquid War homepage : https://ufoot.org/liquidwar/v5 # -# Contact author : ufoot@ufoot.org # -############################################################################# - -LIQUIDWAR_BIN=./liquidwar -LIQUIDWAR_DAT=./liquidwar.dat -LIQUIDWAR_LOG=./liquidwar.log -LIQUIDWAR_DEV=./liquidwar.dev - -#clear_screen () { -# dd if=/dev/zero of=/dev/fb0 count=1536 bs=100 -# dd if=/dev/zero of=/dev/fb1 count=1536 bs=100 -#} -# -#clear -#clear_screen - -if test -f $LIQUIDWAR_BIN -a -x $LIQUIDWAR_BIN -a -f $LIQUIDWAR_DAT -then - #$LIQUIDWAR_BIN -dat $LIQUIDWAR_DAT > $LIQUIDWAR_LOG 2>&1 - ls -al /dev > $LIQUIDWAR_DEV - echo mknod >> $LIQUIDWAR_DEV - mknod /dev/fb1 c 29 32 >> $LIQUIDWAR_DEV - ls -al /dev >> $LIQUIDWAR_DEV - $LIQUIDWAR_BIN -silent -dat $LIQUIDWAR_DAT > $LIQUIDWAR_LOG 2>&1 - #sync - #clear_screen -fi - -cd /usr/gp2x -exec ./gp2xmenu - diff --git a/src/Makefile.in b/src/Makefile.in index ec0cc5e9..e68ccb78 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -11,11 +11,10 @@ HOST_OPT = @HOST_OPT@ STATIC = @STATIC@ SNPRINTF = @SNPRINTF@ ALCFLAGS = @ALCFLAGS@ -ASM = @ASM@ DEBUG = @DEBUG@ EFENCE = @EFENCE@ PTHREAD = @PTHREAD@ -GP2X = @GP2X@ +ALLIBS = @ALLIBS@ ifeq ($(HOST_OPT),yes) HOST = @host@ @@ -34,13 +33,11 @@ endif ifeq ($(DEBUG),yes) - DEBUG_FLAGS = -g3 + DEBUG_FLAGS = -g3 -O0 DEBUG_OPTIONS = -DDEBUG - ALLEGRO_LIBRARY = debug else DEBUG_FLAGS = -O2 -fomit-frame-pointer DEBUG_OPTIONS = - ALLEGRO_LIBRARY = release endif ifeq ($(EFENCE),yes) @@ -49,12 +46,6 @@ else EFENCE_LIBRARY = endif -ifeq ($(GP2X),yes) - GP2X_OPTIONS = -DGP2X -else - GP2X_OPTIONS = -endif - ifeq ($(SNPRINTF),yes) SNPRINTF_NAMES = SNPRINTF_OPTIONS = @@ -65,13 +56,6 @@ else SNPRINTF_MODE = "using Mark Martinec's implementation" endif -ifeq ($(ASM),yes) - ASM_NAMES = glouglou monster spread - ASM_OPTIONS = -DASM -else - ASM_NAMES = - ASM_OPTIONS = -endif OBJ_NAMES = \ about \ @@ -79,9 +63,11 @@ OBJ_NAMES = \ alleg2 \ area \ army \ - asm \ autoplay \ back \ + backport \ + backportgui \ + backportguiproc \ basicopt \ bigdata \ capture \ @@ -174,7 +160,6 @@ OBJ_NAMES = \ wwwcli \ x11icon \ $(SNPRINTF_NAMES) \ - $(ASM_NAMES) OBJ_NAMES_SRV = \ basicopt \ @@ -231,37 +216,40 @@ EXE_FILES = liquidwar liquidwar-server liquidwar-mapgen ifeq ($(STATIC),yes) LINK_OPTIONS = --static - EXTERN_LIBS = `allegro-config --static $(ALLEGRO_LIBRARY)` $(EFENCE_LIBRARY) + EXTERN_LIBS = -lm $(ALLIBS) $(EFENCE_LIBRARY) else LINK_OPTIONS = - EXTERN_LIBS = `allegro-config --libs $(ALLEGRO_LIBRARY)` $(EFENCE_LIBRARY) + EXTERN_LIBS = -lm $(ALLIBS) $(EFENCE_LIBRARY) endif CONFIG_OPTIONS = \ -DCONFIG_UNIX_CFG=\".liquidwarrc\" \ - -DCONFIG_UNIX_DAT=\"$(DATADIR)/liquidwar.dat\" \ - -DCONFIG_UNIX_MAP=\"$(DATADIR)/map/\" \ - -DCONFIG_UNIX_TEX=\"$(DATADIR)/texture/\" \ - -DCONFIG_UNIX_MID=\"$(DATADIR)/music/\" \ + -DCONFIG_UNIX_DAT=\"$(DATADIR)/data\" \ + -DCONFIG_UNIX_MAP=\"$(DATADIR)/data/map/\" \ + -DCONFIG_UNIX_TEX=\"$(DATADIR)/data/texture/\" \ + -DCONFIG_UNIX_MID=\"$(DATADIR)/data/music/\" \ -DCONFIG_UNIX_SRV=\"$(GAMEDIR)/liquidwar-server\" \ -DCONFIG_UNIX_GEN=\"$(GAMEDIR)/liquidwar-mapgen\" -CMD_CC = $(CC) $(CFLAGS) $(ALCFLAGS) -c $(DEBUG_FLAGS) -Wall -W -Werror $(HOST_CPU_CC) $(CONFIG_OPTIONS) $(DEBUG_OPTIONS) $(SPRINTF_OPTIONS) $(ASM_OPTIONS) $(GP2X_OPTIONS) -DUNIX -D_THREAD_SAFE -CMD_AS = $(AS) $(ASFLAGS) --32 +CMD_CC = $(CC) $(CFLAGS) $(ALCFLAGS) -c $(DEBUG_FLAGS) -Wall -W -Werror $(HOST_CPU_CC) $(CONFIG_OPTIONS) $(DEBUG_OPTIONS) $(SPRINTF_OPTIONS) -DUNIX -D_THREAD_SAFE all: $(EXE_FILES) liquidwar: $(OBJ_FILES) - @echo "Linking $@ (host=$(HOST), debug=$(DEBUG), static=$(STATIC), asm=$(ASM))" - @$(CC) $(LDFLAGS) $(LINK_OPTIONS) -o $@ $(OBJ_FILES) $(PTHREAD) $(EXTERN_LIBS) + @echo "Linking $@ (host=$(HOST), debug=$(DEBUG), static=$(STATIC))" + @$(CC) $(LDFLAGS) $(DEBUG_FLAGS) $(LINK_OPTIONS) -o $@ $(OBJ_FILES) $(PTHREAD) $(EXTERN_LIBS) + @if [ "$(DEBUG)" = "yes" ] && [ "$$(uname -s)" = "Darwin" ]; then \ + echo "Generating dSYM for debugging..."; \ + dsymutil $@; \ + fi liquidwar-server: $(OBJ_FILES_SRV) @echo "Linking $@ (host=$(HOST), debug=$(DEBUG), static=$(STATIC))" - @$(CC) $(LDFLAGS) $(LINK_OPTIONS) -o $@ $(OBJ_FILES_SRV) $(PTHREAD) + @$(CC) $(LDFLAGS) $(DEBUG_FLAGS) $(LINK_OPTIONS) -o $@ $(OBJ_FILES_SRV) $(PTHREAD) liquidwar-mapgen: $(OBJ_FILES_MAPGEN) @echo "Linking $@ (host=$(HOST), debug=$(DEBUG), static=$(STATIC))" - @$(CC) $(LDFLAGS) $(LINK_OPTIONS) -o $@ $(OBJ_FILES_MAPGEN) -lm $(PTHREAD) $(EXTERN_LIBS) + @$(CC) $(LDFLAGS) $(DEBUG_FLAGS) $(LINK_OPTIONS) -o $@ $(OBJ_FILES_MAPGEN) -lm $(PTHREAD) $(EXTERN_LIBS) dep: @find . \ @@ -280,21 +268,31 @@ distclean: @rm -f Makefile Makefile.dep %.o: %.c - @echo "Compiling $< (cpu=$(HOST_CPU), debug=$(DEBUG), asm=$(ASM))" + @echo "Compiling $< (cpu=$(HOST_CPU), debug=$(DEBUG))" @$(CMD_CC) $< -o $@ -%.o: %.s - @echo "Assembling" $< - @$(CMD_AS) $< -o $@ -config: print_config print_cmd_cc print_cmd_as print_cmd_ld +config: print_config print_cmd_cc print_cmd_ld @true -check: - @echo No unit tests, blame the lazy developper. +test_backport_pixel: test_backport_pixel.o $(OBJ_FILES) + @echo "Building pixel test" + @$(CC) $(LDFLAGS) $(LINK_OPTIONS) -o $@ $^ $(PTHREAD) $(EXTERN_LIBS) + +test_path: test_path.o $(OBJ_FILES) + @echo "Building path test" + @$(CC) $(LDFLAGS) $(LINK_OPTIONS) -o $@ $^ $(PTHREAD) $(EXTERN_LIBS) + +check: test_backport_pixel test_path + @echo "Running unit tests..." + @./test_backport_pixel + @./test_path indent: @find . -name "*.[c|h]" -a ! -path "*32*" -exec indent -nut {} \; + @find . -name "*.[c|h]" -a ! -path "*32*" -exec indent -nut {} \; + +lint: @find . -name "*.[c|h]" -a ! -path "*32*" -exec splint {} \; print_config: @@ -302,19 +300,15 @@ print_config: @echo "Host :" $(HOST) @echo "Debug :" $(DEBUG) @echo "Static link :" $(STATIC) - @echo "Assembly :" $(ASM) - @echo "Snprintf :" $(SNPRINTF_MODE) + @echo "Snprintf :" $(SNPRINTF_MODE) print_cmd_cc: @echo "The command line to compile .c files in this directory is:" @echo $(CMD_CC) -print_cmd_as: - @echo "The command line to compile .s files in this directory is:" - @echo $(CMD_AS) print_cmd_ld: @echo "The command line to link .o files in this directory is:" - @echo $(CC) $(LDFLAGS) $(LINK_OPTIONS) $(PTHREAD) $(EXTERN_LIBS) + @echo $(CC) $(LDFLAGS) $(DEBUG_FLAGS) $(LINK_OPTIONS) $(PTHREAD) $(EXTERN_LIBS) include Makefile.dep diff --git a/src/advanced.c b/src/advanced.c index ee84ffb5..10578ea5 100644 --- a/src/advanced.c +++ b/src/advanced.c @@ -55,6 +55,7 @@ #include #include "advanced.h" +#include "backport.h" #include "config.h" #include "dialog.h" #include "disk.h" @@ -69,14 +70,6 @@ /*==================================================================*/ /*------------------------------------------------------------------*/ -static char * -get_asm_algorithm_str (void) -{ - if (CONFIG_ASM_ALGORITHM) - return (lw_lang_string (LW_LANG_STRING_ADVANCED_ASSEMBLY)); - else - return (lw_lang_string (LW_LANG_STRING_ADVANCED_STANDARDC)); -} /*------------------------------------------------------------------*/ static char * @@ -119,7 +112,7 @@ int advanced_options (void) { int *temp; - DIALOG d[21]; + DIALOG d[19]; int i, retour = 0, choix = 4; static int y_pos[8] = { 0, 1, 2, 3, 4, 5, 6, 7 }; @@ -135,7 +128,7 @@ advanced_options (void) standard_button (d + i + 12, 1, y_pos[i], 2, 8); d[i + 12].proc = my_slider_proc; } - d[17].proc = d[18].proc = d[19].proc = my_button_proc; + d[16].proc = d[17].proc = my_button_proc; quick_buttons (d); d[4].dp = lw_lang_string (LW_LANG_STRING_ADVANCED_ATTACK); @@ -145,18 +138,16 @@ advanced_options (void) d[8].dp = lw_lang_string (LW_LANG_STRING_ADVANCED_CPUSTRENGTH); d[9].dp = lw_lang_string (LW_LANG_STRING_ADVANCED_CPUVSHUMAN); d[10].dp = lw_lang_string (LW_LANG_STRING_ADVANCED_ALLOWNETWORKBOTS); - d[11].dp = lw_lang_string (LW_LANG_STRING_ADVANCED_ASMALGORITHM); - d[12].d1 = d[13].d1 = d[14].d1 = d[15].d1 = 16; - d[16].d1 = 4; - d[12].dp3 = &CONFIG_FIGHTER_ATTACK; - d[13].dp3 = &CONFIG_FIGHTER_DEFENSE; - d[14].dp3 = &CONFIG_FIGHTER_NEW_HEALTH; - d[15].dp3 = &CONFIG_NUMBER_INFLUENCE; - d[16].dp3 = &CONFIG_CPU_ADVANTAGE; - d[17].dp = get_cpu_vs_human_str (); - d[18].dp = get_allow_network_bots_str (); - d[19].dp = get_asm_algorithm_str (); - for (i = 12; i < 17; ++i) + d[11].d1 = d[12].d1 = d[13].d1 = d[14].d1 = 16; + d[15].d1 = 4; + d[11].dp3 = &CONFIG_FIGHTER_ATTACK; + d[12].dp3 = &CONFIG_FIGHTER_DEFENSE; + d[13].dp3 = &CONFIG_FIGHTER_NEW_HEALTH; + d[14].dp3 = &CONFIG_NUMBER_INFLUENCE; + d[15].dp3 = &CONFIG_CPU_ADVANTAGE; + d[16].dp = get_cpu_vs_human_str (); + d[17].dp = get_allow_network_bots_str (); + for (i = 11; i < 16; ++i) { d[i].dp = NULL; d[i].dp2 = slider_int; @@ -164,15 +155,8 @@ advanced_options (void) d[i].d2 = *temp; } -#ifndef ASM - /* - * If no assembly code has been compiled, we disable the button - */ - d[10].flags = D_HIDDEN; - d[18].flags = D_HIDDEN; -#endif - d[20].proc = 0; + d[18].proc = 0; while (retour == 0) { @@ -193,25 +177,18 @@ advanced_options (void) case MENU_QUICK_PLAY: retour = MENU_PLAY; break; - case 17: + case 16: CONFIG_CPU_VS_HUMAN = (CONFIG_CPU_VS_HUMAN + 1) % 3; - d[17].dp = get_cpu_vs_human_str (); + d[16].dp = get_cpu_vs_human_str (); scare_mouse (); - my_button_proc (MSG_DRAW, d + 17, 0); + my_button_proc (MSG_DRAW, d + 16, 0); unscare_mouse (); break; - case 18: + case 17: CONFIG_ALLOW_NETWORK_BOTS = CONFIG_ALLOW_NETWORK_BOTS ? 0 : 1; - d[18].dp = get_allow_network_bots_str (); + d[17].dp = get_allow_network_bots_str (); scare_mouse (); - my_button_proc (MSG_DRAW, d + 18, 0); - unscare_mouse (); - break; - case 19: - CONFIG_ASM_ALGORITHM = CONFIG_ASM_ALGORITHM ? 0 : 1; - d[19].dp = get_asm_algorithm_str (); - scare_mouse (); - my_button_proc (MSG_DRAW, d + 19, 0); + my_button_proc (MSG_DRAW, d + 17, 0); unscare_mouse (); break; } diff --git a/src/alleg2.c b/src/alleg2.c index baf74a62..a76d3b6a 100644 --- a/src/alleg2.c +++ b/src/alleg2.c @@ -79,7 +79,6 @@ static void my_handle_scrollable_scroll (DIALOG * d, int listsize, int *index, int *offset); static void my_handle_listbox_click (DIALOG * d); - /*==================================================================*/ /* fonctions */ /*==================================================================*/ @@ -94,7 +93,7 @@ static void my_handle_listbox_click (DIALOG * d); static void my_dotted_rect (int x1, int y1, int x2, int y2, int fg, int bg) { - BITMAP *gui_bmp = gui_get_screen (); + ALLEGRO_BITMAP *gui_bmp = gui_get_screen (); int x = ((x1 + y1) & 1) ? 1 : 0; int c; @@ -119,8 +118,7 @@ my_draw_textbox (char *thetext, int *listsize, int draw, int offset, int wword, int tabsize, int x, int y, int w, int h, int disabled, int fore, int deselect, int disable) { - BITMAP *gui_bmp = gui_get_screen (); - int fg = fore; + ALLEGRO_BITMAP *gui_bmp = gui_get_screen (); int y1 = y + 4; int x1; int len; @@ -156,17 +154,10 @@ my_draw_textbox (char *thetext, int *listsize, int draw, int offset, rectfill (gui_bmp, x + 2, y + 2, x + w - 3, y1 - 1, deselect); } - /* choose the text color */ - if (disabled) - fg = disable; - - if (fg) - { - /* - * Not elegant, but test above here just to get - * rid of compiler warning about fg not being used. - */ - } + /* Suppress unused parameter warnings */ + (void)disabled; + (void)fore; + (void)disable; /* loop over the entire string */ while (1) @@ -344,7 +335,7 @@ my_textbox_proc (int msg, DIALOG * d, int c) int start, top, bottom, l; int used, delta; int fg_color; - ASSERT (d); + ALLEGRO_ASSERT (d); fg_color = (d->flags & D_DISABLED) ? gui_mg_color : d->fg; /* calculate the actual height */ @@ -440,17 +431,17 @@ my_textbox_proc (int msg, DIALOG * d, int c) else bottom--; - if ((c >> 8) == KEY_UP) + if ((c >> 8) == ALLEGRO_KEY_UP) d->d2--; - else if ((c >> 8) == KEY_DOWN) + else if ((c >> 8) == ALLEGRO_KEY_DOWN) d->d2++; - else if ((c >> 8) == KEY_HOME) + else if ((c >> 8) == ALLEGRO_KEY_HOME) d->d2 = 0; - else if ((c >> 8) == KEY_END) + else if ((c >> 8) == ALLEGRO_KEY_END) d->d2 = d->d1 - l; - else if ((c >> 8) == KEY_PGUP) + else if ((c >> 8) == ALLEGRO_KEY_PGUP) d->d2 -= (bottom - top) ? bottom - top : 1; - else if ((c >> 8) == KEY_PGDN) + else if ((c >> 8) == ALLEGRO_KEY_PGDN) d->d2 += (bottom - top) ? bottom - top : 1; else used = D_O_K; @@ -502,19 +493,19 @@ my_textbox_proc (int msg, DIALOG * d, int c) /* d_button_proc: * A button object (the dp field points to the text string). This object - * can be selected by clicking on it with the mouse or by pressing its - * keyboard shortcut. If the D_EXIT flag is set, selecting it will close + * can be selected by clicking on it with the mouse or by pressing its + * keyboard shortcut. If the D_EXIT flag is set, selecting it will close * the dialog, otherwise it will toggle on and off. */ int my_button_proc (int msg, DIALOG * d, int c) { - BITMAP *gui_bmp; + ALLEGRO_BITMAP *gui_bmp; int state1, state2; int black; int swap; int g; - ASSERT (d); + ALLEGRO_ASSERT (d); LW_MACRO_NOP (c); // ufoot @@ -551,7 +542,7 @@ my_button_proc (int msg, DIALOG * d, int c) } else { - black = makecol (0, 0, 0); + black = 0; // [FIXME:ufoot] sounds a bit hardcoded, double-check this vline (gui_bmp, d->x + d->w - 1, d->y + 1, d->y + d->h - 2, black); hline (gui_bmp, d->x + 1, d->y + d->h - 1, d->x + d->w - 1, black); } @@ -626,11 +617,11 @@ my_text_proc (int msg, DIALOG * d, int c) { LW_MACRO_NOP (c); // ufoot - ASSERT (d); + ALLEGRO_ASSERT (d); if (msg == MSG_DRAW) { //int fg = (d->flags & D_DISABLED) ? gui_mg_color : d->fg; // ufoot - FONT *oldfont = font; + ALLEGRO_FONT *oldfont = font; if (d->dp2) font = d->dp2; @@ -653,11 +644,11 @@ my_ctext_proc (int msg, DIALOG * d, int c) { LW_MACRO_NOP (c); // ufoot - ASSERT (d); + ALLEGRO_ASSERT (d); if (msg == MSG_DRAW) { // int fg = (d->flags & D_DISABLED) ? gui_mg_color : d->fg; // ufoot - FONT *oldfont = font; + ALLEGRO_FONT *oldfont = font; if (d->dp2) font = d->dp2; @@ -676,8 +667,8 @@ my_ctext_proc (int msg, DIALOG * d, int c) * A slider control object. This object returns a value in d2, in the * range from 0 to d1. It will display as a vertical slider if h is * greater than or equal to w; otherwise, it will display as a horizontal - * slider. dp can contain an optional bitmap to use for the slider handle; - * dp2 can contain an optional callback function, which is called each + * slider. dp can contain an optional bitmap to use for the slider handle; + * dp2 can contain an optional callback function, which is called each * time d2 changes. The callback function should have the following * prototype: * @@ -688,8 +679,8 @@ my_ctext_proc (int msg, DIALOG * d, int c) int my_slider_proc (int msg, DIALOG * d, int c) { - BITMAP *gui_bmp = gui_get_screen (); - BITMAP *slhan = NULL; + ALLEGRO_BITMAP *gui_bmp = gui_get_screen (); + ALLEGRO_BITMAP *slhan = NULL; int oldpos, newpos; int sfg; /* slider foreground color */ int vert = TRUE; /* flag: is slider vertical? */ @@ -705,10 +696,10 @@ my_slider_proc (int msg, DIALOG * d, int c) int pgupkey, pgdnkey; int homekey, endkey; int delta; - fixed slratio, slmax, slpos; + al_fixed slratio, slmax, slpos; int (*proc) (void *cbpointer, int d2value); int oldval; - ASSERT (d); + ALLEGRO_ASSERT (d); /* check for slider direction */ if (d->h < d->w) @@ -717,19 +708,19 @@ my_slider_proc (int msg, DIALOG * d, int c) /* set up the metrics for the control */ if (d->dp != NULL) { - slhan = (BITMAP *) d->dp; + slhan = (ALLEGRO_BITMAP *) d->dp; if (vert) - hh = slhan->h; + hh = al_get_bitmap_height (slhan); else - hh = slhan->w; + hh = al_get_bitmap_width (slhan); } hmar = hh / 2; irange = (vert) ? d->h : d->w; - slmax = itofix (irange - hh); + slmax = al_itofix (irange - hh); slratio = slmax / (d->d1); slpos = slratio * d->d2; - slp = fixtoi (slpos); + slp = al_fixtoi (slpos); switch (msg) { @@ -766,13 +757,13 @@ my_slider_proc (int msg, DIALOG * d, int c) { if (vert) { - slx = d->x + (d->w / 2) - (slhan->w / 2); + slx = d->x + (d->w / 2) - (al_get_bitmap_width (slhan) / 2); sly = d->y + (d->h - 1) - (hh + slp); } else { slx = d->x + slp; - sly = d->y + (d->h / 2) - (slhan->h / 2); + sly = d->y + (d->h / 2) - (al_get_bitmap_height (slhan) / 2); } draw_sprite (gui_bmp, slhan, slx, sly); } @@ -826,21 +817,21 @@ my_slider_proc (int msg, DIALOG * d, int c) if (vert) { - upkey = KEY_UP; - downkey = KEY_DOWN; - pgupkey = KEY_PGUP; - pgdnkey = KEY_PGDN; - homekey = KEY_END; - endkey = KEY_HOME; + upkey = ALLEGRO_KEY_UP; + downkey = ALLEGRO_KEY_DOWN; + pgupkey = ALLEGRO_KEY_PGUP; + pgdnkey = ALLEGRO_KEY_PGDN; + homekey = ALLEGRO_KEY_END; + endkey = ALLEGRO_KEY_HOME; } else { - upkey = KEY_RIGHT; - downkey = KEY_LEFT; - pgupkey = KEY_PGDN; - pgdnkey = KEY_PGUP; - homekey = KEY_HOME; - endkey = KEY_END; + upkey = ALLEGRO_KEY_RIGHT; + downkey = ALLEGRO_KEY_LEFT; + pgupkey = ALLEGRO_KEY_PGDN; + pgdnkey = ALLEGRO_KEY_PGUP; + homekey = ALLEGRO_KEY_HOME; + endkey = ALLEGRO_KEY_END; } if (c == upkey) @@ -867,7 +858,7 @@ my_slider_proc (int msg, DIALOG * d, int c) { d->d2 = d->d2 + delta; slpos = slratio * d->d2; - slp = fixtoi (slpos); + slp = al_fixtoi (slpos); if ((slp != oldpos) || (d->d2 <= 0) || (d->d2 >= d->d1)) break; } @@ -926,9 +917,9 @@ my_slider_proc (int msg, DIALOG * d, int c) mp = 0; if (mp > irange - hh) mp = irange - hh; - slpos = itofix (mp); - slmax = fixdiv (slpos, slratio); - newpos = fixtoi (slmax); + slpos = al_itofix (mp); + slmax = al_fixdiv (slpos, slratio); + newpos = al_fixtoi (slmax); if (newpos != oldval) { d->d2 = newpos; @@ -957,20 +948,19 @@ my_slider_proc (int msg, DIALOG * d, int c) * An editable text object (the dp field points to the string). When it * has the input focus (obtained by clicking on it with the mouse), text * can be typed into this object. The d1 field specifies the maximum - * number of characters that it will accept, and d2 is the text cursor + * number of characters that it will accept, and d2 is the text cursor * position within the string. */ int my_edit_proc (int msg, DIALOG * d, int c) { static int ignore_next_uchar = FALSE; - BITMAP *gui_bmp; - int last_was_space, new_pos, i, k; + ALLEGRO_BITMAP *gui_bmp; int f, l, p, w, x, b, scroll; int fg = 0; char buf[16]; - char *s, *t; - ASSERT (d); + char *s; + ALLEGRO_ASSERT (d); gui_bmp = gui_get_screen (); @@ -1018,7 +1008,6 @@ my_edit_proc (int msg, DIALOG * d, int c) break; case MSG_DRAW: - fg = (d->flags & D_DISABLED) ? gui_mg_color : d->fg; x = 0; if (scroll) @@ -1076,62 +1065,34 @@ my_edit_proc (int msg, DIALOG * d, int c) case MSG_CHAR: ignore_next_uchar = FALSE; - if ((c >> 8) == KEY_LEFT) + if ((c >> 8) == ALLEGRO_KEY_LEFT) { if (d->d2 > 0) { - if (key_shifts & KB_CTRL_FLAG) - { - last_was_space = TRUE; - new_pos = 0; - t = s; - for (i = 0; i < d->d2; i++) - { - k = ugetx (&t); - if (uisspace (k)) - last_was_space = TRUE; - else if (last_was_space) - { - last_was_space = FALSE; - new_pos = i; - } - } - d->d2 = new_pos; - } - else - d->d2--; + d->d2--; } } - else if ((c >> 8) == KEY_RIGHT) + else if ((c >> 8) == ALLEGRO_KEY_RIGHT) { if (d->d2 < l) { - if (key_shifts & KB_CTRL_FLAG) - { - t = s + uoffset (s, d->d2); - for (k = ugetx (&t); uisspace (k); k = ugetx (&t)) - d->d2++; - for (; k && !uisspace (k); k = ugetx (&t)) - d->d2++; - } - else - d->d2++; + d->d2++; } } - else if ((c >> 8) == KEY_HOME) + else if ((c >> 8) == ALLEGRO_KEY_HOME) { d->d2 = 0; } - else if ((c >> 8) == KEY_END) + else if ((c >> 8) == ALLEGRO_KEY_END) { d->d2 = l; } - else if ((c >> 8) == KEY_DEL) + else if ((c >> 8) == ALLEGRO_KEY_DELETE) { if (d->d2 < l) uremove (s, d->d2); } - else if ((c >> 8) == KEY_BACKSPACE) + else if ((c >> 8) == ALLEGRO_KEY_BACKSPACE) { if (d->d2 > 0) { @@ -1139,7 +1100,7 @@ my_edit_proc (int msg, DIALOG * d, int c) uremove (s, d->d2); } } - else if ((c >> 8) == KEY_ENTER) + else if ((c >> 8) == ALLEGRO_KEY_ENTER) { if (d->flags & D_EXIT) { @@ -1149,7 +1110,7 @@ my_edit_proc (int msg, DIALOG * d, int c) else return D_O_K; } - else if ((c >> 8) == KEY_TAB) + else if ((c >> 8) == ALLEGRO_KEY_TAB) { ignore_next_uchar = TRUE; return D_O_K; @@ -1168,7 +1129,7 @@ my_edit_proc (int msg, DIALOG * d, int c) { if (l < d->d1) { - uinsert (s, d->d2, c); + uinsert (s, d->d2, c, d->d1); d->d2++; object_message (d, MSG_DRAW, 0); @@ -1178,14 +1139,6 @@ my_edit_proc (int msg, DIALOG * d, int c) break; } - if (fg) - { - /* - * Not elegant, but test above here just to get - * rid of compiler warning about fg not being used. - */ - } - return D_O_K; } @@ -1315,7 +1268,7 @@ my_handle_listbox_click (DIALOG * d) { char *sel = d->dp2; int listsize, height; - int i, j; + int i; (*(my_getfuncptr) d->dp) (-1, &listsize); if (!listsize) @@ -1345,18 +1298,7 @@ my_handle_listbox_click (DIALOG * d) { if (sel) { - if (key_shifts & (KB_SHIFT_FLAG | KB_CTRL_FLAG)) - { - if ((key_shifts & KB_SHIFT_FLAG) || (d->flags & D_INTERNAL)) - { - for (j = MIN (i, d->d1); j <= MAX (i, d->d1); j++) - sel[j] = TRUE; - } - else - sel[i] = !sel[i]; - } - else - sel[i] = TRUE; + sel[i] = TRUE; } d->d1 = i; @@ -1375,10 +1317,7 @@ my_handle_listbox_click (DIALOG * d) { if (sel) { - if ((key_shifts & KB_CTRL_FLAG)) - sel[i] = !sel[i]; - else - sel[i] = TRUE; + sel[i] = TRUE; d->flags |= D_DIRTY; } @@ -1394,10 +1333,9 @@ my_handle_listbox_click (DIALOG * d) static void my_draw_listbox (DIALOG * d) { - BITMAP *gui_bmp = gui_get_screen (); + ALLEGRO_BITMAP *gui_bmp = gui_get_screen (); int height, listsize, i, len, bar, x, y, w; int fg_color, bg; - int fg; char *sel = d->dp2; char s[1024]; @@ -1416,32 +1354,28 @@ my_draw_listbox (DIALOG * d) { if ((sel[d->d2 + i]) && (d->d2 + i == d->d1)) { - fg = d->bg; bg = fg_color; } else if (sel[d->d2 + i]) { - fg = d->bg; bg = gui_mg_color; } else { - fg = fg_color; bg = d->bg; } } else if (d->d2 + i == d->d1) { - fg = d->bg; bg = fg_color; } else { - fg = fg_color; bg = d->bg; } - ustrzcpy (s, sizeof (s), - (*(my_getfuncptr) d->dp) (i + d->d2, NULL)); + LW_MACRO_STRNCPY (s, + (*(my_getfuncptr) d->dp) (i + d->d2, NULL), + sizeof (s)); x = d->x + 2; y = d->y + 2 + i * text_height (font); rectfill (gui_bmp, x, y, x + 7, y + text_height (font) - 1, bg); @@ -1450,7 +1384,7 @@ my_draw_listbox (DIALOG * d) while (text_length (font, s) >= MAX (d->w - 1 - (bar ? 22 : 10), 1)) { len--; - usetat (s, len, 0); + usetat (s, len, 0, sizeof (s)); } //textout_ex(gui_bmp, font, s, x, y, fg, bg); textout_ex (gui_bmp, font, s, x, y, -1, bg); // ufoot @@ -1475,14 +1409,6 @@ my_draw_listbox (DIALOG * d) /* draw frame, maybe with scrollbar */ _draw_scrollable_frame (d, listsize, d->d2, height, fg_color, d->bg); - - if (fg) - { - /* - * Not elegant, but test above here just to get - * rid of compiler warning about fg not being used. - */ - } } @@ -1495,18 +1421,18 @@ my_draw_listbox (DIALOG * d) * index is negative, it should return null and list_size should be set * to the number of items in the list. The list box object will allow the * user to scroll through the list and to select items list by clicking - * on them, and if it has the input focus also by using the arrow keys. If - * the D_EXIT flag is set, double clicking on a list item will cause it to - * close the dialog. The index of the selected item is held in the d1 + * on them, and if it has the input focus also by using the arrow keys. If + * the D_EXIT flag is set, double clicking on a list item will cause it to + * close the dialog. The index of the selected item is held in the d1 * field, and d2 is used to store how far it has scrolled through the list. */ int my_list_proc (int msg, DIALOG * d, int c) { - int listsize, i, bottom, height, bar, orig; + int listsize, i, bottom, height, bar; char *sel = d->dp2; int redraw = FALSE; - ASSERT (d); + ALLEGRO_ASSERT (d); switch (msg) { @@ -1526,7 +1452,7 @@ my_list_proc (int msg, DIALOG * d, int c) bar = (listsize > height); if ((!bar) || (gui_mouse_x () < d->x + d->w - 13)) { - if ((sel) && (!(key_shifts & KB_CTRL_FLAG))) + if (sel) { for (i = 0; i < listsize; i++) { @@ -1611,24 +1537,22 @@ my_list_proc (int msg, DIALOG * d, int c) if (bottom >= listsize - 1) bottom = listsize - 1; - orig = d->d1; - - if (c == KEY_UP) + if (c == ALLEGRO_KEY_UP) d->d1--; - else if (c == KEY_DOWN) + else if (c == ALLEGRO_KEY_DOWN) d->d1++; - else if (c == KEY_HOME) + else if (c == ALLEGRO_KEY_HOME) d->d1 = 0; - else if (c == KEY_END) + else if (c == ALLEGRO_KEY_END) d->d1 = listsize - 1; - else if (c == KEY_PGUP) + else if (c == ALLEGRO_KEY_PGUP) { if (d->d1 > d->d2) d->d1 = d->d2; else d->d1 -= (bottom - d->d2) ? bottom - d->d2 : 1; } - else if (c == KEY_PGDN) + else if (c == ALLEGRO_KEY_PGDN) { if (d->d1 < bottom) d->d1 = bottom; @@ -1638,25 +1562,6 @@ my_list_proc (int msg, DIALOG * d, int c) else return D_O_K; - if (sel) - { - if (!(key_shifts & (KB_SHIFT_FLAG | KB_CTRL_FLAG))) - { - for (i = 0; i < listsize; i++) - sel[i] = FALSE; - } - else if (key_shifts & KB_SHIFT_FLAG) - { - for (i = MIN (orig, d->d1); i <= MAX (orig, d->d1); i++) - { - if (key_shifts & KB_CTRL_FLAG) - sel[i] = (i != d->d1); - else - sel[i] = TRUE; - } - } - } - /* if we changed something, better redraw... */ my_handle_scrollable_scroll (d, listsize, &d->d1, &d->d2); d->flags |= D_DIRTY; @@ -1669,12 +1574,38 @@ my_list_proc (int msg, DIALOG * d, int c) } /*------------------------------------------------------------------*/ -BITMAP * +ALLEGRO_BITMAP * my_create_bitmap (int w, int h) { - BITMAP *bmp; + /* + * Default to memory bitmaps for backward compatibility and performance. + * Most bitmaps in the codebase are used for pixel-by-pixel operations + * which are much faster with memory bitmaps. + */ + return my_create_memory_bitmap (w, h); +} + +/*------------------------------------------------------------------*/ +ALLEGRO_BITMAP * +my_create_memory_bitmap (int w, int h) +{ + ALLEGRO_BITMAP *bmp; + al_set_new_bitmap_flags (ALLEGRO_MEMORY_BITMAP); + bmp = al_create_bitmap (w, h); + al_set_new_bitmap_flags (ALLEGRO_VIDEO_BITMAP); + if (bmp == NULL) + my_exit (EXIT_CODE_MEM_TROUBLE); - bmp = create_bitmap (w, h); + return bmp; +} + +/*------------------------------------------------------------------*/ +ALLEGRO_BITMAP * +my_create_video_bitmap (int w, int h) +{ + ALLEGRO_BITMAP *bmp; + al_set_new_bitmap_flags (ALLEGRO_VIDEO_BITMAP); + bmp = al_create_bitmap (w, h); if (bmp == NULL) my_exit (EXIT_CODE_MEM_TROUBLE); diff --git a/src/alleg2.h b/src/alleg2.h index d314f16c..040f52c6 100644 --- a/src/alleg2.h +++ b/src/alleg2.h @@ -55,7 +55,10 @@ /* includes */ /*==================================================================*/ -#include +#include + +#include "backport.h" +#include "backportgui.h" /*==================================================================*/ /* variables globales */ @@ -72,6 +75,8 @@ int my_ctext_proc (int msg, DIALOG * d, int c); int my_slider_proc (int msg, DIALOG * d, int c); int my_edit_proc (int msg, DIALOG * d, int c); int my_list_proc (int msg, DIALOG * d, int c); -BITMAP *my_create_bitmap (int w, int h); +ALLEGRO_BITMAP *my_create_bitmap (int w, int h); +ALLEGRO_BITMAP *my_create_memory_bitmap (int w, int h); +ALLEGRO_BITMAP *my_create_video_bitmap (int w, int h); #endif diff --git a/src/asm.c b/src/asm.c deleted file mode 100644 index 1f67c30b..00000000 --- a/src/asm.c +++ /dev/null @@ -1,143 +0,0 @@ -/********************************************************************/ -/* */ -/* L I QQ U U I DD W W A RR 555 */ -/* L I Q Q U U I D D W W A A R R 5 */ -/* L I Q Q U U I D D W W W AAA RR 55 */ -/* L I Q Q U U I D D WW WW A A R R 5 */ -/* LLL I Q Q U I DD W W A A R R 55 */ -/* */ -/* b */ -/* bb y y */ -/* b b yyy */ -/* bb y */ -/* yy */ -/* */ -/* U U FFF O O TTT */ -/* U U F O O O O T */ -/* U U TIRET FF O O O O T */ -/* U U F O O O O T */ -/* U F O O T */ -/* */ -/********************************************************************/ - -/*****************************************************************************/ -/* Liquid War is a multiplayer wargame */ -/* Copyright (C) 1998-2025 Christian Mauduit */ -/* */ -/* 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 */ -/* */ -/* Liquid War homepage : https://ufoot.org/liquidwar/v5 */ -/* Contact author : ufoot@ufoot.org */ -/*****************************************************************************/ - -/********************************************************************/ -/* nom : asm.h */ -/* contenu : assembly language related stuff */ -/********************************************************************/ - -/*==================================================================*/ -/* includes */ -/*==================================================================*/ - -#include - -#include "asm.h" -#include "area.h" -#include "log.h" -#include "startup.h" - -/*==================================================================*/ -/* constants */ -/*==================================================================*/ - -#define LW_ASM_OFFSET_BITMAP_LINE 64 - -typedef void *ptr; -#define LW_ASM_SIZEOF_int 4 -#define LW_ASM_SIZEOF_short 2 -#define LW_ASM_SIZEOF_char 1 -#define LW_ASM_SIZEOF_ptr 4 - -#define LW_ASM_SIZEOF_MESH_UPDATE 4 -#define LW_ASM_SIZEOF_MESH_STATE 4 -#define LW_ASM_SIZEOF_MESH_INFO 8 -#define LW_ASM_SIZEOF_MESH_SIDE 4 -#define LW_ASM_SIZEOF_MESH 104 -#define LW_ASM_SIZEOF_FIGHTER 8 -#define LW_ASM_SIZEOF_PLACE 8 - -#define LW_ASM_CHECK_SIZEOF(S) \ -if (sizeof(S)!=LW_ASM_SIZEOF_ ## S) \ -{ \ -result=0; \ -log_print_str("Error: " #S " size is "); \ -log_print_int(sizeof(S)); \ -log_print_str(" and should be "); \ -log_println_int(LW_ASM_SIZEOF_ ## S); \ -} - -/*==================================================================*/ -/* fonctions */ -/*==================================================================*/ - -/*------------------------------------------------------------------*/ -int -lw_asm_check_struct_align (void) -{ - int result = 1; - -#ifdef ASM - { - BITMAP *bmp = NULL; - int offset_bitmap_line; - - LW_ASM_CHECK_SIZEOF (int); - LW_ASM_CHECK_SIZEOF (short); - LW_ASM_CHECK_SIZEOF (char); - LW_ASM_CHECK_SIZEOF (ptr); - - LW_ASM_CHECK_SIZEOF (MESH_UPDATE); - LW_ASM_CHECK_SIZEOF (MESH_STATE); - LW_ASM_CHECK_SIZEOF (MESH_INFO); - LW_ASM_CHECK_SIZEOF (MESH_SIDE); - LW_ASM_CHECK_SIZEOF (MESH); - LW_ASM_CHECK_SIZEOF (FIGHTER); - LW_ASM_CHECK_SIZEOF (PLACE); - - offset_bitmap_line = ((char *) &(bmp->line)) - ((char *) bmp); - if (offset_bitmap_line != LW_ASM_OFFSET_BITMAP_LINE) - { - result = 0; - - log_print_str ("Error: offset for BITMAP->line is "); - log_print_int (offset_bitmap_line); - log_print_str (" and should be "); - log_println_int (LW_ASM_OFFSET_BITMAP_LINE); - - STARTUP_ASM = 0; - } - } -#endif - - if (!result) - { - log_println_str ("WARNING!!!"); - log_println_str - ("Liquid War might crash unexpectedly... Please read previous error messages."); - log_println (); - } - - return result; -} diff --git a/src/asm.h b/src/asm.h deleted file mode 100644 index a27b1e27..00000000 --- a/src/asm.h +++ /dev/null @@ -1,78 +0,0 @@ -/********************************************************************/ -/* */ -/* L I QQ U U I DD W W A RR 555 */ -/* L I Q Q U U I D D W W A A R R 5 */ -/* L I Q Q U U I D D W W W AAA RR 55 */ -/* L I Q Q U U I D D WW WW A A R R 5 */ -/* LLL I Q Q U I DD W W A A R R 55 */ -/* */ -/* b */ -/* bb y y */ -/* b b yyy */ -/* bb y */ -/* yy */ -/* */ -/* U U FFF O O TTT */ -/* U U F O O O O T */ -/* U U TIRET FF O O O O T */ -/* U U F O O O O T */ -/* U F O O T */ -/* */ -/********************************************************************/ - -/*****************************************************************************/ -/* Liquid War is a multiplayer wargame */ -/* Copyright (C) 1998-2025 Christian Mauduit */ -/* */ -/* 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 */ -/* */ -/* Liquid War homepage : https://ufoot.org/liquidwar/v5 */ -/* Contact author : ufoot@ufoot.org */ -/*****************************************************************************/ - -/********************************************************************/ -/* nom : asm.h */ -/* contenu : assembly language related stuff */ -/********************************************************************/ - -#ifndef LIQUID_WAR_INCLUDE_ASM -#define LIQUID_WAR_INCLUDE_ASM - -/*==================================================================*/ -/* includes */ -/*==================================================================*/ - -/*==================================================================*/ -/* constants */ -/*==================================================================*/ - -/*==================================================================*/ -/* macros */ -/*==================================================================*/ - -#ifdef WIN32 -#define LW_ASM_FUNC __cdecl -#else -/* seems useless... #define LW_ASM_FUNC __attribute__((cdecl)) */ -#define LW_ASM_FUNC -#endif - -/*==================================================================*/ -/* functions */ -/*==================================================================*/ - -extern int lw_asm_check_struct_align (void); - -#endif diff --git a/src/back.c b/src/back.c index 286f95a4..48e2cc22 100644 --- a/src/back.c +++ b/src/back.c @@ -52,7 +52,7 @@ /* includes */ /*==================================================================*/ -#include +#include #include "back.h" #include "disk.h" @@ -70,10 +70,11 @@ /*------------------------------------------------------------------*/ void -display_a_back_image (BITMAP * bmp) +display_a_back_image (ALLEGRO_BITMAP * bmp) { scare_mouse (); - stretch_blit (bmp, screen, 0, 0, bmp->w, bmp->h, + stretch_blit (bmp, screen, 0, 0, + al_get_bitmap_width (bmp), al_get_bitmap_height (bmp), 0, PAGE_FLIP_H, SCREEN_W, SCREEN_H); unscare_mouse (); } diff --git a/src/back.h b/src/back.h index 8664d4f1..8db9534c 100644 --- a/src/back.h +++ b/src/back.h @@ -55,7 +55,7 @@ /* includes */ /*==================================================================*/ -#include +#include /*==================================================================*/ /* variables globales */ @@ -65,7 +65,7 @@ /* fonctions globales */ /*==================================================================*/ -void display_a_back_image (BITMAP * bmp); +void display_a_back_image (ALLEGRO_BITMAP * bmp); void display_back_image (void); #endif diff --git a/src/backport.c b/src/backport.c new file mode 100644 index 00000000..40c4d824 --- /dev/null +++ b/src/backport.c @@ -0,0 +1,2051 @@ +/********************************************************************/ +/* */ +/* L I QQ U U I DD W W A RR 555 */ +/* L I Q Q U U I D D W W A A R R 5 */ +/* L I Q Q U U I D D W W W AAA RR 55 */ +/* L I Q Q U U I D D WW WW A A R R 5 */ +/* LLL I Q Q U I DD W W A A R R 55 */ +/* */ +/* b */ +/* bb y y */ +/* b b yyy */ +/* bb y */ +/* yy */ +/* */ +/* U U FFF O O TTT */ +/* U U F O O O O T */ +/* U U TIRET FF O O O O T */ +/* U U F O O O O T */ +/* U F O O T */ +/* */ +/********************************************************************/ + +/*****************************************************************************/ +/* Liquid War is a multiplayer wargame */ +/* Copyright (C) 1998-2025 Christian Mauduit */ +/* */ +/* 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 */ +/* */ +/* Liquid War homepage : https://ufoot.org/liquidwar/v5 */ +/* Contact author : ufoot@ufoot.org */ +/*****************************************************************************/ + +/********************************************************************/ +/* name : backport.c */ +/* content : missing allegro 4 stuff */ +/* last update : Dec 24th 2018 */ +/********************************************************************/ + +/*==================================================================*/ +/* includes */ +/*==================================================================*/ + +#include +#include +#include +#include +#include +#include +#include + +#include "backport.h" +#include "palette.h" +#include "macro.h" +#include "mutxgen.h" +#include "thrdgen.h" +#include "log.h" +#include "init.h" + +/*==================================================================*/ +/* defines */ +/*==================================================================*/ + +#define _NB_TIMERS 16 +#define _ITOA_BUF_SIZE 30 + +/*==================================================================*/ +/* types */ +/*==================================================================*/ + +typedef struct +{ + int delay_ms; + void (*proc) (); +} _backport_timer_data; + +/*==================================================================*/ +/* variables globales */ +/*==================================================================*/ + +static int _allegro_errno = 0; +static unsigned char *_rgb_to_palette_map = NULL; // 24-bit RGB to palette index map +static int _rgb_map_initialized = 0; +static int _dummy = 0; // stupid dummy to get rid of unused param warning +static _backport_timer_data _backport_timers[_NB_TIMERS]; +static LW_MUTEX_DATA _backport_timer_mutex = { NULL }; +static char *_config_file = NULL; +static ALLEGRO_CONFIG *_config = NULL; + +ALLEGRO_BITMAP *screen = NULL; +ALLEGRO_DISPLAY *allegro_display = NULL; +int SCREEN_W = 0; +int SCREEN_H = 0; +int VIRTUAL_H = 0; +ALLEGRO_FONT *font = NULL; +volatile int mouse_x = 0; +volatile int mouse_y = 0; +volatile int mouse_z = 0; +volatile int mouse_b = 0; + +// GUI color variables for Allegro 4 compatibility +int gui_bg_color = 0; +int gui_fg_color = 15; +int gui_mg_color = 8; +int *allegro_errno = &_allegro_errno; +volatile JOYSTICK_INFO joy[MAX_JOYSTICKS]; +int num_joysticks = 0; +char empty_string[] = { 0, 0, 0, 0 }; +volatile char key[KEY_MAX]; + +/*==================================================================*/ +/* fonctions */ +/*==================================================================*/ + +/*------------------------------------------------------------------*/ +void +scare_mouse () +{ + /* + * Using a higher level API now, looks like those disappeared. + * Keeping them so that whatever workaround those calls were + * achieving, it's easier to backport it afterwards. + */ +} + +/*------------------------------------------------------------------*/ +void +scare_mouse_area (int x, int y, int w, int h) +{ + /* + * Using a higher level API now, looks like those disappeared. + * Keeping them so that whatever workaround those calls were + * achieving, it's easier to backport it afterwards. + */ + _dummy = x; + _dummy = y; + _dummy = w; + _dummy = h; +} + +/*------------------------------------------------------------------*/ +void +unscare_mouse () +{ + /* + * Using a higher level API now, looks like those disappeared. + * Keeping them so that whatever workaround those calls were + * achieving, it's easier to backport it afterwards. + */ +} + +/*------------------------------------------------------------------*/ +int +poll_mouse (void) +{ + // https://liballeg.org/stabledocs/en/alleg004.html#poll_mouse + ALLEGRO_MOUSE_STATE mouse_state; + + memset (&mouse_state, 0, sizeof (mouse_state)); + al_get_mouse_state (&mouse_state); + int num_axes = num_axes = al_get_mouse_num_axes (); + if (num_axes >= 1) + { + mouse_x = al_get_mouse_state_axis (&mouse_state, 0); + } + if (num_axes >= 2) + { + mouse_y = al_get_mouse_state_axis (&mouse_state, 1); + } + if (num_axes >= 3) + { + mouse_z = al_get_mouse_state_axis (&mouse_state, 2); + } + mouse_b = mouse_state.buttons; + + return 0; +} + +/*------------------------------------------------------------------*/ +int +mouse_needs_poll (void) +{ + // https://liballeg.org/stabledocs/en/alleg004.html#mouse_needs_poll + /* + * Stupid answer which means "poll all the time" but this is (hopefully) + * transition code, if this is a perf bottleneck it should be easy to + * remove or change all that polling logic. + */ + return 1; +} + +/*------------------------------------------------------------------*/ +void +position_mouse (int x, int y) +{ + // https://liballeg.org/stabledocs/en/alleg004.html#position_mouse + al_set_mouse_xy (allegro_display, x, y); + mouse_x = x; + mouse_y = y; +} + +/*------------------------------------------------------------------*/ +void +set_mouse_sprite (ALLEGRO_BITMAP *sprite) +{ + // https://liballeg.org/stabledocs/en/alleg004.html#set_mouse_sprite + if (sprite) + { + al_set_mouse_cursor (allegro_display, al_create_mouse_cursor (sprite, 0, 0)); + } +} + +/*------------------------------------------------------------------*/ +void +show_mouse (ALLEGRO_BITMAP *bmp) +{ + // https://liballeg.org/stabledocs/en/alleg004.html#show_mouse + (void) bmp; // Ignore bitmap parameter since Allegro 5 handles cursor display differently + al_show_mouse_cursor (allegro_display); +} + +/*------------------------------------------------------------------*/ +void +clear_to_color (ALLEGRO_BITMAP * bitmap, int color) +{ + // https://liballeg.org/stabledocs/en/alleg013.html#clear_to_color + al_set_target_bitmap (bitmap); + if (color < 0 || color >= PALETTE_SIZE) + { + return; + } + ALLEGRO_COLOR al_color; + al_color = rgb_to_allegro_color(GLOBAL_PALETTE[color]); + al_clear_to_color (al_color); +} + +/*------------------------------------------------------------------*/ +void +putpixel (ALLEGRO_BITMAP * bitmap, int x, int y, int color) +{ + // https://liballeg.org/stabledocs/en/alleg013.html#putpixel + if (color < 0 || color >= PALETTE_SIZE) + { + return; + } + + RGB rgb = GLOBAL_PALETTE[color]; + ALLEGRO_COLOR al_color = al_map_rgb(rgb.r, rgb.g, rgb.b); + + al_set_target_bitmap (bitmap); + al_put_pixel (x, y, al_color); +} + +/*------------------------------------------------------------------*/ +void +putpixel_fast (int x, int y, int color) +{ + // Optimized version that assumes target bitmap is already set + // Use al_set_target_bitmap() before calling this in a loop + if (color < 0 || color >= PALETTE_SIZE) + { + return; + } + + RGB rgb = GLOBAL_PALETTE[color]; + ALLEGRO_COLOR al_color = al_map_rgb(rgb.r, rgb.g, rgb.b); + + al_put_pixel (x, y, al_color); +} + +/*------------------------------------------------------------------*/ +static void +_init_rgb_to_palette_map (void) +{ + // Initialize the 24-bit RGB to palette index lookup table + if (_rgb_map_initialized) + { + return; + } + + // Allocate 16MB for 24-bit RGB space (2^24 = 16,777,216 bytes) + _rgb_to_palette_map = malloc(16777216); + if (_rgb_to_palette_map == NULL) + { + return; // Fall back to slow lookup if allocation fails + } + + // Initialize all entries to 255 (invalid palette index) + memset(_rgb_to_palette_map, 255, 16777216); + + // Fill the map with palette colors + for (int i = 0; i < PALETTE_SIZE; i++) + { + float r, g, b, a; + al_unmap_rgba_f (rgb_to_allegro_color(GLOBAL_PALETTE[i]), &r, &g, &b, &a); + + // Convert to 8-bit RGB + unsigned char r8 = (unsigned char)(r * 255.0f); + unsigned char g8 = (unsigned char)(g * 255.0f); + unsigned char b8 = (unsigned char)(b * 255.0f); + + // Calculate 24-bit RGB index + int rgb_index = (r8 << 16) | (g8 << 8) | b8; + _rgb_to_palette_map[rgb_index] = (unsigned char)i; + } + + _rgb_map_initialized = 1; +} + +/*------------------------------------------------------------------*/ +int +getpixel (ALLEGRO_BITMAP * bitmap, int x, int y) +{ + // https://liballeg.org/stabledocs/en/alleg013.html#getpixel + /* + * Fast palette lookup using 24-bit RGB to palette index map. + * al_get_pixel takes bitmap as parameter, no need to set target. + */ + ALLEGRO_COLOR pixel_color; + + pixel_color = al_get_pixel (bitmap, x, y); + + // Convert to RGB + float r, g, b, a; + al_unmap_rgba_f (pixel_color, &r, &g, &b, &a); + unsigned char r8 = (unsigned char)(r * 255.0f); + unsigned char g8 = (unsigned char)(g * 255.0f); + unsigned char b8 = (unsigned char)(b * 255.0f); + + // Initialize lookup table if needed + if (!_rgb_map_initialized) + { + _init_rgb_to_palette_map(); + } + + // Fast lookup if map is available + if (_rgb_to_palette_map != NULL) + { + int rgb_index = (r8 << 16) | (g8 << 8) | b8; + unsigned char palette_index = _rgb_to_palette_map[rgb_index]; + + if (palette_index != 255) // Found exact match + { + return (int)palette_index; + } + } + + // Fallback: find closest palette color by distance + int best_match = 0; + float best_distance = 9999999.0f; + + for (int i = 0; i < PALETTE_SIZE; i++) + { + float pr, pg, pb, pa; + al_unmap_rgba_f (rgb_to_allegro_color(GLOBAL_PALETTE[i]), &pr, &pg, &pb, &pa); + + // Calculate distance (simple RGB distance) + float dr = r - pr; + float dg = g - pg; + float db = b - pb; + float distance = dr * dr + dg * dg + db * db; + + if (distance < best_distance) + { + best_distance = distance; + best_match = i; + } + } + + return best_match; +} + +/*------------------------------------------------------------------*/ +void +rect (ALLEGRO_BITMAP * bitmap, int x1, int y1, int x2, int y2, int color) +{ + // https://liballeg.org/stabledocs/en/alleg013.html#rect + if (x2 < x1 || y2 < y1) + { + return; + } + al_set_target_bitmap (bitmap); + if (color < 0 || color >= PALETTE_SIZE) + { + return; + } + ALLEGRO_COLOR al_color; + al_color = rgb_to_allegro_color(GLOBAL_PALETTE[color]); + al_draw_filled_rectangle (x1, y1, x2, y1 + 1, al_color); + al_draw_filled_rectangle (x2, y1, x2 + 1, y2, al_color); + al_draw_filled_rectangle (x1 + 1, y2, x2 + 1, y2 + 1, al_color); + al_draw_filled_rectangle (x1, y1 + 1, x1 + 1, y2 + 1, al_color); +} + +/*------------------------------------------------------------------*/ +void +rectfill (ALLEGRO_BITMAP * bitmap, int x1, int y1, int x2, int y2, int color) +{ + // https://liballeg.org/stabledocs/en/alleg013.html#rectfill + al_set_target_bitmap (bitmap); + if (color < 0 || color >= PALETTE_SIZE) + { + return; + } + ALLEGRO_COLOR al_color; + al_color = rgb_to_allegro_color(GLOBAL_PALETTE[color]); + // +1 on second coord because floating point vs integer + al_draw_filled_rectangle (x1, y1, x2 + 1, y2 + 1, al_color); +} + +/*------------------------------------------------------------------*/ +void +rectfill_dotted (ALLEGRO_BITMAP * bitmap, int x1, int y1, int x2, int y2, + int fg, int bg) +{ + /* + * This is not a genuine Allegro function, but used to backport the behavior + * of filling zones with a pattern which is: + * +--+--+--+--+ + * +fg+bg+fg+bg+ + * +--+--+--+--+ + * +bg+fg+bg+fg+ + * +--+--+--+--+ + * +fg+bg+fg+bg+ + * +--+--+--+--+ + * +bg+fg+bg+fg+ + * +--+--+--+--+ + * etc. + * Rather than implemeting generic pattern handling, this is quicker to implement. + * and suits our limited need. + */ + if (fg < 0 || fg >= PALETTE_SIZE) + { + return; + } + ALLEGRO_COLOR al_fg; + al_fg = rgb_to_allegro_color(GLOBAL_PALETTE[fg]); + + if (bg < 0 || bg >= PALETTE_SIZE) + { + return; + } + ALLEGRO_COLOR al_bg; + al_bg = rgb_to_allegro_color(GLOBAL_PALETTE[bg]); + + ALLEGRO_COLOR al_color = al_bg; + int x = 0; + int y = 0; + + al_set_target_bitmap (bitmap); + for (y = y1; y <= y2; y++) + { + for (x = x1; x <= x2; x++) + { + al_color = ((x + y) % 2) != 0 ? al_fg : al_bg; + al_put_pixel (x, y, al_color); + } + } +} + +/*------------------------------------------------------------------*/ +void +vline (ALLEGRO_BITMAP * bitmap, int x, int y1, int y2, int color) +{ + // https://liballeg.org/stabledocs/en/alleg013.html#vline + if (y2 < y1) + { + int y = y2; + y2 = y1; + y1 = y; + } + al_set_target_bitmap (bitmap); + if (color < 0 || color >= PALETTE_SIZE) + { + return; + } + ALLEGRO_COLOR al_color; + al_color = rgb_to_allegro_color(GLOBAL_PALETTE[color]); + al_draw_filled_rectangle (x, y1, x + 1, y2 + 1, al_color); +} + +/*------------------------------------------------------------------*/ +void +hline (ALLEGRO_BITMAP * bitmap, int x1, int y, int x2, int color) +{ + // https://liballeg.org/stabledocs/en/alleg013.html#hline + if (x2 < x1) + { + int x = x2; + x2 = x1; + x1 = x; + } + al_set_target_bitmap (bitmap); + if (color < 0 || color >= PALETTE_SIZE) + { + return; + } + ALLEGRO_COLOR al_color; + al_color = rgb_to_allegro_color(GLOBAL_PALETTE[color]); + al_draw_filled_rectangle (x1, y, x2 + 1, y + 1, al_color); +} + +void +line (ALLEGRO_BITMAP * bitmap, int x1, int y1, int x2, int y2, int color) +{ + // https://liballeg.org/stabledocs/en/alleg013.html#line + if (x1 == x2) + { + vline (bitmap, x1, y1, y2, color); + return; + } + if (y1 == y2) + { + hline (bitmap, x1, y1, x2, color); + return; + } + + al_set_target_bitmap (bitmap); + if (color < 0 || color >= PALETTE_SIZE) + { + return; + } + ALLEGRO_COLOR al_color; + al_color = rgb_to_allegro_color(GLOBAL_PALETTE[color]); + + /* ugliest line drawing ever, but we don't care, this is never called */ + int w = x2 - x1; + int h = y2 - y1; + int d = ABS (w) + ABS (h); + int i = 0; + for (i = 0; i <= d; i++) + { + int x = ((i * x2) + ((d - i) * x1)) / d; + int y = ((i * y2) + ((d - i) * y1)) / d; + al_put_pixel (x, y, al_color); + } +} + +/*------------------------------------------------------------------*/ +int +usetc (char *s, int c) +{ + // https://liballeg.org/stabledocs/en/alleg002.html#usetc + ALLEGRO_USTR *us = NULL; + int l = 0; + const char *s2 = NULL; + + us = al_ustr_new (s); + al_ustr_set_chr (us, 0, c); + s2 = al_cstr (us); + l = strlen (s); + LW_MACRO_STRNCPY (s, s2, l + 1); + al_ustr_free (us); + + return l; +} + +/*------------------------------------------------------------------*/ +int +ugetc (const char *s) +{ + // https://liballeg.org/stabledocs/en/alleg002.html#ugetc + ALLEGRO_USTR *us = NULL; + int c = 0; + + us = al_ustr_new (s); + c = al_ustr_get (us, 0); + al_ustr_free (us); + + return c; +} + +/*------------------------------------------------------------------*/ +int +uwidth (const char *s) +{ + // https://liballeg.org/stabledocs/en/alleg002.html#uwidth + ALLEGRO_USTR *us = NULL; + int pos = 0; + bool found = false; + + us = al_ustr_new (s); + found = al_ustr_next (us, &pos); + al_ustr_free (us); + + if (!found) + { + return 0; + } + return pos; +} + +/*------------------------------------------------------------------*/ +int +ustrlen (const char *s) +{ + // https://liballeg.org/stabledocs/en/alleg002.html#ustrlen + ALLEGRO_USTR *us = NULL; + int l = 0; + + us = al_ustr_new (s); + l = al_ustr_length (us); + al_ustr_free (us); + + return l; +} + +/*------------------------------------------------------------------*/ +int +uisspace (int c) +{ + // https://liballeg.org/stabledocs/en/alleg002.html#uisspace + /* + * Super naive impl, should do the job for the LW use-case. + */ + return c <= 32; +} + +/*------------------------------------------------------------------*/ +int +ucwidth (int c) +{ + // https://liballeg.org/stabledocs/en/alleg002.html#ucwidth + _dummy = c; + return 1; +} + +/*------------------------------------------------------------------*/ +int +ugetat (char *s, int index) +{ + // https://liballeg.org/stabledocs/en/alleg002.html#ugetat + ALLEGRO_USTR *us = NULL; + int c = 0; + + us = al_ustr_new (s); + c = al_ustr_get (us, index); + al_ustr_free (us); + + return c; +} + +/*------------------------------------------------------------------*/ +int +usetat (char *s, int index, int c, int max_size) +{ + // https://liballeg.org/stabledocs/en/alleg002.html#usetat + /* + * Altered the protoype of that one, not giving max_size here + * is just totally super-dangerous IMHO. + */ + ALLEGRO_USTR *us = NULL; + int l = 0; + int max_len = max_size - 1; + + l = strlen (s); + if (index < 0) + { + index = l - index; + } + if (index >= max_len || index < 0) + { + return 0; + } + + us = al_ustr_new (s); + if (c == 0) + { + al_ustr_truncate (us, index); + } + else + { + al_ustr_remove_chr (us, index); + al_ustr_insert_chr (us, index, c); + } + LW_MACRO_STRNCPY (s, al_cstr (us), max_size); + al_ustr_free (us); + + return (strlen (s) - l); +} + +/*------------------------------------------------------------------*/ +int +uinsert (char *s, int index, int c, int max_size) +{ + // https://liballeg.org/stabledocs/en/alleg002.html#uinsert + /* + * Altered the protoype of that one, not giving max_size here + * is just totally super-dangerous IMHO. + */ + ALLEGRO_USTR *us = NULL; + int l = 0; + int max_len = max_size - 1; + + l = strlen (s); + if (index < 0) + { + index = l - index; + } + if (index >= max_len || index < 0) + { + return 0; + } + + us = al_ustr_new (s); + if (c == 0) + { + al_ustr_truncate (us, index); + } + else + { + al_ustr_insert_chr (us, index, c); + } + LW_MACRO_STRNCPY (s, al_cstr (us), max_size); + al_ustr_free (us); + + return (strlen (s) - l); +} + +/*------------------------------------------------------------------*/ +int +uremove (char *s, int index) +{ + // https://liballeg.org/stabledocs/en/alleg002.html#uremove + ALLEGRO_USTR *us = NULL; + int l = 0; + + l = strlen (s); + if (index < 0) + { + index = l - index; + } + if (index < 0) + { + return 0; + } + + us = al_ustr_new (s); + al_ustr_remove_chr (us, index); + LW_MACRO_STRNCPY (s, al_cstr (us), l); + al_ustr_free (us); + + return (strlen (s) - l); +} + +/*------------------------------------------------------------------*/ +int +uisok (int c) +{ + // https://liballeg.org/stabledocs/en/alleg002.html#uiosok + /* + * [FIXME:ufoot] right now does nothing real, but game handles + * UTF-8 very poorly, TBH. + */ + return ((c >= ' ') && (c <= 127)); +} + +/*------------------------------------------------------------------*/ +int +utolower (int c) +{ + // https://liballeg.org/stabledocs/en/alleg002.html#utolower + /* + * [FIXME:ufoot] right now does nothing real, but game handles + * UTF-8 very poorly, TBH. + */ + if ((c >= 'A') && (c <= 'Z')) + { + c += 'a' - 'A'; + } + return c; +} + +/*------------------------------------------------------------------*/ +char * +ustrdup (const char *src) +{ + // https://liballeg.org/stabledocs/en/alleg002.html#ustrdup + /* + * [TODO:ufoot] find out why this was redefined in the first place. + */ + return strdup (src); +} + +/*------------------------------------------------------------------*/ +int +ugetx (char **s) +{ + // https://liballeg.org/stabledocs/en/alleg002.html#ugetx + return ugetxc ((const char **) s); +} + +/*------------------------------------------------------------------*/ +int +ugetxc (const char **s) +{ + // https://liballeg.org/stabledocs/en/alleg002.html#ugetxc + int c = *((unsigned char *) ((*s)++)); + int n, t; + + if (c & 0x80) + { + n = 1; + while (c & (0x80 >> n)) + n++; + + c &= (1 << (8 - n)) - 1; + + while (--n > 0) + { + t = *((unsigned char *) ((*s)++)); + + if ((!(t & 0x80)) || (t & 0x40)) + { + (*s)--; + return '^'; + } + + c = (c << 6) | (t & 0x3F); + } + } + + return c; +} + +/*------------------------------------------------------------------*/ +char * +ustrtok_r (char *s, AL_CONST char *set, char **last) +{ + // https://liballeg.org/stabledocs/en/alleg002.html#ustrtok_r + char *prev_str, *tok; + AL_CONST char *setp; + int c, sc; + + ALLEGRO_ASSERT (last); + + if (!s) + { + s = *last; + + if (!s) + return NULL; + } + +skip_leading_delimiters: + + prev_str = s; + c = ugetx (&s); + + setp = set; + + while ((sc = ugetxc (&setp)) != 0) + { + if (c == sc) + goto skip_leading_delimiters; + } + + if (!c) + { + *last = NULL; + return NULL; + } + + tok = prev_str; + + for (;;) + { + prev_str = s; + c = ugetx (&s); + + setp = set; + + do + { + sc = ugetxc (&setp); + if (sc == c) + { + if (!c) + { + *last = NULL; + return tok; + } + else + { + int l = 0; + l = strlen (prev_str); + s += usetat (prev_str, 0, 0, l + 1); + *last = s; + return tok; + } + } + } + while (sc); + } +} + +/*------------------------------------------------------------------*/ +char * +uconvert_ascii (const char *s, char buf[], int size) +{ + // https://liballeg.org/stabledocs/en/alleg002.html#uconvert_ascii + /* + * Slightly altered prototype to make sure we use explicit size + */ + LW_MACRO_STRNCPY (buf, s, size); + return (char *) buf; +} + +/*------------------------------------------------------------------*/ +int +text_length (const ALLEGRO_FONT * f, const char *s) +{ + // https://liballeg.org/stabledocs/en/alleg018.html#text_length + return al_get_text_width (f, s); +} + +/*------------------------------------------------------------------*/ +int +text_height (const ALLEGRO_FONT * f) +{ + // https://liballeg.org/stabledocs/en/alleg018.html#text_height + return al_get_font_line_height (f); +} + +/*------------------------------------------------------------------*/ +void +textout_ex (ALLEGRO_BITMAP * bmp, const ALLEGRO_FONT * f, const char *s, + int x, int y, int color, int bg) +{ + // https://liballeg.org/stabledocs/en/alleg018.html#textout_ex + int w = 0; + int h = 0; + + w = text_length (f, s); + h = text_height (f); + rectfill (bmp, x, y, x + w - 1, y + h - 1, bg); + + al_set_target_bitmap (bmp); + if (color < 0 || color >= PALETTE_SIZE) + { + return; + } + ALLEGRO_COLOR al_color; + al_color = rgb_to_allegro_color(GLOBAL_PALETTE[color]); + + al_draw_text (f, al_color, x, y, 0, s); +} + +/*------------------------------------------------------------------*/ +void +rest_callback (unsigned int time, void (*callback) (void)) +{ + // https://liballeg.org/stabledocs/en/alleg005.html#rest_callback + double delay; + + delay = ((double) time) / 1000.0; + if (callback == NULL) + { + al_rest (delay); + } + else + { + unsigned int i; + + for (i = 0; i < time; i++) + { + al_rest (0.001); + callback (); + } + } +} + +/*------------------------------------------------------------------*/ +void +rest (unsigned int time) +{ + // https://liballeg.org/stabledocs/en/alleg005.html#rest + rest_callback (time, NULL); +} + +/*------------------------------------------------------------------*/ +int +install_timer () +{ + // https://liballeg.org/stabledocs/en/alleg005.html#install_timer + memset (_backport_timers, 0, sizeof (_backport_timers)); + memset (&_backport_timer_mutex, 0, sizeof (_backport_timer_mutex)); + + return (lw_mutex_init (&_backport_timer_mutex) == 0) ? -1 : 0; +} + +/*------------------------------------------------------------------*/ +void +remove_timer () +{ + // https://liballeg.org/stabledocs/en/alleg005.html#remove_timer + memset (_backport_timers, 0, sizeof (_backport_timers)); + memset (&_backport_timer_mutex, 0, sizeof (_backport_timer_mutex)); +} + + +/*------------------------------------------------------------------*/ +void +_backport_timer_callback (void *ptr) +{ + _backport_timer_data *data = NULL; + + data = (_backport_timer_data *) ptr; + while (data->proc) + { + data->proc (); + rest (data->delay_ms); + } +} + +/*------------------------------------------------------------------*/ +int +install_int (void (*proc) (), int speed) +{ + // https://liballeg.org/stabledocs/en/alleg005.html#install_int + int i = 0; + bool found = false; + int ret = 0; + + if (speed <= 0) + { + speed = 1; + } + + lw_mutex_lock (&_backport_timer_mutex); + for (i = 0; i < _NB_TIMERS && !found; i++) + { + if (_backport_timers[i].proc == proc) + { + _backport_timers[i].delay_ms = speed; + found = true; + } + } + for (i = 0; i < _NB_TIMERS && !found; i++) + { + if (_backport_timers[i].proc == NULL) + { + _backport_timers[i].proc = proc; + _backport_timers[i].delay_ms = speed; + if (!lw_thread_start + (_backport_timer_callback, &(_backport_timers[i]))) + { + ret = -2; + } + found = true; + } + } + lw_mutex_unlock (&_backport_timer_mutex); + + return found ? ret : -1; +} + +/*------------------------------------------------------------------*/ +int +install_int_ex (void (*proc) (), int speed) +{ + // https://liballeg.org/stabledocs/en/alleg005.html#install_int_ex + // This is a compatibility stub - for full implementation, files should + // be migrated to use modern Allegro 5 timer APIs like al_get_time() + return install_int (proc, speed); +} + +/*------------------------------------------------------------------*/ +void +remove_int (void (*proc) ()) +{ + // https://liballeg.org/stabledocs/en/alleg005.html#remove_int + int i = 0; + bool found = false; + + lw_mutex_lock (&_backport_timer_mutex); + for (i = 0; i < _NB_TIMERS && !found; i++) + { + if (_backport_timers[i].proc == proc) + { + _backport_timers[i].proc = NULL; + found = true; + } + } + lw_mutex_unlock (&_backport_timer_mutex); +} + +/*------------------------------------------------------------------*/ +void +draw_sprite (ALLEGRO_BITMAP * bmp, ALLEGRO_BITMAP * sprite, int x, int y) +{ + // https://liballeg.org/stabledocs/en/alleg014.html#draw_sprite + al_set_target_bitmap (bmp); + al_draw_bitmap (sprite, x, y, 0); +} + +/*------------------------------------------------------------------*/ +void +blit (ALLEGRO_BITMAP * source, ALLEGRO_BITMAP * dest, + int source_x, int source_y, + int dest_x, int dest_y, int dest_width, int dest_height) +{ + // https://liballeg.org/stabledocs/en/alleg014.html#blit + al_set_target_bitmap (dest); + int sw = MAX (MIN (al_get_bitmap_width (source) - source_x, dest_width), 0); + int sh = + MAX (MIN (al_get_bitmap_height (source) - source_y, dest_height), 0); + al_draw_bitmap_region (source, source_x, source_y, sw, sh, dest_x, dest_y, + 0); +} + +/*------------------------------------------------------------------*/ +void +stretch_blit (ALLEGRO_BITMAP * source, ALLEGRO_BITMAP * dest, + int source_x, int source_y, int source_width, int source_height, + int dest_x, int dest_y, int dest_width, int dest_height) +{ + // https://liballeg.org/stabledocs/en/alleg014.html#stretch_blit + al_set_target_bitmap (dest); + al_draw_scaled_bitmap (source, source_x, source_y, source_width, + source_height, dest_x, dest_y, dest_width, + dest_height, 0); +} + +/*------------------------------------------------------------------*/ +ALLEGRO_BITMAP * +load_bitmap (const char *filename, PALETTE pal) +{ + // https://liballeg.org/stabledocs/en/alleg014.html#load_bitmap + ALLEGRO_BITMAP *bmp; + (void) pal; // Ignore palette parameter since Allegro 5 handles palettes differently + + // Try using flags to optimize loading performance + bmp = al_load_bitmap_flags(filename, ALLEGRO_MEMORY_BITMAP); + return bmp; +} + +/*------------------------------------------------------------------*/ +void +set_volume (int digi_volume, int midi_volume) +{ + // https://liballeg.org/stabledocs/en/alleg011.html#set_volume + (void) digi_volume; // Digital volume not used in this implementation + // In Allegro 5, we would set the mixer gain, but for now just ignore + // since MIDI playback uses ALLEGRO_SAMPLE which has its own volume control + (void) midi_volume; // MIDI volume handled per-sample in play_midi +} + +/*------------------------------------------------------------------*/ +int +play_midi (ALLEGRO_SAMPLE *midi, int loop) +{ + // https://liballeg.org/stabledocs/en/alleg011.html#play_midi + static ALLEGRO_SAMPLE_INSTANCE *current_music = NULL; + + // Stop any currently playing music + if (current_music) + { + al_stop_sample_instance (current_music); + al_destroy_sample_instance (current_music); + current_music = NULL; + } + + if (midi) + { + current_music = al_create_sample_instance (midi); + if (current_music) + { + al_set_sample_instance_playmode (current_music, + loop ? ALLEGRO_PLAYMODE_LOOP : ALLEGRO_PLAYMODE_ONCE); + al_attach_sample_instance_to_mixer (current_music, al_get_default_mixer ()); + return al_play_sample_instance (current_music) ? 1 : 0; + } + } + + return midi ? 0 : 1; // Return 1 for stop (NULL), 0 for failed play +} + +/*------------------------------------------------------------------*/ +int +play_sample (ALLEGRO_SAMPLE *spl, int vol, int pan, int freq, int loop) +{ + // https://liballeg.org/stabledocs/en/alleg011.html#play_sample + // Allegro 4: play_sample(sample, vol, pan, freq, loop) + // vol: 0-255, pan: 0-255 (128=center), freq: 1000=normal, loop: 0=once, 1=loop + + if (!spl) { + return -1; + } + + ALLEGRO_SAMPLE_INSTANCE *instance = al_create_sample_instance(spl); + if (!instance) { + return -1; + } + + // Set volume (0-255 -> 0.0-1.0) + float al_vol = (float)vol / 255.0f; + al_set_sample_instance_gain(instance, al_vol); + + // Set pan (0-255 -> -1.0 to 1.0, where 128 = 0.0 center) + float al_pan = ((float)pan - 128.0f) / 128.0f; + al_set_sample_instance_pan(instance, al_pan); + + // Set frequency/speed (1000 = normal speed) + float speed = (float)freq / 1000.0f; + al_set_sample_instance_speed(instance, speed); + + // Set looping + ALLEGRO_PLAYMODE playmode = loop ? ALLEGRO_PLAYMODE_LOOP : ALLEGRO_PLAYMODE_ONCE; + al_set_sample_instance_playmode(instance, playmode); + + // Attach to default mixer and play + al_attach_sample_instance_to_mixer(instance, al_get_default_mixer()); + + if (al_play_sample_instance(instance)) { + // In Allegro 4, play_sample returned the voice number (positive) + // We'll return 1 to indicate success (can't return actual voice) + return 1; + } else { + al_destroy_sample_instance(instance); + return -1; + } +} + +/*------------------------------------------------------------------*/ +void +acquire_bitmap (ALLEGRO_BITMAP * bmp) +{ + // https://liballeg.org/stabledocs/en/alleg009.html#acquire_bitmap + al_lock_bitmap (bmp, ALLEGRO_PIXEL_FORMAT_ANY, ALLEGRO_PIXEL_FORMAT_ANY); +} + +/*------------------------------------------------------------------*/ +void +acquire_screen () +{ + // https://liballeg.org/stabledocs/en/alleg009.html#acquire_screen + acquire_bitmap (screen); +} + +/*------------------------------------------------------------------*/ +void +release_bitmap (ALLEGRO_BITMAP * bmp) +{ + // https://liballeg.org/stabledocs/en/alleg009.html#release_bitmap + al_unlock_bitmap (bmp); +} + +/*------------------------------------------------------------------*/ +void +release_screen () +{ + // https://liballeg.org/stabledocs/en/alleg009.html#release_screen + release_bitmap (screen); +} + +/*------------------------------------------------------------------*/ +void +set_clip_rect (ALLEGRO_BITMAP * bitmap, int x1, int y1, int x2, int y2) +{ + // https://liballeg.org/stabledocs/en/alleg009.html#set_clip_rect + al_set_target_bitmap (bitmap); + if (x1 < 0) + { + x1 = 0; + } + if (y1 < 0) + { + y1 = 0; + } + if (x1 > al_get_bitmap_width (bitmap)) + { + x1 = al_get_bitmap_width (bitmap); + } + if (y1 > al_get_bitmap_height (bitmap)) + { + y1 = al_get_bitmap_height (bitmap); + } + if (x2 > al_get_bitmap_width (bitmap)) + { + x2 = al_get_bitmap_width (bitmap); + } + if (y2 > al_get_bitmap_height (bitmap)) + { + y2 = al_get_bitmap_height (bitmap); + } + int w = x2 - x1 + 1; + int h = y2 - y1 + 1; + if (w < 0) + { + w = 0; + } + if (h < 0) + { + h = 0; + } + al_set_clipping_rectangle (x1, y1, w, h); +} + +/*------------------------------------------------------------------*/ +int +install_joystick (int type) +{ + // https://liballeg.org/stabledocs/en/alleg007.html#install_joystick + + (void) type; // Ignore type parameter since Allegro 5 auto-detects + + if (!al_install_joystick ()) + { + return -1; + } + + num_joysticks = al_get_num_joysticks (); + return 0; +} + +/*------------------------------------------------------------------*/ +int +poll_joystick () +{ + // https://liballeg.org/stabledocs/en/alleg007.html#poll_joystick + + memset ((void *) &joy[0], 0, sizeof (joy)); + num_joysticks = al_get_num_joysticks (); + int j = 0; + for (j = 0; j < num_joysticks && j < MAX_JOYSTICKS; j++) + { + ALLEGRO_JOYSTICK *joystick = NULL; + joystick = al_get_joystick (j); + if (joystick == NULL) + { + continue; + } + joy[j].name = al_get_joystick_name (joystick); + ALLEGRO_JOYSTICK_STATE joystick_state; + memset (&joystick_state, 0, sizeof (joystick_state)); + al_get_joystick_state (joystick, &joystick_state); + int num_sticks = al_get_joystick_num_sticks (joystick); + int s = 0; + for (s = 0; s < num_sticks && s < MAX_JOYSTICK_STICKS; s++) + { + joy[j].stick[s].name = al_get_joystick_stick_name (joystick, s); + int num_axes = al_get_joystick_num_axes (joystick, s); + int a = 0; + for (a = 0; a < num_axes && a < MAX_JOYSTICK_AXIS; a++) + { + joy[j].stick[s].axis[a].name = + al_get_joystick_axis_name (joystick, s, a); + float p = joystick_state.stick[s].axis[a]; + joy[j].stick[s].axis[a].pos = (int) (p * 128.0); + if (p < 0) + { + joy[j].stick[s].axis[a].d1 = 1; + } + else if (p > 0) + { + joy[j].stick[s].axis[a].d2 = 1; + } + } + int num_buttons = al_get_joystick_num_buttons (joystick); + int b = 0; + for (b = 0; b < num_buttons && b < MAX_JOYSTICK_BUTTONS; b++) + { + joy[j].button[b].name = + al_get_joystick_button_name (joystick, b); + joy[j].button[b].b = joystick_state.button[b] ? 1 : 0; + } + } + } + + return 0; +} + +/*------------------------------------------------------------------*/ +int +keypressed () +{ + // https://liballeg.org/stabledocs/en/alleg006.html#keypressed + /* + * [FIXME:ufoot] implement this. + */ + return 0; +} + +/*------------------------------------------------------------------*/ +int +readkey () +{ + // https://liballeg.org/stabledocs/en/alleg006.html#readkey + /* + * [FIXME:ufoot] implement this. + */ + return 0; +} + +/*------------------------------------------------------------------*/ +int +ureadkey (int *scancode) +{ + // https://liballeg.org/stabledocs/en/alleg006.html#ureadkey + /* + * [FIXME:ufoot] implement this. + */ + if (scancode != NULL) + { + (*scancode) = 0; + } + return 0; +} + +/*------------------------------------------------------------------*/ +void +clear_keybuf () +{ + // https://liballeg.org/stabledocs/en/alleg006.html#clear_keybuf + /* + * [FIXME:ufoot] implement this. + */ +} + +/*------------------------------------------------------------------*/ +void +simulate_keypress (int key) +{ + // https://liballeg.org/stabledocs/en/alleg006.html#simulate_keypress + /* + * [FIXME:ufoot] implement this. + */ + _dummy = key; +} + +/*------------------------------------------------------------------*/ +int +scancode_to_ascii (int scancode) +{ + // https://liballeg.org/stabledocs/en/alleg006.html#scancode_to_ascii + /* + * Again, most unreliable and primitive impl, but should be enough + * for the limited usage we make of that function. + */ + int ascii = 0; + char *name = ustrdup (al_keycode_to_name (scancode)); + + // naive tolower + char *pos = NULL; + for (pos = name; *pos; pos++) + { + char c = *pos; + if (c >= 'A' && c <= 'Z') + { + (*pos) = c + 'a' - 'A'; + } + } + // normally it's "space" but accept " " too. + if (strcmp (name, " ") == 0 || strcmp (name, "space") == 0) + { + ascii = 0; + } + else if (strlen (name) == 1 && name[0] >= 'a' && name[0] <= 'z') + { + // standard letter, the only thing we really need to handle + ascii = name[0]; + } + free (name); + + return ascii; +} + +/*------------------------------------------------------------------*/ +void +remove_keyboard (void) +{ + // In Allegro 5, we don't need to explicitly remove keyboard + // This function is provided for compatibility and does nothing +} + +/*------------------------------------------------------------------*/ +void create_if_not_exist(char *filename) { + FILE* f=fopen (filename, "a"); + if (f==NULL) { + log_println_str("could not create file"); + return; + } + fclose(f); +} + +/*------------------------------------------------------------------*/ +void set_config_file(char *filename) { + create_if_not_exist(filename); + + _config_file = filename; + _config = al_load_config_file(filename); + if (_config == NULL) { + log_println_str("could not load config"); + } +} + +/*------------------------------------------------------------------*/ +int get_config_int(const char *section, const char *key, int def) { + const char *value = get_config_string(section, key, ""); + if (value == NULL || strlen(value) == 0) { + return def; + } + return atoi(value); +} + +/*------------------------------------------------------------------*/ +const char *get_config_string(const char *section, const char *key, const char *def) { + if (_config == NULL) { + return def; + } + const char *value = al_get_config_value(_config, section, key); + if (value == NULL) { + return def; + } + return value; +} + +/*------------------------------------------------------------------*/ +void set_config_int(const char *section, const char *key, int value) { + // The following leaks memory as this buf is never freed. However, in the + // program, set_config_int is really rarely used, only at the end of the + // program, so before it causes a critical visible leak, there is a long way. + char *buf = malloc(_ITOA_BUF_SIZE); + memset(buf, 0, _ITOA_BUF_SIZE); + snprintf(buf, _ITOA_BUF_SIZE, "%d", value); + set_config_string(section, key, buf); +} + +/*------------------------------------------------------------------*/ +void set_config_string(const char *section, const char *key, const char *value) { + if (_config == NULL) { + return; + } + al_set_config_value(_config, section, key, value); +} + +/*------------------------------------------------------------------*/ +void flush_config_file() { + if (_config == NULL) { + return ; + } + if (al_save_config_file(_config_file, _config)) { + log_println_str("saved config"); + } else { + log_println_str("could not save config"); + } +} + +/*------------------------------------------------------------------*/ +int exists(const char *filename) { + FILE *f = fopen(filename, "r"); + if (f != NULL) { + fclose(f); + return 1; + } + return 0; +} + +/*------------------------------------------------------------------*/ +// Graphics mode compatibility functions + +// Dummy graphics driver for compatibility +static char dummy_driver_name[] = "Allegro 5 Display"; +static LW_GFX_DRIVER_INFO dummy_gfx_driver = { dummy_driver_name }; + +LW_GFX_DRIVER_INFO *gfx_driver = &dummy_gfx_driver; + +// Black palette for compatibility +static PALETTE black_palette_data; +void *black_palette = &black_palette_data; + +/*------------------------------------------------------------------*/ +int set_gfx_mode(int card, int w, int h, int v_w, int v_h) { + // In Allegro 5, graphics mode setup is handled differently + // This is a compatibility stub that returns success + // Real display creation should be handled at a higher level + (void)card; + (void)v_w; // Virtual width not used in current implementation + + // Set the global screen dimensions for compatibility + SCREEN_W = w; + SCREEN_H = h; + VIRTUAL_H = v_h ? v_h : h * 2; // Set virtual height for page flipping + + return 0; // Success in Allegro 4 convention +} + +/*------------------------------------------------------------------*/ +void set_palette(void *palette) { + // Update the global palette with the provided palette + // The palette parameter is expected to be PALETTE (RGB array) + if (palette) { + PALETTE *pal = (PALETTE *)palette; + for (int i = 0; i < PALETTE_SIZE; i++) { + GLOBAL_PALETTE[i] = (*pal)[i]; + } + } +} + +/*------------------------------------------------------------------*/ +void set_window_title(const char *title) { + // Get the current display and set its title + ALLEGRO_DISPLAY *display = al_get_current_display(); + if (display && title) { + al_set_window_title(display, title); + } +} + +/*------------------------------------------------------------------*/ +// Global variables for Allegro 4 compatibility +char *allegro_id = "Allegro 5.x"; + +// Driver info structures (stubs for compatibility) +static LW_GFX_DRIVER_INFO timer_driver_info = {"Allegro 5 Timer"}; +static LW_GFX_DRIVER_INFO keyboard_driver_info = {"Allegro 5 Keyboard"}; +static LW_GFX_DRIVER_INFO mouse_driver_info = {"Allegro 5 Mouse"}; +static LW_GFX_DRIVER_INFO digi_driver_info = {"Allegro 5 Audio"}; +static LW_GFX_DRIVER_INFO midi_driver_info = {"Allegro 5 MIDI"}; +static LW_GFX_DRIVER_INFO joystick_driver_info = {"Allegro 5 Joystick"}; + +LW_GFX_DRIVER_INFO *timer_driver = &timer_driver_info; +LW_GFX_DRIVER_INFO *keyboard_driver = &keyboard_driver_info; +LW_GFX_DRIVER_INFO *mouse_driver = &mouse_driver_info; +LW_GFX_DRIVER_INFO *digi_driver = &digi_driver_info; +LW_GFX_DRIVER_INFO *midi_driver = &midi_driver_info; +LW_GFX_DRIVER_INFO *joystick_driver = &joystick_driver_info; + +/*------------------------------------------------------------------*/ +int install_allegro(int system_id, int *errno_ptr, int (*atexit_ptr)()) { + // Allegro 4 install_allegro function compatibility + (void)system_id; + (void)errno_ptr; + (void)atexit_ptr; + + return allegro_init(); +} + +/*------------------------------------------------------------------*/ +int allegro_init(void) { + // Initialize Allegro 5 core system + log_print_str("."); + int core= al_init (); + if (!core) { + return -1; // Allegro 4 returns non-zero on failure + } + + // Initialize subsystems that the game expects to be available + // These correspond to the various install_* functions in Allegro 4 + + // Display support + log_print_str("."); + allegro_display=al_create_display(640,480); // [TODO] handle different res here + bool display_ok=allegro_display!=NULL; + if (!display_ok) { + return -1; + } + + // Keyboard support + log_print_str("."); + int keyboard=al_install_keyboard(); + if (!keyboard) { + return -1; + } + + // Mouse support + log_print_str("."); + int mouse=al_install_mouse(); + if (!mouse) { + return -1; + } + + // Joystick support (optional, will be initialized by install_joystick() when needed) + // al_install_joystick(); - removed, now handled by install_joystick() function + + // Audio support (optional) + log_print_str("."); + if (!al_install_audio()) { + return -1; + } + + log_print_str("."); + if (!al_init_acodec_addon()) { + return -1; + } + + // Image loading support + log_print_str("."); + if (!al_init_image_addon()) { + return -1; + } + + // Font support + log_print_str("."); + if (!al_init_font_addon()) { + return -1; + } + + // Primitives for drawing operations + log_print_str("."); + if (!al_init_primitives_addon()) { + return -1; + } + +#ifdef ALLEGRO_ANDROID + log_print_str("."); + al_install_touch_input(); + log_print_str("."); + al_android_set_apk_file_interface(); +#endif + + return 0; // Success in Allegro 4 style (0 = success) +} + +/*------------------------------------------------------------------*/ +void set_uformat(int format) { + // Allegro 5 doesn't require setting unicode format like Allegro 4 + // This is a stub for compatibility + (void)format; // Suppress unused parameter warning +} + +/*------------------------------------------------------------------*/ +void set_color_depth(int depth) { + // In Allegro 5, color depth is set when creating the display + // This is stored for later use in graphics mode setup + (void)depth; // Suppress unused parameter warning +} + +/*------------------------------------------------------------------*/ +void set_color_conversion(int flags) { + // Allegro 5 handles color conversion automatically + // This is a stub for compatibility + (void)flags; // Suppress unused parameter warning +} + +/*------------------------------------------------------------------*/ +int install_keyboard(void) { + // This is called from init.c but keyboard is already initialized in allegro_init + // Return success (0 in Allegro 4 style) + return al_is_keyboard_installed() ? 0 : -1; +} + +/*------------------------------------------------------------------*/ +int install_mouse(void) { + // This is called from init.c but mouse is already initialized in allegro_init + // Return success (not -1 in Allegro 4 style) + return al_is_mouse_installed() ? 1 : -1; +} + +/*------------------------------------------------------------------*/ +int install_sound(int digi_card, int midi_card, const char *cfg_path) { + // Audio is already initialized in allegro_init + // These parameters are for Allegro 4 compatibility + (void)digi_card; + (void)midi_card; + (void)cfg_path; + + return al_is_audio_installed() ? 0 : -1; +} + +/*------------------------------------------------------------------*/ +void set_close_button_callback(void (*callback)(void)) { + // In Allegro 5, this would be handled through event handling + // For now, store the callback for potential future use + (void)callback; // Stub for compatibility +} + +/*------------------------------------------------------------------*/ +void get_palette (PALETTE pal) { + // In Allegro 4, this would get the current hardware palette + // In Allegro 5, we don't have hardware palettes, so we stub this + // Initialize with a default grayscale palette using 8-bit values + int i; + for (i = 0; i < 256; i++) { + pal[i].r = i; // 8-bit grayscale (0-255) + pal[i].g = i; + pal[i].b = i; + } +} + +/*------------------------------------------------------------------*/ +void fade_in (PALETTE pal, int speed) { + // In Allegro 4, this would gradually fade the screen from black to the palette + // In Allegro 5, we simulate this by just setting the palette (no actual fading) + (void)pal; // Palette parameter ignored in Allegro 5 + (void)speed; // Speed parameter ignored + // TODO: Could implement actual screen fading using al_draw_tinted_bitmap +} + +/*------------------------------------------------------------------*/ +void fade_out (int speed) { + // In Allegro 4, this would gradually fade the screen to black + // In Allegro 5, we simulate this (no actual fading for now) + (void)speed; // Speed parameter ignored + // TODO: Could implement actual screen fading using al_draw_tinted_bitmap +} + +/*------------------------------------------------------------------*/ +void hsv_to_rgb (float h, float s, float v, int *r, int *g, int *b) { + // Convert HSV color space to RGB + // Based on standard HSV to RGB conversion algorithm + int i; + float f, p, q, t; + + if (s == 0) { + // Achromatic (grey) + *r = *g = *b = (int)(v * 255); + return; + } + + h /= 60; // sector 0 to 5 + i = (int)h; + f = h - i; // fractional part of h + p = v * (1 - s); + q = v * (1 - s * f); + t = v * (1 - s * (1 - f)); + + switch (i) { + case 0: + *r = (int)(v * 255); + *g = (int)(t * 255); + *b = (int)(p * 255); + break; + case 1: + *r = (int)(q * 255); + *g = (int)(v * 255); + *b = (int)(p * 255); + break; + case 2: + *r = (int)(p * 255); + *g = (int)(v * 255); + *b = (int)(t * 255); + break; + case 3: + *r = (int)(p * 255); + *g = (int)(q * 255); + *b = (int)(v * 255); + break; + case 4: + *r = (int)(t * 255); + *g = (int)(p * 255); + *b = (int)(v * 255); + break; + default: // case 5: + *r = (int)(v * 255); + *g = (int)(p * 255); + *b = (int)(q * 255); + break; + } +} + +/*------------------------------------------------------------------*/ +int fixsqrt (int x) { + // Fixed-point square root (Allegro 4 compatibility) + // Input and output are in 16.16 fixed-point format + // Simple implementation using floating point + if (x <= 0) return 0; + + // Convert from fixed-point to float, take sqrt, convert back + float f = (float)x / 65536.0f; + f = sqrt(f); + return (int)(f * 65536.0f); +} + +/*------------------------------------------------------------------*/ +ALLEGRO_COLOR rgb_to_allegro_color (RGB rgb) { + // Convert RGB structure to ALLEGRO_COLOR + // Both use 8-bit values (0-255) + return al_map_rgb(rgb.r, rgb.g, rgb.b); +} + +/*------------------------------------------------------------------*/ +RGB allegro_color_to_rgb (ALLEGRO_COLOR color) { + // Convert ALLEGRO_COLOR to RGB structure + RGB rgb; + unsigned char r, g, b; + + al_unmap_rgb(color, &r, &g, &b); + // Both use 8-bit values (0-255) + rgb.r = r; + rgb.g = g; + rgb.b = b; + + return rgb; +} + +/*------------------------------------------------------------------*/ +void delete_file(const char *filename) { + // Delete a file - Allegro 4 compatibility function + // Maps directly to standard C remove() function + if (filename) { + remove(filename); + } +} + +/*------------------------------------------------------------------*/ +void ellipse (ALLEGRO_BITMAP * bitmap, int x, int y, int rx, int ry, int color) { + // Draw ellipse outline - Allegro 4 compatibility + if (color < 0 || color >= PALETTE_SIZE) { + return; + } + ALLEGRO_COLOR al_color = rgb_to_allegro_color(GLOBAL_PALETTE[color]); + + ALLEGRO_BITMAP *old_target = al_get_target_bitmap(); + al_set_target_bitmap(bitmap); + al_draw_ellipse(x, y, rx, ry, al_color, 1.0); + al_set_target_bitmap(old_target); +} + +/*------------------------------------------------------------------*/ +void ellipsefill (ALLEGRO_BITMAP * bitmap, int x, int y, int rx, int ry, int color) { + // Draw filled ellipse - Allegro 4 compatibility + if (color < 0 || color >= PALETTE_SIZE) { + return; + } + ALLEGRO_COLOR al_color = rgb_to_allegro_color(GLOBAL_PALETTE[color]); + + ALLEGRO_BITMAP *old_target = al_get_target_bitmap(); + al_set_target_bitmap(bitmap); + al_draw_filled_ellipse(x, y, rx, ry, al_color); + al_set_target_bitmap(old_target); +} + +/*------------------------------------------------------------------*/ +void circlefill (ALLEGRO_BITMAP * bitmap, int x, int y, int radius, int color) { + // Draw filled circle - Allegro 4 compatibility + if (color < 0 || color >= PALETTE_SIZE) { + return; + } + ALLEGRO_COLOR al_color = rgb_to_allegro_color(GLOBAL_PALETTE[color]); + + ALLEGRO_BITMAP *old_target = al_get_target_bitmap(); + al_set_target_bitmap(bitmap); + al_draw_filled_circle(x, y, radius, al_color); + al_set_target_bitmap(old_target); +} + +/*------------------------------------------------------------------*/ +void polygon (ALLEGRO_BITMAP * bitmap, int vertices, const int *points, int color) { + // Draw polygon - Allegro 4 compatibility + if (color < 0 || color >= PALETTE_SIZE || vertices < 3) { + return; + } + ALLEGRO_COLOR al_color = rgb_to_allegro_color(GLOBAL_PALETTE[color]); + + // Convert int array to float array for Allegro 5 + float *float_points = malloc(vertices * 2 * sizeof(float)); + if (!float_points) return; + + for (int i = 0; i < vertices * 2; i++) { + float_points[i] = (float)points[i]; + } + + ALLEGRO_BITMAP *old_target = al_get_target_bitmap(); + al_set_target_bitmap(bitmap); + al_draw_polygon(float_points, vertices, ALLEGRO_LINE_JOIN_NONE, al_color, 1.0, 0); + al_set_target_bitmap(old_target); + + free(float_points); +} + +/*------------------------------------------------------------------*/ +void fix_filename_case(char *filename) { + // Allegro 4 compatibility function - converts filename to correct case + // On case-sensitive filesystems, this would try to find the correct case + // For now, just leave the filename as-is since most modern systems handle this + (void)filename; // Stub implementation - no changes needed on modern systems +} + +/*------------------------------------------------------------------*/ +void fix_filename_slashes(char *filename) { + // Allegro 4 compatibility function - converts path separators + // Convert all backslashes to forward slashes for cross-platform compatibility + if (filename) { + char *p = filename; + while (*p) { + if (*p == '\\') { + *p = '/'; + } + p++; + } + } +} + +/*------------------------------------------------------------------*/ +int bestfit_color(PALETTE pal, int r, int g, int b) { + // Allegro 4 compatibility function - finds closest matching color in palette + int best_index = 0; + int best_distance = INT_MAX; + int i; + + for (i = 0; i < 256; i++) { + int dr = r - pal[i].r; + int dg = g - pal[i].g; + int db = b - pal[i].b; + int distance = dr*dr + dg*dg + db*db; + + if (distance < best_distance) { + best_distance = distance; + best_index = i; + if (distance == 0) break; // Exact match found + } + } + + return best_index; +} + + +/*------------------------------------------------------------------*/ +int save_bitmap(const char *filename, ALLEGRO_BITMAP *bmp, PALETTE pal) { + // Allegro 4 compatibility function - saves a bitmap to file + // In Allegro 5, we use al_save_bitmap and ignore the palette parameter + (void)pal; // Palette ignored in Allegro 5 + return al_save_bitmap(filename, bmp) ? 0 : -1; // Allegro 4 returns 0 on success +} + +/*------------------------------------------------------------------*/ +ALLEGRO_BITMAP *create_bitmap_ex(int color_depth, int w, int h) { + // Allegro 4 compatibility function - creates a bitmap with specific color depth + // In Allegro 5, we ignore the color depth parameter and create a standard bitmap + (void)color_depth; // Ignore color depth - Allegro 5 handles this automatically + return al_create_bitmap(w, h); +} + +/*------------------------------------------------------------------*/ +ALLEGRO_BITMAP *create_sub_bitmap(ALLEGRO_BITMAP *parent, int x, int y, int w, int h) { + // Allegro 4 compatibility function - creates a sub-bitmap + return al_create_sub_bitmap(parent, x, y, w, h); +} + +/*------------------------------------------------------------------*/ +void scroll_screen(int x, int y) { + // Allegro 4 compatibility function - scrolls the screen + // In Allegro 5, this is mainly used for page flipping effects + // For now, implement as a stub since modern page flipping works differently + (void)x; + (void)y; + // Note: This function was used for hardware scrolling in Allegro 4 + // Modern systems handle this through different mechanisms +} diff --git a/src/backport.h b/src/backport.h new file mode 100644 index 00000000..12e452f3 --- /dev/null +++ b/src/backport.h @@ -0,0 +1,391 @@ +/********************************************************************/ +/* */ +/* L I QQ U U I DD W W A RR 555 */ +/* L I Q Q U U I D D W W A A R R 5 */ +/* L I Q Q U U I D D W W W AAA RR 55 */ +/* L I Q Q U U I D D WW WW A A R R 5 */ +/* LLL I Q Q U I DD W W A A R R 55 */ +/* */ +/* b */ +/* bb y y */ +/* b b yyy */ +/* bb y */ +/* yy */ +/* */ +/* U U FFF O O TTT */ +/* U U F O O O O T */ +/* U U TIRET FF O O O O T */ +/* U U F O O O O T */ +/* U F O O T */ +/* */ +/********************************************************************/ + +/*****************************************************************************/ +/* Liquid War is a multiplayer wargame */ +/* Copyright (C) 1998-2025 Christian Mauduit */ +/* */ +/* 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 */ +/* */ +/* Liquid War homepage : http://www.ufoot.org/liquidwar/v5 */ +/* Contact author : ufoot@ufoot.org */ +/*****************************************************************************/ + +/********************************************************************/ +/* nom : backport.h */ +/* content : missing allegro 4 stuff */ +/* last update : Dec 24th 2018 */ +/********************************************************************/ + +#ifndef LIQUID_WAR_INCLUDE_BACKPORT +#define LIQUID_WAR_INCLUDE_BACKPORT + +/*==================================================================*/ +/* includes */ +/*==================================================================*/ + +#ifndef ALLEGRO_NO_MAIN +#define ALLEGRO_NO_MAIN +#endif + +#include +#include +#include +#include + +/*==================================================================*/ +/* defines */ +/*==================================================================*/ + +#ifndef AL_CONST +#define AL_CONST const +#endif // AL_CONST + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef MIN +#define MIN(x,y) (((x) < (y)) ? (x) : (y)) +#endif // MIN +#ifndef MAX +#define MAX(x,y) (((x) > (y)) ? (x) : (y)) +#endif // MAX +#ifndef MID +/* Returns the median of x, y, z */ +#define MID(x,y,z) ((x) > (y) ? ((y) > (z) ? (y) : ((x) > (z) ? \ + (z) : (x))) : ((y) > (z) ? ((z) > (x) ? (z) : \ + (x)): (y))) +#endif // MID +#ifndef CLAMP +/* Optimized version of MID for when x <= z. */ +#define CLAMP(x,y,z) MAX((x), MIN((y), (z))) +#endif // CLAMP +#ifndef ABS +#define ABS(x) (((x) >= 0) ? (x) : (-(x))) +#endif // ABS + +#ifndef SGN +#define SGN(x) (((x) >= 0) ? 1 : -1) +#endif // SGN + +#define _AL_MALLOC(size) al_malloc(size) +#define _AL_FREE(ptr) al_free(ptr) + +#define LOCK_DATA(d, s) +#define LOCK_CODE(c, s) +#define UNLOCK_DATA(d, s) +#define LOCK_VARIABLE(x) +#define LOCK_FUNCTION(x) + +/*==================================================================*/ +/* types */ +/*==================================================================*/ + +#define PALETTE_SIZE 256 + +typedef struct RGB { + unsigned char r, g, b; +} RGB; + +typedef RGB PALETTE[PALETTE_SIZE]; +typedef RGB RGB_PALETTE[PALETTE_SIZE]; // Keep for compatibility + +// Allegro 4 compatibility - BITMAP is now ALLEGRO_BITMAP +typedef ALLEGRO_BITMAP BITMAP; + +#define MAX_JOYSTICKS 8 +#define MAX_JOYSTICK_AXIS 3 +#define MAX_JOYSTICK_STICKS 5 +#define MAX_JOYSTICK_BUTTONS 32 + +#define JOY_TYPE_AUTODETECT 0 +#define JOY_TYPE_2PADS 1 +#define JOY_TYPE_4BUTTON 2 +#define JOY_TYPE_STANDARD 3 + +/* information about a single joystick axis */ +typedef struct JOYSTICK_AXIS_INFO +{ + int pos; + int d1, d2; + const char *name; +} JOYSTICK_AXIS_INFO; + +/* information about one or more axis (a slider or directional control) */ +typedef struct JOYSTICK_STICK_INFO +{ + int flags; + int num_axis; + JOYSTICK_AXIS_INFO axis[MAX_JOYSTICK_AXIS]; + const char *name; +} JOYSTICK_STICK_INFO; + +/* information about a joystick button */ +typedef struct JOYSTICK_BUTTON_INFO +{ + int b; + const char *name; +} JOYSTICK_BUTTON_INFO; + +/* information about an entire joystick */ +typedef struct JOYSTICK_INFO +{ + // int flags; + const char *name; + int num_sticks; + int num_buttons; + JOYSTICK_STICK_INFO stick[MAX_JOYSTICK_STICKS]; + JOYSTICK_BUTTON_INFO button[MAX_JOYSTICK_BUTTONS]; +} JOYSTICK_INFO; + +#define KEY_MAX 127 + +#define KB_NORMAL 0x01 +#define KB_EXTENDED 0x02 + +/*==================================================================*/ +/* variables globales */ +/*==================================================================*/ + +extern ALLEGRO_BITMAP *screen; +extern ALLEGRO_DISPLAY *allegro_display; +extern int SCREEN_W; +extern int SCREEN_H; +extern int VIRTUAL_H; +extern ALLEGRO_FONT *font; +extern volatile int mouse_x; +extern volatile int mouse_y; +extern volatile int mouse_z; +extern volatile int mouse_b; +extern int *allegro_errno; +extern volatile JOYSTICK_INFO joy[MAX_JOYSTICKS]; +extern int num_joysticks; +extern char empty_string[]; +extern volatile char key[]; + +// GUI color variables for Allegro 4 compatibility +extern int gui_bg_color; +extern int gui_fg_color; +extern int gui_mg_color; + +/*==================================================================*/ +/* fonctions globales */ +/*==================================================================*/ + +void scare_mouse (); +void scare_mouse_area (int x, int y, int w, int h); +void unscare_mouse (); +void position_mouse (int x, int y); +void set_mouse_sprite (ALLEGRO_BITMAP *sprite); +void show_mouse (ALLEGRO_BITMAP *bmp); +int poll_mouse (void); +int mouse_needs_poll (void); + +void clear_to_color (ALLEGRO_BITMAP * bitmap, int color); +void putpixel (ALLEGRO_BITMAP * bitmap, int x, int y, int color); +void putpixel_fast (int x, int y, int color); +int getpixel (ALLEGRO_BITMAP * bitmap, int x, int y); +void rect (ALLEGRO_BITMAP * bitmap, int x1, int y1, int x2, int y2, + int color); +void rectfill (ALLEGRO_BITMAP * bitmap, int x1, int y1, int x2, int y2, + int color); +void rectfill_dotted (ALLEGRO_BITMAP * bitmap, int x1, int y1, int x2, int y2, + int fg, int bg); +void vline (ALLEGRO_BITMAP * bitmap, int x, int y1, int y2, int color); +void hline (ALLEGRO_BITMAP * bitmap, int x1, int y, int x2, int color); +void line (ALLEGRO_BITMAP * bitmap, int x1, int y1, int x2, int y2, + int color); +void ellipse (ALLEGRO_BITMAP * bitmap, int x, int y, int rx, int ry, int color); +void ellipsefill (ALLEGRO_BITMAP * bitmap, int x, int y, int rx, int ry, int color); +void circlefill (ALLEGRO_BITMAP * bitmap, int x, int y, int radius, int color); +void polygon (ALLEGRO_BITMAP * bitmap, int vertices, const int *points, int color); + +int usetc (char *s, int c); +int ugetc (const char *s); +int uwidth (const char *s); +int ustrlen (const char *s); +int ucwidth (int c); +int uisspace (int c); +int ugetat (char *s, int index); +int usetat (char *s, int index, int c, int max_size); +int uinsert (char *s, int index, int c, int max_size); +int uremove (char *s, int index); +int uisok (int c); +int utolower (int c); +char *ustrdup (const char *src); +int ugetx (char **s); +int ugetxc (const char **s); +char *ustrtok_r (char *s, AL_CONST char *set, char **last); +char *uconvert_ascii (const char *s, char buf[], int size); + +int text_length (const ALLEGRO_FONT * f, const char *s); +int text_height (const ALLEGRO_FONT * f); +void textout_ex (ALLEGRO_BITMAP * bmp, const ALLEGRO_FONT * f, const char *s, + int x, int y, int color, int bg); + +void set_volume (int digi_volume, int midi_volume); +int play_midi (ALLEGRO_SAMPLE *midi, int loop); +int play_sample (ALLEGRO_SAMPLE *spl, int vol, int pan, int freq, int loop); + +void get_palette (PALETTE pal); +void fade_in (PALETTE pal, int speed); +void fade_out (int speed); +void hsv_to_rgb (float h, float s, float v, int *r, int *g, int *b); +int fixsqrt (int x); +int bestfit_color (PALETTE pal, int r, int g, int b); + +ALLEGRO_COLOR rgb_to_allegro_color (RGB rgb); +RGB allegro_color_to_rgb (ALLEGRO_COLOR color); + +void rest_callback (unsigned int time, void (*callback) (void)); +void rest (unsigned int time); +int install_timer (); +void remove_timer (); +int install_int (void (*proc) (), int speed); +void remove_int (void (*proc) ()); +int install_int_ex (void (*proc) (), int speed); + +#define MSEC_TO_TIMER(x) (x) + +void draw_sprite (ALLEGRO_BITMAP * bmp, ALLEGRO_BITMAP * sprite, int x, + int y); +void blit (ALLEGRO_BITMAP * source, ALLEGRO_BITMAP * dest, + int source_x, int source_y, + int dest_x, int dest_y, int dest_width, int dest_height); +void stretch_blit (ALLEGRO_BITMAP * source, ALLEGRO_BITMAP * dest, + int source_x, int source_y, int source_width, + int source_height, int dest_x, int dest_y, int dest_width, + int dest_height); +ALLEGRO_BITMAP *load_bitmap (const char *filename, PALETTE pal); +int save_bitmap (const char *filename, ALLEGRO_BITMAP *bmp, PALETTE pal); +ALLEGRO_BITMAP *my_create_bitmap (int w, int h); +ALLEGRO_BITMAP *my_create_memory_bitmap (int w, int h); +ALLEGRO_BITMAP *my_create_video_bitmap (int w, int h); +ALLEGRO_BITMAP *create_bitmap_ex (int color_depth, int w, int h); +ALLEGRO_BITMAP *create_sub_bitmap (ALLEGRO_BITMAP *parent, int x, int y, int w, int h); +void scroll_screen (int x, int y); + +void acquire_bitmap (ALLEGRO_BITMAP * bmp); +void acquire_screen (); +void release_bitmap (ALLEGRO_BITMAP * bmp); +void release_screen (); +void set_clip_rect (ALLEGRO_BITMAP * bitmap, int x1, int y1, int x2, int y2); + +int install_joystick (int type); +int poll_joystick (); + +int keypressed (); +int readkey (); +int ureadkey (int *scancode); +void clear_keybuf (); +void simulate_keypress (int key); +int scancode_to_ascii (int scancode); + +void set_config_file(char *filename); +int get_config_int(const char *section, const char *key, int def); +const char *get_config_string(const char *section, const char *key, const char *def); +void set_config_int(const char *section, const char *key, int value); +void set_config_string(const char *section, const char *key, const char *value); +void flush_config_file(); + +int exists(const char *filename); +void delete_file(const char *filename); +void fix_filename_case(char *filename); +void fix_filename_slashes(char *filename); + +// Graphics mode constants (Allegro 4 compatibility) +#define GFX_AUTODETECT_FULLSCREEN 1 +#define GFX_AUTODETECT_WINDOWED 2 +#define GFX_DIRECTX 3 +#define GFX_DIRECTX_WIN 4 +#define GFX_MODEX 5 +#define GFX_VESA2L 6 + +// Graphics mode functions +int set_gfx_mode(int card, int w, int h, int v_w, int v_h); +void set_palette(void *palette); +void set_window_title(const char *title); + +// Graphics driver info +typedef struct { + char *ascii_name; +} LW_GFX_DRIVER_INFO; + +extern LW_GFX_DRIVER_INFO *gfx_driver; +extern void *black_palette; + +// Allegro 4 compatibility constants +#define U_ASCII 0 +#define SYSTEM_NONE 0 +#define COLORCONV_REDUCE_TO_256 0 + +// Audio constants +#define DIGI_NONE 0 +#define MIDI_NONE 0 +#define DIGI_AUTODETECT -1 +#define MIDI_AUTODETECT -1 + +// Driver info structures (Allegro 4 compatibility) +extern LW_GFX_DRIVER_INFO *timer_driver; +extern LW_GFX_DRIVER_INFO *keyboard_driver; +extern LW_GFX_DRIVER_INFO *mouse_driver; +extern LW_GFX_DRIVER_INFO *digi_driver; +extern LW_GFX_DRIVER_INFO *midi_driver; +extern LW_GFX_DRIVER_INFO *joystick_driver; + +// Allegro initialization functions +int allegro_init(void); +int install_allegro(int system_id, int *errno_ptr, int (*atexit_ptr)()); +int install_keyboard(void); +void remove_keyboard(void); +int install_mouse(void); +int install_sound(int digi_card, int midi_card, const char *cfg_path); +void set_uformat(int format); +void set_color_depth(int depth); +void set_color_conversion(int flags); +void set_close_button_callback(void (*callback)(void)); + +// Allegro addon functions (stubs if not available) +bool al_init_acodec_addon(void); +bool al_init_image_addon(void); + +// Global variables for compatibility +extern char *allegro_id; + +#endif // LIQUID_WAR_INCLUDE_BACKPORT diff --git a/src/backportgui.c b/src/backportgui.c new file mode 100644 index 00000000..12551357 --- /dev/null +++ b/src/backportgui.c @@ -0,0 +1,2665 @@ +/* ______ ___ ___ + * /\ _ \ /\_ \ /\_ \ + * \ \ \L\ \\//\ \ \//\ \ __ __ _ __ ___ + * \ \ __ \ \ \ \ \ \ \ /'__`\ /'_ `\/\`'__\/ __`\ + * \ \ \/\ \ \_\ \_ \_\ \_/\ __//\ \L\ \ \ \//\ \L\ \ + * \ \_\ \_\/\____\/\____\ \____\ \____ \ \_\\ \____/ + * \/_/\/_/\/____/\/____/\/____/\/___L\ \/_/ \/___/ + * /\____/ + * \_/__/ + * + * The core GUI routines. + * + * By Shawn Hargreaves. + * + * Peter Pavlovic modified the drawing and positioning of menus. + * + * Menu auto-opening added by Angelo Mottola. + * + * Eric Botcazou added the support for non-blocking menus. + * + * Elias Pschernig and Sven Sandberg improved the focus algorithm. + * + * See readme.txt for copyright information. + */ + + +#include + +#include + +#include "backport.h" +#include "backportgui.h" +#include "backportguiproc.h" +#include "alleg2.h" + +static int _allegro_count = 1; // number of times allegro has been initialized. + +/* if set, the input focus follows the mouse pointer */ +int gui_mouse_focus = TRUE; + + +/* font alignment value */ +int gui_font_baseline = 0; + + +/* Pointers to the currently active dialog and menu objects. + * + * Note: active_dialog_player always points to the currently active dialog + * player. However, active_menu_player only ever points to menu players + * started by a d_menu_proc. The code also assumes that that d_menu_proc can + * be found in the currently active dialog. + * + * Note: active_dialog points to the whole dialog currently running. However, + * active_menu points to the *current item* of the currently running menu, + * and should really have been called active_menu_item. + */ +static DIALOG_PLAYER *active_dialog_player = NULL; +static MENU_PLAYER *active_menu_player = NULL; +static int active_menu_player_zombie = FALSE; +DIALOG *active_dialog = NULL; +MENU *active_menu = NULL; + + +static ALLEGRO_BITMAP *gui_screen = NULL; + + +/* list of currently active (initialized) dialog players */ +struct al_active_dialog_player +{ + DIALOG_PLAYER *player; + struct al_active_dialog_player *next; +}; + +static struct al_active_dialog_player *first_active_dialog_player = 0; +static struct al_active_dialog_player *current_active_dialog_player = 0; + + +/* forward declarations */ +static int shutdown_single_menu (MENU_PLAYER *, int *); + + + +/* hook function for reading the mouse x position */ +static int +default_mouse_x (void) +{ + if (mouse_needs_poll ()) + poll_mouse (); + + return mouse_x; +} + +/* hook function for reading the mouse y position */ +static int +default_mouse_y (void) +{ + if (mouse_needs_poll ()) + poll_mouse (); + + return mouse_y; +} + +/* hook function for reading the mouse z position */ +static int +default_mouse_z (void) +{ + if (mouse_needs_poll ()) + poll_mouse (); + + return mouse_z; +} + +/* hook function for reading the mouse button state */ +static int +default_mouse_b (void) +{ + if (mouse_needs_poll ()) + poll_mouse (); + + return mouse_b; +} + +/* hook functions for reading the mouse state */ +int (*gui_mouse_x) (void) = default_mouse_x; +int (*gui_mouse_y) (void) = default_mouse_y; +int (*gui_mouse_z) (void) = default_mouse_z; +int (*gui_mouse_b) (void) = default_mouse_b; + + +/* timer to handle menu auto-opening */ +static int gui_timer; + +static int gui_menu_opening_delay; + + +/* Checking for double clicks is complicated. The user could release the + * mouse button at almost any point, and I might miss it if I am doing some + * other processing at the same time (eg. sending the single-click message). + * To get around this I install a timer routine to do the checking for me, + * so it will notice double clicks whenever they happen. + */ + +static volatile int dclick_status, dclick_time; + +static int gui_install_count = 0; +static int gui_install_time = 0; + +#define DCLICK_START 0 +#define DCLICK_RELEASE 1 +#define DCLICK_AGAIN 2 +#define DCLICK_NOT 3 + + + +/* dclick_check: + * Double click checking user timer routine. + */ +static void +dclick_check (void) +{ + gui_timer++; + + if (dclick_status == DCLICK_START) + { /* first click... */ + if (!gui_mouse_b ()) + { + dclick_status = DCLICK_RELEASE; /* aah! released first */ + dclick_time = 0; + return; + } + } + else if (dclick_status == DCLICK_RELEASE) + { /* wait for second click */ + if (gui_mouse_b ()) + { + dclick_status = DCLICK_AGAIN; /* yes! the second click */ + dclick_time = 0; + return; + } + } + else + return; + + /* timeout? */ + if (dclick_time++ > 10) + dclick_status = DCLICK_NOT; +} + +/* position_dialog: + * Moves all the objects in a dialog to the specified position. + */ +void +position_dialog (DIALOG * dialog, int x, int y) +{ + int min_x = INT_MAX; + int min_y = INT_MAX; + int xc, yc; + int c; + ALLEGRO_ASSERT (dialog); + + /* locate the upper-left corner */ + for (c = 0; dialog[c].proc; c++) + { + if (dialog[c].x < min_x) + min_x = dialog[c].x; + + if (dialog[c].y < min_y) + min_y = dialog[c].y; + } + + /* move the dialog */ + xc = min_x - x; + yc = min_y - y; + + for (c = 0; dialog[c].proc; c++) + { + dialog[c].x -= xc; + dialog[c].y -= yc; + } +} + + + +/* centre_dialog: + * Moves all the objects in a dialog so that the dialog is centered in + * the screen. + */ +void +centre_dialog (DIALOG * dialog) +{ + int min_x = INT_MAX; + int min_y = INT_MAX; + int max_x = INT_MIN; + int max_y = INT_MIN; + int xc, yc; + int c; + ALLEGRO_ASSERT (dialog); + + /* find the extents of the dialog (done in many loops due to a bug + * in MSVC that prevents the more sensible version from working) + */ + for (c = 0; dialog[c].proc; c++) + { + if (dialog[c].x < min_x) + min_x = dialog[c].x; + } + + for (c = 0; dialog[c].proc; c++) + { + if (dialog[c].y < min_y) + min_y = dialog[c].y; + } + + for (c = 0; dialog[c].proc; c++) + { + if (dialog[c].x + dialog[c].w > max_x) + max_x = dialog[c].x + dialog[c].w; + } + + for (c = 0; dialog[c].proc; c++) + { + if (dialog[c].y + dialog[c].h > max_y) + max_y = dialog[c].y + dialog[c].h; + } + + /* how much to move by? */ + xc = (SCREEN_W - (max_x - min_x)) / 2 - min_x; + yc = (SCREEN_H - (max_y - min_y)) / 2 - min_y; + + /* move it */ + for (c = 0; dialog[c].proc; c++) + { + dialog[c].x += xc; + dialog[c].y += yc; + } +} + + + +/* set_dialog_color: + * Sets the foreground and background colors of all the objects in a dialog. + */ +void +set_dialog_color (DIALOG * dialog, int fg, int bg) +{ + int c; + ALLEGRO_ASSERT (dialog); + + for (c = 0; dialog[c].proc; c++) + { + dialog[c].fg = fg; + dialog[c].bg = bg; + } +} + + + +/* find_dialog_focus: + * Searches the dialog for the object which has the input focus, returning + * its index, or -1 if the focus is not set. Useful after do_dialog() exits + * if you need to know which object was selected. + */ +int +find_dialog_focus (DIALOG * dialog) +{ + int c; + ALLEGRO_ASSERT (dialog); + + for (c = 0; dialog[c].proc; c++) + if (dialog[c].flags & D_GOTFOCUS) + return c; + + return -1; +} + + + +/* object_message: + * Sends a message to a widget, automatically scaring and unscaring + * the mouse if the message is MSG_DRAW. + */ +int +object_message (DIALOG * dialog, int msg, int c) +{ +#ifdef ALLEGRO_WINDOWS + /* exported address of d_clear_proc */ + extern int (*_d_clear_proc) (int, DIALOG *, int); +#endif + + int ret; + ALLEGRO_ASSERT (dialog); + + if (msg == MSG_DRAW) + { + if (dialog->flags & D_HIDDEN) + return D_O_K; + +#ifdef ALLEGRO_WINDOWS + if (dialog->proc == _d_clear_proc) +#else + if (dialog->proc == d_clear_proc) +#endif + scare_mouse (); + else + scare_mouse_area (dialog->x, dialog->y, dialog->w, dialog->h); + + acquire_screen (); + } + + ret = dialog->proc (msg, dialog, c); + + if (msg == MSG_DRAW) + { + release_screen (); + unscare_mouse (); + } + + if (ret & D_REDRAWME) + { + dialog->flags |= D_DIRTY; + ret &= ~D_REDRAWME; + } + + return ret; +} + + + +/* dialog_message: + * Sends a message to all the objects in a dialog. If any of the objects + * return values other than D_O_K, returns the value and sets obj to the + * object which produced it. + */ +int +dialog_message (DIALOG * dialog, int msg, int c, int *obj) +{ + int count, res, r, force, try; + DIALOG *menu_dialog = NULL; + ALLEGRO_ASSERT (dialog); + + /* Note: don't acquire the screen in here. A deadlock develops in a + * situation like this: + * + * 1. this thread: acquires the screen; + * 2. timer thread: wakes up, locks the timer_mutex, and calls a + * callback to redraw the software mouse cursor, which tries to + * acquire the screen; + * 3. this thread: object_message(MSG_DRAW) calls scare_mouse() + * which calls remove_int(). + * + * So this thread has the screen acquired and wants the timer_mutex, + * whereas the timer thread holds the timer_mutex, but wants to acquire + * the screen. The problem is calling scare_mouse() with the screen + * acquired. + */ + + force = ((msg == MSG_START) || (msg == MSG_END) || (msg >= MSG_USER)); + + res = D_O_K; + + /* If a menu spawned by a d_menu_proc object is active, the dialog engine + * has effectively been shutdown for the sake of safety. This means that + * we can't send the message to the other objects in the dialog. So try + * first to send the message to the d_menu_proc object and, if the menu + * is then not active anymore, send it to the other objects as well. + */ + if (active_menu_player) + { + try = 2; + menu_dialog = active_menu_player->dialog; + } + else + try = 1; + + for (; try > 0; try--) + { + for (count = 0; dialog[count].proc; count++) + { + if ((try == 2) && (&dialog[count] != menu_dialog)) + continue; + + if ((force) || (!(dialog[count].flags & D_HIDDEN))) + { + r = object_message (&dialog[count], msg, c); + + if (r != D_O_K) + { + res |= r; + if (obj) + *obj = count; + } + + if ((msg == MSG_IDLE) + && (dialog[count].flags & (D_DIRTY | D_HIDDEN)) == D_DIRTY) + { + dialog[count].flags &= ~D_DIRTY; + object_message (dialog + count, MSG_DRAW, 0); + } + } + } + + if (active_menu_player) + break; + } + + return res; +} + + + +/* broadcast_dialog_message: + * Broadcasts a message to all the objects in the active dialog. If any of + * the dialog procedures return values other than D_O_K, it returns that + * value. + */ +int +broadcast_dialog_message (int msg, int c) +{ + int nowhere; + + if (active_dialog) + return dialog_message (active_dialog, msg, c, &nowhere); + else + return D_O_K; +} + + + +/* find_mouse_object: + * Finds which object the mouse is on top of. + */ +static int +find_mouse_object (DIALOG * d) +{ + int mouse_object = -1; + int c; + int res; + ALLEGRO_ASSERT (d); + + for (c = 0; d[c].proc; c++) + { + if ((gui_mouse_x () >= d[c].x) && (gui_mouse_y () >= d[c].y) && + (gui_mouse_x () < d[c].x + d[c].w) + && (gui_mouse_y () < d[c].y + d[c].h) + && (!(d[c].flags & (D_HIDDEN | D_DISABLED)))) + { + /* check if this object wants the mouse */ + res = object_message (d + c, MSG_WANTMOUSE, 0); + if (!(res & D_DONTWANTMOUSE)) + { + mouse_object = c; + } + } + } + + return mouse_object; +} + + + +/* offer_focus: + * Offers the input focus to a particular object. + */ +int +offer_focus (DIALOG * dialog, int obj, int *focus_obj, int force) +{ + int res = D_O_K; + ALLEGRO_ASSERT (dialog); + ALLEGRO_ASSERT (focus_obj); + + if ((obj == *focus_obj) || + ((obj >= 0) && (dialog[obj].flags & (D_HIDDEN | D_DISABLED)))) + return D_O_K; + + /* check if object wants the focus */ + if (obj >= 0) + { + res = object_message (dialog + obj, MSG_WANTFOCUS, 0); + if (res & D_WANTFOCUS) + res ^= D_WANTFOCUS; + else + obj = -1; + } + + if ((obj >= 0) || (force)) + { + /* take focus away from old object */ + if (*focus_obj >= 0) + { + res |= object_message (dialog + *focus_obj, MSG_LOSTFOCUS, 0); + if (res & D_WANTFOCUS) + { + if (obj < 0) + return D_O_K; + else + res &= ~D_WANTFOCUS; + } + dialog[*focus_obj].flags &= ~D_GOTFOCUS; + res |= object_message (dialog + *focus_obj, MSG_DRAW, 0); + } + + *focus_obj = obj; + + /* give focus to new object */ + if (obj >= 0) + { + dialog[obj].flags |= D_GOTFOCUS; + res |= object_message (dialog + obj, MSG_GOTFOCUS, 0); + res |= object_message (dialog + obj, MSG_DRAW, 0); + } + } + + return res; +} + + + +#define MAX_OBJECTS 512 + +typedef struct OBJ_LIST +{ + int index; + int diff; +} OBJ_LIST; + + +/* Weight ratio between the orthogonal direction and the main direction + when calculating the distance for the focus algorithm. */ +#define DISTANCE_RATIO 8 + +/* Maximum size (in bytes) of a dialog array. */ +#define MAX_SIZE 0x10000 /* 64 kb */ + +enum axis +{ X_AXIS, Y_AXIS }; + + + +/* obj_list_cmp: + * Callback function for qsort(). + */ +static int +obj_list_cmp (AL_CONST void *e1, AL_CONST void *e2) +{ + return (((OBJ_LIST *) e1)->diff - ((OBJ_LIST *) e2)->diff); +} + + + +/* cmp_tab: + * Comparison function for tab key movement. + */ +static int +cmp_tab (AL_CONST DIALOG * d1, AL_CONST DIALOG * d2) +{ + int ret = (int) ((AL_CONST unsigned long) d2 - (AL_CONST unsigned long) d1); + + /* Wrap around if d2 is before d1 in the dialog array. */ + if (ret < 0) + ret += MAX_SIZE; + + return ret; +} + + + +/* cmp_shift_tab: + * Comparison function for shift+tab key movement. + */ +static int +cmp_shift_tab (AL_CONST DIALOG * d1, AL_CONST DIALOG * d2) +{ + int ret = (int) ((AL_CONST unsigned long) d1 - (AL_CONST unsigned long) d2); + + /* Wrap around if d2 is after d1 in the dialog array. */ + if (ret < 0) + ret += MAX_SIZE; + + return ret; +} + + + +/* min_dist: + * Returns the minimum distance between dialogs 'd1' and 'd2'. 'main_axis' + * is taken account to give different weights to the axes in the distance + * formula, as well as to shift the actual position of 'd2' along the axis + * by the amount specified by 'bias'. + */ +static int +min_dist (AL_CONST DIALOG * d1, AL_CONST DIALOG * d2, enum axis main_axis, + int bias) +{ + int x_left = d1->x - d2->x - d2->w + 1; + int x_right = d2->x - d1->x - d1->w + 1; + int y_top = d1->y - d2->y - d2->h + 1; + int y_bottom = d2->y - d1->y - d1->h + 1; + + if (main_axis == X_AXIS) + { + x_left -= bias; + x_right += bias; + y_top *= DISTANCE_RATIO; + y_bottom *= DISTANCE_RATIO; + } + else + { + x_left *= DISTANCE_RATIO; + x_right *= DISTANCE_RATIO; + y_top -= bias; + y_bottom += bias; + } + + if (x_left > 0) + { /* d2 is left of d1 */ + if (y_top > 0) /* d2 is above d1 */ + return x_left + y_top; + else if (y_bottom > 0) /* d2 is below d1 */ + return x_left + y_bottom; + else /* vertically overlapping */ + return x_left; + } + else if (x_right > 0) + { /* d2 is right of d1 */ + if (y_top > 0) /* d2 is above d1 */ + return x_right + y_top; + else if (y_bottom > 0) /* d2 is below d1 */ + return x_right + y_bottom; + else /* vertically overlapping */ + return x_right; + } + /* horizontally overlapping */ + else if (y_top > 0) /* d2 is above d1 */ + return y_top; + else if (y_bottom > 0) /* d2 is below d1 */ + return y_bottom; + else /* overlapping */ + return 0; +} + + + +/* cmp_right: + * Comparison function for right arrow key movement. + */ +static int +cmp_right (AL_CONST DIALOG * d1, AL_CONST DIALOG * d2) +{ + int bias; + + /* Wrap around if d2 is not fully contained in the half-plan + delimited by d1's right edge and not containing it. */ + if (d2->x < d1->x + d1->w) + bias = +SCREEN_W; + else + bias = 0; + + return min_dist (d1, d2, X_AXIS, bias); +} + + + +/* cmp_left: + * Comparison function for left arrow key movement. + */ +static int +cmp_left (AL_CONST DIALOG * d1, AL_CONST DIALOG * d2) +{ + int bias; + + /* Wrap around if d2 is not fully contained in the half-plan + delimited by d1's left edge and not containing it. */ + if (d2->x + d2->w > d1->x) + bias = -SCREEN_W; + else + bias = 0; + + return min_dist (d1, d2, X_AXIS, bias); +} + + + +/* cmp_down: + * Comparison function for down arrow key movement. + */ +static int +cmp_down (AL_CONST DIALOG * d1, AL_CONST DIALOG * d2) +{ + int bias; + + /* Wrap around if d2 is not fully contained in the half-plan + delimited by d1's bottom edge and not containing it. */ + if (d2->y < d1->y + d1->h) + bias = +SCREEN_H; + else + bias = 0; + + return min_dist (d1, d2, Y_AXIS, bias); +} + + + +/* cmp_up: + * Comparison function for up arrow key movement. + */ +static int +cmp_up (AL_CONST DIALOG * d1, AL_CONST DIALOG * d2) +{ + int bias; + + /* Wrap around if d2 is not fully contained in the half-plan + delimited by d1's top edge and not containing it. */ + if (d2->y + d2->h > d1->y) + bias = -SCREEN_H; + else + bias = 0; + + return min_dist (d1, d2, Y_AXIS, bias); +} + + + +/* move_focus: + * Handles arrow key and tab movement through a dialog, deciding which + * object should be given the input focus. + */ +static int +move_focus (DIALOG * d, int ascii, int scan, int *focus_obj) +{ + int (*cmp) (AL_CONST DIALOG * d1, AL_CONST DIALOG * d2); + OBJ_LIST obj[MAX_OBJECTS]; + int obj_count = 0; + int fobj, c; + int res = D_O_K; + + /* choose a comparison function */ + switch (scan) + { + case ALLEGRO_KEY_TAB: + cmp = (ascii == '\t') ? cmp_tab : cmp_shift_tab; + break; + case ALLEGRO_KEY_RIGHT: + cmp = cmp_right; + break; + case ALLEGRO_KEY_LEFT: + cmp = cmp_left; + break; + case ALLEGRO_KEY_DOWN: + cmp = cmp_down; + break; + case ALLEGRO_KEY_UP: + cmp = cmp_up; + break; + default: + return D_O_K; + } + + /* fill temporary table */ + for (c = 0; d[c].proc; c++) + { + if (((*focus_obj < 0) || (c != *focus_obj)) + && !(d[c].flags & (D_DISABLED | D_HIDDEN))) + { + obj[obj_count].index = c; + if (*focus_obj >= 0) + obj[obj_count].diff = cmp (d + *focus_obj, d + c); + else + obj[obj_count].diff = c; + obj_count++; + if (obj_count >= MAX_OBJECTS) + break; + } + } + + /* sort table */ + qsort (obj, obj_count, sizeof (OBJ_LIST), obj_list_cmp); + + /* find an object to give the focus to */ + fobj = *focus_obj; + for (c = 0; c < obj_count; c++) + { + res |= offer_focus (d, obj[c].index, focus_obj, FALSE); + if (fobj != *focus_obj) + break; + } + + return res; +} + + + +#define MESSAGE(i, msg, c) { \ + r = object_message(player->dialog+i, msg, c); \ + if (r != D_O_K) { \ + player->res |= r; \ + player->obj = i; \ + } \ +} + + + +/* do_dialog: + * The basic dialog manager. The list of dialog objects should be + * terminated by one with a null dialog procedure. Returns the index of + * the object which caused it to exit. + */ +int +do_dialog (DIALOG * dialog, int focus_obj) +{ + void *player; + ALLEGRO_ASSERT (dialog); + + player = init_dialog (dialog, focus_obj); + + while (update_dialog (player)) + { + /* If a menu is active, we yield here, since the dialog + * engine is shut down so no user code can be running. + */ + if (active_menu_player) + rest (1); + } + + return shutdown_dialog (player); +} + + + +/* popup_dialog: + * Like do_dialog(), but it stores the data on the screen before drawing + * the dialog and restores it when the dialog is closed. The screen area + * to be stored is calculated from the dimensions of the first object in + * the dialog, so all the other objects should lie within this one. + */ +int +popup_dialog (DIALOG * dialog, int focus_obj) +{ + ALLEGRO_BITMAP *bmp; + ALLEGRO_BITMAP *gui_bmp; + int ret; + ALLEGRO_ASSERT (dialog); + + bmp = my_create_memory_bitmap (dialog->w, dialog->h); + gui_bmp = gui_get_screen (); + if (bmp) + { + scare_mouse_area (dialog->x, dialog->y, dialog->w, dialog->h); + blit (gui_bmp, bmp, dialog->x, dialog->y, 0, 0, dialog->w, dialog->h); + unscare_mouse (); + } + else + *allegro_errno = ENOMEM; + + ret = do_dialog (dialog, focus_obj); + + if (bmp) + { + scare_mouse_area (dialog->x, dialog->y, dialog->w, dialog->h); + blit (bmp, gui_bmp, 0, 0, dialog->x, dialog->y, dialog->w, dialog->h); + unscare_mouse (); + al_destroy_bitmap (bmp); + } + + return ret; +} + + + +/* init_dialog: + * Sets up a dialog, returning a player object that can be used with + * the update_dialog() and shutdown_dialog() functions. + */ +DIALOG_PLAYER * +init_dialog (DIALOG * dialog, int focus_obj) +{ + DIALOG_PLAYER *player; + ALLEGRO_BITMAP *gui_bmp = gui_get_screen (); + struct al_active_dialog_player *n; + int c; + ALLEGRO_ASSERT (dialog); + + /* close any menu opened by a d_menu_proc */ + if (active_menu_player) + object_message (active_menu_player->dialog, MSG_LOSTMOUSE, 0); + + player = _AL_MALLOC (sizeof (DIALOG_PLAYER)); + if (!player) + { + *allegro_errno = ENOMEM; + return NULL; + } + + /* append player to the list */ + n = _AL_MALLOC (sizeof (struct al_active_dialog_player)); + if (!n) + { + *allegro_errno = ENOMEM; + _AL_FREE (player); + return NULL; + } + + n->next = NULL; + n->player = player; + + if (!current_active_dialog_player) + { + current_active_dialog_player = first_active_dialog_player = n; + } + else + { + current_active_dialog_player->next = n; + current_active_dialog_player = n; + } + + player->res = D_REDRAW; + player->joy_on = TRUE; + player->click_wait = FALSE; + player->dialog = dialog; + player->obj = -1; + player->mouse_obj = -1; + player->mouse_oz = gui_mouse_z (); + player->mouse_b = gui_mouse_b (); + + /* set up the global dialog pointer */ + active_dialog_player = player; + active_dialog = dialog; + + /* set up dclick checking code */ + if (gui_install_count <= 0) + { + LOCK_VARIABLE (gui_timer); + LOCK_VARIABLE (dclick_status); + LOCK_VARIABLE (dclick_time); + LOCK_VARIABLE (gui_mouse_x); + LOCK_VARIABLE (gui_mouse_y); + LOCK_VARIABLE (gui_mouse_z); + LOCK_VARIABLE (gui_mouse_b); + LOCK_FUNCTION (default_mouse_x); + LOCK_FUNCTION (default_mouse_y); + LOCK_FUNCTION (default_mouse_z); + LOCK_FUNCTION (default_mouse_b); + LOCK_FUNCTION (dclick_check); + + install_int (dclick_check, 20); + + /* gets menu auto-opening delay (in milliseconds) from config file */ + gui_menu_opening_delay = 300; + if (gui_menu_opening_delay >= 0) + { + /* adjust for actual timer speed */ + gui_menu_opening_delay /= 20; + } + else + { + /* no auto opening */ + gui_menu_opening_delay = -1; + } + + gui_install_count = 1; + gui_install_time = _allegro_count; + } + else + gui_install_count++; + + /* initialise the dialog */ + set_clip_rect (gui_bmp, 0, 0, SCREEN_W - 1, SCREEN_H - 1); + player->res |= dialog_message (dialog, MSG_START, 0, &player->obj); + + player->mouse_obj = find_mouse_object (dialog); + if (player->mouse_obj >= 0) + dialog[player->mouse_obj].flags |= D_GOTMOUSE; + + for (c = 0; dialog[c].proc; c++) + dialog[c].flags &= ~D_GOTFOCUS; + + if (focus_obj >= 0) + c = focus_obj; + else + c = player->mouse_obj; + + if ((c >= 0) + && ((object_message (dialog + c, MSG_WANTFOCUS, 0)) & D_WANTFOCUS)) + { + dialog[c].flags |= D_GOTFOCUS; + player->focus_obj = c; + } + else + player->focus_obj = -1; + + return player; +} + + + +/* gui_set_screen: + * Changes the target bitmap for GUI drawing operations + */ +void +gui_set_screen (ALLEGRO_BITMAP * bmp) +{ + gui_screen = bmp; +} + + + +/* gui_get_screen: + * Returns the gui_screen, or the default surface if gui_screen is NULL + */ +ALLEGRO_BITMAP * +gui_get_screen (void) +{ + return gui_screen ? gui_screen : screen; +} + + + +/* check_for_redraw: + * Checks whether any parts of the current dialog need to be redraw. + */ +static void +check_for_redraw (DIALOG_PLAYER * player) +{ + struct al_active_dialog_player *iter; + int c, r; + ALLEGRO_ASSERT (player); + + /* need to redraw all active dialogs? */ + if (player->res & D_REDRAW_ALL) + { + for (iter = first_active_dialog_player; + iter != current_active_dialog_player; iter = iter->next) + dialog_message (iter->player->dialog, MSG_DRAW, 0, NULL); + + player->res &= ~D_REDRAW_ALL; + player->res |= D_REDRAW; + } + + /* need to draw it? */ + if (player->res & D_REDRAW) + { + player->res ^= D_REDRAW; + player->res |= + dialog_message (player->dialog, MSG_DRAW, 0, &player->obj); + } + + /* check if any widget has to be redrawn */ + for (c = 0; player->dialog[c].proc; c++) + { + if ((player->dialog[c].flags & (D_DIRTY | D_HIDDEN)) == D_DIRTY) + { + player->dialog[c].flags &= ~D_DIRTY; + MESSAGE (c, MSG_DRAW, 0); + } + } +} + + + +/* update_dialog: + * Updates the status of a dialog object returned by init_dialog(), + * returning TRUE if it is still active or FALSE if it has finished. + */ +int +update_dialog (DIALOG_PLAYER * player) +{ + int c, cascii, cscan, ccombo, r, ret, nowhere, z; + int new_mouse_b; + ALLEGRO_ASSERT (player); + + /* redirect to update_menu() whenever a menu is activated */ + if (active_menu_player) + { + if (!active_menu_player_zombie) + { + if (update_menu (active_menu_player)) + return TRUE; + } + + /* make sure all buttons are released before folding the menu */ + if (gui_mouse_b ()) + { + active_menu_player_zombie = TRUE; + return TRUE; + } + else + { + active_menu_player_zombie = FALSE; + + for (c = 0; player->dialog[c].proc; c++) + if (&player->dialog[c] == active_menu_player->dialog) + break; + ALLEGRO_ASSERT (player->dialog[c].proc); + + MESSAGE (c, MSG_LOSTMOUSE, 0); + goto getout; + } + } + + if (player->res & D_CLOSE) + return FALSE; + + /* deal with mouse buttons presses and releases */ + new_mouse_b = gui_mouse_b (); + if (new_mouse_b != player->mouse_b) + { + player->res |= + offer_focus (player->dialog, player->mouse_obj, &player->focus_obj, + FALSE); + + if (player->mouse_obj >= 0) + { + /* send press and release messages */ + if ((new_mouse_b & 1) && !(player->mouse_b & 1)) + MESSAGE (player->mouse_obj, MSG_LPRESS, new_mouse_b); + if (!(new_mouse_b & 1) && (player->mouse_b & 1)) + MESSAGE (player->mouse_obj, MSG_LRELEASE, new_mouse_b); + + if ((new_mouse_b & 4) && !(player->mouse_b & 4)) + MESSAGE (player->mouse_obj, MSG_MPRESS, new_mouse_b); + if (!(new_mouse_b & 4) && (player->mouse_b & 4)) + MESSAGE (player->mouse_obj, MSG_MRELEASE, new_mouse_b); + + if ((new_mouse_b & 2) && !(player->mouse_b & 2)) + MESSAGE (player->mouse_obj, MSG_RPRESS, new_mouse_b); + if (!(new_mouse_b & 2) && (player->mouse_b & 2)) + MESSAGE (player->mouse_obj, MSG_RRELEASE, new_mouse_b); + + player->mouse_b = new_mouse_b; + } + else + player->res |= dialog_message (player->dialog, MSG_IDLE, 0, &nowhere); + } + + /* need to reinstall the dclick and switch handlers? */ + if (gui_install_time != _allegro_count) + { + install_int (dclick_check, 20); + + gui_install_time = _allegro_count; + } + + /* are we dealing with a mouse click? */ + if (player->click_wait) + { + if ((ABS (player->mouse_ox - gui_mouse_x ()) > 8) || + (ABS (player->mouse_oy - gui_mouse_y ()) > 8)) + dclick_status = DCLICK_NOT; + + /* waiting... */ + if ((dclick_status != DCLICK_AGAIN) && (dclick_status != DCLICK_NOT)) + { + player->res |= + dialog_message (player->dialog, MSG_IDLE, 0, &nowhere); + check_for_redraw (player); + return TRUE; + } + + player->click_wait = FALSE; + + /* double click! */ + if ((dclick_status == DCLICK_AGAIN) && + (gui_mouse_x () >= player->dialog[player->mouse_obj].x) && + (gui_mouse_y () >= player->dialog[player->mouse_obj].y) && + (gui_mouse_x () <= + player->dialog[player->mouse_obj].x + + player->dialog[player->mouse_obj].w) + && (gui_mouse_y () <= + player->dialog[player->mouse_obj].y + + player->dialog[player->mouse_obj].h)) + { + MESSAGE (player->mouse_obj, MSG_DCLICK, 0); + } + + goto getout; + } + + player->res &= ~D_USED_CHAR; + + /* need to give the input focus to someone? */ + if (player->res & D_WANTFOCUS) + { + player->res ^= D_WANTFOCUS; + player->res |= + offer_focus (player->dialog, player->obj, &player->focus_obj, FALSE); + } + + /* has mouse object changed? */ + c = find_mouse_object (player->dialog); + if (c != player->mouse_obj) + { + if (player->mouse_obj >= 0) + { + player->dialog[player->mouse_obj].flags &= ~D_GOTMOUSE; + MESSAGE (player->mouse_obj, MSG_LOSTMOUSE, 0); + } + if (c >= 0) + { + player->dialog[c].flags |= D_GOTMOUSE; + MESSAGE (c, MSG_GOTMOUSE, 0); + } + player->mouse_obj = c; + + /* move the input focus as well? */ + if ((gui_mouse_focus) && (player->mouse_obj != player->focus_obj)) + player->res |= + offer_focus (player->dialog, player->mouse_obj, &player->focus_obj, + TRUE); + } + + /* deal with mouse button clicks */ + if (new_mouse_b) + { + player->res |= + offer_focus (player->dialog, player->mouse_obj, &player->focus_obj, + FALSE); + + if (player->mouse_obj >= 0) + { + dclick_time = 0; + dclick_status = DCLICK_START; + player->mouse_ox = gui_mouse_x (); + player->mouse_oy = gui_mouse_y (); + + /* send click message */ + MESSAGE (player->mouse_obj, MSG_CLICK, new_mouse_b); + + if (player->res == D_O_K) + player->click_wait = TRUE; + } + else + player->res |= dialog_message (player->dialog, MSG_IDLE, 0, &nowhere); + + /* goto getout; *//* to avoid an updating delay */ + } + + /* deal with mouse wheel clicks */ + z = gui_mouse_z (); + + if (z != player->mouse_oz) + { + player->res |= + offer_focus (player->dialog, player->mouse_obj, &player->focus_obj, + FALSE); + + if (player->mouse_obj >= 0) + { + MESSAGE (player->mouse_obj, MSG_WHEEL, z - player->mouse_oz); + } + else + player->res |= dialog_message (player->dialog, MSG_IDLE, 0, &nowhere); + + player->mouse_oz = z; + + /* goto getout; *//* to avoid an updating delay */ + } + + /* fake joystick input by converting it to key presses */ + if (player->joy_on) + rest (20); + + poll_joystick (); + + if (player->joy_on) + { + if ((!joy[0].stick[0].axis[0].d1) && (!joy[0].stick[0].axis[0].d2) && + (!joy[0].stick[0].axis[1].d1) && (!joy[0].stick[0].axis[1].d2) && + (!joy[0].button[0].b) && (!joy[0].button[1].b)) + { + player->joy_on = FALSE; + rest (20); + } + cascii = cscan = 0; + } + else + { + if (joy[0].stick[0].axis[0].d1) + { + cascii = 0; + cscan = ALLEGRO_KEY_LEFT; + player->joy_on = TRUE; + } + else if (joy[0].stick[0].axis[0].d2) + { + cascii = 0; + cscan = ALLEGRO_KEY_RIGHT; + player->joy_on = TRUE; + } + else if (joy[0].stick[0].axis[1].d1) + { + cascii = 0; + cscan = ALLEGRO_KEY_UP; + player->joy_on = TRUE; + } + else if (joy[0].stick[0].axis[1].d2) + { + cascii = 0; + cscan = ALLEGRO_KEY_DOWN; + player->joy_on = TRUE; + } + else if ((joy[0].button[0].b) || (joy[0].button[1].b)) + { + cascii = ' '; + cscan = ALLEGRO_KEY_SPACE; + player->joy_on = TRUE; + } + else + cascii = cscan = 0; + } + + /* deal with keyboard input */ + if ((cascii) || (cscan) || (keypressed ())) + { + if ((!cascii) && (!cscan)) + cascii = ureadkey (&cscan); + + ccombo = (cscan << 8) | ((cascii <= 255) ? cascii : '^'); + + /* let object deal with the key */ + if (player->focus_obj >= 0) + { + MESSAGE (player->focus_obj, MSG_CHAR, ccombo); + if (player->res & (D_USED_CHAR | D_CLOSE)) + goto getout; + + MESSAGE (player->focus_obj, MSG_UCHAR, cascii); + if (player->res & (D_USED_CHAR | D_CLOSE)) + goto getout; + } + + /* keyboard shortcut? */ + for (c = 0; player->dialog[c].proc; c++) + { + if ((((cascii > 0) && (cascii <= 255) && + (utolower (player->dialog[c].key) == utolower ((cascii)))) || + ((!cascii) && (player->dialog[c].key == (cscan << 8)))) && + (!(player->dialog[c].flags & (D_HIDDEN | D_DISABLED)))) + { + MESSAGE (c, MSG_KEY, ccombo); + goto getout; + } + } + + /* broadcast in case any other objects want it */ + for (c = 0; player->dialog[c].proc; c++) + { + if (!(player->dialog[c].flags & (D_HIDDEN | D_DISABLED))) + { + MESSAGE (c, MSG_XCHAR, ccombo); + if (player->res & D_USED_CHAR) + goto getout; + } + } + + /* pass or to selected object */ + if (((cascii == '\r') || (cascii == '\n') || (cascii == ' ')) && + (player->focus_obj >= 0)) + { + MESSAGE (player->focus_obj, MSG_KEY, ccombo); + goto getout; + } + + /* ESC closes dialog */ + if (cascii == 27) + { + player->res |= D_CLOSE; + player->obj = -1; + goto getout; + } + + /* move focus around the dialog */ + player->res |= + move_focus (player->dialog, cascii, cscan, &player->focus_obj); + } + + /* redraw? */ + check_for_redraw (player); + + /* send idle messages */ + player->res |= dialog_message (player->dialog, MSG_IDLE, 0, &player->obj); + +getout: + + ret = (!(player->res & D_CLOSE)); + player->res &= ~D_CLOSE; + return ret; +} + + + +/* shutdown_dialog: + * Destroys a dialog object returned by init_dialog(), returning the index + * of the object that caused it to exit. + */ +int +shutdown_dialog (DIALOG_PLAYER * player) +{ + struct al_active_dialog_player *iter, *prev; + int obj; + ALLEGRO_ASSERT (player); + + /* send the finish messages */ + dialog_message (player->dialog, MSG_END, 0, &player->obj); + + /* remove the double click handler */ + gui_install_count--; + + if (gui_install_count <= 0) + { + remove_int (dclick_check); + } + + if (player->mouse_obj >= 0) + player->dialog[player->mouse_obj].flags &= ~D_GOTMOUSE; + + /* remove dialog player from the list of active players */ + for (iter = first_active_dialog_player, prev = 0; iter != 0; + prev = iter, iter = iter->next) + { + if (iter->player == player) + { + if (prev) + prev->next = iter->next; + else + first_active_dialog_player = iter->next; + + if (iter == current_active_dialog_player) + current_active_dialog_player = prev; + + _AL_FREE (iter); + break; + } + } + + if (current_active_dialog_player) + active_dialog_player = current_active_dialog_player->player; + else + active_dialog_player = NULL; + + if (active_dialog_player) + active_dialog = active_dialog_player->dialog; + else + active_dialog = NULL; + + obj = player->obj; + + _AL_FREE (player); + + return obj; +} + + + +void (*gui_menu_draw_menu) (int x, int y, int w, int h) = NULL; +void (*gui_menu_draw_menu_item) (MENU * m, int x, int y, int w, int h, + int bar, int sel) = NULL; + +/* split_around_tab: + * Helper function for splitting a string into two tokens + * delimited by the first TAB character. + */ +static char * +split_around_tab (const char *s, char **tok1, char **tok2) +{ + char *buf, *last; + char tmp[16]; + + buf = ustrdup (s); + *tok1 = ustrtok_r (buf, uconvert_ascii ("\t", tmp, sizeof (tmp)), &last); + *tok2 = ustrtok_r (NULL, empty_string, &last); + + return buf; +} + + + +/* bar_entry_lengh: + * Helper function for calculating the length of a menu bar entry. + */ +static int +bar_entry_length (const char *text) +{ + char *buf, *tok1, *tok2; + int len; + + buf = split_around_tab (text, &tok1, &tok2); + len = gui_strlen (tok1) + 16; + if (tok2) + len += gui_strlen (tok2) + 16; + _AL_FREE (buf); + + return len; +} + + + +/* get_menu_pos: + * Calculates the coordinates of an object within a top level menu bar. + */ +static void +get_menu_pos (MENU_PLAYER * m, int c, int *x, int *y, int *w) +{ + int c2; + + if (m->bar) + { + *x = m->x + 1; + + for (c2 = 0; c2 < c; c2++) + *x += bar_entry_length (m->menu[c2].text); + + *y = m->y + 1; + *w = bar_entry_length (m->menu[c].text); + } + else + { + *x = m->x + 1; + *y = m->y + c * (text_height (font) + 4) + 1; + *w = m->w - 3; + } +} + + + +/* draw_menu_item: + * Draws an item from a popup menu onto the screen. + */ +static void +draw_menu_item (MENU_PLAYER * m, int c) +{ + int fg, bg; + int x, y, w; + char *buf, *tok1, *tok2; + int my; + ALLEGRO_BITMAP *gui_bmp = gui_get_screen (); + + get_menu_pos (m, c, &x, &y, &w); + + if (gui_menu_draw_menu_item) + { + gui_menu_draw_menu_item (&m->menu[c], x, y, w, text_height (font) + 4, + m->bar, (c == m->sel) ? TRUE : FALSE); + return; + } + + if (m->menu[c].flags & D_DISABLED) + { + if (c == m->sel) + { + fg = gui_mg_color; + bg = gui_fg_color; + } + else + { + fg = gui_mg_color; + bg = gui_bg_color; + } + } + else + { + if (c == m->sel) + { + fg = gui_bg_color; + bg = gui_fg_color; + } + else + { + fg = gui_fg_color; + bg = gui_bg_color; + } + } + + rectfill (gui_bmp, x, y, x + w - 1, y + text_height (font) + 3, bg); + + if (ugetc (m->menu[c].text)) + { + buf = split_around_tab (m->menu[c].text, &tok1, &tok2); + gui_textout_ex (gui_bmp, tok1, x + 8, y + 1, fg, bg, FALSE); + if (tok2) + gui_textout_ex (gui_bmp, tok2, x + w - gui_strlen (tok2) - 10, y + 1, + fg, bg, FALSE); + + if ((m->menu[c].child) && (!m->bar)) + { + my = y + text_height (font) / 2; + hline (gui_bmp, x + w - 8, my + 1, x + w - 4, fg); + hline (gui_bmp, x + w - 8, my + 0, x + w - 5, fg); + hline (gui_bmp, x + w - 8, my - 1, x + w - 6, fg); + hline (gui_bmp, x + w - 8, my - 2, x + w - 7, fg); + putpixel (gui_bmp, x + w - 8, my - 3, fg); + hline (gui_bmp, x + w - 8, my + 2, x + w - 5, fg); + hline (gui_bmp, x + w - 8, my + 3, x + w - 6, fg); + hline (gui_bmp, x + w - 8, my + 4, x + w - 7, fg); + putpixel (gui_bmp, x + w - 8, my + 5, fg); + } + + _AL_FREE (buf); + } + else + hline (gui_bmp, x, y + text_height (font) / 2 + 2, x + w, fg); + + if (m->menu[c].flags & D_SELECTED) + { + line (gui_bmp, x + 1, y + text_height (font) / 2 + 1, x + 3, + y + text_height (font) + 1, fg); + line (gui_bmp, x + 3, y + text_height (font) + 1, x + 6, y + 2, fg); + } +} + + + +/* draw_menu: + * Draws a popup menu onto the screen. + */ +static void +draw_menu (MENU_PLAYER * m) +{ + int c; + + if (gui_menu_draw_menu) + gui_menu_draw_menu (m->x, m->y, m->w, m->h); + else + { + ALLEGRO_BITMAP *gui_bmp = gui_get_screen (); + rectfill (gui_bmp, m->x, m->y, m->x + m->w - 2, m->y + m->h - 2, + gui_bg_color); + rect (gui_bmp, m->x, m->y, m->x + m->w - 2, m->y + m->h - 2, + gui_fg_color); + vline (gui_bmp, m->x + m->w - 1, m->y + 1, m->y + m->h - 1, + gui_fg_color); + hline (gui_bmp, m->x + 1, m->y + m->h - 1, m->x + m->w - 1, + gui_fg_color); + } + + for (c = 0; m->menu[c].text; c++) + draw_menu_item (m, c); +} + + + +/* menu_mouse_object: + * Returns the index of the object the mouse is currently on top of. + */ +static int +menu_mouse_object (MENU_PLAYER * m) +{ + int c; + int x, y, w; + + for (c = 0; c < m->size; c++) + { + get_menu_pos (m, c, &x, &y, &w); + + if ((gui_mouse_x () >= x) && (gui_mouse_x () < x + w) && + (gui_mouse_y () >= y) + && (gui_mouse_y () < y + (text_height (font) + 4))) + return (ugetc (m->menu[c].text)) ? c : -1; + } + + return -1; +} + + + +/* mouse_in_single_menu: + * Checks if the mouse is inside a single menu. + */ +static INLINE int +mouse_in_single_menu (MENU_PLAYER * m) +{ + if ((gui_mouse_x () >= m->x) && (gui_mouse_x () < m->x + m->w) && + (gui_mouse_y () >= m->y) && (gui_mouse_y () < m->y + m->h)) + return TRUE; + else + return FALSE; +} + + + +/* mouse_in_parent_menu: + * Recursively checks if the mouse is inside a menu (or any of its parents) + * and simultaneously not on the selected item of the menu. + */ +static int +mouse_in_parent_menu (MENU_PLAYER * m) +{ + int c; + + if (!m) + return FALSE; + + c = menu_mouse_object (m); + if ((c >= 0) && (c != m->sel)) + return TRUE; + + return mouse_in_parent_menu (m->parent); +} + + + +/* layout_menu: + * Calculates the layout of the menu. + */ +static void +layout_menu (MENU_PLAYER * m, MENU * menu, int bar, int x, int y, int minw, + int minh) +{ + char *buf, *tok1, *tok2; + int extra = 0; + int c; + int child = FALSE; + + m->menu = menu; + m->bar = bar; + m->x = x; + m->y = y; + m->w = 3; + m->h = (m->bar) ? (text_height (font) + 7) : 3; + m->proc = NULL; + m->sel = -1; + + /* calculate size of the menu */ + for (m->size = 0; m->menu[m->size].text; m->size++) + { + + if (m->bar) + { + m->w += bar_entry_length (m->menu[m->size].text); + } + else + { + if (m->menu[m->size].child) + child = TRUE; + + if (ugetc (m->menu[m->size].text)) + { + buf = split_around_tab (m->menu[m->size].text, &tok1, &tok2); + c = gui_strlen (tok1); + } + else + { + buf = NULL; + c = 0; + } + + m->h += text_height (font) + 4; + m->w = MAX (m->w, c + 16); + + if (buf) + { + if (tok2) + { + c = gui_strlen (tok2); + extra = MAX (extra, c); + } + + _AL_FREE (buf); + } + } + } + + if (extra) + m->w += extra + 16; + + if (child) + m->w += 22; + + m->w = MAX (m->w, minw); + m->h = MAX (m->h, minh); +} + + + +/* menu_key_shortcut: + * Returns true if c is indicated as a keyboard shortcut by a '&' character + * in the specified string. + */ +static int +menu_key_shortcut (int c, AL_CONST char *s) +{ + int d; + + while ((d = ugetxc (&s)) != 0) + { + if (d == '&') + { + d = ugetc (s); + if ((d != '&') && (utolower (d) == utolower (c & 0xFF))) + return TRUE; + } + } + + return FALSE; +} + + + +/* menu_alt_key: + * Searches a menu for keyboard shortcuts, for the alt+letter to bring + * up a menu. + */ +static int +menu_alt_key (int k, MENU * m) +{ + static unsigned char alt_table[] = { + ALLEGRO_KEY_A, ALLEGRO_KEY_B, ALLEGRO_KEY_C, ALLEGRO_KEY_D, ALLEGRO_KEY_E, + ALLEGRO_KEY_F, ALLEGRO_KEY_G, ALLEGRO_KEY_H, ALLEGRO_KEY_I, + ALLEGRO_KEY_J, ALLEGRO_KEY_K, ALLEGRO_KEY_L, ALLEGRO_KEY_M, ALLEGRO_KEY_N, + ALLEGRO_KEY_O, ALLEGRO_KEY_P, ALLEGRO_KEY_Q, ALLEGRO_KEY_R, + ALLEGRO_KEY_S, ALLEGRO_KEY_T, ALLEGRO_KEY_U, ALLEGRO_KEY_V, ALLEGRO_KEY_W, + ALLEGRO_KEY_X, ALLEGRO_KEY_Y, ALLEGRO_KEY_Z + }; + + AL_CONST char *s; + int c, d; + + if (k & 0xFF) + return 0; + + k >>= 8; + + c = scancode_to_ascii (k); + if (c) + { + k = c; + } + else + { + for (c = 0; c < (int) sizeof (alt_table); c++) + { + if (k == alt_table[c]) + { + k = c + 'a'; + break; + } + } + + if (c >= (int) sizeof (alt_table)) + return 0; + } + + for (c = 0; m[c].text; c++) + { + s = m[c].text; + while ((d = ugetxc (&s)) != 0) + { + if (d == '&') + { + d = ugetc (s); + if ((d != '&') && (utolower (d) == utolower (k))) + return k; + } + } + } + + return 0; +} + + + +/* do_menu: + * Displays and animates a popup menu at the specified screen position, + * returning the index of the item that was selected, or -1 if it was + * dismissed. If the menu crosses the edge of the screen it will be moved. + */ +int +do_menu (MENU * menu, int x, int y) +{ + MENU_PLAYER *player; + int ret; + ALLEGRO_ASSERT (menu); + + player = init_menu (menu, x, y); + + while (update_menu (player)) + rest (1); + + ret = shutdown_menu (player); + + do + { + } + while (gui_mouse_b ()); + + return ret; +} + + + +/* init_single_menu: + * Worker function for initialising a menu. + */ +static MENU_PLAYER * +init_single_menu (MENU * menu, MENU_PLAYER * parent, DIALOG * dialog, int bar, + int x, int y, int repos, int minw, int minh) +{ + ALLEGRO_BITMAP *gui_bmp = gui_get_screen (); + MENU_PLAYER *player; + ALLEGRO_ASSERT (menu); + int scare = 0; + + player = _AL_MALLOC (sizeof (MENU_PLAYER)); + if (!player) + { + *allegro_errno = ENOMEM; + return NULL; + } + + layout_menu (player, menu, bar, x, y, minw, minh); + + if (repos) + { + if (parent && !parent->bar) + { + if (player->x + player->w >= SCREEN_W) + player->x = parent->x - player->w + 1; + } + player->x = CLAMP (0, player->x, SCREEN_W - player->w - 1); + player->y = CLAMP (0, player->y, SCREEN_H - player->h - 1); + } + + if (scare) + scare_mouse_area (player->x, player->y, player->w, player->h); + + /* save screen under the menu */ + player->saved = my_create_memory_bitmap (player->w, player->h); + + if (player->saved) + blit (gui_bmp, player->saved, player->x, player->y, 0, 0, player->w, + player->h); + else + *allegro_errno = ENOMEM; + + /* setup state variables */ + player->sel = menu_mouse_object (player); + + if (scare) + unscare_mouse (); + + player->mouse_button_was_pressed = gui_mouse_b (); + player->back_from_child = FALSE; + player->timestamp = gui_timer; + player->mouse_sel = player->sel; + player->redraw = TRUE; + player->auto_open = TRUE; + player->ret = -1; + + player->dialog = dialog; + + player->parent = parent; + player->child = NULL; + + return player; +} + + + +/* init_menu: + * Sets up a menu, returning a menu player object that can be used + * with the update_menu() and shutdown_menu() functions. + */ +MENU_PLAYER * +init_menu (MENU * menu, int x, int y) +{ + return init_single_menu (menu, NULL, NULL, FALSE, x, y, TRUE, 0, 0); +} + + + +/* update_menu: + * Updates the status of a menu player object returned by init_menu(), + * returning TRUE if it is still active or FALSE if it has finished. + * + * The navigation through the arborescence of menus can be done: + * - with the arrow keys, + * - with mouse point-and-clicks, + * - with mouse movements when the mouse button is being held down, + * - with mouse movements only if gui_menu_opening_delay is non negative. + */ +int +update_menu (MENU_PLAYER * player) +{ + MENU_PLAYER *i; + int c, c2; + int old_sel, child_ret; + int child_x, child_y; + ALLEGRO_ASSERT (player); + + /* find activated menu */ + while (player->child) + player = player->child; + + old_sel = player->sel; + + c = menu_mouse_object (player); + + if ((gui_mouse_b ()) || (c != player->mouse_sel)) + { + player->sel = player->mouse_sel = c; + player->auto_open = TRUE; + } + + if (gui_mouse_b ()) + { /* button pressed? */ + /* Dismiss menu if: + * - the mouse cursor is outside the menu and inside the parent menu, or + * - the mouse cursor is outside the menu and the button has just been pressed. + */ + if (!mouse_in_single_menu (player)) + { + if (mouse_in_parent_menu (player->parent) + || (!player->mouse_button_was_pressed)) + { + player->ret = -2; + goto End; + } + } + + if ((player->sel >= 0) && (player->menu[player->sel].child)) /* bring up child menu? */ + player->ret = player->sel; + + /* don't trigger the 'select' event on button press for non menu item */ + player->mouse_button_was_pressed = TRUE; + + clear_keybuf (); + } + else + { /* button not pressed */ + /* trigger the 'select' event only on button release for non menu item */ + if (player->mouse_button_was_pressed) + { + player->ret = player->sel; + player->mouse_button_was_pressed = FALSE; + } + + if (keypressed ()) + { /* keyboard input */ + player->timestamp = gui_timer; + player->auto_open = FALSE; + + c = readkey (); + + if ((c & 0xFF) == 27) + { + player->ret = -2; + goto End; + } + + switch (c >> 8) + { + + case ALLEGRO_KEY_LEFT: + if (player->parent) + { + if (player->parent->bar) + { + simulate_keypress (ALLEGRO_KEY_LEFT << 8); + simulate_keypress (ALLEGRO_KEY_DOWN << 8); + } + player->ret = -2; + goto End; + } + /* fall through */ + + case ALLEGRO_KEY_UP: + if ((((c >> 8) == ALLEGRO_KEY_LEFT) && (player->bar)) || + (((c >> 8) == ALLEGRO_KEY_UP) && (!player->bar))) + { + c = player->sel; + do + { + c--; + if (c < 0) + c = player->size - 1; + } + while ((!ugetc (player->menu[c].text)) + && (c != player->sel)); + player->sel = c; + } + break; + + case ALLEGRO_KEY_RIGHT: + if (((player->sel < 0) || (!player->menu[player->sel].child)) && + (player->parent) && (player->parent->bar)) + { + simulate_keypress (ALLEGRO_KEY_RIGHT << 8); + simulate_keypress (ALLEGRO_KEY_DOWN << 8); + player->ret = -2; + goto End; + } + /* fall through */ + + case ALLEGRO_KEY_DOWN: + if ((player->sel >= 0) && (player->menu[player->sel].child) && + ((((c >> 8) == ALLEGRO_KEY_RIGHT) && (!player->bar)) || + (((c >> 8) == ALLEGRO_KEY_DOWN) && (player->bar)))) + { + player->ret = player->sel; + } + else if ((((c >> 8) == ALLEGRO_KEY_RIGHT) && (player->bar)) || + (((c >> 8) == ALLEGRO_KEY_DOWN) && (!player->bar))) + { + c = player->sel; + do + { + c++; + if (c >= player->size) + c = 0; + } + while ((!ugetc (player->menu[c].text)) + && (c != player->sel)); + player->sel = c; + } + break; + + case ALLEGRO_KEY_SPACE: + case ALLEGRO_KEY_ENTER: + if (player->sel >= 0) + player->ret = player->sel; + break; + + default: + if ((!player->parent) && ((c & 0xFF) == 0)) + c = menu_alt_key (c, player->menu); + for (c2 = 0; player->menu[c2].text; c2++) + { + if (menu_key_shortcut (c, player->menu[c2].text)) + { + player->ret = player->sel = c2; + break; + } + } + if (player->parent) + { + i = player->parent; + for (c2 = 0; i->parent; c2++) + i = i->parent; + c = menu_alt_key (c, i->menu); + if (c) + { + while (c2-- > 0) + simulate_keypress (27); + simulate_keypress (c); + player->ret = -2; + goto End; + } + } + break; + } + } + } /* end of input processing */ + + if ((player->redraw) || (player->sel != old_sel)) + { /* selection changed? */ + ALLEGRO_BITMAP *gui_bmp = gui_get_screen (); + player->timestamp = gui_timer; + + acquire_bitmap (gui_bmp); + + if (player->redraw) + { + draw_menu (player); + player->redraw = FALSE; + } + else + { + if (old_sel >= 0) + draw_menu_item (player, old_sel); + + if (player->sel >= 0) + draw_menu_item (player, player->sel); + } + + release_bitmap (gui_bmp); + } + + if (player->auto_open && (gui_menu_opening_delay >= 0)) + { /* menu auto-opening on? */ + if (!mouse_in_single_menu (player)) + { + if (mouse_in_parent_menu (player->parent)) + { + /* automatically goes back to parent */ + player->ret = -3; + goto End; + } + } + + if ((player->mouse_sel >= 0) && (player->menu[player->mouse_sel].child)) + { + if (player->bar) + { + /* top level menu auto-opening if back from child */ + if (player->back_from_child) + { + player->timestamp = gui_timer; + player->ret = player->mouse_sel; + } + } + else + { + /* sub menu auto-opening if enough time has passed */ + if ((gui_timer - player->timestamp) > gui_menu_opening_delay) + player->ret = player->mouse_sel; + } + } + + player->back_from_child = FALSE; + } + +End: + if (player->ret >= 0) + { /* item selected? */ + if (player->menu[player->ret].flags & D_DISABLED) + { + return TRUE; /* continue */ + } + else if (player->menu[player->ret].child) + { /* child menu? */ + if (player->bar) + { + get_menu_pos (player, player->ret, &child_x, &child_y, &c); + child_x += 6; + child_y += text_height (font) + 7; + } + else + { + child_x = player->x + player->w - 3; + child_y = + player->y + (text_height (font) + 4) * player->ret + + text_height (font) / 4 + 1; + } + + /* recursively call child menu */ + player->child = + init_single_menu (player->menu[player->ret].child, player, NULL, + FALSE, child_x, child_y, TRUE, 0, 0); + return TRUE; /* continue */ + } + + while (player->parent) + { /* parent menu? */ + player = player->parent; + shutdown_single_menu (player->child, NULL); + player->child = NULL; + } + + return FALSE; /* item selected */ + } + + if (player->ret < -1) + { /* dismiss menu ? */ + if (player->parent) + { + child_ret = player->ret; /* needed below */ + player = player->parent; + shutdown_single_menu (player->child, NULL); + player->child = NULL; + player->ret = -1; + player->mouse_button_was_pressed = FALSE; + player->mouse_sel = menu_mouse_object (player); + + if (child_ret == -3) + { /* return caused by mouse movement? */ + player->sel = player->mouse_sel; + player->redraw = TRUE; + player->timestamp = gui_timer; + player->back_from_child = TRUE; + } + + return TRUE; /* return to parent */ + } + + return FALSE; /* menu dismissed */ + } + + /* special kludge for menu bar */ + if ((player->bar) && (!gui_mouse_b ()) && (!keypressed ()) + && (!mouse_in_single_menu (player))) + return FALSE; + + return TRUE; +} + + + +/* shutdown_single_menu: + * Worker function for shutting down a menu. + */ +static int +shutdown_single_menu (MENU_PLAYER * player, int *dret) +{ + int ret; + ALLEGRO_ASSERT (player); + + if (dret) + *dret = 0; + + if ((!player->proc) && (player->ret >= 0)) + { /* callback function? */ + active_menu = &player->menu[player->ret]; + player->proc = active_menu->proc; + } + + if (player->ret >= 0) + { + if (player->parent) + player->parent->proc = player->proc; + else + { + if (player->proc) + { + ret = player->proc (); + if (dret) + *dret = ret; + } + } + } + + /* restore screen */ + if (player->saved) + { + ALLEGRO_BITMAP *gui_bmp = gui_get_screen (); + blit (player->saved, gui_bmp, 0, 0, player->x, player->y, player->w, + player->h); + al_destroy_bitmap (player->saved); + } + + ret = player->ret; + + _AL_FREE (player); + + return ret; +} + + + +/* shutdown_tree_menu: + * Destroys a menu player object returned by init_single_menu(), after + * recursively closing all the sub-menus if necessary, and returns the + * index of the item that was selected, or -1 if it was dismissed. + */ +static int +shutdown_tree_menu (MENU_PLAYER * player, int *dret) +{ + ALLEGRO_ASSERT (player); + + if (player->child) + { + shutdown_tree_menu (player->child, dret); + player->child = NULL; + } + + return shutdown_single_menu (player, dret); +} + + + +/* shutdown_menu: + * Destroys a menu player object returned by init_menu() and returns + * the index of the item that was selected, or -1 if it was dismissed. + */ +int +shutdown_menu (MENU_PLAYER * player) +{ + return shutdown_tree_menu (player, NULL); +} + + + +/* d_menu_proc: + * Dialog procedure for adding drop down menus to a GUI dialog. This + * displays the top level menu items as a horizontal bar (eg. across the + * top of the screen), and pops up child menus when they are clicked. + * When it executes one of the menu callback routines, it passes the + * return value back to the dialog manager, so these can return D_O_K, + * D_CLOSE, D_REDRAW, etc. + */ +int +d_menu_proc (int msg, DIALOG * d, int c) +{ + MENU_PLAYER m, *mp; + int ret = D_O_K; + int x, i; + ALLEGRO_ASSERT (d); + + switch (msg) + { + + case MSG_START: + layout_menu (&m, d->dp, TRUE, d->x, d->y, d->w, d->h); + d->w = m.w; + d->h = m.h; + break; + + case MSG_DRAW: + layout_menu (&m, d->dp, TRUE, d->x, d->y, d->w, d->h); + draw_menu (&m); + break; + + case MSG_XCHAR: + x = menu_alt_key (c, d->dp); + if (!x) + break; + + ret |= D_USED_CHAR; + simulate_keypress (x); + /* fall through */ + + case MSG_GOTMOUSE: + case MSG_CLICK: + /* steal the mouse */ + for (i = 0; active_dialog[i].proc; i++) + if (active_dialog[i].flags & D_GOTMOUSE) + { + active_dialog[i].flags &= ~D_GOTMOUSE; + object_message (active_dialog + i, MSG_LOSTMOUSE, 0); + break; + } + + /* initialize the menu */ + active_menu_player = + init_single_menu (d->dp, NULL, d, TRUE, d->x, d->y, FALSE, d->w, + d->h); + break; + + case MSG_LOSTMOUSE: + case MSG_END: + if (active_menu_player) + { + /* shutdown_tree_menu may call nested dialogs */ + mp = active_menu_player; + active_menu_player = NULL; + shutdown_tree_menu (mp, &x); + ret |= x; + + /* put the mouse */ + i = find_mouse_object (active_dialog); + if ((i >= 0) && (&active_dialog[i] != d)) + { + active_dialog[i].flags |= D_GOTMOUSE; + object_message (active_dialog + i, MSG_GOTMOUSE, 0); + } + } + break; + } + + return ret; +} + + + +static DIALOG alert_dialog[] = { + /* (dialog proc) (x) (y) (w) (h) (fg) (bg) (key) (flags) (d1) (d2) (dp) (dp2) (dp3) */ + {_gui_shadow_box_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL}, + {_gui_ctext_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL}, + {_gui_ctext_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL}, + {_gui_ctext_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL}, + {_gui_button_proc, 0, 0, 0, 0, 0, 0, 0, D_EXIT, 0, 0, NULL, NULL, NULL}, + {_gui_button_proc, 0, 0, 0, 0, 0, 0, 0, D_EXIT, 0, 0, NULL, NULL, NULL}, + {_gui_button_proc, 0, 0, 0, 0, 0, 0, 0, D_EXIT, 0, 0, NULL, NULL, NULL}, + {d_yield_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL}, + {NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL} +}; + + +#define A_S1 1 +#define A_S2 2 +#define A_S3 3 +#define A_B1 4 +#define A_B2 5 +#define A_B3 6 + + + +/* alert3: + * Displays a simple alert box, containing three lines of text (s1-s3), + * and with either one, two, or three buttons. The text for these buttons + * is passed in b1, b2, and b3 (NULL for buttons which are not used), and + * the keyboard shortcuts in c1 and c2. Returns 1, 2, or 3 depending on + * which button was selected. + */ +int +alert3 (AL_CONST char *s1, AL_CONST char *s2, AL_CONST char *s3, + AL_CONST char *b1, AL_CONST char *b2, AL_CONST char *b3, int c1, + int c2, int c3) +{ + char tmp[16]; + int avg_w, avg_h; + int len1, len2, len3; + int maxlen = 0; + int buttons = 0; + int b[3]; + int c; + +#define SORT_OUT_BUTTON(x) { \ + if (b##x) { \ + alert_dialog[A_B##x].flags &= ~D_HIDDEN; \ + alert_dialog[A_B##x].key = c##x; \ + alert_dialog[A_B##x].dp = (char *)b##x; \ + len##x = gui_strlen(b##x); \ + b[buttons++] = A_B##x; \ + } \ + else { \ + alert_dialog[A_B##x].flags |= D_HIDDEN; \ + len##x = 0; \ + } \ + } + + usetc (tmp + usetc (tmp, ' '), 0); + + avg_w = text_length (font, tmp); + avg_h = text_height (font); + + alert_dialog[A_S1].dp = alert_dialog[A_S2].dp = alert_dialog[A_S3].dp = + alert_dialog[A_B1].dp = alert_dialog[A_B2].dp = empty_string; + + if (s1) + { + alert_dialog[A_S1].dp = (char *) s1; + maxlen = text_length (font, s1); + } + + if (s2) + { + alert_dialog[A_S2].dp = (char *) s2; + len1 = text_length (font, s2); + if (len1 > maxlen) + maxlen = len1; + } + + if (s3) + { + alert_dialog[A_S3].dp = (char *) s3; + len1 = text_length (font, s3); + if (len1 > maxlen) + maxlen = len1; + } + + SORT_OUT_BUTTON (1); + SORT_OUT_BUTTON (2); + SORT_OUT_BUTTON (3); + + len1 = MAX (len1, MAX (len2, len3)) + avg_w * 3; + if (len1 * buttons > maxlen) + maxlen = len1 * buttons; + + maxlen += avg_w * 4; + alert_dialog[0].w = maxlen; + alert_dialog[A_S1].w = alert_dialog[A_S2].w = alert_dialog[A_S3].w = + maxlen - avg_w * 2; + alert_dialog[A_S1].x = alert_dialog[A_S2].x = alert_dialog[A_S3].x = + alert_dialog[0].x + avg_w; + + alert_dialog[A_B1].w = alert_dialog[A_B2].w = alert_dialog[A_B3].w = len1; + + alert_dialog[A_B1].x = alert_dialog[A_B2].x = alert_dialog[A_B3].x = + alert_dialog[0].x + maxlen / 2 - len1 / 2; + + if (buttons == 3) + { + alert_dialog[b[0]].x = + alert_dialog[0].x + maxlen / 2 - len1 * 3 / 2 - avg_w; + alert_dialog[b[2]].x = + alert_dialog[0].x + maxlen / 2 + len1 / 2 + avg_w; + } + else if (buttons == 2) + { + alert_dialog[b[0]].x = alert_dialog[0].x + maxlen / 2 - len1 - avg_w; + alert_dialog[b[1]].x = alert_dialog[0].x + maxlen / 2 + avg_w; + } + + alert_dialog[0].h = avg_h * 8; + alert_dialog[A_S1].y = alert_dialog[0].y + avg_h; + alert_dialog[A_S2].y = alert_dialog[0].y + avg_h * 2; + alert_dialog[A_S3].y = alert_dialog[0].y + avg_h * 3; + alert_dialog[A_S1].h = alert_dialog[A_S2].h = alert_dialog[A_S3].h = avg_h; + alert_dialog[A_B1].y = alert_dialog[A_B2].y = alert_dialog[A_B3].y = + alert_dialog[0].y + avg_h * 5; + alert_dialog[A_B1].h = alert_dialog[A_B2].h = alert_dialog[A_B3].h = + avg_h * 2; + + centre_dialog (alert_dialog); + set_dialog_color (alert_dialog, gui_fg_color, gui_bg_color); + for (c = 0; alert_dialog[c].proc; c++) + if (alert_dialog[c].proc == _gui_ctext_proc) + alert_dialog[c].bg = -1; + + clear_keybuf (); + + do + { + } + while (gui_mouse_b ()); + + c = popup_dialog (alert_dialog, A_B1); + + if (c == A_B1) + return 1; + else if (c == A_B2) + return 2; + else + return 3; +} + + + +/* alert: + * Displays a simple alert box, containing three lines of text (s1-s3), + * and with either one or two buttons. The text for these buttons is passed + * in b1 and b2 (b2 may be null), and the keyboard shortcuts in c1 and c2. + * Returns 1 or 2 depending on which button was selected. + */ +int +alert (AL_CONST char *s1, AL_CONST char *s2, AL_CONST char *s3, + AL_CONST char *b1, AL_CONST char *b2, int c1, int c2) +{ + int ret; + + ret = alert3 (s1, s2, s3, b1, b2, NULL, c1, c2, 0); + + if (ret > 2) + ret = 2; + + return ret; +} diff --git a/src/backportgui.h b/src/backportgui.h new file mode 100644 index 00000000..3e08092f --- /dev/null +++ b/src/backportgui.h @@ -0,0 +1,243 @@ +/* ______ ___ ___ + * /\ _ \ /\_ \ /\_ \ + * \ \ \L\ \\//\ \ \//\ \ __ __ _ __ ___ + * \ \ __ \ \ \ \ \ \ \ /'__`\ /'_ `\/\`'__\/ __`\ + * \ \ \/\ \ \_\ \_ \_\ \_/\ __//\ \L\ \ \ \//\ \L\ \ + * \ \_\ \_\/\____\/\____\ \____\ \____ \ \_\\ \____/ + * \/_/\/_/\/____/\/____/\/____/\/___L\ \/_/ \/___/ + * /\____/ + * \_/__/ + * + * GUI routines. + * + * By Shawn Hargreaves. + * + * See readme.txt for copyright information. + */ + + +#ifndef ALLEGRO_GUI_H +#define ALLEGRO_GUI_H + +#ifdef __cplusplus +extern "C" +{ +#endif + + struct ALLEGRO_BITMAP; + struct DIALOG; + + typedef AL_METHOD (int, DIALOG_PROC, (int msg, struct DIALOG * d, int c)); + + typedef struct DIALOG + { + DIALOG_PROC proc; + int x, y, w, h; /* position and size of the object */ + int fg, bg; /* foreground and background colors */ + int key; /* keyboard shortcut (ASCII code) */ + int flags; /* flags about the object state */ + int d1, d2; /* any data the object might require */ + void *dp, *dp2, *dp3; /* pointers to more object data */ + } DIALOG; + + +/* a popup menu */ + typedef struct MENU + { + char *text; /* menu item text */ + AL_METHOD (int, proc, (void)); /* callback function */ + struct MENU *child; /* to allow nested menus */ + int flags; /* flags about the menu state */ + void *dp; /* any data the menu might require */ + } MENU; + + +/* stored information about the state of an active GUI dialog */ + typedef struct DIALOG_PLAYER + { + int obj; + int res; + int mouse_obj; + int focus_obj; + int joy_on; + int click_wait; + int mouse_ox, mouse_oy; + int mouse_oz; + int mouse_b; + DIALOG *dialog; + } DIALOG_PLAYER; + + +/* stored information about the state of an active GUI menu */ + typedef struct MENU_PLAYER + { + MENU *menu; /* the menu itself */ + int bar; /* set if it is a top level menu bar */ + int size; /* number of items in the menu */ + int sel; /* selected item */ + int x, y, w, h; /* screen position of the menu */ + int (*proc) (void); /* callback function */ + ALLEGRO_BITMAP *saved; /* saved what was underneath it */ + + int mouse_button_was_pressed; /* set if mouse button pressed on last iteration */ + int back_from_child; /* set if a child was activated on last iteration */ + int timestamp; /* timestamp for gui_timer events */ + int mouse_sel; /* item the mouse is currently over */ + int redraw; /* set if redrawing is required */ + int auto_open; /* set if menu auto-opening is activated */ + int ret; /* return value */ + + DIALOG *dialog; /* d_menu_proc() parent dialog (if any) */ + + struct MENU_PLAYER *parent; /* the parent menu, or NULL for root */ + struct MENU_PLAYER *child; /* the child menu, or NULL for none */ + } MENU_PLAYER; + + +/* bits for the flags field */ +#define D_EXIT 1 /* object makes the dialog exit */ +#define D_SELECTED 2 /* object is selected */ +#define D_GOTFOCUS 4 /* object has the input focus */ +#define D_GOTMOUSE 8 /* mouse is on top of object */ +#define D_HIDDEN 16 /* object is not visible */ +#define D_DISABLED 32 /* object is visible but inactive */ +#define D_DIRTY 64 /* object needs to be redrawn */ +#define D_INTERNAL 128 /* reserved for internal use */ +#define D_USER 256 /* from here on is free for your own use */ + + +/* return values for the dialog procedures */ +#define D_O_K 0 /* normal exit status */ +#define D_CLOSE 1 /* request to close the dialog */ +#define D_REDRAW 2 /* request to redraw the dialog */ +#define D_REDRAWME 4 /* request to redraw this object */ +#define D_WANTFOCUS 8 /* this object wants the input focus */ +#define D_USED_CHAR 16 /* object has used the keypress */ +#define D_REDRAW_ALL 32 /* request to redraw all active dialogs */ +#define D_DONTWANTMOUSE 64 /* this object does not want mouse focus */ + + +/* messages for the dialog procedures */ +#define MSG_START 1 /* start the dialog, initialise */ +#define MSG_END 2 /* dialog is finished - cleanup */ +#define MSG_DRAW 3 /* draw the object */ +#define MSG_CLICK 4 /* mouse click on the object */ +#define MSG_DCLICK 5 /* double click on the object */ +#define MSG_KEY 6 /* keyboard shortcut */ +#define MSG_CHAR 7 /* other keyboard input */ +#define MSG_UCHAR 8 /* unicode keyboard input */ +#define MSG_XCHAR 9 /* broadcast character to all objects */ +#define MSG_WANTFOCUS 10 /* does object want the input focus? */ +#define MSG_GOTFOCUS 11 /* got the input focus */ +#define MSG_LOSTFOCUS 12 /* lost the input focus */ +#define MSG_GOTMOUSE 13 /* mouse on top of object */ +#define MSG_LOSTMOUSE 14 /* mouse moved away from object */ +#define MSG_IDLE 15 /* update any background stuff */ +#define MSG_RADIO 16 /* clear radio buttons */ +#define MSG_WHEEL 17 /* mouse wheel moved */ +#define MSG_LPRESS 18 /* mouse left button pressed */ +#define MSG_LRELEASE 19 /* mouse left button released */ +#define MSG_MPRESS 20 /* mouse middle button pressed */ +#define MSG_MRELEASE 21 /* mouse middle button released */ +#define MSG_RPRESS 22 /* mouse right button pressed */ +#define MSG_RRELEASE 23 /* mouse right button released */ +#define MSG_WANTMOUSE 24 /* does object want the mouse? */ +#define MSG_USER 25 /* from here on are free... */ + + +/* some dialog procedures */ + AL_FUNC (int, d_yield_proc, (int msg, DIALOG * d, int c)); + AL_FUNC (int, d_clear_proc, (int msg, DIALOG * d, int c)); + AL_FUNC (int, d_box_proc, (int msg, DIALOG * d, int c)); + AL_FUNC (int, d_shadow_box_proc, (int msg, DIALOG * d, int c)); + AL_FUNC (int, d_bitmap_proc, (int msg, DIALOG * d, int c)); + AL_FUNC (int, d_text_proc, (int msg, DIALOG * d, int c)); + AL_FUNC (int, d_ctext_proc, (int msg, DIALOG * d, int c)); + AL_FUNC (int, d_rtext_proc, (int msg, DIALOG * d, int c)); + AL_FUNC (int, d_button_proc, (int msg, DIALOG * d, int c)); + AL_FUNC (int, d_check_proc, (int msg, DIALOG * d, int c)); + AL_FUNC (int, d_radio_proc, (int msg, DIALOG * d, int c)); + AL_FUNC (int, d_icon_proc, (int msg, DIALOG * d, int c)); + AL_FUNC (int, d_keyboard_proc, (int msg, DIALOG * d, int c)); + AL_FUNC (int, d_edit_proc, (int msg, DIALOG * d, int c)); + AL_FUNC (int, d_list_proc, (int msg, DIALOG * d, int c)); + AL_FUNC (int, d_text_list_proc, (int msg, DIALOG * d, int c)); + AL_FUNC (int, d_textbox_proc, (int msg, DIALOG * d, int c)); + AL_FUNC (int, d_slider_proc, (int msg, DIALOG * d, int c)); + AL_FUNC (int, d_menu_proc, (int msg, DIALOG * d, int c)); + + AL_VAR (DIALOG_PROC, gui_shadow_box_proc); + AL_VAR (DIALOG_PROC, gui_ctext_proc); + AL_VAR (DIALOG_PROC, gui_button_proc); + AL_VAR (DIALOG_PROC, gui_edit_proc); + AL_VAR (DIALOG_PROC, gui_list_proc); + AL_VAR (DIALOG_PROC, gui_text_list_proc); + + AL_FUNCPTR (void, gui_menu_draw_menu, (int x, int y, int w, int h)); + AL_FUNCPTR (void, gui_menu_draw_menu_item, + (MENU * m, int x, int y, int w, int h, int bar, int sel)); + + AL_VAR (DIALOG *, active_dialog); + AL_VAR (MENU *, active_menu); + + AL_VAR (int, gui_mouse_focus); + + AL_VAR (int, gui_fg_color); + AL_VAR (int, gui_mg_color); + AL_VAR (int, gui_bg_color); + + AL_VAR (int, gui_font_baseline); + + AL_FUNCPTR (int, gui_mouse_x, (void)); + AL_FUNCPTR (int, gui_mouse_y, (void)); + AL_FUNCPTR (int, gui_mouse_z, (void)); + AL_FUNCPTR (int, gui_mouse_b, (void)); + + AL_FUNC (void, gui_set_screen, (ALLEGRO_BITMAP * bmp)); + AL_FUNC (ALLEGRO_BITMAP *, gui_get_screen, (void)); + AL_FUNC (int, gui_textout_ex, + (struct ALLEGRO_BITMAP * bmp, AL_CONST char *s, int x, int y, + int color, int bg, int centre)); + AL_FUNC (int, gui_strlen, (AL_CONST char *s)); + AL_FUNC (void, position_dialog, (DIALOG * dialog, int x, int y)); + AL_FUNC (void, centre_dialog, (DIALOG * dialog)); + AL_FUNC (void, set_dialog_color, (DIALOG * dialog, int fg, int bg)); + AL_FUNC (int, find_dialog_focus, (DIALOG * dialog)); + AL_FUNC (int, offer_focus, + (DIALOG * dialog, int obj, int *focus_obj, int force)); + AL_FUNC (int, object_message, (DIALOG * dialog, int msg, int c)); + AL_FUNC (int, dialog_message, + (DIALOG * dialog, int msg, int c, int *obj)); + AL_FUNC (int, broadcast_dialog_message, (int msg, int c)); + AL_FUNC (int, do_dialog, (DIALOG * dialog, int focus_obj)); + AL_FUNC (int, popup_dialog, (DIALOG * dialog, int focus_obj)); + AL_FUNC (DIALOG_PLAYER *, init_dialog, (DIALOG * dialog, int focus_obj)); + AL_FUNC (int, update_dialog, (DIALOG_PLAYER * player)); + AL_FUNC (int, shutdown_dialog, (DIALOG_PLAYER * player)); + AL_FUNC (int, do_menu, (MENU * menu, int x, int y)); + AL_FUNC (MENU_PLAYER *, init_menu, (MENU * menu, int x, int y)); + AL_FUNC (int, update_menu, (MENU_PLAYER * player)); + AL_FUNC (int, shutdown_menu, (MENU_PLAYER * player)); + AL_FUNC (int, alert, + (AL_CONST char *s1, AL_CONST char *s2, AL_CONST char *s3, + AL_CONST char *b1, AL_CONST char *b2, int c1, int c2)); + AL_FUNC (int, alert3, + (AL_CONST char *s1, AL_CONST char *s2, AL_CONST char *s3, + AL_CONST char *b1, AL_CONST char *b2, AL_CONST char *b3, int c1, + int c2, int c3)); + AL_FUNC (int, file_select_ex, + (AL_CONST char *message, char *path, AL_CONST char *ext, + int size, int w, int h)); + + AL_FUNC (int, gfx_mode_select, (int *card, int *w, int *h)); + AL_FUNC (int, gfx_mode_select_ex, + (int *card, int *w, int *h, int *color_depth)); + AL_FUNC (int, gfx_mode_select_filter, + (int *card, int *w, int *h, int *color_depth, + int (*filter) (int, int, int, int))); + +#ifdef __cplusplus +} +#endif + +#endif /* ifndef ALLEGRO_GUI_H */ diff --git a/src/backportguiproc.c b/src/backportguiproc.c new file mode 100644 index 00000000..cff34a73 --- /dev/null +++ b/src/backportguiproc.c @@ -0,0 +1,2111 @@ +/* ______ ___ ___ + * /\ _ \ /\_ \ /\_ \ + * \ \ \L\ \\//\ \ \//\ \ __ __ _ __ ___ + * \ \ __ \ \ \ \ \ \ \ /'__`\ /'_ `\/\`'__\/ __`\ + * \ \ \/\ \ \_\ \_ \_\ \_/\ __//\ \L\ \ \ \//\ \L\ \ + * \ \_\ \_\/\____\/\____\ \____\ \____ \ \_\\ \____/ + * \/_/\/_/\/____/\/____/\/____/\/___L\ \/_/ \/___/ + * /\____/ + * \_/__/ + * + * The standard GUI dialog object procedures. + * + * By Shawn Hargreaves. + * + * Radio button, icon, and slider objects by Chris La Mantia. + * + * Scrolling d_edit_proc by VolkerOth. + * + * Text box object by Doug Eleveld. + * + * d_text_list_proc by Andy Goth. + * + * See readme.txt for copyright information. + */ + + +#include "backport.h" +#include "backportgui.h" +#include "backportguiproc.h" +#include "macro.h" + + +#ifdef ALLEGRO_WINDOWS +/* exported address of d_clear_proc */ +int (*_d_clear_proc) (int, DIALOG *, int) = NULL; +#endif + +/* typedef for the listbox callback functions */ +typedef char *(*getfuncptr) (int, int *); + +static int _dummy_c = 0; + +/* gui_textout_ex: + * Wrapper function for drawing text to the screen, which interprets the + * & character as an underbar for displaying keyboard shortcuts. Returns + * the width of the output string in pixels. + */ +int +gui_textout_ex (ALLEGRO_BITMAP * bmp, AL_CONST char *s, int x, int y, + int color, int bg, int centre) +{ + char tmp[1024]; + int hline_pos = -1; + int len = 0; + int in_pos = 0; + int out_pos = 0; + int pix_len, c; + ALLEGRO_ASSERT (s); + + while (((c = ugetc (s + in_pos)) != 0) + && (out_pos < (int) (sizeof (tmp) - ucwidth (0)))) + { + if (c == '&') + { + in_pos += uwidth (s + in_pos); + c = ugetc (s + in_pos); + if (c == '&') + { + out_pos += usetc (tmp + out_pos, '&'); + in_pos += uwidth (s + in_pos); + len++; + } + else + hline_pos = len; + } + else + { + out_pos += usetc (tmp + out_pos, c); + in_pos += uwidth (s + in_pos); + len++; + } + } + + usetc (tmp + out_pos, 0); + pix_len = text_length (font, tmp); + + if (centre) + x -= pix_len / 2; + + if (bmp) + { + textout_ex (bmp, font, tmp, x, y, color, bg); + + if (hline_pos >= 0) + { + c = ugetat (tmp, hline_pos); + usetat (tmp, hline_pos, 0, sizeof (tmp)); + hline_pos = text_length (font, tmp); + c = usetc (tmp, c); + usetc (tmp + c, 0); + c = text_length (font, tmp); + hline (bmp, x + hline_pos, + y + text_height (font) - gui_font_baseline, + x + hline_pos + c - 1, color); + } + } + + return pix_len; +} + + + +/* gui_strlen: + * Returns the length of a string in pixels, ignoring '&' characters. + */ +int +gui_strlen (AL_CONST char *s) +{ + ALLEGRO_ASSERT (s); + return gui_textout_ex (NULL, s, 0, 0, 0, 0, 0); +} + + + +/* dotted_rect: + * Draws a dotted rectangle, for showing an object has the input focus. + */ +static void +dotted_rect (int x1, int y1, int x2, int y2, int fg, int bg) +{ + ALLEGRO_BITMAP *gui_bmp = gui_get_screen (); + int x = ((x1 + y1) & 1) ? 1 : 0; + int c; + + /* two loops to avoid bank switches */ + for (c = x1; c <= x2; c++) + putpixel (gui_bmp, c, y1, (((c + y1) & 1) == x) ? fg : bg); + for (c = x1; c <= x2; c++) + putpixel (gui_bmp, c, y2, (((c + y2) & 1) == x) ? fg : bg); + + for (c = y1 + 1; c < y2; c++) + { + putpixel (gui_bmp, x1, c, (((c + x1) & 1) == x) ? fg : bg); + putpixel (gui_bmp, x2, c, (((c + x2) & 1) == x) ? fg : bg); + } +} + + + +/* d_yield_proc: + * Simple dialog procedure which just yields the timeslice when the dialog + * is idle. + */ +int +d_yield_proc (int msg, DIALOG * d, int c) +{ + if (d == NULL || msg == MSG_IDLE) + rest (1); + + _dummy_c = c; + + return D_O_K; +} + + + +/* d_clear_proc: + * Simple dialog procedure which just clears the screen. Useful as the + * first object in a dialog. + */ +int +d_clear_proc (int msg, DIALOG * d, int c) +{ + ALLEGRO_ASSERT (d); + + _dummy_c = c; + +#ifdef ALLEGRO_WINDOWS + /* kludge to get the exported address of d_clear_proc */ + if (!_d_clear_proc) + _d_clear_proc = d->proc; +#endif + + if (msg == MSG_DRAW) + { + ALLEGRO_BITMAP *gui_bmp = gui_get_screen (); + int w, h; + + /* Get width and height of target bitmap. We can't use SCREEN_W and + * SCREEN_H because the target might not be the screen, but we cannot use + * bmp->w and bmp->h either because if it is the screen these are actually + * wrong. Ugh! + */ + w = (gui_bmp == screen) ? SCREEN_W : al_get_bitmap_width (gui_bmp); + h = (gui_bmp == screen) ? SCREEN_H : al_get_bitmap_height (gui_bmp); + + set_clip_rect (gui_bmp, 0, 0, w - 1, h - 1); + clear_to_color (gui_bmp, d->bg); + } + + _dummy_c = c; + + return D_O_K; +} + + + +/* d_box_proc: + * Simple dialog procedure: just draws a box. + */ +int +d_box_proc (int msg, DIALOG * d, int c) +{ + ALLEGRO_ASSERT (d); + if (msg == MSG_DRAW) + { + int fg = (d->flags & D_DISABLED) ? gui_mg_color : d->fg; + ALLEGRO_BITMAP *gui_bmp = gui_get_screen (); + + rectfill (gui_bmp, d->x + 1, d->y + 1, d->x + d->w - 2, d->y + d->h - 2, + d->bg); + rect (gui_bmp, d->x, d->y, d->x + d->w - 1, d->y + d->h - 1, fg); + } + + _dummy_c = c; + + return D_O_K; +} + + + +/* d_shadow_box_proc: + * Simple dialog procedure: draws a box with a shadow. + */ +int +d_shadow_box_proc (int msg, DIALOG * d, int c) +{ + ALLEGRO_ASSERT (d); + if (msg == MSG_DRAW) + { + int fg = (d->flags & D_DISABLED) ? gui_mg_color : d->fg; + int black = 0; // [FIXME:ufoot] sounds a bit hardcoded, double-check this + ALLEGRO_BITMAP *gui_bmp = gui_get_screen (); + + rectfill (gui_bmp, d->x + 1, d->y + 1, d->x + d->w - 3, d->y + d->h - 3, + d->bg); + rect (gui_bmp, d->x, d->y, d->x + d->w - 2, d->y + d->h - 2, fg); + vline (gui_bmp, d->x + d->w - 1, d->y + 1, d->y + d->h - 1, black); + hline (gui_bmp, d->x + 1, d->y + d->h - 1, d->x + d->w - 1, black); + } + + _dummy_c = c; + + return D_O_K; +} + + + +/* d_bitmap_proc: + * Simple dialog procedure: draws the bitmap which is pointed to by dp. + */ +int +d_bitmap_proc (int msg, DIALOG * d, int c) +{ + ALLEGRO_BITMAP *b; + ALLEGRO_ASSERT (d); + + b = (ALLEGRO_BITMAP *) d->dp; + if (msg == MSG_DRAW) + blit (b, gui_get_screen (), 0, 0, d->x, d->y, d->w, d->h); + + _dummy_c = c; + + return D_O_K; +} + + + +/* d_text_proc: + * Simple dialog procedure: draws the text string which is pointed to by dp. + */ +int +d_text_proc (int msg, DIALOG * d, int c) +{ + ALLEGRO_ASSERT (d); + if (msg == MSG_DRAW) + { + int fg = (d->flags & D_DISABLED) ? gui_mg_color : d->fg; + ALLEGRO_FONT *oldfont = font; + + if (d->dp2) + font = d->dp2; + + gui_textout_ex (gui_get_screen (), d->dp, d->x, d->y, fg, d->bg, FALSE); + + font = oldfont; + } + + _dummy_c = c; + + return D_O_K; +} + + + +/* d_ctext_proc: + * Simple dialog procedure: draws the text string which is pointed to by dp, + * centering it around the object's x coordinate. + */ +int +d_ctext_proc (int msg, DIALOG * d, int c) +{ + ALLEGRO_ASSERT (d); + if (msg == MSG_DRAW) + { + int fg = (d->flags & D_DISABLED) ? gui_mg_color : d->fg; + ALLEGRO_FONT *oldfont = font; + + if (d->dp2) + font = d->dp2; + + gui_textout_ex (gui_get_screen (), d->dp, d->x + d->w / 2, d->y, fg, + d->bg, TRUE); + + font = oldfont; + } + + _dummy_c = c; + + return D_O_K; +} + + + +/* d_rtext_proc: + * Simple dialog procedure: draws the text string which is pointed to by dp, + * right aligning it. + */ +int +d_rtext_proc (int msg, DIALOG * d, int c) +{ + ALLEGRO_ASSERT (d); + if (msg == MSG_DRAW) + { + int fg = (d->flags & D_DISABLED) ? gui_mg_color : d->fg; + ALLEGRO_FONT *oldfont = font; + + if (d->dp2) + font = d->dp2; + + gui_textout_ex (gui_get_screen (), d->dp, + d->x + d->w - gui_strlen (d->dp), d->y, fg, d->bg, + FALSE); + + font = oldfont; + } + + _dummy_c = c; + + return D_O_K; +} + + + +/* d_button_proc: + * A button object (the dp field points to the text string). This object + * can be selected by clicking on it with the mouse or by pressing its + * keyboard shortcut. If the D_EXIT flag is set, selecting it will close + * the dialog, otherwise it will toggle on and off. + */ +int +d_button_proc (int msg, DIALOG * d, int c) +{ + ALLEGRO_BITMAP *gui_bmp; + int state1, state2; + int black; + int swap; + int g; + ALLEGRO_ASSERT (d); + + gui_bmp = gui_get_screen (); + + switch (msg) + { + + case MSG_DRAW: + if (d->flags & D_SELECTED) + { + g = 1; + state1 = d->bg; + state2 = (d->flags & D_DISABLED) ? gui_mg_color : d->fg; + } + else + { + g = 0; + state1 = (d->flags & D_DISABLED) ? gui_mg_color : d->fg; + state2 = d->bg; + } + + rectfill (gui_bmp, d->x + 1 + g, d->y + 1 + g, d->x + d->w - 3 + g, + d->y + d->h - 3 + g, state2); + rect (gui_bmp, d->x + g, d->y + g, d->x + d->w - 2 + g, + d->y + d->h - 2 + g, state1); + gui_textout_ex (gui_bmp, d->dp, d->x + d->w / 2 + g, + d->y + d->h / 2 - text_height (font) / 2 + g, state1, + -1, TRUE); + + if (d->flags & D_SELECTED) + { + vline (gui_bmp, d->x, d->y, d->y + d->h - 2, d->bg); + hline (gui_bmp, d->x, d->y, d->x + d->w - 2, d->bg); + } + else + { + black = 0; // [FIXME:ufoot] sounds a bit hardcoded, double-check this + vline (gui_bmp, d->x + d->w - 1, d->y + 1, d->y + d->h - 2, black); + hline (gui_bmp, d->x + 1, d->y + d->h - 1, d->x + d->w - 1, black); + } + if ((d->flags & D_GOTFOCUS) && + (!(d->flags & D_SELECTED) || !(d->flags & D_EXIT))) + dotted_rect (d->x + 1 + g, d->y + 1 + g, d->x + d->w - 3 + g, + d->y + d->h - 3 + g, state1, state2); + break; + + case MSG_WANTFOCUS: + return D_WANTFOCUS; + + case MSG_KEY: + /* close dialog? */ + if (d->flags & D_EXIT) + { + return D_CLOSE; + } + + /* or just toggle */ + d->flags ^= D_SELECTED; + object_message (d, MSG_DRAW, 0); + break; + + case MSG_CLICK: + /* what state was the button originally in? */ + state1 = d->flags & D_SELECTED; + if (d->flags & D_EXIT) + swap = FALSE; + else + swap = state1; + + /* track the mouse until it is released */ + while (gui_mouse_b ()) + { + state2 = ((gui_mouse_x () >= d->x) && (gui_mouse_y () >= d->y) && + (gui_mouse_x () < d->x + d->w) + && (gui_mouse_y () < d->y + d->h)); + if (swap) + state2 = !state2; + + /* redraw? */ + if (((state1) && (!state2)) || ((state2) && (!state1))) + { + d->flags ^= D_SELECTED; + state1 = d->flags & D_SELECTED; + object_message (d, MSG_DRAW, 0); + } + + /* let other objects continue to animate */ + broadcast_dialog_message (MSG_IDLE, 0); + } + + /* should we close the dialog? */ + if ((d->flags & D_SELECTED) && (d->flags & D_EXIT)) + { + d->flags ^= D_SELECTED; + return D_CLOSE; + } + break; + } + + _dummy_c = c; + + return D_O_K; +} + + + +/* d_check_proc: + * Who needs C++ after all? This is derived from d_button_proc, + * but overrides the drawing routine to provide a check box. + */ +int +d_check_proc (int msg, DIALOG * d, int c) +{ + ALLEGRO_BITMAP *gui_bmp = gui_get_screen (); + int x, y, h; + int fg, bg; + ALLEGRO_ASSERT (d); + + if (msg == MSG_DRAW) + { + fg = (d->flags & D_DISABLED) ? gui_mg_color : d->fg; + bg = (d->bg < 0) ? gui_bg_color : d->bg; + + h = text_height (font); + + rectfill (gui_bmp, d->x, d->y, d->x + d->w - 1, d->y + d->h - 1, bg); + if (d->flags & D_GOTFOCUS) + dotted_rect (d->x, d->y, d->x + d->w - 1, d->y + d->h - 1, fg, bg); + + y = d->y + ((d->h - (h - gui_font_baseline)) / 2); + x = + d->x + + ((d->d1) ? 0 : gui_textout_ex (gui_bmp, d->dp, d->x, y, fg, -1, + FALSE) + h / 2); + + rect (gui_bmp, x, y, x + h - 1, y + h - 1, fg); + if (d->d1) + gui_textout_ex (gui_bmp, d->dp, x + h + h / 2, y, fg, -1, FALSE); + if (d->flags & D_SELECTED) + { + line (gui_bmp, x, y, x + h - 1, y + h - 1, fg); + line (gui_bmp, x, y + h - 1, x + h - 1, y, fg); + } + + return D_O_K; + } + + _dummy_c = c; + + return d_button_proc (msg, d, 0); +} + + +/* d_icon_proc: + * Allows graphic icons to be used as buttons. + * + * Parameters: + * fg = color dotted line showing focus will be drawn in + * bg = shadow color used to fill in top and left sides of + * button when "pressed" + * d1 = "push depth": number of pixels icon will be shifted + * to right and down when selected (default=2) if there is + * no "selected" image + * d2 = distance dotted line showing focus is indented (default=2) + * dp = pointer to a bitmap for the icon + * dp2 = pointer to a "selected" bitmap for the icon (OPTIONAL) + * dp3 = pointer to a "disabled" bitmap for the icon (OPTIONAL) + */ +int +d_icon_proc (int msg, DIALOG * d, int c) +{ + ALLEGRO_BITMAP *butimage; + ALLEGRO_BITMAP *gui_bmp; + int butx; + int buty; + int index; + int indent; + int depth; + ALLEGRO_ASSERT (d); + + butimage = (ALLEGRO_BITMAP *) d->dp; + gui_bmp = gui_get_screen (); + if ((msg == MSG_DRAW) && (!(d->flags & D_HIDDEN))) + { + depth = 0; + if ((d->dp2 == NULL) && (d->flags & D_SELECTED)) + { + depth = d->d1; + if (depth < 1) + depth = 2; + } + if ((d->dp2 != NULL) && (d->flags & D_SELECTED)) + { + butimage = (ALLEGRO_BITMAP *) d->dp2; + } + if ((d->dp3 != NULL) && (d->flags & D_DISABLED)) + { + butimage = (ALLEGRO_BITMAP *) d->dp3; + } + indent = d->d2; + if (indent == 0) + indent = 2; + + /* put the graphic on screen, scaled as needed */ + butx = al_get_bitmap_width (butimage); + buty = al_get_bitmap_height (butimage); + stretch_blit (butimage, gui_bmp, 0, 0, butx - depth, buty - depth, + d->x + depth, d->y + depth, d->w - depth, d->h - depth); + + if ((d->flags & D_GOTFOCUS) && + (!(d->flags & D_SELECTED) || !(d->flags & D_EXIT))) + { + /* draw focus lines */ + for (index = indent; index < d->w - (indent + 1); index += 2) + { + putpixel (gui_bmp, d->x + index + depth, d->y + indent + depth, + d->fg); + putpixel (gui_bmp, d->x + index + depth, + d->y + d->h - (indent + 1) + depth, d->fg); + } + for (index = indent; index < d->h - (indent + 1); index += 2) + { + putpixel (gui_bmp, d->x + indent + depth, d->y + index + depth, + d->fg); + putpixel (gui_bmp, d->x + d->w - (indent + 1) + depth, + d->y + index + depth, d->fg); + } + } + + /* draw shadowing */ + for (index = 0; index < depth; index++) + { + hline (gui_bmp, d->x, d->y + index, d->x + d->w - 1, d->bg); + vline (gui_bmp, d->x + index, d->y, d->y + d->h - 1, d->bg); + } + + return D_O_K; + } + + return d_button_proc (msg, d, c); +} + + + +/* d_keyboard_proc: + * Invisible object for implementing keyboard shortcuts. When its key + * is pressed, it calls the function pointed to by dp. This should return + * an integer, which will be passed back to the dialog manager. The key + * can be specified by putting an ASCII code in the key field or by + * putting scancodes in d1 and d2. + */ +int +d_keyboard_proc (int msg, DIALOG * d, int c) +{ + int (*proc) (void); + int ret = D_O_K; + ALLEGRO_ASSERT (d); + + switch (msg) + { + + case MSG_START: + d->w = d->h = 0; + break; + + case MSG_XCHAR: + if (((c >> 8) != d->d1) && ((c >> 8) != d->d2)) + break; + + ret |= D_USED_CHAR; + /* fall through */ + + case MSG_KEY: + proc = d->dp; + ret |= (*proc) (); + break; + } + + return ret; +} + + + +/* d_edit_proc: + * An editable text object (the dp field points to the string). When it + * has the input focus (obtained by clicking on it with the mouse), text + * can be typed into this object. The d1 field specifies the maximum + * number of characters that it will accept, and d2 is the text cursor + * position within the string. + */ +int +d_edit_proc (int msg, DIALOG * d, int c) +{ + static int ignore_next_uchar = FALSE; + ALLEGRO_BITMAP *gui_bmp; + int f, l, p, w, x, fg, b, scroll; + char buf[16]; + char *s; + ALLEGRO_ASSERT (d); + + gui_bmp = gui_get_screen (); + + s = d->dp; + l = ustrlen (s); + if (d->d2 > l) + d->d2 = l; + + /* calculate maximal number of displayable characters */ + if (d->d2 == l) + { + usetc (buf + usetc (buf, ' '), 0); + x = text_length (font, buf); + } + else + x = 0; + + b = 0; + + for (p = d->d2; p >= 0; p--) + { + usetc (buf + usetc (buf, ugetat (s, p)), 0); + x += text_length (font, buf); + b++; + if (x > d->w) + break; + } + + if (x <= d->w) + { + b = l; + scroll = FALSE; + } + else + { + b--; + scroll = TRUE; + } + + switch (msg) + { + + case MSG_START: + d->d2 = l; + break; + + case MSG_DRAW: + fg = (d->flags & D_DISABLED) ? gui_mg_color : d->fg; + x = 0; + + if (scroll) + { + p = d->d2 - b + 1; + b = d->d2; + } + else + p = 0; + + for (; p <= b; p++) + { + f = ugetat (s, p); + usetc (buf + usetc (buf, (f) ? f : ' '), 0); + w = text_length (font, buf); + if (x + w > d->w) + break; + f = ((p == d->d2) && (d->flags & D_GOTFOCUS)); + textout_ex (gui_bmp, font, buf, d->x + x, d->y, (f) ? d->bg : fg, + (f) ? fg : d->bg); + x += w; + } + if (x < d->w) + rectfill (gui_bmp, d->x + x, d->y, d->x + d->w - 1, + d->y + text_height (font) - 1, d->bg); + break; + + case MSG_CLICK: + x = d->x; + + if (scroll) + { + p = d->d2 - b + 1; + b = d->d2; + } + else + p = 0; + + for (; p < b; p++) + { + usetc (buf + usetc (buf, ugetat (s, p)), 0); + x += text_length (font, buf); + if (x > gui_mouse_x ()) + break; + } + d->d2 = CLAMP (0, p, l); + object_message (d, MSG_DRAW, 0); + break; + + case MSG_WANTFOCUS: + case MSG_LOSTFOCUS: + case MSG_KEY: + return D_WANTFOCUS; + + case MSG_CHAR: + ignore_next_uchar = FALSE; + + if ((c >> 8) == ALLEGRO_KEY_LEFT) + { + if (d->d2 > 0) + { + d->d2--; + } + } + else if ((c >> 8) == ALLEGRO_KEY_RIGHT) + { + if (d->d2 < l) + { + d->d2++; + } + } + else if ((c >> 8) == ALLEGRO_KEY_HOME) + { + d->d2 = 0; + } + else if ((c >> 8) == ALLEGRO_KEY_END) + { + d->d2 = l; + } + else if ((c >> 8) == ALLEGRO_KEY_DELETE) + { + if (d->d2 < l) + uremove (s, d->d2); + } + else if ((c >> 8) == ALLEGRO_KEY_BACKSPACE) + { + if (d->d2 > 0) + { + d->d2--; + uremove (s, d->d2); + } + } + else if ((c >> 8) == ALLEGRO_KEY_ENTER) + { + if (d->flags & D_EXIT) + { + object_message (d, MSG_DRAW, 0); + return D_CLOSE; + } + else + return D_O_K; + } + else if ((c >> 8) == ALLEGRO_KEY_TAB) + { + ignore_next_uchar = TRUE; + return D_O_K; + } + else + { + /* don't process regular keys here: MSG_UCHAR will do that */ + break; + } + object_message (d, MSG_DRAW, 0); + return D_USED_CHAR; + + case MSG_UCHAR: + if ((c >= ' ') && (uisok (c)) && (!ignore_next_uchar)) + { + if (l < d->d1) + { + uinsert (s, d->d2, c, d->d1 + 1); + d->d2++; + + object_message (d, MSG_DRAW, 0); + } + return D_USED_CHAR; + } + break; + } + + return D_O_K; +} + + + +/* _handle_scrollable_click: + * Helper to process a click on a scrollable object. + */ +void +_handle_scrollable_scroll_click (DIALOG * d, int listsize, int *offset, + int height) +{ + int xx, yy; + int hh = d->h - 5; + + while (gui_mouse_b ()) + { + int i = (hh * height + listsize / 2) / listsize; + int len = (hh * (*offset) + listsize / 2) / listsize + 2; + + if ((gui_mouse_y () >= d->y + len) + && (gui_mouse_y () <= d->y + len + i)) + { + xx = gui_mouse_y () - len + 2; + while (gui_mouse_b ()) + { + yy = (listsize * (gui_mouse_y () - xx) + hh / 2) / hh; + if (yy > listsize - height) + yy = listsize - height; + + if (yy < 0) + yy = 0; + + if (yy != *offset) + { + *offset = yy; + object_message (d, MSG_DRAW, 0); + } + + /* let other objects continue to animate */ + broadcast_dialog_message (MSG_IDLE, 0); + } + } + else + { + if (gui_mouse_y () <= d->y + len) + yy = *offset - height; + else + yy = *offset + height; + + if (yy > listsize - height) + yy = listsize - height; + + if (yy < 0) + yy = 0; + + if (yy != *offset) + { + *offset = yy; + object_message (d, MSG_DRAW, 0); + } + } + + /* let other objects continue to animate */ + broadcast_dialog_message (MSG_IDLE, 0); + } +} + + + +/* _handle_scrollable_scroll: + * Helper function to scroll through a scrollable object. + */ +void +_handle_scrollable_scroll (DIALOG * d, int listsize, int *index, int *offset) +{ + int height = (d->h - 4) / text_height (font); + + if (listsize <= 0) + { + *index = *offset = 0; + return; + } + + /* check selected item */ + if (*index < 0) + *index = 0; + else if (*index >= listsize) + *index = listsize - 1; + + /* check scroll position */ + while ((*offset > 0) && (*offset + height > listsize)) + (*offset)--; + + if (*offset >= *index) + { + if (*index < 0) + *offset = 0; + else + *offset = *index; + } + else + { + while ((*offset + height - 1) < *index) + (*offset)++; + } +} + + + +/* idle_cb: + * rest_callback() routine to keep dialogs animating nice and smoothly. + */ +static void +idle_cb (void) +{ + broadcast_dialog_message (MSG_IDLE, 0); +} + + + +/* _handle_listbox_click: + * Helper to process a click on a listbox, doing hit-testing and moving + * the selection. + */ +void +_handle_listbox_click (DIALOG * d) +{ + char *sel = d->dp2; + int listsize, height; + int i; + + (*(getfuncptr) d->dp) (-1, &listsize); + if (!listsize) + return; + + height = (d->h - 4) / text_height (font); + + i = CLAMP (0, ((gui_mouse_y () - d->y - 2) / text_height (font)), + ((d->h - 4) / text_height (font) - 1)); + i += d->d2; + if (i < d->d2) + i = d->d2; + else + { + if (i > d->d2 + height - 1) + i = d->d2 + height - 1; + if (i >= listsize) + i = listsize - 1; + } + + if (gui_mouse_y () <= d->y) + i = MAX (i - 1, 0); + else if (gui_mouse_y () >= d->y + d->h - 1) + i = MIN (i + 1, listsize - 1); + + if (i != d->d1) + { + if (sel) + { + sel[i] = TRUE; + } + + d->d1 = i; + i = d->d2; + _handle_scrollable_scroll (d, listsize, &d->d1, &d->d2); + + d->flags |= D_DIRTY; + + if (i != d->d2) + rest_callback (CLAMP (10, text_height (font) * 16 - d->h - 1, 100), + idle_cb); + } + else + { + if (!(d->flags & D_INTERNAL)) + { + if (sel) + { + sel[i] = TRUE; + + d->flags |= D_DIRTY; + } + } + } +} + + + +/* _draw_scrollable_frame: + * Helper function to draw a frame for all objects with vertical scrollbars. + */ +void +_draw_scrollable_frame (DIALOG * d, int listsize, int offset, int height, + int fg_color, int bg) +{ + ALLEGRO_BITMAP *gui_bmp = gui_get_screen (); + int i, len; + int xx, yy; + + /* draw frame */ + rect (gui_bmp, d->x, d->y, d->x + d->w - 1, d->y + d->h - 1, fg_color); + + /* possibly draw scrollbar */ + if (listsize > height) + { + vline (gui_bmp, d->x + d->w - 13, d->y + 1, d->y + d->h - 2, fg_color); + + /* scrollbar with focus */ + if (d->flags & D_GOTFOCUS) + { + dotted_rect (d->x + 1, d->y + 1, d->x + d->w - 14, d->y + d->h - 2, + fg_color, bg); + dotted_rect (d->x + d->w - 12, d->y + 1, d->x + d->w - 2, + d->y + d->h - 2, fg_color, bg); + } + else + { + rect (gui_bmp, d->x + 1, d->y + 1, d->x + d->w - 14, + d->y + d->h - 2, bg); + rect (gui_bmp, d->x + d->w - 12, d->y + 1, d->x + d->w - 2, + d->y + d->h - 2, bg); + } + + /* create and draw the scrollbar */ + i = ((d->h - 5) * height + listsize / 2) / listsize; + xx = d->x + d->w - 11; + yy = d->y + 2; + + if (offset > 0) + { + len = (((d->h - 5) * offset) + listsize / 2) / listsize; + rectfill (gui_bmp, xx, yy, xx + 8, yy + len, bg); + yy += len; + } + if (yy + i < d->y + d->h - 3) + { + rectfill_dotted (gui_bmp, xx, yy, xx + 8, yy + i, fg_color, bg); + yy += i + 1; + rectfill (gui_bmp, xx, yy, xx + 8, d->y + d->h - 3, bg); + } + else + { + rectfill_dotted (gui_bmp, xx, yy, xx + 8, d->y + d->h - 3, fg_color, + bg); + } + } + else + { + /* no scrollbar necessary */ + if (d->flags & D_GOTFOCUS) + dotted_rect (d->x + 1, d->y + 1, d->x + d->w - 2, d->y + d->h - 2, + fg_color, bg); + else + rect (gui_bmp, d->x + 1, d->y + 1, d->x + d->w - 2, d->y + d->h - 2, + bg); + } +} + + + +/* draw_listbox: + * Helper function to draw a listbox object. + */ +void +_draw_listbox (DIALOG * d) +{ + ALLEGRO_BITMAP *gui_bmp = gui_get_screen (); + int height, listsize, i, len, bar, x, y, w; + int fg_color, fg, bg; + char *sel = d->dp2; + char s[1024]; + + (*(getfuncptr) d->dp) (-1, &listsize); + height = (d->h - 4) / text_height (font); + bar = (listsize > height); + w = (bar ? d->w - 15 : d->w - 3); + fg_color = (d->flags & D_DISABLED) ? gui_mg_color : d->fg; + + /* draw box contents */ + for (i = 0; i < height; i++) + { + if (d->d2 + i < listsize) + { + if (sel) + { + if ((sel[d->d2 + i]) && (d->d2 + i == d->d1)) + { + fg = d->bg; + bg = fg_color; + } + else if (sel[d->d2 + i]) + { + fg = d->bg; + bg = gui_mg_color; + } + else + { + fg = fg_color; + bg = d->bg; + } + } + else if (d->d2 + i == d->d1) + { + fg = d->bg; + bg = fg_color; + } + else + { + fg = fg_color; + bg = d->bg; + } + LW_MACRO_STRNCPY (s, (*(getfuncptr) d->dp) (i + d->d2, NULL), + sizeof (s)); + x = d->x + 2; + y = d->y + 2 + i * text_height (font); + rectfill (gui_bmp, x, y, x + 7, y + text_height (font) - 1, bg); + x += 8; + len = ustrlen (s); + while (text_length (font, s) >= MAX (d->w - 1 - (bar ? 22 : 10), 1)) + { + len--; + usetat (s, len, 0, sizeof (s)); + } + textout_ex (gui_bmp, font, s, x, y, fg, bg); + x += text_length (font, s); + if (x <= d->x + w) + rectfill (gui_bmp, x, y, d->x + w, y + text_height (font) - 1, + bg); + if (d->d2 + i == d->d1) + dotted_rect (d->x + 2, y, d->x + d->w - (bar ? 15 : 3), + y + text_height (font) - 1, d->fg, d->bg); + } + else + { + rectfill (gui_bmp, d->x + 2, d->y + 2 + i * text_height (font), + d->x + w, d->y + 1 + (i + 1) * text_height (font), d->bg); + } + } + + if (d->y + 2 + i * text_height (font) <= d->y + d->h - 3) + rectfill (gui_bmp, d->x + 2, d->y + 2 + i * text_height (font), + d->x + w, d->y + d->h - 3, d->bg); + + /* draw frame, maybe with scrollbar */ + _draw_scrollable_frame (d, listsize, d->d2, height, fg_color, d->bg); +} + + + +/* d_list_proc: + * A list box object. The dp field points to a function which it will call + * to obtain information about the list. This should follow the form: + * const char * (int index, int *list_size); + * If index is zero or positive, the function should return a pointer to + * the string which is to be displayed at position index in the list. If + * index is negative, it should return null and list_size should be set + * to the number of items in the list. The list box object will allow the + * user to scroll through the list and to select items list by clicking + * on them, and if it has the input focus also by using the arrow keys. If + * the D_EXIT flag is set, double clicking on a list item will cause it to + * close the dialog. The index of the selected item is held in the d1 + * field, and d2 is used to store how far it has scrolled through the list. + */ +int +d_list_proc (int msg, DIALOG * d, int c) +{ + int listsize, i, bottom, height, bar; + ALLEGRO_ASSERT (d); + + switch (msg) + { + + case MSG_START: + (*(getfuncptr) d->dp) (-1, &listsize); + _handle_scrollable_scroll (d, listsize, &d->d1, &d->d2); + break; + + case MSG_DRAW: + _draw_listbox (d); + break; + + case MSG_CLICK: + (*(getfuncptr) d->dp) (-1, &listsize); + height = (d->h - 4) / text_height (font); + bar = (listsize > height); + if ((!bar) || (gui_mouse_x () < d->x + d->w - 13)) + { + _handle_listbox_click (d); + while (gui_mouse_b ()) + { + broadcast_dialog_message (MSG_IDLE, 0); + d->flags |= D_INTERNAL; + _handle_listbox_click (d); + d->flags &= ~D_INTERNAL; + } + } + else + { + _handle_scrollable_scroll_click (d, listsize, &d->d2, height); + } + break; + + case MSG_DCLICK: + (*(getfuncptr) d->dp) (-1, &listsize); + height = (d->h - 4) / text_height (font); + bar = (listsize > height); + if ((!bar) || (gui_mouse_x () < d->x + d->w - 13)) + { + if (d->flags & D_EXIT) + { + if (listsize) + { + i = d->d1; + object_message (d, MSG_CLICK, 0); + if (i == d->d1) + return D_CLOSE; + } + } + } + break; + + case MSG_WHEEL: + (*(getfuncptr) d->dp) (-1, &listsize); + height = (d->h - 4) / text_height (font); + if (height < listsize) + { + int delta = (height > 3) ? 3 : 1; + if (c > 0) + i = MAX (0, d->d2 - delta); + else + i = MIN (listsize - height, d->d2 + delta); + if (i != d->d2) + { + d->d2 = i; + object_message (d, MSG_DRAW, 0); + } + } + break; + + case MSG_KEY: + (*(getfuncptr) d->dp) (-1, &listsize); + if ((listsize) && (d->flags & D_EXIT)) + return D_CLOSE; + break; + + case MSG_WANTFOCUS: + return D_WANTFOCUS; + + case MSG_CHAR: + (*(getfuncptr) d->dp) (-1, &listsize); + + if (listsize) + { + c >>= 8; + + bottom = d->d2 + (d->h - 4) / text_height (font) - 1; + if (bottom >= listsize - 1) + bottom = listsize - 1; + + if (c == ALLEGRO_KEY_UP) + d->d1--; + else if (c == ALLEGRO_KEY_DOWN) + d->d1++; + else if (c == ALLEGRO_KEY_HOME) + d->d1 = 0; + else if (c == ALLEGRO_KEY_END) + d->d1 = listsize - 1; + else if (c == ALLEGRO_KEY_PGUP) + { + if (d->d1 > d->d2) + d->d1 = d->d2; + else + d->d1 -= (bottom - d->d2) ? bottom - d->d2 : 1; + } + else if (c == ALLEGRO_KEY_PGDN) + { + if (d->d1 < bottom) + d->d1 = bottom; + else + d->d1 += (bottom - d->d2) ? bottom - d->d2 : 1; + } + else + return D_O_K; + + /* if we changed something, better redraw... */ + _handle_scrollable_scroll (d, listsize, &d->d1, &d->d2); + d->flags |= D_DIRTY; + return D_USED_CHAR; + } + break; + } + + return D_O_K; +} + + + +/* d_text_list_proc: + * Like d_list_proc, but allows the user to type in the first few characters + * of a listbox entry in order to select it. Uses dp3 internally, so you + * mustn't store anything important there yourself. + */ +int +d_text_list_proc (int msg, DIALOG * d, int c) +{ + int listsize, i, a, failure; + char *selected, *thisitem; + char *sel = d->dp2; + ALLEGRO_ASSERT (d); + + switch (msg) + { + + case MSG_START: + case MSG_CLICK: + case MSG_DCLICK: + case MSG_WANTFOCUS: + case MSG_LOSTFOCUS: + d->dp3 = 0; + break; + + case MSG_CHAR: + if ((c & 0xFF) < ' ') + d->dp3 = 0; + break; + + case MSG_UCHAR: + (*(getfuncptr) d->dp) (-1, &listsize); + + if (listsize) + { + if (c >= ' ') + { + selected = (*(getfuncptr) d->dp) (d->d1, NULL); + + i = d->d1; + + do + { + thisitem = (*(getfuncptr) d->dp) (i, NULL); + failure = FALSE; + + if ((int) ((unsigned long) d->dp3) < ustrlen (thisitem)) + { + for (a = 0; a < (int) ((unsigned long) d->dp3); a++) + { + if (utolower (ugetat (thisitem, a)) != + utolower (ugetat (selected, a))) + { + failure = TRUE; + break; + } + } + + if ((!failure) + && + (utolower + (ugetat (thisitem, (int) (unsigned long) d->dp3)) + == utolower (c))) + { + d->d1 = i; + d->dp3 = (void *) ((unsigned long) d->dp3 + 1); + + if (sel) + { + for (i = 0; i < listsize; i++) + sel[i] = FALSE; + } + + _handle_scrollable_scroll (d, listsize, &d->d1, + &d->d2); + object_message (d, MSG_DRAW, 0); + return D_USED_CHAR; + } + } + + i++; + if (i >= listsize) + i = 0; + + } + while (i != d->d1); + + if (d->dp3) + { + d->dp3 = 0; + return d_text_list_proc (msg, d, c); + } + } + } + break; + } + + return d_list_proc (msg, d, c); +} + + + +/* _draw_textbox: + * Helper function to draw a textbox object. + */ +void +_draw_textbox (char *thetext, int *listsize, int draw, int offset, + int wword, int tabsize, int x, int y, int w, int h, + int disabled, int fore, int deselect, int disable) +{ + ALLEGRO_BITMAP *gui_bmp = gui_get_screen (); + int fg = fore; + int y1 = y + 4; + int x1; + int len; + int ww = w - 6; + char s[16]; + char text[16]; + char space[16]; + char *printed = text; + char *scanned = text; + char *oldscan = text; + char *ignore = NULL; + char *tmp, *ptmp; + int width; + int line = 0; + int i = 0; + int noignore; + + usetc (s + usetc (s, '.'), 0); + usetc (text + usetc (text, ' '), 0); + usetc (space + usetc (space, ' '), 0); + + /* find the correct text */ + if (thetext != NULL) + { + printed = thetext; + scanned = thetext; + } + + /* do some drawing setup */ + if (draw) + { + /* initial start blanking at the top */ + rectfill (gui_bmp, x + 2, y + 2, x + w - 3, y1 - 1, deselect); + } + + /* choose the text color */ + if (disabled) + fg = disable; + + /* loop over the entire string */ + while (1) + { + width = 0; + + /* find the next break */ + while (ugetc (scanned)) + { + /* check for a forced break */ + if (ugetc (scanned) == '\n') + { + scanned += uwidth (scanned); + + /* we are done parsing the line end */ + break; + } + + /* the next character length */ + usetc (s + usetc (s, ugetc (scanned)), 0); + len = text_length (font, s); + + /* modify length if its a tab */ + if (ugetc (s) == '\t') + len = tabsize * text_length (font, space); + + /* check for the end of a line by excess width of next char */ + if (width + len >= ww) + { + /* we have reached end of line do we go back to find start */ + if (wword) + { + /* remember where we were */ + oldscan = scanned; + noignore = FALSE; + + /* go backwards looking for start of word */ + while (!uisspace (ugetc (scanned))) + { + /* don't wrap too far */ + if (scanned == printed) + { + /* the whole line is filled, so stop here */ + tmp = ptmp = scanned; + while (ptmp != oldscan) + { + ptmp = tmp; + tmp += uwidth (tmp); + } + scanned = ptmp; + noignore = TRUE; + break; + } + /* look further backwards to wrap */ + tmp = ptmp = printed; + while (tmp < scanned) + { + ptmp = tmp; + tmp += uwidth (tmp); + } + scanned = ptmp; + } + /* put the space at the end of the line */ + if (!noignore) + { + ignore = scanned; + scanned += uwidth (scanned); + } + else + ignore = NULL; + + /* check for endline at the convenient place */ + if (ugetc (scanned) == '\n') + scanned += uwidth (scanned); + } + /* we are done parsing the line end */ + break; + } + + /* the character can be added */ + scanned += uwidth (scanned); + width += len; + } + + /* check if we are to print it */ + if ((draw) && (line >= offset) + && (y1 + text_height (font) < (y + h - 3))) + { + x1 = x + 4; + + /* the initial blank bit */ + rectfill (gui_bmp, x + 2, y1, x1 - 1, y1 + text_height (font), + deselect); + + /* print up to the marked character */ + while (printed != scanned) + { + /* do special stuff for each charater */ + switch (ugetc (printed)) + { + + case '\r': + case '\n': + /* don't print endlines in the text */ + break; + + /* possibly expand the tabs */ + case '\t': + for (i = 0; i < tabsize; i++) + { + usetc (s + usetc (s, ' '), 0); + textout_ex (gui_bmp, font, s, x1, y1, fg, deselect); + x1 += text_length (font, s); + } + break; + + /* print a normal character */ + default: + if (printed != ignore) + { + usetc (s + usetc (s, ugetc (printed)), 0); + textout_ex (gui_bmp, font, s, x1, y1, fg, deselect); + x1 += text_length (font, s); + } + } + + /* goto the next character */ + printed += uwidth (printed); + } + /* the last blank bit */ + if (x1 <= x + w - 3) + rectfill (gui_bmp, x1, y1, x + w - 3, y1 + text_height (font) - 1, + deselect); + + /* print the line end */ + y1 += text_height (font); + } + printed = scanned; + + /* we have done a line */ + line++; + + /* check if we are at the end of the string */ + if (!ugetc (printed)) + { + /* the under blank bit */ + if (draw) + rectfill (gui_bmp, x + 1, y1, x + w - 3, y + h - 1, deselect); + + /* tell how many lines we found */ + *listsize = line; + return; + } + } + +} + + + +/* d_textbox_proc: + * A text box object. The dp field points to a char * which is the text + * to be displayed in the text box. If the text is long, there will be + * a vertical scrollbar on the right hand side of the object which can + * be used to scroll through the text. The default is to print the text + * with word wrapping, but if the D_SELECTED flag is set, the text will + * be printed with character wrapping. The d1 field is used internally + * to store the number of lines of text, and d2 is used to store how far + * it has scrolled through the text. + */ +int +d_textbox_proc (int msg, DIALOG * d, int c) +{ + int height, bar, ret = D_O_K; + int start, top, bottom, l; + int used, delta; + int fg_color; + ALLEGRO_ASSERT (d); + + fg_color = (d->flags & D_DISABLED) ? gui_mg_color : d->fg; + /* calculate the actual height */ + height = (d->h - 8) / text_height (font); + + switch (msg) + { + + case MSG_START: + /* measure how many lines of text we contain */ + _draw_textbox (d->dp, &d->d1, 0, /* DONT DRAW anything */ + d->d2, !(d->flags & D_SELECTED), 8, + d->x, d->y, d->w, d->h, + (d->flags & D_DISABLED), 0, 0, 0); + break; + + case MSG_DRAW: + /* tell the object to sort of draw, but only calculate the listsize */ + _draw_textbox (d->dp, &d->d1, 0, /* DONT DRAW anything */ + d->d2, !(d->flags & D_SELECTED), 8, + d->x, d->y, d->w, d->h, + (d->flags & D_DISABLED), 0, 0, 0); + + if (d->d1 > height) + { + bar = 12; + } + else + { + bar = 0; + d->d2 = 0; + } + + /* now do the actual drawing */ + _draw_textbox (d->dp, &d->d1, 1, d->d2, + !(d->flags & D_SELECTED), 8, + d->x, d->y, d->w - bar, d->h, + (d->flags & D_DISABLED), fg_color, d->bg, gui_mg_color); + + /* draw the frame around */ + _draw_scrollable_frame (d, d->d1, d->d2, height, fg_color, d->bg); + break; + + case MSG_CLICK: + /* figure out if it's on the text or the scrollbar */ + bar = (d->d1 > height); + + if ((!bar) || (gui_mouse_x () < d->x + d->w - 13)) + { + /* clicked on the text area */ + ret = D_O_K; + } + else + { + /* clicked on the scroll area */ + _handle_scrollable_scroll_click (d, d->d1, &d->d2, height); + } + break; + + case MSG_CHAR: + start = d->d2; + used = D_USED_CHAR; + + if (d->d1 > 0) + { + if (d->d2 > 0) + top = d->d2 + 1; + else + top = 0; + + l = (d->h - 8) / text_height (font); + + bottom = d->d2 + l - 1; + if (bottom >= d->d1 - 1) + bottom = d->d1 - 1; + else + bottom--; + + if ((c >> 8) == ALLEGRO_KEY_UP) + d->d2--; + else if ((c >> 8) == ALLEGRO_KEY_DOWN) + d->d2++; + else if ((c >> 8) == ALLEGRO_KEY_HOME) + d->d2 = 0; + else if ((c >> 8) == ALLEGRO_KEY_END) + d->d2 = d->d1 - l; + else if ((c >> 8) == ALLEGRO_KEY_PGUP) + d->d2 -= (bottom - top) ? bottom - top : 1; + else if ((c >> 8) == ALLEGRO_KEY_PGDN) + d->d2 += (bottom - top) ? bottom - top : 1; + else + used = D_O_K; + + /* make sure that the list stays in bounds */ + if (d->d2 > d->d1 - l) + d->d2 = d->d1 - l; + if (d->d2 < 0) + d->d2 = 0; + } + else + used = D_O_K; + + /* if we changed something, better redraw... */ + if (d->d2 != start) + d->flags |= D_DIRTY; + + ret = used; + break; + + case MSG_WHEEL: + l = (d->h - 8) / text_height (font); + delta = (l > 3) ? 3 : 1; + + /* scroll, making sure that the list stays in bounds */ + start = d->d2; + d->d2 = + (c > 0) ? MAX (0, d->d2 - delta) : MIN (d->d1 - l, d->d2 + delta); + + /* if we changed something, better redraw... */ + if (d->d2 != start) + d->flags |= D_DIRTY; + + ret = D_O_K; + break; + + case MSG_WANTFOCUS: + /* if we don't have a scrollbar we can't do anything with the focus */ + if (d->d1 > height) + ret = D_WANTFOCUS; + break; + + default: + ret = D_O_K; + } + + return ret; +} + + + +/* d_slider_proc: + * A slider control object. This object returns a value in d2, in the + * range from 0 to d1. It will display as a vertical slider if h is + * greater than or equal to w; otherwise, it will display as a horizontal + * slider. dp can contain an optional bitmap to use for the slider handle; + * dp2 can contain an optional callback function, which is called each + * time d2 changes. The callback function should have the following + * prototype: + * + * int function(void *dp3, int d2); + * + * The d_slider_proc object will return the value of the callback function. + */ +int +d_slider_proc (int msg, DIALOG * d, int c) +{ + ALLEGRO_BITMAP *gui_bmp = gui_get_screen (); + ALLEGRO_BITMAP *slhan = NULL; + int oldpos, newpos; + int sfg; /* slider foreground color */ + int vert = TRUE; /* flag: is slider vertical? */ + int hh = 7; /* handle height (width for horizontal sliders) */ + int hmar; /* handle margin */ + int slp; /* slider position */ + int mp; /* mouse position */ + int irange; + int slx, sly, slh, slw; + int msx, msy; + int retval = D_O_K; + int upkey, downkey; + int pgupkey, pgdnkey; + int homekey, endkey; + int delta; + al_fixed slratio, slmax, slpos; + int (*proc) (void *cbpointer, int d2value); + int oldval; + ALLEGRO_ASSERT (d); + + /* check for slider direction */ + if (d->h < d->w) + vert = FALSE; + + /* set up the metrics for the control */ + if (d->dp != NULL) + { + slhan = (ALLEGRO_BITMAP *) d->dp; + if (vert) + hh = al_get_bitmap_height (slhan); + else + hh = al_get_bitmap_width (slhan); + } + + hmar = hh / 2; + irange = (vert) ? d->h : d->w; + slmax = al_itofix (irange - hh); + slratio = slmax / (d->d1); + slpos = slratio * d->d2; + slp = al_fixtoi (slpos); + + switch (msg) + { + + case MSG_DRAW: + sfg = (d->flags & D_DISABLED) ? gui_mg_color : d->fg; + + if (vert) + { + rectfill (gui_bmp, d->x, d->y, d->x + d->w / 2 - 2, d->y + d->h - 1, + d->bg); + rectfill (gui_bmp, d->x + d->w / 2 - 1, d->y, d->x + d->w / 2 + 1, + d->y + d->h - 1, sfg); + rectfill (gui_bmp, d->x + d->w / 2 + 2, d->y, d->x + d->w - 1, + d->y + d->h - 1, d->bg); + } + else + { + rectfill (gui_bmp, d->x, d->y, d->x + d->w - 1, d->y + d->h / 2 - 2, + d->bg); + rectfill (gui_bmp, d->x, d->y + d->h / 2 - 1, d->x + d->w - 1, + d->y + d->h / 2 + 1, sfg); + rectfill (gui_bmp, d->x, d->y + d->h / 2 + 2, d->x + d->w - 1, + d->y + d->h - 1, d->bg); + } + + /* okay, background and slot are drawn, now draw the handle */ + if (slhan) + { + if (vert) + { + slx = d->x + (d->w / 2) - (al_get_bitmap_width (slhan) / 2); + sly = d->y + (d->h - 1) - (hh + slp); + } + else + { + slx = d->x + slp; + sly = d->y + (d->h / 2) - (al_get_bitmap_height (slhan) / 2); + } + draw_sprite (gui_bmp, slhan, slx, sly); + } + else + { + /* draw default handle */ + if (vert) + { + slx = d->x; + sly = d->y + (d->h) - (hh + slp); + slw = d->w - 1; + slh = hh - 1; + } + else + { + slx = d->x + slp; + sly = d->y; + slw = hh - 1; + slh = d->h - 1; + } + + /* draw body */ + rectfill (gui_bmp, slx + 2, sly, slx + (slw - 2), sly + slh, sfg); + vline (gui_bmp, slx + 1, sly + 1, sly + slh - 1, sfg); + vline (gui_bmp, slx + slw - 1, sly + 1, sly + slh - 1, sfg); + vline (gui_bmp, slx, sly + 2, sly + slh - 2, sfg); + vline (gui_bmp, slx + slw, sly + 2, sly + slh - 2, sfg); + vline (gui_bmp, slx + 1, sly + 2, sly + slh - 2, d->bg); + hline (gui_bmp, slx + 2, sly + 1, slx + slw - 2, d->bg); + putpixel (gui_bmp, slx + 2, sly + 2, d->bg); + } + + if (d->flags & D_GOTFOCUS) + dotted_rect (d->x, d->y, d->x + d->w - 1, d->y + d->h - 1, sfg, + d->bg); + break; + + case MSG_WANTFOCUS: + case MSG_LOSTFOCUS: + return D_WANTFOCUS; + + case MSG_KEY: + if (!(d->flags & D_GOTFOCUS)) + return D_WANTFOCUS; + else + return D_O_K; + + case MSG_CHAR: + /* handle movement keys to move slider */ + c >>= 8; + + if (vert) + { + upkey = ALLEGRO_KEY_UP; + downkey = ALLEGRO_KEY_DOWN; + pgupkey = ALLEGRO_KEY_PGUP; + pgdnkey = ALLEGRO_KEY_PGDN; + homekey = ALLEGRO_KEY_END; + endkey = ALLEGRO_KEY_HOME; + } + else + { + upkey = ALLEGRO_KEY_RIGHT; + downkey = ALLEGRO_KEY_LEFT; + pgupkey = ALLEGRO_KEY_PGDN; + pgdnkey = ALLEGRO_KEY_PGUP; + homekey = ALLEGRO_KEY_HOME; + endkey = ALLEGRO_KEY_END; + } + + if (c == upkey) + delta = 1; + else if (c == downkey) + delta = -1; + else if (c == pgdnkey) + delta = -d->d1 / 16; + else if (c == pgupkey) + delta = d->d1 / 16; + else if (c == homekey) + delta = -d->d2; + else if (c == endkey) + delta = d->d1 - d->d2; + else + delta = 0; + + if (delta) + { + oldpos = slp; + oldval = d->d2; + + while (1) + { + d->d2 = d->d2 + delta; + slpos = slratio * d->d2; + slp = al_fixtoi (slpos); + if ((slp != oldpos) || (d->d2 <= 0) || (d->d2 >= d->d1)) + break; + } + + if (d->d2 < 0) + d->d2 = 0; + if (d->d2 > d->d1) + d->d2 = d->d1; + + retval = D_USED_CHAR; + + if (d->d2 != oldval) + { + /* call callback function here */ + if (d->dp2) + { + proc = d->dp2; + retval |= (*proc) (d->dp3, d->d2); + } + + object_message (d, MSG_DRAW, 0); + } + } + break; + + case MSG_WHEEL: + oldval = d->d2; + d->d2 = CLAMP (0, d->d2 + c, d->d1); + if (d->d2 != oldval) + { + /* call callback function here */ + if (d->dp2) + { + proc = d->dp2; + retval |= (*proc) (d->dp3, d->d2); + } + + object_message (d, MSG_DRAW, 0); + } + break; + + case MSG_CLICK: + /* track the mouse until it is released */ + mp = slp; + + while (gui_mouse_b ()) + { + msx = gui_mouse_x (); + msy = gui_mouse_y (); + oldval = d->d2; + if (vert) + mp = (d->y + d->h - hmar) - msy; + else + mp = msx - (d->x + hmar); + if (mp < 0) + mp = 0; + if (mp > irange - hh) + mp = irange - hh; + slpos = al_itofix (mp); + slmax = al_fixdiv (slpos, slratio); + newpos = al_fixtoi (slmax); + if (newpos != oldval) + { + d->d2 = newpos; + + /* call callback function here */ + if (d->dp2 != NULL) + { + proc = d->dp2; + retval |= (*proc) (d->dp3, d->d2); + } + + object_message (d, MSG_DRAW, 0); + } + + /* let other objects continue to animate */ + broadcast_dialog_message (MSG_IDLE, 0); + } + break; + } + + return retval; +} + + + +/* Overridable procedures used by standard GUI dialogs. */ + +#define MAKE_PROC(proc, default) \ +int (*proc)(int, DIALOG *, int); \ +int _##proc(int msg, DIALOG *d, int c) \ +{ \ + return proc ? proc(msg, d, c) : default(msg, d, c); \ +} + +MAKE_PROC (gui_shadow_box_proc, d_shadow_box_proc); +MAKE_PROC (gui_ctext_proc, d_ctext_proc); +MAKE_PROC (gui_button_proc, d_button_proc); +MAKE_PROC (gui_edit_proc, d_edit_proc); +MAKE_PROC (gui_list_proc, d_text_list_proc); +MAKE_PROC (gui_text_list_proc, d_text_list_proc); diff --git a/src/backportguiproc.h b/src/backportguiproc.h new file mode 100644 index 00000000..276e218f --- /dev/null +++ b/src/backportguiproc.h @@ -0,0 +1,35 @@ +/* ______ ___ ___ + * /\ _ \ /\_ \ /\_ \ + * \ \ \L\ \\//\ \ \//\ \ __ __ _ __ ___ + * \ \ __ \ \ \ \ \ \ \ /'__`\ /'_ `\/\`'__\/ __`\ + * \ \ \/\ \ \_\ \_ \_\ \_/\ __//\ \L\ \ \ \//\ \L\ \ + * \ \_\ \_\/\____\/\____\ \____\ \____ \ \_\\ \____/ + * \/_/\/_/\/____/\/____/\/____/\/___L\ \/_/ \/___/ + * /\____/ + * \_/__/ + * + * GUI routines. + * + * By Shawn Hargreaves. + * + * See readme.txt for copyright information. + */ + + +#ifndef ALLEGRO_GUIPROC_H +#define ALLEGRO_GUIPROC_H + +/* + * [DISCLAIMER:ufoot] this is not really from the allegro source tree. + * Those functions are defined in guiproc.c then exposed in aintern.h. + * But I won't backport all of aintern.h so just extracted those gui funcs. + */ + +int _gui_shadow_box_proc (int msg, DIALOG * d, int c); +int _gui_ctext_proc (int msg, DIALOG * d, int c); +int _gui_button_proc (int msg, DIALOG * d, int c); +int _gui_edit_proc (int msg, DIALOG * d, int c); +int _gui_list_proc (int msg, DIALOG * d, int c); +int _gui_text_list_proc (int msg, DIALOG * d, int c); + +#endif // ALLEGRO_GUIPROC_H diff --git a/src/base.h b/src/base.h index f00b211b..3a325552 100644 --- a/src/base.h +++ b/src/base.h @@ -75,7 +75,7 @@ #define DIR_NNW 11 #define LW_PROGRAM "liquidwar" -#define LW_VERSION "5.6.5" +#define LW_VERSION "5.7.0" #define NAME_SIZE 10 #define PASSWORD_SIZE 20 diff --git a/src/bigdata.c b/src/bigdata.c index a8a0400b..f6a2b4d6 100644 --- a/src/bigdata.c +++ b/src/bigdata.c @@ -53,7 +53,7 @@ /*==================================================================*/ #include -#include +#include #include #include "alleg2.h" @@ -221,11 +221,11 @@ free_last_big_data_top (void) int check_free_memory (void) { - BITMAP *result; + ALLEGRO_BITMAP *result; - result = my_create_bitmap (MEMORY_TO_LEAVE / 2, 1024); + result = my_create_memory_bitmap (MEMORY_TO_LEAVE / 2, 1024); if (result) - destroy_bitmap (result); + al_destroy_bitmap (result); return result != NULL; } diff --git a/src/capture.c b/src/capture.c index da4a0e55..5b36b3f0 100644 --- a/src/capture.c +++ b/src/capture.c @@ -54,7 +54,7 @@ #include #include -#include +#include #include "capture.h" #include "viewport.h" @@ -137,9 +137,9 @@ lw_capture_dump_menu () * Now we check manually for F9 for there's no way * to do it easily within the generic menu code. */ - if (key[KEY_F9]) + if (key[ALLEGRO_KEY_F9]) { - while (key[KEY_F9]) + while (key[ALLEGRO_KEY_F9]) { /* * Force a all to poll_keyboard if needed @@ -164,7 +164,7 @@ lw_capture_dump_game () int result = 1; char buffer[LW_CAPTURE_FILENAME_BUFFER_SIZE]; static int frame_number = 0; - BITMAP *screenshot; + ALLEGRO_BITMAP *screenshot; /* * We do nothing if we're not in capture mode @@ -188,15 +188,15 @@ lw_capture_dump_game () * Create a sub-bitmap with the right size */ screenshot = - create_sub_bitmap (screen, 0, PAGE_FLIP_H, SCREEN_W, SCREEN_H); + al_create_sub_bitmap (screen, 0, PAGE_FLIP_H, SCREEN_W, SCREEN_H); if (screenshot) { /* * Write to disk */ - result = !save_bitmap (buffer, screenshot, GLOBAL_PALETTE); - destroy_bitmap (screenshot); + result = !al_save_bitmap (buffer, screenshot); + al_destroy_bitmap (screenshot); } else { diff --git a/src/code.c b/src/code.c index f109305f..27621d34 100644 --- a/src/code.c +++ b/src/code.c @@ -53,7 +53,7 @@ /*==================================================================*/ #include -#include +#include #include "config.h" #include "decal.h" @@ -91,7 +91,7 @@ display_special_info (void) { int global, spread, move, disp, flip; - if (WATCHDOG_SCANCODE[KEY_F5]) + if (WATCHDOG_SCANCODE[ALLEGRO_KEY_F5]) { global = get_profile (GLOBAL_PROFILE); if (global <=0) @@ -100,7 +100,7 @@ display_special_info (void) 1000 / global); } - if (WATCHDOG_SCANCODE[KEY_F6]) + if (WATCHDOG_SCANCODE[ALLEGRO_KEY_F6]) { global = get_logic_rate (); if (global <=0) @@ -109,7 +109,7 @@ display_special_info (void) 1000 / global); } - if (WATCHDOG_SCANCODE[KEY_F7]) + if (WATCHDOG_SCANCODE[ALLEGRO_KEY_F7]) { global = get_profile (GLOBAL_PROFILE); spread = get_profile (SPREAD_PROFILE); @@ -120,7 +120,7 @@ display_special_info (void) (100 * (spread + move)) / global); } - if (WATCHDOG_SCANCODE[KEY_F8]) + if (WATCHDOG_SCANCODE[ALLEGRO_KEY_F8]) { global = get_profile (GLOBAL_PROFILE); disp = get_profile (DISP_PROFILE); @@ -211,7 +211,7 @@ check_boolean_codes (void) /* * If we press F3 and we're not in network mode -> toggle pause mode */ - if (WATCHDOG_SCANCODE[KEY_F3] && !LW_NETWORK_ON) + if (WATCHDOG_SCANCODE[ALLEGRO_KEY_F3] && !LW_NETWORK_ON) { if (PAUSE_ON) { @@ -224,7 +224,7 @@ check_boolean_codes (void) message_str (lw_lang_string (LW_LANG_STRING_CODE_PAUSEON)); } } - if (WATCHDOG_SCANCODE[KEY_F4]) + if (WATCHDOG_SCANCODE[ALLEGRO_KEY_F4]) { if (CONFIG_WAVE_ON) { @@ -237,7 +237,7 @@ check_boolean_codes (void) message_str (lw_lang_string (LW_LANG_STRING_CODE_WAVEEFFECTSON)); } } - if (WATCHDOG_SCANCODE[KEY_F9]) + if (WATCHDOG_SCANCODE[ALLEGRO_KEY_F9]) { if (lw_capture_get_mode ()) { diff --git a/src/config.c b/src/config.c index 11bf0339..d03fa5fb 100644 --- a/src/config.c +++ b/src/config.c @@ -52,7 +52,7 @@ /* includes */ /*==================================================================*/ -#include +#include #include #include "config.h" @@ -96,10 +96,10 @@ #define LABEL_LEVEL_FG "LEVEL_FG" #define LABEL_LEVEL_BG "LEVEL_BG" #define LABEL_FIGHTER_NUMBER "FIGHTER_NUMBER" -#define LABEL_KEY_UP "KEY_UP" -#define LABEL_KEY_LEFT "KEY_LEFT" -#define LABEL_KEY_DOWN "KEY_DOWN" -#define LABEL_KEY_RIGHT "KEY_RIGHT" +#define LABEL_KEY_UP "ALLEGRO_KEY_UP" +#define LABEL_KEY_LEFT "ALLEGRO_KEY_LEFT" +#define LABEL_KEY_DOWN "ALLEGRO_KEY_DOWN" +#define LABEL_KEY_RIGHT "ALLEGRO_KEY_RIGHT" #define LABEL_TEAM_COLOR "TEAM_COLOR" #define LABEL_CONTROL_TYPE "CONTROL_TYPE" #define LABEL_PLAYER_NAME "PLAYER_NAME" @@ -116,7 +116,6 @@ #define LABEL_ROUNDS_PER_SEC_LIMIT "ROUNDS_PER_SEC_LIMIT" #define LABEL_SERVER_ADDRESS "SERVER_ADDRESS" #define LABEL_SERVER_PORT "SERVER_PORT" -#define LABEL_ASM_ALGORITHM "ASM_ALGORITHM" #define LABEL_PASSWORD "PASSWORD" #define LABEL_MIN_MAP_RES "MIN_MAP_RES" #define LABEL_USE_DEFAULT_TEXTURE "USE_DEFAULT_TEXTURE" @@ -166,7 +165,6 @@ int CONFIG_FRAMES_PER_SEC_LIMIT; int CONFIG_ROUNDS_PER_SEC_LIMIT; char CONFIG_SERVER_ADDRESS[SERVER_ADDRESS_SIZE + 1]; int CONFIG_SERVER_PORT; -int CONFIG_ASM_ALGORITHM; char CONFIG_PASSWORD[PASSWORD_SIZE + 1]; int CONFIG_MIN_MAP_RES; int CONFIG_USE_DEFAULT_TEXTURE; @@ -198,13 +196,8 @@ int MIN_MAP_RES_H[9] = { 0, 60, 90, 120, 150, 180, 240, 360, 480 }; void load_default_options (void) { -#ifdef DOS - CONFIG_GFX_GAME = 0; - CONFIG_GFX_MENU = 2; -#else CONFIG_GFX_GAME = 2; CONFIG_GFX_MENU = 2; -#endif #ifdef UNIX /* * Under UNIX/X11, we default to windowed mode since @@ -242,42 +235,42 @@ load_default_options (void) CONFIG_LEVEL_FG = 135; CONFIG_LEVEL_BG = 131; - CONFIG_KEY_UP[0] = KEY_UP; - CONFIG_KEY_DOWN[0] = KEY_DOWN; - CONFIG_KEY_LEFT[0] = KEY_LEFT; - CONFIG_KEY_RIGHT[0] = KEY_RIGHT; + CONFIG_KEY_UP[0] = ALLEGRO_KEY_UP; + CONFIG_KEY_DOWN[0] = ALLEGRO_KEY_DOWN; + CONFIG_KEY_LEFT[0] = ALLEGRO_KEY_LEFT; + CONFIG_KEY_RIGHT[0] = ALLEGRO_KEY_RIGHT; CONFIG_TEAM_COLOR[0] = 0; CONFIG_CONTROL_TYPE[0] = CONFIG_CONTROL_TYPE_HUMAN; LW_MACRO_STRCPY (CONFIG_PLAYER_NAME[0], "Napoleon"); - CONFIG_KEY_UP[1] = KEY_I; - CONFIG_KEY_DOWN[1] = KEY_K; - CONFIG_KEY_LEFT[1] = KEY_J; - CONFIG_KEY_RIGHT[1] = KEY_L; + CONFIG_KEY_UP[1] = ALLEGRO_KEY_I; + CONFIG_KEY_DOWN[1] = ALLEGRO_KEY_K; + CONFIG_KEY_LEFT[1] = ALLEGRO_KEY_J; + CONFIG_KEY_RIGHT[1] = ALLEGRO_KEY_L; CONFIG_TEAM_COLOR[1] = 4; CONFIG_CONTROL_TYPE[1] = CONFIG_CONTROL_TYPE_OFF; LW_MACRO_STRCPY (CONFIG_PLAYER_NAME[1], "Clovis"); - CONFIG_KEY_UP[2] = KEY_UP; - CONFIG_KEY_DOWN[2] = KEY_DOWN; - CONFIG_KEY_LEFT[2] = KEY_LEFT; - CONFIG_KEY_RIGHT[2] = KEY_RIGHT; + CONFIG_KEY_UP[2] = ALLEGRO_KEY_UP; + CONFIG_KEY_DOWN[2] = ALLEGRO_KEY_DOWN; + CONFIG_KEY_LEFT[2] = ALLEGRO_KEY_LEFT; + CONFIG_KEY_RIGHT[2] = ALLEGRO_KEY_RIGHT; CONFIG_TEAM_COLOR[2] = 8; CONFIG_CONTROL_TYPE[2] = CONFIG_CONTROL_TYPE_OFF; LW_MACRO_STRCPY (CONFIG_PLAYER_NAME[2], "Henri IV"); - CONFIG_KEY_UP[3] = KEY_Q; - CONFIG_KEY_DOWN[3] = KEY_A; - CONFIG_KEY_LEFT[3] = KEY_Z; - CONFIG_KEY_RIGHT[3] = KEY_X; + CONFIG_KEY_UP[3] = ALLEGRO_KEY_Q; + CONFIG_KEY_DOWN[3] = ALLEGRO_KEY_A; + CONFIG_KEY_LEFT[3] = ALLEGRO_KEY_Z; + CONFIG_KEY_RIGHT[3] = ALLEGRO_KEY_X; CONFIG_TEAM_COLOR[3] = 6; CONFIG_CONTROL_TYPE[3] = CONFIG_CONTROL_TYPE_OFF; LW_MACRO_STRCPY (CONFIG_PLAYER_NAME[3], "Cesar"); - CONFIG_KEY_UP[4] = KEY_8_PAD; - CONFIG_KEY_DOWN[4] = KEY_5_PAD; - CONFIG_KEY_LEFT[4] = KEY_4_PAD; - CONFIG_KEY_RIGHT[4] = KEY_6_PAD; + CONFIG_KEY_UP[4] = ALLEGRO_KEY_PAD_8; + CONFIG_KEY_DOWN[4] = ALLEGRO_KEY_PAD_5; + CONFIG_KEY_LEFT[4] = ALLEGRO_KEY_PAD_4; + CONFIG_KEY_RIGHT[4] = ALLEGRO_KEY_PAD_6; CONFIG_TEAM_COLOR[4] = 10; CONFIG_CONTROL_TYPE[4] = CONFIG_CONTROL_TYPE_OFF; LW_MACRO_STRCPY (CONFIG_PLAYER_NAME[4], "Geronimo"); @@ -338,7 +331,6 @@ load_default_rules (void) CONFIG_GAME_TIME = 8; CONFIG_CPU_ADVANTAGE = 0; CONFIG_CPU_VS_HUMAN = CONFIG_CPU_VS_HUMAN_RANDOM; - CONFIG_ASM_ALGORITHM = 1; CONFIG_MIN_MAP_RES = 4; CONFIG_ALLOW_NETWORK_BOTS = 0; } @@ -483,9 +475,6 @@ load_disk_options (void) CONFIG_SERVER_PORT = get_config_int (LABEL_MAIN, LABEL_SERVER_PORT, CONFIG_SERVER_PORT); - CONFIG_ASM_ALGORITHM = - get_config_int (LABEL_MAIN, LABEL_ASM_ALGORITHM, - CONFIG_ASM_ALGORITHM); strncpy (CONFIG_PASSWORD, get_config_string (LABEL_MAIN, LABEL_PASSWORD, @@ -613,7 +602,6 @@ save_config_options (void) set_config_string (LABEL_MAIN, LABEL_SERVER_ADDRESS, CONFIG_SERVER_ADDRESS); set_config_int (LABEL_MAIN, LABEL_SERVER_PORT, CONFIG_SERVER_PORT); - set_config_int (LABEL_MAIN, LABEL_ASM_ALGORITHM, CONFIG_ASM_ALGORITHM); set_config_string (LABEL_MAIN, LABEL_PASSWORD, CONFIG_PASSWORD); @@ -627,6 +615,8 @@ save_config_options (void) set_config_int (LABEL_MAIN, LABEL_LW6_ADVERTISING_DONE, CONFIG_LW6_ADVERTISING_DONE); + flush_config_file(); + return 0; } @@ -661,6 +651,5 @@ lw_config_set_current_rules_to_default (void) config->game_time = CONFIG_GAME_TIME; config->cpu_advantage = CONFIG_CPU_ADVANTAGE; config->cpu_vs_human = CONFIG_CPU_VS_HUMAN; - config->asm_algorithm = CONFIG_ASM_ALGORITHM && STARTUP_ASM; config->min_map_res = CONFIG_MIN_MAP_RES; } diff --git a/src/config.h b/src/config.h index 22241cad..0bd26dbc 100644 --- a/src/config.h +++ b/src/config.h @@ -110,7 +110,6 @@ extern int CONFIG_FRAMES_PER_SEC_LIMIT; extern int CONFIG_ROUNDS_PER_SEC_LIMIT; extern char CONFIG_SERVER_ADDRESS[SERVER_ADDRESS_SIZE + 1]; extern int CONFIG_SERVER_PORT; -extern int CONFIG_ASM_ALGORITHM; extern char CONFIG_PASSWORD[PASSWORD_SIZE + 1]; extern int CONFIG_MIN_MAP_RES; extern int CONFIG_USE_DEFAULT_TEXTURE; diff --git a/src/connect.c b/src/connect.c index b8727598..4081ed65 100644 --- a/src/connect.c +++ b/src/connect.c @@ -208,7 +208,7 @@ lw_connect_menu (int sock) dp = my_init_dialog (d, choix); while (my_update_dialog (dp) && !data->finished) { - show_mouse (screen); + lw_mouse_show (); if (!data->thread_running && !data->finished) { if (!first_getinfo) @@ -311,7 +311,7 @@ lw_connect_menu (int sock) while (data->thread_running) { /* - * Here, we wait until the thread is over, it shouldn't be very + * Here, we wait until the thread is over, it shouldn't be very * long since we just wait for the server's answer */ rest (100); @@ -405,7 +405,7 @@ update_connect_menu (DIALOG * d, d[7].proc (MSG_DRAW, d + 7, 0); unscare_mouse (); - show_mouse (screen); + lw_mouse_show (); /* * If there are more teams connected than last times, we're likely @@ -414,8 +414,8 @@ update_connect_menu (DIALOG * d, if (connected_teams > 0 && connected_teams > *connected_teams_prev) { /* - * We check if this is not the first time - * (*connected_teams_prev==-1) and in this case we play + * We check if this is not the first time + * (*connected_teams_prev==-1) and in this case we play * nothing */ if ((*connected_teams_prev) >= 0) diff --git a/src/dialog.h b/src/dialog.h index e3d46970..9b386f8b 100644 --- a/src/dialog.h +++ b/src/dialog.h @@ -55,8 +55,10 @@ /* includes */ /*==================================================================*/ -#include +#include +#include "backport.h" +#include "backportgui.h" #include "alleg2.h" #include "palette.h" diff --git a/src/disk.c b/src/disk.c index ff92535d..32023c60 100644 --- a/src/disk.c +++ b/src/disk.c @@ -52,18 +52,23 @@ /* includes */ /*==================================================================*/ +#include #include -#include +#include +#include +#include +#include #include "alleg2.h" #include "init.h" #include "disk.h" #include "log.h" #include "map.h" -#include "palette.h" #include "startup.h" #include "texture.h" #include "macro.h" +#include "path.h" +#include "thrdgen.h" /*==================================================================*/ /* defines */ @@ -81,6 +86,8 @@ int RAW_MAPTEX_NUMBER = 0; int RAW_MAP_NUMBER = 0; int MIDI_MUSIC_NUMBER = 0; +int LOADED_FONT = 0; +int LOADED_MAP = 0; int LOADED_BACK = 0; int LOADED_TEXTURE = 0; int LOADED_MAPTEX = 0; @@ -88,30 +95,30 @@ int LOADED_SFX = 0; int LOADED_WATER = 0; int LOADED_MUSIC = 0; -SAMPLE *SAMPLE_SFX_TIME = NULL; -SAMPLE *SAMPLE_SFX_WIN = NULL; -SAMPLE *SAMPLE_SFX_GO = NULL; -SAMPLE *SAMPLE_SFX_CLICK = NULL; -SAMPLE *SAMPLE_SFX_LOOSE = NULL; -SAMPLE *SAMPLE_SFX_CONNECT = NULL; +ALLEGRO_SAMPLE *SAMPLE_SFX_TIME = NULL; +ALLEGRO_SAMPLE *SAMPLE_SFX_WIN = NULL; +ALLEGRO_SAMPLE *SAMPLE_SFX_GO = NULL; +ALLEGRO_SAMPLE *SAMPLE_SFX_CLICK = NULL; +ALLEGRO_SAMPLE *SAMPLE_SFX_LOOSE = NULL; +ALLEGRO_SAMPLE *SAMPLE_SFX_CONNECT = NULL; -SAMPLE *SAMPLE_WATER[SAMPLE_WATER_MAX_NUMBER]; +ALLEGRO_SAMPLE *SAMPLE_WATER[SAMPLE_WATER_MAX_NUMBER]; void *RAW_MAP[RAW_MAP_MAX_NUMBER]; void *RAW_MAP_ORDERED[RAW_MAP_MAX_NUMBER]; void *RAW_TEXTURE[RAW_TEXTURE_MAX_NUMBER]; void *RAW_MAPTEX[RAW_TEXTURE_MAX_NUMBER]; -MIDI *MIDI_MUSIC[MIDI_MUSIC_MAX_NUMBER]; +ALLEGRO_SAMPLE *MIDI_MUSIC[MIDI_MUSIC_MAX_NUMBER]; -BITMAP *BACK_IMAGE = NULL; +ALLEGRO_BITMAP *BACK_IMAGE = NULL; -FONT *BIG_FONT = NULL; -FONT *SMALL_FONT = NULL; -BITMAP *BIG_MOUSE_CURSOR = NULL; -BITMAP *SMALL_MOUSE_CURSOR = NULL; -BITMAP *INVISIBLE_MOUSE_CURSOR = NULL; +ALLEGRO_FONT *BIG_FONT = NULL; +ALLEGRO_FONT *SMALL_FONT = NULL; +ALLEGRO_BITMAP *BIG_MOUSE_CURSOR = NULL; +ALLEGRO_BITMAP *SMALL_MOUSE_CURSOR = NULL; +ALLEGRO_BITMAP *INVISIBLE_MOUSE_CURSOR = NULL; -static RGB *FONT_PALETTE = NULL; -static RGB *BACK_PALETTE = NULL; +//static RGB *FONT_PALETTE = NULL; +//static RGB *BACK_PALETTE = NULL; static int CUSTOM_TEXTURE_OK = 0; static int CUSTOM_MAP_OK = 0; @@ -123,7 +130,7 @@ static int CUSTOM_MUSIC_OK = 0; /*------------------------------------------------------------------*/ static void -lock_sound (SAMPLE * smp) +lock_sound (ALLEGRO_SAMPLE * smp) { LOCK_VARIABLE (*smp); #ifdef DOS @@ -134,52 +141,66 @@ lock_sound (SAMPLE * smp) } /*------------------------------------------------------------------*/ -static void -read_sfx_dat (DATAFILE * df) -{ - SAMPLE *list[SAMPLE_SFX_NUMBER]; - int i; - - /* - * First, we associate the _first_ sound of the sub datafile - * to all sounds. This will operate as default value which - * will prevent the game from segfaulting if we use it with - * an outdated or too recent datafile - */ - for (i = 0; i < SAMPLE_SFX_NUMBER && df[i].type != DAT_END; ++i) - { - list[i] = df[0].dat; - } - - /* - * Now we associate the real sounds, provided that they exist... - */ - for (i = 0; i < 6 && df[i].type != DAT_END; ++i) - { - list[i] = df[i].dat; - lock_sound (list[i]); - } +static ALLEGRO_SAMPLE *read_sfx(const char *filename) { + ALLEGRO_SAMPLE *ret = NULL; + + char * path = lw_path_join3(STARTUP_DAT_PATH, "sfx", filename); + if (path == NULL) { + return NULL; + } + log_print_str("."); + ret = al_load_sample(path); + free(path); + return ret; +} - SAMPLE_SFX_TIME = list[0]; - SAMPLE_SFX_WIN = list[1]; - SAMPLE_SFX_CONNECT = list[2]; - SAMPLE_SFX_GO = list[3]; - SAMPLE_SFX_CLICK = list[4]; - SAMPLE_SFX_LOOSE = list[5]; +/*------------------------------------------------------------------*/ +static bool +read_sfx_dat () +{ + SAMPLE_SFX_TIME = read_sfx("clock1.wav"); + SAMPLE_SFX_WIN = read_sfx("crowd1.wav"); + SAMPLE_SFX_CONNECT = read_sfx("cuckoo.wav"); + SAMPLE_SFX_GO = read_sfx("foghorn.wav"); + SAMPLE_SFX_CLICK = read_sfx("spash1.wav"); + SAMPLE_SFX_LOOSE = read_sfx("war.wav"); + + return SAMPLE_SFX_TIME != NULL && + SAMPLE_SFX_WIN != NULL && + SAMPLE_SFX_CONNECT != NULL && + SAMPLE_SFX_GO != NULL && + SAMPLE_SFX_CLICK != NULL && + SAMPLE_SFX_LOOSE != NULL; } /*------------------------------------------------------------------*/ -static void -read_water_dat (DATAFILE * df) +static bool +read_water_dat () { + char water_files[][16] = { + "amb3.wav", "amb4.wav", "bath1.wav", "bath2.wav", + "bubble.wav", "flush.wav", "forest1.wav", "kitch4.wav", + "lavaflow.wav", "niagara.wav", "shower1.wav", "sodapor.wav", + "thundr2.wav", "thundr3.wav", "tidal.wav", "water.wav" + }; + int num_files = sizeof(water_files) / sizeof(water_files[0]); int i; - for (i = 0; i < SAMPLE_WATER_DAT_NUMBER && df[i].type != DAT_END; ++i) + SAMPLE_WATER_NUMBER = 0; + for (i = 0; i < num_files && i < SAMPLE_WATER_MAX_NUMBER; ++i) { - SAMPLE_WATER[i] = df[i].dat; - lock_sound (SAMPLE_WATER[i]); - SAMPLE_WATER_NUMBER++; + char * path = lw_path_join3(STARTUP_DAT_PATH, "water", water_files[i]); + if (path != NULL) { + log_print_str("."); + SAMPLE_WATER[i] = al_load_sample(path); + if (SAMPLE_WATER[i] != NULL) { + lock_sound (SAMPLE_WATER[i]); + SAMPLE_WATER_NUMBER++; + } + free(path); + } } + return SAMPLE_WATER_NUMBER > 0; } /*------------------------------------------------------------------*/ @@ -187,118 +208,404 @@ read_water_dat (DATAFILE * df) /*------------------------------------------------------------------*/ /*------------------------------------------------------------------*/ -static void -read_texture_dat (DATAFILE * df) +static bool +read_texture_dat () { + char texture_files[][32] = { + "amethyst.bmp", "bricks.bmp", "crash1.bmp", + "electricblue.bmp", "granite2.bmp", "greenmess.bmp", + "lumps.bmp", "marble3.bmp", "pebbles.bmp", + "pine.bmp", "poolbottom.bmp", "qbert.bmp", + "redcubes.bmp", "smallsquares.bmp", "terra.bmp", + "wood2.bmp" + }; + int num_files = sizeof(texture_files) / sizeof(texture_files[0]); int i; RAW_TEXTURE_NUMBER = 0; - for (i = 0; i < RAW_TEXTURE_DAT_NUMBER && df[i].type != DAT_END; ++i) + for (i = 0; i < num_files && i < RAW_TEXTURE_MAX_NUMBER; ++i) { - RAW_TEXTURE[i] = df[i].dat; - RAW_TEXTURE_NUMBER++; + log_print_str("."); + char * path = lw_path_join3(STARTUP_DAT_PATH, "texture", texture_files[i]); + if (path != NULL) { + void *texture = lw_texture_archive_raw(path); + if (texture != NULL) { + RAW_TEXTURE[i] = texture; + RAW_TEXTURE_NUMBER++; + } + free(path); + } } + return RAW_TEXTURE_NUMBER > 0; } /*------------------------------------------------------------------*/ -static void -read_maptex_dat (DATAFILE * df) +static bool +read_maptex_dat () { - int i; - RAW_MAPTEX_NUMBER = 0; - for (i = 0; i < RAW_TEXTURE_DAT_NUMBER && df[i].type != DAT_END; ++i) - { - RAW_MAPTEX[i] = df[i].dat; - RAW_MAPTEX_NUMBER++; + + char * maptex_path = lw_path_join2(STARTUP_DAT_PATH, "maptex"); + if (maptex_path == NULL) { + return false; + } + + ALLEGRO_FS_ENTRY *dir = al_create_fs_entry(maptex_path); + free(maptex_path); + + if (!dir || !al_open_directory(dir)) { + if (dir) al_destroy_fs_entry(dir); + return false; + } + + ALLEGRO_FS_ENTRY *entry; + while ((entry = al_read_directory(dir)) != NULL && RAW_MAPTEX_NUMBER < RAW_TEXTURE_MAX_NUMBER) { + log_print_str("."); + if (al_get_fs_entry_mode(entry) & ALLEGRO_FILEMODE_ISFILE) { + const char *filename = al_get_fs_entry_name(entry); + void *maptex = lw_texture_archive_raw(filename); + if (maptex != NULL) { + RAW_MAPTEX[RAW_MAPTEX_NUMBER] = maptex; + RAW_MAPTEX_NUMBER++; + } } + al_destroy_fs_entry(entry); + } + + al_close_directory(dir); + al_destroy_fs_entry(dir); + return RAW_MAPTEX_NUMBER > 0; } /*------------------------------------------------------------------*/ +/* Structure to hold map file info for load balancing */ +typedef struct { + char *filename; + off_t size; + int index; +} map_file_info; + +/*------------------------------------------------------------------*/ +/* Structure for worker's job list */ +typedef struct { + map_file_info **files; /* Array of pointers to files to process */ + int file_count; /* Number of files assigned to this worker */ + off_t total_size; /* Total bytes to process */ +} worker_job; + +/*------------------------------------------------------------------*/ +/* Worker thread function to load multiple maps */ static void -read_map_dat (DATAFILE * df) +map_load_worker(void *arg) { - int i; - - RAW_MAP_NUMBER = 0; - for (i = 0; i < RAW_MAP_DAT_NUMBER && df[i].type != DAT_END; ++i) - { - RAW_MAP[i] = df[i].dat; - RAW_MAP_NUMBER++; + worker_job *job = (worker_job *)arg; + + if (job && job->files) { + for (int i = 0; i < job->file_count; i++) { + map_file_info *file = job->files[i]; + if (file && file->filename) { + log_print_str("."); + void *map = lw_map_archive_raw(file->filename); + if (map != NULL) { + RAW_MAP[file->index] = map; + } + } } + free(job->files); + } + /* Note: job itself is part of jobs[] array, freed by main thread */ } /*------------------------------------------------------------------*/ -static void -read_back_dat (DATAFILE * df) +/* Comparison function for qsort - sort by size descending */ +static int +compare_map_size(const void *a, const void *b) { - int i, x, y; - - BACK_PALETTE = df[1].dat; - BACK_IMAGE = df[0].dat; - - /* - * strange, with Allegro 4.0, the liquidwarcol utility - * and the datafile compiler do not work so well together, - * and so the palette stored in the datafile always - * start at color 0, which explains the "18 shift" - */ + const map_file_info *fa = (const map_file_info *)a; + const map_file_info *fb = (const map_file_info *)b; - for (i = 0; i <= 45; ++i) - GLOBAL_PALETTE[i + 18] = BACK_PALETTE[i]; + /* Sort descending (largest first) */ + if (fa->size > fb->size) return -1; + if (fa->size < fb->size) return 1; + return 0; +} - for (x = 0; x < BACK_IMAGE->w; ++x) - for (y = 0; y < BACK_IMAGE->w; ++y) - { - putpixel (BACK_IMAGE, x, y, getpixel (BACK_IMAGE, x, y) + 18); - } +/*------------------------------------------------------------------*/ +/* Simple integer square root for worker count calculation */ +static int +isqrt(int n) +{ + int x = n; + int y = (x + 1) / 2; + while (y < x) { + x = y; + y = (x + n / x) / 2; + } + return x; } /*------------------------------------------------------------------*/ -static void -create_default_back (void) +static bool +read_map_dat () { - static RGB back_coul; + RAW_MAP_NUMBER = 0; + + char * map_path = lw_path_join2(STARTUP_DAT_PATH, "map"); + if (map_path == NULL) { + return false; + } + + ALLEGRO_FS_ENTRY *dir = al_create_fs_entry(map_path); + free(map_path); + + if (!dir || !al_open_directory(dir)) { + if (dir) al_destroy_fs_entry(dir); + return false; + } + + /* First pass: collect all filenames and their sizes */ + map_file_info files[RAW_MAP_MAX_NUMBER]; + int file_count = 0; + + ALLEGRO_FS_ENTRY *entry; + while ((entry = al_read_directory(dir)) != NULL && file_count < RAW_MAP_MAX_NUMBER) { + if (al_get_fs_entry_mode(entry) & ALLEGRO_FILEMODE_ISFILE) { + const char *filename = al_get_fs_entry_name(entry); + const char *ext = strrchr(filename, '.'); + if (ext && (strcmp(ext, ".bmp") == 0)) { + files[file_count].filename = strdup(filename); + if (files[file_count].filename) { + files[file_count].size = al_get_fs_entry_size(entry); + files[file_count].index = file_count; + file_count++; + } + } + } + al_destroy_fs_entry(entry); + } + + al_close_directory(dir); + al_destroy_fs_entry(dir); + + if (file_count == 0) { + return false; + } + + /* Sort files by size (largest first) for better load balancing */ + qsort(files, file_count, sizeof(map_file_info), compare_map_size); + + /* Calculate optimal worker count: sqrt(file_count), min 1, max file_count */ + int worker_count = isqrt(file_count); + if (worker_count < 1) worker_count = 1; + if (worker_count > file_count) worker_count = file_count; + + /* Allocate worker job structures */ + worker_job *jobs = calloc(worker_count, sizeof(worker_job)); + if (!jobs) { + /* Cleanup filenames */ + for (int i = 0; i < file_count; i++) { + free(files[i].filename); + } + return false; + } + + /* Allocate file lists for each worker */ + for (int i = 0; i < worker_count; i++) { + jobs[i].files = malloc(sizeof(map_file_info *) * file_count); + if (!jobs[i].files) { + /* Cleanup on allocation failure */ + for (int j = 0; j < i; j++) { + free(jobs[j].files); + } + free(jobs); + for (int j = 0; j < file_count; j++) { + free(files[j].filename); + } + return false; + } + jobs[i].file_count = 0; + jobs[i].total_size = 0; + } + + /* Greedy bin-packing: assign each file to worker with smallest current load */ + for (int i = 0; i < file_count; i++) { + /* Find worker with minimum load */ + int min_worker = 0; + off_t min_size = jobs[0].total_size; + for (int w = 1; w < worker_count; w++) { + if (jobs[w].total_size < min_size) { + min_size = jobs[w].total_size; + min_worker = w; + } + } + + /* Assign this file to the least loaded worker */ + jobs[min_worker].files[jobs[min_worker].file_count] = &files[i]; + jobs[min_worker].file_count++; + jobs[min_worker].total_size += files[i].size; + } + + /* Launch worker threads */ + LW_THREAD_HANDLE *threads = malloc(sizeof(LW_THREAD_HANDLE) * worker_count); + if (!threads) { + /* Cleanup */ + for (int i = 0; i < worker_count; i++) { + free(jobs[i].files); + } + free(jobs); + for (int i = 0; i < file_count; i++) { + free(files[i].filename); + } + return false; + } + + int threads_created = 0; + for (int i = 0; i < worker_count; i++) { + if (lw_thread_create(&threads[threads_created], map_load_worker, &jobs[i])) { + threads_created++; + } else { + /* Thread creation failed, fall back to synchronous processing */ + map_load_worker(&jobs[i]); + } + } + + /* Wait for all threads to complete */ + for (int i = 0; i < threads_created; i++) { + lw_thread_join(&threads[i]); + } + + free(threads); + + /* Workers free their own job->files, but free jobs array */ + free(jobs); - memset (&back_coul, 0, sizeof (RGB)); - back_coul.r = 1; - back_coul.g = 1; - back_coul.b = 8; + /* Free filenames */ + for (int i = 0; i < file_count; i++) { + free(files[i].filename); + } - BACK_IMAGE = my_create_bitmap (1, 1); - putpixel (BACK_IMAGE, 0, 0, 18); - GLOBAL_PALETTE[18] = back_coul; + /* Count successfully loaded maps */ + RAW_MAP_NUMBER = 0; + for (int i = 0; i < file_count; i++) { + if (RAW_MAP[i] != NULL) { + RAW_MAP_NUMBER++; + } + } + + return RAW_MAP_NUMBER > 0; } /*------------------------------------------------------------------*/ -static void -read_font_dat (DATAFILE * df) +static bool +read_back_dat () { - int i; - - FONT_PALETTE = df[4].dat; - SMALL_FONT = df[0].dat; - BIG_FONT = df[1].dat; - SMALL_MOUSE_CURSOR = df[2].dat; - BIG_MOUSE_CURSOR = df[3].dat; - INVISIBLE_MOUSE_CURSOR = df[5].dat; - - for (i = 1; i <= 17; ++i) - GLOBAL_PALETTE[i] = FONT_PALETTE[i]; + int errno; + + char * path = lw_path_join3(STARTUP_DAT_PATH, "back", "lw5back.bmp"); + if (path == NULL) { + return false; + } + if (!exists(path)) { + return false; + } + + log_print_str("."); + BACK_IMAGE = al_load_bitmap(path); + free(path); + if (BACK_IMAGE == NULL) { + return false; + } + + return true; } /*------------------------------------------------------------------*/ -static void -read_music_dat (DATAFILE * df) +static bool +read_font_dat () { - int i; + char * small_font_path = lw_path_join3(STARTUP_DAT_PATH, "font", "degrad10.bmp"); + char * big_font_path = lw_path_join3(STARTUP_DAT_PATH, "font", "degrad20.bmp"); + char * small_cursor_path = lw_path_join3(STARTUP_DAT_PATH, "font", "mouse20.bmp"); + char * big_cursor_path = lw_path_join3(STARTUP_DAT_PATH, "font", "mouse40.bmp"); + char * void_cursor_path = lw_path_join3(STARTUP_DAT_PATH, "font", "void1.bmp"); + + bool success = true; + + if (small_font_path) { + log_print_str("."); + SMALL_FONT = al_load_bitmap_font(small_font_path); + free(small_font_path); + if (!SMALL_FONT) success = false; + } else { + success = false; + } + + if (big_font_path) { + log_print_str("."); + BIG_FONT = al_load_bitmap_font(big_font_path); + free(big_font_path); + if (!BIG_FONT) success = false; + } else { + success = false; + } + + if (small_cursor_path) { + log_print_str("."); + SMALL_MOUSE_CURSOR = al_load_bitmap(small_cursor_path); + free(small_cursor_path); + if (!SMALL_MOUSE_CURSOR) success = false; + } else { + success = false; + } + + if (big_cursor_path) { + log_print_str("."); + BIG_MOUSE_CURSOR = al_load_bitmap(big_cursor_path); + free(big_cursor_path); + if (!BIG_MOUSE_CURSOR) success = false; + } else { + success = false; + } + + if (void_cursor_path) { + log_print_str("."); + INVISIBLE_MOUSE_CURSOR = al_load_bitmap(void_cursor_path); + free(void_cursor_path); + if (!INVISIBLE_MOUSE_CURSOR) success = false; + } else { + success = false; + } + + return success; +} +/*------------------------------------------------------------------*/ +static bool +read_music_dat () +{ + /* Music loading disabled for now */ MIDI_MUSIC_NUMBER = 0; - for (i = 0; i < MIDI_MUSIC_DAT_NUMBER && df[i].type != DAT_END; ++i) - { - MIDI_MUSIC[i] = df[i].dat; - MIDI_MUSIC_NUMBER++; - } + return true; +} + + +/*------------------------------------------------------------------*/ +static int check_loadable() { + int loadable = 0; + + loadable = exists (STARTUP_DAT_PATH); + + // Checking for the existence of this file, to quickly spot whether + // this is a genuine data folder. If that text file is not there, we + // can just leave and assume this is an unkown random place. + char * path = lw_path_join2(STARTUP_DAT_PATH, "liquidwar-data.txt"); + if (path == NULL) { + return 0; + } + loadable = exists(path); + free(path); + + return loadable; } /*------------------------------------------------------------------*/ @@ -306,128 +613,100 @@ int load_dat (void) { int result = 1; - int loadable; - DATAFILE *df; + int loadable = 0; - log_print_str ("Loading data from \""); + log_print_str ("Searching for data in \""); log_print_str (STARTUP_DAT_PATH); log_print_str ("\""); + log_flush (); -#ifdef DOS - loadable = 1; -#else - loadable = exists (STARTUP_DAT_PATH); -#endif - + loadable = check_loadable(); display_success (loadable); + if (loadable && STARTUP_BACK_STATE) + { + log_print_str ("Loading background bitmap"); + log_flush (); + LOADED_BACK = read_back_dat(); + display_success(LOADED_BACK); + result &= LOADED_BACK; + } if (loadable) { log_print_str ("Loading fonts"); log_flush (); - df = load_datafile_object (STARTUP_DAT_PATH, "font_dat"); - if (result &= (df != NULL)) - read_font_dat (df[0].dat); - display_success (df != NULL); + LOADED_FONT = read_font_dat (); + display_success (LOADED_FONT); + result &= LOADED_FONT; } if (loadable) { log_print_str ("Loading maps"); log_flush (); - df = load_datafile_object (STARTUP_DAT_PATH, "map_dat"); - if (result &= (df != NULL)) - read_map_dat (df[0].dat); - display_success (df != NULL); + LOADED_MAP = read_map_dat (); + display_success (LOADED_MAP); + result &= LOADED_MAP; } - if (loadable && STARTUP_BACK_STATE) - { - log_print_str ("Loading background bitmap"); - log_flush (); - df = load_datafile_object (STARTUP_DAT_PATH, "back_dat"); - if (df != NULL) - { - read_back_dat (df[0].dat); - LOADED_BACK = 1; - } - else - { - create_default_back (); - result &= !STARTUP_CHECK; - } - display_success (df != NULL); - } - else - create_default_back (); if (loadable && STARTUP_SFX_STATE) { log_print_str ("Loading sound fx"); log_flush (); - df = load_datafile_object (STARTUP_DAT_PATH, "sfx_dat"); - if (df != NULL) + if (read_sfx_dat()) { - read_sfx_dat (df[0].dat); LOADED_SFX = 1; + display_success(1); } else - result &= !STARTUP_CHECK; - display_success (df != NULL); + { + result &= !STARTUP_CHECK; + display_success(0); + } } if (loadable && STARTUP_TEXTURE_STATE) { log_print_str ("Loading textures"); log_flush (); - df = load_datafile_object (STARTUP_DAT_PATH, "texture_dat"); - if (df != NULL) - { - read_texture_dat (df[0].dat); - LOADED_TEXTURE = 1; - } - else + LOADED_TEXTURE = read_texture_dat(); + display_success(LOADED_TEXTURE); + if (!LOADED_TEXTURE) { result &= !STARTUP_CHECK; - display_success (df != NULL); + } log_print_str ("Loading map textures"); log_flush (); - df = load_datafile_object (STARTUP_DAT_PATH, "maptex_dat"); - if (df != NULL) - { - read_maptex_dat (df[0].dat); - LOADED_MAPTEX = 1; - } - else + LOADED_MAPTEX = read_maptex_dat(); + display_success(LOADED_MAPTEX); + if (!LOADED_MAPTEX) { result &= !STARTUP_CHECK; - display_success (df != NULL); + } } if (loadable && STARTUP_WATER_STATE) { log_print_str ("Loading water sounds"); log_flush (); - df = load_datafile_object (STARTUP_DAT_PATH, "water_dat"); - if (df != NULL) - { - read_water_dat (df[0].dat); - LOADED_WATER = 1; - } - else + LOADED_WATER = read_water_dat(); + display_success(LOADED_WATER); + if (!LOADED_WATER) { result &= !STARTUP_CHECK; - display_success (df != NULL); + } } if (loadable && STARTUP_MUSIC_STATE) { log_print_str ("Loading midi music"); log_flush (); - df = load_datafile_object (STARTUP_DAT_PATH, "music_dat"); - if (df != NULL) + if (read_music_dat()) { - read_music_dat (df[0].dat); LOADED_MUSIC = 1; + display_success(1); } else - result &= !STARTUP_CHECK; - display_success (df != NULL); + { + result &= !STARTUP_CHECK; + display_success(0); + } } return loadable && result; @@ -461,19 +740,26 @@ load_custom_texture_callback (const char *file, int mode, void *unused) static int load_custom_texture (void) { - int result = 1; - char buf[512]; - - LW_MACRO_SPRINTF1 (buf, "%s\\*.*", STARTUP_TEX_PATH); - - fix_filename_case (buf); - fix_filename_slashes (buf); - CUSTOM_TEXTURE_OK = 0; - for_each_file_ex (buf, 0, FA_DIREC, load_custom_texture_callback, NULL); - result = CUSTOM_TEXTURE_OK; - return result; + ALLEGRO_FS_ENTRY *dir = al_create_fs_entry(STARTUP_TEX_PATH); + if (!dir || !al_open_directory(dir)) { + if (dir) al_destroy_fs_entry(dir); + return 0; + } + + ALLEGRO_FS_ENTRY *entry; + while ((entry = al_read_directory(dir)) != NULL && RAW_TEXTURE_NUMBER < RAW_TEXTURE_MAX_NUMBER) { + if (al_get_fs_entry_mode(entry) & ALLEGRO_FILEMODE_ISFILE) { + const char *filename = al_get_fs_entry_name(entry); + load_custom_texture_callback(filename, 0, NULL); + } + al_destroy_fs_entry(entry); + } + + al_close_directory(dir); + al_destroy_fs_entry(dir); + return CUSTOM_TEXTURE_OK; } /*------------------------------------------------------------------*/ @@ -503,40 +789,38 @@ load_custom_map_callback (const char *file, int mode, void *unused) static int load_custom_map (void) { - int result = 1; - char buf[512]; - - LW_MACRO_SPRINTF1 (buf, "%s\\*.*", STARTUP_MAP_PATH); - - fix_filename_case (buf); - fix_filename_slashes (buf); - CUSTOM_MAP_OK = 0; - for_each_file_ex (buf, 0, FA_DIREC, load_custom_map_callback, NULL); - result = CUSTOM_MAP_OK; - return result; + ALLEGRO_FS_ENTRY *dir = al_create_fs_entry(STARTUP_MAP_PATH); + if (!dir || !al_open_directory(dir)) { + if (dir) al_destroy_fs_entry(dir); + return 0; + } + + ALLEGRO_FS_ENTRY *entry; + while ((entry = al_read_directory(dir)) != NULL && RAW_MAP_NUMBER < RAW_MAP_MAX_NUMBER) { + if (al_get_fs_entry_mode(entry) & ALLEGRO_FILEMODE_ISFILE) { + const char *filename = al_get_fs_entry_name(entry); + load_custom_map_callback(filename, 0, NULL); + } + al_destroy_fs_entry(entry); + } + + al_close_directory(dir); + al_destroy_fs_entry(dir); + return CUSTOM_MAP_OK; } /*------------------------------------------------------------------*/ static int load_custom_music_callback (const char *file, int mode, void *unused) { - void *pointeur; - LW_MACRO_NOP (mode); LW_MACRO_NOP (unused); + LW_MACRO_NOP (file); - if ((pointeur = load_midi (file)) != NULL) - { - MIDI_MUSIC[MIDI_MUSIC_NUMBER++] = pointeur; - log_print_str ("+"); - CUSTOM_MUSIC_OK = 1; - } - else - { - log_print_str ("-"); - } + /* Music loading disabled for now */ + log_print_str ("-"); log_flush (); return 0; @@ -546,19 +830,26 @@ load_custom_music_callback (const char *file, int mode, void *unused) static int load_custom_music (void) { - int result = 1; - char buf[512]; - - LW_MACRO_SPRINTF1 (buf, "%s\\*.*", STARTUP_MID_PATH); - - fix_filename_case (buf); - fix_filename_slashes (buf); - CUSTOM_MUSIC_OK = 0; - for_each_file_ex (buf, 0, FA_DIREC, load_custom_music_callback, NULL); - result = CUSTOM_MUSIC_OK; - return result; + ALLEGRO_FS_ENTRY *dir = al_create_fs_entry(STARTUP_MID_PATH); + if (!dir || !al_open_directory(dir)) { + if (dir) al_destroy_fs_entry(dir); + return 0; + } + + ALLEGRO_FS_ENTRY *entry; + while ((entry = al_read_directory(dir)) != NULL && MIDI_MUSIC_NUMBER < MIDI_MUSIC_MAX_NUMBER) { + if (al_get_fs_entry_mode(entry) & ALLEGRO_FILEMODE_ISFILE) { + const char *filename = al_get_fs_entry_name(entry); + load_custom_music_callback(filename, 0, NULL); + } + al_destroy_fs_entry(entry); + } + + al_close_directory(dir); + al_destroy_fs_entry(dir); + return CUSTOM_MUSIC_OK; } /*------------------------------------------------------------------*/ diff --git a/src/disk.h b/src/disk.h index 36cc62ac..bde22265 100644 --- a/src/disk.h +++ b/src/disk.h @@ -55,7 +55,9 @@ /* includes */ /*==================================================================*/ -#include +#include +#include +#include /*==================================================================*/ /* constantes */ @@ -89,27 +91,27 @@ extern int LOADED_MAPTEX; extern int LOADED_SFX; extern int LOADED_WATER; -extern SAMPLE *SAMPLE_SFX_TIME; -extern SAMPLE *SAMPLE_SFX_WIN; -extern SAMPLE *SAMPLE_SFX_GO; -extern SAMPLE *SAMPLE_SFX_CLICK; -extern SAMPLE *SAMPLE_SFX_LOOSE; -extern SAMPLE *SAMPLE_SFX_CONNECT; +extern ALLEGRO_SAMPLE *SAMPLE_SFX_TIME; +extern ALLEGRO_SAMPLE *SAMPLE_SFX_WIN; +extern ALLEGRO_SAMPLE *SAMPLE_SFX_GO; +extern ALLEGRO_SAMPLE *SAMPLE_SFX_CLICK; +extern ALLEGRO_SAMPLE *SAMPLE_SFX_LOOSE; +extern ALLEGRO_SAMPLE *SAMPLE_SFX_CONNECT; -extern SAMPLE *SAMPLE_WATER[SAMPLE_WATER_MAX_NUMBER]; +extern ALLEGRO_SAMPLE *SAMPLE_WATER[SAMPLE_WATER_MAX_NUMBER]; extern void *RAW_MAP[RAW_MAP_MAX_NUMBER]; extern void *RAW_MAP_ORDERED[RAW_MAP_MAX_NUMBER]; extern void *RAW_TEXTURE[RAW_TEXTURE_MAX_NUMBER]; extern void *RAW_MAPTEX[RAW_TEXTURE_MAX_NUMBER]; -extern MIDI *MIDI_MUSIC[MIDI_MUSIC_MAX_NUMBER]; +extern ALLEGRO_SAMPLE *MIDI_MUSIC[MIDI_MUSIC_MAX_NUMBER]; -extern BITMAP *BACK_IMAGE; +extern ALLEGRO_BITMAP *BACK_IMAGE; -extern FONT *BIG_FONT; -extern FONT *SMALL_FONT; -extern BITMAP *BIG_MOUSE_CURSOR; -extern BITMAP *SMALL_MOUSE_CURSOR; -extern BITMAP *INVISIBLE_MOUSE_CURSOR; +extern ALLEGRO_FONT *BIG_FONT; +extern ALLEGRO_FONT *SMALL_FONT; +extern ALLEGRO_BITMAP *BIG_MOUSE_CURSOR; +extern ALLEGRO_BITMAP *SMALL_MOUSE_CURSOR; +extern ALLEGRO_BITMAP *INVISIBLE_MOUSE_CURSOR; /*==================================================================*/ /* fonctions globales */ diff --git a/src/disp.c b/src/disp.c index 8af9d244..54c4b5d4 100644 --- a/src/disp.c +++ b/src/disp.c @@ -52,6 +52,8 @@ /* includes */ /*==================================================================*/ +#include + #include "area.h" #include "config.h" #include "disp.h" @@ -59,6 +61,7 @@ #include "viewport.h" #include "wave.h" #include "distor.h" +#include "alleg2.h" /*==================================================================*/ /* variables globales */ @@ -74,7 +77,7 @@ disp_stretch_area (void) { stretch_blit (CURRENT_AREA_DISP, NEXT_SCREEN, 0, 0, CURRENT_AREA_W, CURRENT_AREA_H, - 0, 0, NEXT_SCREEN->w, NEXT_SCREEN->h); + 0, 0, al_get_bitmap_width(NEXT_SCREEN), al_get_bitmap_height(NEXT_SCREEN)); } /*------------------------------------------------------------------*/ @@ -93,14 +96,14 @@ display_area (void) void display_gradient (int i) { - BITMAP *bmp; + ALLEGRO_BITMAP *bmp; bmp = create_gradient_bitmap (i); if (bmp) { - stretch_blit (bmp, NEXT_SCREEN, 0, 0, bmp->w, bmp->h, - 0, 0, NEXT_SCREEN->w, NEXT_SCREEN->h); - destroy_bitmap (bmp); + stretch_blit (bmp, NEXT_SCREEN, 0, 0, al_get_bitmap_width(bmp), al_get_bitmap_height(bmp), + 0, 0, al_get_bitmap_width(NEXT_SCREEN), al_get_bitmap_height(NEXT_SCREEN)); + al_destroy_bitmap (bmp); } } @@ -108,13 +111,13 @@ display_gradient (int i) void display_mesh (int i) { - BITMAP *bmp; + ALLEGRO_BITMAP *bmp; bmp = create_mesh_bitmap (i); if (bmp) { - stretch_blit (bmp, NEXT_SCREEN, 0, 0, bmp->w, bmp->h, - 0, 0, NEXT_SCREEN->w, NEXT_SCREEN->h); - destroy_bitmap (bmp); + stretch_blit (bmp, NEXT_SCREEN, 0, 0, al_get_bitmap_width(bmp), al_get_bitmap_height(bmp), + 0, 0, al_get_bitmap_width(NEXT_SCREEN), al_get_bitmap_height(NEXT_SCREEN)); + al_destroy_bitmap (bmp); } } diff --git a/src/distor.c b/src/distor.c index e547084a..fae9bdc0 100644 --- a/src/distor.c +++ b/src/distor.c @@ -52,12 +52,15 @@ /* includes */ /*==================================================================*/ +#include +#include + #include "alleg2.h" +#include "backport.h" #include "area.h" #include "config.h" #include "distor.h" #include "gfxmode.h" -#include "glouglou.h" #include "profile.h" #include "startup.h" #include "lwtime.h" @@ -78,7 +81,7 @@ static int DISTORSION_W; static int DISTORSION_H; -static BITMAP *DISTORSION_TARGET = NULL; +static ALLEGRO_BITMAP *DISTORSION_TARGET = NULL; static int WAVE_SHAPE_WX[MAX_W_DISPLAY]; static int WAVE_SHAPE_WY[DISTORSION_MAX + 2][MAX_W_DISPLAY]; @@ -100,16 +103,16 @@ init_distorsion_target (void) { if (DISTORSION_TARGET == NULL) { - DISTORSION_TARGET = my_create_bitmap (NEXT_SCREEN->w, NEXT_SCREEN->h); + DISTORSION_TARGET = my_create_memory_bitmap (al_get_bitmap_width(NEXT_SCREEN), al_get_bitmap_height(NEXT_SCREEN)); } else { - if (DISTORSION_TARGET->w != NEXT_SCREEN->w || - DISTORSION_TARGET->h != NEXT_SCREEN->h) + if (al_get_bitmap_width(DISTORSION_TARGET) != al_get_bitmap_width(NEXT_SCREEN) || + al_get_bitmap_height(DISTORSION_TARGET) != al_get_bitmap_height(NEXT_SCREEN)) { - destroy_bitmap (DISTORSION_TARGET); - DISTORSION_TARGET = my_create_bitmap (NEXT_SCREEN->w, - NEXT_SCREEN->h); + al_destroy_bitmap (DISTORSION_TARGET); + DISTORSION_TARGET = my_create_memory_bitmap (al_get_bitmap_width(NEXT_SCREEN), + al_get_bitmap_height(NEXT_SCREEN)); } } } @@ -122,8 +125,8 @@ init_distorsion_displayer (void) init_distorsion_target (); - w = DISTORSION_TARGET->w; - h = DISTORSION_TARGET->h; + w = al_get_bitmap_width(DISTORSION_TARGET); + h = al_get_bitmap_height(DISTORSION_TARGET); DISTORSION_W = (CONFIG_WAVE_AMPLI[0] + CONFIG_WAVE_AMPLI[3]) / WAVE_SIZE_SCALE + 1; @@ -194,17 +197,17 @@ create_wave_line (int *buffer, cycle_tmp /= 2; speed--; } - cycle_tmp = fixsqrt (fixsqrt (cycle_tmp)) / 2; + cycle_tmp = (int)(sqrt(sqrt(cycle_tmp)) / 2); cycle_tmp /= SCREEN_W; cycle_tmp *= period; if (cycle_tmp <= 0) { cycle_tmp = 1; } - cycle_coef = sens * 256 * (itofix (GLOBAL_TICKER % cycle_tmp) / cycle_tmp); + cycle_coef = sens * 256 * ((GLOBAL_TICKER % cycle_tmp) * 65536 / cycle_tmp); - f0 = fixsin (cycle_coef + freq_coef * period2); - fp0x0 = (PI_1024 * fixcos (cycle_coef + freq_coef * period2)) / 1024; + f0 = (int)(sin((cycle_coef + freq_coef * period2) / 65536.0 * 2 * M_PI) * 65536); + fp0x0 = (PI_1024 * (int)(cos((cycle_coef + freq_coef * period2) / 65536.0 * 2 * M_PI) * 65536)) / (1024 * 65536); alphax03 = (ampli_cst / 256) * ((fp0x0 - 2 * f0) / 256); betax02 = (ampli_cst / 256) * ((-fp0x0 + 3 * f0) / 256); @@ -218,7 +221,7 @@ create_wave_line (int *buffer, for (i = period2; i < real_length - period2; ++i) { temp = - ((ampli_cos) / 256) * (fixcos (cycle_coef + freq_coef * i) / 256); + ((ampli_cos) / 256) * ((int)(cos((cycle_coef + freq_coef * i) / 65536.0 * 2 * M_PI) * 65536) / 256); buffer2[i] = temp / WAVE_SIZE_SCALE; } @@ -245,8 +248,8 @@ prepare_wave_shapes (void) { int w, h, x, y, i; - w = DISTORSION_TARGET->w; - h = DISTORSION_TARGET->h; + w = al_get_bitmap_width(DISTORSION_TARGET); + h = al_get_bitmap_height(DISTORSION_TARGET); create_wave_line (WAVE_SHAPE_WX, w, CONFIG_WAVE_NUMBER[0], @@ -289,26 +292,16 @@ prepare_wave_shapes (void) void disp_distorted_area (void) { - char *src; int x, y, w, h, lim_w, lim_h, init_w, init_h; int *y_corres; int fp_x, fp_y, fp_y0, ip_y0; int fp_x0[MAX_W_DISPLAY]; int reste_x; -#ifdef ASM - int ip_x, ip_y; - int temp = 0; - int bmp_color_depth; - int bmp_linear; - int bmp_memory; - - bmp_color_depth = bitmap_color_depth (DISTORSION_TARGET); - bmp_linear = is_linear_bitmap (DISTORSION_TARGET); - bmp_memory = is_memory_bitmap (DISTORSION_TARGET); -#endif - - w = DISTORSION_TARGET->w; - h = DISTORSION_TARGET->h; + int src_x, src_y; + ALLEGRO_COLOR pixel_color; + + w = al_get_bitmap_width(DISTORSION_TARGET); + h = al_get_bitmap_height(DISTORSION_TARGET); lim_w = DISTORSION_PRECISION * w; lim_h = DISTORSION_PRECISION * h; init_w = (CURRENT_AREA_W * DISTORSION_PRECISION) / 2; @@ -320,68 +313,55 @@ disp_distorted_area (void) fp_y0 = init_h; ip_y0 = 0; + + // Lock bitmaps for pixel access + al_set_target_bitmap(DISTORSION_TARGET); + for (y = 0; y < h; ++y) { fp_y = fp_y0; fp_x = init_w; - src = (char *) CURRENT_AREA_DISP->dat + ip_y0 * CURRENT_AREA_W; + src_x = init_w / DISTORSION_PRECISION; + src_y = ip_y0; y_corres = WAVE_SHAPE_Y_CORRES[y]; -#ifdef ASM - ip_x = 0; - ip_y = ip_y0; - /* - * draw_distor_line works on memory 8-bit bitmaps only - */ - if (STARTUP_ASM && bmp_memory && bmp_linear && bmp_color_depth == 8) + for (x = 0; x < w; ++x) { - draw_distor_line (DISTORSION_TARGET, - CURRENT_AREA_W, - w, - y, - fp_x, - ip_x, - fp_y, - ip_y, - lim_w, - lim_h, - fp_x0, - y_corres, - WAVE_SHAPE_WX, - WAVE_SHAPE_X_CORRES, - src, temp, temp, temp, temp, temp); - } - else -#endif - for (x = 0; x < w; ++x) - { - putpixel (DISTORSION_TARGET, x, y, *src); - - reste_x = fp_x0[x] += WAVE_SHAPE_X_CORRES[x][y]; - fp_x += WAVE_SHAPE_WX[x]; - while (reste_x < -fp_x) - { - fp_x += lim_w; - src--; - } - while (reste_x + fp_x >= lim_w) - { - fp_x -= lim_w; - src++; - } - - fp_y += y_corres[x]; - while (fp_y < 0) - { - fp_y += lim_h; - src -= CURRENT_AREA_W; - } - while (fp_y >= lim_h) - { - fp_y -= lim_h; - src += CURRENT_AREA_W; - } + // Get pixel from source area + if (src_x >= 0 && src_x < CURRENT_AREA_W && + src_y >= 0 && src_y < CURRENT_AREA_H) { + pixel_color = al_get_pixel(CURRENT_AREA_DISP, src_x, src_y); + } else { + pixel_color = al_map_rgb(0, 0, 0); // Black for out-of-bounds } + + al_put_pixel(x, y, pixel_color); + + reste_x = fp_x0[x] += WAVE_SHAPE_X_CORRES[x][y]; + fp_x += WAVE_SHAPE_WX[x]; + while (reste_x < -fp_x) + { + fp_x += lim_w; + src_x--; + } + while (reste_x + fp_x >= lim_w) + { + fp_x -= lim_w; + src_x++; + } + + fp_y += y_corres[x]; + while (fp_y < 0) + { + fp_y += lim_h; + src_y--; + } + while (fp_y >= lim_h) + { + fp_y -= lim_h; + src_y++; + } + } fp_y0 += WAVE_SHAPE_HY[y]; while (fp_y0 >= lim_h) @@ -392,5 +372,5 @@ disp_distorted_area (void) } blit (DISTORSION_TARGET, NEXT_SCREEN, 0, 0, 0, 0, - DISTORSION_TARGET->w, DISTORSION_TARGET->h); + al_get_bitmap_width(DISTORSION_TARGET), al_get_bitmap_height(DISTORSION_TARGET)); } diff --git a/src/distor.h b/src/distor.h index 3e809902..87b34180 100644 --- a/src/distor.h +++ b/src/distor.h @@ -55,7 +55,7 @@ /* includes */ /*==================================================================*/ -#include +#include /*==================================================================*/ /* fonctions globales */ diff --git a/src/error.c b/src/error.c index d07d827d..09e3b20a 100644 --- a/src/error.c +++ b/src/error.c @@ -53,12 +53,14 @@ /*==================================================================*/ #include +#include #include "dialog.h" #include "error.h" #include "help.h" #include "base.h" #include "lang.h" +#include "alleg2.h" /*==================================================================*/ /* variables globales */ @@ -98,8 +100,8 @@ standard_error (char *str) d[1].proc = d_keyboard_proc; d[1].dp = return_d_close; d[1].key = ' '; - d[1].d1 = KEY_ENTER; - d[1].d2 = KEY_ESC; + d[1].d1 = ALLEGRO_KEY_ENTER; + d[1].d2 = ALLEGRO_KEY_ESCAPE; d[2].proc = NULL; diff --git a/src/exit.c b/src/exit.c index 3ca6b3cc..b6b3fc18 100644 --- a/src/exit.c +++ b/src/exit.c @@ -52,7 +52,7 @@ /* includes */ /*==================================================================*/ -#include +#include #ifdef WIN32 #include "popupgen.h" @@ -62,6 +62,7 @@ #include #endif +#include "backport.h" #include "basicopt.h" #include "config.h" #include "exit.h" @@ -102,23 +103,19 @@ exit_all (void) * This is an attempt to get rid of a hideous bug under X-Win, * which said that there was a "bad file descriptor" */ - rest (10); + al_rest (0.01); last_flip (); - set_gfx_mode (GFX_TEXT, 0, 0, 0, 0); - rest (10); + al_rest (0.01); log_println (); log_println_str - ("Leaving Allegro (http://www.talula.demon.co.uk/allegro)"); + ("Leaving Allegro (https://liballeg.org/)"); save_config_options (); stop_water (); stop_ticker (); - remove_sound (); - remove_mouse (); clear_keybuf (); - remove_keyboard (); remove_timer (); - allegro_exit (); + al_uninstall_system (); lw_sock_exit (); } } @@ -276,7 +273,7 @@ my_exit_poll () * We exit if the close button has been clicked or * F10 has been pressed */ - if (LW_EXIT_FORCE_SHUTDOWN || key[KEY_F10]) + if (LW_EXIT_FORCE_SHUTDOWN || key[ALLEGRO_KEY_F10]) { my_exit (EXIT_CODE_OK); } diff --git a/src/fighter.c b/src/fighter.c index f8359c7e..9f4534da 100644 --- a/src/fighter.c +++ b/src/fighter.c @@ -52,16 +52,17 @@ /* includes */ /*==================================================================*/ -#include +#include +#include #include "army.h" +#include "backport.h" #include "config.h" #include "cursor.h" #include "decal.h" #include "grad.h" #include "mesh.h" #include "fighter.h" -#include "monster.h" #include "palette.h" #include "startup.h" #include "lwtime.h" @@ -306,9 +307,6 @@ move_fighters (void) int *move_offset, *move_x, *move_y; int sens, start, table; int cpu_influence[NB_TEAMS] = { 0, 0, 0, 0, 0, 0 }; -#ifdef ASM - int temp = 0; -#endif sens = 0; @@ -337,30 +335,30 @@ move_fighters (void) coef += 256; attack[i] = (coef * - fixsqrt (fixsqrt - (1 << + (int)(sqrt (sqrt + ((double)(1 << (LW_CONFIG_CURRENT_RULES.fighter_attack + - cpu_influence[i])))) / (256 * 8); + cpu_influence[i])))))) / (256 * 8); if (attack[i] >= MAX_FIGHTER_HEALTH) attack[i] = MAX_FIGHTER_HEALTH - 1; if (attack[i] < 1) attack[i] = 1; defense[i] = (coef * - fixsqrt (fixsqrt - (1 << + (int)(sqrt (sqrt + ((double)(1 << (LW_CONFIG_CURRENT_RULES.fighter_defense + - cpu_influence[i])))) / (256 * 256); + cpu_influence[i])))))) / (256 * 256); if (defense[i] >= MAX_FIGHTER_HEALTH) defense[i] = MAX_FIGHTER_HEALTH - 1; if (defense[i] < 1) defense[i] = 1; new_health[i] = (coef * - fixsqrt (fixsqrt - (1 << + (int)(sqrt (sqrt + ((double)(1 << (LW_CONFIG_CURRENT_RULES.fighter_new_health + - cpu_influence[i])))) / (256 * 4); + cpu_influence[i])))))) / (256 * 4); if (new_health[i] >= MAX_FIGHTER_HEALTH) new_health[i] = MAX_FIGHTER_HEALTH - 1; if (new_health[i] < 1) @@ -372,30 +370,6 @@ move_fighters (void) table = (GLOBAL_CLOCK / 3) % 2; f = CURRENT_ARMY; -#ifdef ASM - if (STARTUP_ASM && LW_CONFIG_CURRENT_RULES.asm_algorithm) - boost_move_fighters (CURRENT_ARMY, - CURRENT_ARMY_SIZE, - CURRENT_AREA, - CURRENT_AREA_W, - ACTIVE_FIGHTERS, - attack, - defense, - new_health, - MAX_FIGHTER_HEALTH - 1, - sens, - start, - -GLOBAL_CLOCK, - FIGHTER_MOVE_XY_ASM[table], - FIGHTER_MOVE_OFFSET_ASM[table], - CURRENT_AREA_BACK->dat, - CURRENT_AREA_DISP->dat, - COLOR_FIRST_ENTRY, - COLORS_PER_TEAM, - LOCAL_DIR, - temp, temp, temp, temp, temp, temp, temp, temp); - else -#endif for (i = 0; i < CURRENT_ARMY_SIZE; ++i) { team = f->team; diff --git a/src/game.c b/src/game.c index 14c3727c..e94f4644 100644 --- a/src/game.c +++ b/src/game.c @@ -56,8 +56,9 @@ #ifdef UNIX #include #endif -#include +#include +#include "backport.h" #include "area.h" #include "autoplay.h" #include "back.h" @@ -118,15 +119,13 @@ int LW_GAME_RUNNING = 0; void calc_playing_teams (void) { - int i; - PLAYING_TEAMS = 0; /* * loop for all the possible teams, that's to say each of the * 6 areas in the "teams" menu */ - for (i = 0; i < NB_TEAMS; ++i) + for (int i = 0; i < NB_TEAMS; ++i) { if (LW_NETWORK_ON) { @@ -233,7 +232,7 @@ check_loose_team (void) */ play_loose (); /* - * remove the team from the info bar, so that room if freed for + * remove the team from the info bar, so that room if freed for * other teams */ free_info_bar (); @@ -254,7 +253,6 @@ check_loose_team (void) char * init_game (void) { - int i; int big_data; int max_mem_reached = 0; int last_try = 0; @@ -304,7 +302,7 @@ init_game (void) if (!message) { - for (i = 0; !max_mem_reached && !ok; ++i) + while (!max_mem_reached && !ok) { (void)i; /* Loop counter not currently used, suppress warning */ message = NULL; @@ -388,7 +386,7 @@ init_game (void) if (!message) { /* - * these are basically initialization which need to be done + * these are basically initialization which need to be done * and should never fail * check each function to know what it does!!! */ @@ -435,7 +433,7 @@ free_game_memory (void) */ if (CURRENT_AREA_DISP) { - destroy_bitmap (CURRENT_AREA_DISP); + al_destroy_bitmap (CURRENT_AREA_DISP); CURRENT_AREA_DISP = 0; } /* @@ -443,7 +441,7 @@ free_game_memory (void) */ if (CURRENT_AREA_BACK) { - destroy_bitmap (CURRENT_AREA_BACK); + al_destroy_bitmap (CURRENT_AREA_BACK); CURRENT_AREA_BACK = 0; } } @@ -637,11 +635,11 @@ logic (void) * everything which is not directly linked to a game cycle */ static void -display (void) +display_game (void) { /* * the watchdog waits for secret codes to be entered - * + * * It's also very important to call this for it will call * keypressed() and so will also automatically call poll_keyboard() * if needed. @@ -671,7 +669,7 @@ display (void) /* * updates some time values, telling how many weeks this tremendous - * liquid war session has been running 8-) + * liquid war session has been running 8-) */ update_play_time (); @@ -684,7 +682,7 @@ display (void) /* * We're in capture mode: we display info before the dump * for we want it to be there but we display the messages - * after the dump since they are ugly and useless in a + * after the dump since they are ugly and useless in a * video capture. */ display_info (); @@ -761,7 +759,7 @@ game (void) * - there are less than 2 teams playing, ie there's a winner * - the game time is elapsed */ - while ((!WATCHDOG_SCANCODE[KEY_ESC]) + while ((!WATCHDOG_SCANCODE[ALLEGRO_KEY_ESCAPE]) && (PLAYING_TEAMS >= 2) && (TIME_LEFT > 0) && (!LW_NETWORK_ERROR_DETECTED)) { @@ -813,7 +811,7 @@ game (void) * if CONFIG_FPS_LIMIT is 0 we stop right away, ie * there will be one logic() operation for each display() * if it is 1, we keep going until we exceed the - * CONFIG_FPS_LIMIT value. this way we avoid drawing + * CONFIG_FPS_LIMIT value. this way we avoid drawing * 300 frames / second, which is useless * this method speeds the game on powerfull machines * for one can limit the display to 20 frames / seconds @@ -829,7 +827,7 @@ game (void) update_logic_rate (lr); /* - * we get the information "when has the last call to display() + * we get the information "when has the last call to display() * been done" */ last_display_time = get_ticker (); @@ -837,7 +835,7 @@ game (void) /* * now we really display stuff, (takes time...) */ - display (); + display_game (); /* * Now we check if the "Close" button has been clicked diff --git a/src/game.h b/src/game.h index 54e7a708..845da182 100644 --- a/src/game.h +++ b/src/game.h @@ -55,7 +55,7 @@ /* includes */ /*==================================================================*/ -#include +#include /*==================================================================*/ /* definitions de constantes */ diff --git a/src/gfxmode.c b/src/gfxmode.c index c5bd92ef..7ed5e9e4 100644 --- a/src/gfxmode.c +++ b/src/gfxmode.c @@ -52,8 +52,9 @@ /* includes */ /*==================================================================*/ -#include +#include +#include "backport.h" #include "base.h" #include "disk.h" #include "log.h" @@ -79,14 +80,9 @@ int GFX_MODE_H[5] = { 240, 384, 480, 600, 768 }; #endif #ifdef UNIX -#ifdef GP2X -int GFX_MODE_W[5] = { 320, 320, 320, 320, 320 }; -int GFX_MODE_H[5] = { 240, 240, 240, 240, 240 }; -#else int GFX_MODE_W[5] = { 320, 512, 640, 800, 1024 }; int GFX_MODE_H[5] = { 240, 384, 480, 600, 768 }; #endif -#endif #ifdef DOS static int GFX_MODE_TYPE_FULLSCREEN[] = { GFX_MODEX, @@ -121,21 +117,25 @@ static int GFX_MODE_TYPE_WINDOWED[] = { GFX_DIRECTX_WIN, #endif #ifdef UNIX -#ifdef GP2X -static int GFX_MODE_TYPE_FULLSCREEN[] = { GFX_GP2X, - GFX_GP2X, - GFX_GP2X, - GFX_GP2X, - GFX_GP2X +static int GFX_MODE_TYPE_FULLSCREEN[] = { GFX_AUTODETECT_FULLSCREEN, + GFX_AUTODETECT_FULLSCREEN, + GFX_AUTODETECT_FULLSCREEN, + GFX_AUTODETECT_FULLSCREEN, + GFX_AUTODETECT_FULLSCREEN }; -static int GFX_MODE_TYPE_WINDOWED[] = { GFX_GP2X, - GFX_GP2X, - GFX_GP2X, - GFX_GP2X, - GFX_GP2X +static int GFX_MODE_TYPE_WINDOWED[] = { GFX_AUTODETECT_WINDOWED, + GFX_AUTODETECT_WINDOWED, + GFX_AUTODETECT_WINDOWED, + GFX_AUTODETECT_WINDOWED, + GFX_AUTODETECT_WINDOWED }; -#else +#endif + +#ifndef DOS +#ifndef WIN32 +#ifndef UNIX +// Default fallback graphics mode types static int GFX_MODE_TYPE_FULLSCREEN[] = { GFX_AUTODETECT_FULLSCREEN, GFX_AUTODETECT_FULLSCREEN, GFX_AUTODETECT_FULLSCREEN, @@ -151,6 +151,7 @@ static int GFX_MODE_TYPE_WINDOWED[] = { GFX_AUTODETECT_WINDOWED, }; #endif #endif +#endif /*==================================================================*/ /* fonctions */ @@ -214,10 +215,6 @@ set_resolution (int res, int flip, int fullscreen, int *flip_enabled) int toggle; int i; -#ifdef GP2X - fullscreen = 1; -#endif - if (flip_enabled) { *flip_enabled = 0; diff --git a/src/glouglou.h b/src/glouglou.h deleted file mode 100644 index c22b64ca..00000000 --- a/src/glouglou.h +++ /dev/null @@ -1,84 +0,0 @@ -/********************************************************************/ -/* */ -/* L I QQ U U I DD W W A RR 555 */ -/* L I Q Q U U I D D W W A A R R 5 */ -/* L I Q Q U U I D D W W W AAA RR 55 */ -/* L I Q Q U U I D D WW WW A A R R 5 */ -/* LLL I Q Q U I DD W W A A R R 55 */ -/* */ -/* b */ -/* bb y y */ -/* b b yyy */ -/* bb y */ -/* yy */ -/* */ -/* U U FFF O O TTT */ -/* U U F O O O O T */ -/* U U TIRET FF O O O O T */ -/* U U F O O O O T */ -/* U F O O T */ -/* */ -/********************************************************************/ - -/*****************************************************************************/ -/* Liquid War is a multiplayer wargame */ -/* Copyright (C) 1998-2025 Christian Mauduit */ -/* */ -/* 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 */ -/* */ -/* Liquid War homepage : https://ufoot.org/liquidwar/v5 */ -/* Contact author : ufoot@ufoot.org */ -/*****************************************************************************/ - -/********************************************************************/ -/* nom : glouglou.h */ -/* contenu : affichage avec vagues accelere */ -/* date de modif : 3 mai 98 */ -/********************************************************************/ - -#ifndef LIQUID_WAR_INCLUDE_GLOUGLOU -#define LIQUID_WAR_INCLUDE_GLOUGLOU - -/*==================================================================*/ -/* includes */ -/*==================================================================*/ - -#include -#include "asm.h" - -/*==================================================================*/ -/* types */ -/*==================================================================*/ - -extern void LW_ASM_FUNC draw_distor_line (BITMAP * distorsion_target, - int current_area_w, - int w, - int u, - int fp_x, - int ip_x, - int fp_y, - int ip_y, - int lim_w, - int lim_h, - int *fp_x0, - int *y_corres, - int *WAVE_SHAPE_WX, - int **WAVE_SHAPE_X_CORRES, - char *src, - int temp1, - int temp2, - int temp3, int temp4, int temp5); - -#endif diff --git a/src/glouglou.s b/src/glouglou.s deleted file mode 100644 index 00fa1ae2..00000000 --- a/src/glouglou.s +++ /dev/null @@ -1,242 +0,0 @@ -/********************************************************************/ -/* */ -/* L I QQ U U I DD W W A RR 555 */ -/* L I Q Q U U I D D W W A A R R 5 */ -/* L I Q Q U U I D D W W W AAA RR 55 */ -/* L I Q Q U U I D D WW WW A A R R 5 */ -/* LLL I Q Q U I DD W W A A R R 55 */ -/* */ -/* b */ -/* bb y y */ -/* b b yyy */ -/* bb y */ -/* yy */ -/* */ -/* U U FFF O O TTT */ -/* U U F O O O O T */ -/* U U TIRET FF O O O O T */ -/* U U F O O O O T */ -/* U F O O T */ -/* */ -/********************************************************************/ - -/*****************************************************************************/ -/* Liquid War is a multiplayer wargame */ -/* Copyright (C) 1998-2025 Christian Mauduit */ -/* */ -/* 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 */ -/* */ -/* Liquid War homepage : https://ufoot.org/liquidwar/v5 */ -/* Contact author : ufoot@ufoot.org */ -/*****************************************************************************/ - -/********************************************************************/ -/* nom : glouglou.s */ -/* contenu : affichage avec vagues accelere */ -/* date de modif : 3 mai 98 */ -/********************************************************************/ - -.equ BMP_W, 0 -.equ BMP_H, 4 -.equ BMP_CLIP, 8 -.equ BMP_CL, 12 -.equ BMP_CR, 16 -.equ BMP_CT, 20 -.equ BMP_CB, 24 -.equ BMP_VTABLE, 28 -.equ BMP_WBANK, 32 -.equ BMP_RBANK, 36 -.equ BMP_DAT, 40 -.equ BMP_ID, 44 -.equ BMP_EXTRA, 48 -.equ BMP_XOFS, 52 -.equ BMP_YOFS, 56 -.equ BMP_SEG, 60 -.equ BMP_LINE, 64 - -.equ VTABLE_UNBANK, 8 - -.equ ARG_DISTORSION_TARGET, 8 -.equ ARG_CURRENT_AREA_W, 12 -.equ ARG_W, 16 -.equ ARG_Y, 20 -.equ ARG_FP_X, 24 -.equ ARG_IP_X, 28 -.equ ARG_FP_Y, 32 -.equ ARG_IP_Y, 36 -.equ ARG_LIM_W, 40 -.equ ARG_LIM_H, 44 -.equ ARG_FP_X0, 48 -.equ ARG_Y_CORRES, 52 -.equ ARG_WAVE_SHAPE_WX, 56 -.equ ARG_WAVE_SHAPE_X_CORRES, 60 -.equ ARG_SRC, 64 -.equ ARG_TEMP1, 68 # pointeur debut ligne -.equ ARG_TEMP2, 72 # pointeur sur fc aff -.equ ARG_TEMP3, 76 -.equ ARG_TEMP4, 80 -.equ ARG_TEMP5, 84 - -.text - - -/*==================================================================*/ -/* affichage de jolies distorsions */ -/*==================================================================*/ - -/*------------------------------------------------------------------*/ -/* void draw_distor_line (BITMAP *distorsion_target, */ -/* int current_area_w, */ -/* int w, */ -/* int y, */ -/* int fp_x, */ -/* int ip_x, */ -/* int fp_y, */ -/* int ip_y, */ -/* int lim_w, */ -/* int lim_h, */ -/* int *fp_x0, */ -/* int *y_corres, */ -/* int *WAVE_SHAPE_WX, */ -/* int **WAVE_SHAPE_X_CORRES, */ -/* char *src, */ -/* int temp1, */ -/* int temp2, */ -/* int temp3, */ -/* int temp4, */ -/* int temp5); */ -/*------------------------------------------------------------------*/ -.globl __draw_distor_line -.globl _draw_distor_line -.globl draw_distor_line - .align 4 -__draw_distor_line: -_draw_distor_line: -draw_distor_line: - pushl %ebp - movl %esp, %ebp - pushl %eax - pushl %ebx - pushl %ecx - pushl %edx - pushl %esi - pushl %edi - pushw %es - pushw %fs - - mov ARG_SRC(%ebp),%esi - mov ARG_CURRENT_AREA_W(%ebp),%edi - - movl ARG_DISTORSION_TARGET(%ebp), %edx # edx = bmp - movl ARG_Y(%ebp), %eax # eax = y - movl BMP_LINE(%edx, %eax, 4), %eax - movl %eax,ARG_TEMP1(%ebp) # ARG_TEMP1 = ptr debut ligne - - xor %ecx,%ecx # ecx va servir pour stocker x -main_loop: - - # putpixel (DISTORSION_TARGET, x,y *src) - - movl %ds:(%esi),%ebx # bl = color - movl ARG_TEMP1(%ebp), %eax - movb %bl, %ds:(%eax, %ecx) # store the pixel - - mov ARG_WAVE_SHAPE_X_CORRES(%ebp),%eax #eax=wave_shape_x_corres - mov %ds:(%eax,%ecx,4),%eax # eax=wave_shape_x_corres[x] - mov ARG_Y(%ebp),%ebx # ebx=y - mov %ds:(%eax,%ebx,4),%eax # eax=wave_shape_x_corres[x][y] - mov ARG_FP_X0(%ebp),%ebx # ebx=arg_fp_x0 - mov %ds:(%ebx,%ecx,4),%edx # edx=arg_fp_x0[x] - add %eax,%edx # edx+=eax - mov %edx,%ds:(%ebx,%ecx,4) # on memorise en ram - neg %edx - - # a ce stade edx contient -reste_x - - mov ARG_FP_X(%ebp),%eax # eax=fp_x - mov ARG_WAVE_SHAPE_WX(%ebp),%ebx # ebx=wave_shape_wx - add %ds:(%ebx,%ecx,4),%eax # fp_x+=wave_shape_wx[x] - - mov ARG_LIM_W(%ebp),%ebx # ebx=lim_w -loop_while_1: - cmp %edx,%eax # fp_x<-reste_x - jnl exit_while_1 - add %ebx,%eax # fp_x+=lim_w - dec %esi # src-- - jmp loop_while_1 -exit_while_1: - - add %ebx,%edx -loop_while_2: - cmp %edx,%eax # fp_x>=-reste_x+lim_w - jnge exit_while_2 - sub %ebx,%eax # fp_x-=lim_w - inc %esi # src++ - jmp loop_while_2 -exit_while_2: - - mov %eax,ARG_FP_X(%ebp) # on sauve fp_x - - mov ARG_FP_Y(%ebp),%eax # eax=fp_y - mov ARG_Y_CORRES(%ebp),%ebx # ebx=y_corres - add %ds:(%ebx,%ecx,4),%eax # fp_y+=y_corres[x] - - mov ARG_LIM_H(%ebp),%ebx # ebx=lim_h -loop_while_3: - cmp $0,%eax # fp_y<0 - jnl exit_while_3 - add %ebx,%eax # fp_x+=lim_h - sub %edi,%esi # src-=current_area_w - jmp loop_while_3 -exit_while_3: - -loop_while_4: - cmp %ebx,%eax # fp_y>=lim_h - jnge exit_while_4 - sub %ebx,%eax # fp_y-=lim_h - add %edi,%esi # src+=current_area_w - jmp loop_while_4 -exit_while_4: - - mov %eax,ARG_FP_Y(%ebp) # on sauve fp_y - -/* mov ARG_TEMP1(%ebp),%ecx # ecx=x */ - incl %ecx # x++ - cmp ARG_W(%ebp),%ecx # x!=w ? - je the_end - jmp main_loop - -the_end: - - popw %fs - popw %es - popl %edi - popl %esi - popl %edx - popl %ecx - popl %ebx - popl %eax -/* movl %ebp, %esp*/ - popl %ebp - ret # retour au c - -/*------------------------------------------------------------------*/ -/* affichage pour bitmap lineaire, golee dans allegro */ -/*------------------------------------------------------------------*/ -linear_putpixel8_for_distor_line: - - - ret - diff --git a/src/grad.c b/src/grad.c index 9c3db07d..9e760b52 100644 --- a/src/grad.c +++ b/src/grad.c @@ -58,7 +58,6 @@ #include "grad.h" #include "mesh.h" #include "palette.h" -#include "spread.h" #include "startup.h" #include "lwtime.h" #include "config.h" @@ -74,17 +73,18 @@ /*==================================================================*/ /*------------------------------------------------------------------*/ -BITMAP * +ALLEGRO_BITMAP * create_gradient_bitmap (int team) { - BITMAP *result; + ALLEGRO_BITMAP *result; int x, y, i, color; MESH *temp; - result = my_create_bitmap (CURRENT_AREA_W, CURRENT_AREA_H); + result = my_create_memory_bitmap (CURRENT_AREA_W, CURRENT_AREA_H); if (result) { + al_set_target_bitmap (result); i = 0; for (y = 0; y < CURRENT_AREA_H; ++y) for (x = 0; x < CURRENT_AREA_W; ++x) @@ -93,10 +93,10 @@ create_gradient_bitmap (int team) { color = (temp->info[team].state.grad + AREA_START_GRADIENT) % COLORS_PER_TEAM; - putpixel (result, x, y, color + COLOR_FIRST_ENTRY[team]); + putpixel_fast (x, y, color + COLOR_FIRST_ENTRY[team]); } else - putpixel (result, x, y, MENU_BG); + putpixel_fast (x, y, MENU_BG); } } @@ -104,21 +104,22 @@ create_gradient_bitmap (int team) } /*------------------------------------------------------------------*/ -BITMAP * +ALLEGRO_BITMAP * create_dir_bitmap (int team) { - BITMAP *result; + ALLEGRO_BITMAP *result; int x, y, i; MESH *temp; - result = my_create_bitmap (CURRENT_AREA_W, CURRENT_AREA_H); + result = my_create_memory_bitmap (CURRENT_AREA_W, CURRENT_AREA_H); + al_set_target_bitmap (result); i = 0; for (y = 0; y < CURRENT_AREA_H; ++y) for (x = 0; x < CURRENT_AREA_W; ++x) { if ((temp = CURRENT_AREA[i++].mesh) != NULL) - putpixel (result, x, y, 134 + putpixel_fast (x, y, 134 + (temp->info[team].state.dir / 4) * 42 + (temp->info[team].state.dir % 4) * 10); } @@ -149,33 +150,6 @@ spread_single_gradient (void) case DIR_SW: pos = CURRENT_MESH; last = CURRENT_MESH + CURRENT_MESH_SIZE; -#ifdef ASM - if (STARTUP_ASM && LW_CONFIG_CURRENT_RULES.asm_algorithm) - switch (PLAYING_TEAMS) - { - case 6: - boost_gradient_down_6 - (pos, CURRENT_MESH_SIZE - 1, OFFSET_TO_FIRST_LINK + dir * 4); - break; - case 5: - boost_gradient_down_5 - (pos, CURRENT_MESH_SIZE - 1, OFFSET_TO_FIRST_LINK + dir * 4); - break; - case 4: - boost_gradient_down_4 - (pos, CURRENT_MESH_SIZE - 1, OFFSET_TO_FIRST_LINK + dir * 4); - break; - case 3: - boost_gradient_down_3 - (pos, CURRENT_MESH_SIZE - 1, OFFSET_TO_FIRST_LINK + dir * 4); - break; - default: - boost_gradient_down_2 - (pos, CURRENT_MESH_SIZE - 1, OFFSET_TO_FIRST_LINK + dir * 4); - break; - } - else -#endif while (pos != last) { for (i = 0; i < PLAYING_TEAMS; ++i) @@ -195,33 +169,6 @@ spread_single_gradient (void) case DIR_NE: pos = CURRENT_MESH + CURRENT_MESH_SIZE - 1; last = CURRENT_MESH - 1; -#ifdef ASM - if (STARTUP_ASM && LW_CONFIG_CURRENT_RULES.asm_algorithm) - switch (PLAYING_TEAMS) - { - case 6: - boost_gradient_up_6 - (pos, CURRENT_MESH_SIZE - 1, OFFSET_TO_FIRST_LINK + dir * 4); - break; - case 5: - boost_gradient_up_5 - (pos, CURRENT_MESH_SIZE - 1, OFFSET_TO_FIRST_LINK + dir * 4); - break; - case 4: - boost_gradient_up_4 - (pos, CURRENT_MESH_SIZE - 1, OFFSET_TO_FIRST_LINK + dir * 4); - break; - case 3: - boost_gradient_up_3 - (pos, CURRENT_MESH_SIZE - 1, OFFSET_TO_FIRST_LINK + dir * 4); - break; - default: - boost_gradient_up_2 - (pos, CURRENT_MESH_SIZE - 1, OFFSET_TO_FIRST_LINK + dir * 4); - break; - } - else -#endif while (pos != last) { for (i = 0; i < PLAYING_TEAMS; ++i) diff --git a/src/grad.h b/src/grad.h index 45a87568..a2321426 100644 --- a/src/grad.h +++ b/src/grad.h @@ -62,14 +62,14 @@ /* includes */ /*==================================================================*/ -#include +#include /*==================================================================*/ /* fonctions globales */ /*==================================================================*/ -BITMAP *create_gradient_bitmap (int team); -BITMAP *create_dir_bitmap (int team); +ALLEGRO_BITMAP *create_gradient_bitmap (int team); +ALLEGRO_BITMAP *create_dir_bitmap (int team); void spread_single_gradient (void); #endif diff --git a/src/graphics.c b/src/graphics.c index 7d9ff372..97f91587 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -63,6 +63,7 @@ #include "graphics.h" #include "help.h" #include "menu.h" +#include "mouse.h" #include "sound.h" #include "wave.h" #include "lang.h" @@ -251,16 +252,7 @@ graphic_options (void) d[11].proc = my_button_proc; d[11].dp = get_fullscreen_str (); -#ifdef DOS - /* - * Under DOS, fullscreen or windowed makes no sense, so we simply - * remove the button to avoid confusion. - */ - d[4].flags |= D_HIDDEN; - d[11].flags = D_EXIT | D_HIDDEN; -#else d[11].flags = D_EXIT; -#endif d[16].proc = my_button_proc; d[16].dp = get_page_flip_str (); @@ -284,7 +276,7 @@ graphic_options (void) else dp = my_init_dialog (d, choix); - show_mouse (screen); + lw_mouse_show (); while ((menu_res_changed == 0) && (game_res_changed == 0) && my_update_dialog (dp)) ; diff --git a/src/info.c b/src/info.c index c5056ef2..9a5c82dc 100644 --- a/src/info.c +++ b/src/info.c @@ -52,8 +52,9 @@ /* includes */ /*==================================================================*/ -#include +#include +#include "backport.h" #include "alleg2.h" #include "army.h" #include "back.h" @@ -77,8 +78,8 @@ #define INFO_BAR_W 50 #define INFO_BAR_H 15 -static BITMAP *INFO_BAR_BACK = NULL; -static BITMAP *INFO_BAR = NULL; +static ALLEGRO_BITMAP *INFO_BAR_BACK = NULL; +static ALLEGRO_BITMAP *INFO_BAR = NULL; static int INFO_BAR_POS_X[NB_TEAMS]; static int INFO_BAR_POS_Y[NB_TEAMS]; static int INFO_BAR_POS_W; @@ -97,12 +98,12 @@ int init_info_bar (int w, int h, int epaisseur) { int i, x, y; - BITMAP *front, *back; + ALLEGRO_BITMAP *front, *back; if (INFO_BAR) - destroy_bitmap (INFO_BAR); - INFO_BAR = my_create_bitmap (w, h); - INFO_BAR_BACK = my_create_bitmap (w, h); + al_destroy_bitmap (INFO_BAR); + INFO_BAR = my_create_memory_bitmap (w, h); + INFO_BAR_BACK = my_create_memory_bitmap (w, h); if (INFO_BAR && INFO_BAR_BACK) { @@ -120,12 +121,13 @@ init_info_bar (int w, int h, int epaisseur) LW_NETWORK_ON, LW_RANDOM_ON, CONFIG_USE_DEFAULT_TEXTURE); - for (y = 0; y < h; y += front->h) - for (x = epaisseur + 1; x < w; x += front->w) + for (y = 0; y < h; y += al_get_bitmap_height(front)) + for (x = epaisseur + 1; x < w; x += al_get_bitmap_width(front)) draw_sprite (INFO_BAR, front, x, y); INFO_BAR_POS_W = w - epaisseur - 5; INFO_BAR_POS_H = (h - 1) / PLAYING_TEAMS - 1; + al_set_target_bitmap (INFO_BAR); for (i = 0; i < PLAYING_TEAMS; ++i) { INFO_BAR_POS_X[i] = epaisseur + 3; @@ -137,14 +139,14 @@ init_info_bar (int w, int h, int epaisseur) y < INFO_BAR_POS_Y[i] + INFO_BAR_POS_H; y++) for (x = INFO_BAR_POS_X[i]; x < INFO_BAR_POS_X[i] + INFO_BAR_POS_W; x++) - putpixel (INFO_BAR, x, y, + putpixel_fast (x, y, getpixel (back, - (x - epaisseur - 1) % back->w, - y % back->h)); + (x - epaisseur - 1) % al_get_bitmap_width(back), + y % al_get_bitmap_height(back))); } - destroy_bitmap (back); - destroy_bitmap (front); + al_destroy_bitmap (back); + al_destroy_bitmap (front); } else { @@ -160,12 +162,13 @@ init_info_bar (int w, int h, int epaisseur) LW_NETWORK_ON, LW_RANDOM_ON, CONFIG_USE_DEFAULT_TEXTURE); - for (y = epaisseur + 1; y < h; y += front->h) - for (x = 0; x < w; x += front->w) + for (y = epaisseur + 1; y < h; y += al_get_bitmap_height(front)) + for (x = 0; x < w; x += al_get_bitmap_width(front)) draw_sprite (INFO_BAR, front, x, y); INFO_BAR_POS_W = (w - 1) / PLAYING_TEAMS - 1; INFO_BAR_POS_H = h - epaisseur - 5; + al_set_target_bitmap (INFO_BAR); for (i = 0; i < PLAYING_TEAMS; ++i) { INFO_BAR_POS_X[i] = (w + 1 - PLAYING_TEAMS @@ -177,14 +180,14 @@ init_info_bar (int w, int h, int epaisseur) y < INFO_BAR_POS_Y[i] + INFO_BAR_POS_H; y++) for (x = INFO_BAR_POS_X[i]; x < INFO_BAR_POS_X[i] + INFO_BAR_POS_W; x++) - putpixel (INFO_BAR, x, y, + putpixel_fast (x, y, getpixel (back, - x % back->w, - (y - epaisseur - 1) % back->h)); + x % al_get_bitmap_width(back), + (y - epaisseur - 1) % al_get_bitmap_height(back))); } - destroy_bitmap (back); - destroy_bitmap (front); + al_destroy_bitmap (back); + al_destroy_bitmap (front); } draw_sprite (INFO_BAR_BACK, INFO_BAR, 0, 0); } @@ -197,12 +200,12 @@ free_info_bar (void) { if (INFO_BAR) { - destroy_bitmap (INFO_BAR); + al_destroy_bitmap (INFO_BAR); INFO_BAR = NULL; } if (INFO_BAR_BACK) { - destroy_bitmap (INFO_BAR_BACK); + al_destroy_bitmap (INFO_BAR_BACK); INFO_BAR_BACK = NULL; } } @@ -423,7 +426,7 @@ check_info_state (void) { static int changed; - if (WATCHDOG_SCANCODE[KEY_F1]) + if (WATCHDOG_SCANCODE[ALLEGRO_KEY_F1]) { if (CONFIG_INFO_BAR >= 4) CONFIG_INFO_BAR -= 4; @@ -433,7 +436,7 @@ check_info_state (void) changed = CONFIG_PAGE_FLIP ? 2 : 1; lw_viewport_register_change (changed); } - if (WATCHDOG_SCANCODE[KEY_F2] && CONFIG_INFO_BAR < 4) + if (WATCHDOG_SCANCODE[ALLEGRO_KEY_F2] && CONFIG_INFO_BAR < 4) { CONFIG_INFO_BAR++; if (CONFIG_INFO_BAR == 4) diff --git a/src/init.c b/src/init.c index 98422135..a3d2aa2d 100644 --- a/src/init.c +++ b/src/init.c @@ -52,12 +52,11 @@ /* includes */ /*==================================================================*/ -#include +#include #include -#ifdef DOS -#include -#endif +#include +#include "backport.h" #include "base.h" #include "initrand.h" #include "config.h" @@ -70,7 +69,6 @@ #include "ticker.h" #include "sockgen.h" #include "lang.h" -#include "asm.h" #include "capture.h" /*==================================================================*/ @@ -113,7 +111,7 @@ int init_all () { int result = 0; - int graphics = 1, assembly = 1, config = 1, timer = 1, keyboard = 1, + int graphics = 1, config = 1, timer = 1, keyboard = 1, mouse = 1, sound = 1, joystick = 1, network = 1; /* @@ -126,7 +124,7 @@ init_all () lw_lang_init (); set_uformat (U_ASCII); - log_print_str ("Starting Allegro (http://www.talula.demon.co.uk/allegro)"); + log_print_str ("Starting Allegro (https://liballeg.org/)"); display_success (graphics = !allegro_init ()); log_println (); @@ -134,9 +132,6 @@ init_all () { LW_INIT_ALLEGRO_OK = 1; -#ifdef DOS - set_gfx_mode (GFX_TEXT, 0, 0, 0, 0); -#endif log_print_str ("Allegro ID : "); log_println_str (allegro_id); log_println (); @@ -144,11 +139,6 @@ init_all () set_color_depth (8); set_color_conversion (COLORCONV_REDUCE_TO_256); - /* - * We check for potential struct size errors - */ - assembly = lw_asm_check_struct_align (); - log_print_str ("Loading config options from \""); log_print_str (STARTUP_CFG_PATH); log_print_str ("\""); @@ -246,7 +236,6 @@ init_all () } result = graphics - && (assembly || !STARTUP_CHECK) && timer && keyboard && mouse && (sound || !STARTUP_CHECK) && (joystick || !STARTUP_CHECK); diff --git a/src/joystick.c b/src/joystick.c index 7a5c3f6d..3bed6112 100644 --- a/src/joystick.c +++ b/src/joystick.c @@ -52,8 +52,7 @@ /* includes */ /*==================================================================*/ -#include - +#include "backport.h" #include "config.h" #include "joystick.h" #include "startup.h" @@ -249,7 +248,7 @@ my_poll_joystick (void) { JOY2_MIN_X = MIN (joy[1].stick[0].axis[0].pos, JOY2_MIN_X); JOY2_MAX_X = MAX (joy[1].stick[0].axis[0].pos, JOY2_MAX_X); - JOY2_MID_Y = (JOY2_MIN_X + JOY2_MAX_X) / 2; + JOY2_MID_X = (JOY2_MIN_X + JOY2_MAX_X) / 2; JOY2_MIN_Y = MIN (joy[1].stick[0].axis[1].pos, JOY2_MIN_Y); JOY2_MAX_Y = MAX (joy[1].stick[0].axis[1].pos, JOY2_MAX_Y); JOY2_MID_Y = (JOY2_MIN_Y + JOY2_MAX_Y) / 2; @@ -268,7 +267,7 @@ my_poll_joystick (void) (JOY2_MIN_X + 2 * JOY2_MID_X) / 3) ? 1 : 0; } } - if (joy[0].num_buttons >= 2) + if (joy[1].num_buttons >= 2) { JOYSTICK_CONTROL_JOY2_B1 = joy[1].button[0].b; JOYSTICK_CONTROL_JOY2_B2 = joy[1].button[1].b; diff --git a/src/keyboard.c b/src/keyboard.c index f4ad7d0d..76cb8735 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -52,8 +52,7 @@ /* includes */ /*==================================================================*/ -#include - +#include "backport.h" #include "config.h" #include "joystick.h" #include "keyboard.h" diff --git a/src/lang.h b/src/lang.h index 089bfc30..8841af96 100644 --- a/src/lang.h +++ b/src/lang.h @@ -90,206 +90,202 @@ #define LW_LANG_STRING_MENU_OPTIONS 10 #define LW_LANG_STRING_MENU_ABOUT 11 #define LW_LANG_STRING_MENU_EXIT 12 -#define LW_LANG_STRING_MENU_EXITDOS 13 -#define LW_LANG_STRING_MENU_EXITWINDOWS 14 -#define LW_LANG_STRING_MENU_EXITUNIX 15 -#define LW_LANG_STRING_MENU_BACK 16 - -#define LW_LANG_STRING_DIALOG_QUIT 17 -#define LW_LANG_STRING_DIALOG_BACK 18 -#define LW_LANG_STRING_DIALOG_PLAY 19 -#define LW_LANG_STRING_DIALOG_MAIN 20 - -#define LW_LANG_STRING_PLAY_GETREADY 21 - -#define LW_LANG_STRING_NETGAME_STARTGAME 22 -#define LW_LANG_STRING_NETGAME_SERVERADDR 23 -#define LW_LANG_STRING_NETGAME_SERVERPORT 24 -#define LW_LANG_STRING_NETGAME_SEARCH 25 -#define LW_LANG_STRING_NETGAME_PASSWORD 26 -#define LW_LANG_STRING_NETGAME_WEAKPASSWORD 27 - -#define LW_LANG_STRING_LANGUAGE_AUTO 28 - -#define LW_LANG_STRING_TEAM_OFF 29 -#define LW_LANG_STRING_TEAM_HUMAN 30 -#define LW_LANG_STRING_TEAM_CPU 31 - -#define LW_LANG_STRING_OPTIONS_GRAPHICS 32 -#define LW_LANG_STRING_OPTIONS_SOUND 33 -#define LW_LANG_STRING_OPTIONS_RULES 34 -#define LW_LANG_STRING_OPTIONS_SPEEDS 35 -#define LW_LANG_STRING_OPTIONS_CONTROLS 36 -#define LW_LANG_STRING_OPTIONS_LANGUAGE 37 -#define LW_LANG_STRING_OPTIONS_DEFAULT 38 - -#define LW_LANG_STRING_GRAPHICS_GAME 39 -#define LW_LANG_STRING_GRAPHICS_MENU 40 -#define LW_LANG_STRING_GRAPHICS_ON 41 -#define LW_LANG_STRING_GRAPHICS_OFF 42 -#define LW_LANG_STRING_GRAPHICS_FULLSCREEN 43 -#define LW_LANG_STRING_GRAPHICS_WINDOWED 44 -#define LW_LANG_STRING_GRAPHICS_ADVANCED 45 -#define LW_LANG_STRING_GRAPHICS_VIDEOMODE 46 -#define LW_LANG_STRING_GRAPHICS_BRIGHTNESS 47 -#define LW_LANG_STRING_GRAPHICS_VIEWPORTSIZE 48 -#define LW_LANG_STRING_GRAPHICS_PAGEFLIPPING 49 -#define LW_LANG_STRING_GRAPHICS_WAVES 50 - -#define LW_LANG_STRING_VOLUME_SFX 51 -#define LW_LANG_STRING_VOLUME_CLICK 52 -#define LW_LANG_STRING_VOLUME_GAMEWATER 53 -#define LW_LANG_STRING_VOLUME_MENUWATER 54 -#define LW_LANG_STRING_VOLUME_MUSIC 55 - -#define LW_LANG_STRING_RULES_TIME 56 -#define LW_LANG_STRING_RULES_ADVANCED 57 -#define LW_LANG_STRING_RULES_ARMYSIZE 58 -#define LW_LANG_STRING_RULES_CURSOR 59 -#define LW_LANG_STRING_RULES_DEFAULT 60 -#define LW_LANG_STRING_RULES_MINMAPRES 61 - -#define LW_LANG_STRING_ADVANCED_ATTACK 62 -#define LW_LANG_STRING_ADVANCED_DEFENSE 63 -#define LW_LANG_STRING_ADVANCED_BASEHEALTH 64 -#define LW_LANG_STRING_ADVANCED_WINNERHELP 65 -#define LW_LANG_STRING_ADVANCED_CPUSTRENGTH 66 -#define LW_LANG_STRING_ADVANCED_CPUVSHUMAN 67 -#define LW_LANG_STRING_ADVANCED_ALWAYS 68 -#define LW_LANG_STRING_ADVANCED_RANDOM 69 -#define LW_LANG_STRING_ADVANCED_NEVER 70 -#define LW_LANG_STRING_ADVANCED_ASMALGORITHM 71 -#define LW_LANG_STRING_ADVANCED_ASSEMBLY 72 -#define LW_LANG_STRING_ADVANCED_STANDARDC 73 -#define LW_LANG_STRING_ADVANCED_ALLOWNETWORKBOTS 74 -#define LW_LANG_STRING_ADVANCED_YES 75 -#define LW_LANG_STRING_ADVANCED_NO 76 - -#define LW_LANG_STRING_SPEEDS_FPS 77 -#define LW_LANG_STRING_SPEEDS_NOFPSLIMIT 78 -#define LW_LANG_STRING_SPEEDS_RPS 79 -#define LW_LANG_STRING_SPEEDS_NORPSLIMIT 80 - -#define LW_LANG_STRING_CONTROLS_JOYSTICK 81 -#define LW_LANG_STRING_CONTROLS_OFF 82 -#define LW_LANG_STRING_CONTROLS_2JOYSTICKS 83 -#define LW_LANG_STRING_CONTROLS_4BUTTONS 84 -#define LW_LANG_STRING_CONTROLS_STANDARD 85 -#define LW_LANG_STRING_CONTROLS_MOUSESENSIB 86 - -#define LW_LANG_STRING_ABOUT_CREDITS 87 -#define LW_LANG_STRING_ABOUT_COPYRIGHT 88 -#define LW_LANG_STRING_ABOUT_LICENSE 89 -#define LW_LANG_STRING_ABOUT_VERSION 90 - -#define LW_LANG_STRING_INTERNET_REFRESH 91 -#define LW_LANG_STRING_INTERNET_JOINNOW 92 -#define LW_LANG_STRING_INTERNET_PORT 93 -#define LW_LANG_STRING_INTERNET_PASSWORD 94 -#define LW_LANG_STRING_INTERNET_YES 95 -#define LW_LANG_STRING_INTERNET_NO 96 -#define LW_LANG_STRING_INTERNET_UPTIME 97 -#define LW_LANG_STRING_INTERNET_DAYS 98 -#define LW_LANG_STRING_INTERNET_DAY 99 -#define LW_LANG_STRING_INTERNET_HOURS 100 -#define LW_LANG_STRING_INTERNET_MINUTES 101 -#define LW_LANG_STRING_INTERNET_SECONDS 102 -#define LW_LANG_STRING_INTERNET_UNREACHABLE 103 -#define LW_LANG_STRING_INTERNET_PING 104 -#define LW_LANG_STRING_INTERNET_MSEC 105 - -#define LW_LANG_STRING_WAVE_AMPLI 106 -#define LW_LANG_STRING_WAVE_NUMBER 107 -#define LW_LANG_STRING_WAVE_SPEED 108 -#define LW_LANG_STRING_WAVE_WX 109 -#define LW_LANG_STRING_WAVE_HY 110 -#define LW_LANG_STRING_WAVE_WY 111 -#define LW_LANG_STRING_WAVE_HX 112 - -#define LW_LANG_STRING_CONNECT_STARTNOW 113 -#define LW_LANG_STRING_CONNECT_WAITING 114 -#define LW_LANG_STRING_CONNECT_WAITINGFOR 115 -#define LW_LANG_STRING_CONNECT_TEAMS 116 -#define LW_LANG_STRING_CONNECT_SENDMESSAGE 117 - -#define LW_LANG_STRING_NETPLAY_CONNECT 118 -#define LW_LANG_STRING_NETPLAY_PING 119 -#define LW_LANG_STRING_NETPLAY_CHECKPROGRAM 120 -#define LW_LANG_STRING_NETPLAY_CHECKVERSION 121 -#define LW_LANG_STRING_NETPLAY_SENDPASSWORD 122 -#define LW_LANG_STRING_NETPLAY_FREETEAMS 123 -#define LW_LANG_STRING_NETPLAY_RESERVETEAMS 124 -#define LW_LANG_STRING_NETPLAY_SENDCONFIG 125 -#define LW_LANG_STRING_NETPLAY_SENDMAP 126 -#define LW_LANG_STRING_NETPLAY_WAITING 127 -#define LW_LANG_STRING_NETPLAY_WHOPLAYS 128 -#define LW_LANG_STRING_NETPLAY_RECVCONFIG 129 -#define LW_LANG_STRING_NETPLAY_RECVMAP 130 - -#define LW_LANG_STRING_LEVEL_USEDEFAULTTEXTURE 131 -#define LW_LANG_STRING_LEVEL_ON 132 -#define LW_LANG_STRING_LEVEL_OFF 133 -#define LW_LANG_STRING_LEVEL_RANDOMMAP 134 - -#define LW_LANG_STRING_CODE_FPS 135 -#define LW_LANG_STRING_CODE_RPS 136 -#define LW_LANG_STRING_CODE_PERCENTCALC 137 -#define LW_LANG_STRING_CODE_PERCENTDISPLAY 138 -#define LW_LANG_STRING_CODE_SPREADGRADTIME 139 -#define LW_LANG_STRING_CODE_MOVEARMYTIME 140 -#define LW_LANG_STRING_CODE_DISPLAYTIME 141 -#define LW_LANG_STRING_CODE_FLIPTIME 142 -#define LW_LANG_STRING_CODE_OTHERCALCTIME 143 -#define LW_LANG_STRING_CODE_GLOBALTIME 144 -#define LW_LANG_STRING_CODE_STANDARDDISPLAY 145 -#define LW_LANG_STRING_CODE_GRADIENT1 146 -#define LW_LANG_STRING_CODE_GRADIENT2 147 -#define LW_LANG_STRING_CODE_GRADIENT3 148 -#define LW_LANG_STRING_CODE_GRADIENT4 149 -#define LW_LANG_STRING_CODE_GRADIENT5 150 -#define LW_LANG_STRING_CODE_GRADIENT6 151 -#define LW_LANG_STRING_CODE_MESHSIZE 152 -#define LW_LANG_STRING_CODE_MESHSTRUCTURE 153 -#define LW_LANG_STRING_CODE_PAUSEOFF 154 -#define LW_LANG_STRING_CODE_PAUSEON 155 -#define LW_LANG_STRING_CODE_WAVEEFFECTSOFF 156 -#define LW_LANG_STRING_CODE_WAVEEFFECTSON 157 -#define LW_LANG_STRING_CODE_CAPTUREOFF 158 -#define LW_LANG_STRING_CODE_CAPTUREON 159 - -#define LW_LANG_STRING_SCORE_WINNER 160 - -#define LW_LANG_STRING_GAME_BACKMEMFAIL 161 -#define LW_LANG_STRING_GAME_DISPMEMFAIL 162 -#define LW_LANG_STRING_GAME_MESHMEMFAIL 163 -#define LW_LANG_STRING_GAME_AREAMEMFAIL 164 -#define LW_LANG_STRING_GAME_ARMYMEMFAIL 165 - -#define LW_LANG_STRING_ERROR_NOTENOUGHTEAMS 166 -#define LW_LANG_STRING_ERROR_NOTENOUGHBIGDATA 167 -#define LW_LANG_STRING_ERROR_GRAPHICSINITFAILED 168 -#define LW_LANG_STRING_ERROR_NONETWORKSUPPORT 169 -#define LW_LANG_STRING_ERROR_UNABLETOCONNECT 170 -#define LW_LANG_STRING_ERROR_NOTALIQUIDWARSERVER 171 -#define LW_LANG_STRING_ERROR_WRONGVERSION 172 -#define LW_LANG_STRING_ERROR_NETWORKPROBLEM 173 -#define LW_LANG_STRING_ERROR_CANTSENDMAP 174 -#define LW_LANG_STRING_ERROR_CANTRECEIVEMAP 175 -#define LW_LANG_STRING_ERROR_SERVERFULL 176 -#define LW_LANG_STRING_ERROR_BADPASSWORD 177 -#define LW_LANG_STRING_ERROR_BADCONFIGRANGE 178 - -#define LW_LANG_STRING_POPUP_INITFAIL 179 -#define LW_LANG_STRING_POPUP_MEMTROUBLE 180 -#define LW_LANG_STRING_POPUP_BIGDATA 181 -#define LW_LANG_STRING_POPUP_LOADFAIL 182 -#define LW_LANG_STRING_POPUP_CUSTOMFAIL 183 -#define LW_LANG_STRING_POPUP_GRAPHICSFAIL 184 - -#define LW_LANG_STRING_LW6_INFO 185 -#define LW_LANG_STRING_LW6_OK 186 - -#define LW_LANG_NB_STRINGS 187 +#define LW_LANG_STRING_MENU_EXITWINDOWS 13 +#define LW_LANG_STRING_MENU_EXITUNIX 14 +#define LW_LANG_STRING_MENU_BACK 15 + +#define LW_LANG_STRING_DIALOG_QUIT 16 +#define LW_LANG_STRING_DIALOG_BACK 17 +#define LW_LANG_STRING_DIALOG_PLAY 18 +#define LW_LANG_STRING_DIALOG_MAIN 19 + +#define LW_LANG_STRING_PLAY_GETREADY 20 + +#define LW_LANG_STRING_NETGAME_STARTGAME 21 +#define LW_LANG_STRING_NETGAME_SERVERADDR 22 +#define LW_LANG_STRING_NETGAME_SERVERPORT 23 +#define LW_LANG_STRING_NETGAME_SEARCH 24 +#define LW_LANG_STRING_NETGAME_PASSWORD 25 +#define LW_LANG_STRING_NETGAME_WEAKPASSWORD 26 + +#define LW_LANG_STRING_LANGUAGE_AUTO 27 + +#define LW_LANG_STRING_TEAM_OFF 28 +#define LW_LANG_STRING_TEAM_HUMAN 29 +#define LW_LANG_STRING_TEAM_CPU 30 + +#define LW_LANG_STRING_OPTIONS_GRAPHICS 31 +#define LW_LANG_STRING_OPTIONS_SOUND 32 +#define LW_LANG_STRING_OPTIONS_RULES 33 +#define LW_LANG_STRING_OPTIONS_SPEEDS 34 +#define LW_LANG_STRING_OPTIONS_CONTROLS 35 +#define LW_LANG_STRING_OPTIONS_LANGUAGE 36 +#define LW_LANG_STRING_OPTIONS_DEFAULT 37 + +#define LW_LANG_STRING_GRAPHICS_GAME 38 +#define LW_LANG_STRING_GRAPHICS_MENU 39 +#define LW_LANG_STRING_GRAPHICS_ON 40 +#define LW_LANG_STRING_GRAPHICS_OFF 41 +#define LW_LANG_STRING_GRAPHICS_FULLSCREEN 42 +#define LW_LANG_STRING_GRAPHICS_WINDOWED 43 +#define LW_LANG_STRING_GRAPHICS_ADVANCED 44 +#define LW_LANG_STRING_GRAPHICS_VIDEOMODE 45 +#define LW_LANG_STRING_GRAPHICS_BRIGHTNESS 46 +#define LW_LANG_STRING_GRAPHICS_VIEWPORTSIZE 47 +#define LW_LANG_STRING_GRAPHICS_PAGEFLIPPING 48 +#define LW_LANG_STRING_GRAPHICS_WAVES 49 + +#define LW_LANG_STRING_VOLUME_SFX 50 +#define LW_LANG_STRING_VOLUME_CLICK 51 +#define LW_LANG_STRING_VOLUME_GAMEWATER 52 +#define LW_LANG_STRING_VOLUME_MENUWATER 53 +#define LW_LANG_STRING_VOLUME_MUSIC 54 + +#define LW_LANG_STRING_RULES_TIME 55 +#define LW_LANG_STRING_RULES_ADVANCED 56 +#define LW_LANG_STRING_RULES_ARMYSIZE 57 +#define LW_LANG_STRING_RULES_CURSOR 58 +#define LW_LANG_STRING_RULES_DEFAULT 59 +#define LW_LANG_STRING_RULES_MINMAPRES 60 + +#define LW_LANG_STRING_ADVANCED_ATTACK 61 +#define LW_LANG_STRING_ADVANCED_DEFENSE 62 +#define LW_LANG_STRING_ADVANCED_BASEHEALTH 63 +#define LW_LANG_STRING_ADVANCED_WINNERHELP 64 +#define LW_LANG_STRING_ADVANCED_CPUSTRENGTH 65 +#define LW_LANG_STRING_ADVANCED_CPUVSHUMAN 66 +#define LW_LANG_STRING_ADVANCED_ALWAYS 67 +#define LW_LANG_STRING_ADVANCED_RANDOM 68 +#define LW_LANG_STRING_ADVANCED_NEVER 69 +#define LW_LANG_STRING_ADVANCED_ALLOWNETWORKBOTS 70 +#define LW_LANG_STRING_ADVANCED_YES 71 +#define LW_LANG_STRING_ADVANCED_NO 72 + +#define LW_LANG_STRING_SPEEDS_FPS 73 +#define LW_LANG_STRING_SPEEDS_NOFPSLIMIT 74 +#define LW_LANG_STRING_SPEEDS_RPS 75 +#define LW_LANG_STRING_SPEEDS_NORPSLIMIT 76 + +#define LW_LANG_STRING_CONTROLS_JOYSTICK 77 +#define LW_LANG_STRING_CONTROLS_OFF 78 +#define LW_LANG_STRING_CONTROLS_2JOYSTICKS 79 +#define LW_LANG_STRING_CONTROLS_4BUTTONS 80 +#define LW_LANG_STRING_CONTROLS_STANDARD 81 +#define LW_LANG_STRING_CONTROLS_MOUSESENSIB 82 + +#define LW_LANG_STRING_ABOUT_CREDITS 83 +#define LW_LANG_STRING_ABOUT_COPYRIGHT 84 +#define LW_LANG_STRING_ABOUT_LICENSE 85 +#define LW_LANG_STRING_ABOUT_VERSION 86 + +#define LW_LANG_STRING_INTERNET_REFRESH 87 +#define LW_LANG_STRING_INTERNET_JOINNOW 88 +#define LW_LANG_STRING_INTERNET_PORT 89 +#define LW_LANG_STRING_INTERNET_PASSWORD 90 +#define LW_LANG_STRING_INTERNET_YES 91 +#define LW_LANG_STRING_INTERNET_NO 92 +#define LW_LANG_STRING_INTERNET_UPTIME 93 +#define LW_LANG_STRING_INTERNET_DAYS 94 +#define LW_LANG_STRING_INTERNET_DAY 95 +#define LW_LANG_STRING_INTERNET_HOURS 96 +#define LW_LANG_STRING_INTERNET_MINUTES 97 +#define LW_LANG_STRING_INTERNET_SECONDS 98 +#define LW_LANG_STRING_INTERNET_UNREACHABLE 99 +#define LW_LANG_STRING_INTERNET_PING 100 +#define LW_LANG_STRING_INTERNET_MSEC 101 + +#define LW_LANG_STRING_WAVE_AMPLI 102 +#define LW_LANG_STRING_WAVE_NUMBER 103 +#define LW_LANG_STRING_WAVE_SPEED 104 +#define LW_LANG_STRING_WAVE_WX 105 +#define LW_LANG_STRING_WAVE_HY 106 +#define LW_LANG_STRING_WAVE_WY 107 +#define LW_LANG_STRING_WAVE_HX 108 + +#define LW_LANG_STRING_CONNECT_STARTNOW 109 +#define LW_LANG_STRING_CONNECT_WAITING 110 +#define LW_LANG_STRING_CONNECT_WAITINGFOR 111 +#define LW_LANG_STRING_CONNECT_TEAMS 112 +#define LW_LANG_STRING_CONNECT_SENDMESSAGE 113 + +#define LW_LANG_STRING_NETPLAY_CONNECT 114 +#define LW_LANG_STRING_NETPLAY_PING 115 +#define LW_LANG_STRING_NETPLAY_CHECKPROGRAM 116 +#define LW_LANG_STRING_NETPLAY_CHECKVERSION 117 +#define LW_LANG_STRING_NETPLAY_SENDPASSWORD 118 +#define LW_LANG_STRING_NETPLAY_FREETEAMS 119 +#define LW_LANG_STRING_NETPLAY_RESERVETEAMS 120 +#define LW_LANG_STRING_NETPLAY_SENDCONFIG 121 +#define LW_LANG_STRING_NETPLAY_SENDMAP 122 +#define LW_LANG_STRING_NETPLAY_WAITING 123 +#define LW_LANG_STRING_NETPLAY_WHOPLAYS 124 +#define LW_LANG_STRING_NETPLAY_RECVCONFIG 125 +#define LW_LANG_STRING_NETPLAY_RECVMAP 126 + +#define LW_LANG_STRING_LEVEL_USEDEFAULTTEXTURE 127 +#define LW_LANG_STRING_LEVEL_ON 128 +#define LW_LANG_STRING_LEVEL_OFF 129 +#define LW_LANG_STRING_LEVEL_RANDOMMAP 130 + +#define LW_LANG_STRING_CODE_FPS 131 +#define LW_LANG_STRING_CODE_RPS 132 +#define LW_LANG_STRING_CODE_PERCENTCALC 133 +#define LW_LANG_STRING_CODE_PERCENTDISPLAY 134 +#define LW_LANG_STRING_CODE_SPREADGRADTIME 135 +#define LW_LANG_STRING_CODE_MOVEARMYTIME 136 +#define LW_LANG_STRING_CODE_DISPLAYTIME 137 +#define LW_LANG_STRING_CODE_FLIPTIME 138 +#define LW_LANG_STRING_CODE_OTHERCALCTIME 139 +#define LW_LANG_STRING_CODE_GLOBALTIME 140 +#define LW_LANG_STRING_CODE_STANDARDDISPLAY 141 +#define LW_LANG_STRING_CODE_GRADIENT1 142 +#define LW_LANG_STRING_CODE_GRADIENT2 143 +#define LW_LANG_STRING_CODE_GRADIENT3 144 +#define LW_LANG_STRING_CODE_GRADIENT4 145 +#define LW_LANG_STRING_CODE_GRADIENT5 146 +#define LW_LANG_STRING_CODE_GRADIENT6 147 +#define LW_LANG_STRING_CODE_MESHSIZE 148 +#define LW_LANG_STRING_CODE_MESHSTRUCTURE 149 +#define LW_LANG_STRING_CODE_PAUSEOFF 150 +#define LW_LANG_STRING_CODE_PAUSEON 151 +#define LW_LANG_STRING_CODE_WAVEEFFECTSOFF 152 +#define LW_LANG_STRING_CODE_WAVEEFFECTSON 153 +#define LW_LANG_STRING_CODE_CAPTUREOFF 154 +#define LW_LANG_STRING_CODE_CAPTUREON 155 + +#define LW_LANG_STRING_SCORE_WINNER 156 + +#define LW_LANG_STRING_GAME_BACKMEMFAIL 157 +#define LW_LANG_STRING_GAME_DISPMEMFAIL 158 +#define LW_LANG_STRING_GAME_MESHMEMFAIL 159 +#define LW_LANG_STRING_GAME_AREAMEMFAIL 160 +#define LW_LANG_STRING_GAME_ARMYMEMFAIL 161 + +#define LW_LANG_STRING_ERROR_NOTENOUGHTEAMS 162 +#define LW_LANG_STRING_ERROR_NOTENOUGHBIGDATA 163 +#define LW_LANG_STRING_ERROR_GRAPHICSINITFAILED 164 +#define LW_LANG_STRING_ERROR_NONETWORKSUPPORT 165 +#define LW_LANG_STRING_ERROR_UNABLETOCONNECT 166 +#define LW_LANG_STRING_ERROR_NOTALIQUIDWARSERVER 167 +#define LW_LANG_STRING_ERROR_WRONGVERSION 168 +#define LW_LANG_STRING_ERROR_NETWORKPROBLEM 169 +#define LW_LANG_STRING_ERROR_CANTSENDMAP 170 +#define LW_LANG_STRING_ERROR_CANTRECEIVEMAP 171 +#define LW_LANG_STRING_ERROR_SERVERFULL 172 +#define LW_LANG_STRING_ERROR_BADPASSWORD 173 +#define LW_LANG_STRING_ERROR_BADCONFIGRANGE 174 + +#define LW_LANG_STRING_POPUP_INITFAIL 175 +#define LW_LANG_STRING_POPUP_MEMTROUBLE 176 +#define LW_LANG_STRING_POPUP_BIGDATA 177 +#define LW_LANG_STRING_POPUP_LOADFAIL 178 +#define LW_LANG_STRING_POPUP_CUSTOMFAIL 179 +#define LW_LANG_STRING_POPUP_GRAPHICSFAIL 180 + +#define LW_LANG_STRING_LW6_INFO 181 +#define LW_LANG_STRING_LW6_OK 182 + +#define LW_LANG_NB_STRINGS 183 /*==================================================================*/ /* globals */ diff --git a/src/langde.c b/src/langde.c index c1bb6cf3..57732be2 100644 --- a/src/langde.c +++ b/src/langde.c @@ -123,7 +123,6 @@ lw_langde_init () LW_LANGDE_DATA[LW_LANG_STRING_MENU_OPTIONS] = "Optionen"; LW_LANGDE_DATA[LW_LANG_STRING_MENU_ABOUT] = "Informationen"; LW_LANGDE_DATA[LW_LANG_STRING_MENU_EXIT] = "Quit"; - LW_LANGDE_DATA[LW_LANG_STRING_MENU_EXITDOS] = "Exit"; LW_LANGDE_DATA[LW_LANG_STRING_MENU_EXITWINDOWS] = "Quit"; LW_LANGDE_DATA[LW_LANG_STRING_MENU_EXITUNIX] = "Quit"; LW_LANGDE_DATA[LW_LANG_STRING_MENU_BACK] = "Zurueck zu LW"; @@ -192,9 +191,6 @@ lw_langde_init () LW_LANGDE_DATA[LW_LANG_STRING_ADVANCED_ALWAYS] = "Immer"; LW_LANGDE_DATA[LW_LANG_STRING_ADVANCED_RANDOM] = "Normal"; LW_LANGDE_DATA[LW_LANG_STRING_ADVANCED_NEVER] = "Nie"; - LW_LANGDE_DATA[LW_LANG_STRING_ADVANCED_ASMALGORITHM] = "Algorithmus"; - LW_LANGDE_DATA[LW_LANG_STRING_ADVANCED_ASSEMBLY] = "Assembly"; - LW_LANGDE_DATA[LW_LANG_STRING_ADVANCED_STANDARDC] = "C-Standard"; LW_LANGDE_DATA[LW_LANG_STRING_ADVANCED_ALLOWNETWORKBOTS] = "Netzbots"; LW_LANGDE_DATA[LW_LANG_STRING_ADVANCED_YES] = "An"; LW_LANGDE_DATA[LW_LANG_STRING_ADVANCED_NO] = "Aus"; diff --git a/src/langdk.c b/src/langdk.c index 65896297..fd9a0c5c 100644 --- a/src/langdk.c +++ b/src/langdk.c @@ -104,7 +104,6 @@ lw_langdk_init () LW_LANGDK_DATA[LW_LANG_STRING_MENU_OPTIONS] = "Indstillinger"; LW_LANGDK_DATA[LW_LANG_STRING_MENU_ABOUT] = "Om spillet"; LW_LANGDK_DATA[LW_LANG_STRING_MENU_EXIT] = "Afslut"; - LW_LANGDK_DATA[LW_LANG_STRING_MENU_EXITDOS] = "Ud til DOS"; LW_LANGDK_DATA[LW_LANG_STRING_MENU_EXITWINDOWS] = "Afslut"; LW_LANGDK_DATA[LW_LANG_STRING_MENU_EXITUNIX] = "Afslut"; LW_LANGDK_DATA[LW_LANG_STRING_MENU_BACK] = "Tilbage til LW"; @@ -173,9 +172,6 @@ lw_langdk_init () LW_LANGDK_DATA[LW_LANG_STRING_ADVANCED_ALWAYS] = "Altid"; LW_LANGDK_DATA[LW_LANG_STRING_ADVANCED_RANDOM] = "Tilfaeldigt"; LW_LANGDK_DATA[LW_LANG_STRING_ADVANCED_NEVER] = "Aldrig"; - LW_LANGDK_DATA[LW_LANG_STRING_ADVANCED_ASMALGORITHM] = "Algoritme"; - LW_LANGDK_DATA[LW_LANG_STRING_ADVANCED_ASSEMBLY] = "Assembly"; - LW_LANGDK_DATA[LW_LANG_STRING_ADVANCED_STANDARDC] = "Standard C"; LW_LANGDK_DATA[LW_LANG_STRING_ADVANCED_ALLOWNETWORKBOTS] = "Bots i netspil"; LW_LANGDK_DATA[LW_LANG_STRING_ADVANCED_YES] = "Ja"; LW_LANGDK_DATA[LW_LANG_STRING_ADVANCED_NO] = "Nej"; diff --git a/src/langen.c b/src/langen.c index 0901a80c..8822feb1 100644 --- a/src/langen.c +++ b/src/langen.c @@ -97,7 +97,6 @@ lw_langen_init () LW_LANGEN_DATA[LW_LANG_STRING_MENU_OPTIONS] = "Options"; LW_LANGEN_DATA[LW_LANG_STRING_MENU_ABOUT] = "About"; LW_LANGEN_DATA[LW_LANG_STRING_MENU_EXIT] = "Exit"; - LW_LANGEN_DATA[LW_LANG_STRING_MENU_EXITDOS] = "Exit to DOS"; LW_LANGEN_DATA[LW_LANG_STRING_MENU_EXITWINDOWS] = "Exit"; LW_LANGEN_DATA[LW_LANG_STRING_MENU_EXITUNIX] = "Exit"; LW_LANGEN_DATA[LW_LANG_STRING_MENU_BACK] = "Back to LW"; @@ -166,9 +165,6 @@ lw_langen_init () LW_LANGEN_DATA[LW_LANG_STRING_ADVANCED_ALWAYS] = "Always"; LW_LANGEN_DATA[LW_LANG_STRING_ADVANCED_RANDOM] = "Random"; LW_LANGEN_DATA[LW_LANG_STRING_ADVANCED_NEVER] = "Never"; - LW_LANGEN_DATA[LW_LANG_STRING_ADVANCED_ASMALGORITHM] = "Algorithm"; - LW_LANGEN_DATA[LW_LANG_STRING_ADVANCED_ASSEMBLY] = "Assembly"; - LW_LANGEN_DATA[LW_LANG_STRING_ADVANCED_STANDARDC] = "Standard C"; LW_LANGEN_DATA[LW_LANG_STRING_ADVANCED_ALLOWNETWORKBOTS] = "Allow net bots"; LW_LANGEN_DATA[LW_LANG_STRING_ADVANCED_YES] = "Yes"; LW_LANGEN_DATA[LW_LANG_STRING_ADVANCED_NO] = "No"; diff --git a/src/langfr.c b/src/langfr.c index b481b838..01a667d0 100644 --- a/src/langfr.c +++ b/src/langfr.c @@ -116,7 +116,6 @@ lw_langfr_init () LW_LANGFR_DATA[LW_LANG_STRING_MENU_OPTIONS] = "Options"; LW_LANGFR_DATA[LW_LANG_STRING_MENU_ABOUT] = "A propos"; LW_LANGFR_DATA[LW_LANG_STRING_MENU_EXIT] = "Quitter"; - LW_LANGFR_DATA[LW_LANG_STRING_MENU_EXITDOS] = "Revenir a DOS"; LW_LANGFR_DATA[LW_LANG_STRING_MENU_EXITWINDOWS] = "Quitter"; LW_LANGFR_DATA[LW_LANG_STRING_MENU_EXITUNIX] = "Quitter"; LW_LANGFR_DATA[LW_LANG_STRING_MENU_BACK] = "Retour a LW"; @@ -186,9 +185,6 @@ lw_langfr_init () LW_LANGFR_DATA[LW_LANG_STRING_ADVANCED_ALWAYS] = "Toujours"; LW_LANGFR_DATA[LW_LANG_STRING_ADVANCED_RANDOM] = "Au hasard"; LW_LANGFR_DATA[LW_LANG_STRING_ADVANCED_NEVER] = "Jamais"; - LW_LANGFR_DATA[LW_LANG_STRING_ADVANCED_ASMALGORITHM] = "Algorithme"; - LW_LANGFR_DATA[LW_LANG_STRING_ADVANCED_ASSEMBLY] = "Assembleur"; - LW_LANGFR_DATA[LW_LANG_STRING_ADVANCED_STANDARDC] = "C standard"; LW_LANGFR_DATA[LW_LANG_STRING_ADVANCED_ALLOWNETWORKBOTS] = "Bots reseau"; LW_LANGFR_DATA[LW_LANG_STRING_ADVANCED_YES] = "Oui"; LW_LANGFR_DATA[LW_LANG_STRING_ADVANCED_NO] = "Non"; diff --git a/src/langpl.c b/src/langpl.c index f5de7068..8bc456c2 100644 --- a/src/langpl.c +++ b/src/langpl.c @@ -79,7 +79,7 @@ lw_langpl_init () LW_LANGPL_DATA[LW_LANG_STRING_HELP_CREDITS] = "Idea:: \n* Thomas Colcombet\n\nKod: \n* Christian Mauduit\n\nMuzyka:\n* Tim Chadburn\n\nInni:\n* Alstar\n* Peter Wang\n* Cort Danger Stratton\n* Jan Gretschuskin (www.game-factor.de)\n* Mouse\n* Rene Stach\n* Roderick Schertler\n* Ryan D. Brown\n* Eduard Bloch\n* Michael Terry\n* Kasper Hviid\n* David Redick\n* Alexandre Pineau\n* Michael Wagner\n* Peter Williams\n* Jan Samohyl\n* Gavin\n* Dave Vasilevsky\n* 2 of Omega\n* 666-REFIZUL-666\n* Thomas Klausner\n* Joan Dolc\n* Mikhail Yakshin\n* Valerie Mauduit\n* Florence Mauduit\n* Joey Dodson\n* Jan Szenborn\n\nWiecej informacji na www.ufoot.org/liquidwar/v5\n"; LW_LANGPL_DATA[LW_LANG_STRING_HELP_COPYRIGHT] = - "Liquid War jest wojenna gra multiplayer.\nCopyright (C) 1998-2025 Christian Mauduit (ufoot@ufoot.org)\n\nTen program jest darmowy; mozesz go rozpowszechniac i/lub modyfikowac zgodnie z zasadami GNU General Public License wydanej przez Free Software Foundation, zgodnie z wersja druga tej licencji albo (wedlug Twojego wyboru) pozniejsza wersja.\n\nTen program jest rozpowszechniany z nadzieja na bycie uzytecznym, ale CALKOWICIE BEZ GWARANCJI; nawet bez gwarancji PRZYDATNOSCI HANDLOWEJ albo PRZYDATNOSCI DO OKRESLONYCH ZASTOSOWAN. Zobacz GNU General Public License po wiecej szczegolow.\n\nPowinienes dostac kopie licencji GNU razem z tym programem; jezeli nie, napisz do Free Software Foundation, Inc., 51 Franklin St, 5 pietro, Boston, MA 02110-1301 USA\n\nWiecej informacji na www.ufoot.org/liquidwar/v5\n"; + "Liquid War jest wojenną grą multiplayer.\nCopyright (C) 1998-2025 Christian Mauduit (ufoot@ufoot.org)\n\nTen program jest darmowy; możesz go rozpowszechniać i/lub modyfikować zgodnie z zasadami GNU General Public License wydanej przez Free Software Foundation, zgodnie z wersją drugą tej licencji albo (według Twojego wyboru) późniejszą wersją.\n\nTen program jest rozpowszechniany z nadzieją na bycie użytecznym, ale CAŁKOWICIE BEZ GWARANCJI; nawet bez gwarancji PRZYDATNOŚCI HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. Zobacz GNU General Public License po więcej szczegółów.\n\nPowinieneś dostać kopię licencji GNU razem z tym programem; jeżeli nie, napisz do Free Software Foundation, Inc., 51 Franklin St, 5 piętro, Boston, MA 02110-1301 USA\n\nWięcej informacji na www.ufoot.org/liquidwar/v5\n"; /* * Stupid Microsoft VC++ can't handle strings over 2048 chars correctly, * (compiler error C2026) so we had to split this one... @@ -169,9 +169,6 @@ lw_langpl_init () LW_LANGPL_DATA[LW_LANG_STRING_ADVANCED_ALWAYS] = "Zawsze"; LW_LANGPL_DATA[LW_LANG_STRING_ADVANCED_RANDOM] = "Losowo"; LW_LANGPL_DATA[LW_LANG_STRING_ADVANCED_NEVER] = "Nigdy"; - LW_LANGPL_DATA[LW_LANG_STRING_ADVANCED_ASMALGORITHM] = "Algorytm"; - LW_LANGPL_DATA[LW_LANG_STRING_ADVANCED_ASSEMBLY] = "Wbudowany"; - LW_LANGPL_DATA[LW_LANG_STRING_ADVANCED_STANDARDC] = "Standardowy C"; LW_LANGPL_DATA[LW_LANG_STRING_ADVANCED_ALLOWNETWORKBOTS] = "Zezwol na boty w sieci"; LW_LANGPL_DATA[LW_LANG_STRING_ADVANCED_YES] = "Tak"; diff --git a/src/level.c b/src/level.c index dd24a44e..856e1fc6 100644 --- a/src/level.c +++ b/src/level.c @@ -55,6 +55,8 @@ #include #include +#include "backport.h" +#include "backportgui.h" #include "back.h" #include "config.h" #include "dialog.h" @@ -167,7 +169,7 @@ display_chosen_level (void) int y1, y2, y3, y4, y5, y6, y7, y8; int sample_x, sample_y, sample_w, sample_h; int max_w, max_h, bmp_w, bmp_h; - BITMAP *pour_voir; + ALLEGRO_BITMAP *pour_voir; retrieve_choose_level_xy (&x1, &x2, &x3, &x4, &x5, &x6, &x7, &x8, &y1, &y2, &y3, &y4, &y5, &y6, &y7, &y8); rectfill (screen, menu_real_x (x4), menu_real_y (y1), @@ -187,8 +189,8 @@ display_chosen_level (void) { max_w = menu_real_x (MENU_W_SAMPLE); max_h = menu_real_y (MENU_H_SAMPLE); - bmp_w = pour_voir->w; - bmp_h = pour_voir->h; + bmp_w = al_get_bitmap_width (pour_voir); + bmp_h = al_get_bitmap_height (pour_voir); if (max_w * bmp_h < max_h * bmp_w) { @@ -206,7 +208,7 @@ display_chosen_level (void) sample_y = menu_real_y (y1) + (max_h - sample_h) / 2; stretch_blit (pour_voir, screen, 0, 0, bmp_w, bmp_h, sample_x, sample_y, sample_w, sample_h); - destroy_bitmap (pour_voir); + al_destroy_bitmap (pour_voir); } if (!lw_maptex_is_custom_texture_used (CONFIG_LEVEL_MAP, CONFIG_LEVEL_FG, 0, LW_RANDOM_ON, @@ -222,11 +224,11 @@ display_chosen_level (void) if (pour_voir) { - stretch_blit (pour_voir, screen, 0, 0, pour_voir->w, pour_voir->h, + stretch_blit (pour_voir, screen, 0, 0, al_get_bitmap_width (pour_voir), al_get_bitmap_height (pour_voir), menu_real_x (x1), menu_real_x (y1), menu_real_x (MENU_W_LEVEL), menu_real_x (MENU_W_LEVEL)); - destroy_bitmap (pour_voir); + al_destroy_bitmap (pour_voir); } } if (!lw_maptex_is_custom_texture_used @@ -243,11 +245,11 @@ display_chosen_level (void) if (pour_voir) { - stretch_blit (pour_voir, screen, 0, 0, pour_voir->w, pour_voir->h, + stretch_blit (pour_voir, screen, 0, 0, al_get_bitmap_width (pour_voir), al_get_bitmap_height (pour_voir), menu_real_x (x8), menu_real_x (y1), menu_real_x (MENU_W_LEVEL), menu_real_x (MENU_W_LEVEL)); - destroy_bitmap (pour_voir); + al_destroy_bitmap (pour_voir); } } } diff --git a/src/logcli.c b/src/logcli.c index 45bb2dc3..c7f1b0aa 100644 --- a/src/logcli.c +++ b/src/logcli.c @@ -53,7 +53,7 @@ /*==================================================================*/ /* - * Note: we must *not* include allegro.h here, or everything's + * Note: we must *not* include allegro5/allegro.h here, or everything's * wrecked with the use of windows.h... */ #ifdef WIN32 @@ -237,9 +237,6 @@ log_println_int (int i) void log_flush () { -#ifdef GP2X - usleep (100); -#endif #ifndef WIN32 fflush (stdout); #endif diff --git a/src/lwwin.rc b/src/lwwin.rc index 51f11895..cc58aba1 100644 --- a/src/lwwin.rc +++ b/src/lwwin.rc @@ -3,8 +3,8 @@ allegro_icon ICON "./misc/liquidwar.ico" 1 VERSIONINFO -FILEVERSION 5, 6, 5, 1 -PRODUCTVERSION 5, 6, 5, 1 +FILEVERSION 5, 7, 0, 1 +PRODUCTVERSION 5, 7, 0, 1 FILEFLAGSMASK 0x3fL FILEFLAGS 0x0L FILEOS VOS__WINDOWS32 @@ -17,13 +17,13 @@ BEGIN BEGIN VALUE "Comments", "A unique multiplayer wargame\0" VALUE "CompanyName", "N/A\0" - VALUE "FileDescription", "Liquid War 5.6.5 for Microsoft Windows\0" - VALUE "FileVersion", "5.6.5-1\0" + VALUE "FileDescription", "Liquid War 5.7.0 for Microsoft Windows\0" + VALUE "FileVersion", "5.7.0-1\0" VALUE "InternalName", "liquidwar\0" VALUE "LegalCopyright", "Copyright (C) 1998-2025 Christian Mauduit\0" VALUE "OriginalFilename", "lwwin.exe\0" VALUE "ProductName", "Liquid War\0" - VALUE "ProductVersion", "5.6.5\0" + VALUE "ProductVersion", "5.7.0\0" END END END diff --git a/src/main.c b/src/main.c index 18338bfe..30eb8638 100644 --- a/src/main.c +++ b/src/main.c @@ -52,11 +52,8 @@ /* includes */ /*==================================================================*/ -#include -#ifdef DOS -#include -#endif - +#define ALLEGRO_NO_MAIN +#include "backport.h" #include "bigdata.h" #include "config.h" #include "disk.h" @@ -70,37 +67,11 @@ #include "startup.h" #include "basicopt.h" -/*==================================================================*/ -/* construct pour reduire la place d'allegro */ -/*==================================================================*/ -#ifdef DOS - -BEGIN_GFX_DRIVER_LIST - GFX_DRIVER_VGA - GFX_DRIVER_MODEX - GFX_DRIVER_VBEAF - GFX_DRIVER_VESA2L - GFX_DRIVER_VESA2B - GFX_DRIVER_VESA1 - END_GFX_DRIVER_LIST - BEGIN_COLOR_DEPTH_LIST - COLOR_DEPTH_8 - COLOR_DEPTH_15 - COLOR_DEPTH_16 - COLOR_DEPTH_24 - COLOR_DEPTH_32 - END_COLOR_DEPTH_LIST - BEGIN_DIGI_DRIVER_LIST - DIGI_DRIVER_SB - DIGI_DRIVER_SOUNDSCAPE - DIGI_DRIVER_AUDIODRIVE - END_DIGI_DRIVER_LIST BEGIN_MIDI_DRIVER_LIST END_MIDI_DRIVER_LIST -#endif /*==================================================================*/ /* functions */ /*==================================================================*/ /*------------------------------------------------------------------*/ - int +int main (int argc, char **argv) { int init_success = 0; @@ -122,13 +93,6 @@ main (int argc, char **argv) log_println (); load_custom_success = load_custom (); log_println (); - -#ifdef DOS - if (STARTUP_STOP) - readkey (); - else - delay (500); -#endif } if (!init_success) @@ -162,10 +126,3 @@ main (int argc, char **argv) return 0; } - -#ifdef WIN32 -END_OF_MAIN () -#endif -#ifdef UNIX - END_OF_MAIN (); -#endif diff --git a/src/map.c b/src/map.c index b1c00cf0..55186281 100644 --- a/src/map.c +++ b/src/map.c @@ -72,8 +72,8 @@ /*==================================================================*/ #define LIGHT_OR_DARK_TRESHOLD 315 -#define CONSIDERED_AS_DARK 0 -#define CONSIDERED_AS_LIGHT 2 +#define CONSIDERED_AS_DARK 0x000000 /* Black RGB */ +#define CONSIDERED_AS_LIGHT 0xFFFFFF /* White RGB */ #define PLAYABLE_AREA 1 #define MINI_SIDE_SIZE 4 #define MINI_PLAYABLE_AREA 1024 @@ -104,38 +104,57 @@ calc_zoom_factor (int w, int h, int min_w, int min_h) /*------------------------------------------------------------------*/ static void -sort_light_and_dark (BITMAP * bmp, PALETTE pal) +sort_light_and_dark (ALLEGRO_BITMAP * bmp, PALETTE pal) { - char table[256]; - int i, x, y; - - for (i = 0; i < 256; ++i) - { - if (6 * pal[i].r + 3 * pal[i].g + pal[i].b > LIGHT_OR_DARK_TRESHOLD) - table[i] = CONSIDERED_AS_LIGHT; - else - table[i] = CONSIDERED_AS_DARK; - } - - for (y = 0; y < bmp->h; ++y) - for (x = 0; x < bmp->w; ++x) - putpixel (bmp, x, y, table[getpixel (bmp, x, y)]); + int x, y; + ALLEGRO_COLOR pixel_color; + float r, g, b, a; + int brightness; + ALLEGRO_COLOR light_color, dark_color; + + (void) pal; /* Unused for RGB bitmaps */ + + /* Create actual RGB colors from constants */ + light_color = al_map_rgb((CONSIDERED_AS_LIGHT >> 16) & 0xFF, + (CONSIDERED_AS_LIGHT >> 8) & 0xFF, + CONSIDERED_AS_LIGHT & 0xFF); + dark_color = al_map_rgb((CONSIDERED_AS_DARK >> 16) & 0xFF, + (CONSIDERED_AS_DARK >> 8) & 0xFF, + CONSIDERED_AS_DARK & 0xFF); + + /* Set target bitmap once for efficiency */ + al_set_target_bitmap (bmp); + + for (y = 0; y < al_get_bitmap_height (bmp); ++y) + for (x = 0; x < al_get_bitmap_width (bmp); ++x) + { + pixel_color = al_get_pixel (bmp, x, y); + al_unmap_rgba_f (pixel_color, &r, &g, &b, &a); + + /* Apply weighted brightness formula with 0-255 scaling */ + brightness = (int)(6 * (r * 255) + 3 * (g * 255) + (b * 255)); + + if (brightness > LIGHT_OR_DARK_TRESHOLD) + al_put_pixel (x, y, light_color); + else + al_put_pixel (x, y, dark_color); + } } /*------------------------------------------------------------------*/ -static BITMAP * -extract_significant_part (BITMAP * src) +static ALLEGRO_BITMAP * +extract_significant_part (ALLEGRO_BITMAP * src) { - int min_x = src->w; - int min_y = src->h; + int min_x = al_get_bitmap_width (src); + int min_y = al_get_bitmap_height (src); int max_x = -1; int max_y = -1; int dst_x, dst_y, dst_w, dst_h; int x, y; - BITMAP *result; + ALLEGRO_BITMAP *result; - for (y = 0; y < src->h; ++y) - for (x = 0; x < src->w; ++x) + for (y = 0; y < al_get_bitmap_height (src); ++y) + for (x = 0; x < al_get_bitmap_width (src); ++x) if (getpixel (src, x, y) == CONSIDERED_AS_DARK) { if (min_x > x) @@ -156,7 +175,7 @@ extract_significant_part (BITMAP * src) result = NULL; else { - result = my_create_bitmap (dst_w, dst_h); + result = my_create_memory_bitmap (dst_w, dst_h); if (result) blit (src, result, dst_x, dst_y, 0, 0, dst_w, dst_h); } @@ -166,45 +185,46 @@ extract_significant_part (BITMAP * src) /*-----------------------------------------------------------------*/ static int -spread_color_down (BITMAP * bmp, int color1, int color2) +spread_color_down (ALLEGRO_BITMAP * bmp, int color1, int color2) { int x, y, x1, y1, x2, y2, found = 0; - for (y = 0; y < bmp->h; ++y) - for (x = 0; x < bmp->w; ++x) + al_set_target_bitmap (bmp); + for (y = 0; y < al_get_bitmap_height (bmp); ++y) + for (x = 0; x < al_get_bitmap_width (bmp); ++x) if (getpixel (bmp, x, y) == color2) { x1 = x - 1; if (x1 < 0) x1 = 0; x2 = x + 1; - if (x2 > bmp->w - 1) - x2 = bmp->w - 1; + if (x2 > al_get_bitmap_width (bmp) - 1) + x2 = al_get_bitmap_width (bmp) - 1; y1 = y - 1; if (y1 < 0) y1 = 0; y2 = y + 1; - if (y2 > bmp->h - 1) - y2 = bmp->h - 1; + if (y2 > al_get_bitmap_height (bmp) - 1) + y2 = al_get_bitmap_height (bmp) - 1; if (getpixel (bmp, x2, y) == color1) { - putpixel (bmp, x2, y, color2); + putpixel_fast (x2, y, color2); found++; } if (getpixel (bmp, x2, y2) == color1) { - putpixel (bmp, x2, y2, color2); + putpixel_fast (x2, y2, color2); found++; } if (getpixel (bmp, x, y2) == color1) { - putpixel (bmp, x, y2, color2); + putpixel_fast (x, y2, color2); found++; } if (getpixel (bmp, x1, y2) == color1) { - putpixel (bmp, x1, y2, color2); + putpixel_fast (x1, y2, color2); found++; } } @@ -214,45 +234,46 @@ spread_color_down (BITMAP * bmp, int color1, int color2) /*-----------------------------------------------------------------*/ static int -spread_color_up (BITMAP * bmp, int color1, int color2) +spread_color_up (ALLEGRO_BITMAP * bmp, int color1, int color2) { int x, y, x1, y1, x2, y2, found = 0; - for (y = bmp->h - 1; y >= 0; --y) - for (x = bmp->w - 1; x >= 0; --x) + al_set_target_bitmap (bmp); + for (y = al_get_bitmap_height (bmp) - 1; y >= 0; --y) + for (x = al_get_bitmap_width (bmp) - 1; x >= 0; --x) if (getpixel (bmp, x, y) == color2) { x1 = x - 1; if (x1 < 0) x1 = 0; x2 = x + 1; - if (x2 > bmp->w - 1) - x2 = bmp->w - 1; + if (x2 > al_get_bitmap_width (bmp) - 1) + x2 = al_get_bitmap_width (bmp) - 1; y1 = y - 1; if (y1 < 0) y1 = 0; y2 = y + 1; - if (y2 > bmp->h - 1) - y2 = bmp->h - 1; + if (y2 > al_get_bitmap_height (bmp) - 1) + y2 = al_get_bitmap_height (bmp) - 1; if (getpixel (bmp, x1, y) == color1) { - putpixel (bmp, x1, y, color2); + putpixel_fast (x1, y, color2); found++; } if (getpixel (bmp, x1, y1) == color1) { - putpixel (bmp, x1, y1, color2); + putpixel_fast (x1, y1, color2); found++; } if (getpixel (bmp, x, y1) == color1) { - putpixel (bmp, x, y1, color2); + putpixel_fast (x, y1, color2); found++; } if (getpixel (bmp, x2, y1) == color1) { - putpixel (bmp, x2, y1, color2); + putpixel_fast (x2, y1, color2); found++; } } @@ -263,7 +284,7 @@ spread_color_up (BITMAP * bmp, int color1, int color2) /*-----------------------------------------------------------------*/ static int -check_if_playable (BITMAP * bmp) +check_if_playable (ALLEGRO_BITMAP * bmp) { int x = 0, y = 0, x0, y0; int unplayable = 0; @@ -273,14 +294,14 @@ check_if_playable (BITMAP * bmp) * Now we draw the "outside" of the map. This is usefull * to avoid bugs (core dumps) if the map is not correctly drawn. */ - hline (bmp, 0, 0, bmp->w - 1, CONSIDERED_AS_DARK); - hline (bmp, 0, bmp->h - 1, bmp->w - 1, CONSIDERED_AS_DARK); - vline (bmp, 0, 0, bmp->h - 1, CONSIDERED_AS_DARK); - vline (bmp, bmp->w - 1, 0, bmp->h - 1, CONSIDERED_AS_DARK); + hline (bmp, 0, 0, al_get_bitmap_width (bmp) - 1, CONSIDERED_AS_DARK); + hline (bmp, 0, al_get_bitmap_height (bmp) - 1, al_get_bitmap_width (bmp) - 1, CONSIDERED_AS_DARK); + vline (bmp, 0, 0, al_get_bitmap_height (bmp) - 1, CONSIDERED_AS_DARK); + vline (bmp, al_get_bitmap_width (bmp) - 1, 0, al_get_bitmap_height (bmp) - 1, CONSIDERED_AS_DARK); x0 = y0 = -1; - for (y = 0; y < bmp->h && y0 < 0; ++y) - for (x = 0; x < bmp->w && x0 < 0; ++x) + for (y = 0; y < al_get_bitmap_height (bmp) && y0 < 0; ++y) + for (x = 0; x < al_get_bitmap_width (bmp) && x0 < 0; ++x) if (getpixel (bmp, x, y) == CONSIDERED_AS_LIGHT) { x0 = x; @@ -297,8 +318,8 @@ check_if_playable (BITMAP * bmp) else unplayable |= 1; - for (y = 0; y < bmp->h; ++y) - for (x = 0; x < bmp->w; ++x) + for (y = 0; y < al_get_bitmap_height (bmp); ++y) + for (x = 0; x < al_get_bitmap_width (bmp); ++x) if (getpixel (bmp, x, y) == PLAYABLE_AREA) ++playable_place; @@ -309,7 +330,7 @@ check_if_playable (BITMAP * bmp) /*-----------------------------------------------------------------*/ static void -fill_with_fg_and_bg (BITMAP * bmp, int fg, int bg) +fill_with_fg_and_bg (ALLEGRO_BITMAP * bmp, int fg, int bg) { int x, y; @@ -317,11 +338,12 @@ fill_with_fg_and_bg (BITMAP * bmp, int fg, int bg) * We set up the real fg and bg color instead of the * CONSIDERED_AS_... constants. */ - for (y = 0; y < bmp->h; ++y) + al_set_target_bitmap (bmp); + for (y = 0; y < al_get_bitmap_height (bmp); ++y) { - for (x = 0; x < bmp->w; ++x) + for (x = 0; x < al_get_bitmap_width (bmp); ++x) { - putpixel (bmp, x, y, + putpixel_fast (x, y, getpixel (bmp, x, y) == PLAYABLE_AREA ? bg : fg); } } @@ -329,13 +351,14 @@ fill_with_fg_and_bg (BITMAP * bmp, int fg, int bg) /*-----------------------------------------------------------------*/ static void -convert_to_buffer (BITMAP * bmp, char *buffer, int *size, int *bg_size) +convert_to_buffer (ALLEGRO_BITMAP * bmp, char *buffer, int *size, + int *bg_size) { int pos_src, l, wh; char *data; - wh = bmp->h * bmp->w; - data = bmp->dat; + wh = al_get_bitmap_height (bmp) * al_get_bitmap_width (bmp); + data = NULL; // TODO: implement bitmap->dat equivalent with al_lock_bitmap pos_src = 0; (*size) = 0; (*bg_size) = 0; @@ -368,10 +391,11 @@ convert_to_buffer (BITMAP * bmp, char *buffer, int *size, int *bg_size) /*------------------------------------------------------------------*/ void * -lw_map_archive_raw_bmp (BITMAP * bmp, PALETTE pal, const char *filename) +lw_map_archive_raw_bmp (ALLEGRO_BITMAP * bmp, PALETTE pal, + const char *filename) { int w = 0, h = 0, size = 0, bg_size = 0; - BITMAP *sub_bmp; + ALLEGRO_BITMAP *sub_bmp; char *temp = NULL; char *result = NULL; static int index = 1; @@ -384,17 +408,17 @@ lw_map_archive_raw_bmp (BITMAP * bmp, PALETTE pal, const char *filename) sub_bmp = extract_significant_part (bmp); if (sub_bmp) { - w = sub_bmp->w; - h = sub_bmp->h; + w = al_get_bitmap_width (sub_bmp); + h = al_get_bitmap_height (sub_bmp); if (check_if_playable (sub_bmp)) { temp = malloc_in_big_data_bottom (w * h + 1); if (temp) convert_to_buffer (sub_bmp, temp, &size, &bg_size); } - destroy_bitmap (sub_bmp); + al_destroy_bitmap (sub_bmp); } - destroy_bitmap (bmp); + al_destroy_bitmap (bmp); } if (temp) @@ -453,7 +477,7 @@ lw_map_archive_raw_bmp (BITMAP * bmp, PALETTE pal, const char *filename) void * lw_map_archive_raw (const char *filename) { - BITMAP *bmp; + ALLEGRO_BITMAP *bmp; PALETTE pal; void *result = NULL; @@ -498,7 +522,7 @@ lw_map_get_safe (int num, int network, int random) } /*------------------------------------------------------------------*/ -BITMAP * +ALLEGRO_BITMAP * lw_map_create_bicolor (int num, int fg, int bg, int network, int random, int min_w, int min_h, int *zoom_factor) @@ -506,8 +530,8 @@ lw_map_create_bicolor (int num, int fg, int bg, int pos_dst, pos_src, i, j, l, color; short w, h; signed char *data_dst, *data_src; - BITMAP *result = NULL; - BITMAP *temp; + ALLEGRO_BITMAP *result = NULL; + ALLEGRO_BITMAP *temp; void *raw_map; int size, surface; int x, y; @@ -526,11 +550,11 @@ lw_map_create_bicolor (int num, int fg, int bg, *zoom_factor = calc_zoom_factor (w, h, min_w, min_h); pos_src = pos_dst = 0; - temp = my_create_bitmap (w, h); + temp = my_create_memory_bitmap (w, h); if (temp) { - data_dst = temp->dat; + data_dst = NULL; // TODO: implement bitmap->dat equivalent with al_lock_bitmap while (pos_src < size && (l = data_src[pos_src++]) != 0) { if (l > 0) @@ -552,7 +576,7 @@ lw_map_create_bicolor (int num, int fg, int bg, { fill_with_fg_and_bg (temp, fg, bg); - result = my_create_bitmap (w * (*zoom_factor), h * (*zoom_factor)); + result = my_create_memory_bitmap (w * (*zoom_factor), h * (*zoom_factor)); if (result) { @@ -560,6 +584,7 @@ lw_map_create_bicolor (int num, int fg, int bg, * Not we magnify the map if needed, so that very small * maps are interesting to play on fast fancy computers */ + al_set_target_bitmap (result); for (y = 0; y < h; ++y) for (x = 0; x < w; ++x) { @@ -567,8 +592,7 @@ lw_map_create_bicolor (int num, int fg, int bg, for (i = 0; i < *zoom_factor; ++i) for (j = 0; j < *zoom_factor; ++j) { - putpixel (result, - x * *zoom_factor + j, + putpixel_fast (x * *zoom_factor + j, y * *zoom_factor + i, color); } } @@ -579,19 +603,19 @@ lw_map_create_bicolor (int num, int fg, int bg, log_println_str ("Error: unplayable map!"); } - destroy_bitmap (temp); + al_destroy_bitmap (temp); } return result; } /*------------------------------------------------------------------*/ -BITMAP * +ALLEGRO_BITMAP * lw_map_create_textured (int num, int fg, int bg, int network, int random, int min_w, int min_h) { int x, y, w, h, color; - BITMAP *result = NULL, *bg_tex, *fg_tex; + ALLEGRO_BITMAP *result = NULL, *bg_tex, *fg_tex; int fg_w, fg_h; int bg_w, bg_h; int zoom_factor, zoom_factor_fg, zoom_factor_bg; @@ -601,27 +625,28 @@ lw_map_create_textured (int num, int fg, int bg, if (bg_tex && fg_tex) { - bg_w = bg_tex->w; - bg_h = bg_tex->h; - fg_w = fg_tex->w; - fg_h = fg_tex->h; + bg_w = al_get_bitmap_width (bg_tex); + bg_h = al_get_bitmap_height (bg_tex); + fg_w = al_get_bitmap_width (fg_tex); + fg_h = al_get_bitmap_height (fg_tex); result = lw_map_create_bicolor (num, 1, 0, network, random, min_w, min_h, &zoom_factor); if (result) { - w = result->w; - h = result->h; + w = al_get_bitmap_width (result); + h = al_get_bitmap_height (result); zoom_factor_fg = zoom_factor_bg = zoom_factor; - if (w != zoom_factor * fg_tex->w || h != zoom_factor * fg_tex->h) + if (w != zoom_factor * al_get_bitmap_width (fg_tex) || h != zoom_factor * al_get_bitmap_height (fg_tex)) { zoom_factor_fg = 1; } - if (w != zoom_factor * bg_tex->w || h != zoom_factor * bg_tex->h) + if (w != zoom_factor * al_get_bitmap_width (bg_tex) || h != zoom_factor * al_get_bitmap_height (bg_tex)) { zoom_factor_bg = 1; } + al_set_target_bitmap (result); for (y = 0; y < h; ++y) for (x = 0; x < w; ++x) { @@ -637,16 +662,16 @@ lw_map_create_textured (int num, int fg, int bg, getpixel (bg_tex, (x / zoom_factor_bg) % bg_w, (y / zoom_factor_bg) % bg_h); } - putpixel (result, x, y, color); + putpixel_fast (x, y, color); } } } if (bg_tex) - destroy_bitmap (bg_tex); + al_destroy_bitmap (bg_tex); if (fg_tex) - destroy_bitmap (fg_tex); + al_destroy_bitmap (fg_tex); return result; } diff --git a/src/map.h b/src/map.h index 470e3ded..39087d20 100644 --- a/src/map.h +++ b/src/map.h @@ -55,7 +55,9 @@ /* includes */ /*==================================================================*/ -#include +#include + +#include "palette.h" /*==================================================================*/ /* constants */ @@ -69,14 +71,13 @@ /*==================================================================*/ void *lw_map_archive_raw (const char *filename); -void *lw_map_archive_raw_bmp (BITMAP * bmp, PALETTE pal, +void *lw_map_archive_raw_bmp (ALLEGRO_BITMAP * bmp, PALETTE pal, const char *filename); -BITMAP *lw_map_create_bicolor (int num, int fg, int bg, - int network, int random, int min_w, int min_h, - int *zoom_factor); -BITMAP *lw_map_create_textured (int num, int fg, int bg, - int network, int random, int min_w, - int min_h); +ALLEGRO_BITMAP *lw_map_create_bicolor (int num, int fg, int bg, + int network, int random, int min_w, + int min_h, int *zoom_factor); +ALLEGRO_BITMAP *lw_map_create_textured (int num, int fg, int bg, int network, + int random, int min_w, int min_h); char *lw_map_get_system_name (int num, int network, int random); char *lw_map_get_readable_name (int num, int network, int random); void lw_map_get_res (int num, int *w, int *h, diff --git a/src/mutxdos.c b/src/mapgen_stubs.c similarity index 71% rename from src/mutxdos.c rename to src/mapgen_stubs.c index e372f308..cfe441fa 100644 --- a/src/mutxdos.c +++ b/src/mapgen_stubs.c @@ -38,69 +38,66 @@ /* along with this program; if not, write to the Free Software */ /* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /* */ -/* Liquid War homepage : https://ufoot.org/liquidwar/v5 */ +/* Liquid War homepage : http://www.ufoot.org/liquidwar/v5 */ /* Contact author : ufoot@ufoot.org */ /*****************************************************************************/ /********************************************************************/ -/* name : thrddos.c */ -/* content : provides fake mutex support under DOS */ +/* nom : mapgen_stubs.c */ +/* content : stub implementations for mapgen dependencies */ +/* last update : Dec 28th 2024 */ /********************************************************************/ /*==================================================================*/ /* includes */ /*==================================================================*/ -#include "mutxgen.h" +#include "backport.h" +#include /*==================================================================*/ -/* defines */ +/* variables globales */ /*==================================================================*/ -/*==================================================================*/ -/* macros */ -/*==================================================================*/ - -/*==================================================================*/ -/* globals */ -/*==================================================================*/ +/* Global palette for backport compatibility */ +PALETTE GLOBAL_PALETTE; /*==================================================================*/ -/* fonctions */ +/* stub functions */ /*==================================================================*/ -/*------------------------------------------------------------------*/ -int -lw_mutex_init (LW_MUTEX_DATA * mutex) -{ - int result = 1; - - return result; +/* Minimal logging stubs */ +void log_print_str(char *str) { + printf("%s", str); } -/*------------------------------------------------------------------*/ -int -lw_mutex_lock (LW_MUTEX_DATA * mutex) -{ - int result = 1; - - return result; +void log_println_str(char *str) { + printf("%s\n", str); } -/*------------------------------------------------------------------*/ -int -lw_mutex_trylock (LW_MUTEX_DATA * mutex) -{ - int result = 1; +/* Minimal mutex stubs (mapgen doesn't need real threading) */ +void lw_mutex_init(void *mutex) { + (void)mutex; /* suppress unused parameter warning */ + /* stub - mapgen runs single-threaded */ +} - return result; +void lw_mutex_lock(void *mutex) { + (void)mutex; /* suppress unused parameter warning */ + /* stub - mapgen runs single-threaded */ } -/*------------------------------------------------------------------*/ -int -lw_mutex_unlock (LW_MUTEX_DATA * mutex) -{ - int result = 1; +void lw_mutex_unlock(void *mutex) { + (void)mutex; /* suppress unused parameter warning */ + /* stub - mapgen runs single-threaded */ +} - return result; +/* Minimal thread stubs (mapgen doesn't need real threading) */ +void lw_thread_start(void *thread_func) { + (void)thread_func; /* suppress unused parameter warning */ + /* stub - mapgen runs single-threaded */ } + +/* Mouse function stub (mapgen doesn't use mouse) */ +void lw_mouse_update_show_hide(void) { + /* stub - mapgen doesn't use mouse */ +} \ No newline at end of file diff --git a/src/maptex.c b/src/maptex.c index 84a66102..5bbfc511 100644 --- a/src/maptex.c +++ b/src/maptex.c @@ -123,12 +123,12 @@ lw_maptex_is_custom_texture_used (int num, } /*-----------------------------------------------------------------*/ -BITMAP * +ALLEGRO_BITMAP * lw_maptex_create_map (int num, int fg, int bg, int network, int random, int min_w, int min_h, int use_default_texture) { - BITMAP *result; + ALLEGRO_BITMAP *result; int found; result = lw_map_create_textured (num, @@ -146,11 +146,11 @@ lw_maptex_create_map (int num, int fg, int bg, } /*-----------------------------------------------------------------*/ -BITMAP * +ALLEGRO_BITMAP * lw_maptex_create_fg (int num, int fg, int network, int random, int use_default_texture) { - BITMAP *result; + ALLEGRO_BITMAP *result; int found; result = @@ -162,11 +162,11 @@ lw_maptex_create_fg (int num, int fg, int network, int random, } /*-----------------------------------------------------------------*/ -BITMAP * +ALLEGRO_BITMAP * lw_maptex_create_bg (int num, int bg, int network, int random, int use_default_texture) { - BITMAP *result; + ALLEGRO_BITMAP *result; int found; result = diff --git a/src/maptex.h b/src/maptex.h index 77b61f49..0c5f2273 100644 --- a/src/maptex.h +++ b/src/maptex.h @@ -54,7 +54,7 @@ /* includes */ /*==================================================================*/ -#include +#include #include "maptex.h" /*==================================================================*/ @@ -69,13 +69,13 @@ int lw_maptex_is_custom_texture_used (int num, int texture, int network, int random, int use_default_texture); -BITMAP *lw_maptex_create_map (int num, int fg, int bg, int network, - int random, int min_w, int min_h, - int use_default_texture); -BITMAP *lw_maptex_create_fg (int num, int fg, int network, int random, - int use_default_texture); -BITMAP *lw_maptex_create_bg (int num, int bg, int network, int random, - int use_default_texture); +ALLEGRO_BITMAP *lw_maptex_create_map (int num, int fg, int bg, int network, + int random, int min_w, int min_h, + int use_default_texture); +ALLEGRO_BITMAP *lw_maptex_create_fg (int num, int fg, int network, int random, + int use_default_texture); +ALLEGRO_BITMAP *lw_maptex_create_bg (int num, int bg, int network, int random, + int use_default_texture); void lw_maptex_set_fg_palette (int num, int fg, int network, int random, int use_default_texture); void lw_maptex_set_bg_palette (int num, int bg, int network, int random, diff --git a/src/menu.c b/src/menu.c index 1af0ad54..613e4e98 100644 --- a/src/menu.c +++ b/src/menu.c @@ -87,9 +87,6 @@ confirm_quit (void) standard_button (d, 0, 0, 2, 1); standard_button (d + 1, 1, 0, 2, 1); d[0].dp = lw_lang_string (LW_LANG_STRING_MENU_EXIT); -#ifdef DOS - d[0].dp = lw_lang_string (LW_LANG_STRING_MENU_EXITDOS); -#endif #ifdef WIN32 d[0].dp = lw_lang_string (LW_LANG_STRING_MENU_EXITWINDOWS); #endif @@ -155,11 +152,7 @@ main_menu (int fade_in) retour = play_sequence (); break; case 5: -#ifndef DOS retour = network_game (); -#else - retour = error_no_network_support (); -#endif break; case 6: retour = choose_map (); @@ -181,11 +174,7 @@ main_menu (int fade_in) { if (LW_NETWORK_ON) { -#ifndef DOS retour = netplay_sequence (); -#else - retour = play_sequence (); -#endif } else { diff --git a/src/mesh.c b/src/mesh.c index 2218b8fa..3e65dce5 100644 --- a/src/mesh.c +++ b/src/mesh.c @@ -52,6 +52,7 @@ /* includes */ /*==================================================================*/ +#include "backport.h" #include "bigdata.h" #include "config.h" #include "map.h" @@ -87,8 +88,8 @@ MESH *CURRENT_MESH = NULL; int CURRENT_MESH_SIZE = 0; int CURRENT_AREA_W = 0; int CURRENT_AREA_H = 0; -BITMAP *CURRENT_AREA_DISP = NULL; -BITMAP *CURRENT_AREA_BACK = NULL; +ALLEGRO_BITMAP *CURRENT_AREA_DISP = NULL; +ALLEGRO_BITMAP *CURRENT_AREA_BACK = NULL; /*==================================================================*/ /* fonctions */ @@ -100,13 +101,13 @@ BITMAP *CURRENT_AREA_BACK = NULL; /*------------------------------------------------------------------*/ static MESHER * -create_first_mesher (BITMAP * map) +create_first_mesher (ALLEGRO_BITMAP * map) { MESHER *result; int x, y, h, w, size, i, j; - w = map->w; - h = map->h; + w = al_get_bitmap_width (map); + h = al_get_bitmap_height (map); size = h * w; result = malloc_in_big_data_top (size * sizeof (MESHER)); if (result != NULL) @@ -163,14 +164,14 @@ create_first_mesher (BITMAP * map) /*------------------------------------------------------------------*/ static int -group_mesher (MESHER * mesher, BITMAP * map, int step) +group_mesher (MESHER * mesher, ALLEGRO_BITMAP * map, int step) { int found = 0; int x, y, w, h, i, j, k; MESHER *ne, *se, *sw, *nw, *test; - w = map->w; - h = map->h; + w = al_get_bitmap_width (map); + h = al_get_bitmap_height (map); for (y = 0; y < h - step; y += step * 2) for (x = 0; x < w - step; x += step * 2) @@ -236,14 +237,15 @@ group_mesher (MESHER * mesher, BITMAP * map, int step) /*------------------------------------------------------------------*/ static MESH * -mesher_to_mesh (MESHER * mesher, BITMAP * map, int *size, int *w, int *h) +mesher_to_mesh (MESHER * mesher, ALLEGRO_BITMAP * map, int *size, int *w, + int *h) { MESH *result; MESHER *temp; int mesher_size, i, j, k; - (*w) = map->w; - (*h) = map->h; + (*w) = al_get_bitmap_width (map); + (*h) = al_get_bitmap_height (map); mesher_size = (*h) * (*w); *size = 0; @@ -344,7 +346,7 @@ int create_mesh (void) { int retour = 0, i; - BITMAP *map; + ALLEGRO_BITMAP *map; MESHER *mesher; int zoom_factor = 1; @@ -374,7 +376,7 @@ create_mesh (void) &CURRENT_AREA_W, &CURRENT_AREA_H); free_last_big_data_top (); } - destroy_bitmap (map); + al_destroy_bitmap (map); } if (CURRENT_MESH == NULL) retour = -1; /* pas assez de memoire */ @@ -387,10 +389,10 @@ create_mesh (void) /*------------------------------------------------------------------*/ /*------------------------------------------------------------------*/ -BITMAP * +ALLEGRO_BITMAP * create_mesh_bitmap (int mode) { - BITMAP *result; + ALLEGRO_BITMAP *result; int i, j, color; result = lw_maptex_create_map diff --git a/src/mesh.h b/src/mesh.h index 3c6d57c7..869eba1e 100644 --- a/src/mesh.h +++ b/src/mesh.h @@ -55,7 +55,7 @@ /* includes */ /*==================================================================*/ -#include +#include #include "base.h" @@ -122,8 +122,8 @@ extern MESH *CURRENT_MESH; extern int CURRENT_MESH_SIZE; extern int CURRENT_AREA_W; extern int CURRENT_AREA_H; -extern BITMAP *CURRENT_AREA_DISP; -extern BITMAP *CURRENT_AREA_BACK; +extern ALLEGRO_BITMAP *CURRENT_AREA_DISP; +extern ALLEGRO_BITMAP *CURRENT_AREA_BACK; /*==================================================================*/ /* fonctions globales */ @@ -132,6 +132,6 @@ extern BITMAP *CURRENT_AREA_BACK; void reset_mesh (void); void test_mesh (void); int create_mesh (void); -BITMAP *create_mesh_bitmap (int mode); +ALLEGRO_BITMAP *create_mesh_bitmap (int mode); #endif diff --git a/src/message.c b/src/message.c index 979cd97a..0159cbc2 100644 --- a/src/message.c +++ b/src/message.c @@ -52,7 +52,7 @@ /* includes */ /*==================================================================*/ -#include +#include "backport.h" #include #include @@ -115,8 +115,8 @@ display_message (void) //text_mode (-1); deprecated for (i = 0; i < MESSAGE_NB; ++i) textout_ex (NEXT_SCREEN, font, MESSAGE[i], - NEXT_SCREEN->w - text_length (font, MESSAGE[i]), - NEXT_SCREEN->h - (MESSAGE_NB - i) * h, -1, -1); + al_get_bitmap_width (NEXT_SCREEN) - text_length (font, MESSAGE[i]), + al_get_bitmap_height (NEXT_SCREEN) - (MESSAGE_NB - i) * h, -1, -1); } /*------------------------------------------------------------------*/ diff --git a/src/monster.h b/src/monster.h deleted file mode 100644 index afc9f797..00000000 --- a/src/monster.h +++ /dev/null @@ -1,92 +0,0 @@ -/********************************************************************/ -/* */ -/* L I QQ U U I DD W W A RR 555 */ -/* L I Q Q U U I D D W W A A R R 5 */ -/* L I Q Q U U I D D W W W AAA RR 55 */ -/* L I Q Q U U I D D WW WW A A R R 5 */ -/* LLL I Q Q U I DD W W A A R R 55 */ -/* */ -/* b */ -/* bb y y */ -/* b b yyy */ -/* bb y */ -/* yy */ -/* */ -/* U U FFF O O TTT */ -/* U U F O O O O T */ -/* U U TIRET FF O O O O T */ -/* U U F O O O O T */ -/* U F O O T */ -/* */ -/********************************************************************/ - -/*****************************************************************************/ -/* Liquid War is a multiplayer wargame */ -/* Copyright (C) 1998-2025 Christian Mauduit */ -/* */ -/* 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 */ -/* */ -/* Liquid War homepage : https://ufoot.org/liquidwar/v5 */ -/* Contact author : ufoot@ufoot.org */ -/*****************************************************************************/ - -/********************************************************************/ -/* nom : monster.h */ -/* contenu : deplacement des streums accelere */ -/* date de modif : 3 mai 98 */ -/********************************************************************/ - -#ifndef LIQUID_WAR_INCLUDE_MONSTER -#define LIQUID_WAR_INCLUDE_MONSTER - -/*==================================================================*/ -/* includes */ -/*==================================================================*/ - -#include "area.h" -#include "mesh.h" -#include "asm.h" - -/*==================================================================*/ -/* types */ -/*==================================================================*/ - -extern void LW_ASM_FUNC boost_move_fighters (FIGHTER * current_army, - int current_army_size, - PLACE * current_area, - int current_area_w, - int *active_fighters, - int *attack, - int *defense, - int *new_health, - int max_fighter_health_1, - int sens, - int start, - int neg_global_clock, - int *fighter_move_xy, - int *fighter_move_offset, - char *current_area_back_data, - char *current_area_disp_data, - int *color_first_entry, - int colors_per_team, - int *local_dir, - int temp1, - int temp2, - int temp3, - int temp4, - int temp5, - int temp6, int temp7, int temp8); - -#endif diff --git a/src/monster.s b/src/monster.s deleted file mode 100644 index 5f9e689a..00000000 --- a/src/monster.s +++ /dev/null @@ -1,974 +0,0 @@ -/********************************************************************/ -/* */ -/* L I QQ U U I DD W W A RR 555 */ -/* L I Q Q U U I D D W W A A R R 5 */ -/* L I Q Q U U I D D W W W AAA RR 55 */ -/* L I Q Q U U I D D WW WW A A R R 5 */ -/* LLL I Q Q U I DD W W A A R R 55 */ -/* */ -/* b */ -/* bb y y */ -/* b b yyy */ -/* bb y */ -/* yy */ -/* */ -/* U U FFF O O TTT */ -/* U U F O O O O T */ -/* U U TIRET FF O O O O T */ -/* U U F O O O O T */ -/* U F O O T */ -/* */ -/********************************************************************/ - -/*****************************************************************************/ -/* Liquid War is a multiplayer wargame */ -/* Copyright (C) 1998-2025 Christian Mauduit */ -/* */ -/* 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 */ -/* */ -/* Liquid War homepage : https://ufoot.org/liquidwar/v5 */ -/* Contact author : ufoot@ufoot.org */ -/*****************************************************************************/ - -/********************************************************************/ -/* nom : monster.s */ -/* contenu : deplacement des streums accelere */ -/* date de modif : 3 mai 98 */ -/********************************************************************/ - - -/*typedef union */ -/* { */ -/* int time; */ -/* struct */ -/* { */ -/* short x; */ -/* short y; */ -/* } cursor; */ -/* } MESH_UPDATE; */ - -/* typedef struct */ -/* { */ -/* int dir :8; */ -/* int grad:24; */ -/* } MESH_STATE; */ - -/*typedef struct */ -/* { */ -/* MESH_UPDATE update;*/ -/* MESH_STATE state; */ -/* } MESH_INFO; */ - -.equ SIZE_OF_INFO,8 - -.equ INFO_UPDATE,0 -.equ INFO_STATE,4 - - -/*typedef struct */ -/* { */ -/* char decal_for_dir :8; */ -/* int size :24; */ -/* } MESH_SIDE; */ - -/*typedef struct */ -/* { */ -/* short x; */ -/* short y; */ -/* MESH_SIDE side; */ -/* MESH_INFO info[NB_TEAMS]; */ -/* void *link[NB_DIRS]; */ -/* } MESH; */ - -.equ SIZE_OF_MESH,104 - -.equ MESH_INFO,8 -.equ MESH_LINK,56 - - - -/*typedef struct */ -/* { */ -/* short x; */ -/* short y; */ -/* short health; */ -/* char team; */ -/* char last_dir; */ -/* } FIGHTER; */ - - -.equ SIZE_OF_FIGHTER,8 -.equ FIGHTER_XY,0 -.equ FIGHTER_X,0 -.equ FIGHTER_Y,2 -.equ FIGHTER_HEALTH,4 -.equ FIGHTER_TEAM,6 -.equ FIGHTER_LAST_DIR,7 - - -/*typedef struct */ -/* { */ -/* MESH *mesh; */ -/* FIGHTER *fighter; */ -/* } PLACE; */ - - -.equ SIZE_OF_PLACE,8 -.equ PLACE_MESH,0 -.equ PLACE_FIGHTER,4 - -.equ MOVE_BLOCK_NUMBER,5 - -.equ ARG_CURRENT_ARMY, 8 -.equ ARG_CURRENT_ARMY_SIZE, 12 -.equ ARG_CURRENT_AREA, 16 -.equ ARG_CURRENT_AREA_W, 20 -.equ ARG_ACTIVE_FIGHTERS, 24 -.equ ARG_ATTACK, 28 -.equ ARG_DEFENSE, 32 -.equ ARG_NEW_HEALTH, 36 -.equ ARG_MAX_FIGHTER_HEALTH_1, 40 -.equ ARG_SENS, 44 -.equ ARG_START, 48 -.equ ARG_NEG_GLOBAL_CLOCK, 52 -.equ ARG_FIGHTER_MOVE_XY, 56 -.equ ARG_FIGHTER_MOVE_OFFSET, 60 -.equ ARG_CURRENT_AREA_BACK, 64 -.equ ARG_CURRENT_AREA_DISP, 68 -.equ ARG_COLOR_FIRST_ENTRY, 72 -.equ ARG_COLORS_PER_TEAM, 76 -.equ ARG_LOCAL_DIR, 80 -.equ ARG_TEMP1, 84 -.equ ARG_TEMP2, 88 -.equ ARG_TEMP3, 92 -.equ ARG_TEMP4, 96 -.equ ARG_TEMP5, 100 -.equ ARG_TEMP6, 104 -.equ ARG_TEMP7, 108 -.equ ARG_TEMP8, 112 - -.equ OFFSET_P0,0 -.equ OFFSET_P1,4 -.equ OFFSET_P2,8 -.equ OFFSET_P3,12 -.equ OFFSET_P4,16 - -.equ SIDE_ATTACK_FACTOR,4 #on divise attaque par 2^4=16 qd - #l attaque se fait sur le cote - -/*#define AREA_START_GRADIENT 2000000*/ -.equ AREA_START_GRADIENT,2000000*256 - -.text - - - -/*==================================================================*/ -/* grosse fonction enorme, on fait ce qu on pneu */ -/*==================================================================*/ - -/*--------------------------------------------------------------------*/ -/* void boost_move_fighters (FIGHTER *current_army, */ -/* int current_army_size, */ -/* PLACE *current_area, */ -/* int current_area_w, */ -/* int *active_fighters, */ -/* int *attack, */ -/* int *defense, */ -/* int *new_health, */ -/* int max_fighter_health_1, */ -/* int sens, */ -/* int start, */ -/* int neg_global_clock, */ -/* int *fighter_move_xy, */ -/* int *fighter_move_offset, */ -/* char *current_area_back_data, */ -/* char *current_area_disp_data, */ -/* int *color_first_entry, */ -/* int colors_per_team, */ -/* int *local_dir, */ -/* int temp1, */ -/* int temp2, */ -/* int temp3, */ -/* int temp4, */ -/* int temp5, */ -/* int temp6, */ -/* int temp7, */ -/* int temp8); */ -/*--------------------------------------------------------------------*/ -.globl _boost_move_fighters -.globl boost_move_fighters - .align 4 -_boost_move_fighters: -boost_move_fighters: - pushl %ebp - movl %esp, %ebp - pushl %eax - pushl %ebx - pushl %ecx - pushl %edx - pushl %esi - pushl %edi - pushw %es - pushw %fs - pushw %gs - - movw %ds,%ax - movw %ax,%es - movw %ax,%fs - movw %ax,%gs - - movl ARG_CURRENT_ARMY_SIZE(%ebp),%ecx # ecx=nombre de streums - movl ARG_CURRENT_ARMY(%ebp),%esi # esi=adresse du streum courant - -main_loop: - push %ecx - -/*------------------------------------------------------------------*/ -/* indice de l equipe */ -/*------------------------------------------------------------------*/ - xor %ecx,%ecx # ecx a zero - movb FIGHTER_TEAM(%esi),%cl # equipe dans le champ ecx - movl %ecx,%ds:ARG_TEMP1(%ebp) # temp1 prend team - shl $2,%ecx # ecx contient maintenant team*4 - -/*------------------------------------------------------------------*/ -/* mise a jour du nombre de combattants de l equipe */ -/*------------------------------------------------------------------*/ - mov ARG_ACTIVE_FIGHTERS(%ebp),%edi # recuperation de pointeur - add %ecx,%edi # ajout de l offset pour l equipe - incl %ds:(%edi) # mise a jour du fighter number - -/*------------------------------------------------------------------*/ -/* localisation du streum courant */ -/*------------------------------------------------------------------*/ - movl FIGHTER_XY(%esi),%eax # eax contient fighter->xy - xor %ebx,%ebx # ebx a 0 - movw %ax,%bx # ebx contient fighter->x - shr $16,%eax # eax contient fighter->y - cdq # je crois que ca sert pour imul - mull %ds:ARG_CURRENT_AREA_W(%ebp) # eax prend fighter->y*CURRENT_AREA_W - add %ebx,%eax # eax contient un joli offset - mov %eax,%ds:ARG_TEMP2(%ebp) # temp2 prend y*CURRENT_AREA_W+1 - shl $3,%eax # eax*=8 (taille de PLACE) - add ARG_CURRENT_AREA(%ebp),%eax - mov %eax,%edi # edi=adresse dans CURRENT_AREA - # situant la place du streum courant -/*------------------------------------------------------------------*/ -/* on recupere le parametre update du streum courant */ -/*------------------------------------------------------------------*/ - shl $1,%ecx # ecx contient maintenant team*8 - add $MESH_INFO,%ecx # ecx=offset pour info%team - mov PLACE_MESH(%edi),%ebx # ebx prend l adresse du maillage - add %ecx,%ebx # sur l instant de mise a jour - mov INFO_UPDATE(%ebx),%eax # eax=instant mise a jour - -/*------------------------------------------------------------------*/ -/* on calcule la direction principale de deplacement */ -/*------------------------------------------------------------------*/ - cmp $0,%eax - jge fdl_start - -/*------------------------------------------------------------------*/ -/* calcul base sur les gradients */ -/*------------------------------------------------------------------*/ - mov ARG_NEG_GLOBAL_CLOCK(%ebp),%edx # edx=-GLOBAL_CLOCK - cmp %edx,%eax # direction a jour??? - je fdg_dir_ok # oui... - # non, on la met, en - mov %edx,INFO_UPDATE(%ebx) # commencant par l heure - - mov ARG_START(%ebp),%al # al=direction de depart - mov %al,%ah # ah=direction courante - ror $8,%eax - mov %al,%ah # direction trouvee sur - rol $8,%eax # la partie haute de eax - - mov $AREA_START_GRADIENT,%edx # plus proche distance - # trouvee - - movb ARG_SENS(%ebp),%bl # bl=sens - - cmp $0,%bl - jne fdg_sens_1 - -/*------------------------------------------------------------------*/ -/* dans le sens 0 */ -/*------------------------------------------------------------------*/ -fdg_sens_0: -loop_fdg_sens_0: - - xor %ebx,%ebx - mov %ah,%bl - sal $2,%ebx - add PLACE_MESH(%edi),%ebx # ebx prend l adresse du maillage - mov MESH_LINK(%ebx),%ebx - cmp $0,%ebx # le mesh existe-t-il ??? - je not_better_fdg_sens_0 - add %ecx,%ebx # sur l instant de mise a jour - mov INFO_STATE(%ebx),%ebx # ebx= distance - cmp %edx,%ebx # on compare - jge not_better_fdg_sens_0 # pas mieux - mov %ebx,%edx # mieux!, on met a jour - ror $8,%eax - mov %al,%ah # direction trouve ds eax haut - rol $8,%eax - -not_better_fdg_sens_0: - inc %ah # direction suivante - cmp $12,%ah - jne skip_fdg_sens_0 - xor %ah,%ah -skip_fdg_sens_0: - cmp %ah,%al - jne loop_fdg_sens_0 - - movb $1,ARG_SENS(%ebp) # la prochaine fois on - # changera de direction - jmp fdg_end_of_calc - -/*------------------------------------------------------------------*/ -/* dans le sens 1 */ -/*------------------------------------------------------------------*/ -fdg_sens_1: -loop_fdg_sens_1: - - xor %ebx,%ebx - mov %ah,%bl - sal $2,%ebx - add PLACE_MESH(%edi),%ebx # ebx prend l adresse du maillage - mov MESH_LINK(%ebx),%ebx - cmp $0,%ebx # le mesh existe-t-il ??? - je not_better_fdg_sens_1 - add %ecx,%ebx # sur l instant de mise a jour - mov INFO_STATE(%ebx),%ebx # ebx= distance - cmp %edx,%ebx # on compare - jge not_better_fdg_sens_1 # pas mieux - mov %ebx,%edx # mieux!, on met a jour - ror $8,%eax - mov %al,%ah # direction trouve ds eax haut - rol $8,%eax - -not_better_fdg_sens_1: - dec %ah # direction suivante - jge skip_fdg_sens_1 - mov $11,%ah -skip_fdg_sens_1: - cmp %ah,%al - jne loop_fdg_sens_1 - - movb $0,ARG_SENS(%ebp) # la prochaine fois on - # changera de direction -# jmp fdg_end_of_calc - -/*------------------------------------------------------------------*/ -/* fin du calcul, partie commune du calcul de direction principal */ -/*------------------------------------------------------------------*/ -fdg_end_of_calc: - mov PLACE_MESH(%edi),%ebx # ebx prend l adresse du maillage - add %ecx,%ebx # sur le param update - ror $8,%eax # ah=dir choisie - movb %ah,INFO_STATE(%ebx) # mise a jour en memoire - -/*------------------------------------------------------------------*/ -/* la direction a ete calculee pour tout le mesh */ -/*------------------------------------------------------------------*/ -fdg_dir_ok: - xor %eax,%eax # eax a 0 - movb INFO_STATE(%ebx),%al # - -# movb $0,%al - - jmp dir_calculated -skip_1: - -/*------------------------------------------------------------------*/ -/* calcul "local" */ -/*------------------------------------------------------------------*/ - -fdl_start: - xor %ecx,%ecx # ecx= resultat des tests - movl FIGHTER_XY(%esi),%edx # eax contient fighter->xy - - cmp %ax,%dx - je fdl_skip_x1 - jg fdl_skip_x2 - or $2,%cl - jmp fdl_skip_x1 -fdl_skip_x2: - or $8,%cl -fdl_skip_x1: - - ror $16,%eax - ror $16,%edx - - cmp %ax,%dx - je fdl_skip_x3 - jg fdl_skip_x4 - or $4,%cl - jmp fdl_skip_x3 -fdl_skip_x4: - or $1,%cl -fdl_skip_x3: - - or %cl,%cl - je on_the_spot - mov ARG_LOCAL_DIR(%ebp),%ebx - dec %cl - shl $1,%cl - add ARG_SENS(%ebp),%ecx - shl $2,%cl - add %ecx,%ebx - mov (%ebx),%eax - jmp end_of_fdl -on_the_spot: - mov ARG_START(%ebp),%eax -end_of_fdl: - -#movb $6,%al - - # a l issue de ces calculs, eax contient la direction en question - -/*------------------------------------------------------------------*/ -/* on dispose ici dans eax de la direction principale de deplacement*/ -/*------------------------------------------------------------------*/ - -dir_calculated: - - shl $2,%eax - mov %eax,%ecx - shl $2,%eax - add %eax,%ecx #ecx=eax*20... - -/*------------------------------------------------------------------*/ -/* test si deplacement possible dans direction associee a p0 */ -/*------------------------------------------------------------------*/ - - mov %ecx,%ebx #on recupere la dir - add ARG_FIGHTER_MOVE_OFFSET(%ebp),%ebx #ebx=pointeur a garder!!! - mov OFFSET_P0(%ebx),%eax #eax=offs ds cur_area - - mov %eax,ARG_TEMP5(%ebp) #offset dir p0 memorise - - shl $3,%eax - add %edi,%eax #eax=pointeur sur place - - mov PLACE_MESH(%eax),%edx #edx=pointeur sur mesh - cmp $0,%edx #la place est-elle un mur? - je skip_3 #oui - mov PLACE_FIGHTER(%eax),%edx #edx=pointeur sur fighter - cmp $0,%edx #la place est-elle libre? - jne skip_3 #non - -/*------------------------------------------------------------------*/ -/* deplacement dans direction associee a p0 */ -/*------------------------------------------------------------------*/ - - movl $0,%ds:PLACE_FIGHTER(%edi) #on vide dans cur_area - mov %esi,%ds:PLACE_FIGHTER(%eax) #nouvelle place - - add ARG_FIGHTER_MOVE_XY(%ebp),%ecx #offset ds move_xy - mov OFFSET_P0(%ecx),%edx #on charge l increm - addl %edx,%ds:FIGHTER_XY(%esi) #addition des coord - - mov ARG_TEMP2(%ebp),%ecx #y*cur_area_w+x - mov ARG_CURRENT_AREA_BACK(%ebp),%eax #eax=cur_area_back->dat - add %ecx,%eax #pointe sur pixel - movb %ds:(%eax),%dl #pixel memorise - mov ARG_CURRENT_AREA_DISP(%ebp),%eax #eax=cur_area_disp->dat - add %ecx,%eax #pointe sur pixel - movb %ds:(%eax),%dh #couleur du monstre - movb %dl,%ds:(%eax) #effacement - add OFFSET_P0(%ebx),%eax #deplacement - movb %dh,%ds:(%eax) #affichage - - jmp next_monster #fini avec ce monstre... - -skip_3: - -/*------------------------------------------------------------------*/ -/* test si deplacement possible dans direction associee a p1 */ -/*------------------------------------------------------------------*/ - - mov %ecx,%ebx #on recupere la dir - add ARG_FIGHTER_MOVE_OFFSET(%ebp),%ebx #ebx=pointeur a garder!!! - mov OFFSET_P1(%ebx),%eax #eax=offs ds cur_area - - mov %eax,ARG_TEMP6(%ebp) #offset dir p1 memorise - - shl $3,%eax - add %edi,%eax #eax=pointeur sur place - - mov PLACE_MESH(%eax),%edx #edx=pointeur sur mesh - cmp $0,%edx #la place est-elle un mur? - je skip_4 #oui - mov PLACE_FIGHTER(%eax),%edx #edx=pointeur sur fighter - cmp $0,%edx #la place est-elle libre? - jne skip_4 #non - -/*------------------------------------------------------------------*/ -/* deplacement dans direction associee a p1 */ -/*------------------------------------------------------------------*/ - - movl $0,%ds:PLACE_FIGHTER(%edi) #on vide dans cur_area - mov %esi,%ds:PLACE_FIGHTER(%eax) #nouvelle place - - add ARG_FIGHTER_MOVE_XY(%ebp),%ecx #offset ds move_xy - mov OFFSET_P1(%ecx),%edx #on charge l increm - addl %edx,%ds:FIGHTER_XY(%esi) #addition des coord - - mov ARG_TEMP2(%ebp),%ecx #y*cur_area_w+x - mov ARG_CURRENT_AREA_BACK(%ebp),%eax #eax=cur_area_back->dat - add %ecx,%eax #pointe sur pixel - movb %ds:(%eax),%dl #pixel memorise - mov ARG_CURRENT_AREA_DISP(%ebp),%eax #eax=cur_area_disp->dat - add %ecx,%eax #pointe sur pixel - movb %ds:(%eax),%dh #couleur du monstre - movb %dl,%ds:(%eax) #effacement - add OFFSET_P1(%ebx),%eax #deplacement - movb %dh,%ds:(%eax) #affichage - - jmp next_monster #fini avec ce monstre... - -skip_4: - -/*------------------------------------------------------------------*/ -/* test si deplacement possible dans direction associee a p2 */ -/*------------------------------------------------------------------*/ - - mov %ecx,%ebx #on recupere la dir - add ARG_FIGHTER_MOVE_OFFSET(%ebp),%ebx #ebx=pointeur a garder!!! - mov OFFSET_P2(%ebx),%eax #eax=offs ds cur_area - - mov %eax,ARG_TEMP7(%ebp) #offset dir p2 memorise - - shl $3,%eax - add %edi,%eax #eax=pointeur sur place - - mov PLACE_MESH(%eax),%edx #edx=pointeur sur mesh - cmp $0,%edx #la place est-elle un mur? - je skip_5 #oui - mov PLACE_FIGHTER(%eax),%edx #edx=pointeur sur fighter - cmp $0,%edx #la place est-elle libre? - jne skip_5 #non - -/*------------------------------------------------------------------*/ -/* deplacement dans direction associee a p2 */ -/*------------------------------------------------------------------*/ - - movl $0,%ds:PLACE_FIGHTER(%edi) #on vide dans cur_area - mov %esi,%ds:PLACE_FIGHTER(%eax) #nouvelle place - - add ARG_FIGHTER_MOVE_XY(%ebp),%ecx #offset ds move_xy - mov OFFSET_P2(%ecx),%edx #on charge l increm - addl %edx,%ds:FIGHTER_XY(%esi) #addition des coord - - mov ARG_TEMP2(%ebp),%ecx #y*cur_area_w+x - mov ARG_CURRENT_AREA_BACK(%ebp),%eax #eax=cur_area_back->dat - add %ecx,%eax #pointe sur pixel - movb %ds:(%eax),%dl #pixel memorise - mov ARG_CURRENT_AREA_DISP(%ebp),%eax #eax=cur_area_disp->dat - add %ecx,%eax #pointe sur pixel - movb %ds:(%eax),%dh #couleur du monstre - movb %dl,%ds:(%eax) #effacement - add OFFSET_P2(%ebx),%eax #deplacement - movb %dh,%ds:(%eax) #affichage - - jmp next_monster #fini avec ce monstre... - -skip_5: - -/*------------------------------------------------------------------*/ -/* test si deplacement possible dans direction associee a p3 */ -/*------------------------------------------------------------------*/ - - mov %ecx,%ebx #on recupere la dir - add ARG_FIGHTER_MOVE_OFFSET(%ebp),%ebx #ebx=pointeur a garder!!! - mov OFFSET_P3(%ebx),%eax #eax=offs ds cur_area - shl $3,%eax - add %edi,%eax #eax=pointeur sur place - - mov PLACE_MESH(%eax),%edx #edx=pointeur sur mesh - cmp $0,%edx #la place est-elle un mur? - je skip_6 #oui - mov PLACE_FIGHTER(%eax),%edx #edx=pointeur sur fighter - cmp $0,%edx #la place est-elle libre? - jne skip_6 #non - -/*------------------------------------------------------------------*/ -/* deplacement dans direction associee a p3 */ -/*------------------------------------------------------------------*/ - - movl $0,%ds:PLACE_FIGHTER(%edi) #on vide dans cur_area - mov %esi,%ds:PLACE_FIGHTER(%eax) #nouvelle place - - add ARG_FIGHTER_MOVE_XY(%ebp),%ecx #offset ds move_xy - mov OFFSET_P3(%ecx),%edx #on charge l increm - addl %edx,%ds:FIGHTER_XY(%esi) #addition des coord - - mov ARG_TEMP2(%ebp),%ecx #y*cur_area_w+x - mov ARG_CURRENT_AREA_BACK(%ebp),%eax #eax=cur_area_back->dat - add %ecx,%eax #pointe sur pixel - movb %ds:(%eax),%dl #pixel memorise - mov ARG_CURRENT_AREA_DISP(%ebp),%eax #eax=cur_area_disp->dat - add %ecx,%eax #pointe sur pixel - movb %ds:(%eax),%dh #couleur du monstre - movb %dl,%ds:(%eax) #effacement - add OFFSET_P3(%ebx),%eax #deplacement - movb %dh,%ds:(%eax) #affichage - - jmp next_monster #fini avec ce monstre... - -skip_6: - -/*------------------------------------------------------------------*/ -/* test si deplacement possible dans direction associee a p4 */ -/*------------------------------------------------------------------*/ - - mov %ecx,%ebx #on recupere la dir - add ARG_FIGHTER_MOVE_OFFSET(%ebp),%ebx #ebx=pointeur a garder!!! - mov OFFSET_P4(%ebx),%eax #eax=offs ds cur_area - shl $3,%eax - add %edi,%eax #eax=pointeur sur place - - mov PLACE_MESH(%eax),%edx #edx=pointeur sur mesh - cmp $0,%edx #la place est-elle un mur? - je skip_7 #oui - mov PLACE_FIGHTER(%eax),%edx #edx=pointeur sur fighter - cmp $0,%edx #la place est-elle libre? - jne skip_7 #non - -/*------------------------------------------------------------------*/ -/* deplacement dans direction associee a p4 */ -/*------------------------------------------------------------------*/ - - movl $0,%ds:PLACE_FIGHTER(%edi) #on vide dans cur_area - mov %esi,%ds:PLACE_FIGHTER(%eax) #nouvelle place - - add ARG_FIGHTER_MOVE_XY(%ebp),%ecx #offset ds move_xy - mov OFFSET_P4(%ecx),%edx #on charge l increm - addl %edx,%ds:FIGHTER_XY(%esi) #addition des coord - - mov ARG_TEMP2(%ebp),%ecx #y*cur_area_w+x - mov ARG_CURRENT_AREA_BACK(%ebp),%eax #eax=cur_area_back->dat - add %ecx,%eax #pointe sur pixel - movb %ds:(%eax),%dl #pixel memorise - mov ARG_CURRENT_AREA_DISP(%ebp),%eax #eax=cur_area_disp->dat - add %ecx,%eax #pointe sur pixel - movb %ds:(%eax),%dh #couleur du monstre - movb %dl,%ds:(%eax) #effacement - add OFFSET_P4(%ebx),%eax #deplacement - movb %dh,%ds:(%eax) #affichage - - jmp next_monster #fini avec ce monstre... - -skip_7: - -/*------------------------------------------------------------------*/ -/* test si attaque dans direction associee a p0 */ -/*------------------------------------------------------------------*/ - - mov ARG_TEMP5(%ebp),%eax #mega astuce!!! - shl $3,%eax - add %edi,%eax #eax=pointeur sur place - - mov PLACE_MESH(%eax),%edx #edx=pointeur sur mesh - cmp $0,%edx #la place est-elle un mur? - je skip_8 #oui, fini - mov PLACE_FIGHTER(%eax),%edx #edx=pointeur sur fighter - cmp $0,%edx #y-a-t-il un streum? - je skip_8 #non, fini - movb ARG_TEMP1(%ebp),%al #recupere team - cmpb FIGHTER_TEAM(%edx),%al #compare - je skip_8 #les memes... - -/*------------------------------------------------------------------*/ -/* attaque ds dir associee a p0 */ -/*------------------------------------------------------------------*/ - - xor %ecx,%ecx # ecx a 0 - mov %al,%cl # ecx=al - shl $2,%cl # ecx=team*4 - mov ARG_ATTACK(%ebp),%ebx # ebx=attack - add %ecx,%ebx # ebx=attack[team] - movw FIGHTER_HEALTH(%edx),%ax # ax=health du voisin - subw (%ebx),%ax # attaque!!! - jg no_change_team_0 # change de camp??? - mov ARG_NEW_HEALTH(%ebp),%ebx # ebx=new_health - add %ecx,%ebx # ebx=new_health[team] - movw (%ebx),%bx # bx=valeur de n_h[team] -new_health_loop_0: - add %bx,%ax # health+=new_health - jl new_health_loop_0 # tant que health<0 - mov ARG_MAX_FIGHTER_HEALTH_1(%ebp),%bx - cmpw %bx,%ax # health>max_health-1? - jle not_to_much_new_health_0 - mov %bx,%ax # health=max_health-1 -not_to_much_new_health_0: - shr $2,%cl - movb %cl,FIGHTER_TEAM(%edx) # changement de team - shl $2,%cl # en memoire - jmp display_attacked_fighter_0 - -no_change_team_0: - xor %ecx,%ecx # ecx=0 - movb FIGHTER_TEAM(%edx),%cl # cl=team - shl $2,%cl # ecx=team*4 - -display_attacked_fighter_0: - - movw %ax,FIGHTER_HEALTH(%edx) # health en mem - - cwde # eax=ax - mov ARG_COLORS_PER_TEAM(%ebp),%ebx # bx=colors - cdq - mull %ebx # eax*=colors - mov ARG_MAX_FIGHTER_HEALTH_1(%ebp),%ebx # bx=max_health - inc %ebx - cdq - divl %ebx # eax/=max_health - mov ARG_COLOR_FIRST_ENTRY(%ebp),%ebx # ebx=cfe - add %ecx,%ebx # ebx=cfe+team - addb (%ebx),%al # eax=color - - mov ARG_CURRENT_AREA_DISP(%ebp),%ebx # ecx=cur_area_disp>dat - add ARG_TEMP2(%ebp),%ebx # y*cur_area_w+x - add ARG_TEMP5(%ebp),%ebx #on recupere la dir - - movb %al,(%ebx) - - jmp next_monster -skip_8: - -/*------------------------------------------------------------------*/ -/* test si attaque dans direction associee a p1 */ -/*------------------------------------------------------------------*/ - - mov ARG_TEMP6(%ebp),%eax #mega astuce!!! - shl $3,%eax - add %edi,%eax #eax=pointeur sur place - - mov PLACE_MESH(%eax),%edx #edx=pointeur sur mesh - cmp $0,%edx #la place est-elle un mur? - je skip_9 #oui, fini - mov PLACE_FIGHTER(%eax),%edx #edx=pointeur sur fighter - cmp $0,%edx #y-a-t-il un streum? - je skip_9 #non, fini - movb ARG_TEMP1(%ebp),%al #recupere team - cmpb FIGHTER_TEAM(%edx),%al #compare - je skip_9 #les memes... - -/*------------------------------------------------------------------*/ -/* attaque ds dir associee a p1 */ -/*------------------------------------------------------------------*/ - - xor %ecx,%ecx # ecx a 0 - mov %al,%cl # ecx=al - shl $2,%cl # ecx=team*4 - mov ARG_ATTACK(%ebp),%ebx # ebx=attack - add %ecx,%ebx # ebx=attack[team] - movw FIGHTER_HEALTH(%edx),%ax # ax=health du voisin - mov (%ebx),%bx # bx=force d attaque - shr $SIDE_ATTACK_FACTOR,%bx # force/ car - # attaque sur le cote - subw %bx,%ax # attaque!!! - jg no_change_team_1 # change de camp??? - mov ARG_NEW_HEALTH(%ebp),%ebx # ebx=new_health - add %ecx,%ebx # ebx=new_health[team] - movw (%ebx),%bx # bx=valeur de n_h[team] -new_health_loop_1: - add %bx,%ax # health+=new_health - jl new_health_loop_1 # tant que health<0 - mov ARG_MAX_FIGHTER_HEALTH_1(%ebp),%bx - cmpw %bx,%ax # health>max_health-1? - jle not_to_much_new_health_1 - mov %bx,%ax # health=max_health-1 -not_to_much_new_health_1: - shr $2,%cl - movb %cl,FIGHTER_TEAM(%edx) # changement de team - shl $2,%cl # en memoire - jmp display_attacked_fighter_1 - -no_change_team_1: - xor %ecx,%ecx # ecx=0 - movb FIGHTER_TEAM(%edx),%cl # cl=team - shl $2,%cl # ecx=team*4 - -display_attacked_fighter_1: - - movw %ax,FIGHTER_HEALTH(%edx) # health en mem - - cwde # eax=ax - mov ARG_COLORS_PER_TEAM(%ebp),%ebx # bx=colors - cdq - mull %ebx # eax*=colors - mov ARG_MAX_FIGHTER_HEALTH_1(%ebp),%ebx # bx=max_health - inc %ebx - cdq - divl %ebx # eax/=max_health - mov ARG_COLOR_FIRST_ENTRY(%ebp),%ebx # ebx=cfe - add %ecx,%ebx # ebx=cfe+team - addb (%ebx),%al # eax=color - - mov ARG_CURRENT_AREA_DISP(%ebp),%ebx # ecx=cur_area_disp>dat - add ARG_TEMP2(%ebp),%ebx # y*cur_area_w+x - add ARG_TEMP6(%ebp),%ebx #on recupere la dir - - movb %al,(%ebx) - - jmp next_monster -skip_9: - -/*------------------------------------------------------------------*/ -/* test si attaque dans direction associee a p2 */ -/*------------------------------------------------------------------*/ - - mov ARG_TEMP6(%ebp),%eax #mega astuce!!! - shl $3,%eax - add %edi,%eax #eax=pointeur sur place - - mov PLACE_MESH(%eax),%edx #edx=pointeur sur mesh - cmp $0,%edx #la place est-elle un mur? - je skip_10 #oui, fini - mov PLACE_FIGHTER(%eax),%edx #edx=pointeur sur fighter - cmp $0,%edx #y-a-t-il un streum? - je skip_10 #non, fini - movb ARG_TEMP1(%ebp),%al #recupere team - cmpb FIGHTER_TEAM(%edx),%al #compare - je skip_10 #les memes... - -/*------------------------------------------------------------------*/ -/* attaque ds dir associee a p2 */ -/*------------------------------------------------------------------*/ - - xor %ecx,%ecx # ecx a 0 - mov %al,%cl # ecx=al - shl $2,%cl # ecx=team*4 - mov ARG_ATTACK(%ebp),%ebx # ebx=attack - add %ecx,%ebx # ebx=attack[team] - movw FIGHTER_HEALTH(%edx),%ax # ax=health du voisin - mov (%ebx),%bx # bx=force d attaque - shr $SIDE_ATTACK_FACTOR,%bx # force/ car - # attaque sur le cote - subw %bx,%ax # attaque!!! - jg no_change_team_2 # change de camp??? - mov ARG_NEW_HEALTH(%ebp),%ebx # ebx=new_health - add %ecx,%ebx # ebx=new_health[team] - movw (%ebx),%bx # bx=valeur de n_h[team] -new_health_loop_2: - add %bx,%ax # health+=new_health - jl new_health_loop_2 # tant que health<0 - mov ARG_MAX_FIGHTER_HEALTH_1(%ebp),%bx - cmpw %bx,%ax # health>max_health-1? - jle not_to_much_new_health_2 - mov %bx,%ax # health=max_health-1 -not_to_much_new_health_2: - shr $2,%cl - movb %cl,FIGHTER_TEAM(%edx) # changement de team - shl $2,%cl # en memoire - jmp display_attacked_fighter_2 - -no_change_team_2: - xor %ecx,%ecx # ecx=0 - movb FIGHTER_TEAM(%edx),%cl # cl=team - shl $2,%cl # ecx=team*4 - -display_attacked_fighter_2: - - movw %ax,FIGHTER_HEALTH(%edx) # health en mem - - cwde # eax=ax - mov ARG_COLORS_PER_TEAM(%ebp),%ebx # bx=colors - cdq - mull %ebx # eax*=colors - mov ARG_MAX_FIGHTER_HEALTH_1(%ebp),%ebx # bx=max_health - inc %ebx - cdq - divl %ebx # eax/=max_health - mov ARG_COLOR_FIRST_ENTRY(%ebp),%ebx # ebx=cfe - add %ecx,%ebx # ebx=cfe+team - addb (%ebx),%al # eax=color - - mov ARG_CURRENT_AREA_DISP(%ebp),%ebx # ecx=cur_area_disp>dat - add ARG_TEMP2(%ebp),%ebx # y*cur_area_w+x - add ARG_TEMP6(%ebp),%ebx #on recupere la dir - - movb %al,(%ebx) - - jmp next_monster -skip_10: - -/*------------------------------------------------------------------*/ -/* test si regeneration dans direction associee a p0 */ -/*------------------------------------------------------------------*/ - mov ARG_TEMP5(%ebp),%eax #mega astuce!!! - shl $3,%eax - add %edi,%eax #eax=pointeur sur place - - mov PLACE_MESH(%eax),%edx #edx=pointeur sur mesh - cmp $0,%edx #la place est-elle un mur? - je skip_11 #oui, fini - mov PLACE_FIGHTER(%eax),%edx #edx=pointeur sur fighter - cmp $0,%edx #y-a-t-il un streum? - je skip_11 #non, fini - movb ARG_TEMP1(%ebp),%al #recupere team - cmpb FIGHTER_TEAM(%edx),%al #compare - jne skip_11 #les memes... - -/*------------------------------------------------------------------*/ -/* regeneration ds dir associee a p0 */ -/*------------------------------------------------------------------*/ - xor %ecx,%ecx # ecx a 0 - mov %al,%cl # ecx=al - shl $2,%cl # ecx=team*4 - mov ARG_DEFENSE(%ebp),%ebx # ebx=defense - add %ecx,%ebx # ebx=defense[team] - movw FIGHTER_HEALTH(%edx),%ax # ax=health du voisin - addw (%ebx),%ax # regeneration!!! - mov ARG_MAX_FIGHTER_HEALTH_1(%ebp),%bx - cmpw %bx,%ax # health>max_health? - jle not_to_much_defense - mov %bx,%ax -not_to_much_defense: - jmp display_attacked_fighter_0 -skip_11: - -/*------------------------------------------------------------------*/ -/* fin de la boucle, on passe a la suite */ -/*------------------------------------------------------------------*/ -next_monster: - add $SIZE_OF_FIGHTER,%esi # on passe au streumon suivant - - pop %ecx - dec %ecx - je the_end - jmp main_loop - -the_end: - - popw %gs - popw %fs - popw %es - popl %edi - popl %esi - popl %edx - popl %ecx - popl %ebx - popl %eax -/* movl %ebp, %esp*/ - popl %ebp - ret # retour au c - - diff --git a/src/mouse.c b/src/mouse.c index 7af61ba5..734763c4 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -52,8 +52,7 @@ /* includes */ /*==================================================================*/ -#include - +#include "backport.h" #include "config.h" #include "mouse.h" #include "disk.h" diff --git a/src/move.c b/src/move.c index e040c776..1758895b 100644 --- a/src/move.c +++ b/src/move.c @@ -52,7 +52,7 @@ /* includes */ /*==================================================================*/ -#include +#include #include "area.h" #include "autoplay.h" diff --git a/src/music.c b/src/music.c index 6b5932cd..2bc3c389 100644 --- a/src/music.c +++ b/src/music.c @@ -53,6 +53,7 @@ #include +#include "backport.h" #include "config.h" #include "disk.h" #include "startup.h" diff --git a/src/netconf.c b/src/netconf.c index 2c94633e..7c62096c 100644 --- a/src/netconf.c +++ b/src/netconf.c @@ -56,6 +56,7 @@ #include #include +#include "backport.h" #include "netconf.h" #include "sock2gen.h" #include "log.h" @@ -145,15 +146,10 @@ lw_netconf_send (int *sock, LW_NETCONF * config) if (lw_sock_send_str (sock, buffer)) { LW_MACRO_SPRINTF1 (buffer, "%d", - config->asm_algorithm); + config->min_map_res); if (lw_sock_send_str (sock, buffer)) { - LW_MACRO_SPRINTF1 (buffer, "%d", - config->min_map_res); - if (lw_sock_send_str (sock, buffer)) - { - result = 1; - } + result = 1; } } } @@ -209,8 +205,6 @@ lw_netconf_recv (int *sock, LW_NETCONF * config) config->cpu_vs_human = atoi (buffer); if (lw_sock_recv_str (sock, buffer)) { - config->asm_algorithm = - atoi (buffer); if (lw_sock_recv_str (sock, buffer)) { config->min_map_res = @@ -250,7 +244,6 @@ lw_netconf_check (LW_NETCONF * config) LW_NETCONF_CHECK_RANGE (game_time, 16); LW_NETCONF_CHECK_RANGE (cpu_advantage, 4); LW_NETCONF_CHECK_RANGE (cpu_vs_human, 2); - LW_NETCONF_CHECK_RANGE (asm_algorithm, 1); LW_NETCONF_CHECK_RANGE (min_map_res, 8); return result; @@ -272,6 +265,5 @@ lw_netconf_print (LW_NETCONF * config) LW_NETCONF_PRINT_VALUE (game_time); LW_NETCONF_PRINT_VALUE (cpu_advantage); LW_NETCONF_PRINT_VALUE (cpu_vs_human); - LW_NETCONF_PRINT_VALUE (asm_algorithm); LW_NETCONF_PRINT_VALUE (min_map_res); } diff --git a/src/netconf.h b/src/netconf.h index 34865354..e4854e60 100644 --- a/src/netconf.h +++ b/src/netconf.h @@ -72,7 +72,6 @@ typedef struct int game_time; int cpu_advantage; int cpu_vs_human; - int asm_algorithm; int min_map_res; } LW_NETCONF; diff --git a/src/netplay.c b/src/netplay.c index 17c55050..b5b0e510 100644 --- a/src/netplay.c +++ b/src/netplay.c @@ -54,6 +54,7 @@ #include #include +#include "backport.h" #include "back.h" #include "base.h" #include "config.h" @@ -222,7 +223,7 @@ connect_on_server_start (int *sock, char *address, int port) */ while (connect_data->running && !esc_pressed) { - if (key[KEY_ESC]) + if (key[ALLEGRO_KEY_ESCAPE]) { esc_pressed = 1; } diff --git a/src/network.c b/src/network.c index 3ffb8297..d07b49f5 100644 --- a/src/network.c +++ b/src/network.c @@ -54,7 +54,7 @@ #include -#include +#include #include "network.h" #include "config.h" diff --git a/src/options.c b/src/options.c index 8bab199c..af40c6c4 100644 --- a/src/options.c +++ b/src/options.c @@ -54,6 +54,7 @@ #include +#include "backport.h" #include "back.h" #include "base.h" #include "config.h" @@ -72,6 +73,7 @@ #include "controls.h" #include "lang.h" #include "gfxmode.h" +#include "mouse.h" /*==================================================================*/ /* variables globales */ @@ -126,7 +128,7 @@ options (void) dp = my_init_dialog (d, choix); } - show_mouse (screen); + lw_mouse_show (); while (my_update_dialog (dp)) ; choix = shutdown_dialog (dp); diff --git a/src/palette.c b/src/palette.c index 9e0b7c24..26e83cbc 100644 --- a/src/palette.c +++ b/src/palette.c @@ -122,9 +122,9 @@ change_palette_brightness (PALETTE old_pal, PALETTE new_pal) for (i = 0; i < 256; ++i) { rgb = old_pal + i; - r = rgb->r * 4; - g = rgb->g * 4; - b = rgb->b * 4; + r = rgb->r; + g = rgb->g; + b = rgb->b; if (brightness > 0) { @@ -140,9 +140,9 @@ change_palette_brightness (PALETTE old_pal, PALETTE new_pal) } rgb = new_pal + i; - rgb->r = r / 4; - rgb->g = g / 4; - rgb->b = b / 4; + rgb->r = r; + rgb->g = g; + rgb->b = b; } else for (i = 0; i < 256; ++i) @@ -216,9 +216,9 @@ get_mono_texture_color (RGB * rgb, int num) hsv_to_rgb (h2, s2, v2, &r, &g, &b); - rgb->r = r / 4; - rgb->g = g / 4; - rgb->b = b / 4; + rgb->r = r; + rgb->g = g; + rgb->b = b; /* *rgb=CHOOSE_PALETTE [32+num]; */ } diff --git a/src/palette.h b/src/palette.h index 72cada07..51fc9dbd 100644 --- a/src/palette.h +++ b/src/palette.h @@ -55,7 +55,9 @@ /* includes */ /*==================================================================*/ -#include +#include + +#include "backport.h" /*==================================================================*/ /* variables globales */ diff --git a/src/path.c b/src/path.c index 0ae7861d..a7c83867 100644 --- a/src/path.c +++ b/src/path.c @@ -51,11 +51,23 @@ /* includes */ /*==================================================================*/ +#include + #include "path.h" #include "startup.h" #include "macro.h" #include "log.h" +/*==================================================================*/ +/* defines */ +/*==================================================================*/ + +#ifdef UNIX +#define _SEP '/' +#else +#define _SEP '\\' +#endif + /*==================================================================*/ /* types */ /*==================================================================*/ @@ -98,17 +110,6 @@ lw_path_get_system_name (const char *filename) LW_MACRO_STRCPY (buf2, start); search = strchr (buf2, '.'); - /* - if (search != NULL) - { - end = search; - } - else - { - end = buf2 + strlen (buf2); - } - */ - if (search == NULL) { search = buf2 + strlen (buf2); @@ -118,3 +119,49 @@ lw_path_get_system_name (const char *filename) return buf2; } + +/*------------------------------------------------------------------*/ +/* + * Fonction used to build complete paths from different parts. + */ +char * +lw_path_join2(const char *begin, const char *end) { + while (*end==_SEP) { + end++; + } + int begin_len = strlen(begin); + int end_len = strlen(end); + int joined_len = begin_len + end_len; + char *joined = malloc(joined_len+2); + memset(joined, 0, joined_len+2); + memcpy(joined, begin, begin_len); + joined[begin_len] = _SEP; + memcpy(joined+begin_len+1, end, end_len); + return joined; +} + +/*------------------------------------------------------------------*/ +/* + * Fonction used to build complete paths from different parts. + */ +char * +lw_path_join3(const char *begin, const char *middle, const char *end) { + while (*middle==_SEP) { + middle++; + } + while (*end==_SEP) { + end++; + } + int begin_len = strlen(begin); + int middle_len = strlen(middle); + int end_len = strlen(end); + int joined_len = begin_len + middle_len + end_len; + char *joined = malloc(joined_len+3); + memset(joined, 0, joined_len+3); + memcpy(joined, begin, begin_len); + joined[begin_len] = _SEP; + memcpy(joined+begin_len+1, middle, middle_len); + joined[begin_len+middle_len+1] = _SEP; + memcpy(joined+begin_len+middle_len+2, end, end_len); + return joined; +} diff --git a/src/path.h b/src/path.h index 2dbcf99d..4d623fcb 100644 --- a/src/path.h +++ b/src/path.h @@ -67,5 +67,7 @@ /*==================================================================*/ char *lw_path_get_system_name (const char *filename); +char *lw_path_join2(const char *begin, const char *end); +char *lw_path_join3(const char *begin, const char *middle, const char *end); #endif diff --git a/src/ping.c b/src/ping.c index 6f9cc598..b8843dc1 100644 --- a/src/ping.c +++ b/src/ping.c @@ -51,8 +51,7 @@ /* includes */ /*==================================================================*/ -#include - +#include "backport.h" #include "ping.h" #include "thrdgen.h" #include "ticker.h" diff --git a/src/pion.c b/src/pion.c index 61fe0ee5..1763ae25 100644 --- a/src/pion.c +++ b/src/pion.c @@ -52,7 +52,7 @@ /* includes */ /*==================================================================*/ -#include +#include #include "area.h" #include "base.h" diff --git a/src/play.c b/src/play.c index 62518edc..a3e64e30 100644 --- a/src/play.c +++ b/src/play.c @@ -53,7 +53,7 @@ /*==================================================================*/ #include -#include +#include #include "back.h" #include "config.h" diff --git a/src/popupw32.c b/src/popupw32.c index 7296d65c..d1738c73 100644 --- a/src/popupw32.c +++ b/src/popupw32.c @@ -51,7 +51,7 @@ /* includes */ /*==================================================================*/ -#include +#include #ifdef WIN32 #include #endif diff --git a/src/profile.c b/src/profile.c index 2f08e75a..b7ffcce8 100644 --- a/src/profile.c +++ b/src/profile.c @@ -52,7 +52,7 @@ /* includes */ /*==================================================================*/ -#include +#include #include "profile.h" #include "ticker.h" diff --git a/src/random.c b/src/random.c index 811e6985..1b1d10c3 100644 --- a/src/random.c +++ b/src/random.c @@ -54,8 +54,9 @@ #include #include -#include +#include +#include "backport.h" #include "random.h" #include "base.h" #include "alleg2.h" @@ -114,10 +115,10 @@ generate_bw_palette (PALETTE pal) } /*------------------------------------------------------------------*/ -static BITMAP * +static ALLEGRO_BITMAP * generate_bitmap () { - BITMAP *bmp; + ALLEGRO_BITMAP *bmp; PALETTE pal; char filename[LW_STARTUP_MAX_PATH_LENGTH]; @@ -125,10 +126,25 @@ generate_bitmap () int size; int ok = 0; + int temp_fd; size = random () % 6; - LW_MACRO_SPRINTF1 (filename, "%s.bmp", tmpnam (NULL)); + // Create secure temporary file using mkstemp + // First create template without .bmp extension for mkstemp + char temp_name[] = "/tmp/lwmapgen_XXXXXX"; + temp_fd = mkstemp(temp_name); + if (temp_fd == -1) { + log_println_str("Error: Could not create temporary file"); + return NULL; + } + close(temp_fd); // Close the file descriptor, we just need the name + + // Remove the temporary file created by mkstemp (we just wanted the unique name) + delete_file(temp_name); + + // Add .bmp extension to the filename + LW_MACRO_SPRINTF1(filename, "%s.bmp", temp_name); LW_MACRO_SPRINTF4 (command, "%s --out %s --size %d%s", STARTUP_GEN_PATH, filename, size, LW_RANDOM_COMMAND_END); @@ -189,7 +205,7 @@ generate_bitmap () int lw_random_generate_map () { - BITMAP *bmp; + ALLEGRO_BITMAP *bmp; PALETTE pal; void *raw_map = NULL; int result = 0; diff --git a/src/score.c b/src/score.c index 9a14f234..c9e66bb2 100644 --- a/src/score.c +++ b/src/score.c @@ -56,6 +56,7 @@ #include #include +#include "backport.h" #include "army.h" #include "back.h" #include "base.h" @@ -204,17 +205,18 @@ init_tombola () /*------------------------------------------------------------------*/ static int -draw_score_bitmap (BITMAP * bitmap, int cursor, int ellipse_h, int fill_level) +draw_score_bitmap (ALLEGRO_BITMAP * bitmap, int cursor, int ellipse_h, + int fill_level) { int w, h; int color1 = 0, color2 = 0; int y_rect1, y_rect2, x_mid; int to_be_filled, to_be_drawn; - w = bitmap->w; + w = al_get_bitmap_width(bitmap); if (!(w & 1)) w -= 1; - h = bitmap->h; + h = al_get_bitmap_height(bitmap); y_rect1 = ellipse_h / 2; y_rect2 = h - y_rect1 - 1; x_mid = w / 2; @@ -277,7 +279,7 @@ display_scores (void) int ellipse_h; int i; int cursor[3]; - BITMAP *eprouvette[3]; + ALLEGRO_BITMAP *eprouvette[3]; int time_delay[3] = { 500, 2500, 1500 }; int fill_level; int done[3]; @@ -333,7 +335,7 @@ display_scores (void) done[i] = 0; write_score (cursor[i], buf[i], 0); buf_old[i][0] = '\0'; - eprouvette[i] = my_create_bitmap (w, h[i]); + eprouvette[i] = my_create_memory_bitmap (w, h[i]); } d[MENU_QUICK_QUIT].flags = D_HIDDEN; @@ -440,7 +442,7 @@ display_scores (void) } for (i = 0; i < 3; ++i) - destroy_bitmap (eprouvette[i]); + al_destroy_bitmap (eprouvette[i]); if (retour > 0) retour--; diff --git a/src/serial.h b/src/serial.h index 795a23ac..ba5f77da 100644 --- a/src/serial.h +++ b/src/serial.h @@ -54,7 +54,7 @@ /* includes */ /*==================================================================*/ -#include +#include /*==================================================================*/ /* constants */ diff --git a/src/sockdos.c b/src/sockdos.c deleted file mode 100644 index fe70a0f8..00000000 --- a/src/sockdos.c +++ /dev/null @@ -1,141 +0,0 @@ -/********************************************************************/ -/* */ -/* L I QQ U U I DD W W A RR 555 */ -/* L I Q Q U U I D D W W A A R R 5 */ -/* L I Q Q U U I D D W W W AAA RR 55 */ -/* L I Q Q U U I D D WW WW A A R R 5 */ -/* LLL I Q Q U I DD W W A A R R 55 */ -/* */ -/* b */ -/* bb y y */ -/* b b yyy */ -/* bb y */ -/* yy */ -/* */ -/* U U FFF O O TTT */ -/* U U F O O O O T */ -/* U U TIRET FF O O O O T */ -/* U U F O O O O T */ -/* U F O O T */ -/* */ -/********************************************************************/ - -/*****************************************************************************/ -/* Liquid War is a multiplayer wargame */ -/* Copyright (C) 1998-2025 Christian Mauduit */ -/* */ -/* 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 */ -/* */ -/* Liquid War homepage : https://ufoot.org/liquidwar/v5 */ -/* Contact author : ufoot@ufoot.org */ -/*****************************************************************************/ - -/********************************************************************/ -/* name : sockdos.c */ -/* content : fake DOS network support to avoid link failure */ -/* last update : April 13th 2001 */ -/********************************************************************/ - -/* - * This file contains empty functions even if DOS releases of LW - * have no network support. It permits safe linking. - */ - -/*==================================================================*/ -/* globals */ -/*==================================================================*/ - -int LW_SOCK_LOG = 0; - -/*==================================================================*/ -/* functions */ -/*==================================================================*/ - -/*------------------------------------------------------------------*/ -int -lw_sock_init () -{ - return 0; -} - -/*------------------------------------------------------------------*/ -int -lw_sock_exit () -{ - return 0; -} - -/*------------------------------------------------------------------*/ -int -lw_sock_listen (int *sock, char *ip, int port) -{ - return 0; -} - -/*------------------------------------------------------------------*/ -int -lw_sock_accept (int *new_sock, char *ip, int *port, int listening_sock) -{ - return 0; -} - -/*------------------------------------------------------------------*/ -int -lw_sock_connect (int *sock, char *ip, int port) -{ - return 0; -} - -/*------------------------------------------------------------------*/ -int -lw_sock_peek_ex (int sock, int len) -{ - return 0; -} - -/*------------------------------------------------------------------*/ -int -lw_sock_send_str_ex (int sock, char *str) -{ - return 0; -} - -/*------------------------------------------------------------------*/ -int -lw_sock_recv_str_ex (int sock, char *str) -{ - return 0; -} - -/*------------------------------------------------------------------*/ -int -lw_sock_send_buffer_ex (int sock, char *buffer, int len) -{ - return 0; -} - -/*------------------------------------------------------------------*/ -int -lw_sock_recv_buffer_ex (int sock, char *buffer, int len) -{ - return 0; -} - -/*------------------------------------------------------------------*/ -int -lw_sock_close (int *sock) -{ - return 0; -} diff --git a/src/sound.c b/src/sound.c index c3b05829..66edd440 100644 --- a/src/sound.c +++ b/src/sound.c @@ -51,6 +51,7 @@ /* includes */ /*==================================================================*/ +#include "backport.h" #include "config.h" #include "disk.h" #include "sound.h" @@ -107,7 +108,7 @@ water_handler (void) } } -END_OF_FUNCTION (water_handler); +// END_OF_FUNCTION removed - not needed in Allegro 5 /*------------------------------------------------------------------*/ int @@ -123,17 +124,8 @@ start_water (void) { WATER_VOLUME = CONFIG_WATER_VOLUME_MENU; - LOCK_FUNCTION (water_handler); - LOCK_VARIABLE (HASARD_INDEX); - LOCK_VARIABLE (HASARD_VALUE); - LOCK_VARIABLE (SAMPLE_WATER); - LOCK_VARIABLE (WATER_VOLUME); - LOCK_VARIABLE (SOUND_VOLUME_VALUES); - -#ifdef DOS - _go32_dpmi_lock_data (HASARD_VALUE, HASARD_SIZE * sizeof (int)); - _go32_dpmi_lock_data (SOUND_VOLUME_VALUES, 17 * sizeof (int)); -#endif + // LOCK macros removed - not needed in Allegro 5 + // DOS-specific dpmi code removed - not needed in modern systems result = install_int_ex (water_handler, MSEC_TO_TIMER (WATER_DELAY)); water_handler (); @@ -150,7 +142,7 @@ stop_water (void) /*------------------------------------------------------------------*/ static void -my_play_sample (SAMPLE * s, int vol) +my_play_sample (ALLEGRO_SAMPLE * s, int vol) { if (vol > 0) play_sample (s, SOUND_VOLUME_VALUES[vol - 1], 128, 1000, 0); diff --git a/src/spread.h b/src/spread.h deleted file mode 100644 index ec8ad260..00000000 --- a/src/spread.h +++ /dev/null @@ -1,87 +0,0 @@ -/********************************************************************/ -/* */ -/* L I QQ U U I DD W W A RR 555 */ -/* L I Q Q U U I D D W W A A R R 5 */ -/* L I Q Q U U I D D W W W AAA RR 55 */ -/* L I Q Q U U I D D WW WW A A R R 5 */ -/* LLL I Q Q U I DD W W A A R R 55 */ -/* */ -/* b */ -/* bb y y */ -/* b b yyy */ -/* bb y */ -/* yy */ -/* */ -/* U U FFF O O TTT */ -/* U U F O O O O T */ -/* U U TIRET FF O O O O T */ -/* U U F O O O O T */ -/* U F O O T */ -/* */ -/********************************************************************/ - -/*****************************************************************************/ -/* Liquid War is a multiplayer wargame */ -/* Copyright (C) 1998-2025 Christian Mauduit */ -/* */ -/* 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 */ -/* */ -/* Liquid War homepage : https://ufoot.org/liquidwar/v5 */ -/* Contact author : ufoot@ufoot.org */ -/*****************************************************************************/ - -/********************************************************************/ -/* nom : spread.h */ -/* contenu : etalement du gradient accelere */ -/* date de modif : 3 mai 98 */ -/********************************************************************/ - -#ifndef LIQUID_WAR_INCLUDE_SPREAD -#define LIQUID_WAR_INCLUDE_SPREAD - -/*==================================================================*/ -/* includes */ -/*==================================================================*/ - -#include "mesh.h" -#include "asm.h" - -/*==================================================================*/ -/* types */ -/*==================================================================*/ - -extern void LW_ASM_FUNC boost_gradient_down_2 (MESH * first, - int size, int offset); -extern void LW_ASM_FUNC boost_gradient_down_3 (MESH * first, - int size, int offset); -extern void LW_ASM_FUNC boost_gradient_down_4 (MESH * first, - int size, int offset); -extern void LW_ASM_FUNC boost_gradient_down_5 (MESH * first, - int size, int offset); -extern void LW_ASM_FUNC boost_gradient_down_6 (MESH * first, - int size, int offset); - -extern void LW_ASM_FUNC boost_gradient_up_2 (MESH * first, - int size, int offset); -extern void LW_ASM_FUNC boost_gradient_up_3 (MESH * first, - int size, int offset); -extern void LW_ASM_FUNC boost_gradient_up_4 (MESH * first, - int size, int offset); -extern void LW_ASM_FUNC boost_gradient_up_5 (MESH * first, - int size, int offset); -extern void LW_ASM_FUNC boost_gradient_up_6 (MESH * first, - int size, int offset); - -#endif diff --git a/src/spread.s b/src/spread.s deleted file mode 100644 index 6b4865e8..00000000 --- a/src/spread.s +++ /dev/null @@ -1,959 +0,0 @@ -/********************************************************************/ -/* */ -/* L I QQ U U I DD W W A RR 555 */ -/* L I Q Q U U I D D W W A A R R 5 */ -/* L I Q Q U U I D D W W W AAA RR 55 */ -/* L I Q Q U U I D D WW WW A A R R 5 */ -/* LLL I Q Q U I DD W W A A R R 55 */ -/* */ -/* b */ -/* bb y y */ -/* b b yyy */ -/* bb y */ -/* yy */ -/* */ -/* U U FFF O O TTT */ -/* U U F O O O O T */ -/* U U TIRET FF O O O O T */ -/* U U F O O O O T */ -/* U F O O T */ -/* */ -/********************************************************************/ - -/*****************************************************************************/ -/* Liquid War is a multiplayer wargame */ -/* Copyright (C) 1998-2025 Christian Mauduit */ -/* */ -/* 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 */ -/* */ -/* Liquid War homepage : https://ufoot.org/liquidwar/v5 */ -/* Contact author : ufoot@ufoot.org */ -/*****************************************************************************/ - -/********************************************************************/ -/* nom : spread.s */ -/* contenu : etalement du gradient accelere */ -/* date de modif : 3 mai 98 */ -/********************************************************************/ - - -/*typedef union */ -/* { */ -/* int time; */ -/* struct */ -/* { */ -/* short x; */ -/* short y; */ -/* } cursor; */ -/* } MESH_UPDATE; */ - -/*typedef struct */ -/* { */ -/* int dir :8; */ -/* int grad:24; */ -/* } MESH_STATE; */ - -/*typedef struct */ -/* { */ -/* MESH_UPDATE update; */ -/* MESH_STATE state; */ -/* } MESH_INFO; */ - -/*typedef struct */ -/* { */ -/* char decal_for_dir :8; */ -/* int size :24; */ -/* } MESH_SIDE; */ - -/*typedef struct */ -/* { */ -/* short x; */ -/* short y; */ -/* MESH_SIDE side; */ -/* MESH_INFO info[NB_TEAMS]; */ -/* void *link[NB_DIRS]; */ -/* } MESH; */ - - -.equ SIZE_OF_MESH,104 - -.equ OFFSET_TO_GRAD_0,12 -.equ OFFSET_TO_GRAD_1,20 -.equ OFFSET_TO_GRAD_2,28 -.equ OFFSET_TO_GRAD_3,36 -.equ OFFSET_TO_GRAD_4,44 -.equ OFFSET_TO_GRAD_5,52 - -.equ SQUARE_SIZE_INC,4 - -.equ ARG_FIRST,8 -.equ ARG_SIZE,12 -.equ ARG_OFFSET,16 - -.text - -/* il y a de maniere tres bourrine 5*2 procedures attachees chacune */ -/* a l'etalement de 2,3,4,5 ou 6 gradients, le code est le meme */ -/* dans chacune d'elle a l'exception d'une constante. */ -/* la moitie des fonctions etale les gradients dans un sens, */ -/* l'autre moitie les etale dans l'autre sens */ - - -/*==================================================================*/ -/* premiere serie de fonctions, etalement des gradients vers le bas */ -/*==================================================================*/ - -/*------------------------------------------------------------------*/ -/* void boost_gradient_down_2 (MESH *first, int size, int offset); */ -/*------------------------------------------------------------------*/ - -.globl _boost_gradient_down_2 -.globl boost_gradient_down_2 - .align 4 -_boost_gradient_down_2: -boost_gradient_down_2: - pushl %ebp - movl %esp, %ebp - pushl %eax - pushl %ebx - pushl %ecx - pushl %edx - pushl %esi - pushl %edi - pushw %es - - movl ARG_FIRST(%ebp),%esi /* esi pointeur sur mesh courant*/ - movl ARG_SIZE(%ebp),%ecx /* ecx prend la taille de la boucle */ - movl ARG_OFFSET(%ebp),%ebx /* ebx prend l'offset de direction */ - -main_loop_gd_2: - - add %ebx,%esi - movl (%esi),%edi - sub %ebx,%esi - - cmp $0,%edi - je skip_gd_2_1 - - movl OFFSET_TO_GRAD_0(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_0(%edi),%eax /* GPF sous win ICI */ - jae skip_gd_2_0 - movl %eax,%ds:OFFSET_TO_GRAD_0(%edi) - -skip_gd_2_0: - - movl OFFSET_TO_GRAD_1(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_1(%edi),%eax - jae skip_gd_2_1 - movl %eax,%ds:OFFSET_TO_GRAD_1(%edi) - -skip_gd_2_1: - - addl $SIZE_OF_MESH,%esi - - loopl main_loop_gd_2 - - popw %es - popl %edi - popl %esi - popl %edx - popl %ecx - popl %ebx - popl %eax -/* movl %ebp, %esp*/ - popl %ebp - ret - -/*------------------------------------------------------------------*/ -/* void boost_gradient_down_3 (MESH *first, int size, int offset); */ -/*------------------------------------------------------------------*/ - -.globl _boost_gradient_down_3 -.globl boost_gradient_down_3 - .align 4 -_boost_gradient_down_3: -boost_gradient_down_3: - pushl %ebp - movl %esp, %ebp - pushl %eax - pushl %ebx - pushl %ecx - pushl %edx - pushl %esi - pushl %edi - pushw %es - - movl ARG_FIRST(%ebp),%esi /* esi pointeur sur mesh courant*/ - movl ARG_SIZE(%ebp),%ecx /* ecx prend la taille de la boucle */ - movl ARG_OFFSET(%ebp),%ebx /* ebx prend l'offset de direction */ - -main_loop_gd_3: - - add %ebx,%esi - movl (%esi),%edi - sub %ebx,%esi - - cmp $0,%edi - je skip_gd_3_2 - - movl OFFSET_TO_GRAD_0(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_0(%edi),%eax - jae skip_gd_3_0 - movl %eax,%ds:OFFSET_TO_GRAD_0(%edi) - -skip_gd_3_0: - - movl OFFSET_TO_GRAD_1(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_1(%edi),%eax - jae skip_gd_3_1 - movl %eax,%ds:OFFSET_TO_GRAD_1(%edi) - -skip_gd_3_1: - - movl OFFSET_TO_GRAD_2(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_2(%edi),%eax - jae skip_gd_3_2 - movl %eax,%ds:OFFSET_TO_GRAD_2(%edi) - -skip_gd_3_2: - - addl $SIZE_OF_MESH,%esi - - loopl main_loop_gd_3 - - popw %es - popl %edi - popl %esi - popl %edx - popl %ecx - popl %ebx - popl %eax -/* movl %ebp, %esp*/ - popl %ebp - ret - -/*------------------------------------------------------------------*/ -/* void boost_gradient_down_4 (MESH *first, int size, int offset); */ -/*------------------------------------------------------------------*/ - -.globl _boost_gradient_down_4 -.globl boost_gradient_down_4 - .align 4 -_boost_gradient_down_4: -boost_gradient_down_4: - pushl %ebp - movl %esp, %ebp - pushl %eax - pushl %ebx - pushl %ecx - pushl %edx - pushl %esi - pushl %edi - pushw %es - - movl ARG_FIRST(%ebp),%esi /* esi pointeur sur mesh courant*/ - movl ARG_SIZE(%ebp),%ecx /* ecx prend la taille de la boucle */ - movl ARG_OFFSET(%ebp),%ebx /* ebx prend l'offset de direction */ - -main_loop_gd_4: - - add %ebx,%esi - movl (%esi),%edi - sub %ebx,%esi - - cmp $0,%edi - je skip_gd_4_3 - - movl OFFSET_TO_GRAD_0(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_0(%edi),%eax - jae skip_gd_4_0 - movl %eax,%ds:OFFSET_TO_GRAD_0(%edi) - -skip_gd_4_0: - - movl OFFSET_TO_GRAD_1(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_1(%edi),%eax - jae skip_gd_4_1 - movl %eax,%ds:OFFSET_TO_GRAD_1(%edi) - -skip_gd_4_1: - - movl OFFSET_TO_GRAD_2(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_2(%edi),%eax - jae skip_gd_4_2 - movl %eax,%ds:OFFSET_TO_GRAD_2(%edi) - -skip_gd_4_2: - - movl OFFSET_TO_GRAD_3(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_3(%edi),%eax - jae skip_gd_4_3 - movl %eax,%ds:OFFSET_TO_GRAD_3(%edi) - -skip_gd_4_3: - - addl $SIZE_OF_MESH,%esi - - loopl main_loop_gd_4 - - popw %es - popl %edi - popl %esi - popl %edx - popl %ecx - popl %ebx - popl %eax -/* movl %ebp, %esp*/ - popl %ebp - ret - -/*------------------------------------------------------------------*/ -/* void boost_gradient_down_5 (MESH *first, int size, int offset); */ -/*------------------------------------------------------------------*/ - -.globl _boost_gradient_down_5 -.globl boost_gradient_down_5 - .align 4 -_boost_gradient_down_5: -boost_gradient_down_5: - pushl %ebp - movl %esp, %ebp - pushl %eax - pushl %ebx - pushl %ecx - pushl %edx - pushl %esi - pushl %edi - pushw %es - - movl ARG_FIRST(%ebp),%esi /* esi pointeur sur mesh courant*/ - movl ARG_SIZE(%ebp),%ecx /* ecx prend la taille de la boucle */ - movl ARG_OFFSET(%ebp),%ebx /* ebx prend l'offset de direction */ - -main_loop_gd_5: - - add %ebx,%esi - movl (%esi),%edi - sub %ebx,%esi - - cmp $0,%edi - je skip_gd_5_4 - - movl OFFSET_TO_GRAD_0(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_0(%edi),%eax - jae skip_gd_5_0 - movl %eax,%ds:OFFSET_TO_GRAD_0(%edi) - -skip_gd_5_0: - - movl OFFSET_TO_GRAD_1(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_1(%edi),%eax - jae skip_gd_5_1 - movl %eax,%ds:OFFSET_TO_GRAD_1(%edi) - -skip_gd_5_1: - - movl OFFSET_TO_GRAD_2(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_2(%edi),%eax - jae skip_gd_5_2 - movl %eax,%ds:OFFSET_TO_GRAD_2(%edi) - -skip_gd_5_2: - - movl OFFSET_TO_GRAD_3(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_3(%edi),%eax - jae skip_gd_5_3 - movl %eax,%ds:OFFSET_TO_GRAD_3(%edi) - -skip_gd_5_3: - - movl OFFSET_TO_GRAD_4(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_4(%edi),%eax - jae skip_gd_5_4 - movl %eax,%ds:OFFSET_TO_GRAD_4(%edi) - -skip_gd_5_4: - - addl $SIZE_OF_MESH,%esi - - loopl main_loop_gd_5 - - popw %es - popl %edi - popl %esi - popl %edx - popl %ecx - popl %ebx - popl %eax -/* movl %ebp, %esp*/ - popl %ebp - ret - - -/*------------------------------------------------------------------*/ -/* void boost_gradient_down_6 (MESH *first, int size, int offset); */ -/*------------------------------------------------------------------*/ - -.globl _boost_gradient_down_6 -.globl boost_gradient_down_6 - .align 4 -_boost_gradient_down_6: -boost_gradient_down_6: - pushl %ebp - movl %esp, %ebp - pushl %eax - pushl %ebx - pushl %ecx - pushl %edx - pushl %esi - pushl %edi - pushw %es - - movl ARG_FIRST(%ebp),%esi /* esi pointeur sur mesh courant*/ - movl ARG_SIZE(%ebp),%ecx /* ecx prend la taille de la boucle */ - movl ARG_OFFSET(%ebp),%ebx /* ebx prend l'offset de direction */ - -main_loop_gd_6: - - add %ebx,%esi - movl (%esi),%edi - sub %ebx,%esi - - cmp $0,%edi - je skip_gd_6_5 - - movl OFFSET_TO_GRAD_0(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_0(%edi),%eax - jae skip_gd_6_0 - movl %eax,%ds:OFFSET_TO_GRAD_0(%edi) - -skip_gd_6_0: - - movl OFFSET_TO_GRAD_1(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_1(%edi),%eax - jae skip_gd_6_1 - movl %eax,%ds:OFFSET_TO_GRAD_1(%edi) - -skip_gd_6_1: - - movl OFFSET_TO_GRAD_2(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_2(%edi),%eax - jae skip_gd_6_2 - movl %eax,%ds:OFFSET_TO_GRAD_2(%edi) - -skip_gd_6_2: - - movl OFFSET_TO_GRAD_3(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_3(%edi),%eax - jae skip_gd_6_3 - movl %eax,%ds:OFFSET_TO_GRAD_3(%edi) - -skip_gd_6_3: - - movl OFFSET_TO_GRAD_4(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_4(%edi),%eax - jae skip_gd_6_4 - movl %eax,%ds:OFFSET_TO_GRAD_4(%edi) - -skip_gd_6_4: - - movl OFFSET_TO_GRAD_5(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_5(%edi),%eax - jae skip_gd_6_5 - movl %eax,%ds:OFFSET_TO_GRAD_5(%edi) - -skip_gd_6_5: - - addl $SIZE_OF_MESH,%esi - - loopl main_loop_gd_6 - - popw %es - popl %edi - popl %esi - popl %edx - popl %ecx - popl %ebx - popl %eax -/* movl %ebp, %esp*/ - popl %ebp - ret - - -/*==================================================================*/ -/* deuxieme serie de fonctions, etalement des gradients vers le haut*/ -/*==================================================================*/ - -/*------------------------------------------------------------------*/ -/* void boost_gradient_up_2 (MESH *first, int size, int offset); */ -/*------------------------------------------------------------------*/ - -.globl _boost_gradient_up_2 -.globl boost_gradient_up_2 - .align 4 -_boost_gradient_up_2: -boost_gradient_up_2: - pushl %ebp - movl %esp, %ebp - pushl %eax - pushl %ebx - pushl %ecx - pushl %edx - pushl %esi - pushl %edi - pushw %es - - movl ARG_FIRST(%ebp),%esi /* esi pointeur sur mesh courant*/ - movl ARG_SIZE(%ebp),%ecx /* ecx prend la taille de la boucle */ - movl ARG_OFFSET(%ebp),%ebx /* ebx prend l'offset de direction */ - -main_loop_gu_2: - - add %ebx,%esi - movl (%esi),%edi - sub %ebx,%esi - - cmp $0,%edi - je skip_gu_2_1 - - movl OFFSET_TO_GRAD_0(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_0(%edi),%eax - jae skip_gu_2_0 - movl %eax,%ds:OFFSET_TO_GRAD_0(%edi) - -skip_gu_2_0: - - movl OFFSET_TO_GRAD_1(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_1(%edi),%eax - jae skip_gu_2_1 - movl %eax,%ds:OFFSET_TO_GRAD_1(%edi) - -skip_gu_2_1: - - subl $SIZE_OF_MESH,%esi - - loopl main_loop_gu_2 - - popw %es - popl %edi - popl %esi - popl %edx - popl %ecx - popl %ebx - popl %eax -/* movl %ebp, %esp*/ - popl %ebp - ret - -/*------------------------------------------------------------------*/ -/* void boost_gradient_up_3 (MESH *first, int size, int offset); */ -/*------------------------------------------------------------------*/ - -.globl _boost_gradient_up_3 -.globl boost_gradient_up_3 - .align 4 -_boost_gradient_up_3: -boost_gradient_up_3: - pushl %ebp - movl %esp, %ebp - pushl %eax - pushl %ebx - pushl %ecx - pushl %edx - pushl %esi - pushl %edi - pushw %es - - movl ARG_FIRST(%ebp),%esi /* esi pointeur sur mesh courant*/ - movl ARG_SIZE(%ebp),%ecx /* ecx prend la taille de la boucle */ - movl ARG_OFFSET(%ebp),%ebx /* ebx prend l'offset de direction */ - -main_loop_gu_3: - - add %ebx,%esi - movl (%esi),%edi - sub %ebx,%esi - - cmp $0,%edi - je skip_gu_3_2 - - movl OFFSET_TO_GRAD_0(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_0(%edi),%eax - jae skip_gu_3_0 - movl %eax,%ds:OFFSET_TO_GRAD_0(%edi) - -skip_gu_3_0: - - movl OFFSET_TO_GRAD_1(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_1(%edi),%eax - jae skip_gu_3_1 - movl %eax,%ds:OFFSET_TO_GRAD_1(%edi) - -skip_gu_3_1: - - movl OFFSET_TO_GRAD_2(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_2(%edi),%eax - jae skip_gu_3_2 - movl %eax,%ds:OFFSET_TO_GRAD_2(%edi) - -skip_gu_3_2: - - subl $SIZE_OF_MESH,%esi - - loopl main_loop_gu_3 - - popw %es - popl %edi - popl %esi - popl %edx - popl %ecx - popl %ebx - popl %eax -/* movl %ebp, %esp*/ - popl %ebp - ret - -/*------------------------------------------------------------------*/ -/* void boost_gradient_up_4 (MESH *first, int size, int offset); */ -/*------------------------------------------------------------------*/ - -.globl _boost_gradient_up_4 -.globl boost_gradient_up_4 - .align 4 -_boost_gradient_up_4: -boost_gradient_up_4: - pushl %ebp - movl %esp, %ebp - pushl %eax - pushl %ebx - pushl %ecx - pushl %edx - pushl %esi - pushl %edi - pushw %es - - movl ARG_FIRST(%ebp),%esi /* esi pointeur sur mesh courant*/ - movl ARG_SIZE(%ebp),%ecx /* ecx prend la taille de la boucle */ - movl ARG_OFFSET(%ebp),%ebx /* ebx prend l'offset de direction */ - -main_loop_gu_4: - - add %ebx,%esi - movl (%esi),%edi - sub %ebx,%esi - - cmp $0,%edi - je skip_gu_4_3 - - movl OFFSET_TO_GRAD_0(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_0(%edi),%eax - jae skip_gu_4_0 - movl %eax,%ds:OFFSET_TO_GRAD_0(%edi) - -skip_gu_4_0: - - movl OFFSET_TO_GRAD_1(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_1(%edi),%eax - jae skip_gu_4_1 - movl %eax,%ds:OFFSET_TO_GRAD_1(%edi) - -skip_gu_4_1: - - movl OFFSET_TO_GRAD_2(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_2(%edi),%eax - jae skip_gu_4_2 - movl %eax,%ds:OFFSET_TO_GRAD_2(%edi) - -skip_gu_4_2: - - movl OFFSET_TO_GRAD_3(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_3(%edi),%eax - jae skip_gu_4_3 - movl %eax,%ds:OFFSET_TO_GRAD_3(%edi) - -skip_gu_4_3: - - subl $SIZE_OF_MESH,%esi - - loopl main_loop_gu_4 - - popw %es - popl %edi - popl %esi - popl %edx - popl %ecx - popl %ebx - popl %eax -/* movl %ebp, %esp*/ - popl %ebp - ret - -/*------------------------------------------------------------------*/ -/* void boost_gradient_up_5 (MESH *first, int size, int offset); */ -/*------------------------------------------------------------------*/ - -.globl _boost_gradient_up_5 -.globl boost_gradient_up_5 - .align 4 -_boost_gradient_up_5: -boost_gradient_up_5: - pushl %ebp - movl %esp, %ebp - pushl %eax - pushl %ebx - pushl %ecx - pushl %edx - pushl %esi - pushl %edi - pushw %es - - movl ARG_FIRST(%ebp),%esi /* esi pointeur sur mesh courant*/ - movl ARG_SIZE(%ebp),%ecx /* ecx prend la taille de la boucle */ - movl ARG_OFFSET(%ebp),%ebx /* ebx prend l'offset de direction */ - -main_loop_gu_5: - - add %ebx,%esi - movl (%esi),%edi - sub %ebx,%esi - - cmp $0,%edi - je skip_gu_5_4 - - movl OFFSET_TO_GRAD_0(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_0(%edi),%eax - jae skip_gu_5_0 - movl %eax,%ds:OFFSET_TO_GRAD_0(%edi) - -skip_gu_5_0: - - movl OFFSET_TO_GRAD_1(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_1(%edi),%eax - jae skip_gu_5_1 - movl %eax,%ds:OFFSET_TO_GRAD_1(%edi) - -skip_gu_5_1: - - movl OFFSET_TO_GRAD_2(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_2(%edi),%eax - jae skip_gu_5_2 - movl %eax,%ds:OFFSET_TO_GRAD_2(%edi) - -skip_gu_5_2: - - movl OFFSET_TO_GRAD_3(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_3(%edi),%eax - jae skip_gu_5_3 - movl %eax,%ds:OFFSET_TO_GRAD_3(%edi) - -skip_gu_5_3: - - movl OFFSET_TO_GRAD_4(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_4(%edi),%eax - jae skip_gu_5_4 - movl %eax,%ds:OFFSET_TO_GRAD_4(%edi) - -skip_gu_5_4: - - subl $SIZE_OF_MESH,%esi - - loopl main_loop_gu_5 - - popw %es - popl %edi - popl %esi - popl %edx - popl %ecx - popl %ebx - popl %eax -/* movl %ebp, %esp*/ - popl %ebp - ret - - -/*------------------------------------------------------------------*/ -/* void boost_gradient_up_6 (MESH *first, int size, int offset); */ -/*------------------------------------------------------------------*/ - -.globl _boost_gradient_up_6 -.globl boost_gradient_up_6 - .align 4 -_boost_gradient_up_6: -boost_gradient_up_6: - pushl %ebp - movl %esp, %ebp - pushl %eax - pushl %ebx - pushl %ecx - pushl %edx - pushl %esi - pushl %edi - pushw %es - - movl ARG_FIRST(%ebp),%esi /* esi pointeur sur mesh courant*/ - movl ARG_SIZE(%ebp),%ecx /* ecx prend la taille de la boucle */ - movl ARG_OFFSET(%ebp),%ebx /* ebx prend l'offset de direction */ - -main_loop_gu_6: - - add %ebx,%esi - movl (%esi),%edi - sub %ebx,%esi - - cmp $0,%edi - je skip_gu_6_5 - - movl OFFSET_TO_GRAD_0(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_0(%edi),%eax - jae skip_gu_6_0 - movl %eax,%ds:OFFSET_TO_GRAD_0(%edi) - -skip_gu_6_0: - - movl OFFSET_TO_GRAD_1(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_1(%edi),%eax - jae skip_gu_6_1 - movl %eax,%ds:OFFSET_TO_GRAD_1(%edi) - -skip_gu_6_1: - - movl OFFSET_TO_GRAD_2(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_2(%edi),%eax - jae skip_gu_6_2 - movl %eax,%ds:OFFSET_TO_GRAD_2(%edi) - -skip_gu_6_2: - - movl OFFSET_TO_GRAD_3(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_3(%edi),%eax - jae skip_gu_6_3 - movl %eax,%ds:OFFSET_TO_GRAD_3(%edi) - -skip_gu_6_3: - - movl OFFSET_TO_GRAD_4(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_4(%edi),%eax - jae skip_gu_6_4 - movl %eax,%ds:OFFSET_TO_GRAD_4(%edi) - -skip_gu_6_4: - - movl OFFSET_TO_GRAD_5(%esi),%edx - movl SQUARE_SIZE_INC(%esi),%eax - add %edx,%eax - cmp OFFSET_TO_GRAD_5(%edi),%eax - jae skip_gu_6_5 - movl %eax,%ds:OFFSET_TO_GRAD_5(%edi) - -skip_gu_6_5: - - subl $SIZE_OF_MESH,%esi - - loopl main_loop_gu_6 - - popw %es - popl %edi - popl %esi - popl %edx - popl %ecx - popl %ebx - popl %eax -/* movl %ebp, %esp*/ - popl %ebp - ret - - - - - - diff --git a/src/srvchan.c b/src/srvchan.c index 9c4a0b1c..6dadc998 100644 --- a/src/srvchan.c +++ b/src/srvchan.c @@ -75,6 +75,7 @@ static char *ACCEPTED_VERSIONS[] = { "5.6.3", "5.6.4", "5.6.5", + "5.6.6", LW_VERSION, NULL }; @@ -357,7 +358,7 @@ handle_team (LW_SRVCHAN * chan, LW_NETMESS * mess, int *free_teams) /* * OK, there are 3 arguments * - arg 1 is the team index - * - arg 2 is the "control_type" parameter + * - arg 2 is the "control_type" parameter * - arg 3 is the team name */ i = atoi (mess->argv[0]); @@ -991,7 +992,7 @@ lw_srvchan_wait_teams (LW_SRVCHAN * chan, int *free_teams, } /* - * lw_netmess_free must *not* be forgetted + * lw_netmess_free must *not* be forgetted */ lw_netmess_free (mess); @@ -1022,7 +1023,7 @@ lw_srvchan_wait_teams (LW_SRVCHAN * chan, int *free_teams, log_print_int (chan->port); log_println_str ("\" accepted"); - /* + /* * We play a little sound for people who have the server * opened on a console and want it to beep when someone * connects @@ -1144,7 +1145,7 @@ lw_srvchan_keepalive (LW_SRVCHAN * chan, } /* - * lw_netmess_free must *not* be forgetted + * lw_netmess_free must *not* be forgetted */ lw_netmess_free (mess); @@ -1200,7 +1201,7 @@ lw_srvchan_keepalive (LW_SRVCHAN * chan, /*------------------------------------------------------------------*/ /* - * Answers OK to a client, and waits for the "WHO" message + * Answers OK to a client, and waits for the "WHO" message */ int lw_srvchan_tell_who (LW_SRVCHAN * chan, void *map, LW_NETCONF * config) @@ -1268,7 +1269,7 @@ lw_srvchan_tell_who (LW_SRVCHAN * chan, void *map, LW_NETCONF * config) } /* - * lw_netmess_free must *not* be forgetted + * lw_netmess_free must *not* be forgetted */ lw_netmess_free (mess); @@ -1400,7 +1401,7 @@ lw_srvchan_close (LW_SRVCHAN * chan) /* * Receives key presses from a computer. * The keys come in the "computer's order" ie one still has to - * sort them by server id. + * sort them by server id. */ int lw_srvchan_recv_keys (LW_SRVCHAN * chan, LW_NETKEY * netkey) @@ -1433,7 +1434,7 @@ lw_srvchan_recv_keys (LW_SRVCHAN * chan, LW_NETKEY * netkey) /* * Sends key presses to a computer. * The keys must be send in the "computer's order" ie they must - * be sorted first. + * be sorted first. */ int lw_srvchan_send_keys (LW_SRVCHAN * chan, LW_NETKEY * netkey) diff --git a/src/srvcont.c b/src/srvcont.c index c8d3847e..95bf6c5f 100644 --- a/src/srvcont.c +++ b/src/srvcont.c @@ -131,7 +131,6 @@ distribute_teams (LW_SRVCONT * cont) int result = 1; int i, j, k; int i_orig, j_orig; - int asm_algorithm; /* * The first step is to attribute a unique number to each @@ -225,20 +224,6 @@ distribute_teams (LW_SRVCONT * cont) } } - /* - * Last step, we check if the "asm_algorithm" parameter should be - * enabled. Indeed, it must be enabled on _all_ computers or on - * none of them... - */ - asm_algorithm = 1; - for (i = 0; i < cont->nb_chans; ++i) - { - asm_algorithm = (cont->chan[i].config.asm_algorithm && asm_algorithm); - } - for (i = 0; i < cont->nb_chans; ++i) - { - cont->chan[i].config.asm_algorithm = asm_algorithm; - } return result; } diff --git a/src/startup.c b/src/startup.c index 8160143c..f920787a 100644 --- a/src/startup.c +++ b/src/startup.c @@ -52,10 +52,10 @@ /* includes */ /*==================================================================*/ -#include #include #include +#include "backport.h" #include "parser.h" #include "startup.h" #include "server.h" @@ -74,7 +74,6 @@ #define IDENT_NOCUSTOM "nocustom" #define IDENT_NOSOUND "silent" #define IDENT_NOSVGA "vga" -#define IDENT_NOASM "c" #define IDENT_NOJOY "nojoy" #define IDENT_STOP "stop" #define IDENT_SAFE "safe" @@ -108,7 +107,6 @@ int STARTUP_WATER_STATE = 1; int STARTUP_SFX_STATE = 1; int STARTUP_MUSIC_STATE = 1; int STARTUP_CUSTOM_STATE = 1; -int STARTUP_ASM = 1; int STARTUP_SVGA = 1; int STARTUP_STOP = 0; int STARTUP_AUTO = 0; @@ -127,10 +125,10 @@ static char *DEFAULT_CFG_PATH = CONFIG_UNIX_CFG; static char *DEFAULT_LOG_PATH = ""; static char *DEFAULT_SRV_PATH = "./liquidwar-server"; static char *DEFAULT_GEN_PATH = "./liquidwar-mapgen"; -static char *DEFAULT_DAT_PATH = "../Resources/data/liquidwar.dat"; -static char *DEFAULT_MAP_PATH = "../Resources/custom/map/"; -static char *DEFAULT_TEX_PATH = "../Resources/custom/texture/"; -static char *DEFAULT_MID_PATH = "../Resources/custom/music/"; +static char *DEFAULT_DAT_PATH = "./data"; +static char *DEFAULT_MAP_PATH = "./custom/map"; +static char *DEFAULT_TEX_PATH = "./custom/texture"; +static char *DEFAULT_MID_PATH = "./custom/music"; #else static char *DEFAULT_CFG_PATH = CONFIG_UNIX_CFG; static char *DEFAULT_LOG_PATH = ""; @@ -238,14 +236,6 @@ set_graphic_possibilities (void) STARTUP_SVGA = 0; } -/*------------------------------------------------------------------*/ -static void -set_c_or_asm (void) -{ - if (exist_argument (IDENT_NOASM)) - STARTUP_ASM = 0; -} - /*------------------------------------------------------------------*/ static void set_stop (void) @@ -455,14 +445,7 @@ set_misc (void) static void set_various_hacks (void) { -#ifndef ASM - /* - * important to set it to 0, even if assembly code is not compiled - * in, for we want the program to be able to tell others that it - * can't do any assembly, in a network game for instance. - */ - STARTUP_ASM = 0; -#endif + /* Assembly support removed */ } /*------------------------------------------------------------------*/ @@ -472,7 +455,6 @@ set_startup (void) set_joystick (); set_load_states (); set_graphic_possibilities (); - set_c_or_asm (); set_path (); set_stop (); set_safe (); diff --git a/src/startup.h b/src/startup.h index d45871d3..6c9f9f4b 100644 --- a/src/startup.h +++ b/src/startup.h @@ -78,7 +78,6 @@ extern int STARTUP_WATER_STATE; extern int STARTUP_SFX_STATE; extern int STARTUP_MUSIC_STATE; extern int STARTUP_CUSTOM_STATE; -extern int STARTUP_ASM; extern int STARTUP_SVGA; extern int STARTUP_STOP; extern int STARTUP_AUTO; diff --git a/src/test_backport_pixel.c b/src/test_backport_pixel.c new file mode 100644 index 00000000..7f3843df --- /dev/null +++ b/src/test_backport_pixel.c @@ -0,0 +1,227 @@ +/********************************************************************/ +/* */ +/* L I QQ U U I DD W W A RR 555 */ +/* L I Q Q U U I D D W W A A R R 5 */ +/* L I Q Q U U I D D W W W AAA RR 55 */ +/* L I Q Q U U I D D WW WW A A R R 5 */ +/* LLL I Q Q U I DD W W A A R R 55 */ +/* */ +/* b */ +/* bb y y */ +/* b b yyy */ +/* bb y */ +/* yy */ +/* */ +/* U U FFF O O TTT */ +/* U U F O O O O T */ +/* U U TIRET FF O O O O T */ +/* U U F O O O O T */ +/* U F O O T */ +/* */ +/********************************************************************/ + +/*****************************************************************************/ +/* Liquid War is a multiplayer wargame */ +/* Copyright (C) 1998-2025 Christian Mauduit */ +/* */ +/* 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 */ +/* */ +/* Liquid War homepage : https://ufoot.org/liquidwar/v5 */ +/* Contact author : ufoot@ufoot.org */ +/*****************************************************************************/ + +/********************************************************************/ +/* name : test_backport_pixel.c */ +/* content : unit tests for putpixel/getpixel functions */ +/********************************************************************/ + +/*==================================================================*/ +/* includes */ +/*==================================================================*/ + +#include +#include +#include + +#include "test_simple.h" +#include "backport.h" +#include "palette.h" + +/*==================================================================*/ +/* functions */ +/*==================================================================*/ + +/*------------------------------------------------------------------*/ +static void +init_test_environment() +{ + // Initialize Allegro + if (!al_init()) { + fprintf(stderr, "Failed to initialize Allegro\n"); + exit(1); + } + + // Initialize a basic palette for testing + // This is a simplified palette initialization + for (int i = 0; i < PALETTE_SIZE; i++) { + unsigned char r = ((i >> 5) & 0x07) * 255 / 7; // 3 bits red + unsigned char g = ((i >> 2) & 0x07) * 255 / 7; // 3 bits green + unsigned char b = (i & 0x03) * 255 / 3; // 2 bits blue + GLOBAL_PALETTE[i].r = r; + GLOBAL_PALETTE[i].g = g; + GLOBAL_PALETTE[i].b = b; + } +} + +/*------------------------------------------------------------------*/ +static void +test_putpixel_getpixel_basic() +{ + // Create a test bitmap + ALLEGRO_BITMAP *test_bitmap = al_create_bitmap(100, 100); + TEST_ASSERT(test_bitmap != NULL, "Test bitmap created"); + + // Test basic putpixel/getpixel round-trip + int test_color = 42; + putpixel(test_bitmap, 50, 50, test_color); + int retrieved_color = getpixel(test_bitmap, 50, 50); + + TEST_ASSERT_EQ(test_color, retrieved_color, "Basic putpixel/getpixel round-trip"); + + al_destroy_bitmap(test_bitmap); +} + +/*------------------------------------------------------------------*/ +static void +test_putpixel_getpixel_multiple_colors() +{ + ALLEGRO_BITMAP *test_bitmap = al_create_bitmap(100, 100); + TEST_ASSERT(test_bitmap != NULL, "Test bitmap created for multiple colors"); + + // Test multiple colors + int test_colors[] = {0, 1, 15, 63, 127, 255}; + int num_colors = sizeof(test_colors) / sizeof(test_colors[0]); + + for (int i = 0; i < num_colors; i++) { + int x = 10 + i * 10; + int y = 10; + int color = test_colors[i]; + + putpixel(test_bitmap, x, y, color); + int retrieved = getpixel(test_bitmap, x, y); + + char msg[100]; + snprintf(msg, sizeof(msg), "Color %d round-trip at (%d,%d)", color, x, y); + TEST_ASSERT_EQ(color, retrieved, msg); + } + + al_destroy_bitmap(test_bitmap); +} + +/*------------------------------------------------------------------*/ +static void +test_putpixel_getpixel_edge_cases() +{ + ALLEGRO_BITMAP *test_bitmap = al_create_bitmap(100, 100); + TEST_ASSERT(test_bitmap != NULL, "Test bitmap created for edge cases"); + + // Test corners and edges + int positions[][2] = {{0, 0}, {99, 0}, {0, 99}, {99, 99}, {50, 0}, {50, 99}}; + int num_positions = sizeof(positions) / sizeof(positions[0]); + + for (int i = 0; i < num_positions; i++) { + int x = positions[i][0]; + int y = positions[i][1]; + int color = 64 + i; // Different color for each position + + putpixel(test_bitmap, x, y, color); + int retrieved = getpixel(test_bitmap, x, y); + + char msg[100]; + snprintf(msg, sizeof(msg), "Edge case color %d at (%d,%d)", color, x, y); + TEST_ASSERT_EQ(color, retrieved, msg); + } + + al_destroy_bitmap(test_bitmap); +} + +/*------------------------------------------------------------------*/ +static void +test_putpixel_getpixel_pattern() +{ + ALLEGRO_BITMAP *test_bitmap = al_create_bitmap(50, 50); + TEST_ASSERT(test_bitmap != NULL, "Test bitmap created for pattern"); + + // Create a checkerboard pattern + for (int y = 0; y < 50; y++) { + for (int x = 0; x < 50; x++) { + int color = ((x + y) % 2) ? 100 : 150; + putpixel(test_bitmap, x, y, color); + } + } + + // Verify the pattern + int correct_pixels = 0; + for (int y = 0; y < 50; y++) { + for (int x = 0; x < 50; x++) { + int expected = ((x + y) % 2) ? 100 : 150; + int actual = getpixel(test_bitmap, x, y); + if (expected == actual) { + correct_pixels++; + } + } + } + + TEST_ASSERT_EQ(2500, correct_pixels, "Checkerboard pattern verification (50x50 = 2500 pixels)"); + + al_destroy_bitmap(test_bitmap); +} + +/*------------------------------------------------------------------*/ +static void +test_palette_boundary_values() +{ + ALLEGRO_BITMAP *test_bitmap = al_create_bitmap(10, 10); + TEST_ASSERT(test_bitmap != NULL, "Test bitmap created for boundary values"); + + // Test first and last valid palette indices + putpixel(test_bitmap, 0, 0, 0); // First palette color + int first_color = getpixel(test_bitmap, 0, 0); + TEST_ASSERT_EQ(0, first_color, "First palette color (0)"); + + putpixel(test_bitmap, 1, 1, PALETTE_SIZE - 1); // Last palette color + int last_color = getpixel(test_bitmap, 1, 1); + TEST_ASSERT_EQ(PALETTE_SIZE - 1, last_color, "Last palette color"); + + al_destroy_bitmap(test_bitmap); +} + +/*------------------------------------------------------------------*/ +int +main() +{ + TEST_START(); + + init_test_environment(); + + printf("\n=== Testing putpixel/getpixel functions ===\n"); + test_putpixel_getpixel_basic(); + test_putpixel_getpixel_multiple_colors(); + test_putpixel_getpixel_edge_cases(); + test_putpixel_getpixel_pattern(); + test_palette_boundary_values(); + + TEST_END(); +} \ No newline at end of file diff --git a/src/test_path.c b/src/test_path.c new file mode 100644 index 00000000..75a57cd3 --- /dev/null +++ b/src/test_path.c @@ -0,0 +1,288 @@ +/********************************************************************/ +/* */ +/* L I QQ U U I DD W W A RR 555 */ +/* L I Q Q U U I D D W W A A R R 5 */ +/* L I Q Q U U I D D W W W AAA RR 55 */ +/* L I Q Q U U I D D WW WW A A R R 5 */ +/* LLL I Q Q U I DD W W A A R R 55 */ +/* */ +/* b */ +/* bb y y */ +/* b b yyy */ +/* bb y */ +/* yy */ +/* */ +/* U U FFF O O TTT */ +/* U U F O O O O T */ +/* U U TIRET FF O O O O T */ +/* U U F O O O O T */ +/* U F O O T */ +/* */ +/********************************************************************/ + +/*****************************************************************************/ +/* Liquid War is a multiplayer wargame */ +/* Copyright (C) 1998-2025 Christian Mauduit */ +/* */ +/* 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 */ +/* */ +/* Liquid War homepage : https://ufoot.org/liquidwar/v5 */ +/* Contact author : ufoot@ufoot.org */ +/*****************************************************************************/ + +/********************************************************************/ +/* name : test_path.c */ +/* content : unit tests for path manipulation functions */ +/********************************************************************/ + +/*==================================================================*/ +/* includes */ +/*==================================================================*/ + +#include +#include +#include + +#include "test_simple.h" +#include "path.h" + +/*==================================================================*/ +/* functions */ +/*==================================================================*/ + +/*------------------------------------------------------------------*/ +static void +test_lw_path_get_system_name_basic() +{ + char *result; + + result = lw_path_get_system_name("myfile.txt"); + TEST_ASSERT(strcmp(result, "myfile") == 0, "Basic filename without path"); + + result = lw_path_get_system_name("file"); + TEST_ASSERT(strcmp(result, "file") == 0, "Filename without extension"); + + result = lw_path_get_system_name("test.map.txt"); + TEST_ASSERT(strcmp(result, "test") == 0, "Filename with multiple dots"); +} + +/*------------------------------------------------------------------*/ +static void +test_lw_path_get_system_name_with_paths() +{ + char *result; + + result = lw_path_get_system_name("/home/user/test.txt"); + TEST_ASSERT(strcmp(result, "test") == 0, "Unix path with extension"); + + result = lw_path_get_system_name("C:\\Users\\test\\file.map"); + TEST_ASSERT(strcmp(result, "file") == 0, "Windows path with extension"); + + result = lw_path_get_system_name("/very/long/path/to/myfile.pcx"); + TEST_ASSERT(strcmp(result, "myfile") == 0, "Long Unix path"); + + result = lw_path_get_system_name("relative/path/file.bmp"); + TEST_ASSERT(strcmp(result, "file") == 0, "Relative path"); +} + +/*------------------------------------------------------------------*/ +static void +test_lw_path_get_system_name_edge_cases() +{ + char *result; + + result = lw_path_get_system_name("/path/to/"); + TEST_ASSERT(strcmp(result, "") == 0, "Path ending with separator"); + + result = lw_path_get_system_name("."); + TEST_ASSERT(strcmp(result, "") == 0, "Single dot"); + + result = lw_path_get_system_name(".hidden"); + TEST_ASSERT(strcmp(result, "") == 0, "Hidden file starting with dot"); + + result = lw_path_get_system_name("/path/.hidden.txt"); + TEST_ASSERT(strcmp(result, "") == 0, "Hidden file with extension"); +} + +/*------------------------------------------------------------------*/ +static void +test_lw_path_join2_basic() +{ + char *result; + + result = lw_path_join2("home", "user"); + TEST_ASSERT(result != NULL, "join2 returns non-null"); +#ifdef UNIX + TEST_ASSERT(strcmp(result, "home/user") == 0, "Basic join2 Unix"); +#else + TEST_ASSERT(strcmp(result, "home\\user") == 0, "Basic join2 Windows"); +#endif + free(result); + + result = lw_path_join2("", "file.txt"); + TEST_ASSERT(result != NULL, "join2 with empty first part"); +#ifdef UNIX + TEST_ASSERT(strcmp(result, "/file.txt") == 0, "join2 empty first part Unix"); +#else + TEST_ASSERT(strcmp(result, "\\file.txt") == 0, "join2 empty first part Windows"); +#endif + free(result); + + result = lw_path_join2("dir", ""); + TEST_ASSERT(result != NULL, "join2 with empty second part"); +#ifdef UNIX + TEST_ASSERT(strcmp(result, "dir/") == 0, "join2 empty second part Unix"); +#else + TEST_ASSERT(strcmp(result, "dir\\") == 0, "join2 empty second part Windows"); +#endif + free(result); +} + +/*------------------------------------------------------------------*/ +static void +test_lw_path_join2_various_inputs() +{ + char *result; + + result = lw_path_join2("/usr/local", "bin"); +#ifdef UNIX + TEST_ASSERT(strcmp(result, "/usr/local/bin") == 0, "Absolute path join2"); +#else + TEST_ASSERT(strcmp(result, "/usr/local\\bin") == 0, "Absolute path join2 Windows"); +#endif + free(result); + + result = lw_path_join2("data", "maps"); +#ifdef UNIX + TEST_ASSERT(strcmp(result, "data/maps") == 0, "Relative path join2"); +#else + TEST_ASSERT(strcmp(result, "data\\maps") == 0, "Relative path join2 Windows"); +#endif + free(result); + + result = lw_path_join2("very_long_directory_name", "very_long_filename.extension"); + TEST_ASSERT(result != NULL, "join2 with long names"); + TEST_ASSERT(strlen(result) > 30, "join2 result has expected length"); + free(result); +} + +/*------------------------------------------------------------------*/ +static void +test_lw_path_join3_basic() +{ + char *result; + + result = lw_path_join3("home", "user", "documents"); + TEST_ASSERT(result != NULL, "join3 returns non-null"); +#ifdef UNIX + TEST_ASSERT(strcmp(result, "home/user/documents") == 0, "Basic join3 Unix"); +#else + TEST_ASSERT(strcmp(result, "home\\user\\documents") == 0, "Basic join3 Windows"); +#endif + free(result); + + result = lw_path_join3("", "middle", "end"); + TEST_ASSERT(result != NULL, "join3 with empty first part"); +#ifdef UNIX + TEST_ASSERT(strcmp(result, "/middle/end") == 0, "join3 empty first Unix"); +#else + TEST_ASSERT(strcmp(result, "\\middle\\end") == 0, "join3 empty first Windows"); +#endif + free(result); + + result = lw_path_join3("start", "", "end"); + TEST_ASSERT(result != NULL, "join3 with empty middle part"); +#ifdef UNIX + TEST_ASSERT(strcmp(result, "start//end") == 0, "join3 empty middle Unix"); +#else + TEST_ASSERT(strcmp(result, "start\\\\end") == 0, "join3 empty middle Windows"); +#endif + free(result); +} + +/*------------------------------------------------------------------*/ +static void +test_lw_path_join3_various_inputs() +{ + char *result; + + result = lw_path_join3("/usr", "local", "share"); +#ifdef UNIX + TEST_ASSERT(strcmp(result, "/usr/local/share") == 0, "Absolute path join3"); +#else + TEST_ASSERT(strcmp(result, "/usr\\local\\share") == 0, "Absolute path join3 Windows"); +#endif + free(result); + + result = lw_path_join3("data", "maps", "level1.map"); +#ifdef UNIX + TEST_ASSERT(strcmp(result, "data/maps/level1.map") == 0, "File path join3"); +#else + TEST_ASSERT(strcmp(result, "data\\maps\\level1.map") == 0, "File path join3 Windows"); +#endif + free(result); + + result = lw_path_join3("a", "b", "c"); + TEST_ASSERT(result != NULL, "join3 with single chars"); + TEST_ASSERT(strlen(result) == 5, "join3 single chars correct length"); + free(result); +} + +/*------------------------------------------------------------------*/ +static void +test_memory_management() +{ + char *result1, *result2, *result3; + + result1 = lw_path_join2("test", "path"); + result2 = lw_path_join2("another", "test"); + result3 = lw_path_join3("three", "part", "path"); + + TEST_ASSERT(result1 != NULL && result2 != NULL && result3 != NULL, "Multiple allocations successful"); + TEST_ASSERT(result1 != result2 && result2 != result3 && result1 != result3, "Different memory addresses"); + + free(result1); + free(result2); + free(result3); + + result1 = lw_path_join2("after", "free"); + TEST_ASSERT(result1 != NULL, "Allocation after free works"); + free(result1); +} + +/*------------------------------------------------------------------*/ +int +main() +{ + TEST_START(); + + printf("\n=== Testing lw_path_get_system_name ===\n"); + test_lw_path_get_system_name_basic(); + test_lw_path_get_system_name_with_paths(); + test_lw_path_get_system_name_edge_cases(); + + printf("\n=== Testing lw_path_join2 ===\n"); + test_lw_path_join2_basic(); + test_lw_path_join2_various_inputs(); + + printf("\n=== Testing lw_path_join3 ===\n"); + test_lw_path_join3_basic(); + test_lw_path_join3_various_inputs(); + + printf("\n=== Testing Memory Management ===\n"); + test_memory_management(); + + TEST_END(); +} diff --git a/src/thrddos.c b/src/test_simple.h similarity index 63% rename from src/thrddos.c rename to src/test_simple.h index 9cb4c9f0..91146e2c 100644 --- a/src/thrddos.c +++ b/src/test_simple.h @@ -43,44 +43,84 @@ /*****************************************************************************/ /********************************************************************/ -/* name : thrddos.c */ -/* content : provides fake thread support under DOS */ +/* name : test_simple.h */ +/* content : simple unit testing framework */ /********************************************************************/ +#ifndef LIQUID_WAR_INCLUDE_TEST_SIMPLE +#define LIQUID_WAR_INCLUDE_TEST_SIMPLE + /*==================================================================*/ /* includes */ /*==================================================================*/ -#include "thrdgen.h" - -/*==================================================================*/ -/* defines */ -/*==================================================================*/ +#include +#include /*==================================================================*/ /* macros */ /*==================================================================*/ -/*==================================================================*/ -/* globals */ -/*==================================================================*/ +static int _test_count = 0; +static int _test_passed = 0; +static int _test_failed = 0; -/*==================================================================*/ -/* fonctions */ -/*==================================================================*/ +#define TEST_START() \ + do { \ + printf("Starting tests...\n"); \ + _test_count = 0; \ + _test_passed = 0; \ + _test_failed = 0; \ + } while(0) + +#define TEST_ASSERT(condition, message) \ + do { \ + _test_count++; \ + if (condition) { \ + printf("PASS: %s\n", message); \ + _test_passed++; \ + } else { \ + printf("FAIL: %s\n", message); \ + _test_failed++; \ + } \ + } while(0) + +#define TEST_ASSERT_EQ(expected, actual, message) \ + do { \ + _test_count++; \ + if ((expected) == (actual)) { \ + printf("PASS: %s (expected=%d, actual=%d)\n", message, (int)(expected), (int)(actual)); \ + _test_passed++; \ + } else { \ + printf("FAIL: %s (expected=%d, actual=%d)\n", message, (int)(expected), (int)(actual)); \ + _test_failed++; \ + } \ + } while(0) -/*------------------------------------------------------------------*/ -/* - * Starts a new thread using the given callback - */ -int -lw_thread_start (void (*func) (void *), void *args) -{ - int result = 0; +#define TEST_ASSERT_NE(not_expected, actual, message) \ + do { \ + _test_count++; \ + if ((not_expected) != (actual)) { \ + printf("PASS: %s (not_expected=%d, actual=%d)\n", message, (int)(not_expected), (int)(actual)); \ + _test_passed++; \ + } else { \ + printf("FAIL: %s (not_expected=%d, actual=%d)\n", message, (int)(not_expected), (int)(actual)); \ + _test_failed++; \ + } \ + } while(0) - /* - * There's no thread support under DOS 8-/ - */ +#define TEST_END() \ + do { \ + printf("\n=== Test Summary ===\n"); \ + printf("Total tests: %d\n", _test_count); \ + printf("Passed: %d\n", _test_passed); \ + printf("Failed: %d\n", _test_failed); \ + if (_test_failed == 0) { \ + printf("ALL TESTS PASSED!\n"); \ + } else { \ + printf("SOME TESTS FAILED!\n"); \ + } \ + return (_test_failed == 0) ? 0 : 1; \ + } while(0) - return result; -} +#endif \ No newline at end of file diff --git a/src/texture.c b/src/texture.c index 69647821..c01c8a9d 100644 --- a/src/texture.c +++ b/src/texture.c @@ -53,7 +53,7 @@ /*==================================================================*/ #include "base.h" -#include "alleg2.h" +#include "backport.h" #include "bigdata.h" #include "texture.h" #include "disk.h" @@ -101,7 +101,8 @@ exist_color (PALETTE pal, RGB rgb) /*-----------------------------------------------------------------*/ static int -recalculate_number_of_colors (int max_number, BITMAP * bmp, PALETTE pal) +recalculate_number_of_colors (int max_number, ALLEGRO_BITMAP * bmp, + PALETTE pal) { int i, x, y, n = 1; RGB color; @@ -112,8 +113,8 @@ recalculate_number_of_colors (int max_number, BITMAP * bmp, PALETTE pal) for (i = 0; i < 256; ++i) pal2[i] = color; - for (y = 0; y < bmp->h && n < max_number; ++y) - for (x = 0; x < bmp->w && n < max_number; ++x) + for (y = 0; y < al_get_bitmap_height(bmp) && n < max_number; ++y) + for (x = 0; x < al_get_bitmap_width(bmp) && n < max_number; ++x) { color = pal[getpixel (bmp, x, y)]; if (!exist_color (pal2, color)) @@ -126,14 +127,15 @@ recalculate_number_of_colors (int max_number, BITMAP * bmp, PALETTE pal) static void create_new_palette (PALETTE dst, PALETTE src, - BITMAP * bmp, int first_color, int number_of_colors) + ALLEGRO_BITMAP * bmp, int first_color, + int number_of_colors) { int i, x, y, index; int nb_retries = 0; RGB color; - x = random () % bmp->w; - y = random () % bmp->h; + x = random () % al_get_bitmap_width(bmp); + y = random () % al_get_bitmap_height(bmp); color = src[getpixel (bmp, x, y)]; for (i = 0; i < 256; ++i) @@ -141,8 +143,8 @@ create_new_palette (PALETTE dst, for (i = 1; i < number_of_colors;) { - x = random () % bmp->w; - y = random () % bmp->h; + x = random () % al_get_bitmap_width(bmp); + y = random () % al_get_bitmap_height(bmp); index = getpixel (bmp, x, y); color = src[index]; if ((!exist_color (dst, color)) || @@ -180,7 +182,7 @@ correct_palette (PALETTE pal, int first_color, int number_of_colors) /*-----------------------------------------------------------------*/ static void -create_converted_bitmap (BITMAP * bmp, +create_converted_bitmap (ALLEGRO_BITMAP * bmp, PALETTE dst, PALETTE src, int first_color, int number_of_colors) { @@ -189,20 +191,22 @@ create_converted_bitmap (BITMAP * bmp, for (i = 0; i < 256; ++i) corres[i] = bestfit_color (dst, src[i].r, src[i].g, src[i].b); - for (y = 0; y < bmp->h; ++y) - for (x = 0; x < bmp->w; ++x) + al_set_target_bitmap (bmp); + for (y = 0; y < al_get_bitmap_height(bmp); ++y) + for (x = 0; x < al_get_bitmap_width(bmp); ++x) { index = corres[getpixel (bmp, x, y)]; index = (index < first_color || index >= first_color + number_of_colors) ? first_color : index; - putpixel (bmp, x, y, index); + putpixel_fast (x, y, index); } } /*------------------------------------------------------------------*/ static void -red8col (BITMAP * bmp, PALETTE pal, int first_color, int number_of_colors) +red8col (ALLEGRO_BITMAP * bmp, PALETTE pal, int first_color, + int number_of_colors) { PALETTE pal2; int i; @@ -219,7 +223,7 @@ red8col (BITMAP * bmp, PALETTE pal, int first_color, int number_of_colors) /*------------------------------------------------------------------*/ static void -texture_8to5 (BITMAP * bmp, PALETTE pal, void *result, +texture_8to5 (ALLEGRO_BITMAP * bmp, PALETTE pal, void *result, int first_color, int number_of_colors, char *filename) { char *buffer; @@ -228,7 +232,7 @@ texture_8to5 (BITMAP * bmp, PALETTE pal, void *result, int coul; char system_name_buffer[LW_TEXTURE_SYSTEM_NAME_SIZE + 1]; - lw_serial_set_texture_header (result, (short) bmp->w, (short) bmp->h); + lw_serial_set_texture_header (result, (short) al_get_bitmap_width(bmp), (short) al_get_bitmap_height(bmp)); buffer = ((char *) result) + 2 * sizeof (short); @@ -250,8 +254,8 @@ texture_8to5 (BITMAP * bmp, PALETTE pal, void *result, for (i = 0; i < 5; ++i) octet[i] = 0; - for (y = 0; y < bmp->h; ++y) - for (x = 0; x < bmp->w; ++x) + for (y = 0; y < al_get_bitmap_height(bmp); ++y) + for (x = 0; x < al_get_bitmap_width(bmp); ++x) { coul = getpixel (bmp, x, y) - first_color; toadd = 1 << pos8; @@ -261,7 +265,7 @@ texture_8to5 (BITMAP * bmp, PALETTE pal, void *result, octet[3] |= (coul & 8) ? toadd : 0; octet[4] |= (coul & 16) ? toadd : 0; - if (pos8 == 7 || (y == bmp->h - 1 && x == bmp->w - 1)) + if (pos8 == 7 || (y == al_get_bitmap_height(bmp) - 1 && x == al_get_bitmap_width(bmp) - 1)) { for (i = 0; i < 5; ++i) { @@ -280,7 +284,7 @@ void * lw_texture_archive_raw (const char *filename) { int i, w, h, size = 0; - BITMAP *bmp; + ALLEGRO_BITMAP *bmp; PALETTE pal; char *result = NULL, *temp = NULL; char *f = (char *) filename; @@ -288,8 +292,8 @@ lw_texture_archive_raw (const char *filename) bmp = load_bitmap (filename, pal); if (bmp) { - w = bmp->w; - h = bmp->h; + w = al_get_bitmap_width(bmp); + h = al_get_bitmap_height(bmp); if (w > 0 && h > 0) { temp = malloc (size = @@ -302,7 +306,7 @@ lw_texture_archive_raw (const char *filename) texture_8to5 (bmp, pal, temp, 0, TEXTURE_COLOR_NUMBER, f); } } - destroy_bitmap (bmp); + al_destroy_bitmap (bmp); } if (temp) { @@ -321,37 +325,40 @@ lw_texture_archive_raw (const char *filename) } /*------------------------------------------------------------------*/ -static BITMAP * +static ALLEGRO_BITMAP * create_raw_texture (void *ptr, int first) { int x, y, pos8 = 0, color; char totest, *data; - BITMAP *result; + ALLEGRO_BITMAP *result; short w, h; data = ptr; lw_serial_get_texture_header (data, &w, &h); data += 2 * sizeof (short) + LW_TEXTURE_SYSTEM_NAME_SIZE + 3 * 32; - result = my_create_bitmap (w, h); + result = my_create_memory_bitmap (w, h); if (result) - for (y = 0; y < h; ++y) - for (x = 0; x < w; ++x) - { - totest = 1 << pos8; - color = first + ((data[0] & totest) ? 1 : 0) - + ((data[1] & totest) ? 2 : 0) - + ((data[2] & totest) ? 4 : 0) - + ((data[3] & totest) ? 8 : 0) + ((data[4] & totest) ? 16 : 0); - putpixel (result, x, y, color); - if (pos8 == 7) - { - data += 5; - pos8 = 0; - } - else - pos8++; - } + { + al_set_target_bitmap (result); + for (y = 0; y < h; ++y) + for (x = 0; x < w; ++x) + { + totest = 1 << pos8; + color = first + ((data[0] & totest) ? 1 : 0) + + ((data[1] & totest) ? 2 : 0) + + ((data[2] & totest) ? 4 : 0) + + ((data[3] & totest) ? 8 : 0) + ((data[4] & totest) ? 16 : 0); + putpixel_fast (x, y, color); + if (pos8 == 7) + { + data += 5; + pos8 = 0; + } + else + pos8++; + } + } return result; } @@ -381,21 +388,21 @@ get_raw_texture (int num) } /*------------------------------------------------------------------*/ -static BITMAP * +static ALLEGRO_BITMAP * create_mono_texture (int first) { - BITMAP *result; + ALLEGRO_BITMAP *result; - result = my_create_bitmap (1, 1); + result = my_create_memory_bitmap (1, 1); putpixel (result, 0, 0, first); return result; } /*------------------------------------------------------------------*/ -static BITMAP * +static ALLEGRO_BITMAP * create_texture (int num, int first) { - BITMAP *result; + ALLEGRO_BITMAP *result; void *texture; texture = get_raw_texture (num); @@ -413,14 +420,14 @@ create_texture (int num, int first) } /*------------------------------------------------------------------*/ -BITMAP * +ALLEGRO_BITMAP * lw_texture_create_bg (int num) { return create_texture (num, BG_TEXTURE_FIRST_COLOR); } /*------------------------------------------------------------------*/ -BITMAP * +ALLEGRO_BITMAP * lw_texture_create_fg (int num) { return create_texture (num, FG_TEXTURE_FIRST_COLOR); diff --git a/src/texture.h b/src/texture.h index 7de574c5..3ec0df02 100644 --- a/src/texture.h +++ b/src/texture.h @@ -55,7 +55,7 @@ /* includes */ /*==================================================================*/ -#include +#include #include "texture.h" /*==================================================================*/ @@ -69,8 +69,8 @@ /*==================================================================*/ void *lw_texture_archive_raw (const char *filename); -BITMAP *lw_texture_create_bg (int num); -BITMAP *lw_texture_create_fg (int num); +ALLEGRO_BITMAP *lw_texture_create_bg (int num); +ALLEGRO_BITMAP *lw_texture_create_fg (int num); char *lw_texture_get_system_name (int num); #endif diff --git a/src/thrdgen.h b/src/thrdgen.h index 21df2f46..49217bd4 100644 --- a/src/thrdgen.h +++ b/src/thrdgen.h @@ -50,6 +50,22 @@ #ifndef LIQUID_WAR_INCLUDE_THRDGEN #define LIQUID_WAR_INCLUDE_THRDGEN +/*==================================================================*/ +/* types */ +/*==================================================================*/ + +typedef struct +{ + void *data; +} +LW_THREAD_HANDLE, *LW_THREAD_HANDLE_PTR; + +/*==================================================================*/ +/* functions */ +/*==================================================================*/ + int lw_thread_start (void (*func) (void *), void *args); +int lw_thread_create (LW_THREAD_HANDLE * handle, void (*func) (void *), void *args); +int lw_thread_join (LW_THREAD_HANDLE * handle); #endif diff --git a/src/thrdunix.c b/src/thrdunix.c index 13db080a..cd7dc3d3 100644 --- a/src/thrdunix.c +++ b/src/thrdunix.c @@ -53,6 +53,7 @@ #include #include +#include #include "thrdgen.h" @@ -74,41 +75,122 @@ /*------------------------------------------------------------------*/ /* - * Wrapper structure to pass function and args together + * Internal structure to pass both function and args to pthread wrapper */ -typedef struct -{ - void (*func) (void *); +typedef struct { + void (*func)(void *); void *args; } lw_thread_wrapper_data; +/*------------------------------------------------------------------*/ /* - * Wrapper function to adapt void-returning functions to pthread's signature + * Wrapper function that matches pthread signature and calls the original function */ static void * -lw_thread_wrapper (void *arg) +lw_thread_wrapper (void *data) { - lw_thread_wrapper_data *data = (lw_thread_wrapper_data *) arg; - void (*func) (void *) = data->func; - void *args = data->args; + lw_thread_wrapper_data *wrapper_data = (lw_thread_wrapper_data *) data; + + // Call the original function + wrapper_data->func (wrapper_data->args); + + // Clean up the wrapper data + free (wrapper_data); - free (data); - func (args); return NULL; } +/*------------------------------------------------------------------*/ +/* + * Creates a joinable thread and returns a handle + */ +int +lw_thread_create (LW_THREAD_HANDLE * handle, void (*func) (void *), void *args) +{ + pthread_t *thread; + int result = 0; + lw_thread_wrapper_data *wrapper_data; + + // Allocate thread handle + thread = malloc (sizeof (pthread_t)); + if (thread == NULL) + { + return 0; + } + + // Allocate wrapper data structure + wrapper_data = malloc (sizeof (lw_thread_wrapper_data)); + if (wrapper_data == NULL) + { + free (thread); + return 0; + } + + wrapper_data->func = func; + wrapper_data->args = args; + + // Create joinable thread (default behavior when attr is NULL) + if (pthread_create (thread, NULL, lw_thread_wrapper, wrapper_data) == 0) + { + handle->data = thread; + result = 1; + } + else + { + // Thread creation failed, clean up + free (wrapper_data); + free (thread); + } + + return result; +} + +/*------------------------------------------------------------------*/ +/* + * Waits for a thread to complete + */ +int +lw_thread_join (LW_THREAD_HANDLE * handle) +{ + pthread_t *thread; + int result = 0; + + if (handle && handle->data) + { + thread = (pthread_t *) handle->data; + if (pthread_join (*thread, NULL) == 0) + { + result = 1; + } + free (thread); + handle->data = NULL; + } + + return result; +} + +/*------------------------------------------------------------------*/ /* - * Starts a new thread using the given callback + * Starts a new thread using the given callback (detached) */ int lw_thread_start (void (*func) (void *), void *args) { pthread_t thread; int result = 0; - lw_thread_wrapper_data *data; + lw_thread_wrapper_data *wrapper_data; - data = (lw_thread_wrapper_data *) malloc (sizeof (lw_thread_wrapper_data)); - if (data != NULL) + // Allocate wrapper data structure + wrapper_data = malloc (sizeof (lw_thread_wrapper_data)); + if (wrapper_data == NULL) + { + return 0; + } + + wrapper_data->func = func; + wrapper_data->args = args; + + if (pthread_create (&thread, NULL, lw_thread_wrapper, wrapper_data) == 0) { data->func = func; data->args = args; @@ -129,6 +211,17 @@ lw_thread_start (void (*func) (void *), void *args) /* Thread creation failed, free the wrapper data */ free (data); } + else + { + // If detach fails, we should still clean up the wrapper data + // Note: this is a rare edge case, but we'll let the thread clean up + // since it was successfully created + } + } + else + { + // Thread creation failed, clean up wrapper data + free (wrapper_data); } return result; diff --git a/src/thrdw32.c b/src/thrdw32.c index 303ef6b3..80efc86b 100644 --- a/src/thrdw32.c +++ b/src/thrdw32.c @@ -53,6 +53,7 @@ #ifdef WIN32 #include +#include #endif #include "thrdgen.h" @@ -75,7 +76,62 @@ /*------------------------------------------------------------------*/ /* - * Starts a new thread using the given callback + * Creates a joinable thread and returns a handle + */ +int +lw_thread_create (LW_THREAD_HANDLE * handle, void (*func) (void *), void *args) +{ +#ifdef WIN32 + uintptr_t thread_handle; + int result = 0; + + // Use _beginthreadex which returns a handle we can wait on + // Unlike _beginthread, this doesn't auto-close the handle + thread_handle = _beginthreadex (NULL, 0, (unsigned (__stdcall *)(void *))func, args, 0, NULL); + + if (thread_handle != 0) + { + handle->data = (void *)thread_handle; + result = 1; + } + + return result; +#else + // Not on Windows, shouldn't happen but return failure + return 0; +#endif +} + +/*------------------------------------------------------------------*/ +/* + * Waits for a thread to complete + */ +int +lw_thread_join (LW_THREAD_HANDLE * handle) +{ +#ifdef WIN32 + int result = 0; + + if (handle && handle->data) + { + // Wait for thread to complete + WaitForSingleObject ((HANDLE)handle->data, INFINITE); + // Close the thread handle + CloseHandle ((HANDLE)handle->data); + handle->data = NULL; + result = 1; + } + + return result; +#else + // Not on Windows, shouldn't happen but return failure + return 0; +#endif +} + +/*------------------------------------------------------------------*/ +/* + * Starts a new thread using the given callback (detached) */ int lw_thread_start (void (*func) (void *), void *args) diff --git a/src/ticker.c b/src/ticker.c index 79422d6a..9b95f226 100644 --- a/src/ticker.c +++ b/src/ticker.c @@ -52,20 +52,14 @@ /* includes */ /*==================================================================*/ -#include - +#include "backport.h" #include "ticker.h" /*==================================================================*/ /* variables globales */ /*==================================================================*/ -#ifdef DOS -#define TICKER_STEP 5 -#else -#define TICKER_STEP 10 -#endif -static int TICKER_VALUE = 0; +static double ticker_start_time = 0.0; /*==================================================================*/ /* fonctions */ @@ -76,45 +70,32 @@ static int TICKER_VALUE = 0; /* mise en place du chrono */ /*------------------------------------------------------------------*/ -/*------------------------------------------------------------------*/ -static void -ticker_handler (void) -{ - TICKER_VALUE += TICKER_STEP; -} - -END_OF_FUNCTION (ticker_handler); - /*------------------------------------------------------------------*/ int start_ticker (void) { - int result = 0; - //#ifdef DOS - LOCK_FUNCTION (ticker_handler); - LOCK_VARIABLE (TICKER_VALUE); - - result = install_int_ex (ticker_handler, MSEC_TO_TIMER (TICKER_STEP)); - //#endif - return result; + // Initialize ticker with current time + ticker_start_time = al_get_time(); + return 0; // Always succeeds with Allegro 5 } /*------------------------------------------------------------------*/ void stop_ticker (void) { - //#ifdef DOS - remove_int (ticker_handler); - //#endif + // No cleanup needed with Allegro 5's al_get_time() + // Just reset the start time + ticker_start_time = 0.0; } /*------------------------------------------------------------------*/ int get_ticker (void) { - //#ifdef DOS - return TICKER_VALUE; - //#else - //return ++TICKER_VALUE; - //#endif + // Return elapsed time in milliseconds since start_ticker() was called + double current_time = al_get_time(); + double elapsed_seconds = current_time - ticker_start_time; + + // Convert to milliseconds and return as integer + return (int)(elapsed_seconds * 1000.0); } diff --git a/src/viewport.c b/src/viewport.c index 518c0c79..97201ca0 100644 --- a/src/viewport.c +++ b/src/viewport.c @@ -52,10 +52,8 @@ /* includes */ /*==================================================================*/ -#include - #include "area.h" -#include "alleg2.h" +#include "backport.h" #include "config.h" #include "gfxmode.h" #include "palette.h" @@ -69,7 +67,7 @@ /*==================================================================*/ int PAGE_FLIP_H = 0; -BITMAP *NEXT_SCREEN = NULL; +ALLEGRO_BITMAP *NEXT_SCREEN = NULL; static int VIEWPORT_X = 0; static int VIEWPORT_Y = 0; @@ -149,7 +147,7 @@ init_viewport_size (int x, int y, int w, int h) } /*------------------------------------------------------------------*/ -BITMAP * +ALLEGRO_BITMAP * page_flip (void) { int old_h, new_h; @@ -159,7 +157,7 @@ page_flip (void) { if (NEXT_SCREEN) { - destroy_bitmap (NEXT_SCREEN); + al_destroy_bitmap (NEXT_SCREEN); } lw_info_get_room_for_viewport (&x, &y, &w, &h); @@ -222,7 +220,7 @@ last_flip (void) PAGE_FLIP_H = 0; } - destroy_bitmap (NEXT_SCREEN); + al_destroy_bitmap (NEXT_SCREEN); NEXT_SCREEN = NULL; } } diff --git a/src/viewport.h b/src/viewport.h index 46e301fd..9a29c08b 100644 --- a/src/viewport.h +++ b/src/viewport.h @@ -55,7 +55,7 @@ /* includes */ /*==================================================================*/ -#include +#include /*==================================================================*/ /* variables globales */ @@ -66,14 +66,14 @@ extern int PAGE_FLIP_H; extern int MODEX_SCALE; -extern BITMAP *NEXT_SCREEN; +extern ALLEGRO_BITMAP *NEXT_SCREEN; /*==================================================================*/ /* fonctions globales */ /*==================================================================*/ void rect_for_viewport (void); -BITMAP *page_flip (void); +ALLEGRO_BITMAP *page_flip (void); void last_flip (void); void lw_viewport_register_change (int count); diff --git a/src/watchdog.c b/src/watchdog.c index 345578d2..b4978a46 100644 --- a/src/watchdog.c +++ b/src/watchdog.c @@ -52,9 +52,9 @@ /* includes */ /*==================================================================*/ -#include #include +#include "backport.h" #include "watchdog.h" #include "log.h" #include "macro.h" diff --git a/src/x11icon.c b/src/x11icon.c index bf76fbdd..b8bff7b5 100644 --- a/src/x11icon.c +++ b/src/x11icon.c @@ -1,4 +1,6 @@ -#include +#include + +#if defined ALLEGRO_WITH_XWINDOWS && defined ALLEGRO_USE_CONSTRUCTOR /* XPM */ static const char *allegico_xpm[] = { /* columns rows colors chars-per-pixel */ @@ -288,8 +290,6 @@ static const char *allegico_xpm[] = { "vXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvX", "vXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvXvX" }; - -#if defined ALLEGRO_WITH_XWINDOWS && defined ALLEGRO_USE_CONSTRUCTOR extern void *allegro_icon; CONSTRUCTOR_FUNCTION (static void _set_allegro_icon (void)); static void diff --git a/utils/Makefile.in b/utils/Makefile.in index 98427b9d..722502cb 100644 --- a/utils/Makefile.in +++ b/utils/Makefile.in @@ -1,28 +1,9 @@ -SNPRINTF = @SNPRINTF@ -ALCFLAGS = @ALCFLAGS@ -ALLIBS = @ALLIBS@ - -ifeq ($(SNPRINTF),yes) - SNPRINTF_FILES = - SNPRINTF_OPTIONS = -else - SNPRINTF_FILES = snprintf/snprintf.o - SNPRINTF_OPTIONS = -DSNPRINTF -endif - -EXE_FILES = liquidwarcol liquidwarmap liquidwartex - -OBJ_NAMES = liquidwarcol liquidwarmap liquidwartex -OBJ_FILES = $(addsuffix .o, $(OBJ_NAMES)) - -CMD_CC = $(CC) $(CFLAGS) $(ALCFLAGS) -c -Wall -W $(SNPRINTF_OPTIONS) - -all: $(EXE_FILES) $(OBJ_FILES) +all: install: -config: print_cmd_cc +config: check: @@ -31,27 +12,5 @@ indent: dep: clean: - @rm -f *.o - @rm -f */*.o - @rm -f $(OBJ_FILES) - @rm -f $(EXE_FILES) distclean: - @rm -f snprintf/test - @rm -f lwmapgen/lwmapgen - @rm -f lwmapgen/liquidwar-mapgen - @rm -f Makefile - -liquidwar%: liquidwar%.o $(SNPRINTF_FILES) - @echo "Building $@" - @$(CC) $(LDFLAGS) -o $@ $< $(SNPRINTF_FILES) $(ALLIBS) - -%.o: %.c - @echo "Compiling" $< - @$(CMD_CC) $< -o $@ - -print_cmd_cc: - @echo "The command line to compile .c files in this directory is:" - @echo -- $(CMD_CC) - @echo "The command line to link .o files in this directory is" - @echo -- $(CC) $(LDFLAGS) $(ALLIBS) diff --git a/utils/liquidwarcol.c b/utils/liquidwarcol.c deleted file mode 100644 index 483feaa6..00000000 --- a/utils/liquidwarcol.c +++ /dev/null @@ -1,451 +0,0 @@ -/********************************************************************/ -/* */ -/* L I QQ U U I DD W W A RR 555 */ -/* L I Q Q U U I D D W W A A R R 5 */ -/* L I Q Q U U I D D W W W AAA RR 55 */ -/* L I Q Q U U I D D WW WW A A R R 5 */ -/* LLL I Q Q U I DD W W A A R R 55 */ -/* */ -/* b */ -/* bb y y */ -/* b b yyy */ -/* bb y */ -/* yy */ -/* */ -/* U U FFF O O TTT */ -/* U U F O O O O T */ -/* U U TIRET FF O O O O T */ -/* U U F O O O O T */ -/* U F O O T */ -/* */ -/********************************************************************/ - -/*****************************************************************************/ -/* Liquid War is a multiplayer wargame */ -/* Copyright (C) 1998-2025 Christian Mauduit */ -/* */ -/* 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 */ -/* */ -/* Liquid War homepage : https://ufoot.org/liquidwar/v5 */ -/* Contact author : ufoot@ufoot.org */ -/*****************************************************************************/ - -/********************************************************************/ -/* nom : liquidwarcol.c */ -/* contenu : tools to convert files to 8 bits palettes */ -/* date de modif : 3 mai 98 */ -/********************************************************************/ - -/*=================================================================*/ -/* defines */ -/*=================================================================*/ - -#define ALLEGRO_USE_CONSOLE - -/*=================================================================*/ -/* includes */ -/*=================================================================*/ - -#include -#include -#include -#include -#include - -/*=================================================================*/ -/* constants */ -/*=================================================================*/ - -#define LW_TEXTURE_RANDOM_MAX_RETRIES 10000 - -/*=================================================================*/ -/* variables globales */ -/*=================================================================*/ - -int ARGC; -char **ARGV; -int FLAG_BACKUP = 0; -int FLAG_HELP = 0; -int FLAG_SILENT = 0; -int FIRST_COLOR; -int NUMBER_OF_COLORS; -char *FILENAMES[65536]; -int NUMBER_OF_FILES = 0; -PALETTE PALETTE_SRC; -PALETTE PALETTE_DST; -BITMAP *BITMAP_SRC = NULL; -BITMAP *BITMAP_DST = NULL; - -/*=================================================================*/ -/* fonctions */ -/*=================================================================*/ - -/*-----------------------------------------------------------------*/ -/* affichages d'aide */ -/*-----------------------------------------------------------------*/ - -/*-----------------------------------------------------------------*/ -void -display_common_help (void) -{ - printf ("liquidwarcol by U-Foot (ufoot@ufoot.org).\n"); - printf ("This is a 'palette reducer' for 256 colors bitmaps.\n"); - printf ("It is free software, protected by the GPL.\n"); - printf ("It uses Allegro by Shawn Hargreaves.\n"); - printf ("\n"); -} - -/*-----------------------------------------------------------------*/ -void -display_short_help (void) -{ - display_common_help (); - printf ("Type \"liquidwarcol -?\" for more help.\n"); -} - -/*-----------------------------------------------------------------*/ -void -display_long_help (void) -{ - display_common_help (); - printf ("Syntax:\n"); - printf ("liquidwarcol [options] first_color number_of_colors filenames\n"); - printf ("\n"); - printf ("Options:\n"); - printf ("-? -h -H : displays this help.\n"); - printf ("-s -S : silent mode, nothing written to the console.\n"); - printf ("\n"); - printf ("Warning: the source file will be replaced!\n"); -} - -/*-----------------------------------------------------------------*/ -/* lecture des parametres de la ligne de commande */ -/*-----------------------------------------------------------------*/ - -/*-----------------------------------------------------------------*/ -int -acknowledge_flag (char *str) -{ - int found = 0; - - if (str[0] == '-' || str[0] == '/') - { - found = 1; - switch (str[1]) - { - case '?': - case 'h': - case 'H': - FLAG_HELP = 1; - break; - case 'b': - case 'B': - FLAG_BACKUP = 1; - break; - case 's': - case 'S': - FLAG_SILENT = 1; - break; - default: - found = 0; - } - } - return found; -} - -/*-----------------------------------------------------------------*/ -int -read_command_line (void) -{ - int i, j = 0, success = 1; - - for (i = 1; i < ARGC; ++i) - { - if ((!acknowledge_flag (ARGV[i]))) - { - if (j == 0) - FIRST_COLOR = atoi (ARGV[i]); - if (j == 1) - NUMBER_OF_COLORS = atoi (ARGV[i]); - if (j >= 2) - FILENAMES[j - 2] = ARGV[i]; - j++; - } - } - NUMBER_OF_FILES = j - 2; - if (NUMBER_OF_FILES > 0) - { - if (FIRST_COLOR < 0) - { - success = 0; - printf ("ERROR! First color number must be >= 0.\n"); - } - if (FIRST_COLOR > 255) - { - success = 0; - printf ("ERROR! First color number must be < 255.\n"); - } - if (NUMBER_OF_COLORS < 1) - { - success = 0; - printf ("ERROR! Number of colors must be > 1.\n"); - } - if (NUMBER_OF_COLORS + FIRST_COLOR > 256) - { - success = 0; - printf ("ERROR! Last color number must be < 256.\n"); - } - } - else - { - success = 0; - if (!FLAG_HELP) - printf ("ERROR! Two few arguments.\n"); - } - return success; -} - -/*-----------------------------------------------------------------*/ -/* acces disque */ -/*-----------------------------------------------------------------*/ - -/*-----------------------------------------------------------------*/ -int -load_file (char *filename) -{ - int success; - - if (!FLAG_SILENT) - printf ("Loading '%s'.\n", filename); - - if (BITMAP_SRC != NULL) - destroy_bitmap (BITMAP_SRC); - BITMAP_SRC = load_bitmap (filename, PALETTE_SRC); - success = BITMAP_SRC != NULL; - if (!success) - printf ("ERROR! Unable to read '%s'.\n", filename); - return success; -} - -/*-----------------------------------------------------------------*/ -void -save_backup (char *filename) -{ - char *bak_name = "faut encore le programmer"; - - if (!FLAG_SILENT) - printf ("Saving a copy of '%s' as '%s'.\n", filename, bak_name); -} - -/*-----------------------------------------------------------------*/ -void -save_file (char *filename) -{ - if (!FLAG_SILENT) - printf ("Replacing '%s'.\n", filename); - if (save_bitmap (filename, BITMAP_DST, PALETTE_DST)) - printf ("ERROR! Unable to save '%s'.\n", filename); -} - -/*-----------------------------------------------------------------*/ -/* operations de conversion */ -/*-----------------------------------------------------------------*/ - -/*-----------------------------------------------------------------*/ -int -find_color (PALETTE pal, RGB rgb) -{ - int i, found = -1; - - for (i = 0; i < 256 && found < 0; ++i) - if (pal[i].r == rgb.r && pal[i].g == rgb.g && pal[i].b == rgb.b) - found = i; - - return found; -} - -/*-----------------------------------------------------------------*/ -int -exist_color (PALETTE pal, RGB rgb) -{ - return (find_color (pal, rgb) >= 0); -} - -/*-----------------------------------------------------------------*/ -void -recalculate_number_of_colors () -{ - int i, x, y, n = 1; - RGB color; - PALETTE pal; - - //nb_of_colors=NUMBER_OF_COLORS; - color = PALETTE_SRC[getpixel (BITMAP_SRC, 0, 0)]; - - for (i = 0; i < 256; ++i) - pal[i] = color; - - for (y = 0; y < BITMAP_SRC->h && n < NUMBER_OF_COLORS; ++y) - for (x = 0; x < BITMAP_SRC->w && n < NUMBER_OF_COLORS; ++x) - { - color = PALETTE_SRC[getpixel (BITMAP_SRC, x, y)]; - if (!exist_color (pal, color)) - pal[n++] = color; - } - NUMBER_OF_COLORS = n; -} - -/*-----------------------------------------------------------------*/ -void -create_new_palette (void) -{ - int i, x, y, index; - int nb_retries = 0; - RGB color; - - x = random () % BITMAP_SRC->w; - y = random () % BITMAP_SRC->h; - color = PALETTE_SRC[getpixel (BITMAP_SRC, x, y)]; - - for (i = 0; i < 256; ++i) - PALETTE_DST[i] = color; - - for (i = 1; i < NUMBER_OF_COLORS;) - { - x = random () % BITMAP_SRC->w; - y = random () % BITMAP_SRC->h; - index = getpixel (BITMAP_SRC, x, y); - color = PALETTE_SRC[index]; - if ((!exist_color (PALETTE_DST, color)) || - (nb_retries > LW_TEXTURE_RANDOM_MAX_RETRIES)) - { - PALETTE_DST[FIRST_COLOR + (i++)] = color; - nb_retries = 0; - } - else - { - nb_retries++; - } - } -} - -/*-----------------------------------------------------------------*/ -void -correct_palette (void) -{ - int i; - - for (i = 0; i < FIRST_COLOR; ++i) - { - PALETTE_DST[i].r = 0; - PALETTE_DST[i].g = 0; - PALETTE_DST[i].b = 0; - } - for (i = FIRST_COLOR + NUMBER_OF_COLORS; i < 256; ++i) - { - PALETTE_DST[i].r = 63; - PALETTE_DST[i].g = 63; - PALETTE_DST[i].b = 63; - } -} - -/*-----------------------------------------------------------------*/ -void -create_converted_bitmap (void) -{ - char corres[256]; - int i, x, y, index; - - for (i = 0; i < 256; ++i) - corres[i] = bestfit_color (PALETTE_DST, - PALETTE_SRC[i].r, - PALETTE_SRC[i].g, PALETTE_SRC[i].b); - BITMAP_DST = create_bitmap (BITMAP_SRC->w, BITMAP_SRC->h); - for (y = 0; y < BITMAP_SRC->h; ++y) - for (x = 0; x < BITMAP_SRC->w; ++x) - { - index = corres[getpixel (BITMAP_SRC, x, y)]; - index = (index < FIRST_COLOR || - index >= FIRST_COLOR + NUMBER_OF_COLORS) ? - FIRST_COLOR : index; - putpixel (BITMAP_DST, x, y, index); - } -} - -/*-----------------------------------------------------------------*/ -void -convert_bitmap () -{ - if (BITMAP_DST != NULL) - destroy_bitmap (BITMAP_DST); - - recalculate_number_of_colors (); - create_new_palette (); - create_converted_bitmap (); - correct_palette (); -} - -/*=================================================================*/ -/* fonctions main */ -/*=================================================================*/ - -/*-----------------------------------------------------------------*/ -int -main (int argc, char **argv) -{ - int i; - - ARGC = argc; - ARGV = argv; - -#ifdef ALLEGRO_UNIX - install_allegro (SYSTEM_NONE, &errno, atexit); -#else - allegro_init (); -#endif - - set_color_depth (8); - set_color_conversion (COLORCONV_REDUCE_TO_256); - - srandom (time (NULL)); - // srandom(1); - - if (read_command_line ()) - { - for (i = 0; i < NUMBER_OF_FILES; ++i) - { - if (load_file (FILENAMES[i])) - { - if (FLAG_BACKUP) - save_backup (FILENAMES[i]); - convert_bitmap (); - save_file (FILENAMES[i]); - } - } - } - else - { - if (FLAG_HELP) - display_long_help (); - else - display_short_help (); - } - allegro_exit (); - - return 0; - -} - -END_OF_MAIN (); diff --git a/utils/liquidwarmap.c b/utils/liquidwarmap.c deleted file mode 100644 index 288ee607..00000000 --- a/utils/liquidwarmap.c +++ /dev/null @@ -1,576 +0,0 @@ -/********************************************************************/ -/* */ -/* L I QQ U U I DD W W A RR 555 */ -/* L I Q Q U U I D D W W A A R R 5 */ -/* L I Q Q U U I D D W W W AAA RR 55 */ -/* L I Q Q U U I D D WW WW A A R R 5 */ -/* LLL I Q Q U I DD W W A A R R 55 */ -/* */ -/* b */ -/* bb y y */ -/* b b yyy */ -/* bb y */ -/* yy */ -/* */ -/* U U FFF O O TTT */ -/* U U F O O O O T */ -/* U U TIRET FF O O O O T */ -/* U U F O O O O T */ -/* U F O O T */ -/* */ -/********************************************************************/ - -/*****************************************************************************/ -/* Liquid War is a multiplayer wargame */ -/* Copyright (C) 1998-2025 Christian Mauduit */ -/* */ -/* 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 */ -/* */ -/* Liquid War homepage : https://ufoot.org/liquidwar/v5 */ -/* Contact author : ufoot@ufoot.org */ -/*****************************************************************************/ - -/********************************************************************/ -/* nom : liquidwarmap.c */ -/* contenu : tools to generate tabs */ -/* date de modif : 3 mai 98 */ -/********************************************************************/ - -/*=================================================================*/ -/* defines */ -/*=================================================================*/ - -#define ALLEGRO_USE_CONSOLE - -/*=================================================================*/ -/* includes */ -/*=================================================================*/ - -#include -#include -#include -#include -#include -#include -#include - -/*=================================================================*/ -/* contantes */ -/*=================================================================*/ - -#define LIGHT_OR_DARK_TRESHOLD 315 -#define CONSIDERED_AS_DARK 0 -#define CONSIDERED_AS_LIGHT 2 -#define PLAYABLE_AREA 1 -#define MINI_SIDE_SIZE 4 -#define MINI_PLAYABLE_AREA 1024 - -/*=================================================================*/ -/* variables globales */ -/*=================================================================*/ - -int ARGC; -char **ARGV; -int FLAG_HELP = 0; -int FLAG_SILENT = 0; -char *FILENAMES[65536]; -int NUMBER_OF_FILES = 0; -PALETTE PALETTE_SRC; -BITMAP *BITMAP_SRC = NULL; -BITMAP *BITMAP_DST = NULL; -signed char BUFFER[1048576]; -int DST_X, DST_Y, DST_W, DST_H, DST_SIZE, BG_SIZE; -char SYSTEM_NAME[16]; -char READABLE_NAME[32]; - -/*=================================================================*/ -/* fonctions */ -/*=================================================================*/ - -/*-----------------------------------------------------------------*/ -/* affichages d'aide */ -/*-----------------------------------------------------------------*/ - -/*-----------------------------------------------------------------*/ -void -display_common_help (void) -{ - printf ("liquidwarmap by U-Foot (ufoot@ufoot.org).\n"); - printf ("This program creates maps for Liquid War.\n"); - printf ("It is free software, protected by the GPL.\n"); - printf ("It uses Allegro by Shawn Hargreaves.\n"); - printf ("\n"); -} - -/*-----------------------------------------------------------------*/ -void -display_short_help (void) -{ - display_common_help (); - printf ("Type \"liquidwarmap -?\" for more help.\n"); -} - -/*-----------------------------------------------------------------*/ -void -display_long_help (void) -{ - display_common_help (); - printf ("The source must be a 256 color bitmap.\n"); - printf ("Walls must be in the same color - same index in fact.\n"); - printf ("The wall index color is given by the top left pixel,\n"); - printf ("and the map must be contained in a closed rectangle.\n"); - printf ("\n"); - printf ("Syntax:\n"); - printf ("liquidwarmap [options] filenames\n"); - printf ("\n"); - printf ("Options:\n"); - printf ("-? -h -H : displays this help.\n"); - printf ("-s -S : silent mode, nothing written to the console.\n"); - printf ("\n"); - printf ("Remark: the created map will have a .map extension.\n"); - printf ("Warning: the source file will be replaced by a smaller file.\n"); -} - -/*-----------------------------------------------------------------*/ -/* lecture des parametres de la ligne de commande */ -/*-----------------------------------------------------------------*/ - -/*-----------------------------------------------------------------*/ -int -acknowledge_flag (char *str) -{ - int found = 0; - - if (str[0] == '-' || str[0] == '/') - { - found = 1; - switch (str[1]) - { - case '?': - case 'h': - case 'H': - FLAG_HELP = 1; - break; - case 's': - case 'S': - FLAG_SILENT = 1; - break; - default: - found = 0; - } - } - return found; -} - -/*-----------------------------------------------------------------*/ -int -read_command_line (void) -{ - int i, j = 0, success = 1; - - for (i = 1; i < ARGC; ++i) - { - if ((!acknowledge_flag (ARGV[i]))) - { - FILENAMES[j] = ARGV[i]; - j++; - } - } - NUMBER_OF_FILES = j; - if (NUMBER_OF_FILES <= 0) - { - success = 0; - if (!FLAG_HELP) - printf ("ERROR! Two few arguments.\n"); - } - return success; -} - -/*-----------------------------------------------------------------*/ -/* acces disque */ -/*-----------------------------------------------------------------*/ - -/*-----------------------------------------------------------------*/ -int -load_file (char *filename) -{ - int success; - - if (!FLAG_SILENT) - printf ("Loading '%s'.\n", filename); - - if (BITMAP_SRC != NULL) - destroy_bitmap (BITMAP_SRC); - BITMAP_SRC = load_bitmap (filename, PALETTE_SRC); - success = BITMAP_SRC != NULL; - if (!success) - printf ("ERROR! Unable to read '%s'.\n", filename); - return success; -} - -/*-----------------------------------------------------------------*/ -/* lecture des parametres du tableau */ -/*-----------------------------------------------------------------*/ - -/*------------------------------------------------------------------*/ -static void -sort_light_and_dark (BITMAP * bmp, PALETTE pal) -{ - char table[256]; - int i, x, y; - - for (i = 0; i < 256; ++i) - { - if (6 * pal[i].r + 3 * pal[i].g + pal[i].b > LIGHT_OR_DARK_TRESHOLD) - table[i] = CONSIDERED_AS_LIGHT; - else - table[i] = CONSIDERED_AS_DARK; - } - - for (y = 0; y < bmp->h; ++y) - for (x = 0; x < bmp->w; ++x) - putpixel (bmp, x, y, table[getpixel (bmp, x, y)]); -} - -/*-----------------------------------------------------------------*/ -void -get_range (void) -{ - /* - useless and buggy code from an old time, when maps where - systematically drawn on 320x200 bitmaps and "getting the - useable part had a sense". Not any more. Now it only - wrecks some maps. Definitely useless. - - int min_x = BITMAP_SRC->w; - int min_y = BITMAP_SRC->h; - int max_x = -1; - int max_y = -1; - int x, y; - - for (y = 0; y < BITMAP_SRC->h; ++y) - for (x = 0; x < BITMAP_SRC->w; ++x) - if (!getpixel (BITMAP_SRC, x, y)) - { - if (min_x > x) - min_x = x; - if (min_y > y) - min_y = y; - if (max_x < x) - max_x = x; - if (max_y < y) - max_y = y; - } - - DST_X = min_x; - DST_Y = min_y; - DST_W = max_x - min_x + 1; - DST_H = max_y - min_y + 1; - */ - - DST_X = 0; - DST_Y = 0; - DST_W = BITMAP_SRC->w; - DST_H = BITMAP_SRC->h; - - if (DST_W < 1 || DST_H < 1) - { - printf ("ERROR! Map is too small.\n"); - DST_W = DST_H = 1; - } - if (BITMAP_DST != NULL) - destroy_bitmap (BITMAP_DST); - BITMAP_DST = create_bitmap (DST_W, DST_H); - blit (BITMAP_SRC, BITMAP_DST, DST_X, DST_Y, 0, 0, DST_W, DST_H); -} - -/*-----------------------------------------------------------------*/ -/* conversion dans le buffer */ -/*-----------------------------------------------------------------*/ - -/*-----------------------------------------------------------------*/ -void -convert_to_buffer (void) -{ - int pos_src, pos_dst, l, wh; - char *data; - int wall_color; - - wh = BITMAP_DST->h * BITMAP_DST->w; - data = BITMAP_DST->dat; - pos_src = pos_dst = 0; - BG_SIZE = 0; - - if (wh > 0) - { - wall_color = CONSIDERED_AS_DARK; - while (pos_src < wh) - { - l = 0; - if (data[pos_src] == wall_color) - { - while (pos_src < wh && (data[pos_src] == wall_color) && l < 127) - { - l++; - pos_src++; - } - BUFFER[pos_dst++] = l; - } - else - { - while (pos_src < wh && data[pos_src] != wall_color && l < 127) - { - l++; - pos_src++; - } - BUFFER[pos_dst++] = -l; - BG_SIZE += l; - } - } - } - BUFFER[pos_dst++] = 0; - - DST_SIZE = pos_dst; -} - -/*-----------------------------------------------------------------*/ -void -change_ext_to_txt (char *str) -{ - char *ext; - - ext = strchr (str, '.'); - ext[1] = 't'; - ext[2] = 'x'; - ext[3] = 't'; -} - -/*-----------------------------------------------------------------*/ -void -update_system_name (char *str) -{ - char *search; - - memset (SYSTEM_NAME, 0, sizeof (SYSTEM_NAME)); - - /* - * No extension we just use the file name - */ - strncpy (SYSTEM_NAME, str, sizeof (SYSTEM_NAME)); - search = strchr (SYSTEM_NAME, '.'); - if (search) - { - (*search) = '\0'; - } -} - -/*-----------------------------------------------------------------*/ -void -update_readable_name (char *str) -{ - FILE *f; - char *search; - - memset (READABLE_NAME, 0, sizeof (READABLE_NAME)); - - f = fopen (str, "r"); - if (f != NULL) - { - /* - * If there's a corresponding .txt file, we open it and interpret - * it as the name of the map - */ - fread (READABLE_NAME, sizeof (READABLE_NAME), 1, f); - fclose (f); - /* - * Now we get rid of all the lines following the first one - */ - search = strchr (READABLE_NAME, 10); - if (search) - { - (*search) = 0; - } - search = strchr (READABLE_NAME, 13); - if (search) - { - (*search) = 0; - } - } - else - { - /* - * No .txt file we just use the file name - */ - strncpy (READABLE_NAME, str, sizeof (READABLE_NAME)); - search = strchr (READABLE_NAME, '.'); - if (search) - { - (*search) = '\0'; - } - } -} - -/*-----------------------------------------------------------------*/ -/* on ecrit sur le disque */ -/*-----------------------------------------------------------------*/ - -/*-----------------------------------------------------------------*/ -void -change_ext_to_map (char *str) -{ - char *ext; - - ext = strchr (str, '.'); - ext[1] = 'm'; - ext[2] = 'a'; - ext[3] = 'p'; -} - -/*-----------------------------------------------------------------*/ -void -write_to_disk (char *str) -{ - FILE *f; - short w, h; - int size; - unsigned char header[8]; - - if (!FLAG_SILENT) - printf ("Writing %s to disk.\n", str); - delete_file (str); - f = fopen (str, "w"); - if (f != NULL) - { - w = DST_W; - h = DST_H; - size = DST_SIZE; - - /* - * Previous versions of LW used to store the size of - * the background here, to sort map afterwards. Now - * we store the size of the map. - */ - - /* - * Here's an ugly serialization of ints and shorts. - * Usefull to make the game work on Mac OS X and possible - * any platform that does not have PC-like endianess - */ - - header[0] = 0xFF & size; - header[1] = 0xFF & size >> 8; - header[2] = 0xFF & size >> 16; - header[3] = size >> 24; - header[4] = 0xFF & w; - header[5] = w >> 8; - header[6] = 0xFF & h; - header[7] = h >> 8; - - /* - Uncomment this to invert endianess of map header. - Used only for testing, do not uncomment it even - when compiling on Mac, it would make the game - unusable in network mode... - */ - /* - header[3] = 0xFF & size; - header[2] = 0xFF & size>>8; - header[1] = 0xFF & size>>16; - header[0] = size>>24; - header[5] = 0xFF & w; - header[4] = w>>8; - header[7] = 0xFF & h; - header[6] = h>>8; - */ - - fwrite (&(header[0]), 8, 1, f); - fwrite (SYSTEM_NAME, sizeof (SYSTEM_NAME), 1, f); - fwrite (READABLE_NAME, sizeof (READABLE_NAME), 1, f); - fwrite (BUFFER, size, 1, f); - fclose (f); - } - else - { - printf ("Unable to write %s.\n", str); - } -} - -/*-----------------------------------------------------------------*/ -void -write_with_new_size (char *str) -{ - if (!FLAG_SILENT) - printf ("Writing %s to disk.\n", str); - delete_file (str); - - save_bitmap (str, BITMAP_DST, PALETTE_SRC); -} - -/*=================================================================*/ -/* fonctions main */ -/*=================================================================*/ - -/*-----------------------------------------------------------------*/ -int -main (int argc, char **argv) -{ - int i; - - ARGC = argc; - ARGV = argv; - -#ifdef ALLEGRO_UNIX - install_allegro (SYSTEM_NONE, &errno, atexit); -#else - allegro_init (); -#endif - - set_color_depth (8); - set_color_conversion (COLORCONV_REDUCE_TO_256); - - if (read_command_line ()) - { - for (i = 0; i < NUMBER_OF_FILES; ++i) - { - if (load_file (FILENAMES[i])) - { - sort_light_and_dark (BITMAP_SRC, PALETTE_SRC); - get_range (); - if (BITMAP_SRC->w != BITMAP_DST->w - || BITMAP_SRC->h != BITMAP_DST->h) - write_with_new_size (FILENAMES[i]); - convert_to_buffer (); - change_ext_to_txt (FILENAMES[i]); - update_system_name (FILENAMES[i]); - update_readable_name (FILENAMES[i]); - change_ext_to_map (FILENAMES[i]); - write_to_disk (FILENAMES[i]); - } - } - } - else - { - if (FLAG_HELP) - display_long_help (); - else - display_short_help (); - } - allegro_exit (); - - return 0; - -} - -END_OF_MAIN () diff --git a/utils/liquidwartex.c b/utils/liquidwartex.c deleted file mode 100644 index e5bf9fe6..00000000 --- a/utils/liquidwartex.c +++ /dev/null @@ -1,447 +0,0 @@ -/********************************************************************/ -/* */ -/* L I QQ U U I DD W W A RR 555 */ -/* L I Q Q U U I D D W W A A R R 5 */ -/* L I Q Q U U I D D W W W AAA RR 55 */ -/* L I Q Q U U I D D WW WW A A R R 5 */ -/* LLL I Q Q U I DD W W A A R R 55 */ -/* */ -/* b */ -/* bb y y */ -/* b b yyy */ -/* bb y */ -/* yy */ -/* */ -/* U U FFF O O TTT */ -/* U U F O O O O T */ -/* U U TIRET FF O O O O T */ -/* U U F O O O O T */ -/* U F O O T */ -/* */ -/********************************************************************/ - -/*****************************************************************************/ -/* Liquid War is a multiplayer wargame */ -/* Copyright (C) 1998-2025 Christian Mauduit */ -/* */ -/* 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 */ -/* */ -/* Liquid War homepage : https://ufoot.org/liquidwar/v5 */ -/* Contact author : ufoot@ufoot.org */ -/*****************************************************************************/ - -/********************************************************************/ -/* nom : liquidwartex.c */ -/* contenu : tool to generate textures */ -/* date de modif : March 2000 */ -/********************************************************************/ - -/*=================================================================*/ -/* defines */ -/*=================================================================*/ - -#define ALLEGRO_USE_CONSOLE - -/*=================================================================*/ -/* includes */ -/*=================================================================*/ - -#include -#include -#include -#include -#include -#include -#include - -/*=================================================================*/ -/* variables globales */ -/*=================================================================*/ - -int ARGC; -char **ARGV; -int FLAG_HELP = 0; -int FLAG_SILENT = 0; -char *FILENAMES[65536]; -int NUMBER_OF_FILES = 0; -PALETTE PALETTE_SRC; -BITMAP *BITMAP_SRC = NULL; -int DST_X, DST_Y, DST_W, DST_H, DST_SIZE; -int FIRST_COLOR = 32; -int COLOR_NUMBER = 32; -char BUFFER[1048576]; -char SYSTEM_NAME[16]; - - -/*=================================================================*/ -/* fonctions */ -/*=================================================================*/ - -/*-----------------------------------------------------------------*/ -/* affichages d'aide */ -/*-----------------------------------------------------------------*/ - -/*-----------------------------------------------------------------*/ -void -display_common_help (void) -{ - printf ("liquidwartex by U-Foot (ufoot@ufoot.org).\n"); - printf ("This program creates textures for Liquid War.\n"); - printf ("It is free software, protected by the GPL.\n"); - printf ("It uses Allegro by Shawn Hargreaves.\n"); - printf ("\n"); -} - -/*-----------------------------------------------------------------*/ -void -display_short_help (void) -{ - display_common_help (); - printf ("Type \"liquidwartex -?\" for more help.\n"); -} - -/*-----------------------------------------------------------------*/ -void -display_long_help (void) -{ - display_common_help (); - printf - ("The source must be a 256 color bitmap using color from first_color to first_color+number_of_colors-1.\n"); - printf ("\n"); - printf ("Syntax:\n"); - printf ("liquidwartex [options] first_color number_of_colors filenames\n"); - printf ("\n"); - printf ("Options:\n"); - printf ("-? -h -H : displays this help.\n"); - printf ("-s -S : silent mode, nothing written to the console.\n"); - printf ("\n"); - printf ("Remark: the created texture will have a .tex extension.\n"); -} - -/*-----------------------------------------------------------------*/ -/* lecture des parametres de la ligne de commande */ -/*-----------------------------------------------------------------*/ - -/*-----------------------------------------------------------------*/ -int -acknowledge_flag (char *str) -{ - int found = 0; - - if (str[0] == '-' || str[0] == '/') - { - found = 1; - switch (str[1]) - { - case '?': - case 'h': - case 'H': - FLAG_HELP = 1; - break; - case 's': - case 'S': - FLAG_SILENT = 1; - break; - default: - found = 0; - } - } - return found; -} - -/*-----------------------------------------------------------------*/ -int -read_command_line (void) -{ - int i, j = 0, success = 1; - - if (ARGC <= 2) - { - success = 0; - if (!FLAG_HELP) - printf ("ERROR! Too few arguments.\n"); - } - else - { - for (i = 1; i < ARGC; ++i) - { - if ((!acknowledge_flag (ARGV[i]))) - { - if (j == 0) - FIRST_COLOR = atoi (ARGV[i]); - if (j == 1) - COLOR_NUMBER = atoi (ARGV[i]); - if (j >= 2) - FILENAMES[j - 2] = ARGV[i]; - j++; - } - } - if (COLOR_NUMBER < 8 || COLOR_NUMBER > 32) - { - /* - * COLOR_NUMBER must be <=32 for weird implementation - * reasons. There's no easy way to change this easily. - */ - success = 0; - if (!FLAG_HELP) - printf ("ERROR! Color number must be between 8 and 32"); - } - else - { - NUMBER_OF_FILES = j - 2; - if (NUMBER_OF_FILES <= 0) - { - success = 0; - if (!FLAG_HELP) - printf ("ERROR! Too few arguments.\n"); - } - } - } - return success; -} - -/*-----------------------------------------------------------------*/ -/* acces disque */ -/*-----------------------------------------------------------------*/ - -/*-----------------------------------------------------------------*/ -int -load_file (char *filename) -{ - int success; - - if (!FLAG_SILENT) - printf ("Loading '%s'.\n", filename); - - if (BITMAP_SRC != NULL) - destroy_bitmap (BITMAP_SRC); - BITMAP_SRC = load_bitmap (filename, PALETTE_SRC); - success = BITMAP_SRC != NULL; - if (!success) - printf ("ERROR! Unable to read '%s'.\n", filename); - return success; -} - -/*-----------------------------------------------------------------*/ -/* lecture des parametres du tableau */ -/*-----------------------------------------------------------------*/ - -/*-----------------------------------------------------------------*/ -void -get_range (void) -{ - int min_x = BITMAP_SRC->w; - int min_y = BITMAP_SRC->h; - int max_x = -1; - int max_y = -1; - int x, y; - - for (y = 0; y < BITMAP_SRC->h; ++y) - for (x = 0; x < BITMAP_SRC->w; ++x) - if (getpixel (BITMAP_SRC, x, y) >= FIRST_COLOR || - getpixel (BITMAP_SRC, x, y) < FIRST_COLOR + COLOR_NUMBER) - { - if (min_x > x) - min_x = x; - if (min_y > y) - min_y = y; - if (max_x < x) - max_x = x; - if (max_y < y) - max_y = y; - } - DST_X = min_x; - DST_Y = min_y; - DST_W = max_x - min_x + 1; - DST_H = max_y - min_y + 1; - - if (DST_W < 1 || DST_H < 1) - { - printf ("ERROR! Texture is too small.\n"); - DST_W = DST_H = 1; - } - DST_SIZE = 3 * COLOR_NUMBER + ((DST_W * DST_H + 7) / 8) * 5; -} - -/*-----------------------------------------------------------------*/ -void -update_system_name (char *str) -{ - char *search; - - memset (SYSTEM_NAME, 0, sizeof (SYSTEM_NAME)); - - /* - * No extension we just use the file name - */ - strncpy (SYSTEM_NAME, str, sizeof (SYSTEM_NAME)); - search = strchr (SYSTEM_NAME, '.'); - if (search) - { - (*search) = '\0'; - } -} - -/*-----------------------------------------------------------------*/ -/* conversion dans le buffer */ -/*-----------------------------------------------------------------*/ - -/*-----------------------------------------------------------------*/ -void -convert_to_buffer (void) -{ - int pos = 0, pos8 = 0, x, y, i; - char octet[5], toadd; - int coul; - - for (i = 0; i < COLOR_NUMBER; ++i) - { - BUFFER[pos++] = PALETTE_SRC[FIRST_COLOR + i].r; - BUFFER[pos++] = PALETTE_SRC[FIRST_COLOR + i].g; - BUFFER[pos++] = PALETTE_SRC[FIRST_COLOR + i].b; - } - - for (i = 0; i < 5; ++i) - octet[i] = 0; - - for (y = 0; y < DST_H; ++y) - for (x = 0; x < DST_W; ++x) - { - coul = getpixel (BITMAP_SRC, DST_X + x, DST_Y + y) - FIRST_COLOR; - toadd = 1 << pos8; - octet[0] |= (coul & 1) ? toadd : 0; - octet[1] |= (coul & 2) ? toadd : 0; - octet[2] |= (coul & 4) ? toadd : 0; - octet[3] |= (coul & 8) ? toadd : 0; - octet[4] |= (coul & 16) ? toadd : 0; - - if (pos8 == 7 || (y == DST_H - 1 && x == DST_W - 1)) - { - for (i = 0; i < 5; ++i) - { - BUFFER[pos++] = octet[i]; - octet[i] = 0; - } - pos8 = 0; - } - else - pos8++; - } -} - -/*-----------------------------------------------------------------*/ -/* on ecrit sur le disque */ -/*-----------------------------------------------------------------*/ - -/*-----------------------------------------------------------------*/ -void -change_ext (char *str) -{ - char *ext; - - ext = strchr (str, '.'); - ext[1] = 't'; - ext[2] = 'e'; - ext[3] = 'x'; -} - -/*-----------------------------------------------------------------*/ -void -write_to_disk (char *str) -{ - FILE *f; - short w, h; - char header[4]; - - if (!FLAG_SILENT) - printf ("Writing %s to disk.\n", str); - delete_file (str); - f = fopen (str, "w"); - if (f != NULL) - { - w = DST_W; - h = DST_H; - - /* - * This is supposed to match the endianess used in - * the serial.h/serial.c files of the core source. - */ - header[0] = 0xFF & w; - header[1] = w >> 8; - header[2] = 0xFF & h; - header[3] = h >> 8; - - fwrite (header, 4, 1, f); - - fwrite (SYSTEM_NAME, sizeof (SYSTEM_NAME), 1, f); - fwrite (BUFFER, DST_SIZE, 1, f); - fclose (f); - } - else - { - printf ("Unable to write %s.\n", str); - } -} - -/*=================================================================*/ -/* fonctions main */ -/*=================================================================*/ - -/*-----------------------------------------------------------------*/ -int -main (int argc, char **argv) -{ - int i; - - ARGC = argc; - ARGV = argv; - -#ifdef ALLEGRO_UNIX - install_allegro (SYSTEM_NONE, &errno, atexit); -#else - allegro_init (); -#endif - - set_color_depth (8); - set_color_conversion (COLORCONV_REDUCE_TO_256); - - if (read_command_line ()) - { - for (i = 0; i < NUMBER_OF_FILES; ++i) - { - if (load_file (FILENAMES[i])) - { - get_range (); - convert_to_buffer (); - update_system_name (FILENAMES[i]); - change_ext (FILENAMES[i]); - write_to_disk (FILENAMES[i]); - } - } - } - else - { - if (FLAG_HELP) - display_long_help (); - else - display_short_help (); - } - allegro_exit (); - - return 0; - -} - -END_OF_MAIN () diff --git a/utils/lwmapgen/main.c b/utils/lwmapgen/main.c index f24a3de2..a5b8361a 100644 --- a/utils/lwmapgen/main.c +++ b/utils/lwmapgen/main.c @@ -23,27 +23,6 @@ void do_args (int argc, char **argv); void print_help (); void print_version (); -#ifdef DOS -/* - * These macros reduce the size of the DOS executable - */ -BEGIN_GFX_DRIVER_LIST - END_GFX_DRIVER_LIST - BEGIN_COLOR_DEPTH_LIST - COLOR_DEPTH_8 - END_COLOR_DEPTH_LIST - BEGIN_DIGI_DRIVER_LIST - END_DIGI_DRIVER_LIST - BEGIN_MIDI_DRIVER_LIST - END_MIDI_DRIVER_LIST BEGIN_JOYSTICK_DRIVER_LIST END_JOYSTICK_DRIVER_LIST -#endif -#ifdef WIN32 -/* - * Under Win32 we want a console executable so we don't use - * the "END_OF_MAIN" stuff, and this implies to undef "main". - */ -#undef main -#endif int main (int argc, char **argv) { @@ -51,13 +30,13 @@ main (int argc, char **argv) int i; /* init allegro and init palette */ - install_allegro (SYSTEM_NONE, &errno, atexit); + allegro_init (); set_color_depth (8); set_color_conversion (COLORCONV_REDUCE_TO_256); for (i = 0; i < 256; i++) { - /* divided by 4 because the colour value ranges from 0-63 */ - pal[i].r = pal[i].g = pal[i].b = i / 4; + /* Use 8-bit color values (0-255) instead of VGA (0-63) */ + pal[i].r = pal[i].g = pal[i].b = i; } srand (time (NULL)); @@ -75,10 +54,6 @@ main (int argc, char **argv) return EXIT_SUCCESS; } -#ifndef WIN32 -END_OF_MAIN (); -#endif - /*****************************************************************************/ void diff --git a/utils/lwmapgen/map.h b/utils/lwmapgen/map.h index 45798528..7bae4d1b 100644 --- a/utils/lwmapgen/map.h +++ b/utils/lwmapgen/map.h @@ -9,7 +9,7 @@ #define LWMAPGEN_MAP_H -#include +#include "../../src/backport.h" #include "func.h" #include "misc.h" From 5ae50fec637f15753ba44b04781cf5feaf0d4cbd Mon Sep 17 00:00:00 2001 From: "Christian Mauduit (ufoot)" Date: Mon, 10 Nov 2025 09:02:06 +0100 Subject: [PATCH 2/6] [build] fix merge issues --- .travis.yml | 43 --- Makefile.in | 81 +----- bootstrap | 22 -- doc/makedoc.py | 684 +++++++++++++++--------------------------------- src/Makefile.in | 2 + src/alleg2.c | 1 - src/game.c | 1 - src/langpl.c | 1 - src/thrdunix.c | 23 +- 9 files changed, 218 insertions(+), 640 deletions(-) delete mode 100644 .travis.yml delete mode 100755 bootstrap diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 7e3e79a4..00000000 --- a/.travis.yml +++ /dev/null @@ -1,43 +0,0 @@ -# Liquid War is a multiplayer wargame -# Copyright (C) 1998-2025 Christian Mauduit -# -# 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 -# -# Liquid War homepage : https://ufoot.org/liquidwar/v5 -# Contact author : ufoot@ufoot.org - -language: c - -addons: - apt: - packages: - - liballegro5-dev - - liballegro-audio5-dev - - liballegro-image5-dev - - libxml2-utils - -install: autoconf - -script: ./configure && make && make check && make package_source - -deploy: - provider: releases - api_key: $GITHUB_OAUTH_TOKEN - file_glob: true - file: liquidwar-*.tar.gz - skip_cleanup: true - overwrite: true - on: - tags: true diff --git a/Makefile.in b/Makefile.in index 1763551d..67514978 100644 --- a/Makefile.in +++ b/Makefile.in @@ -249,8 +249,8 @@ packageclean: clean world_clean @find . -name "*.tar.gz" -o -name "*.tgz" -o -name "*.zip" -o -name "*.rpm" -o -name "*.deb" -o -name "*.tgz" | xargs rm -f @find . -name ".xvpics" | xargs rm -rf @find . -name "lwmap.bmp" | xargs rm -f - @rm -rf LW5 lwdos*exe lwwin*exe _tmpfile.arg *.log vc60.* *.idb *.pch - @rm -rf data/lwwin* data/lwdos* + @rm -rf LW5 lwwin*exe _tmpfile.arg *.log vc60.* *.idb *.pch + @rm -rf data/lwwin* @rm -rf starter @rm -rf .github @for d in $(MAKE_DIRS); do $(GMAKE) -C $$d distclean; done @@ -274,7 +274,6 @@ dep: # - a source tarball # - a static binary stored in a .tar.gz # - a win32 binary -# - a dos binary # - a source rpm # - a binary rpm # @@ -306,49 +305,6 @@ $(PACKAGE_SOURCE_TARGZ): @echo "Deleting temporary directory." @rm -rf $(PACKAGE_TMP) -<<<<<<< HEAD -package_dos: $(PACKAGE_DOS_ZIP) - -$(PACKAGE_DOS_ZIP): $(PACKAGE_DOS_EXE) $(PACKAGE_DOS_CWSDPMI) - @echo "Building data." - @$(GMAKE) -C data - @echo "Building doc." - @$(GMAKE) -C doc - @echo "Creating temporary directory." - @rm -rf $(PACKAGE_TMP) - @install -d $(PACKAGE_TMP)/$(PACKAGE_DOS_DIR) - @echo "Copying files." - @cp $(PACKAGE_DOS_EXE) $(PACKAGE_TMP)/$(PACKAGE_DOS_DIR) - @cp $(PACKAGE_DOS_CWSDPMI) $(PACKAGE_TMP)/$(PACKAGE_DOS_DIR) - @cp README.md $(PACKAGE_TMP)/$(PACKAGE_DOS_DIR)/readme.txt - @cp README.fr $(PACKAGE_TMP)/$(PACKAGE_DOS_DIR)/readmefr.txt - @cp README.de $(PACKAGE_TMP)/$(PACKAGE_DOS_DIR)/readmede.txt - @cp README.dk $(PACKAGE_TMP)/$(PACKAGE_DOS_DIR)/readmedk.txt - @cp README.pl $(PACKAGE_TMP)/$(PACKAGE_DOS_DIR)/readmepl.txt - @cp COPYING $(PACKAGE_TMP)/$(PACKAGE_DOS_DIR)/license.txt - @cp ChangeLog $(PACKAGE_TMP)/$(PACKAGE_DOS_DIR)/changes.txt - @cp misc/liquidwar.ico $(PACKAGE_TMP)/$(PACKAGE_DOS_DIR)/lw.ico - @install -d $(PACKAGE_TMP)/$(PACKAGE_DOS_DIR)/data - @cp data/liquidwar.dat $(PACKAGE_TMP)/$(PACKAGE_DOS_DIR)/data/lw.dat - @install -d $(PACKAGE_TMP)/$(PACKAGE_DOS_DIR)/custom - @cp -r custom/map $(PACKAGE_TMP)/$(PACKAGE_DOS_DIR)/custom - @cp -r custom/texture $(PACKAGE_TMP)/$(PACKAGE_DOS_DIR)/custom - @cp -r custom/music $(PACKAGE_TMP)/$(PACKAGE_DOS_DIR)/custom - @install -d $(PACKAGE_TMP)/$(PACKAGE_DOS_DIR)/doc - @cp -r doc/txt $(PACKAGE_TMP)/$(PACKAGE_DOS_DIR)/doc - @echo "Cleaning up." - @touch $(PACKAGE_TMP)/$(PACKAGE_DOS_DIR)/.cvsignore - @find $(PACKAGE_TMP)/$(PACKAGE_DOS_DIR) -name .cvsignore -o -name CVS -o -name .arch-ids -o -name "{arch}" -o -name DUMMY -o -name "*.inc" -o -name "*.in" | xargs rm -rf - @cp fix.sh $(PACKAGE_TMP) - @cd $(PACKAGE_TMP)/$(PACKAGE_DOS_DIR) && $(PACKAGE_TMP)/fix.sh dos - @echo "Zipping." - @cd $(PACKAGE_TMP) && zip -r -9 $(PACKAGE_DOS_ZIP) $(PACKAGE_DOS_DIR) - @mv $(PACKAGE_TMP)/$(PACKAGE_DOS_ZIP) . - @echo "Deleting temporary directory." - @rm -rf $(PACKAGE_TMP) -======= ->>>>>>> 0836880 ([dos] removed support) - package_win32: $(PACKAGE_WIN32_ZIP) $(PACKAGE_WIN32_ZIP): $(PACKAGE_WIN32_EXE) $(PACKAGE_WIN32_ALLEGDLL) @@ -520,39 +476,6 @@ $(PACKAGE_MACOSX_DMG): $(PACKAGE_MACOSX_TGZ) @echo "Deleting temporary directory." @rm -rf $(PACKAGE_TMP) -<<<<<<< HEAD -package_gp2x: $(PACKAGE_GP2X_ZIP) - -$(PACKAGE_GP2X_ZIP): $(PACKAGE_SOURCE_TARGZ) - @echo "Compiling dat file." - @$(GMAKE) -C data - @echo "Creating temporary directory." - @rm -rf $(PACKAGE_TMP) - @install -d $(PACKAGE_TMP) - @echo "Preparing source." - @cp $(PACKAGE_SOURCE_TARGZ) $(PACKAGE_TMP) - @cd $(PACKAGE_TMP) && tar xzf $(PACKAGE_SOURCE_TARGZ) - @echo "Compiling binary." - @cd $(PACKAGE_TMP)/$(PACKAGE_SOURCE_DIR) && sh -c ". /opt/open2x/bin/env-apps.sh && ./configure --prefix=/opt --build=x86_64-pc-linux-gnu --host=arm-open2x-linux && make -C src" - @install -d $(PACKAGE_TMP)/$(PACKAGE_GP2X_DIR) - @cp $(PACKAGE_TMP)/$(PACKAGE_SOURCE_DIR)/src/liquidwar* $(PACKAGE_TMP)/$(PACKAGE_GP2X_DIR)/ - @cp data/liquidwar.dat $(PACKAGE_TMP)/$(PACKAGE_GP2X_DIR)/ - @cp misc/liquidwar.gpe $(PACKAGE_TMP)/$(PACKAGE_GP2X_DIR)/ - @cp COPYING $(PACKAGE_TMP)/$(PACKAGE_GP2X_DIR)/license.txt - @cp ChangeLog $(PACKAGE_TMP)/$(PACKAGE_GP2X_DIR)/changes.txt - @cp README.md $(PACKAGE_TMP)/$(PACKAGE_GP2X_DIR)/readme.txt - @cp README.fr $(PACKAGE_TMP)/$(PACKAGE_GP2X_DIR)/readmefr.txt - @cp README.de $(PACKAGE_TMP)/$(PACKAGE_GP2X_DIR)/readmede.txt - @cp README.dk $(PACKAGE_TMP)/$(PACKAGE_GP2X_DIR)/readmedk.txt - @cp README.pl $(PACKAGE_TMP)/$(PACKAGE_GP2X_DIR)/readmepl.txt - @cp -r doc/html $(PACKAGE_TMP)/$(PACKAGE_GP2X_DIR)/doc - @find $(PACKAGE_TMP)/$(PACKAGE_GP2X_DIR) -name .cvsignore -o -name CVS -o -name .arch-ids -o -name "{arch}" -o -name DUMMY -o -name "*.inc" -o -name "*.in" | xargs rm -rf - @cd $(PACKAGE_TMP) && zip -r $(PACKAGE_GP2X_ZIP) $(PACKAGE_GP2X_DIR) - @cp $(PACKAGE_TMP)/$(PACKAGE_GP2X_ZIP) . - @rm -rf $(PACKAGE_TMP) - -======= ->>>>>>> fc68ac4 ([backport] removed GP2X support) $(PACKAGE_DOCKER_SOURCE_TARGZ): $(PACKAGE_SOURCE_TARGZ) @cp $< $@ diff --git a/bootstrap b/bootstrap deleted file mode 100755 index 1312d437..00000000 --- a/bootstrap +++ /dev/null @@ -1,22 +0,0 @@ -# Liquid War is a multiplayer wargame -# Copyright (C) 1998-2025 Christian Mauduit -# -# 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 -# -# Liquid War homepage : https://ufoot.org/liquidwar/v5 -# Contact author : ufoot@ufoot.org - -autoreconf - diff --git a/doc/makedoc.py b/doc/makedoc.py index 8f83d8c4..6326b54c 100644 --- a/doc/makedoc.py +++ b/doc/makedoc.py @@ -13,76 +13,72 @@ import string import re - def remove_duplicate_blanks(text): - result = text + result=text - result = result.replace("\t", " ") - result = result.replace("\n", " ") + result=result.replace("\t"," ") + result=result.replace("\n"," ") - if result != "": - temp = "" - while temp != result: - temp = result - result = result.replace(" ", " ") + if (result!=""): + temp="" + while temp!=result: + temp=result + result=result.replace(" "," ") return result - -def format_text(text, left_col, right_col): - temp = remove_duplicate_blanks(text) - - result = "" - p = 0 - l = len(temp) - while p < l: - cur_line = temp[p : p + right_col - left_col] - dp = len(cur_line) - if dp == right_col - left_col: - i = dp - 1 - while i > 0: - if cur_line[i] == " ": +def format_text(text,left_col,right_col): + temp=remove_duplicate_blanks(text) + + result="" + p=0 + l=len(temp) + while p0: + if cur_line[i]==' ': break - i = i - 1 - if i > 0: - cur_line = cur_line[0:i] - dp = i + 1 - if 0 == 1: # the following code justifies the text, it is disabled - j = i - 1 - while len(cur_line) < right_col - left_col - 1: - if cur_line[j] == " ": - while j > 0 and cur_line[j - 1] == " ": - j = j - 1 - cur_line = cur_line[:j] + " " + cur_line[j:] - j = j - 1 - if j < 0: - j = len(cur_line) - 1 - - result = result + " " * left_col + cur_line + "\n" - p = p + dp + i=i-1 + if i>0: + cur_line=cur_line[0:i] + dp=i+1 + if 0==1: #the following code justifies the text, it is disabled + j=i-1 + while len(cur_line)0 and cur_line[j-1]==' ': + j=j-1 + cur_line=cur_line[:j]+' '+cur_line[j:] + j=j-1 + if j<0: + j=len(cur_line)-1 + + result=result+" "*left_col+cur_line+"\n" + p=p+dp return result - def format_email_and_url(text): - result = text + result=text - email = re.compile(r'"([\w\-\.]+@[\w\-\.]+)"') - result = email.sub(r"\1", result) + email=re.compile(r'"([\w\-\.]+@[\w\-\.]+)"') + result=email.sub(r'\1',result); - url = re.compile(r'"http://([\w\-\.\~/]+)"', re.I) - result = url.sub(r"http://\1", result) + url=re.compile(r'"http://([\w\-\.\~/]+)"', re.I) + result=url.sub(r'http://\1',result); return result - def format_html(text): - result = text + result=text - result = result.replace("<", "ufoot_html_lt") - result = result.replace(">", "ufoot_html_gt") - result = result.replace("&", "&") - result = result.replace("ufoot_html_lt", "<") - result = result.replace("ufoot_html_gt", ">") + result=result.replace("<","ufoot_html_lt") + result=result.replace(">","ufoot_html_gt") + result=result.replace("&","&") + result=result.replace("ufoot_html_lt","<") + result=result.replace("ufoot_html_gt",">") # Uncomment this to make mailing list adresses look like "xxx at xxx" # instead of "xxx@xxx". This can prevent spammers from harvesting @@ -90,28 +86,17 @@ def format_html(text): # fakeemail=re.compile('"([\w\.]+\-user)@([\w\-\.]+)"') # result=fakeemail.sub(r'\1 at \2 (replace "at" by "@")',result); - email = re.compile(r'"([\w\-\.]+@[\w\-\.]+)"') - result = email.sub(r'\1', result) - - url = re.compile(r'"http://([\w\-\.\~/]+)"', re.I) - result = url.sub(r'\1', result) + email=re.compile(r'"([\w\-\.]+@[\w\-\.]+)"') + result=email.sub(r'\1',result); + url=re.compile(r'"http://([\w\-\.\~/]+)"', re.I) + result=url.sub(r'\1',result); + return result - def format_tex(text): - result = text - - result = result.replace("\\", "$\\backslash$") - result = result.replace("_", "\\_") - result = result.replace("#", "\\#") - result = result.replace("%", "\\%") - result = result.replace("}", "\\}") - result = result.replace("<", "$<$") - result = result.replace(">", "$>$") - result = result.replace("~", "$\\tilde{}$") - -<<<<<<< HEAD + result=text + result=result.replace("\\","$\\backslash$") result=result.replace("_","\\_") result=result.replace("#","\\#") @@ -121,150 +106,107 @@ def format_tex(text): result=result.replace(">","$>$") result=result.replace("~","$\\tilde{}$") -======= ->>>>>>> 4ce03a0 ([build] fix build issues) return result - def format_texi(text): - result = text + result=text -<<<<<<< HEAD result=result.replace("@","@@") result=result.replace("}","@}") result=result.replace("{","@{") -======= - result = result.replace("@", "@@") - result = result.replace("}", "@}") - result = result.replace("{", "@{") ->>>>>>> 4ce03a0 ([build] fix build issues) return result - def format_uwc(text): - result = text + result=text -<<<<<<< HEAD result=result.replace("]","]") result=result.replace("[","[[") -======= - result = result.replace("]", "]") - result = result.replace("[", "[[") ->>>>>>> 4ce03a0 ([build] fix build issues) return result - def format_uwc_text(text): - result = text - - result = format_uwc(result) + result=text + result=format_uwc(result) + # This is an ugly way to get rid of all junk at line start - result = format_text(result, 0, 999999) + result=format_text(result,0,999999) return result - def format_uwc_elem(text): - result = text + result=text -<<<<<<< HEAD result=format_uwc(result) result=result.replace("\n"," ") result=result.replace("\r"," ") result=remove_duplicate_blanks(result) -======= - result = format_uwc(result) - result = result.replace("\n", " ") - result = result.replace("\r", " ") - result = remove_duplicate_blanks(result) ->>>>>>> 4ce03a0 ([build] fix build issues) return result - def format_uwc_code(text): - result = text + result=text - result = format_uwc(result) - line = re.compile("^(.*)$", re.M) - result = line.sub(r" \1", result) + result=format_uwc(result) + line=re.compile('^(.*)$',re.M) + result=line.sub(r" \1",result); return result - class XMLToX(xml.sax.ContentHandler): def __init__(self): xml.sax.ContentHandler.__init__(self) - self.charbuf = "" - self.translated = "" - self.stack = [] - - def write(self, text): - self.translated = self.translated + text - - def start_file(self, title): + self.charbuf="" + self.translated="" + self.stack=[] + def write(self,text): + self.translated=self.translated+text + def start_file(self,title): pass - - def start_chap(self, title): + def start_chap(self,title): pass - - def start_part(self, title): + def start_part(self,title): pass - def start_text(self): pass - def start_list(self): pass - def start_elem(self): pass - def start_code(self): pass - def end_file(self): pass - def end_chap(self): pass - def end_part(self): pass - def end_text(self): pass - def end_list(self): pass - def end_elem(self): pass - def end_code(self): pass - - def startElement(self, tag, attributes): - self.charbuf = "" + def startElement(self,tag,attributes): + self.charbuf="" self.stack.append(tag) - if tag == "file": + if tag=="file": self.start_file(attributes["title"]) - if tag == "chap": + if tag=="chap": self.start_chap(attributes["title"]) - if tag == "part": + if tag=="part": self.start_part(attributes["title"]) - if tag == "text": + if tag=="text": self.start_text() - if tag == "list": + if tag=="list": self.start_list() - if tag == "elem": + if tag=="elem": self.start_elem() - if tag == "code": + if tag=="code": self.start_code() -<<<<<<< HEAD def endElement(self,tag): data=self.charbuf.strip() if (data!=""): @@ -272,267 +214,195 @@ def endElement(self,tag): self.charbuf="" self.stack=self.stack[:-1] if tag=="file": -======= - - def endElement(self, tag): - data = self.charbuf.strip() - if data != "": - self.write(self.translate(data, self.stack[-1])) - self.charbuf = "" - self.stack = self.stack[:-1] - if tag == "file": ->>>>>>> 4ce03a0 ([build] fix build issues) self.end_file() - elif tag == "chap": + elif tag=="chap": self.end_chap() - elif tag == "part": + elif tag=="part": self.end_part() - elif tag == "text": + elif tag=="text": self.end_text() - elif tag == "list": + elif tag=="list": self.end_list() - elif tag == "elem": + elif tag=="elem": self.end_elem() - elif tag == "code": + elif tag=="code": self.end_code() - - def translate(self, data, tag): + def translate(self,data,tag): return data - - def characters(self, data): - self.charbuf += data - + def characters(self,data): + self.charbuf+=data class XMLToHTML(XMLToX): - def __init__(self, header, footer): + def __init__(self,header,footer): XMLToX.__init__(self) - self.header = header - self.footer = footer - - def start_file(self, title): - self.write( - '\n' - + "\n\n" - + '\n' - + "" - + title - + "\n\n\n\n" - + self.header - + "\n

" - + title - + "

\n" - ) - - def start_chap(self, title): - self.write("
\n

" + title + "

\n") - - def start_part(self, title): - self.write("

" + title + "

\n") - + self.header=header + self.footer=footer + def start_file(self,title): + self.write("\n"+\ + "\n\n"+\ + "\n"+\ + ""+\ + title+\ + "\n\n\n\n"+\ + self.header+\ + "\n

"+\ + title+\ + "

\n") + def start_chap(self,title): + self.write("
\n

"+\ + title+\ + "

\n") + def start_part(self,title): + self.write("

"+\ + title+\ + "

\n") def start_text(self): self.write("

") - def start_list(self): self.write("

    ") - def start_elem(self): self.write("
  • ") - def start_code(self): self.write("
    ")
    -
         def end_file(self):
    -        self.write(self.footer + "\n\n\n")
    -
    +        self.write(self.footer+\
    +                   "\n\n\n")
         def end_chap(self):
             self.write("\n")
    -
         def end_part(self):
             self.write("\n")
    -
         def end_text(self):
             self.write("

    \n") - def end_list(self): self.write("
\n") - def end_elem(self): self.write("\n") - def end_code(self): self.write("\n") - - def translate(self, data, tag): - result = data - result = format_html(result) + def translate(self,data,tag): + result=data + result=format_html(result) return result - class XMLToPHP(XMLToX): def __init__(self): XMLToX.__init__(self) - - def start_file(self, title): - self.write( - "\n\n\n\n" - + "
\n

" - + title - + "

\n
\n" - ) - - def start_chap(self, title): - self.write("
\n

" + title + "

\n") - - def start_part(self, title): - self.write("

" + title + "

\n") - + def start_file(self,title): + self.write("\n\n\n\n"+\ + "
\n

"+\ + title+\ + "

\n
\n") + def start_chap(self,title): + self.write("
\n

"+\ + title+\ + "

\n") + def start_part(self,title): + self.write("

"+\ + title+\ + "

\n") def start_text(self): self.write("

") - def start_list(self): self.write("

    ") - def start_elem(self): self.write("
  • ") - def start_code(self): self.write("
    ")
    -
         def end_file(self):
             self.write("\n\n\n\n")
    -
         def end_chap(self):
             self.write("\n")
    -
         def end_part(self):
             self.write("\n")
    -
         def end_text(self):
             self.write("

    \n") - def end_list(self): self.write("
\n") - def end_elem(self): self.write("\n") - def end_code(self): self.write("\n") - - def translate(self, data, tag): - result = data - result = format_html(result) + def translate(self,data,tag): + result=data + result=format_html(result) return result - class XMLToTeX(XMLToX): def __init__(self): XMLToX.__init__(self) - - def start_file(self, title): - self.write("\\chapter{" + self.translate(title, "text") + "}\n") - - def start_chap(self, title): - self.write("\\section{" + self.translate(title, "text") + "}\n") - - def start_part(self, title): - self.write("\\subsection{" + self.translate(title, "text") + "}\n") - + def start_file(self,title): + self.write("\\chapter{"+\ + self.translate(title,"text")+\ + "}\n") + def start_chap(self,title): + self.write("\\section{"+\ + self.translate(title,"text")+\ + "}\n") + def start_part(self,title): + self.write("\\subsection{"+\ + self.translate(title,"text")+\ + "}\n") def start_text(self): self.write("\n") - def start_list(self): self.write("\\begin{itemize}\n") - def start_elem(self): self.write("\\item[$\\bullet$]") - def start_code(self): self.write("\\begin{verbatim}\n") - def end_file(self): self.write("") - def end_chap(self): self.write("\n") - def end_part(self): self.write("\n") - def end_text(self): self.write("\n") - def end_list(self): self.write("\\end{itemize}\n") - def end_elem(self): self.write("\n") - def end_code(self): self.write("\n\\end{verbatim}\n") -<<<<<<< HEAD def translate(self,data,tag): result=data result=format_email_and_url(result) if (tag!="code"): result=format_tex(result) -======= - - def translate(self, data, tag): - result = data - result = format_email_and_url(result) - if tag != "code": - result = format_tex(result) ->>>>>>> 4ce03a0 ([build] fix build issues) return result - class XMLToMan(XMLToX): def __init__(self): XMLToX.__init__(self) - - def start_file(self, title): - self.write(".SH " + title + "\n\n") - - def start_chap(self, title): - self.write(".SS " + title + "\n\n") - - def start_part(self, title): - self.write(".TP 0 \n.B " + title + "\n") + def start_file(self,title): + self.write(".SH "+title+"\n\n") + def start_chap(self,title): + self.write(".SS "+title+"\n\n") + def start_part(self,title): + self.write(".TP 0 \n.B "+title+"\n") def start_text(self): self.write(".HP 0\n") - def start_list(self): self.write("") - def start_elem(self): self.write(".TP 3 \n.B *\n") - def start_code(self): self.write(".HP 0\n") - def end_file(self): self.write("") - def end_chap(self): self.write("\n") - def end_part(self): self.write("\n") - def end_text(self): self.write("\n") - def end_list(self): self.write("\n") - def end_elem(self): self.write("\n") - def end_code(self): self.write("\n") -<<<<<<< HEAD def translate(self,data,tag): result=data result=format_email_and_url(result) @@ -541,247 +411,154 @@ def translate(self,data,tag): result=result.replace("-",r"\-") if (tag=="code"): result=result.replace("\n","\n.br\n") -======= - - def translate(self, data, tag): - result = data - result = format_email_and_url(result) - result = result.replace("\\", "\\\\") - result = result.replace(".", "\\.") - result = result.replace("-", "\\-") - if tag == "code": - result = result.replace("\n", "\n.br\n") ->>>>>>> 4ce03a0 ([build] fix build issues) else: - result = remove_duplicate_blanks(result) + result=remove_duplicate_blanks(result) return result - class XMLToTxt(XMLToX): - def __init__(self, header): + def __init__(self,header): XMLToX.__init__(self) - self.header = header - - def start_file(self, title): - self.write(self.header + " - " + title + "\n\n") - self.indent = 0 - - def start_chap(self, title): - self.write( - "\n\n" - + " " * self.indent - + "\n" - + title - + "\n" - + " " * self.indent - + "=" * len(title) - + "\n\n" - ) - self.indent = self.indent + 2 - - def start_part(self, title): - self.write( - "\n" - + " " * self.indent - + title - + "\n" - + " " * self.indent - + "-" * len(title) - + "\n" - ) - self.indent = self.indent + 2 - + self.header=header + def start_file(self,title): + self.write(self.header+" - "+title+"\n\n") + self.indent=0 + def start_chap(self,title): + self.write("\n\n"+\ + " "*self.indent+"\n"+title+"\n"+\ + " "*self.indent+"="*len(title)+"\n\n") + self.indent=self.indent+2 + def start_part(self,title): + self.write("\n"+\ + " "*self.indent+title+"\n"+\ + " "*self.indent+"-"*len(title)+"\n") + self.indent=self.indent+2 def start_text(self): self.write("\n") - def start_list(self): self.write("") - self.indent = self.indent + 2 - + self.indent=self.indent+2 def start_elem(self): self.write("\n") - def start_code(self): self.write("\n") - def end_file(self): self.write("\n") - def end_chap(self): self.write("") - self.indent = self.indent - 2 - + self.indent=self.indent-2 def end_part(self): self.write("") - self.indent = self.indent - 2 - + self.indent=self.indent-2 def end_text(self): self.write("") - def end_list(self): self.write("") - self.indent = self.indent - 2 - + self.indent=self.indent-2 def end_elem(self): self.write("") - def end_code(self): self.write("\n") -<<<<<<< HEAD def translate(self,data,tag): result=data result=format_email_and_url(result) if (tag=="code"): result=" "*self.indent+\ result.replace("\n","\n"+" "*self.indent) -======= - - def translate(self, data, tag): - result = data - result = format_email_and_url(result) - if tag == "code": - result = " " * self.indent + result.replace("\n", "\n" + " " * self.indent) ->>>>>>> 4ce03a0 ([build] fix build issues) else: - result = format_text(result, self.indent, 80) - if tag == "elem": - result = " " * (self.indent - 2) + "* " + result[self.indent :] + result=format_text(result,self.indent,80) + if (tag=="elem"): + result=" "*(self.indent-2)+"* "+result[self.indent:] return result - class XMLToTexi(XMLToX): - def __init__(self, node): + def __init__(self,node): XMLToX.__init__(self) - self.node = node - - def start_file(self, title): - self.write("\n@node " + self.node + " , , , Top\n") - self.write("\n@chapter " + title + "\n") - - def start_chap(self, title): - self.write("\n@section " + title + "\n") - - def start_part(self, title): - self.write("\n@subsection " + title + "\n") - + self.node=node + def start_file(self,title): + self.write("\n@node "+self.node+" , , , Top\n") + self.write("\n@chapter "+title+"\n"); + def start_chap(self,title): + self.write("\n@section "+title+"\n"); + def start_part(self,title): + self.write("\n@subsection "+title+"\n"); def start_text(self): self.write("\n") - def start_list(self): self.write("\n@itemize @bullet") - def start_elem(self): self.write("\n@item\n") - def start_code(self): self.write("\n@example\n") - def end_file(self): self.write("\n") - def end_chap(self): self.write("\n") - def end_part(self): self.write("\n") - def end_text(self): self.write("\n") - def end_list(self): self.write("@end itemize\n") - def end_elem(self): self.write("\n") - def end_code(self): self.write("\n@end example\n") -<<<<<<< HEAD def translate(self,data,tag): result=data result=format_email_and_url(result) -======= ->>>>>>> 4ce03a0 ([build] fix build issues) - - def translate(self, data, tag): - result = data - result = format_email_and_url(result) - if tag != "code": - result = remove_duplicate_blanks(result) - result = format_texi(result) + if (tag!="code"): + result=remove_duplicate_blanks(result) + result=format_texi(result) return result - class XMLToUWC(XMLToX): def __init__(self): XMLToX.__init__(self) - - def start_file(self, title): + def start_file(self,title): # In UWikKiCMS document is handled manually once for # all directly in the UWiKiCMS site/instance. pass - - def start_chap(self, title): - self.write("\n!! " + title + "\n") - - def start_part(self, title): - self.write("\n! " + title + "\n") - + def start_chap(self,title): + self.write("\n!! "+title+"\n"); + def start_part(self,title): + self.write("\n! "+title+"\n"); def start_text(self): self.write("\n") - def start_list(self): self.write("\n") - def start_elem(self): self.write("\n* ") - def start_code(self): self.write("\n") - def end_file(self): self.write("\n") - def end_chap(self): self.write("\n") - def end_part(self): self.write("\n") - def end_text(self): self.write("\n") - def end_list(self): self.write("\n") - def end_elem(self): # No \n for we do not want blank lines between elems pass - def end_code(self): self.write("\n") -<<<<<<< HEAD def translate(self,data,tag): result=data result=format_email_and_url(result) -======= ->>>>>>> 4ce03a0 ([build] fix build issues) - - def translate(self, data, tag): - result = data - result = format_email_and_url(result) - if tag == "code": - result = format_uwc_code(result) - elif tag == "elem": - result = format_uwc_elem(result) + if (tag=="code"): + result=format_uwc_code(result) + elif (tag=="elem"): + result=format_uwc_elem(result) else: - result = format_uwc_text(result) + result=format_uwc_text(result) return result -<<<<<<< HEAD def run_parser(handler,dst,src): dst_file=open(dst,"w",encoding="iso-8859-1") src_file=open(src,"r") @@ -790,34 +567,25 @@ def run_parser(handler,dst,src): parser.setContentHandler(handler) parser.parse(src_file) dst_code=handler.translated -======= - -def run_parser(handler, dst, src): - dst_file = open(dst, "w") - src_file = open(src, "r") - # src_code=src_file.read() - parser = xml.sax.make_parser() - parser.setContentHandler(handler) - parser.parse(src_file) - dst_code = handler.translated ->>>>>>> 4ce03a0 ([build] fix build issues) dst_file.write(dst_code) src_file.close() dst_file.close() - - -def make_html(html_file, xml_file, header, footer): - header_file = open(header, "r") - footer_file = open(footer, "r") - header_str = header_file.read() - footer_str = footer_file.read() - handler = XMLToHTML(header_str, footer_str) - run_parser(handler, html_file, xml_file) + +def make_html(html_file,xml_file,header,footer): + header_file=open(header,"r") + footer_file=open(footer,"r") + header_str=header_file.read() + footer_str=footer_file.read() + handler=XMLToHTML(header_str,footer_str) + run_parser(handler,html_file,xml_file) header_file.close() footer_file.close() +def make_php(php_file,xml_file): + parser=xml.sax.make_parser() + handler=(XMLToPHP()) + run_parser(handler,php_file,xml_file) -<<<<<<< HEAD def make_tex(tex_file,xml_file): parser=xml.sax.make_parser() handler=XMLToTeX() @@ -844,41 +612,11 @@ def make_uwc(uwc_file,xml_file): parser=xml.sax.make_parser() handler=XMLToUWC() run_parser(handler,uwc_file,xml_file) -======= -def make_php(php_file, xml_file): - parser = xml.sax.make_parser() - handler = XMLToPHP() - run_parser(handler, php_file, xml_file) ->>>>>>> 4ce03a0 ([build] fix build issues) - - -def make_tex(tex_file, xml_file): - parser = xml.sax.make_parser() - handler = XMLToTeX() - run_parser(handler, tex_file, xml_file) -def make_man(man_file, xml_file): - parser = xml.sax.make_parser() - handler = XMLToMan() - run_parser(handler, man_file, xml_file) -def make_txt(txt_file, xml_file, header): - parser = xml.sax.make_parser() - handler = XMLToTxt(header) - run_parser(handler, txt_file, xml_file) -def make_texi(texi_file, xml_file): - node = xml_file.replace(".xml", "") - node = node.replace("xml/", "") - parser = xml.sax.make_parser() - handler = XMLToTexi(node) - run_parser(handler, texi_file, xml_file) -def make_uwc(uwc_file, xml_file): - parser = xml.sax.make_parser() - handler = XMLToUWC() - run_parser(handler, uwc_file, xml_file) diff --git a/src/Makefile.in b/src/Makefile.in index e68ccb78..cfecc176 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -188,6 +188,8 @@ OBJ_NAMES_SRV = \ $(SNPRINTF_NAMES) OBJ_NAMES_MAPGEN = \ + backport \ + mapgen_stubs \ ../utils/lwmapgen/big_quad \ ../utils/lwmapgen/boxes \ ../utils/lwmapgen/bubbles \ diff --git a/src/alleg2.c b/src/alleg2.c index a76d3b6a..2432ed8a 100644 --- a/src/alleg2.c +++ b/src/alleg2.c @@ -957,7 +957,6 @@ my_edit_proc (int msg, DIALOG * d, int c) static int ignore_next_uchar = FALSE; ALLEGRO_BITMAP *gui_bmp; int f, l, p, w, x, b, scroll; - int fg = 0; char buf[16]; char *s; ALLEGRO_ASSERT (d); diff --git a/src/game.c b/src/game.c index e94f4644..dfe33899 100644 --- a/src/game.c +++ b/src/game.c @@ -304,7 +304,6 @@ init_game (void) { while (!max_mem_reached && !ok) { - (void)i; /* Loop counter not currently used, suppress warning */ message = NULL; reset_big_data (); diff --git a/src/langpl.c b/src/langpl.c index 8bc456c2..023c6bfd 100644 --- a/src/langpl.c +++ b/src/langpl.c @@ -98,7 +98,6 @@ lw_langpl_init () LW_LANGPL_DATA[LW_LANG_STRING_MENU_OPTIONS] = "Opcje"; LW_LANGPL_DATA[LW_LANG_STRING_MENU_ABOUT] = "Informacje"; LW_LANGPL_DATA[LW_LANG_STRING_MENU_EXIT] = "Wyjscie"; - LW_LANGPL_DATA[LW_LANG_STRING_MENU_EXITDOS] = "Wyjdz do DOS"; LW_LANGPL_DATA[LW_LANG_STRING_MENU_EXITWINDOWS] = "Wyjscie"; LW_LANGPL_DATA[LW_LANG_STRING_MENU_EXITUNIX] = "Wyjscie"; LW_LANGPL_DATA[LW_LANG_STRING_MENU_BACK] = "Wroc do LW"; diff --git a/src/thrdunix.c b/src/thrdunix.c index cd7dc3d3..fb197bfc 100644 --- a/src/thrdunix.c +++ b/src/thrdunix.c @@ -192,30 +192,13 @@ lw_thread_start (void (*func) (void *), void *args) if (pthread_create (&thread, NULL, lw_thread_wrapper, wrapper_data) == 0) { - data->func = func; - data->args = args; - - if (pthread_create (&thread, NULL, lw_thread_wrapper, data) == 0) + if (pthread_detach (thread) == 0) { - if (pthread_detach (thread) == 0) - { - result = 1; - } - else - { - /* Detach failed, but thread is running - data will be freed by wrapper */ - } - } - else - { - /* Thread creation failed, free the wrapper data */ - free (data); + result = 1; } else { - // If detach fails, we should still clean up the wrapper data - // Note: this is a rare edge case, but we'll let the thread clean up - // since it was successfully created + /* Detach failed, but thread is running - data will be freed by wrapper */ } } else From 750de36939171a4db1a45333aa0265a68aa82700 Mon Sep 17 00:00:00 2001 From: "Christian Mauduit (ufoot)" Date: Mon, 10 Nov 2025 12:11:42 +0100 Subject: [PATCH 3/6] [ci] removed useless CI target --- .github/workflows/build-full.yml | 293 +++--------------------------- .github/workflows/build-quick.yml | 9 +- 2 files changed, 31 insertions(+), 271 deletions(-) diff --git a/.github/workflows/build-full.yml b/.github/workflows/build-full.yml index ebb3cb0c..f5505541 100644 --- a/.github/workflows/build-full.yml +++ b/.github/workflows/build-full.yml @@ -19,11 +19,16 @@ jobs: run: | sudo apt-get update sudo apt-get install -y \ - liballegro4-dev \ + liballegro5-dev \ + liballegro-acodec5-dev \ + liballegro-audio5-dev \ + liballegro-image5-dev \ + liballegro-physfs5-dev \ autoconf \ automake \ build-essential \ - clang + clang \ + pkg-config - name: Run autoconf run: autoconf @@ -94,11 +99,16 @@ jobs: run: | apt-get update apt-get install -y \ - liballegro4-dev \ + liballegro5-dev \ + liballegro-acodec5-dev \ + liballegro-audio5-dev \ + liballegro-image5-dev \ + liballegro-physfs5-dev \ autoconf \ automake \ build-essential \ - clang + clang \ + pkg-config - name: Run autoconf run: autoconf @@ -168,8 +178,7 @@ jobs: - name: Install dependencies run: | dnf install -y \ - allegro-devel \ - allegro-tools \ + allegro5-devel \ autoconf \ automake \ make \ @@ -247,7 +256,7 @@ jobs: run: | pacman -Syu --noconfirm pacman -S --noconfirm \ - allegro4 \ + allegro \ autoconf \ automake \ make \ @@ -312,268 +321,9 @@ jobs: - name: Clean run: make clean - build-freebsd: - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v5 - - - name: Build on FreeBSD - uses: vmactions/freebsd-vm@v1 - with: - usesh: true - prepare: | - pkg install -y allegro autoconf automake gmake pkgconf - run: | - autoconf - ./configure --prefix=$HOME/lw5 - gmake - gmake install - gmake package_source - - # Check binary exists and is executable - if [ ! -x "$HOME/lw5/bin/liquidwar" ]; then - echo "ERROR: $HOME/lw5/bin/liquidwar is not executable" - exit 1 - fi - echo "SUCCESS: liquidwar binary is executable" - - # Check version starts with 5 - VERSION_OUTPUT=$($HOME/lw5/bin/liquidwar --version) - echo "Version output: $VERSION_OUTPUT" - - if echo "$VERSION_OUTPUT" | head -n1 | grep -q '^5'; then - echo "SUCCESS: Version starts with 5" - else - echo "ERROR: Version does not start with 5" - echo "Got: $VERSION_OUTPUT" - exit 1 - fi - - # Test liquidwar-mapgen binary - if [ -x "$HOME/lw5/bin/liquidwar-mapgen" ]; then - echo "liquidwar-mapgen is executable" - $HOME/lw5/bin/liquidwar-mapgen --version || true - else - echo "WARNING: liquidwar-mapgen not found or not executable" - fi - - build-windows: - runs-on: windows-latest - defaults: - run: - shell: msys2 {0} - - steps: - - name: Checkout code - uses: actions/checkout@v5 - - - name: Setup MSYS2 with MinGW32 - uses: msys2/setup-msys2@v2 - with: - msystem: MINGW32 - update: true - install: >- - mingw-w64-i686-toolchain - mingw-w64-i686-cmake - autoconf - automake - make - dos2unix - wget - unzip - - - name: Build and install Allegro 4.4 - run: | - # Download Allegro 4.4.3.1 source - wget https://github.com/liballeg/allegro5/releases/download/4.4.3.1/allegro-4.4.3.1.zip - unzip allegro-4.4.3.1.zip - cd allegro - - # List files to debug - ls -la - - # Build Allegro 4 for MinGW using cmake - mkdir build - cd build - cmake .. \ - -G "MSYS Makefiles" \ - -DCMAKE_INSTALL_PREFIX=/mingw32 \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_POLICY_VERSION_MINIMUM=3.5 \ - -DWANT_DOCS=OFF \ - -DWANT_TESTS=OFF \ - -DWANT_EXAMPLES=OFF \ - -DWANT_TOOLS=ON - make -j2 - make install - - # Debug: Search for Allegro DLL files - echo "Searching Allegro DLL files in /mingw32:" - find /mingw32 -name "alleg*.dll" -ls 2>/dev/null || echo "No alleg*.dll in /mingw32" - - # Verify installation - echo "Checking for dat tool:" - ls -la /mingw32/bin/dat* || echo "dat not found in /mingw32/bin" - - cd ../.. - - - name: Build Liquid War with Makefile.mgw - run: | - # Ensure /mingw32/bin is in PATH for Allegro - export PATH="/mingw32/bin:$PATH" - - # Check if dat tool exists - echo "Checking for required tools:" - which dat || echo "WARNING: dat not found" - ls -la /mingw32/bin/dat* || ( echo "dat not in /mingw32/bin" && exit 1) - - # Debug: Check what Allegro libraries are available - echo "Libraries in /mingw32/lib:" - ls -la /mingw32/lib/liballeg* || ( echo "No Allegro libraries" && exit 1) - - # Build using MinGW Makefile - make -f Makefile.mgw - - - name: Check Windows binary created - run: | - cp /mingw32/bin/alleg44.dll . - if [ -f "lwwin.exe" ] && [ -f "lwwinsrv.exe" ] && [ -f "lwwinmap.exe" ] && [ -f "alleg44.dll" ] ; then - echo "SUCCESS: Windows .exe files created" - ls -lh lwwin*.exe - else - echo "ERROR: Windows .exe files not found" - exit 1 - fi - - - name: Upload Windows binaries - uses: actions/upload-artifact@v4 - with: - name: liquidwar-windows-binaries - path: | - lwwin*.exe - alleg44.dll - retention-days: 61 - - build-dos: - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v5 - - - name: Install DJGPP cross-compiler - run: | - sudo apt-get update - sudo apt-get install -y wget bzip2 make gcc g++ unzip flex - - # Download and setup DJGPP cross-compiler - cd /tmp - wget https://github.com/andrewwutw/build-djgpp/releases/download/v3.4/djgpp-linux64-gcc1220.tar.bz2 - sudo tar xjf djgpp-linux64-gcc1220.tar.bz2 -C /usr/local - export PATH="/usr/local/djgpp/bin:$PATH" - - echo "DJGPP cross-compiler installed:" - i586-pc-msdosdjgpp-gcc --version - - - name: Setup Allegro 4.2.3.1 for DOS - run: | - export PATH="/usr/local/djgpp/bin:$PATH" - export DJGPP_PREFIX=i586-pc-msdosdjgpp - - # Download Allegro 4.2.3.1 source for headers - wget https://github.com/liballeg/allegro5/releases/download/v4-2-3-1/all4231.zip - unzip all4231.zip - - # Use Allegro's actual build system - cd allegro - - # Set up cross-compilation environment variables (as per docs/build/djgpp.txt) - export CROSSCOMPILE=1 - export DJDIR=/usr/local/djgpp - export NATIVEPATH=$PATH - export PATH=/usr/local/djgpp/bin:$PATH - - # Configure for DJGPP - echo "Configuring Allegro for DJGPP..." - bash fix.sh djgpp - - # Build using Allegro's Makefile with cross-compiler - # Must override CC since makefile.dj defaults to 'gcc' - # Only build the library, not utilities like setup.exe - # Add -fgnu89-inline to handle extern __inline__ in headers correctly - # Try without ALLEGRO_USE_C=1 to let assembly files compile - echo "Building Allegro with DJGPP cross-compiler..." - make lib \ - CC=${DJGPP_PREFIX}-gcc \ - CROSSCOMPILE=1 \ - TARGET_OPTS="-O2 -funroll-loops -ffast-math -fgnu89-inline" - - echo "Allegro build complete. Checking library..." - ls -lh lib/djgpp/liballeg.a || ( echo "ERROR: Allegro library not created" && exit 1 ) - cd .. - - - name: Download CWSDPMI for DOS runtime - run: | - # CWSDPMI is the DOS Protected Mode Interface server needed to run DJGPP programs - # Try multiple mirrors - wget http://www.delorie.com/pub/djgpp/current/v2misc/csdpmi7b.zip -O csdpmi7b.zip || \ - wget https://www.mirrorservice.org/sites/ftp.delorie.com/pub/djgpp/current/v2misc/csdpmi7b.zip -O csdpmi7b.zip || \ - ( echo "ERROR: Failed to download CWSDPMI" && exit 1 ) - - unzip csdpmi7b.zip - - # Find and copy to root directory - find . -iname "cwsdpmi.exe" -exec cp {} ./cwsdpmi.exe \; - - echo "CWSDPMI location:" - ls -la cwsdpmi.exe || ( echo "ERROR: cwsdpmi.exe not found after extraction" && exit 1 ) - - - name: Build Liquid War for DOS - run: | - export PATH="/usr/local/djgpp/bin:$PATH" - - # Debug: Show Allegro library location - echo "Current directory: $PWD" - echo "Allegro library path: $PWD/allegro/lib/djgpp" - ls -lh $PWD/allegro/lib/djgpp/liballeg.a || echo "Allegro library not found!" - - # Build using DJGPP cross-compiler with explicit Allegro paths - # Need -fgnu89-inline to match Allegro's build for extern __inline__ functions - echo "Building with LDFLAGS=-L$PWD/allegro/lib/djgpp" - make -f Makefile.dj \ - CC=i586-pc-msdosdjgpp-gcc \ - C_FLAGS="-O2 -fomit-frame-pointer -Wall -Werror -I./src/ -I$PWD/allegro/include -DALLEGRO_STATICLINK -fgnu89-inline" \ - LDFLAGS="-L$PWD/allegro/lib/djgpp" || ( echo "Build failed" && exit 1 ) - - echo "Checking if executable was created:" - ls -lh src/*.exe 2>/dev/null || ls -lh lwdos*.exe 2>/dev/null || ls -lh *.exe 2>/dev/null || echo "No .exe found" - find . -name "*.exe" -type f - - - name: Check DOS executable created - run: | - if [ -f "lwdos.exe" ] ; then - echo "SUCCESS: DOS executable created" - ls -lh *.exe src/*.exe 2>/dev/null || true - else - echo "ERROR: No DOS executable found" - find . -name "*.exe" - exit 1 - fi - - - name: Upload DOS binaries - uses: actions/upload-artifact@v4 - with: - name: liquidwar-dos-binaries - path: | - lwdos*.exe - cwsdpmi.exe - retention-days: 61 - build-source: runs-on: ubuntu-latest - needs: [build-fedora, build-ubuntu, build-debian, build-arch, build-freebsd, build-windows, build-dos] + needs: [build-fedora, build-ubuntu, build-debian, build-arch] steps: - name: Checkout code @@ -583,10 +333,15 @@ jobs: run: | sudo apt-get update sudo apt-get install -y \ - liballegro4-dev \ + liballegro5-dev \ + liballegro-acodec5-dev \ + liballegro-audio5-dev \ + liballegro-image5-dev \ + liballegro-physfs5-dev \ autoconf \ automake \ - build-essential + build-essential \ + pkg-config - name: Generate configure script run: autoconf diff --git a/.github/workflows/build-quick.yml b/.github/workflows/build-quick.yml index d7ab5a38..b2996cc4 100644 --- a/.github/workflows/build-quick.yml +++ b/.github/workflows/build-quick.yml @@ -17,10 +17,15 @@ jobs: run: | sudo apt-get update sudo apt-get install -y \ - liballegro4-dev \ + liballegro5-dev \ + liballegro-acodec5-dev \ + liballegro-audio5-dev \ + liballegro-image5-dev \ + liballegro-physfs5-dev \ autoconf \ automake \ - build-essential + build-essential \ + pkg-config - name: Generate configure script run: autoconf From 58334e02ae2487f161df4f34fbd60ce5a1c8c177 Mon Sep 17 00:00:00 2001 From: "Christian Mauduit (ufoot)" Date: Mon, 10 Nov 2025 14:05:53 +0100 Subject: [PATCH 4/6] [ui] fix compilation warning (which was likely a bug...) --- src/advanced.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/advanced.c b/src/advanced.c index 10578ea5..c40df42d 100644 --- a/src/advanced.c +++ b/src/advanced.c @@ -118,15 +118,15 @@ advanced_options (void) memset (d, 0, sizeof (d)); - for (i = 0; i < 8; ++i) + for (i = 0; i < 7; ++i) { standard_button (d + i + 4, 0, y_pos[i], 2, 8); d[i + 4].proc = my_textbox_proc; } - for (i = 0; i < 8; ++i) + for (i = 0; i < 7; ++i) { - standard_button (d + i + 12, 1, y_pos[i], 2, 8); - d[i + 12].proc = my_slider_proc; + standard_button (d + i + 11, 1, y_pos[i], 2, 8); + d[i + 11].proc = my_slider_proc; } d[16].proc = d[17].proc = my_button_proc; From 70349feee1d05abb35ea25c95d35abbb060c63d1 Mon Sep 17 00:00:00 2001 From: "Christian Mauduit (ufoot)" Date: Sat, 22 Nov 2025 20:18:03 +0100 Subject: [PATCH 5/6] [migration] removed all palette code --- src/Makefile.in | 1 - src/alleg2.c | 51 +-- src/back.c | 1 - src/backport.c | 372 ++++++++------------- src/backport.h | 58 ++-- src/backportgui.c | 24 +- src/backportgui.h | 12 +- src/backportguiproc.c | 70 ++-- src/capture.c | 2 +- src/config.c | 2 +- src/cursor.c | 2 +- src/decal.c | 4 +- src/decal.h | 2 +- src/dialog.h | 10 +- src/disk.c | 61 +++- src/fighter.c | 5 +- src/grad.c | 19 +- src/graphics.c | 10 +- src/info.c | 8 +- src/level.c | 11 +- src/lw6.c | 2 +- src/map.c | 247 +++++++++----- src/map.h | 4 +- src/maptex.c | 12 +- src/menu.c | 2 +- src/mesh.c | 20 +- src/message.c | 2 +- src/options.c | 2 +- src/palette.c | 421 ------------------------ src/palette.h | 95 ------ src/pion.c | 43 ++- src/play.c | 9 +- src/random.c | 23 +- src/score.c | 11 +- src/team.c | 16 +- src/test_backport_pixel.c | 1 - src/texture.c | 295 ++--------------- src/viewport.c | 2 +- utils/lwmapgen/big_quad.c | 2 +- utils/lwmapgen/boxes.c | 2 +- utils/lwmapgen/bubbles.c | 4 +- utils/lwmapgen/circles.c | 2 +- utils/lwmapgen/circuit.c | 22 +- utils/lwmapgen/cut.c | 4 +- utils/lwmapgen/main.c | 2 +- utils/lwmapgen/map.c | 6 +- utils/lwmapgen/old/rand_poly_cut.c | 2 +- utils/lwmapgen/old/rand_poly_diag_cut.c | 2 +- utils/lwmapgen/rand_box.c | 2 +- utils/lwmapgen/rand_poly.c | 2 +- utils/lwmapgen/street.c | 12 +- utils/lwmapgen/worms.c | 13 +- 52 files changed, 639 insertions(+), 1370 deletions(-) delete mode 100644 src/palette.c delete mode 100644 src/palette.h diff --git a/src/Makefile.in b/src/Makefile.in index cfecc176..29350567 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -129,7 +129,6 @@ OBJ_NAMES = \ netplay \ network \ options \ - palette \ parser \ path \ ping \ diff --git a/src/alleg2.c b/src/alleg2.c index 2432ed8a..07e865e9 100644 --- a/src/alleg2.c +++ b/src/alleg2.c @@ -70,7 +70,7 @@ typedef char *(*my_getfuncptr) (int, int *); /*==================================================================*/ extern void _draw_scrollable_frame (DIALOG * d, int listsize, int offset, int height, - int fg_color, int bg); + ALLEGRO_COLOR fg_color, ALLEGRO_COLOR bg); extern int isspace (int c); static void my_handle_scrollable_scroll_click (DIALOG * d, int listsize, @@ -91,7 +91,7 @@ static void my_handle_listbox_click (DIALOG * d); * Draws a dotted rectangle, for showing an object has the input focus. */ static void -my_dotted_rect (int x1, int y1, int x2, int y2, int fg, int bg) +my_dotted_rect (int x1, int y1, int x2, int y2, ALLEGRO_COLOR fg, ALLEGRO_COLOR bg) { ALLEGRO_BITMAP *gui_bmp = gui_get_screen (); int x = ((x1 + y1) & 1) ? 1 : 0; @@ -116,7 +116,7 @@ my_dotted_rect (int x1, int y1, int x2, int y2, int fg, int bg) static void my_draw_textbox (char *thetext, int *listsize, int draw, int offset, int wword, int tabsize, int x, int y, int w, int h, - int disabled, int fore, int deselect, int disable) + int disabled, ALLEGRO_COLOR fore, ALLEGRO_COLOR deselect, ALLEGRO_COLOR disable) { ALLEGRO_BITMAP *gui_bmp = gui_get_screen (); int y1 = y + 4; @@ -271,7 +271,7 @@ my_draw_textbox (char *thetext, int *listsize, int draw, int offset, { usetc (s + usetc (s, ' '), 0); //textout_ex(gui_bmp, font, s, x1, y1, fg, deselect); - textout_ex (gui_bmp, font, s, x1, y1, -1, deselect); // ufoot + textout_ex (gui_bmp, font, s, x1, y1, NO_COLOR, deselect); // ufoot x1 += text_length (font, s); } break; @@ -282,7 +282,7 @@ my_draw_textbox (char *thetext, int *listsize, int draw, int offset, { usetc (s + usetc (s, ugetc (printed)), 0); //textout_ex(gui_bmp, font, s, x1, y1, fg, deselect); - textout_ex (gui_bmp, font, s, x1, y1, -1, deselect); // ufoot + textout_ex (gui_bmp, font, s, x1, y1, NO_COLOR, deselect); // ufoot x1 += text_length (font, s); } } @@ -334,7 +334,7 @@ my_textbox_proc (int msg, DIALOG * d, int c) int height, bar, ret = D_O_K; int start, top, bottom, l; int used, delta; - int fg_color; + ALLEGRO_COLOR fg_color; ALLEGRO_ASSERT (d); fg_color = (d->flags & D_DISABLED) ? gui_mg_color : d->fg; @@ -349,7 +349,7 @@ my_textbox_proc (int msg, DIALOG * d, int c) my_draw_textbox (d->dp, &d->d1, 0, /* DONT DRAW anything */ d->d2, !(d->flags & D_SELECTED), 8, d->x, d->y, d->w, d->h, - (d->flags & D_DISABLED), 0, 0, 0); + (d->flags & D_DISABLED), NO_COLOR, NO_COLOR, NO_COLOR); break; case MSG_DRAW: @@ -357,7 +357,7 @@ my_textbox_proc (int msg, DIALOG * d, int c) my_draw_textbox (d->dp, &d->d1, 0, /* DONT DRAW anything */ d->d2, !(d->flags & D_SELECTED), 8, d->x, d->y, d->w, d->h, - (d->flags & D_DISABLED), 0, 0, 0); + (d->flags & D_DISABLED), NO_COLOR, NO_COLOR, NO_COLOR); if (d->d1 > height && d->d1 > 1) // ufoot { @@ -501,9 +501,10 @@ int my_button_proc (int msg, DIALOG * d, int c) { ALLEGRO_BITMAP *gui_bmp; - int state1, state2; - int black; + ALLEGRO_COLOR state1, state2; + ALLEGRO_COLOR black; int swap; + int click_state1, click_state2; // Boolean states for MSG_CLICK int g; ALLEGRO_ASSERT (d); @@ -532,8 +533,8 @@ my_button_proc (int msg, DIALOG * d, int c) d->y + d->h - 3 + g, state2); rect (gui_bmp, d->x + g, d->y + g, d->x + d->w - 2 + g, d->y + d->h - 2 + g, state1); - //gui_textout_ex(gui_bmp, d->dp, d->x+d->w/2+g, d->y+d->h/2-text_height(font)/2+g, state1, -1, TRUE); - gui_textout_ex (gui_bmp, d->dp, d->x + d->w / 2 + g, d->y + d->h / 2 - text_height (font) / 2 + g, -1, -1, TRUE); // ufoot + //gui_textout_ex(gui_bmp, d->dp, d->x+d->w/2+g, d->y+d->h/2-text_height(font)/2+g, state1, NO_COLOR, TRUE); + gui_textout_ex (gui_bmp, d->dp, d->x + d->w / 2 + g, d->y + d->h / 2 - text_height (font) / 2 + g, NO_COLOR, NO_COLOR, TRUE); // ufoot if (d->flags & D_SELECTED) { @@ -542,7 +543,7 @@ my_button_proc (int msg, DIALOG * d, int c) } else { - black = 0; // [FIXME:ufoot] sounds a bit hardcoded, double-check this + black = al_map_rgb(0, 0, 0); // [FIXME:ufoot] sounds a bit hardcoded, double-check this vline (gui_bmp, d->x + d->w - 1, d->y + 1, d->y + d->h - 2, black); hline (gui_bmp, d->x + 1, d->y + d->h - 1, d->x + d->w - 1, black); } @@ -569,26 +570,26 @@ my_button_proc (int msg, DIALOG * d, int c) case MSG_CLICK: /* what state was the button originally in? */ - state1 = d->flags & D_SELECTED; + click_state1 = d->flags & D_SELECTED; if (d->flags & D_EXIT) swap = FALSE; else - swap = state1; + swap = click_state1; /* track the mouse until it is released */ while (gui_mouse_b ()) { - state2 = ((gui_mouse_x () >= d->x) && (gui_mouse_y () >= d->y) && + click_state2 = ((gui_mouse_x () >= d->x) && (gui_mouse_y () >= d->y) && (gui_mouse_x () < d->x + d->w) && (gui_mouse_y () < d->y + d->h)); if (swap) - state2 = !state2; + click_state2 = !click_state2; /* redraw? */ - if (((state1) && (!state2)) || ((state2) && (!state1))) + if (((click_state1) && (!click_state2)) || ((click_state2) && (!click_state1))) { d->flags ^= D_SELECTED; - state1 = d->flags & D_SELECTED; + click_state1 = d->flags & D_SELECTED; object_message (d, MSG_DRAW, 0); } @@ -627,7 +628,7 @@ my_text_proc (int msg, DIALOG * d, int c) font = d->dp2; //gui_textout_ex(gui_get_screen(), d->dp, d->x, d->y, fg, d->bg, FALSE); - gui_textout_ex (gui_get_screen (), d->dp, d->x, d->y, -1, d->bg, FALSE); // ufoot + gui_textout_ex (gui_get_screen (), d->dp, d->x, d->y, NO_COLOR, d->bg, FALSE); // ufoot font = oldfont; } @@ -654,7 +655,7 @@ my_ctext_proc (int msg, DIALOG * d, int c) font = d->dp2; //gui_textout_ex(gui_get_screen(), d->dp, d->x + d->w/2, d->y, fg, d->bg, TRUE); - gui_textout_ex (gui_get_screen (), d->dp, d->x + d->w / 2, d->y, -1, d->bg, TRUE); // ufoot + gui_textout_ex (gui_get_screen (), d->dp, d->x + d->w / 2, d->y, NO_COLOR, d->bg, TRUE); // ufoot font = oldfont; } @@ -682,7 +683,7 @@ my_slider_proc (int msg, DIALOG * d, int c) ALLEGRO_BITMAP *gui_bmp = gui_get_screen (); ALLEGRO_BITMAP *slhan = NULL; int oldpos, newpos; - int sfg; /* slider foreground color */ + ALLEGRO_COLOR sfg; /* slider foreground color */ int vert = TRUE; /* flag: is slider vertical? */ int hh = 7; /* handle height (width for horizontal sliders) */ int hmar; /* handle margin */ @@ -1026,7 +1027,7 @@ my_edit_proc (int msg, DIALOG * d, int c) break; f = ((p == d->d2) && (d->flags & D_GOTFOCUS)); //textout_ex(gui_bmp, font, buf, d->x+x, d->y, (f) ? d->bg : fg, (f) ? fg : d->bg); - textout_ex (gui_bmp, font, buf, d->x + x, d->y, -1, (f) ? d->fg : d->bg); // ufoot + textout_ex (gui_bmp, font, buf, d->x + x, d->y, NO_COLOR, (f) ? d->fg : d->bg); // ufoot x += w; } if (x < d->w) @@ -1334,7 +1335,7 @@ my_draw_listbox (DIALOG * d) { ALLEGRO_BITMAP *gui_bmp = gui_get_screen (); int height, listsize, i, len, bar, x, y, w; - int fg_color, bg; + ALLEGRO_COLOR fg_color, bg; char *sel = d->dp2; char s[1024]; @@ -1386,7 +1387,7 @@ my_draw_listbox (DIALOG * d) usetat (s, len, 0, sizeof (s)); } //textout_ex(gui_bmp, font, s, x, y, fg, bg); - textout_ex (gui_bmp, font, s, x, y, -1, bg); // ufoot + textout_ex (gui_bmp, font, s, x, y, NO_COLOR, bg); // ufoot x += text_length (font, s); if (x <= d->x + w) rectfill (gui_bmp, x, y, d->x + w, y + text_height (font) - 1, diff --git a/src/back.c b/src/back.c index 48e2cc22..39b88431 100644 --- a/src/back.c +++ b/src/back.c @@ -56,7 +56,6 @@ #include "back.h" #include "disk.h" -#include "palette.h" #include "viewport.h" #include "dialog.h" diff --git a/src/backport.c b/src/backport.c index 40c4d824..fe20f8f6 100644 --- a/src/backport.c +++ b/src/backport.c @@ -61,7 +61,6 @@ #include #include "backport.h" -#include "palette.h" #include "macro.h" #include "mutxgen.h" #include "thrdgen.h" @@ -90,8 +89,6 @@ typedef struct /*==================================================================*/ static int _allegro_errno = 0; -static unsigned char *_rgb_to_palette_map = NULL; // 24-bit RGB to palette index map -static int _rgb_map_initialized = 0; static int _dummy = 0; // stupid dummy to get rid of unused param warning static _backport_timer_data _backport_timers[_NB_TIMERS]; static LW_MUTEX_DATA _backport_timer_mutex = { NULL }; @@ -109,10 +106,16 @@ volatile int mouse_y = 0; volatile int mouse_z = 0; volatile int mouse_b = 0; +// Palette-related variables (from old palette.c) +// In true color mode, we effectively have 256 intensity levels per team +// This is a placeholder - real fix is to compute colors with al_map_rgb() directly +int COLORS_PER_TEAM = 256; + // GUI color variables for Allegro 4 compatibility -int gui_bg_color = 0; -int gui_fg_color = 15; -int gui_mg_color = 8; +// Converted from palette indices to ALLEGRO_COLOR +ALLEGRO_COLOR gui_bg_color = {0, 0, 0, 1}; // Black +ALLEGRO_COLOR gui_fg_color = {1, 1, 1, 1}; // White +ALLEGRO_COLOR gui_mg_color = {0.5, 0.5, 0.5, 1}; // Gray int *allegro_errno = &_allegro_errno; volatile JOYSTICK_INFO joy[MAX_JOYSTICKS]; int num_joysticks = 0; @@ -232,158 +235,42 @@ show_mouse (ALLEGRO_BITMAP *bmp) /*------------------------------------------------------------------*/ void -clear_to_color (ALLEGRO_BITMAP * bitmap, int color) +clear_to_color (ALLEGRO_BITMAP * bitmap, ALLEGRO_COLOR color) { // https://liballeg.org/stabledocs/en/alleg013.html#clear_to_color al_set_target_bitmap (bitmap); - if (color < 0 || color >= PALETTE_SIZE) - { - return; - } - ALLEGRO_COLOR al_color; - al_color = rgb_to_allegro_color(GLOBAL_PALETTE[color]); - al_clear_to_color (al_color); + al_clear_to_color (color); } /*------------------------------------------------------------------*/ void -putpixel (ALLEGRO_BITMAP * bitmap, int x, int y, int color) +putpixel (ALLEGRO_BITMAP * bitmap, int x, int y, ALLEGRO_COLOR color) { // https://liballeg.org/stabledocs/en/alleg013.html#putpixel - if (color < 0 || color >= PALETTE_SIZE) - { - return; - } - - RGB rgb = GLOBAL_PALETTE[color]; - ALLEGRO_COLOR al_color = al_map_rgb(rgb.r, rgb.g, rgb.b); - al_set_target_bitmap (bitmap); - al_put_pixel (x, y, al_color); + al_put_pixel (x, y, color); } /*------------------------------------------------------------------*/ void -putpixel_fast (int x, int y, int color) +putpixel_fast (int x, int y, ALLEGRO_COLOR color) { // Optimized version that assumes target bitmap is already set // Use al_set_target_bitmap() before calling this in a loop - if (color < 0 || color >= PALETTE_SIZE) - { - return; - } - - RGB rgb = GLOBAL_PALETTE[color]; - ALLEGRO_COLOR al_color = al_map_rgb(rgb.r, rgb.g, rgb.b); - - al_put_pixel (x, y, al_color); -} - -/*------------------------------------------------------------------*/ -static void -_init_rgb_to_palette_map (void) -{ - // Initialize the 24-bit RGB to palette index lookup table - if (_rgb_map_initialized) - { - return; - } - - // Allocate 16MB for 24-bit RGB space (2^24 = 16,777,216 bytes) - _rgb_to_palette_map = malloc(16777216); - if (_rgb_to_palette_map == NULL) - { - return; // Fall back to slow lookup if allocation fails - } - - // Initialize all entries to 255 (invalid palette index) - memset(_rgb_to_palette_map, 255, 16777216); - - // Fill the map with palette colors - for (int i = 0; i < PALETTE_SIZE; i++) - { - float r, g, b, a; - al_unmap_rgba_f (rgb_to_allegro_color(GLOBAL_PALETTE[i]), &r, &g, &b, &a); - - // Convert to 8-bit RGB - unsigned char r8 = (unsigned char)(r * 255.0f); - unsigned char g8 = (unsigned char)(g * 255.0f); - unsigned char b8 = (unsigned char)(b * 255.0f); - - // Calculate 24-bit RGB index - int rgb_index = (r8 << 16) | (g8 << 8) | b8; - _rgb_to_palette_map[rgb_index] = (unsigned char)i; - } - - _rgb_map_initialized = 1; + al_put_pixel (x, y, color); } /*------------------------------------------------------------------*/ -int +ALLEGRO_COLOR getpixel (ALLEGRO_BITMAP * bitmap, int x, int y) { // https://liballeg.org/stabledocs/en/alleg013.html#getpixel - /* - * Fast palette lookup using 24-bit RGB to palette index map. - * al_get_pixel takes bitmap as parameter, no need to set target. - */ - ALLEGRO_COLOR pixel_color; - - pixel_color = al_get_pixel (bitmap, x, y); - - // Convert to RGB - float r, g, b, a; - al_unmap_rgba_f (pixel_color, &r, &g, &b, &a); - unsigned char r8 = (unsigned char)(r * 255.0f); - unsigned char g8 = (unsigned char)(g * 255.0f); - unsigned char b8 = (unsigned char)(b * 255.0f); - - // Initialize lookup table if needed - if (!_rgb_map_initialized) - { - _init_rgb_to_palette_map(); - } - - // Fast lookup if map is available - if (_rgb_to_palette_map != NULL) - { - int rgb_index = (r8 << 16) | (g8 << 8) | b8; - unsigned char palette_index = _rgb_to_palette_map[rgb_index]; - - if (palette_index != 255) // Found exact match - { - return (int)palette_index; - } - } - - // Fallback: find closest palette color by distance - int best_match = 0; - float best_distance = 9999999.0f; - - for (int i = 0; i < PALETTE_SIZE; i++) - { - float pr, pg, pb, pa; - al_unmap_rgba_f (rgb_to_allegro_color(GLOBAL_PALETTE[i]), &pr, &pg, &pb, &pa); - - // Calculate distance (simple RGB distance) - float dr = r - pr; - float dg = g - pg; - float db = b - pb; - float distance = dr * dr + dg * dg + db * db; - - if (distance < best_distance) - { - best_distance = distance; - best_match = i; - } - } - - return best_match; + return al_get_pixel (bitmap, x, y); } /*------------------------------------------------------------------*/ void -rect (ALLEGRO_BITMAP * bitmap, int x1, int y1, int x2, int y2, int color) +rect (ALLEGRO_BITMAP * bitmap, int x1, int y1, int x2, int y2, ALLEGRO_COLOR color) { // https://liballeg.org/stabledocs/en/alleg013.html#rect if (x2 < x1 || y2 < y1) @@ -391,38 +278,30 @@ rect (ALLEGRO_BITMAP * bitmap, int x1, int y1, int x2, int y2, int color) return; } al_set_target_bitmap (bitmap); - if (color < 0 || color >= PALETTE_SIZE) - { - return; - } - ALLEGRO_COLOR al_color; - al_color = rgb_to_allegro_color(GLOBAL_PALETTE[color]); - al_draw_filled_rectangle (x1, y1, x2, y1 + 1, al_color); - al_draw_filled_rectangle (x2, y1, x2 + 1, y2, al_color); - al_draw_filled_rectangle (x1 + 1, y2, x2 + 1, y2 + 1, al_color); - al_draw_filled_rectangle (x1, y1 + 1, x1 + 1, y2 + 1, al_color); + + + al_draw_filled_rectangle (x1, y1, x2, y1 + 1, color); + al_draw_filled_rectangle (x2, y1, x2 + 1, y2, color); + al_draw_filled_rectangle (x1 + 1, y2, x2 + 1, y2 + 1, color); + al_draw_filled_rectangle (x1, y1 + 1, x1 + 1, y2 + 1, color); } /*------------------------------------------------------------------*/ void -rectfill (ALLEGRO_BITMAP * bitmap, int x1, int y1, int x2, int y2, int color) +rectfill (ALLEGRO_BITMAP * bitmap, int x1, int y1, int x2, int y2, ALLEGRO_COLOR color) { // https://liballeg.org/stabledocs/en/alleg013.html#rectfill al_set_target_bitmap (bitmap); - if (color < 0 || color >= PALETTE_SIZE) - { - return; - } - ALLEGRO_COLOR al_color; - al_color = rgb_to_allegro_color(GLOBAL_PALETTE[color]); + + // +1 on second coord because floating point vs integer - al_draw_filled_rectangle (x1, y1, x2 + 1, y2 + 1, al_color); + al_draw_filled_rectangle (x1, y1, x2 + 1, y2 + 1, color); } /*------------------------------------------------------------------*/ void rectfill_dotted (ALLEGRO_BITMAP * bitmap, int x1, int y1, int x2, int y2, - int fg, int bg) + ALLEGRO_COLOR fg, ALLEGRO_COLOR bg) { /* * This is not a genuine Allegro function, but used to backport the behavior @@ -440,21 +319,7 @@ rectfill_dotted (ALLEGRO_BITMAP * bitmap, int x1, int y1, int x2, int y2, * Rather than implemeting generic pattern handling, this is quicker to implement. * and suits our limited need. */ - if (fg < 0 || fg >= PALETTE_SIZE) - { - return; - } - ALLEGRO_COLOR al_fg; - al_fg = rgb_to_allegro_color(GLOBAL_PALETTE[fg]); - - if (bg < 0 || bg >= PALETTE_SIZE) - { - return; - } - ALLEGRO_COLOR al_bg; - al_bg = rgb_to_allegro_color(GLOBAL_PALETTE[bg]); - - ALLEGRO_COLOR al_color = al_bg; + ALLEGRO_COLOR color = bg; int x = 0; int y = 0; @@ -463,15 +328,15 @@ rectfill_dotted (ALLEGRO_BITMAP * bitmap, int x1, int y1, int x2, int y2, { for (x = x1; x <= x2; x++) { - al_color = ((x + y) % 2) != 0 ? al_fg : al_bg; - al_put_pixel (x, y, al_color); + color = ((x + y) % 2) != 0 ? fg : bg; + al_put_pixel (x, y, color); } } } /*------------------------------------------------------------------*/ void -vline (ALLEGRO_BITMAP * bitmap, int x, int y1, int y2, int color) +vline (ALLEGRO_BITMAP * bitmap, int x, int y1, int y2, ALLEGRO_COLOR color) { // https://liballeg.org/stabledocs/en/alleg013.html#vline if (y2 < y1) @@ -481,18 +346,14 @@ vline (ALLEGRO_BITMAP * bitmap, int x, int y1, int y2, int color) y1 = y; } al_set_target_bitmap (bitmap); - if (color < 0 || color >= PALETTE_SIZE) - { - return; - } - ALLEGRO_COLOR al_color; - al_color = rgb_to_allegro_color(GLOBAL_PALETTE[color]); - al_draw_filled_rectangle (x, y1, x + 1, y2 + 1, al_color); + + + al_draw_filled_rectangle (x, y1, x + 1, y2 + 1, color); } /*------------------------------------------------------------------*/ void -hline (ALLEGRO_BITMAP * bitmap, int x1, int y, int x2, int color) +hline (ALLEGRO_BITMAP * bitmap, int x1, int y, int x2, ALLEGRO_COLOR color) { // https://liballeg.org/stabledocs/en/alleg013.html#hline if (x2 < x1) @@ -502,17 +363,13 @@ hline (ALLEGRO_BITMAP * bitmap, int x1, int y, int x2, int color) x1 = x; } al_set_target_bitmap (bitmap); - if (color < 0 || color >= PALETTE_SIZE) - { - return; - } - ALLEGRO_COLOR al_color; - al_color = rgb_to_allegro_color(GLOBAL_PALETTE[color]); - al_draw_filled_rectangle (x1, y, x2 + 1, y + 1, al_color); + + + al_draw_filled_rectangle (x1, y, x2 + 1, y + 1, color); } void -line (ALLEGRO_BITMAP * bitmap, int x1, int y1, int x2, int y2, int color) +line (ALLEGRO_BITMAP * bitmap, int x1, int y1, int x2, int y2, ALLEGRO_COLOR color) { // https://liballeg.org/stabledocs/en/alleg013.html#line if (x1 == x2) @@ -527,12 +384,8 @@ line (ALLEGRO_BITMAP * bitmap, int x1, int y1, int x2, int y2, int color) } al_set_target_bitmap (bitmap); - if (color < 0 || color >= PALETTE_SIZE) - { - return; - } - ALLEGRO_COLOR al_color; - al_color = rgb_to_allegro_color(GLOBAL_PALETTE[color]); + + /* ugliest line drawing ever, but we don't care, this is never called */ int w = x2 - x1; @@ -543,7 +396,7 @@ line (ALLEGRO_BITMAP * bitmap, int x1, int y1, int x2, int y2, int color) { int x = ((i * x2) + ((d - i) * x1)) / d; int y = ((i * y2) + ((d - i) * y1)) / d; - al_put_pixel (x, y, al_color); + al_put_pixel (x, y, color); } } @@ -936,7 +789,7 @@ text_height (const ALLEGRO_FONT * f) /*------------------------------------------------------------------*/ void textout_ex (ALLEGRO_BITMAP * bmp, const ALLEGRO_FONT * f, const char *s, - int x, int y, int color, int bg) + int x, int y, ALLEGRO_COLOR color, ALLEGRO_COLOR bg) { // https://liballeg.org/stabledocs/en/alleg018.html#textout_ex int w = 0; @@ -947,14 +800,7 @@ textout_ex (ALLEGRO_BITMAP * bmp, const ALLEGRO_FONT * f, const char *s, rectfill (bmp, x, y, x + w - 1, y + h - 1, bg); al_set_target_bitmap (bmp); - if (color < 0 || color >= PALETTE_SIZE) - { - return; - } - ALLEGRO_COLOR al_color; - al_color = rgb_to_allegro_color(GLOBAL_PALETTE[color]); - - al_draw_text (f, al_color, x, y, 0, s); + al_draw_text (f, color, x, y, 0, s); } /*------------------------------------------------------------------*/ @@ -1135,11 +981,10 @@ stretch_blit (ALLEGRO_BITMAP * source, ALLEGRO_BITMAP * dest, /*------------------------------------------------------------------*/ ALLEGRO_BITMAP * -load_bitmap (const char *filename, PALETTE pal) +load_bitmap (const char *filename) { // https://liballeg.org/stabledocs/en/alleg014.html#load_bitmap ALLEGRO_BITMAP *bmp; - (void) pal; // Ignore palette parameter since Allegro 5 handles palettes differently // Try using flags to optimize loading performance bmp = al_load_bitmap_flags(filename, ALLEGRO_MEMORY_BITMAP); @@ -1599,14 +1444,9 @@ int set_gfx_mode(int card, int w, int h, int v_w, int v_h) { /*------------------------------------------------------------------*/ void set_palette(void *palette) { - // Update the global palette with the provided palette - // The palette parameter is expected to be PALETTE (RGB array) - if (palette) { - PALETTE *pal = (PALETTE *)palette; - for (int i = 0; i < PALETTE_SIZE; i++) { - GLOBAL_PALETTE[i] = (*pal)[i]; - } - } + // In Allegro 5 without palette mode, this is a no-op + // Colors are handled as direct RGB values (0xRRGGBB format) + (void)palette; // Stub for compatibility } /*------------------------------------------------------------------*/ @@ -1905,54 +1745,41 @@ void delete_file(const char *filename) { } /*------------------------------------------------------------------*/ -void ellipse (ALLEGRO_BITMAP * bitmap, int x, int y, int rx, int ry, int color) { +void ellipse (ALLEGRO_BITMAP * bitmap, int x, int y, int rx, int ry, ALLEGRO_COLOR color) { // Draw ellipse outline - Allegro 4 compatibility - if (color < 0 || color >= PALETTE_SIZE) { - return; - } - ALLEGRO_COLOR al_color = rgb_to_allegro_color(GLOBAL_PALETTE[color]); ALLEGRO_BITMAP *old_target = al_get_target_bitmap(); al_set_target_bitmap(bitmap); - al_draw_ellipse(x, y, rx, ry, al_color, 1.0); + al_draw_ellipse(x, y, rx, ry, color, 1.0); al_set_target_bitmap(old_target); } /*------------------------------------------------------------------*/ -void ellipsefill (ALLEGRO_BITMAP * bitmap, int x, int y, int rx, int ry, int color) { +void ellipsefill (ALLEGRO_BITMAP * bitmap, int x, int y, int rx, int ry, ALLEGRO_COLOR color) { // Draw filled ellipse - Allegro 4 compatibility - if (color < 0 || color >= PALETTE_SIZE) { - return; - } - ALLEGRO_COLOR al_color = rgb_to_allegro_color(GLOBAL_PALETTE[color]); ALLEGRO_BITMAP *old_target = al_get_target_bitmap(); al_set_target_bitmap(bitmap); - al_draw_filled_ellipse(x, y, rx, ry, al_color); + al_draw_filled_ellipse(x, y, rx, ry, color); al_set_target_bitmap(old_target); } /*------------------------------------------------------------------*/ -void circlefill (ALLEGRO_BITMAP * bitmap, int x, int y, int radius, int color) { +void circlefill (ALLEGRO_BITMAP * bitmap, int x, int y, int radius, ALLEGRO_COLOR color) { // Draw filled circle - Allegro 4 compatibility - if (color < 0 || color >= PALETTE_SIZE) { - return; - } - ALLEGRO_COLOR al_color = rgb_to_allegro_color(GLOBAL_PALETTE[color]); ALLEGRO_BITMAP *old_target = al_get_target_bitmap(); al_set_target_bitmap(bitmap); - al_draw_filled_circle(x, y, radius, al_color); + al_draw_filled_circle(x, y, radius, color); al_set_target_bitmap(old_target); } /*------------------------------------------------------------------*/ -void polygon (ALLEGRO_BITMAP * bitmap, int vertices, const int *points, int color) { +void polygon (ALLEGRO_BITMAP * bitmap, int vertices, const int *points, ALLEGRO_COLOR color) { // Draw polygon - Allegro 4 compatibility - if (color < 0 || color >= PALETTE_SIZE || vertices < 3) { + if (vertices < 3) { return; } - ALLEGRO_COLOR al_color = rgb_to_allegro_color(GLOBAL_PALETTE[color]); // Convert int array to float array for Allegro 5 float *float_points = malloc(vertices * 2 * sizeof(float)); @@ -1964,7 +1791,7 @@ void polygon (ALLEGRO_BITMAP * bitmap, int vertices, const int *points, int colo ALLEGRO_BITMAP *old_target = al_get_target_bitmap(); al_set_target_bitmap(bitmap); - al_draw_polygon(float_points, vertices, ALLEGRO_LINE_JOIN_NONE, al_color, 1.0, 0); + al_draw_polygon(float_points, vertices, ALLEGRO_LINE_JOIN_NONE, color, 1.0, 0); al_set_target_bitmap(old_target); free(float_points); @@ -2018,10 +1845,8 @@ int bestfit_color(PALETTE pal, int r, int g, int b) { /*------------------------------------------------------------------*/ -int save_bitmap(const char *filename, ALLEGRO_BITMAP *bmp, PALETTE pal) { +int save_bitmap(const char *filename, ALLEGRO_BITMAP *bmp) { // Allegro 4 compatibility function - saves a bitmap to file - // In Allegro 5, we use al_save_bitmap and ignore the palette parameter - (void)pal; // Palette ignored in Allegro 5 return al_save_bitmap(filename, bmp) ? 0 : -1; // Allegro 4 returns 0 on success } @@ -2049,3 +1874,80 @@ void scroll_screen(int x, int y) { // Note: This function was used for hardware scrolling in Allegro 4 // Modern systems handle this through different mechanisms } + +/*------------------------------------------------------------------*/ +/* lw_team_color: + * Computes the color for a team at a given intensity. + * Team colors (0-5): + * 0 = red (0,0,0) to (255,0,0) + * 1 = green (0,0,0) to (0,255,0) + * 2 = blue (0,0,0) to (0,0,255) + * 3 = yellow (0,0,0) to (255,255,0) + * 4 = cyan (0,0,0) to (0,255,255) + * 5 = magenta (0,0,0) to (255,0,255) + * Intensity: 0 (black) to 255 (full bright color) + */ +ALLEGRO_COLOR +lw_team_color(int team, int intensity) +{ + int r = 0, g = 0, b = 0; + + // Clamp intensity to 0-255 range + if (intensity < 0) intensity = 0; + if (intensity > 255) intensity = 255; + + // Clamp team to 0-5 range + team = team % 6; + if (team < 0) team = 0; + + switch (team) { + case 0: // Red + r = intensity; + break; + case 1: // Green + g = intensity; + break; + case 2: // Blue + b = intensity; + break; + case 3: // Yellow + r = intensity; + g = intensity; + break; + case 4: // Cyan + g = intensity; + b = intensity; + break; + case 5: // Magenta + r = intensity; + b = intensity; + break; + } + + return al_map_rgb(r, g, b); +} + +/*------------------------------------------------------------------*/ +/* is_color_light: + * Checks if a color is "light" (sum of RGB >= 3*128). + * Used to classify pixels as playable area vs walls in maps. + */ +int +is_color_light(ALLEGRO_COLOR c) +{ + int r = (int)(c.r * 255.0f); + int g = (int)(c.g * 255.0f); + int b = (int)(c.b * 255.0f); + return (r + g + b) >= (3 * 128); +} + +/*------------------------------------------------------------------*/ +/* is_color_dark: + * Checks if a color is "dark" (sum of RGB < 3*128). + * Opposite of is_color_light. + */ +int +is_color_dark(ALLEGRO_COLOR c) +{ + return !is_color_light(c); +} diff --git a/src/backport.h b/src/backport.h index 12e452f3..d4d83b22 100644 --- a/src/backport.h +++ b/src/backport.h @@ -113,6 +113,24 @@ #define LOCK_VARIABLE(x) #define LOCK_FUNCTION(x) +// Special color value for "no color" or transparent (was -1 in Allegro 4) +#define NO_COLOR (al_map_rgba(0, 0, 0, 0)) + +// Color selection constants (from old palette.h) +#define CHOOSE_COLOR_NUMBER 128 +#define CHOOSE_COLOR_WHITE 120 +#define CHOOSE_COLOR_BLACK 127 + +// Palette-related variables (from old palette.h/c) +extern int COLORS_PER_TEAM; + +// Team color computation (replaces palette-based color system) +ALLEGRO_COLOR lw_team_color(int team, int intensity); + +// Color classification helpers (sum of RGB >= 3*128 is light, < 3*128 is dark) +int is_color_light(ALLEGRO_COLOR c); +int is_color_dark(ALLEGRO_COLOR c); + /*==================================================================*/ /* types */ /*==================================================================*/ @@ -200,9 +218,9 @@ extern char empty_string[]; extern volatile char key[]; // GUI color variables for Allegro 4 compatibility -extern int gui_bg_color; -extern int gui_fg_color; -extern int gui_mg_color; +extern ALLEGRO_COLOR gui_bg_color; +extern ALLEGRO_COLOR gui_fg_color; +extern ALLEGRO_COLOR gui_mg_color; /*==================================================================*/ /* fonctions globales */ @@ -217,24 +235,24 @@ void show_mouse (ALLEGRO_BITMAP *bmp); int poll_mouse (void); int mouse_needs_poll (void); -void clear_to_color (ALLEGRO_BITMAP * bitmap, int color); -void putpixel (ALLEGRO_BITMAP * bitmap, int x, int y, int color); -void putpixel_fast (int x, int y, int color); -int getpixel (ALLEGRO_BITMAP * bitmap, int x, int y); +void clear_to_color (ALLEGRO_BITMAP * bitmap, ALLEGRO_COLOR color); +void putpixel (ALLEGRO_BITMAP * bitmap, int x, int y, ALLEGRO_COLOR color); +void putpixel_fast (int x, int y, ALLEGRO_COLOR color); +ALLEGRO_COLOR getpixel (ALLEGRO_BITMAP * bitmap, int x, int y); void rect (ALLEGRO_BITMAP * bitmap, int x1, int y1, int x2, int y2, - int color); + ALLEGRO_COLOR color); void rectfill (ALLEGRO_BITMAP * bitmap, int x1, int y1, int x2, int y2, - int color); + ALLEGRO_COLOR color); void rectfill_dotted (ALLEGRO_BITMAP * bitmap, int x1, int y1, int x2, int y2, - int fg, int bg); -void vline (ALLEGRO_BITMAP * bitmap, int x, int y1, int y2, int color); -void hline (ALLEGRO_BITMAP * bitmap, int x1, int y, int x2, int color); + ALLEGRO_COLOR fg, ALLEGRO_COLOR bg); +void vline (ALLEGRO_BITMAP * bitmap, int x, int y1, int y2, ALLEGRO_COLOR color); +void hline (ALLEGRO_BITMAP * bitmap, int x1, int y, int x2, ALLEGRO_COLOR color); void line (ALLEGRO_BITMAP * bitmap, int x1, int y1, int x2, int y2, - int color); -void ellipse (ALLEGRO_BITMAP * bitmap, int x, int y, int rx, int ry, int color); -void ellipsefill (ALLEGRO_BITMAP * bitmap, int x, int y, int rx, int ry, int color); -void circlefill (ALLEGRO_BITMAP * bitmap, int x, int y, int radius, int color); -void polygon (ALLEGRO_BITMAP * bitmap, int vertices, const int *points, int color); + ALLEGRO_COLOR color); +void ellipse (ALLEGRO_BITMAP * bitmap, int x, int y, int rx, int ry, ALLEGRO_COLOR color); +void ellipsefill (ALLEGRO_BITMAP * bitmap, int x, int y, int rx, int ry, ALLEGRO_COLOR color); +void circlefill (ALLEGRO_BITMAP * bitmap, int x, int y, int radius, ALLEGRO_COLOR color); +void polygon (ALLEGRO_BITMAP * bitmap, int vertices, const int *points, ALLEGRO_COLOR color); int usetc (char *s, int c); int ugetc (const char *s); @@ -257,7 +275,7 @@ char *uconvert_ascii (const char *s, char buf[], int size); int text_length (const ALLEGRO_FONT * f, const char *s); int text_height (const ALLEGRO_FONT * f); void textout_ex (ALLEGRO_BITMAP * bmp, const ALLEGRO_FONT * f, const char *s, - int x, int y, int color, int bg); + int x, int y, ALLEGRO_COLOR color, ALLEGRO_COLOR bg); void set_volume (int digi_volume, int midi_volume); int play_midi (ALLEGRO_SAMPLE *midi, int loop); @@ -292,8 +310,8 @@ void stretch_blit (ALLEGRO_BITMAP * source, ALLEGRO_BITMAP * dest, int source_x, int source_y, int source_width, int source_height, int dest_x, int dest_y, int dest_width, int dest_height); -ALLEGRO_BITMAP *load_bitmap (const char *filename, PALETTE pal); -int save_bitmap (const char *filename, ALLEGRO_BITMAP *bmp, PALETTE pal); +ALLEGRO_BITMAP *load_bitmap (const char *filename); +int save_bitmap (const char *filename, ALLEGRO_BITMAP *bmp); ALLEGRO_BITMAP *my_create_bitmap (int w, int h); ALLEGRO_BITMAP *my_create_memory_bitmap (int w, int h); ALLEGRO_BITMAP *my_create_video_bitmap (int w, int h); diff --git a/src/backportgui.c b/src/backportgui.c index 12551357..56ef11e3 100644 --- a/src/backportgui.c +++ b/src/backportgui.c @@ -281,7 +281,7 @@ centre_dialog (DIALOG * dialog) * Sets the foreground and background colors of all the objects in a dialog. */ void -set_dialog_color (DIALOG * dialog, int fg, int bg) +set_dialog_color (DIALOG * dialog, ALLEGRO_COLOR fg, ALLEGRO_COLOR bg) { int c; ALLEGRO_ASSERT (dialog); @@ -1567,7 +1567,7 @@ get_menu_pos (MENU_PLAYER * m, int c, int *x, int *y, int *w) static void draw_menu_item (MENU_PLAYER * m, int c) { - int fg, bg; + ALLEGRO_COLOR fg, bg; int x, y, w; char *buf, *tok1, *tok2; int my; @@ -2491,15 +2491,15 @@ d_menu_proc (int msg, DIALOG * d, int c) static DIALOG alert_dialog[] = { /* (dialog proc) (x) (y) (w) (h) (fg) (bg) (key) (flags) (d1) (d2) (dp) (dp2) (dp3) */ - {_gui_shadow_box_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL}, - {_gui_ctext_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL}, - {_gui_ctext_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL}, - {_gui_ctext_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL}, - {_gui_button_proc, 0, 0, 0, 0, 0, 0, 0, D_EXIT, 0, 0, NULL, NULL, NULL}, - {_gui_button_proc, 0, 0, 0, 0, 0, 0, 0, D_EXIT, 0, 0, NULL, NULL, NULL}, - {_gui_button_proc, 0, 0, 0, 0, 0, 0, 0, D_EXIT, 0, 0, NULL, NULL, NULL}, - {d_yield_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL}, - {NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL} + {_gui_shadow_box_proc, 0, 0, 0, 0, {0, 0, 0, 0}, {0, 0, 0, 0}, 0, 0, 0, 0, NULL, NULL, NULL}, + {_gui_ctext_proc, 0, 0, 0, 0, {0, 0, 0, 0}, {0, 0, 0, 0}, 0, 0, 0, 0, NULL, NULL, NULL}, + {_gui_ctext_proc, 0, 0, 0, 0, {0, 0, 0, 0}, {0, 0, 0, 0}, 0, 0, 0, 0, NULL, NULL, NULL}, + {_gui_ctext_proc, 0, 0, 0, 0, {0, 0, 0, 0}, {0, 0, 0, 0}, 0, 0, 0, 0, NULL, NULL, NULL}, + {_gui_button_proc, 0, 0, 0, 0, {0, 0, 0, 0}, {0, 0, 0, 0}, 0, D_EXIT, 0, 0, NULL, NULL, NULL}, + {_gui_button_proc, 0, 0, 0, 0, {0, 0, 0, 0}, {0, 0, 0, 0}, 0, D_EXIT, 0, 0, NULL, NULL, NULL}, + {_gui_button_proc, 0, 0, 0, 0, {0, 0, 0, 0}, {0, 0, 0, 0}, 0, D_EXIT, 0, 0, NULL, NULL, NULL}, + {d_yield_proc, 0, 0, 0, 0, {0, 0, 0, 0}, {0, 0, 0, 0}, 0, 0, 0, 0, NULL, NULL, NULL}, + {NULL, 0, 0, 0, 0, {0, 0, 0, 0}, {0, 0, 0, 0}, 0, 0, 0, 0, NULL, NULL, NULL} }; @@ -2623,7 +2623,7 @@ alert3 (AL_CONST char *s1, AL_CONST char *s2, AL_CONST char *s3, set_dialog_color (alert_dialog, gui_fg_color, gui_bg_color); for (c = 0; alert_dialog[c].proc; c++) if (alert_dialog[c].proc == _gui_ctext_proc) - alert_dialog[c].bg = -1; + alert_dialog[c].bg = NO_COLOR; clear_keybuf (); diff --git a/src/backportgui.h b/src/backportgui.h index 3e08092f..bdc2fad5 100644 --- a/src/backportgui.h +++ b/src/backportgui.h @@ -33,7 +33,7 @@ extern "C" { DIALOG_PROC proc; int x, y, w, h; /* position and size of the object */ - int fg, bg; /* foreground and background colors */ + ALLEGRO_COLOR fg, bg; /* foreground and background colors */ int key; /* keyboard shortcut (ASCII code) */ int flags; /* flags about the object state */ int d1, d2; /* any data the object might require */ @@ -182,9 +182,9 @@ extern "C" AL_VAR (int, gui_mouse_focus); - AL_VAR (int, gui_fg_color); - AL_VAR (int, gui_mg_color); - AL_VAR (int, gui_bg_color); + AL_VAR (ALLEGRO_COLOR, gui_fg_color); + AL_VAR (ALLEGRO_COLOR, gui_mg_color); + AL_VAR (ALLEGRO_COLOR, gui_bg_color); AL_VAR (int, gui_font_baseline); @@ -197,11 +197,11 @@ extern "C" AL_FUNC (ALLEGRO_BITMAP *, gui_get_screen, (void)); AL_FUNC (int, gui_textout_ex, (struct ALLEGRO_BITMAP * bmp, AL_CONST char *s, int x, int y, - int color, int bg, int centre)); + ALLEGRO_COLOR color, ALLEGRO_COLOR bg, int centre)); AL_FUNC (int, gui_strlen, (AL_CONST char *s)); AL_FUNC (void, position_dialog, (DIALOG * dialog, int x, int y)); AL_FUNC (void, centre_dialog, (DIALOG * dialog)); - AL_FUNC (void, set_dialog_color, (DIALOG * dialog, int fg, int bg)); + AL_FUNC (void, set_dialog_color, (DIALOG * dialog, ALLEGRO_COLOR fg, ALLEGRO_COLOR bg)); AL_FUNC (int, find_dialog_focus, (DIALOG * dialog)); AL_FUNC (int, offer_focus, (DIALOG * dialog, int obj, int *focus_obj, int force)); diff --git a/src/backportguiproc.c b/src/backportguiproc.c index cff34a73..99e23823 100644 --- a/src/backportguiproc.c +++ b/src/backportguiproc.c @@ -47,7 +47,7 @@ static int _dummy_c = 0; */ int gui_textout_ex (ALLEGRO_BITMAP * bmp, AL_CONST char *s, int x, int y, - int color, int bg, int centre) + ALLEGRO_COLOR color, ALLEGRO_COLOR bg, int centre) { char tmp[1024]; int hline_pos = -1; @@ -117,7 +117,7 @@ int gui_strlen (AL_CONST char *s) { ALLEGRO_ASSERT (s); - return gui_textout_ex (NULL, s, 0, 0, 0, 0, 0); + return gui_textout_ex (NULL, s, 0, 0, NO_COLOR, NO_COLOR, 0); } @@ -126,7 +126,7 @@ gui_strlen (AL_CONST char *s) * Draws a dotted rectangle, for showing an object has the input focus. */ static void -dotted_rect (int x1, int y1, int x2, int y2, int fg, int bg) +dotted_rect (int x1, int y1, int x2, int y2, ALLEGRO_COLOR fg, ALLEGRO_COLOR bg) { ALLEGRO_BITMAP *gui_bmp = gui_get_screen (); int x = ((x1 + y1) & 1) ? 1 : 0; @@ -214,7 +214,7 @@ d_box_proc (int msg, DIALOG * d, int c) ALLEGRO_ASSERT (d); if (msg == MSG_DRAW) { - int fg = (d->flags & D_DISABLED) ? gui_mg_color : d->fg; + ALLEGRO_COLOR fg = (d->flags & D_DISABLED) ? gui_mg_color : d->fg; ALLEGRO_BITMAP *gui_bmp = gui_get_screen (); rectfill (gui_bmp, d->x + 1, d->y + 1, d->x + d->w - 2, d->y + d->h - 2, @@ -238,8 +238,8 @@ d_shadow_box_proc (int msg, DIALOG * d, int c) ALLEGRO_ASSERT (d); if (msg == MSG_DRAW) { - int fg = (d->flags & D_DISABLED) ? gui_mg_color : d->fg; - int black = 0; // [FIXME:ufoot] sounds a bit hardcoded, double-check this + ALLEGRO_COLOR fg = (d->flags & D_DISABLED) ? gui_mg_color : d->fg; + ALLEGRO_COLOR black = al_map_rgb(0, 0, 0); // [FIXME:ufoot] sounds a bit hardcoded, double-check this ALLEGRO_BITMAP *gui_bmp = gui_get_screen (); rectfill (gui_bmp, d->x + 1, d->y + 1, d->x + d->w - 3, d->y + d->h - 3, @@ -285,7 +285,7 @@ d_text_proc (int msg, DIALOG * d, int c) ALLEGRO_ASSERT (d); if (msg == MSG_DRAW) { - int fg = (d->flags & D_DISABLED) ? gui_mg_color : d->fg; + ALLEGRO_COLOR fg = (d->flags & D_DISABLED) ? gui_mg_color : d->fg; ALLEGRO_FONT *oldfont = font; if (d->dp2) @@ -313,7 +313,7 @@ d_ctext_proc (int msg, DIALOG * d, int c) ALLEGRO_ASSERT (d); if (msg == MSG_DRAW) { - int fg = (d->flags & D_DISABLED) ? gui_mg_color : d->fg; + ALLEGRO_COLOR fg = (d->flags & D_DISABLED) ? gui_mg_color : d->fg; ALLEGRO_FONT *oldfont = font; if (d->dp2) @@ -342,7 +342,7 @@ d_rtext_proc (int msg, DIALOG * d, int c) ALLEGRO_ASSERT (d); if (msg == MSG_DRAW) { - int fg = (d->flags & D_DISABLED) ? gui_mg_color : d->fg; + ALLEGRO_COLOR fg = (d->flags & D_DISABLED) ? gui_mg_color : d->fg; ALLEGRO_FONT *oldfont = font; if (d->dp2) @@ -372,10 +372,11 @@ int d_button_proc (int msg, DIALOG * d, int c) { ALLEGRO_BITMAP *gui_bmp; - int state1, state2; - int black; + ALLEGRO_COLOR state1, state2; + ALLEGRO_COLOR black; int swap; int g; + int click_state1, click_state2; // Boolean states for MSG_CLICK ALLEGRO_ASSERT (d); gui_bmp = gui_get_screen (); @@ -403,7 +404,7 @@ d_button_proc (int msg, DIALOG * d, int c) d->y + d->h - 2 + g, state1); gui_textout_ex (gui_bmp, d->dp, d->x + d->w / 2 + g, d->y + d->h / 2 - text_height (font) / 2 + g, state1, - -1, TRUE); + NO_COLOR, TRUE); if (d->flags & D_SELECTED) { @@ -412,7 +413,7 @@ d_button_proc (int msg, DIALOG * d, int c) } else { - black = 0; // [FIXME:ufoot] sounds a bit hardcoded, double-check this + black = al_map_rgb(0, 0, 0); // [FIXME:ufoot] sounds a bit hardcoded, double-check this vline (gui_bmp, d->x + d->w - 1, d->y + 1, d->y + d->h - 2, black); hline (gui_bmp, d->x + 1, d->y + d->h - 1, d->x + d->w - 1, black); } @@ -439,26 +440,26 @@ d_button_proc (int msg, DIALOG * d, int c) case MSG_CLICK: /* what state was the button originally in? */ - state1 = d->flags & D_SELECTED; + click_state1 = d->flags & D_SELECTED; if (d->flags & D_EXIT) swap = FALSE; else - swap = state1; + swap = click_state1; /* track the mouse until it is released */ while (gui_mouse_b ()) { - state2 = ((gui_mouse_x () >= d->x) && (gui_mouse_y () >= d->y) && + click_state2 = ((gui_mouse_x () >= d->x) && (gui_mouse_y () >= d->y) && (gui_mouse_x () < d->x + d->w) && (gui_mouse_y () < d->y + d->h)); if (swap) - state2 = !state2; + click_state2 = !click_state2; /* redraw? */ - if (((state1) && (!state2)) || ((state2) && (!state1))) + if (((click_state1) && (!click_state2)) || ((click_state2) && (!click_state1))) { d->flags ^= D_SELECTED; - state1 = d->flags & D_SELECTED; + click_state1 = d->flags & D_SELECTED; object_message (d, MSG_DRAW, 0); } @@ -491,13 +492,17 @@ d_check_proc (int msg, DIALOG * d, int c) { ALLEGRO_BITMAP *gui_bmp = gui_get_screen (); int x, y, h; - int fg, bg; + ALLEGRO_COLOR fg, bg; ALLEGRO_ASSERT (d); if (msg == MSG_DRAW) { fg = (d->flags & D_DISABLED) ? gui_mg_color : d->fg; - bg = (d->bg < 0) ? gui_bg_color : d->bg; + // Check if bg is NO_COLOR (transparent) by comparing components + if (d->bg.r == 0 && d->bg.g == 0 && d->bg.b == 0 && d->bg.a == 0) + bg = gui_bg_color; + else + bg = d->bg; h = text_height (font); @@ -508,12 +513,12 @@ d_check_proc (int msg, DIALOG * d, int c) y = d->y + ((d->h - (h - gui_font_baseline)) / 2); x = d->x + - ((d->d1) ? 0 : gui_textout_ex (gui_bmp, d->dp, d->x, y, fg, -1, + ((d->d1) ? 0 : gui_textout_ex (gui_bmp, d->dp, d->x, y, fg, NO_COLOR, FALSE) + h / 2); rect (gui_bmp, x, y, x + h - 1, y + h - 1, fg); if (d->d1) - gui_textout_ex (gui_bmp, d->dp, x + h + h / 2, y, fg, -1, FALSE); + gui_textout_ex (gui_bmp, d->dp, x + h + h / 2, y, fg, NO_COLOR, FALSE); if (d->flags & D_SELECTED) { line (gui_bmp, x, y, x + h - 1, y + h - 1, fg); @@ -671,7 +676,8 @@ d_edit_proc (int msg, DIALOG * d, int c) { static int ignore_next_uchar = FALSE; ALLEGRO_BITMAP *gui_bmp; - int f, l, p, w, x, fg, b, scroll; + int f, l, p, w, x, b, scroll; + ALLEGRO_COLOR fg; char buf[16]; char *s; ALLEGRO_ASSERT (d); @@ -1047,7 +1053,7 @@ _handle_listbox_click (DIALOG * d) */ void _draw_scrollable_frame (DIALOG * d, int listsize, int offset, int height, - int fg_color, int bg) + ALLEGRO_COLOR fg_color, ALLEGRO_COLOR bg) { ALLEGRO_BITMAP *gui_bmp = gui_get_screen (); int i, len; @@ -1122,7 +1128,7 @@ _draw_listbox (DIALOG * d) { ALLEGRO_BITMAP *gui_bmp = gui_get_screen (); int height, listsize, i, len, bar, x, y, w; - int fg_color, fg, bg; + ALLEGRO_COLOR fg_color, fg, bg; char *sel = d->dp2; char s[1024]; @@ -1458,10 +1464,10 @@ d_text_list_proc (int msg, DIALOG * d, int c) void _draw_textbox (char *thetext, int *listsize, int draw, int offset, int wword, int tabsize, int x, int y, int w, int h, - int disabled, int fore, int deselect, int disable) + int disabled, ALLEGRO_COLOR fore, ALLEGRO_COLOR deselect, ALLEGRO_COLOR disable) { ALLEGRO_BITMAP *gui_bmp = gui_get_screen (); - int fg = fore; + ALLEGRO_COLOR fg = fore; int y1 = y + 4; int x1; int len; @@ -1675,7 +1681,7 @@ d_textbox_proc (int msg, DIALOG * d, int c) int height, bar, ret = D_O_K; int start, top, bottom, l; int used, delta; - int fg_color; + ALLEGRO_COLOR fg_color; ALLEGRO_ASSERT (d); fg_color = (d->flags & D_DISABLED) ? gui_mg_color : d->fg; @@ -1690,7 +1696,7 @@ d_textbox_proc (int msg, DIALOG * d, int c) _draw_textbox (d->dp, &d->d1, 0, /* DONT DRAW anything */ d->d2, !(d->flags & D_SELECTED), 8, d->x, d->y, d->w, d->h, - (d->flags & D_DISABLED), 0, 0, 0); + (d->flags & D_DISABLED), NO_COLOR, NO_COLOR, NO_COLOR); break; case MSG_DRAW: @@ -1698,7 +1704,7 @@ d_textbox_proc (int msg, DIALOG * d, int c) _draw_textbox (d->dp, &d->d1, 0, /* DONT DRAW anything */ d->d2, !(d->flags & D_SELECTED), 8, d->x, d->y, d->w, d->h, - (d->flags & D_DISABLED), 0, 0, 0); + (d->flags & D_DISABLED), NO_COLOR, NO_COLOR, NO_COLOR); if (d->d1 > height) { @@ -1836,7 +1842,7 @@ d_slider_proc (int msg, DIALOG * d, int c) ALLEGRO_BITMAP *gui_bmp = gui_get_screen (); ALLEGRO_BITMAP *slhan = NULL; int oldpos, newpos; - int sfg; /* slider foreground color */ + ALLEGRO_COLOR sfg; /* slider foreground color */ int vert = TRUE; /* flag: is slider vertical? */ int hh = 7; /* handle height (width for horizontal sliders) */ int hmar; /* handle margin */ diff --git a/src/capture.c b/src/capture.c index 5b36b3f0..93ae401b 100644 --- a/src/capture.c +++ b/src/capture.c @@ -56,11 +56,11 @@ #include +#include "backport.h" #include "capture.h" #include "viewport.h" #include "log.h" #include "init.h" -#include "palette.h" #include "config.h" #include "ticker.h" #include "macro.h" diff --git a/src/config.c b/src/config.c index d03fa5fb..f3341621 100644 --- a/src/config.c +++ b/src/config.c @@ -55,12 +55,12 @@ #include #include +#include "backport.h" #include "config.h" #include "disk.h" #include "joystick.h" #include "keyboard.h" #include "mouse.h" -#include "palette.h" #include "startup.h" #include "server.h" #include "lang.h" diff --git a/src/cursor.c b/src/cursor.c index e98988b9..4d25456b 100644 --- a/src/cursor.c +++ b/src/cursor.c @@ -55,11 +55,11 @@ #include #include +#include "backport.h" #include "army.h" #include "grad.h" #include "cursor.h" #include "mesh.h" -#include "palette.h" /*==================================================================*/ /* variables globales */ diff --git a/src/decal.c b/src/decal.c index 52b73614..9daab791 100644 --- a/src/decal.c +++ b/src/decal.c @@ -65,7 +65,7 @@ int PLAYING_TEAMS = 0; int ACTIVE_FIGHTERS[NB_TEAMS]; -int COLOR_FIRST_ENTRY[NB_TEAMS]; +// COLOR_FIRST_ENTRY removed - colors are now computed dynamically with lw_team_color() /*==================================================================*/ /* fonctions */ @@ -109,7 +109,7 @@ eliminate_team (int team) for (j = team; j < PLAYING_TEAMS; ++j) { ACTIVE_FIGHTERS[j] = ACTIVE_FIGHTERS[j + 1]; - COLOR_FIRST_ENTRY[j] = COLOR_FIRST_ENTRY[j + 1]; + // COLOR_FIRST_ENTRY removed - colors are computed dynamically for (i = 0; i < CURRENT_MESH_SIZE; ++i) { diff --git a/src/decal.h b/src/decal.h index 61f64d7c..04c0e3aa 100644 --- a/src/decal.h +++ b/src/decal.h @@ -63,7 +63,7 @@ extern int PLAYING_TEAMS; extern int ACTIVE_FIGHTERS[NB_TEAMS]; -extern int COLOR_FIRST_ENTRY[NB_TEAMS]; +// COLOR_FIRST_ENTRY removed - colors are now computed dynamically with lw_team_color() /*==================================================================*/ /* fonctions globales */ diff --git a/src/dialog.h b/src/dialog.h index 9b386f8b..9e86d187 100644 --- a/src/dialog.h +++ b/src/dialog.h @@ -60,7 +60,6 @@ #include "backport.h" #include "backportgui.h" #include "alleg2.h" -#include "palette.h" /*==================================================================*/ /* variables globales */ @@ -81,6 +80,15 @@ #define MENU_VIRTUAL_W 320 #define MENU_VIRTUAL_H 240 +// Menu colors - converted from palette indices to ALLEGRO_COLOR +// MENU_BG was palette index 16 (dark gray), MENU_FG was index 17 (light gray) +#define MENU_BG (al_map_rgb(64, 64, 64)) +#define MENU_FG (al_map_rgb(192, 192, 192)) + +// Special color value for "no color" or transparent (was -1 in Allegro 4) +// Use black with 0 alpha for now +#define NO_COLOR (al_map_rgba(0, 0, 0, 0)) + #define MENU_H_STANDARD 15 #define MENU_H_QUICK 15 #define MENU_H_SPACE 3 diff --git a/src/disk.c b/src/disk.c index 32023c60..93e2d3db 100644 --- a/src/disk.c +++ b/src/disk.c @@ -283,6 +283,7 @@ typedef struct { char *filename; off_t size; int index; + ALLEGRO_BITMAP *bmp; /* Pre-loaded bitmap (loaded on main thread) */ } map_file_info; /*------------------------------------------------------------------*/ @@ -294,7 +295,7 @@ typedef struct { } worker_job; /*------------------------------------------------------------------*/ -/* Worker thread function to load multiple maps */ +/* Worker thread function to process pre-loaded map bitmaps */ static void map_load_worker(void *arg) { @@ -303,12 +304,17 @@ map_load_worker(void *arg) if (job && job->files) { for (int i = 0; i < job->file_count; i++) { map_file_info *file = job->files[i]; - if (file && file->filename) { + if (file && file->bmp) { log_print_str("."); - void *map = lw_map_archive_raw(file->filename); + /* Process the pre-loaded bitmap (CPU-intensive, thread-safe) */ + void *map = lw_map_archive_raw_bmp(file->bmp, file->filename); if (map != NULL) { RAW_MAP[file->index] = map; + log_print_str("+"); + } else { + log_print_str("-"); } + /* Note: bmp is consumed by lw_map_archive_raw_bmp, don't free it here */ } } free(job->files); @@ -332,7 +338,7 @@ compare_map_size(const void *a, const void *b) /*------------------------------------------------------------------*/ /* Simple integer square root for worker count calculation */ -static int +static int __attribute__((unused)) isqrt(int n) { int x = n; @@ -364,7 +370,13 @@ read_map_dat () } /* First pass: collect all filenames and their sizes */ - map_file_info files[RAW_MAP_MAX_NUMBER]; + /* Allocate on heap to avoid stack overflow (each entry contains a 768-byte PALETTE) */ + map_file_info *files = calloc(RAW_MAP_MAX_NUMBER, sizeof(map_file_info)); + if (!files) { + al_close_directory(dir); + al_destroy_fs_entry(dir); + return false; + } int file_count = 0; ALLEGRO_FS_ENTRY *entry; @@ -388,22 +400,39 @@ read_map_dat () al_destroy_fs_entry(dir); if (file_count == 0) { + free(files); return false; } /* Sort files by size (largest first) for better load balancing */ qsort(files, file_count, sizeof(map_file_info), compare_map_size); + /* + * Load all bitmaps on the main thread (Allegro 5's al_load_bitmap is not thread-safe). + * Worker threads will process these pre-loaded bitmaps in parallel. + * This separates the I/O (main thread) from CPU-intensive processing (worker threads). + */ + for (int i = 0; i < file_count; i++) { + log_print_str("."); + files[i].bmp = al_load_bitmap_flags(files[i].filename, ALLEGRO_MEMORY_BITMAP); + /* If bitmap fails to load, bmp will be NULL and worker will skip it */ + } + /* Calculate optimal worker count: sqrt(file_count), min 1, max file_count */ - int worker_count = isqrt(file_count); + /* TEMPORARY: Force single-threaded to test if threading is causing the Metal error */ + int worker_count = 1; + /* int worker_count = isqrt(file_count); if (worker_count < 1) worker_count = 1; - if (worker_count > file_count) worker_count = file_count; + if (worker_count > file_count) worker_count = file_count; */ /* Allocate worker job structures */ worker_job *jobs = calloc(worker_count, sizeof(worker_job)); if (!jobs) { - /* Cleanup filenames */ + /* Cleanup filenames and bitmaps */ for (int i = 0; i < file_count; i++) { + if (files[i].bmp) { + al_destroy_bitmap(files[i].bmp); + } free(files[i].filename); } return false; @@ -419,6 +448,9 @@ read_map_dat () } free(jobs); for (int j = 0; j < file_count; j++) { + if (files[j].bmp) { + al_destroy_bitmap(files[j].bmp); + } free(files[j].filename); } return false; @@ -454,6 +486,9 @@ read_map_dat () } free(jobs); for (int i = 0; i < file_count; i++) { + if (files[i].bmp) { + al_destroy_bitmap(files[i].bmp); + } free(files[i].filename); } return false; @@ -492,6 +527,16 @@ read_map_dat () } } + log_print_str(" ["); + log_print_int(RAW_MAP_NUMBER); + log_print_str("/"); + log_print_int(file_count); + log_print_str("]"); + log_flush(); + + /* Free the files array */ + free(files); + return RAW_MAP_NUMBER > 0; } diff --git a/src/fighter.c b/src/fighter.c index 9f4534da..128a88f3 100644 --- a/src/fighter.c +++ b/src/fighter.c @@ -63,7 +63,6 @@ #include "grad.h" #include "mesh.h" #include "fighter.h" -#include "palette.h" #include "startup.h" #include "lwtime.h" @@ -137,9 +136,9 @@ erase_fighter (FIGHTER * f) static void disp_fighter (FIGHTER * f) { + int intensity = (f->health * 255) / MAX_FIGHTER_HEALTH; putpixel (CURRENT_AREA_DISP, f->x, f->y, - COLOR_FIRST_ENTRY[(int) (f->team)] - + (f->health * COLORS_PER_TEAM) / MAX_FIGHTER_HEALTH); + lw_team_color((int)(f->team), intensity)); } /*------------------------------------------------------------------*/ diff --git a/src/grad.c b/src/grad.c index 9e760b52..3e126adb 100644 --- a/src/grad.c +++ b/src/grad.c @@ -54,10 +54,11 @@ #include "alleg2.h" #include "area.h" +#include "backport.h" #include "decal.h" +#include "dialog.h" #include "grad.h" #include "mesh.h" -#include "palette.h" #include "startup.h" #include "lwtime.h" #include "config.h" @@ -93,7 +94,9 @@ create_gradient_bitmap (int team) { color = (temp->info[team].state.grad + AREA_START_GRADIENT) % COLORS_PER_TEAM; - putpixel_fast (x, y, color + COLOR_FIRST_ENTRY[team]); + // Convert gradient value (0-COLORS_PER_TEAM) to intensity (0-255) + int intensity = (color * 255) / COLORS_PER_TEAM; + putpixel_fast (x, y, lw_team_color(team, intensity)); } else putpixel_fast (x, y, MENU_BG); @@ -119,9 +122,15 @@ create_dir_bitmap (int team) for (x = 0; x < CURRENT_AREA_W; ++x) { if ((temp = CURRENT_AREA[i++].mesh) != NULL) - putpixel_fast (x, y, 134 - + (temp->info[team].state.dir / 4) * 42 - + (temp->info[team].state.dir % 4) * 10); + { + // Old palette code: 134 + (dir/4)*42 + (dir%4)*10 + // This was generating different colors based on direction + // For now, map direction to an intensity value + int dir_value = (temp->info[team].state.dir / 4) * 42 + + (temp->info[team].state.dir % 4) * 10; + int intensity = (dir_value * 255) / 134; // Scale to 0-255 + putpixel_fast (x, y, lw_team_color(team, intensity)); + } } return result; diff --git a/src/graphics.c b/src/graphics.c index 97f91587..43dad237 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -164,7 +164,7 @@ slider_menu_res (void *dp3, int d2) changed = dp3; *changed = 1; - my_set_palette (); + // my_set_palette (); // No longer needed in true color mode return 0; } @@ -178,7 +178,7 @@ slider_brightness (void *dp3, int d2) play_click (); CONFIG_BRIGHTNESS = d2; - my_set_palette (); + // my_set_palette (); // No longer needed in true color mode return 0; } @@ -271,7 +271,7 @@ graphic_options (void) fullscreen_changed = 0; display_back_image (); dp = my_init_dialog (d, choix); - my_fade_in (); + // my_fade_in (); // No longer needed in true color mode } else dp = my_init_dialog (d, choix); @@ -287,7 +287,7 @@ graphic_options (void) { if (d[13].d2 != CONFIG_GFX_MENU) { - my_fade_out (); + // my_fade_out (); // No longer needed in true color mode if (set_resolution (d[13].d2, 0, CONFIG_FULLSCREEN, NULL)) CONFIG_GFX_MENU = 0; else @@ -331,7 +331,7 @@ graphic_options (void) my_button_proc (MSG_DRAW, d + 11, 0); unscare_mouse (); fullscreen_changed = 1; - my_fade_out (); + // my_fade_out (); // No longer needed in true color mode set_resolution (d[13].d2, 0, CONFIG_FULLSCREEN, NULL); break; case 16: diff --git a/src/info.c b/src/info.c index 9a5c82dc..e6ab3411 100644 --- a/src/info.c +++ b/src/info.c @@ -56,12 +56,12 @@ #include "backport.h" #include "alleg2.h" +#include "dialog.h" #include "army.h" #include "back.h" #include "config.h" #include "info.h" #include "decal.h" -#include "palette.h" #include "maptex.h" #include "texture.h" #include "lwtime.h" @@ -236,7 +236,7 @@ display_time (int x, int y, int w, int h) buffer[4] = '0' + sec % 10; buffer[5] = 0; - textout_ex (INFO_BAR, font, buffer, x + 1, y + 1, -1, -1); + textout_ex (INFO_BAR, font, buffer, x + 1, y + 1, NO_COLOR, NO_COLOR); } /*------------------------------------------------------------------*/ @@ -263,7 +263,7 @@ display_horizontal_info (int w, int h, int epaisseur) barre_y, barre_x + barre_w - 1, barre_y + INFO_BAR_POS_H - 1, - COLOR_FIRST_ENTRY[i] + COLORS_PER_TEAM - 1); + lw_team_color(i, 255)); // Full brightness for team color } } @@ -291,7 +291,7 @@ display_vertical_info (int w, int h, int epaisseur) barre_y, barre_x + INFO_BAR_POS_W - 1, barre_y + barre_h - 1, - COLOR_FIRST_ENTRY[i] + COLORS_PER_TEAM - 1); + lw_team_color(i, 255)); // Full brightness for team color } } diff --git a/src/level.c b/src/level.c index 856e1fc6..30d90c1b 100644 --- a/src/level.c +++ b/src/level.c @@ -66,7 +66,6 @@ #include "map.h" #include "maptex.h" #include "menu.h" -#include "palette.h" #include "sound.h" #include "texture.h" #include "macro.h" @@ -104,7 +103,11 @@ palette_128 (DIALOG * d, int x, int y, int w, int h) d[k].h = h2; d[k].fg = MENU_FG; d[k].flags = D_EXIT; - d[k].bg = k + 128; + // Map k (0-127) to a team color with intensity + // Divide into 6 teams with gradients for each + int team = k / (128 / 6); + int intensity = (k % (128 / 6)) * 255 / (128 / 6); + d[k].bg = lw_team_color(team, intensity); } k = 0; for (i = 0; i < 12; ++i) @@ -179,7 +182,7 @@ display_chosen_level (void) LW_RANDOM_ON, CONFIG_USE_DEFAULT_TEXTURE); lw_maptex_set_bg_palette (CONFIG_LEVEL_MAP, CONFIG_LEVEL_BG, 0, LW_RANDOM_ON, CONFIG_USE_DEFAULT_TEXTURE); - my_set_palette (); + // my_set_palette (); // No longer needed in true color mode pour_voir = lw_maptex_create_map (CONFIG_LEVEL_MAP, CONFIG_LEVEL_FG, CONFIG_LEVEL_BG, 0, LW_RANDOM_ON, MIN_MAP_RES_W[CONFIG_MIN_MAP_RES], MIN_MAP_RES_H[CONFIG_MIN_MAP_RES], @@ -606,7 +609,7 @@ choose_map (void) buf1[0] = 0; buf2[0] = 0; display_back_image (); - set_palette_for_choose_color (); + // set_palette_for_choose_color (); // No longer needed in true color mode quick_buttons (d); retrieve_choose_level_xy (&x1, &x2, &x3, &x4, &x5, &x6, &x7, &x8, &y1, &y2, &y3, &y4, &y5, &y6, &y7, &y8); diff --git a/src/lw6.c b/src/lw6.c index 71ab5d2f..7572a79d 100644 --- a/src/lw6.c +++ b/src/lw6.c @@ -83,7 +83,7 @@ lw6_advertise_menu (int fade_in) if (fade_in) { - my_fade_in (); + // my_fade_in (); // No longer needed in true color mode } d[2].proc = NULL; diff --git a/src/map.c b/src/map.c index 55186281..1165d57a 100644 --- a/src/map.c +++ b/src/map.c @@ -72,9 +72,10 @@ /*==================================================================*/ #define LIGHT_OR_DARK_TRESHOLD 315 -#define CONSIDERED_AS_DARK 0x000000 /* Black RGB */ -#define CONSIDERED_AS_LIGHT 0xFFFFFF /* White RGB */ -#define PLAYABLE_AREA 1 +// Color constants converted to ALLEGRO_COLOR - these are now created inline where needed +#define CONSIDERED_AS_DARK_RGB 0x000000 /* Black RGB */ +#define CONSIDERED_AS_LIGHT_RGB 0xFFFFFF /* White RGB */ +#define PLAYABLE_AREA_RGB 0x010101 /* Very dark gray RGB for playable */ #define MINI_SIDE_SIZE 4 #define MINI_PLAYABLE_AREA 1024 @@ -82,6 +83,14 @@ /* fonctions */ /*==================================================================*/ +/*------------------------------------------------------------------*/ +/* Helper function to compare ALLEGRO_COLOR values */ +static int +colors_equal(ALLEGRO_COLOR c1, ALLEGRO_COLOR c2) +{ + return (c1.r == c2.r && c1.g == c2.g && c1.b == c2.b && c1.a == c2.a); +} + /*------------------------------------------------------------------*/ static int calc_zoom_factor (int w, int h, int min_w, int min_h) @@ -104,7 +113,7 @@ calc_zoom_factor (int w, int h, int min_w, int min_h) /*------------------------------------------------------------------*/ static void -sort_light_and_dark (ALLEGRO_BITMAP * bmp, PALETTE pal) +sort_light_and_dark (ALLEGRO_BITMAP * bmp) { int x, y; ALLEGRO_COLOR pixel_color; @@ -112,15 +121,13 @@ sort_light_and_dark (ALLEGRO_BITMAP * bmp, PALETTE pal) int brightness; ALLEGRO_COLOR light_color, dark_color; - (void) pal; /* Unused for RGB bitmaps */ - /* Create actual RGB colors from constants */ - light_color = al_map_rgb((CONSIDERED_AS_LIGHT >> 16) & 0xFF, - (CONSIDERED_AS_LIGHT >> 8) & 0xFF, - CONSIDERED_AS_LIGHT & 0xFF); - dark_color = al_map_rgb((CONSIDERED_AS_DARK >> 16) & 0xFF, - (CONSIDERED_AS_DARK >> 8) & 0xFF, - CONSIDERED_AS_DARK & 0xFF); + light_color = al_map_rgb((CONSIDERED_AS_LIGHT_RGB >> 16) & 0xFF, + (CONSIDERED_AS_LIGHT_RGB >> 8) & 0xFF, + CONSIDERED_AS_LIGHT_RGB & 0xFF); + dark_color = al_map_rgb((CONSIDERED_AS_DARK_RGB >> 16) & 0xFF, + (CONSIDERED_AS_DARK_RGB >> 8) & 0xFF, + CONSIDERED_AS_DARK_RGB & 0xFF); /* Set target bitmap once for efficiency */ al_set_target_bitmap (bmp); @@ -155,7 +162,7 @@ extract_significant_part (ALLEGRO_BITMAP * src) for (y = 0; y < al_get_bitmap_height (src); ++y) for (x = 0; x < al_get_bitmap_width (src); ++x) - if (getpixel (src, x, y) == CONSIDERED_AS_DARK) + if (is_color_dark(getpixel (src, x, y))) { if (min_x > x) min_x = x; @@ -185,14 +192,14 @@ extract_significant_part (ALLEGRO_BITMAP * src) /*-----------------------------------------------------------------*/ static int -spread_color_down (ALLEGRO_BITMAP * bmp, int color1, int color2) +spread_color_down (ALLEGRO_BITMAP * bmp, ALLEGRO_COLOR color1, ALLEGRO_COLOR color2) { int x, y, x1, y1, x2, y2, found = 0; al_set_target_bitmap (bmp); for (y = 0; y < al_get_bitmap_height (bmp); ++y) for (x = 0; x < al_get_bitmap_width (bmp); ++x) - if (getpixel (bmp, x, y) == color2) + if (colors_equal(getpixel (bmp, x, y), color2)) { x1 = x - 1; if (x1 < 0) @@ -207,22 +214,22 @@ spread_color_down (ALLEGRO_BITMAP * bmp, int color1, int color2) if (y2 > al_get_bitmap_height (bmp) - 1) y2 = al_get_bitmap_height (bmp) - 1; - if (getpixel (bmp, x2, y) == color1) + if (colors_equal(getpixel (bmp, x2, y), color1)) { putpixel_fast (x2, y, color2); found++; } - if (getpixel (bmp, x2, y2) == color1) + if (colors_equal(getpixel (bmp, x2, y2), color1)) { putpixel_fast (x2, y2, color2); found++; } - if (getpixel (bmp, x, y2) == color1) + if (colors_equal(getpixel (bmp, x, y2), color1)) { putpixel_fast (x, y2, color2); found++; } - if (getpixel (bmp, x1, y2) == color1) + if (colors_equal(getpixel (bmp, x1, y2), color1)) { putpixel_fast (x1, y2, color2); found++; @@ -234,14 +241,14 @@ spread_color_down (ALLEGRO_BITMAP * bmp, int color1, int color2) /*-----------------------------------------------------------------*/ static int -spread_color_up (ALLEGRO_BITMAP * bmp, int color1, int color2) +spread_color_up (ALLEGRO_BITMAP * bmp, ALLEGRO_COLOR color1, ALLEGRO_COLOR color2) { int x, y, x1, y1, x2, y2, found = 0; al_set_target_bitmap (bmp); for (y = al_get_bitmap_height (bmp) - 1; y >= 0; --y) for (x = al_get_bitmap_width (bmp) - 1; x >= 0; --x) - if (getpixel (bmp, x, y) == color2) + if (colors_equal(getpixel (bmp, x, y), color2)) { x1 = x - 1; if (x1 < 0) @@ -256,22 +263,22 @@ spread_color_up (ALLEGRO_BITMAP * bmp, int color1, int color2) if (y2 > al_get_bitmap_height (bmp) - 1) y2 = al_get_bitmap_height (bmp) - 1; - if (getpixel (bmp, x1, y) == color1) + if (colors_equal(getpixel (bmp, x1, y), color1)) { putpixel_fast (x1, y, color2); found++; } - if (getpixel (bmp, x1, y1) == color1) + if (colors_equal(getpixel (bmp, x1, y1), color1)) { putpixel_fast (x1, y1, color2); found++; } - if (getpixel (bmp, x, y1) == color1) + if (colors_equal(getpixel (bmp, x, y1), color1)) { putpixel_fast (x, y1, color2); found++; } - if (getpixel (bmp, x2, y1) == color1) + if (colors_equal(getpixel (bmp, x2, y1), color1)) { putpixel_fast (x2, y1, color2); found++; @@ -289,20 +296,32 @@ check_if_playable (ALLEGRO_BITMAP * bmp) int x = 0, y = 0, x0, y0; int unplayable = 0; int playable_place = 0; + ALLEGRO_COLOR light_color, dark_color, playable_color; + + /* Create ALLEGRO_COLOR from RGB constants */ + light_color = al_map_rgb((CONSIDERED_AS_LIGHT_RGB >> 16) & 0xFF, + (CONSIDERED_AS_LIGHT_RGB >> 8) & 0xFF, + CONSIDERED_AS_LIGHT_RGB & 0xFF); + dark_color = al_map_rgb((CONSIDERED_AS_DARK_RGB >> 16) & 0xFF, + (CONSIDERED_AS_DARK_RGB >> 8) & 0xFF, + CONSIDERED_AS_DARK_RGB & 0xFF); + playable_color = al_map_rgb((PLAYABLE_AREA_RGB >> 16) & 0xFF, + (PLAYABLE_AREA_RGB >> 8) & 0xFF, + PLAYABLE_AREA_RGB & 0xFF); /* * Now we draw the "outside" of the map. This is usefull * to avoid bugs (core dumps) if the map is not correctly drawn. */ - hline (bmp, 0, 0, al_get_bitmap_width (bmp) - 1, CONSIDERED_AS_DARK); - hline (bmp, 0, al_get_bitmap_height (bmp) - 1, al_get_bitmap_width (bmp) - 1, CONSIDERED_AS_DARK); - vline (bmp, 0, 0, al_get_bitmap_height (bmp) - 1, CONSIDERED_AS_DARK); - vline (bmp, al_get_bitmap_width (bmp) - 1, 0, al_get_bitmap_height (bmp) - 1, CONSIDERED_AS_DARK); + hline (bmp, 0, 0, al_get_bitmap_width (bmp) - 1, dark_color); + hline (bmp, 0, al_get_bitmap_height (bmp) - 1, al_get_bitmap_width (bmp) - 1, dark_color); + vline (bmp, 0, 0, al_get_bitmap_height (bmp) - 1, dark_color); + vline (bmp, al_get_bitmap_width (bmp) - 1, 0, al_get_bitmap_height (bmp) - 1, dark_color); x0 = y0 = -1; for (y = 0; y < al_get_bitmap_height (bmp) && y0 < 0; ++y) for (x = 0; x < al_get_bitmap_width (bmp) && x0 < 0; ++x) - if (getpixel (bmp, x, y) == CONSIDERED_AS_LIGHT) + if (is_color_light(getpixel (bmp, x, y))) { x0 = x; y0 = y; @@ -310,19 +329,23 @@ check_if_playable (ALLEGRO_BITMAP * bmp) if (x0 > 0 && y0 > 0) { - putpixel (bmp, x, y, PLAYABLE_AREA); - while (spread_color_down (bmp, CONSIDERED_AS_LIGHT, - PLAYABLE_AREA) - + spread_color_up (bmp, CONSIDERED_AS_LIGHT, PLAYABLE_AREA)); + putpixel (bmp, x, y, playable_color); + while (spread_color_down (bmp, light_color, playable_color) + + spread_color_up (bmp, light_color, playable_color)); } - else + else { + log_print_str("L"); unplayable |= 1; + } for (y = 0; y < al_get_bitmap_height (bmp); ++y) for (x = 0; x < al_get_bitmap_width (bmp); ++x) - if (getpixel (bmp, x, y) == PLAYABLE_AREA) + if (is_color_light(getpixel (bmp, x, y))) ++playable_place; + if (playable_place < MINI_PLAYABLE_AREA) { + log_print_str("S"); + } unplayable |= (playable_place < MINI_PLAYABLE_AREA); return (!unplayable); @@ -330,13 +353,14 @@ check_if_playable (ALLEGRO_BITMAP * bmp) /*-----------------------------------------------------------------*/ static void -fill_with_fg_and_bg (ALLEGRO_BITMAP * bmp, int fg, int bg) +fill_with_fg_and_bg (ALLEGRO_BITMAP * bmp, ALLEGRO_COLOR fg, ALLEGRO_COLOR bg) { int x, y; /* * We set up the real fg and bg color instead of the * CONSIDERED_AS_... constants. + * Light pixels become bg (playable area), dark pixels become fg (walls). */ al_set_target_bitmap (bmp); for (y = 0; y < al_get_bitmap_height (bmp); ++y) @@ -344,7 +368,7 @@ fill_with_fg_and_bg (ALLEGRO_BITMAP * bmp, int fg, int bg) for (x = 0; x < al_get_bitmap_width (bmp); ++x) { putpixel_fast (x, y, - getpixel (bmp, x, y) == PLAYABLE_AREA ? bg : fg); + is_color_light(getpixel (bmp, x, y)) ? bg : fg); } } } @@ -354,36 +378,42 @@ static void convert_to_buffer (ALLEGRO_BITMAP * bmp, char *buffer, int *size, int *bg_size) { - int pos_src, l, wh; - char *data; + int x, y, l, w, h; + int is_light; - wh = al_get_bitmap_height (bmp) * al_get_bitmap_width (bmp); - data = NULL; // TODO: implement bitmap->dat equivalent with al_lock_bitmap - pos_src = 0; + w = al_get_bitmap_width (bmp); + h = al_get_bitmap_height (bmp); (*size) = 0; (*bg_size) = 0; - while (pos_src < wh) + for (y = 0; y < h; ++y) { - l = 0; - if (data[pos_src] != PLAYABLE_AREA) + for (x = 0; x < w; ) { - while (pos_src < wh && (data[pos_src] != PLAYABLE_AREA) && l < 127) + l = 0; + is_light = is_color_light(getpixel(bmp, x, y)); + + if (is_light) { - l++; - pos_src++; + // Count consecutive light (playable) pixels + while (x < w && is_color_light(getpixel(bmp, x, y)) && l < 127) + { + l++; + x++; + } + buffer[(*size)++] = -l; + (*bg_size) += l; } - buffer[(*size)++] = l; - } - else - { - while (pos_src < wh && (data[pos_src] == PLAYABLE_AREA) && l < 127) + else { - l++; - pos_src++; + // Count consecutive dark (wall) pixels + while (x < w && is_color_dark(getpixel(bmp, x, y)) && l < 127) + { + l++; + x++; + } + buffer[(*size)++] = l; } - buffer[(*size)++] = -l; - (*bg_size) += l; } } buffer[(*size)++] = 0; @@ -391,8 +421,7 @@ convert_to_buffer (ALLEGRO_BITMAP * bmp, char *buffer, int *size, /*------------------------------------------------------------------*/ void * -lw_map_archive_raw_bmp (ALLEGRO_BITMAP * bmp, PALETTE pal, - const char *filename) +lw_map_archive_raw_bmp (ALLEGRO_BITMAP * bmp, const char *filename) { int w = 0, h = 0, size = 0, bg_size = 0; ALLEGRO_BITMAP *sub_bmp; @@ -402,24 +431,39 @@ lw_map_archive_raw_bmp (ALLEGRO_BITMAP * bmp, PALETTE pal, char readable_name_buffer[LW_MAP_READABLE_NAME_SIZE + 1]; char system_name_buffer[LW_MAP_SYSTEM_NAME_SIZE + 1]; - if (bmp) - { - sort_light_and_dark (bmp, pal); - sub_bmp = extract_significant_part (bmp); - if (sub_bmp) - { - w = al_get_bitmap_width (sub_bmp); - h = al_get_bitmap_height (sub_bmp); - if (check_if_playable (sub_bmp)) - { - temp = malloc_in_big_data_bottom (w * h + 1); - if (temp) - convert_to_buffer (sub_bmp, temp, &size, &bg_size); - } - al_destroy_bitmap (sub_bmp); - } - al_destroy_bitmap (bmp); - } + if (!bmp) { + log_print_str("B"); + return NULL; + } + + sort_light_and_dark (bmp); + sub_bmp = extract_significant_part (bmp); + if (!sub_bmp) { + log_print_str("E"); + al_destroy_bitmap (bmp); + return NULL; + } + + w = al_get_bitmap_width (sub_bmp); + h = al_get_bitmap_height (sub_bmp); + if (!check_if_playable (sub_bmp)) { + log_print_str("P"); + al_destroy_bitmap (sub_bmp); + al_destroy_bitmap (bmp); + return NULL; + } + + temp = malloc_in_big_data_bottom (w * h + 1); + if (!temp) { + log_print_str("M"); + al_destroy_bitmap (sub_bmp); + al_destroy_bitmap (bmp); + return NULL; + } + + convert_to_buffer (sub_bmp, temp, &size, &bg_size); + al_destroy_bitmap (sub_bmp); + al_destroy_bitmap (bmp); if (temp) { @@ -478,13 +522,12 @@ void * lw_map_archive_raw (const char *filename) { ALLEGRO_BITMAP *bmp; - PALETTE pal; void *result = NULL; - bmp = load_bitmap (filename, pal); + bmp = al_load_bitmap_flags(filename, ALLEGRO_MEMORY_BITMAP); if (bmp) { - result = lw_map_archive_raw_bmp (bmp, pal, filename); + result = lw_map_archive_raw_bmp (bmp, filename); } return result; @@ -527,21 +570,27 @@ lw_map_create_bicolor (int num, int fg, int bg, int network, int random, int min_w, int min_h, int *zoom_factor) { - int pos_dst, pos_src, i, j, l, color; + int pos_dst, pos_src, i, j, l; + ALLEGRO_COLOR color; short w, h; - signed char *data_dst, *data_src; + signed char *data_src; ALLEGRO_BITMAP *result = NULL; ALLEGRO_BITMAP *temp; void *raw_map; int size, surface; int x, y; + ALLEGRO_COLOR fg_color, bg_color; raw_map = lw_map_get_safe (num, network, random); + /* Convert int colors to ALLEGRO_COLOR - fg/bg are palette indices or RGB values */ + fg_color = al_map_rgb((fg >> 16) & 0xFF, (fg >> 8) & 0xFF, fg & 0xFF); + bg_color = al_map_rgb((bg >> 16) & 0xFF, (bg >> 8) & 0xFF, bg & 0xFF); + data_src = raw_map; data_src += 8 + LW_MAP_SYSTEM_NAME_SIZE + LW_MAP_READABLE_NAME_SIZE; - /* + /* * We read the header (size + geometry) */ lw_serial_get_map_header (raw_map, &size, &w, &h); @@ -554,18 +603,33 @@ lw_map_create_bicolor (int num, int fg, int bg, if (temp) { - data_dst = NULL; // TODO: implement bitmap->dat equivalent with al_lock_bitmap + ALLEGRO_COLOR dark_color, light_color, pixel_color; + int px, py; + + dark_color = al_map_rgb((CONSIDERED_AS_DARK_RGB >> 16) & 0xFF, + (CONSIDERED_AS_DARK_RGB >> 8) & 0xFF, + CONSIDERED_AS_DARK_RGB & 0xFF); + light_color = al_map_rgb((CONSIDERED_AS_LIGHT_RGB >> 16) & 0xFF, + (CONSIDERED_AS_LIGHT_RGB >> 8) & 0xFF, + CONSIDERED_AS_LIGHT_RGB & 0xFF); + + al_set_target_bitmap(temp); while (pos_src < size && (l = data_src[pos_src++]) != 0) { if (l > 0) - color = CONSIDERED_AS_DARK; + pixel_color = dark_color; else { l = -l; - color = CONSIDERED_AS_LIGHT; + pixel_color = light_color; } for (i = 0; i < l && pos_dst < surface; ++i) - data_dst[pos_dst++] = color; + { + px = pos_dst % w; + py = pos_dst / w; + putpixel_fast(px, py, pixel_color); + pos_dst++; + } } /* @@ -574,7 +638,7 @@ lw_map_create_bicolor (int num, int fg, int bg, */ if (check_if_playable (temp)) { - fill_with_fg_and_bg (temp, fg, bg); + fill_with_fg_and_bg (temp, fg_color, bg_color); result = my_create_memory_bitmap (w * (*zoom_factor), h * (*zoom_factor)); @@ -614,7 +678,8 @@ ALLEGRO_BITMAP * lw_map_create_textured (int num, int fg, int bg, int network, int random, int min_w, int min_h) { - int x, y, w, h, color; + int x, y, w, h; + ALLEGRO_COLOR color; ALLEGRO_BITMAP *result = NULL, *bg_tex, *fg_tex; int fg_w, fg_h; int bg_w, bg_h; @@ -650,7 +715,7 @@ lw_map_create_textured (int num, int fg, int bg, for (y = 0; y < h; ++y) for (x = 0; x < w; ++x) { - if (getpixel (result, x, y)) + if (is_color_light(getpixel (result, x, y))) { color = getpixel (fg_tex, (x / zoom_factor_fg) % fg_w, diff --git a/src/map.h b/src/map.h index 39087d20..c9aa6da0 100644 --- a/src/map.h +++ b/src/map.h @@ -57,7 +57,6 @@ #include -#include "palette.h" /*==================================================================*/ /* constants */ @@ -71,8 +70,7 @@ /*==================================================================*/ void *lw_map_archive_raw (const char *filename); -void *lw_map_archive_raw_bmp (ALLEGRO_BITMAP * bmp, PALETTE pal, - const char *filename); +void *lw_map_archive_raw_bmp (ALLEGRO_BITMAP * bmp, const char *filename); ALLEGRO_BITMAP *lw_map_create_bicolor (int num, int fg, int bg, int network, int random, int min_w, int min_h, int *zoom_factor); diff --git a/src/maptex.c b/src/maptex.c index 5bbfc511..0c42d359 100644 --- a/src/maptex.c +++ b/src/maptex.c @@ -53,10 +53,10 @@ #include +#include "backport.h" #include "maptex.h" #include "map.h" #include "texture.h" -#include "palette.h" #include "disk.h" /*==================================================================*/ @@ -185,9 +185,8 @@ lw_maptex_set_fg_palette (int num, { int found; - set_fg_texture_palette (calc_real_texture_number - (num, fg, network, random, use_default_texture, - &found)); + // set_fg_texture_palette - No longer needed in true color mode + calc_real_texture_number(num, fg, network, random, use_default_texture, &found); } /*-----------------------------------------------------------------*/ @@ -198,7 +197,6 @@ lw_maptex_set_bg_palette (int num, { int found; - set_bg_texture_palette (calc_real_texture_number - (num, bg, network, random, use_default_texture, - &found)); + // set_bg_texture_palette - No longer needed in true color mode + calc_real_texture_number(num, bg, network, random, use_default_texture, &found); } diff --git a/src/menu.c b/src/menu.c index 613e4e98..80f464b0 100644 --- a/src/menu.c +++ b/src/menu.c @@ -117,7 +117,7 @@ main_menu (int fade_in) if (fade_in) { - my_fade_in (); + // my_fade_in (); // No longer needed in true color mode } while (retour != MENU_EXIT) diff --git a/src/mesh.c b/src/mesh.c index 3e65dce5..be9b844c 100644 --- a/src/mesh.c +++ b/src/mesh.c @@ -122,7 +122,7 @@ create_first_mesher (ALLEGRO_BITMAP * map) for (y = 0; y < h; ++y) for (x = 0; x < w; ++x) - result[y * w + x].used = (getpixel (map, x, y) == MESH_FG) ? 0 : 1; + result[y * w + x].used = is_color_light(getpixel (map, x, y)) ? 0 : 1; for (y = 1; y < h - 1; ++y) for (x = 1; x < w - 1; ++x) @@ -423,12 +423,18 @@ create_mesh_bitmap (int mode) color = i; } - rectfill (result, CURRENT_MESH[i].x, - CURRENT_MESH[i].y, - CURRENT_MESH[i].x + - CURRENT_MESH[i].side.size - 1, - CURRENT_MESH[i].y + - CURRENT_MESH[i].side.size - 1, 96 + color % 32); + // Create a color based on mesh index for visualization + // Map the old palette index (96 + color % 32) to a grayscale or color + { + int intensity = 96 + (color % 32) * 5; // Scale to 0-255 range + ALLEGRO_COLOR mesh_color = al_map_rgb(intensity, intensity, intensity); + rectfill (result, CURRENT_MESH[i].x, + CURRENT_MESH[i].y, + CURRENT_MESH[i].x + + CURRENT_MESH[i].side.size - 1, + CURRENT_MESH[i].y + + CURRENT_MESH[i].side.size - 1, mesh_color); + } } } diff --git a/src/message.c b/src/message.c index 0159cbc2..8ceb59a2 100644 --- a/src/message.c +++ b/src/message.c @@ -116,7 +116,7 @@ display_message (void) for (i = 0; i < MESSAGE_NB; ++i) textout_ex (NEXT_SCREEN, font, MESSAGE[i], al_get_bitmap_width (NEXT_SCREEN) - text_length (font, MESSAGE[i]), - al_get_bitmap_height (NEXT_SCREEN) - (MESSAGE_NB - i) * h, -1, -1); + al_get_bitmap_height (NEXT_SCREEN) - (MESSAGE_NB - i) * h, NO_COLOR, NO_COLOR); } /*------------------------------------------------------------------*/ diff --git a/src/options.c b/src/options.c index af40c6c4..3416519e 100644 --- a/src/options.c +++ b/src/options.c @@ -121,7 +121,7 @@ options (void) gfxmode_change = 0; display_back_image (); dp = my_init_dialog (d, choix); - my_fade_in (); + // my_fade_in (); // No longer needed in true color mode } else { diff --git a/src/palette.c b/src/palette.c deleted file mode 100644 index 26e83cbc..00000000 --- a/src/palette.c +++ /dev/null @@ -1,421 +0,0 @@ -/********************************************************************/ -/* */ -/* L I QQ U U I DD W W A RR 555 */ -/* L I Q Q U U I D D W W A A R R 5 */ -/* L I Q Q U U I D D W W W AAA RR 55 */ -/* L I Q Q U U I D D WW WW A A R R 5 */ -/* LLL I Q Q U I DD W W A A R R 55 */ -/* */ -/* b */ -/* bb y y */ -/* b b yyy */ -/* bb y */ -/* yy */ -/* */ -/* U U FFF O O TTT */ -/* U U F O O O O T */ -/* U U TIRET FF O O O O T */ -/* U U F O O O O T */ -/* U F O O T */ -/* */ -/********************************************************************/ - -/*****************************************************************************/ -/* Liquid War is a multiplayer wargame */ -/* Copyright (C) 1998-2025 Christian Mauduit */ -/* */ -/* 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 */ -/* */ -/* Liquid War homepage : https://ufoot.org/liquidwar/v5 */ -/* Contact author : ufoot@ufoot.org */ -/*****************************************************************************/ - -/********************************************************************/ -/* nom : palette.c */ -/* contenu : gestion de la palette de couleurs */ -/* date de modif : 3 mai 98 */ -/********************************************************************/ - -/*==================================================================*/ -/* includes */ -/*==================================================================*/ - -#include "config.h" -#include "decal.h" -#include "disk.h" -#include "palette.h" -#include "network.h" -#include "mouse.h" -#include "texture.h" - -/*==================================================================*/ -/* constantes */ -/*==================================================================*/ - -#define BG_TEXTURE_DEFAULT_COLOR 120 -#define FG_TEXTURE_DEFAULT_COLOR 127 - -/*==================================================================*/ -/* variables globales */ -/*==================================================================*/ - -int COLORS_PER_TEAM = 0; -PALETTE GLOBAL_PALETTE; - -/*==================================================================*/ -/* fonctions */ -/*==================================================================*/ - -/*------------------------------------------------------------------*/ -/* mise en place de la palette, si necessaire */ -/*------------------------------------------------------------------*/ - -/*------------------------------------------------------------------*/ -static int -sqrt255 (int i) -{ - int result; - - result = fixsqrt (i * 256) / 256; - if (result > 255) - result = 255; - - return result; -} - -/*------------------------------------------------------------------*/ -static int -sqr255 (int i) -{ - int result; - - result = (i * i) / 256; - if (result > 255) - result = 255; - - return result; -} - -/*------------------------------------------------------------------*/ -static void -change_palette_brightness (PALETTE old_pal, PALETTE new_pal) -{ - int r, g, b; - int i; - int brightness; - RGB *rgb; - - brightness = CONFIG_BRIGHTNESS - 8; - if (brightness != 0) - for (i = 0; i < 256; ++i) - { - rgb = old_pal + i; - r = rgb->r; - g = rgb->g; - b = rgb->b; - - if (brightness > 0) - { - r = (brightness * sqrt255 (r) + (8 - brightness) * r) / 8; - g = (brightness * sqrt255 (g) + (8 - brightness) * g) / 8; - b = (brightness * sqrt255 (b) + (8 - brightness) * b) / 8; - } - if (brightness < 0) - { - r = (-brightness * sqr255 (r) + (8 + brightness) * r) / 8; - g = (-brightness * sqr255 (g) + (8 + brightness) * g) / 8; - b = (-brightness * sqr255 (b) + (8 + brightness) * b) / 8; - } - - rgb = new_pal + i; - rgb->r = r; - rgb->g = g; - rgb->b = b; - } - else - for (i = 0; i < 256; ++i) - new_pal[i] = old_pal[i]; -} - -/*------------------------------------------------------------------*/ -void -my_set_palette (void) -{ - PALETTE old_pal, corrected_pal; - int i, equal = 1; - - change_palette_brightness (GLOBAL_PALETTE, corrected_pal); - - get_palette (old_pal); - for (i = 0; i < 256 && equal; ++i) - { - equal = equal && (corrected_pal[i].r == old_pal[i].r); - equal = equal && (corrected_pal[i].g == old_pal[i].g); - equal = equal && (corrected_pal[i].b == old_pal[i].b); - } - if (!equal) - set_palette (corrected_pal); -} - -/*------------------------------------------------------------------*/ -static void -set_raw_texture_palette (void *ptr, int first) -{ - int i; - char *data; - - data = ptr; - data += 4 + LW_TEXTURE_SYSTEM_NAME_SIZE; - for (i = first; i < first + 32; ++i) - { - GLOBAL_PALETTE[i].r = *(data++); - GLOBAL_PALETTE[i].g = *(data++); - GLOBAL_PALETTE[i].b = *(data++); - } -} - -/*------------------------------------------------------------------*/ -static void -get_mono_texture_color (RGB * rgb, int num) -{ - int h1, s1, v1, r, g, b; - float h2, s2, v2; - float h[] = { 0, 20, 40, 70, 110, 150, 180, 210, 240, 270, 300, 330 }; - float s[] = { 1, 0.7, 0.4, 1, 0.5, 1, 0.5, 1, 0.5, 1 }; - float v[] = { 1, 1, 1, 0.8, 0.8, 0.6, 0.6, 0.3, 0.3, 0.1 }; - - h1 = num / 10; - s1 = num % 10; - v1 = s1; - - if (h1 < 12) - { - h2 = h[h1]; - s2 = s[s1]; - v2 = v[v1]; - } - else - { - h2 = 0; - s2 = 0; - v2 = 127 - num; - v2 /= 7.; - } - - hsv_to_rgb (h2, s2, v2, &r, &g, &b); - - rgb->r = r; - rgb->g = g; - rgb->b = b; - /* *rgb=CHOOSE_PALETTE [32+num]; */ -} - -/*------------------------------------------------------------------*/ -static void -set_mono_texture_palette (int num, int first) -{ - get_mono_texture_color (GLOBAL_PALETTE + first, num); -} - - -/*------------------------------------------------------------------*/ -void -set_bg_texture_palette (int num) -{ - if (num < CHOOSE_COLOR_NUMBER) - { - set_mono_texture_palette (num, BG_TEXTURE_FIRST_COLOR); - } - else - { - if (num >= CHOOSE_COLOR_NUMBER - && num < CHOOSE_COLOR_NUMBER + RAW_TEXTURE_NUMBER) - { - if (LOADED_TEXTURE) - { - set_raw_texture_palette (RAW_TEXTURE - [num - CHOOSE_COLOR_NUMBER], - BG_TEXTURE_FIRST_COLOR); - } - else - { - set_mono_texture_palette (BG_TEXTURE_DEFAULT_COLOR, - BG_TEXTURE_FIRST_COLOR); - } - } - - if (num >= CHOOSE_COLOR_NUMBER + RAW_TEXTURE_NUMBER - && num < - CHOOSE_COLOR_NUMBER + RAW_TEXTURE_NUMBER + RAW_MAPTEX_NUMBER) - { - if (LOADED_MAPTEX) - { - set_raw_texture_palette (RAW_MAPTEX - [num - - (CHOOSE_COLOR_NUMBER + - RAW_TEXTURE_NUMBER)], - BG_TEXTURE_FIRST_COLOR); - } - else - { - set_mono_texture_palette (BG_TEXTURE_DEFAULT_COLOR, - BG_TEXTURE_FIRST_COLOR); - } - } - } -} - -/*------------------------------------------------------------------*/ -void -set_fg_texture_palette (int num) -{ - if (num < CHOOSE_COLOR_NUMBER) - { - set_mono_texture_palette (num, FG_TEXTURE_FIRST_COLOR); - } - else - { - if (num >= CHOOSE_COLOR_NUMBER - && num < CHOOSE_COLOR_NUMBER + RAW_TEXTURE_NUMBER) - { - if (LOADED_TEXTURE) - { - set_raw_texture_palette (RAW_TEXTURE - [num - CHOOSE_COLOR_NUMBER], - FG_TEXTURE_FIRST_COLOR); - } - else - { - set_mono_texture_palette (FG_TEXTURE_DEFAULT_COLOR, - FG_TEXTURE_FIRST_COLOR); - } - } - - if (num >= CHOOSE_COLOR_NUMBER + RAW_TEXTURE_NUMBER - && num < - CHOOSE_COLOR_NUMBER + RAW_TEXTURE_NUMBER + RAW_MAPTEX_NUMBER) - { - if (LOADED_MAPTEX) - { - set_raw_texture_palette (RAW_MAPTEX - [num - - (CHOOSE_COLOR_NUMBER + - RAW_TEXTURE_NUMBER)], - FG_TEXTURE_FIRST_COLOR); - } - else - { - set_mono_texture_palette (FG_TEXTURE_DEFAULT_COLOR, - FG_TEXTURE_FIRST_COLOR); - } - } - } -} - -/*------------------------------------------------------------------*/ -void -set_palette_for_choose_color (void) -{ - int i; - - for (i = 0; i < 128; ++i) - get_mono_texture_color (GLOBAL_PALETTE + 128 + i, i); -} - -/*------------------------------------------------------------------*/ -static void -set_team_color (int teinte, int first, int num) -{ - int i, col, col_r, col_g, col_b, coeff, tot, last; - - last = first + num - 1; - - get_mono_texture_color (GLOBAL_PALETTE + last, teinte * 10); - - col_r = GLOBAL_PALETTE[last].r; - col_g = GLOBAL_PALETTE[last].g; - col_b = GLOBAL_PALETTE[last].b; - tot = 8 * num - 7; - for (i = 0; i < num - 1; ++i) - { - coeff = num + 7 * i; - col = (col_r * coeff) / tot; - GLOBAL_PALETTE[first + i].r = col; - col = (col_g * coeff) / tot; - GLOBAL_PALETTE[first + i].g = col; - col = (col_b * coeff) / tot; - GLOBAL_PALETTE[first + i].b = col; - } -} - -/*------------------------------------------------------------------*/ -void -set_playing_teams_palette (void) -{ - int i, j, n, color, active; - - COLORS_PER_TEAM = 128 / PLAYING_TEAMS; - for (i = 0, n = 0; i < NB_TEAMS; ++i) - { - color = 0; - active = 0; - if (LW_NETWORK_ON) - { - for (j = 0; j < NB_TEAMS; ++j) - { - if (LW_NETWORK_INFO[j].active && - LW_NETWORK_INFO[j].server_id == i) - { - active = 1; - color = LW_NETWORK_INFO[j].color; - } - } - } - else - { - if (CONFIG_CONTROL_TYPE[i] != CONFIG_CONTROL_TYPE_OFF) - { - active = 1; - color = CONFIG_TEAM_COLOR[i]; - } - } - - if (active) - { - COLOR_FIRST_ENTRY[n] = 128 + n * COLORS_PER_TEAM; - set_team_color (color, COLOR_FIRST_ENTRY[n], COLORS_PER_TEAM); - n++; - } - } -} - -/*------------------------------------------------------------------*/ -void -my_fade_out (void) -{ - fade_out (48); -} - -/*------------------------------------------------------------------*/ -void -my_fade_in (void) -{ - PALETTE pal; - - change_palette_brightness (GLOBAL_PALETTE, pal); - fade_in (pal, 48); - - lw_mouse_update_show_hide (); -} diff --git a/src/palette.h b/src/palette.h deleted file mode 100644 index 51fc9dbd..00000000 --- a/src/palette.h +++ /dev/null @@ -1,95 +0,0 @@ -/********************************************************************/ -/* */ -/* L I QQ U U I DD W W A RR 555 */ -/* L I Q Q U U I D D W W A A R R 5 */ -/* L I Q Q U U I D D W W W AAA RR 55 */ -/* L I Q Q U U I D D WW WW A A R R 5 */ -/* LLL I Q Q U I DD W W A A R R 55 */ -/* */ -/* b */ -/* bb y y */ -/* b b yyy */ -/* bb y */ -/* yy */ -/* */ -/* U U FFF O O TTT */ -/* U U F O O O O T */ -/* U U TIRET FF O O O O T */ -/* U U F O O O O T */ -/* U F O O T */ -/* */ -/********************************************************************/ - -/*****************************************************************************/ -/* Liquid War is a multiplayer wargame */ -/* Copyright (C) 1998-2025 Christian Mauduit */ -/* */ -/* 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 */ -/* */ -/* Liquid War homepage : https://ufoot.org/liquidwar/v5 */ -/* Contact author : ufoot@ufoot.org */ -/*****************************************************************************/ - -/********************************************************************/ -/* nom : palette.h */ -/* contenu : gestion des palettes de couleur */ -/* date de modif : 3 mai 98 */ -/********************************************************************/ - -#ifndef LIQUID_WAR_INCLUDE_PALETTE -#define LIQUID_WAR_INCLUDE_PALETTE - -/*==================================================================*/ -/* includes */ -/*==================================================================*/ - -#include - -#include "backport.h" - -/*==================================================================*/ -/* variables globales */ -/*==================================================================*/ - -#define CHOOSE_COLOR_NUMBER 128 -#define CHOOSE_COLOR_WHITE 120 -#define CHOOSE_COLOR_BLACK 127 - -#define TEAM_FIRST_COLOR 128 - -#define FG_TEXTURE_FIRST_COLOR 64 -#define BG_TEXTURE_FIRST_COLOR 96 - -#define TEXTURE_COLOR_NUMBER 32 - -#define MENU_BG 16 -#define MENU_FG 17 - -extern PALETTE GLOBAL_PALETTE; -extern int COLORS_PER_TEAM; - -/*==================================================================*/ -/* fonctions globales */ -/*==================================================================*/ - -void my_set_palette (void); -void set_bg_texture_palette (int num); -void set_fg_texture_palette (int num); -void set_palette_for_choose_color (void); -void set_playing_teams_palette (void); -void my_fade_out (void); -void my_fade_in (void); - -#endif diff --git a/src/pion.c b/src/pion.c index 1763ae25..67439b6b 100644 --- a/src/pion.c +++ b/src/pion.c @@ -54,12 +54,12 @@ #include +#include "backport.h" #include "area.h" #include "base.h" #include "config.h" #include "cursor.h" #include "decal.h" -#include "palette.h" #include "viewport.h" #include "pion.h" #include "lwtime.h" @@ -132,10 +132,10 @@ static CURSOR_POINT CURSOR_LAYOUT[CURSOR_POINT_NUMBER] = {-1, -4, 31, CL_MIDDLE}, {-1, -5, 31, CL_OUTSIDE} }; -static char CURSOR_GRAPHIC_MEMORY[NB_TEAMS][CURSOR_POINT_NUMBER]; +static ALLEGRO_COLOR CURSOR_GRAPHIC_MEMORY[NB_TEAMS][CURSOR_POINT_NUMBER]; -static char CURSOR_COLOR_MAP[CURSOR_COLOR_NUMBER]; -static char CURSOR_COLOR_BACK[CURSOR_COLOR_NUMBER]; +static int CURSOR_COLOR_MAP[CURSOR_COLOR_NUMBER]; // Intensity values (0-255) +static ALLEGRO_COLOR CURSOR_COLOR_BACK[CURSOR_COLOR_NUMBER]; /*==================================================================*/ /* fonctions */ @@ -145,18 +145,15 @@ static char CURSOR_COLOR_BACK[CURSOR_COLOR_NUMBER]; void init_disp_cursor (void) { - int i, x, y, color_back; + int i, x, y; + ALLEGRO_COLOR color_back; + // In true color mode, just pick random colors from the background texture for (i = 0; i < CURSOR_COLOR_NUMBER; ++i) { - color_back = 0; - while (color_back < FG_TEXTURE_FIRST_COLOR - || color_back >= FG_TEXTURE_FIRST_COLOR + 32) - { - x = random () % CURRENT_AREA_W; - y = random () % CURRENT_AREA_H; - color_back = getpixel (CURRENT_AREA_BACK, x, y); - } + x = random () % CURRENT_AREA_W; + y = random () % CURRENT_AREA_H; + color_back = getpixel (CURRENT_AREA_BACK, x, y); CURSOR_COLOR_BACK[i] = color_back; } } @@ -165,11 +162,11 @@ init_disp_cursor (void) static void disp_cursor (int number) { - int i, x, y, x0, y0, color_offset; + int i, x, y, x0, y0, team; x0 = CURRENT_CURSOR[number].x; y0 = CURRENT_CURSOR[number].y; - color_offset = COLOR_FIRST_ENTRY[CURRENT_CURSOR[number].team]; + team = CURRENT_CURSOR[number].team; for (i = 0; i < CURSOR_POINT_NUMBER; ++i) @@ -183,7 +180,7 @@ disp_cursor (int number) case CL_INSIDE: case CL_MIDDLE: putpixel (CURRENT_AREA_DISP, x, y, - CURSOR_COLOR_MAP[CURSOR_LAYOUT[i].color] + color_offset); + lw_team_color(team, CURSOR_COLOR_MAP[CURSOR_LAYOUT[i].color])); break; case CL_MIDDLE2: putpixel (CURRENT_AREA_DISP, x, y, @@ -216,26 +213,26 @@ disp_all_cursors (void) { int i, degrad_size, fp, ip; + // In true color mode, intensity ranges from 0 to 255 degrad_size = CURSOR_COLOR_NUMBER / (2 * CURSOR_LIGHTS); - ip = ((GLOBAL_TICKER * COLORS_PER_TEAM) / CURSOR_CYCLE) - % (COLORS_PER_TEAM * 2); + ip = ((GLOBAL_TICKER * 256) / CURSOR_CYCLE) % (256 * 2); fp = 0; for (i = 0; i < CURSOR_COLOR_NUMBER; ++i) { - if (ip < COLORS_PER_TEAM) + if (ip < 256) CURSOR_COLOR_MAP[i] = ip; else - CURSOR_COLOR_MAP[i] = 2 * COLORS_PER_TEAM - 1 - ip; + CURSOR_COLOR_MAP[i] = 2 * 256 - 1 - ip; - fp += COLORS_PER_TEAM; + fp += 256; while (fp >= degrad_size) { fp -= degrad_size; ip++; } - while (ip >= 2 * COLORS_PER_TEAM) - ip -= 2 * COLORS_PER_TEAM; + while (ip >= 2 * 256) + ip -= 2 * 256; } for (i = 0; i < NB_TEAMS; ++i) diff --git a/src/play.c b/src/play.c index a3e64e30..8c51f034 100644 --- a/src/play.c +++ b/src/play.c @@ -62,7 +62,6 @@ #include "error.h" #include "game.h" #include "gfxmode.h" -#include "palette.h" #include "maptex.h" #include "play.h" #include "score.h" @@ -154,7 +153,7 @@ play_sequence_ex (void) * we set up the Allegro palette and LW's palette parameters so that * an optimized number of colors is used for each team's fighters */ - set_playing_teams_palette (); + // set_playing_teams_palette (); // No longer needed in true color mode /* * if there's only one team selected we stop right away and quit @@ -180,7 +179,7 @@ play_sequence_ex (void) /* * fade out cause we're going to switch video modes */ - my_fade_out (); + // my_fade_out (); // No longer needed in true color mode /* * we change the resolution, but only if the game resolution is @@ -203,7 +202,7 @@ play_sequence_ex (void) /* * fiat lux */ - my_fade_in (); + // my_fade_in (); // No longer needed in true color mode /* * start playing some music @@ -239,7 +238,7 @@ play_sequence_ex (void) /* * fade out before video mode switching */ - my_fade_out (); + // my_fade_out (); // No longer needed in true color mode /* * again, we change the video mode only if it is really required */ diff --git a/src/random.c b/src/random.c index 1b1d10c3..e2d69b19 100644 --- a/src/random.c +++ b/src/random.c @@ -97,29 +97,14 @@ int LW_RANDOM_ON = 0; /* * Generates a black&white palette which is suitable for * the game to handle nicely maps generated by lwmapgen. Basically - * all we need is color 0 == black and color 2555 = white, but - * we do a full grayscale, just to say the palette is not full of - * garbage. + * Palette generation removed - not needed for Allegro 5 */ -static void -generate_bw_palette (PALETTE pal) -{ - int i; - - for (i = 0; i < 256; ++i) - { - pal[i].r = i; - pal[i].g = i; - pal[i].b = i; - } -} /*------------------------------------------------------------------*/ static ALLEGRO_BITMAP * generate_bitmap () { ALLEGRO_BITMAP *bmp; - PALETTE pal; char filename[LW_STARTUP_MAX_PATH_LENGTH]; char command[LW_STARTUP_MAX_PATH_LENGTH + LW_COMMAND_EXTRA_SIZE]; @@ -173,7 +158,7 @@ generate_bitmap () if (ok) { - bmp = load_bitmap (filename, pal); + bmp = al_load_bitmap_flags(filename, ALLEGRO_MEMORY_BITMAP); } else { @@ -206,16 +191,14 @@ int lw_random_generate_map () { ALLEGRO_BITMAP *bmp; - PALETTE pal; void *raw_map = NULL; int result = 0; bmp = generate_bitmap (); - generate_bw_palette (pal); if (bmp) { - raw_map = lw_map_archive_raw_bmp (bmp, pal, "lwmapgen"); + raw_map = lw_map_archive_raw_bmp (bmp, "lwmapgen"); } if (raw_map) diff --git a/src/score.c b/src/score.c index c9e66bb2..b4f561d6 100644 --- a/src/score.c +++ b/src/score.c @@ -209,7 +209,7 @@ draw_score_bitmap (ALLEGRO_BITMAP * bitmap, int cursor, int ellipse_h, int fill_level) { int w, h; - int color1 = 0, color2 = 0; + ALLEGRO_COLOR color1, color2; int y_rect1, y_rect2, x_mid; int to_be_filled, to_be_drawn; @@ -224,8 +224,9 @@ draw_score_bitmap (ALLEGRO_BITMAP * bitmap, int cursor, int ellipse_h, fill_level = 0; else { - color1 = CURRENT_CURSOR[cursor].color_entry + COLORS_PER_TEAM / 2; - color2 = CURRENT_CURSOR[cursor].color_entry + COLORS_PER_TEAM - 1; + int team = CURRENT_CURSOR[cursor].team; + color1 = lw_team_color(team, 128); // Mid intensity + color2 = lw_team_color(team, 255); // Full intensity } if (fill_level < 0) fill_level = 0; @@ -241,7 +242,7 @@ draw_score_bitmap (ALLEGRO_BITMAP * bitmap, int cursor, int ellipse_h, fill_level /= 1000; fill_level += 2 * y_rect1; - rectfill (bitmap, 0, 0, w, h, 0); + rectfill (bitmap, 0, 0, w, h, al_map_rgb(0, 0, 0)); if (to_be_filled) ellipsefill (bitmap, x_mid, y_rect2, x_mid, ellipse_h / 2, color1); @@ -346,7 +347,7 @@ display_scores (void) my_update_dialog (dp); shutdown_dialog (dp); - my_fade_in (); + // my_fade_in (); // No longer needed in true color mode play_win (); first_ticker = get_ticker (); diff --git a/src/team.c b/src/team.c index 5fea2e2b..99eee8de 100644 --- a/src/team.c +++ b/src/team.c @@ -283,7 +283,11 @@ update_team_box (DIALOG * d, int number) } else { - d[0].bg = 128 + (CONFIG_TEAM_COLOR[number]) * 10; + // Map team color (0-5) with some brightness offset + int color_idx = CONFIG_TEAM_COLOR[number]; + int team = color_idx / 2; // Map 12 colors to 6 teams + int intensity = (color_idx % 2) ? 200 : 128; // Alternate between mid and bright + d[0].bg = lw_team_color(team, intensity); } } @@ -344,7 +348,11 @@ team_param (DIALOG * d, int x, int y, int number) d[i].x = x + (i - 2) * w1; d[i].y = y + 2 * h; d[i].w = w1 - 2; - d[i].bg = 128 + (i - 2) * 10; + // Create 12 color buttons (2 shades × 6 teams) + int color_idx = i - 2; + int team = color_idx / 2; // Map 12 colors to 6 teams + int intensity = (color_idx % 2) ? 200 : 128; // Alternate between mid and bright + d[i].bg = lw_team_color(team, intensity); } for (i = 16; i < 20; ++i) @@ -413,8 +421,8 @@ choose_teams (void) d[124].proc = NULL; - set_palette_for_choose_color (); - my_set_palette (); + // set_palette_for_choose_color (); // No longer needed in true color mode + // my_set_palette (); // No longer needed in true color mode display_back_image (); while (retour == 0) diff --git a/src/test_backport_pixel.c b/src/test_backport_pixel.c index 7f3843df..bfc56d1e 100644 --- a/src/test_backport_pixel.c +++ b/src/test_backport_pixel.c @@ -57,7 +57,6 @@ #include "test_simple.h" #include "backport.h" -#include "palette.h" /*==================================================================*/ /* functions */ diff --git a/src/texture.c b/src/texture.c index c01c8a9d..8e66833c 100644 --- a/src/texture.c +++ b/src/texture.c @@ -57,7 +57,6 @@ #include "bigdata.h" #include "texture.h" #include "disk.h" -#include "palette.h" #include "startup.h" #include "log.h" #include "serial.h" @@ -79,287 +78,29 @@ /* gestion des bitmaps des textures */ /*------------------------------------------------------------------*/ -/*-----------------------------------------------------------------*/ -static int -find_color (PALETTE pal, RGB rgb) -{ - int i, found = -1; - - for (i = 0; i < 256 && found < 0; ++i) - if (pal[i].r == rgb.r && pal[i].g == rgb.g && pal[i].b == rgb.b) - found = i; - - return found; -} - -/*-----------------------------------------------------------------*/ -static int -exist_color (PALETTE pal, RGB rgb) -{ - return (find_color (pal, rgb) >= 0); -} - -/*-----------------------------------------------------------------*/ -static int -recalculate_number_of_colors (int max_number, ALLEGRO_BITMAP * bmp, - PALETTE pal) -{ - int i, x, y, n = 1; - RGB color; - PALETTE pal2; - - color = pal[getpixel (bmp, 0, 0)]; - - for (i = 0; i < 256; ++i) - pal2[i] = color; - - for (y = 0; y < al_get_bitmap_height(bmp) && n < max_number; ++y) - for (x = 0; x < al_get_bitmap_width(bmp) && n < max_number; ++x) - { - color = pal[getpixel (bmp, x, y)]; - if (!exist_color (pal2, color)) - pal2[n++] = color; - } - return n; -} - -/*-----------------------------------------------------------------*/ -static void -create_new_palette (PALETTE dst, - PALETTE src, - ALLEGRO_BITMAP * bmp, int first_color, - int number_of_colors) -{ - int i, x, y, index; - int nb_retries = 0; - RGB color; - - x = random () % al_get_bitmap_width(bmp); - y = random () % al_get_bitmap_height(bmp); - color = src[getpixel (bmp, x, y)]; - - for (i = 0; i < 256; ++i) - dst[i] = color; - - for (i = 1; i < number_of_colors;) - { - x = random () % al_get_bitmap_width(bmp); - y = random () % al_get_bitmap_height(bmp); - index = getpixel (bmp, x, y); - color = src[index]; - if ((!exist_color (dst, color)) || - (nb_retries > LW_TEXTURE_RANDOM_MAX_RETRIES)) - { - dst[first_color + (i++)] = color; - nb_retries = 0; - } - else - { - nb_retries++; - } - } -} - -/*-----------------------------------------------------------------*/ -static void -correct_palette (PALETTE pal, int first_color, int number_of_colors) -{ - int i; - - for (i = 0; i < first_color; ++i) - { - pal[i].r = 0; - pal[i].g = 0; - pal[i].b = 0; - } - for (i = first_color + number_of_colors; i < 256; ++i) - { - pal[i].r = 63; - pal[i].g = 63; - pal[i].b = 63; - } -} - -/*-----------------------------------------------------------------*/ -static void -create_converted_bitmap (ALLEGRO_BITMAP * bmp, - PALETTE dst, - PALETTE src, int first_color, int number_of_colors) -{ - char corres[256]; - int i, x, y, index; - - for (i = 0; i < 256; ++i) - corres[i] = bestfit_color (dst, src[i].r, src[i].g, src[i].b); - al_set_target_bitmap (bmp); - for (y = 0; y < al_get_bitmap_height(bmp); ++y) - for (x = 0; x < al_get_bitmap_width(bmp); ++x) - { - index = corres[getpixel (bmp, x, y)]; - index = (index < first_color || - index >= first_color + number_of_colors) ? - first_color : index; - putpixel_fast (x, y, index); - } -} - -/*------------------------------------------------------------------*/ -static void -red8col (ALLEGRO_BITMAP * bmp, PALETTE pal, int first_color, - int number_of_colors) -{ - PALETTE pal2; - int i; - - for (i = 0; i < 256; ++i) - pal2[i] = pal[i]; - - number_of_colors = recalculate_number_of_colors - (number_of_colors, bmp, pal); - create_new_palette (pal, pal2, bmp, first_color, number_of_colors); - create_converted_bitmap (bmp, pal, pal2, first_color, number_of_colors); - correct_palette (pal, first_color, number_of_colors); -} - -/*------------------------------------------------------------------*/ -static void -texture_8to5 (ALLEGRO_BITMAP * bmp, PALETTE pal, void *result, - int first_color, int number_of_colors, char *filename) -{ - char *buffer; - int pos = 0, pos8 = 0, x, y, i; - char octet[5], toadd; - int coul; - char system_name_buffer[LW_TEXTURE_SYSTEM_NAME_SIZE + 1]; - - lw_serial_set_texture_header (result, (short) al_get_bitmap_width(bmp), (short) al_get_bitmap_height(bmp)); - - buffer = ((char *) result) + 2 * sizeof (short); - - /* - * We store the system name - */ - memset (system_name_buffer, 0, sizeof (system_name_buffer)); - LW_MACRO_STRCPY (system_name_buffer, lw_path_get_system_name (filename)); - memcpy (buffer, system_name_buffer, LW_TEXTURE_SYSTEM_NAME_SIZE); - buffer += LW_TEXTURE_SYSTEM_NAME_SIZE; - - for (i = 0; i < number_of_colors; ++i) - { - buffer[pos++] = pal[first_color + i].r; - buffer[pos++] = pal[first_color + i].g; - buffer[pos++] = pal[first_color + i].b; - } - - for (i = 0; i < 5; ++i) - octet[i] = 0; - - for (y = 0; y < al_get_bitmap_height(bmp); ++y) - for (x = 0; x < al_get_bitmap_width(bmp); ++x) - { - coul = getpixel (bmp, x, y) - first_color; - toadd = 1 << pos8; - octet[0] |= (coul & 1) ? toadd : 0; - octet[1] |= (coul & 2) ? toadd : 0; - octet[2] |= (coul & 4) ? toadd : 0; - octet[3] |= (coul & 8) ? toadd : 0; - octet[4] |= (coul & 16) ? toadd : 0; - - if (pos8 == 7 || (y == al_get_bitmap_height(bmp) - 1 && x == al_get_bitmap_width(bmp) - 1)) - { - for (i = 0; i < 5; ++i) - { - buffer[pos++] = octet[i]; - octet[i] = 0; - } - pos8 = 0; - } - else - pos8++; - } -} +/* Palette-based texture functions removed - not needed for Allegro 5 RGB mode */ /*------------------------------------------------------------------*/ void * lw_texture_archive_raw (const char *filename) { - int i, w, h, size = 0; + /* Simplified for Allegro 5 - just store the bitmap pointer directly + * No palette quantization or 5-bit packing needed with RGB bitmaps */ ALLEGRO_BITMAP *bmp; - PALETTE pal; - char *result = NULL, *temp = NULL; - char *f = (char *) filename; - bmp = load_bitmap (filename, pal); - if (bmp) - { - w = al_get_bitmap_width(bmp); - h = al_get_bitmap_height(bmp); - if (w > 0 && h > 0) - { - temp = malloc (size = - 2 * sizeof (short) - + LW_TEXTURE_SYSTEM_NAME_SIZE - + 3 * TEXTURE_COLOR_NUMBER + ((w * h + 7) / 8) * 5); - if (temp) - { - red8col (bmp, pal, 0, TEXTURE_COLOR_NUMBER); - texture_8to5 (bmp, pal, temp, 0, TEXTURE_COLOR_NUMBER, f); - } - } - al_destroy_bitmap (bmp); - } - if (temp) - { - result = malloc (size); - if (result) - { - for (i = 0; i < size; ++i) - { - result[i] = temp[i]; - } - } - free (temp); - } + bmp = al_load_bitmap_flags(filename, ALLEGRO_MEMORY_BITMAP); - return result; + /* Return the bitmap as-is - callers will use it as an ALLEGRO_BITMAP* */ + return (void *)bmp; } /*------------------------------------------------------------------*/ static ALLEGRO_BITMAP * -create_raw_texture (void *ptr, int first) +create_raw_texture (void *ptr) { - int x, y, pos8 = 0, color; - char totest, *data; - ALLEGRO_BITMAP *result; - short w, h; - - data = ptr; - lw_serial_get_texture_header (data, &w, &h); - data += 2 * sizeof (short) + LW_TEXTURE_SYSTEM_NAME_SIZE + 3 * 32; - - result = my_create_memory_bitmap (w, h); - if (result) - { - al_set_target_bitmap (result); - for (y = 0; y < h; ++y) - for (x = 0; x < w; ++x) - { - totest = 1 << pos8; - color = first + ((data[0] & totest) ? 1 : 0) - + ((data[1] & totest) ? 2 : 0) - + ((data[2] & totest) ? 4 : 0) - + ((data[3] & totest) ? 8 : 0) + ((data[4] & totest) ? 16 : 0); - putpixel_fast (x, y, color); - if (pos8 == 7) - { - data += 5; - pos8 = 0; - } - else - pos8++; - } - } - return result; + /* Simplified for Allegro 5 - ptr is already an ALLEGRO_BITMAP* + * Just return it directly */ + return (ALLEGRO_BITMAP *)ptr; } /*------------------------------------------------------------------*/ @@ -389,18 +130,18 @@ get_raw_texture (int num) /*------------------------------------------------------------------*/ static ALLEGRO_BITMAP * -create_mono_texture (int first) +create_mono_texture (ALLEGRO_COLOR color) { ALLEGRO_BITMAP *result; result = my_create_memory_bitmap (1, 1); - putpixel (result, 0, 0, first); + putpixel (result, 0, 0, color); return result; } /*------------------------------------------------------------------*/ static ALLEGRO_BITMAP * -create_texture (int num, int first) +create_texture (int num, ALLEGRO_COLOR default_color) { ALLEGRO_BITMAP *result; void *texture; @@ -409,11 +150,11 @@ create_texture (int num, int first) if (texture) { - result = create_raw_texture (texture, first); + result = create_raw_texture (texture); } else { - result = create_mono_texture (first); + result = create_mono_texture (default_color); } return result; @@ -423,14 +164,16 @@ create_texture (int num, int first) ALLEGRO_BITMAP * lw_texture_create_bg (int num) { - return create_texture (num, BG_TEXTURE_FIRST_COLOR); + // In true color mode, use a default gray for background textures + return create_texture (num, al_map_rgb(64, 64, 64)); } /*------------------------------------------------------------------*/ ALLEGRO_BITMAP * lw_texture_create_fg (int num) { - return create_texture (num, FG_TEXTURE_FIRST_COLOR); + // In true color mode, use a default white for foreground textures + return create_texture (num, al_map_rgb(192, 192, 192)); } /*------------------------------------------------------------------*/ diff --git a/src/viewport.c b/src/viewport.c index 97201ca0..d074b9ef 100644 --- a/src/viewport.c +++ b/src/viewport.c @@ -55,8 +55,8 @@ #include "area.h" #include "backport.h" #include "config.h" +#include "dialog.h" #include "gfxmode.h" -#include "palette.h" #include "viewport.h" #include "info.h" #include "distor.h" diff --git a/utils/lwmapgen/big_quad.c b/utils/lwmapgen/big_quad.c index 29478a07..36f987bc 100644 --- a/utils/lwmapgen/big_quad.c +++ b/utils/lwmapgen/big_quad.c @@ -36,7 +36,7 @@ big_quad () vert[6] = rand_num (map.sec_width + 1, map.width - map.sec_width - 1); vert[7] = rand_num (map.height - map.sec_height, map.height - 3); - polygon (map.map, 4, vert, 0); + polygon (map.map, 4, vert, al_map_rgb(0, 0, 0)); return; } diff --git a/utils/lwmapgen/boxes.c b/utils/lwmapgen/boxes.c index f9d154f2..9914dd90 100644 --- a/utils/lwmapgen/boxes.c +++ b/utils/lwmapgen/boxes.c @@ -50,7 +50,7 @@ boxes () else endy = map.sec_height * (r + 1) - pad; - rectfill (map.map, startx, starty, endx, endy, 0); + rectfill (map.map, startx, starty, endx, endy, al_map_rgb(0, 0, 0)); } } } diff --git a/utils/lwmapgen/bubbles.c b/utils/lwmapgen/bubbles.c index c750d1b3..20b157c3 100644 --- a/utils/lwmapgen/bubbles.c +++ b/utils/lwmapgen/bubbles.c @@ -58,8 +58,8 @@ bubbles () *centery *= (centery / bubblesy); */ - circlefill (map.map, centerx, centery, outradius, 255); - circlefill (map.map, centerx, centery, inradius, 0); + circlefill (map.map, centerx, centery, outradius, al_map_rgb(255, 255, 255)); + circlefill (map.map, centerx, centery, inradius, al_map_rgb(0, 0, 0)); } } /* for(c..) */ } /* for(r..) */ diff --git a/utils/lwmapgen/circles.c b/utils/lwmapgen/circles.c index 426e2d68..31f4db35 100644 --- a/utils/lwmapgen/circles.c +++ b/utils/lwmapgen/circles.c @@ -28,7 +28,7 @@ circles () { rand_point_section_offset (¢erx, ¢ery, r, c, 0); radius = rand () % size + 1; - circlefill (map.map, centerx, centery, radius, 0); + circlefill (map.map, centerx, centery, radius, al_map_rgb(0, 0, 0)); } } diff --git a/utils/lwmapgen/circuit.c b/utils/lwmapgen/circuit.c index 1b346a5f..bd10bb85 100644 --- a/utils/lwmapgen/circuit.c +++ b/utils/lwmapgen/circuit.c @@ -39,12 +39,12 @@ draw_pipe (int fromr, int fromc, int tor, int toc, int flip) /* go up/down to reach target */ section_center (&fromx, &fromy, fromr, fromc); section_center (&tox, &toy, tor, fromc); - rectfill (map.map, fromx - size, fromy, tox + size, toy, 255); + rectfill (map.map, fromx - size, fromy, tox + size, toy, al_map_rgb(255, 255, 255)); /* across some num of sections */ section_center (&fromx, &fromy, tor, fromc); section_center (&tox, &toy, tor, toc); - rectfill (map.map, fromx, fromy - size, tox, toy + size, 255); + rectfill (map.map, fromx, fromy - size, tox, toy + size, al_map_rgb(255, 255, 255)); } /* across then up/down */ else @@ -52,12 +52,12 @@ draw_pipe (int fromr, int fromc, int tor, int toc, int flip) /* across some num of sections */ section_center (&fromx, &fromy, fromr, fromc); section_center (&tox, &toy, fromr, toc); - rectfill (map.map, fromx, fromy - size, tox, toy + size, 255); + rectfill (map.map, fromx, fromy - size, tox, toy + size, al_map_rgb(255, 255, 255)); /* go up/down to reach target */ section_center (&fromx, &fromy, fromr, toc); section_center (&tox, &toy, tor, toc); - rectfill (map.map, fromx - size, fromy, tox + size, toy, 255); + rectfill (map.map, fromx - size, fromy, tox + size, toy, al_map_rgb(255, 255, 255)); } } else if (fromc > toc) @@ -68,12 +68,12 @@ draw_pipe (int fromr, int fromc, int tor, int toc, int flip) /* across some num of sections */ section_center (&fromx, &fromy, fromr, fromc); section_center (&tox, &toy, fromr, toc); - rectfill (map.map, fromx, fromy - size, tox, toy + size, 255); + rectfill (map.map, fromx, fromy - size, tox, toy + size, al_map_rgb(255, 255, 255)); /* go up/down to reach target */ section_center (&fromx, &fromy, fromr, toc); section_center (&tox, &toy, tor, toc); - rectfill (map.map, fromx - size, fromy, tox + size, toy, 255); + rectfill (map.map, fromx - size, fromy, tox + size, toy, al_map_rgb(255, 255, 255)); } /* up/down then across */ else @@ -81,12 +81,12 @@ draw_pipe (int fromr, int fromc, int tor, int toc, int flip) /* go up/down to reach target */ section_center (&fromx, &fromy, fromr, fromc); section_center (&tox, &toy, tor, fromc); - rectfill (map.map, fromx - size, fromy, tox + size, toy, 255); + rectfill (map.map, fromx - size, fromy, tox + size, toy, al_map_rgb(255, 255, 255)); /* across some num of sections */ section_center (&fromx, &fromy, tor, fromc); section_center (&tox, &toy, tor, toc); - rectfill (map.map, fromx, fromy - size, tox, toy + size, 255); + rectfill (map.map, fromx, fromy - size, tox, toy + size, al_map_rgb(255, 255, 255)); } } else @@ -94,7 +94,7 @@ draw_pipe (int fromr, int fromc, int tor, int toc, int flip) /* go up/down to reach target */ section_center (&fromx, &fromy, fromr, fromc); section_center (&tox, &toy, tor, toc); - rectfill (map.map, fromx - size, fromy, tox + size, toy, 255); + rectfill (map.map, fromx - size, fromy, tox + size, toy, al_map_rgb(255, 255, 255)); } return; @@ -403,7 +403,7 @@ circuit () } section_center (¢erx, ¢ery, r, c); - circlefill (map.map, centerx, centery, radius, 255); + circlefill (map.map, centerx, centery, radius, al_map_rgb(255, 255, 255)); grid[r][c] = 1; count[r]++; @@ -421,7 +421,7 @@ circuit () /* redraw outline */ /* TODO: once in a while if cuts off the edge.. */ - rect (map.map, 0, 0, map.width - 1, map.height - 1, 0); + rect (map.map, 0, 0, map.width - 1, map.height - 1, al_map_rgb(0, 0, 0)); return; } diff --git a/utils/lwmapgen/cut.c b/utils/lwmapgen/cut.c index 81183139..25f73f58 100644 --- a/utils/lwmapgen/cut.c +++ b/utils/lwmapgen/cut.c @@ -42,7 +42,7 @@ cut () vert[6] = endx - size; vert[7] = map.height - 1; - polygon (map.map, 4, vert, 255); + polygon (map.map, 4, vert, al_map_rgb(255, 255, 255)); } /* horizontial */ @@ -66,7 +66,7 @@ cut () vert[6] = map.width - 2; vert[7] = endy + size; - polygon (map.map, 4, vert, 255); + polygon (map.map, 4, vert, al_map_rgb(255, 255, 255)); } return; diff --git a/utils/lwmapgen/main.c b/utils/lwmapgen/main.c index a5b8361a..dfcfd266 100644 --- a/utils/lwmapgen/main.c +++ b/utils/lwmapgen/main.c @@ -48,7 +48,7 @@ main (int argc, char **argv) map_generator (filename, size, grid_size, func_id); printf ("map-- %s\n", map.filename); - save_bitmap (map.filename, map.map, pal); + save_bitmap (map.filename, map.map); // Palette parameter removed in Allegro 5 printf ("map-- %s\n", map.filename); return EXIT_SUCCESS; diff --git a/utils/lwmapgen/map.c b/utils/lwmapgen/map.c index 42d01a60..06aef641 100644 --- a/utils/lwmapgen/map.c +++ b/utils/lwmapgen/map.c @@ -48,9 +48,9 @@ map_t map; void clear_map () { - clear_to_color (map.map, 255); + clear_to_color (map.map, al_map_rgb(255, 255, 255)); /* draw outline */ - rect (map.map, 0, 0, map.width - 1, map.height - 1, 0); + rect (map.map, 0, 0, map.width - 1, map.height - 1, al_map_rgb(0, 0, 0)); } /*****************************************************************************/ @@ -58,7 +58,7 @@ clear_map () void clear_invert_map () { - clear_to_color (map.map, 0); + clear_to_color (map.map, al_map_rgb(0, 0, 0)); } /*****************************************************************************/ diff --git a/utils/lwmapgen/old/rand_poly_cut.c b/utils/lwmapgen/old/rand_poly_cut.c index 249a4f3f..f1611ae5 100644 --- a/utils/lwmapgen/old/rand_poly_cut.c +++ b/utils/lwmapgen/old/rand_poly_cut.c @@ -41,7 +41,7 @@ void rand_poly_cut() if( rand()%3 != 0 ) continue; - offset(&xoffset, &yoffset, r, 0); + offset(&xoffset, &yoffset, r, al_map_rgb(0, 0, 0)); cutsize = rand()%(section_height/2-map.max_pad)+1; cuty = section_height/2 + yoffset; diff --git a/utils/lwmapgen/old/rand_poly_diag_cut.c b/utils/lwmapgen/old/rand_poly_diag_cut.c index 403b5cba..7b070d3c 100644 --- a/utils/lwmapgen/old/rand_poly_diag_cut.c +++ b/utils/lwmapgen/old/rand_poly_diag_cut.c @@ -51,7 +51,7 @@ void rand_poly_diag_cut() for( r = start; r < map.num_row; r += 2 ) { - offset(&xoffset, &yoffset, r, 0); + offset(&xoffset, &yoffset, r, al_map_rgb(0, 0, 0)); cutsize = rand()%(section_height/2-map.max_pad)+1; diff --git a/utils/lwmapgen/rand_box.c b/utils/lwmapgen/rand_box.c index 551fd14b..59f6d1de 100644 --- a/utils/lwmapgen/rand_box.c +++ b/utils/lwmapgen/rand_box.c @@ -43,7 +43,7 @@ rand_box () bheight -= (starty + bheight) - (map.sec_height - 1); rectfill (map.map, startx + xoffset, starty + yoffset, - startx + bwidth + xoffset, starty + bheight + yoffset, 0); + startx + bwidth + xoffset, starty + bheight + yoffset, al_map_rgb(0, 0, 0)); } } diff --git a/utils/lwmapgen/rand_poly.c b/utils/lwmapgen/rand_poly.c index ce2407bb..e1113a9a 100644 --- a/utils/lwmapgen/rand_poly.c +++ b/utils/lwmapgen/rand_poly.c @@ -62,7 +62,7 @@ rand_poly () /* draw poly */ - polygon (map.map, num_vert, vert, map.color); + polygon (map.map, num_vert, vert, map.color == 0 ? al_map_rgb(0, 0, 0) : al_map_rgb(255, 255, 255)); delete_array (vert); diff --git a/utils/lwmapgen/street.c b/utils/lwmapgen/street.c index 4ca0f1d5..2edeebed 100644 --- a/utils/lwmapgen/street.c +++ b/utils/lwmapgen/street.c @@ -59,7 +59,7 @@ street () /* draw main row */ section_center (&startx, &starty, r, 0); section_center (&endx, &endy, r, map.num_col - 1); - rectfill (map.map, startx, starty - size, endx, endy + size, 255); + rectfill (map.map, startx, starty - size, endx, endy + size, al_map_rgb(255, 255, 255)); /* do the branches */ @@ -76,7 +76,7 @@ street () tor = rand () % r; section_center (&endx, &endy, tor, c); rectfill (map.map, startx - size, starty, endx + size, endy, - 255); + al_map_rgb(255, 255, 255)); } /* draw down */ @@ -87,7 +87,7 @@ street () /* tor = rand()%(map.num_row-r-1)+r+1; */ section_center (&endx, &endy, tor, c); rectfill (map.map, startx - size, starty, endx + size, endy, - 255); + al_map_rgb(255, 255, 255)); } } } @@ -101,7 +101,7 @@ street () /* draw main col */ section_center (&startx, &starty, 0, c); section_center (&endx, &endy, map.num_row - 1, c); - rectfill (map.map, startx - size, starty, endx + size, endy, 255); + rectfill (map.map, startx - size, starty, endx + size, endy, al_map_rgb(255, 255, 255)); /* do the branches */ @@ -118,7 +118,7 @@ street () toc = rand () % c; section_center (&endx, &endy, r, toc); rectfill (map.map, startx, starty - size, endx, endy + size, - 255); + al_map_rgb(255, 255, 255)); } /* draw right */ @@ -128,7 +128,7 @@ street () /* toc = rand()%(map.num_col-c-1)+c+1; */ section_center (&endx, &endy, r, toc); rectfill (map.map, startx - size, starty - size, endx, - endy + size, 255); + endy + size, al_map_rgb(255, 255, 255)); } } } diff --git a/utils/lwmapgen/worms.c b/utils/lwmapgen/worms.c index ec88bbe7..ae27316b 100644 --- a/utils/lwmapgen/worms.c +++ b/utils/lwmapgen/worms.c @@ -18,7 +18,7 @@ int -filled (int centerx, int centery, int rad, int startdeg, int col, int seg) +filled (int centerx, int centery, int rad, int startdeg, ALLEGRO_COLOR col, int seg) { int deg; int result = 0; @@ -38,10 +38,9 @@ filled (int centerx, int centery, int rad, int startdeg, int col, int seg) for (deg = startdeg - check_degrees; deg < startdeg + check_degrees; deg += 5) { - - if (getpixel - (map.map, centerx + (rad * cos (M_PI * deg / 180)), - centery + (rad * sin (M_PI * deg / 180))) == col) + ALLEGRO_COLOR pixel = getpixel (map.map, centerx + (rad * cos (M_PI * deg / 180)), + centery + (rad * sin (M_PI * deg / 180))); + if (pixel.r == col.r && pixel.g == col.g && pixel.b == col.b) { result = 1; break; @@ -82,9 +81,9 @@ worms () centerx += radius * cos (M_PI * degree / 180); centery += radius * sin (M_PI * degree / 180); - if (filled (centerx, centery, radius + 1, degree, 0, segs) == 0) + if (filled (centerx, centery, radius + 1, degree, al_map_rgb(0, 0, 0), segs) == 0) { - circlefill (map.map, centerx, centery, radius, 0); + circlefill (map.map, centerx, centery, radius, al_map_rgb(0, 0, 0)); } else { From b9f89416331c9de972d983724d84f50a2d6dc9b9 Mon Sep 17 00:00:00 2001 From: "Christian Mauduit (ufoot)" Date: Sat, 22 Nov 2025 20:41:02 +0100 Subject: [PATCH 6/6] [migration] liquidwar -> liquidwar5 --- .gitignore | 10 ++ Makefile.in | 156 +++++++++--------- configure.ac | 12 +- doc/Makefile.in | 51 +++--- .../{liquidwar.tex.in => liquidwar5.tex.in} | 0 liquidwar.spec => liquidwar5.spec | 50 +++--- liquidwar.spec.in => liquidwar5.spec.in | 50 +++--- misc/liquidwar-jenkins.sh | 67 -------- .../{liquidwar.desktop => liquidwar5.desktop} | 0 misc/{liquidwar.icns => liquidwar5.icns} | Bin misc/{liquidwar.ico => liquidwar5.ico} | Bin misc/{liquidwar.nsi.in => liquidwar5.nsi.in} | 0 misc/{liquidwar.png => liquidwar5.png} | Bin misc/{liquidwar.xpm => liquidwar5.xpm} | 0 ...quidwar_32x32.xpm => liquidwar5_32x32.xpm} | 0 ...quidwar_notify.sh => liquidwar5_notify.sh} | 0 misc/{liquidward.in => liquidwar5d.in} | 23 ++- ...idward.logrotate => liquidwar5d.logrotate} | 0 src/Makefile.in | 16 +- 19 files changed, 189 insertions(+), 246 deletions(-) rename doc/tex/{liquidwar.tex.in => liquidwar5.tex.in} (100%) rename liquidwar.spec => liquidwar5.spec (76%) rename liquidwar.spec.in => liquidwar5.spec.in (76%) delete mode 100755 misc/liquidwar-jenkins.sh rename misc/{liquidwar.desktop => liquidwar5.desktop} (100%) rename misc/{liquidwar.icns => liquidwar5.icns} (100%) rename misc/{liquidwar.ico => liquidwar5.ico} (100%) rename misc/{liquidwar.nsi.in => liquidwar5.nsi.in} (100%) rename misc/{liquidwar.png => liquidwar5.png} (100%) rename misc/{liquidwar.xpm => liquidwar5.xpm} (100%) rename misc/{liquidwar_32x32.xpm => liquidwar5_32x32.xpm} (100%) rename misc/{liquidwar_notify.sh => liquidwar5_notify.sh} (100%) rename misc/{liquidward.in => liquidwar5d.in} (92%) rename misc/{liquidward.logrotate => liquidwar5d.logrotate} (100%) diff --git a/.gitignore b/.gitignore index 5c33c7b3..feecadc2 100644 --- a/.gitignore +++ b/.gitignore @@ -9,20 +9,29 @@ config.status index.html begin.man liquidwar.tex +liquidwar5.tex begin.texi liquidwar.nsi +liquidwar5.nsi liquidward +liquidwar5d macosx_info.plist Makefile.dep *.o *~ *.tar.gz liquidwar +liquidwar5 liquidwar-server +liquidwar5-server liquidwar-mapgen +liquidwar5-mapgen liquidwarcol +liquidwar5col liquidwarmap +liquidwar5map liquidwartex +liquidwar5tex *.dat .#* *.bak @@ -44,3 +53,4 @@ allegro-5* __pycache__ *.pyc src/liquidwar.dSYM +src/liquidwar5.dSYM diff --git a/Makefile.in b/Makefile.in index 67514978..575a6269 100644 --- a/Makefile.in +++ b/Makefile.in @@ -28,9 +28,9 @@ infodir = @infodir@ BINDIR = $(bindir) GAMEDIR = $(exec_prefix)/games -DATADIR = $(datadir)/games/liquidwar +DATADIR = $(datadir)/games/liquidwar5 PIXDIR = $(datadir)/pixmaps -DOCDIR = $(datadir)/doc/liquidwar +DOCDIR = $(datadir)/doc/liquidwar5 DESKTOPDIR = $(datadir)/applications # We don't use the autoconf default mandir=$(prefix)/man man # directory since the FHS (File Hierarchy Standard recommends @@ -64,7 +64,7 @@ MAKE_DIRS = $(MAKE_BIN_DIR) $(MAKE_UTILS_DIR) $(MAKE_DATA_DIR) $(MAKE_DOC_DIR) DOCKER_DIR = ./misc/docker -PACKAGE_SOURCE_DIR = liquidwar-$(VERSION) +PACKAGE_SOURCE_DIR = liquidwar5-$(VERSION) PACKAGE_SOURCE_TAR = $(PACKAGE_SOURCE_DIR).tar PACKAGE_SOURCE_TARGZ = $(PACKAGE_SOURCE_TAR).gz @@ -72,25 +72,25 @@ PACKAGE_DOCKER_SOURCE_TARGZ = $(DOCKER_DIR)/$(PACKAGE_SOURCE_TARGZ) PACKAGE_DOCKER_METASERVER_TARGZ = $(DOCKER_DIR)/metaserver.tar.gz PACKAGE_DOCKER_TABLES_SQL = $(DOCKER_DIR)/tables.sql -PACKAGE_BINARY_TAR = liquidwar-$(VERSION).$(HOST).tar -PACKAGE_BINARY_TGZ = liquidwar-$(VERSION).$(HOST).tgz +PACKAGE_BINARY_TAR = liquidwar5-$(VERSION).$(HOST).tar +PACKAGE_BINARY_TGZ = liquidwar5-$(VERSION).$(HOST).tgz PACKAGE_WIN32_DIR = LW5 -PACKAGE_WIN32_EXE = lwwin.exe lwwinsrv.exe lwwinmap.exe -PACKAGE_WIN32_ZIP = lw$(VERSION_COMPACT)w.zip +PACKAGE_WIN32_EXE = lw5.exe lw5srv.exe lw5map.exe +PACKAGE_WIN32_ZIP = lw$(VERSION_COMPACT).zip PACKAGE_WIN32_ALLEGDLL = alleg44.dll PACKAGE_NSIS_EXE = lw$(VERSION_COMPACT).exe PACKAGE_SOURCE_RPM_TARGET = $(SRPMS_DIR) -PACKAGE_SOURCE_RPM = liquidwar-$(VERSION)-$(VERSION_REL).src.rpm +PACKAGE_SOURCE_RPM = liquidwar5-$(VERSION)-$(VERSION_REL).src.rpm PACKAGE_BINARY_RPM_TARGET = $(RPMS_DIR)/$(HOST_CPU) -PACKAGE_BINARY_RPM = liquidwar-$(VERSION)-$(VERSION_REL).$(HOST_CPU).rpm +PACKAGE_BINARY_RPM = liquidwar5-$(VERSION)-$(VERSION_REL).$(HOST_CPU).rpm -PACKAGE_MACOSX_TAR = liquidwar-$(VERSION)-macosx.tar -PACKAGE_MACOSX_TGZ = liquidwar-$(VERSION)-macosx.tgz -PACKAGE_MACOSX_DMG = liquidwar-$(VERSION).dmg +PACKAGE_MACOSX_TAR = liquidwar5-$(VERSION)-macosx.tar +PACKAGE_MACOSX_TGZ = liquidwar5-$(VERSION)-macosx.tgz +PACKAGE_MACOSX_DMG = liquidwar5-$(VERSION).dmg PACKAGE_TMP = /tmp/liquidwar-$(VERSION).tmp @@ -122,65 +122,65 @@ install_nolink: install_bin install_data install_custom_map install_custom_textu @echo "Have a good day!" @echo " U-Foot (ufoot@ufoot.org)" @echo - @echo "Type \"liquidwar\" or \"$(GAMEDIR)/liquidwar\" to play." + @echo "Type \"liquidwar5\" or \"$(GAMEDIR)/liquidwar5\" to play." install_bin: src/liquidwar src/liquidwar-server src/liquidwar-mapgen - @echo "Installing liquidwar binaries in $(GAMEDIR)." + @echo "Installing liquidwar5 binaries in $(GAMEDIR)." @install -d $(DESTDIR)$(GAMEDIR) - @install -c -s src/liquidwar $(DESTDIR)$(GAMEDIR) - @install -c -s src/liquidwar-server $(DESTDIR)$(GAMEDIR) - @install -c -s src/liquidwar-mapgen $(DESTDIR)$(GAMEDIR) + @install -c -s src/liquidwar5 $(DESTDIR)$(GAMEDIR) + @install -c -s src/liquidwar5-server $(DESTDIR)$(GAMEDIR) + @install -c -s src/liquidwar5-mapgen $(DESTDIR)$(GAMEDIR) install_link: @echo "Installing link in $(BINDIR)." @install -d $(DESTDIR)$(BINDIR) - @rm -rf $(DESTDIR)$(BINDIR)/liquidwar - @rm -rf $(DESTDIR)$(BINDIR)/liquidwar-server - @rm -rf $(DESTDIR)$(BINDIR)/liquidwar-mapgen - @ln -s $(GAMEDIR)/liquidwar $(DESTDIR)$(BINDIR)/liquidwar - @ln -s $(GAMEDIR)/liquidwar-server $(DESTDIR)$(BINDIR)/liquidwar-server - @ln -s $(GAMEDIR)/liquidwar-mapgen $(DESTDIR)$(BINDIR)/liquidwar-mapgen - -install_data: data/liquidwar.dat - @echo "Installing liquidwar datafile in $(DATADIR)." + @rm -rf $(DESTDIR)$(BINDIR)/liquidwar5 + @rm -rf $(DESTDIR)$(BINDIR)/liquidwar5-server + @rm -rf $(DESTDIR)$(BINDIR)/liquidwar5-mapgen + @ln -s $(GAMEDIR)/liquidwar5 $(DESTDIR)$(BINDIR)/liquidwar5 + @ln -s $(GAMEDIR)/liquidwar5-server $(DESTDIR)$(BINDIR)/liquidwar5-server + @ln -s $(GAMEDIR)/liquidwar5-mapgen $(DESTDIR)$(BINDIR)/liquidwar5-mapgen + +install_data: data/liquidwar5.dat + @echo "Installing liquidwar5 datafile in $(DATADIR)." @install -d $(DESTDIR)$(DATADIR) - @install -c -m 0644 data/liquidwar.dat $(DESTDIR)$(DATADIR) + @install -c -m 0644 data/liquidwar5.dat $(DESTDIR)$(DATADIR) install_custom_map: - @echo "Installing liquidwar custom maps in $(DATADIR)/map." + @echo "Installing liquidwar5 custom maps in $(DATADIR)/map." @install -d $(DESTDIR)$(DATADIR) @install -d $(DESTDIR)$(DATADIR)/map @install -c -m 0644 custom/map/*.* $(DESTDIR)$(DATADIR)/map install_custom_texture: - @echo "Installing liquidwar custom textures in $(DATADIR)/texture." + @echo "Installing liquidwar5 custom textures in $(DATADIR)/texture." @install -d $(DESTDIR)$(DATADIR) @install -d $(DESTDIR)$(DATADIR)/texture @install -c -m 0644 custom/texture/*.* $(DESTDIR)$(DATADIR)/texture install_custom_music: - @echo "Installing liquidwar custom musics in $(DATADIR)/music." + @echo "Installing liquidwar5 custom musics in $(DATADIR)/music." @install -d $(DESTDIR)$(DATADIR) @install -d $(DESTDIR)$(DATADIR)/music @install -c -m 0644 custom/music/*.* $(DESTDIR)$(DATADIR)/music install_doc: - @if [ -f $(MAKE_DOC_DIR)/txt/rules.txt ]; then echo "Installing liquidwar plain text doc in $(DOCDIR)/txt."; install -d $(DESTDIR)$(DOCDIR)/txt; install -c -m 0644 $(MAKE_DOC_DIR)/txt/*.txt $(DESTDIR)$(DOCDIR)/txt; fi - @if [ -f $(MAKE_DOC_DIR)/html/rules.html ]; then echo "Installing liquidwar HTML doc in $(DOCDIR)/html."; install -d $(DESTDIR)$(DOCDIR)/html; install -c -m 0644 $(MAKE_DOC_DIR)/html/*.html $(DESTDIR)$(DOCDIR)/html; fi - @if [ -f $(MAKE_DOC_DIR)/man/liquidwar.6.gz ]; then echo "Installing liquidwar man page in $(MANDIR)."; install -d $(DESTDIR)$(MANDIR); install -c -m 0644 $(MAKE_DOC_DIR)/man/liquidwar.6.gz $(DESTDIR)$(MANDIR); ln -s -f liquidwar.6.gz $(DESTDIR)$(MANDIR)/liquidwar-server.6.gz; ln -s -f liquidwar.6.gz $(DESTDIR)$(MANDIR)/liquidwar-mapgen.6.gz; fi - @if [ -f $(MAKE_DOC_DIR)/info/liquidwar.info.gz ]; then echo "Installing info page $(INFODIR)/liquidwar.info.gz."; install -d $(DESTDIR)$(INFODIR); install -c -m 644 $(MAKE_DOC_DIR)/info/liquidwar.info* $(DESTDIR)$(INFODIR); if which install-info; then if test -d $(DESTDIR)$(INFODIRDIR); then if test -f $(DESTDIR)$(INFODIRDIR)/dir; then echo "Installing liquidwar info entry."; install-info --info-dir=$(DESTDIR)$(INFODIRDIR) $(MAKE_DOC_DIR)/info/liquidwar.info.gz; fi; fi; fi; fi - @if [ -f $(MAKE_DOC_DIR)/ps/liquidwar.ps ]; then echo "Installing liquidwar PostScript doc in $(DOCDIR)/ps."; install -d $(DESTDIR)$(DOCDIR)/ps; install -c -m 0644 $(MAKE_DOC_DIR)/ps/*.ps $(DESTDIR)$(DOCDIR)/ps; fi - @if [ -f $(MAKE_DOC_DIR)/pdf/liquidwar.pdf ]; then echo "Installing liquidwar PDF doc in $(DOCDIR)/pdf."; install -d $(DESTDIR)$(DOCDIR)/pdf; install -c -m 0644 $(MAKE_DOC_DIR)/pdf/*.pdf $(DESTDIR)$(DOCDIR)/pdf; fi + @if [ -f $(MAKE_DOC_DIR)/txt/rules.txt ]; then echo "Installing liquidwar5 plain text doc in $(DOCDIR)/txt."; install -d $(DESTDIR)$(DOCDIR)/txt; install -c -m 0644 $(MAKE_DOC_DIR)/txt/*.txt $(DESTDIR)$(DOCDIR)/txt; fi + @if [ -f $(MAKE_DOC_DIR)/html/rules.html ]; then echo "Installing liquidwar5 HTML doc in $(DOCDIR)/html."; install -d $(DESTDIR)$(DOCDIR)/html; install -c -m 0644 $(MAKE_DOC_DIR)/html/*.html $(DESTDIR)$(DOCDIR)/html; fi + @if [ -f $(MAKE_DOC_DIR)/man/liquidwar5.6.gz ]; then echo "Installing liquidwar5 man page in $(MANDIR)."; install -d $(DESTDIR)$(MANDIR); install -c -m 0644 $(MAKE_DOC_DIR)/man/liquidwar5.6.gz $(DESTDIR)$(MANDIR); ln -s -f liquidwar5.6.gz $(DESTDIR)$(MANDIR)/liquidwar5-server.6.gz; ln -s -f liquidwar5.6.gz $(DESTDIR)$(MANDIR)/liquidwar5-mapgen.6.gz; fi + @if [ -f $(MAKE_DOC_DIR)/info/liquidwar5.info.gz ]; then echo "Installing info page $(INFODIR)/liquidwar5.info.gz."; install -d $(DESTDIR)$(INFODIR); install -c -m 644 $(MAKE_DOC_DIR)/info/liquidwar5.info* $(DESTDIR)$(INFODIR); if which install-info; then if test -d $(DESTDIR)$(INFODIRDIR); then if test -f $(DESTDIR)$(INFODIRDIR)/dir; then echo "Installing liquidwar5 info entry."; install-info --info-dir=$(DESTDIR)$(INFODIRDIR) $(MAKE_DOC_DIR)/info/liquidwar5.info.gz; fi; fi; fi; fi + @if [ -f $(MAKE_DOC_DIR)/ps/liquidwar5.ps ]; then echo "Installing liquidwar5 PostScript doc in $(DOCDIR)/ps."; install -d $(DESTDIR)$(DOCDIR)/ps; install -c -m 0644 $(MAKE_DOC_DIR)/ps/*.ps $(DESTDIR)$(DOCDIR)/ps; fi + @if [ -f $(MAKE_DOC_DIR)/pdf/liquidwar5.pdf ]; then echo "Installing liquidwar5 PDF doc in $(DOCDIR)/pdf."; install -d $(DESTDIR)$(DOCDIR)/pdf; install -c -m 0644 $(MAKE_DOC_DIR)/pdf/*.pdf $(DESTDIR)$(DOCDIR)/pdf; fi install_icon: - @echo "Installing liquidwar icon in $(PIXDIR)." + @echo "Installing liquidwar5 icon in $(PIXDIR)." @install -d $(DESTDIR)$(PIXDIR) - @install -c -m 0644 misc/liquidwar.xpm $(DESTDIR)$(PIXDIR) + @install -c -m 0644 misc/liquidwar5.xpm $(DESTDIR)$(PIXDIR) install_desktop: @echo "Installing desktop file in $(DESKTOPDIR)." @install -d $(DESTDIR)$(DESKTOPDIR) - @install -c -m 0644 misc/liquidwar.desktop $(DESTDIR)$(DESKTOPDIR) + @install -c -m 0644 misc/liquidwar5.desktop $(DESTDIR)$(DESKTOPDIR) install_gpl: @echo "Installing GPL in $(DOCDIR)." @@ -197,31 +197,31 @@ install_readme: @install -c -m 0644 README.pl $(DESTDIR)$(DOCDIR) uninstall: - @echo "Removing binary $(GAMEDIR)/liquidwar." - @rm -f $(DESTDIR)$(GAMEDIR)/liquidwar - @echo "Removing binary $(GAMEDIR)/liquidwar-server." - @rm -f $(DESTDIR)$(GAMEDIR)/liquidwar-server + @echo "Removing binary $(GAMEDIR)/liquidwar5." + @rm -f $(DESTDIR)$(GAMEDIR)/liquidwar5 + @echo "Removing binary $(GAMEDIR)/liquidwar5-server." + @rm -f $(DESTDIR)$(GAMEDIR)/liquidwar5-server @echo "Removing data directory $(DATADIR)." @rm -rf $(DESTDIR)$(DATADIR) @echo "Removing documentation directory $(DOCDIR)." @rm -rf $(DESTDIR)$(DOCDIR) - @echo "Removing man page $(MANDIR)/liquidwar.6.gz." - @rm -f $(DESTDIR)$(MANDIR)/liquidwar.6.gz - @echo "Removing man page $(MANDIR)/liquidwar-server.6.gz." - @rm -f $(DESTDIR)$(MANDIR)/liquidwar-server.6.gz - @echo "Removing man page $(MANDIR)/liquidwar-mapgen.6.gz." - @rm -f $(DESTDIR)$(MANDIR)/liquidwar-mapgen.6.gz - @echo "Removing info page $(INFODIR)/liquidwar.info.gz." - @rm -f $(DESTDIR)$(INFODIR)/liquidwar.info* - @if which install-info; then if test -d $(DESTDIR)$(INFODIRDIR); then if test -f $(DESTDIR)$(INFODIRDIR)/dir; then echo "Removing info entry."; install-info --info-dir=$(DESTDIR)$(INFODIRDIR) --remove liquidwar; fi; fi; fi - @echo "Removing icon $(PIXDIR)/liquidwar.xpm." - @rm -f $(DESTDIR)$(PIXDIR)/liquidwar.xpm - @echo "Removing desktop file $(DESKTOPDIR)/liquidwar.desktop." - @rm -f $(DESTDIR)$(DESKTOPDIR)/liquidwar.desktop - @echo "Removing link $(BINDIR)/liquidwar." - @rm -f $(DESTDIR)$(BINDIR)/liquidwar - @echo "Removing link $(BINDIR)/liquidwar-server." - @rm -f $(DESTDIR)$(BINDIR)/liquidwar-server + @echo "Removing man page $(MANDIR)/liquidwar5.6.gz." + @rm -f $(DESTDIR)$(MANDIR)/liquidwar5.6.gz + @echo "Removing man page $(MANDIR)/liquidwar5-server.6.gz." + @rm -f $(DESTDIR)$(MANDIR)/liquidwar5-server.6.gz + @echo "Removing man page $(MANDIR)/liquidwar5-mapgen.6.gz." + @rm -f $(DESTDIR)$(MANDIR)/liquidwar5-mapgen.6.gz + @echo "Removing info page $(INFODIR)/liquidwar5.info.gz." + @rm -f $(DESTDIR)$(INFODIR)/liquidwar5.info* + @if which install-info; then if test -d $(DESTDIR)$(INFODIRDIR); then if test -f $(DESTDIR)$(INFODIRDIR)/dir; then echo "Removing info entry."; install-info --info-dir=$(DESTDIR)$(INFODIRDIR) --remove liquidwar5; fi; fi; fi + @echo "Removing icon $(PIXDIR)/liquidwar5.xpm." + @rm -f $(DESTDIR)$(PIXDIR)/liquidwar5.xpm + @echo "Removing desktop file $(DESKTOPDIR)/liquidwar5.desktop." + @rm -f $(DESTDIR)$(DESKTOPDIR)/liquidwar5.desktop + @echo "Removing link $(BINDIR)/liquidwar5." + @rm -f $(DESTDIR)$(BINDIR)/liquidwar5 + @echo "Removing link $(BINDIR)/liquidwar5-server." + @rm -f $(DESTDIR)$(BINDIR)/liquidwar5-server clean: @for d in $(MAKE_DIRS); do $(GMAKE) -C $$d clean; done @@ -244,7 +244,7 @@ world_clean: # used when preparing packages packageclean: clean world_clean @rm -r -f Makefile config.cache config.status config.log autom4te.cache - @rm -f misc/liquidward misc/macosx_info.plist misc/liquidwar.nsi misc/docker/Dockerfile-build misc/docker/Dockerfile-server misc/docker/Dockerfile-metaserver + @rm -f misc/liquidwar5d misc/macosx_info.plist misc/liquidwar5.nsi misc/docker/Dockerfile-build misc/docker/Dockerfile-server misc/docker/Dockerfile-metaserver @find . -name "*.o" -o -name "*.obj" | xargs rm -f @find . -name "*.tar.gz" -o -name "*.tgz" -o -name "*.zip" -o -name "*.rpm" -o -name "*.deb" -o -name "*.tgz" | xargs rm -f @find . -name ".xvpics" | xargs rm -rf @@ -326,7 +326,7 @@ $(PACKAGE_WIN32_ZIP): $(PACKAGE_WIN32_EXE) $(PACKAGE_WIN32_ALLEGDLL) @cp COPYING $(PACKAGE_TMP)/$(PACKAGE_WIN32_DIR)/license.txt @cp ChangeLog $(PACKAGE_TMP)/$(PACKAGE_WIN32_DIR)/changes.txt @install -d $(PACKAGE_TMP)/$(PACKAGE_WIN32_DIR)/data - @cp data/liquidwar.dat $(PACKAGE_TMP)/$(PACKAGE_WIN32_DIR)/data/lw.dat + @cp data/liquidwar5.dat $(PACKAGE_TMP)/$(PACKAGE_WIN32_DIR)/data/lw.dat @install -d $(PACKAGE_TMP)/$(PACKAGE_WIN32_DIR)/custom @cp -r custom/map $(PACKAGE_TMP)/$(PACKAGE_WIN32_DIR)/custom @cp -r custom/texture $(PACKAGE_TMP)/$(PACKAGE_WIN32_DIR)/custom @@ -353,8 +353,8 @@ $(PACKAGE_NSIS_EXE): $(PACKAGE_WIN32_ZIP) @install -d $(PACKAGE_TMP) @cp $(PACKAGE_WIN32_ZIP) $(PACKAGE_TMP) @cd $(PACKAGE_TMP) && unzip $(PACKAGE_WIN32_ZIP) - @cp misc/liquidwar.nsi $(PACKAGE_TMP)/$(PACKAGE_WIN32_DIR) - @cd $(PACKAGE_TMP)/$(PACKAGE_WIN32_DIR) && makensis liquidwar.nsi + @cp misc/liquidwar5.nsi $(PACKAGE_TMP)/$(PACKAGE_WIN32_DIR) + @cd $(PACKAGE_TMP)/$(PACKAGE_WIN32_DIR) && makensis liquidwar5.nsi @cp $(PACKAGE_TMP)/$(PACKAGE_WIN32_DIR)/$(PACKAGE_NSIS_EXE) . @rm -rf $(PACKAGE_TMP) @@ -377,7 +377,7 @@ $(PACKAGE_BINARY_TGZ): $(PACKAGE_SOURCE_TARGZ) @echo "Installing." @$(GMAKE) -C $(PACKAGE_TMP)/$(PACKAGE_SOURCE_DIR) install @echo "Creating tarball." - @tar cfP $(PACKAGE_TMP)/$(PACKAGE_BINARY_TAR) $(GAMEDIR)/liquidwar $(GAMEDIR)/liquidwar-server $(GAMEDIR)/liquidwar-mapgen $(BINDIR)/liquidwar $(BINDIR)/liquidwar-server $(BINDIR)/liquidwar-mapgen $(DOCDIR) $(DATADIR) $(MANDIR)/liquidwar.6.gz $(MANDIR)/liquidwar-server.6.gz $(MANDIR)/liquidwar-mapgen.6.gz $(PIXDIR)/liquidwar.xpm $(DESKTOPDIR)/liquidwar.desktop + @tar cfP $(PACKAGE_TMP)/$(PACKAGE_BINARY_TAR) $(GAMEDIR)/liquidwar5 $(GAMEDIR)/liquidwar5-server $(GAMEDIR)/liquidwar5-mapgen $(BINDIR)/liquidwar5 $(BINDIR)/liquidwar5-server $(BINDIR)/liquidwar5-mapgen $(DOCDIR) $(DATADIR) $(MANDIR)/liquidwar5.6.gz $(MANDIR)/liquidwar5-server.6.gz $(MANDIR)/liquidwar5-mapgen.6.gz $(PIXDIR)/liquidwar5.xpm $(DESKTOPDIR)/liquidwar5.desktop @echo "Compressing." @gzip -c -9 $(PACKAGE_TMP)/$(PACKAGE_BINARY_TAR) > $(PACKAGE_BINARY_TGZ) @echo "Cleaning up install directories." @@ -426,14 +426,14 @@ $(PACKAGE_MACOSX_TGZ): $(PACKAGE_SOURCE_TARGZ) @install -d "$(PACKAGE_TMP)/Liquid War.app/Contents/Resources/custom" @install -d "$(PACKAGE_TMP)/Liquid War.app/Contents/Resources/doc" @echo "Copying files." - @cp $(PACKAGE_TMP)/$(PACKAGE_SOURCE_DIR)/src/liquidwar "$(PACKAGE_TMP)/Liquid War.app/Contents/MacOS/" - @cp $(PACKAGE_TMP)/$(PACKAGE_SOURCE_DIR)/src/liquidwar-server "$(PACKAGE_TMP)/Liquid War.app/Contents/MacOS/" - @cp $(PACKAGE_TMP)/$(PACKAGE_SOURCE_DIR)/src/liquidwar-mapgen "$(PACKAGE_TMP)/Liquid War.app/Contents/MacOS/" - @cp $(PACKAGE_TMP)/$(PACKAGE_SOURCE_DIR)/data/liquidwar.dat "$(PACKAGE_TMP)/Liquid War.app/Contents/Resources/data/" + @cp $(PACKAGE_TMP)/$(PACKAGE_SOURCE_DIR)/src/liquidwar5 "$(PACKAGE_TMP)/Liquid War.app/Contents/MacOS/" + @cp $(PACKAGE_TMP)/$(PACKAGE_SOURCE_DIR)/src/liquidwar5-server "$(PACKAGE_TMP)/Liquid War.app/Contents/MacOS/" + @cp $(PACKAGE_TMP)/$(PACKAGE_SOURCE_DIR)/src/liquidwar5-mapgen "$(PACKAGE_TMP)/Liquid War.app/Contents/MacOS/" + @cp $(PACKAGE_TMP)/$(PACKAGE_SOURCE_DIR)/data/liquidwar5.dat "$(PACKAGE_TMP)/Liquid War.app/Contents/Resources/data/" @cp -r $(PACKAGE_TMP)/$(PACKAGE_SOURCE_DIR)/custom/map "$(PACKAGE_TMP)/Liquid War.app/Contents/Resources/custom/" @cp -r $(PACKAGE_TMP)/$(PACKAGE_SOURCE_DIR)/custom/texture "$(PACKAGE_TMP)/Liquid War.app/Contents/Resources/custom/" @cp -r $(PACKAGE_TMP)/$(PACKAGE_SOURCE_DIR)/custom/music "$(PACKAGE_TMP)/Liquid War.app/Contents/Resources/custom/" - @cp $(PACKAGE_TMP)/$(PACKAGE_SOURCE_DIR)/misc/liquidwar.icns "$(PACKAGE_TMP)/Liquid War.app/Contents/Resources/" + @cp $(PACKAGE_TMP)/$(PACKAGE_SOURCE_DIR)/misc/liquidwar5.icns "$(PACKAGE_TMP)/Liquid War.app/Contents/Resources/" @cp $(PACKAGE_TMP)/$(PACKAGE_SOURCE_DIR)/misc/macosx_info.plist "$(PACKAGE_TMP)/Liquid War.app/Contents/Info.plist" @cp $(PACKAGE_TMP)/$(PACKAGE_SOURCE_DIR)/COPYING "$(PACKAGE_TMP)/Liquid War.app/Contents/Resources/doc/" @cp $(PACKAGE_TMP)/$(PACKAGE_SOURCE_DIR)/COPYING "$(PACKAGE_TMP)/License.txt" @@ -444,9 +444,9 @@ $(PACKAGE_MACOSX_TGZ): $(PACKAGE_SOURCE_TARGZ) @cp $(PACKAGE_TMP)/$(PACKAGE_SOURCE_DIR)/README.fr "$(PACKAGE_TMP)/Liquid War.app/Contents/Resources/doc/" @cp $(PACKAGE_TMP)/$(PACKAGE_SOURCE_DIR)/README.pl "$(PACKAGE_TMP)/Liquid War.app/Contents/Resources/doc/" @cp -r $(PACKAGE_TMP)/$(PACKAGE_SOURCE_DIR)/doc/html $(PACKAGE_TMP)/$(PACKAGE_SOURCE_DIR)/doc/txt $(PACKAGE_TMP)/$(PACKAGE_SOURCE_DIR)/doc/pdf "$(PACKAGE_TMP)/Liquid War.app/Contents/Resources/doc/" - @cp $(PACKAGE_TMP)/$(PACKAGE_SOURCE_DIR)/doc/pdf/liquidwar.pdf "$(PACKAGE_TMP)/Liquid War.pdf" + @cp $(PACKAGE_TMP)/$(PACKAGE_SOURCE_DIR)/doc/pdf/liquidwar5.pdf "$(PACKAGE_TMP)/Liquid War.pdf" @echo "Updating dynamic libraries dependencies" - @if which otool; then for i in `otool -L $(PACKAGE_TMP)/$(PACKAGE_SOURCE_DIR)/src/liquidwar | grep dylib | grep -v /usr | grep /opt | cut -d "(" -f 1` ; do j=$${i##*/}; cp $$i "$(PACKAGE_TMP)/Liquid War.app/Contents/MacOS/"; chmod 644 "$(PACKAGE_TMP)/Liquid War.app/Contents/MacOS/$$j"; install_name_tool -id @executable_path/$$j "$(PACKAGE_TMP)/Liquid War.app/Contents/MacOS/$$j"; install_name_tool -change $$i @executable_path/$$j "$(PACKAGE_TMP)/Liquid War.app/Contents/MacOS/liquidwar"; done ; fi # yes, this is complicated, the idea is to run otool -L to find every library dependency, keep only those in /opt installed by macports or from source, then run install_name_tool to change references to a path relative to the executable path, so that it's findable within the package and does not rely on some developper's local install. One more point: we can't put libs outsite @executable_path (./MacOS) because if path is too long install_name_path won't work... See -headerpad_max_install_names option in LDFLAGS, might help too + @if which otool; then for i in `otool -L $(PACKAGE_TMP)/$(PACKAGE_SOURCE_DIR)/src/liquidwar5 | grep dylib | grep -v /usr | grep /opt | cut -d "(" -f 1` ; do j=$${i##*/}; cp $$i "$(PACKAGE_TMP)/Liquid War.app/Contents/MacOS/"; chmod 644 "$(PACKAGE_TMP)/Liquid War.app/Contents/MacOS/$$j"; install_name_tool -id @executable_path/$$j "$(PACKAGE_TMP)/Liquid War.app/Contents/MacOS/$$j"; install_name_tool -change $$i @executable_path/$$j "$(PACKAGE_TMP)/Liquid War.app/Contents/MacOS/liquidwar5"; done ; fi # yes, this is complicated, the idea is to run otool -L to find every library dependency, keep only those in /opt installed by macports or from source, then run install_name_tool to change references to a path relative to the executable path, so that it's findable within the package and does not rely on some developper's local install. One more point: we can't put libs outsite @executable_path (./MacOS) because if path is too long install_name_path won't work... See -headerpad_max_install_names option in LDFLAGS, might help too @echo "Cleaning up." @find $(PACKAGE_TMP) -name DUMMY -exec rm -f "{}" \; @find $(PACKAGE_TMP) -name "*.in" -exec rm -f "{}" \; @@ -489,13 +489,13 @@ $(PACKAGE_DOCKER_TABLES_SQL): www/mysql/tables.sql docker: docker-build docker-server docker-metaserver docker-build: $(PACKAGE_DOCKER_SOURCE_TARGZ) - @cd $(DOCKER_DIR) && docker build -f Dockerfile-build -t ufoot/liquidwar-build:$(VERSION) . - @cd $(DOCKER_DIR) && docker build -f Dockerfile-build -t ufoot/liquidwar-build:latest . + @cd $(DOCKER_DIR) && docker build -f Dockerfile-build -t ufoot/liquidwar5-build:$(VERSION) . + @cd $(DOCKER_DIR) && docker build -f Dockerfile-build -t ufoot/liquidwar5-build:latest . docker-server: $(PACKAGE_DOCKER_SOURCE_TARGZ) - @cd $(DOCKER_DIR) && docker build -f Dockerfile-server -t ufoot/liquidwar-server:$(VERSION) . - @cd $(DOCKER_DIR) && docker build -f Dockerfile-server -t ufoot/liquidwar-server:latest . + @cd $(DOCKER_DIR) && docker build -f Dockerfile-server -t ufoot/liquidwar5-server:$(VERSION) . + @cd $(DOCKER_DIR) && docker build -f Dockerfile-server -t ufoot/liquidwar5-server:latest . docker-metaserver: $(PACKAGE_DOCKER_METASERVER_TARGZ) $(PACKAGE_DOCKER_TABLES_SQL) - @cd $(DOCKER_DIR) && docker build -f Dockerfile-metaserver -t ufoot/liquidwar-metaserver:$(VERSION) . - @cd $(DOCKER_DIR) && docker build -f Dockerfile-metaserver -t ufoot/liquidwar-metaserver:latest . + @cd $(DOCKER_DIR) && docker build -f Dockerfile-metaserver -t ufoot/liquidwar5-metaserver:$(VERSION) . + @cd $(DOCKER_DIR) && docker build -f Dockerfile-metaserver -t ufoot/liquidwar5-metaserver:latest . diff --git a/configure.ac b/configure.ac index 1ba557d8..d1e16b21 100644 --- a/configure.ac +++ b/configure.ac @@ -485,20 +485,20 @@ AC_CONFIG_FILES([\ data/Makefile \ doc/Makefile \ doc/html/index.html \ - doc/tex/liquidwar.tex \ + doc/tex/liquidwar5.tex \ doc/man/begin.man \ doc/texi/begin.texi \ - misc/liquidward \ + misc/liquidwar5d \ misc/macosx_info.plist \ - misc/liquidwar.nsi \ + misc/liquidwar5.nsi \ misc/docker/Dockerfile-build \ misc/docker/Dockerfile-server \ misc/docker/Dockerfile-metaserver \ - liquidwar.spec]) + liquidwar5.spec]) AC_OUTPUT -dnl Change the liquidward attribute -chmod 755 misc/liquidward +dnl Change the liquidwar5d attribute +chmod 755 misc/liquidwar5d diff --git a/doc/Makefile.in b/doc/Makefile.in index 15083792..dc69545a 100644 --- a/doc/Makefile.in +++ b/doc/Makefile.in @@ -46,15 +46,15 @@ all: txt_$(DOC_TXT) html_$(DOC_HTML) man_$(DOC_MAN) info_$(DOC_INFO) ps_$(DOC_PS txt_yes: $(TXT_FILES) -html_yes: $(HTML_FILES) +html_yes: $(HTML_FILES) -man_yes: man/liquidwar.6.gz +man_yes: man/liquidwar5.6.gz -info_yes: info/liquidwar.info.gz +info_yes: info/liquidwar5.info.gz -ps_yes: ps/liquidwar.ps +ps_yes: ps/liquidwar5.ps -pdf_yes: pdf/liquidwar.pdf +pdf_yes: pdf/liquidwar5.pdf php_yes: $(PHP_FILES) @@ -76,35 +76,35 @@ php_no: uwc_no: -pdf/liquidwar.pdf : ps/liquidwar.ps +pdf/liquidwar5.pdf : ps/liquidwar5.ps @echo "Building $@..." - @cd tex; pdflatex liquidwar.tex && cd .. || cd .. - @cd tex; pdflatex liquidwar.tex && cd .. || cd .. - @if [ -f tex/liquidwar.pdf ]; then mv tex/liquidwar.pdf $@; fi + @cd tex; pdflatex liquidwar5.tex && cd .. || cd .. + @cd tex; pdflatex liquidwar5.tex && cd .. || cd .. + @if [ -f tex/liquidwar5.pdf ]; then mv tex/liquidwar5.pdf $@; fi -ps/liquidwar.ps : tex/liquidwar.dvi +ps/liquidwar5.ps : tex/liquidwar5.dvi @echo "Building $@..." @dvips -q -o $@ $< -tex/liquidwar.dvi : $(TEX_FILES) tex/liquidwar.tex +tex/liquidwar5.dvi : $(TEX_FILES) tex/liquidwar5.tex @echo "Building $@..." - @cd tex; latex liquidwar.tex && cd .. || cd .. - @cd tex; latex liquidwar.tex && cd .. || cd .. + @cd tex; latex liquidwar5.tex && cd .. || cd .. + @cd tex; latex liquidwar5.tex && cd .. || cd .. -man/liquidwar.6 : man/liquidwar.man +man/liquidwar5.6 : man/liquidwar5.man @cp $< $@ -man/liquidwar.man : $(MAN_FILES) man/begin.man man/end.man +man/liquidwar5.man : $(MAN_FILES) man/begin.man man/end.man @echo "Building $@..." @cat man/begin.man $(MAN_FILES) man/end.man > $@ -info/liquidwar.info.gz : texi/liquidwar.texi +info/liquidwar5.info.gz : texi/liquidwar5.texi @echo "Building $@..." - @rm -f info/liquidwar.info* - @makeinfo -o info/liquidwar.info $< - @gzip -9 info/liquidwar.info* + @rm -f info/liquidwar5.info* + @makeinfo -o info/liquidwar5.info $< + @gzip -9 info/liquidwar5.info* -texi/liquidwar.texi : $(TEXI_FILES) texi/begin.texi texi/end.texi +texi/liquidwar5.texi : $(TEXI_FILES) texi/begin.texi texi/end.texi @echo "Building $@..." @cat texi/begin.texi $(TEXI_FILES) texi/end.texi > $@ @@ -142,14 +142,14 @@ uwc/%.uwc: xml/%.xml makedoc.py dummy: clean: - @rm -f *~ */*~ + @rm -f *~ */*~ @rm -f makedoc.pyc @rm -f $(HTML_FILES) $(PHP_FILES) $(TEX_FILES) $(MAN_FILES) $(TXT_FILES) $(TEXI_FILES) $(UWC_FILES) - @rm -f tex/liquidwar.toc tex/liquidwar.log tex/liquidwar.dvi tex/liquidwar.aux ps/liquidwar.ps pdf/liquidwar.pdf man/liquidwar.6 man/liquidwar.6.gz man/liquidwar-server.6.gz man/liquidwar-mapgen.6.gz man/liquidwar.man info/liquidwar.info* texi/liquidwar.texi texi/liquidwar.info* + @rm -f tex/liquidwar5.toc tex/liquidwar5.log tex/liquidwar5.dvi tex/liquidwar5.aux ps/liquidwar5.ps pdf/liquidwar5.pdf man/liquidwar5.6 man/liquidwar5.6.gz man/liquidwar5-server.6.gz man/liquidwar5-mapgen.6.gz man/liquidwar5.man info/liquidwar5.info* texi/liquidwar5.texi texi/liquidwar5.info* -distclean: +distclean: @rm -f Makefile - @rm -f tex/liquidwar.tex man/begin.man texi/begin.texi html/index.html + @rm -f tex/liquidwar5.tex man/begin.man texi/begin.texi html/index.html config: @@ -157,6 +157,3 @@ check: @xmllint --valid --noout xml/*.xml dep: - - - diff --git a/doc/tex/liquidwar.tex.in b/doc/tex/liquidwar5.tex.in similarity index 100% rename from doc/tex/liquidwar.tex.in rename to doc/tex/liquidwar5.tex.in diff --git a/liquidwar.spec b/liquidwar5.spec similarity index 76% rename from liquidwar.spec rename to liquidwar5.spec index 7efa7c68..b03c6663 100644 --- a/liquidwar.spec +++ b/liquidwar5.spec @@ -1,12 +1,12 @@ Summary: A unique multiplayer wargame. Summary(fr): Un "wargame" multijoueur indit. Summary(de): Ein einzigartiges Kriegspiel fr mehrere Spieler. -Name: liquidwar +Name: liquidwar5 Version: 5.7.0 Release: 1 License: GPL Group: Amusements/Games -Source: http://freesoftware.fsf.org/download/liquidwar/liquidwar-5.7.0.tar.gz +Source: https://ufoot.org/download/liquidwar/v5/5.7.0/liquidwar5-5.7.0.tar.gz URL: https://ufoot.org/liquidwar/v5 Vendor: Christian Mauduit Packager: Christian Mauduit @@ -47,13 +47,13 @@ til multiplayer, og har netv # Building the package %build -make +make # Installing the package # The "make uninstall" is important since it prevents rpm from # putting old unused files in the archive. %install -export DESTDIR=%{buildroot} && make uninstall && make install +export DESTDIR=%{buildroot} && make uninstall && make install # Cleaning %clean @@ -65,7 +65,7 @@ rm -rf %{buildroot} # Post-install script # It basically adds the info page to the Top info page. %post -if which install-info; then if test -d %{_prefix}/info; then if test -f %{_prefix}/info/dir; then install-info --info-dir=%{_prefix}/info %{_prefix}/share/info/liquidwar.info.gz; fi; fi; fi +if which install-info; then if test -d %{_prefix}/info; then if test -f %{_prefix}/info/dir; then install-info --info-dir=%{_prefix}/info %{_prefix}/share/info/liquidwar5.info.gz; fi; fi; fi # Pre-uninstall script %preun @@ -73,27 +73,30 @@ if which install-info; then if test -d %{_prefix}/info; then if test -f %{_prefi # Post-uninstall script # It basically removes the info page to the Top info page. %postun -if which install-info; then if test -d %{_prefix}/info; then if test -f %{_prefix}/info/dir; then install-info --info-dir=%{_prefix}/info --remove liquidwar; fi; fi; fi +if which install-info; then if test -d %{_prefix}/info; then if test -f %{_prefix}/info/dir; then install-info --info-dir=%{_prefix}/info --remove liquidwar5; fi; fi; fi %files %defattr(-,root,root) -%{_prefix}/games/liquidwar -%{_prefix}/games/liquidwar-server -%{_prefix}/games/liquidwar-mapgen -%{_prefix}/bin/liquidwar -%{_prefix}/bin/liquidwar-server -%{_prefix}/bin/liquidwar-mapgen -%{_prefix}/share/games/liquidwar/ -%{_prefix}/share/doc/liquidwar/ -%{_prefix}/share/man/man6/liquidwar.6* -%{_prefix}/share/man/man6/liquidwar-server.6* -%{_prefix}/share/man/man6/liquidwar-mapgen.6* -%{_prefix}/share/info/liquidwar.info* -%{_prefix}/share/pixmaps/liquidwar.xpm -%{_prefix}/share/applications/liquidwar.desktop +%{_prefix}/games/liquidwar5 +%{_prefix}/games/liquidwar5-server +%{_prefix}/games/liquidwar5-mapgen +%{_prefix}/bin/liquidwar5 +%{_prefix}/bin/liquidwar5-server +%{_prefix}/bin/liquidwar5-mapgen +%{_prefix}/share/games/liquidwar5/ +%{_prefix}/share/doc/liquidwar5/ +%{_prefix}/share/man/man6/liquidwar5.6* +%{_prefix}/share/man/man6/liquidwar5-server.6* +%{_prefix}/share/man/man6/liquidwar5-mapgen.6* +%{_prefix}/share/info/liquidwar5.info* +%{_prefix}/share/pixmaps/liquidwar5.xpm +%{_prefix}/share/applications/liquidwar5.desktop %changelog +* Sat Nov 22 2025 Christian Mauduit +- adapt to new Allegro 5 branch, call it liquidwar5 + * Thu Sep 27 2007 Christian Mauduit - Added mapgen files, fixed deprecated RPM syntax. @@ -110,15 +113,14 @@ if which install-info; then if test -d %{_prefix}/info; then if test -f %{_prefi - Fixed some buildroot bugs - Replaced install-info --infodir=... by --info-dir=... -* Mon Mar 11 2002 Christian Mauduit +* Mon Mar 11 2002 Christian Mauduit - Recompiled with Allegro's rpm (fixes the error: "/usr/lib/liballeg.so.4.0: undefined symbol: _poly_scanline_gcol8") - Fixed the post-install script -* Sat Feb 23 2002 Christian Mauduit +* Sat Feb 23 2002 Christian Mauduit - Added proper "--target" support. - Added info documentation with install and uninstall scripts -* Thu Jan 28 2002 Christian Mauduit +* Thu Jan 28 2002 Christian Mauduit - My first rpm build of Liquid War - diff --git a/liquidwar.spec.in b/liquidwar5.spec.in similarity index 76% rename from liquidwar.spec.in rename to liquidwar5.spec.in index 66ac6f39..d578ff14 100644 --- a/liquidwar.spec.in +++ b/liquidwar5.spec.in @@ -1,12 +1,12 @@ Summary: A unique multiplayer wargame. Summary(fr): Un "wargame" multijoueur indit. Summary(de): Ein einzigartiges Kriegspiel fr mehrere Spieler. -Name: liquidwar +Name: liquidwar5 Version: @VERSION@ Release: @VERSION_REL@ License: GPL Group: Amusements/Games -Source: http://freesoftware.fsf.org/download/liquidwar/liquidwar-@VERSION@.tar.gz +Source: https://ufoot.org/download/liquidwar/v5/@VERSION@/liquidwar5-@VERSION@.tar.gz URL: https://ufoot.org/liquidwar/v5 Vendor: Christian Mauduit Packager: Christian Mauduit @@ -47,13 +47,13 @@ til multiplayer, og har netv # Building the package %build -make +make # Installing the package # The "make uninstall" is important since it prevents rpm from # putting old unused files in the archive. %install -export DESTDIR=%{buildroot} && make uninstall && make install +export DESTDIR=%{buildroot} && make uninstall && make install # Cleaning %clean @@ -65,7 +65,7 @@ rm -rf %{buildroot} # Post-install script # It basically adds the info page to the Top info page. %post -if which install-info; then if test -d %{_prefix}/info; then if test -f %{_prefix}/info/dir; then install-info --info-dir=%{_prefix}/info %{_prefix}/share/info/liquidwar.info.gz; fi; fi; fi +if which install-info; then if test -d %{_prefix}/info; then if test -f %{_prefix}/info/dir; then install-info --info-dir=%{_prefix}/info %{_prefix}/share/info/liquidwar5.info.gz; fi; fi; fi # Pre-uninstall script %preun @@ -73,27 +73,30 @@ if which install-info; then if test -d %{_prefix}/info; then if test -f %{_prefi # Post-uninstall script # It basically removes the info page to the Top info page. %postun -if which install-info; then if test -d %{_prefix}/info; then if test -f %{_prefix}/info/dir; then install-info --info-dir=%{_prefix}/info --remove liquidwar; fi; fi; fi +if which install-info; then if test -d %{_prefix}/info; then if test -f %{_prefix}/info/dir; then install-info --info-dir=%{_prefix}/info --remove liquidwar5; fi; fi; fi %files %defattr(-,root,root) -%{_prefix}/games/liquidwar -%{_prefix}/games/liquidwar-server -%{_prefix}/games/liquidwar-mapgen -%{_prefix}/bin/liquidwar -%{_prefix}/bin/liquidwar-server -%{_prefix}/bin/liquidwar-mapgen -%{_prefix}/share/games/liquidwar/ -%{_prefix}/share/doc/liquidwar/ -%{_prefix}/share/man/man6/liquidwar.6* -%{_prefix}/share/man/man6/liquidwar-server.6* -%{_prefix}/share/man/man6/liquidwar-mapgen.6* -%{_prefix}/share/info/liquidwar.info* -%{_prefix}/share/pixmaps/liquidwar.xpm -%{_prefix}/share/applications/liquidwar.desktop +%{_prefix}/games/liquidwar5 +%{_prefix}/games/liquidwar5-server +%{_prefix}/games/liquidwar5-mapgen +%{_prefix}/bin/liquidwar5 +%{_prefix}/bin/liquidwar5-server +%{_prefix}/bin/liquidwar5-mapgen +%{_prefix}/share/games/liquidwar5/ +%{_prefix}/share/doc/liquidwar5/ +%{_prefix}/share/man/man6/liquidwar5.6* +%{_prefix}/share/man/man6/liquidwar5-server.6* +%{_prefix}/share/man/man6/liquidwar5-mapgen.6* +%{_prefix}/share/info/liquidwar5.info* +%{_prefix}/share/pixmaps/liquidwar5.xpm +%{_prefix}/share/applications/liquidwar5.desktop %changelog +* Sat Nov 22 2025 Christian Mauduit +- adapt to new Allegro 5 branch, call it liquidwar5 + * Thu Sep 27 2007 Christian Mauduit - Added mapgen files, fixed deprecated RPM syntax. @@ -110,15 +113,14 @@ if which install-info; then if test -d %{_prefix}/info; then if test -f %{_prefi - Fixed some buildroot bugs - Replaced install-info --infodir=... by --info-dir=... -* Mon Mar 11 2002 Christian Mauduit +* Mon Mar 11 2002 Christian Mauduit - Recompiled with Allegro's rpm (fixes the error: "/usr/lib/liballeg.so.4.0: undefined symbol: _poly_scanline_gcol8") - Fixed the post-install script -* Sat Feb 23 2002 Christian Mauduit +* Sat Feb 23 2002 Christian Mauduit - Added proper "--target" support. - Added info documentation with install and uninstall scripts -* Thu Jan 28 2002 Christian Mauduit +* Thu Jan 28 2002 Christian Mauduit - My first rpm build of Liquid War - diff --git a/misc/liquidwar-jenkins.sh b/misc/liquidwar-jenkins.sh deleted file mode 100755 index cf4618b0..00000000 --- a/misc/liquidwar-jenkins.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/bin/sh - -############################################################################# -# Liquid War is a multiplayer wargame # -# Copyright (C) 1998-2025 Christian Mauduit # -# # -# 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 # -# # -# Liquid War homepage : https://ufoot.org/liquidwar/v5 # -# Contact author : ufoot@ufoot.org # -############################################################################# - -# Script used by Jenkins daemon to autobuild the program in -# continuous integration mode. http://jenkins-ci.org/ - -echo "******** $0 $(date) ********" -if cd liquidwar ; then - echo "******** $0 $(date) ********" - if ./bootstrap; then - echo "******** $0 $(date) ********" - if ./configure --prefix=$WORKSPACE/local ; then - echo "******** $0 $(date) ********" - if make ; then - echo "******** $0 $(date) ********" - if make install; then - echo "******** $0 $(date) ********" - if make dist; then - echo "******** $0 $(date) ********" - else - echo "make dist failed" - exit 6 - fi - else - echo "make install failed" - exit 5 - fi - else - echo "make failed" - exit 4 - fi - else - echo "./configure failed" - exit 3 - fi - else - echo "./bootstrap failed" - exit 2 - fi -else - echo "cd failed" - exit 1 -fi - -echo "OK" -exit 0 diff --git a/misc/liquidwar.desktop b/misc/liquidwar5.desktop similarity index 100% rename from misc/liquidwar.desktop rename to misc/liquidwar5.desktop diff --git a/misc/liquidwar.icns b/misc/liquidwar5.icns similarity index 100% rename from misc/liquidwar.icns rename to misc/liquidwar5.icns diff --git a/misc/liquidwar.ico b/misc/liquidwar5.ico similarity index 100% rename from misc/liquidwar.ico rename to misc/liquidwar5.ico diff --git a/misc/liquidwar.nsi.in b/misc/liquidwar5.nsi.in similarity index 100% rename from misc/liquidwar.nsi.in rename to misc/liquidwar5.nsi.in diff --git a/misc/liquidwar.png b/misc/liquidwar5.png similarity index 100% rename from misc/liquidwar.png rename to misc/liquidwar5.png diff --git a/misc/liquidwar.xpm b/misc/liquidwar5.xpm similarity index 100% rename from misc/liquidwar.xpm rename to misc/liquidwar5.xpm diff --git a/misc/liquidwar_32x32.xpm b/misc/liquidwar5_32x32.xpm similarity index 100% rename from misc/liquidwar_32x32.xpm rename to misc/liquidwar5_32x32.xpm diff --git a/misc/liquidwar_notify.sh b/misc/liquidwar5_notify.sh similarity index 100% rename from misc/liquidwar_notify.sh rename to misc/liquidwar5_notify.sh diff --git a/misc/liquidward.in b/misc/liquidwar5d.in similarity index 92% rename from misc/liquidward.in rename to misc/liquidwar5d.in index e46c88d9..3e091e33 100644 --- a/misc/liquidward.in +++ b/misc/liquidwar5d.in @@ -28,11 +28,11 @@ # are started automatically when you boot your computer. # # Keep in mind that Liquid War is a *game* so its code might not be -# 100% exploit proof, and anyway, since Liquid War comes with -# NO WARRANTY at all, you simply run it at your own risks. +# 100% exploit proof, and anyway, since Liquid War comes with +# NO WARRANTY at all, you simply run it at your own risks. # This is not to scare you, but rather to insist on the fact that # you should never run Liquid War servers as root. Run it under a -# "basic" user, which has very few rights, since the only rights the +# "basic" user, which has very few rights, since the only rights the # Liquid War daemon needs are: # - be able to bind on a socket > 1024 # - be able to append stuff to a log file @@ -43,7 +43,7 @@ # will make the Liquid War server you run on your computer register # itself on the meta-server on www.ufoot.org. So people will be aware # that you have a Liquid War server on your machine. While this is good -# for people who try to automatically find other online fellows, +# for people who try to automatically find other online fellows, # you might find this behaviour somewhat intrusive. Change the $PRIVACY # value if the default behaviour does not match your needs. @@ -52,11 +52,11 @@ unset `env | sed s/=.*//` prefix=@prefix@ -NAME=liquidward +NAME=liquidwar5d PATH=/bin:/usr/bin:/sbin:/usr/sbin -DAEMON=$prefix/games/liquidwar-server -PIDFILE=/var/games/liquidwar/$NAME.pid -LOGFILE=/var/games/liquidwar/$NAME.log +DAEMON=$prefix/games/liquidwar5-server +PIDFILE=/var/games/liquidwar5/$NAME.pid +LOGFILE=/var/games/liquidwar5/$NAME.log # As start-stop-daemon seems to be a quite Debian-specific utility, # this script is in a way designed for Debian. If you want to run it @@ -83,7 +83,7 @@ PASSWORD= # the comment which will be associated to the server # by default, it contains the name of the machine, but you might # want to put your e-mail here for instance -COMMENT="Public_Liquid_War_5_server_running_on_host_"`hostname` +COMMENT="Public_Liquid_War_5_server_running_on_host_"`hostname` # the user which should be used to start the daemon # by default, it is set to "nobody:games", this assumes that @@ -95,9 +95,9 @@ USER=nobody:games # if you want the server to warn you whenever someone connects on it, # you might set up a callback script by uncommenting the line below. -# You'll also need to edit and install the liquidwar_notify.sh script +# You'll also need to edit and install the liquidwar_notify.sh script # manually -CALLBACK=$prefix/games/liquidwar_notify.sh +CALLBACK=$prefix/games/liquidwar5_notify.sh OPTIONS=" -"$NBPLAYERS" -"$PRIVACY" -log "$LOGFILE" -password "$PASSWORD" -comment \""$COMMENT"\" -callback "$CALLBACK @@ -130,4 +130,3 @@ case "$1" in esac exit 0 - diff --git a/misc/liquidward.logrotate b/misc/liquidwar5d.logrotate similarity index 100% rename from misc/liquidward.logrotate rename to misc/liquidwar5d.logrotate diff --git a/src/Makefile.in b/src/Makefile.in index 29350567..7ab2174e 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -4,7 +4,7 @@ exec_prefix = @exec_prefix@ datarootdir = @datarootdir@ datadir = @datadir@ -DATADIR = $(datadir)/games/liquidwar +DATADIR = $(datadir)/games/liquidwar5 GAMEDIR = $(exec_prefix)/games HOST_OPT = @HOST_OPT@ @@ -213,7 +213,7 @@ OBJ_FILES = $(addsuffix .o, $(OBJ_NAMES)) OBJ_FILES_SRV = $(addsuffix .o, $(OBJ_NAMES_SRV)) OBJ_FILES_MAPGEN = $(addsuffix .o, $(OBJ_NAMES_MAPGEN)) -EXE_FILES = liquidwar liquidwar-server liquidwar-mapgen +EXE_FILES = liquidwar5 liquidwar5-server liquidwar5-mapgen ifeq ($(STATIC),yes) LINK_OPTIONS = --static @@ -224,19 +224,19 @@ else endif CONFIG_OPTIONS = \ - -DCONFIG_UNIX_CFG=\".liquidwarrc\" \ + -DCONFIG_UNIX_CFG=\".liquidwar5rc\" \ -DCONFIG_UNIX_DAT=\"$(DATADIR)/data\" \ -DCONFIG_UNIX_MAP=\"$(DATADIR)/data/map/\" \ -DCONFIG_UNIX_TEX=\"$(DATADIR)/data/texture/\" \ -DCONFIG_UNIX_MID=\"$(DATADIR)/data/music/\" \ - -DCONFIG_UNIX_SRV=\"$(GAMEDIR)/liquidwar-server\" \ - -DCONFIG_UNIX_GEN=\"$(GAMEDIR)/liquidwar-mapgen\" + -DCONFIG_UNIX_SRV=\"$(GAMEDIR)/liquidwar5-server\" \ + -DCONFIG_UNIX_GEN=\"$(GAMEDIR)/liquidwar5-mapgen\" CMD_CC = $(CC) $(CFLAGS) $(ALCFLAGS) -c $(DEBUG_FLAGS) -Wall -W -Werror $(HOST_CPU_CC) $(CONFIG_OPTIONS) $(DEBUG_OPTIONS) $(SPRINTF_OPTIONS) -DUNIX -D_THREAD_SAFE all: $(EXE_FILES) -liquidwar: $(OBJ_FILES) +liquidwar5: $(OBJ_FILES) @echo "Linking $@ (host=$(HOST), debug=$(DEBUG), static=$(STATIC))" @$(CC) $(LDFLAGS) $(DEBUG_FLAGS) $(LINK_OPTIONS) -o $@ $(OBJ_FILES) $(PTHREAD) $(EXTERN_LIBS) @if [ "$(DEBUG)" = "yes" ] && [ "$$(uname -s)" = "Darwin" ]; then \ @@ -244,11 +244,11 @@ liquidwar: $(OBJ_FILES) dsymutil $@; \ fi -liquidwar-server: $(OBJ_FILES_SRV) +liquidwar5-server: $(OBJ_FILES_SRV) @echo "Linking $@ (host=$(HOST), debug=$(DEBUG), static=$(STATIC))" @$(CC) $(LDFLAGS) $(DEBUG_FLAGS) $(LINK_OPTIONS) -o $@ $(OBJ_FILES_SRV) $(PTHREAD) -liquidwar-mapgen: $(OBJ_FILES_MAPGEN) +liquidwar5-mapgen: $(OBJ_FILES_MAPGEN) @echo "Linking $@ (host=$(HOST), debug=$(DEBUG), static=$(STATIC))" @$(CC) $(LDFLAGS) $(DEBUG_FLAGS) $(LINK_OPTIONS) -o $@ $(OBJ_FILES_MAPGEN) -lm $(PTHREAD) $(EXTERN_LIBS)