/********************************************************************/ /* WATOR_G.C */ /* GEM-Modul fr WATOR.PRG */ /* */ /* R. Geisler 1988 Sprache: Megamax C */ /********************************************************************/ #include #include #include #include #include #include "wator.h" #define XMAX 79 /* Maximalgr”že des Ozeans */ #define YMAX 45 #define EMPTY 32 /* Codes fr Simulation */ #define FISH 250 #define SHARK 111 #define BAR 7 #define TRUE 1 /* logische Werte */ #define FALSE 0 #define NO_ATTR 0 /* fr Dateifunktionen */ #define WRONLY 1 #define OCN 0 /* Fensternummern */ #define PRO 1 #define PHA 2 #define LOW 0 /* Aufl”sung */ #define HIGH 2 #define Ntot(t, ob, n) ntoa(n, ((TEDINFO *)(t)[ob].ob_spec)->te_ptext) #define Tton(t, ob) aton(((TEDINFO *)(t)[ob].ob_spec)->te_ptext) #define Form_error(err) form_error(-31>(err)?-31-(err):32767) struct ocean /* Variablen fr Simulation... */ { unsigned char state; char moved; int age; int starve; } pos[XMAX][YMAX]; int nfish=400, nshark=40, fbreed=3, sbreed=10, starve=3, xsize=40, ysize=40; struct windows /* Variablen fr Fenster... */ { int kind; GRECT curr; GRECT work; char *name; char *info; int handle; FDB fdb; } wi[]= { { NAME|CLOSER|MOVER, 159, 40, 322, 340 }, { NAME|CLOSER|FULLER|MOVER|INFO|SIZER, 420, 30, 190, 360 }, { NAME|CLOSER|MOVER, 30, 30, 340, 360 } }; int slot[8], xdesk, ydesk, wdesk, hdesk, gl_wbox, gl_hbox; FDB scrfdb; int handle, contrl[12], intin[128], ptsin[128], intout[128], ptsout[128], work_out[57], work_in[11]= /* Variablen fr VDI */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2 }; int xmax=XMAX, ymax=YMAX, area; /* fr Ozean */ int invl=2, pwid=51, plot=TRUE; /* fr Protokoll */ int xpha=30, ypha=30, wpha=280, hpha=280, fscal=100, sscal=25, curve=TRUE; /* fr Phasendiagramm */ unsigned int aton(), time; /* sonstige Variablen... */ int mmode=FISH, cfish, cshark, run, fd, m1flags, mox, moy, dummy; OBJECT *menu_t, *about_t, *ocnpar_t, *propar_t, *phapar_t, *file_t, *string_t; main() /* Hauptfunktion */ { if(init()) multi(); quit(); } init() /* Programm initialisieren */ { int no; appl_init(); /* AES... */ handle=graf_handle(&dummy, &dummy, &gl_wbox, &gl_hbox); v_opnvwk(work_in, &handle, work_out); /* VDI... */ vst_height(handle, 6, &dummy, &dummy, &dummy, &dummy); vsm_type(handle, 2); if(!rsrc_load("wator.rsc")) /* Resources... */ { graf_mouse(ARROW, 0L); form_alert(1, "[3][|WATOR.RSC fehlt!][ABBRUCH]"); return FALSE; } graf_mouse(ARROW, 0L); rsrc_gaddr(R_TREE, MENU_T, &menu_t); rsrc_gaddr(R_TREE, ABOUT_T, &about_t); rsrc_gaddr(R_TREE, OCNPAR_T, &ocnpar_t); rsrc_gaddr(R_TREE, PROPAR_T, &propar_t); rsrc_gaddr(R_TREE, PHAPAR_T, &phapar_t); rsrc_gaddr(R_TREE, FILE_T, &file_t); rsrc_gaddr(R_TREE, STRING_T, &string_t); strcpy(((TEDINFO *)file_t[PATH].ob_spec)->te_ptext, "WATOR.OUT"); if(Getrez()!=HIGH) /* y-Aufl”sung anpassen */ { ymax=21; ysize/=2; nfish/=2; nshark/=2; wi[OCN].curr.g_y=20; wi[PRO].curr.g_y/=2; wi[PRO].curr.g_h/=2; ypha/=2; hpha/=2; wi[PHA].curr.g_y/=2; wi[PHA].curr.g_h/=2; } if(Getrez()==LOW) /* x-Aufl”sung anpassen */ { xmax=38; xsize/=2; nfish/=2; nshark/=2; wi[OCN].curr.g_x=79; pwid=11; wi[PRO].curr.g_x=120; xpha/=2; wpha/=2; wi[PHA].curr.g_x/=2; wi[PHA].curr.g_w/=2; } for(no=0; no<3; no++) /* Fenster... */ if(!buf_alloc(no)) { form_alert(1, string_t[AL_MEM].ob_spec); return FALSE; } wi[OCN].name=string_t[TI_OCN].ob_spec; wi[PRO].name=string_t[TI_PRO].ob_spec; wi[PRO].info=string_t[IN_PRO].ob_spec; wi[PHA].name=string_t[TI_PHA].ob_spec; wind_get(0, WF_WORKXYWH, &xdesk, &ydesk, &wdesk, &hdesk); menu_bar(menu_t, 1); /* Desktop aufbauen */ new_ocn(); wi_create(OCN); run=FALSE; return TRUE; /* in Ordnung */ } multi() /* Event-Verarbeitung */ { int evt, msg[8]; for(; ; ) { evt=evnt_multi(MU_BUTTON|MU_M1|MU_MESAG|MU_TIMER, 1, 1, 1, m1flags, wi[OCN].work.g_x, wi[OCN].work.g_y, wi[OCN].work.g_w, wi[OCN].work.g_h, 0, 0, 0, 0, 0, msg, 0, 0, &mox, &moy, &dummy, &dummy, &dummy, &dummy); if(evt&MU_BUTTON) /* Mausknopf-Event */ ev_button(); if(evt&MU_M1) /* Maus-Event */ ev_mouse(); if(evt&MU_MESAG) /* Message-Event */ switch(msg[0]) { case MN_SELECTED: /* Men-Message */ switch(msg[3]) { case DESK: /* Info zeigen */ use_form(about_t, 0); break; case FILE: switch(msg[4]) { case F_OPEN: /* Datei ”ffnen */ f_open(); break; case F_CLOSE: /* schliežen */ f_close(); break; case F_HEADER: /* Kopf schreiben */ f_header(); break; case QUIT: /* Programmende */ return; } break; case WINDOWS: switch(msg[4]) { case OCEAN: /* Ozean */ if(!wi_create(OCN)) form_alert(1, string_t[AL_WIND].ob_spec); break; case PHASEDIA: /* Phasendiagramm */ if(!wi_create(PHA)) form_alert(1, string_t[AL_WIND].ob_spec); break; case PROTOCOL: /* Protokoll */ if(!wi_create(PRO)) form_alert(1, string_t[AL_WIND].ob_spec); break; case M_FISH: /* Fische setzen */ mmode=FISH; break; case M_SHARK: /* Haie ... */ mmode=SHARK; break; case M_BAR: /* Barrieren ... */ mmode=BAR; break; case M_EMPTY: /* l”schen */ mmode=EMPTY; } menu_icheck(menu_t, M_EMPTY, mmode==EMPTY); menu_icheck(menu_t, M_FISH, mmode==FISH); menu_icheck(menu_t, M_SHARK, mmode==SHARK); menu_icheck(menu_t, M_BAR, mmode==BAR); break; case PARAMS: switch(msg[4]) { case PROPARS: /* Parameter fr Protokoll */ dial_pro(); break; case PHAPARS: /* ... Phasendiagramm */ dial_pha(); break; case OCNPARS: /* ... Ozean */ dial_ocn(); break; case NEW: /* Neustart */ new_ocn(); break; case START: /* Start */ run=TRUE; break; case STOP: /* Stop */ run=FALSE; } } menu_tnormal(menu_t, msg[3], TRUE); break; case WM_REDRAW: /* Fenster-Messages... */ wi_redraw(slot[msg[3]], msg[4], msg[5], msg[6], msg[7]); break; case WM_TOPPED: wi_top(slot[msg[3]]); break; case WM_CLOSED: wi_delete(slot[msg[3]]); break; case WM_FULLED: wi_full(slot[msg[3]]); break; case WM_SIZED: case WM_MOVED: wi_move(slot[msg[3]], msg[4], msg[5], msg[6], msg[7]); } if(run) /* Iteration durchfhren */ { time++; s_iterate(); disp_ocn(); disp_pha(); disp_pro(); if(cfish==area||cfish==0) /* Simulation beendet */ run=FALSE; } menu_ienable(menu_t, F_OPEN, !fd); menu_ienable(menu_t, F_CLOSE, fd); menu_ienable(menu_t, F_HEADER, fd); menu_ienable(menu_t, START, !run); menu_ienable(menu_t, STOP, run); } } quit() /* Programm beenden */ { int no; for(no=0; no<3; no++) wi_delete(no); v_clsvwk(handle); appl_exit(); Pterm0(); } ev_button() /* Mausknopf-Event, Ozean */ { /* editieren */ static char line[2]; int x, y, xc, yc; x=(mox-wi[OCN].work.g_x)/8; /* Position editieren */ y=(moy-wi[OCN].work.g_y)/8; if(!m1flags||x<0||x>xsize||y<0||y>ysize) /* doch nicht */ return; xc=x*8; yc=y*8+6; line[0]=pos[x][y].state=mmode; buf_beg(OCN); /* in Puffer schreiben */ v_gtext(handle, xc, yc, line); buf_end(); wi_redraw(OCN, min(mox-8, xdesk+wdesk-16), min(moy-8, ydesk+hdesk-16), 16, 16); } ev_mouse() /* Maus-Event, Cursor „ndern */ { int wthandle; if(m1flags) /* Fenster verlassen */ { graf_mouse(ARROW, 0L); m1flags=FALSE; } else /* in Fenster eintreten */ { wind_get(0, WF_TOP, &wthandle, &dummy, &dummy, &dummy); if(wthandle&&wthandle==wi[OCN].handle) /* falls aktiv */ { graf_mouse(OUTLN_CROSS, 0L); m1flags=TRUE; } } } disp_ocn() /* Ozean zeichnen, Bewohner */ { /* z„hlen */ char line[XMAX+1]; int i, x, y, yc=-2; line[xsize]=cfish=cshark=0; buf_beg(OCN); /* in Puffer schreiben */ for(y=0; yte_ptext; if(0<=Fsfirst(path, NO_ATTR)&&1==form_alert(1, string_t[AL_APP].ob_spec)) { fd=Fopen(path, WRONLY); Fseek(0L, fd, 2); } else fd=Fcreate(path, NO_ATTR); if(-3>fd) /* Fehler aufgetreten */ { Form_error(fd); /* GEMDOS-Fehler melden */ fd=0; } } } f_header() /* Kopf fr Protokolldatei */ { char line[41]; int i; f_write("\r\n"); f_write(string_t[HD_1].ob_spec); /* 1. Zeile */ f_write(string_t[HD_2].ob_spec); f_write("\r\n"); strcpy(line, string_t[HD_3].ob_spec); /* 2. Zeile */ ntoj(nfish, line+6); ntoj(fbreed, line+17); ntoj(nshark, line+28); f_write(line); strcpy(line, string_t[HD_4].ob_spec); ntoj(sbreed, line+4); ntoj(starve, line+16); ntoj(xsize, line+28); ntoj(ysize, line+33); f_write(line); f_write("\r\n\n"); f_write(string_t[HD_5].ob_spec); /* 3. Zeile */ f_write("\r\n"); for(i=0; i<22+pwid; i++) /* Strich */ f_write("-"); f_write("\r\n"); } f_write(string) /* String in Datei schreiben */ char *string; { if(!fd) return; if(0>=Fwrite(fd, (long)strlen(string), string)) { form_alert(1, string_t[AL_FILE].ob_spec); f_close(); } } f_close() /* Datei schliežen */ { int err; if(0>(err=Fclose(fd))) Form_error(err); fd=0; } use_form(addr, start_ob) /* Dialog fhren */ int start_ob; OBJECT *addr; { int x, y, w, h, ex_ob; form_center(addr, &x, &y, &w, &h); form_dial(FMD_START, 0, 0, 0, 0, x, y, w, h); objc_draw(addr, 0, 99, x, y, w, h); ex_ob=form_do(addr, start_ob); form_dial(FMD_FINISH, 0, 0, 0, 0, x, y, w, h); objc_change(addr, ex_ob, 0, x, y, w, h, NORMAL, 0); return(ex_ob); } ntoa(n, a) /* natrliche Zahl => String */ char *a; unsigned n; { int c, i=0, j=0; do { a[i++]='0'+n%10; n/=10; } while(n); a[i]=0; while(j natrliche Zahl */ char *a; { int i=0; unsigned n=0; while(!isdigit(a[i])) if(!a[i++]) return 0; while(isdigit(a[i])) { n*=10; n+=a[i++]-'0'; } return n; }