diff --git a/src/map/battle.c b/src/map/battle.c
index 37fc03bca..eb96f2036 100644
--- a/src/map/battle.c
+++ b/src/map/battle.c
@@ -372,7 +372,7 @@ static int64 battle_attr_fix(struct block_list *src, struct block_list *target,
return damage;
}
- ratio = battle->attr_fix_table[def_lv-1][atk_elem][def_type];
+ ratio = battle->attr_fix_table[def_lv-1][def_type][atk_elem];
if (sc && sc->count) {
if(sc->data[SC_VOLCANO] && atk_elem == ELE_FIRE)
ratio += skill->enchant_eff[sc->data[SC_VOLCANO]->val1-1];
@@ -1426,7 +1426,7 @@ static int64 battle_calc_defense(int attack_type, struct block_list *src, struct
**/
if( def1 < -399 ) // it stops at -399
- def1 = 399; // in aegis it set to 1 but in our case it may lead to exploitation so limit it to 399
+ def1 = -399; // in aegis it set to 1 but in our case it may lead to exploitation so limit it to 399
//return 1;
if( flag&2 )
@@ -1481,7 +1481,7 @@ static int64 battle_calc_defense(int attack_type, struct block_list *src, struct
* RE MDEF Reduction
**/
if( mdef < -99 ) // it stops at -99
- mdef = 99; // in aegis it set to 1 but in our case it may lead to exploitation so limit it to 99
+ mdef = -99; // in aegis it set to 1 but in our case it may lead to exploitation so limit it to 99
//return 1;
damage = (int)((100.0f - mdef / (mdef + 100.0f) * 90.0f) / 100.0f * damage - mdef2);
@@ -4664,7 +4664,7 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
skill_id == SN_SHARPSHOOTING || skill_id == MA_SHARPSHOOTING ||
skill_id == NJ_KIRIKAGE))
{
- short cri = sstatus->cri;
+ int cri = sstatus->cri;
if (sd != NULL) {
// if show_katar_crit_bonus is enabled, it already done the calculation in status.c
if (!battle_config.show_katar_crit_bonus && sd->weapontype == W_KATAR) {
@@ -4684,7 +4684,7 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
//Therefore, we use the old value 3 on cases when an sd gets attacked by a mob
cri -= tstatus->luk*(!sd&&tsd?3:2);
#else
- cri -= status->get_lv(target) / 15 + 2 * status_get_luk(target);
+ cri -= status->get_lv(target) / 5 + (3 * status_get_luk(target))/2;
#endif
if( tsc && tsc->data[SC_SLEEP] ) {
diff --git a/src/map/npc.c b/src/map/npc.c
index fea82c873..84d292415 100644
--- a/src/map/npc.c
+++ b/src/map/npc.c
@@ -2070,9 +2070,6 @@ static int npc_buylist(struct map_session_data *sd, struct itemlist *item_list)
w += itemdb_weight(entry->id) * entry->amount;
}
- if (nd->master_nd != NULL) //Script-based shops.
- return npc->buylist_sub(sd, item_list, nd->master_nd);
-
if (z > sd->status.zeny)
return 1; // Not enough Zeny
if( w + sd->weight > sd->max_weight )
@@ -2109,6 +2106,9 @@ static int npc_buylist(struct map_session_data *sd, struct itemlist *item_list)
}
}
+ if (nd->master_nd != NULL) // TMW2 Script-based shops.
+ return npc->buylist_sub(sd, item_list, nd->master_nd);
+
return 0;
}
@@ -2179,6 +2179,9 @@ static int npc_market_buylist(struct map_session_data *sd, struct itemlist *item
return 1;
}
+ // Apply player discout cupon (TMW2 Custom)
+ value = pc->modifybuyvalue(sd,value);
+
z += (int64)value * entry->amount;
w += itemdb_weight(entry->id) * entry->amount;
}
@@ -2218,6 +2221,9 @@ static int npc_market_buylist(struct map_session_data *sd, struct itemlist *item
}
}
+ if (nd->master_nd != NULL) // TMW2 Script-based shops.
+ return npc->buylist_sub(sd, item_list, nd->master_nd);
+
return 0;
}
@@ -2463,7 +2469,7 @@ static int npc_selllist(struct map_session_data *sd, struct itemlist *item_list)
z = 0;
- if (sd->status.zeny >= MAX_ZENY && nd->master_nd == NULL)
+ if (sd->status.zeny >= MAX_ZENY)
return 1;
// verify the sell list
@@ -2487,20 +2493,11 @@ static int npc_selllist(struct map_session_data *sd, struct itemlist *item_list)
return 1;
}
- if (nd->master_nd) {
- // Script-controlled shops decide by themselves, what can be sold and at what price.
- continue;
- }
-
value = pc->modifysellvalue(sd, sd->inventory_data[idx]->value_sell);
z += (int64)value * entry->amount;
}
- if( nd->master_nd ) { // Script-controlled shops
- return npc->selllist_sub(sd, item_list, nd->master_nd);
- }
-
// delete items
for (i = 0; i < VECTOR_LENGTH(*item_list); i++) {
struct itemlist_entry *entry = &VECTOR_INDEX(*item_list, i);
@@ -2519,7 +2516,7 @@ static int npc_selllist(struct map_session_data *sd, struct itemlist *item_list)
}
- if (z + sd->status.zeny > MAX_ZENY && nd->master_nd == NULL)
+ if (z + sd->status.zeny > MAX_ZENY)
return 1;
if (z > MAX_ZENY)
@@ -2540,6 +2537,10 @@ static int npc_selllist(struct map_session_data *sd, struct itemlist *item_list)
}
}
+ if( nd->master_nd ) { // Script-controlled shops
+ return npc->selllist_sub(sd, item_list, nd->master_nd);
+ }
+
return 0;
}
diff --git a/src/map/rodex.c b/src/map/rodex.c
index 766fdc5ea..996576fd3 100644
--- a/src/map/rodex.c
+++ b/src/map/rodex.c
@@ -34,11 +34,11 @@
// NOTE : These values are hardcoded into the client
// Cost of each Attached Item
-#define ATTACHITEM_COST 2500
+#define ATTACHITEM_COST 500
// Percent of Attached Zeny that will be paid as Tax
-#define ATTACHZENY_TAX 2
+#define ATTACHZENY_TAX 0
// Maximun number of messages that can be sent in one day
-#define DAILY_MAX_MAILS 100
+#define DAILY_MAX_MAILS 3
static struct rodex_interface rodex_s;
struct rodex_interface *rodex;
diff --git a/src/map/script.c b/src/map/script.c
index f515d4403..3747abd6e 100644
--- a/src/map/script.c
+++ b/src/map/script.c
@@ -16552,6 +16552,8 @@ static BUILDIN(summon)
clif->specialeffect(&md->bl,344,AREA);
sc_start4(NULL, &md->bl, SC_MODECHANGE, 100, 1, 0, MD_AGGRESSIVE, 0, 60000);
}
+ //mob_id = mob->once_spawn(sd, m, x, y, str, class_, amount, event, size, ai);
+ script_pushint(st, (md) ? md->bl.id : 0);
return true;
}
diff --git a/src/map/status.c b/src/map/status.c
index 63e71c9dc..9a235e5e3 100644
--- a/src/map/status.c
+++ b/src/map/status.c
@@ -4469,17 +4469,23 @@ static int status_base_atk(const struct block_list *bl, const struct status_data
case W_SHOTGUN:
case W_GRENADE:
flag = 1;
+ break;
+ case W_STAFF:
+ flag = 2;
}
}
- if ( flag ) {
+ if ( flag == 1 ) {
str = st->dex;
dex = st->str;
+ } else if ( flag == 2 ) {
+ str = st->int_;
+ dex = st->dex;
} else {
str = st->str;
dex = st->dex;
}
#ifdef RENEWAL
- dstr = str;
+ dstr = str*15/10;
#endif
//Normally only players have base-atk, but homunc have a different batk
// equation, hinting that perhaps non-players should use this for batk.
@@ -6124,6 +6130,12 @@ static short status_calc_aspd(struct block_list *bl, struct status_change *sc, s
static short status_calc_fix_aspd(struct block_list *bl, struct status_change *sc, int aspd)
{
nullpo_ret(bl);
+
+ // TMW2 Nerfing
+ if (aspd < 300)
+ aspd=cap_value(aspd+(aspd / 2), 0, 300);
+
+ // Status Conditions
if (!sc || !sc->count)
return cap_value(aspd, 0, 2000);