Merge and generalize more item abilities

- It's now possible to create an item that protects from any type of damage, status effect, or species (though some status effects may not be implemented)
- It's now possible to create slayer weapons for any species
This commit is contained in:
2015-01-13 10:35:12 -05:00
parent 84689cacaf
commit d6aeba8e0f
7 changed files with 188 additions and 169 deletions

View File

@@ -159,15 +159,18 @@ bool give_to_pc(short pc_num,cItem item,short print_result,bool allow_overload)
// TODO: Utilize the second parameter in special node processing
// if abil > 0, force abil, else ignore
bool forced_give(short item_num,eItemAbil abil) {
bool forced_give(short item_num,eItemAbil abil,short dat) {
short i,j;
cItem item;
if((item_num < 0) || (item_num > 399))
return true;
item = get_stored_item(item_num);
if(abil > eItemAbil::NONE)
if(abil > eItemAbil::NONE) {
item.ability = abil;
item.abil_data[0] = dat / 1000;
item.abil_data[1] = dat % 1000;
}
for(i = 0; i < 6; i++)
for(j = 0; j < 24; j++)
if(univ.party[i].main_status == eMainStatus::ALIVE && univ.party[i].items[j].variety == eItemType::NO_ITEM) {
@@ -216,52 +219,54 @@ bool take_gold(short amount,bool print_result) {
}
// returnes equipped protection level of specified abil, or -1 if no such abil is equipped
short get_prot_level(short pc_num,eItemAbil abil) {
short get_prot_level(short pc_num,eItemAbil abil, short dat) {
short i = 0;
for(i = 0; i < 24; i++)
if(univ.party[pc_num].items[i].variety != eItemType::NO_ITEM && (univ.party[pc_num].items[i].ability == abil)
&& (univ.party[pc_num].equip[i]))
&& univ.party[pc_num].equip[i] && (dat < 0 || dat == univ.party[pc_num].items[i].abil_data[1]))
return univ.party[pc_num].items[i].abil_data[0];
return -1;
}
short pc_has_abil_equip(short pc_num,eItemAbil abil) {
short i = 0;
while((univ.party[pc_num].items[i].variety == eItemType::NO_ITEM || univ.party[pc_num].items[i].ability != abil
|| !univ.party[pc_num].equip[i]) && (i < 24))
i++;
return i;
short pc_has_abil_equip(short pc_num,eItemAbil abil,short dat) {
for(short i = 0; i < 24; i++) {
if(univ.party[pc_num].items[i].variety == eItemType::NO_ITEM) continue;
if(univ.party[pc_num].items[i].ability != abil) continue;
if(!univ.party[pc_num].equip[i]) continue;
if(dat >= 0 && dat != univ.party[pc_num].items[i].abil_data[1]) continue;
return i;
}
return 0;
}
short pc_has_abil(short pc_num,eItemAbil abil) {
short i = 0;
while((univ.party[pc_num].items[i].variety == eItemType::NO_ITEM || univ.party[pc_num].items[i].ability != abil
) && (i < 24))
i++;
return i;
short pc_has_abil(short pc_num,eItemAbil abil,short dat) {
for(short i = 0; i < 24; i++) {
if(univ.party[pc_num].items[i].variety == eItemType::NO_ITEM) continue;
if(univ.party[pc_num].items[i].ability != abil) continue;
if(dat >= 0 && dat != univ.party[pc_num].items[i].abil_data[1]) continue;
return i;
}
return 0;
}
bool party_has_abil(eItemAbil abil) {
bool party_has_abil(eItemAbil abil,short dat) {
short i;
for(i = 0; i < 6; i++)
if(univ.party[i].main_status == eMainStatus::ALIVE)
if(pc_has_abil(i,abil) < 24)
if(pc_has_abil(i,abil,dat) < 24)
return true;
return false;
}
bool party_take_abil(eItemAbil abil) {
bool party_take_abil(eItemAbil abil,short dat) {
short i,item;
for(i = 0; i < 6; i++)
if(univ.party[i].main_status == eMainStatus::ALIVE)
if((item = pc_has_abil(i,abil)) < 24) {
if((item = pc_has_abil(i,abil,dat)) < 24) {
if(univ.party[i].items[item].charges > 1)
univ.party[i].items[item].charges--;
else take_item(i,item);
@@ -449,8 +454,9 @@ void enchant_weapon(short pc_num,short item_hit,short enchant_type,short new_val
case 4:
store_name += " (F!)";
univ.party[pc_num].items[item_hit].value = new_val;
univ.party[pc_num].items[item_hit].ability = eItemAbil::FLAMING_WEAPON;
univ.party[pc_num].items[item_hit].ability = eItemAbil::DAMAGING_WEAPON;
univ.party[pc_num].items[item_hit].abil_data[0] = 5;
univ.party[pc_num].items[item_hit].abil_data[1] = int(eDamageType::FIRE);
break;
case 5:
store_name += " (+5)";