summaryrefslogtreecommitdiff
path: root/src/map/pc.c
diff options
context:
space:
mode:
authorultramage <ultramage@54d463be-8e91-2dee-dedb-b68131a5f0ec>2008-04-15 13:49:40 +0000
committerultramage <ultramage@54d463be-8e91-2dee-dedb-b68131a5f0ec>2008-04-15 13:49:40 +0000
commite6276c539a165616071dc46355a9579d4a7ae647 (patch)
tree7a988dcf949b0149d7b6c674bb2292333ae20e96 /src/map/pc.c
parentbbadf310e83b4c8b3c683065f016892cf2b36a8a (diff)
downloadhercules-e6276c539a165616071dc46355a9579d4a7ae647.tar.gz
hercules-e6276c539a165616071dc46355a9579d4a7ae647.tar.bz2
hercules-e6276c539a165616071dc46355a9579d4a7ae647.tar.xz
hercules-e6276c539a165616071dc46355a9579d4a7ae647.zip
* Corrected some invalid syntax in skill_db.txt (wrong usage of commas)
* Renamed BA_FROSTJOKE to BA_FROSTJOKER (aegis server-side name) * Implemented a generic framework for parsing delimited db files (allows specifying min/max column ranges and max number of rows to read) * Corrected a typo in quest_update_objective() * Cleaned up pc.c a bit git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@12599 54d463be-8e91-2dee-dedb-b68131a5f0ec
Diffstat (limited to 'src/map/pc.c')
-rw-r--r--src/map/pc.c166
1 files changed, 59 insertions, 107 deletions
diff --git a/src/map/pc.c b/src/map/pc.c
index 5fc764cb1..400799e61 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -19,6 +19,7 @@
#include "intif.h"
#include "itemdb.h"
#include "log.h"
+#include "mail.h"
#include "map.h"
#include "path.h"
#include "mercenary.h" // merc_is_hom_active()
@@ -34,10 +35,6 @@
#include "pc.h"
#include "quest.h"
-#ifndef TXT_ONLY // mail system [Valaris]
-#include "mail.h"
-#endif
-
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -494,23 +491,19 @@ int pc_setequipindex(struct map_session_data *sd)
for(j=0;j<EQI_MAX;j++)
if(sd->status.inventory[i].equip & equip_pos[j])
sd->equip_index[j] = i;
- if(sd->status.inventory[i].equip & EQP_HAND_R) {
+
+ if(sd->status.inventory[i].equip & EQP_HAND_R)
+ {
if(sd->inventory_data[i])
sd->weapontype1 = sd->inventory_data[i]->look;
else
sd->weapontype1 = 0;
}
- if(sd->status.inventory[i].equip & EQP_HAND_L) {
- if(sd->inventory_data[i]) {
- if(sd->inventory_data[i]->type == 4) {
- if(sd->status.inventory[i].equip == EQP_HAND_L)
- sd->weapontype2 = sd->inventory_data[i]->look;
- else
- sd->weapontype2 = 0;
- }
- else
- sd->weapontype2 = 0;
- }
+
+ if( sd->status.inventory[i].equip & EQP_HAND_L )
+ {
+ if( sd->inventory_data[i] && sd->inventory_data[i]->type == 4 )
+ sd->weapontype2 = sd->inventory_data[i]->look;
else
sd->weapontype2 = 0;
}
@@ -521,7 +514,8 @@ int pc_setequipindex(struct map_session_data *sd)
return 0;
}
-static int pc_isAllowedCardOn(struct map_session_data *sd,int s,int eqindex,int flag) {
+static int pc_isAllowedCardOn(struct map_session_data *sd,int s,int eqindex,int flag)
+{
int i;
struct item *item = &sd->status.inventory[eqindex];
struct item_data *data;
@@ -529,14 +523,8 @@ static int pc_isAllowedCardOn(struct map_session_data *sd,int s,int eqindex,int
if (itemdb_isspecial(item->card[0]))
return 1;
- for (i=0;i<s;i++) {
- if (item->card[i] &&
- (data = itemdb_exists(item->card[i])) &&
- data->flag.no_equip&flag
- )
- return 0;
- }
- return 1;
+ ARR_FIND( 0, s, i, item->card[i] && (data = itemdb_exists(item->card[i])) != NULL && data->flag.no_equip&flag );
+ return( i < s ) ? 0 : 1;
}
bool pc_isequipped(struct map_session_data *sd, int nameid)
@@ -3283,32 +3271,34 @@ int pc_cart_additem(struct map_session_data *sd,struct item *item_data,int amoun
return 1;
i=MAX_CART;
- if(itemdb_isstackable2(data)){
- for(i=0;i<MAX_CART;i++){
- if(sd->status.cart[i].nameid==item_data->nameid &&
- sd->status.cart[i].card[0] == item_data->card[0] && sd->status.cart[i].card[1] == item_data->card[1] &&
- sd->status.cart[i].card[2] == item_data->card[2] && sd->status.cart[i].card[3] == item_data->card[3]){
- if(sd->status.cart[i].amount+amount > MAX_AMOUNT)
- return 1;
- sd->status.cart[i].amount+=amount;
- clif_cart_additem(sd,i,amount,0);
- break;
- }
- }
+ if(itemdb_isstackable2(data))
+ {
+ ARR_FIND( 0, MAX_CART, i,
+ sd->status.cart[i].nameid == item_data->nameid &&
+ sd->status.cart[i].card[0] == item_data->card[0] && sd->status.cart[i].card[1] == item_data->card[1] &&
+ sd->status.cart[i].card[2] == item_data->card[2] && sd->status.cart[i].card[3] == item_data->card[3] );
+ };
+
+ if( i < MAX_CART )
+ {// item already in cart, stack it
+ if(sd->status.cart[i].amount+amount > MAX_AMOUNT)
+ return 1; // no room
+
+ sd->status.cart[i].amount+=amount;
+ clif_cart_additem(sd,i,amount,0);
}
- if(i >= MAX_CART){
- for(i=0;i<MAX_CART;i++){
- if(sd->status.cart[i].nameid==0){
- memcpy(&sd->status.cart[i],item_data,sizeof(sd->status.cart[0]));
- sd->status.cart[i].amount=amount;
- sd->cart_num++;
- clif_cart_additem(sd,i,amount,0);
- break;
- }
- }
- if(i >= MAX_CART)
- return 1;
+ else
+ {// item not stackable or not present, add it
+ ARR_FIND( 0, MAX_CART, i, sd->status.cart[i].nameid == 0 );
+ if( i == MAX_CART )
+ return 1; // no room
+
+ memcpy(&sd->status.cart[i],item_data,sizeof(sd->status.cart[0]));
+ sd->status.cart[i].amount=amount;
+ sd->cart_num++;
+ clif_cart_additem(sd,i,amount,0);
}
+
sd->cart_weight += w;
clif_updatestatus(sd,SP_CARTINFO);
@@ -3343,7 +3333,8 @@ int pc_cart_delitem(struct map_session_data *sd,int n,int amount,int type)
/*==========================================
* カ?トへアイテム移動
*------------------------------------------*/
-int pc_putitemtocart(struct map_session_data *sd,int idx,int amount) {
+int pc_putitemtocart(struct map_session_data *sd,int idx,int amount)
+{
struct item *item_data;
nullpo_retr(0, sd);
@@ -5078,32 +5069,6 @@ int pc_dead(struct map_session_data *sd,struct block_list *src)
}
}
- // PK/Karma system code (not enabled yet) [celest]
- /*
- if(sd->status.karma > 0) {
- int eq_num=0,eq_n[MAX_INVENTORY];
- memset(eq_n,0,sizeof(eq_n));
- for(i=0;i<MAX_INVENTORY;i++){
- int k;
- for(k=0;k<MAX_INVENTORY;k++){
- if(eq_n[k] <= 0){
- eq_n[k]=i;
- break;
- }
- }
- eq_num++;
- }
- if(eq_num > 0){
- int n = eq_n[rand()%eq_num];
- if(rand()%10000 < sd->status.karma){
- if(sd->status.inventory[n].equip)
- pc_unequipitem(sd,n,0);
- pc_dropitem(sd,n,1);
- }
- }
- }
- */
-
if(battle_config.bone_drop==2
|| (battle_config.bone_drop==1 && map[sd->bl.m].flag.pvp))
{
@@ -5182,7 +5147,8 @@ int pc_dead(struct map_session_data *sd,struct block_list *src)
}
}
- if(map[sd->bl.m].flag.pvp_nightmaredrop){ // Moved this outside so it works when PVP isn't enabled and during pk mode [Ancyker]
+ if(map[sd->bl.m].flag.pvp_nightmaredrop)
+ { // Moved this outside so it works when PVP isn't enabled and during pk mode [Ancyker]
for(j=0;j<MAX_DROP_PER_MAP;j++){
int id = map[sd->bl.m].drop_list[j].drop_id;
int type = map[sd->bl.m].drop_list[j].drop_type;
@@ -5196,13 +5162,12 @@ int pc_dead(struct map_session_data *sd,struct block_list *src)
int k;
if( (type == 1 && !sd->status.inventory[i].equip)
|| (type == 2 && sd->status.inventory[i].equip)
- || type == 3){
- for(k=0;k<MAX_INVENTORY;k++){
- if(eq_n[k] <= 0){
- eq_n[k]=i;
- break;
- }
- }
+ || type == 3)
+ {
+ ARR_FIND( 0, MAX_INVENTORY, k, eq_n[k] <= 0 );
+ if( k < MAX_INVENTORY )
+ eq_n[k] = i;
+
eq_num++;
}
}
@@ -6848,16 +6813,6 @@ int pc_divorce(struct map_session_data *sd)
*------------------------------------------*/
struct map_session_data *pc_get_partner(struct map_session_data *sd)
{
- //struct map_session_data *p_sd = NULL;
- //char *nick;
- //if(sd == NULL || !pc_ismarried(sd))
- // return NULL;
- //nick=map_charid2nick(sd->status.partner_id);
- //if (nick==NULL)
- // return NULL;
- //if((p_sd=map_nick2sd(nick)) == NULL )
- // return NULL;
-
if (sd && pc_ismarried(sd))
// charid2sd returns NULL if not found
return map_charid2sd(sd->status.partner_id);
@@ -7302,18 +7257,15 @@ int pc_split_atoui(char* str, unsigned int* val, char sep, int max)
return i;
}
-//
-// 初期化物
-//
/*==========================================
- * 設定ファイル?み?む
- * exp.txt 必要??値
- * job_db1.txt 重量,hp,sp,攻?速度
- * job_db2.txt job能力値ボ?ナス
- * skill_tree.txt 各職?のスキルツリ?
- * attr_fix.txt ?性修正テ?ブル
- * size_fix.txt サイズ補正テ?ブル
- * refine_db.txt 精?デ?タテ?ブル
+ * DB reading.
+ * exp.txt - required experience values
+ * job_db1.txt - weight, hp, sp, aspd
+ * job_db2.txt - job level stat bonuses
+ * skill_tree.txt - skill tree for every class
+ * attr_fix.txt - elemental adjustment table
+ * size_fix.txt - size adjustment table for weapons
+ * refine_db.txt - refining data table
*------------------------------------------*/
int pc_readdb(void)
{
@@ -7436,8 +7388,8 @@ int pc_readdb(void)
continue;
idx = pc_class2idx(idx);
k = atoi(split[1]); //This is to avoid adding two lines for the same skill. [Skotlex]
- for(j = 0; j < MAX_SKILL_TREE && skill_tree[idx][j].id && skill_tree[idx][j].id != k; j++);
- if (j == MAX_SKILL_TREE)
+ ARR_FIND( 0, MAX_SKILL_TREE, j, skill_tree[idx][j].id == 0 || skill_tree[idx][j].id == k );
+ if( j == MAX_SKILL_TREE )
{
ShowWarning("Unable to load skill %d into job %d's tree. Maximum number of skills per class has been reached.\n", k, atoi(split[0]));
continue;