diff options
Diffstat (limited to 'src/map')
-rw-r--r-- | src/map/Makefile.in | 4 | ||||
-rw-r--r-- | src/map/atcommand.c | 1 | ||||
-rw-r--r-- | src/map/duel.c | 189 | ||||
-rw-r--r-- | src/map/duel.h | 29 | ||||
-rw-r--r-- | src/map/map.c | 3 | ||||
-rw-r--r-- | src/map/pc.c | 168 | ||||
-rw-r--r-- | src/map/pc.h | 19 | ||||
-rw-r--r-- | src/map/unit.c | 1 |
8 files changed, 226 insertions, 188 deletions
diff --git a/src/map/Makefile.in b/src/map/Makefile.in index f45f4dd00..7070a0a9d 100644 --- a/src/map/Makefile.in +++ b/src/map/Makefile.in @@ -18,7 +18,7 @@ MAP_OBJ = map.o chrif.o clif.o pc.o status.o npc.o \ storage.o skill.o atcommand.o battle.o battleground.o \ intif.o trade.o party.o vending.o guild.o pet.o \ log.o mail.o date.o unit.o homunculus.o mercenary.o quest.o instance.o \ - buyingstore.o searchstore.o + buyingstore.o searchstore.o duel.o MAP_TXT_OBJ = $(MAP_OBJ:%=obj_txt/%) \ obj_txt/mapreg_txt.o MAP_SQL_OBJ = $(MAP_OBJ:%=obj_sql/%) \ @@ -28,7 +28,7 @@ MAP_H = map.h chrif.h clif.h pc.h status.h npc.h \ storage.h skill.h atcommand.h battle.h battleground.h \ intif.h trade.h party.h vending.h guild.h pet.h \ log.h mail.h date.h unit.h homunculus.h mercenary.h quest.h instance.h mapreg.h \ - buyingstore.h searchstore.h + buyingstore.h searchstore.h duel.h HAVE_MYSQL=@HAVE_MYSQL@ ifeq ($(HAVE_MYSQL),yes) diff --git a/src/map/atcommand.c b/src/map/atcommand.c index 090bc0e6e..b51e7ce95 100644 --- a/src/map/atcommand.c +++ b/src/map/atcommand.c @@ -17,6 +17,7 @@ #include "chat.h" #include "clif.h" #include "chrif.h" +#include "duel.h" #include "intif.h" #include "itemdb.h" #include "log.h" diff --git a/src/map/duel.c b/src/map/duel.c new file mode 100644 index 000000000..7621b92be --- /dev/null +++ b/src/map/duel.c @@ -0,0 +1,189 @@ +// Copyright (c) Athena Dev Teams - Licensed under GNU GPL +// For more information, see LICENCE in the main folder + +#include "../common/cbasetypes.h" + +#include "atcommand.h" // msg_txt +#include "clif.h" +#include "duel.h" +#include "pc.h" + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <time.h> + +struct duel duel_list[MAX_DUEL]; +int duel_count = 0; + +/*========================================== + * Duel organizing functions [LuzZza] + *------------------------------------------*/ +void duel_savetime(struct map_session_data* sd) +{ + time_t timer; + struct tm *t; + + time(&timer); + t = localtime(&timer); + + pc_setglobalreg(sd, "PC_LAST_DUEL_TIME", t->tm_mday*24*60 + t->tm_hour*60 + t->tm_min); + return; +} + +int duel_checktime(struct map_session_data* sd) +{ + int diff; + time_t timer; + struct tm *t; + + time(&timer); + t = localtime(&timer); + + diff = t->tm_mday*24*60 + t->tm_hour*60 + t->tm_min - pc_readglobalreg(sd, "PC_LAST_DUEL_TIME"); + + return !(diff >= 0 && diff < battle_config.duel_time_interval); +} +static int duel_showinfo_sub(struct map_session_data* sd, va_list va) +{ + struct map_session_data *ssd = va_arg(va, struct map_session_data*); + int *p = va_arg(va, int*); + char output[256]; + + if (sd->duel_group != ssd->duel_group) return 0; + + sprintf(output, " %d. %s", ++(*p), sd->status.name); + clif_disp_onlyself(ssd, output, strlen(output)); + return 1; +} + +int duel_showinfo(const unsigned int did, struct map_session_data* sd) +{ + int p=0; + char output[256]; + + if(duel_list[did].max_players_limit > 0) + sprintf(output, msg_txt(370), //" -- Duels: %d/%d, Members: %d/%d, Max players: %d --" + did, duel_count, + duel_list[did].members_count, + duel_list[did].members_count + duel_list[did].invites_count, + duel_list[did].max_players_limit); + else + sprintf(output, msg_txt(371), //" -- Duels: %d/%d, Members: %d/%d --" + did, duel_count, + duel_list[did].members_count, + duel_list[did].members_count + duel_list[did].invites_count); + + clif_disp_onlyself(sd, output, strlen(output)); + map_foreachpc(duel_showinfo_sub, sd, &p); + return 0; +} + +int duel_create(struct map_session_data* sd, const unsigned int maxpl) +{ + int i=1; + char output[256]; + + while(duel_list[i].members_count > 0 && i < MAX_DUEL) i++; + if(i == MAX_DUEL) return 0; + + duel_count++; + sd->duel_group = i; + duel_list[i].members_count++; + duel_list[i].invites_count = 0; + duel_list[i].max_players_limit = maxpl; + + strcpy(output, msg_txt(372)); // " -- Duel has been created (@invite/@leave) --" + clif_disp_onlyself(sd, output, strlen(output)); + + clif_map_property(sd, MAPPROPERTY_FREEPVPZONE); + //clif_misceffect2(&sd->bl, 159); + return i; +} + +int duel_invite(const unsigned int did, struct map_session_data* sd, struct map_session_data* target_sd) +{ + char output[256]; + + // " -- Player %s invites %s to duel --" + sprintf(output, msg_txt(373), sd->status.name, target_sd->status.name); + clif_disp_message(&sd->bl, output, strlen(output), DUEL_WOS); + + target_sd->duel_invite = did; + duel_list[did].invites_count++; + + // "Blue -- Player %s invites you to PVP duel (@accept/@reject) --" + sprintf(output, msg_txt(374), sd->status.name); + clif_broadcast((struct block_list *)target_sd, output, strlen(output)+1, 0x10, SELF); + return 0; +} + +static int duel_leave_sub(struct map_session_data* sd, va_list va) +{ + int did = va_arg(va, int); + if (sd->duel_invite == did) + sd->duel_invite = 0; + return 0; +} + +int duel_leave(const unsigned int did, struct map_session_data* sd) +{ + char output[256]; + + // " <- Player %s has left duel --" + sprintf(output, msg_txt(375), sd->status.name); + clif_disp_message(&sd->bl, output, strlen(output), DUEL_WOS); + + duel_list[did].members_count--; + + if(duel_list[did].members_count == 0) { + map_foreachpc(duel_leave_sub, did); + duel_count--; + } + + sd->duel_group = 0; + duel_savetime(sd); + clif_map_property(sd, MAPPROPERTY_NOTHING); + return 0; +} + +int duel_accept(const unsigned int did, struct map_session_data* sd) +{ + char output[256]; + + duel_list[did].members_count++; + sd->duel_group = sd->duel_invite; + duel_list[did].invites_count--; + sd->duel_invite = 0; + + // " -> Player %s has accepted duel --" + sprintf(output, msg_txt(376), sd->status.name); + clif_disp_message(&sd->bl, output, strlen(output), DUEL_WOS); + + clif_map_property(sd, MAPPROPERTY_FREEPVPZONE); + //clif_misceffect2(&sd->bl, 159); + return 0; +} + +int duel_reject(const unsigned int did, struct map_session_data* sd) +{ + char output[256]; + + // " -- Player %s has rejected duel --" + sprintf(output, msg_txt(377), sd->status.name); + clif_disp_message(&sd->bl, output, strlen(output), DUEL_WOS); + + duel_list[did].invites_count--; + sd->duel_invite = 0; + return 0; +} + +void do_final_duel(void) +{ +} + +int do_init_duel(void) +{ + memset(&duel_list[0], 0, sizeof(duel_list)); + return 0; +} diff --git a/src/map/duel.h b/src/map/duel.h new file mode 100644 index 000000000..674d0e12f --- /dev/null +++ b/src/map/duel.h @@ -0,0 +1,29 @@ +// Copyright (c) Athena Dev Teams - Licensed under GNU GPL +// For more information, see LICENCE in the main folder + +#ifndef _DUEL_H_ +#define _DUEL_H_ + +struct duel { + int members_count; + int invites_count; + int max_players_limit; +}; + +#define MAX_DUEL 1024 +extern struct duel duel_list[MAX_DUEL]; +extern int duel_count; + +//Duel functions // [LuzZza] +int duel_create(struct map_session_data* sd, const unsigned int maxpl); +int duel_invite(const unsigned int did, struct map_session_data* sd, struct map_session_data* target_sd); +int duel_accept(const unsigned int did, struct map_session_data* sd); +int duel_reject(const unsigned int did, struct map_session_data* sd); +int duel_leave(const unsigned int did, struct map_session_data* sd); +int duel_showinfo(const unsigned int did, struct map_session_data* sd); +int duel_checktime(struct map_session_data* sd); + +int do_init_duel(void); +void do_final_duel(void); + +#endif /* _DUEL_H_ */ diff --git a/src/map/map.c b/src/map/map.c index 9f9c93608..5ee01bc6d 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -17,6 +17,7 @@ #include "path.h" #include "chrif.h" #include "clif.h" +#include "duel.h" #include "intif.h" #include "npc.h" #include "pc.h" @@ -3438,6 +3439,7 @@ void do_final(void) do_final_status(); do_final_unit(); do_final_battleground(); + do_final_duel(); map_db->destroy(map_db, map_db_final); @@ -3673,6 +3675,7 @@ int do_init(int argc, char *argv[]) do_init_npc(); do_init_unit(); do_init_battleground(); + do_init_duel(); npc_event_do_oninit(); // npcのOnInitイベント?行 diff --git a/src/map/pc.c b/src/map/pc.c index 64db9cb46..fad6a2261 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -18,6 +18,7 @@ #include "chrif.h" #include "clif.h" #include "date.h" // is_day_of_*() +#include "duel.h" #include "intif.h" #include "itemdb.h" #include "log.h" @@ -63,9 +64,6 @@ static unsigned short equip_pos[EQI_MAX]={EQP_ACC_L,EQP_ACC_R,EQP_SHOES,EQP_GARM #define MOTD_LINE_SIZE 128 static char motd_text[MOTD_LINE_SIZE][CHAT_SIZE_MAX]; // Message of the day buffer [Valaris] -struct duel duel_list[MAX_DUEL]; -int duel_count = 0; - //Links related info to the sd->hate_mob[]/sd->feel_map[] entries const struct sg_data sg_info[MAX_PC_FEELHATE] = { { SG_SUN_ANGER, SG_SUN_BLESS, SG_SUN_COMFORT, "PC_FEEL_SUN", "PC_HATE_MOB_SUN", is_day_of_sun }, @@ -7735,168 +7733,6 @@ void pc_setstand(struct map_session_data *sd){ sd->state.dead_sit = sd->vd.dead_sit = 0; } -/*========================================== - * Duel organizing functions [LuzZza] - *------------------------------------------*/ -void duel_savetime(struct map_session_data* sd) -{ - time_t timer; - struct tm *t; - - time(&timer); - t = localtime(&timer); - - pc_setglobalreg(sd, "PC_LAST_DUEL_TIME", t->tm_mday*24*60 + t->tm_hour*60 + t->tm_min); - return; -} - -int duel_checktime(struct map_session_data* sd) -{ - int diff; - time_t timer; - struct tm *t; - - time(&timer); - t = localtime(&timer); - - diff = t->tm_mday*24*60 + t->tm_hour*60 + t->tm_min - pc_readglobalreg(sd, "PC_LAST_DUEL_TIME"); - - return !(diff >= 0 && diff < battle_config.duel_time_interval); -} -static int duel_showinfo_sub(struct map_session_data* sd, va_list va) -{ - struct map_session_data *ssd = va_arg(va, struct map_session_data*); - int *p = va_arg(va, int*); - char output[256]; - - if (sd->duel_group != ssd->duel_group) return 0; - - sprintf(output, " %d. %s", ++(*p), sd->status.name); - clif_disp_onlyself(ssd, output, strlen(output)); - return 1; -} - -int duel_showinfo(const unsigned int did, struct map_session_data* sd) -{ - int p=0; - char output[256]; - - if(duel_list[did].max_players_limit > 0) - sprintf(output, msg_txt(370), //" -- Duels: %d/%d, Members: %d/%d, Max players: %d --" - did, duel_count, - duel_list[did].members_count, - duel_list[did].members_count + duel_list[did].invites_count, - duel_list[did].max_players_limit); - else - sprintf(output, msg_txt(371), //" -- Duels: %d/%d, Members: %d/%d --" - did, duel_count, - duel_list[did].members_count, - duel_list[did].members_count + duel_list[did].invites_count); - - clif_disp_onlyself(sd, output, strlen(output)); - map_foreachpc(duel_showinfo_sub, sd, &p); - return 0; -} - -int duel_create(struct map_session_data* sd, const unsigned int maxpl) -{ - int i=1; - char output[256]; - - while(duel_list[i].members_count > 0 && i < MAX_DUEL) i++; - if(i == MAX_DUEL) return 0; - - duel_count++; - sd->duel_group = i; - duel_list[i].members_count++; - duel_list[i].invites_count = 0; - duel_list[i].max_players_limit = maxpl; - - strcpy(output, msg_txt(372)); // " -- Duel has been created (@invite/@leave) --" - clif_disp_onlyself(sd, output, strlen(output)); - - clif_map_property(sd, MAPPROPERTY_FREEPVPZONE); - //clif_misceffect2(&sd->bl, 159); - return i; -} - -int duel_invite(const unsigned int did, struct map_session_data* sd, struct map_session_data* target_sd) -{ - char output[256]; - - // " -- Player %s invites %s to duel --" - sprintf(output, msg_txt(373), sd->status.name, target_sd->status.name); - clif_disp_message(&sd->bl, output, strlen(output), DUEL_WOS); - - target_sd->duel_invite = did; - duel_list[did].invites_count++; - - // "Blue -- Player %s invites you to PVP duel (@accept/@reject) --" - sprintf(output, msg_txt(374), sd->status.name); - clif_broadcast((struct block_list *)target_sd, output, strlen(output)+1, 0x10, SELF); - return 0; -} - -static int duel_leave_sub(struct map_session_data* sd, va_list va) -{ - int did = va_arg(va, int); - if (sd->duel_invite == did) - sd->duel_invite = 0; - return 0; -} - -int duel_leave(const unsigned int did, struct map_session_data* sd) -{ - char output[256]; - - // " <- Player %s has left duel --" - sprintf(output, msg_txt(375), sd->status.name); - clif_disp_message(&sd->bl, output, strlen(output), DUEL_WOS); - - duel_list[did].members_count--; - - if(duel_list[did].members_count == 0) { - map_foreachpc(duel_leave_sub, did); - duel_count--; - } - - sd->duel_group = 0; - duel_savetime(sd); - clif_map_property(sd, MAPPROPERTY_NOTHING); - return 0; -} - -int duel_accept(const unsigned int did, struct map_session_data* sd) -{ - char output[256]; - - duel_list[did].members_count++; - sd->duel_group = sd->duel_invite; - duel_list[did].invites_count--; - sd->duel_invite = 0; - - // " -> Player %s has accepted duel --" - sprintf(output, msg_txt(376), sd->status.name); - clif_disp_message(&sd->bl, output, strlen(output), DUEL_WOS); - - clif_map_property(sd, MAPPROPERTY_FREEPVPZONE); - //clif_misceffect2(&sd->bl, 159); - return 0; -} - -int duel_reject(const unsigned int did, struct map_session_data* sd) -{ - char output[256]; - - // " -- Player %s has rejected duel --" - sprintf(output, msg_txt(377), sd->status.name); - clif_disp_message(&sd->bl, output, strlen(output), DUEL_WOS); - - duel_list[did].invites_count--; - sd->duel_invite = 0; - return 0; -} - int pc_split_str(char *str,char **val,int num) { int i; @@ -8258,8 +8094,6 @@ int do_init_pc(void) pc_readdb(); pc_read_motd(); // Read MOTD [Valaris] - memset(&duel_list[0], 0, sizeof(duel_list)); - add_timer_func_list(pc_invincible_timer, "pc_invincible_timer"); add_timer_func_list(pc_eventtimer, "pc_eventtimer"); add_timer_func_list(pc_inventory_rental_end, "pc_inventory_rental_end"); diff --git a/src/map/pc.h b/src/map/pc.h index 28ed28da8..2221dfe3a 100644 --- a/src/map/pc.h +++ b/src/map/pc.h @@ -510,16 +510,6 @@ enum equip_index { EQI_MAX }; -struct duel { - int members_count; - int invites_count; - int max_players_limit; -}; - -#define MAX_DUEL 1024 -extern struct duel duel_list[MAX_DUEL]; -extern int duel_count; - #define pc_setdead(sd) ( (sd)->state.dead_sit = (sd)->vd.dead_sit = 1 ) #define pc_setsit(sd) ( (sd)->state.dead_sit = (sd)->vd.dead_sit = 2 ) #define pc_isdead(sd) ( (sd)->state.dead_sit == 1 ) @@ -778,15 +768,6 @@ void pc_inventory_rentals(struct map_session_data *sd); int pc_inventory_rental_clear(struct map_session_data *sd); void pc_inventory_rental_add(struct map_session_data *sd, int seconds); -//Duel functions // [LuzZza] -int duel_create(struct map_session_data* sd, const unsigned int maxpl); -int duel_invite(const unsigned int did, struct map_session_data* sd, struct map_session_data* target_sd); -int duel_accept(const unsigned int did, struct map_session_data* sd); -int duel_reject(const unsigned int did, struct map_session_data* sd); -int duel_leave(const unsigned int did, struct map_session_data* sd); -int duel_showinfo(const unsigned int did, struct map_session_data* sd); -int duel_checktime(struct map_session_data* sd); - int pc_read_motd(void); // [Valaris] int pc_disguise(struct map_session_data *sd, int class_); diff --git a/src/map/unit.c b/src/map/unit.c index da1ce1c14..0c2c20c80 100644 --- a/src/map/unit.c +++ b/src/map/unit.c @@ -17,6 +17,7 @@ #include "mercenary.h" #include "skill.h" #include "clif.h" +#include "duel.h" #include "npc.h" #include "guild.h" #include "status.h" |