Tammsyn 8 Posted October 18, 2012 (edited) Materia System Victor Sant Introduction Ok this script actuall belongs to me but Victor Sant created it as a commission. What it does is replicates the Materia System from Final Fantasy 7. For those who are not familiar with Final Fantasy 7 what materia is is an item that contains magic and is equipped to equipment and each equipment can have several of 2 different types of slots (joint and single) materia then gain ap from battles and as they 'grow' they can gain new spells for the hero and even 'breed' which happens when a materia becomes mastered it slipts into a matster and lvl 1 form Script http://victorscripts.wordpress.com/rpg-maker-vx-ace/gameplay-scripts/materia-system Features - equip and unequip materia - materia grow using ap - materia shops that can buy and sell materia - materia breeding when mastered (can be turnd off) How to Use Plug and play. Details within script Edited January 7, 2013 by Tammsyn 4 Share this post Link to post Share on other sites
Nate The Great 10 Posted October 19, 2012 Very nice of you to share your commision with everyone. One thing to note, I don't see any way to remove a materia... only to exchange one. If for some reason you wanted to strip someone of their materia... it would be hard to do... Thanks again for sharing! Share this post Link to post Share on other sites
Tammsyn 8 Posted October 19, 2012 errr no clue :Pwill look into it wen i get home from work Share this post Link to post Share on other sites
Xypher 176 Posted October 19, 2012 the A key (default shift) unequips materia. Share this post Link to post Share on other sites
Coolie 148 Posted October 19, 2012 Also, unequipping the item will also remove all Materia from it. Share this post Link to post Share on other sites
Lionheart 2 Posted October 19, 2012 (edited) Nice script, I had already seen elsewhere days ago ... However, some materia do not work like this : The Elemental, Added Effect, HP Absorb and MP Absorb ... For the rest it works great! Edited October 19, 2012 by Lionheart Share this post Link to post Share on other sites
Tammsyn 8 Posted October 19, 2012 ah kool will report those to victor and see if he can fix @Nate the Great miss read the message earlier i thought you said remove materia (as in loose it from the party) Share this post Link to post Share on other sites
Max W. 18 Posted October 19, 2012 It may be me but I also couldn't get the exp plus to work. Also is there a way to make a cover materia where is an ally is lets say 25% below health you will gaurd them? I think that can actually be done with using the normal database without scripting but I am not sure. The cover Materia is really the only the materia in here I would like to have that isn't. also one last thing for the command materia is there a way for them to become a command like attack magic and special? Well if you can just get the corrupt materia to work then I can live with out the extra additions I just mentioned. Share this post Link to post Share on other sites
Tammsyn 8 Posted October 19, 2012 because victor sant is amazing here is an update changes equip_materia(actor, equip, slot, materia) actor = actor id equip = equip slot id (0 = weapon, 1 = shield, 2 = helm, 3 = armor, 4 = accessory) slot = materia slot materia = materia id remove_materia(materia) materia = materia id Also i fixed the issues with elemental, added effect and absorb materias. #============================================================================== # Materia System (FF:VII) #============================================================================== # Original Script from XP by SephirothSpawn # && Converted for VXa by Atoa #------------------------------------------------------------------------------ # Sorry if these translations are a bit messy, its because # this is a direct translation but the instructions provided # here is originaly made by Atoa (copied && pasted) # So more thanks to Atoa for a great convertion! Yay! #============================================================================== =begin =================================================== Materia Icons =================================================== IMPORTANT:You must create an new folder named "Icons" on the Graphic folder You can set individual icons for each materia, the icon must be on the Incon folder. The name of the icon must be the same of the Materia + "_m" E.g Cure materia icon must be named "Cure_m" Ultima materia icon must be named "Ultima_m" Materias without individual icons will have the default materia icon, the color of defaut icon depends on the materia type =================================================== Configurating Materias =================================================== To configure the materias, look for lines like these in the "module Materia_Config" Materia_List << [iD, name, type, status, elements, status effects, price, master price, ap, skill, special effect] * ID = Materia ID * name = materia Name * type = materia type (can be "Magic", "Command", "Summon", "Support" && "Independent", they arent translated in demo) * status = status change of the materia.[hp, sp, str, dex, agi, int] in XP, [hp, mp, atk, def, spi, agi] in VX * elements = element id of materia. used when paired with elemental spuport materia. must be an array * status effect = status effect id of materia. used when paired with added effect spuport materia must. be an array * price = Price of materia with 0 AP * master price = Price of an level max materia * ap = ap nedded to level up. must be an array. the first value is the ap to level 2. Here is the place where you set the max level of materia, depending on how many values yoi add on the array. E.G [1000, 2000 ,3000] = the materia will have 4 levels [2500, 5000, 10000, 20000, 40000] = the materia will have 6 levels * skills = skills of the materia. must be an array. you can make an instace of this array = nil, so materia will "skip" this level E.G [2,7,20] = materia gain skill ID 2 in level 1, skill ID 7 in level 2, && skill ID 20 in level 3. [nil,6,nil,13] = materia gain no skill in level 1, skill ID in level 2, no skill in level 3, && skill ID 13 in level 4. * special effects = special effects of materia. one of these: "All", "Elemental", "Added Effect", "HP Absorb", "MP Absorb", "MP Turbo", "Reduce Cost", "EXP plus", "Gil Plus", "Escape Plus", "HP <> MP" You can also use one of the Parameters, Ex-Parameter or Sp-Parameter such as MHP, ATK, DEF, HIT, EVA, TRG && all Parameters available on the trait list using "[param] plus". Ex: "STR Plus", "HIT Plus", "REC Plus" =================================================== Gain new Materia =================================================== Use the Script Call event && add this code: $game_party.gain_materia(ID) where ID = the ID of materia =================================================== Materia Shop =================================================== to open an materia shop use the Script Call event && add this code: materia_avaliable = [ X, Y, Z] $scene = Scene_MateriaShop.new(materia_avaliable) X,Y,Z = the ID of Materias You can add how many IDs you want. =================================================== Set Enemy AP =================================================== to set enemy AP, look for lines like these in the "module Materia_Config" Enemy_Ap[iD] = X ID = Enemy ID X = AP given by enemy Enemys that don't have their IDs added to the list will give AP = their EXP/10 #============================================================================== You can set individual icons for each materia, the icon must be on the System folder. The name of the icon must be the same of the Materia + "_m" E.g Cure materia icon must be named "Cure_m" Ultima materia icon must be named "Ultima_m" Materias without individual icons will have the default materia icon, the color of defaut icon depends on the materia type Equipment Slots To set the slots of equipment, look for lines like these in the "module Materia_Config" Weapon_Materia_Slots[iD] = [X , Y] for weapons Armors_Materia_Slots[iD] = [X , Y] for armors ID = Equipment ID X = number of paired slots (count as 2 single slots) Y = nuber of single slots The total slots will never be greater than 8, if you set more than 8 slots, the extra slots will be ignored E.g Armors_Materia_Slots[5] = [2, 2] The armor ID 5 will have 6 slots (2 * 2) + 2 = 6 Weapon_Materia_Slots[3] = [1, 5] The weapon ID 5 will have 7 slots (1 * 2) + 5 = 7 If you don't add an equipment ID on the list, the equip of this ID will have 0 slots Configurating Materias To configure the materias, look for lines like these in the "module Materia_Config" Materia_List << [iD, name, type, status, elements, status effects, price, master price, ap, skill, special effect] * ID = Materia ID * name = materia Name * type = materia type (can be "Magic", "Command", "Summon", "Support" and "Independent") * status = materia status change. [hp, mp, atk, def, mat, mdf, agi, luk] * elements = element id of materia. used when paired with elemental spuport materia. must be an array * status effect = status effect id of materia. used when paired with added effect spuport materia must. be an array * price = Price of materia with 0 AP * master price = Price of an level max materia * ap = ap nedded to level up. must be an array. the first value is the ap to level 2. Here is the place where you set the max level of materia, depending on how many values yoi add on the array. E.G [1000, 2000 ,3000] = the materia will have 4 levels [2500, 5000, 10000, 20000, 40000] = the materia will have 6 levels * skills = skills of the materia. must be an array. you can make an instace of this array = nil, so materia will "skip" this level E.G [2,7,20] = materia gain skill ID 2 in level 1, skill ID 7 in level 2, && skill ID 20 in level 3. [nil,6,nil,13] = materia gain no skill in level 1, skill ID in level 2, no skill in level 3, && skill ID 13 in level 4. * special effects = special effects of materia. one of these: "All", "Elemental", "Added Effect", "HP Absorb", "MP Absorb", "MP Turbo", "Reduce Cost", "EXP plus", "Gil Plus", "Escape Plus", "HP <> MP" You can also use one of the Parameters, Ex-Parameter or Sp-Parameter such as MHP, ATK, DEF, HIT, EVA, TRG && all Parameters available on the trait list using "[param] plus". Ex: "STR Plus", "HIT Plus", "REC Plus" Gain new Materia Use the Script Call event && add this code: $game_party.gain_materia(ID) where ID = the ID of materia Materia Shop to open an materia shop use the Script Call event && add this code: materia_avaliable = [ X, Y, Z] $scene = Scene_MateriaShop.new(materia_avaliable) X,Y,Z = the ID of Materias You can add how many IDs you want. Set Enemy AP to set enemy AP, look for lines like these in the "module Materia_Config" Enemy_Ap[iD] = X ID = Enemy ID X = AP given by enemy Enemys that don't have their IDs added to the list will give AP = their EXP/10 =end module Materia_Config # Do not Erase the lines Weapon_Materia_Slots = [] Armors_Materia_Slots = [] Materia_List = [] Enemy_Ap = [] # Do not Erase the lines # If true, when a materia reach a maximum level, you gain another # Stat in level 1, if false, nothing will happen Materia_Breeding = true # Configuration of skill that ignores special effects Negate_Absorb = [] # Skills that ignore "HP/MP Absorb" effect Negate_Turbo = [] # Skills that ignore "MP Turbo" effect Negate_All = [] # Skills that ignore "All" effec # Materia Shop Message Configuration Shop_Message = 'How can I help you?' # Shop Message Buy_Message = 'What Materia would you like to buy?' # Buy Message Sell_Message = 'Which materia you want to sell?' # Selling Message Buy_Command = 'Buy Materia' # Purchase Materias Sell_Command = 'Sell Materia' # Sell Materias Empty_Message = 'None' # Message when unequiped Master_Text = 'Master' # Max level materia text AP_Total = 'Total AP:' # AP Name Default_Icon = 'Materia Icon' # Default Materia Icon Materia_Cursor = 'Materia Cursor' # Cursor Graphic Icon Single_Slot = 'Materia Single' # Single-Slot Icon Paired_Slot_Left = 'Materia Paired Left' # Paired-Slot Icon (Left) Paired_Slot_Right = 'Materia Paired Right' # Paired-Slot Icon (Right) Materia_Level = 'Star - Icon' # Level Icon =begin =================================================== Equipment Slots =================================================== To set the slots of equipment, look for lines like these in the "module Materia_Config" Weapon_Materia_Slots[iD] = [X , Y] for weapons Armors_Materia_Slots[iD] = [X , Y] for armors ID = Equipment ID X = number of paired slots (count as 2 single slots) Y = nuber of single slots The total slots will never be greater than 8, if you set more than 8 slots, the extra slots will be ignored E.g Armors_Materia_Slots[5] = [2, 2] The armor ID 5 will have 6 slots (2 * 2) + 2 = 6 Weapon_Materia_Slots[3] = [1, 5] The weapon ID 5 will have 7 slots (1 * 2) + 5 = 7 If you don't add an equipment ID on the list, the equip of this ID will have 0 slots =end #================================================================================ # Weapon SLots Weapon_Materia_Slots[1] = [0 , 2] Weapon_Materia_Slots[2] = [1 , 0] Weapon_Materia_Slots[3] = [0 , 3] Weapon_Materia_Slots[4] = [1 , 1] Weapon_Materia_Slots[5] = [1 , 0] Weapon_Materia_Slots[6] = [1 , 1] Weapon_Materia_Slots[7] = [1 , 2] Weapon_Materia_Slots[8] = [2 , 0] Weapon_Materia_Slots[9] = [2 , 1] Weapon_Materia_Slots[10] = [1 , 3] Weapon_Materia_Slots[11] = [0 , 6] Weapon_Materia_Slots[12] = [1 , 3] Weapon_Materia_Slots[13] = [1 , 2] Weapon_Materia_Slots[14] = [0 , 4] Weapon_Materia_Slots[15] = [1 , 2] Weapon_Materia_Slots[16] = [2 , 0] Weapon_Materia_Slots[17] = [0 , 5] Weapon_Materia_Slots[18] = [3 , 0] Weapon_Materia_Slots[19] = [1 , 3] Weapon_Materia_Slots[20] = [2 , 1] Weapon_Materia_Slots[21] = [2 , 2] Weapon_Materia_Slots[22] = [2 , 3] Weapon_Materia_Slots[23] = [1 , 4] Weapon_Materia_Slots[24] = [2 , 2] Weapon_Materia_Slots[25] = [4 , 0] Weapon_Materia_Slots[26] = [1 , 5] Weapon_Materia_Slots[27] = [2 , 3] Weapon_Materia_Slots[28] = [3 , 1] Weapon_Materia_Slots[29] = [2 , 4] Weapon_Materia_Slots[30] = [4 , 0] # Armor Slots Armors_Materia_Slots[1] = [0 , 2] Armors_Materia_Slots[2] = [1 , 2] Armors_Materia_Slots[3] = [1 , 3] Armors_Materia_Slots[4] = [1 , 3] Armors_Materia_Slots[5] = [2 , 2] Armors_Materia_Slots[6] = [3 , 0] Armors_Materia_Slots[7] = [0 , 1] Armors_Materia_Slots[8] = [1 , 1] Armors_Materia_Slots[9] = [1 , 3] Armors_Materia_Slots[10] = [2 , 2] Armors_Materia_Slots[11] = [1 , 3] Armors_Materia_Slots[12] = [1 , 5] Armors_Materia_Slots[13] = [1 , 0] Armors_Materia_Slots[14] = [0 , 2] Armors_Materia_Slots[15] = [1 , 1] Armors_Materia_Slots[16] = [2 , 0] Armors_Materia_Slots[17] = [1 , 2] Armors_Materia_Slots[18] = [2 , 2] Armors_Materia_Slots[19] = [1 , 4] Armors_Materia_Slots[20] = [3 , 2] Armors_Materia_Slots[21] = [0 , 7] Armors_Materia_Slots[22] = [2 , 4] Armors_Materia_Slots[23] = [1 , 2] Armors_Materia_Slots[24] = [1 , 2] Armors_Materia_Slots[25] = [1 , 2] Armors_Materia_Slots[26] = [1 , 2] Armors_Materia_Slots[27] = [1 , 2] Armors_Materia_Slots[28] = [1 , 2] Armors_Materia_Slots[29] = [0 , 8] Armors_Materia_Slots[30] = [4 , 0] #=#================================================================#=# #=# Enemy APs #=# #=#================================================================#=# #=# Enemy_Ap[iD] = x #=# #=# where ID = Enemy ID in the database #=# #=# && #=# #=# X is the AP that you will get from them. #=# #=# ex: Enemy_Ap[1] = 2 #=# #=# You will get 2 AP from a slime[iD:001] in the database #=# #=#================================================================#=# Enemy_Ap[1] = 2 Enemy_Ap[2] = 3 Enemy_Ap[3] = 5 Enemy_Ap[4] = 9 Enemy_Ap[5] = 11 Enemy_Ap[6] = 16 Enemy_Ap[7] = 21 Enemy_Ap[8] = 28 Enemy_Ap[9] = 32 Enemy_Ap[10] = 37 Enemy_Ap[11] = 42 Enemy_Ap[12] = 46 Enemy_Ap[13] = 51 Enemy_Ap[14] = 57 Enemy_Ap[15] = 64 Enemy_Ap[16] = 72 Enemy_Ap[17] = 80 Enemy_Ap[18] = 93 Enemy_Ap[19] = 175 Enemy_Ap[20] = 214 Enemy_Ap[21] = 126 Enemy_Ap[22] = 153 Enemy_Ap[23] = 344 Enemy_Ap[24] = 198 Enemy_Ap[25] = 415 Enemy_Ap[26] = 530 Enemy_Ap[27] = 725 Enemy_Ap[28] = 986 Enemy_Ap[29] = 1200 Enemy_Ap[30] = 3000 # List of Materias #[id, name, type, attribute = [], elements = [], effects = [], # AP needed = min.500, Mastered AP Needed = min.1000, # skills = [], exp = [], special = nil] # Magics #ID Name Type HP MP ATK DEF MAT MDF AGI, LUK element Effect AP MasterAP EXP SKILLS Materia_List << [0, 'Cure', 'Magic', [ -5, 5, -3, 0, 3, 0, 0, 0], [], [], 1000, 10000, [1000, 3000, 6000, 10000], [26,27,28]] Materia_List << [1, 'Remedy', 'Magic', [ -4, 4, -3, 0, 3, 0, 0, 0], [], [], 750, 5000, [2000, 3000,5000], [31,32]] Materia_List << [2, 'Fire', 'Magic', [ -3, 3, -1, 0, 1, 0, 0, 0], [3], [], 1000, 7500, [1000, 2000, 3000,5000], [51,53,52,54]] Materia_List << [3, 'Ice', 'Magic', [ -3, 3, -1, 0, 1, 0, 0, 0], [4], [], 1000, 7500, [1000, 2000, 3000,5000], [63,65,64,66]] Materia_List << [4, 'Thunder','Magic', [ -3, 3, -1, 0, 1, 0, 0, 0], [5], [], 1000, 7500, [1000, 2000, 3000,5000], [67,69,68,70]] Materia_List << [5, 'Water', 'Magic', [ -4, 4, -2, 0, 2, 0, 0, 0], [6], [], 1000, 7500, [3000, 8000], [71,72]] Materia_List << [6, 'Earth', 'Magic', [ -4, 4, -2, 0, 2, 0, 0, 0], [7], [], 1000, 7500, [3000, 8000], [73,74]] Materia_List << [7, 'Wind', 'Magic', [ -4, 4, -2, 0, 2, 0, 0, 0], [8], [], 1000, 7500, [3000, 8000], [75,76]] Materia_List << [8, 'Light', 'Magic', [ -4, 4, -2, 0, 2, 0, 0, 0], [9], [], 1000, 7500, [3000, 8000], [77,78]] Materia_List << [9, 'Darkness','Magic', [ -4, 4, -2, 0, 2, 0, 0, 0], [10], [], 1000, 7500, [3000,8000], [79,80]] Materia_List << [10,'Ultima', 'Magic', [ -5, 5, -3, 0, 3, 0, 0, 0], [3,4,5,6,7,8,9], [], 10000,50000, [10000, 30000, 50000], [nil,81,82]] Materia_List << [11,'Poison', 'Magic', [ -2, 2, 0, 0, 0, 0, 0, 0], [], [2], 750, 4500, [1500, 4500], [15,16]] Materia_List << [12,'Blind', 'Magic', [ -2, 2, 0, 0, 0, 0, 0, 0], [], [3], 750, 4500, [1500, 4500], [17,18]] Materia_List << [13,'Silence','Magic', [ -2, 2, 0, 0, 0, 0, 0, 0], [], [4], 750, 4500, [1500, 4500], [19,20]] Materia_List << [14,'Confusion','Magic', [ -2, 2, 0, 0, 0, 0, 0, 0], [], [5], 750, 4500, [1500, 4500], [21,22]] Materia_List << [15,'Sono', 'Magic', [ -2, 2, 0, 0, 0, 0, 0, 0], [], [6], 750, 4500, [1500, 4500], [23,24]] Materia_List << [16,'Paralize','Magic', [ -2, 2, 0, 0, 0, 0, 0, 0], [], [7], 750, 4500, [1500, 4500], [25,26]] Materia_List << [17,'Weakness','Magic', [ -2, 2, 0, 0, 0, 0, 0, 0], [], [12], 750, 4500, [5000], [53]] Materia_List << [18,'Tiredness','Magic', [ -2, 2, 0, 0, 0, 0, 0, 0], [], [14], 750, 4500, [5000], [54]] Materia_List << [19,'Fever', 'Magic', [ -2, 2, 0, 0, 0, 0, 0, 0], [], [15], 750, 4500, [5000], [55]] Materia_List << [20,'Slow', 'Magic', [ -2, 2, 0, 0, 0, 0, 0, 0], [], [16], 750, 4500, [5000], [56]] Materia_List << [21,'Strength','Magic', [ -2, 2, 0, 0, 0, 0, 0, 0], [], [9], 750, 4500, [2000,4000], [nil, 49]] Materia_List << [22,'Protect','Magic', [ -2, 2, 0, 0, 0, 0, 0, 0], [], [10], 750, 4500, [2000,4000], [nil, 50]] Materia_List << [23,'Spirit', 'Magic', [ -2, 2, 0, 0, 0, 0, 0, 0], [], [11], 750, 4500, [2000,4000], [nil, 51]] Materia_List << [24,'Speed up','Magic', [ -2, 2, 0, 0, 0, 0, 0, 0], [], [12], 750, 4500, [2000,4000], [nil, 52]] # Command Materia_List << [25, 'Dual Combo', 'Command', [0, 0, 5, 3, - 5, - 3, 0, 0, 0], [], [], 3000, 20000, [2500, 5000, 9000, 14000], [2]] Materia_List << [26, 'Death Blow', 'Command', [2, -2, 4, 4, -6, -2, 0, 0, 0], [], [], 3000, 20000, [2500, 5000, 9000, 14000], [3]] Materia_List << [27, 'Venomous', 'Command', [4, -2, 6, 4, -8, -4, 0, 0, 0], [], [], 3000, 20000, [2500, 5000, 9000, 14000], [4]] Materia_List << [28, 'Blindness', 'Command', [0, -2, 2, -2, -2, 8, 0, 0, 0], [], [], 3000, 20000, [2500, 5000, 9000, 14000], [5]] Materia_List << [29, 'Sleep', 'Command', [-3, 2, -3, -2, 4, 4, 0, 0, 0], [], [], 3000, 20000, [2500, 5000, 9000, 14000], [6]] Materia_List << [30, 'Shock', 'Command', [-2, 0, 3, -4, 2, 5, 0, 0, 0], [], [], 3000, 20000, [2500, 5000, 9000, 14000], [7]] # Summon Materia Materia_List << [31, 'Summon 1', 'Summon', [-10, 10, -5, -5, 0, 10, 0, 0, 0], [], [], 5000, 25000, [6500, 15000, 25000, 50000], [83]] Materia_List << [32, 'Summon 2', 'Summon', [-10, 10, -5, -5, 0, 10, 0, 0, 0], [], [], 5000, 25000, [6500, 15000, 25000, 50000], [84]] Materia_List << [33, 'Summon 3', 'Summon', [-10, 10, -5, -5, 0, 10, 0, 0, 0], [], [], 5000, 25000, [6500, 15000, 25000, 50000], [85]] # Support Materia Materia_List << [34, 'All', 'Support', [0, 0, 0, 0, 0, 0, 0, 0], [], [], 2000, 10000, [2000, 4000, 7000, 11000], [], 'All'] Materia_List << [35, 'Elemental', 'Support', [0, 0, 0, 0, 0, 0, 0, 0], [], [], 2000, 10000, [2000, 4000, 7000, 11000], [], 'Elemental'] Materia_List << [36, 'Added Effect', 'Support', [0, 0, 0, 0, 0, 0, 0, 0], [], [], 2000, 10000, [2000, 4000, 7000, 11000], [], 'Added Effect'] Materia_List << [37, 'HP Absorb', 'Support', [0, 0, 0, 0, 0, 0, 0, 0], [], [], 2000, 10000, [2000, 4000, 7000, 11000], [], 'HP Absorb'] Materia_List << [38, 'MP Absorb', 'Support', [0, 0, 0, 0, 0, 0, 0, 0], [], [], 2000, 10000, [2000, 4000, 7000, 11000], [], 'MP Absorb'] Materia_List << [39, 'MP Turbo', 'Support', [0, 0, 0, 0, 0, 0, 0, 0], [], [], 2000, 10000, [2000, 4000, 7000, 11000], [], 'MP Turbo'] Materia_List << [40, 'Reduce Cost', 'Support', [0, 0, 0, 0, 0, 0, 0, 0], [], [], 2000, 10000, [2000, 4000, 7000, 11000], [], 'Reduce Cost'] # Independent Materia Materia_List << [41, 'Exp Plus', 'Independent', [0, 0, 0, 0, 0, 0, 0, 0], [], [], 2000, 10000, [2000, 4000, 7000, 11000], [], 'Exp Plus'] Materia_List << [42, 'Gil Plus', 'Independent', [0, 0, 0, 0, 0, 0, 0, 0], [], [], 2000, 10000, [2000, 4000, 7000, 11000], [], 'Gil Plus'] Materia_List << [43, 'HP Plus', 'Independent', [0, 0, 0, 0, 0, 0, 0, 0], [], [], 2000, 10000, [2000, 4000, 7000, 11000], [], 'HP Plus'] Materia_List << [44, 'MP Plus', 'Independent', [0, 0, 0, 0, 0, 0, 0, 0], [], [], 2000, 10000, [2000, 4000, 7000, 11000], [], 'MP Plus'] Materia_List << [45, 'ATK Plus', 'Independent', [0, 0, 0, 0, 0, 0, 0, 0], [], [], 2000, 10000, [2000, 4000, 7000, 11000], [], 'ATK Plus'] Materia_List << [46, 'DEF Plus', 'Independent', [0, 0, 0, 0, 0, 0, 0, 0], [], [], 2000, 10000, [2000, 4000, 7000, 11000], [], 'DEF Plus'] Materia_List << [47, 'MAT Plus', 'Independent', [0, 0, 0, 0, 0, 0, 0, 0], [], [], 2000, 10000, [2000, 4000, 7000, 11000], [], 'MAT Plus'] Materia_List << [48, 'MDF Plus', 'Independent', [0, 0, 0, 0, 0, 0, 0, 0], [], [], 2000, 10000, [2000, 4000, 7000, 11000], [], 'MDF Plus'] Materia_List << [49, 'AGI Plus', 'Independent', [0, 0, 0, 0, 0, 0, 0, 0], [], [], 2000, 10000, [2000, 4000, 7000, 11000], [], 'AGI Plus'] Materia_List << [50, 'LUK Plus', 'Independent', [0, 0, 0, 0, 0, 0, 0, 0], [], [], 2000, 10000, [2000, 4000, 7000, 11000], [], 'LUK Plus'] Materia_List << [51, 'HIT Plus', 'Independent', [0, 0, 0, 0, 0, 0, 0, 0], [], [], 2000, 10000, [2000, 4000, 7000, 11000], [], 'HIT Plus'] Materia_List << [52, 'EVA Plus', 'Independent', [0, 0, 0, 0, 0, 0, 0, 0], [], [], 2000, 10000, [2000, 4000, 7000, 11000], [], 'EVA Plus'] Materia_List << [53, 'MEV Plus', 'Independent', [0, 0, 0, 0, 0, 0, 0, 0], [], [], 2000, 10000, [2000, 4000, 7000, 11000], [], 'MEV Plus'] Materia_List << [54, 'Escape Plus', 'Independent', [0, 0, 0, 0, 0, 0, 0, 0], [], [], 2000, 10000, [2000, 4000, 7000, 11000], [], 'Escape Plus'] Materia_List << [55, 'HP <> MP', 'Independent', [0, 0, 0, 0, 0, 0, 0, 0], [], [], 2000, 10000, [2000, 4000, 7000, 11000], [], 'HP <> MP'] end $imported = {} if $imported.nil? #============================================================================== # ** RPG::EquipItem #------------------------------------------------------------------------------ # This is the superclass of weapons && armor. #============================================================================== class RPG::EquipItem < RPG::BaseItem #-------------------------------------------------------------------------- # * Public Instance Variables #-------------------------------------------------------------------------- attr_accessor :paired_materia attr_accessor :single_materia #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def set_materia_slots(slots) @paired_materia, @single_materia = slots[0], slots[1] end end #============================================================================== # ** Materia #------------------------------------------------------------------------------ # This class handles the materia info. #============================================================================== class Materia #-------------------------------------------------------------------------- # * Public Instance Variables #-------------------------------------------------------------------------- attr_reader :id attr_accessor :name attr_accessor :all attr_accessor :type attr_accessor :stat_effects attr_accessor :elements attr_accessor :states attr_accessor :new_value attr_accessor :master_value attr_accessor :skills attr_accessor :exp_levels attr_accessor :special_effect #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def initialize(id, name, type, stat_effects = [], elements = [], states = [], n_value = 500, m_value = 1000, skills = [], exp_levels = [], s_effect = nil) @id, @name, @type, @stat_effects, @elements, @states, @new_value, @master_value, @exp_levels, @skills, @special_effect = id, name, type, stat_effects, elements, states, n_value, m_value, skills, exp_levels, s_effect @experience = 0 reset_all end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def reset_all @all = level end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def experience return @experience end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def experience=(num) @experience = [num, @exp_levels[@exp_levels.size - 1]].min end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def level for i in 0...@exp_levels.size if @experience >= @exp_levels[@exp_levels.size - (1 + i)] return @exp_levels.size - i + 1 end end return 1 end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def buy_value return @new_value end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def base_sell_value return @new_value / 2 end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def sell_value variation = @master_value - (@new_value / 2) price_rate = [@experience * 100 / @exp_levels[@exp_levels.size - 1], 100].min return [((variation * price_rate) / 100) + (@new_value / 2) ,0].max end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def get_hue case @type when 'Magic' then hue = 130 when 'Command' then hue = 60 when 'Summon' then hue = 10 when 'Support' then hue = 180 when 'Independent' then hue = 300 end hue end end #============================================================================== # ** Materia #------------------------------------------------------------------------------ # This class handles the materia settings #============================================================================== class Materia_System #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- attr_accessor :set_up_materias #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def set_up_materias materias = [] for m in Materia_Config::Materia_List materias[m[0]] = Materia.new(m[0],m[1],m[2],m[3],m[4],m[5],m[6],m[7],m[8],m[9],m[10]) if m != nil end materias.sort! {|a, b| a.id <=> b.id} materias = materias.compact return materias end end #============================================================================== # ** BattleManager #------------------------------------------------------------------------------ # This module manages battle progress. #============================================================================== class << BattleManager #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- alias :materia_system_make_escape_ratio :make_escape_ratio def make_escape_ratio @escape_ratio = 1.5 - 1.0 * $game_troop.agi / $game_party.agi for actor in $game_party.battle_members @escape_ratio *= 1.0 + actor.escapeplus if actor.exist? end end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- alias :materia_system_display_exp :display_exp def display_exp materia_system_display_exp if $game_troop.ap_total > 0 text = sprintf("%s AP received!", $game_troop.ap_total) $game_message.add('\.' + text) $game_party.all_members.each {|actor| actor.ap += $game_troop.ap_total } end end end #============================================================================== # ** Game_BattlerBase #------------------------------------------------------------------------------ # This class handles battlers. It's used as a superclass of the Game_Battler # classes. #============================================================================== class Game_BattlerBase #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- include Materia_Config #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- alias :materia_system_skill_mp_cost :skill_mp_cost def skill_mp_cost(skill) cost = materia_system_skill_mp_cost(skill) return cost unless actor? return_paired_materia.compact.each do |paired_set| materia = paired_set[2] other_materia = paired_set[3] if materia.special_effect == 'MP Turbo' for skill_id in other_materia.skills unless skill_id == 0 || skill_id == nil m_skill = $data_skills[skill_id] if skill == m_skill && !Negate_Turbo.include?(skill.id) cost = (cost + (cost * materia.level * 0.2)).to_i end end end end if materia.special_effect == 'Reduce Cost' for skill_id in other_materia.skills unless skill_id == 0 || skill_id == nil m_skill = $data_skills[skill_id] if skill == m_skill cost = (cost - (cost * materia.level * 0.1)).to_i end end end end end cost end end #============================================================================== # ** Game_Battler #------------------------------------------------------------------------------ # This class deals with battlers. It's used as a superclass of the Game_Actor # and Game_Enemy classes. #============================================================================== class Game_Battler < Game_BattlerBase #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- alias :materia_system_make_damage_value :make_damage_value def make_damage_value(user, item) @materia_user = user materia_system_make_damage_value(user, item) end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- alias :materia_system_apply_guard :apply_guard def apply_guard(damage) result = materia_system_apply_guard(damage) materia_damage(@materia_user, result) end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def materia_damage(user, damage) return damage if damage == 0 obj = user.current_action ? user.current_action.item : nil if user.actor? && obj && obj.is_a?(RPG::Skill) user.all_materias.compact.each do |materia| if materia.type == 'Summon' && materia.skills.include?(obj.id) damage += (damage * materia.level * 0.2).to_i end end user.return_paired_materia.compact.each do |paired_set| materia = paired_set[2] other_materia = paired_set[3] if materia.special_effect == 'MP Turbo' for skill_id in other_materia.skills unless skill_id == 0 || skill_id == nil m_skill = $data_skills[skill_id] if obj == m_skill && !Negate_Turbo.include?(obj.id) damage += (damage * materia.level * 0.2).to_i if damage != 0 end end end end if materia.special_effect =='HP Absorb' for skill_id in other_materia.skills unless skill_id == 0 || skill_id == nil m_skill = $data_skills[skill_id] if obj == m_skill && $game_party.in_battle && !Negate_Absorb.include?(obj.id) && damage > 0 drain = materia.level * 2 hp = (damage * drain / 100).to_i user.hp += [hp, user.mhp - hp].min end end end end if materia.special_effect =='MP Absorb' for skill_id in other_materia.skills unless skill_id == 0 || skill_id == nil m_skill = $data_skills[skill_id] if obj == m_skill && $game_party.in_battle && !Negate_Absorb.include?(obj.id) && damage > 0 drain = materia.level mp = (damage * drain / 100).to_i user.mp += [mp, user.mmp - mp].min end end end end end end damage end end #============================================================================== # ** Game_Action #------------------------------------------------------------------------------ # This class handles battle actions. This class is used within the # Game_Battler class. #============================================================================== class Game_Action #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- include Materia_Config #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- alias :materia_system_targets_for_opponents :targets_for_opponents def targets_for_opponents if item.is_a?(RPG::Skill) && @subject.actor? && item.for_one? @subject.return_paired_materia.compact.each do |paired_set| materia = paired_set[2] other_materia = paired_set[3] if materia.special_effect == 'All' && materia.all > 0 for skill_id in other_materia.skills if skill_id == item.id && !Negate_All.include?(item.id) materia.all -= 1 return opponents_unit.alive_members end end end end end materia_system_targets_for_opponents end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- alias :materia_system_targets_for_friends :targets_for_friends def targets_for_friends if item.is_a?(RPG::Skill) && @subject.actor? && item.for_friend? && item.for_one? @subject.return_paired_materia.compact.each do |paired_set| materia = paired_set[2] other_materia = paired_set[3] if materia.special_effect == 'All' && materia.all > 0 for skill_id in other_materia.skills if skill_id == item.id && !Negate_All.include?(item.id) materia.all -= 1 return friends_unit.alive_members end end end end end if item.is_a?(RPG::Skill) && @subject.actor? && item.for_dead_friend? && item.for_one? @subject.return_paired_materia.compact.each do |paired_set| materia = paired_set[2] other_materia = paired_set[3] if materia.special_effect == 'All' && materia.all > 0 for skill_id in other_materia.skills if skill_id == item.id && !Negate_All.include?(item.id) materia.all -= 1 return friends_unit.dead_members end end end end end materia_system_targets_for_friends end end #============================================================================== # ** Game_Actor #------------------------------------------------------------------------------ # This class handles actors. It's used within the Game_Actors class # ($game_actors) and referenced by the Game_Party class ($game_party). #============================================================================== class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- attr_accessor :materia_slots attr_reader :ap #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- alias :materia_system_setup :setup def setup(actor_id) @materia_slots = {} materia_system_setup(actor_id) equip_slots.size.times {|i| @materia_slots[i] = Array.new } @materia_skills = [] setup_old_equips equip_slots.size.times do |i| type = equip_slots[i] obj = equips[i] sn = obj ? obj.paired_materia * 2 + obj.single_materia : nil @materia_slots[i] = sn ? Array.new(sn, nil) : [] end end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- alias :materia_system_skills :skills def skills @materia_skills.compact.each {|skill_id| forget_skill(skill_id) } @materia_skills.clear all_materias.compact.each {|materia| learn_materia_skill(materia) } materia_system_skills end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- alias :materia_system_param_rate :param_rate def param_rate(param_id) result = materia_system_param_rate(param_id) result + materia_param_plus(param_id) end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- alias :materia_system_param :param def param(param_id) new_id = hp_mp_check(param_id) materia_system_param(new_id) end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- alias :materia_system_xparam :xparam def xparam(param_id) result = materia_system_xparam(param_id) result + materia_xparam_plus(param_id) end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- alias :materia_system_sparam :sparam def sparam(param_id) result = materia_system_sparam(param_id) result + materia_sparam_plus(param_id) end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- alias :materia_system_level_up :level_up def level_up @materia_skills.compact.each {|skill_id| self.forget_skill(skill_id) } @materia_skills.clear materia_system_level_up all_materias.compact.each {|materia| self.learn_materia_skill(materia) } end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- alias :materia_system_final_exp_rate :final_exp_rate def final_exp_rate result = materia_system_final_exp_rate all_materias.compact.each do |materia| result += (materia.level * 0.1) if materia.special_effect == 'Exp Plus' end result end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- alias :materia_system_element_rate :element_rate def element_rate(element_id) result = materia_system_element_rate(element_id) return_paired_materia.compact.each do |set| if set[0] > 0 materia = set[2] if materia.special_effect == 'Elemental' other = set[3] result -= (materia.level * 10) if other.elements.include?(element_id) end end end result end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- alias :materia_system_state_rate :state_rate def state_rate(state_id) result = materia_system_state_rate(state_id) return_paired_materia.compact.each do |set| if set[0] > 0 materia = set[2] if materia.special_effect == 'Added Effect' other = set[3] result -= (materia.level * 10) if other.states.include?(state_id) end end end result end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- alias :materia_system_atk_elements :atk_elements def atk_elements result = materia_system_atk_elements return_paired_materia.compact.each do |set| if set[0] == 0 materia = set[2] if materia.special_effect == 'Elemental' other = set[3] other.elements.each do |id| result.delete(1) result.push(id) end end end end result.compact end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- alias :materia_system_atk_states :atk_states def atk_states result = materia_system_atk_states return_paired_materia.compact.each do |set| if set[0] == 0 materia = set[2] if materia.special_effect == 'Added Effect' other = set[3].states other.states.each {|id| result.push(id) if !result.include?(id) } end end end result.compact end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def all_materias list = [] @materia_slots.values.each {|materia| list += materia } list end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def learn_materia_skill(materia) if ['Magic', 'Command', 'Summon'].include?(materia.type) materia_level = materia.level == materia.exp_levels.size + 1 ? materia.level - 1 : materia.level materia_level.times do |i| unless materia.skills[i] == nil || @skills.include?(materia.skills[i]) skill_id = materia.skills[i] learn_skill(skill_id) @materia_skills.push(skill_id) end end end end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def materia_param_plus(param_id) result = 0 all_materias.compact.each do |materia| result += materia.stat_effects[param_id] result += (materia.level * 10) if materia_param_value(materia, param_id) end result / 100.0 end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def materia_param_value(materia, param_id) (param_id == 0 && materia.special_effect == 'HP Plus') || (param_id == 1 && materia.special_effect == 'MP Plus') || (param_id == 2 && materia.special_effect == 'ATK Plus') || (param_id == 3 && materia.special_effect == 'DEF Plus') || (param_id == 4 && materia.special_effect == 'MAT Plus') || (param_id == 5 && materia.special_effect == 'MDF Plus') || (param_id == 6 && materia.special_effect == 'AGI Plus') || (param_id == 7 && materia.special_effect == 'LUK Plus') end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def hp_mp_check(param_id) return param_id if param_id > 1 all_materias.compact.each do |materia| return 1 if materia.special_effect == 'HP <> MP' && param_id == 0 return 0 if materia.special_effect == 'HP <> MP' && param_id == 1 end param_id end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def materia_xparam_plus(param_id) result = 0 all_materias.compact.each do |materia| result += (materia.level * 10) if materia_xparam_value(materia, param_id) end result end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def materia_xparam_value(materia, param_id) (param_id == 0 && materia.special_effect == 'HIT Plus') || (param_id == 1 && materia.special_effect == 'EVA Plus') || (param_id == 2 && materia.special_effect == 'CRI Plus') || (param_id == 3 && materia.special_effect == 'CEV Plus') || (param_id == 4 && materia.special_effect == 'MEV Plus') || (param_id == 5 && materia.special_effect == 'MRF Plus') || (param_id == 6 && materia.special_effect == 'CNT Plus') || (param_id == 7 && materia.special_effect == 'HRG Plus') || (param_id == 8 && materia.special_effect == 'MRG Plus') || (param_id == 9 && materia.special_effect == 'TRG Plus') end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def materia_sparam_plus(param_id) result = 0 all_materias.compact.each do |materia| result += (materia.level * 10) if materia_sparam_value(materia, param_id) end result end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def materia_sparam_value(materia, param_id) (param_id == 0 && materia.special_effect == 'TGR Plus') || (param_id == 1 && materia.special_effect == 'GRD Plus') || (param_id == 2 && materia.special_effect == 'REC Plus') || (param_id == 3 && materia.special_effect == 'PHA Plus') || (param_id == 4 && materia.special_effect == 'MCR Plus') || (param_id == 5 && materia.special_effect == 'TCR Plus') || (param_id == 6 && materia.special_effect == 'PDR Plus') || (param_id == 7 && materia.special_effect == 'MDR Plus') || (param_id == 8 && materia.special_effect == 'FDR Plus') || (param_id == 9 && materia.special_effect == 'EXR Plus') end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def escapeplus result = 0 all_materias.compact.each do |materia| result += (materia.level * 2) if materia.special_effect == 'Escape Plus' end result / 100.0 end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def ap @ap == nil ? 0 : @ap end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def ap=(ap) @ap = ap all_materias.compact.each do |materia| unless materia.nil? initial_level = materia.level materia.experience += @ap final_level = materia.level if Materia_Breeding && initial_level < (materia.exp_levels.size + 1) && final_level == (materia.exp_levels.size + 1) $game_party.gain_materia(materia.id) end end end @ap = 0 end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def setup_old_equips @old_equips = [] @equips.each {|item| @old_equips.push(item.clone) } end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def check_equip_change equip_slots.size.times do |i| if @equips[i].object != @old_equips[i].object @materia_slots[i].compact.each {|m| $game_party.materia.push(m) } type = equip_slots[i] obj = equips[i] sn = obj ? obj.paired_materia * 2 + obj.single_materia : nil @materia_slots[i] = sn ? Array.new(sn, nil) : [] end end setup_old_equips end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def equip_materia(equip_type, slot_index, index = 0) new = $game_party.materia[index] old = @materia_slots[equip_type][slot_index] $game_party.materia.push(old) unless old.nil? @materia_slots[equip_type][slot_index] = new $game_party.materia.delete_at(index) refresh end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def force_materia(equip_type, slot_index, index = 0) new = $data_materia[index].dup old = @materia_slots[equip_type][slot_index] $game_party.materia.push(old) unless old.nil? @materia_slots[equip_type][slot_index] = new refresh end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def unequip_materia(equip_type, slot_index) old = @materia_slots[equip_type][slot_index] $game_party.materia.push(old) unless old.nil? @materia_slots[equip_type][slot_index] = nil refresh end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def return_paired_materia paired = [] equip_slots.size.times do |i| type = equip_slots[i] obj = equips[i] if obj && obj.paired_materia > 0 (obj.paired_materia * 2).times do |x| materia = @materia_slots[i][x] if materia && materia.type == 'Support' y = x + ([0, 2, 4, 6].include?(x) ? 1 : - 1) other = @materia_slots[i][y] paired.push([0, [x, y].min, materia, other]) unless other.nil? end end end end paired end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def return_paired_materia_type equip_slots.size.times do |i| @materia_slots[i].compact.each {|m| $game_party.materia.push(m) } type = equip_slots[i] obj = equips[i] if obj && obj.paired_materia > 0 obj.paired_materia.times {|x| materia = @materia_slots[i][x] } end if obj && obj.single_materia > 0 obj.single_materia.times {|x| materia = @materia_slots[i][x] } end end end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def skill_all(item) if item.is_a?(RPG::Skill) && actor? && item.for_friend? && item.for_one? return_paired_materia.compact.each do |paired_set| materia = paired_set[2] other_materia = paired_set[3] if materia.special_effect == 'All' && materia.all > 0 for skill_id in other_materia.skills if skill_id == item.id && !Negate_All.include?(item.id) return true end end end end end return false end end #============================================================================== # ** Game_Enemy #------------------------------------------------------------------------------ # This class handles enemies. It used within the Game_Troop class # ($game_troop). #============================================================================== class Game_Enemy < Game_Battler #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- attr_reader :ap #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def ap ap = Enemy_Ap[@enemy_id] ap ? ap : (@enemy.exp / 10).to_i end end #============================================================================== # ** Game_Party #------------------------------------------------------------------------------ # This class handles parties. Information such as gold and items is included. # Instances of this class are referenced by $game_party. #============================================================================== class Game_Party < Game_Unit #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- attr_accessor :materia #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- alias :materia_system_initialize :initialize def initialize materia_system_initialize @materia = [] end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def gain_materia(materia_index) @materia.push($data_materia[materia_index].dup) end end #============================================================================== # ** Game_Troop #------------------------------------------------------------------------------ # This class handles enemy groups and battle-related data. Also performs # battle events. The instance of this class is referenced by $game_troop. #============================================================================== class Game_Troop < Game_Unit #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- alias :materia_system_gold_total :gold_total def gold_total result = materia_system_gold_total gil_plus = 100.0 $game_party.members.each do |actor| actor.all_materias.compact.each do |materia| gil_plus += (materia.level * 5) if materia.special_effect == 'Gil Plus' end end result *= gil_plus / 100.0 result.to_i end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def ap_total dead_members.inject(0) {|r, enemy| r += enemy.ap } end end #============================================================================== # ** Window_Base #------------------------------------------------------------------------------ # This is a super class of all windows within the game. #============================================================================== class Window_Base < Window #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- include Materia_Config end #============================================================================== # ** Window_MenuCommand #------------------------------------------------------------------------------ # This command window appears on the menu screen. #============================================================================== class Window_MenuCommand < Window_Command #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- alias :materia_system_add_main_commands :add_main_commands def add_main_commands materia_system_add_main_commands add_command("Materia", :materia, main_commands_enabled) end end #============================================================================== # ** Window_MenuCommand #------------------------------------------------------------------------------ # This command window appears on the menu screen. #============================================================================== class Window_MateriaShopCommand < Window_HorzCommand #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def make_command_list add_command(Vocab::ShopBuy, :buy) add_command(Vocab::ShopSell, :sell) add_command(Vocab::ShopCancel, :cancel) end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def col_max return 3 end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def window_width return Graphics.width - 160 end end #============================================================================== # ** Window_MenuActor #------------------------------------------------------------------------------ # This window is for selecting actors that will be the target of item or # skill use. #============================================================================== class Window_MenuActor < Window_MenuStatus #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def select_for_item(item, for_all = false) @cursor_fix = item.for_user? @cursor_all = for_all if @cursor_fix select($game_party.menu_actor.index) elsif @cursor_all select(0) else select_last end end end #============================================================================== # ** Window_SkillList #------------------------------------------------------------------------------ # This window is for displaying a list of available skills on the skill window. #============================================================================== class Window_SkillList < Window_Selectable #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- alias :materia_system_draw_skill_cost :draw_skill_cost def draw_skill_cost(rect, skill) materia_system_draw_skill_cost(rect, skill) change_color(text_color(18), enable?(skill)) rect.x += (32 + text_size(skill.name).width) draw_text(rect, ">") if @actor.skill_all(skill) end end #============================================================================== # ** Window_MateriaBio #------------------------------------------------------------------------------ # #============================================================================== class Window_MateriaBio < Window_Base #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def initialize super(256, 96, 288 + [Graphics.width - 544, 0].max , 320 + [Graphics.height - 416, 0].max) self.contents = Bitmap.new(width - 32, height - 32) self.visible = false end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def refresh(materia) self.contents.clear return if materia.nil? hue = materia.get_hue begin bitmap = Cache.system(materia.name + "_m").dup rescue bitmap = Cache.system(Default_Icon).dup bitmap.hue_change(hue) end self.contents.blt(0, 0, bitmap, Rect.new(0, 0, 24, 24)) self.contents.font.size = 22 self.contents.font.color = normal_color self.contents.font.bold = false self.contents.draw_text(28, 0, contents.width, 24, materia.name) bitmap = Cache.system(Materia_Level).dup bitmap.hue_change(hue) star_x = contents.width / 2 - 144 materia.level.times do self.contents.blt(star_x += 24, 22, bitmap, Rect.new(0, 0, 24, 24)) end (materia.exp_levels.size + 1 - materia.level).times do self.contents.blt(star_x += 24, 22, bitmap, Rect.new(0, 0, 24, 24), 100) end self.contents.font.size = 14 self.contents.font.bold = true self.contents.font.color = system_color self.contents.draw_text(142, 44, 172, 16, 'Level:') self.contents.draw_text(142, 92, 172, 16, 'Next Level:') self.contents.draw_text(142, 60, 172, 16, AP_Total) self.contents.draw_text(0, 44 , contents.width, 16, 'Skills:') self.contents.font.color = normal_color lev = materia.level == materia.exp_levels.size + 1 ? Master_Text : materia.level.to_s self.contents.draw_text(196, 44, 172, 16, lev) self.contents.draw_text(82, 76, 172, 16, materia.experience.to_s, 2) nxt = lev == Master_Text ? '----------' : materia.exp_levels[materia.level - 1] - materia.experience self.contents.draw_text(82, 108, 172, 16, nxt.to_s, 2) materia_y = 18 for i in 0...(materia.level) self.contents.font.color.alpha = 255 unless materia.skills[i].nil? self.contents.draw_text(16, 44 + materia_y, 112, 16, $data_skills[materia.skills[i]].name) materia_y += 14 end end for i in (materia.level)...materia.skills.size self.contents.font.color.alpha = 128 unless materia.skills[i].nil? self.contents.draw_text(16, 44 + materia_y, 112, 16, $data_skills[materia.skills[i]].name) materia_y += 14 end end if materia.skills.size == 0 self.contents.draw_text(8, 52, contents.width / 2 - 8, 24, '') end self.contents.font.color = normal_color self.contents.font.color.alpha = 255 se = materia.special_effect.nil? ? '----------' : materia.special_effect self.contents.draw_text(0, 140, self.width - 48, 16, "Special Effect: ") txt_width = self.contents.text_size("Special Effect: ").width self.contents.draw_text(txt_width, 140, self.width - (48 + txt_width), 16, se) self.contents.font.bold = true self.contents.font.size = 12 self.contents.draw_text(0, 158, 160, 16, "Buy:#{materia.new_value}") self.contents.draw_text(92, 158, 160, 16, "Sell:#{materia.base_sell_value}") self.contents.draw_text(172, 158, 160, 16, Master_Text + ":#{materia.master_value}") self.contents.font.color = system_color base_y = 176 self.contents.draw_text(0, base_y, contents.width / 2, 14, 'Status:') self.contents.font.color = normal_color for i in 0...materia.stat_effects.size self.contents.draw_text(0, base_y + (i + 1) * 14, contents.width / 2, 14, Vocab.param(i)) self.contents.draw_text(- 8, base_y + (i + 1) * 14, contents.width / 2, 14, "#{materia.stat_effects[i]} %", 2) end x, y = contents.width / 2 + 4, base_y self.contents.font.color = system_color self.contents.draw_text(x, y, contents.width / 2, 14, 'Elements/Effects:') self.contents.font.color = normal_color if materia.elements.size + materia.states.size == 0 self.contents.draw_text(x + 4, y + 14, contents.width / 2, 14, '') else total = 1 for i in 0...materia.elements.size total += 1 ox = 4 + total % 2 * (contents.width / 4) oy = total / 2 * 14 self.contents.draw_text(x + ox, y + oy, contents.width / 2, 14, $data_system.elements[materia.elements[i]]) end for i in 0...materia.states.size total += 1 ox = 4 + total % 2 * (contents.width / 4) oy = total / 2 * 14 self.contents.draw_text(x + ox, y + oy, contents.width / 2, 14, $data_states[materia.states[i]].name) end end end end #============================================================================== # ** Window_MateriaList #------------------------------------------------------------------------------ # #============================================================================== class Window_MateriaList < Window_Selectable #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def initialize(width, height, buying, materia_list = nil, show_cost = true) @materia = [] super(0, 96, width, height) if buying materia_list.each do |index| $data_materia.each {|m| @materia.push(m) if index == m.id } end else @materia = $game_party.materia end self.index = 0 self.visible = self.active = false @buying, @show_cost = buying, show_cost refresh end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def item_max @materia.size end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def materia @materia[self.index] end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def refresh @materia.sort! {|a, b| a.id <=> b.id} self.contents.clear if self.contents != nil if item_max > 0 self.contents = Bitmap.new(width - 32, item_max * 24) item_max.times {|i| draw_item(i) } end end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def draw_item(index) rect = item_rect(index) self.contents.clear_rect(rect) materia = @materia[index] hue = materia.get_hue begin bitmap = Cache.system(materia.name + "_m").dup rescue bitmap = Cache.system(Default_Icon).dup bitmap.hue_change(hue) end self.contents.blt(0, index * 24, bitmap, Rect.new(0, 0, 24, 24)) self.contents.font.color.alpha = materia.buy_value <= $game_party.gold ? 255 : 128 if @buying self.contents.draw_text(28, index * 24 - 4, 128, 32, materia.name) if @show_cost value = @buying ? materia.buy_value : materia.sell_value self.contents.draw_text(148, index * 24 - 4, 72, 32, ":#{value}", 2) end end end #============================================================================== # ** Window_MateriaActor #------------------------------------------------------------------------------ # #============================================================================== class Window_MateriaStatus < Window_Base #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def initialize(actor) super(0, 0, Graphics.width, 140) self.contents = Bitmap.new(width - 32, height - 32) @actor = actor @frame = 0 refresh end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def refresh(actor = @actor) @actor = actor self.contents.clear draw_face(actor.face_name, actor.face_index, 4, 4) draw_actor_name(actor, [Graphics.width - 544, 4].max, 0) draw_actor_level(actor, [Graphics.width - 544, 4].max, 24) draw_actor_hp(actor, [Graphics.width - 544, 4].max, 52) draw_actor_mp(actor, [Graphics.width - 544, 4].max, 80) end end #============================================================================== # ** Window_MateriaActor #------------------------------------------------------------------------------ # #============================================================================== class Window_MateriaActor < Window_Base #------------------------------------------------------------------------------ # * #------------------------------------------------------------------------------ def initialize(actor) super(0, -6, Graphics.width, 152) self.contents = Bitmap.new(width - 32, height - 32) self.opacity = 0 @actor = actor @frame = 0 refresh end #------------------------------------------------------------------------------ # * #------------------------------------------------------------------------------ def refresh(actor = @actor) @actor = actor self.contents.clear draw_equipments(132 + [Graphics.width - 544, 0].max, 0) draw_actor_materia end #------------------------------------------------------------------------------ # * #------------------------------------------------------------------------------ def draw_equipments(x, y) @actor.equips.each_with_index do |item, i| draw_item_name(item, x, y + line_height * i) end end #------------------------------------------------------------------------------ # * #------------------------------------------------------------------------------ def draw_actor_materia base_x = 316 + [Graphics.width - 544, 0].max self.contents.fill_rect(base_x, 0, 192, 120, Color.new(0, 0, 0, 0)) @actor.equip_slots.size.times do |i| self.contents.fill_rect(base_x, i * 24 + 2, 192, 22, Color.new(0, 0, 0, 50)) end @actor.equip_slots.size.times do |i| slots_x, y = base_x - 24, i * 24 obj = @actor.equips[i] if obj.nil? p_times, s_times = 0, 0 else p_times = obj.paired_materia s_times = obj.single_materia end p_times.times do bitmap = Cache.system(Paired_Slot_Left) self.contents.blt(slots_x += 24, y, bitmap, Rect.new(0, 0, 24, 24)) bitmap = Cache.system(Paired_Slot_Right) self.contents.blt(slots_x += 24, y, bitmap, Rect.new(0, 0, 24, 24)) end s_times.times do bitmap = Cache.system(Single_Slot) self.contents.blt(slots_x += 24, y, bitmap, Rect.new(0, 0, 24, 24)) end end @actor.equip_slots.size.times do |i| @actor.materia_slots[i].size.times do |y| materia = @actor.materia_slots[i][y] unless materia.nil? hue = materia.get_hue begin bitmap = Cache.system(materia.name + "_m").dup rescue bitmap = Cache.system(Default_Icon).dup bitmap.hue_change(hue) end self.contents.blt(base_x + y * 24, 24 * i, bitmap, Rect.new(0, 0, 24, 24)) end end end end end #============================================================================== # ** Window_MateriaEquipBio #------------------------------------------------------------------------------ # #============================================================================== class Window_MateriaEquipBio < Window_Base #------------------------------------------------------------------------------ # * #------------------------------------------------------------------------------ def initialize super(0, 140, 352 + [Graphics.width - 544, 0].max, 276 + [Graphics.height - 416, 0].max) self.contents = Bitmap.new(width - 32, height - 32) end #------------------------------------------------------------------------------ # * #------------------------------------------------------------------------------ def refresh(materia) self.contents.clear return if materia.nil? hue = materia.get_hue begin bitmap = Cache.system(materia.name + "_m").dup rescue bitmap = Cache.system(Default_Icon).dup bitmap.hue_change(hue) end self.contents.blt(0, 0, bitmap, Rect.new(0, 0, 24, 24)) self.contents.font.color = normal_color self.contents.font.size = 22 self.contents.font.bold = false self.contents.draw_text(32, 0, contents.width, 24, materia.name) bitmap = Cache.system(Materia_Level).dup bitmap.hue_change(hue) star_x = contents.width / 2 - 180 materia.level.times do self.contents.blt(star_x += 24, 22, bitmap, Rect.new(0, 0, 24, 24)) end (materia.exp_levels.size + 1 - materia.level).times do self.contents.blt(star_x += 24, 22, bitmap, Rect.new(0, 0, 24, 24), 100) end self.contents.font.size = 14 self.contents.font.bold = true self.contents.font.color = system_color self.contents.draw_text(164, 44, 172, 16, 'Level:') self.contents.draw_text(164, 92, 172, 16, 'Next Level:') self.contents.draw_text(164, 60, 172, 16, AP_Total) self.contents.draw_text(4, 44, contents.width, 16, 'Skills:') self.contents.font.color = normal_color materia_y = 18 for i in 0...(materia.level) self.contents.font.color.alpha = 255 unless materia.skills[i].nil? self.contents.draw_text(16, 44 + materia_y, 128, 16, $data_skills[materia.skills[i]].name) materia_y += 14 end end for i in (materia.level)...materia.skills.size self.contents.font.color.alpha = 128 unless materia.skills[i].nil? self.contents.draw_text(16, 44 + materia_y, 128, 16, $data_skills[materia.skills[i]].name) materia_y += 14 end end self.contents.font.color = normal_color lev = materia.level == materia.exp_levels.size + 1 ? Master_Text : materia.level.to_s self.contents.draw_text(216, 44, 172, 16, lev) self.contents.draw_text(102, 76, 172, 16, materia.experience.to_s, 2) nxt = lev == Master_Text ? '----------' : materia.exp_levels[materia.level - 1] - materia.experience self.contents.draw_text(102,108, 172, 16, nxt.to_s, 2) self.contents.font.color = normal_color self.contents.font.color.alpha = 255 se = materia.special_effect.nil? ? '----------' : materia.special_effect self.contents.draw_text(4, 132, self.width - 48, 16, "Special Effect: ") txt_width = self.contents.text_size("Special Effect: ").width self.contents.draw_text(txt_width, 132, self.width - (48 + txt_width), 16, se) self.contents.font.bold = true self.contents.font.size = 12 self.contents.font.color = system_color base_y = 146 self.contents.draw_text(4, base_y, contents.width / 2, 16, 'Status:') self.contents.font.color = normal_color for i in 0...materia.stat_effects.size self.contents.draw_text(4, base_y + (i + 1) * 14, contents.width / 2, 16, Vocab.param(i)) self.contents.draw_text(- 8, base_y + (i + 1) * 14, contents.width / 2, 16, "#{materia.stat_effects[i]} %", 2) end x, y = contents.width / 2 + 4, base_y self.contents.font.color = system_color self.contents.draw_text(x, y, contents.width / 2, 16, 'Elements/Effects') self.contents.font.color = normal_color if materia.elements.size + materia.states.size == 0 self.contents.draw_text(x + 4, y + 14, contents.width / 2, 16, '') else total = 1 for i in 0...materia.elements.size total += 1 ox = 4 + total % 2 * (contents.width / 4) oy = total / 2 * 16 self.contents.draw_text(x + ox, y + oy, contents.width / 2, 16, $data_system.elements[materia.elements[i]]) end for i in 0...materia.states.size total += 1 ox = 4 + total % 2 * (contents.width / 4) oy = total / 2 * 16 self.contents.draw_text(x + ox, y + oy, contents.width / 2, 16, $data_states[materia.states[i]].name) end end end end #============================================================================== # ** Game_Interpreter #------------------------------------------------------------------------------ # An interpreter for executing event commands. This class is used within the # Game_Map, Game_Troop, and Game_Event classes. #============================================================================== class Game_Interpreter #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- alias :materia_system_command_319 :command_319 def command_319 materia_system_command_319 $game_actors[@params[0]].check_equip_change if $game_actors[@params[0]] end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def materia_shop(list) $materia_shop_list = list.dup SceneManager.call(Scene_MateriaShop) end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def equip_materia(id, equip, slot, materia) actor = $game_actors[id] actor.force_materia(equip, slot - 1, materia) end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def remove_materia(id) $game_party.materia.each_with_index do |m, i| break $game_party.materia.delete_at(i) if m.id == id end end end #============================================================================== # ** Scene_Base #------------------------------------------------------------------------------ # This is a super class of all scenes within the game. #============================================================================== class Scene_Base #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- include Materia_Config end #============================================================================== # ** Scene_Title #------------------------------------------------------------------------------ # This class performs the title screen processing. #============================================================================== class Scene_Title < Scene_Base #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- alias :materia_system_main :main def main materia_system_main materias = Materia_System.new $data_materia = materias.set_up_materias end #------------------------------------------------------------------------------ # * #------------------------------------------------------------------------------ alias :materia_system_command_new_game :command_new_game def command_new_game materias = Materia_System.new $data_materia = materias.set_up_materias for i in 1...$data_weapons.size if Weapon_Materia_Slots[i] != nil $data_weapons[i].set_materia_slots(Weapon_Materia_Slots[i]) else $data_weapons[i].set_materia_slots([0,0]) end end for i in 1...$data_armors.size if Armors_Materia_Slots[i] != nil $data_armors[i].set_materia_slots(Armors_Materia_Slots[i]) else $data_armors[i].set_materia_slots([0,0]) end end materia_system_command_new_game end #------------------------------------------------------------------------------ # * #------------------------------------------------------------------------------ alias :materia_system_command_continue :command_continue def command_continue materias = Materia_System.new $data_materia = materias.set_up_materias for i in 1...$data_weapons.size if Weapon_Materia_Slots[i] != nil $data_weapons[i].set_materia_slots(Weapon_Materia_Slots[i]) else $data_weapons[i].set_materia_slots([0,0]) end end for i in 1...$data_armors.size if Armors_Materia_Slots[i] != nil $data_armors[i].set_materia_slots(Armors_Materia_Slots[i]) else $data_armors[i].set_materia_slots([0,0]) end end materia_system_command_continue end end #============================================================================== # ** Scene_Equip #------------------------------------------------------------------------------ # This class performs the equipment screen processing. #============================================================================== class Scene_Equip < Scene_MenuBase #------------------------------------------------------------------------------ # * #------------------------------------------------------------------------------ alias :materia_system_on_actor_change :on_actor_change def on_actor_change @actor.check_equip_change materia_system_on_actor_change end #------------------------------------------------------------------------------ # * #------------------------------------------------------------------------------ def terminate super @actor.check_equip_change end end #============================================================================== # ** Scene_MateriaShop #------------------------------------------------------------------------------ # #============================================================================== class Scene_MateriaShop < Scene_MenuBase #------------------------------------------------------------------------------ # * #------------------------------------------------------------------------------ def start super @materia_avialable = $materia_shop_list create_command_window @help_window = Window_Help.new(1) @help_window.set_text(Shop_Message) @gold_window = Window_Gold.new @gold_window.x = Graphics.width - 160 @gold_window.y = 48 @dummy_window = Window_Base.new(0, 96, Graphics.width, 320 + [Graphics.height - 416, 0].max) @buy_items = Window_MateriaList.new(256, 320 + [Graphics.height - 416, 0].max, true, @materia_avialable) @sell_items = Window_MateriaList.new(256, 320 + [Graphics.height - 416, 0].max, false) @materia_bio = Window_MateriaBio.new end #------------------------------------------------------------------------------ # * #------------------------------------------------------------------------------ def update if @shop_options_window.active update_shop_commands elsif @buy_items.active update_buy_materia elsif @sell_items.active update_sell_materia end super end #------------------------------------------------------------------------------ # * #------------------------------------------------------------------------------ def create_command_window @shop_options_window = Window_MateriaShopCommand.new(0, 48) @shop_options_window.set_handler(:buy, method(:command_buy)) @shop_options_window.set_handler(:sell, method(:command_sell)) @shop_options_window.set_handler(:cancel, method(:return_scene)) end #------------------------------------------------------------------------------ # * #------------------------------------------------------------------------------ def command_buy @shop_options_window.active = false @dummy_window.visible = false @materia_bio.visible = true @materia_bio.refresh(@buy_items.materia) @buy_items.visible = @buy_items.active = true end #------------------------------------------------------------------------------ # * #------------------------------------------------------------------------------ def command_sell @shop_options_window.active = false @dummy_window.visible = false @materia_bio.visible = true @materia_bio.refresh(@sell_items.materia) @sell_items.visible = @sell_items.active = true end #------------------------------------------------------------------------------ # * #------------------------------------------------------------------------------ def update_shop_commands @help_window.set_text(Shop_Message) if Input.trigger?(: Sound.play_cancel return_scene end end #------------------------------------------------------------------------------ # * #------------------------------------------------------------------------------ def update_buy_materia @help_window.set_text(Buy_Message) if Input.trigger?(: Sound.play_cancel @buy_items.visible = @buy_items.active = false @buy_items.index = 0 @materia_bio.visible = false @shop_options_window.active = true @dummy_window.visible = true end if Input.trigger?(:C) materia = @buy_items.materia if $game_party.gold < materia.buy_value Sound.play_buzzer return end Sound.play_shop $game_party.gain_materia(materia.id) $game_party.lose_gold(materia.buy_value) @gold_window.refresh @buy_items.refresh @sell_items.refresh @materia_bio.refresh(@buy_items.materia) end if Input.trigger?(:UP) || Input.trigger?(:DOWN) || Input.press?(:UP) || Input.press?(:DOWN) || Input.trigger?(:R) || Input.trigger?(:L) || Input.press?(:R) || Input.press?(:L) @materia_bio.refresh(@buy_items.materia) end end #------------------------------------------------------------------------------ # * #------------------------------------------------------------------------------ def update_sell_materia @help_window.set_text(Sell_Message) if Input.trigger?(: Sound.play_cancel @sell_items.visible = @sell_items.active = false @sell_items.index = 0 @materia_bio.visible = false @shop_options_window.active = true @dummy_window.visible = true end if Input.trigger?(:C) if @sell_items.materia.nil? Sound.play_buzzer return end Sound.play_shop $game_party.gain_gold(@sell_items.materia.sell_value) @gold_window.refresh $game_party.materia.delete_at(@sell_items.index) @sell_items.refresh @sell_items.index = 0 @materia_bio.refresh(@sell_items.materia) end if Input.trigger?(:UP) || Input.trigger?(:DOWN) || Input.press?(:UP) || Input.press?(:DOWN) || Input.trigger?(:R) || Input.trigger?(:L) || Input.press?(:R) || Input.press?(:L) @materia_bio.refresh(@sell_items.materia) end end end #============================================================================== # ** Scene_MateriaEquip #------------------------------------------------------------------------------ # #============================================================================== class Scene_MateriaEquip < Scene_MenuBase #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def start super @materia_index = 0 @equip_index = 0 @status_bio_window = Window_MateriaStatus.new(@actor) @character_bio_window = Window_MateriaActor.new(@actor) @materia_bio_window = Window_MateriaEquipBio.new @materia_list_window = Window_MateriaList.new(192, 276 + [Graphics.height - 416, 0].max, false, $game_party.materia, false) @materia_list_window.x = 352 + [Graphics.width - 544, 0].max @materia_list_window.y = 140 @materia_list_window.visible = true @materia_bio_window.z = @materia_list_window.z = 1000 @pointer_sprite = Sprite.new @pointer_sprite.x = 316 + [Graphics.width - 544, 0].max + (@materia_index + 1) * 24 - 28 @pointer_sprite.y = 0 * 24 + 12 @pointer_sprite.z = 9999 @pointer_sprite.bitmap = Cache.system(Materia_Cursor) @materia_list_window.refresh update_materia_bio end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def update super !@materia_list_window.active ? update_weapon_select : update_materia_select end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def dispose_background super @pointer_sprite.dispose end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def update_weapon_select @pointer_sprite.x = 316 + [Graphics.width - 544, 0].max + (@materia_index + 1) * 24 - 28 @pointer_sprite.y = @equip_index * 24 + 12 if Input.trigger?(:UP) Sound.play_cursor @equip_index = @equip_index == 0 ? @equip_index = 4 : @equip_index -= 1 max = [@actor.materia_slots[@equip_index].size - 1, 0].max @materia_index = [@materia_index, max].min update_materia_bio end if Input.trigger?(:DOWN) Sound.play_cursor @equip_index = @equip_index == 4 ? @equip_index = 0 : @equip_index += 1 max = [@actor.materia_slots[@equip_index].size - 1, 0].max @materia_index = [@materia_index, max].min update_materia_bio end if Input.trigger?(:RIGHT) Sound.play_cursor max = @actor.materia_slots[@equip_index].size return if max == 0 @materia_index = @materia_index == max - 1 ? @materia_index = 0 : @materia_index += 1 update_materia_bio end if Input.trigger?(:LEFT) Sound.play_cursor max = @actor.materia_slots[@equip_index].size return if max == 0 @materia_index = @materia_index == 0 ? @materia_index = max - 1 : @materia_index -= 1 update_materia_bio end if Input.trigger?(:L) Sound.play_cursor next_actor end if Input.trigger?(:R) Sound.play_cursor prev_actor end if Input.trigger?(:A) Sound.play_equip @actor.unequip_materia(@equip_index, @materia_index) @materia_list_window.refresh @status_bio_window.refresh @character_bio_window.draw_actor_materia update_materia_bio end if Input.trigger?(: Sound.play_cancel return_scene end if Input.trigger?(:C) max = @actor.materia_slots[@equip_index].size if max == 0 Sound.play_buzzer return else Sound.play_ok @materia_list_window.active = true update_materia_bio end end end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def update_materia_select if Input.trigger?(: Sound.play_cancel @materia_list_window.active = false update_materia_bio end if Input.trigger?(:C) if @materia_list_window.materia.nil? Sound.play_buzzer return end Sound.play_equip @actor.equip_materia(@equip_index, @materia_index, @materia_list_window.index) @materia_list_window.refresh @status_bio_window.refresh @character_bio_window.draw_actor_materia @materia_list_window.active = false end if Input.trigger?(:UP) || Input.trigger?(:DOWN) || Input.press?(:UP) || Input.press?(:DOWN) || Input.trigger?(:R) || Input.trigger?(:L) || Input.press?(:R) || Input.press?(:L) update_materia_bio end end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def update_materia_bio if @materia_list_window.active @materia_bio_window.refresh(@materia_list_window.materia) else item = @actor.materia_slots[@equip_index] @materia_bio_window.refresh(item[@materia_index]) end end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def on_actor_change @status_bio_window.refresh(@actor) @character_bio_window.refresh(@actor) update_materia_bio end end #============================================================================== # ** Scene_Menu #------------------------------------------------------------------------------ # This class performs the menu screen processing. #============================================================================== class Scene_Menu < Scene_MenuBase #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- alias :materia_system_create_command_window :create_command_window def create_command_window materia_system_create_command_window @command_window.set_handler(:materia, method(:command_personal)) end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- alias :materia_system_on_personal_ok :on_personal_ok def on_personal_ok materia_system_on_personal_ok case @command_window.current_symbol when :materia SceneManager.call(Scene_MateriaEquip) end end end #============================================================================== # ** Scene_ItemBase #------------------------------------------------------------------------------ # This class performs common processing for the item screen and skill screen. #============================================================================== class Scene_ItemBase < Scene_MenuBase #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def determine_item if item.for_friend? show_sub_window(@actor_window) for_all = item.for_all? || (@actor && @actor.skill_all(item)) @actor_window.select_for_item(item, for_all) else use_item activate_item_window end end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def item_target_actors if !item.for_friend? [] elsif item.for_all? || (@actor && @actor.skill_all(item)) $game_party.members else [$game_party.members[@actor_window.index]] end end end #============================================================================== # ** Scene_Battle #------------------------------------------------------------------------------ # This class performs battle screen processing. #============================================================================== class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- alias :materia_system_battle_start :battle_start def battle_start materia_system_battle_start $game_party.members.each do |actor| actor.all_materias.compact.each {|materia| materia.reset_all } end end #-------------------------------------------------------------------------- # * #-------------------------------------------------------------------------- def on_skill_ok @skill = @skill_window.item BattleManager.actor.input.set_skill(@skill.id) BattleManager.actor.last_skill.object = @skill if !@skill.need_selection? || BattleManager.actor.skill_all(@skill) @skill_window.hide next_command elsif @skill.for_opponent? select_enemy_selection else select_actor_selection end end end Share this post Link to post Share on other sites
Max W. 18 Posted October 19, 2012 Nice thats awesome my only issue now is the exp plus like said before. Also I don't know if this is useful for anyone but if you guys want to change the materia menu command name its on line 1340. Share this post Link to post Share on other sites
Tammsyn 8 Posted October 19, 2012 thank you for sharing i use yanflys engines so never looked into that bit Share this post Link to post Share on other sites
Max W. 18 Posted October 20, 2012 Oh I am sorry the line is 1365 with the newer version plus Kaleb Daub/Mooshra has edited the materia slots to look more like the do in the actual game plus resized the materia to fit them. So here are some alternate graphics Share this post Link to post Share on other sites
Lionheart 2 Posted October 21, 2012 (edited) Nice script, I had already seen elsewhere days ago ... However, some materia do not work like this : The Elemental, Added Effect, HP Absorb and MP Absorb ... For the rest it works great! because victor sant is amazing here is an update changes equip_materia(actor, equip, slot, materia) actor = actor id equip = equip slot id (0 = weapon, 1 = shield, 2 = helm, 3 = armor, 4 = accessory) slot = materia slot materia = materia id remove_materia(materia) materia = materia id Also i fixed the issues with elemental, added effect and absorb materias. I tried the script, but still do not work! The "defense elemental and status" do not work and the "status attack" caused error on line 998! Edited October 21, 2012 by Lionheart Share this post Link to post Share on other sites
Tammsyn 8 Posted October 21, 2012 yh already reported that crash ideally need a list of the materia that just dont work and a list of the ones that partially work and the situations so can be reported and tested Share this post Link to post Share on other sites
Lionheart 2 Posted October 21, 2012 The only ones that do not work are just these 4! The Elemental, Added Effect, HP Absorb and MP Absorb... Do you think you can repair? Share this post Link to post Share on other sites
Tammsyn 8 Posted October 21, 2012 you sure about mp and hp absorb? they seam to work for me just doesnt state that youve regained mp or hp? i cant because i am no scripter but will ask Share this post Link to post Share on other sites
Tammsyn 8 Posted October 21, 2012 what does added effect suppose to do (thought added elemental damage to weapons or elemental defence to armour but it dsnt appear to do any Share this post Link to post Share on other sites
RuinLight 2 Posted October 22, 2012 Uh, sorry to bother kind sir. This is a nice script. I like it. But my concern is with the sparam parameters. For example with 'FDR plus', it increases the floor damage given. But see, why would anyone use a materia like that. That causes more harm and no positive side. I was hoping to find a FDR down. Instead of Plus. Things that are negative should not be increasing. So hopefully you figure that out, or someone else would. Thanks. Share this post Link to post Share on other sites
Tammsyn 8 Posted October 22, 2012 which materia causes fdr increase? Share this post Link to post Share on other sites
RuinLight 2 Posted October 23, 2012 which materia causes fdr increase? Oh, no. It's Just an example. It's just I wanted to make materia that would reduce such negative effects instead of increasing them. FDR is Floor Damage. MCR (i think) is MP cost Rate. When I make those said materia, it would increase the effect rather than decrease. Those are just examples of what seems to be bugging me. Share this post Link to post Share on other sites
wifflefish 0 Posted October 23, 2012 (edited) which materia causes fdr increase? Oh, no. It's Just an example. It's just I wanted to make materia that would reduce such negative effects instead of increasing them. FDR is Floor Damage. MCR (i think) is MP cost Rate. When I make those said materia, it would increase the effect rather than decrease. Those are just examples of what seems to be bugging me. I got around it by altering the script a decent amount. There are a few steps I used: 1. On line 911, change " result + materia_sparam_plus(param_id) " to " result + materia_sparam_plus(param_id) + materia_sparam_minus(param_id)" 2. Change " def materia_sparam_plus(param_id) result = 0 all_materias.compact.each do |materia| result += (materia.level * 10) if materia_sparam_value(materia, param_id) end result end " to " def materia_sparam_plus(param_id) result = 0 all_materias.compact.each do |materia| result += (materia.level * 10) if materia_sparam_plus_value(materia, param_id) end result end ". Notice the _plus after sparam. 3. Copy " def materia_sparam_plus(param_id) result = 0 all_materias.compact.each do |materia| result += (materia.level * 10) if materia_sparam_plus_value(materia, param_id) end result end " on lines 1091 to 1097, paste a copy directly below, and change it to " def materia_sparam_minus(param_id) result = 0 all_materias.compact.each do |materia| result -= (materia.level * 10) if materia_sparam_minus_value(materia, param_id) end result end ". Notice the sign after the second "result" is changed, and _plus after sparam is now _minus . 3. Change line 1113 from " def materia_sparam_value(materia, param_id) " to " def materia_sparam_plus_value(materia, param_id) ". 4. Copy this whole array and paste another directly below it. Change the name of this array to " def materia_sparam_minus_value(materia, param_id) ". 5. In the first array delete all the entries that you do not want to have a positive value for. Eg If you don't want FDR to increase through materia then you can delete the "FDR Plus" line. 6. In the second array ("minus_value") delete any entries you don't want to decrease through materia, and change the text in quotation marks for the rest from "XYZ Plus" to "XYZ Minus". Make sure the last entry in each array doesn't have | | at the end of it. This should allow you to have materia that increase and decrease the sparam values. This could be applied to the other parameters too if so desired. Edited to make it work Edited October 23, 2012 by wifflefish Share this post Link to post Share on other sites
RuinLight 2 Posted October 24, 2012 which materia causes fdr increase? Oh, no. It's Just an example. It's just I wanted to make materia that would reduce such negative effects instead of increasing them. FDR is Floor Damage. MCR (i think) is MP cost Rate. When I make those said materia, it would increase the effect rather than decrease. Those are just examples of what seems to be bugging me. I got around it by altering the script a decent amount. There are a few steps I used: 1. On line 911, change " result + materia_sparam_plus(param_id) " to " result + materia_sparam_plus(param_id) + materia_sparam_minus(param_id)" 2. Change " def materia_sparam_plus(param_id) result = 0 all_materias.compact.each do |materia| result += (materia.level * 10) if materia_sparam_value(materia, param_id) end result end " to " def materia_sparam_plus(param_id) result = 0 all_materias.compact.each do |materia| result += (materia.level * 10) if materia_sparam_plus_value(materia, param_id) end result end ". Notice the _plus after sparam. 3. Copy " def materia_sparam_plus(param_id) result = 0 all_materias.compact.each do |materia| result += (materia.level * 10) if materia_sparam_plus_value(materia, param_id) end result end " on lines 1091 to 1097, paste a copy directly below, and change it to " def materia_sparam_minus(param_id) result = 0 all_materias.compact.each do |materia| result -= (materia.level * 10) if materia_sparam_minus_value(materia, param_id) end result end ". Notice the sign after the second "result" is changed, and _plus after sparam is now _minus . 3. Change line 1113 from " def materia_sparam_value(materia, param_id) " to " def materia_sparam_plus_value(materia, param_id) ". 4. Copy this whole array and paste another directly below it. Change the name of this array to " def materia_sparam_minus_value(materia, param_id) ". 5. In the first array delete all the entries that you do not want to have a positive value for. Eg If you don't want FDR to increase through materia then you can delete the "FDR Plus" line. 6. In the second array ("minus_value") delete any entries you don't want to decrease through materia, and change the text in quotation marks for the rest from "XYZ Plus" to "XYZ Minus". Make sure the last entry in each array doesn't have | | at the end of it. This should allow you to have materia that increase and decrease the sparam values. This could be applied to the other parameters too if so desired. Edited to make it work It worked, thank you sir. Share this post Link to post Share on other sites
wifflefish 0 Posted October 24, 2012 No problem RuinLight! Tammsyn, I don't think the added effect support materia works, I've not seen any of the included status effects on the paired materia being added to attacks. Share this post Link to post Share on other sites
RuinLight 2 Posted October 24, 2012 No problem RuinLight! Tammsyn, I don't think the added effect support materia works, I've not seen any of the included status effects on the paired materia being added to attacks. Oh, that's fine. Theirs equipment scripts that let you have added effects, so I dont think that'll be trouble at all. Thanks again, Grand High Wizard. Share this post Link to post Share on other sites