/** * Apply text lighting effects */ static void grid_get_attr(struct grid_data *g, int *a) { /* Save the high-bit, since it's used for attr inversion in GCU */ int a0 = *a & 0x80; /* Remove the high bit so we can add it back again at the end */ *a = (*a & 0x7F); /* Never play with fg colours for treasure */ if (!feat_is_treasure(g->f_idx)) { /* Only apply lighting effects when the attr is white and it's a * floor or wall */ if ((*a == COLOUR_WHITE) && (feat_is_floor(g->f_idx) || feat_is_wall(g->f_idx))) { /* If it's a floor tile then we'll tint based on lighting. */ if (feat_is_torch(g->f_idx)) switch (g->lighting) { case LIGHTING_TORCH: *a = COLOUR_YELLOW; break; case LIGHTING_LIT: *a = COLOUR_L_DARK; break; case LIGHTING_DARK: *a = COLOUR_L_DARK; break; default: break; } /* If it's another kind of tile, only tint when unlit. */ else if (g->lighting == LIGHTING_DARK || g->lighting == LIGHTING_LIT) *a = COLOUR_L_DARK; } else if (feat_is_magma(g->f_idx) || feat_is_quartz(g->f_idx)) { if (!g->in_view) { *a = COLOUR_L_DARK; } } } /* Hybrid or block walls -- for GCU, then for everyone else */ if (a0) { *a = a0 | *a; } else if (use_graphics == GRAPHICS_NONE && feat_is_wall(g->f_idx)) { if (OPT(player, hybrid_walls)) *a = *a + (MAX_COLORS * BG_DARK); else if (OPT(player, solid_walls)) *a = *a + (MAX_COLORS * BG_SAME); } }
/** * True if the square is normal open floor. */ bool square_isfloor(struct chunk *c, int y, int x) { return feat_is_floor(c->squares[y][x].feat); }
/** * Instantiate a player trap */ static int pick_trap(struct chunk *c, int feat, int trap_level) { int i, pick; int *trap_probs = NULL; int trap_prob_max = 0; /* Paranoia */ if (!feat_is_trap_holding(feat)) return -1; /* No traps in town */ if (c->depth == 0) return -1; /* Get trap probabilities */ trap_probs = mem_zalloc(z_info->trap_max * sizeof(int)); for (i = 0; i < z_info->trap_max; i++) { /* Get this trap */ struct trap_kind *kind = &trap_info[i]; trap_probs[i] = trap_prob_max; /* Ensure that this is a valid player trap */ if (!kind->name) continue; if (!kind->rarity) continue; if (!trf_has(kind->flags, TRF_TRAP)) continue; /* Require that trap_level not be too low */ if (kind->min_depth > trap_level) continue; /* Floor? */ if (feat_is_floor(feat) && !trf_has(kind->flags, TRF_FLOOR)) continue; /* Check legality of trapdoors. */ if (trf_has(kind->flags, TRF_DOWN)) { /* No trap doors on quest levels */ if (is_quest(player->depth)) continue; /* No trap doors on the deepest level */ if (player->depth >= z_info->max_depth - 1) continue; /* No trap doors with persistent levels (for now) */ if (OPT(player, birth_levels_persist)) continue; } /* Trap is okay, store the cumulative probability */ trap_probs[i] += (100 / kind->rarity); trap_prob_max = trap_probs[i]; } /* No valid trap */ if (trap_prob_max == 0) { mem_free(trap_probs); return -1; } /* Pick at random. */ pick = randint0(trap_prob_max); for (i = 0; i < z_info->trap_max; i++) { if (pick < trap_probs[i]) { break; } } mem_free(trap_probs); /* Return our chosen trap */ return i < z_info->trap_max ? i : -1; }