Merge pull request #1574 from xexyl/akari11-try
Format/typo check 2011/akari + improve try.sh
This commit is contained in:
15 files changed
+2904
-88
No files matched your search
+14
-5
@@ -24,17 +24,26 @@ tested with Windows. See [alternate code](#alternate-code) below.
|
|||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
### Alternate code:
|
## Alternate code:
|
||||||
|
|
||||||
The author provided two additional versions, [toledo3-sbar.c](toledo3-sbar.c)
|
The author provided two additional versions, [toledo3-sbar.c](toledo3-sbar.c)
|
||||||
and [toledo3-txt.c](toledo3-txt.c). Respectively these create a status bar and
|
and [toledo3-txt.c](toledo3-txt.c). Respectively these create a status bar and
|
||||||
make the game text only. These are built by default.
|
make the game text only.
|
||||||
|
|
||||||
|
|
||||||
|
### Alternate build:
|
||||||
|
|
||||||
|
With the exception of the Windows version, these are built by default. To build
|
||||||
|
the Windows version, [toledo3.alt.c](toledo3.alt.c), you will have to figure out
|
||||||
|
how to compile Windows code.
|
||||||
|
|
||||||
|
|
||||||
|
### Alternate use:
|
||||||
|
|
||||||
Use `toledo3-sbar` and `toledo3-txt` as you would `toledo3` above.
|
Use `toledo3-sbar` and `toledo3-txt` as you would `toledo3` above.
|
||||||
|
|
||||||
The author also provided a version that was [tested for some compilers in
|
As for the Windows version, `toledo3.alt`, we presume you can open it like any
|
||||||
Windows](layer.c). As we have no Windows system to test with you will have to
|
other application.
|
||||||
figure out how to compile it but it did work at one time in some set ups.
|
|
||||||
|
|
||||||
|
|
||||||
## Judges' remarks:
|
## Judges' remarks:
|
||||||
|
|||||||
@@ -0,0 +1,66 @@
|
|||||||
|
#include "layer.c"
|
||||||
|
char *l="dbcefcbddabcddcba~WAB+ +BAW~ +-84HLSU?A6J57IKJT576,",
|
||||||
|
*F=" ,>>,> xl~w/? ,>>>,s m\177>>\177\177 mm2>>> >uk>>> ",*f;y,u;
|
||||||
|
#define v for (i=0,b=0;b>511?b=0,i+=64:0,i<512;b+=64) A=i/64*10+b/64+21,XCopy\
|
||||||
|
Plane(d, r[I[A]+7+14*(i+b>>6&1)+28*(A==z)],w,C,0,0,64,64,b,i,1); XFlush(d);
|
||||||
|
#define _(a) *f++=a&*F?-(z%14<7):"U\252U\0DDDD"[z/14*2|u&1],
|
||||||
|
#define G(p) p##Pixel(d,DefaultScreen(d))
|
||||||
|
#define R(a) |(a==O|p==a)*
|
||||||
|
#define P return y=~y,
|
||||||
|
#define a X(0,0,0,
|
||||||
|
#define H while(
|
||||||
|
#define D ;if(
|
||||||
|
|
||||||
|
long
|
||||||
|
I[304],b,i,z;main(x,W) char**W; { Display *d =
|
||||||
|
XOpenDisplay(""); Window w = XCreateSimpleWindow
|
||||||
|
(d, DefaultRootWindow(d), 64,64,512,512,2,G(Black)
|
||||||
|
,G(Black)); XGCValues g; XButtonEvent e; long A,r
|
||||||
|
[56],Z,* m = I , C ,Y; XSelectInput(d,w,32772);
|
||||||
|
XMapWindow( d, w); g. foreground = G(White);
|
||||||
|
C=XCreateGC(d,w,4,&g); F+=48; H f=I,i=0,z<56){
|
||||||
|
H u=0,i++<8){ H _(0)_( 64)_(16)_(8)_(4)_(2)_(1
|
||||||
|
)_(0)++u<8); F++; } F-= z%7-6?z%14<6?16:0:8; r[
|
||||||
|
z++]=XCreateBitmapFromData(d,w,I,64,64); } srand(
|
||||||
|
time(z=u=0)); H I[z]=-( z>98|z<21|(z+1)%10<2),
|
||||||
|
++z<120); H ++m<9+I) 80 [m]=-2,90[m]=~(20[m]=7&*
|
||||||
|
l++),30[m]=1; D 1<x) Z= *W[1]-45; D 2<x){ a u,1
|
||||||
|
,Z); a u,0,1); z=0; } H 1){ XNextEvent(d,&e); D
|
||||||
|
e.type==12){ v } D e. type==4){ b=e.y/64*10+e
|
||||||
|
.x/64+21; D(b[I]^y)<-1) { z=b; v} else{ i=(b<29
|
||||||
|
|b>90)&((z[I]^y)==-2)?- 6^y:z[I]; Y=y; a u,0,1);
|
||||||
|
z=0; v D 1<x&&Y-y){ a u ,1,Z); a u,0,1); } z=0;
|
||||||
|
v } } } }
|
||||||
|
|
||||||
|
|
||||||
|
X(w,c,h,e,S,s)
|
||||||
|
|
||||||
|
|
||||||
|
{ int p,O= *l,t,d,o,C ,*g,E,n,*m =I,N=-1e8,
|
||||||
|
A,L,r,x = 10,q; y=~y ; H--O>20)
|
||||||
|
{ o=I[p=O] D q=o^y,q> 0){ q+=(q< 2)*y,C=q
|
||||||
|
["51#/+++"], A=q["95+3/33"]; do { m=0,
|
||||||
|
r=I[p+=C[l ]-64] D !w |p==w&&q>1 |C+2<A|!r)
|
||||||
|
{ d=abs(O- p) D g=q<2 &e>>6==p+(
|
||||||
|
y?x:-x)?I+ (e>>6):0, !r&(q>1|d% x<1||g)|(r
|
||||||
|
^y)<-1){ n =o,t=q<2&( 89<p|30>p)
|
||||||
|
?n+=y|1,6^ y:o+(y|1) D (r^y)<-6 ) P 1e7-811
|
||||||
|
*h; H n-t) { O[I]=0,p [I]=n,m?*g
|
||||||
|
=*m,*m=0:g ?*g=0:0; E=e&63 R( 91)16 R(28)
|
||||||
|
4 R(21)2 R (98)32; L= (q>1?6-q?l
|
||||||
|
[p/x-1]-l[ O/x-1]-q+2 :(E|=y?8:1 ,!!m)*9:(E
|
||||||
|
|=20-d?0: 64*p,n-o?( l[15+n]-' '
|
||||||
|
)*9:d/8+!! g*99))+(l[ r+15]-' ') *9+l[p%x]-
|
||||||
|
h-l[O%x]; L-=s>h||s== h&L>49&1<s
|
||||||
|
?X(s>h?0:p ,L,h+1,E,N ,s):0 D !( z-O|i-n|h|
|
||||||
|
p-b|S|L<- 1e6))return u=E; O[I]=
|
||||||
|
o,p[I]=r,m ?*m=*g,*g= 0:g?*g=-2^ y:0 D S|h&&
|
||||||
|
(L>N||!h&N ==L&&rand( )&4)){ N=L
|
||||||
|
D !h&&s) i =n,z=O,b=p D h&&c-L<S ) P L; } q
|
||||||
|
>5&d<2&C+6 <A&&(g=I+p ,r=I[p+=p-
|
||||||
|
O],m=p<O?g -3:g+2,!(e &(p<O?3:5) <<3*-y|*g|
|
||||||
|
r|m[p<O?1: -1])&&L>- 1e6&&1e6>a
|
||||||
|
63,1,0))?d ++:(n+=y|1 );} } } C +=q<2&C+3>
|
||||||
|
A&((y?O<80 :39<O)||r) ; } H!r&q>
|
||||||
|
2&q<6||(p= O,++C<A)) ; } } P N+ 1e8?N:0; }
|
||||||
|
|
||||||
@@ -9,3 +9,5 @@ even_output.ppm
|
|||||||
odd_output.ppm
|
odd_output.ppm
|
||||||
akari.orig
|
akari.orig
|
||||||
prog.orig
|
prog.orig
|
||||||
|
rot13.c
|
||||||
|
expanded_and_rot13_output.txt
|
||||||
+7
-30
@@ -14,30 +14,6 @@ make
|
|||||||
|
|
||||||
### Try:
|
### Try:
|
||||||
|
|
||||||
```sh
|
|
||||||
./akari < example.ppm > odd_output.ppm
|
|
||||||
./akari - - even < example.ppm > even_output.ppm
|
|
||||||
./akari example.ppm odd_output.ppm
|
|
||||||
|
|
||||||
make akari2
|
|
||||||
cat akari2.c
|
|
||||||
|
|
||||||
./akari2 < akari2.c
|
|
||||||
./akari2 rot13 < akari2.c
|
|
||||||
|
|
||||||
make akari3
|
|
||||||
cat akari3.c
|
|
||||||
|
|
||||||
./akari3
|
|
||||||
|
|
||||||
make akari4
|
|
||||||
cat akari4.c
|
|
||||||
|
|
||||||
./akari4
|
|
||||||
```
|
|
||||||
|
|
||||||
You can automate the above by running:
|
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
./try.sh
|
./try.sh
|
||||||
```
|
```
|
||||||
@@ -58,7 +34,7 @@ properly**_.
|
|||||||
`PPM` files with the header `P6 <width> <height> 255` are accepted.
|
`PPM` files with the header `P6 <width> <height> 255` are accepted.
|
||||||
|
|
||||||
* [ASCII art](https://en.wikipedia.org/wiki/ASCII_art) (with [end of
|
* [ASCII art](https://en.wikipedia.org/wiki/ASCII_art) (with [end of
|
||||||
lines](https://en.wikipedia.org/wiki/Newline) in LF bytes only, _**not** CRLF_!)
|
lines](https://en.wikipedia.org/wiki/Newline) in LF bytes only, _**not** CR-LF_!)
|
||||||
|
|
||||||
Anything that is not parsable as `PGM` or `PPM` will be downsampled as ASCII art.
|
Anything that is not parsable as `PGM` or `PPM` will be downsampled as ASCII art.
|
||||||
|
|
||||||
@@ -68,15 +44,16 @@ Anything that is not parsable as `PGM` or `PPM` will be downsampled as ASCII art
|
|||||||
`Akari` is an image downsampling utility. She accepts up to 3 arguments:
|
`Akari` is an image downsampling utility. She accepts up to 3 arguments:
|
||||||
|
|
||||||
The first argument is the input image. If it's `-` or unspecified, `Akari`
|
The first argument is the input image. If it's `-` or unspecified, `Akari`
|
||||||
will read from stdin.
|
will read from `stdin`.
|
||||||
|
|
||||||
The second argument is the output image. If it's `-` or unspecified,
|
The second argument is the output image. If it's `-` or unspecified,
|
||||||
`Akari` will write to stdout.
|
`Akari` will write to `stdout`.
|
||||||
|
|
||||||
The third argument, if specified, causes `Akari` to keep even pixels on even
|
The third argument, if specified, causes `Akari` to keep even pixels on even
|
||||||
[scanlines](https://en.wikipedia.org/wiki/Scan_line). By default `Akari` will
|
[scanlines](https://en.wikipedia.org/wiki/Scan_line). By default `Akari` will
|
||||||
keep odd pixels on odd [scanlines](https://en.wikipedia.org/wiki/Scan_line).
|
keep odd pixels on odd [scanlines](https://en.wikipedia.org/wiki/Scan_line).
|
||||||
|
|
||||||
|
|
||||||
### Examples:
|
### Examples:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
@@ -110,8 +87,8 @@ natural to try:
|
|||||||
```
|
```
|
||||||
|
|
||||||
`akari2.c` is also a valid C program, and accepts up to 1 argument.
|
`akari2.c` is also a valid C program, and accepts up to 1 argument.
|
||||||
By default, this second program reads text from stdin and writes
|
By default, this second program reads text from `stdin` and writes
|
||||||
expanded output to stdout. If the extra argument is specified, the
|
expanded output to `stdout`. If the extra argument is specified, the
|
||||||
output text will also pass through a rot13 filter.
|
output text will also pass through a rot13 filter.
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
@@ -142,7 +119,7 @@ We must go deeper:
|
|||||||
|
|
||||||
`akari3.c` and `akari4.c` are still (mostly valid) C programs.
|
`akari3.c` and `akari4.c` are still (mostly valid) C programs.
|
||||||
`gcc -Wall` will output a few warnings, but still produce output
|
`gcc -Wall` will output a few warnings, but still produce output
|
||||||
executables. The output executables each print a message to stdout.
|
executables. The output executables each print a message to `stdout`.
|
||||||
|
|
||||||
It takes quite a bit of skill and obfuscation to interleave a
|
It takes quite a bit of skill and obfuscation to interleave a
|
||||||
C program 4 levels deep, it's much easier to interleave something like
|
C program 4 levels deep, it's much easier to interleave something like
|
||||||
|
|||||||
+29
-3
@@ -24,18 +24,44 @@ clear
|
|||||||
./akari - - even < example.ppm > even_output.ppm
|
./akari - - even < example.ppm > even_output.ppm
|
||||||
./akari example.ppm odd_output.ppm
|
./akari example.ppm odd_output.ppm
|
||||||
|
|
||||||
make akari2 || exit 1
|
make akari2 >/dev/null|| exit 1
|
||||||
|
read -r -n 1 -p "Press any key to cat akari2.c: "
|
||||||
cat akari2.c
|
cat akari2.c
|
||||||
|
echo 1>&2
|
||||||
|
|
||||||
|
read -r -n 1 -p "Press any key to run: ./akari2 < akari2.c: "
|
||||||
./akari2 < akari2.c
|
./akari2 < akari2.c
|
||||||
|
echo 1>&2
|
||||||
|
|
||||||
|
read -r -n 1 -p "Press any key to run: ./akari2 rot13 < akari2.c: "
|
||||||
./akari2 rot13 < akari2.c
|
./akari2 rot13 < akari2.c
|
||||||
|
|
||||||
make akari3 || exit 1
|
make akari3 >/dev/null|| exit 1
|
||||||
|
|
||||||
|
read -r -n 1 -p "Press any key to cat akari3.c: "
|
||||||
cat akari3.c
|
cat akari3.c
|
||||||
|
echo 1>&2
|
||||||
|
|
||||||
|
read -r -n 1 -p "Press any key to run: ./akari3: "
|
||||||
./akari3
|
./akari3
|
||||||
|
echo 1>&2
|
||||||
|
|
||||||
make akari4 || exit 1
|
make akari4 >/dev/null|| exit 1
|
||||||
|
|
||||||
|
read -r -n 1 -p "Press any key to cat akari4.c: "
|
||||||
cat akari4.c
|
cat akari4.c
|
||||||
|
|
||||||
|
read -r -n 1 -p "Press any key to run: ./akari4: "
|
||||||
./akari4
|
./akari4
|
||||||
|
echo 1>&2
|
||||||
|
|
||||||
|
read -r -n 1 -p "Press any key to run: ./akari2 rot13 < akari.c | ./akari > rot13.c; cat rot13.c: "
|
||||||
|
./akari2 rot13 < akari.c | ./akari > rot13.c; cat rot13.c
|
||||||
|
|
||||||
|
|
||||||
|
read -r -n 1 -p "Press any key to run: ./akari2 < akari.c > expanded_output.txt: "
|
||||||
|
./akari2 < akari.c > expanded_output.txt
|
||||||
|
read -r -n 1 -p "Press any key to run: ./akari2 rot13 < akari.c > expanded_and_rot13_output.txt: "
|
||||||
|
./akari2 rot13 < akari.c > expanded_and_rot13_output.txt
|
||||||
|
read -r -n 1 -p "Press any key to cat expanded_and_rot13_output.txt: "
|
||||||
|
cat expanded_and_rot13_output.txt
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
toledo
|
toledo
|
||||||
|
toledo.alt
|
||||||
|
toledo.alt2
|
||||||
toledo.orig
|
toledo.orig
|
||||||
prog.orig
|
prog.orig
|
||||||
@@ -120,8 +120,8 @@ OBJ= ${PROG}.o
|
|||||||
DATA=
|
DATA=
|
||||||
TARGET= ${PROG}
|
TARGET= ${PROG}
|
||||||
#
|
#
|
||||||
ALT_OBJ=
|
ALT_OBJ= ${PROG}.alt.o
|
||||||
ALT_TARGET=
|
ALT_TARGET= ${PROG}.alt
|
||||||
|
|
||||||
|
|
||||||
#################
|
#################
|
||||||
@@ -139,11 +139,15 @@ all: data ${TARGET}
|
|||||||
${PROG}: ${PROG}.c
|
${PROG}: ${PROG}.c
|
||||||
${CC} ${CFLAGS} $< -o $@ ${LDFLAGS}
|
${CC} ${CFLAGS} $< -o $@ ${LDFLAGS}
|
||||||
|
|
||||||
|
|
||||||
# alternative executable
|
# alternative executable
|
||||||
#
|
#
|
||||||
alt: data ${ALT_TARGET}
|
alt: data ${ALT_TARGET}
|
||||||
@${TRUE}
|
@${TRUE}
|
||||||
|
|
||||||
|
${PROG}.alt: ${PROG}.alt.c
|
||||||
|
${CC} ${CFLAGS} $< -o $@ ${LDFLAGS}
|
||||||
|
|
||||||
# data files
|
# data files
|
||||||
#
|
#
|
||||||
data: ${DATA}
|
data: ${DATA}
|
||||||
|
|||||||
+76
-25
@@ -1,9 +1,15 @@
|
|||||||
## To build:
|
## To build:
|
||||||
|
|
||||||
|
If you have X11 installed:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
make
|
make
|
||||||
```
|
```
|
||||||
|
|
||||||
|
There are two alternate versions, [one that lets you reconfigure the
|
||||||
|
controls and size](toledo.alt.c) and [another that should work for
|
||||||
|
Windows](toledo.alt2.c). See [Alternate code](#alternate-code) below.
|
||||||
|
|
||||||
|
|
||||||
## To use:
|
## To use:
|
||||||
|
|
||||||
@@ -11,25 +17,58 @@ make
|
|||||||
./toledo
|
./toledo
|
||||||
```
|
```
|
||||||
|
|
||||||
NOTE: This requires X11 to run or modifications to use [layer.c](layer.c) on
|
|
||||||
Windows (see below).
|
## Alternate code:
|
||||||
|
|
||||||
|
The first alt version, [toledo.alt.c](toledo.alt.c), allows you to reconfigure
|
||||||
|
the controls and the dimensions more easily.
|
||||||
|
|
||||||
|
The second version, [toledo.alt2.c](toledo.alt2.c), should work for Windows but
|
||||||
|
does not allow you to reconfigure the keys or dimensions.
|
||||||
|
|
||||||
|
|
||||||
### Try:
|
### Alternate build:
|
||||||
|
|
||||||
|
For the one that lets you reconfigure the keys you will want to look at the
|
||||||
|
included header file, [keysym.h](keysym.h), to find the correct macros. Once you
|
||||||
|
have the right names you can define the macros `A`, `B`, `C`, `D` and/or `E`. It
|
||||||
|
will use the default for any you do not specify. For instance, to swap what `A`
|
||||||
|
and `B` are (see below for defaults of all keys):
|
||||||
|
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
echo "Do or do not. There is no try."
|
make clobber CDEFINE="-DA=XK_Left:XK_a -DB=XK_Up:XK_w" alt
|
||||||
```
|
```
|
||||||
|
|
||||||
|
but you can specify something completely else and you can pick and choose which
|
||||||
|
controls you wish to redefine. You might also wish to change the dimensions of
|
||||||
|
the game, `M` and `N` which have an arbitrarily selected lower limit as well as
|
||||||
|
the default values.
|
||||||
|
|
||||||
|
Here are the defaults:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define A XK_Up:XK_w
|
||||||
|
#define B XK_Left:XK_a
|
||||||
|
#define C XK_Right:XK_d
|
||||||
|
#define D XK_Down:XK_s
|
||||||
|
#define E XK_BackSpace:XK_Tab
|
||||||
|
#define M 512
|
||||||
|
#define N 288
|
||||||
|
```
|
||||||
|
|
||||||
|
Observe that each of the controls are a pair in the form of `player2:player1`.
|
||||||
|
|
||||||
|
|
||||||
## Judges' remarks:
|
## Judges' remarks:
|
||||||
|
|
||||||
This two player game uses X11. The control keys can be configured by
|
This two player game uses X11. The control keys can be configured by
|
||||||
modifying the `A`, `B`, `C` and `D` macros at compilation.
|
modifying the `A`, `B`, `C`, `D` and `E` macros at compilation.
|
||||||
|
|
||||||
After a quick splash screen the objective should be clear. There
|
After a quick splash screen the objective should be clear. There
|
||||||
are Red, Green and Cyan tanks. A larger window can be made by altering
|
are Red, Green and Cyan tanks. A larger window can be made by altering
|
||||||
the source early on, right before the code gets hard to follow.
|
the source early on, right before the code gets hard to follow, or using the
|
||||||
|
[alternate version](#alternate-code).
|
||||||
|
|
||||||
Like Oscar's previous winning X11 program for the 19th IOCCC, if
|
Like Oscar's previous winning X11 program for the 19th IOCCC, if
|
||||||
you remove both the X11 include files and replace them with
|
you remove both the X11 include files and replace them with
|
||||||
@@ -37,8 +76,9 @@ you remove both the X11 include files and replace them with
|
|||||||
```c
|
```c
|
||||||
#include "layer.c"
|
#include "layer.c"
|
||||||
```
|
```
|
||||||
\
|
|
||||||
you ought to be able to compile and run this program on Windows.
|
you ought to be able to compile and run this program on Windows.
|
||||||
|
NOTE: this is what [toledo.alt2.c](toledo.alt2.c) is for.
|
||||||
|
|
||||||
|
|
||||||
## Author's remarks:
|
## Author's remarks:
|
||||||
@@ -58,26 +98,29 @@ and run it without arguments.
|
|||||||
|
|
||||||
You will see briefly a tank spinning before each level.
|
You will see briefly a tank spinning before each level.
|
||||||
|
|
||||||
Left half of the window shows the red player view and right
|
The Left half of the window shows the red player view and the right
|
||||||
half shows the green player view, the background will change to
|
half shows the green player view; the background will change to
|
||||||
blue when the view goes inactive.
|
blue when the view goes inactive.
|
||||||
|
|
||||||
The objective is to chase and destroy the other player's tank,
|
The objective is to chase and destroy the other player's tank.
|
||||||
there is also an aqua tank for testing your aim and getting
|
There is also an aqua tank for testing your aim and getting
|
||||||
extra points.
|
extra points.
|
||||||
|
|
||||||
> Caveat: You can shoot only 3 bullets at a time.
|
|
||||||
> Trick: You can fire faster if they explode on anything.
|
Caveat: You can shoot only 3 bullets at a time.
|
||||||
> Believe it or not, it has strategy!
|
\
|
||||||
|
Trick: You can fire faster if they explode on anything.
|
||||||
|
\
|
||||||
|
Believe it or not, it has strategy!
|
||||||
|
|
||||||
When only one tank remains on the field, the level will advance.
|
When only one tank remains on the field, the level will advance.
|
||||||
Don't forget to destroy the aqua tank.
|
Don't forget to destroy the aqua tank.
|
||||||
|
|
||||||
The <strike>battle</strike>playground is surrounded by mountains and each level is
|
The <strike>battle</strike>playground is surrounded by mountains and each level is
|
||||||
filled with random obstacles (pyramids and cubes).
|
filled with random obstacles (pyramids and cubes).
|
||||||
|
|
||||||
The bars show players energy and score, each bar shows energy
|
The bars show players energy and score; each bar shows energy
|
||||||
and indicates current player view (wider on the left), right
|
and indicates the current player view (wider on the left). The right
|
||||||
part grows with every point.
|
part grows with every point.
|
||||||
|
|
||||||
Keys for player 1 (lowercase):
|
Keys for player 1 (lowercase):
|
||||||
@@ -96,18 +139,21 @@ Keys for player 2:
|
|||||||
* Left arrow - Turn left
|
* Left arrow - Turn left
|
||||||
* Right arrow - Turn right
|
* Right arrow - Turn right
|
||||||
|
|
||||||
> Note: Numeric keys don't work.
|
|
||||||
|
Note: Numeric keys don't work.
|
||||||
|
|
||||||
If you don't like the keys assignment, you can change it in the
|
If you don't like the keys assignment, you can change it in the
|
||||||
Makefile.
|
Makefile or use the [alternate version](#alternate-code).
|
||||||
|
|
||||||
|
|
||||||
### PARENTAL ADVISORY WARNING:
|
### PARENTAL ADVISORY WARNING:
|
||||||
|
|
||||||
This game is highly violent, when the tank explodes you can
|
This game is highly violent: when the tank explodes you can
|
||||||
see the little stick man blowing in parts.
|
see the little stick man blowing in parts.
|
||||||
|
|
||||||
Not really, just kidding :D
|
Not really, just kidding :D
|
||||||
|
|
||||||
|
|
||||||
### PLATFORMS TESTED:
|
### PLATFORMS TESTED:
|
||||||
|
|
||||||
* openSUSE 10.2 x86-32, X11R6 1024x768 32-bits color.
|
* openSUSE 10.2 x86-32, X11R6 1024x768 32-bits color.
|
||||||
@@ -115,6 +161,7 @@ Not really, just kidding :D
|
|||||||
* Fedora Core 11 x86-64, X11R6 1024x768 32-bits color.
|
* Fedora Core 11 x86-64, X11R6 1024x768 32-bits color.
|
||||||
* Fedora Core 14 x86-64, X11R6 1024x768 32-bits color.
|
* Fedora Core 14 x86-64, X11R6 1024x768 32-bits color.
|
||||||
|
|
||||||
|
|
||||||
### COMPLETE FEATURE SET:
|
### COMPLETE FEATURE SET:
|
||||||
|
|
||||||
* Multiplayer out of the box.
|
* Multiplayer out of the box.
|
||||||
@@ -127,7 +174,8 @@ Not really, just kidding :D
|
|||||||
* There is an infinite number of levels.
|
* There is an infinite number of levels.
|
||||||
* Always different levels.
|
* Always different levels.
|
||||||
* Animated intro.
|
* Animated intro.
|
||||||
* It has color!.
|
* It has color!
|
||||||
|
|
||||||
|
|
||||||
### FEATURES THAT PROGRAMMERS WILL FIND APPEALING:
|
### FEATURES THAT PROGRAMMERS WILL FIND APPEALING:
|
||||||
|
|
||||||
@@ -140,9 +188,9 @@ Not really, just kidding :D
|
|||||||
x86-64 512 MB).
|
x86-64 512 MB).
|
||||||
* It is written in the only true C: K&R, and no, that doesn't mean
|
* It is written in the only true C: K&R, and no, that doesn't mean
|
||||||
Katherine & Rose.
|
Katherine & Rose.
|
||||||
* Vectorial scalable graphics, do you want a bigger viewport? Change variables M
|
* Vectorial scalable graphics: do you want a bigger viewport? Change variables
|
||||||
`&` `N`.
|
`M` and `N` (see the [alternate code](#alternate-code)).
|
||||||
* Half of the program is formatted as 3D cube. View with tabs at 8 columns and a\
|
* Half of the program is formatted as 3D cube. View with tabs at 8 columns and a
|
||||||
square font.
|
square font.
|
||||||
* The other half of the program is unprintable source code, so no typing from
|
* The other half of the program is unprintable source code, so no typing from
|
||||||
paper, you have to write a converter of tabs and form-feeds to its C escaped
|
paper, you have to write a converter of tabs and form-feeds to its C escaped
|
||||||
@@ -152,6 +200,7 @@ Not really, just kidding :D
|
|||||||
* Virtual world with its own physics laws.
|
* Virtual world with its own physics laws.
|
||||||
* When closing the window it will show an X11 error :P
|
* When closing the window it will show an X11 error :P
|
||||||
|
|
||||||
|
|
||||||
### OBFUSCATION TRICKS:
|
### OBFUSCATION TRICKS:
|
||||||
|
|
||||||
* Loop code included inside loop test.
|
* Loop code included inside loop test.
|
||||||
@@ -185,6 +234,7 @@ Not really, just kidding :D
|
|||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
### THE HISTORY OF THIS PROGRAM:
|
### THE HISTORY OF THIS PROGRAM:
|
||||||
|
|
||||||
When I started working on this program, I figured that it would
|
When I started working on this program, I figured that it would
|
||||||
@@ -203,7 +253,7 @@ the user.
|
|||||||
|
|
||||||
And finally, the third "Thing" was growing and growing, and
|
And finally, the third "Thing" was growing and growing, and
|
||||||
growing, eating bytes for lunch... after endless rounds of
|
growing, eating bytes for lunch... after endless rounds of
|
||||||
crunching I obtained three-hundred seventy-eight bytes of
|
crunching I obtained three-hundred seventy-eight bytes of
|
||||||
artwork and guess what? It doesn't fit.
|
artwork and guess what? It doesn't fit.
|
||||||
|
|
||||||
So I had to integrate a decompressor based on the space, tabulators and other
|
So I had to integrate a decompressor based on the space, tabulators and other
|
||||||
@@ -229,6 +279,7 @@ exceeded the character limits. The crunched vectors were generated by another
|
|||||||
special program and the tank that surrounds this text was generated by yet
|
special program and the tank that surrounds this text was generated by yet
|
||||||
another program.
|
another program.
|
||||||
|
|
||||||
|
|
||||||
*Have fun!*
|
*Have fun!*
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,95 @@
|
|||||||
|
#include <X11/Xlib.h>
|
||||||
|
#include <X11/keysym.h>
|
||||||
|
#define I XDrawLine(W,X,Y,
|
||||||
|
#define l rand()%
|
||||||
|
#define R while(
|
||||||
|
#define n *h++
|
||||||
|
#define x _ c].
|
||||||
|
#define S if(
|
||||||
|
#define _ _[
|
||||||
|
#ifndef A
|
||||||
|
#define A XK_Up:XK_w
|
||||||
|
#endif
|
||||||
|
#ifndef B
|
||||||
|
#define B XK_Left:XK_a
|
||||||
|
#endif
|
||||||
|
#ifndef C
|
||||||
|
#define C XK_Right:XK_d
|
||||||
|
#endif
|
||||||
|
#ifndef D
|
||||||
|
#define D XK_Down:XK_s
|
||||||
|
#endif
|
||||||
|
#ifndef E
|
||||||
|
#define E XK_BackSpace:XK_Tab
|
||||||
|
#endif
|
||||||
|
#ifndef Q
|
||||||
|
#define Q XFillRectangle(W,X,Y,
|
||||||
|
#endif
|
||||||
|
#ifndef M
|
||||||
|
#define M 512
|
||||||
|
#elif M < 250
|
||||||
|
#undef M
|
||||||
|
#define M 512
|
||||||
|
#endif
|
||||||
|
#ifndef N
|
||||||
|
#define N 288
|
||||||
|
#elif N < 100
|
||||||
|
#undef N
|
||||||
|
#define N 288
|
||||||
|
#endif
|
||||||
|
|
||||||
|
*h ;
|
||||||
|
; i;
|
||||||
|
e; d; u; p; L[1
|
||||||
|
<<28]; float w=11.46; m; a ;
|
||||||
|
P; k[9304]; *j=k; c; f; q; r; t; v ;
|
||||||
|
* z; K(H,i) { t=u*+cos(H/w)-i*sin(H/w); p=i*
|
||||||
|
cos(H/w)+u*sin(H/w); u=t; } Display*W; GC Y; Pixmap
|
||||||
|
X; s(o,t,g,w,v) { h=v+k; q=2*n; R u=n, r=12+n, K(t,n), K(o,+
|
||||||
|
p+w,u+=g), d=1>p?1:p, u=u*N/d+M/2, d=N/2+r*N/d, u=u>
|
||||||
|
-M*2 ?u<M*2?u:2*M:-2*M, 1&q?i>0|p>0?I f,e,u,d):0: (i=p
|
||||||
|
,e=d,f=u ), --q); } struct{ int c,o,m,f,u,s,i ,e,r; }
|
||||||
|
_ 21 ] ; Window O; b(y) { XGCValues g ; g .
|
||||||
|
foreground=y; g. line_width = 2 ; XChangeGC(W,Y,20
|
||||||
|
,&g); } G(o) { z=x f + k; h=(x f= 381+193*c)+k; i=2*(n
|
||||||
|
=*z++); R--i&1?d=l 9-4,e =l 9 -4*(8>o):0,n=*z+++d,0<(n
|
||||||
|
=*z+++e)?h[-1]=0:0,n=*z+++d, i); } g(o) { u=0; K(x s,o<<9
|
||||||
|
); x u-=u; x r-=p; } F(m,c ) { f=5120*c; c=12; R +c--&&m
|
||||||
|
==+c |abs(x u-_ m].u)>f |x i <1|x c>2 |abs(x r-_ m].r)>f)
|
||||||
|
; return c+1; } T(o) { c=11; S!P){ a=++a%72; S!a){ P=1; R
|
||||||
|
c--){ x c=x m=0; x i=c>2?2:1 ; R x u=l 978-499<<8, x s= l
|
||||||
|
71, x r=l 979-501<<8, F(c,2) ); x f=c>2?l +2*+73:147; x o
|
||||||
|
=2>c?249<<16-c*8:64987<<8*(c >2); } } } S P){ c=11; R 4&x
|
||||||
|
i? ++x m-64&&x m-71? o=1,64> x m?(d=F(c,1))?x m=64,d<4?j[
|
||||||
|
x e]++,++_ --d].c:0:g(7):G(x m -65) :_ x i=0,x e].e-- :0,
|
||||||
|
20>++c); c=3; R c--) { S 1&x i) { o++; S x c>2) x m>15? x
|
||||||
|
i=0:G(x m++); else { S x m ) S x m-->6) g(4); S c<2) { x
|
||||||
|
s=(72+x s+L[c?B]-L[c?C])%72; S d=4*L[c?A]-L[c?D]*4) { g(d
|
||||||
|
); S F(c,2)) g(-d); } S L[c? E]&!x m&x e<3) { d=10; R _++
|
||||||
|
d].i) ; g(-4); _ d]=_ c]; _ d].e=c; x e++; x m=7; c=d; x
|
||||||
|
f = 122 ; x i=4; g(19); x o= 4092<<12; c=x e; } } } } } P
|
||||||
|
-=o<2; } v=2; R v--){ m=(108 - _ v].s)%72; b(3^_ v].c?0:
|
||||||
|
128); Q c=0,0,M,N); S!P) s(+ 36,54-a,0,-120,-+-+-+-+147,b
|
||||||
|
((1<<16)-1)); S P) { b(255); I 0,N/2,M,N/2); t=-.889*m; h
|
||||||
|
=k+340; R u=(t+=q=n)*M/32,d= n*N/48,q?I f,e,u,d):0,f=u,e=
|
||||||
|
+d,k+378>h); R x i&&c-v?s(m, x s,x u-_ v].u>>8,x r-_ v].r
|
||||||
|
>>8,x f,b(x o)):0,20>c++); c =0; R e=16+32*c,Q v^c?16:8,e
|
||||||
|
,(c^v?68:76)+c[b(x o),j] , 16), b(0,d=20*x c), Q
|
||||||
|
80-d,4+e,d,8),2>c++) ; } b(255); I M,0,M,
|
||||||
|
N); XCopyArea(W, X,O,Y,0,0,M,N,v*
|
||||||
|
M,0); } }
|
||||||
|
char*o="{ } {} {{ } ; { } ; {; {; { ; { } ; { } ; {; {; } ; { ; { } } ; { ; } { } ; { ; {} ; { ; } {} {{ } ; { } ; {; {; } { } { } } {} { } { } } { } } { } {} { } } { } { } { ; ; ; ; }{; } { { } ; } } ; {; } { ; } { { } ; { }; {; { ; } } { ; } { { } } } { ; } { ; { }; } } } {} { }; } } } } } { }; } ; } ; { } { } ; {} ; } ; } } { } { }} { } { }} } } { {} } } } } { {} } { ; {{ } ; { ; {{ ; { ; {{ } ; { ; {{ ; ; } ; ; } ; ; } }{{ } {{ } { {{ { } } } } } {{{ {} { }{{ } {{ } { {{ { } } ";
|
||||||
|
main(){
|
||||||
|
XEvent e; W=
|
||||||
|
XOpenDisplay(k);
|
||||||
|
XSelectInput(W,O=
|
||||||
|
XCreateSimpleWindow(W,DefaultRootWindow(W),64,64,M*2,N,2,P,r),3);
|
||||||
|
XMapWindow(W,O); srand(time(0)); Y=
|
||||||
|
XCreateGC(W,X=
|
||||||
|
XCreatePixmap(W,O,M,N,DefaultDepth(W,r)),P,r); R*o){ S*o^59)d=64&*o?'{'^*o++:3,
|
||||||
|
32^*o?d+=*o^9?2:1:0,*j+=P?d*9-43:d,j+=P,P=!P; else R*j=j[-3],j++,*++o^9); o++;
|
||||||
|
} R 7){ T(0);
|
||||||
|
XFlush(W); usleep(33367); R
|
||||||
|
XPending(W)) L[
|
||||||
|
XLookupKeysym(&e,
|
||||||
|
XNextEvent(W,&e)&0)]^=1==e.type/2; } }
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
#include "layer.h"
|
||||||
|
#define I XDrawLine(W,X,Y,
|
||||||
|
#define l rand()%
|
||||||
|
#define R while(
|
||||||
|
#define n *h++
|
||||||
|
#define x _ c].
|
||||||
|
#define S if(
|
||||||
|
#define _ _[
|
||||||
|
*h ;
|
||||||
|
M=512; i; N=
|
||||||
|
288; e; d; u; p; L[1
|
||||||
|
<<28]; float w=11.46; m; a ;
|
||||||
|
P; k[9304]; *j=k; c; f; q; r; t; v ;
|
||||||
|
* z; K(N,i) { t=u*+cos(N/w)-i*sin(N/w); p=i*
|
||||||
|
cos(N/w)+u*sin(N/w); u=t; } Display*W; GC Y; Pixmap
|
||||||
|
X; s(o,t,g,w,v) { h=v+k; q=2*n; R u=n, r=12+n, K(t,n), K(o,+
|
||||||
|
p+w,u+=g), d=1>p?1:p, u=u*N/d+M/2, d=N/2+r*N/d, u=u>
|
||||||
|
-M*2 ?u<M*2?u:2*M:-2*M, 1&q?i>0|p>0?I f,e,u,d):0: (i=p
|
||||||
|
,e=d,f=u ), --q); } struct{ int c,o,m,f,u,s,i ,e,r; }
|
||||||
|
_ 21 ] ; Window O; b(y) { XGCValues g ; g .
|
||||||
|
foreground=y; g. line_width = 2 ; XChangeGC(W,Y,20
|
||||||
|
,&g); } G(o) { z=x f + k; h=(x f= 381+193*c)+k; i=2*(n
|
||||||
|
=*z++); R--i&1?d=l 9-4,e =l 9 -4*(8>o):0,n=*z+++d,0<(n
|
||||||
|
=*z+++e)?h[-1]=0:0,n=*z+++d, i); } g(o) { u=0; K(x s,o<<9
|
||||||
|
); x u-=u; x r-=p; } F(m,c ) { f=5120*c; c=12; R +c--&&m
|
||||||
|
==+c |abs(x u-_ m].u)>f |x i <1|x c>2 |abs(x r-_ m].r)>f)
|
||||||
|
; return c+1; } T(o) { c=11; S!P){ a=++a%72; S!a){ P=1; R
|
||||||
|
c--){ x c=x m=0; x i=c>2?2:1 ; R x u=l 978-499<<8, x s= l
|
||||||
|
71, x r=l 979-501<<8, F(c,2) ); x f=c>2?l +2*+73:147; x o
|
||||||
|
=2>c?249<<16-c*8:64987<<8*(c >2); } } } S P){ c=11; R 4&x
|
||||||
|
i? ++x m-64&&x m-71? o=1,64> x m?(d=F(c,1))?x m=64,d<4?j[
|
||||||
|
x e]++,++_ --d].c:0:g(7):G(x m -65) :_ x i=0,x e].e-- :0,
|
||||||
|
20>++c); c=3; R c--) { S 1&x i) { o++; S x c>2) x m>15? x
|
||||||
|
i=0:G(x m++); else { S x m ) S x m-->6) g(4); S c<2) { x
|
||||||
|
s=(72+x s+L[c?B]-L[c?C])%72; S d=4*L[c?A]-L[c?D]*4) { g(d
|
||||||
|
); S F(c,2)) g(-d); } S L[c? E]&!x m&x e<3) { d=10; R _++
|
||||||
|
d].i) ; g(-4); _ d]=_ c]; _ d].e=c; x e++; x m=7; c=d; x
|
||||||
|
f = 122 ; x i=4; g(19); x o= 4092<<12; c=x e; } } } } } P
|
||||||
|
-=o<2; } v=2; R v--){ m=(108 - _ v].s)%72; b(3^_ v].c?0:
|
||||||
|
128); Q c=0,0,M,N); S!P) s(+ 36,54-a,0,-120,-+-+-+-+147,b
|
||||||
|
((1<<16)-1)); S P) { b(255); I 0,N/2,M,N/2); t=-.889*m; h
|
||||||
|
=k+340; R u=(t+=q=n)*M/32,d= n*N/48,q?I f,e,u,d):0,f=u,e=
|
||||||
|
+d,k+378>h); R x i&&c-v?s(m, x s,x u-_ v].u>>8,x r-_ v].r
|
||||||
|
>>8,x f,b(x o)):0,20>c++); c =0; R e=16+32*c,Q v^c?16:8,e
|
||||||
|
,(c^v?68:76)+c[b(x o),j] , 16), b(0,d=20*x c), Q
|
||||||
|
80-d,4+e,d,8),2>c++) ; } b(255); I M,0,M,
|
||||||
|
N); XCopyArea(W, X,O,Y,0,0,M,N,v*
|
||||||
|
M,0); } }
|
||||||
|
char*o="{ } {} {{ } ; { } ; {; {; { ; { } ; { } ; {; {; } ; { ; { } } ; { ; } { } ; { ; {} ; { ; } {} {{ } ; { } ; {; {; } { } { } } {} { } { } } { } } { } {} { } } { } { } { ; ; ; ; }{; } { { } ; } } ; {; } { ; } { { } ; { }; {; { ; } } { ; } { { } } } { ; } { ; { }; } } } {} { }; } } } } } { }; } ; } ; { } { } ; {} ; } ; } } { } { }} { } { }} } } { {} } } } } { {} } { ; {{ } ; { ; {{ ; { ; {{ } ; { ; {{ ; ; } ; ; } ; ; } }{{ } {{ } { {{ { } } } } } {{{ {} { }{{ } {{ } { {{ { } } ";
|
||||||
|
main(){
|
||||||
|
XEvent e; W=
|
||||||
|
XOpenDisplay(k);
|
||||||
|
XSelectInput(W,O=
|
||||||
|
XCreateSimpleWindow(W,DefaultRootWindow(W),64,64,M*2,N,2,P,r),3);
|
||||||
|
XMapWindow(W,O); srand(time(0)); Y=
|
||||||
|
XCreateGC(W,X=
|
||||||
|
XCreatePixmap(W,O,M,N,DefaultDepth(W,r)),P,r); R*o){ S*o^59)d=64&*o?'{'^*o++:3,
|
||||||
|
32^*o?d+=*o^9?2:1:0,*j+=P?d*9-43:d,j+=P,P=!P; else R*j=j[-3],j++,*++o^9); o++;
|
||||||
|
} R 7){ T(0);
|
||||||
|
XFlush(W); usleep(33367); R
|
||||||
|
XPending(W)) L[
|
||||||
|
XLookupKeysym(&e,
|
||||||
|
XNextEvent(W,&e)&0)]^=1==e.type/2; } }
|
||||||
+22
-22
@@ -4,6 +4,9 @@
|
|||||||
make
|
make
|
||||||
```
|
```
|
||||||
|
|
||||||
|
There is an alternate version that should work for Windows. See [alternate
|
||||||
|
code](#alternate-code) below.
|
||||||
|
|
||||||
|
|
||||||
### Bugs and (Mis)features:
|
### Bugs and (Mis)features:
|
||||||
|
|
||||||
@@ -22,20 +25,6 @@ For more detailed information see [2011 vik in bugs.md](/bugs.md#2011-vik).
|
|||||||
./vik file.mod > audio_file.raw
|
./vik file.mod > audio_file.raw
|
||||||
```
|
```
|
||||||
|
|
||||||
An alternate version for Windows is available. See the Alternate code section
|
|
||||||
below.
|
|
||||||
|
|
||||||
The author stated that the program will crash if no argument is passed tot he
|
|
||||||
program though we note that your computer might also [halt and catch
|
|
||||||
fire](https://en.wikipedia.org/wiki/Halt_and_Catch_Fire_(computing)) :-)
|
|
||||||
|
|
||||||
This is supposed to happen. As is written in the
|
|
||||||
[The Jargon File](http://catb.org/jargon/html/F/feature.html):
|
|
||||||
|
|
||||||
```
|
|
||||||
That's not a bug, that's a feature.
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
### Try:
|
### Try:
|
||||||
|
|
||||||
@@ -47,10 +36,10 @@ That's not a bug, that's a feature.
|
|||||||
Alternatively, you can use:
|
Alternatively, you can use:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
./vik file.mod > file.raw; ./raw2wav file.raw > file.wav\
|
./vik file.mod > file.raw; ./raw2wav file.raw > file.wav
|
||||||
```
|
```
|
||||||
|
|
||||||
It is possible to download a number of Mod files from [The Mod
|
It is possible to download a number of music module files from [The Mod
|
||||||
Archive](http://modarchive.org).
|
Archive](http://modarchive.org).
|
||||||
|
|
||||||
|
|
||||||
@@ -63,6 +52,8 @@ make alt
|
|||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Alternate use:
|
||||||
|
|
||||||
Use `vik.alt` as you would `vik` above.
|
Use `vik.alt` as you would `vik` above.
|
||||||
|
|
||||||
|
|
||||||
@@ -75,13 +66,13 @@ Also it abuses the C compiler and/or assembler with a partially
|
|||||||
initialized 32MB array. Can you tell what that partial
|
initialized 32MB array. Can you tell what that partial
|
||||||
initialization for?
|
initialization for?
|
||||||
|
|
||||||
Does it take your system a long time to compile? You may want to do try:
|
Does it take your system a long time to compile? You may want to do:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
cc -S vik.c
|
cc -S vik.c
|
||||||
```
|
```
|
||||||
|
|
||||||
and to examine the resulting assembly file vik.s. On some platforms
|
and examine the resulting assembly file `vik.s`. On some platforms
|
||||||
the assembly file is about 128MB in size!
|
the assembly file is about 128MB in size!
|
||||||
|
|
||||||
NOTE: The [randowan.mod](randowan.mod) and [mad_world.mod](mad_world.mod) files were
|
NOTE: The [randowan.mod](randowan.mod) and [mad_world.mod](mad_world.mod) files were
|
||||||
@@ -103,6 +94,7 @@ A MOD file contains a set of samples, a number of patterns indicating how and
|
|||||||
when the samples are to be played, a list of what patterns to play in what
|
when the samples are to be played, a list of what patterns to play in what
|
||||||
order, and a number of effects.
|
order, and a number of effects.
|
||||||
|
|
||||||
|
|
||||||
### Features
|
### Features
|
||||||
|
|
||||||
This program converts MOD files created with the standard trackers for
|
This program converts MOD files created with the standard trackers for
|
||||||
@@ -128,6 +120,7 @@ program supports most of them, including:
|
|||||||
Due to size constraints tremolo and vibrato is not supported. Also, to
|
Due to size constraints tremolo and vibrato is not supported. Also, to
|
||||||
avoid infinite long songs, the position jump feature is ignored.
|
avoid infinite long songs, the position jump feature is ignored.
|
||||||
|
|
||||||
|
|
||||||
### Songs
|
### Songs
|
||||||
|
|
||||||
With his permission, the package includes two songs composed by Henrik
|
With his permission, the package includes two songs composed by Henrik
|
||||||
@@ -147,19 +140,21 @@ gcc -o vik vik.c
|
|||||||
|
|
||||||
### Usage
|
### Usage
|
||||||
|
|
||||||
### Convert MOD file to raw 44.1kHz stereo audio file
|
|
||||||
|
#### Convert MOD file to raw 44.1kHz stereo audio file
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
./vik mad_world.mod > audio_file.raw
|
./vik mad_world.mod > audio_file.raw
|
||||||
```
|
```
|
||||||
|
|
||||||
### Listen to the MOD file (streaming to mplayer)
|
#### Listen to the MOD file (streaming to mplayer)
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
./vik randowan.mod | mplayer -demuxer rawaudio -
|
./vik randowan.mod | mplayer -demuxer rawaudio -
|
||||||
```
|
```
|
||||||
|
|
||||||
(Don't forget the last `-` as it makes mplayer read from stdin.)
|
(Don't forget the last `-` as it makes mplayer read from `stdin`.)
|
||||||
|
|
||||||
|
|
||||||
### Obfuscation
|
### Obfuscation
|
||||||
|
|
||||||
@@ -183,12 +178,14 @@ machine](https://en.wikipedia.org/wiki/Finite-state_machine) and all the
|
|||||||
are conditional and the program uses the `?:` operator (sigh) mainly to save
|
are conditional and the program uses the `?:` operator (sigh) mainly to save
|
||||||
space, but also to leverage the comma operator and precedence more efficiently.
|
space, but also to leverage the comma operator and precedence more efficiently.
|
||||||
|
|
||||||
|
|
||||||
[magic]: https://en.wikipedia.org/wiki/Magic_(programming)#Variants
|
[magic]: https://en.wikipedia.org/wiki/Magic_(programming)#Variants
|
||||||
|
|
||||||
|
|
||||||
### Portability
|
### Portability
|
||||||
|
|
||||||
The program is portable to most platforms. The only system dependency is
|
The program is portable to most platforms. The only system dependency is
|
||||||
that the program relies on writing binary data to stdout.
|
that the program relies on writing binary data to `stdout`.
|
||||||
|
|
||||||
Microsoft compilers adds a carriage return to newlines, and to compile
|
Microsoft compilers adds a carriage return to newlines, and to compile
|
||||||
the program with this platform, the following line can be added after
|
the program with this platform, the following line can be added after
|
||||||
@@ -198,6 +195,9 @@ the main declaration in order for the program to run correctly:
|
|||||||
_setmode(_fileno(stdout), 0x8000);
|
_setmode(_fileno(stdout), 0x8000);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
NOTE: this is what the [alternate version](#alternate-code) is for.
|
||||||
|
|
||||||
|
|
||||||
### Limitations
|
### Limitations
|
||||||
|
|
||||||
The program only runs when a valid MOD file is passed as argument. If
|
The program only runs when a valid MOD file is passed as argument. If
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
image.ppm
|
image.ppm
|
||||||
|
image.png
|
||||||
hello.ppm
|
hello.ppm
|
||||||
image2.ppm
|
image2.ppm
|
||||||
ioccc2011.ppm
|
ioccc2011.ppm
|
||||||
|
ioccc2011.png
|
||||||
zucker
|
zucker
|
||||||
zucker.orig
|
zucker.orig
|
||||||
prog.orig
|
prog.orig
|
||||||
@@ -2471,7 +2471,8 @@ instead being something else entirely. The Internet Wayback Machine, although it
|
|||||||
archived it, did not load scripts. Do you know if the domain was moved? Do you
|
archived it, did not load scripts. Do you know if the domain was moved? Do you
|
||||||
have an archive or mirror? Please provide us it! Thank you.
|
have an archive or mirror? Please provide us it! Thank you.
|
||||||
|
|
||||||
### STATUS: known bug - please help us fix
|
|
||||||
|
### STATUS: INABIAF - please **DO NOT** fix
|
||||||
|
|
||||||
The author states the following:
|
The author states the following:
|
||||||
|
|
||||||
|
|||||||
@@ -3198,10 +3198,19 @@ lets it work in both linux and macOS. The problem was that it relied on 32-bits
|
|||||||
so some `int`s were changed to `long`s. The display problem might or might not
|
so some `int`s were changed to `long`s. The display problem might or might not
|
||||||
have been a problem in linux with the old `int`s but this is no longer known.
|
have been a problem in linux with the old `int`s but this is no longer known.
|
||||||
|
|
||||||
|
Cody also added the code that _should_ work for Windows,
|
||||||
|
[toledo3.alt.c](2006/toledo3/toledo3.alt.c), based on the author's remarks.
|
||||||
|
We're not able to test this.
|
||||||
|
|
||||||
|
|
||||||
# <a name="2011"></a>2011
|
# <a name="2011"></a>2011
|
||||||
|
|
||||||
|
|
||||||
|
## [2011/akari](2011/akari/akari.c) ([README.md](2011/akari/README.md]))
|
||||||
|
|
||||||
|
Cody added the [try.sh](2011/akari/try.sh) script.
|
||||||
|
|
||||||
|
|
||||||
## [2011/borsanyi](2011/borsanyi/borsanyi.c) ([README.md](2011/borsanyi/README.md]))
|
## [2011/borsanyi](2011/borsanyi/borsanyi.c) ([README.md](2011/borsanyi/README.md]))
|
||||||
|
|
||||||
Cody, out of an abundance of caution, added a second arg to `main()` as some
|
Cody, out of an abundance of caution, added a second arg to `main()` as some
|
||||||
@@ -3255,6 +3264,14 @@ try. If they do they might want to look also at
|
|||||||
not be worth.
|
not be worth.
|
||||||
|
|
||||||
|
|
||||||
|
## [2011/toledo](2011/toledo/toledo.c) ([README.md](2011/toledo/README.md]))
|
||||||
|
|
||||||
|
Cody added two [alternate versions](2011/toledo/README.md#alternate-code): one that
|
||||||
|
lets one reconfigure the controls and also the size of the game and another
|
||||||
|
version that should work in Windows, based on the author's remarks and support
|
||||||
|
file, `layer.c`.
|
||||||
|
|
||||||
|
|
||||||
## [2011/vik](2011/vik/vik.c) ([README.md](2011/vik/README.md]))
|
## [2011/vik](2011/vik/vik.c) ([README.md](2011/vik/README.md]))
|
||||||
|
|
||||||
Cody added an [alternate version](2011/vik/README.md#alternate-code) for Windows
|
Cody added an [alternate version](2011/vik/README.md#alternate-code) for Windows
|
||||||
|
|||||||
Reference in new issue
Block a user