/**
 * This file is part of Hercules.
 * http://herc.ws - http://github.com/HerculesWS/Hercules
 *
 * Copyright (C) 2012-2018  Hercules Dev Team
 * Copyright (C)  Athena Dev Teams
 *
 * Hercules is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
#ifndef MAP_INTIF_H
#define MAP_INTIF_H

#include "common/hercules.h"

/**
 * Declarations
 **/
struct auction_data;
struct guild_member;
struct guild_position;
struct guild_storage;
struct mail_message;
struct map_session_data;
struct party_member;
struct s_elemental;
struct s_homunculus;
struct s_mercenary;
struct s_pet;
struct rodex_message;

/**
 * Defines
 **/
#define intif_rename_pc(sd, name)  (intif->rename((sd), 0, (name)))
#define intif_rename_pet(sd, name) (intif->rename((sd), 1, (name)))
#define intif_rename_hom(sd, name) (intif->rename((sd), 2, (name)))
#define INTIF_PACKET_LEN_TABLE_SIZE 161


/*=====================================
* Interface : intif.h
* Generated by HerculesInterfaceMaker
* created by Susu
*-------------------------------------*/
struct intif_interface {
	/* */
	int packet_len_table[INTIF_PACKET_LEN_TABLE_SIZE];
	/* funcs */
	int (*parse) (int fd);
	int (*create_pet)(int account_id, int char_id, short pet_type, short pet_lv, int pet_egg_id,
	                  int pet_equip, short intimate, short hungry, char rename_flag, char incubate, char *pet_name);
	int (*broadcast) (const char *mes, int len, int type);
	int (*broadcast2) (const char *mes, int len, unsigned int fontColor, short fontType, short fontSize, short fontAlign, short fontY);
	int (*main_message) (struct map_session_data* sd, const char* message);
	int (*wis_message) (struct map_session_data *sd, const char *nick, const char *mes, int mes_len);
	int (*wis_message_to_gm) (char *Wisp_name, int permission, char *mes);
	int (*saveregistry) (struct map_session_data *sd);
	int (*request_registry) (struct map_session_data *sd, int flag);
	void (*request_account_storage) (const struct map_session_data *sd);
	void (*send_account_storage) (struct map_session_data *sd);
	int (*request_guild_storage) (int account_id, int guild_id);
	int (*send_guild_storage) (int account_id, struct guild_storage *gstor);
	int (*create_party) (struct party_member *member, const char *name, int item, int item2);
	int (*request_partyinfo) (int party_id, int char_id);
	int (*party_addmember) (int party_id,struct party_member *member);
	int (*party_changeoption) (int party_id, int account_id, int exp, int item);
	int (*party_leave) (int party_id,int account_id, int char_id);
	int (*party_changemap) (struct map_session_data *sd, int online);
	int (*break_party) (int party_id);
	int (*party_message) (int party_id, int account_id, const char *mes,int len);
	int (*party_leaderchange) (int party_id,int account_id,int char_id);
	int (*guild_create) (const char *name, const struct guild_member *master);
	int (*guild_request_info) (int guild_id);
	int (*guild_addmember) (int guild_id, struct guild_member *m);
	int (*guild_leave) (int guild_id, int account_id, int char_id, int flag, const char *mes);
	int (*guild_memberinfoshort) (int guild_id, int account_id, int char_id, int online, int lv, int16 class);
	int (*guild_break) (int guild_id);
	int (*guild_message) (int guild_id, int account_id, const char *mes, int len);
	int (*guild_change_gm) (int guild_id, const char *name, int len);
	int (*guild_change_basicinfo) (int guild_id, int type, const void *data, int len);
	int (*guild_change_memberinfo) (int guild_id, int account_id, int char_id, int type, const void *data, int len);
	int (*guild_position) (int guild_id, int idx, struct guild_position *p);
	int (*guild_skillup) (int guild_id, uint16 skill_id, int account_id, int max);
	int (*guild_alliance) (int guild_id1, int guild_id2, int account_id1, int account_id2, int flag);
	int (*guild_notice) (int guild_id, const char *mes1, const char *mes2);
	int (*guild_emblem) (int guild_id, int len, const char *data);
	int (*guild_castle_dataload) (int num, int *castle_ids);
	int (*guild_castle_datasave) (int castle_id, int index, int value);
	void (*itembound_req) (int char_id, int aid, int guild_id);
	int (*request_petdata) (int account_id, int char_id, int pet_id);
	int (*save_petdata) (int account_id, struct s_pet *p);
	int (*delete_petdata) (int pet_id);
	int (*rename) (struct map_session_data *sd, int type, const char *name);
	int (*homunculus_create) (int account_id, struct s_homunculus *sh);
	bool (*homunculus_requestload) (int account_id, int homun_id);
	int (*homunculus_requestsave) (int account_id, struct s_homunculus* sh);
	int (*homunculus_requestdelete) (int homun_id);
	/******QUEST SYTEM*******/
	void (*request_questlog) (struct map_session_data * sd);
	int (*quest_save) (struct map_session_data * sd);
	// MERCENARY SYSTEM
	int (*mercenary_create) (struct s_mercenary *merc);
	int (*mercenary_request) (int merc_id, int char_id);
	int (*mercenary_delete) (int merc_id);
	int (*mercenary_save) (struct s_mercenary *merc);
	// MAIL SYSTEM
	int (*Mail_requestinbox) (int char_id, unsigned char flag);
	int (*Mail_read) (int mail_id);
	int (*Mail_getattach) (int char_id, int mail_id);
	int (*Mail_delete) (int char_id, int mail_id);
	int (*Mail_return) (int char_id, int mail_id);
	int (*Mail_send) (int account_id, struct mail_message *msg);
	// AUCTION SYSTEM
	int (*Auction_requestlist) (int char_id, short type, int price, const char* searchtext, short page);
	int (*Auction_register) (struct auction_data *auction);
	int (*Auction_cancel) (int char_id, unsigned int auction_id);
	int (*Auction_close) (int char_id, unsigned int auction_id);
	int (*Auction_bid) (int char_id, const char* name, unsigned int auction_id, int bid);
	// ELEMENTAL SYSTEM
	int (*elemental_create) (struct s_elemental *ele);
	int (*elemental_request) (int ele_id, int char_id);
	int (*elemental_delete) (int ele_id);
	int (*elemental_save) (struct s_elemental *ele);
	// RoDEX
	int(*rodex_requestinbox) (int char_id, int account_id, int8 flag, int8 opentype, int64 mail_id);
	int(*rodex_checkhasnew) (struct map_session_data *sd);
	int(*rodex_updatemail) (int64 mail_id, int8 flag);
	int(*rodex_sendmail) (struct rodex_message *msg);
	int(*rodex_checkname) (struct map_session_data *sd, const char *name);
	/* Clan System */
	int (*clan_kickoffline) (int clan_id, int kick_interval);
	int (*clan_membercount) (int clan_id, int kick_interval);
	/* @accinfo */
	void (*request_accinfo) (int u_fd, int aid, int group_lv, char* query);
	/* */
	int (*CheckForCharServer) (void);
	/* Achievement System [Smokexyz/Hercules] */
	void(*achievements_request) (struct map_session_data *sd);
	void(*achievements_save) (struct map_session_data *sd);
	/* */
	void (*pWisMessage) (int fd);
	void (*pWisEnd) (int fd);
	int (*pWisToGM_sub) (struct map_session_data* sd,va_list va);
	void (*pWisToGM) (int fd);
	void (*pRegisters) (int fd);
	void (*pAccountStorage) (int fd);
	void (*pChangeNameOk) (int fd);
	void (*pMessageToFD) (int fd);
	void (*pAccountStorageSaveAck) (int fd);
	void (*pLoadGuildStorage) (int fd);
	void (*pSaveGuildStorage) (int fd);
	void (*pPartyCreated) (int fd);
	void (*pPartyInfo) (int fd);
	void (*pPartyMemberAdded) (int fd);
	void (*pPartyOptionChanged) (int fd);
	void (*pPartyMemberWithdraw) (int fd);
	void (*pPartyMove) (int fd);
	void (*pPartyBroken) (int fd);
	void (*pPartyMessage) (int fd);
	void (*pGuildCreated) (int fd);
	void (*pGuildInfo) (int fd);
	void (*pGuildMemberAdded) (int fd);
	void (*pGuildMemberWithdraw) (int fd);
	void (*pGuildMemberInfoShort) (int fd);
	void (*pGuildBroken) (int fd);
	void (*pGuildMessage) (int fd);
	void (*pGuildBasicInfoChanged) (int fd);
	void (*pGuildMemberInfoChanged) (int fd);
	void (*pGuildPosition) (int fd);
	void (*pGuildSkillUp) (int fd);
	void (*pGuildAlliance) (int fd);
	void (*pGuildNotice) (int fd);
	void (*pGuildEmblem) (int fd);
	void (*pGuildCastleDataLoad) (int fd);
	void (*pGuildMasterChanged) (int fd);
	void (*pQuestLog) (int fd);
	void (*pQuestSave) (int fd);
	void (*pMailInboxReceived) (int fd);
	void (*pMailNew) (int fd);
	void (*pMailGetAttach) (int fd);
	void (*pMailDelete) (int fd);
	void (*pMailReturn) (int fd);
	void (*pMailSend) (int fd);
	void (*pAuctionResults) (int fd);
	void (*pAuctionRegister) (int fd);
	void (*pAuctionCancel) (int fd);
	void (*pAuctionClose) (int fd);
	void (*pAuctionMessage) (int fd);
	void (*pAuctionBid) (int fd);
	void (*pItembound_ack) (int fd);
	void (*pMercenaryReceived) (int fd);
	void (*pMercenaryDeleted) (int fd);
	void (*pMercenarySaved) (int fd);
	void (*pElementalReceived) (int fd);
	void (*pElementalDeleted) (int fd);
	void (*pElementalSaved) (int fd);
	void (*pCreatePet) (int fd);
	void (*pRecvPetData) (int fd);
	void (*pSavePetOk) (int fd);
	void (*pDeletePetOk) (int fd);
	void (*pCreateHomunculus) (int fd);
	void (*pRecvHomunculusData) (int fd);
	void (*pSaveHomunculusOk) (int fd);
	void (*pDeleteHomunculusOk) (int fd);
	/* RoDEX */
	void(*pRequestRodexOpenInbox) (int fd);
	void(*pRodexHasNew) (int fd);
	void(*pRodexSendMail) (int fd);
	void(*pRodexCheckName) (int fd);
	/* Clan System */
	void (*pRecvClanMemberAction) (int fd);
	/* Achievements */
	void (*pAchievementsLoad) (int fd);
};

#ifdef HERCULES_CORE
void intif_defaults(void);
#endif // HERCULES_CORE

HPShared struct intif_interface *intif;

#endif /* MAP_INTIF_H */
