i want loot can get good stuff(such GM weapon\GM armor\ etc.)more earsier,but i need guide how edit that file,thx a lot.
Code: Select all
// Sno removed multiplier handling, which is now done in scripts/control/skilladvancerequip.src
use cfgfile;
use os;
include "include/client";
//include "include/attributes";
include "include/random";
//
// See starteqp.cfg for a description of what we expect in the config file.
//
const weapon := 1;
const armor := 2;
const SHIELD := 3;
const CLOTHING := 4;
const MISC := 5;
const PROF := 6;
const MAX_COLOR := 1184;
var availspells := 0;
var availtypes := 0;
var availeffects := 0;
var availgreaters := 0;
var availspellonhit := 0;
var availtypeonhit := 0;
var availeffectonhit := 0;
var availgreateronhit := 0;
var magicspawnchance := 0;
var magiclevel := 0;
var basechance := 0;
var baselevel := 0;
var making_starting_equipment := 0;
var starteqp_cfg;
var magiccfg;
var hitscriptcfg;
var onhitcfg;
var unique_items_created := {};
function MakeLoot( corpse, lootgroup := 0, magic_chance_default := 0, magic_level_default := 0 )
starteqp_cfg := ReadConfigFile( "::nlootgroup" );
if( lootgroup )
if ( (lootgroup >= 5) && (lootgroup <= 9) )
magicspawnchance := lootgroup * 8;
magiclevel := lootgroup - 2;
basechance := magicspawnchance;
baselevel := magiclevel;
endif
//spawnchests are lootgroups 109 through 119
if ( (lootgroup >= 109) && (lootgroup <= 119) )
magicspawnchance := lootgroup - 75;
magiclevel := CInt((lootgroup - 109) / 3);
basechance := magicspawnchance;
baselevel := magiclevel;
endif
if ( (lootgroup == 143 ))
magicspawnchance := lootgroup * 8;
magiclevel := 8;
basechance := magicspawnchance;
baselevel := magiclevel;
endif
if( magic_chance_default )
magicspawnchance := magic_chance_default;
basechance := magicspawnchance;
endif
if( magic_level_default )
magiclevel := magic_level_default;
baselevel := magiclevel;
endif
CreateFromGroup( corpse, CInt(lootgroup) );
else
var npcdesc := ReadConfigFile( "::npcdesc" );
var elem := FindConfigElem( npcdesc, GetObjProperty( corpse, "npctemplate" ) );
var mprop;
var mlevel;
var lootgroups;
if( elem )
mprop := GetConfigInt( elem, "Magicitemchance");
mlevel := GetConfigInt( elem, "Magicitemlevel");
lootgroups := GetConfigStringArray( elem, "lootgroup" );
endif
if( mprop )
magicspawnchance := mprop;
basechance := magicspawnchance;
endif
if( mlevel )
magiclevel := mlevel;
baselevel := magiclevel;
endif
foreach str in lootgroups
CreateFromGroup( corpse, CInt(str) );
endforeach
endif
endfunction
function MakePrizeLoot( corpse, lootgroup := 0, magic_chance_default := 0, magic_level_default := 0 )
starteqp_cfg := ReadConfigFile( "::nlootgroup" );
if( lootgroup )
if ( (lootgroup >= 5) && (lootgroup <= 9) )
magicspawnchance := lootgroup * 10;
magiclevel := lootgroup - 3;
basechance := magicspawnchance;
baselevel := magiclevel;
endif
//spawnchests are lootgroups 109 through 119
if ( (lootgroup >= 109) && (lootgroup <= 119) )
magicspawnchance := lootgroup - 75;
magiclevel := CInt((lootgroup - 109) / 3);
basechance := magicspawnchance;
baselevel := magiclevel;
endif
if( magic_chance_default )
magicspawnchance := magic_chance_default;
basechance := magicspawnchance;
endif
if( magic_level_default )
magiclevel := magic_level_default;
baselevel := magiclevel;
endif
CreateFromGroup( corpse, CInt(lootgroup) );
else
var npcdesc := ReadConfigFile( "::npcdesc" );
var elem := FindConfigElem( npcdesc, GetObjProperty( corpse, "npctemplate" ) );
var mprop;
var mlevel;
var lootgroups;
if( elem )
mprop := GetConfigInt( elem, "Magicitemchance");
mlevel := GetConfigInt( elem, "Magicitemlevel");
lootgroups := GetConfigStringArray( elem, "lootgroup" );
endif
if( mprop )
magicspawnchance := mprop;
basechance := magicspawnchance;
endif
if( mlevel )
magiclevel := mlevel;
baselevel := magiclevel;
endif
foreach str in lootgroups
CreateFromGroup( corpse, CInt(str) );
endforeach
endif
endfunction
function CreateStartingEquipment( who, skillids )
making_starting_equipment := 1;
starteqp_cfg := ReadConfigFile( "::starteqp" );
foreach skillid in skillids
var skillname := GetSkillName( CInt(skillid) );
CreateFromGroup( who.backpack, skillname );
endforeach
CreateFromGroup(who.backpack, "all");
endfunction
function CreateFromGroup( who, group )
var elem := starteqp_cfg[ group ];
if(!elem)
return;
endif
foreach str in GetConfigStringArray( elem, "Random" )
CreateFromRandomString( who, str );
endforeach
foreach str in GetConfigStringArray( elem, "Stack" )
CreateFromStackString( who, str );
endforeach
foreach str in GetConfigStringArray( elem, "Item" )
CreateFromItemString( who, str );
endforeach
foreach str in GetConfigStringArray( elem, "Unique" )
CreateFromUniqueString( who, str );
endforeach
foreach str in GetConfigStringArray( elem, "Group" )
CreateFromGroup( who, str );
endforeach
endfunction
function GetSkillName( skillid )
var cfg := ReadConfigFile( "::skills" );
return cfg[skillid].name;
endfunction
/////////////////////////////////////////////////////////////////////////////
//
// An 'Item' string can have one of the following forms:
//
// FORM EXAMPLE
// --------------------------------------------------------------------
// "Item [ObjTypeName]" "Item Mortar"
// "Item [Count] [ObjTypeName]" "Item 4 EmptyBottle"
// "Item [ObjTypeName] [Colornum]" "Item Robe 0xE9"
// "Item [Count] [ObjTypeName] [Colornum]" "Item 2 Robe 0xE9"
// "item [ObjTypeName] [chancetospawn][colornum] "item Longsword 100 0"
// "Item [Count] [ObjTypeName] [chancetospawn][colornum] "item 1 Longsword 100 0"
//
//Item 1 level1map 0 1
//
/////////////////////////////////////////////////////////////////////////////
function CreateFromItemString( who, str )
var params := SplitWords( str );
var count;
var objname;
var chance;
if ( RandomDiceStr( params[1] ) )
count := RandomDiceStr( params[1] );
params[1] := params[2];
params[2] := params[3];
params[3] := params[4];
else
count := 1;
endif
objname := params[1];
if (!objname) return; endif
if ( CInt(params[2]) )
chance := CInt( params[2] );
else
chance := 100;
endif
while( count )
if( Random(100) < chance )
magicspawnchance := basechance;
magiclevel := baselevel;
var item := CreateItemInContainer( who, objname );
var ismagic;
if ( CInt(params[3]) )
item.color := CInt( params[3] );
endif
if(making_starting_equipment)
item.newbie := 1;
endif
while( magiclevel > 0 )
if( (Random(100)+1) <= magicspawnchance )
ismagic := 1;
break;
else
magicspawnchance := magicspawnchance + 10;
magiclevel := magiclevel - 1;
endif
endwhile
if( ismagic )
var canbemagic := MagicAllowedandType( objname ); //for magic items!
var enchant := (Random(75)+26) * CInt(magiclevel/2 + 1);
if (magiclevel == 5)
enchant := enchant + 51;
endif
case (canbemagic)
weapon:
if(enchant < 75)
ApplyHPMod( item );
elseif(enchant < 200)
ApplyWeapSkillMod( item );
elseif(enchant < 350)
ApplyDmgMod( item );
else
ApplyWeapHitscript( who, item );
endif
AddName( item );
break;
armor:
if(enchant < 75)
ApplyHPMod( item );
elseif(enchant < 150)
ApplyArSkillMod( item );
elseif(enchant < 350)
ApplyARMod( item );
else
ApplyOnHitScript( who, item );
endif
AddName( item );
break;
SHIELD:
if(enchant < 100)
ApplyHPMod( item );
elseif(enchant < 200)
ApplyArSkillMod( item );
else
ApplyARMod( item );
endif
AddName( item );
break;
CLOTHING:
if(enchant < 300)
ApplyMiscSkillMod( item );
else
ApplyMiscArMod( item );
endif
AddName( item );
AddRandomColor( item );
break;
MISC:
if(enchant < 300)
ApplyMiscSkillMod( item );
elseif(enchant < 350 )
ApplyEnchant( who, item );
else
ApplyMiscArMod( item );
endif
AddName( item );
break;
PROF:
ApplyMiscSkillMod( item );
AddName( item );
break;
default:
endcase
endif
endif
count := count - 1;
/*
magicspawnchance := basechance;
magiclevel := baselevel;
*/
endwhile
endfunction
/////////////////////////////////////////////////////////////////////////////
//
// A 'Random' string follows the following form:
//
// FORM EXAMPLE
// --------------------------------------------------------------------
// "Random [Count] [GroupName]" "Random 4 Reagents"
// "Random [Count] [GroupName] [chancetospawn]" "Random 4 Reagents 50"
//
// 'Count' entries from 'GroupName' are chosen randomly. The same entry
// will not be chosen twice.
//
/////////////////////////////////////////////////////////////////////////////
function CreateFromRandomString( who, desc )
var params := SplitWords( desc );
var count;
var group;
var chance;
var elem;
var items;
var stacks;
if ( RandomDiceStr( params[1] ) )
count := RandomDiceStr( params[1] );
params[1] := params[2];
params[2] := params[3];
else
count := 1;
endif
group := params[1];
if ( CInt(params[2]) )
chance := CInt( params[2] );
else
chance := 100;
endif
elem := FindConfigElem( starteqp_cfg, group);
if( elem == error )
return;
endif
items := GetConfigStringArray( elem, "Item" );
stacks := GetConfigStringArray( elem, "Stack" );
if( len(items) )
if( count > len( items ) )
count := len( items );
endif
while( count )
if( Random(100) < chance )
var n := RandomDiceStr( "1d"+len(items) );
if( items[n] )
CreateFromItemString( who, items[n] );
items[n] := 0;
else
continue;
endif
endif
count := count - 1;
endwhile
elseif( len(stacks) )
if( count > len( stacks ) )
count := len( stacks );
endif
while( count )
if( Random(100) < chance )
var n := RandomDiceStr( "1d" + len(stacks) );
if( stacks[n] )
CreateFromStackString( who, stacks[n] );
stacks[n] := 0;
else
continue;
endif
endif
count := count - 1;
endwhile
endif
endfunction
/////////////////////////////////////////////////////////////////////////////
//
// A 'Unique' string has the following form:
//
// FORM EXAMPLE
// --------------------------------------------------------------------
// "Unique [ObjTypeName]" "Unique Spellbook"
//
// Only one of a unique item will be created as starting equipment.
//
/////////////////////////////////////////////////////////////////////////////
function CreateFromUniqueString( who, str )
var objtype := GetObjtypeByName( str );
if (!objtype)
return;
endif
if (objtype in unique_items_created)
return;
endif
unique_items_created[ len(unique_items_created) + 1 ] := objtype;
var uitem := CreateItemInContainer( who, objtype );
if(making_starting_equipment)
uitem.newbie := 1;
endif
endfunction
/////////////////////////////////////////////////////////////////////////////
//
// A 'Stack' string is just like "Item" but stacks the item instead of making
// count number of individual items.
//
/////////////////////////////////////////////////////////////////////////////
function CreateFromStackString( who, str )
var params := SplitWords( str );
var count;
var objname;
var chance;
if ( RandomDiceStr( params[1] ) )
count := RandomDiceStr( params[1] );
params[1] := params[2];
params[2] := params[3];
params[3] := params[4];
else
count := 1;
endif
objname := params[1];
if (!objname) return; endif
if ( CInt(params[2]) )
chance := CInt( params[2] );
else
chance := 100;
endif
if( Random(100) < chance )
var item := CreateItemInContainer( who, objname, count );
if (!item)
return;
endif
if ( CInt(params[3]) )
item.color := CInt( params[3] );
endif
if(making_starting_equipment)
item.newbie := 1;
endif
endif
endfunction
////
//Checks to see if that item is allowed to be magic and returns the type
////
function MagicAllowedandType( objname )
if( !magiccfg )
magiccfg := ReadConfigFile( ":combat:enchantableitems" );
endif
var elem1 := FindConfigElem( magiccfg, weapon );
var data1 := GetConfigInt( elem1, objname );
if( data1 )
return weapon;
endif
var elem2 := FindConfigElem( magiccfg, armor );
var data2 := GetConfigInt( elem2, objname );
if( data2 )
return armor;
endif
var elem3 := FindConfigElem( magiccfg, SHIELD );
var data3 := GetConfigInt( elem3, objname );
if( data3 )
return SHIELD;
endif
var elem4 := FindConfigElem( magiccfg, CLOTHING );
var data4 := GetConfigInt( elem4, objname );
if( data4 )
return CLOTHING;
endif
var elem5 := FindConfigElem( magiccfg, MISC );
var data5 := GetConfigInt( elem5, objname );
if( data5 )
return MISC;
endif
var elem6 := FindConfigElem( magiccfg, PROF );
var data6 := GetConfigInt( elem6, objname );
if( data6 )
return PROF;
endif
return 0;
endfunction
////
//Picks and assigns a damagemod and a suffix for the item
////
function ApplyDmgMod( item )
var numb := (Random(50)+1) * magiclevel * 2;
case( CInt(magiclevel / 3) )
0: break;
1: if( numb < 150 )
numb := 150;
endif
break;
2: if( numb < 300 )
numb := 300;
endif
break;
endcase
if( numb < 150 )
item.dmg_mod := 5;
elseif( numb < 300 )
item.dmg_mod := 10;
elseif( numb < 400 )
item.dmg_mod := 15;
elseif( numb < 520 )
item.dmg_mod := 20;
elseif( numb < 600 )
item.dmg_mod := 25;
else
item.dmg_mod := 30;
endif
if( (Random(100)+1) <= (10 * magiclevel) )
if ((Random(100)+1) <= 75)
ApplyHPMod( item );
else
ApplyWeapSkillMod( item );
endif
endif
endfunction
////
//Picks and assigns a new HP and prefix for the item
////
function ApplyHPMod( item )
var numb := (Random(50)+1) * magiclevel * 2;
var hp;
case( CInt(magiclevel / 3) )
0: break;
1: if( numb < 75 )
numb := 75;
endif
break;
2: if( numb < 150 )
numb := 150;
endif
break;
endcase
if( numb < 75 )
hp := 10;
elseif( numb < 150 )
hp := 20;
elseif( numb < 300 )
hp := 30;
elseif( numb < 400 )
hp := 40;
elseif( numb < 550 )
hp := 50;
else
hp := 60;
endif
item.maxhp_mod := hp;
item.hp := item.maxhp;
endfunction
////
//Picks a AR mod and suffix for the item
////
function ApplyARMod( item )
var numb := (Random(50)+1) * magiclevel * 2;
case( CInt(magiclevel / 3) )
0: break;
1: if( numb < 150 )
numb := 150;
endif
break;
2: if( numb < 300 )
numb := 300;
endif
break;
endcase
if( numb < 150 )
item.ar_mod := 5;
elseif( numb < 300 )
item.ar_mod := 10;
elseif( numb < 400 )
item.ar_mod := 15;
elseif( numb < 500 )
item.ar_mod := 20;
elseif( numb < 600 )
item.ar_mod := 25;
else
item.ar_mod := 30;
endif
//Check for another enchantment
if( (Random(100)+1) <= (10 * magiclevel) )
if ((Random(100)+1) <= 75)
ApplyHPMod( item );
else
ApplyArSkillMod( item );
endif
endif
endfunction
function ApplyMiscArMod( item )
var numb := (Random(50)+1) * magiclevel * 2;
var amount;
case( CInt(magiclevel / 3) )
0: break;
1: if( numb < 200 )
numb := 200;
endif
break;
2: if( numb < 350 )
numb := 350;
endif
break;
endcase
if( numb < 200 )
amount := 1;
elseif( numb < 350 )
amount := 2;
elseif( numb < 450 )
amount := 3;
elseif( numb < 550 )
amount := 4;
elseif( numb < 600 )
amount := 5;
else
amount := 6;
endif
SetObjProperty( item, "ArBonus", amount );
//Check for another enchantment
if( (Random(100)+1) <= (8 * magiclevel) )
ApplyMiscSkillMod( item );
endif
endfunction
function ApplyWeapHitscript( who, item )
CountAvailHitscripts( );
var scripttype := (Random(94)+1) + (magiclevel * 2);
if (scripttype <= 40)
ApplySpellHitscript( item );
elseif (scripttype <= 100)
ApplySlayerHitscript( item );
elseif (scripttype <= 120)
ApplyEffectHitscript( item );
elseif (scripttype <= 125)
DestroyItem( item );
CreateFromRandomString( who, "GMWeapon" );
else
ApplyGreaterHitscript( item );
endif
endfunction
function ApplySpellHitscript( item )
set_critical( 1 );
var multiplier := 10;
//Set the spell
var n := RandomDiceStr( "1d" + availspells );
var spell := hitscriptcfg[n].Spellid;
SetObjProperty( item, "HitWithSpell", spell );
//Set the spell power
var ascircle := (Random(100)+1) * (magiclevel - 3);
if (ascircle < 50)
ascircle := 1;
elseif (ascircle < 100)
ascircle := 2;
elseif (ascircle < 150)
ascircle := 3;
elseif (ascircle < 200)
ascircle := 4;
elseif (ascircle < 250)
ascircle := 5;
elseif (ascircle < 300)
ascircle := 6;
else
ascircle := 7;
endif
var ascirclemod := hitscriptcfg[n].AsCircleMod;
if (ascirclemod)
ascircle := ascircle + ascirclemod;
endif
if (ascircle <= 0)
ascircle := 1;
endif
SetObjProperty( item, "EffectCircle", ascircle );
//Set the spell chance
var chanceofeffect := RandomDiceStr("1d10") * magiclevel;
var chanceofeffectmod := hitscriptcfg[n].ChanceOfEffectMod;
if (chanceofeffectmod)
chanceofeffect := chanceofeffect + chanceofeffectmod;
endif
if (chanceofeffect <= 0)
chanceofeffect := 4;
endif
SetObjProperty( item, "ChanceOfEffect", chanceofeffect );
SetHitscript( item, n, multiplier );
set_critical( 0 );
endfunction
function ApplySlayerHitscript( item )
set_critical( 1 );
var multiplier := 2;
//Set the creature type
var n;
var power := (Random(100)+1) * (magiclevel - 3);
if (power < 10)
n := 1;
elseif (power < 25)
n := 2;
elseif (power < 50)
n := 3;
elseif (power < 75)
n := 4;
elseif (power < 100)
n := 5;
elseif (power < 125)
n := 6;
elseif (power < 150)
n := 7;
elseif (power < 175)
n := 8;
elseif (power < 200)
n := 9;
elseif (power < 215)
n := 10;
elseif (power < 230)
n := 11;
elseif (power < 245)
n := 12;
elseif (power < 260)
n := 13;
elseif (power < 275)
n := 14;
elseif (power < 290)
n := 15;
elseif (power < 300)
n := 16;
else
n := 17;
endif
n := n + availspells;
var type := hitscriptcfg[n].Type;
SetObjProperty( item, "SlayType", type );
SetHitscript( item, n, multiplier );
set_critical( 0 );
endfunction
function ApplyEffectHitscript( item )
set_critical( 1 );
var multiplier := 2;
//Find the good effect
var n := RandomDiceStr("1d"+availeffects) + availspells + availtypes;
SetHitscript( item, n, multiplier );
set_critical( 0 );
endfunction
function ApplyGreaterHitscript( item )
set_critical( 1 );
var multiplier := 2;
//Find the good effect
var n := RandomDiceStr("1d"+availgreaters) + availspells + availtypes + availeffects;
SetHitscript( item, n, multiplier );
set_critical( 0 );
endfunction
function ApplyWeapSkillMod( item )
var chance := Random(1000)+1;
if( chance <= 5 )
ApplyStatMod( item );
return;
endif
var degree := (Random(50)+1) * magiclevel * 2;
var amount;
case( CInt(magiclevel / 3) )
0: break;
1: if( degree < 100 )
degree := 100;
endif
break;
2: if( degree < 200 )
degree := 200;
endif
break;
endcase
if( degree < 100 )
amount := 1;
elseif( degree < 200 )
amount := 2;
elseif( degree < 350 )
amount := 3;
elseif( degree < 450 )
amount := 4;
elseif( degree < 550 )
amount := 5;
else
amount := 6;
endif
var skillid;
case(Random(2)+1)
1: skillid := item.skillid;
break;
default: skillid := SKILLID_TACTICS;
endcase
SetObjProperty( item, "skilladv", skillid );
SetObjProperty( item, "skilladvamount", amount );
//Check for another enchantment
if ((Random(100)+1) <= 5 * magiclevel)
ApplyHPMod( item );
endif
endfunction
function ApplyArSkillMod( item )
var chance := Random(1000)+1;
if (chance <= 5)
ApplyStatMod( item );
return;
endif
var skillid;
var amount;
var numb := (Random(50)+1) * magiclevel * 2;
case( CInt(magiclevel / 3) )
0: break;
1: if( numb < 200 )
numb := 200;
endif
break;
2: if( numb < 300 )
numb := 300;
endif
break;
endcase
if( numb < 200 )
amount := 1;
elseif( numb < 300 )
amount := 2;
elseif( numb < 400 )
amount := 3;
elseif( numb < 500 )
amount := 4;
elseif( numb < 600 )
amount := 5;
else
amount := 6;
endif
case( Random(2)+1 )
1: skillid := SKILLID_MAGICRESISTANCE;
break;
default: skillid := SKILLID_HIDING;
endcase
SetObjProperty( item, "skilladv", skillid );
SetObjProperty( item, "skilladvamount", amount );
//Check for another enchantment
if ((Random(100)+1) <= 5 * magiclevel)
ApplyHPMod( item );
endif
endfunction
function ApplyMiscSkillMod( item )
var chance := Random(1000)+1;
if (chance <= 5)
ApplyStatMod( item );
return;
endif
var skillid;
var amount;
var numb := (Random(50)+1) * magiclevel * 2;
case( CInt(magiclevel / 3) )
0: break;
1: if( numb < 200 )
numb := 200;
endif
break;
2: if( numb < 300 )
numb := 300;
endif
break;
endcase
if( numb < 200 )
amount := 1;
elseif( numb < 300 )
amount := 2;
elseif( numb < 400 )
amount := 3;
elseif( numb < 600 )
amount := 4;
elseif( numb < 700 )
amount := 5;
else
amount := 6;
endif
var skills := GetObjProperty( item, "AvailSkills" );
if ( skills )
skillid := skills[RandomDiceStr("1d" + len(skills))];
else
skillid := Random(SKILLID__HIGHEST + 1);
endif
SetObjProperty( item, "skilladv", skillid );
SetObjProperty( item, "skilladvamount", amount );
endfunction
function ApplyOnHitScript( who, item )
CountAvailOnHitscripts( );
var scripttype := (Random(94)+1) + (magiclevel * 2);
if (scripttype <= 40)
ApplySpellOnHitscript( item );
elseif (scripttype <= 80)
ApplyResistantOnHitscript( item );
elseif (scripttype <= 120)
ApplyEffectOnHitscript( item );
elseif (scripttype <= 125)
DestroyItem( item );
CreateFromRandomString( who, "GMArmor" );
else
ApplyGreaterOnHitscript( item );
endif
endfunction
function ApplySpellOnHitscript( item )
set_critical( 1 );
var multiplier := 10;
//Set the spell
var n := RandomDiceStr( "1d"+availspellonhit );
var spell := onhitcfg[n].Spellid;
SetObjProperty( item, "HitWithSpell", spell );
//Set the spell power
var ascircle := (Random(100)+1) * (magiclevel - 3);
if (ascircle < 50)
ascircle := 1;
elseif (ascircle < 100)
ascircle := 2;
elseif (ascircle < 150)
ascircle := 3;
elseif (ascircle < 200)
ascircle := 4;
elseif (ascircle < 250)
ascircle := 5;
elseif (ascircle < 300)
ascircle := 6;
else
ascircle := 7;
endif
var ascirclemod := onhitcfg[n].AsCircleMod;
if (ascirclemod)
ascircle := ascircle + ascirclemod;
endif
if (ascircle <= 0)
ascircle := 1;
endif
SetObjProperty( item, "EffectCircle", ascircle );
//Set the spell chance
var chanceofeffect := RandomDiceStr("1d10") * magiclevel;
var chanceofeffectmod := onhitcfg[n].ChanceOfEffectMod;
if (chanceofeffectmod)
chanceofeffect := chanceofeffect + chanceofeffectmod;
endif
if (chanceofeffect <= 0)
chanceofeffect := 4;
endif
SetObjProperty( item, "ChanceOfEffect", chanceofeffect );
SetOnHitscript( item, n, multiplier );
set_critical( 0 );
endfunction
function ApplyResistantOnHitscript( item )
set_critical( 1 );
var multiplier := 15;
//Set the creature type
var n;
var power := (Random(100)+1) * (magiclevel - 3);
if (power < 10)
n := 1;
elseif (power < 25)
n := 2;
elseif (power < 50)
n := 3;
elseif (power < 75)
n := 4;
elseif (power < 100)
n := 5;
elseif (power < 125)
n := 6;
elseif (power < 150)
n := 7;
elseif (power < 175)
n := 8;
elseif (power < 200)
n := 9;
elseif (power < 215)
n := 10;
elseif (power < 230)
n := 11;
elseif (power < 245)
n := 12;
elseif (power < 260)
n := 13;
elseif (power < 275)
n := 14;
elseif (power < 290)
n := 15;
elseif (power < 300)
n := 16;
else
n := 17;
endif
n := n + availspellonhit;
var type := onhitcfg[n].Type;
SetObjProperty( item, "ProtectedType", type );
SetOnHitscript( item, n, multiplier );
set_critical( 0 );
endfunction
function ApplyEffectOnHitscript( item )
set_critical( 1 );
var multiplier := 2;
//Find the good effect
var n := RandomDiceStr( "1d"+availeffectonhit) + availspellonhit + availtypeonhit;
SetOnHitscript( item, n, multiplier );
set_critical( 0 );
endfunction
function ApplyGreaterOnHitscript( item )
set_critical( 1 );
var multiplier := 2;
//Find the good script
var n := RandomDiceStr( "1d"+availgreateronhit) + availspellonhit + availtypeonhit + availeffectonhit;
SetOnHitscript( item, n, multiplier );
set_critical( 0 );
endfunction
function ApplyStatMod( item )
var numb := (Random(100)+1) * magiclevel;
var amount;
if( numb < 200 )
amount := 5;
elseif( numb < 400 )
amount := 10;
elseif( numb < 500 )
amount := 15;
elseif( numb < 600 )
amount := 20;
elseif( numb < 700 )
amount := 25;
else
amount := 30;
endif
var id := Random(3)+1;
if( id == 1 )
SetObjProperty( item, "str", amount );
elseif( id == 2 )
SetObjProperty( item, "int", amount );
else
SetObjProperty( item, "dex", amount );
endif
//Check for another enchantment
if ((Random(100)+1) <= 2 * magiclevel)
ApplyHPMod( item );
endif
endfunction
function ApplyEnchant( who, item )
var numb := (Random(100)+1) * magiclevel;
if( numb < 300 )
ApplyProtection( item );
elseif( numb < 500 )
ApplyElementalImmunity( item );
elseif( numb < 550 )
DestroyItem( item );
CreateFromRandomString( who, "MiscMagicItem" );
return;
else
ApplyImmunity( item );
endif
//Check for another enchantment
if ((Random(100)+1) <= (5 * magiclevel))
var secchance := Random(100)+1;
if (secchance < 75)
ApplyMiscSkillMod( item );
else
ApplyMiscArMod( item );
endif
endif
endfunction
function ApplyProtection( item )
var numb := (Random(50)+1) * magiclevel * 2;
var ptype;
var charges;
case( CInt(magiclevel / 3) )
0: break;
1: if( numb < 75 )
numb := 75;
endif
break;
2: if( numb < 150 )
numb := 150;
endif
break;
endcase
if( numb < 75 )
charges := 5;
elseif( numb < 150 )
charges := 10;
elseif( numb < 300 )
charges := 15;
elseif( numb < 400 )
charges := 20;
elseif( numb < 550 )
charges := 25;
else
charges := 30;
endif
case( RandomDiceStr( "1d3" ) )
1: ptype := "PoisonImmunity";
break;
2: ptype := "MagicImmunity";
break;
3: ptype := "SpellReflect";
break;
default: ptype := "SpellReflect";
endcase
SetObjProperty( item, ptype, charges );
endfunction
function ApplyImmunity( item )
var n;
var itype;
var power := (Random(100)+1) * (magiclevel - 3);
case( CInt(magiclevel / 3) )
0: break;
1: if( power < 170 )
power := 170;
endif
break;
2: if( power < 200 )
power := 200;
endif
break;
endcase
if (power < 170)
n := 1;
elseif (power < 200)
n := 2;
elseif (power < 230)
n := 3;
elseif (power < 270)
n := 4;
elseif (power < 300)
n := 5;
else
n := 6;
endif
case(Random(3)+1)
1: itype := "PermPoisonImmunity";
break;
2: itype := "PermMagicImmunity";
break;
default: itype := "Permmr";
endcase
SetObjProperty( item, itype, n );
endfunction
function ApplyElementalImmunity( item )
var element;
var power;
var numb := (Random(100)+1) * magiclevel;
case( CInt(magiclevel / 3) )
0: break;
1: if( numb < 150 )
numb := 150;
endif
break;
2: if( numb < 300 )
numb := 300;
endif
break;
endcase
if( numb < 150 )
power := 1;
elseif( numb < 300 )
power := 2;
elseif( numb < 450 )
power := 3;
elseif( numb < 550 )
power := 4;
elseif( numb < 600 )
power := 5;
else
power := 6;
endif
case(Random(8)+1)
1: element := "FireProtection";
break;
2: element := "WaterProtection";
break;
3: element := "AirProtection";
break;
4: element := "EarthProtection";
break;
5: element := "FreeAction";
power := 1;
break;
6: element := "NecroProtection";
break;
7: element := "HolyProtection";
break;
7: element := "HealingIncrease";
break;
default: element := "PhysicalProtection";
endcase
SetObjProperty( item, element, power );
endfunction
////
//Adds "a magic " to the beginning of the item's desc.
////
function AddName( item )
var currdesc := item.desc;
if( currdesc[1] == "a" )
var space := find( item.desc, " ", 1 );
var newname := currdesc[space + 1, len(item.desc)];
SetName( item, "an Unidentified " + newname );
else
SetName( item, "Unidentified " + currdesc );
endif
if( GetObjProperty( item, "IsGMItem" ))
return;
endif
SetObjProperty( item, "UnIDedMagicalItem", 1 );
if( (item.objtype < 0x1eff || item.objtype > 0x1f04) && (Random(100)+1) <= 5 )
SetObjProperty(item, "Cursed", 1 );
endif
endfunction
function AddRandomColor( item )
SetObjProperty( item, "Undyeable", 1 );
if( !GetObjProperty( item, "EnchantColor" ) )
var color := RandomDiceStr( "1d"+MAX_COLOR );
while( color > 999 && color < 1152 )
color := RandomDiceStr( "1d"+MAX_COLOR );
endwhile
SetObjProperty( item, "EnchantColor", color );
endif
endfunction
function CountAvailHitscripts( )
hitscriptcfg := ReadConfigFile( ":combat:hitscriptdesc" );
var availelem := FindConfigElem( hitscriptcfg, "data" );
availspells := GetConfigInt( availelem, "NbSpell" );
availtypes := GetConfigInt( availelem, "NbSlayer" );
availeffects := GetConfigInt( availelem, "NbEffect" );
availgreaters := GetConfigInt( availelem, "NbGreater" );
endfunction
function CountAvailOnHitscripts( )
onhitcfg := ReadConfigFile( ":combat:onhitscriptdesc" );
var availelem := FindConfigElem( onhitcfg, "data" );
availspellonhit := GetConfigInt( availelem, "NbSpell" );
availtypeonhit := GetConfigInt( availelem, "NbSlayer" );
availeffectonhit := GetConfigInt( availelem, "NbEffect" );
availgreateronhit := GetConfigInt( availelem, "NbGreater" );
endfunction
function SetHitscript( item, n, multiplier )
set_critical( 1 );
//Apply the hitscript
hitscriptcfg := ReadConfigFile( ":combat:hitscriptdesc" );
item.hitscript := hitscriptcfg[n].hitscript;
SetObjProperty( item, "HitscriptNumber", n );
var cprop := hitscriptcfg[n].CProp;
if( cprop )
var cpropval := hitscriptcfg[n].CPropVal;
if( !cpropval )
var power := (Random(10)+1) * magiclevel;
cpropval := CInt(power / 6);
var mult := onhitcfg[n].Multiplier;
if( mult )
cpropval := CInt(cpropval * mult);
endif
if( cprop == "Poisonlvl" )
cpropval := cpropval - 3;
endif
if( cpropval < 1 )
cpropval := 1;
endif
endif
SetObjProperty( item, cprop, cpropval );
endif
//Check for another enchantment
if (hitscriptcfg[n].Place == 2)
if ( (Random(100)+1) <= (multiplier * magiclevel))
if ((Random(100)+1) <= 75)
ApplyHPMod( item );
else
ApplyWeapSkillMod( item );
endif
endif
else
if ( (Random(100)+1) <= (multiplier * magiclevel))
var secchance := (Random(100)+1);
if (secchance < 60)
ApplyHPMod( item );
elseif (secchance < 90)
ApplyWeapSkillMod( item );
else
ApplyDmgMod( item );
endif
endif
endif
set_critical( 0 );
endfunction
function SetOnHitscript( item, n, multiplier )
set_critical( 1 );
//Apply the hitscript
onhitcfg := ReadConfigFile( ":combat:onhitscriptdesc" );
SetObjProperty( item, "OnHitScript", onhitcfg[n].OnHitscript);
SetObjProperty( item, "OnHitscriptNumber", n );
var cprop := onhitcfg[n].CProp;
if( cprop )
var cpropval := onhitcfg[n].CPropVal;
if( !cpropval )
var power := (Random(10)+1) * magiclevel;
cpropval := CInt(power / 6);
var mult := onhitcfg[n].Multiplier;
if( mult )
cpropval := CInt(cpropval * mult);
endif
if( cprop == "Poisonlvl" )
cpropval := cpropval - 3;
endif
if( cpropval < 1 )
cpropval := 1;
endif
endif
SetObjProperty( item, cprop, cpropval );
endif
//Check for another enchantment
if (onhitcfg[n].Place == 2)
if ( (Random(100)+1) <= (multiplier * magiclevel))
if ((Random(100)+1) <= 75)
ApplyHPMod( item );
else
ApplyArSkillMod( item );
endif
endif
else
if ( (Random(100)+1) <= (multiplier * magiclevel))
var secchance := Random(100)+1;
if (secchance < 60)
ApplyHPMod( item );
elseif (secchance < 90)
ApplyArSkillMod( item );
else
ApplyARMod( item );
endif
endif
endif
set_critical( 0 );
endfunction