ModernUO/Scripts/Engines/BulkOrders/Rewards.cs
2018-09-14 08:41:38 -07:00

738 lines
No EOL
24 KiB
C#

using System;
using Server.Items;
namespace Server.Engines.BulkOrders
{
public delegate Item ConstructCallback( int type );
public sealed class RewardType
{
private int m_Points;
private Type[] m_Types;
public int Points{ get{ return m_Points; } }
public Type[] Types{ get{ return m_Types; } }
public RewardType( int points, params Type[] types )
{
m_Points = points;
m_Types = types;
}
public bool Contains( Type type )
{
for ( int i = 0; i < m_Types.Length; ++i )
{
if ( m_Types[i] == type )
return true;
}
return false;
}
}
public sealed class RewardItem
{
private int m_Weight;
private ConstructCallback m_Constructor;
private int m_Type;
public int Weight{ get{ return m_Weight; } }
public ConstructCallback Constructor{ get{ return m_Constructor; } }
public int Type{ get{ return m_Type; } }
public RewardItem( int weight, ConstructCallback constructor ) : this( weight, constructor, 0 )
{
}
public RewardItem( int weight, ConstructCallback constructor, int type )
{
m_Weight = weight;
m_Constructor = constructor;
m_Type = type;
}
public Item Construct()
{
try{ return m_Constructor( m_Type ); }
catch{ return null; }
}
}
public sealed class RewardGroup
{
private int m_Points;
private RewardItem[] m_Items;
public int Points{ get{ return m_Points; } }
public RewardItem[] Items{ get{ return m_Items; } }
public RewardGroup( int points, params RewardItem[] items )
{
m_Points = points;
m_Items = items;
}
public RewardItem AcquireItem()
{
if ( m_Items.Length == 0 )
return null;
else if ( m_Items.Length == 1 )
return m_Items[0];
int totalWeight = 0;
for ( int i = 0; i < m_Items.Length; ++i )
totalWeight += m_Items[i].Weight;
int randomWeight = Utility.Random( totalWeight );
for ( int i = 0; i < m_Items.Length; ++i )
{
RewardItem item = m_Items[i];
if ( randomWeight < item.Weight )
return item;
randomWeight -= item.Weight;
}
return null;
}
}
public abstract class RewardCalculator
{
private RewardGroup[] m_Groups;
public RewardGroup[] Groups{ get{ return m_Groups; } set{ m_Groups = value; } }
public abstract int ComputePoints( int quantity, bool exceptional, BulkMaterialType material, int itemCount, Type type );
public abstract int ComputeGold( int quantity, bool exceptional, BulkMaterialType material, int itemCount, Type type );
public virtual int ComputeFame( SmallBOD bod )
{
int points = ComputePoints( bod ) / 50;
return points * points;
}
public virtual int ComputeFame( LargeBOD bod )
{
int points = ComputePoints( bod ) / 50;
return points * points;
}
public virtual int ComputePoints( SmallBOD bod )
{
return ComputePoints( bod.AmountMax, bod.RequireExceptional, bod.Material, 1, bod.Type );
}
public virtual int ComputePoints( LargeBOD bod )
{
return ComputePoints( bod.AmountMax, bod.RequireExceptional, bod.Material, bod.Entries.Length, bod.Entries[0].Details.Type );
}
public virtual int ComputeGold( SmallBOD bod )
{
return ComputeGold( bod.AmountMax, bod.RequireExceptional, bod.Material, 1, bod.Type );
}
public virtual int ComputeGold( LargeBOD bod )
{
return ComputeGold( bod.AmountMax, bod.RequireExceptional, bod.Material, bod.Entries.Length, bod.Entries[0].Details.Type );
}
public virtual RewardGroup LookupRewards( int points )
{
for ( int i = m_Groups.Length - 1; i >= 1; --i )
{
RewardGroup group = m_Groups[i];
if ( points >= group.Points )
return group;
}
return m_Groups[0];
}
public virtual int LookupTypePoints( RewardType[] types, Type type )
{
for ( int i = 0; i < types.Length; ++i )
{
if ( types[i].Contains( type ) )
return types[i].Points;
}
return 0;
}
public RewardCalculator()
{
}
}
public sealed class SmithRewardCalculator : RewardCalculator
{
#region Constructors
private static readonly ConstructCallback SturdyShovel = new ConstructCallback( CreateSturdyShovel );
private static readonly ConstructCallback SturdyPickaxe = new ConstructCallback( CreateSturdyPickaxe );
private static readonly ConstructCallback MiningGloves = new ConstructCallback( CreateMiningGloves );
private static readonly ConstructCallback GargoylesPickaxe = new ConstructCallback( CreateGargoylesPickaxe );
private static readonly ConstructCallback ProspectorsTool = new ConstructCallback( CreateProspectorsTool );
private static readonly ConstructCallback PowderOfTemperament = new ConstructCallback( CreatePowderOfTemperament );
private static readonly ConstructCallback RunicHammer = new ConstructCallback( CreateRunicHammer );
private static readonly ConstructCallback PowerScroll = new ConstructCallback( CreatePowerScroll );
private static readonly ConstructCallback ColoredAnvil = new ConstructCallback( CreateColoredAnvil );
private static readonly ConstructCallback AncientHammer = new ConstructCallback( CreateAncientHammer );
private static Item CreateSturdyShovel( int type )
{
return new SturdyShovel();
}
private static Item CreateSturdyPickaxe( int type )
{
return new SturdyPickaxe();
}
private static Item CreateMiningGloves( int type )
{
if ( type == 1 )
return new LeatherGlovesOfMining( 1 );
else if ( type == 3 )
return new StuddedGlovesOfMining( 3 );
else if ( type == 5 )
return new RingmailGlovesOfMining( 5 );
throw new InvalidOperationException();
}
private static Item CreateGargoylesPickaxe( int type )
{
return new GargoylesPickaxe();
}
private static Item CreateProspectorsTool( int type )
{
return new ProspectorsTool();
}
private static Item CreatePowderOfTemperament( int type )
{
return new PowderOfTemperament();
}
private static Item CreateRunicHammer( int type )
{
if ( type >= 1 && type <= 8 )
return new RunicHammer( CraftResource.Iron + type, Core.AOS ? ( 55 - (type*5) ) : 50 );
throw new InvalidOperationException();
}
private static Item CreatePowerScroll( int type )
{
if ( type == 5 || type == 10 || type == 15 || type == 20 )
return new PowerScroll( SkillName.Blacksmith, 100 + type );
throw new InvalidOperationException();
}
private static Item CreateColoredAnvil( int type )
{
// Generate an anvil deed, not an actual anvil.
//return new ColoredAnvilDeed();
return new ColoredAnvil();
}
private static Item CreateAncientHammer( int type )
{
if ( type == 10 || type == 15 || type == 30 || type == 60 )
return new AncientSmithyHammer( type );
throw new InvalidOperationException();
}
#endregion
public static readonly SmithRewardCalculator Instance = new SmithRewardCalculator();
private RewardType[] m_Types = new RewardType[]
{
// Armors
new RewardType( 200, typeof( RingmailGloves ), typeof( RingmailChest ), typeof( RingmailArms ), typeof( RingmailLegs ) ),
new RewardType( 300, typeof( ChainCoif ), typeof( ChainLegs ), typeof( ChainChest ) ),
new RewardType( 400, typeof( PlateArms ), typeof( PlateLegs ), typeof( PlateHelm ), typeof( PlateGorget ), typeof( PlateGloves ), typeof( PlateChest ) ),
// Weapons
new RewardType( 200, typeof( Bardiche ), typeof( Halberd ) ),
new RewardType( 300, typeof( Dagger ), typeof( ShortSpear ), typeof( Spear ), typeof( WarFork ), typeof( Kryss ) ), //OSI put the dagger in there. Odd, ain't it.
new RewardType( 350, typeof( Axe ), typeof( BattleAxe ), typeof( DoubleAxe ), typeof( ExecutionersAxe ), typeof( LargeBattleAxe ), typeof( TwoHandedAxe ) ),
new RewardType( 350, typeof( Broadsword ), typeof( Cutlass ), typeof( Katana ), typeof( Longsword ), typeof( Scimitar ), /*typeof( ThinLongsword ),*/ typeof( VikingSword ) ),
new RewardType( 350, typeof( WarAxe ), typeof( HammerPick ), typeof( Mace ), typeof( Maul ), typeof( WarHammer ), typeof( WarMace ) )
};
public override int ComputePoints( int quantity, bool exceptional, BulkMaterialType material, int itemCount, Type type )
{
int points = 0;
if ( quantity == 10 )
points += 10;
else if ( quantity == 15 )
points += 25;
else if ( quantity == 20 )
points += 50;
if ( exceptional )
points += 200;
if ( itemCount > 1 )
points += LookupTypePoints( m_Types, type );
if ( material >= BulkMaterialType.DullCopper && material <= BulkMaterialType.Valorite )
points += 200 + (50 * (material - BulkMaterialType.DullCopper));
return points;
}
private static int[][][] m_GoldTable = new int[][][]
{
new int[][] // 1-part (regular)
{
new int[]{ 150, 250, 250, 400, 400, 750, 750, 1200, 1200 },
new int[]{ 225, 375, 375, 600, 600, 1125, 1125, 1800, 1800 },
new int[]{ 300, 500, 750, 800, 1050, 1500, 2250, 2400, 4000 }
},
new int[][] // 1-part (exceptional)
{
new int[]{ 250, 400, 400, 750, 750, 1500, 1500, 3000, 3000 },
new int[]{ 375, 600, 600, 1125, 1125, 2250, 2250, 4500, 4500 },
new int[]{ 500, 800, 1200, 1500, 2500, 3000, 6000, 6000, 12000 }
},
new int[][] // Ringmail (regular)
{
new int[]{ 3000, 5000, 5000, 7500, 7500, 10000, 10000, 15000, 15000 },
new int[]{ 4500, 7500, 7500, 11250, 11500, 15000, 15000, 22500, 22500 },
new int[]{ 6000, 10000, 15000, 15000, 20000, 20000, 30000, 30000, 50000 }
},
new int[][] // Ringmail (exceptional)
{
new int[]{ 5000, 10000, 10000, 15000, 15000, 25000, 25000, 50000, 50000 },
new int[]{ 7500, 15000, 15000, 22500, 22500, 37500, 37500, 75000, 75000 },
new int[]{ 10000, 20000, 30000, 30000, 50000, 50000, 100000, 100000, 200000 }
},
new int[][] // Chainmail (regular)
{
new int[]{ 4000, 7500, 7500, 10000, 10000, 15000, 15000, 25000, 25000 },
new int[]{ 6000, 11250, 11250, 15000, 15000, 22500, 22500, 37500, 37500 },
new int[]{ 8000, 15000, 20000, 20000, 30000, 30000, 50000, 50000, 100000 }
},
new int[][] // Chainmail (exceptional)
{
new int[]{ 7500, 15000, 15000, 25000, 25000, 50000, 50000, 100000, 100000 },
new int[]{ 11250, 22500, 22500, 37500, 37500, 75000, 75000, 150000, 150000 },
new int[]{ 15000, 30000, 50000, 50000, 100000, 100000, 200000, 200000, 200000 }
},
new int[][] // Platemail (regular)
{
new int[]{ 5000, 10000, 10000, 15000, 15000, 25000, 25000, 50000, 50000 },
new int[]{ 7500, 15000, 15000, 22500, 22500, 37500, 37500, 75000, 75000 },
new int[]{ 10000, 20000, 30000, 30000, 50000, 50000, 100000, 100000, 200000 }
},
new int[][] // Platemail (exceptional)
{
new int[]{ 10000, 25000, 25000, 50000, 50000, 100000, 100000, 100000, 100000 },
new int[]{ 15000, 37500, 37500, 75000, 75000, 150000, 150000, 150000, 150000 },
new int[]{ 20000, 50000, 100000, 100000, 200000, 200000, 200000, 200000, 200000 }
},
new int[][] // 2-part weapons (regular)
{
new int[]{ 3000, 0, 0, 0, 0, 0, 0, 0, 0 },
new int[]{ 4500, 0, 0, 0, 0, 0, 0, 0, 0 },
new int[]{ 6000, 0, 0, 0, 0, 0, 0, 0, 0 }
},
new int[][] // 2-part weapons (exceptional)
{
new int[]{ 5000, 0, 0, 0, 0, 0, 0, 0, 0 },
new int[]{ 7500, 0, 0, 0, 0, 0, 0, 0, 0 },
new int[]{ 10000, 0, 0, 0, 0, 0, 0, 0, 0 }
},
new int[][] // 5-part weapons (regular)
{
new int[]{ 4000, 0, 0, 0, 0, 0, 0, 0, 0 },
new int[]{ 6000, 0, 0, 0, 0, 0, 0, 0, 0 },
new int[]{ 8000, 0, 0, 0, 0, 0, 0, 0, 0 }
},
new int[][] // 5-part weapons (exceptional)
{
new int[]{ 7500, 0, 0, 0, 0, 0, 0, 0, 0 },
new int[]{ 11250, 0, 0, 0, 0, 0, 0, 0, 0 },
new int[]{ 15000, 0, 0, 0, 0, 0, 0, 0, 0 }
},
new int[][] // 6-part weapons (regular)
{
new int[]{ 4000, 0, 0, 0, 0, 0, 0, 0, 0 },
new int[]{ 6000, 0, 0, 0, 0, 0, 0, 0, 0 },
new int[]{ 10000, 0, 0, 0, 0, 0, 0, 0, 0 }
},
new int[][] // 6-part weapons (exceptional)
{
new int[]{ 7500, 0, 0, 0, 0, 0, 0, 0, 0 },
new int[]{ 11250, 0, 0, 0, 0, 0, 0, 0, 0 },
new int[]{ 15000, 0, 0, 0, 0, 0, 0, 0, 0 }
}
};
private int ComputeType( Type type, int itemCount )
{
// Item count of 1 means it's a small BOD.
if ( itemCount == 1 )
return 0;
int typeIdx;
// Loop through the RewardTypes defined earlier and find the correct one.
for ( typeIdx = 0; typeIdx < 7; ++typeIdx )
{
if ( m_Types[typeIdx].Contains( type ) )
break;
}
// Types 5, 6 and 7 are Large Weapon BODs with the same rewards.
if ( typeIdx > 5 )
typeIdx = 5;
return ( typeIdx + 1 ) * 2;
}
public override int ComputeGold( int quantity, bool exceptional, BulkMaterialType material, int itemCount, Type type )
{
int[][][] goldTable = m_GoldTable;
int typeIndex = ComputeType( type, itemCount );
int quanIndex = ( quantity == 20 ? 2 : quantity == 15 ? 1 : 0 );
int mtrlIndex = ( material >= BulkMaterialType.DullCopper && material <= BulkMaterialType.Valorite ) ? 1 + (int)(material - BulkMaterialType.DullCopper) : 0;
if ( exceptional )
typeIndex++;
int gold = goldTable[typeIndex][quanIndex][mtrlIndex];
int min = (gold * 9) / 10;
int max = (gold * 10) / 9;
return Utility.RandomMinMax( min, max );
}
public SmithRewardCalculator()
{
Groups = new RewardGroup[]
{
new RewardGroup( 0, new RewardItem( 1, SturdyShovel ) ),
new RewardGroup( 25, new RewardItem( 1, SturdyPickaxe ) ),
new RewardGroup( 50, new RewardItem( 45, SturdyShovel ), new RewardItem( 45, SturdyPickaxe ), new RewardItem( 10, MiningGloves, 1 ) ),
new RewardGroup( 200, new RewardItem( 45, GargoylesPickaxe ), new RewardItem( 45, ProspectorsTool ), new RewardItem( 10, MiningGloves, 3 ) ),
new RewardGroup( 400, new RewardItem( 2, GargoylesPickaxe ), new RewardItem( 2, ProspectorsTool ), new RewardItem( 1, PowderOfTemperament ) ),
new RewardGroup( 450, new RewardItem( 9, PowderOfTemperament ), new RewardItem( 1, MiningGloves, 5 ) ),
new RewardGroup( 500, new RewardItem( 1, RunicHammer, 1 ) ),
new RewardGroup( 550, new RewardItem( 3, RunicHammer, 1 ), new RewardItem( 2, RunicHammer, 2 ) ),
new RewardGroup( 600, new RewardItem( 1, RunicHammer, 2 ) ),
new RewardGroup( 625, new RewardItem( 3, RunicHammer, 2 ), new RewardItem( 6, PowerScroll, 5 ), new RewardItem( 1, ColoredAnvil ) ),
new RewardGroup( 650, new RewardItem( 1, RunicHammer, 3 ) ),
new RewardGroup( 675, new RewardItem( 1, ColoredAnvil ), new RewardItem( 6, PowerScroll, 10 ), new RewardItem( 3, RunicHammer, 3 ) ),
new RewardGroup( 700, new RewardItem( 1, RunicHammer, 4 ) ),
new RewardGroup( 750, new RewardItem( 1, AncientHammer, 10 ) ),
new RewardGroup( 800, new RewardItem( 1, PowerScroll, 15 ) ),
new RewardGroup( 850, new RewardItem( 1, AncientHammer, 15 ) ),
new RewardGroup( 900, new RewardItem( 1, PowerScroll, 20 ) ),
new RewardGroup( 950, new RewardItem( 1, RunicHammer, 5 ) ),
new RewardGroup( 1000, new RewardItem( 1, AncientHammer, 30 ) ),
new RewardGroup( 1050, new RewardItem( 1, RunicHammer, 6 ) ),
new RewardGroup( 1100, new RewardItem( 1, AncientHammer, 60 ) ),
new RewardGroup( 1150, new RewardItem( 1, RunicHammer, 7 ) ),
new RewardGroup( 1200, new RewardItem( 1, RunicHammer, 8 ) )
};
}
}
public sealed class TailorRewardCalculator : RewardCalculator
{
#region Constructors
private static readonly ConstructCallback Cloth = new ConstructCallback( CreateCloth );
private static readonly ConstructCallback Sandals = new ConstructCallback( CreateSandals );
private static readonly ConstructCallback StretchedHide = new ConstructCallback( CreateStretchedHide );
private static readonly ConstructCallback RunicKit = new ConstructCallback( CreateRunicKit );
private static readonly ConstructCallback Tapestry = new ConstructCallback( CreateTapestry );
private static readonly ConstructCallback PowerScroll = new ConstructCallback( CreatePowerScroll );
private static readonly ConstructCallback BearRug = new ConstructCallback( CreateBearRug );
private static readonly ConstructCallback ClothingBlessDeed = new ConstructCallback( CreateCBD );
private static int[][] m_ClothHues = new int[][]
{
new int[]{ 0x483, 0x48C, 0x488, 0x48A },
new int[]{ 0x495, 0x48B, 0x486, 0x485 },
new int[]{ 0x48D, 0x490, 0x48E, 0x491 },
new int[]{ 0x48F, 0x494, 0x484, 0x497 },
new int[]{ 0x489, 0x47F, 0x482, 0x47E }
};
private static Item CreateCloth( int type )
{
if ( type >= 0 && type < m_ClothHues.Length )
{
UncutCloth cloth = new UncutCloth( 100 );
cloth.Hue = m_ClothHues[type][Utility.Random( m_ClothHues[type].Length )];
return cloth;
}
throw new InvalidOperationException();
}
private static int[] m_SandalHues = new int[]
{
0x489, 0x47F, 0x482,
0x47E, 0x48F, 0x494,
0x484, 0x497
};
private static Item CreateSandals( int type )
{
return new Sandals( m_SandalHues[Utility.Random( m_SandalHues.Length )] );
}
private static Item CreateStretchedHide( int type )
{
switch ( Utility.Random( 4 ) )
{
default:
case 0: return new SmallStretchedHideEastDeed();
case 1: return new SmallStretchedHideSouthDeed();
case 2: return new MediumStretchedHideEastDeed();
case 3: return new MediumStretchedHideSouthDeed();
}
}
private static Item CreateTapestry( int type )
{
switch ( Utility.Random( 4 ) )
{
default:
case 0: return new LightFlowerTapestryEastDeed();
case 1: return new LightFlowerTapestrySouthDeed();
case 2: return new DarkFlowerTapestryEastDeed();
case 3: return new DarkFlowerTapestrySouthDeed();
}
}
private static Item CreateBearRug( int type )
{
switch ( Utility.Random( 4 ) )
{
default:
case 0: return new BrownBearRugEastDeed();
case 1: return new BrownBearRugSouthDeed();
case 2: return new PolarBearRugEastDeed();
case 3: return new PolarBearRugSouthDeed();
}
}
private static Item CreateRunicKit( int type )
{
if ( type >= 1 && type <= 3 )
return new RunicSewingKit( CraftResource.RegularLeather + type, 60 - (type*15) );
throw new InvalidOperationException();
}
private static Item CreatePowerScroll( int type )
{
if ( type == 5 || type == 10 || type == 15 || type == 20 )
return new PowerScroll( SkillName.Tailoring, 100 + type );
throw new InvalidOperationException();
}
private static Item CreateCBD( int type )
{
return new ClothingBlessDeed();
}
#endregion
public static readonly TailorRewardCalculator Instance = new TailorRewardCalculator();
public override int ComputePoints( int quantity, bool exceptional, BulkMaterialType material, int itemCount, Type type )
{
int points = 0;
if ( quantity == 10 )
points += 10;
else if ( quantity == 15 )
points += 25;
else if ( quantity == 20 )
points += 50;
if ( exceptional )
points += 100;
if ( itemCount == 4 )
points += 300;
else if ( itemCount == 5 )
points += 400;
else if ( itemCount == 6 )
points += 500;
if ( material == BulkMaterialType.Spined )
points += 50;
else if ( material == BulkMaterialType.Horned )
points += 100;
else if ( material == BulkMaterialType.Barbed )
points += 150;
return points;
}
private static int[][][] m_AosGoldTable = new int[][][]
{
new int[][] // 1-part (regular)
{
new int[]{ 150, 150, 300, 300 },
new int[]{ 225, 225, 450, 450 },
new int[]{ 300, 400, 600, 750 }
},
new int[][] // 1-part (exceptional)
{
new int[]{ 300, 300, 600, 600 },
new int[]{ 450, 450, 900, 900 },
new int[]{ 600, 750, 1200, 1800 }
},
new int[][] // 4-part (regular)
{
new int[]{ 4000, 4000, 5000, 5000 },
new int[]{ 6000, 6000, 7500, 7500 },
new int[]{ 8000, 10000, 10000, 15000 }
},
new int[][] // 4-part (exceptional)
{
new int[]{ 5000, 5000, 7500, 7500 },
new int[]{ 7500, 7500, 11250, 11250 },
new int[]{ 10000, 15000, 15000, 20000 }
},
new int[][] // 5-part (regular)
{
new int[]{ 5000, 5000, 7500, 7500 },
new int[]{ 7500, 7500, 11250, 11250 },
new int[]{ 10000, 15000, 15000, 20000 }
},
new int[][] // 5-part (exceptional)
{
new int[]{ 7500, 7500, 10000, 10000 },
new int[]{ 11250, 11250, 15000, 15000 },
new int[]{ 15000, 20000, 20000, 30000 }
},
new int[][] // 6-part (regular)
{
new int[]{ 7500, 7500, 10000, 10000 },
new int[]{ 11250, 11250, 15000, 15000 },
new int[]{ 15000, 20000, 20000, 30000 }
},
new int[][] // 6-part (exceptional)
{
new int[]{ 10000, 10000, 15000, 15000 },
new int[]{ 15000, 15000, 22500, 22500 },
new int[]{ 20000, 30000, 30000, 50000 }
}
};
private static int[][][] m_OldGoldTable = new int[][][]
{
new int[][] // 1-part (regular)
{
new int[]{ 150, 150, 300, 300 },
new int[]{ 225, 225, 450, 450 },
new int[]{ 300, 400, 600, 750 }
},
new int[][] // 1-part (exceptional)
{
new int[]{ 300, 300, 600, 600 },
new int[]{ 450, 450, 900, 900 },
new int[]{ 600, 750, 1200, 1800 }
},
new int[][] // 4-part (regular)
{
new int[]{ 3000, 3000, 4000, 4000 },
new int[]{ 4500, 4500, 6000, 6000 },
new int[]{ 6000, 8000, 8000, 10000 }
},
new int[][] // 4-part (exceptional)
{
new int[]{ 4000, 4000, 5000, 5000 },
new int[]{ 6000, 6000, 7500, 7500 },
new int[]{ 8000, 10000, 10000, 15000 }
},
new int[][] // 5-part (regular)
{
new int[]{ 4000, 4000, 5000, 5000 },
new int[]{ 6000, 6000, 7500, 7500 },
new int[]{ 8000, 10000, 10000, 15000 }
},
new int[][] // 5-part (exceptional)
{
new int[]{ 5000, 5000, 7500, 7500 },
new int[]{ 7500, 7500, 11250, 11250 },
new int[]{ 10000, 15000, 15000, 20000 }
},
new int[][] // 6-part (regular)
{
new int[]{ 5000, 5000, 7500, 7500 },
new int[]{ 7500, 7500, 11250, 11250 },
new int[]{ 10000, 15000, 15000, 20000 }
},
new int[][] // 6-part (exceptional)
{
new int[]{ 7500, 7500, 10000, 10000 },
new int[]{ 11250, 11250, 15000, 15000 },
new int[]{ 15000, 20000, 20000, 30000 }
}
};
public override int ComputeGold( int quantity, bool exceptional, BulkMaterialType material, int itemCount, Type type )
{
int[][][] goldTable = ( Core.AOS ? m_AosGoldTable : m_OldGoldTable );
int typeIndex = (( itemCount == 6 ? 3 : itemCount == 5 ? 2 : itemCount == 4 ? 1 : 0 ) * 2) + (exceptional ? 1 : 0);
int quanIndex = ( quantity == 20 ? 2 : quantity == 15 ? 1 : 0 );
int mtrlIndex = ( material == BulkMaterialType.Barbed ? 3 : material == BulkMaterialType.Horned ? 2 : material == BulkMaterialType.Spined ? 1 : 0 );
int gold = goldTable[typeIndex][quanIndex][mtrlIndex];
int min = (gold * 9) / 10;
int max = (gold * 10) / 9;
return Utility.RandomMinMax( min, max );
}
public TailorRewardCalculator()
{
Groups = new RewardGroup[]
{
new RewardGroup( 0, new RewardItem( 1, Cloth, 0 ) ),
new RewardGroup( 50, new RewardItem( 1, Cloth, 1 ) ),
new RewardGroup( 100, new RewardItem( 1, Cloth, 2 ) ),
new RewardGroup( 150, new RewardItem( 9, Cloth, 3 ), new RewardItem( 1, Sandals ) ),
new RewardGroup( 200, new RewardItem( 4, Cloth, 4 ), new RewardItem( 1, Sandals ) ),
new RewardGroup( 300, new RewardItem( 1, StretchedHide ) ),
new RewardGroup( 350, new RewardItem( 1, RunicKit, 1 ) ),
new RewardGroup( 400, new RewardItem( 2, PowerScroll, 5 ), new RewardItem( 3, Tapestry ) ),
new RewardGroup( 450, new RewardItem( 1, BearRug ) ),
new RewardGroup( 500, new RewardItem( 1, PowerScroll, 10 ) ),
new RewardGroup( 550, new RewardItem( 1, ClothingBlessDeed ) ),
new RewardGroup( 575, new RewardItem( 1, PowerScroll, 15 ) ),
new RewardGroup( 600, new RewardItem( 1, RunicKit, 2 ) ),
new RewardGroup( 650, new RewardItem( 1, PowerScroll, 20 ) ),
new RewardGroup( 700, new RewardItem( 1, RunicKit, 3 ) )
};
}
}
}