📄 prompts1.c
字号:
int find_extra_param(int type)
{
int i,ret,curtyp;
ret = -1;
i= -1;
while((curtyp=moreparams[++i].type) != type && curtyp != -1);
if(curtyp == type)
ret = i;
return(ret);
}
int check_orbit_name(char *orbitname)
{
int i, numtypes, bad;
char *nameptr[MAXFRACTALS];
int fractals[MAXFRACTALS];
int curtype,numparams,numtrig,last_val;
ENTER_OVLY(OVLY_PROMPTS1);
numtypes = build_fractal_list(fractals, &last_val, nameptr);
bad = 1;
for(i=0;i<numtypes;i++)
{
if(strcmp(orbitname,nameptr[i]) == 0)
{
neworbittype = fractals[i];
bad = 0;
break;
}
}
EXIT_OVLY;
return(bad);
}
/* --------------------------------------------------------------------- */
static FILE *gfe_file;
long get_file_entry(int type,char *title,char *fmask,
char *filename,char *entryname)
{
/* Formula, LSystem, etc type structure, select from file */
/* containing definitions in the form name { ... } */
int newfile,firsttry;
long entry_pointer;
extern char suffix[4096];
newfile = 0;
while (1) {
firsttry = 0;
/* pb: binary mode used here - it is more work, but much faster, */
/* especially when ftell or fgetpos is used */
while (newfile || (gfe_file = fopen(filename, "rb")) == NULL) {
char buf[60];
newfile = 0;
if (firsttry) {
extern char s_cantfind[];
sprintf(temp1,s_cantfind, filename);
stopmsg(0,temp1);
}
sprintf(buf,"Select %s File",title);
if (getafilename(buf,fmask,filename) < 0)
return -1;
firsttry = 1; /* if around open loop again it is an error */
}
setvbuf(gfe_file,suffix,_IOFBF,4096); /* improves speed when file is big */
newfile = 0;
if ((entry_pointer = gfe_choose_entry(type,title,filename,entryname)) == -2) {
newfile = 1; /* go to file list, */
continue; /* back to getafilename */
}
if (entry_pointer == -1)
return -1;
switch (type) {
case GETFORMULA:
if (RunForm(entryname) == 0) return 0;
break;
case GETLSYS:
if (LLoad() == 0) return 0;
break;
case GETIFS:
if (ifsload() == 0) {
fractype = (ifs_type == 0) ? IFS : IFS3D;
curfractalspecific = &fractalspecific[fractype];
set_default_parms(); /* to correct them if 3d */
return 0;
}
break;
case GETPARM:
return entry_pointer;
}
}
}
struct entryinfo {
char name[ITEMNAMELEN+1];
long point; /* points to the ( or the { following the name */
};
static struct entryinfo **gfe_choices; /* for format_getparm_line */
static char *gfe_title;
static long gfe_choose_entry(int type,char *title,char *filename,char *entryname)
/* subrtn of get_file_entry, separated so that storage gets freed up */
{
#define MAXENTRIES 200
static char far instr[]={"Press F6 to select different file, F2 for details of highlighted choice"};
int numentries, i;
char buf[101];
struct entryinfo *choices[MAXENTRIES];
int attributes[MAXENTRIES];
void (*formatitem)();
int boxwidth,boxdepth,colwidth;
long file_offset,name_offset;
extern struct entryinfo boxx[MAXENTRIES];
gfe_choices = &choices[0];
gfe_title = title;
for (i = 0; i < MAXENTRIES; i++) {
attributes[i] = 1;
choices[i] = &boxx[i];
}
numentries = 0;
file_offset = -1;
helptitle(); /* to display a clue when file big and next is slow */
while (1) { /* scan the file for entry names */
int c,len;
do {
++file_offset;
c = getc(gfe_file);
} while (c == ' ' /* skip white space */
|| c == '\t' || c == '\n' || c == '\r');
if (c == ';') {
do {
++file_offset;
c = getc(gfe_file);
} while (c != '\n' && c != EOF && c != '\032');
if (c == EOF || c == '\032') break;
continue;
}
name_offset = file_offset;
len = 0; /* next equiv roughly to fscanf(..,"%40[^ \n\r\t({\032]",buf) */
while (c != ' ' && c != '\t' && c != '('
&& c != '{' && c != '\n' && c != '\r' && c != EOF && c != '\032') {
if (len < 40) buf[len++] = c;
c = getc(gfe_file);
++file_offset;
}
buf[len] = 0;
while (c != '{' && c != '\n' && c != '\r' && c != EOF && c != '\032') {
c = getc(gfe_file);
++file_offset;
}
if (c == '{') {
while (c != '}' && c != EOF && c != '\032') {
c = getc(gfe_file);
++file_offset;
}
if (c != '}') break;
buf[ITEMNAMELEN] = 0;
if (buf[0] != 0 && stricmp(buf,"comment") != 0) {
strcpy(boxx[numentries].name,buf);
boxx[numentries].point = name_offset;
if (++numentries >= MAXENTRIES) {
sprintf(buf,"Too many entries in file, first %d used",MAXENTRIES);
stopmsg(0,buf);
break;
}
}
}
else
if (c == EOF || c == '\032') break;
}
if (numentries == 0) {
static char far msg[]={"File doesn't contain any valid entries"};
stopmsg(0,msg);
fclose(gfe_file);
return -2; /* back to file list */
}
qsort((char **)choices,numentries,sizeof(char *),lccompare);
strcpy(buf,entryname); /* preset to last choice made */
sprintf(temp1,"%s Selection\nFile: %s",title,filename);
formatitem = NULL;
boxwidth = colwidth = boxdepth = 0;
if (type == GETPARM) {
formatitem = format_parmfile_line;
boxwidth = 1;
boxdepth = 16;
colwidth = 76;
}
i = fullscreen_choice(8,temp1,NULL,instr,numentries,(char **)choices,
attributes,boxwidth,boxdepth,colwidth,0,
formatitem,buf,NULL,check_gfe_key);
fclose(gfe_file);
if (i < 0) {
if (i == 0-F6)
return -2; /* go back to file list */
return -1; /* cancel */
}
strcpy(entryname, choices[i]->name);
return(choices[i]->point);
}
static int check_gfe_key(int curkey,int choice)
{
char infhdg[60];
char far *infbuf;
if (curkey == F6)
return 0-F6;
if (curkey == F2) {
infbuf = MK_FP(extraseg,0);
fseek(gfe_file,gfe_choices[choice]->point,SEEK_SET);
load_entry_text(gfe_file,infbuf,16);
strcpy(infhdg,gfe_title);
strcat(infhdg," file entry:\n\n");
/* ... instead, call help with buffer? heading added */
stackscreen();
helptitle();
setattr(1,0,C_GENERAL_MED,24*80);
putstring(2,1,C_GENERAL_HI,infhdg);
textcbase = 2; /* left margin is 2 */
putstring(-1,0,C_GENERAL_MED,infbuf);
putstring(-1,0,C_GENERAL_LO,"\n\n\nPress any key to return to selection list");
textcbase = 0;
movecursor(25,80);
getakeynohelp();
unstackscreen();
}
return 0;
}
static void load_entry_text(FILE *entfile,char far *buf,int maxlines)
{
int linect,linelen,c;
linect = linelen = 0;
while ((c = fgetc(entfile)) != EOF && c != '\032') {
if (c != '\r') {
if (c == '\t') {
while ((linelen % 8) != 7 && linelen < 75) { /* 76 wide max */
*(buf++) = ' ';
++linelen;
}
c = ' ';
}
if (c == '\n') {
if (++linect > maxlines) break;
linelen = -1;
}
if (++linelen > 75) {
if (linelen == 76) *(buf++) = '\021';
}
else
*(buf++) = c;
if (c == '}') break;
}
}
*buf = 0;
}
static void format_parmfile_line(int choice,char *buf)
{
int c,i;
char line[80];
fseek(gfe_file,gfe_choices[choice]->point,SEEK_SET);
while (getc(gfe_file) != '{') { }
while ((c = getc(gfe_file)) == ' ' || c == '\t' || c == ';') { }
i = 0;
while (i < 56 && c != '\n' && c != '\r' && c != EOF && c != '\032') {
line[i++] = (c == '\t') ? ' ' : c;
c = getc(gfe_file);
}
line[i] = 0;
sprintf(buf,"%-20s%-56s",gfe_choices[choice]->name,line);
}
/* --------------------------------------------------------------------- */
int get_fract3d_params() /* prompt for 3D fractal parameters */
{
int i,k,ret,oldhelpmode;
static char far hdg[] = {"3D Parameters"};
static char far p1[] = {"X-axis rotation in degrees"};
static char far p2[] = {"Y-axis rotation in degrees"};
static char far p3[] = {"Z-axis rotation in degrees"};
static char far p4[] = {"Perspective distance [1 - 999, 0 for no persp]"};
static char far p5[] = {"X shift with perspective (positive = right)"};
static char far p6[] = {"Y shift with perspective (positive = up )"};
static char far p7[] = {"Stereo (R/B 3D)? (0=no,1=alternate,2=superimpose,3=photo)"};
static char far *ifs3d_prompts[8] = {p1, p2, p3, p4, p5, p6, p7};
struct fullscreenvalues uvalues[20];
ENTER_OVLY(OVLY_PROMPTS1);
stackscreen();
k = 0;
uvalues[k].type = 'i';
uvalues[k++].uval.ival = XROT;
uvalues[k].type = 'i';
uvalues[k++].uval.ival = YROT;
uvalues[k].type = 'i';
uvalues[k++].uval.ival = ZROT;
uvalues[k].type = 'i';
uvalues[k++].uval.ival = ZVIEWER;
uvalues[k].type = 'i';
uvalues[k++].uval.ival = XSHIFT;
uvalues[k].type = 'i';
uvalues[k++].uval.ival = YSHIFT;
uvalues[k].type = 'i';
uvalues[k++].uval.ival = glassestype;
oldhelpmode = helpmode;
helpmode = HELP3DFRACT;
i = fullscreen_prompt(hdg,k,ifs3d_prompts,uvalues,0,0,NULL);
helpmode = oldhelpmode;
if (i < 0) {
ret = -1;
goto get_f3d_exit;
}
ret = k = 0;
XROT = uvalues[k++].uval.ival;
YROT = uvalues[k++].uval.ival;
ZROT = uvalues[k++].uval.ival;
ZVIEWER = uvalues[k++].uval.ival;
XSHIFT = uvalues[k++].uval.ival;
YSHIFT = uvalues[k++].uval.ival;
glassestype = uvalues[k++].uval.ival;
if (glassestype < 0 || glassestype > 3) glassestype = 0;
if (glassestype)
if (get_funny_glasses_params() || check_mapfile())
ret = -1;
get_f3d_exit:
unstackscreen();
EXIT_OVLY;
return(ret);
}
/* --------------------------------------------------------------------- */
/* These macros streamline the "save near space" campaign */
#define LOADPROMPTS3D(X) {\
static char far tmp[] = { X };\
prompts3d[++k]= tmp;\
}
int get_3d_params() /* prompt for 3D parameters */
{
static char far hdg[]={"3D Mode Selection"};
static char far hdg1[]={"Select 3D Fill Type"};
char *choices[10];
int attributes[21];
int sphere;
char far *s;
static char far s1[] = {" Sphere 3D Parameters\n\
Sphere is on its side; North pole to right\n\
Long. 180 is top, 0 is bottom; Lat. -90 is left, 90 is right"};
static char s2[]={" Planar 3D Parameters\n\
Pre-rotation X axis is screen top; Y axis is left side\n\
Pre-rotation Z axis is coming at you out of the screen!"};
char far *prompts3d[21];
struct fullscreenvalues uvalues[21];
int i, k;
int oldhelpmode;
ENTER_OVLY(OVLY_PROMPTS1);
#ifdef WINFRACT
{
extern int far wintext_textmode;
if (wintext_textmode != 2) /* are we in textmode? */
return(0); /* no - prompts are already handled */
}
#endif
restart_1:
if (Targa_Out && overlay3d)
Targa_Overlay = 1;
k= -1;
LOADPROMPTS3D("Preview Mode?");
uvalues[k].type = 'y';
uvalues[k].uval.ch.val = preview;
LOADPROMPTS3D(" Show Box?");
uvalues[k].type = 'y';
uvalues[k].uval.ch.val = showbox;
LOADPROMPTS3D("Coarseness, preview/grid/ray (in y dir)");
uvalues[k].type = 'i';
uvalues[k].uval.ival = previewfactor;
LOADPROMPTS3D("Spherical Projection?");
uvalues[k].type = 'y';
uvalues[k].uval.ch.val = sphere = SPHERE;
LOADPROMPTS3D("Stereo (R/B 3D)? (0=no,1=alternate,2=superimpose,3=photo)");
uvalues[k].type = 'i';
uvalues[k].uval.ival = glassestype;
LOADPROMPTS3D("Ray trace out? (0=No, 1=DKB/POVRay, 2=VIVID, 3=RAW,");
uvalues[k].type = 'i';
uvalues[k].uval.ival = RAY;
LOADPROMPTS3D(" 4=MTV, 5=RAYSHADE, 6=ACROSPIN, 7=DXF)");
uvalues[k].type = '*';
LOADPROMPTS3D(" Brief output?");
uvalues[k].type = 'y';
uvalues[k].uval.ch.val = BRIEF;
check_writefile(ray_name,".ray");
LOADPROMPTS3D(" Output File Name");
uvalues[k].type = 's';
strcpy(uvalues[k].uval.sval,ray_name);
LOADPROMPTS3D("Targa output?");
uvalues[k].type = 'y';
uvalues[k].uval.ch.val = Targa_Out;
oldhelpmode = helpmode;
helpmode = HELP3DMODE;
k = fullscreen_prompt(hdg,k+1,prompts3d,uvalues,0,0,NULL);
helpmode = oldhelpmode;
if (k < 0) {
EXIT_OVLY;
return(-1);
}
k=0;
preview = uvalues[k++].uval.ch.val;
showbox = uvalues[k++].uval.ch.val;
previewfactor = uvalues[k++].uval.ival;
sphere = uvalues[k++].uval.ch.val;
glassestype = uvalues[k++].uval.ival;
RAY = uvalues[k++].uval.ival;
k++;
{
static char far msg[] = {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -