385 lines
13 KiB
Plaintext
385 lines
13 KiB
Plaintext
#include "fcb_inc_prot"
|
|
|
|
//==========================================/
|
|
void switch_forge_enable(int enable)
|
|
//==========================================/
|
|
{
|
|
//enable/disable forge functions
|
|
//ui_main_set_hidden_refresh(MAIN_FOLDER_INDEX_MAINMENU | n, !enable);
|
|
//n defines which option to control:
|
|
|
|
//1: Add item properties
|
|
//2: Remove item properties
|
|
//3: Set charge count
|
|
|
|
//4: Duplicate item
|
|
//5: Set name
|
|
//6: Colored item names guide
|
|
|
|
//Commented menues will NOT be turned off when the forge is disabled.
|
|
ui_main_set_hidden_refresh(MAIN_FOLDER_INDEX_MAINMENU | 1, !enable);
|
|
ui_main_set_hidden_refresh(MAIN_FOLDER_INDEX_MAINMENU | 2, !enable);
|
|
ui_main_set_hidden_refresh(MAIN_FOLDER_INDEX_MAINMENU | 3, !enable);
|
|
//ui_main_set_hidden_refresh(MAIN_FOLDER_INDEX_MAINMENU | 4, !enable);
|
|
//ui_main_set_hidden_refresh(MAIN_FOLDER_INDEX_MAINMENU | 5, !enable);
|
|
//ui_main_set_hidden_refresh(MAIN_FOLDER_INDEX_MAINMENU | 6, !enable);
|
|
}
|
|
|
|
//==========================================/
|
|
void switch_ILR_enable(int enable)
|
|
//==========================================/
|
|
{
|
|
SetLocalInt(FCB_HOST, SW_ILR_ENABLE, enable);
|
|
}
|
|
|
|
//==========================================/
|
|
void start_conversation(object user)
|
|
//==========================================/
|
|
{
|
|
AssignCommand(FCB_CV, ActionStartConversation(user, CV_MAIN, 1, 0));
|
|
}
|
|
|
|
//==========================================/
|
|
int get_character_level(object user)
|
|
//==========================================/
|
|
{
|
|
int level = GetLevelByClass(GetClassByPosition(1, user), user);
|
|
level += GetLevelByClass(GetClassByPosition(2, user), user);
|
|
level += GetLevelByClass(GetClassByPosition(3, user), user);
|
|
|
|
return level;
|
|
}
|
|
|
|
//==========================================/
|
|
int get_item_cost(object item)
|
|
//==========================================/
|
|
{
|
|
int item_plot_flag = GetPlotFlag(item);
|
|
SetPlotFlag(item, 0);
|
|
int item_identified = GetIdentified(item);
|
|
SetIdentified(item, 1);
|
|
|
|
int cost = GetGoldPieceValue(item);
|
|
|
|
SetPlotFlag(item, item_plot_flag);
|
|
SetIdentified(item, item_identified);
|
|
return cost;
|
|
}
|
|
|
|
//::::::::::::::::::::::::::::::::::::::::::/
|
|
int item_level_search(int cost, int begin, int end)
|
|
//::::::::::::::::::::::::::::::::::::::::::/
|
|
{
|
|
int n = begin + (end - begin)/2;
|
|
int max_single_item_value_0 = StringToInt(Get2DAString("itemvalue", "MAXSINGLEITEMVALUE", n-1));
|
|
int max_single_item_value_1 = StringToInt(Get2DAString("itemvalue", "MAXSINGLEITEMVALUE", n));
|
|
|
|
if(cost > max_single_item_value_0)
|
|
{
|
|
if(cost <= max_single_item_value_1)
|
|
{
|
|
return n;
|
|
}
|
|
else if(n >= ITEM_LEVEL_MAX-1)
|
|
{
|
|
return ITEM_LEVEL_MAX-1;
|
|
}
|
|
else
|
|
{
|
|
return item_level_search(cost, n+1, end);
|
|
}
|
|
}
|
|
else if(n <= 0)
|
|
{
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
return item_level_search(cost, begin, n-1);
|
|
}
|
|
}
|
|
|
|
//==========================================/
|
|
int get_item_level(object item)
|
|
//==========================================/
|
|
{
|
|
int cost = get_item_cost(item);
|
|
|
|
return item_level_search(cost, 0, ITEM_LEVEL_MAX-1) + 1;
|
|
}
|
|
|
|
//==========================================/
|
|
int get_item_level_by_cost(int cost)
|
|
//==========================================/
|
|
{
|
|
return item_level_search(cost, 0, ITEM_LEVEL_MAX-1) + 1;
|
|
}
|
|
|
|
//==========================================/
|
|
object copy_item(object item, object target_inventory)
|
|
//==========================================/
|
|
{
|
|
object item_copy = CopyItem(item, target_inventory, 0);
|
|
|
|
SetIdentified(item_copy, 1);
|
|
return item_copy;
|
|
}
|
|
|
|
//==========================================/
|
|
int get_item_stack_size(object item)
|
|
//==========================================/
|
|
{
|
|
return StringToInt(Get2DAString("baseitems", "ILRStackSize", GetBaseItemType(item)));
|
|
}
|
|
|
|
//==========================================/
|
|
int give_gold(int gp_amount, object user)
|
|
//==========================================/
|
|
{
|
|
if(gp_amount >= 0)
|
|
{
|
|
GiveGoldToCreature(user, gp_amount);
|
|
}
|
|
else
|
|
{
|
|
if((GetGold(user) + gp_amount) >= 0)
|
|
{
|
|
TakeGoldFromCreature(-gp_amount, user, 1);
|
|
}
|
|
else
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
//==========================================/
|
|
int iprp_to_param(itemproperty iprp)
|
|
//==========================================/
|
|
{
|
|
int itempropdef_row = FILTER_IPRP_TYPE & GetItemPropertyType(iprp);
|
|
int subtype_row = FILTER_IPRP_SUB; //all 1s
|
|
int cost_row = FILTER_IPRP_COST; //all 1s
|
|
int param1_row = FILTER_IPRP_PARAM1 & GetItemPropertyParam1Value(iprp);
|
|
|
|
//subtype exists
|
|
string subtype_resref = Get2DAString("itempropdef", "SubTypeResRef", itempropdef_row);
|
|
if(subtype_resref != "")
|
|
{
|
|
subtype_row &= GetItemPropertySubType(iprp);
|
|
}
|
|
|
|
//cost exists
|
|
int costtable_row = GetItemPropertyCostTable(iprp);
|
|
if(costtable_row > 0)
|
|
{
|
|
cost_row &= GetItemPropertyCostTableValue(iprp);
|
|
}
|
|
|
|
int param = (itempropdef_row << BITLEN_IPRP_SUB) | subtype_row;
|
|
param = (param << BITLEN_IPRP_COST) | cost_row;
|
|
param = (param << BITLEN_IPRP_PARAM1) | param1_row;
|
|
|
|
return param;
|
|
}
|
|
|
|
//==========================================/
|
|
itemproperty param_to_iprp(int param)
|
|
//==========================================/
|
|
{
|
|
int param0 = 0;
|
|
int param1 = 0;
|
|
int param2 = 0;
|
|
int param3 = 0;
|
|
|
|
//----------------------------------------//
|
|
//7 bits
|
|
int param1_row = FILTER_IPRP_PARAM1 & param;
|
|
param >>>= BITLEN_IPRP_PARAM1;
|
|
|
|
//8 bits
|
|
int cost_row = FILTER_IPRP_COST & param;
|
|
param >>>= BITLEN_IPRP_COST;
|
|
|
|
//10 bits
|
|
int subtype_row = FILTER_IPRP_SUB & param;
|
|
param >>>= BITLEN_IPRP_SUB;
|
|
|
|
//7 bits type
|
|
param0 = FILTER_IPRP_TYPE & param;
|
|
|
|
//----------------------------------------//
|
|
//subtype exists
|
|
if(subtype_row != FILTER_IPRP_SUB)
|
|
{
|
|
param1 = subtype_row;
|
|
|
|
if(cost_row != FILTER_IPRP_COST)
|
|
{
|
|
param2 = cost_row;
|
|
param3 = param1_row;
|
|
}
|
|
else
|
|
{
|
|
param2 = param1_row;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(cost_row != FILTER_IPRP_COST)
|
|
{
|
|
param1 = cost_row;
|
|
param2 = param1_row;
|
|
}
|
|
}
|
|
|
|
return convert_iprp(param0, param1, param2, param3);
|
|
}
|
|
|
|
//==========================================/
|
|
itemproperty convert_iprp(int param0, int param1, int param2, int param3)
|
|
//==========================================/
|
|
{
|
|
switch(param0)
|
|
{
|
|
case 0: return ItemPropertyAbilityBonus(param1, param2);
|
|
case 1: return ItemPropertyACBonus(param1);
|
|
case 2: return ItemPropertyACBonusVsAlign(param1, param2);
|
|
case 3: return ItemPropertyACBonusVsDmgType(param1, param2);
|
|
case 4: return ItemPropertyACBonusVsRace(param1, param2);
|
|
case 5: return ItemPropertyACBonusVsSAlign(param1, param2);
|
|
case 6: return ItemPropertyEnhancementBonus(param1);
|
|
case 7: return ItemPropertyEnhancementBonusVsAlign(param1, param2);
|
|
case 8: return ItemPropertyEnhancementBonusVsRace(param1, param2);
|
|
case 9: return ItemPropertyEnhancementBonusVsSAlign(param1, param2);
|
|
case 10: return ItemPropertyEnhancementPenalty(param1);
|
|
case 11: return ItemPropertyWeightReduction(param1);
|
|
case 12: return ItemPropertyBonusFeat(param1);
|
|
case 13: return ItemPropertyBonusLevelSpell(param1, param2);
|
|
//case 14: return
|
|
case 15: return ItemPropertyCastSpell(param1, param2);
|
|
case 16: return ItemPropertyDamageBonus(param1, param2);
|
|
case 17: return ItemPropertyDamageBonusVsAlign(param1, param3, param2); //special index shift
|
|
case 18: return ItemPropertyDamageBonusVsRace(param1, param3, param2); //special index shift
|
|
case 19: return ItemPropertyDamageBonusVsSAlign(param1, param3, param2); //special index shift
|
|
case 20: return ItemPropertyDamageImmunity(param1, param2);
|
|
case 21: return ItemPropertyDamagePenalty(param1);
|
|
case 22: return ItemPropertyDamageReduction(param1, param2);
|
|
case 23: return ItemPropertyDamageResistance(param1, param2);
|
|
case 24: return ItemPropertyDamageVulnerability(param1, param2);
|
|
//case 25: return
|
|
case 26: return ItemPropertyDarkvision();
|
|
case 27: return ItemPropertyDecreaseAbility(param1, param2);
|
|
case 28: return ItemPropertyDecreaseAC(param1, param2);
|
|
case 29: return ItemPropertyDecreaseSkill(param1, param2);
|
|
//case 30: return
|
|
//case 31: return
|
|
case 32: return ItemPropertyContainerReducedWeight(param1);
|
|
case 33: return ItemPropertyExtraMeleeDamageType(param1);
|
|
case 34: return ItemPropertyExtraRangeDamageType(param1);
|
|
case 35: return ItemPropertyHaste();
|
|
case 36: return ItemPropertyHolyAvenger();
|
|
case 37: return ItemPropertyImmunityMisc(param1);
|
|
case 38: return ItemPropertyImprovedEvasion();
|
|
case 39: return ItemPropertyBonusSpellResistance(param1);
|
|
case 40: return ItemPropertyBonusSavingThrowVsX(param1, param2);
|
|
case 41: return ItemPropertyBonusSavingThrow(param1, param2);
|
|
//case 42: return
|
|
case 43: return ItemPropertyKeen();
|
|
case 44: return ItemPropertyLight(param1, param2); //special index shift*
|
|
case 45: return ItemPropertyMaxRangeStrengthMod(param1);
|
|
//case 46: return
|
|
case 47: return ItemPropertyNoDamage();
|
|
case 48: return ItemPropertyOnHitProps(param1, param2 + (param1 == IP_CONST_ONHIT_LEVELDRAIN), param3); //special index shift
|
|
case 49: return ItemPropertyReducedSavingThrowVsX(param1, param2);
|
|
case 50: return ItemPropertyReducedSavingThrow(param1, param2);
|
|
case 51: return ItemPropertyRegeneration(param1);
|
|
case 52: return ItemPropertySkillBonus(param1, param2);
|
|
case 53: return ItemPropertySpellImmunitySpecific(param1);
|
|
case 54: return ItemPropertySpellImmunitySchool(param1);
|
|
case 55: return ItemPropertyThievesTools(param1);
|
|
case 56: return ItemPropertyAttackBonus(param1);
|
|
case 57: return ItemPropertyAttackBonusVsAlign(param1, param2);
|
|
case 58: return ItemPropertyAttackBonusVsRace(param1, param2);
|
|
case 59: return ItemPropertyAttackBonusVsSAlign(param1, param2);
|
|
case 60: return ItemPropertyAttackPenalty(param1);
|
|
case 61: return ItemPropertyUnlimitedAmmo(param2);
|
|
case 62: return ItemPropertyLimitUseByAlign(param1);
|
|
case 63: return ItemPropertyLimitUseByClass(param1);
|
|
case 64: return ItemPropertyLimitUseByRace(param1);
|
|
case 65: return ItemPropertyLimitUseBySAlign(param1);
|
|
//case 66: return
|
|
case 67: return ItemPropertyVampiricRegeneration(param1);
|
|
//case 68: return
|
|
//case 69: return
|
|
case 70: return ItemPropertyTrap(param1, param2);
|
|
case 71: return ItemPropertyTrueSeeing();
|
|
case 72: return ItemPropertyOnMonsterHitProperties(param1, param2);
|
|
case 73: return ItemPropertyTurnResistance(param1);
|
|
case 74: return ItemPropertyMassiveCritical(param1);
|
|
case 75: return ItemPropertyFreeAction();
|
|
//case 76: return
|
|
case 77: return ItemPropertyMonsterDamage(param1);
|
|
case 78: return ItemPropertyImmunityToSpellLevel(param1); //special index shift*
|
|
case 79: return ItemPropertySpecialWalk(param1);
|
|
case 80: return ItemPropertyHealersKit(param1);
|
|
case 81: return ItemPropertyWeightIncrease(param1);
|
|
case 82: return ItemPropertyOnHitCastSpell(param1, param2+1); //special index shift
|
|
case 83: return ItemPropertyVisualEffect(param1);
|
|
case 84: return ItemPropertyArcaneSpellFailure(param1);
|
|
}
|
|
itemproperty ipRet;
|
|
return ipRet;
|
|
}
|
|
|
|
//==========================================/
|
|
int get_item_inventory_slot(object item, object user)
|
|
//==========================================/
|
|
{
|
|
int n = 0;
|
|
while(n < NUM_INVENTORY_SLOTS)
|
|
{
|
|
if(GetItemInSlot(n, user) == item)
|
|
{
|
|
return n;
|
|
}
|
|
n++;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
//==========================================/
|
|
void equip_item(object item, int equip_slot, object user)
|
|
//==========================================/
|
|
{
|
|
effect immobilize = ExtraordinaryEffect(EffectCutsceneImmobilize());
|
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, immobilize, user);
|
|
|
|
//----------------------------------------//
|
|
AssignCommand(user, ActionEquipItem(item, equip_slot));
|
|
RemoveEffect(user, immobilize);
|
|
}
|
|
|
|
//==========================================/
|
|
void disp_delayed_msg(object user, string msg)
|
|
//==========================================/
|
|
{
|
|
DelayCommand(INFO_MSG_DELAY, SendMessageToPC(user, c_hlt2(msg)));
|
|
}
|
|
|
|
//==========================================/
|
|
void visual_effect()
|
|
//==========================================/
|
|
{
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(MOD_VISUAL_EFFECT), EXT_PLACEABLE);
|
|
}
|
|
|
|
//==========================================/
|
|
void clear_script_param()
|
|
//==========================================/
|
|
{
|
|
SetLocalInt(FCB_HOST, SCRIPT_PARAM, (~FILTER_F100) & GetLocalInt(FCB_HOST, SCRIPT_PARAM));
|
|
}
|