Attack of the Lesbian Communists


NEWS FLASH!!! There is now an online javascript version of this game available which you can play in your browser. It is very nearly as shit as the original. See here: Attack of the Lesbian Communists - Online playable version

This is something of an exception to the general run of the rants in this section of the site, as while its subject is undoubtedly crap, it amuses me rather than pisses me off...

My habit of collecting and hoarding junk results in my possession of many weird and strange items. One of these is a green binder containing what appears to be a disassembly of the ROM out of a Commodore PET. At one instruction per line, this obviously takes a lot of paper, and it seems that paper was in short supply; part of the listing is printed on the back of other listings, and one of those other listings is the source code for a game in BBC BASIC. Being of a somewhat strange disposition, I scanned the game code, tried to OCR it, failed dismally (not much to my surprise), had a smoke and typed it in the long way.

It does run... there don't appear to be any actual bugs in it. It's just the features that are crap. Awkwardly laid out controls, which are unresponsive; really slow updates during which the controls don't work; the steamroller tears massive holes in the fence which are apparently repaired by magic; it also manages to run over a lot of lesbians without actually killing them; the graphics are much more crap than 4 colours and 320x256 pixels would suggest.

The code is, if anything, worse; it's worth reading for its entertainment value, because like the A-Team it's so bad it's good. BBC BASIC with GOTOs - and what use is made of the "structured programming" features of BBC BASIC seems to make this code harder to follow, not easier. Control codes and user-defined characters are entered inconsistently, sometimes as CHR$(x) and sometimes as literal characters (which are further obfuscated by the printer on which the listing was produced apparently folding E0-FF onto 80-9F, or something - and what the fuck character set is the printer using anyway? It's not BBC, it's not IBM PC and it's not PETSCII...). Random and inappropriate mixtures of integer and floating-point variables, weird variable and procedure names (PROCMCL is probably "PROC Move Communist Lesbian", but what the fuck is PROCAPHNL?), and what is the reason for choosing 43 as a marker value for a dead lesbian?

Still, having said all that, it is possible to play the game and it is possible to win, and it's so politically incorrect it's fucking funny. For a bit, anyway. So I've decided to make it available for download. To run it, you will either need a BBC Micro (duh) or a BBC Micro emulator, for which there are many choices listed. (See Xbeeb notes below.) You will also need the source code, of course:

BBC Micro format text file (line break = CR) (ie. Mac-compatible)
Linux format text file (line break = LF)
DOS format text file (line break = CRLF)
BBC Micro tokenised BASIC file (produced from text file using the Xbeeb emulator)

Scans of the original listing (warning - big files!):
Page 1 (2133k), Page 2 (5570k), Page 3 (3315k)

A couple of screenshots. This is the opening screen:
ALC intro screen

and the game in progress:
ALC being played

You will see there are three different kinds of figures... 10-point lesbian is the "standard" one, for which you score 10 points. 20-point lesbian is worth 20 points, and appears to be carrying something - a placard? (odd shape, though) a baby? (parthenogenetic?) a parrot on the shoulder? (WTF?) Finally, 30-point lesbian, which looks like it's one in a wheelchair, is worth 30 points.

I see no reason why the driver of the steamroller should be (apparently) a dwarf, nor why it should lack a flywheel. I reckon it looks more like a traction engine, anyway...

Feel free to copy and distribute this, improve it, port it... contact me for copyright details. Anyone fancy writing a 3D version for Linux?

Have fun!


Notes on Xbeeb emulator
I figured that Xbeeb was the best for my purposes out of the various emulators available, but I still had to frig about a bit to get it to work. The first problem was that it failed with the error message "Can't handle default screen with multiple visuals". A little brute-force experimentation revealed that if one comments out the appropriate "exit(1)" in src/Screen.c, then it doesn't seem to mind in practice that the default screen has multiple visuals... See below:

       MyVisual = XGetVisualInfo ( dpy, VisualScreenMask | VisualDepthMask, 
               &VisualTmpl, &visuals );
       if ( visuals != 1 ) {
               fprintf ( stderr, "can't handle default screen with multiple "
                       "visuals\n" );
/*              exit ( 1 ); */


The other thing was that the instructions for installing the fonts do not make it clear that the "xset fp..." commands have to be repeated every time you start X; having been told about them once apparently isn't sufficient to ensure that it doesn't need to be told about them again. This can be cured by (assuming the fonts were installed in /usr/X11R6/lib/X11/fonts/xbeeb/) having the following in /etc/X11/xinit/xinitrc:

xset fp+ /usr/X11R6/lib/X11/fonts/xbeeb/
xset fp rehash


No doubt someone who is not a total ignoramus where fonts are concerned will be able to think of a better way of doing it, but that works for me.

xbeeb has a weird-ass keyboard layout; "shift" is not where you would expect it to be. Read doc/Keyboard - you'll need it!

In order to find files in its working directory xbeeb needs a metafile containing the Acorn DFS directory information. For a file FOO, the metafile would be FOO.inf and the following directory information seems to be good enough for either a text file or a tokenised BASIC file - the length is missing, but the length is also missing from the metadata on files saved from within xbeeb, so presumably it gets the length from the host OS:

$.FOO    FF1900  FF8023


Finally, xbeeb needs to be started with "xbeeb -d ." in order to make it take the current directory as its working directory; if you don't do this it sets its working directory to be something off with the fairies and you can't sodding find any of your files.




Back to Crap Stuff


Back to Pigeon's Nest


Be kind to pigeons




Valid HTML 4.01!




    2 MODE7
   30 *FX 229,1
   40 PROCinst
   50 DIMREF(20,3)
   60 X%=520:Y%=520:ENVELOPE 1,129,240,-2,0,1,40,1,127,-12,-127,-127,127,0
   70 A=0:B=27:G$="":electro=0:score=0:charge=9
   80 *K.0MO.7|ML.|N|M
   90 *K.1RUN|M
  100 MODE1
  110 VDU23,224,0,0,0,0,0,0,&10,&38,             23,225,&10,&38,&54,&BA,&38,&38,&28,&28, 23,226,&D0,&F0,&7C,&3A,&38,&38,&28,&28, 23,227,&10,&7C,&7C,&FE,&FE,&FE,&82,&82
  120 VDU23,228,&7F,&10,&10,&10,&10,&10,&14,&1E, 23,229,&FF,0,0,0,0,0,0,&40,             23,230,&FF,0,0,0,0,0,0,0,               23,231,&FF,0,0,0,0,0,0,0,                23,232,&FC,&18,&18,&18,&18,&18,&18,&18
  130 VDU23,233,&14,&17,&14,&7F,&47,&4E,&4C,&58, 23,234,&9F,&64,&E4,&FF,&1C,&0E,&06,&03, 23,235,&1F,&FF,&1F,&FF,0,0,0,0,         23,236,&01,&02,&FC,&FF,0,0,0,0,          23,237,&F8,&18,&18,&FE,&7E,&7E,&7E,&7E
  140 VDU23,238,&58,&58,&4C,&4E,&7F,&03,0,0,     23,239,3,3,6,&0E,&1C,&F8,&E0,0,         23,240,&FF,&43,&2F,&1F,0,0,0,0,         23,241,&FF,0,&C0,&FF,0,0,0,0,            23,242,&FE,&18,&3C,&E6,&66,&3C,&18,0
  150 VDU23,243,0,0,0,0,0,0,&3C,&18
  160 DIM les$(3):les$(1)=CHR$(224)+CHR$(8)+CHR$(10)+CHR$(225):les$(2)=CHR$(224)+CHR$(8)+CHR$(10)+CHR$(226):les$(3)=CHR$(224)+CHR$(8)+CHR$(10)+CHR$(227)
  170 eng$="    у"+STRING$(5,CHR$(8))+CHR$(10)+"дежзи"+STRING$(5,CHR$(8))+CHR$(10)+"йклмн"+STRING$(5,CHR$(8))+CHR$(10)+"опрст"
  320 PROCFEN:FORX=1TO20:REF(X,0)=RND(35)+2:REF(X,1)=RND(18)+10:REF(X,3)=0
  322   REF(X,2)=1:Q=RND(6):IFQ=6THENREF(X,2)=3
  324   IFQ=5ORQ=4THENREF(X,2)=2
  326   NEXT:PROCRED(1):COLOUR3
  328 TIME=0
  330 PROCSPLAT:GOTO330
19999 STOP
20000 DEFPROCMCL(X,Y,T):IF X<0 OR Y<0 THEN ENDPROC ELSE PRINTTAB(X,Y);les$(T):ENDPROC
20010 DEFPROCMENG(X,Y):COLOUR0:PRINTTAB(A,B);eng$:COLOUR3:PRINTTAB(X,Y);eng$:A=X:B=Y:ENDPROC
20020 DEFPROCFEN: LOCAL X%
20030 FORF%=-324TO1280STEP32:MOVEF%,700:DRAWF%+324,1024:MOVEF%,1024:DRAWF%+324,700:NEXT
20040 COLOUR131:COLOUR0:PRINTTAB(0,0);"SCORE ";score;" CHARGE ";charge:COLOUR128:COLOUR3:ENDPROC
20050 DEFFNCWRS
20070 G$=INKEY$(1):X%=X%+32*((G$="," AND X%>0)-(G$="." AND X%<1280)):Y%=Y%+32*((G$="X" AND Y%>0)-(G$="C" AND Y%<1024))
20080 Q=POINT(X%+4,Y%+4):MOVEA%,B%-40:PLOT7,A%,B%+40:MOVEA%-40,B%:PLOT7,A%+40,B%
20090 MOVEX%,Y%-40:PLOT21,X%,Y%+40:MOVEX%-40,Y%:PLOT21,X%+40,Y%
20100 A%=X%:B%=Y%
20110  =Q
20120 DEFPROCSPLAT
20130 REPEAT:IFTIME>200THENPROCAPHNL
20132   IFG$="V"ORG$="M"THENelectro=1:PROCelectrify
20135   D=FNCWRS:UNTILG$=" "
20140 IFD<>1THENENDPROC
20142 XS=(X%/32-2)/32:YS=((30-Y%/32)-27)/32
20143 Y=27:Z=TIME
20145 FORX=0TO X%/32-2 STEP XS
20150   PROCMENG(X,Y):Y=Y+YS
20155   NEXT:PROCKILL
20160 TIME=Z:ENDPROC
20170 DEFPROCAARGH
20180 SOUND2,1,1,5:ENDPROC
20190 DEFPROCBZZZT:SOUND&0010,-15,7,15:SOUND1,-1,75,15:PROCAARGH:ENDPROC
20200 DEFPROCRED(U):LOCAL X%,D%:FOR X%=1 TO 20
20210   IFREF(X%,3)<>43THEN COLOUR0:PROCMCL(REF(X%,0),REF(X%,1),1):REF(X%,1)=REF(X%,1)-U:COLOUR1:PROCMCL(REF(X%,0),REF(X%,1),REF(X%,2)) ELSE D%=D%+1
20215   IFREF(X%,1)<=1 AND electro=1 THEN PROCBZZZT:REF(X%,3)=43:REF(X%,1)=20:score=FNINC(X%)
20217   IFREF(X%,1)<0THEN20330
20220   NEXT:COLOUR3:*FX21,0
20222 IFD%=20THEN20400
20225 ENDPROC
20230 DEFPROCKILL:LOCAL X:PROCAARGH
20240 C%=X%/32:D%=(30-Y%/32)+1
20250 FORX=1TO20:IF((REF(X,0)=C%)AND(REF(X,1)=D%))THENREF(X,3)=43:score=FNINC(X)
20260   NEXT:PROCMENG(0,27):D=FNCWRS:PROCFEN:PROCRED(0):ENDPROC
20270 DEFPROCAPHNL:PROCRED(1):electro=0:PROCelectrify:TIME=0:ENDPROC
20280 DEFPROCelectrify:IFcharge=0THEN20300
20290 IFelectro<>0THENGCOL2,2:MOVE0,1024:MOVE0,974:PLOT85,1280,1024:PLOT85,1280,974:GCOL0,3:charge=charge-1:ENDPROC
20300 PROCFEN:COLOUR1:FORX=1TO20:IFREF(X,3)<>43THENPROCMCL(REF(X,0),REF(X,1),REF(X,2))
20310   NEXT:COLOUR3:ENDPROC
20320 DEFFNINC(X)=score+10*REF(X,2)
20330 CLEAR:MODE7
20340 FORX=0TO1:PRINTTAB(6,9+X);CHR$141;CHR$134;"The fence is breached !!!":NEXT
20345 PRINT'"…You have qualified as a Russian agent"
20350 FORX=-15TO0:SOUND0,X,5,5:NEXT
20360 PRINT''"‚Do you want to go again?ˆ(Y or N)"
20370 REPEAT:A$=GET$:UNTILA$="Y"ORA$="N"
20380 IFA$="Y"THENRUN
20390 CLS:END
20400 CLEAR:MODE7:FORX=0TO1:PRINTTAB(4,9+X);CHR$141;CHR$134;"Well done! You got them all!":NEXT
20410 PRINT'"…Robertson's will be along to scrape up …              the remains"
20420 FORX=1TO5:SOUND1,-15,180-10*X,5:SOUND1,0,0,5:NEXT
20430 GOTO20360
20440 DEFPROCinst
20450 FORX=0TO1:PRINTTAB(1,X);CHR$141;CHR$129;"ATTACK OF THE LESBIAN COMMUNISTS":NEXT
20460 PRINT"…      The Greenham Common Game"
20470 PRINT'"You represent the forces of Good and    Sanity,as embodied by the Thatcher      Government.Several leftist subversives, who call themselves 'peace women' but"
20480 PRINT"are really lesbian communists,are prac- tising sabotage on the fence of the     nuclear base at Greenham Common by      cutting holes in the fence with a view"
20490 PRINT"to introducing Russian agents to the    cruise missile silos within.Your job is to align the crosswires on them and thenscramble a steamroller to run them over.";
20500 PRINT"As a last resort,the top wire of the    fence can be electrified;unfortunately  as the base is far from civilisation theelectricity comes from batteries,which"
20510 PRINT"will only last for 10 electrifications."
20520 PRINT'"ƒˆPress any key to continue"
20530 A=GET:CLS
20540 FORX=0TO1:PRINTTAB(14,X);CHR$141;CHR$134;"CONTROLS":NEXT
20550 PRINT'''"‚Xƒ  Move horizontal crosswire down"
20560 PRINT'"‚Cƒ  Move horizontal crosswire up"
20570 PRINT'"‚,ƒ  Move vertical crosswire left"
20580 PRINT'"‚.ƒ  Move vertical crosswire right"
20590 PRINT'"‚Vƒ  Electrify fence"
20600 PRINT'"‚Mƒ  Electrify fence"
20610 PRINT'"‚Spaceƒ  Scramble steamroller to splat"
20620 PRINT'''"ˆ…Press any key to start"
20630 A=GET: ENDPROC