summaryrefslogtreecommitdiff
path: root/src/map/mercenary.h
blob: 65e8d53385ea8ffe75c726faf9d66d81652cedbb (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
/**
 * 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_MERCENARY_H
#define MAP_MERCENARY_H

#include "map/status.h" // struct status_data, struct status_change
#include "map/unit.h" // struct unit_data
#include "common/hercules.h"

struct map_session_data;

#define MAX_MERCENARY_CLASS 61
// number of cells that a mercenary can walk to from it's master before being warped
#define MAX_MER_DISTANCE 15

enum {
	ARCH_MERC_GUILD,
	SPEAR_MERC_GUILD,
	SWORD_MERC_GUILD,
};

/// Mercenary IDs
enum merc_id {
	MERID_MER_ARCHER01   = 6017, ///<   MER_ARCHER01 / Mina
	MERID_MER_ARCHER02   = 6018, ///<   MER_ARCHER02 / Dororu
	MERID_MER_ARCHER03   = 6019, ///<   MER_ARCHER03 / Nami
	MERID_MER_ARCHER04   = 6020, ///<   MER_ARCHER04 / Elfin
	MERID_MER_ARCHER05   = 6021, ///<   MER_ARCHER05 / Clara
	MERID_MER_ARCHER06   = 6022, ///<   MER_ARCHER06 / Dali
	MERID_MER_ARCHER07   = 6023, ///<   MER_ARCHER07 / Karaya
	MERID_MER_ARCHER08   = 6024, ///<   MER_ARCHER08 / Hiyori
	MERID_MER_ARCHER09   = 6025, ///<   MER_ARCHER09 / Kero
	MERID_MER_ARCHER10   = 6026, ///<   MER_ARCHER10 / Sukye
	MERID_MER_LANCER01   = 6027, ///<   MER_LANCER01 / Rodin
	MERID_MER_LANCER02   = 6028, ///<   MER_LANCER02 / Lancer
	MERID_MER_LANCER03   = 6029, ///<   MER_LANCER03 / Nathan
	MERID_MER_LANCER04   = 6030, ///<   MER_LANCER04 / Roan
	MERID_MER_LANCER05   = 6031, ///<   MER_LANCER05 / Orizaro
	MERID_MER_LANCER06   = 6032, ///<   MER_LANCER06 / Thyla
	MERID_MER_LANCER07   = 6033, ///<   MER_LANCER07 / Ben
	MERID_MER_LANCER08   = 6034, ///<   MER_LANCER08 / Pinaka
	MERID_MER_LANCER09   = 6035, ///<   MER_LANCER09 / Kuhlmann
	MERID_MER_LANCER10   = 6036, ///<   MER_LANCER10 / Roux
	MERID_MER_SWORDMAN01 = 6037, ///< MER_SWORDMAN01 / David
	MERID_MER_SWORDMAN02 = 6038, ///< MER_SWORDMAN02 / Ellen
	MERID_MER_SWORDMAN03 = 6039, ///< MER_SWORDMAN03 / Luise
	MERID_MER_SWORDMAN04 = 6040, ///< MER_SWORDMAN04 / Frank
	MERID_MER_SWORDMAN05 = 6041, ///< MER_SWORDMAN05 / Ryan
	MERID_MER_SWORDMAN06 = 6042, ///< MER_SWORDMAN06 / Paolo
	MERID_MER_SWORDMAN07 = 6043, ///< MER_SWORDMAN07 / Jens
	MERID_MER_SWORDMAN08 = 6044, ///< MER_SWORDMAN08 / Thierry
	MERID_MER_SWORDMAN09 = 6045, ///< MER_SWORDMAN09 / Steven
	MERID_MER_SWORDMAN10 = 6046, ///< MER_SWORDMAN10 / Wayne
};

struct s_mercenary_db {
	int class_;
	char sprite[NAME_LENGTH], name[NAME_LENGTH];
	unsigned short lv;
	short range2, range3;
	struct status_data status;
	struct view_data vd;
	struct {
		unsigned short id, lv;
	} skill[MAX_MERCSKILL];
};

struct mercenary_data {
	struct block_list bl;
	struct unit_data ud;
	struct view_data *vd;
	struct status_data base_status, battle_status;
	struct status_change sc;
	struct regen_data regen;
	struct s_mercenary_db *db;
	struct s_mercenary mercenary;
	char blockskill[MAX_SKILL_DB];

	struct map_session_data *master;
	int contract_timer;

	unsigned devotion_flag : 1;
	int64 masterteleport_timer;
};

/*=====================================
* Interface : mercenary.h
* Generated by HerculesInterfaceMaker
* created by Susu
*-------------------------------------*/
struct mercenary_interface {

	/* vars */

	struct s_mercenary_db *db;

	/* funcs */

	void (*init) (bool minimal);

	bool (*class) (int class_);
	struct view_data * (*get_viewdata) (int class_);

	int (*create) (struct map_session_data *sd, int class_, unsigned int lifetime);
	int (*data_received) (const struct s_mercenary *merc, bool flag);
	int (*save) (struct mercenary_data *md);

	void (*heal) (struct mercenary_data *md, int hp, int sp);
	int (*dead) (struct mercenary_data *md);

	int (*delete) (struct mercenary_data *md, int reply);
	void (*contract_stop) (struct mercenary_data *md);

	int (*get_lifetime) (struct mercenary_data *md);
	int (*get_guild) (struct mercenary_data *md);
	int (*get_faith) (struct mercenary_data *md);
	int (*set_faith) (struct mercenary_data *md, int value);
	int (*get_calls) (struct mercenary_data *md);
	int (*set_calls) (struct mercenary_data *md, int value);
	int (*kills) (struct mercenary_data *md);

	int (*checkskill) (struct mercenary_data *md, uint16 skill_id);
	int (*read_db) (void);
	int (*read_skilldb) (void);

	int (*killbonus) (struct mercenary_data *md);
	int (*search_index) (int class_);

	int (*contract_end_timer) (int tid, int64 tick, int id, intptr_t data);
	bool (*read_db_sub) (char* str[], int columns, int current);
	bool (*read_skill_db_sub) (char* str[], int columns, int current);
};

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

HPShared struct mercenary_interface *mercenary;

#endif /* MAP_MERCENARY_H */