From cbe1f7d0c28858cdb93ccf729ec1a86cc6bc9dc2 Mon Sep 17 00:00:00 2001 From: Cydh Ramdh Date: Sun, 8 Feb 2015 09:50:52 +0700 Subject: [PATCH] Init refine bonus * Added file refine_bonus.txt in db folder * Support for import db folder (just copy the original file to db/import with same name) * Can be used from refine +0 until MAX_REFINE (default is +20) * Refine type: * 0 - Armor * 1 - Weapon Lv 1 * 2 - Weapon Lv 2 * 3 - Weapon Lv 3 * 4 - Weapon Lv 4 * 5 - Shadow Weapon Lv 1 * 6 - Shadow Weapon Lv 2 * 7 - Shadow Weapon Lv 3 * 8 - Shadow Weapon Lv 4 * 9 - Shadow Armor (the rest of shadow weapon type) Signed-off-by: Cydh Ramdh --- db/refine_bonus.txt | 157 ++++++++++++++++++++++++++++++++ src/config/core.h | 3 + src/map/status.c | 217 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 377 insertions(+) create mode 100644 db/refine_bonus.txt diff --git a/db/refine_bonus.txt b/db/refine_bonus.txt new file mode 100644 index 00000000000..68e15523add --- /dev/null +++ b/db/refine_bonus.txt @@ -0,0 +1,157 @@ +// ============================================= +// [Cydh/PServeRO] +// house.bad@gmail.com +// ============================================= +// Structure: +// Type,RefineNumber,{ Script } +// --------------------------------------------- +// Type: +// - 0 : Armor +// - 1 : Weapon Level 1 +// - 2 : Weapon Level 2 +// - 3 : Weapon Level 3 +// - 4 : Weapon Level 4 +// - 5 : Shadow Weapon (Level 1) +// - 6 : Shadow Weapon (Level 2) +// - 7 : Shadow Weapon (Level 3) +// - 8 : Shadow Weapon (Level 4) +// - 9 : Shadow Armor +// +// --------------------------------------------- +// RefineNumber: +// - 0 ~ MAX_REFINE +// --------------------------------------------- +// { Script } +// - Works like { Script } on item_db.txt Look at doc/item_bonus.txt +// ============================================= +// NOTES: +// - Every line must be written completely! +// ============================================= +// Examples: +// 0,1,{ bonus bVit,5; } - Add 5 Vit for +0 Armor +// 4,10,{ bonus bStr,5; } - Add 10 Str for +10 Weapon level 4 +// --------------------------------------------- +//0,1,{ bonus bVit,1; } +//0,2,{ bonus bVit,2; } +//0,3,{ bonus bVit,3; } +//0,4,{ bonus bVit,4; } +//0,5,{ bonus bVit,5; } +//0,6,{ bonus bVit,6; } +//0,7,{ bonus bVit,7; } +//0,8,{ bonus bVit,8; } +//0,9,{ bonus bVit,9; } +//0,10,{ bonus bVit,10; } +//0,11,{ bonus bVit,11; } +//0,12,{ bonus bVit,12; } +//0,13,{ bonus bVit,13; } +//0,14,{ bonus bVit,14; } +//0,15,{ bonus bVit,15; } +//0,16,{ bonus bVit,16; } +//0,17,{ bonus bVit,17; } +//0,18,{ bonus bVit,18; } +//0,19,{ bonus bVit,19; } +//0,20,{ bonus bVit,20; } +// +//1,1,{ bonus bStr,1; } +//1,2,{ bonus bStr,2; } +//1,3,{ bonus bStr,3; } +//1,4,{ bonus bStr,4; } +//1,5,{ bonus bStr,5; } +//1,6,{ bonus bStr,6; } +//1,7,{ bonus bStr,7; } +//1,8,{ bonus bStr,8; } +//1,9,{ bonus bStr,9; } +//1,10,{ bonus bStr,10; } +//1,11,{ bonus bStr,11; } +//1,12,{ bonus bStr,12; } +//1,13,{ bonus bStr,13; } +//1,14,{ bonus bStr,14; } +//1,15,{ bonus bStr,15; } +//1,16,{ bonus bStr,16; } +//1,17,{ bonus bStr,17; } +//1,18,{ bonus bStr,18; } +//1,19,{ bonus bStr,19; } +//1,20,{ bonus bStr,20; } +// +//2,1,{ bonus bStr,1; bonus bHit,1; } +//2,2,{ bonus bStr,2; bonus bHit,2; } +//2,3,{ bonus bStr,3; bonus bHit,3; } +//2,4,{ bonus bStr,4; bonus bHit,4; } +//2,5,{ bonus bStr,5; bonus bHit,5; } +//2,6,{ bonus bStr,6; bonus bHit,6; } +//2,7,{ bonus bStr,7; bonus bHit,7; } +//2,8,{ bonus bStr,8; bonus bHit,8; } +//2,9,{ bonus bStr,9; bonus bHit,9; } +//2,10,{ bonus bStr,10; bonus bHit,10; } +//2,11,{ bonus bStr,11; bonus bHit,11; } +//2,12,{ bonus bStr,12; bonus bHit,12; } +//2,13,{ bonus bStr,13; bonus bHit,13; } +//2,14,{ bonus bStr,14; bonus bHit,14; } +//2,15,{ bonus bStr,15; bonus bHit,15; } +//2,16,{ bonus bStr,16; bonus bHit,16; } +//2,17,{ bonus bStr,17; bonus bHit,17; } +//2,18,{ bonus bStr,18; bonus bHit,18; } +//2,19,{ bonus bStr,19; bonus bHit,19; } +//2,20,{ bonus bStr,20; bonus bHit,20; } +// +//3,1,{ bonus bStr,1; bonus bHit,1; bonus bMatk,1; } +//3,2,{ bonus bStr,2; bonus bHit,2; bonus bMatk,2; } +//3,3,{ bonus bStr,3; bonus bHit,3; bonus bMatk,3; } +//3,4,{ bonus bStr,4; bonus bHit,4; bonus bMatk,4; } +//3,5,{ bonus bStr,5; bonus bHit,5; bonus bMatk,5; } +//3,6,{ bonus bStr,6; bonus bHit,6; bonus bMatk,6; } +//3,7,{ bonus bStr,7; bonus bHit,7; bonus bMatk,7; } +//3,8,{ bonus bStr,8; bonus bHit,8; bonus bMatk,8; } +//3,9,{ bonus bStr,9; bonus bHit,9; bonus bMatk,9; } +//3,10,{ bonus bStr,10; bonus bHit,10; bonus bMatk,10; } +//3,11,{ bonus bStr,11; bonus bHit,11; bonus bMatk,11; } +//3,12,{ bonus bStr,12; bonus bHit,12; bonus bMatk,12; } +//3,13,{ bonus bStr,13; bonus bHit,13; bonus bMatk,13; } +//3,14,{ bonus bStr,14; bonus bHit,14; bonus bMatk,14; } +//3,15,{ bonus bStr,15; bonus bHit,15; bonus bMatk,15; } +//3,16,{ bonus bStr,16; bonus bHit,16; bonus bMatk,16; } +//3,17,{ bonus bStr,17; bonus bHit,17; bonus bMatk,17; } +//3,18,{ bonus bStr,18; bonus bHit,18; bonus bMatk,18; } +//3,19,{ bonus bStr,19; bonus bHit,19; bonus bMatk,19; } +//3,20,{ bonus bStr,20; bonus bHit,20; bonus bMatk,20; } +// +//4,1,{ bonus bStr,1; bonus bHit,1; bonus bMatk,1; bonus bDef,1; bonus bMdef,1; } +//4,2,{ bonus bStr,2; bonus bHit,2; bonus bMatk,2; bonus bDef,2; bonus bMdef,2; } +//4,3,{ bonus bStr,3; bonus bHit,3; bonus bMatk,3; bonus bDef,3; bonus bMdef,3; } +//4,4,{ bonus bStr,4; bonus bHit,4; bonus bMatk,4; bonus bDef,4; bonus bMdef,4; } +//4,5,{ bonus bStr,5; bonus bHit,5; bonus bMatk,5; bonus bDef,5; bonus bMdef,5; } +//4,6,{ bonus bStr,6; bonus bHit,6; bonus bMatk,6; bonus bDef,6; bonus bMdef,6; } +//4,7,{ bonus bStr,7; bonus bHit,7; bonus bMatk,7; bonus bDef,7; bonus bMdef,7; } +//4,8,{ bonus bStr,8; bonus bHit,8; bonus bMatk,8; bonus bDef,8; bonus bMdef,8; } +//4,9,{ bonus bStr,9; bonus bHit,9; bonus bMatk,9; bonus bDef,9; bonus bMdef,9; } +//4,10,{ bonus bStr,10; bonus bHit,10; bonus bMatk,10; bonus bDef,10; bonus bMdef,10; } +//4,11,{ bonus bStr,11; bonus bHit,11; bonus bMatk,11; bonus bDef,11; bonus bMdef,11; } +//4,12,{ bonus bStr,12; bonus bHit,12; bonus bMatk,12; bonus bDef,12; bonus bMdef,12; } +//4,13,{ bonus bStr,13; bonus bHit,13; bonus bMatk,13; bonus bDef,13; bonus bMdef,13; } +//4,14,{ bonus bStr,14; bonus bHit,14; bonus bMatk,14; bonus bDef,14; bonus bMdef,14; } +//4,15,{ bonus bStr,15; bonus bHit,15; bonus bMatk,15; bonus bDef,15; bonus bMdef,15; } +//4,16,{ bonus bStr,16; bonus bHit,16; bonus bMatk,16; bonus bDef,16; bonus bMdef,16; } +//4,17,{ bonus bStr,17; bonus bHit,17; bonus bMatk,17; bonus bDef,17; bonus bMdef,17; } +//4,18,{ bonus bStr,18; bonus bHit,18; bonus bMatk,18; bonus bDef,18; bonus bMdef,18; } +//4,19,{ bonus bStr,19; bonus bHit,19; bonus bMatk,19; bonus bDef,19; bonus bMdef,19; } +//4,20,{ bonus bStr,20; bonus bHit,20; bonus bMatk,20; bonus bDef,20; bonus bMdef,20; } +// +//5,0,{ bonus bAllStats,1; } +//5,10,{ bonus bAllStats,2; } +//5,20,{ bonus bAllStats,3; } +// +//6,0,{ bonus bAllStats,4; } +//6,10,{ bonus bAllStats,5; } +//6,20,{ bonus bAllStats,6; } +// +//7,0,{ bonus bAllStats,7; } +//7,10,{ bonus bAllStats,8; } +//7,20,{ bonus bAllStats,9; } +// +//8,0,{ bonus bAllStats,10; } +//8,10,{ bonus bAllStats,11; } +//8,20,{ bonus bAllStats,12; } +// +//9,0,{ bonus bAllStats,5; } +//9,10,{ bonus bAllStats,8; } +//9,20,{ bonus bAllStats,10; } diff --git a/src/config/core.h b/src/config/core.h index 04033cadb5a..00d1348f772 100644 --- a/src/config/core.h +++ b/src/config/core.h @@ -93,6 +93,9 @@ #define MAX_CHAR_VIP 0 #endif +/// Enable refine bonus [Cydh/PServeRO] +#define PROJECT_REFINE_BONUS + /** * No settings past this point **/ diff --git a/src/map/status.c b/src/map/status.c index f4da6b54493..847534945c3 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -39,6 +39,18 @@ static struct { int randombonus_max[MAX_REFINE]; /// Cumulative maximum random bonus damage } refine_info[REFINE_TYPE_MAX]; +#ifdef PROJECT_REFINE_BONUS +#define REFINE_BONUS_MAX_TYPE REFINE_TYPE_MAX+5 /// Refine type: 0: armor, 1~4: wlv, 5~8: shadow weapon lv, 9: shadow armor +struct s_refine_bonus { + struct script_code *script[MAX_REFINE+1]; ///< Bonus script for refine 0 ~ MAX_REFINE + bool ref[MAX_REFINE+1]; ///< Script is using reference, don't clear script in this pointer +}; +static struct s_refine_bonus refine_bonus[REFINE_BONUS_MAX_TYPE]; /// Refine bonus script table + +static void refine_bonus_readdb(void); +static void refine_bonus_free(void); +#endif + static int atkmods[3][MAX_WEAPON_TYPE]; /// ATK weapon modification for size (size_fix.txt) static struct eri *sc_data_ers; /// For sc_data entries @@ -3023,6 +3035,19 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt) if (!calculating) // Abort, run_script retriggered this. [Skotlex] return 1; } +#ifdef PROJECT_REFINE_BONUS + if (refine_bonus[wlv].script[r] && (pc_has_permission(sd,PC_PERM_USE_ALL_EQUIPMENT) || !itemdb_isNoEquip(sd->inventory_data[index],sd->bl.m))) { + if (wd == &sd->left_weapon) { + sd->state.lr_flag = 1; + run_script(refine_bonus[wlv].script[r],0,sd->bl.id,0); + sd->state.lr_flag = 0; + } + else + run_script(refine_bonus[wlv].script[r],0,sd->bl.id,0); + if (!calculating) + return 1; + } +#endif if(sd->status.inventory[index].card[0]==CARD0_FORGE) { // Forged weapon wd->star += (sd->status.inventory[index].card[1]>>8); if(wd->star >= 15) wd->star = 40; // 3 Star Crumbs now give +40 dmg @@ -3045,12 +3070,60 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt) if (!calculating) // Abort, run_script retriggered this. [Skotlex] return 1; } +#ifdef PROJECT_REFINE_BONUS + if (refine_bonus[REFINE_TYPE_ARMOR].script[r] && (pc_has_permission(sd,PC_PERM_USE_ALL_EQUIPMENT) || !itemdb_isNoEquip(sd->inventory_data[index],sd->bl.m))) { + if( i == EQI_HAND_L) + sd->state.lr_flag = 3; + run_script(refine_bonus[REFINE_TYPE_ARMOR].script[r], 0, sd->bl.id, 0); + if (i == EQI_HAND_L) + sd->state.lr_flag = 0; + if (!calculating) + return 1; + } +#endif } else if( sd->inventory_data[index]->type == IT_SHADOWGEAR ) { // Shadow System if (sd->inventory_data[index]->script && (pc_has_permission(sd,PC_PERM_USE_ALL_EQUIPMENT) || !itemdb_isNoEquip(sd->inventory_data[index],sd->bl.m))) { run_script(sd->inventory_data[index]->script,0,sd->bl.id,0); if( !calculating ) return 1; } + +#ifdef PROJECT_REFINE_BONUS + if (sd->inventory_data[index]->equip&EQP_SHADOW_WEAPON) { //Shadow Weapon + uint8 wlv = cap_value(sd->inventory_data[index]->wlv+4, 5, 8); + uint8 r = sd->status.inventory[index].refine; + + struct weapon_data *wd; + + if (i == EQI_SHADOW_SHIELD && sd->status.inventory[index].equip == EQP_SHADOW_SHIELD) + wd = &sd->left_weapon; + else + wd = &sd->right_weapon; + + if (refine_bonus[wlv].script[r]) { + if (wd == &sd->left_weapon) { + sd->state.lr_flag = 1; + run_script(refine_bonus[wlv].script[r],0,sd->bl.id,0); + sd->state.lr_flag = 0; + } else + run_script(refine_bonus[wlv].script[r],0,sd->bl.id,0); + if (!calculating) + return 1; + } + } + else { //Shadow Armors (Shield, Body, Shoes, and Accessories) + uint8 r = sd->status.inventory[index].refine; + if (refine_bonus[9].script[r]) { + if (i == EQI_SHADOW_SHIELD) + sd->state.lr_flag = 3; + run_script(refine_bonus[9].script[r],0,sd->bl.id,0); + if (i == EQI_SHADOW_SHIELD) + sd->state.lr_flag = 0; + if (!calculating) + return 1; + } + } +#endif } } @@ -12922,6 +12995,11 @@ int status_readdb(void) for(k=0;k= REFINE_BONUS_MAX_TYPE) { + ShowError("refine_bonus_readdb_sub: Invalid item type '%s', valid type: %d - %d. \"%s\":%d\n", str[0], REFINE_TYPE_ARMOR, REFINE_BONUS_MAX_TYPE, filename, lines); + continue; + } + + // Refine number + refine = atoi(str[1]); + if (refine < 0 || refine > MAX_REFINE) { + ShowError("refine_bonus_readdb_sub: Invalid refine number, valid value: 0 - %d). \"%s\":%d\n", str[1], MAX_REFINE, filename, lines); + continue; + } + + // Script + if (*p != '{') { + ShowError("refine_bonus_readdb_sub: Invalid format (Script column-start) in \"%s\":%d.\n", filename, lines); + continue; + } + str[2] = p; + p = strstr(p+1,"}"); + if (strchr(p,',') != NULL) { + ShowError("refine_bonus_readdb_sub: Invalid format (Script column-end) in \"%s\":%d.\n", filename, lines); + continue; + } + + if ((script = parse_script(str[2], filename, lines, 0))) + refine_bonus[type].script[refine] = script; + + entries++; + } + fclose(fp); + + ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'\n", entries, filename); +} + +/** + * Prepare file to being read + * @author [Cydh/PServeRO] + **/ +static void refine_bonus_readdb(void) { + const char *filename[] = { + "refine_bonus.txt", DBIMPORT"/refine_bonus.txt", + }; + uint8 i; + StringBuf buf; + + StringBuf_Init(&buf); + for (i = 0; i < ARRAYLENGTH(filename); i++) { + StringBuf_Clear(&buf); + StringBuf_Printf(&buf, "%s/%s", db_path, filename[i]); + refine_bonus_readdb_sub(StringBuf_Value(&buf), (i)); + } + StringBuf_Destroy(&buf); + + /** Clearing up, fill the blank bonus with value. + Example, +1 has bonus bStr,1 and +5 has bStr,3 so make +2 ~ +4 has +1 bonus **/ + for (i = 0; i < REFINE_BONUS_MAX_TYPE; i++) { + uint8 j; + for (j = 0; j < MAX_REFINE+1; j++) { + if (!refine_bonus[i].script[j] && j > 0) { + refine_bonus[i].script[j] = refine_bonus[i].script[j-1]; + refine_bonus[i].ref[j] = true; + } + } + } +} + +/** + * Clear refine bonus scripts + * @author [Cydh/PServeRO] + **/ +static void refine_bonus_free(void) { + uint8 i; + for (i = 0; i < REFINE_BONUS_MAX_TYPE; i++) { + uint8 j; + for (j = 0; j < MAX_REFINE+1; j++) { + if (refine_bonus[i].script[j] && !refine_bonus[i].ref[j]) + script_free_code(refine_bonus[i].script[j]); + refine_bonus[i].script[j] = NULL; + refine_bonus[i].ref[j] = false; + } + } +} +#endif + void do_final_status(void) { +#ifdef PROJECT_REFINE_BONUS + refine_bonus_free(); +#endif ers_destroy(sc_data_ers); }