uint32_t io_teleport_pc(dungeon_t *d) { /* Just for fun. */ pair_t dest; do { dest[dim_x] = rand_range(1, DUNGEON_X - 2); dest[dim_y] = rand_range(1, DUNGEON_Y - 2); } while (charpair(dest)); d->charmap[character_get_y(d->pc)][character_get_x(d->pc)] = NULL; d->charmap[dest[dim_y]][dest[dim_x]] = d->pc; character_set_y(d->pc, dest[dim_y]); character_set_x(d->pc, dest[dim_x]); if (mappair(dest) < ter_floor) { mappair(dest) = ter_floor; } pc_observe_terrain(d->pc, d); dijkstra(d); dijkstra_tunnel(d); return 0; }
void config_pc(dungeon_t *d) { /* This should be in the PC constructor, now. */ pc *the_pc; //One-Punch mode dice: pc_dice(0xFFFFFFFE, 1, 1) static dice pc_dice(0, 1, 4); the_pc = new pc; d->pc = (character *) the_pc; the_pc->symbol = '@'; place_pc(d); the_pc->speed = PC_SPEED; the_pc->hp = PC_HP; the_pc->next_turn = 0; the_pc->alive = 1; the_pc->sequence_number = 0; the_pc->color.push_back(COLOR_WHITE); the_pc->damage = &pc_dice; the_pc->name = "Isabella Garcia-Shapiro"; d->charmap[the_pc->position[dim_y]] [the_pc->position[dim_x]] = (character *) d->pc; dijkstra(d); dijkstra_tunnel(d); init_inventory(d); }
void config_pc(dungeon_t *d) { d->pc.symbol = '@'; d->pc.color = COLOR_WHITE; place_pc(d); d->pc.damage = new_dice(1, 2, 3); d->pc.hp = 500; d->pc.speed = PC_SPEED; d->pc.next_turn = 0; d->pc.alive = 1; d->pc.sequence_number = 0; d->pc.pc = malloc(sizeof (*d->pc.pc)); strncpy(d->pc.pc->name, "Isabella Garcia-Shapiro", sizeof (d->pc.pc->name)); strncpy(d->pc.pc->catch_phrase, "Whatcha doin'?", sizeof (d->pc.pc->name)); d->pc.npc = NULL; d->character[d->pc.position[dim_y]][d->pc.position[dim_x]] = &d->pc; io_calculate_offset(d); dijkstra(d); dijkstra_tunnel(d); }
void npc_next_pos_line_of_sight_tunnel(dungeon *d, character *c, pair_t next) { pair_t dir; dir[dim_y] = d->PC->position[dim_y] - c->position[dim_y]; dir[dim_x] = d->PC->position[dim_x] - c->position[dim_x]; if (dir[dim_y]) { dir[dim_y] /= abs(dir[dim_y]); } if (dir[dim_x]) { dir[dim_x] /= abs(dir[dim_x]); } dir[dim_x] += next[dim_x]; dir[dim_y] += next[dim_y]; if (hardnesspair(dir) <= 60) { if (hardnesspair(dir)) { hardnesspair(dir) = 0; mappair(dir) = ter_floor_hall; /* Update distance maps because map has changed. */ dijkstra(d); dijkstra_tunnel(d); } next[dim_x] = dir[dim_x]; next[dim_y] = dir[dim_y]; } else { hardnesspair(dir) -= 60; } }
void npc_next_pos_rand_tunnel(dungeon *d, character *c, pair_t next) { pair_t n; union { uint32_t i; uint8_t a[4]; } r; do { n[dim_y] = next[dim_y]; n[dim_x] = next[dim_x]; r.i = rand(); if (r.a[0] > 85 /* 255 / 3 */) { if (r.a[0] & 1) { n[dim_y]--; } else { n[dim_y]++; } } if (r.a[1] > 85 /* 255 / 3 */) { if (r.a[1] & 1) { n[dim_x]--; } else { n[dim_x]++; } } } while (mappair(n) == ter_wall_immutable); if (hardnesspair(n) <= 85) { if (hardnesspair(n)) { hardnesspair(n) = 0; mappair(n) = ter_floor_hall; /* Update distance maps because map has changed. */ dijkstra(d); dijkstra_tunnel(d); } next[dim_x] = n[dim_x]; next[dim_y] = n[dim_y]; } else { hardnesspair(n) -= 85; } }
void config_pc(dungeon_t *d) { /* This should be in the PC constructor, now. */ pc *the_pc; the_pc = new pc; d->pc = (character *) the_pc; the_pc->symbol = '@'; place_pc(d); the_pc->speed = PC_SPEED; the_pc->next_turn = 0; the_pc->alive = 1; the_pc->sequence_number = 0; d->charmap[the_pc->position[dim_y]] [the_pc->position[dim_x]] = (character *) d->pc; dijkstra(d); dijkstra_tunnel(d); }
void npc_next_pos_gradient(dungeon *d, npc *c, pair_t next) { /* Handles both tunneling and non-tunneling versions */ pair_t min_next; uint16_t min_cost; if (c->characteristics & NPC_TUNNEL) { min_cost = (d->pc_tunnel[next[dim_y] - 1][next[dim_x]] + (d->hardness[next[dim_y] - 1][next[dim_x]] / 60)); min_next[dim_x] = next[dim_x]; min_next[dim_y] = next[dim_y] - 1; if ((d->pc_tunnel[next[dim_y] + 1][next[dim_x] ] + (d->hardness[next[dim_y] + 1][next[dim_x]] / 60)) < min_cost) { min_cost = (d->pc_tunnel[next[dim_y] + 1][next[dim_x]] + (d->hardness[next[dim_y] + 1][next[dim_x]] / 60)); min_next[dim_x] = next[dim_x]; min_next[dim_y] = next[dim_y] + 1; } if ((d->pc_tunnel[next[dim_y] ][next[dim_x] + 1] + (d->hardness[next[dim_y] ][next[dim_x] + 1] / 60)) < min_cost) { min_cost = (d->pc_tunnel[next[dim_y]][next[dim_x] + 1] + (d->hardness[next[dim_y]][next[dim_x] + 1] / 60)); min_next[dim_x] = next[dim_x] + 1; min_next[dim_y] = next[dim_y]; } if ((d->pc_tunnel[next[dim_y] ][next[dim_x] - 1] + (d->hardness[next[dim_y] ][next[dim_x] - 1] / 60)) < min_cost) { min_cost = (d->pc_tunnel[next[dim_y]][next[dim_x] - 1] + (d->hardness[next[dim_y]][next[dim_x] - 1] / 60)); min_next[dim_x] = next[dim_x] - 1; min_next[dim_y] = next[dim_y]; } if ((d->pc_tunnel[next[dim_y] - 1][next[dim_x] + 1] + (d->hardness[next[dim_y] - 1][next[dim_x] + 1] / 60)) < min_cost) { min_cost = (d->pc_tunnel[next[dim_y] - 1][next[dim_x] + 1] + (d->hardness[next[dim_y] - 1][next[dim_x] + 1] / 60)); min_next[dim_x] = next[dim_x] + 1; min_next[dim_y] = next[dim_y] - 1; } if ((d->pc_tunnel[next[dim_y] + 1][next[dim_x] + 1] + (d->hardness[next[dim_y] + 1][next[dim_x] + 1] / 60)) < min_cost) { min_cost = (d->pc_tunnel[next[dim_y] + 1][next[dim_x] + 1] + (d->hardness[next[dim_y] + 1][next[dim_x] + 1] / 60)); min_next[dim_x] = next[dim_x] + 1; min_next[dim_y] = next[dim_y] + 1; } if ((d->pc_tunnel[next[dim_y] - 1][next[dim_x] - 1] + (d->hardness[next[dim_y] - 1][next[dim_x] - 1] / 60)) < min_cost) { min_cost = (d->pc_tunnel[next[dim_y] - 1][next[dim_x] - 1] + (d->hardness[next[dim_y] - 1][next[dim_x] - 1] / 60)); min_next[dim_x] = next[dim_x] - 1; min_next[dim_y] = next[dim_y] - 1; } if ((d->pc_tunnel[next[dim_y] + 1][next[dim_x] - 1] + (d->hardness[next[dim_y] + 1][next[dim_x] - 1] / 60)) < min_cost) { min_cost = (d->pc_tunnel[next[dim_y] + 1][next[dim_x] - 1] + (d->hardness[next[dim_y] + 1][next[dim_x] - 1] / 60)); min_next[dim_x] = next[dim_x] - 1; min_next[dim_y] = next[dim_y] + 1; } if (hardnesspair(min_next) <= 60) { if (hardnesspair(min_next)) { hardnesspair(min_next) = 0; mappair(min_next) = ter_floor_hall; /* Update distance maps because map has changed. */ dijkstra(d); dijkstra_tunnel(d); } next[dim_x] = min_next[dim_x]; next[dim_y] = min_next[dim_y]; } else { hardnesspair(min_next) -= 60; } } else { /* Make monsters prefer cardinal directions */ if (d->pc_distance[next[dim_y] - 1][next[dim_x] ] < d->pc_distance[next[dim_y]][next[dim_x]]) { next[dim_y]--; return; } if (d->pc_distance[next[dim_y] + 1][next[dim_x] ] < d->pc_distance[next[dim_y]][next[dim_x]]) { next[dim_y]++; return; } if (d->pc_distance[next[dim_y] ][next[dim_x] + 1] < d->pc_distance[next[dim_y]][next[dim_x]]) { next[dim_x]++; return; } if (d->pc_distance[next[dim_y] ][next[dim_x] - 1] < d->pc_distance[next[dim_y]][next[dim_x]]) { next[dim_x]--; return; } if (d->pc_distance[next[dim_y] - 1][next[dim_x] + 1] < d->pc_distance[next[dim_y]][next[dim_x]]) { next[dim_y]--; next[dim_x]++; return; } if (d->pc_distance[next[dim_y] + 1][next[dim_x] + 1] < d->pc_distance[next[dim_y]][next[dim_x]]) { next[dim_y]++; next[dim_x]++; return; } if (d->pc_distance[next[dim_y] - 1][next[dim_x] - 1] < d->pc_distance[next[dim_y]][next[dim_x]]) { next[dim_y]--; next[dim_x]--; return; } if (d->pc_distance[next[dim_y] + 1][next[dim_x] - 1] < d->pc_distance[next[dim_y]][next[dim_x]]) { next[dim_y]++; next[dim_x]--; return; } } }
uint32_t move_pc(dungeon_t *d, uint32_t dir) { pair_t next; uint32_t was_stairs = 0; next[dim_y] = character_get_y(d->pc); next[dim_x] = character_get_x(d->pc); switch (dir) { case 1: case 2: case 3: next[dim_y]++; break; case 4: case 5: case 6: break; case 7: case 8: case 9: next[dim_y]--; break; } switch (dir) { case 1: case 4: case 7: next[dim_x]--; break; case 2: case 5: case 8: break; case 3: case 6: case 9: next[dim_x]++; break; case '<': if (mappair(character_get_pos(d->pc)) == ter_stairs_up) { was_stairs = 1; new_dungeon_level(d, '<'); } break; case '>': if (mappair(character_get_pos(d->pc)) == ter_stairs_down) { was_stairs = 1; new_dungeon_level(d, '>'); } break; } if (was_stairs) { return 0; } if ((dir != '>') && (dir != '<') && (mappair(next) >= ter_floor)) { move_character(d, d->pc, next); dijkstra(d); dijkstra_tunnel(d); return 0; } return 1; }