Files
Cody Boone Ferguson 3753b22365 Minor fix in 1998/chaos - restore terminal at exit
The problem with not calling 'endwin()' is that echo will be disabled
which is a problem for the user if they don't know to type stty echo or
reset or stty sane.
2023-03-24 09:41:25 -07:00

94 lines
2.0 KiB
C

#include<curses.h>
#include<stdlib.h>
#include<string.h>
#define A int
#define F float
#define O sizeof
#define V ((A *)(X+N))
#define U(a,b) for(a = 0; a < b; a++)
#define L(a) (X[K] * H[a*4]+ X[K+1] * H[a*4+1]+ X[K+2] * H[a*4+2])
#define _(e,f,a,b,c) if(M==e) { T[a*4+c] = T[b*4+c] = T[c*4+a] = T[c*4+b] = !(T[c*5] = 1); T[a*4+b] = -(T[b*4+a] = f .1045284632); T[b*5] = T[a*5] = .9945418726; U(M,3) U(E,4) U(K,3) R[M*4+E] += H[K*4+E] * T[M*4+K]; memcpy(H,R,12*O(F)); }
char Q[3792];
A K, M=0, E, B;
long Z;
F H[] = { 1,0,0,0,0,1,0,0,0,0,1,0 } , T[12], R[12], C, D, I, J, S, * X, G=4;
FILE * W;
A main(A N,char ** Y) {
char P[] = "AlWuzEre 72 -1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 -1 1 1 1 -1 1 -1 -1 -1 1 -1 -1 1 1 1 1 -1 -1 1 -1 1 -1 1 -1 -1 1 1 -1 -1 -1 -1 -1 1 -1 1 1 -1 -1 -1 1 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 ";
strcpy(Q,P);
if(!(W = fopen(Y[N<2?0:1],"r"))) {
printf("Can't read\n"); exit(-1); }
fseek(W,0,SEEK_END);
Z = ftell(W);
fseek(W,0,SEEK_SET);
strcpy(Q+9, "%d");
while(fscanf(W,Q,&N) != 1) {
fseek(W,1,SEEK_CUR);
if(ftell(W) >= Z) {
printf("Bad input\n"); exit(-1); } }
X = (F *)malloc(N * (O(A)>O(F)?O(A):O(F)) * 2);
if(!X) { printf("No memory\n"); exit(-1); }
U(K,N) fscanf(W,"%f",X+K);
fclose(W);
initscr();
halfdelay(30);
noecho();
CH:
memset(R,0,12*O(F));
_('h', ,1,2,0)
_('j', ,2,0,1)
_('k', ,1,0,2)
_('y',-,1,2,0)
_('u',-,2,0,1)
_('i',-,1,0,2)
G += M=='a'?-.1:M=='z'?.1:0;
if(M=='q') { printf("%.9s\n",P); endwin(); exit(0); }
memset(Q,0,3792);
erase();
U(K,N) {
C = 40 / (L(2)+G);
V[K] = (A)(L(0) * C) + 40;
V[K+1] = (A)(L(1) * C) + 24;
K+=2; }
U(B,N) {
C = V[B++];
D = V[B++];
E = V[++B] - C;
M = V[++B] - D;
B++;
S = (F)abs((abs(E)>abs(M))?E:M);
I=E/S;
J=M/S++;
U(K,S)
{
E = (A)(C+0.5);
M = (A)(D+0.5);
if(E>=0 && M>=0 && E<79 && M<48)
{
Q[E + M * 79] = 1;
mvaddch((M&1?M-1:M)/2,E,Q[E+(M+(M&1?-1:1))*79]?':':(M&1?'.':'`'));
}
C+=I;
D+=J;
}
}
move(0,0);
refresh();
M = getch();
halfdelay(M==ERR?1:30);
M = M==ERR?'u':M;
goto CH;
}