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:
and the game in progress:
You will see there are three different kinds of figures...
is the
"standard" one, for which you score 10 points. 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, , 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
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