static void attack(int rel_dir, struct item *itemp) { if (!(itemp->flags & ON_SIDE)) { face_and_move_direction(rel_dir, 0); command[comlen++] = 'o'; command[comlen++] = 'o'; duck(FRONT); command[comlen++] = ' '; } else if (itemp->distance > 1) { face_and_move_direction(rel_dir, 2); duck(FRONT); } else { face_and_move_direction(rel_dir, 1); if (itemp->flags & ON_LEFT) rel_dir = LEFT; else rel_dir = RIGHT; (void) face_and_move_direction(rel_dir, 0); command[comlen++] = 'f'; command[comlen++] = 'f'; duck(FRONT); command[comlen++] = ' '; } }
static int go_for_ammo(char mine) { int i, rel_dir, dist; rel_dir = -1; dist = WIDTH; for (i = 0; i < NUMDIRECTIONS; i++) { if (flbr[i].what == mine && flbr[i].distance < dist) { rel_dir = i; dist = flbr[i].distance; } } if (rel_dir == -1) return FALSE; if (!(flbr[rel_dir].flags & ON_SIDE) || flbr[rel_dir].distance > 1) { if (dist > 4) dist = 4; face_and_move_direction(rel_dir, dist); } else return FALSE; /* until it's done right */ return TRUE; }
static void wander(void) { int i, j, rel_dir, dir_mask, dir_count; for (i = 0; i < NUMDIRECTIONS; i++) if (!(flbr[i].flags & BEEN) || flbr[i].distance <= 1) break; if (i == NUMDIRECTIONS) memset(been_there, 0, sizeof been_there); dir_mask = dir_count = 0; for (i = 0; i < NUMDIRECTIONS; i++) { j = (RIGHT + i) % NUMDIRECTIONS; if (flbr[j].distance <= 1 || flbr[j].flags & DEADEND) continue; if (!(flbr[j].flags & BEEN_SAME)) { dir_mask = 1 << j; dir_count = 1; break; } if (j == FRONT && num_turns > 4 + (arc4random_uniform( ((flbr[FRONT].flags & BEEN) ? 7 : HEIGHT)))) continue; dir_mask |= 1 << j; dir_count = 1; break; } if (dir_count == 0) { duck(arc4random_uniform(NUMDIRECTIONS)); num_turns = 0; return; } else { rel_dir = ffs(dir_mask) - 1; } if (rel_dir == FRONT) num_turns++; else num_turns = 0; face_and_move_direction(rel_dir, 1); }
/** * Allows the player to wander in the waze. * [PSR] */ STATIC void wander() { int i, j, rel_dir, dir_mask, dir_count; for (i = 0; i < NUMDIRECTIONS; i++) { if (!(flbr[i].flags & BEEN) || flbr[i].distance <= 1) { break; } } if (i == NUMDIRECTIONS) { memset(been_there, 0, sizeof been_there); } dir_mask = dir_count = 0; for (i = 0; i < NUMDIRECTIONS; i++) { j = (RIGHT + i) % NUMDIRECTIONS; if (flbr[j].distance <= 1 || flbr[j].flags & DEADEND) { continue; } if (!(flbr[j].flags & BEEN_SAME)) { dir_mask = 1 << j; dir_count = 1; break; } if (j == FRONT && num_turns > 4 + (random() % ((flbr[FRONT].flags & BEEN) ? 7 : HEIGHT))) { continue; } dir_mask |= 1 << j; # ifdef notdef dir_count++; # else dir_count = 1; break; # endif } if (dir_count == 0) { duck(random() % NUMDIRECTIONS); num_turns = 0; return; } else if (dir_count == 1) rel_dir = ffs(dir_mask) - 1; else { rel_dir = ffs(dir_mask) - 1; dir_mask &= ~(1 << rel_dir); while (dir_mask != 0) { i = ffs(dir_mask) - 1; if (random() % 5 == 0) { rel_dir = i; } dir_mask &= ~(1 << i); } } if (rel_dir == FRONT) { num_turns++; } else { num_turns = 0; } # ifdef DEBUG fprintf(debug, " w(%c)", RELCHARS[rel_dir]); # endif face_and_move_direction(rel_dir, 1); }