void classboss::exec_daisiebot() { unsigned short int shot_type = IA_STATE_SHOT_RAINBOW; std::cout << "classboss::exec_daisiebot" << std::endl; if (IA_state == IA_STATE_WAIT_TIME) { IA_state = IA_STAND; } // stand -> shot rainbow -> cross screen -> use flowers if (IA_state == IA_STAND) { IA_state = IA_STATE_CROSS_SCREEN; state.animation_type = ANIM_TYPE_WALK; return; } if (IA_state == IA_STATE_SHOT_RAINBOW) { state.animation_type = ANIM_TYPE_STAND; /// @TODO (use attacks/weapons system) shot_rainbow(); IA_state = IA_STATE_CROSS_SCREEN; initial_position.x = position.x; initial_position.y = position.y; IA_state = IA_STATE_WAIT_TIME; state.move_timer = timer.getTimer()+300; } if (IA_state == IA_STATE_SHOT_FLOWER) { state.animation_type = ANIM_TYPE_STAND; /// @TODO (use attacks/weapons system) shot_flower(temp_npc); /// temp_npc->projectile.timer = getTimer()+60; initial_position.x = position.x; initial_position.y = position.y; IA_state = IA_STATE_WAIT_TIME; state.move_timer = timer.getTimer()+3000; } // TODO: move to generic npc, once more will use it if (IA_state == IA_STATE_CROSS_SCREEN) { // check if must stop/invert state.move_timer = timer.getTimer() + 10; if (state.direction == ANIM_DIRECTION_LEFT) { int map_tile_x = (position.x-move_speed)/16; int map_tile_y = position.y/16; if (distance.width < 18*TILESIZE && (position.x-move_speed > 0 && (map->getMapPointLock(st_position(map_tile_x, map_tile_y)) == 0 || map->getMapPointLock(st_position(map_tile_x, map_tile_y)) == TERRAIN_WATER))) { position.x-= move_speed; distance.width += move_speed; } else { distance.width = 0; invert_direction(); if (shot_type == IA_STATE_SHOT_RAINBOW) { shot_type = IA_STATE_SHOT_FLOWER; } else { shot_type = IA_STATE_SHOT_RAINBOW; } IA_state = shot_type; } } else { // ANIM_RIGHT int map_tile_x = (position.x+frameSize.width+move_speed)/16; int map_tile_y = position.y/16; //map->getMapPointLock(st_position(map_tile_x, map_tile_y)) if (distance.width < 18*TILESIZE && (map->getMapPointLock(st_position(map_tile_x, map_tile_y)) == 0 || map->getMapPointLock(st_position(map_tile_x, map_tile_y)) == TERRAIN_WATER)) { position.x+= move_speed; distance.width += move_speed; } else { distance.width = 0; invert_direction(); IA_state = shot_type; } } } }
void Robot::brake(unsigned long duration){ run(_left.speed, _right.speed, invert_direction(_left.state), invert_direction(_right.state)); delay(duration); release(); }