Пример #1
0
bool do_control_drop(void)
{
	monster_type *m_ptr = get_monster(p_ptr->control);

	if (!p_ptr->control) return FALSE;
	monster_drop_carried_objects(m_ptr);
	return TRUE;
}
Пример #2
0
void talk_to_monster(s32b m_idx)
{
	char m_name[100];

	/* Extract monster name (or "it") */
	monster_desc(m_name, get_monster(m_idx), 0);

	/* Process hook if there are any */
	if (!process_hooks(HOOK_CHAT, "(d)", m_idx))
	{
		msg_print("The monster does not want to chat.");
	}
}
Пример #3
0
int			run_epikong()
{
  t_map			map;
  char			*path;

  if ((path = init_screen()) == NULL)
    return (EXIT_FAILURE);
  if (start_music() == EXIT_FAILURE)
    return (EXIT_FAILURE);
  if (start_parsing(path, &map) == EXIT_FAILURE)
    return (EXIT_FAILURE);
  if (get_monster(&map) == EXIT_FAILURE)
    return (EXIT_FAILURE);
  if (get_hero(&map) == EXIT_FAILURE)
    return (EXIT_FAILURE);
  if (parse_map(&map) == EXIT_FAILURE)
    return (EXIT_FAILURE);
  return (EXIT_SUCCESS);
}
Пример #4
0
/* Returns if a new companion is allowed */
bool can_create_companion(void)
{
	s32b i, mcnt = 0;

	for_flags(&monst_list);
	{
		i = __key;
		/* Access the monster */
		monster_type *m_ptr = get_monster(i);

		/* Ignore "dead" monsters */
		if (!m_ptr->r_idx) continue;

		if ((m_ptr->faction == FACTION_PLAYER) && has_flag(m_ptr, FLAG_PERMANENT)) mcnt++;
	}
	end_for_flags();

	if (mcnt < (1 + get_skill_scale(SKILL_LORE, 6))) return (TRUE);
	else return (FALSE);
}
Пример #5
0
/* Multiply !! */
bool ai_multiply(s32b m_idx)
{
	monster_type *m_ptr = get_monster(m_idx);
	s32b k, y, x, oy = m_ptr->fy, ox = m_ptr->fx;
	bool is_frien = (is_friend(m_ptr) > 0);

	/* Count the adjacent monsters */
	for (k = 0, y = oy - 1; y <= oy + 1; y++)
	{
		for (x = ox - 1; x <= ox + 1; x++)
		{
			if (cave[y][x].m_idx) k++;
		}
	}

	if (is_friend(m_ptr) > 0)
	{
		is_frien = TRUE;
	}
	else
	{
		is_frien = FALSE;
	}

	/* Hack -- multiply slower in crowded areas */
	if ((k < 4) && (!k || !rand_int(k * MON_MULT_ADJ)))
	{
		/* Try to multiply */
		if (multiply_monster(m_idx, (is_frien), FALSE))
		{
			/* Take note if visible */
			if (m_ptr->ml)
				monstmem_add(RT_MISC, FLAG_MULTIPLY, m_ptr, 0);

			/* Multiplying takes energy */
			return TRUE;
		}
	}
	return FALSE;
}
Пример #6
0
/* Finds the controlled monster and "reconnect" to it */
bool do_control_reconnect()
{
	s32b i;

	for_flags(&monst_list);
	{
		i = __key;
		/* Access the monster */
		monster_type *m_ptr = get_monster(i);

		/* Ignore "dead" monsters */
		if (!m_ptr->r_idx) continue;

		if (m_ptr->mflag & MFLAG_CONTROL)
		{
			p_ptr->control = i;
			return TRUE;
		}
	}
	end_for_flags();
	return FALSE;
}
Пример #7
0
bool do_control_pickup(void)
{
	monster_type *m_ptr = get_monster(p_ptr->control);
	cave_type *c_ptr;
	bool done = FALSE;

	if (!p_ptr->control) return FALSE;

	/* Scan all objects in the grid */
	c_ptr = &cave[m_ptr->fy][m_ptr->fx];
#if 0 //DGDGDGDG
	for_inventory_slot(&c_ptr->inventory, o_ptr);
	{
		/* Skip gold */
		if (has_flag(o_ptr, FLAG_GOLD_VALUE) continue;

		/* Excise the object */
		excise_object_idx(this_o_idx);

		/* Forget mark */
		o_ptr->marked = FALSE;

		/* Forget location */
		o_ptr->iy = o_ptr->ix = 0;

		/* Memorize monster */
		o_ptr->held_m_idx = p_ptr->control;

		/* Build a stack */
		o_ptr->next_o_idx = m_ptr->hold_o_idx;

		/* Carry object */
		m_ptr->hold_o_idx = this_o_idx;
		done = TRUE;
	}
#endif
	if (done) msg_print("You pick up all objects on the floor.");
	return TRUE;
}
Пример #8
0
/*
 * Turns a simple pet into a faithful companion
 */
void do_cmd_companion()
{
	monster_type *m_ptr;
	s32b ii, jj;

	if (!can_create_companion())
	{
		msg_print("You cannot get anymore companion.");
		return;
	}

	if (!tgt_pt(&ii, &jj))
	{
		msg_print("You must target a pet.");
		return;
	}

	if (cave[jj][ii].m_idx)
	{
		char m_name[100];

		m_ptr = get_monster(cave[jj][ii].m_idx);

		monster_desc(m_name, m_ptr, 0);
		if (m_ptr->faction == FACTION_PLAYER)
		{
			bool_flag(m_ptr, FLAG_PERMANENT);
			msg_format("%^s agrees to follow you.", m_name);
		}
		else
		{
			msg_format("%^s is not in your faction!", m_name);
		}
	}
	else
		msg_print("You must target a monster of your own faction.");
}
Пример #9
0
void ai_deincarnate(s32b m_idx)
{
#if 0 // DGDGDGDG
	monster_type *m_ptr = get_monster(m_idx);
	s32b r2_idx = m_ptr->possessor, r_idx = m_ptr->r_idx;
	monster_race *r_ptr = &r_info[r2_idx];
	s32b i;
	char m_name[80];

	monster_desc(m_name, m_ptr, 0x04);

	if (m_ptr->ml) msg_format("The soul of %s deincarnates!", m_name);

	m_ptr->r_idx = r2_idx;
	m_ptr->ego = 0;

	/* No "damage" yet */
	m_ptr->stunned = 0;
	m_ptr->confused = 0;
	m_ptr->monfear = 0;

	/* No target yet */
	m_ptr->target = -1;

	/* Assume no sleeping */
	m_ptr->csleep = 0;

	/* Assign maximal hitpoints */
	if (has_flag(r_ptr, FLAG_FORCE_MAXHP))
	{
		m_ptr->maxhp = maxroll(r_ptr->hdice, r_ptr->hside);
	}
	else
	{
		m_ptr->maxhp = damroll(r_ptr->hdice, r_ptr->hside);
	}

	/* And start out fully healthy */
	m_ptr->hp = m_ptr->maxhp;

	/* Some basic info */
	for (i = 0; i < 4; i++)
	{
		m_ptr->blow[i].method = r_ptr->blow[i].method;
		m_ptr->blow[i].effect = r_ptr->blow[i].effect;
		m_ptr->blow[i].d_dice = r_ptr->blow[i].d_dice;
		m_ptr->blow[i].d_side = r_ptr->blow[i].d_side;
	}
	m_ptr->ac = r_ptr->ac;
	m_ptr->level = r_ptr->level;
	m_ptr->speed = r_ptr->speed;
	m_ptr->exp = MONSTER_EXP(m_ptr->level);

	/* Extract the monster base speed */
	m_ptr->mspeed = m_ptr->speed;

	m_ptr->energy = 0;

	/* Hack -- Count the number of "reproducers" */
	if (has_flag(r_ptr, FLAG_MULTIPLY)) num_repro++;

	/* Hack -- Notice new multi-hued monsters */
	if (has_flag(r_ptr, FLAG_ATTR_MULTI)) shimmer_monsters = TRUE;

	/* Hack -- Count the monsters on the level */
	r_ptr->cur_num++;
	r_info[r_idx].cur_num--;

	m_ptr->possessor = 0;

	/* Update the monster */
	update_mon(m_idx, TRUE);
#endif
}
Пример #10
0
static void fix_m_list(void)
{
	s32b i, j;

	/* Scan windows */
	for (j = 0; j < 8; j++)
	{
		term *old = Term;

		s32b c = 0;

		/* No window */
		if (!angband_term[j]) continue;

		/* No relevant flags */
		if (!flag_exists(&window_flag[j], FLAG_PW_M_LIST)) continue;

		/* Activate */
		Term_activate(angband_term[j]);

		/* Clear */
		Term_clear();

		/* Hallucination */
		if (intrinsic(HALLUCINATE))
		{
			c_prt(TERM_WHITE, "You can not see clearly", 0, 0);

			/* Fresh */
			Term_fresh();

			/* Restore */
			Term_activate(old);

			return;
		}

		/* reset visible count */
		for (i = 1; i < max_r_idx; i++)
		{
			monster_race *r_ptr = &r_info[i];

			r_ptr->total_visible = 0;
		}

		/* Count up the number visible in each race */
		for_flags(&monst_list);
		{
			i = __key;
			monster_type *m_ptr = get_monster(i);
			monster_race *r_ptr = &r_info[m_ptr->r_idx];
			object_type  *o_ptr = get_obj_mimic_obj_at(m_ptr->fy,
													   m_ptr->fx);

			/* Skip dead monsters */
			if (m_ptr->hp < 0) continue;

			/* Skip unseen monsters */
			if (o_ptr != NULL && !o_ptr->marked)
			{
				/* Memorized objects */
				if (!o_ptr->marked) continue;
			}
			else
				if (!m_ptr->ml) continue;

			/* Increase for this race */
			r_ptr->total_visible++;

			/* Increase total Count */
			c++;
		}
		end_for_flags();

		/* Are monsters visible? */
		if (c)
		{
			s32b w, h, num = 0;

			(void)Term_get_size(&w, &h);

			c_prt(TERM_WHITE, format("You can see %d monster%s", c, (c > 1 ? "s:" : ":")), 0, 0);

			for (i = 1; i < max_r_idx; i++)
			{
				monster_race *r_ptr = &r_info[i];

				/* Default Colour */
				byte attr = TERM_SLATE;

				/* Only visible monsters */
				if (!r_ptr->total_visible) continue;

				/* Uniques */
				if (has_flag(r_ptr, FLAG_UNIQUE))
				{
					attr = TERM_L_BLUE;
				}

				/* Have we ever killed one? */
				if (r_ptr->r_tkills)
				{
					if (r_ptr->level > dun_level)
					{
						attr = TERM_VIOLET;

						if (has_flag(r_ptr, FLAG_UNIQUE))
						{
							attr = TERM_RED;
						}
					}
				}
				else
				{
					if (!has_flag(r_ptr, FLAG_UNIQUE)) attr = TERM_GREEN;
				}


				/* Dump the monster name */
				if (r_ptr->total_visible == 1)
				{
					c_prt(attr, (r_ptr->name), (num % (h - 1)) + 1, (num / (h - 1) * 26));
				}
				else
				{
					c_prt(attr, format("%s (x%d)", r_ptr->name, r_ptr->total_visible), (num % (h - 1)) + 1, (num / (h - 1)) * 26);
				}

				num++;

			}

		}
		else
		{
			c_prt(TERM_WHITE, "You see no monsters.", 0, 0);
		}

		/* Fresh */
		Term_fresh();

		/* Restore */
		Term_activate(old);
	}
}
Пример #11
0
int main(int argc, char **argv) {
    int i,j,maxn,maxm;
    const char str[]="../test/2/input20.txt";//14 15
    char bool_show=1;
    freopen(str,"rt",stdin);
    scanf("%d%d\n",&maxn,&maxm);
    char **map;
    map=(char **)malloc(maxn*sizeof(char *));
    for (i=0;i<maxn;i++) map[i]=(char *)malloc(maxm*sizeof(char));
    ELEM_POINT *Gold, *Monster, *Player;
    int cgolds=0,cmonsters=0,cplayers=0;
    for (i=0;i<maxn;i++) {
        char *string=(char *)malloc((maxm+2)*sizeof(char));
        gets(string);
        for (j=0;j<maxm;j++) {
            map[i][j]=string[j];
            if (map[i][j]>='0' && map[i][j]<='9') cplayers++;
            if (map[i][j]=='*') cgolds++;
            if (map[i][j]=='@') cmonsters++;
        }
    }
    fclose(stdin);
    Player=(ELEM_POINT *)malloc(cplayers*sizeof(ELEM_POINT));
    Gold=(ELEM_POINT *)malloc(cgolds*sizeof(ELEM_POINT));
    Monster=(ELEM_POINT *)malloc(cmonsters*sizeof(ELEM_POINT));
    int *score=(int *)malloc(cplayers*sizeof(int));
    for (i=0;i<cplayers;i++) score[i]=0;
    int numbergame;
    for (numbergame=0;numbergame<factorial(cplayers);numbergame++) {
        printf("Number of game = %d\n",numbergame);
        //usleep(3*1000*1000);

        int move=0,indexgold,indexmonster,indexplayer;

        //set position
        int iteration=-1;
        int number_of_iteration=0;
        int *massive_iteration=(int *)malloc(cplayers*sizeof(int)) ;
        while (iteration!=numbergame) {
            iteration++;
            while (1) {
                int index_of_iteration, tmp_number_of_iteration=number_of_iteration;
                for (index_of_iteration=cplayers-1;index_of_iteration>=0;index_of_iteration--) {
                    massive_iteration[index_of_iteration]=tmp_number_of_iteration%cplayers;
                    tmp_number_of_iteration/=cplayers;
                }
                int flagin=1;
                for (i=0;i<cplayers-1;i++) {
                    for (j=i+1;j<cplayers;j++) {
                        if (massive_iteration[i]==massive_iteration[j]) {
                            flagin=0;
                            break;
                        }
                    }
                    if (flagin==0) break;
                }
                number_of_iteration++;
                if (flagin==1) break;
            }
        }

        freopen(str,"rt",stdin);
        scanf("%d%d\n",&maxn,&maxm);
        int cgolds=0,cmonsters=0,cplayers=0;
        for (i=0;i<maxn;i++) {
            for (j=0;j<maxm;j++) {
                map[i][j]='.';
            }
        }

        for (i=0;i<maxn;i++) {
            char *string=(char *)malloc((maxm+2)*sizeof(char));
            gets(string);
            for (j=0;j<maxm;j++) {
                map[i][j]=string[j];
                if (map[i][j]>='0' && map[i][j]<='9') {
                    cplayers++;
                    Player[ map[i][j]-'0' ].y=i;
                    Player[ map[i][j]-'0' ].x=j;
                    Player[ map[i][j]-'0' ].alive=map[i][j];
                }
                if (map[i][j]=='*') cgolds++;
                if (map[i][j]=='@') cmonsters++;
            }
        }
        fclose(stdin);

        for (i=0;i<cplayers;i++) {
            map[Player[i].y][Player[i].x]=Player[massive_iteration[i]].alive;
        }
        free(massive_iteration);

        while (1) {
            cgolds=0;
            cmonsters=0;
            indexgold=0;
            indexmonster=0;
            indexplayer=0;
            system("clear");
            for (i=0;i<maxn;i++) {
                for (j=0;j<maxm;j++) {

                    if (bool_show) {


                        if (map[i][j]>='0' && map[i][j]<='9') printf("\033[33m%c",map[i][j]);
                        if (map[i][j]=='#') printf("\033[35m%c",map[i][j]);
                        if (map[i][j]=='*') printf("\033[31m%c",map[i][j]);
                        if (map[i][j]=='@') printf("\033[36m%c",map[i][j]);
                        if (map[i][j]=='.') printf("\033[37m%c",map[i][j]);//37
                        printf("\033[37m");

                        //printf("%c",map[i][j]);
                    }
                    if (map[i][j]>='0' && map[i][j]<='9') {
                        Player[ map[i][j]-'0' ].y=i;
                        Player[ map[i][j]-'0' ].x=j;
                        Player[ map[i][j]-'0' ].alive=map[i][j];
                    }
                    if (map[i][j]=='*') {
                        Gold[indexgold].y=i;
                        Gold[indexgold].x=j;
                        Gold[indexgold].alive=1;
                        indexgold++;
                    }
                    if (map[i][j]=='@') {
                        Monster[indexmonster].y=i;
                        Monster[indexmonster].x=j;
                        Monster[indexmonster].alive=1;
                        indexmonster++;
                    }
                }
                if (bool_show) printf("\n");
            }
            //if (move==0) usleep(1000*1000);
            cgolds=indexgold;
            cmonsters=indexmonster;
            if (move>=10000 || cgolds==0) break;

            int command;
            clock_t time;

            printf("Players think ");
            //0
            if (cplayers>-1) {
                int isGold=0;
                for (i=0;i<maxn;i++) {
                    for (j=0;j<maxm;j++) {
                        if (map[i][j]=='*') {
                            isGold=1;
                            break;
                        }
                    }
                    if (isGold) break;
                }
                if (isGold) {
                    indexplayer=0;
                    time=clock();
                    get_player1(map,maxn,maxm,Player[indexplayer].y,Player[indexplayer].x,&command);
                    time = clock()-time;
                    printf("%3.0f ms ", 1000*(double)time/CLOCKS_PER_SEC);
                    if (1000*(double)time/CLOCKS_PER_SEC<1000) {
                        switch (command) {
                            case 0: break;
                            case 1: if (Player[indexplayer].x>0 && map[Player[indexplayer].y][Player[indexplayer].x-1]!='#') Player[indexplayer].x--; break;
                            case 2: if (Player[indexplayer].y>0 && map[Player[indexplayer].y-1][Player[indexplayer].x]!='#') Player[indexplayer].y--; break;
                            case 3: if (Player[indexplayer].x<maxm-1 && map[Player[indexplayer].y][Player[indexplayer].x+1]!='#') Player[indexplayer].x++; break;
                            case 4: if (Player[indexplayer].y<maxn-1 && map[Player[indexplayer].y+1][Player[indexplayer].x]!='#') Player[indexplayer].y++; break;
                            default : break;
                        }
                    }
                    updatemap(map,maxn,maxm,Monster,cmonsters,Gold,cgolds,Player,cplayers,indexplayer,score);
                }
            }
            //1
            if (cplayers>0) {
                int isGold=0;
                for (i=0;i<maxn;i++) {
                    for (j=0;j<maxm;j++) {
                        if (map[i][j]=='*') {
                            isGold=1;
                            break;
                        }
                    }
                    if (isGold) break;
                }
                if (isGold) {
                    indexplayer=1;
                    time=clock();
                    get_player2(map,maxn,maxm,Player[indexplayer].y,Player[indexplayer].x,&command);
                    time = clock()-time;
                    printf("%3.0f ms ", 1000*(double)time/CLOCKS_PER_SEC);
                    if (1000*(double)time/CLOCKS_PER_SEC<1000) {
                        switch (command) {
                            case 0: break;
                            case 1: if (Player[indexplayer].x>0 && map[Player[indexplayer].y][Player[indexplayer].x-1]!='#') Player[indexplayer].x--; break;
                            case 2: if (Player[indexplayer].y>0 && map[Player[indexplayer].y-1][Player[indexplayer].x]!='#') Player[indexplayer].y--; break;
                            case 3: if (Player[indexplayer].x<maxm-1 && map[Player[indexplayer].y][Player[indexplayer].x+1]!='#') Player[indexplayer].x++; break;
                            case 4: if (Player[indexplayer].y<maxn-1 && map[Player[indexplayer].y+1][Player[indexplayer].x]!='#') Player[indexplayer].y++; break;
                            default : break;
                        }
                    }
                    updatemap(map,maxn,maxm,Monster,cmonsters,Gold,cgolds,Player,cplayers,indexplayer,score);
                }
            }
            /*
            //2
            if (cplayers>0) {
                int isGold=0;
                for (i=0;i<maxn;i++) {
                    for (j=0;j<maxm;j++) {
                        if (map[i][j]=='*') {
                            isGold=1;
                            break;
                        }
                    }
                    if (isGold) break;
                }
                if (isGold) {
                    indexplayer=2;
                    time=clock();
                    get_player3(map,maxn,maxm,Player[indexplayer].y,Player[indexplayer].x,&command);
                    time = clock()-time;
                    printf("%3.0f ms ", 1000*(double)time/CLOCKS_PER_SEC);
                    if (1000*(double)time/CLOCKS_PER_SEC<1000) {
                        switch (command) {
                            case 0: break;
                            case 1: if (Player[indexplayer].x>0 && map[Player[indexplayer].y][Player[indexplayer].x-1]!='#') Player[indexplayer].x--; break;
                            case 2: if (Player[indexplayer].y>0 && map[Player[indexplayer].y-1][Player[indexplayer].x]!='#') Player[indexplayer].y--; break;
                            case 3: if (Player[indexplayer].x<maxm-1 && map[Player[indexplayer].y][Player[indexplayer].x+1]!='#') Player[indexplayer].x++; break;
                            case 4: if (Player[indexplayer].y<maxn-1 && map[Player[indexplayer].y+1][Player[indexplayer].x]!='#') Player[indexplayer].y++; break;
                            default : break;
                        }
                    }
                    updatemap(map,maxn,maxm,Monster,cmonsters,Gold,cgolds,Player,cplayers,indexplayer,score);
                }
            }
            //3
            if (cplayers>1) {
                int isGold=0;
                for (i=0;i<maxn;i++) {
                    for (j=0;j<maxm;j++) {
                        if (map[i][j]=='*') {
                            isGold=1;
                            break;
                        }
                    }
                    if (isGold) break;
                }
                if (isGold) {
                    indexplayer=3;
                    time=clock();
                    get_player4(map,maxn,maxm,Player[indexplayer].y,Player[indexplayer].x,&command);
                    time = clock()-time;
                    printf("%3.0f ms ", 1000*(double)time/CLOCKS_PER_SEC);
                    if (1000*(double)time/CLOCKS_PER_SEC<1000) {
                        switch (command) {
                            case 0: break;
                            case 1: if (Player[indexplayer].x>0 && map[Player[indexplayer].y][Player[indexplayer].x-1]!='#') Player[indexplayer].x--; break;
                            case 2: if (Player[indexplayer].y>0 && map[Player[indexplayer].y-1][Player[indexplayer].x]!='#') Player[indexplayer].y--; break;
                            case 3: if (Player[indexplayer].x<maxm-1 && map[Player[indexplayer].y][Player[indexplayer].x+1]!='#') Player[indexplayer].x++; break;
                            case 4: if (Player[indexplayer].y<maxn-1 && map[Player[indexplayer].y+1][Player[indexplayer].x]!='#') Player[indexplayer].y++; break;
                            default : break;
                        }
                    }
                    updatemap(map,maxn,maxm,Monster,cmonsters,Gold,cgolds,Player,cplayers,indexplayer,score);
                }
            }
            */

            printf("\nScores : ");
            //results
            for (indexplayer=0;indexplayer<cplayers;indexplayer++) {
                printf("%d | ",score[indexplayer]);
            }

            //monsters
            for (indexmonster=0;indexmonster<cmonsters;indexmonster++) {
                command = get_monster(map,maxn,maxm,Monster[indexmonster].y,Monster[indexmonster].x);
                switch (command) {
                    case 0: break;
                    case 1: Monster[indexmonster].x--; break;
                    case 2: Monster[indexmonster].y--; break;
                    case 3: Monster[indexmonster].x++; break;
                    case 4: Monster[indexmonster].y++; break;
                    default : break;
                }
                updatemap2(map,maxn,maxm,Monster,cmonsters,Gold, cgolds, Player, cplayers, score);
            }
            printf("move = %d\n",move);
            usleep(timesleep*1000);
            move++;
        }
        for (indexplayer=0;indexplayer<cplayers;indexplayer++) {
            printf("Player %d : scores %d\n",indexplayer,score[indexplayer]);
        }
        printf("move = %d\n",move);
    }
    free(Player);
    free(Gold);
    free(Monster);
    for (i=0;i<maxn;i++) free(map[i]);
    free(map);


    //RATING ELO
    typedef struct profile {
        char name[100];
        int rating;
    } profile;
    profile data[10], *P=(profile *)malloc(cplayers*sizeof(profile));
    int cdata=0;
    //current players
    freopen("../test/cur_game.txt","rt",stdin);
    for (i=0;i<cplayers;i++) {
        scanf("%s\n",P[i].name);
    }
    fclose(stdin);
    freopen("../test/rating.txt","rt",stdin);
    int *ind=(int *)malloc(cplayers*sizeof(int)); //indexs of players in data
    while (1) {
        char st[100];
        scanf("%s\n",st);
        st[(int)strlen(st)]='\0';
        if (!strcmp(st,"0")) break;
        int rate;
        scanf("%d\n",&rate);
        for (i=0;i<(int)strlen(st)+1;i++) data[cdata].name[i]=st[i];
        data[cdata].rating=rate;
        for (i=0;i<cplayers;i++) {
            if (!strcmp(data[cdata].name,P[i].name)) {
                ind[i]=cdata;
            }
        }
        cdata++;
    }
    fclose(stdin);
    printf("BEFORE : \n");
    double *addition=(double *)malloc(cplayers*sizeof(double));
    for (i=0;i<cplayers;i++) {
        addition[i]=0;
    }
    for (i=0;i<cplayers-1;i++) {
        for (j=i+1;j<cplayers;j++) {
            double x= (score[i]>score[j]) ? 1.0 : (score[i]==score[j]) ? 0.5 : 0.0;
            double E1=1.0/(1.0+pow(10.0,(double)(data[ind[j]].rating-data[ind[i]].rating)/400.0)),
                    E2=1.0/(1.0+pow(10.0,(double)(data[ind[i]].rating-data[ind[j]].rating)/400.0));
            addition[i]+=x-E1;
            addition[j]+=1.0-x-E2;
        }
    }

    for (i=0;i<cplayers;i++) {
        data[ind[i]].rating+=(int)(30.0*addition[i]);
    }
    free(P);
    free(addition);


    //HISTORY OF GAMES
    char history[1000][100];
    int indexhistory=0,chistory=0;
    freopen("../test/result_games.txt","rt",stdin);
    while (1) {
        gets(history[indexhistory]);
        if (!strcmp(history[indexhistory],"\0")) break;
        indexhistory++;
    }
    chistory=indexhistory;
    fclose(stdin);
    freopen("../test/result_games.txt","wt",stdout);
    for (indexhistory=0;indexhistory<chistory;indexhistory++) {
        printf("%s\n",history[indexhistory]);
    }
    int indexplayer;
    printf("%s\n",str);
    for (indexplayer=0;indexplayer<cplayers;indexplayer++) {
        printf("%d player = %d\n",indexplayer,score[indexplayer]);
    }
    fclose(stdout);
    free(score);

    printf("AFTER : \n");
    for (i=0;i<cdata;i++) {
        printf("%10s %4d\n",data[i].name,data[i].rating);
    }

    freopen("../test/rating.txt","wt",stdout);
    for (i=0;i<cdata;i++) {
        printf("%s\n%d\n",data[i].name,data[i].rating);
    }
    printf("0");
    fclose(stdout);

    return 0;
}
Пример #12
0
Файл: cmd4.c Проект: jcubic/ToME
/*
 * Display current pets
 */
static void do_cmd_knowledge_pets(void)
{
	s32b i;

	PHYSFS_file *fff;

	monster_type *m_ptr;

	monster_race *r_ptr;

	s32b t_friends = 0;

	s32b t_levels = 0;

	s32b show_upkeep = 0;

	s32b upkeep_divider = 20;

	char file_name[1024];


	/* Temporary file */
	if (path_temp(file_name, 1024)) return;

	/* Open a new file */
	fff = my_fopen(file_name, "w");

	if (has_ability(AB_PERFECT_CASTING)) upkeep_divider = 15;

	/* Process the monsters (backwards) */
	for_flags(&monst_list);
	{
		i = __key;
		/* Access the monster */
		m_ptr = get_monster(i);
		r_ptr = &r_info[m_ptr->r_idx];

		/* Ignore "dead" monsters */
		if (!m_ptr->r_idx) continue;

		/* Calculate "upkeep" for friendly monsters */
		if (is_friend(m_ptr) == 1)
		{
			char pet_name[80];

			t_friends++;
			t_levels += m_ptr->level;
			monster_desc(pet_name, m_ptr, 0x88);
			fprintf(fff, "%s%s (%s)\n",
			        ((has_flag(m_ptr, FLAG_UNIQUE))) ? "#####G" : "",
			        pet_name,
			        (has_flag(m_ptr, FLAG_PERMANENT)) ? "friend" : "companion");
		}
	}
	end_for_flags();

	if (t_friends > 1 + (p_ptr->lev / (upkeep_divider)))
	{
		show_upkeep = (t_levels);

		if (show_upkeep > 100) show_upkeep = 100;
		else if (show_upkeep < 10) show_upkeep = 10;
	}


	fprintf(fff, "----------------------------------------------\n");
	fprintf(fff, "   Total: %d pet%s.\n", t_friends, (t_friends == 1 ? "" : "s"));
	fprintf(fff, "   Upkeep: %d%% mana.\n", show_upkeep);


	/* Close the file */
	my_fclose(fff);

	/* Display the file contents */
	show_file(file_name, "Current Pets", 0, 0);

	/* Remove the file */
	fd_kill(file_name);
}