summaryrefslogblamecommitdiff
path: root/src/char_sql/int_guild.c
blob: 7b363a1e11e5157cfc035e33bbe9a662a67d94f2 (plain) (tree)



















                               

                                           


                          








                                                                            

                      
                                                 
 































































































































































































































































































































































                                                                                                                                                                                                       


                      
                                                       
 




























































































































































































































                                                                                                                                                                                                        


                           
                                                     
 




















































                                                                                                                                                                                                                                                      
 
 
                             
                                                                      
 


























































                                                                                                                                  


                     
                         
 






















                                                 

 
                       
                           
 
















































                                                                           

 
                        
                                          
 


















                                                                       


                          
                                       
 








                                        
                                  




                                             

 
                             
 

                                                     
 
             

 
                                       



                                              
 
                                 
                                    
 


                             
                           


                                   
                         













                                                  
                                  

                                              
                                                 
                                                                                         
 
                                              














                                             
                                                 








                                             


                                                                     
                         
 
                        
                                                                 
 












                                                                     
 
 
                                 
                                             
 





                                                        
 
 
                                 
                                              
 










                                                                 

 
                        

                                                                  
 






                                
 
 
                      

                                                                            
 











                                                                          

 
                                         
                                                          
 









                                               

 
               
                                               
 






                                                

 
                     
                                                                          
 







                                       

 
                                    

                                                                           
 







                                        
 
 
                                       

                                                                             
 









                                        
 
 
                                    
                                                                        
 






                                 
 
 
                               


                                                                        
 










                                        

 
                              
                                                   
 








                                                         

 
                              
                                        
 






                                           
 
 
                                       
                                        
 







                                                            

 
                                                                                 
 






                               

 
                                                                                 
 






                               

 






















































                                                                            

 
                                                                     
                            
 
                        

                                                                
 
























                                                                  
                        






















                                                                       
 
 
                              
                                                
 











                                                 
 
 
                      
                                                                             
 



























                                                                             
 
 
                           

                                                                              
 















                                                             
                                                                             






                                                            
                                                                    
















                                                                         
                                                                                          

                       
                                                                            



















                                                                                             
 
 
                     


                                                                          
 































                                                       
                      




                                                              


             
                                                 
 


















































































                                                                             

 
                                 

                                                                              
 
                                                                
 
 
                                       

                                                                          
 

































                                                                         

 
                                          


                                                                            
 






















                                                                              
                                        






                                                              
                                                    










                                                                             

 
                                 

                                                             
 













                                                                               
 
 
                                    

                                                                  
 




















                                                                               
 
 
                        

                                                                          
 


























                                                                        
                                               















                                                                         
 
 
                              

                                                                    
 









                                                      
 
 
                                       

                                                                      
 










                                               

 
                                                                                 
 

















































































































                                                                                  

 
                                                                                             
 



































































































                                                                                  

 
                              
                                                                              
 

                                                             

 




                                                                                                               
                                      
 





















































































                                                                              

 
                                   
 
                                               

 
                                                         
                                                                 
 
                                                                        
                                                             
 
//
// original code from athena
// SQL conversion by hack
//

#include "char.h"
#include "strlib.h"
#include "int_storage.h"
#include "inter.h"
#include "int_guild.h"
#include "int_storage.h"
#include "mmo.h"
#include "socket.h"

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

static struct guild *guild_pt;
static struct guild *guild_pt2;
static struct guild_castle *guildcastle_pt;
static int guild_newid = 10000;

static int guild_exp[100];

int  mapif_parse_GuildLeave (int fd, int guild_id, int account_id,
                             int char_id, int flag, const char *mes);
int  mapif_guild_broken (int guild_id, int flag);
int  guild_check_empty (struct guild *g);
int  guild_calcinfo (struct guild *g);
int  mapif_guild_basicinfochanged (int guild_id, int type, const void *data,
                                   int len);
int  mapif_guild_info (int fd, struct guild *g);
int  guild_break_sub (void *key, void *data, va_list ap);

// Save guild into sql
int inter_guild_tosql (struct guild *g, int flag)
{
    // 1 `guild` (`guild_id`, `name`,`master`,`guild_lv`,`connect_member`,`max_member`,`average_lv`,`exp`,`next_exp`,`skill_point`,`castle_id`,`mes1`,`mes2`,`emblem_len`,`emblem_id`,`emblem_data`)
    // 2 `guild_member` (`guild_id`,`account_id`,`char_id`,`hair`,`hair_color`,`gender`,`class`,`lv`,`exp`,`exp_payper`,`online`,`position`,`rsv1`,`rsv2`,`name`)
    // 4 `guild_position` (`guild_id`,`position`,`name`,`mode`,`exp_mode`)
    // 8 `guild_alliance` (`guild_id`,`opposition`,`alliance_id`,`name`)
    // 16 `guild_expulsion` (`guild_id`,`name`,`mes`,`acc`,`account_id`,`rsv1`,`rsv2`,`rsv3`) 
    // 32 `guild_skill` (`guild_id`,`id`,`lv`)

    char t_name[100], t_master[24], t_mes1[60], t_mes2[120], t_member[24], t_position[24], t_alliance[24];  // temporay storage for str convertion;
    char t_ename[24], t_emes[40];
    char emblem_data[4096];
    int  i = 0;
    int  guild_exist = 0, guild_member = 0, guild_online_member = 0;

    if (g->guild_id <= 0)
        return -1;

    printf ("(\033[1;35m%d\033[0m)  Request save guild - ", g->guild_id);

    jstrescapecpy (t_name, g->name);

    //printf("- Check if guild %d exists\n",g->guild_id);
    sprintf (tmp_sql, "SELECT count(*) FROM `%s` WHERE `guild_id`='%d'",
             guild_db, g->guild_id);
    if (mysql_query (&mysql_handle, tmp_sql))
    {
        printf ("DB server Error (delete `guild`)- %s\n",
                mysql_error (&mysql_handle));
    }
    sql_res = mysql_store_result (&mysql_handle);
    if (sql_res != NULL && mysql_num_rows (sql_res) > 0)
    {
        sql_row = mysql_fetch_row (sql_res);
        guild_exist = atoi (sql_row[0]);
        //printf("- Check if guild %d exists : %s\n",g->guild_id,((guild_exist==0)?"No":"Yes"));
    }
    mysql_free_result (sql_res);    //resource free

    if (guild_exist > 0)
    {
        // Check members in party
        sprintf (tmp_sql, "SELECT count(*) FROM `%s` WHERE `guild_id`='%d'",
                 guild_member_db, g->guild_id);
        if (mysql_query (&mysql_handle, tmp_sql))
        {
            printf ("DB server Error - %s\n", mysql_error (&mysql_handle));
            return -1;
        }
        sql_res = mysql_store_result (&mysql_handle);
        if (sql_res != NULL && mysql_num_rows (sql_res) > 0)
        {
            sql_row = mysql_fetch_row (sql_res);

            guild_member = atoi (sql_row[0]);
            //  printf("- Check members in guild %d : %d \n",g->guild_id,guild_member);

        }
        mysql_free_result (sql_res);    //resource free

        // Delete old guild from sql
        if (flag & 1 || guild_member == 0)
        {
            //  printf("- Delete guild %d from guild\n",g->guild_id);
            sprintf (tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",
                     guild_db, g->guild_id);
            if (mysql_query (&mysql_handle, tmp_sql))
            {
                printf ("DB server Error (delete `guild`)- %s\n",
                        mysql_error (&mysql_handle));
            }
        }
        if (flag & 2 || guild_member == 0)
        {
            //  printf("- Delete guild %d from guild_member\n",g->guild_id);
            sprintf (tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",
                     guild_member_db, g->guild_id);
            if (mysql_query (&mysql_handle, tmp_sql))
            {
                printf ("DB server Error (delete `guild_member`)- %s\n",
                        mysql_error (&mysql_handle));
            }
            sprintf (tmp_sql,
                     "UPDATE `%s` SET `guild_id`='0' WHERE `guild_id`='%d'",
                     char_db, g->guild_id);
            if (mysql_query (&mysql_handle, tmp_sql))
            {
                printf ("DB server Error (update `char`)- %s\n",
                        mysql_error (&mysql_handle));
            }
        }
        if (flag & 32 || guild_member == 0)
        {
            //  printf("- Delete guild %d from guild_skill\n",g->guild_id);
            sprintf (tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",
                     guild_skill_db, g->guild_id);
            if (mysql_query (&mysql_handle, tmp_sql))
            {
                printf ("DB server Error (delete `guild_skill`)- %s\n",
                        mysql_error (&mysql_handle));
            }
        }
        if (flag & 4 || guild_member == 0)
        {
            //  printf("- Delete guild %d from guild_position\n",g->guild_id);
            sprintf (tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",
                     guild_position_db, g->guild_id);
            if (mysql_query (&mysql_handle, tmp_sql))
            {
                printf ("DB server Error (delete `guild_position`)- %s\n",
                        mysql_error (&mysql_handle));
            }
        }
        if (flag & 16 || guild_member == 0)
        {
            //  printf("- Delete guild %d from guild_expulsion\n",g->guild_id);
            sprintf (tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",
                     guild_expulsion_db, g->guild_id);
            if (mysql_query (&mysql_handle, tmp_sql))
            {
                printf ("DB server Error (delete `guild_expulsion`)- %s\n",
                        mysql_error (&mysql_handle));
            }
        }
        if (flag & 8 || guild_member == 0)
        {
            //  printf("- Delete guild %d from guild_alliance\n",g->guild_id);
            sprintf (tmp_sql,
                     "DELETE FROM `%s` WHERE `guild_id`='%d' OR `alliance_id`='%d'",
                     guild_alliance_db, g->guild_id, g->guild_id);
            if (mysql_query (&mysql_handle, tmp_sql))
            {
                printf ("DB server Error (delete `guild_alliance`)- %s\n",
                        mysql_error (&mysql_handle));
            }
        }
        if (flag & 2 || guild_member == 0)
        {
            //  printf("- Delete guild %d from char\n",g->guild_id);
            sprintf (tmp_sql,
                     "UPDATE `%s` SET `guild_id`='0' WHERE `guild_id`='%d'",
                     char_db, g->guild_id);
            if (mysql_query (&mysql_handle, tmp_sql))
            {
                printf ("DB server Error (delete `guild_alliance`)- %s\n",
                        mysql_error (&mysql_handle));
            }
        }
        if (guild_member == 0)
        {
            //  printf("- Delete guild %d from guild_castle\n",g->guild_id);
            sprintf (tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",
                     guild_castle_db, g->guild_id);
            if (mysql_query (&mysql_handle, tmp_sql))
            {
                printf ("DB server Error (delete `guild_castle`)- %s\n",
                        mysql_error (&mysql_handle));
            }
        }
    }

    guild_online_member = 0;
    i = 0;
    while (i < g->max_member)
    {
        if (g->member[i].account_id > 0)
            guild_online_member++;
        i++;
    }

    // No member in guild , no need to create it in sql
    if (guild_member <= 0 && guild_online_member <= 0)
    {
        inter_guild_storage_delete (g->guild_id);
        printf ("No member in guild %d , break it! \n", g->guild_id);
        return -2;
    }

    // Insert new guild to sqlserver
    if (flag & 1 || guild_member == 0)
    {
        int  len = 0;
        //printf("- Insert guild %d to guild\n",g->guild_id);
        for (i = 0; i < g->emblem_len; i++)
        {
            len +=
                sprintf (emblem_data + len, "%02x",
                         (unsigned char) (g->emblem_data[i]));
            //printf("%02x",(unsigned char)(g->emblem_data[i]));
        }
        emblem_data[len] = '\0';
        //printf("- emblem_len = %d \n",g->emblem_len);
        sprintf (tmp_sql, "INSERT INTO `%s` "
                 "(`guild_id`, `name`,`master`,`guild_lv`,`connect_member`,`max_member`,`average_lv`,`exp`,`next_exp`,`skill_point`,`castle_id`,`mes1`,`mes2`,`emblem_len`,`emblem_id`,`emblem_data`) "
                 "VALUES ('%d', '%s', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%s', '%s', '%d', '%d', '%s')",
                 guild_db, g->guild_id, t_name, jstrescapecpy (t_master,
                                                               g->master),
                 g->guild_lv, g->connect_member, g->max_member, g->average_lv,
                 g->exp, g->next_exp, g->skill_point, g->castle_id,
                 jstrescapecpy (t_mes1, g->mes1), jstrescapecpy (t_mes2,
                                                                 g->mes2),
                 g->emblem_len, g->emblem_id, emblem_data);
        //printf(" %s\n",tmp_sql);
        if (mysql_query (&mysql_handle, tmp_sql))
        {
            printf ("DB server Error (insert `guild`)- %s\n",
                    mysql_error (&mysql_handle));
        }
    }

    if (flag & 2 || guild_member == 0)
    {
        //printf("- Insert guild %d to guild_member\n",g->guild_id);
        for (i = 0; i < g->max_member; i++)
        {
            if (g->member[i].account_id > 0)
            {
                struct guild_member *m = &g->member[i];
                sprintf (tmp_sql, "DELETE FROM `%s` WHERE `char_id`='%d'",
                         guild_member_db, m->char_id);
                if (mysql_query (&mysql_handle, tmp_sql))
                {
                    printf ("DB server Error (delete `guild_member`)- %s\n",
                            mysql_error (&mysql_handle));
                }
                sprintf (tmp_sql, "INSERT INTO `%s` "
                         "(`guild_id`,`account_id`,`char_id`,`hair`,`hair_color`,`gender`,`class`,`lv`,`exp`,`exp_payper`,`online`,`position`,`rsv1`,`rsv2`,`name`) "
                         "VALUES ('%d','%d','%d','%d','%d', '%d','%d','%d','%d','%d','%d','%d','%d','%d','%s')",
                         guild_member_db, g->guild_id,
                         m->account_id, m->char_id,
                         m->hair, m->hair_color, m->gender,
                         m->class, m->lv, m->exp, m->exp_payper, m->online,
                         m->position, 0, 0, jstrescapecpy (t_member,
                                                           m->name));
                //printf(" %s\n",tmp_sql);
                if (mysql_query (&mysql_handle, tmp_sql))
                {
                    printf ("DB server Error (insert `guild_member`)- %s\n",
                            mysql_error (&mysql_handle));
                }
                sprintf (tmp_sql,
                         "UPDATE `%s` SET `guild_id`='%d' WHERE `account_id`='%d' AND `char_id`='%d'",
                         char_db, g->guild_id, m->account_id, m->char_id);
                if (mysql_query (&mysql_handle, tmp_sql))
                {
                    printf ("DB server Error (update `char`)- %s\n",
                            mysql_error (&mysql_handle));
                }
            }
        }
    }

    if (flag & 4 || guild_member == 0)
    {
        //printf("- Insert guild %d to guild_position\n",g->guild_id);
        for (i = 0; i < MAX_GUILDPOSITION; i++)
        {
            struct guild_position *p = &g->position[i];
            sprintf (tmp_sql,
                     "INSERT INTO `%s` (`guild_id`,`position`,`name`,`mode`,`exp_mode`) VALUES ('%d','%d', '%s','%d','%d')",
                     guild_position_db, g->guild_id, i,
                     jstrescapecpy (t_position, p->name), p->mode,
                     p->exp_mode);
            //printf(" %s\n",tmp_sql);
            if (mysql_query (&mysql_handle, tmp_sql))
            {
                printf ("DB server Error (insert `guild_position`)- %s\n",
                        mysql_error (&mysql_handle));
            }
        }
    }

    if (flag & 8 || guild_member == 0)
    {
        //printf("- Insert guild %d to guild_alliance\n",g->guild_id);
        for (i = 0; i < MAX_GUILDALLIANCE; i++)
        {
            struct guild_alliance *a = &g->alliance[i];
            if (a->guild_id > 0)
            {
                sprintf (tmp_sql,
                         "INSERT INTO `%s` (`guild_id`,`opposition`,`alliance_id`,`name`) "
                         "VALUES ('%d','%d','%d','%s')", guild_alliance_db,
                         g->guild_id, a->opposition, a->guild_id,
                         jstrescapecpy (t_alliance, a->name));
                //printf(" %s\n",tmp_sql);
                if (mysql_query (&mysql_handle, tmp_sql))
                {
                    printf ("DB server Error (insert `guild_alliance`)- %s\n",
                            mysql_error (&mysql_handle));
                }
                sprintf (tmp_sql,
                         "INSERT INTO `%s` (`guild_id`,`opposition`,`alliance_id`,`name`) "
                         "VALUES ('%d','%d','%d','%s')", guild_alliance_db,
                         a->guild_id, a->opposition, g->guild_id, t_name);
                //printf(" %s\n",tmp_sql);
                if (mysql_query (&mysql_handle, tmp_sql))
                {
                    printf ("DB server Error (insert `guild_alliance`)- %s\n",
                            mysql_error (&mysql_handle));
                }
            }
        }
    }

    if (flag & 16 || guild_member == 0)
    {
        //printf("- Insert guild %d to guild_expulsion\n",g->guild_id);
        for (i = 0; i < MAX_GUILDEXPLUSION; i++)
        {
            struct guild_explusion *e = &g->explusion[i];
            if (e->account_id > 0)
            {
                sprintf (tmp_sql,
                         "INSERT INTO `%s` (`guild_id`,`name`,`mes`,`acc`,`account_id`,`rsv1`,`rsv2`,`rsv3`) "
                         "VALUES ('%d','%s','%s','%s','%d','%d','%d','%d')",
                         guild_expulsion_db, g->guild_id,
                         jstrescapecpy (t_ename, e->name),
                         jstrescapecpy (t_emes, e->mes), e->acc,
                         e->account_id, e->rsv1, e->rsv2, e->rsv3);
                //printf(" %s\n",tmp_sql);
                if (mysql_query (&mysql_handle, tmp_sql))
                {
                    printf
                        ("DB server Error (insert `guild_expulsion`)- %s\n",
                         mysql_error (&mysql_handle));
                }
            }
        }
    }

    if (flag & 32 || guild_member == 0)
    {
        //printf("- Insert guild %d to guild_skill\n",g->guild_id);
        for (i = 0; i < MAX_GUILDSKILL; i++)
        {
            if (g->skill[i].id > 0)
            {
                sprintf (tmp_sql,
                         "INSERT INTO `%s` (`guild_id`,`id`,`lv`) VALUES ('%d','%d','%d')",
                         guild_skill_db, g->guild_id, g->skill[i].id,
                         g->skill[i].lv);
                //printf("%s\n",tmp_sql);
                if (mysql_query (&mysql_handle, tmp_sql))
                {
                    printf ("DB server Error (insert `guild_skill`)- %s\n",
                            mysql_error (&mysql_handle));
                }
            }
        }
    }

    printf ("Save guild done\n");
    return 0;
}

// Read guild from sql
int inter_guild_fromsql (int guild_id, struct guild *g)
{
    int  i;
    char emblem_data[4096];
    char *pstr;

    if (g == NULL)
        return 0;
    memset (g, 0, sizeof (struct guild));
    if (guild_id == 0)
        return 0;

//  printf("Retrieve guild information from sql ......\n");
//  printf("- Read guild %d from sql \n",guild_id);

    sprintf (tmp_sql,
             "SELECT `guild_id`, `name`,`master`,`guild_lv`,`connect_member`,`max_member`,`average_lv`,`exp`,`next_exp`,`skill_point`,`castle_id`,`mes1`,`mes2`,`emblem_len`,`emblem_id`,`emblem_data` "
             "FROM `%s` WHERE `guild_id`='%d'", guild_db, guild_id);
    //printf("  %s\n",tmp_sql);
    if (mysql_query (&mysql_handle, tmp_sql))
    {
        printf ("DB server Error (select `guild`)- %s\n",
                mysql_error (&mysql_handle));
        return 0;
    }

    sql_res = mysql_store_result (&mysql_handle);
    if (sql_res != NULL && mysql_num_rows (sql_res) > 0)
    {
        sql_row = mysql_fetch_row (sql_res);
        if (sql_row == NULL)
        {
            mysql_free_result (sql_res);
            return 0;
        }

        g->guild_id = atoi (sql_row[0]);
        strncpy (g->name, sql_row[1], 24);
        strncpy (g->master, sql_row[2], 24);
        g->guild_lv = atoi (sql_row[3]);
        g->connect_member = atoi (sql_row[4]);
        g->max_member = atoi (sql_row[5]);
        g->average_lv = atoi (sql_row[6]);
        g->exp = atoi (sql_row[7]);
        g->next_exp = atoi (sql_row[8]);
        g->skill_point = atoi (sql_row[9]);
        g->castle_id = atoi (sql_row[10]);
        strncpy (g->mes1, sql_row[11], 60);
        strncpy (g->mes2, sql_row[12], 120);
        g->emblem_len = atoi (sql_row[13]);
        g->emblem_id = atoi (sql_row[14]);
        strncpy (emblem_data, sql_row[15], 4096);
        for (i = 0, pstr = emblem_data; i < g->emblem_len; i++, pstr += 2)
        {
            int  c1 = pstr[0], c2 = pstr[1], x1 = 0, x2 = 0;
            if (c1 >= '0' && c1 <= '9')
                x1 = c1 - '0';
            if (c1 >= 'a' && c1 <= 'f')
                x1 = c1 - 'a' + 10;
            if (c1 >= 'A' && c1 <= 'F')
                x1 = c1 - 'A' + 10;
            if (c2 >= '0' && c2 <= '9')
                x2 = c2 - '0';
            if (c2 >= 'a' && c2 <= 'f')
                x2 = c2 - 'a' + 10;
            if (c2 >= 'A' && c2 <= 'F')
                x2 = c2 - 'A' + 10;
            g->emblem_data[i] = (x1 << 4) | x2;
        }
    }
    mysql_free_result (sql_res);

    //printf("- Read guild_member %d from sql \n",guild_id);
    sprintf (tmp_sql,
             "SELECT `guild_id`,`account_id`,`char_id`,`hair`,`hair_color`,`gender`,`class`,`lv`,`exp`,`exp_payper`,`online`,`position`,`rsv1`,`rsv2`,`name` "
             "FROM `%s` WHERE `guild_id`='%d'  ORDER BY `position`",
             guild_member_db, guild_id);
    //printf("  %s\n",tmp_sql);
    if (mysql_query (&mysql_handle, tmp_sql))
    {
        printf ("DB server Error (select `guild_member`)- %s\n",
                mysql_error (&mysql_handle));
        return 0;
    }
    sql_res = mysql_store_result (&mysql_handle);
    if (sql_res != NULL && mysql_num_rows (sql_res) > 0)
    {
        int  i;
        for (i = 0;
             ((sql_row = mysql_fetch_row (sql_res)) && i < g->max_member);
             i++)
        {
            struct guild_member *m = &g->member[i];
            m->account_id = atoi (sql_row[1]);
            m->char_id = atoi (sql_row[2]);
            m->hair = atoi (sql_row[3]);
            m->hair_color = atoi (sql_row[4]);
            m->gender = atoi (sql_row[5]);
            m->class = atoi (sql_row[6]);
            m->lv = atoi (sql_row[7]);
            m->exp = atoi (sql_row[8]);
            m->exp_payper = atoi (sql_row[9]);
            m->online = atoi (sql_row[10]);
            m->position = atoi (sql_row[11]);
            strncpy (m->name, sql_row[14], 24);
        }
    }
    mysql_free_result (sql_res);

    //printf("- Read guild_position %d from sql \n",guild_id);
    sprintf (tmp_sql,
             "SELECT `guild_id`,`position`,`name`,`mode`,`exp_mode` FROM `%s` WHERE `guild_id`='%d'",
             guild_position_db, guild_id);
    //printf("  %s\n",tmp_sql);
    if (mysql_query (&mysql_handle, tmp_sql))
    {
        printf ("DB server Error (select `guild_position`)- %s\n",
                mysql_error (&mysql_handle));
        return 0;
    }
    sql_res = mysql_store_result (&mysql_handle);
    if (sql_res != NULL && mysql_num_rows (sql_res) > 0)
    {
        int  i;
        for (i = 0;
             ((sql_row = mysql_fetch_row (sql_res)) && i < MAX_GUILDPOSITION);
             i++)
        {
            int  position = atoi (sql_row[1]);
            struct guild_position *p = &g->position[position];
            strncpy (p->name, sql_row[2], 24);
            p->mode = atoi (sql_row[3]);
            p->exp_mode = atoi (sql_row[4]);
        }
    }
    mysql_free_result (sql_res);

    //printf("- Read guild_alliance %d from sql \n",guild_id);
    sprintf (tmp_sql,
             "SELECT `guild_id`,`opposition`,`alliance_id`,`name` FROM `%s` WHERE `guild_id`='%d'",
             guild_alliance_db, guild_id);
    if (mysql_query (&mysql_handle, tmp_sql))
    {
        printf ("DB server Error (select `guild_alliance`)- %s\n",
                mysql_error (&mysql_handle));
        return 0;
    }
    sql_res = mysql_store_result (&mysql_handle);
    if (sql_res != NULL && mysql_num_rows (sql_res) > 0)
    {
        int  i;
        for (i = 0;
             ((sql_row = mysql_fetch_row (sql_res)) && i < MAX_GUILDALLIANCE);
             i++)
        {
            struct guild_alliance *a = &g->alliance[i];
            a->opposition = atoi (sql_row[1]);
            a->guild_id = atoi (sql_row[2]);
            strncpy (a->name, sql_row[3], 24);
        }
    }
    mysql_free_result (sql_res);

    //printf("- Read guild_expulsion %d from sql \n",guild_id);
    sprintf (tmp_sql,
             "SELECT `guild_id`,`name`,`mes`,`acc`,`account_id`,`rsv1`,`rsv2`,`rsv3` FROM `%s` WHERE `guild_id`='%d'",
             guild_expulsion_db, guild_id);
    if (mysql_query (&mysql_handle, tmp_sql))
    {
        printf ("DB server Error (select `guild_expulsion`)- %s\n",
                mysql_error (&mysql_handle));
        return 0;
    }
    sql_res = mysql_store_result (&mysql_handle);
    if (sql_res != NULL && mysql_num_rows (sql_res) > 0)
    {
        int  i;
        for (i = 0;
             ((sql_row = mysql_fetch_row (sql_res))
              && i < MAX_GUILDEXPLUSION); i++)
        {
            struct guild_explusion *e = &g->explusion[i];

            strncpy (e->name, sql_row[1], 24);
            strncpy (e->mes, sql_row[2], 40);
            strncpy (e->acc, sql_row[3], 24);
            e->account_id = atoi (sql_row[4]);
            e->rsv1 = atoi (sql_row[5]);
            e->rsv2 = atoi (sql_row[6]);
            e->rsv3 = atoi (sql_row[7]);

        }
    }
    mysql_free_result (sql_res);

    //printf("- Read guild_skill %d from sql \n",guild_id);
    sprintf (tmp_sql,
             "SELECT `guild_id`,`id`,`lv` FROM `%s` WHERE `guild_id`='%d' ORDER BY `id`",
             guild_skill_db, guild_id);
    if (mysql_query (&mysql_handle, tmp_sql))
    {
        printf ("DB server Error (select `guild_skill`)- %s\n",
                mysql_error (&mysql_handle));
        return 0;
    }
    sql_res = mysql_store_result (&mysql_handle);
    if (sql_res != NULL && mysql_num_rows (sql_res) > 0)
    {
        int  i;
        for (i = 0;
             ((sql_row = mysql_fetch_row (sql_res)) && i < MAX_GUILDSKILL);
             i++)
        {
            g->skill[i].id = atoi (sql_row[1]);
            g->skill[i].lv = atoi (sql_row[2]);
        }
    }
    mysql_free_result (sql_res);

//  printf("Successfully retrieve guild information from sql!\n");

    return 0;

}

// Save guild_castle to sql
int inter_guildcastle_tosql (struct guild_castle *gc)
{
    // `guild_castle` (`castle_id`, `guild_id`, `economy`, `defense`, `triggerE`, `triggerD`, `nextTime`, `payTime`, `createTime`, `visibleC`, `visibleG0`, `visibleG1`, `visibleG2`, `visibleG3`, `visibleG4`, `visibleG5`, `visibleG6`, `visibleG7`)

    if (gc == NULL)
        return 0;
    //printf("Save to guild_castle\n");
    sprintf (tmp_sql, "DELETE FROM `%s` WHERE `castle_id`='%d'",
             guild_castle_db, gc->castle_id);
    //printf(" %s\n",tmp_sql);
    if (mysql_query (&mysql_handle, tmp_sql))
    {
        printf ("DB server Error - %s\n", mysql_error (&mysql_handle));
        return 0;
    }

    sprintf (tmp_sql, "INSERT INTO `%s` "
             "(`castle_id`, `guild_id`, `economy`, `defense`, `triggerE`, `triggerD`, `nextTime`, `payTime`, `createTime`,"
             "`visibleC`, `visibleG0`, `visibleG1`, `visibleG2`, `visibleG3`, `visibleG4`, `visibleG5`, `visibleG6`, `visibleG7`,"
             "`Ghp0`, `Ghp1`, `Ghp2`, `Ghp3`, `Ghp4`, `Ghp5`, `Ghp6`, `Ghp7`)"
             "VALUES ('%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d')",
             guild_castle_db, gc->castle_id, gc->guild_id, gc->economy,
             gc->defense, gc->triggerE, gc->triggerD, gc->nextTime,
             gc->payTime, gc->createTime, gc->visibleC, gc->visibleG0,
             gc->visibleG1, gc->visibleG2, gc->visibleG3, gc->visibleG4,
             gc->visibleG5, gc->visibleG6, gc->visibleG7, gc->Ghp0, gc->Ghp1,
             gc->Ghp2, gc->Ghp3, gc->Ghp4, gc->Ghp5, gc->Ghp6, gc->Ghp7);
    //printf(" %s\n",tmp_sql);
    if (mysql_query (&mysql_handle, tmp_sql))
    {
        printf ("DB server Error - %s\n", mysql_error (&mysql_handle));
        return 0;
    }

    sprintf (tmp_sql,
             "UPDATE `%s` SET `castle_id`='-1' WHERE `castle_id`='%d'",
             guild_db, gc->castle_id);
    //printf(" %s\n",tmp_sql);
    if (mysql_query (&mysql_handle, tmp_sql))
    {
        printf ("DB server Error - %s\n", mysql_error (&mysql_handle));
        return 0;
    }

    sprintf (tmp_sql,
             "UPDATE `%s` SET `castle_id`='%d' WHERE `guild_id`='%d'",
             guild_db, gc->castle_id, gc->guild_id);
    //printf(" %s\n",tmp_sql);
    if (mysql_query (&mysql_handle, tmp_sql))
    {
        printf ("DB server Error - %s\n", mysql_error (&mysql_handle));
        return 0;
    }

    return 0;
}

// Read guild_castle from sql
int inter_guildcastle_fromsql (int castle_id, struct guild_castle *gc)
{

    if (gc == NULL)
        return 0;
    //printf("Read from guild_castle\n");
    memset (gc, 0, sizeof (struct guild_castle));
    gc->castle_id = castle_id;
    if (castle_id == -1)
        return 0;
    sprintf (tmp_sql,
             "SELECT `castle_id`, `guild_id`, `economy`, `defense`, `triggerE`, `triggerD`, `nextTime`, `payTime`, `createTime`, "
             "`visibleC`, `visibleG0`, `visibleG1`, `visibleG2`, `visibleG3`, `visibleG4`, `visibleG5`, `visibleG6`, `visibleG7`,"
             "`Ghp0`, `Ghp1`, `Ghp2`, `Ghp3`, `Ghp4`, `Ghp5`, `Ghp6`, `Ghp7`"
             " FROM `%s` WHERE `castle_id`='%d'", guild_castle_db, castle_id);
    if (mysql_query (&mysql_handle, tmp_sql))
    {
        printf ("DB server Error - %s\n", mysql_error (&mysql_handle));
        return 0;
    }
    sql_res = mysql_store_result (&mysql_handle);
    if (sql_res != NULL && mysql_num_rows (sql_res) > 0)
    {
        sql_row = mysql_fetch_row (sql_res);
        if (sql_row == NULL)
        {
            mysql_free_result (sql_res);
            return 0;
        }

        gc->guild_id = atoi (sql_row[1]);
        gc->economy = atoi (sql_row[2]);
        gc->defense = atoi (sql_row[3]);
        gc->triggerE = atoi (sql_row[4]);
        gc->triggerD = atoi (sql_row[5]);
        gc->nextTime = atoi (sql_row[6]);
        gc->payTime = atoi (sql_row[7]);
        gc->createTime = atoi (sql_row[8]);
        gc->visibleC = atoi (sql_row[9]);
        gc->visibleG0 = atoi (sql_row[10]);
        gc->visibleG1 = atoi (sql_row[11]);
        gc->visibleG2 = atoi (sql_row[12]);
        gc->visibleG3 = atoi (sql_row[13]);
        gc->visibleG4 = atoi (sql_row[14]);
        gc->visibleG5 = atoi (sql_row[15]);
        gc->visibleG6 = atoi (sql_row[16]);
        gc->visibleG7 = atoi (sql_row[17]);
        gc->Ghp0 = atoi (sql_row[18]);
        gc->Ghp1 = atoi (sql_row[19]);
        gc->Ghp2 = atoi (sql_row[20]);
        gc->Ghp3 = atoi (sql_row[21]);
        gc->Ghp4 = atoi (sql_row[22]);
        gc->Ghp5 = atoi (sql_row[23]);
        gc->Ghp6 = atoi (sql_row[24]);
        gc->Ghp7 = atoi (sql_row[25]);

        //printf("Read Castle %d of guild %d from sql \n",castle_id,gc->guild_id);

    }
    mysql_free_result (sql_res);    //resource free
    return 0;
}

// Read exp_guild.txt
int inter_guild_readdb ()
{
    int  i;
    FILE *fp;
    char line[1024];
    for (i = 0; i < 100; i++)
        guild_exp[i] = 0;

    fp = fopen_ ("db/exp_guild.txt", "r");
    if (fp == NULL)
    {
        printf ("can't read db/exp_guild.txt\n");
        return 1;
    }
    i = 0;
    while (fgets (line, 256, fp) && i < 100)
    {
        if (line[0] == '/' && line[1] == '/')
            continue;
        guild_exp[i] = atoi (line);
        i++;
    }
    fclose_ (fp);

    return 0;
}

// Initialize guild sql
int inter_guild_sql_init ()
{
    int  i;

    printf ("interserver guild memory initialize.... (%d byte)\n",
            sizeof (struct guild));
    guild_pt = calloc (sizeof (struct guild), 1);
    guild_pt2 = calloc (sizeof (struct guild), 1);
    guildcastle_pt = calloc (sizeof (struct guild_castle), 1);

    inter_guild_readdb ();      // Read exp

    sprintf (tmp_sql, "UPDATE `%s` SET `online`='0'", guild_member_db);
    if (mysql_query (&mysql_handle, tmp_sql))
    {
        printf ("DB server Error (update `char`)- %s\n",
                mysql_error (&mysql_handle));
        exit (0);
    }

    sprintf (tmp_sql, "SELECT count(*) FROM `%s`", guild_db);
    if (mysql_query (&mysql_handle, tmp_sql))
    {
        printf ("DB server Error - %s\n", mysql_error (&mysql_handle));
        exit (0);
    }
    sql_res = mysql_store_result (&mysql_handle);
    sql_row = mysql_fetch_row (sql_res);
    printf ("total guild data -> '%s'.......\n", sql_row[0]);
    i = atoi (sql_row[0]);
    mysql_free_result (sql_res);

    if (i > 0)
    {
        //set party_newid
        sprintf (tmp_sql, "SELECT max(`guild_id`) FROM `%s`", guild_db);
        if (mysql_query (&mysql_handle, tmp_sql))
        {
            printf ("DB server Error - %s\n", mysql_error (&mysql_handle));
            exit (0);
        }

        sql_res = mysql_store_result (&mysql_handle);
        sql_row = mysql_fetch_row (sql_res);
        guild_newid = atoi (sql_row[0]) + 1;
        mysql_free_result (sql_res);
    }

    printf ("set guild_newid: %d.......\n", guild_newid);

    return 0;
}

// Get guild by its name
struct guild *search_guildname (char *str)
{
    struct guild *g = guild_pt;
    char t_name[24];
    int  guild_id = 0;
    printf ("search_guildname\n");
    sprintf (tmp_sql, "SELECT `guild_id` FROM `%s` WHERE `name`='%s'",
             guild_db, jstrescapecpy (t_name, str));
    if (mysql_query (&mysql_handle, tmp_sql))
    {
        printf ("DB server Error - %s\n", mysql_error (&mysql_handle));
    }
    sql_res = mysql_store_result (&mysql_handle);
    if (sql_res != NULL && mysql_num_rows (sql_res) > 0)
    {
        sql_row = mysql_fetch_row (sql_res);
        guild_id = atoi (sql_row[0]);
    }
    mysql_free_result (sql_res);
    inter_guild_fromsql (guild_id, g);
    return g;
}

// Check if guild is empty
int guild_check_empty (struct guild *g)
{
    int  i;
    for (i = 0; i < g->max_member; i++)
    {
        if (g->member[i].account_id > 0)
        {
            return 0;
        }
    }

    // 誰もいないので解散
    mapif_guild_broken (g->guild_id, 0);
    inter_guild_storage_delete (g->guild_id);
    inter_guild_tosql (g, 255);
    memset (g, 0, sizeof (struct guild));
    return 1;
}

int guild_nextexp (int level)
{
    if (level < 100 && level > 0)   // Change by hack
        return guild_exp[level - 1];

    return 0;
}

// ギルドスキルがあるか確認
int guild_checkskill (struct guild *g, int id)
{
    return g->skill[id - 10000].lv;
}

// ギルドの情報の再計算
int guild_calcinfo (struct guild *g)
{
    int  i, c, nextexp;
    struct guild before = *g;

    // スキルIDの設定
    for (i = 0; i < 5; i++)
        g->skill[i].id = i + 10000;

    // ギルドレベル
    if (g->guild_lv <= 0)
        g->guild_lv = 1;
    nextexp = guild_nextexp (g->guild_lv);
    if (nextexp > 0)
    {
        while (g->exp >= nextexp && nextexp > 0)
        {                       // Change by hack
            g->exp -= nextexp;
            g->guild_lv++;
            g->skill_point++;
            nextexp = guild_nextexp (g->guild_lv);
        }
    }

    // ギルドの次の経験値
    g->next_exp = guild_nextexp (g->guild_lv);

    // メンバ上限(ギルド拡張適用)
    g->max_member = 100 + guild_checkskill (g, 10004) * 2;   // Updated max_members [PoW]

    // 平均レベルとオンライン人数
    g->average_lv = 0;
    g->connect_member = 0;
    for (i = c = 0; i < g->max_member; i++)
    {
        if (g->member[i].account_id > 0)
        {
            g->average_lv += g->member[i].lv;
            c++;

            if (g->member[i].online > 0)
                g->connect_member++;
        }
    }
    g->average_lv /= c;

    // 全データを送る必要がありそう
    if (g->max_member != before.max_member ||
        g->guild_lv != before.guild_lv ||
        g->skill_point != before.skill_point)
    {
        mapif_guild_info (-1, g);
        return 1;
    }

    return 0;
}

//-------------------------------------------------------------------
// map serverへの通信

// ギルド作成可否
int mapif_guild_created (int fd, int account_id, struct guild *g)
{
    WFIFOW (fd, 0) = 0x3830;
    WFIFOL (fd, 2) = account_id;
    if (g != NULL)
    {
        WFIFOL (fd, 6) = g->guild_id;
        printf ("int_guild: created! %d %s\n", g->guild_id, g->name);
    }
    else
    {
        WFIFOL (fd, 6) = 0;
    }
    WFIFOSET (fd, 10);
    return 0;
}

// ギルド情報見つからず
int mapif_guild_noinfo (int fd, int guild_id)
{
    WFIFOW (fd, 0) = 0x3831;
    WFIFOW (fd, 2) = 8;
    WFIFOL (fd, 4) = guild_id;
    WFIFOSET (fd, 8);
    printf ("int_guild: info not found %d\n", guild_id);
    return 0;
}

// ギルド情報まとめ送り
int mapif_guild_info (int fd, struct guild *g)
{
    unsigned char buf[16384];
    WBUFW (buf, 0) = 0x3831;
    memcpy (buf + 4, g, sizeof (struct guild));
    WBUFW (buf, 2) = 4 + sizeof (struct guild);
//  printf("int_guild: sizeof(guild)=%d\n",sizeof(struct guild));
    if (fd < 0)
        mapif_sendall (buf, WBUFW (buf, 2));
    else
        mapif_send (fd, buf, WBUFW (buf, 2));
//  printf("int_guild: info %d %s\n",p->guild_id,p->name);
    return 0;
}

// メンバ追加可否
int mapif_guild_memberadded (int fd, int guild_id, int account_id,
                             int char_id, int flag)
{
    WFIFOW (fd, 0) = 0x3832;
    WFIFOL (fd, 2) = guild_id;
    WFIFOL (fd, 6) = account_id;
    WFIFOL (fd, 10) = char_id;
    WFIFOB (fd, 14) = flag;
    WFIFOSET (fd, 15);
    return 0;
}

// 脱退/追放通知
int mapif_guild_leaved (int guild_id, int account_id, int char_id, int flag,
                        const char *name, const char *mes)
{
    unsigned char buf[128];
    WBUFW (buf, 0) = 0x3834;
    WBUFL (buf, 2) = guild_id;
    WBUFL (buf, 6) = account_id;
    WBUFL (buf, 10) = char_id;
    WBUFB (buf, 14) = flag;
    memcpy (WBUFP (buf, 15), mes, 40);
    memcpy (WBUFP (buf, 55), name, 24);
    mapif_sendall (buf, 79);
    printf ("int_guild: guild leaved %d %d %s %s\n", guild_id, account_id,
            name, mes);
    return 0;
}

// オンライン状態とLv更新通知
int mapif_guild_memberinfoshort (struct guild *g, int idx)
{
    unsigned char buf[32];
    WBUFW (buf, 0) = 0x3835;
    WBUFL (buf, 2) = g->guild_id;
    WBUFL (buf, 6) = g->member[idx].account_id;
    WBUFL (buf, 10) = g->member[idx].char_id;
    WBUFB (buf, 14) = g->member[idx].online;
    WBUFW (buf, 15) = g->member[idx].lv;
    WBUFW (buf, 17) = g->member[idx].class;
    mapif_sendall (buf, 19);
    return 0;
}

// 解散通知
int mapif_guild_broken (int guild_id, int flag)
{
    unsigned char buf[16];
    WBUFW (buf, 0) = 0x3836;
    WBUFL (buf, 2) = guild_id;
    WBUFB (buf, 6) = flag;
    mapif_sendall (buf, 7);
    printf ("int_guild: broken %d\n", guild_id);
    return 0;
}

// ギルド内発言
int mapif_guild_message (int guild_id, int account_id, char *mes, int len)
{
    unsigned char buf[512];
    WBUFW (buf, 0) = 0x3837;
    WBUFW (buf, 2) = len + 12;
    WBUFL (buf, 4) = guild_id;
    WBUFL (buf, 8) = account_id;
    memcpy (WBUFP (buf, 12), mes, len);
    mapif_sendall (buf, len + 12);
    return 0;
}

// ギルド基本情報変更通知
int mapif_guild_basicinfochanged (int guild_id, int type, const void *data,
                                  int len)
{
    unsigned char buf[2048];
    WBUFW (buf, 0) = 0x3839;
    WBUFW (buf, 2) = len + 10;
    WBUFL (buf, 4) = guild_id;
    WBUFW (buf, 8) = type;
    memcpy (WBUFP (buf, 10), data, len);
    mapif_sendall (buf, len + 10);
    return 0;
}

// ギルドメンバ情報変更通知
int mapif_guild_memberinfochanged (int guild_id, int account_id, int char_id,
                                   int type, const void *data, int len)
{
    unsigned char buf[2048];
    WBUFW (buf, 0) = 0x383a;
    WBUFW (buf, 2) = len + 18;
    WBUFL (buf, 4) = guild_id;
    WBUFL (buf, 8) = account_id;
    WBUFL (buf, 12) = char_id;
    WBUFW (buf, 16) = type;
    memcpy (WBUFP (buf, 18), data, len);
    mapif_sendall (buf, len + 18);
    return 0;
}

// ギルドスキルアップ通知
int mapif_guild_skillupack (int guild_id, int skill_num, int account_id)
{
    unsigned char buf[16];
    WBUFW (buf, 0) = 0x383c;
    WBUFL (buf, 2) = guild_id;
    WBUFL (buf, 6) = skill_num;
    WBUFL (buf, 10) = account_id;
    mapif_sendall (buf, 14);
    return 0;
}

// ギルド同盟/敵対通知
int mapif_guild_alliance (int guild_id1, int guild_id2, int account_id1,
                          int account_id2, int flag, const char *name1,
                          const char *name2)
{
    unsigned char buf[128];
    WBUFW (buf, 0) = 0x383d;
    WBUFL (buf, 2) = guild_id1;
    WBUFL (buf, 6) = guild_id2;
    WBUFL (buf, 10) = account_id1;
    WBUFL (buf, 14) = account_id2;
    WBUFB (buf, 18) = flag;
    memcpy (WBUFP (buf, 19), name1, 24);
    memcpy (WBUFP (buf, 43), name2, 24);
    mapif_sendall (buf, 67);
    return 0;
}

// ギルド役職変更通知
int mapif_guild_position (struct guild *g, int idx)
{
    unsigned char buf[128];
    WBUFW (buf, 0) = 0x383b;
    WBUFW (buf, 2) = sizeof (struct guild_position) + 12;
    WBUFL (buf, 4) = g->guild_id;
    WBUFL (buf, 8) = idx;
    memcpy (WBUFP (buf, 12), &g->position[idx],
            sizeof (struct guild_position));
    mapif_sendall (buf, WBUFW (buf, 2));
    return 0;
}

// ギルド告知変更通知
int mapif_guild_notice (struct guild *g)
{
    unsigned char buf[256];
    WBUFW (buf, 0) = 0x383e;
    WBUFL (buf, 2) = g->guild_id;
    memcpy (WBUFP (buf, 6), g->mes1, 60);
    memcpy (WBUFP (buf, 66), g->mes2, 120);
    mapif_sendall (buf, 186);
    return 0;
}

// ギルドエンブレム変更通知
int mapif_guild_emblem (struct guild *g)
{
    unsigned char buf[2048];
    WBUFW (buf, 0) = 0x383f;
    WBUFW (buf, 2) = g->emblem_len + 12;
    WBUFL (buf, 4) = g->guild_id;
    WBUFL (buf, 8) = g->emblem_id;
    memcpy (WBUFP (buf, 12), g->emblem_data, g->emblem_len);
    mapif_sendall (buf, WBUFW (buf, 2));
    return 0;
}

int mapif_guild_castle_dataload (int castle_id, int index, int value)   // <Agit>
{
    unsigned char buf[16];
    WBUFW (buf, 0) = 0x3840;
    WBUFW (buf, 2) = castle_id;
    WBUFB (buf, 4) = index;
    WBUFL (buf, 5) = value;
    mapif_sendall (buf, 9);
    return 0;
}

int mapif_guild_castle_datasave (int castle_id, int index, int value)   // <Agit>
{
    unsigned char buf[16];
    WBUFW (buf, 0) = 0x3841;
    WBUFW (buf, 2) = castle_id;
    WBUFB (buf, 4) = index;
    WBUFL (buf, 5) = value;
    mapif_sendall (buf, 9);
    return 0;
}

int mapif_guild_castle_alldataload (int fd)
{
    struct guild_castle *gc = guildcastle_pt;
    int  i, len = 4;

    WFIFOW (fd, 0) = 0x3842;
    sprintf (tmp_sql, "SELECT * FROM `%s` ORDER BY `castle_id`",
             guild_castle_db);
    if (mysql_query (&mysql_handle, tmp_sql))
    {
        printf ("DB server Error - %s\n", mysql_error (&mysql_handle));
    }
    sql_res = mysql_store_result (&mysql_handle);
    if (sql_res != NULL && mysql_num_rows (sql_res) > 0)
    {
        for (i = 0;
             ((sql_row = mysql_fetch_row (sql_res)) && i < MAX_GUILDCASTLE);
             i++)
        {
            memset (gc, 0, sizeof (struct guild_castle));
            gc->castle_id = atoi (sql_row[0]);
            gc->guild_id = atoi (sql_row[1]);
            gc->economy = atoi (sql_row[2]);
            gc->defense = atoi (sql_row[3]);
            gc->triggerE = atoi (sql_row[4]);
            gc->triggerD = atoi (sql_row[5]);
            gc->nextTime = atoi (sql_row[6]);
            gc->payTime = atoi (sql_row[7]);
            gc->createTime = atoi (sql_row[8]);
            gc->visibleC = atoi (sql_row[9]);
            gc->visibleG0 = atoi (sql_row[10]);
            gc->visibleG1 = atoi (sql_row[11]);
            gc->visibleG2 = atoi (sql_row[12]);
            gc->visibleG3 = atoi (sql_row[13]);
            gc->visibleG4 = atoi (sql_row[14]);
            gc->visibleG5 = atoi (sql_row[15]);
            gc->visibleG6 = atoi (sql_row[16]);
            gc->visibleG7 = atoi (sql_row[17]);
            gc->Ghp0 = atoi (sql_row[18]);
            gc->Ghp1 = atoi (sql_row[19]);
            gc->Ghp2 = atoi (sql_row[20]);
            gc->Ghp3 = atoi (sql_row[21]);
            gc->Ghp4 = atoi (sql_row[22]);
            gc->Ghp5 = atoi (sql_row[23]);
            gc->Ghp6 = atoi (sql_row[24]);
            gc->Ghp7 = atoi (sql_row[25]);
            memcpy (WFIFOP (fd, len), gc, sizeof (struct guild_castle));
            len += sizeof (struct guild_castle);
        }
    }
    mysql_free_result (sql_res);
    WFIFOW (fd, 2) = len;
    WFIFOSET (fd, len);

    return 0;
}

//-------------------------------------------------------------------
// map serverからの通信

// ギルド作成要求
int mapif_parse_CreateGuild (int fd, int account_id, char *name,
                             struct guild_member *master)
{
    struct guild *g;
    int  i;

    printf ("CreateGuild\n");
    g = search_guildname (name);
    if (g != NULL && g->guild_id > 0)
    {
        printf ("int_guild: same name guild exists [%s]\n", name);
        mapif_guild_created (fd, account_id, NULL);
        return 0;
    }
    g = guild_pt;
    memset (g, 0, sizeof (struct guild));
    g->guild_id = guild_newid++;
    memcpy (g->name, name, 24);
    memcpy (g->master, master->name, 24);
    memcpy (&g->member[0], master, sizeof (struct guild_member));

    g->position[0].mode = 0x11;
    strcpy (g->position[0].name, "GuildMaster");
    strcpy (g->position[MAX_GUILDPOSITION - 1].name, "Newbie");
    for (i = 1; i < MAX_GUILDPOSITION - 1; i++)
        sprintf (g->position[i].name, "Position %d", i + 1);

    // Initialize guild property
    g->max_member = 100;
    g->average_lv = master->lv;
    g->castle_id = -1;
    for (i = 0; i < 5; i++)
        g->skill[i].id = i + 10000;

    // Save to sql
    printf ("Create initialize OK!\n");
    i = inter_guild_tosql (g, 255);

    if (i < 0)
    {
        mapif_guild_created (fd, account_id, NULL);
        return 0;
    }

    // Report to client
    mapif_guild_created (fd, account_id, g);
    mapif_guild_info (fd, g);

    inter_log ("guild %s (id=%d) created by master %s (id=%d)" RETCODE,
               name, g->guild_id, master->name, master->account_id);

    return 0;
}

// Return guild info to client
int mapif_parse_GuildInfo (int fd, int guild_id)
{
    struct guild *g;
    g = guild_pt;
    inter_guild_fromsql (guild_id, g);
    if (g != NULL && g->guild_id > 0)
    {
        guild_calcinfo (g);
        mapif_guild_info (fd, g);
        //inter_guild_tosql(g,1); // Change guild
    }
    else
        mapif_guild_noinfo (fd, guild_id);
    return 0;
}

// Add member to guild
int mapif_parse_GuildAddMember (int fd, int guild_id, struct guild_member *m)
{
    struct guild *g;
    int  i;
    g = guild_pt;
    inter_guild_fromsql (guild_id, g);

    if (g == NULL || g->guild_id <= 0)
    {
        mapif_guild_memberadded (fd, guild_id, m->account_id, m->char_id, 1);
        return 0;
    }

    for (i = 0; i < g->max_member; i++)
    {
        if (g->member[i].account_id == 0)
        {

            memcpy (&g->member[i], m, sizeof (struct guild_member));
            mapif_guild_memberadded (fd, guild_id, m->account_id, m->char_id,
                                     0);
            guild_calcinfo (g);
            mapif_guild_info (-1, g);
            inter_guild_tosql (g, 3);   // Change guild & guild_member
            return 0;
        }
    }
    mapif_guild_memberadded (fd, guild_id, m->account_id, m->char_id, 1);
    //inter_guild_tosql(g,3); // Change guild & guild_member
    return 0;
}

// Delete member from guild
int mapif_parse_GuildLeave (int fd, int guild_id, int account_id, int char_id,
                            int flag, const char *mes)
{
    struct guild *g = NULL;
    g = guild_pt;
    inter_guild_fromsql (guild_id, g);

    if (g != NULL && g->guild_id > 0)
    {
        int  i;
        for (i = 0; i < g->max_member; i++)
        {
            if (g->member[i].account_id == account_id &&
                g->member[i].char_id == char_id)
            {
                printf ("%d %d\n", i, (int) (&g->member[i]));
                printf ("%d %s\n", i, g->member[i].name);

                if (flag)
                {               // 追放の場合追放リストに入れる
                    int  j;
                    for (j = 0; j < MAX_GUILDEXPLUSION; j++)
                    {
                        if (g->explusion[j].account_id == 0)
                            break;
                    }
                    if (j == MAX_GUILDEXPLUSION)
                    {           // 一杯なので古いのを消す
                        for (j = 0; j < MAX_GUILDEXPLUSION - 1; j++)
                            g->explusion[j] = g->explusion[j + 1];
                        j = MAX_GUILDEXPLUSION - 1;
                    }
                    g->explusion[j].account_id = account_id;
                    memcpy (g->explusion[j].acc, "dummy", 24);
                    memcpy (g->explusion[j].name, g->member[i].name, 24);
                    memcpy (g->explusion[j].mes, mes, 40);
                }

                mapif_guild_leaved (guild_id, account_id, char_id, flag,
                                    g->member[i].name, mes);
                printf ("%d %d\n", i, (int) (&g->member[i]));
                printf ("%d %s\n", i, (&g->member[i])->name);
                memset (&g->member[i], 0, sizeof (struct guild_member));

                if (guild_check_empty (g) == 0)
                    mapif_guild_info (-1, g);   // まだ人がいるのでデータ送信
                /*
                 * else
                 * inter_guild_save();  // 解散したので一応セーブ
                 * return 0; */
            }
        }
        guild_calcinfo (g);
        inter_guild_tosql (g, 19);  // Change guild & guild_member & guild_expulsion
    }
    else
    {
        sprintf (tmp_sql,
                 "UPDATE `%s` SET `guild_id`='0' WHERE `account_id`='%d' AND `char_id`='%d'",
                 char_db, account_id, char_id);
        if (mysql_query (&mysql_handle, tmp_sql))
        {
            printf ("DB server Error (update `char`)- %s\n",
                    mysql_error (&mysql_handle));
        }
        /* mapif_guild_leaved(guild_id,account_id,char_id,flag,g->member[i].name,mes);  */
    }

    return 0;
}

// Change member info
int mapif_parse_GuildChangeMemberInfoShort (int fd, int guild_id,
                                            int account_id, int char_id,
                                            int online, int lv, int class)
{
    // Could speed up by manipulating only guild_member
    struct guild *g;
    int  i, alv, c;
    g = guild_pt;
    inter_guild_fromsql (guild_id, g);

    if (g == NULL || g->guild_id <= 0)
    {
        return 0;
    }

    g->connect_member = 0;

    for (i = 0, alv = 0, c = 0; i < g->max_member; i++)
    {
        if (g->member[i].account_id == account_id &&
            g->member[i].char_id == char_id)
        {

            g->member[i].online = online;
            g->member[i].lv = lv;
            g->member[i].class = class;
            mapif_guild_memberinfoshort (g, i);
        }
        if (g->member[i].account_id > 0)
        {
            alv += g->member[i].lv;
            c++;
        }
        if (g->member[i].online)
            g->connect_member++;
    }
    // 平均レベル
    g->average_lv = alv / c;

    inter_guild_tosql (g, 3);   // Change guild & guild_member

    return 0;
}

// BreakGuild
int mapif_parse_BreakGuild (int fd, int guild_id)
{
    struct guild *g;
    g = guild_pt;
    inter_guild_fromsql (guild_id, g);
    if (g == NULL)
    {
        return 0;
    }

    // Delete guild from sql
    //printf("- Delete guild %d from guild\n",guild_id);
    sprintf (tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'", guild_db,
             guild_id);
    if (mysql_query (&mysql_handle, tmp_sql))
    {
        printf ("DB server Error (delete `guild`)- %s\n",
                mysql_error (&mysql_handle));
    }
    //printf("- Delete guild %d from guild_member\n",guild_id);
    sprintf (tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",
             guild_member_db, guild_id);
    if (mysql_query (&mysql_handle, tmp_sql))
    {
        printf ("DB server Error (delete `guild_member`)- %s\n",
                mysql_error (&mysql_handle));
    }
    //printf("- Delete guild %d from guild_skill\n",guild_id);
    sprintf (tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",
             guild_skill_db, guild_id);
    if (mysql_query (&mysql_handle, tmp_sql))
    {
        printf ("DB server Error (delete `guild_skill`)- %s\n",
                mysql_error (&mysql_handle));
    }
    //printf("- Delete guild %d from guild_position\n",guild_id);
    sprintf (tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",
             guild_position_db, guild_id);
    if (mysql_query (&mysql_handle, tmp_sql))
    {
        printf ("DB server Error (delete `guild_position`)- %s\n",
                mysql_error (&mysql_handle));
    }
    //printf("- Delete guild %d from guild_expulsion\n",guild_id);
    sprintf (tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",
             guild_expulsion_db, guild_id);
    if (mysql_query (&mysql_handle, tmp_sql))
    {
        printf ("DB server Error (delete `guild_expulsion`)- %s\n",
                mysql_error (&mysql_handle));
    }
    //printf("- Delete guild %d from guild_alliance\n",guild_id);
    sprintf (tmp_sql,
             "DELETE FROM `%s` WHERE `guild_id`='%d' OR `alliance_id`='%d'",
             guild_alliance_db, guild_id, guild_id);
    if (mysql_query (&mysql_handle, tmp_sql))
    {
        printf ("DB server Error (delete `guild_position`)- %s\n",
                mysql_error (&mysql_handle));
    }

    //printf("- Delete guild %d from guild_castle\n",guild_id);
    sprintf (tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",
             guild_castle_db, guild_id);
    if (mysql_query (&mysql_handle, tmp_sql))
    {
        printf ("DB server Error (delete `guild_position`)- %s\n",
                mysql_error (&mysql_handle));
    }

    //printf("- Update guild %d of char\n",guild_id);
    sprintf (tmp_sql, "UPDATE `%s` SET `guild_id`='0' WHERE `guild_id`='%d'",
             char_db, guild_id);
    if (mysql_query (&mysql_handle, tmp_sql))
    {
        printf ("DB server Error (delete `guild_position`)- %s\n",
                mysql_error (&mysql_handle));
    }

    inter_guild_storage_delete (guild_id);
    mapif_guild_broken (guild_id, 0);

    inter_log ("guild %s (id=%d) broken" RETCODE, g->name, guild_id);

    return 0;
}

// ギルドメッセージ送信
int mapif_parse_GuildMessage (int fd, int guild_id, int account_id, char *mes,
                              int len)
{
    return mapif_guild_message (guild_id, account_id, mes, len);
}

// ギルド基本データ変更要求
int mapif_parse_GuildBasicInfoChange (int fd, int guild_id,
                                      int type, const char *data, int len)
{
    struct guild *g;
//  int dd=*((int *)data);
    short dw = *((short *) data);
    g = guild_pt;
    inter_guild_fromsql (guild_id, g);

    if (g == NULL || g->guild_id <= 0)
    {
        return 0;
    }
    switch (type)
    {
        case GBI_GUILDLV:
        {
            printf ("GBI_GUILDLV\n");
            if (dw > 0 && g->guild_lv + dw <= 50)
            {
                g->guild_lv += dw;
                g->skill_point += dw;
            }
            else if (dw < 0 && g->guild_lv + dw >= 1)
                g->guild_lv += dw;
            mapif_guild_info (-1, g);
            inter_guild_tosql (g, 1);
        }
            return 0;
        default:
            printf ("int_guild: GuildBasicInfoChange: Unknown type %d\n",
                    type);
            break;
    }
    mapif_guild_basicinfochanged (guild_id, type, data, len);
    //inter_guild_tosql(g,1); // Change guild
    return 0;
}

// ギルドメンバデータ変更要求
int mapif_parse_GuildMemberInfoChange (int fd, int guild_id, int account_id,
                                       int char_id, int type,
                                       const char *data, int len)
{
    // Could make some improvement in speed, because only change guild_member
    int  i;
    struct guild *g;
    g = guild_pt;
    inter_guild_fromsql (guild_id, g);
    //printf("GuildMemberInfoChange %s \n",(type==GMI_EXP)?"GMI_EXP":"OTHER");

    if (g == NULL)
    {
        return 0;
    }
    for (i = 0; i < g->max_member; i++)
        if (g->member[i].account_id == account_id &&
            g->member[i].char_id == char_id)
            break;
    if (i == g->max_member)
    {
        printf ("int_guild: GuildMemberChange: Not found %d,%d in %d[%s]\n",
                account_id, char_id, guild_id, g->name);
        return 0;
    }
    switch (type)
    {
        case GMI_POSITION:     // 役職
            g->member[i].position = *((int *) data);
            break;
        case GMI_EXP:
        {                       // EXP
            int  exp, oldexp = g->member[i].exp;
            exp = g->member[i].exp = *((unsigned int *) data);
            g->exp += (exp - oldexp);
            guild_calcinfo (g); // Lvアップ判断
            mapif_guild_basicinfochanged (guild_id, GBI_EXP, &g->exp, 4);
        } break;
        default:
            printf ("int_guild: GuildMemberInfoChange: Unknown type %d\n",
                    type);
            break;
    }
    mapif_guild_memberinfochanged (guild_id, account_id, char_id, type, data,
                                   len);
    inter_guild_tosql (g, 3);   // Change guild & guild_member
    return 0;
}

// ギルド役職名変更要求
int mapif_parse_GuildPosition (int fd, int guild_id, int idx,
                               struct guild_position *p)
{
    // Could make some improvement in speed, because only change guild_position
    struct guild *g;
    g = guild_pt;
    inter_guild_fromsql (guild_id, g);

    if (g == NULL || idx < 0 || idx >= MAX_GUILDPOSITION)
    {
        return 0;
    }
    memcpy (&g->position[idx], p, sizeof (struct guild_position));
    mapif_guild_position (g, idx);
    printf ("int_guild: position changed %d\n", idx);
    inter_guild_tosql (g, 4);   // Change guild_position
    return 0;
}

// ギルドスキルアップ要求
int mapif_parse_GuildSkillUp (int fd, int guild_id, int skill_num,
                              int account_id)
{
    // Could make some improvement in speed, because only change guild_position
    struct guild *g;
    g = guild_pt;
    inter_guild_fromsql (guild_id, g);
    int  idx = skill_num - 10000;
    if (g == NULL || skill_num < 10000)
        return 0;
    //printf("GuildSkillUp\n");

    if (g->skill_point > 0 && g->skill[idx].id > 0 && g->skill[idx].lv < 10)
    {
        g->skill[idx].lv++;
        g->skill_point--;
        if (guild_calcinfo (g) == 0)
            mapif_guild_info (-1, g);
        mapif_guild_skillupack (guild_id, skill_num, account_id);
        printf ("int_guild: skill %d up\n", skill_num);
        inter_guild_tosql (g, 33);  // Change guild & guild_skill
    }

    return 0;
}

// ギルド同盟要求
int mapif_parse_GuildAlliance (int fd, int guild_id1, int guild_id2,
                               int account_id1, int account_id2, int flag)
{
    // Could speed up
    struct guild *g[2];
    int  j, i;
    g[0] = guild_pt;
    g[1] = guild_pt2;
    inter_guild_fromsql (guild_id1, g[0]);
    inter_guild_fromsql (guild_id2, g[1]);

    if (g[0] == NULL || g[1] == NULL || g[0]->guild_id == 0
        || g[1]->guild_id == 0)
        return 0;

    if (!(flag & 0x8))
    {
        for (i = 0; i < 2 - (flag & 1); i++)
        {
            for (j = 0; j < MAX_GUILDALLIANCE; j++)
                if (g[i]->alliance[j].guild_id == 0)
                {
                    g[i]->alliance[j].guild_id = g[1 - i]->guild_id;
                    memcpy (g[i]->alliance[j].name, g[1 - i]->name, 24);
                    g[i]->alliance[j].opposition = flag & 1;
                    break;
                }
        }
    }
    else
    {                           // 関係解消
        for (i = 0; i < 2 - (flag & 1); i++)
        {
            for (j = 0; j < MAX_GUILDALLIANCE; j++)
                if (g[i]->alliance[j].guild_id == g[1 - i]->guild_id &&
                    g[i]->alliance[j].opposition == (flag & 1))
                {
                    g[i]->alliance[j].guild_id = 0;
                    break;
                }
        }
    }
    mapif_guild_alliance (guild_id1, guild_id2, account_id1, account_id2,
                          flag, g[0]->name, g[1]->name);
    inter_guild_tosql (g[0], 8);    // Change guild_alliance
    inter_guild_tosql (g[1], 8);    // Change guild_alliance
    return 0;
}

// ギルド告知変更要求
int mapif_parse_GuildNotice (int fd, int guild_id, const char *mes1,
                             const char *mes2)
{
    struct guild *g;
    g = guild_pt;
    inter_guild_fromsql (guild_id, g);

    if (g == NULL || g->guild_id <= 0)
        return 0;
    memcpy (g->mes1, mes1, 60);
    memcpy (g->mes2, mes2, 120);
    inter_guild_tosql (g, 1);   // Change mes of guild
    return mapif_guild_notice (g);
}

// ギルドエンブレム変更要求
int mapif_parse_GuildEmblem (int fd, int len, int guild_id, int dummy,
                             const char *data)
{
    struct guild *g;
    g = guild_pt;
    inter_guild_fromsql (guild_id, g);

    if (g == NULL || g->guild_id <= 0)
        return 0;
    memcpy (g->emblem_data, data, len);
    g->emblem_len = len;
    g->emblem_id++;
    inter_guild_tosql (g, 1);   // Change guild
    return mapif_guild_emblem (g);
}

int mapif_parse_GuildCastleDataLoad (int fd, int castle_id, int index)  // <Agit>
{
    struct guild_castle *gc = guildcastle_pt;
    inter_guildcastle_fromsql (castle_id, gc);
    if (gc == NULL || gc->castle_id == -1)
    {
        return mapif_guild_castle_dataload (castle_id, 0, 0);
    }
    switch (index)
    {
        case 1:
            return mapif_guild_castle_dataload (gc->castle_id, index,
                                                gc->guild_id);
            break;
        case 2:
            return mapif_guild_castle_dataload (gc->castle_id, index,
                                                gc->economy);
            break;
        case 3:
            return mapif_guild_castle_dataload (gc->castle_id, index,
                                                gc->defense);
            break;
        case 4:
            return mapif_guild_castle_dataload (gc->castle_id, index,
                                                gc->triggerE);
            break;
        case 5:
            return mapif_guild_castle_dataload (gc->castle_id, index,
                                                gc->triggerD);
            break;
        case 6:
            return mapif_guild_castle_dataload (gc->castle_id, index,
                                                gc->nextTime);
            break;
        case 7:
            return mapif_guild_castle_dataload (gc->castle_id, index,
                                                gc->payTime);
            break;
        case 8:
            return mapif_guild_castle_dataload (gc->castle_id, index,
                                                gc->createTime);
            break;
        case 9:
            return mapif_guild_castle_dataload (gc->castle_id, index,
                                                gc->visibleC);
            break;
        case 10:
            return mapif_guild_castle_dataload (gc->castle_id, index,
                                                gc->visibleG0);
            break;
        case 11:
            return mapif_guild_castle_dataload (gc->castle_id, index,
                                                gc->visibleG1);
            break;
        case 12:
            return mapif_guild_castle_dataload (gc->castle_id, index,
                                                gc->visibleG2);
            break;
        case 13:
            return mapif_guild_castle_dataload (gc->castle_id, index,
                                                gc->visibleG3);
            break;
        case 14:
            return mapif_guild_castle_dataload (gc->castle_id, index,
                                                gc->visibleG4);
            break;
        case 15:
            return mapif_guild_castle_dataload (gc->castle_id, index,
                                                gc->visibleG5);
            break;
        case 16:
            return mapif_guild_castle_dataload (gc->castle_id, index,
                                                gc->visibleG6);
            break;
        case 17:
            return mapif_guild_castle_dataload (gc->castle_id, index,
                                                gc->visibleG7);
            break;
        case 18:
            return mapif_guild_castle_dataload (gc->castle_id, index,
                                                gc->Ghp0);
            break;              // guardian HP [Valaris]
        case 19:
            return mapif_guild_castle_dataload (gc->castle_id, index,
                                                gc->Ghp1);
            break;
        case 20:
            return mapif_guild_castle_dataload (gc->castle_id, index,
                                                gc->Ghp2);
            break;
        case 21:
            return mapif_guild_castle_dataload (gc->castle_id, index,
                                                gc->Ghp3);
            break;
        case 22:
            return mapif_guild_castle_dataload (gc->castle_id, index,
                                                gc->Ghp4);
            break;
        case 23:
            return mapif_guild_castle_dataload (gc->castle_id, index,
                                                gc->Ghp5);
            break;
        case 24:
            return mapif_guild_castle_dataload (gc->castle_id, index,
                                                gc->Ghp6);
            break;
        case 25:
            return mapif_guild_castle_dataload (gc->castle_id, index,
                                                gc->Ghp7);
            break;              // end additions [Valaris]
        default:
            printf
                ("mapif_parse_GuildCastleDataLoad ERROR!! (Not found index=%d)\n",
                 index);
            return 0;
    }
}

int mapif_parse_GuildCastleDataSave (int fd, int castle_id, int index, int value)   // <Agit>
{
    struct guild_castle *gc = guildcastle_pt;
    inter_guildcastle_fromsql (castle_id, gc);
    if (gc == NULL || gc->castle_id == -1)
    {
        return mapif_guild_castle_datasave (castle_id, index, value);
    }
    switch (index)
    {
        case 1:
            if (gc->guild_id != value)
            {
                int  gid = (value) ? value : gc->guild_id;
                struct guild *g = guild_pt;
                inter_guild_fromsql (gid, g);
                inter_log ("guild %s (id=%d) %s castle id=%d" RETCODE,
                           (g) ? g->name : "??", gid,
                           (value) ? "occupy" : "abandon", index);
            }
            gc->guild_id = value;
            break;
        case 2:
            gc->economy = value;
            break;
        case 3:
            gc->defense = value;
            break;
        case 4:
            gc->triggerE = value;
            break;
        case 5:
            gc->triggerD = value;
            break;
        case 6:
            gc->nextTime = value;
            break;
        case 7:
            gc->payTime = value;
            break;
        case 8:
            gc->createTime = value;
            break;
        case 9:
            gc->visibleC = value;
            break;
        case 10:
            gc->visibleG0 = value;
            break;
        case 11:
            gc->visibleG1 = value;
            break;
        case 12:
            gc->visibleG2 = value;
            break;
        case 13:
            gc->visibleG3 = value;
            break;
        case 14:
            gc->visibleG4 = value;
            break;
        case 15:
            gc->visibleG5 = value;
            break;
        case 16:
            gc->visibleG6 = value;
            break;
        case 17:
            gc->visibleG7 = value;
            break;
        case 18:
            gc->Ghp0 = value;
            break;              // guardian HP [Valaris]
        case 19:
            gc->Ghp1 = value;
            break;
        case 20:
            gc->Ghp2 = value;
            break;
        case 21:
            gc->Ghp3 = value;
            break;
        case 22:
            gc->Ghp4 = value;
            break;
        case 23:
            gc->Ghp5 = value;
            break;
        case 24:
            gc->Ghp6 = value;
            break;
        case 25:
            gc->Ghp7 = value;
            break;              // end additions [Valaris]
        default:
            printf
                ("mapif_parse_GuildCastleDataSave ERROR!! (Not found index=%d)\n",
                 index);
            return 0;
    }
    inter_guildcastle_tosql (gc);
    return mapif_guild_castle_datasave (gc->castle_id, index, value);
}

// ギルドチェック要求
int mapif_parse_GuildCheck (int fd, int guild_id, int account_id, int char_id)
{
    // What does this mean? Check if belong to another guild?
    return 0;
}

// map server からの通信
// ・1パケットのみ解析すること
// ・パケット長データはinter.cにセットしておくこと
// ・パケット長チェックや、RFIFOSKIPは呼び出し元で行われるので行ってはならない
// ・エラーなら0(false)、そうでないなら1(true)をかえさなければならない
int inter_guild_parse_frommap (int fd)
{
    switch (RFIFOW (fd, 0))
    {
        case 0x3030:
            mapif_parse_CreateGuild (fd, RFIFOL (fd, 4), RFIFOP (fd, 8),
                                     (struct guild_member *) RFIFOP (fd, 32));
            break;
        case 0x3031:
            mapif_parse_GuildInfo (fd, RFIFOL (fd, 2));
            break;
        case 0x3032:
            mapif_parse_GuildAddMember (fd, RFIFOL (fd, 4),
                                        (struct guild_member *) RFIFOP (fd,
                                                                        8));
            break;
        case 0x3034:
            mapif_parse_GuildLeave (fd, RFIFOL (fd, 2), RFIFOL (fd, 6),
                                    RFIFOL (fd, 10), RFIFOB (fd, 14),
                                    RFIFOP (fd, 15));
            break;
        case 0x3035:
            mapif_parse_GuildChangeMemberInfoShort (fd, RFIFOL (fd, 2),
                                                    RFIFOL (fd, 6),
                                                    RFIFOL (fd, 10),
                                                    RFIFOB (fd, 14),
                                                    RFIFOW (fd, 15),
                                                    RFIFOW (fd, 17));
            break;
        case 0x3036:
            mapif_parse_BreakGuild (fd, RFIFOL (fd, 2));
            break;
        case 0x3037:
            mapif_parse_GuildMessage (fd, RFIFOL (fd, 4), RFIFOL (fd, 8),
                                      RFIFOP (fd, 12), RFIFOW (fd, 2) - 12);
            break;
        case 0x3038:
            mapif_parse_GuildCheck (fd, RFIFOL (fd, 2), RFIFOL (fd, 6),
                                    RFIFOL (fd, 10));
            break;
        case 0x3039:
            mapif_parse_GuildBasicInfoChange (fd, RFIFOL (fd, 4),
                                              RFIFOW (fd, 8), RFIFOP (fd, 10),
                                              RFIFOW (fd, 2) - 10);
            break;
        case 0x303A:
            mapif_parse_GuildMemberInfoChange (fd, RFIFOL (fd, 4),
                                               RFIFOL (fd, 8), RFIFOL (fd,
                                                                       12),
                                               RFIFOW (fd, 16), RFIFOP (fd,
                                                                        18),
                                               RFIFOW (fd, 2) - 18);
            break;
        case 0x303B:
            mapif_parse_GuildPosition (fd, RFIFOL (fd, 4), RFIFOL (fd, 8),
                                       (struct guild_position *) RFIFOP (fd,
                                                                         12));
            break;
        case 0x303C:
            mapif_parse_GuildSkillUp (fd, RFIFOL (fd, 2), RFIFOL (fd, 6),
                                      RFIFOL (fd, 10));
            break;
        case 0x303D:
            mapif_parse_GuildAlliance (fd, RFIFOL (fd, 2), RFIFOL (fd, 6),
                                       RFIFOL (fd, 10), RFIFOL (fd, 14),
                                       RFIFOB (fd, 18));
            break;
        case 0x303E:
            mapif_parse_GuildNotice (fd, RFIFOL (fd, 2), RFIFOP (fd, 6),
                                     RFIFOP (fd, 66));
            break;
        case 0x303F:
            mapif_parse_GuildEmblem (fd, RFIFOW (fd, 2) - 12, RFIFOL (fd, 4),
                                     RFIFOL (fd, 8), RFIFOP (fd, 12));
            break;
        case 0x3040:
            mapif_parse_GuildCastleDataLoad (fd, RFIFOW (fd, 2),
                                             RFIFOB (fd, 4));
            break;
        case 0x3041:
            mapif_parse_GuildCastleDataSave (fd, RFIFOW (fd, 2),
                                             RFIFOB (fd, 4), RFIFOL (fd, 5));
            break;

        default:
            return 0;
    }
    return 1;
}

int inter_guild_mapif_init (int fd)
{
    return mapif_guild_castle_alldataload (fd);
}

// サーバーから脱退要求(キャラ削除用)
int inter_guild_leave (int guild_id, int account_id, int char_id)
{
    return mapif_parse_GuildLeave (-1, guild_id, account_id, char_id, 0,
                                   "**サーバー命令**");
}