Exemple #1
0
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*/
Exemple #2
0
/*
 * 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
}