void set_atm_params(DICT_WORD atm_dict[],int num_atm_dict, char fun_key[],char filename[], int jmol_typ,int jres, int jres_off, CPATOM_MAPS *cpatom_maps,MDATOM_MAPS *atommaps, BUILD_INTRA *build_intra,MDCLATOMS_INFO *clatoms_info, MDGHOST_ATOMS *ghost_atoms,MDCONSTRNT *mdconstrnt) /*=======================================================================*/ {/*begin routine*/ /*=======================================================================*/ /* Local Variables */ NAME site; int i,iii,num,num2,num3,num4,iatm_ind,imask,index,num1; int itype,iatm_ind_sm,ifound; double dnum; /*=======================================================================*/ /* I) Check for missing key words */ for(i=1;i<=num_atm_dict;i++){ if(atm_dict[i].iuset==0 && atm_dict[i].key_type==1){ keyword_miss(atm_dict,filename,fun_key,i);} }/*endfor*/ /*=======================================================================*/ /* II) Get atm index */ sscanf(atm_dict[2].keyarg,"%d",&iatm_ind); index = 2; if(iatm_ind>build_intra->natmind_1res_now||iatm_ind<0){ keyarg_barf(atm_dict,filename,fun_key,index);} imask = build_intra->mask_atm[iatm_ind]; /*=======================================================================*/ /*=======================================================================*/ if(imask>0){ /*=======================================================================*/ /* III) Get rejiggered atm index */ /*-----------------------------------------------------------------------*/ iatm_ind = (build_intra->index_atm)[iatm_ind]; if(iatm_ind>build_intra->natm_1res_now||iatm_ind<0){ keyarg_barf(atm_dict,filename,fun_key,index);} build_intra->iatm_ind_chk[iatm_ind]++; iatm_ind_sm = iatm_ind; iatm_ind = iatm_ind + clatoms_info->natm_tot; /*=======================================================================*/ /* IV) Fill the dictionary with words */ /*-----------------------------------------------------------------------*/ /* 3) \mass{} */ sscanf(atm_dict[3].keyarg,"%lg",&dnum); index = 3; if(dnum<=0.0){ keyarg_barf(atm_dict,filename,fun_key,index); }/*endif*/ clatoms_info->mass[iatm_ind] = dnum; /*--------------------------------------------------------------------*/ /* 4) \charge{} */ sscanf(atm_dict[4].keyarg,"%lg",&dnum); clatoms_info->q[iatm_ind] = dnum; /*--------------------------------------------------------------------*/ /* 5) \alpha_pol{} */ sscanf(atm_dict[5].keyarg,"%lg",&dnum); index = 5; if(dnum<0.0){ keyarg_barf(atm_dict,filename,fun_key,index); }/*endif*/ clatoms_info->alp_pol[iatm_ind] = dnum; /*--------------------------------------------------------------------*/ /* 6) \b_neut{} */ sscanf(atm_dict[6].keyarg,"%lg",&dnum); clatoms_info->b_neut[iatm_ind] = dnum; /*--------------------------------------------------------------------*/ /* 7) \valence{} */ sscanf(atm_dict[7].keyarg,"%d",&num); build_intra->bond_site[iatm_ind_sm].valence = num; index = 7; if(num<0||num>MAX_VALENCE){ keyarg_barf(atm_dict,filename,fun_key,index);} /*--------------------------------------------------------------------*/ /* 8) \improper_def{} */ strcpy(build_intra->strip1,atm_dict[8].keyarg); parse_improp(build_intra->strip1,build_intra->strip2,&num1,&num2,&num3, &num4); build_intra->bond_site[iatm_ind_sm].improper_ind[1]=num1+1; build_intra->bond_site[iatm_ind_sm].improper_ind[2]=num2+1; build_intra->bond_site[iatm_ind_sm].improper_ind[3]=num3+1; build_intra->bond_site[iatm_ind_sm].improper_ind[4]=num4+1; index = 8; if((num1+num2+num3+num4)!=0&&(num1+num2+num3+num4)!=6){ keyarg_barf(atm_dict,filename,fun_key,index);} if((num1+num2+num3+num4)==6){ if(num1<0||num1>3||num2<0||num2>3||num3<0||num3>3||num4<0||num4>3|| num1==num2||num1==num3||num2==num3||num1==num4||num2==num4|| num3==num4){ keyarg_barf(atm_dict,filename,fun_key,index);}} /*--------------------------------------------------------------------*/ /* 9) \bond_site_1{} */ strcpy(build_intra->strip1,atm_dict[9].keyarg); parse_bond_site(build_intra->strip1,build_intra->strip2,site,&num2,&num3); strcpy(build_intra->bond_site[iatm_ind_sm].bond_site_name[1],site); build_intra->bond_site[iatm_ind_sm].branch_1[1] = num2; build_intra->bond_site[iatm_ind_sm].branch_2[1] = num3; index = 9; if(strlen(site)==0||num2<-1||num3<-1||num2>MAX_VALENCE||num3>MAX_VALENCE){ keyarg_barf(atm_dict,filename,fun_key,index); }/*endif*/ /*--------------------------------------------------------------------*/ /* 10) \bond_site_2{} */ strcpy(build_intra->strip1,atm_dict[10].keyarg); parse_bond_site(build_intra->strip1,build_intra->strip2,site,&num2,&num3); strcpy(build_intra->bond_site[iatm_ind_sm].bond_site_name[2],site); build_intra->bond_site[iatm_ind_sm].branch_1[2] = num2; build_intra->bond_site[iatm_ind_sm].branch_2[2] = num3; index = 10; if(strlen(site)==0||num2<-1||num3<-1||num2>MAX_VALENCE||num3>MAX_VALENCE){ keyarg_barf(atm_dict,filename,fun_key,index); } /*---------------------------------------------------------------------*/ /* 11) \bond_site_3{} */ strcpy(build_intra->strip1,atm_dict[11].keyarg); parse_bond_site(build_intra->strip1,build_intra->strip2,site,&num2,&num3); strcpy(build_intra->bond_site[iatm_ind_sm].bond_site_name[3],site); build_intra->bond_site[iatm_ind_sm].branch_1[3] = num2; build_intra->bond_site[iatm_ind_sm].branch_2[3] = num3; index = 11; if(strlen(site)==0||num2<-1||num3<-1||num2>MAX_VALENCE||num3>MAX_VALENCE){ keyarg_barf(atm_dict,filename,fun_key,index);} /*---------------------------------------------------------------------*/ /* 12) \bond_site_4{} */ strcpy(build_intra->strip1,atm_dict[12].keyarg); parse_bond_site(build_intra->strip1,build_intra->strip2,site,&num2,&num3); strcpy(build_intra->bond_site[iatm_ind_sm].bond_site_name[4],site); build_intra->bond_site[iatm_ind_sm].branch_1[4] = num2; build_intra->bond_site[iatm_ind_sm].branch_2[4] = num3; index = 12; if(strlen(site)==0||num2<-1||num3<-1||num2>MAX_VALENCE||num3>MAX_VALENCE){ keyarg_barf(atm_dict,filename,fun_key,index);} /*------------------------------------------------------------------------*/ /* 15) \cp_atom{} */ ifound = 0; if(strcasecmp(atm_dict[15].keyarg,"yes")==0){ ifound=1;cpatom_maps->cp_atm_flag[iatm_ind] = 1; } if(strcasecmp(atm_dict[15].keyarg,"no")==0){ ifound=1;cpatom_maps->cp_atm_flag[iatm_ind] = 0; } /*--------------------------------------------------------------------*/ /* 13) \cp_valence_up{} */ cpatom_maps->cp_vlnc_up[iatm_ind] = 0; if(atm_dict[13].iuset==1){ sscanf(atm_dict[13].keyarg,"%d",&num); cpatom_maps->cp_vlnc_up[iatm_ind] = num; }/*endif*/ if(atm_dict[13].iuset==0 && cpatom_maps->cp_atm_flag[iatm_ind]==1){ index = 13; keyarg_barf(atm_dict,filename,fun_key,index); }/*endif*/ /*--------------------------------------------------------------------*/ /* 14) \cp_valence_dn{} */ cpatom_maps->cp_vlnc_dn[iatm_ind] = cpatom_maps->cp_vlnc_up[iatm_ind]; if(atm_dict[14].iuset == 1){ sscanf(atm_dict[14].keyarg,"%d",&num); cpatom_maps->cp_vlnc_dn[iatm_ind] = num; }/*endif*/ /*------------------------------------------------------------------------*/ /* 16) /def_ghost1{} */ ghost_atoms->ighost_flag[iatm_ind] = 0; if(atm_dict[16].iuset!=0){ set_ghost(ghost_atoms,clatoms_info,atommaps,build_intra, atm_dict,num_atm_dict, filename,fun_key,iatm_ind); }/*endif*/ /*------------------------------------------------------------------------*/ /* 17) \label{} */ index = 16+NCOEF_GHOST_MAX; ifound = 0; if(strcasecmp(atm_dict[index].keyarg,"standard")==0){ ifound=1;mdconstrnt->atom_label[iatm_ind] = 0; } if(strcasecmp(atm_dict[index].keyarg,"backbone")==0){ ifound=1;mdconstrnt->atom_label[iatm_ind] = 1; } if(strcasecmp(atm_dict[index].keyarg,"sidechain")==0){ ifound=1;mdconstrnt->atom_label[iatm_ind] = 2; } if(ifound==0){ keyarg_barf(atm_dict,filename,fun_key,index); }/*endif*/ /*--------------------------------------------------------------------*/ /* 18+NCOEF_GHOST_MAX) \cp_valence_true_up{} */ cpatom_maps->cp_vlnc_true_up[iatm_ind] = cpatom_maps->cp_vlnc_up[iatm_ind]; if(atm_dict[18+NCOEF_GHOST_MAX].iuset == 1){ sscanf(atm_dict[18+NCOEF_GHOST_MAX].keyarg,"%d",&num); cpatom_maps->cp_vlnc_true_up[iatm_ind] = num; if (num>cpatom_maps->cp_vlnc_up[iatm_ind]){ index = 18+NCOEF_GHOST_MAX; keyarg_barf(atm_dict,filename,fun_key,index); }/*endif*/ }/*endif*/ /*--------------------------------------------------------------------*/ /* 19+NCOEF_GHOST_MAX) \cp_valence_true_dn{} */ cpatom_maps->cp_vlnc_true_dn[iatm_ind] = cpatom_maps->cp_vlnc_true_up[iatm_ind]; if(atm_dict[19+NCOEF_GHOST_MAX].iuset == 1){ sscanf(atm_dict[19+NCOEF_GHOST_MAX].keyarg,"%d",&num); cpatom_maps->cp_vlnc_true_dn[iatm_ind] = num; if (num>cpatom_maps->cp_vlnc_dn[iatm_ind]){ index = 19+NCOEF_GHOST_MAX; keyarg_barf(atm_dict,filename,fun_key,index); }/*endif*/ }/*endif*/ /*------------------------------------------------------------------------*/ /*====================================================================*/ /* IV) Do up atom types */ itype = atommaps->natm_typ + 1; for(i=1;i<=atommaps->natm_typ;i++){ if(strcasecmp(atm_dict[1].keyarg,atommaps->atm_typ[i])==0) itype=i; } /*endfor*/ if(itype>build_intra->natm_typ_max){ build_intra->natm_typ_max+=NMEM_MIN; atommaps->atm_typ = (NAME *) crealloc(&(atommaps->atm_typ[1]), (build_intra->natm_typ_max)*sizeof(NAME),"set_atm_params")-1; }/*endif*/ if(itype==atommaps->natm_typ+1){ atommaps->natm_typ+=1; strcpy(atommaps->atm_typ[itype],atm_dict[1].keyarg); }/*endif*/ /*====================================================================*/ /* V) Do up types */ atommaps->iatm_mol_typ[iatm_ind] = jmol_typ; atommaps->iatm_mol_num[iatm_ind] = 1; atommaps->iatm_res_num[iatm_ind] = jres; atommaps->iatm_atm_typ[iatm_ind] = itype; atommaps->iatm_res_typ[iatm_ind] = atommaps->ires_typ_jres_jmol_typ[jres+jres_off]; /*====================================================================*/ /*====================================================================*/ } /*endif (imask>0) */ /*======================================================================*/ } /*end routine*/
/* * Places a ghost somewhere. */ s16b place_ghost(void) { #if 0 /* DGDGDGDG */ int y, x, hp, level, grace, gclass; monster_race *r_ptr = &r_info[max_r_idx - 1]; FILE *fp; bool err = FALSE; bool town = FALSE; char name[100]; char tmp[1024]; /* Hack -- no ghosts in the town */ if (!dun_level) return (FALSE); /* Already have a ghost */ if (r_ptr->cur_num >= r_ptr->max_num) { return (FALSE); } /* Dungeon -- Use Dungeon Level */ else { /* And even then, it only happens sometimes */ if (14 > randint((dun_level / 2) + 11)) return (FALSE); /* Only a 45% chance */ if (magik(45)) return (FALSE); /* Level is dungeon level */ level = dun_level; } /* Choose a bones file */ sprintf(tmp, "%s%sbone%03d.%03d", ANGBAND_DIR_BONE, PATH_SEP, dungeon_type, level); /* Grab permission */ safe_setuid_grab(); /* Open the bones file */ fp = my_fopen(tmp, "r"); /* Drop permission */ safe_setuid_drop(); /* No bones file to use */ if (!fp) return (FALSE); /* Scan the file */ err = (fscanf(fp, "%[^\n]\n%d\n%d\n%d", name, &hp, &grace, &gclass) != 4); /* Close the file */ fclose(fp); /* Previously, the bone file would now be deleted. The new * method is to only remove the bone file when the ghost is * destroyed. This means that failing to kill a ghost will * not lose it permenently -TM- * fd_kill(tmp); */ /* Catch errors */ if (err) { msg_print("Warning -- deleted corrupt 'ghost' file!"); return (FALSE); } /* Create "town" flag */ /* TM- What is this? Previously, if the player and dungeon levels * were equal then a 'town' ghost was created. I can't see why * 'town'. They are simply ghosts with abilities determined by * previous class. Currently we just pick between the two. * WAS: if (level == p_ptr->lev) town = TRUE; */ if (!rand_int(2)) town = TRUE; /* Set up the ghost */ set_ghost(name, hp, grace, gclass, level, town); /* Hack -- pick a nice (far away) location */ while (1) { /* Pick a location */ y = randint(cur_hgt - 2); x = randint(cur_wid - 2); /* Require "naked" floor grid */ if (!cave_empty_bold(y, x)) continue; /* Accept far away grids */ if (distance(p_ptr->py, p_ptr->px, y, x) > MAX_SIGHT + 5) break; } /*** Place the Ghost by Hand (so no-one else does it accidentally) ***/ r_ptr->cur_num = 0; r_ptr->max_num = 1; if (!place_monster_one(y, x, max_r_idx - 1, 0, FALSE, MSTATUS_ENEMY)) { return FALSE; } /* Make sure it looks right */ r_ptr->x_attr = r_ptr->d_attr; r_ptr->x_char = r_ptr->d_char; return TRUE; #else return (FALSE); #endif }