Example #1
0
		void environment::spawn_player(point2 location)
		{
			// player props
			auto weapon = std::make_shared<body_component::item_type>();
			weapon->add({ rl::effect::weapon_damage, 0x00, 50 });
			weapon->add({ rl::effect::equipment, static_cast<unsigned int>(rl::equipment_slot::hand_main) });
			weapon->set_name("Copper Sword");
			weapon->set_tag("copper_sword");

			// make player
			auto task = m_factory->produce();
			auto img = task->add_appearance('@', { 1, 1, 1 });
			auto pawn = task->add_location(location);
			auto body = task->add_body(100, 100);
			auto character = task->add_character();

			// setup
			body->set_name("You");
			body->set_tag("player");
			body->join_faction(1);
			body->add(weapon);
			body->equip(weapon);

			character->add_skill("sk_bash");
			character->add_skill("sk_panacea");
			character->add_skill("sk_teleport");
			character->add_skill("sk_fireball");
			character->add_skill("sk_indigo");

			m_terrain.add(task->assemble(persistency::permanent));

			impersonate(pawn);
		}
Example #2
0
// Sends the HMDP request 'List'
// @param sockfd the socket descriptor of the server
// @param token the token used for verification
// @param list the list of files found in the clients hooli directory
void request_list(int sockfd, char *token, csv_record *list) {
    
    char *request;                          // The 'List' message
    char *list_size;                        // The size of the list of files and checksums
    
    int length;                             // The length of the 'List' message
    
    asprintf(&list_size, "%d", get_list_size(list));
    
    add_command(&request, COMMAND_LIST);    //  |-----------------|
    add_key(&request, KEY_TOKEN);           //  |List\n           |
    add_value(&request, token);             //  |-----------------|
    add_key(&request, KEY_LENGTH);          //  |Token:value\n    |
    add_value(&request, list_size);         //  |-----------------|
    delimit_header(&request);               //  |Length:value\n\n |
    add_body(&request, list);               //  |-----------------|
                                            //  |Body:            |
                                            //  |-----------------|
    length = strlen(request);
    
    // Check to see if the message sent successfully
    if (send_all(sockfd, request, &length) == -1) {
        
        syslog(LOG_ERR, "Only sent %d bytes\n", length);
        
    } //end if
    
    free(list_size);
    free(request);
    
    list_size = NULL;
    request = NULL;
    
} //end request_list
Example #3
0
// Sends the HMDP response '302'
// @param connectionfd the socket descriptor of the client
// @param response_list the list of files for the client to upload
void response_302(int connectionfd, csv_record *response_list) {
    
    char *response;                         // The '302' message
    char *list_size;                        // The size of the body of the message
    
    int length;                             // The length of the message
    
    asprintf(&list_size, "%d", get_list_size(response_list));
    
    add_status(&response, STATUS_302);      //  |----------------------|
    add_message(&response, MESSAGE_302);    //  |302 Files requested\n |
    add_key(&response, KEY_LENGTH);         //  |----------------------|
    add_value(&response, list_size);        //  |Length:value\n\n      |
    delimit_header(&response);              //  |----------------------|
    add_body(&response, response_list);     //  |Body:                 |
                                            //  |----------------------|
    length = strlen(response);
    
    // Check to see if the message sent successfully
    if (send_all(connectionfd, response, &length) == -1) {
        
        syslog(LOG_ERR, "Only sent %d bytes\n", length);
        
    } //end if
    
    free(list_size);
    free(response);
    
    list_size = NULL;
    response = NULL;
    
} //end response_302
Example #4
0
		void environment::start()
		{
			end();

			m_time = 0;
			m_running = true;

			m_world.resize(settings::world_width, settings::world_height);
			m_world.generate(m_settings.seed());

			spawn_player(m_world.spawn() * point2(settings::cell_width, settings::cell_height));

			// ui
			tie_map();
			m_ui->deactivate("title");
			m_ui->activate("ingame");

			// make chest
			auto chest = m_factory->produce();
			chest->add_appearance('$', { 1, 1, 1 });
			chest->add_location({ 2, 2 });
			auto body = chest->add_body(250, 150);
			body->set_name("Iron chest");
			chest->add_container();
			m_terrain.add(*chest);

			auto ore = std::make_shared<body_component::item_type>();
			ore->add({ rl::effect::ore_power, 0x00, 10 });
			ore->add({ rl::effect::value, 0x00, 5 });
			ore->add({ rl::effect::weight, 0x00, 1 });
			ore->set_name("Copper ore");
			ore->set_tag("ore_copper");
			auto vein = m_factory->produce();
			vein->add_appearance('0');
			vein->add_location({ 3, 3 });
			vein->add_body();
			auto v = vein->add_resource();
			v->deposit(ore);
			m_terrain.add(*vein);

			auto anvil = m_factory->produce();
			anvil->add_appearance('t');
			anvil->add_location({ 3, 0 });
			anvil->add_body();
			anvil->add_container();
			m_terrain.add(*anvil);
		}
Example #5
0
bool QuadTree::insert(Body* b){
	// Ignore objects which do not belong in this quad tree
	if (!boundary.containsPoint(b->position)){
		return false;
	}

	if (!has_children() && bodies->size() < QT_NODE_CAPACITY){
		// std::cout << "adding " << b << std::endl;
		//node_b.position = b->position;
		bodies->push_back(b);
		return true;
	}

	if( northWest == nullptr ){
		subdivide();
	}

	bool inserted = false;
	for(QuadTree * child : children) {
		if(child->insert(b)) {
			inserted = true;
			break;
		}
	}

	add_body(b);

	while(!bodies->empty()){
		b = bodies->back();
		bodies->pop_back();
		//node_mass+=b.mass;
		add_body(b);

		for(QuadTree * child : children) {
			if(child->insert(b)) {
				inserted = true;
				break;
			}
		}
	}
	
	if(inserted) return true;
	// Otherwise, the point cannot be inserted for some unknown reason (which should never happen)
	return false;
}
Example #6
0
void step_body(struct body **b, int x, int y)
{
    struct body *temp = NULL;
    if (*b) {
        temp = (**b).rest;
        free(*b);
        *b = temp;
        add_body(b, x, y);
    }
}
Example #7
0
void add_body(struct body **b, int x, int y)
{
    if (!(*b)) {
        *b = make_body(x, y);
        (**b).rest = NULL;
    }
    else {
        add_body(&((*b)->rest), x, y);
    }
}
Example #8
0
bool mime_builder::save_as(acl::ofstream& fp)
{
	acl::string buf;
	if (attachs_.empty())
	{
		//header_.set_type(MIME_CTYPE_TEXT, body_html_ ?
		//	MIME_STYPE_HTML : MIME_STYPE_PLAIN);
		header_.set_type("text", body_html_ ? "html" : "plain");
		header_.add_header("Content-Transfer-Encoding", "base64");
	}
	else
	{
		//header_.set_type(MIME_CTYPE_MULTIPART,
		//	MIME_STYPE_MIXED);
		header_.set_type("multipart", "mixed");
		delimeter_.format("------=_Part_%d_%ld.%ld", getpid(),
			acl_pthread_self(), time(NULL));
		header_.set_boundary(delimeter_.c_str());
	}
	header_.build_head(buf, false);
	if (fp.write(buf) == -1)
	{
		logger_error("write head to file %s error %s",
			fp.file_path(), acl::last_serror());
		return false;
	}

	if (!delimeter_.empty())
	{
		if (add_boundary(fp) == false)
			return false;
	}
	if (add_body(fp) == false)
		return false;
	if (delimeter_.empty())
		return true;

	std::vector<char*>::const_iterator cit = attachs_.begin();
	for (; cit != attachs_.end(); ++cit)
	{
		if (add_boundary(fp) == false)
			return false;
		if (add_attach(fp, *cit) == false)
			return false;
	}

	// 添加最后一个分隔符
	return add_boundary(fp, true);
}
Example #9
0
int main()
{
    init();
    set_window_title("Team27, inc - Innocent Snake");
    srand((unsigned)time(NULL));

    //kondisi map awal
    int map[SIZE_Y][SIZE_X] = {-1,-1,-1,-1,-1,-1,-1, 0, 0, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0, 0,-1,-1,-1,-1, 0, 0, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,
                               -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1,
                               -1, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1,
                               -1, 0, 0, 0,-1,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1,
                               -1, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1,
                               -1, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1,
                               -1, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1,
                               -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1,
                               -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1,
                               -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1,
                               0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                               0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                               0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                               0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1,-1,-1, 0, 0, 0, 0,
                               -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0,-1,
                               -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0,-1,
                               -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0,-1,
                               -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1,-1,-1,-1,-1, 0, 0, 0,-1,-1,-1,-1,-1,-1, 0, 0,-1,
                               -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0,-1,
                               -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0,-1,
                               -1, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0,-1,
                               -1, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0,-1,
                               -1, 0, 0, 0, 0, 0, 0,-1,-1,-1,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1,
                               -1, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1,
                               -1, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1,
                               -1, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1,
                               -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1,
                               -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1,
                               -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1,
                               -1,-1,-1,-1,-1,-1,-1, 0, 0, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0, 0,-1,-1,-1,-1, 0, 0, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1
                              };

    int counter = 0;
    int posX, posY;
    int loaded = 0;
    int x_his, y_his;
    int i, j, moveX = 1, moveY = 0;

    BITMAP *buffer      = create_bitmap(SCREEN_W, SCREEN_H);
    BITMAP *path        = create_bitmap(OBJECT_SIZE, OBJECT_SIZE);
    BITMAP *wall        = load_bitmap("wall.bmp", NULL);
    BITMAP *head        = load_bitmap("head.bmp", NULL);
    BITMAP *snake_body  = load_bitmap("body.bmp", NULL);
    BITMAP *eat         = create_bitmap(OBJECT_SIZE, OBJECT_SIZE);
    BITMAP *bg_map      = create_bitmap(SCREEN_W, SCREEN_H);

    SNAKE  *snake       = NULL;
    SNAKE  *pointer     = NULL;

    clear_to_color(path, makecol(255, 255, 255)); //jalan berwarna putih
    clear_to_color(eat,  makecol(255, 255, 255)); //makanan backgroundnya putih
    circlefill(eat, OBJECT_SIZE/2, OBJECT_SIZE/2, OBJECT_SIZE/2 - 4, makecol(255, 0, 0)); //makanan berwarna merah

    //membuat map snake di bitmap
    for(i=0; i<SIZE_Y; i++)
    {
        for(j=0; j<SIZE_X; j++)
        {
            switch(map[i][j])
            {
            case PATH :
                draw_sprite(bg_map, path, j*OBJECT_SIZE, i*OBJECT_SIZE);
                break;
            case WALL :
                draw_sprite(bg_map, wall, j*OBJECT_SIZE, i*OBJECT_SIZE);
                break;
            }
        }
    }

    //inisialisasi awal posisi snake
    add_body(&snake, 3, 1, map);
    map[snake->y][snake->x] = HEAD;
    add_body(&snake, 2, 1, map);
    add_body(&snake, 1, 1, map);

    set_keyboard_rate(10, 10);

    while (!key[KEY_ESC])
    {
        //deteksi apakah sudah ada makanan di map
        if(loaded==0) {
            do {
                posX = rand()%(SIZE_X-1) + 1;
                posY = rand()%(SIZE_Y-1) + 1;
            } while(map[posY][posX] != PATH);
            map[posY][posX] = EAT;
            loaded = 1;
        }

        //deteksi keyboard yang ditekan dan mengubah arah gerak snake
        if(counter==5) {
            if(key[KEY_UP] && moveY==0)
            {
                moveX=0;
                moveY=-1;
                clear_keybuf();
            }
            else if(key[KEY_DOWN] && moveY==0)
            {
                moveX=0;
                moveY=1;
                clear_keybuf();
            }
            else if(key[KEY_LEFT] && moveX==0)
            {
                moveX=-1;
                moveY=0;
                clear_keybuf();
            }
            else if(key[KEY_RIGHT] && moveX==0)
            {
                moveX=1;
                moveY=0;
                clear_keybuf();
            }
            x_his = snake->x;
            y_his = snake->y;

            //kalau menabrak sesuatu maka keluar
            if(!move_snake(snake, moveX, moveY, map)) break;

            //jika bertemu makanan maka tambah badan
            if(map[posY][posX] != EAT)
            {
                add_body(&snake, x_his, y_his, map);
                loaded = 0;
            }
            counter=0;
        }
        counter++;

        //tempelkan semua obyek ke buffer
        draw_sprite(buffer, bg_map, 0, 0);
        draw_sprite(buffer, eat, posX*OBJECT_SIZE, posY*OBJECT_SIZE);
        for(pointer = snake; pointer != NULL; pointer = pointer->next)
        {
            switch(map[pointer->y][pointer->x])
            {
            case BODY :
                draw_sprite(buffer, snake_body, pointer->x*OBJECT_SIZE, pointer->y*OBJECT_SIZE);
                break;
            case HEAD :
                draw_sprite(buffer, head, pointer->x*OBJECT_SIZE, pointer->y*OBJECT_SIZE);
                break;
            }
        }

        //tampilkan buffer ke screen
        draw_sprite(screen, buffer, 0, 0);
        clear_bitmap(buffer);
        rest(10);
    }

    //destroy semua bitmap
    destroy_bitmap(head);
    destroy_bitmap(buffer);
    destroy_bitmap(path);
    destroy_bitmap(wall);
    destroy_bitmap(snake_body);
    destroy_bitmap(eat);

    deinit();
    return 0;
}
Example #10
0
int main(int argc, char *argv[])
{
    if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) != 0) {
        fprintf(stderr, "Unable to initialize SDL: %s\n", SDL_GetError());
        SDL_Quit();
        return -1;
    }
    SDL_Window *win = SDL_CreateWindow("snake", 50, 50, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_OPENGL);
    if (!win) {
        fprintf(stderr, "Unable to initialize window: %s\n", SDL_GetError());
        SDL_Quit();
        return -1;
    }
    SDL_GLContext gl_con = SDL_GL_CreateContext(win);
    struct square *head = make_square(0, 0, TILE, brown);
    struct square *fruit = make_square(0, 0, TILE, red);
    if (!head || !fruit) {
        fprintf(stderr, "Unable to allocate memory for square struct.");
        if (head) {
            free(head);
        }
    }
    struct body *snake_body = NULL;
    reposition_fruit(fruit);
    enum direction snake_d = LEFT;
    int previousx;
    int previousy;
    if (gl_con == NULL) {
        fprintf(stderr, "Unable to initialize gl context: %s\n", SDL_GetError());
        SDL_DestroyWindow(win);
        SDL_Quit();
        return -1;
    }
    SDL_Event event;
    while (1) {
        while (SDL_PollEvent(&event)) {
            if (event.type == SDL_QUIT) {
                goto end;
            }
            else if (event.type == SDL_KEYDOWN) {
                switch (event.key.keysym.sym) {
                case SDLK_ESCAPE:
                    goto end;
                    break;
                case SDLK_UP:
                    snake_d = UP;
                    break;
                case SDLK_DOWN:
                    snake_d = DOWN;
                    break;
                case SDLK_LEFT:
                    snake_d = LEFT;
                    break;
                case SDLK_RIGHT:
                    snake_d = RIGHT;
                    break;
                }
            }
        }
        previousx = head->x;
        previousy = head->y;
        switch (snake_d) {
        case UP:
            head->y += TILE;
            break;
        case DOWN:
            head->y -= TILE;
            break;
        case LEFT:
            head->x -= TILE;
            break;
        case RIGHT:
            head->x += TILE;
            break;
        }
        if (is_intersect_body(head, snake_body)) {
            goto end;
        }
        step_body(&snake_body, previousx, previousy);
        if (head->y > SCREEN_HEIGHT - TILE || head->y < -1 * SCREEN_HEIGHT || head->x > SCREEN_WIDTH - TILE || head->x < -1 * SCREEN_WIDTH) {
            goto end;
        }
        else if (is_intersect(head, fruit)) {
            add_body(&snake_body, previousx, previousy);
            do {
                reposition_fruit(fruit);
            } while (is_intersect(head, fruit) || is_intersect_body(fruit, snake_body));
        }
	cap_game_fps(display, win, head, snake_body, fruit);
    }
end:
    free(head);
    clean_body(snake_body);
    free(fruit);
    SDL_GL_DeleteContext(gl_con);
    SDL_Quit();
    return 0;
}
Example #11
0
/**
 * @returns FUZZ_VALID if the result is a valid HTTP message, FUZZ_INVALID
 * if the result is an invalid HTTP message, FUZZ_END if the HTTP message
 * sequence is over.
 *
 * @move is how many gen_vector's elements should be changed each time a new
 * HTTP message is generated, should be >= 1.
 */
int
fuzz_gen(TfwFuzzContext *ctx, char *str, char *end, field_t start,
	 int move, int type)
{
	int i, n, ret = FUZZ_VALID;
	unsigned int v = 0;

	ctx->hdr_flags = 0;
	memset(ctx->fld_flags, 0, sizeof(ctx->fld_flags));

	if (str == NULL)
		return -EINVAL;

	if (type == FUZZ_REQ) {
		v |= add_field(ctx, type, &str, end, METHOD);
		addch(&str, end, ' ');

		v |= add_field(ctx, type, &str, end, URI_PATH_START);
		addch(&str, end, '/');
		v |= add_field(ctx, type, &str, end, HOST);
		for (i = 0; i < ctx->i[URI_PATH_DEPTH] + 1; ++i) {
			addch(&str, end, '/');
			v |= add_field(ctx, type, &str, end, URI_FILE);
		}
		addch(&str, end, ' ');
	}

	add_string(&str, end, "HTTP/");
	v |= add_field(ctx, type, &str, end, HTTP_VER);

	if (type == FUZZ_RESP) {
		addch(&str, end, ' ');
		v |= add_field(ctx, type, &str, end, SPACES);
		v |= add_field(ctx, type, &str, end, RESP_CODE);
	}

	add_string(&str, end, "\r\n");

	if (type == FUZZ_REQ) {
		v |= add_header(ctx, type, &str, end, HOST);
		v |= add_duplicates(ctx, type, &str, end, HOST);

		v |= add_header(ctx, type, &str, end, ACCEPT);
		v |= add_duplicates(ctx, type, &str, end, ACCEPT);

		v |= add_header(ctx, type, &str, end, ACCEPT_LANGUAGE);
		v |= add_duplicates(ctx, type, &str, end, ACCEPT_LANGUAGE);

		v |= add_header(ctx, type, &str, end, ACCEPT_ENCODING);
		v |= add_duplicates(ctx, type, &str, end, ACCEPT_ENCODING);

		v |= add_header(ctx, type, &str, end, COOKIE);
		v |= add_duplicates(ctx, type, &str, end, COOKIE);

		v |= add_header(ctx, type, &str, end, X_FORWARDED_FOR);
		v |= add_duplicates(ctx, type, &str, end, X_FORWARDED_FOR);

		v |= add_header(ctx, type, &str, end, USER_AGENT);
		v |= add_duplicates(ctx, type, &str, end, USER_AGENT);
	}
	else if (type == FUZZ_RESP) {
		v |= add_header(ctx, type, &str, end, ACCEPT_RANGES);
		v |= add_duplicates(ctx, type, &str, end, ACCEPT_RANGES);

		v |= add_header(ctx, type, &str, end, SET_COOKIE);
		v |= add_duplicates(ctx, type, &str, end, SET_COOKIE);

		v |= add_header(ctx, type, &str, end, ETAG);
		v |= add_duplicates(ctx, type, &str, end, ETAG);

		v |= add_header(ctx, type, &str, end, SERVER);
		v |= add_duplicates(ctx, type, &str, end, SERVER);

		v |= add_header(ctx, type, &str, end, EXPIRES);
		v |= add_duplicates(ctx, type, &str, end, EXPIRES);
	}

	n = ctx->i[TRANSFER_ENCODING_NUM];
	v |= __add_header_rand(ctx, type, &str, end, TRANSFER_ENCODING, n);
	v |= __add_duplicates(ctx, type, &str, end, TRANSFER_ENCODING, n);

	v |= add_header(ctx, type, &str, end, CONNECTION);
	v |= add_duplicates(ctx, type, &str, end, CONNECTION);

	v |= add_header(ctx, type, &str, end, CONTENT_TYPE);
	v |= add_duplicates(ctx, type, &str, end, CONTENT_TYPE);

	v |= add_header(ctx, type, &str, end, CONTENT_LENGTH);
	v |= add_duplicates(ctx, type, &str, end, CONTENT_LENGTH);

	v |= add_header(ctx, type, &str, end, CACHE_CONTROL);
	v |= add_duplicates(ctx, type, &str, end, CACHE_CONTROL);

	add_string(&str, end, "\r\n");

	/*
	 * That's not too bad to add body to invalid message
	 * supposed to have empty body.
	 */
	if (!(v & FUZZ_MSG_F_EMPTY_BODY) || (v & FUZZ_MSG_F_INVAL))
		v |= add_body(ctx, &str, end, type);

	if (str < end) {
		*str = '\0';
	} else {
		v |= FUZZ_INVALID;
		*(end - 1) = '\0';
	}

	if (!(v & FUZZ_INVALID) && !fuzz_hdrs_compatible(ctx, type, v))
		v |= FUZZ_INVALID;

	for (i = 0; i < move; i++) {
		ret = gen_vector_move(ctx, start);
		if (ret == FUZZ_END)
			break;
	}

	if (v & FUZZ_INVALID)
		return FUZZ_INVALID;
	return ret;
}