void cleanup() { m_pop(); m_clear(); exit(0); }
/*{{{ clean*/ void clean(int n) { m_setcursor(CS_BLOCK); m_pop(); m_flush(); m_ttyreset(); exit(n); }
/*{{{ clean*/ void clean(int n) { m_bitdestroy(EYE_BITMAP); m_setcursor(CS_BLOCK); m_pop(); m_flush(); m_ttyreset(); exit(n); }
static void cleanup() { /* be a nice program and clean up */ int i; m_ttyreset(); /* reset echo */ for (i = 1; i <= bitcount; i++) /* free up bitmaps */ m_bitdestroy(i); m_pop(); /* pop environment */ exit(0); }
/* * Read the dungeon * * The monsters/objects must be loaded in the same order * that they were stored, since the actual indexes matter. */ static errr rd_dungeon(void) { int i, y, x; int ymax, xmax; byte count; byte tmp8u; s16b tmp16s; u16b limit; cave_type *c_ptr; /*** Basic info ***/ /* Header info */ rd_s16b(&dun_level); /* Set the base level for old versions */ base_level = dun_level; /* Read the base level */ rd_s16b(&base_level); rd_s16b(&num_repro); rd_s16b(&py); rd_s16b(&px); rd_s16b(&cur_hgt); rd_s16b(&cur_wid); rd_s16b(&tmp16s); /* max_panel_rows */ rd_s16b(&tmp16s); /* max_panel_cols */ /* Maximal size */ ymax = cur_hgt; xmax = cur_wid; /*** Run length decoding ***/ /* Load the dungeon data */ for (x = y = 0; y < ymax; ) { /* Grab RLE info */ rd_byte(&count); rd_s16b(&tmp16s); /* Apply the RLE info */ for (i = count; i > 0; i--) { /* Access the cave */ c_ptr = &cave[y][x]; /* Extract "info" */ c_ptr->info = tmp16s; /* Decline invalid flags */ c_ptr->info &= ~(CAVE_LITE | CAVE_VIEW | CAVE_MNLT); /* Advance/Wrap */ if (++x >= xmax) { /* Wrap */ x = 0; /* Advance/Wrap */ if (++y >= ymax) break; } } } /*** Run length decoding ***/ /* Load the dungeon data */ for (x = y = 0; y < ymax; ) { /* Grab RLE info */ rd_byte(&count); rd_byte(&tmp8u); /* Apply the RLE info */ for (i = count; i > 0; i--) { /* Access the cave */ c_ptr = &cave[y][x]; /* Extract "feat" */ c_ptr->feat = tmp8u; /* Advance/Wrap */ if (++x >= xmax) { /* Wrap */ x = 0; /* Advance/Wrap */ if (++y >= ymax) break; } } } /*** Run length decoding ***/ /* Load the dungeon data */ for (x = y = 0; y < ymax; ) { /* Grab RLE info */ rd_byte(&count); rd_byte(&tmp8u); /* Apply the RLE info */ for (i = count; i > 0; i--) { /* Access the cave */ c_ptr = &cave[y][x]; /* Extract "feat" */ c_ptr->mimic = tmp8u; /* Advance/Wrap */ if (++x >= xmax) { /* Wrap */ x = 0; /* Advance/Wrap */ if (++y >= ymax) break; } } } /*** Run length decoding ***/ /* Load the dungeon data */ for (x = y = 0; y < ymax; ) { /* Grab RLE info */ rd_byte(&count); rd_s16b(&tmp16s); /* Apply the RLE info */ for (i = count; i > 0; i--) { /* Access the cave */ c_ptr = &cave[y][x]; /* Extract "feat" */ c_ptr->special = tmp16s; /* Advance/Wrap */ if (++x >= xmax) { /* Wrap */ x = 0; /* Advance/Wrap */ if (++y >= ymax) break; } } } /*** Objects ***/ /* Read the item count */ rd_u16b(&limit); /* Verify maximum */ if (limit > max_o_idx) { #ifdef JP note(format("アイテムの配列が大きすぎる(%d)!", limit)); #else note(format("Too many (%d) object entries!", limit)); #endif return (151); } /* Read the dungeon items */ for (i = 1; i < limit; i++) { int o_idx; object_type *o_ptr; /* Get a new record */ o_idx = o_pop(); /* Oops */ if (i != o_idx) { #ifdef JP note(format("アイテム配置エラー (%d <> %d)", i, o_idx)); #else note(format("Object allocation error (%d <> %d)", i, o_idx)); #endif return (152); } /* Acquire place */ o_ptr = &o_list[o_idx]; /* Read the item */ rd_item(o_ptr); /* XXX XXX XXX XXX XXX */ /* Monster */ if (o_ptr->held_m_idx) { monster_type *m_ptr; /* Monster */ m_ptr = &m_list[o_ptr->held_m_idx]; /* Build a stack */ o_ptr->next_o_idx = m_ptr->hold_o_idx; /* Place the object */ m_ptr->hold_o_idx = o_idx; } /* Dungeon */ else { /* Access the item location */ c_ptr = &cave[o_ptr->iy][o_ptr->ix]; /* Build a stack */ o_ptr->next_o_idx = c_ptr->o_idx; /* Place the object */ c_ptr->o_idx = o_idx; } } /*** Monsters ***/ /* Read the monster count */ rd_u16b(&limit); /* Hack -- verify */ if (limit > max_m_idx) { #ifdef JP note(format("モンスターの配列が大きすぎる(%d)!", limit)); #else note(format("Too many (%d) monster entries!", limit)); #endif return (161); } /* Read the monsters */ for (i = 1; i < limit; i++) { int m_idx; monster_type *m_ptr; monster_race *r_ptr; /* Get a new record */ m_idx = m_pop(); /* Oops */ if (i != m_idx) { #ifdef JP note(format("モンスター配置エラー (%d <> %d)", i, m_idx)); #else note(format("Monster allocation error (%d <> %d)", i, m_idx)); #endif return (162); } /* Acquire monster */ m_ptr = &m_list[m_idx]; /* Read the monster */ rd_monster(m_ptr); /* Access grid */ c_ptr = &cave[m_ptr->fy][m_ptr->fx]; /* Mark the location */ c_ptr->m_idx = m_idx; /* Access race */ r_ptr = &r_info[m_ptr->r_idx]; /* Count XXX XXX XXX */ r_ptr->cur_num++; } /*** Success ***/ /* Regenerate the dungeon for corrupted panic-saves */ if ((py == 0) || (px == 0)) { character_dungeon = FALSE; } else { /* The dungeon is ready */ character_dungeon = TRUE; } /* Success */ return (0); }
/*! * @brief 移動先のフロアに伴ったペットを配置する / Place preserved pet monsters on new floor * @return なし */ static void place_pet(void) { int i; int max_num = p_ptr->wild_mode ? 1 : MAX_PARTY_MON; for (i = 0; i < max_num; i++) { POSITION cy = 0, cx = 0; MONSTER_IDX m_idx; if (!(party_mon[i].r_idx)) continue; if (i == 0) { m_idx = m_pop(); p_ptr->riding = m_idx; if (m_idx) { cy = p_ptr->y; cx = p_ptr->x; } } else { int j; POSITION d; for (d = 1; d < 6; d++) { for (j = 1000; j > 0; j--) { scatter(&cy, &cx, p_ptr->y, p_ptr->x, d, 0); if (monster_can_enter(cy, cx, &r_info[party_mon[i].r_idx], 0)) break; } if (j) break; } m_idx = (d == 6) ? 0 : m_pop(); } if (m_idx) { monster_type *m_ptr = &m_list[m_idx]; monster_race *r_ptr; cave[cy][cx].m_idx = m_idx; m_ptr->r_idx = party_mon[i].r_idx; /* Copy all member of the structure */ *m_ptr = party_mon[i]; r_ptr = real_r_ptr(m_ptr); m_ptr->fy = cy; m_ptr->fx = cx; m_ptr->ml = TRUE; m_ptr->mtimed[MTIMED_CSLEEP] = 0; /* Paranoia */ m_ptr->hold_o_idx = 0; m_ptr->target_y = 0; if ((r_ptr->flags1 & RF1_FORCE_SLEEP) && !ironman_nightmare) { /* Monster is still being nice */ m_ptr->mflag |= (MFLAG_NICE); /* Must repair monsters */ repair_monsters = TRUE; } /* Update the monster */ update_mon(m_idx, TRUE); lite_spot(cy, cx); /* Pre-calculated in precalc_cur_num_of_pet() */ /* r_ptr->cur_num++; */ /* Hack -- Count the number of "reproducers" */ if (r_ptr->flags2 & RF2_MULTIPLY) num_repro++; /* Hack -- Notice new multi-hued monsters */ { monster_race *ap_r_ptr = &r_info[m_ptr->ap_r_idx]; if (ap_r_ptr->flags1 & (RF1_ATTR_MULTI | RF1_SHAPECHANGER)) shimmer_monsters = TRUE; } } else { monster_type *m_ptr = &party_mon[i]; monster_race *r_ptr = real_r_ptr(m_ptr); char m_name[80]; monster_desc(m_name, m_ptr, 0); #ifdef JP msg_format("%sとはぐれてしまった。", m_name); #else msg_format("You have lost sight of %s.", m_name); #endif if (record_named_pet && m_ptr->nickname) { monster_desc(m_name, m_ptr, MD_INDEF_VISIBLE); do_cmd_write_nikki(NIKKI_NAMED_PET, RECORD_NAMED_PET_LOST_SIGHT, m_name); } /* Pre-calculated in precalc_cur_num_of_pet(), but need to decrease */ if (r_ptr->cur_num) r_ptr->cur_num--; } } /* For accuracy of precalc_cur_num_of_pet() */ (void)C_WIPE(party_mon, MAX_PARTY_MON, monster_type); }
/*{{{ close*/ void vd_close(void) { m_pop(); }
errr rd_server_savefile() { int i; errr err = 0; char savefile[1024]; byte tmp8u; u16b tmp16u; u32b tmp32u; s32b tmp32s; int major; char name[80]; /* Savefile name */ path_build(savefile, 1024, ANGBAND_DIR_SAVE, "server"); /* The server savefile is a binary file */ file_handle = my_fopen(savefile, "r"); line_counter = 0; start_section_read("mangband_server_save"); start_section_read("version"); major = read_int("major"); major = read_int("minor"); major = read_int("patch"); end_section_read("version"); /* Paranoia */ if (!file_handle) return (-1); /* Clear the checksums */ v_check = 0L; x_check = 0L; /* Operating system info */ sf_xtra = read_uint("xtra"); /* Time of savefile creation */ sf_when = read_uint("timestamp"); /* Number of lives */ sf_lives = read_int("sf_lives"); /* Number of times played */ sf_saves = read_int("sf_saves"); /* Monster Memory */ start_section_read("monster_lore"); tmp16u = read_int("max_r_idx"); /* Incompatible save files */ if (tmp16u > z_info->r_max) { note(format("Too many (%u) monster races!", tmp16u)); return (21); } /* Read the available records */ for (i = 0; i < tmp16u; i++) { monster_race *r_ptr; /* Read the lore */ rd_u_lore(i); /* Access the monster race */ r_ptr = &r_info[i]; } end_section_read("monster_lore"); /* Load the Artifacts */ start_section_read("artifacts"); tmp16u = read_int("max_a_idx"); /* Incompatible save files */ if (tmp16u > z_info->a_max) { note(format("Too many (%u) artifacts!", tmp16u)); return (24); } /* Read the artifact flags */ for (i = 0; i < tmp16u; i++) { tmp8u = read_int("artifact"); a_info[i].cur_num = tmp8u; } end_section_read("artifacts"); /* Read the stores */ start_section_read("stores"); tmp16u = read_int("max_stores"); for (i = 0; i < tmp16u; i++) { if (rd_store(i)) return (22); } end_section_read("stores"); /* Read party info if savefile is new enough */ start_section_read("parties"); tmp16u = read_int("max_parties"); /* Incompatible save files */ if (tmp16u > MAX_PARTIES) { note(format("Too many (%u) parties!", tmp16u)); return (25); } /* Read the available records */ for (i = 0; i < tmp16u; i++) { rd_party(i); } end_section_read("parties"); /* XXX If new enough, read in the saved levels and monsters. */ start_section_read("dungeon_levels"); /* read the number of levels to be loaded */ tmp32u = read_uint("num_levels"); /* load the levels */ for (i = 0; i < tmp32u; i++) rd_dungeon(FALSE, 0); /* load any special static levels */ rd_dungeon_special(); end_section_read("dungeon_levels"); start_section_read("monsters"); /* get the number of monsters to be loaded */ tmp32u = read_int("max_monsters"); if (tmp32u > MAX_M_IDX) { note(format("Too many (%u) monsters!", tmp16u)); return (29); } /* load the monsters */ for (i = 1; i < tmp32u; i++) { rd_monster(&m_list[m_pop()]); } end_section_read("monsters"); /* Read object info */ start_section_read("objects"); tmp16u = read_int("max_objects"); /* Incompatible save files */ if (tmp16u > MAX_O_IDX) { note(format("Too many (%u) objects!", tmp16u)); return (26); } /* Read the available records */ for (i = 1; i < tmp16u; i++) { rd_item(&o_list[i]); } /* Set the maximum object number */ o_max = tmp16u; end_section_read("objects"); /* Read holding info */ /* Reacquire objects */ for (i = 1; i < o_max; ++i) { object_type *o_ptr; monster_type *m_ptr; /* Get the object */ o_ptr = &o_list[i]; /* Ignore dungeon objects */ if (!o_ptr->held_m_idx) continue; /* Verify monster index */ if (o_ptr->held_m_idx > z_info->m_max) { note("Invalid monster index"); return (-1); } /* Get the monster */ m_ptr = &m_list[o_ptr->held_m_idx]; /* Link the object to the pile */ o_ptr->next_o_idx = m_ptr->hold_o_idx; /* Link the monster to the object */ m_ptr->hold_o_idx = i; } /* Read house info */ start_section_read("houses"); tmp16u = read_int("num_houses"); /* Incompatible save files */ if (tmp16u > MAX_HOUSES) { note(format("Too many (%u) houses!", tmp16u)); return (27); } /* Read the available records */ for (i = 0; i < tmp16u; i++) { rd_house(i); } num_houses = tmp16u; end_section_read("houses"); /* Read arenas info */ if (section_exists("arenas")) { start_section_read("arenas"); tmp16u = read_int("num_arenas"); /* Incompatible save files */ if (tmp16u > MAX_ARENAS) { note(format("Too many (%u) arenas!", tmp16u)); return (27); } /* Read the available records */ for (i = 0; i < tmp16u; i++) { rd_arena(i); } num_arenas = tmp16u; end_section_read("arenas"); } /* Read wilderness info */ start_section_read("wilderness"); /* read how many wilderness levels */ tmp32u = read_int("max_wild"); if (tmp32u > MAX_WILD) { note("Too many wilderness levels"); return 28; } for (i = 1; i < tmp32u; i++) { rd_wild(i); } end_section_read("wilderness"); /* Read the player name database */ start_section_read("player_names"); tmp32u = read_int("num_players"); /* Read the available records */ for (i = 0; i < tmp32u; i++) { start_section_read("player"); /* Read the ID */ tmp32s = read_int("id"); /* Read the player name */ read_str("name",name); /* Store the player name */ add_player_name(name, tmp32s); end_section_read("player"); } end_section_read("player_names"); seed_flavor = read_uint("seed_flavor"); seed_town = read_uint("seed_town"); player_id = read_int("player_id"); read_hturn("turn", &turn); /* Hack -- no ghosts */ /*r_info[z_info->r_max - 1].max_num = 0;*/ end_section_read("mangband_server_save"); /* Check for errors */ if (ferror(file_handle)) err = -1; /* Close the file */ my_fclose(file_handle); /* Result */ return (err); }
int main(int argc, char *argv[]) { register int i; int xpos = XPOS; int ypos = YPOS; int font = -1; int shape = 1; char *getenv(); char *home = getenv("HOME"); int clean(), update(); /* make sure we have a valid environment to run in */ ckmgrterm( *argv ); if (home==NULL || *home=='\0') { fprintf(stderr,"%s: Can't find your home directory\n",argv[0]); exit(1); } if ((bounds = fopen(BOUNDS,"r")) == NULL) { fprintf(stderr,"%s: Can't find a bounds file\n",argv[0]); exit(2); } sprintf(line,"%s/%s",home,RC); if ((rc = fopen(line,"r")) == NULL) { fprintf(stderr,"%s: Can't find %s\n",argv[0],line); exit(3); } /* process arguments */ for(i=1;i<argc;i++) { if (Isflag(argv[i],"-s")) shape = 0; else if (Isflag(argv[i],"-x")) xpos = atoi(argv[i]+2); else if (Isflag(argv[i],"-y")) ypos = atoi(argv[i]+2); else if (Isflag(argv[i],"-f")) font = atoi(argv[i]+2); else if (Isflag(argv[i],"-p")) poll = Max(atoi(argv[i]+2),10); else usage(argv[0],argv[i]); } /* setup mgr stuff */ m_setup(M_FLUSH); m_push(P_MENU|P_EVENT|P_FLAGS); m_setmode(M_NOWRAP); m_ttyset(); signal(SIGTERM,clean); signal(SIGINT,clean); signal(SIGALRM,update); menu_load(1,MENU_COUNT,menu); m_selectmenu(1); old_msg_cnt = MSGS(); get_msg(line,old_msg_cnt); if (shape) { m_setmode(M_ACTIVATE); m_size(strlen(line)+2,1); } m_printstr(line); m_setevent(REDRAW,"R\n"); m_setevent(ACTIVATED,"A\n"); m_clearmode(M_ACTIVATE); alarm(poll); while(1) { char buff[80]; m_gets(buff); alarm(0); /* read msgs */ old_msg_cnt = msg_cnt; msg_cnt = MSGS(); if (msg_cnt > 0 && *buff == 'A') { m_push(P_POSITION|P_EVENT|P_FLAGS|P_FONT); if (font != -1) m_font(font); m_sizeall(xpos,ypos,80,24); m_printstr("\freading msgs...\r"); m_ttyreset(); system(MSGSCMD); m_gets(buff); m_ttyset(); m_pop(); } /* wait for window to deactivate */ else if (*buff == 'A') { m_setevent(DEACTIVATED,RESUME); do { m_printstr("\f Your msgs system here "); m_gets(buff); } while(!SCMP(buff,RESUME)); m_clearevent(DEACTIVATED); } old_msg_cnt = msg_cnt; msg_cnt = MSGS(); get_msg(line,msg_cnt); m_printstr(line); m_clearmode(M_ACTIVATE); alarm(poll); } return 0; }