static void dowaterdemon() /* Water demon */ { register struct monst *mtmp; if(mons[PM_WATER_DEMON].geno & (G_GENOD | G_EXTINCT)) return; if((mtmp = makemon(&mons[PM_WATER_DEMON],u.ux,u.uy))) { if (!Blind) You("unleash %s!", a_monnam(mtmp)); else You("feel the presence of evil."); /* Give those on low levels a (slightly) better chance of survival */ if (rnd(100) > (80 + level_difficulty())) { pline("Grateful for %s release, %s grants you a wish!", his[pronoun_gender(mtmp)], he[pronoun_gender(mtmp)]); makewish(); mongone(mtmp); } else if (t_at(mtmp->mx, mtmp->my)) (void) mintrap(mtmp); } }
int gen_report(clparse *clinput) { FILE *fgrades, *freport, *fbank; char bank_record[MAX_LINE_LENGTH]; char pupil_record[MAX_LINE_LENGTH]; char comment_all[MAX_LINE_LENGTH][MAX_NUM_COMMENTS]; char *pch; int grade, grade_all[MAX_NUM_COMMENTS], criteria_all[MAX_NUM_COMMENTS]; int i, j, k, total_num_comments, selected_comment; char surname[MAX_NAME_LENGTH]; char firstname[MAX_NAME_LENGTH]; char gender[MAX_NAME_LENGTH]; int marks[MAX_NUM_CRITERIA]; int comments_num[NUM_GRADES+1][MAX_NUM_CRITERIA+1]; int comment_index[NUM_GRADES+1][MAX_NUM_CRITERIA+1]; char *dest; char str[MAX_LINE_LENGTH]; int num_criteria=0; char gradeName[MAX_LINE_LENGTH][MAX_NUM_CRITERIA]; fgrades = openfile(clinput->gradesfile, "r"); freport = openfile(clinput->reportfile, "w"); fbank = openfile(clinput->bankfile, "r"); /* Read in comments bank*/ i=0; while (fgets(bank_record, MAX_LINE_LENGTH, fbank) != NULL){ if (!strncasecmp(strtrim(bank_record),"<comment>",4)){ strRemoveAll(bank_record,"<comment>"); strcpy(comment_all[i],strtrim(bank_record)); grade_all[i]=grade; criteria_all[i]=num_criteria; i=i+1; } else if (!strncasecmp(strtrim(bank_record),"<criteria=",4)){ strRemoveAll(bank_record,"<criteria=\""); strRemoveAll(bank_record,"\">"); sscanf(strtrim(bank_record),"%s",gradeName[num_criteria]); num_criteria=num_criteria+1; } else if (!strncasecmp(strtrim(bank_record),"<grade=",4)){ strRemoveAll(bank_record,"<grade=\""); strRemoveAll(bank_record,"\">"); sscanf(strtrim(bank_record),"%d",&grade); } } /* calculate how many comments there are per grade and per criteria. This is needed for input into the random function. */ total_num_comments=i; for (i=0; i<NUM_GRADES+1; i++){ for (j=0; j<num_criteria+1; j++){ comments_num[i][j]=0; comment_index[i][j]=-999; } } for (k=0;k<total_num_comments;k++){ comments_num[grade_all[k]][criteria_all[k]]++; if (comment_index[grade_all[k]][criteria_all[k]] == -999) comment_index[grade_all[k]][criteria_all[k]]=k; } while (fgets(pupil_record, MAX_LINE_LENGTH, fgrades) != NULL){ /* Read in pupil grades */ pch = strtok (pupil_record," \t"); i=0; j=0; while (pch != NULL) { if (i==0) strcpy(firstname,pch); if (i==1) strcpy(surname,pch); if (i==2) strcpy(gender,pch); if (i==j+3){ marks[j]=atoi(pch); j++; } pch = strtok (NULL, " \t"); i++; } fprintf(freport,"%s %s %s",firstname, surname, gender); for(k=0;k<num_criteria;k++) fprintf(freport," %s:%d ", gradeName[k], marks[k]); fprintf(freport,"\n"); /* look at pupils grades then allocate random but relevant comment */ for (j=0; j<num_criteria; j++){ if( comments_num[marks[j]][j+1] != 0 ){ selected_comment=rnd(comments_num[marks[j]][j+1]); strcpy(str,comment_all[comment_index[marks[j]][j+1]+selected_comment-1]); dest=pronoun_gender(gender,firstname,str); fprintf(freport,"%s ",dest); } } fprintf(freport,"\n\n"); } fclose(fgrades); fclose(freport); fclose(fbank); return (EXIT_SUCCESS); }